mirror of https://github.com/golang/go.git
78 lines
2.7 KiB
Go
78 lines
2.7 KiB
Go
// Copyright 2020 The Go Authors. All rights reserved.
|
|
// Use of this source code is governed by a BSD-style
|
|
// license that can be found in the LICENSE file.
|
|
|
|
package abi
|
|
|
|
import "unsafe"
|
|
|
|
// RegArgs is a struct that has space for each argument
|
|
// and return value register on the current architecture.
|
|
//
|
|
// Assembly code knows the layout of the first two fields
|
|
// of RegArgs.
|
|
//
|
|
// RegArgs also contains additional space to hold pointers
|
|
// when it may not be safe to keep them only in the integer
|
|
// register space otherwise.
|
|
type RegArgs struct {
|
|
Ints [IntArgRegs]uintptr // untyped integer registers
|
|
Floats [FloatArgRegs]uint64 // untyped float registers
|
|
|
|
// Fields above this point are known to assembly.
|
|
|
|
// Ptrs is a space that duplicates Ints but with pointer type,
|
|
// used to make pointers passed or returned in registers
|
|
// visible to the GC by making the type unsafe.Pointer.
|
|
Ptrs [IntArgRegs]unsafe.Pointer
|
|
|
|
// ReturnIsPtr is a bitmap that indicates which registers
|
|
// contain or will contain pointers on the return path from
|
|
// a reflectcall. The i'th bit indicates whether the i'th
|
|
// register contains or will contain a valid Go pointer.
|
|
ReturnIsPtr IntArgRegBitmap
|
|
}
|
|
|
|
// IntArgRegBitmap is a bitmap large enough to hold one bit per
|
|
// integer argument/return register.
|
|
type IntArgRegBitmap [(IntArgRegs + 7) / 8]uint8
|
|
|
|
// Set sets the i'th bit of the bitmap to 1.
|
|
func (b *IntArgRegBitmap) Set(i int) {
|
|
b[i/8] |= uint8(1) << (i % 8)
|
|
}
|
|
|
|
// Get returns whether the i'th bit of the bitmap is set.
|
|
//
|
|
// nosplit because it's called in extremely sensitive contexts, like
|
|
// on the reflectcall return path.
|
|
//
|
|
//go:nosplit
|
|
func (b *IntArgRegBitmap) Get(i int) bool {
|
|
return b[i/8]&(uint8(1)<<(i%8)) != 0
|
|
}
|
|
|
|
// FuncPC* intrinsics.
|
|
//
|
|
// CAREFUL: In programs with plugins, FuncPC* can return different values
|
|
// for the same function (because there are actually multiple copies of
|
|
// the same function in the address space). To be safe, don't use the
|
|
// results of this function in any == expression. It is only safe to
|
|
// use the result as an address at which to start executing code.
|
|
|
|
// FuncPCABI0 returns the entry PC of the function f, which must be a
|
|
// direct reference of a function defined as ABI0. Otherwise it is a
|
|
// compile-time error.
|
|
//
|
|
// Implemented as a compile intrinsic.
|
|
func FuncPCABI0(f interface{}) uintptr
|
|
|
|
// FuncPCABIInternal returns the entry PC of the function f. If f is a
|
|
// direct reference of a function, it must be defined as ABIInternal.
|
|
// Otherwise it is a compile-time error. If f is not a direct reference
|
|
// of a defined function, it assumes that f is a func value. Otherwise
|
|
// the behavior is undefined.
|
|
//
|
|
// Implemented as a compile intrinsic.
|
|
func FuncPCABIInternal(f interface{}) uintptr
|