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