aboutsummaryrefslogtreecommitdiff
path: root/gcc/ada/gcc-interface
diff options
context:
space:
mode:
authorEric Botcazou <ebotcazou@gcc.gnu.org>2020-05-12 13:14:20 +0200
committerEric Botcazou <ebotcazou@gcc.gnu.org>2020-05-12 13:15:48 +0200
commit90aea3e8d4f6119a9b666275b274bc4c251a7c91 (patch)
tree2617a3277265d8007a7c5c7a612fbcc5b5d0aff0 /gcc/ada/gcc-interface
parent5e3c2d4b238f10e6e6db36810469483334d4bcb0 (diff)
downloadgcc-90aea3e8d4f6119a9b666275b274bc4c251a7c91.zip
gcc-90aea3e8d4f6119a9b666275b274bc4c251a7c91.tar.gz
gcc-90aea3e8d4f6119a9b666275b274bc4c251a7c91.tar.bz2
Fix incorrect scalar storage order handling
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.
Diffstat (limited to 'gcc/ada/gcc-interface')
-rw-r--r--gcc/ada/gcc-interface/utils.c15
1 files changed, 10 insertions, 5 deletions
diff --git a/gcc/ada/gcc-interface/utils.c b/gcc/ada/gcc-interface/utils.c
index 391b682..1527be4 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;
}