aboutsummaryrefslogtreecommitdiff
path: root/gcc
diff options
context:
space:
mode:
authorCupertino Miranda <cmiranda@synopsys.com>2017-11-03 10:51:18 +0000
committerClaudiu Zissulescu <claziss@gcc.gnu.org>2017-11-03 11:51:18 +0100
commitb0c7ddf816a38f18a58a3e1b86b78b5bbbba03c1 (patch)
treee89940f97d6b56c284a71248c1c32d647e08cc1d /gcc
parenta34a16abe50b14dfb23929a0e596275ab7fd11e2 (diff)
downloadgcc-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/ChangeLog6
-rw-r--r--gcc/config/arc/arc.c36
-rw-r--r--gcc/config/arc/linux.h8
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