diff options
author | Richard Sandiford <richard@codesourcery.com> | 2006-10-29 11:00:08 +0000 |
---|---|---|
committer | Richard Sandiford <rsandifo@gcc.gnu.org> | 2006-10-29 11:00:08 +0000 |
commit | 5f687d19e06bbdeccc7a0b6d831ae884d177b522 (patch) | |
tree | 5bad4102c289292464c6c20e2b0dd7f332628659 | |
parent | a8db47cb5889a381d0a40c903243a9945299fbb9 (diff) | |
download | gcc-5f687d19e06bbdeccc7a0b6d831ae884d177b522.zip gcc-5f687d19e06bbdeccc7a0b6d831ae884d177b522.tar.gz gcc-5f687d19e06bbdeccc7a0b6d831ae884d177b522.tar.bz2 |
mips.c (mips_classify_symbol): Test DECL_WEAK as well as TREE_PUBLIC when deciding whether to return...
gcc/
* config/mips/mips.c (mips_classify_symbol): Test DECL_WEAK as well
as TREE_PUBLIC when deciding whether to return SYMBOL_GOT_GLOBAL.
From-SVN: r118137
-rw-r--r-- | gcc/ChangeLog | 5 | ||||
-rw-r--r-- | gcc/config/mips/mips.c | 19 |
2 files changed, 18 insertions, 6 deletions
diff --git a/gcc/ChangeLog b/gcc/ChangeLog index 670536c..20b251c 100644 --- a/gcc/ChangeLog +++ b/gcc/ChangeLog @@ -1,3 +1,8 @@ +2006-10-29 Richard Sandiford <richard@codesourcery.com> + + * config/mips/mips.c (mips_classify_symbol): Test DECL_WEAK as well + as TREE_PUBLIC when deciding whether to return SYMBOL_GOT_GLOBAL. + 2006-10-29 Kazu Hirata <kazu@codesourcery.com> * config/darwin.c, config/darwin.opt, config/ia64/itanium1.md, diff --git a/gcc/config/mips/mips.c b/gcc/config/mips/mips.c index ea5ec26..5fe1b50 100644 --- a/gcc/config/mips/mips.c +++ b/gcc/config/mips/mips.c @@ -1198,6 +1198,8 @@ struct gcc_target targetm = TARGET_INITIALIZER; static enum mips_symbol_type mips_classify_symbol (rtx x) { + tree decl; + if (GET_CODE (x) == LABEL_REF) { if (TARGET_MIPS16) @@ -1229,7 +1231,8 @@ mips_classify_symbol (rtx x) if (TARGET_ABICALLS) { - if (SYMBOL_REF_DECL (x) == 0) + decl = SYMBOL_REF_DECL (x); + if (decl == 0) { if (!SYMBOL_REF_LOCAL_P (x)) return SYMBOL_GOT_GLOBAL; @@ -1257,11 +1260,15 @@ mips_classify_symbol (rtx x) In the third case we have more freedom since both forms of access will work for any kind of symbol. However, there seems - little point in doing things differently. */ - if (DECL_P (SYMBOL_REF_DECL (x)) - && TREE_PUBLIC (SYMBOL_REF_DECL (x)) - && !(TARGET_ABSOLUTE_ABICALLS - && targetm.binds_local_p (SYMBOL_REF_DECL (x)))) + little point in doing things differently. + + Note that weakref symbols are not TREE_PUBLIC, but their + targets are global or weak symbols. Relocations in the + object file will be against the target symbol, so it's + that symbol's binding that matters here. */ + if (DECL_P (decl) + && (TREE_PUBLIC (decl) || DECL_WEAK (decl)) + && !(TARGET_ABSOLUTE_ABICALLS && targetm.binds_local_p (decl))) return SYMBOL_GOT_GLOBAL; } |