cc1as_main.cpp revision e8f0ba75a39b2fa2d34d14e8401ae96f43e1fc14
141b5b17445ab3bdf957ebd4be6c8670f09a212a8Daniel Dunbar//===-- cc1as_main.cpp - Clang Assembler ---------------------------------===// 241b5b17445ab3bdf957ebd4be6c8670f09a212a8Daniel Dunbar// 341b5b17445ab3bdf957ebd4be6c8670f09a212a8Daniel Dunbar// The LLVM Compiler Infrastructure 441b5b17445ab3bdf957ebd4be6c8670f09a212a8Daniel Dunbar// 541b5b17445ab3bdf957ebd4be6c8670f09a212a8Daniel Dunbar// This file is distributed under the University of Illinois Open Source 641b5b17445ab3bdf957ebd4be6c8670f09a212a8Daniel Dunbar// License. See LICENSE.TXT for details. 741b5b17445ab3bdf957ebd4be6c8670f09a212a8Daniel Dunbar// 841b5b17445ab3bdf957ebd4be6c8670f09a212a8Daniel Dunbar//===----------------------------------------------------------------------===// 941b5b17445ab3bdf957ebd4be6c8670f09a212a8Daniel Dunbar// 1041b5b17445ab3bdf957ebd4be6c8670f09a212a8Daniel Dunbar// This is the entry point to the clang -cc1as functionality, which implements 1141b5b17445ab3bdf957ebd4be6c8670f09a212a8Daniel Dunbar// the direct interface to the LLVM MC based assembler. 1241b5b17445ab3bdf957ebd4be6c8670f09a212a8Daniel Dunbar// 1341b5b17445ab3bdf957ebd4be6c8670f09a212a8Daniel Dunbar//===----------------------------------------------------------------------===// 1441b5b17445ab3bdf957ebd4be6c8670f09a212a8Daniel Dunbar 1541b5b17445ab3bdf957ebd4be6c8670f09a212a8Daniel Dunbar#include "clang/Basic/Diagnostic.h" 1641b5b17445ab3bdf957ebd4be6c8670f09a212a8Daniel Dunbar#include "clang/Driver/Arg.h" 1741b5b17445ab3bdf957ebd4be6c8670f09a212a8Daniel Dunbar#include "clang/Driver/ArgList.h" 1841b5b17445ab3bdf957ebd4be6c8670f09a212a8Daniel Dunbar#include "clang/Driver/DriverDiagnostic.h" 1941b5b17445ab3bdf957ebd4be6c8670f09a212a8Daniel Dunbar#include "clang/Driver/CC1AsOptions.h" 2041b5b17445ab3bdf957ebd4be6c8670f09a212a8Daniel Dunbar#include "clang/Driver/OptTable.h" 2141b5b17445ab3bdf957ebd4be6c8670f09a212a8Daniel Dunbar#include "clang/Driver/Options.h" 2241b5b17445ab3bdf957ebd4be6c8670f09a212a8Daniel Dunbar#include "clang/Frontend/DiagnosticOptions.h" 2341b5b17445ab3bdf957ebd4be6c8670f09a212a8Daniel Dunbar#include "clang/Frontend/FrontendDiagnostic.h" 2441b5b17445ab3bdf957ebd4be6c8670f09a212a8Daniel Dunbar#include "clang/Frontend/TextDiagnosticPrinter.h" 2541b5b17445ab3bdf957ebd4be6c8670f09a212a8Daniel Dunbar#include "llvm/ADT/OwningPtr.h" 2641b5b17445ab3bdf957ebd4be6c8670f09a212a8Daniel Dunbar#include "llvm/ADT/StringSwitch.h" 272dc14532b641bae011a374e2c6c393d2196c1411Duncan Sands#include "llvm/ADT/Triple.h" 287374f1b407a86df83fde942ee9f3684a3159f99fDaniel Dunbar#include "llvm/MC/MCParser/MCAsmParser.h" 297374f1b407a86df83fde942ee9f3684a3159f99fDaniel Dunbar#include "llvm/MC/MCAsmInfo.h" 3041b5b17445ab3bdf957ebd4be6c8670f09a212a8Daniel Dunbar#include "llvm/MC/MCCodeEmitter.h" 3141b5b17445ab3bdf957ebd4be6c8670f09a212a8Daniel Dunbar#include "llvm/MC/MCContext.h" 3241b5b17445ab3bdf957ebd4be6c8670f09a212a8Daniel Dunbar#include "llvm/MC/MCStreamer.h" 33c673af7fe67e5db4d10dd414237df247d35dd9d9Daniel Dunbar#include "llvm/Support/CommandLine.h" 3441b5b17445ab3bdf957ebd4be6c8670f09a212a8Daniel Dunbar#include "llvm/Support/FormattedStream.h" 3541b5b17445ab3bdf957ebd4be6c8670f09a212a8Daniel Dunbar#include "llvm/Support/ErrorHandling.h" 3641b5b17445ab3bdf957ebd4be6c8670f09a212a8Daniel Dunbar#include "llvm/Support/ManagedStatic.h" 3741b5b17445ab3bdf957ebd4be6c8670f09a212a8Daniel Dunbar#include "llvm/Support/MemoryBuffer.h" 3841b5b17445ab3bdf957ebd4be6c8670f09a212a8Daniel Dunbar#include "llvm/Support/PrettyStackTrace.h" 3941b5b17445ab3bdf957ebd4be6c8670f09a212a8Daniel Dunbar#include "llvm/Support/SourceMgr.h" 4041b5b17445ab3bdf957ebd4be6c8670f09a212a8Daniel Dunbar#include "llvm/Support/Timer.h" 4141b5b17445ab3bdf957ebd4be6c8670f09a212a8Daniel Dunbar#include "llvm/Support/raw_ostream.h" 4241b5b17445ab3bdf957ebd4be6c8670f09a212a8Daniel Dunbar#include "llvm/System/Host.h" 4341b5b17445ab3bdf957ebd4be6c8670f09a212a8Daniel Dunbar#include "llvm/System/Path.h" 4441b5b17445ab3bdf957ebd4be6c8670f09a212a8Daniel Dunbar#include "llvm/System/Signals.h" 4541b5b17445ab3bdf957ebd4be6c8670f09a212a8Daniel Dunbar#include "llvm/Target/TargetAsmBackend.h" 4641b5b17445ab3bdf957ebd4be6c8670f09a212a8Daniel Dunbar#include "llvm/Target/TargetAsmParser.h" 4741b5b17445ab3bdf957ebd4be6c8670f09a212a8Daniel Dunbar#include "llvm/Target/TargetData.h" 4841b5b17445ab3bdf957ebd4be6c8670f09a212a8Daniel Dunbar#include "llvm/Target/TargetMachine.h" 4941b5b17445ab3bdf957ebd4be6c8670f09a212a8Daniel Dunbar#include "llvm/Target/TargetRegistry.h" 5041b5b17445ab3bdf957ebd4be6c8670f09a212a8Daniel Dunbar#include "llvm/Target/TargetSelect.h" 5141b5b17445ab3bdf957ebd4be6c8670f09a212a8Daniel Dunbarusing namespace clang; 5241b5b17445ab3bdf957ebd4be6c8670f09a212a8Daniel Dunbarusing namespace clang::driver; 5341b5b17445ab3bdf957ebd4be6c8670f09a212a8Daniel Dunbarusing namespace llvm; 5441b5b17445ab3bdf957ebd4be6c8670f09a212a8Daniel Dunbar 5541b5b17445ab3bdf957ebd4be6c8670f09a212a8Daniel Dunbarnamespace { 5641b5b17445ab3bdf957ebd4be6c8670f09a212a8Daniel Dunbar 5741b5b17445ab3bdf957ebd4be6c8670f09a212a8Daniel Dunbar/// \brief Helper class for representing a single invocation of the assembler. 5841b5b17445ab3bdf957ebd4be6c8670f09a212a8Daniel Dunbarstruct AssemblerInvocation { 5941b5b17445ab3bdf957ebd4be6c8670f09a212a8Daniel Dunbar /// @name Target Options 6041b5b17445ab3bdf957ebd4be6c8670f09a212a8Daniel Dunbar /// @{ 6141b5b17445ab3bdf957ebd4be6c8670f09a212a8Daniel Dunbar 6241b5b17445ab3bdf957ebd4be6c8670f09a212a8Daniel Dunbar std::string Triple; 6341b5b17445ab3bdf957ebd4be6c8670f09a212a8Daniel Dunbar 6441b5b17445ab3bdf957ebd4be6c8670f09a212a8Daniel Dunbar /// @} 6541b5b17445ab3bdf957ebd4be6c8670f09a212a8Daniel Dunbar /// @name Language Options 6641b5b17445ab3bdf957ebd4be6c8670f09a212a8Daniel Dunbar /// @{ 6741b5b17445ab3bdf957ebd4be6c8670f09a212a8Daniel Dunbar 6841b5b17445ab3bdf957ebd4be6c8670f09a212a8Daniel Dunbar std::vector<std::string> IncludePaths; 6941b5b17445ab3bdf957ebd4be6c8670f09a212a8Daniel Dunbar unsigned NoInitialTextSection : 1; 7041b5b17445ab3bdf957ebd4be6c8670f09a212a8Daniel Dunbar 7141b5b17445ab3bdf957ebd4be6c8670f09a212a8Daniel Dunbar /// @} 7241b5b17445ab3bdf957ebd4be6c8670f09a212a8Daniel Dunbar /// @name Frontend Options 7341b5b17445ab3bdf957ebd4be6c8670f09a212a8Daniel Dunbar /// @{ 7441b5b17445ab3bdf957ebd4be6c8670f09a212a8Daniel Dunbar 7541b5b17445ab3bdf957ebd4be6c8670f09a212a8Daniel Dunbar std::string InputFile; 76c673af7fe67e5db4d10dd414237df247d35dd9d9Daniel Dunbar std::vector<std::string> LLVMArgs; 7741b5b17445ab3bdf957ebd4be6c8670f09a212a8Daniel Dunbar std::string OutputPath; 7841b5b17445ab3bdf957ebd4be6c8670f09a212a8Daniel Dunbar enum FileType { 7941b5b17445ab3bdf957ebd4be6c8670f09a212a8Daniel Dunbar FT_Asm, ///< Assembly (.s) output, transliterate mode. 8041b5b17445ab3bdf957ebd4be6c8670f09a212a8Daniel Dunbar FT_Null, ///< No output, for timing purposes. 8141b5b17445ab3bdf957ebd4be6c8670f09a212a8Daniel Dunbar FT_Obj ///< Object file output. 8241b5b17445ab3bdf957ebd4be6c8670f09a212a8Daniel Dunbar }; 8341b5b17445ab3bdf957ebd4be6c8670f09a212a8Daniel Dunbar FileType OutputType; 84c673af7fe67e5db4d10dd414237df247d35dd9d9Daniel Dunbar unsigned ShowHelp : 1; 85c673af7fe67e5db4d10dd414237df247d35dd9d9Daniel Dunbar unsigned ShowVersion : 1; 8641b5b17445ab3bdf957ebd4be6c8670f09a212a8Daniel Dunbar 8741b5b17445ab3bdf957ebd4be6c8670f09a212a8Daniel Dunbar /// @} 8841b5b17445ab3bdf957ebd4be6c8670f09a212a8Daniel Dunbar /// @name Transliterate Options 8941b5b17445ab3bdf957ebd4be6c8670f09a212a8Daniel Dunbar /// @{ 9041b5b17445ab3bdf957ebd4be6c8670f09a212a8Daniel Dunbar 9141b5b17445ab3bdf957ebd4be6c8670f09a212a8Daniel Dunbar unsigned OutputAsmVariant; 9241b5b17445ab3bdf957ebd4be6c8670f09a212a8Daniel Dunbar unsigned ShowEncoding : 1; 9341b5b17445ab3bdf957ebd4be6c8670f09a212a8Daniel Dunbar unsigned ShowInst : 1; 9441b5b17445ab3bdf957ebd4be6c8670f09a212a8Daniel Dunbar 9541b5b17445ab3bdf957ebd4be6c8670f09a212a8Daniel Dunbar /// @} 9641b5b17445ab3bdf957ebd4be6c8670f09a212a8Daniel Dunbar /// @name Assembler Options 9741b5b17445ab3bdf957ebd4be6c8670f09a212a8Daniel Dunbar /// @{ 9841b5b17445ab3bdf957ebd4be6c8670f09a212a8Daniel Dunbar 9941b5b17445ab3bdf957ebd4be6c8670f09a212a8Daniel Dunbar unsigned RelaxAll : 1; 10041b5b17445ab3bdf957ebd4be6c8670f09a212a8Daniel Dunbar 10141b5b17445ab3bdf957ebd4be6c8670f09a212a8Daniel Dunbar /// @} 10241b5b17445ab3bdf957ebd4be6c8670f09a212a8Daniel Dunbar 10341b5b17445ab3bdf957ebd4be6c8670f09a212a8Daniel Dunbarpublic: 10441b5b17445ab3bdf957ebd4be6c8670f09a212a8Daniel Dunbar AssemblerInvocation() { 10541b5b17445ab3bdf957ebd4be6c8670f09a212a8Daniel Dunbar Triple = ""; 10641b5b17445ab3bdf957ebd4be6c8670f09a212a8Daniel Dunbar NoInitialTextSection = 0; 10741b5b17445ab3bdf957ebd4be6c8670f09a212a8Daniel Dunbar InputFile = "-"; 108c673af7fe67e5db4d10dd414237df247d35dd9d9Daniel Dunbar OutputPath = "-"; 10941b5b17445ab3bdf957ebd4be6c8670f09a212a8Daniel Dunbar OutputType = FT_Asm; 11041b5b17445ab3bdf957ebd4be6c8670f09a212a8Daniel Dunbar OutputAsmVariant = 0; 11141b5b17445ab3bdf957ebd4be6c8670f09a212a8Daniel Dunbar ShowInst = 0; 11241b5b17445ab3bdf957ebd4be6c8670f09a212a8Daniel Dunbar ShowEncoding = 0; 11341b5b17445ab3bdf957ebd4be6c8670f09a212a8Daniel Dunbar RelaxAll = 0; 11441b5b17445ab3bdf957ebd4be6c8670f09a212a8Daniel Dunbar } 11541b5b17445ab3bdf957ebd4be6c8670f09a212a8Daniel Dunbar 11641b5b17445ab3bdf957ebd4be6c8670f09a212a8Daniel Dunbar static void CreateFromArgs(AssemblerInvocation &Res, const char **ArgBegin, 11741b5b17445ab3bdf957ebd4be6c8670f09a212a8Daniel Dunbar const char **ArgEnd, Diagnostic &Diags); 11841b5b17445ab3bdf957ebd4be6c8670f09a212a8Daniel Dunbar}; 11941b5b17445ab3bdf957ebd4be6c8670f09a212a8Daniel Dunbar 12041b5b17445ab3bdf957ebd4be6c8670f09a212a8Daniel Dunbar} 12141b5b17445ab3bdf957ebd4be6c8670f09a212a8Daniel Dunbar 12241b5b17445ab3bdf957ebd4be6c8670f09a212a8Daniel Dunbarvoid AssemblerInvocation::CreateFromArgs(AssemblerInvocation &Opts, 12341b5b17445ab3bdf957ebd4be6c8670f09a212a8Daniel Dunbar const char **ArgBegin, 12441b5b17445ab3bdf957ebd4be6c8670f09a212a8Daniel Dunbar const char **ArgEnd, 12541b5b17445ab3bdf957ebd4be6c8670f09a212a8Daniel Dunbar Diagnostic &Diags) { 12641b5b17445ab3bdf957ebd4be6c8670f09a212a8Daniel Dunbar using namespace clang::driver::cc1asoptions; 12741b5b17445ab3bdf957ebd4be6c8670f09a212a8Daniel Dunbar // Parse the arguments. 12841b5b17445ab3bdf957ebd4be6c8670f09a212a8Daniel Dunbar OwningPtr<OptTable> OptTbl(createCC1AsOptTable()); 12941b5b17445ab3bdf957ebd4be6c8670f09a212a8Daniel Dunbar unsigned MissingArgIndex, MissingArgCount; 13041b5b17445ab3bdf957ebd4be6c8670f09a212a8Daniel Dunbar OwningPtr<InputArgList> Args( 13141b5b17445ab3bdf957ebd4be6c8670f09a212a8Daniel Dunbar OptTbl->ParseArgs(ArgBegin, ArgEnd,MissingArgIndex, MissingArgCount)); 13241b5b17445ab3bdf957ebd4be6c8670f09a212a8Daniel Dunbar 13341b5b17445ab3bdf957ebd4be6c8670f09a212a8Daniel Dunbar // Check for missing argument error. 13441b5b17445ab3bdf957ebd4be6c8670f09a212a8Daniel Dunbar if (MissingArgCount) 13541b5b17445ab3bdf957ebd4be6c8670f09a212a8Daniel Dunbar Diags.Report(diag::err_drv_missing_argument) 13641b5b17445ab3bdf957ebd4be6c8670f09a212a8Daniel Dunbar << Args->getArgString(MissingArgIndex) << MissingArgCount; 13741b5b17445ab3bdf957ebd4be6c8670f09a212a8Daniel Dunbar 13841b5b17445ab3bdf957ebd4be6c8670f09a212a8Daniel Dunbar // Issue errors on unknown arguments. 13941b5b17445ab3bdf957ebd4be6c8670f09a212a8Daniel Dunbar for (arg_iterator it = Args->filtered_begin(cc1asoptions::OPT_UNKNOWN), 14041b5b17445ab3bdf957ebd4be6c8670f09a212a8Daniel Dunbar ie = Args->filtered_end(); it != ie; ++it) 1417e4953e5c60409007545288f14b430bd23d68570Daniel Dunbar Diags.Report(diag::err_drv_unknown_argument) << (*it) ->getAsString(*Args); 14241b5b17445ab3bdf957ebd4be6c8670f09a212a8Daniel Dunbar 14341b5b17445ab3bdf957ebd4be6c8670f09a212a8Daniel Dunbar // Construct the invocation. 14441b5b17445ab3bdf957ebd4be6c8670f09a212a8Daniel Dunbar 14541b5b17445ab3bdf957ebd4be6c8670f09a212a8Daniel Dunbar // Target Options 1462dc14532b641bae011a374e2c6c393d2196c1411Duncan Sands Opts.Triple = Triple::normalize(Args->getLastArgValue(OPT_triple)); 14741b5b17445ab3bdf957ebd4be6c8670f09a212a8Daniel Dunbar if (Opts.Triple.empty()) // Use the host triple if unspecified. 14841b5b17445ab3bdf957ebd4be6c8670f09a212a8Daniel Dunbar Opts.Triple = sys::getHostTriple(); 14941b5b17445ab3bdf957ebd4be6c8670f09a212a8Daniel Dunbar 15041b5b17445ab3bdf957ebd4be6c8670f09a212a8Daniel Dunbar // Language Options 15141b5b17445ab3bdf957ebd4be6c8670f09a212a8Daniel Dunbar Opts.IncludePaths = Args->getAllArgValues(OPT_I); 15241b5b17445ab3bdf957ebd4be6c8670f09a212a8Daniel Dunbar Opts.NoInitialTextSection = Args->hasArg(OPT_n); 15341b5b17445ab3bdf957ebd4be6c8670f09a212a8Daniel Dunbar 15441b5b17445ab3bdf957ebd4be6c8670f09a212a8Daniel Dunbar // Frontend Options 15541b5b17445ab3bdf957ebd4be6c8670f09a212a8Daniel Dunbar if (Args->hasArg(OPT_INPUT)) { 15641b5b17445ab3bdf957ebd4be6c8670f09a212a8Daniel Dunbar bool First = true; 15741b5b17445ab3bdf957ebd4be6c8670f09a212a8Daniel Dunbar for (arg_iterator it = Args->filtered_begin(OPT_INPUT), 15841b5b17445ab3bdf957ebd4be6c8670f09a212a8Daniel Dunbar ie = Args->filtered_end(); it != ie; ++it, First=false) { 1597e4953e5c60409007545288f14b430bd23d68570Daniel Dunbar const Arg *A = it; 16041b5b17445ab3bdf957ebd4be6c8670f09a212a8Daniel Dunbar if (First) 1617e4953e5c60409007545288f14b430bd23d68570Daniel Dunbar Opts.InputFile = A->getValue(*Args); 16241b5b17445ab3bdf957ebd4be6c8670f09a212a8Daniel Dunbar else 1637e4953e5c60409007545288f14b430bd23d68570Daniel Dunbar Diags.Report(diag::err_drv_unknown_argument) << A->getAsString(*Args); 16441b5b17445ab3bdf957ebd4be6c8670f09a212a8Daniel Dunbar } 16541b5b17445ab3bdf957ebd4be6c8670f09a212a8Daniel Dunbar } 166c673af7fe67e5db4d10dd414237df247d35dd9d9Daniel Dunbar Opts.LLVMArgs = Args->getAllArgValues(OPT_mllvm); 16741b5b17445ab3bdf957ebd4be6c8670f09a212a8Daniel Dunbar Opts.OutputPath = Args->getLastArgValue(OPT_o); 16841b5b17445ab3bdf957ebd4be6c8670f09a212a8Daniel Dunbar if (Arg *A = Args->getLastArg(OPT_filetype)) { 16941b5b17445ab3bdf957ebd4be6c8670f09a212a8Daniel Dunbar StringRef Name = A->getValue(*Args); 17041b5b17445ab3bdf957ebd4be6c8670f09a212a8Daniel Dunbar unsigned OutputType = StringSwitch<unsigned>(Name) 17141b5b17445ab3bdf957ebd4be6c8670f09a212a8Daniel Dunbar .Case("asm", FT_Asm) 17241b5b17445ab3bdf957ebd4be6c8670f09a212a8Daniel Dunbar .Case("null", FT_Null) 17341b5b17445ab3bdf957ebd4be6c8670f09a212a8Daniel Dunbar .Case("obj", FT_Obj) 17441b5b17445ab3bdf957ebd4be6c8670f09a212a8Daniel Dunbar .Default(~0U); 17541b5b17445ab3bdf957ebd4be6c8670f09a212a8Daniel Dunbar if (OutputType == ~0U) 17641b5b17445ab3bdf957ebd4be6c8670f09a212a8Daniel Dunbar Diags.Report(diag::err_drv_invalid_value) 17741b5b17445ab3bdf957ebd4be6c8670f09a212a8Daniel Dunbar << A->getAsString(*Args) << Name; 17841b5b17445ab3bdf957ebd4be6c8670f09a212a8Daniel Dunbar else 17941b5b17445ab3bdf957ebd4be6c8670f09a212a8Daniel Dunbar Opts.OutputType = FileType(OutputType); 18041b5b17445ab3bdf957ebd4be6c8670f09a212a8Daniel Dunbar } 181c673af7fe67e5db4d10dd414237df247d35dd9d9Daniel Dunbar Opts.ShowHelp = Args->hasArg(OPT_help); 182c673af7fe67e5db4d10dd414237df247d35dd9d9Daniel Dunbar Opts.ShowVersion = Args->hasArg(OPT_version); 18341b5b17445ab3bdf957ebd4be6c8670f09a212a8Daniel Dunbar 18441b5b17445ab3bdf957ebd4be6c8670f09a212a8Daniel Dunbar // Transliterate Options 18541b5b17445ab3bdf957ebd4be6c8670f09a212a8Daniel Dunbar Opts.OutputAsmVariant = Args->getLastArgIntValue(OPT_output_asm_variant, 18641b5b17445ab3bdf957ebd4be6c8670f09a212a8Daniel Dunbar 0, Diags); 18741b5b17445ab3bdf957ebd4be6c8670f09a212a8Daniel Dunbar Opts.ShowEncoding = Args->hasArg(OPT_show_encoding); 18841b5b17445ab3bdf957ebd4be6c8670f09a212a8Daniel Dunbar Opts.ShowInst = Args->hasArg(OPT_show_inst); 18941b5b17445ab3bdf957ebd4be6c8670f09a212a8Daniel Dunbar 19041b5b17445ab3bdf957ebd4be6c8670f09a212a8Daniel Dunbar // Assemble Options 19141b5b17445ab3bdf957ebd4be6c8670f09a212a8Daniel Dunbar Opts.RelaxAll = Args->hasArg(OPT_relax_all); 19241b5b17445ab3bdf957ebd4be6c8670f09a212a8Daniel Dunbar} 19341b5b17445ab3bdf957ebd4be6c8670f09a212a8Daniel Dunbar 19441b5b17445ab3bdf957ebd4be6c8670f09a212a8Daniel Dunbarstatic formatted_raw_ostream *GetOutputStream(AssemblerInvocation &Opts, 19541b5b17445ab3bdf957ebd4be6c8670f09a212a8Daniel Dunbar Diagnostic &Diags, 19641b5b17445ab3bdf957ebd4be6c8670f09a212a8Daniel Dunbar bool Binary) { 197c673af7fe67e5db4d10dd414237df247d35dd9d9Daniel Dunbar if (Opts.OutputPath.empty()) 198c673af7fe67e5db4d10dd414237df247d35dd9d9Daniel Dunbar Opts.OutputPath = "-"; 199c673af7fe67e5db4d10dd414237df247d35dd9d9Daniel Dunbar 20041b5b17445ab3bdf957ebd4be6c8670f09a212a8Daniel Dunbar // Make sure that the Out file gets unlinked from the disk if we get a 20141b5b17445ab3bdf957ebd4be6c8670f09a212a8Daniel Dunbar // SIGINT. 20241b5b17445ab3bdf957ebd4be6c8670f09a212a8Daniel Dunbar if (Opts.OutputPath != "-") 20341b5b17445ab3bdf957ebd4be6c8670f09a212a8Daniel Dunbar sys::RemoveFileOnSignal(sys::Path(Opts.OutputPath)); 20441b5b17445ab3bdf957ebd4be6c8670f09a212a8Daniel Dunbar 20541b5b17445ab3bdf957ebd4be6c8670f09a212a8Daniel Dunbar std::string Error; 20641b5b17445ab3bdf957ebd4be6c8670f09a212a8Daniel Dunbar raw_fd_ostream *Out = 20741b5b17445ab3bdf957ebd4be6c8670f09a212a8Daniel Dunbar new raw_fd_ostream(Opts.OutputPath.c_str(), Error, 20841b5b17445ab3bdf957ebd4be6c8670f09a212a8Daniel Dunbar (Binary ? raw_fd_ostream::F_Binary : 0)); 20941b5b17445ab3bdf957ebd4be6c8670f09a212a8Daniel Dunbar if (!Error.empty()) { 21041b5b17445ab3bdf957ebd4be6c8670f09a212a8Daniel Dunbar Diags.Report(diag::err_fe_unable_to_open_output) 21141b5b17445ab3bdf957ebd4be6c8670f09a212a8Daniel Dunbar << Opts.OutputPath << Error; 21241b5b17445ab3bdf957ebd4be6c8670f09a212a8Daniel Dunbar return 0; 21341b5b17445ab3bdf957ebd4be6c8670f09a212a8Daniel Dunbar } 21441b5b17445ab3bdf957ebd4be6c8670f09a212a8Daniel Dunbar 21541b5b17445ab3bdf957ebd4be6c8670f09a212a8Daniel Dunbar return new formatted_raw_ostream(*Out, formatted_raw_ostream::DELETE_STREAM); 21641b5b17445ab3bdf957ebd4be6c8670f09a212a8Daniel Dunbar} 21741b5b17445ab3bdf957ebd4be6c8670f09a212a8Daniel Dunbar 21841b5b17445ab3bdf957ebd4be6c8670f09a212a8Daniel Dunbarstatic bool ExecuteAssembler(AssemblerInvocation &Opts, Diagnostic &Diags) { 21941b5b17445ab3bdf957ebd4be6c8670f09a212a8Daniel Dunbar // Get the target specific parser. 22041b5b17445ab3bdf957ebd4be6c8670f09a212a8Daniel Dunbar std::string Error; 22141b5b17445ab3bdf957ebd4be6c8670f09a212a8Daniel Dunbar const Target *TheTarget(TargetRegistry::lookupTarget(Opts.Triple, Error)); 22241b5b17445ab3bdf957ebd4be6c8670f09a212a8Daniel Dunbar if (!TheTarget) { 22341b5b17445ab3bdf957ebd4be6c8670f09a212a8Daniel Dunbar Diags.Report(diag::err_target_unknown_triple) << Opts.Triple; 22441b5b17445ab3bdf957ebd4be6c8670f09a212a8Daniel Dunbar return false; 22541b5b17445ab3bdf957ebd4be6c8670f09a212a8Daniel Dunbar } 22641b5b17445ab3bdf957ebd4be6c8670f09a212a8Daniel Dunbar 22741b5b17445ab3bdf957ebd4be6c8670f09a212a8Daniel Dunbar MemoryBuffer *Buffer = MemoryBuffer::getFileOrSTDIN(Opts.InputFile, &Error); 22841b5b17445ab3bdf957ebd4be6c8670f09a212a8Daniel Dunbar if (Buffer == 0) { 22941b5b17445ab3bdf957ebd4be6c8670f09a212a8Daniel Dunbar Diags.Report(diag::err_fe_error_reading) << Opts.InputFile; 23041b5b17445ab3bdf957ebd4be6c8670f09a212a8Daniel Dunbar return false; 23141b5b17445ab3bdf957ebd4be6c8670f09a212a8Daniel Dunbar } 23241b5b17445ab3bdf957ebd4be6c8670f09a212a8Daniel Dunbar 23341b5b17445ab3bdf957ebd4be6c8670f09a212a8Daniel Dunbar SourceMgr SrcMgr; 23441b5b17445ab3bdf957ebd4be6c8670f09a212a8Daniel Dunbar 23541b5b17445ab3bdf957ebd4be6c8670f09a212a8Daniel Dunbar // Tell SrcMgr about this buffer, which is what the parser will pick up. 23641b5b17445ab3bdf957ebd4be6c8670f09a212a8Daniel Dunbar SrcMgr.AddNewSourceBuffer(Buffer, SMLoc()); 23741b5b17445ab3bdf957ebd4be6c8670f09a212a8Daniel Dunbar 23841b5b17445ab3bdf957ebd4be6c8670f09a212a8Daniel Dunbar // Record the location of the include directories so that the lexer can find 23941b5b17445ab3bdf957ebd4be6c8670f09a212a8Daniel Dunbar // it later. 24041b5b17445ab3bdf957ebd4be6c8670f09a212a8Daniel Dunbar SrcMgr.setIncludeDirs(Opts.IncludePaths); 24141b5b17445ab3bdf957ebd4be6c8670f09a212a8Daniel Dunbar 24241b5b17445ab3bdf957ebd4be6c8670f09a212a8Daniel Dunbar OwningPtr<MCAsmInfo> MAI(TheTarget->createAsmInfo(Opts.Triple)); 24341b5b17445ab3bdf957ebd4be6c8670f09a212a8Daniel Dunbar assert(MAI && "Unable to create target asm info!"); 24441b5b17445ab3bdf957ebd4be6c8670f09a212a8Daniel Dunbar 24541b5b17445ab3bdf957ebd4be6c8670f09a212a8Daniel Dunbar MCContext Ctx(*MAI); 24641b5b17445ab3bdf957ebd4be6c8670f09a212a8Daniel Dunbar bool IsBinary = Opts.OutputType == AssemblerInvocation::FT_Obj; 24741b5b17445ab3bdf957ebd4be6c8670f09a212a8Daniel Dunbar formatted_raw_ostream *Out = GetOutputStream(Opts, Diags, IsBinary); 24841b5b17445ab3bdf957ebd4be6c8670f09a212a8Daniel Dunbar if (!Out) 24941b5b17445ab3bdf957ebd4be6c8670f09a212a8Daniel Dunbar return false; 25041b5b17445ab3bdf957ebd4be6c8670f09a212a8Daniel Dunbar 25141b5b17445ab3bdf957ebd4be6c8670f09a212a8Daniel Dunbar // FIXME: We shouldn't need to do this (and link in codegen). 25241b5b17445ab3bdf957ebd4be6c8670f09a212a8Daniel Dunbar OwningPtr<TargetMachine> TM(TheTarget->createTargetMachine(Opts.Triple, "")); 25341b5b17445ab3bdf957ebd4be6c8670f09a212a8Daniel Dunbar if (!TM) { 25441b5b17445ab3bdf957ebd4be6c8670f09a212a8Daniel Dunbar Diags.Report(diag::err_target_unknown_triple) << Opts.Triple; 25541b5b17445ab3bdf957ebd4be6c8670f09a212a8Daniel Dunbar return false; 25641b5b17445ab3bdf957ebd4be6c8670f09a212a8Daniel Dunbar } 25741b5b17445ab3bdf957ebd4be6c8670f09a212a8Daniel Dunbar 25841b5b17445ab3bdf957ebd4be6c8670f09a212a8Daniel Dunbar OwningPtr<MCStreamer> Str; 25941b5b17445ab3bdf957ebd4be6c8670f09a212a8Daniel Dunbar 26041b5b17445ab3bdf957ebd4be6c8670f09a212a8Daniel Dunbar if (Opts.OutputType == AssemblerInvocation::FT_Asm) { 26141b5b17445ab3bdf957ebd4be6c8670f09a212a8Daniel Dunbar MCInstPrinter *IP = 26241b5b17445ab3bdf957ebd4be6c8670f09a212a8Daniel Dunbar TheTarget->createMCInstPrinter(Opts.OutputAsmVariant, *MAI); 2637ac3d5a9eac7a7d4ce1e47264f1e3ed66ebc9d4eBenjamin Kramer MCCodeEmitter *CE = 0; 26441b5b17445ab3bdf957ebd4be6c8670f09a212a8Daniel Dunbar if (Opts.ShowEncoding) 2657ac3d5a9eac7a7d4ce1e47264f1e3ed66ebc9d4eBenjamin Kramer CE = TheTarget->createCodeEmitter(*TM, Ctx); 26641b5b17445ab3bdf957ebd4be6c8670f09a212a8Daniel Dunbar Str.reset(createAsmStreamer(Ctx, *Out,TM->getTargetData()->isLittleEndian(), 2677ac3d5a9eac7a7d4ce1e47264f1e3ed66ebc9d4eBenjamin Kramer /*asmverbose*/true, IP, CE, Opts.ShowInst)); 26841b5b17445ab3bdf957ebd4be6c8670f09a212a8Daniel Dunbar } else if (Opts.OutputType == AssemblerInvocation::FT_Null) { 26941b5b17445ab3bdf957ebd4be6c8670f09a212a8Daniel Dunbar Str.reset(createNullStreamer(Ctx)); 27041b5b17445ab3bdf957ebd4be6c8670f09a212a8Daniel Dunbar } else { 27141b5b17445ab3bdf957ebd4be6c8670f09a212a8Daniel Dunbar assert(Opts.OutputType == AssemblerInvocation::FT_Obj && 27241b5b17445ab3bdf957ebd4be6c8670f09a212a8Daniel Dunbar "Invalid file type!"); 2737ac3d5a9eac7a7d4ce1e47264f1e3ed66ebc9d4eBenjamin Kramer MCCodeEmitter *CE = TheTarget->createCodeEmitter(*TM, Ctx); 2747ac3d5a9eac7a7d4ce1e47264f1e3ed66ebc9d4eBenjamin Kramer TargetAsmBackend *TAB = TheTarget->createAsmBackend(Opts.Triple); 2757ac3d5a9eac7a7d4ce1e47264f1e3ed66ebc9d4eBenjamin Kramer Str.reset(TheTarget->createObjectStreamer(Opts.Triple, Ctx, *TAB, *Out, 2767ac3d5a9eac7a7d4ce1e47264f1e3ed66ebc9d4eBenjamin Kramer CE, Opts.RelaxAll)); 2774f036fad0481a1bc996763b3e7c1d2f0019607f4Rafael Espindola Str.get()->InitSections(); 27841b5b17445ab3bdf957ebd4be6c8670f09a212a8Daniel Dunbar } 27941b5b17445ab3bdf957ebd4be6c8670f09a212a8Daniel Dunbar 2807374f1b407a86df83fde942ee9f3684a3159f99fDaniel Dunbar OwningPtr<MCAsmParser> Parser(createMCAsmParser(*TheTarget, SrcMgr, Ctx, 2817374f1b407a86df83fde942ee9f3684a3159f99fDaniel Dunbar *Str.get(), *MAI)); 282e9122a36c4c951c4cdce842dc8caf20874908cfdDaniel Dunbar OwningPtr<TargetAsmParser> TAP(TheTarget->createAsmParser(*Parser, *TM)); 28341b5b17445ab3bdf957ebd4be6c8670f09a212a8Daniel Dunbar if (!TAP) { 28441b5b17445ab3bdf957ebd4be6c8670f09a212a8Daniel Dunbar Diags.Report(diag::err_target_unknown_triple) << Opts.Triple; 28541b5b17445ab3bdf957ebd4be6c8670f09a212a8Daniel Dunbar return false; 28641b5b17445ab3bdf957ebd4be6c8670f09a212a8Daniel Dunbar } 28741b5b17445ab3bdf957ebd4be6c8670f09a212a8Daniel Dunbar 2887374f1b407a86df83fde942ee9f3684a3159f99fDaniel Dunbar Parser->setTargetParser(*TAP.get()); 28941b5b17445ab3bdf957ebd4be6c8670f09a212a8Daniel Dunbar 2907374f1b407a86df83fde942ee9f3684a3159f99fDaniel Dunbar bool Success = !Parser->Run(Opts.NoInitialTextSection); 29141b5b17445ab3bdf957ebd4be6c8670f09a212a8Daniel Dunbar 29241b5b17445ab3bdf957ebd4be6c8670f09a212a8Daniel Dunbar // Close the output. 29341b5b17445ab3bdf957ebd4be6c8670f09a212a8Daniel Dunbar delete Out; 29441b5b17445ab3bdf957ebd4be6c8670f09a212a8Daniel Dunbar 29541b5b17445ab3bdf957ebd4be6c8670f09a212a8Daniel Dunbar // Delete output on errors. 29641b5b17445ab3bdf957ebd4be6c8670f09a212a8Daniel Dunbar if (!Success && Opts.OutputPath != "-") 29741b5b17445ab3bdf957ebd4be6c8670f09a212a8Daniel Dunbar sys::Path(Opts.OutputPath).eraseFromDisk(); 29841b5b17445ab3bdf957ebd4be6c8670f09a212a8Daniel Dunbar 29941b5b17445ab3bdf957ebd4be6c8670f09a212a8Daniel Dunbar return Success; 30041b5b17445ab3bdf957ebd4be6c8670f09a212a8Daniel Dunbar} 30141b5b17445ab3bdf957ebd4be6c8670f09a212a8Daniel Dunbar 30241b5b17445ab3bdf957ebd4be6c8670f09a212a8Daniel Dunbarstatic void LLVMErrorHandler(void *UserData, const std::string &Message) { 30341b5b17445ab3bdf957ebd4be6c8670f09a212a8Daniel Dunbar Diagnostic &Diags = *static_cast<Diagnostic*>(UserData); 30441b5b17445ab3bdf957ebd4be6c8670f09a212a8Daniel Dunbar 30541b5b17445ab3bdf957ebd4be6c8670f09a212a8Daniel Dunbar Diags.Report(diag::err_fe_error_backend) << Message; 30641b5b17445ab3bdf957ebd4be6c8670f09a212a8Daniel Dunbar 30741b5b17445ab3bdf957ebd4be6c8670f09a212a8Daniel Dunbar // We cannot recover from llvm errors. 30841b5b17445ab3bdf957ebd4be6c8670f09a212a8Daniel Dunbar exit(1); 30941b5b17445ab3bdf957ebd4be6c8670f09a212a8Daniel Dunbar} 31041b5b17445ab3bdf957ebd4be6c8670f09a212a8Daniel Dunbar 31141b5b17445ab3bdf957ebd4be6c8670f09a212a8Daniel Dunbarint cc1as_main(const char **ArgBegin, const char **ArgEnd, 31241b5b17445ab3bdf957ebd4be6c8670f09a212a8Daniel Dunbar const char *Argv0, void *MainAddr) { 31341b5b17445ab3bdf957ebd4be6c8670f09a212a8Daniel Dunbar // Print a stack trace if we signal out. 31441b5b17445ab3bdf957ebd4be6c8670f09a212a8Daniel Dunbar sys::PrintStackTraceOnErrorSignal(); 31541b5b17445ab3bdf957ebd4be6c8670f09a212a8Daniel Dunbar PrettyStackTraceProgram X(ArgEnd - ArgBegin, ArgBegin); 31641b5b17445ab3bdf957ebd4be6c8670f09a212a8Daniel Dunbar llvm_shutdown_obj Y; // Call llvm_shutdown() on exit. 31741b5b17445ab3bdf957ebd4be6c8670f09a212a8Daniel Dunbar 31841b5b17445ab3bdf957ebd4be6c8670f09a212a8Daniel Dunbar // Initialize targets and assembly printers/parsers. 31941b5b17445ab3bdf957ebd4be6c8670f09a212a8Daniel Dunbar InitializeAllTargetInfos(); 32041b5b17445ab3bdf957ebd4be6c8670f09a212a8Daniel Dunbar // FIXME: We shouldn't need to initialize the Target(Machine)s. 32141b5b17445ab3bdf957ebd4be6c8670f09a212a8Daniel Dunbar InitializeAllTargets(); 32241b5b17445ab3bdf957ebd4be6c8670f09a212a8Daniel Dunbar InitializeAllAsmPrinters(); 32341b5b17445ab3bdf957ebd4be6c8670f09a212a8Daniel Dunbar InitializeAllAsmParsers(); 32441b5b17445ab3bdf957ebd4be6c8670f09a212a8Daniel Dunbar 32541b5b17445ab3bdf957ebd4be6c8670f09a212a8Daniel Dunbar // Construct our diagnostic client. 326bdbb004f38978da0c4a75af3294d1c7b5ff84af1Douglas Gregor TextDiagnosticPrinter *DiagClient 327bdbb004f38978da0c4a75af3294d1c7b5ff84af1Douglas Gregor = new TextDiagnosticPrinter(errs(), DiagnosticOptions()); 328bdbb004f38978da0c4a75af3294d1c7b5ff84af1Douglas Gregor DiagClient->setPrefix("clang -cc1as"); 32933e4e70c8c0a17e0ccb7465d96556b077a68ecb1Argyrios Kyrtzidis llvm::IntrusiveRefCntPtr<DiagnosticIDs> DiagID(new DiagnosticIDs()); 33033e4e70c8c0a17e0ccb7465d96556b077a68ecb1Argyrios Kyrtzidis Diagnostic Diags(DiagID, DiagClient); 33141b5b17445ab3bdf957ebd4be6c8670f09a212a8Daniel Dunbar 33241b5b17445ab3bdf957ebd4be6c8670f09a212a8Daniel Dunbar // Set an error handler, so that any LLVM backend diagnostics go through our 33341b5b17445ab3bdf957ebd4be6c8670f09a212a8Daniel Dunbar // error handler. 334726578c22e9e33774435257664f8f6dc4cf8dfa9Dan Gohman ScopedFatalErrorHandler FatalErrorHandler 335726578c22e9e33774435257664f8f6dc4cf8dfa9Dan Gohman (LLVMErrorHandler, static_cast<void*>(&Diags)); 33641b5b17445ab3bdf957ebd4be6c8670f09a212a8Daniel Dunbar 33741b5b17445ab3bdf957ebd4be6c8670f09a212a8Daniel Dunbar // Parse the arguments. 33841b5b17445ab3bdf957ebd4be6c8670f09a212a8Daniel Dunbar AssemblerInvocation Asm; 33941b5b17445ab3bdf957ebd4be6c8670f09a212a8Daniel Dunbar AssemblerInvocation::CreateFromArgs(Asm, ArgBegin, ArgEnd, Diags); 34041b5b17445ab3bdf957ebd4be6c8670f09a212a8Daniel Dunbar 341c673af7fe67e5db4d10dd414237df247d35dd9d9Daniel Dunbar // Honor -help. 342c673af7fe67e5db4d10dd414237df247d35dd9d9Daniel Dunbar if (Asm.ShowHelp) { 343c673af7fe67e5db4d10dd414237df247d35dd9d9Daniel Dunbar llvm::OwningPtr<driver::OptTable> Opts(driver::createCC1AsOptTable()); 344c673af7fe67e5db4d10dd414237df247d35dd9d9Daniel Dunbar Opts->PrintHelp(llvm::outs(), "clang -cc1as", "Clang Integrated Assembler"); 345c673af7fe67e5db4d10dd414237df247d35dd9d9Daniel Dunbar return 0; 346c673af7fe67e5db4d10dd414237df247d35dd9d9Daniel Dunbar } 347c673af7fe67e5db4d10dd414237df247d35dd9d9Daniel Dunbar 348c673af7fe67e5db4d10dd414237df247d35dd9d9Daniel Dunbar // Honor -version. 349c673af7fe67e5db4d10dd414237df247d35dd9d9Daniel Dunbar // 350c673af7fe67e5db4d10dd414237df247d35dd9d9Daniel Dunbar // FIXME: Use a better -version message? 351c673af7fe67e5db4d10dd414237df247d35dd9d9Daniel Dunbar if (Asm.ShowVersion) { 352c673af7fe67e5db4d10dd414237df247d35dd9d9Daniel Dunbar llvm::cl::PrintVersionMessage(); 353c673af7fe67e5db4d10dd414237df247d35dd9d9Daniel Dunbar return 0; 354c673af7fe67e5db4d10dd414237df247d35dd9d9Daniel Dunbar } 355c673af7fe67e5db4d10dd414237df247d35dd9d9Daniel Dunbar 356c673af7fe67e5db4d10dd414237df247d35dd9d9Daniel Dunbar // Honor -mllvm. 357c673af7fe67e5db4d10dd414237df247d35dd9d9Daniel Dunbar // 358c673af7fe67e5db4d10dd414237df247d35dd9d9Daniel Dunbar // FIXME: Remove this, one day. 359c673af7fe67e5db4d10dd414237df247d35dd9d9Daniel Dunbar if (!Asm.LLVMArgs.empty()) { 360c673af7fe67e5db4d10dd414237df247d35dd9d9Daniel Dunbar unsigned NumArgs = Asm.LLVMArgs.size(); 361c673af7fe67e5db4d10dd414237df247d35dd9d9Daniel Dunbar const char **Args = new const char*[NumArgs + 2]; 362c673af7fe67e5db4d10dd414237df247d35dd9d9Daniel Dunbar Args[0] = "clang (LLVM option parsing)"; 363c673af7fe67e5db4d10dd414237df247d35dd9d9Daniel Dunbar for (unsigned i = 0; i != NumArgs; ++i) 364c673af7fe67e5db4d10dd414237df247d35dd9d9Daniel Dunbar Args[i + 1] = Asm.LLVMArgs[i].c_str(); 365c673af7fe67e5db4d10dd414237df247d35dd9d9Daniel Dunbar Args[NumArgs + 1] = 0; 366c673af7fe67e5db4d10dd414237df247d35dd9d9Daniel Dunbar llvm::cl::ParseCommandLineOptions(NumArgs + 1, const_cast<char **>(Args)); 367c673af7fe67e5db4d10dd414237df247d35dd9d9Daniel Dunbar } 368c673af7fe67e5db4d10dd414237df247d35dd9d9Daniel Dunbar 36941b5b17445ab3bdf957ebd4be6c8670f09a212a8Daniel Dunbar // Execute the invocation, unless there were parsing errors. 37041b5b17445ab3bdf957ebd4be6c8670f09a212a8Daniel Dunbar bool Success = false; 371e8f0ba75a39b2fa2d34d14e8401ae96f43e1fc14Argyrios Kyrtzidis if (!Diags.hasErrorOccurred()) 37241b5b17445ab3bdf957ebd4be6c8670f09a212a8Daniel Dunbar Success = ExecuteAssembler(Asm, Diags); 37341b5b17445ab3bdf957ebd4be6c8670f09a212a8Daniel Dunbar 37441b5b17445ab3bdf957ebd4be6c8670f09a212a8Daniel Dunbar // If any timers were active but haven't been destroyed yet, print their 37541b5b17445ab3bdf957ebd4be6c8670f09a212a8Daniel Dunbar // results now. 37641b5b17445ab3bdf957ebd4be6c8670f09a212a8Daniel Dunbar TimerGroup::printAll(errs()); 37741b5b17445ab3bdf957ebd4be6c8670f09a212a8Daniel Dunbar 37841b5b17445ab3bdf957ebd4be6c8670f09a212a8Daniel Dunbar return !Success; 37941b5b17445ab3bdf957ebd4be6c8670f09a212a8Daniel Dunbar} 380