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 SHARED_PTR(lldb_private::SectionList) debug_map_sections_sp; 145 146 CompileUnitInfo() : 147 so_file (), 148 so_symbol (NULL), 149 oso_symbol (NULL), 150 last_symbol (NULL), 151 first_symbol_index (UINT32_MAX), 152 last_symbol_index (UINT32_MAX), 153 oso_module_sp (), 154 oso_compile_unit_sp (), 155 oso_symbol_vendor (NULL), 156 function_indexes (), 157 static_indexes (), 158 debug_map_sections_sp () 159 { 160 } 161 }; 162 163 //------------------------------------------------------------------ 164 // Protected Member Functions 165 //------------------------------------------------------------------ 166 void 167 InitOSO (); 168 169 static uint32_t 170 GetOSOIndexFromUserID (lldb::user_id_t uid) 171 { 172 return (uint32_t)((uid >> 32ull) - 1ull); 173 } 174 bool 175 GetFileSpecForSO (uint32_t oso_idx, lldb_private::FileSpec &file_spec); 176 177 CompileUnitInfo * 178 GetCompUnitInfo (const lldb_private::SymbolContext& sc); 179 180 lldb_private::Module * 181 GetModuleByCompUnitInfo (CompileUnitInfo *comp_unit_info); 182 183 lldb_private::Module * 184 GetModuleByOSOIndex (uint32_t oso_idx); 185 186 lldb_private::ObjectFile * 187 GetObjectFileByCompUnitInfo (CompileUnitInfo *comp_unit_info); 188 189 lldb_private::ObjectFile * 190 GetObjectFileByOSOIndex (uint32_t oso_idx); 191 192 uint32_t 193 GetCompUnitInfoIndex (const CompileUnitInfo *comp_unit_info); 194 195 SymbolFileDWARF * 196 GetSymbolFile (const lldb_private::SymbolContext& sc); 197 198 SymbolFileDWARF * 199 GetSymbolFileByCompUnitInfo (CompileUnitInfo *comp_unit_info); 200 201 SymbolFileDWARF * 202 GetSymbolFileByOSOIndex (uint32_t oso_idx); 203 204 CompileUnitInfo * 205 GetCompileUnitInfoForSymbolWithIndex (uint32_t symbol_idx, uint32_t *oso_idx_ptr); 206 207 CompileUnitInfo * 208 GetCompileUnitInfoForSymbolWithID (lldb::user_id_t symbol_id, uint32_t *oso_idx_ptr); 209 210 static int 211 SymbolContainsSymbolWithIndex (uint32_t *symbol_idx_ptr, const CompileUnitInfo *comp_unit_info); 212 213 static int 214 SymbolContainsSymbolWithID (lldb::user_id_t *symbol_idx_ptr, const CompileUnitInfo *comp_unit_info); 215 216 uint32_t 217 PrivateFindGlobalVariables (const lldb_private::ConstString &name, 218 const lldb_private::ClangNamespaceDecl *namespace_decl, 219 const std::vector<uint32_t> &name_symbol_indexes, 220 uint32_t max_matches, 221 lldb_private::VariableList& variables); 222 223 224 void 225 SetCompileUnit (SymbolFileDWARF *oso_dwarf, const lldb::CompUnitSP &cu_sp); 226 227 lldb::TypeSP 228 FindDefinitionTypeForDIE (DWARFCompileUnit* cu, 229 const DWARFDebugInfoEntry *die, 230 const lldb_private::ConstString &type_name); 231 232 bool 233 Supports_DW_AT_APPLE_objc_complete_type (SymbolFileDWARF *skip_dwarf_oso); 234 235 lldb::TypeSP 236 FindCompleteObjCDefinitionTypeForDIE (const DWARFDebugInfoEntry *die, 237 const lldb_private::ConstString &type_name, 238 bool must_be_implementation); 239 240 241 UniqueDWARFASTTypeMap & 242 GetUniqueDWARFASTTypeMap () 243 { 244 return m_unique_ast_type_map; 245 } 246 //------------------------------------------------------------------ 247 // Member Variables 248 //------------------------------------------------------------------ 249 std::bitset<kNumFlags> m_flags; 250 std::vector<CompileUnitInfo> m_compile_unit_infos; 251 std::vector<uint32_t> m_func_indexes; // Sorted by address 252 std::vector<uint32_t> m_glob_indexes; 253 UniqueDWARFASTTypeMap m_unique_ast_type_map; 254 lldb_private::LazyBool m_supports_DW_AT_APPLE_objc_complete_type; 255 }; 256 257 #endif // #ifndef SymbolFileDWARF_SymbolFileDWARFDebugMap_h_ 258