diff mbox series

[Ada] Fix PR ada/95035

Message ID 1911271.49Nzx2MQYC@polaris
State New
Headers show
Series [Ada] Fix PR ada/95035 | expand

Commit Message

Eric Botcazou May 12, 2020, 11:17 a.m. UTC
This fixes an oversight in the new canonicalization code for packable types: 
it does not take into account the scalar storage order.

Tested on x86-64/Linux and SPARC/Solaris, applied on the mainline.


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.
diff mbox series

Patch

diff --git a/gcc/ada/gcc-interface/utils.c b/gcc/ada/gcc-interface/utils.c
index 391b6827a5e..1527be4f6d1 100644
--- a/gcc/ada/gcc-interface/utils.c
+++ b/gcc/ada/gcc-interface/utils.c
@@ -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;
 }