From c91b33b9b1bb7d38495faee0fe4ddd580ff317e9 Mon Sep 17 00:00:00 2001 From: ebotcazou Date: Thu, 6 Mar 2008 00:44:11 +0000 Subject: [PATCH] PR ada/35186 * decl.c (maybe_pad_type): Avoid padding an integral type when bumping its alignment is sufficient. git-svn-id: svn+ssh://gcc.gnu.org/svn/gcc/trunk@132963 138bc75d-0d04-0410-961f-82ee72b054a4 --- gcc/ada/ChangeLog | 6 ++++++ gcc/ada/decl.c | 15 +++++++++++++-- gcc/testsuite/ChangeLog | 4 ++++ gcc/testsuite/gnat.dg/specs/pack33.ads | 27 +++++++++++++++++++++++++++ 4 files changed, 50 insertions(+), 2 deletions(-) create mode 100644 gcc/testsuite/gnat.dg/specs/pack33.ads diff --git a/gcc/ada/ChangeLog b/gcc/ada/ChangeLog index d990e10..a67aae4 100644 --- a/gcc/ada/ChangeLog +++ b/gcc/ada/ChangeLog @@ -1,3 +1,9 @@ +2008-03-05 Eric Botcazou + + PR ada/35186 + * decl.c (maybe_pad_type): Avoid padding an integral type when + bumping its alignment is sufficient. + 2008-03-02 Ralf Wildenhues * gnatfind.adb, gnatxref.adb: Fix argument parsing typos. diff --git a/gcc/ada/decl.c b/gcc/ada/decl.c index 9945e4e..237d1a4 100644 --- a/gcc/ada/decl.c +++ b/gcc/ada/decl.c @@ -5301,7 +5301,6 @@ maybe_pad_type (tree type, tree size, unsigned int align, off the padding, since we will either be returning the inner type or repadding it. If no size or alignment is specified, use that of the original padded type. */ - if (TREE_CODE (type) == RECORD_TYPE && TYPE_IS_PADDING_P (type)) { if ((!size @@ -5326,7 +5325,6 @@ maybe_pad_type (tree type, tree size, unsigned int align, is not done here (and is only valid for bitfields anyway), show the size isn't changing. Likewise, clear the alignment if it isn't being changed. Then return if we aren't doing anything. */ - if (size && (operand_equal_p (size, orig_size, 0) || (TREE_CODE (orig_size) == INTEGER_CST @@ -5339,6 +5337,19 @@ maybe_pad_type (tree type, tree size, unsigned int align, if (align == 0 && !size) return type; + /* If no size is specified and we have an integral type, and changing + the alignment won't change its size, return a copy of the type + with the specified alignment. */ + if (!size + && INTEGRAL_TYPE_P (type) + && host_integerp (orig_size, 1) + && (TREE_INT_CST_LOW (orig_size) % align) == 0) + { + type = copy_type (type); + TYPE_ALIGN (type) = align; + return type; + } + /* We used to modify the record in place in some cases, but that could generate incorrect debugging information. So make a new record type and name. */ diff --git a/gcc/testsuite/ChangeLog b/gcc/testsuite/ChangeLog index 9824690..cad174b 100644 --- a/gcc/testsuite/ChangeLog +++ b/gcc/testsuite/ChangeLog @@ -1,3 +1,7 @@ +2008-03-05 Eric Botcazou + + * gnat.dg/specs/pack33.ads: New test. + 2008-03-05 Richard Guenther PR tree-optimization/35472 diff --git a/gcc/testsuite/gnat.dg/specs/pack33.ads b/gcc/testsuite/gnat.dg/specs/pack33.ads new file mode 100644 index 0000000..d5255aa --- /dev/null +++ b/gcc/testsuite/gnat.dg/specs/pack33.ads @@ -0,0 +1,27 @@ +-- { dg-do compile } + +package Pack33 is + + Bits : constant := 33; + + type Bits_33 is mod 2 ** Bits; + for Bits_33'Size use Bits; + + type Cluster is record + E0, E1, E2, E3, E4, E5, E6, E7 : Bits_33; + end record; + + for Cluster use record + E0 at 0 range 0 * Bits .. 0 * Bits + Bits - 1; + E1 at 0 range 1 * Bits .. 1 * Bits + Bits - 1; + E2 at 0 range 2 * Bits .. 2 * Bits + Bits - 1; + E3 at 0 range 3 * Bits .. 3 * Bits + Bits - 1; + E4 at 0 range 4 * Bits .. 4 * Bits + Bits - 1; + E5 at 0 range 5 * Bits .. 5 * Bits + Bits - 1; + E6 at 0 range 6 * Bits .. 6 * Bits + Bits - 1; + E7 at 0 range 7 * Bits .. 7 * Bits + Bits - 1; + end record; + + for Cluster'Size use Bits * 8; + +end Pack33; -- 2.7.4