xref: /freebsd-src/contrib/llvm-project/llvm/lib/CodeGen/AsmPrinter/AsmPrinterDwarf.cpp (revision 06c3fb2749bda94cb5201f81ffdb8fa6c3161b2e)
10b57cec5SDimitry Andric //===-- AsmPrinterDwarf.cpp - AsmPrinter Dwarf Support --------------------===//
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 // This file implements the Dwarf emissions parts of AsmPrinter.
100b57cec5SDimitry Andric //
110b57cec5SDimitry Andric //===----------------------------------------------------------------------===//
120b57cec5SDimitry Andric 
130b57cec5SDimitry Andric #include "llvm/ADT/Twine.h"
140b57cec5SDimitry Andric #include "llvm/BinaryFormat/Dwarf.h"
150b57cec5SDimitry Andric #include "llvm/CodeGen/AsmPrinter.h"
160b57cec5SDimitry Andric #include "llvm/CodeGen/DIE.h"
170b57cec5SDimitry Andric #include "llvm/CodeGen/MachineFunction.h"
180b57cec5SDimitry Andric #include "llvm/IR/DataLayout.h"
190b57cec5SDimitry Andric #include "llvm/MC/MCAsmInfo.h"
200b57cec5SDimitry Andric #include "llvm/MC/MCDwarf.h"
210b57cec5SDimitry Andric #include "llvm/MC/MCSection.h"
220b57cec5SDimitry Andric #include "llvm/MC/MCStreamer.h"
230b57cec5SDimitry Andric #include "llvm/MC/MCSymbol.h"
240b57cec5SDimitry Andric #include "llvm/Support/ErrorHandling.h"
250b57cec5SDimitry Andric #include "llvm/Target/TargetLoweringObjectFile.h"
26e8d8bef9SDimitry Andric #include <cstdint>
270b57cec5SDimitry Andric using namespace llvm;
280b57cec5SDimitry Andric 
290b57cec5SDimitry Andric #define DEBUG_TYPE "asm-printer"
300b57cec5SDimitry Andric 
310b57cec5SDimitry Andric //===----------------------------------------------------------------------===//
320b57cec5SDimitry Andric // Dwarf Emission Helper Routines
330b57cec5SDimitry Andric //===----------------------------------------------------------------------===//
340b57cec5SDimitry Andric 
DecodeDWARFEncoding(unsigned Encoding)350b57cec5SDimitry Andric static const char *DecodeDWARFEncoding(unsigned Encoding) {
360b57cec5SDimitry Andric   switch (Encoding) {
370b57cec5SDimitry Andric   case dwarf::DW_EH_PE_absptr:
380b57cec5SDimitry Andric     return "absptr";
390b57cec5SDimitry Andric   case dwarf::DW_EH_PE_omit:
400b57cec5SDimitry Andric     return "omit";
410b57cec5SDimitry Andric   case dwarf::DW_EH_PE_pcrel:
420b57cec5SDimitry Andric     return "pcrel";
430b57cec5SDimitry Andric   case dwarf::DW_EH_PE_uleb128:
440b57cec5SDimitry Andric     return "uleb128";
450b57cec5SDimitry Andric   case dwarf::DW_EH_PE_sleb128:
460b57cec5SDimitry Andric     return "sleb128";
470b57cec5SDimitry Andric   case dwarf::DW_EH_PE_udata4:
480b57cec5SDimitry Andric     return "udata4";
490b57cec5SDimitry Andric   case dwarf::DW_EH_PE_udata8:
500b57cec5SDimitry Andric     return "udata8";
510b57cec5SDimitry Andric   case dwarf::DW_EH_PE_sdata4:
520b57cec5SDimitry Andric     return "sdata4";
530b57cec5SDimitry Andric   case dwarf::DW_EH_PE_sdata8:
540b57cec5SDimitry Andric     return "sdata8";
550b57cec5SDimitry Andric   case dwarf::DW_EH_PE_pcrel | dwarf::DW_EH_PE_udata4:
560b57cec5SDimitry Andric     return "pcrel udata4";
570b57cec5SDimitry Andric   case dwarf::DW_EH_PE_pcrel | dwarf::DW_EH_PE_sdata4:
580b57cec5SDimitry Andric     return "pcrel sdata4";
590b57cec5SDimitry Andric   case dwarf::DW_EH_PE_pcrel | dwarf::DW_EH_PE_udata8:
600b57cec5SDimitry Andric     return "pcrel udata8";
610b57cec5SDimitry Andric   case dwarf::DW_EH_PE_pcrel | dwarf::DW_EH_PE_sdata8:
620b57cec5SDimitry Andric     return "pcrel sdata8";
630b57cec5SDimitry Andric   case dwarf::DW_EH_PE_indirect | dwarf::DW_EH_PE_pcrel | dwarf::DW_EH_PE_udata4
640b57cec5SDimitry Andric       :
650b57cec5SDimitry Andric     return "indirect pcrel udata4";
660b57cec5SDimitry Andric   case dwarf::DW_EH_PE_indirect | dwarf::DW_EH_PE_pcrel | dwarf::DW_EH_PE_sdata4
670b57cec5SDimitry Andric       :
680b57cec5SDimitry Andric     return "indirect pcrel sdata4";
690b57cec5SDimitry Andric   case dwarf::DW_EH_PE_indirect | dwarf::DW_EH_PE_pcrel | dwarf::DW_EH_PE_udata8
700b57cec5SDimitry Andric       :
710b57cec5SDimitry Andric     return "indirect pcrel udata8";
720b57cec5SDimitry Andric   case dwarf::DW_EH_PE_indirect | dwarf::DW_EH_PE_pcrel | dwarf::DW_EH_PE_sdata8
730b57cec5SDimitry Andric       :
740b57cec5SDimitry Andric     return "indirect pcrel sdata8";
75e8d8bef9SDimitry Andric   case dwarf::DW_EH_PE_indirect | dwarf::DW_EH_PE_datarel |
76e8d8bef9SDimitry Andric       dwarf::DW_EH_PE_sdata4:
77e8d8bef9SDimitry Andric     return "indirect datarel sdata4";
78e8d8bef9SDimitry Andric   case dwarf::DW_EH_PE_indirect | dwarf::DW_EH_PE_datarel |
79e8d8bef9SDimitry Andric       dwarf::DW_EH_PE_sdata8:
80e8d8bef9SDimitry Andric     return "indirect datarel sdata8";
810b57cec5SDimitry Andric   }
820b57cec5SDimitry Andric 
830b57cec5SDimitry Andric   return "<unknown encoding>";
840b57cec5SDimitry Andric }
850b57cec5SDimitry Andric 
860b57cec5SDimitry Andric /// EmitEncodingByte - Emit a .byte 42 directive that corresponds to an
870b57cec5SDimitry Andric /// encoding.  If verbose assembly output is enabled, we output comments
880b57cec5SDimitry Andric /// describing the encoding.  Desc is an optional string saying what the
890b57cec5SDimitry Andric /// encoding is specifying (e.g. "LSDA").
emitEncodingByte(unsigned Val,const char * Desc) const905ffd83dbSDimitry Andric void AsmPrinter::emitEncodingByte(unsigned Val, const char *Desc) const {
910b57cec5SDimitry Andric   if (isVerbose()) {
920b57cec5SDimitry Andric     if (Desc)
930b57cec5SDimitry Andric       OutStreamer->AddComment(Twine(Desc) + " Encoding = " +
940b57cec5SDimitry Andric                               Twine(DecodeDWARFEncoding(Val)));
950b57cec5SDimitry Andric     else
960b57cec5SDimitry Andric       OutStreamer->AddComment(Twine("Encoding = ") + DecodeDWARFEncoding(Val));
970b57cec5SDimitry Andric   }
980b57cec5SDimitry Andric 
995ffd83dbSDimitry Andric   OutStreamer->emitIntValue(Val, 1);
1000b57cec5SDimitry Andric }
1010b57cec5SDimitry Andric 
1020b57cec5SDimitry Andric /// GetSizeOfEncodedValue - Return the size of the encoding in bytes.
GetSizeOfEncodedValue(unsigned Encoding) const1030b57cec5SDimitry Andric unsigned AsmPrinter::GetSizeOfEncodedValue(unsigned Encoding) const {
1040b57cec5SDimitry Andric   if (Encoding == dwarf::DW_EH_PE_omit)
1050b57cec5SDimitry Andric     return 0;
1060b57cec5SDimitry Andric 
1070b57cec5SDimitry Andric   switch (Encoding & 0x07) {
1080b57cec5SDimitry Andric   default:
1090b57cec5SDimitry Andric     llvm_unreachable("Invalid encoded value.");
1100b57cec5SDimitry Andric   case dwarf::DW_EH_PE_absptr:
111*06c3fb27SDimitry Andric     return MAI->getCodePointerSize();
1120b57cec5SDimitry Andric   case dwarf::DW_EH_PE_udata2:
1130b57cec5SDimitry Andric     return 2;
1140b57cec5SDimitry Andric   case dwarf::DW_EH_PE_udata4:
1150b57cec5SDimitry Andric     return 4;
1160b57cec5SDimitry Andric   case dwarf::DW_EH_PE_udata8:
1170b57cec5SDimitry Andric     return 8;
1180b57cec5SDimitry Andric   }
1190b57cec5SDimitry Andric }
1200b57cec5SDimitry Andric 
emitTTypeReference(const GlobalValue * GV,unsigned Encoding)121e8d8bef9SDimitry Andric void AsmPrinter::emitTTypeReference(const GlobalValue *GV, unsigned Encoding) {
1220b57cec5SDimitry Andric   if (GV) {
1230b57cec5SDimitry Andric     const TargetLoweringObjectFile &TLOF = getObjFileLowering();
1240b57cec5SDimitry Andric 
1250b57cec5SDimitry Andric     const MCExpr *Exp =
1260b57cec5SDimitry Andric         TLOF.getTTypeGlobalReference(GV, Encoding, TM, MMI, *OutStreamer);
1275ffd83dbSDimitry Andric     OutStreamer->emitValue(Exp, GetSizeOfEncodedValue(Encoding));
1280b57cec5SDimitry Andric   } else
1295ffd83dbSDimitry Andric     OutStreamer->emitIntValue(0, GetSizeOfEncodedValue(Encoding));
1300b57cec5SDimitry Andric }
1310b57cec5SDimitry Andric 
emitDwarfSymbolReference(const MCSymbol * Label,bool ForceOffset) const1320b57cec5SDimitry Andric void AsmPrinter::emitDwarfSymbolReference(const MCSymbol *Label,
1330b57cec5SDimitry Andric                                           bool ForceOffset) const {
1340b57cec5SDimitry Andric   if (!ForceOffset) {
1350b57cec5SDimitry Andric     // On COFF targets, we have to emit the special .secrel32 directive.
1360b57cec5SDimitry Andric     if (MAI->needsDwarfSectionOffsetDirective()) {
137e8d8bef9SDimitry Andric       assert(!isDwarf64() &&
138e8d8bef9SDimitry Andric              "emitting DWARF64 is not implemented for COFF targets");
13981ad6265SDimitry Andric       OutStreamer->emitCOFFSecRel32(Label, /*Offset=*/0);
1400b57cec5SDimitry Andric       return;
1410b57cec5SDimitry Andric     }
1420b57cec5SDimitry Andric 
1430b57cec5SDimitry Andric     // If the format uses relocations with dwarf, refer to the symbol directly.
144bdd1243dSDimitry Andric     if (doesDwarfUseRelocationsAcrossSections()) {
145e8d8bef9SDimitry Andric       OutStreamer->emitSymbolValue(Label, getDwarfOffsetByteSize());
1460b57cec5SDimitry Andric       return;
1470b57cec5SDimitry Andric     }
1480b57cec5SDimitry Andric   }
1490b57cec5SDimitry Andric 
1500b57cec5SDimitry Andric   // Otherwise, emit it as a label difference from the start of the section.
151e8d8bef9SDimitry Andric   emitLabelDifference(Label, Label->getSection().getBeginSymbol(),
152e8d8bef9SDimitry Andric                       getDwarfOffsetByteSize());
1530b57cec5SDimitry Andric }
1540b57cec5SDimitry Andric 
emitDwarfStringOffset(DwarfStringPoolEntry S) const1550b57cec5SDimitry Andric void AsmPrinter::emitDwarfStringOffset(DwarfStringPoolEntry S) const {
156bdd1243dSDimitry Andric   if (doesDwarfUseRelocationsAcrossSections()) {
1570b57cec5SDimitry Andric     assert(S.Symbol && "No symbol available");
1580b57cec5SDimitry Andric     emitDwarfSymbolReference(S.Symbol);
1590b57cec5SDimitry Andric     return;
1600b57cec5SDimitry Andric   }
1610b57cec5SDimitry Andric 
1620b57cec5SDimitry Andric   // Just emit the offset directly; no need for symbol math.
163e8d8bef9SDimitry Andric   OutStreamer->emitIntValue(S.Offset, getDwarfOffsetByteSize());
1640b57cec5SDimitry Andric }
1650b57cec5SDimitry Andric 
emitDwarfOffset(const MCSymbol * Label,uint64_t Offset) const1665ffd83dbSDimitry Andric void AsmPrinter::emitDwarfOffset(const MCSymbol *Label, uint64_t Offset) const {
167e8d8bef9SDimitry Andric   emitLabelPlusOffset(Label, Offset, getDwarfOffsetByteSize());
168e8d8bef9SDimitry Andric }
169e8d8bef9SDimitry Andric 
emitDwarfLengthOrOffset(uint64_t Value) const170e8d8bef9SDimitry Andric void AsmPrinter::emitDwarfLengthOrOffset(uint64_t Value) const {
171e8d8bef9SDimitry Andric   assert(isDwarf64() || Value <= UINT32_MAX);
172e8d8bef9SDimitry Andric   OutStreamer->emitIntValue(Value, getDwarfOffsetByteSize());
173e8d8bef9SDimitry Andric }
174e8d8bef9SDimitry Andric 
emitDwarfUnitLength(uint64_t Length,const Twine & Comment) const175e8d8bef9SDimitry Andric void AsmPrinter::emitDwarfUnitLength(uint64_t Length,
176e8d8bef9SDimitry Andric                                      const Twine &Comment) const {
177fe6060f1SDimitry Andric   OutStreamer->emitDwarfUnitLength(Length, Comment);
178e8d8bef9SDimitry Andric }
179e8d8bef9SDimitry Andric 
emitDwarfUnitLength(const Twine & Prefix,const Twine & Comment) const180fe6060f1SDimitry Andric MCSymbol *AsmPrinter::emitDwarfUnitLength(const Twine &Prefix,
181e8d8bef9SDimitry Andric                                           const Twine &Comment) const {
182fe6060f1SDimitry Andric   return OutStreamer->emitDwarfUnitLength(Prefix, Comment);
1830b57cec5SDimitry Andric }
1840b57cec5SDimitry Andric 
emitCallSiteOffset(const MCSymbol * Hi,const MCSymbol * Lo,unsigned Encoding) const1855ffd83dbSDimitry Andric void AsmPrinter::emitCallSiteOffset(const MCSymbol *Hi, const MCSymbol *Lo,
1860b57cec5SDimitry Andric                                     unsigned Encoding) const {
1870b57cec5SDimitry Andric   // The least significant 3 bits specify the width of the encoding
1880b57cec5SDimitry Andric   if ((Encoding & 0x7) == dwarf::DW_EH_PE_uleb128)
1895ffd83dbSDimitry Andric     emitLabelDifferenceAsULEB128(Hi, Lo);
1900b57cec5SDimitry Andric   else
1915ffd83dbSDimitry Andric     emitLabelDifference(Hi, Lo, GetSizeOfEncodedValue(Encoding));
1920b57cec5SDimitry Andric }
1930b57cec5SDimitry Andric 
emitCallSiteValue(uint64_t Value,unsigned Encoding) const1945ffd83dbSDimitry Andric void AsmPrinter::emitCallSiteValue(uint64_t Value, unsigned Encoding) const {
1950b57cec5SDimitry Andric   // The least significant 3 bits specify the width of the encoding
1960b57cec5SDimitry Andric   if ((Encoding & 0x7) == dwarf::DW_EH_PE_uleb128)
1975ffd83dbSDimitry Andric     emitULEB128(Value);
1980b57cec5SDimitry Andric   else
1995ffd83dbSDimitry Andric     OutStreamer->emitIntValue(Value, GetSizeOfEncodedValue(Encoding));
2000b57cec5SDimitry Andric }
2010b57cec5SDimitry Andric 
2020b57cec5SDimitry Andric //===----------------------------------------------------------------------===//
2030b57cec5SDimitry Andric // Dwarf Lowering Routines
2040b57cec5SDimitry Andric //===----------------------------------------------------------------------===//
2050b57cec5SDimitry Andric 
emitCFIInstruction(const MCCFIInstruction & Inst) const2060b57cec5SDimitry Andric void AsmPrinter::emitCFIInstruction(const MCCFIInstruction &Inst) const {
207*06c3fb27SDimitry Andric   SMLoc Loc = Inst.getLoc();
2080b57cec5SDimitry Andric   switch (Inst.getOperation()) {
2090b57cec5SDimitry Andric   default:
2100b57cec5SDimitry Andric     llvm_unreachable("Unexpected instruction");
2110b57cec5SDimitry Andric   case MCCFIInstruction::OpDefCfaOffset:
212*06c3fb27SDimitry Andric     OutStreamer->emitCFIDefCfaOffset(Inst.getOffset(), Loc);
2130b57cec5SDimitry Andric     break;
2140b57cec5SDimitry Andric   case MCCFIInstruction::OpAdjustCfaOffset:
215*06c3fb27SDimitry Andric     OutStreamer->emitCFIAdjustCfaOffset(Inst.getOffset(), Loc);
2160b57cec5SDimitry Andric     break;
2170b57cec5SDimitry Andric   case MCCFIInstruction::OpDefCfa:
218*06c3fb27SDimitry Andric     OutStreamer->emitCFIDefCfa(Inst.getRegister(), Inst.getOffset(), Loc);
2190b57cec5SDimitry Andric     break;
2200b57cec5SDimitry Andric   case MCCFIInstruction::OpDefCfaRegister:
221*06c3fb27SDimitry Andric     OutStreamer->emitCFIDefCfaRegister(Inst.getRegister(), Loc);
2220b57cec5SDimitry Andric     break;
223fe6060f1SDimitry Andric   case MCCFIInstruction::OpLLVMDefAspaceCfa:
224fe6060f1SDimitry Andric     OutStreamer->emitCFILLVMDefAspaceCfa(Inst.getRegister(), Inst.getOffset(),
225*06c3fb27SDimitry Andric                                          Inst.getAddressSpace(), Loc);
226fe6060f1SDimitry Andric     break;
2270b57cec5SDimitry Andric   case MCCFIInstruction::OpOffset:
228*06c3fb27SDimitry Andric     OutStreamer->emitCFIOffset(Inst.getRegister(), Inst.getOffset(), Loc);
2290b57cec5SDimitry Andric     break;
2300b57cec5SDimitry Andric   case MCCFIInstruction::OpRegister:
231*06c3fb27SDimitry Andric     OutStreamer->emitCFIRegister(Inst.getRegister(), Inst.getRegister2(), Loc);
2320b57cec5SDimitry Andric     break;
2330b57cec5SDimitry Andric   case MCCFIInstruction::OpWindowSave:
234*06c3fb27SDimitry Andric     OutStreamer->emitCFIWindowSave(Loc);
2350b57cec5SDimitry Andric     break;
2360b57cec5SDimitry Andric   case MCCFIInstruction::OpNegateRAState:
237*06c3fb27SDimitry Andric     OutStreamer->emitCFINegateRAState(Loc);
2380b57cec5SDimitry Andric     break;
2390b57cec5SDimitry Andric   case MCCFIInstruction::OpSameValue:
240*06c3fb27SDimitry Andric     OutStreamer->emitCFISameValue(Inst.getRegister(), Loc);
2410b57cec5SDimitry Andric     break;
2420b57cec5SDimitry Andric   case MCCFIInstruction::OpGnuArgsSize:
243*06c3fb27SDimitry Andric     OutStreamer->emitCFIGnuArgsSize(Inst.getOffset(), Loc);
2440b57cec5SDimitry Andric     break;
2450b57cec5SDimitry Andric   case MCCFIInstruction::OpEscape:
24675b4d546SDimitry Andric     OutStreamer->AddComment(Inst.getComment());
247*06c3fb27SDimitry Andric     OutStreamer->emitCFIEscape(Inst.getValues(), Loc);
2480b57cec5SDimitry Andric     break;
2490b57cec5SDimitry Andric   case MCCFIInstruction::OpRestore:
250*06c3fb27SDimitry Andric     OutStreamer->emitCFIRestore(Inst.getRegister(), Loc);
2515ffd83dbSDimitry Andric     break;
2525ffd83dbSDimitry Andric   case MCCFIInstruction::OpUndefined:
253*06c3fb27SDimitry Andric     OutStreamer->emitCFIUndefined(Inst.getRegister(), Loc);
2540b57cec5SDimitry Andric     break;
25581ad6265SDimitry Andric   case MCCFIInstruction::OpRememberState:
256*06c3fb27SDimitry Andric     OutStreamer->emitCFIRememberState(Loc);
25781ad6265SDimitry Andric     break;
25881ad6265SDimitry Andric   case MCCFIInstruction::OpRestoreState:
259*06c3fb27SDimitry Andric     OutStreamer->emitCFIRestoreState(Loc);
26081ad6265SDimitry Andric     break;
2610b57cec5SDimitry Andric   }
2620b57cec5SDimitry Andric }
2630b57cec5SDimitry Andric 
emitDwarfDIE(const DIE & Die) const2640b57cec5SDimitry Andric void AsmPrinter::emitDwarfDIE(const DIE &Die) const {
2650b57cec5SDimitry Andric   // Emit the code (index) for the abbreviation.
2660b57cec5SDimitry Andric   if (isVerbose())
2670b57cec5SDimitry Andric     OutStreamer->AddComment("Abbrev [" + Twine(Die.getAbbrevNumber()) + "] 0x" +
2680b57cec5SDimitry Andric                             Twine::utohexstr(Die.getOffset()) + ":0x" +
2690b57cec5SDimitry Andric                             Twine::utohexstr(Die.getSize()) + " " +
2700b57cec5SDimitry Andric                             dwarf::TagString(Die.getTag()));
2715ffd83dbSDimitry Andric   emitULEB128(Die.getAbbrevNumber());
2720b57cec5SDimitry Andric 
2730b57cec5SDimitry Andric   // Emit the DIE attribute values.
2740b57cec5SDimitry Andric   for (const auto &V : Die.values()) {
2750b57cec5SDimitry Andric     dwarf::Attribute Attr = V.getAttribute();
2760b57cec5SDimitry Andric     assert(V.getForm() && "Too many attributes for DIE (check abbreviation)");
2770b57cec5SDimitry Andric 
2780b57cec5SDimitry Andric     if (isVerbose()) {
2790b57cec5SDimitry Andric       OutStreamer->AddComment(dwarf::AttributeString(Attr));
2800b57cec5SDimitry Andric       if (Attr == dwarf::DW_AT_accessibility)
2810b57cec5SDimitry Andric         OutStreamer->AddComment(
2820b57cec5SDimitry Andric             dwarf::AccessibilityString(V.getDIEInteger().getValue()));
2830b57cec5SDimitry Andric     }
2840b57cec5SDimitry Andric 
2850b57cec5SDimitry Andric     // Emit an attribute using the defined form.
2865ffd83dbSDimitry Andric     V.emitValue(this);
2870b57cec5SDimitry Andric   }
2880b57cec5SDimitry Andric 
2890b57cec5SDimitry Andric   // Emit the DIE children if any.
2900b57cec5SDimitry Andric   if (Die.hasChildren()) {
291fcaf7f86SDimitry Andric     for (const auto &Child : Die.children())
2920b57cec5SDimitry Andric       emitDwarfDIE(Child);
2930b57cec5SDimitry Andric 
2940b57cec5SDimitry Andric     OutStreamer->AddComment("End Of Children Mark");
2950b57cec5SDimitry Andric     emitInt8(0);
2960b57cec5SDimitry Andric   }
2970b57cec5SDimitry Andric }
2980b57cec5SDimitry Andric 
emitDwarfAbbrev(const DIEAbbrev & Abbrev) const2990b57cec5SDimitry Andric void AsmPrinter::emitDwarfAbbrev(const DIEAbbrev &Abbrev) const {
3000b57cec5SDimitry Andric   // Emit the abbreviations code (base 1 index.)
3015ffd83dbSDimitry Andric   emitULEB128(Abbrev.getNumber(), "Abbreviation Code");
3020b57cec5SDimitry Andric 
3030b57cec5SDimitry Andric   // Emit the abbreviations data.
3040b57cec5SDimitry Andric   Abbrev.Emit(this);
3050b57cec5SDimitry Andric }
306