IBM Z: Cover weak symbols with -munaligned-symbols

With the recently introduced -munaligned-symbols option byte-sized
variables which are resolved externally are considered to be
potentially misaligned.
However, this should rather also be applied to symbols which resolve
locally if they are weak. Done with this patch.

gcc/ChangeLog:

	* config/s390/s390.cc (s390_encode_section_info): Replace
	SYMBOL_REF_LOCAL_P with decl_binds_to_current_def_p.

gcc/testsuite/ChangeLog:

	* gcc.target/s390/unaligned-2.c: New test.
This commit is contained in:
Andreas Krebbel 2023-12-18 17:54:42 +01:00
parent 4554a151d0
commit f85fdf59c9
2 changed files with 18 additions and 4 deletions

View file

@ -13802,10 +13802,8 @@ s390_encode_section_info (tree decl, rtx rtl, int first)
byte aligned as mandated by our ABI. This behavior can be
overridden for external symbols with the -munaligned-symbols
switch. */
if (DECL_ALIGN (decl) % 16
&& (DECL_USER_ALIGN (decl)
|| (!SYMBOL_REF_LOCAL_P (XEXP (rtl, 0))
&& s390_unaligned_symbols_p)))
if ((DECL_USER_ALIGN (decl) && DECL_ALIGN (decl) % 16)
|| (s390_unaligned_symbols_p && !decl_binds_to_current_def_p (decl)))
SYMBOL_FLAG_SET_NOTALIGN2 (XEXP (rtl, 0));
else if (DECL_ALIGN (decl) % 32)
SYMBOL_FLAG_SET_NOTALIGN4 (XEXP (rtl, 0));

View file

@ -0,0 +1,16 @@
/* weak symbols might get overridden in another module by symbols
which are not aligned on a 2-byte boundary. Although this violates
the zABI we try to handle this gracefully by not using larl on
these symbols if -munaligned-symbols has been specified. */
/* { dg-do compile } */
/* { dg-options "-O3 -march=z900 -fno-section-anchors -munaligned-symbols" } */
unsigned char __attribute__((weak)) weaksym = 0;
unsigned char
foo ()
{
return weaksym;
}
/* { dg-final { scan-assembler-times "larl\t%r\[0-9\]*,weaksym\n" 0 } } */