mirror of
https://github.com/rwinkhart/sys.git
synced 2026-08-29 05:16:30 -04:00
Call into libSystem (Darwin's libc equivalent) to do system calls. Raw syscalls are not a supported ABI on Darwin, they want us to use libSystem calls instead. The stdlib has already been converted to this new regime. This package is vendored into the stdlib, so we need to fix it also, then vendor it in again. Because this package isn't tied to a Go release, we need to keep the old code around and use the new code only for 1.12 and up. Update golang/go#17490 Change-Id: Idbcacff096b5bfeac871aa75dfd971570ac93322 Reviewed-on: https://go-review.googlesource.com/c/154179 Reviewed-by: Ian Lance Taylor <iant@golang.org>
62 lines
1.8 KiB
Go
62 lines
1.8 KiB
Go
// Copyright 2018 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.
|
|
|
|
// +build ignore
|
|
|
|
// mkasm_darwin.go generates assembly trampolines to call libSystem routines from Go.
|
|
//This program must be run after mksyscall.go.
|
|
package main
|
|
|
|
import (
|
|
"bytes"
|
|
"fmt"
|
|
"io/ioutil"
|
|
"log"
|
|
"os"
|
|
"strings"
|
|
)
|
|
|
|
func main() {
|
|
in1, err := ioutil.ReadFile("syscall_darwin.go")
|
|
if err != nil {
|
|
log.Fatalf("can't open syscall_darwin.go: %s", err)
|
|
}
|
|
arch := os.Args[1]
|
|
in2, err := ioutil.ReadFile(fmt.Sprintf("syscall_darwin_%s.go", arch))
|
|
if err != nil {
|
|
log.Fatalf("can't open syscall_darwin_%s.go: %s", arch, err)
|
|
}
|
|
in3, err := ioutil.ReadFile(fmt.Sprintf("zsyscall_darwin_%s.1_12.go", arch))
|
|
if err != nil {
|
|
log.Fatalf("can't open zsyscall_darwin_%s.1_12.go: %s", arch, err)
|
|
}
|
|
in := string(in1) + string(in2) + string(in3)
|
|
|
|
trampolines := map[string]bool{}
|
|
|
|
var out bytes.Buffer
|
|
|
|
fmt.Fprintf(&out, "// go run mkasm_darwin.go %s\n", strings.Join(os.Args[1:], " "))
|
|
fmt.Fprintf(&out, "// Code generated by the command above; DO NOT EDIT.\n")
|
|
fmt.Fprintf(&out, "\n")
|
|
fmt.Fprintf(&out, "// +build go1.12\n")
|
|
fmt.Fprintf(&out, "\n")
|
|
fmt.Fprintf(&out, "#include \"textflag.h\"\n")
|
|
for _, line := range strings.Split(in, "\n") {
|
|
if !strings.HasPrefix(line, "func ") || !strings.HasSuffix(line, "_trampoline()") {
|
|
continue
|
|
}
|
|
fn := line[5 : len(line)-13]
|
|
if !trampolines[fn] {
|
|
trampolines[fn] = true
|
|
fmt.Fprintf(&out, "TEXT ·%s_trampoline(SB),NOSPLIT,$0-0\n", fn)
|
|
fmt.Fprintf(&out, "\tJMP\t%s(SB)\n", fn)
|
|
}
|
|
}
|
|
err = ioutil.WriteFile(fmt.Sprintf("zsyscall_darwin_%s.s", arch), out.Bytes(), 0644)
|
|
if err != nil {
|
|
log.Fatalf("can't write zsyscall_darwin_%s.s: %s", arch, err)
|
|
}
|
|
}
|