aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorRichard Sandiford <rdsandiford@googlemail.com>2014-08-28 06:25:18 +0000
committerRichard Sandiford <rsandifo@gcc.gnu.org>2014-08-28 06:25:18 +0000
commit82cfcdb63298a08a5eff485750128577e21786f0 (patch)
tree933db56ad5893f71086edf621cd43051f18b098c
parent750b270a1dd7a1c617f9dfa48a24b68216abf1c2 (diff)
downloadgcc-82cfcdb63298a08a5eff485750128577e21786f0.zip
gcc-82cfcdb63298a08a5eff485750128577e21786f0.tar.gz
gcc-82cfcdb63298a08a5eff485750128577e21786f0.tar.bz2
varasm.c (compute_reloc_for_rtx_1): Take a const_rtx.
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
-rw-r--r--gcc/ChangeLog10
-rw-r--r--gcc/varasm.c41
2 files changed, 30 insertions, 21 deletions
diff --git a/gcc/ChangeLog b/gcc/ChangeLog
index 50f5ece..9e35098 100644
--- a/gcc/ChangeLog
+++ b/gcc/ChangeLog
@@ -1,5 +1,15 @@
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...
(mark_constants_in_pattern): ...this new function to iterate over
all the subrtxes.
diff --git a/gcc/varasm.c b/gcc/varasm.c
index 8cc0633..823ca39 100644
--- a/gcc/varasm.c
+++ b/gcc/varasm.c
@@ -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;