[RS6000] ABI_V4 init of toc section
Since 4c4a180d lto has turned off flag_pic when linking a fixed position executable. So flag_pic is zero in rs6000_file_start. However, when we get to actually emitting code, flag_pic may be on again. This results in undefined references to ".LCTOC1". 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. From-SVN: r233061
This commit is contained in:
parent
d0268b37f8
commit
90c8d97130
3 changed files with 36 additions and 9 deletions
|
@ -1,3 +1,14 @@
|
|||
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
|
||||
|
|
|
@ -209,7 +209,7 @@ tree rs6000_builtin_types[RS6000_BTI_MAX];
|
|||
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
|
||||
|
@ -5681,13 +5681,6 @@ rs6000_file_start (void)
|
|||
|
||||
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);
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
|
@ -20363,6 +20356,7 @@ rs6000_output_addr_const_extra (FILE *file, rtx x)
|
|||
{
|
||||
putc ('-', file);
|
||||
assemble_name (file, toc_label_name);
|
||||
need_toc_init = 1;
|
||||
}
|
||||
else if (TARGET_ELF)
|
||||
fputs ("@toc", file);
|
||||
|
@ -23991,7 +23985,10 @@ rs6000_emit_load_toc_table (int fromprolog)
|
|||
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;
|
||||
|
@ -24036,6 +24033,7 @@ rs6000_emit_load_toc_table (int fromprolog)
|
|||
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));
|
||||
|
@ -24050,6 +24048,7 @@ rs6000_emit_load_toc_table (int fromprolog)
|
|||
/* 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));
|
||||
}
|
||||
|
@ -27586,6 +27585,17 @@ rs6000_output_function_epilogue (FILE *file,
|
|||
|
||||
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. */
|
||||
|
@ -31733,6 +31743,7 @@ rs6000_elf_declare_function_name (FILE *file, const char *name, tree decl)
|
|||
|
||||
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);
|
||||
|
@ -32125,6 +32136,7 @@ rs6000_xcoff_file_start (void)
|
|||
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);
|
||||
|
|
|
@ -9475,6 +9475,8 @@
|
|||
"*
|
||||
{
|
||||
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);
|
||||
|
@ -9492,6 +9494,8 @@
|
|||
"*
|
||||
{
|
||||
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);
|
||||
|
|
Loading…
Add table
Reference in a new issue