]> git.ipfire.org Git - thirdparty/gcc.git/commitdiff
Fix incorrect scalar storage order handling
authorEric Botcazou <ebotcazou@gcc.gnu.org>
Tue, 12 May 2020 11:14:20 +0000 (13:14 +0200)
committerEric Botcazou <ebotcazou@gcc.gnu.org>
Tue, 12 May 2020 11:15:48 +0000 (13:15 +0200)
This fixes an oversight in the new canonicalization code for packable
types: it does not take into account the scalar storage order.

PR ada/95035
* gcc-interface/utils.c (packable_type_hasher::equal): Also compare
the scalar storage order.
(hash_packable_type): Also hash the scalar storage order.
(hash_pad_type): Likewise.

gcc/ada/ChangeLog
gcc/ada/gcc-interface/utils.c

index c70119b47248fdf5d96ea71b9b5aabd620f4c143..3502eb83d5e2c65575bee478ad118b0cfbb31825 100644 (file)
@@ -1,3 +1,11 @@
+2020-05-12  Eric Botcazou  <ebotcazou@adacore.com>
+
+       PR ada/95035
+       * gcc-interface/utils.c (packable_type_hasher::equal): Also compare
+       the scalar storage order.
+       (hash_packable_type): Also hash the scalar storage order.
+       (hash_pad_type): Likewise.
+
 2020-05-09  Eric Botcazou  <ebotcazou@adacore.com>
 
        * gcc-interface/*.[ch]: Update copyright year.
index 391b6827a5efd9a4a70a01e0e92d180f6eba1c26..1527be4f6d1107ba5ec8432b41b1dce4613c21c5 100644 (file)
@@ -1026,14 +1026,15 @@ packable_type_hasher::equal (packable_type_hash *t1, packable_type_hash *t2)
   type1 = t1->type;
   type2 = t2->type;
 
-  /* We consider that packable types are equivalent if they have the same
-     name, size, alignment and RM size.  Taking the mode into account is
-     redundant since it is determined by the others.  */
+  /* We consider that packable types are equivalent if they have the same name,
+     size, alignment, RM size and storage order. Taking the mode into account
+     is redundant since it is determined by the others.  */
   return
     TYPE_NAME (type1) == TYPE_NAME (type2)
     && TYPE_SIZE (type1) == TYPE_SIZE (type2)
     && TYPE_ALIGN (type1) == TYPE_ALIGN (type2)
-    && TYPE_ADA_SIZE (type1) == TYPE_ADA_SIZE (type2);
+    && TYPE_ADA_SIZE (type1) == TYPE_ADA_SIZE (type2)
+    && TYPE_REVERSE_STORAGE_ORDER (type1) == TYPE_REVERSE_STORAGE_ORDER (type2);
 }
 
 /* Compute the hash value for the packable TYPE.  */
@@ -1047,6 +1048,8 @@ hash_packable_type (tree type)
   hashcode = iterative_hash_expr (TYPE_SIZE (type), hashcode);
   hashcode = iterative_hash_hashval_t (TYPE_ALIGN (type), hashcode);
   hashcode = iterative_hash_expr (TYPE_ADA_SIZE (type), hashcode);
+  hashcode
+    = iterative_hash_hashval_t (TYPE_REVERSE_STORAGE_ORDER (type), hashcode);
 
   return hashcode;
 }
@@ -1402,7 +1405,7 @@ pad_type_hasher::equal (pad_type_hash *t1, pad_type_hash *t2)
   type1 = t1->type;
   type2 = t2->type;
 
-  /* We consider that the padded types are equivalent if they pad the same type
+  /* We consider that padded types are equivalent if they pad the same type
      and have the same size, alignment, RM size and storage order.  Taking the
      mode into account is redundant since it is determined by the others.  */
   return
@@ -1425,6 +1428,8 @@ hash_pad_type (tree type)
   hashcode = iterative_hash_expr (TYPE_SIZE (type), hashcode);
   hashcode = iterative_hash_hashval_t (TYPE_ALIGN (type), hashcode);
   hashcode = iterative_hash_expr (TYPE_ADA_SIZE (type), hashcode);
+  hashcode
+    = iterative_hash_hashval_t (TYPE_REVERSE_STORAGE_ORDER (type), hashcode);
 
   return hashcode;
 }