Skip to content

Commit d6a2a26

Browse files
authored
[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.
1 parent 6602bfa commit d6a2a26

File tree

3 files changed

+72
-1
lines changed

3 files changed

+72
-1
lines changed

lld/COFF/InputFiles.cpp

Lines changed: 11 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1486,6 +1486,17 @@ void DLLFile::parse() {
14861486
symtab.addLazyDLLSymbol(this, s, impName);
14871487
if (code)
14881488
symtab.addLazyDLLSymbol(this, s, symbolName);
1489+
if (symtab.isEC()) {
1490+
StringRef impAuxName = saver().save("__imp_aux_" + symbolName);
1491+
symtab.addLazyDLLSymbol(this, s, impAuxName);
1492+
1493+
if (code) {
1494+
std::optional<std::string> mangledName =
1495+
getArm64ECMangledFunctionName(symbolName);
1496+
if (mangledName)
1497+
symtab.addLazyDLLSymbol(this, s, *mangledName);
1498+
}
1499+
}
14891500
}
14901501
}
14911502

lld/COFF/SymbolTable.cpp

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -780,7 +780,7 @@ void SymbolTable::addLazyDLLSymbol(DLLFile *f, DLLFile::Symbol *sym,
780780
return;
781781
}
782782
auto *u = dyn_cast<Undefined>(s);
783-
if (!u || u->weakAlias || s->pendingArchiveLoad)
783+
if (!u || (u->weakAlias && !u->isECAlias(machine)) || s->pendingArchiveLoad)
784784
return;
785785
s->pendingArchiveLoad = true;
786786
f->makeImport(sym);

lld/test/COFF/link-dll-arm64ec.s

Lines changed: 60 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,60 @@
1+
REQUIRES: aarch64, x86
2+
RUN: split-file %s %t.dir && cd %t.dir
3+
4+
RUN: llvm-mc -filetype=obj -triple=arm64ec-windows test.s -o test.obj
5+
RUN: llvm-mc -filetype=obj -triple=arm64ec-windows dll.s -o dll.obj
6+
RUN: llvm-mc -filetype=obj -triple=arm64ec-windows %S/Inputs/loadconfig-arm64ec.s -o loadconfig-arm64ec.obj
7+
8+
RUN: lld-link -machine:arm64ec -dll -noentry -out:import.dll loadconfig-arm64ec.obj dll.obj \
9+
RUN: -export:func -export:func2=func -export:func3=func -export:func4=func \
10+
RUN: -export:data,DATA -noimplib
11+
12+
RUN: lld-link -machine:arm64ec -dll -noentry -out:out.dll loadconfig-arm64ec.obj test.obj import.dll \
13+
RUN: -lldmingw -exclude-all-symbols -auto-import:no
14+
15+
RUN: llvm-readobj --coff-imports out.dll | FileCheck --check-prefix=IMPORTS %s
16+
IMPORTS: Import {
17+
IMPORTS-NEXT: Name: import.dll
18+
IMPORTS-NEXT: ImportLookupTableRVA:
19+
IMPORTS-NEXT: ImportAddressTableRVA:
20+
IMPORTS-NEXT: Symbol: data (0)
21+
IMPORTS-NEXT: Symbol: func (0)
22+
IMPORTS-NEXT: Symbol: func2 (0)
23+
IMPORTS-NEXT: Symbol: func3 (0)
24+
IMPORTS-NEXT: Symbol: func4 (0)
25+
IMPORTS-NEXT: }
26+
27+
#--- test.s
28+
.weak_anti_dep func
29+
.weak_anti_dep "#func"
30+
.set func,"#func"
31+
.set "#func",thunk
32+
33+
.section .test, "r"
34+
.rva __imp_data
35+
.rva func
36+
.rva "#func2"
37+
.rva __imp_aux_func3
38+
.rva __imp_func4
39+
40+
.text
41+
.globl thunk
42+
thunk:
43+
ret
44+
45+
.globl __icall_helper_arm64ec
46+
.p2align 2, 0x0
47+
__icall_helper_arm64ec:
48+
mov w0, #0
49+
ret
50+
51+
#--- dll.s
52+
.text
53+
.globl func
54+
func:
55+
ret
56+
57+
.data
58+
.globl data
59+
data:
60+
.word 0

0 commit comments

Comments
 (0)