diff options
author | bstarynk <bstarynk@138bc75d-0d04-0410-961f-82ee72b054a4> | 2008-09-04 13:11:52 +0000 |
---|---|---|
committer | bstarynk <bstarynk@138bc75d-0d04-0410-961f-82ee72b054a4> | 2008-09-04 13:11:52 +0000 |
commit | ed1d171006e8f6c4403232e075b3e8455a19299a (patch) | |
tree | 883e632907dd1f7e877229c0ea962daf81725fa6 /gcc/cgraphunit.c | |
parent | 2ca603eacebf3a9902742389a1fe68c6a6bb6c0e (diff) | |
download | gcc-ed1d171006e8f6c4403232e075b3e8455a19299a.tar.gz |
2008-09-04 Basile Starynkevitch <basile@starynkevitch.net>
MELT branch merged with trunk r139983
git-svn-id: svn+ssh://gcc.gnu.org/svn/gcc/branches/melt-branch@139985 138bc75d-0d04-0410-961f-82ee72b054a4
Diffstat (limited to 'gcc/cgraphunit.c')
-rw-r--r-- | gcc/cgraphunit.c | 51 |
1 files changed, 29 insertions, 22 deletions
diff --git a/gcc/cgraphunit.c b/gcc/cgraphunit.c index 43cdfda3aa3..7c845733327 100644 --- a/gcc/cgraphunit.c +++ b/gcc/cgraphunit.c @@ -639,7 +639,6 @@ verify_cgraph_node (struct cgraph_node *node) } if (node->analyzed - && gimple_body (node->decl) && !TREE_ASM_WRITTEN (node->decl) && (!DECL_EXTERNAL (node->decl) || node->global.inlined_to)) { @@ -860,7 +859,7 @@ cgraph_analyze_functions (void) { fprintf (cgraph_dump_file, "Initial entry points:"); for (node = cgraph_nodes; node != first_analyzed; node = node->next) - if (node->needed && gimple_body (node->decl)) + if (node->needed) fprintf (cgraph_dump_file, " %s", cgraph_node_name (node)); fprintf (cgraph_dump_file, "\n"); } @@ -912,7 +911,7 @@ cgraph_analyze_functions (void) { fprintf (cgraph_dump_file, "Unit entry points:"); for (node = cgraph_nodes; node != first_analyzed; node = node->next) - if (node->needed && gimple_body (node->decl)) + if (node->needed) fprintf (cgraph_dump_file, " %s", cgraph_node_name (node)); fprintf (cgraph_dump_file, "\n\nInitial "); dump_cgraph (cgraph_dump_file); @@ -926,10 +925,10 @@ cgraph_analyze_functions (void) tree decl = node->decl; next = node->next; - if (node->local.finalized && !gimple_body (decl)) + if (node->local.finalized && !gimple_has_body_p (decl)) cgraph_reset_node (node); - if (!node->reachable && gimple_body (decl)) + if (!node->reachable && gimple_has_body_p (decl)) { if (cgraph_dump_file) fprintf (cgraph_dump_file, " %s", cgraph_node_name (node)); @@ -938,7 +937,7 @@ cgraph_analyze_functions (void) } else node->next_needed = NULL; - gcc_assert (!node->local.finalized || gimple_body (decl)); + gcc_assert (!node->local.finalized || gimple_has_body_p (decl)); gcc_assert (node->analyzed == node->local.finalized); } if (cgraph_dump_file) @@ -991,7 +990,7 @@ cgraph_mark_functions_to_output (void) /* We need to output all local functions that are used and not always inlined, as well as those that are reachable from outside the current compilation unit. */ - if (gimple_body (decl) + if (node->analyzed && !node->global.inlined_to && (node->needed || (e && node->reachable)) @@ -1003,7 +1002,7 @@ cgraph_mark_functions_to_output (void) /* We should've reclaimed all functions that are not needed. */ #ifdef ENABLE_CHECKING if (!node->global.inlined_to - && gimple_body (decl) + && gimple_has_body_p (decl) && !DECL_EXTERNAL (decl)) { dump_cgraph_node (stderr, node); @@ -1011,7 +1010,7 @@ cgraph_mark_functions_to_output (void) } #endif gcc_assert (node->global.inlined_to - || !gimple_body (decl) + || !gimple_has_body_p (decl) || DECL_EXTERNAL (decl)); } @@ -1039,16 +1038,13 @@ cgraph_expand_function (struct cgraph_node *node) tree_rest_of_compilation (decl); /* Make sure that BE didn't give up on compiling. */ - /* ??? Can happen with nested function of extern inline. */ gcc_assert (TREE_ASM_WRITTEN (decl)); current_function_decl = NULL; - if (!cgraph_preserve_function_body_p (decl)) - { - cgraph_release_function_body (node); - /* Eliminate all call edges. This is important so the call_expr no longer - points to the dead function body. */ - cgraph_node_remove_callees (node); - } + gcc_assert (!cgraph_preserve_function_body_p (decl)); + cgraph_release_function_body (node); + /* Eliminate all call edges. This is important so the GIMPLE_CALL no longer + points to the dead function body. */ + cgraph_node_remove_callees (node); cgraph_function_flags_ready = true; } @@ -1329,7 +1325,7 @@ cgraph_optimize (void) for (node = cgraph_nodes; node; node = node->next) if (node->analyzed && (node->global.inlined_to - || gimple_body (node->decl))) + || gimple_has_body_p (node->decl))) { error_found = true; dump_cgraph_node (stderr, node); @@ -1421,7 +1417,14 @@ update_call_expr (struct cgraph_node *new_version) /* Update the call expr on the edges to call the new version. */ for (e = new_version->callers; e; e = e->next_caller) - gimple_call_set_fndecl (e->call_stmt, new_version->decl); + { + struct function *inner_function = DECL_STRUCT_FUNCTION (e->caller->decl); + gimple_call_set_fndecl (e->call_stmt, new_version->decl); + /* Update EH information too, just in case. */ + if (!stmt_could_throw_p (e->call_stmt) + && lookup_stmt_eh_region_fn (inner_function, e->call_stmt)) + remove_stmt_from_eh_region_fn (inner_function, e->call_stmt); + } } @@ -1528,20 +1531,24 @@ cgraph_function_versioning (struct cgraph_node *old_version_node, /* Copy the OLD_VERSION_NODE function tree to the new version. */ tree_function_versioning (old_decl, new_decl, tree_map, false, args_to_skip); - /* Update the call_expr on the edges to call the new version node. */ - update_call_expr (new_version_node); /* Update the new version's properties. - Make The new version visible only within this translation unit. + Make The new version visible only within this translation unit. Make sure + that is not weak also. ??? We cannot use COMDAT linkage because there is no ABI support for this. */ DECL_EXTERNAL (new_version_node->decl) = 0; DECL_ONE_ONLY (new_version_node->decl) = 0; TREE_PUBLIC (new_version_node->decl) = 0; DECL_COMDAT (new_version_node->decl) = 0; + DECL_WEAK (new_version_node->decl) = 0; new_version_node->local.externally_visible = 0; new_version_node->local.local = 1; new_version_node->lowered = true; + + /* Update the call_expr on the edges to call the new version node. */ + update_call_expr (new_version_node); + cgraph_call_function_insertion_hooks (new_version_node); return new_version_node; } |