]> git.ipfire.org Git - thirdparty/gcc.git/commitdiff
[RS6000] ABI_V4 init of toc section
authorAlan Modra <amodra@gmail.com>
Tue, 2 Feb 2016 00:01:16 +0000 (10:31 +1030)
committerAlan Modra <amodra@gcc.gnu.org>
Tue, 2 Feb 2016 00:01:16 +0000 (10:31 +1030)
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

gcc/ChangeLog
gcc/config/rs6000/rs6000.c
gcc/config/rs6000/rs6000.md

index 24939468c76a0634fa6f95e863ad269994faf7b8..1d89607433b99c10d23c374863ffa7ed66fe5ee4 100644 (file)
@@ -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
index 41f53adc0c37ea1c29ea5017e65568ffbd067a3d..e840a2c2d662d24a08c723630a3e533402ad275f 100644 (file)
@@ -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);
-    }
 }
 
 \f
@@ -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);
index d8834a2731413b4d1726e0e3623b0438526f6db2..cc2f1bd65a7234f36eb39a21396b6bade07ffd59 100644 (file)
   "*
 {
   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);