aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--gcc/ChangeLog5
-rw-r--r--gcc/final.c21
2 files changed, 20 insertions, 6 deletions
diff --git a/gcc/ChangeLog b/gcc/ChangeLog
index 67eb6fc..7bc499e 100644
--- a/gcc/ChangeLog
+++ b/gcc/ChangeLog
@@ -1,3 +1,8 @@
+2000-07-08 Richard Henderson <rth@cygnus.com>
+
+ * final.c (final): Do not abort when reg-stack introduces
+ a new insn.
+
2000-07-08 Zack Weinberg <zack@wolery.cumb.org>
* cpplib.h (struct cpp_name): Now struct cpp_string.
diff --git a/gcc/final.c b/gcc/final.c
index 3537bcf..be4a01e 100644
--- a/gcc/final.c
+++ b/gcc/final.c
@@ -2014,14 +2014,23 @@ final (first, file, optimize, prescan)
for (insn = NEXT_INSN (first); insn;)
{
#ifdef HAVE_ATTR_length
-#ifdef ENABLE_CHECKING
- /* This can be triggered by bugs elsewhere in the compiler if
- new insns are created after init_insn_lengths is called. */
if (INSN_UID (insn) >= insn_lengths_max_uid)
- abort ();
-#endif
- insn_current_address = insn_addresses[INSN_UID (insn)];
+ {
+#ifdef STACK_REGS
+ /* Irritatingly, the reg-stack pass is creating new instructions
+ and because of REG_DEAD note abuse it has to run after
+ shorten_branches. Fake address of -1 then. */
+ insn_current_address = -1;
+#else
+ /* This can be triggered by bugs elsewhere in the compiler if
+ new insns are created after init_insn_lengths is called. */
+ abort ();
#endif
+ }
+ else
+ insn_current_address = insn_addresses[INSN_UID (insn)];
+#endif /* HAVE_ATTR_length */
+
insn = final_scan_insn (insn, file, optimize, prescan, 0);
}