cmd/compile: introduce //go:systemstack annotation
//go:systemstack means that the function must run on the system stack.
Add one use in runtime as a demonstration.
Fixes #9174.
Change-Id: I8d4a509cb313541426157da703f1c022e964ace4
Reviewed-on: https://go-review.googlesource.com/10840
Reviewed-by: Austin Clements <austin@google.com>
Run-TryBot: Austin Clements <austin@google.com>
diff --git a/src/runtime/malloc.go b/src/runtime/malloc.go
index 7fd5498..25371ab 100644
--- a/src/runtime/malloc.go
+++ b/src/runtime/malloc.go
@@ -797,6 +797,17 @@
// Intended for things like function/type/debug-related persistent data.
// If align is 0, uses default align (currently 8).
func persistentalloc(size, align uintptr, sysStat *uint64) unsafe.Pointer {
+ var p unsafe.Pointer
+ systemstack(func() {
+ p = persistentalloc1(size, align, sysStat)
+ })
+ return p
+}
+
+// Must run on system stack because stack growth can (re)invoke it.
+// See issue 9174.
+//go:systemstack
+func persistentalloc1(size, align uintptr, sysStat *uint64) unsafe.Pointer {
const (
chunk = 256 << 10
maxBlock = 64 << 10 // VM reservation granularity is 64K on windows