|
@@ -0,0 +1,166 @@
|
|
|
+Fetched from Xilinx gcc git at https://github.com/Xilinx/gcc
|
|
|
+
|
|
|
+From 23c35173490ac2d6348a668dfc9c1a6eb62171f2 Mon Sep 17 00:00:00 2001
|
|
|
+From: "Edgar E. Iglesias" <edgar.iglesias@gmail.com>
|
|
|
+Date: Mon, 18 Jun 2012 20:18:13 +0200
|
|
|
+Subject: [PATCH] [Patch, microblaze]: Enable DWARF exception handling support.
|
|
|
+
|
|
|
+Changelog
|
|
|
+
|
|
|
+2013-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_DEBUG
|
|
|
+Index: 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")
|
|
|
++
|