]> Cypherpunks repositories - gostls13.git/commitdiff
cmd/compile: report typedslicecopy write barriers
authorAustin Clements <austin@google.com>
Tue, 24 Oct 2017 21:10:02 +0000 (17:10 -0400)
committerAustin Clements <austin@google.com>
Sun, 29 Oct 2017 20:21:43 +0000 (20:21 +0000)
Most write barrier calls are inserted by SSA, but copy and append are
lowered to runtime.typedslicecopy during walk. Fix these to set
Func.WBPos and emit the "write barrier" warning, as done for the write
barriers inserted by SSA. As part of this, we refactor setting WBPos
and emitting this warning into the frontend so it can be shared by
both walk and SSA.

Change-Id: I5fe9997d9bdb55e03e01dd58aee28908c35f606b
Reviewed-on: https://go-review.googlesource.com/73411
Run-TryBot: Austin Clements <austin@google.com>
TryBot-Result: Gobot Gobot <gobot@golang.org>
Reviewed-by: Matthew Dempsky <mdempsky@google.com>
src/cmd/compile/internal/gc/ssa.go
src/cmd/compile/internal/gc/syntax.go
src/cmd/compile/internal/gc/walk.go
src/cmd/compile/internal/ssa/config.go
src/cmd/compile/internal/ssa/export_test.go
src/cmd/compile/internal/ssa/func.go
src/cmd/compile/internal/ssa/writebarrier.go

index 103a0f4cd63a281c83b0b4d5863d023e9cc697fe..95f753c167a535c30b3f14153ed842f3b1da88dc 100644 (file)
@@ -136,11 +136,6 @@ func buildssa(fn *Node, worker int) *ssa.Func {
        if fn.Func.Pragma&Nosplit != 0 {
                s.f.NoSplit = true
        }
-       defer func() {
-               if s.f.WBPos.IsKnown() {
-                       fn.Func.WBPos = s.f.WBPos
-               }
-       }()
        s.exitCode = fn.Func.Exit
        s.panics = map[funcLine]*ssa.Block{}
 
@@ -5180,10 +5175,6 @@ func (e *ssafn) Debug_checknil() bool {
        return Debug_checknil != 0
 }
 
-func (e *ssafn) Debug_wb() bool {
-       return Debug_wb != 0
-}
-
 func (e *ssafn) UseWriteBarrier() bool {
        return use_writebarrier
 }
@@ -5205,6 +5196,10 @@ func (e *ssafn) Syslook(name string) *obj.LSym {
        return nil
 }
 
+func (e *ssafn) SetWBPos(pos src.XPos) {
+       e.curfn.Func.setWBPos(pos)
+}
+
 func (n *Node) Typ() *types.Type {
        return n.Type
 }
index e18cdfef5d85f801575cad03f8a59655067cb1af..e28f8a0df3b6c0c3d995409594d3a87b477800e2 100644 (file)
@@ -427,7 +427,7 @@ type Func struct {
        Label int32 // largest auto-generated label in this function
 
        Endlineno src.XPos
-       WBPos     src.XPos // position of first write barrier
+       WBPos     src.XPos // position of first write barrier; see SetWBPos
 
        Pragma syntax.Pragma // go:xxx function annotations
 
@@ -484,6 +484,15 @@ func (f *Func) SetHasDefer(b bool)            { f.flags.set(funcHasDefer, b) }
 func (f *Func) SetNilCheckDisabled(b bool)    { f.flags.set(funcNilCheckDisabled, b) }
 func (f *Func) SetInlinabilityChecked(b bool) { f.flags.set(funcInlinabilityChecked, b) }
 
+func (f *Func) setWBPos(pos src.XPos) {
+       if Debug_wb != 0 {
+               Warnl(pos, "write barrier")
+       }
+       if !f.WBPos.IsKnown() {
+               f.WBPos = pos
+       }
+}
+
 type Op uint8
 
 // Node ops.
index 65ca6cc27a85efc60e42d613b532d50db7781ac7..3139404b1ec9cf0f03a66ac46cbb77f6ecb30cfc 100644 (file)
@@ -2955,6 +2955,7 @@ func appendslice(n *Node, init *Nodes) *Node {
                nptr1.SetSliceBounds(nod(OLEN, l1, nil), nil, nil)
                nptr1.Etype = 1
                nptr2 := l2
+               Curfn.Func.setWBPos(n.Pos)
                fn := syslook("typedslicecopy")
                fn = substArgTypes(fn, l1.Type, l2.Type)
                var ln Nodes
@@ -3117,6 +3118,7 @@ func walkappend(n *Node, init *Nodes, dst *Node) *Node {
 //
 func copyany(n *Node, init *Nodes, runtimecall bool) *Node {
        if types.Haspointers(n.Left.Type.Elem()) {
+               Curfn.Func.setWBPos(n.Pos)
                fn := writebarrierfn("typedslicecopy", n.Left.Type, n.Right.Type)
                return mkcall1(fn, n.Type, init, typename(n.Left.Type.Elem()), n.Left, n.Right)
        }
index c35221952387ba2cc12683f2c659a86e17ea2f0f..de3aadbbe5755bcc6b25fb05e419cadfeb87d941 100644 (file)
@@ -88,7 +88,6 @@ type Logger interface {
 
        // Forwards the Debug flags from gc
        Debug_checknil() bool
-       Debug_wb() bool
 }
 
 type Frontend interface {
@@ -131,6 +130,10 @@ type Frontend interface {
 
        // UseWriteBarrier returns whether write barrier is enabled
        UseWriteBarrier() bool
+
+       // SetWBPos indicates that a write barrier has been inserted
+       // in this function at position pos.
+       SetWBPos(pos src.XPos)
 }
 
 // interface used to hold a *gc.Node (a stack variable).
index ad69463bdd9f2dc269f91342de5e5144722f9234..d1d6831eb3b813fd532e286ab7586d953b28a813 100644 (file)
@@ -125,6 +125,8 @@ func (d DummyFrontend) Syslook(s string) *obj.LSym {
 func (DummyFrontend) UseWriteBarrier() bool {
        return true // only writebarrier_test cares
 }
+func (DummyFrontend) SetWBPos(pos src.XPos) {
+}
 
 func (d DummyFrontend) Logf(msg string, args ...interface{}) { d.t.Logf(msg, args...) }
 func (d DummyFrontend) Log() bool                            { return true }
@@ -132,7 +134,6 @@ func (d DummyFrontend) Log() bool                            { return true }
 func (d DummyFrontend) Fatalf(_ src.XPos, msg string, args ...interface{}) { d.t.Fatalf(msg, args...) }
 func (d DummyFrontend) Warnl(_ src.XPos, msg string, args ...interface{})  { d.t.Logf(msg, args...) }
 func (d DummyFrontend) Debug_checknil() bool                               { return false }
-func (d DummyFrontend) Debug_wb() bool                                     { return false }
 
 var dummyTypes Types
 
index 559f1d70e6f1024a2ee5c96b00bb0497d9fe49f1..01966adb0ff9e051a60c9277d54e52d0127f1d09 100644 (file)
@@ -44,8 +44,6 @@ type Func struct {
        scheduled bool // Values in Blocks are in final order
        NoSplit   bool // true if function is marked as nosplit.  Used by schedule check pass.
 
-       WBPos src.XPos // line number of first write barrier
-
        // when register allocation is done, maps value ids to locations
        RegAlloc []Location
 
index 129a06eecb4fdd672cbac100a6b8fd0e0ee778f7..60797158b3e4444458a1b70532fb393fa26c3dc0 100644 (file)
@@ -226,12 +226,7 @@ func writebarrier(f *Func) {
 
                        if fn != nil {
                                // Note that we set up a writebarrier function call.
-                               if !f.WBPos.IsKnown() {
-                                       f.WBPos = pos
-                               }
-                               if f.fe.Debug_wb() {
-                                       f.Warnl(pos, "write barrier")
-                               }
+                               f.fe.SetWBPos(pos)
                        }
                }