>From my original mail here is the code I get: .globl _Z8FunctionR2sA .type _Z8FunctionR2sA, @function _Z8FunctionR2sA: link.w %a6,#0 move.l 8(%a6),%a0 | A, A move.l 4(%a0),%d0 | <variable>.C, <variable>.C unlk %a6 rts I am really getting a load of A.C but not of A.B. They are both volatile members. Should they not both be loading? -----Original Message----- From: gcc-help-owner@xxxxxxxxxxx [mailto:gcc-help-owner@xxxxxxxxxxx] On Behalf Of Ian Lance Taylor Sent: Friday, August 26, 2005 9:58 AM To: Daniel Berlin Cc: Steve Zook; gcc-help@xxxxxxxxxxx Subject: Re: volatile const structure members in C++ Daniel Berlin <dberlin@xxxxxxxxxxx> writes: > On Thu, 2005-08-25 at 21:24 -0700, Steve Zook wrote: > > Using m68k-elf-gcc with either revision 3.3.3 or 3.4.4, I compile > > the following test program (as a C++ program) at -O2 to an object file: > > > > > > struct sA { unsigned volatile const B; > > unsigned volatile C; > > unsigned const D; > > unsigned E; }; > > void Function( sA & A ) { A.B; A.C; A.D; A.E; } > > > > > > The object file I get looks like (edited for brevity): > > > > .globl _Z8FunctionR2sA > > .type _Z8FunctionR2sA, @function > > _Z8FunctionR2sA: > > link.w %a6,#0 > > move.l 8(%a6),%a0 | A, A > > This is a load of A.B. It's the first member of the structure, and > thus, is at offset 0, and is also known as "A". No, that's a load of the address of A--i.e., loading the argument into a register. On the m68k arguments are passed on the stack. To actually load A.B, rather than just the address of A.B, would require a following move.l 0(%a0),.... Ian