For #54766.
Cq-Include-Trybots: luci.golang.try:gotip-linux-amd64-longtest-swissmap
Change-Id: Iebc7f5482299cb7c4ecccc4c2eb46b4bc42c5fc3
Reviewed-on: https://go-review.googlesource.com/c/go/+/616459
Reviewed-by: Keith Randall <khr@google.com>
Auto-Submit: Michael Pratt <mpratt@google.com>
LUCI-TryBot-Result: Go LUCI <golang-scoped@luci-project-accounts.iam.gserviceaccount.com>
Reviewed-by: Keith Randall <khr@golang.org>
package race
import (
+ "internal/abi"
"unsafe"
)
func Read(addr unsafe.Pointer) {
}
+func ReadPC(addr unsafe.Pointer, callerpc, pc uintptr) {
+}
+
+func ReadObjectPC(t *abi.Type, addr unsafe.Pointer, callerpc, pc uintptr) {
+}
+
func Write(addr unsafe.Pointer) {
}
+func WritePC(addr unsafe.Pointer, callerpc, pc uintptr) {
+}
+
+func WriteObjectPC(t *abi.Type, addr unsafe.Pointer, callerpc, pc uintptr) {
+}
+
func ReadRange(addr unsafe.Pointer, len int) {
}
package race
import (
+ "internal/abi"
"unsafe"
)
//go:linkname Read
func Read(addr unsafe.Pointer)
+//go:linkname ReadPC
+func ReadPC(addr unsafe.Pointer, callerpc, pc uintptr)
+
+//go:linkname ReadObjectPC
+func ReadObjectPC(t *abi.Type, addr unsafe.Pointer, callerpc, pc uintptr)
+
//go:linkname Write
func Write(addr unsafe.Pointer)
+//go:linkname WritePC
+func WritePC(addr unsafe.Pointer, callerpc, pc uintptr)
+
+//go:linkname WriteObjectPC
+func WriteObjectPC(t *abi.Type, addr unsafe.Pointer, callerpc, pc uintptr)
+
//go:linkname ReadRange
func ReadRange(addr unsafe.Pointer, len int)
"internal/abi"
"internal/asan"
"internal/msan"
- //"internal/runtime/sys"
+ "internal/race"
+ "internal/runtime/sys"
"unsafe"
)
//go:linkname runtime_mapaccess1 runtime.mapaccess1
func runtime_mapaccess1(typ *abi.SwissMapType, m *Map, key unsafe.Pointer) unsafe.Pointer {
// TODO: concurrent checks.
- //if raceenabled && m != nil {
- // callerpc := sys.GetCallerPC()
- // pc := abi.FuncPCABIInternal(mapaccess1)
- // racereadpc(unsafe.Pointer(m), callerpc, pc)
- // raceReadObjectPC(t.Key, key, callerpc, pc)
- //}
+ if race.Enabled && m != nil {
+ callerpc := sys.GetCallerPC()
+ pc := abi.FuncPCABIInternal(runtime_mapaccess1)
+ race.ReadPC(unsafe.Pointer(m), callerpc, pc)
+ race.ReadObjectPC(typ.Key, key, callerpc, pc)
+ }
if msan.Enabled && m != nil {
msan.Read(key, typ.Key.Size_)
}
if m == nil {
panic(errNilAssign)
}
- //if raceenabled {
- // callerpc := sys.GetCallerPC()
- // pc := abi.FuncPCABIInternal(mapassign)
- // racewritepc(unsafe.Pointer(m), callerpc, pc)
- // raceReadObjectPC(t.Key, key, callerpc, pc)
- //}
+ if race.Enabled {
+ callerpc := sys.GetCallerPC()
+ pc := abi.FuncPCABIInternal(runtime_mapassign)
+ race.WritePC(unsafe.Pointer(m), callerpc, pc)
+ race.ReadObjectPC(typ.Key, key, callerpc, pc)
+ }
if msan.Enabled {
msan.Read(key, typ.Key.Size_)
}
}
}
+//go:linkname race_ReadObjectPC internal/race.ReadObjectPC
+func race_ReadObjectPC(t *abi.Type, addr unsafe.Pointer, callerpc, pc uintptr) {
+ raceReadObjectPC(t, addr, callerpc, pc)
+}
+
func raceWriteObjectPC(t *_type, addr unsafe.Pointer, callerpc, pc uintptr) {
kind := t.Kind_ & abi.KindMask
if kind == abi.Array || kind == abi.Struct {
}
}
+//go:linkname race_WriteObjectPC internal/race.WriteObjectPC
+func race_WriteObjectPC(t *abi.Type, addr unsafe.Pointer, callerpc, pc uintptr) {
+ raceWriteObjectPC(t, addr, callerpc, pc)
+}
+
//go:noescape
func racereadpc(addr unsafe.Pointer, callpc, pc uintptr)
//go:noescape
func racewritepc(addr unsafe.Pointer, callpc, pc uintptr)
+//go:linkname race_ReadPC internal/race.ReadPC
+func race_ReadPC(addr unsafe.Pointer, callerpc, pc uintptr) {
+ racereadpc(addr, callerpc, pc)
+}
+
+//go:linkname race_WritePC internal/race.WritePC
+func race_WritePC(addr unsafe.Pointer, callerpc, pc uintptr) {
+ racewritepc(addr, callerpc, pc)
+}
+
type symbolizeCodeContext struct {
pc uintptr
fn *byte