aboutsummaryrefslogtreecommitdiff
path: root/src
diff options
context:
space:
mode:
authorRuss Cox <rsc@golang.org>2014-12-29 11:47:04 -0500
committerRuss Cox <rsc@golang.org>2015-01-06 00:27:49 +0000
commite5ef657264ef9b7c0bcd9b5c437fea2d602a2030 (patch)
treec93ef433b71a4c38ad58fb98e10c8fd49136efa7 /src
parent54bb4dc3906578403aca1c57b482761a6824f079 (diff)
downloadgo-e5ef657264ef9b7c0bcd9b5c437fea2d602a2030.tar.xz
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 <rlh@golang.org>
Diffstat (limited to 'src')
-rw-r--r--src/cmd/gc/typecheck.c1
-rw-r--r--src/cmd/gc/walk.c12
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;
}