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 class DWARFDeclContext; 27 28 class SymbolFileDWARFDebugMap : public lldb_private::SymbolFile 29 { 30 public: 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 55 virtual uint32_t CalculateAbilities (); 56 57 virtual void InitializeObject(); 58 59 //------------------------------------------------------------------ 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 72 virtual lldb_private::Type* ResolveTypeUID (lldb::user_id_t type_uid); 73 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); 75 virtual lldb::clang_type_t ResolveClangOpaqueTypeDefinition (lldb::clang_type_t clang_Type); 76 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); 78 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); 79 virtual uint32_t FindGlobalVariables (const lldb_private::RegularExpression& regex, bool append, uint32_t max_matches, lldb_private::VariableList& variables); 80 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); 82 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); 83 virtual lldb_private::ClangNamespaceDecl 84 FindNamespace (const lldb_private::SymbolContext& sc, 85 const lldb_private::ConstString &name, 86 const lldb_private::ClangNamespaceDecl *parent_namespace_decl); 87 88 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 *); 97 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 107 108 //------------------------------------------------------------------ 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 120 protected: 121 enum 122 { 123 kHaveInitializedOSOs = (1 << 0), 124 kNumFlags 125 }; 126 127 friend class SymbolFileDWARF; 128 129 //------------------------------------------------------------------ 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; 137 lldb_private::Symbol *last_symbol; 138 uint32_t first_symbol_index; 139 uint32_t last_symbol_index; 140 lldb::ModuleSP oso_module_sp; 141 lldb::CompUnitSP oso_compile_unit_sp; 142 lldb_private::SymbolVendor *oso_symbol_vendor; 143 std::vector<uint32_t> function_indexes; 144 std::vector<uint32_t> static_indexes; 145 STD_SHARED_PTR(lldb_private::SectionList) debug_map_sections_sp; 146 bool symbol_file_supported; 147 148 CompileUnitInfo() : 149 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 (), 160 debug_map_sections_sp (), 161 symbol_file_supported (true) 162 { 163 } 164 }; 165 166 //------------------------------------------------------------------ 167 // Protected Member Functions 168 //------------------------------------------------------------------ 169 void 170 InitOSO (); 171 172 static uint32_t 173 GetOSOIndexFromUserID (lldb::user_id_t uid) 174 { 175 return (uint32_t)((uid >> 32ull) - 1ull); 176 } 177 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 195 uint32_t 196 GetCompUnitInfoIndex (const CompileUnitInfo *comp_unit_info); 197 198 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 207 CompileUnitInfo * 208 GetCompileUnitInfoForSymbolWithIndex (uint32_t symbol_idx, uint32_t *oso_idx_ptr); 209 210 CompileUnitInfo * 211 GetCompileUnitInfoForSymbolWithID (lldb::user_id_t symbol_id, uint32_t *oso_idx_ptr); 212 213 static int 214 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); 218 219 uint32_t 220 PrivateFindGlobalVariables (const lldb_private::ConstString &name, 221 const lldb_private::ClangNamespaceDecl *namespace_decl, 222 const std::vector<uint32_t> &name_symbol_indexes, 223 uint32_t max_matches, 224 lldb_private::VariableList& variables); 225 226 227 void 228 SetCompileUnit (SymbolFileDWARF *oso_dwarf, const lldb::CompUnitSP &cu_sp); 229 230 lldb::TypeSP 231 FindDefinitionTypeForDWARFDeclContext (const DWARFDeclContext &die_decl_ctx); 232 233 bool 234 Supports_DW_AT_APPLE_objc_complete_type (SymbolFileDWARF *skip_dwarf_oso); 235 236 lldb::TypeSP 237 FindCompleteObjCDefinitionTypeForDIE (const DWARFDebugInfoEntry *die, 238 const lldb_private::ConstString &type_name, 239 bool must_be_implementation); 240 241 242 UniqueDWARFASTTypeMap & 243 GetUniqueDWARFASTTypeMap () 244 { 245 return m_unique_ast_type_map; 246 } 247 //------------------------------------------------------------------ 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; 254 UniqueDWARFASTTypeMap m_unique_ast_type_map; 255 lldb_private::LazyBool m_supports_DW_AT_APPLE_objc_complete_type; 256 }; 257 258 #endif // #ifndef SymbolFileDWARF_SymbolFileDWARFDebugMap_h_ 259