cc1as_main.cpp revision 7e4953e5c60409007545288f14b430bd23d68570
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" 2741b5b17445ab3bdf957ebd4be6c8670f09a212a8Daniel Dunbar#include "llvm/MC/MCParser/AsmParser.h" 2841b5b17445ab3bdf957ebd4be6c8670f09a212a8Daniel Dunbar#include "llvm/MC/MCCodeEmitter.h" 2941b5b17445ab3bdf957ebd4be6c8670f09a212a8Daniel Dunbar#include "llvm/MC/MCContext.h" 3041b5b17445ab3bdf957ebd4be6c8670f09a212a8Daniel Dunbar#include "llvm/MC/MCStreamer.h" 31c673af7fe67e5db4d10dd414237df247d35dd9d9Daniel Dunbar#include "llvm/Support/CommandLine.h" 3241b5b17445ab3bdf957ebd4be6c8670f09a212a8Daniel Dunbar#include "llvm/Support/FormattedStream.h" 3341b5b17445ab3bdf957ebd4be6c8670f09a212a8Daniel Dunbar#include "llvm/Support/ErrorHandling.h" 3441b5b17445ab3bdf957ebd4be6c8670f09a212a8Daniel Dunbar#include "llvm/Support/ManagedStatic.h" 3541b5b17445ab3bdf957ebd4be6c8670f09a212a8Daniel Dunbar#include "llvm/Support/MemoryBuffer.h" 3641b5b17445ab3bdf957ebd4be6c8670f09a212a8Daniel Dunbar#include "llvm/Support/PrettyStackTrace.h" 3741b5b17445ab3bdf957ebd4be6c8670f09a212a8Daniel Dunbar#include "llvm/Support/SourceMgr.h" 3841b5b17445ab3bdf957ebd4be6c8670f09a212a8Daniel Dunbar#include "llvm/Support/Timer.h" 3941b5b17445ab3bdf957ebd4be6c8670f09a212a8Daniel Dunbar#include "llvm/Support/raw_ostream.h" 4041b5b17445ab3bdf957ebd4be6c8670f09a212a8Daniel Dunbar#include "llvm/System/Host.h" 4141b5b17445ab3bdf957ebd4be6c8670f09a212a8Daniel Dunbar#include "llvm/System/Path.h" 4241b5b17445ab3bdf957ebd4be6c8670f09a212a8Daniel Dunbar#include "llvm/System/Signals.h" 4341b5b17445ab3bdf957ebd4be6c8670f09a212a8Daniel Dunbar#include "llvm/Target/TargetAsmBackend.h" 4441b5b17445ab3bdf957ebd4be6c8670f09a212a8Daniel Dunbar#include "llvm/Target/TargetAsmParser.h" 4541b5b17445ab3bdf957ebd4be6c8670f09a212a8Daniel Dunbar#include "llvm/Target/TargetData.h" 4641b5b17445ab3bdf957ebd4be6c8670f09a212a8Daniel Dunbar#include "llvm/Target/TargetMachine.h" 4741b5b17445ab3bdf957ebd4be6c8670f09a212a8Daniel Dunbar#include "llvm/Target/TargetRegistry.h" 4841b5b17445ab3bdf957ebd4be6c8670f09a212a8Daniel Dunbar#include "llvm/Target/TargetSelect.h" 4941b5b17445ab3bdf957ebd4be6c8670f09a212a8Daniel Dunbarusing namespace clang; 5041b5b17445ab3bdf957ebd4be6c8670f09a212a8Daniel Dunbarusing namespace clang::driver; 5141b5b17445ab3bdf957ebd4be6c8670f09a212a8Daniel Dunbarusing namespace llvm; 5241b5b17445ab3bdf957ebd4be6c8670f09a212a8Daniel Dunbar 5341b5b17445ab3bdf957ebd4be6c8670f09a212a8Daniel Dunbarnamespace { 5441b5b17445ab3bdf957ebd4be6c8670f09a212a8Daniel Dunbar 5541b5b17445ab3bdf957ebd4be6c8670f09a212a8Daniel Dunbar/// \brief Helper class for representing a single invocation of the assembler. 5641b5b17445ab3bdf957ebd4be6c8670f09a212a8Daniel Dunbarstruct AssemblerInvocation { 5741b5b17445ab3bdf957ebd4be6c8670f09a212a8Daniel Dunbar /// @name Target Options 5841b5b17445ab3bdf957ebd4be6c8670f09a212a8Daniel Dunbar /// @{ 5941b5b17445ab3bdf957ebd4be6c8670f09a212a8Daniel Dunbar 6041b5b17445ab3bdf957ebd4be6c8670f09a212a8Daniel Dunbar std::string Triple; 6141b5b17445ab3bdf957ebd4be6c8670f09a212a8Daniel Dunbar 6241b5b17445ab3bdf957ebd4be6c8670f09a212a8Daniel Dunbar /// @} 6341b5b17445ab3bdf957ebd4be6c8670f09a212a8Daniel Dunbar /// @name Language Options 6441b5b17445ab3bdf957ebd4be6c8670f09a212a8Daniel Dunbar /// @{ 6541b5b17445ab3bdf957ebd4be6c8670f09a212a8Daniel Dunbar 6641b5b17445ab3bdf957ebd4be6c8670f09a212a8Daniel Dunbar std::vector<std::string> IncludePaths; 6741b5b17445ab3bdf957ebd4be6c8670f09a212a8Daniel Dunbar unsigned NoInitialTextSection : 1; 6841b5b17445ab3bdf957ebd4be6c8670f09a212a8Daniel Dunbar 6941b5b17445ab3bdf957ebd4be6c8670f09a212a8Daniel Dunbar /// @} 7041b5b17445ab3bdf957ebd4be6c8670f09a212a8Daniel Dunbar /// @name Frontend Options 7141b5b17445ab3bdf957ebd4be6c8670f09a212a8Daniel Dunbar /// @{ 7241b5b17445ab3bdf957ebd4be6c8670f09a212a8Daniel Dunbar 7341b5b17445ab3bdf957ebd4be6c8670f09a212a8Daniel Dunbar std::string InputFile; 74c673af7fe67e5db4d10dd414237df247d35dd9d9Daniel Dunbar std::vector<std::string> LLVMArgs; 7541b5b17445ab3bdf957ebd4be6c8670f09a212a8Daniel Dunbar std::string OutputPath; 7641b5b17445ab3bdf957ebd4be6c8670f09a212a8Daniel Dunbar enum FileType { 7741b5b17445ab3bdf957ebd4be6c8670f09a212a8Daniel Dunbar FT_Asm, ///< Assembly (.s) output, transliterate mode. 7841b5b17445ab3bdf957ebd4be6c8670f09a212a8Daniel Dunbar FT_Null, ///< No output, for timing purposes. 7941b5b17445ab3bdf957ebd4be6c8670f09a212a8Daniel Dunbar FT_Obj ///< Object file output. 8041b5b17445ab3bdf957ebd4be6c8670f09a212a8Daniel Dunbar }; 8141b5b17445ab3bdf957ebd4be6c8670f09a212a8Daniel Dunbar FileType OutputType; 82c673af7fe67e5db4d10dd414237df247d35dd9d9Daniel Dunbar unsigned ShowHelp : 1; 83c673af7fe67e5db4d10dd414237df247d35dd9d9Daniel Dunbar unsigned ShowVersion : 1; 8441b5b17445ab3bdf957ebd4be6c8670f09a212a8Daniel Dunbar 8541b5b17445ab3bdf957ebd4be6c8670f09a212a8Daniel Dunbar /// @} 8641b5b17445ab3bdf957ebd4be6c8670f09a212a8Daniel Dunbar /// @name Transliterate Options 8741b5b17445ab3bdf957ebd4be6c8670f09a212a8Daniel Dunbar /// @{ 8841b5b17445ab3bdf957ebd4be6c8670f09a212a8Daniel Dunbar 8941b5b17445ab3bdf957ebd4be6c8670f09a212a8Daniel Dunbar unsigned OutputAsmVariant; 9041b5b17445ab3bdf957ebd4be6c8670f09a212a8Daniel Dunbar unsigned ShowEncoding : 1; 9141b5b17445ab3bdf957ebd4be6c8670f09a212a8Daniel Dunbar unsigned ShowInst : 1; 9241b5b17445ab3bdf957ebd4be6c8670f09a212a8Daniel Dunbar 9341b5b17445ab3bdf957ebd4be6c8670f09a212a8Daniel Dunbar /// @} 9441b5b17445ab3bdf957ebd4be6c8670f09a212a8Daniel Dunbar /// @name Assembler Options 9541b5b17445ab3bdf957ebd4be6c8670f09a212a8Daniel Dunbar /// @{ 9641b5b17445ab3bdf957ebd4be6c8670f09a212a8Daniel Dunbar 9741b5b17445ab3bdf957ebd4be6c8670f09a212a8Daniel Dunbar unsigned RelaxAll : 1; 9841b5b17445ab3bdf957ebd4be6c8670f09a212a8Daniel Dunbar 9941b5b17445ab3bdf957ebd4be6c8670f09a212a8Daniel Dunbar /// @} 10041b5b17445ab3bdf957ebd4be6c8670f09a212a8Daniel Dunbar 10141b5b17445ab3bdf957ebd4be6c8670f09a212a8Daniel Dunbarpublic: 10241b5b17445ab3bdf957ebd4be6c8670f09a212a8Daniel Dunbar AssemblerInvocation() { 10341b5b17445ab3bdf957ebd4be6c8670f09a212a8Daniel Dunbar Triple = ""; 10441b5b17445ab3bdf957ebd4be6c8670f09a212a8Daniel Dunbar NoInitialTextSection = 0; 10541b5b17445ab3bdf957ebd4be6c8670f09a212a8Daniel Dunbar InputFile = "-"; 106c673af7fe67e5db4d10dd414237df247d35dd9d9Daniel Dunbar OutputPath = "-"; 10741b5b17445ab3bdf957ebd4be6c8670f09a212a8Daniel Dunbar OutputType = FT_Asm; 10841b5b17445ab3bdf957ebd4be6c8670f09a212a8Daniel Dunbar OutputAsmVariant = 0; 10941b5b17445ab3bdf957ebd4be6c8670f09a212a8Daniel Dunbar ShowInst = 0; 11041b5b17445ab3bdf957ebd4be6c8670f09a212a8Daniel Dunbar ShowEncoding = 0; 11141b5b17445ab3bdf957ebd4be6c8670f09a212a8Daniel Dunbar RelaxAll = 0; 11241b5b17445ab3bdf957ebd4be6c8670f09a212a8Daniel Dunbar } 11341b5b17445ab3bdf957ebd4be6c8670f09a212a8Daniel Dunbar 11441b5b17445ab3bdf957ebd4be6c8670f09a212a8Daniel Dunbar static void CreateFromArgs(AssemblerInvocation &Res, const char **ArgBegin, 11541b5b17445ab3bdf957ebd4be6c8670f09a212a8Daniel Dunbar const char **ArgEnd, Diagnostic &Diags); 11641b5b17445ab3bdf957ebd4be6c8670f09a212a8Daniel Dunbar}; 11741b5b17445ab3bdf957ebd4be6c8670f09a212a8Daniel Dunbar 11841b5b17445ab3bdf957ebd4be6c8670f09a212a8Daniel Dunbar} 11941b5b17445ab3bdf957ebd4be6c8670f09a212a8Daniel Dunbar 12041b5b17445ab3bdf957ebd4be6c8670f09a212a8Daniel Dunbarvoid AssemblerInvocation::CreateFromArgs(AssemblerInvocation &Opts, 12141b5b17445ab3bdf957ebd4be6c8670f09a212a8Daniel Dunbar const char **ArgBegin, 12241b5b17445ab3bdf957ebd4be6c8670f09a212a8Daniel Dunbar const char **ArgEnd, 12341b5b17445ab3bdf957ebd4be6c8670f09a212a8Daniel Dunbar Diagnostic &Diags) { 12441b5b17445ab3bdf957ebd4be6c8670f09a212a8Daniel Dunbar using namespace clang::driver::cc1asoptions; 12541b5b17445ab3bdf957ebd4be6c8670f09a212a8Daniel Dunbar // Parse the arguments. 12641b5b17445ab3bdf957ebd4be6c8670f09a212a8Daniel Dunbar OwningPtr<OptTable> OptTbl(createCC1AsOptTable()); 12741b5b17445ab3bdf957ebd4be6c8670f09a212a8Daniel Dunbar unsigned MissingArgIndex, MissingArgCount; 12841b5b17445ab3bdf957ebd4be6c8670f09a212a8Daniel Dunbar OwningPtr<InputArgList> Args( 12941b5b17445ab3bdf957ebd4be6c8670f09a212a8Daniel Dunbar OptTbl->ParseArgs(ArgBegin, ArgEnd,MissingArgIndex, MissingArgCount)); 13041b5b17445ab3bdf957ebd4be6c8670f09a212a8Daniel Dunbar 13141b5b17445ab3bdf957ebd4be6c8670f09a212a8Daniel Dunbar // Check for missing argument error. 13241b5b17445ab3bdf957ebd4be6c8670f09a212a8Daniel Dunbar if (MissingArgCount) 13341b5b17445ab3bdf957ebd4be6c8670f09a212a8Daniel Dunbar Diags.Report(diag::err_drv_missing_argument) 13441b5b17445ab3bdf957ebd4be6c8670f09a212a8Daniel Dunbar << Args->getArgString(MissingArgIndex) << MissingArgCount; 13541b5b17445ab3bdf957ebd4be6c8670f09a212a8Daniel Dunbar 13641b5b17445ab3bdf957ebd4be6c8670f09a212a8Daniel Dunbar // Issue errors on unknown arguments. 13741b5b17445ab3bdf957ebd4be6c8670f09a212a8Daniel Dunbar for (arg_iterator it = Args->filtered_begin(cc1asoptions::OPT_UNKNOWN), 13841b5b17445ab3bdf957ebd4be6c8670f09a212a8Daniel Dunbar ie = Args->filtered_end(); it != ie; ++it) 1397e4953e5c60409007545288f14b430bd23d68570Daniel Dunbar Diags.Report(diag::err_drv_unknown_argument) << (*it) ->getAsString(*Args); 14041b5b17445ab3bdf957ebd4be6c8670f09a212a8Daniel Dunbar 14141b5b17445ab3bdf957ebd4be6c8670f09a212a8Daniel Dunbar // Construct the invocation. 14241b5b17445ab3bdf957ebd4be6c8670f09a212a8Daniel Dunbar 14341b5b17445ab3bdf957ebd4be6c8670f09a212a8Daniel Dunbar // Target Options 14441b5b17445ab3bdf957ebd4be6c8670f09a212a8Daniel Dunbar Opts.Triple = Args->getLastArgValue(OPT_triple); 14541b5b17445ab3bdf957ebd4be6c8670f09a212a8Daniel Dunbar if (Opts.Triple.empty()) // Use the host triple if unspecified. 14641b5b17445ab3bdf957ebd4be6c8670f09a212a8Daniel Dunbar Opts.Triple = sys::getHostTriple(); 14741b5b17445ab3bdf957ebd4be6c8670f09a212a8Daniel Dunbar 14841b5b17445ab3bdf957ebd4be6c8670f09a212a8Daniel Dunbar // Language Options 14941b5b17445ab3bdf957ebd4be6c8670f09a212a8Daniel Dunbar Opts.IncludePaths = Args->getAllArgValues(OPT_I); 15041b5b17445ab3bdf957ebd4be6c8670f09a212a8Daniel Dunbar Opts.NoInitialTextSection = Args->hasArg(OPT_n); 15141b5b17445ab3bdf957ebd4be6c8670f09a212a8Daniel Dunbar 15241b5b17445ab3bdf957ebd4be6c8670f09a212a8Daniel Dunbar // Frontend Options 15341b5b17445ab3bdf957ebd4be6c8670f09a212a8Daniel Dunbar if (Args->hasArg(OPT_INPUT)) { 15441b5b17445ab3bdf957ebd4be6c8670f09a212a8Daniel Dunbar bool First = true; 15541b5b17445ab3bdf957ebd4be6c8670f09a212a8Daniel Dunbar for (arg_iterator it = Args->filtered_begin(OPT_INPUT), 15641b5b17445ab3bdf957ebd4be6c8670f09a212a8Daniel Dunbar ie = Args->filtered_end(); it != ie; ++it, First=false) { 1577e4953e5c60409007545288f14b430bd23d68570Daniel Dunbar const Arg *A = it; 15841b5b17445ab3bdf957ebd4be6c8670f09a212a8Daniel Dunbar if (First) 1597e4953e5c60409007545288f14b430bd23d68570Daniel Dunbar Opts.InputFile = A->getValue(*Args); 16041b5b17445ab3bdf957ebd4be6c8670f09a212a8Daniel Dunbar else 1617e4953e5c60409007545288f14b430bd23d68570Daniel Dunbar Diags.Report(diag::err_drv_unknown_argument) << A->getAsString(*Args); 16241b5b17445ab3bdf957ebd4be6c8670f09a212a8Daniel Dunbar } 16341b5b17445ab3bdf957ebd4be6c8670f09a212a8Daniel Dunbar } 164c673af7fe67e5db4d10dd414237df247d35dd9d9Daniel Dunbar Opts.LLVMArgs = Args->getAllArgValues(OPT_mllvm); 16541b5b17445ab3bdf957ebd4be6c8670f09a212a8Daniel Dunbar Opts.OutputPath = Args->getLastArgValue(OPT_o); 16641b5b17445ab3bdf957ebd4be6c8670f09a212a8Daniel Dunbar if (Arg *A = Args->getLastArg(OPT_filetype)) { 16741b5b17445ab3bdf957ebd4be6c8670f09a212a8Daniel Dunbar StringRef Name = A->getValue(*Args); 16841b5b17445ab3bdf957ebd4be6c8670f09a212a8Daniel Dunbar unsigned OutputType = StringSwitch<unsigned>(Name) 16941b5b17445ab3bdf957ebd4be6c8670f09a212a8Daniel Dunbar .Case("asm", FT_Asm) 17041b5b17445ab3bdf957ebd4be6c8670f09a212a8Daniel Dunbar .Case("null", FT_Null) 17141b5b17445ab3bdf957ebd4be6c8670f09a212a8Daniel Dunbar .Case("obj", FT_Obj) 17241b5b17445ab3bdf957ebd4be6c8670f09a212a8Daniel Dunbar .Default(~0U); 17341b5b17445ab3bdf957ebd4be6c8670f09a212a8Daniel Dunbar if (OutputType == ~0U) 17441b5b17445ab3bdf957ebd4be6c8670f09a212a8Daniel Dunbar Diags.Report(diag::err_drv_invalid_value) 17541b5b17445ab3bdf957ebd4be6c8670f09a212a8Daniel Dunbar << A->getAsString(*Args) << Name; 17641b5b17445ab3bdf957ebd4be6c8670f09a212a8Daniel Dunbar else 17741b5b17445ab3bdf957ebd4be6c8670f09a212a8Daniel Dunbar Opts.OutputType = FileType(OutputType); 17841b5b17445ab3bdf957ebd4be6c8670f09a212a8Daniel Dunbar } 179c673af7fe67e5db4d10dd414237df247d35dd9d9Daniel Dunbar Opts.ShowHelp = Args->hasArg(OPT_help); 180c673af7fe67e5db4d10dd414237df247d35dd9d9Daniel Dunbar Opts.ShowVersion = Args->hasArg(OPT_version); 18141b5b17445ab3bdf957ebd4be6c8670f09a212a8Daniel Dunbar 18241b5b17445ab3bdf957ebd4be6c8670f09a212a8Daniel Dunbar // Transliterate Options 18341b5b17445ab3bdf957ebd4be6c8670f09a212a8Daniel Dunbar Opts.OutputAsmVariant = Args->getLastArgIntValue(OPT_output_asm_variant, 18441b5b17445ab3bdf957ebd4be6c8670f09a212a8Daniel Dunbar 0, Diags); 18541b5b17445ab3bdf957ebd4be6c8670f09a212a8Daniel Dunbar Opts.ShowEncoding = Args->hasArg(OPT_show_encoding); 18641b5b17445ab3bdf957ebd4be6c8670f09a212a8Daniel Dunbar Opts.ShowInst = Args->hasArg(OPT_show_inst); 18741b5b17445ab3bdf957ebd4be6c8670f09a212a8Daniel Dunbar 18841b5b17445ab3bdf957ebd4be6c8670f09a212a8Daniel Dunbar // Assemble Options 18941b5b17445ab3bdf957ebd4be6c8670f09a212a8Daniel Dunbar Opts.RelaxAll = Args->hasArg(OPT_relax_all); 19041b5b17445ab3bdf957ebd4be6c8670f09a212a8Daniel Dunbar} 19141b5b17445ab3bdf957ebd4be6c8670f09a212a8Daniel Dunbar 19241b5b17445ab3bdf957ebd4be6c8670f09a212a8Daniel Dunbarstatic formatted_raw_ostream *GetOutputStream(AssemblerInvocation &Opts, 19341b5b17445ab3bdf957ebd4be6c8670f09a212a8Daniel Dunbar Diagnostic &Diags, 19441b5b17445ab3bdf957ebd4be6c8670f09a212a8Daniel Dunbar bool Binary) { 195c673af7fe67e5db4d10dd414237df247d35dd9d9Daniel Dunbar if (Opts.OutputPath.empty()) 196c673af7fe67e5db4d10dd414237df247d35dd9d9Daniel Dunbar Opts.OutputPath = "-"; 197c673af7fe67e5db4d10dd414237df247d35dd9d9Daniel Dunbar 19841b5b17445ab3bdf957ebd4be6c8670f09a212a8Daniel Dunbar // Make sure that the Out file gets unlinked from the disk if we get a 19941b5b17445ab3bdf957ebd4be6c8670f09a212a8Daniel Dunbar // SIGINT. 20041b5b17445ab3bdf957ebd4be6c8670f09a212a8Daniel Dunbar if (Opts.OutputPath != "-") 20141b5b17445ab3bdf957ebd4be6c8670f09a212a8Daniel Dunbar sys::RemoveFileOnSignal(sys::Path(Opts.OutputPath)); 20241b5b17445ab3bdf957ebd4be6c8670f09a212a8Daniel Dunbar 20341b5b17445ab3bdf957ebd4be6c8670f09a212a8Daniel Dunbar std::string Error; 20441b5b17445ab3bdf957ebd4be6c8670f09a212a8Daniel Dunbar raw_fd_ostream *Out = 20541b5b17445ab3bdf957ebd4be6c8670f09a212a8Daniel Dunbar new raw_fd_ostream(Opts.OutputPath.c_str(), Error, 20641b5b17445ab3bdf957ebd4be6c8670f09a212a8Daniel Dunbar (Binary ? raw_fd_ostream::F_Binary : 0)); 20741b5b17445ab3bdf957ebd4be6c8670f09a212a8Daniel Dunbar if (!Error.empty()) { 20841b5b17445ab3bdf957ebd4be6c8670f09a212a8Daniel Dunbar Diags.Report(diag::err_fe_unable_to_open_output) 20941b5b17445ab3bdf957ebd4be6c8670f09a212a8Daniel Dunbar << Opts.OutputPath << Error; 21041b5b17445ab3bdf957ebd4be6c8670f09a212a8Daniel Dunbar return 0; 21141b5b17445ab3bdf957ebd4be6c8670f09a212a8Daniel Dunbar } 21241b5b17445ab3bdf957ebd4be6c8670f09a212a8Daniel Dunbar 21341b5b17445ab3bdf957ebd4be6c8670f09a212a8Daniel Dunbar return new formatted_raw_ostream(*Out, formatted_raw_ostream::DELETE_STREAM); 21441b5b17445ab3bdf957ebd4be6c8670f09a212a8Daniel Dunbar} 21541b5b17445ab3bdf957ebd4be6c8670f09a212a8Daniel Dunbar 21641b5b17445ab3bdf957ebd4be6c8670f09a212a8Daniel Dunbarstatic bool ExecuteAssembler(AssemblerInvocation &Opts, Diagnostic &Diags) { 21741b5b17445ab3bdf957ebd4be6c8670f09a212a8Daniel Dunbar // Get the target specific parser. 21841b5b17445ab3bdf957ebd4be6c8670f09a212a8Daniel Dunbar std::string Error; 21941b5b17445ab3bdf957ebd4be6c8670f09a212a8Daniel Dunbar const Target *TheTarget(TargetRegistry::lookupTarget(Opts.Triple, Error)); 22041b5b17445ab3bdf957ebd4be6c8670f09a212a8Daniel Dunbar if (!TheTarget) { 22141b5b17445ab3bdf957ebd4be6c8670f09a212a8Daniel Dunbar Diags.Report(diag::err_target_unknown_triple) << Opts.Triple; 22241b5b17445ab3bdf957ebd4be6c8670f09a212a8Daniel Dunbar return false; 22341b5b17445ab3bdf957ebd4be6c8670f09a212a8Daniel Dunbar } 22441b5b17445ab3bdf957ebd4be6c8670f09a212a8Daniel Dunbar 22541b5b17445ab3bdf957ebd4be6c8670f09a212a8Daniel Dunbar MemoryBuffer *Buffer = MemoryBuffer::getFileOrSTDIN(Opts.InputFile, &Error); 22641b5b17445ab3bdf957ebd4be6c8670f09a212a8Daniel Dunbar if (Buffer == 0) { 22741b5b17445ab3bdf957ebd4be6c8670f09a212a8Daniel Dunbar Diags.Report(diag::err_fe_error_reading) << Opts.InputFile; 22841b5b17445ab3bdf957ebd4be6c8670f09a212a8Daniel Dunbar return false; 22941b5b17445ab3bdf957ebd4be6c8670f09a212a8Daniel Dunbar } 23041b5b17445ab3bdf957ebd4be6c8670f09a212a8Daniel Dunbar 23141b5b17445ab3bdf957ebd4be6c8670f09a212a8Daniel Dunbar SourceMgr SrcMgr; 23241b5b17445ab3bdf957ebd4be6c8670f09a212a8Daniel Dunbar 23341b5b17445ab3bdf957ebd4be6c8670f09a212a8Daniel Dunbar // Tell SrcMgr about this buffer, which is what the parser will pick up. 23441b5b17445ab3bdf957ebd4be6c8670f09a212a8Daniel Dunbar SrcMgr.AddNewSourceBuffer(Buffer, SMLoc()); 23541b5b17445ab3bdf957ebd4be6c8670f09a212a8Daniel Dunbar 23641b5b17445ab3bdf957ebd4be6c8670f09a212a8Daniel Dunbar // Record the location of the include directories so that the lexer can find 23741b5b17445ab3bdf957ebd4be6c8670f09a212a8Daniel Dunbar // it later. 23841b5b17445ab3bdf957ebd4be6c8670f09a212a8Daniel Dunbar SrcMgr.setIncludeDirs(Opts.IncludePaths); 23941b5b17445ab3bdf957ebd4be6c8670f09a212a8Daniel Dunbar 24041b5b17445ab3bdf957ebd4be6c8670f09a212a8Daniel Dunbar OwningPtr<MCAsmInfo> MAI(TheTarget->createAsmInfo(Opts.Triple)); 24141b5b17445ab3bdf957ebd4be6c8670f09a212a8Daniel Dunbar assert(MAI && "Unable to create target asm info!"); 24241b5b17445ab3bdf957ebd4be6c8670f09a212a8Daniel Dunbar 24341b5b17445ab3bdf957ebd4be6c8670f09a212a8Daniel Dunbar MCContext Ctx(*MAI); 24441b5b17445ab3bdf957ebd4be6c8670f09a212a8Daniel Dunbar bool IsBinary = Opts.OutputType == AssemblerInvocation::FT_Obj; 24541b5b17445ab3bdf957ebd4be6c8670f09a212a8Daniel Dunbar formatted_raw_ostream *Out = GetOutputStream(Opts, Diags, IsBinary); 24641b5b17445ab3bdf957ebd4be6c8670f09a212a8Daniel Dunbar if (!Out) 24741b5b17445ab3bdf957ebd4be6c8670f09a212a8Daniel Dunbar return false; 24841b5b17445ab3bdf957ebd4be6c8670f09a212a8Daniel Dunbar 24941b5b17445ab3bdf957ebd4be6c8670f09a212a8Daniel Dunbar // FIXME: We shouldn't need to do this (and link in codegen). 25041b5b17445ab3bdf957ebd4be6c8670f09a212a8Daniel Dunbar OwningPtr<TargetMachine> TM(TheTarget->createTargetMachine(Opts.Triple, "")); 25141b5b17445ab3bdf957ebd4be6c8670f09a212a8Daniel Dunbar if (!TM) { 25241b5b17445ab3bdf957ebd4be6c8670f09a212a8Daniel Dunbar Diags.Report(diag::err_target_unknown_triple) << Opts.Triple; 25341b5b17445ab3bdf957ebd4be6c8670f09a212a8Daniel Dunbar return false; 25441b5b17445ab3bdf957ebd4be6c8670f09a212a8Daniel Dunbar } 25541b5b17445ab3bdf957ebd4be6c8670f09a212a8Daniel Dunbar 25641b5b17445ab3bdf957ebd4be6c8670f09a212a8Daniel Dunbar OwningPtr<MCCodeEmitter> CE; 25741b5b17445ab3bdf957ebd4be6c8670f09a212a8Daniel Dunbar OwningPtr<MCStreamer> Str; 25841b5b17445ab3bdf957ebd4be6c8670f09a212a8Daniel Dunbar OwningPtr<TargetAsmBackend> TAB; 25941b5b17445ab3bdf957ebd4be6c8670f09a212a8Daniel Dunbar 26041b5b17445ab3bdf957ebd4be6c8670f09a212a8Daniel Dunbar if (Opts.OutputType == AssemblerInvocation::FT_Asm) { 26141b5b17445ab3bdf957ebd4be6c8670f09a212a8Daniel Dunbar MCInstPrinter *IP = 26241b5b17445ab3bdf957ebd4be6c8670f09a212a8Daniel Dunbar TheTarget->createMCInstPrinter(Opts.OutputAsmVariant, *MAI); 26341b5b17445ab3bdf957ebd4be6c8670f09a212a8Daniel Dunbar if (Opts.ShowEncoding) 26441b5b17445ab3bdf957ebd4be6c8670f09a212a8Daniel Dunbar CE.reset(TheTarget->createCodeEmitter(*TM, Ctx)); 26541b5b17445ab3bdf957ebd4be6c8670f09a212a8Daniel Dunbar Str.reset(createAsmStreamer(Ctx, *Out,TM->getTargetData()->isLittleEndian(), 26641b5b17445ab3bdf957ebd4be6c8670f09a212a8Daniel Dunbar /*asmverbose*/true, IP, CE.get(), 26741b5b17445ab3bdf957ebd4be6c8670f09a212a8Daniel Dunbar 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!"); 27341b5b17445ab3bdf957ebd4be6c8670f09a212a8Daniel Dunbar CE.reset(TheTarget->createCodeEmitter(*TM, Ctx)); 27441b5b17445ab3bdf957ebd4be6c8670f09a212a8Daniel Dunbar TAB.reset(TheTarget->createAsmBackend(Opts.Triple)); 27541b5b17445ab3bdf957ebd4be6c8670f09a212a8Daniel Dunbar Str.reset(createMachOStreamer(Ctx, *TAB, *Out, CE.get(), Opts.RelaxAll)); 27641b5b17445ab3bdf957ebd4be6c8670f09a212a8Daniel Dunbar } 27741b5b17445ab3bdf957ebd4be6c8670f09a212a8Daniel Dunbar 27841b5b17445ab3bdf957ebd4be6c8670f09a212a8Daniel Dunbar AsmParser Parser(SrcMgr, Ctx, *Str.get(), *MAI); 27941b5b17445ab3bdf957ebd4be6c8670f09a212a8Daniel Dunbar OwningPtr<TargetAsmParser> TAP(TheTarget->createAsmParser(Parser)); 28041b5b17445ab3bdf957ebd4be6c8670f09a212a8Daniel Dunbar if (!TAP) { 28141b5b17445ab3bdf957ebd4be6c8670f09a212a8Daniel Dunbar Diags.Report(diag::err_target_unknown_triple) << Opts.Triple; 28241b5b17445ab3bdf957ebd4be6c8670f09a212a8Daniel Dunbar return false; 28341b5b17445ab3bdf957ebd4be6c8670f09a212a8Daniel Dunbar } 28441b5b17445ab3bdf957ebd4be6c8670f09a212a8Daniel Dunbar 28541b5b17445ab3bdf957ebd4be6c8670f09a212a8Daniel Dunbar Parser.setTargetParser(*TAP.get()); 28641b5b17445ab3bdf957ebd4be6c8670f09a212a8Daniel Dunbar 28741b5b17445ab3bdf957ebd4be6c8670f09a212a8Daniel Dunbar bool Success = !Parser.Run(Opts.NoInitialTextSection); 28841b5b17445ab3bdf957ebd4be6c8670f09a212a8Daniel Dunbar 28941b5b17445ab3bdf957ebd4be6c8670f09a212a8Daniel Dunbar // Close the output. 29041b5b17445ab3bdf957ebd4be6c8670f09a212a8Daniel Dunbar delete Out; 29141b5b17445ab3bdf957ebd4be6c8670f09a212a8Daniel Dunbar 29241b5b17445ab3bdf957ebd4be6c8670f09a212a8Daniel Dunbar // Delete output on errors. 29341b5b17445ab3bdf957ebd4be6c8670f09a212a8Daniel Dunbar if (!Success && Opts.OutputPath != "-") 29441b5b17445ab3bdf957ebd4be6c8670f09a212a8Daniel Dunbar sys::Path(Opts.OutputPath).eraseFromDisk(); 29541b5b17445ab3bdf957ebd4be6c8670f09a212a8Daniel Dunbar 29641b5b17445ab3bdf957ebd4be6c8670f09a212a8Daniel Dunbar return Success; 29741b5b17445ab3bdf957ebd4be6c8670f09a212a8Daniel Dunbar} 29841b5b17445ab3bdf957ebd4be6c8670f09a212a8Daniel Dunbar 29941b5b17445ab3bdf957ebd4be6c8670f09a212a8Daniel Dunbarstatic void LLVMErrorHandler(void *UserData, const std::string &Message) { 30041b5b17445ab3bdf957ebd4be6c8670f09a212a8Daniel Dunbar Diagnostic &Diags = *static_cast<Diagnostic*>(UserData); 30141b5b17445ab3bdf957ebd4be6c8670f09a212a8Daniel Dunbar 30241b5b17445ab3bdf957ebd4be6c8670f09a212a8Daniel Dunbar Diags.Report(diag::err_fe_error_backend) << Message; 30341b5b17445ab3bdf957ebd4be6c8670f09a212a8Daniel Dunbar 30441b5b17445ab3bdf957ebd4be6c8670f09a212a8Daniel Dunbar // We cannot recover from llvm errors. 30541b5b17445ab3bdf957ebd4be6c8670f09a212a8Daniel Dunbar exit(1); 30641b5b17445ab3bdf957ebd4be6c8670f09a212a8Daniel Dunbar} 30741b5b17445ab3bdf957ebd4be6c8670f09a212a8Daniel Dunbar 30841b5b17445ab3bdf957ebd4be6c8670f09a212a8Daniel Dunbarint cc1as_main(const char **ArgBegin, const char **ArgEnd, 30941b5b17445ab3bdf957ebd4be6c8670f09a212a8Daniel Dunbar const char *Argv0, void *MainAddr) { 31041b5b17445ab3bdf957ebd4be6c8670f09a212a8Daniel Dunbar // Print a stack trace if we signal out. 31141b5b17445ab3bdf957ebd4be6c8670f09a212a8Daniel Dunbar sys::PrintStackTraceOnErrorSignal(); 31241b5b17445ab3bdf957ebd4be6c8670f09a212a8Daniel Dunbar PrettyStackTraceProgram X(ArgEnd - ArgBegin, ArgBegin); 31341b5b17445ab3bdf957ebd4be6c8670f09a212a8Daniel Dunbar llvm_shutdown_obj Y; // Call llvm_shutdown() on exit. 31441b5b17445ab3bdf957ebd4be6c8670f09a212a8Daniel Dunbar 31541b5b17445ab3bdf957ebd4be6c8670f09a212a8Daniel Dunbar // Initialize targets and assembly printers/parsers. 31641b5b17445ab3bdf957ebd4be6c8670f09a212a8Daniel Dunbar InitializeAllTargetInfos(); 31741b5b17445ab3bdf957ebd4be6c8670f09a212a8Daniel Dunbar // FIXME: We shouldn't need to initialize the Target(Machine)s. 31841b5b17445ab3bdf957ebd4be6c8670f09a212a8Daniel Dunbar InitializeAllTargets(); 31941b5b17445ab3bdf957ebd4be6c8670f09a212a8Daniel Dunbar InitializeAllAsmPrinters(); 32041b5b17445ab3bdf957ebd4be6c8670f09a212a8Daniel Dunbar InitializeAllAsmParsers(); 32141b5b17445ab3bdf957ebd4be6c8670f09a212a8Daniel Dunbar 32241b5b17445ab3bdf957ebd4be6c8670f09a212a8Daniel Dunbar // Construct our diagnostic client. 32341b5b17445ab3bdf957ebd4be6c8670f09a212a8Daniel Dunbar TextDiagnosticPrinter DiagClient(errs(), DiagnosticOptions()); 32441b5b17445ab3bdf957ebd4be6c8670f09a212a8Daniel Dunbar DiagClient.setPrefix("clang -cc1as"); 32541b5b17445ab3bdf957ebd4be6c8670f09a212a8Daniel Dunbar Diagnostic Diags(&DiagClient); 32641b5b17445ab3bdf957ebd4be6c8670f09a212a8Daniel Dunbar 32741b5b17445ab3bdf957ebd4be6c8670f09a212a8Daniel Dunbar // Set an error handler, so that any LLVM backend diagnostics go through our 32841b5b17445ab3bdf957ebd4be6c8670f09a212a8Daniel Dunbar // error handler. 32941b5b17445ab3bdf957ebd4be6c8670f09a212a8Daniel Dunbar install_fatal_error_handler(LLVMErrorHandler, 33041b5b17445ab3bdf957ebd4be6c8670f09a212a8Daniel Dunbar static_cast<void*>(&Diags)); 33141b5b17445ab3bdf957ebd4be6c8670f09a212a8Daniel Dunbar 33241b5b17445ab3bdf957ebd4be6c8670f09a212a8Daniel Dunbar // Parse the arguments. 33341b5b17445ab3bdf957ebd4be6c8670f09a212a8Daniel Dunbar AssemblerInvocation Asm; 33441b5b17445ab3bdf957ebd4be6c8670f09a212a8Daniel Dunbar AssemblerInvocation::CreateFromArgs(Asm, ArgBegin, ArgEnd, Diags); 33541b5b17445ab3bdf957ebd4be6c8670f09a212a8Daniel Dunbar 336c673af7fe67e5db4d10dd414237df247d35dd9d9Daniel Dunbar // Honor -help. 337c673af7fe67e5db4d10dd414237df247d35dd9d9Daniel Dunbar if (Asm.ShowHelp) { 338c673af7fe67e5db4d10dd414237df247d35dd9d9Daniel Dunbar llvm::OwningPtr<driver::OptTable> Opts(driver::createCC1AsOptTable()); 339c673af7fe67e5db4d10dd414237df247d35dd9d9Daniel Dunbar Opts->PrintHelp(llvm::outs(), "clang -cc1as", "Clang Integrated Assembler"); 340c673af7fe67e5db4d10dd414237df247d35dd9d9Daniel Dunbar return 0; 341c673af7fe67e5db4d10dd414237df247d35dd9d9Daniel Dunbar } 342c673af7fe67e5db4d10dd414237df247d35dd9d9Daniel Dunbar 343c673af7fe67e5db4d10dd414237df247d35dd9d9Daniel Dunbar // Honor -version. 344c673af7fe67e5db4d10dd414237df247d35dd9d9Daniel Dunbar // 345c673af7fe67e5db4d10dd414237df247d35dd9d9Daniel Dunbar // FIXME: Use a better -version message? 346c673af7fe67e5db4d10dd414237df247d35dd9d9Daniel Dunbar if (Asm.ShowVersion) { 347c673af7fe67e5db4d10dd414237df247d35dd9d9Daniel Dunbar llvm::cl::PrintVersionMessage(); 348c673af7fe67e5db4d10dd414237df247d35dd9d9Daniel Dunbar return 0; 349c673af7fe67e5db4d10dd414237df247d35dd9d9Daniel Dunbar } 350c673af7fe67e5db4d10dd414237df247d35dd9d9Daniel Dunbar 351c673af7fe67e5db4d10dd414237df247d35dd9d9Daniel Dunbar // Honor -mllvm. 352c673af7fe67e5db4d10dd414237df247d35dd9d9Daniel Dunbar // 353c673af7fe67e5db4d10dd414237df247d35dd9d9Daniel Dunbar // FIXME: Remove this, one day. 354c673af7fe67e5db4d10dd414237df247d35dd9d9Daniel Dunbar if (!Asm.LLVMArgs.empty()) { 355c673af7fe67e5db4d10dd414237df247d35dd9d9Daniel Dunbar unsigned NumArgs = Asm.LLVMArgs.size(); 356c673af7fe67e5db4d10dd414237df247d35dd9d9Daniel Dunbar const char **Args = new const char*[NumArgs + 2]; 357c673af7fe67e5db4d10dd414237df247d35dd9d9Daniel Dunbar Args[0] = "clang (LLVM option parsing)"; 358c673af7fe67e5db4d10dd414237df247d35dd9d9Daniel Dunbar for (unsigned i = 0; i != NumArgs; ++i) 359c673af7fe67e5db4d10dd414237df247d35dd9d9Daniel Dunbar Args[i + 1] = Asm.LLVMArgs[i].c_str(); 360c673af7fe67e5db4d10dd414237df247d35dd9d9Daniel Dunbar Args[NumArgs + 1] = 0; 361c673af7fe67e5db4d10dd414237df247d35dd9d9Daniel Dunbar llvm::cl::ParseCommandLineOptions(NumArgs + 1, const_cast<char **>(Args)); 362c673af7fe67e5db4d10dd414237df247d35dd9d9Daniel Dunbar } 363c673af7fe67e5db4d10dd414237df247d35dd9d9Daniel Dunbar 36441b5b17445ab3bdf957ebd4be6c8670f09a212a8Daniel Dunbar // Execute the invocation, unless there were parsing errors. 36541b5b17445ab3bdf957ebd4be6c8670f09a212a8Daniel Dunbar bool Success = false; 36641b5b17445ab3bdf957ebd4be6c8670f09a212a8Daniel Dunbar if (!Diags.getNumErrors()) 36741b5b17445ab3bdf957ebd4be6c8670f09a212a8Daniel Dunbar Success = ExecuteAssembler(Asm, Diags); 36841b5b17445ab3bdf957ebd4be6c8670f09a212a8Daniel Dunbar 36941b5b17445ab3bdf957ebd4be6c8670f09a212a8Daniel Dunbar // If any timers were active but haven't been destroyed yet, print their 37041b5b17445ab3bdf957ebd4be6c8670f09a212a8Daniel Dunbar // results now. 37141b5b17445ab3bdf957ebd4be6c8670f09a212a8Daniel Dunbar TimerGroup::printAll(errs()); 37241b5b17445ab3bdf957ebd4be6c8670f09a212a8Daniel Dunbar 37341b5b17445ab3bdf957ebd4be6c8670f09a212a8Daniel Dunbar return !Success; 37441b5b17445ab3bdf957ebd4be6c8670f09a212a8Daniel Dunbar} 375