diff options
author | Henrik Gramner <henrik@gramner.com> | 2015-09-23 17:06:02 +0300 |
---|---|---|
committer | Henrik Gramner <henrik@gramner.com> | 2015-09-27 21:21:26 +0300 |
commit | 7ca1de5b4f1a369a997c5cf9924b0197606f558d (patch) | |
tree | 21d9d24b3669c4ddba76494d70a726c5b990c305 /tests/checkasm | |
parent | 6e61231d641b23d9d298b31e9241371f5e7abddb (diff) |
checkasm/x86: Correctly handle variadic functions
The System V ABI on x86-64 specifies that the al register contains an upper
bound of the number of arguments passed in vector registers when calling
variadic functions, so we aren't allowed to clobber it.
checkasm_fail_func() is a variadic function so also zero al before calling it.
Diffstat (limited to 'tests/checkasm')
-rw-r--r-- | tests/checkasm/x86/checkasm.asm | 7 |
1 files changed, 5 insertions, 2 deletions
diff --git a/tests/checkasm/x86/checkasm.asm b/tests/checkasm/x86/checkasm.asm index 5f3def9e57..20012f8ecb 100644 --- a/tests/checkasm/x86/checkasm.asm +++ b/tests/checkasm/x86/checkasm.asm @@ -77,8 +77,10 @@ cglobal stack_clobber, 1,2 %if WIN64 %assign free_regs 7 + DECLARE_REG_TMP 4 %else %assign free_regs 9 + DECLARE_REG_TMP 7 %endif ;----------------------------------------------------------------------------- @@ -86,7 +88,7 @@ cglobal stack_clobber, 1,2 ;----------------------------------------------------------------------------- INIT_XMM cglobal checked_call, 2,15,16,max_args*8+8 - mov r6, r0 + mov t0, r0 ; All arguments have been pushed on the stack instead of registers in order to ; test for incorrect assumptions that 32-bit ints are zero-extended to 64-bit. @@ -129,7 +131,7 @@ cglobal checked_call, 2,15,16,max_args*8+8 mov r %+ i, [n %+ i] %assign i i-1 %endrep - call r6 + call t0 %assign i 14 %rep 15-free_regs xor r %+ i, [n %+ i] @@ -156,6 +158,7 @@ cglobal checked_call, 2,15,16,max_args*8+8 mov r9, rax mov r10, rdx lea r0, [error_message] + xor eax, eax call fail_func mov rdx, r10 mov rax, r9 |