diff options
author | David Holsgrove <david.holsgrove@xilinx.com> | 2013-03-04 15:31:49 +0000 |
---|---|---|
committer | Michael Eager <eager@gcc.gnu.org> | 2013-03-04 15:31:49 +0000 |
commit | 91c4e421067811331f49352160047fa6bf221583 (patch) | |
tree | 87deb0c56699913768af89023edca0b8daa46159 /gcc | |
parent | 82f8f53a71bf8cb82fd5c9da4f78748e9bf9f754 (diff) | |
download | gcc-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/ChangeLog | 9 | ||||
-rw-r--r-- | gcc/config/microblaze/microblaze-protos.h | 1 | ||||
-rw-r--r-- | gcc/config/microblaze/microblaze.c | 26 | ||||
-rw-r--r-- | gcc/config/microblaze/microblaze.h | 2 |
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) |