This is the mail archive of the crossgcc@sources.redhat.com mailing list for the crossgcc project.

See the CrossGCC FAQ for lots more information.


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: arm-coff-gcc: -fpack-struct and non-word-aligned ints?


Richard Earnshaw wrote:

On Mon, 2004-07-05 at 13:45, Toralf Lund wrote:


I'm building some code with -fpack-struct on ARM cross-gcc because an old API expects it. This mostly works fine, but it turns out that I sometimes get word-alignment issues that I never saw on the platform I'm porting from (M68k, a completely different compiler.) I sometimes get int-type struct-members at addresses that are not word-aligned, although they are always *halfword*-aligned. In some, but not all (I'm not sure about the exact conditions) cases where this happens, I get into trouble if I assign a value to the variable via it's address. Simply put, it looks like the address is rounded down to the nearest word-boundary, so that if I do something like

struct somestruct {
   short a;
   int b;
};
[ ... ]

struct somestruct value;

[ ... ]
int *bPtr=&value.b;

*bPtr=-100;

the assignment will (at least under certain conditions) not actually write to all 4 bytes of value.b's memory area, but rather value.a and the two first bytes of value.b.

Is this expected to happen?


Yes. You can't take the address of a packed structure member and then
dereference it as a normal pointer. If the underlying hardware/ABI only
supports aligned types then only pointers that are correctly aligned can
be dereferenced.


Fair enough.

I guess that it's logical that it would work on the 68K, then, as 32-bit accesses only need to be aligned to 16-bit words there, as far as I remember.


Is there another option or something that might make the problem go away?



No. GCC doesn't support pointer to unaligned fundamental type.


OK. I also found out why I thought it sometimes worked; in fact I didn't take the address of a basic type in those cases, but of the struct itself instead. In other words, in my above example

struct somestruct *ptr=&value;

ptr->b=-100;


would probably do the right thing. I'm I right in assuming that this will always be allowed?


- T




------ Want more information? See the CrossGCC FAQ, http://www.objsw.com/CrossGCC/ Want to unsubscribe? Send a note to crossgcc-unsubscribe@sources.redhat.com


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