[LVU] deal with md final_scan_insn
authorAlexandre Oliva <aoliva@redhat.com>
Sun, 11 Feb 2018 15:26:11 +0000 (15:26 +0000)
committerAlexandre Oliva <aoliva@gcc.gnu.org>
Sun, 11 Feb 2018 15:26:11 +0000 (15:26 +0000)
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
gcc/config/sparc/sparc.c
gcc/config/visium/visium.c
gcc/final.c

index 677c316237d22b4c7ebac7fa19332581ed047638..fc842d91c83aa7427b86f4e4366656174fb67a6e 100644 (file)
@@ -1,3 +1,12 @@
+2018-02-11  Alexandre Oliva <aoliva@redhat.com>
+
+       * 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  <danglin@gcc.gnu.org>
 
        * config/pa/pa.c (hppa_profile_hook): Mark SYMBOL_REF for _mcount as
index 48669f1776520af1abc48b2b9604cd11abb77c9a..7126b57ba0110559e0b7e01fd0d8def4f2b36fa9 100644 (file)
@@ -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);
index 8751156c4065d845dcae95c43a9979eda5ff52a2..106cdaf9e3f937106f81a264296ee81499a20a46 100644 (file)
@@ -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;
            }
index 99a7cadd7c9f9df7c7cc4629315154fac74334ed..cbebbfdf5b077e4a01b0acd29b4e4ddf9d23ad4f 100644 (file)
@@ -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;
+}
+
 \f
 /* 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