This is the mail archive of the
gcc@gcc.gnu.org
mailing list for the GCC project.
Re: PATCH: `__norestrict' type qualifier
Chip Salzenberg wrote:
> > Still doesn't get us a definition of alignment.
> Granted. *sigh*
Oh good.
After all I've said, I don't think we need worry about this.
The C9X draft defines alignment already:
3.1
[#1] alignment
requirement that objects of a particular type be located on
storage boundaries with addresses that are particular
multiples of a byte address
Conversions between different pointer types are defined thus (though
access through the wrong pointer type is undefined):
6.3.2.3 Pointers
[#7] A pointer to an object or incomplete type may be
converted to a pointer to a different object or incomplete
type. If the resulting pointer is not correctly aligned50)
for the pointed-to type, the behavior is undefined.
Otherwise, when converted back again, the result shall
compare equal to the original pointer. When a pointer to an
object is converted to a pointer to a character type, the
result points to the lowest addressed byte of the object.
That brings on a new proposed definition. Remember this is all so GCC can
generate good code, that's our excuse for discussing it on this list... ;-)
I think this fixes every problem raised so far:
For conversion to and from other pointer types, pointers of type
`__norestrict B *', for all B, are subject to the same guarantees and
restrictions as pointers of type `B *'. See 6.3.2.3 [#7].
In particular, if the result of converting a pointer to `__norestrict B
*' is not correctly aligned for the type B, the behaviour is undefined.
Reading through a pointer of type `__norestrict B *' shall have the
same, implementation-defined behaviour as converting the pointer to
type `const char *', copying sizeof B characters from that address into
field `a' of a temporary of type `union { char a [sizeof B]; B b; }',
and then reading field `b'.
Writing through a pointer of type `__norestrict B *' shall have the
same, implementation-defined behaviour as writing to field `b' of a
temporary of type `union { char a [sizeof B]; B b; }', converting the
pointer to type `char *', and then copying sizeof B characters to that
address from field `a'.
The order of character copies is not defined -- they may occur
simultaneously, independently or in any combination. A volatile
qualification on B does not change this. A const qualification is
honoured by disallowing writes in the usual way.
-- Jamie