aboutsummaryrefslogtreecommitdiff
path: root/src/cmd/link
diff options
context:
space:
mode:
authorTobias Klauser <tklauser@distanz.ch>2022-09-13 11:23:50 +0200
committerGopher Robot <gobot@golang.org>2022-09-13 15:50:02 +0000
commitd36466fe2aaf51c4b38c3a2ea3164cb3a56b8059 (patch)
tree75690c415736c64d675db68e7563bb1a42538b16 /src/cmd/link
parent8df21a78027d54faa8014ce9040bd8007d1b23e0 (diff)
downloadgo-d36466fe2aaf51c4b38c3a2ea3164cb3a56b8059.tar.xz
cmd/link/internal/ld, syscall: use libc based msync on darwin for Go ≥ 1.20
Direct syscalls should no longer be used on darwin. Instead, directly call libc's msync when using Go ≥ 1.20 for bootstrap. For #54265 Change-Id: Ie3f1e6ccd1a06e7f0ddd88cdef5067393a69e8db Reviewed-on: https://go-review.googlesource.com/c/go/+/430336 Reviewed-by: Ian Lance Taylor <iant@google.com> TryBot-Result: Gopher Robot <gobot@golang.org> Run-TryBot: Tobias Klauser <tobias.klauser@gmail.com> Reviewed-by: Cherry Mui <cherryyz@google.com> Auto-Submit: Tobias Klauser <tobias.klauser@gmail.com>
Diffstat (limited to 'src/cmd/link')
-rw-r--r--src/cmd/link/internal/ld/msync_darwin_libc.go12
-rw-r--r--src/cmd/link/internal/ld/msync_darwin_syscall.go24
-rw-r--r--src/cmd/link/internal/ld/outbuf_darwin.go2
3 files changed, 37 insertions, 1 deletions
diff --git a/src/cmd/link/internal/ld/msync_darwin_libc.go b/src/cmd/link/internal/ld/msync_darwin_libc.go
new file mode 100644
index 0000000000..eb2a526835
--- /dev/null
+++ b/src/cmd/link/internal/ld/msync_darwin_libc.go
@@ -0,0 +1,12 @@
+// Copyright 2022 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.
+
+//go:build darwin && go1.20
+
+package ld
+
+import _ "unsafe" // for go:linkname
+
+//go:linkname msync syscall.msync
+func msync(b []byte, flags int) (err error)
diff --git a/src/cmd/link/internal/ld/msync_darwin_syscall.go b/src/cmd/link/internal/ld/msync_darwin_syscall.go
new file mode 100644
index 0000000000..270d9f3383
--- /dev/null
+++ b/src/cmd/link/internal/ld/msync_darwin_syscall.go
@@ -0,0 +1,24 @@
+// Copyright 2022 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.
+
+//go:build darwin && !go1.20
+
+package ld
+
+import (
+ "syscall"
+ "unsafe"
+)
+
+func msync(b []byte, flags int) (err error) {
+ var p unsafe.Pointer
+ if len(b) > 0 {
+ p = unsafe.Pointer(&b[0])
+ }
+ _, _, errno := syscall.Syscall(syscall.SYS_MSYNC, uintptr(p), uintptr(len(b)), uintptr(flags))
+ if errno != 0 {
+ return errno
+ }
+ return nil
+}
diff --git a/src/cmd/link/internal/ld/outbuf_darwin.go b/src/cmd/link/internal/ld/outbuf_darwin.go
index c0d994ea61..17f7e2a65f 100644
--- a/src/cmd/link/internal/ld/outbuf_darwin.go
+++ b/src/cmd/link/internal/ld/outbuf_darwin.go
@@ -43,6 +43,6 @@ func (out *OutBuf) purgeSignatureCache() {
// When we mmap the output buffer, it doesn't have a code signature
// (as we haven't generated one). Invalidate the kernel cache now that
// we have generated the signature. See issue #42684.
- syscall.Syscall(syscall.SYS_MSYNC, uintptr(unsafe.Pointer(&out.buf[0])), uintptr(len(out.buf)), syscall.MS_INVALIDATE)
+ msync(out.buf, syscall.MS_INVALIDATE)
// Best effort. Ignore error.
}