diff --git a/gcc/config/s390/s390.cc b/gcc/config/s390/s390.cc index 044de874590444e1de63eb4961f8b42fb6e8c0bb..a5c36b4397235bd3a9c030ab07bfb8247100896a 100644 --- a/gcc/config/s390/s390.cc +++ b/gcc/config/s390/s390.cc @@ -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)); diff --git a/gcc/testsuite/gcc.target/s390/unaligned-2.c b/gcc/testsuite/gcc.target/s390/unaligned-2.c new file mode 100644 index 0000000000000000000000000000000000000000..c1ece6d5935ed1a3008ac9fba20ea569a70bc43e --- /dev/null +++ b/gcc/testsuite/gcc.target/s390/unaligned-2.c @@ -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 } } */