github.com/miolini/go@v0.0.0-20160405192216-fca68c8cb408/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 "flag" 9 "fmt" 10 "log" 11 "os" 12 13 "cmd/asm/internal/arch" 14 "cmd/asm/internal/asm" 15 "cmd/asm/internal/flags" 16 "cmd/asm/internal/lex" 17 18 "cmd/internal/obj" 19 ) 20 21 func main() { 22 log.SetFlags(0) 23 log.SetPrefix("asm: ") 24 25 GOARCH := obj.Getgoarch() 26 27 architecture := arch.Set(GOARCH) 28 if architecture == nil { 29 log.Fatalf("unrecognized architecture %s", GOARCH) 30 } 31 32 flags.Parse() 33 34 // Create object file, write header. 35 fd, err := os.Create(*flags.OutputFile) 36 if err != nil { 37 log.Fatal(err) 38 } 39 ctxt := obj.Linknew(architecture.LinkArch) 40 if *flags.PrintOut { 41 ctxt.Debugasm = 1 42 } 43 ctxt.LineHist.TrimPathPrefix = *flags.TrimPath 44 ctxt.Flag_dynlink = *flags.Dynlink 45 if *flags.Shared || *flags.Dynlink { 46 ctxt.Flag_shared = 1 47 } 48 ctxt.Bso = obj.Binitw(os.Stdout) 49 defer ctxt.Bso.Flush() 50 output := obj.Binitw(fd) 51 fmt.Fprintf(output, "go object %s %s %s\n", obj.Getgoos(), obj.Getgoarch(), obj.Getgoversion()) 52 fmt.Fprintf(output, "!\n") 53 54 lexer := lex.NewLexer(flag.Arg(0), ctxt) 55 parser := asm.NewParser(ctxt, architecture, lexer) 56 diag := false 57 ctxt.DiagFunc = func(format string, args ...interface{}) { 58 diag = true 59 log.Printf(format, args...) 60 } 61 pList := obj.Linknewplist(ctxt) 62 var ok bool 63 pList.Firstpc, ok = parser.Parse() 64 if ok { 65 // reports errors to parser.Errorf 66 obj.Writeobjdirect(ctxt, output) 67 } 68 if !ok || diag { 69 log.Printf("assembly of %s failed", flag.Arg(0)) 70 os.Remove(*flags.OutputFile) 71 os.Exit(1) 72 } 73 output.Flush() 74 }