This patch by Tony Reix adds some AIX updates, notably for the recent
1.9 update.  Bootstrapped and ran Go testsuite on x86_64-pc-linux-gnu.
Committed to mainline.

Ian
Index: gcc/go/gofrontend/MERGE
===================================================================
--- gcc/go/gofrontend/MERGE     (revision 252991)
+++ gcc/go/gofrontend/MERGE     (working copy)
@@ -1,4 +1,4 @@
-5fb74cd7192123a9ea06dcae0d5d8d0b3538db8f
+90fe3da36d904b62d47c00ee40eef4fd2693a5da
 
 The first line of this file holds the git revision number of the last
 merge done from the gofrontend repository.
Index: libgo/go/cmd/go/internal/base/signal_unix.go
===================================================================
--- libgo/go/cmd/go/internal/base/signal_unix.go        (revision 252767)
+++ libgo/go/cmd/go/internal/base/signal_unix.go        (working copy)
@@ -2,7 +2,7 @@
 // Use of this source code is governed by a BSD-style
 // license that can be found in the LICENSE file.
 
-// +build darwin dragonfly freebsd linux nacl netbsd openbsd solaris
+// +build aix darwin dragonfly freebsd linux nacl netbsd openbsd solaris
 
 package base
 
Index: libgo/go/internal/poll/export_posix_test.go
===================================================================
--- libgo/go/internal/poll/export_posix_test.go (revision 252767)
+++ libgo/go/internal/poll/export_posix_test.go (working copy)
@@ -2,7 +2,7 @@
 // Use of this source code is governed by a BSD-style
 // license that can be found in the LICENSE file.
 
-// +build darwin dragonfly freebsd linux nacl netbsd openbsd solaris windows
+// +build aix darwin dragonfly freebsd linux nacl netbsd openbsd solaris 
windows
 
 // Export guts for testing on posix.
 // Since testing imports os and os imports internal/poll,
Index: libgo/go/internal/poll/fd_poll_runtime.go
===================================================================
--- libgo/go/internal/poll/fd_poll_runtime.go   (revision 252767)
+++ libgo/go/internal/poll/fd_poll_runtime.go   (working copy)
@@ -2,7 +2,7 @@
 // Use of this source code is governed by a BSD-style
 // license that can be found in the LICENSE file.
 
-// +build darwin dragonfly freebsd linux netbsd openbsd windows solaris
+// +build aix darwin dragonfly freebsd linux netbsd openbsd windows solaris
 
 package poll
 
Index: libgo/go/internal/poll/fd_posix.go
===================================================================
--- libgo/go/internal/poll/fd_posix.go  (revision 252767)
+++ libgo/go/internal/poll/fd_posix.go  (working copy)
@@ -2,7 +2,7 @@
 // Use of this source code is governed by a BSD-style
 // license that can be found in the LICENSE file.
 
-// +build darwin dragonfly freebsd linux nacl netbsd openbsd solaris windows
+// +build aix darwin dragonfly freebsd linux nacl netbsd openbsd solaris 
windows
 
 package poll
 
Index: libgo/go/internal/poll/fd_posix_test.go
===================================================================
--- libgo/go/internal/poll/fd_posix_test.go     (revision 252767)
+++ libgo/go/internal/poll/fd_posix_test.go     (working copy)
@@ -2,7 +2,7 @@
 // Use of this source code is governed by a BSD-style
 // license that can be found in the LICENSE file.
 
-// +build darwin dragonfly freebsd linux nacl netbsd openbsd solaris windows
+// +build aix darwin dragonfly freebsd linux nacl netbsd openbsd solaris 
windows
 
 package poll_test
 
Index: libgo/go/internal/poll/fd_unix.go
===================================================================
--- libgo/go/internal/poll/fd_unix.go   (revision 252767)
+++ libgo/go/internal/poll/fd_unix.go   (working copy)
@@ -2,7 +2,7 @@
 // Use of this source code is governed by a BSD-style
 // license that can be found in the LICENSE file.
 
-// +build darwin dragonfly freebsd linux nacl netbsd openbsd solaris
+// +build aix darwin dragonfly freebsd linux nacl netbsd openbsd solaris
 
 package poll
 
Index: libgo/go/internal/poll/hook_unix.go
===================================================================
--- libgo/go/internal/poll/hook_unix.go (revision 252767)
+++ libgo/go/internal/poll/hook_unix.go (working copy)
@@ -2,7 +2,7 @@
 // Use of this source code is governed by a BSD-style
 // license that can be found in the LICENSE file.
 
-// +build darwin dragonfly freebsd linux nacl netbsd openbsd solaris
+// +build aix darwin dragonfly freebsd linux nacl netbsd openbsd solaris
 
 package poll
 
Index: libgo/go/internal/poll/sockopt.go
===================================================================
--- libgo/go/internal/poll/sockopt.go   (revision 252767)
+++ libgo/go/internal/poll/sockopt.go   (working copy)
@@ -2,7 +2,7 @@
 // Use of this source code is governed by a BSD-style
 // license that can be found in the LICENSE file.
 
-// +build darwin dragonfly freebsd linux netbsd openbsd solaris windows
+// +build aix darwin dragonfly freebsd linux netbsd openbsd solaris windows
 
 package poll
 
Index: libgo/go/internal/poll/sockoptip.go
===================================================================
--- libgo/go/internal/poll/sockoptip.go (revision 252767)
+++ libgo/go/internal/poll/sockoptip.go (working copy)
@@ -2,7 +2,7 @@
 // Use of this source code is governed by a BSD-style
 // license that can be found in the LICENSE file.
 
-// +build darwin dragonfly freebsd linux netbsd openbsd windows
+// +build aix darwin dragonfly freebsd linux netbsd openbsd windows
 
 package poll
 
Index: libgo/go/internal/poll/sys_cloexec.go
===================================================================
--- libgo/go/internal/poll/sys_cloexec.go       (revision 252767)
+++ libgo/go/internal/poll/sys_cloexec.go       (working copy)
@@ -5,7 +5,7 @@
 // This file implements sysSocket and accept for platforms that do not
 // provide a fast path for setting SetNonblock and CloseOnExec.
 
-// +build darwin nacl netbsd openbsd solaris
+// +build aix darwin nacl netbsd openbsd solaris
 
 package poll
 
Index: libgo/go/net/error_posix.go
===================================================================
--- libgo/go/net/error_posix.go (revision 252767)
+++ libgo/go/net/error_posix.go (working copy)
@@ -2,7 +2,7 @@
 // Use of this source code is governed by a BSD-style
 // license that can be found in the LICENSE file.
 
-// +build darwin dragonfly freebsd linux nacl netbsd openbsd solaris windows
+// +build aix darwin dragonfly freebsd linux nacl netbsd openbsd solaris 
windows
 
 package net
 
Index: libgo/go/os/user/cgo_lookup_unix.go
===================================================================
--- libgo/go/os/user/cgo_lookup_unix.go (revision 252767)
+++ libgo/go/os/user/cgo_lookup_unix.go (working copy)
@@ -2,7 +2,7 @@
 // Use of this source code is governed by a BSD-style
 // license that can be found in the LICENSE file.
 
-// +build darwin dragonfly freebsd !android,linux netbsd openbsd solaris
+// +build aix darwin dragonfly freebsd !android,linux netbsd openbsd solaris
 // +build cgo
 
 package user
Index: libgo/go/runtime/export_unix_test.go
===================================================================
--- libgo/go/runtime/export_unix_test.go        (revision 252767)
+++ libgo/go/runtime/export_unix_test.go        (working copy)
@@ -2,7 +2,7 @@
 // Use of this source code is governed by a BSD-style
 // license that can be found in the LICENSE file.
 
-// +build darwin dragonfly freebsd linux netbsd openbsd solaris
+// +build aix darwin dragonfly freebsd linux netbsd openbsd solaris
 
 package runtime
 
Index: libgo/go/runtime/netpoll_aix.go
===================================================================
--- libgo/go/runtime/netpoll_aix.go     (revision 251948)
+++ libgo/go/runtime/netpoll_aix.go     (working copy)
@@ -64,14 +64,14 @@ func netpollinit() {
        var p [2]int32
 
        if ps = pollset_create(-1); ps < 0 {
-               throw("netpollinit: failed to create pollset")
+               throw("runtime: netpollinit failed to create pollset")
        }
        // It is not possible to add or remove descriptors from
        // the pollset while pollset_poll is active.
        // We use a pipe to wakeup pollset_poll when the pollset
        // needs to be updated.
        if err := libc_pipe(&p[0]); err < 0 {
-               throw("netpollinit: failed to create pipe")
+               throw("runtime: netpollinit failed to create pipe")
        }
        rdwake = p[0]
        wrwake = p[1]
@@ -90,12 +90,17 @@ func netpollinit() {
        pctl.fd = rdwake
        pctl.events = _POLLIN
        if pollset_ctl(ps, &pctl, 1) != 0 {
-               throw("netpollinit: failed to register pipe")
+               throw("runtime: netpollinit failed to register pipe")
        }
 
        mpfds = make(map[int32]*pollDesc)
 }
 
+func netpolldescriptor() uintptr {
+       // ps is not a real file descriptor.
+       return ^uintptr(0)
+}
+
 func netpollopen(fd uintptr, pd *pollDesc) int32 {
        // pollset_ctl will block if pollset_poll is active
        // so wakeup pollset_poll first.
@@ -144,7 +149,7 @@ func netpollclose(fd uintptr) int32 {
 }
 
 func netpollarm(pd *pollDesc, mode int) {
-       throw("unused")
+       throw("runtime: unused")
 }
 
 func netpoll(block bool) *g {
@@ -168,7 +173,7 @@ retry:
        if nfound < 0 {
                e := errno()
                if e != _EINTR {
-                       throw("pollset_poll failed")
+                       throw("runtime: pollset_poll failed")
                }
                goto retry
        }
Index: libgo/go/syscall/forkpipe_bsd.go
===================================================================
--- libgo/go/syscall/forkpipe_bsd.go    (revision 252866)
+++ libgo/go/syscall/forkpipe_bsd.go    (working copy)
@@ -2,7 +2,7 @@
 // Use of this source code is governed by a BSD-style
 // license that can be found in the LICENSE file.
 
-// +build darwin dragonfly netbsd openbsd solaris
+// +build aix darwin dragonfly netbsd openbsd solaris
 
 package syscall
 
Index: libgo/go/syscall/libcall_aix.go
===================================================================
--- libgo/go/syscall/libcall_aix.go     (revision 251948)
+++ libgo/go/syscall/libcall_aix.go     (working copy)
@@ -6,6 +6,136 @@
 
 package syscall
 
+import (
+       "unsafe"
+)
+
+//sys  Openat(dirfd int, path string, flags int, mode uint32) (fd int, err 
error)
+//open64at(dirfd _C_int, path *byte, flags _C_int, mode Mode_t) _C_int
+
+//sys  ptrace(request int, id int, addr uintptr, data int, buff uintptr) (val 
int)
+//ptrace(request _C_int, id int, addr uintptr, data _C_int, buff *byte) _C_int
+
+//sys  ptrace64(request int, id int64, addr int64, data int, buff uintptr) 
(err error)
+//ptrace64(request _C_int, id int64, addr int64, data _C_int, buff *byte) 
_C_int
+
 func raw_ptrace(request int, pid int, addr *byte, data *byte) Errno {
+       if request == _PTRACE_TRACEME {
+               // Convert to AIX ptrace call.
+               err := ptrace64(_PT_TRACE_ME, 0, 0, 0, 0)
+               if err != nil {
+                       return err.(Errno)
+               }
+               return 0
+       }
        return ENOSYS
 }
+
+func ptracePeek(pid int, addr uintptr, out []byte) (count int, err error) {
+       n := 0
+       for len(out) > 0 {
+               bsize := len(out)
+               if bsize > 1024 {
+                       bsize = 1024
+               }
+               err = ptrace64(_PT_READ_BLOCK, int64(pid), int64(addr), bsize, 
uintptr(unsafe.Pointer(&out[0])))
+               if err != nil {
+                       return 0, err
+               }
+               addr += uintptr(bsize)
+               n += bsize
+               out = out[n:]
+       }
+       return n, nil
+}
+
+func PtracePeekText(pid int, addr uintptr, out []byte) (count int, err error) {
+       return ptracePeek(pid, addr, out)
+}
+
+func PtracePeekData(pid int, addr uintptr, out []byte) (count int, err error) {
+       return ptracePeek(pid, addr, out)
+}
+
+func ptracePoke(pid int, addr uintptr, data []byte) (count int, err error) {
+       n := 0
+       for len(data) > 0 {
+               bsize := len(data)
+               if bsize > 1024 {
+                       bsize = 1024
+               }
+               err = ptrace64(_PT_WRITE_BLOCK, int64(pid), int64(addr), bsize, 
uintptr(unsafe.Pointer(&data[0])))
+               if err != nil {
+                       return 0, err
+               }
+               addr += uintptr(bsize)
+               n += bsize
+               data = data[n:]
+       }
+       return n, nil
+}
+
+func PtracePokeText(pid int, addr uintptr, data []byte) (count int, err error) 
{
+       return ptracePoke(pid, addr, data)
+}
+
+func PtracePokeData(pid int, addr uintptr, data []byte) (count int, err error) 
{
+       return ptracePoke(pid, addr, data)
+}
+
+func PtraceCont(pid int, signal int) (err error) {
+       return ptrace64(_PT_CONTINUE, int64(pid), 1, signal, 0)
+}
+
+func PtraceSingleStep(pid int) (err error) { return ptrace64(_PT_STEP, 
int64(pid), 1, 0, 0) }
+
+func PtraceAttach(pid int) (err error) { return ptrace64(_PT_ATTACH, 
int64(pid), 0, 0, 0) }
+
+func PtraceDetach(pid int) (err error) { return ptrace64(_PT_DETACH, 
int64(pid), 0, 0, 0) }
+
+//sys  reboot(how int) (err error)
+//__linux_reboot(how _C_int) _C_int
+func Reboot(how int) (err error) {
+       return reboot(how)
+}
+
+//sys  Acct(path string) (err error)
+//acct(path *byte) _C_int
+
+//sys  Faccessat(dirfd int, path string, mode uint32, flags int) (err error)
+//faccessat(dirfd _C_int, pathname *byte, mode _C_int, flags _C_int) _C_int
+
+//sys  Fchmodat(dirfd int, path string, mode uint32, flags int) (err error)
+//fchmodat(dirfd _C_int, pathname *byte, mode Mode_t, flags _C_int) _C_int
+
+//sys  Fchownat(dirfd int, path string, uid int, gid int, flags int) (err 
error)
+//fchownat(dirfd _C_int, path *byte, owner Uid_t, group Gid_t, flags _C_int) 
_C_int
+
+//sys  Fstatfs(fd int, buf *Statfs_t) (err error)
+//fstatfs64(fd _C_int, buf *Statfs_t) _C_int
+
+//sys  Mkdirat(dirfd int, path string, mode uint32) (err error)
+//mkdirat(dirfd _C_int, path *byte, mode Mode_t) _C_int
+
+//sys  Mknodat(dirfd int, path string, mode uint32, dev int) (err error)
+//mknodat(dirfd _C_int, path *byte, mode Mode_t, dev _dev_t) _C_int
+
+//sys  getdirent(fd int, buf []byte) (n int, err error)
+//getdirent64(fd _C_int, buf *byte, nbyte Size_t) _C_int
+
+func ReadDirent(fd int, buf []byte) (n int, err error) {
+       return getdirent(fd, buf)
+}
+
+//sys  Renameat(olddirfd int, oldpath string, newdirfd int, newpath string) 
(err error)
+//renameat(olddirfd _C_int, oldpath *byte, newdirfd _C_int, newpath *byte) 
_C_int
+
+//sys  Statfs(path string, buf *Statfs_t) (err error)
+//statfs64(path *byte, buf *Statfs_t) _C_int
+
+//sys  unlinkat(dirfd int, path string, flags int) (err error)
+//unlinkat(dirfd _C_int, path *byte, flags _C_int) _C_int
+
+func Unlinkat(dirfd int, path string) (err error) {
+       return unlinkat(dirfd, path, 0)
+}

Reply via email to