aboutsummaryrefslogtreecommitdiff
path: root/gcc/varasm.c
diff options
context:
space:
mode:
authorJakub Jelinek <jakub@redhat.com>2005-04-25 00:06:37 +0200
committerJakub Jelinek <jakub@gcc.gnu.org>2005-04-25 00:06:37 +0200
commit8634c649cb1ea6d85a53f1fab3bd28af869b934f (patch)
treeceb41f874d3b1e3d612a3d2785020f503973c21a /gcc/varasm.c
parent49fc196e8edd206d1cd275cd015238e429056db7 (diff)
downloadgcc-8634c649cb1ea6d85a53f1fab3bd28af869b934f.zip
gcc-8634c649cb1ea6d85a53f1fab3bd28af869b934f.tar.gz
gcc-8634c649cb1ea6d85a53f1fab3bd28af869b934f.tar.bz2
re PR middle-end/20991 (ICE in cgraph_mark_reachable_node)
PR middle-end/20991 * cgraph.h (cgraph_local_info): Add vtable_method field. * varasm.c (mark_decl_referenced): If cgraph_global_info_ready and node is vtable_method, finalized and not reachable, don't do anything. * class.c: Include cgraph.h. (cp_fold_obj_type_ref): Set node->local.vtable_method. * Make-lang.in (cgraph.o): Depend on $(CGRAPH_H). * g++.dg/opt/pr20991.C: New test. From-SVN: r98674
Diffstat (limited to 'gcc/varasm.c')
-rw-r--r--gcc/varasm.c12
1 files changed, 9 insertions, 3 deletions
diff --git a/gcc/varasm.c b/gcc/varasm.c
index 86d386e..bab9437 100644
--- a/gcc/varasm.c
+++ b/gcc/varasm.c
@@ -1955,9 +1955,15 @@ mark_decl_referenced (tree decl)
{
if (TREE_CODE (decl) == FUNCTION_DECL)
{
- /* Extern inline functions don't become needed when referenced. */
- if (!DECL_EXTERNAL (decl))
- cgraph_mark_needed_node (cgraph_node (decl));
+ /* Extern inline functions don't become needed when referenced.
+ If we know a method will be emitted in other TU and no new
+ functions can be marked reachable, just use the external
+ definition. */
+ struct cgraph_node *node = cgraph_node (decl);
+ if (!DECL_EXTERNAL (decl)
+ && (!node->local.vtable_method || !cgraph_global_info_ready
+ || !node->local.finalized))
+ cgraph_mark_needed_node (node);
}
else if (TREE_CODE (decl) == VAR_DECL)
{