]> git.ipfire.org Git - thirdparty/gcc.git/commitdiff
IBM Z: Cover weak symbols with -munaligned-symbols
authorAndreas Krebbel <krebbel@linux.ibm.com>
Mon, 18 Dec 2023 16:54:42 +0000 (17:54 +0100)
committerAndreas Krebbel <krebbel@linux.ibm.com>
Mon, 18 Dec 2023 18:42:37 +0000 (19:42 +0100)
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.

gcc/config/s390/s390.cc
gcc/testsuite/gcc.target/s390/unaligned-2.c [new file with mode: 0644]

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