-
Notifications
You must be signed in to change notification settings - Fork 13.5k
[LLD][COFF] Allow -arm64xsameaddress in ARM64EC directives #139631
New issue
Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.
By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.
Already on GitHub? Sign in to your account
Conversation
Make it a no-op for now, which is sufficient for non-hybrid images. Fixes llvm#131712.
@llvm/pr-subscribers-platform-windows @llvm/pr-subscribers-lld-coff Author: Jacek Caban (cjacek) ChangesMake it a no-op for now, which is sufficient for non-hybrid images. Fixes #131712. Full diff: https://github.com/llvm/llvm-project/pull/139631.diff 3 Files Affected:
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"
|
@llvm/pr-subscribers-lld Author: Jacek Caban (cjacek) ChangesMake it a no-op for now, which is sufficient for non-hybrid images. Fixes #131712. Full diff: https://github.com/llvm/llvm-project/pull/139631.diff 3 Files Affected:
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"
|
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
LGTM
lld/COFF/Options.td
Outdated
@@ -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 " |
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
As the option is a no-op, would it be better if the option description made this clear for now? Do you plan on doing a full implementation of the option later, or is that deferred until there's an actual need for it?
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
Yes, I have a draft of it, but I still need to work out a few details and finish it. I noticed that for other no-op options we use P_priv
, so I switched to that with the intention of updating it alongside the actual implementation. Thanks!
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
LGTM
/cherry-pick d5da557 |
/pull-request #140051 |
Make it a no-op for now, which is sufficient for non-hybrid images.
Fixes #131712.