blob: 628345fc3df7544cd3ac2da245d0d481e0e4b799 [file] [log] [blame] [edit]
.globl emscripten_stack_init
.globl emscripten_stack_set_limits
.globl emscripten_stack_get_free
.globl emscripten_stack_get_base
.globl emscripten_stack_get_end
#ifdef __wasm64__
#define PTR i64
#define ALIGN 3
#define PTRSTORE .int64
#else
#define PTR i32
#define ALIGN 2
#define PTRSTORE .int32
#endif
.globaltype __stack_pointer, PTR
# TODO(sbc): It would be nice if these we initialized directly
# using PTR.const rather than using the `emscripten_stack_init`
.globaltype __stack_end, PTR
__stack_end:
.globaltype __stack_base, PTR
__stack_base:
emscripten_stack_get_base:
.functype emscripten_stack_get_base () -> (PTR)
global.get __stack_base
end_function
emscripten_stack_get_end:
.functype emscripten_stack_get_end () -> (PTR)
global.get __stack_end
end_function
emscripten_stack_init:
# Initialize __stack_end and __stack_base.
# This must be called before emscripten_stack_get_end,
# emscripten_stack_get_base, or emscripten_stack_get_free are called
.functype emscripten_stack_init () -> ()
# The heap base is where the stack grown down from.
#ifdef __PIC__
global.get __heap_base@GOT
#else
PTR.const __heap_base
#endif
global.set __stack_base
# The end of stack data is the limit of the stack growth
#ifdef __PIC__
global.get __data_end@GOT
#else
PTR.const __data_end
#endif
# Align up to 16 bytes
PTR.const 0xf
PTR.add
PTR.const -0x10
PTR.and
global.set __stack_end
end_function
emscripten_stack_set_limits:
.functype emscripten_stack_set_limits (PTR, PTR) -> ()
local.get 0
global.set __stack_base
local.get 1
global.set __stack_end
end_function
emscripten_stack_get_free:
.functype emscripten_stack_get_free () -> (PTR)
global.get __stack_pointer
global.get __stack_end
PTR.sub
end_function
# Add emscripten_stack_init to static ctors
.section .init_array.1,"",@
.p2align ALIGN
PTRSTORE emscripten_stack_init