re PR target/84146 (ICE with -mcet in dwarf2out_var_location, involving sigsetjmp)
authorJakub Jelinek <jakub@redhat.com>
Tue, 6 Feb 2018 20:32:45 +0000 (21:32 +0100)
committerJakub Jelinek <jakub@gcc.gnu.org>
Tue, 6 Feb 2018 20:32:45 +0000 (21:32 +0100)
PR target/84146
* config/i386/i386.c (rest_of_insert_endbranch): Only skip
NOTE_INSN_CALL_ARG_LOCATION after a call, not anything else,
and skip it regardless of bb boundaries.  Use CALL_P macro,
don't test INSN_P (insn) together with CALL_P or JUMP_P check
unnecessarily, formatting fix.

* gcc.target/i386/pr84146.c: New test.

From-SVN: r257431

gcc/ChangeLog
gcc/config/i386/i386.c
gcc/testsuite/ChangeLog
gcc/testsuite/gcc.target/i386/pr84146.c [new file with mode: 0644]

index c40d7e669cbdf5c89a83b9470e36c382d976bd8c..8edc8cc84a1bd5ea90853e30d487d39b90caa441 100644 (file)
@@ -1,3 +1,12 @@
+2018-02-06  Jakub Jelinek  <jakub@redhat.com>
+
+       PR target/84146
+       * config/i386/i386.c (rest_of_insert_endbranch): Only skip
+       NOTE_INSN_CALL_ARG_LOCATION after a call, not anything else,
+       and skip it regardless of bb boundaries.  Use CALL_P macro,
+       don't test INSN_P (insn) together with CALL_P or JUMP_P check
+       unnecessarily, formatting fix.
+
 2018-02-06  Michael Collison  <michael.collison@arm.com>
 
        * config/arm/thumb2.md:
index 6c612c7798739a3d14a3cebc943aad5472b5833b..faa9d9415f69387a565321cd551b60b91eab3448 100644 (file)
@@ -2612,31 +2612,27 @@ rest_of_insert_endbranch (void)
       for (insn = BB_HEAD (bb); insn != NEXT_INSN (BB_END (bb));
           insn = NEXT_INSN (insn))
        {
-         if (INSN_P (insn) && GET_CODE (insn) == CALL_INSN)
+         if (CALL_P (insn))
            {
              if (find_reg_note (insn, REG_SETJMP, NULL) == NULL)
                continue;
              /* Generate ENDBRANCH after CALL, which can return more than
                 twice, setjmp-like functions.  */
 
-             /* Skip notes and debug insns that must be next to the
-                call insn.  ??? This might skip a lot more than
-                that...  ??? Skipping barriers and emitting code
-                after them surely looks like a mistake; we probably
-                won't ever hit it, for we'll hit BB_END first.  */
+             /* Skip notes that must immediately follow the call insn.  */
              rtx_insn *next_insn = insn;
-             while ((next_insn != BB_END (bb))
-                     && (DEBUG_INSN_P (NEXT_INSN (next_insn))
-                         || NOTE_P (NEXT_INSN (next_insn))
-                         || BARRIER_P (NEXT_INSN (next_insn))))
-               next_insn = NEXT_INSN (next_insn);
+             if (NEXT_INSN (insn)
+                 && NOTE_P (NEXT_INSN (insn))
+                 && (NOTE_KIND (NEXT_INSN (insn))
+                     == NOTE_INSN_CALL_ARG_LOCATION))
+               next_insn = NEXT_INSN (insn);
 
              cet_eb = gen_nop_endbr ();
              emit_insn_after_setloc (cet_eb, next_insn, INSN_LOCATION (insn));
              continue;
            }
 
-         if (INSN_P (insn) && JUMP_P (insn) && flag_cet_switch)
+         if (JUMP_P (insn) && flag_cet_switch)
            {
              rtx target = JUMP_LABEL (insn);
              if (target == NULL_RTX || ANY_RETURN_P (target))
@@ -2671,7 +2667,7 @@ rest_of_insert_endbranch (void)
          if ((LABEL_P (insn) && LABEL_PRESERVE_P (insn))
              || (NOTE_P (insn)
                  && NOTE_KIND (insn) == NOTE_INSN_DELETED_LABEL))
-/* TODO.  Check /s bit also.  */
+           /* TODO.  Check /s bit also.  */
            {
              cet_eb = gen_nop_endbr ();
              emit_insn_after (cet_eb, insn);
index 14bcd62496247414f0384ca964d37faf98ff88ec..4134471fad9e5be7ca68b44e48bf928e9a94cd9b 100644 (file)
@@ -1,3 +1,8 @@
+2018-02-06  Jakub Jelinek  <jakub@redhat.com>
+
+       PR target/84146
+       * gcc.target/i386/pr84146.c: New test.
+
 2018-02-06  Michael Collison  <michael.collison@arm.com>
 
        * gcc.target/arm/pr7676.c: New testcase for incorrect splitting.
diff --git a/gcc/testsuite/gcc.target/i386/pr84146.c b/gcc/testsuite/gcc.target/i386/pr84146.c
new file mode 100644 (file)
index 0000000..ba9b633
--- /dev/null
@@ -0,0 +1,14 @@
+/* PR target/84146 */
+/* { dg-do compile } */
+/* { dg-options "-O2 -g -mcet -fcf-protection=full" } */
+
+int __setjmp (void **);
+void *buf[64];
+
+void
+foo (void)
+{
+  __setjmp (buf);
+  for (;;)
+    ;
+}