diff options
| author | Tobias Klauser <tklauser@distanz.ch> | 2022-09-13 11:23:50 +0200 |
|---|---|---|
| committer | Gopher Robot <gobot@golang.org> | 2022-09-13 15:50:02 +0000 |
| commit | d36466fe2aaf51c4b38c3a2ea3164cb3a56b8059 (patch) | |
| tree | 75690c415736c64d675db68e7563bb1a42538b16 /src/cmd/link | |
| parent | 8df21a78027d54faa8014ce9040bd8007d1b23e0 (diff) | |
| download | go-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.go | 12 | ||||
| -rw-r--r-- | src/cmd/link/internal/ld/msync_darwin_syscall.go | 24 | ||||
| -rw-r--r-- | src/cmd/link/internal/ld/outbuf_darwin.go | 2 |
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. } |
