x86: Check cfun != NULL before accessing silent_p
authorH.J. Lu <hjl.tools@gmail.com>
Sat, 20 Mar 2021 12:17:36 +0000 (05:17 -0700)
committerH.J. Lu <hjl.tools@gmail.com>
Sat, 20 Mar 2021 17:08:31 +0000 (10:08 -0700)
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.

gcc/config/i386/i386.c
gcc/testsuite/g++.target/i386/pr99679-1.C [new file with mode: 0644]
gcc/testsuite/g++.target/i386/pr99679-2.C [new file with mode: 0644]

index 7143490..7c41302 100644 (file)
@@ -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 (file)
index 0000000..36640a4
--- /dev/null
@@ -0,0 +1,17 @@
+// { dg-do compile }
+// { dg-options "-Ofast -fipa-pta -mno-80387" }
+
+#include <stdarg.h>
+
+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 (file)
index 0000000..cbd3c49
--- /dev/null
@@ -0,0 +1,17 @@
+// { dg-do compile }
+// { dg-options "-Ofast -fipa-pta -mgeneral-regs-only" }
+
+#include <stdarg.h>
+
+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 } } }