llvm-as.cpp revision 218885
1167802Sjkim//===--- llvm-as.cpp - The low-level LLVM assembler -----------------------===// 2167802Sjkim// 3167802Sjkim// The LLVM Compiler Infrastructure 4167802Sjkim// 5167802Sjkim// This file is distributed under the University of Illinois Open Source 6167802Sjkim// License. See LICENSE.TXT for details. 7167802Sjkim// 8167802Sjkim//===----------------------------------------------------------------------===// 9167802Sjkim// 10167802Sjkim// This utility may be invoked in the following manner: 11202771Sjkim// llvm-as --help - Output information about command line switches 12167802Sjkim// llvm-as [options] - Read LLVM asm from stdin, write bitcode to stdout 13167802Sjkim// llvm-as [options] x.ll - Read LLVM asm from the x.ll file, write bitcode 14167802Sjkim// to the x.bc file. 15167802Sjkim// 16167802Sjkim//===----------------------------------------------------------------------===// 17167802Sjkim 18167802Sjkim#include "llvm/LLVMContext.h" 19167802Sjkim#include "llvm/Module.h" 20167802Sjkim#include "llvm/Assembly/Parser.h" 21167802Sjkim#include "llvm/Analysis/Verifier.h" 22167802Sjkim#include "llvm/Bitcode/ReaderWriter.h" 23167802Sjkim#include "llvm/Support/CommandLine.h" 24167802Sjkim#include "llvm/Support/ManagedStatic.h" 25167802Sjkim#include "llvm/Support/PrettyStackTrace.h" 26167802Sjkim#include "llvm/Support/SourceMgr.h" 27167802Sjkim#include "llvm/Support/SystemUtils.h" 28167802Sjkim#include "llvm/Support/ToolOutputFile.h" 29167802Sjkim#include "llvm/Support/Signals.h" 30167802Sjkim#include <memory> 31167802Sjkimusing namespace llvm; 32167802Sjkim 33167802Sjkimstatic cl::opt<std::string> 34167802SjkimInputFilename(cl::Positional, cl::desc("<input .llvm file>"), cl::init("-")); 35167802Sjkim 36167802Sjkimstatic cl::opt<std::string> 37167802SjkimOutputFilename("o", cl::desc("Override output filename"), 38167802Sjkim cl::value_desc("filename")); 39167802Sjkim 40167802Sjkimstatic cl::opt<bool> 41167802SjkimForce("f", cl::desc("Enable binary output on terminals")); 42167802Sjkim 43167802Sjkimstatic cl::opt<bool> 44167802SjkimDisableOutput("disable-output", cl::desc("Disable output"), cl::init(false)); 45167802Sjkim 46167802Sjkimstatic cl::opt<bool> 47167802SjkimDumpAsm("d", cl::desc("Print assembly as parsed"), cl::Hidden); 48167802Sjkim 49167802Sjkimstatic cl::opt<bool> 50167802SjkimDisableVerify("disable-verify", cl::Hidden, 51167802Sjkim cl::desc("Do not run verifier on input LLVM (dangerous!)")); 52167802Sjkim 53167802Sjkimstatic void WriteOutputFile(const Module *M) { 54167802Sjkim // Infer the output filename if needed. 55167802Sjkim if (OutputFilename.empty()) { 56167802Sjkim if (InputFilename == "-") { 57167802Sjkim OutputFilename = "-"; 58167802Sjkim } else { 59167802Sjkim std::string IFN = InputFilename; 60167802Sjkim int Len = IFN.length(); 61167802Sjkim if (IFN[Len-3] == '.' && IFN[Len-2] == 'l' && IFN[Len-1] == 'l') { 62167802Sjkim // Source ends in .ll 63167802Sjkim OutputFilename = std::string(IFN.begin(), IFN.end()-3); 64167802Sjkim } else { 65167802Sjkim OutputFilename = IFN; // Append a .bc to it 66167802Sjkim } 67167802Sjkim OutputFilename += ".bc"; 68167802Sjkim } 69167802Sjkim } 70167802Sjkim 71167802Sjkim std::string ErrorInfo; 72167802Sjkim OwningPtr<tool_output_file> Out 73167802Sjkim (new tool_output_file(OutputFilename.c_str(), ErrorInfo, 74167802Sjkim raw_fd_ostream::F_Binary)); 75167802Sjkim if (!ErrorInfo.empty()) { 76167802Sjkim errs() << ErrorInfo << '\n'; 77167802Sjkim exit(1); 78167802Sjkim } 79167802Sjkim 80167802Sjkim if (Force || !CheckBitcodeOutputToConsole(Out->os(), true)) 81167802Sjkim WriteBitcodeToFile(M, Out->os()); 82167802Sjkim 83167802Sjkim // Declare success. 84167802Sjkim Out->keep(); 85167802Sjkim} 86167802Sjkim 87167802Sjkimint main(int argc, char **argv) { 88167802Sjkim // Print a stack trace if we signal out. 89167802Sjkim sys::PrintStackTraceOnErrorSignal(); 90167802Sjkim PrettyStackTraceProgram X(argc, argv); 91167802Sjkim LLVMContext &Context = getGlobalContext(); 92167802Sjkim llvm_shutdown_obj Y; // Call llvm_shutdown() on exit. 93167802Sjkim cl::ParseCommandLineOptions(argc, argv, "llvm .ll -> .bc assembler\n"); 94167802Sjkim 95167802Sjkim // Parse the file now... 96167802Sjkim SMDiagnostic Err; 97167802Sjkim std::auto_ptr<Module> M(ParseAssemblyFile(InputFilename, Err, Context)); 98167802Sjkim if (M.get() == 0) { 99167802Sjkim Err.Print(argv[0], errs()); 100167802Sjkim return 1; 101167802Sjkim } 102167802Sjkim 103167802Sjkim if (!DisableVerify) { 104167802Sjkim std::string Err; 105167802Sjkim if (verifyModule(*M.get(), ReturnStatusAction, &Err)) { 106167802Sjkim errs() << argv[0] 107167802Sjkim << ": assembly parsed, but does not verify as correct!\n"; 108167802Sjkim errs() << Err; 109167802Sjkim return 1; 110167802Sjkim } 111167802Sjkim } 112167802Sjkim 113167802Sjkim if (DumpAsm) errs() << "Here's the assembly:\n" << *M.get(); 114167802Sjkim 115167802Sjkim if (!DisableOutput) 116193529Sjkim WriteOutputFile(M.get()); 117193529Sjkim 118193529Sjkim return 0; 119193529Sjkim} 120167802Sjkim