From e5ef657264ef9b7c0bcd9b5c437fea2d602a2030 Mon Sep 17 00:00:00 2001 From: Russ Cox Date: Mon, 29 Dec 2014 11:47:04 -0500 Subject: [PATCH] cmd/gc: add write barrier in copy of function parameters to heap Found with GODEBUG=wbshadow=2 mode. Eventually that will run automatically, but right now it still detects other missing write barriers. Change-Id: I1320d5340a9e421c779f24f3b170e33974e56e4f Reviewed-on: https://go-review.googlesource.com/2278 Reviewed-by: Rick Hudson --- src/cmd/gc/typecheck.c | 1 + src/cmd/gc/walk.c | 12 +++++++++--- 2 files changed, 10 insertions(+), 3 deletions(-) diff --git a/src/cmd/gc/typecheck.c b/src/cmd/gc/typecheck.c index 4512767c38..aa693aff7f 100644 --- a/src/cmd/gc/typecheck.c +++ b/src/cmd/gc/typecheck.c @@ -2786,6 +2786,7 @@ islvalue(Node *n) case OIND: case ODOTPTR: case OCLOSUREVAR: + case OPARAM: return 1; case ODOT: return islvalue(n->left); diff --git a/src/cmd/gc/walk.c b/src/cmd/gc/walk.c index df97f17670..99611efce8 100644 --- a/src/cmd/gc/walk.c +++ b/src/cmd/gc/walk.c @@ -462,6 +462,7 @@ walkexpr(Node **np, NodeList **init) case ONONAME: case OINDREG: case OEMPTY: + case OPARAM: goto ret; case ONOT: @@ -2519,7 +2520,7 @@ paramstoheap(Type **argin, int out) { Type *t; Iter savet; - Node *v; + Node *v, *as; NodeList *nn; nn = nil; @@ -2544,8 +2545,13 @@ paramstoheap(Type **argin, int out) if(v->alloc == nil) v->alloc = callnew(v->type); nn = list(nn, nod(OAS, v->heapaddr, v->alloc)); - if((v->class & ~PHEAP) != PPARAMOUT) - nn = list(nn, nod(OAS, v, v->stackparam)); + if((v->class & ~PHEAP) != PPARAMOUT) { + as = nod(OAS, v, v->stackparam); + v->stackparam->typecheck = 1; + typecheck(&as, Etop); + as = applywritebarrier(as, &nn); + nn = list(nn, as); + } } return nn; } -- 2.50.0