From 0987ffe7c18bf1bf5830364e405009ed8f4a61bb Mon Sep 17 00:00:00 2001 From: Jan Hubicka Date: Mon, 26 Aug 2013 17:38:33 +0200 Subject: [PATCH] ipa.c (comdat_can_be_unshared_p_1): C++ constructors and destructors can be unshared. * ipa.c (comdat_can_be_unshared_p_1): C++ constructors and destructors can be unshared. From-SVN: r202001 --- gcc/ChangeLog | 5 +++++ gcc/ipa.c | 8 ++++++-- 2 files changed, 11 insertions(+), 2 deletions(-) diff --git a/gcc/ChangeLog b/gcc/ChangeLog index c41ad229d9d..19ddd93e036 100644 --- a/gcc/ChangeLog +++ b/gcc/ChangeLog @@ -1,3 +1,8 @@ +2013-08-26 Jan Hubicka + + * ipa.c (comdat_can_be_unshared_p_1): C++ constructors and destructors + can be unshared. + 2013-08-26 Joern Rennecke * reload.c (find_valid_class): Allow classes that do not include diff --git a/gcc/ipa.c b/gcc/ipa.c index 370032b84e7..778a88fcbdf 100644 --- a/gcc/ipa.c +++ b/gcc/ipa.c @@ -574,9 +574,13 @@ static bool comdat_can_be_unshared_p_1 (symtab_node node) { /* When address is taken, we don't know if equality comparison won't - break eventually. Exception are virutal functions and vtables, - where this is not possible by language standard. */ + break eventually. Exception are virutal functions, C++ + constructors/destructors and vtables, where this is not possible by + language standard. */ if (!DECL_VIRTUAL_P (node->symbol.decl) + && (TREE_CODE (node->symbol.decl) != FUNCTION_DECL + || (!DECL_CXX_CONSTRUCTOR_P (node->symbol.decl) + && !DECL_CXX_DESTRUCTOR_P (node->symbol.decl))) && address_taken_from_non_vtable_p (node)) return false; -- 2.30.2