checkasm: arm: report the first clobbered register in checkasm_checked_call

This commit is contained in:
Janne Grunau 2016-07-14 23:16:14 +02:00
parent a8fce24b9c
commit 71a0472114

View File

@ -33,8 +33,12 @@ const register_init, align=3
.quad 0x249214109d5d1c88 .quad 0x249214109d5d1c88
endconst endconst
const error_message const error_message_fpscr
.asciz "failed to preserve register" .asciz "failed to preserve register FPSCR"
const error_message_gpr
.asciz "failed to preserve register r%d"
const error_message_vfp
.asciz "failed to preserve register d%d"
endconst endconst
@ max number of args used by any asm function. @ max number of args used by any asm function.
@ -79,39 +83,42 @@ function checkasm_checked_call_\variant, export=1
push {r0, r1} push {r0, r1}
movrel r12, register_init movrel r12, register_init
mov r3, #0
.ifc \variant, vfp .ifc \variant, vfp
.macro check_reg_vfp, dreg, inc=8 .macro check_reg_vfp, dreg, offset
ldrd r0, r1, [r12], #\inc vldr d0, [r12, #8 * (\offset)]
vmov r2, lr, \dreg veor d0, d0, \dreg
eor r0, r0, r2 vmov r2, r3, d0
eor r1, r1, lr orrs r2, r2, r3
orr r3, r3, r0 bne 4f
orr r3, r3, r1
.endm .endm
.irp n, 8, 9, 10, 11, 12, 13, 14 .irp n, 8, 9, 10, 11, 12, 13, 14, 15
check_reg_vfp d\n @ keep track of the checked double/SIMD register
mov r1, #\n
check_reg_vfp d\n, \n-8
.endr .endr
check_reg_vfp d15, -56
.purgem check_reg_vfp .purgem check_reg_vfp
fmrx r0, FPSCR fmrx r0, FPSCR
ldr r1, [sp, #8] ldr r3, [sp, #8]
eor r0, r0, r1 eor r0, r0, r3
@ Ignore changes in the topmost 5 bits @ Ignore changes in the topmost 5 bits
lsl r0, r0, #5 lsls r0, r0, #5
orr r3, r3, r0 bne 3f
.endif .endif
@ keep track of the checked GPR
mov r1, #4
.macro check_reg reg1, reg2= .macro check_reg reg1, reg2=
ldrd r0, r1, [r12], #8 ldrd r2, r3, [r12], #8
eor r0, r0, \reg1 eors r2, r2, \reg1
orrs r3, r3, r0 bne 2f
add r1, r1, #1
.ifnb \reg2 .ifnb \reg2
eor r1, r1, \reg2 eors r3, r3, \reg2
orrs r3, r3, r1 bne 2f
.endif .endif
add r1, r1, #1
.endm .endm
check_reg r4, r5 check_reg r4, r5
check_reg r6, r7 check_reg r6, r7
@ -124,9 +131,16 @@ function checkasm_checked_call_\variant, export=1
check_reg r10, r11 check_reg r10, r11
.purgem check_reg .purgem check_reg
beq 0f b 0f
4:
movrel r0, error_message movrel r0, error_message_vfp
b 1f
3:
movrel r0, error_message_fpscr
b 1f
2:
movrel r0, error_message_gpr
1:
blx X(checkasm_fail_func) blx X(checkasm_fail_func)
0: 0:
pop {r0, r1} pop {r0, r1}