Home | History | Annotate | Download | only in DataFormatters
      1 //===-- CXXFormatterFunctions.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_CXXFormatterFunctions_h_
     11 #define liblldb_CXXFormatterFunctions_h_
     12 
     13 #include <stdint.h>
     14 #include <time.h>
     15 
     16 #include "lldb/lldb-forward.h"
     17 
     18 #include "lldb/Core/ConstString.h"
     19 #include "lldb/DataFormatters/FormatClasses.h"
     20 #include "lldb/Target/Target.h"
     21 
     22 #include "clang/AST/ASTContext.h"
     23 
     24 namespace lldb_private {
     25     namespace formatters
     26     {
     27         bool
     28         ExtractValueFromObjCExpression (ValueObject &valobj,
     29                                         const char* target_type,
     30                                         const char* selector,
     31                                         uint64_t &value);
     32 
     33         bool
     34         ExtractSummaryFromObjCExpression (ValueObject &valobj,
     35                                           const char* target_type,
     36                                           const char* selector,
     37                                           Stream &stream);
     38 
     39         lldb::ValueObjectSP
     40         CallSelectorOnObject (ValueObject &valobj,
     41                               const char* return_type,
     42                               const char* selector,
     43                               uint64_t index);
     44 
     45         lldb::ValueObjectSP
     46         CallSelectorOnObject (ValueObject &valobj,
     47                               const char* return_type,
     48                               const char* selector,
     49                               const char* key);
     50 
     51         size_t
     52         ExtractIndexFromString (const char* item_name);
     53 
     54         time_t
     55         GetOSXEpoch ();
     56 
     57         bool
     58         Char16StringSummaryProvider (ValueObject& valobj, Stream& stream); // char16_t* and unichar*
     59 
     60         bool
     61         Char32StringSummaryProvider (ValueObject& valobj, Stream& stream); // char32_t*
     62 
     63         bool
     64         WCharStringSummaryProvider (ValueObject& valobj, Stream& stream); // wchar_t*
     65 
     66         bool
     67         Char16SummaryProvider (ValueObject& valobj, Stream& stream); // char16_t and unichar
     68 
     69         bool
     70         Char32SummaryProvider (ValueObject& valobj, Stream& stream); // char32_t
     71 
     72         bool
     73         WCharSummaryProvider (ValueObject& valobj, Stream& stream); // wchar_t
     74 
     75         bool
     76         LibcxxStringSummaryProvider (ValueObject& valobj, Stream& stream); // libc++ std::string
     77 
     78         bool
     79         LibcxxWStringSummaryProvider (ValueObject& valobj, Stream& stream); // libc++ std::wstring
     80 
     81         bool
     82         ObjCClassSummaryProvider (ValueObject& valobj, Stream& stream);
     83 
     84         SyntheticChildrenFrontEnd* ObjCClassSyntheticFrontEndCreator (CXXSyntheticChildren*, lldb::ValueObjectSP);
     85 
     86         template<bool name_entries>
     87         bool
     88         NSDictionarySummaryProvider (ValueObject& valobj, Stream& stream);
     89 
     90         bool
     91         NSIndexSetSummaryProvider (ValueObject& valobj, Stream& stream);
     92 
     93         bool
     94         NSArraySummaryProvider (ValueObject& valobj, Stream& stream);
     95 
     96         template<bool cf_style>
     97         bool
     98         NSSetSummaryProvider (ValueObject& valobj, Stream& stream);
     99 
    100         template<bool needs_at>
    101         bool
    102         NSDataSummaryProvider (ValueObject& valobj, Stream& stream);
    103 
    104         bool
    105         NSNumberSummaryProvider (ValueObject& valobj, Stream& stream);
    106 
    107         bool
    108         NSNotificationSummaryProvider (ValueObject& valobj, Stream& stream);
    109 
    110         bool
    111         NSTimeZoneSummaryProvider (ValueObject& valobj, Stream& stream);
    112 
    113         bool
    114         NSMachPortSummaryProvider (ValueObject& valobj, Stream& stream);
    115 
    116         bool
    117         CFBagSummaryProvider (ValueObject& valobj, Stream& stream);
    118 
    119         bool
    120         CFBinaryHeapSummaryProvider (ValueObject& valobj, Stream& stream);
    121 
    122         bool
    123         CFBitVectorSummaryProvider (ValueObject& valobj, Stream& stream);
    124 
    125         bool
    126         NSDateSummaryProvider (ValueObject& valobj, Stream& stream);
    127 
    128         bool
    129         CFAbsoluteTimeSummaryProvider (ValueObject& valobj, Stream& stream);
    130 
    131         bool
    132         NSBundleSummaryProvider (ValueObject& valobj, Stream& stream);
    133 
    134         bool
    135         NSStringSummaryProvider (ValueObject& valobj, Stream& stream);
    136 
    137         bool
    138         NSAttributedStringSummaryProvider (ValueObject& valobj, Stream& stream);
    139 
    140         bool
    141         NSMutableAttributedStringSummaryProvider (ValueObject& valobj, Stream& stream);
    142 
    143         bool
    144         NSURLSummaryProvider (ValueObject& valobj, Stream& stream);
    145 
    146         bool
    147         ObjCBOOLSummaryProvider (ValueObject& valobj, Stream& stream);
    148 
    149         template <bool is_sel_ptr>
    150         bool
    151         ObjCSELSummaryProvider (ValueObject& valobj, Stream& stream);
    152 
    153         bool
    154         RuntimeSpecificDescriptionSummaryProvider (ValueObject& valobj, Stream& stream);
    155 
    156         extern template bool
    157         NSDictionarySummaryProvider<true> (ValueObject&, Stream&) ;
    158 
    159         extern template bool
    160         NSDictionarySummaryProvider<false> (ValueObject&, Stream&) ;
    161 
    162         extern template bool
    163         NSDataSummaryProvider<true> (ValueObject&, Stream&) ;
    164 
    165         extern template bool
    166         NSDataSummaryProvider<false> (ValueObject&, Stream&) ;
    167 
    168         extern template bool
    169         ObjCSELSummaryProvider<true> (ValueObject&, Stream&);
    170 
    171         extern template bool
    172         ObjCSELSummaryProvider<false> (ValueObject&, Stream&);
    173 
    174         class NSArrayMSyntheticFrontEnd : public SyntheticChildrenFrontEnd
    175         {
    176         private:
    177             struct DataDescriptor_32
    178             {
    179                 uint32_t _used;
    180                 uint32_t _priv1 : 2 ;
    181                 uint32_t _size : 30;
    182                 uint32_t _priv2 : 2;
    183                 uint32_t offset : 30;
    184                 uint32_t _priv3;
    185                 uint32_t _data;
    186             };
    187             struct DataDescriptor_64
    188             {
    189                 uint64_t _used;
    190                 uint64_t _priv1 : 2 ;
    191                 uint64_t _size : 62;
    192                 uint64_t _priv2 : 2;
    193                 uint64_t offset : 62;
    194                 uint32_t _priv3;
    195                 uint64_t _data;
    196             };
    197         public:
    198             NSArrayMSyntheticFrontEnd (lldb::ValueObjectSP valobj_sp);
    199 
    200             virtual size_t
    201             CalculateNumChildren ();
    202 
    203             virtual lldb::ValueObjectSP
    204             GetChildAtIndex (size_t idx);
    205 
    206             virtual bool
    207             Update();
    208 
    209             virtual bool
    210             MightHaveChildren ();
    211 
    212             virtual size_t
    213             GetIndexOfChildWithName (const ConstString &name);
    214 
    215             virtual
    216             ~NSArrayMSyntheticFrontEnd ();
    217         private:
    218             ExecutionContextRef m_exe_ctx_ref;
    219             uint8_t m_ptr_size;
    220             DataDescriptor_32 *m_data_32;
    221             DataDescriptor_64 *m_data_64;
    222             ClangASTType m_id_type;
    223             std::vector<lldb::ValueObjectSP> m_children;
    224         };
    225 
    226         class NSArrayISyntheticFrontEnd : public SyntheticChildrenFrontEnd
    227         {
    228         public:
    229             NSArrayISyntheticFrontEnd (lldb::ValueObjectSP valobj_sp);
    230 
    231             virtual size_t
    232             CalculateNumChildren ();
    233 
    234             virtual lldb::ValueObjectSP
    235             GetChildAtIndex (size_t idx);
    236 
    237             virtual bool
    238             Update();
    239 
    240             virtual bool
    241             MightHaveChildren ();
    242 
    243             virtual size_t
    244             GetIndexOfChildWithName (const ConstString &name);
    245 
    246             virtual
    247             ~NSArrayISyntheticFrontEnd ();
    248         private:
    249             ExecutionContextRef m_exe_ctx_ref;
    250             uint8_t m_ptr_size;
    251             uint64_t m_items;
    252             lldb::addr_t m_data_ptr;
    253             ClangASTType m_id_type;
    254             std::vector<lldb::ValueObjectSP> m_children;
    255         };
    256 
    257         class NSArrayCodeRunningSyntheticFrontEnd : public SyntheticChildrenFrontEnd
    258         {
    259         public:
    260             NSArrayCodeRunningSyntheticFrontEnd (lldb::ValueObjectSP valobj_sp);
    261 
    262             virtual size_t
    263             CalculateNumChildren ();
    264 
    265             virtual lldb::ValueObjectSP
    266             GetChildAtIndex (size_t idx);
    267 
    268             virtual bool
    269             Update();
    270 
    271             virtual bool
    272             MightHaveChildren ();
    273 
    274             virtual size_t
    275             GetIndexOfChildWithName (const ConstString &name);
    276 
    277             virtual
    278             ~NSArrayCodeRunningSyntheticFrontEnd ();
    279         };
    280 
    281         SyntheticChildrenFrontEnd* NSArraySyntheticFrontEndCreator (CXXSyntheticChildren*, lldb::ValueObjectSP);
    282 
    283         class NSDictionaryISyntheticFrontEnd : public SyntheticChildrenFrontEnd
    284         {
    285         private:
    286             struct DataDescriptor_32
    287             {
    288                 uint32_t _used : 26;
    289                 uint32_t _szidx : 6;
    290             };
    291             struct DataDescriptor_64
    292             {
    293                 uint64_t _used : 58;
    294                 uint32_t _szidx : 6;
    295             };
    296 
    297             struct DictionaryItemDescriptor
    298             {
    299                 lldb::addr_t key_ptr;
    300                 lldb::addr_t val_ptr;
    301                 lldb::ValueObjectSP valobj_sp;
    302             };
    303 
    304         public:
    305             NSDictionaryISyntheticFrontEnd (lldb::ValueObjectSP valobj_sp);
    306 
    307             virtual size_t
    308             CalculateNumChildren ();
    309 
    310             virtual lldb::ValueObjectSP
    311             GetChildAtIndex (size_t idx);
    312 
    313             virtual bool
    314             Update();
    315 
    316             virtual bool
    317             MightHaveChildren ();
    318 
    319             virtual size_t
    320             GetIndexOfChildWithName (const ConstString &name);
    321 
    322             virtual
    323             ~NSDictionaryISyntheticFrontEnd ();
    324         private:
    325             ExecutionContextRef m_exe_ctx_ref;
    326             uint8_t m_ptr_size;
    327             lldb::ByteOrder m_order;
    328             DataDescriptor_32 *m_data_32;
    329             DataDescriptor_64 *m_data_64;
    330             lldb::addr_t m_data_ptr;
    331             ClangASTType m_pair_type;
    332             std::vector<DictionaryItemDescriptor> m_children;
    333         };
    334 
    335         class NSDictionaryMSyntheticFrontEnd : public SyntheticChildrenFrontEnd
    336         {
    337         private:
    338             struct DataDescriptor_32
    339             {
    340                 uint32_t _used : 26;
    341                 uint32_t _kvo : 1;
    342                 uint32_t _size;
    343                 uint32_t _mutations;
    344                 uint32_t _objs_addr;
    345                 uint32_t _keys_addr;
    346             };
    347             struct DataDescriptor_64
    348             {
    349                 uint64_t _used : 58;
    350                 uint32_t _kvo : 1;
    351                 uint64_t _size;
    352                 uint64_t _mutations;
    353                 uint64_t _objs_addr;
    354                 uint64_t _keys_addr;
    355             };
    356             struct DictionaryItemDescriptor
    357             {
    358                 lldb::addr_t key_ptr;
    359                 lldb::addr_t val_ptr;
    360                 lldb::ValueObjectSP valobj_sp;
    361             };
    362         public:
    363             NSDictionaryMSyntheticFrontEnd (lldb::ValueObjectSP valobj_sp);
    364 
    365             virtual size_t
    366             CalculateNumChildren ();
    367 
    368             virtual lldb::ValueObjectSP
    369             GetChildAtIndex (size_t idx);
    370 
    371             virtual bool
    372             Update();
    373 
    374             virtual bool
    375             MightHaveChildren ();
    376 
    377             virtual size_t
    378             GetIndexOfChildWithName (const ConstString &name);
    379 
    380             virtual
    381             ~NSDictionaryMSyntheticFrontEnd ();
    382         private:
    383             ExecutionContextRef m_exe_ctx_ref;
    384             uint8_t m_ptr_size;
    385             lldb::ByteOrder m_order;
    386             DataDescriptor_32 *m_data_32;
    387             DataDescriptor_64 *m_data_64;
    388             ClangASTType m_pair_type;
    389             std::vector<DictionaryItemDescriptor> m_children;
    390         };
    391 
    392         class NSDictionaryCodeRunningSyntheticFrontEnd : public SyntheticChildrenFrontEnd
    393         {
    394         public:
    395             NSDictionaryCodeRunningSyntheticFrontEnd (lldb::ValueObjectSP valobj_sp);
    396 
    397             virtual size_t
    398             CalculateNumChildren ();
    399 
    400             virtual lldb::ValueObjectSP
    401             GetChildAtIndex (size_t idx);
    402 
    403             virtual bool
    404             Update();
    405 
    406             virtual bool
    407             MightHaveChildren ();
    408 
    409             virtual size_t
    410             GetIndexOfChildWithName (const ConstString &name);
    411 
    412             virtual
    413             ~NSDictionaryCodeRunningSyntheticFrontEnd ();
    414         };
    415 
    416         SyntheticChildrenFrontEnd* NSDictionarySyntheticFrontEndCreator (CXXSyntheticChildren*, lldb::ValueObjectSP);
    417 
    418         class NSSetISyntheticFrontEnd : public SyntheticChildrenFrontEnd
    419         {
    420         private:
    421             struct DataDescriptor_32
    422             {
    423                 uint32_t _used : 26;
    424                 uint32_t _szidx : 6;
    425             };
    426             struct DataDescriptor_64
    427             {
    428                 uint64_t _used : 58;
    429                 uint32_t _szidx : 6;
    430             };
    431 
    432             struct SetItemDescriptor
    433             {
    434                 lldb::addr_t item_ptr;
    435                 lldb::ValueObjectSP valobj_sp;
    436             };
    437 
    438         public:
    439             NSSetISyntheticFrontEnd (lldb::ValueObjectSP valobj_sp);
    440 
    441             virtual size_t
    442             CalculateNumChildren ();
    443 
    444             virtual lldb::ValueObjectSP
    445             GetChildAtIndex (size_t idx);
    446 
    447             virtual bool
    448             Update();
    449 
    450             virtual bool
    451             MightHaveChildren ();
    452 
    453             virtual size_t
    454             GetIndexOfChildWithName (const ConstString &name);
    455 
    456             virtual
    457             ~NSSetISyntheticFrontEnd ();
    458         private:
    459             ExecutionContextRef m_exe_ctx_ref;
    460             uint8_t m_ptr_size;
    461             DataDescriptor_32 *m_data_32;
    462             DataDescriptor_64 *m_data_64;
    463             lldb::addr_t m_data_ptr;
    464             std::vector<SetItemDescriptor> m_children;
    465         };
    466 
    467         class NSOrderedSetSyntheticFrontEnd : public SyntheticChildrenFrontEnd
    468         {
    469         private:
    470 
    471         public:
    472             NSOrderedSetSyntheticFrontEnd (lldb::ValueObjectSP valobj_sp);
    473 
    474             virtual size_t
    475             CalculateNumChildren ();
    476 
    477             virtual lldb::ValueObjectSP
    478             GetChildAtIndex (size_t idx);
    479 
    480             virtual bool
    481             Update();
    482 
    483             virtual bool
    484             MightHaveChildren ();
    485 
    486             virtual size_t
    487             GetIndexOfChildWithName (const ConstString &name);
    488 
    489             virtual
    490             ~NSOrderedSetSyntheticFrontEnd ();
    491         private:
    492             uint32_t m_count;
    493             std::map<uint32_t,lldb::ValueObjectSP> m_children;
    494         };
    495 
    496         class NSSetMSyntheticFrontEnd : public SyntheticChildrenFrontEnd
    497         {
    498         private:
    499             struct DataDescriptor_32
    500             {
    501                 uint32_t _used : 26;
    502                 uint32_t _size;
    503                 uint32_t _mutations;
    504                 uint32_t _objs_addr;
    505             };
    506             struct DataDescriptor_64
    507             {
    508                 uint64_t _used : 58;
    509                 uint64_t _size;
    510                 uint64_t _mutations;
    511                 uint64_t _objs_addr;
    512             };
    513             struct SetItemDescriptor
    514             {
    515                 lldb::addr_t item_ptr;
    516                 lldb::ValueObjectSP valobj_sp;
    517             };
    518         public:
    519             NSSetMSyntheticFrontEnd (lldb::ValueObjectSP valobj_sp);
    520 
    521             virtual size_t
    522             CalculateNumChildren ();
    523 
    524             virtual lldb::ValueObjectSP
    525             GetChildAtIndex (size_t idx);
    526 
    527             virtual bool
    528             Update();
    529 
    530             virtual bool
    531             MightHaveChildren ();
    532 
    533             virtual size_t
    534             GetIndexOfChildWithName (const ConstString &name);
    535 
    536             virtual
    537             ~NSSetMSyntheticFrontEnd ();
    538         private:
    539             ExecutionContextRef m_exe_ctx_ref;
    540             uint8_t m_ptr_size;
    541             DataDescriptor_32 *m_data_32;
    542             DataDescriptor_64 *m_data_64;
    543             std::vector<SetItemDescriptor> m_children;
    544         };
    545 
    546         class NSSetCodeRunningSyntheticFrontEnd : public SyntheticChildrenFrontEnd
    547         {
    548         public:
    549             NSSetCodeRunningSyntheticFrontEnd (lldb::ValueObjectSP valobj_sp);
    550 
    551             virtual size_t
    552             CalculateNumChildren ();
    553 
    554             virtual lldb::ValueObjectSP
    555             GetChildAtIndex (size_t idx);
    556 
    557             virtual bool
    558             Update();
    559 
    560             virtual bool
    561             MightHaveChildren ();
    562 
    563             virtual size_t
    564             GetIndexOfChildWithName (const ConstString &name);
    565 
    566             virtual
    567             ~NSSetCodeRunningSyntheticFrontEnd ();
    568         };
    569 
    570         SyntheticChildrenFrontEnd* NSSetSyntheticFrontEndCreator (CXXSyntheticChildren*, lldb::ValueObjectSP);
    571 
    572         class LibcxxVectorBoolSyntheticFrontEnd : public SyntheticChildrenFrontEnd
    573         {
    574         public:
    575             LibcxxVectorBoolSyntheticFrontEnd (lldb::ValueObjectSP valobj_sp);
    576 
    577             virtual size_t
    578             CalculateNumChildren ();
    579 
    580             virtual lldb::ValueObjectSP
    581             GetChildAtIndex (size_t idx);
    582 
    583             virtual bool
    584             Update();
    585 
    586             virtual bool
    587             MightHaveChildren ();
    588 
    589             virtual size_t
    590             GetIndexOfChildWithName (const ConstString &name);
    591 
    592             virtual
    593             ~LibcxxVectorBoolSyntheticFrontEnd ();
    594         private:
    595             ExecutionContextRef m_exe_ctx_ref;
    596             uint64_t m_count;
    597             lldb::addr_t m_base_data_address;
    598             EvaluateExpressionOptions m_options;
    599         };
    600 
    601         SyntheticChildrenFrontEnd* LibcxxVectorBoolSyntheticFrontEndCreator (CXXSyntheticChildren*, lldb::ValueObjectSP);
    602 
    603         bool
    604         LibcxxContainerSummaryProvider (ValueObject& valobj, Stream& stream);
    605 
    606         class LibstdcppVectorBoolSyntheticFrontEnd : public SyntheticChildrenFrontEnd
    607         {
    608         public:
    609             LibstdcppVectorBoolSyntheticFrontEnd (lldb::ValueObjectSP valobj_sp);
    610 
    611             virtual size_t
    612             CalculateNumChildren ();
    613 
    614             virtual lldb::ValueObjectSP
    615             GetChildAtIndex (size_t idx);
    616 
    617             virtual bool
    618             Update();
    619 
    620             virtual bool
    621             MightHaveChildren ();
    622 
    623             virtual size_t
    624             GetIndexOfChildWithName (const ConstString &name);
    625 
    626             virtual
    627             ~LibstdcppVectorBoolSyntheticFrontEnd ();
    628         private:
    629             ExecutionContextRef m_exe_ctx_ref;
    630             uint64_t m_count;
    631             lldb::addr_t m_base_data_address;
    632             EvaluateExpressionOptions m_options;
    633         };
    634 
    635         SyntheticChildrenFrontEnd* LibstdcppVectorBoolSyntheticFrontEndCreator (CXXSyntheticChildren*, lldb::ValueObjectSP);
    636 
    637         class LibstdcppMapIteratorSyntheticFrontEnd : public SyntheticChildrenFrontEnd
    638         {
    639         public:
    640             LibstdcppMapIteratorSyntheticFrontEnd (lldb::ValueObjectSP valobj_sp);
    641 
    642             virtual size_t
    643             CalculateNumChildren ();
    644 
    645             virtual lldb::ValueObjectSP
    646             GetChildAtIndex (size_t idx);
    647 
    648             virtual bool
    649             Update();
    650 
    651             virtual bool
    652             MightHaveChildren ();
    653 
    654             virtual size_t
    655             GetIndexOfChildWithName (const ConstString &name);
    656 
    657             virtual
    658             ~LibstdcppMapIteratorSyntheticFrontEnd ();
    659         private:
    660             ExecutionContextRef m_exe_ctx_ref;
    661             lldb::addr_t m_pair_address;
    662             ClangASTType m_pair_type;
    663             EvaluateExpressionOptions m_options;
    664             lldb::ValueObjectSP m_pair_sp;
    665         };
    666 
    667         SyntheticChildrenFrontEnd* LibstdcppMapIteratorSyntheticFrontEndCreator (CXXSyntheticChildren*, lldb::ValueObjectSP);
    668 
    669         class LibCxxMapIteratorSyntheticFrontEnd : public SyntheticChildrenFrontEnd
    670         {
    671         public:
    672             LibCxxMapIteratorSyntheticFrontEnd (lldb::ValueObjectSP valobj_sp);
    673 
    674             virtual size_t
    675             CalculateNumChildren ();
    676 
    677             virtual lldb::ValueObjectSP
    678             GetChildAtIndex (size_t idx);
    679 
    680             virtual bool
    681             Update();
    682 
    683             virtual bool
    684             MightHaveChildren ();
    685 
    686             virtual size_t
    687             GetIndexOfChildWithName (const ConstString &name);
    688 
    689             virtual
    690             ~LibCxxMapIteratorSyntheticFrontEnd ();
    691         private:
    692             ValueObject *m_pair_ptr;
    693         };
    694 
    695         SyntheticChildrenFrontEnd* LibCxxMapIteratorSyntheticFrontEndCreator (CXXSyntheticChildren*, lldb::ValueObjectSP);
    696 
    697         class VectorIteratorSyntheticFrontEnd : public SyntheticChildrenFrontEnd
    698         {
    699         public:
    700             VectorIteratorSyntheticFrontEnd (lldb::ValueObjectSP valobj_sp,
    701                                              ConstString item_name);
    702 
    703             virtual size_t
    704             CalculateNumChildren ();
    705 
    706             virtual lldb::ValueObjectSP
    707             GetChildAtIndex (size_t idx);
    708 
    709             virtual bool
    710             Update();
    711 
    712             virtual bool
    713             MightHaveChildren ();
    714 
    715             virtual size_t
    716             GetIndexOfChildWithName (const ConstString &name);
    717 
    718             virtual
    719             ~VectorIteratorSyntheticFrontEnd ();
    720         private:
    721             ExecutionContextRef m_exe_ctx_ref;
    722             ConstString m_item_name;
    723             lldb::ValueObjectSP m_item_sp;
    724         };
    725 
    726         SyntheticChildrenFrontEnd* LibCxxVectorIteratorSyntheticFrontEndCreator (CXXSyntheticChildren*, lldb::ValueObjectSP);
    727 
    728         SyntheticChildrenFrontEnd* LibStdcppVectorIteratorSyntheticFrontEndCreator (CXXSyntheticChildren*, lldb::ValueObjectSP);
    729 
    730         class LibcxxSharedPtrSyntheticFrontEnd : public SyntheticChildrenFrontEnd
    731         {
    732         public:
    733             LibcxxSharedPtrSyntheticFrontEnd (lldb::ValueObjectSP valobj_sp);
    734 
    735             virtual size_t
    736             CalculateNumChildren ();
    737 
    738             virtual lldb::ValueObjectSP
    739             GetChildAtIndex (size_t idx);
    740 
    741             virtual bool
    742             Update();
    743 
    744             virtual bool
    745             MightHaveChildren ();
    746 
    747             virtual size_t
    748             GetIndexOfChildWithName (const ConstString &name);
    749 
    750             virtual
    751             ~LibcxxSharedPtrSyntheticFrontEnd ();
    752         private:
    753             ValueObject* m_cntrl;
    754             lldb::ValueObjectSP m_count_sp;
    755             lldb::ValueObjectSP m_weak_count_sp;
    756             uint8_t m_ptr_size;
    757             lldb::ByteOrder m_byte_order;
    758         };
    759 
    760         SyntheticChildrenFrontEnd* LibcxxSharedPtrSyntheticFrontEndCreator (CXXSyntheticChildren*, lldb::ValueObjectSP);
    761 
    762         class LibcxxStdVectorSyntheticFrontEnd : public SyntheticChildrenFrontEnd
    763         {
    764         public:
    765             LibcxxStdVectorSyntheticFrontEnd (lldb::ValueObjectSP valobj_sp);
    766 
    767             virtual size_t
    768             CalculateNumChildren ();
    769 
    770             virtual lldb::ValueObjectSP
    771             GetChildAtIndex (size_t idx);
    772 
    773             virtual bool
    774             Update();
    775 
    776             virtual bool
    777             MightHaveChildren ();
    778 
    779             virtual size_t
    780             GetIndexOfChildWithName (const ConstString &name);
    781 
    782             virtual
    783             ~LibcxxStdVectorSyntheticFrontEnd ();
    784         private:
    785             ValueObject* m_start;
    786             ValueObject* m_finish;
    787             ClangASTType m_element_type;
    788             uint32_t m_element_size;
    789             std::map<size_t,lldb::ValueObjectSP> m_children;
    790         };
    791 
    792         SyntheticChildrenFrontEnd* LibcxxStdVectorSyntheticFrontEndCreator (CXXSyntheticChildren*, lldb::ValueObjectSP);
    793 
    794         class LibcxxStdListSyntheticFrontEnd : public SyntheticChildrenFrontEnd
    795         {
    796         public:
    797             LibcxxStdListSyntheticFrontEnd (lldb::ValueObjectSP valobj_sp);
    798 
    799             virtual size_t
    800             CalculateNumChildren ();
    801 
    802             virtual lldb::ValueObjectSP
    803             GetChildAtIndex (size_t idx);
    804 
    805             virtual bool
    806             Update();
    807 
    808             virtual bool
    809             MightHaveChildren ();
    810 
    811             virtual size_t
    812             GetIndexOfChildWithName (const ConstString &name);
    813 
    814             virtual
    815             ~LibcxxStdListSyntheticFrontEnd ();
    816         private:
    817             bool
    818             HasLoop();
    819 
    820             size_t m_list_capping_size;
    821             static const bool g_use_loop_detect = true;
    822             lldb::addr_t m_node_address;
    823             ValueObject* m_head;
    824             ValueObject* m_tail;
    825             ClangASTType m_element_type;
    826             size_t m_count;
    827             std::map<size_t,lldb::ValueObjectSP> m_children;
    828         };
    829 
    830         SyntheticChildrenFrontEnd* LibcxxStdListSyntheticFrontEndCreator (CXXSyntheticChildren*, lldb::ValueObjectSP);
    831 
    832         class LibcxxStdMapSyntheticFrontEnd : public SyntheticChildrenFrontEnd
    833         {
    834         public:
    835             LibcxxStdMapSyntheticFrontEnd (lldb::ValueObjectSP valobj_sp);
    836 
    837             virtual size_t
    838             CalculateNumChildren ();
    839 
    840             virtual lldb::ValueObjectSP
    841             GetChildAtIndex (size_t idx);
    842 
    843             virtual bool
    844             Update();
    845 
    846             virtual bool
    847             MightHaveChildren ();
    848 
    849             virtual size_t
    850             GetIndexOfChildWithName (const ConstString &name);
    851 
    852             virtual
    853             ~LibcxxStdMapSyntheticFrontEnd ();
    854         private:
    855             bool
    856             GetDataType();
    857 
    858             void
    859             GetValueOffset (const lldb::ValueObjectSP& node);
    860 
    861             ValueObject* m_tree;
    862             ValueObject* m_root_node;
    863             ClangASTType m_element_type;
    864             uint32_t m_skip_size;
    865             size_t m_count;
    866             std::map<size_t,lldb::ValueObjectSP> m_children;
    867         };
    868 
    869         SyntheticChildrenFrontEnd* LibcxxStdMapSyntheticFrontEndCreator (CXXSyntheticChildren*, lldb::ValueObjectSP);
    870 
    871     } // namespace formatters
    872 } // namespace lldb_private
    873 
    874 #endif // liblldb_CXXFormatterFunctions_h_
    875