libgo: various fixes for Solaris support

Reviewed-on: https://go-review.googlesource.com/c/gofrontend/+/342189
This commit is contained in:
Ian Lance Taylor 2021-08-13 17:21:54 -07:00
parent 7dd8f1982c
commit 829931ec93
10 changed files with 35 additions and 17 deletions

View File

@ -1,4 +1,4 @@
f2b7a2ce94127ad444a772bd1631516c5c67fb73
77bc32767b61feb6499ca7921e96b356603517dc
The first line of this file holds the git revision number of the last
merge done from the gofrontend repository.

View File

@ -7,12 +7,13 @@ package unix
import (
"sync/atomic"
"syscall"
"unsafe"
)
//extern getrandom
func libc_getrandom(*byte, uintptr, uint32) uintptr
var getrandomUnsupported int32 // atomic
// GetRandomFlag is a flag supported by the getrandom system call.
type GetRandomFlag uintptr

View File

@ -2,8 +2,8 @@
// Use of this source code is governed by a BSD-style
// license that can be found in the LICENSE file.
// +build solaris
// +build cgo
//go:build solaris && cgo
// +build solaris,cgo
package user
@ -22,3 +22,6 @@ func libc_getgrnam_r(name *byte, grp *syscall.Group, buf *byte, buflen syscall.S
//extern __posix_getgrgid_r
func libc_getgrgid_r(gid syscall.Gid_t, grp *syscall.Group, buf *byte, buflen syscall.Size_t, result **syscall.Group) int
//extern getgrouplist
func libc_getgrouplist(user *byte, group syscall.Gid_t, groups *syscall.Gid_t, ngroups *int32) int

View File

@ -744,6 +744,10 @@ func TestTimePprof(t *testing.T) {
// Test that runtime.abort does so.
func TestAbort(t *testing.T) {
if runtime.Compiler == "gccgo" && runtime.GOOS == "solaris" {
t.Skip("not supported by gofrontend on Solaris")
}
// Pass GOTRACEBACK to ensure we get runtime frames.
output := runTestProg(t, "testprog", "Abort", "GOTRACEBACK=system")
if want := "runtime.abort"; !strings.Contains(output, want) {
@ -805,6 +809,10 @@ func TestRuntimePanic(t *testing.T) {
// Test that g0 stack overflows are handled gracefully.
func TestG0StackOverflow(t *testing.T) {
if runtime.Compiler == "gccgo" {
t.Skip("g0 stack overflow not supported by gofrontend")
}
testenv.MustHaveExec(t)
switch runtime.GOOS {

View File

@ -2,8 +2,8 @@
// Use of this source code is governed by a BSD-style
// license that can be found in the LICENSE file.
//go:build dragonfly || freebsd || hurd || netbsd || (openbsd && mips64)
// +build dragonfly freebsd hurd netbsd openbsd,mips64
//go:build aix || darwin || dragonfly || freebsd || hurd || netbsd || openbsd || solaris
// +build aix darwin dragonfly freebsd hurd netbsd openbsd solaris
package syscall

View File

@ -180,7 +180,7 @@ func TestForeground(t *testing.T) {
fpgrp := syscall.Pid_t(0)
errno := syscall.Ioctl(tty.Fd(), syscall.TIOCGPGRP, uintptr(unsafe.Pointer(&fpgrp)))
errno := syscall.Ioctl(tty.Fd(), syscall.TIOCGPGRP, unsafe.Pointer(&fpgrp))
if errno != 0 {
t.Fatalf("TIOCGPGRP failed with error code: %s", errno)
}
@ -217,7 +217,7 @@ func TestForeground(t *testing.T) {
// This call fails on darwin/arm64. The failure doesn't matter, though.
// This is just best effort.
syscall.Ioctl(tty.Fd(), syscall.TIOCSPGRP, uintptr(unsafe.Pointer(&fpgrp)))
syscall.Ioctl(tty.Fd(), syscall.TIOCSPGRP, unsafe.Pointer(&fpgrp))
}
func TestForegroundSignal(t *testing.T) {
@ -231,7 +231,7 @@ func TestForegroundSignal(t *testing.T) {
// equivalent.
fpgrp := int32(0)
errno := syscall.Ioctl(tty.Fd(), syscall.TIOCGPGRP, uintptr(unsafe.Pointer(&fpgrp)))
errno := syscall.Ioctl(tty.Fd(), syscall.TIOCGPGRP, unsafe.Pointer(&fpgrp))
if errno != 0 {
t.Fatalf("TIOCGPGRP failed with error code: %s", errno)
}
@ -242,7 +242,7 @@ func TestForegroundSignal(t *testing.T) {
defer func() {
signal.Ignore(syscall.SIGTTIN, syscall.SIGTTOU)
syscall.Ioctl(tty.Fd(), syscall.TIOCSPGRP, uintptr(unsafe.Pointer(&fpgrp)))
syscall.Ioctl(tty.Fd(), syscall.TIOCSPGRP, unsafe.Pointer(&fpgrp))
signal.Reset()
}()

View File

@ -2,6 +2,7 @@
// Use of this source code is governed by a BSD-style
// license that can be found in the LICENSE file.
//go:build aix
// +build aix
package syscall
@ -10,7 +11,7 @@ import (
"unsafe"
)
func Ioctl(fd, req, arg uintptr) (err Errno) {
_, err = raw_ioctl_ptr(int(fd), req, unsafe.Pointer(arg))
func Ioctl(fd, req uintptr, arg unsafe.Pointer) (err Errno) {
_, err = raw_ioctl_ptr(int(fd), req, arg)
return err
}

View File

@ -2,12 +2,14 @@
// Use of this source code is governed by a BSD-style
// license that can be found in the LICENSE file.
//go:build dragonfly || freebsd || hurd || linux || netbsd || openbsd
// +build dragonfly freebsd hurd linux netbsd openbsd
//go:build dragonfly || freebsd || hurd || linux || netbsd || openbsd || solaris
// +build dragonfly freebsd hurd linux netbsd openbsd solaris
package syscall
func Ioctl(fd, req, arg uintptr) (err Errno) {
_, _, err = Syscall(SYS_IOCTL, fd, req, arg)
import "unsafe"
func Ioctl(fd, req uintptr, arg unsafe.Pointer) (err Errno) {
_, err = raw_ioctl_ptr(int(fd), req, arg)
return err
}

View File

@ -2,6 +2,9 @@
// Use of this source code is governed by a BSD-style
// license that can be found in the LICENSE file.
//go:build linux
// +build linux
// GNU/Linux version of UtimesNano.
package syscall

View File

@ -19,7 +19,7 @@ rm -f runtime.inc.tmp2 runtime.inc.tmp3
# boundsError has a field name that is a C keyword, and we don't need it.
# mSpanInuse is both a constant and a field name, and we don't need it.
grep -v "#define _" ${IN} | grep -v "#define [cm][01234] " | grep -v "#define empty " | grep -v "#define \\$" | grep -v "#define mSpanInUse " > runtime.inc.tmp2
grep -v "#define _" ${IN} | grep -v "#define [cm][012345] " | grep -v "#define empty " | grep -v "#define \\$" | grep -v "#define mSpanInUse " > runtime.inc.tmp2
for pattern in '_[GP][a-z]' _Max _Lock _Sig _Trace _MHeap _Num
do
grep "#define $pattern" ${IN} >> runtime.inc.tmp2