]> Cypherpunks repositories - gostls13.git/commitdiff
cmd/gc: fix racewalk after writebarrier change
authorDmitriy Vyukov <dvyukov@google.com>
Fri, 12 Sep 2014 22:05:41 +0000 (15:05 -0700)
committerDmitriy Vyukov <dvyukov@google.com>
Fri, 12 Sep 2014 22:05:41 +0000 (15:05 -0700)
Instrument dst argument of writebarrier calls.

LGTM=rsc
R=rsc
CC=golang-codereviews
https://golang.org/cl/139560045

src/cmd/gc/racewalk.c

index 27581702ccb9d20d4101bacde34e3dcc443c53a8..cb98ca2471efaeaa57ef03b68f8632627be4de4d 100644 (file)
@@ -208,6 +208,31 @@ racewalknode(Node **np, NodeList **init, int wr, int skip)
                goto ret;
 
        case OCALLFUNC:
+               // Instrument dst argument of runtime.writebarrier* calls
+               // as we do not instrument runtime code.
+               if(n->left->sym != S && n->left->sym->pkg == runtimepkg &&
+                       (strcmp(n->left->sym->name, "writebarrierptr") == 0 ||
+                       strcmp(n->left->sym->name, "writebarrierstring") == 0 ||
+                       strcmp(n->left->sym->name, "writebarrierslice") == 0 ||
+                       strcmp(n->left->sym->name, "writebarrieriface") == 0 ||
+                       strcmp(n->left->sym->name, "writebarrierfat") == 0)) {
+                       // Find the dst argument.
+                       // The list can be reordered, so it's not necessary just the first or the second element.
+                       for(l = n->list; l; l = l->next) {
+                               if(strcmp(n->left->sym->name, "writebarrierfat") == 0) {
+                                       if(l->n->left->xoffset == widthptr)
+                                               break;
+                               } else {
+                                       if(l->n->left->xoffset == 0)
+                                               break;
+                               }
+                       }
+                       if(l == nil)
+                               fatal("racewalk: writebarrier no arg");
+                       if(l->n->right->op != OADDR)
+                               fatal("racewalk: writebarrier bad arg");
+                       callinstr(&l->n->right->left, init, 1, 0);
+               }
                racewalknode(&n->left, init, 0, 0);
                goto ret;