mirror of
git://gcc.gnu.org/git/gcc.git
synced 2025-04-19 21:31:42 +08:00
re PR target/84146 (ICE with -mcet in dwarf2out_var_location, involving sigsetjmp)
PR target/84146 * reg-notes.def (REG_CALL_ARG_LOCATION): New reg note. * insn-notes.def (NOTE_INSN_CALL_ARG_LOCATION): Remove. * var-tracking.c (emit_note_insn_var_location): Remove all references to NOTE_INSN_CALL_ARG_LOCATION. (emit_notes_in_bb): Emit arguments as REG_CALL_ARG_LOCATION note on the CALL_INSN rather than separate NOTE_INSN_CALL_ARG_LOCATION note. Use copy_rtx_if_shared. * dwarf2out.c (gen_subprogram_die): Use XEXP with 0 instead of NOTE_VAR_LOCATION on ca_loc->call_arg_loc_note. (dwarf2out_var_location): Remove handling of NOTE_INSN_CALL_ARG_LOCATION, instead handle REG_CALL_ARG_LOCATION note on call_insn. * final.c (final_scan_insn): Remove all references to NOTE_INSN_CALL_ARG_LOCATION. (rest_of_clean_state): Likewise. Remove REG_CALL_ARG_LOCATION notes before dumping final insns. * except.c (emit_note_eh_region_end): Remove all references to NOTE_INSN_CALL_ARG_LOCATION. * config/alpha/alpha.c (alpha_pad_function_end): Likewise. * config/c6x/c6x.c (c6x_gen_bundles): Likewise. * config/arc/arc.c (hwloop_optimize): Likewise. * config/arm/arm.c (create_fix_barrier): Likewise. * config/s390/s390.c (s390_chunkify_start): Likewise. * config/sh/sh.c (find_barrier): Likewise. * config/i386/i386.c (rest_of_insert_endbranch, ix86_seh_fixup_eh_fallthru): Likewise. * config/xtensa/xtensa.c (hwloop_optimize): Likewise. * config/iq2000/iq2000.c (final_prescan_insn): Likewise. * config/frv/frv.c (frv_function_prologue): Likewise. * emit-rtl.c (try_split): Likewise. Copy over REG_CALL_ARG_LOCATION reg note. (note_outside_basic_block_p): Remove all references to NOTE_INSN_CALL_ARG_LOCATION. * gengtype.c (adjust_field_rtx_def): Likewise. * print-rtl.c (rtx_writer::print_rtx_operand_code_0, print_insn): Likewise. * jump.c (cleanup_barriers, delete_related_insns): Likewise. * cfgrtl.c (force_nonfallthru_and_redirect): Likewise. * gcc.target/i386/pr84146.c: Add -fcompare-debug to dg-options. From-SVN: r257826
This commit is contained in:
parent
97e2c91491
commit
00b9448735
@ -1,5 +1,45 @@
|
||||
2018-02-19 Jakub Jelinek <jakub@redhat.com>
|
||||
|
||||
PR target/84146
|
||||
* reg-notes.def (REG_CALL_ARG_LOCATION): New reg note.
|
||||
* insn-notes.def (NOTE_INSN_CALL_ARG_LOCATION): Remove.
|
||||
* var-tracking.c (emit_note_insn_var_location): Remove all references
|
||||
to NOTE_INSN_CALL_ARG_LOCATION.
|
||||
(emit_notes_in_bb): Emit arguments as REG_CALL_ARG_LOCATION note on
|
||||
the CALL_INSN rather than separate NOTE_INSN_CALL_ARG_LOCATION note.
|
||||
Use copy_rtx_if_shared.
|
||||
* dwarf2out.c (gen_subprogram_die): Use XEXP with 0 instead of
|
||||
NOTE_VAR_LOCATION on ca_loc->call_arg_loc_note.
|
||||
(dwarf2out_var_location): Remove handling of
|
||||
NOTE_INSN_CALL_ARG_LOCATION, instead handle REG_CALL_ARG_LOCATION note
|
||||
on call_insn.
|
||||
* final.c (final_scan_insn): Remove all references to
|
||||
NOTE_INSN_CALL_ARG_LOCATION.
|
||||
(rest_of_clean_state): Likewise. Remove REG_CALL_ARG_LOCATION notes
|
||||
before dumping final insns.
|
||||
* except.c (emit_note_eh_region_end): Remove all references to
|
||||
NOTE_INSN_CALL_ARG_LOCATION.
|
||||
* config/alpha/alpha.c (alpha_pad_function_end): Likewise.
|
||||
* config/c6x/c6x.c (c6x_gen_bundles): Likewise.
|
||||
* config/arc/arc.c (hwloop_optimize): Likewise.
|
||||
* config/arm/arm.c (create_fix_barrier): Likewise.
|
||||
* config/s390/s390.c (s390_chunkify_start): Likewise.
|
||||
* config/sh/sh.c (find_barrier): Likewise.
|
||||
* config/i386/i386.c (rest_of_insert_endbranch,
|
||||
ix86_seh_fixup_eh_fallthru): Likewise.
|
||||
* config/xtensa/xtensa.c (hwloop_optimize): Likewise.
|
||||
* config/iq2000/iq2000.c (final_prescan_insn): Likewise.
|
||||
* config/frv/frv.c (frv_function_prologue): Likewise.
|
||||
* emit-rtl.c (try_split): Likewise. Copy over REG_CALL_ARG_LOCATION
|
||||
reg note.
|
||||
(note_outside_basic_block_p): Remove all references to
|
||||
NOTE_INSN_CALL_ARG_LOCATION.
|
||||
* gengtype.c (adjust_field_rtx_def): Likewise.
|
||||
* print-rtl.c (rtx_writer::print_rtx_operand_code_0, print_insn):
|
||||
Likewise.
|
||||
* jump.c (cleanup_barriers, delete_related_insns): Likewise.
|
||||
* cfgrtl.c (force_nonfallthru_and_redirect): Likewise.
|
||||
|
||||
PR c++/84444
|
||||
* builtins.c (builtin_mathfn_code): Don't check if CALL_EXPR_FN (t)
|
||||
is ADDR_EXPR.
|
||||
|
@ -1628,11 +1628,6 @@ force_nonfallthru_and_redirect (edge e, basic_block target, rtx jump_label)
|
||||
else
|
||||
new_head = BB_END (e->src);
|
||||
new_head = NEXT_INSN (new_head);
|
||||
/* Make sure we don't split a call and its corresponding
|
||||
CALL_ARG_LOCATION note. */
|
||||
if (new_head && NOTE_P (new_head)
|
||||
&& NOTE_KIND (new_head) == NOTE_INSN_CALL_ARG_LOCATION)
|
||||
new_head = NEXT_INSN (new_head);
|
||||
|
||||
jump_block = create_basic_block (new_head, NULL, e->src);
|
||||
jump_block->count = count;
|
||||
|
@ -9406,14 +9406,6 @@ alpha_pad_function_end (void)
|
||||
|| find_reg_note (insn, REG_NORETURN, NULL_RTX)))
|
||||
continue;
|
||||
|
||||
/* Make sure we do not split a call and its corresponding
|
||||
CALL_ARG_LOCATION note. */
|
||||
next = NEXT_INSN (insn);
|
||||
if (next == NULL)
|
||||
continue;
|
||||
if (NOTE_P (next) && NOTE_KIND (next) == NOTE_INSN_CALL_ARG_LOCATION)
|
||||
insn = next;
|
||||
|
||||
next = next_active_insn (insn);
|
||||
if (next)
|
||||
{
|
||||
|
@ -7700,10 +7700,7 @@ hwloop_optimize (hwloop_info loop)
|
||||
#if 0
|
||||
while (DEBUG_INSN_P (entry_after)
|
||||
|| (NOTE_P (entry_after)
|
||||
&& NOTE_KIND (entry_after) != NOTE_INSN_BASIC_BLOCK
|
||||
/* Make sure we don't split a call and its corresponding
|
||||
CALL_ARG_LOCATION note. */
|
||||
&& NOTE_KIND (entry_after) != NOTE_INSN_CALL_ARG_LOCATION))
|
||||
&& NOTE_KIND (entry_after) != NOTE_INSN_BASIC_BLOCK))
|
||||
entry_after = NEXT_INSN (entry_after);
|
||||
#endif
|
||||
entry_after = next_nonnote_nondebug_insn_bb (entry_after);
|
||||
|
@ -16556,16 +16556,6 @@ create_fix_barrier (Mfix *fix, HOST_WIDE_INT max_address)
|
||||
/* Make sure that we found a place to insert the jump. */
|
||||
gcc_assert (selected);
|
||||
|
||||
/* Make sure we do not split a call and its corresponding
|
||||
CALL_ARG_LOCATION note. */
|
||||
if (CALL_P (selected))
|
||||
{
|
||||
rtx_insn *next = NEXT_INSN (selected);
|
||||
if (next && NOTE_P (next)
|
||||
&& NOTE_KIND (next) == NOTE_INSN_CALL_ARG_LOCATION)
|
||||
selected = next;
|
||||
}
|
||||
|
||||
/* Create a new JUMP_INSN that branches around a barrier. */
|
||||
from = emit_jump_insn_after (gen_jump (label), selected);
|
||||
JUMP_LABEL (from) = label;
|
||||
|
@ -4637,7 +4637,6 @@ static void
|
||||
c6x_gen_bundles (void)
|
||||
{
|
||||
basic_block bb;
|
||||
rtx_insn *insn, *next, *last_call;
|
||||
|
||||
FOR_EACH_BB_FN (bb, cfun)
|
||||
{
|
||||
@ -4704,29 +4703,6 @@ c6x_gen_bundles (void)
|
||||
break;
|
||||
}
|
||||
}
|
||||
/* Bundling, and emitting nops, can separate
|
||||
NOTE_INSN_CALL_ARG_LOCATION from the corresponding calls. Fix
|
||||
that up here. */
|
||||
last_call = NULL;
|
||||
for (insn = get_insns (); insn; insn = next)
|
||||
{
|
||||
next = NEXT_INSN (insn);
|
||||
if (CALL_P (insn)
|
||||
|| (INSN_P (insn) && GET_CODE (PATTERN (insn)) == SEQUENCE
|
||||
&& CALL_P (XVECEXP (PATTERN (insn), 0, 0))))
|
||||
last_call = insn;
|
||||
if (!NOTE_P (insn) || NOTE_KIND (insn) != NOTE_INSN_CALL_ARG_LOCATION)
|
||||
continue;
|
||||
if (NEXT_INSN (last_call) == insn)
|
||||
continue;
|
||||
SET_NEXT_INSN (PREV_INSN (insn)) = NEXT_INSN (insn);
|
||||
SET_PREV_INSN (NEXT_INSN (insn)) = PREV_INSN (insn);
|
||||
SET_PREV_INSN (insn) = last_call;
|
||||
SET_NEXT_INSN (insn) = NEXT_INSN (last_call);
|
||||
SET_PREV_INSN (NEXT_INSN (insn)) = insn;
|
||||
SET_NEXT_INSN (PREV_INSN (insn)) = insn;
|
||||
last_call = insn;
|
||||
}
|
||||
}
|
||||
|
||||
/* Emit a NOP instruction for CYCLES cycles after insn AFTER. Return it. */
|
||||
|
@ -1415,8 +1415,6 @@ frv_function_contains_far_jump (void)
|
||||
static void
|
||||
frv_function_prologue (FILE *file)
|
||||
{
|
||||
rtx_insn *insn, *next, *last_call;
|
||||
|
||||
/* If no frame was created, check whether the function uses a call
|
||||
instruction to implement a far jump. If so, save the link in gr3 and
|
||||
replace all returns to LR with returns to GR3. GR3 is used because it
|
||||
@ -1457,32 +1455,6 @@ frv_function_prologue (FILE *file)
|
||||
|
||||
/* Allow the garbage collector to free the nops created by frv_reorg. */
|
||||
memset (frv_nops, 0, sizeof (frv_nops));
|
||||
|
||||
/* Locate CALL_ARG_LOCATION notes that have been misplaced
|
||||
and move them back to where they should be located. */
|
||||
last_call = NULL;
|
||||
for (insn = get_insns (); insn; insn = next)
|
||||
{
|
||||
next = NEXT_INSN (insn);
|
||||
if (CALL_P (insn)
|
||||
|| (INSN_P (insn) && GET_CODE (PATTERN (insn)) == SEQUENCE
|
||||
&& CALL_P (XVECEXP (PATTERN (insn), 0, 0))))
|
||||
last_call = insn;
|
||||
|
||||
if (!NOTE_P (insn) || NOTE_KIND (insn) != NOTE_INSN_CALL_ARG_LOCATION)
|
||||
continue;
|
||||
|
||||
if (NEXT_INSN (last_call) == insn)
|
||||
continue;
|
||||
|
||||
SET_NEXT_INSN (PREV_INSN (insn)) = NEXT_INSN (insn);
|
||||
SET_PREV_INSN (NEXT_INSN (insn)) = PREV_INSN (insn);
|
||||
SET_PREV_INSN (insn) = last_call;
|
||||
SET_NEXT_INSN (insn) = NEXT_INSN (last_call);
|
||||
SET_PREV_INSN (NEXT_INSN (insn)) = insn;
|
||||
SET_NEXT_INSN (PREV_INSN (insn)) = insn;
|
||||
last_call = insn;
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
|
@ -2619,16 +2619,8 @@ rest_of_insert_endbranch (void)
|
||||
/* Generate ENDBRANCH after CALL, which can return more than
|
||||
twice, setjmp-like functions. */
|
||||
|
||||
/* Skip notes that must immediately follow the call insn. */
|
||||
rtx_insn *next_insn = insn;
|
||||
if (NEXT_INSN (insn)
|
||||
&& NOTE_P (NEXT_INSN (insn))
|
||||
&& (NOTE_KIND (NEXT_INSN (insn))
|
||||
== NOTE_INSN_CALL_ARG_LOCATION))
|
||||
next_insn = NEXT_INSN (insn);
|
||||
|
||||
cet_eb = gen_nop_endbr ();
|
||||
emit_insn_after_setloc (cet_eb, next_insn, INSN_LOCATION (insn));
|
||||
emit_insn_after_setloc (cet_eb, insn, INSN_LOCATION (insn));
|
||||
continue;
|
||||
}
|
||||
|
||||
@ -42128,9 +42120,7 @@ ix86_seh_fixup_eh_fallthru (void)
|
||||
|
||||
/* Do not separate calls from their debug information. */
|
||||
for (next = NEXT_INSN (insn); next != NULL; next = NEXT_INSN (next))
|
||||
if (NOTE_P (next)
|
||||
&& (NOTE_KIND (next) == NOTE_INSN_VAR_LOCATION
|
||||
|| NOTE_KIND (next) == NOTE_INSN_CALL_ARG_LOCATION))
|
||||
if (NOTE_P (next) && NOTE_KIND (next) == NOTE_INSN_VAR_LOCATION)
|
||||
insn = next;
|
||||
else
|
||||
break;
|
||||
|
@ -1578,13 +1578,7 @@ final_prescan_insn (rtx_insn *insn, rtx opvec[] ATTRIBUTE_UNUSED,
|
||||
|| (GET_CODE (PATTERN (insn)) == RETURN))
|
||||
&& NEXT_INSN (PREV_INSN (insn)) == insn)
|
||||
{
|
||||
rtx_insn *tmp = insn;
|
||||
while (NEXT_INSN (tmp)
|
||||
&& NOTE_P (NEXT_INSN (tmp))
|
||||
&& NOTE_KIND (NEXT_INSN (tmp)) == NOTE_INSN_CALL_ARG_LOCATION)
|
||||
tmp = NEXT_INSN (tmp);
|
||||
|
||||
rtx_insn *nop_insn = emit_insn_after (gen_nop (), tmp);
|
||||
rtx_insn *nop_insn = emit_insn_after (gen_nop (), insn);
|
||||
INSN_ADDRESSES_NEW (nop_insn, -1);
|
||||
}
|
||||
|
||||
|
@ -9259,7 +9259,6 @@ s390_chunkify_start (void)
|
||||
section_switch_p = true;
|
||||
break;
|
||||
case NOTE_INSN_VAR_LOCATION:
|
||||
case NOTE_INSN_CALL_ARG_LOCATION:
|
||||
continue;
|
||||
default:
|
||||
break;
|
||||
@ -9330,8 +9329,7 @@ s390_chunkify_start (void)
|
||||
}
|
||||
while (next
|
||||
&& NOTE_P (next)
|
||||
&& (NOTE_KIND (next) == NOTE_INSN_VAR_LOCATION
|
||||
|| NOTE_KIND (next) == NOTE_INSN_CALL_ARG_LOCATION));
|
||||
&& NOTE_KIND (next) == NOTE_INSN_VAR_LOCATION);
|
||||
}
|
||||
else
|
||||
{
|
||||
|
@ -5225,21 +5225,13 @@ find_barrier (int num_mova, rtx_insn *mova, rtx_insn *from)
|
||||
around the constant pool table will be hit. Putting it before
|
||||
a jump makes it more likely that the bra delay slot will be
|
||||
filled. */
|
||||
while (NOTE_P (from) || JUMP_P (from)
|
||||
|| LABEL_P (from))
|
||||
while (NOTE_P (from) || JUMP_P (from) || LABEL_P (from))
|
||||
from = PREV_INSN (from);
|
||||
|
||||
/* Make sure we do not split between a call and its corresponding
|
||||
CALL_ARG_LOCATION note. */
|
||||
if (CALL_P (from))
|
||||
{
|
||||
bool sibcall_p = SIBLING_CALL_P (from);
|
||||
|
||||
rtx_insn *next = NEXT_INSN (from);
|
||||
if (next && NOTE_P (next)
|
||||
&& NOTE_KIND (next) == NOTE_INSN_CALL_ARG_LOCATION)
|
||||
from = next;
|
||||
|
||||
/* If FROM was a sibling call, then we know that control
|
||||
will not return. In fact, we were guaranteed to hit
|
||||
a barrier before another real insn.
|
||||
|
@ -4255,10 +4255,7 @@ hwloop_optimize (hwloop_info loop)
|
||||
entry_after = BB_END (entry_bb);
|
||||
while (DEBUG_INSN_P (entry_after)
|
||||
|| (NOTE_P (entry_after)
|
||||
&& NOTE_KIND (entry_after) != NOTE_INSN_BASIC_BLOCK
|
||||
/* Make sure we don't split a call and its corresponding
|
||||
CALL_ARG_LOCATION note. */
|
||||
&& NOTE_KIND (entry_after) != NOTE_INSN_CALL_ARG_LOCATION))
|
||||
&& NOTE_KIND (entry_after) != NOTE_INSN_BASIC_BLOCK))
|
||||
entry_after = PREV_INSN (entry_after);
|
||||
|
||||
emit_insn_after (seq, entry_after);
|
||||
|
@ -23110,7 +23110,7 @@ gen_subprogram_die (tree decl, dw_die_ref context_die)
|
||||
rtx arg, next_arg;
|
||||
|
||||
for (arg = (ca_loc->call_arg_loc_note != NULL_RTX
|
||||
? NOTE_VAR_LOCATION (ca_loc->call_arg_loc_note)
|
||||
? XEXP (ca_loc->call_arg_loc_note, 0)
|
||||
: NULL_RTX);
|
||||
arg; arg = next_arg)
|
||||
{
|
||||
@ -26975,6 +26975,17 @@ dwarf2out_var_location (rtx_insn *loc_note)
|
||||
call_site_count++;
|
||||
if (SIBLING_CALL_P (loc_note))
|
||||
tail_call_site_count++;
|
||||
if (find_reg_note (loc_note, REG_CALL_ARG_LOCATION, NULL_RTX))
|
||||
{
|
||||
call_insn = loc_note;
|
||||
loc_note = NULL;
|
||||
var_loc_p = false;
|
||||
|
||||
next_real = dwarf2out_next_real_insn (call_insn);
|
||||
next_note = NULL;
|
||||
cached_next_real_insn = NULL;
|
||||
goto create_label;
|
||||
}
|
||||
if (optimize == 0 && !flag_var_tracking)
|
||||
{
|
||||
/* When the var-tracking pass is not running, there is no note
|
||||
@ -27034,8 +27045,7 @@ dwarf2out_var_location (rtx_insn *loc_note)
|
||||
|| ! NOTE_P (next_note)
|
||||
|| (NOTE_KIND (next_note) != NOTE_INSN_VAR_LOCATION
|
||||
&& NOTE_KIND (next_note) != NOTE_INSN_BEGIN_STMT
|
||||
&& NOTE_KIND (next_note) != NOTE_INSN_INLINE_ENTRY
|
||||
&& NOTE_KIND (next_note) != NOTE_INSN_CALL_ARG_LOCATION))
|
||||
&& NOTE_KIND (next_note) != NOTE_INSN_INLINE_ENTRY))
|
||||
next_note = NULL;
|
||||
|
||||
if (! next_real)
|
||||
@ -27145,10 +27155,10 @@ create_label:
|
||||
{
|
||||
struct call_arg_loc_node *ca_loc
|
||||
= ggc_cleared_alloc<call_arg_loc_node> ();
|
||||
rtx_insn *prev
|
||||
= loc_note != NULL_RTX ? prev_real_insn (loc_note) : call_insn;
|
||||
rtx_insn *prev = call_insn;
|
||||
|
||||
ca_loc->call_arg_loc_note = loc_note;
|
||||
ca_loc->call_arg_loc_note
|
||||
= find_reg_note (call_insn, REG_CALL_ARG_LOCATION, NULL_RTX);
|
||||
ca_loc->next = NULL;
|
||||
ca_loc->label = last_label;
|
||||
gcc_assert (prev
|
||||
|
@ -3866,15 +3866,12 @@ try_split (rtx pat, rtx_insn *trial, int last)
|
||||
for (insn = insn_last; insn ; insn = PREV_INSN (insn))
|
||||
if (CALL_P (insn))
|
||||
{
|
||||
rtx_insn *next;
|
||||
rtx *p;
|
||||
|
||||
gcc_assert (call_insn == NULL_RTX);
|
||||
call_insn = insn;
|
||||
|
||||
/* Add the old CALL_INSN_FUNCTION_USAGE to whatever the
|
||||
target may have explicitly specified. */
|
||||
p = &CALL_INSN_FUNCTION_USAGE (insn);
|
||||
rtx *p = &CALL_INSN_FUNCTION_USAGE (insn);
|
||||
while (*p)
|
||||
p = &XEXP (*p, 1);
|
||||
*p = CALL_INSN_FUNCTION_USAGE (trial);
|
||||
@ -3882,21 +3879,6 @@ try_split (rtx pat, rtx_insn *trial, int last)
|
||||
/* If the old call was a sibling call, the new one must
|
||||
be too. */
|
||||
SIBLING_CALL_P (insn) = SIBLING_CALL_P (trial);
|
||||
|
||||
/* If the new call is the last instruction in the sequence,
|
||||
it will effectively replace the old call in-situ. Otherwise
|
||||
we must move any following NOTE_INSN_CALL_ARG_LOCATION note
|
||||
so that it comes immediately after the new call. */
|
||||
if (NEXT_INSN (insn))
|
||||
for (next = NEXT_INSN (trial);
|
||||
next && NOTE_P (next);
|
||||
next = NEXT_INSN (next))
|
||||
if (NOTE_KIND (next) == NOTE_INSN_CALL_ARG_LOCATION)
|
||||
{
|
||||
remove_insn (next);
|
||||
add_insn_after (next, insn, NULL);
|
||||
break;
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
@ -3913,6 +3895,7 @@ try_split (rtx pat, rtx_insn *trial, int last)
|
||||
case REG_SETJMP:
|
||||
case REG_TM:
|
||||
case REG_CALL_NOCF_CHECK:
|
||||
case REG_CALL_ARG_LOCATION:
|
||||
for (insn = insn_last; insn != NULL_RTX; insn = PREV_INSN (insn))
|
||||
{
|
||||
if (CALL_P (insn))
|
||||
@ -4777,7 +4760,6 @@ note_outside_basic_block_p (enum insn_note subtype, bool on_bb_boundary_p)
|
||||
inside basic blocks. If the caller is emitting on the basic block
|
||||
boundary, do not set BLOCK_FOR_INSN on the new note. */
|
||||
case NOTE_INSN_VAR_LOCATION:
|
||||
case NOTE_INSN_CALL_ARG_LOCATION:
|
||||
case NOTE_INSN_EH_REGION_BEG:
|
||||
case NOTE_INSN_EH_REGION_END:
|
||||
return on_bb_boundary_p;
|
||||
|
@ -2465,14 +2465,6 @@ add_call_site (rtx landing_pad, int action, int section)
|
||||
static rtx_note *
|
||||
emit_note_eh_region_end (rtx_insn *insn)
|
||||
{
|
||||
rtx_insn *next = NEXT_INSN (insn);
|
||||
|
||||
/* Make sure we do not split a call and its corresponding
|
||||
CALL_ARG_LOCATION note. */
|
||||
if (next && NOTE_P (next)
|
||||
&& NOTE_KIND (next) == NOTE_INSN_CALL_ARG_LOCATION)
|
||||
insn = next;
|
||||
|
||||
return emit_note_after (NOTE_INSN_EH_REGION_END, insn);
|
||||
}
|
||||
|
||||
|
23
gcc/final.c
23
gcc/final.c
@ -2467,7 +2467,6 @@ final_scan_insn_1 (rtx_insn *insn, FILE *file, int optimize_p ATTRIBUTE_UNUSED,
|
||||
break;
|
||||
|
||||
case NOTE_INSN_VAR_LOCATION:
|
||||
case NOTE_INSN_CALL_ARG_LOCATION:
|
||||
if (!DECL_IGNORED_P (current_function_decl))
|
||||
{
|
||||
debug_hooks->var_location (insn);
|
||||
@ -4846,15 +4845,21 @@ rest_of_clean_state (void)
|
||||
SET_NEXT_INSN (insn) = NULL;
|
||||
SET_PREV_INSN (insn) = NULL;
|
||||
|
||||
if (CALL_P (insn))
|
||||
{
|
||||
rtx note = find_reg_note (insn, REG_CALL_ARG_LOCATION, NULL_RTX);
|
||||
if (note)
|
||||
remove_note (insn, note);
|
||||
}
|
||||
|
||||
if (final_output
|
||||
&& (!NOTE_P (insn) ||
|
||||
(NOTE_KIND (insn) != NOTE_INSN_VAR_LOCATION
|
||||
&& NOTE_KIND (insn) != NOTE_INSN_BEGIN_STMT
|
||||
&& NOTE_KIND (insn) != NOTE_INSN_INLINE_ENTRY
|
||||
&& NOTE_KIND (insn) != NOTE_INSN_CALL_ARG_LOCATION
|
||||
&& NOTE_KIND (insn) != NOTE_INSN_BLOCK_BEG
|
||||
&& NOTE_KIND (insn) != NOTE_INSN_BLOCK_END
|
||||
&& NOTE_KIND (insn) != NOTE_INSN_DELETED_DEBUG_LABEL)))
|
||||
&& (!NOTE_P (insn)
|
||||
|| (NOTE_KIND (insn) != NOTE_INSN_VAR_LOCATION
|
||||
&& NOTE_KIND (insn) != NOTE_INSN_BEGIN_STMT
|
||||
&& NOTE_KIND (insn) != NOTE_INSN_INLINE_ENTRY
|
||||
&& NOTE_KIND (insn) != NOTE_INSN_BLOCK_BEG
|
||||
&& NOTE_KIND (insn) != NOTE_INSN_BLOCK_END
|
||||
&& NOTE_KIND (insn) != NOTE_INSN_DELETED_DEBUG_LABEL)))
|
||||
print_rtl_single (final_output, insn);
|
||||
}
|
||||
|
||||
|
@ -1187,7 +1187,6 @@ adjust_field_rtx_def (type_p t, options_p ARG_UNUSED (opt))
|
||||
break;
|
||||
|
||||
case NOTE_INSN_VAR_LOCATION:
|
||||
case NOTE_INSN_CALL_ARG_LOCATION:
|
||||
note_flds = create_field (note_flds, rtx_tp, "rt_rtx");
|
||||
break;
|
||||
|
||||
|
@ -65,9 +65,6 @@ INSN_NOTE (EH_REGION_END)
|
||||
/* The location of a variable. */
|
||||
INSN_NOTE (VAR_LOCATION)
|
||||
|
||||
/* The values passed to callee. */
|
||||
INSN_NOTE (CALL_ARG_LOCATION)
|
||||
|
||||
/* The beginning of a statement. */
|
||||
INSN_NOTE (BEGIN_STMT)
|
||||
|
||||
|
31
gcc/jump.c
31
gcc/jump.c
@ -127,17 +127,6 @@ cleanup_barriers (void)
|
||||
if (!prev)
|
||||
continue;
|
||||
|
||||
if (CALL_P (prev))
|
||||
{
|
||||
/* Make sure we do not split a call and its corresponding
|
||||
CALL_ARG_LOCATION note. */
|
||||
rtx_insn *next = NEXT_INSN (prev);
|
||||
|
||||
if (NOTE_P (next)
|
||||
&& NOTE_KIND (next) == NOTE_INSN_CALL_ARG_LOCATION)
|
||||
prev = next;
|
||||
}
|
||||
|
||||
if (BARRIER_P (prev))
|
||||
delete_insn (insn);
|
||||
else if (prev != PREV_INSN (insn))
|
||||
@ -1279,26 +1268,6 @@ delete_related_insns (rtx uncast_insn)
|
||||
if (next != 0 && BARRIER_P (next))
|
||||
delete_insn (next);
|
||||
|
||||
/* If this is a call, then we have to remove the var tracking note
|
||||
for the call arguments. */
|
||||
|
||||
if (CALL_P (insn)
|
||||
|| (NONJUMP_INSN_P (insn)
|
||||
&& GET_CODE (PATTERN (insn)) == SEQUENCE
|
||||
&& CALL_P (XVECEXP (PATTERN (insn), 0, 0))))
|
||||
{
|
||||
rtx_insn *p;
|
||||
|
||||
for (p = next && next->deleted () ? NEXT_INSN (next) : next;
|
||||
p && NOTE_P (p);
|
||||
p = NEXT_INSN (p))
|
||||
if (NOTE_KIND (p) == NOTE_INSN_CALL_ARG_LOCATION)
|
||||
{
|
||||
remove_insn (p);
|
||||
break;
|
||||
}
|
||||
}
|
||||
|
||||
/* If deleting a jump, decrement the count of the label,
|
||||
and delete the label if it is now unused. */
|
||||
|
||||
|
@ -264,7 +264,6 @@ rtx_writer::print_rtx_operand_code_0 (const_rtx in_rtx ATTRIBUTE_UNUSED,
|
||||
}
|
||||
|
||||
case NOTE_INSN_VAR_LOCATION:
|
||||
case NOTE_INSN_CALL_ARG_LOCATION:
|
||||
fputc (' ', m_outfile);
|
||||
print_rtx (NOTE_VAR_LOCATION (in_rtx));
|
||||
break;
|
||||
@ -1970,7 +1969,6 @@ print_insn (pretty_printer *pp, const rtx_insn *x, int verbose)
|
||||
break;
|
||||
|
||||
case NOTE_INSN_VAR_LOCATION:
|
||||
case NOTE_INSN_CALL_ARG_LOCATION:
|
||||
pp_left_brace (pp);
|
||||
print_pattern (pp, NOTE_VAR_LOCATION (x), verbose);
|
||||
pp_right_brace (pp);
|
||||
|
@ -239,3 +239,6 @@ REG_NOTE (CALL_DECL)
|
||||
when a called function has a 'notrack' attribute. This note is used by the
|
||||
compiler when the option -fcf-protection=branch is specified. */
|
||||
REG_NOTE (CALL_NOCF_CHECK)
|
||||
|
||||
/* The values passed to callee, for debuginfo purposes. */
|
||||
REG_NOTE (CALL_ARG_LOCATION)
|
||||
|
@ -1,3 +1,8 @@
|
||||
2018-02-19 Jakub Jelinek <jakub@redhat.com>
|
||||
|
||||
PR target/84146
|
||||
* gcc.target/i386/pr84146.c: Add -fcompare-debug to dg-options.
|
||||
|
||||
2017-02-19 Uros Bizjak <ubizjak@gmail.com>
|
||||
|
||||
* gcc.target/i386/pr70023.c (dg-do): Compile only for target int128.
|
||||
|
@ -1,6 +1,6 @@
|
||||
/* PR target/84146 */
|
||||
/* { dg-do compile } */
|
||||
/* { dg-options "-O2 -g -mcet -fcf-protection=full" } */
|
||||
/* { dg-options "-O2 -g -mcet -fcf-protection=full -fcompare-debug" } */
|
||||
|
||||
int __setjmp (void **);
|
||||
void *buf[64];
|
||||
|
@ -8860,14 +8860,12 @@ emit_note_insn_var_location (variable **varp, emit_note_data *data)
|
||||
/* Make sure that the call related notes come first. */
|
||||
while (NEXT_INSN (insn)
|
||||
&& NOTE_P (insn)
|
||||
&& ((NOTE_KIND (insn) == NOTE_INSN_VAR_LOCATION
|
||||
&& NOTE_DURING_CALL_P (insn))
|
||||
|| NOTE_KIND (insn) == NOTE_INSN_CALL_ARG_LOCATION))
|
||||
&& NOTE_KIND (insn) == NOTE_INSN_VAR_LOCATION
|
||||
&& NOTE_DURING_CALL_P (insn))
|
||||
insn = NEXT_INSN (insn);
|
||||
if (NOTE_P (insn)
|
||||
&& ((NOTE_KIND (insn) == NOTE_INSN_VAR_LOCATION
|
||||
&& NOTE_DURING_CALL_P (insn))
|
||||
|| NOTE_KIND (insn) == NOTE_INSN_CALL_ARG_LOCATION))
|
||||
&& NOTE_KIND (insn) == NOTE_INSN_VAR_LOCATION
|
||||
&& NOTE_DURING_CALL_P (insn))
|
||||
note = emit_note_after (NOTE_INSN_VAR_LOCATION, insn);
|
||||
else
|
||||
note = emit_note_before (NOTE_INSN_VAR_LOCATION, insn);
|
||||
@ -9210,7 +9208,6 @@ emit_notes_in_bb (basic_block bb, dataflow_set *set)
|
||||
emit_notes_for_changes (insn, EMIT_NOTE_AFTER_CALL_INSN, set->vars);
|
||||
{
|
||||
rtx arguments = mo->u.loc, *p = &arguments;
|
||||
rtx_note *note;
|
||||
while (*p)
|
||||
{
|
||||
XEXP (XEXP (*p, 0), 1)
|
||||
@ -9218,7 +9215,11 @@ emit_notes_in_bb (basic_block bb, dataflow_set *set)
|
||||
shared_hash_htab (set->vars));
|
||||
/* If expansion is successful, keep it in the list. */
|
||||
if (XEXP (XEXP (*p, 0), 1))
|
||||
p = &XEXP (*p, 1);
|
||||
{
|
||||
XEXP (XEXP (*p, 0), 1)
|
||||
= copy_rtx_if_shared (XEXP (XEXP (*p, 0), 1));
|
||||
p = &XEXP (*p, 1);
|
||||
}
|
||||
/* Otherwise, if the following item is data_value for it,
|
||||
drop it too too. */
|
||||
else if (XEXP (*p, 1)
|
||||
@ -9234,8 +9235,7 @@ emit_notes_in_bb (basic_block bb, dataflow_set *set)
|
||||
else
|
||||
*p = XEXP (*p, 1);
|
||||
}
|
||||
note = emit_note_after (NOTE_INSN_CALL_ARG_LOCATION, insn);
|
||||
NOTE_VAR_LOCATION (note) = arguments;
|
||||
add_reg_note (insn, REG_CALL_ARG_LOCATION, arguments);
|
||||
}
|
||||
break;
|
||||
|
||||
|
Loading…
x
Reference in New Issue
Block a user