diff options
Diffstat (limited to 'gcc/varasm.c')
-rw-r--r-- | gcc/varasm.c | 40 |
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; |