typelocationstruct { n ir.Node// represented variable or expression, if any curfn *ir.Func// enclosing function edges []edge// incoming edges loopDepth int// loopDepth at declaration// resultIndex records the tuple index (starting at 1) for// PPARAMOUT variables within their function's result type.// For non-PPARAMOUT variables it's 0. resultIndex int// derefs and walkgen are used during walkOne to track the// minimal dereferences from the walk root. derefs int// >= -1 walkgen uint32// dst and dstEdgeindex track the next immediate assignment// destination location during walkone, along with the index// of the edge pointing back to this location. dst *location dstEdgeIdx int// queued is used by walkAll to track whether this location is// in the walk queue. queued bool// escapes reports whether the represented variable's address// escapes; that is, whether the variable must be heap// allocated. escapes bool// transient reports whether the represented expression's// address does not outlive the statement; that is, whether// its storage can be immediately reused. transient bool// paramEsc records the represented parameter's leak set. paramEsc leaks captured bool// has a closure captured this variable? reassigned bool// has this variable been reassigned? addrtaken bool// has this variable's address been taken?}
typeholestruct { dst *location derefs int// >= -1 notes *note// addrtaken indicates whether this context is taking the address of// the expression, independent of whether the address will actually// be stored into a variable. addrtaken bool// uintptrEscapesHack indicates this context is evaluating an// argument for a //go:uintptrescapes function. uintptrEscapesHack bool}
hole 封装了赋值语句中对右侧表达式的执行策略。例如对于语句 x = &p, 对应的 hole 实例的内容如下: