volatile const structure members in C++

Steven L. Zook SLZook@Qualstar.com
Fri Aug 26 17:14:00 GMT 2005


>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@gcc.gnu.org [mailto:gcc-help-owner@gcc.gnu.org] On
Behalf Of Ian Lance Taylor
Sent: Friday, August 26, 2005 9:58 AM
To: Daniel Berlin
Cc: Steve Zook; gcc-help@gcc.gnu.org
Subject: Re: volatile const structure members in C++

Daniel Berlin <dberlin@dberlin.org> 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



More information about the Gcc-help mailing list