summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
-rw-r--r--lld/test/wasm/pie.ll5
-rw-r--r--lld/wasm/Driver.cpp31
-rw-r--r--lld/wasm/Writer.cpp2
3 files changed, 20 insertions, 18 deletions
diff --git a/lld/test/wasm/pie.ll b/lld/test/wasm/pie.ll
index e7aa243e272..c576e7c7bf7 100644
--- a/lld/test/wasm/pie.ll
+++ b/lld/test/wasm/pie.ll
@@ -40,6 +40,11 @@ define void @_start() {
; CHECK-NEXT: Limits:
; CHECK-NEXT: Initial: 0x00000001
; CHECK-NEXT: - Module: env
+; CHECK-NEXT: Field: __stack_pointer
+; CHECK-NEXT: Kind: GLOBAL
+; CHECK-NEXT: GlobalType: I32
+; CHECK-NEXT: GlobalMutable: true
+; CHECK-NEXT: - Module: env
; CHECK-NEXT: Field: __memory_base
; CHECK-NEXT: Kind: GLOBAL
; CHECK-NEXT: GlobalType: I32
diff --git a/lld/wasm/Driver.cpp b/lld/wasm/Driver.cpp
index d190dba7eac..3de69954e0a 100644
--- a/lld/wasm/Driver.cpp
+++ b/lld/wasm/Driver.cpp
@@ -482,11 +482,22 @@ static void createSyntheticSymbols() {
}
}
- // The __stack_pointer is imported in the shared library case, and exported
- // in the non-shared (executable) case.
- if (config->shared) {
+ if (!config->shared)
+ WasmSym::dataEnd = symtab->addOptionalDataSymbol("__data_end");
+
+ if (config->isPic) {
WasmSym::stackPointer =
createUndefinedGlobal("__stack_pointer", &mutableGlobalTypeI32);
+ // For PIC code, we import two global variables (__memory_base and
+ // __table_base) from the environment and use these as the offset at
+ // which to load our static data and function table.
+ // See:
+ // https://github.com/WebAssembly/tool-conventions/blob/master/DynamicLinking.md
+ WasmSym::memoryBase =
+ createUndefinedGlobal("__memory_base", &globalTypeI32);
+ WasmSym::tableBase = createUndefinedGlobal("__table_base", &globalTypeI32);
+ WasmSym::memoryBase->markLive();
+ WasmSym::tableBase->markLive();
} else {
llvm::wasm::WasmGlobal global;
global.Type = {WASM_TYPE_I32, true};
@@ -501,24 +512,10 @@ static void createSyntheticSymbols() {
// See: https://github.com/WebAssembly/mutable-global
WasmSym::stackPointer = symtab->addSyntheticGlobal(
"__stack_pointer", WASM_SYMBOL_VISIBILITY_HIDDEN, stackPointer);
- WasmSym::dataEnd = symtab->addOptionalDataSymbol("__data_end");
WasmSym::globalBase = symtab->addOptionalDataSymbol("__global_base");
WasmSym::heapBase = symtab->addOptionalDataSymbol("__heap_base");
}
- if (config->isPic) {
- // For PIC code, we import two global variables (__memory_base and
- // __table_base) from the environment and use these as the offset at
- // which to load our static data and function table.
- // See:
- // https://github.com/WebAssembly/tool-conventions/blob/master/DynamicLinking.md
- WasmSym::memoryBase =
- createUndefinedGlobal("__memory_base", &globalTypeI32);
- WasmSym::tableBase = createUndefinedGlobal("__table_base", &globalTypeI32);
- WasmSym::memoryBase->markLive();
- WasmSym::tableBase->markLive();
- }
-
WasmSym::dsoHandle = symtab->addSyntheticDataSymbol(
"__dso_handle", WASM_SYMBOL_VISIBILITY_HIDDEN);
}
diff --git a/lld/wasm/Writer.cpp b/lld/wasm/Writer.cpp
index 11c4b913fd3..1a353440620 100644
--- a/lld/wasm/Writer.cpp
+++ b/lld/wasm/Writer.cpp
@@ -204,7 +204,7 @@ void Writer::layoutMemory() {
uint32_t memoryPtr = 0;
auto placeStack = [&]() {
- if (config->relocatable || config->shared)
+ if (config->relocatable || config->isPic)
return;
memoryPtr = alignTo(memoryPtr, stackAlignment);
if (config->zStackSize != alignTo(config->zStackSize, stackAlignment))
OpenPOWER on IntegriCloud