]> Cypherpunks repositories - gostls13.git/commitdiff
cmd/compile: conditional on -race, disable inline of go:norace
authorDavid Chase <drchase@google.com>
Fri, 15 Jun 2018 19:20:57 +0000 (15:20 -0400)
committerDavid Chase <drchase@google.com>
Tue, 19 Jun 2018 20:59:10 +0000 (20:59 +0000)
Adds the appropriate check to inl.go.
Includes tests of both -race+go:norace and plain go:norace.

Fixes #24651.

Change-Id: Id806342430c20baf4679a985d12eea3b677092e0
Reviewed-on: https://go-review.googlesource.com/119195
Run-TryBot: David Chase <drchase@google.com>
TryBot-Result: Gobot Gobot <gobot@golang.org>
Reviewed-by: Matthew Dempsky <mdempsky@google.com>
src/cmd/compile/internal/gc/inl.go
test/fixedbugs/issue24651a.go [new file with mode: 0644]
test/fixedbugs/issue24651b.go [new file with mode: 0644]

index 25452911eb868eae3705f19b843e517c4b71b118..cb3ddaf2a5aa07d5fc3948dbeaf4a465542dbbb2 100644 (file)
@@ -132,6 +132,12 @@ func caninl(fn *Node) {
                return
        }
 
+       // If marked "go:norace" and -race compilation, don't inline.
+       if flag_race && fn.Func.Pragma&Norace != 0 {
+               reason = "marked go:norace with -race compilation"
+               return
+       }
+
        // If marked "go:cgo_unsafe_args", don't inline, since the
        // function makes assumptions about its argument frame layout.
        if fn.Func.Pragma&CgoUnsafeArgs != 0 {
diff --git a/test/fixedbugs/issue24651a.go b/test/fixedbugs/issue24651a.go
new file mode 100644 (file)
index 0000000..5f63635
--- /dev/null
@@ -0,0 +1,24 @@
+//errorcheck -0 -race -m -m
+
+// Copyright 2018 The Go Authors. All rights reserved.
+// Use of this source code is governed by a BSD-style
+// license that can be found in the LICENSE file.
+
+package main
+
+//go:norace
+func Foo(x int) int { // ERROR "cannot inline Foo: marked go:norace with -race compilation$"
+       return x * (x + 1) * (x + 2)
+}
+
+func Bar(x int) int { // ERROR "can inline Bar as: func\(int\) int { return x \* \(x \+ 1\) \* \(x \+ 2\) }$"
+       return x * (x + 1) * (x + 2)
+}
+
+var x = 5
+
+//go:noinline Provide a clean, constant reason for not inlining main
+func main() { // ERROR "cannot inline main: marked go:noinline$"
+       println("Foo(", x, ")=", Foo(x))
+       println("Bar(", x, ")=", Bar(x)) // ERROR "inlining call to Bar func\(int\) int { return x \* \(x \+ 1\) \* \(x \+ 2\) }$"
+}
diff --git a/test/fixedbugs/issue24651b.go b/test/fixedbugs/issue24651b.go
new file mode 100644 (file)
index 0000000..2420f61
--- /dev/null
@@ -0,0 +1,24 @@
+//errorcheck -0 -m -m
+
+// Copyright 2018 The Go Authors. All rights reserved.
+// Use of this source code is governed by a BSD-style
+// license that can be found in the LICENSE file.
+
+package main
+
+//go:norace
+func Foo(x int) int { // ERROR "can inline Foo as: func\(int\) int { return x \* \(x \+ 1\) \* \(x \+ 2\) }$"
+       return x * (x + 1) * (x + 2)
+}
+
+func Bar(x int) int { // ERROR "can inline Bar as: func\(int\) int { return x \* \(x \+ 1\) \* \(x \+ 2\) }$"
+       return x * (x + 1) * (x + 2)
+}
+
+var x = 5
+
+//go:noinline Provide a clean, constant reason for not inlining main
+func main() { // ERROR "cannot inline main: marked go:noinline$"
+       println("Foo(", x, ")=", Foo(x)) // ERROR "inlining call to Foo func\(int\) int { return x \* \(x \+ 1\) \* \(x \+ 2\) }$"
+       println("Bar(", x, ")=", Bar(x)) // ERROR "inlining call to Bar func\(int\) int { return x \* \(x \+ 1\) \* \(x \+ 2\) }$"
+}