[lld] d403f33 - [LLD][COFF] Mark personality functions as live in both symbol tables on ARM64X (#129295)

via llvm-commits llvm-commits at lists.llvm.org
Sun Mar 2 04:37:55 PST 2025


Author: Jacek Caban
Date: 2025-03-02T13:37:51+01:00
New Revision: d403f33886a3eda18e1a7368e6d5607b1fd83f0c

URL: https://github.com/llvm/llvm-project/commit/d403f33886a3eda18e1a7368e6d5607b1fd83f0c
DIFF: https://github.com/llvm/llvm-project/commit/d403f33886a3eda18e1a7368e6d5607b1fd83f0c.diff

LOG: [LLD][COFF] Mark personality functions as live in both symbol tables on ARM64X (#129295)

Added: 
    lld/test/COFF/gc-dwarf-eh-arm64x.s

Modified: 
    lld/COFF/Driver.cpp

Removed: 
    


################################################################################
diff  --git a/lld/COFF/Driver.cpp b/lld/COFF/Driver.cpp
index f7addc29d1a3a..b9bde9bb428e6 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