[compiler-rt][libunwind] Support aarch64 without FPU (#111235)
These two libraries don't build for `-march=armv8-a+nofp -mabi=aapcs-soft` as a couple of uses of floating point instructions and registers have crept in. In libunwind, skip save/restore of FPU registers on targets without them. In compiler-rt, fall back to the old C implementation of __arm_sc_memset when the target doesn't have an FPU. --------- Signed-off-by: Keith Packard <keithp@keithp.com>
This commit is contained in:
@@ -658,7 +658,7 @@ DEFINE_LIBUNWIND_FUNCTION(__libunwind_Registers_arm64_jumpto)
|
||||
ldp x26,x27, [x0, #0x0D0]
|
||||
ldp x28,x29, [x0, #0x0E0]
|
||||
ldr x30, [x0, #0x100] // restore pc into lr
|
||||
|
||||
#if defined(__ARM_FP) && __ARM_FP != 0
|
||||
ldp d0, d1, [x0, #0x110]
|
||||
ldp d2, d3, [x0, #0x120]
|
||||
ldp d4, d5, [x0, #0x130]
|
||||
@@ -676,7 +676,7 @@ DEFINE_LIBUNWIND_FUNCTION(__libunwind_Registers_arm64_jumpto)
|
||||
ldp d28,d29, [x0, #0x1F0]
|
||||
ldr d30, [x0, #0x200]
|
||||
ldr d31, [x0, #0x208]
|
||||
|
||||
#endif
|
||||
// Finally, restore sp. This must be done after the last read from the
|
||||
// context struct, because it is allocated on the stack, and an exception
|
||||
// could clobber the de-allocated portion of the stack after sp has been
|
||||
|
||||
@@ -746,6 +746,7 @@ DEFINE_LIBUNWIND_FUNCTION(__unw_getcontext)
|
||||
str x1, [x0, #0x0F8]
|
||||
str x30, [x0, #0x100] // store return address as pc
|
||||
// skip cpsr
|
||||
#if defined(__ARM_FP) && __ARM_FP != 0
|
||||
stp d0, d1, [x0, #0x110]
|
||||
stp d2, d3, [x0, #0x120]
|
||||
stp d4, d5, [x0, #0x130]
|
||||
@@ -763,6 +764,7 @@ DEFINE_LIBUNWIND_FUNCTION(__unw_getcontext)
|
||||
stp d28,d29, [x0, #0x1F0]
|
||||
str d30, [x0, #0x200]
|
||||
str d31, [x0, #0x208]
|
||||
#endif
|
||||
mov x0, #0 // return UNW_ESUCCESS
|
||||
ret
|
||||
|
||||
|
||||
Reference in New Issue
Block a user