1
0
mirror of https://github.com/golang/go synced 2024-10-05 18:31:28 -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:
Josh Bleecher Snyder 2015-06-02 09:16:22 -07:00
parent 8d32360bdd
commit e00d60901a
3 changed files with 17 additions and 8 deletions

View File

@ -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
}
}

View File

@ -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)
}

View File

@ -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
}