/
main.go
98 lines (85 loc) · 1.95 KB
/
main.go
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
86
87
88
89
90
91
92
93
94
95
96
97
98
// Command avogen generates code based on the instruction database.
package main
import (
"flag"
"fmt"
"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,
"optab": gen.NewOptab,
"ctors": gen.NewCtors,
"ctorstest": gen.NewCtorsTest,
"ctorsstress": gen.NewCtorsStress,
"ctorsbench": gen.NewCtorsBench,
"build": gen.NewBuild,
"buildtest": gen.NewBuildTest,
"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()
if err := run(); err != nil {
log.Fatal(err)
}
}
func run() error {
// Build generator.
t := flag.Arg(0)
builder := generators[t]
if builder == nil {
return fmt.Errorf("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 {
return 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 {
return err
}
is = r
}
// Generate output.
b, generr := g.Generate(is)
// Write.
if _, err := w.Write(b); err != nil {
return err
}
if generr != nil {
return generr
}
return nil
}