aboutsummaryrefslogtreecommitdiff
path: root/test/runtime
diff options
context:
space:
mode:
authorDavid Chase <drchase@google.com>2019-04-15 21:27:04 -0400
committerDavid Chase <drchase@google.com>2019-04-19 20:18:29 +0000
commit376ce8c88033eede19d6295f9a79263f73c0fddb (patch)
tree2f23797c9428764b67f2ed70656fa0fddc789aac /test/runtime
parentdc193dee15294e451ceaae2e50e539255f4a37b6 (diff)
downloadgo-376ce8c88033eede19d6295f9a79263f73c0fddb.tar.gz
go-376ce8c88033eede19d6295f9a79263f73c0fddb.zip
cmd/compile: shortcut intrinsic inlining AFTER getcallerXX check
A check in inl.go to prevent inlining of functions calling either getcallerpc or getcallersp does not work when these functions are intrinsics. Swap checks to fix. Includes test. No bug, this was discovered in the course of a ridiculous experiment with inlining. Change-Id: Ie1392523bb89882d586678f2674e1a4eadc5e431 Reviewed-on: https://go-review.googlesource.com/c/go/+/172217 Run-TryBot: David Chase <drchase@google.com> TryBot-Result: Gobot Gobot <gobot@golang.org> Reviewed-by: Keith Randall <khr@golang.org>
Diffstat (limited to 'test/runtime')
-rw-r--r--test/runtime/README7
-rw-r--r--test/runtime/inlinegcpc.go29
2 files changed, 36 insertions, 0 deletions
diff --git a/test/runtime/README b/test/runtime/README
new file mode 100644
index 0000000000..249031afc1
--- /dev/null
+++ b/test/runtime/README
@@ -0,0 +1,7 @@
+// Copyright 2019 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.
+
+The runtime directory contains tests that specifically need
+to be compiled as-if in the runtime package. For error-check
+tests, these require the additional flags -+ and -p=runtime.
diff --git a/test/runtime/inlinegcpc.go b/test/runtime/inlinegcpc.go
new file mode 100644
index 0000000000..0943205ffd
--- /dev/null
+++ b/test/runtime/inlinegcpc.go
@@ -0,0 +1,29 @@
+// errorcheck -0 -+ -p=runtime -m -newescape=true
+
+// Copyright 2019 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 runtime
+
+// A function that calls runtime.getcallerpc or runtime.getcallersp()
+// cannot be inlined, no matter how small it is.
+
+func getcallerpc() uintptr
+func getcallersp() uintptr
+
+func pc() uintptr {
+ return getcallerpc() + 1
+}
+
+func cpc() uintptr { // ERROR "can inline cpc"
+ return pc() + 2
+}
+
+func sp() uintptr {
+ return getcallersp() + 3
+}
+
+func csp() uintptr { // ERROR "can inline csp"
+ return sp() + 4
+}