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