|  | // 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 |