// 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 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")
	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]

	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,
	}

	trampolines := generateASMFile(arch, inFileNames, zsyscallASMFileName)

	if goos == "darwin" {
		writeDarwinTest(trampolines, fmt.Sprintf("darwin_%s_test.go", arch), arch)
	}
}
