[llvm-branch-commits] [lld] release/18.x: [LLD] [COFF] Don't add pseudo relocs for dangling references (#88487) (PR #88759)
via llvm-branch-commits
llvm-branch-commits at lists.llvm.org
Mon Apr 15 10:20:58 PDT 2024
llvmbot wrote:
<!--LLVM PR SUMMARY COMMENT-->
@llvm/pr-subscribers-lld
Author: None (llvmbot)
<details>
<summary>Changes</summary>
Backport 9c970d5ecd6a85188cd2b0a941fcd4d60063ef81
Requested by: @<!-- -->mstorsjo
---
Full diff: https://github.com/llvm/llvm-project/pull/88759.diff
2 Files Affected:
- (modified) lld/COFF/Chunks.cpp (+7)
- (added) lld/test/COFF/autoimport-gc.s (+41)
``````````diff
diff --git a/lld/COFF/Chunks.cpp b/lld/COFF/Chunks.cpp
index 39f4575031be54..e2074932bc466e 100644
--- a/lld/COFF/Chunks.cpp
+++ b/lld/COFF/Chunks.cpp
@@ -652,6 +652,13 @@ void SectionChunk::getRuntimePseudoRelocs(
dyn_cast_or_null<Defined>(file->getSymbol(rel.SymbolTableIndex));
if (!target || !target->isRuntimePseudoReloc)
continue;
+ // If the target doesn't have a chunk allocated, it may be a
+ // DefinedImportData symbol which ended up unnecessary after GC.
+ // Normally we wouldn't eliminate section chunks that are referenced, but
+ // references within DWARF sections don't count for keeping section chunks
+ // alive. Thus such dangling references in DWARF sections are expected.
+ if (!target->getChunk())
+ continue;
int sizeInBits =
getRuntimePseudoRelocSize(rel.Type, file->ctx.config.machine);
if (sizeInBits == 0) {
diff --git a/lld/test/COFF/autoimport-gc.s b/lld/test/COFF/autoimport-gc.s
new file mode 100644
index 00000000000000..fef6c02eba82f9
--- /dev/null
+++ b/lld/test/COFF/autoimport-gc.s
@@ -0,0 +1,41 @@
+# REQUIRES: x86
+# RUN: split-file %s %t.dir
+
+# 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:ref -debug:dwarf
+
+#--- main.s
+ .global main
+ .section .text$main,"xr",one_only,main
+main:
+ ret
+
+ .global other
+ .section .text$other,"xr",one_only,other
+other:
+ movq .refptr.variable(%rip), %rax
+ movl (%rax), %eax
+ 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
``````````
</details>
https://github.com/llvm/llvm-project/pull/88759
More information about the llvm-branch-commits
mailing list