]> Cypherpunks repositories - gostls13.git/commitdiff
internal/runtime/maps: enable race for map functions in internal/runtime/maps
authorMichael Pratt <mpratt@google.com>
Tue, 17 Sep 2024 19:42:26 +0000 (15:42 -0400)
committerGopher Robot <gobot@golang.org>
Wed, 30 Oct 2024 14:59:34 +0000 (14:59 +0000)
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>
src/internal/race/norace.go
src/internal/race/race.go
src/internal/runtime/maps/runtime_swiss.go
src/runtime/race.go

index da650489fc4eb89e7c40ac42d24c3159b1229f67..3fb00573a070efc892f277bc6dad4383f570cc44 100644 (file)
@@ -7,6 +7,7 @@
 package race
 
 import (
+       "internal/abi"
        "unsafe"
 )
 
@@ -30,9 +31,21 @@ func Enable() {
 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) {
 }
 
index 58198559a9f7439318da0243190672b731ca38ac..bfcb24a2694e853042ce3690e1508102f6e1a172 100644 (file)
@@ -7,6 +7,7 @@
 package race
 
 import (
+       "internal/abi"
        "unsafe"
 )
 
@@ -32,9 +33,21 @@ func Enable()
 //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)
 
index 1cf1dd21e5e038903504b66ed8ab5274e21d0ba2..b8bc8de0c3d092f002ed188a1a3b48d1893f09a7 100644 (file)
@@ -10,7 +10,8 @@ import (
        "internal/abi"
        "internal/asan"
        "internal/msan"
-       //"internal/runtime/sys"
+       "internal/race"
+       "internal/runtime/sys"
        "unsafe"
 )
 
@@ -41,12 +42,12 @@ var zeroVal [abi.ZeroValSize]byte
 //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_)
        }
@@ -107,12 +108,12 @@ func runtime_mapassign(typ *abi.SwissMapType, m *Map, key unsafe.Pointer) unsafe
        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_)
        }
index 75ca4f86d5675d8ea4f1eb9de8930ddf70f76d7d..6b7bbe52458b80f2693e879c6ad7088f10f91e40 100644 (file)
@@ -168,6 +168,11 @@ func raceReadObjectPC(t *_type, addr unsafe.Pointer, callerpc, pc uintptr) {
        }
 }
 
+//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 {
@@ -181,12 +186,27 @@ func raceWriteObjectPC(t *_type, addr unsafe.Pointer, callerpc, pc uintptr) {
        }
 }
 
+//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