diff --git a/gcc/ChangeLog b/gcc/ChangeLog index de764a3e9120..e5510c37bf98 100644 --- a/gcc/ChangeLog +++ b/gcc/ChangeLog @@ -1,3 +1,9 @@ +2016-11-12 Segher Boessenkool + + PR target/77957 + * config/rs6000/rs6000.c (rs6000_output_function_epilogue): Don't + return early if !optional_tbtab. + 2016-11-11 Eric Botcazou PR rtl-optimization/59461 diff --git a/gcc/config/rs6000/rs6000.c b/gcc/config/rs6000/rs6000.c index ac0bcbdcd500..05448cb79047 100644 --- a/gcc/config/rs6000/rs6000.c +++ b/gcc/config/rs6000/rs6000.c @@ -30412,53 +30412,54 @@ rs6000_output_function_epilogue (FILE *file, seems to set the bit when not optimizing. */ fprintf (file, "%d\n", ((float_parms << 1) | (! optimize))); - if (! optional_tbtab) - return; + if (optional_tbtab) + { + /* Optional fields follow. Some are variable length. */ - /* Optional fields follow. Some are variable length. */ + /* Parameter types, left adjusted bit fields: 0 fixed, 10 single + float, 11 double float. */ + /* There is an entry for each parameter in a register, in the order + that they occur in the parameter list. Any intervening arguments + on the stack are ignored. If the list overflows a long (max + possible length 34 bits) then completely leave off all elements + that don't fit. */ + /* Only emit this long if there was at least one parameter. */ + if (fixed_parms || float_parms) + fprintf (file, "\t.long %d\n", parm_info); - /* Parameter types, left adjusted bit fields: 0 fixed, 10 single float, - 11 double float. */ - /* There is an entry for each parameter in a register, in the order that - they occur in the parameter list. Any intervening arguments on the - stack are ignored. If the list overflows a long (max possible length - 34 bits) then completely leave off all elements that don't fit. */ - /* Only emit this long if there was at least one parameter. */ - if (fixed_parms || float_parms) - fprintf (file, "\t.long %d\n", parm_info); + /* Offset from start of code to tb table. */ + fputs ("\t.long ", file); + ASM_OUTPUT_INTERNAL_LABEL_PREFIX (file, "LT"); + RS6000_OUTPUT_BASENAME (file, fname); + putc ('-', file); + rs6000_output_function_entry (file, fname); + putc ('\n', file); - /* Offset from start of code to tb table. */ - fputs ("\t.long ", file); - ASM_OUTPUT_INTERNAL_LABEL_PREFIX (file, "LT"); - RS6000_OUTPUT_BASENAME (file, fname); - putc ('-', file); - rs6000_output_function_entry (file, fname); - putc ('\n', file); + /* Interrupt handler mask. */ + /* Omit this long, since we never set the interrupt handler bit + above. */ - /* Interrupt handler mask. */ - /* Omit this long, since we never set the interrupt handler bit - above. */ + /* Number of CTL (controlled storage) anchors. */ + /* Omit this long, since the has_ctl bit is never set above. */ - /* Number of CTL (controlled storage) anchors. */ - /* Omit this long, since the has_ctl bit is never set above. */ + /* Displacement into stack of each CTL anchor. */ + /* Omit this list of longs, because there are no CTL anchors. */ - /* Displacement into stack of each CTL anchor. */ - /* Omit this list of longs, because there are no CTL anchors. */ + /* Length of function name. */ + if (*fname == '*') + ++fname; + fprintf (file, "\t.short %d\n", (int) strlen (fname)); - /* Length of function name. */ - if (*fname == '*') - ++fname; - fprintf (file, "\t.short %d\n", (int) strlen (fname)); + /* Function name. */ + assemble_string (fname, strlen (fname)); - /* Function name. */ - assemble_string (fname, strlen (fname)); + /* Register for alloca automatic storage; this is always reg 31. + Only emit this if the alloca bit was set above. */ + if (frame_pointer_needed) + fputs ("\t.byte 31\n", file); - /* Register for alloca automatic storage; this is always reg 31. - Only emit this if the alloca bit was set above. */ - if (frame_pointer_needed) - fputs ("\t.byte 31\n", file); - - fputs ("\t.align 2\n", file); + fputs ("\t.align 2\n", file); + } } /* Arrange to define .LCTOC1 label, if not already done. */