]> Cypherpunks repositories - gostls13.git/commitdiff
cmd/gc: fix race detector on tail-call wrappers
authorRuss Cox <rsc@golang.org>
Tue, 18 Jun 2013 18:43:37 +0000 (14:43 -0400)
committerRuss Cox <rsc@golang.org>
Tue, 18 Jun 2013 18:43:37 +0000 (14:43 -0400)
(By not using the tail-call wrappers when the race
detector is enabled.)

R=golang-dev, minux.ma, dvyukov, daniel.morsing
CC=golang-dev
https://golang.org/cl/10227043

src/cmd/gc/go.h
src/cmd/gc/racewalk.c
src/cmd/gc/subr.c

index fa062d652341993d2e899a271b43ebeffae55f48..518b992d78b5227aca98d35a7b07abafedc64628 100644 (file)
@@ -268,7 +268,6 @@ struct      Node
        uchar   dupok;  // duplicate definitions ok (for func)
        schar   likely; // likeliness of if statement
        uchar   hasbreak;       // has break statement
-       uchar   norace; // disable race detector for this function
        uint    esc;            // EscXXX
        int     funcdepth;
 
index 0c847d8bb8368dc8a607854018124ae39c938e51..7d5196bf5cd70a314295816a97b2140809c4756e 100644 (file)
@@ -58,7 +58,7 @@ racewalk(Node *fn)
        Node *nodpc;
        char s[1024];
 
-       if(fn->norace || ispkgin(omit_pkgs, nelem(omit_pkgs)))
+       if(ispkgin(omit_pkgs, nelem(omit_pkgs)))
                return;
 
        if(!ispkgin(noinst_pkgs, nelem(noinst_pkgs))) {
index c3e00a2e957713199c00cd95601c7d4fdbdc6c59..e49709dc6dbfabb6416ee78614020dcbccf15a90 100644 (file)
@@ -2573,11 +2573,9 @@ genwrapper(Type *rcvr, Type *method, Sym *newnam, int iface)
        dot = adddot(nod(OXDOT, this->left, newname(method->sym)));
        
        // generate call
-       if(isptr[rcvr->etype] && isptr[methodrcvr->etype] && method->embedded && !isifacemethod(method->type)) {
+       if(!flag_race && isptr[rcvr->etype] && isptr[methodrcvr->etype] && method->embedded && !isifacemethod(method->type)) {
                // generate tail call: adjust pointer receiver and jump to embedded method.
-               fn->norace = 1; // something about this body makes the race detector unhappy.
-               // skip final .M
-               dot = dot->left;
+               dot = dot->left;        // skip final .M
                if(!isptr[dotlist[0].field->type->etype])
                        dot = nod(OADDR, dot, N);
                as = nod(OAS, this->left, nod(OCONVNOP, dot, N));