mirror of
git://gcc.gnu.org/git/gcc.git
synced 2025-04-10 13:31:04 +08:00
re PR target/26223 (ICE on long double with -mno-80387)
PR target/26223 * config/i386/i386.c (construct_container): Split static issued_error flag into issued_sse_arg_error, issued_sse_ret_error and issued_x87_ret_error. Issue a daignostic if the x86-64 ABI requires the use of x87 registers and the user explicitly specified the -mno-80387 command line option. * gcc.target/i386/amd64-abi-2.c: New test case. From-SVN: r114355
This commit is contained in:
parent
cb1b2d52bb
commit
94e76332ac
@ -1,3 +1,12 @@
|
||||
2006-06-03 Roger Sayle <roger@eyesopen.com>
|
||||
|
||||
PR target/26223
|
||||
* config/i386/i386.c (construct_container): Split static issued_error
|
||||
flag into issued_sse_arg_error, issued_sse_ret_error and
|
||||
issued_x87_ret_error. Issue a daignostic if the x86-64 ABI
|
||||
requires the use of x87 registers and the user explicitly
|
||||
specified the -mno-80387 command line option.
|
||||
|
||||
2006-06-02 Geoffrey Keating <geoffk@apple.com>
|
||||
|
||||
* config/rs6000/host-darwin.c (sigaltstack): Protect prototype with
|
||||
|
@ -3247,6 +3247,11 @@ construct_container (enum machine_mode mode, enum machine_mode orig_mode,
|
||||
tree type, int in_return, int nintregs, int nsseregs,
|
||||
const int *intreg, int sse_regno)
|
||||
{
|
||||
/* The following variables hold the static issued_error state. */
|
||||
static bool issued_sse_arg_error;
|
||||
static bool issued_sse_ret_error;
|
||||
static bool issued_x87_ret_error;
|
||||
|
||||
enum machine_mode tmpmode;
|
||||
int bytes =
|
||||
(mode == BLKmode) ? int_size_in_bytes (type) : (int) GET_MODE_SIZE (mode);
|
||||
@ -3285,18 +3290,38 @@ construct_container (enum machine_mode mode, enum machine_mode orig_mode,
|
||||
some less clueful developer tries to use floating-point anyway. */
|
||||
if (needed_sseregs && !TARGET_SSE)
|
||||
{
|
||||
static bool issued_error;
|
||||
if (!issued_error)
|
||||
if (in_return)
|
||||
{
|
||||
issued_error = true;
|
||||
if (in_return)
|
||||
error ("SSE register return with SSE disabled");
|
||||
else
|
||||
error ("SSE register argument with SSE disabled");
|
||||
if (!issued_sse_ret_error)
|
||||
{
|
||||
error ("SSE register return with SSE disabled");
|
||||
issued_sse_ret_error = true;
|
||||
}
|
||||
}
|
||||
else if (!issued_sse_arg_error)
|
||||
{
|
||||
error ("SSE register argument with SSE disabled");
|
||||
issued_sse_arg_error = true;
|
||||
}
|
||||
return NULL;
|
||||
}
|
||||
|
||||
/* Likewise, error if the ABI requires us to return values in the
|
||||
x87 registers and the user specified -mno-80387. */
|
||||
if (!TARGET_80387 && in_return)
|
||||
for (i = 0; i < n; i++)
|
||||
if (class[i] == X86_64_X87_CLASS
|
||||
|| class[i] == X86_64_X87UP_CLASS
|
||||
|| class[i] == X86_64_COMPLEX_X87_CLASS)
|
||||
{
|
||||
if (!issued_x87_ret_error)
|
||||
{
|
||||
error ("x87 register return with x87 disabled");
|
||||
issued_x87_ret_error = true;
|
||||
}
|
||||
return NULL;
|
||||
}
|
||||
|
||||
/* First construct simple cases. Avoid SCmode, since we want to use
|
||||
single register to pass this type. */
|
||||
if (n == 1 && mode != SCmode)
|
||||
|
@ -1,3 +1,8 @@
|
||||
2006-06-03 Roger Sayle <roger@eyesopen.com>
|
||||
|
||||
PR target/26223
|
||||
* gcc.target/i386/amd64-abi-2.c: New test case.
|
||||
|
||||
2006-06-02 Eric Christopher <echristo@apple.com>
|
||||
|
||||
* gcc.c-torture/compile/20000804-1.c: Skip if i?86-darwin.
|
||||
|
6
gcc/testsuite/gcc.target/i386/amd64-abi-2.c
Normal file
6
gcc/testsuite/gcc.target/i386/amd64-abi-2.c
Normal file
@ -0,0 +1,6 @@
|
||||
/* PR target/26223 */
|
||||
/* { dg-do compile { target { { i?86-*-* x86_64-*-* } && lp64 } } } */
|
||||
/* { dg-options "-mno-80387" } */
|
||||
long double foo(long double x) { return x; } /* { dg-error "x87 disabled" } */
|
||||
long double bar(long double x) { return x; }
|
||||
|
Loading…
x
Reference in New Issue
Block a user