This is the mail archive of the
gcc@gcc.gnu.org
mailing list for the GCC project.
Re: [PATCH] C undefined behavior fix
- From: Laurent Guerby <guerby at acm dot org>
- To: dewar at gnat dot com
- Cc: paulus at samba dot org, gcc at gcc dot gnu dot org,linux-kernel at vger dot kernel dot org, trini at kernel dot crashing dot org,velco at fadata dot bg
- Date: Sun, 06 Jan 2002 14:41:22 +0100
- Subject: Re: [PATCH] C undefined behavior fix
- References: <20020106130556.99E79F2FF5@nile.gnat.com>
dewar@gnat.com wrote:
> pragma Atomic in Ada (volatile gets close in C, but is not close enough) will
> ensure a byte store in practice, but may not ensure byte reads.
I see no distinction between read and write in the text of the Ada standard.
Also I think if you declare a byte array with Atomic_Component
and Volatile_Component and that the compiler accepts it for its
target architecture, then the compiler is required to generate
a byte read and store for each occurence in the text source.
From C.6:
15 For an atomic object (including an atomic component) all reads and
updates of the object as a whole are indivisible.
16 For a volatile object all reads and updates of the object as a
whole are
performed directly to memory.
20 {external effect (volatile/atomic objects) [partial]} The external
effect of a program (see 1.1.3) is defined to include each read and
update of
a volatile or atomic object. The implementation shall not generate any
memory
reads or updates of atomic or volatile objects other than those specified by
the program.
In my exemple byte array, if I say X := T (I) I don't see how a conformant
compiler accepting the declaration could generate anything other than
one and exactly one byte read. Per 20 it has no right to read T (I+1) or
T(I-1)
since they are "other" objects (components to be pedantic).
Do you agree with interpretation? Now, I haven't checked what GNAT does
there
(what's accepted and what code is generated) which is of course the
interesting
part :).
--
Laurent Guerby <guerby@acm.org>