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