1 //===--- lib/CodeGen/DIE.cpp - DWARF Info Entries -------------------------===// 2 // 3 // Part of the LLVM Project, under the Apache License v2.0 with LLVM Exceptions. 4 // See https://llvm.org/LICENSE.txt for license information. 5 // SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception 6 // 7 //===----------------------------------------------------------------------===// 8 // 9 // Data structures for DWARF info entries. 10 // 11 //===----------------------------------------------------------------------===// 12 13 #include "llvm/CodeGen/DIE.h" 14 #include "DwarfCompileUnit.h" 15 #include "DwarfDebug.h" 16 #include "DwarfUnit.h" 17 #include "llvm/ADT/Twine.h" 18 #include "llvm/CodeGen/AsmPrinter.h" 19 #include "llvm/Config/llvm-config.h" 20 #include "llvm/IR/DataLayout.h" 21 #include "llvm/MC/MCAsmInfo.h" 22 #include "llvm/MC/MCContext.h" 23 #include "llvm/MC/MCStreamer.h" 24 #include "llvm/MC/MCSymbol.h" 25 #include "llvm/Support/Debug.h" 26 #include "llvm/Support/ErrorHandling.h" 27 #include "llvm/Support/Format.h" 28 #include "llvm/Support/FormattedStream.h" 29 #include "llvm/Support/LEB128.h" 30 #include "llvm/Support/MD5.h" 31 #include "llvm/Support/raw_ostream.h" 32 using namespace llvm; 33 34 #define DEBUG_TYPE "dwarfdebug" 35 36 //===----------------------------------------------------------------------===// 37 // DIEAbbrevData Implementation 38 //===----------------------------------------------------------------------===// 39 40 /// Profile - Used to gather unique data for the abbreviation folding set. 41 /// 42 void DIEAbbrevData::Profile(FoldingSetNodeID &ID) const { 43 // Explicitly cast to an integer type for which FoldingSetNodeID has 44 // overloads. Otherwise MSVC 2010 thinks this call is ambiguous. 45 ID.AddInteger(unsigned(Attribute)); 46 ID.AddInteger(unsigned(Form)); 47 if (Form == dwarf::DW_FORM_implicit_const) 48 ID.AddInteger(Value); 49 } 50 51 //===----------------------------------------------------------------------===// 52 // DIEAbbrev Implementation 53 //===----------------------------------------------------------------------===// 54 55 /// Profile - Used to gather unique data for the abbreviation folding set. 56 /// 57 void DIEAbbrev::Profile(FoldingSetNodeID &ID) const { 58 ID.AddInteger(unsigned(Tag)); 59 ID.AddInteger(unsigned(Children)); 60 61 // For each attribute description. 62 for (unsigned i = 0, N = Data.size(); i < N; ++i) 63 Data[i].Profile(ID); 64 } 65 66 /// Emit - Print the abbreviation using the specified asm printer. 67 /// 68 void DIEAbbrev::Emit(const AsmPrinter *AP) const { 69 // Emit its Dwarf tag type. 70 AP->emitULEB128(Tag, dwarf::TagString(Tag).data()); 71 72 // Emit whether it has children DIEs. 73 AP->emitULEB128((unsigned)Children, dwarf::ChildrenString(Children).data()); 74 75 // For each attribute description. 76 for (unsigned i = 0, N = Data.size(); i < N; ++i) { 77 const DIEAbbrevData &AttrData = Data[i]; 78 79 // Emit attribute type. 80 AP->emitULEB128(AttrData.getAttribute(), 81 dwarf::AttributeString(AttrData.getAttribute()).data()); 82 83 // Emit form type. 84 #ifndef NDEBUG 85 // Could be an assertion, but this way we can see the failing form code 86 // easily, which helps track down where it came from. 87 if (!dwarf::isValidFormForVersion(AttrData.getForm(), 88 AP->getDwarfVersion())) { 89 LLVM_DEBUG(dbgs() << "Invalid form " << format("0x%x", AttrData.getForm()) 90 << " for DWARF version " << AP->getDwarfVersion() 91 << "\n"); 92 llvm_unreachable("Invalid form for specified DWARF version"); 93 } 94 #endif 95 AP->emitULEB128(AttrData.getForm(), 96 dwarf::FormEncodingString(AttrData.getForm()).data()); 97 98 // Emit value for DW_FORM_implicit_const. 99 if (AttrData.getForm() == dwarf::DW_FORM_implicit_const) 100 AP->emitSLEB128(AttrData.getValue()); 101 } 102 103 // Mark end of abbreviation. 104 AP->emitULEB128(0, "EOM(1)"); 105 AP->emitULEB128(0, "EOM(2)"); 106 } 107 108 LLVM_DUMP_METHOD 109 void DIEAbbrev::print(raw_ostream &O) const { 110 O << "Abbreviation @" 111 << format("0x%lx", (long)(intptr_t)this) 112 << " " 113 << dwarf::TagString(Tag) 114 << " " 115 << dwarf::ChildrenString(Children) 116 << '\n'; 117 118 for (unsigned i = 0, N = Data.size(); i < N; ++i) { 119 O << " " 120 << dwarf::AttributeString(Data[i].getAttribute()) 121 << " " 122 << dwarf::FormEncodingString(Data[i].getForm()); 123 124 if (Data[i].getForm() == dwarf::DW_FORM_implicit_const) 125 O << " " << Data[i].getValue(); 126 127 O << '\n'; 128 } 129 } 130 131 #if !defined(NDEBUG) || defined(LLVM_ENABLE_DUMP) 132 LLVM_DUMP_METHOD void DIEAbbrev::dump() const { 133 print(dbgs()); 134 } 135 #endif 136 137 //===----------------------------------------------------------------------===// 138 // DIEAbbrevSet Implementation 139 //===----------------------------------------------------------------------===// 140 141 DIEAbbrevSet::~DIEAbbrevSet() { 142 for (DIEAbbrev *Abbrev : Abbreviations) 143 Abbrev->~DIEAbbrev(); 144 } 145 146 DIEAbbrev &DIEAbbrevSet::uniqueAbbreviation(DIE &Die) { 147 148 FoldingSetNodeID ID; 149 DIEAbbrev Abbrev = Die.generateAbbrev(); 150 Abbrev.Profile(ID); 151 152 void *InsertPos; 153 if (DIEAbbrev *Existing = 154 AbbreviationsSet.FindNodeOrInsertPos(ID, InsertPos)) { 155 Die.setAbbrevNumber(Existing->getNumber()); 156 return *Existing; 157 } 158 159 // Move the abbreviation to the heap and assign a number. 160 DIEAbbrev *New = new (Alloc) DIEAbbrev(std::move(Abbrev)); 161 Abbreviations.push_back(New); 162 New->setNumber(Abbreviations.size()); 163 Die.setAbbrevNumber(Abbreviations.size()); 164 165 // Store it for lookup. 166 AbbreviationsSet.InsertNode(New, InsertPos); 167 return *New; 168 } 169 170 void DIEAbbrevSet::Emit(const AsmPrinter *AP, MCSection *Section) const { 171 if (!Abbreviations.empty()) { 172 // Start the debug abbrev section. 173 AP->OutStreamer->SwitchSection(Section); 174 AP->emitDwarfAbbrevs(Abbreviations); 175 } 176 } 177 178 //===----------------------------------------------------------------------===// 179 // DIE Implementation 180 //===----------------------------------------------------------------------===// 181 182 DIE *DIE::getParent() const { 183 return Owner.dyn_cast<DIE*>(); 184 } 185 186 DIEAbbrev DIE::generateAbbrev() const { 187 DIEAbbrev Abbrev(Tag, hasChildren()); 188 for (const DIEValue &V : values()) 189 if (V.getForm() == dwarf::DW_FORM_implicit_const) 190 Abbrev.AddImplicitConstAttribute(V.getAttribute(), 191 V.getDIEInteger().getValue()); 192 else 193 Abbrev.AddAttribute(V.getAttribute(), V.getForm()); 194 return Abbrev; 195 } 196 197 uint64_t DIE::getDebugSectionOffset() const { 198 const DIEUnit *Unit = getUnit(); 199 assert(Unit && "DIE must be owned by a DIEUnit to get its absolute offset"); 200 return Unit->getDebugSectionOffset() + getOffset(); 201 } 202 203 const DIE *DIE::getUnitDie() const { 204 const DIE *p = this; 205 while (p) { 206 if (p->getTag() == dwarf::DW_TAG_compile_unit || 207 p->getTag() == dwarf::DW_TAG_type_unit) 208 return p; 209 p = p->getParent(); 210 } 211 return nullptr; 212 } 213 214 DIEUnit *DIE::getUnit() const { 215 const DIE *UnitDie = getUnitDie(); 216 if (UnitDie) 217 return UnitDie->Owner.dyn_cast<DIEUnit*>(); 218 return nullptr; 219 } 220 221 DIEValue DIE::findAttribute(dwarf::Attribute Attribute) const { 222 // Iterate through all the attributes until we find the one we're 223 // looking for, if we can't find it return NULL. 224 for (const auto &V : values()) 225 if (V.getAttribute() == Attribute) 226 return V; 227 return DIEValue(); 228 } 229 230 LLVM_DUMP_METHOD 231 static void printValues(raw_ostream &O, const DIEValueList &Values, 232 StringRef Type, unsigned Size, unsigned IndentCount) { 233 O << Type << ": Size: " << Size << "\n"; 234 235 unsigned I = 0; 236 const std::string Indent(IndentCount, ' '); 237 for (const auto &V : Values.values()) { 238 O << Indent; 239 O << "Blk[" << I++ << "]"; 240 O << " " << dwarf::FormEncodingString(V.getForm()) << " "; 241 V.print(O); 242 O << "\n"; 243 } 244 } 245 246 LLVM_DUMP_METHOD 247 void DIE::print(raw_ostream &O, unsigned IndentCount) const { 248 const std::string Indent(IndentCount, ' '); 249 O << Indent << "Die: " << format("0x%lx", (long)(intptr_t) this) 250 << ", Offset: " << Offset << ", Size: " << Size << "\n"; 251 252 O << Indent << dwarf::TagString(getTag()) << " " 253 << dwarf::ChildrenString(hasChildren()) << "\n"; 254 255 IndentCount += 2; 256 for (const auto &V : values()) { 257 O << Indent; 258 O << dwarf::AttributeString(V.getAttribute()); 259 O << " " << dwarf::FormEncodingString(V.getForm()) << " "; 260 V.print(O); 261 O << "\n"; 262 } 263 IndentCount -= 2; 264 265 for (const auto &Child : children()) 266 Child.print(O, IndentCount + 4); 267 268 O << "\n"; 269 } 270 271 #if !defined(NDEBUG) || defined(LLVM_ENABLE_DUMP) 272 LLVM_DUMP_METHOD void DIE::dump() const { 273 print(dbgs()); 274 } 275 #endif 276 277 unsigned DIE::computeOffsetsAndAbbrevs(const dwarf::FormParams &FormParams, 278 DIEAbbrevSet &AbbrevSet, 279 unsigned CUOffset) { 280 // Unique the abbreviation and fill in the abbreviation number so this DIE 281 // can be emitted. 282 const DIEAbbrev &Abbrev = AbbrevSet.uniqueAbbreviation(*this); 283 284 // Set compile/type unit relative offset of this DIE. 285 setOffset(CUOffset); 286 287 // Add the byte size of the abbreviation code. 288 CUOffset += getULEB128Size(getAbbrevNumber()); 289 290 // Add the byte size of all the DIE attribute values. 291 for (const auto &V : values()) 292 CUOffset += V.sizeOf(FormParams); 293 294 // Let the children compute their offsets and abbreviation numbers. 295 if (hasChildren()) { 296 (void)Abbrev; 297 assert(Abbrev.hasChildren() && "Children flag not set"); 298 299 for (auto &Child : children()) 300 CUOffset = 301 Child.computeOffsetsAndAbbrevs(FormParams, AbbrevSet, CUOffset); 302 303 // Each child chain is terminated with a zero byte, adjust the offset. 304 CUOffset += sizeof(int8_t); 305 } 306 307 // Compute the byte size of this DIE and all of its children correctly. This 308 // is needed so that top level DIE can help the compile unit set its length 309 // correctly. 310 setSize(CUOffset - getOffset()); 311 return CUOffset; 312 } 313 314 //===----------------------------------------------------------------------===// 315 // DIEUnit Implementation 316 //===----------------------------------------------------------------------===// 317 DIEUnit::DIEUnit(dwarf::Tag UnitTag) 318 : Die(UnitTag), Section(nullptr), Offset(0) { 319 Die.Owner = this; 320 assert((UnitTag == dwarf::DW_TAG_compile_unit || 321 UnitTag == dwarf::DW_TAG_skeleton_unit || 322 UnitTag == dwarf::DW_TAG_type_unit || 323 UnitTag == dwarf::DW_TAG_partial_unit) && 324 "expected a unit TAG"); 325 } 326 327 void DIEValue::emitValue(const AsmPrinter *AP) const { 328 switch (Ty) { 329 case isNone: 330 llvm_unreachable("Expected valid DIEValue"); 331 #define HANDLE_DIEVALUE(T) \ 332 case is##T: \ 333 getDIE##T().emitValue(AP, Form); \ 334 break; 335 #include "llvm/CodeGen/DIEValue.def" 336 } 337 } 338 339 unsigned DIEValue::sizeOf(const dwarf::FormParams &FormParams) const { 340 switch (Ty) { 341 case isNone: 342 llvm_unreachable("Expected valid DIEValue"); 343 #define HANDLE_DIEVALUE(T) \ 344 case is##T: \ 345 return getDIE##T().sizeOf(FormParams, Form); 346 #include "llvm/CodeGen/DIEValue.def" 347 } 348 llvm_unreachable("Unknown DIE kind"); 349 } 350 351 LLVM_DUMP_METHOD 352 void DIEValue::print(raw_ostream &O) const { 353 switch (Ty) { 354 case isNone: 355 llvm_unreachable("Expected valid DIEValue"); 356 #define HANDLE_DIEVALUE(T) \ 357 case is##T: \ 358 getDIE##T().print(O); \ 359 break; 360 #include "llvm/CodeGen/DIEValue.def" 361 } 362 } 363 364 #if !defined(NDEBUG) || defined(LLVM_ENABLE_DUMP) 365 LLVM_DUMP_METHOD void DIEValue::dump() const { 366 print(dbgs()); 367 } 368 #endif 369 370 //===----------------------------------------------------------------------===// 371 // DIEInteger Implementation 372 //===----------------------------------------------------------------------===// 373 374 /// EmitValue - Emit integer of appropriate size. 375 /// 376 void DIEInteger::emitValue(const AsmPrinter *Asm, dwarf::Form Form) const { 377 switch (Form) { 378 case dwarf::DW_FORM_implicit_const: 379 case dwarf::DW_FORM_flag_present: 380 // Emit something to keep the lines and comments in sync. 381 // FIXME: Is there a better way to do this? 382 Asm->OutStreamer->AddBlankLine(); 383 return; 384 case dwarf::DW_FORM_flag: 385 case dwarf::DW_FORM_ref1: 386 case dwarf::DW_FORM_data1: 387 case dwarf::DW_FORM_strx1: 388 case dwarf::DW_FORM_addrx1: 389 case dwarf::DW_FORM_ref2: 390 case dwarf::DW_FORM_data2: 391 case dwarf::DW_FORM_strx2: 392 case dwarf::DW_FORM_addrx2: 393 case dwarf::DW_FORM_strx3: 394 case dwarf::DW_FORM_strp: 395 case dwarf::DW_FORM_ref4: 396 case dwarf::DW_FORM_data4: 397 case dwarf::DW_FORM_ref_sup4: 398 case dwarf::DW_FORM_strx4: 399 case dwarf::DW_FORM_addrx4: 400 case dwarf::DW_FORM_ref8: 401 case dwarf::DW_FORM_ref_sig8: 402 case dwarf::DW_FORM_data8: 403 case dwarf::DW_FORM_ref_sup8: 404 case dwarf::DW_FORM_GNU_ref_alt: 405 case dwarf::DW_FORM_GNU_strp_alt: 406 case dwarf::DW_FORM_line_strp: 407 case dwarf::DW_FORM_sec_offset: 408 case dwarf::DW_FORM_strp_sup: 409 case dwarf::DW_FORM_addr: 410 case dwarf::DW_FORM_ref_addr: 411 Asm->OutStreamer->emitIntValue(Integer, 412 sizeOf(Asm->getDwarfFormParams(), Form)); 413 return; 414 case dwarf::DW_FORM_GNU_str_index: 415 case dwarf::DW_FORM_GNU_addr_index: 416 case dwarf::DW_FORM_ref_udata: 417 case dwarf::DW_FORM_strx: 418 case dwarf::DW_FORM_addrx: 419 case dwarf::DW_FORM_rnglistx: 420 case dwarf::DW_FORM_udata: 421 Asm->emitULEB128(Integer); 422 return; 423 case dwarf::DW_FORM_sdata: 424 Asm->emitSLEB128(Integer); 425 return; 426 default: llvm_unreachable("DIE Value form not supported yet"); 427 } 428 } 429 430 /// sizeOf - Determine size of integer value in bytes. 431 /// 432 unsigned DIEInteger::sizeOf(const dwarf::FormParams &FormParams, 433 dwarf::Form Form) const { 434 if (Optional<uint8_t> FixedSize = 435 dwarf::getFixedFormByteSize(Form, FormParams)) 436 return *FixedSize; 437 438 switch (Form) { 439 case dwarf::DW_FORM_GNU_str_index: 440 case dwarf::DW_FORM_GNU_addr_index: 441 case dwarf::DW_FORM_ref_udata: 442 case dwarf::DW_FORM_strx: 443 case dwarf::DW_FORM_addrx: 444 case dwarf::DW_FORM_rnglistx: 445 case dwarf::DW_FORM_udata: 446 return getULEB128Size(Integer); 447 case dwarf::DW_FORM_sdata: 448 return getSLEB128Size(Integer); 449 default: llvm_unreachable("DIE Value form not supported yet"); 450 } 451 } 452 453 LLVM_DUMP_METHOD 454 void DIEInteger::print(raw_ostream &O) const { 455 O << "Int: " << (int64_t)Integer << " 0x"; 456 O.write_hex(Integer); 457 } 458 459 //===----------------------------------------------------------------------===// 460 // DIEExpr Implementation 461 //===----------------------------------------------------------------------===// 462 463 /// EmitValue - Emit expression value. 464 /// 465 void DIEExpr::emitValue(const AsmPrinter *AP, dwarf::Form Form) const { 466 AP->emitDebugValue(Expr, sizeOf(AP->getDwarfFormParams(), Form)); 467 } 468 469 /// SizeOf - Determine size of expression value in bytes. 470 /// 471 unsigned DIEExpr::sizeOf(const dwarf::FormParams &FormParams, 472 dwarf::Form Form) const { 473 switch (Form) { 474 case dwarf::DW_FORM_data4: 475 return 4; 476 case dwarf::DW_FORM_data8: 477 return 8; 478 case dwarf::DW_FORM_sec_offset: 479 return FormParams.getDwarfOffsetByteSize(); 480 default: 481 llvm_unreachable("DIE Value form not supported yet"); 482 } 483 } 484 485 LLVM_DUMP_METHOD 486 void DIEExpr::print(raw_ostream &O) const { O << "Expr: " << *Expr; } 487 488 //===----------------------------------------------------------------------===// 489 // DIELabel Implementation 490 //===----------------------------------------------------------------------===// 491 492 /// EmitValue - Emit label value. 493 /// 494 void DIELabel::emitValue(const AsmPrinter *AP, dwarf::Form Form) const { 495 bool IsSectionRelative = Form != dwarf::DW_FORM_addr; 496 AP->emitLabelReference(Label, sizeOf(AP->getDwarfFormParams(), Form), 497 IsSectionRelative); 498 } 499 500 /// sizeOf - Determine size of label value in bytes. 501 /// 502 unsigned DIELabel::sizeOf(const dwarf::FormParams &FormParams, 503 dwarf::Form Form) const { 504 switch (Form) { 505 case dwarf::DW_FORM_data4: 506 return 4; 507 case dwarf::DW_FORM_data8: 508 return 8; 509 case dwarf::DW_FORM_sec_offset: 510 case dwarf::DW_FORM_strp: 511 return FormParams.getDwarfOffsetByteSize(); 512 case dwarf::DW_FORM_addr: 513 return FormParams.AddrSize; 514 default: 515 llvm_unreachable("DIE Value form not supported yet"); 516 } 517 } 518 519 LLVM_DUMP_METHOD 520 void DIELabel::print(raw_ostream &O) const { O << "Lbl: " << Label->getName(); } 521 522 //===----------------------------------------------------------------------===// 523 // DIEBaseTypeRef Implementation 524 //===----------------------------------------------------------------------===// 525 526 void DIEBaseTypeRef::emitValue(const AsmPrinter *AP, dwarf::Form Form) const { 527 uint64_t Offset = CU->ExprRefedBaseTypes[Index].Die->getOffset(); 528 assert(Offset < (1ULL << (ULEB128PadSize * 7)) && "Offset wont fit"); 529 AP->emitULEB128(Offset, nullptr, ULEB128PadSize); 530 } 531 532 unsigned DIEBaseTypeRef::sizeOf(const dwarf::FormParams &, dwarf::Form) const { 533 return ULEB128PadSize; 534 } 535 536 LLVM_DUMP_METHOD 537 void DIEBaseTypeRef::print(raw_ostream &O) const { O << "BaseTypeRef: " << Index; } 538 539 //===----------------------------------------------------------------------===// 540 // DIEDelta Implementation 541 //===----------------------------------------------------------------------===// 542 543 /// EmitValue - Emit delta value. 544 /// 545 void DIEDelta::emitValue(const AsmPrinter *AP, dwarf::Form Form) const { 546 AP->emitLabelDifference(LabelHi, LabelLo, 547 sizeOf(AP->getDwarfFormParams(), Form)); 548 } 549 550 /// SizeOf - Determine size of delta value in bytes. 551 /// 552 unsigned DIEDelta::sizeOf(const dwarf::FormParams &FormParams, 553 dwarf::Form Form) const { 554 switch (Form) { 555 case dwarf::DW_FORM_data4: 556 return 4; 557 case dwarf::DW_FORM_data8: 558 return 8; 559 case dwarf::DW_FORM_sec_offset: 560 return FormParams.getDwarfOffsetByteSize(); 561 default: 562 llvm_unreachable("DIE Value form not supported yet"); 563 } 564 } 565 566 LLVM_DUMP_METHOD 567 void DIEDelta::print(raw_ostream &O) const { 568 O << "Del: " << LabelHi->getName() << "-" << LabelLo->getName(); 569 } 570 571 //===----------------------------------------------------------------------===// 572 // DIEString Implementation 573 //===----------------------------------------------------------------------===// 574 575 /// EmitValue - Emit string value. 576 /// 577 void DIEString::emitValue(const AsmPrinter *AP, dwarf::Form Form) const { 578 // Index of string in symbol table. 579 switch (Form) { 580 case dwarf::DW_FORM_GNU_str_index: 581 case dwarf::DW_FORM_strx: 582 case dwarf::DW_FORM_strx1: 583 case dwarf::DW_FORM_strx2: 584 case dwarf::DW_FORM_strx3: 585 case dwarf::DW_FORM_strx4: 586 DIEInteger(S.getIndex()).emitValue(AP, Form); 587 return; 588 case dwarf::DW_FORM_strp: 589 if (AP->MAI->doesDwarfUseRelocationsAcrossSections()) 590 DIELabel(S.getSymbol()).emitValue(AP, Form); 591 else 592 DIEInteger(S.getOffset()).emitValue(AP, Form); 593 return; 594 default: 595 llvm_unreachable("Expected valid string form"); 596 } 597 } 598 599 /// sizeOf - Determine size of delta value in bytes. 600 /// 601 unsigned DIEString::sizeOf(const dwarf::FormParams &FormParams, 602 dwarf::Form Form) const { 603 // Index of string in symbol table. 604 switch (Form) { 605 case dwarf::DW_FORM_GNU_str_index: 606 case dwarf::DW_FORM_strx: 607 case dwarf::DW_FORM_strx1: 608 case dwarf::DW_FORM_strx2: 609 case dwarf::DW_FORM_strx3: 610 case dwarf::DW_FORM_strx4: 611 return DIEInteger(S.getIndex()).sizeOf(FormParams, Form); 612 case dwarf::DW_FORM_strp: 613 if (FormParams.DwarfUsesRelocationsAcrossSections) 614 return DIELabel(S.getSymbol()).sizeOf(FormParams, Form); 615 return DIEInteger(S.getOffset()).sizeOf(FormParams, Form); 616 default: 617 llvm_unreachable("Expected valid string form"); 618 } 619 } 620 621 LLVM_DUMP_METHOD 622 void DIEString::print(raw_ostream &O) const { 623 O << "String: " << S.getString(); 624 } 625 626 //===----------------------------------------------------------------------===// 627 // DIEInlineString Implementation 628 //===----------------------------------------------------------------------===// 629 void DIEInlineString::emitValue(const AsmPrinter *AP, dwarf::Form Form) const { 630 if (Form == dwarf::DW_FORM_string) { 631 AP->OutStreamer->emitBytes(S); 632 AP->emitInt8(0); 633 return; 634 } 635 llvm_unreachable("Expected valid string form"); 636 } 637 638 unsigned DIEInlineString::sizeOf(const dwarf::FormParams &, dwarf::Form) const { 639 // Emit string bytes + NULL byte. 640 return S.size() + 1; 641 } 642 643 LLVM_DUMP_METHOD 644 void DIEInlineString::print(raw_ostream &O) const { 645 O << "InlineString: " << S; 646 } 647 648 //===----------------------------------------------------------------------===// 649 // DIEEntry Implementation 650 //===----------------------------------------------------------------------===// 651 652 /// EmitValue - Emit debug information entry offset. 653 /// 654 void DIEEntry::emitValue(const AsmPrinter *AP, dwarf::Form Form) const { 655 656 switch (Form) { 657 case dwarf::DW_FORM_ref1: 658 case dwarf::DW_FORM_ref2: 659 case dwarf::DW_FORM_ref4: 660 case dwarf::DW_FORM_ref8: 661 AP->OutStreamer->emitIntValue(Entry->getOffset(), 662 sizeOf(AP->getDwarfFormParams(), Form)); 663 return; 664 665 case dwarf::DW_FORM_ref_udata: 666 AP->emitULEB128(Entry->getOffset()); 667 return; 668 669 case dwarf::DW_FORM_ref_addr: { 670 // Get the absolute offset for this DIE within the debug info/types section. 671 uint64_t Addr = Entry->getDebugSectionOffset(); 672 if (const MCSymbol *SectionSym = 673 Entry->getUnit()->getCrossSectionRelativeBaseAddress()) { 674 AP->emitLabelPlusOffset(SectionSym, Addr, 675 sizeOf(AP->getDwarfFormParams(), Form), true); 676 return; 677 } 678 679 AP->OutStreamer->emitIntValue(Addr, sizeOf(AP->getDwarfFormParams(), Form)); 680 return; 681 } 682 default: 683 llvm_unreachable("Improper form for DIE reference"); 684 } 685 } 686 687 unsigned DIEEntry::sizeOf(const dwarf::FormParams &FormParams, 688 dwarf::Form Form) const { 689 switch (Form) { 690 case dwarf::DW_FORM_ref1: 691 return 1; 692 case dwarf::DW_FORM_ref2: 693 return 2; 694 case dwarf::DW_FORM_ref4: 695 return 4; 696 case dwarf::DW_FORM_ref8: 697 return 8; 698 case dwarf::DW_FORM_ref_udata: 699 return getULEB128Size(Entry->getOffset()); 700 case dwarf::DW_FORM_ref_addr: 701 return FormParams.getRefAddrByteSize(); 702 703 default: 704 llvm_unreachable("Improper form for DIE reference"); 705 } 706 } 707 708 LLVM_DUMP_METHOD 709 void DIEEntry::print(raw_ostream &O) const { 710 O << format("Die: 0x%lx", (long)(intptr_t)&Entry); 711 } 712 713 //===----------------------------------------------------------------------===// 714 // DIELoc Implementation 715 //===----------------------------------------------------------------------===// 716 717 unsigned DIELoc::computeSize(const dwarf::FormParams &FormParams) const { 718 if (!Size) { 719 for (const auto &V : values()) 720 Size += V.sizeOf(FormParams); 721 } 722 723 return Size; 724 } 725 726 /// EmitValue - Emit location data. 727 /// 728 void DIELoc::emitValue(const AsmPrinter *Asm, dwarf::Form Form) const { 729 switch (Form) { 730 default: llvm_unreachable("Improper form for block"); 731 case dwarf::DW_FORM_block1: Asm->emitInt8(Size); break; 732 case dwarf::DW_FORM_block2: Asm->emitInt16(Size); break; 733 case dwarf::DW_FORM_block4: Asm->emitInt32(Size); break; 734 case dwarf::DW_FORM_block: 735 case dwarf::DW_FORM_exprloc: 736 Asm->emitULEB128(Size); 737 break; 738 } 739 740 for (const auto &V : values()) 741 V.emitValue(Asm); 742 } 743 744 /// sizeOf - Determine size of location data in bytes. 745 /// 746 unsigned DIELoc::sizeOf(const dwarf::FormParams &, dwarf::Form Form) const { 747 switch (Form) { 748 case dwarf::DW_FORM_block1: return Size + sizeof(int8_t); 749 case dwarf::DW_FORM_block2: return Size + sizeof(int16_t); 750 case dwarf::DW_FORM_block4: return Size + sizeof(int32_t); 751 case dwarf::DW_FORM_block: 752 case dwarf::DW_FORM_exprloc: 753 return Size + getULEB128Size(Size); 754 default: llvm_unreachable("Improper form for block"); 755 } 756 } 757 758 LLVM_DUMP_METHOD 759 void DIELoc::print(raw_ostream &O) const { 760 printValues(O, *this, "ExprLoc", Size, 5); 761 } 762 763 //===----------------------------------------------------------------------===// 764 // DIEBlock Implementation 765 //===----------------------------------------------------------------------===// 766 767 unsigned DIEBlock::computeSize(const dwarf::FormParams &FormParams) const { 768 if (!Size) { 769 for (const auto &V : values()) 770 Size += V.sizeOf(FormParams); 771 } 772 773 return Size; 774 } 775 776 /// EmitValue - Emit block data. 777 /// 778 void DIEBlock::emitValue(const AsmPrinter *Asm, dwarf::Form Form) const { 779 switch (Form) { 780 default: llvm_unreachable("Improper form for block"); 781 case dwarf::DW_FORM_block1: Asm->emitInt8(Size); break; 782 case dwarf::DW_FORM_block2: Asm->emitInt16(Size); break; 783 case dwarf::DW_FORM_block4: Asm->emitInt32(Size); break; 784 case dwarf::DW_FORM_exprloc: 785 case dwarf::DW_FORM_block: 786 Asm->emitULEB128(Size); 787 break; 788 case dwarf::DW_FORM_string: break; 789 case dwarf::DW_FORM_data16: break; 790 } 791 792 for (const auto &V : values()) 793 V.emitValue(Asm); 794 } 795 796 /// sizeOf - Determine size of block data in bytes. 797 /// 798 unsigned DIEBlock::sizeOf(const dwarf::FormParams &, dwarf::Form Form) const { 799 switch (Form) { 800 case dwarf::DW_FORM_block1: return Size + sizeof(int8_t); 801 case dwarf::DW_FORM_block2: return Size + sizeof(int16_t); 802 case dwarf::DW_FORM_block4: return Size + sizeof(int32_t); 803 case dwarf::DW_FORM_exprloc: 804 case dwarf::DW_FORM_block: return Size + getULEB128Size(Size); 805 case dwarf::DW_FORM_data16: return 16; 806 default: llvm_unreachable("Improper form for block"); 807 } 808 } 809 810 LLVM_DUMP_METHOD 811 void DIEBlock::print(raw_ostream &O) const { 812 printValues(O, *this, "Blk", Size, 5); 813 } 814 815 //===----------------------------------------------------------------------===// 816 // DIELocList Implementation 817 //===----------------------------------------------------------------------===// 818 819 unsigned DIELocList::sizeOf(const dwarf::FormParams &FormParams, 820 dwarf::Form Form) const { 821 switch (Form) { 822 case dwarf::DW_FORM_loclistx: 823 return getULEB128Size(Index); 824 case dwarf::DW_FORM_data4: 825 assert(FormParams.Format != dwarf::DWARF64 && 826 "DW_FORM_data4 is not suitable to emit a pointer to a location list " 827 "in the 64-bit DWARF format"); 828 return 4; 829 case dwarf::DW_FORM_data8: 830 assert(FormParams.Format == dwarf::DWARF64 && 831 "DW_FORM_data8 is not suitable to emit a pointer to a location list " 832 "in the 32-bit DWARF format"); 833 return 8; 834 case dwarf::DW_FORM_sec_offset: 835 return FormParams.getDwarfOffsetByteSize(); 836 default: 837 llvm_unreachable("DIE Value form not supported yet"); 838 } 839 } 840 841 /// EmitValue - Emit label value. 842 /// 843 void DIELocList::emitValue(const AsmPrinter *AP, dwarf::Form Form) const { 844 if (Form == dwarf::DW_FORM_loclistx) { 845 AP->emitULEB128(Index); 846 return; 847 } 848 DwarfDebug *DD = AP->getDwarfDebug(); 849 MCSymbol *Label = DD->getDebugLocs().getList(Index).Label; 850 AP->emitDwarfSymbolReference(Label, /*ForceOffset*/ DD->useSplitDwarf()); 851 } 852 853 LLVM_DUMP_METHOD 854 void DIELocList::print(raw_ostream &O) const { O << "LocList: " << Index; } 855 856 //===----------------------------------------------------------------------===// 857 // DIEAddrOffset Implementation 858 //===----------------------------------------------------------------------===// 859 860 unsigned DIEAddrOffset::sizeOf(const dwarf::FormParams &FormParams, 861 dwarf::Form) const { 862 return Addr.sizeOf(FormParams, dwarf::DW_FORM_addrx) + 863 Offset.sizeOf(FormParams, dwarf::DW_FORM_data4); 864 } 865 866 /// EmitValue - Emit label value. 867 /// 868 void DIEAddrOffset::emitValue(const AsmPrinter *AP, dwarf::Form Form) const { 869 Addr.emitValue(AP, dwarf::DW_FORM_addrx); 870 Offset.emitValue(AP, dwarf::DW_FORM_data4); 871 } 872 873 LLVM_DUMP_METHOD 874 void DIEAddrOffset::print(raw_ostream &O) const { 875 O << "AddrOffset: "; 876 Addr.print(O); 877 O << " + "; 878 Offset.print(O); 879 } 880