This is the mail archive of the
gcc-patches@gcc.gnu.org
mailing list for the GCC project.
Re: three problems with stor-layout.c.
- From: Kenneth Zadeck <zadeck at naturalbridge dot com>
- To: Richard Biener <rguenther at suse dot de>
- Cc: Eric Botcazou <ebotcazou at adacore dot com>, gcc-patches at gcc dot gnu dot org, Richard Sandiford <rdsandiford at googlemail dot com>, Mike Stump <mikestump at comcast dot net>
- Date: Fri, 22 Nov 2013 08:58:06 -0500
- Subject: Re: three problems with stor-layout.c.
- Authentication-results: sourceware.org; auth=none
- References: <528CF1F4 dot 1000906 at naturalbridge dot com> <alpine dot LNX dot 2 dot 00 dot 1311211510060 dot 8615 at zhemvz dot fhfr dot qr> <1653644 dot knaADCop9e at polaris> <528EC052 dot 7050604 at naturalbridge dot com> <alpine dot LNX dot 2 dot 00 dot 1311220958320 dot 8615 at zhemvz dot fhfr dot qr>
committed as revision 205260.
thanks
kenny
On 11/22/2013 03:58 AM, Richard Biener wrote:
On Thu, 21 Nov 2013, Kenneth Zadeck wrote:
Richi,
Here is the patch. As you can see, i chose the unsigned option.
It was bootstrapped and tested on x86 with all languages including ada.
Ok to commit?
Ok.
Thanks,
Richard.
kenny
2013-11-21 zadeck@naturalbridge.com
* store-layout.c
(place-field): Fix hwi test and accessor mismatch.
On 11/21/2013 11:07 AM, Eric Botcazou wrote:
I think most of these are because in the past (yes I have fixed that!!)
all 'sizetype' constants were sign-extended (and the signedness,
that is, TYPE_UNSIGNED (sizetype), was frontend dependend (ugh) and
then later true, thus unsigned).
So I think all _SIZE stuff should check fits_uhwi_p and be used as
uhwi. But that may have ripple-down effects, so consistently
using fits_shwi_p and using as shwi is also fine (it just restricts
the maximum values we accept(?)).
And please make sure to test Ada if you're tweaking this, it's fragile
stuff.
Index: gcc/stor-layout.c
===================================================================
--- gcc/stor-layout.c (revision 205259)
+++ gcc/stor-layout.c (working copy)
@@ -1204,7 +1204,7 @@ place_field (record_layout_info rli, tre
unsigned int type_align = TYPE_ALIGN (type);
tree dsize = DECL_SIZE (field);
HOST_WIDE_INT field_size = tree_to_uhwi (dsize);
- HOST_WIDE_INT offset = tree_to_shwi (rli->offset);
+ HOST_WIDE_INT offset = tree_to_uhwi (rli->offset);
HOST_WIDE_INT bit_offset = tree_to_shwi (rli->bitpos);
#ifdef ADJUST_FIELD_ALIGN
@@ -1248,7 +1248,7 @@ place_field (record_layout_info rli, tre
unsigned int type_align = TYPE_ALIGN (type);
tree dsize = DECL_SIZE (field);
HOST_WIDE_INT field_size = tree_to_uhwi (dsize);
- HOST_WIDE_INT offset = tree_to_shwi (rli->offset);
+ HOST_WIDE_INT offset = tree_to_uhwi (rli->offset);
HOST_WIDE_INT bit_offset = tree_to_shwi (rli->bitpos);
#ifdef ADJUST_FIELD_ALIGN
@@ -1304,7 +1304,7 @@ place_field (record_layout_info rli, tre
&& !integer_zerop (DECL_SIZE (field))
&& !integer_zerop (DECL_SIZE (rli->prev_field))
&& tree_fits_shwi_p (DECL_SIZE (rli->prev_field))
- && tree_fits_shwi_p (TYPE_SIZE (type))
+ && tree_fits_uhwi_p (TYPE_SIZE (type))
&& simple_cst_equal (TYPE_SIZE (type), TYPE_SIZE (prev_type)))
{
/* We're in the middle of a run of equal type size fields; make