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]

Re: Fix stack overflow problem when bootstrapping on Darwin



On Friday, May 2, 2003, at 08:56 AM, Richard Sandiford wrote:


Geoffrey Keating <gkeating@apple.com> writes:
2003-04-29 Geoffrey Keating <geoffk@apple.com>

	* c-semantics.c (expand_unreachable_stmt): Return a tree.
	(expand_stmt): Update for change to expand_unreachable_stmt.
	(expand_unreachable_if_stmt): Likewise.

This patch caused an ICE on the test case below. It missed some callers of expand_unreachable_stmt, so the else clause was no longer being expanded.

Patch bootstrapped & regression tested on i686-pc-linux-gnu.
OK to install?

I have a similar patch that doesn't use a ?: in a function's operand, which I think is nicer, but please commit the testcase since it tests a codepath that isn't tested at present.


(It turns out gcc.dg/switch-2.c also did fail, but I couldn't tell because I couldn't run a 'before' because I couldn't bootstrap.)

(Maybe the function should be renamed?  "expand" doesn't seem all that
appropriate now.  It does so some expansion, though, and I couldn't
think of a better alternative.)

I actually considered changing it to expand_unreachable_stmts, but decided not to bother...


	* c-semantics.c (genrtl_if_stmt): Pass the return value of
	expand_unreachable_stmt to expand_stmt.
	(genrtl_switch_stmt): Likewise.

Index: c-semantics.c
===================================================================
RCS file: /cvs/gcc/gcc/gcc/c-semantics.c,v
retrieving revision 1.56
diff -c -d -p -F^[(a-zA-Z0-9_^#] -r1.56 c-semantics.c
*** c-semantics.c	29 Apr 2003 20:39:12 -0000	1.56
--- c-semantics.c	2 May 2003 13:18:39 -0000
*************** genrtl_if_stmt (t)
*** 416,434 ****
    expand_start_cond (cond, 0);
    if (THEN_CLAUSE (t))
      {
!       if (cond && integer_zerop (cond))
! 	expand_unreachable_stmt (THEN_CLAUSE (t), warn_notreached);
!       else
! 	expand_stmt (THEN_CLAUSE (t));
      }

    if (ELSE_CLAUSE (t))
      {
        expand_start_else ();
!       if (cond && integer_nonzerop (cond))
! 	expand_unreachable_stmt (ELSE_CLAUSE (t), warn_notreached);
!       else
! 	expand_stmt (ELSE_CLAUSE (t));
      }
    expand_end_cond ();
  }
--- 416,434 ----
    expand_start_cond (cond, 0);
    if (THEN_CLAUSE (t))
      {
!       expand_stmt
! 	(cond && integer_zerop (cond)
! 	 ? expand_unreachable_stmt (THEN_CLAUSE (t), warn_notreached)
! 	 : THEN_CLAUSE (t));
      }

    if (ELSE_CLAUSE (t))
      {
        expand_start_else ();
!       expand_stmt
! 	(cond && integer_nonzerop (cond)
! 	 ? expand_unreachable_stmt (ELSE_CLAUSE (t), warn_notreached)
! 	 : ELSE_CLAUSE (t));
      }
    expand_end_cond ();
  }
*************** genrtl_switch_stmt (t)
*** 687,693 ****

    emit_line_note (input_filename, lineno);
    expand_start_case (1, cond, TREE_TYPE (cond), "switch statement");
!   expand_unreachable_stmt (SWITCH_BODY (t), warn_notreached);
    expand_end_case_type (cond, SWITCH_TYPE (t));
  }

--- 687,693 ----

emit_line_note (input_filename, lineno);
expand_start_case (1, cond, TREE_TYPE (cond), "switch statement");
! expand_stmt (expand_unreachable_stmt (SWITCH_BODY (t), warn_notreached));
expand_end_case_type (cond, SWITCH_TYPE (t));
}


*** /dev/null	Thu Apr 11 15:25:15 2002
--- testsuite/gcc.c-torture/compile/20030502.c	Fri May  2 14:16:32 2003
***************
*** 0 ****
--- 1,12 ----
+ void foo ()
+ {
+   if (1)
+     goto foo;
+   else
+     for (;;)
+       {
+       foo:
+ 	bar ();
+ 	return;
+       }
+ }


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