]> Cypherpunks repositories - gostls13.git/commitdiff
[dev.ssa] cmd/compile/internal/ssa: eval defer args before setting argsize and func
authorKeith Randall <khr@golang.org>
Wed, 9 Sep 2015 04:37:37 +0000 (21:37 -0700)
committerKeith Randall <khr@golang.org>
Wed, 9 Sep 2015 18:16:53 +0000 (18:16 +0000)
Evaluating args can overwrite arg area, so we can't write argsize and func
until args are evaluated.

Fixes test/recover.go, test/recover1.go, and test/fixedbugs/issue4066.go

Change-Id: I862e4934ccdb8661431bcc3e1e93817ea834ea3f
Reviewed-on: https://go-review.googlesource.com/14405
Reviewed-by: David Chase <drchase@google.com>
src/cmd/compile/internal/gc/ssa.go
test/run.go

index 97919676776c007af13b53def174fcea734d501b..e3a71a9f3f8205d584dbc65e5ac27a44f07b0d0f 100644 (file)
@@ -741,6 +741,10 @@ func (s *state) stmt(n *Node) {
                        s.Unimplementedf("defer/go of %s", opnames[call.Op])
                }
 
+               // Run all argument assignments.  The arg slots have already
+               // been offset by 2*widthptr.
+               s.stmtList(call.List)
+
                // Write argsize and closure (args to Newproc/Deferproc)
                argsize := s.constInt32(Types[TUINT32], int32(fn.Type.Argwid))
                s.vars[&memvar] = s.newValue3I(ssa.OpStore, ssa.TypeMem, 4, s.sp, argsize, s.mem())
@@ -748,10 +752,6 @@ func (s *state) stmt(n *Node) {
                addr := s.entryNewValue1I(ssa.OpOffPtr, Ptrto(Types[TUINTPTR]), int64(Widthptr), s.sp)
                s.vars[&memvar] = s.newValue3I(ssa.OpStore, ssa.TypeMem, int64(Widthptr), addr, closure, s.mem())
 
-               // Run all argument assignments.  The arg slots have already
-               // been offset by 2*widthptr.
-               s.stmtList(call.List)
-
                // Call deferproc or newproc
                bNext := s.f.NewBlock(ssa.BlockPlain)
                var op ssa.Op
index f2618e027b0f0d16822945df89a3e09e0a3f272c..1f9b905ea33fe33ad85ea9fcdca80bb6a2ea68bc 100644 (file)
@@ -638,8 +638,8 @@ func (t *test) run() {
        case "run":
                useTmp = false
                switch t.gofile {
-               case "bug434.go", "recover.go", "recover1.go", "issue4066.go":
-                       // TODO fix these failures
+               case "bug434.go":
+                       // TODO fix this failure
                default:
                        ssaMain = true
                }