re PR c++/47202 (Endless recursion during mangling)

PR c++/47202
gcc/cp/
	* decl.c (cxx_comdat_group): Return a decl.
	* optimize.c (cdtor_comdat_group): Get its DECL_ASSEMBLER_NAME.
gcc/
	* cgraph.h (symtab_node::get_comdat_group_id): New.
	* cgraphunit.c (analyze_functions): Call it.
	* symtab.c (dump_symtab_node): Likewise.
	* tree.c (decl_comdat_group_id): New.
	* tree.h: Declare it.
	* lto-streamer-out.c (write_symbol): Use it.
	* trans-mem.c (ipa_tm_create_version_alias): Likewise.

From-SVN: r211026
This commit is contained in:
Jason Merrill 2014-05-28 12:38:23 -04:00 committed by Jason Merrill
parent a41acf5f3e
commit d67ff7b75d
12 changed files with 53 additions and 12 deletions

View File

@ -1,3 +1,14 @@
2014-05-28 Jason Merrill <jason@redhat.com>
PR c++/47202
* cgraph.h (symtab_node::get_comdat_group_id): New.
* cgraphunit.c (analyze_functions): Call it.
* symtab.c (dump_symtab_node): Likewise.
* tree.c (decl_comdat_group_id): New.
* tree.h: Declare it.
* lto-streamer-out.c (write_symbol): Use it.
* trans-mem.c (ipa_tm_create_version_alias): Likewise.
2014-05-28 Francois-Xavier Coudert <fxcoudert@gcc.gnu.org>
PR bootstrap/PR61146

View File

@ -147,6 +147,13 @@ public:
return comdat_group_;
}
tree get_comdat_group_id ()
{
if (comdat_group_ && TREE_CODE (comdat_group_) != IDENTIFIER_NODE)
comdat_group_ = DECL_ASSEMBLER_NAME (comdat_group_);
return comdat_group_;
}
/* Set comdat group. */
void set_comdat_group (tree group)
{

View File

@ -974,6 +974,8 @@ analyze_functions (void)
node != first_analyzed
&& node != first_analyzed_var; node = node->next)
{
/* Convert COMDAT group designators to IDENTIFIER_NODEs. */
node->get_comdat_group_id ();
if (decide_is_symbol_needed (node))
{
enqueue_node (node);

View File

@ -1,5 +1,9 @@
2014-05-28 Jason Merrill <jason@redhat.com>
PR c++/47202
* decl.c (cxx_comdat_group): Return a decl.
* optimize.c (cdtor_comdat_group): Get its DECL_ASSEMBLER_NAME.
* pt.c (tsubst) [ARRAY_TYPE]: Check for array of array of unknown
bound.

View File

@ -14484,18 +14484,17 @@ cp_missing_noreturn_ok_p (tree decl)
return DECL_MAIN_P (decl);
}
/* Return the COMDAT group into which DECL should be placed. */
/* Return the decl used to identify the COMDAT group into which DECL should
be placed. */
tree
cxx_comdat_group (tree decl)
{
tree name;
/* Virtual tables, construction virtual tables, and virtual table
tables all go in a single COMDAT group, named after the primary
virtual table. */
if (VAR_P (decl) && DECL_VTABLE_OR_VTT_P (decl))
name = DECL_ASSEMBLER_NAME (CLASSTYPE_VTABLES (DECL_CONTEXT (decl)));
decl = CLASSTYPE_VTABLES (DECL_CONTEXT (decl));
/* For all other DECLs, the COMDAT group is the mangled name of the
declaration itself. */
else
@ -14513,10 +14512,9 @@ cxx_comdat_group (tree decl)
else
break;
}
name = DECL_ASSEMBLER_NAME (decl);
}
return name;
return decl;
}
/* Returns the return type for FN as written by the user, which may include

View File

@ -3520,7 +3520,11 @@ mangle_decl (const tree decl)
if (vague_linkage_p (decl))
DECL_WEAK (alias) = 1;
if (TREE_CODE (decl) == FUNCTION_DECL)
cgraph_same_body_alias (cgraph_get_create_node (decl), alias, decl);
{
/* Don't create an alias to an unreferenced function. */
if (struct cgraph_node *n = cgraph_get_node (decl))
cgraph_same_body_alias (n, alias, decl);
}
else
varpool_extra_name_alias (alias, decl);
#endif

View File

@ -170,6 +170,8 @@ cdtor_comdat_group (tree complete, tree base)
complete_name = cxx_comdat_group (complete);
if (base_name == NULL)
base_name = cxx_comdat_group (base);
complete_name = DECL_ASSEMBLER_NAME (complete_name);
base_name = DECL_ASSEMBLER_NAME (base_name);
gcc_assert (IDENTIFIER_LENGTH (complete_name)
== IDENTIFIER_LENGTH (base_name));
grp_name = XALLOCAVEC (char, IDENTIFIER_LENGTH (complete_name) + 1);

View File

@ -2329,7 +2329,7 @@ write_symbol (struct streamer_tree_cache_d *cache,
size = 0;
if (DECL_ONE_ONLY (t))
comdat = IDENTIFIER_POINTER (DECL_COMDAT_GROUP (t));
comdat = IDENTIFIER_POINTER (decl_comdat_group_id (t));
else
comdat = "";

View File

@ -560,7 +560,7 @@ dump_symtab_base (FILE *f, symtab_node *node)
fprintf (f, " comdat");
if (node->get_comdat_group ())
fprintf (f, " comdat_group:%s",
IDENTIFIER_POINTER (node->get_comdat_group ()));
IDENTIFIER_POINTER (node->get_comdat_group_id ()));
if (DECL_ONE_ONLY (node->decl))
fprintf (f, " one_only");
if (DECL_SECTION_NAME (node->decl))
@ -1062,7 +1062,7 @@ symtab_resolve_alias (symtab_node *node, symtab_node *target)
node->analyzed = true;
ipa_record_reference (node, target, IPA_REF_ALIAS, NULL);
/* Alias targets become reudndant after alias is resolved into an reference.
/* Alias targets become redundant after alias is resolved into an reference.
We do not want to keep it around or we would have to mind updating them
when renaming symbols. */
node->alias_target = NULL;

View File

@ -4852,7 +4852,7 @@ ipa_tm_create_version_alias (struct cgraph_node *node, void *data)
/* Perform the same remapping to the comdat group. */
if (DECL_ONE_ONLY (new_decl))
varpool_get_node (new_decl)->set_comdat_group (tm_mangle (DECL_COMDAT_GROUP (old_decl)));
varpool_get_node (new_decl)->set_comdat_group (tm_mangle (decl_comdat_group_id (old_decl)));
new_node = cgraph_same_body_alias (NULL, new_decl, info->new_decl);
new_node->tm_clone = true;

View File

@ -603,7 +603,9 @@ decl_assembler_name (tree decl)
return DECL_WITH_VIS_CHECK (decl)->decl_with_vis.assembler_name;
}
/* Return comdat group of DECL. */
/* When the target supports COMDAT groups, this indicates which group the
DECL is associated with. This can be either an IDENTIFIER_NODE or a
decl, in which case its DECL_ASSEMBLER_NAME identifies the group. */
tree
decl_comdat_group (tree node)
{
@ -613,6 +615,16 @@ decl_comdat_group (tree node)
return snode->get_comdat_group ();
}
/* Likewise, but make sure it's been reduced to an IDENTIFIER_NODE. */
tree
decl_comdat_group_id (tree node)
{
struct symtab_node *snode = symtab_get_node (node);
if (!snode)
return NULL;
return snode->get_comdat_group_id ();
}
/* Compute the number of bytes occupied by a tree with code CODE.
This function cannot be used for nodes that have variable sizes,
including TREE_VEC, INTEGER_CST, STRING_CST, and CALL_EXPR. */

View File

@ -3432,6 +3432,7 @@ tree_operand_check_code (const_tree __t, enum tree_code __code, int __i,
extern tree decl_assembler_name (tree);
extern tree decl_comdat_group (tree);
extern tree decl_comdat_group_id (tree);
/* Compute the number of bytes occupied by 'node'. This routine only
looks at TREE_CODE and, if the code is TREE_VEC, TREE_VEC_LENGTH. */