[lld] ecc9aec - [LLD][COFF] Use archive's ECSYMBOLS on ARM64EC target when available. (#106904)

via llvm-commits llvm-commits at lists.llvm.org
Mon Sep 2 14:14:58 PDT 2024


Author: Jacek Caban
Date: 2024-09-02T23:14:55+02:00
New Revision: ecc9aece72989461167ba39541dce51032c0d76d

URL: https://github.com/llvm/llvm-project/commit/ecc9aece72989461167ba39541dce51032c0d76d
DIFF: https://github.com/llvm/llvm-project/commit/ecc9aece72989461167ba39541dce51032c0d76d.diff

LOG: [LLD][COFF] Use archive's ECSYMBOLS on ARM64EC target when available. (#106904)

Added: 
    lld/test/COFF/arm64ec-lib.test

Modified: 
    lld/COFF/InputFiles.cpp

Removed: 
    


################################################################################
diff  --git a/lld/COFF/InputFiles.cpp b/lld/COFF/InputFiles.cpp
index 3ecd4d241f2cd4..e1ea4ebeabc9b8 100644
--- a/lld/COFF/InputFiles.cpp
+++ b/lld/COFF/InputFiles.cpp
@@ -100,6 +100,20 @@ void ArchiveFile::parse() {
   // Parse a MemoryBufferRef as an archive file.
   file = CHECK(Archive::create(mb), this);
 
+  // Try to read symbols from ECSYMBOLS section on ARM64EC.
+  if (isArm64EC(ctx.config.machine)) {
+    iterator_range<Archive::symbol_iterator> symbols =
+        CHECK(file->ec_symbols(), this);
+    if (!symbols.empty()) {
+      for (const Archive::Symbol &sym : symbols)
+        ctx.symtab.addLazyArchive(this, sym);
+
+      // Read both EC and native symbols on ARM64X.
+      if (ctx.config.machine != ARM64X)
+        return;
+    }
+  }
+
   // Read the symbol table to construct Lazy objects.
   for (const Archive::Symbol &sym : file->symbols())
     ctx.symtab.addLazyArchive(this, sym);

diff  --git a/lld/test/COFF/arm64ec-lib.test b/lld/test/COFF/arm64ec-lib.test
new file mode 100644
index 00000000000000..a26c098547fdbe
--- /dev/null
+++ b/lld/test/COFF/arm64ec-lib.test
@@ -0,0 +1,47 @@
+REQUIRES: aarch64, x86
+RUN: split-file %s %t.dir && cd %t.dir
+
+RUN: llvm-mc -filetype=obj -triple=arm64ec-windows symref.s -o symref-arm64ec.obj
+RUN: llvm-mc -filetype=obj -triple=arm64ec-windows nsymref.s -o nsymref-arm64ec.obj
+RUN: llvm-mc -filetype=obj -triple=aarch64-windows nsymref.s -o nsymref-aarch64.obj
+RUN: llvm-mc -filetype=obj -triple=arm64ec-windows sym.s -o sym-arm64ec.obj
+RUN: llvm-mc -filetype=obj -triple=x86_64-windows sym.s -o sym-x86_64.obj
+RUN: llvm-mc -filetype=obj -triple=aarch64-windows nsym.s -o nsym-aarch64.obj
+RUN: llvm-mc -filetype=obj -triple=arm64ec-windows %S/Inputs/loadconfig-arm64ec.s -o loadconfig-arm64ec.obj
+
+RUN: llvm-lib -machine:arm64ec -out:sym-arm64ec.lib sym-arm64ec.obj nsym-aarch64.obj
+RUN: llvm-lib -machine:amd64 -out:sym-x86_64.lib sym-x86_64.obj
+
+Verify that a symbol can be referenced from ECSYMBOLS.
+RUN: lld-link -machine:arm64ec -dll -noentry -out:test.dll symref-arm64ec.obj sym-arm64ec.lib loadconfig-arm64ec.obj
+
+Verify that a symbol can be referenced from a regular archive map when ECSYMBOLS is absent (using an x86_64 archive).
+RUN: lld-link -machine:arm64ec -dll -noentry -out:test2.dll symref-arm64ec.obj sym-x86_64.lib loadconfig-arm64ec.obj
+
+Verify that both native and EC symbols can be referenced in a hybrid target.
+RUN: lld-link -machine:arm64x -dll -noentry -out:test3.dll symref-arm64ec.obj nsymref-aarch64.obj sym-arm64ec.lib loadconfig-arm64ec.obj
+
+Ensure that an EC symbol is not resolved using a regular symbol map.
+RUN: not lld-link -machine:arm64ec -dll -noentry -out:test-err.dll nsymref-arm64ec.obj sym-arm64ec.lib loadconfig-arm64ec.obj 2>&1 |\
+RUN:              FileCheck --check-prefix=ERR %s
+ERR: error: undefined symbol: nsym
+
+#--- symref.s
+    .data
+    .rva sym
+
+#--- nsymref.s
+    .data
+    .rva nsym
+
+#--- sym.s
+     .data
+     .globl sym
+sym:
+     .word 0
+
+#--- nsym.s
+     .data
+     .globl nsym
+nsym:
+     .word 0


        


More information about the llvm-commits mailing list