diff options
author | Uros Bizjak <ubizjak@gmail.com> | 2015-06-03 17:46:41 +0200 |
---|---|---|
committer | Uros Bizjak <uros@gcc.gnu.org> | 2015-06-03 17:46:41 +0200 |
commit | 27a0b7f2ee9689c9a0092a6403edacdcb7158516 (patch) | |
tree | 2747f9a15d221bfbb9ad62dd70a5659cc7d7e05d /gcc/config | |
parent | bc51ace3600b5c9b5dcad09f16858e5727866e27 (diff) | |
download | gcc-27a0b7f2ee9689c9a0092a6403edacdcb7158516.zip gcc-27a0b7f2ee9689c9a0092a6403edacdcb7158516.tar.gz gcc-27a0b7f2ee9689c9a0092a6403edacdcb7158516.tar.bz2 |
re PR target/66275 (__attribute__((sysv_abi)) with x86_64-w64-mingw32-gcc generates incorrect code)
PR target/66275
* config/i386/i386.c (ix86_function_arg_regno): Use ix86_cfun_abi
to determine current function ABI.
(ix86_function_value_regno_p): Ditto.
testsuite/ChangeLog:
PR target/66275
* gcc.target/i386/pr66275.c: New test.
From-SVN: r224094
Diffstat (limited to 'gcc/config')
-rw-r--r-- | gcc/config/i386/i386.c | 15 |
1 files changed, 9 insertions, 6 deletions
diff --git a/gcc/config/i386/i386.c b/gcc/config/i386/i386.c index e77cd04..de8ce37 100644 --- a/gcc/config/i386/i386.c +++ b/gcc/config/i386/i386.c @@ -6149,6 +6149,7 @@ bool ix86_function_arg_regno_p (int regno) { int i; + enum calling_abi call_abi; const int *parm_regs; if (TARGET_MPX && BND_REGNO_P (regno)) @@ -6174,16 +6175,18 @@ ix86_function_arg_regno_p (int regno) /* TODO: The function should depend on current function ABI but builtins.c would need updating then. Therefore we use the default ABI. */ + call_abi = ix86_cfun_abi (); /* RAX is used as hidden argument to va_arg functions. */ - if (ix86_abi == SYSV_ABI && regno == AX_REG) + if (call_abi == SYSV_ABI && regno == AX_REG) return true; - if (ix86_abi == MS_ABI) + if (call_abi == MS_ABI) parm_regs = x86_64_ms_abi_int_parameter_registers; else parm_regs = x86_64_int_parameter_registers; - for (i = 0; i < (ix86_abi == MS_ABI + + for (i = 0; i < (call_abi == MS_ABI ? X86_64_MS_REGPARM_MAX : X86_64_REGPARM_MAX); i++) if (regno == parm_regs[i]) return true; @@ -8212,10 +8215,10 @@ ix86_function_value_regno_p (const unsigned int regno) case AX_REG: return true; case DX_REG: - return (!TARGET_64BIT || ix86_abi != MS_ABI); + return (!TARGET_64BIT || ix86_cfun_abi () != MS_ABI); case DI_REG: case SI_REG: - return TARGET_64BIT && ix86_abi != MS_ABI; + return TARGET_64BIT && ix86_cfun_abi () != MS_ABI; case BND0_REG: case BND1_REG: @@ -8227,7 +8230,7 @@ ix86_function_value_regno_p (const unsigned int regno) /* TODO: The function should depend on current function ABI but builtins.c would need updating then. Therefore we use the default ABI. */ - if (TARGET_64BIT && ix86_abi == MS_ABI) + if (TARGET_64BIT && ix86_cfun_abi () == MS_ABI) return false; return TARGET_FLOAT_RETURNS_IN_80387; |