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//----------------------------------------------------------------------
47class DebugMapModule;
48class DWARFAbbreviationDeclaration;
49class DWARFAbbreviationDeclarationSet;
50class DWARFileUnit;
51class DWARFDebugAbbrev;
52class DWARFDebugAranges;
53class DWARFDebugInfo;
54class DWARFDebugInfoEntry;
55class DWARFDebugLine;
56class DWARFDebugPubnames;
57class DWARFDebugRanges;
58class DWARFDeclContext;
59class DWARFDIECollection;
60class DWARFFormValue;
61class SymbolFileDWARFDebugMap;
62
63class SymbolFileDWARF : public lldb_private::SymbolFile, public lldb_private::UserID
64{
65public:
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
280protected:
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