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 @@ -645,8 +645,7 @@ /// Emit a unit length field. The actual format, DWARF32 or DWARF64, is chosen /// according to the settings. - void emitDwarfUnitLength(const MCSymbol *Hi, const MCSymbol *Lo, - const Twine &Comment) const; + void emitDwarfUnitLength(MCSymbol *Hi, const Twine &Comment) const; /// Emit reference to a call site with a specified encoding void emitCallSiteOffset(const MCSymbol *Hi, const MCSymbol *Lo, 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 @@ -1090,8 +1090,7 @@ /// 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); + virtual void emitDwarfUnitLength(MCSymbol *Hi, const Twine &Comment); }; /// Create a dummy machine code streamer, which does nothing. This is useful for diff --git a/llvm/lib/CodeGen/AsmPrinter/AccelTable.cpp b/llvm/lib/CodeGen/AsmPrinter/AccelTable.cpp --- a/llvm/lib/CodeGen/AsmPrinter/AccelTable.cpp +++ b/llvm/lib/CodeGen/AsmPrinter/AccelTable.cpp @@ -216,7 +216,6 @@ DenseMap> Abbreviations; ArrayRef CompUnits; llvm::function_ref getCUIndexForEntry; - MCSymbol *ContributionStart = Asm->createTempSymbol("names_start"); MCSymbol *ContributionEnd = Asm->createTempSymbol("names_end"); MCSymbol *AbbrevStart = Asm->createTempSymbol("names_abbrev_start"); MCSymbol *AbbrevEnd = Asm->createTempSymbol("names_abbrev_end"); @@ -366,9 +365,7 @@ assert(CompUnitCount > 0 && "Index must have at least one CU."); AsmPrinter *Asm = Ctx.Asm; - Asm->emitDwarfUnitLength(Ctx.ContributionEnd, Ctx.ContributionStart, - "Header: unit length"); - Asm->OutStreamer->emitLabel(Ctx.ContributionStart); + Asm->emitDwarfUnitLength(Ctx.ContributionEnd, "Header: unit length"); Asm->OutStreamer->AddComment("Header: version"); Asm->emitInt16(Version); Asm->OutStreamer->AddComment("Header: padding"); diff --git a/llvm/lib/CodeGen/AsmPrinter/AddressPool.cpp b/llvm/lib/CodeGen/AsmPrinter/AddressPool.cpp --- a/llvm/lib/CodeGen/AsmPrinter/AddressPool.cpp +++ b/llvm/lib/CodeGen/AsmPrinter/AddressPool.cpp @@ -26,11 +26,9 @@ MCSymbol *AddressPool::emitHeader(AsmPrinter &Asm, MCSection *Section) { static const uint8_t AddrSize = Asm.getDataLayout().getPointerSize(); StringRef Prefix = "debug_addr_"; - MCSymbol *BeginLabel = Asm.createTempSymbol(Prefix + "start"); MCSymbol *EndLabel = Asm.createTempSymbol(Prefix + "end"); - Asm.emitDwarfUnitLength(EndLabel, BeginLabel, "Length of contribution"); - Asm.OutStreamer->emitLabel(BeginLabel); + Asm.emitDwarfUnitLength(EndLabel, "Length of contribution"); Asm.OutStreamer->AddComment("DWARF version number"); Asm.emitInt16(Asm.getDwarfVersion()); Asm.OutStreamer->AddComment("Address size"); 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 @@ -203,9 +203,8 @@ OutStreamer->emitDwarfUnitLength(Length, Comment); } -void AsmPrinter::emitDwarfUnitLength(const MCSymbol *Hi, const MCSymbol *Lo, - const Twine &Comment) const { - OutStreamer->emitDwarfUnitLength(Hi, Lo, Comment); +void AsmPrinter::emitDwarfUnitLength(MCSymbol *Hi, const Twine &Comment) const { + OutStreamer->emitDwarfUnitLength(Hi, Comment); } void AsmPrinter::emitCallSiteOffset(const MCSymbol *Hi, const MCSymbol *Lo, diff --git a/llvm/lib/CodeGen/AsmPrinter/DwarfDebug.cpp b/llvm/lib/CodeGen/AsmPrinter/DwarfDebug.cpp --- a/llvm/lib/CodeGen/AsmPrinter/DwarfDebug.cpp +++ b/llvm/lib/CodeGen/AsmPrinter/DwarfDebug.cpp @@ -2360,12 +2360,8 @@ TheU = Skeleton; // Emit the header. - MCSymbol *BeginLabel = Asm->createTempSymbol("pub" + Name + "_begin"); MCSymbol *EndLabel = Asm->createTempSymbol("pub" + Name + "_end"); - Asm->emitDwarfUnitLength(EndLabel, BeginLabel, - "Length of Public " + Name + " Info"); - - Asm->OutStreamer->emitLabel(BeginLabel); + Asm->emitDwarfUnitLength(EndLabel, "Length of Public " + Name + " Info"); Asm->OutStreamer->AddComment("DWARF Version"); Asm->emitInt16(dwarf::DW_PUBNAMES_VERSION); diff --git a/llvm/lib/CodeGen/AsmPrinter/DwarfUnit.cpp b/llvm/lib/CodeGen/AsmPrinter/DwarfUnit.cpp --- a/llvm/lib/CodeGen/AsmPrinter/DwarfUnit.cpp +++ b/llvm/lib/CodeGen/AsmPrinter/DwarfUnit.cpp @@ -1677,10 +1677,8 @@ // Emit size of content not including length itself if (!DD->useSectionsAsReferences()) { StringRef Prefix = isDwoUnit() ? "debug_info_dwo_" : "debug_info_"; - MCSymbol *BeginLabel = Asm->createTempSymbol(Prefix + "start"); EndLabel = Asm->createTempSymbol(Prefix + "end"); - Asm->emitDwarfUnitLength(EndLabel, BeginLabel, "Length of Unit"); - Asm->OutStreamer->emitLabel(BeginLabel); + Asm->emitDwarfUnitLength(EndLabel, "Length of Unit"); } else Asm->emitDwarfUnitLength(getHeaderSize() + getUnitDie().getSize(), "Length of Unit"); 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 @@ -1006,12 +1006,15 @@ emitIntValue(Length, dwarf::getDwarfOffsetByteSize(Context.getDwarfFormat())); } -void MCStreamer::emitDwarfUnitLength(const MCSymbol *Hi, const MCSymbol *Lo, - const Twine &Comment) { +void MCStreamer::emitDwarfUnitLength(MCSymbol *Hi, const Twine &Comment) { maybeEmitDwarf64Mark(); AddComment(Comment); + MCSymbol *Lo = Context.createTempSymbol(); + emitAbsoluteSymbolDiff( Hi, Lo, dwarf::getDwarfOffsetByteSize(Context.getDwarfFormat())); + // emit the begin symbol after we generate the length field. + emitLabel(Lo); } void MCStreamer::emitAssignment(MCSymbol *Symbol, const MCExpr *Value) { diff --git a/llvm/test/DebugInfo/X86/addr_comments.ll b/llvm/test/DebugInfo/X86/addr_comments.ll --- a/llvm/test/DebugInfo/X86/addr_comments.ll +++ b/llvm/test/DebugInfo/X86/addr_comments.ll @@ -1,8 +1,8 @@ ; RUN: llc %s -mtriple=i386-unknown-linux-gnu -filetype=asm -o - | FileCheck %s ; CHECK: .section .debug_addr -; CHECK-NEXT: .long .Ldebug_addr_end0-.Ldebug_addr_start0 # Length of contribution -; CHECK-NEXT: .Ldebug_addr_start0: +; CHECK-NEXT: .long .Ldebug_addr_end0-.Ltmp3 # Length of contribution +; CHECK-NEXT: .Ltmp3: ; CHECK-NEXT: .short 5 # DWARF version number ; CHECK-NEXT: .byte 4 # Address size ; CHECK-NEXT: .byte 0 # Segment selector size diff --git a/llvm/test/DebugInfo/X86/dwarf-pubnames-split.ll b/llvm/test/DebugInfo/X86/dwarf-pubnames-split.ll --- a/llvm/test/DebugInfo/X86/dwarf-pubnames-split.ll +++ b/llvm/test/DebugInfo/X86/dwarf-pubnames-split.ll @@ -7,7 +7,7 @@ ; Check that we get a symbol off of the debug_info section when using split dwarf and pubnames. -; CHECK: .LpubTypes_begin0: +; CHECK: .Ltmp5: ; CHECK-NEXT: .short 2 # DWARF Version ; CHECK-NEXT: .long .Lcu_begin0 # Offset of Compilation Unit Info diff --git a/llvm/test/DebugInfo/X86/length_symbol_difference.ll b/llvm/test/DebugInfo/X86/length_symbol_difference.ll --- a/llvm/test/DebugInfo/X86/length_symbol_difference.ll +++ b/llvm/test/DebugInfo/X86/length_symbol_difference.ll @@ -1,7 +1,7 @@ ; RUN: llc -filetype=asm -O0 -mtriple=x86_64-linux-gnu < %s | FileCheck %s -; CHECK: .long .Ldebug_info_end0-.Ldebug_info_start0 # Length of Unit -; CHECK-NEXT: .Ldebug_info_start0: +; CHECK: .long .Ldebug_info_end0-.Ltmp1 # Length of Unit +; CHECK-NEXT: .Ltmp1: ; CHECK-NOT: .byte 0 ; CHECK: .byte 0 # End Of Children Mark ; CHECK-NEXT: .Ldebug_info_end0: diff --git a/llvm/test/MC/WebAssembly/comdat-sections.ll b/llvm/test/MC/WebAssembly/comdat-sections.ll --- a/llvm/test/MC/WebAssembly/comdat-sections.ll +++ b/llvm/test/MC/WebAssembly/comdat-sections.ll @@ -17,8 +17,8 @@ ; ASM: .section .debug_types,"G",@,4721183873463917179,comdat ; Here we are not trying to verify all of the debug info; just enough to ensure ; that the section contains a type unit for a type with matching signature -; ASM-NEXT: .int32 .Ldebug_info_end0-.Ldebug_info_start0 # Length of Unit -; ASM-NEXT: .Ldebug_info_start0: +; ASM-NEXT: .int32 .Ldebug_info_end0-.Ltmp0 # Length of Unit +; ASM-NEXT: .Ltmp0: ; ASM-NEXT: .int16 4 # DWARF version number ; ASM-NEXT: .int32 .debug_abbrev0 # Offset Into Abbrev. Section ; ASM-NEXT: .int8 4 # Address Size (in bytes) 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 @@ -327,20 +327,22 @@ return false; Hi = TestPrinter->getCtx().createTempSymbol(); - Lo = TestPrinter->getCtx().createTempSymbol(); + + MCSection *Sec = + TestPrinter->getCtx().getELFSection(".tst", ELF::SHT_PROGBITS, 0); + TestPrinter->getMS().SwitchSection(Sec); return true; } MCSymbol *Hi = nullptr; - MCSymbol *Lo = nullptr; }; TEST_F(AsmPrinterEmitDwarfUnitLengthAsHiLoDiffTest, DWARF32) { if (!init("x86_64-pc-linux", /*DwarfVersion=*/4, dwarf::DWARF32)) return; - EXPECT_CALL(TestPrinter->getMS(), emitAbsoluteSymbolDiff(Hi, Lo, 4)); - TestPrinter->getAP()->emitDwarfUnitLength(Hi, Lo, ""); + EXPECT_CALL(TestPrinter->getMS(), emitAbsoluteSymbolDiff(Hi, _, 4)); + TestPrinter->getAP()->emitDwarfUnitLength(Hi, ""); } TEST_F(AsmPrinterEmitDwarfUnitLengthAsHiLoDiffTest, DWARF64) { @@ -349,9 +351,9 @@ InSequence S; EXPECT_CALL(TestPrinter->getMS(), emitIntValue(dwarf::DW_LENGTH_DWARF64, 4)); - EXPECT_CALL(TestPrinter->getMS(), emitAbsoluteSymbolDiff(Hi, Lo, 8)); + EXPECT_CALL(TestPrinter->getMS(), emitAbsoluteSymbolDiff(Hi, _, 8)); - TestPrinter->getAP()->emitDwarfUnitLength(Hi, Lo, ""); + TestPrinter->getAP()->emitDwarfUnitLength(Hi, ""); } class AsmPrinterHandlerTest : public AsmPrinterFixtureBase {