diff options
-rw-r--r-- | gcc/ChangeLog | 5 | ||||
-rw-r--r-- | gcc/final.c | 21 |
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); } |