1 //===-- SymbolFileDWARF.cpp ------------------------------------*- 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 #include "SymbolFileDWARF.h" 11 12 // Other libraries and framework includes 13 #include "clang/AST/ASTConsumer.h" 14 #include "clang/AST/ASTContext.h" 15 #include "clang/AST/Decl.h" 16 #include "clang/AST/DeclGroup.h" 17 #include "clang/Basic/Builtins.h" 18 #include "clang/Basic/IdentifierTable.h" 19 #include "clang/Basic/LangOptions.h" 20 #include "clang/Basic/SourceManager.h" 21 #include "clang/Basic/TargetInfo.h" 22 #include "clang/Basic/Specifiers.h" 23 #include "clang/Sema/DeclSpec.h" 24 25 #include "llvm/Support/Casting.h" 26 27 #include "lldb/Core/Module.h" 28 #include "lldb/Core/PluginManager.h" 29 #include "lldb/Core/RegularExpression.h" 30 #include "lldb/Core/Scalar.h" 31 #include "lldb/Core/Section.h" 32 #include "lldb/Core/StreamFile.h" 33 #include "lldb/Core/StreamString.h" 34 #include "lldb/Core/Timer.h" 35 #include "lldb/Core/Value.h" 36 37 #include "lldb/Symbol/Block.h" 38 #include "lldb/Symbol/ClangExternalASTSourceCallbacks.h" 39 #include "lldb/Symbol/CompileUnit.h" 40 #include "lldb/Symbol/LineTable.h" 41 #include "lldb/Symbol/ObjectFile.h" 42 #include "lldb/Symbol/SymbolVendor.h" 43 #include "lldb/Symbol/VariableList.h" 44 45 #include "lldb/Target/ObjCLanguageRuntime.h" 46 #include "lldb/Target/CPPLanguageRuntime.h" 47 48 #include "DWARFCompileUnit.h" 49 #include "DWARFDebugAbbrev.h" 50 #include "DWARFDebugAranges.h" 51 #include "DWARFDebugInfo.h" 52 #include "DWARFDebugInfoEntry.h" 53 #include "DWARFDebugLine.h" 54 #include "DWARFDebugPubnames.h" 55 #include "DWARFDebugRanges.h" 56 #include "DWARFDIECollection.h" 57 #include "DWARFFormValue.h" 58 #include "DWARFLocationList.h" 59 #include "LogChannelDWARF.h" 60 #include "SymbolFileDWARFDebugMap.h" 61 62 #include <map> 63 64 //#define ENABLE_DEBUG_PRINTF // COMMENT OUT THIS LINE PRIOR TO CHECKIN 65 66 #ifdef ENABLE_DEBUG_PRINTF 67 #include <stdio.h> 68 #define DEBUG_PRINTF(fmt, ...) printf(fmt, ## __VA_ARGS__) 69 #else 70 #define DEBUG_PRINTF(fmt, ...) 71 #endif 72 73 #define DIE_IS_BEING_PARSED ((lldb_private::Type*)1) 74 75 using namespace lldb; 76 using namespace lldb_private; 77 78 79 static AccessType 80 DW_ACCESS_to_AccessType (uint32_t dwarf_accessibility) 81 { 82 switch (dwarf_accessibility) 83 { 84 case DW_ACCESS_public: return eAccessPublic; 85 case DW_ACCESS_private: return eAccessPrivate; 86 case DW_ACCESS_protected: return eAccessProtected; 87 default: break; 88 } 89 return eAccessNone; 90 } 91 92 void 93 SymbolFileDWARF::Initialize() 94 { 95 LogChannelDWARF::Initialize(); 96 PluginManager::RegisterPlugin (GetPluginNameStatic(), 97 GetPluginDescriptionStatic(), 98 CreateInstance); 99 } 100 101 void 102 SymbolFileDWARF::Terminate() 103 { 104 PluginManager::UnregisterPlugin (CreateInstance); 105 LogChannelDWARF::Initialize(); 106 } 107 108 109 const char * 110 SymbolFileDWARF::GetPluginNameStatic() 111 { 112 return "dwarf"; 113 } 114 115 const char * 116 SymbolFileDWARF::GetPluginDescriptionStatic() 117 { 118 return "DWARF and DWARF3 debug symbol file reader."; 119 } 120 121 122 SymbolFile* 123 SymbolFileDWARF::CreateInstance (ObjectFile* obj_file) 124 { 125 return new SymbolFileDWARF(obj_file); 126 } 127 128 TypeList * 129 SymbolFileDWARF::GetTypeList () 130 { 131 if (m_debug_map_symfile) 132 return m_debug_map_symfile->GetTypeList(); 133 return m_obj_file->GetModule()->GetTypeList(); 134 135 } 136 137 //---------------------------------------------------------------------- 138 // Gets the first parent that is a lexical block, function or inlined 139 // subroutine, or compile unit. 140 //---------------------------------------------------------------------- 141 static const DWARFDebugInfoEntry * 142 GetParentSymbolContextDIE(const DWARFDebugInfoEntry *child_die) 143 { 144 const DWARFDebugInfoEntry *die; 145 for (die = child_die->GetParent(); die != NULL; die = die->GetParent()) 146 { 147 dw_tag_t tag = die->Tag(); 148 149 switch (tag) 150 { 151 case DW_TAG_compile_unit: 152 case DW_TAG_subprogram: 153 case DW_TAG_inlined_subroutine: 154 case DW_TAG_lexical_block: 155 return die; 156 } 157 } 158 return NULL; 159 } 160 161 162 SymbolFileDWARF::SymbolFileDWARF(ObjectFile* objfile) : 163 SymbolFile (objfile), 164 m_debug_map_symfile (NULL), 165 m_clang_tu_decl (NULL), 166 m_flags(), 167 m_data_debug_abbrev (), 168 m_data_debug_aranges (), 169 m_data_debug_frame (), 170 m_data_debug_info (), 171 m_data_debug_line (), 172 m_data_debug_loc (), 173 m_data_debug_ranges (), 174 m_data_debug_str (), 175 m_data_apple_names (), 176 m_data_apple_types (), 177 m_data_apple_namespaces (), 178 m_abbr(), 179 m_info(), 180 m_line(), 181 m_apple_names_ap (), 182 m_apple_types_ap (), 183 m_apple_namespaces_ap (), 184 m_function_basename_index(), 185 m_function_fullname_index(), 186 m_function_method_index(), 187 m_function_selector_index(), 188 m_objc_class_selectors_index(), 189 m_global_index(), 190 m_type_index(), 191 m_namespace_index(), 192 m_indexed (false), 193 m_is_external_ast_source (false), 194 m_ranges(), 195 m_unique_ast_type_map () 196 { 197 } 198 199 SymbolFileDWARF::~SymbolFileDWARF() 200 { 201 if (m_is_external_ast_source) 202 m_obj_file->GetModule()->GetClangASTContext().RemoveExternalSource (); 203 } 204 205 static const ConstString & 206 GetDWARFMachOSegmentName () 207 { 208 static ConstString g_dwarf_section_name ("__DWARF"); 209 return g_dwarf_section_name; 210 } 211 212 UniqueDWARFASTTypeMap & 213 SymbolFileDWARF::GetUniqueDWARFASTTypeMap () 214 { 215 if (m_debug_map_symfile) 216 return m_debug_map_symfile->GetUniqueDWARFASTTypeMap (); 217 return m_unique_ast_type_map; 218 } 219 220 ClangASTContext & 221 SymbolFileDWARF::GetClangASTContext () 222 { 223 if (m_debug_map_symfile) 224 return m_debug_map_symfile->GetClangASTContext (); 225 226 ClangASTContext &ast = m_obj_file->GetModule()->GetClangASTContext(); 227 if (!m_is_external_ast_source) 228 { 229 m_is_external_ast_source = true; 230 llvm::OwningPtr<clang::ExternalASTSource> ast_source_ap ( 231 new ClangExternalASTSourceCallbacks (SymbolFileDWARF::CompleteTagDecl, 232 SymbolFileDWARF::CompleteObjCInterfaceDecl, 233 SymbolFileDWARF::FindExternalVisibleDeclsByName, 234 this)); 235 236 ast.SetExternalSource (ast_source_ap); 237 } 238 return ast; 239 } 240 241 void 242 SymbolFileDWARF::InitializeObject() 243 { 244 // Install our external AST source callbacks so we can complete Clang types. 245 Module *module = m_obj_file->GetModule(); 246 if (module) 247 { 248 const SectionList *section_list = m_obj_file->GetSectionList(); 249 250 const Section* section = section_list->FindSectionByName(GetDWARFMachOSegmentName ()).get(); 251 252 // Memory map the DWARF mach-o segment so we have everything mmap'ed 253 // to keep our heap memory usage down. 254 if (section) 255 section->MemoryMapSectionDataFromObjectFile(m_obj_file, m_dwarf_data); 256 } 257 get_apple_names_data(); 258 if (m_data_apple_names.GetByteSize() > 0) 259 { 260 m_apple_names_ap.reset (new DWARFMappedHash::MemoryTable (m_data_apple_names, get_debug_str_data(), true)); 261 if (!m_apple_names_ap->IsValid()) 262 m_apple_names_ap.reset(); 263 } 264 get_apple_types_data(); 265 if (m_data_apple_types.GetByteSize() > 0) 266 { 267 m_apple_types_ap.reset (new DWARFMappedHash::MemoryTable (m_data_apple_types, get_debug_str_data(), false)); 268 if (!m_apple_types_ap->IsValid()) 269 m_apple_types_ap.reset(); 270 } 271 272 get_apple_namespaces_data(); 273 if (m_data_apple_namespaces.GetByteSize() > 0) 274 { 275 m_apple_namespaces_ap.reset (new DWARFMappedHash::MemoryTable (m_data_apple_namespaces, get_debug_str_data(), false)); 276 if (!m_apple_namespaces_ap->IsValid()) 277 m_apple_namespaces_ap.reset(); 278 } 279 280 } 281 282 bool 283 SymbolFileDWARF::SupportedVersion(uint16_t version) 284 { 285 return version == 2 || version == 3; 286 } 287 288 uint32_t 289 SymbolFileDWARF::GetAbilities () 290 { 291 uint32_t abilities = 0; 292 if (m_obj_file != NULL) 293 { 294 const Section* section = NULL; 295 const SectionList *section_list = m_obj_file->GetSectionList(); 296 if (section_list == NULL) 297 return 0; 298 299 uint64_t debug_abbrev_file_size = 0; 300 uint64_t debug_aranges_file_size = 0; 301 uint64_t debug_frame_file_size = 0; 302 uint64_t debug_info_file_size = 0; 303 uint64_t debug_line_file_size = 0; 304 uint64_t debug_loc_file_size = 0; 305 uint64_t debug_macinfo_file_size = 0; 306 uint64_t debug_pubnames_file_size = 0; 307 uint64_t debug_pubtypes_file_size = 0; 308 uint64_t debug_ranges_file_size = 0; 309 uint64_t debug_str_file_size = 0; 310 311 section = section_list->FindSectionByName(GetDWARFMachOSegmentName ()).get(); 312 313 if (section) 314 section_list = §ion->GetChildren (); 315 316 section = section_list->FindSectionByType (eSectionTypeDWARFDebugInfo, true).get(); 317 if (section != NULL) 318 { 319 debug_info_file_size = section->GetByteSize(); 320 321 section = section_list->FindSectionByType (eSectionTypeDWARFDebugAbbrev, true).get(); 322 if (section) 323 debug_abbrev_file_size = section->GetByteSize(); 324 else 325 m_flags.Set (flagsGotDebugAbbrevData); 326 327 section = section_list->FindSectionByType (eSectionTypeDWARFDebugAranges, true).get(); 328 if (section) 329 debug_aranges_file_size = section->GetByteSize(); 330 else 331 m_flags.Set (flagsGotDebugArangesData); 332 333 section = section_list->FindSectionByType (eSectionTypeDWARFDebugFrame, true).get(); 334 if (section) 335 debug_frame_file_size = section->GetByteSize(); 336 else 337 m_flags.Set (flagsGotDebugFrameData); 338 339 section = section_list->FindSectionByType (eSectionTypeDWARFDebugLine, true).get(); 340 if (section) 341 debug_line_file_size = section->GetByteSize(); 342 else 343 m_flags.Set (flagsGotDebugLineData); 344 345 section = section_list->FindSectionByType (eSectionTypeDWARFDebugLoc, true).get(); 346 if (section) 347 debug_loc_file_size = section->GetByteSize(); 348 else 349 m_flags.Set (flagsGotDebugLocData); 350 351 section = section_list->FindSectionByType (eSectionTypeDWARFDebugMacInfo, true).get(); 352 if (section) 353 debug_macinfo_file_size = section->GetByteSize(); 354 else 355 m_flags.Set (flagsGotDebugMacInfoData); 356 357 section = section_list->FindSectionByType (eSectionTypeDWARFDebugPubNames, true).get(); 358 if (section) 359 debug_pubnames_file_size = section->GetByteSize(); 360 else 361 m_flags.Set (flagsGotDebugPubNamesData); 362 363 section = section_list->FindSectionByType (eSectionTypeDWARFDebugPubTypes, true).get(); 364 if (section) 365 debug_pubtypes_file_size = section->GetByteSize(); 366 else 367 m_flags.Set (flagsGotDebugPubTypesData); 368 369 section = section_list->FindSectionByType (eSectionTypeDWARFDebugRanges, true).get(); 370 if (section) 371 debug_ranges_file_size = section->GetByteSize(); 372 else 373 m_flags.Set (flagsGotDebugRangesData); 374 375 section = section_list->FindSectionByType (eSectionTypeDWARFDebugStr, true).get(); 376 if (section) 377 debug_str_file_size = section->GetByteSize(); 378 else 379 m_flags.Set (flagsGotDebugStrData); 380 } 381 382 if (debug_abbrev_file_size > 0 && debug_info_file_size > 0) 383 abilities |= CompileUnits | Functions | Blocks | GlobalVariables | LocalVariables | VariableTypes; 384 385 if (debug_line_file_size > 0) 386 abilities |= LineTables; 387 388 if (debug_aranges_file_size > 0) 389 abilities |= AddressAcceleratorTable; 390 391 if (debug_pubnames_file_size > 0) 392 abilities |= FunctionAcceleratorTable; 393 394 if (debug_pubtypes_file_size > 0) 395 abilities |= TypeAcceleratorTable; 396 397 if (debug_macinfo_file_size > 0) 398 abilities |= MacroInformation; 399 400 if (debug_frame_file_size > 0) 401 abilities |= CallFrameInformation; 402 } 403 return abilities; 404 } 405 406 const DataExtractor& 407 SymbolFileDWARF::GetCachedSectionData (uint32_t got_flag, SectionType sect_type, DataExtractor &data) 408 { 409 if (m_flags.IsClear (got_flag)) 410 { 411 m_flags.Set (got_flag); 412 const SectionList *section_list = m_obj_file->GetSectionList(); 413 if (section_list) 414 { 415 Section *section = section_list->FindSectionByType(sect_type, true).get(); 416 if (section) 417 { 418 // See if we memory mapped the DWARF segment? 419 if (m_dwarf_data.GetByteSize()) 420 { 421 data.SetData(m_dwarf_data, section->GetOffset (), section->GetByteSize()); 422 } 423 else 424 { 425 if (section->ReadSectionDataFromObjectFile(m_obj_file, data) == 0) 426 data.Clear(); 427 } 428 } 429 } 430 } 431 return data; 432 } 433 434 const DataExtractor& 435 SymbolFileDWARF::get_debug_abbrev_data() 436 { 437 return GetCachedSectionData (flagsGotDebugAbbrevData, eSectionTypeDWARFDebugAbbrev, m_data_debug_abbrev); 438 } 439 440 const DataExtractor& 441 SymbolFileDWARF::get_debug_aranges_data() 442 { 443 return GetCachedSectionData (flagsGotDebugArangesData, eSectionTypeDWARFDebugAranges, m_data_debug_aranges); 444 } 445 446 const DataExtractor& 447 SymbolFileDWARF::get_debug_frame_data() 448 { 449 return GetCachedSectionData (flagsGotDebugFrameData, eSectionTypeDWARFDebugFrame, m_data_debug_frame); 450 } 451 452 const DataExtractor& 453 SymbolFileDWARF::get_debug_info_data() 454 { 455 return GetCachedSectionData (flagsGotDebugInfoData, eSectionTypeDWARFDebugInfo, m_data_debug_info); 456 } 457 458 const DataExtractor& 459 SymbolFileDWARF::get_debug_line_data() 460 { 461 return GetCachedSectionData (flagsGotDebugLineData, eSectionTypeDWARFDebugLine, m_data_debug_line); 462 } 463 464 const DataExtractor& 465 SymbolFileDWARF::get_debug_loc_data() 466 { 467 return GetCachedSectionData (flagsGotDebugLocData, eSectionTypeDWARFDebugLoc, m_data_debug_loc); 468 } 469 470 const DataExtractor& 471 SymbolFileDWARF::get_debug_ranges_data() 472 { 473 return GetCachedSectionData (flagsGotDebugRangesData, eSectionTypeDWARFDebugRanges, m_data_debug_ranges); 474 } 475 476 const DataExtractor& 477 SymbolFileDWARF::get_debug_str_data() 478 { 479 return GetCachedSectionData (flagsGotDebugStrData, eSectionTypeDWARFDebugStr, m_data_debug_str); 480 } 481 482 const DataExtractor& 483 SymbolFileDWARF::get_apple_names_data() 484 { 485 return GetCachedSectionData (flagsGotDebugNamesData, eSectionTypeDWARFAppleNames, m_data_apple_names); 486 } 487 488 const DataExtractor& 489 SymbolFileDWARF::get_apple_types_data() 490 { 491 return GetCachedSectionData (flagsGotDebugTypesData, eSectionTypeDWARFAppleTypes, m_data_apple_types); 492 } 493 494 const DataExtractor& 495 SymbolFileDWARF::get_apple_namespaces_data() 496 { 497 return GetCachedSectionData (flagsGotDebugTypesData, eSectionTypeDWARFAppleNamespaces, m_data_apple_namespaces); 498 } 499 500 501 DWARFDebugAbbrev* 502 SymbolFileDWARF::DebugAbbrev() 503 { 504 if (m_abbr.get() == NULL) 505 { 506 const DataExtractor &debug_abbrev_data = get_debug_abbrev_data(); 507 if (debug_abbrev_data.GetByteSize() > 0) 508 { 509 m_abbr.reset(new DWARFDebugAbbrev()); 510 if (m_abbr.get()) 511 m_abbr->Parse(debug_abbrev_data); 512 } 513 } 514 return m_abbr.get(); 515 } 516 517 const DWARFDebugAbbrev* 518 SymbolFileDWARF::DebugAbbrev() const 519 { 520 return m_abbr.get(); 521 } 522 523 524 DWARFDebugInfo* 525 SymbolFileDWARF::DebugInfo() 526 { 527 if (m_info.get() == NULL) 528 { 529 Timer scoped_timer(__PRETTY_FUNCTION__, "%s this = %p", __PRETTY_FUNCTION__, this); 530 if (get_debug_info_data().GetByteSize() > 0) 531 { 532 m_info.reset(new DWARFDebugInfo()); 533 if (m_info.get()) 534 { 535 m_info->SetDwarfData(this); 536 } 537 } 538 } 539 return m_info.get(); 540 } 541 542 const DWARFDebugInfo* 543 SymbolFileDWARF::DebugInfo() const 544 { 545 return m_info.get(); 546 } 547 548 DWARFCompileUnit* 549 SymbolFileDWARF::GetDWARFCompileUnitForUID(lldb::user_id_t cu_uid) 550 { 551 DWARFDebugInfo* info = DebugInfo(); 552 if (info) 553 return info->GetCompileUnit(cu_uid).get(); 554 return NULL; 555 } 556 557 558 DWARFDebugRanges* 559 SymbolFileDWARF::DebugRanges() 560 { 561 if (m_ranges.get() == NULL) 562 { 563 Timer scoped_timer(__PRETTY_FUNCTION__, "%s this = %p", __PRETTY_FUNCTION__, this); 564 if (get_debug_ranges_data().GetByteSize() > 0) 565 { 566 m_ranges.reset(new DWARFDebugRanges()); 567 if (m_ranges.get()) 568 m_ranges->Extract(this); 569 } 570 } 571 return m_ranges.get(); 572 } 573 574 const DWARFDebugRanges* 575 SymbolFileDWARF::DebugRanges() const 576 { 577 return m_ranges.get(); 578 } 579 580 bool 581 SymbolFileDWARF::ParseCompileUnit (DWARFCompileUnit* curr_cu, CompUnitSP& compile_unit_sp) 582 { 583 if (curr_cu != NULL) 584 { 585 const DWARFDebugInfoEntry * cu_die = curr_cu->GetCompileUnitDIEOnly (); 586 if (cu_die) 587 { 588 const char * cu_die_name = cu_die->GetName(this, curr_cu); 589 const char * cu_comp_dir = cu_die->GetAttributeValueAsString(this, curr_cu, DW_AT_comp_dir, NULL); 590 LanguageType cu_language = (LanguageType)cu_die->GetAttributeValueAsUnsigned(this, curr_cu, DW_AT_language, 0); 591 if (cu_die_name) 592 { 593 FileSpec cu_file_spec; 594 595 if (cu_die_name[0] == '/' || cu_comp_dir == NULL || cu_comp_dir[0] == '\0') 596 { 597 // If we have a full path to the compile unit, we don't need to resolve 598 // the file. This can be expensive e.g. when the source files are NFS mounted. 599 cu_file_spec.SetFile (cu_die_name, false); 600 } 601 else 602 { 603 std::string fullpath(cu_comp_dir); 604 if (*fullpath.rbegin() != '/') 605 fullpath += '/'; 606 fullpath += cu_die_name; 607 cu_file_spec.SetFile (fullpath.c_str(), false); 608 } 609 610 compile_unit_sp.reset(new CompileUnit(m_obj_file->GetModule(), curr_cu, cu_file_spec, curr_cu->GetOffset(), cu_language)); 611 if (compile_unit_sp.get()) 612 { 613 curr_cu->SetUserData(compile_unit_sp.get()); 614 return true; 615 } 616 } 617 } 618 } 619 return false; 620 } 621 622 uint32_t 623 SymbolFileDWARF::GetNumCompileUnits() 624 { 625 DWARFDebugInfo* info = DebugInfo(); 626 if (info) 627 return info->GetNumCompileUnits(); 628 return 0; 629 } 630 631 CompUnitSP 632 SymbolFileDWARF::ParseCompileUnitAtIndex(uint32_t cu_idx) 633 { 634 CompUnitSP comp_unit; 635 DWARFDebugInfo* info = DebugInfo(); 636 if (info) 637 { 638 DWARFCompileUnit* curr_cu = info->GetCompileUnitAtIndex(cu_idx); 639 if (curr_cu != NULL) 640 { 641 // Our symbol vendor shouldn't be asking us to add a compile unit that 642 // has already been added to it, which this DWARF plug-in knows as it 643 // stores the lldb compile unit (CompileUnit) pointer in each 644 // DWARFCompileUnit object when it gets added. 645 assert(curr_cu->GetUserData() == NULL); 646 ParseCompileUnit(curr_cu, comp_unit); 647 } 648 } 649 return comp_unit; 650 } 651 652 static void 653 AddRangesToBlock (Block& block, 654 DWARFDebugRanges::RangeList& ranges, 655 addr_t block_base_addr) 656 { 657 const size_t num_ranges = ranges.GetSize(); 658 for (size_t i = 0; i<num_ranges; ++i) 659 { 660 const DWARFDebugRanges::Range &range = ranges.GetEntryRef (i); 661 const addr_t range_base = range.GetRangeBase(); 662 assert (range_base >= block_base_addr); 663 block.AddRange(Block::Range (range_base - block_base_addr, range.GetByteSize()));; 664 } 665 block.FinalizeRanges (); 666 } 667 668 669 Function * 670 SymbolFileDWARF::ParseCompileUnitFunction (const SymbolContext& sc, DWARFCompileUnit* dwarf_cu, const DWARFDebugInfoEntry *die) 671 { 672 DWARFDebugRanges::RangeList func_ranges; 673 const char *name = NULL; 674 const char *mangled = NULL; 675 int decl_file = 0; 676 int decl_line = 0; 677 int decl_column = 0; 678 int call_file = 0; 679 int call_line = 0; 680 int call_column = 0; 681 DWARFExpression frame_base; 682 683 assert (die->Tag() == DW_TAG_subprogram); 684 685 if (die->Tag() != DW_TAG_subprogram) 686 return NULL; 687 688 if (die->GetDIENamesAndRanges(this, dwarf_cu, name, mangled, func_ranges, decl_file, decl_line, decl_column, call_file, call_line, call_column, &frame_base)) 689 { 690 // Union of all ranges in the function DIE (if the function is discontiguous) 691 AddressRange func_range; 692 lldb::addr_t lowest_func_addr = func_ranges.GetMinRangeBase (0); 693 lldb::addr_t highest_func_addr = func_ranges.GetMaxRangeEnd (0); 694 if (lowest_func_addr != LLDB_INVALID_ADDRESS && lowest_func_addr <= highest_func_addr) 695 { 696 func_range.GetBaseAddress().ResolveAddressUsingFileSections (lowest_func_addr, m_obj_file->GetSectionList()); 697 if (func_range.GetBaseAddress().IsValid()) 698 func_range.SetByteSize(highest_func_addr - lowest_func_addr); 699 } 700 701 if (func_range.GetBaseAddress().IsValid()) 702 { 703 Mangled func_name; 704 if (mangled) 705 func_name.SetValue(mangled, true); 706 else if (name) 707 func_name.SetValue(name, false); 708 709 FunctionSP func_sp; 710 std::auto_ptr<Declaration> decl_ap; 711 if (decl_file != 0 || decl_line != 0 || decl_column != 0) 712 decl_ap.reset(new Declaration (sc.comp_unit->GetSupportFiles().GetFileSpecAtIndex(decl_file), 713 decl_line, 714 decl_column)); 715 716 // Supply the type _only_ if it has already been parsed 717 Type *func_type = m_die_to_type.lookup (die); 718 719 assert(func_type == NULL || func_type != DIE_IS_BEING_PARSED); 720 721 func_range.GetBaseAddress().ResolveLinkedAddress(); 722 723 func_sp.reset(new Function (sc.comp_unit, 724 die->GetOffset(), // UserID is the DIE offset 725 die->GetOffset(), 726 func_name, 727 func_type, 728 func_range)); // first address range 729 730 if (func_sp.get() != NULL) 731 { 732 if (frame_base.IsValid()) 733 func_sp->GetFrameBaseExpression() = frame_base; 734 sc.comp_unit->AddFunction(func_sp); 735 return func_sp.get(); 736 } 737 } 738 } 739 return NULL; 740 } 741 742 size_t 743 SymbolFileDWARF::ParseCompileUnitFunctions(const SymbolContext &sc) 744 { 745 assert (sc.comp_unit); 746 size_t functions_added = 0; 747 DWARFCompileUnit* dwarf_cu = GetDWARFCompileUnitForUID(sc.comp_unit->GetID()); 748 if (dwarf_cu) 749 { 750 DWARFDIECollection function_dies; 751 const size_t num_funtions = dwarf_cu->AppendDIEsWithTag (DW_TAG_subprogram, function_dies); 752 size_t func_idx; 753 for (func_idx = 0; func_idx < num_funtions; ++func_idx) 754 { 755 const DWARFDebugInfoEntry *die = function_dies.GetDIEPtrAtIndex(func_idx); 756 if (sc.comp_unit->FindFunctionByUID (die->GetOffset()).get() == NULL) 757 { 758 if (ParseCompileUnitFunction(sc, dwarf_cu, die)) 759 ++functions_added; 760 } 761 } 762 //FixupTypes(); 763 } 764 return functions_added; 765 } 766 767 bool 768 SymbolFileDWARF::ParseCompileUnitSupportFiles (const SymbolContext& sc, FileSpecList& support_files) 769 { 770 assert (sc.comp_unit); 771 DWARFCompileUnit* curr_cu = GetDWARFCompileUnitForUID(sc.comp_unit->GetID()); 772 assert (curr_cu); 773 const DWARFDebugInfoEntry * cu_die = curr_cu->GetCompileUnitDIEOnly(); 774 775 if (cu_die) 776 { 777 const char * cu_comp_dir = cu_die->GetAttributeValueAsString(this, curr_cu, DW_AT_comp_dir, NULL); 778 dw_offset_t stmt_list = cu_die->GetAttributeValueAsUnsigned(this, curr_cu, DW_AT_stmt_list, DW_INVALID_OFFSET); 779 780 // All file indexes in DWARF are one based and a file of index zero is 781 // supposed to be the compile unit itself. 782 support_files.Append (*sc.comp_unit); 783 784 return DWARFDebugLine::ParseSupportFiles(get_debug_line_data(), cu_comp_dir, stmt_list, support_files); 785 } 786 return false; 787 } 788 789 struct ParseDWARFLineTableCallbackInfo 790 { 791 LineTable* line_table; 792 const SectionList *section_list; 793 lldb::addr_t prev_sect_file_base_addr; 794 lldb::addr_t curr_sect_file_base_addr; 795 bool is_oso_for_debug_map; 796 bool prev_in_final_executable; 797 DWARFDebugLine::Row prev_row; 798 SectionSP prev_section_sp; 799 SectionSP curr_section_sp; 800 }; 801 802 //---------------------------------------------------------------------- 803 // ParseStatementTableCallback 804 //---------------------------------------------------------------------- 805 static void 806 ParseDWARFLineTableCallback(dw_offset_t offset, const DWARFDebugLine::State& state, void* userData) 807 { 808 LineTable* line_table = ((ParseDWARFLineTableCallbackInfo*)userData)->line_table; 809 if (state.row == DWARFDebugLine::State::StartParsingLineTable) 810 { 811 // Just started parsing the line table 812 } 813 else if (state.row == DWARFDebugLine::State::DoneParsingLineTable) 814 { 815 // Done parsing line table, nothing to do for the cleanup 816 } 817 else 818 { 819 ParseDWARFLineTableCallbackInfo* info = (ParseDWARFLineTableCallbackInfo*)userData; 820 // We have a new row, lets append it 821 822 if (info->curr_section_sp.get() == NULL || info->curr_section_sp->ContainsFileAddress(state.address) == false) 823 { 824 info->prev_section_sp = info->curr_section_sp; 825 info->prev_sect_file_base_addr = info->curr_sect_file_base_addr; 826 // If this is an end sequence entry, then we subtract one from the 827 // address to make sure we get an address that is not the end of 828 // a section. 829 if (state.end_sequence && state.address != 0) 830 info->curr_section_sp = info->section_list->FindSectionContainingFileAddress (state.address - 1); 831 else 832 info->curr_section_sp = info->section_list->FindSectionContainingFileAddress (state.address); 833 834 if (info->curr_section_sp.get()) 835 info->curr_sect_file_base_addr = info->curr_section_sp->GetFileAddress (); 836 else 837 info->curr_sect_file_base_addr = 0; 838 } 839 if (info->curr_section_sp.get()) 840 { 841 lldb::addr_t curr_line_section_offset = state.address - info->curr_sect_file_base_addr; 842 // Check for the fancy section magic to determine if we 843 844 if (info->is_oso_for_debug_map) 845 { 846 // When this is a debug map object file that contains DWARF 847 // (referenced from an N_OSO debug map nlist entry) we will have 848 // a file address in the file range for our section from the 849 // original .o file, and a load address in the executable that 850 // contains the debug map. 851 // 852 // If the sections for the file range and load range are 853 // different, we have a remapped section for the function and 854 // this address is resolved. If they are the same, then the 855 // function for this address didn't make it into the final 856 // executable. 857 bool curr_in_final_executable = info->curr_section_sp->GetLinkedSection () != NULL; 858 859 // If we are doing DWARF with debug map, then we need to carefully 860 // add each line table entry as there may be gaps as functions 861 // get moved around or removed. 862 if (!info->prev_row.end_sequence && info->prev_section_sp.get()) 863 { 864 if (info->prev_in_final_executable) 865 { 866 bool terminate_previous_entry = false; 867 if (!curr_in_final_executable) 868 { 869 // Check for the case where the previous line entry 870 // in a function made it into the final executable, 871 // yet the current line entry falls in a function 872 // that didn't. The line table used to be contiguous 873 // through this address range but now it isn't. We 874 // need to terminate the previous line entry so 875 // that we can reconstruct the line range correctly 876 // for it and to keep the line table correct. 877 terminate_previous_entry = true; 878 } 879 else if (info->curr_section_sp.get() != info->prev_section_sp.get()) 880 { 881 // Check for cases where the line entries used to be 882 // contiguous address ranges, but now they aren't. 883 // This can happen when order files specify the 884 // ordering of the functions. 885 lldb::addr_t prev_line_section_offset = info->prev_row.address - info->prev_sect_file_base_addr; 886 Section *curr_sect = info->curr_section_sp.get(); 887 Section *prev_sect = info->prev_section_sp.get(); 888 assert (curr_sect->GetLinkedSection()); 889 assert (prev_sect->GetLinkedSection()); 890 lldb::addr_t object_file_addr_delta = state.address - info->prev_row.address; 891 lldb::addr_t curr_linked_file_addr = curr_sect->GetLinkedFileAddress() + curr_line_section_offset; 892 lldb::addr_t prev_linked_file_addr = prev_sect->GetLinkedFileAddress() + prev_line_section_offset; 893 lldb::addr_t linked_file_addr_delta = curr_linked_file_addr - prev_linked_file_addr; 894 if (object_file_addr_delta != linked_file_addr_delta) 895 terminate_previous_entry = true; 896 } 897 898 if (terminate_previous_entry) 899 { 900 line_table->InsertLineEntry (info->prev_section_sp, 901 state.address - info->prev_sect_file_base_addr, 902 info->prev_row.line, 903 info->prev_row.column, 904 info->prev_row.file, 905 false, // is_stmt 906 false, // basic_block 907 false, // state.prologue_end 908 false, // state.epilogue_begin 909 true); // end_sequence); 910 } 911 } 912 } 913 914 if (curr_in_final_executable) 915 { 916 line_table->InsertLineEntry (info->curr_section_sp, 917 curr_line_section_offset, 918 state.line, 919 state.column, 920 state.file, 921 state.is_stmt, 922 state.basic_block, 923 state.prologue_end, 924 state.epilogue_begin, 925 state.end_sequence); 926 info->prev_section_sp = info->curr_section_sp; 927 } 928 else 929 { 930 // If the current address didn't make it into the final 931 // executable, the current section will be the __text 932 // segment in the .o file, so we need to clear this so 933 // we can catch the next function that did make it into 934 // the final executable. 935 info->prev_section_sp.reset(); 936 info->curr_section_sp.reset(); 937 } 938 939 info->prev_in_final_executable = curr_in_final_executable; 940 } 941 else 942 { 943 // We are not in an object file that contains DWARF for an 944 // N_OSO, this is just a normal DWARF file. The DWARF spec 945 // guarantees that the addresses will be in increasing order 946 // so, since we store line tables in file address order, we 947 // can always just append the line entry without needing to 948 // search for the correct insertion point (we don't need to 949 // use LineEntry::InsertLineEntry()). 950 line_table->AppendLineEntry (info->curr_section_sp, 951 curr_line_section_offset, 952 state.line, 953 state.column, 954 state.file, 955 state.is_stmt, 956 state.basic_block, 957 state.prologue_end, 958 state.epilogue_begin, 959 state.end_sequence); 960 } 961 } 962 963 info->prev_row = state; 964 } 965 } 966 967 bool 968 SymbolFileDWARF::ParseCompileUnitLineTable (const SymbolContext &sc) 969 { 970 assert (sc.comp_unit); 971 if (sc.comp_unit->GetLineTable() != NULL) 972 return true; 973 974 DWARFCompileUnit* dwarf_cu = GetDWARFCompileUnitForUID(sc.comp_unit->GetID()); 975 if (dwarf_cu) 976 { 977 const DWARFDebugInfoEntry *dwarf_cu_die = dwarf_cu->GetCompileUnitDIEOnly(); 978 const dw_offset_t cu_line_offset = dwarf_cu_die->GetAttributeValueAsUnsigned(this, dwarf_cu, DW_AT_stmt_list, DW_INVALID_OFFSET); 979 if (cu_line_offset != DW_INVALID_OFFSET) 980 { 981 std::auto_ptr<LineTable> line_table_ap(new LineTable(sc.comp_unit)); 982 if (line_table_ap.get()) 983 { 984 ParseDWARFLineTableCallbackInfo info = { line_table_ap.get(), m_obj_file->GetSectionList(), 0, 0, m_debug_map_symfile != NULL, false}; 985 uint32_t offset = cu_line_offset; 986 DWARFDebugLine::ParseStatementTable(get_debug_line_data(), &offset, ParseDWARFLineTableCallback, &info); 987 sc.comp_unit->SetLineTable(line_table_ap.release()); 988 return true; 989 } 990 } 991 } 992 return false; 993 } 994 995 size_t 996 SymbolFileDWARF::ParseFunctionBlocks 997 ( 998 const SymbolContext& sc, 999 Block *parent_block, 1000 DWARFCompileUnit* dwarf_cu, 1001 const DWARFDebugInfoEntry *die, 1002 addr_t subprogram_low_pc, 1003 uint32_t depth 1004 ) 1005 { 1006 size_t blocks_added = 0; 1007 while (die != NULL) 1008 { 1009 dw_tag_t tag = die->Tag(); 1010 1011 switch (tag) 1012 { 1013 case DW_TAG_inlined_subroutine: 1014 case DW_TAG_subprogram: 1015 case DW_TAG_lexical_block: 1016 { 1017 Block *block = NULL; 1018 if (tag == DW_TAG_subprogram) 1019 { 1020 // Skip any DW_TAG_subprogram DIEs that are inside 1021 // of a normal or inlined functions. These will be 1022 // parsed on their own as separate entities. 1023 1024 if (depth > 0) 1025 break; 1026 1027 block = parent_block; 1028 } 1029 else 1030 { 1031 BlockSP block_sp(new Block (die->GetOffset())); 1032 parent_block->AddChild(block_sp); 1033 block = block_sp.get(); 1034 } 1035 DWARFDebugRanges::RangeList ranges; 1036 const char *name = NULL; 1037 const char *mangled_name = NULL; 1038 1039 int decl_file = 0; 1040 int decl_line = 0; 1041 int decl_column = 0; 1042 int call_file = 0; 1043 int call_line = 0; 1044 int call_column = 0; 1045 if (die->GetDIENamesAndRanges (this, 1046 dwarf_cu, 1047 name, 1048 mangled_name, 1049 ranges, 1050 decl_file, decl_line, decl_column, 1051 call_file, call_line, call_column)) 1052 { 1053 if (tag == DW_TAG_subprogram) 1054 { 1055 assert (subprogram_low_pc == LLDB_INVALID_ADDRESS); 1056 subprogram_low_pc = ranges.GetMinRangeBase(0); 1057 } 1058 else if (tag == DW_TAG_inlined_subroutine) 1059 { 1060 // We get called here for inlined subroutines in two ways. 1061 // The first time is when we are making the Function object 1062 // for this inlined concrete instance. Since we're creating a top level block at 1063 // here, the subprogram_low_pc will be LLDB_INVALID_ADDRESS. So we need to 1064 // adjust the containing address. 1065 // The second time is when we are parsing the blocks inside the function that contains 1066 // the inlined concrete instance. Since these will be blocks inside the containing "real" 1067 // function the offset will be for that function. 1068 if (subprogram_low_pc == LLDB_INVALID_ADDRESS) 1069 { 1070 subprogram_low_pc = ranges.GetMinRangeBase(0); 1071 } 1072 } 1073 1074 AddRangesToBlock (*block, ranges, subprogram_low_pc); 1075 1076 if (tag != DW_TAG_subprogram && (name != NULL || mangled_name != NULL)) 1077 { 1078 std::auto_ptr<Declaration> decl_ap; 1079 if (decl_file != 0 || decl_line != 0 || decl_column != 0) 1080 decl_ap.reset(new Declaration(sc.comp_unit->GetSupportFiles().GetFileSpecAtIndex(decl_file), 1081 decl_line, decl_column)); 1082 1083 std::auto_ptr<Declaration> call_ap; 1084 if (call_file != 0 || call_line != 0 || call_column != 0) 1085 call_ap.reset(new Declaration(sc.comp_unit->GetSupportFiles().GetFileSpecAtIndex(call_file), 1086 call_line, call_column)); 1087 1088 block->SetInlinedFunctionInfo (name, mangled_name, decl_ap.get(), call_ap.get()); 1089 } 1090 1091 ++blocks_added; 1092 1093 if (die->HasChildren()) 1094 { 1095 blocks_added += ParseFunctionBlocks (sc, 1096 block, 1097 dwarf_cu, 1098 die->GetFirstChild(), 1099 subprogram_low_pc, 1100 depth + 1); 1101 } 1102 } 1103 } 1104 break; 1105 default: 1106 break; 1107 } 1108 1109 // Only parse siblings of the block if we are not at depth zero. A depth 1110 // of zero indicates we are currently parsing the top level 1111 // DW_TAG_subprogram DIE 1112 1113 if (depth == 0) 1114 die = NULL; 1115 else 1116 die = die->GetSibling(); 1117 } 1118 return blocks_added; 1119 } 1120 1121 size_t 1122 SymbolFileDWARF::ParseChildMembers 1123 ( 1124 const SymbolContext& sc, 1125 DWARFCompileUnit* dwarf_cu, 1126 const DWARFDebugInfoEntry *parent_die, 1127 clang_type_t class_clang_type, 1128 const LanguageType class_language, 1129 std::vector<clang::CXXBaseSpecifier *>& base_classes, 1130 std::vector<int>& member_accessibilities, 1131 DWARFDIECollection& member_function_dies, 1132 AccessType& default_accessibility, 1133 bool &is_a_class 1134 ) 1135 { 1136 if (parent_die == NULL) 1137 return 0; 1138 1139 size_t count = 0; 1140 const DWARFDebugInfoEntry *die; 1141 const uint8_t *fixed_form_sizes = DWARFFormValue::GetFixedFormSizesForAddressSize (dwarf_cu->GetAddressByteSize()); 1142 uint32_t member_idx = 0; 1143 1144 for (die = parent_die->GetFirstChild(); die != NULL; die = die->GetSibling()) 1145 { 1146 dw_tag_t tag = die->Tag(); 1147 1148 switch (tag) 1149 { 1150 case DW_TAG_member: 1151 { 1152 DWARFDebugInfoEntry::Attributes attributes; 1153 const size_t num_attributes = die->GetAttributes (this, 1154 dwarf_cu, 1155 fixed_form_sizes, 1156 attributes); 1157 if (num_attributes > 0) 1158 { 1159 Declaration decl; 1160 //DWARFExpression location; 1161 const char *name = NULL; 1162 bool is_artificial = false; 1163 lldb::user_id_t encoding_uid = LLDB_INVALID_UID; 1164 AccessType accessibility = eAccessNone; 1165 //off_t member_offset = 0; 1166 size_t byte_size = 0; 1167 size_t bit_offset = 0; 1168 size_t bit_size = 0; 1169 uint32_t i; 1170 for (i=0; i<num_attributes && !is_artificial; ++i) 1171 { 1172 const dw_attr_t attr = attributes.AttributeAtIndex(i); 1173 DWARFFormValue form_value; 1174 if (attributes.ExtractFormValueAtIndex(this, i, form_value)) 1175 { 1176 switch (attr) 1177 { 1178 case DW_AT_decl_file: decl.SetFile(sc.comp_unit->GetSupportFiles().GetFileSpecAtIndex(form_value.Unsigned())); break; 1179 case DW_AT_decl_line: decl.SetLine(form_value.Unsigned()); break; 1180 case DW_AT_decl_column: decl.SetColumn(form_value.Unsigned()); break; 1181 case DW_AT_name: name = form_value.AsCString(&get_debug_str_data()); break; 1182 case DW_AT_type: encoding_uid = form_value.Reference(dwarf_cu); break; 1183 case DW_AT_bit_offset: bit_offset = form_value.Unsigned(); break; 1184 case DW_AT_bit_size: bit_size = form_value.Unsigned(); break; 1185 case DW_AT_byte_size: byte_size = form_value.Unsigned(); break; 1186 case DW_AT_data_member_location: 1187 // if (form_value.BlockData()) 1188 // { 1189 // Value initialValue(0); 1190 // Value memberOffset(0); 1191 // const DataExtractor& debug_info_data = get_debug_info_data(); 1192 // uint32_t block_length = form_value.Unsigned(); 1193 // uint32_t block_offset = form_value.BlockData() - debug_info_data.GetDataStart(); 1194 // if (DWARFExpression::Evaluate(NULL, NULL, debug_info_data, NULL, NULL, block_offset, block_length, eRegisterKindDWARF, &initialValue, memberOffset, NULL)) 1195 // { 1196 // member_offset = memberOffset.ResolveValue(NULL, NULL).UInt(); 1197 // } 1198 // } 1199 break; 1200 1201 case DW_AT_accessibility: accessibility = DW_ACCESS_to_AccessType (form_value.Unsigned()); break; 1202 case DW_AT_artificial: is_artificial = form_value.Unsigned() != 0; break; 1203 case DW_AT_declaration: 1204 case DW_AT_description: 1205 case DW_AT_mutable: 1206 case DW_AT_visibility: 1207 default: 1208 case DW_AT_sibling: 1209 break; 1210 } 1211 } 1212 } 1213 1214 // FIXME: Make Clang ignore Objective-C accessibility for expressions 1215 1216 if (class_language == eLanguageTypeObjC || 1217 class_language == eLanguageTypeObjC_plus_plus) 1218 accessibility = eAccessNone; 1219 1220 if (member_idx == 0 && !is_artificial && name && (strstr (name, "_vptr$") == name)) 1221 { 1222 // Not all compilers will mark the vtable pointer 1223 // member as artificial (llvm-gcc). We can't have 1224 // the virtual members in our classes otherwise it 1225 // throws off all child offsets since we end up 1226 // having and extra pointer sized member in our 1227 // class layouts. 1228 is_artificial = true; 1229 } 1230 1231 if (is_artificial == false) 1232 { 1233 Type *member_type = ResolveTypeUID(encoding_uid); 1234 if (member_type) 1235 { 1236 if (accessibility == eAccessNone) 1237 accessibility = default_accessibility; 1238 member_accessibilities.push_back(accessibility); 1239 1240 GetClangASTContext().AddFieldToRecordType (class_clang_type, 1241 name, 1242 member_type->GetClangLayoutType(), 1243 accessibility, 1244 bit_size); 1245 } 1246 else 1247 { 1248 if (name) 1249 ReportError ("0x%8.8x: DW_TAG_member '%s' refers to type 0x%8.8x which was unable to be parsed", 1250 die->GetOffset(), 1251 name, 1252 encoding_uid); 1253 else 1254 ReportError ("0x%8.8x: DW_TAG_member refers to type 0x%8.8x which was unable to be parsed", 1255 die->GetOffset(), 1256 encoding_uid); 1257 } 1258 } 1259 } 1260 ++member_idx; 1261 } 1262 break; 1263 1264 case DW_TAG_subprogram: 1265 // Let the type parsing code handle this one for us. 1266 member_function_dies.Append (die); 1267 break; 1268 1269 case DW_TAG_inheritance: 1270 { 1271 is_a_class = true; 1272 if (default_accessibility == eAccessNone) 1273 default_accessibility = eAccessPrivate; 1274 // TODO: implement DW_TAG_inheritance type parsing 1275 DWARFDebugInfoEntry::Attributes attributes; 1276 const size_t num_attributes = die->GetAttributes (this, 1277 dwarf_cu, 1278 fixed_form_sizes, 1279 attributes); 1280 if (num_attributes > 0) 1281 { 1282 Declaration decl; 1283 DWARFExpression location; 1284 lldb::user_id_t encoding_uid = LLDB_INVALID_UID; 1285 AccessType accessibility = default_accessibility; 1286 bool is_virtual = false; 1287 bool is_base_of_class = true; 1288 off_t member_offset = 0; 1289 uint32_t i; 1290 for (i=0; i<num_attributes; ++i) 1291 { 1292 const dw_attr_t attr = attributes.AttributeAtIndex(i); 1293 DWARFFormValue form_value; 1294 if (attributes.ExtractFormValueAtIndex(this, i, form_value)) 1295 { 1296 switch (attr) 1297 { 1298 case DW_AT_decl_file: decl.SetFile(sc.comp_unit->GetSupportFiles().GetFileSpecAtIndex(form_value.Unsigned())); break; 1299 case DW_AT_decl_line: decl.SetLine(form_value.Unsigned()); break; 1300 case DW_AT_decl_column: decl.SetColumn(form_value.Unsigned()); break; 1301 case DW_AT_type: encoding_uid = form_value.Reference(dwarf_cu); break; 1302 case DW_AT_data_member_location: 1303 if (form_value.BlockData()) 1304 { 1305 Value initialValue(0); 1306 Value memberOffset(0); 1307 const DataExtractor& debug_info_data = get_debug_info_data(); 1308 uint32_t block_length = form_value.Unsigned(); 1309 uint32_t block_offset = form_value.BlockData() - debug_info_data.GetDataStart(); 1310 if (DWARFExpression::Evaluate (NULL, 1311 NULL, 1312 NULL, 1313 NULL, 1314 NULL, 1315 debug_info_data, 1316 block_offset, 1317 block_length, 1318 eRegisterKindDWARF, 1319 &initialValue, 1320 memberOffset, 1321 NULL)) 1322 { 1323 member_offset = memberOffset.ResolveValue(NULL, NULL).UInt(); 1324 } 1325 } 1326 break; 1327 1328 case DW_AT_accessibility: 1329 accessibility = DW_ACCESS_to_AccessType(form_value.Unsigned()); 1330 break; 1331 1332 case DW_AT_virtuality: is_virtual = form_value.Unsigned() != 0; break; 1333 default: 1334 case DW_AT_sibling: 1335 break; 1336 } 1337 } 1338 } 1339 1340 Type *base_class_type = ResolveTypeUID(encoding_uid); 1341 assert(base_class_type); 1342 1343 clang_type_t base_class_clang_type = base_class_type->GetClangFullType(); 1344 assert (base_class_clang_type); 1345 if (class_language == eLanguageTypeObjC) 1346 { 1347 GetClangASTContext().SetObjCSuperClass(class_clang_type, base_class_clang_type); 1348 } 1349 else 1350 { 1351 base_classes.push_back (GetClangASTContext().CreateBaseClassSpecifier (base_class_clang_type, 1352 accessibility, 1353 is_virtual, 1354 is_base_of_class)); 1355 } 1356 } 1357 } 1358 break; 1359 1360 default: 1361 break; 1362 } 1363 } 1364 return count; 1365 } 1366 1367 1368 clang::DeclContext* 1369 SymbolFileDWARF::GetClangDeclContextContainingTypeUID (lldb::user_id_t type_uid) 1370 { 1371 DWARFDebugInfo* debug_info = DebugInfo(); 1372 if (debug_info) 1373 { 1374 DWARFCompileUnitSP cu_sp; 1375 const DWARFDebugInfoEntry* die = debug_info->GetDIEPtr(type_uid, &cu_sp); 1376 if (die) 1377 return GetClangDeclContextContainingDIE (cu_sp.get(), die); 1378 } 1379 return NULL; 1380 } 1381 1382 clang::DeclContext* 1383 SymbolFileDWARF::GetClangDeclContextForTypeUID (const lldb_private::SymbolContext &sc, lldb::user_id_t type_uid) 1384 { 1385 return GetClangDeclContextForDIEOffset (sc, type_uid); 1386 } 1387 1388 Type* 1389 SymbolFileDWARF::ResolveTypeUID (lldb::user_id_t type_uid) 1390 { 1391 DWARFDebugInfo* debug_info = DebugInfo(); 1392 if (debug_info) 1393 { 1394 DWARFCompileUnitSP cu_sp; 1395 const DWARFDebugInfoEntry* type_die = debug_info->GetDIEPtr(type_uid, &cu_sp); 1396 if (type_die != NULL) 1397 { 1398 // We might be coming in in the middle of a type tree (a class 1399 // withing a class, an enum within a class), so parse any needed 1400 // parent DIEs before we get to this one... 1401 const DWARFDebugInfoEntry *decl_ctx_die = GetDeclContextDIEContainingDIE (cu_sp.get(), type_die); 1402 switch (decl_ctx_die->Tag()) 1403 { 1404 case DW_TAG_structure_type: 1405 case DW_TAG_union_type: 1406 case DW_TAG_class_type: 1407 ResolveType(cu_sp.get(), decl_ctx_die); 1408 break; 1409 } 1410 return ResolveType (cu_sp.get(), type_die); 1411 } 1412 } 1413 return NULL; 1414 } 1415 1416 // This function is used when SymbolFileDWARFDebugMap owns a bunch of 1417 // SymbolFileDWARF objects to detect if this DWARF file is the one that 1418 // can resolve a clang_type. 1419 bool 1420 SymbolFileDWARF::HasForwardDeclForClangType (lldb::clang_type_t clang_type) 1421 { 1422 clang_type_t clang_type_no_qualifiers = ClangASTType::RemoveFastQualifiers(clang_type); 1423 const DWARFDebugInfoEntry* die = m_forward_decl_clang_type_to_die.lookup (clang_type_no_qualifiers); 1424 return die != NULL; 1425 } 1426 1427 1428 lldb::clang_type_t 1429 SymbolFileDWARF::ResolveClangOpaqueTypeDefinition (lldb::clang_type_t clang_type) 1430 { 1431 // We have a struct/union/class/enum that needs to be fully resolved. 1432 clang_type_t clang_type_no_qualifiers = ClangASTType::RemoveFastQualifiers(clang_type); 1433 const DWARFDebugInfoEntry* die = m_forward_decl_clang_type_to_die.lookup (clang_type_no_qualifiers); 1434 if (die == NULL) 1435 { 1436 // if (m_debug_map_symfile) 1437 // { 1438 // Type *type = m_die_to_type[die]; 1439 // if (type && type->GetSymbolFile() != this) 1440 // return type->GetClangType(); 1441 // } 1442 // We have already resolved this type... 1443 return clang_type; 1444 } 1445 // Once we start resolving this type, remove it from the forward declaration 1446 // map in case anyone child members or other types require this type to get resolved. 1447 // The type will get resolved when all of the calls to SymbolFileDWARF::ResolveClangOpaqueTypeDefinition 1448 // are done. 1449 m_forward_decl_clang_type_to_die.erase (clang_type_no_qualifiers); 1450 1451 1452 DWARFDebugInfo* debug_info = DebugInfo(); 1453 1454 DWARFCompileUnit *curr_cu = debug_info->GetCompileUnitContainingDIE (die->GetOffset()).get(); 1455 Type *type = m_die_to_type.lookup (die); 1456 1457 const dw_tag_t tag = die->Tag(); 1458 1459 DEBUG_PRINTF ("0x%8.8x: %s (\"%s\") - resolve forward declaration...\n", 1460 die->GetOffset(), 1461 DW_TAG_value_to_name(tag), 1462 type->GetName().AsCString()); 1463 assert (clang_type); 1464 DWARFDebugInfoEntry::Attributes attributes; 1465 1466 ClangASTContext &ast = GetClangASTContext(); 1467 1468 switch (tag) 1469 { 1470 case DW_TAG_structure_type: 1471 case DW_TAG_union_type: 1472 case DW_TAG_class_type: 1473 ast.StartTagDeclarationDefinition (clang_type); 1474 if (die->HasChildren()) 1475 { 1476 LanguageType class_language = eLanguageTypeUnknown; 1477 bool is_objc_class = ClangASTContext::IsObjCClassType (clang_type); 1478 if (is_objc_class) 1479 class_language = eLanguageTypeObjC; 1480 1481 int tag_decl_kind = -1; 1482 AccessType default_accessibility = eAccessNone; 1483 if (tag == DW_TAG_structure_type) 1484 { 1485 tag_decl_kind = clang::TTK_Struct; 1486 default_accessibility = eAccessPublic; 1487 } 1488 else if (tag == DW_TAG_union_type) 1489 { 1490 tag_decl_kind = clang::TTK_Union; 1491 default_accessibility = eAccessPublic; 1492 } 1493 else if (tag == DW_TAG_class_type) 1494 { 1495 tag_decl_kind = clang::TTK_Class; 1496 default_accessibility = eAccessPrivate; 1497 } 1498 1499 SymbolContext sc(GetCompUnitForDWARFCompUnit(curr_cu)); 1500 std::vector<clang::CXXBaseSpecifier *> base_classes; 1501 std::vector<int> member_accessibilities; 1502 bool is_a_class = false; 1503 // Parse members and base classes first 1504 DWARFDIECollection member_function_dies; 1505 1506 ParseChildMembers (sc, 1507 curr_cu, 1508 die, 1509 clang_type, 1510 class_language, 1511 base_classes, 1512 member_accessibilities, 1513 member_function_dies, 1514 default_accessibility, 1515 is_a_class); 1516 1517 // Now parse any methods if there were any... 1518 size_t num_functions = member_function_dies.Size(); 1519 if (num_functions > 0) 1520 { 1521 for (size_t i=0; i<num_functions; ++i) 1522 { 1523 ResolveType(curr_cu, member_function_dies.GetDIEPtrAtIndex(i)); 1524 } 1525 } 1526 1527 if (class_language == eLanguageTypeObjC) 1528 { 1529 std::string class_str (ClangASTType::GetTypeNameForOpaqueQualType(clang_type)); 1530 if (!class_str.empty()) 1531 { 1532 1533 ConstString class_name (class_str.c_str()); 1534 DIEArray method_die_offsets; 1535 if (m_objc_class_selectors_index.Find (class_name, method_die_offsets)) 1536 { 1537 DWARFDebugInfo* debug_info = DebugInfo(); 1538 1539 DWARFCompileUnit* method_cu = NULL; 1540 const size_t num_matches = method_die_offsets.size(); 1541 for (size_t i=0; i<num_matches; ++i) 1542 { 1543 const dw_offset_t die_offset = method_die_offsets[i]; 1544 DWARFDebugInfoEntry *method_die = debug_info->GetDIEPtrWithCompileUnitHint (die_offset, &method_cu); 1545 1546 ResolveType (method_cu, method_die); 1547 } 1548 } 1549 } 1550 } 1551 1552 // If we have a DW_TAG_structure_type instead of a DW_TAG_class_type we 1553 // need to tell the clang type it is actually a class. 1554 if (class_language != eLanguageTypeObjC) 1555 { 1556 if (is_a_class && tag_decl_kind != clang::TTK_Class) 1557 ast.SetTagTypeKind (clang_type, clang::TTK_Class); 1558 } 1559 1560 // Since DW_TAG_structure_type gets used for both classes 1561 // and structures, we may need to set any DW_TAG_member 1562 // fields to have a "private" access if none was specified. 1563 // When we parsed the child members we tracked that actual 1564 // accessibility value for each DW_TAG_member in the 1565 // "member_accessibilities" array. If the value for the 1566 // member is zero, then it was set to the "default_accessibility" 1567 // which for structs was "public". Below we correct this 1568 // by setting any fields to "private" that weren't correctly 1569 // set. 1570 if (is_a_class && !member_accessibilities.empty()) 1571 { 1572 // This is a class and all members that didn't have 1573 // their access specified are private. 1574 ast.SetDefaultAccessForRecordFields (clang_type, 1575 eAccessPrivate, 1576 &member_accessibilities.front(), 1577 member_accessibilities.size()); 1578 } 1579 1580 if (!base_classes.empty()) 1581 { 1582 ast.SetBaseClassesForClassType (clang_type, 1583 &base_classes.front(), 1584 base_classes.size()); 1585 1586 // Clang will copy each CXXBaseSpecifier in "base_classes" 1587 // so we have to free them all. 1588 ClangASTContext::DeleteBaseClassSpecifiers (&base_classes.front(), 1589 base_classes.size()); 1590 } 1591 1592 } 1593 ast.CompleteTagDeclarationDefinition (clang_type); 1594 return clang_type; 1595 1596 case DW_TAG_enumeration_type: 1597 ast.StartTagDeclarationDefinition (clang_type); 1598 if (die->HasChildren()) 1599 { 1600 SymbolContext sc(GetCompUnitForDWARFCompUnit(curr_cu)); 1601 ParseChildEnumerators(sc, clang_type, type->GetByteSize(), curr_cu, die); 1602 } 1603 ast.CompleteTagDeclarationDefinition (clang_type); 1604 return clang_type; 1605 1606 default: 1607 assert(false && "not a forward clang type decl!"); 1608 break; 1609 } 1610 return NULL; 1611 } 1612 1613 Type* 1614 SymbolFileDWARF::ResolveType (DWARFCompileUnit* curr_cu, const DWARFDebugInfoEntry* type_die, bool assert_not_being_parsed) 1615 { 1616 if (type_die != NULL) 1617 { 1618 Type *type = m_die_to_type.lookup (type_die); 1619 if (type == NULL) 1620 type = GetTypeForDIE (curr_cu, type_die).get(); 1621 if (assert_not_being_parsed) 1622 assert (type != DIE_IS_BEING_PARSED); 1623 return type; 1624 } 1625 return NULL; 1626 } 1627 1628 CompileUnit* 1629 SymbolFileDWARF::GetCompUnitForDWARFCompUnit (DWARFCompileUnit* curr_cu, uint32_t cu_idx) 1630 { 1631 // Check if the symbol vendor already knows about this compile unit? 1632 if (curr_cu->GetUserData() == NULL) 1633 { 1634 // The symbol vendor doesn't know about this compile unit, we 1635 // need to parse and add it to the symbol vendor object. 1636 CompUnitSP dc_cu; 1637 ParseCompileUnit(curr_cu, dc_cu); 1638 if (dc_cu.get()) 1639 { 1640 // Figure out the compile unit index if we weren't given one 1641 if (cu_idx == UINT32_MAX) 1642 DebugInfo()->GetCompileUnit(curr_cu->GetOffset(), &cu_idx); 1643 1644 m_obj_file->GetModule()->GetSymbolVendor()->SetCompileUnitAtIndex(dc_cu, cu_idx); 1645 1646 if (m_debug_map_symfile) 1647 m_debug_map_symfile->SetCompileUnit(this, dc_cu); 1648 } 1649 } 1650 return (CompileUnit*)curr_cu->GetUserData(); 1651 } 1652 1653 bool 1654 SymbolFileDWARF::GetFunction (DWARFCompileUnit* curr_cu, const DWARFDebugInfoEntry* func_die, SymbolContext& sc) 1655 { 1656 sc.Clear(); 1657 // Check if the symbol vendor already knows about this compile unit? 1658 sc.comp_unit = GetCompUnitForDWARFCompUnit(curr_cu, UINT32_MAX); 1659 1660 sc.function = sc.comp_unit->FindFunctionByUID (func_die->GetOffset()).get(); 1661 if (sc.function == NULL) 1662 sc.function = ParseCompileUnitFunction(sc, curr_cu, func_die); 1663 1664 if (sc.function) 1665 { 1666 sc.module_sp = sc.function->CalculateSymbolContextModule(); 1667 return true; 1668 } 1669 1670 return false; 1671 } 1672 1673 uint32_t 1674 SymbolFileDWARF::ResolveSymbolContext (const Address& so_addr, uint32_t resolve_scope, SymbolContext& sc) 1675 { 1676 Timer scoped_timer(__PRETTY_FUNCTION__, 1677 "SymbolFileDWARF::ResolveSymbolContext (so_addr = { section = %p, offset = 0x%llx }, resolve_scope = 0x%8.8x)", 1678 so_addr.GetSection(), 1679 so_addr.GetOffset(), 1680 resolve_scope); 1681 uint32_t resolved = 0; 1682 if (resolve_scope & ( eSymbolContextCompUnit | 1683 eSymbolContextFunction | 1684 eSymbolContextBlock | 1685 eSymbolContextLineEntry)) 1686 { 1687 lldb::addr_t file_vm_addr = so_addr.GetFileAddress(); 1688 1689 DWARFDebugInfo* debug_info = DebugInfo(); 1690 if (debug_info) 1691 { 1692 dw_offset_t cu_offset = debug_info->GetCompileUnitAranges().FindAddress(file_vm_addr); 1693 if (cu_offset != DW_INVALID_OFFSET) 1694 { 1695 uint32_t cu_idx; 1696 DWARFCompileUnit* curr_cu = debug_info->GetCompileUnit(cu_offset, &cu_idx).get(); 1697 if (curr_cu) 1698 { 1699 sc.comp_unit = GetCompUnitForDWARFCompUnit(curr_cu, cu_idx); 1700 assert(sc.comp_unit != NULL); 1701 resolved |= eSymbolContextCompUnit; 1702 1703 if (resolve_scope & eSymbolContextLineEntry) 1704 { 1705 LineTable *line_table = sc.comp_unit->GetLineTable(); 1706 if (line_table == NULL) 1707 { 1708 if (ParseCompileUnitLineTable(sc)) 1709 line_table = sc.comp_unit->GetLineTable(); 1710 } 1711 if (line_table != NULL) 1712 { 1713 if (so_addr.IsLinkedAddress()) 1714 { 1715 Address linked_addr (so_addr); 1716 linked_addr.ResolveLinkedAddress(); 1717 if (line_table->FindLineEntryByAddress (linked_addr, sc.line_entry)) 1718 { 1719 resolved |= eSymbolContextLineEntry; 1720 } 1721 } 1722 else if (line_table->FindLineEntryByAddress (so_addr, sc.line_entry)) 1723 { 1724 resolved |= eSymbolContextLineEntry; 1725 } 1726 } 1727 } 1728 1729 if (resolve_scope & (eSymbolContextFunction | eSymbolContextBlock)) 1730 { 1731 DWARFDebugInfoEntry *function_die = NULL; 1732 DWARFDebugInfoEntry *block_die = NULL; 1733 if (resolve_scope & eSymbolContextBlock) 1734 { 1735 curr_cu->LookupAddress(file_vm_addr, &function_die, &block_die); 1736 } 1737 else 1738 { 1739 curr_cu->LookupAddress(file_vm_addr, &function_die, NULL); 1740 } 1741 1742 if (function_die != NULL) 1743 { 1744 sc.function = sc.comp_unit->FindFunctionByUID (function_die->GetOffset()).get(); 1745 if (sc.function == NULL) 1746 sc.function = ParseCompileUnitFunction(sc, curr_cu, function_die); 1747 } 1748 1749 if (sc.function != NULL) 1750 { 1751 resolved |= eSymbolContextFunction; 1752 1753 if (resolve_scope & eSymbolContextBlock) 1754 { 1755 Block& block = sc.function->GetBlock (true); 1756 1757 if (block_die != NULL) 1758 sc.block = block.FindBlockByID (block_die->GetOffset()); 1759 else 1760 sc.block = block.FindBlockByID (function_die->GetOffset()); 1761 if (sc.block) 1762 resolved |= eSymbolContextBlock; 1763 } 1764 } 1765 } 1766 } 1767 } 1768 } 1769 } 1770 return resolved; 1771 } 1772 1773 1774 1775 uint32_t 1776 SymbolFileDWARF::ResolveSymbolContext(const FileSpec& file_spec, uint32_t line, bool check_inlines, uint32_t resolve_scope, SymbolContextList& sc_list) 1777 { 1778 const uint32_t prev_size = sc_list.GetSize(); 1779 if (resolve_scope & eSymbolContextCompUnit) 1780 { 1781 DWARFDebugInfo* debug_info = DebugInfo(); 1782 if (debug_info) 1783 { 1784 uint32_t cu_idx; 1785 DWARFCompileUnit* curr_cu = NULL; 1786 1787 for (cu_idx = 0; (curr_cu = debug_info->GetCompileUnitAtIndex(cu_idx)) != NULL; ++cu_idx) 1788 { 1789 CompileUnit *dc_cu = GetCompUnitForDWARFCompUnit(curr_cu, cu_idx); 1790 bool file_spec_matches_cu_file_spec = dc_cu != NULL && FileSpec::Compare(file_spec, *dc_cu, false) == 0; 1791 if (check_inlines || file_spec_matches_cu_file_spec) 1792 { 1793 SymbolContext sc (m_obj_file->GetModule()); 1794 sc.comp_unit = GetCompUnitForDWARFCompUnit(curr_cu, cu_idx); 1795 assert(sc.comp_unit != NULL); 1796 1797 uint32_t file_idx = UINT32_MAX; 1798 1799 // If we are looking for inline functions only and we don't 1800 // find it in the support files, we are done. 1801 if (check_inlines) 1802 { 1803 file_idx = sc.comp_unit->GetSupportFiles().FindFileIndex (1, file_spec, true); 1804 if (file_idx == UINT32_MAX) 1805 continue; 1806 } 1807 1808 if (line != 0) 1809 { 1810 LineTable *line_table = sc.comp_unit->GetLineTable(); 1811 1812 if (line_table != NULL && line != 0) 1813 { 1814 // We will have already looked up the file index if 1815 // we are searching for inline entries. 1816 if (!check_inlines) 1817 file_idx = sc.comp_unit->GetSupportFiles().FindFileIndex (1, file_spec, true); 1818 1819 if (file_idx != UINT32_MAX) 1820 { 1821 uint32_t found_line; 1822 uint32_t line_idx = line_table->FindLineEntryIndexByFileIndex (0, file_idx, line, false, &sc.line_entry); 1823 found_line = sc.line_entry.line; 1824 1825 while (line_idx != UINT32_MAX) 1826 { 1827 sc.function = NULL; 1828 sc.block = NULL; 1829 if (resolve_scope & (eSymbolContextFunction | eSymbolContextBlock)) 1830 { 1831 const lldb::addr_t file_vm_addr = sc.line_entry.range.GetBaseAddress().GetFileAddress(); 1832 if (file_vm_addr != LLDB_INVALID_ADDRESS) 1833 { 1834 DWARFDebugInfoEntry *function_die = NULL; 1835 DWARFDebugInfoEntry *block_die = NULL; 1836 curr_cu->LookupAddress(file_vm_addr, &function_die, resolve_scope & eSymbolContextBlock ? &block_die : NULL); 1837 1838 if (function_die != NULL) 1839 { 1840 sc.function = sc.comp_unit->FindFunctionByUID (function_die->GetOffset()).get(); 1841 if (sc.function == NULL) 1842 sc.function = ParseCompileUnitFunction(sc, curr_cu, function_die); 1843 } 1844 1845 if (sc.function != NULL) 1846 { 1847 Block& block = sc.function->GetBlock (true); 1848 1849 if (block_die != NULL) 1850 sc.block = block.FindBlockByID (block_die->GetOffset()); 1851 else 1852 sc.block = block.FindBlockByID (function_die->GetOffset()); 1853 } 1854 } 1855 } 1856 1857 sc_list.Append(sc); 1858 line_idx = line_table->FindLineEntryIndexByFileIndex (line_idx + 1, file_idx, found_line, true, &sc.line_entry); 1859 } 1860 } 1861 } 1862 else if (file_spec_matches_cu_file_spec && !check_inlines) 1863 { 1864 // only append the context if we aren't looking for inline call sites 1865 // by file and line and if the file spec matches that of the compile unit 1866 sc_list.Append(sc); 1867 } 1868 } 1869 else if (file_spec_matches_cu_file_spec && !check_inlines) 1870 { 1871 // only append the context if we aren't looking for inline call sites 1872 // by file and line and if the file spec matches that of the compile unit 1873 sc_list.Append(sc); 1874 } 1875 1876 if (!check_inlines) 1877 break; 1878 } 1879 } 1880 } 1881 } 1882 return sc_list.GetSize() - prev_size; 1883 } 1884 1885 void 1886 SymbolFileDWARF::Index () 1887 { 1888 if (m_indexed) 1889 return; 1890 m_indexed = true; 1891 Timer scoped_timer (__PRETTY_FUNCTION__, 1892 "SymbolFileDWARF::Index (%s)", 1893 GetObjectFile()->GetFileSpec().GetFilename().AsCString()); 1894 1895 DWARFDebugInfo* debug_info = DebugInfo(); 1896 if (debug_info) 1897 { 1898 uint32_t cu_idx = 0; 1899 const uint32_t num_compile_units = GetNumCompileUnits(); 1900 for (cu_idx = 0; cu_idx < num_compile_units; ++cu_idx) 1901 { 1902 DWARFCompileUnit* curr_cu = debug_info->GetCompileUnitAtIndex(cu_idx); 1903 1904 bool clear_dies = curr_cu->ExtractDIEsIfNeeded (false) > 1; 1905 1906 curr_cu->Index (cu_idx, 1907 m_function_basename_index, 1908 m_function_fullname_index, 1909 m_function_method_index, 1910 m_function_selector_index, 1911 m_objc_class_selectors_index, 1912 m_global_index, 1913 m_type_index, 1914 m_namespace_index); 1915 1916 // Keep memory down by clearing DIEs if this generate function 1917 // caused them to be parsed 1918 if (clear_dies) 1919 curr_cu->ClearDIEs (true); 1920 } 1921 1922 m_function_basename_index.Finalize(); 1923 m_function_fullname_index.Finalize(); 1924 m_function_method_index.Finalize(); 1925 m_function_selector_index.Finalize(); 1926 m_objc_class_selectors_index.Finalize(); 1927 m_global_index.Finalize(); 1928 m_type_index.Finalize(); 1929 m_namespace_index.Finalize(); 1930 1931 #if defined (ENABLE_DEBUG_PRINTF) 1932 StreamFile s(stdout, false); 1933 s.Printf ("DWARF index for '%s/%s':", 1934 GetObjectFile()->GetFileSpec().GetDirectory().AsCString(), 1935 GetObjectFile()->GetFileSpec().GetFilename().AsCString()); 1936 s.Printf("\nFunction basenames:\n"); m_function_basename_index.Dump (&s); 1937 s.Printf("\nFunction fullnames:\n"); m_function_fullname_index.Dump (&s); 1938 s.Printf("\nFunction methods:\n"); m_function_method_index.Dump (&s); 1939 s.Printf("\nFunction selectors:\n"); m_function_selector_index.Dump (&s); 1940 s.Printf("\nObjective C class selectors:\n"); m_objc_class_selectors_index.Dump (&s); 1941 s.Printf("\nGlobals and statics:\n"); m_global_index.Dump (&s); 1942 s.Printf("\nTypes:\n"); m_type_index.Dump (&s); 1943 s.Printf("\nNamepaces:\n"); m_namespace_index.Dump (&s); 1944 #endif 1945 } 1946 } 1947 1948 uint32_t 1949 SymbolFileDWARF::FindGlobalVariables (const ConstString &name, bool append, uint32_t max_matches, VariableList& variables) 1950 { 1951 LogSP log (LogChannelDWARF::GetLogIfAll(DWARF_LOG_LOOKUPS)); 1952 1953 if (log) 1954 { 1955 log->Printf ("SymbolFileDWARF::FindGlobalVariables (file=\"%s/%s\", name=\"%s\", append=%u, max_matches=%u, variables)", 1956 m_obj_file->GetFileSpec().GetDirectory().GetCString(), 1957 m_obj_file->GetFileSpec().GetFilename().GetCString(), 1958 name.GetCString(), append, max_matches); 1959 } 1960 DWARFDebugInfo* info = DebugInfo(); 1961 if (info == NULL) 1962 return 0; 1963 1964 // If we aren't appending the results to this list, then clear the list 1965 if (!append) 1966 variables.Clear(); 1967 1968 // Remember how many variables are in the list before we search in case 1969 // we are appending the results to a variable list. 1970 const uint32_t original_size = variables.GetSize(); 1971 1972 DIEArray die_offsets; 1973 1974 if (m_apple_names_ap.get()) 1975 { 1976 const char *name_cstr = name.GetCString(); 1977 const char *base_name_start; 1978 const char *base_name_end = NULL; 1979 1980 if (!CPPLanguageRuntime::StripNamespacesFromVariableName(name_cstr, base_name_start, base_name_end)) 1981 base_name_start = name_cstr; 1982 1983 m_apple_names_ap->FindByName (base_name_start, die_offsets); 1984 } 1985 else 1986 { 1987 // Index the DWARF if we haven't already 1988 if (!m_indexed) 1989 Index (); 1990 1991 m_global_index.Find (name, die_offsets); 1992 } 1993 1994 const size_t num_matches = die_offsets.size(); 1995 if (num_matches) 1996 { 1997 SymbolContext sc; 1998 sc.module_sp = m_obj_file->GetModule(); 1999 assert (sc.module_sp); 2000 2001 DWARFDebugInfo* debug_info = DebugInfo(); 2002 DWARFCompileUnit* dwarf_cu = NULL; 2003 const DWARFDebugInfoEntry* die = NULL; 2004 for (size_t i=0; i<num_matches; ++i) 2005 { 2006 const dw_offset_t die_offset = die_offsets[i]; 2007 die = debug_info->GetDIEPtrWithCompileUnitHint (die_offset, &dwarf_cu); 2008 2009 sc.comp_unit = GetCompUnitForDWARFCompUnit(dwarf_cu, UINT32_MAX); 2010 assert(sc.comp_unit != NULL); 2011 2012 ParseVariables(sc, dwarf_cu, LLDB_INVALID_ADDRESS, die, false, false, &variables); 2013 2014 if (variables.GetSize() - original_size >= max_matches) 2015 break; 2016 } 2017 } 2018 2019 // Return the number of variable that were appended to the list 2020 return variables.GetSize() - original_size; 2021 } 2022 2023 uint32_t 2024 SymbolFileDWARF::FindGlobalVariables(const RegularExpression& regex, bool append, uint32_t max_matches, VariableList& variables) 2025 { 2026 LogSP log (LogChannelDWARF::GetLogIfAll(DWARF_LOG_LOOKUPS)); 2027 2028 if (log) 2029 { 2030 log->Printf ("SymbolFileDWARF::FindGlobalVariables (file=\"%s/%s\", regex=\"%s\", append=%u, max_matches=%u, variables)", 2031 m_obj_file->GetFileSpec().GetDirectory().GetCString(), 2032 m_obj_file->GetFileSpec().GetFilename().GetCString(), 2033 regex.GetText(), append, max_matches); 2034 } 2035 2036 DWARFDebugInfo* info = DebugInfo(); 2037 if (info == NULL) 2038 return 0; 2039 2040 // If we aren't appending the results to this list, then clear the list 2041 if (!append) 2042 variables.Clear(); 2043 2044 // Remember how many variables are in the list before we search in case 2045 // we are appending the results to a variable list. 2046 const uint32_t original_size = variables.GetSize(); 2047 2048 DIEArray die_offsets; 2049 2050 if (m_apple_names_ap.get()) 2051 { 2052 m_apple_names_ap->AppendAllDIEsThatMatchingRegex (regex, die_offsets); 2053 } 2054 else 2055 { 2056 // Index the DWARF if we haven't already 2057 if (!m_indexed) 2058 Index (); 2059 2060 m_global_index.Find (regex, die_offsets); 2061 } 2062 2063 SymbolContext sc; 2064 sc.module_sp = m_obj_file->GetModule(); 2065 assert (sc.module_sp); 2066 2067 DWARFCompileUnit* dwarf_cu = NULL; 2068 const DWARFDebugInfoEntry* die = NULL; 2069 const size_t num_matches = die_offsets.size(); 2070 if (num_matches) 2071 { 2072 DWARFDebugInfo* debug_info = DebugInfo(); 2073 for (size_t i=0; i<num_matches; ++i) 2074 { 2075 const dw_offset_t die_offset = die_offsets[i]; 2076 die = debug_info->GetDIEPtrWithCompileUnitHint (die_offset, &dwarf_cu); 2077 sc.comp_unit = GetCompUnitForDWARFCompUnit(dwarf_cu, UINT32_MAX); 2078 2079 ParseVariables(sc, dwarf_cu, LLDB_INVALID_ADDRESS, die, false, false, &variables); 2080 2081 if (variables.GetSize() - original_size >= max_matches) 2082 break; 2083 } 2084 } 2085 2086 // Return the number of variable that were appended to the list 2087 return variables.GetSize() - original_size; 2088 } 2089 2090 bool 2091 SymbolFileDWARF::ResolveFunction (dw_offset_t die_offset, 2092 DWARFCompileUnit *&dwarf_cu, 2093 SymbolContextList& sc_list) 2094 { 2095 SymbolContext sc; 2096 2097 DWARFDebugInfo* info = DebugInfo(); 2098 bool resolved_it = false; 2099 2100 if (info == NULL) 2101 return resolved_it; 2102 2103 DWARFDebugInfoEntry *die = info->GetDIEPtrWithCompileUnitHint (die_offset, &dwarf_cu); 2104 2105 // If we were passed a die that is not a function, just return false... 2106 if (die->Tag() != DW_TAG_subprogram && die->Tag() != DW_TAG_inlined_subroutine) 2107 return false; 2108 2109 const DWARFDebugInfoEntry* inlined_die = NULL; 2110 if (die->Tag() == DW_TAG_inlined_subroutine) 2111 { 2112 inlined_die = die; 2113 2114 while ((die = die->GetParent()) != NULL) 2115 { 2116 if (die->Tag() == DW_TAG_subprogram) 2117 break; 2118 } 2119 } 2120 assert (die->Tag() == DW_TAG_subprogram); 2121 if (GetFunction (dwarf_cu, die, sc)) 2122 { 2123 Address addr; 2124 // Parse all blocks if needed 2125 if (inlined_die) 2126 { 2127 sc.block = sc.function->GetBlock (true).FindBlockByID (inlined_die->GetOffset()); 2128 assert (sc.block != NULL); 2129 if (sc.block->GetStartAddress (addr) == false) 2130 addr.Clear(); 2131 } 2132 else 2133 { 2134 sc.block = NULL; 2135 addr = sc.function->GetAddressRange().GetBaseAddress(); 2136 } 2137 2138 if (addr.IsValid()) 2139 { 2140 2141 // We found the function, so we should find the line table 2142 // and line table entry as well 2143 LineTable *line_table = sc.comp_unit->GetLineTable(); 2144 if (line_table == NULL) 2145 { 2146 if (ParseCompileUnitLineTable(sc)) 2147 line_table = sc.comp_unit->GetLineTable(); 2148 } 2149 if (line_table != NULL) 2150 line_table->FindLineEntryByAddress (addr, sc.line_entry); 2151 2152 sc_list.Append(sc); 2153 resolved_it = true; 2154 } 2155 } 2156 2157 return resolved_it; 2158 } 2159 2160 void 2161 SymbolFileDWARF::FindFunctions (const ConstString &name, 2162 const NameToDIE &name_to_die, 2163 SymbolContextList& sc_list) 2164 { 2165 DIEArray die_offsets; 2166 if (name_to_die.Find (name, die_offsets)) 2167 { 2168 ParseFunctions (die_offsets, sc_list); 2169 } 2170 } 2171 2172 2173 void 2174 SymbolFileDWARF::FindFunctions (const RegularExpression ®ex, 2175 const NameToDIE &name_to_die, 2176 SymbolContextList& sc_list) 2177 { 2178 DIEArray die_offsets; 2179 if (name_to_die.Find (regex, die_offsets)) 2180 { 2181 ParseFunctions (die_offsets, sc_list); 2182 } 2183 } 2184 2185 2186 void 2187 SymbolFileDWARF::FindFunctions (const RegularExpression ®ex, 2188 const DWARFMappedHash::MemoryTable &memory_table, 2189 SymbolContextList& sc_list) 2190 { 2191 DIEArray die_offsets; 2192 if (memory_table.AppendAllDIEsThatMatchingRegex (regex, die_offsets)) 2193 { 2194 ParseFunctions (die_offsets, sc_list); 2195 } 2196 } 2197 2198 void 2199 SymbolFileDWARF::ParseFunctions (const DIEArray &die_offsets, 2200 SymbolContextList& sc_list) 2201 { 2202 const size_t num_matches = die_offsets.size(); 2203 if (num_matches) 2204 { 2205 SymbolContext sc; 2206 2207 DWARFCompileUnit* dwarf_cu = NULL; 2208 for (size_t i=0; i<num_matches; ++i) 2209 { 2210 const dw_offset_t die_offset = die_offsets[i]; 2211 ResolveFunction (die_offset, dwarf_cu, sc_list); 2212 } 2213 } 2214 } 2215 2216 bool 2217 SymbolFileDWARF::FunctionDieMatchesPartialName (const DWARFDebugInfoEntry* die, 2218 const DWARFCompileUnit *dwarf_cu, 2219 uint32_t name_type_mask, 2220 const char *partial_name, 2221 const char *base_name_start, 2222 const char *base_name_end) 2223 { 2224 // If we are looking only for methods, throw away all the ones that aren't in C++ classes: 2225 if (name_type_mask == eFunctionNameTypeMethod 2226 || name_type_mask == eFunctionNameTypeBase) 2227 { 2228 clang::DeclContext *containing_decl_ctx = GetClangDeclContextContainingDIEOffset(die->GetOffset()); 2229 if (!containing_decl_ctx) 2230 return false; 2231 2232 bool is_cxx_method = (containing_decl_ctx->getDeclKind() == clang::Decl::CXXRecord); 2233 2234 if (!is_cxx_method && name_type_mask == eFunctionNameTypeMethod) 2235 return false; 2236 if (is_cxx_method && name_type_mask == eFunctionNameTypeBase) 2237 return false; 2238 } 2239 2240 // Now we need to check whether the name we got back for this type matches the extra specifications 2241 // that were in the name we're looking up: 2242 if (base_name_start != partial_name || *base_name_end != '\0') 2243 { 2244 // First see if the stuff to the left matches the full name. To do that let's see if 2245 // we can pull out the mips linkage name attribute: 2246 2247 Mangled best_name; 2248 2249 DWARFDebugInfoEntry::Attributes attributes; 2250 die->GetAttributes(this, dwarf_cu, NULL, attributes); 2251 uint32_t idx = attributes.FindAttributeIndex(DW_AT_MIPS_linkage_name); 2252 if (idx != UINT32_MAX) 2253 { 2254 DWARFFormValue form_value; 2255 if (attributes.ExtractFormValueAtIndex(this, idx, form_value)) 2256 { 2257 const char *name = form_value.AsCString(&get_debug_str_data()); 2258 best_name.SetValue (name, true); 2259 } 2260 } 2261 if (best_name) 2262 { 2263 const char *demangled = best_name.GetDemangledName().GetCString(); 2264 if (demangled) 2265 { 2266 std::string name_no_parens(partial_name, base_name_end - partial_name); 2267 if (strstr (demangled, name_no_parens.c_str()) == NULL) 2268 return false; 2269 } 2270 } 2271 } 2272 2273 return true; 2274 } 2275 2276 uint32_t 2277 SymbolFileDWARF::FindFunctions (const ConstString &name, 2278 uint32_t name_type_mask, 2279 bool append, 2280 SymbolContextList& sc_list) 2281 { 2282 Timer scoped_timer (__PRETTY_FUNCTION__, 2283 "SymbolFileDWARF::FindFunctions (name = '%s')", 2284 name.AsCString()); 2285 2286 LogSP log (LogChannelDWARF::GetLogIfAll(DWARF_LOG_LOOKUPS)); 2287 2288 if (log) 2289 { 2290 log->Printf ("SymbolFileDWARF::FindFunctions (file=\"%s/%s\", name=\"%s\", name_type_mask=0x%x, append=%u, sc_list)", 2291 m_obj_file->GetFileSpec().GetDirectory().GetCString(), 2292 m_obj_file->GetFileSpec().GetFilename().GetCString(), 2293 name.GetCString(), name_type_mask, append); 2294 } 2295 2296 // If we aren't appending the results to this list, then clear the list 2297 if (!append) 2298 sc_list.Clear(); 2299 2300 // If name is empty then we won't find anything. 2301 if (name.IsEmpty()) 2302 return 0; 2303 2304 // Remember how many sc_list are in the list before we search in case 2305 // we are appending the results to a variable list. 2306 2307 const uint32_t original_size = sc_list.GetSize(); 2308 2309 const char *name_cstr = name.GetCString(); 2310 uint32_t effective_name_type_mask = eFunctionNameTypeNone; 2311 const char *base_name_start = name_cstr; 2312 const char *base_name_end = name_cstr + strlen(name_cstr); 2313 2314 if (name_type_mask & eFunctionNameTypeAuto) 2315 { 2316 if (CPPLanguageRuntime::IsCPPMangledName (name_cstr)) 2317 effective_name_type_mask = eFunctionNameTypeFull; 2318 else if (ObjCLanguageRuntime::IsPossibleObjCMethodName (name_cstr)) 2319 effective_name_type_mask = eFunctionNameTypeFull; 2320 else 2321 { 2322 if (ObjCLanguageRuntime::IsPossibleObjCSelector(name_cstr)) 2323 effective_name_type_mask |= eFunctionNameTypeSelector; 2324 2325 if (CPPLanguageRuntime::IsPossibleCPPCall(name_cstr, base_name_start, base_name_end)) 2326 effective_name_type_mask |= (eFunctionNameTypeMethod | eFunctionNameTypeBase); 2327 } 2328 } 2329 else 2330 { 2331 effective_name_type_mask = name_type_mask; 2332 if (effective_name_type_mask & eFunctionNameTypeMethod || name_type_mask & eFunctionNameTypeBase) 2333 { 2334 // If they've asked for a CPP method or function name and it can't be that, we don't 2335 // even need to search for CPP methods or names. 2336 if (!CPPLanguageRuntime::IsPossibleCPPCall(name_cstr, base_name_start, base_name_end)) 2337 { 2338 effective_name_type_mask &= ~(eFunctionNameTypeMethod | eFunctionNameTypeBase); 2339 if (effective_name_type_mask == eFunctionNameTypeNone) 2340 return 0; 2341 } 2342 } 2343 2344 if (effective_name_type_mask & eFunctionNameTypeSelector) 2345 { 2346 if (!ObjCLanguageRuntime::IsPossibleObjCSelector(name_cstr)) 2347 { 2348 effective_name_type_mask &= ~(eFunctionNameTypeSelector); 2349 if (effective_name_type_mask == eFunctionNameTypeNone) 2350 return 0; 2351 } 2352 } 2353 } 2354 2355 DWARFDebugInfo* info = DebugInfo(); 2356 if (info == NULL) 2357 return 0; 2358 2359 if (m_apple_names_ap.get()) 2360 { 2361 DIEArray die_offsets; 2362 2363 uint32_t num_matches = 0; 2364 2365 if (effective_name_type_mask & eFunctionNameTypeFull) 2366 { 2367 // If they asked for the full name, match what they typed. At some point we may 2368 // want to canonicalize this (strip double spaces, etc. For now, we just add all the 2369 // dies that we find by exact match. 2370 DWARFCompileUnit *dwarf_cu = NULL; 2371 num_matches = m_apple_names_ap->FindByName (name_cstr, die_offsets); 2372 for (uint32_t i = 0; i < num_matches; i++) 2373 ResolveFunction (die_offsets[i], dwarf_cu, sc_list); 2374 } 2375 else 2376 { 2377 DWARFCompileUnit* dwarf_cu = NULL; 2378 2379 if (effective_name_type_mask & eFunctionNameTypeSelector) 2380 { 2381 num_matches = m_apple_names_ap->FindByName (name_cstr, die_offsets); 2382 // Now make sure these are actually ObjC methods. In this case we can simply look up the name, 2383 // and if it is an ObjC method name, we're good. 2384 2385 for (uint32_t i = 0; i < num_matches; i++) 2386 { 2387 const DWARFDebugInfoEntry* die = info->GetDIEPtrWithCompileUnitHint (die_offsets[i], &dwarf_cu); 2388 assert (die); 2389 2390 const char *die_name = die->GetName(this, dwarf_cu); 2391 if (ObjCLanguageRuntime::IsPossibleObjCMethodName(die_name)) 2392 ResolveFunction (die_offsets[i], dwarf_cu, sc_list); 2393 } 2394 die_offsets.clear(); 2395 } 2396 2397 if (effective_name_type_mask & eFunctionNameTypeMethod 2398 || effective_name_type_mask & eFunctionNameTypeBase) 2399 { 2400 // The apple_names table stores just the "base name" of C++ methods in the table. So we have to 2401 // extract the base name, look that up, and if there is any other information in the name we were 2402 // passed in we have to post-filter based on that. 2403 2404 // FIXME: Arrange the logic above so that we don't calculate the base name twice: 2405 std::string base_name(base_name_start, base_name_end - base_name_start); 2406 num_matches = m_apple_names_ap->FindByName (base_name.c_str(), die_offsets); 2407 2408 for (uint32_t i = 0; i < num_matches; i++) 2409 { 2410 dw_offset_t offset = die_offsets[i]; 2411 const DWARFDebugInfoEntry* die = info->GetDIEPtrWithCompileUnitHint (offset, &dwarf_cu); 2412 assert (die); 2413 if (!FunctionDieMatchesPartialName(die, 2414 dwarf_cu, 2415 effective_name_type_mask, 2416 name_cstr, 2417 base_name_start, 2418 base_name_end)) 2419 continue; 2420 2421 // If we get to here, the die is good, and we should add it: 2422 ResolveFunction (offset, dwarf_cu, sc_list); 2423 } 2424 die_offsets.clear(); 2425 } 2426 } 2427 } 2428 else 2429 { 2430 2431 // Index the DWARF if we haven't already 2432 if (!m_indexed) 2433 Index (); 2434 2435 if (name_type_mask & eFunctionNameTypeFull) 2436 FindFunctions (name, m_function_fullname_index, sc_list); 2437 2438 std::string base_name(base_name_start, base_name_end - base_name_start); 2439 ConstString base_name_const(base_name.c_str()); 2440 DIEArray die_offsets; 2441 DWARFCompileUnit *dwarf_cu = NULL; 2442 2443 if (effective_name_type_mask & eFunctionNameTypeBase) 2444 { 2445 uint32_t num_base = m_function_basename_index.Find(base_name_const, die_offsets); 2446 { 2447 for (uint32_t i = 0; i < num_base; i++) 2448 { 2449 dw_offset_t offset = die_offsets[i]; 2450 const DWARFDebugInfoEntry* die = info->GetDIEPtrWithCompileUnitHint (offset, &dwarf_cu); 2451 assert (die); 2452 if (!FunctionDieMatchesPartialName(die, 2453 dwarf_cu, 2454 effective_name_type_mask, 2455 name_cstr, 2456 base_name_start, 2457 base_name_end)) 2458 continue; 2459 2460 // If we get to here, the die is good, and we should add it: 2461 ResolveFunction (offset, dwarf_cu, sc_list); 2462 } 2463 } 2464 die_offsets.clear(); 2465 } 2466 2467 if (effective_name_type_mask & eFunctionNameTypeMethod) 2468 { 2469 uint32_t num_base = m_function_method_index.Find(base_name_const, die_offsets); 2470 { 2471 for (uint32_t i = 0; i < num_base; i++) 2472 { 2473 dw_offset_t offset = die_offsets[i]; 2474 const DWARFDebugInfoEntry* die = info->GetDIEPtrWithCompileUnitHint (offset, &dwarf_cu); 2475 assert (die); 2476 if (!FunctionDieMatchesPartialName(die, 2477 dwarf_cu, 2478 effective_name_type_mask, 2479 name_cstr, 2480 base_name_start, 2481 base_name_end)) 2482 continue; 2483 2484 // If we get to here, the die is good, and we should add it: 2485 ResolveFunction (offset, dwarf_cu, sc_list); 2486 } 2487 } 2488 die_offsets.clear(); 2489 } 2490 2491 if (effective_name_type_mask & eFunctionNameTypeSelector) 2492 { 2493 FindFunctions (name, m_function_selector_index, sc_list); 2494 } 2495 2496 } 2497 2498 // Return the number of variable that were appended to the list 2499 return sc_list.GetSize() - original_size; 2500 } 2501 2502 uint32_t 2503 SymbolFileDWARF::FindFunctions(const RegularExpression& regex, bool append, SymbolContextList& sc_list) 2504 { 2505 Timer scoped_timer (__PRETTY_FUNCTION__, 2506 "SymbolFileDWARF::FindFunctions (regex = '%s')", 2507 regex.GetText()); 2508 2509 LogSP log (LogChannelDWARF::GetLogIfAll(DWARF_LOG_LOOKUPS)); 2510 2511 if (log) 2512 { 2513 log->Printf ("SymbolFileDWARF::FindFunctions (file=\"%s/%s\", regex=\"%s\"append=%u, sc_list)", 2514 m_obj_file->GetFileSpec().GetDirectory().GetCString(), 2515 m_obj_file->GetFileSpec().GetFilename().GetCString(), 2516 regex.GetText(), append); 2517 } 2518 2519 2520 // If we aren't appending the results to this list, then clear the list 2521 if (!append) 2522 sc_list.Clear(); 2523 2524 // Remember how many sc_list are in the list before we search in case 2525 // we are appending the results to a variable list. 2526 uint32_t original_size = sc_list.GetSize(); 2527 2528 if (m_apple_names_ap.get()) 2529 { 2530 FindFunctions (regex, *m_apple_names_ap, sc_list); 2531 } 2532 else 2533 { 2534 // Index the DWARF if we haven't already 2535 if (!m_indexed) 2536 Index (); 2537 2538 FindFunctions (regex, m_function_basename_index, sc_list); 2539 2540 FindFunctions (regex, m_function_fullname_index, sc_list); 2541 } 2542 2543 // Return the number of variable that were appended to the list 2544 return sc_list.GetSize() - original_size; 2545 } 2546 2547 void 2548 SymbolFileDWARF::ReportError (const char *format, ...) 2549 { 2550 ::fprintf (stderr, 2551 "error: %s/%s ", 2552 m_obj_file->GetFileSpec().GetDirectory().GetCString(), 2553 m_obj_file->GetFileSpec().GetFilename().GetCString()); 2554 2555 if (m_obj_file->GetModule()->GetObjectName()) 2556 ::fprintf (stderr, "(%s) ", m_obj_file->GetModule()->GetObjectName().GetCString()); 2557 2558 va_list args; 2559 va_start (args, format); 2560 vfprintf (stderr, format, args); 2561 va_end (args); 2562 } 2563 2564 void 2565 SymbolFileDWARF::ReportWarning (const char *format, ...) 2566 { 2567 ::fprintf (stderr, 2568 "warning: %s/%s ", 2569 m_obj_file->GetFileSpec().GetDirectory().GetCString(), 2570 m_obj_file->GetFileSpec().GetFilename().GetCString()); 2571 2572 if (m_obj_file->GetModule()->GetObjectName()) 2573 ::fprintf (stderr, "(%s) ", m_obj_file->GetModule()->GetObjectName().GetCString()); 2574 2575 va_list args; 2576 va_start (args, format); 2577 vfprintf (stderr, format, args); 2578 va_end (args); 2579 } 2580 2581 uint32_t 2582 SymbolFileDWARF::FindTypes(const SymbolContext& sc, const ConstString &name, bool append, uint32_t max_matches, TypeList& types) 2583 { 2584 DWARFDebugInfo* info = DebugInfo(); 2585 if (info == NULL) 2586 return 0; 2587 2588 LogSP log (LogChannelDWARF::GetLogIfAll(DWARF_LOG_LOOKUPS)); 2589 2590 if (log) 2591 { 2592 log->Printf ("SymbolFileDWARF::FindFunctions (file=\"%s/%s\", sc, name=\"%s\", append=%u, max_matches=%u, type_list)", 2593 m_obj_file->GetFileSpec().GetDirectory().GetCString(), 2594 m_obj_file->GetFileSpec().GetFilename().GetCString(), 2595 name.GetCString(), append, max_matches); 2596 } 2597 2598 // If we aren't appending the results to this list, then clear the list 2599 if (!append) 2600 types.Clear(); 2601 2602 DIEArray die_offsets; 2603 2604 if (m_apple_types_ap.get()) 2605 { 2606 const char *name_cstr = name.GetCString(); 2607 m_apple_types_ap->FindByName (name_cstr, die_offsets); 2608 } 2609 else 2610 { 2611 if (!m_indexed) 2612 Index (); 2613 2614 m_type_index.Find (name, die_offsets); 2615 } 2616 2617 2618 const size_t num_matches = die_offsets.size(); 2619 2620 if (num_matches) 2621 { 2622 const uint32_t initial_types_size = types.GetSize(); 2623 DWARFCompileUnit* dwarf_cu = NULL; 2624 const DWARFDebugInfoEntry* die = NULL; 2625 DWARFDebugInfo* debug_info = DebugInfo(); 2626 for (size_t i=0; i<num_matches; ++i) 2627 { 2628 const dw_offset_t die_offset = die_offsets[i]; 2629 die = debug_info->GetDIEPtrWithCompileUnitHint (die_offset, &dwarf_cu); 2630 2631 Type *matching_type = ResolveType (dwarf_cu, die); 2632 if (matching_type) 2633 { 2634 // We found a type pointer, now find the shared pointer form our type list 2635 TypeSP type_sp (GetTypeList()->FindType(matching_type->GetID())); 2636 if (type_sp) 2637 { 2638 types.InsertUnique (type_sp); 2639 if (types.GetSize() >= max_matches) 2640 break; 2641 } 2642 else 2643 { 2644 ReportError ("error: can't find shared pointer for type 0x%8.8x.\n", matching_type->GetID()); 2645 } 2646 } 2647 } 2648 return types.GetSize() - initial_types_size; 2649 } 2650 return 0; 2651 } 2652 2653 2654 ClangNamespaceDecl 2655 SymbolFileDWARF::FindNamespace (const SymbolContext& sc, 2656 const ConstString &name) 2657 { 2658 LogSP log (LogChannelDWARF::GetLogIfAll(DWARF_LOG_LOOKUPS)); 2659 2660 if (log) 2661 { 2662 log->Printf ("SymbolFileDWARF::FindNamespace (file=\"%s/%s\", sc, name=\"%s\")", 2663 m_obj_file->GetFileSpec().GetDirectory().GetCString(), 2664 m_obj_file->GetFileSpec().GetFilename().GetCString(), 2665 name.GetCString()); 2666 } 2667 2668 ClangNamespaceDecl namespace_decl; 2669 DWARFDebugInfo* info = DebugInfo(); 2670 if (info) 2671 { 2672 DIEArray die_offsets; 2673 2674 // Index if we already haven't to make sure the compile units 2675 // get indexed and make their global DIE index list 2676 if (m_apple_namespaces_ap.get()) 2677 { 2678 const char *name_cstr = name.GetCString(); 2679 m_apple_namespaces_ap->FindByName (name_cstr, die_offsets); 2680 } 2681 else 2682 { 2683 if (!m_indexed) 2684 Index (); 2685 2686 m_namespace_index.Find (name, die_offsets); 2687 } 2688 2689 DWARFCompileUnit* dwarf_cu = NULL; 2690 const DWARFDebugInfoEntry* die = NULL; 2691 const size_t num_matches = die_offsets.size(); 2692 if (num_matches) 2693 { 2694 DWARFDebugInfo* debug_info = DebugInfo(); 2695 for (size_t i=0; i<num_matches; ++i) 2696 { 2697 const dw_offset_t die_offset = die_offsets[i]; 2698 die = debug_info->GetDIEPtrWithCompileUnitHint (die_offset, &dwarf_cu); 2699 2700 clang::NamespaceDecl *clang_namespace_decl = ResolveNamespaceDIE (dwarf_cu, die); 2701 if (clang_namespace_decl) 2702 { 2703 namespace_decl.SetASTContext (GetClangASTContext().getASTContext()); 2704 namespace_decl.SetNamespaceDecl (clang_namespace_decl); 2705 } 2706 } 2707 } 2708 } 2709 return namespace_decl; 2710 } 2711 2712 uint32_t 2713 SymbolFileDWARF::FindTypes(std::vector<dw_offset_t> die_offsets, uint32_t max_matches, TypeList& types) 2714 { 2715 // Remember how many sc_list are in the list before we search in case 2716 // we are appending the results to a variable list. 2717 uint32_t original_size = types.GetSize(); 2718 2719 const uint32_t num_die_offsets = die_offsets.size(); 2720 // Parse all of the types we found from the pubtypes matches 2721 uint32_t i; 2722 uint32_t num_matches = 0; 2723 for (i = 0; i < num_die_offsets; ++i) 2724 { 2725 Type *matching_type = ResolveTypeUID (die_offsets[i]); 2726 if (matching_type) 2727 { 2728 // We found a type pointer, now find the shared pointer form our type list 2729 TypeSP type_sp (GetTypeList()->FindType(matching_type->GetID())); 2730 assert (type_sp.get() != NULL); 2731 types.InsertUnique (type_sp); 2732 ++num_matches; 2733 if (num_matches >= max_matches) 2734 break; 2735 } 2736 } 2737 2738 // Return the number of variable that were appended to the list 2739 return types.GetSize() - original_size; 2740 } 2741 2742 2743 size_t 2744 SymbolFileDWARF::ParseChildParameters (const SymbolContext& sc, 2745 clang::DeclContext *containing_decl_ctx, 2746 TypeSP& type_sp, 2747 DWARFCompileUnit* dwarf_cu, 2748 const DWARFDebugInfoEntry *parent_die, 2749 bool skip_artificial, 2750 bool &is_static, 2751 TypeList* type_list, 2752 std::vector<clang_type_t>& function_param_types, 2753 std::vector<clang::ParmVarDecl*>& function_param_decls, 2754 unsigned &type_quals) 2755 { 2756 if (parent_die == NULL) 2757 return 0; 2758 2759 const uint8_t *fixed_form_sizes = DWARFFormValue::GetFixedFormSizesForAddressSize (dwarf_cu->GetAddressByteSize()); 2760 2761 size_t arg_idx = 0; 2762 const DWARFDebugInfoEntry *die; 2763 for (die = parent_die->GetFirstChild(); die != NULL; die = die->GetSibling()) 2764 { 2765 dw_tag_t tag = die->Tag(); 2766 switch (tag) 2767 { 2768 case DW_TAG_formal_parameter: 2769 { 2770 DWARFDebugInfoEntry::Attributes attributes; 2771 const size_t num_attributes = die->GetAttributes(this, dwarf_cu, fixed_form_sizes, attributes); 2772 if (num_attributes > 0) 2773 { 2774 const char *name = NULL; 2775 Declaration decl; 2776 dw_offset_t param_type_die_offset = DW_INVALID_OFFSET; 2777 bool is_artificial = false; 2778 // one of None, Auto, Register, Extern, Static, PrivateExtern 2779 2780 clang::StorageClass storage = clang::SC_None; 2781 uint32_t i; 2782 for (i=0; i<num_attributes; ++i) 2783 { 2784 const dw_attr_t attr = attributes.AttributeAtIndex(i); 2785 DWARFFormValue form_value; 2786 if (attributes.ExtractFormValueAtIndex(this, i, form_value)) 2787 { 2788 switch (attr) 2789 { 2790 case DW_AT_decl_file: decl.SetFile(sc.comp_unit->GetSupportFiles().GetFileSpecAtIndex(form_value.Unsigned())); break; 2791 case DW_AT_decl_line: decl.SetLine(form_value.Unsigned()); break; 2792 case DW_AT_decl_column: decl.SetColumn(form_value.Unsigned()); break; 2793 case DW_AT_name: name = form_value.AsCString(&get_debug_str_data()); break; 2794 case DW_AT_type: param_type_die_offset = form_value.Reference(dwarf_cu); break; 2795 case DW_AT_artificial: is_artificial = form_value.Unsigned() != 0; break; 2796 case DW_AT_location: 2797 // if (form_value.BlockData()) 2798 // { 2799 // const DataExtractor& debug_info_data = debug_info(); 2800 // uint32_t block_length = form_value.Unsigned(); 2801 // DataExtractor location(debug_info_data, form_value.BlockData() - debug_info_data.GetDataStart(), block_length); 2802 // } 2803 // else 2804 // { 2805 // } 2806 // break; 2807 case DW_AT_const_value: 2808 case DW_AT_default_value: 2809 case DW_AT_description: 2810 case DW_AT_endianity: 2811 case DW_AT_is_optional: 2812 case DW_AT_segment: 2813 case DW_AT_variable_parameter: 2814 default: 2815 case DW_AT_abstract_origin: 2816 case DW_AT_sibling: 2817 break; 2818 } 2819 } 2820 } 2821 2822 bool skip = false; 2823 if (skip_artificial) 2824 { 2825 if (is_artificial) 2826 { 2827 // In order to determine if a C++ member function is 2828 // "const" we have to look at the const-ness of "this"... 2829 // Ugly, but that 2830 if (arg_idx == 0) 2831 { 2832 if (containing_decl_ctx->getDeclKind() == clang::Decl::CXXRecord) 2833 { 2834 // Often times compilers omit the "this" name for the 2835 // specification DIEs, so we can't rely upon the name 2836 // being in the formal parameter DIE... 2837 if (name == NULL || ::strcmp(name, "this")==0) 2838 { 2839 Type *this_type = ResolveTypeUID (param_type_die_offset); 2840 if (this_type) 2841 { 2842 uint32_t encoding_mask = this_type->GetEncodingMask(); 2843 if (encoding_mask & Type::eEncodingIsPointerUID) 2844 { 2845 is_static = false; 2846 2847 if (encoding_mask & (1u << Type::eEncodingIsConstUID)) 2848 type_quals |= clang::Qualifiers::Const; 2849 if (encoding_mask & (1u << Type::eEncodingIsVolatileUID)) 2850 type_quals |= clang::Qualifiers::Volatile; 2851 } 2852 } 2853 } 2854 } 2855 } 2856 skip = true; 2857 } 2858 else 2859 { 2860 2861 // HACK: Objective C formal parameters "self" and "_cmd" 2862 // are not marked as artificial in the DWARF... 2863 CompileUnit *curr_cu = GetCompUnitForDWARFCompUnit(dwarf_cu, UINT32_MAX); 2864 if (curr_cu && (curr_cu->GetLanguage() == eLanguageTypeObjC || curr_cu->GetLanguage() == eLanguageTypeObjC_plus_plus)) 2865 { 2866 if (name && name[0] && (strcmp (name, "self") == 0 || strcmp (name, "_cmd") == 0)) 2867 skip = true; 2868 } 2869 } 2870 } 2871 2872 if (!skip) 2873 { 2874 Type *type = ResolveTypeUID(param_type_die_offset); 2875 if (type) 2876 { 2877 function_param_types.push_back (type->GetClangForwardType()); 2878 2879 clang::ParmVarDecl *param_var_decl = GetClangASTContext().CreateParameterDeclaration (name, type->GetClangForwardType(), storage); 2880 assert(param_var_decl); 2881 function_param_decls.push_back(param_var_decl); 2882 } 2883 } 2884 } 2885 arg_idx++; 2886 } 2887 break; 2888 2889 default: 2890 break; 2891 } 2892 } 2893 return arg_idx; 2894 } 2895 2896 size_t 2897 SymbolFileDWARF::ParseChildEnumerators 2898 ( 2899 const SymbolContext& sc, 2900 clang_type_t enumerator_clang_type, 2901 uint32_t enumerator_byte_size, 2902 DWARFCompileUnit* dwarf_cu, 2903 const DWARFDebugInfoEntry *parent_die 2904 ) 2905 { 2906 if (parent_die == NULL) 2907 return 0; 2908 2909 size_t enumerators_added = 0; 2910 const DWARFDebugInfoEntry *die; 2911 const uint8_t *fixed_form_sizes = DWARFFormValue::GetFixedFormSizesForAddressSize (dwarf_cu->GetAddressByteSize()); 2912 2913 for (die = parent_die->GetFirstChild(); die != NULL; die = die->GetSibling()) 2914 { 2915 const dw_tag_t tag = die->Tag(); 2916 if (tag == DW_TAG_enumerator) 2917 { 2918 DWARFDebugInfoEntry::Attributes attributes; 2919 const size_t num_child_attributes = die->GetAttributes(this, dwarf_cu, fixed_form_sizes, attributes); 2920 if (num_child_attributes > 0) 2921 { 2922 const char *name = NULL; 2923 bool got_value = false; 2924 int64_t enum_value = 0; 2925 Declaration decl; 2926 2927 uint32_t i; 2928 for (i=0; i<num_child_attributes; ++i) 2929 { 2930 const dw_attr_t attr = attributes.AttributeAtIndex(i); 2931 DWARFFormValue form_value; 2932 if (attributes.ExtractFormValueAtIndex(this, i, form_value)) 2933 { 2934 switch (attr) 2935 { 2936 case DW_AT_const_value: 2937 got_value = true; 2938 enum_value = form_value.Unsigned(); 2939 break; 2940 2941 case DW_AT_name: 2942 name = form_value.AsCString(&get_debug_str_data()); 2943 break; 2944 2945 case DW_AT_description: 2946 default: 2947 case DW_AT_decl_file: decl.SetFile(sc.comp_unit->GetSupportFiles().GetFileSpecAtIndex(form_value.Unsigned())); break; 2948 case DW_AT_decl_line: decl.SetLine(form_value.Unsigned()); break; 2949 case DW_AT_decl_column: decl.SetColumn(form_value.Unsigned()); break; 2950 case DW_AT_sibling: 2951 break; 2952 } 2953 } 2954 } 2955 2956 if (name && name[0] && got_value) 2957 { 2958 GetClangASTContext().AddEnumerationValueToEnumerationType (enumerator_clang_type, 2959 enumerator_clang_type, 2960 decl, 2961 name, 2962 enum_value, 2963 enumerator_byte_size * 8); 2964 ++enumerators_added; 2965 } 2966 } 2967 } 2968 } 2969 return enumerators_added; 2970 } 2971 2972 void 2973 SymbolFileDWARF::ParseChildArrayInfo 2974 ( 2975 const SymbolContext& sc, 2976 DWARFCompileUnit* dwarf_cu, 2977 const DWARFDebugInfoEntry *parent_die, 2978 int64_t& first_index, 2979 std::vector<uint64_t>& element_orders, 2980 uint32_t& byte_stride, 2981 uint32_t& bit_stride 2982 ) 2983 { 2984 if (parent_die == NULL) 2985 return; 2986 2987 const DWARFDebugInfoEntry *die; 2988 const uint8_t *fixed_form_sizes = DWARFFormValue::GetFixedFormSizesForAddressSize (dwarf_cu->GetAddressByteSize()); 2989 for (die = parent_die->GetFirstChild(); die != NULL; die = die->GetSibling()) 2990 { 2991 const dw_tag_t tag = die->Tag(); 2992 switch (tag) 2993 { 2994 case DW_TAG_enumerator: 2995 { 2996 DWARFDebugInfoEntry::Attributes attributes; 2997 const size_t num_child_attributes = die->GetAttributes(this, dwarf_cu, fixed_form_sizes, attributes); 2998 if (num_child_attributes > 0) 2999 { 3000 const char *name = NULL; 3001 bool got_value = false; 3002 int64_t enum_value = 0; 3003 3004 uint32_t i; 3005 for (i=0; i<num_child_attributes; ++i) 3006 { 3007 const dw_attr_t attr = attributes.AttributeAtIndex(i); 3008 DWARFFormValue form_value; 3009 if (attributes.ExtractFormValueAtIndex(this, i, form_value)) 3010 { 3011 switch (attr) 3012 { 3013 case DW_AT_const_value: 3014 got_value = true; 3015 enum_value = form_value.Unsigned(); 3016 break; 3017 3018 case DW_AT_name: 3019 name = form_value.AsCString(&get_debug_str_data()); 3020 break; 3021 3022 case DW_AT_description: 3023 default: 3024 case DW_AT_decl_file: 3025 case DW_AT_decl_line: 3026 case DW_AT_decl_column: 3027 case DW_AT_sibling: 3028 break; 3029 } 3030 } 3031 } 3032 } 3033 } 3034 break; 3035 3036 case DW_TAG_subrange_type: 3037 { 3038 DWARFDebugInfoEntry::Attributes attributes; 3039 const size_t num_child_attributes = die->GetAttributes(this, dwarf_cu, fixed_form_sizes, attributes); 3040 if (num_child_attributes > 0) 3041 { 3042 const char *name = NULL; 3043 bool got_value = false; 3044 uint64_t byte_size = 0; 3045 int64_t enum_value = 0; 3046 uint64_t num_elements = 0; 3047 uint64_t lower_bound = 0; 3048 uint64_t upper_bound = 0; 3049 uint32_t i; 3050 for (i=0; i<num_child_attributes; ++i) 3051 { 3052 const dw_attr_t attr = attributes.AttributeAtIndex(i); 3053 DWARFFormValue form_value; 3054 if (attributes.ExtractFormValueAtIndex(this, i, form_value)) 3055 { 3056 switch (attr) 3057 { 3058 case DW_AT_const_value: 3059 got_value = true; 3060 enum_value = form_value.Unsigned(); 3061 break; 3062 3063 case DW_AT_name: 3064 name = form_value.AsCString(&get_debug_str_data()); 3065 break; 3066 3067 case DW_AT_count: 3068 num_elements = form_value.Unsigned(); 3069 break; 3070 3071 case DW_AT_bit_stride: 3072 bit_stride = form_value.Unsigned(); 3073 break; 3074 3075 case DW_AT_byte_stride: 3076 byte_stride = form_value.Unsigned(); 3077 break; 3078 3079 case DW_AT_byte_size: 3080 byte_size = form_value.Unsigned(); 3081 break; 3082 3083 case DW_AT_lower_bound: 3084 lower_bound = form_value.Unsigned(); 3085 break; 3086 3087 case DW_AT_upper_bound: 3088 upper_bound = form_value.Unsigned(); 3089 break; 3090 3091 default: 3092 case DW_AT_abstract_origin: 3093 case DW_AT_accessibility: 3094 case DW_AT_allocated: 3095 case DW_AT_associated: 3096 case DW_AT_data_location: 3097 case DW_AT_declaration: 3098 case DW_AT_description: 3099 case DW_AT_sibling: 3100 case DW_AT_threads_scaled: 3101 case DW_AT_type: 3102 case DW_AT_visibility: 3103 break; 3104 } 3105 } 3106 } 3107 3108 if (upper_bound > lower_bound) 3109 num_elements = upper_bound - lower_bound + 1; 3110 3111 if (num_elements > 0) 3112 element_orders.push_back (num_elements); 3113 } 3114 } 3115 break; 3116 } 3117 } 3118 } 3119 3120 TypeSP 3121 SymbolFileDWARF::GetTypeForDIE (DWARFCompileUnit *curr_cu, const DWARFDebugInfoEntry* die) 3122 { 3123 TypeSP type_sp; 3124 if (die != NULL) 3125 { 3126 assert(curr_cu != NULL); 3127 Type *type_ptr = m_die_to_type.lookup (die); 3128 if (type_ptr == NULL) 3129 { 3130 CompileUnit* lldb_cu = GetCompUnitForDWARFCompUnit(curr_cu); 3131 assert (lldb_cu); 3132 SymbolContext sc(lldb_cu); 3133 type_sp = ParseType(sc, curr_cu, die, NULL); 3134 } 3135 else if (type_ptr != DIE_IS_BEING_PARSED) 3136 { 3137 // Grab the existing type from the master types lists 3138 type_sp = GetTypeList()->FindType(type_ptr->GetID()); 3139 } 3140 3141 } 3142 return type_sp; 3143 } 3144 3145 clang::DeclContext * 3146 SymbolFileDWARF::GetClangDeclContextContainingDIEOffset (dw_offset_t die_offset) 3147 { 3148 if (die_offset != DW_INVALID_OFFSET) 3149 { 3150 DWARFCompileUnitSP cu_sp; 3151 const DWARFDebugInfoEntry* die = DebugInfo()->GetDIEPtr(die_offset, &cu_sp); 3152 return GetClangDeclContextContainingDIE (cu_sp.get(), die); 3153 } 3154 return NULL; 3155 } 3156 3157 clang::DeclContext * 3158 SymbolFileDWARF::GetClangDeclContextForDIEOffset (const SymbolContext &sc, dw_offset_t die_offset) 3159 { 3160 if (die_offset != DW_INVALID_OFFSET) 3161 { 3162 DWARFDebugInfo* debug_info = DebugInfo(); 3163 if (debug_info) 3164 { 3165 DWARFCompileUnitSP cu_sp; 3166 const DWARFDebugInfoEntry* die = debug_info->GetDIEPtr(die_offset, &cu_sp); 3167 if (die) 3168 return GetClangDeclContextForDIE (sc, cu_sp.get(), die); 3169 } 3170 } 3171 return NULL; 3172 } 3173 3174 clang::NamespaceDecl * 3175 SymbolFileDWARF::ResolveNamespaceDIE (DWARFCompileUnit *curr_cu, const DWARFDebugInfoEntry *die) 3176 { 3177 if (die->Tag() == DW_TAG_namespace) 3178 { 3179 const char *namespace_name = die->GetAttributeValueAsString(this, curr_cu, DW_AT_name, NULL); 3180 if (namespace_name) 3181 { 3182 Declaration decl; // TODO: fill in the decl object 3183 clang::NamespaceDecl *namespace_decl = GetClangASTContext().GetUniqueNamespaceDeclaration (namespace_name, decl, GetClangDeclContextContainingDIE (curr_cu, die->GetParent())); 3184 if (namespace_decl) 3185 LinkDeclContextToDIE((clang::DeclContext*)namespace_decl, die); 3186 return namespace_decl; 3187 } 3188 } 3189 return NULL; 3190 } 3191 3192 clang::DeclContext * 3193 SymbolFileDWARF::GetClangDeclContextForDIE (const SymbolContext &sc, DWARFCompileUnit *curr_cu, const DWARFDebugInfoEntry *die) 3194 { 3195 clang::DeclContext *clang_decl_ctx = GetCachedClangDeclContextForDIE (die); 3196 if (clang_decl_ctx) 3197 return clang_decl_ctx; 3198 // If this DIE has a specification, or an abstract origin, then trace to those. 3199 3200 dw_offset_t die_offset = die->GetAttributeValueAsReference(this, curr_cu, DW_AT_specification, DW_INVALID_OFFSET); 3201 if (die_offset != DW_INVALID_OFFSET) 3202 return GetClangDeclContextForDIEOffset (sc, die_offset); 3203 3204 die_offset = die->GetAttributeValueAsReference(this, curr_cu, DW_AT_abstract_origin, DW_INVALID_OFFSET); 3205 if (die_offset != DW_INVALID_OFFSET) 3206 return GetClangDeclContextForDIEOffset (sc, die_offset); 3207 3208 // This is the DIE we want. Parse it, then query our map. 3209 3210 ParseType(sc, curr_cu, die, NULL); 3211 3212 clang_decl_ctx = GetCachedClangDeclContextForDIE (die); 3213 3214 return clang_decl_ctx; 3215 } 3216 3217 clang::DeclContext * 3218 SymbolFileDWARF::GetClangDeclContextContainingDIE (DWARFCompileUnit *cu, const DWARFDebugInfoEntry *die) 3219 { 3220 if (m_clang_tu_decl == NULL) 3221 m_clang_tu_decl = GetClangASTContext().getASTContext()->getTranslationUnitDecl(); 3222 3223 const DWARFDebugInfoEntry *decl_ctx_die = GetDeclContextDIEContainingDIE (cu, die); 3224 3225 if (decl_ctx_die) 3226 { 3227 DIEToDeclContextMap::iterator pos = m_die_to_decl_ctx.find (decl_ctx_die); 3228 if (pos != m_die_to_decl_ctx.end()) 3229 return pos->second; 3230 3231 switch (decl_ctx_die->Tag()) 3232 { 3233 case DW_TAG_compile_unit: 3234 return m_clang_tu_decl; 3235 3236 case DW_TAG_namespace: 3237 { 3238 const char *namespace_name = decl_ctx_die->GetAttributeValueAsString(this, cu, DW_AT_name, NULL); 3239 if (namespace_name) 3240 { 3241 Declaration decl; // TODO: fill in the decl object 3242 clang::NamespaceDecl *namespace_decl = GetClangASTContext().GetUniqueNamespaceDeclaration (namespace_name, decl, GetClangDeclContextContainingDIE (cu, decl_ctx_die)); 3243 if (namespace_decl) 3244 LinkDeclContextToDIE((clang::DeclContext*)namespace_decl, decl_ctx_die); 3245 return namespace_decl; 3246 } 3247 } 3248 break; 3249 3250 case DW_TAG_structure_type: 3251 case DW_TAG_union_type: 3252 case DW_TAG_class_type: 3253 { 3254 Type* type = ResolveType (cu, decl_ctx_die); 3255 if (type) 3256 { 3257 clang::DeclContext *decl_ctx = ClangASTContext::GetDeclContextForType (type->GetClangForwardType ()); 3258 if (decl_ctx) 3259 { 3260 LinkDeclContextToDIE (decl_ctx, decl_ctx_die); 3261 if (decl_ctx) 3262 return decl_ctx; 3263 } 3264 } 3265 } 3266 break; 3267 3268 default: 3269 break; 3270 } 3271 } 3272 return m_clang_tu_decl; 3273 } 3274 3275 3276 const DWARFDebugInfoEntry * 3277 SymbolFileDWARF::GetDeclContextDIEContainingDIE (DWARFCompileUnit *cu, const DWARFDebugInfoEntry *die) 3278 { 3279 if (cu && die) 3280 { 3281 const DWARFDebugInfoEntry * const decl_die = die; 3282 3283 while (die != NULL) 3284 { 3285 // If this is the original DIE that we are searching for a declaration 3286 // for, then don't look in the cache as we don't want our own decl 3287 // context to be our decl context... 3288 if (decl_die != die) 3289 { 3290 switch (die->Tag()) 3291 { 3292 case DW_TAG_compile_unit: 3293 case DW_TAG_namespace: 3294 case DW_TAG_structure_type: 3295 case DW_TAG_union_type: 3296 case DW_TAG_class_type: 3297 return die; 3298 3299 default: 3300 break; 3301 } 3302 } 3303 3304 dw_offset_t die_offset = die->GetAttributeValueAsReference(this, cu, DW_AT_specification, DW_INVALID_OFFSET); 3305 if (die_offset != DW_INVALID_OFFSET) 3306 { 3307 DWARFCompileUnit *spec_cu = cu; 3308 const DWARFDebugInfoEntry *spec_die = DebugInfo()->GetDIEPtrWithCompileUnitHint (die_offset, &spec_cu); 3309 const DWARFDebugInfoEntry *spec_die_decl_ctx_die = GetDeclContextDIEContainingDIE (spec_cu, spec_die); 3310 if (spec_die_decl_ctx_die) 3311 return spec_die_decl_ctx_die; 3312 } 3313 3314 die_offset = die->GetAttributeValueAsReference(this, cu, DW_AT_abstract_origin, DW_INVALID_OFFSET); 3315 if (die_offset != DW_INVALID_OFFSET) 3316 { 3317 DWARFCompileUnit *abs_cu = cu; 3318 const DWARFDebugInfoEntry *abs_die = DebugInfo()->GetDIEPtrWithCompileUnitHint (die_offset, &abs_cu); 3319 const DWARFDebugInfoEntry *abs_die_decl_ctx_die = GetDeclContextDIEContainingDIE (abs_cu, abs_die); 3320 if (abs_die_decl_ctx_die) 3321 return abs_die_decl_ctx_die; 3322 } 3323 3324 die = die->GetParent(); 3325 } 3326 } 3327 return NULL; 3328 } 3329 3330 3331 3332 // This function can be used when a DIE is found that is a forward declaration 3333 // DIE and we want to try and find a type that has the complete definition. 3334 TypeSP 3335 SymbolFileDWARF::FindDefinitionTypeForDIE (DWARFCompileUnit* cu, 3336 const DWARFDebugInfoEntry *die, 3337 const ConstString &type_name) 3338 { 3339 TypeSP type_sp; 3340 3341 if (cu == NULL || die == NULL || !type_name) 3342 return type_sp; 3343 3344 DIEArray die_offsets; 3345 3346 if (m_apple_types_ap.get()) 3347 { 3348 const char *name_cstr = type_name.GetCString(); 3349 m_apple_types_ap->FindByName (name_cstr, die_offsets); 3350 } 3351 else 3352 { 3353 if (!m_indexed) 3354 Index (); 3355 3356 m_type_index.Find (type_name, die_offsets); 3357 } 3358 3359 3360 const size_t num_matches = die_offsets.size(); 3361 3362 const dw_tag_t type_tag = die->Tag(); 3363 3364 DWARFCompileUnit* type_cu = NULL; 3365 const DWARFDebugInfoEntry* type_die = NULL; 3366 if (num_matches) 3367 { 3368 DWARFDebugInfo* debug_info = DebugInfo(); 3369 for (size_t i=0; i<num_matches; ++i) 3370 { 3371 const dw_offset_t die_offset = die_offsets[i]; 3372 type_die = debug_info->GetDIEPtrWithCompileUnitHint (die_offset, &type_cu); 3373 3374 if (type_die != die && type_die->Tag() == type_tag) 3375 { 3376 // Hold off on comparing parent DIE tags until 3377 // we know what happens with stuff in namespaces 3378 // for gcc and clang... 3379 //DWARFDebugInfoEntry *parent_die = die->GetParent(); 3380 //DWARFDebugInfoEntry *parent_type_die = type_die->GetParent(); 3381 //if (parent_die->Tag() == parent_type_die->Tag()) 3382 { 3383 Type *resolved_type = ResolveType (type_cu, type_die, false); 3384 if (resolved_type && resolved_type != DIE_IS_BEING_PARSED) 3385 { 3386 DEBUG_PRINTF ("resolved 0x%8.8x (cu 0x%8.8x) from %s to 0x%8.8x (cu 0x%8.8x)\n", 3387 die->GetOffset(), 3388 curr_cu->GetOffset(), 3389 m_obj_file->GetFileSpec().GetFilename().AsCString(), 3390 type_die->GetOffset(), 3391 type_cu->GetOffset()); 3392 3393 m_die_to_type[die] = resolved_type; 3394 type_sp = GetTypeList()->FindType(resolved_type->GetID()); 3395 if (!type_sp) 3396 { 3397 DEBUG_PRINTF("unable to resolve type '%s' from DIE 0x%8.8x\n", type_name.GetCString(), die->GetOffset()); 3398 } 3399 break; 3400 } 3401 } 3402 } 3403 } 3404 } 3405 return type_sp; 3406 } 3407 3408 TypeSP 3409 SymbolFileDWARF::ParseType (const SymbolContext& sc, DWARFCompileUnit* dwarf_cu, const DWARFDebugInfoEntry *die, bool *type_is_new_ptr) 3410 { 3411 TypeSP type_sp; 3412 3413 if (type_is_new_ptr) 3414 *type_is_new_ptr = false; 3415 3416 AccessType accessibility = eAccessNone; 3417 if (die != NULL) 3418 { 3419 LogSP log (LogChannelDWARF::GetLogIfAll(DWARF_LOG_DEBUG_INFO)); 3420 if (log && dwarf_cu) 3421 { 3422 StreamString s; 3423 die->DumpLocation (this, dwarf_cu, s); 3424 log->Printf ("SymbolFileDwarf::%s %s", __FUNCTION__, s.GetData()); 3425 3426 } 3427 3428 Type *type_ptr = m_die_to_type.lookup (die); 3429 TypeList* type_list = GetTypeList(); 3430 if (type_ptr == NULL) 3431 { 3432 ClangASTContext &ast = GetClangASTContext(); 3433 if (type_is_new_ptr) 3434 *type_is_new_ptr = true; 3435 3436 const dw_tag_t tag = die->Tag(); 3437 3438 bool is_forward_declaration = false; 3439 DWARFDebugInfoEntry::Attributes attributes; 3440 const char *type_name_cstr = NULL; 3441 ConstString type_name_const_str; 3442 Type::ResolveState resolve_state = Type::eResolveStateUnresolved; 3443 size_t byte_size = 0; 3444 bool byte_size_valid = false; 3445 Declaration decl; 3446 3447 Type::EncodingDataType encoding_data_type = Type::eEncodingIsUID; 3448 clang_type_t clang_type = NULL; 3449 3450 dw_attr_t attr; 3451 3452 switch (tag) 3453 { 3454 case DW_TAG_base_type: 3455 case DW_TAG_pointer_type: 3456 case DW_TAG_reference_type: 3457 case DW_TAG_typedef: 3458 case DW_TAG_const_type: 3459 case DW_TAG_restrict_type: 3460 case DW_TAG_volatile_type: 3461 { 3462 // Set a bit that lets us know that we are currently parsing this 3463 m_die_to_type[die] = DIE_IS_BEING_PARSED; 3464 3465 const size_t num_attributes = die->GetAttributes(this, dwarf_cu, NULL, attributes); 3466 uint32_t encoding = 0; 3467 lldb::user_id_t encoding_uid = LLDB_INVALID_UID; 3468 3469 if (num_attributes > 0) 3470 { 3471 uint32_t i; 3472 for (i=0; i<num_attributes; ++i) 3473 { 3474 attr = attributes.AttributeAtIndex(i); 3475 DWARFFormValue form_value; 3476 if (attributes.ExtractFormValueAtIndex(this, i, form_value)) 3477 { 3478 switch (attr) 3479 { 3480 case DW_AT_decl_file: decl.SetFile(sc.comp_unit->GetSupportFiles().GetFileSpecAtIndex(form_value.Unsigned())); break; 3481 case DW_AT_decl_line: decl.SetLine(form_value.Unsigned()); break; 3482 case DW_AT_decl_column: decl.SetColumn(form_value.Unsigned()); break; 3483 case DW_AT_name: 3484 3485 type_name_cstr = form_value.AsCString(&get_debug_str_data()); 3486 // Work around a bug in llvm-gcc where they give a name to a reference type which doesn't 3487 // include the "&"... 3488 if (tag == DW_TAG_reference_type) 3489 { 3490 if (strchr (type_name_cstr, '&') == NULL) 3491 type_name_cstr = NULL; 3492 } 3493 if (type_name_cstr) 3494 type_name_const_str.SetCString(type_name_cstr); 3495 break; 3496 case DW_AT_byte_size: byte_size = form_value.Unsigned(); byte_size_valid = true; break; 3497 case DW_AT_encoding: encoding = form_value.Unsigned(); break; 3498 case DW_AT_type: encoding_uid = form_value.Reference(dwarf_cu); break; 3499 default: 3500 case DW_AT_sibling: 3501 break; 3502 } 3503 } 3504 } 3505 } 3506 3507 DEBUG_PRINTF ("0x%8.8x: %s (\"%s\") type => 0x%8.8x\n", die->GetOffset(), DW_TAG_value_to_name(tag), type_name_cstr, encoding_uid); 3508 3509 switch (tag) 3510 { 3511 default: 3512 break; 3513 3514 case DW_TAG_base_type: 3515 resolve_state = Type::eResolveStateFull; 3516 clang_type = ast.GetBuiltinTypeForDWARFEncodingAndBitSize (type_name_cstr, 3517 encoding, 3518 byte_size * 8); 3519 break; 3520 3521 case DW_TAG_pointer_type: encoding_data_type = Type::eEncodingIsPointerUID; break; 3522 case DW_TAG_reference_type: encoding_data_type = Type::eEncodingIsLValueReferenceUID; break; 3523 case DW_TAG_typedef: encoding_data_type = Type::eEncodingIsTypedefUID; break; 3524 case DW_TAG_const_type: encoding_data_type = Type::eEncodingIsConstUID; break; 3525 case DW_TAG_restrict_type: encoding_data_type = Type::eEncodingIsRestrictUID; break; 3526 case DW_TAG_volatile_type: encoding_data_type = Type::eEncodingIsVolatileUID; break; 3527 } 3528 3529 if (type_name_cstr != NULL && sc.comp_unit != NULL && 3530 (sc.comp_unit->GetLanguage() == eLanguageTypeObjC || sc.comp_unit->GetLanguage() == eLanguageTypeObjC_plus_plus)) 3531 { 3532 static ConstString g_objc_type_name_id("id"); 3533 static ConstString g_objc_type_name_Class("Class"); 3534 static ConstString g_objc_type_name_selector("SEL"); 3535 3536 if (type_name_const_str == g_objc_type_name_id) 3537 { 3538 clang_type = ast.GetBuiltInType_objc_id(); 3539 resolve_state = Type::eResolveStateFull; 3540 3541 } 3542 else if (type_name_const_str == g_objc_type_name_Class) 3543 { 3544 clang_type = ast.GetBuiltInType_objc_Class(); 3545 resolve_state = Type::eResolveStateFull; 3546 } 3547 else if (type_name_const_str == g_objc_type_name_selector) 3548 { 3549 clang_type = ast.GetBuiltInType_objc_selector(); 3550 resolve_state = Type::eResolveStateFull; 3551 } 3552 } 3553 3554 type_sp.reset( new Type (die->GetOffset(), 3555 this, 3556 type_name_const_str, 3557 byte_size, 3558 NULL, 3559 encoding_uid, 3560 encoding_data_type, 3561 &decl, 3562 clang_type, 3563 resolve_state)); 3564 3565 m_die_to_type[die] = type_sp.get(); 3566 3567 // Type* encoding_type = GetUniquedTypeForDIEOffset(encoding_uid, type_sp, NULL, 0, 0, false); 3568 // if (encoding_type != NULL) 3569 // { 3570 // if (encoding_type != DIE_IS_BEING_PARSED) 3571 // type_sp->SetEncodingType(encoding_type); 3572 // else 3573 // m_indirect_fixups.push_back(type_sp.get()); 3574 // } 3575 } 3576 break; 3577 3578 case DW_TAG_structure_type: 3579 case DW_TAG_union_type: 3580 case DW_TAG_class_type: 3581 { 3582 // Set a bit that lets us know that we are currently parsing this 3583 m_die_to_type[die] = DIE_IS_BEING_PARSED; 3584 3585 LanguageType class_language = eLanguageTypeUnknown; 3586 //bool struct_is_class = false; 3587 const size_t num_attributes = die->GetAttributes(this, dwarf_cu, NULL, attributes); 3588 if (num_attributes > 0) 3589 { 3590 uint32_t i; 3591 for (i=0; i<num_attributes; ++i) 3592 { 3593 attr = attributes.AttributeAtIndex(i); 3594 DWARFFormValue form_value; 3595 if (attributes.ExtractFormValueAtIndex(this, i, form_value)) 3596 { 3597 switch (attr) 3598 { 3599 case DW_AT_decl_file: 3600 decl.SetFile(sc.comp_unit->GetSupportFiles().GetFileSpecAtIndex(form_value.Unsigned())); 3601 break; 3602 3603 case DW_AT_decl_line: 3604 decl.SetLine(form_value.Unsigned()); 3605 break; 3606 3607 case DW_AT_decl_column: 3608 decl.SetColumn(form_value.Unsigned()); 3609 break; 3610 3611 case DW_AT_name: 3612 type_name_cstr = form_value.AsCString(&get_debug_str_data()); 3613 type_name_const_str.SetCString(type_name_cstr); 3614 break; 3615 3616 case DW_AT_byte_size: 3617 byte_size = form_value.Unsigned(); 3618 byte_size_valid = true; 3619 break; 3620 3621 case DW_AT_accessibility: 3622 accessibility = DW_ACCESS_to_AccessType(form_value.Unsigned()); 3623 break; 3624 3625 case DW_AT_declaration: 3626 is_forward_declaration = form_value.Unsigned() != 0; 3627 break; 3628 3629 case DW_AT_APPLE_runtime_class: 3630 class_language = (LanguageType)form_value.Signed(); 3631 break; 3632 3633 case DW_AT_allocated: 3634 case DW_AT_associated: 3635 case DW_AT_data_location: 3636 case DW_AT_description: 3637 case DW_AT_start_scope: 3638 case DW_AT_visibility: 3639 default: 3640 case DW_AT_sibling: 3641 break; 3642 } 3643 } 3644 } 3645 } 3646 3647 UniqueDWARFASTType unique_ast_entry; 3648 if (decl.IsValid()) 3649 { 3650 if (GetUniqueDWARFASTTypeMap().Find (type_name_const_str, 3651 this, 3652 dwarf_cu, 3653 die, 3654 decl, 3655 byte_size_valid ? byte_size : -1, 3656 unique_ast_entry)) 3657 { 3658 // We have already parsed this type or from another 3659 // compile unit. GCC loves to use the "one definition 3660 // rule" which can result in multiple definitions 3661 // of the same class over and over in each compile 3662 // unit. 3663 type_sp = unique_ast_entry.m_type_sp; 3664 if (type_sp) 3665 { 3666 m_die_to_type[die] = type_sp.get(); 3667 return type_sp; 3668 } 3669 } 3670 } 3671 3672 DEBUG_PRINTF ("0x%8.8x: %s (\"%s\")\n", die->GetOffset(), DW_TAG_value_to_name(tag), type_name_cstr); 3673 3674 int tag_decl_kind = -1; 3675 AccessType default_accessibility = eAccessNone; 3676 if (tag == DW_TAG_structure_type) 3677 { 3678 tag_decl_kind = clang::TTK_Struct; 3679 default_accessibility = eAccessPublic; 3680 } 3681 else if (tag == DW_TAG_union_type) 3682 { 3683 tag_decl_kind = clang::TTK_Union; 3684 default_accessibility = eAccessPublic; 3685 } 3686 else if (tag == DW_TAG_class_type) 3687 { 3688 tag_decl_kind = clang::TTK_Class; 3689 default_accessibility = eAccessPrivate; 3690 } 3691 3692 3693 if (is_forward_declaration) 3694 { 3695 // We have a forward declaration to a type and we need 3696 // to try and find a full declaration. We look in the 3697 // current type index just in case we have a forward 3698 // declaration followed by an actual declarations in the 3699 // DWARF. If this fails, we need to look elsewhere... 3700 3701 type_sp = FindDefinitionTypeForDIE (dwarf_cu, die, type_name_const_str); 3702 3703 if (!type_sp && m_debug_map_symfile) 3704 { 3705 // We weren't able to find a full declaration in 3706 // this DWARF, see if we have a declaration anywhere 3707 // else... 3708 type_sp = m_debug_map_symfile->FindDefinitionTypeForDIE (dwarf_cu, die, type_name_const_str); 3709 } 3710 3711 if (type_sp) 3712 { 3713 // We found a real definition for this type elsewhere 3714 // so lets use it and cache the fact that we found 3715 // a complete type for this die 3716 m_die_to_type[die] = type_sp.get(); 3717 return type_sp; 3718 } 3719 } 3720 assert (tag_decl_kind != -1); 3721 bool clang_type_was_created = false; 3722 clang_type = m_forward_decl_die_to_clang_type.lookup (die); 3723 if (clang_type == NULL) 3724 { 3725 clang_type_was_created = true; 3726 clang_type = ast.CreateRecordType (type_name_cstr, 3727 tag_decl_kind, 3728 GetClangDeclContextContainingDIE (dwarf_cu, die), 3729 class_language); 3730 } 3731 3732 // Store a forward declaration to this class type in case any 3733 // parameters in any class methods need it for the clang 3734 // types for function prototypes. 3735 LinkDeclContextToDIE(ClangASTContext::GetDeclContextForType(clang_type), die); 3736 type_sp.reset (new Type (die->GetOffset(), 3737 this, 3738 type_name_const_str, 3739 byte_size, 3740 NULL, 3741 LLDB_INVALID_UID, 3742 Type::eEncodingIsUID, 3743 &decl, 3744 clang_type, 3745 Type::eResolveStateForward)); 3746 3747 3748 // Add our type to the unique type map so we don't 3749 // end up creating many copies of the same type over 3750 // and over in the ASTContext for our module 3751 unique_ast_entry.m_type_sp = type_sp; 3752 unique_ast_entry.m_symfile = this; 3753 unique_ast_entry.m_cu = dwarf_cu; 3754 unique_ast_entry.m_die = die; 3755 unique_ast_entry.m_declaration = decl; 3756 GetUniqueDWARFASTTypeMap().Insert (type_name_const_str, 3757 unique_ast_entry); 3758 3759 if (die->HasChildren() == false && is_forward_declaration == false) 3760 { 3761 // No children for this struct/union/class, lets finish it 3762 ast.StartTagDeclarationDefinition (clang_type); 3763 ast.CompleteTagDeclarationDefinition (clang_type); 3764 } 3765 else if (clang_type_was_created) 3766 { 3767 // Leave this as a forward declaration until we need 3768 // to know the details of the type. lldb_private::Type 3769 // will automatically call the SymbolFile virtual function 3770 // "SymbolFileDWARF::ResolveClangOpaqueTypeDefinition(Type *)" 3771 // When the definition needs to be defined. 3772 m_forward_decl_die_to_clang_type[die] = clang_type; 3773 m_forward_decl_clang_type_to_die[ClangASTType::RemoveFastQualifiers (clang_type)] = die; 3774 ClangASTContext::SetHasExternalStorage (clang_type, true); 3775 } 3776 } 3777 break; 3778 3779 case DW_TAG_enumeration_type: 3780 { 3781 // Set a bit that lets us know that we are currently parsing this 3782 m_die_to_type[die] = DIE_IS_BEING_PARSED; 3783 3784 lldb::user_id_t encoding_uid = DW_INVALID_OFFSET; 3785 3786 const size_t num_attributes = die->GetAttributes(this, dwarf_cu, NULL, attributes); 3787 if (num_attributes > 0) 3788 { 3789 uint32_t i; 3790 3791 for (i=0; i<num_attributes; ++i) 3792 { 3793 attr = attributes.AttributeAtIndex(i); 3794 DWARFFormValue form_value; 3795 if (attributes.ExtractFormValueAtIndex(this, i, form_value)) 3796 { 3797 switch (attr) 3798 { 3799 case DW_AT_decl_file: decl.SetFile(sc.comp_unit->GetSupportFiles().GetFileSpecAtIndex(form_value.Unsigned())); break; 3800 case DW_AT_decl_line: decl.SetLine(form_value.Unsigned()); break; 3801 case DW_AT_decl_column: decl.SetColumn(form_value.Unsigned()); break; 3802 case DW_AT_name: 3803 type_name_cstr = form_value.AsCString(&get_debug_str_data()); 3804 type_name_const_str.SetCString(type_name_cstr); 3805 break; 3806 case DW_AT_type: encoding_uid = form_value.Reference(dwarf_cu); break; 3807 case DW_AT_byte_size: byte_size = form_value.Unsigned(); byte_size_valid = true; break; 3808 case DW_AT_accessibility: accessibility = DW_ACCESS_to_AccessType(form_value.Unsigned()); break; 3809 case DW_AT_declaration: is_forward_declaration = form_value.Unsigned() != 0; break; 3810 case DW_AT_allocated: 3811 case DW_AT_associated: 3812 case DW_AT_bit_stride: 3813 case DW_AT_byte_stride: 3814 case DW_AT_data_location: 3815 case DW_AT_description: 3816 case DW_AT_start_scope: 3817 case DW_AT_visibility: 3818 case DW_AT_specification: 3819 case DW_AT_abstract_origin: 3820 case DW_AT_sibling: 3821 break; 3822 } 3823 } 3824 } 3825 3826 DEBUG_PRINTF ("0x%8.8x: %s (\"%s\")\n", die->GetOffset(), DW_TAG_value_to_name(tag), type_name_cstr); 3827 3828 clang_type_t enumerator_clang_type = NULL; 3829 clang_type = m_forward_decl_die_to_clang_type.lookup (die); 3830 if (clang_type == NULL) 3831 { 3832 enumerator_clang_type = ast.GetBuiltinTypeForDWARFEncodingAndBitSize (NULL, 3833 DW_ATE_signed, 3834 byte_size * 8); 3835 clang_type = ast.CreateEnumerationType (type_name_cstr, 3836 GetClangDeclContextContainingDIE (dwarf_cu, die), 3837 decl, 3838 enumerator_clang_type); 3839 } 3840 else 3841 { 3842 enumerator_clang_type = ClangASTContext::GetEnumerationIntegerType (clang_type); 3843 assert (enumerator_clang_type != NULL); 3844 } 3845 3846 LinkDeclContextToDIE(ClangASTContext::GetDeclContextForType(clang_type), die); 3847 3848 type_sp.reset( new Type (die->GetOffset(), 3849 this, 3850 type_name_const_str, 3851 byte_size, 3852 NULL, 3853 encoding_uid, 3854 Type::eEncodingIsUID, 3855 &decl, 3856 clang_type, 3857 Type::eResolveStateForward)); 3858 3859 #if LEAVE_ENUMS_FORWARD_DECLARED 3860 // Leave this as a forward declaration until we need 3861 // to know the details of the type. lldb_private::Type 3862 // will automatically call the SymbolFile virtual function 3863 // "SymbolFileDWARF::ResolveClangOpaqueTypeDefinition(Type *)" 3864 // When the definition needs to be defined. 3865 m_forward_decl_die_to_clang_type[die] = clang_type; 3866 m_forward_decl_clang_type_to_die[ClangASTType::RemoveFastQualifiers (clang_type)] = die; 3867 ClangASTContext::SetHasExternalStorage (clang_type, true); 3868 #else 3869 ast.StartTagDeclarationDefinition (clang_type); 3870 if (die->HasChildren()) 3871 { 3872 SymbolContext cu_sc(GetCompUnitForDWARFCompUnit(dwarf_cu)); 3873 ParseChildEnumerators(cu_sc, clang_type, type_sp->GetByteSize(), dwarf_cu, die); 3874 } 3875 ast.CompleteTagDeclarationDefinition (clang_type); 3876 #endif 3877 } 3878 } 3879 break; 3880 3881 case DW_TAG_inlined_subroutine: 3882 case DW_TAG_subprogram: 3883 case DW_TAG_subroutine_type: 3884 { 3885 // Set a bit that lets us know that we are currently parsing this 3886 m_die_to_type[die] = DIE_IS_BEING_PARSED; 3887 3888 const char *mangled = NULL; 3889 dw_offset_t type_die_offset = DW_INVALID_OFFSET; 3890 bool is_variadic = false; 3891 bool is_inline = false; 3892 bool is_static = false; 3893 bool is_virtual = false; 3894 bool is_explicit = false; 3895 dw_offset_t specification_die_offset = DW_INVALID_OFFSET; 3896 dw_offset_t abstract_origin_die_offset = DW_INVALID_OFFSET; 3897 3898 unsigned type_quals = 0; 3899 clang::StorageClass storage = clang::SC_None;//, Extern, Static, PrivateExtern 3900 3901 3902 const size_t num_attributes = die->GetAttributes(this, dwarf_cu, NULL, attributes); 3903 if (num_attributes > 0) 3904 { 3905 uint32_t i; 3906 for (i=0; i<num_attributes; ++i) 3907 { 3908 attr = attributes.AttributeAtIndex(i); 3909 DWARFFormValue form_value; 3910 if (attributes.ExtractFormValueAtIndex(this, i, form_value)) 3911 { 3912 switch (attr) 3913 { 3914 case DW_AT_decl_file: decl.SetFile(sc.comp_unit->GetSupportFiles().GetFileSpecAtIndex(form_value.Unsigned())); break; 3915 case DW_AT_decl_line: decl.SetLine(form_value.Unsigned()); break; 3916 case DW_AT_decl_column: decl.SetColumn(form_value.Unsigned()); break; 3917 case DW_AT_name: 3918 type_name_cstr = form_value.AsCString(&get_debug_str_data()); 3919 type_name_const_str.SetCString(type_name_cstr); 3920 break; 3921 3922 case DW_AT_MIPS_linkage_name: mangled = form_value.AsCString(&get_debug_str_data()); break; 3923 case DW_AT_type: type_die_offset = form_value.Reference(dwarf_cu); break; 3924 case DW_AT_accessibility: accessibility = DW_ACCESS_to_AccessType(form_value.Unsigned()); break; 3925 case DW_AT_declaration: is_forward_declaration = form_value.Unsigned() != 0; break; 3926 case DW_AT_inline: is_inline = form_value.Unsigned() != 0; break; 3927 case DW_AT_virtuality: is_virtual = form_value.Unsigned() != 0; break; 3928 case DW_AT_explicit: is_explicit = form_value.Unsigned() != 0; break; 3929 3930 case DW_AT_external: 3931 if (form_value.Unsigned()) 3932 { 3933 if (storage == clang::SC_None) 3934 storage = clang::SC_Extern; 3935 else 3936 storage = clang::SC_PrivateExtern; 3937 } 3938 break; 3939 3940 case DW_AT_specification: 3941 specification_die_offset = form_value.Reference(dwarf_cu); 3942 break; 3943 3944 case DW_AT_abstract_origin: 3945 abstract_origin_die_offset = form_value.Reference(dwarf_cu); 3946 break; 3947 3948 3949 case DW_AT_allocated: 3950 case DW_AT_associated: 3951 case DW_AT_address_class: 3952 case DW_AT_artificial: 3953 case DW_AT_calling_convention: 3954 case DW_AT_data_location: 3955 case DW_AT_elemental: 3956 case DW_AT_entry_pc: 3957 case DW_AT_frame_base: 3958 case DW_AT_high_pc: 3959 case DW_AT_low_pc: 3960 case DW_AT_object_pointer: 3961 case DW_AT_prototyped: 3962 case DW_AT_pure: 3963 case DW_AT_ranges: 3964 case DW_AT_recursive: 3965 case DW_AT_return_addr: 3966 case DW_AT_segment: 3967 case DW_AT_start_scope: 3968 case DW_AT_static_link: 3969 case DW_AT_trampoline: 3970 case DW_AT_visibility: 3971 case DW_AT_vtable_elem_location: 3972 case DW_AT_description: 3973 case DW_AT_sibling: 3974 break; 3975 } 3976 } 3977 } 3978 } 3979 3980 DEBUG_PRINTF ("0x%8.8x: %s (\"%s\")\n", die->GetOffset(), DW_TAG_value_to_name(tag), type_name_cstr); 3981 3982 clang_type_t return_clang_type = NULL; 3983 Type *func_type = NULL; 3984 3985 if (type_die_offset != DW_INVALID_OFFSET) 3986 func_type = ResolveTypeUID(type_die_offset); 3987 3988 if (func_type) 3989 return_clang_type = func_type->GetClangLayoutType(); 3990 else 3991 return_clang_type = ast.GetBuiltInType_void(); 3992 3993 3994 std::vector<clang_type_t> function_param_types; 3995 std::vector<clang::ParmVarDecl*> function_param_decls; 3996 3997 // Parse the function children for the parameters 3998 3999 clang::DeclContext *containing_decl_ctx = GetClangDeclContextContainingDIE (dwarf_cu, die); 4000 const clang::Decl::Kind containing_decl_kind = containing_decl_ctx->getDeclKind(); 4001 4002 const bool is_cxx_method = containing_decl_kind == clang::Decl::CXXRecord; 4003 // Start off static. This will be set to false in ParseChildParameters(...) 4004 // if we find a "this" paramters as the first parameter 4005 if (is_cxx_method) 4006 is_static = true; 4007 4008 if (die->HasChildren()) 4009 { 4010 bool skip_artificial = true; 4011 ParseChildParameters (sc, 4012 containing_decl_ctx, 4013 type_sp, 4014 dwarf_cu, 4015 die, 4016 skip_artificial, 4017 is_static, 4018 type_list, 4019 function_param_types, 4020 function_param_decls, 4021 type_quals); 4022 } 4023 4024 // clang_type will get the function prototype clang type after this call 4025 clang_type = ast.CreateFunctionType (return_clang_type, 4026 &function_param_types[0], 4027 function_param_types.size(), 4028 is_variadic, 4029 type_quals); 4030 4031 if (type_name_cstr) 4032 { 4033 bool type_handled = false; 4034 if (tag == DW_TAG_subprogram) 4035 { 4036 if (ObjCLanguageRuntime::IsPossibleObjCMethodName (type_name_cstr)) 4037 { 4038 // We need to find the DW_TAG_class_type or 4039 // DW_TAG_struct_type by name so we can add this 4040 // as a member function of the class. 4041 const char *class_name_start = type_name_cstr + 2; 4042 const char *class_name_end = ::strchr (class_name_start, ' '); 4043 SymbolContext empty_sc; 4044 clang_type_t class_opaque_type = NULL; 4045 if (class_name_start < class_name_end) 4046 { 4047 ConstString class_name (class_name_start, class_name_end - class_name_start); 4048 TypeList types; 4049 const uint32_t match_count = FindTypes (empty_sc, class_name, true, UINT32_MAX, types); 4050 if (match_count > 0) 4051 { 4052 for (uint32_t i=0; i<match_count; ++i) 4053 { 4054 Type *type = types.GetTypeAtIndex (i).get(); 4055 clang_type_t type_clang_forward_type = type->GetClangForwardType(); 4056 if (ClangASTContext::IsObjCClassType (type_clang_forward_type)) 4057 { 4058 class_opaque_type = type_clang_forward_type; 4059 break; 4060 } 4061 } 4062 } 4063 } 4064 4065 if (class_opaque_type) 4066 { 4067 // If accessibility isn't set to anything valid, assume public for 4068 // now... 4069 if (accessibility == eAccessNone) 4070 accessibility = eAccessPublic; 4071 4072 clang::ObjCMethodDecl *objc_method_decl; 4073 objc_method_decl = ast.AddMethodToObjCObjectType (class_opaque_type, 4074 type_name_cstr, 4075 clang_type, 4076 accessibility); 4077 LinkDeclContextToDIE(ClangASTContext::GetAsDeclContext(objc_method_decl), die); 4078 type_handled = objc_method_decl != NULL; 4079 } 4080 } 4081 else if (is_cxx_method) 4082 { 4083 // Look at the parent of this DIE and see if is is 4084 // a class or struct and see if this is actually a 4085 // C++ method 4086 Type *class_type = ResolveType (dwarf_cu, m_decl_ctx_to_die[containing_decl_ctx]); 4087 if (class_type) 4088 { 4089 if (specification_die_offset != DW_INVALID_OFFSET) 4090 { 4091 // We have a specification which we are going to base our function 4092 // prototype off of, so we need this type to be completed so that the 4093 // m_die_to_decl_ctx for the method in the specification has a valid 4094 // clang decl context. 4095 class_type->GetClangFullType(); 4096 // If we have a specification, then the function type should have been 4097 // made with the specification and not with this die. 4098 DWARFCompileUnitSP spec_cu_sp; 4099 const DWARFDebugInfoEntry* spec_die = DebugInfo()->GetDIEPtr(specification_die_offset, &spec_cu_sp); 4100 clang::DeclContext *spec_clang_decl_ctx = GetCachedClangDeclContextForDIE (spec_die); 4101 if (spec_clang_decl_ctx) 4102 { 4103 LinkDeclContextToDIE(spec_clang_decl_ctx, die); 4104 } 4105 else 4106 { 4107 ReportWarning ("0x%8.8x: DW_AT_specification(0x%8.8x) has no decl\n", 4108 die->GetOffset(), 4109 specification_die_offset); 4110 } 4111 type_handled = true; 4112 } 4113 else if (abstract_origin_die_offset != DW_INVALID_OFFSET) 4114 { 4115 // We have a specification which we are going to base our function 4116 // prototype off of, so we need this type to be completed so that the 4117 // m_die_to_decl_ctx for the method in the abstract origin has a valid 4118 // clang decl context. 4119 class_type->GetClangFullType(); 4120 4121 DWARFCompileUnitSP abs_cu_sp; 4122 const DWARFDebugInfoEntry* abs_die = DebugInfo()->GetDIEPtr(abstract_origin_die_offset, &abs_cu_sp); 4123 clang::DeclContext *abs_clang_decl_ctx = GetCachedClangDeclContextForDIE (abs_die); 4124 if (abs_clang_decl_ctx) 4125 { 4126 LinkDeclContextToDIE (abs_clang_decl_ctx, die); 4127 } 4128 else 4129 { 4130 ReportWarning ("0x%8.8x: DW_AT_abstract_origin(0x%8.8x) has no decl\n", 4131 die->GetOffset(), 4132 abstract_origin_die_offset); 4133 } 4134 type_handled = true; 4135 } 4136 else 4137 { 4138 clang_type_t class_opaque_type = class_type->GetClangForwardType(); 4139 if (ClangASTContext::IsCXXClassType (class_opaque_type)) 4140 { 4141 // Neither GCC 4.2 nor clang++ currently set a valid accessibility 4142 // in the DWARF for C++ methods... Default to public for now... 4143 if (accessibility == eAccessNone) 4144 accessibility = eAccessPublic; 4145 4146 if (!is_static && !die->HasChildren()) 4147 { 4148 // We have a C++ member function with no children (this pointer!) 4149 // and clang will get mad if we try and make a function that isn't 4150 // well formed in the DWARF, so we will just skip it... 4151 type_handled = true; 4152 } 4153 else 4154 { 4155 clang::CXXMethodDecl *cxx_method_decl; 4156 cxx_method_decl = ast.AddMethodToCXXRecordType (class_opaque_type, 4157 type_name_cstr, 4158 clang_type, 4159 accessibility, 4160 is_virtual, 4161 is_static, 4162 is_inline, 4163 is_explicit); 4164 LinkDeclContextToDIE(ClangASTContext::GetAsDeclContext(cxx_method_decl), die); 4165 4166 type_handled = cxx_method_decl != NULL; 4167 } 4168 } 4169 } 4170 } 4171 } 4172 } 4173 4174 if (!type_handled) 4175 { 4176 // We just have a function that isn't part of a class 4177 clang::FunctionDecl *function_decl = ast.CreateFunctionDeclaration (type_name_cstr, 4178 clang_type, 4179 storage, 4180 is_inline); 4181 4182 // Add the decl to our DIE to decl context map 4183 assert (function_decl); 4184 LinkDeclContextToDIE(function_decl, die); 4185 if (!function_param_decls.empty()) 4186 ast.SetFunctionParameters (function_decl, 4187 &function_param_decls.front(), 4188 function_param_decls.size()); 4189 } 4190 } 4191 type_sp.reset( new Type (die->GetOffset(), 4192 this, 4193 type_name_const_str, 4194 0, 4195 NULL, 4196 LLDB_INVALID_UID, 4197 Type::eEncodingIsUID, 4198 &decl, 4199 clang_type, 4200 Type::eResolveStateFull)); 4201 assert(type_sp.get()); 4202 } 4203 break; 4204 4205 case DW_TAG_array_type: 4206 { 4207 // Set a bit that lets us know that we are currently parsing this 4208 m_die_to_type[die] = DIE_IS_BEING_PARSED; 4209 4210 lldb::user_id_t type_die_offset = DW_INVALID_OFFSET; 4211 int64_t first_index = 0; 4212 uint32_t byte_stride = 0; 4213 uint32_t bit_stride = 0; 4214 const size_t num_attributes = die->GetAttributes(this, dwarf_cu, NULL, attributes); 4215 4216 if (num_attributes > 0) 4217 { 4218 uint32_t i; 4219 for (i=0; i<num_attributes; ++i) 4220 { 4221 attr = attributes.AttributeAtIndex(i); 4222 DWARFFormValue form_value; 4223 if (attributes.ExtractFormValueAtIndex(this, i, form_value)) 4224 { 4225 switch (attr) 4226 { 4227 case DW_AT_decl_file: decl.SetFile(sc.comp_unit->GetSupportFiles().GetFileSpecAtIndex(form_value.Unsigned())); break; 4228 case DW_AT_decl_line: decl.SetLine(form_value.Unsigned()); break; 4229 case DW_AT_decl_column: decl.SetColumn(form_value.Unsigned()); break; 4230 case DW_AT_name: 4231 type_name_cstr = form_value.AsCString(&get_debug_str_data()); 4232 type_name_const_str.SetCString(type_name_cstr); 4233 break; 4234 4235 case DW_AT_type: type_die_offset = form_value.Reference(dwarf_cu); break; 4236 case DW_AT_byte_size: byte_size = form_value.Unsigned(); byte_size_valid = true; break; 4237 case DW_AT_byte_stride: byte_stride = form_value.Unsigned(); break; 4238 case DW_AT_bit_stride: bit_stride = form_value.Unsigned(); break; 4239 case DW_AT_accessibility: accessibility = DW_ACCESS_to_AccessType(form_value.Unsigned()); break; 4240 case DW_AT_declaration: is_forward_declaration = form_value.Unsigned() != 0; break; 4241 case DW_AT_allocated: 4242 case DW_AT_associated: 4243 case DW_AT_data_location: 4244 case DW_AT_description: 4245 case DW_AT_ordering: 4246 case DW_AT_start_scope: 4247 case DW_AT_visibility: 4248 case DW_AT_specification: 4249 case DW_AT_abstract_origin: 4250 case DW_AT_sibling: 4251 break; 4252 } 4253 } 4254 } 4255 4256 DEBUG_PRINTF ("0x%8.8x: %s (\"%s\")\n", die->GetOffset(), DW_TAG_value_to_name(tag), type_name_cstr); 4257 4258 Type *element_type = ResolveTypeUID(type_die_offset); 4259 4260 if (element_type) 4261 { 4262 std::vector<uint64_t> element_orders; 4263 ParseChildArrayInfo(sc, dwarf_cu, die, first_index, element_orders, byte_stride, bit_stride); 4264 // We have an array that claims to have no members, lets give it at least one member... 4265 if (element_orders.empty()) 4266 element_orders.push_back (1); 4267 if (byte_stride == 0 && bit_stride == 0) 4268 byte_stride = element_type->GetByteSize(); 4269 clang_type_t array_element_type = element_type->GetClangFullType(); 4270 uint64_t array_element_bit_stride = byte_stride * 8 + bit_stride; 4271 uint64_t num_elements = 0; 4272 std::vector<uint64_t>::const_reverse_iterator pos; 4273 std::vector<uint64_t>::const_reverse_iterator end = element_orders.rend(); 4274 for (pos = element_orders.rbegin(); pos != end; ++pos) 4275 { 4276 num_elements = *pos; 4277 clang_type = ast.CreateArrayType (array_element_type, 4278 num_elements, 4279 num_elements * array_element_bit_stride); 4280 array_element_type = clang_type; 4281 array_element_bit_stride = array_element_bit_stride * num_elements; 4282 } 4283 ConstString empty_name; 4284 type_sp.reset( new Type (die->GetOffset(), 4285 this, 4286 empty_name, 4287 array_element_bit_stride / 8, 4288 NULL, 4289 type_die_offset, 4290 Type::eEncodingIsUID, 4291 &decl, 4292 clang_type, 4293 Type::eResolveStateFull)); 4294 type_sp->SetEncodingType (element_type); 4295 } 4296 } 4297 } 4298 break; 4299 4300 case DW_TAG_ptr_to_member_type: 4301 { 4302 dw_offset_t type_die_offset = DW_INVALID_OFFSET; 4303 dw_offset_t containing_type_die_offset = DW_INVALID_OFFSET; 4304 4305 const size_t num_attributes = die->GetAttributes(this, dwarf_cu, NULL, attributes); 4306 4307 if (num_attributes > 0) { 4308 uint32_t i; 4309 for (i=0; i<num_attributes; ++i) 4310 { 4311 attr = attributes.AttributeAtIndex(i); 4312 DWARFFormValue form_value; 4313 if (attributes.ExtractFormValueAtIndex(this, i, form_value)) 4314 { 4315 switch (attr) 4316 { 4317 case DW_AT_type: 4318 type_die_offset = form_value.Reference(dwarf_cu); break; 4319 case DW_AT_containing_type: 4320 containing_type_die_offset = form_value.Reference(dwarf_cu); break; 4321 } 4322 } 4323 } 4324 4325 Type *pointee_type = ResolveTypeUID(type_die_offset); 4326 Type *class_type = ResolveTypeUID(containing_type_die_offset); 4327 4328 clang_type_t pointee_clang_type = pointee_type->GetClangForwardType(); 4329 clang_type_t class_clang_type = class_type->GetClangLayoutType(); 4330 4331 clang_type = ast.CreateMemberPointerType(pointee_clang_type, 4332 class_clang_type); 4333 4334 byte_size = ClangASTType::GetClangTypeBitWidth (ast.getASTContext(), 4335 clang_type) / 8; 4336 4337 type_sp.reset( new Type (die->GetOffset(), 4338 this, 4339 type_name_const_str, 4340 byte_size, 4341 NULL, 4342 LLDB_INVALID_UID, 4343 Type::eEncodingIsUID, 4344 NULL, 4345 clang_type, 4346 Type::eResolveStateForward)); 4347 } 4348 4349 break; 4350 } 4351 default: 4352 assert(false && "Unhandled type tag!"); 4353 break; 4354 } 4355 4356 if (type_sp.get()) 4357 { 4358 const DWARFDebugInfoEntry *sc_parent_die = GetParentSymbolContextDIE(die); 4359 dw_tag_t sc_parent_tag = sc_parent_die ? sc_parent_die->Tag() : 0; 4360 4361 SymbolContextScope * symbol_context_scope = NULL; 4362 if (sc_parent_tag == DW_TAG_compile_unit) 4363 { 4364 symbol_context_scope = sc.comp_unit; 4365 } 4366 else if (sc.function != NULL) 4367 { 4368 symbol_context_scope = sc.function->GetBlock(true).FindBlockByID(sc_parent_die->GetOffset()); 4369 if (symbol_context_scope == NULL) 4370 symbol_context_scope = sc.function; 4371 } 4372 4373 if (symbol_context_scope != NULL) 4374 { 4375 type_sp->SetSymbolContextScope(symbol_context_scope); 4376 } 4377 4378 // We are ready to put this type into the uniqued list up at the module level 4379 type_list->Insert (type_sp); 4380 4381 m_die_to_type[die] = type_sp.get(); 4382 } 4383 } 4384 else if (type_ptr != DIE_IS_BEING_PARSED) 4385 { 4386 type_sp = type_list->FindType(type_ptr->GetID()); 4387 } 4388 } 4389 return type_sp; 4390 } 4391 4392 size_t 4393 SymbolFileDWARF::ParseTypes 4394 ( 4395 const SymbolContext& sc, 4396 DWARFCompileUnit* dwarf_cu, 4397 const DWARFDebugInfoEntry *die, 4398 bool parse_siblings, 4399 bool parse_children 4400 ) 4401 { 4402 size_t types_added = 0; 4403 while (die != NULL) 4404 { 4405 bool type_is_new = false; 4406 if (ParseType(sc, dwarf_cu, die, &type_is_new).get()) 4407 { 4408 if (type_is_new) 4409 ++types_added; 4410 } 4411 4412 if (parse_children && die->HasChildren()) 4413 { 4414 if (die->Tag() == DW_TAG_subprogram) 4415 { 4416 SymbolContext child_sc(sc); 4417 child_sc.function = sc.comp_unit->FindFunctionByUID(die->GetOffset()).get(); 4418 types_added += ParseTypes(child_sc, dwarf_cu, die->GetFirstChild(), true, true); 4419 } 4420 else 4421 types_added += ParseTypes(sc, dwarf_cu, die->GetFirstChild(), true, true); 4422 } 4423 4424 if (parse_siblings) 4425 die = die->GetSibling(); 4426 else 4427 die = NULL; 4428 } 4429 return types_added; 4430 } 4431 4432 4433 size_t 4434 SymbolFileDWARF::ParseFunctionBlocks (const SymbolContext &sc) 4435 { 4436 assert(sc.comp_unit && sc.function); 4437 size_t functions_added = 0; 4438 DWARFCompileUnit* dwarf_cu = GetDWARFCompileUnitForUID(sc.comp_unit->GetID()); 4439 if (dwarf_cu) 4440 { 4441 dw_offset_t function_die_offset = sc.function->GetID(); 4442 const DWARFDebugInfoEntry *function_die = dwarf_cu->GetDIEPtr(function_die_offset); 4443 if (function_die) 4444 { 4445 ParseFunctionBlocks(sc, &sc.function->GetBlock (false), dwarf_cu, function_die, LLDB_INVALID_ADDRESS, 0); 4446 } 4447 } 4448 4449 return functions_added; 4450 } 4451 4452 4453 size_t 4454 SymbolFileDWARF::ParseTypes (const SymbolContext &sc) 4455 { 4456 // At least a compile unit must be valid 4457 assert(sc.comp_unit); 4458 size_t types_added = 0; 4459 DWARFCompileUnit* dwarf_cu = GetDWARFCompileUnitForUID(sc.comp_unit->GetID()); 4460 if (dwarf_cu) 4461 { 4462 if (sc.function) 4463 { 4464 dw_offset_t function_die_offset = sc.function->GetID(); 4465 const DWARFDebugInfoEntry *func_die = dwarf_cu->GetDIEPtr(function_die_offset); 4466 if (func_die && func_die->HasChildren()) 4467 { 4468 types_added = ParseTypes(sc, dwarf_cu, func_die->GetFirstChild(), true, true); 4469 } 4470 } 4471 else 4472 { 4473 const DWARFDebugInfoEntry *dwarf_cu_die = dwarf_cu->DIE(); 4474 if (dwarf_cu_die && dwarf_cu_die->HasChildren()) 4475 { 4476 types_added = ParseTypes(sc, dwarf_cu, dwarf_cu_die->GetFirstChild(), true, true); 4477 } 4478 } 4479 } 4480 4481 return types_added; 4482 } 4483 4484 size_t 4485 SymbolFileDWARF::ParseVariablesForContext (const SymbolContext& sc) 4486 { 4487 if (sc.comp_unit != NULL) 4488 { 4489 DWARFDebugInfo* info = DebugInfo(); 4490 if (info == NULL) 4491 return 0; 4492 4493 uint32_t cu_idx = UINT32_MAX; 4494 DWARFCompileUnit* dwarf_cu = info->GetCompileUnit(sc.comp_unit->GetID(), &cu_idx).get(); 4495 4496 if (dwarf_cu == NULL) 4497 return 0; 4498 4499 if (sc.function) 4500 { 4501 const DWARFDebugInfoEntry *function_die = dwarf_cu->GetDIEPtr(sc.function->GetID()); 4502 4503 dw_addr_t func_lo_pc = function_die->GetAttributeValueAsUnsigned (this, dwarf_cu, DW_AT_low_pc, DW_INVALID_ADDRESS); 4504 assert (func_lo_pc != DW_INVALID_ADDRESS); 4505 4506 const size_t num_variables = ParseVariables(sc, dwarf_cu, func_lo_pc, function_die->GetFirstChild(), true, true); 4507 4508 // Let all blocks know they have parse all their variables 4509 sc.function->GetBlock (false).SetDidParseVariables (true, true); 4510 4511 return num_variables; 4512 } 4513 else if (sc.comp_unit) 4514 { 4515 uint32_t vars_added = 0; 4516 VariableListSP variables (sc.comp_unit->GetVariableList(false)); 4517 4518 if (variables.get() == NULL) 4519 { 4520 variables.reset(new VariableList()); 4521 sc.comp_unit->SetVariableList(variables); 4522 4523 DWARFCompileUnit* match_dwarf_cu = NULL; 4524 const DWARFDebugInfoEntry* die = NULL; 4525 DIEArray die_offsets; 4526 if (m_apple_names_ap.get()) 4527 { 4528 // TODO: implement finding all items in 4529 m_apple_names_ap->AppendAllDIEsInRange (dwarf_cu->GetOffset(), 4530 dwarf_cu->GetNextCompileUnitOffset(), 4531 die_offsets); 4532 } 4533 else 4534 { 4535 // Index if we already haven't to make sure the compile units 4536 // get indexed and make their global DIE index list 4537 if (!m_indexed) 4538 Index (); 4539 4540 m_global_index.FindAllEntriesForCompileUnit (dwarf_cu->GetOffset(), 4541 dwarf_cu->GetNextCompileUnitOffset(), 4542 die_offsets); 4543 } 4544 4545 const size_t num_matches = die_offsets.size(); 4546 if (num_matches) 4547 { 4548 DWARFDebugInfo* debug_info = DebugInfo(); 4549 for (size_t i=0; i<num_matches; ++i) 4550 { 4551 const dw_offset_t die_offset = die_offsets[i]; 4552 die = debug_info->GetDIEPtrWithCompileUnitHint (die_offset, &match_dwarf_cu); 4553 VariableSP var_sp (ParseVariableDIE(sc, dwarf_cu, die, LLDB_INVALID_ADDRESS)); 4554 if (var_sp) 4555 { 4556 variables->AddVariableIfUnique (var_sp); 4557 ++vars_added; 4558 } 4559 } 4560 } 4561 } 4562 return vars_added; 4563 } 4564 } 4565 return 0; 4566 } 4567 4568 4569 VariableSP 4570 SymbolFileDWARF::ParseVariableDIE 4571 ( 4572 const SymbolContext& sc, 4573 DWARFCompileUnit* dwarf_cu, 4574 const DWARFDebugInfoEntry *die, 4575 const lldb::addr_t func_low_pc 4576 ) 4577 { 4578 4579 VariableSP var_sp (m_die_to_variable_sp[die]); 4580 if (var_sp) 4581 return var_sp; // Already been parsed! 4582 4583 const dw_tag_t tag = die->Tag(); 4584 4585 if ((tag == DW_TAG_variable) || 4586 (tag == DW_TAG_constant) || 4587 (tag == DW_TAG_formal_parameter && sc.function)) 4588 { 4589 DWARFDebugInfoEntry::Attributes attributes; 4590 const size_t num_attributes = die->GetAttributes(this, dwarf_cu, NULL, attributes); 4591 if (num_attributes > 0) 4592 { 4593 const char *name = NULL; 4594 const char *mangled = NULL; 4595 Declaration decl; 4596 uint32_t i; 4597 Type *var_type = NULL; 4598 DWARFExpression location; 4599 bool is_external = false; 4600 bool is_artificial = false; 4601 bool location_is_const_value_data = false; 4602 AccessType accessibility = eAccessNone; 4603 4604 for (i=0; i<num_attributes; ++i) 4605 { 4606 dw_attr_t attr = attributes.AttributeAtIndex(i); 4607 DWARFFormValue form_value; 4608 if (attributes.ExtractFormValueAtIndex(this, i, form_value)) 4609 { 4610 switch (attr) 4611 { 4612 case DW_AT_decl_file: decl.SetFile(sc.comp_unit->GetSupportFiles().GetFileSpecAtIndex(form_value.Unsigned())); break; 4613 case DW_AT_decl_line: decl.SetLine(form_value.Unsigned()); break; 4614 case DW_AT_decl_column: decl.SetColumn(form_value.Unsigned()); break; 4615 case DW_AT_name: name = form_value.AsCString(&get_debug_str_data()); break; 4616 case DW_AT_MIPS_linkage_name: mangled = form_value.AsCString(&get_debug_str_data()); break; 4617 case DW_AT_type: var_type = ResolveTypeUID(form_value.Reference(dwarf_cu)); break; 4618 case DW_AT_external: is_external = form_value.Unsigned() != 0; break; 4619 case DW_AT_const_value: 4620 location_is_const_value_data = true; 4621 // Fall through... 4622 case DW_AT_location: 4623 { 4624 if (form_value.BlockData()) 4625 { 4626 const DataExtractor& debug_info_data = get_debug_info_data(); 4627 4628 uint32_t block_offset = form_value.BlockData() - debug_info_data.GetDataStart(); 4629 uint32_t block_length = form_value.Unsigned(); 4630 location.SetOpcodeData(get_debug_info_data(), block_offset, block_length); 4631 } 4632 else 4633 { 4634 const DataExtractor& debug_loc_data = get_debug_loc_data(); 4635 const dw_offset_t debug_loc_offset = form_value.Unsigned(); 4636 4637 size_t loc_list_length = DWARFLocationList::Size(debug_loc_data, debug_loc_offset); 4638 if (loc_list_length > 0) 4639 { 4640 location.SetOpcodeData(debug_loc_data, debug_loc_offset, loc_list_length); 4641 assert (func_low_pc != LLDB_INVALID_ADDRESS); 4642 location.SetLocationListSlide (func_low_pc - dwarf_cu->GetBaseAddress()); 4643 } 4644 } 4645 } 4646 break; 4647 4648 case DW_AT_artificial: is_artificial = form_value.Unsigned() != 0; break; 4649 case DW_AT_accessibility: accessibility = DW_ACCESS_to_AccessType(form_value.Unsigned()); break; 4650 case DW_AT_declaration: 4651 case DW_AT_description: 4652 case DW_AT_endianity: 4653 case DW_AT_segment: 4654 case DW_AT_start_scope: 4655 case DW_AT_visibility: 4656 default: 4657 case DW_AT_abstract_origin: 4658 case DW_AT_sibling: 4659 case DW_AT_specification: 4660 break; 4661 } 4662 } 4663 } 4664 4665 if (location.IsValid()) 4666 { 4667 assert(var_type != DIE_IS_BEING_PARSED); 4668 4669 ValueType scope = eValueTypeInvalid; 4670 4671 const DWARFDebugInfoEntry *sc_parent_die = GetParentSymbolContextDIE(die); 4672 dw_tag_t parent_tag = sc_parent_die ? sc_parent_die->Tag() : 0; 4673 4674 if (tag == DW_TAG_formal_parameter) 4675 scope = eValueTypeVariableArgument; 4676 else if (is_external || parent_tag == DW_TAG_compile_unit) 4677 scope = eValueTypeVariableGlobal; 4678 else 4679 scope = eValueTypeVariableLocal; 4680 4681 SymbolContextScope * symbol_context_scope = NULL; 4682 switch (parent_tag) 4683 { 4684 case DW_TAG_subprogram: 4685 case DW_TAG_inlined_subroutine: 4686 case DW_TAG_lexical_block: 4687 if (sc.function) 4688 { 4689 symbol_context_scope = sc.function->GetBlock(true).FindBlockByID(sc_parent_die->GetOffset()); 4690 if (symbol_context_scope == NULL) 4691 symbol_context_scope = sc.function; 4692 } 4693 break; 4694 4695 default: 4696 symbol_context_scope = sc.comp_unit; 4697 break; 4698 } 4699 4700 if (symbol_context_scope) 4701 { 4702 var_sp.reset (new Variable(die->GetOffset(), 4703 name, 4704 mangled, 4705 var_type, 4706 scope, 4707 symbol_context_scope, 4708 &decl, 4709 location, 4710 is_external, 4711 is_artificial)); 4712 4713 var_sp->SetLocationIsConstantValueData (location_is_const_value_data); 4714 } 4715 else 4716 { 4717 // Not ready to parse this variable yet. It might be a global 4718 // or static variable that is in a function scope and the function 4719 // in the symbol context wasn't filled in yet 4720 return var_sp; 4721 } 4722 } 4723 } 4724 // Cache var_sp even if NULL (the variable was just a specification or 4725 // was missing vital information to be able to be displayed in the debugger 4726 // (missing location due to optimization, etc)) so we don't re-parse 4727 // this DIE over and over later... 4728 m_die_to_variable_sp[die] = var_sp; 4729 } 4730 return var_sp; 4731 } 4732 4733 4734 const DWARFDebugInfoEntry * 4735 SymbolFileDWARF::FindBlockContainingSpecification (dw_offset_t func_die_offset, 4736 dw_offset_t spec_block_die_offset, 4737 DWARFCompileUnit **result_die_cu_handle) 4738 { 4739 // Give the concrete function die specified by "func_die_offset", find the 4740 // concrete block whose DW_AT_specification or DW_AT_abstract_origin points 4741 // to "spec_block_die_offset" 4742 DWARFDebugInfo* info = DebugInfo(); 4743 4744 const DWARFDebugInfoEntry *die = info->GetDIEPtrWithCompileUnitHint(func_die_offset, result_die_cu_handle); 4745 if (die) 4746 { 4747 assert (*result_die_cu_handle); 4748 return FindBlockContainingSpecification (*result_die_cu_handle, die, spec_block_die_offset, result_die_cu_handle); 4749 } 4750 return NULL; 4751 } 4752 4753 4754 const DWARFDebugInfoEntry * 4755 SymbolFileDWARF::FindBlockContainingSpecification(DWARFCompileUnit* dwarf_cu, 4756 const DWARFDebugInfoEntry *die, 4757 dw_offset_t spec_block_die_offset, 4758 DWARFCompileUnit **result_die_cu_handle) 4759 { 4760 if (die) 4761 { 4762 switch (die->Tag()) 4763 { 4764 case DW_TAG_subprogram: 4765 case DW_TAG_inlined_subroutine: 4766 case DW_TAG_lexical_block: 4767 { 4768 if (die->GetAttributeValueAsReference (this, dwarf_cu, DW_AT_specification, DW_INVALID_OFFSET) == spec_block_die_offset) 4769 { 4770 *result_die_cu_handle = dwarf_cu; 4771 return die; 4772 } 4773 4774 if (die->GetAttributeValueAsReference (this, dwarf_cu, DW_AT_abstract_origin, DW_INVALID_OFFSET) == spec_block_die_offset) 4775 { 4776 *result_die_cu_handle = dwarf_cu; 4777 return die; 4778 } 4779 } 4780 break; 4781 } 4782 4783 // Give the concrete function die specified by "func_die_offset", find the 4784 // concrete block whose DW_AT_specification or DW_AT_abstract_origin points 4785 // to "spec_block_die_offset" 4786 for (const DWARFDebugInfoEntry *child_die = die->GetFirstChild(); child_die != NULL; child_die = child_die->GetSibling()) 4787 { 4788 const DWARFDebugInfoEntry *result_die = FindBlockContainingSpecification (dwarf_cu, 4789 child_die, 4790 spec_block_die_offset, 4791 result_die_cu_handle); 4792 if (result_die) 4793 return result_die; 4794 } 4795 } 4796 4797 *result_die_cu_handle = NULL; 4798 return NULL; 4799 } 4800 4801 size_t 4802 SymbolFileDWARF::ParseVariables 4803 ( 4804 const SymbolContext& sc, 4805 DWARFCompileUnit* dwarf_cu, 4806 const lldb::addr_t func_low_pc, 4807 const DWARFDebugInfoEntry *orig_die, 4808 bool parse_siblings, 4809 bool parse_children, 4810 VariableList* cc_variable_list 4811 ) 4812 { 4813 if (orig_die == NULL) 4814 return 0; 4815 4816 VariableListSP variable_list_sp; 4817 4818 size_t vars_added = 0; 4819 const DWARFDebugInfoEntry *die = orig_die; 4820 while (die != NULL) 4821 { 4822 dw_tag_t tag = die->Tag(); 4823 4824 // Check to see if we have already parsed this variable or constant? 4825 if (m_die_to_variable_sp[die]) 4826 { 4827 if (cc_variable_list) 4828 cc_variable_list->AddVariableIfUnique (m_die_to_variable_sp[die]); 4829 } 4830 else 4831 { 4832 // We haven't already parsed it, lets do that now. 4833 if ((tag == DW_TAG_variable) || 4834 (tag == DW_TAG_constant) || 4835 (tag == DW_TAG_formal_parameter && sc.function)) 4836 { 4837 if (variable_list_sp.get() == NULL) 4838 { 4839 const DWARFDebugInfoEntry *sc_parent_die = GetParentSymbolContextDIE(orig_die); 4840 dw_tag_t parent_tag = sc_parent_die ? sc_parent_die->Tag() : 0; 4841 switch (parent_tag) 4842 { 4843 case DW_TAG_compile_unit: 4844 if (sc.comp_unit != NULL) 4845 { 4846 variable_list_sp = sc.comp_unit->GetVariableList(false); 4847 if (variable_list_sp.get() == NULL) 4848 { 4849 variable_list_sp.reset(new VariableList()); 4850 sc.comp_unit->SetVariableList(variable_list_sp); 4851 } 4852 } 4853 else 4854 { 4855 ReportError ("parent 0x%8.8x %s with no valid compile unit in symbol context for 0x%8.8x %s.\n", 4856 sc_parent_die->GetOffset(), 4857 DW_TAG_value_to_name (parent_tag), 4858 orig_die->GetOffset(), 4859 DW_TAG_value_to_name (orig_die->Tag())); 4860 } 4861 break; 4862 4863 case DW_TAG_subprogram: 4864 case DW_TAG_inlined_subroutine: 4865 case DW_TAG_lexical_block: 4866 if (sc.function != NULL) 4867 { 4868 // Check to see if we already have parsed the variables for the given scope 4869 4870 Block *block = sc.function->GetBlock(true).FindBlockByID(sc_parent_die->GetOffset()); 4871 if (block == NULL) 4872 { 4873 // This must be a specification or abstract origin with 4874 // a concrete block couterpart in the current function. We need 4875 // to find the concrete block so we can correctly add the 4876 // variable to it 4877 DWARFCompileUnit *concrete_block_die_cu = dwarf_cu; 4878 const DWARFDebugInfoEntry *concrete_block_die = FindBlockContainingSpecification (sc.function->GetID(), 4879 sc_parent_die->GetOffset(), 4880 &concrete_block_die_cu); 4881 if (concrete_block_die) 4882 block = sc.function->GetBlock(true).FindBlockByID(concrete_block_die->GetOffset()); 4883 } 4884 4885 if (block != NULL) 4886 { 4887 const bool can_create = false; 4888 variable_list_sp = block->GetBlockVariableList (can_create); 4889 if (variable_list_sp.get() == NULL) 4890 { 4891 variable_list_sp.reset(new VariableList()); 4892 block->SetVariableList(variable_list_sp); 4893 } 4894 } 4895 } 4896 break; 4897 4898 default: 4899 ReportError ("didn't find appropriate parent DIE for variable list for 0x%8.8x %s.\n", 4900 orig_die->GetOffset(), 4901 DW_TAG_value_to_name (orig_die->Tag())); 4902 break; 4903 } 4904 } 4905 4906 if (variable_list_sp) 4907 { 4908 VariableSP var_sp (ParseVariableDIE(sc, dwarf_cu, die, func_low_pc)); 4909 if (var_sp) 4910 { 4911 variable_list_sp->AddVariableIfUnique (var_sp); 4912 if (cc_variable_list) 4913 cc_variable_list->AddVariableIfUnique (var_sp); 4914 ++vars_added; 4915 } 4916 } 4917 } 4918 } 4919 4920 bool skip_children = (sc.function == NULL && tag == DW_TAG_subprogram); 4921 4922 if (!skip_children && parse_children && die->HasChildren()) 4923 { 4924 vars_added += ParseVariables(sc, dwarf_cu, func_low_pc, die->GetFirstChild(), true, true, cc_variable_list); 4925 } 4926 4927 if (parse_siblings) 4928 die = die->GetSibling(); 4929 else 4930 die = NULL; 4931 } 4932 return vars_added; 4933 } 4934 4935 //------------------------------------------------------------------ 4936 // PluginInterface protocol 4937 //------------------------------------------------------------------ 4938 const char * 4939 SymbolFileDWARF::GetPluginName() 4940 { 4941 return "SymbolFileDWARF"; 4942 } 4943 4944 const char * 4945 SymbolFileDWARF::GetShortPluginName() 4946 { 4947 return GetPluginNameStatic(); 4948 } 4949 4950 uint32_t 4951 SymbolFileDWARF::GetPluginVersion() 4952 { 4953 return 1; 4954 } 4955 4956 void 4957 SymbolFileDWARF::CompleteTagDecl (void *baton, clang::TagDecl *decl) 4958 { 4959 SymbolFileDWARF *symbol_file_dwarf = (SymbolFileDWARF *)baton; 4960 clang_type_t clang_type = symbol_file_dwarf->GetClangASTContext().GetTypeForDecl (decl); 4961 if (clang_type) 4962 symbol_file_dwarf->ResolveClangOpaqueTypeDefinition (clang_type); 4963 } 4964 4965 void 4966 SymbolFileDWARF::CompleteObjCInterfaceDecl (void *baton, clang::ObjCInterfaceDecl *decl) 4967 { 4968 SymbolFileDWARF *symbol_file_dwarf = (SymbolFileDWARF *)baton; 4969 clang_type_t clang_type = symbol_file_dwarf->GetClangASTContext().GetTypeForDecl (decl); 4970 if (clang_type) 4971 symbol_file_dwarf->ResolveClangOpaqueTypeDefinition (clang_type); 4972 } 4973 4974 void 4975 SymbolFileDWARF::DumpIndexes () 4976 { 4977 StreamFile s(stdout, false); 4978 4979 s.Printf ("DWARF index for (%s) '%s/%s':", 4980 GetObjectFile()->GetModule()->GetArchitecture().GetArchitectureName(), 4981 GetObjectFile()->GetFileSpec().GetDirectory().AsCString(), 4982 GetObjectFile()->GetFileSpec().GetFilename().AsCString()); 4983 s.Printf("\nFunction basenames:\n"); m_function_basename_index.Dump (&s); 4984 s.Printf("\nFunction fullnames:\n"); m_function_fullname_index.Dump (&s); 4985 s.Printf("\nFunction methods:\n"); m_function_method_index.Dump (&s); 4986 s.Printf("\nFunction selectors:\n"); m_function_selector_index.Dump (&s); 4987 s.Printf("\nObjective C class selectors:\n"); m_objc_class_selectors_index.Dump (&s); 4988 s.Printf("\nGlobals and statics:\n"); m_global_index.Dump (&s); 4989 s.Printf("\nTypes:\n"); m_type_index.Dump (&s); 4990 s.Printf("\nNamepaces:\n"); m_namespace_index.Dump (&s); 4991 } 4992 4993 void 4994 SymbolFileDWARF::SearchDeclContext (const clang::DeclContext *decl_context, 4995 const char *name, 4996 llvm::SmallVectorImpl <clang::NamedDecl *> *results) 4997 { 4998 DeclContextToDIEMap::iterator iter = m_decl_ctx_to_die.find(decl_context); 4999 5000 if (iter == m_decl_ctx_to_die.end()) 5001 return; 5002 5003 const DWARFDebugInfoEntry *context_die = iter->second; 5004 5005 if (!results) 5006 return; 5007 5008 DWARFDebugInfo* info = DebugInfo(); 5009 5010 DIEArray die_offsets; 5011 5012 DWARFCompileUnit* dwarf_cu = NULL; 5013 const DWARFDebugInfoEntry* die = NULL; 5014 size_t num_matches = m_type_index.Find (ConstString(name), die_offsets); 5015 5016 if (num_matches) 5017 { 5018 for (size_t i = 0; i < num_matches; ++i) 5019 { 5020 const dw_offset_t die_offset = die_offsets[i]; 5021 die = info->GetDIEPtrWithCompileUnitHint (die_offset, &dwarf_cu); 5022 5023 if (die->GetParent() != context_die) 5024 continue; 5025 5026 Type *matching_type = ResolveType (dwarf_cu, die); 5027 5028 lldb::clang_type_t type = matching_type->GetClangFullType(); 5029 clang::QualType qual_type = clang::QualType::getFromOpaquePtr(type); 5030 5031 if (const clang::TagType *tag_type = llvm::dyn_cast<clang::TagType>(qual_type.getTypePtr())) 5032 { 5033 clang::TagDecl *tag_decl = tag_type->getDecl(); 5034 results->push_back(tag_decl); 5035 } 5036 else if (const clang::TypedefType *typedef_type = llvm::dyn_cast<clang::TypedefType>(qual_type.getTypePtr())) 5037 { 5038 clang::TypedefNameDecl *typedef_decl = typedef_type->getDecl(); 5039 results->push_back(typedef_decl); 5040 } 5041 } 5042 } 5043 } 5044 5045 void 5046 SymbolFileDWARF::FindExternalVisibleDeclsByName (void *baton, 5047 const clang::DeclContext *DC, 5048 clang::DeclarationName Name, 5049 llvm::SmallVectorImpl <clang::NamedDecl *> *results) 5050 { 5051 SymbolFileDWARF *symbol_file_dwarf = (SymbolFileDWARF *)baton; 5052 5053 symbol_file_dwarf->SearchDeclContext (DC, Name.getAsString().c_str(), results); 5054 } 5055