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<uint32_t, SmallVector<AttributeEncoding, 2>> Abbreviations;
   ArrayRef<MCSymbol *> CompUnits;
   llvm::function_ref<unsigned(const DataT &)> 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-[[LBL:\.Ltmp[0-9]+]] # Length of contribution
+; CHECK-NEXT: [[LBL]]:
 ; 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,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,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-[[LBL:\.Ltmp[0-9]+]] # Length of Unit
+; CHECK-NEXT: [[LBL]]:
 ; 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-[[LBL:\.Ltmp[0-9]+]] # Length of Unit
+; ASM-NEXT: [[LBL]]:
 ; 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 {