blob: d7b69e0b23e763a8a319c97785dc33fd7db4bed5 [file] [log] [blame]
Chris Lattner30fdc8d2010-06-08 16:52:24 +00001//===-- 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
Greg Claytona76dd622011-09-12 04:20:38 +000010#ifndef SymbolFileDWARF_SymbolFileDWARFDebugMap_h_
11#define SymbolFileDWARF_SymbolFileDWARFDebugMap_h_
Chris Lattner30fdc8d2010-06-08 16:52:24 +000012
13
14#include <vector>
15#include <bitset>
Greg Claytoncaab74e2012-01-28 00:48:57 +000016
17#include "clang/AST/CharUnits.h"
18
Chris Lattner30fdc8d2010-06-08 16:52:24 +000019#include "lldb/Symbol/SymbolFile.h"
20
Greg Claytone576ab22011-02-15 00:19:15 +000021#include "UniqueDWARFASTType.h"
22
Chris Lattner30fdc8d2010-06-08 16:52:24 +000023class SymbolFileDWARF;
Greg Clayton2ccf8cf2010-11-07 21:02:03 +000024class DWARFCompileUnit;
25class DWARFDebugInfoEntry;
Greg Claytona8022fa2012-04-24 21:22:41 +000026class DWARFDeclContext;
Chris Lattner30fdc8d2010-06-08 16:52:24 +000027
28class SymbolFileDWARFDebugMap : public lldb_private::SymbolFile
29{
30public:
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
Sean Callananbfaf54d2011-12-03 04:38:43 +000055 virtual uint32_t CalculateAbilities ();
Chris Lattner30fdc8d2010-06-08 16:52:24 +000056
Greg Clayton6beaaa62011-01-17 03:46:26 +000057 virtual void InitializeObject();
58
Chris Lattner30fdc8d2010-06-08 16:52:24 +000059 //------------------------------------------------------------------
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
Greg Clayton1be10fc2010-09-29 01:12:09 +000072 virtual lldb_private::Type* ResolveTypeUID (lldb::user_id_t type_uid);
Greg Clayton81c22f62011-10-19 18:09:39 +000073 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);
Greg Clayton1be10fc2010-09-29 01:12:09 +000075 virtual lldb::clang_type_t ResolveClangOpaqueTypeDefinition (lldb::clang_type_t clang_Type);
Chris Lattner30fdc8d2010-06-08 16:52:24 +000076 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);
Sean Callanan213fdb82011-10-13 01:49:10 +000078 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);
Chris Lattner30fdc8d2010-06-08 16:52:24 +000079 virtual uint32_t FindGlobalVariables (const lldb_private::RegularExpression& regex, bool append, uint32_t max_matches, lldb_private::VariableList& variables);
Sean Callanan9df05fb2012-02-10 22:52:19 +000080 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);
Sean Callanan213fdb82011-10-13 01:49:10 +000082 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);
Greg Clayton526e5af2010-11-13 03:52:47 +000083 virtual lldb_private::ClangNamespaceDecl
Greg Clayton96d7d742010-11-10 23:42:09 +000084 FindNamespace (const lldb_private::SymbolContext& sc,
Sean Callanan213fdb82011-10-13 01:49:10 +000085 const lldb_private::ConstString &name,
86 const lldb_private::ClangNamespaceDecl *parent_namespace_decl);
Chris Lattner30fdc8d2010-06-08 16:52:24 +000087
Greg Clayton6beaaa62011-01-17 03:46:26 +000088
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 *);
Greg Claytoncaab74e2012-01-28 00:48:57 +000097
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
Greg Clayton6beaaa62011-01-17 03:46:26 +0000107
Chris Lattner30fdc8d2010-06-08 16:52:24 +0000108 //------------------------------------------------------------------
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
Chris Lattner30fdc8d2010-06-08 16:52:24 +0000120protected:
121 enum
122 {
123 kHaveInitializedOSOs = (1 << 0),
124 kNumFlags
125 };
126
Greg Clayton450e3f32010-10-12 02:24:53 +0000127 friend class SymbolFileDWARF;
128
Chris Lattner30fdc8d2010-06-08 16:52:24 +0000129 //------------------------------------------------------------------
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;
Greg Claytonbcf2cfb2010-09-11 03:13:28 +0000137 lldb_private::Symbol *last_symbol;
138 uint32_t first_symbol_index;
139 uint32_t last_symbol_index;
Chris Lattner30fdc8d2010-06-08 16:52:24 +0000140 lldb::ModuleSP oso_module_sp;
141 lldb::CompUnitSP oso_compile_unit_sp;
142 lldb_private::SymbolVendor *oso_symbol_vendor;
Chris Lattner30fdc8d2010-06-08 16:52:24 +0000143 std::vector<uint32_t> function_indexes;
144 std::vector<uint32_t> static_indexes;
Greg Claytond64afba2012-03-14 03:07:05 +0000145 STD_SHARED_PTR(lldb_private::SectionList) debug_map_sections_sp;
Sean Callanan21f395f2012-03-24 00:43:18 +0000146 bool symbol_file_supported;
Chris Lattner30fdc8d2010-06-08 16:52:24 +0000147
148 CompileUnitInfo() :
Greg Claytonbcf2cfb2010-09-11 03:13:28 +0000149 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 (),
Sean Callanan21f395f2012-03-24 00:43:18 +0000160 debug_map_sections_sp (),
161 symbol_file_supported (true)
Chris Lattner30fdc8d2010-06-08 16:52:24 +0000162 {
163 }
164 };
165
166 //------------------------------------------------------------------
167 // Protected Member Functions
168 //------------------------------------------------------------------
169 void
170 InitOSO ();
171
Greg Clayton81c22f62011-10-19 18:09:39 +0000172 static uint32_t
173 GetOSOIndexFromUserID (lldb::user_id_t uid)
174 {
175 return (uint32_t)((uid >> 32ull) - 1ull);
176 }
Chris Lattner30fdc8d2010-06-08 16:52:24 +0000177 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
Greg Clayton81c22f62011-10-19 18:09:39 +0000195 uint32_t
196 GetCompUnitInfoIndex (const CompileUnitInfo *comp_unit_info);
197
Chris Lattner30fdc8d2010-06-08 16:52:24 +0000198 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
Greg Claytonbcf2cfb2010-09-11 03:13:28 +0000207 CompileUnitInfo *
Chris Lattner30fdc8d2010-06-08 16:52:24 +0000208 GetCompileUnitInfoForSymbolWithIndex (uint32_t symbol_idx, uint32_t *oso_idx_ptr);
Greg Claytonbcf2cfb2010-09-11 03:13:28 +0000209
210 CompileUnitInfo *
211 GetCompileUnitInfoForSymbolWithID (lldb::user_id_t symbol_id, uint32_t *oso_idx_ptr);
Chris Lattner30fdc8d2010-06-08 16:52:24 +0000212
213 static int
Greg Claytonbcf2cfb2010-09-11 03:13:28 +0000214 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);
Chris Lattner30fdc8d2010-06-08 16:52:24 +0000218
219 uint32_t
220 PrivateFindGlobalVariables (const lldb_private::ConstString &name,
Sean Callanan213fdb82011-10-13 01:49:10 +0000221 const lldb_private::ClangNamespaceDecl *namespace_decl,
Chris Lattner30fdc8d2010-06-08 16:52:24 +0000222 const std::vector<uint32_t> &name_symbol_indexes,
223 uint32_t max_matches,
224 lldb_private::VariableList& variables);
225
Greg Clayton450e3f32010-10-12 02:24:53 +0000226
227 void
228 SetCompileUnit (SymbolFileDWARF *oso_dwarf, const lldb::CompUnitSP &cu_sp);
229
Greg Clayton2ccf8cf2010-11-07 21:02:03 +0000230 lldb::TypeSP
Greg Claytona8022fa2012-04-24 21:22:41 +0000231 FindDefinitionTypeForDWARFDeclContext (const DWARFDeclContext &die_decl_ctx);
Greg Clayton2ccf8cf2010-11-07 21:02:03 +0000232
Greg Claytonc7f03b62012-01-12 04:33:28 +0000233 bool
234 Supports_DW_AT_APPLE_objc_complete_type (SymbolFileDWARF *skip_dwarf_oso);
235
Greg Clayton901c5ca2011-12-03 04:40:03 +0000236 lldb::TypeSP
Greg Claytonc7f03b62012-01-12 04:33:28 +0000237 FindCompleteObjCDefinitionTypeForDIE (const DWARFDebugInfoEntry *die,
238 const lldb_private::ConstString &type_name,
239 bool must_be_implementation);
Greg Clayton901c5ca2011-12-03 04:40:03 +0000240
241
Greg Claytone576ab22011-02-15 00:19:15 +0000242 UniqueDWARFASTTypeMap &
243 GetUniqueDWARFASTTypeMap ()
244 {
245 return m_unique_ast_type_map;
246 }
Chris Lattner30fdc8d2010-06-08 16:52:24 +0000247 //------------------------------------------------------------------
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;
Greg Claytone576ab22011-02-15 00:19:15 +0000254 UniqueDWARFASTTypeMap m_unique_ast_type_map;
Greg Claytonc7f03b62012-01-12 04:33:28 +0000255 lldb_private::LazyBool m_supports_DW_AT_APPLE_objc_complete_type;
Chris Lattner30fdc8d2010-06-08 16:52:24 +0000256};
257
Greg Claytona76dd622011-09-12 04:20:38 +0000258#endif // #ifndef SymbolFileDWARF_SymbolFileDWARFDebugMap_h_