mirror of
https://github.com/golang/go
synced 2024-10-04 17:11:21 -06:00
[dev.ssa] cmd/compile: ensure OffPtr has pointer type
SSA treats SP as constant throughout a function, so as OffPtr [off] SP. When the stack moves, spilled OffPtr values become invalid, if they are not pointer-typed. (Currently it is fine because of the optimization rules that folds OffPtr into Load/Store. But it'd better be "optimization", not requirement.) Updates #15365. Change-Id: I76cf4008dfdc169e1cb5a55a2605b6678efc915d Reviewed-on: https://go-review.googlesource.com/23941 Run-TryBot: Cherry Zhang <cherryyz@google.com> TryBot-Result: Gobot Gobot <gobot@golang.org> Reviewed-by: David Chase <drchase@google.com>
This commit is contained in:
parent
fa54bf16e0
commit
e3a6d00876
@ -2580,7 +2580,7 @@ func (s *state) call(n *Node, k callKind) *ssa.Value {
|
|||||||
i := s.expr(fn.Left)
|
i := s.expr(fn.Left)
|
||||||
itab := s.newValue1(ssa.OpITab, Types[TUINTPTR], i)
|
itab := s.newValue1(ssa.OpITab, Types[TUINTPTR], i)
|
||||||
itabidx := fn.Xoffset + 3*int64(Widthptr) + 8 // offset of fun field in runtime.itab
|
itabidx := fn.Xoffset + 3*int64(Widthptr) + 8 // offset of fun field in runtime.itab
|
||||||
itab = s.newValue1I(ssa.OpOffPtr, Types[TUINTPTR], itabidx, itab)
|
itab = s.newValue1I(ssa.OpOffPtr, Ptrto(Types[TUINTPTR]), itabidx, itab)
|
||||||
if k == callNormal {
|
if k == callNormal {
|
||||||
codeptr = s.newValue2(ssa.OpLoad, Types[TUINTPTR], itab, s.mem())
|
codeptr = s.newValue2(ssa.OpLoad, Types[TUINTPTR], itab, s.mem())
|
||||||
} else {
|
} else {
|
||||||
@ -2603,7 +2603,7 @@ func (s *state) call(n *Node, k callKind) *ssa.Value {
|
|||||||
if k != callNormal {
|
if k != callNormal {
|
||||||
argStart += int64(2 * Widthptr)
|
argStart += int64(2 * Widthptr)
|
||||||
}
|
}
|
||||||
addr := s.entryNewValue1I(ssa.OpOffPtr, Types[TUINTPTR], argStart, s.sp)
|
addr := s.entryNewValue1I(ssa.OpOffPtr, Ptrto(Types[TUINTPTR]), argStart, s.sp)
|
||||||
s.vars[&memVar] = s.newValue3I(ssa.OpStore, ssa.TypeMem, int64(Widthptr), addr, rcvr, s.mem())
|
s.vars[&memVar] = s.newValue3I(ssa.OpStore, ssa.TypeMem, int64(Widthptr), addr, rcvr, s.mem())
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -2612,7 +2612,7 @@ func (s *state) call(n *Node, k callKind) *ssa.Value {
|
|||||||
// Write argsize and closure (args to Newproc/Deferproc).
|
// Write argsize and closure (args to Newproc/Deferproc).
|
||||||
argStart := Ctxt.FixedFrameSize()
|
argStart := Ctxt.FixedFrameSize()
|
||||||
argsize := s.constInt32(Types[TUINT32], int32(stksize))
|
argsize := s.constInt32(Types[TUINT32], int32(stksize))
|
||||||
addr := s.entryNewValue1I(ssa.OpOffPtr, Types[TUINTPTR], argStart, s.sp)
|
addr := s.entryNewValue1I(ssa.OpOffPtr, Ptrto(Types[TUINT32]), argStart, s.sp)
|
||||||
s.vars[&memVar] = s.newValue3I(ssa.OpStore, ssa.TypeMem, 4, addr, argsize, s.mem())
|
s.vars[&memVar] = s.newValue3I(ssa.OpStore, ssa.TypeMem, 4, addr, argsize, s.mem())
|
||||||
addr = s.entryNewValue1I(ssa.OpOffPtr, Ptrto(Types[TUINTPTR]), argStart+int64(Widthptr), s.sp)
|
addr = s.entryNewValue1I(ssa.OpOffPtr, Ptrto(Types[TUINTPTR]), argStart+int64(Widthptr), s.sp)
|
||||||
s.vars[&memVar] = s.newValue3I(ssa.OpStore, ssa.TypeMem, int64(Widthptr), addr, closure, s.mem())
|
s.vars[&memVar] = s.newValue3I(ssa.OpStore, ssa.TypeMem, int64(Widthptr), addr, closure, s.mem())
|
||||||
@ -2968,7 +2968,7 @@ func (s *state) rtcall(fn *Node, returns bool, results []*Type, args ...*ssa.Val
|
|||||||
off = Rnd(off, t.Alignment())
|
off = Rnd(off, t.Alignment())
|
||||||
ptr := s.sp
|
ptr := s.sp
|
||||||
if off != 0 {
|
if off != 0 {
|
||||||
ptr = s.newValue1I(ssa.OpOffPtr, Types[TUINTPTR], off, s.sp)
|
ptr = s.newValue1I(ssa.OpOffPtr, t.PtrTo(), off, s.sp)
|
||||||
}
|
}
|
||||||
size := t.Size()
|
size := t.Size()
|
||||||
s.vars[&memVar] = s.newValue3I(ssa.OpStore, ssa.TypeMem, size, ptr, arg, s.mem())
|
s.vars[&memVar] = s.newValue3I(ssa.OpStore, ssa.TypeMem, size, ptr, arg, s.mem())
|
||||||
@ -3008,7 +3008,7 @@ func (s *state) rtcall(fn *Node, returns bool, results []*Type, args ...*ssa.Val
|
|||||||
off = Rnd(off, t.Alignment())
|
off = Rnd(off, t.Alignment())
|
||||||
ptr := s.sp
|
ptr := s.sp
|
||||||
if off != 0 {
|
if off != 0 {
|
||||||
ptr = s.newValue1I(ssa.OpOffPtr, Types[TUINTPTR], off, s.sp)
|
ptr = s.newValue1I(ssa.OpOffPtr, Ptrto(t), off, s.sp)
|
||||||
}
|
}
|
||||||
res[i] = s.newValue2(ssa.OpLoad, t, ptr, s.mem())
|
res[i] = s.newValue2(ssa.OpLoad, t, ptr, s.mem())
|
||||||
off += t.Size()
|
off += t.Size()
|
||||||
|
Loading…
Reference in New Issue
Block a user