Documentation ¶
Index ¶
- Constants
- func CommonSize(ptrSize int) int
- func FuncPCABI0(f interface{}) uintptr
- func FuncPCABIInternal(f interface{}) uintptr
- func IMethodSize(ptrSize int) int
- func KindOff(ptrSize int) int
- func PtrBytesOff(ptrSize int) int
- func SizeOff(ptrSize int) int
- func StructFieldSize(ptrSize int) int
- func TFlagOff(ptrSize int) int
- func UncommonSize() uint64
- type ArrayType
- type ChanDir
- type ChanType
- type FuncFlag
- type FuncID
- type FuncType
- type Imethod
- type IntArgRegBitmap
- type InterfaceType
- type Kind
- type MapType
- type Method
- type Name
- func (n Name) Data(off int) *byte
- func (n Name) DataChecked(off int, whySafe string) *byte
- func (n Name) HasTag() bool
- func (n Name) IsBlank() bool
- func (n Name) IsEmbedded() bool
- func (n Name) IsExported() bool
- func (n Name) Name() string
- func (n Name) ReadVarint(off int) (int, int)
- func (n Name) Tag() string
- type NameOff
- type Offset
- func (o Offset) Align(a uint8) Offset
- func (o Offset) D16() Offset
- func (o Offset) D32() Offset
- func (o Offset) D64() Offset
- func (o Offset) D8() Offset
- func (o Offset) Interface() Offset
- func (o Offset) Offset() uint64
- func (o Offset) P() Offset
- func (o Offset) PlusUncommon() Offset
- func (o Offset) Slice() Offset
- func (o Offset) String() Offset
- type PtrType
- type RegArgs
- type SliceType
- type StructField
- type StructType
- type TFlag
- type TextOff
- type Type
- func (t *Type) Align() int
- func (t *Type) ArrayType() *ArrayType
- func (t *Type) ChanDir() ChanDir
- func (t *Type) Common() *Type
- func (t *Type) Elem() *Type
- func (t *Type) ExportedMethods() []Method
- func (t *Type) FieldAlign() int
- func (t *Type) FuncType() *FuncType
- func (t *Type) GcSlice(begin, end uintptr) []byte
- func (t *Type) HasName() bool
- func (t *Type) IfaceIndir() bool
- func (t *Type) InterfaceType() *InterfaceType
- func (t *Type) IsDirectIface() bool
- func (t *Type) Key() *Type
- func (t *Type) Kind() Kind
- func (t *Type) Len() int
- func (t *Type) MapType() *MapType
- func (t *Type) NumMethod() int
- func (t *Type) Pointers() bool
- func (t *Type) Size() uintptr
- func (t *Type) StructType() *StructType
- func (t *Type) Uncommon() *UncommonType
- type TypeOff
- type UncommonType
Constants ¶
const ( // RAX, RBX, RCX, RDI, RSI, R8, R9, R10, R11. IntArgRegs = 9 // X0 -> X14. FloatArgRegs = 15 // We use SSE2 registers which support 64-bit float operations. EffectiveFloatRegSize = 8 )
const ( MapBucketCountBits = 3 // log2 of number of elements in a bucket. MapBucketCount = 1 << MapBucketCountBits MapMaxKeyBytes = 128 // Must fit in a uint8. MapMaxElemBytes = 128 // Must fit in a uint8. )
Map constants common to several packages runtime/runtime-gdb.py:MapTypePrinter contains its own copy
const ( // StackNosplitBase is the base maximum number of bytes that a chain of // NOSPLIT functions can use. // // This value must be multiplied by the stack guard multiplier, so do not // use it directly. See runtime/stack.go:stackNosplit and // cmd/internal/objabi/stack.go:StackNosplit. StackNosplitBase = 800 // After a stack split check the SP is allowed to be StackSmall bytes below // the stack guard. // // Functions that need frames <= StackSmall can perform the stack check // using a single comparison directly between the stack guard and the SP // because we ensure that StackSmall bytes of stack space are available // beyond the stack guard. StackSmall = 128 // Functions that need frames <= StackBig can assume that neither // SP-framesize nor stackGuard-StackSmall will underflow, and thus use a // more efficient check. In order to ensure this, StackBig must be <= the // size of the unmapped space at zero. StackBig = 4096 )
const ( PCDATA_UnsafePoint = 0 PCDATA_StackMapIndex = 1 PCDATA_InlTreeIndex = 2 PCDATA_ArgLiveIndex = 3 FUNCDATA_ArgsPointerMaps = 0 FUNCDATA_LocalsPointerMaps = 1 FUNCDATA_StackObjects = 2 FUNCDATA_InlTree = 3 FUNCDATA_OpenCodedDeferInfo = 4 FUNCDATA_ArgInfo = 5 FUNCDATA_ArgLiveInfo = 6 FUNCDATA_WrapInfo = 7 )
IDs for PCDATA and FUNCDATA tables in Go binaries.
These must agree with ../../../runtime/funcdata.h.
const ( UnsafePointSafe = -1 // Safe for async preemption UnsafePointUnsafe = -2 // Unsafe for async preemption // UnsafePointRestart1(2) apply on a sequence of instructions, within // which if an async preemption happens, we should back off the PC // to the start of the sequence when resuming. // We need two so we can distinguish the start/end of the sequence // in case that two sequences are next to each other. UnsafePointRestart1 = -3 UnsafePointRestart2 = -4 // Like UnsafePointRestart1, but back to function entry if async preempted. UnsafePointRestartAtEntry = -5 )
Special values for the PCDATA_UnsafePoint table.
const ( // TODO (khr, drchase) why aren't these in TFlag? Investigate, fix if possible. KindDirectIface = 1 << 5 KindGCProg = 1 << 6 // Type.gc points to GC program KindMask = (1 << 5) - 1 )
const ArgsSizeUnknown = -0x80000000
ArgsSizeUnknown is set in Func.argsize to mark all functions whose argument size is unknown (C vararg functions, and assembly code without an explicit specification). This value is generated by the compiler, assembler, or linker.
Variables ¶
This section is empty.
Functions ¶
func CommonSize ¶ added in go1.21.0
CommonSize returns sizeof(Type) for a compilation target with a given ptrSize
func FuncPCABI0 ¶
func FuncPCABI0(f interface{}) uintptr
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 FuncPCABIInternal ¶
func FuncPCABIInternal(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 IMethodSize ¶ added in go1.21.0
IMethodSize returns sizeof(IMethod) for a compilation target with a given ptrSize
func KindOff ¶ added in go1.21.0
KindOff returns the offset of Type.Kind_ for a compilation target with a given ptrSize
func PtrBytesOff ¶ added in go1.21.0
PtrBytes returns the offset of Type.PtrBytes for a compilation target with a given ptrSize
func SizeOff ¶ added in go1.21.0
SizeOff returns the offset of Type.Size_ for a compilation target with a given ptrSize
func StructFieldSize ¶ added in go1.21.0
StructFieldSize returns sizeof(StructField) for a compilation target with a given ptrSize
func TFlagOff ¶ added in go1.21.0
TFlagOff returns the offset of Type.TFlag for a compilation target with a given ptrSize
func UncommonSize ¶ added in go1.21.0
func UncommonSize() uint64
UncommonSize returns sizeof(UncommonType). This currently does not depend on ptrSize. This exported function is in an internal package, so it may change to depend on ptrSize in the future.
Types ¶
type ArrayType ¶ added in go1.21.0
type ArrayType struct { Type Elem *Type // array element type Slice *Type // slice type Len uintptr }
ArrayType represents a fixed array type.
type FuncFlag ¶ added in go1.21.0
type FuncFlag uint8
A FuncFlag records bits about a function, passed to the runtime.
const ( // FuncFlagTopFrame indicates a function that appears at the top of its stack. // The traceback routine stop at such a function and consider that a // successful, complete traversal of the stack. // Examples of TopFrame functions include goexit, which appears // at the top of a user goroutine stack, and mstart, which appears // at the top of a system goroutine stack. FuncFlagTopFrame FuncFlag = 1 << iota // FuncFlagSPWrite indicates a function that writes an arbitrary value to SP // (any write other than adding or subtracting a constant amount). // The traceback routines cannot encode such changes into the // pcsp tables, so the function traceback cannot safely unwind past // SPWrite functions. Stopping at an SPWrite function is considered // to be an incomplete unwinding of the stack. In certain contexts // (in particular garbage collector stack scans) that is a fatal error. FuncFlagSPWrite // FuncFlagAsm indicates that a function was implemented in assembly. FuncFlagAsm )
type FuncID ¶ added in go1.21.0
type FuncID uint8
A FuncID identifies particular functions that need to be treated specially by the runtime. Note that in some situations involving plugins, there may be multiple copies of a particular special runtime function.
const ( FuncIDNormal FuncID = iota // not a special function FuncID_abort FuncID_asmcgocall FuncID_asyncPreempt FuncID_cgocallback FuncID_debugCallV2 FuncID_gcBgMarkWorker FuncID_goexit FuncID_gogo FuncID_gopanic FuncID_handleAsyncEvent FuncID_mcall FuncID_morestack FuncID_mstart FuncID_panicwrap FuncID_rt0_go FuncID_runfinq FuncID_runtime_main FuncID_sigpanic FuncID_systemstack FuncID_systemstack_switch FuncIDWrapper // any autogenerated code (hash/eq algorithms, method wrappers, etc.) )
type FuncType ¶ added in go1.21.0
type FuncType struct { Type InCount uint16 OutCount uint16 // top bit is set if last input parameter is ... }
funcType represents a function type.
A *Type for each in and out parameter is stored in an array that directly follows the funcType (and possibly its uncommonType). So a function type with one method, one input, and one output is:
struct { funcType uncommonType [2]*rtype // [0] is in, [1] is out }
func (*FuncType) IsVariadic ¶ added in go1.21.0
type IntArgRegBitmap ¶
type IntArgRegBitmap [(IntArgRegs + 7) / 8]uint8
IntArgRegBitmap is a bitmap large enough to hold one bit per integer argument/return register.
func (*IntArgRegBitmap) Get ¶
func (b *IntArgRegBitmap) Get(i int) bool
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.
func (*IntArgRegBitmap) Set ¶
func (b *IntArgRegBitmap) Set(i int)
Set sets the i'th bit of the bitmap to 1.
type InterfaceType ¶ added in go1.21.0
func (*InterfaceType) NumMethod ¶ added in go1.21.0
func (t *InterfaceType) NumMethod() int
NumMethod returns the number of interface methods in the type's method set.
type Kind ¶ added in go1.21.0
type Kind uint
A Kind represents the specific kind of type that a Type represents. The zero Kind is not a valid kind.
type MapType ¶ added in go1.21.0
type MapType struct { Type Key *Type Elem *Type Bucket *Type // internal type representing a hash bucket // function for hashing keys (ptr to key, seed) -> hash Hasher func(unsafe.Pointer, uintptr) uintptr KeySize uint8 // size of key slot ValueSize uint8 // size of elem slot BucketSize uint16 // size of bucket Flags uint32 }
func (*MapType) HashMightPanic ¶ added in go1.21.0
func (*MapType) IndirectElem ¶ added in go1.21.0
func (*MapType) IndirectKey ¶ added in go1.21.0
Note: flag values must match those used in the TMAP case in ../cmd/compile/internal/reflectdata/reflect.go:writeType.
func (*MapType) NeedKeyUpdate ¶ added in go1.21.0
func (*MapType) ReflexiveKey ¶ added in go1.21.0
type Method ¶ added in go1.21.0
type Method struct { Name NameOff // name of method Mtyp TypeOff // method type (without receiver) Ifn TextOff // fn used in interface call (one-word receiver) Tfn TextOff // fn used for normal method call }
Method on non-interface type
type Name ¶ added in go1.21.0
type Name struct {
Bytes *byte
}
func (Name) Data ¶ added in go1.21.0
Data does pointer arithmetic on n's Bytes, and that arithmetic is asserted to be safe because the runtime made the call (other packages use DataChecked)
func (Name) DataChecked ¶ added in go1.21.0
DataChecked does pointer arithmetic on n's Bytes, and that arithmetic is asserted to be safe for the reason in whySafe (which can appear in a backtrace, etc.)
func (Name) HasTag ¶ added in go1.21.0
HasTag returns true iff there is tag data following this name
func (Name) IsEmbedded ¶ added in go1.21.0
IsEmbedded returns true iff n is embedded (an anonymous field).
func (Name) IsExported ¶ added in go1.21.0
IsExported returns "is n exported?"
func (Name) ReadVarint ¶ added in go1.21.0
ReadVarint parses a varint as encoded by encoding/binary. It returns the number of encoded bytes and the encoded value.
type NameOff ¶ added in go1.21.0
type NameOff int32
NameOff is the offset to a name from moduledata.types. See resolveNameOff in runtime.
type Offset ¶ added in go1.21.0
type Offset struct {
// contains filtered or unexported fields
}
Offset is for computing offsets of type data structures at compile/link time; the target platform may not be the host platform. Its state includes the current offset, necessary alignment for the sequence of types, and the size of pointers and alignment of slices, interfaces, and strings (this is for tearing- resistant access to these types, if/when that is supported).
func CommonOffset ¶ added in go1.21.0
CommonOffset returns the Offset to the data after the common portion of type data structures.
func InitializedOffset ¶ added in go1.21.0
InitializedOffset returns a new Offset with specified offset, alignment, pointer size, and slice alignment.
func (Offset) Align ¶ added in go1.21.0
Align returns the offset obtained by aligning offset to a multiple of a. a must be a power of two.
func (Offset) D16 ¶ added in go1.21.0
D16 returns the offset obtained by appending a 16-bit field to o.
func (Offset) D32 ¶ added in go1.21.0
D32 returns the offset obtained by appending a 32-bit field to o.
func (Offset) D64 ¶ added in go1.21.0
D64 returns the offset obtained by appending a 64-bit field to o.
func (Offset) D8 ¶ added in go1.21.0
D8 returns the offset obtained by appending an 8-bit field to o.
func (Offset) Interface ¶ added in go1.21.0
Interface returns the offset obtained by appending an interface field to o.
func (Offset) Offset ¶ added in go1.21.0
Offset returns the struct-aligned offset (size) of o. This is at least as large as the current internal offset; it may be larger.
func (Offset) P ¶ added in go1.21.0
D64 returns the offset obtained by appending a pointer field to o.
func (Offset) PlusUncommon ¶ added in go1.21.0
type RegArgs ¶
type RegArgs struct { // Values in these slots should be precisely the bit-by-bit // representation of how they would appear in a register. // // This means that on big endian arches, integer values should // be in the top bits of the slot. Floats are usually just // directly represented, but some architectures treat narrow // width floating point values specially (e.g. they're promoted // first, or they need to be NaN-boxed). Ints [IntArgRegs]uintptr // untyped integer registers Floats [FloatArgRegs]uint64 // untyped float registers // 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 }
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.
func (*RegArgs) IntRegArgAddr ¶ added in go1.18
IntRegArgAddr returns a pointer inside of r.Ints[reg] that is appropriately offset for an argument of size argSize.
argSize must be non-zero, fit in a register, and a power-of-two.
This method is a helper for dealing with the endianness of different CPU architectures, since sub-word-sized arguments in big endian architectures need to be "aligned" to the upper edge of the register to be interpreted by the CPU correctly.
type StructField ¶ added in go1.21.0
type StructField struct { Name Name // name is always non-empty Typ *Type // type of field Offset uintptr // byte offset of field }
func (*StructField) Embedded ¶ added in go1.21.0
func (f *StructField) Embedded() bool
type StructType ¶ added in go1.21.0
type StructType struct { Type PkgPath Name Fields []StructField }
type TFlag ¶ added in go1.21.0
type TFlag uint8
TFlag is used by a Type to signal what extra type information is available in the memory directly following the Type value.
const ( // TFlagUncommon means that there is a data with a type, UncommonType, // just beyond the shared-per-type common data. That is, the data // for struct types will store their UncommonType at one offset, the // data for interface types will store their UncommonType at a different // offset. UncommonType is always accessed via a pointer that is computed // using trust-us-we-are-the-implementors pointer arithmetic. // // For example, if t.Kind() == Struct and t.tflag&TFlagUncommon != 0, // then t has UncommonType data and it can be accessed as: // // type structTypeUncommon struct { // structType // u UncommonType // } // u := &(*structTypeUncommon)(unsafe.Pointer(t)).u TFlagUncommon TFlag = 1 << 0 // TFlagExtraStar means the name in the str field has an // extraneous '*' prefix. This is because for most types T in // a program, the type *T also exists and reusing the str data // saves binary size. TFlagExtraStar TFlag = 1 << 1 // TFlagNamed means the type has a name. TFlagNamed TFlag = 1 << 2 // TFlagRegularMemory means that equal and hash functions can treat // this type as a single region of t.size bytes. TFlagRegularMemory TFlag = 1 << 3 )
type TextOff ¶ added in go1.21.0
type TextOff int32
TextOff is an offset from the top of a text section. See (rtype).textOff in runtime.
type Type ¶ added in go1.21.0
type Type struct { Size_ uintptr PtrBytes uintptr // number of (prefix) bytes in the type that can contain pointers Hash uint32 // hash of type; avoids computation in hash tables TFlag TFlag // extra type information flags Align_ uint8 // alignment of variable with this type FieldAlign_ uint8 // alignment of struct field with this type Kind_ uint8 // enumeration for C // function for comparing objects of this type // (ptr to object A, ptr to object B) -> ==? Equal func(unsafe.Pointer, unsafe.Pointer) bool // GCData stores the GC type data for the garbage collector. // If the KindGCProg bit is set in kind, GCData is a GC program. // Otherwise it is a ptrmask bitmap. See mbitmap.go for details. GCData *byte Str NameOff // string form PtrToThis TypeOff // type for pointer to this type, may be zero }
Type is the runtime representation of a Go type.
Type is also referenced implicitly (in the form of expressions involving constants and arch.PtrSize) in cmd/compile/internal/reflectdata/reflect.go and cmd/link/internal/ld/decodesym.go (e.g. data[2*arch.PtrSize+4] references the TFlag field) unsafe.OffsetOf(Type{}.TFlag) cannot be used directly in those places because it varies with cross compilation and experiments.
func (*Type) ArrayType ¶ added in go1.21.0
ArrayType returns t cast to a *ArrayType, or nil if its tag does not match.
func (*Type) ChanDir ¶ added in go1.21.0
ChanDir returns the direction of t if t is a channel type, otherwise InvalidDir (0).
func (*Type) Elem ¶ added in go1.21.0
Elem returns the element type for t if t is an array, channel, map, pointer, or slice, otherwise nil.
func (*Type) ExportedMethods ¶ added in go1.21.0
func (*Type) FieldAlign ¶ added in go1.21.0
func (*Type) FuncType ¶ added in go1.21.0
FuncType returns t cast to a *FuncType, or nil if its tag does not match.
func (*Type) IfaceIndir ¶ added in go1.21.0
IfaceIndir reports whether t is stored indirectly in an interface value.
func (*Type) InterfaceType ¶ added in go1.21.0
func (t *Type) InterfaceType() *InterfaceType
InterfaceType returns t cast to a *InterfaceType, or nil if its tag does not match.
func (*Type) IsDirectIface ¶ added in go1.21.0
isDirectIface reports whether t is stored directly in an interface value.
func (*Type) MapType ¶ added in go1.21.0
MapType returns t cast to a *MapType, or nil if its tag does not match.
func (*Type) StructType ¶ added in go1.21.0
func (t *Type) StructType() *StructType
StructType returns t cast to a *StructType, or nil if its tag does not match.
func (*Type) Uncommon ¶ added in go1.21.0
func (t *Type) Uncommon() *UncommonType
Uncommon returns a pointer to T's "uncommon" data if there is any, otherwise nil
type TypeOff ¶ added in go1.21.0
type TypeOff int32
TypeOff is the offset to a type from moduledata.types. See resolveTypeOff in runtime.
type UncommonType ¶ added in go1.21.0
type UncommonType struct { PkgPath NameOff // import path; empty for built-in types like int, string Mcount uint16 // number of methods Xcount uint16 // number of exported methods Moff uint32 // offset from this uncommontype to [mcount]Method // contains filtered or unexported fields }
UncommonType is present only for defined types or types with methods (if T is a defined type, the uncommonTypes for T and *T have methods). Using a pointer to this struct reduces the overall size required to describe a non-defined type with no methods.
func (*UncommonType) ExportedMethods ¶ added in go1.21.0
func (t *UncommonType) ExportedMethods() []Method
func (*UncommonType) Methods ¶ added in go1.21.0
func (t *UncommonType) Methods() []Method