Commit 4f3604d3 authored by Austin Clements's avatar Austin Clements

runtime, reflect: access runtime.reflectcall directly

Currently, package runtime contains the definition of reflect.call,
even though it's just a jump to runtime.reflectcall. This "push"
symbol is confusing, since it's not clear where the definition of
reflect.call comes from when you're in the reflect package.

Replace this with a "pull" symbol: the runtime now defines only
runtime.reflectcall and package reflect uses a go:linkname to access
this symbol directly. This makes it clear where reflect.call is coming
from without any spooky action at a distance and eliminates all of the
definitions of reflect.call in the runtime.

Change-Id: I3ec73cd394efe9df8d3061a57c73aece2e7048dd
Reviewed-on: https://go-review.googlesource.com/c/148657
Run-TryBot: Austin Clements <austin@google.com>
TryBot-Result: Gobot Gobot <gobot@golang.org>
Reviewed-by: 's avatarBrad Fitzpatrick <bradfitz@golang.org>
Reviewed-by: 's avatarKeith Randall <khr@golang.org>
parent f58b02a2
...@@ -10,7 +10,6 @@ go/types/scope.go: method WriteTo(w io.Writer, n int, recurse bool) should have ...@@ -10,7 +10,6 @@ go/types/scope.go: method WriteTo(w io.Writer, n int, recurse bool) should have
// False positives. // False positives.
// Nothing much to do about cross-package assembly. Unfortunate. // Nothing much to do about cross-package assembly. Unfortunate.
runtime/asm_ARCHSUFF.s: [GOARCH] cannot check cross-package assembly function: call is in package reflect
internal/bytealg/equal_ARCHSUFF.s: [GOARCH] cannot check cross-package assembly function: memequal is in package runtime internal/bytealg/equal_ARCHSUFF.s: [GOARCH] cannot check cross-package assembly function: memequal is in package runtime
internal/bytealg/equal_ARCHSUFF.s: [GOARCH] cannot check cross-package assembly function: memequal_varlen is in package runtime internal/bytealg/equal_ARCHSUFF.s: [GOARCH] cannot check cross-package assembly function: memequal_varlen is in package runtime
......
...@@ -2667,6 +2667,8 @@ func maplen(m unsafe.Pointer) int ...@@ -2667,6 +2667,8 @@ func maplen(m unsafe.Pointer) int
// back into arg+retoffset before returning. If copying result bytes back, // back into arg+retoffset before returning. If copying result bytes back,
// the caller must pass the argument frame type as argtype, so that // the caller must pass the argument frame type as argtype, so that
// call can execute appropriate write barriers during the copy. // call can execute appropriate write barriers during the copy.
//
//go:linkname call runtime.reflectcall
func call(argtype *rtype, fn, arg unsafe.Pointer, n uint32, retoffset uint32) func call(argtype *rtype, fn, arg unsafe.Pointer, n uint32, retoffset uint32)
func ifaceE2I(t *rtype, src interface{}, dst unsafe.Pointer) func ifaceE2I(t *rtype, src interface{}, dst unsafe.Pointer)
......
...@@ -493,9 +493,6 @@ TEXT runtime·morestack_noctxt(SB),NOSPLIT,$0-0 ...@@ -493,9 +493,6 @@ TEXT runtime·morestack_noctxt(SB),NOSPLIT,$0-0
JMP AX JMP AX
// Note: can't just "JMP NAME(SB)" - bad inlining results. // Note: can't just "JMP NAME(SB)" - bad inlining results.
TEXT reflect·call(SB), NOSPLIT, $0-0
JMP ·reflectcall(SB)
TEXT ·reflectcall(SB), NOSPLIT, $0-20 TEXT ·reflectcall(SB), NOSPLIT, $0-20
MOVL argsize+12(FP), CX MOVL argsize+12(FP), CX
DISPATCH(runtime·call16, 16) DISPATCH(runtime·call16, 16)
......
...@@ -448,9 +448,6 @@ TEXT runtime·morestack_noctxt(SB),NOSPLIT,$0 ...@@ -448,9 +448,6 @@ TEXT runtime·morestack_noctxt(SB),NOSPLIT,$0
JMP AX JMP AX
// Note: can't just "JMP NAME(SB)" - bad inlining results. // Note: can't just "JMP NAME(SB)" - bad inlining results.
TEXT reflect·call(SB), NOSPLIT, $0-0
JMP ·reflectcall(SB)
TEXT ·reflectcall(SB), NOSPLIT, $0-32 TEXT ·reflectcall(SB), NOSPLIT, $0-32
MOVLQZX argsize+24(FP), CX MOVLQZX argsize+24(FP), CX
DISPATCH(runtime·call32, 32) DISPATCH(runtime·call32, 32)
......
...@@ -318,9 +318,6 @@ TEXT runtime·morestack_noctxt(SB),NOSPLIT,$0 ...@@ -318,9 +318,6 @@ TEXT runtime·morestack_noctxt(SB),NOSPLIT,$0
JMP AX JMP AX
// Note: can't just "JMP NAME(SB)" - bad inlining results. // Note: can't just "JMP NAME(SB)" - bad inlining results.
TEXT reflect·call(SB), NOSPLIT, $0-0
JMP ·reflectcall(SB)
TEXT ·reflectcall(SB), NOSPLIT, $0-20 TEXT ·reflectcall(SB), NOSPLIT, $0-20
MOVLQZX argsize+12(FP), CX MOVLQZX argsize+12(FP), CX
DISPATCH(runtime·call16, 16) DISPATCH(runtime·call16, 16)
......
...@@ -439,9 +439,6 @@ TEXT runtime·morestack_noctxt(SB),NOSPLIT|NOFRAME,$0-0 ...@@ -439,9 +439,6 @@ TEXT runtime·morestack_noctxt(SB),NOSPLIT|NOFRAME,$0-0
MOVW $NAME(SB), R1; \ MOVW $NAME(SB), R1; \
B (R1) B (R1)
TEXT reflect·call(SB), NOSPLIT, $0-0
B ·reflectcall(SB)
TEXT ·reflectcall(SB),NOSPLIT|NOFRAME,$0-20 TEXT ·reflectcall(SB),NOSPLIT|NOFRAME,$0-20
MOVW argsize+12(FP), R0 MOVW argsize+12(FP), R0
DISPATCH(runtime·call16, 16) DISPATCH(runtime·call16, 16)
......
...@@ -330,9 +330,6 @@ TEXT runtime·morestack_noctxt(SB),NOSPLIT|NOFRAME,$0-0 ...@@ -330,9 +330,6 @@ TEXT runtime·morestack_noctxt(SB),NOSPLIT|NOFRAME,$0-0
B (R27) B (R27)
// Note: can't just "B NAME(SB)" - bad inlining results. // Note: can't just "B NAME(SB)" - bad inlining results.
TEXT reflect·call(SB), NOSPLIT, $0-0
B ·reflectcall(SB)
TEXT ·reflectcall(SB), NOSPLIT|NOFRAME, $0-32 TEXT ·reflectcall(SB), NOSPLIT|NOFRAME, $0-32
MOVWU argsize+24(FP), R16 MOVWU argsize+24(FP), R16
DISPATCH(runtime·call32, 32) DISPATCH(runtime·call32, 32)
......
...@@ -292,9 +292,6 @@ TEXT runtime·morestack_noctxt(SB),NOSPLIT|NOFRAME,$0-0 ...@@ -292,9 +292,6 @@ TEXT runtime·morestack_noctxt(SB),NOSPLIT|NOFRAME,$0-0
JMP (R4) JMP (R4)
// Note: can't just "BR NAME(SB)" - bad inlining results. // Note: can't just "BR NAME(SB)" - bad inlining results.
TEXT reflect·call(SB), NOSPLIT, $0-0
JMP ·reflectcall(SB)
TEXT ·reflectcall(SB), NOSPLIT|NOFRAME, $0-32 TEXT ·reflectcall(SB), NOSPLIT|NOFRAME, $0-32
MOVWU argsize+24(FP), R1 MOVWU argsize+24(FP), R1
DISPATCH(runtime·call32, 32) DISPATCH(runtime·call32, 32)
......
...@@ -291,9 +291,6 @@ TEXT runtime·morestack_noctxt(SB),NOSPLIT,$0-0 ...@@ -291,9 +291,6 @@ TEXT runtime·morestack_noctxt(SB),NOSPLIT,$0-0
MOVW $NAME(SB), R4; \ MOVW $NAME(SB), R4; \
JMP (R4) JMP (R4)
TEXT reflect·call(SB),NOSPLIT,$0-20
JMP ·reflectcall(SB)
TEXT ·reflectcall(SB),NOSPLIT|NOFRAME,$0-20 TEXT ·reflectcall(SB),NOSPLIT|NOFRAME,$0-20
MOVW argsize+12(FP), R1 MOVW argsize+12(FP), R1
......
...@@ -355,9 +355,6 @@ TEXT runtime·morestack_noctxt(SB),NOSPLIT|NOFRAME,$0-0 ...@@ -355,9 +355,6 @@ TEXT runtime·morestack_noctxt(SB),NOSPLIT|NOFRAME,$0-0
BR (CTR) BR (CTR)
// Note: can't just "BR NAME(SB)" - bad inlining results. // Note: can't just "BR NAME(SB)" - bad inlining results.
TEXT reflect·call(SB), NOSPLIT, $0-0
BR ·reflectcall(SB)
TEXT ·reflectcall(SB), NOSPLIT|NOFRAME, $0-32 TEXT ·reflectcall(SB), NOSPLIT|NOFRAME, $0-32
MOVWZ argsize+24(FP), R3 MOVWZ argsize+24(FP), R3
DISPATCH(runtime·call32, 32) DISPATCH(runtime·call32, 32)
......
...@@ -381,9 +381,6 @@ TEXT runtime·morestack_noctxt(SB),NOSPLIT|NOFRAME,$0-0 ...@@ -381,9 +381,6 @@ TEXT runtime·morestack_noctxt(SB),NOSPLIT|NOFRAME,$0-0
BR (R5) BR (R5)
// Note: can't just "BR NAME(SB)" - bad inlining results. // Note: can't just "BR NAME(SB)" - bad inlining results.
TEXT reflect·call(SB), NOSPLIT, $0-0
BR ·reflectcall(SB)
TEXT ·reflectcall(SB), NOSPLIT, $-8-32 TEXT ·reflectcall(SB), NOSPLIT, $-8-32
MOVWZ argsize+24(FP), R3 MOVWZ argsize+24(FP), R3
DISPATCH(runtime·call32, 32) DISPATCH(runtime·call32, 32)
......
...@@ -293,9 +293,6 @@ TEXT ·cgocallback_gofunc(SB), NOSPLIT, $16-32 ...@@ -293,9 +293,6 @@ TEXT ·cgocallback_gofunc(SB), NOSPLIT, $16-32
JMP NAME(SB); \ JMP NAME(SB); \
End End
TEXT reflect·call(SB), NOSPLIT, $0-0
JMP ·reflectcall(SB)
TEXT ·reflectcall(SB), NOSPLIT, $0-32 TEXT ·reflectcall(SB), NOSPLIT, $0-32
I64Load fn+8(FP) I64Load fn+8(FP)
I64Eqz I64Eqz
......
...@@ -154,6 +154,8 @@ func breakpoint() ...@@ -154,6 +154,8 @@ func breakpoint()
// one call that copies results back, in cgocallbackg1, and it does NOT pass a // one call that copies results back, in cgocallbackg1, and it does NOT pass a
// frame type, meaning there are no write barriers invoked. See that call // frame type, meaning there are no write barriers invoked. See that call
// site for justification. // site for justification.
//
// Package reflect accesses this symbol through a linkname.
func reflectcall(argtype *_type, fn, arg unsafe.Pointer, argsize uint32, retoffset uint32) func reflectcall(argtype *_type, fn, arg unsafe.Pointer, argsize uint32, retoffset uint32)
func procyield(cycles uint32) func procyield(cycles uint32)
......
Markdown is supported
0% or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment