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