File: main.go

package info (click to toggle)
golang-github-mmcloughlin-avo 0.0~git20200523.4439b6b-6
  • links: PTS, VCS
  • area: main
  • in suites: bullseye
  • size: 8,304 kB
  • sloc: xml: 71,029; asm: 13,138; sh: 179; makefile: 35
file content (85 lines) | stat: -rw-r--r-- 1,762 bytes parent folder | download
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
// Command avogen generates code based on the instruction database.
package main

import (
	"flag"
	"go/build"
	"log"
	"os"
	"path/filepath"

	"github.com/mmcloughlin/avo/internal/gen"
	"github.com/mmcloughlin/avo/internal/inst"
	"github.com/mmcloughlin/avo/internal/load"
	"github.com/mmcloughlin/avo/printer"
)

var generators = map[string]gen.Builder{
	"asmtest":    gen.NewAsmTest,
	"godata":     gen.NewGoData,
	"godatatest": gen.NewGoDataTest,
	"ctors":      gen.NewCtors,
	"ctorstest":  gen.NewCtorsTest,
	"build":      gen.NewBuild,
	"mov":        gen.NewMOV,
}

// Command-line flags.
var (
	bootstrap = flag.Bool("bootstrap", false, "regenerate instruction list from original data")
	datadir   = flag.String(
		"data",
		filepath.Join(build.Default.GOPATH, "src/github.com/mmcloughlin/avo/internal/data"),
		"path to data directory",
	)
	output = flag.String("output", "", "path to output file (default stdout)")
)

func main() {
	log.SetPrefix("avogen: ")
	log.SetFlags(0)
	flag.Parse()

	// Build generator.
	t := flag.Arg(0)
	builder := generators[t]
	if builder == nil {
		log.Fatalf("unknown generator type '%s'", t)
	}

	g := builder(printer.NewArgvConfig())

	// Determine output writer.
	w := os.Stdout
	if *output != "" {
		f, err := os.Create(*output)
		if err != nil {
			log.Fatal(err)
		}
		defer f.Close()
		w = f
	}

	// Load instructions.
	is := inst.Instructions
	if *bootstrap {
		log.Printf("bootstrap: loading instructions from data directory %s", *datadir)
		l := load.NewLoaderFromDataDir(*datadir)
		r, err := l.Load()
		if err != nil {
			log.Fatal(err)
		}
		is = r
	}

	// Generate output.
	b, err := g.Generate(is)
	if err != nil {
		log.Fatal(err)
	}

	// Write.
	if _, err := w.Write(b); err != nil {
		log.Fatal(err)
	}
}