From: David Holsgrove Date: Mon, 4 Mar 2013 15:31:49 +0000 (+0000) Subject: Add microblaze_legitimate_pic_operand method X-Git-Tag: releases/gcc-4.8.0~212 X-Git-Url: http://git.ipfire.org/gitweb.cgi?a=commitdiff_plain;h=91c4e421067811331f49352160047fa6bf221583;p=thirdparty%2Fgcc.git 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 --- diff --git a/gcc/ChangeLog b/gcc/ChangeLog index 8bca611a97b0..8a290e4a0de4 100644 --- a/gcc/ChangeLog +++ b/gcc/ChangeLog @@ -1,3 +1,12 @@ +2013-03-04 David Holsgrove + + * 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 * 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 44740f3dbc36..fe2ac09f86ac 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 8458253253ca..5286316e0ce2 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 23ed16e4f6c1..c726978800dc 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)