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