Home | History | Annotate | Download | only in API
      1 //===-- SBValue.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 LLDB_SBValue_h_
     11 #define LLDB_SBValue_h_
     12 
     13 #include "lldb/API/SBData.h"
     14 #include "lldb/API/SBDefines.h"
     15 #include "lldb/API/SBType.h"
     16 
     17 class ValueImpl;
     18 class ValueLocker;
     19 
     20 namespace lldb {
     21 
     22 class SBValue
     23 {
     24 friend class ValueLocker;
     25 
     26 public:
     27     SBValue ();
     28 
     29     SBValue (const lldb::SBValue &rhs);
     30 
     31     lldb::SBValue &
     32     operator =(const lldb::SBValue &rhs);
     33 
     34     ~SBValue ();
     35 
     36     bool
     37     IsValid();
     38 
     39     void
     40     Clear();
     41 
     42     SBError
     43     GetError();
     44 
     45     lldb::user_id_t
     46     GetID ();
     47 
     48     const char *
     49     GetName();
     50 
     51     const char *
     52     GetTypeName ();
     53 
     54     size_t
     55     GetByteSize ();
     56 
     57     bool
     58     IsInScope ();
     59 
     60     lldb::Format
     61     GetFormat ();
     62 
     63     void
     64     SetFormat (lldb::Format format);
     65 
     66     const char *
     67     GetValue ();
     68 
     69     int64_t
     70     GetValueAsSigned (lldb::SBError& error, int64_t fail_value=0);
     71 
     72     uint64_t
     73     GetValueAsUnsigned (lldb::SBError& error, uint64_t fail_value=0);
     74 
     75     int64_t
     76     GetValueAsSigned(int64_t fail_value=0);
     77 
     78     uint64_t
     79     GetValueAsUnsigned(uint64_t fail_value=0);
     80 
     81     ValueType
     82     GetValueType ();
     83 
     84     bool
     85     GetValueDidChange ();
     86 
     87     const char *
     88     GetSummary ();
     89 
     90     const char *
     91     GetObjectDescription ();
     92 
     93     lldb::SBValue
     94     GetDynamicValue (lldb::DynamicValueType use_dynamic);
     95 
     96     lldb::SBValue
     97     GetStaticValue ();
     98 
     99     lldb::SBValue
    100     GetNonSyntheticValue ();
    101 
    102     lldb::DynamicValueType
    103     GetPreferDynamicValue ();
    104 
    105     void
    106     SetPreferDynamicValue (lldb::DynamicValueType use_dynamic);
    107 
    108     bool
    109     GetPreferSyntheticValue ();
    110 
    111     void
    112     SetPreferSyntheticValue (bool use_synthetic);
    113 
    114     bool
    115     IsDynamic ();
    116 
    117     bool
    118     IsSynthetic ();
    119 
    120     const char *
    121     GetLocation ();
    122 
    123     // Deprecated - use the one that takes SBError&
    124     bool
    125     SetValueFromCString (const char *value_str);
    126 
    127     bool
    128     SetValueFromCString (const char *value_str, lldb::SBError& error);
    129 
    130     lldb::SBTypeFormat
    131     GetTypeFormat ();
    132 
    133 #ifndef LLDB_DISABLE_PYTHON
    134     lldb::SBTypeSummary
    135     GetTypeSummary ();
    136 #endif
    137 
    138     lldb::SBTypeFilter
    139     GetTypeFilter ();
    140 
    141 #ifndef LLDB_DISABLE_PYTHON
    142     lldb::SBTypeSynthetic
    143     GetTypeSynthetic ();
    144 #endif
    145 
    146     lldb::SBValue
    147     GetChildAtIndex (uint32_t idx);
    148 
    149     lldb::SBValue
    150     CreateChildAtOffset (const char *name, uint32_t offset, lldb::SBType type);
    151 
    152     lldb::SBValue
    153     Cast (lldb::SBType type);
    154 
    155     lldb::SBValue
    156     CreateValueFromExpression (const char *name, const char* expression);
    157 
    158     lldb::SBValue
    159     CreateValueFromExpression (const char *name, const char* expression, SBExpressionOptions &options);
    160 
    161     lldb::SBValue
    162     CreateValueFromAddress (const char* name,
    163                             lldb::addr_t address,
    164                             lldb::SBType type);
    165 
    166     // this has no address! GetAddress() and GetLoadAddress() as well as AddressOf()
    167     // on the return of this call all return invalid
    168     lldb::SBValue
    169     CreateValueFromData (const char* name,
    170                          lldb::SBData data,
    171                          lldb::SBType type);
    172 
    173     //------------------------------------------------------------------
    174     /// Get a child value by index from a value.
    175     ///
    176     /// Structs, unions, classes, arrays and and pointers have child
    177     /// values that can be access by index.
    178     ///
    179     /// Structs and unions access child members using a zero based index
    180     /// for each child member. For
    181     ///
    182     /// Classes reserve the first indexes for base classes that have
    183     /// members (empty base classes are omitted), and all members of the
    184     /// current class will then follow the base classes.
    185     ///
    186     /// Pointers differ depending on what they point to. If the pointer
    187     /// points to a simple type, the child at index zero
    188     /// is the only child value available, unless \a synthetic_allowed
    189     /// is \b true, in which case the pointer will be used as an array
    190     /// and can create 'synthetic' child values using positive or
    191     /// negative indexes. If the pointer points to an aggregate type
    192     /// (an array, class, union, struct), then the pointee is
    193     /// transparently skipped and any children are going to be the indexes
    194     /// of the child values within the aggregate type. For example if
    195     /// we have a 'Point' type and we have a SBValue that contains a
    196     /// pointer to a 'Point' type, then the child at index zero will be
    197     /// the 'x' member, and the child at index 1 will be the 'y' member
    198     /// (the child at index zero won't be a 'Point' instance).
    199     ///
    200     /// Arrays have a preset number of children that can be accessed by
    201     /// index and will returns invalid child values for indexes that are
    202     /// out of bounds unless the \a synthetic_allowed is \b true. In this
    203     /// case the array can create 'synthetic' child values for indexes
    204     /// that aren't in the array bounds using positive or negative
    205     /// indexes.
    206     ///
    207     /// @param[in] idx
    208     ///     The index of the child value to get
    209     ///
    210     /// @param[in] use_dynamic
    211     ///     An enumeration that specifies wether to get dynamic values,
    212     ///     and also if the target can be run to figure out the dynamic
    213     ///     type of the child value.
    214     ///
    215     /// @param[in] synthetic_allowed
    216     ///     If \b true, then allow child values to be created by index
    217     ///     for pointers and arrays for indexes that normally wouldn't
    218     ///     be allowed.
    219     ///
    220     /// @return
    221     ///     A new SBValue object that represents the child member value.
    222     //------------------------------------------------------------------
    223     lldb::SBValue
    224     GetChildAtIndex (uint32_t idx,
    225                      lldb::DynamicValueType use_dynamic,
    226                      bool can_create_synthetic);
    227 
    228     // Matches children of this object only and will match base classes and
    229     // member names if this is a clang typed object.
    230     uint32_t
    231     GetIndexOfChildWithName (const char *name);
    232 
    233     // Matches child members of this object and child members of any base
    234     // classes.
    235     lldb::SBValue
    236     GetChildMemberWithName (const char *name);
    237 
    238     // Matches child members of this object and child members of any base
    239     // classes.
    240     lldb::SBValue
    241     GetChildMemberWithName (const char *name, lldb::DynamicValueType use_dynamic);
    242 
    243     // Expands nested expressions like .a->b[0].c[1]->d
    244     lldb::SBValue
    245     GetValueForExpressionPath(const char* expr_path);
    246 
    247     lldb::SBValue
    248     AddressOf();
    249 
    250     lldb::addr_t
    251     GetLoadAddress();
    252 
    253     lldb::SBAddress
    254     GetAddress();
    255 
    256     //------------------------------------------------------------------
    257     /// Get an SBData wrapping what this SBValue points to.
    258     ///
    259     /// This method will dereference the current SBValue, if its
    260     /// data type is a T* or T[], and extract item_count elements
    261     /// of type T from it, copying their contents in an SBData.
    262     ///
    263     /// @param[in] item_idx
    264     ///     The index of the first item to retrieve. For an array
    265     ///     this is equivalent to array[item_idx], for a pointer
    266     ///     to *(pointer + item_idx). In either case, the measurement
    267     ///     unit for item_idx is the sizeof(T) rather than the byte
    268     ///
    269     /// @param[in] item_count
    270     ///     How many items should be copied into the output. By default
    271     ///     only one item is copied, but more can be asked for.
    272     ///
    273     /// @return
    274     ///     An SBData with the contents of the copied items, on success.
    275     ///     An empty SBData otherwise.
    276     //------------------------------------------------------------------
    277     lldb::SBData
    278     GetPointeeData (uint32_t item_idx = 0,
    279                     uint32_t item_count = 1);
    280 
    281     //------------------------------------------------------------------
    282     /// Get an SBData wrapping the contents of this SBValue.
    283     ///
    284     /// This method will read the contents of this object in memory
    285     /// and copy them into an SBData for future use.
    286     ///
    287     /// @return
    288     ///     An SBData with the contents of this SBValue, on success.
    289     ///     An empty SBData otherwise.
    290     //------------------------------------------------------------------
    291     lldb::SBData
    292     GetData ();
    293 
    294     bool
    295     SetData (lldb::SBData &data, lldb::SBError& error);
    296 
    297     lldb::SBDeclaration
    298     GetDeclaration ();
    299 
    300     //------------------------------------------------------------------
    301     /// Find out if a SBValue might have children.
    302     ///
    303     /// This call is much more efficient than GetNumChildren() as it
    304     /// doesn't need to complete the underlying type. This is designed
    305     /// to be used in a UI environment in order to detect if the
    306     /// disclosure triangle should be displayed or not.
    307     ///
    308     /// This function returns true for class, union, structure,
    309     /// pointers, references, arrays and more. Again, it does so without
    310     /// doing any expensive type completion.
    311     ///
    312     /// @return
    313     ///     Returns \b true if the SBValue might have children, or \b
    314     ///     false otherwise.
    315     //------------------------------------------------------------------
    316     bool
    317     MightHaveChildren ();
    318 
    319     uint32_t
    320     GetNumChildren ();
    321 
    322     void *
    323     GetOpaqueType();
    324 
    325     lldb::SBTarget
    326     GetTarget();
    327 
    328     lldb::SBProcess
    329     GetProcess();
    330 
    331     lldb::SBThread
    332     GetThread();
    333 
    334     lldb::SBFrame
    335     GetFrame();
    336 
    337     lldb::SBValue
    338     Dereference ();
    339 
    340     bool
    341     TypeIsPointerType ();
    342 
    343     lldb::SBType
    344     GetType();
    345 
    346     bool
    347     GetDescription (lldb::SBStream &description);
    348 
    349     bool
    350     GetExpressionPath (lldb::SBStream &description);
    351 
    352     bool
    353     GetExpressionPath (lldb::SBStream &description,
    354                        bool qualify_cxx_base_classes);
    355 
    356     SBValue (const lldb::ValueObjectSP &value_sp);
    357 
    358     //------------------------------------------------------------------
    359     /// Watch this value if it resides in memory.
    360     ///
    361     /// Sets a watchpoint on the value.
    362     ///
    363     /// @param[in] resolve_location
    364     ///     Resolve the location of this value once and watch its address.
    365     ///     This value must currently be set to \b true as watching all
    366     ///     locations of a variable or a variable path is not yet supported,
    367     ///     though we plan to support it in the future.
    368     ///
    369     /// @param[in] read
    370     ///     Stop when this value is accessed.
    371     ///
    372     /// @param[in] write
    373     ///     Stop when this value is modified
    374     ///
    375     /// @param[out]
    376     ///     An error object. Contains the reason if there is some failure.
    377     ///
    378     /// @return
    379     ///     An SBWatchpoint object. This object might not be valid upon
    380     ///     return due to a value not being contained in memory, too
    381     ///     large, or watchpoint resources are not available or all in
    382     ///     use.
    383     //------------------------------------------------------------------
    384     lldb::SBWatchpoint
    385     Watch (bool resolve_location, bool read, bool write, SBError &error);
    386 
    387     // Backward compatibility fix in the interim.
    388     lldb::SBWatchpoint
    389     Watch (bool resolve_location, bool read, bool write);
    390 
    391     //------------------------------------------------------------------
    392     /// Watch this value that this value points to in memory
    393     ///
    394     /// Sets a watchpoint on the value.
    395     ///
    396     /// @param[in] resolve_location
    397     ///     Resolve the location of this value once and watch its address.
    398     ///     This value must currently be set to \b true as watching all
    399     ///     locations of a variable or a variable path is not yet supported,
    400     ///     though we plan to support it in the future.
    401     ///
    402     /// @param[in] read
    403     ///     Stop when this value is accessed.
    404     ///
    405     /// @param[in] write
    406     ///     Stop when this value is modified
    407     ///
    408     /// @param[out]
    409     ///     An error object. Contains the reason if there is some failure.
    410     ///
    411     /// @return
    412     ///     An SBWatchpoint object. This object might not be valid upon
    413     ///     return due to a value not being contained in memory, too
    414     ///     large, or watchpoint resources are not available or all in
    415     ///     use.
    416     //------------------------------------------------------------------
    417     lldb::SBWatchpoint
    418     WatchPointee (bool resolve_location, bool read, bool write, SBError &error);
    419 
    420     //------------------------------------------------------------------
    421     /// Same as the protected version of GetSP that takes a locker, except that we make the
    422     /// locker locally in the function.  Since the Target API mutex is recursive, and the
    423     /// StopLocker is a read lock, you can call this function even if you are already
    424     /// holding the two above-mentioned locks.
    425     ///
    426     /// @return
    427     ///     A ValueObjectSP of the best kind (static, dynamic or synthetic) we
    428     ///     can cons up, in accordance with the SBValue's settings.
    429     //------------------------------------------------------------------
    430     lldb::ValueObjectSP
    431     GetSP () const;
    432 
    433 protected:
    434     friend class SBBlock;
    435     friend class SBFrame;
    436     friend class SBTarget;
    437     friend class SBThread;
    438     friend class SBValueList;
    439 
    440     //------------------------------------------------------------------
    441     /// Get the appropriate ValueObjectSP from this SBValue, consulting the
    442     /// use_dynamic and use_synthetic options passed in to SetSP when the
    443     /// SBValue's contents were set.  Since this often requires examining memory,
    444     /// and maybe even running code, it needs to acquire the Target API and Process StopLock.
    445     /// Those are held in an opaque class ValueLocker which is currently local to SBValue.cpp.
    446     /// So you don't have to get these yourself just default construct a ValueLocker, and pass it into this.
    447     /// If we need to make a ValueLocker and use it in some other .cpp file, we'll have to move it to
    448     /// ValueObject.h/cpp or somewhere else convenient.  We haven't needed to so far.
    449     ///
    450     /// @param[in] value_locker
    451     ///     An object that will hold the Target API, and Process RunLocks, and
    452     ///     auto-destroy them when it goes out of scope.  Currently this is only useful in
    453     ///     SBValue.cpp.
    454     ///
    455     /// @return
    456     ///     A ValueObjectSP of the best kind (static, dynamic or synthetic) we
    457     ///     can cons up, in accordance with the SBValue's settings.
    458     //------------------------------------------------------------------
    459     lldb::ValueObjectSP
    460     GetSP (ValueLocker &value_locker) const;
    461 
    462     // these calls do the right thing WRT adjusting their settings according to the target's preferences
    463     void
    464     SetSP (const lldb::ValueObjectSP &sp);
    465 
    466     void
    467     SetSP (const lldb::ValueObjectSP &sp, bool use_synthetic);
    468 
    469     void
    470     SetSP (const lldb::ValueObjectSP &sp, lldb::DynamicValueType use_dynamic);
    471 
    472     void
    473     SetSP (const lldb::ValueObjectSP &sp, lldb::DynamicValueType use_dynamic, bool use_synthetic);
    474 
    475     void
    476     SetSP (const lldb::ValueObjectSP &sp, lldb::DynamicValueType use_dynamic, bool use_synthetic, const char *name);
    477 
    478 private:
    479     typedef std::shared_ptr<ValueImpl> ValueImplSP;
    480     ValueImplSP m_opaque_sp;
    481 
    482     void
    483     SetSP (ValueImplSP impl_sp);
    484 };
    485 
    486 } // namespace lldb
    487 
    488 #endif  // LLDB_SBValue_h_
    489