[llvm] 9f71a6b - [DWARFLinker] Preserve DWARF discriminators while linking (#96124)

via llvm-commits llvm-commits at lists.llvm.org
Thu Jun 20 22:41:20 PDT 2024


Author: David Tellenbach
Date: 2024-06-20T22:41:17-07:00
New Revision: 9f71a6bb83881e2f19b543540d93b60370d52b3c

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

LOG: [DWARFLinker] Preserve DWARF discriminators while linking (#96124)

DWARF-4 introduced DWARF discriminators but both, the classic and the
parallel DWARF linkers discarded them so far.

After applying this patch dsymutil, which uses the DWARF linkers,
correctly preserves discriminator information.

Added: 
    llvm/test/tools/dsymutil/Inputs/discriminator.arm64.dylib
    llvm/test/tools/dsymutil/Inputs/discriminator.arm64.o
    llvm/test/tools/dsymutil/discriminator.test

Modified: 
    llvm/lib/DWARFLinker/Classic/DWARFStreamer.cpp
    llvm/lib/DWARFLinker/Parallel/DebugLineSectionEmitter.h

Removed: 
    


################################################################################
diff  --git a/llvm/lib/DWARFLinker/Classic/DWARFStreamer.cpp b/llvm/lib/DWARFLinker/Classic/DWARFStreamer.cpp
index 8b31b5ead29ad..cc4ee2a1b4aec 100644
--- a/llvm/lib/DWARFLinker/Classic/DWARFStreamer.cpp
+++ b/llvm/lib/DWARFLinker/Classic/DWARFStreamer.cpp
@@ -1060,6 +1060,7 @@ void DwarfStreamer::emitLineTableRows(
   unsigned FileNum = 1;
   unsigned LastLine = 1;
   unsigned Column = 0;
+  unsigned Discriminator = 0;
   unsigned IsStatement = 1;
   unsigned Isa = 0;
   uint64_t Address = -1ULL;
@@ -1098,9 +1099,17 @@ void DwarfStreamer::emitLineTableRows(
       MS->emitULEB128IntValue(Column);
       LineSectionSize += 1 + getULEB128Size(Column);
     }
-
-    // FIXME: We should handle the discriminator here, but dsymutil doesn't
-    // consider it, thus ignore it for now.
+    if (Discriminator != Row.Discriminator &&
+        MS->getContext().getDwarfVersion() >= 4) {
+      Discriminator = Row.Discriminator;
+      unsigned Size = getULEB128Size(Discriminator);
+      MS->emitIntValue(dwarf::DW_LNS_extended_op, 1);
+      MS->emitULEB128IntValue(Size + 1);
+      MS->emitIntValue(dwarf::DW_LNE_set_discriminator, 1);
+      MS->emitULEB128IntValue(Discriminator);
+      LineSectionSize += /* extended op */ 1 + getULEB128Size(Size + 1) +
+                         /* discriminator */ 1 + Size;
+    }
 
     if (Isa != Row.Isa) {
       Isa = Row.Isa;
@@ -1156,7 +1165,7 @@ void DwarfStreamer::emitLineTableRows(
       EncodingBuffer.resize(0);
       Address = -1ULL;
       LastLine = FileNum = IsStatement = 1;
-      RowsSinceLastSequence = Column = Isa = 0;
+      RowsSinceLastSequence = Column = Discriminator = Isa = 0;
     }
   }
 

diff  --git a/llvm/lib/DWARFLinker/Parallel/DebugLineSectionEmitter.h b/llvm/lib/DWARFLinker/Parallel/DebugLineSectionEmitter.h
index 1839164dcec17..0c4395589248a 100644
--- a/llvm/lib/DWARFLinker/Parallel/DebugLineSectionEmitter.h
+++ b/llvm/lib/DWARFLinker/Parallel/DebugLineSectionEmitter.h
@@ -315,6 +315,7 @@ class DebugLineSectionEmitter {
     unsigned FileNum = 1;
     unsigned LastLine = 1;
     unsigned Column = 0;
+    unsigned Discriminator = 0;
     unsigned IsStatement = 1;
     unsigned Isa = 0;
     uint64_t Address = -1ULL;
@@ -350,9 +351,14 @@ class DebugLineSectionEmitter {
         Section.emitIntVal(dwarf::DW_LNS_set_column, 1);
         encodeULEB128(Column, Section.OS);
       }
-
-      // FIXME: We should handle the discriminator here, but dsymutil doesn't
-      // consider it, thus ignore it for now.
+      if (Discriminator != Row.Discriminator && MC->getDwarfVersion() >= 4) {
+        Discriminator = Row.Discriminator;
+        unsigned Size = getULEB128Size(Discriminator);
+        Section.emitIntVal(dwarf::DW_LNS_extended_op, 1);
+        encodeULEB128(Size + 1, Section.OS);
+        Section.emitIntVal(dwarf::DW_LNE_set_discriminator, 1);
+        encodeULEB128(Discriminator, Section.OS);
+      }
 
       if (Isa != Row.Isa) {
         Isa = Row.Isa;
@@ -397,7 +403,7 @@ class DebugLineSectionEmitter {
         EncodingBuffer.resize(0);
         Address = -1ULL;
         LastLine = FileNum = IsStatement = 1;
-        RowsSinceLastSequence = Column = Isa = 0;
+        RowsSinceLastSequence = Column = Discriminator = Isa = 0;
       }
     }
 

diff  --git a/llvm/test/tools/dsymutil/Inputs/discriminator.arm64.dylib b/llvm/test/tools/dsymutil/Inputs/discriminator.arm64.dylib
new file mode 100755
index 0000000000000..94890e532f82e
Binary files /dev/null and b/llvm/test/tools/dsymutil/Inputs/discriminator.arm64.dylib 
diff er

diff  --git a/llvm/test/tools/dsymutil/Inputs/discriminator.arm64.o b/llvm/test/tools/dsymutil/Inputs/discriminator.arm64.o
new file mode 100644
index 0000000000000..f50971ae58ffa
Binary files /dev/null and b/llvm/test/tools/dsymutil/Inputs/discriminator.arm64.o 
diff er

diff  --git a/llvm/test/tools/dsymutil/discriminator.test b/llvm/test/tools/dsymutil/discriminator.test
new file mode 100644
index 0000000000000..6a3c91e641ef0
--- /dev/null
+++ b/llvm/test/tools/dsymutil/discriminator.test
@@ -0,0 +1,23 @@
+; The input at Inputs/discriminator.arm64.dylib[.o] produced by compiling
+;
+;   int foo(int i, int a, int b) {
+;     return i ? a : a * b;
+;   }
+;
+; with -g -fdebug-info-for-profiling -O2.
+
+RUN: dsymutil --flat --linker=classic -oso-prepend-path %p -o - \
+RUN:  --oso-prepend-path %p/Inputs --verify-dwarf=none \
+RUN:  %p/Inputs/discriminator.arm64.dylib | llvm-dwarfdump -debug-line - \
+RUN:  | FileCheck %s
+
+RUN: dsymutil --flat --linker=parallel -oso-prepend-path %p -o - \
+RUN:  --oso-prepend-path %p/Inputs --verify-dwarf=none \
+RUN:  %p/Inputs/discriminator.arm64.dylib | llvm-dwarfdump -debug-line - \
+RUN:  | FileCheck %s
+
+CHECK:          Address            Line   Column File   ISA Discriminator OpIndex Flags
+CHECK-NEXT:     ------------------ ------ ------ ------ --- ------------- ------- -------------
+CHECK-NEXT:     0x0000000000003f98      2     10      0   0             0       0  is_stmt prologue_end
+CHECK-NEXT:     0x0000000000003fa4      2      3      0   0             6       0
+CHECK-NEXT:     0x0000000000003fa8      2      3      0   0             0       0  end_sequence
\ No newline at end of file


        


More information about the llvm-commits mailing list