Welcome to mirror list, hosted at ThFree Co, Russian Federation.

github.com/llvm/llvm-project.git - Unnamed repository; edit this file 'description' to name the repository.
summaryrefslogtreecommitdiff
path: root/lld
diff options
context:
space:
mode:
authorSam Clegg <sbc@chromium.org>2022-10-13 19:53:12 +0300
committerSam Clegg <sbc@chromium.org>2022-10-14 00:52:17 +0300
commit1532be98f99384990544bd5289ba339bca61e15b (patch)
treed971a8da96ca7a8454a9bba5adf37df42d67284b /lld
parentf7cd3fc35ef881bb83b9a07090979e428c557bc6 (diff)
[lld][WebAssembly] Add symbols marking start/end of stack region
Currently emscripten is make assumptions about that memory layout, assuming the stack is between `__data_end` and `__heap_base`: https://github.com/emscripten-core/emscripten/blob/af961ad5c4c278ec510f0b7f7d522a95ee5a90f8/system/lib/compiler-rt/stack_limits.S#L42-L61 With this change we can be more precise: https://github.com/emscripten-core/emscripten/pull/18057 Differential Revision: https://reviews.llvm.org/D135910
Diffstat (limited to 'lld')
-rw-r--r--lld/test/wasm/export-all.s14
-rw-r--r--lld/test/wasm/mutable-global-exports.s14
-rw-r--r--lld/wasm/Driver.cpp2
-rw-r--r--lld/wasm/Symbols.cpp2
-rw-r--r--lld/wasm/Symbols.h9
-rw-r--r--lld/wasm/Writer.cpp4
6 files changed, 34 insertions, 11 deletions
diff --git a/lld/test/wasm/export-all.s b/lld/test/wasm/export-all.s
index 009da9f6a381..fa016a30d750 100644
--- a/lld/test/wasm/export-all.s
+++ b/lld/test/wasm/export-all.s
@@ -34,15 +34,21 @@ foo:
# CHECK-NEXT: - Name: __data_end
# CHECK-NEXT: Kind: GLOBAL
# CHECK-NEXT: Index: 2
-# CHECK-NEXT: - Name: __global_base
+# CHECK-NEXT: - Name: __stack_low
# CHECK-NEXT: Kind: GLOBAL
# CHECK-NEXT: Index: 3
-# CHECK-NEXT: - Name: __heap_base
+# CHECK-NEXT: - Name: __stack_high
# CHECK-NEXT: Kind: GLOBAL
# CHECK-NEXT: Index: 4
-# CHECK-NEXT: - Name: __memory_base
+# CHECK-NEXT: - Name: __global_base
# CHECK-NEXT: Kind: GLOBAL
# CHECK-NEXT: Index: 5
-# CHECK-NEXT: - Name: __table_base
+# CHECK-NEXT: - Name: __heap_base
# CHECK-NEXT: Kind: GLOBAL
# CHECK-NEXT: Index: 6
+# CHECK-NEXT: - Name: __memory_base
+# CHECK-NEXT: Kind: GLOBAL
+# CHECK-NEXT: Index: 7
+# CHECK-NEXT: - Name: __table_base
+# CHECK-NEXT: Kind: GLOBAL
+# CHECK-NEXT: Index: 8
diff --git a/lld/test/wasm/mutable-global-exports.s b/lld/test/wasm/mutable-global-exports.s
index 278be3a2e3b1..c85c21f1b4ca 100644
--- a/lld/test/wasm/mutable-global-exports.s
+++ b/lld/test/wasm/mutable-global-exports.s
@@ -80,18 +80,24 @@ _start:
# CHECK-ALL-NEXT: - Name: __data_end
# CHECK-ALL-NEXT: Kind: GLOBAL
# CHECK-ALL-NEXT: Index: 3
-# CHECK-ALL-NEXT: - Name: __global_base
+# CHECK-ALL-NEXT: - Name: __stack_low
# CHECK-ALL-NEXT: Kind: GLOBAL
# CHECK-ALL-NEXT: Index: 4
-# CHECK-ALL-NEXT: - Name: __heap_base
+# CHECK-ALL-NEXT: - Name: __stack_high
# CHECK-ALL-NEXT: Kind: GLOBAL
# CHECK-ALL-NEXT: Index: 5
-# CHECK-ALL-NEXT: - Name: __memory_base
+# CHECK-ALL-NEXT: - Name: __global_base
# CHECK-ALL-NEXT: Kind: GLOBAL
# CHECK-ALL-NEXT: Index: 6
-# CHECK-ALL-NEXT: - Name: __table_base
+# CHECK-ALL-NEXT: - Name: __heap_base
# CHECK-ALL-NEXT: Kind: GLOBAL
# CHECK-ALL-NEXT: Index: 7
+# CHECK-ALL-NEXT: - Name: __memory_base
+# CHECK-ALL-NEXT: Kind: GLOBAL
+# CHECK-ALL-NEXT: Index: 8
+# CHECK-ALL-NEXT: - Name: __table_base
+# CHECK-ALL-NEXT: Kind: GLOBAL
+# CHECK-ALL-NEXT: Index: 9
# CHECK-ALL-NEXT: - Type: CODE
# CHECK-ALL: Name: target_features
diff --git a/lld/wasm/Driver.cpp b/lld/wasm/Driver.cpp
index 62f90d7eaa7b..cb41cf64d5e2 100644
--- a/lld/wasm/Driver.cpp
+++ b/lld/wasm/Driver.cpp
@@ -732,6 +732,8 @@ static void createOptionalSymbols() {
WasmSym::dataEnd = symtab->addOptionalDataSymbol("__data_end");
if (!config->isPic) {
+ WasmSym::stackLow = symtab->addOptionalDataSymbol("__stack_low");
+ WasmSym::stackHigh = symtab->addOptionalDataSymbol("__stack_high");
WasmSym::globalBase = symtab->addOptionalDataSymbol("__global_base");
WasmSym::heapBase = symtab->addOptionalDataSymbol("__heap_base");
WasmSym::definedMemoryBase = symtab->addOptionalDataSymbol("__memory_base");
diff --git a/lld/wasm/Symbols.cpp b/lld/wasm/Symbols.cpp
index e0670cea6425..4ee5125c65ab 100644
--- a/lld/wasm/Symbols.cpp
+++ b/lld/wasm/Symbols.cpp
@@ -85,6 +85,8 @@ DefinedData *WasmSym::globalBase;
DefinedData *WasmSym::heapBase;
DefinedData *WasmSym::initMemoryFlag;
GlobalSymbol *WasmSym::stackPointer;
+DefinedData *WasmSym::stackLow;
+DefinedData *WasmSym::stackHigh;
GlobalSymbol *WasmSym::tlsBase;
GlobalSymbol *WasmSym::tlsSize;
GlobalSymbol *WasmSym::tlsAlign;
diff --git a/lld/wasm/Symbols.h b/lld/wasm/Symbols.h
index d2a0cb0becc3..98aae86b8982 100644
--- a/lld/wasm/Symbols.h
+++ b/lld/wasm/Symbols.h
@@ -516,10 +516,13 @@ struct WasmSym {
// Symbol marking the start of the global section.
static DefinedData *globalBase;
- // __stack_pointer
- // Global that holds the address of the top of the explicit value stack in
- // linear memory.
+ // __stack_pointer/__stack_low/__stack_high
+ // Global that holds current value of stack pointer and data symbols marking
+ // the start and end of the stack region. stackPointer is initialized to
+ // stackHigh and grows downwards towards stackLow
static GlobalSymbol *stackPointer;
+ static DefinedData *stackLow;
+ static DefinedData *stackHigh;
// __tls_base
// Global that holds the address of the base of the current thread's
diff --git a/lld/wasm/Writer.cpp b/lld/wasm/Writer.cpp
index c8377dd0f972..47ac23ff20a1 100644
--- a/lld/wasm/Writer.cpp
+++ b/lld/wasm/Writer.cpp
@@ -242,12 +242,16 @@ void Writer::layoutMemory() {
if (config->relocatable || config->isPic)
return;
memoryPtr = alignTo(memoryPtr, stackAlignment);
+ if (WasmSym::stackLow)
+ WasmSym::stackLow->setVA(memoryPtr);
if (config->zStackSize != alignTo(config->zStackSize, stackAlignment))
error("stack size must be " + Twine(stackAlignment) + "-byte aligned");
log("mem: stack size = " + Twine(config->zStackSize));
log("mem: stack base = " + Twine(memoryPtr));
memoryPtr += config->zStackSize;
setGlobalPtr(cast<DefinedGlobal>(WasmSym::stackPointer), memoryPtr);
+ if (WasmSym::stackHigh)
+ WasmSym::stackHigh->setVA(memoryPtr);
log("mem: stack top = " + Twine(memoryPtr));
};