From 1899725070c9b7499baeaf43e086bc5c19d3efd5 Mon Sep 17 00:00:00 2001 From: Jacek Caban 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 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 { 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 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 { 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">;