From 19a42e516f876e78ab61058534b2412001c98011 Mon Sep 17 00:00:00 2001 From: Richard Henderson Date: Wed, 3 Sep 2003 14:38:26 -0700 Subject: [PATCH] optimize.c (optimize_function): Push/pop ggc context around the call to optimize_inline_calls. * optimize.c (optimize_function): Push/pop ggc context around the call to optimize_inline_calls. From-SVN: r71034 --- gcc/cp/ChangeLog | 5 +++++ gcc/cp/optimize.c | 23 +++++++++++++++++++++++ 2 files changed, 28 insertions(+) diff --git a/gcc/cp/ChangeLog b/gcc/cp/ChangeLog index fbee4d64c18..4c9a0dae7f5 100644 --- a/gcc/cp/ChangeLog +++ b/gcc/cp/ChangeLog @@ -1,3 +1,8 @@ +2003-09-03 Richard Henderson + + * optimize.c (optimize_function): Push/pop ggc context around + the call to optimize_inline_calls. + 2003-09-02 Scott Brumbaugh PR c++/11553 diff --git a/gcc/cp/optimize.c b/gcc/cp/optimize.c index 8c604e3bf8b..7be410e296d 100644 --- a/gcc/cp/optimize.c +++ b/gcc/cp/optimize.c @@ -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); } -- 2.30.2