From: Russ Cox Date: Mon, 29 Aug 2011 03:29:34 +0000 (-0400) Subject: gc: fix arm build X-Git-Tag: weekly.2011-09-01~50 X-Git-Url: http://www.git.cypherpunks.su/?a=commitdiff_plain;h=77f0bdce07c1abc8b9bea9102cd49de20864cab1;p=gostls13.git gc: fix arm build Escape analysis was incorrectly assuming that functions without bodies don't leak their parameters. This meant that sync/atomic's TestAddInt64 was allocating x on its stack, and then x was not properly aligned for use with the atomic 64-bit instructions. Obviously we should figure out the alignment story on 5g too, but this fix is correct and should restore the build to 'ok'. TBR=lvd CC=golang-dev https://golang.org/cl/4964047 --- diff --git a/src/cmd/gc/esc.c b/src/cmd/gc/esc.c index 3a28a8ba73..8664dc606a 100644 --- a/src/cmd/gc/esc.c +++ b/src/cmd/gc/esc.c @@ -505,7 +505,7 @@ esccall(Node *n) } } - if(fn && fn->op == ONAME && fn->class == PFUNC && fn->ntype) { + if(fn && fn->op == ONAME && fn->class == PFUNC && fn->defn && fn->defn->nbody && fn->ntype) { // Local function. Incorporate into flow graph. // Receiver. @@ -696,6 +696,10 @@ esctag(Node *func) { Node *savefn; NodeList *ll; + + // External functions must be assumed unsafe. + if(func->nbody == nil) + return; savefn = curfn; curfn = func; diff --git a/test/escape2.go b/test/escape2.go index 24a88f751e..0b78624b6c 100644 --- a/test/escape2.go +++ b/test/escape2.go @@ -774,3 +774,9 @@ func foo118(unknown func(*int)) { // ERROR "unknown does not escape" x := 1 // ERROR "moved to heap: NAME-x" unknown(&x) // ERROR "&x escapes to heap" } + +func external(*int) + +func foo119(x *int) { // ERROR "leaking param: NAME-x" + external(x) +}