This is the mail archive of the
gcc-patches@gcc.gnu.org
mailing list for the GCC project.
[PATCH] [SPARC] Make sure that jump is to a label in errata workaround
- From: Daniel Cederman <cederman at gaisler dot com>
- To: gcc-patches at gcc dot gnu dot org
- Cc: ebotcazou at adacore dot com, sebastian dot huber at embedded-brains dot de, daniel at gaisler dot com
- Date: Mon, 11 Dec 2017 10:16:25 +0100
- Subject: [PATCH] [SPARC] Make sure that jump is to a label in errata workaround
- Authentication-results: sourceware.org; auth=none
- Authorized-sender: cederman at gaisler dot com
In some cases the jump could be to a return instruction and in those
cases the next_active_insn() function tries to follow an invalid pointer
which leads to a crash. This error did not manifest when using a 32-bit
version of GCC which is why I did not detect it before. Thanks to Sebastian
for reporting this to me.
gcc/ChangeLog:
2017-12-11 Daniel Cederman <cederman@gaisler.com>
* config/sparc/sparc.c (sparc_do_work_around_errata): Make sure
the jump is to a label.
---
gcc/config/sparc/sparc.c | 3 ++-
1 file changed, 2 insertions(+), 1 deletion(-)
diff --git a/gcc/config/sparc/sparc.c b/gcc/config/sparc/sparc.c
index 00b90e5..b9c8dcc 100644
--- a/gcc/config/sparc/sparc.c
+++ b/gcc/config/sparc/sparc.c
@@ -1032,6 +1032,7 @@ sparc_do_work_around_errata (void)
floating-point operation or a floating-point branch. */
if (sparc_fix_gr712rc
&& jump
+ && jump_to_label_p (jump)
&& get_attr_branch_type (jump) == BRANCH_TYPE_ICC)
{
rtx_insn *target = next_active_insn (JUMP_LABEL_AS_INSN (jump));
@@ -1051,7 +1052,7 @@ sparc_do_work_around_errata (void)
&& mem_ref (SET_SRC (set))
&& REG_P (SET_DEST (set)))
{
- if (jump)
+ if (jump && jump_to_label_p (jump))
{
rtx_insn *target = next_active_insn (JUMP_LABEL_AS_INSN (jump));
if (target && atomic_insn_for_leon3_p (target))
--
2.9.3