[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