mips.c (mips_rewrite_small_data_1): Take the context as a parameter instead of the...
authorRichard Sandiford <richard.sandiford@arm.com>
Sun, 26 Oct 2014 10:41:06 +0000 (10:41 +0000)
committerRichard Sandiford <rsandifo@gcc.gnu.org>
Sun, 26 Oct 2014 10:41:06 +0000 (10:41 +0000)
gcc/
* config/mips/mips.c (mips_rewrite_small_data_1): Take the context
as a parameter instead of the containing MEM.  Iterate over all
subrtxes.  Don't return a value.
(mips_rewrite_small_data): Update call accordingly.

From-SVN: r216708

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

index 10dd26e84a8fcb41fefe84d10402fb39a1676256..dae8c32d146b6e16651a67ee5f69492413e6041e 100644 (file)
@@ -1,3 +1,10 @@
+2014-10-26  Richard Sandiford  <richard.sandiford@arm.com>
+
+       * config/mips/mips.c (mips_rewrite_small_data_1): Take the context
+       as a parameter instead of the containing MEM.  Iterate over all
+       subrtxes.  Don't return a value.
+       (mips_rewrite_small_data): Update call accordingly.
+
 2014-10-26  Richard Sandiford  <richard.sandiford@arm.com>
 
        * config/mips/mips.c: Include rtl-iter.h.
index f0286ce4f64463f23b93bbf9861a975702c39727..4d16d9b81fa8d13803af49521e8e685d8f7c2fb8 100644 (file)
@@ -3487,28 +3487,29 @@ mips_small_data_pattern_p (rtx op)
   return mips_small_data_pattern_1 (op, SYMBOL_CONTEXT_LEA);
 }
 
-/* A for_each_rtx callback, used by mips_rewrite_small_data.
-   DATA is the containing MEM, or null if none.  */
+/* Rewrite *LOC so that it refers to small data using explicit
+   relocations.  CONTEXT is the context in which *LOC appears.  */
 
-static int
-mips_rewrite_small_data_1 (rtx *loc, void *data)
+static void
+mips_rewrite_small_data_1 (rtx *loc, enum mips_symbol_context context)
 {
-  enum mips_symbol_context context;
-
-  if (MEM_P (*loc))
+  subrtx_ptr_iterator::array_type array;
+  FOR_EACH_SUBRTX_PTR (iter, array, loc, ALL)
     {
-      for_each_rtx (&XEXP (*loc, 0), mips_rewrite_small_data_1, *loc);
-      return -1;
+      rtx *loc = *iter;
+      if (MEM_P (*loc))
+       {
+         mips_rewrite_small_data_1 (&XEXP (*loc, 0), SYMBOL_CONTEXT_MEM);
+         iter.skip_subrtxes ();
+       }
+      else if (mips_rewrite_small_data_p (*loc, context))
+       {
+         *loc = gen_rtx_LO_SUM (Pmode, pic_offset_table_rtx, *loc);
+         iter.skip_subrtxes ();
+       }
+      else if (GET_CODE (*loc) == LO_SUM)
+       iter.skip_subrtxes ();
     }
-
-  context = data ? SYMBOL_CONTEXT_MEM : SYMBOL_CONTEXT_LEA;
-  if (mips_rewrite_small_data_p (*loc, context))
-    *loc = gen_rtx_LO_SUM (Pmode, pic_offset_table_rtx, *loc);
-
-  if (GET_CODE (*loc) == LO_SUM)
-    return -1;
-
-  return 0;
 }
 
 /* Rewrite instruction pattern PATTERN so that it refers to small data
@@ -3518,7 +3519,7 @@ rtx
 mips_rewrite_small_data (rtx pattern)
 {
   pattern = copy_insn (pattern);
-  for_each_rtx (&pattern, mips_rewrite_small_data_1, NULL);
+  mips_rewrite_small_data_1 (&pattern, SYMBOL_CONTEXT_LEA);
   return pattern;
 }
 \f