2012-12-11 Jakub Jelinek <jakub@redhat.com>
+ PR middle-end/43631
+ PR bootstrap/55615
+ * var-tracking.c (emit_note_insn_var_location): If insn is followed
+ by BARRIER, put note after the BARRIER.
+ (next_non_note_insn_var_location): Skip over BARRIERs.
+ (emit_notes_in_bb): If call is followed by BARRIER, put note after
+ the BARRIER.
+
* sanitizer.def: Add comment about importance of ordering of
BUILT_IN_ASAN_REPORT* builtins.
* cfgcleanup.c (old_insns_match_p): Don't cross-jump __asan_report_*
--- /dev/null
+// PR middle-end/43631
+// { dg-do compile }
+// { dg-options "-g -O2" }
+// { dg-additional-options "-mtune=atom" { target i?86-*-* x86_64-*-* } }
+
+typedef void (*T) ();
+struct S { T t; };
+void bar (T) __attribute__ ((__noreturn__));
+S *p;
+
+void
+foo ()
+{
+ try { bar (p->t); } catch (...) { throw 1; }
+}
if (where != EMIT_NOTE_BEFORE_INSN)
{
- note = emit_note_after (NOTE_INSN_VAR_LOCATION, insn);
+ rtx after = insn;
+ while (NEXT_INSN (after) && BARRIER_P (NEXT_INSN (after)))
+ after = NEXT_INSN (after);
+ note = emit_note_after (NOTE_INSN_VAR_LOCATION, after);
if (where == EMIT_NOTE_AFTER_CALL_INSN)
NOTE_DURING_CALL_P (note) = true;
}
while (insn)
{
insn = NEXT_INSN (insn);
- if (insn == 0
- || !NOTE_P (insn)
- || NOTE_KIND (insn) != NOTE_INSN_VAR_LOCATION)
+ if (insn == 0)
+ break;
+ if (BARRIER_P (insn))
+ continue;
+ if (!NOTE_P (insn) || NOTE_KIND (insn) != NOTE_INSN_VAR_LOCATION)
break;
}
dataflow_set_clear_at_call (set);
emit_notes_for_changes (insn, EMIT_NOTE_AFTER_CALL_INSN, set->vars);
{
- rtx arguments = mo->u.loc, *p = &arguments, note;
+ rtx arguments = mo->u.loc, *p = &arguments, note, after;
while (*p)
{
XEXP (XEXP (*p, 0), 1)
else
*p = XEXP (*p, 1);
}
- note = emit_note_after (NOTE_INSN_CALL_ARG_LOCATION, insn);
+ after = insn;
+ while (NEXT_INSN (after) && BARRIER_P (NEXT_INSN (after)))
+ after = NEXT_INSN (after);
+ note = emit_note_after (NOTE_INSN_CALL_ARG_LOCATION, after);
NOTE_VAR_LOCATION (note) = arguments;
/* If insn is BB_END of some bb, make sure the note
doesn't have BLOCK_FOR_INSN set. The notes don't