// For this value, AuxInt is initialized to zero by default
startDeferBits := s.entryNewValue0(ssa.OpConst8, types.Types[TUINT8])
s.vars[&deferBitsVar] = startDeferBits
- s.deferBitsAddr = s.addr(deferBitsTemp, false)
+ s.deferBitsAddr = s.addr(deferBitsTemp)
s.store(types.Types[TUINT8], s.deferBitsAddr, startDeferBits)
// Make sure that the deferBits stack slot is kept alive (for use
// by panics) and stores to deferBits are not eliminated, even if
if rhs == nil {
r = nil // Signal assign to use OpZero.
} else {
- r = s.addr(rhs, false)
+ r = s.addr(rhs)
}
} else {
if rhs == nil {
if s.canSSA(n) {
return s.variable(n, n.Type)
}
- addr := s.addr(n, false)
+ addr := s.addr(n)
return s.load(n.Type, addr)
case OCLOSUREVAR:
- addr := s.addr(n, false)
+ addr := s.addr(n)
return s.load(n.Type, addr)
case OLITERAL:
switch u := n.Val().U.(type) {
return s.expr(n.Left)
case OADDR:
- return s.addr(n.Left, n.Bounded())
+ return s.addr(n.Left)
case ORESULT:
addr := s.constOffPtrSP(types.NewPtr(n.Type), n.Xoffset)
// prevents false memory dependencies in race/msan
// instrumentation.
if islvalue(n) && !s.canSSA(n) {
- p := s.addr(n, false)
+ p := s.addr(n)
return s.load(n.Type, p)
}
v := s.expr(n.Left)
}
return s.load(types.Types[TUINT8], ptr)
case n.Left.Type.IsSlice():
- p := s.addr(n, false)
+ p := s.addr(n)
return s.load(n.Left.Type.Elem(), p)
case n.Left.Type.IsArray():
if canSSAType(n.Left.Type) {
s.boundsCheck(i, len, ssa.BoundsIndex, n.Bounded()) // checks i == 0
return s.newValue1I(ssa.OpArraySelect, n.Type, 0, a)
}
- p := s.addr(n, false)
+ p := s.addr(n)
return s.load(n.Left.Type.Elem(), p)
default:
s.Fatalf("bad type for index %v", n.Left.Type)
var slice, addr *ssa.Value
if inplace {
- addr = s.addr(sn, false)
+ addr = s.addr(sn)
slice = s.load(n.Type, addr)
} else {
slice = s.expr(sn)
if canSSAType(n.Type) {
args = append(args, argRec{v: s.expr(n), store: true})
} else {
- v := s.addr(n, false)
+ v := s.addr(n)
args = append(args, argRec{v: v})
}
}
}
// Left is not ssa-able. Compute its address.
- addr := s.addr(left, false)
+ addr := s.addr(left)
if isReflectHeaderDataField(left) {
// Package unsafe's documentation says storing pointers into
// reflect.SliceHeader and reflect.StringHeader's Data fields
argTemp.Name.SetNeedzero(true)
}
if !canSSA {
- a := s.addr(n, false)
+ a := s.addr(n)
s.move(t, addrArgTemp, a)
return addrArgTemp
}
d := tempAt(n.Pos, s.curfn, t)
s.vars[&memVar] = s.newValue1A(ssa.OpVarDef, types.TypeMem, d, s.mem())
- addr := s.addr(d, false)
+ addr := s.addr(d)
// Must match reflect.go:deferstruct and src/runtime/runtime2.go:_defer.
// 0: siz
// addr converts the address of the expression n to SSA, adds it to s and returns the SSA result.
// The value that the returned Value represents is guaranteed to be non-nil.
-// If bounded is true then this address does not require a nil check for its operand
-// even if that would otherwise be implied.
-func (s *state) addr(n *Node, bounded bool) *ssa.Value {
+func (s *state) addr(n *Node) *ssa.Value {
if n.Op != ONAME {
s.pushLine(n.Pos)
defer s.popLine()
p := s.newValue1(ssa.OpSlicePtr, t, a)
return s.newValue2(ssa.OpPtrIndex, t, p, i)
} else { // array
- a := s.addr(n.Left, bounded)
+ a := s.addr(n.Left)
i := s.expr(n.Right)
len := s.constInt(types.Types[TINT], n.Left.Type.NumElem())
i = s.boundsCheck(i, len, ssa.BoundsIndex, n.Bounded())
return s.newValue2(ssa.OpPtrIndex, types.NewPtr(n.Left.Type.Elem()), a, i)
}
case ODEREF:
- return s.exprPtr(n.Left, bounded, n.Pos)
+ return s.exprPtr(n.Left, false, n.Pos)
case ODOT:
- p := s.addr(n.Left, bounded)
+ p := s.addr(n.Left)
return s.newValue1I(ssa.OpOffPtr, t, n.Xoffset, p)
case ODOTPTR:
- p := s.exprPtr(n.Left, bounded, n.Pos)
+ p := s.exprPtr(n.Left, false, n.Pos)
return s.newValue1I(ssa.OpOffPtr, t, n.Xoffset, p)
case OCLOSUREVAR:
return s.newValue1I(ssa.OpOffPtr, t, n.Xoffset,
s.entryNewValue0(ssa.OpGetClosurePtr, s.f.Config.Types.BytePtr))
case OCONVNOP:
- addr := s.addr(n.Left, bounded)
+ addr := s.addr(n.Left)
return s.newValue1(ssa.OpCopy, t, addr) // ensure that addr has the right type
case OCALLFUNC, OCALLINTER, OCALLMETH:
return s.call(n, callNormal)
}
if !canSSAType(t) {
- a := s.addr(n, false)
+ a := s.addr(n)
s.move(t, addr, a)
return
}
// TODO: get rid of some of these temporaries.
tmp = tempAt(n.Pos, s.curfn, n.Type)
s.vars[&memVar] = s.newValue1A(ssa.OpVarDef, types.TypeMem, tmp, s.mem())
- addr = s.addr(tmp, false)
+ addr = s.addr(tmp)
}
cond := s.newValue2(ssa.OpEqPtr, types.Types[TBOOL], itab, targetITab)