From: H.J. Lu Date: Sat, 20 Mar 2021 12:17:36 +0000 (-0700) Subject: x86: Check cfun != NULL before accessing silent_p X-Git-Tag: basepoints/gcc-12~506 X-Git-Url: http://git.ipfire.org/?a=commitdiff_plain;h=19ff0b0d816e6e7d7657a8559e9957d79dc1d77f;p=thirdparty%2Fgcc.git x86: Check cfun != NULL before accessing silent_p Since construct_container may be called with cfun == NULL, check cfun != NULL before accessing silent_p. gcc/ PR target/99679 * config/i386/i386.c (construct_container): Check cfun != NULL before accessing silent_p. gcc/testsuite/ PR target/99679 * g++.target/i386/pr99679-1.C: New test. * g++.target/i386/pr99679-2.C: Likewise. --- diff --git a/gcc/config/i386/i386.c b/gcc/config/i386/i386.c index 714349094bd9..7c41302c75b5 100644 --- a/gcc/config/i386/i386.c +++ b/gcc/config/i386/i386.c @@ -2540,7 +2540,7 @@ construct_container (machine_mode mode, machine_mode orig_mode, { /* Return early if we shouldn't raise an error for invalid calls. */ - if (cfun->machine->silent_p) + if (cfun != NULL && cfun->machine->silent_p) return NULL; if (in_return) { @@ -2568,7 +2568,7 @@ construct_container (machine_mode mode, machine_mode orig_mode, { /* Return early if we shouldn't raise an error for invalid calls. */ - if (cfun->machine->silent_p) + if (cfun != NULL && cfun->machine->silent_p) return NULL; if (!issued_x87_ret_error) { diff --git a/gcc/testsuite/g++.target/i386/pr99679-1.C b/gcc/testsuite/g++.target/i386/pr99679-1.C new file mode 100644 index 000000000000..36640a4e0a12 --- /dev/null +++ b/gcc/testsuite/g++.target/i386/pr99679-1.C @@ -0,0 +1,17 @@ +// { dg-do compile } +// { dg-options "-Ofast -fipa-pta -mno-80387" } + +#include + +extern "C" void abort (void); + +void +foo (int x, ...) +{ + long double ld; + va_list ap; + va_start (ap, x); + ld = va_arg (ap, long double); + if (ld) + abort (); +} // { dg-error "x87 register return with x87 disabled" "" { target { ! ia32 } } } diff --git a/gcc/testsuite/g++.target/i386/pr99679-2.C b/gcc/testsuite/g++.target/i386/pr99679-2.C new file mode 100644 index 000000000000..cbd3c4958db8 --- /dev/null +++ b/gcc/testsuite/g++.target/i386/pr99679-2.C @@ -0,0 +1,17 @@ +// { dg-do compile } +// { dg-options "-Ofast -fipa-pta -mgeneral-regs-only" } + +#include + +extern "C" void abort (void); + +void +foo (int x, ...) +{ + double ld; + va_list ap; + va_start (ap, x); + ld = va_arg (ap, double); // { dg-error "SSE register argument with SSE disabled" "" { target { ! ia32 } } } + if (ld) + abort (); +} // { dg-error "SSE register return with SSE disabled" "" { target { ! ia32 } } }