Driver.cpp revision 477aab6782795e7472055a54108d2df270ce1a89
1e3365aa452673f7ea3244bb6638551f13ab7570dNick Lewycky//===--- Driver.cpp - Clang GCC Compatible Driver -------------------------===// 23ede8d0a7d1813f678ccc6011a99a0834b1b6116Daniel Dunbar// 33ede8d0a7d1813f678ccc6011a99a0834b1b6116Daniel Dunbar// The LLVM Compiler Infrastructure 43ede8d0a7d1813f678ccc6011a99a0834b1b6116Daniel Dunbar// 53ede8d0a7d1813f678ccc6011a99a0834b1b6116Daniel Dunbar// This file is distributed under the University of Illinois Open Source 63ede8d0a7d1813f678ccc6011a99a0834b1b6116Daniel Dunbar// License. See LICENSE.TXT for details. 73ede8d0a7d1813f678ccc6011a99a0834b1b6116Daniel Dunbar// 83ede8d0a7d1813f678ccc6011a99a0834b1b6116Daniel Dunbar//===----------------------------------------------------------------------===// 93ede8d0a7d1813f678ccc6011a99a0834b1b6116Daniel Dunbar 102100fe952a644134b1dca462f2e6330cf14ef47cOscar Fuentes#ifdef HAVE_CLANG_CONFIG_H 112100fe952a644134b1dca462f2e6330cf14ef47cOscar Fuentes# include "clang/Config/config.h" 122100fe952a644134b1dca462f2e6330cf14ef47cOscar Fuentes#endif 132100fe952a644134b1dca462f2e6330cf14ef47cOscar Fuentes 143ede8d0a7d1813f678ccc6011a99a0834b1b6116Daniel Dunbar#include "clang/Driver/Driver.h" 153ede8d0a7d1813f678ccc6011a99a0834b1b6116Daniel Dunbar 1653ec55215075c8f4ddd47ca6ed7d382f16beb670Daniel Dunbar#include "clang/Driver/Action.h" 171b3bb6efc59a21f794b534078f9ae7e95393f510Daniel Dunbar#include "clang/Driver/Arg.h" 181b3bb6efc59a21f794b534078f9ae7e95393f510Daniel Dunbar#include "clang/Driver/ArgList.h" 191b3bb6efc59a21f794b534078f9ae7e95393f510Daniel Dunbar#include "clang/Driver/Compilation.h" 204ad4b3ebbe5769143389dccfcfadb666a4ba5940Daniel Dunbar#include "clang/Driver/DriverDiagnostic.h" 21dd98e2cad165ca73c769e4f105a4e47c2216387aDaniel Dunbar#include "clang/Driver/HostInfo.h" 22f353c8cc2ee1cc16ff194b399a8d951f707fb129Daniel Dunbar#include "clang/Driver/Job.h" 2327e738d0d3f781672a5999d2a9e2827b00a97d0cDaniel Dunbar#include "clang/Driver/OptTable.h" 240648262df75d97b464c2be0ed867da3615659785Daniel Dunbar#include "clang/Driver/Option.h" 251b3bb6efc59a21f794b534078f9ae7e95393f510Daniel Dunbar#include "clang/Driver/Options.h" 26f353c8cc2ee1cc16ff194b399a8d951f707fb129Daniel Dunbar#include "clang/Driver/Tool.h" 27f353c8cc2ee1cc16ff194b399a8d951f707fb129Daniel Dunbar#include "clang/Driver/ToolChain.h" 2853ec55215075c8f4ddd47ca6ed7d382f16beb670Daniel Dunbar#include "clang/Driver/Types.h" 290648262df75d97b464c2be0ed867da3615659785Daniel Dunbar 30ab41e63821dc60ad144d0684df8d79a9eef86b75Douglas Gregor#include "clang/Basic/Version.h" 31ab41e63821dc60ad144d0684df8d79a9eef86b75Douglas Gregor 32a77a723489b0cff63bf90f23416e10b8b6fc1f55Daniel Dunbar#include "llvm/Config/config.h" 337f9fc3f7ce076645cb6aefc99c64d9446caf13d6Chris Lattner#include "llvm/ADT/ArrayRef.h" 341368954db9ce2989ed8f03f5c65e8ee775a5229aDaniel Dunbar#include "llvm/ADT/StringSet.h" 354d7b14734f2285695dcec347f8718b512093390aTed Kremenek#include "llvm/ADT/OwningPtr.h" 368f25c79e59d88df41c5a3cabba1c58035d384a6eDaniel Dunbar#include "llvm/Support/PrettyStackTrace.h" 370648262df75d97b464c2be0ed867da3615659785Daniel Dunbar#include "llvm/Support/raw_ostream.h" 38256053b31e697fdf0cc48f17d621c82fc3b8dff0Michael J. Spencer#include "llvm/Support/FileSystem.h" 3903013fa9a0bf1ef4b907f5fec006c8f4000fdd21Michael J. Spencer#include "llvm/Support/Path.h" 4003013fa9a0bf1ef4b907f5fec006c8f4000fdd21Michael J. Spencer#include "llvm/Support/Program.h" 41ba1021388e6839b76c8968b931189361c7286674Daniel Dunbar 42f353c8cc2ee1cc16ff194b399a8d951f707fb129Daniel Dunbar#include "InputInfo.h" 43f353c8cc2ee1cc16ff194b399a8d951f707fb129Daniel Dunbar 44ba1021388e6839b76c8968b931189361c7286674Daniel Dunbar#include <map> 45ba1021388e6839b76c8968b931189361c7286674Daniel Dunbar 461b3bb6efc59a21f794b534078f9ae7e95393f510Daniel Dunbarusing namespace clang::driver; 4792b369928b8e9ad156fb6eec2bf9f21d657bd69bChris Lattnerusing namespace clang; 481b3bb6efc59a21f794b534078f9ae7e95393f510Daniel Dunbar 490bbad519aa068206f1e158d5073f72a39fbe83c5Daniel DunbarDriver::Driver(llvm::StringRef _ClangExecutable, 50e3fdca2ee0346a41d9cc5ee417a75e66274216f5Jeffrey Yasskin llvm::StringRef _DefaultHostTriple, 51e3fdca2ee0346a41d9cc5ee417a75e66274216f5Jeffrey Yasskin llvm::StringRef _DefaultImageName, 525d93ed3c7a2dae0a8f422747e269963b3ef11d95Daniel Dunbar bool IsProduction, bool CXXIsProduction, 535d93ed3c7a2dae0a8f422747e269963b3ef11d95Daniel Dunbar Diagnostic &_Diags) 54a79a2b5bf23d1422eed9be3793186ebbba7532ecDaniel Dunbar : Opts(createDriverOptTable()), Diags(_Diags), 5505e5930166333e382522b942f00d08abc6c0a28eJoerg Sonnenberger ClangExecutable(_ClangExecutable), UseStdLib(true), 5605e5930166333e382522b942f00d08abc6c0a28eJoerg Sonnenberger DefaultHostTriple(_DefaultHostTriple), DefaultImageName(_DefaultImageName), 5743302d4144b5291961aa160d2fe191c09a9d8ad1Daniel Dunbar DriverTitle("clang \"gcc-compatible\" driver"), 58dd98e2cad165ca73c769e4f105a4e47c2216387aDaniel Dunbar Host(0), 59c8a22b091677c02003880166e5d5767ca8d74b70Daniel Dunbar CCPrintOptionsFilename(0), CCPrintHeadersFilename(0), 60c8a22b091677c02003880166e5d5767ca8d74b70Daniel Dunbar CCLogDiagnosticsFilename(0), CCCIsCXX(false), 61951c5705771a57eca0bca07aae5d4738619dd6c6Joerg Sonnenberger CCCIsCPP(false),CCCEcho(false), CCCPrintBindings(false), 62c8a22b091677c02003880166e5d5767ca8d74b70Daniel Dunbar CCPrintOptions(false), CCPrintHeaders(false), CCLogDiagnostics(false), 63b8a3e8139b9fe513500c89bbcd9133415654a689Dylan Noblesmith CCCGenericGCCName(""), CheckInputsExist(true), CCCUseClang(true), 64c8a22b091677c02003880166e5d5767ca8d74b70Daniel Dunbar CCCUseClangCXX(true), CCCUseClangCPP(true), CCCUsePCH(true), 65c8a22b091677c02003880166e5d5767ca8d74b70Daniel Dunbar SuppressMissingInputWarning(false) { 66f44c58563286bb448a72ed9c9af5f21718633230Daniel Dunbar if (IsProduction) { 67f44c58563286bb448a72ed9c9af5f21718633230Daniel Dunbar // In a "production" build, only use clang on architectures we expect to 68f44c58563286bb448a72ed9c9af5f21718633230Daniel Dunbar // work, and don't use clang C++. 69f44c58563286bb448a72ed9c9af5f21718633230Daniel Dunbar // 70f44c58563286bb448a72ed9c9af5f21718633230Daniel Dunbar // During development its more convenient to always have the driver use 71f44c58563286bb448a72ed9c9af5f21718633230Daniel Dunbar // clang, but we don't want users to be confused when things don't work, or 72f44c58563286bb448a72ed9c9af5f21718633230Daniel Dunbar // to file bugs for things we don't support. 73f44c58563286bb448a72ed9c9af5f21718633230Daniel Dunbar CCCClangArchs.insert(llvm::Triple::x86); 74f44c58563286bb448a72ed9c9af5f21718633230Daniel Dunbar CCCClangArchs.insert(llvm::Triple::x86_64); 75f44c58563286bb448a72ed9c9af5f21718633230Daniel Dunbar CCCClangArchs.insert(llvm::Triple::arm); 76f44c58563286bb448a72ed9c9af5f21718633230Daniel Dunbar 775d93ed3c7a2dae0a8f422747e269963b3ef11d95Daniel Dunbar if (!CXXIsProduction) 785d93ed3c7a2dae0a8f422747e269963b3ef11d95Daniel Dunbar CCCUseClangCXX = false; 79f44c58563286bb448a72ed9c9af5f21718633230Daniel Dunbar } 80225c41706dc0f3682236e351820d339e14390e00Daniel Dunbar 81d5b08bee799d4f77f1a25fa5977ca77b983ab031Michael J. Spencer Name = llvm::sys::path::stem(ClangExecutable); 82d5b08bee799d4f77f1a25fa5977ca77b983ab031Michael J. Spencer Dir = llvm::sys::path::parent_path(ClangExecutable); 830bbad519aa068206f1e158d5073f72a39fbe83c5Daniel Dunbar 84225c41706dc0f3682236e351820d339e14390e00Daniel Dunbar // Compute the path to the resource directory. 85acd65bd27011f5aa863bcf3a980888e3760dae26Chandler Carruth llvm::StringRef ClangResourceDir(CLANG_RESOURCE_DIR); 86d5b08bee799d4f77f1a25fa5977ca77b983ab031Michael J. Spencer llvm::SmallString<128> P(Dir); 87d5b08bee799d4f77f1a25fa5977ca77b983ab031Michael J. Spencer if (ClangResourceDir != "") 88d5b08bee799d4f77f1a25fa5977ca77b983ab031Michael J. Spencer llvm::sys::path::append(P, ClangResourceDir); 89d5b08bee799d4f77f1a25fa5977ca77b983ab031Michael J. Spencer else 90d5b08bee799d4f77f1a25fa5977ca77b983ab031Michael J. Spencer llvm::sys::path::append(P, "..", "lib", "clang", CLANG_VERSION_STRING); 91225c41706dc0f3682236e351820d339e14390e00Daniel Dunbar ResourceDir = P.str(); 923ede8d0a7d1813f678ccc6011a99a0834b1b6116Daniel Dunbar} 933ede8d0a7d1813f678ccc6011a99a0834b1b6116Daniel Dunbar 943ede8d0a7d1813f678ccc6011a99a0834b1b6116Daniel DunbarDriver::~Driver() { 951b3bb6efc59a21f794b534078f9ae7e95393f510Daniel Dunbar delete Opts; 967e4534d9c14febcdea30c057bb2a36e245776865Daniel Dunbar delete Host; 973ede8d0a7d1813f678ccc6011a99a0834b1b6116Daniel Dunbar} 983ede8d0a7d1813f678ccc6011a99a0834b1b6116Daniel Dunbar 997f9fc3f7ce076645cb6aefc99c64d9446caf13d6Chris LattnerInputArgList *Driver::ParseArgStrings(llvm::ArrayRef<const char *> ArgList) { 1008f25c79e59d88df41c5a3cabba1c58035d384a6eDaniel Dunbar llvm::PrettyStackTraceString CrashInfo("Command line argument parsing"); 101847abaa62883b6c20005bdd3346ebbd44e46dbacDaniel Dunbar unsigned MissingArgIndex, MissingArgCount; 1027f9fc3f7ce076645cb6aefc99c64d9446caf13d6Chris Lattner InputArgList *Args = getOpts().ParseArgs(ArgList.begin(), ArgList.end(), 103847abaa62883b6c20005bdd3346ebbd44e46dbacDaniel Dunbar MissingArgIndex, MissingArgCount); 104847abaa62883b6c20005bdd3346ebbd44e46dbacDaniel Dunbar 105847abaa62883b6c20005bdd3346ebbd44e46dbacDaniel Dunbar // Check for missing argument error. 106847abaa62883b6c20005bdd3346ebbd44e46dbacDaniel Dunbar if (MissingArgCount) 107847abaa62883b6c20005bdd3346ebbd44e46dbacDaniel Dunbar Diag(clang::diag::err_drv_missing_argument) 108847abaa62883b6c20005bdd3346ebbd44e46dbacDaniel Dunbar << Args->getArgString(MissingArgIndex) << MissingArgCount; 109847abaa62883b6c20005bdd3346ebbd44e46dbacDaniel Dunbar 110847abaa62883b6c20005bdd3346ebbd44e46dbacDaniel Dunbar // Check for unsupported options. 111847abaa62883b6c20005bdd3346ebbd44e46dbacDaniel Dunbar for (ArgList::const_iterator it = Args->begin(), ie = Args->end(); 112847abaa62883b6c20005bdd3346ebbd44e46dbacDaniel Dunbar it != ie; ++it) { 113847abaa62883b6c20005bdd3346ebbd44e46dbacDaniel Dunbar Arg *A = *it; 114b0c4df5c4df69a003f26b378eb95961bc7c486e5Daniel Dunbar if (A->getOption().isUnsupported()) { 115b0c4df5c4df69a003f26b378eb95961bc7c486e5Daniel Dunbar Diag(clang::diag::err_drv_unsupported_opt) << A->getAsString(*Args); 116b0c4df5c4df69a003f26b378eb95961bc7c486e5Daniel Dunbar continue; 117b0c4df5c4df69a003f26b378eb95961bc7c486e5Daniel Dunbar } 1180648262df75d97b464c2be0ed867da3615659785Daniel Dunbar } 1190648262df75d97b464c2be0ed867da3615659785Daniel Dunbar 1200648262df75d97b464c2be0ed867da3615659785Daniel Dunbar return Args; 1210648262df75d97b464c2be0ed867da3615659785Daniel Dunbar} 1220648262df75d97b464c2be0ed867da3615659785Daniel Dunbar 123279c1dbebf37cd128f3c73c70741a6b8c35ad025Daniel DunbarDerivedArgList *Driver::TranslateInputArgs(const InputArgList &Args) const { 124279c1dbebf37cd128f3c73c70741a6b8c35ad025Daniel Dunbar DerivedArgList *DAL = new DerivedArgList(Args); 125279c1dbebf37cd128f3c73c70741a6b8c35ad025Daniel Dunbar 126e5a37f48388c7e4cc081f44d13a4910bfa56cd35Daniel Dunbar bool HasNostdlib = Args.hasArg(options::OPT_nostdlib); 127279c1dbebf37cd128f3c73c70741a6b8c35ad025Daniel Dunbar for (ArgList::const_iterator it = Args.begin(), 128f78925f633e949f06521d9ffd937019e59f35efcDaniel Dunbar ie = Args.end(); it != ie; ++it) { 129f78925f633e949f06521d9ffd937019e59f35efcDaniel Dunbar const Arg *A = *it; 130f78925f633e949f06521d9ffd937019e59f35efcDaniel Dunbar 131f78925f633e949f06521d9ffd937019e59f35efcDaniel Dunbar // Unfortunately, we have to parse some forwarding options (-Xassembler, 132f78925f633e949f06521d9ffd937019e59f35efcDaniel Dunbar // -Xlinker, -Xpreprocessor) because we either integrate their functionality 133f78925f633e949f06521d9ffd937019e59f35efcDaniel Dunbar // (assembler and preprocessor), or bypass a previous driver ('collect2'). 134eda3f707fd53f90f4232b0e694d3f5514237aba5Daniel Dunbar 135eda3f707fd53f90f4232b0e694d3f5514237aba5Daniel Dunbar // Rewrite linker options, to replace --no-demangle with a custom internal 136eda3f707fd53f90f4232b0e694d3f5514237aba5Daniel Dunbar // option. 137eda3f707fd53f90f4232b0e694d3f5514237aba5Daniel Dunbar if ((A->getOption().matches(options::OPT_Wl_COMMA) || 138eda3f707fd53f90f4232b0e694d3f5514237aba5Daniel Dunbar A->getOption().matches(options::OPT_Xlinker)) && 139eda3f707fd53f90f4232b0e694d3f5514237aba5Daniel Dunbar A->containsValue("--no-demangle")) { 140f78925f633e949f06521d9ffd937019e59f35efcDaniel Dunbar // Add the rewritten no-demangle argument. 141f78925f633e949f06521d9ffd937019e59f35efcDaniel Dunbar DAL->AddFlagArg(A, Opts->getOption(options::OPT_Z_Xlinker__no_demangle)); 142f78925f633e949f06521d9ffd937019e59f35efcDaniel Dunbar 143f78925f633e949f06521d9ffd937019e59f35efcDaniel Dunbar // Add the remaining values as Xlinker arguments. 144f78925f633e949f06521d9ffd937019e59f35efcDaniel Dunbar for (unsigned i = 0, e = A->getNumValues(); i != e; ++i) 145f78925f633e949f06521d9ffd937019e59f35efcDaniel Dunbar if (llvm::StringRef(A->getValue(Args, i)) != "--no-demangle") 146f78925f633e949f06521d9ffd937019e59f35efcDaniel Dunbar DAL->AddSeparateArg(A, Opts->getOption(options::OPT_Xlinker), 147f78925f633e949f06521d9ffd937019e59f35efcDaniel Dunbar A->getValue(Args, i)); 148f78925f633e949f06521d9ffd937019e59f35efcDaniel Dunbar 149f78925f633e949f06521d9ffd937019e59f35efcDaniel Dunbar continue; 150f78925f633e949f06521d9ffd937019e59f35efcDaniel Dunbar } 151f78925f633e949f06521d9ffd937019e59f35efcDaniel Dunbar 152eda3f707fd53f90f4232b0e694d3f5514237aba5Daniel Dunbar // Rewrite preprocessor options, to replace -Wp,-MD,FOO which is used by 153eda3f707fd53f90f4232b0e694d3f5514237aba5Daniel Dunbar // some build systems. We don't try to be complete here because we don't 154eda3f707fd53f90f4232b0e694d3f5514237aba5Daniel Dunbar // care to encourage this usage model. 155eda3f707fd53f90f4232b0e694d3f5514237aba5Daniel Dunbar if (A->getOption().matches(options::OPT_Wp_COMMA) && 156eda3f707fd53f90f4232b0e694d3f5514237aba5Daniel Dunbar A->getNumValues() == 2 && 157212df32d955c34dbb8b976bc0316e8eb83ac579eDaniel Dunbar (A->getValue(Args, 0) == llvm::StringRef("-MD") || 158212df32d955c34dbb8b976bc0316e8eb83ac579eDaniel Dunbar A->getValue(Args, 0) == llvm::StringRef("-MMD"))) { 159212df32d955c34dbb8b976bc0316e8eb83ac579eDaniel Dunbar // Rewrite to -MD/-MMD along with -MF. 160212df32d955c34dbb8b976bc0316e8eb83ac579eDaniel Dunbar if (A->getValue(Args, 0) == llvm::StringRef("-MD")) 161212df32d955c34dbb8b976bc0316e8eb83ac579eDaniel Dunbar DAL->AddFlagArg(A, Opts->getOption(options::OPT_MD)); 162212df32d955c34dbb8b976bc0316e8eb83ac579eDaniel Dunbar else 163212df32d955c34dbb8b976bc0316e8eb83ac579eDaniel Dunbar DAL->AddFlagArg(A, Opts->getOption(options::OPT_MMD)); 164eda3f707fd53f90f4232b0e694d3f5514237aba5Daniel Dunbar DAL->AddSeparateArg(A, Opts->getOption(options::OPT_MF), 165eda3f707fd53f90f4232b0e694d3f5514237aba5Daniel Dunbar A->getValue(Args, 1)); 166eda3f707fd53f90f4232b0e694d3f5514237aba5Daniel Dunbar continue; 167eda3f707fd53f90f4232b0e694d3f5514237aba5Daniel Dunbar } 168eda3f707fd53f90f4232b0e694d3f5514237aba5Daniel Dunbar 1697433fedce98a58341d0f30c2e12e8d53f3bba575Shantonu Sen // Rewrite reserved library names. 1707433fedce98a58341d0f30c2e12e8d53f3bba575Shantonu Sen if (A->getOption().matches(options::OPT_l)) { 171e5a37f48388c7e4cc081f44d13a4910bfa56cd35Daniel Dunbar llvm::StringRef Value = A->getValue(Args); 172e5a37f48388c7e4cc081f44d13a4910bfa56cd35Daniel Dunbar 1737433fedce98a58341d0f30c2e12e8d53f3bba575Shantonu Sen // Rewrite unless -nostdlib is present. 1747433fedce98a58341d0f30c2e12e8d53f3bba575Shantonu Sen if (!HasNostdlib && Value == "stdc++") { 175e5a37f48388c7e4cc081f44d13a4910bfa56cd35Daniel Dunbar DAL->AddFlagArg(A, Opts->getOption( 176e5a37f48388c7e4cc081f44d13a4910bfa56cd35Daniel Dunbar options::OPT_Z_reserved_lib_stdcxx)); 177e5a37f48388c7e4cc081f44d13a4910bfa56cd35Daniel Dunbar continue; 178e5a37f48388c7e4cc081f44d13a4910bfa56cd35Daniel Dunbar } 1797433fedce98a58341d0f30c2e12e8d53f3bba575Shantonu Sen 1807433fedce98a58341d0f30c2e12e8d53f3bba575Shantonu Sen // Rewrite unconditionally. 1817433fedce98a58341d0f30c2e12e8d53f3bba575Shantonu Sen if (Value == "cc_kext") { 1827433fedce98a58341d0f30c2e12e8d53f3bba575Shantonu Sen DAL->AddFlagArg(A, Opts->getOption( 1837433fedce98a58341d0f30c2e12e8d53f3bba575Shantonu Sen options::OPT_Z_reserved_lib_cckext)); 1847433fedce98a58341d0f30c2e12e8d53f3bba575Shantonu Sen continue; 1857433fedce98a58341d0f30c2e12e8d53f3bba575Shantonu Sen } 186e5a37f48388c7e4cc081f44d13a4910bfa56cd35Daniel Dunbar } 187e5a37f48388c7e4cc081f44d13a4910bfa56cd35Daniel Dunbar 188279c1dbebf37cd128f3c73c70741a6b8c35ad025Daniel Dunbar DAL->append(*it); 189f78925f633e949f06521d9ffd937019e59f35efcDaniel Dunbar } 190279c1dbebf37cd128f3c73c70741a6b8c35ad025Daniel Dunbar 191a77a723489b0cff63bf90f23416e10b8b6fc1f55Daniel Dunbar // Add a default value of -mlinker-version=, if one was given and the user 192a77a723489b0cff63bf90f23416e10b8b6fc1f55Daniel Dunbar // didn't specify one. 193a77a723489b0cff63bf90f23416e10b8b6fc1f55Daniel Dunbar#if defined(HOST_LINK_VERSION) 194a77a723489b0cff63bf90f23416e10b8b6fc1f55Daniel Dunbar if (!Args.hasArg(options::OPT_mlinker_version_EQ)) { 195a77a723489b0cff63bf90f23416e10b8b6fc1f55Daniel Dunbar DAL->AddJoinedArg(0, Opts->getOption(options::OPT_mlinker_version_EQ), 196a77a723489b0cff63bf90f23416e10b8b6fc1f55Daniel Dunbar HOST_LINK_VERSION); 197c326b64a4d14ad89d6a5d227d2460050149d5461Daniel Dunbar DAL->getLastArg(options::OPT_mlinker_version_EQ)->claim(); 198a77a723489b0cff63bf90f23416e10b8b6fc1f55Daniel Dunbar } 199a77a723489b0cff63bf90f23416e10b8b6fc1f55Daniel Dunbar#endif 200a77a723489b0cff63bf90f23416e10b8b6fc1f55Daniel Dunbar 201279c1dbebf37cd128f3c73c70741a6b8c35ad025Daniel Dunbar return DAL; 202279c1dbebf37cd128f3c73c70741a6b8c35ad025Daniel Dunbar} 203279c1dbebf37cd128f3c73c70741a6b8c35ad025Daniel Dunbar 2047f9fc3f7ce076645cb6aefc99c64d9446caf13d6Chris LattnerCompilation *Driver::BuildCompilation(llvm::ArrayRef<const char *> ArgList) { 2058f25c79e59d88df41c5a3cabba1c58035d384a6eDaniel Dunbar llvm::PrettyStackTraceString CrashInfo("Compilation construction"); 2068f25c79e59d88df41c5a3cabba1c58035d384a6eDaniel Dunbar 207a82318332c9e9b61d3d17371e675ca2859877ee5Daniel Dunbar // FIXME: Handle environment options which effect driver behavior, somewhere 208a82318332c9e9b61d3d17371e675ca2859877ee5Daniel Dunbar // (client?). GCC_EXEC_PREFIX, COMPILER_PATH, LIBRARY_PATH, LPATH, 209a82318332c9e9b61d3d17371e675ca2859877ee5Daniel Dunbar // CC_PRINT_OPTIONS. 210cb881672c2c46142ec1bdfa401c9818ae805db0fDaniel Dunbar 211cb881672c2c46142ec1bdfa401c9818ae805db0fDaniel Dunbar // FIXME: What are we going to do with -V and -b? 212cb881672c2c46142ec1bdfa401c9818ae805db0fDaniel Dunbar 213a82318332c9e9b61d3d17371e675ca2859877ee5Daniel Dunbar // FIXME: This stuff needs to go into the Compilation, not the driver. 21453ec55215075c8f4ddd47ca6ed7d382f16beb670Daniel Dunbar bool CCCPrintOptions = false, CCCPrintActions = false; 2150648262df75d97b464c2be0ed867da3615659785Daniel Dunbar 2167f9fc3f7ce076645cb6aefc99c64d9446caf13d6Chris Lattner InputArgList *Args = ParseArgStrings(ArgList.slice(1)); 2178477ee93c9d81d1b5fe321706ff95bcd219c744bDaniel Dunbar 2187ca7987669fcd14d91b4227a9ddcf7fdd8b1f8c2Rafael Espindola // -no-canonical-prefixes is used very early in main. 2197ca7987669fcd14d91b4227a9ddcf7fdd8b1f8c2Rafael Espindola Args->ClaimAllArgs(options::OPT_no_canonical_prefixes); 2207ca7987669fcd14d91b4227a9ddcf7fdd8b1f8c2Rafael Espindola 221c19a12dc3d441bec62eed55e312b76c12d6d9022Daniel Dunbar // Ignore -pipe. 222c19a12dc3d441bec62eed55e312b76c12d6d9022Daniel Dunbar Args->ClaimAllArgs(options::OPT_pipe); 223c19a12dc3d441bec62eed55e312b76c12d6d9022Daniel Dunbar 2248477ee93c9d81d1b5fe321706ff95bcd219c744bDaniel Dunbar // Extract -ccc args. 225365c02f65be026f90e67a8e00e7b827cee60e228Daniel Dunbar // 226a82318332c9e9b61d3d17371e675ca2859877ee5Daniel Dunbar // FIXME: We need to figure out where this behavior should live. Most of it 227a82318332c9e9b61d3d17371e675ca2859877ee5Daniel Dunbar // should be outside in the client; the parts that aren't should have proper 228a82318332c9e9b61d3d17371e675ca2859877ee5Daniel Dunbar // options, either by introducing new ones or by overloading gcc ones like -V 229a82318332c9e9b61d3d17371e675ca2859877ee5Daniel Dunbar // or -b. 2308477ee93c9d81d1b5fe321706ff95bcd219c744bDaniel Dunbar CCCPrintOptions = Args->hasArg(options::OPT_ccc_print_options); 2318477ee93c9d81d1b5fe321706ff95bcd219c744bDaniel Dunbar CCCPrintActions = Args->hasArg(options::OPT_ccc_print_phases); 2328477ee93c9d81d1b5fe321706ff95bcd219c744bDaniel Dunbar CCCPrintBindings = Args->hasArg(options::OPT_ccc_print_bindings); 233f5431e3563a64758584906cb9e0d10719a0756ecDaniel Dunbar CCCIsCXX = Args->hasArg(options::OPT_ccc_cxx) || CCCIsCXX; 2348477ee93c9d81d1b5fe321706ff95bcd219c744bDaniel Dunbar CCCEcho = Args->hasArg(options::OPT_ccc_echo); 2358477ee93c9d81d1b5fe321706ff95bcd219c744bDaniel Dunbar if (const Arg *A = Args->getLastArg(options::OPT_ccc_gcc_name)) 2368477ee93c9d81d1b5fe321706ff95bcd219c744bDaniel Dunbar CCCGenericGCCName = A->getValue(*Args); 2378477ee93c9d81d1b5fe321706ff95bcd219c744bDaniel Dunbar CCCUseClangCXX = Args->hasFlag(options::OPT_ccc_clang_cxx, 238f5431e3563a64758584906cb9e0d10719a0756ecDaniel Dunbar options::OPT_ccc_no_clang_cxx, 239f5431e3563a64758584906cb9e0d10719a0756ecDaniel Dunbar CCCUseClangCXX); 2408477ee93c9d81d1b5fe321706ff95bcd219c744bDaniel Dunbar CCCUsePCH = Args->hasFlag(options::OPT_ccc_pch_is_pch, 2418477ee93c9d81d1b5fe321706ff95bcd219c744bDaniel Dunbar options::OPT_ccc_pch_is_pth); 2428477ee93c9d81d1b5fe321706ff95bcd219c744bDaniel Dunbar CCCUseClang = !Args->hasArg(options::OPT_ccc_no_clang); 2438477ee93c9d81d1b5fe321706ff95bcd219c744bDaniel Dunbar CCCUseClangCPP = !Args->hasArg(options::OPT_ccc_no_clang_cpp); 2448477ee93c9d81d1b5fe321706ff95bcd219c744bDaniel Dunbar if (const Arg *A = Args->getLastArg(options::OPT_ccc_clang_archs)) { 2458477ee93c9d81d1b5fe321706ff95bcd219c744bDaniel Dunbar llvm::StringRef Cur = A->getValue(*Args); 2468477ee93c9d81d1b5fe321706ff95bcd219c744bDaniel Dunbar 2478477ee93c9d81d1b5fe321706ff95bcd219c744bDaniel Dunbar CCCClangArchs.clear(); 2488477ee93c9d81d1b5fe321706ff95bcd219c744bDaniel Dunbar while (!Cur.empty()) { 2498477ee93c9d81d1b5fe321706ff95bcd219c744bDaniel Dunbar std::pair<llvm::StringRef, llvm::StringRef> Split = Cur.split(','); 2508477ee93c9d81d1b5fe321706ff95bcd219c744bDaniel Dunbar 2518477ee93c9d81d1b5fe321706ff95bcd219c744bDaniel Dunbar if (!Split.first.empty()) { 2528477ee93c9d81d1b5fe321706ff95bcd219c744bDaniel Dunbar llvm::Triple::ArchType Arch = 2538477ee93c9d81d1b5fe321706ff95bcd219c744bDaniel Dunbar llvm::Triple(Split.first, "", "").getArch(); 2548477ee93c9d81d1b5fe321706ff95bcd219c744bDaniel Dunbar 255e9c7b9ef2f2054401d099dc7666a4143ef14089dDaniel Dunbar if (Arch == llvm::Triple::UnknownArch) 256e9c7b9ef2f2054401d099dc7666a4143ef14089dDaniel Dunbar Diag(clang::diag::err_drv_invalid_arch_name) << Split.first; 257365c02f65be026f90e67a8e00e7b827cee60e228Daniel Dunbar 2588477ee93c9d81d1b5fe321706ff95bcd219c744bDaniel Dunbar CCCClangArchs.insert(Arch); 259a6046bec7fc835186dde134fb81aa1b7d45cd9f0Daniel Dunbar } 2608477ee93c9d81d1b5fe321706ff95bcd219c744bDaniel Dunbar 2618477ee93c9d81d1b5fe321706ff95bcd219c744bDaniel Dunbar Cur = Split.second; 262365c02f65be026f90e67a8e00e7b827cee60e228Daniel Dunbar } 263365c02f65be026f90e67a8e00e7b827cee60e228Daniel Dunbar } 2646699877c45d119ca74e4c1d7c3c9fb90e95398e1Daniel Dunbar // FIXME: We shouldn't overwrite the default host triple here, but we have 2656699877c45d119ca74e4c1d7c3c9fb90e95398e1Daniel Dunbar // nowhere else to put this currently. 2668477ee93c9d81d1b5fe321706ff95bcd219c744bDaniel Dunbar if (const Arg *A = Args->getLastArg(options::OPT_ccc_host_triple)) 2676699877c45d119ca74e4c1d7c3c9fb90e95398e1Daniel Dunbar DefaultHostTriple = A->getValue(*Args); 2688477ee93c9d81d1b5fe321706ff95bcd219c744bDaniel Dunbar if (const Arg *A = Args->getLastArg(options::OPT_ccc_install_dir)) 269c4ab3493bb3048014895cf577a8f27505a83603dDaniel Dunbar Dir = InstalledDir = A->getValue(*Args); 27009982cec0029bc495591067fa89967b6b4d1fa19Benjamin Kramer for (arg_iterator it = Args->filtered_begin(options::OPT_B), 27109982cec0029bc495591067fa89967b6b4d1fa19Benjamin Kramer ie = Args->filtered_end(); it != ie; ++it) { 27209982cec0029bc495591067fa89967b6b4d1fa19Benjamin Kramer const Arg *A = *it; 27309982cec0029bc495591067fa89967b6b4d1fa19Benjamin Kramer A->claim(); 27409982cec0029bc495591067fa89967b6b4d1fa19Benjamin Kramer PrefixDirs.push_back(A->getValue(*Args, 0)); 27509982cec0029bc495591067fa89967b6b4d1fa19Benjamin Kramer } 2768ab2bdcc4f397e100c684ede8e8ca6e226e1380aJoerg Sonnenberger if (const Arg *A = Args->getLastArg(options::OPT__sysroot_EQ)) 2778ab2bdcc4f397e100c684ede8e8ca6e226e1380aJoerg Sonnenberger SysRoot = A->getValue(*Args); 27805e5930166333e382522b942f00d08abc6c0a28eJoerg Sonnenberger if (Args->hasArg(options::OPT_nostdlib)) 27905e5930166333e382522b942f00d08abc6c0a28eJoerg Sonnenberger UseStdLib = false; 280365c02f65be026f90e67a8e00e7b827cee60e228Daniel Dunbar 2816699877c45d119ca74e4c1d7c3c9fb90e95398e1Daniel Dunbar Host = GetHostInfo(DefaultHostTriple.c_str()); 282cb881672c2c46142ec1bdfa401c9818ae805db0fDaniel Dunbar 283279c1dbebf37cd128f3c73c70741a6b8c35ad025Daniel Dunbar // Perform the default argument translations. 284279c1dbebf37cd128f3c73c70741a6b8c35ad025Daniel Dunbar DerivedArgList *TranslatedArgs = TranslateInputArgs(*Args); 285279c1dbebf37cd128f3c73c70741a6b8c35ad025Daniel Dunbar 28621549237f14505cfc2a18a06416372a36229d0ceDaniel Dunbar // The compilation takes ownership of Args. 287279c1dbebf37cd128f3c73c70741a6b8c35ad025Daniel Dunbar Compilation *C = new Compilation(*this, *Host->CreateToolChain(*Args), Args, 288279c1dbebf37cd128f3c73c70741a6b8c35ad025Daniel Dunbar TranslatedArgs); 28921549237f14505cfc2a18a06416372a36229d0ceDaniel Dunbar 290365c02f65be026f90e67a8e00e7b827cee60e228Daniel Dunbar // FIXME: This behavior shouldn't be here. 291365c02f65be026f90e67a8e00e7b827cee60e228Daniel Dunbar if (CCCPrintOptions) { 292be21cd0f07726045367861d3882d18ef30f6a30cDaniel Dunbar PrintOptions(C->getInputArgs()); 29321549237f14505cfc2a18a06416372a36229d0ceDaniel Dunbar return C; 294365c02f65be026f90e67a8e00e7b827cee60e228Daniel Dunbar } 29553ec55215075c8f4ddd47ca6ed7d382f16beb670Daniel Dunbar 29621549237f14505cfc2a18a06416372a36229d0ceDaniel Dunbar if (!HandleImmediateArgs(*C)) 29721549237f14505cfc2a18a06416372a36229d0ceDaniel Dunbar return C; 298cb881672c2c46142ec1bdfa401c9818ae805db0fDaniel Dunbar 29974edcea3db1f85ba73ad0fede2ed5e2f096cac4bDaniel Dunbar // Construct the list of abstract actions to perform for this compilation. 30053ec55215075c8f4ddd47ca6ed7d382f16beb670Daniel Dunbar if (Host->useDriverDriver()) 30165f7165676854bf75494f5b73a620d7237db5d41Joerg Sonnenberger BuildUniversalActions(C->getDefaultToolChain(), C->getArgs(), 30274edcea3db1f85ba73ad0fede2ed5e2f096cac4bDaniel Dunbar C->getActions()); 30353ec55215075c8f4ddd47ca6ed7d382f16beb670Daniel Dunbar else 30465f7165676854bf75494f5b73a620d7237db5d41Joerg Sonnenberger BuildActions(C->getDefaultToolChain(), C->getArgs(), C->getActions()); 30553ec55215075c8f4ddd47ca6ed7d382f16beb670Daniel Dunbar 30653ec55215075c8f4ddd47ca6ed7d382f16beb670Daniel Dunbar if (CCCPrintActions) { 30710ffa9a4887d9376e3eb3598e40523d1b58773c9Daniel Dunbar PrintActions(*C); 30821549237f14505cfc2a18a06416372a36229d0ceDaniel Dunbar return C; 30953ec55215075c8f4ddd47ca6ed7d382f16beb670Daniel Dunbar } 310ab835430b4f758dd49903251c7c7f21b95933c89Daniel Dunbar 31121549237f14505cfc2a18a06416372a36229d0ceDaniel Dunbar BuildJobs(*C); 3128d2554a2c3201aa664cbf2108cf9d57aa0aa4b0aDaniel Dunbar 3138d2554a2c3201aa664cbf2108cf9d57aa0aa4b0aDaniel Dunbar return C; 314365c02f65be026f90e67a8e00e7b827cee60e228Daniel Dunbar} 315365c02f65be026f90e67a8e00e7b827cee60e228Daniel Dunbar 316c88a88f6f7672b6bb831dce9da4acfa0c846975fDaniel Dunbarint Driver::ExecuteCompilation(const Compilation &C) const { 317c88a88f6f7672b6bb831dce9da4acfa0c846975fDaniel Dunbar // Just print if -### was present. 318c88a88f6f7672b6bb831dce9da4acfa0c846975fDaniel Dunbar if (C.getArgs().hasArg(options::OPT__HASH_HASH_HASH)) { 319c88a88f6f7672b6bb831dce9da4acfa0c846975fDaniel Dunbar C.PrintJob(llvm::errs(), C.getJobs(), "\n", true); 320c88a88f6f7672b6bb831dce9da4acfa0c846975fDaniel Dunbar return 0; 321c88a88f6f7672b6bb831dce9da4acfa0c846975fDaniel Dunbar } 322c88a88f6f7672b6bb831dce9da4acfa0c846975fDaniel Dunbar 323c88a88f6f7672b6bb831dce9da4acfa0c846975fDaniel Dunbar // If there were errors building the compilation, quit now. 324be3aab6abe5e66bb86596da806acc49614eacb69Argyrios Kyrtzidis if (getDiags().hasErrorOccurred()) 325c88a88f6f7672b6bb831dce9da4acfa0c846975fDaniel Dunbar return 1; 326c88a88f6f7672b6bb831dce9da4acfa0c846975fDaniel Dunbar 327c88a88f6f7672b6bb831dce9da4acfa0c846975fDaniel Dunbar const Command *FailingCommand = 0; 328c88a88f6f7672b6bb831dce9da4acfa0c846975fDaniel Dunbar int Res = C.ExecuteJob(C.getJobs(), FailingCommand); 329a82318332c9e9b61d3d17371e675ca2859877ee5Daniel Dunbar 330c88a88f6f7672b6bb831dce9da4acfa0c846975fDaniel Dunbar // Remove temp files. 331c88a88f6f7672b6bb831dce9da4acfa0c846975fDaniel Dunbar C.CleanupFileList(C.getTempFiles()); 332c88a88f6f7672b6bb831dce9da4acfa0c846975fDaniel Dunbar 3339fcbc050a704cc5bb46e1c493940aca7c79aebf9Daniel Dunbar // If the command succeeded, we are done. 3349fcbc050a704cc5bb46e1c493940aca7c79aebf9Daniel Dunbar if (Res == 0) 3359fcbc050a704cc5bb46e1c493940aca7c79aebf9Daniel Dunbar return Res; 3369fcbc050a704cc5bb46e1c493940aca7c79aebf9Daniel Dunbar 3379fcbc050a704cc5bb46e1c493940aca7c79aebf9Daniel Dunbar // Otherwise, remove result files as well. 3389fcbc050a704cc5bb46e1c493940aca7c79aebf9Daniel Dunbar if (!C.getArgs().hasArg(options::OPT_save_temps)) 339c88a88f6f7672b6bb831dce9da4acfa0c846975fDaniel Dunbar C.CleanupFileList(C.getResultFiles(), true); 340c88a88f6f7672b6bb831dce9da4acfa0c846975fDaniel Dunbar 341c88a88f6f7672b6bb831dce9da4acfa0c846975fDaniel Dunbar // Print extra information about abnormal failures, if possible. 3429fcbc050a704cc5bb46e1c493940aca7c79aebf9Daniel Dunbar // 3439fcbc050a704cc5bb46e1c493940aca7c79aebf9Daniel Dunbar // This is ad-hoc, but we don't want to be excessively noisy. If the result 3449fcbc050a704cc5bb46e1c493940aca7c79aebf9Daniel Dunbar // status was 1, assume the command failed normally. In particular, if it was 3459fcbc050a704cc5bb46e1c493940aca7c79aebf9Daniel Dunbar // the compiler then assume it gave a reasonable error code. Failures in other 3469fcbc050a704cc5bb46e1c493940aca7c79aebf9Daniel Dunbar // tools are less common, and they generally have worse diagnostics, so always 3479fcbc050a704cc5bb46e1c493940aca7c79aebf9Daniel Dunbar // print the diagnostic there. 3489fcbc050a704cc5bb46e1c493940aca7c79aebf9Daniel Dunbar const Tool &FailingTool = FailingCommand->getCreator(); 3499fcbc050a704cc5bb46e1c493940aca7c79aebf9Daniel Dunbar 3509fcbc050a704cc5bb46e1c493940aca7c79aebf9Daniel Dunbar if (!FailingCommand->getCreator().hasGoodDiagnostics() || Res != 1) { 3519fcbc050a704cc5bb46e1c493940aca7c79aebf9Daniel Dunbar // FIXME: See FIXME above regarding result code interpretation. 3529fcbc050a704cc5bb46e1c493940aca7c79aebf9Daniel Dunbar if (Res < 0) 3539fcbc050a704cc5bb46e1c493940aca7c79aebf9Daniel Dunbar Diag(clang::diag::err_drv_command_signalled) 3549fcbc050a704cc5bb46e1c493940aca7c79aebf9Daniel Dunbar << FailingTool.getShortName() << -Res; 3559fcbc050a704cc5bb46e1c493940aca7c79aebf9Daniel Dunbar else 3569fcbc050a704cc5bb46e1c493940aca7c79aebf9Daniel Dunbar Diag(clang::diag::err_drv_command_failed) 3579fcbc050a704cc5bb46e1c493940aca7c79aebf9Daniel Dunbar << FailingTool.getShortName() << Res; 358c88a88f6f7672b6bb831dce9da4acfa0c846975fDaniel Dunbar } 359c88a88f6f7672b6bb831dce9da4acfa0c846975fDaniel Dunbar 360c88a88f6f7672b6bb831dce9da4acfa0c846975fDaniel Dunbar return Res; 361c88a88f6f7672b6bb831dce9da4acfa0c846975fDaniel Dunbar} 362c88a88f6f7672b6bb831dce9da4acfa0c846975fDaniel Dunbar 363d65bddcbe1385a4de212ecbbdc8919c54b3efeb0Daniel Dunbarvoid Driver::PrintOptions(const ArgList &Args) const { 3640648262df75d97b464c2be0ed867da3615659785Daniel Dunbar unsigned i = 0; 365a82318332c9e9b61d3d17371e675ca2859877ee5Daniel Dunbar for (ArgList::const_iterator it = Args.begin(), ie = Args.end(); 3660648262df75d97b464c2be0ed867da3615659785Daniel Dunbar it != ie; ++it, ++i) { 3670648262df75d97b464c2be0ed867da3615659785Daniel Dunbar Arg *A = *it; 3680648262df75d97b464c2be0ed867da3615659785Daniel Dunbar llvm::errs() << "Option " << i << " - " 3690648262df75d97b464c2be0ed867da3615659785Daniel Dunbar << "Name: \"" << A->getOption().getName() << "\", " 3700648262df75d97b464c2be0ed867da3615659785Daniel Dunbar << "Values: {"; 3710648262df75d97b464c2be0ed867da3615659785Daniel Dunbar for (unsigned j = 0; j < A->getNumValues(); ++j) { 3720648262df75d97b464c2be0ed867da3615659785Daniel Dunbar if (j) 3730648262df75d97b464c2be0ed867da3615659785Daniel Dunbar llvm::errs() << ", "; 37453ec55215075c8f4ddd47ca6ed7d382f16beb670Daniel Dunbar llvm::errs() << '"' << A->getValue(Args, j) << '"'; 3750648262df75d97b464c2be0ed867da3615659785Daniel Dunbar } 3760648262df75d97b464c2be0ed867da3615659785Daniel Dunbar llvm::errs() << "}\n"; 3770648262df75d97b464c2be0ed867da3615659785Daniel Dunbar } 3783ede8d0a7d1813f678ccc6011a99a0834b1b6116Daniel Dunbar} 379dd98e2cad165ca73c769e4f105a4e47c2216387aDaniel Dunbar 380c35d71f1e0a0c72fd43a73ddecd408bf43d501deDaniel Dunbarvoid Driver::PrintHelp(bool ShowHidden) const { 38143302d4144b5291961aa160d2fe191c09a9d8ad1Daniel Dunbar getOpts().PrintHelp(llvm::outs(), Name.c_str(), DriverTitle.c_str(), 38243302d4144b5291961aa160d2fe191c09a9d8ad1Daniel Dunbar ShowHidden); 38391e28afe3503893c69afd71877f11e3bf03fa4ceDaniel Dunbar} 38491e28afe3503893c69afd71877f11e3bf03fa4ceDaniel Dunbar 385793007242ba209b68ce14ec7547ac70ee981303aDaniel Dunbarvoid Driver::PrintVersion(const Compilation &C, llvm::raw_ostream &OS) const { 386a82318332c9e9b61d3d17371e675ca2859877ee5Daniel Dunbar // FIXME: The following handlers should use a callback mechanism, we don't 387a82318332c9e9b61d3d17371e675ca2859877ee5Daniel Dunbar // know what the client would like to do. 388a18f1b88a7ef3d2c944bb1d3b6586a2860ce2baaTed Kremenek OS << getClangFullVersion() << '\n'; 38970c8db1003af49d3627aeef41fcdd7c6c6a7df79Daniel Dunbar const ToolChain &TC = C.getDefaultToolChain(); 390793007242ba209b68ce14ec7547ac70ee981303aDaniel Dunbar OS << "Target: " << TC.getTripleString() << '\n'; 3913ee96baa3fff269e145855a6f7526c36e59a7f4bDaniel Dunbar 3923ee96baa3fff269e145855a6f7526c36e59a7f4bDaniel Dunbar // Print the threading model. 3933ee96baa3fff269e145855a6f7526c36e59a7f4bDaniel Dunbar // 3943ee96baa3fff269e145855a6f7526c36e59a7f4bDaniel Dunbar // FIXME: Implement correctly. 395793007242ba209b68ce14ec7547ac70ee981303aDaniel Dunbar OS << "Thread model: " << "posix" << '\n'; 396cb881672c2c46142ec1bdfa401c9818ae805db0fDaniel Dunbar} 397cb881672c2c46142ec1bdfa401c9818ae805db0fDaniel Dunbar 398c3d26cc4eea5187ce13ed180b479ff8ef41015a7Chris Lattner/// PrintDiagnosticCategories - Implement the --print-diagnostic-categories 399c3d26cc4eea5187ce13ed180b479ff8ef41015a7Chris Lattner/// option. 400c3d26cc4eea5187ce13ed180b479ff8ef41015a7Chris Lattnerstatic void PrintDiagnosticCategories(llvm::raw_ostream &OS) { 401477aab6782795e7472055a54108d2df270ce1a89Argyrios Kyrtzidis // Skip the empty category. 402477aab6782795e7472055a54108d2df270ce1a89Argyrios Kyrtzidis for (unsigned i = 1, max = DiagnosticIDs::getNumberOfCategories(); 403477aab6782795e7472055a54108d2df270ce1a89Argyrios Kyrtzidis i != max; ++i) 404477aab6782795e7472055a54108d2df270ce1a89Argyrios Kyrtzidis OS << i << ',' << DiagnosticIDs::getCategoryNameFromID(i) << '\n'; 405c3d26cc4eea5187ce13ed180b479ff8ef41015a7Chris Lattner} 406c3d26cc4eea5187ce13ed180b479ff8ef41015a7Chris Lattner 40721549237f14505cfc2a18a06416372a36229d0ceDaniel Dunbarbool Driver::HandleImmediateArgs(const Compilation &C) { 408e82ec0bead14ae262cddbe958b77767a3f6aebcdDaniel Dunbar // The order these options are handled in gcc is all over the place, but we 409a82318332c9e9b61d3d17371e675ca2859877ee5Daniel Dunbar // don't expect inconsistencies w.r.t. that to matter in practice. 41091e28afe3503893c69afd71877f11e3bf03fa4ceDaniel Dunbar 411d829950b2b75d50fca2772a20129323a186993a5Daniel Dunbar if (C.getArgs().hasArg(options::OPT_dumpmachine)) { 412d829950b2b75d50fca2772a20129323a186993a5Daniel Dunbar llvm::outs() << C.getDefaultToolChain().getTripleString() << '\n'; 413d829950b2b75d50fca2772a20129323a186993a5Daniel Dunbar return false; 414d829950b2b75d50fca2772a20129323a186993a5Daniel Dunbar } 415d829950b2b75d50fca2772a20129323a186993a5Daniel Dunbar 416e06dc219a869d73b6c9a398a2dee0aa2d4e2dcf0Daniel Dunbar if (C.getArgs().hasArg(options::OPT_dumpversion)) { 41795a907fc0f2f717dca38a379c1d2353bfea06d4fDaniel Dunbar // Since -dumpversion is only implemented for pedantic GCC compatibility, we 41895a907fc0f2f717dca38a379c1d2353bfea06d4fDaniel Dunbar // return an answer which matches our definition of __VERSION__. 41995a907fc0f2f717dca38a379c1d2353bfea06d4fDaniel Dunbar // 42095a907fc0f2f717dca38a379c1d2353bfea06d4fDaniel Dunbar // If we want to return a more correct answer some day, then we should 42195a907fc0f2f717dca38a379c1d2353bfea06d4fDaniel Dunbar // introduce a non-pedantically GCC compatible mode to Clang in which we 42295a907fc0f2f717dca38a379c1d2353bfea06d4fDaniel Dunbar // provide sensible definitions for -dumpversion, __VERSION__, etc. 42395a907fc0f2f717dca38a379c1d2353bfea06d4fDaniel Dunbar llvm::outs() << "4.2.1\n"; 424e06dc219a869d73b6c9a398a2dee0aa2d4e2dcf0Daniel Dunbar return false; 425e06dc219a869d73b6c9a398a2dee0aa2d4e2dcf0Daniel Dunbar } 426f78925f633e949f06521d9ffd937019e59f35efcDaniel Dunbar 427c3d26cc4eea5187ce13ed180b479ff8ef41015a7Chris Lattner if (C.getArgs().hasArg(options::OPT__print_diagnostic_categories)) { 428c3d26cc4eea5187ce13ed180b479ff8ef41015a7Chris Lattner PrintDiagnosticCategories(llvm::outs()); 429c3d26cc4eea5187ce13ed180b479ff8ef41015a7Chris Lattner return false; 430c3d26cc4eea5187ce13ed180b479ff8ef41015a7Chris Lattner } 431e06dc219a869d73b6c9a398a2dee0aa2d4e2dcf0Daniel Dunbar 432a82318332c9e9b61d3d17371e675ca2859877ee5Daniel Dunbar if (C.getArgs().hasArg(options::OPT__help) || 433c35d71f1e0a0c72fd43a73ddecd408bf43d501deDaniel Dunbar C.getArgs().hasArg(options::OPT__help_hidden)) { 434c35d71f1e0a0c72fd43a73ddecd408bf43d501deDaniel Dunbar PrintHelp(C.getArgs().hasArg(options::OPT__help_hidden)); 43591e28afe3503893c69afd71877f11e3bf03fa4ceDaniel Dunbar return false; 43691e28afe3503893c69afd71877f11e3bf03fa4ceDaniel Dunbar } 43791e28afe3503893c69afd71877f11e3bf03fa4ceDaniel Dunbar 4386cc73de6ebb3eb00af7dd5149f6778318f1fb76fDaniel Dunbar if (C.getArgs().hasArg(options::OPT__version)) { 439a82318332c9e9b61d3d17371e675ca2859877ee5Daniel Dunbar // Follow gcc behavior and use stdout for --version and stderr for -v. 440793007242ba209b68ce14ec7547ac70ee981303aDaniel Dunbar PrintVersion(C, llvm::outs()); 4416cc73de6ebb3eb00af7dd5149f6778318f1fb76fDaniel Dunbar return false; 4426cc73de6ebb3eb00af7dd5149f6778318f1fb76fDaniel Dunbar } 4436cc73de6ebb3eb00af7dd5149f6778318f1fb76fDaniel Dunbar 444a82318332c9e9b61d3d17371e675ca2859877ee5Daniel Dunbar if (C.getArgs().hasArg(options::OPT_v) || 44521549237f14505cfc2a18a06416372a36229d0ceDaniel Dunbar C.getArgs().hasArg(options::OPT__HASH_HASH_HASH)) { 446793007242ba209b68ce14ec7547ac70ee981303aDaniel Dunbar PrintVersion(C, llvm::errs()); 447cb881672c2c46142ec1bdfa401c9818ae805db0fDaniel Dunbar SuppressMissingInputWarning = true; 448cb881672c2c46142ec1bdfa401c9818ae805db0fDaniel Dunbar } 449cb881672c2c46142ec1bdfa401c9818ae805db0fDaniel Dunbar 45021549237f14505cfc2a18a06416372a36229d0ceDaniel Dunbar const ToolChain &TC = C.getDefaultToolChain(); 451ca3459e95f552cfae6c9c5fb4ed161e3a662c25eDaniel Dunbar if (C.getArgs().hasArg(options::OPT_print_search_dirs)) { 452ca3459e95f552cfae6c9c5fb4ed161e3a662c25eDaniel Dunbar llvm::outs() << "programs: ="; 453ca3459e95f552cfae6c9c5fb4ed161e3a662c25eDaniel Dunbar for (ToolChain::path_list::const_iterator it = TC.getProgramPaths().begin(), 454ca3459e95f552cfae6c9c5fb4ed161e3a662c25eDaniel Dunbar ie = TC.getProgramPaths().end(); it != ie; ++it) { 455ca3459e95f552cfae6c9c5fb4ed161e3a662c25eDaniel Dunbar if (it != TC.getProgramPaths().begin()) 456ca3459e95f552cfae6c9c5fb4ed161e3a662c25eDaniel Dunbar llvm::outs() << ':'; 457ca3459e95f552cfae6c9c5fb4ed161e3a662c25eDaniel Dunbar llvm::outs() << *it; 458ca3459e95f552cfae6c9c5fb4ed161e3a662c25eDaniel Dunbar } 459ca3459e95f552cfae6c9c5fb4ed161e3a662c25eDaniel Dunbar llvm::outs() << "\n"; 460ca3459e95f552cfae6c9c5fb4ed161e3a662c25eDaniel Dunbar llvm::outs() << "libraries: ="; 461a82318332c9e9b61d3d17371e675ca2859877ee5Daniel Dunbar for (ToolChain::path_list::const_iterator it = TC.getFilePaths().begin(), 462ca3459e95f552cfae6c9c5fb4ed161e3a662c25eDaniel Dunbar ie = TC.getFilePaths().end(); it != ie; ++it) { 463ca3459e95f552cfae6c9c5fb4ed161e3a662c25eDaniel Dunbar if (it != TC.getFilePaths().begin()) 464ca3459e95f552cfae6c9c5fb4ed161e3a662c25eDaniel Dunbar llvm::outs() << ':'; 465ca3459e95f552cfae6c9c5fb4ed161e3a662c25eDaniel Dunbar llvm::outs() << *it; 466ca3459e95f552cfae6c9c5fb4ed161e3a662c25eDaniel Dunbar } 467ca3459e95f552cfae6c9c5fb4ed161e3a662c25eDaniel Dunbar llvm::outs() << "\n"; 46891e28afe3503893c69afd71877f11e3bf03fa4ceDaniel Dunbar return false; 469ca3459e95f552cfae6c9c5fb4ed161e3a662c25eDaniel Dunbar } 470ca3459e95f552cfae6c9c5fb4ed161e3a662c25eDaniel Dunbar 471a82318332c9e9b61d3d17371e675ca2859877ee5Daniel Dunbar // FIXME: The following handlers should use a callback mechanism, we don't 472a82318332c9e9b61d3d17371e675ca2859877ee5Daniel Dunbar // know what the client would like to do. 47321549237f14505cfc2a18a06416372a36229d0ceDaniel Dunbar if (Arg *A = C.getArgs().getLastArg(options::OPT_print_file_name_EQ)) { 4745ed34f4c58b6ad4e21038d713c1fae31a6146ff5Daniel Dunbar llvm::outs() << GetFilePath(A->getValue(C.getArgs()), TC) << "\n"; 475cb881672c2c46142ec1bdfa401c9818ae805db0fDaniel Dunbar return false; 476cb881672c2c46142ec1bdfa401c9818ae805db0fDaniel Dunbar } 477cb881672c2c46142ec1bdfa401c9818ae805db0fDaniel Dunbar 47821549237f14505cfc2a18a06416372a36229d0ceDaniel Dunbar if (Arg *A = C.getArgs().getLastArg(options::OPT_print_prog_name_EQ)) { 4795ed34f4c58b6ad4e21038d713c1fae31a6146ff5Daniel Dunbar llvm::outs() << GetProgramPath(A->getValue(C.getArgs()), TC) << "\n"; 480cb881672c2c46142ec1bdfa401c9818ae805db0fDaniel Dunbar return false; 481cb881672c2c46142ec1bdfa401c9818ae805db0fDaniel Dunbar } 482cb881672c2c46142ec1bdfa401c9818ae805db0fDaniel Dunbar 48321549237f14505cfc2a18a06416372a36229d0ceDaniel Dunbar if (C.getArgs().hasArg(options::OPT_print_libgcc_file_name)) { 4845ed34f4c58b6ad4e21038d713c1fae31a6146ff5Daniel Dunbar llvm::outs() << GetFilePath("libgcc.a", TC) << "\n"; 485cb881672c2c46142ec1bdfa401c9818ae805db0fDaniel Dunbar return false; 486cb881672c2c46142ec1bdfa401c9818ae805db0fDaniel Dunbar } 487cb881672c2c46142ec1bdfa401c9818ae805db0fDaniel Dunbar 48812cfe036d809173a25af0104844d4bb66a92252bDaniel Dunbar if (C.getArgs().hasArg(options::OPT_print_multi_lib)) { 48912cfe036d809173a25af0104844d4bb66a92252bDaniel Dunbar // FIXME: We need tool chain support for this. 49012cfe036d809173a25af0104844d4bb66a92252bDaniel Dunbar llvm::outs() << ".;\n"; 49112cfe036d809173a25af0104844d4bb66a92252bDaniel Dunbar 49212cfe036d809173a25af0104844d4bb66a92252bDaniel Dunbar switch (C.getDefaultToolChain().getTriple().getArch()) { 49312cfe036d809173a25af0104844d4bb66a92252bDaniel Dunbar default: 49412cfe036d809173a25af0104844d4bb66a92252bDaniel Dunbar break; 495a82318332c9e9b61d3d17371e675ca2859877ee5Daniel Dunbar 49612cfe036d809173a25af0104844d4bb66a92252bDaniel Dunbar case llvm::Triple::x86_64: 49712cfe036d809173a25af0104844d4bb66a92252bDaniel Dunbar llvm::outs() << "x86_64;@m64" << "\n"; 49812cfe036d809173a25af0104844d4bb66a92252bDaniel Dunbar break; 49912cfe036d809173a25af0104844d4bb66a92252bDaniel Dunbar 50012cfe036d809173a25af0104844d4bb66a92252bDaniel Dunbar case llvm::Triple::ppc64: 50112cfe036d809173a25af0104844d4bb66a92252bDaniel Dunbar llvm::outs() << "ppc64;@m64" << "\n"; 50212cfe036d809173a25af0104844d4bb66a92252bDaniel Dunbar break; 50312cfe036d809173a25af0104844d4bb66a92252bDaniel Dunbar } 50412cfe036d809173a25af0104844d4bb66a92252bDaniel Dunbar return false; 50512cfe036d809173a25af0104844d4bb66a92252bDaniel Dunbar } 50612cfe036d809173a25af0104844d4bb66a92252bDaniel Dunbar 50712cfe036d809173a25af0104844d4bb66a92252bDaniel Dunbar // FIXME: What is the difference between print-multi-directory and 50812cfe036d809173a25af0104844d4bb66a92252bDaniel Dunbar // print-multi-os-directory? 50912cfe036d809173a25af0104844d4bb66a92252bDaniel Dunbar if (C.getArgs().hasArg(options::OPT_print_multi_directory) || 51012cfe036d809173a25af0104844d4bb66a92252bDaniel Dunbar C.getArgs().hasArg(options::OPT_print_multi_os_directory)) { 51112cfe036d809173a25af0104844d4bb66a92252bDaniel Dunbar switch (C.getDefaultToolChain().getTriple().getArch()) { 51212cfe036d809173a25af0104844d4bb66a92252bDaniel Dunbar default: 51312cfe036d809173a25af0104844d4bb66a92252bDaniel Dunbar case llvm::Triple::x86: 51412cfe036d809173a25af0104844d4bb66a92252bDaniel Dunbar case llvm::Triple::ppc: 51512cfe036d809173a25af0104844d4bb66a92252bDaniel Dunbar llvm::outs() << "." << "\n"; 51612cfe036d809173a25af0104844d4bb66a92252bDaniel Dunbar break; 517a82318332c9e9b61d3d17371e675ca2859877ee5Daniel Dunbar 51812cfe036d809173a25af0104844d4bb66a92252bDaniel Dunbar case llvm::Triple::x86_64: 51912cfe036d809173a25af0104844d4bb66a92252bDaniel Dunbar llvm::outs() << "x86_64" << "\n"; 52012cfe036d809173a25af0104844d4bb66a92252bDaniel Dunbar break; 52112cfe036d809173a25af0104844d4bb66a92252bDaniel Dunbar 52212cfe036d809173a25af0104844d4bb66a92252bDaniel Dunbar case llvm::Triple::ppc64: 52312cfe036d809173a25af0104844d4bb66a92252bDaniel Dunbar llvm::outs() << "ppc64" << "\n"; 52412cfe036d809173a25af0104844d4bb66a92252bDaniel Dunbar break; 52512cfe036d809173a25af0104844d4bb66a92252bDaniel Dunbar } 52612cfe036d809173a25af0104844d4bb66a92252bDaniel Dunbar return false; 52712cfe036d809173a25af0104844d4bb66a92252bDaniel Dunbar } 52812cfe036d809173a25af0104844d4bb66a92252bDaniel Dunbar 529cb881672c2c46142ec1bdfa401c9818ae805db0fDaniel Dunbar return true; 530cb881672c2c46142ec1bdfa401c9818ae805db0fDaniel Dunbar} 531cb881672c2c46142ec1bdfa401c9818ae805db0fDaniel Dunbar 532a82318332c9e9b61d3d17371e675ca2859877ee5Daniel Dunbarstatic unsigned PrintActions1(const Compilation &C, Action *A, 533ba1021388e6839b76c8968b931189361c7286674Daniel Dunbar std::map<Action*, unsigned> &Ids) { 534ba1021388e6839b76c8968b931189361c7286674Daniel Dunbar if (Ids.count(A)) 535ba1021388e6839b76c8968b931189361c7286674Daniel Dunbar return Ids[A]; 536a82318332c9e9b61d3d17371e675ca2859877ee5Daniel Dunbar 537ba1021388e6839b76c8968b931189361c7286674Daniel Dunbar std::string str; 538ba1021388e6839b76c8968b931189361c7286674Daniel Dunbar llvm::raw_string_ostream os(str); 539a82318332c9e9b61d3d17371e675ca2859877ee5Daniel Dunbar 540ba1021388e6839b76c8968b931189361c7286674Daniel Dunbar os << Action::getClassName(A->getKind()) << ", "; 541a82318332c9e9b61d3d17371e675ca2859877ee5Daniel Dunbar if (InputAction *IA = dyn_cast<InputAction>(A)) { 54210ffa9a4887d9376e3eb3598e40523d1b58773c9Daniel Dunbar os << "\"" << IA->getInputArg().getValue(C.getArgs()) << "\""; 543ba1021388e6839b76c8968b931189361c7286674Daniel Dunbar } else if (BindArchAction *BIA = dyn_cast<BindArchAction>(A)) { 544a82318332c9e9b61d3d17371e675ca2859877ee5Daniel Dunbar os << '"' << (BIA->getArchName() ? BIA->getArchName() : 54510ffa9a4887d9376e3eb3598e40523d1b58773c9Daniel Dunbar C.getDefaultToolChain().getArchName()) << '"' 54610ffa9a4887d9376e3eb3598e40523d1b58773c9Daniel Dunbar << ", {" << PrintActions1(C, *BIA->begin(), Ids) << "}"; 547ba1021388e6839b76c8968b931189361c7286674Daniel Dunbar } else { 548ba1021388e6839b76c8968b931189361c7286674Daniel Dunbar os << "{"; 549ba1021388e6839b76c8968b931189361c7286674Daniel Dunbar for (Action::iterator it = A->begin(), ie = A->end(); it != ie;) { 55010ffa9a4887d9376e3eb3598e40523d1b58773c9Daniel Dunbar os << PrintActions1(C, *it, Ids); 551ba1021388e6839b76c8968b931189361c7286674Daniel Dunbar ++it; 552ba1021388e6839b76c8968b931189361c7286674Daniel Dunbar if (it != ie) 553ba1021388e6839b76c8968b931189361c7286674Daniel Dunbar os << ", "; 554ba1021388e6839b76c8968b931189361c7286674Daniel Dunbar } 555ba1021388e6839b76c8968b931189361c7286674Daniel Dunbar os << "}"; 556ba1021388e6839b76c8968b931189361c7286674Daniel Dunbar } 557ba1021388e6839b76c8968b931189361c7286674Daniel Dunbar 558ba1021388e6839b76c8968b931189361c7286674Daniel Dunbar unsigned Id = Ids.size(); 559ba1021388e6839b76c8968b931189361c7286674Daniel Dunbar Ids[A] = Id; 560a82318332c9e9b61d3d17371e675ca2859877ee5Daniel Dunbar llvm::errs() << Id << ": " << os.str() << ", " 561ba1021388e6839b76c8968b931189361c7286674Daniel Dunbar << types::getTypeName(A->getType()) << "\n"; 562ba1021388e6839b76c8968b931189361c7286674Daniel Dunbar 563ba1021388e6839b76c8968b931189361c7286674Daniel Dunbar return Id; 564ba1021388e6839b76c8968b931189361c7286674Daniel Dunbar} 565ba1021388e6839b76c8968b931189361c7286674Daniel Dunbar 56610ffa9a4887d9376e3eb3598e40523d1b58773c9Daniel Dunbarvoid Driver::PrintActions(const Compilation &C) const { 567ba1021388e6839b76c8968b931189361c7286674Daniel Dunbar std::map<Action*, unsigned> Ids; 568a82318332c9e9b61d3d17371e675ca2859877ee5Daniel Dunbar for (ActionList::const_iterator it = C.getActions().begin(), 56910ffa9a4887d9376e3eb3598e40523d1b58773c9Daniel Dunbar ie = C.getActions().end(); it != ie; ++it) 57010ffa9a4887d9376e3eb3598e40523d1b58773c9Daniel Dunbar PrintActions1(C, *it, Ids); 57153ec55215075c8f4ddd47ca6ed7d382f16beb670Daniel Dunbar} 57253ec55215075c8f4ddd47ca6ed7d382f16beb670Daniel Dunbar 5739d0fbeadc455c8292837b738b6af315d27930637Joerg Sonnenberger/// \brief Check whether the given input tree contains any compilation or 5749d0fbeadc455c8292837b738b6af315d27930637Joerg Sonnenberger/// assembly actions. 5759d0fbeadc455c8292837b738b6af315d27930637Joerg Sonnenbergerstatic bool ContainsCompileOrAssembleAction(const Action *A) { 576b5e2f698accd4d3a1379983304a2f31ec194c332Daniel Dunbar if (isa<CompileJobAction>(A) || isa<AssembleJobAction>(A)) 577b5e2f698accd4d3a1379983304a2f31ec194c332Daniel Dunbar return true; 578b5e2f698accd4d3a1379983304a2f31ec194c332Daniel Dunbar 579b5e2f698accd4d3a1379983304a2f31ec194c332Daniel Dunbar for (Action::const_iterator it = A->begin(), ie = A->end(); it != ie; ++it) 5809d0fbeadc455c8292837b738b6af315d27930637Joerg Sonnenberger if (ContainsCompileOrAssembleAction(*it)) 581b5e2f698accd4d3a1379983304a2f31ec194c332Daniel Dunbar return true; 582b5e2f698accd4d3a1379983304a2f31ec194c332Daniel Dunbar 583b5e2f698accd4d3a1379983304a2f31ec194c332Daniel Dunbar return false; 584b5e2f698accd4d3a1379983304a2f31ec194c332Daniel Dunbar} 585b5e2f698accd4d3a1379983304a2f31ec194c332Daniel Dunbar 58674edcea3db1f85ba73ad0fede2ed5e2f096cac4bDaniel Dunbarvoid Driver::BuildUniversalActions(const ToolChain &TC, 58765f7165676854bf75494f5b73a620d7237db5d41Joerg Sonnenberger const DerivedArgList &Args, 58821549237f14505cfc2a18a06416372a36229d0ceDaniel Dunbar ActionList &Actions) const { 589a82318332c9e9b61d3d17371e675ca2859877ee5Daniel Dunbar llvm::PrettyStackTraceString CrashInfo("Building universal build actions"); 590a82318332c9e9b61d3d17371e675ca2859877ee5Daniel Dunbar // Collect the list of architectures. Duplicates are allowed, but should only 591a82318332c9e9b61d3d17371e675ca2859877ee5Daniel Dunbar // be handled once (in the order seen). 5921368954db9ce2989ed8f03f5c65e8ee775a5229aDaniel Dunbar llvm::StringSet<> ArchNames; 5931368954db9ce2989ed8f03f5c65e8ee775a5229aDaniel Dunbar llvm::SmallVector<const char *, 4> Archs; 594a82318332c9e9b61d3d17371e675ca2859877ee5Daniel Dunbar for (ArgList::const_iterator it = Args.begin(), ie = Args.end(); 5952fe63e6adac0b9e5f52bcc3100b545e379417e6eDaniel Dunbar it != ie; ++it) { 5962fe63e6adac0b9e5f52bcc3100b545e379417e6eDaniel Dunbar Arg *A = *it; 5972fe63e6adac0b9e5f52bcc3100b545e379417e6eDaniel Dunbar 598b827a0541b5fd095fcdb7ad0c3df93ca158c619aDaniel Dunbar if (A->getOption().matches(options::OPT_arch)) { 59936df2904354ac150500ec16238a1ec3cce4ba83eDaniel Dunbar // Validate the option here; we don't save the type here because its 60036df2904354ac150500ec16238a1ec3cce4ba83eDaniel Dunbar // particular spelling may participate in other driver choices. 60136df2904354ac150500ec16238a1ec3cce4ba83eDaniel Dunbar llvm::Triple::ArchType Arch = 60236df2904354ac150500ec16238a1ec3cce4ba83eDaniel Dunbar llvm::Triple::getArchTypeForDarwinArchName(A->getValue(Args)); 60336df2904354ac150500ec16238a1ec3cce4ba83eDaniel Dunbar if (Arch == llvm::Triple::UnknownArch) { 60436df2904354ac150500ec16238a1ec3cce4ba83eDaniel Dunbar Diag(clang::diag::err_drv_invalid_arch_name) 60536df2904354ac150500ec16238a1ec3cce4ba83eDaniel Dunbar << A->getAsString(Args); 60636df2904354ac150500ec16238a1ec3cce4ba83eDaniel Dunbar continue; 60736df2904354ac150500ec16238a1ec3cce4ba83eDaniel Dunbar } 60836df2904354ac150500ec16238a1ec3cce4ba83eDaniel Dunbar 6097587719c40ebf02bf11e5e66c30bd20e98edebc2Daniel Dunbar A->claim(); 6103f30ddf680df44e0c5c43b8db0a22166dcd7066bDaniel Dunbar if (ArchNames.insert(A->getValue(Args))) 6113f30ddf680df44e0c5c43b8db0a22166dcd7066bDaniel Dunbar Archs.push_back(A->getValue(Args)); 6122fe63e6adac0b9e5f52bcc3100b545e379417e6eDaniel Dunbar } 6132fe63e6adac0b9e5f52bcc3100b545e379417e6eDaniel Dunbar } 6142fe63e6adac0b9e5f52bcc3100b545e379417e6eDaniel Dunbar 615a82318332c9e9b61d3d17371e675ca2859877ee5Daniel Dunbar // When there is no explicit arch for this platform, make sure we still bind 616a82318332c9e9b61d3d17371e675ca2859877ee5Daniel Dunbar // the architecture (to the default) so that -Xarch_ is handled correctly. 61710ffa9a4887d9376e3eb3598e40523d1b58773c9Daniel Dunbar if (!Archs.size()) 61810ffa9a4887d9376e3eb3598e40523d1b58773c9Daniel Dunbar Archs.push_back(0); 6192fe63e6adac0b9e5f52bcc3100b545e379417e6eDaniel Dunbar 620a82318332c9e9b61d3d17371e675ca2859877ee5Daniel Dunbar // FIXME: We killed off some others but these aren't yet detected in a 621a82318332c9e9b61d3d17371e675ca2859877ee5Daniel Dunbar // functional manner. If we added information to jobs about which "auxiliary" 622a82318332c9e9b61d3d17371e675ca2859877ee5Daniel Dunbar // files they wrote then we could detect the conflict these cause downstream. 6232fe63e6adac0b9e5f52bcc3100b545e379417e6eDaniel Dunbar if (Archs.size() > 1) { 6242fe63e6adac0b9e5f52bcc3100b545e379417e6eDaniel Dunbar // No recovery needed, the point of this is just to prevent 6252fe63e6adac0b9e5f52bcc3100b545e379417e6eDaniel Dunbar // overwriting the same files. 6262fe63e6adac0b9e5f52bcc3100b545e379417e6eDaniel Dunbar if (const Arg *A = Args.getLastArg(options::OPT_save_temps)) 627a82318332c9e9b61d3d17371e675ca2859877ee5Daniel Dunbar Diag(clang::diag::err_drv_invalid_opt_with_multiple_archs) 62838dd3d54186cf44ea9d37f463c3f2800ab526b82Daniel Dunbar << A->getAsString(Args); 6292fe63e6adac0b9e5f52bcc3100b545e379417e6eDaniel Dunbar } 6302fe63e6adac0b9e5f52bcc3100b545e379417e6eDaniel Dunbar 6312fe63e6adac0b9e5f52bcc3100b545e379417e6eDaniel Dunbar ActionList SingleActions; 63274edcea3db1f85ba73ad0fede2ed5e2f096cac4bDaniel Dunbar BuildActions(TC, Args, SingleActions); 6332fe63e6adac0b9e5f52bcc3100b545e379417e6eDaniel Dunbar 634be1cc3eec682ca73361edb4109a7969452d3dbebDaniel Dunbar // Add in arch bindings for every top level action, as well as lipo and 635be1cc3eec682ca73361edb4109a7969452d3dbebDaniel Dunbar // dsymutil steps if needed. 6362fe63e6adac0b9e5f52bcc3100b545e379417e6eDaniel Dunbar for (unsigned i = 0, e = SingleActions.size(); i != e; ++i) { 6372fe63e6adac0b9e5f52bcc3100b545e379417e6eDaniel Dunbar Action *Act = SingleActions[i]; 6382fe63e6adac0b9e5f52bcc3100b545e379417e6eDaniel Dunbar 639a82318332c9e9b61d3d17371e675ca2859877ee5Daniel Dunbar // Make sure we can lipo this kind of output. If not (and it is an actual 640a82318332c9e9b61d3d17371e675ca2859877ee5Daniel Dunbar // output) then we disallow, since we can't create an output file with the 641a82318332c9e9b61d3d17371e675ca2859877ee5Daniel Dunbar // right name without overwriting it. We could remove this oddity by just 642a82318332c9e9b61d3d17371e675ca2859877ee5Daniel Dunbar // changing the output names to include the arch, which would also fix 6432fe63e6adac0b9e5f52bcc3100b545e379417e6eDaniel Dunbar // -save-temps. Compatibility wins for now. 6442fe63e6adac0b9e5f52bcc3100b545e379417e6eDaniel Dunbar 6453dbd6c51bcd8a730c3fe58e29d7e0d999a94fa91Daniel Dunbar if (Archs.size() > 1 && !types::canLipoType(Act->getType())) 6462fe63e6adac0b9e5f52bcc3100b545e379417e6eDaniel Dunbar Diag(clang::diag::err_drv_invalid_output_with_multiple_archs) 6472fe63e6adac0b9e5f52bcc3100b545e379417e6eDaniel Dunbar << types::getTypeName(Act->getType()); 6482fe63e6adac0b9e5f52bcc3100b545e379417e6eDaniel Dunbar 6492fe63e6adac0b9e5f52bcc3100b545e379417e6eDaniel Dunbar ActionList Inputs; 65032c1a2ae8b31f32e478c8e504ed81db8c8d25713Daniel Dunbar for (unsigned i = 0, e = Archs.size(); i != e; ++i) { 6511368954db9ce2989ed8f03f5c65e8ee775a5229aDaniel Dunbar Inputs.push_back(new BindArchAction(Act, Archs[i])); 65232c1a2ae8b31f32e478c8e504ed81db8c8d25713Daniel Dunbar if (i != 0) 65332c1a2ae8b31f32e478c8e504ed81db8c8d25713Daniel Dunbar Inputs.back()->setOwnsInputs(false); 65432c1a2ae8b31f32e478c8e504ed81db8c8d25713Daniel Dunbar } 6552fe63e6adac0b9e5f52bcc3100b545e379417e6eDaniel Dunbar 656a82318332c9e9b61d3d17371e675ca2859877ee5Daniel Dunbar // Lipo if necessary, we do it this way because we need to set the arch flag 657a82318332c9e9b61d3d17371e675ca2859877ee5Daniel Dunbar // so that -Xarch_ gets overwritten. 6582fe63e6adac0b9e5f52bcc3100b545e379417e6eDaniel Dunbar if (Inputs.size() == 1 || Act->getType() == types::TY_Nothing) 6592fe63e6adac0b9e5f52bcc3100b545e379417e6eDaniel Dunbar Actions.append(Inputs.begin(), Inputs.end()); 6602fe63e6adac0b9e5f52bcc3100b545e379417e6eDaniel Dunbar else 6612fe63e6adac0b9e5f52bcc3100b545e379417e6eDaniel Dunbar Actions.push_back(new LipoJobAction(Inputs, Act->getType())); 662be1cc3eec682ca73361edb4109a7969452d3dbebDaniel Dunbar 663b5e2f698accd4d3a1379983304a2f31ec194c332Daniel Dunbar // Add a 'dsymutil' step if necessary, when debug info is enabled and we 664b5e2f698accd4d3a1379983304a2f31ec194c332Daniel Dunbar // have a compile input. We need to run 'dsymutil' ourselves in such cases 665b5e2f698accd4d3a1379983304a2f31ec194c332Daniel Dunbar // because the debug info will refer to a temporary object file which is 666b5e2f698accd4d3a1379983304a2f31ec194c332Daniel Dunbar // will be removed at the end of the compilation process. 667be1cc3eec682ca73361edb4109a7969452d3dbebDaniel Dunbar if (Act->getType() == types::TY_Image) { 668be1cc3eec682ca73361edb4109a7969452d3dbebDaniel Dunbar Arg *A = Args.getLastArg(options::OPT_g_Group); 669be1cc3eec682ca73361edb4109a7969452d3dbebDaniel Dunbar if (A && !A->getOption().matches(options::OPT_g0) && 670b5e2f698accd4d3a1379983304a2f31ec194c332Daniel Dunbar !A->getOption().matches(options::OPT_gstabs) && 6719d0fbeadc455c8292837b738b6af315d27930637Joerg Sonnenberger ContainsCompileOrAssembleAction(Actions.back())) { 672be1cc3eec682ca73361edb4109a7969452d3dbebDaniel Dunbar ActionList Inputs; 673be1cc3eec682ca73361edb4109a7969452d3dbebDaniel Dunbar Inputs.push_back(Actions.back()); 674be1cc3eec682ca73361edb4109a7969452d3dbebDaniel Dunbar Actions.pop_back(); 675be1cc3eec682ca73361edb4109a7969452d3dbebDaniel Dunbar 676be1cc3eec682ca73361edb4109a7969452d3dbebDaniel Dunbar Actions.push_back(new DsymutilJobAction(Inputs, types::TY_dSYM)); 677be1cc3eec682ca73361edb4109a7969452d3dbebDaniel Dunbar } 678be1cc3eec682ca73361edb4109a7969452d3dbebDaniel Dunbar } 6792fe63e6adac0b9e5f52bcc3100b545e379417e6eDaniel Dunbar } 68053ec55215075c8f4ddd47ca6ed7d382f16beb670Daniel Dunbar} 68153ec55215075c8f4ddd47ca6ed7d382f16beb670Daniel Dunbar 68265f7165676854bf75494f5b73a620d7237db5d41Joerg Sonnenbergervoid Driver::BuildActions(const ToolChain &TC, const DerivedArgList &Args, 68374edcea3db1f85ba73ad0fede2ed5e2f096cac4bDaniel Dunbar ActionList &Actions) const { 6848f25c79e59d88df41c5a3cabba1c58035d384a6eDaniel Dunbar llvm::PrettyStackTraceString CrashInfo("Building compilation actions"); 685af61c71137d1f7239d6b9d7425ce083db7ba31dfDaniel Dunbar // Start by constructing the list of inputs and their types. 686af61c71137d1f7239d6b9d7425ce083db7ba31dfDaniel Dunbar 687a82318332c9e9b61d3d17371e675ca2859877ee5Daniel Dunbar // Track the current user specified (-x) input. We also explicitly track the 688a82318332c9e9b61d3d17371e675ca2859877ee5Daniel Dunbar // argument used to set the type; we only want to claim the type when we 689a82318332c9e9b61d3d17371e675ca2859877ee5Daniel Dunbar // actually use it, so we warn about unused -x arguments. 69083dd21f6b4e6e109b893c0d42bc81e4883c342f7Daniel Dunbar types::ID InputType = types::TY_Nothing; 69183dd21f6b4e6e109b893c0d42bc81e4883c342f7Daniel Dunbar Arg *InputTypeArg = 0; 69283dd21f6b4e6e109b893c0d42bc81e4883c342f7Daniel Dunbar 69353ec55215075c8f4ddd47ca6ed7d382f16beb670Daniel Dunbar llvm::SmallVector<std::pair<types::ID, const Arg*>, 16> Inputs; 694a82318332c9e9b61d3d17371e675ca2859877ee5Daniel Dunbar for (ArgList::const_iterator it = Args.begin(), ie = Args.end(); 69553ec55215075c8f4ddd47ca6ed7d382f16beb670Daniel Dunbar it != ie; ++it) { 69653ec55215075c8f4ddd47ca6ed7d382f16beb670Daniel Dunbar Arg *A = *it; 69753ec55215075c8f4ddd47ca6ed7d382f16beb670Daniel Dunbar 69853ec55215075c8f4ddd47ca6ed7d382f16beb670Daniel Dunbar if (isa<InputOption>(A->getOption())) { 69953ec55215075c8f4ddd47ca6ed7d382f16beb670Daniel Dunbar const char *Value = A->getValue(Args); 70053ec55215075c8f4ddd47ca6ed7d382f16beb670Daniel Dunbar types::ID Ty = types::TY_INVALID; 70153ec55215075c8f4ddd47ca6ed7d382f16beb670Daniel Dunbar 70253ec55215075c8f4ddd47ca6ed7d382f16beb670Daniel Dunbar // Infer the input type if necessary. 70383dd21f6b4e6e109b893c0d42bc81e4883c342f7Daniel Dunbar if (InputType == types::TY_Nothing) { 70483dd21f6b4e6e109b893c0d42bc81e4883c342f7Daniel Dunbar // If there was an explicit arg for this, claim it. 70583dd21f6b4e6e109b893c0d42bc81e4883c342f7Daniel Dunbar if (InputTypeArg) 70683dd21f6b4e6e109b893c0d42bc81e4883c342f7Daniel Dunbar InputTypeArg->claim(); 70783dd21f6b4e6e109b893c0d42bc81e4883c342f7Daniel Dunbar 70853ec55215075c8f4ddd47ca6ed7d382f16beb670Daniel Dunbar // stdin must be handled specially. 70953ec55215075c8f4ddd47ca6ed7d382f16beb670Daniel Dunbar if (memcmp(Value, "-", 2) == 0) { 710a82318332c9e9b61d3d17371e675ca2859877ee5Daniel Dunbar // If running with -E, treat as a C input (this changes the builtin 711a82318332c9e9b61d3d17371e675ca2859877ee5Daniel Dunbar // macros, for example). This may be overridden by -ObjC below. 71253ec55215075c8f4ddd47ca6ed7d382f16beb670Daniel Dunbar // 713a82318332c9e9b61d3d17371e675ca2859877ee5Daniel Dunbar // Otherwise emit an error but still use a valid type to avoid 714a82318332c9e9b61d3d17371e675ca2859877ee5Daniel Dunbar // spurious errors (e.g., no inputs). 7159ade4ae4fb7ed1fcbd63835d9f8f53052f0657a2Joerg Sonnenberger if (!Args.hasArgNoClaim(options::OPT_E) && !CCCIsCPP) 716b897f5d3ebfb62c2745e2e2af7faa9920c882438Daniel Dunbar Diag(clang::diag::err_drv_unknown_stdin_type); 71753ec55215075c8f4ddd47ca6ed7d382f16beb670Daniel Dunbar Ty = types::TY_C; 71853ec55215075c8f4ddd47ca6ed7d382f16beb670Daniel Dunbar } else { 7199a2927c4e6afa56ade0e5acc654f07fc658a220eJoerg Sonnenberger // Otherwise lookup by extension. 7209a2927c4e6afa56ade0e5acc654f07fc658a220eJoerg Sonnenberger // Fallback is C if invoked as C preprocessor or Object otherwise. 7219a2927c4e6afa56ade0e5acc654f07fc658a220eJoerg Sonnenberger // We use a host hook here because Darwin at least has its own 722a82318332c9e9b61d3d17371e675ca2859877ee5Daniel Dunbar // idea of what .s is. 72353ec55215075c8f4ddd47ca6ed7d382f16beb670Daniel Dunbar if (const char *Ext = strrchr(Value, '.')) 7244180011fb8cef06adec04d30486b1bf3b99aa8b8Daniel Dunbar Ty = TC.LookupTypeForExtension(Ext + 1); 725e33bea4ef34598e7a4a6a3a117392268998552d4Daniel Dunbar 7269a2927c4e6afa56ade0e5acc654f07fc658a220eJoerg Sonnenberger if (Ty == types::TY_INVALID) { 7279a2927c4e6afa56ade0e5acc654f07fc658a220eJoerg Sonnenberger if (CCCIsCPP) 7289a2927c4e6afa56ade0e5acc654f07fc658a220eJoerg Sonnenberger Ty = types::TY_C; 7299a2927c4e6afa56ade0e5acc654f07fc658a220eJoerg Sonnenberger else 7309a2927c4e6afa56ade0e5acc654f07fc658a220eJoerg Sonnenberger Ty = types::TY_Object; 7319a2927c4e6afa56ade0e5acc654f07fc658a220eJoerg Sonnenberger } 73251679c5e4828b8a64953c4f3db162ca963bf7b03Daniel Dunbar 73351679c5e4828b8a64953c4f3db162ca963bf7b03Daniel Dunbar // If the driver is invoked as C++ compiler (like clang++ or c++) it 73451679c5e4828b8a64953c4f3db162ca963bf7b03Daniel Dunbar // should autodetect some input files as C++ for g++ compatibility. 73551679c5e4828b8a64953c4f3db162ca963bf7b03Daniel Dunbar if (CCCIsCXX) { 73651679c5e4828b8a64953c4f3db162ca963bf7b03Daniel Dunbar types::ID OldTy = Ty; 73751679c5e4828b8a64953c4f3db162ca963bf7b03Daniel Dunbar Ty = types::lookupCXXTypeForCType(Ty); 73851679c5e4828b8a64953c4f3db162ca963bf7b03Daniel Dunbar 73951679c5e4828b8a64953c4f3db162ca963bf7b03Daniel Dunbar if (Ty != OldTy) 74051679c5e4828b8a64953c4f3db162ca963bf7b03Daniel Dunbar Diag(clang::diag::warn_drv_treating_input_as_cxx) 74151679c5e4828b8a64953c4f3db162ca963bf7b03Daniel Dunbar << getTypeName(OldTy) << getTypeName(Ty); 74251679c5e4828b8a64953c4f3db162ca963bf7b03Daniel Dunbar } 74353ec55215075c8f4ddd47ca6ed7d382f16beb670Daniel Dunbar } 74453ec55215075c8f4ddd47ca6ed7d382f16beb670Daniel Dunbar 745683ca381bf2b8dffab535c89d25250518bbec3a0Daniel Dunbar // -ObjC and -ObjC++ override the default language, but only for "source 746683ca381bf2b8dffab535c89d25250518bbec3a0Daniel Dunbar // files". We just treat everything that isn't a linker input as a 747683ca381bf2b8dffab535c89d25250518bbec3a0Daniel Dunbar // source file. 748a82318332c9e9b61d3d17371e675ca2859877ee5Daniel Dunbar // 749683ca381bf2b8dffab535c89d25250518bbec3a0Daniel Dunbar // FIXME: Clean this up if we move the phase sequence into the type. 75053ec55215075c8f4ddd47ca6ed7d382f16beb670Daniel Dunbar if (Ty != types::TY_Object) { 75153ec55215075c8f4ddd47ca6ed7d382f16beb670Daniel Dunbar if (Args.hasArg(options::OPT_ObjC)) 75253ec55215075c8f4ddd47ca6ed7d382f16beb670Daniel Dunbar Ty = types::TY_ObjC; 75353ec55215075c8f4ddd47ca6ed7d382f16beb670Daniel Dunbar else if (Args.hasArg(options::OPT_ObjCXX)) 75453ec55215075c8f4ddd47ca6ed7d382f16beb670Daniel Dunbar Ty = types::TY_ObjCXX; 75553ec55215075c8f4ddd47ca6ed7d382f16beb670Daniel Dunbar } 75653ec55215075c8f4ddd47ca6ed7d382f16beb670Daniel Dunbar } else { 75753ec55215075c8f4ddd47ca6ed7d382f16beb670Daniel Dunbar assert(InputTypeArg && "InputType set w/o InputTypeArg"); 75853ec55215075c8f4ddd47ca6ed7d382f16beb670Daniel Dunbar InputTypeArg->claim(); 75953ec55215075c8f4ddd47ca6ed7d382f16beb670Daniel Dunbar Ty = InputType; 76053ec55215075c8f4ddd47ca6ed7d382f16beb670Daniel Dunbar } 76153ec55215075c8f4ddd47ca6ed7d382f16beb670Daniel Dunbar 7623bd54cc56276c386f4d50940a9fbfcad7a69cb75Daniel Dunbar // Check that the file exists, if enabled. 763389db16c63eec6ecfa9b235155252d8da766e94eArgyrios Kyrtzidis if (CheckInputsExist && memcmp(Value, "-", 2) != 0) { 764256053b31e697fdf0cc48f17d621c82fc3b8dff0Michael J. Spencer llvm::SmallString<64> Path(Value); 765389db16c63eec6ecfa9b235155252d8da766e94eArgyrios Kyrtzidis if (Arg *WorkDir = Args.getLastArg(options::OPT_working_directory)) 766256053b31e697fdf0cc48f17d621c82fc3b8dff0Michael J. Spencer if (llvm::sys::path::is_absolute(Path.str())) { 767389db16c63eec6ecfa9b235155252d8da766e94eArgyrios Kyrtzidis Path = WorkDir->getValue(Args); 768256053b31e697fdf0cc48f17d621c82fc3b8dff0Michael J. Spencer llvm::sys::path::append(Path, Value); 769389db16c63eec6ecfa9b235155252d8da766e94eArgyrios Kyrtzidis } 770389db16c63eec6ecfa9b235155252d8da766e94eArgyrios Kyrtzidis 771256053b31e697fdf0cc48f17d621c82fc3b8dff0Michael J. Spencer bool exists = false; 772256053b31e697fdf0cc48f17d621c82fc3b8dff0Michael J. Spencer if (/*error_code ec =*/llvm::sys::fs::exists(Value, exists) || !exists) 773389db16c63eec6ecfa9b235155252d8da766e94eArgyrios Kyrtzidis Diag(clang::diag::err_drv_no_such_file) << Path.str(); 774389db16c63eec6ecfa9b235155252d8da766e94eArgyrios Kyrtzidis else 775389db16c63eec6ecfa9b235155252d8da766e94eArgyrios Kyrtzidis Inputs.push_back(std::make_pair(Ty, A)); 776389db16c63eec6ecfa9b235155252d8da766e94eArgyrios Kyrtzidis } else 77753ec55215075c8f4ddd47ca6ed7d382f16beb670Daniel Dunbar Inputs.push_back(std::make_pair(Ty, A)); 77853ec55215075c8f4ddd47ca6ed7d382f16beb670Daniel Dunbar 77953ec55215075c8f4ddd47ca6ed7d382f16beb670Daniel Dunbar } else if (A->getOption().isLinkerInput()) { 780a82318332c9e9b61d3d17371e675ca2859877ee5Daniel Dunbar // Just treat as object type, we could make a special type for this if 781a82318332c9e9b61d3d17371e675ca2859877ee5Daniel Dunbar // necessary. 78253ec55215075c8f4ddd47ca6ed7d382f16beb670Daniel Dunbar Inputs.push_back(std::make_pair(types::TY_Object, A)); 78353ec55215075c8f4ddd47ca6ed7d382f16beb670Daniel Dunbar 784b827a0541b5fd095fcdb7ad0c3df93ca158c619aDaniel Dunbar } else if (A->getOption().matches(options::OPT_x)) { 785a82318332c9e9b61d3d17371e675ca2859877ee5Daniel Dunbar InputTypeArg = A; 78653ec55215075c8f4ddd47ca6ed7d382f16beb670Daniel Dunbar InputType = types::lookupTypeForTypeSpecifier(A->getValue(Args)); 78753ec55215075c8f4ddd47ca6ed7d382f16beb670Daniel Dunbar 78853ec55215075c8f4ddd47ca6ed7d382f16beb670Daniel Dunbar // Follow gcc behavior and treat as linker input for invalid -x 789a82318332c9e9b61d3d17371e675ca2859877ee5Daniel Dunbar // options. Its not clear why we shouldn't just revert to unknown; but 79074cae0c64d3cf85bcfbc9e7febac83a580804d57Michael J. Spencer // this isn't very important, we might as well be bug compatible. 79153ec55215075c8f4ddd47ca6ed7d382f16beb670Daniel Dunbar if (!InputType) { 792b897f5d3ebfb62c2745e2e2af7faa9920c882438Daniel Dunbar Diag(clang::diag::err_drv_unknown_language) << A->getValue(Args); 79353ec55215075c8f4ddd47ca6ed7d382f16beb670Daniel Dunbar InputType = types::TY_Object; 79453ec55215075c8f4ddd47ca6ed7d382f16beb670Daniel Dunbar } 79553ec55215075c8f4ddd47ca6ed7d382f16beb670Daniel Dunbar } 79653ec55215075c8f4ddd47ca6ed7d382f16beb670Daniel Dunbar } 79753ec55215075c8f4ddd47ca6ed7d382f16beb670Daniel Dunbar 7989ade4ae4fb7ed1fcbd63835d9f8f53052f0657a2Joerg Sonnenberger if (CCCIsCPP && Inputs.empty()) { 7999ade4ae4fb7ed1fcbd63835d9f8f53052f0657a2Joerg Sonnenberger // If called as standalone preprocessor, stdin is processed 8009ade4ae4fb7ed1fcbd63835d9f8f53052f0657a2Joerg Sonnenberger // if no other input is present. 80165f7165676854bf75494f5b73a620d7237db5d41Joerg Sonnenberger unsigned Index = Args.getBaseArgs().MakeIndex("-"); 8029ade4ae4fb7ed1fcbd63835d9f8f53052f0657a2Joerg Sonnenberger Arg *A = Opts->ParseOneArg(Args, Index); 8039ade4ae4fb7ed1fcbd63835d9f8f53052f0657a2Joerg Sonnenberger A->claim(); 8049ade4ae4fb7ed1fcbd63835d9f8f53052f0657a2Joerg Sonnenberger Inputs.push_back(std::make_pair(types::TY_C, A)); 8059ade4ae4fb7ed1fcbd63835d9f8f53052f0657a2Joerg Sonnenberger } 8069ade4ae4fb7ed1fcbd63835d9f8f53052f0657a2Joerg Sonnenberger 8078b1604ece7bf6dc2ba811cd7d8767557e55e2ec2Daniel Dunbar if (!SuppressMissingInputWarning && Inputs.empty()) { 808af61c71137d1f7239d6b9d7425ce083db7ba31dfDaniel Dunbar Diag(clang::diag::err_drv_no_input_files); 809af61c71137d1f7239d6b9d7425ce083db7ba31dfDaniel Dunbar return; 810af61c71137d1f7239d6b9d7425ce083db7ba31dfDaniel Dunbar } 811af61c71137d1f7239d6b9d7425ce083db7ba31dfDaniel Dunbar 812a82318332c9e9b61d3d17371e675ca2859877ee5Daniel Dunbar // Determine which compilation mode we are in. We look for options which 813a82318332c9e9b61d3d17371e675ca2859877ee5Daniel Dunbar // affect the phase, starting with the earliest phases, and record which 814a82318332c9e9b61d3d17371e675ca2859877ee5Daniel Dunbar // option we used to determine the final phase. 815ad2a9af666efdd9afe3bb5f886bcb0d1c9a0f0c3Daniel Dunbar Arg *FinalPhaseArg = 0; 816ad2a9af666efdd9afe3bb5f886bcb0d1c9a0f0c3Daniel Dunbar phases::ID FinalPhase; 817af61c71137d1f7239d6b9d7425ce083db7ba31dfDaniel Dunbar 818af61c71137d1f7239d6b9d7425ce083db7ba31dfDaniel Dunbar // -{E,M,MM} only run the preprocessor. 8199ade4ae4fb7ed1fcbd63835d9f8f53052f0657a2Joerg Sonnenberger if (CCCIsCPP || 8209ade4ae4fb7ed1fcbd63835d9f8f53052f0657a2Joerg Sonnenberger (FinalPhaseArg = Args.getLastArg(options::OPT_E)) || 8219eb93b07ea913e7ad0bcd15bd3e3662e2760c323Daniel Dunbar (FinalPhaseArg = Args.getLastArg(options::OPT_M, options::OPT_MM))) { 822ad2a9af666efdd9afe3bb5f886bcb0d1c9a0f0c3Daniel Dunbar FinalPhase = phases::Preprocess; 823a82318332c9e9b61d3d17371e675ca2859877ee5Daniel Dunbar 8245915fbf310e171c4cd3c2af05e9de360c0fa988aDaniel Dunbar // -{fsyntax-only,-analyze,emit-ast,S} only run up to the compiler. 8258022fd46d45005de63306a7513aece20a1be16edDaniel Dunbar } else if ((FinalPhaseArg = Args.getLastArg(options::OPT_fsyntax_only)) || 82664952508c2b0c8bffb45c8b410f0af3d2457f59bDaniel Dunbar (FinalPhaseArg = Args.getLastArg(options::OPT_rewrite_objc)) || 82763be57a832b2dab70592d1d9b37a5cd9a627356eDaniel Dunbar (FinalPhaseArg = Args.getLastArg(options::OPT__analyze, 82863be57a832b2dab70592d1d9b37a5cd9a627356eDaniel Dunbar options::OPT__analyze_auto)) || 8295915fbf310e171c4cd3c2af05e9de360c0fa988aDaniel Dunbar (FinalPhaseArg = Args.getLastArg(options::OPT_emit_ast)) || 830ad2a9af666efdd9afe3bb5f886bcb0d1c9a0f0c3Daniel Dunbar (FinalPhaseArg = Args.getLastArg(options::OPT_S))) { 831ad2a9af666efdd9afe3bb5f886bcb0d1c9a0f0c3Daniel Dunbar FinalPhase = phases::Compile; 832af61c71137d1f7239d6b9d7425ce083db7ba31dfDaniel Dunbar 833af61c71137d1f7239d6b9d7425ce083db7ba31dfDaniel Dunbar // -c only runs up to the assembler. 834ad2a9af666efdd9afe3bb5f886bcb0d1c9a0f0c3Daniel Dunbar } else if ((FinalPhaseArg = Args.getLastArg(options::OPT_c))) { 835ad2a9af666efdd9afe3bb5f886bcb0d1c9a0f0c3Daniel Dunbar FinalPhase = phases::Assemble; 836a82318332c9e9b61d3d17371e675ca2859877ee5Daniel Dunbar 837af61c71137d1f7239d6b9d7425ce083db7ba31dfDaniel Dunbar // Otherwise do everything. 838af61c71137d1f7239d6b9d7425ce083db7ba31dfDaniel Dunbar } else 839ad2a9af666efdd9afe3bb5f886bcb0d1c9a0f0c3Daniel Dunbar FinalPhase = phases::Link; 840af61c71137d1f7239d6b9d7425ce083db7ba31dfDaniel Dunbar 841a82318332c9e9b61d3d17371e675ca2859877ee5Daniel Dunbar // Reject -Z* at the top level, these options should never have been exposed 842a82318332c9e9b61d3d17371e675ca2859877ee5Daniel Dunbar // by gcc. 843d7b88c2cb8986217f164203747d35c8f596e38c2Daniel Dunbar if (Arg *A = Args.getLastArg(options::OPT_Z_Joined)) 84438dd3d54186cf44ea9d37f463c3f2800ab526b82Daniel Dunbar Diag(clang::diag::err_drv_use_of_Z_option) << A->getAsString(Args); 845af61c71137d1f7239d6b9d7425ce083db7ba31dfDaniel Dunbar 846ad2a9af666efdd9afe3bb5f886bcb0d1c9a0f0c3Daniel Dunbar // Construct the actions to perform. 847ad2a9af666efdd9afe3bb5f886bcb0d1c9a0f0c3Daniel Dunbar ActionList LinkerInputs; 84853ec55215075c8f4ddd47ca6ed7d382f16beb670Daniel Dunbar for (unsigned i = 0, e = Inputs.size(); i != e; ++i) { 849ad2a9af666efdd9afe3bb5f886bcb0d1c9a0f0c3Daniel Dunbar types::ID InputType = Inputs[i].first; 850ad2a9af666efdd9afe3bb5f886bcb0d1c9a0f0c3Daniel Dunbar const Arg *InputArg = Inputs[i].second; 851ad2a9af666efdd9afe3bb5f886bcb0d1c9a0f0c3Daniel Dunbar 852ad2a9af666efdd9afe3bb5f886bcb0d1c9a0f0c3Daniel Dunbar unsigned NumSteps = types::getNumCompilationPhases(InputType); 853ad2a9af666efdd9afe3bb5f886bcb0d1c9a0f0c3Daniel Dunbar assert(NumSteps && "Invalid number of steps!"); 854ad2a9af666efdd9afe3bb5f886bcb0d1c9a0f0c3Daniel Dunbar 855a82318332c9e9b61d3d17371e675ca2859877ee5Daniel Dunbar // If the first step comes after the final phase we are doing as part of 856a82318332c9e9b61d3d17371e675ca2859877ee5Daniel Dunbar // this compilation, warn the user about it. 857ad2a9af666efdd9afe3bb5f886bcb0d1c9a0f0c3Daniel Dunbar phases::ID InitialPhase = types::getCompilationPhase(InputType, 0); 858ad2a9af666efdd9afe3bb5f886bcb0d1c9a0f0c3Daniel Dunbar if (InitialPhase > FinalPhase) { 85905494a78c3746a360e81fc1d1797ce52df415b54Daniel Dunbar // Claim here to avoid the more general unused warning. 86005494a78c3746a360e81fc1d1797ce52df415b54Daniel Dunbar InputArg->claim(); 861634b24563be901f8adc37c07ffba3eeac1f1d4ccDaniel Dunbar 86232c8cb66af6192adb82fe39779b460b605fa14edDaniel Dunbar // Suppress all unused style warnings with -Qunused-arguments 86332c8cb66af6192adb82fe39779b460b605fa14edDaniel Dunbar if (Args.hasArg(options::OPT_Qunused_arguments)) 86432c8cb66af6192adb82fe39779b460b605fa14edDaniel Dunbar continue; 86532c8cb66af6192adb82fe39779b460b605fa14edDaniel Dunbar 866634b24563be901f8adc37c07ffba3eeac1f1d4ccDaniel Dunbar // Special case '-E' warning on a previously preprocessed file to make 867634b24563be901f8adc37c07ffba3eeac1f1d4ccDaniel Dunbar // more sense. 868634b24563be901f8adc37c07ffba3eeac1f1d4ccDaniel Dunbar if (InitialPhase == phases::Compile && FinalPhase == phases::Preprocess && 869634b24563be901f8adc37c07ffba3eeac1f1d4ccDaniel Dunbar getPreprocessedType(InputType) == types::TY_INVALID) 870634b24563be901f8adc37c07ffba3eeac1f1d4ccDaniel Dunbar Diag(clang::diag::warn_drv_preprocessed_input_file_unused) 871634b24563be901f8adc37c07ffba3eeac1f1d4ccDaniel Dunbar << InputArg->getAsString(Args) 872634b24563be901f8adc37c07ffba3eeac1f1d4ccDaniel Dunbar << FinalPhaseArg->getOption().getName(); 873634b24563be901f8adc37c07ffba3eeac1f1d4ccDaniel Dunbar else 874634b24563be901f8adc37c07ffba3eeac1f1d4ccDaniel Dunbar Diag(clang::diag::warn_drv_input_file_unused) 875634b24563be901f8adc37c07ffba3eeac1f1d4ccDaniel Dunbar << InputArg->getAsString(Args) 876634b24563be901f8adc37c07ffba3eeac1f1d4ccDaniel Dunbar << getPhaseName(InitialPhase) 877634b24563be901f8adc37c07ffba3eeac1f1d4ccDaniel Dunbar << FinalPhaseArg->getOption().getName(); 878ad2a9af666efdd9afe3bb5f886bcb0d1c9a0f0c3Daniel Dunbar continue; 879ad2a9af666efdd9afe3bb5f886bcb0d1c9a0f0c3Daniel Dunbar } 880a82318332c9e9b61d3d17371e675ca2859877ee5Daniel Dunbar 881ad2a9af666efdd9afe3bb5f886bcb0d1c9a0f0c3Daniel Dunbar // Build the pipeline for this file. 8824d7b14734f2285695dcec347f8718b512093390aTed Kremenek llvm::OwningPtr<Action> Current(new InputAction(*InputArg, InputType)); 883ad2a9af666efdd9afe3bb5f886bcb0d1c9a0f0c3Daniel Dunbar for (unsigned i = 0; i != NumSteps; ++i) { 884ad2a9af666efdd9afe3bb5f886bcb0d1c9a0f0c3Daniel Dunbar phases::ID Phase = types::getCompilationPhase(InputType, i); 885ad2a9af666efdd9afe3bb5f886bcb0d1c9a0f0c3Daniel Dunbar 886ad2a9af666efdd9afe3bb5f886bcb0d1c9a0f0c3Daniel Dunbar // We are done if this step is past what the user requested. 887ad2a9af666efdd9afe3bb5f886bcb0d1c9a0f0c3Daniel Dunbar if (Phase > FinalPhase) 888ad2a9af666efdd9afe3bb5f886bcb0d1c9a0f0c3Daniel Dunbar break; 889ad2a9af666efdd9afe3bb5f886bcb0d1c9a0f0c3Daniel Dunbar 890ad2a9af666efdd9afe3bb5f886bcb0d1c9a0f0c3Daniel Dunbar // Queue linker inputs. 891ad2a9af666efdd9afe3bb5f886bcb0d1c9a0f0c3Daniel Dunbar if (Phase == phases::Link) { 892ad2a9af666efdd9afe3bb5f886bcb0d1c9a0f0c3Daniel Dunbar assert(i + 1 == NumSteps && "linking must be final compilation step."); 8934d7b14734f2285695dcec347f8718b512093390aTed Kremenek LinkerInputs.push_back(Current.take()); 894ad2a9af666efdd9afe3bb5f886bcb0d1c9a0f0c3Daniel Dunbar break; 895ad2a9af666efdd9afe3bb5f886bcb0d1c9a0f0c3Daniel Dunbar } 896ad2a9af666efdd9afe3bb5f886bcb0d1c9a0f0c3Daniel Dunbar 897a82318332c9e9b61d3d17371e675ca2859877ee5Daniel Dunbar // Some types skip the assembler phase (e.g., llvm-bc), but we can't 898a82318332c9e9b61d3d17371e675ca2859877ee5Daniel Dunbar // encode this in the steps because the intermediate type depends on 899a82318332c9e9b61d3d17371e675ca2859877ee5Daniel Dunbar // arguments. Just special case here. 900337a6271b98c4c183f7eaad1563a75260b4f2871Daniel Dunbar if (Phase == phases::Assemble && Current->getType() != types::TY_PP_Asm) 901337a6271b98c4c183f7eaad1563a75260b4f2871Daniel Dunbar continue; 902337a6271b98c4c183f7eaad1563a75260b4f2871Daniel Dunbar 903ad2a9af666efdd9afe3bb5f886bcb0d1c9a0f0c3Daniel Dunbar // Otherwise construct the appropriate action. 9044d7b14734f2285695dcec347f8718b512093390aTed Kremenek Current.reset(ConstructPhaseAction(Args, Phase, Current.take())); 905ad2a9af666efdd9afe3bb5f886bcb0d1c9a0f0c3Daniel Dunbar if (Current->getType() == types::TY_Nothing) 906ad2a9af666efdd9afe3bb5f886bcb0d1c9a0f0c3Daniel Dunbar break; 907ad2a9af666efdd9afe3bb5f886bcb0d1c9a0f0c3Daniel Dunbar } 908ad2a9af666efdd9afe3bb5f886bcb0d1c9a0f0c3Daniel Dunbar 909ad2a9af666efdd9afe3bb5f886bcb0d1c9a0f0c3Daniel Dunbar // If we ended with something, add to the output list. 910ad2a9af666efdd9afe3bb5f886bcb0d1c9a0f0c3Daniel Dunbar if (Current) 9114d7b14734f2285695dcec347f8718b512093390aTed Kremenek Actions.push_back(Current.take()); 91253ec55215075c8f4ddd47ca6ed7d382f16beb670Daniel Dunbar } 913ad2a9af666efdd9afe3bb5f886bcb0d1c9a0f0c3Daniel Dunbar 914ad2a9af666efdd9afe3bb5f886bcb0d1c9a0f0c3Daniel Dunbar // Add a link action if necessary. 915ad2a9af666efdd9afe3bb5f886bcb0d1c9a0f0c3Daniel Dunbar if (!LinkerInputs.empty()) 916ad2a9af666efdd9afe3bb5f886bcb0d1c9a0f0c3Daniel Dunbar Actions.push_back(new LinkJobAction(LinkerInputs, types::TY_Image)); 917f3601388f234f70778e3023018dfe57b64cf4043Daniel Dunbar 918f3601388f234f70778e3023018dfe57b64cf4043Daniel Dunbar // If we are linking, claim any options which are obviously only used for 919f3601388f234f70778e3023018dfe57b64cf4043Daniel Dunbar // compilation. 920f3601388f234f70778e3023018dfe57b64cf4043Daniel Dunbar if (FinalPhase == phases::Link) 921f3601388f234f70778e3023018dfe57b64cf4043Daniel Dunbar Args.ClaimAllArgs(options::OPT_CompileOnly_Group); 922ad2a9af666efdd9afe3bb5f886bcb0d1c9a0f0c3Daniel Dunbar} 923ad2a9af666efdd9afe3bb5f886bcb0d1c9a0f0c3Daniel Dunbar 924ad2a9af666efdd9afe3bb5f886bcb0d1c9a0f0c3Daniel DunbarAction *Driver::ConstructPhaseAction(const ArgList &Args, phases::ID Phase, 925ad2a9af666efdd9afe3bb5f886bcb0d1c9a0f0c3Daniel Dunbar Action *Input) const { 9268f25c79e59d88df41c5a3cabba1c58035d384a6eDaniel Dunbar llvm::PrettyStackTraceString CrashInfo("Constructing phase actions"); 927ad2a9af666efdd9afe3bb5f886bcb0d1c9a0f0c3Daniel Dunbar // Build the appropriate action. 928ad2a9af666efdd9afe3bb5f886bcb0d1c9a0f0c3Daniel Dunbar switch (Phase) { 929ad2a9af666efdd9afe3bb5f886bcb0d1c9a0f0c3Daniel Dunbar case phases::Link: assert(0 && "link action invalid here."); 930ad2a9af666efdd9afe3bb5f886bcb0d1c9a0f0c3Daniel Dunbar case phases::Preprocess: { 931cd8e4c44dd068956e9181381be3ee2d49a0fac52Daniel Dunbar types::ID OutputTy; 932cd8e4c44dd068956e9181381be3ee2d49a0fac52Daniel Dunbar // -{M, MM} alter the output type. 9339eb93b07ea913e7ad0bcd15bd3e3662e2760c323Daniel Dunbar if (Args.hasArg(options::OPT_M, options::OPT_MM)) { 934cd8e4c44dd068956e9181381be3ee2d49a0fac52Daniel Dunbar OutputTy = types::TY_Dependencies; 935cd8e4c44dd068956e9181381be3ee2d49a0fac52Daniel Dunbar } else { 936cd8e4c44dd068956e9181381be3ee2d49a0fac52Daniel Dunbar OutputTy = types::getPreprocessedType(Input->getType()); 937cd8e4c44dd068956e9181381be3ee2d49a0fac52Daniel Dunbar assert(OutputTy != types::TY_INVALID && 938cd8e4c44dd068956e9181381be3ee2d49a0fac52Daniel Dunbar "Cannot preprocess this input type!"); 939cd8e4c44dd068956e9181381be3ee2d49a0fac52Daniel Dunbar } 940ad2a9af666efdd9afe3bb5f886bcb0d1c9a0f0c3Daniel Dunbar return new PreprocessJobAction(Input, OutputTy); 941ad2a9af666efdd9afe3bb5f886bcb0d1c9a0f0c3Daniel Dunbar } 942ad2a9af666efdd9afe3bb5f886bcb0d1c9a0f0c3Daniel Dunbar case phases::Precompile: 943a82318332c9e9b61d3d17371e675ca2859877ee5Daniel Dunbar return new PrecompileJobAction(Input, types::TY_PCH); 944ad2a9af666efdd9afe3bb5f886bcb0d1c9a0f0c3Daniel Dunbar case phases::Compile: { 94573ba9a6337c7879021976949a2dad9476a4f0abbDaniel Dunbar bool HasO4 = false; 94673ba9a6337c7879021976949a2dad9476a4f0abbDaniel Dunbar if (const Arg *A = Args.getLastArg(options::OPT_O_Group)) 94773ba9a6337c7879021976949a2dad9476a4f0abbDaniel Dunbar HasO4 = A->getOption().matches(options::OPT_O4); 94873ba9a6337c7879021976949a2dad9476a4f0abbDaniel Dunbar 949ad2a9af666efdd9afe3bb5f886bcb0d1c9a0f0c3Daniel Dunbar if (Args.hasArg(options::OPT_fsyntax_only)) { 950ad2a9af666efdd9afe3bb5f886bcb0d1c9a0f0c3Daniel Dunbar return new CompileJobAction(Input, types::TY_Nothing); 95164952508c2b0c8bffb45c8b410f0af3d2457f59bDaniel Dunbar } else if (Args.hasArg(options::OPT_rewrite_objc)) { 95264952508c2b0c8bffb45c8b410f0af3d2457f59bDaniel Dunbar return new CompileJobAction(Input, types::TY_RewrittenObjC); 95363be57a832b2dab70592d1d9b37a5cd9a627356eDaniel Dunbar } else if (Args.hasArg(options::OPT__analyze, options::OPT__analyze_auto)) { 954ad2a9af666efdd9afe3bb5f886bcb0d1c9a0f0c3Daniel Dunbar return new AnalyzeJobAction(Input, types::TY_Plist); 9555915fbf310e171c4cd3c2af05e9de360c0fa988aDaniel Dunbar } else if (Args.hasArg(options::OPT_emit_ast)) { 9565915fbf310e171c4cd3c2af05e9de360c0fa988aDaniel Dunbar return new CompileJobAction(Input, types::TY_AST); 957337a6271b98c4c183f7eaad1563a75260b4f2871Daniel Dunbar } else if (Args.hasArg(options::OPT_emit_llvm) || 958877ded8532736d49b3cda8708cf0e5e9c44a760bDaniel Dunbar Args.hasFlag(options::OPT_flto, options::OPT_fno_lto, false) || 959877ded8532736d49b3cda8708cf0e5e9c44a760bDaniel Dunbar HasO4) { 960a82318332c9e9b61d3d17371e675ca2859877ee5Daniel Dunbar types::ID Output = 9616c6424bc0d3b5f080a97b5f6ef4a8d70c38e38f5Daniel Dunbar Args.hasArg(options::OPT_S) ? types::TY_LTO_IR : types::TY_LTO_BC; 962ad2a9af666efdd9afe3bb5f886bcb0d1c9a0f0c3Daniel Dunbar return new CompileJobAction(Input, Output); 963ad2a9af666efdd9afe3bb5f886bcb0d1c9a0f0c3Daniel Dunbar } else { 964ad2a9af666efdd9afe3bb5f886bcb0d1c9a0f0c3Daniel Dunbar return new CompileJobAction(Input, types::TY_PP_Asm); 965ad2a9af666efdd9afe3bb5f886bcb0d1c9a0f0c3Daniel Dunbar } 966ad2a9af666efdd9afe3bb5f886bcb0d1c9a0f0c3Daniel Dunbar } 967ad2a9af666efdd9afe3bb5f886bcb0d1c9a0f0c3Daniel Dunbar case phases::Assemble: 968ad2a9af666efdd9afe3bb5f886bcb0d1c9a0f0c3Daniel Dunbar return new AssembleJobAction(Input, types::TY_Object); 969ad2a9af666efdd9afe3bb5f886bcb0d1c9a0f0c3Daniel Dunbar } 970ad2a9af666efdd9afe3bb5f886bcb0d1c9a0f0c3Daniel Dunbar 971ad2a9af666efdd9afe3bb5f886bcb0d1c9a0f0c3Daniel Dunbar assert(0 && "invalid phase in ConstructPhaseAction"); 972ad2a9af666efdd9afe3bb5f886bcb0d1c9a0f0c3Daniel Dunbar return 0; 97353ec55215075c8f4ddd47ca6ed7d382f16beb670Daniel Dunbar} 97453ec55215075c8f4ddd47ca6ed7d382f16beb670Daniel Dunbar 97521549237f14505cfc2a18a06416372a36229d0ceDaniel Dunbarvoid Driver::BuildJobs(Compilation &C) const { 9768f25c79e59d88df41c5a3cabba1c58035d384a6eDaniel Dunbar llvm::PrettyStackTraceString CrashInfo("Building compilation jobs"); 977f353c8cc2ee1cc16ff194b399a8d951f707fb129Daniel Dunbar 978f353c8cc2ee1cc16ff194b399a8d951f707fb129Daniel Dunbar Arg *FinalOutput = C.getArgs().getLastArg(options::OPT_o); 979f353c8cc2ee1cc16ff194b399a8d951f707fb129Daniel Dunbar 980a82318332c9e9b61d3d17371e675ca2859877ee5Daniel Dunbar // It is an error to provide a -o option if we are making multiple output 981a82318332c9e9b61d3d17371e675ca2859877ee5Daniel Dunbar // files. 982f353c8cc2ee1cc16ff194b399a8d951f707fb129Daniel Dunbar if (FinalOutput) { 983f353c8cc2ee1cc16ff194b399a8d951f707fb129Daniel Dunbar unsigned NumOutputs = 0; 984a82318332c9e9b61d3d17371e675ca2859877ee5Daniel Dunbar for (ActionList::const_iterator it = C.getActions().begin(), 98521549237f14505cfc2a18a06416372a36229d0ceDaniel Dunbar ie = C.getActions().end(); it != ie; ++it) 986f353c8cc2ee1cc16ff194b399a8d951f707fb129Daniel Dunbar if ((*it)->getType() != types::TY_Nothing) 987f353c8cc2ee1cc16ff194b399a8d951f707fb129Daniel Dunbar ++NumOutputs; 988a82318332c9e9b61d3d17371e675ca2859877ee5Daniel Dunbar 989f353c8cc2ee1cc16ff194b399a8d951f707fb129Daniel Dunbar if (NumOutputs > 1) { 990f353c8cc2ee1cc16ff194b399a8d951f707fb129Daniel Dunbar Diag(clang::diag::err_drv_output_argument_with_multiple_files); 991f353c8cc2ee1cc16ff194b399a8d951f707fb129Daniel Dunbar FinalOutput = 0; 992f353c8cc2ee1cc16ff194b399a8d951f707fb129Daniel Dunbar } 993f353c8cc2ee1cc16ff194b399a8d951f707fb129Daniel Dunbar } 994f353c8cc2ee1cc16ff194b399a8d951f707fb129Daniel Dunbar 995a82318332c9e9b61d3d17371e675ca2859877ee5Daniel Dunbar for (ActionList::const_iterator it = C.getActions().begin(), 99621549237f14505cfc2a18a06416372a36229d0ceDaniel Dunbar ie = C.getActions().end(); it != ie; ++it) { 997f353c8cc2ee1cc16ff194b399a8d951f707fb129Daniel Dunbar Action *A = *it; 998f353c8cc2ee1cc16ff194b399a8d951f707fb129Daniel Dunbar 999a82318332c9e9b61d3d17371e675ca2859877ee5Daniel Dunbar // If we are linking an image for multiple archs then the linker wants 1000a82318332c9e9b61d3d17371e675ca2859877ee5Daniel Dunbar // -arch_multiple and -final_output <final image name>. Unfortunately, this 1001a82318332c9e9b61d3d17371e675ca2859877ee5Daniel Dunbar // doesn't fit in cleanly because we have to pass this information down. 1002f353c8cc2ee1cc16ff194b399a8d951f707fb129Daniel Dunbar // 1003a82318332c9e9b61d3d17371e675ca2859877ee5Daniel Dunbar // FIXME: This is a hack; find a cleaner way to integrate this into the 1004a82318332c9e9b61d3d17371e675ca2859877ee5Daniel Dunbar // process. 1005f353c8cc2ee1cc16ff194b399a8d951f707fb129Daniel Dunbar const char *LinkingOutput = 0; 1006d7b88c2cb8986217f164203747d35c8f596e38c2Daniel Dunbar if (isa<LipoJobAction>(A)) { 1007f353c8cc2ee1cc16ff194b399a8d951f707fb129Daniel Dunbar if (FinalOutput) 1008f353c8cc2ee1cc16ff194b399a8d951f707fb129Daniel Dunbar LinkingOutput = FinalOutput->getValue(C.getArgs()); 1009f353c8cc2ee1cc16ff194b399a8d951f707fb129Daniel Dunbar else 1010f353c8cc2ee1cc16ff194b399a8d951f707fb129Daniel Dunbar LinkingOutput = DefaultImageName.c_str(); 1011f353c8cc2ee1cc16ff194b399a8d951f707fb129Daniel Dunbar } 1012f353c8cc2ee1cc16ff194b399a8d951f707fb129Daniel Dunbar 1013f353c8cc2ee1cc16ff194b399a8d951f707fb129Daniel Dunbar InputInfo II; 1014a82318332c9e9b61d3d17371e675ca2859877ee5Daniel Dunbar BuildJobsForAction(C, A, &C.getDefaultToolChain(), 10154954018954bbc97363eef02d0c83bea19ce9b329Daniel Dunbar /*BoundArch*/0, 1016f353c8cc2ee1cc16ff194b399a8d951f707fb129Daniel Dunbar /*AtTopLevel*/ true, 1017f353c8cc2ee1cc16ff194b399a8d951f707fb129Daniel Dunbar /*LinkingOutput*/ LinkingOutput, 1018f353c8cc2ee1cc16ff194b399a8d951f707fb129Daniel Dunbar II); 1019f353c8cc2ee1cc16ff194b399a8d951f707fb129Daniel Dunbar } 1020586dc233bb88f2920c9f3638f69cef0ccd55dcedDaniel Dunbar 1021a82318332c9e9b61d3d17371e675ca2859877ee5Daniel Dunbar // If the user passed -Qunused-arguments or there were errors, don't warn 1022a82318332c9e9b61d3d17371e675ca2859877ee5Daniel Dunbar // about any unused arguments. 1023be3aab6abe5e66bb86596da806acc49614eacb69Argyrios Kyrtzidis if (Diags.hasErrorOccurred() || 10241e23f5f963dd6a3cee43ace77578161798e41e2dDaniel Dunbar C.getArgs().hasArg(options::OPT_Qunused_arguments)) 1025af2e4baa2a75471e820030701225a1ca02c7308fDaniel Dunbar return; 1026af2e4baa2a75471e820030701225a1ca02c7308fDaniel Dunbar 1027a2094e76fc545b9e17c851c3d2c46b719c5f17ebDaniel Dunbar // Claim -### here. 1028a2094e76fc545b9e17c851c3d2c46b719c5f17ebDaniel Dunbar (void) C.getArgs().hasArg(options::OPT__HASH_HASH_HASH); 1029a82318332c9e9b61d3d17371e675ca2859877ee5Daniel Dunbar 1030586dc233bb88f2920c9f3638f69cef0ccd55dcedDaniel Dunbar for (ArgList::const_iterator it = C.getArgs().begin(), ie = C.getArgs().end(); 1031586dc233bb88f2920c9f3638f69cef0ccd55dcedDaniel Dunbar it != ie; ++it) { 1032586dc233bb88f2920c9f3638f69cef0ccd55dcedDaniel Dunbar Arg *A = *it; 1033a82318332c9e9b61d3d17371e675ca2859877ee5Daniel Dunbar 1034586dc233bb88f2920c9f3638f69cef0ccd55dcedDaniel Dunbar // FIXME: It would be nice to be able to send the argument to the 1035a82318332c9e9b61d3d17371e675ca2859877ee5Daniel Dunbar // Diagnostic, so that extra values, position, and so on could be printed. 10364f53b298846d720fbb906373f3f28d92f2121f35Daniel Dunbar if (!A->isClaimed()) { 10371e23f5f963dd6a3cee43ace77578161798e41e2dDaniel Dunbar if (A->getOption().hasNoArgumentUnused()) 10381e23f5f963dd6a3cee43ace77578161798e41e2dDaniel Dunbar continue; 10391e23f5f963dd6a3cee43ace77578161798e41e2dDaniel Dunbar 1040a82318332c9e9b61d3d17371e675ca2859877ee5Daniel Dunbar // Suppress the warning automatically if this is just a flag, and it is an 1041a82318332c9e9b61d3d17371e675ca2859877ee5Daniel Dunbar // instance of an argument we already claimed. 10424f53b298846d720fbb906373f3f28d92f2121f35Daniel Dunbar const Option &Opt = A->getOption(); 10434f53b298846d720fbb906373f3f28d92f2121f35Daniel Dunbar if (isa<FlagOption>(Opt)) { 10444f53b298846d720fbb906373f3f28d92f2121f35Daniel Dunbar bool DuplicateClaimed = false; 10454f53b298846d720fbb906373f3f28d92f2121f35Daniel Dunbar 1046cdd9686b890ebdc10039ae256ef4c9dfb5ebacb7Daniel Dunbar for (arg_iterator it = C.getArgs().filtered_begin(&Opt), 1047cdd9686b890ebdc10039ae256ef4c9dfb5ebacb7Daniel Dunbar ie = C.getArgs().filtered_end(); it != ie; ++it) { 1048cdd9686b890ebdc10039ae256ef4c9dfb5ebacb7Daniel Dunbar if ((*it)->isClaimed()) { 10494f53b298846d720fbb906373f3f28d92f2121f35Daniel Dunbar DuplicateClaimed = true; 10504f53b298846d720fbb906373f3f28d92f2121f35Daniel Dunbar break; 10514f53b298846d720fbb906373f3f28d92f2121f35Daniel Dunbar } 10524f53b298846d720fbb906373f3f28d92f2121f35Daniel Dunbar } 10534f53b298846d720fbb906373f3f28d92f2121f35Daniel Dunbar 10544f53b298846d720fbb906373f3f28d92f2121f35Daniel Dunbar if (DuplicateClaimed) 10554f53b298846d720fbb906373f3f28d92f2121f35Daniel Dunbar continue; 10564f53b298846d720fbb906373f3f28d92f2121f35Daniel Dunbar } 10574f53b298846d720fbb906373f3f28d92f2121f35Daniel Dunbar 1058a82318332c9e9b61d3d17371e675ca2859877ee5Daniel Dunbar Diag(clang::diag::warn_drv_unused_argument) 105938dd3d54186cf44ea9d37f463c3f2800ab526b82Daniel Dunbar << A->getAsString(C.getArgs()); 10604f53b298846d720fbb906373f3f28d92f2121f35Daniel Dunbar } 1061586dc233bb88f2920c9f3638f69cef0ccd55dcedDaniel Dunbar } 106257b704d8d8f49bcaf856a3e37941d5ac6456eb50Daniel Dunbar} 106357b704d8d8f49bcaf856a3e37941d5ac6456eb50Daniel Dunbar 10648767cbc475ed96397b6f08617814eeb9cab121bdDaniel Dunbarstatic const Tool &SelectToolForJob(Compilation &C, const ToolChain *TC, 10658767cbc475ed96397b6f08617814eeb9cab121bdDaniel Dunbar const JobAction *JA, 10668767cbc475ed96397b6f08617814eeb9cab121bdDaniel Dunbar const ActionList *&Inputs) { 10678767cbc475ed96397b6f08617814eeb9cab121bdDaniel Dunbar const Tool *ToolForJob = 0; 10688767cbc475ed96397b6f08617814eeb9cab121bdDaniel Dunbar 10698767cbc475ed96397b6f08617814eeb9cab121bdDaniel Dunbar // See if we should look for a compiler with an integrated assembler. We match 10708767cbc475ed96397b6f08617814eeb9cab121bdDaniel Dunbar // bottom up, so what we are actually looking for is an assembler job with a 10718767cbc475ed96397b6f08617814eeb9cab121bdDaniel Dunbar // compiler input. 1072eb840bd0e473ee11622e084a0d6ff276ee7aa5c6Daniel Dunbar 1073eb840bd0e473ee11622e084a0d6ff276ee7aa5c6Daniel Dunbar // FIXME: This doesn't belong here, but ideally we will support static soon 1074eb840bd0e473ee11622e084a0d6ff276ee7aa5c6Daniel Dunbar // anyway. 1075eb840bd0e473ee11622e084a0d6ff276ee7aa5c6Daniel Dunbar bool HasStatic = (C.getArgs().hasArg(options::OPT_mkernel) || 1076eb840bd0e473ee11622e084a0d6ff276ee7aa5c6Daniel Dunbar C.getArgs().hasArg(options::OPT_static) || 1077eb840bd0e473ee11622e084a0d6ff276ee7aa5c6Daniel Dunbar C.getArgs().hasArg(options::OPT_fapple_kext)); 10787693b1021862ea04f522cca9ca1df67bd1d2d54eRafael Espindola bool IsDarwin = TC->getTriple().getOS() == llvm::Triple::Darwin; 10797693b1021862ea04f522cca9ca1df67bd1d2d54eRafael Espindola bool IsIADefault = TC->IsIntegratedAssemblerDefault() && 10807693b1021862ea04f522cca9ca1df67bd1d2d54eRafael Espindola !(HasStatic && IsDarwin); 1081eb840bd0e473ee11622e084a0d6ff276ee7aa5c6Daniel Dunbar if (C.getArgs().hasFlag(options::OPT_integrated_as, 10828767cbc475ed96397b6f08617814eeb9cab121bdDaniel Dunbar options::OPT_no_integrated_as, 1083eb840bd0e473ee11622e084a0d6ff276ee7aa5c6Daniel Dunbar IsIADefault) && 10848767cbc475ed96397b6f08617814eeb9cab121bdDaniel Dunbar !C.getArgs().hasArg(options::OPT_save_temps) && 10858767cbc475ed96397b6f08617814eeb9cab121bdDaniel Dunbar isa<AssembleJobAction>(JA) && 10868767cbc475ed96397b6f08617814eeb9cab121bdDaniel Dunbar Inputs->size() == 1 && isa<CompileJobAction>(*Inputs->begin())) { 1087ac0659ae4124156915eddf70e78065df224d34c8Daniel Dunbar const Tool &Compiler = TC->SelectTool( 1088ac0659ae4124156915eddf70e78065df224d34c8Daniel Dunbar C, cast<JobAction>(**Inputs->begin()), (*Inputs)[0]->getInputs()); 10898767cbc475ed96397b6f08617814eeb9cab121bdDaniel Dunbar if (Compiler.hasIntegratedAssembler()) { 10908767cbc475ed96397b6f08617814eeb9cab121bdDaniel Dunbar Inputs = &(*Inputs)[0]->getInputs(); 10918767cbc475ed96397b6f08617814eeb9cab121bdDaniel Dunbar ToolForJob = &Compiler; 10928767cbc475ed96397b6f08617814eeb9cab121bdDaniel Dunbar } 10938767cbc475ed96397b6f08617814eeb9cab121bdDaniel Dunbar } 10948767cbc475ed96397b6f08617814eeb9cab121bdDaniel Dunbar 10958767cbc475ed96397b6f08617814eeb9cab121bdDaniel Dunbar // Otherwise use the tool for the current job. 10968767cbc475ed96397b6f08617814eeb9cab121bdDaniel Dunbar if (!ToolForJob) 1097ac0659ae4124156915eddf70e78065df224d34c8Daniel Dunbar ToolForJob = &TC->SelectTool(C, *JA, *Inputs); 10988767cbc475ed96397b6f08617814eeb9cab121bdDaniel Dunbar 10998767cbc475ed96397b6f08617814eeb9cab121bdDaniel Dunbar // See if we should use an integrated preprocessor. We do so when we have 11008767cbc475ed96397b6f08617814eeb9cab121bdDaniel Dunbar // exactly one input, since this is the only use case we care about 11018767cbc475ed96397b6f08617814eeb9cab121bdDaniel Dunbar // (irrelevant since we don't support combine yet). 11028767cbc475ed96397b6f08617814eeb9cab121bdDaniel Dunbar if (Inputs->size() == 1 && isa<PreprocessJobAction>(*Inputs->begin()) && 11038767cbc475ed96397b6f08617814eeb9cab121bdDaniel Dunbar !C.getArgs().hasArg(options::OPT_no_integrated_cpp) && 11048767cbc475ed96397b6f08617814eeb9cab121bdDaniel Dunbar !C.getArgs().hasArg(options::OPT_traditional_cpp) && 11058767cbc475ed96397b6f08617814eeb9cab121bdDaniel Dunbar !C.getArgs().hasArg(options::OPT_save_temps) && 11068767cbc475ed96397b6f08617814eeb9cab121bdDaniel Dunbar ToolForJob->hasIntegratedCPP()) 11078767cbc475ed96397b6f08617814eeb9cab121bdDaniel Dunbar Inputs = &(*Inputs)[0]->getInputs(); 11088767cbc475ed96397b6f08617814eeb9cab121bdDaniel Dunbar 11098767cbc475ed96397b6f08617814eeb9cab121bdDaniel Dunbar return *ToolForJob; 11108767cbc475ed96397b6f08617814eeb9cab121bdDaniel Dunbar} 11118767cbc475ed96397b6f08617814eeb9cab121bdDaniel Dunbar 1112f353c8cc2ee1cc16ff194b399a8d951f707fb129Daniel Dunbarvoid Driver::BuildJobsForAction(Compilation &C, 1113f353c8cc2ee1cc16ff194b399a8d951f707fb129Daniel Dunbar const Action *A, 1114f353c8cc2ee1cc16ff194b399a8d951f707fb129Daniel Dunbar const ToolChain *TC, 11154954018954bbc97363eef02d0c83bea19ce9b329Daniel Dunbar const char *BoundArch, 1116f353c8cc2ee1cc16ff194b399a8d951f707fb129Daniel Dunbar bool AtTopLevel, 1117f353c8cc2ee1cc16ff194b399a8d951f707fb129Daniel Dunbar const char *LinkingOutput, 1118f353c8cc2ee1cc16ff194b399a8d951f707fb129Daniel Dunbar InputInfo &Result) const { 1119a82318332c9e9b61d3d17371e675ca2859877ee5Daniel Dunbar llvm::PrettyStackTraceString CrashInfo("Building compilation jobs"); 112060ccc7677a5416df3a8f8bde79ab35f85cb66e14Daniel Dunbar 1121f353c8cc2ee1cc16ff194b399a8d951f707fb129Daniel Dunbar if (const InputAction *IA = dyn_cast<InputAction>(A)) { 1122a82318332c9e9b61d3d17371e675ca2859877ee5Daniel Dunbar // FIXME: It would be nice to not claim this here; maybe the old scheme of 1123a82318332c9e9b61d3d17371e675ca2859877ee5Daniel Dunbar // just using Args was better? 1124115a79277edababaf1b26e3654044ae983197679Daniel Dunbar const Arg &Input = IA->getInputArg(); 1125115a79277edababaf1b26e3654044ae983197679Daniel Dunbar Input.claim(); 1126532c1ec307b8689e95896a11ce5ae4661fa9e5d3Daniel Dunbar if (Input.getOption().matches(options::OPT_INPUT)) { 1127115a79277edababaf1b26e3654044ae983197679Daniel Dunbar const char *Name = Input.getValue(C.getArgs()); 1128115a79277edababaf1b26e3654044ae983197679Daniel Dunbar Result = InputInfo(Name, A->getType(), Name); 1129115a79277edababaf1b26e3654044ae983197679Daniel Dunbar } else 1130115a79277edababaf1b26e3654044ae983197679Daniel Dunbar Result = InputInfo(&Input, A->getType(), ""); 1131f353c8cc2ee1cc16ff194b399a8d951f707fb129Daniel Dunbar return; 1132f353c8cc2ee1cc16ff194b399a8d951f707fb129Daniel Dunbar } 1133f353c8cc2ee1cc16ff194b399a8d951f707fb129Daniel Dunbar 1134f353c8cc2ee1cc16ff194b399a8d951f707fb129Daniel Dunbar if (const BindArchAction *BAA = dyn_cast<BindArchAction>(A)) { 1135d7502d0a662b5c299125aba04245aefce67cbc22Daniel Dunbar const ToolChain *TC = &C.getDefaultToolChain(); 1136d7502d0a662b5c299125aba04245aefce67cbc22Daniel Dunbar 1137cb8ab23f7c800b041aeb6fc38c341d1aa0da86bfDaniel Dunbar std::string Arch; 1138d7502d0a662b5c299125aba04245aefce67cbc22Daniel Dunbar if (BAA->getArchName()) 1139d7502d0a662b5c299125aba04245aefce67cbc22Daniel Dunbar TC = Host->CreateToolChain(C.getArgs(), BAA->getArchName()); 1140d7502d0a662b5c299125aba04245aefce67cbc22Daniel Dunbar 11414954018954bbc97363eef02d0c83bea19ce9b329Daniel Dunbar BuildJobsForAction(C, *BAA->begin(), TC, BAA->getArchName(), 1142e4341253cc5d9c05c256b90eb3f816d256264cebDaniel Dunbar AtTopLevel, LinkingOutput, Result); 1143f353c8cc2ee1cc16ff194b399a8d951f707fb129Daniel Dunbar return; 1144f353c8cc2ee1cc16ff194b399a8d951f707fb129Daniel Dunbar } 1145f353c8cc2ee1cc16ff194b399a8d951f707fb129Daniel Dunbar 1146f353c8cc2ee1cc16ff194b399a8d951f707fb129Daniel Dunbar const ActionList *Inputs = &A->getInputs(); 11478767cbc475ed96397b6f08617814eeb9cab121bdDaniel Dunbar 11488767cbc475ed96397b6f08617814eeb9cab121bdDaniel Dunbar const JobAction *JA = cast<JobAction>(A); 11498767cbc475ed96397b6f08617814eeb9cab121bdDaniel Dunbar const Tool &T = SelectToolForJob(C, TC, JA, Inputs); 1150f353c8cc2ee1cc16ff194b399a8d951f707fb129Daniel Dunbar 1151f353c8cc2ee1cc16ff194b399a8d951f707fb129Daniel Dunbar // Only use pipes when there is exactly one input. 115247ac7d27c44bd64a7d0fc03d4babc196cf2b8230Daniel Dunbar InputInfoList InputInfos; 1153f353c8cc2ee1cc16ff194b399a8d951f707fb129Daniel Dunbar for (ActionList::const_iterator it = Inputs->begin(), ie = Inputs->end(); 1154f353c8cc2ee1cc16ff194b399a8d951f707fb129Daniel Dunbar it != ie; ++it) { 1155be1cc3eec682ca73361edb4109a7969452d3dbebDaniel Dunbar // Treat dsymutil sub-jobs as being at the top-level too, they shouldn't get 1156be1cc3eec682ca73361edb4109a7969452d3dbebDaniel Dunbar // temporary output names. 1157be1cc3eec682ca73361edb4109a7969452d3dbebDaniel Dunbar // 1158be1cc3eec682ca73361edb4109a7969452d3dbebDaniel Dunbar // FIXME: Clean this up. 1159be1cc3eec682ca73361edb4109a7969452d3dbebDaniel Dunbar bool SubJobAtTopLevel = false; 1160be1cc3eec682ca73361edb4109a7969452d3dbebDaniel Dunbar if (AtTopLevel && isa<DsymutilJobAction>(A)) 1161be1cc3eec682ca73361edb4109a7969452d3dbebDaniel Dunbar SubJobAtTopLevel = true; 1162be1cc3eec682ca73361edb4109a7969452d3dbebDaniel Dunbar 1163f353c8cc2ee1cc16ff194b399a8d951f707fb129Daniel Dunbar InputInfo II; 1164e4341253cc5d9c05c256b90eb3f816d256264cebDaniel Dunbar BuildJobsForAction(C, *it, TC, BoundArch, 1165be1cc3eec682ca73361edb4109a7969452d3dbebDaniel Dunbar SubJobAtTopLevel, LinkingOutput, II); 1166f353c8cc2ee1cc16ff194b399a8d951f707fb129Daniel Dunbar InputInfos.push_back(II); 1167f353c8cc2ee1cc16ff194b399a8d951f707fb129Daniel Dunbar } 1168f353c8cc2ee1cc16ff194b399a8d951f707fb129Daniel Dunbar 1169f353c8cc2ee1cc16ff194b399a8d951f707fb129Daniel Dunbar // Always use the first input as the base input. 1170f353c8cc2ee1cc16ff194b399a8d951f707fb129Daniel Dunbar const char *BaseInput = InputInfos[0].getBaseInput(); 1171441d060838a5797691777dfcc992ff836b73dcd1Daniel Dunbar 1172be1cc3eec682ca73361edb4109a7969452d3dbebDaniel Dunbar // ... except dsymutil actions, which use their actual input as the base 1173be1cc3eec682ca73361edb4109a7969452d3dbebDaniel Dunbar // input. 1174be1cc3eec682ca73361edb4109a7969452d3dbebDaniel Dunbar if (JA->getType() == types::TY_dSYM) 1175be1cc3eec682ca73361edb4109a7969452d3dbebDaniel Dunbar BaseInput = InputInfos[0].getFilename(); 1176be1cc3eec682ca73361edb4109a7969452d3dbebDaniel Dunbar 11779b18cca61197421af872df81014390c9cb813516Daniel Dunbar // Determine the place to write output to, if any. 1178441d060838a5797691777dfcc992ff836b73dcd1Daniel Dunbar if (JA->getType() == types::TY_Nothing) { 11795c3c1d7b494660ba5e8983ee4584622750725ac2Daniel Dunbar Result = InputInfo(A->getType(), BaseInput); 1180441d060838a5797691777dfcc992ff836b73dcd1Daniel Dunbar } else { 11815c3c1d7b494660ba5e8983ee4584622750725ac2Daniel Dunbar Result = InputInfo(GetNamedOutputPath(C, *JA, BaseInput, AtTopLevel), 11825c3c1d7b494660ba5e8983ee4584622750725ac2Daniel Dunbar A->getType(), BaseInput); 1183441d060838a5797691777dfcc992ff836b73dcd1Daniel Dunbar } 1184441d060838a5797691777dfcc992ff836b73dcd1Daniel Dunbar 11855c3c1d7b494660ba5e8983ee4584622750725ac2Daniel Dunbar if (CCCPrintBindings) { 1186cd8e4c44dd068956e9181381be3ee2d49a0fac52Daniel Dunbar llvm::errs() << "# \"" << T.getToolChain().getTripleString() << '"' 1187cd8e4c44dd068956e9181381be3ee2d49a0fac52Daniel Dunbar << " - \"" << T.getName() << "\", inputs: ["; 11885c3c1d7b494660ba5e8983ee4584622750725ac2Daniel Dunbar for (unsigned i = 0, e = InputInfos.size(); i != e; ++i) { 11895c3c1d7b494660ba5e8983ee4584622750725ac2Daniel Dunbar llvm::errs() << InputInfos[i].getAsString(); 11905c3c1d7b494660ba5e8983ee4584622750725ac2Daniel Dunbar if (i + 1 != e) 11915c3c1d7b494660ba5e8983ee4584622750725ac2Daniel Dunbar llvm::errs() << ", "; 11925c3c1d7b494660ba5e8983ee4584622750725ac2Daniel Dunbar } 11935c3c1d7b494660ba5e8983ee4584622750725ac2Daniel Dunbar llvm::errs() << "], output: " << Result.getAsString() << "\n"; 11945c3c1d7b494660ba5e8983ee4584622750725ac2Daniel Dunbar } else { 11952fe238ed293bd4bc27af9beb9fa151fad2146fa8Daniel Dunbar T.ConstructJob(C, *JA, Result, InputInfos, 11964954018954bbc97363eef02d0c83bea19ce9b329Daniel Dunbar C.getArgsForToolChain(TC, BoundArch), LinkingOutput); 11975c3c1d7b494660ba5e8983ee4584622750725ac2Daniel Dunbar } 1198f353c8cc2ee1cc16ff194b399a8d951f707fb129Daniel Dunbar} 1199f353c8cc2ee1cc16ff194b399a8d951f707fb129Daniel Dunbar 1200a82318332c9e9b61d3d17371e675ca2859877ee5Daniel Dunbarconst char *Driver::GetNamedOutputPath(Compilation &C, 1201441d060838a5797691777dfcc992ff836b73dcd1Daniel Dunbar const JobAction &JA, 1202441d060838a5797691777dfcc992ff836b73dcd1Daniel Dunbar const char *BaseInput, 1203441d060838a5797691777dfcc992ff836b73dcd1Daniel Dunbar bool AtTopLevel) const { 12048f25c79e59d88df41c5a3cabba1c58035d384a6eDaniel Dunbar llvm::PrettyStackTraceString CrashInfo("Computing output path"); 1205441d060838a5797691777dfcc992ff836b73dcd1Daniel Dunbar // Output to a user requested destination? 1206be1cc3eec682ca73361edb4109a7969452d3dbebDaniel Dunbar if (AtTopLevel && !isa<DsymutilJobAction>(JA)) { 1207441d060838a5797691777dfcc992ff836b73dcd1Daniel Dunbar if (Arg *FinalOutput = C.getArgs().getLastArg(options::OPT_o)) 1208441d060838a5797691777dfcc992ff836b73dcd1Daniel Dunbar return C.addResultFile(FinalOutput->getValue(C.getArgs())); 1209441d060838a5797691777dfcc992ff836b73dcd1Daniel Dunbar } 1210441d060838a5797691777dfcc992ff836b73dcd1Daniel Dunbar 1211bfd21240b6b4989854c8f5331dc86ce7aecf1ad4Nick Lewycky // Default to writing to stdout? 1212bfd21240b6b4989854c8f5331dc86ce7aecf1ad4Nick Lewycky if (AtTopLevel && isa<PreprocessJobAction>(JA)) 1213bfd21240b6b4989854c8f5331dc86ce7aecf1ad4Nick Lewycky return "-"; 1214bfd21240b6b4989854c8f5331dc86ce7aecf1ad4Nick Lewycky 1215441d060838a5797691777dfcc992ff836b73dcd1Daniel Dunbar // Output to a temporary file? 1216441d060838a5797691777dfcc992ff836b73dcd1Daniel Dunbar if (!AtTopLevel && !C.getArgs().hasArg(options::OPT_save_temps)) { 1217a82318332c9e9b61d3d17371e675ca2859877ee5Daniel Dunbar std::string TmpName = 1218214399ebd73545dde02b4a45872e7ca9e1d9e742Daniel Dunbar GetTemporaryPath(types::getTypeTempSuffix(JA.getType())); 1219214399ebd73545dde02b4a45872e7ca9e1d9e742Daniel Dunbar return C.addTempFile(C.getArgs().MakeArgString(TmpName.c_str())); 1220441d060838a5797691777dfcc992ff836b73dcd1Daniel Dunbar } 1221441d060838a5797691777dfcc992ff836b73dcd1Daniel Dunbar 1222472ccff00cdbcd095c3ba933b9e3f202719f118fMichael J. Spencer llvm::SmallString<128> BasePath(BaseInput); 122359f9046031bc9703d405b5a9ec61541a90e03defDaniel Dunbar llvm::StringRef BaseName; 122459f9046031bc9703d405b5a9ec61541a90e03defDaniel Dunbar 122559f9046031bc9703d405b5a9ec61541a90e03defDaniel Dunbar // Dsymutil actions should use the full path. 122659f9046031bc9703d405b5a9ec61541a90e03defDaniel Dunbar if (isa<DsymutilJobAction>(JA)) 122759f9046031bc9703d405b5a9ec61541a90e03defDaniel Dunbar BaseName = BasePath; 122859f9046031bc9703d405b5a9ec61541a90e03defDaniel Dunbar else 122959f9046031bc9703d405b5a9ec61541a90e03defDaniel Dunbar BaseName = llvm::sys::path::filename(BasePath); 1230441d060838a5797691777dfcc992ff836b73dcd1Daniel Dunbar 1231441d060838a5797691777dfcc992ff836b73dcd1Daniel Dunbar // Determine what the derived output name should be. 1232441d060838a5797691777dfcc992ff836b73dcd1Daniel Dunbar const char *NamedOutput; 1233441d060838a5797691777dfcc992ff836b73dcd1Daniel Dunbar if (JA.getType() == types::TY_Image) { 1234441d060838a5797691777dfcc992ff836b73dcd1Daniel Dunbar NamedOutput = DefaultImageName.c_str(); 1235441d060838a5797691777dfcc992ff836b73dcd1Daniel Dunbar } else { 1236441d060838a5797691777dfcc992ff836b73dcd1Daniel Dunbar const char *Suffix = types::getTypeTempSuffix(JA.getType()); 1237441d060838a5797691777dfcc992ff836b73dcd1Daniel Dunbar assert(Suffix && "All types used for output should have a suffix."); 1238441d060838a5797691777dfcc992ff836b73dcd1Daniel Dunbar 1239441d060838a5797691777dfcc992ff836b73dcd1Daniel Dunbar std::string::size_type End = std::string::npos; 1240441d060838a5797691777dfcc992ff836b73dcd1Daniel Dunbar if (!types::appendSuffixForType(JA.getType())) 1241441d060838a5797691777dfcc992ff836b73dcd1Daniel Dunbar End = BaseName.rfind('.'); 1242441d060838a5797691777dfcc992ff836b73dcd1Daniel Dunbar std::string Suffixed(BaseName.substr(0, End)); 1243441d060838a5797691777dfcc992ff836b73dcd1Daniel Dunbar Suffixed += '.'; 1244441d060838a5797691777dfcc992ff836b73dcd1Daniel Dunbar Suffixed += Suffix; 1245441d060838a5797691777dfcc992ff836b73dcd1Daniel Dunbar NamedOutput = C.getArgs().MakeArgString(Suffixed.c_str()); 1246441d060838a5797691777dfcc992ff836b73dcd1Daniel Dunbar } 1247441d060838a5797691777dfcc992ff836b73dcd1Daniel Dunbar 1248a82318332c9e9b61d3d17371e675ca2859877ee5Daniel Dunbar // As an annoying special case, PCH generation doesn't strip the pathname. 1249441d060838a5797691777dfcc992ff836b73dcd1Daniel Dunbar if (JA.getType() == types::TY_PCH) { 1250472ccff00cdbcd095c3ba933b9e3f202719f118fMichael J. Spencer llvm::sys::path::remove_filename(BasePath); 1251472ccff00cdbcd095c3ba933b9e3f202719f118fMichael J. Spencer if (BasePath.empty()) 125256c5594515571eab0e02368ed05416b9dac20837Daniel Dunbar BasePath = NamedOutput; 125356c5594515571eab0e02368ed05416b9dac20837Daniel Dunbar else 1254472ccff00cdbcd095c3ba933b9e3f202719f118fMichael J. Spencer llvm::sys::path::append(BasePath, NamedOutput); 1255441d060838a5797691777dfcc992ff836b73dcd1Daniel Dunbar return C.addResultFile(C.getArgs().MakeArgString(BasePath.c_str())); 1256441d060838a5797691777dfcc992ff836b73dcd1Daniel Dunbar } else { 1257441d060838a5797691777dfcc992ff836b73dcd1Daniel Dunbar return C.addResultFile(NamedOutput); 1258441d060838a5797691777dfcc992ff836b73dcd1Daniel Dunbar } 1259441d060838a5797691777dfcc992ff836b73dcd1Daniel Dunbar} 1260441d060838a5797691777dfcc992ff836b73dcd1Daniel Dunbar 12615ed34f4c58b6ad4e21038d713c1fae31a6146ff5Daniel Dunbarstd::string Driver::GetFilePath(const char *Name, const ToolChain &TC) const { 126248ad6094679ca2bf4f3593068e02e7a208c1a73cChandler Carruth // Respect a limited subset of the '-Bprefix' functionality in GCC by 126348ad6094679ca2bf4f3593068e02e7a208c1a73cChandler Carruth // attempting to use this prefix when lokup up program paths. 126409982cec0029bc495591067fa89967b6b4d1fa19Benjamin Kramer for (Driver::prefix_list::const_iterator it = PrefixDirs.begin(), 126509982cec0029bc495591067fa89967b6b4d1fa19Benjamin Kramer ie = PrefixDirs.end(); it != ie; ++it) { 12668ab2bdcc4f397e100c684ede8e8ca6e226e1380aJoerg Sonnenberger std::string Dir(*it); 12678ab2bdcc4f397e100c684ede8e8ca6e226e1380aJoerg Sonnenberger if (Dir.empty()) 12688ab2bdcc4f397e100c684ede8e8ca6e226e1380aJoerg Sonnenberger continue; 12698ab2bdcc4f397e100c684ede8e8ca6e226e1380aJoerg Sonnenberger if (Dir[0] == '=') 12708ab2bdcc4f397e100c684ede8e8ca6e226e1380aJoerg Sonnenberger Dir = SysRoot + Dir.substr(1); 12718ab2bdcc4f397e100c684ede8e8ca6e226e1380aJoerg Sonnenberger llvm::sys::Path P(Dir); 127248ad6094679ca2bf4f3593068e02e7a208c1a73cChandler Carruth P.appendComponent(Name); 127332bef4edba854303800b3b01cb49a282e5da4f69Michael J. Spencer bool Exists; 127432bef4edba854303800b3b01cb49a282e5da4f69Michael J. Spencer if (!llvm::sys::fs::exists(P.str(), Exists) && Exists) 127548ad6094679ca2bf4f3593068e02e7a208c1a73cChandler Carruth return P.str(); 127648ad6094679ca2bf4f3593068e02e7a208c1a73cChandler Carruth } 127748ad6094679ca2bf4f3593068e02e7a208c1a73cChandler Carruth 12780edefebc10fbc627d55d53936fc66178d1c08da1Daniel Dunbar const ToolChain::path_list &List = TC.getFilePaths(); 1279a82318332c9e9b61d3d17371e675ca2859877ee5Daniel Dunbar for (ToolChain::path_list::const_iterator 12800edefebc10fbc627d55d53936fc66178d1c08da1Daniel Dunbar it = List.begin(), ie = List.end(); it != ie; ++it) { 12818ab2bdcc4f397e100c684ede8e8ca6e226e1380aJoerg Sonnenberger std::string Dir(*it); 12828ab2bdcc4f397e100c684ede8e8ca6e226e1380aJoerg Sonnenberger if (Dir.empty()) 12838ab2bdcc4f397e100c684ede8e8ca6e226e1380aJoerg Sonnenberger continue; 12848ab2bdcc4f397e100c684ede8e8ca6e226e1380aJoerg Sonnenberger if (Dir[0] == '=') 12858ab2bdcc4f397e100c684ede8e8ca6e226e1380aJoerg Sonnenberger Dir = SysRoot + Dir.substr(1); 12868ab2bdcc4f397e100c684ede8e8ca6e226e1380aJoerg Sonnenberger llvm::sys::Path P(Dir); 12870edefebc10fbc627d55d53936fc66178d1c08da1Daniel Dunbar P.appendComponent(Name); 128832bef4edba854303800b3b01cb49a282e5da4f69Michael J. Spencer bool Exists; 128932bef4edba854303800b3b01cb49a282e5da4f69Michael J. Spencer if (!llvm::sys::fs::exists(P.str(), Exists) && Exists) 12905ed34f4c58b6ad4e21038d713c1fae31a6146ff5Daniel Dunbar return P.str(); 12910edefebc10fbc627d55d53936fc66178d1c08da1Daniel Dunbar } 12920edefebc10fbc627d55d53936fc66178d1c08da1Daniel Dunbar 12935ed34f4c58b6ad4e21038d713c1fae31a6146ff5Daniel Dunbar return Name; 1294cb881672c2c46142ec1bdfa401c9818ae805db0fDaniel Dunbar} 1295cb881672c2c46142ec1bdfa401c9818ae805db0fDaniel Dunbar 12965ed34f4c58b6ad4e21038d713c1fae31a6146ff5Daniel Dunbarstd::string Driver::GetProgramPath(const char *Name, const ToolChain &TC, 12975ed34f4c58b6ad4e21038d713c1fae31a6146ff5Daniel Dunbar bool WantFile) const { 129848ad6094679ca2bf4f3593068e02e7a208c1a73cChandler Carruth // Respect a limited subset of the '-Bprefix' functionality in GCC by 129948ad6094679ca2bf4f3593068e02e7a208c1a73cChandler Carruth // attempting to use this prefix when lokup up program paths. 130009982cec0029bc495591067fa89967b6b4d1fa19Benjamin Kramer for (Driver::prefix_list::const_iterator it = PrefixDirs.begin(), 130109982cec0029bc495591067fa89967b6b4d1fa19Benjamin Kramer ie = PrefixDirs.end(); it != ie; ++it) { 130209982cec0029bc495591067fa89967b6b4d1fa19Benjamin Kramer llvm::sys::Path P(*it); 130348ad6094679ca2bf4f3593068e02e7a208c1a73cChandler Carruth P.appendComponent(Name); 130432bef4edba854303800b3b01cb49a282e5da4f69Michael J. Spencer bool Exists; 130532bef4edba854303800b3b01cb49a282e5da4f69Michael J. Spencer if (WantFile ? !llvm::sys::fs::exists(P.str(), Exists) && Exists 130632bef4edba854303800b3b01cb49a282e5da4f69Michael J. Spencer : P.canExecute()) 130748ad6094679ca2bf4f3593068e02e7a208c1a73cChandler Carruth return P.str(); 130848ad6094679ca2bf4f3593068e02e7a208c1a73cChandler Carruth } 130948ad6094679ca2bf4f3593068e02e7a208c1a73cChandler Carruth 13100edefebc10fbc627d55d53936fc66178d1c08da1Daniel Dunbar const ToolChain::path_list &List = TC.getProgramPaths(); 1311a82318332c9e9b61d3d17371e675ca2859877ee5Daniel Dunbar for (ToolChain::path_list::const_iterator 13120edefebc10fbc627d55d53936fc66178d1c08da1Daniel Dunbar it = List.begin(), ie = List.end(); it != ie; ++it) { 13130edefebc10fbc627d55d53936fc66178d1c08da1Daniel Dunbar llvm::sys::Path P(*it); 13140edefebc10fbc627d55d53936fc66178d1c08da1Daniel Dunbar P.appendComponent(Name); 131532bef4edba854303800b3b01cb49a282e5da4f69Michael J. Spencer bool Exists; 131632bef4edba854303800b3b01cb49a282e5da4f69Michael J. Spencer if (WantFile ? !llvm::sys::fs::exists(P.str(), Exists) && Exists 131732bef4edba854303800b3b01cb49a282e5da4f69Michael J. Spencer : P.canExecute()) 13185ed34f4c58b6ad4e21038d713c1fae31a6146ff5Daniel Dunbar return P.str(); 13190edefebc10fbc627d55d53936fc66178d1c08da1Daniel Dunbar } 13200edefebc10fbc627d55d53936fc66178d1c08da1Daniel Dunbar 1321c50b00dbd843cd929b5f220d4a8699852249f64cDaniel Dunbar // If all else failed, search the path. 1322c50b00dbd843cd929b5f220d4a8699852249f64cDaniel Dunbar llvm::sys::Path P(llvm::sys::Program::FindProgramByName(Name)); 1323632f50edc08c76ebc643a0d4871bae33a55d7b4eDaniel Dunbar if (!P.empty()) 13245ed34f4c58b6ad4e21038d713c1fae31a6146ff5Daniel Dunbar return P.str(); 1325632f50edc08c76ebc643a0d4871bae33a55d7b4eDaniel Dunbar 13265ed34f4c58b6ad4e21038d713c1fae31a6146ff5Daniel Dunbar return Name; 1327cb881672c2c46142ec1bdfa401c9818ae805db0fDaniel Dunbar} 1328cb881672c2c46142ec1bdfa401c9818ae805db0fDaniel Dunbar 1329214399ebd73545dde02b4a45872e7ca9e1d9e742Daniel Dunbarstd::string Driver::GetTemporaryPath(const char *Suffix) const { 1330a82318332c9e9b61d3d17371e675ca2859877ee5Daniel Dunbar // FIXME: This is lame; sys::Path should provide this function (in particular, 1331a82318332c9e9b61d3d17371e675ca2859877ee5Daniel Dunbar // it should know how to find the temporary files dir). 1332214399ebd73545dde02b4a45872e7ca9e1d9e742Daniel Dunbar std::string Error; 1333b03417fdc42ae19d2deb2ee1e5d2c3e9896a2a04Daniel Dunbar const char *TmpDir = ::getenv("TMPDIR"); 1334b03417fdc42ae19d2deb2ee1e5d2c3e9896a2a04Daniel Dunbar if (!TmpDir) 1335b03417fdc42ae19d2deb2ee1e5d2c3e9896a2a04Daniel Dunbar TmpDir = ::getenv("TEMP"); 1336b03417fdc42ae19d2deb2ee1e5d2c3e9896a2a04Daniel Dunbar if (!TmpDir) 13373ca7ee9a40532167f67bde17fff5e678f183f3f2Daniel Dunbar TmpDir = ::getenv("TMP"); 13383ca7ee9a40532167f67bde17fff5e678f183f3f2Daniel Dunbar if (!TmpDir) 1339b03417fdc42ae19d2deb2ee1e5d2c3e9896a2a04Daniel Dunbar TmpDir = "/tmp"; 1340b03417fdc42ae19d2deb2ee1e5d2c3e9896a2a04Daniel Dunbar llvm::sys::Path P(TmpDir); 1341f60c63af0ed33ab890600ee6146e7685901f46dfDaniel Dunbar P.appendComponent("cc"); 1342214399ebd73545dde02b4a45872e7ca9e1d9e742Daniel Dunbar if (P.makeUnique(false, &Error)) { 1343214399ebd73545dde02b4a45872e7ca9e1d9e742Daniel Dunbar Diag(clang::diag::err_drv_unable_to_make_temp) << Error; 1344214399ebd73545dde02b4a45872e7ca9e1d9e742Daniel Dunbar return ""; 1345214399ebd73545dde02b4a45872e7ca9e1d9e742Daniel Dunbar } 1346214399ebd73545dde02b4a45872e7ca9e1d9e742Daniel Dunbar 1347a82318332c9e9b61d3d17371e675ca2859877ee5Daniel Dunbar // FIXME: Grumble, makeUnique sometimes leaves the file around!? PR3837. 134884603bc4ed98caca9b82c1a68e63939927d8cd6dDaniel Dunbar P.eraseFromDisk(false, 0); 134984603bc4ed98caca9b82c1a68e63939927d8cd6dDaniel Dunbar 1350214399ebd73545dde02b4a45872e7ca9e1d9e742Daniel Dunbar P.appendSuffix(Suffix); 1351d57a7ef9252964bc6c8471451d7bd395b0520cb8Chris Lattner return P.str(); 1352214399ebd73545dde02b4a45872e7ca9e1d9e742Daniel Dunbar} 1353214399ebd73545dde02b4a45872e7ca9e1d9e742Daniel Dunbar 1354cb8ab23f7c800b041aeb6fc38c341d1aa0da86bfDaniel Dunbarconst HostInfo *Driver::GetHostInfo(const char *TripleStr) const { 13558f25c79e59d88df41c5a3cabba1c58035d384a6eDaniel Dunbar llvm::PrettyStackTraceString CrashInfo("Constructing host"); 1356476fc6715c4119a8e39ec70fbf9df1c57580ead8Anton Korobeynikov llvm::Triple Triple(llvm::Triple::normalize(TripleStr).c_str()); 1357dd98e2cad165ca73c769e4f105a4e47c2216387aDaniel Dunbar 13583a47c4e0a3e8d13ee4fb06cc3a98f9cfa9982400Chris Lattner // TCE is an osless target 13593a47c4e0a3e8d13ee4fb06cc3a98f9cfa9982400Chris Lattner if (Triple.getArchName() == "tce") 1360f78925f633e949f06521d9ffd937019e59f35efcDaniel Dunbar return createTCEHostInfo(*this, Triple); 13613a47c4e0a3e8d13ee4fb06cc3a98f9cfa9982400Chris Lattner 1362cb8ab23f7c800b041aeb6fc38c341d1aa0da86bfDaniel Dunbar switch (Triple.getOS()) { 1363e7925a075f110ab21afeae084670a155dea568e3Edward O'Callaghan case llvm::Triple::AuroraUX: 1364e7925a075f110ab21afeae084670a155dea568e3Edward O'Callaghan return createAuroraUXHostInfo(*this, Triple); 1365cb8ab23f7c800b041aeb6fc38c341d1aa0da86bfDaniel Dunbar case llvm::Triple::Darwin: 1366cb8ab23f7c800b041aeb6fc38c341d1aa0da86bfDaniel Dunbar return createDarwinHostInfo(*this, Triple); 1367cb8ab23f7c800b041aeb6fc38c341d1aa0da86bfDaniel Dunbar case llvm::Triple::DragonFly: 1368cb8ab23f7c800b041aeb6fc38c341d1aa0da86bfDaniel Dunbar return createDragonFlyHostInfo(*this, Triple); 1369f7b8eec37c8c8012fa525c71fb29a58c9f29beefDaniel Dunbar case llvm::Triple::OpenBSD: 1370f7b8eec37c8c8012fa525c71fb29a58c9f29beefDaniel Dunbar return createOpenBSDHostInfo(*this, Triple); 13718e50a96b387dca7525caa8a6add31420dd82a2cdBenjamin Kramer case llvm::Triple::NetBSD: 13728e50a96b387dca7525caa8a6add31420dd82a2cdBenjamin Kramer return createNetBSDHostInfo(*this, Triple); 1373cb8ab23f7c800b041aeb6fc38c341d1aa0da86bfDaniel Dunbar case llvm::Triple::FreeBSD: 1374cb8ab23f7c800b041aeb6fc38c341d1aa0da86bfDaniel Dunbar return createFreeBSDHostInfo(*this, Triple); 137538e317d6dce161b249508686cc67eb7176958762Chris Lattner case llvm::Triple::Minix: 137638e317d6dce161b249508686cc67eb7176958762Chris Lattner return createMinixHostInfo(*this, Triple); 13776b3454a219cee5ef36c4668961f93a5c32deab61Eli Friedman case llvm::Triple::Linux: 13786b3454a219cee5ef36c4668961f93a5c32deab61Eli Friedman return createLinuxHostInfo(*this, Triple); 1379ff58e3610f4e12094def69eb2d6dcb4330378d8fMichael J. Spencer case llvm::Triple::Win32: 1380ff58e3610f4e12094def69eb2d6dcb4330378d8fMichael J. Spencer return createWindowsHostInfo(*this, Triple); 1381ff58e3610f4e12094def69eb2d6dcb4330378d8fMichael J. Spencer case llvm::Triple::MinGW32: 1382ff58e3610f4e12094def69eb2d6dcb4330378d8fMichael J. Spencer return createMinGWHostInfo(*this, Triple); 1383cb8ab23f7c800b041aeb6fc38c341d1aa0da86bfDaniel Dunbar default: 1384cb8ab23f7c800b041aeb6fc38c341d1aa0da86bfDaniel Dunbar return createUnknownHostInfo(*this, Triple); 1385cb8ab23f7c800b041aeb6fc38c341d1aa0da86bfDaniel Dunbar } 1386dd98e2cad165ca73c769e4f105a4e47c2216387aDaniel Dunbar} 1387af80e1ffafeb77929cc0b9ba8940a7f1c0b80d51Daniel Dunbar 1388af80e1ffafeb77929cc0b9ba8940a7f1c0b80d51Daniel Dunbarbool Driver::ShouldUseClangCompiler(const Compilation &C, const JobAction &JA, 1389a6046bec7fc835186dde134fb81aa1b7d45cd9f0Daniel Dunbar const llvm::Triple &Triple) const { 1390a82318332c9e9b61d3d17371e675ca2859877ee5Daniel Dunbar // Check if user requested no clang, or clang doesn't understand this type (we 1391a82318332c9e9b61d3d17371e675ca2859877ee5Daniel Dunbar // only handle single inputs for now). 13925915fbf310e171c4cd3c2af05e9de360c0fa988aDaniel Dunbar if (!CCCUseClang || JA.size() != 1 || 1393af80e1ffafeb77929cc0b9ba8940a7f1c0b80d51Daniel Dunbar !types::isAcceptedByClang((*JA.begin())->getType())) 1394af80e1ffafeb77929cc0b9ba8940a7f1c0b80d51Daniel Dunbar return false; 1395af80e1ffafeb77929cc0b9ba8940a7f1c0b80d51Daniel Dunbar 13960f99d2e57d8e3cf2508e7f9f868d41eccdc229c9Daniel Dunbar // Otherwise make sure this is an action clang understands. 1397af80e1ffafeb77929cc0b9ba8940a7f1c0b80d51Daniel Dunbar if (isa<PreprocessJobAction>(JA)) { 13986256d3654533547a7996170647c21a859cb441e1Daniel Dunbar if (!CCCUseClangCPP) { 13996256d3654533547a7996170647c21a859cb441e1Daniel Dunbar Diag(clang::diag::warn_drv_not_using_clang_cpp); 1400af80e1ffafeb77929cc0b9ba8940a7f1c0b80d51Daniel Dunbar return false; 14016256d3654533547a7996170647c21a859cb441e1Daniel Dunbar } 1402af80e1ffafeb77929cc0b9ba8940a7f1c0b80d51Daniel Dunbar } else if (!isa<PrecompileJobAction>(JA) && !isa<CompileJobAction>(JA)) 1403af80e1ffafeb77929cc0b9ba8940a7f1c0b80d51Daniel Dunbar return false; 1404af80e1ffafeb77929cc0b9ba8940a7f1c0b80d51Daniel Dunbar 14050f99d2e57d8e3cf2508e7f9f868d41eccdc229c9Daniel Dunbar // Use clang for C++? 14066256d3654533547a7996170647c21a859cb441e1Daniel Dunbar if (!CCCUseClangCXX && types::isCXX((*JA.begin())->getType())) { 14076256d3654533547a7996170647c21a859cb441e1Daniel Dunbar Diag(clang::diag::warn_drv_not_using_clang_cxx); 1408af80e1ffafeb77929cc0b9ba8940a7f1c0b80d51Daniel Dunbar return false; 14096256d3654533547a7996170647c21a859cb441e1Daniel Dunbar } 1410af80e1ffafeb77929cc0b9ba8940a7f1c0b80d51Daniel Dunbar 141164952508c2b0c8bffb45c8b410f0af3d2457f59bDaniel Dunbar // Always use clang for precompiling, AST generation, and rewriting, 141264952508c2b0c8bffb45c8b410f0af3d2457f59bDaniel Dunbar // regardless of archs. 14136c6424bc0d3b5f080a97b5f6ef4a8d70c38e38f5Daniel Dunbar if (isa<PrecompileJobAction>(JA) || 14146c6424bc0d3b5f080a97b5f6ef4a8d70c38e38f5Daniel Dunbar types::isOnlyAcceptedByClang(JA.getType())) 1415fec26bd1f4681db8c253fb86529e52bcad28a3ffDaniel Dunbar return true; 1416fec26bd1f4681db8c253fb86529e52bcad28a3ffDaniel Dunbar 1417a82318332c9e9b61d3d17371e675ca2859877ee5Daniel Dunbar // Finally, don't use clang if this isn't one of the user specified archs to 1418a82318332c9e9b61d3d17371e675ca2859877ee5Daniel Dunbar // build. 1419a6046bec7fc835186dde134fb81aa1b7d45cd9f0Daniel Dunbar if (!CCCClangArchs.empty() && !CCCClangArchs.count(Triple.getArch())) { 1420a6046bec7fc835186dde134fb81aa1b7d45cd9f0Daniel Dunbar Diag(clang::diag::warn_drv_not_using_clang_arch) << Triple.getArchName(); 1421af80e1ffafeb77929cc0b9ba8940a7f1c0b80d51Daniel Dunbar return false; 14226256d3654533547a7996170647c21a859cb441e1Daniel Dunbar } 1423af80e1ffafeb77929cc0b9ba8940a7f1c0b80d51Daniel Dunbar 1424af80e1ffafeb77929cc0b9ba8940a7f1c0b80d51Daniel Dunbar return true; 1425af80e1ffafeb77929cc0b9ba8940a7f1c0b80d51Daniel Dunbar} 1426d73fe9b70c5f6738d004744562287a62831f39bfDaniel Dunbar 1427a82318332c9e9b61d3d17371e675ca2859877ee5Daniel Dunbar/// GetReleaseVersion - Parse (([0-9]+)(.([0-9]+)(.([0-9]+)?))?)? and return the 1428a82318332c9e9b61d3d17371e675ca2859877ee5Daniel Dunbar/// grouped values as integers. Numbers which are not provided are set to 0. 1429d73fe9b70c5f6738d004744562287a62831f39bfDaniel Dunbar/// 1430a82318332c9e9b61d3d17371e675ca2859877ee5Daniel Dunbar/// \return True if the entire string was parsed (9.2), or all groups were 1431a82318332c9e9b61d3d17371e675ca2859877ee5Daniel Dunbar/// parsed (10.3.5extrastuff). 1432a82318332c9e9b61d3d17371e675ca2859877ee5Daniel Dunbarbool Driver::GetReleaseVersion(const char *Str, unsigned &Major, 1433d73fe9b70c5f6738d004744562287a62831f39bfDaniel Dunbar unsigned &Minor, unsigned &Micro, 1434d73fe9b70c5f6738d004744562287a62831f39bfDaniel Dunbar bool &HadExtra) { 1435d73fe9b70c5f6738d004744562287a62831f39bfDaniel Dunbar HadExtra = false; 1436d73fe9b70c5f6738d004744562287a62831f39bfDaniel Dunbar 1437d73fe9b70c5f6738d004744562287a62831f39bfDaniel Dunbar Major = Minor = Micro = 0; 1438a82318332c9e9b61d3d17371e675ca2859877ee5Daniel Dunbar if (*Str == '\0') 1439d73fe9b70c5f6738d004744562287a62831f39bfDaniel Dunbar return true; 1440d73fe9b70c5f6738d004744562287a62831f39bfDaniel Dunbar 1441d73fe9b70c5f6738d004744562287a62831f39bfDaniel Dunbar char *End; 1442d73fe9b70c5f6738d004744562287a62831f39bfDaniel Dunbar Major = (unsigned) strtol(Str, &End, 10); 1443d73fe9b70c5f6738d004744562287a62831f39bfDaniel Dunbar if (*Str != '\0' && *End == '\0') 1444d73fe9b70c5f6738d004744562287a62831f39bfDaniel Dunbar return true; 1445d73fe9b70c5f6738d004744562287a62831f39bfDaniel Dunbar if (*End != '.') 1446d73fe9b70c5f6738d004744562287a62831f39bfDaniel Dunbar return false; 1447a82318332c9e9b61d3d17371e675ca2859877ee5Daniel Dunbar 1448d73fe9b70c5f6738d004744562287a62831f39bfDaniel Dunbar Str = End+1; 1449d73fe9b70c5f6738d004744562287a62831f39bfDaniel Dunbar Minor = (unsigned) strtol(Str, &End, 10); 1450d73fe9b70c5f6738d004744562287a62831f39bfDaniel Dunbar if (*Str != '\0' && *End == '\0') 1451d73fe9b70c5f6738d004744562287a62831f39bfDaniel Dunbar return true; 1452d73fe9b70c5f6738d004744562287a62831f39bfDaniel Dunbar if (*End != '.') 1453d73fe9b70c5f6738d004744562287a62831f39bfDaniel Dunbar return false; 1454d73fe9b70c5f6738d004744562287a62831f39bfDaniel Dunbar 1455d73fe9b70c5f6738d004744562287a62831f39bfDaniel Dunbar Str = End+1; 1456d73fe9b70c5f6738d004744562287a62831f39bfDaniel Dunbar Micro = (unsigned) strtol(Str, &End, 10); 1457d73fe9b70c5f6738d004744562287a62831f39bfDaniel Dunbar if (*Str != '\0' && *End == '\0') 1458d73fe9b70c5f6738d004744562287a62831f39bfDaniel Dunbar return true; 1459d73fe9b70c5f6738d004744562287a62831f39bfDaniel Dunbar if (Str == End) 1460d73fe9b70c5f6738d004744562287a62831f39bfDaniel Dunbar return false; 1461d73fe9b70c5f6738d004744562287a62831f39bfDaniel Dunbar HadExtra = true; 1462d73fe9b70c5f6738d004744562287a62831f39bfDaniel Dunbar return true; 1463d73fe9b70c5f6738d004744562287a62831f39bfDaniel Dunbar} 1464