github.com/rakyll/go@v0.0.0-20170216000551-64c02460d703/src/cmd/asm/main.go (about) 1 // Copyright 2014 The Go Authors. All rights reserved. 2 // Use of this source code is governed by a BSD-style 3 // license that can be found in the LICENSE file. 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 ) 22 23 func main() { 24 log.SetFlags(0) 25 log.SetPrefix("asm: ") 26 27 GOARCH := obj.GOARCH 28 29 architecture := arch.Set(GOARCH) 30 if architecture == nil { 31 log.Fatalf("unrecognized architecture %s", GOARCH) 32 } 33 34 flags.Parse() 35 36 ctxt := obj.Linknew(architecture.LinkArch) 37 if *flags.PrintOut { 38 ctxt.Debugasm = 1 39 } 40 ctxt.Flag_dynlink = *flags.Dynlink 41 ctxt.Flag_shared = *flags.Shared || *flags.Dynlink 42 ctxt.Bso = bufio.NewWriter(os.Stdout) 43 defer ctxt.Bso.Flush() 44 45 // Create object file, write header. 46 out, err := os.Create(*flags.OutputFile) 47 if err != nil { 48 log.Fatal(err) 49 } 50 defer bio.MustClose(out) 51 buf := bufio.NewWriter(bio.MustWriter(out)) 52 53 fmt.Fprintf(buf, "go object %s %s %s\n", obj.GOOS, obj.GOARCH, obj.Version) 54 fmt.Fprintf(buf, "!\n") 55 56 var ok, diag bool 57 var failedFile string 58 for _, f := range flag.Args() { 59 lexer := lex.NewLexer(f) 60 parser := asm.NewParser(ctxt, architecture, lexer) 61 ctxt.DiagFunc = func(format string, args ...interface{}) { 62 diag = true 63 log.Printf(format, args...) 64 } 65 pList := obj.Linknewplist(ctxt) 66 pList.Firstpc, ok = parser.Parse() 67 if !ok { 68 failedFile = f 69 break 70 } 71 } 72 if ok { 73 // reports errors to parser.Errorf 74 obj.Writeobjdirect(ctxt, buf) 75 } 76 if !ok || diag { 77 if failedFile != "" { 78 log.Printf("assembly of %s failed", failedFile) 79 } else { 80 log.Print("assembly failed") 81 } 82 out.Close() 83 os.Remove(*flags.OutputFile) 84 os.Exit(1) 85 } 86 buf.Flush() 87 }