* attribute aligned(4) ignored
@ 2005-07-26 1:04 Chris Lattner
2005-07-26 3:22 ` Ian Lance Taylor
0 siblings, 1 reply; 9+ messages in thread
From: Chris Lattner @ 2005-07-26 1:04 UTC (permalink / raw)
To: gcc-help
Hi All, I'm trying to reduce the alignment of the double in this structure
to 4 bytes (from 8) on Darwin. The goal of doing this is to reduce the
structure to 12 bytes in size. Here is my testcase:
struct Test {
double D __attribute__((aligned(4))); // only 4 bytes, not 8!
int X;
};
int X() {
return sizeof(struct Test); // Should return 12, not 16.
}
Despite my attempt above, the structure is still 16 bytes in size, due to
the tail padding required to pad the structure to ensure 8-byte alignment.
Does anyone know how to reduce the alignment of the double, eliminating
the tail padding?
Thanks,
-Chris
--
http://nondot.org/sabre/
http://llvm.org/
^ permalink raw reply [flat|nested] 9+ messages in thread
* Re: attribute aligned(4) ignored
2005-07-26 1:04 attribute aligned(4) ignored Chris Lattner
@ 2005-07-26 3:22 ` Ian Lance Taylor
2005-07-26 4:58 ` Chris Lattner
0 siblings, 1 reply; 9+ messages in thread
From: Ian Lance Taylor @ 2005-07-26 3:22 UTC (permalink / raw)
To: Chris Lattner; +Cc: gcc-help
Chris Lattner <sabre@nondot.org> writes:
> Hi All, I'm trying to reduce the alignment of the double in this
> structure to 4 bytes (from 8) on Darwin. The goal of doing this is to
> reduce the structure to 12 bytes in size. Here is my testcase:
>
> struct Test {
> double D __attribute__((aligned(4))); // only 4 bytes, not 8!
> int X;
> };
>
> int X() {
> return sizeof(struct Test); // Should return 12, not 16.
> }
>
> Despite my attempt above, the structure is still 16 bytes in size, due
> to the tail padding required to pad the structure to ensure 8-byte
> alignment.
>
> Does anyone know how to reduce the alignment of the double,
> eliminating the tail padding?
How about
double D __attribute__((aligned(4), packed));
Ian
^ permalink raw reply [flat|nested] 9+ messages in thread
* Re: attribute aligned(4) ignored
2005-07-26 3:22 ` Ian Lance Taylor
@ 2005-07-26 4:58 ` Chris Lattner
2005-07-26 5:02 ` corey taylor
2005-07-26 5:25 ` Ian Lance Taylor
0 siblings, 2 replies; 9+ messages in thread
From: Chris Lattner @ 2005-07-26 4:58 UTC (permalink / raw)
To: Ian Lance Taylor; +Cc: gcc-help
On Mon, 25 Jul 2005, Ian Lance Taylor wrote:
> Chris Lattner <sabre@nondot.org> writes:
>> Hi All, I'm trying to reduce the alignment of the double in this
>> structure to 4 bytes (from 8) on Darwin. The goal of doing this is to
>> reduce the structure to 12 bytes in size. Here is my testcase:
>>
>> struct Test {
>> double D __attribute__((aligned(4))); // only 4 bytes, not 8!
>> int X;
>> };
>>
>> int X() {
>> return sizeof(struct Test); // Should return 12, not 16.
>> }
>>
>> Despite my attempt above, the structure is still 16 bytes in size, due
>> to the tail padding required to pad the structure to ensure 8-byte
>> alignment.
>>
>> Does anyone know how to reduce the alignment of the double,
>> eliminating the tail padding?
>
> How about
>
> double D __attribute__((aligned(4), packed));
This is exactly the sort of thing I want to do. My structs can be
arbitrarily complex, and can have a bunch of stuff in them that should not
be packed. This means that I don't want to use attribute packed on the
structure itself, but using it on the member would be fine.
However, when I try this:
struct Test {
double D __attribute__((packed,aligned(4)));
short X;
};
... the struct maintains its 8-byte alignment even though nothing inside
of it requires 8-byte alignment any more. In this particular case, for
example, I want the struct to be 12-bytes, not 10: just reducing the
alignment requirement of the double, without eliminating all intra-struct
padding. This is why I don't think I can use attribute packed on the
struct itself.
Unfortunately, I'm not sure if this is possible, at least without using
'packed' on the struct, then inserting a bunch of dummy members to
explicitly insert the intra-field packing. I hope there is a better way
though, as this is really nasty and fragile.
Thanks,
-Chris
--
http://nondot.org/sabre/
http://llvm.org/
^ permalink raw reply [flat|nested] 9+ messages in thread
* Re: attribute aligned(4) ignored
2005-07-26 4:58 ` Chris Lattner
@ 2005-07-26 5:02 ` corey taylor
2005-07-26 5:04 ` Chris Lattner
2005-07-26 5:25 ` Ian Lance Taylor
1 sibling, 1 reply; 9+ messages in thread
From: corey taylor @ 2005-07-26 5:02 UTC (permalink / raw)
To: Chris Lattner; +Cc: Ian Lance Taylor, gcc-help
Does the placement of the aligned and packed structure member affect the result?
What happens when the double D is at the end of the structure?
corey
On 7/25/05, Chris Lattner <sabre@nondot.org> wrote:
> On Mon, 25 Jul 2005, Ian Lance Taylor wrote:
> > Chris Lattner <sabre@nondot.org> writes:
> >> Hi All, I'm trying to reduce the alignment of the double in this
> >> structure to 4 bytes (from 8) on Darwin. The goal of doing this is to
> >> reduce the structure to 12 bytes in size. Here is my testcase:
> >>
> >> struct Test {
> >> double D __attribute__((aligned(4))); // only 4 bytes, not 8!
> >> int X;
> >> };
> >>
> >> int X() {
> >> return sizeof(struct Test); // Should return 12, not 16.
> >> }
> >>
> >> Despite my attempt above, the structure is still 16 bytes in size, due
> >> to the tail padding required to pad the structure to ensure 8-byte
> >> alignment.
> >>
> >> Does anyone know how to reduce the alignment of the double,
> >> eliminating the tail padding?
> >
> > How about
> >
> > double D __attribute__((aligned(4), packed));
>
> This is exactly the sort of thing I want to do. My structs can be
> arbitrarily complex, and can have a bunch of stuff in them that should not
> be packed. This means that I don't want to use attribute packed on the
> structure itself, but using it on the member would be fine.
>
> However, when I try this:
>
> struct Test {
> double D __attribute__((packed,aligned(4)));
> short X;
> };
>
> ... the struct maintains its 8-byte alignment even though nothing inside
> of it requires 8-byte alignment any more. In this particular case, for
> example, I want the struct to be 12-bytes, not 10: just reducing the
> alignment requirement of the double, without eliminating all intra-struct
> padding. This is why I don't think I can use attribute packed on the
> struct itself.
>
> Unfortunately, I'm not sure if this is possible, at least without using
> 'packed' on the struct, then inserting a bunch of dummy members to
> explicitly insert the intra-field packing. I hope there is a better way
> though, as this is really nasty and fragile.
>
> Thanks,
>
> -Chris
>
> --
> http://nondot.org/sabre/
> http://llvm.org/
>
^ permalink raw reply [flat|nested] 9+ messages in thread
* Re: attribute aligned(4) ignored
2005-07-26 5:02 ` corey taylor
@ 2005-07-26 5:04 ` Chris Lattner
0 siblings, 0 replies; 9+ messages in thread
From: Chris Lattner @ 2005-07-26 5:04 UTC (permalink / raw)
To: corey taylor; +Cc: Ian Lance Taylor, gcc-help
On Tue, 26 Jul 2005, corey taylor wrote:
> Does the placement of the aligned and packed structure member affect the result?
>
> What happens when the double D is at the end of the structure?
The Darwin ABI specifies that doubles that are not the initial element
already have 4-byte alignment.
-Chris
> On 7/25/05, Chris Lattner <sabre@nondot.org> wrote:
>> On Mon, 25 Jul 2005, Ian Lance Taylor wrote:
>>> Chris Lattner <sabre@nondot.org> writes:
>>>> Hi All, I'm trying to reduce the alignment of the double in this
>>>> structure to 4 bytes (from 8) on Darwin. The goal of doing this is to
>>>> reduce the structure to 12 bytes in size. Here is my testcase:
>>>>
>>>> struct Test {
>>>> double D __attribute__((aligned(4))); // only 4 bytes, not 8!
>>>> int X;
>>>> };
>>>>
>>>> int X() {
>>>> return sizeof(struct Test); // Should return 12, not 16.
>>>> }
>>>>
>>>> Despite my attempt above, the structure is still 16 bytes in size, due
>>>> to the tail padding required to pad the structure to ensure 8-byte
>>>> alignment.
>>>>
>>>> Does anyone know how to reduce the alignment of the double,
>>>> eliminating the tail padding?
>>>
>>> How about
>>>
>>> double D __attribute__((aligned(4), packed));
>>
>> This is exactly the sort of thing I want to do. My structs can be
>> arbitrarily complex, and can have a bunch of stuff in them that should not
>> be packed. This means that I don't want to use attribute packed on the
>> structure itself, but using it on the member would be fine.
>>
>> However, when I try this:
>>
>> struct Test {
>> double D __attribute__((packed,aligned(4)));
>> short X;
>> };
>>
>> ... the struct maintains its 8-byte alignment even though nothing inside
>> of it requires 8-byte alignment any more. In this particular case, for
>> example, I want the struct to be 12-bytes, not 10: just reducing the
>> alignment requirement of the double, without eliminating all intra-struct
>> padding. This is why I don't think I can use attribute packed on the
>> struct itself.
>>
>> Unfortunately, I'm not sure if this is possible, at least without using
>> 'packed' on the struct, then inserting a bunch of dummy members to
>> explicitly insert the intra-field packing. I hope there is a better way
>> though, as this is really nasty and fragile.
>>
>> Thanks,
>>
>> -Chris
>>
>> --
>> http://nondot.org/sabre/
>> http://llvm.org/
>>
>
-Chris
--
http://nondot.org/sabre/
http://llvm.org/
^ permalink raw reply [flat|nested] 9+ messages in thread
* Re: attribute aligned(4) ignored
2005-07-26 4:58 ` Chris Lattner
2005-07-26 5:02 ` corey taylor
@ 2005-07-26 5:25 ` Ian Lance Taylor
2005-07-26 5:57 ` Chris Lattner
1 sibling, 1 reply; 9+ messages in thread
From: Ian Lance Taylor @ 2005-07-26 5:25 UTC (permalink / raw)
To: Chris Lattner; +Cc: gcc-help
Chris Lattner <sabre@nondot.org> writes:
> > How about
> >
> > double D __attribute__((aligned(4), packed));
>
> This is exactly the sort of thing I want to do. My structs can be
> arbitrarily complex, and can have a bunch of stuff in them that should
> not be packed. This means that I don't want to use attribute packed
> on the structure itself, but using it on the member would be fine.
>
> However, when I try this:
>
> struct Test {
> double D __attribute__((packed,aligned(4)));
> short X;
> };
>
> ... the struct maintains its 8-byte alignment even though nothing
> inside of it requires 8-byte alignment any more.
When I try that with a powerpc-eabi compiler, it appears to generates
a struct with a size of 12 bytes and an alignment of 4 bytes. Do you
not see that with a Darwin compiler? What target are you configuring
for? What sources are you using?
Ian
^ permalink raw reply [flat|nested] 9+ messages in thread
* Re: attribute aligned(4) ignored
2005-07-26 5:25 ` Ian Lance Taylor
@ 2005-07-26 5:57 ` Chris Lattner
2005-07-26 6:27 ` Ian Lance Taylor
0 siblings, 1 reply; 9+ messages in thread
From: Chris Lattner @ 2005-07-26 5:57 UTC (permalink / raw)
To: Ian Lance Taylor; +Cc: gcc-help
On Tue, 25 Jul 2005, Ian Lance Taylor wrote:
>> ... the struct maintains its 8-byte alignment even though nothing
>> inside of it requires 8-byte alignment any more.
>
> When I try that with a powerpc-eabi compiler, it appears to generates
> a struct with a size of 12 bytes and an alignment of 4 bytes. Do you
> not see that with a Darwin compiler? What target are you configuring
> for? What sources are you using?
This is a powerpc-darwin specific issue I believe. The Darwin ABI states
(roughly) that doubles have 4-byte alignment, unless they are the first
element of a structure (in which they have 8-byte alignment). I think
this is a holdover from AIX compatibility.
It is my guess that this ABI rule is overruling the user request, but I
don't really know how to go about verifying this, or working around it :(
-Chris
--
http://nondot.org/sabre/
http://llvm.org/
^ permalink raw reply [flat|nested] 9+ messages in thread
* Re: attribute aligned(4) ignored
2005-07-26 5:57 ` Chris Lattner
@ 2005-07-26 6:27 ` Ian Lance Taylor
2005-07-26 6:44 ` Chris Lattner
0 siblings, 1 reply; 9+ messages in thread
From: Ian Lance Taylor @ 2005-07-26 6:27 UTC (permalink / raw)
To: Chris Lattner; +Cc: gcc-help
Chris Lattner <sabre@nondot.org> writes:
> On Tue, 25 Jul 2005, Ian Lance Taylor wrote:
> >> ... the struct maintains its 8-byte alignment even though nothing
> >> inside of it requires 8-byte alignment any more.
> >
> > When I try that with a powerpc-eabi compiler, it appears to generates
> > a struct with a size of 12 bytes and an alignment of 4 bytes. Do you
> > not see that with a Darwin compiler? What target are you configuring
> > for? What sources are you using?
>
> This is a powerpc-darwin specific issue I believe. The Darwin ABI
> states (roughly) that doubles have 4-byte alignment, unless they are
> the first element of a structure (in which they have 8-byte
> alignment). I think this is a holdover from AIX compatibility.
>
> It is my guess that this ABI rule is overruling the user request, but
> I don't really know how to go about verifying this, or working around
> it :(
OK. From the source code, that seems to be happening in
rs6000_special_round_type_align (config/rs6000/rs6000.c), which is
called by ROUND_TYPE_ALIGN (config/rs6000/darwin.h), which is called
by finalize_record_size (stor-layout.c).
rs6000_special_round_type_align is given the computed alignment and
the user specified alignment. It appears to always force a maximum of
64.
Tracking this back through time and across files, it appears to have
been introduced here:
Mon Apr 22 12:00:46 1996 David Edelsohn <edelsohn@mhpcc.edu>
* rs6000.h (BIGGEST_FIELD_ALIGNMENT): Delete.
(ADJUST_FIELD_ALIGN, ROUND_TYPE_ALIGN): Define.
when it looked like this:
/* AIX increases natural record alignment to doubleword if the first
field is an FP double while the FP fields remain word aligned. */
#define ROUND_TYPE_ALIGN(STRUCT, COMPUTED, SPECIFIED) \
((TREE_CODE (STRUCT) == RECORD_TYPE \
|| TREE_CODE (STRUCT) == UNION_TYPE \
|| TREE_CODE (STRUCT) == QUAL_UNION_TYPE) \
&& DECL_MODE (TYPE_FIELDS (STRUCT)) == DFmode \
? MAX (MAX ((COMPUTED), (SPECIFIED)), BIGGEST_ALIGNMENT) \
: MAX ((COMPUTED), (SPECIFIED)))
The code now looks like this for a struct which begins with a double:
return MAX (MAX (computed, specified), 64);
This ignores the attribute ((packed)), and I don't see why it is
correct to do so.
Ian
^ permalink raw reply [flat|nested] 9+ messages in thread
* Re: attribute aligned(4) ignored
2005-07-26 6:27 ` Ian Lance Taylor
@ 2005-07-26 6:44 ` Chris Lattner
0 siblings, 0 replies; 9+ messages in thread
From: Chris Lattner @ 2005-07-26 6:44 UTC (permalink / raw)
To: Ian Lance Taylor; +Cc: gcc-help
On Tue, 25 Jul 2005, Ian Lance Taylor wrote:
> The code now looks like this for a struct which begins with a double:
>
> return MAX (MAX (computed, specified), 64);
>
> This ignores the attribute ((packed)), and I don't see why it is
> correct to do so.
I totally agree. Thanks a LOT for the help and the analysis. I've filed
this as GCC PR23071.
-Chris
--
http://nondot.org/sabre/
http://llvm.org/
^ permalink raw reply [flat|nested] 9+ messages in thread
end of thread, other threads:[~2005-07-26 6:44 UTC | newest]
Thread overview: 9+ messages (download: mbox.gz / follow: Atom feed)
-- links below jump to the message on this page --
2005-07-26 1:04 attribute aligned(4) ignored Chris Lattner
2005-07-26 3:22 ` Ian Lance Taylor
2005-07-26 4:58 ` Chris Lattner
2005-07-26 5:02 ` corey taylor
2005-07-26 5:04 ` Chris Lattner
2005-07-26 5:25 ` Ian Lance Taylor
2005-07-26 5:57 ` Chris Lattner
2005-07-26 6:27 ` Ian Lance Taylor
2005-07-26 6:44 ` Chris Lattner
This is a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox;
as well as URLs for read-only IMAP folder(s) and NNTP newsgroup(s).