10b57cec5SDimitry Andric //===--- lib/CodeGen/DIE.cpp - DWARF Info Entries -------------------------===// 20b57cec5SDimitry Andric // 30b57cec5SDimitry Andric // Part of the LLVM Project, under the Apache License v2.0 with LLVM Exceptions. 40b57cec5SDimitry Andric // See https://llvm.org/LICENSE.txt for license information. 50b57cec5SDimitry Andric // SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception 60b57cec5SDimitry Andric // 70b57cec5SDimitry Andric //===----------------------------------------------------------------------===// 80b57cec5SDimitry Andric // 90b57cec5SDimitry Andric // Data structures for DWARF info entries. 100b57cec5SDimitry Andric // 110b57cec5SDimitry Andric //===----------------------------------------------------------------------===// 120b57cec5SDimitry Andric 130b57cec5SDimitry Andric #include "llvm/CodeGen/DIE.h" 140b57cec5SDimitry Andric #include "DwarfCompileUnit.h" 150b57cec5SDimitry Andric #include "DwarfDebug.h" 160b57cec5SDimitry Andric #include "llvm/CodeGen/AsmPrinter.h" 170b57cec5SDimitry Andric #include "llvm/Config/llvm-config.h" 180b57cec5SDimitry Andric #include "llvm/MC/MCAsmInfo.h" 190b57cec5SDimitry Andric #include "llvm/MC/MCStreamer.h" 200b57cec5SDimitry Andric #include "llvm/MC/MCSymbol.h" 210b57cec5SDimitry Andric #include "llvm/Support/Debug.h" 220b57cec5SDimitry Andric #include "llvm/Support/ErrorHandling.h" 230b57cec5SDimitry Andric #include "llvm/Support/Format.h" 240b57cec5SDimitry Andric #include "llvm/Support/LEB128.h" 250b57cec5SDimitry Andric #include "llvm/Support/raw_ostream.h" 260b57cec5SDimitry Andric using namespace llvm; 270b57cec5SDimitry Andric 280b57cec5SDimitry Andric #define DEBUG_TYPE "dwarfdebug" 290b57cec5SDimitry Andric 300b57cec5SDimitry Andric //===----------------------------------------------------------------------===// 310b57cec5SDimitry Andric // DIEAbbrevData Implementation 320b57cec5SDimitry Andric //===----------------------------------------------------------------------===// 330b57cec5SDimitry Andric 340b57cec5SDimitry Andric /// Profile - Used to gather unique data for the abbreviation folding set. 350b57cec5SDimitry Andric /// 360b57cec5SDimitry Andric void DIEAbbrevData::Profile(FoldingSetNodeID &ID) const { 370b57cec5SDimitry Andric // Explicitly cast to an integer type for which FoldingSetNodeID has 380b57cec5SDimitry Andric // overloads. Otherwise MSVC 2010 thinks this call is ambiguous. 390b57cec5SDimitry Andric ID.AddInteger(unsigned(Attribute)); 400b57cec5SDimitry Andric ID.AddInteger(unsigned(Form)); 410b57cec5SDimitry Andric if (Form == dwarf::DW_FORM_implicit_const) 420b57cec5SDimitry Andric ID.AddInteger(Value); 430b57cec5SDimitry Andric } 440b57cec5SDimitry Andric 450b57cec5SDimitry Andric //===----------------------------------------------------------------------===// 460b57cec5SDimitry Andric // DIEAbbrev Implementation 470b57cec5SDimitry Andric //===----------------------------------------------------------------------===// 480b57cec5SDimitry Andric 490b57cec5SDimitry Andric /// Profile - Used to gather unique data for the abbreviation folding set. 500b57cec5SDimitry Andric /// 510b57cec5SDimitry Andric void DIEAbbrev::Profile(FoldingSetNodeID &ID) const { 520b57cec5SDimitry Andric ID.AddInteger(unsigned(Tag)); 530b57cec5SDimitry Andric ID.AddInteger(unsigned(Children)); 540b57cec5SDimitry Andric 550b57cec5SDimitry Andric // For each attribute description. 56*0fca6ea1SDimitry Andric for (const DIEAbbrevData &D : Data) 57*0fca6ea1SDimitry Andric D.Profile(ID); 580b57cec5SDimitry Andric } 590b57cec5SDimitry Andric 600b57cec5SDimitry Andric /// Emit - Print the abbreviation using the specified asm printer. 610b57cec5SDimitry Andric /// 620b57cec5SDimitry Andric void DIEAbbrev::Emit(const AsmPrinter *AP) const { 630b57cec5SDimitry Andric // Emit its Dwarf tag type. 645ffd83dbSDimitry Andric AP->emitULEB128(Tag, dwarf::TagString(Tag).data()); 650b57cec5SDimitry Andric 660b57cec5SDimitry Andric // Emit whether it has children DIEs. 675ffd83dbSDimitry Andric AP->emitULEB128((unsigned)Children, dwarf::ChildrenString(Children).data()); 680b57cec5SDimitry Andric 690b57cec5SDimitry Andric // For each attribute description. 70*0fca6ea1SDimitry Andric for (const DIEAbbrevData &AttrData : Data) { 710b57cec5SDimitry Andric // Emit attribute type. 725ffd83dbSDimitry Andric AP->emitULEB128(AttrData.getAttribute(), 730b57cec5SDimitry Andric dwarf::AttributeString(AttrData.getAttribute()).data()); 740b57cec5SDimitry Andric 750b57cec5SDimitry Andric // Emit form type. 760b57cec5SDimitry Andric #ifndef NDEBUG 770b57cec5SDimitry Andric // Could be an assertion, but this way we can see the failing form code 780b57cec5SDimitry Andric // easily, which helps track down where it came from. 790b57cec5SDimitry Andric if (!dwarf::isValidFormForVersion(AttrData.getForm(), 800b57cec5SDimitry Andric AP->getDwarfVersion())) { 810b57cec5SDimitry Andric LLVM_DEBUG(dbgs() << "Invalid form " << format("0x%x", AttrData.getForm()) 820b57cec5SDimitry Andric << " for DWARF version " << AP->getDwarfVersion() 830b57cec5SDimitry Andric << "\n"); 840b57cec5SDimitry Andric llvm_unreachable("Invalid form for specified DWARF version"); 850b57cec5SDimitry Andric } 860b57cec5SDimitry Andric #endif 875ffd83dbSDimitry Andric AP->emitULEB128(AttrData.getForm(), 880b57cec5SDimitry Andric dwarf::FormEncodingString(AttrData.getForm()).data()); 890b57cec5SDimitry Andric 900b57cec5SDimitry Andric // Emit value for DW_FORM_implicit_const. 910b57cec5SDimitry Andric if (AttrData.getForm() == dwarf::DW_FORM_implicit_const) 925ffd83dbSDimitry Andric AP->emitSLEB128(AttrData.getValue()); 930b57cec5SDimitry Andric } 940b57cec5SDimitry Andric 950b57cec5SDimitry Andric // Mark end of abbreviation. 965ffd83dbSDimitry Andric AP->emitULEB128(0, "EOM(1)"); 975ffd83dbSDimitry Andric AP->emitULEB128(0, "EOM(2)"); 980b57cec5SDimitry Andric } 990b57cec5SDimitry Andric 1000b57cec5SDimitry Andric LLVM_DUMP_METHOD 1010b57cec5SDimitry Andric void DIEAbbrev::print(raw_ostream &O) const { 1020b57cec5SDimitry Andric O << "Abbreviation @" 1030b57cec5SDimitry Andric << format("0x%lx", (long)(intptr_t)this) 1040b57cec5SDimitry Andric << " " 1050b57cec5SDimitry Andric << dwarf::TagString(Tag) 1060b57cec5SDimitry Andric << " " 1070b57cec5SDimitry Andric << dwarf::ChildrenString(Children) 1080b57cec5SDimitry Andric << '\n'; 1090b57cec5SDimitry Andric 110*0fca6ea1SDimitry Andric for (const DIEAbbrevData &D : Data) { 111*0fca6ea1SDimitry Andric O << " " << dwarf::AttributeString(D.getAttribute()) << " " 112*0fca6ea1SDimitry Andric << dwarf::FormEncodingString(D.getForm()); 1130b57cec5SDimitry Andric 114*0fca6ea1SDimitry Andric if (D.getForm() == dwarf::DW_FORM_implicit_const) 115*0fca6ea1SDimitry Andric O << " " << D.getValue(); 1160b57cec5SDimitry Andric 1170b57cec5SDimitry Andric O << '\n'; 1180b57cec5SDimitry Andric } 1190b57cec5SDimitry Andric } 1200b57cec5SDimitry Andric 1210b57cec5SDimitry Andric #if !defined(NDEBUG) || defined(LLVM_ENABLE_DUMP) 1220b57cec5SDimitry Andric LLVM_DUMP_METHOD void DIEAbbrev::dump() const { 1230b57cec5SDimitry Andric print(dbgs()); 1240b57cec5SDimitry Andric } 1250b57cec5SDimitry Andric #endif 1260b57cec5SDimitry Andric 1270b57cec5SDimitry Andric //===----------------------------------------------------------------------===// 1280b57cec5SDimitry Andric // DIEAbbrevSet Implementation 1290b57cec5SDimitry Andric //===----------------------------------------------------------------------===// 1300b57cec5SDimitry Andric 1310b57cec5SDimitry Andric DIEAbbrevSet::~DIEAbbrevSet() { 1320b57cec5SDimitry Andric for (DIEAbbrev *Abbrev : Abbreviations) 1330b57cec5SDimitry Andric Abbrev->~DIEAbbrev(); 1340b57cec5SDimitry Andric } 1350b57cec5SDimitry Andric 1360b57cec5SDimitry Andric DIEAbbrev &DIEAbbrevSet::uniqueAbbreviation(DIE &Die) { 1370b57cec5SDimitry Andric 1380b57cec5SDimitry Andric FoldingSetNodeID ID; 1390b57cec5SDimitry Andric DIEAbbrev Abbrev = Die.generateAbbrev(); 1400b57cec5SDimitry Andric Abbrev.Profile(ID); 1410b57cec5SDimitry Andric 1420b57cec5SDimitry Andric void *InsertPos; 1430b57cec5SDimitry Andric if (DIEAbbrev *Existing = 1440b57cec5SDimitry Andric AbbreviationsSet.FindNodeOrInsertPos(ID, InsertPos)) { 1450b57cec5SDimitry Andric Die.setAbbrevNumber(Existing->getNumber()); 1460b57cec5SDimitry Andric return *Existing; 1470b57cec5SDimitry Andric } 1480b57cec5SDimitry Andric 1490b57cec5SDimitry Andric // Move the abbreviation to the heap and assign a number. 1500b57cec5SDimitry Andric DIEAbbrev *New = new (Alloc) DIEAbbrev(std::move(Abbrev)); 1510b57cec5SDimitry Andric Abbreviations.push_back(New); 1520b57cec5SDimitry Andric New->setNumber(Abbreviations.size()); 1530b57cec5SDimitry Andric Die.setAbbrevNumber(Abbreviations.size()); 1540b57cec5SDimitry Andric 1550b57cec5SDimitry Andric // Store it for lookup. 1560b57cec5SDimitry Andric AbbreviationsSet.InsertNode(New, InsertPos); 1570b57cec5SDimitry Andric return *New; 1580b57cec5SDimitry Andric } 1590b57cec5SDimitry Andric 1600b57cec5SDimitry Andric void DIEAbbrevSet::Emit(const AsmPrinter *AP, MCSection *Section) const { 1610b57cec5SDimitry Andric if (!Abbreviations.empty()) { 1620b57cec5SDimitry Andric // Start the debug abbrev section. 16381ad6265SDimitry Andric AP->OutStreamer->switchSection(Section); 1640b57cec5SDimitry Andric AP->emitDwarfAbbrevs(Abbreviations); 1650b57cec5SDimitry Andric } 1660b57cec5SDimitry Andric } 1670b57cec5SDimitry Andric 1680b57cec5SDimitry Andric //===----------------------------------------------------------------------===// 1690b57cec5SDimitry Andric // DIE Implementation 1700b57cec5SDimitry Andric //===----------------------------------------------------------------------===// 1710b57cec5SDimitry Andric 17206c3fb27SDimitry Andric DIE *DIE::getParent() const { return dyn_cast_if_present<DIE *>(Owner); } 1730b57cec5SDimitry Andric 1740b57cec5SDimitry Andric DIEAbbrev DIE::generateAbbrev() const { 1750b57cec5SDimitry Andric DIEAbbrev Abbrev(Tag, hasChildren()); 1760b57cec5SDimitry Andric for (const DIEValue &V : values()) 1770b57cec5SDimitry Andric if (V.getForm() == dwarf::DW_FORM_implicit_const) 1780b57cec5SDimitry Andric Abbrev.AddImplicitConstAttribute(V.getAttribute(), 1790b57cec5SDimitry Andric V.getDIEInteger().getValue()); 1800b57cec5SDimitry Andric else 1810b57cec5SDimitry Andric Abbrev.AddAttribute(V.getAttribute(), V.getForm()); 1820b57cec5SDimitry Andric return Abbrev; 1830b57cec5SDimitry Andric } 1840b57cec5SDimitry Andric 185e8d8bef9SDimitry Andric uint64_t DIE::getDebugSectionOffset() const { 1860b57cec5SDimitry Andric const DIEUnit *Unit = getUnit(); 1870b57cec5SDimitry Andric assert(Unit && "DIE must be owned by a DIEUnit to get its absolute offset"); 1880b57cec5SDimitry Andric return Unit->getDebugSectionOffset() + getOffset(); 1890b57cec5SDimitry Andric } 1900b57cec5SDimitry Andric 1910b57cec5SDimitry Andric const DIE *DIE::getUnitDie() const { 1920b57cec5SDimitry Andric const DIE *p = this; 1930b57cec5SDimitry Andric while (p) { 1940b57cec5SDimitry Andric if (p->getTag() == dwarf::DW_TAG_compile_unit || 19581ad6265SDimitry Andric p->getTag() == dwarf::DW_TAG_skeleton_unit || 1960b57cec5SDimitry Andric p->getTag() == dwarf::DW_TAG_type_unit) 1970b57cec5SDimitry Andric return p; 1980b57cec5SDimitry Andric p = p->getParent(); 1990b57cec5SDimitry Andric } 2000b57cec5SDimitry Andric return nullptr; 2010b57cec5SDimitry Andric } 2020b57cec5SDimitry Andric 2030b57cec5SDimitry Andric DIEUnit *DIE::getUnit() const { 2040b57cec5SDimitry Andric const DIE *UnitDie = getUnitDie(); 2050b57cec5SDimitry Andric if (UnitDie) 20606c3fb27SDimitry Andric return dyn_cast_if_present<DIEUnit *>(UnitDie->Owner); 2070b57cec5SDimitry Andric return nullptr; 2080b57cec5SDimitry Andric } 2090b57cec5SDimitry Andric 2100b57cec5SDimitry Andric DIEValue DIE::findAttribute(dwarf::Attribute Attribute) const { 2110b57cec5SDimitry Andric // Iterate through all the attributes until we find the one we're 2120b57cec5SDimitry Andric // looking for, if we can't find it return NULL. 2130b57cec5SDimitry Andric for (const auto &V : values()) 2140b57cec5SDimitry Andric if (V.getAttribute() == Attribute) 2150b57cec5SDimitry Andric return V; 2160b57cec5SDimitry Andric return DIEValue(); 2170b57cec5SDimitry Andric } 2180b57cec5SDimitry Andric 2190b57cec5SDimitry Andric LLVM_DUMP_METHOD 2200b57cec5SDimitry Andric static void printValues(raw_ostream &O, const DIEValueList &Values, 2210b57cec5SDimitry Andric StringRef Type, unsigned Size, unsigned IndentCount) { 2220b57cec5SDimitry Andric O << Type << ": Size: " << Size << "\n"; 2230b57cec5SDimitry Andric 2240b57cec5SDimitry Andric unsigned I = 0; 2250b57cec5SDimitry Andric const std::string Indent(IndentCount, ' '); 2260b57cec5SDimitry Andric for (const auto &V : Values.values()) { 2270b57cec5SDimitry Andric O << Indent; 2280b57cec5SDimitry Andric O << "Blk[" << I++ << "]"; 2290b57cec5SDimitry Andric O << " " << dwarf::FormEncodingString(V.getForm()) << " "; 2300b57cec5SDimitry Andric V.print(O); 2310b57cec5SDimitry Andric O << "\n"; 2320b57cec5SDimitry Andric } 2330b57cec5SDimitry Andric } 2340b57cec5SDimitry Andric 2350b57cec5SDimitry Andric LLVM_DUMP_METHOD 2360b57cec5SDimitry Andric void DIE::print(raw_ostream &O, unsigned IndentCount) const { 2370b57cec5SDimitry Andric const std::string Indent(IndentCount, ' '); 2380b57cec5SDimitry Andric O << Indent << "Die: " << format("0x%lx", (long)(intptr_t) this) 2390b57cec5SDimitry Andric << ", Offset: " << Offset << ", Size: " << Size << "\n"; 2400b57cec5SDimitry Andric 2410b57cec5SDimitry Andric O << Indent << dwarf::TagString(getTag()) << " " 2420b57cec5SDimitry Andric << dwarf::ChildrenString(hasChildren()) << "\n"; 2430b57cec5SDimitry Andric 2440b57cec5SDimitry Andric IndentCount += 2; 2450b57cec5SDimitry Andric for (const auto &V : values()) { 2460b57cec5SDimitry Andric O << Indent; 2470b57cec5SDimitry Andric O << dwarf::AttributeString(V.getAttribute()); 2480b57cec5SDimitry Andric O << " " << dwarf::FormEncodingString(V.getForm()) << " "; 2490b57cec5SDimitry Andric V.print(O); 2500b57cec5SDimitry Andric O << "\n"; 2510b57cec5SDimitry Andric } 2520b57cec5SDimitry Andric IndentCount -= 2; 2530b57cec5SDimitry Andric 2540b57cec5SDimitry Andric for (const auto &Child : children()) 2550b57cec5SDimitry Andric Child.print(O, IndentCount + 4); 2560b57cec5SDimitry Andric 2570b57cec5SDimitry Andric O << "\n"; 2580b57cec5SDimitry Andric } 2590b57cec5SDimitry Andric 2600b57cec5SDimitry Andric #if !defined(NDEBUG) || defined(LLVM_ENABLE_DUMP) 2610b57cec5SDimitry Andric LLVM_DUMP_METHOD void DIE::dump() const { 2620b57cec5SDimitry Andric print(dbgs()); 2630b57cec5SDimitry Andric } 2640b57cec5SDimitry Andric #endif 2650b57cec5SDimitry Andric 26604eeddc0SDimitry Andric unsigned DIE::computeOffsetsAndAbbrevs(const dwarf::FormParams &FormParams, 2670b57cec5SDimitry Andric DIEAbbrevSet &AbbrevSet, 2680b57cec5SDimitry Andric unsigned CUOffset) { 2690b57cec5SDimitry Andric // Unique the abbreviation and fill in the abbreviation number so this DIE 2700b57cec5SDimitry Andric // can be emitted. 2710b57cec5SDimitry Andric const DIEAbbrev &Abbrev = AbbrevSet.uniqueAbbreviation(*this); 2720b57cec5SDimitry Andric 2730b57cec5SDimitry Andric // Set compile/type unit relative offset of this DIE. 2740b57cec5SDimitry Andric setOffset(CUOffset); 2750b57cec5SDimitry Andric 2760b57cec5SDimitry Andric // Add the byte size of the abbreviation code. 2770b57cec5SDimitry Andric CUOffset += getULEB128Size(getAbbrevNumber()); 2780b57cec5SDimitry Andric 2790b57cec5SDimitry Andric // Add the byte size of all the DIE attribute values. 2800b57cec5SDimitry Andric for (const auto &V : values()) 28104eeddc0SDimitry Andric CUOffset += V.sizeOf(FormParams); 2820b57cec5SDimitry Andric 2830b57cec5SDimitry Andric // Let the children compute their offsets and abbreviation numbers. 2840b57cec5SDimitry Andric if (hasChildren()) { 2850b57cec5SDimitry Andric (void)Abbrev; 2860b57cec5SDimitry Andric assert(Abbrev.hasChildren() && "Children flag not set"); 2870b57cec5SDimitry Andric 2880b57cec5SDimitry Andric for (auto &Child : children()) 28904eeddc0SDimitry Andric CUOffset = 29004eeddc0SDimitry Andric Child.computeOffsetsAndAbbrevs(FormParams, AbbrevSet, CUOffset); 2910b57cec5SDimitry Andric 2920b57cec5SDimitry Andric // Each child chain is terminated with a zero byte, adjust the offset. 2930b57cec5SDimitry Andric CUOffset += sizeof(int8_t); 2940b57cec5SDimitry Andric } 2950b57cec5SDimitry Andric 2960b57cec5SDimitry Andric // Compute the byte size of this DIE and all of its children correctly. This 2970b57cec5SDimitry Andric // is needed so that top level DIE can help the compile unit set its length 2980b57cec5SDimitry Andric // correctly. 2990b57cec5SDimitry Andric setSize(CUOffset - getOffset()); 3000b57cec5SDimitry Andric return CUOffset; 3010b57cec5SDimitry Andric } 3020b57cec5SDimitry Andric 3030b57cec5SDimitry Andric //===----------------------------------------------------------------------===// 3040b57cec5SDimitry Andric // DIEUnit Implementation 3050b57cec5SDimitry Andric //===----------------------------------------------------------------------===// 3061fd87a68SDimitry Andric DIEUnit::DIEUnit(dwarf::Tag UnitTag) : Die(UnitTag) { 3070b57cec5SDimitry Andric Die.Owner = this; 3080b57cec5SDimitry Andric assert((UnitTag == dwarf::DW_TAG_compile_unit || 309480093f4SDimitry Andric UnitTag == dwarf::DW_TAG_skeleton_unit || 3100b57cec5SDimitry Andric UnitTag == dwarf::DW_TAG_type_unit || 311480093f4SDimitry Andric UnitTag == dwarf::DW_TAG_partial_unit) && 312480093f4SDimitry Andric "expected a unit TAG"); 3130b57cec5SDimitry Andric } 3140b57cec5SDimitry Andric 3155ffd83dbSDimitry Andric void DIEValue::emitValue(const AsmPrinter *AP) const { 3160b57cec5SDimitry Andric switch (Ty) { 3170b57cec5SDimitry Andric case isNone: 3180b57cec5SDimitry Andric llvm_unreachable("Expected valid DIEValue"); 3190b57cec5SDimitry Andric #define HANDLE_DIEVALUE(T) \ 3200b57cec5SDimitry Andric case is##T: \ 3215ffd83dbSDimitry Andric getDIE##T().emitValue(AP, Form); \ 3220b57cec5SDimitry Andric break; 3230b57cec5SDimitry Andric #include "llvm/CodeGen/DIEValue.def" 3240b57cec5SDimitry Andric } 3250b57cec5SDimitry Andric } 3260b57cec5SDimitry Andric 32704eeddc0SDimitry Andric unsigned DIEValue::sizeOf(const dwarf::FormParams &FormParams) const { 3280b57cec5SDimitry Andric switch (Ty) { 3290b57cec5SDimitry Andric case isNone: 3300b57cec5SDimitry Andric llvm_unreachable("Expected valid DIEValue"); 3310b57cec5SDimitry Andric #define HANDLE_DIEVALUE(T) \ 3320b57cec5SDimitry Andric case is##T: \ 33304eeddc0SDimitry Andric return getDIE##T().sizeOf(FormParams, Form); 3340b57cec5SDimitry Andric #include "llvm/CodeGen/DIEValue.def" 3350b57cec5SDimitry Andric } 3360b57cec5SDimitry Andric llvm_unreachable("Unknown DIE kind"); 3370b57cec5SDimitry Andric } 3380b57cec5SDimitry Andric 3390b57cec5SDimitry Andric LLVM_DUMP_METHOD 3400b57cec5SDimitry Andric void DIEValue::print(raw_ostream &O) const { 3410b57cec5SDimitry Andric switch (Ty) { 3420b57cec5SDimitry Andric case isNone: 3430b57cec5SDimitry Andric llvm_unreachable("Expected valid DIEValue"); 3440b57cec5SDimitry Andric #define HANDLE_DIEVALUE(T) \ 3450b57cec5SDimitry Andric case is##T: \ 3460b57cec5SDimitry Andric getDIE##T().print(O); \ 3470b57cec5SDimitry Andric break; 3480b57cec5SDimitry Andric #include "llvm/CodeGen/DIEValue.def" 3490b57cec5SDimitry Andric } 3500b57cec5SDimitry Andric } 3510b57cec5SDimitry Andric 3520b57cec5SDimitry Andric #if !defined(NDEBUG) || defined(LLVM_ENABLE_DUMP) 3530b57cec5SDimitry Andric LLVM_DUMP_METHOD void DIEValue::dump() const { 3540b57cec5SDimitry Andric print(dbgs()); 3550b57cec5SDimitry Andric } 3560b57cec5SDimitry Andric #endif 3570b57cec5SDimitry Andric 3580b57cec5SDimitry Andric //===----------------------------------------------------------------------===// 3590b57cec5SDimitry Andric // DIEInteger Implementation 3600b57cec5SDimitry Andric //===----------------------------------------------------------------------===// 3610b57cec5SDimitry Andric 3620b57cec5SDimitry Andric /// EmitValue - Emit integer of appropriate size. 3630b57cec5SDimitry Andric /// 3645ffd83dbSDimitry Andric void DIEInteger::emitValue(const AsmPrinter *Asm, dwarf::Form Form) const { 3650b57cec5SDimitry Andric switch (Form) { 3660b57cec5SDimitry Andric case dwarf::DW_FORM_implicit_const: 3670b57cec5SDimitry Andric case dwarf::DW_FORM_flag_present: 3680b57cec5SDimitry Andric // Emit something to keep the lines and comments in sync. 3690b57cec5SDimitry Andric // FIXME: Is there a better way to do this? 37081ad6265SDimitry Andric Asm->OutStreamer->addBlankLine(); 3710b57cec5SDimitry Andric return; 3720b57cec5SDimitry Andric case dwarf::DW_FORM_flag: 3730b57cec5SDimitry Andric case dwarf::DW_FORM_ref1: 3740b57cec5SDimitry Andric case dwarf::DW_FORM_data1: 3750b57cec5SDimitry Andric case dwarf::DW_FORM_strx1: 3760b57cec5SDimitry Andric case dwarf::DW_FORM_addrx1: 3770b57cec5SDimitry Andric case dwarf::DW_FORM_ref2: 3780b57cec5SDimitry Andric case dwarf::DW_FORM_data2: 3790b57cec5SDimitry Andric case dwarf::DW_FORM_strx2: 3800b57cec5SDimitry Andric case dwarf::DW_FORM_addrx2: 3810b57cec5SDimitry Andric case dwarf::DW_FORM_strx3: 38206c3fb27SDimitry Andric case dwarf::DW_FORM_addrx3: 3830b57cec5SDimitry Andric case dwarf::DW_FORM_strp: 3840b57cec5SDimitry Andric case dwarf::DW_FORM_ref4: 3850b57cec5SDimitry Andric case dwarf::DW_FORM_data4: 3860b57cec5SDimitry Andric case dwarf::DW_FORM_ref_sup4: 3870b57cec5SDimitry Andric case dwarf::DW_FORM_strx4: 3880b57cec5SDimitry Andric case dwarf::DW_FORM_addrx4: 3890b57cec5SDimitry Andric case dwarf::DW_FORM_ref8: 3900b57cec5SDimitry Andric case dwarf::DW_FORM_ref_sig8: 3910b57cec5SDimitry Andric case dwarf::DW_FORM_data8: 3920b57cec5SDimitry Andric case dwarf::DW_FORM_ref_sup8: 3930b57cec5SDimitry Andric case dwarf::DW_FORM_GNU_ref_alt: 3940b57cec5SDimitry Andric case dwarf::DW_FORM_GNU_strp_alt: 3950b57cec5SDimitry Andric case dwarf::DW_FORM_line_strp: 3960b57cec5SDimitry Andric case dwarf::DW_FORM_sec_offset: 3970b57cec5SDimitry Andric case dwarf::DW_FORM_strp_sup: 3980b57cec5SDimitry Andric case dwarf::DW_FORM_addr: 3990b57cec5SDimitry Andric case dwarf::DW_FORM_ref_addr: 40004eeddc0SDimitry Andric Asm->OutStreamer->emitIntValue(Integer, 40104eeddc0SDimitry Andric sizeOf(Asm->getDwarfFormParams(), Form)); 4020b57cec5SDimitry Andric return; 4030b57cec5SDimitry Andric case dwarf::DW_FORM_GNU_str_index: 4040b57cec5SDimitry Andric case dwarf::DW_FORM_GNU_addr_index: 4050b57cec5SDimitry Andric case dwarf::DW_FORM_ref_udata: 4060b57cec5SDimitry Andric case dwarf::DW_FORM_strx: 4070b57cec5SDimitry Andric case dwarf::DW_FORM_addrx: 4080b57cec5SDimitry Andric case dwarf::DW_FORM_rnglistx: 4090b57cec5SDimitry Andric case dwarf::DW_FORM_udata: 4105ffd83dbSDimitry Andric Asm->emitULEB128(Integer); 4110b57cec5SDimitry Andric return; 4120b57cec5SDimitry Andric case dwarf::DW_FORM_sdata: 4135ffd83dbSDimitry Andric Asm->emitSLEB128(Integer); 4140b57cec5SDimitry Andric return; 4150b57cec5SDimitry Andric default: llvm_unreachable("DIE Value form not supported yet"); 4160b57cec5SDimitry Andric } 4170b57cec5SDimitry Andric } 4180b57cec5SDimitry Andric 41904eeddc0SDimitry Andric /// sizeOf - Determine size of integer value in bytes. 4200b57cec5SDimitry Andric /// 42104eeddc0SDimitry Andric unsigned DIEInteger::sizeOf(const dwarf::FormParams &FormParams, 42204eeddc0SDimitry Andric dwarf::Form Form) const { 423bdd1243dSDimitry Andric if (std::optional<uint8_t> FixedSize = 42404eeddc0SDimitry Andric dwarf::getFixedFormByteSize(Form, FormParams)) 4250b57cec5SDimitry Andric return *FixedSize; 4260b57cec5SDimitry Andric 4270b57cec5SDimitry Andric switch (Form) { 4280b57cec5SDimitry Andric case dwarf::DW_FORM_GNU_str_index: 4290b57cec5SDimitry Andric case dwarf::DW_FORM_GNU_addr_index: 4300b57cec5SDimitry Andric case dwarf::DW_FORM_ref_udata: 4310b57cec5SDimitry Andric case dwarf::DW_FORM_strx: 4320b57cec5SDimitry Andric case dwarf::DW_FORM_addrx: 4330b57cec5SDimitry Andric case dwarf::DW_FORM_rnglistx: 4340b57cec5SDimitry Andric case dwarf::DW_FORM_udata: 4350b57cec5SDimitry Andric return getULEB128Size(Integer); 4360b57cec5SDimitry Andric case dwarf::DW_FORM_sdata: 4370b57cec5SDimitry Andric return getSLEB128Size(Integer); 4380b57cec5SDimitry Andric default: llvm_unreachable("DIE Value form not supported yet"); 4390b57cec5SDimitry Andric } 4400b57cec5SDimitry Andric } 4410b57cec5SDimitry Andric 4420b57cec5SDimitry Andric LLVM_DUMP_METHOD 4430b57cec5SDimitry Andric void DIEInteger::print(raw_ostream &O) const { 4440b57cec5SDimitry Andric O << "Int: " << (int64_t)Integer << " 0x"; 4450b57cec5SDimitry Andric O.write_hex(Integer); 4460b57cec5SDimitry Andric } 4470b57cec5SDimitry Andric 4480b57cec5SDimitry Andric //===----------------------------------------------------------------------===// 4490b57cec5SDimitry Andric // DIEExpr Implementation 4500b57cec5SDimitry Andric //===----------------------------------------------------------------------===// 4510b57cec5SDimitry Andric 4520b57cec5SDimitry Andric /// EmitValue - Emit expression value. 4530b57cec5SDimitry Andric /// 4545ffd83dbSDimitry Andric void DIEExpr::emitValue(const AsmPrinter *AP, dwarf::Form Form) const { 45504eeddc0SDimitry Andric AP->emitDebugValue(Expr, sizeOf(AP->getDwarfFormParams(), Form)); 4560b57cec5SDimitry Andric } 4570b57cec5SDimitry Andric 4580b57cec5SDimitry Andric /// SizeOf - Determine size of expression value in bytes. 4590b57cec5SDimitry Andric /// 46004eeddc0SDimitry Andric unsigned DIEExpr::sizeOf(const dwarf::FormParams &FormParams, 46104eeddc0SDimitry Andric dwarf::Form Form) const { 462e8d8bef9SDimitry Andric switch (Form) { 463e8d8bef9SDimitry Andric case dwarf::DW_FORM_data4: 464e8d8bef9SDimitry Andric return 4; 465e8d8bef9SDimitry Andric case dwarf::DW_FORM_data8: 466e8d8bef9SDimitry Andric return 8; 467e8d8bef9SDimitry Andric case dwarf::DW_FORM_sec_offset: 46804eeddc0SDimitry Andric return FormParams.getDwarfOffsetByteSize(); 469e8d8bef9SDimitry Andric default: 470e8d8bef9SDimitry Andric llvm_unreachable("DIE Value form not supported yet"); 471e8d8bef9SDimitry Andric } 4720b57cec5SDimitry Andric } 4730b57cec5SDimitry Andric 4740b57cec5SDimitry Andric LLVM_DUMP_METHOD 4750b57cec5SDimitry Andric void DIEExpr::print(raw_ostream &O) const { O << "Expr: " << *Expr; } 4760b57cec5SDimitry Andric 4770b57cec5SDimitry Andric //===----------------------------------------------------------------------===// 4780b57cec5SDimitry Andric // DIELabel Implementation 4790b57cec5SDimitry Andric //===----------------------------------------------------------------------===// 4800b57cec5SDimitry Andric 4810b57cec5SDimitry Andric /// EmitValue - Emit label value. 4820b57cec5SDimitry Andric /// 4835ffd83dbSDimitry Andric void DIELabel::emitValue(const AsmPrinter *AP, dwarf::Form Form) const { 484e8d8bef9SDimitry Andric bool IsSectionRelative = Form != dwarf::DW_FORM_addr; 48504eeddc0SDimitry Andric AP->emitLabelReference(Label, sizeOf(AP->getDwarfFormParams(), Form), 48604eeddc0SDimitry Andric IsSectionRelative); 4870b57cec5SDimitry Andric } 4880b57cec5SDimitry Andric 48904eeddc0SDimitry Andric /// sizeOf - Determine size of label value in bytes. 4900b57cec5SDimitry Andric /// 49104eeddc0SDimitry Andric unsigned DIELabel::sizeOf(const dwarf::FormParams &FormParams, 49204eeddc0SDimitry Andric dwarf::Form Form) const { 493e8d8bef9SDimitry Andric switch (Form) { 494e8d8bef9SDimitry Andric case dwarf::DW_FORM_data4: 495e8d8bef9SDimitry Andric return 4; 496e8d8bef9SDimitry Andric case dwarf::DW_FORM_data8: 497e8d8bef9SDimitry Andric return 8; 498e8d8bef9SDimitry Andric case dwarf::DW_FORM_sec_offset: 499e8d8bef9SDimitry Andric case dwarf::DW_FORM_strp: 50004eeddc0SDimitry Andric return FormParams.getDwarfOffsetByteSize(); 501e8d8bef9SDimitry Andric case dwarf::DW_FORM_addr: 50204eeddc0SDimitry Andric return FormParams.AddrSize; 503e8d8bef9SDimitry Andric default: 504e8d8bef9SDimitry Andric llvm_unreachable("DIE Value form not supported yet"); 505e8d8bef9SDimitry Andric } 5060b57cec5SDimitry Andric } 5070b57cec5SDimitry Andric 5080b57cec5SDimitry Andric LLVM_DUMP_METHOD 5090b57cec5SDimitry Andric void DIELabel::print(raw_ostream &O) const { O << "Lbl: " << Label->getName(); } 5100b57cec5SDimitry Andric 5110b57cec5SDimitry Andric //===----------------------------------------------------------------------===// 5120b57cec5SDimitry Andric // DIEBaseTypeRef Implementation 5130b57cec5SDimitry Andric //===----------------------------------------------------------------------===// 5140b57cec5SDimitry Andric 5155ffd83dbSDimitry Andric void DIEBaseTypeRef::emitValue(const AsmPrinter *AP, dwarf::Form Form) const { 5160b57cec5SDimitry Andric uint64_t Offset = CU->ExprRefedBaseTypes[Index].Die->getOffset(); 5170b57cec5SDimitry Andric assert(Offset < (1ULL << (ULEB128PadSize * 7)) && "Offset wont fit"); 5185ffd83dbSDimitry Andric AP->emitULEB128(Offset, nullptr, ULEB128PadSize); 5190b57cec5SDimitry Andric } 5200b57cec5SDimitry Andric 52104eeddc0SDimitry Andric unsigned DIEBaseTypeRef::sizeOf(const dwarf::FormParams &, dwarf::Form) const { 5220b57cec5SDimitry Andric return ULEB128PadSize; 5230b57cec5SDimitry Andric } 5240b57cec5SDimitry Andric 5250b57cec5SDimitry Andric LLVM_DUMP_METHOD 5260b57cec5SDimitry Andric void DIEBaseTypeRef::print(raw_ostream &O) const { O << "BaseTypeRef: " << Index; } 5270b57cec5SDimitry Andric 5280b57cec5SDimitry Andric //===----------------------------------------------------------------------===// 5290b57cec5SDimitry Andric // DIEDelta Implementation 5300b57cec5SDimitry Andric //===----------------------------------------------------------------------===// 5310b57cec5SDimitry Andric 5320b57cec5SDimitry Andric /// EmitValue - Emit delta value. 5330b57cec5SDimitry Andric /// 5345ffd83dbSDimitry Andric void DIEDelta::emitValue(const AsmPrinter *AP, dwarf::Form Form) const { 53504eeddc0SDimitry Andric AP->emitLabelDifference(LabelHi, LabelLo, 53604eeddc0SDimitry Andric sizeOf(AP->getDwarfFormParams(), Form)); 5370b57cec5SDimitry Andric } 5380b57cec5SDimitry Andric 5390b57cec5SDimitry Andric /// SizeOf - Determine size of delta value in bytes. 5400b57cec5SDimitry Andric /// 54104eeddc0SDimitry Andric unsigned DIEDelta::sizeOf(const dwarf::FormParams &FormParams, 54204eeddc0SDimitry Andric dwarf::Form Form) const { 543e8d8bef9SDimitry Andric switch (Form) { 544e8d8bef9SDimitry Andric case dwarf::DW_FORM_data4: 545e8d8bef9SDimitry Andric return 4; 546e8d8bef9SDimitry Andric case dwarf::DW_FORM_data8: 547e8d8bef9SDimitry Andric return 8; 548e8d8bef9SDimitry Andric case dwarf::DW_FORM_sec_offset: 54904eeddc0SDimitry Andric return FormParams.getDwarfOffsetByteSize(); 550e8d8bef9SDimitry Andric default: 551e8d8bef9SDimitry Andric llvm_unreachable("DIE Value form not supported yet"); 552e8d8bef9SDimitry Andric } 5530b57cec5SDimitry Andric } 5540b57cec5SDimitry Andric 5550b57cec5SDimitry Andric LLVM_DUMP_METHOD 5560b57cec5SDimitry Andric void DIEDelta::print(raw_ostream &O) const { 5570b57cec5SDimitry Andric O << "Del: " << LabelHi->getName() << "-" << LabelLo->getName(); 5580b57cec5SDimitry Andric } 5590b57cec5SDimitry Andric 5600b57cec5SDimitry Andric //===----------------------------------------------------------------------===// 5610b57cec5SDimitry Andric // DIEString Implementation 5620b57cec5SDimitry Andric //===----------------------------------------------------------------------===// 5630b57cec5SDimitry Andric 5640b57cec5SDimitry Andric /// EmitValue - Emit string value. 5650b57cec5SDimitry Andric /// 5665ffd83dbSDimitry Andric void DIEString::emitValue(const AsmPrinter *AP, dwarf::Form Form) const { 5670b57cec5SDimitry Andric // Index of string in symbol table. 5680b57cec5SDimitry Andric switch (Form) { 5690b57cec5SDimitry Andric case dwarf::DW_FORM_GNU_str_index: 5700b57cec5SDimitry Andric case dwarf::DW_FORM_strx: 5710b57cec5SDimitry Andric case dwarf::DW_FORM_strx1: 5720b57cec5SDimitry Andric case dwarf::DW_FORM_strx2: 5730b57cec5SDimitry Andric case dwarf::DW_FORM_strx3: 5740b57cec5SDimitry Andric case dwarf::DW_FORM_strx4: 5755ffd83dbSDimitry Andric DIEInteger(S.getIndex()).emitValue(AP, Form); 5760b57cec5SDimitry Andric return; 5770b57cec5SDimitry Andric case dwarf::DW_FORM_strp: 578bdd1243dSDimitry Andric if (AP->doesDwarfUseRelocationsAcrossSections()) 5795ffd83dbSDimitry Andric DIELabel(S.getSymbol()).emitValue(AP, Form); 5800b57cec5SDimitry Andric else 5815ffd83dbSDimitry Andric DIEInteger(S.getOffset()).emitValue(AP, Form); 5820b57cec5SDimitry Andric return; 5830b57cec5SDimitry Andric default: 5840b57cec5SDimitry Andric llvm_unreachable("Expected valid string form"); 5850b57cec5SDimitry Andric } 5860b57cec5SDimitry Andric } 5870b57cec5SDimitry Andric 58804eeddc0SDimitry Andric /// sizeOf - Determine size of delta value in bytes. 5890b57cec5SDimitry Andric /// 59004eeddc0SDimitry Andric unsigned DIEString::sizeOf(const dwarf::FormParams &FormParams, 59104eeddc0SDimitry Andric dwarf::Form Form) const { 5920b57cec5SDimitry Andric // Index of string in symbol table. 5930b57cec5SDimitry Andric switch (Form) { 5940b57cec5SDimitry Andric case dwarf::DW_FORM_GNU_str_index: 5950b57cec5SDimitry Andric case dwarf::DW_FORM_strx: 5960b57cec5SDimitry Andric case dwarf::DW_FORM_strx1: 5970b57cec5SDimitry Andric case dwarf::DW_FORM_strx2: 5980b57cec5SDimitry Andric case dwarf::DW_FORM_strx3: 5990b57cec5SDimitry Andric case dwarf::DW_FORM_strx4: 60004eeddc0SDimitry Andric return DIEInteger(S.getIndex()).sizeOf(FormParams, Form); 6010b57cec5SDimitry Andric case dwarf::DW_FORM_strp: 60204eeddc0SDimitry Andric if (FormParams.DwarfUsesRelocationsAcrossSections) 60304eeddc0SDimitry Andric return DIELabel(S.getSymbol()).sizeOf(FormParams, Form); 60404eeddc0SDimitry Andric return DIEInteger(S.getOffset()).sizeOf(FormParams, Form); 6050b57cec5SDimitry Andric default: 6060b57cec5SDimitry Andric llvm_unreachable("Expected valid string form"); 6070b57cec5SDimitry Andric } 6080b57cec5SDimitry Andric } 6090b57cec5SDimitry Andric 6100b57cec5SDimitry Andric LLVM_DUMP_METHOD 6110b57cec5SDimitry Andric void DIEString::print(raw_ostream &O) const { 6120b57cec5SDimitry Andric O << "String: " << S.getString(); 6130b57cec5SDimitry Andric } 6140b57cec5SDimitry Andric 6150b57cec5SDimitry Andric //===----------------------------------------------------------------------===// 6160b57cec5SDimitry Andric // DIEInlineString Implementation 6170b57cec5SDimitry Andric //===----------------------------------------------------------------------===// 6185ffd83dbSDimitry Andric void DIEInlineString::emitValue(const AsmPrinter *AP, dwarf::Form Form) const { 6190b57cec5SDimitry Andric if (Form == dwarf::DW_FORM_string) { 6205ffd83dbSDimitry Andric AP->OutStreamer->emitBytes(S); 6210b57cec5SDimitry Andric AP->emitInt8(0); 6220b57cec5SDimitry Andric return; 6230b57cec5SDimitry Andric } 6240b57cec5SDimitry Andric llvm_unreachable("Expected valid string form"); 6250b57cec5SDimitry Andric } 6260b57cec5SDimitry Andric 62704eeddc0SDimitry Andric unsigned DIEInlineString::sizeOf(const dwarf::FormParams &, dwarf::Form) const { 6280b57cec5SDimitry Andric // Emit string bytes + NULL byte. 6290b57cec5SDimitry Andric return S.size() + 1; 6300b57cec5SDimitry Andric } 6310b57cec5SDimitry Andric 6320b57cec5SDimitry Andric LLVM_DUMP_METHOD 6330b57cec5SDimitry Andric void DIEInlineString::print(raw_ostream &O) const { 6340b57cec5SDimitry Andric O << "InlineString: " << S; 6350b57cec5SDimitry Andric } 6360b57cec5SDimitry Andric 6370b57cec5SDimitry Andric //===----------------------------------------------------------------------===// 6380b57cec5SDimitry Andric // DIEEntry Implementation 6390b57cec5SDimitry Andric //===----------------------------------------------------------------------===// 6400b57cec5SDimitry Andric 6410b57cec5SDimitry Andric /// EmitValue - Emit debug information entry offset. 6420b57cec5SDimitry Andric /// 6435ffd83dbSDimitry Andric void DIEEntry::emitValue(const AsmPrinter *AP, dwarf::Form Form) const { 6440b57cec5SDimitry Andric 6450b57cec5SDimitry Andric switch (Form) { 6460b57cec5SDimitry Andric case dwarf::DW_FORM_ref1: 6470b57cec5SDimitry Andric case dwarf::DW_FORM_ref2: 6480b57cec5SDimitry Andric case dwarf::DW_FORM_ref4: 6490b57cec5SDimitry Andric case dwarf::DW_FORM_ref8: 65004eeddc0SDimitry Andric AP->OutStreamer->emitIntValue(Entry->getOffset(), 65104eeddc0SDimitry Andric sizeOf(AP->getDwarfFormParams(), Form)); 6520b57cec5SDimitry Andric return; 6530b57cec5SDimitry Andric 6540b57cec5SDimitry Andric case dwarf::DW_FORM_ref_udata: 6555ffd83dbSDimitry Andric AP->emitULEB128(Entry->getOffset()); 6560b57cec5SDimitry Andric return; 6570b57cec5SDimitry Andric 6580b57cec5SDimitry Andric case dwarf::DW_FORM_ref_addr: { 6590b57cec5SDimitry Andric // Get the absolute offset for this DIE within the debug info/types section. 660e8d8bef9SDimitry Andric uint64_t Addr = Entry->getDebugSectionOffset(); 6610b57cec5SDimitry Andric if (const MCSymbol *SectionSym = 6620b57cec5SDimitry Andric Entry->getUnit()->getCrossSectionRelativeBaseAddress()) { 66304eeddc0SDimitry Andric AP->emitLabelPlusOffset(SectionSym, Addr, 66404eeddc0SDimitry Andric sizeOf(AP->getDwarfFormParams(), Form), true); 6650b57cec5SDimitry Andric return; 6660b57cec5SDimitry Andric } 6670b57cec5SDimitry Andric 66804eeddc0SDimitry Andric AP->OutStreamer->emitIntValue(Addr, sizeOf(AP->getDwarfFormParams(), Form)); 6690b57cec5SDimitry Andric return; 6700b57cec5SDimitry Andric } 6710b57cec5SDimitry Andric default: 6720b57cec5SDimitry Andric llvm_unreachable("Improper form for DIE reference"); 6730b57cec5SDimitry Andric } 6740b57cec5SDimitry Andric } 6750b57cec5SDimitry Andric 67604eeddc0SDimitry Andric unsigned DIEEntry::sizeOf(const dwarf::FormParams &FormParams, 67704eeddc0SDimitry Andric dwarf::Form Form) const { 6780b57cec5SDimitry Andric switch (Form) { 6790b57cec5SDimitry Andric case dwarf::DW_FORM_ref1: 6800b57cec5SDimitry Andric return 1; 6810b57cec5SDimitry Andric case dwarf::DW_FORM_ref2: 6820b57cec5SDimitry Andric return 2; 6830b57cec5SDimitry Andric case dwarf::DW_FORM_ref4: 6840b57cec5SDimitry Andric return 4; 6850b57cec5SDimitry Andric case dwarf::DW_FORM_ref8: 6860b57cec5SDimitry Andric return 8; 6870b57cec5SDimitry Andric case dwarf::DW_FORM_ref_udata: 6880b57cec5SDimitry Andric return getULEB128Size(Entry->getOffset()); 6890b57cec5SDimitry Andric case dwarf::DW_FORM_ref_addr: 69004eeddc0SDimitry Andric return FormParams.getRefAddrByteSize(); 6910b57cec5SDimitry Andric 6920b57cec5SDimitry Andric default: 6930b57cec5SDimitry Andric llvm_unreachable("Improper form for DIE reference"); 6940b57cec5SDimitry Andric } 6950b57cec5SDimitry Andric } 6960b57cec5SDimitry Andric 6970b57cec5SDimitry Andric LLVM_DUMP_METHOD 6980b57cec5SDimitry Andric void DIEEntry::print(raw_ostream &O) const { 6990b57cec5SDimitry Andric O << format("Die: 0x%lx", (long)(intptr_t)&Entry); 7000b57cec5SDimitry Andric } 7010b57cec5SDimitry Andric 7020b57cec5SDimitry Andric //===----------------------------------------------------------------------===// 7030b57cec5SDimitry Andric // DIELoc Implementation 7040b57cec5SDimitry Andric //===----------------------------------------------------------------------===// 7050b57cec5SDimitry Andric 70604eeddc0SDimitry Andric unsigned DIELoc::computeSize(const dwarf::FormParams &FormParams) const { 7070b57cec5SDimitry Andric if (!Size) { 7080b57cec5SDimitry Andric for (const auto &V : values()) 70904eeddc0SDimitry Andric Size += V.sizeOf(FormParams); 7100b57cec5SDimitry Andric } 7110b57cec5SDimitry Andric 7120b57cec5SDimitry Andric return Size; 7130b57cec5SDimitry Andric } 7140b57cec5SDimitry Andric 7150b57cec5SDimitry Andric /// EmitValue - Emit location data. 7160b57cec5SDimitry Andric /// 7175ffd83dbSDimitry Andric void DIELoc::emitValue(const AsmPrinter *Asm, dwarf::Form Form) const { 7180b57cec5SDimitry Andric switch (Form) { 7190b57cec5SDimitry Andric default: llvm_unreachable("Improper form for block"); 7200b57cec5SDimitry Andric case dwarf::DW_FORM_block1: Asm->emitInt8(Size); break; 7210b57cec5SDimitry Andric case dwarf::DW_FORM_block2: Asm->emitInt16(Size); break; 7220b57cec5SDimitry Andric case dwarf::DW_FORM_block4: Asm->emitInt32(Size); break; 7230b57cec5SDimitry Andric case dwarf::DW_FORM_block: 7240b57cec5SDimitry Andric case dwarf::DW_FORM_exprloc: 7255ffd83dbSDimitry Andric Asm->emitULEB128(Size); 7265ffd83dbSDimitry Andric break; 7270b57cec5SDimitry Andric } 7280b57cec5SDimitry Andric 7290b57cec5SDimitry Andric for (const auto &V : values()) 7305ffd83dbSDimitry Andric V.emitValue(Asm); 7310b57cec5SDimitry Andric } 7320b57cec5SDimitry Andric 73304eeddc0SDimitry Andric /// sizeOf - Determine size of location data in bytes. 7340b57cec5SDimitry Andric /// 73504eeddc0SDimitry Andric unsigned DIELoc::sizeOf(const dwarf::FormParams &, dwarf::Form Form) const { 7360b57cec5SDimitry Andric switch (Form) { 7370b57cec5SDimitry Andric case dwarf::DW_FORM_block1: return Size + sizeof(int8_t); 7380b57cec5SDimitry Andric case dwarf::DW_FORM_block2: return Size + sizeof(int16_t); 7390b57cec5SDimitry Andric case dwarf::DW_FORM_block4: return Size + sizeof(int32_t); 7400b57cec5SDimitry Andric case dwarf::DW_FORM_block: 7410b57cec5SDimitry Andric case dwarf::DW_FORM_exprloc: 7420b57cec5SDimitry Andric return Size + getULEB128Size(Size); 7430b57cec5SDimitry Andric default: llvm_unreachable("Improper form for block"); 7440b57cec5SDimitry Andric } 7450b57cec5SDimitry Andric } 7460b57cec5SDimitry Andric 7470b57cec5SDimitry Andric LLVM_DUMP_METHOD 7480b57cec5SDimitry Andric void DIELoc::print(raw_ostream &O) const { 7490b57cec5SDimitry Andric printValues(O, *this, "ExprLoc", Size, 5); 7500b57cec5SDimitry Andric } 7510b57cec5SDimitry Andric 7520b57cec5SDimitry Andric //===----------------------------------------------------------------------===// 7530b57cec5SDimitry Andric // DIEBlock Implementation 7540b57cec5SDimitry Andric //===----------------------------------------------------------------------===// 7550b57cec5SDimitry Andric 75604eeddc0SDimitry Andric unsigned DIEBlock::computeSize(const dwarf::FormParams &FormParams) const { 7570b57cec5SDimitry Andric if (!Size) { 7580b57cec5SDimitry Andric for (const auto &V : values()) 75904eeddc0SDimitry Andric Size += V.sizeOf(FormParams); 7600b57cec5SDimitry Andric } 7610b57cec5SDimitry Andric 7620b57cec5SDimitry Andric return Size; 7630b57cec5SDimitry Andric } 7640b57cec5SDimitry Andric 7650b57cec5SDimitry Andric /// EmitValue - Emit block data. 7660b57cec5SDimitry Andric /// 7675ffd83dbSDimitry Andric void DIEBlock::emitValue(const AsmPrinter *Asm, dwarf::Form Form) const { 7680b57cec5SDimitry Andric switch (Form) { 7690b57cec5SDimitry Andric default: llvm_unreachable("Improper form for block"); 7700b57cec5SDimitry Andric case dwarf::DW_FORM_block1: Asm->emitInt8(Size); break; 7710b57cec5SDimitry Andric case dwarf::DW_FORM_block2: Asm->emitInt16(Size); break; 7720b57cec5SDimitry Andric case dwarf::DW_FORM_block4: Asm->emitInt32(Size); break; 773fe6060f1SDimitry Andric case dwarf::DW_FORM_exprloc: 7745ffd83dbSDimitry Andric case dwarf::DW_FORM_block: 7755ffd83dbSDimitry Andric Asm->emitULEB128(Size); 7765ffd83dbSDimitry Andric break; 7770b57cec5SDimitry Andric case dwarf::DW_FORM_string: break; 7780b57cec5SDimitry Andric case dwarf::DW_FORM_data16: break; 7790b57cec5SDimitry Andric } 7800b57cec5SDimitry Andric 7810b57cec5SDimitry Andric for (const auto &V : values()) 7825ffd83dbSDimitry Andric V.emitValue(Asm); 7830b57cec5SDimitry Andric } 7840b57cec5SDimitry Andric 78504eeddc0SDimitry Andric /// sizeOf - Determine size of block data in bytes. 7860b57cec5SDimitry Andric /// 78704eeddc0SDimitry Andric unsigned DIEBlock::sizeOf(const dwarf::FormParams &, dwarf::Form Form) const { 7880b57cec5SDimitry Andric switch (Form) { 7890b57cec5SDimitry Andric case dwarf::DW_FORM_block1: return Size + sizeof(int8_t); 7900b57cec5SDimitry Andric case dwarf::DW_FORM_block2: return Size + sizeof(int16_t); 7910b57cec5SDimitry Andric case dwarf::DW_FORM_block4: return Size + sizeof(int32_t); 792fe6060f1SDimitry Andric case dwarf::DW_FORM_exprloc: 7930b57cec5SDimitry Andric case dwarf::DW_FORM_block: return Size + getULEB128Size(Size); 7940b57cec5SDimitry Andric case dwarf::DW_FORM_data16: return 16; 7950b57cec5SDimitry Andric default: llvm_unreachable("Improper form for block"); 7960b57cec5SDimitry Andric } 7970b57cec5SDimitry Andric } 7980b57cec5SDimitry Andric 7990b57cec5SDimitry Andric LLVM_DUMP_METHOD 8000b57cec5SDimitry Andric void DIEBlock::print(raw_ostream &O) const { 8010b57cec5SDimitry Andric printValues(O, *this, "Blk", Size, 5); 8020b57cec5SDimitry Andric } 8030b57cec5SDimitry Andric 8040b57cec5SDimitry Andric //===----------------------------------------------------------------------===// 8050b57cec5SDimitry Andric // DIELocList Implementation 8060b57cec5SDimitry Andric //===----------------------------------------------------------------------===// 8070b57cec5SDimitry Andric 80804eeddc0SDimitry Andric unsigned DIELocList::sizeOf(const dwarf::FormParams &FormParams, 80904eeddc0SDimitry Andric dwarf::Form Form) const { 810e8d8bef9SDimitry Andric switch (Form) { 811e8d8bef9SDimitry Andric case dwarf::DW_FORM_loclistx: 812480093f4SDimitry Andric return getULEB128Size(Index); 813e8d8bef9SDimitry Andric case dwarf::DW_FORM_data4: 81404eeddc0SDimitry Andric assert(FormParams.Format != dwarf::DWARF64 && 815e8d8bef9SDimitry Andric "DW_FORM_data4 is not suitable to emit a pointer to a location list " 816e8d8bef9SDimitry Andric "in the 64-bit DWARF format"); 8170b57cec5SDimitry Andric return 4; 818e8d8bef9SDimitry Andric case dwarf::DW_FORM_data8: 81904eeddc0SDimitry Andric assert(FormParams.Format == dwarf::DWARF64 && 820e8d8bef9SDimitry Andric "DW_FORM_data8 is not suitable to emit a pointer to a location list " 821e8d8bef9SDimitry Andric "in the 32-bit DWARF format"); 822e8d8bef9SDimitry Andric return 8; 823e8d8bef9SDimitry Andric case dwarf::DW_FORM_sec_offset: 82404eeddc0SDimitry Andric return FormParams.getDwarfOffsetByteSize(); 825e8d8bef9SDimitry Andric default: 826e8d8bef9SDimitry Andric llvm_unreachable("DIE Value form not supported yet"); 827e8d8bef9SDimitry Andric } 8280b57cec5SDimitry Andric } 8290b57cec5SDimitry Andric 8300b57cec5SDimitry Andric /// EmitValue - Emit label value. 8310b57cec5SDimitry Andric /// 8325ffd83dbSDimitry Andric void DIELocList::emitValue(const AsmPrinter *AP, dwarf::Form Form) const { 833480093f4SDimitry Andric if (Form == dwarf::DW_FORM_loclistx) { 8345ffd83dbSDimitry Andric AP->emitULEB128(Index); 835480093f4SDimitry Andric return; 836480093f4SDimitry Andric } 8370b57cec5SDimitry Andric DwarfDebug *DD = AP->getDwarfDebug(); 8380b57cec5SDimitry Andric MCSymbol *Label = DD->getDebugLocs().getList(Index).Label; 8390b57cec5SDimitry Andric AP->emitDwarfSymbolReference(Label, /*ForceOffset*/ DD->useSplitDwarf()); 8400b57cec5SDimitry Andric } 8410b57cec5SDimitry Andric 8420b57cec5SDimitry Andric LLVM_DUMP_METHOD 8430b57cec5SDimitry Andric void DIELocList::print(raw_ostream &O) const { O << "LocList: " << Index; } 844fe6060f1SDimitry Andric 845fe6060f1SDimitry Andric //===----------------------------------------------------------------------===// 846fe6060f1SDimitry Andric // DIEAddrOffset Implementation 847fe6060f1SDimitry Andric //===----------------------------------------------------------------------===// 848fe6060f1SDimitry Andric 84904eeddc0SDimitry Andric unsigned DIEAddrOffset::sizeOf(const dwarf::FormParams &FormParams, 85004eeddc0SDimitry Andric dwarf::Form) const { 85104eeddc0SDimitry Andric return Addr.sizeOf(FormParams, dwarf::DW_FORM_addrx) + 85204eeddc0SDimitry Andric Offset.sizeOf(FormParams, dwarf::DW_FORM_data4); 853fe6060f1SDimitry Andric } 854fe6060f1SDimitry Andric 855fe6060f1SDimitry Andric /// EmitValue - Emit label value. 856fe6060f1SDimitry Andric /// 857fe6060f1SDimitry Andric void DIEAddrOffset::emitValue(const AsmPrinter *AP, dwarf::Form Form) const { 858fe6060f1SDimitry Andric Addr.emitValue(AP, dwarf::DW_FORM_addrx); 859fe6060f1SDimitry Andric Offset.emitValue(AP, dwarf::DW_FORM_data4); 860fe6060f1SDimitry Andric } 861fe6060f1SDimitry Andric 862fe6060f1SDimitry Andric LLVM_DUMP_METHOD 863fe6060f1SDimitry Andric void DIEAddrOffset::print(raw_ostream &O) const { 864fe6060f1SDimitry Andric O << "AddrOffset: "; 865fe6060f1SDimitry Andric Addr.print(O); 866fe6060f1SDimitry Andric O << " + "; 867fe6060f1SDimitry Andric Offset.print(O); 868fe6060f1SDimitry Andric } 869