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     {
LayoutInfoLayoutInfo172         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 *
GetCachedClangDeclContextForDIE(const DWARFDebugInfoEntry * die)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&
GetFlags()266     GetFlags ()
267     {
268         return m_flags;
269     }
270 
271     const lldb_private::Flags&
GetFlags()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 
SetDebugMapModule(const lldb::ModuleSP & module_sp)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 
LinkDeclContextToDIE(clang::DeclContext * decl_ctx,const DWARFDebugInfoEntry * die)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
UserIDMatches(lldb::user_id_t uid)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
MakeUserID(dw_offset_t die_offset)496     MakeUserID (dw_offset_t die_offset) const
497     {
498         return GetID() | die_offset;
499     }
500 
501     static bool
DeclKindIsCXXClass(clang::Decl::Kind decl_kind)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