[llvm] fe48801 - Emit a .debug_addr section with dsymutil

Shubham Sandeep Rastogi via llvm-commits llvm-commits at lists.llvm.org
Sat Jul 22 10:49:19 PDT 2023


Author: Shubham Sandeep Rastogi
Date: 2023-07-22T10:41:44-07:00
New Revision: fe48801feca0411f5ecfa37fe8802a2b3eece98f

URL: https://github.com/llvm/llvm-project/commit/fe48801feca0411f5ecfa37fe8802a2b3eece98f
DIFF: https://github.com/llvm/llvm-project/commit/fe48801feca0411f5ecfa37fe8802a2b3eece98f.diff

LOG: Emit a .debug_addr section with dsymutil

DWARF5 has support for DW_FORM_addrx, which can be useful for space
savings, but it needs a .debug_addr section to be used. dsymutil does
not have the ability to emit a debug_addr section currently. This patch
adds support for that.

Differential Revision: https://reviews.llvm.org/D154638

Added: 
    llvm/test/tools/dsymutil/ARM/dwarf5-addr_base.test
    llvm/test/tools/dsymutil/Inputs/DWARF5-addr_base/1.o
    llvm/test/tools/dsymutil/Inputs/DWARF5-addr_base/2.o
    llvm/test/tools/dsymutil/Inputs/DWARF5-addr_base/3.o

Modified: 
    llvm/include/llvm/DWARFLinker/DWARFLinker.h
    llvm/include/llvm/DWARFLinker/DWARFStreamer.h
    llvm/lib/DWARFLinker/DWARFLinker.cpp
    llvm/lib/DWARFLinker/DWARFStreamer.cpp
    llvm/test/tools/dsymutil/ARM/dummy-debug-map-amr64.map
    llvm/test/tools/dsymutil/ARM/dwarf5-addrx-0x0-last.test
    llvm/test/tools/dsymutil/ARM/dwarf5-dwarf4-combination-macho.test
    llvm/test/tools/dsymutil/ARM/dwarf5-macho.test
    llvm/test/tools/dsymutil/X86/dwarf5-addrx.test
    llvm/test/tools/dsymutil/X86/dwarf5-dw-op-addrx.test
    llvm/test/tools/dsymutil/X86/dwarf5-rnglists.test
    llvm/test/tools/dsymutil/X86/op-convert-offset.test
    llvm/test/tools/llvm-dwarfutil/ELF/X86/dwarf5-addresses.test
    llvm/test/tools/llvm-dwarfutil/ELF/X86/dwarf5-rnglists.test

Removed: 
    


################################################################################
diff  --git a/llvm/include/llvm/DWARFLinker/DWARFLinker.h b/llvm/include/llvm/DWARFLinker/DWARFLinker.h
index fe6789ceebaaaf..8e6c3cbee98508 100644
--- a/llvm/include/llvm/DWARFLinker/DWARFLinker.h
+++ b/llvm/include/llvm/DWARFLinker/DWARFLinker.h
@@ -143,6 +143,17 @@ class DwarfEmitter {
   virtual void emitDwarfDebugLocListFooter(const CompileUnit &Unit,
                                            MCSymbol *EndLabel) = 0;
 
+  /// Emit .debug_addr header.
+  virtual MCSymbol *emitDwarfDebugAddrsHeader(const CompileUnit &Unit) = 0;
+
+  /// Emit the addresses described by \p Addrs into the .debug_addr section.
+  virtual void emitDwarfDebugAddrs(const SmallVector<uint64_t> &Addrs,
+                                   uint8_t AddrSize) = 0;
+
+  /// Emit .debug_addr footer.
+  virtual void emitDwarfDebugAddrsFooter(const CompileUnit &Unit,
+                                         MCSymbol *EndLabel) = 0;
+
   /// Emit .debug_aranges entries for \p Unit
   virtual void
   emitDwarfDebugArangesTable(const CompileUnit &Unit,
@@ -211,6 +222,9 @@ class DwarfEmitter {
   /// Returns size of generated .debug_loclists section.
   virtual uint64_t getLocListsSectionSize() const = 0;
 
+  /// Returns size of generated .debug_addr section.
+  virtual uint64_t getDebugAddrSectionSize() const = 0;
+
   /// Dump the file to the disk.
   virtual void finish() = 0;
 
@@ -623,6 +637,28 @@ class DWARFLinker {
     OffsetsStringPool &DebugStrPool;
     OffsetsStringPool &DebugLineStrPool;
 
+    struct DebugAddrPool {
+      DenseMap<uint64_t, uint64_t> AddrIndexMap;
+      SmallVector<uint64_t> Addrs;
+
+      uint64_t getAddrIndex(uint64_t Addr) {
+        DenseMap<uint64_t, uint64_t>::iterator It = AddrIndexMap.find(Addr);
+        if (It == AddrIndexMap.end()) {
+          It = AddrIndexMap.insert(std::make_pair(Addr, Addrs.size())).first;
+          Addrs.push_back(Addr);
+        }
+        return It->second;
+      }
+
+      void clear() {
+        AddrIndexMap.clear();
+        Addrs.clear();
+      }
+
+    };
+
+    DebugAddrPool AddrPool;
+
     /// Allocator used for all the DIEValue objects.
     BumpPtrAllocator &DIEAlloc;
 
@@ -665,6 +701,10 @@ class DWARFLinker {
     uint64_t cloneAllCompileUnits(DWARFContext &DwarfContext,
                                   const DWARFFile &File, bool IsLittleEndian);
 
+    /// Emit the .debug_addr section for the \p Unit.
+    void emitDebugAddrSection(CompileUnit &Unit,
+                              const uint16_t DwarfVersion) const;
+
   private:
     using AttributeSpec = DWARFAbbreviationDeclaration::AttributeSpec;
 

diff  --git a/llvm/include/llvm/DWARFLinker/DWARFStreamer.h b/llvm/include/llvm/DWARFLinker/DWARFStreamer.h
index a3842250f609c5..33db102f16c1ab 100644
--- a/llvm/include/llvm/DWARFLinker/DWARFStreamer.h
+++ b/llvm/include/llvm/DWARFLinker/DWARFStreamer.h
@@ -107,6 +107,17 @@ class DwarfStreamer : public DwarfEmitter {
   /// Emit debug locations(.debug_loc, .debug_loclists) header.
   MCSymbol *emitDwarfDebugLocListHeader(const CompileUnit &Unit) override;
 
+  /// Emit .debug_addr header.
+  MCSymbol *emitDwarfDebugAddrsHeader(const CompileUnit &Unit) override;
+
+  /// Emit the addresses described by \p Addrs into .debug_addr table.
+  void emitDwarfDebugAddrs(const SmallVector<uint64_t> &Addrs,
+                           uint8_t AddrSize) override;
+
+  /// Emit .debug_addr footer.
+  void emitDwarfDebugAddrsFooter(const CompileUnit &Unit,
+                                 MCSymbol *EndLabel) override;
+
   /// Emit debug ranges(.debug_loc, .debug_loclists) fragment.
   void emitDwarfDebugLocListFragment(
       const CompileUnit &Unit,
@@ -185,6 +196,8 @@ class DwarfStreamer : public DwarfEmitter {
     return LocListsSectionSize;
   }
 
+  uint64_t getDebugAddrSectionSize() const override { return AddrSectionSize; }
+
   void emitMacroTables(DWARFContext *Context,
                        const Offset2UnitMap &UnitMacroMap,
                        OffsetsStringPool &StringPool) override;
@@ -277,6 +290,7 @@ class DwarfStreamer : public DwarfEmitter {
   uint64_t DebugInfoSectionSize = 0;
   uint64_t MacInfoSectionSize = 0;
   uint64_t MacroSectionSize = 0;
+  uint64_t AddrSectionSize = 0;
 
   /// Keep track of emitted CUs and their Unique ID.
   struct EmittedUnit {

diff  --git a/llvm/lib/DWARFLinker/DWARFLinker.cpp b/llvm/lib/DWARFLinker/DWARFLinker.cpp
index 8eaf81f2b4844e..82984436470b87 100644
--- a/llvm/lib/DWARFLinker/DWARFLinker.cpp
+++ b/llvm/lib/DWARFLinker/DWARFLinker.cpp
@@ -1383,25 +1383,18 @@ unsigned DWARFLinker::DIECloner::cloneAddressAttribute(
     *Addr += Info.PCOffset;
   }
 
-  switch (AttrSpec.Form) {
-  case dwarf::DW_FORM_addrx:
-  case dwarf::DW_FORM_addrx1:
-  case dwarf::DW_FORM_addrx2:
-  case dwarf::DW_FORM_addrx3:
-  case dwarf::DW_FORM_addrx4: {
-    // DWARFLinker does not use addrx forms since it generates relocated
-    // addresses. Replace DW_FORM_addrx* with DW_FORM_addr here.
-    AttrSpec.Form = dwarf::DW_FORM_addr;
-    break;
-  }
-  default:
-    // Nothing to do.
-    break;
+  if (AttrSpec.Form == dwarf::DW_FORM_addr) {
+    Die.addValue(DIEAlloc, static_cast<dwarf::Attribute>(AttrSpec.Attr),
+                 AttrSpec.Form, DIEInteger(*Addr));
+    return Unit.getOrigUnit().getAddressByteSize();
   }
 
-  Die.addValue(DIEAlloc, static_cast<dwarf::Attribute>(AttrSpec.Attr),
-               AttrSpec.Form, DIEInteger(*Addr));
-  return Unit.getOrigUnit().getAddressByteSize();
+  auto AddrIndex = AddrPool.getAddrIndex(*Addr);
+
+  return Die
+      .addValue(DIEAlloc, static_cast<dwarf::Attribute>(AttrSpec.Attr),
+                dwarf::Form::DW_FORM_addrx, DIEInteger(AddrIndex))
+      ->sizeOf(Unit.getOrigUnit().getFormParams());
 }
 
 unsigned DWARFLinker::DIECloner::cloneScalarAttribute(
@@ -1665,9 +1658,6 @@ shouldSkipAttribute(bool Update,
   case dwarf::DW_AT_high_pc:
   case dwarf::DW_AT_ranges:
     return !Update && SkipPC;
-  case dwarf::DW_AT_addr_base:
-    // In case !Update the .debug_addr table is not generated/preserved.
-    return !Update;
   case dwarf::DW_AT_rnglists_base:
     // In case !Update the .debug_addr table is not generated/preserved.
     // Thus instead of DW_FORM_rnglistx the DW_FORM_sec_offset is used.
@@ -2001,6 +1991,36 @@ void DWARFLinker::generateUnitLocations(
   TheDwarfEmitter->emitDwarfDebugLocListFooter(Unit, EndLabel);
 }
 
+static void patchAddrBase(DIE &Die, DIEInteger Offset) {
+  for (auto &V : Die.values())
+    if (V.getAttribute() == dwarf::DW_AT_addr_base) {
+      V = DIEValue(V.getAttribute(), V.getForm(), Offset);
+      return;
+    }
+
+  llvm_unreachable("Didn't find a DW_AT_addr_base in cloned DIE!");
+}
+
+void DWARFLinker::DIECloner::emitDebugAddrSection(
+    CompileUnit &Unit,
+    const uint16_t DwarfVersion) const {
+
+  if (LLVM_UNLIKELY(Linker.Options.Update))
+    return;
+
+  if (DwarfVersion < 5)
+    return;
+
+  if (AddrPool.Addrs.empty())
+    return;
+
+  MCSymbol *EndLabel = Emitter->emitDwarfDebugAddrsHeader(Unit);
+  patchAddrBase(*Unit.getOutputUnitDIE(),
+                DIEInteger(Emitter->getDebugAddrSectionSize()));
+  Emitter->emitDwarfDebugAddrs(AddrPool.Addrs, Unit.getOrigUnit().getAddressByteSize());
+  Emitter->emitDwarfDebugAddrsFooter(Unit, EndLabel);
+}
+
 /// Insert the new line info sequence \p Seq into the current
 /// set of already linked line info \p Rows.
 static void insertLineSequence(std::vector<DWARFDebugLine::Row> &Seq,
@@ -2566,7 +2586,9 @@ uint64_t DWARFLinker::DIECloner::cloneAllCompileUnits(
                         IsLittleEndian);
       };
       Linker.generateUnitLocations(*CurrentUnit, File, ProcessExpr);
+      emitDebugAddrSection(*CurrentUnit, DwarfVersion);
     }
+    AddrPool.clear();
   }
 
   if (Emitter != nullptr) {

diff  --git a/llvm/lib/DWARFLinker/DWARFStreamer.cpp b/llvm/lib/DWARFLinker/DWARFStreamer.cpp
index ee868be58f778b..3360ffb24ac821 100644
--- a/llvm/lib/DWARFLinker/DWARFStreamer.cpp
+++ b/llvm/lib/DWARFLinker/DWARFStreamer.cpp
@@ -606,6 +606,57 @@ void DwarfStreamer::emitDwarfDebugLocTableFragment(
   LocSectionSize += AddressSize;
 }
 
+/// Emit .debug_addr header.
+MCSymbol *DwarfStreamer::emitDwarfDebugAddrsHeader(const CompileUnit &Unit) {
+
+  // Make .debug_addr the current section.
+  MS->switchSection(MC->getObjectFileInfo()->getDwarfAddrSection());
+
+  MCSymbol *BeginLabel = Asm->createTempSymbol("Bdebugaddr");
+  MCSymbol *EndLabel = Asm->createTempSymbol("Edebugaddr");
+  unsigned AddrSize = Unit.getOrigUnit().getAddressByteSize();
+
+  // Emit length.
+  Asm->emitLabelDifference(EndLabel, BeginLabel, sizeof(uint32_t));
+  Asm->OutStreamer->emitLabel(BeginLabel);
+  AddrSectionSize += sizeof(uint32_t);
+
+  // Emit version.
+  Asm->emitInt16(5);
+  AddrSectionSize += 2;
+
+  // Emit address size.
+  Asm->emitInt8(AddrSize);
+  AddrSectionSize += 1;
+
+  // Emit segment size.
+  Asm->emitInt8(0);
+  AddrSectionSize += 1;
+
+  return EndLabel;
+}
+
+/// Emit the .debug_addr addresses stored in \p Addrs.
+void DwarfStreamer::emitDwarfDebugAddrs(const SmallVector<uint64_t> &Addrs,
+                                        uint8_t AddrSize) {
+  Asm->OutStreamer->switchSection(MOFI->getDwarfAddrSection());
+  for (auto Addr : Addrs) {
+    Asm->OutStreamer->emitIntValue(Addr, AddrSize);
+    AddrSectionSize += AddrSize;
+  }
+}
+
+/// Emit .debug_addr footer.
+void DwarfStreamer::emitDwarfDebugAddrsFooter(const CompileUnit &Unit,
+                                              MCSymbol *EndLabel) {
+
+  // Make .debug_addr the current section.
+  MS->switchSection(MC->getObjectFileInfo()->getDwarfAddrSection());
+
+  if (EndLabel != nullptr)
+    Asm->OutStreamer->emitLabel(EndLabel);
+}
+
 /// Emit piece of .debug_loclists for \p LinkedLocationExpression.
 void DwarfStreamer::emitDwarfDebugLocListsTableFragment(
     const CompileUnit &Unit,

diff  --git a/llvm/test/tools/dsymutil/ARM/dummy-debug-map-amr64.map b/llvm/test/tools/dsymutil/ARM/dummy-debug-map-amr64.map
index 4175649e6d7bf0..50d860290422cb 100644
--- a/llvm/test/tools/dsymutil/ARM/dummy-debug-map-amr64.map
+++ b/llvm/test/tools/dsymutil/ARM/dummy-debug-map-amr64.map
@@ -14,5 +14,8 @@ objects:
   - filename: 2.o
     symbols:
       - { sym: __Z3foov, objAddr: 0x0, binAddr: 0x20000, size: 0x10 }
+  - filename: 3.o
+    symbols:
+      - { sym: __Z3foov, objAddr: 0x0, binAddr: 0x30000, size: 0x10 }
 ...
 

diff  --git a/llvm/test/tools/dsymutil/ARM/dwarf5-addr_base.test b/llvm/test/tools/dsymutil/ARM/dwarf5-addr_base.test
new file mode 100644
index 00000000000000..fb6382971fa5d3
--- /dev/null
+++ b/llvm/test/tools/dsymutil/ARM/dwarf5-addr_base.test
@@ -0,0 +1,153 @@
+; This test checks to ensure that if three DWARFv5 object files have correct values for the DW_AT_addr_base in their compile units.
+
+; 1.o was produced with the source file:
+
+; a.cpp
+; __attribute__((section("1,__text_foo"))) void foo() {}
+; 
+; int foo2(int a) {
+;     return a+5;
+; }
+; 
+; int foo3(int x) {
+;     return x+2;
+; }
+; 
+; int main () {
+;     return 1;
+; }
+
+; clang -g -c -O1 a.cpp -gdwarf-5 -o 1.o
+
+; 2.o was produced with the following source file:
+
+; b.cpp
+; __attribute__((section("1,__text_foo"))) void bar() {}
+; 
+; int bar2(int a) {
+;     return a+5;
+; }
+; 
+; int bar3(int x) {
+;     return x+2;
+; }
+
+; clang -g -c -O1 b.cpp -gdwarf-5 -o 2.o
+
+; 3.o was produced with the following source file:
+
+; c.cpp
+; 
+; int baz(int x) {
+;     return x+2;
+; }
+
+; clang -g -c -O1 c.cpp -gdwarf-5 -o 3.o
+
+
+RUN: rm -rf %t.dir && mkdir -p %t.dir
+RUN: dsymutil -y %p/dummy-debug-map-amr64.map -oso-prepend-path=%p/../Inputs/DWARF5-addr_base -o %t.dir/dwarf5-addr_base.dSYM
+RUN: llvm-dwarfdump %t.dir/dwarf5-addr_base.dSYM -a --verbose | FileCheck %s
+
+RUN: dsymutil --update -y %p/dummy-debug-map-amr64.map -oso-prepend-path=%p/../Inputs/DWARF5-addr_base -o %t.dir/dwarf5-addr_base.dSYM
+RUN: llvm-dwarfdump %t.dir/dwarf5-addr_base.dSYM -a --verbose | FileCheck %s --check-prefix=UPD
+
+CHECK: .debug_info contents:
+CHECK-NEXT: 0x00000000: Compile Unit: length = 0x00000061, format = DWARF32, version = 0x0005, unit_type = DW_UT_compile, abbr_offset = 0x0000, addr_size = 0x08 (next unit at 0x00000065)
+
+CHECK: 0x0000000c: DW_TAG_compile_unit [1] *
+CHECK:               DW_AT_addr_base [DW_FORM_sec_offset]      (0x00000008)
+
+CHECK: 0x00000037:   DW_TAG_subprogram [2] * (0x0000000c)
+CHECK-NEXT:                DW_AT_low_pc [DW_FORM_addrx]    (indexed (00000000) address = 0x[[ADDR1:[0-9a-f]+]])
+
+
+CHECK: 0x00000065: Compile Unit: length = 0x00000061, format = DWARF32, version = 0x0005, unit_type = DW_UT_compile, abbr_offset = 0x0000, addr_size = 0x08 (next unit at 0x000000ca)
+
+CHECK: 0x00000071: DW_TAG_compile_unit [1] *
+CHECK:              DW_AT_addr_base [DW_FORM_sec_offset]      (0x00000018)
+
+CHECK: 0x0000009c:   DW_TAG_subprogram [2] * (0x00000071)
+CHECK-NEXT:                 DW_AT_low_pc [DW_FORM_addrx]    (indexed (00000000) address = 0x[[ADDR2:[0-9a-f]+]])
+
+CHECK: 0x000000ca: Compile Unit: length = 0x0000005a, format = DWARF32, version = 0x0005, unit_type = DW_UT_compile, abbr_offset = 0x0000, addr_size = 0x08 (next unit at 0x00000128)
+
+CHECK: 0x000000d6: DW_TAG_compile_unit [5] *
+CHECK: DW_AT_addr_base [DW_FORM_sec_offset]      (0x00000028)
+
+CHECK: 0x000000fa:   DW_TAG_subprogram [2] * (0x000000d6)
+CHECK-NEXT:                 DW_AT_low_pc [DW_FORM_addrx]    (indexed (00000000) address = 0x[[ADDR3:[0-9a-f]+]])
+
+CHECK: .debug_addr contents:
+CHECK-NEXT: 0x00000000: Address table header: length = 0x0000000c, format = DWARF32, version = 0x0005, addr_size = 0x08, seg_size = 0x00
+CHECK-NEXT: Addrs: [
+CHECK-NEXT: 0x[[ADDR1]]
+CHECK-NEXT: ]
+CHECK-NEXT: 0x00000010: Address table header: length = 0x0000000c, format = DWARF32, version = 0x0005, addr_size = 0x08, seg_size = 0x00
+CHECK-NEXT: Addrs: [
+CHECK-NEXT: 0x[[ADDR2]]
+CHECK-NEXT: ]
+CHECK-NEXT: 0x00000020: Address table header: length = 0x0000000c, format = DWARF32, version = 0x0005, addr_size = 0x08, seg_size = 0x00
+CHECK-NEXT: Addrs: [
+CHECK-NEXT: 0x[[ADDR3]]
+CHECK-NEXT: ]
+
+UPD: .debug_info contents:
+UPD-NEXT: 0x00000000: Compile Unit: length = 0x000000aa, format = DWARF32, version = 0x0005, unit_type = DW_UT_compile, abbr_offset = 0x0000, addr_size = 0x08 (next unit at 0x000000ae)
+
+UPD: 0x0000000c: DW_TAG_compile_unit [1] *
+UPD:               DW_AT_addr_base [DW_FORM_sec_offset]      (0x00000008)
+
+UPD: 0x0000003c:   DW_TAG_subprogram [2]   (0x0000000c)
+UPD-NEXT:                DW_AT_low_pc [DW_FORM_addrx]    (indexed (00000000) address = 0x0000000000000018)
+
+UPD: 0x0000004e:   DW_TAG_subprogram [3] * (0x0000000c)
+UPD-NEXT:                 DW_AT_low_pc [DW_FORM_addrx]    (indexed (00000001) address = 0x0000000000000000)
+
+UPD: 0x00000071:   DW_TAG_subprogram [3] * (0x0000000c)
+UPD-NEXT:                 DW_AT_low_pc [DW_FORM_addrx]    (indexed (00000002) address = 0x0000000000000008)
+
+UPD: 0x00000094:   DW_TAG_subprogram [5]   (0x0000000c)
+UPD-NEXT:                 DW_AT_low_pc [DW_FORM_addrx]    (indexed (00000003) address = 0x0000000000000010)
+
+
+UPD: 0x000000ae: Compile Unit: length = 0x00000098, format = DWARF32, version = 0x0005, unit_type = DW_UT_compile, abbr_offset = 0x0000, addr_size = 0x08 (next unit at 0x0000014a)
+
+UPD: 0x000000ba: DW_TAG_compile_unit [1] *
+UPD:              DW_AT_addr_base [DW_FORM_sec_offset]      (0x00000008)
+
+UPD: 0x000000ea:   DW_TAG_subprogram [2]   (0x000000ba)
+UPD-NEXT:                 DW_AT_low_pc [DW_FORM_addrx]    (indexed (00000000) address = 0x0000000000000018)
+
+UPD: 0x000000fc:   DW_TAG_subprogram [3] * (0x000000ba)
+UPD-NEXT:                 DW_AT_low_pc [DW_FORM_addrx]    (indexed (00000001) address = 0x0000000000000000)
+
+UPD: 0x0000011f:   DW_TAG_subprogram [3] * (0x000000ba)
+UPD-NEXT:                 DW_AT_low_pc [DW_FORM_addrx]    (indexed (00000002) address = 0x0000000000000008)
+
+UPD: 0x0000014a: Compile Unit: length = 0x0000005b, format = DWARF32, version = 0x0005, unit_type = DW_UT_compile, abbr_offset = 0x0000, addr_size = 0x08 (next unit at 0x000001a9)
+
+UPD: 0x00000156: DW_TAG_compile_unit [7] *
+UPD: DW_AT_addr_base [DW_FORM_sec_offset]      (0x00000008)
+
+UPD: 0x0000017e:   DW_TAG_subprogram [3] * (0x00000156)
+UPD-NEXT:                 DW_AT_low_pc [DW_FORM_addrx]    (indexed (00000000) address = 0x0000000000000018)
+
+UPD: .debug_addr contents:
+UPD-NEXT: 0x00000000: Address table header: length = 0x00000024, format = DWARF32, version = 0x0005, addr_size = 0x08, seg_size = 0x00
+UPD-NEXT: Addrs: [
+UPD-NEXT: 0x0000000000000018
+UPD-NEXT: 0x0000000000000000
+UPD-NEXT: 0x0000000000000008
+UPD-NEXT: 0x0000000000000010
+UPD-NEXT: ]
+UPD-NEXT: 0x00000028: Address table header: length = 0x0000001c, format = DWARF32, version = 0x0005, addr_size = 0x08, seg_size = 0x00
+UPD-NEXT: Addrs: [
+UPD-NEXT: 0x0000000000000010
+UPD-NEXT: 0x0000000000000000
+UPD-NEXT: 0x0000000000000008
+UPD-NEXT: ]
+UPD-NEXT: 0x00000048: Address table header: length = 0x0000000c, format = DWARF32, version = 0x0005, addr_size = 0x08, seg_size = 0x00
+UPD-NEXT: Addrs: [
+UPD-NEXT: 0x0000000000000000
+UPD-NEXT: ]

diff  --git a/llvm/test/tools/dsymutil/ARM/dwarf5-addrx-0x0-last.test b/llvm/test/tools/dsymutil/ARM/dwarf5-addrx-0x0-last.test
index 8769776f474408..0fbadd6e0deb88 100644
--- a/llvm/test/tools/dsymutil/ARM/dwarf5-addrx-0x0-last.test
+++ b/llvm/test/tools/dsymutil/ARM/dwarf5-addrx-0x0-last.test
@@ -31,7 +31,7 @@ RUN: llvm-dwarfdump --verbose -debug-line %t.dSYM | FileCheck %s --check-prefix
 CHECK-NOT: error:
 
 DEBUGINFO:   DW_TAG_subprogram
-DEBUGINFO:     DW_AT_low_pc [DW_FORM_addr]     (0x0000000100003f4c)
+DEBUGINFO:     DW_AT_low_pc [DW_FORM_addrx]      (indexed (00000000) address = 0x0000000100003f4c)
 DEBUGINFO:     DW_AT_high_pc [DW_FORM_data4]   (0x00000054)
 DEBUGINFO:     DW_AT_name [DW_FORM_strp]       ( .debug_str[0x0000011c] = "main")
 

diff  --git a/llvm/test/tools/dsymutil/ARM/dwarf5-dwarf4-combination-macho.test b/llvm/test/tools/dsymutil/ARM/dwarf5-dwarf4-combination-macho.test
index 0efaabce712d11..5a4d8165136468 100644
--- a/llvm/test/tools/dsymutil/ARM/dwarf5-dwarf4-combination-macho.test
+++ b/llvm/test/tools/dsymutil/ARM/dwarf5-dwarf4-combination-macho.test
@@ -39,23 +39,24 @@ CHECK:.debug_abbrev contents:
 CHECK-NEXT: Abbrev table for offset: 0x00000000
 
 CHECK: .debug_info contents:
-CHECK: 0x00000000: Compile Unit: length = 0x00000064, format = DWARF32, version = 0x0005, unit_type = DW_UT_compile, abbr_offset = 0x0000, addr_size = 0x08
+CHECK: 0x00000000: Compile Unit: length = 0x00000061, format = DWARF32, version = 0x0005, unit_type = DW_UT_compile, abbr_offset = 0x0000, addr_size = 0x08 
 CHECK: DW_AT_ranges [DW_FORM_sec_offset] (0x[[RANGELIST_OFFSET:[0-9a-f]+]]
 CHECK-NEXT:                  [0x[[RANGELIST_OFFSET_START:[0-9a-f]+]], 0x[[RANGELIST_OFFSET_END:[0-9a-f]+]]))
-CHECK: 0x00000033:   DW_TAG_subprogram [2] * (0x0000000c)
-CHECK-NEXT:  DW_AT_low_pc [DW_FORM_addr]     (0x[[#%.16x,LOCLIST_LOWPC:]])
-CHECK: 0x00000050:     DW_TAG_formal_parameter [3]   (0x00000033)
+CHECK-NEXT: DW_AT_addr_base [DW_FORM_sec_offset]      (0x00000008)
+CHECK: 0x00000037:   DW_TAG_subprogram [2] * (0x0000000c)
+CHECK-NEXT:  DW_AT_low_pc [DW_FORM_addrx]     (indexed (00000000) address = 0x[[#%.16x,LOCLIST_LOWPC:]])
+CHECK: 0x0000004d:     DW_TAG_formal_parameter [3]   (0x00000037)
 CHECK-NEXT:                   DW_AT_location [DW_FORM_sec_offset]   (0x[[LOCLIST_OFFSET:[0-9a-f]+]]: 
 CHECK-NEXT:                      [0x[[#%.16x,LOCLIST_PAIR_START:]], 0x[[#%.16x,LOCLIST_PAIR_END:]]): [[LOCLIST_EXPR:.*]]
 CHECK-NEXT:                      [0x[[#%.16x,LOCLIST_PAIR_START2:]], 0x[[#%.16x,LOCLIST_PAIR_END2:]]): [[LOCLIST_EXPR2:.*]])
 
-CHECK: 0x00000068: Compile Unit: length = 0x00000072, format = DWARF32, version = 0x0004, abbr_offset = 0x0000, addr_size = 0x08
+CHECK: 0x00000065: Compile Unit: length = 0x00000072, format = DWARF32, version = 0x0004, abbr_offset = 0x0000, addr_size = 0x08 
 CHECK:              DW_AT_low_pc [DW_FORM_addr]       (0x[[#%.16x,RANGE_LOWPC:]])
 CHECK-NEXT:              DW_AT_ranges [DW_FORM_sec_offset] (0x00000000
 CHECK-NEXT:                 [0x[[#%.16x,RANGE_START:]], 0x[[#%.16x,RANGE_END:]]))
-CHECK:0x0000009a:   DW_TAG_subprogram [2] * (0x00000073)
+CHECK: 0x00000097:   DW_TAG_subprogram [6] * (0x00000070)
 CHECK-NEXT:                DW_AT_low_pc [DW_FORM_addr]     (0x[[#%.16x,LOC_LOWPC:]])
-CHECK:0x000000b7:     DW_TAG_formal_parameter [3]   (0x0000009a)
+CHECK: 0x000000b4:     DW_TAG_formal_parameter [3]   (0x00000097)
 CHECK-NEXT:                  DW_AT_location [DW_FORM_sec_offset]   (0x[[LOC_OFFSET:[0-9a-f]+]]: 
 CHECK-NEXT:                     [0x[[#%.16x,LOC_PAIR_START:]], 0x[[#%.16x,LOC_PAIR_END:]]): [[LOC_EXPR:.*]]
 CHECK-NEXT:                     [0x[[#%.16x,LOC_PAIR_START2:]], 0x[[#%.16x,LOC_PAIR_END2:]]): [[LOC_EXPR2:.*]])

diff  --git a/llvm/test/tools/dsymutil/ARM/dwarf5-macho.test b/llvm/test/tools/dsymutil/ARM/dwarf5-macho.test
index e15410d8776667..4d791e72070bde 100644
--- a/llvm/test/tools/dsymutil/ARM/dwarf5-macho.test
+++ b/llvm/test/tools/dsymutil/ARM/dwarf5-macho.test
@@ -25,12 +25,13 @@ CHECK:.debug_abbrev contents:
 CHECK-NEXT: Abbrev table for offset: 0x00000000
 
 CHECK: .debug_info contents:
-CHECK-NEXT: 0x00000000: Compile Unit: length = 0x00000064, format = DWARF32, version = 0x0005, unit_type = DW_UT_compile, abbr_offset = 0x0000, addr_size = 0x08 
+CHECK-NEXT: Compile Unit: length = 0x00000061, format = DWARF32, version = 0x0005, unit_type = DW_UT_compile, abbr_offset = 0x0000, addr_size = 0x08 
 CHECK: DW_AT_ranges [DW_FORM_sec_offset] (0x[[RANGELIST_OFFSET:[0-9a-f]+]]
 CHECK-NEXT:                  [0x[[RANGELIST_OFFSET_START:[0-9a-f]+]], 0x[[RANGELIST_OFFSET_END:[0-9a-f]+]]))
-CHECK: 0x00000033:   DW_TAG_subprogram [2] * (0x0000000c)
-CHECK-NEXT:  DW_AT_low_pc [DW_FORM_addr]     (0x[[#%.16x,LOCLIST_LOWPC:]])
-CHECK: 0x00000050:     DW_TAG_formal_parameter [3]   (0x00000033)
+CHECK-NEXT: DW_AT_addr_base [DW_FORM_sec_offset]      (0x00000008)
+CHECK: 0x00000037:   DW_TAG_subprogram [2] * (0x0000000c)
+CHECK-NEXT:  DW_AT_low_pc [DW_FORM_addrx]     (indexed (00000000) address = 0x[[#%.16x,LOCLIST_LOWPC:]])
+CHECK: 0x0000004d:     DW_TAG_formal_parameter [3]   (0x00000037)
 CHECK-NEXT:                   DW_AT_location [DW_FORM_sec_offset]   (0x[[LOC_OFFSET:[0-9a-f]+]]: 
 CHECK-NEXT:                      [0x[[#%.16x,LOCLIST_PAIR_START:]], 0x[[#%.16x,LOCLIST_PAIR_END:]]): [[LOCLIST_EXPR:.*]]
 CHECK-NEXT:                      [0x[[#%.16x,LOCLIST_PAIR_START2:]], 0x[[#%.16x,LOCLIST_PAIR_END2:]]): [[LOCLIST_EXPR2:.*]])

diff  --git a/llvm/test/tools/dsymutil/Inputs/DWARF5-addr_base/1.o b/llvm/test/tools/dsymutil/Inputs/DWARF5-addr_base/1.o
new file mode 100644
index 00000000000000..d97e7476368da5
Binary files /dev/null and b/llvm/test/tools/dsymutil/Inputs/DWARF5-addr_base/1.o 
diff er

diff  --git a/llvm/test/tools/dsymutil/Inputs/DWARF5-addr_base/2.o b/llvm/test/tools/dsymutil/Inputs/DWARF5-addr_base/2.o
new file mode 100644
index 00000000000000..f9c20e60af8b01
Binary files /dev/null and b/llvm/test/tools/dsymutil/Inputs/DWARF5-addr_base/2.o 
diff er

diff  --git a/llvm/test/tools/dsymutil/Inputs/DWARF5-addr_base/3.o b/llvm/test/tools/dsymutil/Inputs/DWARF5-addr_base/3.o
new file mode 100644
index 00000000000000..a405ef3ecf8a88
Binary files /dev/null and b/llvm/test/tools/dsymutil/Inputs/DWARF5-addr_base/3.o 
diff er

diff  --git a/llvm/test/tools/dsymutil/X86/dwarf5-addrx.test b/llvm/test/tools/dsymutil/X86/dwarf5-addrx.test
index db7802cb6cf110..b9d59fedc61044 100644
--- a/llvm/test/tools/dsymutil/X86/dwarf5-addrx.test
+++ b/llvm/test/tools/dsymutil/X86/dwarf5-addrx.test
@@ -56,45 +56,45 @@ CHECK-NOT: error:
 
 DWARF: DW_TAG_compile_unit
 DWARF:   DW_AT_name [DW_FORM_strp]  {{.*}}     "dwarf5-addrx.c"
-DWARF:   DW_AT_low_pc [DW_FORM_addr]     (0x0000000100000eb0)
+DWARF:   DW_AT_low_pc [DW_FORM_addrx]      (indexed (00000000) address = 0x0000000100000eb0)
 DWARF:   DW_AT_high_pc [DW_FORM_data4]   (0x00000103)
+DWARF:   DW_AT_addr_base [DW_FORM_sec_offset]      (0x00000008)
 DWARF:   DW_TAG_subprogram
-DWARF:     DW_AT_low_pc [DW_FORM_addr]     (0x0000000100000eb0)
+DWARF:     DW_AT_low_pc [DW_FORM_addrx]    (indexed (00000000) address = 0x0000000100000eb0)
 DWARF:     DW_AT_high_pc [DW_FORM_data4]   (0x00000010)
 DWARF:     DW_AT_name  [DW_FORM_strp] {{.*}}   "foo1"
 DWARF:   DW_TAG_subprogram
-DWARF:     DW_AT_low_pc [DW_FORM_addr]     (0x0000000100000ec0)
+DWARF:     DW_AT_low_pc [DW_FORM_addrx]    (indexed (00000001) address = 0x0000000100000ec0)
 DWARF:     DW_AT_high_pc [DW_FORM_data4]   (0x00000010)
 DWARF:     DW_AT_name  [DW_FORM_strp] {{.*}}   "foo2"
 DWARF:   DW_TAG_subprogram
-DWARF:     DW_AT_low_pc [DW_FORM_addr]     (0x0000000100000ed0)
+DWARF:     DW_AT_low_pc [DW_FORM_addrx]    (indexed (00000002) address = 0x0000000100000ed0)
 DWARF:     DW_AT_high_pc [DW_FORM_data4]   (0x00000010)
 DWARF:     DW_AT_name  [DW_FORM_strp] {{.*}}   "foo3"
 DWARF:   DW_TAG_subprogram
-DWARF:     DW_AT_low_pc  [DW_FORM_addr]    (0x0000000100000ee0)
+DWARF:     DW_AT_low_pc [DW_FORM_addrx]    (indexed (00000003) address = 0x0000000100000ee0)
 DWARF:     DW_AT_high_pc [DW_FORM_data4]   (0x00000010)
 DWARF:     DW_AT_name  [DW_FORM_strp] {{.*}}   "foo4"
 DWARF:   DW_TAG_subprogram
-DWARF:     DW_AT_low_pc [DW_FORM_addr]     (0x0000000100000ef0)
+DWARF:     DW_AT_low_pc [DW_FORM_addrx]    (indexed (00000004) address = 0x0000000100000ef0)
 DWARF:     DW_AT_high_pc  [DW_FORM_data4]  (0x00000010)
 DWARF:     DW_AT_name  [DW_FORM_strp] {{.*}}   "foo5"
 DWARF:   DW_TAG_subprogram
-DWARF:     DW_AT_low_pc  [DW_FORM_addr]    (0x0000000100000f00)
+DWARF:     DW_AT_low_pc [DW_FORM_addrx]    (indexed (00000005) address = 0x0000000100000f00)
 DWARF:     DW_AT_high_pc [DW_FORM_data4]   (0x00000010)
 DWARF:     DW_AT_name  [DW_FORM_strp] {{.*}}   "foo6"
 DWARF:   DW_TAG_subprogram
-DWARF:     DW_AT_low_pc  [DW_FORM_addr]    (0x0000000100000f10)
+DWARF:     DW_AT_low_pc [DW_FORM_addrx]    (indexed (00000006) address = 0x0000000100000f10)
 DWARF:     DW_AT_high_pc [DW_FORM_data4]   (0x00000010)
 DWARF:     DW_AT_name  [DW_FORM_strp] {{.*}}   "foo7"
 DWARF:   DW_TAG_subprogram
-DWARF:     DW_AT_low_pc  [DW_FORM_addr]    (0x0000000100000f20)
+DWARF:     DW_AT_low_pc [DW_FORM_addrx]    (indexed (00000007) address = 0x0000000100000f20)
 DWARF:     DW_AT_high_pc [DW_FORM_data4]   (0x00000010)
 DWARF:     DW_AT_name  [DW_FORM_strp] {{.*}}   "foo8"
 DWARF:   DW_TAG_subprogram
-DWARF:     DW_AT_low_pc  [DW_FORM_addr]    (0x0000000100000f30)
+DWARF:     DW_AT_low_pc [DW_FORM_addrx]    (indexed (00000008) address = 0x0000000100000f30)
 DWARF:     DW_AT_high_pc [DW_FORM_data4]   (0x00000083)
 DWARF:     DW_AT_name  [DW_FORM_strp] {{.*}}   "main"
-DWARF-NOT:  .debug_addr contents
 
 UPDATE-DWARF: DW_TAG_compile_unit
 UPDATE-DWARF:   DW_AT_name [DW_FORM_strp]  {{.*}}     "dwarf5-addrx.c"

diff  --git a/llvm/test/tools/dsymutil/X86/dwarf5-dw-op-addrx.test b/llvm/test/tools/dsymutil/X86/dwarf5-dw-op-addrx.test
index 08a12022bfe538..34100145b17de6 100644
--- a/llvm/test/tools/dsymutil/X86/dwarf5-dw-op-addrx.test
+++ b/llvm/test/tools/dsymutil/X86/dwarf5-dw-op-addrx.test
@@ -57,7 +57,6 @@
 #DWARF-CHECK: DW_TAG_variable
 #DWARF-CHECK:   DW_AT_name {{.*}}"arr9"
 #DWARF-CHECK:   DW_AT_location {{.*}}(DW_OP_addr 0x100009000)
-#DWARF-CHECK-NOT: .debug_addr
 
 #UPD-DWARF-CHECK: DW_TAG_compile_unit
 #UPD-DWARF-CHECK: DW_AT_name {{.*}}"dwarf5-dw-op-addrx.c"

diff  --git a/llvm/test/tools/dsymutil/X86/dwarf5-rnglists.test b/llvm/test/tools/dsymutil/X86/dwarf5-rnglists.test
index e38f6c972b18e5..4c556eb94cf01c 100644
--- a/llvm/test/tools/dsymutil/X86/dwarf5-rnglists.test
+++ b/llvm/test/tools/dsymutil/X86/dwarf5-rnglists.test
@@ -40,20 +40,20 @@
 #CHECK: No errors.
 
 #DWARF-CHECK: DW_TAG_compile_unit
+#DWARF-CHECK:   DW_AT_addr_base [DW_FORM_sec_offset]      (0x00000008)
 #DWARF-CHECK: DW_TAG_lexical_block
 #DWARF-CHECK:   DW_AT_ranges [DW_FORM_sec_offset]     (0x0000000c
 #DWARF-CHECK:      [0x0000000100000f79, 0x0000000100000f96)
 #DWARF-CHECK:      [0x0000000100000fad, 0x0000000100000fb4))
-#DWARF-CHECK-NOT: debug_addr
 #DWARF-CHECK: .debug_rnglists contents:
 #DWARF-CHECK: 0x00000000: range list header: length = 0x0000001d, format = DWARF32, version = 0x0005, addr_size = 0x08, seg_size = 0x00, offset_entry_count = 0x00000000
 #DWARF-CHECK: ranges:
 #DWARF-CHECK: 0x0000000c: [DW_RLE_start_length]:  0x0000000100000f79, 0x000000000000001d => [0x0000000100000f79, 0x0000000100000f96)
 #DWARF-CHECK: 0x00000016: [DW_RLE_start_length]:  0x0000000100000fad, 0x0000000000000007 => [0x0000000100000fad, 0x0000000100000fb4)
 #DWARF-CHECK: 0x00000020: [DW_RLE_end_of_list ]
-#DWARF-CHECK-NOT: debug_addr
 #
 #UPD-DWARF-CHECK: DW_TAG_compile_unit
+#UPD-DWARF-CHECK:   DW_AT_addr_base [DW_FORM_sec_offset]      (0x00000008)
 #UPD-DWARF-CHECK: DW_TAG_lexical_block
 #UPD-DWARF-CHECK:   DW_AT_ranges [DW_FORM_rnglistx]       (indexed (0x0) rangelist = 0x00000010
 #UPD-DWARF-CHECK:     [0x0000000000000009, 0x0000000000000026)

diff  --git a/llvm/test/tools/dsymutil/X86/op-convert-offset.test b/llvm/test/tools/dsymutil/X86/op-convert-offset.test
index 8cf378c114a39b..b1dbba6b2f6dcf 100644
--- a/llvm/test/tools/dsymutil/X86/op-convert-offset.test
+++ b/llvm/test/tools/dsymutil/X86/op-convert-offset.test
@@ -34,12 +34,12 @@ OBJ:                   DW_AT_location        (DW_OP_breg2 RCX+0, DW_OP_constu 0x
 OBJ:                   DW_AT_name    ("b")
 OBJ:                   DW_AT_type    (0x000000af "_Bool")
 
-DSYM: 0x000000ae:   DW_TAG_base_type
+DSYM: 0x0000009a:   DW_TAG_base_type
 DSYM:                 DW_AT_name      ("DW_ATE_unsigned_1")
 DSYM:                 DW_AT_encoding  (DW_ATE_unsigned)
 DSYM:                 DW_AT_byte_size (0x01)
 
-DSYM: 0x000000d5:     DW_TAG_formal_parameter
-DSYM:                   DW_AT_location        (DW_OP_breg2 RCX+0, DW_OP_constu 0xff, DW_OP_and, DW_OP_convert (0x000000ae) "DW_ATE_unsigned_1", DW_OP_convert (0x000000b5) "DW_ATE_unsigned_8", DW_OP_stack_value)
+DSYM: 0x000000ba:     DW_TAG_formal_parameter
+DSYM:                   DW_AT_location        (DW_OP_breg2 RCX+0, DW_OP_constu 0xff, DW_OP_and, DW_OP_convert (0x0000009a) "DW_ATE_unsigned_1", DW_OP_convert (0x000000a1) "DW_ATE_unsigned_8", DW_OP_stack_value)
 DSYM:                   DW_AT_name    ("b")
-DSYM:                   DW_AT_type    (0x000000f3 "_Bool")
+DSYM:                   DW_AT_type    (0x000000d8 "_Bool")

diff  --git a/llvm/test/tools/llvm-dwarfutil/ELF/X86/dwarf5-addresses.test b/llvm/test/tools/llvm-dwarfutil/ELF/X86/dwarf5-addresses.test
index 3a3bf54c61d7da..642de902a9ccf0 100644
--- a/llvm/test/tools/llvm-dwarfutil/ELF/X86/dwarf5-addresses.test
+++ b/llvm/test/tools/llvm-dwarfutil/ELF/X86/dwarf5-addresses.test
@@ -25,31 +25,31 @@
 
 #DWARF-CHECK: DW_TAG_compile_unit
 #DWARF-CHECK:   DW_AT_name [DW_FORM_strp]  {{.*}}     "CU1"
-#DWARF-CHECK:   DW_AT_low_pc [DW_FORM_addr]     (0x0000000000001130)
+#DWARF-CHECK:   DW_AT_low_pc [DW_FORM_addrx]      (indexed (00000000) address = 0x0000000000001130)
 #DWARF-CHECK:   DW_AT_high_pc [DW_FORM_data8]   (0x0000000000000060)
 #DWARF-CHECK:   DW_TAG_subprogram
 #DWARF-CHECK:     DW_AT_name  [DW_FORM_strp] {{.*}}   "foo1"
-#DWARF-CHECK:     DW_AT_low_pc [DW_FORM_addr]     (0x0000000000001130)
+#DWARF-CHECK:     DW_AT_low_pc [DW_FORM_addrx]    (indexed (00000000) address = 0x0000000000001130)
 #DWARF-CHECK:     DW_AT_high_pc [DW_FORM_data8]   (0x0000000000000010)
 #DWARF-CHECK:   DW_TAG_subprogram
 #DWARF-CHECK:     DW_AT_name  [DW_FORM_strp] {{.*}}   "foo2"
-#DWARF-CHECK:     DW_AT_low_pc [DW_FORM_addr]     (0x0000000000001140)
+#DWARF-CHECK:     DW_AT_low_pc [DW_FORM_addrx]    (indexed (00000001) address = 0x0000000000001140)
 #DWARF-CHECK:     DW_AT_high_pc [DW_FORM_data8]   (0x0000000000000010)
 #DWARF-CHECK:   DW_TAG_subprogram
 #DWARF-CHECK:     DW_AT_name  [DW_FORM_strp] {{.*}}   "foo3"
-#DWARF-CHECK:     DW_AT_low_pc [DW_FORM_addr]     (0x0000000000001150)
+#DWARF-CHECK:     DW_AT_low_pc [DW_FORM_addrx]    (indexed (00000002) address = 0x0000000000001150)
 #DWARF-CHECK:     DW_AT_high_pc [DW_FORM_data8]   (0x0000000000000010)
 #DWARF-CHECK:   DW_TAG_subprogram
 #DWARF-CHECK:     DW_AT_name  [DW_FORM_strp] {{.*}}   "foo4"
-#DWARF-CHECK:     DW_AT_low_pc [DW_FORM_addr]     (0x0000000000001160)
+#DWARF-CHECK:     DW_AT_low_pc [DW_FORM_addrx]   (indexed (00000003) address = 0x0000000000001160)
 #DWARF-CHECK:     DW_AT_high_pc [DW_FORM_data8]   (0x0000000000000010)
 #DWARF-CHECK:   DW_TAG_subprogram
 #DWARF-CHECK:     DW_AT_name  [DW_FORM_strp] {{.*}}   "foo5"
-#DWARF-CHECK:     DW_AT_low_pc [DW_FORM_addr]     (0x0000000000001170)
+#DWARF-CHECK:     DW_AT_low_pc [DW_FORM_addrx]   (indexed (00000004) address = 0x0000000000001170)
 #DWARF-CHECK:     DW_AT_high_pc [DW_FORM_data8]   (0x0000000000000010)
 #DWARF-CHECK:   DW_TAG_subprogram
 #DWARF-CHECK:     DW_AT_name  [DW_FORM_strp] {{.*}}   "foo6"
-#DWARF-CHECK:     DW_AT_low_pc [DW_FORM_addr]     (0x0000000000001180)
+#DWARF-CHECK:     DW_AT_low_pc [DW_FORM_addrx]   (indexed (00000005) address = 0x0000000000001180)
 #DWARF-CHECK:     DW_AT_high_pc [DW_FORM_data8]   (0x0000000000000010)
 #DWARF-CHECK:   DW_TAG_variable
 #DWARF-CHECK:     DW_AT_name  [DW_FORM_strp] {{.*}}   "var1"

diff  --git a/llvm/test/tools/llvm-dwarfutil/ELF/X86/dwarf5-rnglists.test b/llvm/test/tools/llvm-dwarfutil/ELF/X86/dwarf5-rnglists.test
index c7f4331dd9e6df..0b6d1304e4895a 100644
--- a/llvm/test/tools/llvm-dwarfutil/ELF/X86/dwarf5-rnglists.test
+++ b/llvm/test/tools/llvm-dwarfutil/ELF/X86/dwarf5-rnglists.test
@@ -20,42 +20,48 @@
 
 #DWARF-CHECK: DW_TAG_compile_unit
 #DWARF-CHECK:   DW_AT_name [DW_FORM_strp]  {{.*}}     "CU1"
-#DWARF-CHECK:   DW_AT_low_pc [DW_FORM_addr]  (0x0000000000001130) 
+#DWARF-CHECK:   DW_AT_low_pc [DW_FORM_addrx]      (indexed (00000000) address = 0x0000000000001130)
 #DWARF-CHECK:   DW_AT_ranges [DW_FORM_sec_offset] (0x[[CURANGE_OFF:[0-9a-f]*]]
 #DWARF-CHECK:   [0x0000000000001130, 0x0000000000001170))
 #DWARF-CHECK:   DW_TAG_subprogram
 #DWARF-CHECK:     DW_AT_name  [DW_FORM_strp] {{.*}}   "foo1"
-#DWARF-CHECK:     DW_AT_low_pc [DW_FORM_addr]     (0x0000000000001130)
+#DWARF-CHECK:     DW_AT_low_pc [DW_FORM_addrx]    (indexed (00000000) address = 0x0000000000001130)
 #DWARF-CHECK:     DW_AT_high_pc [DW_FORM_data8]   (0x0000000000000010)
 #DWARF-CHECK:     DW_TAG_lexical_block
 #DWARF-CHECK:       DW_AT_ranges [DW_FORM_sec_offset]     (0x[[F1RANGE_OFF:[0-9a-f]*]]
 #DWARF-CHECK:       [0x0000000000001130, 0x0000000000001140))
 #DWARF-CHECK:   DW_TAG_subprogram
 #DWARF-CHECK:     DW_AT_name  [DW_FORM_strp] {{.*}}   "foo2"
-#DWARF-CHECK:     DW_AT_low_pc [DW_FORM_addr]     (0x0000000000001140)
+#DWARF-CHECK:     DW_AT_low_pc [DW_FORM_addrx]    (indexed (00000001) address = 0x0000000000001140)
 #DWARF-CHECK:     DW_AT_high_pc [DW_FORM_data8]   (0x0000000000000010)
 #DWARF-CHECK:     DW_TAG_lexical_block
 #DWARF-CHECK:       DW_AT_ranges [DW_FORM_sec_offset]     (0x[[F2RANGE_OFF:[0-9a-f]*]]
 #DWARF-CHECK:            [0x0000000000001140, 0x0000000000001150))
 #DWARF-CHECK:   DW_TAG_subprogram
 #DWARF-CHECK:     DW_AT_name  [DW_FORM_strp] {{.*}}   "foo3"
-#DWARF-CHECK:     DW_AT_low_pc [DW_FORM_addr]     (0x0000000000001150)
+#DWARF-CHECK:     DW_AT_low_pc [DW_FORM_addrx]    (indexed (00000002) address = 0x0000000000001150)
 #DWARF-CHECK:     DW_AT_high_pc [DW_FORM_data8]   (0x0000000000000010)
 #DWARF-CHECK:     DW_TAG_lexical_block
 #DWARF-CHECK:       DW_AT_ranges [DW_FORM_sec_offset]     (0x[[F3RANGE_OFF:[0-9a-f]*]]
 #DWARF-CHECK:          [0x0000000000001150, 0x0000000000001160))
 #DWARF-CHECK:   DW_TAG_subprogram
 #DWARF-CHECK:     DW_AT_name  [DW_FORM_strp] {{.*}}   "foo4"
-#DWARF-CHECK:     DW_AT_low_pc [DW_FORM_addr]     (0x0000000000001160)
+#DWARF-CHECK:     DW_AT_low_pc [DW_FORM_addrx]    (indexed (00000003) address = 0x0000000000001160)
 #DWARF-CHECK:     DW_AT_high_pc [DW_FORM_data8]   (0x0000000000000010)
 #DWARF-CHECK:     DW_TAG_lexical_block
 #DWARF-CHECK:       DW_AT_ranges [DW_FORM_sec_offset]     (0x[[F4RANGE_OFF:[0-9a-f]*]]
 #DWARF-CHECK:          [0x0000000000001160, 0x0000000000001170))
-#DWARF-CHECK-NOT: .debug_addr contents:
 #DWARF-CHECK: .debug_aranges contents:
 #DWARF-CHECK: Address Range Header: length = 0x0000002c, format = DWARF32, version = 0x0002, cu_offset = 0x00000000, addr_size = 0x08, seg_size = 0x00
 #DWARF-CHECK: [0x0000000000001130, 0x0000000000001170)
-#DWARF-CHECK-NOT: .debug_addr contents:
+#DWARF-CHECK: .debug_addr contents:
+#DWARF-CHECK: 0x00000000: Address table header: length = 0x00000024, format = DWARF32, version = 0x0005, addr_size = 0x08, seg_size = 0x00
+#DWARF-CHECK: Addrs: [
+#DWARF-CHECK: 0x0000000000001130
+#DWARF-CHECK: 0x0000000000001140
+#DWARF-CHECK: 0x0000000000001150
+#DWARF-CHECK: 0x0000000000001160
+#DWARF-CHECK: ]
 #DWARF-CHECK: .debug_rnglists contents:
 #DWARF-CHECK: 0x00000000: range list header: length = 0x0000003f, format = DWARF32, version = 0x0005, addr_size = 0x08, seg_size = 0x00, offset_entry_count = 0x00000000
 #DWARF-CHECK: ranges:
@@ -69,7 +75,6 @@
 #DWARF-CHECK: {{.*}} [DW_RLE_end_of_list ]
 #DWARF-CHECK: 0x[[CURANGE_OFF]]: [DW_RLE_start_length]:  0x0000000000001130, 0x0000000000000040 => [0x0000000000001130, 0x0000000000001170)
 #DWARF-CHECK: {{.*}} [DW_RLE_end_of_list ]
-#DWARF-CHECK-NOT: .debug_addr contents:
 
 #UPD-DWARF-CHECK: DW_TAG_compile_unit
 #UPD-DWARF-CHECK:   DW_AT_name {{.*}}"CU1"


        


More information about the llvm-commits mailing list