optimize.c (optimize_function): Push/pop ggc context around the call to optimize_inli...
authorRichard Henderson <rth@redhat.com>
Wed, 3 Sep 2003 21:38:26 +0000 (14:38 -0700)
committerRichard Henderson <rth@gcc.gnu.org>
Wed, 3 Sep 2003 21:38:26 +0000 (14:38 -0700)
        * optimize.c (optimize_function): Push/pop ggc context around
        the call to optimize_inline_calls.

From-SVN: r71034

gcc/cp/ChangeLog
gcc/cp/optimize.c

index fbee4d64c181f3dbf83e4d46d45e1d5f285ce93b..4c9a0dae7f590d15f96b0aeb89d9708f7d3ea06a 100644 (file)
@@ -1,3 +1,8 @@
+2003-09-03  Richard Henderson  <rth@redhat.com>
+
+       * optimize.c (optimize_function): Push/pop ggc context around
+       the call to optimize_inline_calls.
+
 2003-09-02  Scott Brumbaugh  <scottb.lists@verizon.net>
 
        PR c++/11553
index 8c604e3bf8b179d4e3f808cd80257af46d6118e6..7be410e296d5e3af112bc5310990ee1eec33fae9 100644 (file)
@@ -56,7 +56,30 @@ optimize_function (tree fn)
          and (d) TARGET_ASM_OUTPUT_MI_THUNK is there to DTRT anyway.  */
       && !DECL_THUNK_P (fn))
     {
+      /* ??? Work around GC problem.  Call stack is
+
+        -> instantiate_decl
+        -> expand_or_defer_fn
+        -> maybe_clone_body
+        -> expand_body
+        -> tree_rest_of_compilation
+
+        which of course collects.  This used to be protected by the
+        "regular" nested call ggc_push_context that now lives in 
+        tree_rest_of_compilation.
+
+        Two good fixes:
+        (1) Do inlining in tree_rest_of_compilation.  This is good
+            in that this common optimization happens in common code.
+        (2) Don't nest compilation of functions.  Instead queue the
+            new function to cgraph, and let it get picked up in the
+            next round of "emit everything that needs emitting".
+
+        For the nonce, just protect things here.  */
+
+      ggc_push_context ();
       optimize_inline_calls (fn);
+      ggc_pop_context ();
 
       dump_function (TDI_inlined, fn);
     }