Skip to content

Commit 1532be9

Browse files
committed
[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: emscripten-core/emscripten#18057 Differential Revision: https://reviews.llvm.org/D135910
1 parent f7cd3fc commit 1532be9

File tree

6 files changed

+34
-11
lines changed

6 files changed

+34
-11
lines changed

lld/test/wasm/export-all.s

Lines changed: 10 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -34,15 +34,21 @@ foo:
3434
# CHECK-NEXT: - Name: __data_end
3535
# CHECK-NEXT: Kind: GLOBAL
3636
# CHECK-NEXT: Index: 2
37-
# CHECK-NEXT: - Name: __global_base
37+
# CHECK-NEXT: - Name: __stack_low
3838
# CHECK-NEXT: Kind: GLOBAL
3939
# CHECK-NEXT: Index: 3
40-
# CHECK-NEXT: - Name: __heap_base
40+
# CHECK-NEXT: - Name: __stack_high
4141
# CHECK-NEXT: Kind: GLOBAL
4242
# CHECK-NEXT: Index: 4
43-
# CHECK-NEXT: - Name: __memory_base
43+
# CHECK-NEXT: - Name: __global_base
4444
# CHECK-NEXT: Kind: GLOBAL
4545
# CHECK-NEXT: Index: 5
46-
# CHECK-NEXT: - Name: __table_base
46+
# CHECK-NEXT: - Name: __heap_base
4747
# CHECK-NEXT: Kind: GLOBAL
4848
# CHECK-NEXT: Index: 6
49+
# CHECK-NEXT: - Name: __memory_base
50+
# CHECK-NEXT: Kind: GLOBAL
51+
# CHECK-NEXT: Index: 7
52+
# CHECK-NEXT: - Name: __table_base
53+
# CHECK-NEXT: Kind: GLOBAL
54+
# CHECK-NEXT: Index: 8

lld/test/wasm/mutable-global-exports.s

Lines changed: 10 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -80,18 +80,24 @@ _start:
8080
# CHECK-ALL-NEXT: - Name: __data_end
8181
# CHECK-ALL-NEXT: Kind: GLOBAL
8282
# CHECK-ALL-NEXT: Index: 3
83-
# CHECK-ALL-NEXT: - Name: __global_base
83+
# CHECK-ALL-NEXT: - Name: __stack_low
8484
# CHECK-ALL-NEXT: Kind: GLOBAL
8585
# CHECK-ALL-NEXT: Index: 4
86-
# CHECK-ALL-NEXT: - Name: __heap_base
86+
# CHECK-ALL-NEXT: - Name: __stack_high
8787
# CHECK-ALL-NEXT: Kind: GLOBAL
8888
# CHECK-ALL-NEXT: Index: 5
89-
# CHECK-ALL-NEXT: - Name: __memory_base
89+
# CHECK-ALL-NEXT: - Name: __global_base
9090
# CHECK-ALL-NEXT: Kind: GLOBAL
9191
# CHECK-ALL-NEXT: Index: 6
92-
# CHECK-ALL-NEXT: - Name: __table_base
92+
# CHECK-ALL-NEXT: - Name: __heap_base
9393
# CHECK-ALL-NEXT: Kind: GLOBAL
9494
# CHECK-ALL-NEXT: Index: 7
95+
# CHECK-ALL-NEXT: - Name: __memory_base
96+
# CHECK-ALL-NEXT: Kind: GLOBAL
97+
# CHECK-ALL-NEXT: Index: 8
98+
# CHECK-ALL-NEXT: - Name: __table_base
99+
# CHECK-ALL-NEXT: Kind: GLOBAL
100+
# CHECK-ALL-NEXT: Index: 9
95101
# CHECK-ALL-NEXT: - Type: CODE
96102

97103
# CHECK-ALL: Name: target_features

lld/wasm/Driver.cpp

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -732,6 +732,8 @@ static void createOptionalSymbols() {
732732
WasmSym::dataEnd = symtab->addOptionalDataSymbol("__data_end");
733733

734734
if (!config->isPic) {
735+
WasmSym::stackLow = symtab->addOptionalDataSymbol("__stack_low");
736+
WasmSym::stackHigh = symtab->addOptionalDataSymbol("__stack_high");
735737
WasmSym::globalBase = symtab->addOptionalDataSymbol("__global_base");
736738
WasmSym::heapBase = symtab->addOptionalDataSymbol("__heap_base");
737739
WasmSym::definedMemoryBase = symtab->addOptionalDataSymbol("__memory_base");

lld/wasm/Symbols.cpp

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -85,6 +85,8 @@ DefinedData *WasmSym::globalBase;
8585
DefinedData *WasmSym::heapBase;
8686
DefinedData *WasmSym::initMemoryFlag;
8787
GlobalSymbol *WasmSym::stackPointer;
88+
DefinedData *WasmSym::stackLow;
89+
DefinedData *WasmSym::stackHigh;
8890
GlobalSymbol *WasmSym::tlsBase;
8991
GlobalSymbol *WasmSym::tlsSize;
9092
GlobalSymbol *WasmSym::tlsAlign;

lld/wasm/Symbols.h

Lines changed: 6 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -516,10 +516,13 @@ struct WasmSym {
516516
// Symbol marking the start of the global section.
517517
static DefinedData *globalBase;
518518

519-
// __stack_pointer
520-
// Global that holds the address of the top of the explicit value stack in
521-
// linear memory.
519+
// __stack_pointer/__stack_low/__stack_high
520+
// Global that holds current value of stack pointer and data symbols marking
521+
// the start and end of the stack region. stackPointer is initialized to
522+
// stackHigh and grows downwards towards stackLow
522523
static GlobalSymbol *stackPointer;
524+
static DefinedData *stackLow;
525+
static DefinedData *stackHigh;
523526

524527
// __tls_base
525528
// Global that holds the address of the base of the current thread's

lld/wasm/Writer.cpp

Lines changed: 4 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -242,12 +242,16 @@ void Writer::layoutMemory() {
242242
if (config->relocatable || config->isPic)
243243
return;
244244
memoryPtr = alignTo(memoryPtr, stackAlignment);
245+
if (WasmSym::stackLow)
246+
WasmSym::stackLow->setVA(memoryPtr);
245247
if (config->zStackSize != alignTo(config->zStackSize, stackAlignment))
246248
error("stack size must be " + Twine(stackAlignment) + "-byte aligned");
247249
log("mem: stack size = " + Twine(config->zStackSize));
248250
log("mem: stack base = " + Twine(memoryPtr));
249251
memoryPtr += config->zStackSize;
250252
setGlobalPtr(cast<DefinedGlobal>(WasmSym::stackPointer), memoryPtr);
253+
if (WasmSym::stackHigh)
254+
WasmSym::stackHigh->setVA(memoryPtr);
251255
log("mem: stack top = " + Twine(memoryPtr));
252256
};
253257

0 commit comments

Comments
 (0)