1 //===-- SymbolFileDWARFDebugMap.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_SymbolFileDWARFDebugMap_h_
11 #define SymbolFileDWARF_SymbolFileDWARFDebugMap_h_
12 
13 
14 #include <vector>
15 #include <bitset>
16 
17 #include "clang/AST/CharUnits.h"
18 
19 #include "lldb/Symbol/SymbolFile.h"
20 
21 #include "UniqueDWARFASTType.h"
22 
23 class SymbolFileDWARF;
24 class DWARFCompileUnit;
25 class DWARFDebugInfoEntry;
26 class DWARFDeclContext;
27 
28 class SymbolFileDWARFDebugMap : public lldb_private::SymbolFile
29 {
30 public:
31     //------------------------------------------------------------------
32     // Static Functions
33     //------------------------------------------------------------------
34     static void
35     Initialize();
36 
37     static void
38     Terminate();
39 
40     static const char *
41     GetPluginNameStatic();
42 
43     static const char *
44     GetPluginDescriptionStatic();
45 
46     static lldb_private::SymbolFile *
47     CreateInstance (lldb_private::ObjectFile* obj_file);
48 
49     //------------------------------------------------------------------
50     // Constructors and Destructors
51     //------------------------------------------------------------------
52                             SymbolFileDWARFDebugMap (lldb_private::ObjectFile* ofile);
53     virtual               ~ SymbolFileDWARFDebugMap ();
54 
55     virtual uint32_t        CalculateAbilities ();
56 
57     virtual void            InitializeObject();
58 
59     //------------------------------------------------------------------
60     // Compile Unit function calls
61     //------------------------------------------------------------------
62     virtual uint32_t        GetNumCompileUnits ();
63     virtual lldb::CompUnitSP ParseCompileUnitAtIndex (uint32_t index);
64 
65     virtual size_t          ParseCompileUnitFunctions (const lldb_private::SymbolContext& sc);
66     virtual bool            ParseCompileUnitLineTable (const lldb_private::SymbolContext& sc);
67     virtual bool            ParseCompileUnitSupportFiles (const lldb_private::SymbolContext& sc, lldb_private::FileSpecList &support_files);
68     virtual size_t          ParseFunctionBlocks (const lldb_private::SymbolContext& sc);
69     virtual size_t          ParseTypes (const lldb_private::SymbolContext& sc);
70     virtual size_t          ParseVariablesForContext (const lldb_private::SymbolContext& sc);
71 
72     virtual lldb_private::Type* ResolveTypeUID (lldb::user_id_t type_uid);
73     virtual clang::DeclContext* GetClangDeclContextContainingTypeUID (lldb::user_id_t type_uid);
74     virtual clang::DeclContext* GetClangDeclContextForTypeUID (const lldb_private::SymbolContext &sc, lldb::user_id_t type_uid);
75     virtual lldb::clang_type_t  ResolveClangOpaqueTypeDefinition (lldb::clang_type_t clang_Type);
76     virtual uint32_t        ResolveSymbolContext (const lldb_private::Address& so_addr, uint32_t resolve_scope, lldb_private::SymbolContext& sc);
77     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);
78     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);
79     virtual uint32_t        FindGlobalVariables (const lldb_private::RegularExpression& regex, bool append, uint32_t max_matches, lldb_private::VariableList& variables);
80     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);
81     virtual uint32_t        FindFunctions (const lldb_private::RegularExpression& regex, bool include_inlines, bool append, lldb_private::SymbolContextList& sc_list);
82     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);
83     virtual lldb_private::ClangNamespaceDecl
84             FindNamespace (const lldb_private::SymbolContext& sc,
85                            const lldb_private::ConstString &name,
86                            const lldb_private::ClangNamespaceDecl *parent_namespace_decl);
87 
88 
89     //------------------------------------------------------------------
90     // ClangASTContext callbacks for external source lookups.
91     //------------------------------------------------------------------
92     static void
93     CompleteTagDecl (void *baton, clang::TagDecl *);
94 
95     static void
96     CompleteObjCInterfaceDecl (void *baton, clang::ObjCInterfaceDecl *);
97 
98     static bool
99     LayoutRecordType (void *baton,
100                       const clang::RecordDecl *record_decl,
101                       uint64_t &size,
102                       uint64_t &alignment,
103                       llvm::DenseMap <const clang::FieldDecl *, uint64_t> &field_offsets,
104                       llvm::DenseMap <const clang::CXXRecordDecl *, clang::CharUnits> &base_offsets,
105                       llvm::DenseMap <const clang::CXXRecordDecl *, clang::CharUnits> &vbase_offsets);
106 
107 
108     //------------------------------------------------------------------
109     // PluginInterface protocol
110     //------------------------------------------------------------------
111     virtual const char *
112     GetPluginName();
113 
114     virtual const char *
115     GetShortPluginName();
116 
117     virtual uint32_t
118     GetPluginVersion();
119 
120 protected:
121     enum
122     {
123         kHaveInitializedOSOs = (1 << 0),
124         kNumFlags
125     };
126 
127     friend class SymbolFileDWARF;
128 
129     //------------------------------------------------------------------
130     // Class specific types
131     //------------------------------------------------------------------
132     struct CompileUnitInfo
133     {
134         lldb_private::FileSpec so_file;
135         lldb_private::Symbol *so_symbol;
136         lldb_private::Symbol *oso_symbol;
137         lldb_private::Symbol *last_symbol;
138         uint32_t first_symbol_index;
139         uint32_t last_symbol_index;
140         lldb::ModuleSP oso_module_sp;
141         lldb::CompUnitSP oso_compile_unit_sp;
142         lldb_private::SymbolVendor *oso_symbol_vendor;
143         std::vector<uint32_t> function_indexes;
144         std::vector<uint32_t> static_indexes;
145         STD_SHARED_PTR(lldb_private::SectionList) debug_map_sections_sp;
146         bool symbol_file_supported;
147 
148         CompileUnitInfo() :
149             so_file (),
150             so_symbol (NULL),
151             oso_symbol (NULL),
152             last_symbol (NULL),
153             first_symbol_index (UINT32_MAX),
154             last_symbol_index (UINT32_MAX),
155             oso_module_sp (),
156             oso_compile_unit_sp (),
157             oso_symbol_vendor (NULL),
158             function_indexes (),
159             static_indexes (),
160             debug_map_sections_sp (),
161             symbol_file_supported (true)
162         {
163         }
164     };
165 
166     //------------------------------------------------------------------
167     // Protected Member Functions
168     //------------------------------------------------------------------
169     void
170     InitOSO ();
171 
172     static uint32_t
173     GetOSOIndexFromUserID (lldb::user_id_t uid)
174     {
175         return (uint32_t)((uid >> 32ull) - 1ull);
176     }
177     bool
178     GetFileSpecForSO (uint32_t oso_idx, lldb_private::FileSpec &file_spec);
179 
180     CompileUnitInfo *
181     GetCompUnitInfo (const lldb_private::SymbolContext& sc);
182 
183     lldb_private::Module *
184     GetModuleByCompUnitInfo (CompileUnitInfo *comp_unit_info);
185 
186     lldb_private::Module *
187     GetModuleByOSOIndex (uint32_t oso_idx);
188 
189     lldb_private::ObjectFile *
190     GetObjectFileByCompUnitInfo (CompileUnitInfo *comp_unit_info);
191 
192     lldb_private::ObjectFile *
193     GetObjectFileByOSOIndex (uint32_t oso_idx);
194 
195     uint32_t
196     GetCompUnitInfoIndex (const CompileUnitInfo *comp_unit_info);
197 
198     SymbolFileDWARF *
199     GetSymbolFile (const lldb_private::SymbolContext& sc);
200 
201     SymbolFileDWARF *
202     GetSymbolFileByCompUnitInfo (CompileUnitInfo *comp_unit_info);
203 
204     SymbolFileDWARF *
205     GetSymbolFileByOSOIndex (uint32_t oso_idx);
206 
207     CompileUnitInfo *
208     GetCompileUnitInfoForSymbolWithIndex (uint32_t symbol_idx, uint32_t *oso_idx_ptr);
209 
210     CompileUnitInfo *
211     GetCompileUnitInfoForSymbolWithID (lldb::user_id_t symbol_id, uint32_t *oso_idx_ptr);
212 
213     static int
214     SymbolContainsSymbolWithIndex (uint32_t *symbol_idx_ptr, const CompileUnitInfo *comp_unit_info);
215 
216     static int
217     SymbolContainsSymbolWithID (lldb::user_id_t *symbol_idx_ptr, const CompileUnitInfo *comp_unit_info);
218 
219     uint32_t
220     PrivateFindGlobalVariables (const lldb_private::ConstString &name,
221                                 const lldb_private::ClangNamespaceDecl *namespace_decl,
222                                 const std::vector<uint32_t> &name_symbol_indexes,
223                                 uint32_t max_matches,
224                                 lldb_private::VariableList& variables);
225 
226 
227     void
228     SetCompileUnit (SymbolFileDWARF *oso_dwarf, const lldb::CompUnitSP &cu_sp);
229 
230     lldb::TypeSP
231     FindDefinitionTypeForDWARFDeclContext (const DWARFDeclContext &die_decl_ctx);
232 
233     bool
234     Supports_DW_AT_APPLE_objc_complete_type (SymbolFileDWARF *skip_dwarf_oso);
235 
236     lldb::TypeSP
237     FindCompleteObjCDefinitionTypeForDIE (const DWARFDebugInfoEntry *die,
238                                           const lldb_private::ConstString &type_name,
239                                           bool must_be_implementation);
240 
241 
242     UniqueDWARFASTTypeMap &
243     GetUniqueDWARFASTTypeMap ()
244     {
245         return m_unique_ast_type_map;
246     }
247     //------------------------------------------------------------------
248     // Member Variables
249     //------------------------------------------------------------------
250     std::bitset<kNumFlags> m_flags;
251     std::vector<CompileUnitInfo> m_compile_unit_infos;
252     std::vector<uint32_t> m_func_indexes;   // Sorted by address
253     std::vector<uint32_t> m_glob_indexes;
254     UniqueDWARFASTTypeMap m_unique_ast_type_map;
255     lldb_private::LazyBool m_supports_DW_AT_APPLE_objc_complete_type;
256 };
257 
258 #endif // #ifndef SymbolFileDWARF_SymbolFileDWARFDebugMap_h_
259