Home | History | Annotate | Download | only in asm
      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("asm: 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 	ctxt.Diag = log.Fatalf
     51 	output := obj.Binitw(fd)
     52 	fmt.Fprintf(output, "go object %s %s %s\n", obj.Getgoos(), obj.Getgoarch(), obj.Getgoversion())
     53 	fmt.Fprintf(output, "!\n")
     54 
     55 	lexer := lex.NewLexer(flag.Arg(0), ctxt)
     56 	parser := asm.NewParser(ctxt, architecture, lexer)
     57 	pList := obj.Linknewplist(ctxt)
     58 	var ok bool
     59 	pList.Firstpc, ok = parser.Parse()
     60 	if !ok {
     61 		log.Printf("asm: assembly of %s failed", flag.Arg(0))
     62 		os.Remove(*flags.OutputFile)
     63 		os.Exit(1)
     64 	}
     65 	obj.Writeobjdirect(ctxt, output)
     66 	output.Flush()
     67 }
     68