On 07/28/2014 07:22 AM, Jan Hubicka wrote:
We decide what we can devirtualize in can_refer_decl_in_current_unit_p. So the problem is that we have functions that should be COMDAT but they are not because we decide to not produce their body (believing it is not reachable). Can't we arrange them havin a special flag (CAN_NOT_REFFER) or perhaps just COMDAT flag?
Yes, I think we can just set DECL_COMDAT. This fixes the LTO problem from my previous mail.
Jason
commit 273eacac43a4bdeda9c4838dc05c40615d6a5f80 Author: Jason Merrill <ja...@redhat.com> Date: Tue Jul 29 10:21:45 2014 -0400 PR c++/61659 * method.c (implicitly_declare_fn): Set DECL_COMDAT. Determine linkage after setting the appropriate flags. diff --git a/gcc/cp/method.c b/gcc/cp/method.c index e5fa0c1..f86a214 100644 --- a/gcc/cp/method.c +++ b/gcc/cp/method.c @@ -1798,8 +1798,6 @@ implicitly_declare_fn (special_function_kind kind, tree type, DECL_ARGUMENTS (fn) = this_parm; grokclassfn (type, fn, kind == sfk_destructor ? DTOR_FLAG : NO_SPECIAL); - set_linkage_according_to_type (type, fn); - rest_of_decl_compilation (fn, toplevel_bindings_p (), at_eof); DECL_IN_AGGR_P (fn) = 1; DECL_ARTIFICIAL (fn) = 1; DECL_DEFAULTED_FN (fn) = 1; @@ -1811,6 +1809,9 @@ implicitly_declare_fn (special_function_kind kind, tree type, DECL_EXTERNAL (fn) = true; DECL_NOT_REALLY_EXTERN (fn) = 1; DECL_DECLARED_INLINE_P (fn) = 1; + DECL_COMDAT (fn) = 1; + set_linkage_according_to_type (type, fn); + rest_of_decl_compilation (fn, toplevel_bindings_p (), at_eof); gcc_assert (!TREE_USED (fn)); /* Restore PROCESSING_TEMPLATE_DECL. */