]> Cypherpunks repositories - gostls13.git/commitdiff
cmd/compile: don't inline reflect.Value.UnsafeAddr/Pointer if enable checkptr
authorCuong Manh Le <cuong.manhle.vn@gmail.com>
Wed, 11 Mar 2020 05:51:44 +0000 (12:51 +0700)
committerCuong Manh Le <cuong.manhle.vn@gmail.com>
Wed, 1 Apr 2020 06:12:05 +0000 (06:12 +0000)
Fixes #35073

Change-Id: I4b555bbc33d39a97544e6dd9c61d95ae212f472b
Reviewed-on: https://go-review.googlesource.com/c/go/+/222878
Run-TryBot: Cuong Manh Le <cuong.manhle.vn@gmail.com>
TryBot-Result: Gobot Gobot <gobot@golang.org>
Reviewed-by: Matthew Dempsky <mdempsky@google.com>
src/cmd/compile/internal/gc/inl.go
test/fixedbugs/issue35073.go [new file with mode: 0644]

index 68acf876f8e6cf3304a5bec0d55157ca00ccc2df..b9460ed6d6c789c68e1c87d7093b3f91aa03a8c7 100644 (file)
@@ -575,6 +575,12 @@ func inlnode(n *Node, maxCost int32) *Node {
        // so escape analysis can avoid more heapmoves.
        case OCLOSURE:
                return n
+       case OCALLMETH:
+               // Prevent inlining some reflect.Value methods when using checkptr,
+               // even when package reflect was compiled without it (#35073).
+               if s := n.Left.Sym; Debug_checkptr != 0 && s.Pkg.Path == "reflect" && (s.Name == "Value.UnsafeAddr" || s.Name == "Value.Pointer") {
+                       return n
+               }
        }
 
        lno := setlineno(n)
diff --git a/test/fixedbugs/issue35073.go b/test/fixedbugs/issue35073.go
new file mode 100644 (file)
index 0000000..dc8ce3a
--- /dev/null
@@ -0,0 +1,23 @@
+// run -gcflags=-d=checkptr
+
+// Copyright 2020 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.
+
+// Test that reflect.Value.UnsafeAddr/Pointer is handled
+// correctly by -d=checkptr
+
+package main
+
+import (
+       "reflect"
+       "unsafe"
+)
+
+func main() {
+       n := 10
+       m := make(map[string]string)
+
+       _ = unsafe.Pointer(reflect.ValueOf(&n).Elem().UnsafeAddr())
+       _ = unsafe.Pointer(reflect.ValueOf(&m).Elem().Pointer())
+}