diff options
author | Richard Guenther <rguenther@suse.de> | 2009-09-04 18:54:01 +0000 |
---|---|---|
committer | Richard Biener <rguenth@gcc.gnu.org> | 2009-09-04 18:54:01 +0000 |
commit | 5f1a9ebbc159cb2cad9605777f92e0c73f4cee76 (patch) | |
tree | 9b50836e0fbce4cffa70a6a5b2dd3eccf520eee7 /gcc/cgraphunit.c | |
parent | 8d142c15c918df6d30aebd44ad34f2700254c25c (diff) | |
download | gcc-5f1a9ebbc159cb2cad9605777f92e0c73f4cee76.zip gcc-5f1a9ebbc159cb2cad9605777f92e0c73f4cee76.tar.gz gcc-5f1a9ebbc159cb2cad9605777f92e0c73f4cee76.tar.bz2 |
re PR middle-end/41257 (Bogus error '*.LTHUNK0' aliased to undefined symbol '_ZN1CD1Ev')
2009-09-04 Richard Guenther <rguenther@suse.de>
PR middle-end/41257
* (cgraph_finalize_compilation_unit): Move finalizing aliases
after emitting tunks. Move emitting thunks and ctors from ...
(cgraph_optimize): ... here. Remove redundant
cgraph_analyze_functions.
* varasm.c (find_decl_and_mark_needed): Remove no longer
necessary check.
(finish_aliases_1): Adjust check for thunk aliases.
* g++.dg/torture/pr41257.C: New testcase.
From-SVN: r151431
Diffstat (limited to 'gcc/cgraphunit.c')
-rw-r--r-- | gcc/cgraphunit.c | 74 |
1 files changed, 37 insertions, 37 deletions
diff --git a/gcc/cgraphunit.c b/gcc/cgraphunit.c index 1505b56..0acc472 100644 --- a/gcc/cgraphunit.c +++ b/gcc/cgraphunit.c @@ -1018,6 +1018,30 @@ cgraph_analyze_functions (void) ggc_collect (); } + +/* Emit thunks for every node in the cgraph. + FIXME: We really ought to emit thunks only for functions that are needed. */ + +static void +cgraph_emit_thunks (void) +{ + struct cgraph_node *n; + + for (n = cgraph_nodes; n; n = n->next) + { + /* Only emit thunks on functions defined in this TU. + Note that this may emit more thunks than strictly necessary. + During optimization some nodes may disappear. It would be + nice to only emit thunks only for the functions that will be + emitted, but we cannot know that until the inliner and other + IPA passes have run (see the sequencing of the call to + cgraph_mark_functions_to_output in cgraph_optimize). */ + if (!DECL_EXTERNAL (n->decl)) + lang_hooks.callgraph.emit_associated_thunks (n->decl); + } +} + + /* Analyze the whole compilation unit once it is parsed completely. */ void @@ -1026,8 +1050,16 @@ cgraph_finalize_compilation_unit (void) /* Do not skip analyzing the functions if there were errors, we miss diagnostics for following functions otherwise. */ + /* Emit size functions we didn't inline. */ finalize_size_functions (); - finish_aliases_1 (); + + /* Emit thunks, if needed. */ + if (lang_hooks.callgraph.emit_associated_thunks) + cgraph_emit_thunks (); + + /* Call functions declared with the "constructor" or "destructor" + attribute. */ + cgraph_build_cdtor_fns (); if (!quiet_flag) { @@ -1035,6 +1067,10 @@ cgraph_finalize_compilation_unit (void) fflush (stderr); } + /* Mark alias targets necessary and emit diagnostics. */ + finish_aliases_1 (); + + /* Gimplify and lower all functions. */ timevar_push (TV_CGRAPH); cgraph_analyze_functions (); timevar_pop (TV_CGRAPH); @@ -1322,29 +1358,6 @@ ipa_passes (void) } -/* Emit thunks for every node in the cgraph. - FIXME: We really ought to emit thunks only for functions that are needed. */ - -static void -cgraph_emit_thunks (void) -{ - struct cgraph_node *n; - - for (n = cgraph_nodes; n; n = n->next) - { - /* Only emit thunks on functions defined in this TU. - Note that this may emit more thunks than strictly necessary. - During optimization some nodes may disappear. It would be - nice to only emit thunks only for the functions that will be - emitted, but we cannot know that until the inliner and other - IPA passes have run (see the sequencing of the call to - cgraph_mark_functions_to_output in cgraph_optimize). */ - if (!DECL_EXTERNAL (n->decl)) - lang_hooks.callgraph.emit_associated_thunks (n->decl); - } -} - - /* Perform simple optimizations based on callgraph. */ static void @@ -1357,22 +1370,9 @@ cgraph_optimize (void) verify_cgraph (); #endif - /* Emit thunks, if needed. */ - if (lang_hooks.callgraph.emit_associated_thunks) - { - cgraph_emit_thunks (); - if (errorcount || sorrycount) - return; - } - - /* Call functions declared with the "constructor" or "destructor" - attribute. */ - cgraph_build_cdtor_fns (); - /* Frontend may output common variables after the unit has been finalized. It is safe to deal with them here as they are always zero initialized. */ varpool_analyze_pending_decls (); - cgraph_analyze_functions (); timevar_push (TV_CGRAPHOPT); if (pre_ipa_mem_report) |