diff options
| author | Jacek Caban <jacek@codeweavers.com> | 2024-11-04 16:26:33 +0100 |
|---|---|---|
| committer | GitHub <noreply@github.com> | 2024-11-04 16:26:33 +0100 |
| commit | 5d7afd324ad23e7b44ba82dbf38287e02002ceec (patch) | |
| tree | 6409b939036824975747ef2a38884c62811014a6 /lld/COFF/InputFiles.cpp | |
| parent | 0653698d8637b8d565cbf59de591e2d8c61c20cc (diff) | |
| download | llvm-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.cpp | 17 |
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, |
