Commit 486a2b66 by Jakub Jelinek Committed by Jakub Jelinek

re PR target/84146 (ICE with -mcet in dwarf2out_var_location, involving sigsetjmp)

	PR target/84146
	* config/i386/i386.c (rest_of_insert_endbranch): Only skip
	NOTE_INSN_CALL_ARG_LOCATION after a call, not anything else,
	and skip it regardless of bb boundaries.  Use CALL_P macro,
	don't test INSN_P (insn) together with CALL_P or JUMP_P check
	unnecessarily, formatting fix.

	* gcc.target/i386/pr84146.c: New test.

From-SVN: r257431
parent 86f697aa
2018-02-06 Jakub Jelinek <jakub@redhat.com>
PR target/84146
* config/i386/i386.c (rest_of_insert_endbranch): Only skip
NOTE_INSN_CALL_ARG_LOCATION after a call, not anything else,
and skip it regardless of bb boundaries. Use CALL_P macro,
don't test INSN_P (insn) together with CALL_P or JUMP_P check
unnecessarily, formatting fix.
2018-02-06 Michael Collison <michael.collison@arm.com> 2018-02-06 Michael Collison <michael.collison@arm.com>
* config/arm/thumb2.md: * config/arm/thumb2.md:
......
...@@ -2612,31 +2612,27 @@ rest_of_insert_endbranch (void) ...@@ -2612,31 +2612,27 @@ rest_of_insert_endbranch (void)
for (insn = BB_HEAD (bb); insn != NEXT_INSN (BB_END (bb)); for (insn = BB_HEAD (bb); insn != NEXT_INSN (BB_END (bb));
insn = NEXT_INSN (insn)) insn = NEXT_INSN (insn))
{ {
if (INSN_P (insn) && GET_CODE (insn) == CALL_INSN) if (CALL_P (insn))
{ {
if (find_reg_note (insn, REG_SETJMP, NULL) == NULL) if (find_reg_note (insn, REG_SETJMP, NULL) == NULL)
continue; continue;
/* Generate ENDBRANCH after CALL, which can return more than /* Generate ENDBRANCH after CALL, which can return more than
twice, setjmp-like functions. */ twice, setjmp-like functions. */
/* Skip notes and debug insns that must be next to the /* Skip notes that must immediately follow the call insn. */
call insn. ??? This might skip a lot more than
that... ??? Skipping barriers and emitting code
after them surely looks like a mistake; we probably
won't ever hit it, for we'll hit BB_END first. */
rtx_insn *next_insn = insn; rtx_insn *next_insn = insn;
while ((next_insn != BB_END (bb)) if (NEXT_INSN (insn)
&& (DEBUG_INSN_P (NEXT_INSN (next_insn)) && NOTE_P (NEXT_INSN (insn))
|| NOTE_P (NEXT_INSN (next_insn)) && (NOTE_KIND (NEXT_INSN (insn))
|| BARRIER_P (NEXT_INSN (next_insn)))) == NOTE_INSN_CALL_ARG_LOCATION))
next_insn = NEXT_INSN (next_insn); next_insn = NEXT_INSN (insn);
cet_eb = gen_nop_endbr (); cet_eb = gen_nop_endbr ();
emit_insn_after_setloc (cet_eb, next_insn, INSN_LOCATION (insn)); emit_insn_after_setloc (cet_eb, next_insn, INSN_LOCATION (insn));
continue; continue;
} }
if (INSN_P (insn) && JUMP_P (insn) && flag_cet_switch) if (JUMP_P (insn) && flag_cet_switch)
{ {
rtx target = JUMP_LABEL (insn); rtx target = JUMP_LABEL (insn);
if (target == NULL_RTX || ANY_RETURN_P (target)) if (target == NULL_RTX || ANY_RETURN_P (target))
...@@ -2671,7 +2667,7 @@ rest_of_insert_endbranch (void) ...@@ -2671,7 +2667,7 @@ rest_of_insert_endbranch (void)
if ((LABEL_P (insn) && LABEL_PRESERVE_P (insn)) if ((LABEL_P (insn) && LABEL_PRESERVE_P (insn))
|| (NOTE_P (insn) || (NOTE_P (insn)
&& NOTE_KIND (insn) == NOTE_INSN_DELETED_LABEL)) && NOTE_KIND (insn) == NOTE_INSN_DELETED_LABEL))
/* TODO. Check /s bit also. */ /* TODO. Check /s bit also. */
{ {
cet_eb = gen_nop_endbr (); cet_eb = gen_nop_endbr ();
emit_insn_after (cet_eb, insn); emit_insn_after (cet_eb, insn);
2018-02-06 Jakub Jelinek <jakub@redhat.com>
PR target/84146
* gcc.target/i386/pr84146.c: New test.
2018-02-06 Michael Collison <michael.collison@arm.com> 2018-02-06 Michael Collison <michael.collison@arm.com>
* gcc.target/arm/pr7676.c: New testcase for incorrect splitting. * gcc.target/arm/pr7676.c: New testcase for incorrect splitting.
......
/* PR target/84146 */
/* { dg-do compile } */
/* { dg-options "-O2 -g -mcet -fcf-protection=full" } */
int __setjmp (void **);
void *buf[64];
void
foo (void)
{
__setjmp (buf);
for (;;)
;
}
Markdown is supported
0% or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment