Documentation ¶
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 Appendpp(p *obj.Prog, as obj.As, ftype obj.AddrType, freg int16, foffset int64, ...) *obj.Prog
- func AuxOffset(v *ssa.Value) (offset int64)
- func CheckLoweredGetClosurePtr(v *ssa.Value)
- func CheckLoweredPhi(v *ssa.Value)
- func Clearp(p *obj.Prog)
- func Dump(s string, n *Node)
- func Exit(code int)
- func Fatalf(fmt_ string, args ...interface{})
- func Gins(as obj.As, f, t *Node) *obj.Prog
- func Gvardef(n *Node)
- func Gvarkill(n *Node)
- func Gvarlive(n *Node)
- func Import(in *bufio.Reader)
- func Isconst(n *Node, ct Ctype) bool
- func KeepAlive(v *ssa.Value)
- func Linksym(s *Sym) *obj.LSym
- func Main()
- func Naddr(a *obj.Addr, n *Node)
- func Nodconst(n *Node, t *Type, v int64)
- func Patch(p *obj.Prog, to *obj.Prog)
- func Prog(as obj.As) *obj.Prog
- func Rnd(o int64, r int64) int64
- func SSAGenFPJump(s *SSAGenState, b, next *ssa.Block, jumps *[2][2]FloatingEQNEJump)
- func Warn(fmt_ string, args ...interface{})
- func Warnl(line int32, fmt_ string, args ...interface{})
- type AlgKind
- type Arch
- type ArrayType
- type BasicBlock
- type Branch
- type ChanArgsType
- type ChanDir
- type ChanType
- type Class
- type Ctype
- type DDDFieldType
- type Dlist
- type EType
- type Error
- type EscState
- type EscStep
- type Field
- type Fields
- type FloatingEQNEJump
- type FmtFlag
- type ForwardType
- type Funarg
- type Func
- type FuncArgsType
- type FuncType
- type GCProg
- type InitEntry
- type InitPlan
- type InterMethType
- type InterType
- type Iter
- type Level
- type Liveness
- type Magic
- type MapType
- type Mpcplx
- 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 (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) 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) int
- func (a *Mpint) SetInt64(c int64)
- func (a *Mpint) SetOverflow()
- func (a *Mpint) SetString(as string)
- func (x *Mpint) String() string
- func (a *Mpint) Sub(b *Mpint)
- func (a *Mpint) Xor(b *Mpint)
- type Name
- type NilVal
- type Node
- func (n *Node) Format(s fmt.State, verb rune)
- func (n *Node) HasBreak() bool
- func (n *Node) Int64() int64
- func (n *Node) Iota() int64
- func (n *Node) IsAutoTmp() bool
- func (n *Node) IsMethod() bool
- func (n *Node) IsOutputParamHeapAddr() bool
- func (n *Node) Line() string
- func (n *Node) Nconv(s fmt.State, flag FmtFlag)
- func (n *Node) Opt() interface{}
- func (n *Node) SetHasBreak(b bool)
- func (n *Node) SetIota(x int64)
- func (n *Node) SetOpt(x interface{})
- func (n *Node) SetSliceBounds(low, high, max *Node)
- func (n *Node) SetVal(v Val)
- func (n *Node) SliceBounds() (low, high, max *Node)
- func (n *Node) String() string
- func (n *Node) Typ() ssa.Type
- func (n *Node) Val() Val
- type NodeEscState
- 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 (l 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(node *Node)
- func (n *Nodes) Set2(n1, n2 *Node)
- func (n Nodes) SetIndex(i int, node *Node)
- func (n Nodes) Slice() []*Node
- func (n Nodes) String() string
- type Op
- type Order
- type Param
- type Pkg
- type Pragma
- type ProgInfo
- type PtrType
- type SSAGenState
- type Sig
- type SliceType
- type StructType
- type Sym
- type SymFlags
- type Symlink
- type Timings
- type Type
- func (t *Type) Alignment() int64
- func (t *Type) AllMethods() *Fields
- func (t *Type) ArgWidth() int64
- func (t *Type) ChanArgs() *Type
- func (t *Type) ChanDir() ChanDir
- func (t *Type) ChanType() *ChanType
- func (t *Type) Compare(u ssa.Type) ssa.Cmp
- func (t *Type) Copy() *Type
- func (t *Type) DDDField() *Type
- func (t *Type) Elem() *Type
- func (t *Type) ElemType() ssa.Type
- func (t *Type) Field(i int) *Field
- func (t *Type) FieldName(i int) string
- func (t *Type) FieldOff(i int) int64
- func (t *Type) FieldSlice() []*Field
- func (t *Type) FieldType(i int) ssa.Type
- func (t *Type) Fields() *Fields
- func (t *Type) Format(s fmt.State, verb rune)
- func (t *Type) ForwardType() *ForwardType
- func (t *Type) FuncArgs() *Type
- func (t *Type) FuncType() *FuncType
- func (t *Type) IncomparableField() *Field
- func (t *Type) IsArray() bool
- func (t *Type) IsBoolean() bool
- func (t *Type) IsChan() bool
- func (t *Type) IsComparable() bool
- func (t *Type) IsComplex() bool
- func (t *Type) IsEmptyInterface() bool
- func (t *Type) IsFlags() bool
- func (t *Type) IsFloat() bool
- func (t *Type) IsFuncArgStruct() bool
- func (t *Type) IsInteger() bool
- func (t *Type) IsInterface() bool
- func (t *Type) IsKind(et EType) bool
- func (t *Type) IsMap() bool
- func (t *Type) IsMemory() bool
- func (t *Type) IsPtr() bool
- func (t *Type) IsPtrShaped() bool
- func (t *Type) IsRegularMemory() bool
- func (t *Type) IsSigned() bool
- func (t *Type) IsSlice() bool
- func (t *Type) IsString() bool
- func (t *Type) IsStruct() bool
- func (t *Type) IsTuple() bool
- func (t *Type) IsUnsafePtr() bool
- func (t *Type) IsUntyped() bool
- func (t *Type) IsVoid() bool
- func (t *Type) Key() *Type
- func (t *Type) MapType() *MapType
- func (t *Type) Methods() *Fields
- func (t *Type) Nname() *Node
- func (t *Type) NumElem() int64
- func (t *Type) NumFields() int
- func (t *Type) Params() *Type
- func (t *Type) PtrTo() ssa.Type
- func (t *Type) Recv() *Field
- func (t *Type) Recvs() *Type
- func (t *Type) Results() *Type
- func (t *Type) SetFields(fields []*Field)
- func (t *Type) SetNname(n *Node)
- func (t *Type) SetNumElem(n int64)
- func (t *Type) SimpleString() string
- func (t *Type) Size() int64
- func (t *Type) String() string
- func (t *Type) StructType() *StructType
- func (t *Type) Val() *Type
- type Val
Constants ¶
const ( WORDBITS = 32 WORDMASK = WORDBITS - 1 WORDSHIFT = 5 )
const ( EscFuncUnknown = 0 + iota EscFuncPlanned EscFuncStarted EscFuncTagged )
const ( EscUnknown = iota EscNone // Does not escape to heap, result, or parameters. EscReturn // Is returned or reachable from returned. EscHeap // Reachable from the heap EscNever // By construction will not escape. EscBits = 3 EscMask = (1 << EscBits) - 1 EscContentEscapes = 1 << EscBits // value obtained by indirect of parameter escapes to heap EscReturnBits = EscBits + 1 )
Escape constants are numbered in order of increasing "escapiness" to help make inferences be monotonic. With the exception of EscNever which is sticky, eX < eY means that eY is more exposed than eX, and hence replaces it in a conservative analysis.
const ( FErr = iota FDbg FTypeId )
*Sym, *Type, and *Node types use the flags below to set the format mode
const ( UINF = 100 BADWIDTH = -1000000000 MaxStackVarSize = 10 * 1024 * 1024 )
const ( // Pseudo-op, like TEXT, GLOBL, TYPE, PCDATA, FUNCDATA. Pseudo = 1 << 1 // There's nothing to say about the instruction, // but it's still okay to see. OK = 1 << 2 // Size of right-side write, or right-side read if no write. SizeB = 1 << 3 SizeW = 1 << 4 SizeL = 1 << 5 SizeQ = 1 << 6 SizeF = 1 << 7 SizeD = 1 << 8 // Left side (Prog.from): address taken, read, write. LeftAddr = 1 << 9 LeftRead = 1 << 10 LeftWrite = 1 << 11 // Register in middle (Prog.reg); only ever read. (arm, ppc64) RegRead = 1 << 12 CanRegRead = 1 << 13 // Right side (Prog.to): address taken, read, write. RightAddr = 1 << 14 RightRead = 1 << 15 RightWrite = 1 << 16 // Instruction kinds Move = 1 << 17 // straight move Conv = 1 << 18 // size conversion Cjmp = 1 << 19 // conditional jump Break = 1 << 20 // breaks control flow (no fallthrough) Call = 1 << 21 // function call Jump = 1 << 22 // jump Skip = 1 << 23 // data instruction // Set, use, or kill of carry bit. // Kill means we never look at the carry bit after this kind of instruction. // Originally for understanding ADC, RCR, and so on, but now also // tracks set, use, and kill of the zero and overflow bits as well. // TODO rename to {Set,Use,Kill}Flags SetCarry = 1 << 24 UseCarry = 1 << 25 KillCarry = 1 << 26 // Special cases for register use. (amd64, 386) ShiftCX = 1 << 27 // possible shift by CX ImulAXDX = 1 << 28 // possible multiply into DX:AX // Instruction updates whichever of from/to is type D_OREG. (ppc64) PostInc = 1 << 29 // Optional 3rd input operand, only ever read. From3Read = 1 << 30 )
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 ( UNVISITED = 0 VISITED = 1 )
const ( H0 = 2166136261 Hp = 16777619 )
FNV-1 hash function constants.
const ( BUCKETSIZE = 8 MAXKEYSIZE = 128 MAXVALSIZE = 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/hashmap.go!
const ( InitNotStarted = 0 InitDone = 1 InitPending = 2 )
static initialization
const ( OXXX = Op(iota) // names ONAME // var, const or func name ONONAME // unnamed arg or return value: f(int, string) (int, error) { etc } 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) OARRAYBYTESTR // Type(Left) (Type is string, Left is a []byte) OARRAYBYTESTRTMP // Type(Left) (Type is string, Left is a []byte, ephemeral) OARRAYRUNESTR // Type(Left) (Type is string, Left is a []rune) OSTRARRAYBYTE // Type(Left) (Type is []byte, Left is a string) OSTRARRAYBYTETMP // Type(Left) (Type is []byte, Left is a string, ephemeral) OSTRARRAYRUNE // Type(Left) (Type is []rune, Left is a string) OAS // Left = Right or (if Colas=true) Left := Right OAS2 // List = Rlist (x, y, z = a, b, c) OAS2FUNC // List = Rlist (x, y = f()) OAS2RECV // List = Rlist (x, ok = <-c) OAS2MAPR // List = Rlist (x, ok = m["foo"]) OAS2DOTTYPE // List = Rlist (x, ok = I.(int)) OASOP // Left Etype= Right (x += y) OASWB // Left = Right (with write barrier) OCALL // Left(List) (function call, method call or type conversion) OCALLFUNC // Left(List) (function call f(args)) OCALLMETH // Left(List) (direct method call x.Method(args)) OCALLINTER // Left(List) (interface method call x.Method(args)) OCALLPART // Left.Right (method expression x.Method, not called) OCAP // cap(Left) OCLOSE // close(Left) OCLOSURE // func Type { Body } (func literal) OCMPIFACE // Left Etype Right (interface comparison, x == y or x != y) OCMPSTR // Left Etype Right (string comparison, x == y, x < y, etc) 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) 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 ODELETE // delete(Left, Right) 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) ODOTTYPE2 // Left.Right or Left.Type (.Right during parsing, .Type once resolved; on rhs of OAS2DOTTYPE) OEQ // Left == Right ONE // Left != Right OLT // Left < Right OLE // Left <= Right OGE // Left >= Right OGT // Left > Right OIND // *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) OMUL // Left * Right ODIV // Left / Right OMOD // Left % Right OLSH // Left << Right ORSH // Left >> Right OAND // Left & Right OANDNOT // Left &^ Right ONEW // new(Left) ONOT // !Left OCOM // ^Left OPLUS // +Left OMINUS // -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) 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: (apperas as .Left of OCASE; count(List) == 2, Right.Op == ORECV) OIOTA // iota OREAL // real(Left) OIMAG // imag(Left) OCOMPLEX // complex(Left, Right) OALIGNOF // unsafe.Alignof(Left) OOFFSETOF // unsafe.Offsetof(Left) OSIZEOF // unsafe.Sizeof(Left) // statements OBLOCK // { List } (block of code) OBREAK // break OCASE // case Left or List[0]..List[1]: Nbody (select case after processing; Left==nil and List==nil means default) OXCASE // case List: Nbody (select case before processing; List==nil means default) OCONTINUE // continue ODEFER // defer Left (Left must be call) OEMPTY // no-op (empty statement) OFALL // fallthrough (after processing) OXFALL // fallthrough (before processing) OFOR // for Ninit; Left; Right { Nbody } OGOTO // goto Left OIF // if Ninit; Left { Nbody } else { Rlist } OLABEL // Left: OPROC // go Left (Left must be call) ORANGE // for List = range Right { Nbody } ORETURN // return List OSELECT // select { List } (List is list of OXCASE or OCASE) OSWITCH // switch Ninit; Left { List } (List is a list of OXCASE or OCASE) OTYPESW // List = Left.(type) (appears as .Left of OSWITCH) // types OTCHAN // chan int OTMAP // map[string]int OTSTRUCT // struct{} OTINTER // interface{} OTFUNC // func() OTARRAY // []int, [8]int, [N]int or [...]int // misc ODDD // func f(args ...int) or f(l...) or var a = [...]int{0, 1, 2}. ODDDARG // func f(args ...int), introduced by escape analysis. 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 OVARKILL // variable is dead OVARLIVE // variable is alive OINDREGSP // offset plus indirect of REGSP, such as 8(SP). // arch-specific opcodes OCMP // compare: ACMP. ODEC // decrement: ADEC. OINC // increment: AINC. OEXTEND // extend: ACWD/ACDQ/ACQO. OHMUL // high mul: AMUL/AIMUL for unsigned/signed (OMUL uses AIMUL for both). OLROT // left rotate: AROL. ORROTC // right rotate-carry: ARCR. ORETJMP // return to other function OPS // compare parity set (for x86 NaN check) OPC // compare parity clear (for x86 NaN check) OSQRT // sqrt(float64), on systems that have hw support OGETG // runtime.getg() (read g pointer) OEND )
Node ops.
const ( Txxx = iota TINT8 TUINT8 TINT16 TUINT16 TINT32 TUINT32 TINT64 TUINT64 TINT TUINT TUINTPTR TCOMPLEX64 TCOMPLEX128 TFLOAT32 TFLOAT64 TBOOL TPTR32 TPTR64 TFUNC TSLICE TARRAY TSTRUCT TCHAN TMAP TINTER TFORW TANY TSTRING TUNSAFEPTR // pseudo-types for literals TIDEAL TNIL TBLANK // pseudo-types for frame layout TFUNCARGS TCHANARGS TINTERMETH // pseudo-types for import/export TDDDFIELD // wrapper: contained type is a ... field NTYPE )
const ( Etop = 1 << iota // evaluated at statement level Erv // evaluated in value context Etype // evaluated in type context Ecall // call-only expressions are ok Efnstruct // multivalue function returns are ok Easgn // assigning to expression Ecomplit // type in composite literal )
const (
ArhdrSize = 60
)
architecture-independent object file output
const (
MinLevel = -2
)
There appear to be some loops in the escape graph, causing arbitrary recursion into deeper and deeper levels. Cut this off safely by making minLevel sticky: once you get that deep, you cannot go down any further but you also cannot go up any further. This is a conservative fix. Making minLevel smaller (more negative) would handle more complex chains of indirections followed by address-of operations, at the cost of repeating the traversal once for each additional allowed level when a loop is encountered. Using -2 suffices to pass all the tests we have written so far, which we assume matches the level of complexity we want the escape analysis code to handle.
const NOTALOOPDEPTH = -1
Variables ¶
var Ctxt *obj.Link
var Debug [256]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
var Maxarg int64
var Nacl bool
var Stksize int64 // stack size for current frame
var Types [NTYPE]*Type
Types stores pointers to predeclared named types.
It also stores pointers to several special types:
- Types[TANY] is the placeholder "any" type recognized by substArgTypes.
- Types[TBLANK] represents the blank variable's type.
- Types[TIDEAL] represents untyped numeric constants.
- Types[TNIL] represents the predeclared "nil" value's type.
- Types[TUNSAFEPTR] is package unsafe's Pointer type.
var Widthint int
var Widthptr int
var Widthreg int
Functions ¶
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 KeepAlive ¶
KeepAlive marks the variable referenced by OpKeepAlive as live. Called during ssaGenValue.
func SSAGenFPJump ¶
func SSAGenFPJump(s *SSAGenState, b, next *ssa.Block, jumps *[2][2]FloatingEQNEJump)
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 )
type Arch ¶
type Arch struct { LinkArch *obj.LinkArch REGSP int MAXWIDTH int64 Defframe func(*obj.Prog) Proginfo func(*obj.Prog) ProgInfo Use387 bool // should 8g use 387 FP instructions instead of sse2. // 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) }
var Thearch Arch
type ArrayType ¶
type ArrayType struct { Elem *Type // element type Bound int64 // number of elements; <0 if unknown yet Haspointers uint8 // 0 unknown, 1 no, 2 yes }
ArrayType contains Type fields specific to array types.
type BasicBlock ¶
type BasicBlock struct {
// contains filtered or unexported fields
}
An ordinary basic block.
Instructions are threaded together in a doubly-linked list. To iterate in program order follow the link pointer from the first node and stop after the last node has been visited
for p = bb.first; ; p = p.link { ... if p == bb.last { break } }
To iterate in reverse program order by following the opt pointer from the last node
for p = bb.last; p != nil; p = p.opt { ... }
type ChanArgsType ¶
type ChanArgsType struct {
T *Type // reference to a chan type whose elements need a width check
}
ChanArgsType contains Type fields specific to TCHANARGS types.
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.
type DDDFieldType ¶
type DDDFieldType struct {
T *Type // reference to a slice type for ... args
}
DDDFieldType contains Type fields specific to TDDDFIELD types.
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 EType ¶
type EType uint8
EType describes a kind of type.
var Tptr EType // either TPTR32 or TPTR64
func Simsimtype ¶
even simpler simtype; get rid of ptr, bool. assuming that the front end has rejected all the invalid conversions (like ptr -> bool)
type EscStep ¶
type EscStep struct {
// contains filtered or unexported fields
}
An EscStep documents one step in the path from memory that is heap allocated to the (alleged) reason for the heap allocation.
type Field ¶
type Field struct { Nointerface bool Embedded uint8 // embedded field Funarg Funarg Broke bool // broken field definition Isddd bool // field is ... argument Sym *Sym Nname *Node Type *Type // field type // Offset in bytes of this field or method within its enclosing struct // or interface Type. Offset int64 Note string // literal string annotation }
A Field represents a field in a struct or a method in an interface or associated with a named type.
type Fields ¶
type Fields struct {
// contains filtered or unexported fields
}
Fields is a pointer to a slice of *Field. This saves space in Types that do not have fields or methods compared to a simple slice of *Field.
func (*Fields) Index ¶
Index returns the i'th element of Fields. It panics if f does not have at least i+1 elements.
func (*Fields) Iter ¶
Iter returns the first field in fs and an Iter value to continue iterating across its successor fields. Deprecated: New code should use Slice instead.
type FloatingEQNEJump ¶
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.
type ForwardType ¶
type ForwardType struct { Copyto []*Node // where to copy the eventual value to Embedlineno int32 // first use of this type as an embedded type }
ForwardType contains Type fields specific to forward types.
type Func ¶
type Func struct { Shortname *Node Enter Nodes // for example, allocate and initialize memory for escaping parameters Exit Nodes Cvars Nodes // closure params Dcl []*Node // autodcl for this func/closure Inldcl Nodes // copy of dcl for use in inlining Closgen int Outerfunc *Node // outer function (for closure) FieldTrack map[*Sym]struct{} Ntype *Node // signature Top int // top context (Ecall, Eproc, etc) Closure *Node // OCLOSURE <-> ODCLFUNC Nname *Node Inl Nodes // copy of the body for use in inlining InlCost int32 Depth int32 Label int32 // largest auto-generated label in this function Endlineno int32 WBLineno int32 // line number of first write barrier Pragma Pragma // go:xxx function annotations Dupok bool // duplicate definitions ok Wrapper bool // is method wrapper Needctxt bool // function uses context register (has closure variables) ReflectMethod bool // function calls reflect.Type.Method or MethodByName IsHiddenClosure bool }
Func holds Node fields used only with function-like nodes.
type FuncArgsType ¶
type FuncArgsType struct {
T *Type // reference to a func type whose elements need a width check
}
// FuncArgsType contains Type fields specific to TFUNCARGS types.
type FuncType ¶
type FuncType struct { Receiver *Type // function receiver Results *Type // function results Params *Type // function params Nname *Node // Argwid is the total width of the function receiver, params, and results. // It gets calculated via a temporary TFUNCARGS type. // Note that TFUNC's Width is Widthptr. Argwid int64 Outnamed bool }
FuncType contains Type fields specific to func types.
type InterMethType ¶
type InterMethType struct {
Nname *Node
}
InterMethType contains Type fields specific to interface method psuedo-types.
type InterType ¶
type InterType struct {
// contains filtered or unexported fields
}
InterType contains Type fields specific to interface types.
type Iter ¶
type Iter struct {
// contains filtered or unexported fields
}
Iter provides an abstraction for iterating across struct fields and interface methods.
type Level ¶
type Level struct {
// contains filtered or unexported fields
}
A Level encodes the reference state and context applied to (stack, heap) allocated memory.
value is the overall sum of *(1) and &(-1) operations encountered along a path from a destination (sink, return value) to a source (allocation, parameter).
suffixValue is the maximum-copy-started-suffix-level applied to a sink. For example: sink = x.left.left --> level=2, x is dereferenced twice and does not escape to sink. sink = &Node{x} --> level=-1, x is accessible from sink via one "address of" sink = &Node{&Node{x}} --> level=-2, x is accessible from sink via two "address of" sink = &Node{&Node{x.left}} --> level=-1, but x is NOT accessible from sink because it was indirected and then copied. (The copy operations are sometimes implicit in the source code; in this case, value of x.left was copied into a field of a newly allocated Node)
There's one of these for each Node, and the integer values rarely exceed even what can be stored in 4 bits, never mind 8.
type Liveness ¶
type Liveness struct {
// contains filtered or unexported fields
}
A collection of global state used by liveness analysis.
type Magic ¶
type Magic struct { W int // input for both - width S int // output for both - shift Bad int // output for both - unexpected failure // magic multiplier for signed literal divisors Sd int64 // input - literal divisor Sm int64 // output - multiplier // magic multiplier for unsigned literal divisors Ud uint64 // input - literal divisor Um uint64 // output - multiplier Ua int // output - adder }
argument passing to/from smagic and umagic
type MapType ¶
type MapType struct { Key *Type // Key type Val *Type // Val (elem) type Bucket *Type // internal struct type representing a hash bucket Hmap *Type // internal struct type representing the Hmap (map header object) Hiter *Type // internal struct type representing hash iterator state }
MapType contains Type fields specific to maps.
type Mpflt ¶
Mpflt represents a floating-point constant.
func (*Mpflt) AddFloat64 ¶
func (*Mpflt) CmpFloat64 ¶
func (*Mpflt) MulFloat64 ¶
func (*Mpflt) SetFloat64 ¶
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) SetOverflow ¶
func (a *Mpint) SetOverflow()
type Name ¶
type Name struct { Pack *Node // real package for import . names Pkg *Pkg // pkg for OPACK nodes Heapaddr *Node // temp holding heap address of param (could move to Param?) Defn *Node // initializing assignment Curfn *Node // function for local variables Param *Param // additional fields for ONAME Decldepth int32 // declaration loop depth, increased for every loop or label Vargen int32 // unique name for ONAME within a function. Function outputs are numbered starting at one. Funcdepth int32 Method bool // OCALLMETH name Readonly bool Captured bool // is the variable captured by a closure Byval bool // is the variable captured by value or by reference Needzero bool // if it contains pointers, needs to be zeroed on function entry Keepalive bool // mark value live across unknown assembly call AutoTemp bool // is the variable a temporary (implies no dwarf info. reset if escapes to heap) }
Name holds Node fields used only by named nodes (ONAME, OPACK, OLABEL, some OLITERAL).
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 *Type Orig *Node // original form, for printing, and tracking copies of ONAMEs // func Func *Func // ONAME Name *Name Sym *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 OINDREGSP use it to indicate offset relative to their base address. // - OSTRUCTKEY uses it to store the named field's offset. // - OXCASE and OXFALL use it to validate the use of fallthrough. // - ONONAME uses it to store the current value of iota, see Node.Iota // Possibly still more uses. If you find any, document them. Xoffset int64 Lineno int32 Esc uint16 // EscXXX Op Op Ullman uint8 // sethi/ullman number Addable bool // addressable Etype EType // op for OASOP, etype for OTYPE, exclam for export, 6g saved reg, ChanDir for OTCHAN, for OINDEXMAP 1=LHS,0=RHS Bounded bool // bounds check unnecessary NonNil bool // guaranteed to be non-nil Class Class // PPARAM, PAUTO, PEXTERN, etc Embedded uint8 // ODCLFIELD embedded type Colas bool // OAS resulting from := Diag bool // already printed error about this Noescape bool // func arguments do not escape; TODO(rsc): move Noescape to Func struct (see CL 7360) Walkdef uint8 // tracks state during typecheckdef; 2 == loop detected Typecheck uint8 // tracks state during typechecking; 2 == loop detected Local bool IsStatic bool // whether this Node will be converted to purely static data Initorder uint8 Used bool // for variable/label declared and not used error Isddd bool // is the argument variadic Implicit bool Addrtaken bool // address taken, even if not moved to heap Assigned bool // is the variable ever assigned to Likely int8 // likeliness of if statement // 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.
var Curfn *Node
var Deferproc *Node
var Deferreturn *Node
var Newproc *Node
func AutoVar ¶
AutoVar returns a *Node and int64 representing the auto variable and offset within it where v should be spilled.
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) IsOutputParamHeapAddr ¶
func (*Node) Nconv ¶
"%L" suffix with "(type %T)" where possible "%+S" in debug mode, don't recurse, no multiline output
func (*Node) SetHasBreak ¶
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) 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.
type NodeEscState ¶
type NodeEscState struct { Curfn *Node Flowsrc []EscStep // flow(this, src) Retval Nodes // on OCALLxxx, list of dummy return values Loopdepth int32 // -1: global, 0: return variables, 1:function top level, increased inside function for every loop or label to mark scopes Level Level Walkgen uint32 Maxextraloopdepth int32 }
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. If a slice is passed in, this will take ownership of it.
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) Index ¶
Index returns the i'th element of Nodes. It panics if n does not have at least i+1 elements.
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) SetIndex ¶
SetIndex sets the i'th element of Nodes to node. It panics if n does not have at least i+1 elements.
type Op ¶
type Op uint8
type Order ¶
type Order struct {
// contains filtered or unexported fields
}
Order holds state during the ordering process.
type Param ¶
type Param struct { Ntype *Node // ONAME PAUTOHEAP Stackcopy *Node // the PPARAM/PPARAMOUT on-stack slot (moved func params only) // ONAME PPARAM Field *Field // TFIELD in arg struct // 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 xN.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, closurebody // 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 closurebody 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 pragmas // // TODO: Should Func pragmas also be stored on the Name? Pragma Pragma }
type Pkg ¶
type Pkg struct { Name string // package name, e.g. "sys" Path string // string literal used in import statement, e.g. "runtime/internal/sys" Pathsym *obj.LSym Prefix string // escaped path for use in symbol table Imported bool // export data of this package was parsed Direct bool // imported directly Syms map[string]*Sym }
var Runtimepkg *Pkg // package runtime
func (*Pkg) LookupBytes ¶
type Pragma ¶
const ( // Func pragmas. Nointerface Pragma = 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 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-only type pragmas NotInHeap // values of this type must not be heap allocated )
type ProgInfo ¶
type ProgInfo struct { Flags uint32 // flag bits // contains filtered or unexported fields }
ProgInfo holds information about the instruction for use by clients such as the compiler. The exact meaning of this data is up to the client and is not interpreted by the cmd/internal/obj/... packages.
type PtrType ¶
type PtrType struct {
Elem *Type // element type
}
PtrType contains Type fields specific to pointer types.
type SSAGenState ¶
type SSAGenState struct { // Branches remembers all the branch instructions we've seen // and where they would like to go. Branches []Branch // 387 port: maps from SSE registers (REG_X?) to 387 registers (REG_F?) SSEto387 map[int16]int16 // Some architectures require a 64-bit temporary for FP-related register shuffling. Examples include x86-387, PPC, and Sparc V8. ScratchFpMem *Node // contains filtered or unexported fields }
SSAGenState contains state needed during Prog generation.
func (*SSAGenState) AddrScratch ¶
func (s *SSAGenState) AddrScratch(a *obj.Addr)
func (*SSAGenState) SetLineno ¶
func (s *SSAGenState) SetLineno(l int32)
SetLineno sets the current source line number.
type SliceType ¶
type SliceType struct {
Elem *Type // element type
}
SliceType contains Type fields specific to slice types.
type StructType ¶
type StructType struct { // Maps have three associated internal structs (see struct MapType). // Map links such structs back to their map type. Map *Type Funarg Funarg // type of function arguments for arg struct Haspointers uint8 // 0 unknown, 1 no, 2 yes // contains filtered or unexported fields }
StructType contains Type fields specific to struct types.
type Sym ¶
type Sym struct { Flags SymFlags Link *Sym Importdef *Pkg // where imported definition was found Linkname string // link name // saved and restored by dcopy Pkg *Pkg Name string // object name Def *Node // definition: ONAME OTYPE OPACK or OLITERAL Block int32 // blocknumber to catch redeclaration Lastlineno int32 // last declaration for diagnostic Label *Node // corresponding label (ephemeral) Origpkg *Pkg // original package for . import Lsym *obj.LSym Fsym *Sym // funcsym }
Sym represents an object name. Most commonly, this is a Go identifier naming an object declared within a package, but Syms are also used to name internal synthesized objects.
As an exception, field and method names that are exported use the Sym associated with localpkg instead of the package that declared them. This allows using Sym pointer equality to test for Go identifier uniqueness when handling selector expressions.
type Symlink ¶
type Symlink struct {
// contains filtered or unexported fields
}
code to help generate trampoline functions for methods on embedded subtypes. these are approx the same as the corresponding adddot routines except that they expect to be called with unique tasks and they return the actual methods.
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.
type Type ¶
type Type struct { // Extra contains extra etype-specific fields. // As an optimization, those etype-specific structs which contain exactly // one pointer-shaped field are stored as values rather than pointers when possible. // // TMAP: *MapType // TFORW: *ForwardType // TFUNC: *FuncType // TINTERMETHOD: InterMethType // TSTRUCT: *StructType // TINTER: *InterType // TDDDFIELD: DDDFieldType // TFUNCARGS: FuncArgsType // TCHANARGS: ChanArgsType // TCHAN: *ChanType // TPTR32, TPTR64: PtrType // TARRAY: *ArrayType // TSLICE: SliceType Extra interface{} // Width is the width of this Type in bytes. Width int64 Orig *Type // original type (type literal or predefined type) Sym *Sym // symbol containing name, for named types Vargen int32 // unique name for OTYPE/ONAME Lineno int32 // line at which this type was declared, implicitly or explicitly Etype EType // kind of type Noalg bool // suppress hash and eq algorithm generation Trecur uint8 // to detect loops Local bool // created in this file Deferwidth bool Broke bool // broken type definition. Align uint8 // the required alignment of this type, in bytes NotInHeap bool // type cannot be heap allocated // contains filtered or unexported fields }
A Type represents a Go type.
func (*Type) AllMethods ¶
func (*Type) ArgWidth ¶
ArgWidth returns the total aligned argument size for a function. It includes the receiver, parameters, and results.
func (*Type) ChanDir ¶
ChanDir returns the direction of a channel type t. The direction will be one of Crecv, Csend, or Cboth.
func (*Type) Compare ¶
Compare compares types for purposes of the SSA back end, returning an ssa.Cmp (one of CMPlt, CMPeq, CMPgt). The answers are correct for an optimizer or code generator, but not necessarily typechecking. The order chosen is arbitrary, only consistency and division into equivalence classes (Types that compare CMPeq) matters.
func (*Type) Elem ¶
Elem returns the type of elements of t. Usable with pointers, channels, arrays, and slices.
func (*Type) FieldSlice ¶
FieldSlice returns a slice of containing all fields/methods of struct/interface type t.
func (*Type) Format ¶
"%L" print definition, not name "%S" omit 'func' and receiver from function types, short type names "% v" package name, not prefix (FTypeId mode, sticky)
func (*Type) ForwardType ¶
func (t *Type) ForwardType() *ForwardType
ForwardType returns t's extra forward-type-specific fields.
func (*Type) IncomparableField ¶
IncomparableField returns an incomparable Field of struct Type t, if any.
func (*Type) IsComparable ¶
IsComparable reports whether t is a comparable type.
func (*Type) IsEmptyInterface ¶
IsEmptyInterface reports whether t is an empty interface type.
func (*Type) IsFuncArgStruct ¶
IsFuncArgStruct reports whether t is a struct representing function parameters.
func (*Type) IsInterface ¶
func (*Type) IsPtr ¶
IsPtr reports whether t is a regular Go pointer type. This does not include unsafe.Pointer.
func (*Type) IsPtrShaped ¶
IsPtrShaped reports whether t is represented by a single machine pointer. In addition to regular Go pointer types, this includes map, channel, and function types and unsafe.Pointer. It does not include array or struct types that consist of a single pointer shaped type. TODO(mdempsky): Should it? See golang.org/issue/15028.
func (*Type) IsRegularMemory ¶
IsRegularMemory reports whether t can be compared/hashed as regular memory.
func (*Type) IsUnsafePtr ¶
IsUnsafePtr reports whether t is an unsafe pointer.
func (*Type) SetNumElem ¶
SetNumElem sets the number of elements in an array type. The only allowed use is on array types created with typDDDArray. For other uses, create a new array with typArray instead.
func (*Type) SimpleString ¶
func (*Type) StructType ¶
func (t *Type) StructType() *StructType
StructType returns t's extra struct-specific fields.
type Val ¶
type Val struct { // U contains one of: // bool bool when n.ValCtype() == CTBOOL // *Mpint int when n.ValCtype() == CTINT, rune when n.ValCtype() == CTRUNE // *Mpflt float when n.ValCtype() == CTFLT // *Mpcplx pair of floats when n.ValCtype() == CTCPLX // string string when n.ValCtype() == CTSTR // *Nilval when n.ValCtype() == CTNIL U interface{} }
Source Files ¶
- alg.go
- align.go
- bexport.go
- bimport.go
- builtin.go
- bv.go
- closure.go
- const.go
- dcl.go
- esc.go
- export.go
- fmt.go
- gen.go
- go.go
- gsubr.go
- init.go
- inl.go
- lex.go
- magic.go
- main.go
- mpfloat.go
- mpint.go
- noder.go
- obj.go
- opnames.go
- order.go
- parser.go
- pgen.go
- phi.go
- plive.go
- racewalk.go
- range.go
- reflect.go
- select.go
- sinit.go
- ssa.go
- subr.go
- swt.go
- syntax.go
- timings.go
- trace.go
- type.go
- typecheck.go
- universe.go
- unsafe.go
- util.go
- walk.go