
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).
48 строки
1,2 КиБ
ArmAsm
48 строки
1,2 КиБ
ArmAsm
// Only generate .debug_frame, don't generate .eh_frame.
|
|
.cfi_sections .debug_frame
|
|
|
|
.section .text.tinygo_scanCurrentStack
|
|
.global tinygo_scanCurrentStack
|
|
.type tinygo_scanCurrentStack, %function
|
|
tinygo_scanCurrentStack:
|
|
.cfi_startproc
|
|
// Save callee-saved registers onto the stack.
|
|
#if defined(__thumb2__)
|
|
push {r4-r11, lr}
|
|
.cfi_def_cfa_offset 9*4
|
|
#else
|
|
mov r0, r8
|
|
mov r1, r9
|
|
mov r2, r10
|
|
mov r3, r11
|
|
push {r0-r3, lr}
|
|
.cfi_def_cfa_offset 5*4
|
|
push {r4-r7}
|
|
.cfi_def_cfa_offset 4*4
|
|
#endif
|
|
|
|
// Scan the stack.
|
|
mov r0, sp
|
|
bl tinygo_scanstack
|
|
|
|
// Restore stack state and return.
|
|
add sp, #32
|
|
.cfi_def_cfa_offset 1*4
|
|
pop {pc}
|
|
.cfi_endproc
|
|
.size tinygo_scanCurrentStack, .-tinygo_scanCurrentStack
|
|
|
|
|
|
.section .text.tinygo_longjmp
|
|
.global tinygo_longjmp
|
|
.type tinygo_longjmp, %function
|
|
tinygo_longjmp:
|
|
.cfi_startproc
|
|
// Note: the code we jump to assumes r0 is set to a non-zero value if we
|
|
// jump from here (which is conveniently already the case).
|
|
|
|
ldm r0, {r0, r1}
|
|
mov sp, r0 // jumpSP
|
|
mov pc, r1 // jumpPC
|
|
.cfi_endproc
|
|
.size tinygo_longjmp, .-tinygo_longjmp
|