From e094c0bfe982c21cd39741efde87591b59af8a55 Mon Sep 17 00:00:00 2001 From: Alexandre Oliva Date: Sun, 11 Feb 2018 15:26:11 +0000 Subject: [LVU] deal with md final_scan_insn Ports call final_scan_insn with seen == NULL, and then maybe_output_next_view crashes because it assumes it's non-NULL. Oops. Fixed. for gcc/ChangeLog * final.c (final_scan_insn_1): Renamed from... (final_scan_insn): ... this. New wrapper, to recover seen from the outermost call in recursive ones. * config/sparc/sparc.c (output_return): Drop seen from call. (output_sibcall): Likewise. * config/visium/visium.c (output_branch): Likewise. From-SVN: r257562 --- gcc/ChangeLog | 9 +++++++++ gcc/config/sparc/sparc.c | 6 ++---- gcc/config/visium/visium.c | 3 +-- gcc/final.c | 36 +++++++++++++++++++++++++++++++++--- 4 files changed, 45 insertions(+), 9 deletions(-) (limited to 'gcc') diff --git a/gcc/ChangeLog b/gcc/ChangeLog index 677c316..fc842d9 100644 --- a/gcc/ChangeLog +++ b/gcc/ChangeLog @@ -1,3 +1,12 @@ +2018-02-11 Alexandre Oliva + + * final.c (final_scan_insn_1): Renamed from... + (final_scan_insn): ... this. New wrapper, to recover + seen from the outermost call in recursive ones. + * config/sparc/sparc.c (output_return): Drop seen from call. + (output_sibcall): Likewise. + * config/visium/visium.c (output_branch): Likewise. + 2018-02-10 John David Anglin * config/pa/pa.c (hppa_profile_hook): Mark SYMBOL_REF for _mcount as diff --git a/gcc/config/sparc/sparc.c b/gcc/config/sparc/sparc.c index 48669f1..7126b57 100644 --- a/gcc/config/sparc/sparc.c +++ b/gcc/config/sparc/sparc.c @@ -6422,7 +6422,6 @@ output_return (rtx_insn *insn) { rtx_insn *delay; rtx pat; - int seen; delay = NEXT_INSN (insn); gcc_assert (delay); @@ -6442,7 +6441,7 @@ output_return (rtx_insn *insn) Make sure to output its source location first. */ PATTERN (delay) = gen_blockage (); INSN_CODE (delay) = -1; - final_scan_insn (delay, asm_out_file, optimize, 0, &seen); + final_scan_insn (delay, asm_out_file, optimize, 0, NULL); INSN_LOCATION (delay) = UNKNOWN_LOCATION; output_restore (pat); @@ -6503,7 +6502,6 @@ output_sibcall (rtx_insn *insn, rtx call_operand) { rtx_insn *delay; rtx pat; - int seen; delay = NEXT_INSN (insn); gcc_assert (delay); @@ -6514,7 +6512,7 @@ output_sibcall (rtx_insn *insn, rtx call_operand) Make sure to output its source location first. */ PATTERN (delay) = gen_blockage (); INSN_CODE (delay) = -1; - final_scan_insn (delay, asm_out_file, optimize, 0, &seen); + final_scan_insn (delay, asm_out_file, optimize, 0, NULL); INSN_LOCATION (delay) = UNKNOWN_LOCATION; output_restore (pat); diff --git a/gcc/config/visium/visium.c b/gcc/config/visium/visium.c index 8751156..106cdaf 100644 --- a/gcc/config/visium/visium.c +++ b/gcc/config/visium/visium.c @@ -3094,10 +3094,9 @@ output_branch (rtx label, const char *cond, rtx_insn *insn) if (final_sequence) { rtx_insn *delay = NEXT_INSN (insn); - int seen; gcc_assert (delay); - final_scan_insn (delay, asm_out_file, optimize, 0, &seen); + final_scan_insn (delay, asm_out_file, optimize, 0, NULL); PATTERN (delay) = gen_blockage (); INSN_CODE (delay) = -1; } diff --git a/gcc/final.c b/gcc/final.c index 99a7cad..cbebbfd 100644 --- a/gcc/final.c +++ b/gcc/final.c @@ -2236,9 +2236,9 @@ asm_show_source (const char *filename, int linenum) debug information. We force the emission of a line note after both NOTE_INSN_PROLOGUE_END and NOTE_INSN_FUNCTION_BEG. */ -rtx_insn * -final_scan_insn (rtx_insn *insn, FILE *file, int optimize_p ATTRIBUTE_UNUSED, - int nopeepholes ATTRIBUTE_UNUSED, int *seen) +static rtx_insn * +final_scan_insn_1 (rtx_insn *insn, FILE *file, int optimize_p ATTRIBUTE_UNUSED, + int nopeepholes ATTRIBUTE_UNUSED, int *seen) { #if HAVE_cc0 rtx set; @@ -3189,6 +3189,36 @@ final_scan_insn (rtx_insn *insn, FILE *file, int optimize_p ATTRIBUTE_UNUSED, } return NEXT_INSN (insn); } + +/* This is a wrapper around final_scan_insn_1 that allows ports to + call it recursively without a known value for SEEN. The value is + saved at the outermost call, and recovered for recursive calls. + Recursive calls MUST pass NULL, or the same pointer if they can + otherwise get to it. */ + +rtx_insn * +final_scan_insn (rtx_insn *insn, FILE *file, int optimize_p, + int nopeepholes, int *seen) +{ + static int *enclosing_seen; + static int recursion_counter; + + gcc_assert (seen || recursion_counter); + gcc_assert (!recursion_counter || !seen || seen == enclosing_seen); + + if (!recursion_counter++) + enclosing_seen = seen; + else if (!seen) + seen = enclosing_seen; + + rtx_insn *ret = final_scan_insn_1 (insn, file, optimize_p, nopeepholes, seen); + + if (!--recursion_counter) + enclosing_seen = NULL; + + return ret; +} + /* Return whether a source line note needs to be emitted before INSN. Sets IS_STMT to TRUE if the line should be marked as a possible -- cgit v1.1