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