[lld] d6a2a26 - [LLD][COFF] Add support for DLL imports on ARM64EC (#141587)
via llvm-commits
llvm-commits at lists.llvm.org
Thu May 29 02:37:21 PDT 2025
Author: Jacek Caban
Date: 2025-05-29T11:37:18+02:00
New Revision: d6a2a2612f4ed4c87dc612742fef6c68171a69de
URL: https://github.com/llvm/llvm-project/commit/d6a2a2612f4ed4c87dc612742fef6c68171a69de
DIFF: https://github.com/llvm/llvm-project/commit/d6a2a2612f4ed4c87dc612742fef6c68171a69de.diff
LOG: [LLD][COFF] Add support for DLL imports on ARM64EC (#141587)
Define additional `__imp_aux_` and mangled lazy symbols. Also allow
overriding EC aliases with lazy symbols, as we do for other lazy symbol
types.
Added:
lld/test/COFF/link-dll-arm64ec.s
Modified:
lld/COFF/InputFiles.cpp
lld/COFF/SymbolTable.cpp
Removed:
################################################################################
diff --git a/lld/COFF/InputFiles.cpp b/lld/COFF/InputFiles.cpp
index 170f747970a99..760ce00dda0d6 100644
--- a/lld/COFF/InputFiles.cpp
+++ b/lld/COFF/InputFiles.cpp
@@ -1486,6 +1486,17 @@ void DLLFile::parse() {
symtab.addLazyDLLSymbol(this, s, impName);
if (code)
symtab.addLazyDLLSymbol(this, s, symbolName);
+ if (symtab.isEC()) {
+ StringRef impAuxName = saver().save("__imp_aux_" + symbolName);
+ symtab.addLazyDLLSymbol(this, s, impAuxName);
+
+ if (code) {
+ std::optional<std::string> mangledName =
+ getArm64ECMangledFunctionName(symbolName);
+ if (mangledName)
+ symtab.addLazyDLLSymbol(this, s, *mangledName);
+ }
+ }
}
}
diff --git a/lld/COFF/SymbolTable.cpp b/lld/COFF/SymbolTable.cpp
index 979acd2ef5975..0062df5820e63 100644
--- a/lld/COFF/SymbolTable.cpp
+++ b/lld/COFF/SymbolTable.cpp
@@ -780,7 +780,7 @@ void SymbolTable::addLazyDLLSymbol(DLLFile *f, DLLFile::Symbol *sym,
return;
}
auto *u = dyn_cast<Undefined>(s);
- if (!u || u->weakAlias || s->pendingArchiveLoad)
+ if (!u || (u->weakAlias && !u->isECAlias(machine)) || s->pendingArchiveLoad)
return;
s->pendingArchiveLoad = true;
f->makeImport(sym);
diff --git a/lld/test/COFF/link-dll-arm64ec.s b/lld/test/COFF/link-dll-arm64ec.s
new file mode 100644
index 0000000000000..a64ec950fce6c
--- /dev/null
+++ b/lld/test/COFF/link-dll-arm64ec.s
@@ -0,0 +1,60 @@
+REQUIRES: aarch64, x86
+RUN: split-file %s %t.dir && cd %t.dir
+
+RUN: llvm-mc -filetype=obj -triple=arm64ec-windows test.s -o test.obj
+RUN: llvm-mc -filetype=obj -triple=arm64ec-windows dll.s -o dll.obj
+RUN: llvm-mc -filetype=obj -triple=arm64ec-windows %S/Inputs/loadconfig-arm64ec.s -o loadconfig-arm64ec.obj
+
+RUN: lld-link -machine:arm64ec -dll -noentry -out:import.dll loadconfig-arm64ec.obj dll.obj \
+RUN: -export:func -export:func2=func -export:func3=func -export:func4=func \
+RUN: -export:data,DATA -noimplib
+
+RUN: lld-link -machine:arm64ec -dll -noentry -out:out.dll loadconfig-arm64ec.obj test.obj import.dll \
+RUN: -lldmingw -exclude-all-symbols -auto-import:no
+
+RUN: llvm-readobj --coff-imports out.dll | FileCheck --check-prefix=IMPORTS %s
+IMPORTS: Import {
+IMPORTS-NEXT: Name: import.dll
+IMPORTS-NEXT: ImportLookupTableRVA:
+IMPORTS-NEXT: ImportAddressTableRVA:
+IMPORTS-NEXT: Symbol: data (0)
+IMPORTS-NEXT: Symbol: func (0)
+IMPORTS-NEXT: Symbol: func2 (0)
+IMPORTS-NEXT: Symbol: func3 (0)
+IMPORTS-NEXT: Symbol: func4 (0)
+IMPORTS-NEXT: }
+
+#--- test.s
+ .weak_anti_dep func
+ .weak_anti_dep "#func"
+ .set func,"#func"
+ .set "#func",thunk
+
+ .section .test, "r"
+ .rva __imp_data
+ .rva func
+ .rva "#func2"
+ .rva __imp_aux_func3
+ .rva __imp_func4
+
+ .text
+ .globl thunk
+thunk:
+ ret
+
+ .globl __icall_helper_arm64ec
+ .p2align 2, 0x0
+__icall_helper_arm64ec:
+ mov w0, #0
+ ret
+
+#--- dll.s
+ .text
+ .globl func
+func:
+ ret
+
+ .data
+ .globl data
+data:
+ .word 0
More information about the llvm-commits
mailing list