Minimum target alignment for a datatype

Chris Lattner CLATTNER@apple.com
Fri Jul 22 19:38:00 GMT 2005


On Jul 22, 2005, at 12:33 PM, Mike Stump wrote:

> On Friday, July 22, 2005, at 11:07 AM, Chris Lattner wrote:
>
>> I'm trying to determine (in target-independent code) what the  
>> *minimum* target alignment of a type is.  For example, on darwin,  
>> double's are normally 4-byte aligned, but are 8-byte aligned in  
>> some cases (e.g. when they are the first element of a struct).   
>> TYPE_ALIGN on a double returns 8 bytes, is there any way to find  
>> out that they may end up being aligned to a 4-byte boundary?
>>
>
> I'm having a hard time with the simplicity of your question:

I don't know if there is a good answer, unfortunately.

> /* The alignment necessary for objects of this type.
>    The value is an int, measured in bits.  */
> #define TYPE_ALIGN(NODE) (TYPE_CHECK (NODE)->type.align)

On darwin, for a 'double' this will return 64.

> /* 1 if the alignment for this type was requested by "aligned"  
> attribute,
>    0 if it is the default for this type.  */
> #define TYPE_USER_ALIGN(NODE) (TYPE_CHECK (NODE)->type.user_align)

I'm not interested in user alignment.

> /* The alignment for NODE, in bytes.  */
> #define TYPE_ALIGN_UNIT(NODE) (TYPE_ALIGN (NODE) / BITS_PER_UNIT)

This is just 64/8.

> ?  Certainly, I don't expect that to answer your question, but I  
> don't understand why.

The problem I am running into is that the double in this struct is  
only 4-byte aligned on darwin:

struct X {  int A; double B; };

This is modified by things like ADJUST_FIELD_ALIGN and  
ROUND_TYPE_ALIGN.  As such, I don't think there is a way to get this  
alignment in a target-independent way.  Does that sound right?

Thanks!

-Chris



More information about the Gcc mailing list