diff options
author | Alexandre Oliva <aoliva@redhat.com> | 2018-02-11 15:26:11 +0000 |
---|---|---|
committer | Alexandre Oliva <aoliva@gcc.gnu.org> | 2018-02-11 15:26:11 +0000 |
commit | e094c0bfe982c21cd39741efde87591b59af8a55 (patch) | |
tree | 65bfd469f2b7a7806341aa9e156d133ff4f0b0f6 /gcc/final.c | |
parent | e5a6b70e88b852b5a1932d4cefd619b6d82a02ba (diff) | |
download | gcc-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/final.c')
-rw-r--r-- | gcc/final.c | 36 |
1 files changed, 33 insertions, 3 deletions
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 |