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
}
}
- 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.
{
Node *savefn;
NodeList *ll;
+
+ // External functions must be assumed unsafe.
+ if(func->nbody == nil)
+ return;
savefn = curfn;
curfn = func;
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)
+}