mirror of
https://github.com/golang/go.git
synced 2025-12-08 06:10:04 +00:00
[dev.regabi] reflect: support for register ABI on amd64 for reflect.(Value).Call
This change adds support for the new register ABI on amd64 to reflect.(Value).Call. If internal/abi's register counts are non-zero, reflect will try to set up arguments in registers on the Call path. Note that because the register ABI becomes ABI0 with zero registers available, this should keep working as it did before. This change does not add any tests for the register ABI case because there's no way to do so at the moment. For #40724. Change-Id: I8aa089a5aa5a31b72e56b3d9388dd3f82203985b Reviewed-on: https://go-review.googlesource.com/c/go/+/272568 Trust: Michael Knyszek <mknyszek@google.com> Run-TryBot: Michael Knyszek <mknyszek@google.com> TryBot-Result: Go Bot <gobot@golang.org> Reviewed-by: Cherry Zhang <cherryyz@google.com> Reviewed-by: Than McIntosh <thanm@google.com>
This commit is contained in:
parent
b81efb7ec4
commit
e0215315f5
22 changed files with 951 additions and 242 deletions
|
|
@ -23,15 +23,17 @@ const PtrSize = ptrSize
|
|||
|
||||
func FuncLayout(t Type, rcvr Type) (frametype Type, argSize, retOffset uintptr, stack []byte, gc []byte, ptrs bool) {
|
||||
var ft *rtype
|
||||
var s *bitVector
|
||||
var abi abiDesc
|
||||
if rcvr != nil {
|
||||
ft, argSize, retOffset, s, _ = funcLayout((*funcType)(unsafe.Pointer(t.(*rtype))), rcvr.(*rtype))
|
||||
ft, _, abi = funcLayout((*funcType)(unsafe.Pointer(t.(*rtype))), rcvr.(*rtype))
|
||||
} else {
|
||||
ft, argSize, retOffset, s, _ = funcLayout((*funcType)(unsafe.Pointer(t.(*rtype))), nil)
|
||||
ft, _, abi = funcLayout((*funcType)(unsafe.Pointer(t.(*rtype))), nil)
|
||||
}
|
||||
argSize = abi.stackCallArgsSize
|
||||
retOffset = abi.retOffset
|
||||
frametype = ft
|
||||
for i := uint32(0); i < s.n; i++ {
|
||||
stack = append(stack, s.data[i/8]>>(i%8)&1)
|
||||
for i := uint32(0); i < abi.stackPtrs.n; i++ {
|
||||
stack = append(stack, abi.stackPtrs.data[i/8]>>(i%8)&1)
|
||||
}
|
||||
if ft.kind&kindGCProg != 0 {
|
||||
panic("can't handle gc programs")
|
||||
|
|
|
|||
Loading…
Add table
Add a link
Reference in a new issue