diff options
author | rth <rth@138bc75d-0d04-0410-961f-82ee72b054a4> | 2003-08-29 22:44:05 +0000 |
---|---|---|
committer | rth <rth@138bc75d-0d04-0410-961f-82ee72b054a4> | 2003-08-29 22:44:05 +0000 |
commit | 9197503feb1ae04f7e5b952003aa94aeb0390419 (patch) | |
tree | b8bd1c0f20314f33063c82cf2cf403d0630408e5 /gcc | |
parent | ecc82929a44b5a046c89ba1361c354f1466b85e4 (diff) | |
download | gcc-9197503feb1ae04f7e5b952003aa94aeb0390419.tar.gz |
* function.h (struct function): Add rtl_inline_init, saved_for_inline.
* integrate.c (save_for_inline): Set saved_for_inline.
* c-semantics.c (genrtl_scope_stmt): Check it.
* toplev.c (wrapup_global_declarations): Check it.
(rest_of_handle_inlining): Set and check rtl_inline_init.
(rest_of_compilation): Remove out of date comment.
git-svn-id: svn+ssh://gcc.gnu.org/svn/gcc/trunk@70931 138bc75d-0d04-0410-961f-82ee72b054a4
Diffstat (limited to 'gcc')
-rw-r--r-- | gcc/ChangeLog | 9 | ||||
-rw-r--r-- | gcc/c-semantics.c | 1 | ||||
-rw-r--r-- | gcc/function.h | 7 | ||||
-rw-r--r-- | gcc/integrate.c | 2 | ||||
-rw-r--r-- | gcc/toplev.c | 9 |
5 files changed, 22 insertions, 6 deletions
diff --git a/gcc/ChangeLog b/gcc/ChangeLog index d3443b51638..d573615b6e3 100644 --- a/gcc/ChangeLog +++ b/gcc/ChangeLog @@ -1,5 +1,14 @@ 2003-08-29 Richard Henderson <rth@redhat.com> + * function.h (struct function): Add rtl_inline_init, saved_for_inline. + * integrate.c (save_for_inline): Set saved_for_inline. + * c-semantics.c (genrtl_scope_stmt): Check it. + * toplev.c (wrapup_global_declarations): Check it. + (rest_of_handle_inlining): Set and check rtl_inline_init. + (rest_of_compilation): Remove out of date comment. + +2003-08-29 Richard Henderson <rth@redhat.com> + * function.c (allocate_struct_function): New, split out of ... (prepare_function_start, init_function_start): ... here. * expr.c (init_expr): Use ggc_alloc_cleared. diff --git a/gcc/c-semantics.c b/gcc/c-semantics.c index cbffbe09411..4163d449199 100644 --- a/gcc/c-semantics.c +++ b/gcc/c-semantics.c @@ -645,6 +645,7 @@ genrtl_scope_stmt (tree t) if (TREE_CODE (fn) == FUNCTION_DECL && DECL_CONTEXT (fn) == current_function_decl && DECL_SAVED_INSNS (fn) + && DECL_SAVED_INSNS (fn)->saved_for_inline && !TREE_ASM_WRITTEN (fn) && TREE_ADDRESSABLE (fn)) { diff --git a/gcc/function.h b/gcc/function.h index 4216acb6a25..f94a64286f3 100644 --- a/gcc/function.h +++ b/gcc/function.h @@ -504,6 +504,13 @@ struct function GTY(()) /* Nonzero if code to initialize arg_pointer_save_area has been emitted. */ unsigned int arg_pointer_save_area_init : 1; + + /* Flag for use by ther rtl inliner, to tell if the function has been + processed at least once. */ + unsigned int rtl_inline_init : 1; + + /* Nonzero if the rtl inliner has saved the function for inlining. */ + unsigned int saved_for_inline : 1; }; /* The function currently being compiled. */ diff --git a/gcc/integrate.c b/gcc/integrate.c index a8ee4faa5f3..15474ba3f24 100644 --- a/gcc/integrate.c +++ b/gcc/integrate.c @@ -492,7 +492,7 @@ save_for_inline (tree fndecl) } cfun->original_decl_initial = DECL_INITIAL (fndecl); cfun->no_debugging_symbols = (write_symbols == NO_DEBUG); - DECL_SAVED_INSNS (fndecl) = cfun; + cfun->saved_for_inline = 1; /* Clean up. */ if (! flag_no_inline) diff --git a/gcc/toplev.c b/gcc/toplev.c index 418fa3575ee..3e639c6a151 100644 --- a/gcc/toplev.c +++ b/gcc/toplev.c @@ -1588,6 +1588,7 @@ wrapup_global_declarations (tree *vec, int len) if (TREE_CODE (decl) == FUNCTION_DECL && DECL_INITIAL (decl) != 0 && DECL_SAVED_INSNS (decl) != 0 + && DECL_SAVED_INSNS (decl)->saved_for_inline && (flag_keep_inline_functions || (TREE_PUBLIC (decl) && !DECL_COMDAT (decl)) || TREE_SYMBOL_REFERENCED (DECL_ASSEMBLER_NAME (decl)))) @@ -2464,8 +2465,9 @@ rest_of_handle_inlining (tree decl) /* If we are reconsidering an inline function at the end of compilation, skip the stuff for making it inline. */ - if (DECL_SAVED_INSNS (decl) != 0) + if (cfun->rtl_inline_init) return 0; + cfun->rtl_inline_init = 1; /* If this is nested inside an inlined external function, pretend it was only declared. Since we cannot inline such functions, @@ -2522,7 +2524,7 @@ rest_of_handle_inlining (tree decl) if (open_dump_file (DFI_rtl, decl)) { - if (DECL_SAVED_INSNS (decl)) + if (DECL_SAVED_INSNS (decl) && DECL_SAVED_INSNS (decl)->saved_for_inline) fprintf (rtl_dump_file, ";; (integrable)\n\n"); close_dump_file (DFI_rtl, print_rtl, insns); } @@ -3553,9 +3555,6 @@ rest_of_compilation (tree decl) if (! DECL_DEFER_OUTPUT (decl)) { free_after_compilation (cfun); - - /* Clear integrate.c's pointer to the cfun structure we just - destroyed. */ DECL_SAVED_INSNS (decl) = 0; } cfun = 0; |