Skip site navigation (1)Skip section navigation (2)
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>