diff options
author | Richard Henderson <rth@redhat.com> | 2005-01-01 23:52:31 -0800 |
---|---|---|
committer | Richard Henderson <rth@gcc.gnu.org> | 2005-01-01 23:52:31 -0800 |
commit | bedb9fc04bb56b56d8af671bdfe28cc9052622ec (patch) | |
tree | 9fcf4185c5360e802ff2cef25c68d1cd2b7178d6 /gcc/varasm.c | |
parent | 1cb2fc7b18423a905d0c646dc7b0b6b5a023de36 (diff) | |
download | gcc-bedb9fc04bb56b56d8af671bdfe28cc9052622ec.zip gcc-bedb9fc04bb56b56d8af671bdfe28cc9052622ec.tar.gz gcc-bedb9fc04bb56b56d8af671bdfe28cc9052622ec.tar.bz2 |
re PR c/19031 (#pragma weak handling changes in 4.0.0)
PR c/19031
* c-decl.c (pop_file_scope): Call maybe_apply_pending_pragma_weaks.
* c-lang.c (finish_file): Don't do it here.
* objc/objc-act.c (objc_finish_file): Likewise.
* cgraph.c (decl_assembler_name_equal): New.
(cgraph_node_for_asm, cgraph_varpool_node_for_asm): New.
(cgraph_varpool_node): Actually link up cgraph_varpool_nodes.
* cgraph.h (struct cgraph_varpool_node): Add next.
(cgraph_node_for_asm, cgraph_varpool_node_for_asm): Declare.
* varasm.c (assemble_alias): Mark the target as needed.
From-SVN: r92803
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; |