[lld] [LLD][COFF] Mark personality functions as live in both symbol tables on ARM64X (PR #129295)
Jacek Caban via llvm-commits
llvm-commits at lists.llvm.org
Fri Feb 28 11:55:05 PST 2025
https://github.com/cjacek created https://github.com/llvm/llvm-project/pull/129295
None
>From a09a9fc36e478fcf565c6c635acd0e9f22d072ba Mon Sep 17 00:00:00 2001
From: Jacek Caban <jacek at codeweavers.com>
Date: Mon, 27 Jan 2025 23:57:30 +0100
Subject: [PATCH] [LLD][COFF] Mark personality functions as live in both symbol
tables on ARM64X
---
lld/COFF/Driver.cpp | 16 +++++-----
lld/test/COFF/gc-dwarf-eh-arm64x.s | 47 ++++++++++++++++++++++++++++++
2 files changed, 56 insertions(+), 7 deletions(-)
create mode 100644 lld/test/COFF/gc-dwarf-eh-arm64x.s
diff --git a/lld/COFF/Driver.cpp b/lld/COFF/Driver.cpp
index 1589323073c09..b69ee2bf27742 100644
--- a/lld/COFF/Driver.cpp
+++ b/lld/COFF/Driver.cpp
@@ -2766,14 +2766,16 @@ void LinkerDriver::linkerMain(ArrayRef<const char *> argsArr) {
// For now, just manually try to retain the known possible personality
// functions. This doesn't bring in more object files, but only marks
// functions that already have been included to be retained.
- for (const char *n : {"__gxx_personality_v0", "__gcc_personality_v0",
- "rust_eh_personality"}) {
- Defined *d = dyn_cast_or_null<Defined>(ctx.symtab.findUnderscore(n));
- if (d && !d->isGCRoot) {
- d->isGCRoot = true;
- config->gcroot.push_back(d);
+ ctx.forEachSymtab([&](SymbolTable &symtab) {
+ for (const char *n : {"__gxx_personality_v0", "__gcc_personality_v0",
+ "rust_eh_personality"}) {
+ Defined *d = dyn_cast_or_null<Defined>(symtab.findUnderscore(n));
+ if (d && !d->isGCRoot) {
+ d->isGCRoot = true;
+ config->gcroot.push_back(d);
+ }
}
- }
+ });
}
markLive(ctx);
diff --git a/lld/test/COFF/gc-dwarf-eh-arm64x.s b/lld/test/COFF/gc-dwarf-eh-arm64x.s
new file mode 100644
index 0000000000000..d169256a3d985
--- /dev/null
+++ b/lld/test/COFF/gc-dwarf-eh-arm64x.s
@@ -0,0 +1,47 @@
+# REQUIRES: aarch64
+
+# RUN: llvm-mc -triple=aarch64-windows-gnu %s -filetype=obj -o %t-arm64.obj
+# RUN: llvm-mc -triple=arm64ec-windows-gnu %s -filetype=obj -o %t-arm64ec.obj
+# RUN: lld-link -machine:arm64x -lldmingw -out:%t.exe -opt:ref -entry:main %t-arm64.obj %t-arm64ec.obj -verbose 2>&1 | FileCheck %s
+# CHECK: Discarded unused
+
+# Check that __gxx_personality_v0 is not discarded and is present in the output.
+
+# RUN: llvm-objdump -d %t.exe | FileCheck --check-prefix=DISASM %s
+# DISASM: 0000000140001000 <.text>:
+# DISASM-NEXT: 140001000: 52800000 mov w0, #0x0 // =0
+# DISASM-NEXT: 140001004: d65f03c0 ret
+# DISASM-NEXT: 140001008: 52800020 mov w0, #0x1 // =1
+# DISASM-NEXT: 14000100c: d65f03c0 ret
+# DISASM-NEXT: ...
+# DISASM-NEXT: 140002000: 52800000 mov w0, #0x0 // =0
+# DISASM-NEXT: 140002004: d65f03c0 ret
+# DISASM-NEXT: 140002008: 52800020 mov w0, #0x1 // =1
+# DISASM-NEXT: 14000200c: d65f03c0 ret
+
+ .def main; .scl 2; .type 32; .endef
+ .section .text,"xr",one_only,main
+ .globl main
+main:
+ .cfi_startproc
+ .cfi_personality 0, __gxx_personality_v0
+ mov w0, #0
+ ret
+ .cfi_endproc
+
+ .def __gxx_personality_v0; .scl 2; .type 32; .endef
+ .section .text,"xr",one_only,__gxx_personality_v0
+ .globl __gxx_personality_v0
+__gxx_personality_v0:
+ mov w0, #1
+ ret
+
+ .def unused; .scl 2; .type 32; .endef
+ .section .text,"xr",one_only,unused
+ .globl unused
+unused:
+ .cfi_startproc
+ .cfi_personality 0, __gxx_personality_v0
+ mov w0, #2
+ ret
+ .cfi_endproc
More information about the llvm-commits
mailing list