diff options
| -rw-r--r-- | gcc/ChangeLog | 7 | ||||
| -rw-r--r-- | gcc/function.c | 36 |
2 files changed, 24 insertions, 19 deletions
diff --git a/gcc/ChangeLog b/gcc/ChangeLog index dc1876d..957f047 100644 --- a/gcc/ChangeLog +++ b/gcc/ChangeLog @@ -1,3 +1,8 @@ +2001-04-26 Geoffrey Keating <geoffk@redhat.com> + + * function.c (expand_function_end): Always clobber the + return registers, even if there is no return label. + Thu Apr 26 20:28:21 CEST 2001 Jan Hubicka <jh@suse.cz> * (ix86_expand_fp_movcc): Re-enable SSE conditional move generation. @@ -77,6 +82,7 @@ Thu Apr 26 19:20:28 CEST 2001 Jan Hubicka <jh@suse.cz> * config/i386/i386.h (CC1_CPU_SPEC): Fix deprecation warnings for -m386 and -m486. +>>>>>>> 1.9867 2001-04-26 Alexandre Oliva <aoliva@redhat.com> * configure.in (configargs.h): Define thread_model. @@ -161,6 +167,7 @@ Wed Apr 25 17:09:50 2001 J"orn Rennecke <amylaar@redhat.com> (get_exception_filter): New fn. (finish_eh_generation): Use it. +>>>>>>> 1.9859 2001-04-24 Nathan Sidwell <nathan@codesourcery.com> * c-semantics.c (add_scope_stmt): Don't call diff --git a/gcc/function.c b/gcc/function.c index 8de57df..482e3ef 100644 --- a/gcc/function.c +++ b/gcc/function.c @@ -6777,31 +6777,29 @@ expand_function_end (filename, line, end_bindings) SDB depends on this. */ emit_line_note_force (filename, line); + /* Before the return label (if any), clobber the return + registers so that they are not propogated live to the rest of + the function. This can only happen with functions that drop + through; if there had been a return statement, there would + have either been a return rtx, or a jump to the return label. */ + { + rtx before, after; + + before = get_last_insn (); + clobber_return_register (); + after = get_last_insn (); + + if (before != after) + cfun->x_clobber_return_insn = after; + } + /* Output the label for the actual return from the function, if one is expected. This happens either because a function epilogue is used instead of a return instruction, or because a return was done with a goto in order to run local cleanups, or because of pcc-style structure returning. */ - if (return_label) - { - rtx before, after; - - /* Before the return label, clobber the return registers so that - they are not propogated live to the rest of the function. This - can only happen with functions that drop through; if there had - been a return statement, there would have either been a return - rtx, or a jump to the return label. */ - - before = get_last_insn (); - clobber_return_register (); - after = get_last_insn (); - - if (before != after) - cfun->x_clobber_return_insn = after; - - emit_label (return_label); - } + emit_label (return_label); /* C++ uses this. */ if (end_bindings) |
