gas: handle csect in bss section for XCOFF
authorClément Chigot <clement.chigot@atos.net>
Tue, 15 Jun 2021 09:06:52 +0000 (11:06 +0200)
committerAlan Modra <amodra@gmail.com>
Thu, 17 Jun 2021 13:59:47 +0000 (23:29 +0930)
Latest gcc versions are now generating csects instead of .lcomm
for bss symbols.
Some adjustements are needed in order to handle them.

* config/tc-ppc.c (md_begin): Create bss section with dummy
symbol.
(ppc_frob_symbol): Output XTY_CM for bss csects.
(ppc_fix_adjustable): Adjust condition to avoid bss csects.

gas/ChangeLog
gas/config/tc-ppc.c

index ad2013708c46ffb0c67f56e48331dbf890682212..821cc810e07f206d5850fef33f8c2dae59a87693 100644 (file)
@@ -1,3 +1,10 @@
+2021-06-17  Clément Chigot  <clement.chigot@atos.net>
+
+       * config/tc-ppc.c (md_begin): Create bss section with dummy
+       symbol.
+       (ppc_frob_symbol): Output XTY_CM for bss csects.
+       (ppc_fix_adjustable): Adjust condition to avoid bss csects.
+
 2021-06-17  Clément Chigot  <clement.chigot@atos.net>
 
        * config/tc-ppc.c (md_apply_fix): Adjust addend to nullify
index 72bf5ce75d424db0508b7e5a1fcd33b428c8d074..ad85d3863b0025be1809e33dc331f04920889e39 100644 (file)
@@ -1883,7 +1883,7 @@ md_begin (void)
      data csects.  These symbols will not be output.  */
   ppc_init_xcoff_section (&ppc_xcoff_text_section, text_section, true);
   ppc_init_xcoff_section (&ppc_xcoff_data_section, data_section, true);
-  ppc_init_xcoff_section (&ppc_xcoff_bss_section, bss_section, false);
+  ppc_init_xcoff_section (&ppc_xcoff_bss_section, bss_section, true);
 #endif
 }
 
@@ -5986,7 +5986,10 @@ ppc_frob_symbol (symbolS *sym)
              a->x_csect.x_scnlen.l = (S_GET_VALUE (symbol_get_tc (sym)->next)
                                       - S_GET_VALUE (sym));
            }
-         a->x_csect.x_smtyp = (symbol_get_tc (sym)->align << 3) | XTY_SD;
+         if (symbol_get_tc (sym)->symbol_class == XMC_BS)
+           a->x_csect.x_smtyp = (symbol_get_tc (sym)->align << 3) | XTY_CM;
+         else
+           a->x_csect.x_smtyp = (symbol_get_tc (sym)->align << 3) | XTY_SD;
        }
       else if (S_GET_SEGMENT (sym) == bss_section
               || S_GET_SEGMENT (sym) == ppc_xcoff_tbss_section.segment)
@@ -6415,7 +6418,8 @@ ppc_fix_adjustable (fixS *fix)
   /* Adjust a reloc against a .lcomm symbol to be against the base
      .lcomm.  */
   if (symseg == bss_section
-      && ! S_IS_EXTERNAL (fix->fx_addsy))
+      && ! S_IS_EXTERNAL (fix->fx_addsy)
+      && symbol_get_tc (fix->fx_addsy)->subseg == 0)
     {
       symbolS *sy = symbol_get_frag (fix->fx_addsy)->fr_symbol;