aboutsummaryrefslogtreecommitdiff
path: root/lld/COFF/InputFiles.cpp
diff options
context:
space:
mode:
authorJacek Caban <jacek@codeweavers.com>2024-11-04 16:26:33 +0100
committerGitHub <noreply@github.com>2024-11-04 16:26:33 +0100
commit5d7afd324ad23e7b44ba82dbf38287e02002ceec (patch)
tree6409b939036824975747ef2a38884c62811014a6 /lld/COFF/InputFiles.cpp
parent0653698d8637b8d565cbf59de591e2d8c61c20cc (diff)
downloadllvm-5d7afd324ad23e7b44ba82dbf38287e02002ceec.tar.gz
llvm-5d7afd324ad23e7b44ba82dbf38287e02002ceec.tar.bz2
llvm-5d7afd324ad23e7b44ba82dbf38287e02002ceec.zip
[LLD][COFF] Add EC alias symbols for undefined x86_64 symbols on ARM64EC target (#114466)
Diffstat (limited to 'lld/COFF/InputFiles.cpp')
-rw-r--r--lld/COFF/InputFiles.cpp17
1 files changed, 16 insertions, 1 deletions
diff --git a/lld/COFF/InputFiles.cpp b/lld/COFF/InputFiles.cpp
index b2ea4bdfe64e..4b2d6e511df1 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,
+ /*overrideLazy=*/false);
+ u->setWeakAlias(m, /*antiDep=*/true);
+ }
+ }
+ }
+ return s;
}
static const coff_aux_section_definition *findSectionDef(COFFObjectFile *obj,