[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