From c3c84a254483523e686d4b9a3bc30521a9937238 Mon Sep 17 00:00:00 2001 From: Keith Randall Date: Mon, 13 Jul 2015 15:55:37 -0700 Subject: [PATCH] [dev.ssa] cmd/compile/internal/gc: Implement ODOT and ODOTPTR in addr. Change-Id: If8a9d5901fa2141d16b1c8d001761ea62bc23207 Reviewed-on: https://go-review.googlesource.com/12141 Reviewed-by: Brad Fitzpatrick --- src/cmd/compile/internal/gc/ssa.go | 8 ++++++++ 1 file changed, 8 insertions(+) diff --git a/src/cmd/compile/internal/gc/ssa.go b/src/cmd/compile/internal/gc/ssa.go index c75dd16264..589257bc23 100644 --- a/src/cmd/compile/internal/gc/ssa.go +++ b/src/cmd/compile/internal/gc/ssa.go @@ -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