aboutsummaryrefslogtreecommitdiff
path: root/gcc/varasm.c
diff options
context:
space:
mode:
Diffstat (limited to 'gcc/varasm.c')
-rw-r--r--gcc/varasm.c40
1 files changed, 39 insertions, 1 deletions
diff --git a/gcc/varasm.c b/gcc/varasm.c
index 362abaf..7c58b98 100644
--- a/gcc/varasm.c
+++ b/gcc/varasm.c
@@ -4344,7 +4344,7 @@ globalize_decl (tree decl)
the symbol for TARGET. */
void
-assemble_alias (tree decl, tree target ATTRIBUTE_UNUSED)
+assemble_alias (tree decl, tree target)
{
const char *name;
@@ -4395,6 +4395,44 @@ assemble_alias (tree decl, tree target ATTRIBUTE_UNUSED)
#endif
#endif
+ /* Tell cgraph that the aliased symbol is needed. We *could* be more
+ specific and tell cgraph about the relationship between the two
+ symbols, but given that aliases virtually always exist for a reason,
+ it doesn't seem worthwhile. */
+ if (flag_unit_at_a_time)
+ {
+ struct cgraph_node *fnode = NULL;
+ struct cgraph_varpool_node *vnode = NULL;
+
+ if (TREE_CODE (decl) == FUNCTION_DECL)
+ {
+ fnode = cgraph_node_for_asm (target);
+ if (fnode != NULL)
+ cgraph_mark_needed_node (fnode);
+ else
+ {
+ vnode = cgraph_varpool_node_for_asm (target);
+ if (vnode != NULL)
+ cgraph_varpool_mark_needed_node (vnode);
+ }
+ }
+ else
+ {
+ vnode = cgraph_varpool_node_for_asm (target);
+ if (vnode != NULL)
+ cgraph_varpool_mark_needed_node (vnode);
+ else
+ {
+ fnode = cgraph_node_for_asm (target);
+ if (fnode != NULL)
+ cgraph_mark_needed_node (fnode);
+ }
+ }
+
+ if (fnode == NULL && vnode == NULL)
+ warning ("%qD aliased to undefined symbol %qE", decl, target);
+ }
+
TREE_USED (decl) = 1;
TREE_ASM_WRITTEN (decl) = 1;
TREE_ASM_WRITTEN (DECL_ASSEMBLER_NAME (decl)) = 1;