From b0c7ddf816a38f18a58a3e1b86b78b5bbbba03c1 Mon Sep 17 00:00:00 2001 From: Cupertino Miranda Date: Fri, 3 Nov 2017 10:51:18 +0000 Subject: [ARC] Fix to unwinding. gcc/ChangeLog: 2017-11-03 Cupertino Miranda * config/arc/arc.c (arc_save_restore): Corrected CFA note. (arc_expand_prologue): Restore blink for millicode. * config/arc/linux.h (LINK_EH_SPEC): Defined. libgcc/ChangeLog: 2017-11-03 Cupertino Miranda Vineet Gupta * config.host (arc*-*-linux*): Set md_unwind_header variable. * config/arc/linux-unwind-reg.def: New file. * config/arc/linux-unwind.h: Likewise. Co-Authored-By: Vineet Gupta From-SVN: r254367 --- gcc/ChangeLog | 6 ++++++ gcc/config/arc/arc.c | 36 ++++++++++++++++++++++++++++++------ gcc/config/arc/linux.h | 8 ++++++++ 3 files changed, 44 insertions(+), 6 deletions(-) (limited to 'gcc') diff --git a/gcc/ChangeLog b/gcc/ChangeLog index d49923f..3926d41 100644 --- a/gcc/ChangeLog +++ b/gcc/ChangeLog @@ -1,3 +1,9 @@ +2017-11-03 Cupertino Miranda + + * config/arc/arc.c (arc_save_restore): Corrected CFA note. + (arc_expand_prologue): Restore blink for millicode. + * config/arc/linux.h (LINK_EH_SPEC): Defined. + 2017-11-03 Richard Sandiford PR target/82809 diff --git a/gcc/config/arc/arc.c b/gcc/config/arc/arc.c index 7336fad..7be9f7c 100644 --- a/gcc/config/arc/arc.c +++ b/gcc/config/arc/arc.c @@ -2823,12 +2823,23 @@ arc_save_restore (rtx base_reg, else { insn = frame_insn (insn); - if (epilogue_p) - for (r = start_call; r <= end_call; r++) - { - rtx reg = gen_rtx_REG (SImode, r); - add_reg_note (insn, REG_CFA_RESTORE, reg); - } + for (r = start_call, off = 0; + r <= end_call; + r++, off += UNITS_PER_WORD) + { + rtx reg = gen_rtx_REG (SImode, r); + if (epilogue_p) + add_reg_note (insn, REG_CFA_RESTORE, reg); + else + { + rtx mem = gen_rtx_MEM (SImode, plus_constant (Pmode, + base_reg, + off)); + + add_reg_note (insn, REG_CFA_OFFSET, + gen_rtx_SET (mem, reg)); + } + } } offset += off; } @@ -3070,6 +3081,19 @@ arc_expand_prologue (void) frame_size_to_allocate -= cfun->machine->frame_info.reg_size; } + /* In the case of millicode thunk, we need to restore the clobbered + blink register. */ + if (cfun->machine->frame_info.millicode_end_reg > 0 + && arc_must_save_return_addr (cfun)) + { + HOST_WIDE_INT tmp = cfun->machine->frame_info.reg_size; + emit_insn (gen_rtx_SET (gen_rtx_REG (Pmode, RETURN_ADDR_REGNUM), + gen_rtx_MEM (Pmode, + plus_constant (Pmode, + stack_pointer_rtx, + tmp)))); + } + /* Save frame pointer if needed. First save the FP on stack, if not autosaved. */ if (arc_frame_pointer_needed () diff --git a/gcc/config/arc/linux.h b/gcc/config/arc/linux.h index d8e0063..7073471 100644 --- a/gcc/config/arc/linux.h +++ b/gcc/config/arc/linux.h @@ -91,3 +91,11 @@ along with GCC; see the file COPYING3. If not see /* Pre/post modify with register displacement are default off. */ #undef TARGET_AUTO_MODIFY_REG_DEFAULT #define TARGET_AUTO_MODIFY_REG_DEFAULT 0 + +#if DEFAULT_LIBC == LIBC_GLIBC +/* Override linux.h LINK_EH_SPEC definition. + Signalize that because we have fde-glibc, we don't need all C shared libs + linked against -lgcc_s. */ +#undef LINK_EH_SPEC +#define LINK_EH_SPEC "--eh-frame-hdr" +#endif -- cgit v1.1