mirror of
				https://gitea.com/Lydanne/buildx.git
				synced 2025-10-31 16:13:45 +08:00 
			
		
		
		
	
		
			
				
	
	
		
			62 lines
		
	
	
		
			1.7 KiB
		
	
	
	
		
			Go
		
	
	
	
	
	
			
		
		
	
	
			62 lines
		
	
	
		
			1.7 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.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, "\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)
 | |
| 	}
 | |
| }
 | 
