diff options
author | Ian Lance Taylor <iant@golang.org> | 2015-10-21 11:04:42 -0700 |
---|---|---|
committer | Ian Lance Taylor <iant@golang.org> | 2015-10-21 19:17:46 +0000 |
commit | 73f329f47236c6952235db395802810156a7bd65 (patch) | |
tree | 4f26e4e00e448a5d005535cca4b660f8b0922ffb /src/runtime/select.go | |
parent | c27925094640f0d151da92663d19d511d8dfdc31 (diff) | |
download | go-73f329f47236c6952235db395802810156a7bd65.tar.gz go-73f329f47236c6952235db395802810156a7bd65.zip |
runtime, syscall: add calls to msan functions
Add explicit memory sanitizer instrumentation to the runtime and syscall
packages. The compiler does not instrument the runtime package. It
does instrument the syscall package, but we need to add a couple of
cases that it can't see.
Change-Id: I2d66073f713fe67e33a6720460d2bb8f72f31394
Reviewed-on: https://go-review.googlesource.com/16164
Reviewed-by: David Crawshaw <crawshaw@golang.org>
Diffstat (limited to 'src/runtime/select.go')
-rw-r--r-- | src/runtime/select.go | 19 |
1 files changed, 19 insertions, 0 deletions
diff --git a/src/runtime/select.go b/src/runtime/select.go index b18b44ce61..8b6c3ed4c0 100644 --- a/src/runtime/select.go +++ b/src/runtime/select.go @@ -459,6 +459,13 @@ loop: raceReadObjectPC(c.elemtype, cas.elem, cas.pc, chansendpc) } } + if msanenabled { + if cas.kind == caseRecv && cas.elem != nil { + msanwrite(cas.elem, c.elemtype.size) + } else if cas.kind == caseSend { + msanread(cas.elem, c.elemtype.size) + } + } selunlock(sel) goto retc @@ -472,6 +479,9 @@ asyncrecv: raceacquire(chanbuf(c, c.recvx)) racerelease(chanbuf(c, c.recvx)) } + if msanenabled && cas.elem != nil { + msanwrite(cas.elem, c.elemtype.size) + } if cas.receivedp != nil { *cas.receivedp = true } @@ -504,6 +514,9 @@ asyncsend: racerelease(chanbuf(c, c.sendx)) raceReadObjectPC(c.elemtype, cas.elem, cas.pc, chansendpc) } + if msanenabled { + msanread(cas.elem, c.elemtype.size) + } typedmemmove(c.elemtype, chanbuf(c, c.sendx), cas.elem) c.sendx++ if c.sendx == c.dataqsiz { @@ -531,6 +544,9 @@ syncrecv: } racesync(c, sg) } + if msanenabled && cas.elem != nil { + msanwrite(cas.elem, c.elemtype.size) + } selunlock(sel) if debugSelect { print("syncrecv: sel=", sel, " c=", c, "\n") @@ -570,6 +586,9 @@ syncsend: raceReadObjectPC(c.elemtype, cas.elem, cas.pc, chansendpc) racesync(c, sg) } + if msanenabled { + msanread(cas.elem, c.elemtype.size) + } selunlock(sel) if debugSelect { print("syncsend: sel=", sel, " c=", c, "\n") |