From 3854efe8639a9a515ebc422acb9e638c579635f4 Mon Sep 17 00:00:00 2001 From: Richard Sandiford Date: Sun, 26 Oct 2014 10:41:06 +0000 Subject: [PATCH] mips.c (mips_rewrite_small_data_1): Take the context as a parameter instead of the containing MEM. 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 | 7 +++++++ gcc/config/mips/mips.c | 39 ++++++++++++++++++++------------------- 2 files changed, 27 insertions(+), 19 deletions(-) diff --git a/gcc/ChangeLog b/gcc/ChangeLog index 10dd26e84a8..dae8c32d146 100644 --- a/gcc/ChangeLog +++ b/gcc/ChangeLog @@ -1,3 +1,10 @@ +2014-10-26 Richard Sandiford + + * 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 * config/mips/mips.c: Include rtl-iter.h. diff --git a/gcc/config/mips/mips.c b/gcc/config/mips/mips.c index f0286ce4f64..4d16d9b81fa 100644 --- a/gcc/config/mips/mips.c +++ b/gcc/config/mips/mips.c @@ -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; } -- 2.30.2