aboutsummaryrefslogtreecommitdiff
path: root/source/Plugins/SymbolFile/DWARF/DWARFASTParserClang.h
blob: 0826423b0359f8af96c2f4007c351605b6d20896 (plain) (blame)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
//===-- DWARFASTParserClang.h -----------------------------------*- C++ -*-===//
//
//                     The LLVM Compiler Infrastructure
//
// This file is distributed under the University of Illinois Open Source
// License. See LICENSE.TXT for details.
//
//===----------------------------------------------------------------------===//

#ifndef SymbolFileDWARF_DWARFASTParserClang_h_
#define SymbolFileDWARF_DWARFASTParserClang_h_

// C Includes
// C++ Includes
// Other libraries and framework includes
#include "llvm/ADT/DenseMap.h"
#include "llvm/ADT/SmallPtrSet.h"
#include "llvm/ADT/SmallVector.h"
#include "clang/AST/CharUnits.h"

// Project includes
#include "DWARFASTParser.h"
#include "DWARFDefines.h"
#include "lldb/Core/ClangForward.h"
#include "lldb/Core/PluginInterface.h"
#include "lldb/Symbol/ClangASTContext.h"
#include "lldb/Symbol/ClangASTImporter.h"

class DWARFDebugInfoEntry;
class DWARFDIECollection;

class DWARFASTParserClang : public DWARFASTParser
{
public:
    DWARFASTParserClang (lldb_private::ClangASTContext &ast);

    ~DWARFASTParserClang() override;

    // DWARFASTParser interface.
    lldb::TypeSP
    ParseTypeFromDWARF (const lldb_private::SymbolContext& sc,
                        const DWARFDIE &die,
                        lldb_private::Log *log,
                        bool *type_is_new_ptr) override;


    lldb_private::Function *
    ParseFunctionFromDWARF (const lldb_private::SymbolContext& sc,
                            const DWARFDIE &die) override;

    bool
    CompleteTypeFromDWARF (const DWARFDIE &die,
                           lldb_private::Type *type,
                           lldb_private::CompilerType &compiler_type) override;

    lldb_private::CompilerDecl
    GetDeclForUIDFromDWARF (const DWARFDIE &die) override;

    std::vector<DWARFDIE>
    GetDIEForDeclContext (lldb_private::CompilerDeclContext decl_context) override;

    lldb_private::CompilerDeclContext
    GetDeclContextForUIDFromDWARF (const DWARFDIE &die) override;

    lldb_private::CompilerDeclContext
    GetDeclContextContainingUIDFromDWARF (const DWARFDIE &die) override;

    lldb_private::ClangASTImporter &
    GetClangASTImporter();

protected:
    class DelayedAddObjCClassProperty;
    typedef std::vector <DelayedAddObjCClassProperty> DelayedPropertyList;

    clang::BlockDecl *
    ResolveBlockDIE (const DWARFDIE &die);

    clang::NamespaceDecl *
    ResolveNamespaceDIE (const DWARFDIE &die);

    bool
    ParseTemplateDIE (const DWARFDIE &die,
                      lldb_private::ClangASTContext::TemplateParameterInfos &template_param_infos);
    bool
    ParseTemplateParameterInfos (const DWARFDIE &parent_die,
                                 lldb_private::ClangASTContext::TemplateParameterInfos &template_param_infos);

    bool
    ParseChildMembers(const lldb_private::SymbolContext &sc, const DWARFDIE &die,
                      lldb_private::CompilerType &class_compiler_type, const lldb::LanguageType class_language,
                      std::vector<clang::CXXBaseSpecifier *> &base_classes, std::vector<int> &member_accessibilities,
                      DWARFDIECollection &member_function_dies, DelayedPropertyList &delayed_properties,
                      lldb::AccessType &default_accessibility, bool &is_a_class,
                      lldb_private::ClangASTImporter::LayoutInfo &layout_info);

    size_t
    ParseChildParameters (const lldb_private::SymbolContext& sc,
                          clang::DeclContext *containing_decl_ctx,
                          const DWARFDIE &parent_die,
                          bool skip_artificial,
                          bool &is_static,
                          bool &is_variadic,
                          bool &has_template_params,
                          std::vector<lldb_private::CompilerType>& function_args,
                          std::vector<clang::ParmVarDecl*>& function_param_decls,
                          unsigned &type_quals);

    void
    ParseChildArrayInfo (const lldb_private::SymbolContext& sc,
                         const DWARFDIE &parent_die,
                         int64_t& first_index,
                         std::vector<uint64_t>& element_orders,
                         uint32_t& byte_stride,
                         uint32_t& bit_stride);

    size_t
    ParseChildEnumerators (const lldb_private::SymbolContext& sc,
                           lldb_private::CompilerType &compiler_type,
                           bool is_signed,
                           uint32_t enumerator_byte_size,
                           const DWARFDIE &parent_die);

    lldb_private::Type *
    GetTypeForDIE (const DWARFDIE &die);

    clang::Decl *
    GetClangDeclForDIE (const DWARFDIE &die);

    clang::DeclContext *
    GetClangDeclContextForDIE (const DWARFDIE &die);

    clang::DeclContext *
    GetClangDeclContextContainingDIE (const DWARFDIE &die,
                                      DWARFDIE *decl_ctx_die);

    bool
    CopyUniqueClassMethodTypes (const DWARFDIE &src_class_die,
                                const DWARFDIE &dst_class_die,
                                lldb_private::Type *class_type,
                                DWARFDIECollection &failures);

    clang::DeclContext *
    GetCachedClangDeclContextForDIE (const DWARFDIE &die);

    void
    LinkDeclContextToDIE (clang::DeclContext *decl_ctx,
                          const DWARFDIE &die);

    void
    LinkDeclToDIE (clang::Decl *decl, const DWARFDIE &die);

    lldb::TypeSP
    ParseTypeFromDWO (const DWARFDIE &die, lldb_private::Log *log);

    //----------------------------------------------------------------------
    // Return true if this type is a declaration to a type in an external
    // module.
    //----------------------------------------------------------------------
    lldb::ModuleSP
    GetModuleForType (const DWARFDIE &die);

    typedef llvm::SmallPtrSet<const DWARFDebugInfoEntry *, 4> DIEPointerSet;
    typedef llvm::DenseMap<const DWARFDebugInfoEntry *, clang::DeclContext *> DIEToDeclContextMap;
    //typedef llvm::DenseMap<const clang::DeclContext *, DIEPointerSet> DeclContextToDIEMap;
    typedef std::multimap<const clang::DeclContext *, const DWARFDIE> DeclContextToDIEMap;
    typedef llvm::DenseMap<const DWARFDebugInfoEntry *, clang::Decl *> DIEToDeclMap;
    typedef llvm::DenseMap<const clang::Decl *, DIEPointerSet> DeclToDIEMap;

    lldb_private::ClangASTContext &m_ast;
    DIEToDeclMap m_die_to_decl;
    DeclToDIEMap m_decl_to_die;
    DIEToDeclContextMap m_die_to_decl_ctx;
    DeclContextToDIEMap m_decl_ctx_to_die;
    std::unique_ptr<lldb_private::ClangASTImporter> m_clang_ast_importer_ap;
};

#endif // SymbolFileDWARF_DWARFASTParserClang_h_