From: hubicka Date: Mon, 14 Apr 2014 19:59:00 +0000 (+0000) Subject: * ipa-devirt.c (maybe_record_node): Ignore all non-methods (including X-Git-Tag: upstream/5.3.0~9014 X-Git-Url: http://review.tizen.org/git/?a=commitdiff_plain;h=49209ca7c1a7fc226f3d7705aec7341636a9146c;p=platform%2Fupstream%2Flinaro-gcc.git * ipa-devirt.c (maybe_record_node): Ignore all non-methods (including cxa_pure_virtual). git-svn-id: svn+ssh://gcc.gnu.org/svn/gcc/trunk@209391 138bc75d-0d04-0410-961f-82ee72b054a4 --- diff --git a/gcc/ChangeLog b/gcc/ChangeLog index f2c127c..ca7dfb5 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 03a6c5b..3a5432e 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)) {