gas: handle csect in bss section for XCOFF

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.
This commit is contained in:
Clément Chigot
2021-06-15 11:06:52 +02:00
committed by Alan Modra
parent 18263be756
commit bcf8470303
2 changed files with 14 additions and 3 deletions

View 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> 2021-06-17 Clément Chigot <clement.chigot@atos.net>
* config/tc-ppc.c (md_apply_fix): Adjust addend to nullify * config/tc-ppc.c (md_apply_fix): Adjust addend to nullify

View File

@ -1883,7 +1883,7 @@ md_begin (void)
data csects. These symbols will not be output. */ 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_text_section, text_section, true);
ppc_init_xcoff_section (&ppc_xcoff_data_section, data_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 #endif
} }
@ -5986,6 +5986,9 @@ ppc_frob_symbol (symbolS *sym)
a->x_csect.x_scnlen.l = (S_GET_VALUE (symbol_get_tc (sym)->next) a->x_csect.x_scnlen.l = (S_GET_VALUE (symbol_get_tc (sym)->next)
- S_GET_VALUE (sym)); - S_GET_VALUE (sym));
} }
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; a->x_csect.x_smtyp = (symbol_get_tc (sym)->align << 3) | XTY_SD;
} }
else if (S_GET_SEGMENT (sym) == bss_section else if (S_GET_SEGMENT (sym) == bss_section
@ -6415,7 +6418,8 @@ ppc_fix_adjustable (fixS *fix)
/* Adjust a reloc against a .lcomm symbol to be against the base /* Adjust a reloc against a .lcomm symbol to be against the base
.lcomm. */ .lcomm. */
if (symseg == bss_section 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; symbolS *sy = symbol_get_frag (fix->fx_addsy)->fr_symbol;