Commit 5ba31940 authored by Keith Randall's avatar Keith Randall

[dev.ssa] cmd/compile: fix write barriers for SSA

The old write barriers used _nostore versions, which
don't work for Ian's cgo checker.  Instead, we adopt the
same write barrier pattern as the default compiler.

It's a bit trickier to code up but should be more efficient.

Change-Id: I6696c3656cf179e28f800b0e096b7259bd5f3bb7
Reviewed-on: https://go-review.googlesource.com/18941
Run-TryBot: Keith Randall <khr@golang.org>
TryBot-Result: Gobot Gobot <gobot@golang.org>
Reviewed-by: default avatarDavid Chase <drchase@google.com>
parent d8a65672
...@@ -134,7 +134,6 @@ var ptrTests = []ptrTest{ ...@@ -134,7 +134,6 @@ var ptrTests = []ptrTest{
body: `parg := [1]**C.char{&hello[0]}; C.f(&parg[0])`, body: `parg := [1]**C.char{&hello[0]}; C.f(&parg[0])`,
fail: true, fail: true,
}, },
/*
{ {
// Storing a Go pointer into C memory should fail. // Storing a Go pointer into C memory should fail.
name: "barrier", name: "barrier",
...@@ -238,7 +237,6 @@ var ptrTests = []ptrTest{ ...@@ -238,7 +237,6 @@ var ptrTests = []ptrTest{
func GoFn() *byte { return (*byte)(C.malloc(1)) }`, func GoFn() *byte { return (*byte)(C.malloc(1)) }`,
body: `C.GoFn()`, body: `C.GoFn()`,
}, },
*/
} }
func main() { func main() {
......
...@@ -117,7 +117,6 @@ const runtimeimport = "" + ...@@ -117,7 +117,6 @@ const runtimeimport = "" +
"func @\"\".writebarrierfat1110 (@\"\".dst·1 *any, _ uintptr, @\"\".src·3 any)\n" + "func @\"\".writebarrierfat1110 (@\"\".dst·1 *any, _ uintptr, @\"\".src·3 any)\n" +
"func @\"\".writebarrierfat1111 (@\"\".dst·1 *any, _ uintptr, @\"\".src·3 any)\n" + "func @\"\".writebarrierfat1111 (@\"\".dst·1 *any, _ uintptr, @\"\".src·3 any)\n" +
"func @\"\".typedmemmove (@\"\".typ·1 *byte, @\"\".dst·2 *any, @\"\".src·3 *any)\n" + "func @\"\".typedmemmove (@\"\".typ·1 *byte, @\"\".dst·2 *any, @\"\".src·3 *any)\n" +
"func @\"\".typedmemmove_nostore (@\"\".typ·1 *byte, @\"\".dst·2 *any)\n" +
"func @\"\".typedslicecopy (@\"\".typ·2 *byte, @\"\".dst·3 any, @\"\".src·4 any) (? int)\n" + "func @\"\".typedslicecopy (@\"\".typ·2 *byte, @\"\".dst·3 any, @\"\".src·4 any) (? int)\n" +
"func @\"\".selectnbsend (@\"\".chanType·2 *byte, @\"\".hchan·3 chan<- any, @\"\".elem·4 *any) (? bool)\n" + "func @\"\".selectnbsend (@\"\".chanType·2 *byte, @\"\".hchan·3 chan<- any, @\"\".elem·4 *any) (? bool)\n" +
"func @\"\".selectnbrecv (@\"\".chanType·2 *byte, @\"\".elem·3 *any, @\"\".hchan·4 <-chan any) (? bool)\n" + "func @\"\".selectnbrecv (@\"\".chanType·2 *byte, @\"\".elem·3 *any, @\"\".hchan·4 <-chan any) (? bool)\n" +
......
...@@ -151,7 +151,6 @@ func writebarrierfat1111(dst *any, _ uintptr, src any) ...@@ -151,7 +151,6 @@ func writebarrierfat1111(dst *any, _ uintptr, src any)
// *byte is really *runtime.Type // *byte is really *runtime.Type
func typedmemmove(typ *byte, dst *any, src *any) func typedmemmove(typ *byte, dst *any, src *any)
func typedmemmove_nostore(typ *byte, dst *any)
func typedslicecopy(typ *byte, dst any, src any) int func typedslicecopy(typ *byte, dst any, src any) int
func selectnbsend(chanType *byte, hchan chan<- any, elem *any) bool func selectnbsend(chanType *byte, hchan chan<- any, elem *any) bool
......
...@@ -868,6 +868,7 @@ var throwreturn *Node ...@@ -868,6 +868,7 @@ var throwreturn *Node
var growslice *Node var growslice *Node
var typedmemmove_nostore *Node var writebarrierptr *Node
var typedmemmove *Node
var panicdottype *Node var panicdottype *Node
...@@ -353,7 +353,8 @@ func compile(fn *Node) { ...@@ -353,7 +353,8 @@ func compile(fn *Node) {
panicdivide = Sysfunc("panicdivide") panicdivide = Sysfunc("panicdivide")
throwreturn = Sysfunc("throwreturn") throwreturn = Sysfunc("throwreturn")
growslice = Sysfunc("growslice") growslice = Sysfunc("growslice")
typedmemmove_nostore = Sysfunc("typedmemmove_nostore") writebarrierptr = Sysfunc("writebarrierptr")
typedmemmove = Sysfunc("typedmemmove")
panicdottype = Sysfunc("panicdottype") panicdottype = Sysfunc("panicdottype")
} }
......
This diff is collapsed.
...@@ -197,14 +197,6 @@ func typedmemmove(typ *_type, dst, src unsafe.Pointer) { ...@@ -197,14 +197,6 @@ func typedmemmove(typ *_type, dst, src unsafe.Pointer) {
heapBitsBulkBarrier(uintptr(dst), typ.size) heapBitsBulkBarrier(uintptr(dst), typ.size)
} }
//go:nosplit
func typedmemmove_nostore(typ *_type, dst unsafe.Pointer) {
if typ.kind&kindNoPointers != 0 {
return
}
heapBitsBulkBarrier(uintptr(dst), typ.size)
}
//go:linkname reflect_typedmemmove reflect.typedmemmove //go:linkname reflect_typedmemmove reflect.typedmemmove
func reflect_typedmemmove(typ *_type, dst, src unsafe.Pointer) { func reflect_typedmemmove(typ *_type, dst, src unsafe.Pointer) {
typedmemmove(typ, dst, src) typedmemmove(typ, dst, src)
......
Markdown is supported
0%
or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment