cc1as_main.cpp revision 7872d48c615c274e6055ed06d9c4b9ace4f8778d
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" 477872d48c615c274e6055ed06d9c4b9ace4f8778dRafael Espindola#include "llvm/Target/TargetAsmInfo.h" 4841b5b17445ab3bdf957ebd4be6c8670f09a212a8Daniel Dunbar#include "llvm/Target/TargetAsmParser.h" 4941b5b17445ab3bdf957ebd4be6c8670f09a212a8Daniel Dunbar#include "llvm/Target/TargetData.h" 507872d48c615c274e6055ed06d9c4b9ace4f8778dRafael Espindola#include "llvm/Target/TargetLowering.h" 517872d48c615c274e6055ed06d9c4b9ace4f8778dRafael Espindola#include "llvm/Target/TargetLoweringObjectFile.h" 5241b5b17445ab3bdf957ebd4be6c8670f09a212a8Daniel Dunbar#include "llvm/Target/TargetMachine.h" 5341b5b17445ab3bdf957ebd4be6c8670f09a212a8Daniel Dunbar#include "llvm/Target/TargetRegistry.h" 5441b5b17445ab3bdf957ebd4be6c8670f09a212a8Daniel Dunbar#include "llvm/Target/TargetSelect.h" 5541b5b17445ab3bdf957ebd4be6c8670f09a212a8Daniel Dunbarusing namespace clang; 5641b5b17445ab3bdf957ebd4be6c8670f09a212a8Daniel Dunbarusing namespace clang::driver; 5741b5b17445ab3bdf957ebd4be6c8670f09a212a8Daniel Dunbarusing namespace llvm; 5841b5b17445ab3bdf957ebd4be6c8670f09a212a8Daniel Dunbar 5941b5b17445ab3bdf957ebd4be6c8670f09a212a8Daniel Dunbarnamespace { 6041b5b17445ab3bdf957ebd4be6c8670f09a212a8Daniel Dunbar 6141b5b17445ab3bdf957ebd4be6c8670f09a212a8Daniel Dunbar/// \brief Helper class for representing a single invocation of the assembler. 6241b5b17445ab3bdf957ebd4be6c8670f09a212a8Daniel Dunbarstruct AssemblerInvocation { 6341b5b17445ab3bdf957ebd4be6c8670f09a212a8Daniel Dunbar /// @name Target Options 6441b5b17445ab3bdf957ebd4be6c8670f09a212a8Daniel Dunbar /// @{ 6541b5b17445ab3bdf957ebd4be6c8670f09a212a8Daniel Dunbar 6641b5b17445ab3bdf957ebd4be6c8670f09a212a8Daniel Dunbar std::string Triple; 6741b5b17445ab3bdf957ebd4be6c8670f09a212a8Daniel Dunbar 6841b5b17445ab3bdf957ebd4be6c8670f09a212a8Daniel Dunbar /// @} 6941b5b17445ab3bdf957ebd4be6c8670f09a212a8Daniel Dunbar /// @name Language Options 7041b5b17445ab3bdf957ebd4be6c8670f09a212a8Daniel Dunbar /// @{ 7141b5b17445ab3bdf957ebd4be6c8670f09a212a8Daniel Dunbar 7241b5b17445ab3bdf957ebd4be6c8670f09a212a8Daniel Dunbar std::vector<std::string> IncludePaths; 7341b5b17445ab3bdf957ebd4be6c8670f09a212a8Daniel Dunbar unsigned NoInitialTextSection : 1; 7441b5b17445ab3bdf957ebd4be6c8670f09a212a8Daniel Dunbar 7541b5b17445ab3bdf957ebd4be6c8670f09a212a8Daniel Dunbar /// @} 7641b5b17445ab3bdf957ebd4be6c8670f09a212a8Daniel Dunbar /// @name Frontend Options 7741b5b17445ab3bdf957ebd4be6c8670f09a212a8Daniel Dunbar /// @{ 7841b5b17445ab3bdf957ebd4be6c8670f09a212a8Daniel Dunbar 7941b5b17445ab3bdf957ebd4be6c8670f09a212a8Daniel Dunbar std::string InputFile; 80c673af7fe67e5db4d10dd414237df247d35dd9d9Daniel Dunbar std::vector<std::string> LLVMArgs; 8141b5b17445ab3bdf957ebd4be6c8670f09a212a8Daniel Dunbar std::string OutputPath; 8241b5b17445ab3bdf957ebd4be6c8670f09a212a8Daniel Dunbar enum FileType { 8341b5b17445ab3bdf957ebd4be6c8670f09a212a8Daniel Dunbar FT_Asm, ///< Assembly (.s) output, transliterate mode. 8441b5b17445ab3bdf957ebd4be6c8670f09a212a8Daniel Dunbar FT_Null, ///< No output, for timing purposes. 8541b5b17445ab3bdf957ebd4be6c8670f09a212a8Daniel Dunbar FT_Obj ///< Object file output. 8641b5b17445ab3bdf957ebd4be6c8670f09a212a8Daniel Dunbar }; 8741b5b17445ab3bdf957ebd4be6c8670f09a212a8Daniel Dunbar FileType OutputType; 88c673af7fe67e5db4d10dd414237df247d35dd9d9Daniel Dunbar unsigned ShowHelp : 1; 89c673af7fe67e5db4d10dd414237df247d35dd9d9Daniel Dunbar unsigned ShowVersion : 1; 9041b5b17445ab3bdf957ebd4be6c8670f09a212a8Daniel Dunbar 9141b5b17445ab3bdf957ebd4be6c8670f09a212a8Daniel Dunbar /// @} 9241b5b17445ab3bdf957ebd4be6c8670f09a212a8Daniel Dunbar /// @name Transliterate Options 9341b5b17445ab3bdf957ebd4be6c8670f09a212a8Daniel Dunbar /// @{ 9441b5b17445ab3bdf957ebd4be6c8670f09a212a8Daniel Dunbar 9541b5b17445ab3bdf957ebd4be6c8670f09a212a8Daniel Dunbar unsigned OutputAsmVariant; 9641b5b17445ab3bdf957ebd4be6c8670f09a212a8Daniel Dunbar unsigned ShowEncoding : 1; 9741b5b17445ab3bdf957ebd4be6c8670f09a212a8Daniel Dunbar unsigned ShowInst : 1; 9841b5b17445ab3bdf957ebd4be6c8670f09a212a8Daniel Dunbar 9941b5b17445ab3bdf957ebd4be6c8670f09a212a8Daniel Dunbar /// @} 10041b5b17445ab3bdf957ebd4be6c8670f09a212a8Daniel Dunbar /// @name Assembler Options 10141b5b17445ab3bdf957ebd4be6c8670f09a212a8Daniel Dunbar /// @{ 10241b5b17445ab3bdf957ebd4be6c8670f09a212a8Daniel Dunbar 10341b5b17445ab3bdf957ebd4be6c8670f09a212a8Daniel Dunbar unsigned RelaxAll : 1; 10441b5b17445ab3bdf957ebd4be6c8670f09a212a8Daniel Dunbar 10541b5b17445ab3bdf957ebd4be6c8670f09a212a8Daniel Dunbar /// @} 10641b5b17445ab3bdf957ebd4be6c8670f09a212a8Daniel Dunbar 10741b5b17445ab3bdf957ebd4be6c8670f09a212a8Daniel Dunbarpublic: 10841b5b17445ab3bdf957ebd4be6c8670f09a212a8Daniel Dunbar AssemblerInvocation() { 10941b5b17445ab3bdf957ebd4be6c8670f09a212a8Daniel Dunbar Triple = ""; 11041b5b17445ab3bdf957ebd4be6c8670f09a212a8Daniel Dunbar NoInitialTextSection = 0; 11141b5b17445ab3bdf957ebd4be6c8670f09a212a8Daniel Dunbar InputFile = "-"; 112c673af7fe67e5db4d10dd414237df247d35dd9d9Daniel Dunbar OutputPath = "-"; 11341b5b17445ab3bdf957ebd4be6c8670f09a212a8Daniel Dunbar OutputType = FT_Asm; 11441b5b17445ab3bdf957ebd4be6c8670f09a212a8Daniel Dunbar OutputAsmVariant = 0; 11541b5b17445ab3bdf957ebd4be6c8670f09a212a8Daniel Dunbar ShowInst = 0; 11641b5b17445ab3bdf957ebd4be6c8670f09a212a8Daniel Dunbar ShowEncoding = 0; 11741b5b17445ab3bdf957ebd4be6c8670f09a212a8Daniel Dunbar RelaxAll = 0; 11841b5b17445ab3bdf957ebd4be6c8670f09a212a8Daniel Dunbar } 11941b5b17445ab3bdf957ebd4be6c8670f09a212a8Daniel Dunbar 12041b5b17445ab3bdf957ebd4be6c8670f09a212a8Daniel Dunbar static void CreateFromArgs(AssemblerInvocation &Res, const char **ArgBegin, 12141b5b17445ab3bdf957ebd4be6c8670f09a212a8Daniel Dunbar const char **ArgEnd, Diagnostic &Diags); 12241b5b17445ab3bdf957ebd4be6c8670f09a212a8Daniel Dunbar}; 12341b5b17445ab3bdf957ebd4be6c8670f09a212a8Daniel Dunbar 12441b5b17445ab3bdf957ebd4be6c8670f09a212a8Daniel Dunbar} 12541b5b17445ab3bdf957ebd4be6c8670f09a212a8Daniel Dunbar 12641b5b17445ab3bdf957ebd4be6c8670f09a212a8Daniel Dunbarvoid AssemblerInvocation::CreateFromArgs(AssemblerInvocation &Opts, 12741b5b17445ab3bdf957ebd4be6c8670f09a212a8Daniel Dunbar const char **ArgBegin, 12841b5b17445ab3bdf957ebd4be6c8670f09a212a8Daniel Dunbar const char **ArgEnd, 12941b5b17445ab3bdf957ebd4be6c8670f09a212a8Daniel Dunbar Diagnostic &Diags) { 13041b5b17445ab3bdf957ebd4be6c8670f09a212a8Daniel Dunbar using namespace clang::driver::cc1asoptions; 13141b5b17445ab3bdf957ebd4be6c8670f09a212a8Daniel Dunbar // Parse the arguments. 13241b5b17445ab3bdf957ebd4be6c8670f09a212a8Daniel Dunbar OwningPtr<OptTable> OptTbl(createCC1AsOptTable()); 13341b5b17445ab3bdf957ebd4be6c8670f09a212a8Daniel Dunbar unsigned MissingArgIndex, MissingArgCount; 13441b5b17445ab3bdf957ebd4be6c8670f09a212a8Daniel Dunbar OwningPtr<InputArgList> Args( 13541b5b17445ab3bdf957ebd4be6c8670f09a212a8Daniel Dunbar OptTbl->ParseArgs(ArgBegin, ArgEnd,MissingArgIndex, MissingArgCount)); 13641b5b17445ab3bdf957ebd4be6c8670f09a212a8Daniel Dunbar 13741b5b17445ab3bdf957ebd4be6c8670f09a212a8Daniel Dunbar // Check for missing argument error. 13841b5b17445ab3bdf957ebd4be6c8670f09a212a8Daniel Dunbar if (MissingArgCount) 13941b5b17445ab3bdf957ebd4be6c8670f09a212a8Daniel Dunbar Diags.Report(diag::err_drv_missing_argument) 14041b5b17445ab3bdf957ebd4be6c8670f09a212a8Daniel Dunbar << Args->getArgString(MissingArgIndex) << MissingArgCount; 14141b5b17445ab3bdf957ebd4be6c8670f09a212a8Daniel Dunbar 14241b5b17445ab3bdf957ebd4be6c8670f09a212a8Daniel Dunbar // Issue errors on unknown arguments. 14341b5b17445ab3bdf957ebd4be6c8670f09a212a8Daniel Dunbar for (arg_iterator it = Args->filtered_begin(cc1asoptions::OPT_UNKNOWN), 14441b5b17445ab3bdf957ebd4be6c8670f09a212a8Daniel Dunbar ie = Args->filtered_end(); it != ie; ++it) 1457e4953e5c60409007545288f14b430bd23d68570Daniel Dunbar Diags.Report(diag::err_drv_unknown_argument) << (*it) ->getAsString(*Args); 14641b5b17445ab3bdf957ebd4be6c8670f09a212a8Daniel Dunbar 14741b5b17445ab3bdf957ebd4be6c8670f09a212a8Daniel Dunbar // Construct the invocation. 14841b5b17445ab3bdf957ebd4be6c8670f09a212a8Daniel Dunbar 14941b5b17445ab3bdf957ebd4be6c8670f09a212a8Daniel Dunbar // Target Options 1502dc14532b641bae011a374e2c6c393d2196c1411Duncan Sands Opts.Triple = Triple::normalize(Args->getLastArgValue(OPT_triple)); 15141b5b17445ab3bdf957ebd4be6c8670f09a212a8Daniel Dunbar if (Opts.Triple.empty()) // Use the host triple if unspecified. 15241b5b17445ab3bdf957ebd4be6c8670f09a212a8Daniel Dunbar Opts.Triple = sys::getHostTriple(); 15341b5b17445ab3bdf957ebd4be6c8670f09a212a8Daniel Dunbar 15441b5b17445ab3bdf957ebd4be6c8670f09a212a8Daniel Dunbar // Language Options 15541b5b17445ab3bdf957ebd4be6c8670f09a212a8Daniel Dunbar Opts.IncludePaths = Args->getAllArgValues(OPT_I); 15641b5b17445ab3bdf957ebd4be6c8670f09a212a8Daniel Dunbar Opts.NoInitialTextSection = Args->hasArg(OPT_n); 15741b5b17445ab3bdf957ebd4be6c8670f09a212a8Daniel Dunbar 15841b5b17445ab3bdf957ebd4be6c8670f09a212a8Daniel Dunbar // Frontend Options 15941b5b17445ab3bdf957ebd4be6c8670f09a212a8Daniel Dunbar if (Args->hasArg(OPT_INPUT)) { 16041b5b17445ab3bdf957ebd4be6c8670f09a212a8Daniel Dunbar bool First = true; 16141b5b17445ab3bdf957ebd4be6c8670f09a212a8Daniel Dunbar for (arg_iterator it = Args->filtered_begin(OPT_INPUT), 16241b5b17445ab3bdf957ebd4be6c8670f09a212a8Daniel Dunbar ie = Args->filtered_end(); it != ie; ++it, First=false) { 1637e4953e5c60409007545288f14b430bd23d68570Daniel Dunbar const Arg *A = it; 16441b5b17445ab3bdf957ebd4be6c8670f09a212a8Daniel Dunbar if (First) 1657e4953e5c60409007545288f14b430bd23d68570Daniel Dunbar Opts.InputFile = A->getValue(*Args); 16641b5b17445ab3bdf957ebd4be6c8670f09a212a8Daniel Dunbar else 1677e4953e5c60409007545288f14b430bd23d68570Daniel Dunbar Diags.Report(diag::err_drv_unknown_argument) << A->getAsString(*Args); 16841b5b17445ab3bdf957ebd4be6c8670f09a212a8Daniel Dunbar } 16941b5b17445ab3bdf957ebd4be6c8670f09a212a8Daniel Dunbar } 170c673af7fe67e5db4d10dd414237df247d35dd9d9Daniel Dunbar Opts.LLVMArgs = Args->getAllArgValues(OPT_mllvm); 17141b5b17445ab3bdf957ebd4be6c8670f09a212a8Daniel Dunbar Opts.OutputPath = Args->getLastArgValue(OPT_o); 17241b5b17445ab3bdf957ebd4be6c8670f09a212a8Daniel Dunbar if (Arg *A = Args->getLastArg(OPT_filetype)) { 17341b5b17445ab3bdf957ebd4be6c8670f09a212a8Daniel Dunbar StringRef Name = A->getValue(*Args); 17441b5b17445ab3bdf957ebd4be6c8670f09a212a8Daniel Dunbar unsigned OutputType = StringSwitch<unsigned>(Name) 17541b5b17445ab3bdf957ebd4be6c8670f09a212a8Daniel Dunbar .Case("asm", FT_Asm) 17641b5b17445ab3bdf957ebd4be6c8670f09a212a8Daniel Dunbar .Case("null", FT_Null) 17741b5b17445ab3bdf957ebd4be6c8670f09a212a8Daniel Dunbar .Case("obj", FT_Obj) 17841b5b17445ab3bdf957ebd4be6c8670f09a212a8Daniel Dunbar .Default(~0U); 17941b5b17445ab3bdf957ebd4be6c8670f09a212a8Daniel Dunbar if (OutputType == ~0U) 18041b5b17445ab3bdf957ebd4be6c8670f09a212a8Daniel Dunbar Diags.Report(diag::err_drv_invalid_value) 18141b5b17445ab3bdf957ebd4be6c8670f09a212a8Daniel Dunbar << A->getAsString(*Args) << Name; 18241b5b17445ab3bdf957ebd4be6c8670f09a212a8Daniel Dunbar else 18341b5b17445ab3bdf957ebd4be6c8670f09a212a8Daniel Dunbar Opts.OutputType = FileType(OutputType); 18441b5b17445ab3bdf957ebd4be6c8670f09a212a8Daniel Dunbar } 185c673af7fe67e5db4d10dd414237df247d35dd9d9Daniel Dunbar Opts.ShowHelp = Args->hasArg(OPT_help); 186c673af7fe67e5db4d10dd414237df247d35dd9d9Daniel Dunbar Opts.ShowVersion = Args->hasArg(OPT_version); 18741b5b17445ab3bdf957ebd4be6c8670f09a212a8Daniel Dunbar 18841b5b17445ab3bdf957ebd4be6c8670f09a212a8Daniel Dunbar // Transliterate Options 18941b5b17445ab3bdf957ebd4be6c8670f09a212a8Daniel Dunbar Opts.OutputAsmVariant = Args->getLastArgIntValue(OPT_output_asm_variant, 19041b5b17445ab3bdf957ebd4be6c8670f09a212a8Daniel Dunbar 0, Diags); 19141b5b17445ab3bdf957ebd4be6c8670f09a212a8Daniel Dunbar Opts.ShowEncoding = Args->hasArg(OPT_show_encoding); 19241b5b17445ab3bdf957ebd4be6c8670f09a212a8Daniel Dunbar Opts.ShowInst = Args->hasArg(OPT_show_inst); 19341b5b17445ab3bdf957ebd4be6c8670f09a212a8Daniel Dunbar 19441b5b17445ab3bdf957ebd4be6c8670f09a212a8Daniel Dunbar // Assemble Options 19541b5b17445ab3bdf957ebd4be6c8670f09a212a8Daniel Dunbar Opts.RelaxAll = Args->hasArg(OPT_relax_all); 19641b5b17445ab3bdf957ebd4be6c8670f09a212a8Daniel Dunbar} 19741b5b17445ab3bdf957ebd4be6c8670f09a212a8Daniel Dunbar 19841b5b17445ab3bdf957ebd4be6c8670f09a212a8Daniel Dunbarstatic formatted_raw_ostream *GetOutputStream(AssemblerInvocation &Opts, 19941b5b17445ab3bdf957ebd4be6c8670f09a212a8Daniel Dunbar Diagnostic &Diags, 20041b5b17445ab3bdf957ebd4be6c8670f09a212a8Daniel Dunbar bool Binary) { 201c673af7fe67e5db4d10dd414237df247d35dd9d9Daniel Dunbar if (Opts.OutputPath.empty()) 202c673af7fe67e5db4d10dd414237df247d35dd9d9Daniel Dunbar Opts.OutputPath = "-"; 203c673af7fe67e5db4d10dd414237df247d35dd9d9Daniel Dunbar 20441b5b17445ab3bdf957ebd4be6c8670f09a212a8Daniel Dunbar // Make sure that the Out file gets unlinked from the disk if we get a 20541b5b17445ab3bdf957ebd4be6c8670f09a212a8Daniel Dunbar // SIGINT. 20641b5b17445ab3bdf957ebd4be6c8670f09a212a8Daniel Dunbar if (Opts.OutputPath != "-") 20741b5b17445ab3bdf957ebd4be6c8670f09a212a8Daniel Dunbar sys::RemoveFileOnSignal(sys::Path(Opts.OutputPath)); 20841b5b17445ab3bdf957ebd4be6c8670f09a212a8Daniel Dunbar 20941b5b17445ab3bdf957ebd4be6c8670f09a212a8Daniel Dunbar std::string Error; 21041b5b17445ab3bdf957ebd4be6c8670f09a212a8Daniel Dunbar raw_fd_ostream *Out = 21141b5b17445ab3bdf957ebd4be6c8670f09a212a8Daniel Dunbar new raw_fd_ostream(Opts.OutputPath.c_str(), Error, 21241b5b17445ab3bdf957ebd4be6c8670f09a212a8Daniel Dunbar (Binary ? raw_fd_ostream::F_Binary : 0)); 21341b5b17445ab3bdf957ebd4be6c8670f09a212a8Daniel Dunbar if (!Error.empty()) { 21441b5b17445ab3bdf957ebd4be6c8670f09a212a8Daniel Dunbar Diags.Report(diag::err_fe_unable_to_open_output) 21541b5b17445ab3bdf957ebd4be6c8670f09a212a8Daniel Dunbar << Opts.OutputPath << Error; 21641b5b17445ab3bdf957ebd4be6c8670f09a212a8Daniel Dunbar return 0; 21741b5b17445ab3bdf957ebd4be6c8670f09a212a8Daniel Dunbar } 21841b5b17445ab3bdf957ebd4be6c8670f09a212a8Daniel Dunbar 21941b5b17445ab3bdf957ebd4be6c8670f09a212a8Daniel Dunbar return new formatted_raw_ostream(*Out, formatted_raw_ostream::DELETE_STREAM); 22041b5b17445ab3bdf957ebd4be6c8670f09a212a8Daniel Dunbar} 22141b5b17445ab3bdf957ebd4be6c8670f09a212a8Daniel Dunbar 22241b5b17445ab3bdf957ebd4be6c8670f09a212a8Daniel Dunbarstatic bool ExecuteAssembler(AssemblerInvocation &Opts, Diagnostic &Diags) { 22341b5b17445ab3bdf957ebd4be6c8670f09a212a8Daniel Dunbar // Get the target specific parser. 22441b5b17445ab3bdf957ebd4be6c8670f09a212a8Daniel Dunbar std::string Error; 22541b5b17445ab3bdf957ebd4be6c8670f09a212a8Daniel Dunbar const Target *TheTarget(TargetRegistry::lookupTarget(Opts.Triple, Error)); 22641b5b17445ab3bdf957ebd4be6c8670f09a212a8Daniel Dunbar if (!TheTarget) { 22741b5b17445ab3bdf957ebd4be6c8670f09a212a8Daniel Dunbar Diags.Report(diag::err_target_unknown_triple) << Opts.Triple; 22841b5b17445ab3bdf957ebd4be6c8670f09a212a8Daniel Dunbar return false; 22941b5b17445ab3bdf957ebd4be6c8670f09a212a8Daniel Dunbar } 23041b5b17445ab3bdf957ebd4be6c8670f09a212a8Daniel Dunbar 2313a321e23f66128dbb986343927456ff6702af617Michael J. Spencer error_code ec; 2323a321e23f66128dbb986343927456ff6702af617Michael J. Spencer MemoryBuffer *Buffer = MemoryBuffer::getFileOrSTDIN(Opts.InputFile, ec); 23341b5b17445ab3bdf957ebd4be6c8670f09a212a8Daniel Dunbar if (Buffer == 0) { 2343a321e23f66128dbb986343927456ff6702af617Michael J. Spencer Error = ec.message(); 23541b5b17445ab3bdf957ebd4be6c8670f09a212a8Daniel Dunbar Diags.Report(diag::err_fe_error_reading) << Opts.InputFile; 23641b5b17445ab3bdf957ebd4be6c8670f09a212a8Daniel Dunbar return false; 23741b5b17445ab3bdf957ebd4be6c8670f09a212a8Daniel Dunbar } 23841b5b17445ab3bdf957ebd4be6c8670f09a212a8Daniel Dunbar 23941b5b17445ab3bdf957ebd4be6c8670f09a212a8Daniel Dunbar SourceMgr SrcMgr; 24041b5b17445ab3bdf957ebd4be6c8670f09a212a8Daniel Dunbar 24141b5b17445ab3bdf957ebd4be6c8670f09a212a8Daniel Dunbar // Tell SrcMgr about this buffer, which is what the parser will pick up. 24241b5b17445ab3bdf957ebd4be6c8670f09a212a8Daniel Dunbar SrcMgr.AddNewSourceBuffer(Buffer, SMLoc()); 24341b5b17445ab3bdf957ebd4be6c8670f09a212a8Daniel Dunbar 24441b5b17445ab3bdf957ebd4be6c8670f09a212a8Daniel Dunbar // Record the location of the include directories so that the lexer can find 24541b5b17445ab3bdf957ebd4be6c8670f09a212a8Daniel Dunbar // it later. 24641b5b17445ab3bdf957ebd4be6c8670f09a212a8Daniel Dunbar SrcMgr.setIncludeDirs(Opts.IncludePaths); 24741b5b17445ab3bdf957ebd4be6c8670f09a212a8Daniel Dunbar 24841b5b17445ab3bdf957ebd4be6c8670f09a212a8Daniel Dunbar OwningPtr<MCAsmInfo> MAI(TheTarget->createAsmInfo(Opts.Triple)); 24941b5b17445ab3bdf957ebd4be6c8670f09a212a8Daniel Dunbar assert(MAI && "Unable to create target asm info!"); 25041b5b17445ab3bdf957ebd4be6c8670f09a212a8Daniel Dunbar 25141b5b17445ab3bdf957ebd4be6c8670f09a212a8Daniel Dunbar bool IsBinary = Opts.OutputType == AssemblerInvocation::FT_Obj; 25241b5b17445ab3bdf957ebd4be6c8670f09a212a8Daniel Dunbar formatted_raw_ostream *Out = GetOutputStream(Opts, Diags, IsBinary); 25341b5b17445ab3bdf957ebd4be6c8670f09a212a8Daniel Dunbar if (!Out) 25441b5b17445ab3bdf957ebd4be6c8670f09a212a8Daniel Dunbar return false; 25541b5b17445ab3bdf957ebd4be6c8670f09a212a8Daniel Dunbar 25641b5b17445ab3bdf957ebd4be6c8670f09a212a8Daniel Dunbar // FIXME: We shouldn't need to do this (and link in codegen). 25741b5b17445ab3bdf957ebd4be6c8670f09a212a8Daniel Dunbar OwningPtr<TargetMachine> TM(TheTarget->createTargetMachine(Opts.Triple, "")); 25841b5b17445ab3bdf957ebd4be6c8670f09a212a8Daniel Dunbar if (!TM) { 25941b5b17445ab3bdf957ebd4be6c8670f09a212a8Daniel Dunbar Diags.Report(diag::err_target_unknown_triple) << Opts.Triple; 26041b5b17445ab3bdf957ebd4be6c8670f09a212a8Daniel Dunbar return false; 26141b5b17445ab3bdf957ebd4be6c8670f09a212a8Daniel Dunbar } 26241b5b17445ab3bdf957ebd4be6c8670f09a212a8Daniel Dunbar 2637872d48c615c274e6055ed06d9c4b9ace4f8778dRafael Espindola const TargetAsmInfo *tai = new TargetAsmInfo(*TM); 2647872d48c615c274e6055ed06d9c4b9ace4f8778dRafael Espindola MCContext Ctx(*MAI, tai); 2657872d48c615c274e6055ed06d9c4b9ace4f8778dRafael Espindola 26641b5b17445ab3bdf957ebd4be6c8670f09a212a8Daniel Dunbar OwningPtr<MCStreamer> Str; 26741b5b17445ab3bdf957ebd4be6c8670f09a212a8Daniel Dunbar 2687872d48c615c274e6055ed06d9c4b9ace4f8778dRafael Espindola const TargetLoweringObjectFile &TLOF = 2697872d48c615c274e6055ed06d9c4b9ace4f8778dRafael Espindola TM->getTargetLowering()->getObjFileLowering(); 2707872d48c615c274e6055ed06d9c4b9ace4f8778dRafael Espindola const_cast<TargetLoweringObjectFile&>(TLOF).Initialize(Ctx, *TM); 2717872d48c615c274e6055ed06d9c4b9ace4f8778dRafael Espindola 2727872d48c615c274e6055ed06d9c4b9ace4f8778dRafael Espindola 27341b5b17445ab3bdf957ebd4be6c8670f09a212a8Daniel Dunbar if (Opts.OutputType == AssemblerInvocation::FT_Asm) { 27441b5b17445ab3bdf957ebd4be6c8670f09a212a8Daniel Dunbar MCInstPrinter *IP = 27541b5b17445ab3bdf957ebd4be6c8670f09a212a8Daniel Dunbar TheTarget->createMCInstPrinter(Opts.OutputAsmVariant, *MAI); 2767ac3d5a9eac7a7d4ce1e47264f1e3ed66ebc9d4eBenjamin Kramer MCCodeEmitter *CE = 0; 27741b5b17445ab3bdf957ebd4be6c8670f09a212a8Daniel Dunbar if (Opts.ShowEncoding) 2787ac3d5a9eac7a7d4ce1e47264f1e3ed66ebc9d4eBenjamin Kramer CE = TheTarget->createCodeEmitter(*TM, Ctx); 2797872d48c615c274e6055ed06d9c4b9ace4f8778dRafael Espindola Str.reset(TheTarget->createAsmStreamer(Ctx, *Out, /*asmverbose*/true, 2807872d48c615c274e6055ed06d9c4b9ace4f8778dRafael Espindola /*useLoc*/ true, IP, CE, 2817872d48c615c274e6055ed06d9c4b9ace4f8778dRafael Espindola Opts.ShowInst)); 28241b5b17445ab3bdf957ebd4be6c8670f09a212a8Daniel Dunbar } else if (Opts.OutputType == AssemblerInvocation::FT_Null) { 28341b5b17445ab3bdf957ebd4be6c8670f09a212a8Daniel Dunbar Str.reset(createNullStreamer(Ctx)); 28441b5b17445ab3bdf957ebd4be6c8670f09a212a8Daniel Dunbar } else { 28541b5b17445ab3bdf957ebd4be6c8670f09a212a8Daniel Dunbar assert(Opts.OutputType == AssemblerInvocation::FT_Obj && 28641b5b17445ab3bdf957ebd4be6c8670f09a212a8Daniel Dunbar "Invalid file type!"); 2877ac3d5a9eac7a7d4ce1e47264f1e3ed66ebc9d4eBenjamin Kramer MCCodeEmitter *CE = TheTarget->createCodeEmitter(*TM, Ctx); 2887ac3d5a9eac7a7d4ce1e47264f1e3ed66ebc9d4eBenjamin Kramer TargetAsmBackend *TAB = TheTarget->createAsmBackend(Opts.Triple); 2897ac3d5a9eac7a7d4ce1e47264f1e3ed66ebc9d4eBenjamin Kramer Str.reset(TheTarget->createObjectStreamer(Opts.Triple, Ctx, *TAB, *Out, 2907ac3d5a9eac7a7d4ce1e47264f1e3ed66ebc9d4eBenjamin Kramer CE, Opts.RelaxAll)); 2914f036fad0481a1bc996763b3e7c1d2f0019607f4Rafael Espindola Str.get()->InitSections(); 29241b5b17445ab3bdf957ebd4be6c8670f09a212a8Daniel Dunbar } 29341b5b17445ab3bdf957ebd4be6c8670f09a212a8Daniel Dunbar 2947374f1b407a86df83fde942ee9f3684a3159f99fDaniel Dunbar OwningPtr<MCAsmParser> Parser(createMCAsmParser(*TheTarget, SrcMgr, Ctx, 2957374f1b407a86df83fde942ee9f3684a3159f99fDaniel Dunbar *Str.get(), *MAI)); 296e9122a36c4c951c4cdce842dc8caf20874908cfdDaniel Dunbar OwningPtr<TargetAsmParser> TAP(TheTarget->createAsmParser(*Parser, *TM)); 29741b5b17445ab3bdf957ebd4be6c8670f09a212a8Daniel Dunbar if (!TAP) { 29841b5b17445ab3bdf957ebd4be6c8670f09a212a8Daniel Dunbar Diags.Report(diag::err_target_unknown_triple) << Opts.Triple; 29941b5b17445ab3bdf957ebd4be6c8670f09a212a8Daniel Dunbar return false; 30041b5b17445ab3bdf957ebd4be6c8670f09a212a8Daniel Dunbar } 30141b5b17445ab3bdf957ebd4be6c8670f09a212a8Daniel Dunbar 3027374f1b407a86df83fde942ee9f3684a3159f99fDaniel Dunbar Parser->setTargetParser(*TAP.get()); 30341b5b17445ab3bdf957ebd4be6c8670f09a212a8Daniel Dunbar 3047374f1b407a86df83fde942ee9f3684a3159f99fDaniel Dunbar bool Success = !Parser->Run(Opts.NoInitialTextSection); 30541b5b17445ab3bdf957ebd4be6c8670f09a212a8Daniel Dunbar 30641b5b17445ab3bdf957ebd4be6c8670f09a212a8Daniel Dunbar // Close the output. 30741b5b17445ab3bdf957ebd4be6c8670f09a212a8Daniel Dunbar delete Out; 30841b5b17445ab3bdf957ebd4be6c8670f09a212a8Daniel Dunbar 30941b5b17445ab3bdf957ebd4be6c8670f09a212a8Daniel Dunbar // Delete output on errors. 31041b5b17445ab3bdf957ebd4be6c8670f09a212a8Daniel Dunbar if (!Success && Opts.OutputPath != "-") 31141b5b17445ab3bdf957ebd4be6c8670f09a212a8Daniel Dunbar sys::Path(Opts.OutputPath).eraseFromDisk(); 31241b5b17445ab3bdf957ebd4be6c8670f09a212a8Daniel Dunbar 31341b5b17445ab3bdf957ebd4be6c8670f09a212a8Daniel Dunbar return Success; 31441b5b17445ab3bdf957ebd4be6c8670f09a212a8Daniel Dunbar} 31541b5b17445ab3bdf957ebd4be6c8670f09a212a8Daniel Dunbar 31641b5b17445ab3bdf957ebd4be6c8670f09a212a8Daniel Dunbarstatic void LLVMErrorHandler(void *UserData, const std::string &Message) { 31741b5b17445ab3bdf957ebd4be6c8670f09a212a8Daniel Dunbar Diagnostic &Diags = *static_cast<Diagnostic*>(UserData); 31841b5b17445ab3bdf957ebd4be6c8670f09a212a8Daniel Dunbar 31941b5b17445ab3bdf957ebd4be6c8670f09a212a8Daniel Dunbar Diags.Report(diag::err_fe_error_backend) << Message; 32041b5b17445ab3bdf957ebd4be6c8670f09a212a8Daniel Dunbar 32141b5b17445ab3bdf957ebd4be6c8670f09a212a8Daniel Dunbar // We cannot recover from llvm errors. 32241b5b17445ab3bdf957ebd4be6c8670f09a212a8Daniel Dunbar exit(1); 32341b5b17445ab3bdf957ebd4be6c8670f09a212a8Daniel Dunbar} 32441b5b17445ab3bdf957ebd4be6c8670f09a212a8Daniel Dunbar 32541b5b17445ab3bdf957ebd4be6c8670f09a212a8Daniel Dunbarint cc1as_main(const char **ArgBegin, const char **ArgEnd, 32641b5b17445ab3bdf957ebd4be6c8670f09a212a8Daniel Dunbar const char *Argv0, void *MainAddr) { 32741b5b17445ab3bdf957ebd4be6c8670f09a212a8Daniel Dunbar // Print a stack trace if we signal out. 32841b5b17445ab3bdf957ebd4be6c8670f09a212a8Daniel Dunbar sys::PrintStackTraceOnErrorSignal(); 32941b5b17445ab3bdf957ebd4be6c8670f09a212a8Daniel Dunbar PrettyStackTraceProgram X(ArgEnd - ArgBegin, ArgBegin); 33041b5b17445ab3bdf957ebd4be6c8670f09a212a8Daniel Dunbar llvm_shutdown_obj Y; // Call llvm_shutdown() on exit. 33141b5b17445ab3bdf957ebd4be6c8670f09a212a8Daniel Dunbar 33241b5b17445ab3bdf957ebd4be6c8670f09a212a8Daniel Dunbar // Initialize targets and assembly printers/parsers. 33341b5b17445ab3bdf957ebd4be6c8670f09a212a8Daniel Dunbar InitializeAllTargetInfos(); 33441b5b17445ab3bdf957ebd4be6c8670f09a212a8Daniel Dunbar // FIXME: We shouldn't need to initialize the Target(Machine)s. 33541b5b17445ab3bdf957ebd4be6c8670f09a212a8Daniel Dunbar InitializeAllTargets(); 33641b5b17445ab3bdf957ebd4be6c8670f09a212a8Daniel Dunbar InitializeAllAsmPrinters(); 33741b5b17445ab3bdf957ebd4be6c8670f09a212a8Daniel Dunbar InitializeAllAsmParsers(); 33841b5b17445ab3bdf957ebd4be6c8670f09a212a8Daniel Dunbar 33941b5b17445ab3bdf957ebd4be6c8670f09a212a8Daniel Dunbar // Construct our diagnostic client. 340bdbb004f38978da0c4a75af3294d1c7b5ff84af1Douglas Gregor TextDiagnosticPrinter *DiagClient 341bdbb004f38978da0c4a75af3294d1c7b5ff84af1Douglas Gregor = new TextDiagnosticPrinter(errs(), DiagnosticOptions()); 342bdbb004f38978da0c4a75af3294d1c7b5ff84af1Douglas Gregor DiagClient->setPrefix("clang -cc1as"); 34333e4e70c8c0a17e0ccb7465d96556b077a68ecb1Argyrios Kyrtzidis llvm::IntrusiveRefCntPtr<DiagnosticIDs> DiagID(new DiagnosticIDs()); 34433e4e70c8c0a17e0ccb7465d96556b077a68ecb1Argyrios Kyrtzidis Diagnostic Diags(DiagID, DiagClient); 34541b5b17445ab3bdf957ebd4be6c8670f09a212a8Daniel Dunbar 34641b5b17445ab3bdf957ebd4be6c8670f09a212a8Daniel Dunbar // Set an error handler, so that any LLVM backend diagnostics go through our 34741b5b17445ab3bdf957ebd4be6c8670f09a212a8Daniel Dunbar // error handler. 348726578c22e9e33774435257664f8f6dc4cf8dfa9Dan Gohman ScopedFatalErrorHandler FatalErrorHandler 349726578c22e9e33774435257664f8f6dc4cf8dfa9Dan Gohman (LLVMErrorHandler, static_cast<void*>(&Diags)); 35041b5b17445ab3bdf957ebd4be6c8670f09a212a8Daniel Dunbar 35141b5b17445ab3bdf957ebd4be6c8670f09a212a8Daniel Dunbar // Parse the arguments. 35241b5b17445ab3bdf957ebd4be6c8670f09a212a8Daniel Dunbar AssemblerInvocation Asm; 35341b5b17445ab3bdf957ebd4be6c8670f09a212a8Daniel Dunbar AssemblerInvocation::CreateFromArgs(Asm, ArgBegin, ArgEnd, Diags); 35441b5b17445ab3bdf957ebd4be6c8670f09a212a8Daniel Dunbar 355c673af7fe67e5db4d10dd414237df247d35dd9d9Daniel Dunbar // Honor -help. 356c673af7fe67e5db4d10dd414237df247d35dd9d9Daniel Dunbar if (Asm.ShowHelp) { 357c673af7fe67e5db4d10dd414237df247d35dd9d9Daniel Dunbar llvm::OwningPtr<driver::OptTable> Opts(driver::createCC1AsOptTable()); 358c673af7fe67e5db4d10dd414237df247d35dd9d9Daniel Dunbar Opts->PrintHelp(llvm::outs(), "clang -cc1as", "Clang Integrated Assembler"); 359c673af7fe67e5db4d10dd414237df247d35dd9d9Daniel Dunbar return 0; 360c673af7fe67e5db4d10dd414237df247d35dd9d9Daniel Dunbar } 361c673af7fe67e5db4d10dd414237df247d35dd9d9Daniel Dunbar 362c673af7fe67e5db4d10dd414237df247d35dd9d9Daniel Dunbar // Honor -version. 363c673af7fe67e5db4d10dd414237df247d35dd9d9Daniel Dunbar // 364c673af7fe67e5db4d10dd414237df247d35dd9d9Daniel Dunbar // FIXME: Use a better -version message? 365c673af7fe67e5db4d10dd414237df247d35dd9d9Daniel Dunbar if (Asm.ShowVersion) { 366c673af7fe67e5db4d10dd414237df247d35dd9d9Daniel Dunbar llvm::cl::PrintVersionMessage(); 367c673af7fe67e5db4d10dd414237df247d35dd9d9Daniel Dunbar return 0; 368c673af7fe67e5db4d10dd414237df247d35dd9d9Daniel Dunbar } 369c673af7fe67e5db4d10dd414237df247d35dd9d9Daniel Dunbar 370c673af7fe67e5db4d10dd414237df247d35dd9d9Daniel Dunbar // Honor -mllvm. 371c673af7fe67e5db4d10dd414237df247d35dd9d9Daniel Dunbar // 372c673af7fe67e5db4d10dd414237df247d35dd9d9Daniel Dunbar // FIXME: Remove this, one day. 373c673af7fe67e5db4d10dd414237df247d35dd9d9Daniel Dunbar if (!Asm.LLVMArgs.empty()) { 374c673af7fe67e5db4d10dd414237df247d35dd9d9Daniel Dunbar unsigned NumArgs = Asm.LLVMArgs.size(); 375c673af7fe67e5db4d10dd414237df247d35dd9d9Daniel Dunbar const char **Args = new const char*[NumArgs + 2]; 376c673af7fe67e5db4d10dd414237df247d35dd9d9Daniel Dunbar Args[0] = "clang (LLVM option parsing)"; 377c673af7fe67e5db4d10dd414237df247d35dd9d9Daniel Dunbar for (unsigned i = 0; i != NumArgs; ++i) 378c673af7fe67e5db4d10dd414237df247d35dd9d9Daniel Dunbar Args[i + 1] = Asm.LLVMArgs[i].c_str(); 379c673af7fe67e5db4d10dd414237df247d35dd9d9Daniel Dunbar Args[NumArgs + 1] = 0; 380c673af7fe67e5db4d10dd414237df247d35dd9d9Daniel Dunbar llvm::cl::ParseCommandLineOptions(NumArgs + 1, const_cast<char **>(Args)); 381c673af7fe67e5db4d10dd414237df247d35dd9d9Daniel Dunbar } 382c673af7fe67e5db4d10dd414237df247d35dd9d9Daniel Dunbar 38341b5b17445ab3bdf957ebd4be6c8670f09a212a8Daniel Dunbar // Execute the invocation, unless there were parsing errors. 38441b5b17445ab3bdf957ebd4be6c8670f09a212a8Daniel Dunbar bool Success = false; 385e8f0ba75a39b2fa2d34d14e8401ae96f43e1fc14Argyrios Kyrtzidis if (!Diags.hasErrorOccurred()) 38641b5b17445ab3bdf957ebd4be6c8670f09a212a8Daniel Dunbar Success = ExecuteAssembler(Asm, Diags); 38741b5b17445ab3bdf957ebd4be6c8670f09a212a8Daniel Dunbar 38841b5b17445ab3bdf957ebd4be6c8670f09a212a8Daniel Dunbar // If any timers were active but haven't been destroyed yet, print their 38941b5b17445ab3bdf957ebd4be6c8670f09a212a8Daniel Dunbar // results now. 39041b5b17445ab3bdf957ebd4be6c8670f09a212a8Daniel Dunbar TimerGroup::printAll(errs()); 39141b5b17445ab3bdf957ebd4be6c8670f09a212a8Daniel Dunbar 39241b5b17445ab3bdf957ebd4be6c8670f09a212a8Daniel Dunbar return !Success; 39341b5b17445ab3bdf957ebd4be6c8670f09a212a8Daniel Dunbar} 394