summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorSam Clegg <sbc@chromium.org>2019-07-11 13:13:25 +0000
committerSam Clegg <sbc@chromium.org>2019-07-11 13:13:25 +0000
commitfd11ce32bb8ddc7994bee584d18085ca9f09667c (patch)
tree5e56f765bb648d839f4c522c3befa5ff0d123d5c
parent67828edbbd6f7b63149056b37d7ece10691d23ae (diff)
downloadbcm5719-llvm-fd11ce32bb8ddc7994bee584d18085ca9f09667c.tar.gz
bcm5719-llvm-fd11ce32bb8ddc7994bee584d18085ca9f09667c.zip
[WebAssembly] Import __stack_pointer when building -pie binaries
The -pie binary doesn't know that layout ahead of time so needs to import the stack pointer from the embedder, just like we do already for shared libraries. This change is needed in order to address: https://github.com/emscripten-core/emscripten/issues/8915 Differential Revision: https://reviews.llvm.org/D64516 llvm-svn: 365771
-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