mirror of git://gcc.gnu.org/git/gcc.git
re PR middle-end/46674 (Weak alias is mistakenly optimized away)
PR middle-end/46674 PR middle-end/46221 * varasm.c (symbol_alias_set_t): New typedef for derived pointer_set wrapper class. (symbol_alias_set_create): New wrapper function. (symbol_alias_set_destroy): Likewise. (symbol_alias_set_contains): Likewise. (symbol_alias_set_insert): Likewise. (compute_visible_aliases): Use the above and return symbol_alias_set_t, not a pointer_set. (remove_unreachable_alias_pairs): Adjust likewise to match. (finish_aliases_1): Likewise. From-SVN: r168047
This commit is contained in:
parent
f910786b98
commit
b48feb9dd8
|
|
@ -1,3 +1,18 @@
|
||||||
|
2010-12-19 Dave Korn <dave.korn.cygwin@gmail.com>
|
||||||
|
|
||||||
|
PR middle-end/46674
|
||||||
|
PR middle-end/46221
|
||||||
|
* varasm.c (symbol_alias_set_t): New typedef for derived pointer_set
|
||||||
|
wrapper class.
|
||||||
|
(symbol_alias_set_create): New wrapper function.
|
||||||
|
(symbol_alias_set_destroy): Likewise.
|
||||||
|
(symbol_alias_set_contains): Likewise.
|
||||||
|
(symbol_alias_set_insert): Likewise.
|
||||||
|
(compute_visible_aliases): Use the above and return symbol_alias_set_t,
|
||||||
|
not a pointer_set.
|
||||||
|
(remove_unreachable_alias_pairs): Adjust likewise to match.
|
||||||
|
(finish_aliases_1): Likewise.
|
||||||
|
|
||||||
2010-12-19 Chung-Lin Tang <cltang@codesourcery.com>
|
2010-12-19 Chung-Lin Tang <cltang@codesourcery.com>
|
||||||
|
|
||||||
* config/arm/arm.c (arm_legitimate_index_p): Add VFP load/store
|
* config/arm/arm.c (arm_legitimate_index_p): Add VFP load/store
|
||||||
|
|
|
||||||
76
gcc/varasm.c
76
gcc/varasm.c
|
|
@ -5504,21 +5504,67 @@ do_assemble_alias (tree decl, tree target)
|
||||||
#endif
|
#endif
|
||||||
}
|
}
|
||||||
|
|
||||||
|
/* Derived type for use by compute_visible_aliases and callers. A symbol
|
||||||
|
alias set is a pointer set into which we enter IDENTIFIER_NODES bearing
|
||||||
|
the canonicalised assembler-level symbol names corresponding to decls
|
||||||
|
and their aliases. */
|
||||||
|
|
||||||
|
typedef struct pointer_set_t symbol_alias_set_t;
|
||||||
|
|
||||||
|
/* Allocate and construct a symbol alias set. */
|
||||||
|
|
||||||
|
static symbol_alias_set_t *
|
||||||
|
symbol_alias_set_create (void)
|
||||||
|
{
|
||||||
|
return pointer_set_create ();
|
||||||
|
}
|
||||||
|
|
||||||
|
/* Destruct and free a symbol alias set. */
|
||||||
|
|
||||||
|
static void
|
||||||
|
symbol_alias_set_destroy (symbol_alias_set_t *aset)
|
||||||
|
{
|
||||||
|
pointer_set_destroy (aset);
|
||||||
|
}
|
||||||
|
|
||||||
|
/* Test if a symbol alias set contains a given name. */
|
||||||
|
|
||||||
|
static int
|
||||||
|
symbol_alias_set_contains (const symbol_alias_set_t *aset, tree t)
|
||||||
|
{
|
||||||
|
/* We accept either a DECL or an IDENTIFIER directly. */
|
||||||
|
if (TREE_CODE (t) != IDENTIFIER_NODE)
|
||||||
|
t = DECL_ASSEMBLER_NAME (t);
|
||||||
|
t = targetm.asm_out.mangle_assembler_name (IDENTIFIER_POINTER (t));
|
||||||
|
return pointer_set_contains (aset, t);
|
||||||
|
}
|
||||||
|
|
||||||
|
/* Enter a new name into a symbol alias set. */
|
||||||
|
|
||||||
|
static int
|
||||||
|
symbol_alias_set_insert (symbol_alias_set_t *aset, tree t)
|
||||||
|
{
|
||||||
|
/* We accept either a DECL or an IDENTIFIER directly. */
|
||||||
|
if (TREE_CODE (t) != IDENTIFIER_NODE)
|
||||||
|
t = DECL_ASSEMBLER_NAME (t);
|
||||||
|
t = targetm.asm_out.mangle_assembler_name (IDENTIFIER_POINTER (t));
|
||||||
|
return pointer_set_insert (aset, t);
|
||||||
|
}
|
||||||
|
|
||||||
/* Compute the set of indentifier nodes that is generated by aliases
|
/* Compute the set of indentifier nodes that is generated by aliases
|
||||||
whose targets are reachable. */
|
whose targets are reachable. */
|
||||||
|
|
||||||
static struct pointer_set_t *
|
static symbol_alias_set_t *
|
||||||
compute_visible_aliases (void)
|
compute_visible_aliases (void)
|
||||||
{
|
{
|
||||||
struct pointer_set_t *visible;
|
symbol_alias_set_t *visible;
|
||||||
unsigned i;
|
unsigned i;
|
||||||
alias_pair *p;
|
alias_pair *p;
|
||||||
bool changed;
|
bool changed;
|
||||||
|
|
||||||
/* We have to compute the set of visible nodes including aliases
|
/* We have to compute the set of visible nodes including aliases
|
||||||
themselves. */
|
themselves. */
|
||||||
visible = pointer_set_create ();
|
visible = symbol_alias_set_create ();
|
||||||
do
|
do
|
||||||
{
|
{
|
||||||
changed = false;
|
changed = false;
|
||||||
|
|
@ -5526,21 +5572,13 @@ compute_visible_aliases (void)
|
||||||
{
|
{
|
||||||
struct cgraph_node *fnode = NULL;
|
struct cgraph_node *fnode = NULL;
|
||||||
struct varpool_node *vnode = NULL;
|
struct varpool_node *vnode = NULL;
|
||||||
tree asmname = DECL_ASSEMBLER_NAME (p->decl);
|
|
||||||
const char *str = IDENTIFIER_POINTER (asmname);
|
|
||||||
|
|
||||||
if (str[0] == '*')
|
|
||||||
{
|
|
||||||
str ++;
|
|
||||||
asmname = get_identifier (str);
|
|
||||||
}
|
|
||||||
|
|
||||||
fnode = cgraph_node_for_asm (p->target);
|
fnode = cgraph_node_for_asm (p->target);
|
||||||
vnode = (fnode == NULL) ? varpool_node_for_asm (p->target) : NULL;
|
vnode = (fnode == NULL) ? varpool_node_for_asm (p->target) : NULL;
|
||||||
if ((fnode
|
if ((fnode
|
||||||
|| vnode
|
|| vnode
|
||||||
|| pointer_set_contains (visible, p->target))
|
|| symbol_alias_set_contains (visible, p->target))
|
||||||
&& !pointer_set_insert (visible, asmname))
|
&& !symbol_alias_set_insert (visible, p->decl))
|
||||||
changed = true;
|
changed = true;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
@ -5555,7 +5593,7 @@ compute_visible_aliases (void)
|
||||||
void
|
void
|
||||||
remove_unreachable_alias_pairs (void)
|
remove_unreachable_alias_pairs (void)
|
||||||
{
|
{
|
||||||
struct pointer_set_t *visible;
|
symbol_alias_set_t *visible;
|
||||||
unsigned i;
|
unsigned i;
|
||||||
alias_pair *p;
|
alias_pair *p;
|
||||||
|
|
||||||
|
|
@ -5576,7 +5614,7 @@ remove_unreachable_alias_pairs (void)
|
||||||
vnode = (fnode == NULL) ? varpool_node_for_asm (p->target) : NULL;
|
vnode = (fnode == NULL) ? varpool_node_for_asm (p->target) : NULL;
|
||||||
if (!fnode
|
if (!fnode
|
||||||
&& !vnode
|
&& !vnode
|
||||||
&& !pointer_set_contains (visible, p->target))
|
&& !symbol_alias_set_contains (visible, p->target))
|
||||||
{
|
{
|
||||||
VEC_unordered_remove (alias_pair, alias_pairs, i);
|
VEC_unordered_remove (alias_pair, alias_pairs, i);
|
||||||
continue;
|
continue;
|
||||||
|
|
@ -5586,7 +5624,7 @@ remove_unreachable_alias_pairs (void)
|
||||||
i++;
|
i++;
|
||||||
}
|
}
|
||||||
|
|
||||||
pointer_set_destroy (visible);
|
symbol_alias_set_destroy (visible);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
|
|
@ -5596,7 +5634,7 @@ remove_unreachable_alias_pairs (void)
|
||||||
void
|
void
|
||||||
finish_aliases_1 (void)
|
finish_aliases_1 (void)
|
||||||
{
|
{
|
||||||
struct pointer_set_t *visible;
|
symbol_alias_set_t *visible;
|
||||||
unsigned i;
|
unsigned i;
|
||||||
alias_pair *p;
|
alias_pair *p;
|
||||||
|
|
||||||
|
|
@ -5614,7 +5652,7 @@ finish_aliases_1 (void)
|
||||||
target_decl = find_decl_and_mark_needed (p->decl, p->target);
|
target_decl = find_decl_and_mark_needed (p->decl, p->target);
|
||||||
if (target_decl == NULL)
|
if (target_decl == NULL)
|
||||||
{
|
{
|
||||||
if (pointer_set_contains (visible, p->target))
|
if (symbol_alias_set_contains (visible, p->target))
|
||||||
continue;
|
continue;
|
||||||
|
|
||||||
if (! (p->emitted_diags & ALIAS_DIAG_TO_UNDEF)
|
if (! (p->emitted_diags & ALIAS_DIAG_TO_UNDEF)
|
||||||
|
|
@ -5640,7 +5678,7 @@ finish_aliases_1 (void)
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
pointer_set_destroy (visible);
|
symbol_alias_set_destroy (visible);
|
||||||
}
|
}
|
||||||
|
|
||||||
/* Second pass of completing pending aliases. Emit the actual assembly.
|
/* Second pass of completing pending aliases. Emit the actual assembly.
|
||||||
|
|
|
||||||
Loading…
Reference in New Issue