diff options
Diffstat (limited to 'src/pkg/runtime/race.go')
| -rw-r--r-- | src/pkg/runtime/race.go | 69 |
1 files changed, 67 insertions, 2 deletions
diff --git a/src/pkg/runtime/race.go b/src/pkg/runtime/race.go index df8493e35c..c7573517dc 100644 --- a/src/pkg/runtime/race.go +++ b/src/pkg/runtime/race.go @@ -38,7 +38,7 @@ func raceReadObjectPC(t *_type, addr unsafe.Pointer, callerpc, pc uintptr) { if kind == kindArray || kind == kindStruct { // for composite objects we have to read every address // because a write might happen to any subobject. - racereadrangepc(addr, int(t.size), callerpc, pc) + racereadrangepc(addr, t.size, callerpc, pc) } else { // for non-composite objects we can read just the start // address, as any write must write the first byte. @@ -51,10 +51,75 @@ func raceWriteObjectPC(t *_type, addr unsafe.Pointer, callerpc, pc uintptr) { if kind == kindArray || kind == kindStruct { // for composite objects we have to write every address // because a write might happen to any subobject. - racewriterangepc(addr, int(t.size), callerpc, pc) + racewriterangepc(addr, t.size, callerpc, pc) } else { // for non-composite objects we can write just the start // address, as any write must write the first byte. racewritepc(addr, callerpc, pc) } } + +//go:noescape +func racereadpc(addr unsafe.Pointer, callpc, pc uintptr) + +//go:noescape +func racewritepc(addr unsafe.Pointer, callpc, pc uintptr) + +//go:noescape +func racereadrangepc(addr unsafe.Pointer, len uintptr, callpc, pc uintptr) + +//go:noescape +func racewriterangepc(addr unsafe.Pointer, len uintptr, callpc, pc uintptr) + +//go:noescape +func raceacquire(addr unsafe.Pointer) + +//go:noescape +func racerelease(addr unsafe.Pointer) + +//go:noescape +func raceacquireg(gp *g, addr unsafe.Pointer) + +//go:noescape +func racereleaseg(gp *g, addr unsafe.Pointer) + +func racefingo() + +//go:noescape +func racemalloc(p unsafe.Pointer, size uintptr) + +//go:noescape +func racereleasemerge(addr unsafe.Pointer) + +type symbolizeContext struct { + pc uintptr + fn *byte + file *byte + line uintptr + off uintptr + res uintptr +} + +var qq = [...]byte{'?', '?', 0} +var dash = [...]byte{'-', 0} + +// Callback from C into Go, runs on g0. +func racesymbolize(ctx *symbolizeContext) { + f := findfunc(ctx.pc) + if f == nil { + ctx.fn = &qq[0] + ctx.file = &dash[0] + ctx.line = 0 + ctx.off = ctx.pc + ctx.res = 1 + return + } + + ctx.fn = funcname(f) + var file string + ctx.line = uintptr(funcline(f, ctx.pc, &file)) + ctx.file = &bytes(file)[0] // assume NUL-terminated + ctx.off = ctx.pc - f.entry + ctx.res = 1 + return +} |
