aboutsummaryrefslogtreecommitdiff
path: root/gcc
diff options
context:
space:
mode:
authorDavid Holsgrove <david.holsgrove@xilinx.com>2013-03-04 15:31:49 +0000
committerMichael Eager <eager@gcc.gnu.org>2013-03-04 15:31:49 +0000
commit91c4e421067811331f49352160047fa6bf221583 (patch)
tree87deb0c56699913768af89023edca0b8daa46159 /gcc
parent82f8f53a71bf8cb82fd5c9da4f78748e9bf9f754 (diff)
downloadgcc-91c4e421067811331f49352160047fa6bf221583.zip
gcc-91c4e421067811331f49352160047fa6bf221583.tar.gz
gcc-91c4e421067811331f49352160047fa6bf221583.tar.bz2
Add microblaze_legitimate_pic_operand method
Prevents ICE where insn contains an invalid address * config/microblaze/microblaze.c (microblaze_valid_pic_const): New (microblaze_legitimate_pic_operand): Likewise * config/microblaze/microblaze.h (LEGITIMATE_PIC_OPERAND_P): calls new function microblaze_legitimate_pic_operand * config/microblaze/microblaze-protos.h (microblaze_legitimate_pic_operand): Declare. From-SVN: r196434
Diffstat (limited to 'gcc')
-rw-r--r--gcc/ChangeLog9
-rw-r--r--gcc/config/microblaze/microblaze-protos.h1
-rw-r--r--gcc/config/microblaze/microblaze.c26
-rw-r--r--gcc/config/microblaze/microblaze.h2
4 files changed, 37 insertions, 1 deletions
diff --git a/gcc/ChangeLog b/gcc/ChangeLog
index 8bca611..8a290e4 100644
--- a/gcc/ChangeLog
+++ b/gcc/ChangeLog
@@ -1,3 +1,12 @@
+2013-03-04 David Holsgrove <david.holsgrove@xilinx.com>
+
+ * config/microblaze/microblaze.c (microblaze_valid_pic_const): New
+ (microblaze_legitimate_pic_operand): Likewise
+ * config/microblaze/microblaze.h (LEGITIMATE_PIC_OPERAND_P): calls
+ new function microblaze_legitimate_pic_operand
+ * config/microblaze/microblaze-protos.h
+ (microblaze_legitimate_pic_operand): Declare.
+
2013-03-04 Edgar E. Iglesias <edgar.iglesias@gmail.com>
* config/microblaze/predicates.md (call_insn_simple_operand):
diff --git a/gcc/config/microblaze/microblaze-protos.h b/gcc/config/microblaze/microblaze-protos.h
index 44740f3..fe2ac09 100644
--- a/gcc/config/microblaze/microblaze-protos.h
+++ b/gcc/config/microblaze/microblaze-protos.h
@@ -49,6 +49,7 @@ extern HOST_WIDE_INT microblaze_initial_elimination_offset (int, int);
extern void microblaze_declare_object (FILE *, const char *, const char *,
const char *, int);
extern void microblaze_asm_output_ident (const char *);
+extern int microblaze_legitimate_pic_operand (rtx);
#endif /* RTX_CODE */
/* Declare functions in microblaze-c.c. */
diff --git a/gcc/config/microblaze/microblaze.c b/gcc/config/microblaze/microblaze.c
index 8458253..5286316 100644
--- a/gcc/config/microblaze/microblaze.c
+++ b/gcc/config/microblaze/microblaze.c
@@ -596,6 +596,32 @@ microblaze_legitimate_address_p (enum machine_mode mode, rtx x, bool strict)
return microblaze_classify_address (&addr, x, mode, strict);
}
+int
+microblaze_valid_pic_const (rtx x)
+{
+ switch (GET_CODE (x))
+ {
+ case CONST:
+ case CONST_INT:
+ case CONST_DOUBLE:
+ return true;
+ default:
+ return false;
+ }
+}
+
+int
+microblaze_legitimate_pic_operand (rtx x)
+{
+ struct microblaze_address_info addr;
+
+ if (pic_address_needs_scratch (x))
+ return 0;
+ if (!microblaze_valid_pic_const(x))
+ return 0;
+
+ return 1;
+}
/* Try machine-dependent ways of modifying an illegitimate address
to be legitimate. If we find one, return the new, valid address.
diff --git a/gcc/config/microblaze/microblaze.h b/gcc/config/microblaze/microblaze.h
index 23ed16e..c726978 100644
--- a/gcc/config/microblaze/microblaze.h
+++ b/gcc/config/microblaze/microblaze.h
@@ -541,7 +541,7 @@ typedef struct microblaze_args
/* Define this, so that when PIC, reload won't try to reload invalid
addresses which require two reload registers. */
-#define LEGITIMATE_PIC_OPERAND_P(X) (!pic_address_needs_scratch (X))
+#define LEGITIMATE_PIC_OPERAND_P(X) microblaze_legitimate_pic_operand (X)
#define CASE_VECTOR_MODE (SImode)