.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