libgo patch committed: Update to current version of Go library

Ian Lance Taylor iant@google.com
Fri Feb 8 16:21:00 GMT 2013


On Fri, Feb 8, 2013 at 7:23 AM, Uros Bizjak <ubizjak@gmail.com> wrote:
> On Fri, Feb 8, 2013 at 4:02 PM, Ian Lance Taylor <iant@google.com> wrote:
>
>>>>> I did hit one new error that seems related:
>>>>>
>>>>> --- FAIL: TestChtimes (0.00 seconds)
>>>>> os_test.go:681:         AccessTime didn't go backwards;
>>>>> was={63495872497 0 47130825733376}, after={63495872497 0
>>>>> 47130825733376}
>>>>> os_test.go:685:         ModTime didn't go backwards; was={63495872497
>>>>> 0 47130825733376}, after={63495872497 0 47130825733376}
>>>>> FAIL
>>>>> FAIL: os
>>>>
>>>> Something has gone wrong in the file
>>>> libgo/go/syscall/libcall_linux_utimesnano.go.  The function in that
>>>> file will try utimensat.  On your system that should return ENOSYS.
>>>> In that case the function should convert the times and call utimes.
>>>> The code looks OK to me but there may be something wrong with it.  It
>>>> looks like the file times didn't change at all.
>>>
>>> From the strace -f, it looks that utimes is not called at all in
>>> between two relevant stats:
>>
>> Strange.  What I would expect to happen is that the function in
>> libcall_linux_utimesnano.go will call utimensat.  Since your system
>> does not have that function, that will call the stub routine in
>> libgo/runtime/go-nosys.c, which will return -1 with errno set to
>> ENOSYS.  The code in libcall_linux_utimensnano.go will see the ENOSYS
>> error and continue on to call utime.  Clearly something is going wrong
>> in that sequence, but I don't know what.
>
> Somwhow expected, following "patch" makes test to pass:
>
> --cut here--
> Index: go/syscall/libcall_linux_utimesnano.go
> ===================================================================
> --- go/syscall/libcall_linux_utimesnano.go      (revision 195879)
> +++ go/syscall/libcall_linux_utimesnano.go      (working copy)
> @@ -14,10 +14,10 @@
>         if len(ts) != 2 {
>                 return EINVAL
>         }
> -       err = utimensat(_AT_FDCWD, path,
> (*[2]Timespec)(unsafe.Pointer(&ts[0])), 0)
> -       if err != ENOSYS {
> -               return err
> -       }
> +//     err = utimensat(_AT_FDCWD, path,
> (*[2]Timespec)(unsafe.Pointer(&ts[0])), 0)
> +//     if err != ENOSYS {
> +//             return err
> +//     }
>         // If the utimensat syscall isn't available (utimensat was
> added to Linux
>         // in 2.6.22, Released, 8 July 2007) then fall back to utimes
>         var tv [2]Timeval
> --cut here--
>
> 11491 stat("/tmp/_Go_TestChtimes581938713", {st_mode=S_IFREG|0600,
> st_size=13, ...}) = 0
> 11491 rt_sigprocmask(SIG_BLOCK, NULL, [], 8) = 0
> 11491 utimes("/tmp/_Go_TestChtimes581938713", {{1360336212, 0},
> {1360336212, 0}}) = 0
> 11491 rt_sigprocmask(SIG_BLOCK, NULL, [], 8) = 0
> 11491 stat("/tmp/_Go_TestChtimes581938713", {st_mode=S_IFREG|0600,
> st_size=13, ...}) = 0
>
> It looks to me that gcc miscompiles this part for some reason...?

A miscompilation seems fairly unlikely.  I expect it's something very
obvious, I'm just not seeing it.  Can you verify that the code reaches
the stub definition of utimensat in libgo/runtime/go-nosys.c?

In fact, maybe if you just send me the test executable it will fail on
my system.  Seems worth a try.

Ian



More information about the Gcc-patches mailing list