mirror of
https://github.com/tinygo-org/tinygo.git
synced 2026-08-03 02:27:48 +00:00
49e22fe678
This is a small change to make it easier to support architectures that need to restore more than just the sp and pc registers. In particular, it is needed for the AVR architecture that needs to restore the frame pointer (Y register).
35 lines
1.0 KiB
ArmAsm
35 lines
1.0 KiB
ArmAsm
.section .text.tinygo_scanCurrentStack
|
|
.global tinygo_scanCurrentStack
|
|
.type tinygo_scanCurrentStack, %function
|
|
tinygo_scanCurrentStack:
|
|
// Sources:
|
|
// * https://stackoverflow.com/questions/18024672/what-registers-are-preserved-through-a-linux-x86-64-function-call
|
|
// * https://godbolt.org/z/q7e8dn
|
|
|
|
// Save callee-saved registers.
|
|
pushl %ebx
|
|
pushl %esi
|
|
pushl %edi
|
|
pushl %ebp
|
|
|
|
// Scan the stack.
|
|
subl $8, %esp // adjust the stack before the call to maintain 16-byte alignment
|
|
pushl %esp
|
|
calll tinygo_scanstack
|
|
|
|
// Restore the stack pointer. Registers do not need to be restored as they
|
|
// were only pushed to be discoverable by the GC.
|
|
addl $28, %esp
|
|
retl
|
|
|
|
|
|
.section .text.tinygo_longjmp
|
|
.global tinygo_longjmp
|
|
tinygo_longjmp:
|
|
// Note: the code we jump to assumes eax is set to a non-zero value if we
|
|
// jump from here.
|
|
movl 4(%esp), %eax
|
|
movl 0(%eax), %esp // jumpSP
|
|
movl 4(%eax), %eax // jumpPC (stash in volatile register)
|
|
jmpl *%eax
|