cc1as_main.cpp revision 3a321e23f66128dbb986343927456ff6702af617
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" 4203013fa9a0bf1ef4b907f5fec006c8f4000fdd21Michael J. Spencer#include "llvm/Support/Host.h" 4303013fa9a0bf1ef4b907f5fec006c8f4000fdd21Michael J. Spencer#include "llvm/Support/Path.h" 4403013fa9a0bf1ef4b907f5fec006c8f4000fdd21Michael J. Spencer#include "llvm/Support/Signals.h" 453a321e23f66128dbb986343927456ff6702af617Michael J. Spencer#include "llvm/Support/system_error.h" 4641b5b17445ab3bdf957ebd4be6c8670f09a212a8Daniel Dunbar#include "llvm/Target/TargetAsmBackend.h" 4741b5b17445ab3bdf957ebd4be6c8670f09a212a8Daniel Dunbar#include "llvm/Target/TargetAsmParser.h" 4841b5b17445ab3bdf957ebd4be6c8670f09a212a8Daniel Dunbar#include "llvm/Target/TargetData.h" 4941b5b17445ab3bdf957ebd4be6c8670f09a212a8Daniel Dunbar#include "llvm/Target/TargetMachine.h" 5041b5b17445ab3bdf957ebd4be6c8670f09a212a8Daniel Dunbar#include "llvm/Target/TargetRegistry.h" 5141b5b17445ab3bdf957ebd4be6c8670f09a212a8Daniel Dunbar#include "llvm/Target/TargetSelect.h" 5241b5b17445ab3bdf957ebd4be6c8670f09a212a8Daniel Dunbarusing namespace clang; 5341b5b17445ab3bdf957ebd4be6c8670f09a212a8Daniel Dunbarusing namespace clang::driver; 5441b5b17445ab3bdf957ebd4be6c8670f09a212a8Daniel Dunbarusing namespace llvm; 5541b5b17445ab3bdf957ebd4be6c8670f09a212a8Daniel Dunbar 5641b5b17445ab3bdf957ebd4be6c8670f09a212a8Daniel Dunbarnamespace { 5741b5b17445ab3bdf957ebd4be6c8670f09a212a8Daniel Dunbar 5841b5b17445ab3bdf957ebd4be6c8670f09a212a8Daniel Dunbar/// \brief Helper class for representing a single invocation of the assembler. 5941b5b17445ab3bdf957ebd4be6c8670f09a212a8Daniel Dunbarstruct AssemblerInvocation { 6041b5b17445ab3bdf957ebd4be6c8670f09a212a8Daniel Dunbar /// @name Target Options 6141b5b17445ab3bdf957ebd4be6c8670f09a212a8Daniel Dunbar /// @{ 6241b5b17445ab3bdf957ebd4be6c8670f09a212a8Daniel Dunbar 6341b5b17445ab3bdf957ebd4be6c8670f09a212a8Daniel Dunbar std::string Triple; 6441b5b17445ab3bdf957ebd4be6c8670f09a212a8Daniel Dunbar 6541b5b17445ab3bdf957ebd4be6c8670f09a212a8Daniel Dunbar /// @} 6641b5b17445ab3bdf957ebd4be6c8670f09a212a8Daniel Dunbar /// @name Language Options 6741b5b17445ab3bdf957ebd4be6c8670f09a212a8Daniel Dunbar /// @{ 6841b5b17445ab3bdf957ebd4be6c8670f09a212a8Daniel Dunbar 6941b5b17445ab3bdf957ebd4be6c8670f09a212a8Daniel Dunbar std::vector<std::string> IncludePaths; 7041b5b17445ab3bdf957ebd4be6c8670f09a212a8Daniel Dunbar unsigned NoInitialTextSection : 1; 7141b5b17445ab3bdf957ebd4be6c8670f09a212a8Daniel Dunbar 7241b5b17445ab3bdf957ebd4be6c8670f09a212a8Daniel Dunbar /// @} 7341b5b17445ab3bdf957ebd4be6c8670f09a212a8Daniel Dunbar /// @name Frontend Options 7441b5b17445ab3bdf957ebd4be6c8670f09a212a8Daniel Dunbar /// @{ 7541b5b17445ab3bdf957ebd4be6c8670f09a212a8Daniel Dunbar 7641b5b17445ab3bdf957ebd4be6c8670f09a212a8Daniel Dunbar std::string InputFile; 77c673af7fe67e5db4d10dd414237df247d35dd9d9Daniel Dunbar std::vector<std::string> LLVMArgs; 7841b5b17445ab3bdf957ebd4be6c8670f09a212a8Daniel Dunbar std::string OutputPath; 7941b5b17445ab3bdf957ebd4be6c8670f09a212a8Daniel Dunbar enum FileType { 8041b5b17445ab3bdf957ebd4be6c8670f09a212a8Daniel Dunbar FT_Asm, ///< Assembly (.s) output, transliterate mode. 8141b5b17445ab3bdf957ebd4be6c8670f09a212a8Daniel Dunbar FT_Null, ///< No output, for timing purposes. 8241b5b17445ab3bdf957ebd4be6c8670f09a212a8Daniel Dunbar FT_Obj ///< Object file output. 8341b5b17445ab3bdf957ebd4be6c8670f09a212a8Daniel Dunbar }; 8441b5b17445ab3bdf957ebd4be6c8670f09a212a8Daniel Dunbar FileType OutputType; 85c673af7fe67e5db4d10dd414237df247d35dd9d9Daniel Dunbar unsigned ShowHelp : 1; 86c673af7fe67e5db4d10dd414237df247d35dd9d9Daniel Dunbar unsigned ShowVersion : 1; 8741b5b17445ab3bdf957ebd4be6c8670f09a212a8Daniel Dunbar 8841b5b17445ab3bdf957ebd4be6c8670f09a212a8Daniel Dunbar /// @} 8941b5b17445ab3bdf957ebd4be6c8670f09a212a8Daniel Dunbar /// @name Transliterate Options 9041b5b17445ab3bdf957ebd4be6c8670f09a212a8Daniel Dunbar /// @{ 9141b5b17445ab3bdf957ebd4be6c8670f09a212a8Daniel Dunbar 9241b5b17445ab3bdf957ebd4be6c8670f09a212a8Daniel Dunbar unsigned OutputAsmVariant; 9341b5b17445ab3bdf957ebd4be6c8670f09a212a8Daniel Dunbar unsigned ShowEncoding : 1; 9441b5b17445ab3bdf957ebd4be6c8670f09a212a8Daniel Dunbar unsigned ShowInst : 1; 9541b5b17445ab3bdf957ebd4be6c8670f09a212a8Daniel Dunbar 9641b5b17445ab3bdf957ebd4be6c8670f09a212a8Daniel Dunbar /// @} 9741b5b17445ab3bdf957ebd4be6c8670f09a212a8Daniel Dunbar /// @name Assembler Options 9841b5b17445ab3bdf957ebd4be6c8670f09a212a8Daniel Dunbar /// @{ 9941b5b17445ab3bdf957ebd4be6c8670f09a212a8Daniel Dunbar 10041b5b17445ab3bdf957ebd4be6c8670f09a212a8Daniel Dunbar unsigned RelaxAll : 1; 10141b5b17445ab3bdf957ebd4be6c8670f09a212a8Daniel Dunbar 10241b5b17445ab3bdf957ebd4be6c8670f09a212a8Daniel Dunbar /// @} 10341b5b17445ab3bdf957ebd4be6c8670f09a212a8Daniel Dunbar 10441b5b17445ab3bdf957ebd4be6c8670f09a212a8Daniel Dunbarpublic: 10541b5b17445ab3bdf957ebd4be6c8670f09a212a8Daniel Dunbar AssemblerInvocation() { 10641b5b17445ab3bdf957ebd4be6c8670f09a212a8Daniel Dunbar Triple = ""; 10741b5b17445ab3bdf957ebd4be6c8670f09a212a8Daniel Dunbar NoInitialTextSection = 0; 10841b5b17445ab3bdf957ebd4be6c8670f09a212a8Daniel Dunbar InputFile = "-"; 109c673af7fe67e5db4d10dd414237df247d35dd9d9Daniel Dunbar OutputPath = "-"; 11041b5b17445ab3bdf957ebd4be6c8670f09a212a8Daniel Dunbar OutputType = FT_Asm; 11141b5b17445ab3bdf957ebd4be6c8670f09a212a8Daniel Dunbar OutputAsmVariant = 0; 11241b5b17445ab3bdf957ebd4be6c8670f09a212a8Daniel Dunbar ShowInst = 0; 11341b5b17445ab3bdf957ebd4be6c8670f09a212a8Daniel Dunbar ShowEncoding = 0; 11441b5b17445ab3bdf957ebd4be6c8670f09a212a8Daniel Dunbar RelaxAll = 0; 11541b5b17445ab3bdf957ebd4be6c8670f09a212a8Daniel Dunbar } 11641b5b17445ab3bdf957ebd4be6c8670f09a212a8Daniel Dunbar 11741b5b17445ab3bdf957ebd4be6c8670f09a212a8Daniel Dunbar static void CreateFromArgs(AssemblerInvocation &Res, const char **ArgBegin, 11841b5b17445ab3bdf957ebd4be6c8670f09a212a8Daniel Dunbar const char **ArgEnd, Diagnostic &Diags); 11941b5b17445ab3bdf957ebd4be6c8670f09a212a8Daniel Dunbar}; 12041b5b17445ab3bdf957ebd4be6c8670f09a212a8Daniel Dunbar 12141b5b17445ab3bdf957ebd4be6c8670f09a212a8Daniel Dunbar} 12241b5b17445ab3bdf957ebd4be6c8670f09a212a8Daniel Dunbar 12341b5b17445ab3bdf957ebd4be6c8670f09a212a8Daniel Dunbarvoid AssemblerInvocation::CreateFromArgs(AssemblerInvocation &Opts, 12441b5b17445ab3bdf957ebd4be6c8670f09a212a8Daniel Dunbar const char **ArgBegin, 12541b5b17445ab3bdf957ebd4be6c8670f09a212a8Daniel Dunbar const char **ArgEnd, 12641b5b17445ab3bdf957ebd4be6c8670f09a212a8Daniel Dunbar Diagnostic &Diags) { 12741b5b17445ab3bdf957ebd4be6c8670f09a212a8Daniel Dunbar using namespace clang::driver::cc1asoptions; 12841b5b17445ab3bdf957ebd4be6c8670f09a212a8Daniel Dunbar // Parse the arguments. 12941b5b17445ab3bdf957ebd4be6c8670f09a212a8Daniel Dunbar OwningPtr<OptTable> OptTbl(createCC1AsOptTable()); 13041b5b17445ab3bdf957ebd4be6c8670f09a212a8Daniel Dunbar unsigned MissingArgIndex, MissingArgCount; 13141b5b17445ab3bdf957ebd4be6c8670f09a212a8Daniel Dunbar OwningPtr<InputArgList> Args( 13241b5b17445ab3bdf957ebd4be6c8670f09a212a8Daniel Dunbar OptTbl->ParseArgs(ArgBegin, ArgEnd,MissingArgIndex, MissingArgCount)); 13341b5b17445ab3bdf957ebd4be6c8670f09a212a8Daniel Dunbar 13441b5b17445ab3bdf957ebd4be6c8670f09a212a8Daniel Dunbar // Check for missing argument error. 13541b5b17445ab3bdf957ebd4be6c8670f09a212a8Daniel Dunbar if (MissingArgCount) 13641b5b17445ab3bdf957ebd4be6c8670f09a212a8Daniel Dunbar Diags.Report(diag::err_drv_missing_argument) 13741b5b17445ab3bdf957ebd4be6c8670f09a212a8Daniel Dunbar << Args->getArgString(MissingArgIndex) << MissingArgCount; 13841b5b17445ab3bdf957ebd4be6c8670f09a212a8Daniel Dunbar 13941b5b17445ab3bdf957ebd4be6c8670f09a212a8Daniel Dunbar // Issue errors on unknown arguments. 14041b5b17445ab3bdf957ebd4be6c8670f09a212a8Daniel Dunbar for (arg_iterator it = Args->filtered_begin(cc1asoptions::OPT_UNKNOWN), 14141b5b17445ab3bdf957ebd4be6c8670f09a212a8Daniel Dunbar ie = Args->filtered_end(); it != ie; ++it) 1427e4953e5c60409007545288f14b430bd23d68570Daniel Dunbar Diags.Report(diag::err_drv_unknown_argument) << (*it) ->getAsString(*Args); 14341b5b17445ab3bdf957ebd4be6c8670f09a212a8Daniel Dunbar 14441b5b17445ab3bdf957ebd4be6c8670f09a212a8Daniel Dunbar // Construct the invocation. 14541b5b17445ab3bdf957ebd4be6c8670f09a212a8Daniel Dunbar 14641b5b17445ab3bdf957ebd4be6c8670f09a212a8Daniel Dunbar // Target Options 1472dc14532b641bae011a374e2c6c393d2196c1411Duncan Sands Opts.Triple = Triple::normalize(Args->getLastArgValue(OPT_triple)); 14841b5b17445ab3bdf957ebd4be6c8670f09a212a8Daniel Dunbar if (Opts.Triple.empty()) // Use the host triple if unspecified. 14941b5b17445ab3bdf957ebd4be6c8670f09a212a8Daniel Dunbar Opts.Triple = sys::getHostTriple(); 15041b5b17445ab3bdf957ebd4be6c8670f09a212a8Daniel Dunbar 15141b5b17445ab3bdf957ebd4be6c8670f09a212a8Daniel Dunbar // Language Options 15241b5b17445ab3bdf957ebd4be6c8670f09a212a8Daniel Dunbar Opts.IncludePaths = Args->getAllArgValues(OPT_I); 15341b5b17445ab3bdf957ebd4be6c8670f09a212a8Daniel Dunbar Opts.NoInitialTextSection = Args->hasArg(OPT_n); 15441b5b17445ab3bdf957ebd4be6c8670f09a212a8Daniel Dunbar 15541b5b17445ab3bdf957ebd4be6c8670f09a212a8Daniel Dunbar // Frontend Options 15641b5b17445ab3bdf957ebd4be6c8670f09a212a8Daniel Dunbar if (Args->hasArg(OPT_INPUT)) { 15741b5b17445ab3bdf957ebd4be6c8670f09a212a8Daniel Dunbar bool First = true; 15841b5b17445ab3bdf957ebd4be6c8670f09a212a8Daniel Dunbar for (arg_iterator it = Args->filtered_begin(OPT_INPUT), 15941b5b17445ab3bdf957ebd4be6c8670f09a212a8Daniel Dunbar ie = Args->filtered_end(); it != ie; ++it, First=false) { 1607e4953e5c60409007545288f14b430bd23d68570Daniel Dunbar const Arg *A = it; 16141b5b17445ab3bdf957ebd4be6c8670f09a212a8Daniel Dunbar if (First) 1627e4953e5c60409007545288f14b430bd23d68570Daniel Dunbar Opts.InputFile = A->getValue(*Args); 16341b5b17445ab3bdf957ebd4be6c8670f09a212a8Daniel Dunbar else 1647e4953e5c60409007545288f14b430bd23d68570Daniel Dunbar Diags.Report(diag::err_drv_unknown_argument) << A->getAsString(*Args); 16541b5b17445ab3bdf957ebd4be6c8670f09a212a8Daniel Dunbar } 16641b5b17445ab3bdf957ebd4be6c8670f09a212a8Daniel Dunbar } 167c673af7fe67e5db4d10dd414237df247d35dd9d9Daniel Dunbar Opts.LLVMArgs = Args->getAllArgValues(OPT_mllvm); 16841b5b17445ab3bdf957ebd4be6c8670f09a212a8Daniel Dunbar Opts.OutputPath = Args->getLastArgValue(OPT_o); 16941b5b17445ab3bdf957ebd4be6c8670f09a212a8Daniel Dunbar if (Arg *A = Args->getLastArg(OPT_filetype)) { 17041b5b17445ab3bdf957ebd4be6c8670f09a212a8Daniel Dunbar StringRef Name = A->getValue(*Args); 17141b5b17445ab3bdf957ebd4be6c8670f09a212a8Daniel Dunbar unsigned OutputType = StringSwitch<unsigned>(Name) 17241b5b17445ab3bdf957ebd4be6c8670f09a212a8Daniel Dunbar .Case("asm", FT_Asm) 17341b5b17445ab3bdf957ebd4be6c8670f09a212a8Daniel Dunbar .Case("null", FT_Null) 17441b5b17445ab3bdf957ebd4be6c8670f09a212a8Daniel Dunbar .Case("obj", FT_Obj) 17541b5b17445ab3bdf957ebd4be6c8670f09a212a8Daniel Dunbar .Default(~0U); 17641b5b17445ab3bdf957ebd4be6c8670f09a212a8Daniel Dunbar if (OutputType == ~0U) 17741b5b17445ab3bdf957ebd4be6c8670f09a212a8Daniel Dunbar Diags.Report(diag::err_drv_invalid_value) 17841b5b17445ab3bdf957ebd4be6c8670f09a212a8Daniel Dunbar << A->getAsString(*Args) << Name; 17941b5b17445ab3bdf957ebd4be6c8670f09a212a8Daniel Dunbar else 18041b5b17445ab3bdf957ebd4be6c8670f09a212a8Daniel Dunbar Opts.OutputType = FileType(OutputType); 18141b5b17445ab3bdf957ebd4be6c8670f09a212a8Daniel Dunbar } 182c673af7fe67e5db4d10dd414237df247d35dd9d9Daniel Dunbar Opts.ShowHelp = Args->hasArg(OPT_help); 183c673af7fe67e5db4d10dd414237df247d35dd9d9Daniel Dunbar Opts.ShowVersion = Args->hasArg(OPT_version); 18441b5b17445ab3bdf957ebd4be6c8670f09a212a8Daniel Dunbar 18541b5b17445ab3bdf957ebd4be6c8670f09a212a8Daniel Dunbar // Transliterate Options 18641b5b17445ab3bdf957ebd4be6c8670f09a212a8Daniel Dunbar Opts.OutputAsmVariant = Args->getLastArgIntValue(OPT_output_asm_variant, 18741b5b17445ab3bdf957ebd4be6c8670f09a212a8Daniel Dunbar 0, Diags); 18841b5b17445ab3bdf957ebd4be6c8670f09a212a8Daniel Dunbar Opts.ShowEncoding = Args->hasArg(OPT_show_encoding); 18941b5b17445ab3bdf957ebd4be6c8670f09a212a8Daniel Dunbar Opts.ShowInst = Args->hasArg(OPT_show_inst); 19041b5b17445ab3bdf957ebd4be6c8670f09a212a8Daniel Dunbar 19141b5b17445ab3bdf957ebd4be6c8670f09a212a8Daniel Dunbar // Assemble Options 19241b5b17445ab3bdf957ebd4be6c8670f09a212a8Daniel Dunbar Opts.RelaxAll = Args->hasArg(OPT_relax_all); 19341b5b17445ab3bdf957ebd4be6c8670f09a212a8Daniel Dunbar} 19441b5b17445ab3bdf957ebd4be6c8670f09a212a8Daniel Dunbar 19541b5b17445ab3bdf957ebd4be6c8670f09a212a8Daniel Dunbarstatic formatted_raw_ostream *GetOutputStream(AssemblerInvocation &Opts, 19641b5b17445ab3bdf957ebd4be6c8670f09a212a8Daniel Dunbar Diagnostic &Diags, 19741b5b17445ab3bdf957ebd4be6c8670f09a212a8Daniel Dunbar bool Binary) { 198c673af7fe67e5db4d10dd414237df247d35dd9d9Daniel Dunbar if (Opts.OutputPath.empty()) 199c673af7fe67e5db4d10dd414237df247d35dd9d9Daniel Dunbar Opts.OutputPath = "-"; 200c673af7fe67e5db4d10dd414237df247d35dd9d9Daniel Dunbar 20141b5b17445ab3bdf957ebd4be6c8670f09a212a8Daniel Dunbar // Make sure that the Out file gets unlinked from the disk if we get a 20241b5b17445ab3bdf957ebd4be6c8670f09a212a8Daniel Dunbar // SIGINT. 20341b5b17445ab3bdf957ebd4be6c8670f09a212a8Daniel Dunbar if (Opts.OutputPath != "-") 20441b5b17445ab3bdf957ebd4be6c8670f09a212a8Daniel Dunbar sys::RemoveFileOnSignal(sys::Path(Opts.OutputPath)); 20541b5b17445ab3bdf957ebd4be6c8670f09a212a8Daniel Dunbar 20641b5b17445ab3bdf957ebd4be6c8670f09a212a8Daniel Dunbar std::string Error; 20741b5b17445ab3bdf957ebd4be6c8670f09a212a8Daniel Dunbar raw_fd_ostream *Out = 20841b5b17445ab3bdf957ebd4be6c8670f09a212a8Daniel Dunbar new raw_fd_ostream(Opts.OutputPath.c_str(), Error, 20941b5b17445ab3bdf957ebd4be6c8670f09a212a8Daniel Dunbar (Binary ? raw_fd_ostream::F_Binary : 0)); 21041b5b17445ab3bdf957ebd4be6c8670f09a212a8Daniel Dunbar if (!Error.empty()) { 21141b5b17445ab3bdf957ebd4be6c8670f09a212a8Daniel Dunbar Diags.Report(diag::err_fe_unable_to_open_output) 21241b5b17445ab3bdf957ebd4be6c8670f09a212a8Daniel Dunbar << Opts.OutputPath << Error; 21341b5b17445ab3bdf957ebd4be6c8670f09a212a8Daniel Dunbar return 0; 21441b5b17445ab3bdf957ebd4be6c8670f09a212a8Daniel Dunbar } 21541b5b17445ab3bdf957ebd4be6c8670f09a212a8Daniel Dunbar 21641b5b17445ab3bdf957ebd4be6c8670f09a212a8Daniel Dunbar return new formatted_raw_ostream(*Out, formatted_raw_ostream::DELETE_STREAM); 21741b5b17445ab3bdf957ebd4be6c8670f09a212a8Daniel Dunbar} 21841b5b17445ab3bdf957ebd4be6c8670f09a212a8Daniel Dunbar 21941b5b17445ab3bdf957ebd4be6c8670f09a212a8Daniel Dunbarstatic bool ExecuteAssembler(AssemblerInvocation &Opts, Diagnostic &Diags) { 22041b5b17445ab3bdf957ebd4be6c8670f09a212a8Daniel Dunbar // Get the target specific parser. 22141b5b17445ab3bdf957ebd4be6c8670f09a212a8Daniel Dunbar std::string Error; 22241b5b17445ab3bdf957ebd4be6c8670f09a212a8Daniel Dunbar const Target *TheTarget(TargetRegistry::lookupTarget(Opts.Triple, Error)); 22341b5b17445ab3bdf957ebd4be6c8670f09a212a8Daniel Dunbar if (!TheTarget) { 22441b5b17445ab3bdf957ebd4be6c8670f09a212a8Daniel Dunbar Diags.Report(diag::err_target_unknown_triple) << Opts.Triple; 22541b5b17445ab3bdf957ebd4be6c8670f09a212a8Daniel Dunbar return false; 22641b5b17445ab3bdf957ebd4be6c8670f09a212a8Daniel Dunbar } 22741b5b17445ab3bdf957ebd4be6c8670f09a212a8Daniel Dunbar 2283a321e23f66128dbb986343927456ff6702af617Michael J. Spencer error_code ec; 2293a321e23f66128dbb986343927456ff6702af617Michael J. Spencer MemoryBuffer *Buffer = MemoryBuffer::getFileOrSTDIN(Opts.InputFile, ec); 23041b5b17445ab3bdf957ebd4be6c8670f09a212a8Daniel Dunbar if (Buffer == 0) { 2313a321e23f66128dbb986343927456ff6702af617Michael J. Spencer Error = ec.message(); 23241b5b17445ab3bdf957ebd4be6c8670f09a212a8Daniel Dunbar Diags.Report(diag::err_fe_error_reading) << Opts.InputFile; 23341b5b17445ab3bdf957ebd4be6c8670f09a212a8Daniel Dunbar return false; 23441b5b17445ab3bdf957ebd4be6c8670f09a212a8Daniel Dunbar } 23541b5b17445ab3bdf957ebd4be6c8670f09a212a8Daniel Dunbar 23641b5b17445ab3bdf957ebd4be6c8670f09a212a8Daniel Dunbar SourceMgr SrcMgr; 23741b5b17445ab3bdf957ebd4be6c8670f09a212a8Daniel Dunbar 23841b5b17445ab3bdf957ebd4be6c8670f09a212a8Daniel Dunbar // Tell SrcMgr about this buffer, which is what the parser will pick up. 23941b5b17445ab3bdf957ebd4be6c8670f09a212a8Daniel Dunbar SrcMgr.AddNewSourceBuffer(Buffer, SMLoc()); 24041b5b17445ab3bdf957ebd4be6c8670f09a212a8Daniel Dunbar 24141b5b17445ab3bdf957ebd4be6c8670f09a212a8Daniel Dunbar // Record the location of the include directories so that the lexer can find 24241b5b17445ab3bdf957ebd4be6c8670f09a212a8Daniel Dunbar // it later. 24341b5b17445ab3bdf957ebd4be6c8670f09a212a8Daniel Dunbar SrcMgr.setIncludeDirs(Opts.IncludePaths); 24441b5b17445ab3bdf957ebd4be6c8670f09a212a8Daniel Dunbar 24541b5b17445ab3bdf957ebd4be6c8670f09a212a8Daniel Dunbar OwningPtr<MCAsmInfo> MAI(TheTarget->createAsmInfo(Opts.Triple)); 24641b5b17445ab3bdf957ebd4be6c8670f09a212a8Daniel Dunbar assert(MAI && "Unable to create target asm info!"); 24741b5b17445ab3bdf957ebd4be6c8670f09a212a8Daniel Dunbar 24841b5b17445ab3bdf957ebd4be6c8670f09a212a8Daniel Dunbar MCContext Ctx(*MAI); 24941b5b17445ab3bdf957ebd4be6c8670f09a212a8Daniel Dunbar bool IsBinary = Opts.OutputType == AssemblerInvocation::FT_Obj; 25041b5b17445ab3bdf957ebd4be6c8670f09a212a8Daniel Dunbar formatted_raw_ostream *Out = GetOutputStream(Opts, Diags, IsBinary); 25141b5b17445ab3bdf957ebd4be6c8670f09a212a8Daniel Dunbar if (!Out) 25241b5b17445ab3bdf957ebd4be6c8670f09a212a8Daniel Dunbar return false; 25341b5b17445ab3bdf957ebd4be6c8670f09a212a8Daniel Dunbar 25441b5b17445ab3bdf957ebd4be6c8670f09a212a8Daniel Dunbar // FIXME: We shouldn't need to do this (and link in codegen). 25541b5b17445ab3bdf957ebd4be6c8670f09a212a8Daniel Dunbar OwningPtr<TargetMachine> TM(TheTarget->createTargetMachine(Opts.Triple, "")); 25641b5b17445ab3bdf957ebd4be6c8670f09a212a8Daniel Dunbar if (!TM) { 25741b5b17445ab3bdf957ebd4be6c8670f09a212a8Daniel Dunbar Diags.Report(diag::err_target_unknown_triple) << Opts.Triple; 25841b5b17445ab3bdf957ebd4be6c8670f09a212a8Daniel Dunbar return false; 25941b5b17445ab3bdf957ebd4be6c8670f09a212a8Daniel Dunbar } 26041b5b17445ab3bdf957ebd4be6c8670f09a212a8Daniel Dunbar 26141b5b17445ab3bdf957ebd4be6c8670f09a212a8Daniel Dunbar OwningPtr<MCStreamer> Str; 26241b5b17445ab3bdf957ebd4be6c8670f09a212a8Daniel Dunbar 26341b5b17445ab3bdf957ebd4be6c8670f09a212a8Daniel Dunbar if (Opts.OutputType == AssemblerInvocation::FT_Asm) { 26441b5b17445ab3bdf957ebd4be6c8670f09a212a8Daniel Dunbar MCInstPrinter *IP = 26541b5b17445ab3bdf957ebd4be6c8670f09a212a8Daniel Dunbar TheTarget->createMCInstPrinter(Opts.OutputAsmVariant, *MAI); 2667ac3d5a9eac7a7d4ce1e47264f1e3ed66ebc9d4eBenjamin Kramer MCCodeEmitter *CE = 0; 26741b5b17445ab3bdf957ebd4be6c8670f09a212a8Daniel Dunbar if (Opts.ShowEncoding) 2687ac3d5a9eac7a7d4ce1e47264f1e3ed66ebc9d4eBenjamin Kramer CE = TheTarget->createCodeEmitter(*TM, Ctx); 26941b5b17445ab3bdf957ebd4be6c8670f09a212a8Daniel Dunbar Str.reset(createAsmStreamer(Ctx, *Out,TM->getTargetData()->isLittleEndian(), 2707ac3d5a9eac7a7d4ce1e47264f1e3ed66ebc9d4eBenjamin Kramer /*asmverbose*/true, IP, CE, Opts.ShowInst)); 27141b5b17445ab3bdf957ebd4be6c8670f09a212a8Daniel Dunbar } else if (Opts.OutputType == AssemblerInvocation::FT_Null) { 27241b5b17445ab3bdf957ebd4be6c8670f09a212a8Daniel Dunbar Str.reset(createNullStreamer(Ctx)); 27341b5b17445ab3bdf957ebd4be6c8670f09a212a8Daniel Dunbar } else { 27441b5b17445ab3bdf957ebd4be6c8670f09a212a8Daniel Dunbar assert(Opts.OutputType == AssemblerInvocation::FT_Obj && 27541b5b17445ab3bdf957ebd4be6c8670f09a212a8Daniel Dunbar "Invalid file type!"); 2767ac3d5a9eac7a7d4ce1e47264f1e3ed66ebc9d4eBenjamin Kramer MCCodeEmitter *CE = TheTarget->createCodeEmitter(*TM, Ctx); 2777ac3d5a9eac7a7d4ce1e47264f1e3ed66ebc9d4eBenjamin Kramer TargetAsmBackend *TAB = TheTarget->createAsmBackend(Opts.Triple); 2787ac3d5a9eac7a7d4ce1e47264f1e3ed66ebc9d4eBenjamin Kramer Str.reset(TheTarget->createObjectStreamer(Opts.Triple, Ctx, *TAB, *Out, 2797ac3d5a9eac7a7d4ce1e47264f1e3ed66ebc9d4eBenjamin Kramer CE, Opts.RelaxAll)); 2804f036fad0481a1bc996763b3e7c1d2f0019607f4Rafael Espindola Str.get()->InitSections(); 28141b5b17445ab3bdf957ebd4be6c8670f09a212a8Daniel Dunbar } 28241b5b17445ab3bdf957ebd4be6c8670f09a212a8Daniel Dunbar 2837374f1b407a86df83fde942ee9f3684a3159f99fDaniel Dunbar OwningPtr<MCAsmParser> Parser(createMCAsmParser(*TheTarget, SrcMgr, Ctx, 2847374f1b407a86df83fde942ee9f3684a3159f99fDaniel Dunbar *Str.get(), *MAI)); 285e9122a36c4c951c4cdce842dc8caf20874908cfdDaniel Dunbar OwningPtr<TargetAsmParser> TAP(TheTarget->createAsmParser(*Parser, *TM)); 28641b5b17445ab3bdf957ebd4be6c8670f09a212a8Daniel Dunbar if (!TAP) { 28741b5b17445ab3bdf957ebd4be6c8670f09a212a8Daniel Dunbar Diags.Report(diag::err_target_unknown_triple) << Opts.Triple; 28841b5b17445ab3bdf957ebd4be6c8670f09a212a8Daniel Dunbar return false; 28941b5b17445ab3bdf957ebd4be6c8670f09a212a8Daniel Dunbar } 29041b5b17445ab3bdf957ebd4be6c8670f09a212a8Daniel Dunbar 2917374f1b407a86df83fde942ee9f3684a3159f99fDaniel Dunbar Parser->setTargetParser(*TAP.get()); 29241b5b17445ab3bdf957ebd4be6c8670f09a212a8Daniel Dunbar 2937374f1b407a86df83fde942ee9f3684a3159f99fDaniel Dunbar bool Success = !Parser->Run(Opts.NoInitialTextSection); 29441b5b17445ab3bdf957ebd4be6c8670f09a212a8Daniel Dunbar 29541b5b17445ab3bdf957ebd4be6c8670f09a212a8Daniel Dunbar // Close the output. 29641b5b17445ab3bdf957ebd4be6c8670f09a212a8Daniel Dunbar delete Out; 29741b5b17445ab3bdf957ebd4be6c8670f09a212a8Daniel Dunbar 29841b5b17445ab3bdf957ebd4be6c8670f09a212a8Daniel Dunbar // Delete output on errors. 29941b5b17445ab3bdf957ebd4be6c8670f09a212a8Daniel Dunbar if (!Success && Opts.OutputPath != "-") 30041b5b17445ab3bdf957ebd4be6c8670f09a212a8Daniel Dunbar sys::Path(Opts.OutputPath).eraseFromDisk(); 30141b5b17445ab3bdf957ebd4be6c8670f09a212a8Daniel Dunbar 30241b5b17445ab3bdf957ebd4be6c8670f09a212a8Daniel Dunbar return Success; 30341b5b17445ab3bdf957ebd4be6c8670f09a212a8Daniel Dunbar} 30441b5b17445ab3bdf957ebd4be6c8670f09a212a8Daniel Dunbar 30541b5b17445ab3bdf957ebd4be6c8670f09a212a8Daniel Dunbarstatic void LLVMErrorHandler(void *UserData, const std::string &Message) { 30641b5b17445ab3bdf957ebd4be6c8670f09a212a8Daniel Dunbar Diagnostic &Diags = *static_cast<Diagnostic*>(UserData); 30741b5b17445ab3bdf957ebd4be6c8670f09a212a8Daniel Dunbar 30841b5b17445ab3bdf957ebd4be6c8670f09a212a8Daniel Dunbar Diags.Report(diag::err_fe_error_backend) << Message; 30941b5b17445ab3bdf957ebd4be6c8670f09a212a8Daniel Dunbar 31041b5b17445ab3bdf957ebd4be6c8670f09a212a8Daniel Dunbar // We cannot recover from llvm errors. 31141b5b17445ab3bdf957ebd4be6c8670f09a212a8Daniel Dunbar exit(1); 31241b5b17445ab3bdf957ebd4be6c8670f09a212a8Daniel Dunbar} 31341b5b17445ab3bdf957ebd4be6c8670f09a212a8Daniel Dunbar 31441b5b17445ab3bdf957ebd4be6c8670f09a212a8Daniel Dunbarint cc1as_main(const char **ArgBegin, const char **ArgEnd, 31541b5b17445ab3bdf957ebd4be6c8670f09a212a8Daniel Dunbar const char *Argv0, void *MainAddr) { 31641b5b17445ab3bdf957ebd4be6c8670f09a212a8Daniel Dunbar // Print a stack trace if we signal out. 31741b5b17445ab3bdf957ebd4be6c8670f09a212a8Daniel Dunbar sys::PrintStackTraceOnErrorSignal(); 31841b5b17445ab3bdf957ebd4be6c8670f09a212a8Daniel Dunbar PrettyStackTraceProgram X(ArgEnd - ArgBegin, ArgBegin); 31941b5b17445ab3bdf957ebd4be6c8670f09a212a8Daniel Dunbar llvm_shutdown_obj Y; // Call llvm_shutdown() on exit. 32041b5b17445ab3bdf957ebd4be6c8670f09a212a8Daniel Dunbar 32141b5b17445ab3bdf957ebd4be6c8670f09a212a8Daniel Dunbar // Initialize targets and assembly printers/parsers. 32241b5b17445ab3bdf957ebd4be6c8670f09a212a8Daniel Dunbar InitializeAllTargetInfos(); 32341b5b17445ab3bdf957ebd4be6c8670f09a212a8Daniel Dunbar // FIXME: We shouldn't need to initialize the Target(Machine)s. 32441b5b17445ab3bdf957ebd4be6c8670f09a212a8Daniel Dunbar InitializeAllTargets(); 32541b5b17445ab3bdf957ebd4be6c8670f09a212a8Daniel Dunbar InitializeAllAsmPrinters(); 32641b5b17445ab3bdf957ebd4be6c8670f09a212a8Daniel Dunbar InitializeAllAsmParsers(); 32741b5b17445ab3bdf957ebd4be6c8670f09a212a8Daniel Dunbar 32841b5b17445ab3bdf957ebd4be6c8670f09a212a8Daniel Dunbar // Construct our diagnostic client. 329bdbb004f38978da0c4a75af3294d1c7b5ff84af1Douglas Gregor TextDiagnosticPrinter *DiagClient 330bdbb004f38978da0c4a75af3294d1c7b5ff84af1Douglas Gregor = new TextDiagnosticPrinter(errs(), DiagnosticOptions()); 331bdbb004f38978da0c4a75af3294d1c7b5ff84af1Douglas Gregor DiagClient->setPrefix("clang -cc1as"); 33233e4e70c8c0a17e0ccb7465d96556b077a68ecb1Argyrios Kyrtzidis llvm::IntrusiveRefCntPtr<DiagnosticIDs> DiagID(new DiagnosticIDs()); 33333e4e70c8c0a17e0ccb7465d96556b077a68ecb1Argyrios Kyrtzidis Diagnostic Diags(DiagID, DiagClient); 33441b5b17445ab3bdf957ebd4be6c8670f09a212a8Daniel Dunbar 33541b5b17445ab3bdf957ebd4be6c8670f09a212a8Daniel Dunbar // Set an error handler, so that any LLVM backend diagnostics go through our 33641b5b17445ab3bdf957ebd4be6c8670f09a212a8Daniel Dunbar // error handler. 337726578c22e9e33774435257664f8f6dc4cf8dfa9Dan Gohman ScopedFatalErrorHandler FatalErrorHandler 338726578c22e9e33774435257664f8f6dc4cf8dfa9Dan Gohman (LLVMErrorHandler, static_cast<void*>(&Diags)); 33941b5b17445ab3bdf957ebd4be6c8670f09a212a8Daniel Dunbar 34041b5b17445ab3bdf957ebd4be6c8670f09a212a8Daniel Dunbar // Parse the arguments. 34141b5b17445ab3bdf957ebd4be6c8670f09a212a8Daniel Dunbar AssemblerInvocation Asm; 34241b5b17445ab3bdf957ebd4be6c8670f09a212a8Daniel Dunbar AssemblerInvocation::CreateFromArgs(Asm, ArgBegin, ArgEnd, Diags); 34341b5b17445ab3bdf957ebd4be6c8670f09a212a8Daniel Dunbar 344c673af7fe67e5db4d10dd414237df247d35dd9d9Daniel Dunbar // Honor -help. 345c673af7fe67e5db4d10dd414237df247d35dd9d9Daniel Dunbar if (Asm.ShowHelp) { 346c673af7fe67e5db4d10dd414237df247d35dd9d9Daniel Dunbar llvm::OwningPtr<driver::OptTable> Opts(driver::createCC1AsOptTable()); 347c673af7fe67e5db4d10dd414237df247d35dd9d9Daniel Dunbar Opts->PrintHelp(llvm::outs(), "clang -cc1as", "Clang Integrated Assembler"); 348c673af7fe67e5db4d10dd414237df247d35dd9d9Daniel Dunbar return 0; 349c673af7fe67e5db4d10dd414237df247d35dd9d9Daniel Dunbar } 350c673af7fe67e5db4d10dd414237df247d35dd9d9Daniel Dunbar 351c673af7fe67e5db4d10dd414237df247d35dd9d9Daniel Dunbar // Honor -version. 352c673af7fe67e5db4d10dd414237df247d35dd9d9Daniel Dunbar // 353c673af7fe67e5db4d10dd414237df247d35dd9d9Daniel Dunbar // FIXME: Use a better -version message? 354c673af7fe67e5db4d10dd414237df247d35dd9d9Daniel Dunbar if (Asm.ShowVersion) { 355c673af7fe67e5db4d10dd414237df247d35dd9d9Daniel Dunbar llvm::cl::PrintVersionMessage(); 356c673af7fe67e5db4d10dd414237df247d35dd9d9Daniel Dunbar return 0; 357c673af7fe67e5db4d10dd414237df247d35dd9d9Daniel Dunbar } 358c673af7fe67e5db4d10dd414237df247d35dd9d9Daniel Dunbar 359c673af7fe67e5db4d10dd414237df247d35dd9d9Daniel Dunbar // Honor -mllvm. 360c673af7fe67e5db4d10dd414237df247d35dd9d9Daniel Dunbar // 361c673af7fe67e5db4d10dd414237df247d35dd9d9Daniel Dunbar // FIXME: Remove this, one day. 362c673af7fe67e5db4d10dd414237df247d35dd9d9Daniel Dunbar if (!Asm.LLVMArgs.empty()) { 363c673af7fe67e5db4d10dd414237df247d35dd9d9Daniel Dunbar unsigned NumArgs = Asm.LLVMArgs.size(); 364c673af7fe67e5db4d10dd414237df247d35dd9d9Daniel Dunbar const char **Args = new const char*[NumArgs + 2]; 365c673af7fe67e5db4d10dd414237df247d35dd9d9Daniel Dunbar Args[0] = "clang (LLVM option parsing)"; 366c673af7fe67e5db4d10dd414237df247d35dd9d9Daniel Dunbar for (unsigned i = 0; i != NumArgs; ++i) 367c673af7fe67e5db4d10dd414237df247d35dd9d9Daniel Dunbar Args[i + 1] = Asm.LLVMArgs[i].c_str(); 368c673af7fe67e5db4d10dd414237df247d35dd9d9Daniel Dunbar Args[NumArgs + 1] = 0; 369c673af7fe67e5db4d10dd414237df247d35dd9d9Daniel Dunbar llvm::cl::ParseCommandLineOptions(NumArgs + 1, const_cast<char **>(Args)); 370c673af7fe67e5db4d10dd414237df247d35dd9d9Daniel Dunbar } 371c673af7fe67e5db4d10dd414237df247d35dd9d9Daniel Dunbar 37241b5b17445ab3bdf957ebd4be6c8670f09a212a8Daniel Dunbar // Execute the invocation, unless there were parsing errors. 37341b5b17445ab3bdf957ebd4be6c8670f09a212a8Daniel Dunbar bool Success = false; 374e8f0ba75a39b2fa2d34d14e8401ae96f43e1fc14Argyrios Kyrtzidis if (!Diags.hasErrorOccurred()) 37541b5b17445ab3bdf957ebd4be6c8670f09a212a8Daniel Dunbar Success = ExecuteAssembler(Asm, Diags); 37641b5b17445ab3bdf957ebd4be6c8670f09a212a8Daniel Dunbar 37741b5b17445ab3bdf957ebd4be6c8670f09a212a8Daniel Dunbar // If any timers were active but haven't been destroyed yet, print their 37841b5b17445ab3bdf957ebd4be6c8670f09a212a8Daniel Dunbar // results now. 37941b5b17445ab3bdf957ebd4be6c8670f09a212a8Daniel Dunbar TimerGroup::printAll(errs()); 38041b5b17445ab3bdf957ebd4be6c8670f09a212a8Daniel Dunbar 38141b5b17445ab3bdf957ebd4be6c8670f09a212a8Daniel Dunbar return !Success; 38241b5b17445ab3bdf957ebd4be6c8670f09a212a8Daniel Dunbar} 383