On Sat, Jan 5, 2013 at 10:13 PM, Janne Blomqvist
<blomqvist.ja...@gmail.com> wrote:
> On Sat, Jan 5, 2013 at 5:35 PM, Richard Biener
> <richard.guent...@gmail.com> wrote:
>> On Fri, Jan 4, 2013 at 11:35 PM, Andreas Schwab <sch...@linux-m68k.org> 
>> wrote:
>>> Janne Blomqvist <blomqvist.ja...@gmail.com> writes:
>>>
>>>> diff --git a/libgfortran/io/file_pos.c b/libgfortran/io/file_pos.c
>>>> index c8ecc3a..bf2250a 100644
>>>> --- a/libgfortran/io/file_pos.c
>>>> +++ b/libgfortran/io/file_pos.c
>>>> @@ -140,15 +140,21 @@ unformatted_backspace (st_parameter_filepos *fpp, 
>>>> gfc_unit *u)
>>>>       }
>>>>        else
>>>>       {
>>>> +       uint32_t u32;
>>>> +       uint64_t u64;
>>>>         switch (length)
>>>>           {
>>>>           case sizeof(GFC_INTEGER_4):
>>>> -           reverse_memcpy (&m4, p, sizeof (m4));
>>>> +           memcpy (&u32, p, sizeof (u32));
>>>> +           u32 = __builtin_bswap32 (u32);
>>>> +           m4 = *(GFC_INTEGER_4*)&u32;
>>>
>>> Isn't that an aliasing violation?
>>
>> It looks like one.  Why not simply do
>>
>>    m4 = (GFC_INTEGER_4) u32;
>>
>> ?  I suppose GFC_INTEGER_4 is always the same size as uint32_t but signed?
>
> Yes, GFC_INTEGER_4 is a typedef for int32_t. As for why I didn't do
> the above, C99 6.3.1.3(3) says that if the unsigned value is outside
> the range of the signed variable, the result is
> implementation-defined. Though I suppose the sensible
> "implementation-defined behavior" in this case on a two's complement
> target is to just do a bitwise copy.

As libgfortran is a target library and thus always compiled by GCC you
can rely on GCCs documented implementation-defined behavior here
(which is to do bitwise re-interpretation).  No need to obfuscate the
code more than necessary.

Richard.

> Anyway, to be really safe one could use memcpy instead; the compiler
> optimizes small fixed size memcpy's just fine. Updated patch attached.
>
>
> --
> Janne Blomqvist

Reply via email to