From: Russ Cox Date: Wed, 28 May 2014 03:58:36 +0000 (-0400) Subject: cmd/gc: fix method value closures on nacl amd64p32 X-Git-Tag: go1.3rc1~40 X-Git-Url: http://www.git.cypherpunks.su/?a=commitdiff_plain;h=6c0bcb1863fbc84447590226911db9baab7a5c97;p=gostls13.git cmd/gc: fix method value closures on nacl amd64p32 The code was assuming that pointer alignment is the maximum alignment, but on NaCl uint64 alignment is even more strict. Brad checked in the test earlier today; this fixes the build. Fixes #7863. TBR=iant CC=golang-codereviews https://golang.org/cl/98630046 --- diff --git a/src/cmd/gc/closure.c b/src/cmd/gc/closure.c index 07cf13bc2f..ad4e5bd02b 100644 --- a/src/cmd/gc/closure.c +++ b/src/cmd/gc/closure.c @@ -374,6 +374,8 @@ makepartialcall(Node *fn, Type *t0, Node *meth) cv = nod(OCLOSUREVAR, N, N); cv->xoffset = widthptr; cv->type = rcvrtype; + if(cv->type->align > widthptr) + cv->xoffset = cv->type->align; ptr = nod(ONAME, N, N); ptr->sym = lookup("rcvr"); ptr->class = PAUTO; diff --git a/src/cmd/gc/dcl.c b/src/cmd/gc/dcl.c index dcdaabec09..73c2581beb 100644 --- a/src/cmd/gc/dcl.c +++ b/src/cmd/gc/dcl.c @@ -1438,6 +1438,8 @@ funccompile(Node *n, int isclosure) // record offset to actual frame pointer. // for closure, have to skip over leading pointers and PC slot. + // TODO(rsc): this is the old jit closure handling code. + // with the new closures, isclosure is always 0; delete this block. nodfp->xoffset = 0; if(isclosure) { NodeList *l;