diff options
Diffstat (limited to 'libgo')
-rw-r--r-- | libgo/go/runtime/mgc.go | 2 | ||||
-rw-r--r-- | libgo/go/runtime/netpoll.go | 22 | ||||
-rw-r--r-- | libgo/go/runtime/proc.go | 2 | ||||
-rw-r--r-- | libgo/go/runtime/stubs.go | 3 | ||||
-rw-r--r-- | libgo/go/syscall/syscall_unix.go | 47 | ||||
-rw-r--r-- | libgo/go/syscall/wait.c | 16 | ||||
-rw-r--r-- | libgo/runtime/go-caller.c | 4 | ||||
-rw-r--r-- | libgo/runtime/go-callers.c | 6 | ||||
-rw-r--r-- | libgo/runtime/go-libmain.c | 2 | ||||
-rw-r--r-- | libgo/runtime/go-main.c | 2 | ||||
-rw-r--r-- | libgo/runtime/go-reflect-call.c | 3 | ||||
-rw-r--r-- | libgo/runtime/go-varargs.c | 11 | ||||
-rw-r--r-- | libgo/runtime/panic.c | 2 | ||||
-rw-r--r-- | libgo/runtime/runtime.h | 6 | ||||
-rw-r--r-- | libgo/runtime/stack.c | 6 |
15 files changed, 58 insertions, 76 deletions
diff --git a/libgo/go/runtime/mgc.go b/libgo/go/runtime/mgc.go index 0973f1d..b8c91ac 100644 --- a/libgo/go/runtime/mgc.go +++ b/libgo/go/runtime/mgc.go @@ -238,7 +238,7 @@ func setGCPercent(in int32) (out int32) { var gcphase uint32 // The compiler knows about this variable. -// If you change it, you must change builtin/runtime.go, too. +// If you change it, you must change gofrontend/wb.cc, too. // If you change the first four bytes, you must also change the write // barrier insertion code. var writeBarrier struct { diff --git a/libgo/go/runtime/netpoll.go b/libgo/go/runtime/netpoll.go index 6d39114..3515922 100644 --- a/libgo/go/runtime/netpoll.go +++ b/libgo/go/runtime/netpoll.go @@ -112,7 +112,7 @@ func poll_runtime_isPollServerDescriptor(fd uintptr) bool { } //go:linkname poll_runtime_pollOpen internal..z2fpoll.runtime_pollOpen -func poll_runtime_pollOpen(fd uintptr) (*pollDesc, int) { +func poll_runtime_pollOpen(fd uintptr) (uintptr, int) { pd := pollcache.alloc() lock(&pd.lock) if pd.wg != 0 && pd.wg != pdReady { @@ -133,11 +133,12 @@ func poll_runtime_pollOpen(fd uintptr) (*pollDesc, int) { var errno int32 errno = netpollopen(fd, pd) - return pd, int(errno) + return uintptr(unsafe.Pointer(pd)), int(errno) } //go:linkname poll_runtime_pollClose internal..z2fpoll.runtime_pollClose -func poll_runtime_pollClose(pd *pollDesc) { +func poll_runtime_pollClose(ctx uintptr) { + pd := (*pollDesc)(unsafe.Pointer(ctx)) if !pd.closing { throw("runtime: close polldesc w/o unblock") } @@ -159,7 +160,8 @@ func (c *pollCache) free(pd *pollDesc) { } //go:linkname poll_runtime_pollReset internal..z2fpoll.runtime_pollReset -func poll_runtime_pollReset(pd *pollDesc, mode int) int { +func poll_runtime_pollReset(ctx uintptr, mode int) int { + pd := (*pollDesc)(unsafe.Pointer(ctx)) err := netpollcheckerr(pd, int32(mode)) if err != 0 { return err @@ -173,7 +175,8 @@ func poll_runtime_pollReset(pd *pollDesc, mode int) int { } //go:linkname poll_runtime_pollWait internal..z2fpoll.runtime_pollWait -func poll_runtime_pollWait(pd *pollDesc, mode int) int { +func poll_runtime_pollWait(ctx uintptr, mode int) int { + pd := (*pollDesc)(unsafe.Pointer(ctx)) err := netpollcheckerr(pd, int32(mode)) if err != 0 { return err @@ -195,7 +198,8 @@ func poll_runtime_pollWait(pd *pollDesc, mode int) int { } //go:linkname poll_runtime_pollWaitCanceled internal..z2fpoll.runtime_pollWaitCanceled -func poll_runtime_pollWaitCanceled(pd *pollDesc, mode int) { +func poll_runtime_pollWaitCanceled(ctx uintptr, mode int) { + pd := (*pollDesc)(unsafe.Pointer(ctx)) // This function is used only on windows after a failed attempt to cancel // a pending async IO operation. Wait for ioready, ignore closing or timeouts. for !netpollblock(pd, int32(mode), true) { @@ -203,7 +207,8 @@ func poll_runtime_pollWaitCanceled(pd *pollDesc, mode int) { } //go:linkname poll_runtime_pollSetDeadline internal..z2fpoll.runtime_pollSetDeadline -func poll_runtime_pollSetDeadline(pd *pollDesc, d int64, mode int) { +func poll_runtime_pollSetDeadline(ctx uintptr, d int64, mode int) { + pd := (*pollDesc)(unsafe.Pointer(ctx)) lock(&pd.lock) if pd.closing { unlock(&pd.lock) @@ -288,7 +293,8 @@ func poll_runtime_pollSetDeadline(pd *pollDesc, d int64, mode int) { } //go:linkname poll_runtime_pollUnblock internal..z2fpoll.runtime_pollUnblock -func poll_runtime_pollUnblock(pd *pollDesc) { +func poll_runtime_pollUnblock(ctx uintptr) { + pd := (*pollDesc)(unsafe.Pointer(ctx)) lock(&pd.lock) if pd.closing { throw("runtime: unblock on closing polldesc") diff --git a/libgo/go/runtime/proc.go b/libgo/go/runtime/proc.go index b4fa88f..e937563 100644 --- a/libgo/go/runtime/proc.go +++ b/libgo/go/runtime/proc.go @@ -153,7 +153,7 @@ var runtimeInitTime int64 var initSigmask sigset // The main goroutine. -func main() { +func main(unsafe.Pointer) { g := getg() // Max stack size is 1 GB on 64-bit, 250 MB on 32-bit. diff --git a/libgo/go/runtime/stubs.go b/libgo/go/runtime/stubs.go index f2b0ee8a..9f5191b 100644 --- a/libgo/go/runtime/stubs.go +++ b/libgo/go/runtime/stubs.go @@ -283,8 +283,7 @@ func eqstring(x, y string) bool { // For gccgo this is in the C code. func osyield() -// For gccgo this can be called directly. -//extern syscall +//extern __go_syscall6 func syscall(trap uintptr, a1, a2, a3, a4, a5, a6 uintptr) uintptr // For gccgo, to communicate from the C code to the Go code. diff --git a/libgo/go/syscall/syscall_unix.go b/libgo/go/syscall/syscall_unix.go index 450173a..b786dc5 100644 --- a/libgo/go/syscall/syscall_unix.go +++ b/libgo/go/syscall/syscall_unix.go @@ -19,11 +19,8 @@ var ( Stderr = 2 ) -//extern syscall -func c_syscall32(trap int32, a1, a2, a3, a4, a5, a6 int32) int32 - -//extern syscall -func c_syscall64(trap int64, a1, a2, a3, a4, a5, a6 int64) int64 +//extern __go_syscall6 +func syscall6(trap uintptr, a1, a2, a3, a4, a5, a6 uintptr) uintptr const ( darwin64Bit = runtime.GOOS == "darwin" && sizeofPtr == 8 @@ -38,14 +35,7 @@ const ( func Syscall(trap, a1, a2, a3 uintptr) (r1, r2 uintptr, err Errno) { Entersyscall() SetErrno(0) - var r uintptr - if unsafe.Sizeof(r) == 4 { - r1 := c_syscall32(int32(trap), int32(a1), int32(a2), int32(a3), 0, 0, 0) - r = uintptr(r1) - } else { - r1 := c_syscall64(int64(trap), int64(a1), int64(a2), int64(a3), 0, 0, 0) - r = uintptr(r1) - } + r := syscall6(trap, a1, a2, a3, 0, 0, 0) err = GetErrno() Exitsyscall() return r, 0, err @@ -54,47 +44,22 @@ func Syscall(trap, a1, a2, a3 uintptr) (r1, r2 uintptr, err Errno) { func Syscall6(trap, a1, a2, a3, a4, a5, a6 uintptr) (r1, r2 uintptr, err Errno) { Entersyscall() SetErrno(0) - var r uintptr - if unsafe.Sizeof(r) == 4 { - r1 := c_syscall32(int32(trap), int32(a1), int32(a2), int32(a3), - int32(a4), int32(a5), int32(a6)) - r = uintptr(r1) - } else { - r1 := c_syscall64(int64(trap), int64(a1), int64(a2), int64(a3), - int64(a4), int64(a5), int64(a6)) - r = uintptr(r1) - } + r := syscall6(trap, a1, a2, a3, a4, a5, a6) err = GetErrno() Exitsyscall() return r, 0, err } func RawSyscall(trap, a1, a2, a3 uintptr) (r1, r2 uintptr, err Errno) { - var r uintptr SetErrno(0) - if unsafe.Sizeof(r) == 4 { - r1 := c_syscall32(int32(trap), int32(a1), int32(a2), int32(a3), 0, 0, 0) - r = uintptr(r1) - } else { - r1 := c_syscall64(int64(trap), int64(a1), int64(a2), int64(a3), 0, 0, 0) - r = uintptr(r1) - } + r := syscall6(trap, a1, a2, a3, 0, 0, 0) err = GetErrno() return r, 0, err } func RawSyscall6(trap, a1, a2, a3, a4, a5, a6 uintptr) (r1, r2 uintptr, err Errno) { - var r uintptr SetErrno(0) - if unsafe.Sizeof(r) == 4 { - r1 := c_syscall32(int32(trap), int32(a1), int32(a2), int32(a3), - int32(a4), int32(a5), int32(a6)) - r = uintptr(r1) - } else { - r1 := c_syscall64(int64(trap), int64(a1), int64(a2), int64(a3), - int64(a4), int64(a5), int64(a6)) - r = uintptr(r1) - } + r := syscall6(trap, a1, a2, a3, a4, a5, a6) err = GetErrno() return r, 0, err } diff --git a/libgo/go/syscall/wait.c b/libgo/go/syscall/wait.c index 9555a41..0b234d0 100644 --- a/libgo/go/syscall/wait.c +++ b/libgo/go/syscall/wait.c @@ -65,10 +65,10 @@ CoreDump (uint32_t *w) return WCOREDUMP (*w) != 0; } -extern int ExitStatus (uint32_t *w) +extern intgo ExitStatus (uint32_t *w) __asm__ (GOSYM_PREFIX "syscall.WaitStatus.ExitStatus"); -int +intgo ExitStatus (uint32_t *w) { if (!WIFEXITED (*w)) @@ -76,10 +76,10 @@ ExitStatus (uint32_t *w) return WEXITSTATUS (*w); } -extern int Signal (uint32_t *w) +extern intgo Signal (uint32_t *w) __asm__ (GOSYM_PREFIX "syscall.WaitStatus.Signal"); -int +intgo Signal (uint32_t *w) { if (!WIFSIGNALED (*w)) @@ -87,10 +87,10 @@ Signal (uint32_t *w) return WTERMSIG (*w); } -extern int StopSignal (uint32_t *w) +extern intgo StopSignal (uint32_t *w) __asm__ (GOSYM_PREFIX "syscall.WaitStatus.StopSignal"); -int +intgo StopSignal (uint32_t *w) { if (!WIFSTOPPED (*w)) @@ -98,10 +98,10 @@ StopSignal (uint32_t *w) return WSTOPSIG (*w); } -extern int TrapCause (uint32_t *w) +extern intgo TrapCause (uint32_t *w) __asm__ (GOSYM_PREFIX "syscall.WaitStatus.TrapCause"); -int +intgo TrapCause (uint32_t *w __attribute__ ((unused))) { #ifndef __linux__ diff --git a/libgo/runtime/go-caller.c b/libgo/runtime/go-caller.c index 6fe4340..2143446 100644 --- a/libgo/runtime/go-caller.c +++ b/libgo/runtime/go-caller.c @@ -192,12 +192,12 @@ struct caller_ret _Bool ok; }; -struct caller_ret Caller (int n) __asm__ (GOSYM_PREFIX "runtime.Caller"); +struct caller_ret Caller (intgo n) __asm__ (GOSYM_PREFIX "runtime.Caller"); /* Implement runtime.Caller. */ struct caller_ret -Caller (int skip) +Caller (intgo skip) { struct caller_ret ret; Location loc; diff --git a/libgo/runtime/go-callers.c b/libgo/runtime/go-callers.c index 7ea70851..a72b4e8 100644 --- a/libgo/runtime/go-callers.c +++ b/libgo/runtime/go-callers.c @@ -236,11 +236,11 @@ runtime_callers (int32 skip, Location *locbuf, int32 m, bool keep_thunks) return data.index; } -int Callers (int, struct __go_open_array) +intgo Callers (intgo, struct __go_open_array) __asm__ (GOSYM_PREFIX "runtime.Callers"); -int -Callers (int skip, struct __go_open_array pc) +intgo +Callers (intgo skip, struct __go_open_array pc) { Location *locbuf; int ret; diff --git a/libgo/runtime/go-libmain.c b/libgo/runtime/go-libmain.c index 4f47639..00a8e6b 100644 --- a/libgo/runtime/go-libmain.c +++ b/libgo/runtime/go-libmain.c @@ -231,7 +231,7 @@ gostart (void *arg) setpagesize (getpagesize ()); runtime_sched = runtime_getsched(); runtime_schedinit (); - __go_go (runtime_main, NULL); + __go_go ((uintptr)(runtime_main), NULL); runtime_mstart (runtime_m ()); abort (); } diff --git a/libgo/runtime/go-main.c b/libgo/runtime/go-main.c index 1048161..301ac4e 100644 --- a/libgo/runtime/go-main.c +++ b/libgo/runtime/go-main.c @@ -55,7 +55,7 @@ main (int argc, char **argv) setpagesize (getpagesize ()); runtime_sched = runtime_getsched(); runtime_schedinit (); - __go_go (runtime_main, NULL); + __go_go ((uintptr)(runtime_main), NULL); runtime_mstart (runtime_m ()); abort (); } diff --git a/libgo/runtime/go-reflect-call.c b/libgo/runtime/go-reflect-call.c index 6a9a7f3..abd598b 100644 --- a/libgo/runtime/go-reflect-call.c +++ b/libgo/runtime/go-reflect-call.c @@ -229,7 +229,8 @@ reflect_call (const struct __go_func_type *func_type, FuncVal *func_val, call_result = (unsigned char *) malloc (go_results_size (func_type)); - ffi_call_go (&cif, func_val->fn, call_result, params, func_val); + ffi_call_go (&cif, (void (*)(void)) func_val->fn, call_result, params, + func_val); /* Some day we may need to free result values if RESULTS is NULL. */ diff --git a/libgo/runtime/go-varargs.c b/libgo/runtime/go-varargs.c index 691ee56..dda9959 100644 --- a/libgo/runtime/go-varargs.c +++ b/libgo/runtime/go-varargs.c @@ -89,3 +89,14 @@ __go_openat (int fd, char *path, int flags, mode_t mode) } #endif + +// __go_syscall6 is called by both the runtime and syscall packages. +// We use uintptr_t to make sure that the types match, since the Go +// and C "int" types are not the same. + +uintptr_t +__go_syscall6(uintptr_t flag, uintptr_t a1, uintptr_t a2, uintptr_t a3, + uintptr_t a4, uintptr_t a5, uintptr_t a6) +{ + return syscall (flag, a1, a2, a3, a4, a5, a6); +} diff --git a/libgo/runtime/panic.c b/libgo/runtime/panic.c index 9cd69ee..9025505 100644 --- a/libgo/runtime/panic.c +++ b/libgo/runtime/panic.c @@ -34,7 +34,7 @@ runtime_panicstring(const char *s) runtime_throw("panic holding locks"); } } - runtime_newErrorCString(s, &err); + runtime_newErrorCString((uintptr) s, &err); runtime_panic(err); } diff --git a/libgo/runtime/runtime.h b/libgo/runtime/runtime.h index 5da34fb..a6135b0 100644 --- a/libgo/runtime/runtime.h +++ b/libgo/runtime/runtime.h @@ -94,7 +94,7 @@ struct String struct FuncVal { - void (*fn)(void); + uintptr_t fn; // variable-size, fn-specific data here }; @@ -295,7 +295,7 @@ void runtime_entersyscall() __asm__ (GOSYM_PREFIX "runtime.entersyscall"); void runtime_entersyscallblock() __asm__ (GOSYM_PREFIX "runtime.entersyscallblock"); -G* __go_go(void (*pfn)(void*), void*); +G* __go_go(uintptr, void*); int32 runtime_callers(int32, Location*, int32, bool keep_callers); int64 runtime_nanotime(void) // monotonic time __asm__(GOSYM_PREFIX "runtime.nanotime"); @@ -389,7 +389,7 @@ void runtime_panic(Eface) /* * runtime c-called (but written in Go) */ -void runtime_newErrorCString(const char*, Eface*) +void runtime_newErrorCString(uintptr, Eface*) __asm__ (GOSYM_PREFIX "runtime.NewErrorCString"); /* diff --git a/libgo/runtime/stack.c b/libgo/runtime/stack.c index 2d5d1e0..be5e523 100644 --- a/libgo/runtime/stack.c +++ b/libgo/runtime/stack.c @@ -20,7 +20,7 @@ extern void * __splitstack_find_context (void *context[10], size_t *, void **, // tail call to doscanstack1. #pragma GCC optimize ("-fno-optimize-sibling-calls") -extern void scanstackblock(void *addr, uintptr size, void *gcw) +extern void scanstackblock(uintptr addr, uintptr size, void *gcw) __asm__("runtime.scanstackblock"); static bool doscanstack1(G*, void*) @@ -84,11 +84,11 @@ static bool doscanstack1(G *gp, void *gcw) { } } if(sp != nil) { - scanstackblock(sp, (uintptr)(spsize), gcw); + scanstackblock((uintptr)(sp), (uintptr)(spsize), gcw); while((sp = __splitstack_find(next_segment, next_sp, &spsize, &next_segment, &next_sp, &initial_sp)) != nil) - scanstackblock(sp, (uintptr)(spsize), gcw); + scanstackblock((uintptr)(sp), (uintptr)(spsize), gcw); } #else byte* bottom; |