-
Notifications
You must be signed in to change notification settings - Fork 14.3k
[LLD][COFF] Add EC alias symbols for undefined x86_64 symbols on ARM64EC target #114466
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
Similar to #114297, this enables x86_64 object files to reference functions implemented as ARM64EC. |
@llvm/pr-subscribers-lld @llvm/pr-subscribers-lld-coff Author: Jacek Caban (cjacek) ChangesFull diff: https://github.com/llvm/llvm-project/pull/114466.diff 2 Files Affected:
diff --git a/lld/COFF/InputFiles.cpp b/lld/COFF/InputFiles.cpp
index b2ea4bdfe64e3c..b84ead61e25585 100644
--- a/lld/COFF/InputFiles.cpp
+++ b/lld/COFF/InputFiles.cpp
@@ -534,7 +534,22 @@ void ObjFile::initializeSymbols() {
Symbol *ObjFile::createUndefined(COFFSymbolRef sym, bool overrideLazy) {
StringRef name = check(coffObj->getSymbolName(sym));
- return ctx.symtab.addUndefined(name, this, overrideLazy);
+ Symbol *s = ctx.symtab.addUndefined(name, this, overrideLazy);
+
+ // Add an anti-dependency alias for undefined AMD64 symbols on the ARM64EC
+ // target.
+ if (isArm64EC(ctx.config.machine) && getMachineType() == AMD64) {
+ auto u = dyn_cast<Undefined>(s);
+ if (u && !u->weakAlias) {
+ if (std::optional<std::string> mangledName =
+ getArm64ECMangledFunctionName(name)) {
+ Symbol *m =
+ ctx.symtab.addUndefined(saver().save(*mangledName), this, false);
+ u->setWeakAlias(m, true);
+ }
+ }
+ }
+ return s;
}
static const coff_aux_section_definition *findSectionDef(COFFObjectFile *obj,
diff --git a/lld/test/COFF/arm64ec-entry-mangle.test b/lld/test/COFF/arm64ec-entry-mangle.test
index 65283f16d02fa9..6db16ef218dc8b 100644
--- a/lld/test/COFF/arm64ec-entry-mangle.test
+++ b/lld/test/COFF/arm64ec-entry-mangle.test
@@ -8,6 +8,7 @@ RUN: llvm-mc -filetype=obj -triple=arm64ec-windows mangled-func.s -o mangled-fun
RUN: llvm-mc -filetype=obj -triple=arm64ec-windows ref-demangled.s -o ref-demangled.obj
RUN: llvm-mc -filetype=obj -triple=arm64ec-windows demangled-entry-drectve.s -o demangled-entry-drectve.obj
RUN: llvm-mc -filetype=obj -triple=x86_64-windows demangled-dll-main.s -o x64-dll-main.obj
+RUN: llvm-mc -filetype=obj -triple=x86_64-windows ref-demangled.s -o ref-x64.obj
RUN: llvm-mc -filetype=obj -triple=arm64ec-windows %S/Inputs/loadconfig-arm64ec.s -o loadconfig-arm64ec.obj
RUN: llvm-lib -machine:arm64ec -out:func.lib mangled-func.obj
@@ -80,6 +81,14 @@ RUN: lld-link -machine:arm64ec -dll -noentry -out:demangled-export-ref.dll mangl
RUN: ref-demangled.obj loadconfig-arm64ec.obj "-export:#func"
RUN: llvm-objdump -d demangled-export-ref.dll | FileCheck -check-prefix=DISASM %s
+Verify that an x86_64 object file can reference ARM64EC mangled functions without requiring an explicit alias.
+RUN: lld-link -machine:arm64ec -dll -noentry -out:x64-ref.dll mangled-func.obj ref-x64.obj loadconfig-arm64ec.obj
+RUN: llvm-objdump -d x64-ref.dll | FileCheck -check-prefix=DISASM2 %s
+
+Verify that an x86_64 object file can reference ARM64EC mangled functions provided by a library.
+RUN: lld-link -machine:arm64ec -dll -noentry -out:x64-lib-ref.dll func.lib ref-x64.obj loadconfig-arm64ec.obj
+RUN: llvm-objdump -d x64-lib-ref.dll | FileCheck -check-prefix=DISASM2 %s
+
DISASM2: 0000000180001000 <.text>:
DISASM2-NEXT: 180001000: d65f03c0 ret
|
@llvm/pr-subscribers-platform-windows Author: Jacek Caban (cjacek) ChangesFull diff: https://github.com/llvm/llvm-project/pull/114466.diff 2 Files Affected:
diff --git a/lld/COFF/InputFiles.cpp b/lld/COFF/InputFiles.cpp
index b2ea4bdfe64e3c..b84ead61e25585 100644
--- a/lld/COFF/InputFiles.cpp
+++ b/lld/COFF/InputFiles.cpp
@@ -534,7 +534,22 @@ void ObjFile::initializeSymbols() {
Symbol *ObjFile::createUndefined(COFFSymbolRef sym, bool overrideLazy) {
StringRef name = check(coffObj->getSymbolName(sym));
- return ctx.symtab.addUndefined(name, this, overrideLazy);
+ Symbol *s = ctx.symtab.addUndefined(name, this, overrideLazy);
+
+ // Add an anti-dependency alias for undefined AMD64 symbols on the ARM64EC
+ // target.
+ if (isArm64EC(ctx.config.machine) && getMachineType() == AMD64) {
+ auto u = dyn_cast<Undefined>(s);
+ if (u && !u->weakAlias) {
+ if (std::optional<std::string> mangledName =
+ getArm64ECMangledFunctionName(name)) {
+ Symbol *m =
+ ctx.symtab.addUndefined(saver().save(*mangledName), this, false);
+ u->setWeakAlias(m, true);
+ }
+ }
+ }
+ return s;
}
static const coff_aux_section_definition *findSectionDef(COFFObjectFile *obj,
diff --git a/lld/test/COFF/arm64ec-entry-mangle.test b/lld/test/COFF/arm64ec-entry-mangle.test
index 65283f16d02fa9..6db16ef218dc8b 100644
--- a/lld/test/COFF/arm64ec-entry-mangle.test
+++ b/lld/test/COFF/arm64ec-entry-mangle.test
@@ -8,6 +8,7 @@ RUN: llvm-mc -filetype=obj -triple=arm64ec-windows mangled-func.s -o mangled-fun
RUN: llvm-mc -filetype=obj -triple=arm64ec-windows ref-demangled.s -o ref-demangled.obj
RUN: llvm-mc -filetype=obj -triple=arm64ec-windows demangled-entry-drectve.s -o demangled-entry-drectve.obj
RUN: llvm-mc -filetype=obj -triple=x86_64-windows demangled-dll-main.s -o x64-dll-main.obj
+RUN: llvm-mc -filetype=obj -triple=x86_64-windows ref-demangled.s -o ref-x64.obj
RUN: llvm-mc -filetype=obj -triple=arm64ec-windows %S/Inputs/loadconfig-arm64ec.s -o loadconfig-arm64ec.obj
RUN: llvm-lib -machine:arm64ec -out:func.lib mangled-func.obj
@@ -80,6 +81,14 @@ RUN: lld-link -machine:arm64ec -dll -noentry -out:demangled-export-ref.dll mangl
RUN: ref-demangled.obj loadconfig-arm64ec.obj "-export:#func"
RUN: llvm-objdump -d demangled-export-ref.dll | FileCheck -check-prefix=DISASM %s
+Verify that an x86_64 object file can reference ARM64EC mangled functions without requiring an explicit alias.
+RUN: lld-link -machine:arm64ec -dll -noentry -out:x64-ref.dll mangled-func.obj ref-x64.obj loadconfig-arm64ec.obj
+RUN: llvm-objdump -d x64-ref.dll | FileCheck -check-prefix=DISASM2 %s
+
+Verify that an x86_64 object file can reference ARM64EC mangled functions provided by a library.
+RUN: lld-link -machine:arm64ec -dll -noentry -out:x64-lib-ref.dll func.lib ref-x64.obj loadconfig-arm64ec.obj
+RUN: llvm-objdump -d x64-lib-ref.dll | FileCheck -check-prefix=DISASM2 %s
+
DISASM2: 0000000180001000 <.text>:
DISASM2-NEXT: 180001000: d65f03c0 ret
|
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/InputFiles.cpp
Outdated
if (std::optional<std::string> mangledName = | ||
getArm64ECMangledFunctionName(name)) { | ||
Symbol *m = | ||
ctx.symtab.addUndefined(saver().save(*mangledName), this, false); |
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.
Side note; literal bool parameters like false here, and true on the line below are quite hard to grasp unless you’re reading the called method at the same time. I think it may be more understandable if we’d add comments for these parameters about what they are; we have a pattern for that, /*name=*/ false
(modulo spacing, I don’t remember what our canonical spacing is for these comments), which might make it clearer.
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.
I added those comments and merged, thanks.
0a23005
to
9f0519e
Compare
9f0519e
to
2b6268b
Compare
No description provided.