This is the mail archive of the gcc-patches@gcc.gnu.org mailing list for the GCC project.


Index Nav: [Date Index] [Subject Index] [Author Index] [Thread Index]
Message Nav: [Date Prev] [Date Next] [Thread Prev] [Thread Next]
Other format: [Raw text]

[PATCH] Fix -fsplit-stack with non-local gotos (PR target/79494)


Hi!

We ICE on the following testcase, because we have abnormal edges
from both __morestack call (which is before prologue) and call
to the nested function (which is in between prologue and epilogue)
to a label reachable through non-local goto.  This is something
dwarf2cfi doesn't allow, it doesn't know what CFI state should
be at that label.
As __morestack really doesn't do non-local gotos and while it probably
can throw, it is never something that can be caught in the function that
calls __morestack, the following patch fixes it by telling middle-end
that __morestack can't do nl goto.

Bootstrapped/regtested on x86_64-linux and i686-linux, ok for trunk?

2017-02-20  Jakub Jelinek  <jakub@redhat.com>

	PR target/79494
	* config/i386/i386.c (ix86_expand_split_stack_prologue): Call
	make_reg_eh_region_note_nothrow_nononlocal on call_insn.
	* config/rs6000/rs6000.c: Include except.h.
	(rs6000_expand_split_stack_prologue): Call
	make_reg_eh_region_note_nothrow_nononlocal on the call insn.

	* gcc.dg/pr79494.c: New test.

--- gcc/config/i386/i386.c.jj	2017-02-20 13:51:22.000000000 +0100
+++ gcc/config/i386/i386.c	2017-02-20 15:26:04.184793980 +0100
@@ -15057,6 +15057,8 @@ ix86_expand_split_stack_prologue (void)
   add_function_usage_to (call_insn, call_fusage);
   if (!TARGET_64BIT)
     add_reg_note (call_insn, REG_ARGS_SIZE, GEN_INT (0));
+  /* Indicate that this function can't jump to non-local gotos.  */
+  make_reg_eh_region_note_nothrow_nononlocal (as_a <rtx_insn *> (call_insn));
 
   /* In order to make call/return prediction work right, we now need
      to execute a return instruction.  See
--- gcc/config/rs6000/rs6000.c.jj	2017-02-18 14:12:36.000000000 +0100
+++ gcc/config/rs6000/rs6000.c	2017-02-20 15:47:56.602798893 +0100
@@ -66,6 +66,7 @@
 #include "builtins.h"
 #include "context.h"
 #include "tree-pass.h"
+#include "except.h"
 #if TARGET_XCOFF
 #include "xcoffout.h"  /* get declarations of xcoff_*_section_name */
 #endif
@@ -31680,6 +31681,8 @@ rs6000_expand_split_stack_prologue (void
      split_stack_return use r0.  */
   use_reg (&call_fusage, r0);
   add_function_usage_to (insn, call_fusage);
+  /* Indicate that this function can't jump to non-local gotos.  */
+  make_reg_eh_region_note_nothrow_nononlocal (insn);
   emit_insn (gen_frame_load (r0, r1, info->lr_save_offset));
   insn = emit_move_insn (lr, r0);
   add_reg_note (insn, REG_CFA_RESTORE, lr);
--- gcc/testsuite/gcc.dg/pr79494.c.jj	2017-02-20 15:51:12.970247250 +0100
+++ gcc/testsuite/gcc.dg/pr79494.c	2017-02-20 15:52:59.753859680 +0100
@@ -0,0 +1,22 @@
+/* PR target/79494 */
+/* { dg-do compile } */
+/* { dg-require-effective-target split_stack } */
+/* { dg-options "-O2 -fsplit-stack" } */
+
+void
+foo (int a)
+{
+  __label__ lab;
+  __attribute__((noinline, noclone)) void bar (int b)
+  {
+    switch (b)
+      {
+      case 1:
+	goto lab;
+      case 2:
+	goto lab;
+      }
+  }
+  bar (a);
+lab:;
+}

	Jakub


Index Nav: [Date Index] [Subject Index] [Author Index] [Thread Index]
Message Nav: [Date Prev] [Date Next] [Thread Prev] [Thread Next]