2009/5/22 Ian Lance Taylor <iant@xxxxxxxxxx>: > Mohamed Shafi <shafitvm@xxxxxxxxx> 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 >