mirror of
https://github.com/golang/go
synced 2024-10-05 20:41:22 -06:00
[dev.ssa] cmd/compile/internal/ssa: minor fixes
* Improve some docs and logging. * Set correct type and len for indexing into strings. Fixes #11029. Change-Id: Ib22c45908e41ba3752010d2f5759e37e3921a48e Reviewed-on: https://go-review.googlesource.com/10635 Reviewed-by: Keith Randall <khr@golang.org>
This commit is contained in:
parent
8d32360bdd
commit
e00d60901a
@ -327,11 +327,20 @@ func (s *state) expr(n *Node) *ssa.Value {
|
||||
return s.curBlock.NewValue2(ssa.OpLoad, n.Type, nil, p, s.mem())
|
||||
|
||||
case OINDEX:
|
||||
if n.Left.Type.Bound >= 0 { // array
|
||||
if n.Left.Type.Bound >= 0 { // array or string
|
||||
a := s.expr(n.Left)
|
||||
i := s.expr(n.Right)
|
||||
s.boundsCheck(i, s.f.ConstInt(s.config.Uintptr, n.Left.Type.Bound))
|
||||
return s.curBlock.NewValue2(ssa.OpArrayIndex, n.Left.Type.Type, nil, a, i)
|
||||
var elemtype *Type
|
||||
var len *ssa.Value
|
||||
if n.Left.Type.IsString() {
|
||||
len = s.curBlock.NewValue1(ssa.OpStringLen, s.config.Uintptr, nil, a)
|
||||
elemtype = Types[TUINT8]
|
||||
} else {
|
||||
len = s.f.ConstInt(s.config.Uintptr, n.Left.Type.Bound)
|
||||
elemtype = n.Left.Type.Type
|
||||
}
|
||||
s.boundsCheck(i, len)
|
||||
return s.curBlock.NewValue2(ssa.OpArrayIndex, elemtype, nil, a, i)
|
||||
} else { // slice
|
||||
p := s.addr(n)
|
||||
return s.curBlock.NewValue2(ssa.OpLoad, n.Left.Type.Type, nil, p, s.mem())
|
||||
@ -367,7 +376,7 @@ func (s *state) expr(n *Node) *ssa.Value {
|
||||
}
|
||||
}
|
||||
|
||||
// expr converts the address of the expression n to SSA, adds it to s and returns the SSA result.
|
||||
// addr converts the address of the expression n to SSA, adds it to s and returns the SSA result.
|
||||
func (s *state) addr(n *Node) *ssa.Value {
|
||||
switch n.Op {
|
||||
case ONAME:
|
||||
@ -402,7 +411,7 @@ func (s *state) addr(n *Node) *ssa.Value {
|
||||
return s.curBlock.NewValue2(ssa.OpPtrIndex, Ptrto(n.Left.Type.Type), nil, p, i)
|
||||
}
|
||||
default:
|
||||
log.Fatalf("addr: bad op %v", n.Op)
|
||||
log.Fatalf("addr: bad op %v", Oconv(int(n.Op), 0))
|
||||
return nil
|
||||
}
|
||||
}
|
||||
|
@ -82,7 +82,7 @@ func deadcode(f *Func) {
|
||||
i++
|
||||
} else {
|
||||
if len(b.Values) > 0 {
|
||||
panic("live value in unreachable block")
|
||||
log.Panicf("live values in unreachable block %v: %v", b, b.Values)
|
||||
}
|
||||
f.bid.put(b.ID)
|
||||
}
|
||||
|
@ -12,10 +12,10 @@ func applyRewrite(f *Func, rb func(*Block) bool, rv func(*Value, *Config) bool)
|
||||
var curv *Value
|
||||
defer func() {
|
||||
if curb != nil {
|
||||
log.Printf("panic during rewrite of %s\n", curb.LongString())
|
||||
log.Printf("panic during rewrite of block %s\n", curb.LongString())
|
||||
}
|
||||
if curv != nil {
|
||||
log.Printf("panic during rewrite of %s\n", curv.LongString())
|
||||
log.Printf("panic during rewrite of value %s\n", curv.LongString())
|
||||
panic("rewrite failed")
|
||||
// TODO(khr): print source location also
|
||||
}
|
||||
|
Loading…
Reference in New Issue
Block a user