]> git.ipfire.org Git - thirdparty/gcc.git/commitdiff
re PR target/33169 (Compiler generates two different relocs for the same symbol)
authorRichard Sandiford <rsandifo@nildram.co.uk>
Mon, 22 Oct 2007 20:11:19 +0000 (20:11 +0000)
committerRichard Sandiford <rsandifo@gcc.gnu.org>
Mon, 22 Oct 2007 20:11:19 +0000 (20:11 +0000)
gcc/
PR target/33169
Backport from mainline:

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.

From-SVN: r129559

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

index deaab711885f9c7f3d2929f5dcec7ae13fcd2636..6bc59f0fa60e58acff1539d51f036cc7f931b7dc 100644 (file)
@@ -1,3 +1,13 @@
+2007-10-22  Richard Sandiford  <rsandifo@nildram.co.uk>
+
+       PR target/33169
+       Backport from mainline:
+
+       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.
+
 2007-10-22  Richard Sandiford  <rsandifo@nildram.co.uk>
 
        Backport from mainline:
index c1f6a4d2a01260a5de0b3672b6da8431d4397e0a..40d14799ab0aabf2ca86a034ae802c103abb2b2c 100644 (file)
@@ -1197,6 +1197,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)
@@ -1228,7 +1230,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;
@@ -1256,11 +1259,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;
        }