|  | // 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.pl. | 
|  | 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.go", arch)) | 
|  | if err != nil { | 
|  | log.Fatalf("can't open zsyscall_darwin_%s.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, "#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) | 
|  | } | 
|  | } |