mirror of https://github.com/golang/go.git
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: Brad Fitzpatrick <bradfitz@golang.org> Reviewed-by: Keith Randall <khr@golang.org>
This commit is contained in:
parent
f58b02a29c
commit
4f3604d3f2
|
|
@ -10,7 +10,6 @@ go/types/scope.go: method WriteTo(w io.Writer, n int, recurse bool) should have
|
|||
// False positives.
|
||||
|
||||
// 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_varlen is in package runtime
|
||||
|
||||
|
|
|
|||
|
|
@ -2667,6 +2667,8 @@ func maplen(m unsafe.Pointer) int
|
|||
// back into arg+retoffset before returning. If copying result bytes back,
|
||||
// the caller must pass the argument frame type as argtype, so that
|
||||
// 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 ifaceE2I(t *rtype, src interface{}, dst unsafe.Pointer)
|
||||
|
|
|
|||
|
|
@ -493,9 +493,6 @@ TEXT runtime·morestack_noctxt(SB),NOSPLIT,$0-0
|
|||
JMP AX
|
||||
// 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
|
||||
MOVL argsize+12(FP), CX
|
||||
DISPATCH(runtime·call16, 16)
|
||||
|
|
|
|||
|
|
@ -448,9 +448,6 @@ TEXT runtime·morestack_noctxt(SB),NOSPLIT,$0
|
|||
JMP AX
|
||||
// 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
|
||||
MOVLQZX argsize+24(FP), CX
|
||||
DISPATCH(runtime·call32, 32)
|
||||
|
|
|
|||
|
|
@ -318,9 +318,6 @@ TEXT runtime·morestack_noctxt(SB),NOSPLIT,$0
|
|||
JMP AX
|
||||
// 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
|
||||
MOVLQZX argsize+12(FP), CX
|
||||
DISPATCH(runtime·call16, 16)
|
||||
|
|
|
|||
|
|
@ -439,9 +439,6 @@ TEXT runtime·morestack_noctxt(SB),NOSPLIT|NOFRAME,$0-0
|
|||
MOVW $NAME(SB), R1; \
|
||||
B (R1)
|
||||
|
||||
TEXT reflect·call(SB), NOSPLIT, $0-0
|
||||
B ·reflectcall(SB)
|
||||
|
||||
TEXT ·reflectcall(SB),NOSPLIT|NOFRAME,$0-20
|
||||
MOVW argsize+12(FP), R0
|
||||
DISPATCH(runtime·call16, 16)
|
||||
|
|
|
|||
|
|
@ -330,9 +330,6 @@ TEXT runtime·morestack_noctxt(SB),NOSPLIT|NOFRAME,$0-0
|
|||
B (R27)
|
||||
// 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
|
||||
MOVWU argsize+24(FP), R16
|
||||
DISPATCH(runtime·call32, 32)
|
||||
|
|
|
|||
|
|
@ -292,9 +292,6 @@ TEXT runtime·morestack_noctxt(SB),NOSPLIT|NOFRAME,$0-0
|
|||
JMP (R4)
|
||||
// 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
|
||||
MOVWU argsize+24(FP), R1
|
||||
DISPATCH(runtime·call32, 32)
|
||||
|
|
|
|||
|
|
@ -291,9 +291,6 @@ TEXT runtime·morestack_noctxt(SB),NOSPLIT,$0-0
|
|||
MOVW $NAME(SB), R4; \
|
||||
JMP (R4)
|
||||
|
||||
TEXT reflect·call(SB),NOSPLIT,$0-20
|
||||
JMP ·reflectcall(SB)
|
||||
|
||||
TEXT ·reflectcall(SB),NOSPLIT|NOFRAME,$0-20
|
||||
MOVW argsize+12(FP), R1
|
||||
|
||||
|
|
|
|||
|
|
@ -355,9 +355,6 @@ TEXT runtime·morestack_noctxt(SB),NOSPLIT|NOFRAME,$0-0
|
|||
BR (CTR)
|
||||
// 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
|
||||
MOVWZ argsize+24(FP), R3
|
||||
DISPATCH(runtime·call32, 32)
|
||||
|
|
|
|||
|
|
@ -381,9 +381,6 @@ TEXT runtime·morestack_noctxt(SB),NOSPLIT|NOFRAME,$0-0
|
|||
BR (R5)
|
||||
// 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
|
||||
MOVWZ argsize+24(FP), R3
|
||||
DISPATCH(runtime·call32, 32)
|
||||
|
|
|
|||
|
|
@ -293,9 +293,6 @@ TEXT ·cgocallback_gofunc(SB), NOSPLIT, $16-32
|
|||
JMP NAME(SB); \
|
||||
End
|
||||
|
||||
TEXT reflect·call(SB), NOSPLIT, $0-0
|
||||
JMP ·reflectcall(SB)
|
||||
|
||||
TEXT ·reflectcall(SB), NOSPLIT, $0-32
|
||||
I64Load fn+8(FP)
|
||||
I64Eqz
|
||||
|
|
|
|||
|
|
@ -154,6 +154,8 @@ func breakpoint()
|
|||
// 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
|
||||
// site for justification.
|
||||
//
|
||||
// Package reflect accesses this symbol through a linkname.
|
||||
func reflectcall(argtype *_type, fn, arg unsafe.Pointer, argsize uint32, retoffset uint32)
|
||||
|
||||
func procyield(cycles uint32)
|
||||
|
|
|
|||
Loading…
Reference in New Issue