[lld] [LLD][COFF] Add /nodbgdirmerge to control debug directory section (PR #159235)
via llvm-commits
llvm-commits at lists.llvm.org
Wed Sep 17 02:06:07 PDT 2025
https://github.com/kkent030315 updated https://github.com/llvm/llvm-project/pull/159235
>From 080d7fe0ea147e803791dbcbf9c25ba8fd4bb403 Mon Sep 17 00:00:00 2001
From: kkent030315 <hrn832 at protonmail.com>
Date: Wed, 17 Sep 2025 12:14:47 +0900
Subject: [PATCH 1/4] [LLD][COFF] Add /nodbgdirmerge to control debug directory
section
Co-Authored-By: namazso <admin at namazso.eu>
---
lld/COFF/Config.h | 1 +
lld/COFF/Driver.cpp | 3 +++
lld/COFF/Options.td | 2 ++
lld/COFF/Writer.cpp | 10 +++++++++-
lld/test/COFF/nodbgdirmerge.test | 28 ++++++++++++++++++++++++++++
5 files changed, 43 insertions(+), 1 deletion(-)
create mode 100644 lld/test/COFF/nodbgdirmerge.test
diff --git a/lld/COFF/Config.h b/lld/COFF/Config.h
index a71476adcc493..76b7c1f61cd25 100644
--- a/lld/COFF/Config.h
+++ b/lld/COFF/Config.h
@@ -322,6 +322,7 @@ struct Configuration {
bool largeAddressAware = false;
bool highEntropyVA = false;
bool appContainer = false;
+ bool mergeDebugDirectory = true;
bool mingw = false;
bool warnMissingOrderSymbol = true;
bool warnLocallyDefinedImported = true;
diff --git a/lld/COFF/Driver.cpp b/lld/COFF/Driver.cpp
index acba156ce341d..4ed587bb7327d 100644
--- a/lld/COFF/Driver.cpp
+++ b/lld/COFF/Driver.cpp
@@ -2338,6 +2338,9 @@ void LinkerDriver::linkerMain(ArrayRef<const char *> argsArr) {
config->is64() &&
args.hasFlag(OPT_highentropyva, OPT_highentropyva_no, true);
+ // Handle /nodbgdirmerge
+ config->mergeDebugDirectory = args.hasArg(OPT_nodbgdirmerge);
+
if (!config->dynamicBase &&
(config->machine == ARMNT || isAnyArm64(config->machine)))
Err(ctx) << "/dynamicbase:no is not compatible with "
diff --git a/lld/COFF/Options.td b/lld/COFF/Options.td
index b5334de87b6a7..485db5a8b21c1 100644
--- a/lld/COFF/Options.td
+++ b/lld/COFF/Options.td
@@ -90,6 +90,8 @@ def machine : P<"machine", "Specify target platform">;
def merge : P<"merge", "Combine sections">;
def mllvm : P<"mllvm", "Options to pass to LLVM">;
def nodefaultlib : P<"nodefaultlib", "Remove a default library">;
+def nodbgdirmerge : F<"nodbgdirmerge">,
+ HelpText<"Emit the debug directory in a separate section">;
def opt : P<"opt", "Control optimizations">;
def order : P<"order", "Put functions in order">;
def out : P<"out", "Path to file to write output">;
diff --git a/lld/COFF/Writer.cpp b/lld/COFF/Writer.cpp
index e0d0ac18ea5d5..274c6e613769e 100644
--- a/lld/COFF/Writer.cpp
+++ b/lld/COFF/Writer.cpp
@@ -324,6 +324,7 @@ class Writer {
OutputSection *bssSec;
OutputSection *rdataSec;
OutputSection *buildidSec;
+ OutputSection *cvinfoSec;
OutputSection *dataSec;
OutputSection *pdataSec;
OutputSection *idataSec;
@@ -1092,6 +1093,7 @@ void Writer::createSections() {
bssSec = createSection(".bss", bss | r | w);
rdataSec = createSection(".rdata", data | r);
buildidSec = createSection(".buildid", data | r);
+ cvinfoSec = createSection(".cvinfo", data | r);
dataSec = createSection(".data", data | r | w);
pdataSec = createSection(".pdata", data | r);
idataSec = createSection(".idata", data | r);
@@ -1228,7 +1230,13 @@ void Writer::createMiscChunks() {
});
// Create Debug Information Chunks
- debugInfoSec = config->mingw ? buildidSec : rdataSec;
+ if (config->mingw) {
+ debugInfoSec = buildidSec;
+ } else if (config->mergeDebugDirectory) {
+ debugInfoSec = cvinfoSec;
+ } else {
+ debugInfoSec = rdataSec;
+ }
if (config->buildIDHash != BuildIDHash::None || config->debug ||
config->repro || config->cetCompat || config->cetCompatStrict ||
config->cetCompatIpValidationRelaxed ||
diff --git a/lld/test/COFF/nodbgdirmerge.test b/lld/test/COFF/nodbgdirmerge.test
new file mode 100644
index 0000000000000..f36c8dfed3e84
--- /dev/null
+++ b/lld/test/COFF/nodbgdirmerge.test
@@ -0,0 +1,28 @@
+RUN: yaml2obj %p/Inputs/pdb1.yaml -o %t1.obj
+RUN: yaml2obj %p/Inputs/pdb2.yaml -o %t2.obj
+RUN: rm -f %t.dll %t.pdb
+
+## Check that it emits the debug directory in .build section when
+## /nodbgdirmerge is specified
+RUN: lld-link /debug /pdb:%t.pdb /pdbaltpath:test.pdb /dll /out:%t.dll \
+RUN: /entry:main /nodefaultlib /nodbgdirmerge %t1.obj %t2.obj
+RUN: llvm-readobj --sections %t.dll | FileCheck -check-prefix=CHECKNOTMERGED %s
+
+CHECKNOTMERGED: Section {
+CHECKNOTMERGED: Number: 3
+CHECKNOTMERGED: Name: .cvinfo
+CHECKNOTMERGED: Characteristics [ (0x40000040)
+CHECKNOTMERGED: IMAGE_SCN_CNT_INITIALIZED_DATA (0x40)
+CHECKNOTMERGED: IMAGE_SCN_MEM_READ (0x40000000)
+CHECKNOTMERGED: ]
+CHECKNOTMERGED: }
+
+## Check that it triggers merge on when /nodbgdirmerge is not specified
+RUN: lld-link /debug /pdb:%t.pdb /pdbaltpath:test.pdb /dll /out:%t.dll \
+RUN: /entry:main /nodefaultlib %t1.obj %t2.obj
+RUN: llvm-readobj --sections %t.dll | FileCheck -check-prefix=CHECKMERGED %s
+
+CHECKMERGED: Section {
+CHECKMERGED: Number: 3
+CHECKMERGED-NOT: Name: .cvinfo
+CHECKMERGED: }
>From 6e50b67d64c0a6cc2d05ede66a01795cafb3f686 Mon Sep 17 00:00:00 2001
From: kkent030315 <hrn832 at protonmail.com>
Date: Wed, 17 Sep 2025 13:23:11 +0900
Subject: [PATCH 2/4] fix typo
---
lld/test/COFF/nodbgdirmerge.test | 2 +-
1 file changed, 1 insertion(+), 1 deletion(-)
diff --git a/lld/test/COFF/nodbgdirmerge.test b/lld/test/COFF/nodbgdirmerge.test
index f36c8dfed3e84..f102b7726b81e 100644
--- a/lld/test/COFF/nodbgdirmerge.test
+++ b/lld/test/COFF/nodbgdirmerge.test
@@ -2,7 +2,7 @@ RUN: yaml2obj %p/Inputs/pdb1.yaml -o %t1.obj
RUN: yaml2obj %p/Inputs/pdb2.yaml -o %t2.obj
RUN: rm -f %t.dll %t.pdb
-## Check that it emits the debug directory in .build section when
+## Check that it emits the debug directory in .cvinfo section when
## /nodbgdirmerge is specified
RUN: lld-link /debug /pdb:%t.pdb /pdbaltpath:test.pdb /dll /out:%t.dll \
RUN: /entry:main /nodefaultlib /nodbgdirmerge %t1.obj %t2.obj
>From 64442af2a7a91a67ad331573aa26c884d37b9dc8 Mon Sep 17 00:00:00 2001
From: kkent030315 <hrn832 at protonmail.com>
Date: Wed, 17 Sep 2025 17:40:14 +0900
Subject: [PATCH 3/4] fix inverted eval
---
lld/COFF/Driver.cpp | 2 +-
lld/COFF/Writer.cpp | 2 +-
2 files changed, 2 insertions(+), 2 deletions(-)
diff --git a/lld/COFF/Driver.cpp b/lld/COFF/Driver.cpp
index 4ed587bb7327d..948dd7a96c7a5 100644
--- a/lld/COFF/Driver.cpp
+++ b/lld/COFF/Driver.cpp
@@ -2339,7 +2339,7 @@ void LinkerDriver::linkerMain(ArrayRef<const char *> argsArr) {
args.hasFlag(OPT_highentropyva, OPT_highentropyva_no, true);
// Handle /nodbgdirmerge
- config->mergeDebugDirectory = args.hasArg(OPT_nodbgdirmerge);
+ config->mergeDebugDirectory = !args.hasArg(OPT_nodbgdirmerge);
if (!config->dynamicBase &&
(config->machine == ARMNT || isAnyArm64(config->machine)))
diff --git a/lld/COFF/Writer.cpp b/lld/COFF/Writer.cpp
index 274c6e613769e..b4f00996319b1 100644
--- a/lld/COFF/Writer.cpp
+++ b/lld/COFF/Writer.cpp
@@ -1232,7 +1232,7 @@ void Writer::createMiscChunks() {
// Create Debug Information Chunks
if (config->mingw) {
debugInfoSec = buildidSec;
- } else if (config->mergeDebugDirectory) {
+ } else if (!config->mergeDebugDirectory) {
debugInfoSec = cvinfoSec;
} else {
debugInfoSec = rdataSec;
>From 258eec2c6064d6e2fece33b3cfcbf77c6b1e5424 Mon Sep 17 00:00:00 2001
From: kkent030315 <hrn832 at protonmail.com>
Date: Wed, 17 Sep 2025 18:06:20 +0900
Subject: [PATCH 4/4] fix tests
---
lld/test/COFF/nodbgdirmerge.test | 23 ++++++++++++++---------
1 file changed, 14 insertions(+), 9 deletions(-)
diff --git a/lld/test/COFF/nodbgdirmerge.test b/lld/test/COFF/nodbgdirmerge.test
index f102b7726b81e..1ad697402a6a2 100644
--- a/lld/test/COFF/nodbgdirmerge.test
+++ b/lld/test/COFF/nodbgdirmerge.test
@@ -10,19 +10,24 @@ RUN: llvm-readobj --sections %t.dll | FileCheck -check-prefix=CHECKNOTMERGED %s
CHECKNOTMERGED: Section {
CHECKNOTMERGED: Number: 3
-CHECKNOTMERGED: Name: .cvinfo
-CHECKNOTMERGED: Characteristics [ (0x40000040)
-CHECKNOTMERGED: IMAGE_SCN_CNT_INITIALIZED_DATA (0x40)
-CHECKNOTMERGED: IMAGE_SCN_MEM_READ (0x40000000)
-CHECKNOTMERGED: ]
-CHECKNOTMERGED: }
+CHECKNOTMERGED-NEXT: Name: .cvinfo
+CHECKNOTMERGED-NEXT: VirtualSize: 0x3D
+CHECKNOTMERGED-NEXT: VirtualAddress: 0x3000
+CHECKNOTMERGED-NEXT: RawDataSize: 512
+CHECKNOTMERGED-NEXT: PointerToRawData: 0x800
+CHECKNOTMERGED-NEXT: PointerToRelocations: 0
+CHECKNOTMERGED-NEXT: PointerToLineNumbers: 0
+CHECKNOTMERGED-NEXT: RelocationCount: 0
+CHECKNOTMERGED-NEXT: LineNumberCount: 0
+CHECKNOTMERGED-NEXT: Characteristics [ (0x40000040)
+CHECKNOTMERGED-NEXT: IMAGE_SCN_CNT_INITIALIZED_DATA (0x40)
+CHECKNOTMERGED-NEXT: IMAGE_SCN_MEM_READ (0x40000000)
+CHECKNOTMERGED-NEXT: ]
+CHECKNOTMERGED-NEXT: }
## Check that it triggers merge on when /nodbgdirmerge is not specified
RUN: lld-link /debug /pdb:%t.pdb /pdbaltpath:test.pdb /dll /out:%t.dll \
RUN: /entry:main /nodefaultlib %t1.obj %t2.obj
RUN: llvm-readobj --sections %t.dll | FileCheck -check-prefix=CHECKMERGED %s
-CHECKMERGED: Section {
-CHECKMERGED: Number: 3
CHECKMERGED-NOT: Name: .cvinfo
-CHECKMERGED: }
More information about the llvm-commits
mailing list