aboutsummaryrefslogtreecommitdiff
path: root/gcc/varasm.c
diff options
context:
space:
mode:
authorGeoffrey Keating <geoffk@apple.com>2005-12-05 20:38:37 +0000
committerGeoffrey Keating <geoffk@gcc.gnu.org>2005-12-05 20:38:37 +0000
commita9b0b82578a7f552e3530e690a147303a592a34e (patch)
tree5e7f04633347fa5f7ca0e1b9e1b991f1227bdea4 /gcc/varasm.c
parent68e58c33468f3523c1eb6232d0a4d1e949db3011 (diff)
downloadgcc-a9b0b82578a7f552e3530e690a147303a592a34e.zip
gcc-a9b0b82578a7f552e3530e690a147303a592a34e.tar.gz
gcc-a9b0b82578a7f552e3530e690a147303a592a34e.tar.bz2
Index: gcc/ChangeLog
2005-12-05 Geoffrey Keating <geoffk@apple.com> * varasm.c (default_binds_local_p_1): Weakrefs don't bind locally. A hidden weak object does bind locally. Strong linkonce data counts like any other strong symbol for binding. (weak_finish_1): Don't specially handle weakrefs, they no longer arrive here. (assemble_alias): Weakrefs can't be TREE_PUBLIC yet. * c-common.c (handle_alias_attribute): Allow static aliases of variables. (handle_weakref_attribute): Don't call declare_weak on weakrefs. * gthr-dce.h: Make weakrefs static. * gthr-tpf.h: Likewise. * gthr-solaris.h: Likewise. * gthr-posix.h: Likewise. * gthr-posix95.h: Likewise. * config/darwin.c (darwin_encode_section_info): static weakref variables are not necessarily defined in this translation unit. * doc/extend.texi (Function Attributes): Mention that an alias attribute creates a definition for the thing it's attached to. Change the documentation for weakref to say that the thing it's attached to must be static. Index: gcc/testsuite/ChangeLog 2005-12-05 Geoffrey Keating <geoffk@apple.com> * g++.old-deja/g++.abi/vtable2.C: Make weakrefs static. * gcc.dg/attr-weakref-1.c: Modify to not try to test public weakrefs, and to work on Darwin. * gcc.dg/attr-weakref-1b.c: New file. * gcc.dg/attr-weakref-2.c: New test. * gcc.dg/darwin-weakref-1.c: New test. From-SVN: r108074
Diffstat (limited to 'gcc/varasm.c')
-rw-r--r--gcc/varasm.c28
1 files changed, 17 insertions, 11 deletions
diff --git a/gcc/varasm.c b/gcc/varasm.c
index fa181e1..5e59f3a 100644
--- a/gcc/varasm.c
+++ b/gcc/varasm.c
@@ -4508,10 +4508,6 @@ weak_finish_1 (tree decl)
if (! TREE_USED (decl))
return;
- if (lookup_attribute ("weakref", DECL_ATTRIBUTES (decl))
- && lookup_attribute ("alias", DECL_ATTRIBUTES (decl)))
- return;
-
#ifdef ASM_WEAKEN_DECL
ASM_WEAKEN_DECL (asm_out_file, decl, name, NULL);
#else
@@ -4878,6 +4874,8 @@ assemble_alias (tree decl, tree target)
TREE_CHAIN (alias) = target;
#endif
}
+ if (TREE_PUBLIC (decl))
+ error ("weakref %q+D must have static linkage", decl);
}
else
{
@@ -5619,21 +5617,29 @@ default_binds_local_p_1 (tree exp, int shlib)
/* A non-decl is an entry in the constant pool. */
if (!DECL_P (exp))
local_p = true;
+ /* Weakrefs may not bind locally, even though the weakref itself is
+ always static and therefore local. */
+ else if (lookup_attribute ("weakref", DECL_ATTRIBUTES (exp)))
+ local_p = false;
/* Static variables are always local. */
else if (! TREE_PUBLIC (exp))
local_p = true;
- /* A variable is local if the user explicitly tells us so. */
- else if (DECL_VISIBILITY_SPECIFIED (exp) && DECL_VISIBILITY (exp) != VISIBILITY_DEFAULT)
+ /* A variable is local if the user has said explicitly that it will
+ be. */
+ else if (DECL_VISIBILITY_SPECIFIED (exp)
+ && DECL_VISIBILITY (exp) != VISIBILITY_DEFAULT)
local_p = true;
- /* Otherwise, variables defined outside this object may not be local. */
+ /* Variables defined outside this object might not be local. */
else if (DECL_EXTERNAL (exp))
local_p = false;
- /* Linkonce and weak data are never local. */
- else if (DECL_ONE_ONLY (exp) || DECL_WEAK (exp))
- local_p = false;
- /* If none of the above and visibility is not default, make local. */
+ /* If defined in this object and visibility is not default, must be
+ local. */
else if (DECL_VISIBILITY (exp) != VISIBILITY_DEFAULT)
local_p = true;
+ /* Default visibility weak data can be overridden by a strong symbol
+ in another module and so are not local. */
+ else if (DECL_WEAK (exp))
+ local_p = false;
/* If PIC, then assume that any global name can be overridden by
symbols resolved from other modules. */
else if (shlib)