+2016-02-02 Alan Modra <amodra@gmail.com>
+
+ PR target/68662
+ * config/rs6000/rs6000.c (need_toc_init): New var, set it
+ whenever toc_label_name used.
+ (rs6000_file_start): Don't set up toc section here,
+ (rs6000_output_function_epilogue): do so here instead,
+ (rs6000_xcoff_file_start): and here.
+ * config/rs6000/rs6000.md (load_toc_aix_si): Set need_toc_init.
+ (load_toc_aix_di): Likewise.
+
2016-02-01 Jakub Jelinek <jakub@redhat.com>
PR rtl-optimization/69592
tree rs6000_builtin_decls[RS6000_BUILTIN_COUNT];
/* Flag to say the TOC is initialized */
-int toc_initialized;
+int toc_initialized, need_toc_init;
char toc_label_name[10];
/* Cached value of rs6000_variable_issue. This is cached in
if (DEFAULT_ABI == ABI_ELFv2)
fprintf (file, "\t.abiversion 2\n");
-
- if (DEFAULT_ABI == ABI_AIX || DEFAULT_ABI == ABI_ELFv2
- || (TARGET_ELF && flag_pic == 2))
- {
- switch_to_section (toc_section);
- switch_to_section (text_section);
- }
}
\f
{
putc ('-', file);
assemble_name (file, toc_label_name);
+ need_toc_init = 1;
}
else if (TARGET_ELF)
fputs ("@toc", file);
ASM_GENERATE_INTERNAL_LABEL (buf, "L", CODE_LABEL_NUMBER (lab));
lab = gen_rtx_SYMBOL_REF (Pmode, ggc_strdup (buf));
if (flag_pic == 2)
- got = gen_rtx_SYMBOL_REF (Pmode, ggc_strdup (toc_label_name));
+ {
+ got = gen_rtx_SYMBOL_REF (Pmode, ggc_strdup (toc_label_name));
+ need_toc_init = 1;
+ }
else
got = rs6000_got_sym ();
tmp1 = tmp2 = dest;
rtx tocsym, lab;
tocsym = gen_rtx_SYMBOL_REF (Pmode, ggc_strdup (toc_label_name));
+ need_toc_init = 1;
lab = gen_label_rtx ();
emit_insn (gen_load_toc_v4_PIC_1b (tocsym, lab));
emit_move_insn (dest, gen_rtx_REG (Pmode, LR_REGNO));
/* This is for AIX code running in non-PIC ELF32. */
rtx realsym = gen_rtx_SYMBOL_REF (Pmode, ggc_strdup (toc_label_name));
+ need_toc_init = 1;
emit_insn (gen_elf_high (dest, realsym));
emit_insn (gen_elf_low (dest, dest, realsym));
}
fputs ("\t.align 2\n", file);
}
+
+ /* Arrange to define .LCTOC1 label, if not already done. */
+ if (need_toc_init)
+ {
+ need_toc_init = 0;
+ if (!toc_initialized)
+ {
+ switch_to_section (toc_section);
+ switch_to_section (current_function_section ());
+ }
+ }
}
/* -fsplit-stack support. */
fprintf (file, "\t.long ");
assemble_name (file, toc_label_name);
+ need_toc_init = 1;
putc ('-', file);
ASM_GENERATE_INTERNAL_LABEL (buf, "LCF", rs6000_pic_labelno);
assemble_name (file, buf);
fputc ('\n', asm_out_file);
if (write_symbols != NO_DEBUG)
switch_to_section (private_data_section);
+ switch_to_section (toc_section);
switch_to_section (text_section);
if (profile_flag)
fprintf (asm_out_file, "\t.extern %s\n", RS6000_MCOUNT);
"*
{
char buf[30];
+ extern int need_toc_init;
+ need_toc_init = 1;
ASM_GENERATE_INTERNAL_LABEL (buf, \"LCTOC\", 1);
operands[1] = gen_rtx_SYMBOL_REF (Pmode, ggc_strdup (buf));
operands[2] = gen_rtx_REG (Pmode, 2);
"*
{
char buf[30];
+ extern int need_toc_init;
+ need_toc_init = 1;
#ifdef TARGET_RELOCATABLE
ASM_GENERATE_INTERNAL_LABEL (buf, \"LCTOC\",
!TARGET_MINIMAL_TOC || TARGET_RELOCATABLE);