[lld] [LLD][COFF] Allow -arm64xsameaddress in ARM64EC directives (PR #139631)
Jacek Caban via llvm-commits
llvm-commits at lists.llvm.org
Wed May 14 11:13:26 PDT 2025
https://github.com/cjacek updated https://github.com/llvm/llvm-project/pull/139631
>From 1899725070c9b7499baeaf43e086bc5c19d3efd5 Mon Sep 17 00:00:00 2001
From: Jacek Caban <jacek at codeweavers.com>
Date: Mon, 12 May 2025 22:42:22 +0200
Subject: [PATCH 1/2] [LLD][COFF] Allow -arm64xsameaddress in ARM64EC
directives
Make it a no-op for now, which is sufficient for non-hybrid images.
Fixes #131712.
---
lld/COFF/Driver.cpp | 6 +++
lld/COFF/Options.td | 3 ++
lld/test/COFF/arm64x-sameaddress.test | 56 +++++++++++++++++++++++++++
3 files changed, 65 insertions(+)
create mode 100644 lld/test/COFF/arm64x-sameaddress.test
diff --git a/lld/COFF/Driver.cpp b/lld/COFF/Driver.cpp
index 4c296da35d667..0c87cd804c9dd 100644
--- a/lld/COFF/Driver.cpp
+++ b/lld/COFF/Driver.cpp
@@ -492,6 +492,12 @@ void LinkerDriver::parseDirectives(InputFile *file) {
case OPT_alternatename:
file->symtab.parseAlternateName(arg->getValue());
break;
+ case OPT_arm64xsameaddress:
+ if (!file->symtab.isEC())
+ Warn(ctx) << arg->getSpelling()
+ << " is not allowed in non-ARM64EC files (" << toString(file)
+ << ")";
+ break;
case OPT_defaultlib:
if (std::optional<StringRef> path = findLibIfNew(arg->getValue()))
enqueuePath(*path, false, false);
diff --git a/lld/COFF/Options.td b/lld/COFF/Options.td
index 4e401a5fd1d6d..aa64a0584d9bd 100644
--- a/lld/COFF/Options.td
+++ b/lld/COFF/Options.td
@@ -31,6 +31,9 @@ multiclass B_priv<string name> {
def align : P<"align", "Section alignment">;
def aligncomm : P<"aligncomm", "Set common symbol alignment">;
def alternatename : P<"alternatename", "Define weak alias">;
+def arm64xsameaddress
+ : P<"arm64xsameaddress", "Generate a thunk for the symbol with the same "
+ "address in both native and EC views on ARM64X.">;
def base : P<"base", "Base address of the program">;
def color_diagnostics: Flag<["--"], "color-diagnostics">,
HelpText<"Alias for --color-diagnostics=always">;
diff --git a/lld/test/COFF/arm64x-sameaddress.test b/lld/test/COFF/arm64x-sameaddress.test
new file mode 100644
index 0000000000000..c69be9d268c3b
--- /dev/null
+++ b/lld/test/COFF/arm64x-sameaddress.test
@@ -0,0 +1,56 @@
+REQUIRES: aarch64
+RUN: split-file %s %t.dir && cd %t.dir
+
+RUN: llvm-mc -filetype=obj -triple=arm64ec-windows func-arm64ec.s -o func-arm64ec.obj
+RUN: llvm-mc -filetype=obj -triple=aarch64-windows func-arm64.s -o func-arm64.obj
+RUN: llvm-mc -filetype=obj -triple=arm64ec-windows drectve.s -o drectve.obj
+RUN: llvm-mc -filetype=obj -triple=aarch64-windows drectve.s -o drectve-arm64.obj
+RUN: llvm-mc -filetype=obj -triple=arm64ec-windows %S/Inputs/loadconfig-arm64ec.s -o loadconfig-arm64ec.obj
+RUN: llvm-mc -filetype=obj -triple=aarch64-windows %S/Inputs/loadconfig-arm64.s -o loadconfig-arm64.obj
+
+RUN: lld-link -machine:arm64x -dll -noentry -out:out.dll loadconfig-arm64.obj loadconfig-arm64ec.obj \
+RUN: func-arm64.obj func-arm64ec.obj drectve.obj
+
+RUN: lld-link -machine:arm64x -dll -noentry -out:out-cmd.dll loadconfig-arm64.obj loadconfig-arm64ec.obj \
+RUN: func-arm64.obj func-arm64ec.obj -arm64xsameaddress:func
+
+RUN: lld-link -machine:arm64ec -dll -noentry -out:out-ec.dll loadconfig-arm64ec.obj func-arm64ec.obj drectve.obj
+
+RUN: lld-link -machine:arm64x -dll -noentry -out:out-warn.dll loadconfig-arm64.obj loadconfig-arm64ec.obj \
+RUN: func-arm64.obj func-arm64ec.obj drectve-arm64.obj 2>&1 | FileCheck --check-prefix=WARN %s
+WARN: lld-link: warning: -arm64xsameaddress: is not allowed in non-ARM64EC files (drectve-arm64.obj)
+
+#--- func-arm64.s
+ .section .text,"xr",discard,func
+ .globl func
+func:
+ mov x0, #1
+ ret
+
+#--- func-arm64ec.s
+ .section .text,"xr",discard,"#func"
+ .globl "#func"
+"#func":
+ mov x0, #2
+ ret
+
+ .weak_anti_dep func
+ .set func,"#func"
+
+ .section .wowthk,"xr",discard,entry_thunk
+ .globl entry_thunk
+entry_thunk:
+ mov x0, #3
+ ret
+
+ .section .test,"dr"
+ .rva func
+
+ .section .hybmp$x,"yi"
+ .symidx "#func"
+ .symidx entry_thunk
+ .word 1
+
+#--- drectve.s
+ .section .drectve, "yn"
+ .ascii " -arm64xsameaddress:func"
>From a25668ee2c601f27c021f2291b2b1d3509d8febd Mon Sep 17 00:00:00 2001
From: Jacek Caban <jacek at codeweavers.com>
Date: Wed, 14 May 2025 20:12:42 +0200
Subject: [PATCH 2/2] Use P_priv for -arm64xsameaddress
---
lld/COFF/Options.td | 4 +---
1 file changed, 1 insertion(+), 3 deletions(-)
diff --git a/lld/COFF/Options.td b/lld/COFF/Options.td
index aa64a0584d9bd..a887d7d351e18 100644
--- a/lld/COFF/Options.td
+++ b/lld/COFF/Options.td
@@ -31,9 +31,6 @@ multiclass B_priv<string name> {
def align : P<"align", "Section alignment">;
def aligncomm : P<"aligncomm", "Set common symbol alignment">;
def alternatename : P<"alternatename", "Define weak alias">;
-def arm64xsameaddress
- : P<"arm64xsameaddress", "Generate a thunk for the symbol with the same "
- "address in both native and EC views on ARM64X.">;
def base : P<"base", "Base address of the program">;
def color_diagnostics: Flag<["--"], "color-diagnostics">,
HelpText<"Alias for --color-diagnostics=always">;
@@ -359,3 +356,4 @@ def tlbid : P_priv<"tlbid">;
def tlbout : P_priv<"tlbout">;
def verbose_all : P_priv<"verbose">;
def guardsym : P_priv<"guardsym">;
+def arm64xsameaddress : P_priv<"arm64xsameaddress">;
More information about the llvm-commits
mailing list