// 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.

//go:build ignore
// +build ignore

// mkasm.go generates assembly trampolines to call library routines from Go.
// This program must be run after mksyscall.go.
package main

import (
	"bytes"
	"fmt"
	"io/ioutil"
	"log"
	"os"
	"sort"
	"strings"
)

func archPtrSize(arch string) int {
	switch arch {
	case "386", "arm":
		return 4
	case "amd64", "arm64", "mips64":
		return 8
	default:
		log.Fatalf("Unknown arch %q", arch)
		return 0
	}
}

func generateASMFile(arch string, inFileNames []string, outFileName, buildTags string) map[string]bool {
	trampolines := map[string]bool{}
	var orderedTrampolines []string
	for _, inFileName := range inFileNames {
		in, err := ioutil.ReadFile(inFileName)
		if err != nil {
			log.Fatalf("Failed to read file: %v", err)
		}
		for _, line := range strings.Split(string(in), "\n") {
			const prefix = "var "
			const suffix = "_trampoline_addr uintptr"
			if !strings.HasPrefix(line, prefix) || !strings.HasSuffix(line, suffix) {
				continue
			}
			fn := strings.TrimSuffix(strings.TrimPrefix(line, prefix), suffix)
			if !trampolines[fn] {
				orderedTrampolines = append(orderedTrampolines, fn)
				trampolines[fn] = true
			}
		}
	}

	ptrSize := archPtrSize(arch)

	var out bytes.Buffer
	fmt.Fprintf(&out, "// go run mkasm.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")
	if buildTags != "" {
		fmt.Fprintf(&out, "//go:build %s\n", buildTags)
		fmt.Fprintf(&out, "// +build %s\n", buildTags)
		fmt.Fprintf(&out, "\n")
	}
	fmt.Fprintf(&out, "#include \"textflag.h\"\n")
	for _, fn := range orderedTrampolines {
		fmt.Fprintf(&out, "\nTEXT %s_trampoline<>(SB),NOSPLIT,$0-0\n", fn)
		fmt.Fprintf(&out, "\tJMP\t%s(SB)\n\n", fn)
		fmt.Fprintf(&out, "GLOBL\t·%s_trampoline_addr(SB), RODATA, $%d\n", fn, ptrSize)
		fmt.Fprintf(&out, "DATA\t·%s_trampoline_addr(SB)/%d, $%s_trampoline<>(SB)\n", fn, ptrSize, fn)
	}

	if err := ioutil.WriteFile(outFileName, out.Bytes(), 0644); err != nil {
		log.Fatalf("Failed to write assembly file %q: %v", outFileName, err)
	}

	return trampolines
}

const darwinTestTemplate = `// go run mkasm.go %s
// Code generated by the command above; DO NOT EDIT.

//go:build darwin && go1.12
// +build darwin,go1.12

package unix

// All the _trampoline functions in zsyscall_darwin_%s.s.
var darwinTests = [...]darwinTest{
%s}
`

func writeDarwinTest(trampolines map[string]bool, fileName, arch string) {
	var sortedTrampolines []string
	for fn := range trampolines {
		sortedTrampolines = append(sortedTrampolines, fn)
	}
	sort.Strings(sortedTrampolines)

	var out bytes.Buffer

	const prefix = "libc_"
	for _, fn := range sortedTrampolines {
		fmt.Fprintf(&out, fmt.Sprintf("\t{%q, %s_trampoline_addr},\n", strings.TrimPrefix(fn, prefix), fn))
	}
	lines := out.String()

	out.Reset()
	fmt.Fprintf(&out, darwinTestTemplate, strings.Join(os.Args[1:], " "), arch, lines)

	if err := ioutil.WriteFile(fileName, out.Bytes(), 0644); err != nil {
		log.Fatalf("Failed to write test file %q: %v", fileName, err)
	}
}

func main() {
	if len(os.Args) != 3 {
		log.Fatalf("Usage: %s <goos> <arch>", os.Args[0])
	}
	goos, arch := os.Args[1], os.Args[2]

	buildTags := ""
	syscallFilename := fmt.Sprintf("syscall_%s.go", goos)
	syscallArchFilename := fmt.Sprintf("syscall_%s_%s.go", goos, arch)
	zsyscallArchFilename := fmt.Sprintf("zsyscall_%s_%s.go", goos, arch)
	zsyscallASMFileName := fmt.Sprintf("zsyscall_%s_%s.s", goos, arch)

	inFileNames := []string{
		syscallFilename,
		syscallArchFilename,
		zsyscallArchFilename,
	}

	if goos == "darwin" {
		buildTags = "go1.12"
	}
	trampolines := generateASMFile(arch, inFileNames, zsyscallASMFileName, buildTags)

	if goos != "darwin" {
		return
	}

	inFileNames = []string{
		"syscall_darwin.1_13.go",
		fmt.Sprintf("zsyscall_darwin_%s.1_13.go", arch),
	}
	trampolines2 := generateASMFile(arch, inFileNames, fmt.Sprintf("zsyscall_darwin_%s.1_13.s", arch), "go1.13")

	// merge trampolines
	for trampoline := range trampolines2 {
		trampolines[trampoline] = true
	}

	writeDarwinTest(trampolines, fmt.Sprintf("darwin_%s_test.go", arch), arch)
}
