#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
whose targets are reachable. */
-static struct pointer_set_t *
+static symbol_alias_set_t *
compute_visible_aliases (void)
{
- struct pointer_set_t *visible;
+ symbol_alias_set_t *visible;
unsigned i;
alias_pair *p;
bool changed;
/* We have to compute the set of visible nodes including aliases
themselves. */
- visible = pointer_set_create ();
+ visible = symbol_alias_set_create ();
do
{
changed = false;
{
struct cgraph_node *fnode = 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);
vnode = (fnode == NULL) ? varpool_node_for_asm (p->target) : NULL;
if ((fnode
|| vnode
- || pointer_set_contains (visible, p->target))
- && !pointer_set_insert (visible, asmname))
+ || symbol_alias_set_contains (visible, p->target))
+ && !symbol_alias_set_insert (visible, p->decl))
changed = true;
}
}
void
remove_unreachable_alias_pairs (void)
{
- struct pointer_set_t *visible;
+ symbol_alias_set_t *visible;
unsigned i;
alias_pair *p;
vnode = (fnode == NULL) ? varpool_node_for_asm (p->target) : NULL;
if (!fnode
&& !vnode
- && !pointer_set_contains (visible, p->target))
+ && !symbol_alias_set_contains (visible, p->target))
{
VEC_unordered_remove (alias_pair, alias_pairs, i);
continue;
i++;
}
- pointer_set_destroy (visible);
+ symbol_alias_set_destroy (visible);
}
void
finish_aliases_1 (void)
{
- struct pointer_set_t *visible;
+ symbol_alias_set_t *visible;
unsigned i;
alias_pair *p;
target_decl = find_decl_and_mark_needed (p->decl, p->target);
if (target_decl == NULL)
{
- if (pointer_set_contains (visible, p->target))
+ if (symbol_alias_set_contains (visible, p->target))
continue;
if (! (p->emitted_diags & ALIAS_DIAG_TO_UNDEF)
}
}
- pointer_set_destroy (visible);
+ symbol_alias_set_destroy (visible);
}
/* Second pass of completing pending aliases. Emit the actual assembly.