...
Source file src/pkg/cmd/asm/main.go
1
2
3
4
5 package main
6
7 import (
8 "bufio"
9 "flag"
10 "fmt"
11 "log"
12 "os"
13
14 "cmd/asm/internal/arch"
15 "cmd/asm/internal/asm"
16 "cmd/asm/internal/flags"
17 "cmd/asm/internal/lex"
18
19 "cmd/internal/bio"
20 "cmd/internal/obj"
21 "cmd/internal/objabi"
22 )
23
24 func main() {
25 log.SetFlags(0)
26 log.SetPrefix("asm: ")
27
28 GOARCH := objabi.GOARCH
29
30 architecture := arch.Set(GOARCH)
31 if architecture == nil {
32 log.Fatalf("unrecognized architecture %s", GOARCH)
33 }
34
35 flags.Parse()
36
37 ctxt := obj.Linknew(architecture.LinkArch)
38 if *flags.PrintOut {
39 ctxt.Debugasm = 1
40 }
41 ctxt.Flag_dynlink = *flags.Dynlink
42 ctxt.Flag_shared = *flags.Shared || *flags.Dynlink
43 ctxt.Bso = bufio.NewWriter(os.Stdout)
44 defer ctxt.Bso.Flush()
45
46 architecture.Init(ctxt)
47
48
49 out, err := os.Create(*flags.OutputFile)
50 if err != nil {
51 log.Fatal(err)
52 }
53 defer bio.MustClose(out)
54 buf := bufio.NewWriter(bio.MustWriter(out))
55
56 if !*flags.SymABIs {
57 fmt.Fprintf(buf, "go object %s %s %s\n", objabi.GOOS, objabi.GOARCH, objabi.Version)
58 fmt.Fprintf(buf, "!\n")
59 }
60
61 var ok, diag bool
62 var failedFile string
63 for _, f := range flag.Args() {
64 lexer := lex.NewLexer(f)
65 parser := asm.NewParser(ctxt, architecture, lexer)
66 ctxt.DiagFunc = func(format string, args ...interface{}) {
67 diag = true
68 log.Printf(format, args...)
69 }
70 if *flags.SymABIs {
71 ok = parser.ParseSymABIs(buf)
72 } else {
73 pList := new(obj.Plist)
74 pList.Firstpc, ok = parser.Parse()
75
76 if ok {
77 obj.Flushplist(ctxt, pList, nil, "")
78 }
79 }
80 if !ok {
81 failedFile = f
82 break
83 }
84 }
85 if ok && !*flags.SymABIs {
86 obj.WriteObjFile(ctxt, buf, "")
87 }
88 if !ok || diag {
89 if failedFile != "" {
90 log.Printf("assembly of %s failed", failedFile)
91 } else {
92 log.Print("assembly failed")
93 }
94 out.Close()
95 os.Remove(*flags.OutputFile)
96 os.Exit(1)
97 }
98 buf.Flush()
99 }
100
View as plain text