Lack of any .toc section alignment causes kexec and kdump failure
when linking without the usual linker script.  This of course is
really a kexec-tools error, now fixed, but it is also true that .toc
ought to always be word aligned.

Bootstrapped and regression tested powerpc64le-linux and
powerpc64-linux.  OK to apply?

        * config/rs6000/rs6000.c (rs6000_elf_output_toc_section_asm_op):
        Align .toc.

diff --git a/gcc/config/rs6000/rs6000.c b/gcc/config/rs6000/rs6000.c
index a88cb19..fb522fb 100644
--- a/gcc/config/rs6000/rs6000.c
+++ b/gcc/config/rs6000/rs6000.c
@@ -31339,8 +31339,8 @@ rs6000_elf_output_toc_section_asm_op (const void *data 
ATTRIBUTE_UNUSED)
     {
       if (!toc_initialized)
        {
-         toc_initialized = 1;
          fprintf (asm_out_file, "%s\n", TOC_SECTION_ASM_OP);
+         ASM_OUTPUT_ALIGN (asm_out_file, TARGET_64BIT ? 3 : 2);
          (*targetm.asm_out.internal_label) (asm_out_file, "LCTOC", 0);
          fprintf (asm_out_file, "\t.tc ");
          ASM_OUTPUT_INTERNAL_LABEL_PREFIX (asm_out_file, "LCTOC1[TC],");
@@ -31348,20 +31348,30 @@ rs6000_elf_output_toc_section_asm_op (const void 
*data ATTRIBUTE_UNUSED)
          fprintf (asm_out_file, "\n");
 
          fprintf (asm_out_file, "%s\n", MINIMAL_TOC_SECTION_ASM_OP);
+         ASM_OUTPUT_ALIGN (asm_out_file, TARGET_64BIT ? 3 : 2);
          ASM_OUTPUT_INTERNAL_LABEL_PREFIX (asm_out_file, "LCTOC1");
          fprintf (asm_out_file, " = .+32768\n");
+         toc_initialized = 1;
        }
       else
        fprintf (asm_out_file, "%s\n", MINIMAL_TOC_SECTION_ASM_OP);
     }
   else if ((DEFAULT_ABI == ABI_AIX || DEFAULT_ABI == ABI_ELFv2)
           && !TARGET_RELOCATABLE)
-    fprintf (asm_out_file, "%s\n", TOC_SECTION_ASM_OP);
+    {
+      fprintf (asm_out_file, "%s\n", TOC_SECTION_ASM_OP);
+      if (!toc_initialized)
+       {
+         ASM_OUTPUT_ALIGN (asm_out_file, TARGET_64BIT ? 3 : 2);
+         toc_initialized = 1;
+       }
+    }
   else
     {
       fprintf (asm_out_file, "%s\n", MINIMAL_TOC_SECTION_ASM_OP);
       if (!toc_initialized)
        {
+         ASM_OUTPUT_ALIGN (asm_out_file, TARGET_64BIT ? 3 : 2);
          ASM_OUTPUT_INTERNAL_LABEL_PREFIX (asm_out_file, "LCTOC1");
          fprintf (asm_out_file, " = .+32768\n");
          toc_initialized = 1;

-- 
Alan Modra
Australia Development Lab, IBM

Reply via email to