rt: Have __morestack conform to the calling convention that LLVM generates on x86
This commit is contained in:
parent
151aaf84ce
commit
956812bda5
@ -8,31 +8,34 @@
|
||||
#if defined(__APPLE__) || defined(_WIN32)
|
||||
#define RUST_NEW_STACK _rust_new_stack
|
||||
#define RUST_DEL_STACK _rust_del_stack
|
||||
#define MORESTACK ___morestack
|
||||
#else
|
||||
#define RUST_NEW_STACK rust_new_stack
|
||||
#define RUST_DEL_STACK rust_del_stack
|
||||
#define MORESTACK __morestack
|
||||
#endif
|
||||
|
||||
.globl RUST_NEW_STACK
|
||||
.globl RUST_DEL_STACK
|
||||
|
||||
.globl __morestack
|
||||
.globl MORESTACK
|
||||
|
||||
__morestack:
|
||||
pushl %edx // param 2: size of arguments
|
||||
leal 8(%esp),%eax
|
||||
pushl %eax // param 1: starting addr of arguments
|
||||
pushl %ecx // param 0: amount of space needed
|
||||
MORESTACK:
|
||||
pushl 8(%esp) // argsz > ra stksz argsz x x ra args
|
||||
leal 28(%esp),%eax // argsz ra stksz argsz x x ra args
|
||||
pushl %eax // argp > argsz ra stksz argsz x x ra args
|
||||
pushl 12(%esp) // stksz > argp argsz ra stksz argsz x x ra args
|
||||
calll RUST_NEW_STACK
|
||||
addl $12,%esp // ra stksz argsz x x ra args
|
||||
|
||||
movl (%esp),%edx // Grab the return pointer.
|
||||
incl %edx // Skip past the `ret`.
|
||||
movl %eax,%esp // Switch to the new stack.
|
||||
calll *%edx // Enter the new function.
|
||||
calll *%edx // Re-enter the function that called us.
|
||||
|
||||
// Now the function that called us has returned, so we need to delete the
|
||||
// old stack space.
|
||||
calll RUST_DEL_STACK
|
||||
movl %eax,%esp // Switch back to the old stack.
|
||||
retl
|
||||
movl %eax,%esp
|
||||
retl $8 // ra stksz argsz x x ra args
|
||||
|
||||
|
Loading…
Reference in New Issue
Block a user