Home | History | Annotate | Download | only in DWARF
      1 //===-- SymbolFileDWARF.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 SymbolFileDWARF_SymbolFileDWARF_h_
     11 #define SymbolFileDWARF_SymbolFileDWARF_h_
     12 
     13 // C Includes
     14 // C++ Includes
     15 #include <list>
     16 #include <map>
     17 #include <set>
     18 #include <vector>
     19 
     20 // Other libraries and framework includes
     21 #include "clang/AST/CharUnits.h"
     22 #include "clang/AST/ExternalASTSource.h"
     23 #include "llvm/ADT/DenseMap.h"
     24 #include "llvm/ADT/SmallPtrSet.h"
     25 #include "llvm/ADT/SmallVector.h"
     26 
     27 #include "lldb/lldb-private.h"
     28 #include "lldb/Core/ClangForward.h"
     29 #include "lldb/Core/ConstString.h"
     30 #include "lldb/Core/dwarf.h"
     31 #include "lldb/Core/DataExtractor.h"
     32 #include "lldb/Core/Flags.h"
     33 #include "lldb/Core/UniqueCStringMap.h"
     34 #include "lldb/Symbol/ClangASTContext.h"
     35 #include "lldb/Symbol/SymbolFile.h"
     36 #include "lldb/Symbol/SymbolContext.h"
     37 
     38 // Project includes
     39 #include "DWARFDefines.h"
     40 #include "HashedNameToDIE.h"
     41 #include "NameToDIE.h"
     42 #include "UniqueDWARFASTType.h"
     43 
     44 //----------------------------------------------------------------------
     45 // Forward Declarations for this DWARF plugin
     46 //----------------------------------------------------------------------
     47 class DebugMapModule;
     48 class DWARFAbbreviationDeclaration;
     49 class DWARFAbbreviationDeclarationSet;
     50 class DWARFileUnit;
     51 class DWARFDebugAbbrev;
     52 class DWARFDebugAranges;
     53 class DWARFDebugInfo;
     54 class DWARFDebugInfoEntry;
     55 class DWARFDebugLine;
     56 class DWARFDebugPubnames;
     57 class DWARFDebugRanges;
     58 class DWARFDeclContext;
     59 class DWARFDIECollection;
     60 class DWARFFormValue;
     61 class SymbolFileDWARFDebugMap;
     62 
     63 class SymbolFileDWARF : public lldb_private::SymbolFile, public lldb_private::UserID
     64 {
     65 public:
     66     friend class SymbolFileDWARFDebugMap;
     67     friend class DebugMapModule;
     68     friend class DWARFCompileUnit;
     69     //------------------------------------------------------------------
     70     // Static Functions
     71     //------------------------------------------------------------------
     72     static void
     73     Initialize();
     74 
     75     static void
     76     Terminate();
     77 
     78     static lldb_private::ConstString
     79     GetPluginNameStatic();
     80 
     81     static const char *
     82     GetPluginDescriptionStatic();
     83 
     84     static lldb_private::SymbolFile*
     85     CreateInstance (lldb_private::ObjectFile* obj_file);
     86     //------------------------------------------------------------------
     87     // Constructors and Destructors
     88     //------------------------------------------------------------------
     89                             SymbolFileDWARF(lldb_private::ObjectFile* ofile);
     90     virtual                 ~SymbolFileDWARF();
     91 
     92     virtual uint32_t        CalculateAbilities ();
     93     virtual void            InitializeObject();
     94 
     95     //------------------------------------------------------------------
     96     // Compile Unit function calls
     97     //------------------------------------------------------------------
     98     virtual uint32_t        GetNumCompileUnits();
     99     virtual lldb::CompUnitSP ParseCompileUnitAtIndex(uint32_t index);
    100 
    101     virtual lldb::LanguageType ParseCompileUnitLanguage (const lldb_private::SymbolContext& sc);
    102     virtual size_t          ParseCompileUnitFunctions (const lldb_private::SymbolContext& sc);
    103     virtual bool            ParseCompileUnitLineTable (const lldb_private::SymbolContext& sc);
    104     virtual bool            ParseCompileUnitSupportFiles (const lldb_private::SymbolContext& sc, lldb_private::FileSpecList& support_files);
    105     virtual size_t          ParseFunctionBlocks (const lldb_private::SymbolContext& sc);
    106     virtual size_t          ParseTypes (const lldb_private::SymbolContext& sc);
    107     virtual size_t          ParseVariablesForContext (const lldb_private::SymbolContext& sc);
    108 
    109     virtual lldb_private::Type* ResolveTypeUID(lldb::user_id_t type_uid);
    110     virtual bool            ResolveClangOpaqueTypeDefinition (lldb_private::ClangASTType& clang_type);
    111 
    112     virtual lldb_private::Type* ResolveType (DWARFCompileUnit* dwarf_cu, const DWARFDebugInfoEntry* type_die, bool assert_not_being_parsed = true);
    113     virtual clang::DeclContext* GetClangDeclContextContainingTypeUID (lldb::user_id_t type_uid);
    114     virtual clang::DeclContext* GetClangDeclContextForTypeUID (const lldb_private::SymbolContext &sc, lldb::user_id_t type_uid);
    115 
    116     virtual uint32_t        ResolveSymbolContext (const lldb_private::Address& so_addr, uint32_t resolve_scope, lldb_private::SymbolContext& sc);
    117     virtual uint32_t        ResolveSymbolContext (const lldb_private::FileSpec& file_spec, uint32_t line, bool check_inlines, uint32_t resolve_scope, lldb_private::SymbolContextList& sc_list);
    118     virtual uint32_t        FindGlobalVariables(const lldb_private::ConstString &name, const lldb_private::ClangNamespaceDecl *namespace_decl, bool append, uint32_t max_matches, lldb_private::VariableList& variables);
    119     virtual uint32_t        FindGlobalVariables(const lldb_private::RegularExpression& regex, bool append, uint32_t max_matches, lldb_private::VariableList& variables);
    120     virtual uint32_t        FindFunctions(const lldb_private::ConstString &name, const lldb_private::ClangNamespaceDecl *namespace_decl, uint32_t name_type_mask, bool include_inlines, bool append, lldb_private::SymbolContextList& sc_list);
    121     virtual uint32_t        FindFunctions(const lldb_private::RegularExpression& regex, bool include_inlines, bool append, lldb_private::SymbolContextList& sc_list);
    122     virtual uint32_t        FindTypes (const lldb_private::SymbolContext& sc, const lldb_private::ConstString &name, const lldb_private::ClangNamespaceDecl *namespace_decl, bool append, uint32_t max_matches, lldb_private::TypeList& types);
    123     virtual lldb_private::TypeList *
    124                             GetTypeList ();
    125     virtual size_t          GetTypes (lldb_private::SymbolContextScope *sc_scope,
    126                                       uint32_t type_mask,
    127                                       lldb_private::TypeList &type_list);
    128 
    129     virtual lldb_private::ClangASTContext &
    130                             GetClangASTContext ();
    131 
    132     virtual lldb_private::ClangNamespaceDecl
    133             FindNamespace (const lldb_private::SymbolContext& sc,
    134                            const lldb_private::ConstString &name,
    135                            const lldb_private::ClangNamespaceDecl *parent_namespace_decl);
    136 
    137 
    138     //------------------------------------------------------------------
    139     // ClangASTContext callbacks for external source lookups.
    140     //------------------------------------------------------------------
    141     static void
    142     CompleteTagDecl (void *baton, clang::TagDecl *);
    143 
    144     static void
    145     CompleteObjCInterfaceDecl (void *baton, clang::ObjCInterfaceDecl *);
    146 
    147     static void
    148     FindExternalVisibleDeclsByName (void *baton,
    149                                     const clang::DeclContext *DC,
    150                                     clang::DeclarationName Name,
    151                                     llvm::SmallVectorImpl <clang::NamedDecl *> *results);
    152 
    153     static bool
    154     LayoutRecordType (void *baton,
    155                       const clang::RecordDecl *record_decl,
    156                       uint64_t &size,
    157                       uint64_t &alignment,
    158                       llvm::DenseMap <const clang::FieldDecl *, uint64_t> &field_offsets,
    159                       llvm::DenseMap <const clang::CXXRecordDecl *, clang::CharUnits> &base_offsets,
    160                       llvm::DenseMap <const clang::CXXRecordDecl *, clang::CharUnits> &vbase_offsets);
    161 
    162     bool
    163     LayoutRecordType (const clang::RecordDecl *record_decl,
    164                       uint64_t &size,
    165                       uint64_t &alignment,
    166                       llvm::DenseMap <const clang::FieldDecl *, uint64_t> &field_offsets,
    167                       llvm::DenseMap <const clang::CXXRecordDecl *, clang::CharUnits> &base_offsets,
    168                       llvm::DenseMap <const clang::CXXRecordDecl *, clang::CharUnits> &vbase_offsets);
    169 
    170     struct LayoutInfo
    171     {
    172         LayoutInfo () :
    173             bit_size(0),
    174             alignment(0),
    175             field_offsets(),
    176             base_offsets(),
    177             vbase_offsets()
    178         {
    179         }
    180         uint64_t bit_size;
    181         uint64_t alignment;
    182         llvm::DenseMap <const clang::FieldDecl *, uint64_t> field_offsets;
    183         llvm::DenseMap <const clang::CXXRecordDecl *, clang::CharUnits> base_offsets;
    184         llvm::DenseMap <const clang::CXXRecordDecl *, clang::CharUnits> vbase_offsets;
    185     };
    186     //------------------------------------------------------------------
    187     // PluginInterface protocol
    188     //------------------------------------------------------------------
    189     virtual lldb_private::ConstString
    190     GetPluginName();
    191 
    192     virtual uint32_t
    193     GetPluginVersion();
    194 
    195     // Approach 2 - count + accessor
    196     // Index compile units would scan the initial compile units and register
    197     // them with the module. This would only be done on demand if and only if
    198     // the compile units were needed.
    199     //virtual size_t        GetCompUnitCount() = 0;
    200     //virtual CompUnitSP    GetCompUnitAtIndex(size_t cu_idx) = 0;
    201 
    202     const lldb_private::DataExtractor&      get_debug_abbrev_data ();
    203     const lldb_private::DataExtractor&      get_debug_aranges_data ();
    204     const lldb_private::DataExtractor&      get_debug_frame_data ();
    205     const lldb_private::DataExtractor&      get_debug_info_data ();
    206     const lldb_private::DataExtractor&      get_debug_line_data ();
    207     const lldb_private::DataExtractor&      get_debug_loc_data ();
    208     const lldb_private::DataExtractor&      get_debug_ranges_data ();
    209     const lldb_private::DataExtractor&      get_debug_str_data ();
    210     const lldb_private::DataExtractor&      get_apple_names_data ();
    211     const lldb_private::DataExtractor&      get_apple_types_data ();
    212     const lldb_private::DataExtractor&      get_apple_namespaces_data ();
    213     const lldb_private::DataExtractor&      get_apple_objc_data ();
    214 
    215 
    216     DWARFDebugAbbrev*       DebugAbbrev();
    217     const DWARFDebugAbbrev* DebugAbbrev() const;
    218 
    219     DWARFDebugInfo*         DebugInfo();
    220     const DWARFDebugInfo*   DebugInfo() const;
    221 
    222     DWARFDebugRanges*       DebugRanges();
    223     const DWARFDebugRanges* DebugRanges() const;
    224 
    225     const lldb_private::DataExtractor&
    226     GetCachedSectionData (uint32_t got_flag,
    227                           lldb::SectionType sect_type,
    228                           lldb_private::DataExtractor &data);
    229 
    230     static bool
    231     SupportedVersion(uint16_t version);
    232 
    233     clang::DeclContext *
    234     GetCachedClangDeclContextForDIE (const DWARFDebugInfoEntry *die)
    235     {
    236         DIEToDeclContextMap::iterator pos = m_die_to_decl_ctx.find(die);
    237         if (pos != m_die_to_decl_ctx.end())
    238             return pos->second;
    239         else
    240             return NULL;
    241     }
    242 
    243     clang::DeclContext *
    244     GetClangDeclContextForDIE (const lldb_private::SymbolContext &sc, DWARFCompileUnit *cu, const DWARFDebugInfoEntry *die);
    245 
    246     clang::DeclContext *
    247     GetClangDeclContextForDIEOffset (const lldb_private::SymbolContext &sc, dw_offset_t die_offset);
    248 
    249     clang::DeclContext *
    250     GetClangDeclContextContainingDIE (DWARFCompileUnit *cu,
    251                                       const DWARFDebugInfoEntry *die,
    252                                       const DWARFDebugInfoEntry **decl_ctx_die);
    253 
    254     clang::DeclContext *
    255     GetClangDeclContextContainingDIEOffset (dw_offset_t die_offset);
    256 
    257     const DWARFDebugInfoEntry *
    258     GetDeclContextDIEContainingDIE (DWARFCompileUnit *cu, const DWARFDebugInfoEntry *die);
    259 
    260     void
    261     SearchDeclContext (const clang::DeclContext *decl_context,
    262                        const char *name,
    263                        llvm::SmallVectorImpl <clang::NamedDecl *> *results);
    264 
    265     lldb_private::Flags&
    266     GetFlags ()
    267     {
    268         return m_flags;
    269     }
    270 
    271     const lldb_private::Flags&
    272     GetFlags () const
    273     {
    274         return m_flags;
    275     }
    276 
    277     bool
    278     HasForwardDeclForClangType (const lldb_private::ClangASTType &clang_type);
    279 
    280 protected:
    281 
    282     enum
    283     {
    284         flagsGotDebugAbbrevData     = (1 << 0),
    285         flagsGotDebugArangesData    = (1 << 1),
    286         flagsGotDebugFrameData      = (1 << 2),
    287         flagsGotDebugInfoData       = (1 << 3),
    288         flagsGotDebugLineData       = (1 << 4),
    289         flagsGotDebugLocData        = (1 << 5),
    290         flagsGotDebugMacInfoData    = (1 << 6),
    291         flagsGotDebugPubNamesData   = (1 << 7),
    292         flagsGotDebugPubTypesData   = (1 << 8),
    293         flagsGotDebugRangesData     = (1 << 9),
    294         flagsGotDebugStrData        = (1 << 10),
    295         flagsGotAppleNamesData      = (1 << 11),
    296         flagsGotAppleTypesData      = (1 << 12),
    297         flagsGotAppleNamespacesData = (1 << 13),
    298         flagsGotAppleObjCData       = (1 << 14)
    299     };
    300 
    301     bool                    NamespaceDeclMatchesThisSymbolFile (const lldb_private::ClangNamespaceDecl *namespace_decl);
    302 
    303     bool                    DIEIsInNamespace (const lldb_private::ClangNamespaceDecl *namespace_decl,
    304                                               DWARFCompileUnit* dwarf_cu,
    305                                               const DWARFDebugInfoEntry* die);
    306 
    307     DISALLOW_COPY_AND_ASSIGN (SymbolFileDWARF);
    308     lldb::CompUnitSP        ParseCompileUnit (DWARFCompileUnit* dwarf_cu, uint32_t cu_idx);
    309     DWARFCompileUnit*       GetDWARFCompileUnit(lldb_private::CompileUnit *comp_unit);
    310     DWARFCompileUnit*       GetNextUnparsedDWARFCompileUnit(DWARFCompileUnit* prev_cu);
    311     lldb_private::CompileUnit*      GetCompUnitForDWARFCompUnit(DWARFCompileUnit* dwarf_cu, uint32_t cu_idx = UINT32_MAX);
    312     bool                    GetFunction (DWARFCompileUnit* dwarf_cu, const DWARFDebugInfoEntry* func_die, lldb_private::SymbolContext& sc);
    313     lldb_private::Function *        ParseCompileUnitFunction (const lldb_private::SymbolContext& sc, DWARFCompileUnit* dwarf_cu, const DWARFDebugInfoEntry *die);
    314     size_t                  ParseFunctionBlocks (const lldb_private::SymbolContext& sc,
    315                                                  lldb_private::Block *parent_block,
    316                                                  DWARFCompileUnit* dwarf_cu,
    317                                                  const DWARFDebugInfoEntry *die,
    318                                                  lldb::addr_t subprogram_low_pc,
    319                                                  uint32_t depth);
    320     size_t                  ParseTypes (const lldb_private::SymbolContext& sc, DWARFCompileUnit* dwarf_cu, const DWARFDebugInfoEntry *die, bool parse_siblings, bool parse_children);
    321     lldb::TypeSP            ParseType (const lldb_private::SymbolContext& sc, DWARFCompileUnit* dwarf_cu, const DWARFDebugInfoEntry *die, bool *type_is_new);
    322     lldb_private::Type*     ResolveTypeUID (DWARFCompileUnit* dwarf_cu, const DWARFDebugInfoEntry* die, bool assert_not_being_parsed);
    323 
    324     lldb::VariableSP        ParseVariableDIE(
    325                                 const lldb_private::SymbolContext& sc,
    326                                 DWARFCompileUnit* dwarf_cu,
    327                                 const DWARFDebugInfoEntry *die,
    328                                 const lldb::addr_t func_low_pc);
    329 
    330     size_t                  ParseVariables(
    331                                 const lldb_private::SymbolContext& sc,
    332                                 DWARFCompileUnit* dwarf_cu,
    333                                 const lldb::addr_t func_low_pc,
    334                                 const DWARFDebugInfoEntry *die,
    335                                 bool parse_siblings,
    336                                 bool parse_children,
    337                                 lldb_private::VariableList* cc_variable_list = NULL);
    338 
    339     class DelayedAddObjCClassProperty;
    340     typedef std::vector <DelayedAddObjCClassProperty> DelayedPropertyList;
    341 
    342     bool                    ClassOrStructIsVirtual (
    343                                 DWARFCompileUnit* dwarf_cu,
    344                                 const DWARFDebugInfoEntry *parent_die);
    345 
    346     size_t                  ParseChildMembers(
    347                                 const lldb_private::SymbolContext& sc,
    348                                 DWARFCompileUnit* dwarf_cu,
    349                                 const DWARFDebugInfoEntry *die,
    350                                 lldb_private::ClangASTType &class_clang_type,
    351                                 const lldb::LanguageType class_language,
    352                                 std::vector<clang::CXXBaseSpecifier *>& base_classes,
    353                                 std::vector<int>& member_accessibilities,
    354                                 DWARFDIECollection& member_function_dies,
    355                                 DelayedPropertyList& delayed_properties,
    356                                 lldb::AccessType &default_accessibility,
    357                                 bool &is_a_class,
    358                                 LayoutInfo &layout_info);
    359 
    360     size_t                  ParseChildParameters(
    361                                 const lldb_private::SymbolContext& sc,
    362                                 clang::DeclContext *containing_decl_ctx,
    363                                 DWARFCompileUnit* dwarf_cu,
    364                                 const DWARFDebugInfoEntry *parent_die,
    365                                 bool skip_artificial,
    366                                 bool &is_static,
    367                                 lldb_private::TypeList* type_list,
    368                                 std::vector<lldb_private::ClangASTType>& function_args,
    369                                 std::vector<clang::ParmVarDecl*>& function_param_decls,
    370                                 unsigned &type_quals,
    371                                 lldb_private::ClangASTContext::TemplateParameterInfos &template_param_infos);
    372 
    373     size_t                  ParseChildEnumerators(
    374                                 const lldb_private::SymbolContext& sc,
    375                                 lldb_private::ClangASTType &clang_type,
    376                                 bool is_signed,
    377                                 uint32_t enumerator_byte_size,
    378                                 DWARFCompileUnit* dwarf_cu,
    379                                 const DWARFDebugInfoEntry *enum_die);
    380 
    381     void                    ParseChildArrayInfo(
    382                                 const lldb_private::SymbolContext& sc,
    383                                 DWARFCompileUnit* dwarf_cu,
    384                                 const DWARFDebugInfoEntry *parent_die,
    385                                 int64_t& first_index,
    386                                 std::vector<uint64_t>& element_orders,
    387                                 uint32_t& byte_stride,
    388                                 uint32_t& bit_stride);
    389 
    390                             // Given a die_offset, figure out the symbol context representing that die.
    391     bool                    ResolveFunction (dw_offset_t offset,
    392                                              DWARFCompileUnit *&dwarf_cu,
    393                                              lldb_private::SymbolContextList& sc_list);
    394 
    395     bool                    ResolveFunction (DWARFCompileUnit *cu,
    396                                              const DWARFDebugInfoEntry *die,
    397                                              lldb_private::SymbolContextList& sc_list);
    398 
    399     bool                    FunctionDieMatchesPartialName (
    400                                 const DWARFDebugInfoEntry* die,
    401                                 const DWARFCompileUnit *dwarf_cu,
    402                                 uint32_t name_type_mask,
    403                                 const char *partial_name,
    404                                 const char *base_name_start,
    405                                 const char *base_name_end);
    406 
    407     void                    FindFunctions(
    408                                 const lldb_private::ConstString &name,
    409                                 const NameToDIE &name_to_die,
    410                                 lldb_private::SymbolContextList& sc_list);
    411 
    412     void                    FindFunctions (
    413                                 const lldb_private::RegularExpression &regex,
    414                                 const NameToDIE &name_to_die,
    415                                 lldb_private::SymbolContextList& sc_list);
    416 
    417     void                    FindFunctions (
    418                                 const lldb_private::RegularExpression &regex,
    419                                 const DWARFMappedHash::MemoryTable &memory_table,
    420                                 lldb_private::SymbolContextList& sc_list);
    421 
    422     lldb::TypeSP            FindDefinitionTypeForDIE (
    423                                 DWARFCompileUnit* dwarf_cu,
    424                                 const DWARFDebugInfoEntry *die,
    425                                 const lldb_private::ConstString &type_name);
    426 
    427     lldb::TypeSP            FindDefinitionTypeForDWARFDeclContext (
    428                                 const DWARFDeclContext &die_decl_ctx);
    429 
    430     lldb::TypeSP            FindCompleteObjCDefinitionTypeForDIE (
    431                                 const DWARFDebugInfoEntry *die,
    432                                 const lldb_private::ConstString &type_name,
    433                                 bool must_be_implementation);
    434 
    435     bool                    Supports_DW_AT_APPLE_objc_complete_type (DWARFCompileUnit *cu);
    436 
    437     lldb::TypeSP            FindCompleteObjCDefinitionType (const lldb_private::ConstString &type_name,
    438                                                             bool header_definition_ok);
    439 
    440     lldb_private::Symbol *  GetObjCClassSymbol (const lldb_private::ConstString &objc_class_name);
    441 
    442     void                    ParseFunctions (const DIEArray &die_offsets,
    443                                             lldb_private::SymbolContextList& sc_list);
    444     lldb::TypeSP            GetTypeForDIE (DWARFCompileUnit *cu,
    445                                            const DWARFDebugInfoEntry* die);
    446 
    447     uint32_t                FindTypes(std::vector<dw_offset_t> die_offsets, uint32_t max_matches, lldb_private::TypeList& types);
    448 
    449     void                    Index();
    450 
    451     void                    DumpIndexes();
    452 
    453     void                    SetDebugMapModule (const lldb::ModuleSP &module_sp)
    454                             {
    455                                 m_debug_map_module_wp = module_sp;
    456                             }
    457 
    458     SymbolFileDWARFDebugMap *
    459                             GetDebugMapSymfile ();
    460 
    461     const DWARFDebugInfoEntry *
    462                             FindBlockContainingSpecification (dw_offset_t func_die_offset,
    463                                                               dw_offset_t spec_block_die_offset,
    464                                                               DWARFCompileUnit **dwarf_cu_handle);
    465 
    466     const DWARFDebugInfoEntry *
    467                             FindBlockContainingSpecification (DWARFCompileUnit* dwarf_cu,
    468                                                               const DWARFDebugInfoEntry *die,
    469                                                               dw_offset_t spec_block_die_offset,
    470                                                               DWARFCompileUnit **dwarf_cu_handle);
    471 
    472     clang::NamespaceDecl *
    473     ResolveNamespaceDIE (DWARFCompileUnit *curr_cu, const DWARFDebugInfoEntry *die);
    474 
    475     UniqueDWARFASTTypeMap &
    476     GetUniqueDWARFASTTypeMap ();
    477 
    478     void                    LinkDeclContextToDIE (clang::DeclContext *decl_ctx,
    479                                                   const DWARFDebugInfoEntry *die)
    480                             {
    481                                 m_die_to_decl_ctx[die] = decl_ctx;
    482                                 // There can be many DIEs for a single decl context
    483                                 m_decl_ctx_to_die[decl_ctx].insert(die);
    484                             }
    485 
    486     bool
    487     UserIDMatches (lldb::user_id_t uid) const
    488     {
    489         const lldb::user_id_t high_uid = uid & 0xffffffff00000000ull;
    490         if (high_uid)
    491             return high_uid == GetID();
    492         return true;
    493     }
    494 
    495     lldb::user_id_t
    496     MakeUserID (dw_offset_t die_offset) const
    497     {
    498         return GetID() | die_offset;
    499     }
    500 
    501     static bool
    502     DeclKindIsCXXClass (clang::Decl::Kind decl_kind)
    503     {
    504         switch (decl_kind)
    505         {
    506             case clang::Decl::CXXRecord:
    507             case clang::Decl::ClassTemplateSpecialization:
    508                 return true;
    509             default:
    510                 break;
    511         }
    512         return false;
    513     }
    514 
    515     bool
    516     ParseTemplateParameterInfos (DWARFCompileUnit* dwarf_cu,
    517                                  const DWARFDebugInfoEntry *parent_die,
    518                                  lldb_private::ClangASTContext::TemplateParameterInfos &template_param_infos);
    519 
    520     bool
    521     ParseTemplateDIE (DWARFCompileUnit* dwarf_cu,
    522                       const DWARFDebugInfoEntry *die,
    523                       lldb_private::ClangASTContext::TemplateParameterInfos &template_param_infos);
    524 
    525     clang::ClassTemplateDecl *
    526     ParseClassTemplateDecl (clang::DeclContext *decl_ctx,
    527                             lldb::AccessType access_type,
    528                             const char *parent_name,
    529                             int tag_decl_kind,
    530                             const lldb_private::ClangASTContext::TemplateParameterInfos &template_param_infos);
    531 
    532     bool
    533     DIEDeclContextsMatch (DWARFCompileUnit* cu1, const DWARFDebugInfoEntry *die1,
    534                           DWARFCompileUnit* cu2, const DWARFDebugInfoEntry *die2);
    535 
    536     bool
    537     ClassContainsSelector (DWARFCompileUnit *dwarf_cu,
    538                            const DWARFDebugInfoEntry *class_die,
    539                            const lldb_private::ConstString &selector);
    540 
    541     bool
    542     CopyUniqueClassMethodTypes (SymbolFileDWARF *class_symfile,
    543                                 lldb_private::Type *class_type,
    544                                 DWARFCompileUnit* src_cu,
    545                                 const DWARFDebugInfoEntry *src_class_die,
    546                                 DWARFCompileUnit* dst_cu,
    547                                 const DWARFDebugInfoEntry *dst_class_die,
    548                                 llvm::SmallVectorImpl <const DWARFDebugInfoEntry *> &failures);
    549 
    550     bool
    551     FixupAddress (lldb_private::Address &addr);
    552 
    553     typedef std::set<lldb_private::Type *> TypeSet;
    554 
    555     void
    556     GetTypes (DWARFCompileUnit* dwarf_cu,
    557               const DWARFDebugInfoEntry *die,
    558               dw_offset_t min_die_offset,
    559               dw_offset_t max_die_offset,
    560               uint32_t type_mask,
    561               TypeSet &type_set);
    562 
    563     lldb::ModuleWP                  m_debug_map_module_wp;
    564     SymbolFileDWARFDebugMap *       m_debug_map_symfile;
    565     clang::TranslationUnitDecl *    m_clang_tu_decl;
    566     lldb_private::Flags             m_flags;
    567     lldb_private::DataExtractor     m_dwarf_data;
    568     lldb_private::DataExtractor     m_data_debug_abbrev;
    569     lldb_private::DataExtractor     m_data_debug_aranges;
    570     lldb_private::DataExtractor     m_data_debug_frame;
    571     lldb_private::DataExtractor     m_data_debug_info;
    572     lldb_private::DataExtractor     m_data_debug_line;
    573     lldb_private::DataExtractor     m_data_debug_loc;
    574     lldb_private::DataExtractor     m_data_debug_ranges;
    575     lldb_private::DataExtractor     m_data_debug_str;
    576     lldb_private::DataExtractor     m_data_apple_names;
    577     lldb_private::DataExtractor     m_data_apple_types;
    578     lldb_private::DataExtractor     m_data_apple_namespaces;
    579     lldb_private::DataExtractor     m_data_apple_objc;
    580 
    581     // The unique pointer items below are generated on demand if and when someone accesses
    582     // them through a non const version of this class.
    583     std::unique_ptr<DWARFDebugAbbrev>     m_abbr;
    584     std::unique_ptr<DWARFDebugInfo>       m_info;
    585     std::unique_ptr<DWARFDebugLine>       m_line;
    586     std::unique_ptr<DWARFMappedHash::MemoryTable> m_apple_names_ap;
    587     std::unique_ptr<DWARFMappedHash::MemoryTable> m_apple_types_ap;
    588     std::unique_ptr<DWARFMappedHash::MemoryTable> m_apple_namespaces_ap;
    589     std::unique_ptr<DWARFMappedHash::MemoryTable> m_apple_objc_ap;
    590     NameToDIE                           m_function_basename_index;  // All concrete functions
    591     NameToDIE                           m_function_fullname_index;  // All concrete functions
    592     NameToDIE                           m_function_method_index;    // All inlined functions
    593     NameToDIE                           m_function_selector_index;  // All method names for functions of classes
    594     NameToDIE                           m_objc_class_selectors_index; // Given a class name, find all selectors for the class
    595     NameToDIE                           m_global_index;             // Global and static variables
    596     NameToDIE                           m_type_index;               // All type DIE offsets
    597     NameToDIE                           m_namespace_index;          // All type DIE offsets
    598     bool                                m_indexed:1,
    599                                         m_is_external_ast_source:1,
    600                                         m_using_apple_tables:1;
    601     lldb_private::LazyBool              m_supports_DW_AT_APPLE_objc_complete_type;
    602 
    603     std::unique_ptr<DWARFDebugRanges>     m_ranges;
    604     UniqueDWARFASTTypeMap m_unique_ast_type_map;
    605     typedef llvm::SmallPtrSet<const DWARFDebugInfoEntry *, 4> DIEPointerSet;
    606     typedef llvm::DenseMap<const DWARFDebugInfoEntry *, clang::DeclContext *> DIEToDeclContextMap;
    607     typedef llvm::DenseMap<const clang::DeclContext *, DIEPointerSet> DeclContextToDIEMap;
    608     typedef llvm::DenseMap<const DWARFDebugInfoEntry *, lldb_private::Type *> DIEToTypePtr;
    609     typedef llvm::DenseMap<const DWARFDebugInfoEntry *, lldb::VariableSP> DIEToVariableSP;
    610     typedef llvm::DenseMap<const DWARFDebugInfoEntry *, lldb::clang_type_t> DIEToClangType;
    611     typedef llvm::DenseMap<lldb::clang_type_t, const DWARFDebugInfoEntry *> ClangTypeToDIE;
    612     typedef llvm::DenseMap<const clang::RecordDecl *, LayoutInfo> RecordDeclToLayoutMap;
    613     DIEToDeclContextMap m_die_to_decl_ctx;
    614     DeclContextToDIEMap m_decl_ctx_to_die;
    615     DIEToTypePtr m_die_to_type;
    616     DIEToVariableSP m_die_to_variable_sp;
    617     DIEToClangType m_forward_decl_die_to_clang_type;
    618     ClangTypeToDIE m_forward_decl_clang_type_to_die;
    619     RecordDeclToLayoutMap m_record_decl_to_layout_map;
    620 };
    621 
    622 #endif  // SymbolFileDWARF_SymbolFileDWARF_h_
    623