OSDN Git Service

gcc/
authorrsandifo <rsandifo@138bc75d-0d04-0410-961f-82ee72b054a4>
Sun, 29 Oct 2006 11:00:08 +0000 (11:00 +0000)
committerrsandifo <rsandifo@138bc75d-0d04-0410-961f-82ee72b054a4>
Sun, 29 Oct 2006 11:00:08 +0000 (11:00 +0000)
* config/mips/mips.c (mips_classify_symbol): Test DECL_WEAK as well
as TREE_PUBLIC when deciding whether to return SYMBOL_GOT_GLOBAL.

git-svn-id: svn+ssh://gcc.gnu.org/svn/gcc/trunk@118137 138bc75d-0d04-0410-961f-82ee72b054a4

gcc/ChangeLog
gcc/config/mips/mips.c

index 670536c..20b251c 100644 (file)
@@ -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,
index ea5ec26..5fe1b50 100644 (file)
@@ -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;
        }