From 88f592e3f4117e5da3da84f9bd2b1da8c4bc9a99 Mon Sep 17 00:00:00 2001 From: Jan Hubicka Date: Mon, 14 Apr 2014 21:59:00 +0200 Subject: [PATCH] ipa-devirt.c (maybe_record_node): Ignore all non-methods (including cxa_pure_virtual). * ipa-devirt.c (maybe_record_node): Ignore all non-methods (including cxa_pure_virtual). From-SVN: r209391 --- gcc/ChangeLog | 5 +++++ gcc/ipa-devirt.c | 18 ++++++++++-------- 2 files changed, 15 insertions(+), 8 deletions(-) diff --git a/gcc/ChangeLog b/gcc/ChangeLog index f2c127c97bb..ca7dfb51d0e 100644 --- a/gcc/ChangeLog +++ b/gcc/ChangeLog @@ -1,3 +1,8 @@ +2014-04-14 Jan Hubicka + + * ipa-devirt.c (maybe_record_node): Ignore all non-methods (including + cxa_pure_virtual). + 2014-04-14 Paolo Carlini * tree.h (TYPE_IDENTIFIER): Declare. diff --git a/gcc/ipa-devirt.c b/gcc/ipa-devirt.c index 03a6c5b5d3b..3a5432e13c1 100644 --- a/gcc/ipa-devirt.c +++ b/gcc/ipa-devirt.c @@ -611,7 +611,12 @@ maybe_record_node (vec &nodes, bool *completep) { struct cgraph_node *target_node; - enum built_in_function fcode; + + /* cxa_pure_virtual and __builtin_unreachable do not need to be added into + list of targets; the runtime effect of calling them is undefined. + Only "real" virtual methods should be accounted. */ + if (target && TREE_CODE (TREE_TYPE (target)) != METHOD_TYPE) + return; if (!can_refer) { @@ -619,22 +624,19 @@ maybe_record_node (vec &nodes, is when we completely optimized it out. */ if (flag_ltrans || !target - || !type_in_anonymous_namespace_p (DECL_CONTEXT (target))) + || !type_in_anonymous_namespace_p (DECL_CONTEXT (target))) *completep = false; return; } - if (!target - /* Those are used to mark impossible scenarios. */ - || (fcode = DECL_FUNCTION_CODE (target)) - == BUILT_IN_UNREACHABLE - || fcode == BUILT_IN_TRAP) + if (!target) return; target_node = cgraph_get_node (target); if (target_node != NULL - && (TREE_PUBLIC (target) + && ((TREE_PUBLIC (target) + || DECL_EXTERNAL (target)) || target_node->definition) && symtab_real_symbol_p (target_node)) { -- 2.30.2