Skip to content

Commit 0a23005

Browse files
committed
[LLD][COFF] Add EC alias symbols for undefined x86_64 symbols on ARM64EC target
1 parent 4d4a43d commit 0a23005

File tree

2 files changed

+25
-1
lines changed

2 files changed

+25
-1
lines changed

lld/COFF/InputFiles.cpp

Lines changed: 16 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -534,7 +534,22 @@ void ObjFile::initializeSymbols() {
534534

535535
Symbol *ObjFile::createUndefined(COFFSymbolRef sym, bool overrideLazy) {
536536
StringRef name = check(coffObj->getSymbolName(sym));
537-
return ctx.symtab.addUndefined(name, this, overrideLazy);
537+
Symbol *s = ctx.symtab.addUndefined(name, this, overrideLazy);
538+
539+
// Add an anti-dependency alias for undefined AMD64 symbols on the ARM64EC
540+
// target.
541+
if (isArm64EC(ctx.config.machine) && getMachineType() == AMD64) {
542+
auto u = dyn_cast<Undefined>(s);
543+
if (u && !u->weakAlias) {
544+
if (std::optional<std::string> mangledName =
545+
getArm64ECMangledFunctionName(name)) {
546+
Symbol *m =
547+
ctx.symtab.addUndefined(saver().save(*mangledName), this, false);
548+
u->setWeakAlias(m, true);
549+
}
550+
}
551+
}
552+
return s;
538553
}
539554

540555
static const coff_aux_section_definition *findSectionDef(COFFObjectFile *obj,

lld/test/COFF/arm64ec-entry-mangle.test

Lines changed: 9 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -8,6 +8,7 @@ RUN: llvm-mc -filetype=obj -triple=arm64ec-windows mangled-func.s -o mangled-fun
88
RUN: llvm-mc -filetype=obj -triple=arm64ec-windows ref-demangled.s -o ref-demangled.obj
99
RUN: llvm-mc -filetype=obj -triple=arm64ec-windows demangled-entry-drectve.s -o demangled-entry-drectve.obj
1010
RUN: llvm-mc -filetype=obj -triple=x86_64-windows demangled-dll-main.s -o x64-dll-main.obj
11+
RUN: llvm-mc -filetype=obj -triple=x86_64-windows ref-demangled.s -o ref-x64.obj
1112
RUN: llvm-mc -filetype=obj -triple=arm64ec-windows %S/Inputs/loadconfig-arm64ec.s -o loadconfig-arm64ec.obj
1213

1314
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
8081
RUN: ref-demangled.obj loadconfig-arm64ec.obj "-export:#func"
8182
RUN: llvm-objdump -d demangled-export-ref.dll | FileCheck -check-prefix=DISASM %s
8283

84+
Verify that an x86_64 object file can reference ARM64EC mangled functions without requiring an explicit alias.
85+
RUN: lld-link -machine:arm64ec -dll -noentry -out:x64-ref.dll mangled-func.obj ref-x64.obj loadconfig-arm64ec.obj
86+
RUN: llvm-objdump -d x64-ref.dll | FileCheck -check-prefix=DISASM2 %s
87+
88+
Verify that an x86_64 object file can reference ARM64EC mangled functions provided by a library.
89+
RUN: lld-link -machine:arm64ec -dll -noentry -out:x64-lib-ref.dll func.lib ref-x64.obj loadconfig-arm64ec.obj
90+
RUN: llvm-objdump -d x64-lib-ref.dll | FileCheck -check-prefix=DISASM2 %s
91+
8392
DISASM2: 0000000180001000 <.text>:
8493
DISASM2-NEXT: 180001000: d65f03c0 ret
8594

0 commit comments

Comments
 (0)