diff options
author | jason <jason@138bc75d-0d04-0410-961f-82ee72b054a4> | 2013-12-23 17:49:47 +0000 |
---|---|---|
committer | jason <jason@138bc75d-0d04-0410-961f-82ee72b054a4> | 2013-12-23 17:49:47 +0000 |
commit | 468088aca3d51046f289052028ca22f1552a1df9 (patch) | |
tree | deb79005e2132e0ee5c203e13985a93f5dd4714e /gcc/symtab.c | |
parent | 5a1baa9d247f64349cc016895b357948d180ef7b (diff) | |
download | gcc-468088aca3d51046f289052028ca22f1552a1df9.tar.gz |
PR c++/41090
Add -fdeclone-ctor-dtor.
gcc/cp/
* optimize.c (can_alias_cdtor, populate_clone_array): Split out
from maybe_clone_body.
(maybe_thunk_body): New function.
(maybe_clone_body): Call it.
* mangle.c (write_mangled_name): Remove code to suppress
writing of mangled name for cloned constructor or destructor.
(write_special_name_constructor): Handle decloned constructor.
(write_special_name_destructor): Handle decloned destructor.
* method.c (trivial_fn_p): Handle decloning.
* semantics.c (expand_or_defer_fn_1): Clone after setting linkage.
gcc/c-family/
* c.opt: Add -fdeclone-ctor-dtor.
* c-opts.c (c_common_post_options): Default to on iff -Os.
gcc/
* cgraph.h (struct cgraph_node): Add calls_comdat_local.
(symtab_comdat_local_p, symtab_in_same_comdat_p): New.
* cif-code.def: Add USES_COMDAT_LOCAL.
* symtab.c (verify_symtab_base): Make sure we don't refer to a
comdat-local symbol from outside its comdat.
* cgraph.c (verify_cgraph_node): Likewise.
* cgraphunit.c (mark_functions_to_output): Don't mark comdat-locals.
* ipa.c (symtab_remove_unreachable_nodes): Likewise.
(function_and_variable_visibility): Handle comdat-local fns.
* ipa-cp.c (determine_versionability): Don't clone comdat-locals.
* ipa-inline-analysis.c (compute_inline_parameters): Update
calls_comdat_local.
* ipa-inline-transform.c (inline_call): Likewise.
(save_inline_function_body): Don't clear DECL_COMDAT_GROUP.
* ipa-inline.c (can_inline_edge_p): Check calls_comdat_local.
* lto-cgraph.c (input_overwrite_node): Read calls_comdat_local.
(lto_output_node): Write it.
* symtab.c (symtab_dissolve_same_comdat_group_list): Clear
DECL_COMDAT_GROUP for comdat-locals.
include/
* demangle.h (enum gnu_v3_ctor_kinds):
Added literal gnu_v3_unified_ctor.
(enum gnu_v3_ctor_kinds):
Added literal gnu_v3_unified_dtor.
libiberty/
* cp-demangle.c (cplus_demangle_fill_ctor,cplus_demangle_fill_dtor):
Handle unified ctor/dtor.
(d_ctor_dtor_name): Handle unified ctor/dtor.
git-svn-id: svn+ssh://gcc.gnu.org/svn/gcc/trunk@206182 138bc75d-0d04-0410-961f-82ee72b054a4
Diffstat (limited to 'gcc/symtab.c')
-rw-r--r-- | gcc/symtab.c | 23 |
1 files changed, 23 insertions, 0 deletions
diff --git a/gcc/symtab.c b/gcc/symtab.c index dc700e7c735..8d36cae7b27 100644 --- a/gcc/symtab.c +++ b/gcc/symtab.c @@ -538,6 +538,10 @@ symtab_dissolve_same_comdat_group_list (symtab_node *node) { next = n->same_comdat_group; n->same_comdat_group = NULL; + /* Clear DECL_COMDAT_GROUP for comdat locals, since + make_decl_local doesn't. */ + if (!TREE_PUBLIC (n->decl)) + DECL_COMDAT_GROUP (n->decl) = NULL_TREE; n = next; } while (n != node); @@ -844,6 +848,21 @@ verify_symtab_base (symtab_node *node) n = n->same_comdat_group; } while (n != node); + if (symtab_comdat_local_p (node)) + { + struct ipa_ref_list *refs = &node->ref_list; + struct ipa_ref *ref; + for (int i = 0; ipa_ref_list_referring_iterate (refs, i, ref); ++i) + { + if (!symtab_in_same_comdat_p (ref->referring, node)) + { + error ("comdat-local symbol referred to by %s outside its " + "comdat", + identifier_to_locale (ref->referring->name())); + error_found = true; + } + } + } } return error_found; } @@ -911,6 +930,10 @@ symtab_make_decl_local (tree decl) { rtx rtl, symbol; + /* Avoid clearing DECL_COMDAT_GROUP on comdat-local decls. */ + if (TREE_PUBLIC (decl) == 0) + return; + if (TREE_CODE (decl) == VAR_DECL) DECL_COMMON (decl) = 0; else gcc_assert (TREE_CODE (decl) == FUNCTION_DECL); |