[lld] 6d51c31 - [lld][WebAssembly] LTO: Use PIC reloc model with dynamic imports (#165342)

via llvm-commits llvm-commits at lists.llvm.org
Tue Oct 28 14:46:26 PDT 2025


Author: Sam Clegg
Date: 2025-10-28T14:46:22-07:00
New Revision: 6d51c31679a38b237ce2103bfc2c79034636841f

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

LOG: [lld][WebAssembly] LTO: Use PIC reloc model with dynamic imports (#165342)

Added: 
    

Modified: 
    lld/test/wasm/lto/relocation-model.ll
    lld/wasm/LTO.cpp

Removed: 
    


################################################################################
diff  --git a/lld/test/wasm/lto/relocation-model.ll b/lld/test/wasm/lto/relocation-model.ll
index 8fe198d0c64e6..a042615b8fe1c 100644
--- a/lld/test/wasm/lto/relocation-model.ll
+++ b/lld/test/wasm/lto/relocation-model.ll
@@ -8,6 +8,11 @@
 ; RUN: wasm-ld %t.o -o %t_static.wasm -save-temps -r -mllvm -relocation-model=static
 ; RUN: llvm-readobj -r %t_static.wasm.lto.o | FileCheck %s --check-prefix=STATIC
 
+;; Linking with --unresolved-symbols=import-dynamic should also generate PIC
+;; code for external references.
+; RUN: wasm-ld %t.o -o %t_import.wasm -save-temps --experimental-pic --unresolved-symbols=import-dynamic
+; RUN: llvm-readobj -r %t_import.wasm.lto.o | FileCheck %s --check-prefix=PIC
+
 ; PIC: R_WASM_GLOBAL_INDEX_LEB foo
 ; STATIC: R_WASM_MEMORY_ADDR_LEB foo
 

diff  --git a/lld/wasm/LTO.cpp b/lld/wasm/LTO.cpp
index ae85f4693214b..668cdf21ea3ed 100644
--- a/lld/wasm/LTO.cpp
+++ b/lld/wasm/LTO.cpp
@@ -63,6 +63,12 @@ static lto::Config createConfig() {
     c.RelocModel = std::nullopt;
   else if (ctx.isPic)
     c.RelocModel = Reloc::PIC_;
+  else if (ctx.arg.unresolvedSymbols == UnresolvedPolicy::ImportDynamic)
+    // With ImportDynamic we also need to use the PIC relocation model so that
+    // external symbols are references via the GOT.
+    // TODO(sbc): This should probably be Reloc::DynamicNoPIC, but the backend
+    // doesn't currently support that.
+    c.RelocModel = Reloc::PIC_;
   else
     c.RelocModel = Reloc::Static;
 


        


More information about the llvm-commits mailing list