From 5ba863d70d67fe53afb11ec0e71fc703ba843507 Mon Sep 17 00:00:00 2001 From: DJ Delorie Date: Thu, 10 Sep 2009 21:06:36 -0400 Subject: [PATCH] mep.md (eh_epilogue): Defer until after epilogue is emitted. * config/mep/mep.md (eh_epilogue): Defer until after epilogue is emitted. * config/mep/mep.h (LEGITIMATE_CONSTANT_P): New. * config/mep/mep.c (mep_legitimate_constant_p): New. * config/mep/mep-protos.h: Prototype it. From-SVN: r151625 --- gcc/ChangeLog | 9 +++++++++ gcc/config/mep/mep-protos.h | 1 + gcc/config/mep/mep.c | 14 ++++++++++++++ gcc/config/mep/mep.h | 3 ++- gcc/config/mep/mep.md | 2 +- 5 files changed, 27 insertions(+), 2 deletions(-) diff --git a/gcc/ChangeLog b/gcc/ChangeLog index f5724f5..64b946a 100644 --- a/gcc/ChangeLog +++ b/gcc/ChangeLog @@ -1,3 +1,12 @@ +2009-09-10 DJ Delorie + + * config/mep/mep.md (eh_epilogue): Defer until after epilogue is + emitted. + + * config/mep/mep.h (LEGITIMATE_CONSTANT_P): New. + * config/mep/mep.c (mep_legitimate_constant_p): New. + * config/mep/mep-protos.h: Prototype it. + 2009-09-10 Richard Henderson * print-rtl.c (print_rtx): Fix JUMP_LABEL index. diff --git a/gcc/config/mep/mep-protos.h b/gcc/config/mep/mep-protos.h index a4de754..e53ca79 100644 --- a/gcc/config/mep/mep-protos.h +++ b/gcc/config/mep/mep-protos.h @@ -48,6 +48,7 @@ extern void mep_split_wide_move (rtx *, enum machine_mode); #ifdef RTX_CODE extern bool mep_expand_setcc (rtx *); extern rtx mep_expand_cbranch (rtx *); +extern bool mep_legitimate_constant_p (rtx); #endif extern const char *mep_emit_cbranch (rtx *, int); extern void mep_expand_call (rtx *, int); diff --git a/gcc/config/mep/mep.c b/gcc/config/mep/mep.c index 80d3995..6ff6405 100644 --- a/gcc/config/mep/mep.c +++ b/gcc/config/mep/mep.c @@ -1211,6 +1211,20 @@ mep_multi_slot (rtx x) } +bool +mep_legitimate_constant_p (rtx x) +{ + /* We can't convert symbol values to gp- or tp-rel values after + reload, as reload might have used $gp or $tp for other + purposes. */ + if (GET_CODE (x) == SYMBOL_REF && (reload_in_progress || reload_completed)) + { + char e = mep_section_tag (x); + return (e != 't' && e != 'b'); + } + return 1; +} + /* Be careful not to use macros that need to be compiled one way for strict, and another way for not-strict, like REG_OK_FOR_BASE_P. */ diff --git a/gcc/config/mep/mep.h b/gcc/config/mep/mep.h index cb09c30..39837df 100644 --- a/gcc/config/mep/mep.h +++ b/gcc/config/mep/mep.h @@ -599,7 +599,8 @@ typedef struct #define GO_IF_MODE_DEPENDENT_ADDRESS(ADDR, LABEL) -#define LEGITIMATE_CONSTANT_P(X) 1 +#define LEGITIMATE_CONSTANT_P(X) \ + mep_legitimate_constant_p(X) #define SELECT_CC_MODE(OP, X, Y) CCmode diff --git a/gcc/config/mep/mep.md b/gcc/config/mep/mep.md index 20beef6..773a9a0 100644 --- a/gcc/config/mep/mep.md +++ b/gcc/config/mep/mep.md @@ -2192,7 +2192,7 @@ (use (reg:SI LP_REGNO))] "" "#" - "reload_completed" + "epilogue_completed" [(const_int 1)] "mep_emit_eh_epilogue (operands); DONE;" [(set_attr "slot" "multi")]) -- 2.7.4