| 123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166 | Fetched from Xilinx gcc git at https://github.com/Xilinx/gccFrom 23c35173490ac2d6348a668dfc9c1a6eb62171f2 Mon Sep 17 00:00:00 2001From: "Edgar E. Iglesias" <edgar.iglesias@gmail.com>Date: Mon, 18 Jun 2012 20:18:13 +0200Subject: [PATCH] [Patch, microblaze]: Enable DWARF exception handling support.Changelog2013-03-18  Edgar E. Iglesias <edgar.iglesias@xilinx.com>            David Holsgrove <david.holsgrove@xilinx.com> * common/config/microblaze/microblaze-common.c: Remove   TARGET_EXCEPT_UNWIND_INFO definition. * config/microblaze/microblaze-protos.h: Add   microblaze_eh_return prototype. * gcc/config/microblaze/microblaze.c: (microblaze_must_save_register,   microblaze_expand_epilogue, microblaze_return_addr): Handle   calls_eh_return   (microblaze_eh_return): New function. * gcc/config/microblaze/microblaze.h: Define RETURN_ADDR_OFFSET,   EH_RETURN_DATA_REGNO, MB_EH_STACKADJ_REGNUM, EH_RETURN_STACKADJ_RTX,   ASM_PREFERRED_EH_DATA_FORMAT * gcc/config/microblaze/microblaze.md: Define eh_return pattern.Signed-off-by: David Holsgrove <david.holsgrove@xilinx.com>Signed-off-by: Edgar E. Iglesias <edgar.iglesias@gmail.com>--- gcc/common/config/microblaze/microblaze-common.c |  3 --- gcc/config/microblaze/microblaze-protos.h        |  1 + gcc/config/microblaze/microblaze.c               | 29 ++++++++++++++++++++---- gcc/config/microblaze/microblaze.h               | 15 ++++++++++++ gcc/config/microblaze/microblaze.md              | 11 +++++++++ 5 files changed, 52 insertions(+), 7 deletions(-)Index: b/gcc/common/config/microblaze/microblaze-common.c===================================================================--- a/gcc/common/config/microblaze/microblaze-common.c+++ b/gcc/common/config/microblaze/microblaze-common.c@@ -37,7 +37,4 @@ #undef  TARGET_OPTION_OPTIMIZATION_TABLE #define TARGET_OPTION_OPTIMIZATION_TABLE microblaze_option_optimization_table -#undef TARGET_EXCEPT_UNWIND_INFO-#define TARGET_EXCEPT_UNWIND_INFO  sjlj_except_unwind_info- struct gcc_targetm_common targetm_common = TARGETM_COMMON_INITIALIZER;Index: b/gcc/config/microblaze/microblaze-protos.h===================================================================--- a/gcc/config/microblaze/microblaze-protos.h+++ b/gcc/config/microblaze/microblaze-protos.h@@ -56,6 +56,7 @@ extern int symbol_mentioned_p (rtx); extern int label_mentioned_p (rtx); extern bool microblaze_cannot_force_const_mem (machine_mode, rtx);+extern void microblaze_eh_return (rtx op0); #endif  /* RTX_CODE */  /* Declare functions in microblaze-c.c.  */Index: b/gcc/config/microblaze/microblaze.c===================================================================--- a/gcc/config/microblaze/microblaze.c+++ b/gcc/config/microblaze/microblaze.c@@ -1959,6 +1959,11 @@   if (frame_pointer_needed && (regno == HARD_FRAME_POINTER_REGNUM))     return 1; +  if (crtl->calls_eh_return+      && regno == MB_ABI_SUB_RETURN_ADDR_REGNUM) {+    return 1;+  }+   if (!crtl->is_leaf)     {       if (regno == MB_ABI_SUB_RETURN_ADDR_REGNUM)@@ -1986,6 +1991,13 @@ 	return 1;     } +  if (crtl->calls_eh_return+      && (regno == EH_RETURN_DATA_REGNO (0)+          || regno == EH_RETURN_DATA_REGNO (1)))+    {+      return 1;+    }+   return 0; } @@ -3067,6 +3079,12 @@       emit_insn (gen_addsi3 (stack_pointer_rtx, stack_pointer_rtx, fsiz_rtx));     } +  if (crtl->calls_eh_return)+    emit_insn (gen_addsi3 (stack_pointer_rtx,+                           stack_pointer_rtx,+                           gen_rtx_raw_REG (SImode,+                                            MB_EH_STACKADJ_REGNUM)));+   emit_jump_insn (gen_return_internal (gen_rtx_REG (Pmode, GP_REG_FIRST + 						    MB_ABI_SUB_RETURN_ADDR_REGNUM))); }@@ -3364,10 +3382,13 @@   if (count != 0)     return NULL_RTX; -  return gen_rtx_PLUS (Pmode,-		       get_hard_reg_initial_val (Pmode,-						 MB_ABI_SUB_RETURN_ADDR_REGNUM),-		       GEN_INT (8));+  return get_hard_reg_initial_val (Pmode,+                                   MB_ABI_SUB_RETURN_ADDR_REGNUM);+}++void microblaze_eh_return (rtx op0)+{+  emit_insn (gen_movsi(gen_rtx_MEM(Pmode, stack_pointer_rtx), op0)); }  /* Queue an .ident string in the queue of top-level asm statements.Index: b/gcc/config/microblaze/microblaze.h===================================================================--- a/gcc/config/microblaze/microblaze.h+++ b/gcc/config/microblaze/microblaze.h@@ -184,6 +184,21 @@ #define INCOMING_RETURN_ADDR_RTX  			\   gen_rtx_REG (VOIDmode, GP_REG_FIRST + MB_ABI_SUB_RETURN_ADDR_REGNUM) +/* Specifies the offset from INCOMING_RETURN_ADDR_RTX and the actual return PC.  */+#define RETURN_ADDR_OFFSET (8)++/* Describe how we implement __builtin_eh_return.  */+#define EH_RETURN_DATA_REGNO(N) (((N) < 2) ? MB_ABI_FIRST_ARG_REGNUM + (N) : INVALID_REGNUM)++#define MB_EH_STACKADJ_REGNUM  MB_ABI_INT_RETURN_VAL2_REGNUM+#define EH_RETURN_STACKADJ_RTX  gen_rtx_REG (Pmode, MB_EH_STACKADJ_REGNUM)++/* Select a format to encode pointers in exception handling data.  CODE+   is 0 for data, 1 for code labels, 2 for function pointers.  GLOBAL is+   true if the symbol may be affected by dynamic relocations.  */+#define ASM_PREFERRED_EH_DATA_FORMAT(CODE,GLOBAL) \+  ((flag_pic || GLOBAL) ? DW_EH_PE_aligned : DW_EH_PE_absptr)+ /* Use DWARF 2 debugging information by default.  */ #define DWARF2_DEBUGGING_INFO #define PREFERRED_DEBUGGING_TYPE DWARF2_DEBUGIndex: b/gcc/config/microblaze/microblaze.md===================================================================--- a/gcc/config/microblaze/microblaze.md+++ b/gcc/config/microblaze/microblaze.md@@ -2272,4 +2272,15 @@   (set_attr "mode"      "SI")   (set_attr "length"    "4")]) +; This is used in compiling the unwind routines.+(define_expand "eh_return"+  [(use (match_operand 0 "general_operand" ""))]+  ""+  "+{+  microblaze_eh_return(operands[0]);+  DONE;+}")+ (include "sync.md")+
 |