Mercurial > hg > CbC > CbC_gcc
diff gcc/symtab.c @ 131:84e7813d76e9
gcc-8.2
author | mir3636 |
---|---|
date | Thu, 25 Oct 2018 07:37:49 +0900 |
parents | 04ced10e8804 |
children | 1830386684a0 |
line wrap: on
line diff
--- a/gcc/symtab.c Fri Oct 27 22:46:09 2017 +0900 +++ b/gcc/symtab.c Thu Oct 25 07:37:49 2018 +0900 @@ -1,5 +1,5 @@ /* Symbol table. - Copyright (C) 2012-2017 Free Software Foundation, Inc. + Copyright (C) 2012-2018 Free Software Foundation, Inc. Contributed by Jan Hubicka This file is part of GCC. @@ -37,8 +37,9 @@ #include "calls.h" #include "stringpool.h" #include "attribs.h" +#include "builtins.h" -static const char *ipa_ref_use_name[] = {"read","write","addr","alias","chkp"}; +static const char *ipa_ref_use_name[] = {"read","write","addr","alias"}; const char * const ld_plugin_symbol_resolution_names[]= { @@ -946,6 +947,12 @@ node->dump (f); } +DEBUG_FUNCTION void +symbol_table::debug (void) +{ + dump (stderr); +} + /* Return the cgraph node that has ASMNAME for its DECL_ASSEMBLER_NAME. Return NULL if there's no such node. */ @@ -991,6 +998,13 @@ error ("function symbol is not function"); error_found = true; } + else if ((lookup_attribute ("ifunc", DECL_ATTRIBUTES (decl)) + != NULL) + != dyn_cast <cgraph_node *> (this)->ifunc_resolver) + { + error ("inconsistent `ifunc' attribute"); + error_found = true; + } } else if (is_a <varpool_node *> (this)) { @@ -1945,11 +1959,11 @@ return true; } - /* If target is defined and not extern, we know it will be output and thus - it will bind to non-NULL. - Play safe for flag_delete_null_pointer_checks where weak definition maye + /* If target is defined and either comdat or not extern, we know it will be + output and thus it will bind to non-NULL. + Play safe for flag_delete_null_pointer_checks where weak definition may be re-defined by NULL. */ - if (definition && !DECL_EXTERNAL (decl) + if (definition && (!DECL_EXTERNAL (decl) || DECL_COMDAT (decl)) && (flag_delete_null_pointer_checks || !DECL_WEAK (decl))) { if (!DECL_WEAK (decl)) @@ -2191,7 +2205,7 @@ void symtab_node::increase_alignment (unsigned int align) { - gcc_assert (can_increase_alignment_p () && align < MAX_OFILE_ALIGNMENT); + gcc_assert (can_increase_alignment_p () && align <= MAX_OFILE_ALIGNMENT); ultimate_alias_target()->call_for_symbol_and_aliases (increase_alignment_1, (void *)(size_t) align, true); @@ -2246,13 +2260,13 @@ if (transparent_alias) return definition && get_alias_target()->binds_to_current_def_p (ref); - if (lookup_attribute ("ifunc", DECL_ATTRIBUTES (decl))) + cgraph_node *cnode = dyn_cast <cgraph_node *> (this); + if (cnode && cnode->ifunc_resolver) return false; if (decl_binds_to_current_def_p (decl)) return true; /* Inline clones always binds locally. */ - cgraph_node *cnode = dyn_cast <cgraph_node *> (this); if (cnode && cnode->global.inlined_to) return true; @@ -2292,3 +2306,58 @@ return false; } + +/* Return true if symbol should be output to the symbol table. */ + +bool +symtab_node::output_to_lto_symbol_table_p (void) +{ + /* Only externally visible symbols matter. */ + if (!TREE_PUBLIC (decl)) + return false; + if (!real_symbol_p ()) + return false; + /* FIXME: variables probably should not be considered as real symbols at + first place. */ + if (VAR_P (decl) && DECL_HARD_REGISTER (decl)) + return false; + /* FIXME: Builtins corresponding to real functions probably should have + symbol table entries. */ + if (TREE_CODE (decl) == FUNCTION_DECL && fndecl_built_in_p (decl)) + return false; + + /* We have real symbol that should be in symbol table. However try to trim + down the refernces to libraries bit more because linker will otherwise + bring unnecesary object files into the final link. + FIXME: The following checks can easily be confused i.e. by self recursive + function or self-referring variable. */ + + /* We keep external functions in symtab for sake of inlining + and devirtualization. We do not want to see them in symbol table as + references unless they are really used. */ + cgraph_node *cnode = dyn_cast <cgraph_node *> (this); + if (cnode && (!definition || DECL_EXTERNAL (decl)) + && cnode->callers) + return true; + + /* Ignore all references from external vars initializers - they are not really + part of the compilation unit until they are used by folding. Some symbols, + like references to external construction vtables can not be referred to at + all. We decide this at can_refer_decl_in_current_unit_p. */ + if (!definition || DECL_EXTERNAL (decl)) + { + int i; + struct ipa_ref *ref; + for (i = 0; iterate_referring (i, ref); i++) + { + if (ref->use == IPA_REF_ALIAS) + continue; + if (is_a <cgraph_node *> (ref->referring)) + return true; + if (!DECL_EXTERNAL (ref->referring->decl)) + return true; + } + return false; + } + return true; +}