The use of &[1]uintptr{fn} was causing sigfwd to allocate memory, even
though it is being compiled for the runtime package. That is a bad
idea for this function, which is invoked by a signal handler. Rewrite
it to use only constructs that do not allocate memory when compiled
for the runtime package.
The test for this is misc/cgo/testcarchive in the main repo, which we
don't yet test.
Reviewed-on: https://go-review.googlesource.com/37454
From-SVN: r245777
-0bcc1bc98dca48af40d9f54f4eacbbafaa30beb1
+e1502234b5011a1ab859519f1f217dbf4369ec9b
The first line of this file holds the git revision number of the last
merge done from the gofrontend repository.
//go:nosplit
//go:nowritebarrierrec
func sigfwd(fn uintptr, sig uint32, info *_siginfo_t, ctx unsafe.Pointer) {
- f1 := &[1]uintptr{fn}
- f2 := *(*func(uint32, *_siginfo_t, unsafe.Pointer))(unsafe.Pointer(&f1))
- f2(sig, info, ctx)
+ f1 := [1]uintptr{fn}
+ f2 := &f1
+ f3 := *(*func(uint32, *_siginfo_t, unsafe.Pointer))(unsafe.Pointer(&f2))
+ f3(sig, info, ctx)
}
//go:nosplit