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