SymbolFileDWARF.h revision 296417
1//===-- SymbolFileDWARF.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_SymbolFileDWARF_h_ 11#define SymbolFileDWARF_SymbolFileDWARF_h_ 12 13// C Includes 14// C++ Includes 15#include <list> 16#include <map> 17#include <mutex> 18#include <set> 19#include <unordered_map> 20#include <vector> 21 22// Other libraries and framework includes 23#include "llvm/ADT/DenseMap.h" 24 25#include "lldb/lldb-private.h" 26#include "lldb/Core/ConstString.h" 27#include "lldb/Core/dwarf.h" 28#include "lldb/Core/Flags.h" 29#include "lldb/Core/RangeMap.h" 30#include "lldb/Core/UniqueCStringMap.h" 31#include "lldb/Expression/DWARFExpression.h" 32#include "lldb/Symbol/DebugMacros.h" 33#include "lldb/Symbol/SymbolFile.h" 34#include "lldb/Symbol/SymbolContext.h" 35 36// Project includes 37#include "DWARFDefines.h" 38#include "DWARFDataExtractor.h" 39#include "HashedNameToDIE.h" 40#include "NameToDIE.h" 41#include "UniqueDWARFASTType.h" 42 43//---------------------------------------------------------------------- 44// Forward Declarations for this DWARF plugin 45//---------------------------------------------------------------------- 46class DebugMapModule; 47class DWARFAbbreviationDeclaration; 48class DWARFAbbreviationDeclarationSet; 49class DWARFileUnit; 50class DWARFDebugAbbrev; 51class DWARFDebugAranges; 52class DWARFDebugInfo; 53class DWARFDebugInfoEntry; 54class DWARFDebugLine; 55class DWARFDebugPubnames; 56class DWARFDebugRanges; 57class DWARFDeclContext; 58class DWARFDIECollection; 59class DWARFFormValue; 60class SymbolFileDWARFDebugMap; 61 62#define DIE_IS_BEING_PARSED ((lldb_private::Type*)1) 63 64class SymbolFileDWARF : public lldb_private::SymbolFile, public lldb_private::UserID 65{ 66public: 67 friend class SymbolFileDWARFDebugMap; 68 friend class SymbolFileDWARFDwo; 69 friend class DebugMapModule; 70 friend class DWARFCompileUnit; 71 friend class DWARFASTParserClang; 72 friend class DWARFASTParserGo; 73 74 //------------------------------------------------------------------ 75 // Static Functions 76 //------------------------------------------------------------------ 77 static void 78 Initialize(); 79 80 static void 81 Terminate(); 82 83 static void 84 DebuggerInitialize(lldb_private::Debugger &debugger); 85 86 static lldb_private::ConstString 87 GetPluginNameStatic(); 88 89 static const char * 90 GetPluginDescriptionStatic(); 91 92 static lldb_private::SymbolFile* 93 CreateInstance (lldb_private::ObjectFile* obj_file); 94 95 //------------------------------------------------------------------ 96 // Constructors and Destructors 97 //------------------------------------------------------------------ 98 99 SymbolFileDWARF(lldb_private::ObjectFile* ofile); 100 101 ~SymbolFileDWARF() override; 102 103 uint32_t 104 CalculateAbilities () override; 105 106 void 107 InitializeObject() override; 108 109 //------------------------------------------------------------------ 110 // Compile Unit function calls 111 //------------------------------------------------------------------ 112 113 uint32_t 114 GetNumCompileUnits() override; 115 116 lldb::CompUnitSP 117 ParseCompileUnitAtIndex(uint32_t index) override; 118 119 lldb::LanguageType 120 ParseCompileUnitLanguage (const lldb_private::SymbolContext& sc) override; 121 122 size_t 123 ParseCompileUnitFunctions (const lldb_private::SymbolContext& sc) override; 124 125 bool 126 ParseCompileUnitLineTable (const lldb_private::SymbolContext& sc) override; 127 128 bool 129 ParseCompileUnitDebugMacros (const lldb_private::SymbolContext& sc) override; 130 131 bool 132 ParseCompileUnitSupportFiles (const lldb_private::SymbolContext& sc, 133 lldb_private::FileSpecList& support_files) override; 134 135 bool 136 ParseImportedModules (const lldb_private::SymbolContext &sc, 137 std::vector<lldb_private::ConstString> &imported_modules) override; 138 139 size_t 140 ParseFunctionBlocks (const lldb_private::SymbolContext& sc) override; 141 142 size_t 143 ParseTypes (const lldb_private::SymbolContext& sc) override; 144 145 size_t 146 ParseVariablesForContext (const lldb_private::SymbolContext& sc) override; 147 148 lldb_private::Type * 149 ResolveTypeUID(lldb::user_id_t type_uid) override; 150 151 bool 152 CompleteType (lldb_private::CompilerType& compiler_type) override; 153 154 lldb_private::Type * 155 ResolveType (const DWARFDIE &die, 156 bool assert_not_being_parsed = true, 157 bool resolve_function_context = false); 158 159 lldb_private::CompilerDecl 160 GetDeclForUID (lldb::user_id_t uid) override; 161 162 lldb_private::CompilerDeclContext 163 GetDeclContextForUID (lldb::user_id_t uid) override; 164 165 lldb_private::CompilerDeclContext 166 GetDeclContextContainingUID (lldb::user_id_t uid) override; 167 168 void 169 ParseDeclsForContext (lldb_private::CompilerDeclContext decl_ctx) override; 170 171 172 uint32_t 173 ResolveSymbolContext (const lldb_private::Address& so_addr, 174 uint32_t resolve_scope, 175 lldb_private::SymbolContext& sc) override; 176 177 uint32_t 178 ResolveSymbolContext (const lldb_private::FileSpec& file_spec, 179 uint32_t line, 180 bool check_inlines, 181 uint32_t resolve_scope, 182 lldb_private::SymbolContextList& sc_list) override; 183 184 uint32_t 185 FindGlobalVariables (const lldb_private::ConstString &name, 186 const lldb_private::CompilerDeclContext *parent_decl_ctx, 187 bool append, 188 uint32_t max_matches, 189 lldb_private::VariableList& variables) override; 190 191 uint32_t 192 FindGlobalVariables (const lldb_private::RegularExpression& regex, 193 bool append, 194 uint32_t max_matches, 195 lldb_private::VariableList& variables) override; 196 197 uint32_t 198 FindFunctions (const lldb_private::ConstString &name, 199 const lldb_private::CompilerDeclContext *parent_decl_ctx, 200 uint32_t name_type_mask, 201 bool include_inlines, 202 bool append, 203 lldb_private::SymbolContextList& sc_list) override; 204 205 uint32_t 206 FindFunctions (const lldb_private::RegularExpression& regex, 207 bool include_inlines, 208 bool append, 209 lldb_private::SymbolContextList& sc_list) override; 210 211 void 212 GetMangledNamesForFunction (const std::string &scope_qualified_name, 213 std::vector<lldb_private::ConstString> &mangled_names) override; 214 215 uint32_t 216 FindTypes (const lldb_private::SymbolContext& sc, 217 const lldb_private::ConstString &name, 218 const lldb_private::CompilerDeclContext *parent_decl_ctx, 219 bool append, 220 uint32_t max_matches, 221 lldb_private::TypeMap& types) override; 222 223 size_t 224 FindTypes (const std::vector<lldb_private::CompilerContext> &context, 225 bool append, 226 lldb_private::TypeMap& types) override; 227 228 lldb_private::TypeList * 229 GetTypeList () override; 230 231 size_t 232 GetTypes (lldb_private::SymbolContextScope *sc_scope, 233 uint32_t type_mask, 234 lldb_private::TypeList &type_list) override; 235 236 lldb_private::TypeSystem * 237 GetTypeSystemForLanguage (lldb::LanguageType language) override; 238 239 lldb_private::CompilerDeclContext 240 FindNamespace (const lldb_private::SymbolContext& sc, 241 const lldb_private::ConstString &name, 242 const lldb_private::CompilerDeclContext *parent_decl_ctx) override; 243 244 245 //------------------------------------------------------------------ 246 // PluginInterface protocol 247 //------------------------------------------------------------------ 248 lldb_private::ConstString 249 GetPluginName() override; 250 251 uint32_t 252 GetPluginVersion() override; 253 254 const lldb_private::DWARFDataExtractor& get_debug_abbrev_data (); 255 const lldb_private::DWARFDataExtractor& get_debug_addr_data (); 256 const lldb_private::DWARFDataExtractor& get_debug_aranges_data (); 257 const lldb_private::DWARFDataExtractor& get_debug_frame_data (); 258 const lldb_private::DWARFDataExtractor& get_debug_info_data (); 259 const lldb_private::DWARFDataExtractor& get_debug_line_data (); 260 const lldb_private::DWARFDataExtractor& get_debug_macro_data (); 261 const lldb_private::DWARFDataExtractor& get_debug_loc_data (); 262 const lldb_private::DWARFDataExtractor& get_debug_ranges_data (); 263 const lldb_private::DWARFDataExtractor& get_debug_str_data (); 264 const lldb_private::DWARFDataExtractor& get_debug_str_offsets_data (); 265 const lldb_private::DWARFDataExtractor& get_apple_names_data (); 266 const lldb_private::DWARFDataExtractor& get_apple_types_data (); 267 const lldb_private::DWARFDataExtractor& get_apple_namespaces_data (); 268 const lldb_private::DWARFDataExtractor& get_apple_objc_data (); 269 270 271 DWARFDebugAbbrev* 272 DebugAbbrev(); 273 274 const DWARFDebugAbbrev* 275 DebugAbbrev() const; 276 277 DWARFDebugInfo* 278 DebugInfo(); 279 280 const DWARFDebugInfo* 281 DebugInfo() const; 282 283 DWARFDebugRanges* 284 DebugRanges(); 285 286 const DWARFDebugRanges* 287 DebugRanges() const; 288 289 static bool 290 SupportedVersion(uint16_t version); 291 292 DWARFDIE 293 GetDeclContextDIEContainingDIE (const DWARFDIE &die); 294 295 bool 296 HasForwardDeclForClangType (const lldb_private::CompilerType &compiler_type); 297 298 lldb_private::CompileUnit* 299 GetCompUnitForDWARFCompUnit(DWARFCompileUnit* dwarf_cu, 300 uint32_t cu_idx = UINT32_MAX); 301 302 lldb::user_id_t 303 MakeUserID (dw_offset_t die_offset) const 304 { 305 return GetID() | die_offset; 306 } 307 308 size_t 309 GetObjCMethodDIEOffsets (lldb_private::ConstString class_name, 310 DIEArray &method_die_offsets); 311 312 bool 313 Supports_DW_AT_APPLE_objc_complete_type (DWARFCompileUnit *cu); 314 315 lldb_private::DebugMacrosSP 316 ParseDebugMacros(lldb::offset_t *offset); 317 318 static DWARFDIE 319 GetParentSymbolContextDIE(const DWARFDIE &die); 320 321 virtual lldb::CompUnitSP 322 ParseCompileUnit (DWARFCompileUnit* dwarf_cu, uint32_t cu_idx); 323 324 virtual lldb_private::DWARFExpression::LocationListFormat 325 GetLocationListFormat() const; 326 327 lldb::ModuleSP 328 GetDWOModule (lldb_private::ConstString name); 329 330protected: 331 typedef llvm::DenseMap<const DWARFDebugInfoEntry *, lldb_private::Type *> DIEToTypePtr; 332 typedef llvm::DenseMap<const DWARFDebugInfoEntry *, lldb::VariableSP> DIEToVariableSP; 333 typedef llvm::DenseMap<const DWARFDebugInfoEntry *, lldb::opaque_compiler_type_t> DIEToClangType; 334 typedef llvm::DenseMap<lldb::opaque_compiler_type_t, DIERef> ClangTypeToDIE; 335 336 struct DWARFDataSegment 337 { 338 std::once_flag m_flag; 339 lldb_private::DWARFDataExtractor m_data; 340 }; 341 342 DISALLOW_COPY_AND_ASSIGN (SymbolFileDWARF); 343 344 const lldb_private::DWARFDataExtractor& 345 GetCachedSectionData (lldb::SectionType sect_type, DWARFDataSegment& data_segment); 346 347 virtual void 348 LoadSectionData (lldb::SectionType sect_type, lldb_private::DWARFDataExtractor& data); 349 350 bool 351 DeclContextMatchesThisSymbolFile (const lldb_private::CompilerDeclContext *decl_ctx); 352 353 bool 354 DIEInDeclContext (const lldb_private::CompilerDeclContext *parent_decl_ctx, 355 const DWARFDIE &die); 356 357 virtual DWARFCompileUnit* 358 GetDWARFCompileUnit (lldb_private::CompileUnit *comp_unit); 359 360 DWARFCompileUnit* 361 GetNextUnparsedDWARFCompileUnit (DWARFCompileUnit* prev_cu); 362 363 bool 364 GetFunction (const DWARFDIE &die, 365 lldb_private::SymbolContext& sc); 366 367 lldb_private::Function * 368 ParseCompileUnitFunction (const lldb_private::SymbolContext& sc, 369 const DWARFDIE &die); 370 371 size_t 372 ParseFunctionBlocks (const lldb_private::SymbolContext& sc, 373 lldb_private::Block *parent_block, 374 const DWARFDIE &die, 375 lldb::addr_t subprogram_low_pc, 376 uint32_t depth); 377 378 size_t 379 ParseTypes (const lldb_private::SymbolContext& sc, 380 const DWARFDIE &die, 381 bool parse_siblings, 382 bool parse_children); 383 384 lldb::TypeSP 385 ParseType (const lldb_private::SymbolContext& sc, 386 const DWARFDIE &die, 387 bool *type_is_new); 388 389 lldb_private::Type * 390 ResolveTypeUID (const DWARFDIE &die, 391 bool assert_not_being_parsed); 392 393 lldb::VariableSP 394 ParseVariableDIE(const lldb_private::SymbolContext& sc, 395 const DWARFDIE &die, 396 const lldb::addr_t func_low_pc); 397 398 size_t 399 ParseVariables (const lldb_private::SymbolContext& sc, 400 const DWARFDIE &orig_die, 401 const lldb::addr_t func_low_pc, 402 bool parse_siblings, 403 bool parse_children, 404 lldb_private::VariableList* cc_variable_list = NULL); 405 406 bool 407 ClassOrStructIsVirtual (const DWARFDIE &die); 408 409 // Given a die_offset, figure out the symbol context representing that die. 410 bool 411 ResolveFunction (const DIERef& die_ref, 412 bool include_inlines, 413 lldb_private::SymbolContextList& sc_list); 414 415 bool 416 ResolveFunction (const DWARFDIE &die, 417 bool include_inlines, 418 lldb_private::SymbolContextList& sc_list); 419 420 void 421 FindFunctions(const lldb_private::ConstString &name, 422 const NameToDIE &name_to_die, 423 bool include_inlines, 424 lldb_private::SymbolContextList& sc_list); 425 426 void 427 FindFunctions (const lldb_private::RegularExpression ®ex, 428 const NameToDIE &name_to_die, 429 bool include_inlines, 430 lldb_private::SymbolContextList& sc_list); 431 432 void 433 FindFunctions (const lldb_private::RegularExpression ®ex, 434 const DWARFMappedHash::MemoryTable &memory_table, 435 bool include_inlines, 436 lldb_private::SymbolContextList& sc_list); 437 438 virtual lldb::TypeSP 439 FindDefinitionTypeForDWARFDeclContext (const DWARFDeclContext &die_decl_ctx); 440 441 lldb::TypeSP 442 FindCompleteObjCDefinitionTypeForDIE (const DWARFDIE &die, 443 const lldb_private::ConstString &type_name, 444 bool must_be_implementation); 445 446 lldb::TypeSP 447 FindCompleteObjCDefinitionType (const lldb_private::ConstString &type_name, 448 bool header_definition_ok); 449 450 lldb_private::Symbol * 451 GetObjCClassSymbol (const lldb_private::ConstString &objc_class_name); 452 453 void 454 ParseFunctions (const DIEArray &die_offsets, 455 bool include_inlines, 456 lldb_private::SymbolContextList& sc_list); 457 458 lldb::TypeSP 459 GetTypeForDIE (const DWARFDIE &die, bool resolve_function_context = false); 460 461 void 462 Index(); 463 464 void 465 DumpIndexes(); 466 467 void 468 SetDebugMapModule (const lldb::ModuleSP &module_sp) 469 { 470 m_debug_map_module_wp = module_sp; 471 } 472 473 SymbolFileDWARFDebugMap * 474 GetDebugMapSymfile (); 475 476 DWARFDIE 477 FindBlockContainingSpecification (const DIERef& func_die_ref, dw_offset_t spec_block_die_offset); 478 479 DWARFDIE 480 FindBlockContainingSpecification (const DWARFDIE &die, dw_offset_t spec_block_die_offset); 481 482 virtual UniqueDWARFASTTypeMap & 483 GetUniqueDWARFASTTypeMap (); 484 485 bool 486 UserIDMatches (lldb::user_id_t uid) const 487 { 488 const lldb::user_id_t high_uid = uid & 0xffffffff00000000ull; 489 if (high_uid != 0 && GetID() != 0) 490 return high_uid == GetID(); 491 return true; 492 } 493 494 bool 495 DIEDeclContextsMatch (const DWARFDIE &die1, 496 const DWARFDIE &die2); 497 498 bool 499 ClassContainsSelector (const DWARFDIE &class_die, 500 const lldb_private::ConstString &selector); 501 502 bool 503 FixupAddress (lldb_private::Address &addr); 504 505 typedef std::set<lldb_private::Type *> TypeSet; 506 507 typedef std::map<lldb_private::ConstString, lldb::ModuleSP> ExternalTypeModuleMap; 508 509 void 510 GetTypes (const DWARFDIE &die, 511 dw_offset_t min_die_offset, 512 dw_offset_t max_die_offset, 513 uint32_t type_mask, 514 TypeSet &type_set); 515 516 typedef lldb_private::RangeDataVector<lldb::addr_t, lldb::addr_t, lldb_private::Variable *> GlobalVariableMap; 517 518 GlobalVariableMap & 519 GetGlobalAranges(); 520 521 void 522 UpdateExternalModuleListIfNeeded(); 523 524 virtual DIEToTypePtr& 525 GetDIEToType() { return m_die_to_type; } 526 527 virtual DIEToVariableSP& 528 GetDIEToVariable() { return m_die_to_variable_sp; } 529 530 virtual DIEToClangType& 531 GetForwardDeclDieToClangType() { return m_forward_decl_die_to_clang_type; } 532 533 virtual ClangTypeToDIE& 534 GetForwardDeclClangTypeToDie() { return m_forward_decl_clang_type_to_die; } 535 536 lldb::ModuleWP m_debug_map_module_wp; 537 SymbolFileDWARFDebugMap * m_debug_map_symfile; 538 lldb_private::DWARFDataExtractor m_dwarf_data; 539 540 DWARFDataSegment m_data_debug_abbrev; 541 DWARFDataSegment m_data_debug_addr; 542 DWARFDataSegment m_data_debug_aranges; 543 DWARFDataSegment m_data_debug_frame; 544 DWARFDataSegment m_data_debug_info; 545 DWARFDataSegment m_data_debug_line; 546 DWARFDataSegment m_data_debug_macro; 547 DWARFDataSegment m_data_debug_loc; 548 DWARFDataSegment m_data_debug_ranges; 549 DWARFDataSegment m_data_debug_str; 550 DWARFDataSegment m_data_debug_str_offsets; 551 DWARFDataSegment m_data_apple_names; 552 DWARFDataSegment m_data_apple_types; 553 DWARFDataSegment m_data_apple_namespaces; 554 DWARFDataSegment m_data_apple_objc; 555 556 // The unique pointer items below are generated on demand if and when someone accesses 557 // them through a non const version of this class. 558 std::unique_ptr<DWARFDebugAbbrev> m_abbr; 559 std::unique_ptr<DWARFDebugInfo> m_info; 560 std::unique_ptr<DWARFDebugLine> m_line; 561 std::unique_ptr<DWARFMappedHash::MemoryTable> m_apple_names_ap; 562 std::unique_ptr<DWARFMappedHash::MemoryTable> m_apple_types_ap; 563 std::unique_ptr<DWARFMappedHash::MemoryTable> m_apple_namespaces_ap; 564 std::unique_ptr<DWARFMappedHash::MemoryTable> m_apple_objc_ap; 565 std::unique_ptr<GlobalVariableMap> m_global_aranges_ap; 566 567 typedef std::unordered_map<lldb::offset_t, lldb_private::DebugMacrosSP> DebugMacrosMap; 568 DebugMacrosMap m_debug_macros_map; 569 570 ExternalTypeModuleMap m_external_type_modules; 571 NameToDIE m_function_basename_index; // All concrete functions 572 NameToDIE m_function_fullname_index; // All concrete functions 573 NameToDIE m_function_method_index; // All inlined functions 574 NameToDIE m_function_selector_index; // All method names for functions of classes 575 NameToDIE m_objc_class_selectors_index; // Given a class name, find all selectors for the class 576 NameToDIE m_global_index; // Global and static variables 577 NameToDIE m_type_index; // All type DIE offsets 578 NameToDIE m_namespace_index; // All type DIE offsets 579 bool m_indexed:1, 580 m_using_apple_tables:1, 581 m_fetched_external_modules:1; 582 lldb_private::LazyBool m_supports_DW_AT_APPLE_objc_complete_type; 583 584 typedef std::shared_ptr<std::set<DIERef> > DIERefSetSP; 585 typedef std::unordered_map<std::string, DIERefSetSP> NameToOffsetMap; 586 NameToOffsetMap m_function_scope_qualified_name_map; 587 std::unique_ptr<DWARFDebugRanges> m_ranges; 588 UniqueDWARFASTTypeMap m_unique_ast_type_map; 589 DIEToTypePtr m_die_to_type; 590 DIEToVariableSP m_die_to_variable_sp; 591 DIEToClangType m_forward_decl_die_to_clang_type; 592 ClangTypeToDIE m_forward_decl_clang_type_to_die; 593}; 594 595#endif // SymbolFileDWARF_SymbolFileDWARF_h_ 596