Home | History | Annotate | Download | only in Symbol
      1 //===-- Variable.h ----------------------------------------------*- C++ -*-===//
      2 //
      3 //                     The LLVM Compiler Infrastructure
      4 //
      5 // This file is distributed under the University of Illinois Open Source
      6 // License. See LICENSE.TXT for details.
      7 //
      8 //===----------------------------------------------------------------------===//
      9 
     10 #ifndef liblldb_Variable_h_
     11 #define liblldb_Variable_h_
     12 
     13 #include <vector>
     14 
     15 #include "lldb/lldb-private.h"
     16 #include "lldb/lldb-enumerations.h"
     17 #include "lldb/Core/Mangled.h"
     18 #include "lldb/Core/UserID.h"
     19 #include "lldb/Expression/DWARFExpression.h"
     20 #include "lldb/Symbol/Declaration.h"
     21 
     22 namespace lldb_private {
     23 
     24 class Variable : public UserID
     25 {
     26 public:
     27     //------------------------------------------------------------------
     28     // Constructors and Destructors
     29     //------------------------------------------------------------------
     30     Variable (lldb::user_id_t uid,
     31               const char *name,
     32               const char *mangled,   // The mangled variable name for variables in namespaces
     33               const lldb::SymbolFileTypeSP &symfile_type_sp,
     34               lldb::ValueType scope,
     35               SymbolContextScope *owner_scope,
     36               Declaration* decl,
     37               const DWARFExpression& location,
     38               bool external,
     39               bool artificial);
     40 
     41     virtual
     42     ~Variable();
     43 
     44     void
     45     Dump(Stream *s, bool show_context) const;
     46 
     47     bool
     48     DumpDeclaration (Stream *s,
     49                      bool show_fullpaths,
     50                      bool show_module);
     51 
     52     const Declaration&
     53     GetDeclaration() const
     54     {
     55         return m_declaration;
     56     }
     57 
     58     const ConstString&
     59     GetName() const;
     60 
     61     SymbolContextScope *
     62     GetSymbolContextScope() const
     63     {
     64         return m_owner_scope;
     65     }
     66 
     67     // Since a variable can have a basename "i" and also a mangled
     68     // named "_ZN12_GLOBAL__N_11iE" and a demangled mangled name
     69     // "(anonymous namespace)::i", this function will allow a generic match
     70     // function that can be called by commands and expression parsers to make
     71     // sure we match anything we come across.
     72     bool
     73     NameMatches (const ConstString &name) const
     74     {
     75         if (m_name == name)
     76             return true;
     77         return m_mangled.NameMatches (name);
     78     }
     79 
     80     bool
     81     NameMatches (const RegularExpression& regex) const;
     82 
     83     Type *
     84     GetType();
     85 
     86     lldb::ValueType
     87     GetScope() const
     88     {
     89         return m_scope;
     90     }
     91 
     92     bool
     93     IsExternal() const
     94     {
     95         return m_external;
     96     }
     97 
     98     bool
     99     IsArtificial() const
    100     {
    101         return m_artificial;
    102     }
    103 
    104     DWARFExpression &
    105     LocationExpression()
    106     {
    107         return m_location;
    108     }
    109 
    110     const DWARFExpression &
    111     LocationExpression() const
    112     {
    113         return m_location;
    114     }
    115 
    116     bool
    117     DumpLocationForAddress (Stream *s,
    118                             const Address &address);
    119 
    120     size_t
    121     MemorySize() const;
    122 
    123     void
    124     CalculateSymbolContext (SymbolContext *sc);
    125 
    126     bool
    127     IsInScope (StackFrame *frame);
    128 
    129     bool
    130     LocationIsValidForFrame (StackFrame *frame);
    131 
    132     bool
    133     LocationIsValidForAddress (const Address &address);
    134 
    135     bool
    136     GetLocationIsConstantValueData () const
    137     {
    138         return m_loc_is_const_data;
    139     }
    140 
    141     void
    142     SetLocationIsConstantValueData (bool b)
    143     {
    144         m_loc_is_const_data = b;
    145     }
    146 
    147     typedef size_t (*GetVariableCallback) (void *baton,
    148                                            const char *name,
    149                                            VariableList &var_list);
    150 
    151 
    152     static Error
    153     GetValuesForVariableExpressionPath (const char *variable_expr_path,
    154                                         ExecutionContextScope *scope,
    155                                         GetVariableCallback callback,
    156                                         void *baton,
    157                                         VariableList &variable_list,
    158                                         ValueObjectList &valobj_list);
    159 
    160     static size_t
    161     AutoComplete (const ExecutionContext &exe_ctx,
    162                   const char *name,
    163                   StringList &matches,
    164                   bool &word_complete);
    165 
    166 protected:
    167     ConstString m_name;                 // The basename of the variable (no namespaces)
    168     Mangled m_mangled;                  // The mangled name of the variable
    169     lldb::SymbolFileTypeSP m_symfile_type_sp;   // The type pointer of the variable (int, struct, class, etc)
    170     lldb::ValueType m_scope;            // global, parameter, local
    171     SymbolContextScope *m_owner_scope;  // The symbol file scope that this variable was defined in
    172     Declaration m_declaration;          // Declaration location for this item.
    173     DWARFExpression m_location;         // The location of this variable that can be fed to DWARFExpression::Evaluate()
    174     uint8_t m_external:1,               // Visible outside the containing compile unit?
    175             m_artificial:1,             // Non-zero if the variable is not explicitly declared in source
    176             m_loc_is_const_data:1;      // The m_location expression contains the constant variable value data, not a DWARF location
    177 private:
    178     Variable(const Variable& rhs);
    179     Variable& operator=(const Variable& rhs);
    180 };
    181 
    182 } // namespace lldb_private
    183 
    184 #endif  // liblldb_Variable_h_
    185