diff options
author | Sam Clegg <sbc@chromium.org> | 2019-07-11 13:13:25 +0000 |
---|---|---|
committer | Sam Clegg <sbc@chromium.org> | 2019-07-11 13:13:25 +0000 |
commit | fd11ce32bb8ddc7994bee584d18085ca9f09667c (patch) | |
tree | 5e56f765bb648d839f4c522c3befa5ff0d123d5c | |
parent | 67828edbbd6f7b63149056b37d7ece10691d23ae (diff) | |
download | bcm5719-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.ll | 5 | ||||
-rw-r--r-- | lld/wasm/Driver.cpp | 31 | ||||
-rw-r--r-- | lld/wasm/Writer.cpp | 2 |
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)) |