diff --git a/llvm/include/llvm/CodeGen/AsmPrinter.h b/llvm/include/llvm/CodeGen/AsmPrinter.h --- a/llvm/include/llvm/CodeGen/AsmPrinter.h +++ b/llvm/include/llvm/CodeGen/AsmPrinter.h @@ -639,9 +639,6 @@ /// Emit 32- or 64-bit value depending on the DWARF format. void emitDwarfLengthOrOffset(uint64_t Value) const; - /// Emit a special value of 0xffffffff if producing 64-bit debugging info. - void maybeEmitDwarf64Mark() const; - /// Emit a unit length field. The actual format, DWARF32 or DWARF64, is chosen /// according to the settings. void emitDwarfUnitLength(uint64_t Length, const Twine &Comment) const; diff --git a/llvm/include/llvm/MC/MCStreamer.h b/llvm/include/llvm/MC/MCStreamer.h --- a/llvm/include/llvm/MC/MCStreamer.h +++ b/llvm/include/llvm/MC/MCStreamer.h @@ -1079,6 +1079,18 @@ void Finish(SMLoc EndLoc = SMLoc()); virtual bool mayHaveInstructions(MCSection &Sec) const { return true; } + + /// Emit a special value of 0xffffffff if producing 64-bit debugging info. + void maybeEmitDwarf64Mark(); + + /// Emit a unit length field. The actual format, DWARF32 or DWARF64, is chosen + /// according to the settings. + virtual void emitDwarfUnitLength(uint64_t Length, const Twine &Comment); + + /// Emit a unit length field. The actual format, DWARF32 or DWARF64, is chosen + /// according to the settings. + virtual void emitDwarfUnitLength(const MCSymbol *Hi, const MCSymbol *Lo, + const Twine &Comment); }; /// Create a dummy machine code streamer, which does nothing. This is useful for diff --git a/llvm/lib/CodeGen/AsmPrinter/AsmPrinterDwarf.cpp b/llvm/lib/CodeGen/AsmPrinter/AsmPrinterDwarf.cpp --- a/llvm/lib/CodeGen/AsmPrinter/AsmPrinterDwarf.cpp +++ b/llvm/lib/CodeGen/AsmPrinter/AsmPrinterDwarf.cpp @@ -198,26 +198,14 @@ OutStreamer->emitIntValue(Value, getDwarfOffsetByteSize()); } -void AsmPrinter::maybeEmitDwarf64Mark() const { - if (!isDwarf64()) - return; - OutStreamer->AddComment("DWARF64 Mark"); - OutStreamer->emitInt32(dwarf::DW_LENGTH_DWARF64); -} - void AsmPrinter::emitDwarfUnitLength(uint64_t Length, const Twine &Comment) const { - assert(isDwarf64() || Length <= dwarf::DW_LENGTH_lo_reserved); - maybeEmitDwarf64Mark(); - OutStreamer->AddComment(Comment); - OutStreamer->emitIntValue(Length, getDwarfOffsetByteSize()); + OutStreamer->emitDwarfUnitLength(Length, Comment); } void AsmPrinter::emitDwarfUnitLength(const MCSymbol *Hi, const MCSymbol *Lo, const Twine &Comment) const { - maybeEmitDwarf64Mark(); - OutStreamer->AddComment(Comment); - OutStreamer->emitAbsoluteSymbolDiff(Hi, Lo, getDwarfOffsetByteSize()); + OutStreamer->emitDwarfUnitLength(Hi, Lo, Comment); } void AsmPrinter::emitCallSiteOffset(const MCSymbol *Hi, const MCSymbol *Lo, diff --git a/llvm/lib/MC/MCStreamer.cpp b/llvm/lib/MC/MCStreamer.cpp --- a/llvm/lib/MC/MCStreamer.cpp +++ b/llvm/lib/MC/MCStreamer.cpp @@ -991,6 +991,29 @@ finishImpl(); } +void MCStreamer::maybeEmitDwarf64Mark() { + if (Context.getDwarfFormat() != dwarf::DWARF64) + return; + AddComment("DWARF64 Mark"); + emitInt32(dwarf::DW_LENGTH_DWARF64); +} + +void MCStreamer::emitDwarfUnitLength(uint64_t Length, const Twine &Comment) { + assert(Context.getDwarfFormat() == dwarf::DWARF64 || + Length <= dwarf::DW_LENGTH_lo_reserved); + maybeEmitDwarf64Mark(); + AddComment(Comment); + emitIntValue(Length, dwarf::getDwarfOffsetByteSize(Context.getDwarfFormat())); +} + +void MCStreamer::emitDwarfUnitLength(const MCSymbol *Hi, const MCSymbol *Lo, + const Twine &Comment) { + maybeEmitDwarf64Mark(); + AddComment(Comment); + emitAbsoluteSymbolDiff( + Hi, Lo, dwarf::getDwarfOffsetByteSize(Context.getDwarfFormat())); +} + void MCStreamer::emitAssignment(MCSymbol *Symbol, const MCExpr *Value) { visitUsedExpr(*Value); Symbol->setVariableValue(Value); diff --git a/llvm/unittests/CodeGen/AsmPrinterDwarfTest.cpp b/llvm/unittests/CodeGen/AsmPrinterDwarfTest.cpp --- a/llvm/unittests/CodeGen/AsmPrinterDwarfTest.cpp +++ b/llvm/unittests/CodeGen/AsmPrinterDwarfTest.cpp @@ -294,24 +294,6 @@ EXPECT_EQ(TestPrinter->getAP()->getUnitLengthFieldByteSize(), 12u); } -class AsmPrinterMaybeEmitDwarf64MarkTest : public AsmPrinterFixtureBase {}; - -TEST_F(AsmPrinterMaybeEmitDwarf64MarkTest, DWARF32) { - if (!init("x86_64-pc-linux", /*DwarfVersion=*/4, dwarf::DWARF32)) - return; - - EXPECT_CALL(TestPrinter->getMS(), emitIntValue(_, _)).Times(0); - TestPrinter->getAP()->maybeEmitDwarf64Mark(); -} - -TEST_F(AsmPrinterMaybeEmitDwarf64MarkTest, DWARF64) { - if (!init("x86_64-pc-linux", /*DwarfVersion=*/4, dwarf::DWARF64)) - return; - - EXPECT_CALL(TestPrinter->getMS(), emitIntValue(dwarf::DW_LENGTH_DWARF64, 4)); - TestPrinter->getAP()->maybeEmitDwarf64Mark(); -} - class AsmPrinterEmitDwarfUnitLengthAsIntTest : public AsmPrinterFixtureBase { protected: uint64_t Val = 42;