[lld] [lld][WebAssembly] Do not relocate ABSOLUTE symbols (PR #153763)
YAMAMOTO Takashi via llvm-commits
llvm-commits at lists.llvm.org
Sun Aug 17 18:33:49 PDT 2025
https://github.com/yamt updated https://github.com/llvm/llvm-project/pull/153763
>From 3f65a783f2064a9040f8fcbfddfc3072c52493d8 Mon Sep 17 00:00:00 2001
From: YAMAMOTO Takashi <yamamoto at midokura.com>
Date: Fri, 15 Aug 2025 17:15:22 +0900
Subject: [PATCH 1/3] [lld][WebAssembly] Do not relocate ABSOLUTE symbols
Fixes https://github.com/llvm/llvm-project/issues/153759
---
lld/wasm/SyntheticSections.cpp | 5 ++++-
1 file changed, 4 insertions(+), 1 deletion(-)
diff --git a/lld/wasm/SyntheticSections.cpp b/lld/wasm/SyntheticSections.cpp
index e1192706ea913..6c1c4391ea0d7 100644
--- a/lld/wasm/SyntheticSections.cpp
+++ b/lld/wasm/SyntheticSections.cpp
@@ -442,6 +442,8 @@ void GlobalSection::generateRelocationCode(raw_ostream &os, bool TLS) const {
for (const Symbol *sym : internalGotSymbols) {
if (TLS != sym->isTLS())
continue;
+ if (sym->flags & WASM_SYMBOL_ABSOLUTE)
+ continue;
if (auto *d = dyn_cast<DefinedData>(sym)) {
// Get __memory_base
@@ -503,7 +505,8 @@ void GlobalSection::writeBody() {
bool useExtendedConst = false;
uint32_t globalIdx;
int64_t offset;
- if (ctx.arg.extendedConst && ctx.isPic) {
+ if (ctx.arg.extendedConst && ctx.isPic &&
+ (sym->flags & WASM_SYMBOL_ABSOLUTE) == 0) {
if (auto *d = dyn_cast<DefinedData>(sym)) {
if (!sym->isTLS()) {
globalIdx = ctx.sym.memoryBase->getGlobalIndex();
>From 7cdff15342a8645701fdc1a690a4dc210fb491d6 Mon Sep 17 00:00:00 2001
From: YAMAMOTO Takashi <yamamoto at midokura.com>
Date: Mon, 18 Aug 2025 10:08:15 +0900
Subject: [PATCH 2/3] add a test
---
lld/test/wasm/pie.s | 29 ++++++++++++++++++++++++++---
1 file changed, 26 insertions(+), 3 deletions(-)
diff --git a/lld/test/wasm/pie.s b/lld/test/wasm/pie.s
index 21eac79207318..cac54f887e417 100644
--- a/lld/test/wasm/pie.s
+++ b/lld/test/wasm/pie.s
@@ -2,7 +2,7 @@
# RUN: llvm-mc -filetype=obj -triple=wasm32-unknown-emscripten %S/Inputs/internal_func.s -o %t.internal_func.o
# RUN: wasm-ld --no-gc-sections --experimental-pic -pie --unresolved-symbols=import-dynamic -o %t.wasm %t.o %t.internal_func.o
# RUN: obj2yaml %t.wasm | FileCheck %s
-# RUN: llvm-objdump --disassemble-symbols=__wasm_call_ctors,__wasm_apply_data_relocs --no-show-raw-insn --no-leading-addr %t.wasm | FileCheck %s --check-prefixes DISASSEM
+# RUN: llvm-objdump --disassemble-symbols=__wasm_call_ctors,__wasm_apply_data_relocs,__wasm_apply_global_relocs --no-show-raw-insn --no-leading-addr %t.wasm | FileCheck %s --check-prefixes DISASSEM
.functype external_func () -> ()
.functype internal_func1 () -> (i32)
@@ -41,6 +41,11 @@ foo:
drop
global.get __stack_pointer
+ i32.load 0
+ call_indirect () -> (i32)
+ drop
+
+ global.get __wasm_first_page_end at GOT
end_function
get_data_address:
@@ -145,6 +150,18 @@ _start:
# DISASSEM-LABEL: <__wasm_apply_data_relocs>:
# DISASSEM: end
+# global 6 is __wasm_first_page_end, which is ABSOLUTE and
+# thus should not be relocated.
+#
+# DISASSEM-LABEL: <__wasm_apply_global_relocs>:
+# DISASSEM: global.set 4
+# DISASSEM: global.set 5
+# DISASSEM-NOT: global.set 6
+# DISASSEM: global.set 7
+# DISASSEM: global.set 8
+# DISASSEM: global.set 9
+# DISASSEM: end
+
# Run the same test with extended-const support. When this is available
# we don't need __wasm_apply_global_relocs and instead rely on the add
# instruction in the InitExpr. We also, therefore, do not need these globals
@@ -173,17 +190,23 @@ _start:
# EXTENDED-CONST-NEXT: Type: I32
# EXTENDED-CONST-NEXT: Mutable: false
# EXTENDED-CONST-NEXT: InitExpr:
+# EXTENDED-CONST-NEXT: Opcode: I32_CONST
+# EXTENDED-CONST-NEXT: Value: 65536
+# EXTENDED-CONST-NEXT: - Index: 7
+# EXTENDED-CONST-NEXT: Type: I32
+# EXTENDED-CONST-NEXT: Mutable: false
+# EXTENDED-CONST-NEXT: InitExpr:
# EXTENDED-CONST-NEXT: Extended: true
# This instruction sequence decodes to:
# (global.get[0x23] 0x1 i32.const[0x41] 0x0C i32.add[0x6A] end[0x0b])
# EXTENDED-CONST-NEXT: Body: 2301410C6A0B
-# EXTENDED-CONST-NEXT: - Index: 7
+# EXTENDED-CONST-NEXT: - Index: 8
# EXTENDED-CONST-NEXT: Type: I32
# EXTENDED-CONST-NEXT: Mutable: false
# EXTENDED-CONST-NEXT: InitExpr:
# EXTENDED-CONST-NEXT: Opcode: GLOBAL_GET
# EXTENDED-CONST-NEXT: Index: 2
-# EXTENDED-CONST-NEXT: - Index: 8
+# EXTENDED-CONST-NEXT: - Index: 9
# EXTENDED-CONST-NEXT: Type: I32
# EXTENDED-CONST-NEXT: Mutable: false
# EXTENDED-CONST-NEXT: InitExpr:
>From 08fde9693e0fe06e8530312331790a4107acad83 Mon Sep 17 00:00:00 2001
From: YAMAMOTO Takashi <yamamoto at midokura.com>
Date: Mon, 18 Aug 2025 10:24:10 +0900
Subject: [PATCH 3/3] check ABSOLUTE before TLS
---
lld/wasm/SyntheticSections.cpp | 4 ++--
1 file changed, 2 insertions(+), 2 deletions(-)
diff --git a/lld/wasm/SyntheticSections.cpp b/lld/wasm/SyntheticSections.cpp
index 6c1c4391ea0d7..e26f818fc2ca0 100644
--- a/lld/wasm/SyntheticSections.cpp
+++ b/lld/wasm/SyntheticSections.cpp
@@ -440,10 +440,10 @@ void GlobalSection::generateRelocationCode(raw_ostream &os, bool TLS) const {
: WASM_OPCODE_I32_ADD;
for (const Symbol *sym : internalGotSymbols) {
- if (TLS != sym->isTLS())
- continue;
if (sym->flags & WASM_SYMBOL_ABSOLUTE)
continue;
+ if (TLS != sym->isTLS())
+ continue;
if (auto *d = dyn_cast<DefinedData>(sym)) {
// Get __memory_base
More information about the llvm-commits
mailing list