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,8 @@ /// 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; + /// Return the end symbol generated inside, the caller needs to emit it. + MCSymbol *emitDwarfUnitLength(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,8 @@ /// 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); + /// Return the end symbol generated inside, the caller needs to emit it. + virtual MCSymbol *emitDwarfUnitLength(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 @@ -205,7 +205,7 @@ : CompUnitCount(CompUnitCount), BucketCount(BucketCount), NameCount(NameCount) {} - void emit(const Dwarf5AccelTableWriter &Ctx) const; + void emit(Dwarf5AccelTableWriter &Ctx); }; struct AttributeEncoding { dwarf::Index Index; @@ -216,8 +216,7 @@ DenseMap> Abbreviations; ArrayRef CompUnits; llvm::function_ref getCUIndexForEntry; - MCSymbol *ContributionStart = Asm->createTempSymbol("names_start"); - MCSymbol *ContributionEnd = Asm->createTempSymbol("names_end"); + MCSymbol *ContributionEnd = nullptr; MCSymbol *AbbrevStart = Asm->createTempSymbol("names_abbrev_start"); MCSymbol *AbbrevEnd = Asm->createTempSymbol("names_abbrev_end"); MCSymbol *EntryPool = Asm->createTempSymbol("names_entries"); @@ -240,7 +239,7 @@ ArrayRef CompUnits, llvm::function_ref GetCUIndexForEntry); - void emit() const; + void emit(); }; } // namespace @@ -361,14 +360,11 @@ } template -void Dwarf5AccelTableWriter::Header::emit( - const Dwarf5AccelTableWriter &Ctx) const { +void Dwarf5AccelTableWriter::Header::emit(Dwarf5AccelTableWriter &Ctx) { 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); + Ctx.ContributionEnd = Asm->emitDwarfUnitLength("Header: unit length"); Asm->OutStreamer->AddComment("Header: version"); Asm->emitInt16(Version); Asm->OutStreamer->AddComment("Header: padding"); @@ -526,7 +522,7 @@ Abbreviations.try_emplace(Tag, UniformAttributes); } -template void Dwarf5AccelTableWriter::emit() const { +template void Dwarf5AccelTableWriter::emit() { Header.emit(*this); emitCUList(); emitBuckets(); 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 @@ -25,12 +25,8 @@ 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); + MCSymbol *EndLabel = Asm.emitDwarfUnitLength("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); +MCSymbol *AsmPrinter::emitDwarfUnitLength(const Twine &Comment) const { + return OutStreamer->emitDwarfUnitLength(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); + MCSymbol *EndLabel = + Asm->emitDwarfUnitLength("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 @@ -1675,13 +1675,9 @@ void DwarfUnit::emitCommonHeader(bool UseOffsets, dwarf::UnitType UT) { // 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); - } else + if (!DD->useSectionsAsReferences()) + EndLabel = Asm->emitDwarfUnitLength("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,18 @@ emitIntValue(Length, dwarf::getDwarfOffsetByteSize(Context.getDwarfFormat())); } -void MCStreamer::emitDwarfUnitLength(const MCSymbol *Hi, const MCSymbol *Lo, - const Twine &Comment) { +MCSymbol *MCStreamer::emitDwarfUnitLength(const Twine &Comment) { maybeEmitDwarf64Mark(); AddComment(Comment); + MCSymbol *Lo = Context.createTempSymbol(); + MCSymbol *Hi = Context.createTempSymbol(); + emitAbsoluteSymbolDiff( Hi, Lo, dwarf::getDwarfOffsetByteSize(Context.getDwarfFormat())); + // emit the begin symbol after we generate the length field. + emitLabel(Lo); + // Return the Hi symbol to the caller. + return Hi; } 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,14 +1,14 @@ ; 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 [[LBLE:\.Ltmp[0-9]+]]-[[LBLS:\.Ltmp[0-9]+]] # Length of contribution +; CHECK-NEXT: [[LBLS]]: ; CHECK-NEXT: .short 5 # DWARF version number ; CHECK-NEXT: .byte 4 # Address size ; CHECK-NEXT: .byte 0 # Segment selector size ; CHECK-NEXT: .Laddr_table_base0: ; CHECK-NEXT: .long .Lfunc_begin0 -; CHECK-NEXT: .Ldebug_addr_end0: +; CHECK-NEXT: [[LBLE]]: ; Function Attrs: noinline nounwind optnone uwtable define dso_local void @foo() #0 !dbg !7 { 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,9 @@ ; Check that we get a symbol off of the debug_info section when using split dwarf and pubnames. -; CHECK: .LpubTypes_begin0: +; CHECK: .section .debug_pubtypes +; CHECK-NEXT: .long +; CHECK-NEXT: .Ltmp{{.+}}: ; 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,10 +1,10 @@ ; 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 [[LBLE:\.Ltmp[0-9]+]]-[[LBLS:\.Ltmp[0-9]+]] # Length of Unit +; CHECK-NEXT: [[LBLS]]: ; CHECK-NOT: .byte 0 ; CHECK: .byte 0 # End Of Children Mark -; CHECK-NEXT: .Ldebug_info_end0: +; CHECK-NEXT: [[LBLE]]: define dso_local void @_Z2f1v() !dbg !7 { 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 [[LBLE:\.Ltmp[0-9]+]]-[[LBLS:\.Ltmp[0-9]+]] # Length of Unit +; ASM-NEXT: [[LBLS]]: ; 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 @@ -326,21 +326,19 @@ if (!AsmPrinterFixtureBase::init(TripleStr, DwarfVersion, DwarfFormat)) 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(_, _, 4)); + TestPrinter->getAP()->emitDwarfUnitLength(""); } TEST_F(AsmPrinterEmitDwarfUnitLengthAsHiLoDiffTest, DWARF64) { @@ -349,9 +347,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(_, _, 8)); - TestPrinter->getAP()->emitDwarfUnitLength(Hi, Lo, ""); + TestPrinter->getAP()->emitDwarfUnitLength(""); } class AsmPrinterHandlerTest : public AsmPrinterFixtureBase {