Date: Tue, 6 Mar 2001 16:09:41 +1000 (EST) From: Tony Griffiths <tonyg@OntheNet.com.au> To: User Raymond <raymond@one.com.au> Cc: <freebsd-alpha@FreeBSD.ORG> Subject: Re: Strange results from compiled alpha code Message-ID: <Pine.BSF.4.30.0103061558420.54978-100000@lancia.onthenet.com.au> In-Reply-To: <200103060301.NAA24010@gw.one.com.au>
next in thread | previous in thread | raw e-mail | index | archive | help
Ray, My quess is that you are running into an alignment problem! In the case you give below, the 'short len' is misaligned on an odd byte boundary. This might be the cause of the problem... I know that with DEC/Compaq cc there is a #pragma and also a compiler switch to assume_unaligned pointers for cases like this. The code that is generated is awfull but the end result is the correct value loaded into the register. I don't know that the [g]cc equivalent switch is but presume that there is one! Alternatively, change the code slightly to ensure that the 'mumpspc' pointer is always incremented by an even number of bytes. eg. mumpspc += ( ((cstring*)mumpspc)->len + sizeof(short) + 2 ) & ~1; /* bump pc and round up */ Tony ----------------------------------------------------------------- On Tue, 6 Mar 2001, User Raymond wrote: > Subj: Strange results from compiled alpha code > To: freebsd-alpha@FreeBSD.org > From: raymond@one.com.au > > This refers to FreeBSD 4.2-RELEASE alpha running on an AS200. > > Sorry for the size of this post - I have attempted to create a small > demonstration program but can't seem to. > > ...anyway, consider the following piece of c source code: > > > typedef struct CSTRING // our string type > { short len; // length of it > u_char buf[32768]; // and the content > } cstring; // end counted string > > extern u_char *mumpspc; // mumps prog pointer > > mumpspc = mumpspc + > ((cstring *)mumpspc)->len + > sizeof(short) + 1; // point past the string > > and the following gdb output: > > 975 mumpspc = mumpspc + > (gdb) p mumpspc > $1 = (u_char *) 0x120096c7f "\002" > (gdb) p mumpspc + ((cstring *)mumpspc)->len + sizeof(short) + 1 > $2 = (u_char *) 0x120096c84 "<\001" > (gdb) set mumpspc = mumpspc + ((cstring *)mumpspc)->len + sizeof(short) + 1 > (gdb) p mumpspc > $3 = (u_char *) 0x120096c84 "<\001" > (gdb) set mumpspc = 0x120096c7f > (gdb) p mumpspc > $4 = (u_char *) 0x120096c7f "\002" > (gdb) s > 978 break; > (gdb) p mumpspc > $5 = (u_char *) 0x12009a982 "" > (gdb) set mumpspc = 0x120096c7f > (gdb) p mumpspc[0] > $6 = 2 '\002' > (gdb) p mumpspc[1] > $7 = 0 '\000' > (gdb) p mumpspc[2] > $8 = 52 '4' > (gdb) p mumpspc[3] > $9 = 50 '2' > (gdb) p mumpspc[4] > $10 = 0 '\000' > (gdb) p mumpspc[5] > $11 = 60 '<' > > > It appears that the "set" is ok when interpreted by gdb but the compiled > code gives the wrong answer - it seems to ignore the '\000' at mumpspc[1]. > > This code works OK on the x86 architecture (FreeBSD and linux); doesn't > work with linux alpha either and (yes) I know it's horrible code. > > but - any ideas? > > Ray Newman > > To Unsubscribe: send mail to majordomo@FreeBSD.org > with "unsubscribe freebsd-alpha" in the body of the message > To Unsubscribe: send mail to majordomo@FreeBSD.org with "unsubscribe freebsd-alpha" in the body of the message
Want to link to this message? Use this URL: <https://mail-archive.FreeBSD.org/cgi/mid.cgi?Pine.BSF.4.30.0103061558420.54978-100000>