xref: /freebsd-src/contrib/llvm-project/llvm/lib/CodeGen/AsmPrinter/DIE.cpp (revision 0fca6ea1d4eea4c934cfff25ac9ee8ad6fe95583)
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