diff options
author | Geoffrey Keating <geoffk@apple.com> | 2005-12-05 20:38:37 +0000 |
---|---|---|
committer | Geoffrey Keating <geoffk@gcc.gnu.org> | 2005-12-05 20:38:37 +0000 |
commit | a9b0b82578a7f552e3530e690a147303a592a34e (patch) | |
tree | 5e7f04633347fa5f7ca0e1b9e1b991f1227bdea4 /gcc/varasm.c | |
parent | 68e58c33468f3523c1eb6232d0a4d1e949db3011 (diff) | |
download | gcc-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.c | 28 |
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) |