varasm.c (compute_reloc_for_rtx_1): Take a const_rtx.
authorRichard Sandiford <rdsandiford@googlemail.com>
Thu, 28 Aug 2014 06:25:18 +0000 (06:25 +0000)
committerRichard Sandiford <rsandifo@gcc.gnu.org>
Thu, 28 Aug 2014 06:25:18 +0000 (06:25 +0000)
gcc/
* varasm.c (compute_reloc_for_rtx_1): Take a const_rtx.  Remove the
pointer to the cumulative reloc value and return the value for
this reloc instead.
(compute_reloc_for_rtx): Take a const_rtx.  Call
compute_reloc_for_rtx_1 directly for SYMBOL_REF and LABEL_REF,
avoiding any recursion.  Use FOR_EACH_SUBRTX rather than
for_each_rtx for the CONST case.

From-SVN: r214667

gcc/ChangeLog
gcc/varasm.c

index 50f5ece8421fae2a96c869e3909a725a8b704ea3..9e350980f1137aa750b2aa2f9c79a576cfe3e0d2 100644 (file)
@@ -1,3 +1,13 @@
+2014-08-28  Richard Sandiford  <rdsandiford@googlemail.com>
+
+       * varasm.c (compute_reloc_for_rtx_1): Take a const_rtx.  Remove the
+       pointer to the cumulative reloc value and return the value for
+       this reloc instead.
+       (compute_reloc_for_rtx): Take a const_rtx.  Call
+       compute_reloc_for_rtx_1 directly for SYMBOL_REF and LABEL_REF,
+       avoiding any recursion.  Use FOR_EACH_SUBRTX rather than
+       for_each_rtx for the CONST case.
+
 2014-08-28  Richard Sandiford  <rdsandiford@googlemail.com>
 
        * varasm.c (mark_constant): Replace this for_each_rtx callback with...
index 8cc0633252f256130a33372071567a6875dcd5b9..823ca391bb333f0165d2eb00b1d67ea6339f2139 100644 (file)
@@ -6487,44 +6487,43 @@ default_unique_section (tree decl, int reloc)
   set_decl_section_name (decl, string);
 }
 
-/* Like compute_reloc_for_constant, except for an RTX.  The return value
-   is a mask for which bit 1 indicates a global relocation, and bit 0
-   indicates a local relocation.  */
+/* Subroutine of compute_reloc_for_rtx for leaf rtxes.  */
 
 static int
-compute_reloc_for_rtx_1 (rtx *xp, void *data)
+compute_reloc_for_rtx_1 (const_rtx x)
 {
-  int *preloc = (int *) data;
-  rtx x = *xp;
-
   switch (GET_CODE (x))
     {
     case SYMBOL_REF:
-      *preloc |= SYMBOL_REF_LOCAL_P (x) ? 1 : 2;
-      break;
+      return SYMBOL_REF_LOCAL_P (x) ? 1 : 2;
     case LABEL_REF:
-      *preloc |= 1;
-      break;
+      return 1;
     default:
-      break;
+      return 0;
     }
-
-  return 0;
 }
 
+/* Like compute_reloc_for_constant, except for an RTX.  The return value
+   is a mask for which bit 1 indicates a global relocation, and bit 0
+   indicates a local relocation.  */
+
 static int
-compute_reloc_for_rtx (rtx x)
+compute_reloc_for_rtx (const_rtx x)
 {
-  int reloc;
-
   switch (GET_CODE (x))
     {
-    case CONST:
     case SYMBOL_REF:
     case LABEL_REF:
-      reloc = 0;
-      for_each_rtx (&x, compute_reloc_for_rtx_1, &reloc);
-      return reloc;
+      return compute_reloc_for_rtx_1 (x);
+
+    case CONST:
+      {
+       int reloc = 0;
+       subrtx_iterator::array_type array;
+       FOR_EACH_SUBRTX (iter, array, x, ALL)
+         reloc |= compute_reloc_for_rtx_1 (*iter);
+       return reloc;
+      }
 
     default:
       return 0;