Commit c0d6cb1a by Segher Boessenkool Committed by Segher Boessenkool

rs6000: Don't forget to initialize the TOC (PR77957)

The code generating traceback tables mistakenly does an early return
if !optional_tbtab, which causes it to miss the code generating the TOC
section.  This only matters if the TOC will be empty since otherwise
the section is created elsewhere.

This patch fixes it.


	PR target/77957
	* config/rs6000/rs6000.c (rs6000_output_function_epilogue): Don't
	return early if !optional_tbtab.

From-SVN: r242336
parent b93d8a3f
2016-11-12 Segher Boessenkool <segher@kernel.crashing.org>
PR target/77957
* config/rs6000/rs6000.c (rs6000_output_function_epilogue): Don't
return early if !optional_tbtab.
2016-11-11 Eric Botcazou <ebotcazou@adacore.com> 2016-11-11 Eric Botcazou <ebotcazou@adacore.com>
PR rtl-optimization/59461 PR rtl-optimization/59461
...@@ -30412,53 +30412,54 @@ rs6000_output_function_epilogue (FILE *file, ...@@ -30412,53 +30412,54 @@ rs6000_output_function_epilogue (FILE *file,
seems to set the bit when not optimizing. */ seems to set the bit when not optimizing. */
fprintf (file, "%d\n", ((float_parms << 1) | (! optimize))); fprintf (file, "%d\n", ((float_parms << 1) | (! optimize)));
if (! optional_tbtab) if (optional_tbtab)
return; {
/* Optional fields follow. Some are variable length. */
/* Optional fields follow. Some are variable length. */
/* Parameter types, left adjusted bit fields: 0 fixed, 10 single
/* Parameter types, left adjusted bit fields: 0 fixed, 10 single float, float, 11 double float. */
11 double float. */ /* There is an entry for each parameter in a register, in the order
/* There is an entry for each parameter in a register, in the order that that they occur in the parameter list. Any intervening arguments
they occur in the parameter list. Any intervening arguments on the on the stack are ignored. If the list overflows a long (max
stack are ignored. If the list overflows a long (max possible length possible length 34 bits) then completely leave off all elements
34 bits) then completely leave off all elements that don't fit. */ that don't fit. */
/* Only emit this long if there was at least one parameter. */ /* Only emit this long if there was at least one parameter. */
if (fixed_parms || float_parms) if (fixed_parms || float_parms)
fprintf (file, "\t.long %d\n", parm_info); fprintf (file, "\t.long %d\n", parm_info);
/* Offset from start of code to tb table. */ /* Offset from start of code to tb table. */
fputs ("\t.long ", file); fputs ("\t.long ", file);
ASM_OUTPUT_INTERNAL_LABEL_PREFIX (file, "LT"); ASM_OUTPUT_INTERNAL_LABEL_PREFIX (file, "LT");
RS6000_OUTPUT_BASENAME (file, fname); RS6000_OUTPUT_BASENAME (file, fname);
putc ('-', file); putc ('-', file);
rs6000_output_function_entry (file, fname); rs6000_output_function_entry (file, fname);
putc ('\n', file); putc ('\n', file);
/* Interrupt handler mask. */ /* Interrupt handler mask. */
/* Omit this long, since we never set the interrupt handler bit /* Omit this long, since we never set the interrupt handler bit
above. */ above. */
/* Number of CTL (controlled storage) anchors. */ /* Number of CTL (controlled storage) anchors. */
/* Omit this long, since the has_ctl bit is never set above. */ /* Omit this long, since the has_ctl bit is never set above. */
/* Displacement into stack of each CTL anchor. */ /* Displacement into stack of each CTL anchor. */
/* Omit this list of longs, because there are no CTL anchors. */ /* Omit this list of longs, because there are no CTL anchors. */
/* Length of function name. */ /* Length of function name. */
if (*fname == '*') if (*fname == '*')
++fname; ++fname;
fprintf (file, "\t.short %d\n", (int) strlen (fname)); fprintf (file, "\t.short %d\n", (int) strlen (fname));
/* Function name. */ /* Function name. */
assemble_string (fname, strlen (fname)); assemble_string (fname, strlen (fname));
/* Register for alloca automatic storage; this is always reg 31. /* Register for alloca automatic storage; this is always reg 31.
Only emit this if the alloca bit was set above. */ Only emit this if the alloca bit was set above. */
if (frame_pointer_needed) if (frame_pointer_needed)
fputs ("\t.byte 31\n", file); 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. */ /* Arrange to define .LCTOC1 label, if not already done. */
Markdown is supported
0% or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment