[lld] r365771 - [WebAssembly] Import __stack_pointer when building -pie binaries

Sam Clegg via llvm-commits llvm-commits at lists.llvm.org
Thu Jul 11 06:13:25 PDT 2019


Author: sbc
Date: Thu Jul 11 06:13:25 2019
New Revision: 365771

URL: http://llvm.org/viewvc/llvm-project?rev=365771&view=rev
Log:
[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

Modified:
    lld/trunk/test/wasm/pie.ll
    lld/trunk/wasm/Driver.cpp
    lld/trunk/wasm/Writer.cpp

Modified: lld/trunk/test/wasm/pie.ll
URL: http://llvm.org/viewvc/llvm-project/lld/trunk/test/wasm/pie.ll?rev=365771&r1=365770&r2=365771&view=diff
==============================================================================
--- lld/trunk/test/wasm/pie.ll (original)
+++ lld/trunk/test/wasm/pie.ll Thu Jul 11 06:13:25 2019
@@ -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

Modified: lld/trunk/wasm/Driver.cpp
URL: http://llvm.org/viewvc/llvm-project/lld/trunk/wasm/Driver.cpp?rev=365771&r1=365770&r2=365771&view=diff
==============================================================================
--- lld/trunk/wasm/Driver.cpp (original)
+++ lld/trunk/wasm/Driver.cpp Thu Jul 11 06:13:25 2019
@@ -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);
 }

Modified: lld/trunk/wasm/Writer.cpp
URL: http://llvm.org/viewvc/llvm-project/lld/trunk/wasm/Writer.cpp?rev=365771&r1=365770&r2=365771&view=diff
==============================================================================
--- lld/trunk/wasm/Writer.cpp (original)
+++ lld/trunk/wasm/Writer.cpp Thu Jul 11 06:13:25 2019
@@ -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))




More information about the llvm-commits mailing list