From f088a9c9709691f8882aa09280bd71149349bb4e Mon Sep 17 00:00:00 2001 From: Uros Bizjak Date: Mon, 8 Jun 2015 22:07:08 +0200 Subject: [PATCH] backport: re PR target/66275 (__attribute__((sysv_abi)) with x86_64-w64-mingw32-gcc generates incorrect code) Backport from mainline: 2015-06-03 Uros Bizjak 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: Backport from mainline: 2015-06-03 Uros Bizjak PR target/66275 * gcc.target/i386/pr66275.c: New test. From-SVN: r224247 --- gcc/ChangeLog | 12 +++++++++++- gcc/config/i386/i386.c | 13 ++++++++----- gcc/testsuite/ChangeLog | 10 +++++++++- gcc/testsuite/gcc.target/i386/pr66275.c | 8 ++++++++ 4 files changed, 36 insertions(+), 7 deletions(-) create mode 100644 gcc/testsuite/gcc.target/i386/pr66275.c diff --git a/gcc/ChangeLog b/gcc/ChangeLog index 09dbbcb45825..5b3bfc61442c 100644 --- a/gcc/ChangeLog +++ b/gcc/ChangeLog @@ -1,3 +1,13 @@ +2015-06-08 Uros Bizjak + + Backport from mainline: + 2015-06-03 Uros Bizjak + + 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. + 2015-06-08 Venkataramanan Kumar * config/i386/sse.md (sse3_mwait): Swap the operand constriants. @@ -18,7 +28,7 @@ GIMPLE_OMP_TASK add an EDGE_ABNORMAL edge from entry to exit. 2015-05-04 Jakub Jelinek - + PR tree-optimization/65984 * ubsan.c: Include tree-cfg.h. (instrument_bool_enum_load): Use stmt_ends_bb_p instead of diff --git a/gcc/config/i386/i386.c b/gcc/config/i386/i386.c index 52c5497840c9..f71204cb1be0 100644 --- a/gcc/config/i386/i386.c +++ b/gcc/config/i386/i386.c @@ -5905,6 +5905,7 @@ bool ix86_function_arg_regno_p (int regno) { int i; + enum calling_abi call_abi; const int *parm_regs; if (!TARGET_64BIT) @@ -5927,16 +5928,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; @@ -7780,7 +7783,7 @@ ix86_function_value_regno_p (const unsigned int regno) return true; case DI_REG: case SI_REG: - return TARGET_64BIT && ix86_abi != MS_ABI; + return TARGET_64BIT && ix86_cfun_abi () != MS_ABI; /* Complex values are returned in %st(0)/%st(1) pair. */ case ST0_REG: @@ -7788,7 +7791,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; diff --git a/gcc/testsuite/ChangeLog b/gcc/testsuite/ChangeLog index d6d4ff6c358a..da7994451d97 100644 --- a/gcc/testsuite/ChangeLog +++ b/gcc/testsuite/ChangeLog @@ -1,3 +1,11 @@ +2015-06-08 Uros Bizjak + + Backport from mainline: + 2015-06-03 Uros Bizjak + + PR target/66275 + * gcc.target/i386/pr66275.c: New test. + 2015-06-04 Richard Biener PR middle-end/66251 @@ -7,7 +15,7 @@ Backported from mainline 2015-05-04 Jakub Jelinek - + PR tree-optimization/65984 * c-c++-common/ubsan/pr65984.c: New test. diff --git a/gcc/testsuite/gcc.target/i386/pr66275.c b/gcc/testsuite/gcc.target/i386/pr66275.c new file mode 100644 index 000000000000..b8759aeb5ec3 --- /dev/null +++ b/gcc/testsuite/gcc.target/i386/pr66275.c @@ -0,0 +1,8 @@ +/* { dg-do compile { target { *-*-linux* && { ! ia32 } } } } */ +/* { dg-options "-mabi=ms -fdump-rtl-dfinit" } */ + +void +__attribute__((sysv_abi)) +foo () {}; + +/* { dg-final { scan-rtl-dump "entry block defs\[^\\n]*\\\[si\\]\[^\\n]*\\\[di\\]" "dfinit" } } */ -- 2.47.2