// 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