diff options
author | Cupertino Miranda <cmiranda@synopsys.com> | 2017-11-03 10:51:18 +0000 |
---|---|---|
committer | Claudiu Zissulescu <claziss@gcc.gnu.org> | 2017-11-03 11:51:18 +0100 |
commit | b0c7ddf816a38f18a58a3e1b86b78b5bbbba03c1 (patch) | |
tree | e89940f97d6b56c284a71248c1c32d647e08cc1d /gcc | |
parent | a34a16abe50b14dfb23929a0e596275ab7fd11e2 (diff) | |
download | gcc-b0c7ddf816a38f18a58a3e1b86b78b5bbbba03c1.zip gcc-b0c7ddf816a38f18a58a3e1b86b78b5bbbba03c1.tar.gz gcc-b0c7ddf816a38f18a58a3e1b86b78b5bbbba03c1.tar.bz2 |
[ARC] Fix to unwinding.
gcc/ChangeLog:
2017-11-03 Cupertino Miranda <cmiranda@synopsys.com>
* 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 <cmiranda@synopsys.com>
Vineet Gupta <vgupta@synopsys.com>
* 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 <vgupta@synopsys.com>
From-SVN: r254367
Diffstat (limited to 'gcc')
-rw-r--r-- | gcc/ChangeLog | 6 | ||||
-rw-r--r-- | gcc/config/arc/arc.c | 36 | ||||
-rw-r--r-- | gcc/config/arc/linux.h | 8 |
3 files changed, 44 insertions, 6 deletions
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 <cmiranda@synopsys.com> + + * 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 <richard.sandiford@linaro.org> 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 |