diff options
| author | Valerii Hiora <valerii.hiora@gmail.com> | 2015-01-07 12:24:18 +0200 |
|---|---|---|
| committer | Valerii Hiora <valerii.hiora@gmail.com> | 2015-01-09 18:38:30 +0200 |
| commit | a945f288ffc3c4db6ab1539e6de7df07d898cdb5 (patch) | |
| tree | ab3fb6957226ac31ae67211738db75ea8c15ff82 /src/rt/arch/armv7/morestack.S | |
| parent | ea045d2055638a6cf66e4bd675c6f7deec7a8d8b (diff) | |
| download | rust-a945f288ffc3c4db6ab1539e6de7df07d898cdb5.tar.gz rust-a945f288ffc3c4db6ab1539e6de7df07d898cdb5.zip | |
iOS: makefiles and runtime for new archs
Diffstat (limited to 'src/rt/arch/armv7/morestack.S')
| -rw-r--r-- | src/rt/arch/armv7/morestack.S | 70 |
1 files changed, 70 insertions, 0 deletions
diff --git a/src/rt/arch/armv7/morestack.S b/src/rt/arch/armv7/morestack.S new file mode 100644 index 00000000000..0b9012cc2a8 --- /dev/null +++ b/src/rt/arch/armv7/morestack.S @@ -0,0 +1,70 @@ +// Mark stack as non-executable +#if defined(__linux__) && defined(__ELF__) +.section .note.GNU-stack, "", %progbits +#endif + +/* See i386/morestack.S for the lengthy, general explanation. */ + +.text +.code 32 +.arm +#if defined(__APPLE__) +.align 2 +#else +.align +#endif + +#if defined(__APPLE__) +#define MORESTACK ___morestack +#define STACK_EXHAUSTED _rust_stack_exhausted +#else +#define MORESTACK __morestack +#define STACK_EXHAUSTED rust_stack_exhausted +#endif + +.global STACK_EXHAUSTED +.global MORESTACK + +// Unfortunately LLVM yet doesn't support emitting correct debug +// DWARF information for non-ELF targets so to make it compile +// on iOS all that directives are simply commented out +#if defined(__APPLE__) +#define UNWIND @ +#else +#define UNWIND +#endif + +#if defined(__APPLE__) +.private_extern MORESTACK +#else +.hidden MORESTACK +#endif + +#if !defined(__APPLE__) + .type MORESTACK,%function +#endif + +// r4 and r5 are scratch registers for __morestack due to llvm +// ARMFrameLowering::adjustForSegmentedStacks() implementation. +MORESTACK: + UNWIND .fnstart + + // Save frame pointer and return address + UNWIND .save {r4, r5} + UNWIND .save {lr} + UNWIND .save {r6, fp, lr} + push {r6, fp, lr} + + UNWIND .movsp r6 + mov r6, sp + UNWIND .setfp fp, sp, #4 + add fp, sp, #4 + + // Save argument registers of the original function + push {r0, r1, r2, r3, lr} + + // Create new stack + bl STACK_EXHAUSTED@plt + + // the above function ensures that it never returns + UNWIND .fnend |
