]> Cypherpunks repositories - gostls13.git/commitdiff
[dev.ssa] cmd/compile/internal/gc: Implement ODOT and ODOTPTR in addr.
authorKeith Randall <khr@golang.org>
Mon, 13 Jul 2015 22:55:37 +0000 (15:55 -0700)
committerKeith Randall <khr@golang.org>
Mon, 13 Jul 2015 23:17:08 +0000 (23:17 +0000)
Change-Id: If8a9d5901fa2141d16b1c8d001761ea62bc23207
Reviewed-on: https://go-review.googlesource.com/12141
Reviewed-by: Brad Fitzpatrick <bradfitz@golang.org>
src/cmd/compile/internal/gc/ssa.go

index c75dd162649881e87b65da1dd5d0e203e5484f85..589257bc23856bc5f3e46359cc63c2819003c83a 100644 (file)
@@ -673,6 +673,7 @@ func (s *state) assign(op uint8, left *Node, right *Node) {
 }
 
 // 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.
 func (s *state) addr(n *Node) *ssa.Value {
        switch n.Op {
        case ONAME:
@@ -716,6 +717,13 @@ func (s *state) addr(n *Node) *ssa.Value {
                        s.boundsCheck(i, len)
                        return s.newValue2(ssa.OpPtrIndex, Ptrto(n.Left.Type.Type), a, i)
                }
+       case ODOT:
+               p := s.addr(n.Left)
+               return s.newValue2(ssa.OpAdd, p.Type, p, s.constInt(s.config.Uintptr, n.Xoffset))
+       case ODOTPTR:
+               p := s.expr(n.Left)
+               s.nilCheck(p)
+               return s.newValue2(ssa.OpAdd, p.Type, p, s.constInt(s.config.Uintptr, n.Xoffset))
        default:
                s.Unimplementedf("addr: bad op %v", Oconv(int(n.Op), 0))
                return nil