mike@APOLLO.COM (09/21/89)
The following simple C program shows a bug in gcc version 1.35 code generation :
volatile
struct foo {
char a, b, c;
};
tst()
{
struct foo *foo;
foo = (struct foo *) 1234;
foo->a = foo->c;
foo->a = foo->c;
foo->a = foo->c;
}
The assembly output (68K) is :
#NO_APP
gcc_compiled.:
.text
.even
.globl tst
tst:
link a6,#0
movew #1234,a0
moveb 1236:w,a0@
unlk a6
rts
Since the structure is marked as volatile the compiler should not be removing
redundant assignments. A simple work around that I have been using is to mark
the pointer itself as volatile (eg. volatile struct foo *foo; ).
Mike Schloss
mike@apollo.hp.com
decvax!apollo!mikerfg@ics.uci.edu (Ronald Guilmette) (09/22/89)
In article <8909201748.AA10157@xuucp.ch.apollo.com> mike@APOLLO.COM writes: >The following simple C program shows a bug in gcc version 1.35 code generation : > > volatile > struct foo { > char a, b, c; > }; ... >Since the structure is marked as volatile... I'm not 100% sure, but I believe that this is *not* a bug. The way in which volatile is used in the example above causes it to apply to nothing. Specifically, it does *not* apply to the "struct type" itself. If however you had said something like: volatile struct foo { char a,b,c; } foo_var; then I believe that the volatile would have applied to the variable called foo_var (and nothing else). // rfg