xref: /dragonfly/contrib/gcc-8.0/gcc/lto/lto-symtab.c (revision 58e805e6)
138fd1498Szrj /* LTO symbol table.
238fd1498Szrj    Copyright (C) 2009-2018 Free Software Foundation, Inc.
338fd1498Szrj    Contributed by CodeSourcery, Inc.
438fd1498Szrj 
538fd1498Szrj This file is part of GCC.
638fd1498Szrj 
738fd1498Szrj GCC is free software; you can redistribute it and/or modify it under
838fd1498Szrj the terms of the GNU General Public License as published by the Free
938fd1498Szrj Software Foundation; either version 3, or (at your option) any later
1038fd1498Szrj version.
1138fd1498Szrj 
1238fd1498Szrj GCC is distributed in the hope that it will be useful, but WITHOUT ANY
1338fd1498Szrj WARRANTY; without even the implied warranty of MERCHANTABILITY or
1438fd1498Szrj FITNESS FOR A PARTICULAR PURPOSE.  See the GNU General Public License
1538fd1498Szrj for more details.
1638fd1498Szrj 
1738fd1498Szrj You should have received a copy of the GNU General Public License
1838fd1498Szrj along with GCC; see the file COPYING3.  If not see
1938fd1498Szrj <http://www.gnu.org/licenses/>.  */
2038fd1498Szrj 
2138fd1498Szrj #include "config.h"
2238fd1498Szrj #include "system.h"
2338fd1498Szrj #include "coretypes.h"
2438fd1498Szrj #include "target.h"
2538fd1498Szrj #include "function.h"
2638fd1498Szrj #include "basic-block.h"
2738fd1498Szrj #include "tree.h"
2838fd1498Szrj #include "gimple.h"
2938fd1498Szrj #include "cgraph.h"
3038fd1498Szrj #include "lto-streamer.h"
3138fd1498Szrj #include "ipa-utils.h"
3238fd1498Szrj #include "builtins.h"
3338fd1498Szrj #include "alias.h"
3438fd1498Szrj #include "lto-symtab.h"
3538fd1498Szrj #include "stringpool.h"
3638fd1498Szrj #include "attribs.h"
3738fd1498Szrj 
3838fd1498Szrj /* Replace the cgraph node NODE with PREVAILING_NODE in the cgraph, merging
3938fd1498Szrj    all edges and removing the old node.  */
4038fd1498Szrj 
4138fd1498Szrj static void
lto_cgraph_replace_node(struct cgraph_node * node,struct cgraph_node * prevailing_node)4238fd1498Szrj lto_cgraph_replace_node (struct cgraph_node *node,
4338fd1498Szrj 			 struct cgraph_node *prevailing_node)
4438fd1498Szrj {
4538fd1498Szrj   struct cgraph_edge *e, *next;
4638fd1498Szrj   bool compatible_p;
4738fd1498Szrj 
4838fd1498Szrj   if (symtab->dump_file)
4938fd1498Szrj     {
5038fd1498Szrj       fprintf (symtab->dump_file, "Replacing cgraph node %s by %s"
5138fd1498Szrj  	       " for symbol %s\n",
5238fd1498Szrj 	       node->dump_name (),
5338fd1498Szrj 	       prevailing_node->dump_name (),
5438fd1498Szrj 	       IDENTIFIER_POINTER ((*targetm.asm_out.mangle_assembler_name)
5538fd1498Szrj 		 (IDENTIFIER_POINTER (DECL_ASSEMBLER_NAME (node->decl)))));
5638fd1498Szrj     }
5738fd1498Szrj 
5838fd1498Szrj   /* Merge node flags.  */
5938fd1498Szrj   if (node->force_output)
6038fd1498Szrj     prevailing_node->mark_force_output ();
6138fd1498Szrj   if (node->forced_by_abi)
6238fd1498Szrj     prevailing_node->forced_by_abi = true;
6338fd1498Szrj   if (node->address_taken)
6438fd1498Szrj     {
6538fd1498Szrj       gcc_assert (!prevailing_node->global.inlined_to);
6638fd1498Szrj       prevailing_node->mark_address_taken ();
6738fd1498Szrj     }
6838fd1498Szrj   if (node->definition && prevailing_node->definition
6938fd1498Szrj       && DECL_COMDAT (node->decl) && DECL_COMDAT (prevailing_node->decl))
7038fd1498Szrj     prevailing_node->merged_comdat = true;
7138fd1498Szrj 
7238fd1498Szrj   /* Redirect all incoming edges.  */
7338fd1498Szrj   compatible_p
7438fd1498Szrj     = types_compatible_p (TREE_TYPE (TREE_TYPE (prevailing_node->decl)),
7538fd1498Szrj 			  TREE_TYPE (TREE_TYPE (node->decl)));
7638fd1498Szrj   for (e = node->callers; e; e = next)
7738fd1498Szrj     {
7838fd1498Szrj       next = e->next_caller;
7938fd1498Szrj       e->redirect_callee (prevailing_node);
8038fd1498Szrj       /* If there is a mismatch between the supposed callee return type and
8138fd1498Szrj 	 the real one do not attempt to inline this function.
8238fd1498Szrj 	 ???  We really need a way to match function signatures for ABI
8338fd1498Szrj 	 compatibility and perform related promotions at inlining time.  */
8438fd1498Szrj       if (!compatible_p)
8538fd1498Szrj 	{
8638fd1498Szrj 	  e->inline_failed = CIF_LTO_MISMATCHED_DECLARATIONS;
8738fd1498Szrj 	  e->call_stmt_cannot_inline_p = 1;
8838fd1498Szrj 	}
8938fd1498Szrj     }
9038fd1498Szrj   /* Redirect incomming references.  */
9138fd1498Szrj   prevailing_node->clone_referring (node);
9238fd1498Szrj 
9338fd1498Szrj   /* Fix instrumentation references.  */
9438fd1498Szrj   if (node->instrumented_version)
9538fd1498Szrj     {
9638fd1498Szrj       gcc_assert (node->instrumentation_clone
9738fd1498Szrj 		  == prevailing_node->instrumentation_clone);
9838fd1498Szrj       node->instrumented_version->instrumented_version = prevailing_node;
9938fd1498Szrj       if (!prevailing_node->instrumented_version)
10038fd1498Szrj 	prevailing_node->instrumented_version = node->instrumented_version;
10138fd1498Szrj       /* Need to reset node->instrumented_version to NULL,
10238fd1498Szrj 	 otherwise node removal code would reset
10338fd1498Szrj 	 node->instrumented_version->instrumented_version.  */
10438fd1498Szrj       node->instrumented_version = NULL;
10538fd1498Szrj     }
10638fd1498Szrj 
10738fd1498Szrj   lto_free_function_in_decl_state_for_node (node);
10838fd1498Szrj 
10938fd1498Szrj   if (node->decl != prevailing_node->decl)
11038fd1498Szrj     node->release_body ();
11138fd1498Szrj 
11238fd1498Szrj   /* Finally remove the replaced node.  */
11338fd1498Szrj   node->remove ();
11438fd1498Szrj }
11538fd1498Szrj 
11638fd1498Szrj /* Replace the cgraph node NODE with PREVAILING_NODE in the cgraph, merging
11738fd1498Szrj    all edges and removing the old node.  */
11838fd1498Szrj 
11938fd1498Szrj static void
lto_varpool_replace_node(varpool_node * vnode,varpool_node * prevailing_node)12038fd1498Szrj lto_varpool_replace_node (varpool_node *vnode,
12138fd1498Szrj 			  varpool_node *prevailing_node)
12238fd1498Szrj {
12338fd1498Szrj   gcc_assert (!vnode->definition || prevailing_node->definition);
12438fd1498Szrj   gcc_assert (!vnode->analyzed || prevailing_node->analyzed);
12538fd1498Szrj 
12638fd1498Szrj   prevailing_node->clone_referring (vnode);
12738fd1498Szrj   if (vnode->force_output)
12838fd1498Szrj     prevailing_node->force_output = true;
12938fd1498Szrj   if (vnode->forced_by_abi)
13038fd1498Szrj     prevailing_node->forced_by_abi = true;
13138fd1498Szrj 
13238fd1498Szrj   /* Be sure we can garbage collect the initializer.  */
13338fd1498Szrj   if (DECL_INITIAL (vnode->decl)
13438fd1498Szrj       && vnode->decl != prevailing_node->decl)
13538fd1498Szrj     DECL_INITIAL (vnode->decl) = error_mark_node;
13638fd1498Szrj 
13738fd1498Szrj   /* Check and report ODR violations on virtual tables.  */
13838fd1498Szrj   if (DECL_VIRTUAL_P (vnode->decl) || DECL_VIRTUAL_P (prevailing_node->decl))
13938fd1498Szrj     compare_virtual_tables (prevailing_node, vnode);
14038fd1498Szrj 
14138fd1498Szrj   if (vnode->tls_model != prevailing_node->tls_model)
14238fd1498Szrj     {
14338fd1498Szrj       bool error = false;
14438fd1498Szrj 
14538fd1498Szrj       /* Non-TLS and TLS never mix together.  Also emulated model is not
14638fd1498Szrj 	 compatible with anything else.  */
14738fd1498Szrj       if (prevailing_node->tls_model == TLS_MODEL_NONE
14838fd1498Szrj 	  || prevailing_node->tls_model == TLS_MODEL_EMULATED
14938fd1498Szrj 	  || vnode->tls_model == TLS_MODEL_NONE
15038fd1498Szrj 	  || vnode->tls_model == TLS_MODEL_EMULATED)
15138fd1498Szrj 	error = true;
15238fd1498Szrj       /* Linked is silently supporting transitions
15338fd1498Szrj 	 GD -> IE, GD -> LE, LD -> LE, IE -> LE, LD -> IE.
15438fd1498Szrj 	 Do the same transitions and error out on others.  */
15538fd1498Szrj       else if ((prevailing_node->tls_model == TLS_MODEL_REAL
15638fd1498Szrj 		|| prevailing_node->tls_model == TLS_MODEL_LOCAL_DYNAMIC)
15738fd1498Szrj 	       && (vnode->tls_model == TLS_MODEL_INITIAL_EXEC
15838fd1498Szrj 		   || vnode->tls_model == TLS_MODEL_LOCAL_EXEC))
15938fd1498Szrj 	prevailing_node->tls_model = vnode->tls_model;
16038fd1498Szrj       else if ((vnode->tls_model == TLS_MODEL_REAL
16138fd1498Szrj 		|| vnode->tls_model == TLS_MODEL_LOCAL_DYNAMIC)
16238fd1498Szrj 	       && (prevailing_node->tls_model == TLS_MODEL_INITIAL_EXEC
16338fd1498Szrj 		   || prevailing_node->tls_model == TLS_MODEL_LOCAL_EXEC))
16438fd1498Szrj 	;
16538fd1498Szrj       else if (prevailing_node->tls_model == TLS_MODEL_INITIAL_EXEC
16638fd1498Szrj 	       && vnode->tls_model == TLS_MODEL_LOCAL_EXEC)
16738fd1498Szrj 	prevailing_node->tls_model = vnode->tls_model;
16838fd1498Szrj       else if (vnode->tls_model == TLS_MODEL_INITIAL_EXEC
16938fd1498Szrj 	       && prevailing_node->tls_model == TLS_MODEL_LOCAL_EXEC)
17038fd1498Szrj 	;
17138fd1498Szrj       else
17238fd1498Szrj 	error = true;
17338fd1498Szrj       if (error)
17438fd1498Szrj 	{
17538fd1498Szrj 	  error_at (DECL_SOURCE_LOCATION (vnode->decl),
17638fd1498Szrj 		    "%qD is defined with tls model %s", vnode->decl, tls_model_names [vnode->tls_model]);
17738fd1498Szrj 	  inform (DECL_SOURCE_LOCATION (prevailing_node->decl),
17838fd1498Szrj 		  "previously defined here as %s",
17938fd1498Szrj 		  tls_model_names [prevailing_node->tls_model]);
18038fd1498Szrj 	}
18138fd1498Szrj     }
18238fd1498Szrj   /* Finally remove the replaced node.  */
18338fd1498Szrj   vnode->remove ();
18438fd1498Szrj }
18538fd1498Szrj 
18638fd1498Szrj /* Return non-zero if we want to output waring about T1 and T2.
18738fd1498Szrj    Return value is a bitmask of reasons of violation:
18838fd1498Szrj    Bit 0 indicates that types are not compatible.
18938fd1498Szrj    Bit 1 indicates that types are not compatible because of C++ ODR rule.
19038fd1498Szrj    If COMMON_OR_EXTERN is true, do not warn on size mismatches of arrays.
19138fd1498Szrj    Bit 2 indicates that types are not ODR compatible
19238fd1498Szrj 
19338fd1498Szrj    The interoperability rules are language specific.  At present we do only
19438fd1498Szrj    full checking for C++ ODR rule and for other languages we do basic check
19538fd1498Szrj    that data structures are of same size and TBAA compatible.  Our TBAA
19638fd1498Szrj    implementation should be coarse enough so all valid type transitions
19738fd1498Szrj    across different languages are allowed.
19838fd1498Szrj 
19938fd1498Szrj    In partiucular we thus allow almost arbitrary type changes with
20038fd1498Szrj    -fno-strict-aliasing which may be tough of as a feature rather than bug
20138fd1498Szrj    as it allows to implement dodgy tricks in the language runtimes.
20238fd1498Szrj 
20338fd1498Szrj    Naturally this code can be strenghtened significantly if we could track
20438fd1498Szrj    down the language of origin.  */
20538fd1498Szrj 
20638fd1498Szrj static int
warn_type_compatibility_p(tree prevailing_type,tree type,bool common_or_extern)20738fd1498Szrj warn_type_compatibility_p (tree prevailing_type, tree type,
20838fd1498Szrj 			   bool common_or_extern)
20938fd1498Szrj {
21038fd1498Szrj   int lev = 0;
21138fd1498Szrj   bool odr_p = odr_or_derived_type_p (prevailing_type)
21238fd1498Szrj 	       && odr_or_derived_type_p (type);
21338fd1498Szrj 
21438fd1498Szrj   if (prevailing_type == type)
21538fd1498Szrj     return 0;
21638fd1498Szrj 
21738fd1498Szrj   /* C++ provide a robust way to check for type compatibility via the ODR
21838fd1498Szrj      rule.  */
21938fd1498Szrj   if (odr_p && !odr_types_equivalent_p (prevailing_type, type))
22038fd1498Szrj     lev |= 2;
22138fd1498Szrj 
22238fd1498Szrj   /* Function types needs special care, because types_compatible_p never
22338fd1498Szrj      thinks prototype is compatible to non-prototype.  */
22438fd1498Szrj   if (TREE_CODE (type) == FUNCTION_TYPE || TREE_CODE (type) == METHOD_TYPE)
22538fd1498Szrj     {
22638fd1498Szrj       if (TREE_CODE (type) != TREE_CODE (prevailing_type))
22738fd1498Szrj 	lev |= 1;
22838fd1498Szrj       lev |= warn_type_compatibility_p (TREE_TYPE (prevailing_type),
22938fd1498Szrj 				        TREE_TYPE (type), false);
23038fd1498Szrj       if (TREE_CODE (type) == METHOD_TYPE
23138fd1498Szrj 	  && TREE_CODE (prevailing_type) == METHOD_TYPE)
23238fd1498Szrj 	lev |= warn_type_compatibility_p (TYPE_METHOD_BASETYPE (prevailing_type),
23338fd1498Szrj 					  TYPE_METHOD_BASETYPE (type), false);
23438fd1498Szrj       if (prototype_p (prevailing_type) && prototype_p (type)
23538fd1498Szrj 	  && TYPE_ARG_TYPES (prevailing_type) != TYPE_ARG_TYPES (type))
23638fd1498Szrj 	{
23738fd1498Szrj 	  tree parm1, parm2;
23838fd1498Szrj 	  for (parm1 = TYPE_ARG_TYPES (prevailing_type),
23938fd1498Szrj 	       parm2 = TYPE_ARG_TYPES (type);
24038fd1498Szrj 	       parm1 && parm2;
24138fd1498Szrj 	       parm1 = TREE_CHAIN (parm1),
24238fd1498Szrj 	       parm2 = TREE_CHAIN (parm2))
24338fd1498Szrj 	    lev |= warn_type_compatibility_p (TREE_VALUE (parm1),
24438fd1498Szrj 					      TREE_VALUE (parm2), false);
24538fd1498Szrj 	  if (parm1 || parm2)
24638fd1498Szrj 	    lev |= odr_p ? 3 : 1;
24738fd1498Szrj 	}
24838fd1498Szrj       if (comp_type_attributes (prevailing_type, type) == 0)
24938fd1498Szrj 	lev |= 1;
25038fd1498Szrj       return lev;
25138fd1498Szrj     }
25238fd1498Szrj 
25338fd1498Szrj   /* Get complete type.  */
25438fd1498Szrj   prevailing_type = TYPE_MAIN_VARIANT (prevailing_type);
25538fd1498Szrj   type = TYPE_MAIN_VARIANT (type);
25638fd1498Szrj 
25738fd1498Szrj   /* We can not use types_compatible_p because we permit some changes
25838fd1498Szrj      across types.  For example unsigned size_t and "signed size_t" may be
25938fd1498Szrj      compatible when merging C and Fortran types.  */
26038fd1498Szrj   if (COMPLETE_TYPE_P (prevailing_type)
26138fd1498Szrj       && COMPLETE_TYPE_P (type)
26238fd1498Szrj       /* While global declarations are never variadic, we can recurse here
26338fd1498Szrj 	 for function parameter types.  */
26438fd1498Szrj       && TREE_CODE (TYPE_SIZE (type)) == INTEGER_CST
26538fd1498Szrj       && TREE_CODE (TYPE_SIZE (prevailing_type)) == INTEGER_CST
26638fd1498Szrj       && !tree_int_cst_equal (TYPE_SIZE (type), TYPE_SIZE (prevailing_type)))
26738fd1498Szrj     {
26838fd1498Szrj        /* As a special case do not warn about merging
26938fd1498Szrj 	  int a[];
27038fd1498Szrj 	  and
27138fd1498Szrj 	  int a[]={1,2,3};
27238fd1498Szrj 	  here the first declaration is COMMON or EXTERN
27338fd1498Szrj 	  and sizeof(a) == sizeof (int).  */
27438fd1498Szrj        if (!common_or_extern
27538fd1498Szrj 	   || TREE_CODE (type) != ARRAY_TYPE
27638fd1498Szrj 	   || TYPE_SIZE (type) != TYPE_SIZE (TREE_TYPE (type)))
27738fd1498Szrj        lev |= 1;
27838fd1498Szrj     }
27938fd1498Szrj 
28038fd1498Szrj   /* Verify TBAA compatibility.  Take care of alias set 0 and the fact that
28138fd1498Szrj      we make ptr_type_node to TBAA compatible with every other type.  */
28238fd1498Szrj   if (type_with_alias_set_p (type) && type_with_alias_set_p (prevailing_type))
28338fd1498Szrj     {
28438fd1498Szrj       alias_set_type set1 = get_alias_set (type);
28538fd1498Szrj       alias_set_type set2 = get_alias_set (prevailing_type);
28638fd1498Szrj 
28738fd1498Szrj       if (set1 && set2 && set1 != set2)
28838fd1498Szrj 	{
28938fd1498Szrj           tree t1 = type, t2 = prevailing_type;
29038fd1498Szrj 
29138fd1498Szrj 	  /* Alias sets of arrays with aliased components are the same as alias
29238fd1498Szrj 	     sets of the inner types.  */
29338fd1498Szrj 	  while (TREE_CODE (t1) == ARRAY_TYPE
29438fd1498Szrj 		 && !TYPE_NONALIASED_COMPONENT (t1)
29538fd1498Szrj 		 && TREE_CODE (t2) == ARRAY_TYPE
29638fd1498Szrj 		 && !TYPE_NONALIASED_COMPONENT (t2))
29738fd1498Szrj 	    {
29838fd1498Szrj 	      t1 = TREE_TYPE (t1);
29938fd1498Szrj 	      t2 = TREE_TYPE (t2);
30038fd1498Szrj 	    }
30138fd1498Szrj           if ((!POINTER_TYPE_P (t1) || !POINTER_TYPE_P (t2))
30238fd1498Szrj 	      || (set1 != TYPE_ALIAS_SET (ptr_type_node)
30338fd1498Szrj 		  && set2 != TYPE_ALIAS_SET (ptr_type_node)))
30438fd1498Szrj              lev |= 5;
30538fd1498Szrj 	}
30638fd1498Szrj     }
30738fd1498Szrj 
30838fd1498Szrj   return lev;
30938fd1498Szrj }
31038fd1498Szrj 
31138fd1498Szrj /* Merge two variable or function symbol table entries PREVAILING and ENTRY.
31238fd1498Szrj    Return false if the symbols are not fully compatible and a diagnostic
31338fd1498Szrj    should be emitted.  */
31438fd1498Szrj 
31538fd1498Szrj static bool
lto_symtab_merge(symtab_node * prevailing,symtab_node * entry)31638fd1498Szrj lto_symtab_merge (symtab_node *prevailing, symtab_node *entry)
31738fd1498Szrj {
31838fd1498Szrj   tree prevailing_decl = prevailing->decl;
31938fd1498Szrj   tree decl = entry->decl;
32038fd1498Szrj 
32138fd1498Szrj   if (prevailing_decl == decl)
32238fd1498Szrj     return true;
32338fd1498Szrj 
32438fd1498Szrj   if (TREE_CODE (decl) != TREE_CODE (prevailing_decl))
32538fd1498Szrj     return false;
32638fd1498Szrj 
32738fd1498Szrj   /* Merge decl state in both directions, we may still end up using
32838fd1498Szrj      the new decl.  */
32938fd1498Szrj   TREE_ADDRESSABLE (prevailing_decl) |= TREE_ADDRESSABLE (decl);
33038fd1498Szrj   TREE_ADDRESSABLE (decl) |= TREE_ADDRESSABLE (prevailing_decl);
33138fd1498Szrj 
33238fd1498Szrj   /* The linker may ask us to combine two incompatible symbols.
33338fd1498Szrj      Detect this case and notify the caller of required diagnostics.  */
33438fd1498Szrj 
33538fd1498Szrj   if (TREE_CODE (decl) == FUNCTION_DECL)
33638fd1498Szrj     {
33738fd1498Szrj       /* Merge decl state in both directions, we may still end up using
33838fd1498Szrj 	 the new decl.  */
33938fd1498Szrj       DECL_POSSIBLY_INLINED (prevailing_decl) |= DECL_POSSIBLY_INLINED (decl);
34038fd1498Szrj       DECL_POSSIBLY_INLINED (decl) |= DECL_POSSIBLY_INLINED (prevailing_decl);
34138fd1498Szrj 
34238fd1498Szrj       if (warn_type_compatibility_p (TREE_TYPE (prevailing_decl),
34338fd1498Szrj 			             TREE_TYPE (decl),
34438fd1498Szrj 				     DECL_COMMON (decl)
34538fd1498Szrj 				     || DECL_EXTERNAL (decl)))
34638fd1498Szrj 	return false;
34738fd1498Szrj 
34838fd1498Szrj       return true;
34938fd1498Szrj     }
35038fd1498Szrj 
35138fd1498Szrj   if (warn_type_compatibility_p (TREE_TYPE (prevailing_decl),
35238fd1498Szrj 				 TREE_TYPE (decl),
35338fd1498Szrj 				 DECL_COMMON (decl) || DECL_EXTERNAL (decl)))
35438fd1498Szrj     return false;
35538fd1498Szrj 
35638fd1498Szrj   /* There is no point in comparing too many details of the decls here.
35738fd1498Szrj      The type compatibility checks or the completing of types has properly
35838fd1498Szrj      dealt with most issues.  */
35938fd1498Szrj 
36038fd1498Szrj   /* The following should all not invoke fatal errors as in non-LTO
36138fd1498Szrj      mode the linker wouldn't complain either.  Just emit warnings.  */
36238fd1498Szrj 
36338fd1498Szrj   /* Report a warning if user-specified alignments do not match.  */
36438fd1498Szrj   if ((DECL_USER_ALIGN (prevailing_decl) && DECL_USER_ALIGN (decl))
36538fd1498Szrj       && DECL_ALIGN (prevailing_decl) < DECL_ALIGN (decl))
36638fd1498Szrj     return false;
36738fd1498Szrj 
36838fd1498Szrj   if (DECL_SIZE (decl) && DECL_SIZE (prevailing_decl)
36938fd1498Szrj       && !tree_int_cst_equal (DECL_SIZE (decl), DECL_SIZE (prevailing_decl)))
37038fd1498Szrj       {
37138fd1498Szrj 	if (!DECL_COMMON (decl) && !DECL_EXTERNAL (decl))
37238fd1498Szrj 	  return false;
37338fd1498Szrj 
37438fd1498Szrj 	tree type = TREE_TYPE (decl);
37538fd1498Szrj 
37638fd1498Szrj 	/* For record type, check for array at the end of the structure.  */
37738fd1498Szrj 	if (TREE_CODE (type) == RECORD_TYPE)
37838fd1498Szrj 	  {
37938fd1498Szrj 	    tree field = TYPE_FIELDS (type);
38038fd1498Szrj 	    while (DECL_CHAIN (field) != NULL_TREE)
38138fd1498Szrj 	      field = DECL_CHAIN (field);
38238fd1498Szrj 
38338fd1498Szrj 	    return TREE_CODE (TREE_TYPE (field)) == ARRAY_TYPE;
38438fd1498Szrj 	  }
38538fd1498Szrj       /* As a special case do not warn about merging
38638fd1498Szrj 	 int a[];
38738fd1498Szrj 	 and
38838fd1498Szrj 	 int a[]={1,2,3};
38938fd1498Szrj 	 here the first declaration is COMMON
39038fd1498Szrj 	 and sizeof(a) == sizeof (int).  */
391*58e805e6Szrj 	else if (TREE_CODE (type) != ARRAY_TYPE
392*58e805e6Szrj 		 || (TYPE_SIZE (type) != TYPE_SIZE (TREE_TYPE (type))))
393*58e805e6Szrj 	  return false;
39438fd1498Szrj       }
39538fd1498Szrj 
39638fd1498Szrj   return true;
39738fd1498Szrj }
39838fd1498Szrj 
39938fd1498Szrj /* Return true if the symtab entry E can be replaced by another symtab
40038fd1498Szrj    entry.  */
40138fd1498Szrj 
40238fd1498Szrj static bool
lto_symtab_resolve_replaceable_p(symtab_node * e)40338fd1498Szrj lto_symtab_resolve_replaceable_p (symtab_node *e)
40438fd1498Szrj {
40538fd1498Szrj   if (DECL_EXTERNAL (e->decl)
40638fd1498Szrj       || DECL_COMDAT (e->decl)
40738fd1498Szrj       || DECL_ONE_ONLY (e->decl)
40838fd1498Szrj       || DECL_WEAK (e->decl))
40938fd1498Szrj     return true;
41038fd1498Szrj 
41138fd1498Szrj   if (TREE_CODE (e->decl) == VAR_DECL)
41238fd1498Szrj     return (DECL_COMMON (e->decl)
41338fd1498Szrj 	    || (!flag_no_common && !DECL_INITIAL (e->decl)));
41438fd1498Szrj 
41538fd1498Szrj   return false;
41638fd1498Szrj }
41738fd1498Szrj 
41838fd1498Szrj /* Return true, if the symbol E should be resolved by lto-symtab.
41938fd1498Szrj    Those are all external symbols and all real symbols that are not static (we
42038fd1498Szrj    handle renaming of static later in partitioning).  */
42138fd1498Szrj 
42238fd1498Szrj static bool
lto_symtab_symbol_p(symtab_node * e)42338fd1498Szrj lto_symtab_symbol_p (symtab_node *e)
42438fd1498Szrj {
42538fd1498Szrj   if (!TREE_PUBLIC (e->decl) && !DECL_EXTERNAL (e->decl))
42638fd1498Szrj     return false;
42738fd1498Szrj   return e->real_symbol_p ();
42838fd1498Szrj }
42938fd1498Szrj 
43038fd1498Szrj /* Return true if the symtab entry E can be the prevailing one.  */
43138fd1498Szrj 
43238fd1498Szrj static bool
lto_symtab_resolve_can_prevail_p(symtab_node * e)43338fd1498Szrj lto_symtab_resolve_can_prevail_p (symtab_node *e)
43438fd1498Szrj {
43538fd1498Szrj   if (!lto_symtab_symbol_p (e))
43638fd1498Szrj     return false;
43738fd1498Szrj 
43838fd1498Szrj   /* The C++ frontend ends up neither setting TREE_STATIC nor
43938fd1498Szrj      DECL_EXTERNAL on virtual methods but only TREE_PUBLIC.
44038fd1498Szrj      So do not reject !TREE_STATIC here but only DECL_EXTERNAL.  */
44138fd1498Szrj   if (DECL_EXTERNAL (e->decl))
44238fd1498Szrj     return false;
44338fd1498Szrj 
44438fd1498Szrj   return e->definition;
44538fd1498Szrj }
44638fd1498Szrj 
44738fd1498Szrj /* Resolve the symbol with the candidates in the chain *SLOT and store
44838fd1498Szrj    their resolutions.  */
44938fd1498Szrj 
45038fd1498Szrj static symtab_node *
lto_symtab_resolve_symbols(symtab_node * first)45138fd1498Szrj lto_symtab_resolve_symbols (symtab_node *first)
45238fd1498Szrj {
45338fd1498Szrj   symtab_node *e;
45438fd1498Szrj   symtab_node *prevailing = NULL;
45538fd1498Szrj 
45638fd1498Szrj   /* Always set e->node so that edges are updated to reflect decl merging. */
45738fd1498Szrj   for (e = first; e; e = e->next_sharing_asm_name)
45838fd1498Szrj     if (lto_symtab_symbol_p (e)
45938fd1498Szrj 	&& (e->resolution == LDPR_PREVAILING_DEF_IRONLY
46038fd1498Szrj 	    || e->resolution == LDPR_PREVAILING_DEF_IRONLY_EXP
46138fd1498Szrj 	    || e->resolution == LDPR_PREVAILING_DEF))
46238fd1498Szrj       {
46338fd1498Szrj 	prevailing = e;
46438fd1498Szrj 	break;
46538fd1498Szrj       }
46638fd1498Szrj 
46738fd1498Szrj   /* If the chain is already resolved there is nothing else to do.  */
46838fd1498Szrj   if (prevailing)
46938fd1498Szrj     {
47038fd1498Szrj       /* Assert it's the only one.
47138fd1498Szrj 	 GCC should silence multiple PREVAILING_DEF_IRONLY defs error
47238fd1498Szrj 	 on COMMON symbols since it isn't error.
47338fd1498Szrj 	 See: https://sourceware.org/bugzilla/show_bug.cgi?id=23079.  */
47438fd1498Szrj       for (e = prevailing->next_sharing_asm_name; e; e = e->next_sharing_asm_name)
47538fd1498Szrj 	if (lto_symtab_symbol_p (e)
47638fd1498Szrj 	    && !DECL_COMMON (prevailing->decl)
47738fd1498Szrj 	    && !DECL_COMMON (e->decl)
47838fd1498Szrj 	    && (e->resolution == LDPR_PREVAILING_DEF_IRONLY
47938fd1498Szrj 		|| e->resolution == LDPR_PREVAILING_DEF_IRONLY_EXP
48038fd1498Szrj 		|| e->resolution == LDPR_PREVAILING_DEF))
48138fd1498Szrj 	  fatal_error (input_location, "multiple prevailing defs for %qE",
48238fd1498Szrj 		       DECL_NAME (prevailing->decl));
48338fd1498Szrj       return prevailing;
48438fd1498Szrj     }
48538fd1498Szrj 
48638fd1498Szrj   /* Find the single non-replaceable prevailing symbol and
48738fd1498Szrj      diagnose ODR violations.  */
48838fd1498Szrj   for (e = first; e; e = e->next_sharing_asm_name)
48938fd1498Szrj     {
49038fd1498Szrj       if (!lto_symtab_resolve_can_prevail_p (e))
49138fd1498Szrj 	continue;
49238fd1498Szrj 
49338fd1498Szrj       /* If we have a non-replaceable definition it prevails.  */
49438fd1498Szrj       if (!lto_symtab_resolve_replaceable_p (e))
49538fd1498Szrj 	{
49638fd1498Szrj 	  if (prevailing)
49738fd1498Szrj 	    {
49838fd1498Szrj 	      error_at (DECL_SOURCE_LOCATION (e->decl),
49938fd1498Szrj 			"%qD has already been defined", e->decl);
50038fd1498Szrj 	      inform (DECL_SOURCE_LOCATION (prevailing->decl),
50138fd1498Szrj 		      "previously defined here");
50238fd1498Szrj 	    }
50338fd1498Szrj 	  prevailing = e;
50438fd1498Szrj 	}
50538fd1498Szrj     }
50638fd1498Szrj   if (prevailing)
50738fd1498Szrj     return prevailing;
50838fd1498Szrj 
50938fd1498Szrj   /* Do a second round choosing one from the replaceable prevailing decls.  */
51038fd1498Szrj   for (e = first; e; e = e->next_sharing_asm_name)
51138fd1498Szrj     {
51238fd1498Szrj       if (!lto_symtab_resolve_can_prevail_p (e))
51338fd1498Szrj 	continue;
51438fd1498Szrj 
51538fd1498Szrj       /* Choose the first function that can prevail as prevailing.  */
51638fd1498Szrj       if (TREE_CODE (e->decl) == FUNCTION_DECL)
51738fd1498Szrj 	{
51838fd1498Szrj 	  prevailing = e;
51938fd1498Szrj 	  break;
52038fd1498Szrj 	}
52138fd1498Szrj 
52238fd1498Szrj       /* From variables that can prevail choose the largest one.  */
52338fd1498Szrj       if (!prevailing
52438fd1498Szrj 	  || tree_int_cst_lt (DECL_SIZE (prevailing->decl),
52538fd1498Szrj 			      DECL_SIZE (e->decl))
52638fd1498Szrj 	  /* When variables are equivalent try to chose one that has useful
52738fd1498Szrj 	     DECL_INITIAL.  This makes sense for keyed vtables that are
52838fd1498Szrj 	     DECL_EXTERNAL but initialized.  In units that do not need them
52938fd1498Szrj 	     we replace the initializer by error_mark_node to conserve
53038fd1498Szrj 	     memory.
53138fd1498Szrj 
53238fd1498Szrj 	     We know that the vtable is keyed outside the LTO unit - otherwise
53338fd1498Szrj 	     the keyed instance would prevail.  We still can preserve useful
53438fd1498Szrj 	     info in the initializer.  */
53538fd1498Szrj 	  || (DECL_SIZE (prevailing->decl) == DECL_SIZE (e->decl)
53638fd1498Szrj 	      && (DECL_INITIAL (e->decl)
53738fd1498Szrj 		  && DECL_INITIAL (e->decl) != error_mark_node)
53838fd1498Szrj 	      && (!DECL_INITIAL (prevailing->decl)
53938fd1498Szrj 		  || DECL_INITIAL (prevailing->decl) == error_mark_node)))
54038fd1498Szrj 	prevailing = e;
54138fd1498Szrj     }
54238fd1498Szrj 
54338fd1498Szrj   return prevailing;
54438fd1498Szrj }
54538fd1498Szrj 
54638fd1498Szrj /* Decide if it is OK to merge DECL into PREVAILING.
54738fd1498Szrj    Because we wrap most of uses of declarations in MEM_REF, we can tolerate
54838fd1498Szrj    some differences but other code may inspect directly the DECL.  */
54938fd1498Szrj 
55038fd1498Szrj static bool
lto_symtab_merge_p(tree prevailing,tree decl)55138fd1498Szrj lto_symtab_merge_p (tree prevailing, tree decl)
55238fd1498Szrj {
55338fd1498Szrj   if (TREE_CODE (prevailing) != TREE_CODE (decl))
55438fd1498Szrj     {
55538fd1498Szrj       if (symtab->dump_file)
55638fd1498Szrj 	fprintf (symtab->dump_file, "Not merging decls; "
55738fd1498Szrj 		 "TREE_CODE mismatch\n");
55838fd1498Szrj       return false;
55938fd1498Szrj     }
56038fd1498Szrj   gcc_checking_assert (TREE_CHAIN (prevailing) == TREE_CHAIN (decl));
56138fd1498Szrj 
56238fd1498Szrj   if (TREE_CODE (prevailing) == FUNCTION_DECL)
56338fd1498Szrj     {
56438fd1498Szrj       if (DECL_BUILT_IN (prevailing) != DECL_BUILT_IN (decl))
56538fd1498Szrj 	{
56638fd1498Szrj           if (symtab->dump_file)
56738fd1498Szrj 	    fprintf (symtab->dump_file, "Not merging decls; "
56838fd1498Szrj 		     "DECL_BUILT_IN mismatch\n");
56938fd1498Szrj 	  return false;
57038fd1498Szrj 	}
57138fd1498Szrj       if (DECL_BUILT_IN (prevailing)
57238fd1498Szrj 	  && (DECL_BUILT_IN_CLASS (prevailing) != DECL_BUILT_IN_CLASS (decl)
57338fd1498Szrj 	      || DECL_FUNCTION_CODE (prevailing) != DECL_FUNCTION_CODE (decl)))
57438fd1498Szrj 	{
57538fd1498Szrj           if (symtab->dump_file)
57638fd1498Szrj 	    fprintf (symtab->dump_file, "Not merging decls; "
57738fd1498Szrj 		     "DECL_BUILT_IN_CLASS or CODE mismatch\n");
57838fd1498Szrj 	  return false;
57938fd1498Szrj 	}
58038fd1498Szrj     }
58138fd1498Szrj 
58238fd1498Szrj   /* FIXME: after MPX is removed, use flags_from_decl_or_type
58338fd1498Szrj      function instead.  PR lto/85248.  */
58438fd1498Szrj   if (DECL_ATTRIBUTES (prevailing) != DECL_ATTRIBUTES (decl))
58538fd1498Szrj     {
58638fd1498Szrj       tree prev_attr = lookup_attribute ("error", DECL_ATTRIBUTES (prevailing));
58738fd1498Szrj       tree attr = lookup_attribute ("error", DECL_ATTRIBUTES (decl));
58838fd1498Szrj       if ((prev_attr == NULL) != (attr == NULL)
58938fd1498Szrj 	  || (prev_attr && !attribute_value_equal (prev_attr, attr)))
59038fd1498Szrj 	{
59138fd1498Szrj           if (symtab->dump_file)
59238fd1498Szrj 	    fprintf (symtab->dump_file, "Not merging decls; "
59338fd1498Szrj 		     "error attribute mismatch\n");
59438fd1498Szrj 	  return false;
59538fd1498Szrj 	}
59638fd1498Szrj 
59738fd1498Szrj       prev_attr = lookup_attribute ("warning", DECL_ATTRIBUTES (prevailing));
59838fd1498Szrj       attr = lookup_attribute ("warning", DECL_ATTRIBUTES (decl));
59938fd1498Szrj       if ((prev_attr == NULL) != (attr == NULL)
60038fd1498Szrj 	  || (prev_attr && !attribute_value_equal (prev_attr, attr)))
60138fd1498Szrj 	{
60238fd1498Szrj           if (symtab->dump_file)
60338fd1498Szrj 	    fprintf (symtab->dump_file, "Not merging decls; "
60438fd1498Szrj 		     "warning attribute mismatch\n");
60538fd1498Szrj 	  return false;
60638fd1498Szrj 	}
60738fd1498Szrj 
60838fd1498Szrj       prev_attr = lookup_attribute ("noreturn", DECL_ATTRIBUTES (prevailing));
60938fd1498Szrj       attr = lookup_attribute ("noreturn", DECL_ATTRIBUTES (decl));
61038fd1498Szrj       if ((prev_attr == NULL) != (attr == NULL))
61138fd1498Szrj 	{
61238fd1498Szrj           if (symtab->dump_file)
61338fd1498Szrj 	    fprintf (symtab->dump_file, "Not merging decls; "
61438fd1498Szrj 		     "noreturn attribute mismatch\n");
61538fd1498Szrj 	  return false;
61638fd1498Szrj 	}
61738fd1498Szrj     }
61838fd1498Szrj   return true;
61938fd1498Szrj }
62038fd1498Szrj 
62138fd1498Szrj /* Merge all decls in the symbol table chain to the prevailing decl and
62238fd1498Szrj    issue diagnostics about type mismatches.  If DIAGNOSED_P is true
62338fd1498Szrj    do not issue further diagnostics.*/
62438fd1498Szrj 
62538fd1498Szrj static void
lto_symtab_merge_decls_2(symtab_node * first,bool diagnosed_p)62638fd1498Szrj lto_symtab_merge_decls_2 (symtab_node *first, bool diagnosed_p)
62738fd1498Szrj {
62838fd1498Szrj   symtab_node *prevailing;
62938fd1498Szrj   symtab_node *e;
63038fd1498Szrj   vec<tree> mismatches = vNULL;
63138fd1498Szrj   unsigned i;
63238fd1498Szrj   tree decl;
63338fd1498Szrj   bool tbaa_p = false;
63438fd1498Szrj 
63538fd1498Szrj   /* Nothing to do for a single entry.  */
63638fd1498Szrj   prevailing = first;
63738fd1498Szrj   if (!prevailing->next_sharing_asm_name)
63838fd1498Szrj     return;
63938fd1498Szrj 
64038fd1498Szrj   /* Try to merge each entry with the prevailing one.  */
64138fd1498Szrj   symtab_node *last_prevailing = prevailing, *next;
64238fd1498Szrj   for (e = prevailing->next_sharing_asm_name; e; e = next)
64338fd1498Szrj     {
64438fd1498Szrj       next = e->next_sharing_asm_name;
64538fd1498Szrj 
64638fd1498Szrj       /* Skip non-LTO symbols and symbols whose declaration we already
64738fd1498Szrj 	 visited.  */
64838fd1498Szrj       if (lto_symtab_prevailing_decl (e->decl) != e->decl
64938fd1498Szrj 	  || !lto_symtab_symbol_p (e)
65038fd1498Szrj           || e->decl == prevailing->decl)
65138fd1498Szrj 	continue;
65238fd1498Szrj 
65338fd1498Szrj       if (!lto_symtab_merge (prevailing, e)
65438fd1498Szrj 	  && !diagnosed_p
65538fd1498Szrj 	  && !DECL_ARTIFICIAL (e->decl))
65638fd1498Szrj 	mismatches.safe_push (e->decl);
65738fd1498Szrj 
65838fd1498Szrj       symtab_node *this_prevailing;
65938fd1498Szrj       for (this_prevailing = prevailing; ;
66038fd1498Szrj 	   this_prevailing = this_prevailing->next_sharing_asm_name)
66138fd1498Szrj 	{
66238fd1498Szrj 	  if (this_prevailing->decl != e->decl
66338fd1498Szrj 	      && lto_symtab_merge_p (this_prevailing->decl, e->decl))
66438fd1498Szrj 	    break;
66538fd1498Szrj 	  if (this_prevailing == last_prevailing)
66638fd1498Szrj 	    {
66738fd1498Szrj 	      this_prevailing = NULL;
66838fd1498Szrj 	      break;
66938fd1498Szrj 	    }
67038fd1498Szrj 	}
67138fd1498Szrj 
67238fd1498Szrj       if (this_prevailing)
67338fd1498Szrj 	lto_symtab_prevail_decl (this_prevailing->decl, e->decl);
67438fd1498Szrj       /* Maintain LRU list: relink the new prevaililng symbol
67538fd1498Szrj 	 just after previaling node in the chain and update last_prevailing.
67638fd1498Szrj 	 Since the number of possible declarations of a given symbol is
67738fd1498Szrj 	 small, this should be faster than building a hash.  */
67838fd1498Szrj       else if (e == prevailing->next_sharing_asm_name)
67938fd1498Szrj 	last_prevailing = e;
68038fd1498Szrj       else
68138fd1498Szrj 	{
68238fd1498Szrj 	  if (e->next_sharing_asm_name)
68338fd1498Szrj 	    e->next_sharing_asm_name->previous_sharing_asm_name
68438fd1498Szrj 	      = e->previous_sharing_asm_name;
68538fd1498Szrj 	  e->previous_sharing_asm_name->next_sharing_asm_name
68638fd1498Szrj 	    = e->next_sharing_asm_name;
68738fd1498Szrj 	  e->previous_sharing_asm_name = prevailing;
68838fd1498Szrj 	  e->next_sharing_asm_name = prevailing->next_sharing_asm_name;
68938fd1498Szrj 	  prevailing->next_sharing_asm_name->previous_sharing_asm_name = e;
69038fd1498Szrj 	  prevailing->next_sharing_asm_name = e;
69138fd1498Szrj 	  if (last_prevailing == prevailing)
69238fd1498Szrj 	    last_prevailing = e;
69338fd1498Szrj 	}
69438fd1498Szrj     }
69538fd1498Szrj   if (mismatches.is_empty ())
69638fd1498Szrj     return;
69738fd1498Szrj 
69838fd1498Szrj   /* Diagnose all mismatched re-declarations.  */
69938fd1498Szrj   FOR_EACH_VEC_ELT (mismatches, i, decl)
70038fd1498Szrj     {
70138fd1498Szrj       /* Do not diagnose two built-in declarations, there is no useful
70238fd1498Szrj          location in that case.  It also happens for AVR if two built-ins
70338fd1498Szrj          use the same asm name because their libgcc assembler code is the
70438fd1498Szrj          same, see PR78562.  */
70538fd1498Szrj       if (DECL_IS_BUILTIN (prevailing->decl)
70638fd1498Szrj 	  && DECL_IS_BUILTIN (decl))
70738fd1498Szrj 	continue;
70838fd1498Szrj 
70938fd1498Szrj       int level = warn_type_compatibility_p (TREE_TYPE (prevailing->decl),
71038fd1498Szrj 					     TREE_TYPE (decl),
71138fd1498Szrj 					     DECL_COMDAT (decl));
71238fd1498Szrj       if (level)
71338fd1498Szrj 	{
71438fd1498Szrj 	  bool diag = false;
71538fd1498Szrj 	  if (level & 2)
71638fd1498Szrj 	    diag = warning_at (DECL_SOURCE_LOCATION (decl),
71738fd1498Szrj 			       OPT_Wodr,
71838fd1498Szrj 			       "%qD violates the C++ One Definition Rule ",
71938fd1498Szrj 			       decl);
72038fd1498Szrj 	  if (!diag && (level & 1))
72138fd1498Szrj 	    diag = warning_at (DECL_SOURCE_LOCATION (decl),
72238fd1498Szrj 			       OPT_Wlto_type_mismatch,
72338fd1498Szrj 			       "type of %qD does not match original "
72438fd1498Szrj 			       "declaration", decl);
72538fd1498Szrj 	  if (diag)
72638fd1498Szrj 	    {
72738fd1498Szrj 	      warn_types_mismatch (TREE_TYPE (prevailing->decl),
72838fd1498Szrj 				   TREE_TYPE (decl),
72938fd1498Szrj 				   DECL_SOURCE_LOCATION (prevailing->decl),
73038fd1498Szrj 				   DECL_SOURCE_LOCATION (decl));
73138fd1498Szrj 	      if ((level & 4)
73238fd1498Szrj 		  && !TREE_READONLY (prevailing->decl))
73338fd1498Szrj 		tbaa_p = true;
73438fd1498Szrj 	    }
73538fd1498Szrj 	  diagnosed_p |= diag;
73638fd1498Szrj 	}
73738fd1498Szrj       else if ((DECL_USER_ALIGN (prevailing->decl)
73838fd1498Szrj 	        && DECL_USER_ALIGN (decl))
73938fd1498Szrj 	       && DECL_ALIGN (prevailing->decl) < DECL_ALIGN (decl))
74038fd1498Szrj 	{
74138fd1498Szrj 	  diagnosed_p |= warning_at (DECL_SOURCE_LOCATION (decl),
74238fd1498Szrj 				     OPT_Wlto_type_mismatch,
74338fd1498Szrj 				     "alignment of %qD is bigger than "
74438fd1498Szrj 				     "original declaration", decl);
74538fd1498Szrj 	}
74638fd1498Szrj       else
74738fd1498Szrj 	diagnosed_p |= warning_at (DECL_SOURCE_LOCATION (decl),
74838fd1498Szrj 				   OPT_Wlto_type_mismatch,
74938fd1498Szrj 				   "size of %qD differ from the size of "
75038fd1498Szrj 				   "original declaration", decl);
75138fd1498Szrj     }
75238fd1498Szrj   if (diagnosed_p)
75338fd1498Szrj     inform (DECL_SOURCE_LOCATION (prevailing->decl),
75438fd1498Szrj 	    "%qD was previously declared here", prevailing->decl);
75538fd1498Szrj   if (tbaa_p)
75638fd1498Szrj     inform (DECL_SOURCE_LOCATION (prevailing->decl),
75738fd1498Szrj 	    "code may be misoptimized unless "
75838fd1498Szrj 	    "-fno-strict-aliasing is used");
75938fd1498Szrj 
76038fd1498Szrj   mismatches.release ();
76138fd1498Szrj }
76238fd1498Szrj 
76338fd1498Szrj /* Helper to process the decl chain for the symbol table entry *SLOT.  */
76438fd1498Szrj 
76538fd1498Szrj static void
lto_symtab_merge_decls_1(symtab_node * first)76638fd1498Szrj lto_symtab_merge_decls_1 (symtab_node *first)
76738fd1498Szrj {
76838fd1498Szrj   symtab_node *e;
76938fd1498Szrj   symtab_node *prevailing;
77038fd1498Szrj   bool diagnosed_p = false;
77138fd1498Szrj 
77238fd1498Szrj   if (symtab->dump_file)
77338fd1498Szrj     {
77438fd1498Szrj       fprintf (symtab->dump_file, "Merging nodes for %s. Candidates:\n",
77538fd1498Szrj 	       first->asm_name ());
77638fd1498Szrj       for (e = first; e; e = e->next_sharing_asm_name)
77738fd1498Szrj 	if (TREE_PUBLIC (e->decl))
77838fd1498Szrj 	  e->dump (symtab->dump_file);
77938fd1498Szrj     }
78038fd1498Szrj 
78138fd1498Szrj   /* Compute the symbol resolutions.  This is a no-op when using the
78238fd1498Szrj      linker plugin and resolution was decided by the linker.  */
78338fd1498Szrj   prevailing = lto_symtab_resolve_symbols (first);
78438fd1498Szrj 
78538fd1498Szrj   /* If there's not a prevailing symbol yet it's an external reference.
78638fd1498Szrj      Happens a lot during ltrans.  Choose the first symbol with a
78738fd1498Szrj      cgraph or a varpool node.  */
78838fd1498Szrj   if (!prevailing)
78938fd1498Szrj     {
79038fd1498Szrj       for (prevailing = first;
79138fd1498Szrj 	   prevailing; prevailing = prevailing->next_sharing_asm_name)
79238fd1498Szrj 	if (lto_symtab_symbol_p (prevailing))
79338fd1498Szrj 	  break;
79438fd1498Szrj       if (!prevailing)
79538fd1498Szrj 	return;
79638fd1498Szrj       /* For variables chose with a priority variant with vnode
79738fd1498Szrj 	 attached (i.e. from unit where external declaration of
79838fd1498Szrj 	 variable is actually used).
79938fd1498Szrj 	 When there are multiple variants, chose one with size.
80038fd1498Szrj 	 This is needed for C++ typeinfos, for example in
80138fd1498Szrj 	 lto/20081204-1 there are typeifos in both units, just
80238fd1498Szrj 	 one of them do have size.  */
80338fd1498Szrj       if (TREE_CODE (prevailing->decl) == VAR_DECL)
80438fd1498Szrj 	{
80538fd1498Szrj 	  for (e = prevailing->next_sharing_asm_name;
80638fd1498Szrj 	       e; e = e->next_sharing_asm_name)
80738fd1498Szrj 	    if (!COMPLETE_TYPE_P (TREE_TYPE (prevailing->decl))
80838fd1498Szrj 		&& COMPLETE_TYPE_P (TREE_TYPE (e->decl))
80938fd1498Szrj 		&& lto_symtab_symbol_p (e))
81038fd1498Szrj 	      prevailing = e;
81138fd1498Szrj 	}
81238fd1498Szrj       /* For functions prefer the non-builtin if one is available.  */
81338fd1498Szrj       else if (TREE_CODE (prevailing->decl) == FUNCTION_DECL)
81438fd1498Szrj 	{
81538fd1498Szrj 	  for (e = first; e; e = e->next_sharing_asm_name)
81638fd1498Szrj 	    if (TREE_CODE (e->decl) == FUNCTION_DECL
81738fd1498Szrj 		&& !DECL_BUILT_IN (e->decl)
81838fd1498Szrj 		&& lto_symtab_symbol_p (e))
81938fd1498Szrj 	      {
82038fd1498Szrj 		prevailing = e;
82138fd1498Szrj 		break;
82238fd1498Szrj 	      }
82338fd1498Szrj 	}
82438fd1498Szrj     }
82538fd1498Szrj 
82638fd1498Szrj   symtab->symtab_prevail_in_asm_name_hash (prevailing);
82738fd1498Szrj 
82838fd1498Szrj   /* Diagnose mismatched objects.  */
82938fd1498Szrj   for (e = prevailing->next_sharing_asm_name;
83038fd1498Szrj        e; e = e->next_sharing_asm_name)
83138fd1498Szrj     {
83238fd1498Szrj       if (TREE_CODE (prevailing->decl)
83338fd1498Szrj 	  == TREE_CODE (e->decl))
83438fd1498Szrj 	continue;
83538fd1498Szrj       if (!lto_symtab_symbol_p (e))
83638fd1498Szrj 	continue;
83738fd1498Szrj 
83838fd1498Szrj       switch (TREE_CODE (prevailing->decl))
83938fd1498Szrj 	{
84038fd1498Szrj 	case VAR_DECL:
84138fd1498Szrj 	  gcc_assert (TREE_CODE (e->decl) == FUNCTION_DECL);
84238fd1498Szrj 	  error_at (DECL_SOURCE_LOCATION (e->decl),
84338fd1498Szrj 		    "variable %qD redeclared as function",
84438fd1498Szrj 		    prevailing->decl);
84538fd1498Szrj 	  break;
84638fd1498Szrj 
84738fd1498Szrj 	case FUNCTION_DECL:
84838fd1498Szrj 	  gcc_assert (TREE_CODE (e->decl) == VAR_DECL);
84938fd1498Szrj 	  error_at (DECL_SOURCE_LOCATION (e->decl),
85038fd1498Szrj 		    "function %qD redeclared as variable",
85138fd1498Szrj 		    prevailing->decl);
85238fd1498Szrj 	  break;
85338fd1498Szrj 
85438fd1498Szrj 	default:
85538fd1498Szrj 	  gcc_unreachable ();
85638fd1498Szrj 	}
85738fd1498Szrj 
85838fd1498Szrj       diagnosed_p = true;
85938fd1498Szrj     }
86038fd1498Szrj   if (diagnosed_p)
86138fd1498Szrj       inform (DECL_SOURCE_LOCATION (prevailing->decl),
86238fd1498Szrj 	      "previously declared here");
86338fd1498Szrj 
86438fd1498Szrj   /* Merge the chain to the single prevailing decl and diagnose
86538fd1498Szrj      mismatches.  */
86638fd1498Szrj   lto_symtab_merge_decls_2 (prevailing, diagnosed_p);
86738fd1498Szrj 
86838fd1498Szrj   if (symtab->dump_file)
86938fd1498Szrj     {
87038fd1498Szrj       fprintf (symtab->dump_file, "After resolution:\n");
87138fd1498Szrj       for (e = prevailing; e; e = e->next_sharing_asm_name)
87238fd1498Szrj 	e->dump (symtab->dump_file);
87338fd1498Szrj     }
87438fd1498Szrj }
87538fd1498Szrj 
87638fd1498Szrj /* Resolve and merge all symbol table chains to a prevailing decl.  */
87738fd1498Szrj 
87838fd1498Szrj void
lto_symtab_merge_decls(void)87938fd1498Szrj lto_symtab_merge_decls (void)
88038fd1498Szrj {
88138fd1498Szrj   symtab_node *node;
88238fd1498Szrj 
88338fd1498Szrj   /* Populate assembler name hash.   */
88438fd1498Szrj   symtab->symtab_initialize_asm_name_hash ();
88538fd1498Szrj 
88638fd1498Szrj   FOR_EACH_SYMBOL (node)
88738fd1498Szrj     if (!node->previous_sharing_asm_name
88838fd1498Szrj 	&& node->next_sharing_asm_name)
88938fd1498Szrj       lto_symtab_merge_decls_1 (node);
89038fd1498Szrj }
89138fd1498Szrj 
89238fd1498Szrj /* Helper to process the decl chain for the symbol table entry *SLOT.  */
89338fd1498Szrj 
89438fd1498Szrj static void
lto_symtab_merge_symbols_1(symtab_node * prevailing)89538fd1498Szrj lto_symtab_merge_symbols_1 (symtab_node *prevailing)
89638fd1498Szrj {
89738fd1498Szrj   symtab_node *e;
89838fd1498Szrj   symtab_node *next;
89938fd1498Szrj 
90038fd1498Szrj   prevailing->decl->decl_with_vis.symtab_node = prevailing;
90138fd1498Szrj 
90238fd1498Szrj   /* Replace the cgraph node of each entry with the prevailing one.  */
90338fd1498Szrj   for (e = prevailing->next_sharing_asm_name; e;
90438fd1498Szrj        e = next)
90538fd1498Szrj     {
90638fd1498Szrj       next = e->next_sharing_asm_name;
90738fd1498Szrj 
90838fd1498Szrj       if (!lto_symtab_symbol_p (e))
90938fd1498Szrj 	continue;
91038fd1498Szrj       cgraph_node *ce = dyn_cast <cgraph_node *> (e);
91138fd1498Szrj       symtab_node *to = symtab_node::get (lto_symtab_prevailing_decl (e->decl));
91238fd1498Szrj 
91338fd1498Szrj       /* No matter how we are going to deal with resolution, we will ultimately
91438fd1498Szrj 	 use prevailing definition.  */
91538fd1498Szrj       if (ce)
91638fd1498Szrj           ipa_merge_profiles (dyn_cast<cgraph_node *> (prevailing),
91738fd1498Szrj 			      dyn_cast<cgraph_node *> (e));
91838fd1498Szrj 
91938fd1498Szrj       /* If we decided to replace the node by TO, do it.  */
92038fd1498Szrj       if (e != to)
92138fd1498Szrj 	{
92238fd1498Szrj 	  if (ce)
92338fd1498Szrj 	    lto_cgraph_replace_node (ce, dyn_cast<cgraph_node *> (to));
92438fd1498Szrj 	  else if (varpool_node *ve = dyn_cast <varpool_node *> (e))
92538fd1498Szrj 	    lto_varpool_replace_node (ve, dyn_cast<varpool_node *> (to));
92638fd1498Szrj 	}
92738fd1498Szrj       /* Watch out for duplicated symbols for a given declaration.  */
92838fd1498Szrj       else if (!e->transparent_alias
92938fd1498Szrj 	       || !e->definition || e->get_alias_target () != to)
93038fd1498Szrj 	{
93138fd1498Szrj 	  /* We got a new declaration we do not want to merge.  In this case
93238fd1498Szrj 	     get rid of the existing definition and create a transparent
93338fd1498Szrj 	     alias.  */
93438fd1498Szrj 	  if (ce)
93538fd1498Szrj 	    {
93638fd1498Szrj 	      lto_free_function_in_decl_state_for_node (ce);
93738fd1498Szrj 	      if (!ce->weakref)
93838fd1498Szrj 	        ce->release_body ();
93938fd1498Szrj 	      ce->reset ();
94038fd1498Szrj 	      symtab->call_cgraph_removal_hooks (ce);
94138fd1498Szrj 	    }
94238fd1498Szrj 	  else
94338fd1498Szrj 	    {
94438fd1498Szrj 	      DECL_INITIAL (e->decl) = error_mark_node;
94538fd1498Szrj 	      if (e->lto_file_data)
94638fd1498Szrj 		{
94738fd1498Szrj 		  lto_free_function_in_decl_state_for_node (e);
94838fd1498Szrj 		  e->lto_file_data = NULL;
94938fd1498Szrj 		}
95038fd1498Szrj 	      symtab->call_varpool_removal_hooks (dyn_cast<varpool_node *> (e));
95138fd1498Szrj 	    }
95238fd1498Szrj 	  e->remove_all_references ();
95338fd1498Szrj 	  e->analyzed = e->body_removed = false;
95438fd1498Szrj 	  e->resolve_alias (prevailing, true);
95538fd1498Szrj 	  gcc_assert (e != prevailing);
95638fd1498Szrj 	}
95738fd1498Szrj     }
95838fd1498Szrj 
95938fd1498Szrj   return;
96038fd1498Szrj }
96138fd1498Szrj 
96238fd1498Szrj /* Merge cgraph nodes according to the symbol merging done by
96338fd1498Szrj    lto_symtab_merge_decls.  */
96438fd1498Szrj 
96538fd1498Szrj void
lto_symtab_merge_symbols(void)96638fd1498Szrj lto_symtab_merge_symbols (void)
96738fd1498Szrj {
96838fd1498Szrj   symtab_node *node;
96938fd1498Szrj 
97038fd1498Szrj   if (!flag_ltrans)
97138fd1498Szrj     {
97238fd1498Szrj       symtab->symtab_initialize_asm_name_hash ();
97338fd1498Szrj 
97438fd1498Szrj       /* Do the actual merging.
97538fd1498Szrj          At this point we invalidate hash translating decls into symtab nodes
97638fd1498Szrj 	 because after removing one of duplicate decls the hash is not correcly
97738fd1498Szrj 	 updated to the ohter dupliate.  */
97838fd1498Szrj       FOR_EACH_SYMBOL (node)
97938fd1498Szrj 	if (lto_symtab_symbol_p (node)
98038fd1498Szrj 	    && node->next_sharing_asm_name
98138fd1498Szrj 	    && !node->previous_sharing_asm_name)
98238fd1498Szrj 	  lto_symtab_merge_symbols_1 (node);
98338fd1498Szrj 
98438fd1498Szrj       /* Resolve weakref aliases whose target are now in the compilation unit.
98538fd1498Szrj 	 also re-populate the hash translating decls into symtab nodes*/
98638fd1498Szrj       FOR_EACH_SYMBOL (node)
98738fd1498Szrj 	{
98838fd1498Szrj 	  cgraph_node *cnode, *cnode2;
98938fd1498Szrj 	  varpool_node *vnode;
99038fd1498Szrj 	  symtab_node *node2;
99138fd1498Szrj 
99238fd1498Szrj 	  if (!node->analyzed && node->alias_target)
99338fd1498Szrj 	    {
99438fd1498Szrj 	      symtab_node *tgt = symtab_node::get_for_asmname (node->alias_target);
99538fd1498Szrj 	      gcc_assert (node->weakref);
99638fd1498Szrj 	      if (tgt)
99738fd1498Szrj 		node->resolve_alias (tgt, true);
99838fd1498Szrj 	    }
99938fd1498Szrj 	  /* If the symbol was preempted outside IR, see if we want to get rid
100038fd1498Szrj 	     of the definition.  */
100138fd1498Szrj 	  if (node->analyzed
100238fd1498Szrj 	      && !DECL_EXTERNAL (node->decl)
100338fd1498Szrj 	      && (node->resolution == LDPR_PREEMPTED_REG
100438fd1498Szrj 		  || node->resolution == LDPR_RESOLVED_IR
100538fd1498Szrj 		  || node->resolution == LDPR_RESOLVED_EXEC
100638fd1498Szrj 		  || node->resolution == LDPR_RESOLVED_DYN))
100738fd1498Szrj 	    {
100838fd1498Szrj 	      DECL_EXTERNAL (node->decl) = 1;
100938fd1498Szrj 	      /* If alias to local symbol was preempted by external definition,
101038fd1498Szrj 		 we know it is not pointing to the local symbol.  Remove it.  */
101138fd1498Szrj 	      if (node->alias
101238fd1498Szrj 		  && !node->weakref
101338fd1498Szrj 		  && !node->transparent_alias
101438fd1498Szrj 		  && node->get_alias_target ()->binds_to_current_def_p ())
101538fd1498Szrj 		{
101638fd1498Szrj 		  node->alias = false;
101738fd1498Szrj 		  node->remove_all_references ();
101838fd1498Szrj 		  node->definition = false;
101938fd1498Szrj 		  node->analyzed = false;
102038fd1498Szrj 		  node->cpp_implicit_alias = false;
102138fd1498Szrj 		}
102238fd1498Szrj 	      else if (!node->alias
102338fd1498Szrj 		       && node->definition
102438fd1498Szrj 		       && node->get_availability () <= AVAIL_INTERPOSABLE)
102538fd1498Szrj 		{
102638fd1498Szrj 		  if ((cnode = dyn_cast <cgraph_node *> (node)) != NULL)
102738fd1498Szrj 		    cnode->reset ();
102838fd1498Szrj 		  else
102938fd1498Szrj 		    {
103038fd1498Szrj 		      node->analyzed = node->definition = false;
103138fd1498Szrj 		      node->remove_all_references ();
103238fd1498Szrj 		    }
103338fd1498Szrj 		}
103438fd1498Szrj 	    }
103538fd1498Szrj 
103638fd1498Szrj 	  if (!(cnode = dyn_cast <cgraph_node *> (node))
103738fd1498Szrj 	      || !cnode->clone_of
103838fd1498Szrj 	      || cnode->clone_of->decl != cnode->decl)
103938fd1498Szrj 	    {
104038fd1498Szrj 	      /* Builtins are not merged via decl merging.  It is however
104138fd1498Szrj 		 possible that tree merging unified the declaration.  We
104238fd1498Szrj 		 do not want duplicate entries in symbol table.  */
104338fd1498Szrj 	      if (cnode && DECL_BUILT_IN (node->decl)
104438fd1498Szrj 		  && (cnode2 = cgraph_node::get (node->decl))
104538fd1498Szrj 		  && cnode2 != cnode)
104638fd1498Szrj 		lto_cgraph_replace_node (cnode2, cnode);
104738fd1498Szrj 
104838fd1498Szrj 	      /* The user defined assembler variables are also not unified by their
104938fd1498Szrj 		 symbol name (since it is irrelevant), but we need to unify symbol
105038fd1498Szrj 		 nodes if tree merging occurred.  */
105138fd1498Szrj 	      if ((vnode = dyn_cast <varpool_node *> (node))
105238fd1498Szrj 		  && DECL_HARD_REGISTER (vnode->decl)
105338fd1498Szrj 		  && (node2 = symtab_node::get (vnode->decl))
105438fd1498Szrj 		  && node2 != node)
105538fd1498Szrj 		lto_varpool_replace_node (dyn_cast <varpool_node *> (node2),
105638fd1498Szrj 					  vnode);
105738fd1498Szrj 
105838fd1498Szrj 
105938fd1498Szrj 	      /* Abstract functions may have duplicated cgraph nodes attached;
106038fd1498Szrj 		 remove them.  */
106138fd1498Szrj 	      else if (cnode && DECL_ABSTRACT_P (cnode->decl)
106238fd1498Szrj 		       && (cnode2 = cgraph_node::get (node->decl))
106338fd1498Szrj 		       && cnode2 != cnode)
106438fd1498Szrj 		cnode2->remove ();
106538fd1498Szrj 
106638fd1498Szrj 	      node->decl->decl_with_vis.symtab_node = node;
106738fd1498Szrj 	    }
106838fd1498Szrj 	}
106938fd1498Szrj     }
107038fd1498Szrj }
107138fd1498Szrj 
107238fd1498Szrj /* Virtual tables may matter for code generation even if they are not
107338fd1498Szrj    directly refernced by the code because they may be used for devirtualizaiton.
107438fd1498Szrj    For this reason it is important to merge even virtual tables that have no
107538fd1498Szrj    associated symbol table entries.  Without doing so we lose optimization
107638fd1498Szrj    oppurtunities by losing track of the vtable constructor.
107738fd1498Szrj    FIXME: we probably ought to introduce explicit symbol table entries for
107838fd1498Szrj    those before streaming.  */
107938fd1498Szrj 
108038fd1498Szrj tree
lto_symtab_prevailing_virtual_decl(tree decl)108138fd1498Szrj lto_symtab_prevailing_virtual_decl (tree decl)
108238fd1498Szrj {
108338fd1498Szrj   if (DECL_ABSTRACT_P (decl))
108438fd1498Szrj     return decl;
108538fd1498Szrj   gcc_checking_assert (!type_in_anonymous_namespace_p (DECL_CONTEXT (decl))
108638fd1498Szrj 		       && DECL_ASSEMBLER_NAME_SET_P (decl));
108738fd1498Szrj 
108838fd1498Szrj   symtab_node *n = symtab_node::get_for_asmname
108938fd1498Szrj 		     (DECL_ASSEMBLER_NAME (decl));
109038fd1498Szrj   while (n && ((!DECL_EXTERNAL (n->decl) && !TREE_PUBLIC (n->decl))
109138fd1498Szrj 	       || !DECL_VIRTUAL_P (n->decl)))
109238fd1498Szrj     n = n->next_sharing_asm_name;
109338fd1498Szrj   if (n)
109438fd1498Szrj     {
109538fd1498Szrj       /* Merge decl state in both directions, we may still end up using
109638fd1498Szrj 	 the other decl.  */
109738fd1498Szrj       TREE_ADDRESSABLE (n->decl) |= TREE_ADDRESSABLE (decl);
109838fd1498Szrj       TREE_ADDRESSABLE (decl) |= TREE_ADDRESSABLE (n->decl);
109938fd1498Szrj 
110038fd1498Szrj       if (TREE_CODE (decl) == FUNCTION_DECL)
110138fd1498Szrj 	{
110238fd1498Szrj 	  /* Merge decl state in both directions, we may still end up using
110338fd1498Szrj 	     the other decl.  */
110438fd1498Szrj 	  DECL_POSSIBLY_INLINED (n->decl) |= DECL_POSSIBLY_INLINED (decl);
110538fd1498Szrj 	  DECL_POSSIBLY_INLINED (decl) |= DECL_POSSIBLY_INLINED (n->decl);
110638fd1498Szrj 	}
110738fd1498Szrj       lto_symtab_prevail_decl (n->decl, decl);
110838fd1498Szrj       decl = n->decl;
110938fd1498Szrj     }
111038fd1498Szrj   else
111138fd1498Szrj     symtab_node::get_create (decl);
111238fd1498Szrj 
111338fd1498Szrj   return decl;
111438fd1498Szrj }
1115