aboutsummaryrefslogtreecommitdiff
path: root/src/runtime/testdata
diff options
context:
space:
mode:
authordoujiang24 <doujiang24@gmail.com>2024-08-16 07:32:00 +0000
committerGopher Robot <gobot@golang.org>2024-08-16 23:44:54 +0000
commitff271cd391bdb8963b5409c6f4cca40af8501b51 (patch)
treeaf15c20d047786edb71e8bcdf94f5545055b81b1 /src/runtime/testdata
parent96ef6abcca2f3ba43ae822d5a6e46fc02092e0a3 (diff)
downloadgo-ff271cd391bdb8963b5409c6f4cca40af8501b51.tar.xz
cmd/cgo: enable #cgo noescape/nocallback
In Go 1.22 we added code to the go/build package to ignore #cgo noescape and nocallback directives. That permits us to enable these directives in Go 1.24. Also, this fixed a Bug in CL 497837: After retiring _Cgo_use for parameters, the compiler will treat the parameters, start from the second, as non-alive. Then, they will be marked as scalar in stackmap, which means the pointer won't be copied correctly in copystack. Fixes #56378. Fixes #63739. Change-Id: I46e773240f8a467c3c4ba201dc5b4ee473cf6e3e GitHub-Last-Rev: 42fcc506d6a7681ef24ac36a5904b57bda4b15cd GitHub-Pull-Request: golang/go#66879 Reviewed-on: https://go-review.googlesource.com/c/go/+/579955 Auto-Submit: Ian Lance Taylor <iant@google.com> Reviewed-by: Ian Lance Taylor <iant@google.com> Reviewed-by: Carlos Amedee <carlos@golang.org> LUCI-TryBot-Result: Go LUCI <golang-scoped@luci-project-accounts.iam.gserviceaccount.com>
Diffstat (limited to 'src/runtime/testdata')
-rw-r--r--src/runtime/testdata/testprogcgo/cgonocallback.go3
-rw-r--r--src/runtime/testdata/testprogcgo/cgonoescape.go3
-rw-r--r--src/runtime/testdata/testprogcgo/issue63739.go59
3 files changed, 63 insertions, 2 deletions
diff --git a/src/runtime/testdata/testprogcgo/cgonocallback.go b/src/runtime/testdata/testprogcgo/cgonocallback.go
index c13bf271a4..8cbbfd1957 100644
--- a/src/runtime/testdata/testprogcgo/cgonocallback.go
+++ b/src/runtime/testdata/testprogcgo/cgonocallback.go
@@ -8,7 +8,8 @@ package main
// But it do callback to go in this test, Go should crash here.
/*
-// TODO(#56378): #cgo nocallback runCShouldNotCallback
+#cgo nocallback runCShouldNotCallback
+
extern void runCShouldNotCallback();
*/
import "C"
diff --git a/src/runtime/testdata/testprogcgo/cgonoescape.go b/src/runtime/testdata/testprogcgo/cgonoescape.go
index f5eebac677..2b7c7a9c55 100644
--- a/src/runtime/testdata/testprogcgo/cgonoescape.go
+++ b/src/runtime/testdata/testprogcgo/cgonoescape.go
@@ -13,7 +13,8 @@ package main
// 2. less than 100 new allocated heap objects after invoking withoutNoEscape 100 times.
/*
-// TODO(#56378): #cgo noescape runCWithNoEscape
+#cgo noescape runCWithNoEscape
+#cgo nocallback runCWithNoEscape
void runCWithNoEscape(void *p) {
}
diff --git a/src/runtime/testdata/testprogcgo/issue63739.go b/src/runtime/testdata/testprogcgo/issue63739.go
new file mode 100644
index 0000000000..dbe37b6d0e
--- /dev/null
+++ b/src/runtime/testdata/testprogcgo/issue63739.go
@@ -0,0 +1,59 @@
+// 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.
+
+package main
+
+// This is for issue #63739.
+// Ensure that parameters are kept alive until the end of the C call. If not,
+// then a stack copy at just the right time while calling into C might think
+// that any stack pointers are not alive and fail to update them, causing the C
+// function to see the old, no longer correct, pointer values.
+
+/*
+int add_from_multiple_pointers(int *a, int *b, int *c) {
+ *a = *a + 1;
+ *b = *b + 1;
+ *c = *c + 1;
+ return *a + *b + *c;
+}
+#cgo noescape add_from_multiple_pointers
+#cgo nocallback add_from_multiple_pointers
+*/
+import "C"
+
+import (
+ "fmt"
+)
+
+const (
+ maxStack = 1024
+)
+
+func init() {
+ register("CgoEscapeWithMultiplePointers", CgoEscapeWithMultiplePointers)
+}
+
+func CgoEscapeWithMultiplePointers() {
+ stackGrow(maxStack)
+ fmt.Println("OK")
+}
+
+//go:noinline
+func testCWithMultiplePointers() {
+ var a C.int = 1
+ var b C.int = 2
+ var c C.int = 3
+ v := C.add_from_multiple_pointers(&a, &b, &c)
+ if v != 9 || a != 2 || b != 3 || c != 4 {
+ fmt.Printf("%d + %d + %d != %d\n", a, b, c, v)
+ }
+}
+
+func stackGrow(n int) {
+ if n == 0 {
+ return
+ }
+ testCWithMultiplePointers()
+ stackGrow(n - 1)
+}