aboutsummaryrefslogtreecommitdiff
path: root/lld
diff options
context:
space:
mode:
authorMartin Storsjö <martin@martin.st>2024-04-18 13:30:29 +0300
committerGitHub <noreply@github.com>2024-04-18 13:30:29 +0300
commitd17db6066d2524856fab493dd894f8396e896bc7 (patch)
treeaa22f243eabce980795deaf195738fc9d86f74ad /lld
parent750de326ef0408df4a5f91773c355ded1a1b1b77 (diff)
downloadllvm-d17db6066d2524856fab493dd894f8396e896bc7.zip
llvm-d17db6066d2524856fab493dd894f8396e896bc7.tar.gz
llvm-d17db6066d2524856fab493dd894f8396e896bc7.tar.bz2
[LLD] [COFF] Don't create pseudo relocations for discardable sections (#89043)
This extends on the case from 9c970d5ecd6a85188cd2b0a941fcd4d60063ef81; if a section is marked discardable, it won't be mapped into memory at runtime, so there's no point in creating runtime pseudo relocations for such sections.
Diffstat (limited to 'lld')
-rw-r--r--lld/COFF/Writer.cpp4
-rw-r--r--lld/test/COFF/autoimport-debug.s43
2 files changed, 47 insertions, 0 deletions
diff --git a/lld/COFF/Writer.cpp b/lld/COFF/Writer.cpp
index 7269d15..6899323 100644
--- a/lld/COFF/Writer.cpp
+++ b/lld/COFF/Writer.cpp
@@ -2060,6 +2060,10 @@ void Writer::createRuntimePseudoRelocs() {
auto *sc = dyn_cast<SectionChunk>(c);
if (!sc || !sc->live)
continue;
+ // Don't create pseudo relocations for sections that won't be
+ // mapped at runtime.
+ if (sc->header->Characteristics & IMAGE_SCN_MEM_DISCARDABLE)
+ continue;
sc->getRuntimePseudoRelocs(rels);
}
diff --git a/lld/test/COFF/autoimport-debug.s b/lld/test/COFF/autoimport-debug.s
new file mode 100644
index 0000000..1f31a2b
--- /dev/null
+++ b/lld/test/COFF/autoimport-debug.s
@@ -0,0 +1,43 @@
+# REQUIRES: x86
+# RUN: split-file %s %t.dir
+
+## We've got references to variable both in a .refptr and in .debug_info.
+## The .debug_info section should be discardable, so no pseudo relocations
+## need to be created in it. The .refptr section should be elimiated
+## and redirected to __imp_variable instead, so we shouldn't need to
+## create any runtime pseudo relocations. Thus, test that we can link
+## successfully with -runtime-pseudo-reloc:no, while keeping the
+## debug info.
+
+# RUN: llvm-mc -triple=x86_64-windows-gnu %t.dir/lib.s -filetype=obj -o %t.dir/lib.obj
+# RUN: lld-link -out:%t.dir/lib.dll -dll -entry:DllMainCRTStartup %t.dir/lib.obj -lldmingw -implib:%t.dir/lib.lib
+
+# RUN: llvm-mc -triple=x86_64-windows-gnu %t.dir/main.s -filetype=obj -o %t.dir/main.obj
+# RUN: lld-link -lldmingw -out:%t.dir/main.exe -entry:main %t.dir/main.obj %t.dir/lib.lib -opt:noref -debug:dwarf -runtime-pseudo-reloc:no
+
+#--- main.s
+ .global main
+ .text
+main:
+ movq .refptr.variable(%rip), %rax
+ ret
+
+ .section .rdata$.refptr.variable,"dr",discard,.refptr.variable
+ .global .refptr.variable
+.refptr.variable:
+ .quad variable
+
+ .section .debug_info
+ .long 1
+ .quad variable
+ .long 2
+
+#--- lib.s
+ .global variable
+ .global DllMainCRTStartup
+ .text
+DllMainCRTStartup:
+ ret
+ .data
+variable:
+ .long 42