From 58e3ae2fae7dcb22a67ba802c250ba0abf894b1d Mon Sep 17 00:00:00 2001 From: Matthew Dempsky Date: Wed, 21 Oct 2015 12:48:53 -0700 Subject: [PATCH] runtime: split plan9 and solaris's m fields into new embedded mOS type Reduces the size of m by ~8% on linux/amd64 (1040 bytes -> 960 bytes). There are also windows-specific fields, but they're currently referenced in OS-independent source files (but only when GOOS=="windows"). Change-Id: I13e1471ff585ccced1271f74209f8ed6df14c202 Reviewed-on: https://go-review.googlesource.com/16173 Run-TryBot: Matthew Dempsky TryBot-Result: Gobot Gobot Reviewed-by: Ian Lance Taylor --- src/runtime/os_darwin.go | 2 ++ src/runtime/os_dragonfly.go | 2 ++ src/runtime/os_freebsd.go | 2 ++ src/runtime/os_linux.go | 2 ++ src/runtime/os_nacl.go | 2 ++ src/runtime/os_netbsd.go | 2 ++ src/runtime/os_openbsd.go | 2 ++ src/runtime/os_plan9.go | 5 +++++ src/runtime/os_solaris.go | 18 ++++++++++++++++++ src/runtime/os_windows.go | 2 ++ src/runtime/runtime2.go | 22 +--------------------- src/runtime/sys_plan9_386.s | 2 +- src/runtime/sys_plan9_amd64.s | 2 +- src/runtime/sys_solaris_amd64.s | 14 +++++++------- 14 files changed, 49 insertions(+), 30 deletions(-) diff --git a/src/runtime/os_darwin.go b/src/runtime/os_darwin.go index 3deafd5227ec6b..0fedb707e9fb40 100644 --- a/src/runtime/os_darwin.go +++ b/src/runtime/os_darwin.go @@ -6,6 +6,8 @@ package runtime import "unsafe" +type mOS struct{} + func bsdthread_create(stk, arg unsafe.Pointer, fn uintptr) int32 func bsdthread_register() int32 diff --git a/src/runtime/os_dragonfly.go b/src/runtime/os_dragonfly.go index 62fc56a1f1fed9..d6856f11645b85 100644 --- a/src/runtime/os_dragonfly.go +++ b/src/runtime/os_dragonfly.go @@ -6,6 +6,8 @@ package runtime import "unsafe" +type mOS struct{} + //go:noescape func lwp_create(param *lwpparams) int32 diff --git a/src/runtime/os_freebsd.go b/src/runtime/os_freebsd.go index bc3394c9ac650e..61f8fae15b0008 100644 --- a/src/runtime/os_freebsd.go +++ b/src/runtime/os_freebsd.go @@ -6,6 +6,8 @@ package runtime import "unsafe" +type mOS struct{} + //go:noescape func thr_new(param *thrparam, size int32) diff --git a/src/runtime/os_linux.go b/src/runtime/os_linux.go index dc932dbaa0fa57..51a7fa0a75b99a 100644 --- a/src/runtime/os_linux.go +++ b/src/runtime/os_linux.go @@ -6,6 +6,8 @@ package runtime import "unsafe" +type mOS struct{} + //go:noescape func futex(addr unsafe.Pointer, op int32, val uint32, ts, addr2 unsafe.Pointer, val3 uint32) int32 diff --git a/src/runtime/os_nacl.go b/src/runtime/os_nacl.go index efa8fa12b911fd..58330d2810c9a0 100644 --- a/src/runtime/os_nacl.go +++ b/src/runtime/os_nacl.go @@ -6,6 +6,8 @@ package runtime import "unsafe" +type mOS struct{} + func nacl_exception_stack(p uintptr, size int32) int32 func nacl_exception_handler(fn uintptr, arg unsafe.Pointer) int32 func nacl_sem_create(flag int32) int32 diff --git a/src/runtime/os_netbsd.go b/src/runtime/os_netbsd.go index 4fa4a416bdc70a..659ec2d65a517b 100644 --- a/src/runtime/os_netbsd.go +++ b/src/runtime/os_netbsd.go @@ -6,6 +6,8 @@ package runtime import "unsafe" +type mOS struct{} + //go:noescape func setitimer(mode int32, new, old *itimerval) diff --git a/src/runtime/os_openbsd.go b/src/runtime/os_openbsd.go index 8a97a738f770ec..74a838fa416f23 100644 --- a/src/runtime/os_openbsd.go +++ b/src/runtime/os_openbsd.go @@ -4,6 +4,8 @@ package runtime +type mOS struct{} + //go:noescape func setitimer(mode int32, new, old *itimerval) diff --git a/src/runtime/os_plan9.go b/src/runtime/os_plan9.go index 6def35ccadeded..3b3e940cbc93d8 100644 --- a/src/runtime/os_plan9.go +++ b/src/runtime/os_plan9.go @@ -6,6 +6,11 @@ package runtime import "unsafe" +type mOS struct { + notesig *int8 + errstr *byte +} + func closefd(fd int32) int32 //go:noescape diff --git a/src/runtime/os_solaris.go b/src/runtime/os_solaris.go index 634e4cf914a07b..129653ef19f056 100644 --- a/src/runtime/os_solaris.go +++ b/src/runtime/os_solaris.go @@ -6,6 +6,24 @@ package runtime import "unsafe" +type mts struct { + tv_sec int64 + tv_nsec int64 +} + +type mscratch struct { + v [6]uintptr +} + +type mOS struct { + perrno *int32 // pointer to tls errno + // these are here because they are too large to be on the stack + // of low-level NOSPLIT functions. + //LibCall libcall; + ts mts + scratch mscratch +} + type libcFunc uintptr var asmsysvicall6 libcFunc diff --git a/src/runtime/os_windows.go b/src/runtime/os_windows.go index 545b416201ae68..22f7daad5182b8 100644 --- a/src/runtime/os_windows.go +++ b/src/runtime/os_windows.go @@ -6,6 +6,8 @@ package runtime import "unsafe" +type mOS struct{} + type stdFunction *byte //go:linkname os_sigpipe os.sigpipe diff --git a/src/runtime/runtime2.go b/src/runtime/runtime2.go index d4e3758678fe91..7d6c441ef57001 100644 --- a/src/runtime/runtime2.go +++ b/src/runtime/runtime2.go @@ -269,15 +269,6 @@ type g struct { gcAssistBytes int64 } -type mts struct { - tv_sec int64 - tv_nsec int64 -} - -type mscratch struct { - v [6]uintptr -} - type m struct { g0 *g // goroutine with scheduling stack morebuf gobuf // gobuf arg to morestack @@ -343,18 +334,7 @@ type m struct { libcallg guintptr syscall libcall // stores syscall parameters on windows //#endif - //#ifdef GOOS_solaris - perrno *int32 // pointer to tls errno - // these are here because they are too large to be on the stack - // of low-level NOSPLIT functions. - //LibCall libcall; - ts mts - scratch mscratch - //#endif - //#ifdef GOOS_plan9 - notesig *int8 - errstr *byte - //#endif + mOS } type p struct { diff --git a/src/runtime/sys_plan9_386.s b/src/runtime/sys_plan9_386.s index cae326ada63438..1af3cb19cd9717 100644 --- a/src/runtime/sys_plan9_386.s +++ b/src/runtime/sys_plan9_386.s @@ -238,7 +238,7 @@ TEXT runtime·errstr(SB),NOSPLIT,$8-8 get_tls(AX) MOVL g(AX), BX MOVL g_m(BX), BX - MOVL m_errstr(BX), CX + MOVL (m_mOS+mOS_errstr)(BX), CX MOVL CX, 0(SP) MOVL $ERRMAX, 4(SP) CALL errstr<>(SB) diff --git a/src/runtime/sys_plan9_amd64.s b/src/runtime/sys_plan9_amd64.s index 6aefe5f125f735..1492ef2fed6059 100644 --- a/src/runtime/sys_plan9_amd64.s +++ b/src/runtime/sys_plan9_amd64.s @@ -243,7 +243,7 @@ TEXT runtime·errstr(SB),NOSPLIT,$16-16 get_tls(AX) MOVQ g(AX), BX MOVQ g_m(BX), BX - MOVQ m_errstr(BX), CX + MOVQ (m_mOS+mOS_errstr)(BX), CX MOVQ CX, 0(SP) MOVQ $ERRMAX, 8(SP) CALL errstr<>(SB) diff --git a/src/runtime/sys_solaris_amd64.s b/src/runtime/sys_solaris_amd64.s index e4315645fe04f7..978c9ffeb4b5bd 100644 --- a/src/runtime/sys_solaris_amd64.s +++ b/src/runtime/sys_solaris_amd64.s @@ -26,7 +26,7 @@ TEXT runtime·miniterrno(SB),NOSPLIT,$0 get_tls(CX) MOVQ g(CX), BX MOVQ g_m(BX), BX - MOVQ AX, m_perrno(BX) + MOVQ AX, (m_mOS+mOS_perrno)(BX) RET // int64 runtime·nanotime1(void); @@ -81,7 +81,7 @@ TEXT runtime·asmsysvicall6(SB),NOSPLIT,$0 get_tls(CX) MOVQ g(CX), BX MOVQ g_m(BX), BX - MOVQ m_perrno(BX), DX + MOVQ (m_mOS+mOS_perrno)(BX), DX CMPQ DX, $0 JEQ skiperrno1 MOVL $0, 0(DX) @@ -109,7 +109,7 @@ skipargs: get_tls(CX) MOVQ g(CX), BX MOVQ g_m(BX), BX - MOVQ m_perrno(BX), AX + MOVQ (m_mOS+mOS_perrno)(BX), AX CMPQ AX, $0 JEQ skiperrno2 MOVL 0(AX), AX @@ -196,7 +196,7 @@ allgood: MOVQ R10, 176(SP) // save m->scratch - LEAQ m_scratch(BP), R11 + LEAQ (m_mOS+mOS_scratch)(BP), R11 MOVQ 0(R11), R10 MOVQ R10, 112(SP) MOVQ 8(R11), R10 @@ -211,7 +211,7 @@ allgood: MOVQ R10, 152(SP) // save errno, it might be EINTR; stuff we do here might reset it. - MOVQ m_perrno(BP), R10 + MOVQ (m_mOS+mOS_perrno)(BP), R10 MOVL 0(R10), R10 MOVQ R10, 160(SP) @@ -244,7 +244,7 @@ allgood: MOVQ R10, libcall_r2(R11) // restore scratch - LEAQ m_scratch(BP), R11 + LEAQ (m_mOS+mOS_scratch)(BP), R11 MOVQ 112(SP), R10 MOVQ R10, 0(R11) MOVQ 120(SP), R10 @@ -259,7 +259,7 @@ allgood: MOVQ R10, 40(R11) // restore errno - MOVQ m_perrno(BP), R11 + MOVQ (m_mOS+mOS_perrno)(BP), R11 MOVQ 160(SP), R10 MOVL R10, 0(R11)