From: Keith Randall Date: Wed, 9 Sep 2015 04:37:37 +0000 (-0700) Subject: [dev.ssa] cmd/compile/internal/ssa: eval defer args before setting argsize and func X-Git-Tag: go1.7beta1~1623^2^2~183 X-Git-Url: http://www.git.cypherpunks.su/?a=commitdiff_plain;h=fd8c71be865386b5545571c9ff3b5c604809e133;p=gostls13.git [dev.ssa] cmd/compile/internal/ssa: eval defer args before setting argsize and func 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 --- diff --git a/src/cmd/compile/internal/gc/ssa.go b/src/cmd/compile/internal/gc/ssa.go index 9791967677..e3a71a9f3f 100644 --- a/src/cmd/compile/internal/gc/ssa.go +++ b/src/cmd/compile/internal/gc/ssa.go @@ -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 diff --git a/test/run.go b/test/run.go index f2618e027b..1f9b905ea3 100644 --- a/test/run.go +++ b/test/run.go @@ -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 }