This is the mail archive of the gcc-help@gcc.gnu.org mailing list for the GCC project.


Index Nav: [Date Index] [Subject Index] [Author Index] [Thread Index]
Message Nav: [Date Prev] [Date Next] [Thread Prev] [Thread Next]
Other format: [Raw text]

Re: structure packing


2009/5/22 Ian Lance Taylor <iant@google.com>:
> Mohamed Shafi <shafitvm@gmail.com> writes:
>
>> The below code is compiled using a private port based on GCC 4.1.1.
>>
>> struct data {
>> ???? int wdata;
>> ???? int rdata;
>> ?};// __attribute__((__packed__));
>>
>> typedef struct data data;
>> #define data_p (*(volatile data *)(0))
>>
>> int main(void)
>> {
>> ? data_p.wdata = data_p.rdata;
>> }
>>
>> For the above source code without the 'packed' attribute the assembly
>> code is generated with word-aligned access. But with packed attribute
>> enabled the assembly code is generated with byte access. When i looked
>> into x86 compiler i find that the assembly code generated is same
>> irrespective of whether the attribute is provided or not.
>
> I don't see this. ?When I compile the above test case (i.e., the struct
> is not packed) on x86, I see word accesses.
>
         Sorry for the confusion. What i meant was that irrespective
of whether the structure is packed or not the code generated is for
word access. It should be because the compiler is built with
STRICT_ALIGNMENT = 0. But in my compiler it is byte access for packed
structure and my compiler is built with STRICT_ALIGNMENT = 1.

>> In case,
>> 1) if the packing is enabled and all the data elements inside the
>> struct are by default word-aligned (all the 32bit integers) is it
>> possible to generate word-aligned assembly code?
>
> No. ?The packed attribute tells the compiler that the struct may be
> misaligned.

    I thought so. With STRICT_ALIGNMENT = 1 the compiler makes sure
that all access are aligned. So irrespective of whether the structure
is aligned or not to be safe it generates byte access. Am i right?
If so in the given example the base address is 0 and the offset will
be known to the compiler. If the compiler is aware of these two
information can't it decide whether the structure is aligned or not?

Shafi
>
>> 2) Packing is enabled for a structure with different data elements.
>>
>> i.e.
>> struct data {
>> ???? int wdata;
>> ??? char t;
>> ???? int rdata;
>> ?} __attribute__((__packed__));
>>
>> Is it possible to generate code like:
>> wdata -> word aligned access.
>> rdata -> byte aligned access.
>
> No. ?You could try putting a packed struct inside the unpacked struct,
> though; I don't know whether or not that would work.
>
> Ian
>


Index Nav: [Date Index] [Subject Index] [Author Index] [Thread Index]
Message Nav: [Date Prev] [Date Next] [Thread Prev] [Thread Next]