aboutsummaryrefslogtreecommitdiff
path: root/gcc
diff options
context:
space:
mode:
authorAlexandre Oliva <aoliva@redhat.com>2018-02-11 15:26:11 +0000
committerAlexandre Oliva <aoliva@gcc.gnu.org>2018-02-11 15:26:11 +0000
commite094c0bfe982c21cd39741efde87591b59af8a55 (patch)
tree65bfd469f2b7a7806341aa9e156d133ff4f0b0f6 /gcc
parente5a6b70e88b852b5a1932d4cefd619b6d82a02ba (diff)
downloadgcc-e094c0bfe982c21cd39741efde87591b59af8a55.zip
gcc-e094c0bfe982c21cd39741efde87591b59af8a55.tar.gz
gcc-e094c0bfe982c21cd39741efde87591b59af8a55.tar.bz2
[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
Diffstat (limited to 'gcc')
-rw-r--r--gcc/ChangeLog9
-rw-r--r--gcc/config/sparc/sparc.c6
-rw-r--r--gcc/config/visium/visium.c3
-rw-r--r--gcc/final.c36
4 files changed, 45 insertions, 9 deletions
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 <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
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