On Mon, Apr 27, 2020 at 08:41:32AM +0200, Andreas Krebbel wrote:
> Ok. Thanks for doing this!

Thanks, committed.

> We probably have to look into providing a -Wpsabi warning as well.

So like this?  Untested except on a small testcase.

2020-04-27  Jakub Jelinek  <ja...@redhat.com>

        PR target/94704
        * config/s390/s390.c (s390_function_arg_vector,
        s390_function_arg_float): Emit -Wpsabi diagnostics if the ABI changed.

--- gcc/config/s390/s390.c.jj   2020-04-27 09:11:47.600095196 +0200
+++ gcc/config/s390/s390.c      2020-04-27 09:24:53.583055720 +0200
@@ -11911,16 +11911,22 @@ s390_function_arg_vector (machine_mode m
 
   /* The ABI says that record types with a single member are treated
      just like that member would be.  */
+  bool cxx17_empty_base_seen = false;
   while (TREE_CODE (type) == RECORD_TYPE)
     {
       tree field, single = NULL_TREE;
 
       for (field = TYPE_FIELDS (type); field; field = DECL_CHAIN (field))
        {
-         if (TREE_CODE (field) != FIELD_DECL
-             || cxx17_empty_base_field_p (field))
+         if (TREE_CODE (field) != FIELD_DECL)
            continue;
 
+         if (cxx17_empty_base_field_p (field))
+           {
+             cxx17_empty_base_seen = true;
+             continue;
+           }
+
          if (single == NULL_TREE)
            single = TREE_TYPE (field);
          else
@@ -11940,7 +11946,22 @@ s390_function_arg_vector (machine_mode m
        }
     }
 
-  return VECTOR_TYPE_P (type);
+  if (!VECTOR_TYPE_P (type))
+    return false;
+
+  if (warn_psabi && cxx17_empty_base_seen)
+    {
+      static unsigned last_reported_type_uid;
+      unsigned uid = TYPE_UID (TYPE_MAIN_VARIANT (type));
+      if (uid != last_reported_type_uid)
+       {
+         last_reported_type_uid = uid;
+         inform (input_location, "parameter passing for argument of type "
+                                 "%qT when C++17 is enabled changed to match "
+                                 "C++14 in GCC 10.1", type);
+       }
+    }
+  return true;
 }
 
 /* Return true if a function argument of type TYPE and mode MODE
@@ -11962,15 +11983,20 @@ s390_function_arg_float (machine_mode mo
 
   /* The ABI says that record types with a single member are treated
      just like that member would be.  */
+  bool cxx17_empty_base_seen = false;
   while (TREE_CODE (type) == RECORD_TYPE)
     {
       tree field, single = NULL_TREE;
 
       for (field = TYPE_FIELDS (type); field; field = DECL_CHAIN (field))
        {
-         if (TREE_CODE (field) != FIELD_DECL
-             || cxx17_empty_base_field_p (field))
+         if (TREE_CODE (field) != FIELD_DECL)
            continue;
+         if (cxx17_empty_base_field_p (field))
+           {
+             cxx17_empty_base_seen = true;
+             continue;
+           }
 
          if (single == NULL_TREE)
            single = TREE_TYPE (field);
@@ -11984,7 +12010,23 @@ s390_function_arg_float (machine_mode mo
        type = single;
     }
 
-  return TREE_CODE (type) == REAL_TYPE;
+  if (TREE_CODE (type) != REAL_TYPE)
+    return false;
+
+  if (warn_psabi && cxx17_empty_base_seen)
+    {
+      static unsigned last_reported_type_uid;
+      unsigned uid = TYPE_UID (TYPE_MAIN_VARIANT (type));
+      if (uid != last_reported_type_uid)
+       {
+         last_reported_type_uid = uid;
+         inform (input_location, "parameter passing for argument of type "
+                                 "%qT when C++17 is enabled changed to match "
+                                 "C++14 in GCC 10.1", type);
+       }
+    }
+
+  return true;
 }
 
 /* Return true if a function argument of type TYPE and mode MODE


        Jakub

Reply via email to