libgo: update to Go1.10rc1
authorIan Lance Taylor <ian@gcc.gnu.org>
Sat, 27 Jan 2018 23:45:46 +0000 (23:45 +0000)
committerIan Lance Taylor <ian@gcc.gnu.org>
Sat, 27 Jan 2018 23:45:46 +0000 (23:45 +0000)
    Reviewed-on: https://go-review.googlesource.com/90295

From-SVN: r257127

libgo/go/cmd/go/testdata/src/coverdot1/p.go [new file with mode: 0644]
libgo/go/cmd/go/testdata/src/coverdot2/p.go [new file with mode: 0644]
libgo/go/cmd/go/testdata/src/coverdot2/p_test.go [new file with mode: 0644]
libgo/go/runtime/testdata/testprog/badtraceback.go [new file with mode: 0644]

diff --git a/libgo/go/cmd/go/testdata/src/coverdot1/p.go b/libgo/go/cmd/go/testdata/src/coverdot1/p.go
new file mode 100644 (file)
index 0000000..cda364f
--- /dev/null
@@ -0,0 +1,3 @@
+package coverdot1
+
+func F() {}
diff --git a/libgo/go/cmd/go/testdata/src/coverdot2/p.go b/libgo/go/cmd/go/testdata/src/coverdot2/p.go
new file mode 100644 (file)
index 0000000..80f79ae
--- /dev/null
@@ -0,0 +1,5 @@
+package coverdot2
+
+import . "coverdot1"
+
+func G() { F() }
diff --git a/libgo/go/cmd/go/testdata/src/coverdot2/p_test.go b/libgo/go/cmd/go/testdata/src/coverdot2/p_test.go
new file mode 100644 (file)
index 0000000..da66e3e
--- /dev/null
@@ -0,0 +1,7 @@
+package coverdot2
+
+import "testing"
+
+func TestG(t *testing.T) {
+       G()
+}
diff --git a/libgo/go/runtime/testdata/testprog/badtraceback.go b/libgo/go/runtime/testdata/testprog/badtraceback.go
new file mode 100644 (file)
index 0000000..d558adc
--- /dev/null
@@ -0,0 +1,47 @@
+// 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
+
+import (
+       "runtime"
+       "runtime/debug"
+       "unsafe"
+)
+
+func init() {
+       register("BadTraceback", BadTraceback)
+}
+
+func BadTraceback() {
+       // Disable GC to prevent traceback at unexpected time.
+       debug.SetGCPercent(-1)
+
+       // Run badLR1 on its own stack to minimize the stack size and
+       // exercise the stack bounds logic in the hex dump.
+       go badLR1()
+       select {}
+}
+
+//go:noinline
+func badLR1() {
+       // We need two frames on LR machines because we'll smash this
+       // frame's saved LR.
+       badLR2(0)
+}
+
+//go:noinline
+func badLR2(arg int) {
+       // Smash the return PC or saved LR.
+       lrOff := unsafe.Sizeof(uintptr(0))
+       if runtime.GOARCH == "ppc64" || runtime.GOARCH == "ppc64le" {
+               lrOff = 32 // FIXED_FRAME or sys.MinFrameSize
+       }
+       lrPtr := (*uintptr)(unsafe.Pointer(uintptr(unsafe.Pointer(&arg)) - lrOff))
+       *lrPtr = 0xbad
+
+       // Print a backtrace. This should include diagnostics for the
+       // bad return PC and a hex dump.
+       panic("backtrace")
+}