package gc
import "cmd/compile/internal/gc"
Index ¶
- Constants
- Variables
- func AddAux(a *obj.Addr, v *ssa.Value)
- func AddAux2(a *obj.Addr, v *ssa.Value, offset int64)
- func AddrAuto(a *obj.Addr, v *ssa.Value)
- func Addrconst(a *obj.Addr, v int64)
- func CheckLoweredGetClosurePtr(v *ssa.Value)
- func CheckLoweredPhi(v *ssa.Value)
- func Dump(s string, n *Node)
- func EqCanPanic(t *types.Type) bool
- func Exit(code int)
- func Fatalf(fmt_ string, args ...interface{})
- func IncomparableField(t *types.Type) *types.Field
- func IsAlias(sym *types.Sym) bool
- func IsComparable(t *types.Type) bool
- func IsRegularMemory(t *types.Type) bool
- func Isconst(n *Node, ct Ctype) bool
- func Main(archInit func(*Arch))
- func Patch(p *obj.Prog, to *obj.Prog)
- func Rnd(o int64, r int64) int64
- func Warn(fmt_ string, args ...interface{})
- func Warnl(line src.XPos, fmt_ string, args ...interface{})
- type AlgKind
- type Arch
- type BlockEffects
- type Branch
- type Class
- type Ctype
- type DebugFlags
- type Dlist
- type Error
- type EscEdge
- type EscHole
- type EscLeaks
- func ParseLeaks(s string) EscLeaks
- func (l *EscLeaks) AddHeap(derefs int)
- func (l *EscLeaks) AddResult(i, derefs int)
- func (l EscLeaks) Empty() bool
- func (l EscLeaks) Encode() string
- func (l EscLeaks) Heap() int
- func (l *EscLeaks) Optimize()
- func (l EscLeaks) Result(i int) int
- type EscLocation
- type EscNote
- type Escape
- type FmtFlag
- type Func
- func (f *Func) Dupok() bool
- func (f *Func) ExportInline() bool
- func (f *Func) HasDefer() bool
- func (f *Func) InlinabilityChecked() bool
- func (f *Func) InstrumentBody() bool
- func (f *Func) IsHiddenClosure() bool
- func (f *Func) Needctxt() bool
- func (f *Func) NilCheckDisabled() bool
- func (f *Func) OpenCodedDeferDisallowed() bool
- func (f *Func) ReflectMethod() bool
- func (f *Func) SetDupok(b bool)
- func (f *Func) SetExportInline(b bool)
- func (f *Func) SetHasDefer(b bool)
- func (f *Func) SetInlinabilityChecked(b bool)
- func (f *Func) SetInstrumentBody(b bool)
- func (f *Func) SetIsHiddenClosure(b bool)
- func (f *Func) SetNeedctxt(b bool)
- func (f *Func) SetNilCheckDisabled(b bool)
- func (f *Func) SetOpenCodedDeferDisallowed(b bool)
- func (f *Func) SetReflectMethod(b bool)
- func (f *Func) SetWrapper(b bool)
- func (f *Func) Wrapper() bool
- type GCProg
- type IndexJump
- type InitEntry
- type InitOrder
- type InitPlan
- type InitSchedule
- type Inline
- type Liveness
- type LivenessIndex
- type LivenessMap
- type Mark
- type Mpcplx
- func (v *Mpcplx) Div(rv *Mpcplx) bool
- func (v *Mpcplx) GoString() string
- func (v *Mpcplx) Mul(rv *Mpcplx)
- func (v *Mpcplx) String() string
- type Mpflt
- func (a *Mpflt) Add(b *Mpflt)
- func (a *Mpflt) AddFloat64(c float64)
- func (a *Mpflt) Cmp(b *Mpflt) int
- func (a *Mpflt) CmpFloat64(c float64) int
- func (a *Mpflt) Float32() float64
- func (a *Mpflt) Float64() float64
- func (fvp *Mpflt) GoString() string
- func (a *Mpflt) Mul(b *Mpflt)
- func (a *Mpflt) MulFloat64(c float64)
- func (a *Mpflt) Neg()
- func (a *Mpflt) Quo(b *Mpflt)
- func (a *Mpflt) Set(b *Mpflt)
- func (a *Mpflt) SetFloat64(c float64)
- func (a *Mpflt) SetInt(b *Mpint)
- func (a *Mpflt) SetString(as string)
- func (f *Mpflt) String() string
- func (a *Mpflt) Sub(b *Mpflt)
- type Mpint
- func (a *Mpint) Add(b *Mpint)
- func (a *Mpint) And(b *Mpint)
- func (a *Mpint) AndNot(b *Mpint)
- func (a *Mpint) Cmp(b *Mpint) int
- func (a *Mpint) CmpInt64(c int64) int
- func (a *Mpint) GoString() string
- func (a *Mpint) Int64() int64
- func (a *Mpint) Lsh(b *Mpint)
- func (a *Mpint) Mul(b *Mpint)
- func (a *Mpint) Neg()
- func (a *Mpint) Or(b *Mpint)
- func (a *Mpint) Quo(b *Mpint)
- func (a *Mpint) Rem(b *Mpint)
- func (a *Mpint) Rsh(b *Mpint)
- func (a *Mpint) Set(b *Mpint)
- func (a *Mpint) SetFloat(b *Mpflt) bool
- func (a *Mpint) SetInt64(c int64)
- func (a *Mpint) SetOverflow()
- func (a *Mpint) SetString(as string)
- func (a *Mpint) String() string
- func (a *Mpint) Sub(b *Mpint)
- func (a *Mpint) Xor(b *Mpint)
- type Name
- func (n *Name) Addrtaken() bool
- func (n *Name) Assigned() bool
- func (n *Name) AutoTemp() bool
- func (n *Name) Byval() bool
- func (n *Name) Captured() bool
- func (n *Name) InlFormal() bool
- func (n *Name) InlLocal() bool
- func (n *Name) IsClosureVar() bool
- func (n *Name) IsOutputParamHeapAddr() bool
- func (n *Name) LibfuzzerExtraCounter() bool
- func (n *Name) Needzero() bool
- func (n *Name) OpenDeferSlot() bool
- func (n *Name) Readonly() bool
- func (n *Name) SetAddrtaken(b bool)
- func (n *Name) SetAssigned(b bool)
- func (n *Name) SetAutoTemp(b bool)
- func (n *Name) SetByval(b bool)
- func (n *Name) SetCaptured(b bool)
- func (n *Name) SetInlFormal(b bool)
- func (n *Name) SetInlLocal(b bool)
- func (n *Name) SetIsClosureVar(b bool)
- func (n *Name) SetIsOutputParamHeapAddr(b bool)
- func (n *Name) SetLibfuzzerExtraCounter(b bool)
- func (n *Name) SetNeedzero(b bool)
- func (n *Name) SetOpenDeferSlot(b bool)
- func (n *Name) SetReadonly(b bool)
- func (n *Name) SetUsed(b bool)
- func (n *Name) Used() bool
- type NilVal
- type Node
- func AutoVar(v *ssa.Value) (*Node, int64)
- func (n *Node) BoolVal() bool
- func (n *Node) Bounded() bool
- func (n *Node) CanBeAnSSASym()
- func (n *Node) CanInt64() bool
- func (n *Node) Class() Class
- func (n *Node) Colas() bool
- func (n *Node) Diag() bool
- func (n *Node) Embedded() bool
- func (n *Node) Format(s fmt.State, verb rune)
- func (n *Node) HasBreak() bool
- func (n *Node) HasCall() bool
- func (n *Node) HasOpt() bool
- func (n *Node) HasVal() bool
- func (n *Node) Implicit() bool
- func (n *Node) IndexMapLValue() bool
- func (n *Node) Initorder() uint8
- func (n *Node) Int64Val() int64
- func (n *Node) Iota() int64
- func (n *Node) IsAutoTmp() bool
- func (n *Node) IsDDD() bool
- func (n *Node) IsMethod() bool
- func (n *Node) IsSynthetic() bool
- func (n *Node) Likely() bool
- func (n *Node) Line() string
- func (n *Node) MarkNonNil()
- func (n *Node) MarkReadonly()
- func (n *Node) NoInline() bool
- func (n *Node) NonNil() bool
- func (n *Node) Opt() interface{}
- func (n *Node) ResetAux()
- func (n *Node) SetBounded(b bool)
- func (n *Node) SetClass(b Class)
- func (n *Node) SetColas(b bool)
- func (n *Node) SetDiag(b bool)
- func (n *Node) SetEmbedded(b bool)
- func (n *Node) SetHasBreak(b bool)
- func (n *Node) SetHasCall(b bool)
- func (n *Node) SetHasOpt(b bool)
- func (n *Node) SetHasVal(b bool)
- func (n *Node) SetImplicit(b bool)
- func (n *Node) SetIndexMapLValue(b bool)
- func (n *Node) SetInitorder(b uint8)
- func (n *Node) SetIota(x int64)
- func (n *Node) SetIsDDD(b bool)
- func (n *Node) SetLikely(b bool)
- func (n *Node) SetNoInline(b bool)
- func (n *Node) SetOpt(x interface{})
- func (n *Node) SetSliceBounds(low, high, max *Node)
- func (n *Node) SetSubOp(op Op)
- func (n *Node) SetTChanDir(dir types.ChanDir)
- func (n *Node) SetTransient(b bool)
- func (n *Node) SetTypecheck(b uint8)
- func (n *Node) SetVal(v Val)
- func (n *Node) SetWalkdef(b uint8)
- func (n *Node) SliceBounds() (low, high, max *Node)
- func (n *Node) StorageClass() ssa.StorageClass
- func (n *Node) String() string
- func (n *Node) StringVal() string
- func (n *Node) SubOp() Op
- func (n *Node) TChanDir() types.ChanDir
- func (n *Node) Transient() bool
- func (n *Node) Typ() *types.Type
- func (n *Node) Typecheck() uint8
- func (n *Node) Val() Val
- func (n *Node) Walkdef() uint8
- type NodeSet
- func (s *NodeSet) Add(n *Node)
- func (s NodeSet) Has(n *Node) bool
- func (s NodeSet) Sorted(less func(*Node, *Node) bool) []*Node
- type Nodes
- func (n Nodes) Addr(i int) **Node
- func (n *Nodes) Append(a ...*Node)
- func (n *Nodes) AppendNodes(n2 *Nodes)
- func (n Nodes) First() *Node
- func (n Nodes) Format(s fmt.State, verb rune)
- func (n Nodes) Index(i int) *Node
- func (n Nodes) Len() int
- func (n *Nodes) MoveNodes(n2 *Nodes)
- func (n *Nodes) Prepend(a ...*Node)
- func (n Nodes) Second() *Node
- func (n *Nodes) Set(s []*Node)
- func (n *Nodes) Set1(n1 *Node)
- func (n *Nodes) Set2(n1, n2 *Node)
- func (n *Nodes) Set3(n1, n2, n3 *Node)
- func (n Nodes) SetFirst(node *Node)
- func (n Nodes) SetIndex(i int, node *Node)
- func (n Nodes) SetSecond(node *Node)
- func (n Nodes) Slice() []*Node
- func (n Nodes) String() string
- type Op
- func (o Op) Format(s fmt.State, verb rune)
- func (o Op) GoString() string
- func (o Op) IsSlice3() bool
- func (i Op) String() string
- type Order
- type Param
- func (p *Param) Alias() bool
- func (p *Param) EmbedList() []irEmbed
- func (p *Param) Pragma() PragmaFlag
- func (p *Param) SetAlias(alias bool)
- func (p *Param) SetEmbedList(list []irEmbed)
- func (p *Param) SetPragma(flag PragmaFlag)
- type Pragma
- type PragmaEmbed
- type PragmaFlag
- type PragmaPos
- type Progs
- func (pp *Progs) Appendpp(p *obj.Prog, as obj.As, ftype obj.AddrType, freg int16, foffset int64, ttype obj.AddrType, treg int16, toffset int64) *obj.Prog
- func (pp *Progs) Flush()
- func (pp *Progs) Free()
- func (pp *Progs) NewProg() *obj.Prog
- func (pp *Progs) Prog(as obj.As) *obj.Prog
- type SSAGenState
- func (s *SSAGenState) AddrScratch(a *obj.Addr)
- func (s *SSAGenState) Br(op obj.As, target *ssa.Block) *obj.Prog
- func (s *SSAGenState) Call(v *ssa.Value) *obj.Prog
- func (s *SSAGenState) CombJump(b, next *ssa.Block, jumps *[2][2]IndexJump)
- func (s *SSAGenState) DebugFriendlySetPosFrom(v *ssa.Value)
- func (s *SSAGenState) Pc() *obj.Prog
- func (s *SSAGenState) PrepareCall(v *ssa.Value)
- func (s *SSAGenState) Prog(as obj.As) *obj.Prog
- func (s *SSAGenState) SetPos(pos src.XPos)
- func (s *SSAGenState) UseArgs(n int64)
- type ScopeID
- type Sig
- type Symlink
- type Timings
- func (t *Timings) AddEvent(size int64, unit string)
- func (t *Timings) Start(labels ...string)
- func (t *Timings) Stop(labels ...string)
- func (t *Timings) Write(w io.Writer, prefix string)
- type Val
Constants ¶
const ( H0 = 2166136261 Hp = 16777619 )
FNV-1 hash function constants.
const ( EscFuncUnknown = 0 + iota EscFuncPlanned EscFuncStarted EscFuncTagged )
const ( EscUnknown = iota EscNone // Does not escape to heap, result, or parameters. EscHeap // Reachable from the heap EscNever // By construction will not escape. )
const ( FErr fmtMode = iota FDbg FTypeId FTypeIdName // same as FTypeId, but use package name instead of prefix )
*types.Sym, *types.Type, and *Node types use the flags below to set the format mode
const ( InitNotStarted = iota InitDone InitPending )
Static initialization phase. These values are stored in two bits in Node.flags.
const ( FuncPragmas = Nointerface | Noescape | Norace | Nosplit | Noinline | NoCheckPtr | CgoUnsafeArgs | UintptrEscapes | Systemstack | Nowritebarrier | Nowritebarrierrec | Yeswritebarrierrec TypePragmas = NotInHeap )
const ( // Maximum size in bits for Mpints before signalling // overflow and also mantissa precision for Mpflts. Mpprec = 512 // Turn on for constant arithmetic debugging output. Mpdebug = false )
const ( BUCKETSIZE = 8 MAXKEYSIZE = 128 MAXELEMSIZE = 128 )
Builds a type representing a Bucket structure for the given map type. This type is not visible to users - we include only enough information to generate a correct GC program for it. Make sure this stays in sync with runtime/map.go.
const ( Txxx = types.Txxx TINT8 = types.TINT8 TUINT8 = types.TUINT8 TINT16 = types.TINT16 TUINT16 = types.TUINT16 TINT32 = types.TINT32 TUINT32 = types.TUINT32 TINT64 = types.TINT64 TUINT64 = types.TUINT64 TINT = types.TINT TUINT = types.TUINT TUINTPTR = types.TUINTPTR TCOMPLEX64 = types.TCOMPLEX64 TCOMPLEX128 = types.TCOMPLEX128 TFLOAT32 = types.TFLOAT32 TFLOAT64 = types.TFLOAT64 TBOOL = types.TBOOL TPTR = types.TPTR TFUNC = types.TFUNC TSLICE = types.TSLICE TARRAY = types.TARRAY TSTRUCT = types.TSTRUCT TCHAN = types.TCHAN TMAP = types.TMAP TINTER = types.TINTER TFORW = types.TFORW TANY = types.TANY TSTRING = types.TSTRING TUNSAFEPTR = types.TUNSAFEPTR // pseudo-types for literals TIDEAL = types.TIDEAL TNIL = types.TNIL TBLANK = types.TBLANK // pseudo-types for frame layout TFUNCARGS = types.TFUNCARGS TCHANARGS = types.TCHANARGS NTYPE = types.NTYPE )
convenience constants
const ArhdrSize = 60
architecture-independent object file output
const StackMapDontCare = -1000
StackMapDontCare indicates that the stack map index at a Value doesn't matter.
This is a sentinel value that should never be emitted to the PCDATA stream. We use -1000 because that's obviously never a valid stack index (but -1 is).
Variables ¶
var ( Deferreturn, Duffcopy, Duffzero, Udiv *obj.LSym BoundsCheckFunc [ssa.BoundsKindCount]*obj.LSym ExtendCheckFunc [ssa.BoundsKindCount]*obj.LSym // Wasm WasmMove, WasmZero, WasmDiv, WasmTruncS, WasmTruncU, SigPanic *obj.LSym )
var ( Debug_append int Debug_checkptr int Debug_closure int Debug_compilelater int Debug_dumpptrs int Debug_libfuzzer int Debug_panic int Debug_slice int Debug_vlog bool Debug_wb int Debug_pctab string Debug_locationlist int Debug_typecheckinl int Debug_gendwarfinl int Debug_softfloat int Debug_defer int )
var Debug_checknil int
var ( Debug_export int // if set, print debugging information about export data )
var Debug_gcprog int // set by -d gcprog
var Debug_typeassert int
GCWriteBarrierReg maps from registers to gcWriteBarrier implementation LSyms.
var LivenessDontCare = LivenessIndex{StackMapDontCare, true}
LivenessDontCare indicates that the liveness information doesn't matter. Currently it is used in deferreturn liveness when we don't actually need it. It should never be emitted to the PCDATA stream.
var Widthptr int
var Widthreg int
Functions ¶
func AddAux ¶
AddAux adds the offset in the aux fields (AuxInt and Aux) of v to a.
func AddAux2 ¶
func AddrAuto ¶
func Addrconst ¶
func CheckLoweredGetClosurePtr ¶
CheckLoweredGetClosurePtr checks that v is the first instruction in the function's entry block. The output of LoweredGetClosurePtr is generally hardwired to the correct register. That register contains the closure pointer on closure entry.
func CheckLoweredPhi ¶
CheckLoweredPhi checks that regalloc and stackalloc correctly handled phi values. Called during ssaGenValue.
func Dump ¶
func EqCanPanic ¶
EqCanPanic reports whether == on type t could panic (has an interface somewhere). t must be comparable.
func Exit ¶
func Exit(code int)
func Fatalf ¶
func Fatalf(fmt_ string, args ...interface{})
func IncomparableField ¶
IncomparableField returns an incomparable Field of struct Type t, if any.
func IsAlias ¶
func IsComparable ¶
IsComparable reports whether t is a comparable type.
func IsRegularMemory ¶
IsRegularMemory reports whether t can be compared/hashed as regular memory.
func Isconst ¶
func Main ¶
func Main(archInit func(*Arch))
Main parses flags and Go source files specified in the command-line arguments, type-checks the parsed Go package, compiles functions to machine code, and finally writes the compiled package definition to disk.
func Patch ¶
func Rnd ¶
func Warn ¶
func Warn(fmt_ string, args ...interface{})
func Warnl ¶
Types ¶
type AlgKind ¶
type AlgKind int
AlgKind describes the kind of algorithms used for comparing and hashing a Type.
const ( // These values are known by runtime. ANOEQ AlgKind = iota AMEM0 AMEM8 AMEM16 AMEM32 AMEM64 AMEM128 ASTRING AINTER ANILINTER AFLOAT32 AFLOAT64 ACPLX64 ACPLX128 // Type can be compared/hashed as regular memory. AMEM AlgKind = 100 // Type needs special comparison/hashing functions. ASPECIAL AlgKind = -1 )
func (AlgKind) String ¶
type Arch ¶
type Arch struct { LinkArch *obj.LinkArch REGSP int MAXWIDTH int64 SoftFloat bool PadFrame func(int64) int64 // ZeroRange zeroes a range of memory on stack. It is only inserted // at function entry, and it is ok to clobber registers. ZeroRange func(*Progs, *obj.Prog, int64, int64, *uint32) *obj.Prog Ginsnop func(*Progs) *obj.Prog Ginsnopdefer func(*Progs) *obj.Prog // special ginsnop for deferreturn // SSAMarkMoves marks any MOVXconst ops that need to avoid clobbering flags. SSAMarkMoves func(*SSAGenState, *ssa.Block) // SSAGenValue emits Prog(s) for the Value. SSAGenValue func(*SSAGenState, *ssa.Value) // SSAGenBlock emits end-of-block Progs. SSAGenValue should be called // for all values in the block before SSAGenBlock. SSAGenBlock func(s *SSAGenState, b, next *ssa.Block) }
type BlockEffects ¶
type BlockEffects struct {
// contains filtered or unexported fields
}
BlockEffects summarizes the liveness effects on an SSA block.
type Branch ¶
Branch is an unresolved branch.
type Class ¶
type Class uint8
The Class of a variable/function describes the "storage class" of a variable or function. During parsing, storage classes are called declaration contexts.
const ( Pxxx Class = iota // no class; used during ssa conversion to indicate pseudo-variables PEXTERN // global variables PAUTO // local variables PAUTOHEAP // local variables or parameters moved to heap PPARAM // input arguments PPARAMOUT // output results PFUNC // global functions )
func (Class) String ¶
type Ctype ¶
type Ctype uint8
Ctype describes the constant kind of an "ideal" (untyped) constant.
type DebugFlags ¶
type DebugFlags struct { P, B, C, E, K, L, N, S, W int // contains filtered or unexported fields }
gc debug flags
var Debug DebugFlags
type Dlist ¶
type Dlist struct {
// contains filtered or unexported fields
}
A Dlist stores a pointer to a TFIELD Type embedded within a TSTRUCT or TINTER Type.
type Error ¶
type Error struct {
// contains filtered or unexported fields
}
type EscEdge ¶
type EscEdge struct {
// contains filtered or unexported fields
}
An EscEdge represents an assignment edge between two Go variables.
type EscHole ¶
type EscHole struct {
// contains filtered or unexported fields
}
An EscHole represents a context for evaluation a Go expression. E.g., when evaluating p in "x = **p", we'd have a hole with dst==x and derefs==2.
type EscLeaks ¶
type EscLeaks [1 + numEscResults]uint8
An EscLeaks represents a set of assignment flows from a parameter to the heap or to any of its function's (first numEscResults) result parameters.
func ParseLeaks ¶
ParseLeaks parses a binary string representing an EscLeaks.
func (*EscLeaks) AddHeap ¶
AddHeap adds an assignment flow from l to the heap.
func (*EscLeaks) AddResult ¶
AddResult adds an assignment flow from l to its function's i'th result parameter.
func (EscLeaks) Empty ¶
Empty reports whether l is an empty set (i.e., no assignment flows).
func (EscLeaks) Encode ¶
Encode converts l into a binary string for export data.
func (EscLeaks) Heap ¶
Heap returns the minimum deref count of any assignment flow from l to the heap. If no such flows exist, Heap returns -1.
func (*EscLeaks) Optimize ¶
func (l *EscLeaks) Optimize()
Optimize removes result flow paths that are equal in length or longer than the shortest heap flow path.
func (EscLeaks) Result ¶
Result returns the minimum deref count of any assignment flow from l to its function's i'th result parameter. If no such flows exist, Result returns -1.
type EscLocation ¶
type EscLocation struct {
// contains filtered or unexported fields
}
An EscLocation represents an abstract location that stores a Go variable.
type EscNote ¶
type EscNote struct {
// contains filtered or unexported fields
}
type Escape ¶
type Escape struct {
// contains filtered or unexported fields
}
type FmtFlag ¶
type FmtFlag int
A FmtFlag value is a set of flags (or 0). They control how the Xconv functions format their values. See the respective function's documentation for details.
const ( FmtLeft FmtFlag = 1 << iota // '-' FmtSharp // '#' FmtSign // '+' FmtUnsigned // internal use only (historic: u flag) FmtShort // verb == 'S' (historic: h flag) FmtLong // verb == 'L' (historic: l flag) FmtComma // '.' (== hasPrec) (historic: , flag) FmtByte // '0' (historic: hh flag) )
type Func ¶
type Func struct { Shortname *types.Sym // Extra entry code for the function. For example, allocate and initialize // memory for escaping parameters. However, just for OCLOSURE, Enter is a // list of ONAME nodes of captured variables Enter Nodes Exit Nodes // ONAME nodes for closure params, each should have closurevar set Cvars Nodes // ONAME nodes for all params/locals for this func/closure, does NOT // include closurevars until transformclosure runs. Dcl []*Node // Parents records the parent scope of each scope within a // function. The root scope (0) has no parent, so the i'th // scope's parent is stored at Parents[i-1]. Parents []ScopeID // Marks records scope boundary changes. Marks []Mark // Closgen tracks how many closures have been generated within // this function. Used by closurename for creating unique // function names. Closgen int FieldTrack map[*types.Sym]struct{} DebugInfo *ssa.FuncDebug Ntype *Node // signature Top int // top context (ctxCallee, etc) Closure *Node // OCLOSURE <-> ODCLFUNC (see header comment above) Nname *Node // The ONAME node associated with an ODCLFUNC (both have same Type) Inl *Inline Label int32 // largest auto-generated label in this function Endlineno src.XPos WBPos src.XPos // position of first write barrier; see SetWBPos Pragma PragmaFlag // go:xxx function annotations // contains filtered or unexported fields }
Func holds Node fields used only with function-like nodes.
func (*Func) Dupok ¶
func (*Func) ExportInline ¶
func (*Func) HasDefer ¶
func (*Func) InlinabilityChecked ¶
func (*Func) InstrumentBody ¶
func (*Func) IsHiddenClosure ¶
func (*Func) Needctxt ¶
func (*Func) NilCheckDisabled ¶
func (*Func) OpenCodedDeferDisallowed ¶
func (*Func) ReflectMethod ¶
func (*Func) SetDupok ¶
func (*Func) SetExportInline ¶
func (*Func) SetHasDefer ¶
func (*Func) SetInlinabilityChecked ¶
func (*Func) SetInstrumentBody ¶
func (*Func) SetIsHiddenClosure ¶
func (*Func) SetNeedctxt ¶
func (*Func) SetNilCheckDisabled ¶
func (*Func) SetOpenCodedDeferDisallowed ¶
func (*Func) SetReflectMethod ¶
func (*Func) SetWrapper ¶
func (*Func) Wrapper ¶
type GCProg ¶
type GCProg struct {
// contains filtered or unexported fields
}
type IndexJump ¶
For generating consecutive jump instructions to model a specific branching
type InitEntry ¶
type InitEntry struct { Xoffset int64 // struct, array only Expr *Node // bytes of run-time computed expressions }
type InitOrder ¶
type InitOrder struct {
// contains filtered or unexported fields
}
type InitPlan ¶
type InitPlan struct { E []InitEntry }
type InitSchedule ¶
type InitSchedule struct {
// contains filtered or unexported fields
}
An InitSchedule is used to decompose assignment statements into static and dynamic initialization parts. Static initializations are handled by populating variables' linker symbol data, while dynamic initializations are accumulated to be executed in order.
type Inline ¶
type Inline struct { Cost int32 // heuristic cost of inlining this function // Copies of Func.Dcl and Nbody for use during inlining. Dcl []*Node Body []*Node }
An Inline holds fields used for function bodies that can be inlined.
type Liveness ¶
type Liveness struct {
// contains filtered or unexported fields
}
A collection of global state used by liveness analysis.
type LivenessIndex ¶
type LivenessIndex struct {
// contains filtered or unexported fields
}
LivenessIndex stores the liveness map information for a Value.
func (LivenessIndex) StackMapValid ¶
func (idx LivenessIndex) StackMapValid() bool
type LivenessMap ¶
type LivenessMap struct {
// contains filtered or unexported fields
}
LivenessMap maps from *ssa.Value to LivenessIndex.
func (LivenessMap) Get ¶
func (m LivenessMap) Get(v *ssa.Value) LivenessIndex
type Mark ¶
type Mark struct { // Pos is the position of the token that marks the scope // change. Pos src.XPos // Scope identifies the innermost scope to the right of Pos. Scope ScopeID }
A Mark represents a scope boundary.
type Mpcplx ¶
Mpcplx represents a complex constant.
func (*Mpcplx) Div ¶
complex divide v /= rv
(a, b) / (c, d) = ((a*c + b*d), (b*c - a*d))/(c*c + d*d)
func (*Mpcplx) GoString ¶
func (*Mpcplx) Mul ¶
complex multiply v *= rv
(a, b) * (c, d) = (a*c - b*d, b*c + a*d)
func (*Mpcplx) String ¶
type Mpflt ¶
Mpflt represents a floating-point constant.
func (*Mpflt) Add ¶
func (*Mpflt) AddFloat64 ¶
func (*Mpflt) Cmp ¶
func (*Mpflt) CmpFloat64 ¶
func (*Mpflt) Float32 ¶
func (*Mpflt) Float64 ¶
func (*Mpflt) GoString ¶
func (*Mpflt) Mul ¶
func (*Mpflt) MulFloat64 ¶
func (*Mpflt) Neg ¶
func (a *Mpflt) Neg()
func (*Mpflt) Quo ¶
func (*Mpflt) Set ¶
func (*Mpflt) SetFloat64 ¶
func (*Mpflt) SetInt ¶
func (*Mpflt) SetString ¶
func (*Mpflt) String ¶
func (*Mpflt) Sub ¶
type Mpint ¶
type Mpint struct { Val big.Int Ovf bool // set if Val overflowed compiler limit (sticky) Rune bool // set if syntax indicates default type rune }
Mpint represents an integer constant.
func (*Mpint) Add ¶
func (*Mpint) And ¶
func (*Mpint) AndNot ¶
func (*Mpint) Cmp ¶
func (*Mpint) CmpInt64 ¶
func (*Mpint) GoString ¶
func (*Mpint) Int64 ¶
func (*Mpint) Lsh ¶
func (*Mpint) Mul ¶
func (*Mpint) Neg ¶
func (a *Mpint) Neg()
func (*Mpint) Or ¶
func (*Mpint) Quo ¶
func (*Mpint) Rem ¶
func (*Mpint) Rsh ¶
func (*Mpint) Set ¶
func (*Mpint) SetFloat ¶
func (*Mpint) SetInt64 ¶
func (*Mpint) SetOverflow ¶
func (a *Mpint) SetOverflow()
func (*Mpint) SetString ¶
func (*Mpint) String ¶
func (*Mpint) Sub ¶
func (*Mpint) Xor ¶
type Name ¶
type Name struct { Pack *Node // real package for import . names Pkg *types.Pkg // pkg for OPACK nodes // For a local variable (not param) or extern, the initializing assignment (OAS or OAS2). // For a closure var, the ONAME node of the outer captured variable Defn *Node // The ODCLFUNC node (for a static function/method or a closure) in which // local variable or param is declared. Curfn *Node Param *Param // additional fields for ONAME, OTYPE Decldepth int32 // declaration loop depth, increased for every loop or label // Unique number for ONAME nodes within a function. Function outputs // (results) are numbered starting at one, followed by function inputs // (parameters), and then local variables. Vargen is used to distinguish // local variables/params with the same name. Vargen int32 // contains filtered or unexported fields }
Name holds Node fields used only by named nodes (ONAME, OTYPE, OPACK, OLABEL, some OLITERAL).
func (*Name) Addrtaken ¶
func (*Name) Assigned ¶
func (*Name) AutoTemp ¶
func (*Name) Byval ¶
func (*Name) Captured ¶
func (*Name) InlFormal ¶
func (*Name) InlLocal ¶
func (*Name) IsClosureVar ¶
func (*Name) IsOutputParamHeapAddr ¶
func (*Name) LibfuzzerExtraCounter ¶
func (*Name) Needzero ¶
func (*Name) OpenDeferSlot ¶
func (*Name) Readonly ¶
func (*Name) SetAddrtaken ¶
func (*Name) SetAssigned ¶
func (*Name) SetAutoTemp ¶
func (*Name) SetByval ¶
func (*Name) SetCaptured ¶
func (*Name) SetInlFormal ¶
func (*Name) SetInlLocal ¶
func (*Name) SetIsClosureVar ¶
func (*Name) SetIsOutputParamHeapAddr ¶
func (*Name) SetLibfuzzerExtraCounter ¶
func (*Name) SetNeedzero ¶
func (*Name) SetOpenDeferSlot ¶
func (*Name) SetReadonly ¶
func (*Name) SetUsed ¶
func (*Name) Used ¶
type NilVal ¶
type NilVal struct{}
type Node ¶
type Node struct { // Tree structure. // Generic recursive walks should follow these fields. Left *Node Right *Node Ninit Nodes Nbody Nodes List Nodes Rlist Nodes // most nodes Type *types.Type Orig *Node // original form, for printing, and tracking copies of ONAMEs // func Func *Func // ONAME, OTYPE, OPACK, OLABEL, some OLITERAL Name *Name Sym *types.Sym // various E interface{} // Opt or Val, see methods below // Various. Usually an offset into a struct. For example: // - ONAME nodes that refer to local variables use it to identify their stack frame position. // - ODOT, ODOTPTR, and ORESULT use it to indicate offset relative to their base address. // - OSTRUCTKEY uses it to store the named field's offset. // - Named OLITERALs use it to store their ambient iota value. // - OINLMARK stores an index into the inlTree data structure. // - OCLOSURE uses it to store ambient iota value, if any. // Possibly still more uses. If you find any, document them. Xoffset int64 Pos src.XPos Esc uint16 // EscXXX Op Op // contains filtered or unexported fields }
A Node is a single node in the syntax tree. Actually the syntax tree is a syntax DAG, because there is only one node with Op=ONAME for a given instance of a variable x. The same is true for Op=OTYPE and Op=OLITERAL. See Node.mayBeShared.
var Curfn *Node
func AutoVar ¶
AutoVar returns a *Node and int64 representing the auto variable and offset within it where v should be spilled.
func (*Node) BoolVal ¶
BoolVal returns n as a bool. n must be a boolean constant.
func (*Node) Bounded ¶
func (*Node) CanBeAnSSASym ¶
func (n *Node) CanBeAnSSASym()
The compiler needs *Node to be assignable to cmd/compile/internal/ssa.Sym.
func (*Node) CanInt64 ¶
CanInt64 reports whether it is safe to call Int64Val() on n.
func (*Node) Class ¶
func (*Node) Colas ¶
func (*Node) Diag ¶
func (*Node) Embedded ¶
func (*Node) Format ¶
func (*Node) HasBreak ¶
func (*Node) HasCall ¶
func (*Node) HasOpt ¶
func (*Node) HasVal ¶
func (*Node) Implicit ¶
func (*Node) IndexMapLValue ¶
func (*Node) Initorder ¶
func (*Node) Int64Val ¶
Int64Val returns n as an int64. n must be an integer or rune constant.
func (*Node) Iota ¶
func (*Node) IsAutoTmp ¶
IsAutoTmp indicates if n was created by the compiler as a temporary, based on the setting of the .AutoTemp flag in n's Name.
func (*Node) IsDDD ¶
func (*Node) IsMethod ¶
IsMethod reports whether n is a method. n must be a function or a method.
func (*Node) IsSynthetic ¶
func (*Node) Likely ¶
func (*Node) Line ¶
Line returns n's position as a string. If n has been inlined, it uses the outermost position where n has been inlined.
func (*Node) MarkNonNil ¶
func (n *Node) MarkNonNil()
MarkNonNil marks a pointer n as being guaranteed non-nil, on all code paths, at all times. During conversion to SSA, non-nil pointers won't have nil checks inserted before dereferencing. See state.exprPtr.
func (*Node) MarkReadonly ¶
func (n *Node) MarkReadonly()
MarkReadonly indicates that n is an ONAME with readonly contents.
func (*Node) NoInline ¶
func (*Node) NonNil ¶
func (*Node) Opt ¶
func (n *Node) Opt() interface{}
Opt returns the optimizer data for the node.
func (*Node) ResetAux ¶
func (n *Node) ResetAux()
func (*Node) SetBounded ¶
SetBounded indicates whether operation n does not need safety checks. When n is an index or slice operation, n does not need bounds checks. When n is a dereferencing operation, n does not need nil checks. When n is a makeslice+copy operation, n does not need length and cap checks.
func (*Node) SetClass ¶
func (*Node) SetColas ¶
func (*Node) SetDiag ¶
func (*Node) SetEmbedded ¶
func (*Node) SetHasBreak ¶
func (*Node) SetHasCall ¶
func (*Node) SetHasOpt ¶
func (*Node) SetHasVal ¶
func (*Node) SetImplicit ¶
func (*Node) SetIndexMapLValue ¶
func (*Node) SetInitorder ¶
func (*Node) SetIota ¶
func (*Node) SetIsDDD ¶
func (*Node) SetLikely ¶
func (*Node) SetNoInline ¶
func (*Node) SetOpt ¶
func (n *Node) SetOpt(x interface{})
SetOpt sets the optimizer data for the node, which must not have been used with SetVal. SetOpt(nil) is ignored for Vals to simplify call sites that are clearing Opts.
func (*Node) SetSliceBounds ¶
SetSliceBounds sets n's slice bounds, where n is a slice expression. n must be a slice expression. If max is non-nil, n must be a full slice expression.
func (*Node) SetSubOp ¶
func (*Node) SetTChanDir ¶
func (*Node) SetTransient ¶
func (*Node) SetTypecheck ¶
func (*Node) SetVal ¶
SetVal sets the Val for the node, which must not have been used with SetOpt.
func (*Node) SetWalkdef ¶
func (*Node) SliceBounds ¶
SliceBounds returns n's slice bounds: low, high, and max in expr[low:high:max]. n must be a slice expression. max is nil if n is a simple slice expression.
func (*Node) StorageClass ¶
func (n *Node) StorageClass() ssa.StorageClass
func (*Node) String ¶
func (*Node) StringVal ¶
StringVal returns the value of a literal string Node as a string. n must be a string constant.
func (*Node) SubOp ¶
func (*Node) TChanDir ¶
func (*Node) Transient ¶
func (*Node) Typ ¶
func (*Node) Typecheck ¶
func (*Node) Val ¶
Val returns the Val for the node.
func (*Node) Walkdef ¶
type NodeSet ¶
type NodeSet map[*Node]struct{}
NodeSet is a set of Nodes.
func (*NodeSet) Add ¶
Add adds n to s.
func (NodeSet) Has ¶
Has reports whether s contains n.
func (NodeSet) Sorted ¶
Sorted returns s sorted according to less.
type Nodes ¶
type Nodes struct {
// contains filtered or unexported fields
}
Nodes is a pointer to a slice of *Node. For fields that are not used in most nodes, this is used instead of a slice to save space.
func (Nodes) Addr ¶
Addr returns the address of the i'th element of Nodes. It panics if n does not have at least i+1 elements.
func (*Nodes) Append ¶
Append appends entries to Nodes.
func (*Nodes) AppendNodes ¶
AppendNodes appends the contents of *n2 to n, then clears n2.
func (Nodes) First ¶
First returns the first element of Nodes (same as n.Index(0)). It panics if n has no elements.
func (Nodes) Format ¶
func (Nodes) Index ¶
Index returns the i'th element of Nodes. It panics if n does not have at least i+1 elements.
func (Nodes) Len ¶
Len returns the number of entries in Nodes.
func (*Nodes) MoveNodes ¶
MoveNodes sets n to the contents of n2, then clears n2.
func (*Nodes) Prepend ¶
Prepend prepends entries to Nodes. If a slice is passed in, this will take ownership of it.
func (Nodes) Second ¶
Second returns the second element of Nodes (same as n.Index(1)). It panics if n has fewer than two elements.
func (*Nodes) Set ¶
Set sets n to a slice. This takes ownership of the slice.
func (*Nodes) Set1 ¶
Set1 sets n to a slice containing a single node.
func (*Nodes) Set2 ¶
Set2 sets n to a slice containing two nodes.
func (*Nodes) Set3 ¶
Set3 sets n to a slice containing three nodes.
func (Nodes) SetFirst ¶
SetFirst sets the first element of Nodes to node. It panics if n does not have at least one elements.
func (Nodes) SetIndex ¶
SetIndex sets the i'th element of Nodes to node. It panics if n does not have at least i+1 elements.
func (Nodes) SetSecond ¶
SetSecond sets the second element of Nodes to node. It panics if n does not have at least two elements.
func (Nodes) Slice ¶
Slice returns the entries in Nodes as a slice. Changes to the slice entries (as in s[i] = n) will be reflected in the Nodes.
func (Nodes) String ¶
type Op ¶
type Op uint8
const ( OXXX Op = iota // names ONAME // var or func name // Unnamed arg or return value: f(int, string) (int, error) { etc } // Also used for a qualified package identifier that hasn't been resolved yet. ONONAME OTYPE // type name OPACK // import OLITERAL // literal // expressions OADD // Left + Right OSUB // Left - Right OOR // Left | Right OXOR // Left ^ Right OADDSTR // +{List} (string addition, list elements are strings) OADDR // &Left OANDAND // Left && Right OAPPEND // append(List); after walk, Left may contain elem type descriptor OBYTES2STR // Type(Left) (Type is string, Left is a []byte) OBYTES2STRTMP // Type(Left) (Type is string, Left is a []byte, ephemeral) ORUNES2STR // Type(Left) (Type is string, Left is a []rune) OSTR2BYTES // Type(Left) (Type is []byte, Left is a string) OSTR2BYTESTMP // Type(Left) (Type is []byte, Left is a string, ephemeral) OSTR2RUNES // Type(Left) (Type is []rune, Left is a string) // Left = Right or (if Colas=true) Left := Right // If Colas, then Ninit includes a DCL node for Left. OAS // List = Rlist (x, y, z = a, b, c) or (if Colas=true) List := Rlist // If Colas, then Ninit includes DCL nodes for List OAS2 OAS2DOTTYPE // List = Right (x, ok = I.(int)) OAS2FUNC // List = Right (x, y = f()) OAS2MAPR // List = Right (x, ok = m["foo"]) OAS2RECV // List = Right (x, ok = <-c) OASOP // Left Etype= Right (x += y) OCALL // Left(List) (function call, method call or type conversion) // OCALLFUNC, OCALLMETH, and OCALLINTER have the same structure. // Prior to walk, they are: Left(List), where List is all regular arguments. // After walk, List is a series of assignments to temporaries, // and Rlist is an updated set of arguments. // Nbody is all OVARLIVE nodes that are attached to OCALLxxx. // TODO(josharian/khr): Use Ninit instead of List for the assignments to temporaries. See CL 114797. OCALLFUNC // Left(List/Rlist) (function call f(args)) OCALLMETH // Left(List/Rlist) (direct method call x.Method(args)) OCALLINTER // Left(List/Rlist) (interface method call x.Method(args)) OCALLPART // Left.Right (method expression x.Method, not called) OCAP // cap(Left) OCLOSE // close(Left) OCLOSURE // func Type { Func.Closure.Nbody } (func literal) OCOMPLIT // Right{List} (composite literal, not yet lowered to specific form) OMAPLIT // Type{List} (composite literal, Type is map) OSTRUCTLIT // Type{List} (composite literal, Type is struct) OARRAYLIT // Type{List} (composite literal, Type is array) OSLICELIT // Type{List} (composite literal, Type is slice) Right.Int64() = slice length. OPTRLIT // &Left (left is composite literal) OCONV // Type(Left) (type conversion) OCONVIFACE // Type(Left) (type conversion, to interface) OCONVNOP // Type(Left) (type conversion, no effect) OCOPY // copy(Left, Right) ODCL // var Left (declares Left of type Left.Type) // Used during parsing but don't last. ODCLFUNC // func f() or func (r) f() ODCLFIELD // struct field, interface field, or func/method argument/return value. ODCLCONST // const pi = 3.14 ODCLTYPE // type Int int or type Int = int ODELETE // delete(List) ODOT // Left.Sym (Left is of struct type) ODOTPTR // Left.Sym (Left is of pointer to struct type) ODOTMETH // Left.Sym (Left is non-interface, Right is method name) ODOTINTER // Left.Sym (Left is interface, Right is method name) OXDOT // Left.Sym (before rewrite to one of the preceding) ODOTTYPE // Left.Right or Left.Type (.Right during parsing, .Type once resolved); after walk, .Right contains address of interface type descriptor and .Right.Right contains address of concrete type descriptor ODOTTYPE2 // Left.Right or Left.Type (.Right during parsing, .Type once resolved; on rhs of OAS2DOTTYPE); after walk, .Right contains address of interface type descriptor OEQ // Left == Right ONE // Left != Right OLT // Left < Right OLE // Left <= Right OGE // Left >= Right OGT // Left > Right ODEREF // *Left OINDEX // Left[Right] (index of array or slice) OINDEXMAP // Left[Right] (index of map) OKEY // Left:Right (key:value in struct/array/map literal) OSTRUCTKEY // Sym:Left (key:value in struct literal, after type checking) OLEN // len(Left) OMAKE // make(List) (before type checking converts to one of the following) OMAKECHAN // make(Type, Left) (type is chan) OMAKEMAP // make(Type, Left) (type is map) OMAKESLICE // make(Type, Left, Right) (type is slice) OMAKESLICECOPY // makeslicecopy(Type, Left, Right) (type is slice; Left is length and Right is the copied from slice) // OMAKESLICECOPY is created by the order pass and corresponds to: // s = make(Type, Left); copy(s, Right) // // Bounded can be set on the node when Left == len(Right) is known at compile time. // // This node is created so the walk pass can optimize this pattern which would // otherwise be hard to detect after the order pass. OMUL // Left * Right ODIV // Left / Right OMOD // Left % Right OLSH // Left << Right ORSH // Left >> Right OAND // Left & Right OANDNOT // Left &^ Right ONEW // new(Left); corresponds to calls to new in source code ONEWOBJ // runtime.newobject(n.Type); introduced by walk; Left is type descriptor ONOT // !Left OBITNOT // ^Left OPLUS // +Left ONEG // -Left OOROR // Left || Right OPANIC // panic(Left) OPRINT // print(List) OPRINTN // println(List) OPAREN // (Left) OSEND // Left <- Right OSLICE // Left[List[0] : List[1]] (Left is untypechecked or slice) OSLICEARR // Left[List[0] : List[1]] (Left is array) OSLICESTR // Left[List[0] : List[1]] (Left is string) OSLICE3 // Left[List[0] : List[1] : List[2]] (Left is untypedchecked or slice) OSLICE3ARR // Left[List[0] : List[1] : List[2]] (Left is array) OSLICEHEADER // sliceheader{Left, List[0], List[1]} (Left is unsafe.Pointer, List[0] is length, List[1] is capacity) ORECOVER // recover() ORECV // <-Left ORUNESTR // Type(Left) (Type is string, Left is rune) OSELRECV // Left = <-Right.Left: (appears as .Left of OCASE; Right.Op == ORECV) OSELRECV2 // List = <-Right.Left: (appears as .Left of OCASE; count(List) == 2, Right.Op == ORECV) OIOTA // iota OREAL // real(Left) OIMAG // imag(Left) OCOMPLEX // complex(Left, Right) or complex(List[0]) where List[0] is a 2-result function call OALIGNOF // unsafe.Alignof(Left) OOFFSETOF // unsafe.Offsetof(Left) OSIZEOF // unsafe.Sizeof(Left) // statements OBLOCK // { List } (block of code) OBREAK // break [Sym] // OCASE: case List: Nbody (List==nil means default) // For OTYPESW, List is a OTYPE node for the specified type (or OLITERAL // for nil), and, if a type-switch variable is specified, Rlist is an // ONAME for the version of the type-switch variable with the specified // type. OCASE OCONTINUE // continue [Sym] ODEFER // defer Left (Left must be call) OEMPTY // no-op (empty statement) OFALL // fallthrough OFOR // for Ninit; Left; Right { Nbody } // OFORUNTIL is like OFOR, but the test (Left) is applied after the body: // Ninit // top: { Nbody } // Execute the body at least once // cont: Right // if Left { // And then test the loop condition // List // Before looping to top, execute List // goto top // } // OFORUNTIL is created by walk. There's no way to write this in Go code. OFORUNTIL OGOTO // goto Sym OIF // if Ninit; Left { Nbody } else { Rlist } OLABEL // Sym: OGO // go Left (Left must be call) ORANGE // for List = range Right { Nbody } ORETURN // return List OSELECT // select { List } (List is list of OCASE) OSWITCH // switch Ninit; Left { List } (List is a list of OCASE) // OTYPESW: Left := Right.(type) (appears as .Left of OSWITCH) // Left is nil if there is no type-switch variable OTYPESW // types OTCHAN // chan int OTMAP // map[string]int OTSTRUCT // struct{} OTINTER // interface{} // OTFUNC: func() - Left is receiver field, List is list of param fields, Rlist is // list of result fields. OTFUNC OTARRAY // []int, [8]int, [N]int or [...]int // misc ODDD // func f(args ...int) or f(l...) or var a = [...]int{0, 1, 2}. OINLCALL // intermediary representation of an inlined call. OEFACE // itable and data words of an empty-interface value. OITAB // itable word of an interface value. OIDATA // data word of an interface value in Left OSPTR // base pointer of a slice or string. OCLOSUREVAR // variable reference at beginning of closure function OCFUNC // reference to c function pointer (not go func value) OCHECKNIL // emit code to ensure pointer/interface not nil OVARDEF // variable is about to be fully initialized OVARKILL // variable is dead OVARLIVE // variable is alive ORESULT // result of a function call; Xoffset is stack offset OINLMARK // start of an inlined body, with file/line of caller. Xoffset is an index into the inline tree. // arch-specific opcodes ORETJMP // return to other function OGETG // runtime.getg() (read g pointer) OEND )
Node ops.
func (Op) Format ¶
func (Op) GoString ¶
func (Op) IsSlice3 ¶
IsSlice3 reports whether o is a slice3 op (OSLICE3, OSLICE3ARR). o must be a slicing op.
func (Op) String ¶
type Order ¶
type Order struct {
// contains filtered or unexported fields
}
Order holds state during the ordering process.
type Param ¶
type Param struct { Ntype *Node Heapaddr *Node // temp holding heap address of param // ONAME PAUTOHEAP Stackcopy *Node // the PPARAM/PPARAMOUT on-stack slot (moved func params only) // ONAME closure linkage // Consider: // // func f() { // x := 1 // x1 // func() { // use(x) // x2 // func() { // use(x) // x3 // --- parser is here --- // }() // }() // } // // There is an original declaration of x and then a chain of mentions of x // leading into the current function. Each time x is mentioned in a new closure, // we create a variable representing x for use in that specific closure, // since the way you get to x is different in each closure. // // Let's number the specific variables as shown in the code: // x1 is the original x, x2 is when mentioned in the closure, // and x3 is when mentioned in the closure in the closure. // // We keep these linked (assume N > 1): // // - x1.Defn = original declaration statement for x (like most variables) // - x1.Innermost = current innermost closure x (in this case x3), or nil for none // - x1.IsClosureVar() = false // // - xN.Defn = x1, N > 1 // - xN.IsClosureVar() = true, N > 1 // - x2.Outer = nil // - xN.Outer = x(N-1), N > 2 // // // When we look up x in the symbol table, we always get x1. // Then we can use x1.Innermost (if not nil) to get the x // for the innermost known closure function, // but the first reference in a closure will find either no x1.Innermost // or an x1.Innermost with .Funcdepth < Funcdepth. // In that case, a new xN must be created, linked in with: // // xN.Defn = x1 // xN.Outer = x1.Innermost // x1.Innermost = xN // // When we finish the function, we'll process its closure variables // and find xN and pop it off the list using: // // x1 := xN.Defn // x1.Innermost = xN.Outer // // We leave x1.Innermost set so that we can still get to the original // variable quickly. Not shown here, but once we're // done parsing a function and no longer need xN.Outer for the // lexical x reference links as described above, funcLit // recomputes xN.Outer as the semantic x reference link tree, // even filling in x in intermediate closures that might not // have mentioned it along the way to inner closures that did. // See funcLit for details. // // During the eventual compilation, then, for closure variables we have: // // xN.Defn = original variable // xN.Outer = variable captured in next outward scope // to make closure where xN appears // // Because of the sharding of pieces of the node, x.Defn means x.Name.Defn // and x.Innermost/Outer means x.Name.Param.Innermost/Outer. Innermost *Node Outer *Node // OTYPE & ONAME //go:embed info, // sharing storage to reduce gc.Param size. // Extra is nil, or else *Extra is a *paramType or an *embedFileList. Extra *interface{} }
func (*Param) Alias ¶
Alias reports whether p, which must be for an OTYPE, is a type alias.
func (*Param) EmbedList ¶
func (p *Param) EmbedList() []irEmbed
EmbedList returns the list of embedded files for p, which must be for an ONAME var.
func (*Param) Pragma ¶
func (p *Param) Pragma() PragmaFlag
Pragma returns the PragmaFlag for p, which must be for an OTYPE.
func (*Param) SetAlias ¶
SetAlias sets whether p, which must be for an OTYPE, is a type alias.
func (*Param) SetEmbedList ¶
func (p *Param) SetEmbedList(list []irEmbed)
SetEmbedList sets the list of embedded files for p, which must be for an ONAME var.
func (*Param) SetPragma ¶
func (p *Param) SetPragma(flag PragmaFlag)
SetPragma sets the PragmaFlag for p, which must be for an OTYPE.
type Pragma ¶
type Pragma struct { Flag PragmaFlag // collected bits Pos []PragmaPos // position of each individual flag Embeds []PragmaEmbed }
*Pragma is the value stored in a syntax.Pragma during parsing.
type PragmaEmbed ¶
type PragmaFlag ¶
type PragmaFlag int16
const ( // Func pragmas. Nointerface PragmaFlag = 1 << iota Noescape // func parameters don't escape Norace // func must not have race detector annotations Nosplit // func should not execute on separate stack Noinline // func should not be inlined NoCheckPtr // func should not be instrumented by checkptr CgoUnsafeArgs // treat a pointer to one arg as a pointer to them all UintptrEscapes // pointers converted to uintptr escape // Runtime-only func pragmas. // See ../../../../runtime/README.md for detailed descriptions. Systemstack // func must run on system stack Nowritebarrier // emit compiler error instead of write barrier Nowritebarrierrec // error on write barrier in this or recursive callees Yeswritebarrierrec // cancels Nowritebarrierrec in this function and callees // Runtime and cgo type pragmas NotInHeap // values of this type must not be heap allocated // Go command pragmas GoBuildPragma )
type PragmaPos ¶
type PragmaPos struct { Flag PragmaFlag Pos syntax.Pos }
type Progs ¶
type Progs struct { Text *obj.Prog // ATEXT Prog for this function // contains filtered or unexported fields }
Progs accumulates Progs for a function and converts them into machine code.
func (*Progs) Appendpp ¶
func (pp *Progs) Appendpp(p *obj.Prog, as obj.As, ftype obj.AddrType, freg int16, foffset int64, ttype obj.AddrType, treg int16, toffset int64) *obj.Prog
func (*Progs) Flush ¶
func (pp *Progs) Flush()
Flush converts from pp to machine code.
func (*Progs) Free ¶
func (pp *Progs) Free()
Free clears pp and any associated resources.
func (*Progs) NewProg ¶
func (*Progs) Prog ¶
Prog adds a Prog with instruction As to pp.
type SSAGenState ¶
type SSAGenState struct { // Branches remembers all the branch instructions we've seen // and where they would like to go. Branches []Branch // Some architectures require a 64-bit temporary for FP-related register shuffling. Examples include PPC and Sparc V8. ScratchFpMem *Node // wasm: The number of values on the WebAssembly stack. This is only used as a safeguard. OnWasmStackSkipped int // contains filtered or unexported fields }
SSAGenState contains state needed during Prog generation.
func (*SSAGenState) AddrScratch ¶
func (s *SSAGenState) AddrScratch(a *obj.Addr)
func (*SSAGenState) Br ¶
Br emits a single branch instruction and returns the instruction. Not all architectures need the returned instruction, but otherwise the boilerplate is common to all.
func (*SSAGenState) Call ¶
func (s *SSAGenState) Call(v *ssa.Value) *obj.Prog
Call returns a new CALL instruction for the SSA value v. It uses PrepareCall to prepare the call.
func (*SSAGenState) CombJump ¶
func (s *SSAGenState) CombJump(b, next *ssa.Block, jumps *[2][2]IndexJump)
CombJump generates combinational instructions (2 at present) for a block jump, thereby the behaviour of non-standard condition codes could be simulated
func (*SSAGenState) DebugFriendlySetPosFrom ¶
func (s *SSAGenState) DebugFriendlySetPosFrom(v *ssa.Value)
DebugFriendlySetPosFrom adjusts Pos.IsStmt subject to heuristics that reduce "jumpy" line number churn when debugging. Spill/fill/copy instructions from the register allocator, phi functions, and instructions with a no-pos position are examples of instructions that can cause churn.
func (*SSAGenState) Pc ¶
func (s *SSAGenState) Pc() *obj.Prog
Pc returns the current Prog.
func (*SSAGenState) PrepareCall ¶
func (s *SSAGenState) PrepareCall(v *ssa.Value)
PrepareCall prepares to emit a CALL instruction for v and does call-related bookkeeping. It must be called immediately before emitting the actual CALL instruction, since it emits PCDATA for the stack map at the call (calls are safe points).
func (*SSAGenState) Prog ¶
func (s *SSAGenState) Prog(as obj.As) *obj.Prog
Prog appends a new Prog.
func (*SSAGenState) SetPos ¶
func (s *SSAGenState) SetPos(pos src.XPos)
SetPos sets the current source position.
func (*SSAGenState) UseArgs ¶
func (s *SSAGenState) UseArgs(n int64)
UseArgs records the fact that an instruction needs a certain amount of callee args space for its use.
type ScopeID ¶
type ScopeID int32
A ScopeID represents a lexical scope within a function.
type Sig ¶
type Sig struct {
// contains filtered or unexported fields
}
type Symlink ¶
type Symlink struct {
// contains filtered or unexported fields
}
type Timings ¶
type Timings struct {
// contains filtered or unexported fields
}
Timings collects the execution times of labeled phases which are added trough a sequence of Start/Stop calls. Events may be associated with each phase via AddEvent.
func (*Timings) AddEvent ¶
AddEvent associates an event, i.e., a count, or an amount of data, with the most recently started or stopped phase; or the very first phase if Start or Stop hasn't been called yet. The unit specifies the unit of measurement (e.g., MB, lines, no. of funcs, etc.).
func (*Timings) Start ¶
Start marks the beginning of a new phase and implicitly stops the previous phase. The phase name is the colon-separated concatenation of the labels.
func (*Timings) Stop ¶
Stop marks the end of a phase and implicitly starts a new phase. The labels are added to the labels of the ended phase.
func (*Timings) Write ¶
Write prints the phase times to w. The prefix is printed at the start of each line.
type Val ¶
type Val struct { // U contains one of: // bool bool when Ctype() == CTBOOL // *Mpint int when Ctype() == CTINT, rune when Ctype() == CTRUNE // *Mpflt float when Ctype() == CTFLT // *Mpcplx pair of floats when Ctype() == CTCPLX // string string when Ctype() == CTSTR // *Nilval when Ctype() == CTNIL U interface{} }
func (Val) Ctype ¶
func (Val) Format ¶
func (Val) Interface ¶
func (v Val) Interface() interface{}
Interface returns the constant value stored in v as an interface{}. It returns int64s for ints and runes, float64s for floats, complex128s for complex values, and nil for constant nils.
Source Files ¶
alg.go algkind_string.go align.go bexport.go bimport.go bitset.go builtin.go bv.go class_string.go closure.go const.go dcl.go dump.go dwinl.go embed.go esc.go escape.go export.go fmt.go gen.go go.go gsubr.go iexport.go iimport.go init.go initorder.go inl.go lex.go main.go mapfile_read.go mpfloat.go mpint.go noder.go obj.go op_string.go order.go pgen.go phi.go plive.go pprof.go racewalk.go range.go reflect.go scc.go scope.go select.go sinit.go ssa.go subr.go swt.go syntax.go timings.go trace.go typecheck.go types.go types_acc.go universe.go unsafe.go util.go walk.go
- Version
- v1.16.0
- Published
- Feb 16, 2021
- Platform
- js/wasm
- Imports
- 49 packages
- Last checked
- 27 seconds ago –
Tools for package owners.