Driver.cpp revision 137a20b5f9360311dd0b6d2500e3365ab2cdf40e
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"
280648262df75d97b464c2be0ed867da3615659785Daniel Dunbar
29ab41e63821dc60ad144d0684df8d79a9eef86b75Douglas Gregor#include "clang/Basic/Version.h"
30ab41e63821dc60ad144d0684df8d79a9eef86b75Douglas Gregor
31a77a723489b0cff63bf90f23416e10b8b6fc1f55Daniel Dunbar#include "llvm/Config/config.h"
327f9fc3f7ce076645cb6aefc99c64d9446caf13d6Chris Lattner#include "llvm/ADT/ArrayRef.h"
331368954db9ce2989ed8f03f5c65e8ee775a5229aDaniel Dunbar#include "llvm/ADT/StringSet.h"
344d7b14734f2285695dcec347f8718b512093390aTed Kremenek#include "llvm/ADT/OwningPtr.h"
358f25c79e59d88df41c5a3cabba1c58035d384a6eDaniel Dunbar#include "llvm/Support/PrettyStackTrace.h"
360648262df75d97b464c2be0ed867da3615659785Daniel Dunbar#include "llvm/Support/raw_ostream.h"
37256053b31e697fdf0cc48f17d621c82fc3b8dff0Michael J. Spencer#include "llvm/Support/FileSystem.h"
3803013fa9a0bf1ef4b907f5fec006c8f4000fdd21Michael J. Spencer#include "llvm/Support/Path.h"
3903013fa9a0bf1ef4b907f5fec006c8f4000fdd21Michael J. Spencer#include "llvm/Support/Program.h"
40ba1021388e6839b76c8968b931189361c7286674Daniel Dunbar
41f353c8cc2ee1cc16ff194b399a8d951f707fb129Daniel Dunbar#include "InputInfo.h"
42f353c8cc2ee1cc16ff194b399a8d951f707fb129Daniel Dunbar
43ba1021388e6839b76c8968b931189361c7286674Daniel Dunbar#include <map>
44ba1021388e6839b76c8968b931189361c7286674Daniel Dunbar
451b3bb6efc59a21f794b534078f9ae7e95393f510Daniel Dunbarusing namespace clang::driver;
4692b369928b8e9ad156fb6eec2bf9f21d657bd69bChris Lattnerusing namespace clang;
471b3bb6efc59a21f794b534078f9ae7e95393f510Daniel Dunbar
485f9e272e632e951b1efe824cd16acb4d96077930Chris LattnerDriver::Driver(StringRef ClangExecutable,
495f9e272e632e951b1efe824cd16acb4d96077930Chris Lattner               StringRef DefaultHostTriple,
505f9e272e632e951b1efe824cd16acb4d96077930Chris Lattner               StringRef DefaultImageName,
515d93ed3c7a2dae0a8f422747e269963b3ef11d95Daniel Dunbar               bool IsProduction, bool CXXIsProduction,
527e46d0b8436d844d77f3ff580b6e1204e0407044Nick Lewycky               Diagnostic &Diags)
537e46d0b8436d844d77f3ff580b6e1204e0407044Nick Lewycky  : Opts(createDriverOptTable()), Diags(Diags),
547e46d0b8436d844d77f3ff580b6e1204e0407044Nick Lewycky    ClangExecutable(ClangExecutable), UseStdLib(true),
557e46d0b8436d844d77f3ff580b6e1204e0407044Nick Lewycky    DefaultHostTriple(DefaultHostTriple), DefaultImageName(DefaultImageName),
5643302d4144b5291961aa160d2fe191c09a9d8ad1Daniel Dunbar    DriverTitle("clang \"gcc-compatible\" driver"),
57dd98e2cad165ca73c769e4f105a4e47c2216387aDaniel Dunbar    Host(0),
58c8a22b091677c02003880166e5d5767ca8d74b70Daniel Dunbar    CCPrintOptionsFilename(0), CCPrintHeadersFilename(0),
59c8a22b091677c02003880166e5d5767ca8d74b70Daniel Dunbar    CCLogDiagnosticsFilename(0), CCCIsCXX(false),
60951c5705771a57eca0bca07aae5d4738619dd6c6Joerg Sonnenberger    CCCIsCPP(false),CCCEcho(false), CCCPrintBindings(false),
61c8a22b091677c02003880166e5d5767ca8d74b70Daniel Dunbar    CCPrintOptions(false), CCPrintHeaders(false), CCLogDiagnostics(false),
622b81910618f63e4ce2373c926a26e76b4b91373fChad Rosier    CCGenDiagnostics(false), CCCGenericGCCName(""), CheckInputsExist(true),
632b81910618f63e4ce2373c926a26e76b4b91373fChad Rosier    CCCUseClang(true), CCCUseClangCXX(true), CCCUseClangCPP(true),
642b81910618f63e4ce2373c926a26e76b4b91373fChad Rosier    CCCUsePCH(true), SuppressMissingInputWarning(false) {
65f44c58563286bb448a72ed9c9af5f21718633230Daniel Dunbar  if (IsProduction) {
66f44c58563286bb448a72ed9c9af5f21718633230Daniel Dunbar    // In a "production" build, only use clang on architectures we expect to
67f44c58563286bb448a72ed9c9af5f21718633230Daniel Dunbar    // work, and don't use clang C++.
68f44c58563286bb448a72ed9c9af5f21718633230Daniel Dunbar    //
69f44c58563286bb448a72ed9c9af5f21718633230Daniel Dunbar    // During development its more convenient to always have the driver use
70f44c58563286bb448a72ed9c9af5f21718633230Daniel Dunbar    // clang, but we don't want users to be confused when things don't work, or
71f44c58563286bb448a72ed9c9af5f21718633230Daniel Dunbar    // to file bugs for things we don't support.
72f44c58563286bb448a72ed9c9af5f21718633230Daniel Dunbar    CCCClangArchs.insert(llvm::Triple::x86);
73f44c58563286bb448a72ed9c9af5f21718633230Daniel Dunbar    CCCClangArchs.insert(llvm::Triple::x86_64);
74f44c58563286bb448a72ed9c9af5f21718633230Daniel Dunbar    CCCClangArchs.insert(llvm::Triple::arm);
75f44c58563286bb448a72ed9c9af5f21718633230Daniel Dunbar
765d93ed3c7a2dae0a8f422747e269963b3ef11d95Daniel Dunbar    if (!CXXIsProduction)
775d93ed3c7a2dae0a8f422747e269963b3ef11d95Daniel Dunbar      CCCUseClangCXX = false;
78f44c58563286bb448a72ed9c9af5f21718633230Daniel Dunbar  }
79225c41706dc0f3682236e351820d339e14390e00Daniel Dunbar
80d5b08bee799d4f77f1a25fa5977ca77b983ab031Michael J. Spencer  Name = llvm::sys::path::stem(ClangExecutable);
81d5b08bee799d4f77f1a25fa5977ca77b983ab031Michael J. Spencer  Dir  = llvm::sys::path::parent_path(ClangExecutable);
820bbad519aa068206f1e158d5073f72a39fbe83c5Daniel Dunbar
83225c41706dc0f3682236e351820d339e14390e00Daniel Dunbar  // Compute the path to the resource directory.
845f9e272e632e951b1efe824cd16acb4d96077930Chris Lattner  StringRef ClangResourceDir(CLANG_RESOURCE_DIR);
85d5b08bee799d4f77f1a25fa5977ca77b983ab031Michael J. Spencer  llvm::SmallString<128> P(Dir);
86d5b08bee799d4f77f1a25fa5977ca77b983ab031Michael J. Spencer  if (ClangResourceDir != "")
87d5b08bee799d4f77f1a25fa5977ca77b983ab031Michael J. Spencer    llvm::sys::path::append(P, ClangResourceDir);
88d5b08bee799d4f77f1a25fa5977ca77b983ab031Michael J. Spencer  else
89d5b08bee799d4f77f1a25fa5977ca77b983ab031Michael J. Spencer    llvm::sys::path::append(P, "..", "lib", "clang", CLANG_VERSION_STRING);
90225c41706dc0f3682236e351820d339e14390e00Daniel Dunbar  ResourceDir = P.str();
913ede8d0a7d1813f678ccc6011a99a0834b1b6116Daniel Dunbar}
923ede8d0a7d1813f678ccc6011a99a0834b1b6116Daniel Dunbar
933ede8d0a7d1813f678ccc6011a99a0834b1b6116Daniel DunbarDriver::~Driver() {
941b3bb6efc59a21f794b534078f9ae7e95393f510Daniel Dunbar  delete Opts;
957e4534d9c14febcdea30c057bb2a36e245776865Daniel Dunbar  delete Host;
963ede8d0a7d1813f678ccc6011a99a0834b1b6116Daniel Dunbar}
973ede8d0a7d1813f678ccc6011a99a0834b1b6116Daniel Dunbar
982d3ba4f5a923a90c3fc290ddfba5e36c2d0a9b46Chris LattnerInputArgList *Driver::ParseArgStrings(ArrayRef<const char *> ArgList) {
998f25c79e59d88df41c5a3cabba1c58035d384a6eDaniel Dunbar  llvm::PrettyStackTraceString CrashInfo("Command line argument parsing");
100847abaa62883b6c20005bdd3346ebbd44e46dbacDaniel Dunbar  unsigned MissingArgIndex, MissingArgCount;
1017f9fc3f7ce076645cb6aefc99c64d9446caf13d6Chris Lattner  InputArgList *Args = getOpts().ParseArgs(ArgList.begin(), ArgList.end(),
102847abaa62883b6c20005bdd3346ebbd44e46dbacDaniel Dunbar                                           MissingArgIndex, MissingArgCount);
103847abaa62883b6c20005bdd3346ebbd44e46dbacDaniel Dunbar
104847abaa62883b6c20005bdd3346ebbd44e46dbacDaniel Dunbar  // Check for missing argument error.
105847abaa62883b6c20005bdd3346ebbd44e46dbacDaniel Dunbar  if (MissingArgCount)
106847abaa62883b6c20005bdd3346ebbd44e46dbacDaniel Dunbar    Diag(clang::diag::err_drv_missing_argument)
107847abaa62883b6c20005bdd3346ebbd44e46dbacDaniel Dunbar      << Args->getArgString(MissingArgIndex) << MissingArgCount;
108847abaa62883b6c20005bdd3346ebbd44e46dbacDaniel Dunbar
109847abaa62883b6c20005bdd3346ebbd44e46dbacDaniel Dunbar  // Check for unsupported options.
110847abaa62883b6c20005bdd3346ebbd44e46dbacDaniel Dunbar  for (ArgList::const_iterator it = Args->begin(), ie = Args->end();
111847abaa62883b6c20005bdd3346ebbd44e46dbacDaniel Dunbar       it != ie; ++it) {
112847abaa62883b6c20005bdd3346ebbd44e46dbacDaniel Dunbar    Arg *A = *it;
113b0c4df5c4df69a003f26b378eb95961bc7c486e5Daniel Dunbar    if (A->getOption().isUnsupported()) {
114b0c4df5c4df69a003f26b378eb95961bc7c486e5Daniel Dunbar      Diag(clang::diag::err_drv_unsupported_opt) << A->getAsString(*Args);
115b0c4df5c4df69a003f26b378eb95961bc7c486e5Daniel Dunbar      continue;
116b0c4df5c4df69a003f26b378eb95961bc7c486e5Daniel Dunbar    }
1170648262df75d97b464c2be0ed867da3615659785Daniel Dunbar  }
1180648262df75d97b464c2be0ed867da3615659785Daniel Dunbar
1190648262df75d97b464c2be0ed867da3615659785Daniel Dunbar  return Args;
1200648262df75d97b464c2be0ed867da3615659785Daniel Dunbar}
1210648262df75d97b464c2be0ed867da3615659785Daniel Dunbar
1221fc1de48cdf9a2f241e0f2c7b9e9db2322f1b794Chad Rosier// Determine which compilation mode we are in. We look for options which
1231fc1de48cdf9a2f241e0f2c7b9e9db2322f1b794Chad Rosier// affect the phase, starting with the earliest phases, and record which
1241fc1de48cdf9a2f241e0f2c7b9e9db2322f1b794Chad Rosier// option we used to determine the final phase.
1251fc1de48cdf9a2f241e0f2c7b9e9db2322f1b794Chad Rosierphases::ID Driver::getFinalPhase(const DerivedArgList &DAL, Arg **FinalPhaseArg)
1261fc1de48cdf9a2f241e0f2c7b9e9db2322f1b794Chad Rosierconst {
1271fc1de48cdf9a2f241e0f2c7b9e9db2322f1b794Chad Rosier  Arg *PhaseArg = 0;
1281fc1de48cdf9a2f241e0f2c7b9e9db2322f1b794Chad Rosier  phases::ID FinalPhase;
1291fc1de48cdf9a2f241e0f2c7b9e9db2322f1b794Chad Rosier
1301fc1de48cdf9a2f241e0f2c7b9e9db2322f1b794Chad Rosier  // -{E,M,MM} only run the preprocessor.
1311fc1de48cdf9a2f241e0f2c7b9e9db2322f1b794Chad Rosier  if (CCCIsCPP ||
1321fc1de48cdf9a2f241e0f2c7b9e9db2322f1b794Chad Rosier      (PhaseArg = DAL.getLastArg(options::OPT_E)) ||
1331fc1de48cdf9a2f241e0f2c7b9e9db2322f1b794Chad Rosier      (PhaseArg = DAL.getLastArg(options::OPT_M, options::OPT_MM))) {
1341fc1de48cdf9a2f241e0f2c7b9e9db2322f1b794Chad Rosier    FinalPhase = phases::Preprocess;
1351fc1de48cdf9a2f241e0f2c7b9e9db2322f1b794Chad Rosier
1361fc1de48cdf9a2f241e0f2c7b9e9db2322f1b794Chad Rosier    // -{fsyntax-only,-analyze,emit-ast,S} only run up to the compiler.
1371fc1de48cdf9a2f241e0f2c7b9e9db2322f1b794Chad Rosier  } else if ((PhaseArg = DAL.getLastArg(options::OPT_fsyntax_only)) ||
1381fc1de48cdf9a2f241e0f2c7b9e9db2322f1b794Chad Rosier             (PhaseArg = DAL.getLastArg(options::OPT_rewrite_objc)) ||
1391fc1de48cdf9a2f241e0f2c7b9e9db2322f1b794Chad Rosier             (PhaseArg = DAL.getLastArg(options::OPT__analyze,
1401fc1de48cdf9a2f241e0f2c7b9e9db2322f1b794Chad Rosier                                              options::OPT__analyze_auto)) ||
1411fc1de48cdf9a2f241e0f2c7b9e9db2322f1b794Chad Rosier             (PhaseArg = DAL.getLastArg(options::OPT_emit_ast)) ||
1421fc1de48cdf9a2f241e0f2c7b9e9db2322f1b794Chad Rosier             (PhaseArg = DAL.getLastArg(options::OPT_S))) {
1431fc1de48cdf9a2f241e0f2c7b9e9db2322f1b794Chad Rosier    FinalPhase = phases::Compile;
1441fc1de48cdf9a2f241e0f2c7b9e9db2322f1b794Chad Rosier
1451fc1de48cdf9a2f241e0f2c7b9e9db2322f1b794Chad Rosier    // -c only runs up to the assembler.
1461fc1de48cdf9a2f241e0f2c7b9e9db2322f1b794Chad Rosier  } else if ((PhaseArg = DAL.getLastArg(options::OPT_c))) {
1471fc1de48cdf9a2f241e0f2c7b9e9db2322f1b794Chad Rosier    FinalPhase = phases::Assemble;
1481fc1de48cdf9a2f241e0f2c7b9e9db2322f1b794Chad Rosier
1491fc1de48cdf9a2f241e0f2c7b9e9db2322f1b794Chad Rosier    // Otherwise do everything.
1501fc1de48cdf9a2f241e0f2c7b9e9db2322f1b794Chad Rosier  } else
1511fc1de48cdf9a2f241e0f2c7b9e9db2322f1b794Chad Rosier    FinalPhase = phases::Link;
1521fc1de48cdf9a2f241e0f2c7b9e9db2322f1b794Chad Rosier
1531fc1de48cdf9a2f241e0f2c7b9e9db2322f1b794Chad Rosier  if (FinalPhaseArg)
1541fc1de48cdf9a2f241e0f2c7b9e9db2322f1b794Chad Rosier    *FinalPhaseArg = PhaseArg;
1551fc1de48cdf9a2f241e0f2c7b9e9db2322f1b794Chad Rosier
1561fc1de48cdf9a2f241e0f2c7b9e9db2322f1b794Chad Rosier  return FinalPhase;
1571fc1de48cdf9a2f241e0f2c7b9e9db2322f1b794Chad Rosier}
1581fc1de48cdf9a2f241e0f2c7b9e9db2322f1b794Chad Rosier
159279c1dbebf37cd128f3c73c70741a6b8c35ad025Daniel DunbarDerivedArgList *Driver::TranslateInputArgs(const InputArgList &Args) const {
160279c1dbebf37cd128f3c73c70741a6b8c35ad025Daniel Dunbar  DerivedArgList *DAL = new DerivedArgList(Args);
161279c1dbebf37cd128f3c73c70741a6b8c35ad025Daniel Dunbar
162e5a37f48388c7e4cc081f44d13a4910bfa56cd35Daniel Dunbar  bool HasNostdlib = Args.hasArg(options::OPT_nostdlib);
163279c1dbebf37cd128f3c73c70741a6b8c35ad025Daniel Dunbar  for (ArgList::const_iterator it = Args.begin(),
164f78925f633e949f06521d9ffd937019e59f35efcDaniel Dunbar         ie = Args.end(); it != ie; ++it) {
165f78925f633e949f06521d9ffd937019e59f35efcDaniel Dunbar    const Arg *A = *it;
166f78925f633e949f06521d9ffd937019e59f35efcDaniel Dunbar
167f78925f633e949f06521d9ffd937019e59f35efcDaniel Dunbar    // Unfortunately, we have to parse some forwarding options (-Xassembler,
168f78925f633e949f06521d9ffd937019e59f35efcDaniel Dunbar    // -Xlinker, -Xpreprocessor) because we either integrate their functionality
169f78925f633e949f06521d9ffd937019e59f35efcDaniel Dunbar    // (assembler and preprocessor), or bypass a previous driver ('collect2').
170eda3f707fd53f90f4232b0e694d3f5514237aba5Daniel Dunbar
171eda3f707fd53f90f4232b0e694d3f5514237aba5Daniel Dunbar    // Rewrite linker options, to replace --no-demangle with a custom internal
172eda3f707fd53f90f4232b0e694d3f5514237aba5Daniel Dunbar    // option.
173eda3f707fd53f90f4232b0e694d3f5514237aba5Daniel Dunbar    if ((A->getOption().matches(options::OPT_Wl_COMMA) ||
174eda3f707fd53f90f4232b0e694d3f5514237aba5Daniel Dunbar         A->getOption().matches(options::OPT_Xlinker)) &&
175eda3f707fd53f90f4232b0e694d3f5514237aba5Daniel Dunbar        A->containsValue("--no-demangle")) {
176f78925f633e949f06521d9ffd937019e59f35efcDaniel Dunbar      // Add the rewritten no-demangle argument.
177f78925f633e949f06521d9ffd937019e59f35efcDaniel Dunbar      DAL->AddFlagArg(A, Opts->getOption(options::OPT_Z_Xlinker__no_demangle));
178f78925f633e949f06521d9ffd937019e59f35efcDaniel Dunbar
179f78925f633e949f06521d9ffd937019e59f35efcDaniel Dunbar      // Add the remaining values as Xlinker arguments.
180f78925f633e949f06521d9ffd937019e59f35efcDaniel Dunbar      for (unsigned i = 0, e = A->getNumValues(); i != e; ++i)
1815f9e272e632e951b1efe824cd16acb4d96077930Chris Lattner        if (StringRef(A->getValue(Args, i)) != "--no-demangle")
182f78925f633e949f06521d9ffd937019e59f35efcDaniel Dunbar          DAL->AddSeparateArg(A, Opts->getOption(options::OPT_Xlinker),
183f78925f633e949f06521d9ffd937019e59f35efcDaniel Dunbar                              A->getValue(Args, i));
184f78925f633e949f06521d9ffd937019e59f35efcDaniel Dunbar
185f78925f633e949f06521d9ffd937019e59f35efcDaniel Dunbar      continue;
186f78925f633e949f06521d9ffd937019e59f35efcDaniel Dunbar    }
187f78925f633e949f06521d9ffd937019e59f35efcDaniel Dunbar
188eda3f707fd53f90f4232b0e694d3f5514237aba5Daniel Dunbar    // Rewrite preprocessor options, to replace -Wp,-MD,FOO which is used by
189eda3f707fd53f90f4232b0e694d3f5514237aba5Daniel Dunbar    // some build systems. We don't try to be complete here because we don't
190eda3f707fd53f90f4232b0e694d3f5514237aba5Daniel Dunbar    // care to encourage this usage model.
191eda3f707fd53f90f4232b0e694d3f5514237aba5Daniel Dunbar    if (A->getOption().matches(options::OPT_Wp_COMMA) &&
192eda3f707fd53f90f4232b0e694d3f5514237aba5Daniel Dunbar        A->getNumValues() == 2 &&
1935f9e272e632e951b1efe824cd16acb4d96077930Chris Lattner        (A->getValue(Args, 0) == StringRef("-MD") ||
1945f9e272e632e951b1efe824cd16acb4d96077930Chris Lattner         A->getValue(Args, 0) == StringRef("-MMD"))) {
195212df32d955c34dbb8b976bc0316e8eb83ac579eDaniel Dunbar      // Rewrite to -MD/-MMD along with -MF.
1965f9e272e632e951b1efe824cd16acb4d96077930Chris Lattner      if (A->getValue(Args, 0) == StringRef("-MD"))
197212df32d955c34dbb8b976bc0316e8eb83ac579eDaniel Dunbar        DAL->AddFlagArg(A, Opts->getOption(options::OPT_MD));
198212df32d955c34dbb8b976bc0316e8eb83ac579eDaniel Dunbar      else
199212df32d955c34dbb8b976bc0316e8eb83ac579eDaniel Dunbar        DAL->AddFlagArg(A, Opts->getOption(options::OPT_MMD));
200eda3f707fd53f90f4232b0e694d3f5514237aba5Daniel Dunbar      DAL->AddSeparateArg(A, Opts->getOption(options::OPT_MF),
201eda3f707fd53f90f4232b0e694d3f5514237aba5Daniel Dunbar                          A->getValue(Args, 1));
202eda3f707fd53f90f4232b0e694d3f5514237aba5Daniel Dunbar      continue;
203eda3f707fd53f90f4232b0e694d3f5514237aba5Daniel Dunbar    }
204eda3f707fd53f90f4232b0e694d3f5514237aba5Daniel Dunbar
2057433fedce98a58341d0f30c2e12e8d53f3bba575Shantonu Sen    // Rewrite reserved library names.
2067433fedce98a58341d0f30c2e12e8d53f3bba575Shantonu Sen    if (A->getOption().matches(options::OPT_l)) {
2075f9e272e632e951b1efe824cd16acb4d96077930Chris Lattner      StringRef Value = A->getValue(Args);
208e5a37f48388c7e4cc081f44d13a4910bfa56cd35Daniel Dunbar
2097433fedce98a58341d0f30c2e12e8d53f3bba575Shantonu Sen      // Rewrite unless -nostdlib is present.
2107433fedce98a58341d0f30c2e12e8d53f3bba575Shantonu Sen      if (!HasNostdlib && Value == "stdc++") {
211e5a37f48388c7e4cc081f44d13a4910bfa56cd35Daniel Dunbar        DAL->AddFlagArg(A, Opts->getOption(
212e5a37f48388c7e4cc081f44d13a4910bfa56cd35Daniel Dunbar                              options::OPT_Z_reserved_lib_stdcxx));
213e5a37f48388c7e4cc081f44d13a4910bfa56cd35Daniel Dunbar        continue;
214e5a37f48388c7e4cc081f44d13a4910bfa56cd35Daniel Dunbar      }
2157433fedce98a58341d0f30c2e12e8d53f3bba575Shantonu Sen
2167433fedce98a58341d0f30c2e12e8d53f3bba575Shantonu Sen      // Rewrite unconditionally.
2177433fedce98a58341d0f30c2e12e8d53f3bba575Shantonu Sen      if (Value == "cc_kext") {
2187433fedce98a58341d0f30c2e12e8d53f3bba575Shantonu Sen        DAL->AddFlagArg(A, Opts->getOption(
2197433fedce98a58341d0f30c2e12e8d53f3bba575Shantonu Sen                              options::OPT_Z_reserved_lib_cckext));
2207433fedce98a58341d0f30c2e12e8d53f3bba575Shantonu Sen        continue;
2217433fedce98a58341d0f30c2e12e8d53f3bba575Shantonu Sen      }
222e5a37f48388c7e4cc081f44d13a4910bfa56cd35Daniel Dunbar    }
223e5a37f48388c7e4cc081f44d13a4910bfa56cd35Daniel Dunbar
224279c1dbebf37cd128f3c73c70741a6b8c35ad025Daniel Dunbar    DAL->append(*it);
225f78925f633e949f06521d9ffd937019e59f35efcDaniel Dunbar  }
226279c1dbebf37cd128f3c73c70741a6b8c35ad025Daniel Dunbar
227a77a723489b0cff63bf90f23416e10b8b6fc1f55Daniel Dunbar  // Add a default value of -mlinker-version=, if one was given and the user
228a77a723489b0cff63bf90f23416e10b8b6fc1f55Daniel Dunbar  // didn't specify one.
229a77a723489b0cff63bf90f23416e10b8b6fc1f55Daniel Dunbar#if defined(HOST_LINK_VERSION)
230a77a723489b0cff63bf90f23416e10b8b6fc1f55Daniel Dunbar  if (!Args.hasArg(options::OPT_mlinker_version_EQ)) {
231a77a723489b0cff63bf90f23416e10b8b6fc1f55Daniel Dunbar    DAL->AddJoinedArg(0, Opts->getOption(options::OPT_mlinker_version_EQ),
232a77a723489b0cff63bf90f23416e10b8b6fc1f55Daniel Dunbar                      HOST_LINK_VERSION);
233c326b64a4d14ad89d6a5d227d2460050149d5461Daniel Dunbar    DAL->getLastArg(options::OPT_mlinker_version_EQ)->claim();
234a77a723489b0cff63bf90f23416e10b8b6fc1f55Daniel Dunbar  }
235a77a723489b0cff63bf90f23416e10b8b6fc1f55Daniel Dunbar#endif
236a77a723489b0cff63bf90f23416e10b8b6fc1f55Daniel Dunbar
2371fc1de48cdf9a2f241e0f2c7b9e9db2322f1b794Chad Rosier  // If -fapple-kext has been specified, add -kext to linker command if not
2381fc1de48cdf9a2f241e0f2c7b9e9db2322f1b794Chad Rosier  // already done so.  Also check to make sure we're actually linking.
2391fc1de48cdf9a2f241e0f2c7b9e9db2322f1b794Chad Rosier  if (Args.hasArg(options::OPT_fapple_kext) && getFinalPhase(*DAL) ==
2401fc1de48cdf9a2f241e0f2c7b9e9db2322f1b794Chad Rosier      phases::Link) {
2411fc1de48cdf9a2f241e0f2c7b9e9db2322f1b794Chad Rosier    bool add_kext = true;
2421fc1de48cdf9a2f241e0f2c7b9e9db2322f1b794Chad Rosier    std::vector<std::string> LinkerArgs =
2431fc1de48cdf9a2f241e0f2c7b9e9db2322f1b794Chad Rosier      Args.getAllArgValues(options::OPT_Xlinker);
2441fc1de48cdf9a2f241e0f2c7b9e9db2322f1b794Chad Rosier    for (std::vector<std::string>::iterator it = LinkerArgs.begin(),
2451fc1de48cdf9a2f241e0f2c7b9e9db2322f1b794Chad Rosier           ie = LinkerArgs.end(); it != ie; it++)
2461fc1de48cdf9a2f241e0f2c7b9e9db2322f1b794Chad Rosier      if (*it == "-kext") {
2471fc1de48cdf9a2f241e0f2c7b9e9db2322f1b794Chad Rosier        add_kext = false;
2481fc1de48cdf9a2f241e0f2c7b9e9db2322f1b794Chad Rosier        break;
2491fc1de48cdf9a2f241e0f2c7b9e9db2322f1b794Chad Rosier      }
2501fc1de48cdf9a2f241e0f2c7b9e9db2322f1b794Chad Rosier    if (add_kext)
2511fc1de48cdf9a2f241e0f2c7b9e9db2322f1b794Chad Rosier      DAL->AddSeparateArg(0, Opts->getOption(options::OPT_Xlinker), "-kext");
2521fc1de48cdf9a2f241e0f2c7b9e9db2322f1b794Chad Rosier  }
2531fc1de48cdf9a2f241e0f2c7b9e9db2322f1b794Chad Rosier
254279c1dbebf37cd128f3c73c70741a6b8c35ad025Daniel Dunbar  return DAL;
255279c1dbebf37cd128f3c73c70741a6b8c35ad025Daniel Dunbar}
256279c1dbebf37cd128f3c73c70741a6b8c35ad025Daniel Dunbar
2572d3ba4f5a923a90c3fc290ddfba5e36c2d0a9b46Chris LattnerCompilation *Driver::BuildCompilation(ArrayRef<const char *> ArgList) {
2588f25c79e59d88df41c5a3cabba1c58035d384a6eDaniel Dunbar  llvm::PrettyStackTraceString CrashInfo("Compilation construction");
2598f25c79e59d88df41c5a3cabba1c58035d384a6eDaniel Dunbar
260a82318332c9e9b61d3d17371e675ca2859877ee5Daniel Dunbar  // FIXME: Handle environment options which effect driver behavior, somewhere
261a82318332c9e9b61d3d17371e675ca2859877ee5Daniel Dunbar  // (client?). GCC_EXEC_PREFIX, COMPILER_PATH, LIBRARY_PATH, LPATH,
262a82318332c9e9b61d3d17371e675ca2859877ee5Daniel Dunbar  // CC_PRINT_OPTIONS.
263cb881672c2c46142ec1bdfa401c9818ae805db0fDaniel Dunbar
264cb881672c2c46142ec1bdfa401c9818ae805db0fDaniel Dunbar  // FIXME: What are we going to do with -V and -b?
265cb881672c2c46142ec1bdfa401c9818ae805db0fDaniel Dunbar
266a82318332c9e9b61d3d17371e675ca2859877ee5Daniel Dunbar  // FIXME: This stuff needs to go into the Compilation, not the driver.
26753ec55215075c8f4ddd47ca6ed7d382f16beb670Daniel Dunbar  bool CCCPrintOptions = false, CCCPrintActions = false;
2680648262df75d97b464c2be0ed867da3615659785Daniel Dunbar
2697f9fc3f7ce076645cb6aefc99c64d9446caf13d6Chris Lattner  InputArgList *Args = ParseArgStrings(ArgList.slice(1));
2708477ee93c9d81d1b5fe321706ff95bcd219c744bDaniel Dunbar
2717ca7987669fcd14d91b4227a9ddcf7fdd8b1f8c2Rafael Espindola  // -no-canonical-prefixes is used very early in main.
2727ca7987669fcd14d91b4227a9ddcf7fdd8b1f8c2Rafael Espindola  Args->ClaimAllArgs(options::OPT_no_canonical_prefixes);
2737ca7987669fcd14d91b4227a9ddcf7fdd8b1f8c2Rafael Espindola
274c19a12dc3d441bec62eed55e312b76c12d6d9022Daniel Dunbar  // Ignore -pipe.
275c19a12dc3d441bec62eed55e312b76c12d6d9022Daniel Dunbar  Args->ClaimAllArgs(options::OPT_pipe);
276c19a12dc3d441bec62eed55e312b76c12d6d9022Daniel Dunbar
2778477ee93c9d81d1b5fe321706ff95bcd219c744bDaniel Dunbar  // Extract -ccc args.
278365c02f65be026f90e67a8e00e7b827cee60e228Daniel Dunbar  //
279a82318332c9e9b61d3d17371e675ca2859877ee5Daniel Dunbar  // FIXME: We need to figure out where this behavior should live. Most of it
280a82318332c9e9b61d3d17371e675ca2859877ee5Daniel Dunbar  // should be outside in the client; the parts that aren't should have proper
281a82318332c9e9b61d3d17371e675ca2859877ee5Daniel Dunbar  // options, either by introducing new ones or by overloading gcc ones like -V
282a82318332c9e9b61d3d17371e675ca2859877ee5Daniel Dunbar  // or -b.
2838477ee93c9d81d1b5fe321706ff95bcd219c744bDaniel Dunbar  CCCPrintOptions = Args->hasArg(options::OPT_ccc_print_options);
2848477ee93c9d81d1b5fe321706ff95bcd219c744bDaniel Dunbar  CCCPrintActions = Args->hasArg(options::OPT_ccc_print_phases);
2858477ee93c9d81d1b5fe321706ff95bcd219c744bDaniel Dunbar  CCCPrintBindings = Args->hasArg(options::OPT_ccc_print_bindings);
286f5431e3563a64758584906cb9e0d10719a0756ecDaniel Dunbar  CCCIsCXX = Args->hasArg(options::OPT_ccc_cxx) || CCCIsCXX;
2878477ee93c9d81d1b5fe321706ff95bcd219c744bDaniel Dunbar  CCCEcho = Args->hasArg(options::OPT_ccc_echo);
2888477ee93c9d81d1b5fe321706ff95bcd219c744bDaniel Dunbar  if (const Arg *A = Args->getLastArg(options::OPT_ccc_gcc_name))
2898477ee93c9d81d1b5fe321706ff95bcd219c744bDaniel Dunbar    CCCGenericGCCName = A->getValue(*Args);
2908477ee93c9d81d1b5fe321706ff95bcd219c744bDaniel Dunbar  CCCUseClangCXX = Args->hasFlag(options::OPT_ccc_clang_cxx,
291f5431e3563a64758584906cb9e0d10719a0756ecDaniel Dunbar                                 options::OPT_ccc_no_clang_cxx,
292f5431e3563a64758584906cb9e0d10719a0756ecDaniel Dunbar                                 CCCUseClangCXX);
2938477ee93c9d81d1b5fe321706ff95bcd219c744bDaniel Dunbar  CCCUsePCH = Args->hasFlag(options::OPT_ccc_pch_is_pch,
2948477ee93c9d81d1b5fe321706ff95bcd219c744bDaniel Dunbar                            options::OPT_ccc_pch_is_pth);
2958477ee93c9d81d1b5fe321706ff95bcd219c744bDaniel Dunbar  CCCUseClang = !Args->hasArg(options::OPT_ccc_no_clang);
2968477ee93c9d81d1b5fe321706ff95bcd219c744bDaniel Dunbar  CCCUseClangCPP = !Args->hasArg(options::OPT_ccc_no_clang_cpp);
2978477ee93c9d81d1b5fe321706ff95bcd219c744bDaniel Dunbar  if (const Arg *A = Args->getLastArg(options::OPT_ccc_clang_archs)) {
2985f9e272e632e951b1efe824cd16acb4d96077930Chris Lattner    StringRef Cur = A->getValue(*Args);
2998477ee93c9d81d1b5fe321706ff95bcd219c744bDaniel Dunbar
3008477ee93c9d81d1b5fe321706ff95bcd219c744bDaniel Dunbar    CCCClangArchs.clear();
3018477ee93c9d81d1b5fe321706ff95bcd219c744bDaniel Dunbar    while (!Cur.empty()) {
3025f9e272e632e951b1efe824cd16acb4d96077930Chris Lattner      std::pair<StringRef, StringRef> Split = Cur.split(',');
3038477ee93c9d81d1b5fe321706ff95bcd219c744bDaniel Dunbar
3048477ee93c9d81d1b5fe321706ff95bcd219c744bDaniel Dunbar      if (!Split.first.empty()) {
3058477ee93c9d81d1b5fe321706ff95bcd219c744bDaniel Dunbar        llvm::Triple::ArchType Arch =
3068477ee93c9d81d1b5fe321706ff95bcd219c744bDaniel Dunbar          llvm::Triple(Split.first, "", "").getArch();
3078477ee93c9d81d1b5fe321706ff95bcd219c744bDaniel Dunbar
308e9c7b9ef2f2054401d099dc7666a4143ef14089dDaniel Dunbar        if (Arch == llvm::Triple::UnknownArch)
309e9c7b9ef2f2054401d099dc7666a4143ef14089dDaniel Dunbar          Diag(clang::diag::err_drv_invalid_arch_name) << Split.first;
310365c02f65be026f90e67a8e00e7b827cee60e228Daniel Dunbar
3118477ee93c9d81d1b5fe321706ff95bcd219c744bDaniel Dunbar        CCCClangArchs.insert(Arch);
312a6046bec7fc835186dde134fb81aa1b7d45cd9f0Daniel Dunbar      }
3138477ee93c9d81d1b5fe321706ff95bcd219c744bDaniel Dunbar
3148477ee93c9d81d1b5fe321706ff95bcd219c744bDaniel Dunbar      Cur = Split.second;
315365c02f65be026f90e67a8e00e7b827cee60e228Daniel Dunbar    }
316365c02f65be026f90e67a8e00e7b827cee60e228Daniel Dunbar  }
3176699877c45d119ca74e4c1d7c3c9fb90e95398e1Daniel Dunbar  // FIXME: We shouldn't overwrite the default host triple here, but we have
3186699877c45d119ca74e4c1d7c3c9fb90e95398e1Daniel Dunbar  // nowhere else to put this currently.
3198477ee93c9d81d1b5fe321706ff95bcd219c744bDaniel Dunbar  if (const Arg *A = Args->getLastArg(options::OPT_ccc_host_triple))
3206699877c45d119ca74e4c1d7c3c9fb90e95398e1Daniel Dunbar    DefaultHostTriple = A->getValue(*Args);
3218477ee93c9d81d1b5fe321706ff95bcd219c744bDaniel Dunbar  if (const Arg *A = Args->getLastArg(options::OPT_ccc_install_dir))
322c4ab3493bb3048014895cf577a8f27505a83603dDaniel Dunbar    Dir = InstalledDir = A->getValue(*Args);
32309982cec0029bc495591067fa89967b6b4d1fa19Benjamin Kramer  for (arg_iterator it = Args->filtered_begin(options::OPT_B),
32409982cec0029bc495591067fa89967b6b4d1fa19Benjamin Kramer         ie = Args->filtered_end(); it != ie; ++it) {
32509982cec0029bc495591067fa89967b6b4d1fa19Benjamin Kramer    const Arg *A = *it;
32609982cec0029bc495591067fa89967b6b4d1fa19Benjamin Kramer    A->claim();
32709982cec0029bc495591067fa89967b6b4d1fa19Benjamin Kramer    PrefixDirs.push_back(A->getValue(*Args, 0));
32809982cec0029bc495591067fa89967b6b4d1fa19Benjamin Kramer  }
3298ab2bdcc4f397e100c684ede8e8ca6e226e1380aJoerg Sonnenberger  if (const Arg *A = Args->getLastArg(options::OPT__sysroot_EQ))
3308ab2bdcc4f397e100c684ede8e8ca6e226e1380aJoerg Sonnenberger    SysRoot = A->getValue(*Args);
33105e5930166333e382522b942f00d08abc6c0a28eJoerg Sonnenberger  if (Args->hasArg(options::OPT_nostdlib))
33205e5930166333e382522b942f00d08abc6c0a28eJoerg Sonnenberger    UseStdLib = false;
333365c02f65be026f90e67a8e00e7b827cee60e228Daniel Dunbar
3346699877c45d119ca74e4c1d7c3c9fb90e95398e1Daniel Dunbar  Host = GetHostInfo(DefaultHostTriple.c_str());
335cb881672c2c46142ec1bdfa401c9818ae805db0fDaniel Dunbar
336279c1dbebf37cd128f3c73c70741a6b8c35ad025Daniel Dunbar  // Perform the default argument translations.
337279c1dbebf37cd128f3c73c70741a6b8c35ad025Daniel Dunbar  DerivedArgList *TranslatedArgs = TranslateInputArgs(*Args);
338279c1dbebf37cd128f3c73c70741a6b8c35ad025Daniel Dunbar
33921549237f14505cfc2a18a06416372a36229d0ceDaniel Dunbar  // The compilation takes ownership of Args.
340279c1dbebf37cd128f3c73c70741a6b8c35ad025Daniel Dunbar  Compilation *C = new Compilation(*this, *Host->CreateToolChain(*Args), Args,
341279c1dbebf37cd128f3c73c70741a6b8c35ad025Daniel Dunbar                                   TranslatedArgs);
34221549237f14505cfc2a18a06416372a36229d0ceDaniel Dunbar
343365c02f65be026f90e67a8e00e7b827cee60e228Daniel Dunbar  // FIXME: This behavior shouldn't be here.
344365c02f65be026f90e67a8e00e7b827cee60e228Daniel Dunbar  if (CCCPrintOptions) {
345be21cd0f07726045367861d3882d18ef30f6a30cDaniel Dunbar    PrintOptions(C->getInputArgs());
34621549237f14505cfc2a18a06416372a36229d0ceDaniel Dunbar    return C;
347365c02f65be026f90e67a8e00e7b827cee60e228Daniel Dunbar  }
34853ec55215075c8f4ddd47ca6ed7d382f16beb670Daniel Dunbar
34921549237f14505cfc2a18a06416372a36229d0ceDaniel Dunbar  if (!HandleImmediateArgs(*C))
35021549237f14505cfc2a18a06416372a36229d0ceDaniel Dunbar    return C;
351cb881672c2c46142ec1bdfa401c9818ae805db0fDaniel Dunbar
352be69f6092668b0586c8729855c01ca2eea22e6feChad Rosier  // Construct the list of inputs.
353be69f6092668b0586c8729855c01ca2eea22e6feChad Rosier  InputList Inputs;
354be69f6092668b0586c8729855c01ca2eea22e6feChad Rosier  BuildInputs(C->getDefaultToolChain(), C->getArgs(), Inputs);
355be69f6092668b0586c8729855c01ca2eea22e6feChad Rosier
35674edcea3db1f85ba73ad0fede2ed5e2f096cac4bDaniel Dunbar  // Construct the list of abstract actions to perform for this compilation.
35753ec55215075c8f4ddd47ca6ed7d382f16beb670Daniel Dunbar  if (Host->useDriverDriver())
35865f7165676854bf75494f5b73a620d7237db5d41Joerg Sonnenberger    BuildUniversalActions(C->getDefaultToolChain(), C->getArgs(),
359be69f6092668b0586c8729855c01ca2eea22e6feChad Rosier                          Inputs, C->getActions());
36053ec55215075c8f4ddd47ca6ed7d382f16beb670Daniel Dunbar  else
361be69f6092668b0586c8729855c01ca2eea22e6feChad Rosier    BuildActions(C->getDefaultToolChain(), C->getArgs(), Inputs,
362be69f6092668b0586c8729855c01ca2eea22e6feChad Rosier                 C->getActions());
36353ec55215075c8f4ddd47ca6ed7d382f16beb670Daniel Dunbar
36453ec55215075c8f4ddd47ca6ed7d382f16beb670Daniel Dunbar  if (CCCPrintActions) {
36510ffa9a4887d9376e3eb3598e40523d1b58773c9Daniel Dunbar    PrintActions(*C);
36621549237f14505cfc2a18a06416372a36229d0ceDaniel Dunbar    return C;
36753ec55215075c8f4ddd47ca6ed7d382f16beb670Daniel Dunbar  }
368ab835430b4f758dd49903251c7c7f21b95933c89Daniel Dunbar
36921549237f14505cfc2a18a06416372a36229d0ceDaniel Dunbar  BuildJobs(*C);
3708d2554a2c3201aa664cbf2108cf9d57aa0aa4b0aDaniel Dunbar
3718d2554a2c3201aa664cbf2108cf9d57aa0aa4b0aDaniel Dunbar  return C;
372365c02f65be026f90e67a8e00e7b827cee60e228Daniel Dunbar}
373365c02f65be026f90e67a8e00e7b827cee60e228Daniel Dunbar
3742b81910618f63e4ce2373c926a26e76b4b91373fChad Rosier// When clang crashes, produce diagnostic information including the fully
3752b81910618f63e4ce2373c926a26e76b4b91373fChad Rosier// preprocessed source file(s).  Request that the developer attach the
3762b81910618f63e4ce2373c926a26e76b4b91373fChad Rosier// diagnostic information to a bug report.
3772b81910618f63e4ce2373c926a26e76b4b91373fChad Rosiervoid Driver::generateCompilationDiagnostics(Compilation &C,
3782b81910618f63e4ce2373c926a26e76b4b91373fChad Rosier                                            const Command *FailingCommand) {
3792b81910618f63e4ce2373c926a26e76b4b91373fChad Rosier  Diag(clang::diag::note_drv_command_failed_diag_msg)
380fc6142779f42058b4a39a29b6209a01a6de9fe7cChad Rosier    << "Please submit a bug report to " BUG_REPORT_URL " and include command"
381fc6142779f42058b4a39a29b6209a01a6de9fe7cChad Rosier    " line arguments and all diagnostic information.";
3822b81910618f63e4ce2373c926a26e76b4b91373fChad Rosier
3832b81910618f63e4ce2373c926a26e76b4b91373fChad Rosier  // Suppress driver output and emit preprocessor output to temp file.
3842b81910618f63e4ce2373c926a26e76b4b91373fChad Rosier  CCCIsCPP = true;
3852b81910618f63e4ce2373c926a26e76b4b91373fChad Rosier  CCGenDiagnostics = true;
3862b81910618f63e4ce2373c926a26e76b4b91373fChad Rosier
3872b81910618f63e4ce2373c926a26e76b4b91373fChad Rosier  // Clear stale state and suppress tool output.
3882b81910618f63e4ce2373c926a26e76b4b91373fChad Rosier  C.initCompilationForDiagnostics();
389be69f6092668b0586c8729855c01ca2eea22e6feChad Rosier  Diags.Reset();
390be69f6092668b0586c8729855c01ca2eea22e6feChad Rosier
391be69f6092668b0586c8729855c01ca2eea22e6feChad Rosier  // Construct the list of inputs.
392be69f6092668b0586c8729855c01ca2eea22e6feChad Rosier  InputList Inputs;
393be69f6092668b0586c8729855c01ca2eea22e6feChad Rosier  BuildInputs(C.getDefaultToolChain(), C.getArgs(), Inputs);
3942b81910618f63e4ce2373c926a26e76b4b91373fChad Rosier
395137a20b5f9360311dd0b6d2500e3365ab2cdf40eChad Rosier  // Remove any inputs from the input list that cannot be preprocessed.
396137a20b5f9360311dd0b6d2500e3365ab2cdf40eChad Rosier  for (InputList::iterator it = Inputs.begin(), ie = Inputs.end(); it != ie;) {
397137a20b5f9360311dd0b6d2500e3365ab2cdf40eChad Rosier    if (types::getPreprocessedType(it->first) == types::TY_INVALID) {
398137a20b5f9360311dd0b6d2500e3365ab2cdf40eChad Rosier      it = Inputs.erase(it);
399137a20b5f9360311dd0b6d2500e3365ab2cdf40eChad Rosier      ie = Inputs.end();
400137a20b5f9360311dd0b6d2500e3365ab2cdf40eChad Rosier    } else
401137a20b5f9360311dd0b6d2500e3365ab2cdf40eChad Rosier      ++it;
402137a20b5f9360311dd0b6d2500e3365ab2cdf40eChad Rosier  }
403137a20b5f9360311dd0b6d2500e3365ab2cdf40eChad Rosier  if (Inputs.empty()) {
404137a20b5f9360311dd0b6d2500e3365ab2cdf40eChad Rosier    Diag(clang::diag::note_drv_command_failed_diag_msg)
405137a20b5f9360311dd0b6d2500e3365ab2cdf40eChad Rosier      << "Error generating preprocessed source(s) - no preprocessable inputs.";
406137a20b5f9360311dd0b6d2500e3365ab2cdf40eChad Rosier    return;
407137a20b5f9360311dd0b6d2500e3365ab2cdf40eChad Rosier  }
408137a20b5f9360311dd0b6d2500e3365ab2cdf40eChad Rosier
4092b81910618f63e4ce2373c926a26e76b4b91373fChad Rosier  // Construct the list of abstract actions to perform for this compilation.
4102b81910618f63e4ce2373c926a26e76b4b91373fChad Rosier  if (Host->useDriverDriver())
4112b81910618f63e4ce2373c926a26e76b4b91373fChad Rosier    BuildUniversalActions(C.getDefaultToolChain(), C.getArgs(),
412be69f6092668b0586c8729855c01ca2eea22e6feChad Rosier                          Inputs, C.getActions());
4132b81910618f63e4ce2373c926a26e76b4b91373fChad Rosier  else
414be69f6092668b0586c8729855c01ca2eea22e6feChad Rosier    BuildActions(C.getDefaultToolChain(), C.getArgs(), Inputs,
415be69f6092668b0586c8729855c01ca2eea22e6feChad Rosier                 C.getActions());
4162b81910618f63e4ce2373c926a26e76b4b91373fChad Rosier
4172b81910618f63e4ce2373c926a26e76b4b91373fChad Rosier  BuildJobs(C);
4182b81910618f63e4ce2373c926a26e76b4b91373fChad Rosier
4192b81910618f63e4ce2373c926a26e76b4b91373fChad Rosier  // If there were errors building the compilation, quit now.
4202b81910618f63e4ce2373c926a26e76b4b91373fChad Rosier  if (Diags.hasErrorOccurred()) {
4212b81910618f63e4ce2373c926a26e76b4b91373fChad Rosier    Diag(clang::diag::note_drv_command_failed_diag_msg)
4222b81910618f63e4ce2373c926a26e76b4b91373fChad Rosier      << "Error generating preprocessed source(s).";
4232b81910618f63e4ce2373c926a26e76b4b91373fChad Rosier    return;
4242b81910618f63e4ce2373c926a26e76b4b91373fChad Rosier  }
4252b81910618f63e4ce2373c926a26e76b4b91373fChad Rosier
4262b81910618f63e4ce2373c926a26e76b4b91373fChad Rosier  // Generate preprocessed output.
4272b81910618f63e4ce2373c926a26e76b4b91373fChad Rosier  FailingCommand = 0;
4282b81910618f63e4ce2373c926a26e76b4b91373fChad Rosier  int Res = C.ExecuteJob(C.getJobs(), FailingCommand);
4292b81910618f63e4ce2373c926a26e76b4b91373fChad Rosier
4302b81910618f63e4ce2373c926a26e76b4b91373fChad Rosier  // If the command succeeded, we are done.
4312b81910618f63e4ce2373c926a26e76b4b91373fChad Rosier  if (Res == 0) {
4322b81910618f63e4ce2373c926a26e76b4b91373fChad Rosier    Diag(clang::diag::note_drv_command_failed_diag_msg)
4332b81910618f63e4ce2373c926a26e76b4b91373fChad Rosier      << "Preprocessed source(s) are located at:";
4342b81910618f63e4ce2373c926a26e76b4b91373fChad Rosier    ArgStringList Files = C.getTempFiles();
4352b81910618f63e4ce2373c926a26e76b4b91373fChad Rosier    for (ArgStringList::const_iterator it = Files.begin(), ie = Files.end();
4362b81910618f63e4ce2373c926a26e76b4b91373fChad Rosier         it != ie; ++it)
4372b81910618f63e4ce2373c926a26e76b4b91373fChad Rosier      Diag(clang::diag::note_drv_command_failed_diag_msg) << *it;
4382b81910618f63e4ce2373c926a26e76b4b91373fChad Rosier  } else {
4392b81910618f63e4ce2373c926a26e76b4b91373fChad Rosier    // Failure, remove preprocessed files.
4402b81910618f63e4ce2373c926a26e76b4b91373fChad Rosier    if (!C.getArgs().hasArg(options::OPT_save_temps))
4412b81910618f63e4ce2373c926a26e76b4b91373fChad Rosier      C.CleanupFileList(C.getTempFiles(), true);
4422b81910618f63e4ce2373c926a26e76b4b91373fChad Rosier
4432b81910618f63e4ce2373c926a26e76b4b91373fChad Rosier    Diag(clang::diag::note_drv_command_failed_diag_msg)
4442b81910618f63e4ce2373c926a26e76b4b91373fChad Rosier      << "Error generating preprocessed source(s).";
4452b81910618f63e4ce2373c926a26e76b4b91373fChad Rosier  }
4462b81910618f63e4ce2373c926a26e76b4b91373fChad Rosier}
4472b81910618f63e4ce2373c926a26e76b4b91373fChad Rosier
4482b81910618f63e4ce2373c926a26e76b4b91373fChad Rosierint Driver::ExecuteCompilation(const Compilation &C,
4492b81910618f63e4ce2373c926a26e76b4b91373fChad Rosier                               const Command *&FailingCommand) const {
450c88a88f6f7672b6bb831dce9da4acfa0c846975fDaniel Dunbar  // Just print if -### was present.
451c88a88f6f7672b6bb831dce9da4acfa0c846975fDaniel Dunbar  if (C.getArgs().hasArg(options::OPT__HASH_HASH_HASH)) {
452c88a88f6f7672b6bb831dce9da4acfa0c846975fDaniel Dunbar    C.PrintJob(llvm::errs(), C.getJobs(), "\n", true);
453c88a88f6f7672b6bb831dce9da4acfa0c846975fDaniel Dunbar    return 0;
454c88a88f6f7672b6bb831dce9da4acfa0c846975fDaniel Dunbar  }
455c88a88f6f7672b6bb831dce9da4acfa0c846975fDaniel Dunbar
456c88a88f6f7672b6bb831dce9da4acfa0c846975fDaniel Dunbar  // If there were errors building the compilation, quit now.
4572b81910618f63e4ce2373c926a26e76b4b91373fChad Rosier  if (Diags.hasErrorOccurred())
458c88a88f6f7672b6bb831dce9da4acfa0c846975fDaniel Dunbar    return 1;
459c88a88f6f7672b6bb831dce9da4acfa0c846975fDaniel Dunbar
460c88a88f6f7672b6bb831dce9da4acfa0c846975fDaniel Dunbar  int Res = C.ExecuteJob(C.getJobs(), FailingCommand);
461a82318332c9e9b61d3d17371e675ca2859877ee5Daniel Dunbar
462c88a88f6f7672b6bb831dce9da4acfa0c846975fDaniel Dunbar  // Remove temp files.
463c88a88f6f7672b6bb831dce9da4acfa0c846975fDaniel Dunbar  C.CleanupFileList(C.getTempFiles());
464c88a88f6f7672b6bb831dce9da4acfa0c846975fDaniel Dunbar
4659fcbc050a704cc5bb46e1c493940aca7c79aebf9Daniel Dunbar  // If the command succeeded, we are done.
4669fcbc050a704cc5bb46e1c493940aca7c79aebf9Daniel Dunbar  if (Res == 0)
4679fcbc050a704cc5bb46e1c493940aca7c79aebf9Daniel Dunbar    return Res;
4689fcbc050a704cc5bb46e1c493940aca7c79aebf9Daniel Dunbar
4699fcbc050a704cc5bb46e1c493940aca7c79aebf9Daniel Dunbar  // Otherwise, remove result files as well.
4709fcbc050a704cc5bb46e1c493940aca7c79aebf9Daniel Dunbar  if (!C.getArgs().hasArg(options::OPT_save_temps))
471c88a88f6f7672b6bb831dce9da4acfa0c846975fDaniel Dunbar    C.CleanupFileList(C.getResultFiles(), true);
472c88a88f6f7672b6bb831dce9da4acfa0c846975fDaniel Dunbar
473c88a88f6f7672b6bb831dce9da4acfa0c846975fDaniel Dunbar  // Print extra information about abnormal failures, if possible.
4749fcbc050a704cc5bb46e1c493940aca7c79aebf9Daniel Dunbar  //
4759fcbc050a704cc5bb46e1c493940aca7c79aebf9Daniel Dunbar  // This is ad-hoc, but we don't want to be excessively noisy. If the result
4769fcbc050a704cc5bb46e1c493940aca7c79aebf9Daniel Dunbar  // status was 1, assume the command failed normally. In particular, if it was
4779fcbc050a704cc5bb46e1c493940aca7c79aebf9Daniel Dunbar  // the compiler then assume it gave a reasonable error code. Failures in other
4789fcbc050a704cc5bb46e1c493940aca7c79aebf9Daniel Dunbar  // tools are less common, and they generally have worse diagnostics, so always
4799fcbc050a704cc5bb46e1c493940aca7c79aebf9Daniel Dunbar  // print the diagnostic there.
4809fcbc050a704cc5bb46e1c493940aca7c79aebf9Daniel Dunbar  const Tool &FailingTool = FailingCommand->getCreator();
4819fcbc050a704cc5bb46e1c493940aca7c79aebf9Daniel Dunbar
4829fcbc050a704cc5bb46e1c493940aca7c79aebf9Daniel Dunbar  if (!FailingCommand->getCreator().hasGoodDiagnostics() || Res != 1) {
4839fcbc050a704cc5bb46e1c493940aca7c79aebf9Daniel Dunbar    // FIXME: See FIXME above regarding result code interpretation.
4849fcbc050a704cc5bb46e1c493940aca7c79aebf9Daniel Dunbar    if (Res < 0)
4859fcbc050a704cc5bb46e1c493940aca7c79aebf9Daniel Dunbar      Diag(clang::diag::err_drv_command_signalled)
4869fcbc050a704cc5bb46e1c493940aca7c79aebf9Daniel Dunbar        << FailingTool.getShortName() << -Res;
4879fcbc050a704cc5bb46e1c493940aca7c79aebf9Daniel Dunbar    else
4889fcbc050a704cc5bb46e1c493940aca7c79aebf9Daniel Dunbar      Diag(clang::diag::err_drv_command_failed)
4899fcbc050a704cc5bb46e1c493940aca7c79aebf9Daniel Dunbar        << FailingTool.getShortName() << Res;
490c88a88f6f7672b6bb831dce9da4acfa0c846975fDaniel Dunbar  }
491c88a88f6f7672b6bb831dce9da4acfa0c846975fDaniel Dunbar
492c88a88f6f7672b6bb831dce9da4acfa0c846975fDaniel Dunbar  return Res;
493c88a88f6f7672b6bb831dce9da4acfa0c846975fDaniel Dunbar}
494c88a88f6f7672b6bb831dce9da4acfa0c846975fDaniel Dunbar
495d65bddcbe1385a4de212ecbbdc8919c54b3efeb0Daniel Dunbarvoid Driver::PrintOptions(const ArgList &Args) const {
4960648262df75d97b464c2be0ed867da3615659785Daniel Dunbar  unsigned i = 0;
497a82318332c9e9b61d3d17371e675ca2859877ee5Daniel Dunbar  for (ArgList::const_iterator it = Args.begin(), ie = Args.end();
4980648262df75d97b464c2be0ed867da3615659785Daniel Dunbar       it != ie; ++it, ++i) {
4990648262df75d97b464c2be0ed867da3615659785Daniel Dunbar    Arg *A = *it;
5000648262df75d97b464c2be0ed867da3615659785Daniel Dunbar    llvm::errs() << "Option " << i << " - "
5010648262df75d97b464c2be0ed867da3615659785Daniel Dunbar                 << "Name: \"" << A->getOption().getName() << "\", "
5020648262df75d97b464c2be0ed867da3615659785Daniel Dunbar                 << "Values: {";
5030648262df75d97b464c2be0ed867da3615659785Daniel Dunbar    for (unsigned j = 0; j < A->getNumValues(); ++j) {
5040648262df75d97b464c2be0ed867da3615659785Daniel Dunbar      if (j)
5050648262df75d97b464c2be0ed867da3615659785Daniel Dunbar        llvm::errs() << ", ";
50653ec55215075c8f4ddd47ca6ed7d382f16beb670Daniel Dunbar      llvm::errs() << '"' << A->getValue(Args, j) << '"';
5070648262df75d97b464c2be0ed867da3615659785Daniel Dunbar    }
5080648262df75d97b464c2be0ed867da3615659785Daniel Dunbar    llvm::errs() << "}\n";
5090648262df75d97b464c2be0ed867da3615659785Daniel Dunbar  }
5103ede8d0a7d1813f678ccc6011a99a0834b1b6116Daniel Dunbar}
511dd98e2cad165ca73c769e4f105a4e47c2216387aDaniel Dunbar
512c35d71f1e0a0c72fd43a73ddecd408bf43d501deDaniel Dunbarvoid Driver::PrintHelp(bool ShowHidden) const {
51343302d4144b5291961aa160d2fe191c09a9d8ad1Daniel Dunbar  getOpts().PrintHelp(llvm::outs(), Name.c_str(), DriverTitle.c_str(),
51443302d4144b5291961aa160d2fe191c09a9d8ad1Daniel Dunbar                      ShowHidden);
51591e28afe3503893c69afd71877f11e3bf03fa4ceDaniel Dunbar}
51691e28afe3503893c69afd71877f11e3bf03fa4ceDaniel Dunbar
5175f9e272e632e951b1efe824cd16acb4d96077930Chris Lattnervoid Driver::PrintVersion(const Compilation &C, raw_ostream &OS) const {
518a82318332c9e9b61d3d17371e675ca2859877ee5Daniel Dunbar  // FIXME: The following handlers should use a callback mechanism, we don't
519a82318332c9e9b61d3d17371e675ca2859877ee5Daniel Dunbar  // know what the client would like to do.
520a18f1b88a7ef3d2c944bb1d3b6586a2860ce2baaTed Kremenek  OS << getClangFullVersion() << '\n';
52170c8db1003af49d3627aeef41fcdd7c6c6a7df79Daniel Dunbar  const ToolChain &TC = C.getDefaultToolChain();
522793007242ba209b68ce14ec7547ac70ee981303aDaniel Dunbar  OS << "Target: " << TC.getTripleString() << '\n';
5233ee96baa3fff269e145855a6f7526c36e59a7f4bDaniel Dunbar
5243ee96baa3fff269e145855a6f7526c36e59a7f4bDaniel Dunbar  // Print the threading model.
5253ee96baa3fff269e145855a6f7526c36e59a7f4bDaniel Dunbar  //
5263ee96baa3fff269e145855a6f7526c36e59a7f4bDaniel Dunbar  // FIXME: Implement correctly.
527793007242ba209b68ce14ec7547ac70ee981303aDaniel Dunbar  OS << "Thread model: " << "posix" << '\n';
528cb881672c2c46142ec1bdfa401c9818ae805db0fDaniel Dunbar}
529cb881672c2c46142ec1bdfa401c9818ae805db0fDaniel Dunbar
530c3d26cc4eea5187ce13ed180b479ff8ef41015a7Chris Lattner/// PrintDiagnosticCategories - Implement the --print-diagnostic-categories
531c3d26cc4eea5187ce13ed180b479ff8ef41015a7Chris Lattner/// option.
5325f9e272e632e951b1efe824cd16acb4d96077930Chris Lattnerstatic void PrintDiagnosticCategories(raw_ostream &OS) {
533477aab6782795e7472055a54108d2df270ce1a89Argyrios Kyrtzidis  // Skip the empty category.
534477aab6782795e7472055a54108d2df270ce1a89Argyrios Kyrtzidis  for (unsigned i = 1, max = DiagnosticIDs::getNumberOfCategories();
535477aab6782795e7472055a54108d2df270ce1a89Argyrios Kyrtzidis       i != max; ++i)
536477aab6782795e7472055a54108d2df270ce1a89Argyrios Kyrtzidis    OS << i << ',' << DiagnosticIDs::getCategoryNameFromID(i) << '\n';
537c3d26cc4eea5187ce13ed180b479ff8ef41015a7Chris Lattner}
538c3d26cc4eea5187ce13ed180b479ff8ef41015a7Chris Lattner
53921549237f14505cfc2a18a06416372a36229d0ceDaniel Dunbarbool Driver::HandleImmediateArgs(const Compilation &C) {
540e82ec0bead14ae262cddbe958b77767a3f6aebcdDaniel Dunbar  // The order these options are handled in gcc is all over the place, but we
541a82318332c9e9b61d3d17371e675ca2859877ee5Daniel Dunbar  // don't expect inconsistencies w.r.t. that to matter in practice.
54291e28afe3503893c69afd71877f11e3bf03fa4ceDaniel Dunbar
543d829950b2b75d50fca2772a20129323a186993a5Daniel Dunbar  if (C.getArgs().hasArg(options::OPT_dumpmachine)) {
544d829950b2b75d50fca2772a20129323a186993a5Daniel Dunbar    llvm::outs() << C.getDefaultToolChain().getTripleString() << '\n';
545d829950b2b75d50fca2772a20129323a186993a5Daniel Dunbar    return false;
546d829950b2b75d50fca2772a20129323a186993a5Daniel Dunbar  }
547d829950b2b75d50fca2772a20129323a186993a5Daniel Dunbar
548e06dc219a869d73b6c9a398a2dee0aa2d4e2dcf0Daniel Dunbar  if (C.getArgs().hasArg(options::OPT_dumpversion)) {
54995a907fc0f2f717dca38a379c1d2353bfea06d4fDaniel Dunbar    // Since -dumpversion is only implemented for pedantic GCC compatibility, we
55095a907fc0f2f717dca38a379c1d2353bfea06d4fDaniel Dunbar    // return an answer which matches our definition of __VERSION__.
55195a907fc0f2f717dca38a379c1d2353bfea06d4fDaniel Dunbar    //
55295a907fc0f2f717dca38a379c1d2353bfea06d4fDaniel Dunbar    // If we want to return a more correct answer some day, then we should
55395a907fc0f2f717dca38a379c1d2353bfea06d4fDaniel Dunbar    // introduce a non-pedantically GCC compatible mode to Clang in which we
55495a907fc0f2f717dca38a379c1d2353bfea06d4fDaniel Dunbar    // provide sensible definitions for -dumpversion, __VERSION__, etc.
55595a907fc0f2f717dca38a379c1d2353bfea06d4fDaniel Dunbar    llvm::outs() << "4.2.1\n";
556e06dc219a869d73b6c9a398a2dee0aa2d4e2dcf0Daniel Dunbar    return false;
557e06dc219a869d73b6c9a398a2dee0aa2d4e2dcf0Daniel Dunbar  }
558f78925f633e949f06521d9ffd937019e59f35efcDaniel Dunbar
559c3d26cc4eea5187ce13ed180b479ff8ef41015a7Chris Lattner  if (C.getArgs().hasArg(options::OPT__print_diagnostic_categories)) {
560c3d26cc4eea5187ce13ed180b479ff8ef41015a7Chris Lattner    PrintDiagnosticCategories(llvm::outs());
561c3d26cc4eea5187ce13ed180b479ff8ef41015a7Chris Lattner    return false;
562c3d26cc4eea5187ce13ed180b479ff8ef41015a7Chris Lattner  }
563e06dc219a869d73b6c9a398a2dee0aa2d4e2dcf0Daniel Dunbar
564a82318332c9e9b61d3d17371e675ca2859877ee5Daniel Dunbar  if (C.getArgs().hasArg(options::OPT__help) ||
565c35d71f1e0a0c72fd43a73ddecd408bf43d501deDaniel Dunbar      C.getArgs().hasArg(options::OPT__help_hidden)) {
566c35d71f1e0a0c72fd43a73ddecd408bf43d501deDaniel Dunbar    PrintHelp(C.getArgs().hasArg(options::OPT__help_hidden));
56791e28afe3503893c69afd71877f11e3bf03fa4ceDaniel Dunbar    return false;
56891e28afe3503893c69afd71877f11e3bf03fa4ceDaniel Dunbar  }
56991e28afe3503893c69afd71877f11e3bf03fa4ceDaniel Dunbar
5706cc73de6ebb3eb00af7dd5149f6778318f1fb76fDaniel Dunbar  if (C.getArgs().hasArg(options::OPT__version)) {
571a82318332c9e9b61d3d17371e675ca2859877ee5Daniel Dunbar    // Follow gcc behavior and use stdout for --version and stderr for -v.
572793007242ba209b68ce14ec7547ac70ee981303aDaniel Dunbar    PrintVersion(C, llvm::outs());
5736cc73de6ebb3eb00af7dd5149f6778318f1fb76fDaniel Dunbar    return false;
5746cc73de6ebb3eb00af7dd5149f6778318f1fb76fDaniel Dunbar  }
5756cc73de6ebb3eb00af7dd5149f6778318f1fb76fDaniel Dunbar
576a82318332c9e9b61d3d17371e675ca2859877ee5Daniel Dunbar  if (C.getArgs().hasArg(options::OPT_v) ||
57721549237f14505cfc2a18a06416372a36229d0ceDaniel Dunbar      C.getArgs().hasArg(options::OPT__HASH_HASH_HASH)) {
578793007242ba209b68ce14ec7547ac70ee981303aDaniel Dunbar    PrintVersion(C, llvm::errs());
579cb881672c2c46142ec1bdfa401c9818ae805db0fDaniel Dunbar    SuppressMissingInputWarning = true;
580cb881672c2c46142ec1bdfa401c9818ae805db0fDaniel Dunbar  }
581cb881672c2c46142ec1bdfa401c9818ae805db0fDaniel Dunbar
58221549237f14505cfc2a18a06416372a36229d0ceDaniel Dunbar  const ToolChain &TC = C.getDefaultToolChain();
583ca3459e95f552cfae6c9c5fb4ed161e3a662c25eDaniel Dunbar  if (C.getArgs().hasArg(options::OPT_print_search_dirs)) {
584ca3459e95f552cfae6c9c5fb4ed161e3a662c25eDaniel Dunbar    llvm::outs() << "programs: =";
585ca3459e95f552cfae6c9c5fb4ed161e3a662c25eDaniel Dunbar    for (ToolChain::path_list::const_iterator it = TC.getProgramPaths().begin(),
586ca3459e95f552cfae6c9c5fb4ed161e3a662c25eDaniel Dunbar           ie = TC.getProgramPaths().end(); it != ie; ++it) {
587ca3459e95f552cfae6c9c5fb4ed161e3a662c25eDaniel Dunbar      if (it != TC.getProgramPaths().begin())
588ca3459e95f552cfae6c9c5fb4ed161e3a662c25eDaniel Dunbar        llvm::outs() << ':';
589ca3459e95f552cfae6c9c5fb4ed161e3a662c25eDaniel Dunbar      llvm::outs() << *it;
590ca3459e95f552cfae6c9c5fb4ed161e3a662c25eDaniel Dunbar    }
591ca3459e95f552cfae6c9c5fb4ed161e3a662c25eDaniel Dunbar    llvm::outs() << "\n";
592ca3459e95f552cfae6c9c5fb4ed161e3a662c25eDaniel Dunbar    llvm::outs() << "libraries: =";
59359c8457f01f908e75d0e61ec3bd99cebcd672ceeJoerg Sonnenberger
59459c8457f01f908e75d0e61ec3bd99cebcd672ceeJoerg Sonnenberger    std::string sysroot;
59559c8457f01f908e75d0e61ec3bd99cebcd672ceeJoerg Sonnenberger    if (Arg *A = C.getArgs().getLastArg(options::OPT__sysroot_EQ))
59659c8457f01f908e75d0e61ec3bd99cebcd672ceeJoerg Sonnenberger      sysroot = A->getValue(C.getArgs());
59759c8457f01f908e75d0e61ec3bd99cebcd672ceeJoerg Sonnenberger
598a82318332c9e9b61d3d17371e675ca2859877ee5Daniel Dunbar    for (ToolChain::path_list::const_iterator it = TC.getFilePaths().begin(),
599ca3459e95f552cfae6c9c5fb4ed161e3a662c25eDaniel Dunbar           ie = TC.getFilePaths().end(); it != ie; ++it) {
600ca3459e95f552cfae6c9c5fb4ed161e3a662c25eDaniel Dunbar      if (it != TC.getFilePaths().begin())
601ca3459e95f552cfae6c9c5fb4ed161e3a662c25eDaniel Dunbar        llvm::outs() << ':';
60259c8457f01f908e75d0e61ec3bd99cebcd672ceeJoerg Sonnenberger      const char *path = it->c_str();
60359c8457f01f908e75d0e61ec3bd99cebcd672ceeJoerg Sonnenberger      if (path[0] == '=')
60459c8457f01f908e75d0e61ec3bd99cebcd672ceeJoerg Sonnenberger        llvm::outs() << sysroot << path + 1;
60559c8457f01f908e75d0e61ec3bd99cebcd672ceeJoerg Sonnenberger      else
60659c8457f01f908e75d0e61ec3bd99cebcd672ceeJoerg Sonnenberger        llvm::outs() << path;
607ca3459e95f552cfae6c9c5fb4ed161e3a662c25eDaniel Dunbar    }
608ca3459e95f552cfae6c9c5fb4ed161e3a662c25eDaniel Dunbar    llvm::outs() << "\n";
60991e28afe3503893c69afd71877f11e3bf03fa4ceDaniel Dunbar    return false;
610ca3459e95f552cfae6c9c5fb4ed161e3a662c25eDaniel Dunbar  }
611ca3459e95f552cfae6c9c5fb4ed161e3a662c25eDaniel Dunbar
612a82318332c9e9b61d3d17371e675ca2859877ee5Daniel Dunbar  // FIXME: The following handlers should use a callback mechanism, we don't
613a82318332c9e9b61d3d17371e675ca2859877ee5Daniel Dunbar  // know what the client would like to do.
61421549237f14505cfc2a18a06416372a36229d0ceDaniel Dunbar  if (Arg *A = C.getArgs().getLastArg(options::OPT_print_file_name_EQ)) {
6155ed34f4c58b6ad4e21038d713c1fae31a6146ff5Daniel Dunbar    llvm::outs() << GetFilePath(A->getValue(C.getArgs()), TC) << "\n";
616cb881672c2c46142ec1bdfa401c9818ae805db0fDaniel Dunbar    return false;
617cb881672c2c46142ec1bdfa401c9818ae805db0fDaniel Dunbar  }
618cb881672c2c46142ec1bdfa401c9818ae805db0fDaniel Dunbar
61921549237f14505cfc2a18a06416372a36229d0ceDaniel Dunbar  if (Arg *A = C.getArgs().getLastArg(options::OPT_print_prog_name_EQ)) {
6205ed34f4c58b6ad4e21038d713c1fae31a6146ff5Daniel Dunbar    llvm::outs() << GetProgramPath(A->getValue(C.getArgs()), TC) << "\n";
621cb881672c2c46142ec1bdfa401c9818ae805db0fDaniel Dunbar    return false;
622cb881672c2c46142ec1bdfa401c9818ae805db0fDaniel Dunbar  }
623cb881672c2c46142ec1bdfa401c9818ae805db0fDaniel Dunbar
62421549237f14505cfc2a18a06416372a36229d0ceDaniel Dunbar  if (C.getArgs().hasArg(options::OPT_print_libgcc_file_name)) {
6255ed34f4c58b6ad4e21038d713c1fae31a6146ff5Daniel Dunbar    llvm::outs() << GetFilePath("libgcc.a", TC) << "\n";
626cb881672c2c46142ec1bdfa401c9818ae805db0fDaniel Dunbar    return false;
627cb881672c2c46142ec1bdfa401c9818ae805db0fDaniel Dunbar  }
628cb881672c2c46142ec1bdfa401c9818ae805db0fDaniel Dunbar
62912cfe036d809173a25af0104844d4bb66a92252bDaniel Dunbar  if (C.getArgs().hasArg(options::OPT_print_multi_lib)) {
63012cfe036d809173a25af0104844d4bb66a92252bDaniel Dunbar    // FIXME: We need tool chain support for this.
63112cfe036d809173a25af0104844d4bb66a92252bDaniel Dunbar    llvm::outs() << ".;\n";
63212cfe036d809173a25af0104844d4bb66a92252bDaniel Dunbar
63312cfe036d809173a25af0104844d4bb66a92252bDaniel Dunbar    switch (C.getDefaultToolChain().getTriple().getArch()) {
63412cfe036d809173a25af0104844d4bb66a92252bDaniel Dunbar    default:
63512cfe036d809173a25af0104844d4bb66a92252bDaniel Dunbar      break;
636a82318332c9e9b61d3d17371e675ca2859877ee5Daniel Dunbar
63712cfe036d809173a25af0104844d4bb66a92252bDaniel Dunbar    case llvm::Triple::x86_64:
63812cfe036d809173a25af0104844d4bb66a92252bDaniel Dunbar      llvm::outs() << "x86_64;@m64" << "\n";
63912cfe036d809173a25af0104844d4bb66a92252bDaniel Dunbar      break;
64012cfe036d809173a25af0104844d4bb66a92252bDaniel Dunbar
64112cfe036d809173a25af0104844d4bb66a92252bDaniel Dunbar    case llvm::Triple::ppc64:
64212cfe036d809173a25af0104844d4bb66a92252bDaniel Dunbar      llvm::outs() << "ppc64;@m64" << "\n";
64312cfe036d809173a25af0104844d4bb66a92252bDaniel Dunbar      break;
64412cfe036d809173a25af0104844d4bb66a92252bDaniel Dunbar    }
64512cfe036d809173a25af0104844d4bb66a92252bDaniel Dunbar    return false;
64612cfe036d809173a25af0104844d4bb66a92252bDaniel Dunbar  }
64712cfe036d809173a25af0104844d4bb66a92252bDaniel Dunbar
64812cfe036d809173a25af0104844d4bb66a92252bDaniel Dunbar  // FIXME: What is the difference between print-multi-directory and
64912cfe036d809173a25af0104844d4bb66a92252bDaniel Dunbar  // print-multi-os-directory?
65012cfe036d809173a25af0104844d4bb66a92252bDaniel Dunbar  if (C.getArgs().hasArg(options::OPT_print_multi_directory) ||
65112cfe036d809173a25af0104844d4bb66a92252bDaniel Dunbar      C.getArgs().hasArg(options::OPT_print_multi_os_directory)) {
65212cfe036d809173a25af0104844d4bb66a92252bDaniel Dunbar    switch (C.getDefaultToolChain().getTriple().getArch()) {
65312cfe036d809173a25af0104844d4bb66a92252bDaniel Dunbar    default:
65412cfe036d809173a25af0104844d4bb66a92252bDaniel Dunbar    case llvm::Triple::x86:
65512cfe036d809173a25af0104844d4bb66a92252bDaniel Dunbar    case llvm::Triple::ppc:
65612cfe036d809173a25af0104844d4bb66a92252bDaniel Dunbar      llvm::outs() << "." << "\n";
65712cfe036d809173a25af0104844d4bb66a92252bDaniel Dunbar      break;
658a82318332c9e9b61d3d17371e675ca2859877ee5Daniel Dunbar
65912cfe036d809173a25af0104844d4bb66a92252bDaniel Dunbar    case llvm::Triple::x86_64:
66012cfe036d809173a25af0104844d4bb66a92252bDaniel Dunbar      llvm::outs() << "x86_64" << "\n";
66112cfe036d809173a25af0104844d4bb66a92252bDaniel Dunbar      break;
66212cfe036d809173a25af0104844d4bb66a92252bDaniel Dunbar
66312cfe036d809173a25af0104844d4bb66a92252bDaniel Dunbar    case llvm::Triple::ppc64:
66412cfe036d809173a25af0104844d4bb66a92252bDaniel Dunbar      llvm::outs() << "ppc64" << "\n";
66512cfe036d809173a25af0104844d4bb66a92252bDaniel Dunbar      break;
66612cfe036d809173a25af0104844d4bb66a92252bDaniel Dunbar    }
66712cfe036d809173a25af0104844d4bb66a92252bDaniel Dunbar    return false;
66812cfe036d809173a25af0104844d4bb66a92252bDaniel Dunbar  }
66912cfe036d809173a25af0104844d4bb66a92252bDaniel Dunbar
670cb881672c2c46142ec1bdfa401c9818ae805db0fDaniel Dunbar  return true;
671cb881672c2c46142ec1bdfa401c9818ae805db0fDaniel Dunbar}
672cb881672c2c46142ec1bdfa401c9818ae805db0fDaniel Dunbar
673a82318332c9e9b61d3d17371e675ca2859877ee5Daniel Dunbarstatic unsigned PrintActions1(const Compilation &C, Action *A,
674ba1021388e6839b76c8968b931189361c7286674Daniel Dunbar                              std::map<Action*, unsigned> &Ids) {
675ba1021388e6839b76c8968b931189361c7286674Daniel Dunbar  if (Ids.count(A))
676ba1021388e6839b76c8968b931189361c7286674Daniel Dunbar    return Ids[A];
677a82318332c9e9b61d3d17371e675ca2859877ee5Daniel Dunbar
678ba1021388e6839b76c8968b931189361c7286674Daniel Dunbar  std::string str;
679ba1021388e6839b76c8968b931189361c7286674Daniel Dunbar  llvm::raw_string_ostream os(str);
680a82318332c9e9b61d3d17371e675ca2859877ee5Daniel Dunbar
681ba1021388e6839b76c8968b931189361c7286674Daniel Dunbar  os << Action::getClassName(A->getKind()) << ", ";
682a82318332c9e9b61d3d17371e675ca2859877ee5Daniel Dunbar  if (InputAction *IA = dyn_cast<InputAction>(A)) {
68310ffa9a4887d9376e3eb3598e40523d1b58773c9Daniel Dunbar    os << "\"" << IA->getInputArg().getValue(C.getArgs()) << "\"";
684ba1021388e6839b76c8968b931189361c7286674Daniel Dunbar  } else if (BindArchAction *BIA = dyn_cast<BindArchAction>(A)) {
685a82318332c9e9b61d3d17371e675ca2859877ee5Daniel Dunbar    os << '"' << (BIA->getArchName() ? BIA->getArchName() :
68610ffa9a4887d9376e3eb3598e40523d1b58773c9Daniel Dunbar                  C.getDefaultToolChain().getArchName()) << '"'
68710ffa9a4887d9376e3eb3598e40523d1b58773c9Daniel Dunbar       << ", {" << PrintActions1(C, *BIA->begin(), Ids) << "}";
688ba1021388e6839b76c8968b931189361c7286674Daniel Dunbar  } else {
689ba1021388e6839b76c8968b931189361c7286674Daniel Dunbar    os << "{";
690ba1021388e6839b76c8968b931189361c7286674Daniel Dunbar    for (Action::iterator it = A->begin(), ie = A->end(); it != ie;) {
69110ffa9a4887d9376e3eb3598e40523d1b58773c9Daniel Dunbar      os << PrintActions1(C, *it, Ids);
692ba1021388e6839b76c8968b931189361c7286674Daniel Dunbar      ++it;
693ba1021388e6839b76c8968b931189361c7286674Daniel Dunbar      if (it != ie)
694ba1021388e6839b76c8968b931189361c7286674Daniel Dunbar        os << ", ";
695ba1021388e6839b76c8968b931189361c7286674Daniel Dunbar    }
696ba1021388e6839b76c8968b931189361c7286674Daniel Dunbar    os << "}";
697ba1021388e6839b76c8968b931189361c7286674Daniel Dunbar  }
698ba1021388e6839b76c8968b931189361c7286674Daniel Dunbar
699ba1021388e6839b76c8968b931189361c7286674Daniel Dunbar  unsigned Id = Ids.size();
700ba1021388e6839b76c8968b931189361c7286674Daniel Dunbar  Ids[A] = Id;
701a82318332c9e9b61d3d17371e675ca2859877ee5Daniel Dunbar  llvm::errs() << Id << ": " << os.str() << ", "
702ba1021388e6839b76c8968b931189361c7286674Daniel Dunbar               << types::getTypeName(A->getType()) << "\n";
703ba1021388e6839b76c8968b931189361c7286674Daniel Dunbar
704ba1021388e6839b76c8968b931189361c7286674Daniel Dunbar  return Id;
705ba1021388e6839b76c8968b931189361c7286674Daniel Dunbar}
706ba1021388e6839b76c8968b931189361c7286674Daniel Dunbar
70710ffa9a4887d9376e3eb3598e40523d1b58773c9Daniel Dunbarvoid Driver::PrintActions(const Compilation &C) const {
708ba1021388e6839b76c8968b931189361c7286674Daniel Dunbar  std::map<Action*, unsigned> Ids;
709a82318332c9e9b61d3d17371e675ca2859877ee5Daniel Dunbar  for (ActionList::const_iterator it = C.getActions().begin(),
71010ffa9a4887d9376e3eb3598e40523d1b58773c9Daniel Dunbar         ie = C.getActions().end(); it != ie; ++it)
71110ffa9a4887d9376e3eb3598e40523d1b58773c9Daniel Dunbar    PrintActions1(C, *it, Ids);
71253ec55215075c8f4ddd47ca6ed7d382f16beb670Daniel Dunbar}
71353ec55215075c8f4ddd47ca6ed7d382f16beb670Daniel Dunbar
7149d0fbeadc455c8292837b738b6af315d27930637Joerg Sonnenberger/// \brief Check whether the given input tree contains any compilation or
7159d0fbeadc455c8292837b738b6af315d27930637Joerg Sonnenberger/// assembly actions.
7169d0fbeadc455c8292837b738b6af315d27930637Joerg Sonnenbergerstatic bool ContainsCompileOrAssembleAction(const Action *A) {
717b5e2f698accd4d3a1379983304a2f31ec194c332Daniel Dunbar  if (isa<CompileJobAction>(A) || isa<AssembleJobAction>(A))
718b5e2f698accd4d3a1379983304a2f31ec194c332Daniel Dunbar    return true;
719b5e2f698accd4d3a1379983304a2f31ec194c332Daniel Dunbar
720b5e2f698accd4d3a1379983304a2f31ec194c332Daniel Dunbar  for (Action::const_iterator it = A->begin(), ie = A->end(); it != ie; ++it)
7219d0fbeadc455c8292837b738b6af315d27930637Joerg Sonnenberger    if (ContainsCompileOrAssembleAction(*it))
722b5e2f698accd4d3a1379983304a2f31ec194c332Daniel Dunbar      return true;
723b5e2f698accd4d3a1379983304a2f31ec194c332Daniel Dunbar
724b5e2f698accd4d3a1379983304a2f31ec194c332Daniel Dunbar  return false;
725b5e2f698accd4d3a1379983304a2f31ec194c332Daniel Dunbar}
726b5e2f698accd4d3a1379983304a2f31ec194c332Daniel Dunbar
72774edcea3db1f85ba73ad0fede2ed5e2f096cac4bDaniel Dunbarvoid Driver::BuildUniversalActions(const ToolChain &TC,
72865f7165676854bf75494f5b73a620d7237db5d41Joerg Sonnenberger                                   const DerivedArgList &Args,
729be69f6092668b0586c8729855c01ca2eea22e6feChad Rosier                                   const InputList &BAInputs,
73021549237f14505cfc2a18a06416372a36229d0ceDaniel Dunbar                                   ActionList &Actions) const {
731a82318332c9e9b61d3d17371e675ca2859877ee5Daniel Dunbar  llvm::PrettyStackTraceString CrashInfo("Building universal build actions");
732a82318332c9e9b61d3d17371e675ca2859877ee5Daniel Dunbar  // Collect the list of architectures. Duplicates are allowed, but should only
733a82318332c9e9b61d3d17371e675ca2859877ee5Daniel Dunbar  // be handled once (in the order seen).
7341368954db9ce2989ed8f03f5c65e8ee775a5229aDaniel Dunbar  llvm::StringSet<> ArchNames;
7355f9e272e632e951b1efe824cd16acb4d96077930Chris Lattner  SmallVector<const char *, 4> Archs;
736a82318332c9e9b61d3d17371e675ca2859877ee5Daniel Dunbar  for (ArgList::const_iterator it = Args.begin(), ie = Args.end();
7372fe63e6adac0b9e5f52bcc3100b545e379417e6eDaniel Dunbar       it != ie; ++it) {
7382fe63e6adac0b9e5f52bcc3100b545e379417e6eDaniel Dunbar    Arg *A = *it;
7392fe63e6adac0b9e5f52bcc3100b545e379417e6eDaniel Dunbar
740b827a0541b5fd095fcdb7ad0c3df93ca158c619aDaniel Dunbar    if (A->getOption().matches(options::OPT_arch)) {
74136df2904354ac150500ec16238a1ec3cce4ba83eDaniel Dunbar      // Validate the option here; we don't save the type here because its
74236df2904354ac150500ec16238a1ec3cce4ba83eDaniel Dunbar      // particular spelling may participate in other driver choices.
74336df2904354ac150500ec16238a1ec3cce4ba83eDaniel Dunbar      llvm::Triple::ArchType Arch =
74436df2904354ac150500ec16238a1ec3cce4ba83eDaniel Dunbar        llvm::Triple::getArchTypeForDarwinArchName(A->getValue(Args));
74536df2904354ac150500ec16238a1ec3cce4ba83eDaniel Dunbar      if (Arch == llvm::Triple::UnknownArch) {
74636df2904354ac150500ec16238a1ec3cce4ba83eDaniel Dunbar        Diag(clang::diag::err_drv_invalid_arch_name)
74736df2904354ac150500ec16238a1ec3cce4ba83eDaniel Dunbar          << A->getAsString(Args);
74836df2904354ac150500ec16238a1ec3cce4ba83eDaniel Dunbar        continue;
74936df2904354ac150500ec16238a1ec3cce4ba83eDaniel Dunbar      }
75036df2904354ac150500ec16238a1ec3cce4ba83eDaniel Dunbar
7517587719c40ebf02bf11e5e66c30bd20e98edebc2Daniel Dunbar      A->claim();
7523f30ddf680df44e0c5c43b8db0a22166dcd7066bDaniel Dunbar      if (ArchNames.insert(A->getValue(Args)))
7533f30ddf680df44e0c5c43b8db0a22166dcd7066bDaniel Dunbar        Archs.push_back(A->getValue(Args));
7542fe63e6adac0b9e5f52bcc3100b545e379417e6eDaniel Dunbar    }
7552fe63e6adac0b9e5f52bcc3100b545e379417e6eDaniel Dunbar  }
7562fe63e6adac0b9e5f52bcc3100b545e379417e6eDaniel Dunbar
757a82318332c9e9b61d3d17371e675ca2859877ee5Daniel Dunbar  // When there is no explicit arch for this platform, make sure we still bind
758a82318332c9e9b61d3d17371e675ca2859877ee5Daniel Dunbar  // the architecture (to the default) so that -Xarch_ is handled correctly.
75910ffa9a4887d9376e3eb3598e40523d1b58773c9Daniel Dunbar  if (!Archs.size())
76010ffa9a4887d9376e3eb3598e40523d1b58773c9Daniel Dunbar    Archs.push_back(0);
7612fe63e6adac0b9e5f52bcc3100b545e379417e6eDaniel Dunbar
762a82318332c9e9b61d3d17371e675ca2859877ee5Daniel Dunbar  // FIXME: We killed off some others but these aren't yet detected in a
763a82318332c9e9b61d3d17371e675ca2859877ee5Daniel Dunbar  // functional manner. If we added information to jobs about which "auxiliary"
764a82318332c9e9b61d3d17371e675ca2859877ee5Daniel Dunbar  // files they wrote then we could detect the conflict these cause downstream.
7652fe63e6adac0b9e5f52bcc3100b545e379417e6eDaniel Dunbar  if (Archs.size() > 1) {
7662fe63e6adac0b9e5f52bcc3100b545e379417e6eDaniel Dunbar    // No recovery needed, the point of this is just to prevent
7672fe63e6adac0b9e5f52bcc3100b545e379417e6eDaniel Dunbar    // overwriting the same files.
7682fe63e6adac0b9e5f52bcc3100b545e379417e6eDaniel Dunbar    if (const Arg *A = Args.getLastArg(options::OPT_save_temps))
769a82318332c9e9b61d3d17371e675ca2859877ee5Daniel Dunbar      Diag(clang::diag::err_drv_invalid_opt_with_multiple_archs)
77038dd3d54186cf44ea9d37f463c3f2800ab526b82Daniel Dunbar        << A->getAsString(Args);
7712fe63e6adac0b9e5f52bcc3100b545e379417e6eDaniel Dunbar  }
7722fe63e6adac0b9e5f52bcc3100b545e379417e6eDaniel Dunbar
7732fe63e6adac0b9e5f52bcc3100b545e379417e6eDaniel Dunbar  ActionList SingleActions;
774be69f6092668b0586c8729855c01ca2eea22e6feChad Rosier  BuildActions(TC, Args, BAInputs, SingleActions);
7752fe63e6adac0b9e5f52bcc3100b545e379417e6eDaniel Dunbar
776be1cc3eec682ca73361edb4109a7969452d3dbebDaniel Dunbar  // Add in arch bindings for every top level action, as well as lipo and
777be1cc3eec682ca73361edb4109a7969452d3dbebDaniel Dunbar  // dsymutil steps if needed.
7782fe63e6adac0b9e5f52bcc3100b545e379417e6eDaniel Dunbar  for (unsigned i = 0, e = SingleActions.size(); i != e; ++i) {
7792fe63e6adac0b9e5f52bcc3100b545e379417e6eDaniel Dunbar    Action *Act = SingleActions[i];
7802fe63e6adac0b9e5f52bcc3100b545e379417e6eDaniel Dunbar
781a82318332c9e9b61d3d17371e675ca2859877ee5Daniel Dunbar    // Make sure we can lipo this kind of output. If not (and it is an actual
782a82318332c9e9b61d3d17371e675ca2859877ee5Daniel Dunbar    // output) then we disallow, since we can't create an output file with the
783a82318332c9e9b61d3d17371e675ca2859877ee5Daniel Dunbar    // right name without overwriting it. We could remove this oddity by just
784a82318332c9e9b61d3d17371e675ca2859877ee5Daniel Dunbar    // changing the output names to include the arch, which would also fix
7852fe63e6adac0b9e5f52bcc3100b545e379417e6eDaniel Dunbar    // -save-temps. Compatibility wins for now.
7862fe63e6adac0b9e5f52bcc3100b545e379417e6eDaniel Dunbar
7873dbd6c51bcd8a730c3fe58e29d7e0d999a94fa91Daniel Dunbar    if (Archs.size() > 1 && !types::canLipoType(Act->getType()))
7882fe63e6adac0b9e5f52bcc3100b545e379417e6eDaniel Dunbar      Diag(clang::diag::err_drv_invalid_output_with_multiple_archs)
7892fe63e6adac0b9e5f52bcc3100b545e379417e6eDaniel Dunbar        << types::getTypeName(Act->getType());
7902fe63e6adac0b9e5f52bcc3100b545e379417e6eDaniel Dunbar
7912fe63e6adac0b9e5f52bcc3100b545e379417e6eDaniel Dunbar    ActionList Inputs;
79232c1a2ae8b31f32e478c8e504ed81db8c8d25713Daniel Dunbar    for (unsigned i = 0, e = Archs.size(); i != e; ++i) {
7931368954db9ce2989ed8f03f5c65e8ee775a5229aDaniel Dunbar      Inputs.push_back(new BindArchAction(Act, Archs[i]));
79432c1a2ae8b31f32e478c8e504ed81db8c8d25713Daniel Dunbar      if (i != 0)
79532c1a2ae8b31f32e478c8e504ed81db8c8d25713Daniel Dunbar        Inputs.back()->setOwnsInputs(false);
79632c1a2ae8b31f32e478c8e504ed81db8c8d25713Daniel Dunbar    }
7972fe63e6adac0b9e5f52bcc3100b545e379417e6eDaniel Dunbar
798a82318332c9e9b61d3d17371e675ca2859877ee5Daniel Dunbar    // Lipo if necessary, we do it this way because we need to set the arch flag
799a82318332c9e9b61d3d17371e675ca2859877ee5Daniel Dunbar    // so that -Xarch_ gets overwritten.
8002fe63e6adac0b9e5f52bcc3100b545e379417e6eDaniel Dunbar    if (Inputs.size() == 1 || Act->getType() == types::TY_Nothing)
8012fe63e6adac0b9e5f52bcc3100b545e379417e6eDaniel Dunbar      Actions.append(Inputs.begin(), Inputs.end());
8022fe63e6adac0b9e5f52bcc3100b545e379417e6eDaniel Dunbar    else
8032fe63e6adac0b9e5f52bcc3100b545e379417e6eDaniel Dunbar      Actions.push_back(new LipoJobAction(Inputs, Act->getType()));
804be1cc3eec682ca73361edb4109a7969452d3dbebDaniel Dunbar
805b5e2f698accd4d3a1379983304a2f31ec194c332Daniel Dunbar    // Add a 'dsymutil' step if necessary, when debug info is enabled and we
806b5e2f698accd4d3a1379983304a2f31ec194c332Daniel Dunbar    // have a compile input. We need to run 'dsymutil' ourselves in such cases
807b5e2f698accd4d3a1379983304a2f31ec194c332Daniel Dunbar    // because the debug info will refer to a temporary object file which is
808b5e2f698accd4d3a1379983304a2f31ec194c332Daniel Dunbar    // will be removed at the end of the compilation process.
809be1cc3eec682ca73361edb4109a7969452d3dbebDaniel Dunbar    if (Act->getType() == types::TY_Image) {
810be1cc3eec682ca73361edb4109a7969452d3dbebDaniel Dunbar      Arg *A = Args.getLastArg(options::OPT_g_Group);
811be1cc3eec682ca73361edb4109a7969452d3dbebDaniel Dunbar      if (A && !A->getOption().matches(options::OPT_g0) &&
812b5e2f698accd4d3a1379983304a2f31ec194c332Daniel Dunbar          !A->getOption().matches(options::OPT_gstabs) &&
8139d0fbeadc455c8292837b738b6af315d27930637Joerg Sonnenberger          ContainsCompileOrAssembleAction(Actions.back())) {
814be1cc3eec682ca73361edb4109a7969452d3dbebDaniel Dunbar        ActionList Inputs;
815be1cc3eec682ca73361edb4109a7969452d3dbebDaniel Dunbar        Inputs.push_back(Actions.back());
816be1cc3eec682ca73361edb4109a7969452d3dbebDaniel Dunbar        Actions.pop_back();
817be1cc3eec682ca73361edb4109a7969452d3dbebDaniel Dunbar
818be1cc3eec682ca73361edb4109a7969452d3dbebDaniel Dunbar        Actions.push_back(new DsymutilJobAction(Inputs, types::TY_dSYM));
819be1cc3eec682ca73361edb4109a7969452d3dbebDaniel Dunbar      }
820be1cc3eec682ca73361edb4109a7969452d3dbebDaniel Dunbar    }
8212fe63e6adac0b9e5f52bcc3100b545e379417e6eDaniel Dunbar  }
82253ec55215075c8f4ddd47ca6ed7d382f16beb670Daniel Dunbar}
82353ec55215075c8f4ddd47ca6ed7d382f16beb670Daniel Dunbar
824be69f6092668b0586c8729855c01ca2eea22e6feChad Rosier// Construct a the list of inputs and their types.
825be69f6092668b0586c8729855c01ca2eea22e6feChad Rosiervoid Driver::BuildInputs(const ToolChain &TC, const DerivedArgList &Args,
826be69f6092668b0586c8729855c01ca2eea22e6feChad Rosier                         InputList &Inputs) const {
827a82318332c9e9b61d3d17371e675ca2859877ee5Daniel Dunbar  // Track the current user specified (-x) input. We also explicitly track the
828a82318332c9e9b61d3d17371e675ca2859877ee5Daniel Dunbar  // argument used to set the type; we only want to claim the type when we
829a82318332c9e9b61d3d17371e675ca2859877ee5Daniel Dunbar  // actually use it, so we warn about unused -x arguments.
83083dd21f6b4e6e109b893c0d42bc81e4883c342f7Daniel Dunbar  types::ID InputType = types::TY_Nothing;
83183dd21f6b4e6e109b893c0d42bc81e4883c342f7Daniel Dunbar  Arg *InputTypeArg = 0;
83283dd21f6b4e6e109b893c0d42bc81e4883c342f7Daniel Dunbar
833a82318332c9e9b61d3d17371e675ca2859877ee5Daniel Dunbar  for (ArgList::const_iterator it = Args.begin(), ie = Args.end();
83453ec55215075c8f4ddd47ca6ed7d382f16beb670Daniel Dunbar       it != ie; ++it) {
83553ec55215075c8f4ddd47ca6ed7d382f16beb670Daniel Dunbar    Arg *A = *it;
83653ec55215075c8f4ddd47ca6ed7d382f16beb670Daniel Dunbar
83753ec55215075c8f4ddd47ca6ed7d382f16beb670Daniel Dunbar    if (isa<InputOption>(A->getOption())) {
83853ec55215075c8f4ddd47ca6ed7d382f16beb670Daniel Dunbar      const char *Value = A->getValue(Args);
83953ec55215075c8f4ddd47ca6ed7d382f16beb670Daniel Dunbar      types::ID Ty = types::TY_INVALID;
84053ec55215075c8f4ddd47ca6ed7d382f16beb670Daniel Dunbar
84153ec55215075c8f4ddd47ca6ed7d382f16beb670Daniel Dunbar      // Infer the input type if necessary.
84283dd21f6b4e6e109b893c0d42bc81e4883c342f7Daniel Dunbar      if (InputType == types::TY_Nothing) {
84383dd21f6b4e6e109b893c0d42bc81e4883c342f7Daniel Dunbar        // If there was an explicit arg for this, claim it.
84483dd21f6b4e6e109b893c0d42bc81e4883c342f7Daniel Dunbar        if (InputTypeArg)
84583dd21f6b4e6e109b893c0d42bc81e4883c342f7Daniel Dunbar          InputTypeArg->claim();
84683dd21f6b4e6e109b893c0d42bc81e4883c342f7Daniel Dunbar
84753ec55215075c8f4ddd47ca6ed7d382f16beb670Daniel Dunbar        // stdin must be handled specially.
84853ec55215075c8f4ddd47ca6ed7d382f16beb670Daniel Dunbar        if (memcmp(Value, "-", 2) == 0) {
849a82318332c9e9b61d3d17371e675ca2859877ee5Daniel Dunbar          // If running with -E, treat as a C input (this changes the builtin
850a82318332c9e9b61d3d17371e675ca2859877ee5Daniel Dunbar          // macros, for example). This may be overridden by -ObjC below.
85153ec55215075c8f4ddd47ca6ed7d382f16beb670Daniel Dunbar          //
852a82318332c9e9b61d3d17371e675ca2859877ee5Daniel Dunbar          // Otherwise emit an error but still use a valid type to avoid
853a82318332c9e9b61d3d17371e675ca2859877ee5Daniel Dunbar          // spurious errors (e.g., no inputs).
8549ade4ae4fb7ed1fcbd63835d9f8f53052f0657a2Joerg Sonnenberger          if (!Args.hasArgNoClaim(options::OPT_E) && !CCCIsCPP)
855b897f5d3ebfb62c2745e2e2af7faa9920c882438Daniel Dunbar            Diag(clang::diag::err_drv_unknown_stdin_type);
85653ec55215075c8f4ddd47ca6ed7d382f16beb670Daniel Dunbar          Ty = types::TY_C;
85753ec55215075c8f4ddd47ca6ed7d382f16beb670Daniel Dunbar        } else {
8589a2927c4e6afa56ade0e5acc654f07fc658a220eJoerg Sonnenberger          // Otherwise lookup by extension.
8599a2927c4e6afa56ade0e5acc654f07fc658a220eJoerg Sonnenberger          // Fallback is C if invoked as C preprocessor or Object otherwise.
8609a2927c4e6afa56ade0e5acc654f07fc658a220eJoerg Sonnenberger          // We use a host hook here because Darwin at least has its own
861a82318332c9e9b61d3d17371e675ca2859877ee5Daniel Dunbar          // idea of what .s is.
86253ec55215075c8f4ddd47ca6ed7d382f16beb670Daniel Dunbar          if (const char *Ext = strrchr(Value, '.'))
8634180011fb8cef06adec04d30486b1bf3b99aa8b8Daniel Dunbar            Ty = TC.LookupTypeForExtension(Ext + 1);
864e33bea4ef34598e7a4a6a3a117392268998552d4Daniel Dunbar
8659a2927c4e6afa56ade0e5acc654f07fc658a220eJoerg Sonnenberger          if (Ty == types::TY_INVALID) {
8669a2927c4e6afa56ade0e5acc654f07fc658a220eJoerg Sonnenberger            if (CCCIsCPP)
8679a2927c4e6afa56ade0e5acc654f07fc658a220eJoerg Sonnenberger              Ty = types::TY_C;
8689a2927c4e6afa56ade0e5acc654f07fc658a220eJoerg Sonnenberger            else
8699a2927c4e6afa56ade0e5acc654f07fc658a220eJoerg Sonnenberger              Ty = types::TY_Object;
8709a2927c4e6afa56ade0e5acc654f07fc658a220eJoerg Sonnenberger          }
87151679c5e4828b8a64953c4f3db162ca963bf7b03Daniel Dunbar
87251679c5e4828b8a64953c4f3db162ca963bf7b03Daniel Dunbar          // If the driver is invoked as C++ compiler (like clang++ or c++) it
87351679c5e4828b8a64953c4f3db162ca963bf7b03Daniel Dunbar          // should autodetect some input files as C++ for g++ compatibility.
87451679c5e4828b8a64953c4f3db162ca963bf7b03Daniel Dunbar          if (CCCIsCXX) {
87551679c5e4828b8a64953c4f3db162ca963bf7b03Daniel Dunbar            types::ID OldTy = Ty;
87651679c5e4828b8a64953c4f3db162ca963bf7b03Daniel Dunbar            Ty = types::lookupCXXTypeForCType(Ty);
87751679c5e4828b8a64953c4f3db162ca963bf7b03Daniel Dunbar
87851679c5e4828b8a64953c4f3db162ca963bf7b03Daniel Dunbar            if (Ty != OldTy)
87951679c5e4828b8a64953c4f3db162ca963bf7b03Daniel Dunbar              Diag(clang::diag::warn_drv_treating_input_as_cxx)
88051679c5e4828b8a64953c4f3db162ca963bf7b03Daniel Dunbar                << getTypeName(OldTy) << getTypeName(Ty);
88151679c5e4828b8a64953c4f3db162ca963bf7b03Daniel Dunbar          }
88253ec55215075c8f4ddd47ca6ed7d382f16beb670Daniel Dunbar        }
88353ec55215075c8f4ddd47ca6ed7d382f16beb670Daniel Dunbar
884683ca381bf2b8dffab535c89d25250518bbec3a0Daniel Dunbar        // -ObjC and -ObjC++ override the default language, but only for "source
885683ca381bf2b8dffab535c89d25250518bbec3a0Daniel Dunbar        // files". We just treat everything that isn't a linker input as a
886683ca381bf2b8dffab535c89d25250518bbec3a0Daniel Dunbar        // source file.
887a82318332c9e9b61d3d17371e675ca2859877ee5Daniel Dunbar        //
888683ca381bf2b8dffab535c89d25250518bbec3a0Daniel Dunbar        // FIXME: Clean this up if we move the phase sequence into the type.
88953ec55215075c8f4ddd47ca6ed7d382f16beb670Daniel Dunbar        if (Ty != types::TY_Object) {
89053ec55215075c8f4ddd47ca6ed7d382f16beb670Daniel Dunbar          if (Args.hasArg(options::OPT_ObjC))
89153ec55215075c8f4ddd47ca6ed7d382f16beb670Daniel Dunbar            Ty = types::TY_ObjC;
89253ec55215075c8f4ddd47ca6ed7d382f16beb670Daniel Dunbar          else if (Args.hasArg(options::OPT_ObjCXX))
89353ec55215075c8f4ddd47ca6ed7d382f16beb670Daniel Dunbar            Ty = types::TY_ObjCXX;
89453ec55215075c8f4ddd47ca6ed7d382f16beb670Daniel Dunbar        }
89553ec55215075c8f4ddd47ca6ed7d382f16beb670Daniel Dunbar      } else {
89653ec55215075c8f4ddd47ca6ed7d382f16beb670Daniel Dunbar        assert(InputTypeArg && "InputType set w/o InputTypeArg");
89753ec55215075c8f4ddd47ca6ed7d382f16beb670Daniel Dunbar        InputTypeArg->claim();
89853ec55215075c8f4ddd47ca6ed7d382f16beb670Daniel Dunbar        Ty = InputType;
89953ec55215075c8f4ddd47ca6ed7d382f16beb670Daniel Dunbar      }
90053ec55215075c8f4ddd47ca6ed7d382f16beb670Daniel Dunbar
9013bd54cc56276c386f4d50940a9fbfcad7a69cb75Daniel Dunbar      // Check that the file exists, if enabled.
902389db16c63eec6ecfa9b235155252d8da766e94eArgyrios Kyrtzidis      if (CheckInputsExist && memcmp(Value, "-", 2) != 0) {
903256053b31e697fdf0cc48f17d621c82fc3b8dff0Michael J. Spencer        llvm::SmallString<64> Path(Value);
904389db16c63eec6ecfa9b235155252d8da766e94eArgyrios Kyrtzidis        if (Arg *WorkDir = Args.getLastArg(options::OPT_working_directory))
905256053b31e697fdf0cc48f17d621c82fc3b8dff0Michael J. Spencer          if (llvm::sys::path::is_absolute(Path.str())) {
906389db16c63eec6ecfa9b235155252d8da766e94eArgyrios Kyrtzidis            Path = WorkDir->getValue(Args);
907256053b31e697fdf0cc48f17d621c82fc3b8dff0Michael J. Spencer            llvm::sys::path::append(Path, Value);
908389db16c63eec6ecfa9b235155252d8da766e94eArgyrios Kyrtzidis          }
909389db16c63eec6ecfa9b235155252d8da766e94eArgyrios Kyrtzidis
910256053b31e697fdf0cc48f17d621c82fc3b8dff0Michael J. Spencer        bool exists = false;
911256053b31e697fdf0cc48f17d621c82fc3b8dff0Michael J. Spencer        if (/*error_code ec =*/llvm::sys::fs::exists(Value, exists) || !exists)
912389db16c63eec6ecfa9b235155252d8da766e94eArgyrios Kyrtzidis          Diag(clang::diag::err_drv_no_such_file) << Path.str();
913389db16c63eec6ecfa9b235155252d8da766e94eArgyrios Kyrtzidis        else
914389db16c63eec6ecfa9b235155252d8da766e94eArgyrios Kyrtzidis          Inputs.push_back(std::make_pair(Ty, A));
915389db16c63eec6ecfa9b235155252d8da766e94eArgyrios Kyrtzidis      } else
91653ec55215075c8f4ddd47ca6ed7d382f16beb670Daniel Dunbar        Inputs.push_back(std::make_pair(Ty, A));
91753ec55215075c8f4ddd47ca6ed7d382f16beb670Daniel Dunbar
91853ec55215075c8f4ddd47ca6ed7d382f16beb670Daniel Dunbar    } else if (A->getOption().isLinkerInput()) {
919a82318332c9e9b61d3d17371e675ca2859877ee5Daniel Dunbar      // Just treat as object type, we could make a special type for this if
920a82318332c9e9b61d3d17371e675ca2859877ee5Daniel Dunbar      // necessary.
92153ec55215075c8f4ddd47ca6ed7d382f16beb670Daniel Dunbar      Inputs.push_back(std::make_pair(types::TY_Object, A));
92253ec55215075c8f4ddd47ca6ed7d382f16beb670Daniel Dunbar
923b827a0541b5fd095fcdb7ad0c3df93ca158c619aDaniel Dunbar    } else if (A->getOption().matches(options::OPT_x)) {
924a82318332c9e9b61d3d17371e675ca2859877ee5Daniel Dunbar      InputTypeArg = A;
92553ec55215075c8f4ddd47ca6ed7d382f16beb670Daniel Dunbar      InputType = types::lookupTypeForTypeSpecifier(A->getValue(Args));
92653ec55215075c8f4ddd47ca6ed7d382f16beb670Daniel Dunbar
92753ec55215075c8f4ddd47ca6ed7d382f16beb670Daniel Dunbar      // Follow gcc behavior and treat as linker input for invalid -x
928a82318332c9e9b61d3d17371e675ca2859877ee5Daniel Dunbar      // options. Its not clear why we shouldn't just revert to unknown; but
92974cae0c64d3cf85bcfbc9e7febac83a580804d57Michael J. Spencer      // this isn't very important, we might as well be bug compatible.
93053ec55215075c8f4ddd47ca6ed7d382f16beb670Daniel Dunbar      if (!InputType) {
931b897f5d3ebfb62c2745e2e2af7faa9920c882438Daniel Dunbar        Diag(clang::diag::err_drv_unknown_language) << A->getValue(Args);
93253ec55215075c8f4ddd47ca6ed7d382f16beb670Daniel Dunbar        InputType = types::TY_Object;
93353ec55215075c8f4ddd47ca6ed7d382f16beb670Daniel Dunbar      }
93453ec55215075c8f4ddd47ca6ed7d382f16beb670Daniel Dunbar    }
93553ec55215075c8f4ddd47ca6ed7d382f16beb670Daniel Dunbar  }
9369ade4ae4fb7ed1fcbd63835d9f8f53052f0657a2Joerg Sonnenberger  if (CCCIsCPP && Inputs.empty()) {
9379ade4ae4fb7ed1fcbd63835d9f8f53052f0657a2Joerg Sonnenberger    // If called as standalone preprocessor, stdin is processed
9389ade4ae4fb7ed1fcbd63835d9f8f53052f0657a2Joerg Sonnenberger    // if no other input is present.
93965f7165676854bf75494f5b73a620d7237db5d41Joerg Sonnenberger    unsigned Index = Args.getBaseArgs().MakeIndex("-");
9409ade4ae4fb7ed1fcbd63835d9f8f53052f0657a2Joerg Sonnenberger    Arg *A = Opts->ParseOneArg(Args, Index);
9419ade4ae4fb7ed1fcbd63835d9f8f53052f0657a2Joerg Sonnenberger    A->claim();
9429ade4ae4fb7ed1fcbd63835d9f8f53052f0657a2Joerg Sonnenberger    Inputs.push_back(std::make_pair(types::TY_C, A));
9439ade4ae4fb7ed1fcbd63835d9f8f53052f0657a2Joerg Sonnenberger  }
944be69f6092668b0586c8729855c01ca2eea22e6feChad Rosier}
945be69f6092668b0586c8729855c01ca2eea22e6feChad Rosier
946be69f6092668b0586c8729855c01ca2eea22e6feChad Rosiervoid Driver::BuildActions(const ToolChain &TC, const DerivedArgList &Args,
947be69f6092668b0586c8729855c01ca2eea22e6feChad Rosier                          const InputList &Inputs, ActionList &Actions) const {
948be69f6092668b0586c8729855c01ca2eea22e6feChad Rosier  llvm::PrettyStackTraceString CrashInfo("Building compilation actions");
9499ade4ae4fb7ed1fcbd63835d9f8f53052f0657a2Joerg Sonnenberger
9508b1604ece7bf6dc2ba811cd7d8767557e55e2ec2Daniel Dunbar  if (!SuppressMissingInputWarning && Inputs.empty()) {
951af61c71137d1f7239d6b9d7425ce083db7ba31dfDaniel Dunbar    Diag(clang::diag::err_drv_no_input_files);
952af61c71137d1f7239d6b9d7425ce083db7ba31dfDaniel Dunbar    return;
953af61c71137d1f7239d6b9d7425ce083db7ba31dfDaniel Dunbar  }
954af61c71137d1f7239d6b9d7425ce083db7ba31dfDaniel Dunbar
9551fc1de48cdf9a2f241e0f2c7b9e9db2322f1b794Chad Rosier  Arg *FinalPhaseArg;
9561fc1de48cdf9a2f241e0f2c7b9e9db2322f1b794Chad Rosier  phases::ID FinalPhase = getFinalPhase(Args, &FinalPhaseArg);
957af61c71137d1f7239d6b9d7425ce083db7ba31dfDaniel Dunbar
958a82318332c9e9b61d3d17371e675ca2859877ee5Daniel Dunbar  // Reject -Z* at the top level, these options should never have been exposed
959a82318332c9e9b61d3d17371e675ca2859877ee5Daniel Dunbar  // by gcc.
960d7b88c2cb8986217f164203747d35c8f596e38c2Daniel Dunbar  if (Arg *A = Args.getLastArg(options::OPT_Z_Joined))
96138dd3d54186cf44ea9d37f463c3f2800ab526b82Daniel Dunbar    Diag(clang::diag::err_drv_use_of_Z_option) << A->getAsString(Args);
962af61c71137d1f7239d6b9d7425ce083db7ba31dfDaniel Dunbar
963ad2a9af666efdd9afe3bb5f886bcb0d1c9a0f0c3Daniel Dunbar  // Construct the actions to perform.
964ad2a9af666efdd9afe3bb5f886bcb0d1c9a0f0c3Daniel Dunbar  ActionList LinkerInputs;
96553ec55215075c8f4ddd47ca6ed7d382f16beb670Daniel Dunbar  for (unsigned i = 0, e = Inputs.size(); i != e; ++i) {
966ad2a9af666efdd9afe3bb5f886bcb0d1c9a0f0c3Daniel Dunbar    types::ID InputType = Inputs[i].first;
967ad2a9af666efdd9afe3bb5f886bcb0d1c9a0f0c3Daniel Dunbar    const Arg *InputArg = Inputs[i].second;
968ad2a9af666efdd9afe3bb5f886bcb0d1c9a0f0c3Daniel Dunbar
969ad2a9af666efdd9afe3bb5f886bcb0d1c9a0f0c3Daniel Dunbar    unsigned NumSteps = types::getNumCompilationPhases(InputType);
970ad2a9af666efdd9afe3bb5f886bcb0d1c9a0f0c3Daniel Dunbar    assert(NumSteps && "Invalid number of steps!");
971ad2a9af666efdd9afe3bb5f886bcb0d1c9a0f0c3Daniel Dunbar
972a82318332c9e9b61d3d17371e675ca2859877ee5Daniel Dunbar    // If the first step comes after the final phase we are doing as part of
973a82318332c9e9b61d3d17371e675ca2859877ee5Daniel Dunbar    // this compilation, warn the user about it.
974ad2a9af666efdd9afe3bb5f886bcb0d1c9a0f0c3Daniel Dunbar    phases::ID InitialPhase = types::getCompilationPhase(InputType, 0);
975ad2a9af666efdd9afe3bb5f886bcb0d1c9a0f0c3Daniel Dunbar    if (InitialPhase > FinalPhase) {
97605494a78c3746a360e81fc1d1797ce52df415b54Daniel Dunbar      // Claim here to avoid the more general unused warning.
97705494a78c3746a360e81fc1d1797ce52df415b54Daniel Dunbar      InputArg->claim();
978634b24563be901f8adc37c07ffba3eeac1f1d4ccDaniel Dunbar
97932c8cb66af6192adb82fe39779b460b605fa14edDaniel Dunbar      // Suppress all unused style warnings with -Qunused-arguments
98032c8cb66af6192adb82fe39779b460b605fa14edDaniel Dunbar      if (Args.hasArg(options::OPT_Qunused_arguments))
98132c8cb66af6192adb82fe39779b460b605fa14edDaniel Dunbar        continue;
98232c8cb66af6192adb82fe39779b460b605fa14edDaniel Dunbar
983634b24563be901f8adc37c07ffba3eeac1f1d4ccDaniel Dunbar      // Special case '-E' warning on a previously preprocessed file to make
984634b24563be901f8adc37c07ffba3eeac1f1d4ccDaniel Dunbar      // more sense.
985634b24563be901f8adc37c07ffba3eeac1f1d4ccDaniel Dunbar      if (InitialPhase == phases::Compile && FinalPhase == phases::Preprocess &&
986634b24563be901f8adc37c07ffba3eeac1f1d4ccDaniel Dunbar          getPreprocessedType(InputType) == types::TY_INVALID)
987634b24563be901f8adc37c07ffba3eeac1f1d4ccDaniel Dunbar        Diag(clang::diag::warn_drv_preprocessed_input_file_unused)
988634b24563be901f8adc37c07ffba3eeac1f1d4ccDaniel Dunbar          << InputArg->getAsString(Args)
989634b24563be901f8adc37c07ffba3eeac1f1d4ccDaniel Dunbar          << FinalPhaseArg->getOption().getName();
990634b24563be901f8adc37c07ffba3eeac1f1d4ccDaniel Dunbar      else
991634b24563be901f8adc37c07ffba3eeac1f1d4ccDaniel Dunbar        Diag(clang::diag::warn_drv_input_file_unused)
992634b24563be901f8adc37c07ffba3eeac1f1d4ccDaniel Dunbar          << InputArg->getAsString(Args)
993634b24563be901f8adc37c07ffba3eeac1f1d4ccDaniel Dunbar          << getPhaseName(InitialPhase)
994634b24563be901f8adc37c07ffba3eeac1f1d4ccDaniel Dunbar          << FinalPhaseArg->getOption().getName();
995ad2a9af666efdd9afe3bb5f886bcb0d1c9a0f0c3Daniel Dunbar      continue;
996ad2a9af666efdd9afe3bb5f886bcb0d1c9a0f0c3Daniel Dunbar    }
997a82318332c9e9b61d3d17371e675ca2859877ee5Daniel Dunbar
998ad2a9af666efdd9afe3bb5f886bcb0d1c9a0f0c3Daniel Dunbar    // Build the pipeline for this file.
9994d7b14734f2285695dcec347f8718b512093390aTed Kremenek    llvm::OwningPtr<Action> Current(new InputAction(*InputArg, InputType));
1000ad2a9af666efdd9afe3bb5f886bcb0d1c9a0f0c3Daniel Dunbar    for (unsigned i = 0; i != NumSteps; ++i) {
1001ad2a9af666efdd9afe3bb5f886bcb0d1c9a0f0c3Daniel Dunbar      phases::ID Phase = types::getCompilationPhase(InputType, i);
1002ad2a9af666efdd9afe3bb5f886bcb0d1c9a0f0c3Daniel Dunbar
1003ad2a9af666efdd9afe3bb5f886bcb0d1c9a0f0c3Daniel Dunbar      // We are done if this step is past what the user requested.
1004ad2a9af666efdd9afe3bb5f886bcb0d1c9a0f0c3Daniel Dunbar      if (Phase > FinalPhase)
1005ad2a9af666efdd9afe3bb5f886bcb0d1c9a0f0c3Daniel Dunbar        break;
1006ad2a9af666efdd9afe3bb5f886bcb0d1c9a0f0c3Daniel Dunbar
1007ad2a9af666efdd9afe3bb5f886bcb0d1c9a0f0c3Daniel Dunbar      // Queue linker inputs.
1008ad2a9af666efdd9afe3bb5f886bcb0d1c9a0f0c3Daniel Dunbar      if (Phase == phases::Link) {
1009ad2a9af666efdd9afe3bb5f886bcb0d1c9a0f0c3Daniel Dunbar        assert(i + 1 == NumSteps && "linking must be final compilation step.");
10104d7b14734f2285695dcec347f8718b512093390aTed Kremenek        LinkerInputs.push_back(Current.take());
1011ad2a9af666efdd9afe3bb5f886bcb0d1c9a0f0c3Daniel Dunbar        break;
1012ad2a9af666efdd9afe3bb5f886bcb0d1c9a0f0c3Daniel Dunbar      }
1013ad2a9af666efdd9afe3bb5f886bcb0d1c9a0f0c3Daniel Dunbar
1014a82318332c9e9b61d3d17371e675ca2859877ee5Daniel Dunbar      // Some types skip the assembler phase (e.g., llvm-bc), but we can't
1015a82318332c9e9b61d3d17371e675ca2859877ee5Daniel Dunbar      // encode this in the steps because the intermediate type depends on
1016a82318332c9e9b61d3d17371e675ca2859877ee5Daniel Dunbar      // arguments. Just special case here.
1017337a6271b98c4c183f7eaad1563a75260b4f2871Daniel Dunbar      if (Phase == phases::Assemble && Current->getType() != types::TY_PP_Asm)
1018337a6271b98c4c183f7eaad1563a75260b4f2871Daniel Dunbar        continue;
1019337a6271b98c4c183f7eaad1563a75260b4f2871Daniel Dunbar
1020ad2a9af666efdd9afe3bb5f886bcb0d1c9a0f0c3Daniel Dunbar      // Otherwise construct the appropriate action.
10214d7b14734f2285695dcec347f8718b512093390aTed Kremenek      Current.reset(ConstructPhaseAction(Args, Phase, Current.take()));
1022ad2a9af666efdd9afe3bb5f886bcb0d1c9a0f0c3Daniel Dunbar      if (Current->getType() == types::TY_Nothing)
1023ad2a9af666efdd9afe3bb5f886bcb0d1c9a0f0c3Daniel Dunbar        break;
1024ad2a9af666efdd9afe3bb5f886bcb0d1c9a0f0c3Daniel Dunbar    }
1025ad2a9af666efdd9afe3bb5f886bcb0d1c9a0f0c3Daniel Dunbar
1026ad2a9af666efdd9afe3bb5f886bcb0d1c9a0f0c3Daniel Dunbar    // If we ended with something, add to the output list.
1027ad2a9af666efdd9afe3bb5f886bcb0d1c9a0f0c3Daniel Dunbar    if (Current)
10284d7b14734f2285695dcec347f8718b512093390aTed Kremenek      Actions.push_back(Current.take());
102953ec55215075c8f4ddd47ca6ed7d382f16beb670Daniel Dunbar  }
1030ad2a9af666efdd9afe3bb5f886bcb0d1c9a0f0c3Daniel Dunbar
1031ad2a9af666efdd9afe3bb5f886bcb0d1c9a0f0c3Daniel Dunbar  // Add a link action if necessary.
1032ad2a9af666efdd9afe3bb5f886bcb0d1c9a0f0c3Daniel Dunbar  if (!LinkerInputs.empty())
1033ad2a9af666efdd9afe3bb5f886bcb0d1c9a0f0c3Daniel Dunbar    Actions.push_back(new LinkJobAction(LinkerInputs, types::TY_Image));
1034f3601388f234f70778e3023018dfe57b64cf4043Daniel Dunbar
1035f3601388f234f70778e3023018dfe57b64cf4043Daniel Dunbar  // If we are linking, claim any options which are obviously only used for
1036f3601388f234f70778e3023018dfe57b64cf4043Daniel Dunbar  // compilation.
1037f3601388f234f70778e3023018dfe57b64cf4043Daniel Dunbar  if (FinalPhase == phases::Link)
1038f3601388f234f70778e3023018dfe57b64cf4043Daniel Dunbar    Args.ClaimAllArgs(options::OPT_CompileOnly_Group);
1039ad2a9af666efdd9afe3bb5f886bcb0d1c9a0f0c3Daniel Dunbar}
1040ad2a9af666efdd9afe3bb5f886bcb0d1c9a0f0c3Daniel Dunbar
1041ad2a9af666efdd9afe3bb5f886bcb0d1c9a0f0c3Daniel DunbarAction *Driver::ConstructPhaseAction(const ArgList &Args, phases::ID Phase,
1042ad2a9af666efdd9afe3bb5f886bcb0d1c9a0f0c3Daniel Dunbar                                     Action *Input) const {
10438f25c79e59d88df41c5a3cabba1c58035d384a6eDaniel Dunbar  llvm::PrettyStackTraceString CrashInfo("Constructing phase actions");
1044ad2a9af666efdd9afe3bb5f886bcb0d1c9a0f0c3Daniel Dunbar  // Build the appropriate action.
1045ad2a9af666efdd9afe3bb5f886bcb0d1c9a0f0c3Daniel Dunbar  switch (Phase) {
1046ad2a9af666efdd9afe3bb5f886bcb0d1c9a0f0c3Daniel Dunbar  case phases::Link: assert(0 && "link action invalid here.");
1047ad2a9af666efdd9afe3bb5f886bcb0d1c9a0f0c3Daniel Dunbar  case phases::Preprocess: {
1048cd8e4c44dd068956e9181381be3ee2d49a0fac52Daniel Dunbar    types::ID OutputTy;
1049cd8e4c44dd068956e9181381be3ee2d49a0fac52Daniel Dunbar    // -{M, MM} alter the output type.
10509eb93b07ea913e7ad0bcd15bd3e3662e2760c323Daniel Dunbar    if (Args.hasArg(options::OPT_M, options::OPT_MM)) {
1051cd8e4c44dd068956e9181381be3ee2d49a0fac52Daniel Dunbar      OutputTy = types::TY_Dependencies;
1052cd8e4c44dd068956e9181381be3ee2d49a0fac52Daniel Dunbar    } else {
1053cd8e4c44dd068956e9181381be3ee2d49a0fac52Daniel Dunbar      OutputTy = types::getPreprocessedType(Input->getType());
1054cd8e4c44dd068956e9181381be3ee2d49a0fac52Daniel Dunbar      assert(OutputTy != types::TY_INVALID &&
1055cd8e4c44dd068956e9181381be3ee2d49a0fac52Daniel Dunbar             "Cannot preprocess this input type!");
1056cd8e4c44dd068956e9181381be3ee2d49a0fac52Daniel Dunbar    }
1057ad2a9af666efdd9afe3bb5f886bcb0d1c9a0f0c3Daniel Dunbar    return new PreprocessJobAction(Input, OutputTy);
1058ad2a9af666efdd9afe3bb5f886bcb0d1c9a0f0c3Daniel Dunbar  }
1059ad2a9af666efdd9afe3bb5f886bcb0d1c9a0f0c3Daniel Dunbar  case phases::Precompile:
1060a82318332c9e9b61d3d17371e675ca2859877ee5Daniel Dunbar    return new PrecompileJobAction(Input, types::TY_PCH);
1061ad2a9af666efdd9afe3bb5f886bcb0d1c9a0f0c3Daniel Dunbar  case phases::Compile: {
1062ad2a9af666efdd9afe3bb5f886bcb0d1c9a0f0c3Daniel Dunbar    if (Args.hasArg(options::OPT_fsyntax_only)) {
1063ad2a9af666efdd9afe3bb5f886bcb0d1c9a0f0c3Daniel Dunbar      return new CompileJobAction(Input, types::TY_Nothing);
106464952508c2b0c8bffb45c8b410f0af3d2457f59bDaniel Dunbar    } else if (Args.hasArg(options::OPT_rewrite_objc)) {
106564952508c2b0c8bffb45c8b410f0af3d2457f59bDaniel Dunbar      return new CompileJobAction(Input, types::TY_RewrittenObjC);
106663be57a832b2dab70592d1d9b37a5cd9a627356eDaniel Dunbar    } else if (Args.hasArg(options::OPT__analyze, options::OPT__analyze_auto)) {
1067ad2a9af666efdd9afe3bb5f886bcb0d1c9a0f0c3Daniel Dunbar      return new AnalyzeJobAction(Input, types::TY_Plist);
10685915fbf310e171c4cd3c2af05e9de360c0fa988aDaniel Dunbar    } else if (Args.hasArg(options::OPT_emit_ast)) {
10695915fbf310e171c4cd3c2af05e9de360c0fa988aDaniel Dunbar      return new CompileJobAction(Input, types::TY_AST);
1070ed798951b46555946c95cb76568ea3cf0b16c9abDaniel Dunbar    } else if (IsUsingLTO(Args)) {
1071a82318332c9e9b61d3d17371e675ca2859877ee5Daniel Dunbar      types::ID Output =
10726c6424bc0d3b5f080a97b5f6ef4a8d70c38e38f5Daniel Dunbar        Args.hasArg(options::OPT_S) ? types::TY_LTO_IR : types::TY_LTO_BC;
1073ad2a9af666efdd9afe3bb5f886bcb0d1c9a0f0c3Daniel Dunbar      return new CompileJobAction(Input, Output);
1074ad2a9af666efdd9afe3bb5f886bcb0d1c9a0f0c3Daniel Dunbar    } else {
1075ad2a9af666efdd9afe3bb5f886bcb0d1c9a0f0c3Daniel Dunbar      return new CompileJobAction(Input, types::TY_PP_Asm);
1076ad2a9af666efdd9afe3bb5f886bcb0d1c9a0f0c3Daniel Dunbar    }
1077ad2a9af666efdd9afe3bb5f886bcb0d1c9a0f0c3Daniel Dunbar  }
1078ad2a9af666efdd9afe3bb5f886bcb0d1c9a0f0c3Daniel Dunbar  case phases::Assemble:
1079ad2a9af666efdd9afe3bb5f886bcb0d1c9a0f0c3Daniel Dunbar    return new AssembleJobAction(Input, types::TY_Object);
1080ad2a9af666efdd9afe3bb5f886bcb0d1c9a0f0c3Daniel Dunbar  }
1081ad2a9af666efdd9afe3bb5f886bcb0d1c9a0f0c3Daniel Dunbar
1082ad2a9af666efdd9afe3bb5f886bcb0d1c9a0f0c3Daniel Dunbar  assert(0 && "invalid phase in ConstructPhaseAction");
1083ad2a9af666efdd9afe3bb5f886bcb0d1c9a0f0c3Daniel Dunbar  return 0;
108453ec55215075c8f4ddd47ca6ed7d382f16beb670Daniel Dunbar}
108553ec55215075c8f4ddd47ca6ed7d382f16beb670Daniel Dunbar
1086ed798951b46555946c95cb76568ea3cf0b16c9abDaniel Dunbarbool Driver::IsUsingLTO(const ArgList &Args) const {
1087ed798951b46555946c95cb76568ea3cf0b16c9abDaniel Dunbar  // Check for -emit-llvm or -flto.
1088ed798951b46555946c95cb76568ea3cf0b16c9abDaniel Dunbar  if (Args.hasArg(options::OPT_emit_llvm) ||
1089ed798951b46555946c95cb76568ea3cf0b16c9abDaniel Dunbar      Args.hasFlag(options::OPT_flto, options::OPT_fno_lto, false))
1090ed798951b46555946c95cb76568ea3cf0b16c9abDaniel Dunbar    return true;
1091ed798951b46555946c95cb76568ea3cf0b16c9abDaniel Dunbar
1092ed798951b46555946c95cb76568ea3cf0b16c9abDaniel Dunbar  // Check for -O4.
1093ed798951b46555946c95cb76568ea3cf0b16c9abDaniel Dunbar  if (const Arg *A = Args.getLastArg(options::OPT_O_Group))
1094ed798951b46555946c95cb76568ea3cf0b16c9abDaniel Dunbar      return A->getOption().matches(options::OPT_O4);
1095ed798951b46555946c95cb76568ea3cf0b16c9abDaniel Dunbar
1096ed798951b46555946c95cb76568ea3cf0b16c9abDaniel Dunbar  return false;
1097ed798951b46555946c95cb76568ea3cf0b16c9abDaniel Dunbar}
1098ed798951b46555946c95cb76568ea3cf0b16c9abDaniel Dunbar
109921549237f14505cfc2a18a06416372a36229d0ceDaniel Dunbarvoid Driver::BuildJobs(Compilation &C) const {
11008f25c79e59d88df41c5a3cabba1c58035d384a6eDaniel Dunbar  llvm::PrettyStackTraceString CrashInfo("Building compilation jobs");
1101f353c8cc2ee1cc16ff194b399a8d951f707fb129Daniel Dunbar
1102f353c8cc2ee1cc16ff194b399a8d951f707fb129Daniel Dunbar  Arg *FinalOutput = C.getArgs().getLastArg(options::OPT_o);
1103f353c8cc2ee1cc16ff194b399a8d951f707fb129Daniel Dunbar
1104a82318332c9e9b61d3d17371e675ca2859877ee5Daniel Dunbar  // It is an error to provide a -o option if we are making multiple output
1105a82318332c9e9b61d3d17371e675ca2859877ee5Daniel Dunbar  // files.
1106f353c8cc2ee1cc16ff194b399a8d951f707fb129Daniel Dunbar  if (FinalOutput) {
1107f353c8cc2ee1cc16ff194b399a8d951f707fb129Daniel Dunbar    unsigned NumOutputs = 0;
1108a82318332c9e9b61d3d17371e675ca2859877ee5Daniel Dunbar    for (ActionList::const_iterator it = C.getActions().begin(),
110921549237f14505cfc2a18a06416372a36229d0ceDaniel Dunbar           ie = C.getActions().end(); it != ie; ++it)
1110f353c8cc2ee1cc16ff194b399a8d951f707fb129Daniel Dunbar      if ((*it)->getType() != types::TY_Nothing)
1111f353c8cc2ee1cc16ff194b399a8d951f707fb129Daniel Dunbar        ++NumOutputs;
1112a82318332c9e9b61d3d17371e675ca2859877ee5Daniel Dunbar
1113f353c8cc2ee1cc16ff194b399a8d951f707fb129Daniel Dunbar    if (NumOutputs > 1) {
1114f353c8cc2ee1cc16ff194b399a8d951f707fb129Daniel Dunbar      Diag(clang::diag::err_drv_output_argument_with_multiple_files);
1115f353c8cc2ee1cc16ff194b399a8d951f707fb129Daniel Dunbar      FinalOutput = 0;
1116f353c8cc2ee1cc16ff194b399a8d951f707fb129Daniel Dunbar    }
1117f353c8cc2ee1cc16ff194b399a8d951f707fb129Daniel Dunbar  }
1118f353c8cc2ee1cc16ff194b399a8d951f707fb129Daniel Dunbar
1119a82318332c9e9b61d3d17371e675ca2859877ee5Daniel Dunbar  for (ActionList::const_iterator it = C.getActions().begin(),
112021549237f14505cfc2a18a06416372a36229d0ceDaniel Dunbar         ie = C.getActions().end(); it != ie; ++it) {
1121f353c8cc2ee1cc16ff194b399a8d951f707fb129Daniel Dunbar    Action *A = *it;
1122f353c8cc2ee1cc16ff194b399a8d951f707fb129Daniel Dunbar
1123a82318332c9e9b61d3d17371e675ca2859877ee5Daniel Dunbar    // If we are linking an image for multiple archs then the linker wants
1124a82318332c9e9b61d3d17371e675ca2859877ee5Daniel Dunbar    // -arch_multiple and -final_output <final image name>. Unfortunately, this
1125a82318332c9e9b61d3d17371e675ca2859877ee5Daniel Dunbar    // doesn't fit in cleanly because we have to pass this information down.
1126f353c8cc2ee1cc16ff194b399a8d951f707fb129Daniel Dunbar    //
1127a82318332c9e9b61d3d17371e675ca2859877ee5Daniel Dunbar    // FIXME: This is a hack; find a cleaner way to integrate this into the
1128a82318332c9e9b61d3d17371e675ca2859877ee5Daniel Dunbar    // process.
1129f353c8cc2ee1cc16ff194b399a8d951f707fb129Daniel Dunbar    const char *LinkingOutput = 0;
1130d7b88c2cb8986217f164203747d35c8f596e38c2Daniel Dunbar    if (isa<LipoJobAction>(A)) {
1131f353c8cc2ee1cc16ff194b399a8d951f707fb129Daniel Dunbar      if (FinalOutput)
1132f353c8cc2ee1cc16ff194b399a8d951f707fb129Daniel Dunbar        LinkingOutput = FinalOutput->getValue(C.getArgs());
1133f353c8cc2ee1cc16ff194b399a8d951f707fb129Daniel Dunbar      else
1134f353c8cc2ee1cc16ff194b399a8d951f707fb129Daniel Dunbar        LinkingOutput = DefaultImageName.c_str();
1135f353c8cc2ee1cc16ff194b399a8d951f707fb129Daniel Dunbar    }
1136f353c8cc2ee1cc16ff194b399a8d951f707fb129Daniel Dunbar
1137f353c8cc2ee1cc16ff194b399a8d951f707fb129Daniel Dunbar    InputInfo II;
1138a82318332c9e9b61d3d17371e675ca2859877ee5Daniel Dunbar    BuildJobsForAction(C, A, &C.getDefaultToolChain(),
11394954018954bbc97363eef02d0c83bea19ce9b329Daniel Dunbar                       /*BoundArch*/0,
1140f353c8cc2ee1cc16ff194b399a8d951f707fb129Daniel Dunbar                       /*AtTopLevel*/ true,
1141f353c8cc2ee1cc16ff194b399a8d951f707fb129Daniel Dunbar                       /*LinkingOutput*/ LinkingOutput,
1142f353c8cc2ee1cc16ff194b399a8d951f707fb129Daniel Dunbar                       II);
1143f353c8cc2ee1cc16ff194b399a8d951f707fb129Daniel Dunbar  }
1144586dc233bb88f2920c9f3638f69cef0ccd55dcedDaniel Dunbar
1145a82318332c9e9b61d3d17371e675ca2859877ee5Daniel Dunbar  // If the user passed -Qunused-arguments or there were errors, don't warn
1146a82318332c9e9b61d3d17371e675ca2859877ee5Daniel Dunbar  // about any unused arguments.
1147be3aab6abe5e66bb86596da806acc49614eacb69Argyrios Kyrtzidis  if (Diags.hasErrorOccurred() ||
11481e23f5f963dd6a3cee43ace77578161798e41e2dDaniel Dunbar      C.getArgs().hasArg(options::OPT_Qunused_arguments))
1149af2e4baa2a75471e820030701225a1ca02c7308fDaniel Dunbar    return;
1150af2e4baa2a75471e820030701225a1ca02c7308fDaniel Dunbar
1151a2094e76fc545b9e17c851c3d2c46b719c5f17ebDaniel Dunbar  // Claim -### here.
1152a2094e76fc545b9e17c851c3d2c46b719c5f17ebDaniel Dunbar  (void) C.getArgs().hasArg(options::OPT__HASH_HASH_HASH);
1153a82318332c9e9b61d3d17371e675ca2859877ee5Daniel Dunbar
1154586dc233bb88f2920c9f3638f69cef0ccd55dcedDaniel Dunbar  for (ArgList::const_iterator it = C.getArgs().begin(), ie = C.getArgs().end();
1155586dc233bb88f2920c9f3638f69cef0ccd55dcedDaniel Dunbar       it != ie; ++it) {
1156586dc233bb88f2920c9f3638f69cef0ccd55dcedDaniel Dunbar    Arg *A = *it;
1157a82318332c9e9b61d3d17371e675ca2859877ee5Daniel Dunbar
1158586dc233bb88f2920c9f3638f69cef0ccd55dcedDaniel Dunbar    // FIXME: It would be nice to be able to send the argument to the
1159a82318332c9e9b61d3d17371e675ca2859877ee5Daniel Dunbar    // Diagnostic, so that extra values, position, and so on could be printed.
11604f53b298846d720fbb906373f3f28d92f2121f35Daniel Dunbar    if (!A->isClaimed()) {
11611e23f5f963dd6a3cee43ace77578161798e41e2dDaniel Dunbar      if (A->getOption().hasNoArgumentUnused())
11621e23f5f963dd6a3cee43ace77578161798e41e2dDaniel Dunbar        continue;
11631e23f5f963dd6a3cee43ace77578161798e41e2dDaniel Dunbar
1164a82318332c9e9b61d3d17371e675ca2859877ee5Daniel Dunbar      // Suppress the warning automatically if this is just a flag, and it is an
1165a82318332c9e9b61d3d17371e675ca2859877ee5Daniel Dunbar      // instance of an argument we already claimed.
11664f53b298846d720fbb906373f3f28d92f2121f35Daniel Dunbar      const Option &Opt = A->getOption();
11674f53b298846d720fbb906373f3f28d92f2121f35Daniel Dunbar      if (isa<FlagOption>(Opt)) {
11684f53b298846d720fbb906373f3f28d92f2121f35Daniel Dunbar        bool DuplicateClaimed = false;
11694f53b298846d720fbb906373f3f28d92f2121f35Daniel Dunbar
1170cdd9686b890ebdc10039ae256ef4c9dfb5ebacb7Daniel Dunbar        for (arg_iterator it = C.getArgs().filtered_begin(&Opt),
1171cdd9686b890ebdc10039ae256ef4c9dfb5ebacb7Daniel Dunbar               ie = C.getArgs().filtered_end(); it != ie; ++it) {
1172cdd9686b890ebdc10039ae256ef4c9dfb5ebacb7Daniel Dunbar          if ((*it)->isClaimed()) {
11734f53b298846d720fbb906373f3f28d92f2121f35Daniel Dunbar            DuplicateClaimed = true;
11744f53b298846d720fbb906373f3f28d92f2121f35Daniel Dunbar            break;
11754f53b298846d720fbb906373f3f28d92f2121f35Daniel Dunbar          }
11764f53b298846d720fbb906373f3f28d92f2121f35Daniel Dunbar        }
11774f53b298846d720fbb906373f3f28d92f2121f35Daniel Dunbar
11784f53b298846d720fbb906373f3f28d92f2121f35Daniel Dunbar        if (DuplicateClaimed)
11794f53b298846d720fbb906373f3f28d92f2121f35Daniel Dunbar          continue;
11804f53b298846d720fbb906373f3f28d92f2121f35Daniel Dunbar      }
11814f53b298846d720fbb906373f3f28d92f2121f35Daniel Dunbar
1182a82318332c9e9b61d3d17371e675ca2859877ee5Daniel Dunbar      Diag(clang::diag::warn_drv_unused_argument)
118338dd3d54186cf44ea9d37f463c3f2800ab526b82Daniel Dunbar        << A->getAsString(C.getArgs());
11844f53b298846d720fbb906373f3f28d92f2121f35Daniel Dunbar    }
1185586dc233bb88f2920c9f3638f69cef0ccd55dcedDaniel Dunbar  }
118657b704d8d8f49bcaf856a3e37941d5ac6456eb50Daniel Dunbar}
118757b704d8d8f49bcaf856a3e37941d5ac6456eb50Daniel Dunbar
11888767cbc475ed96397b6f08617814eeb9cab121bdDaniel Dunbarstatic const Tool &SelectToolForJob(Compilation &C, const ToolChain *TC,
11898767cbc475ed96397b6f08617814eeb9cab121bdDaniel Dunbar                                    const JobAction *JA,
11908767cbc475ed96397b6f08617814eeb9cab121bdDaniel Dunbar                                    const ActionList *&Inputs) {
11918767cbc475ed96397b6f08617814eeb9cab121bdDaniel Dunbar  const Tool *ToolForJob = 0;
11928767cbc475ed96397b6f08617814eeb9cab121bdDaniel Dunbar
11938767cbc475ed96397b6f08617814eeb9cab121bdDaniel Dunbar  // See if we should look for a compiler with an integrated assembler. We match
11948767cbc475ed96397b6f08617814eeb9cab121bdDaniel Dunbar  // bottom up, so what we are actually looking for is an assembler job with a
11958767cbc475ed96397b6f08617814eeb9cab121bdDaniel Dunbar  // compiler input.
1196eb840bd0e473ee11622e084a0d6ff276ee7aa5c6Daniel Dunbar
1197eb840bd0e473ee11622e084a0d6ff276ee7aa5c6Daniel Dunbar  // FIXME: This doesn't belong here, but ideally we will support static soon
1198eb840bd0e473ee11622e084a0d6ff276ee7aa5c6Daniel Dunbar  // anyway.
1199eb840bd0e473ee11622e084a0d6ff276ee7aa5c6Daniel Dunbar  bool HasStatic = (C.getArgs().hasArg(options::OPT_mkernel) ||
1200eb840bd0e473ee11622e084a0d6ff276ee7aa5c6Daniel Dunbar                    C.getArgs().hasArg(options::OPT_static) ||
1201eb840bd0e473ee11622e084a0d6ff276ee7aa5c6Daniel Dunbar                    C.getArgs().hasArg(options::OPT_fapple_kext));
12027693b1021862ea04f522cca9ca1df67bd1d2d54eRafael Espindola  bool IsDarwin = TC->getTriple().getOS() == llvm::Triple::Darwin;
12037693b1021862ea04f522cca9ca1df67bd1d2d54eRafael Espindola  bool IsIADefault = TC->IsIntegratedAssemblerDefault() &&
12047693b1021862ea04f522cca9ca1df67bd1d2d54eRafael Espindola    !(HasStatic && IsDarwin);
1205eb840bd0e473ee11622e084a0d6ff276ee7aa5c6Daniel Dunbar  if (C.getArgs().hasFlag(options::OPT_integrated_as,
12068767cbc475ed96397b6f08617814eeb9cab121bdDaniel Dunbar                         options::OPT_no_integrated_as,
1207eb840bd0e473ee11622e084a0d6ff276ee7aa5c6Daniel Dunbar                         IsIADefault) &&
12088767cbc475ed96397b6f08617814eeb9cab121bdDaniel Dunbar      !C.getArgs().hasArg(options::OPT_save_temps) &&
12098767cbc475ed96397b6f08617814eeb9cab121bdDaniel Dunbar      isa<AssembleJobAction>(JA) &&
12108767cbc475ed96397b6f08617814eeb9cab121bdDaniel Dunbar      Inputs->size() == 1 && isa<CompileJobAction>(*Inputs->begin())) {
1211ac0659ae4124156915eddf70e78065df224d34c8Daniel Dunbar    const Tool &Compiler = TC->SelectTool(
1212ac0659ae4124156915eddf70e78065df224d34c8Daniel Dunbar      C, cast<JobAction>(**Inputs->begin()), (*Inputs)[0]->getInputs());
12138767cbc475ed96397b6f08617814eeb9cab121bdDaniel Dunbar    if (Compiler.hasIntegratedAssembler()) {
12148767cbc475ed96397b6f08617814eeb9cab121bdDaniel Dunbar      Inputs = &(*Inputs)[0]->getInputs();
12158767cbc475ed96397b6f08617814eeb9cab121bdDaniel Dunbar      ToolForJob = &Compiler;
12168767cbc475ed96397b6f08617814eeb9cab121bdDaniel Dunbar    }
12178767cbc475ed96397b6f08617814eeb9cab121bdDaniel Dunbar  }
12188767cbc475ed96397b6f08617814eeb9cab121bdDaniel Dunbar
12198767cbc475ed96397b6f08617814eeb9cab121bdDaniel Dunbar  // Otherwise use the tool for the current job.
12208767cbc475ed96397b6f08617814eeb9cab121bdDaniel Dunbar  if (!ToolForJob)
1221ac0659ae4124156915eddf70e78065df224d34c8Daniel Dunbar    ToolForJob = &TC->SelectTool(C, *JA, *Inputs);
12228767cbc475ed96397b6f08617814eeb9cab121bdDaniel Dunbar
12238767cbc475ed96397b6f08617814eeb9cab121bdDaniel Dunbar  // See if we should use an integrated preprocessor. We do so when we have
12248767cbc475ed96397b6f08617814eeb9cab121bdDaniel Dunbar  // exactly one input, since this is the only use case we care about
12258767cbc475ed96397b6f08617814eeb9cab121bdDaniel Dunbar  // (irrelevant since we don't support combine yet).
12268767cbc475ed96397b6f08617814eeb9cab121bdDaniel Dunbar  if (Inputs->size() == 1 && isa<PreprocessJobAction>(*Inputs->begin()) &&
12278767cbc475ed96397b6f08617814eeb9cab121bdDaniel Dunbar      !C.getArgs().hasArg(options::OPT_no_integrated_cpp) &&
12288767cbc475ed96397b6f08617814eeb9cab121bdDaniel Dunbar      !C.getArgs().hasArg(options::OPT_traditional_cpp) &&
12298767cbc475ed96397b6f08617814eeb9cab121bdDaniel Dunbar      !C.getArgs().hasArg(options::OPT_save_temps) &&
12308767cbc475ed96397b6f08617814eeb9cab121bdDaniel Dunbar      ToolForJob->hasIntegratedCPP())
12318767cbc475ed96397b6f08617814eeb9cab121bdDaniel Dunbar    Inputs = &(*Inputs)[0]->getInputs();
12328767cbc475ed96397b6f08617814eeb9cab121bdDaniel Dunbar
12338767cbc475ed96397b6f08617814eeb9cab121bdDaniel Dunbar  return *ToolForJob;
12348767cbc475ed96397b6f08617814eeb9cab121bdDaniel Dunbar}
12358767cbc475ed96397b6f08617814eeb9cab121bdDaniel Dunbar
1236f353c8cc2ee1cc16ff194b399a8d951f707fb129Daniel Dunbarvoid Driver::BuildJobsForAction(Compilation &C,
1237f353c8cc2ee1cc16ff194b399a8d951f707fb129Daniel Dunbar                                const Action *A,
1238f353c8cc2ee1cc16ff194b399a8d951f707fb129Daniel Dunbar                                const ToolChain *TC,
12394954018954bbc97363eef02d0c83bea19ce9b329Daniel Dunbar                                const char *BoundArch,
1240f353c8cc2ee1cc16ff194b399a8d951f707fb129Daniel Dunbar                                bool AtTopLevel,
1241f353c8cc2ee1cc16ff194b399a8d951f707fb129Daniel Dunbar                                const char *LinkingOutput,
1242f353c8cc2ee1cc16ff194b399a8d951f707fb129Daniel Dunbar                                InputInfo &Result) const {
1243a82318332c9e9b61d3d17371e675ca2859877ee5Daniel Dunbar  llvm::PrettyStackTraceString CrashInfo("Building compilation jobs");
124460ccc7677a5416df3a8f8bde79ab35f85cb66e14Daniel Dunbar
1245f353c8cc2ee1cc16ff194b399a8d951f707fb129Daniel Dunbar  if (const InputAction *IA = dyn_cast<InputAction>(A)) {
1246a82318332c9e9b61d3d17371e675ca2859877ee5Daniel Dunbar    // FIXME: It would be nice to not claim this here; maybe the old scheme of
1247a82318332c9e9b61d3d17371e675ca2859877ee5Daniel Dunbar    // just using Args was better?
1248115a79277edababaf1b26e3654044ae983197679Daniel Dunbar    const Arg &Input = IA->getInputArg();
1249115a79277edababaf1b26e3654044ae983197679Daniel Dunbar    Input.claim();
1250532c1ec307b8689e95896a11ce5ae4661fa9e5d3Daniel Dunbar    if (Input.getOption().matches(options::OPT_INPUT)) {
1251115a79277edababaf1b26e3654044ae983197679Daniel Dunbar      const char *Name = Input.getValue(C.getArgs());
1252115a79277edababaf1b26e3654044ae983197679Daniel Dunbar      Result = InputInfo(Name, A->getType(), Name);
1253115a79277edababaf1b26e3654044ae983197679Daniel Dunbar    } else
1254115a79277edababaf1b26e3654044ae983197679Daniel Dunbar      Result = InputInfo(&Input, A->getType(), "");
1255f353c8cc2ee1cc16ff194b399a8d951f707fb129Daniel Dunbar    return;
1256f353c8cc2ee1cc16ff194b399a8d951f707fb129Daniel Dunbar  }
1257f353c8cc2ee1cc16ff194b399a8d951f707fb129Daniel Dunbar
1258f353c8cc2ee1cc16ff194b399a8d951f707fb129Daniel Dunbar  if (const BindArchAction *BAA = dyn_cast<BindArchAction>(A)) {
1259d7502d0a662b5c299125aba04245aefce67cbc22Daniel Dunbar    const ToolChain *TC = &C.getDefaultToolChain();
1260d7502d0a662b5c299125aba04245aefce67cbc22Daniel Dunbar
1261cb8ab23f7c800b041aeb6fc38c341d1aa0da86bfDaniel Dunbar    std::string Arch;
1262d7502d0a662b5c299125aba04245aefce67cbc22Daniel Dunbar    if (BAA->getArchName())
1263d7502d0a662b5c299125aba04245aefce67cbc22Daniel Dunbar      TC = Host->CreateToolChain(C.getArgs(), BAA->getArchName());
1264d7502d0a662b5c299125aba04245aefce67cbc22Daniel Dunbar
12654954018954bbc97363eef02d0c83bea19ce9b329Daniel Dunbar    BuildJobsForAction(C, *BAA->begin(), TC, BAA->getArchName(),
1266e4341253cc5d9c05c256b90eb3f816d256264cebDaniel Dunbar                       AtTopLevel, LinkingOutput, Result);
1267f353c8cc2ee1cc16ff194b399a8d951f707fb129Daniel Dunbar    return;
1268f353c8cc2ee1cc16ff194b399a8d951f707fb129Daniel Dunbar  }
1269f353c8cc2ee1cc16ff194b399a8d951f707fb129Daniel Dunbar
1270f353c8cc2ee1cc16ff194b399a8d951f707fb129Daniel Dunbar  const ActionList *Inputs = &A->getInputs();
12718767cbc475ed96397b6f08617814eeb9cab121bdDaniel Dunbar
12728767cbc475ed96397b6f08617814eeb9cab121bdDaniel Dunbar  const JobAction *JA = cast<JobAction>(A);
12738767cbc475ed96397b6f08617814eeb9cab121bdDaniel Dunbar  const Tool &T = SelectToolForJob(C, TC, JA, Inputs);
1274f353c8cc2ee1cc16ff194b399a8d951f707fb129Daniel Dunbar
1275f353c8cc2ee1cc16ff194b399a8d951f707fb129Daniel Dunbar  // Only use pipes when there is exactly one input.
127647ac7d27c44bd64a7d0fc03d4babc196cf2b8230Daniel Dunbar  InputInfoList InputInfos;
1277f353c8cc2ee1cc16ff194b399a8d951f707fb129Daniel Dunbar  for (ActionList::const_iterator it = Inputs->begin(), ie = Inputs->end();
1278f353c8cc2ee1cc16ff194b399a8d951f707fb129Daniel Dunbar       it != ie; ++it) {
1279be1cc3eec682ca73361edb4109a7969452d3dbebDaniel Dunbar    // Treat dsymutil sub-jobs as being at the top-level too, they shouldn't get
1280be1cc3eec682ca73361edb4109a7969452d3dbebDaniel Dunbar    // temporary output names.
1281be1cc3eec682ca73361edb4109a7969452d3dbebDaniel Dunbar    //
1282be1cc3eec682ca73361edb4109a7969452d3dbebDaniel Dunbar    // FIXME: Clean this up.
1283be1cc3eec682ca73361edb4109a7969452d3dbebDaniel Dunbar    bool SubJobAtTopLevel = false;
1284be1cc3eec682ca73361edb4109a7969452d3dbebDaniel Dunbar    if (AtTopLevel && isa<DsymutilJobAction>(A))
1285be1cc3eec682ca73361edb4109a7969452d3dbebDaniel Dunbar      SubJobAtTopLevel = true;
1286be1cc3eec682ca73361edb4109a7969452d3dbebDaniel Dunbar
1287f353c8cc2ee1cc16ff194b399a8d951f707fb129Daniel Dunbar    InputInfo II;
1288e4341253cc5d9c05c256b90eb3f816d256264cebDaniel Dunbar    BuildJobsForAction(C, *it, TC, BoundArch,
1289be1cc3eec682ca73361edb4109a7969452d3dbebDaniel Dunbar                       SubJobAtTopLevel, LinkingOutput, II);
1290f353c8cc2ee1cc16ff194b399a8d951f707fb129Daniel Dunbar    InputInfos.push_back(II);
1291f353c8cc2ee1cc16ff194b399a8d951f707fb129Daniel Dunbar  }
1292f353c8cc2ee1cc16ff194b399a8d951f707fb129Daniel Dunbar
1293f353c8cc2ee1cc16ff194b399a8d951f707fb129Daniel Dunbar  // Always use the first input as the base input.
1294f353c8cc2ee1cc16ff194b399a8d951f707fb129Daniel Dunbar  const char *BaseInput = InputInfos[0].getBaseInput();
1295441d060838a5797691777dfcc992ff836b73dcd1Daniel Dunbar
1296be1cc3eec682ca73361edb4109a7969452d3dbebDaniel Dunbar  // ... except dsymutil actions, which use their actual input as the base
1297be1cc3eec682ca73361edb4109a7969452d3dbebDaniel Dunbar  // input.
1298be1cc3eec682ca73361edb4109a7969452d3dbebDaniel Dunbar  if (JA->getType() == types::TY_dSYM)
1299be1cc3eec682ca73361edb4109a7969452d3dbebDaniel Dunbar    BaseInput = InputInfos[0].getFilename();
1300be1cc3eec682ca73361edb4109a7969452d3dbebDaniel Dunbar
13019b18cca61197421af872df81014390c9cb813516Daniel Dunbar  // Determine the place to write output to, if any.
1302441d060838a5797691777dfcc992ff836b73dcd1Daniel Dunbar  if (JA->getType() == types::TY_Nothing) {
13035c3c1d7b494660ba5e8983ee4584622750725ac2Daniel Dunbar    Result = InputInfo(A->getType(), BaseInput);
1304441d060838a5797691777dfcc992ff836b73dcd1Daniel Dunbar  } else {
13055c3c1d7b494660ba5e8983ee4584622750725ac2Daniel Dunbar    Result = InputInfo(GetNamedOutputPath(C, *JA, BaseInput, AtTopLevel),
13065c3c1d7b494660ba5e8983ee4584622750725ac2Daniel Dunbar                       A->getType(), BaseInput);
1307441d060838a5797691777dfcc992ff836b73dcd1Daniel Dunbar  }
1308441d060838a5797691777dfcc992ff836b73dcd1Daniel Dunbar
13092b81910618f63e4ce2373c926a26e76b4b91373fChad Rosier  if (CCCPrintBindings && !CCGenDiagnostics) {
1310cd8e4c44dd068956e9181381be3ee2d49a0fac52Daniel Dunbar    llvm::errs() << "# \"" << T.getToolChain().getTripleString() << '"'
1311cd8e4c44dd068956e9181381be3ee2d49a0fac52Daniel Dunbar                 << " - \"" << T.getName() << "\", inputs: [";
13125c3c1d7b494660ba5e8983ee4584622750725ac2Daniel Dunbar    for (unsigned i = 0, e = InputInfos.size(); i != e; ++i) {
13135c3c1d7b494660ba5e8983ee4584622750725ac2Daniel Dunbar      llvm::errs() << InputInfos[i].getAsString();
13145c3c1d7b494660ba5e8983ee4584622750725ac2Daniel Dunbar      if (i + 1 != e)
13155c3c1d7b494660ba5e8983ee4584622750725ac2Daniel Dunbar        llvm::errs() << ", ";
13165c3c1d7b494660ba5e8983ee4584622750725ac2Daniel Dunbar    }
13175c3c1d7b494660ba5e8983ee4584622750725ac2Daniel Dunbar    llvm::errs() << "], output: " << Result.getAsString() << "\n";
13185c3c1d7b494660ba5e8983ee4584622750725ac2Daniel Dunbar  } else {
13192fe238ed293bd4bc27af9beb9fa151fad2146fa8Daniel Dunbar    T.ConstructJob(C, *JA, Result, InputInfos,
13204954018954bbc97363eef02d0c83bea19ce9b329Daniel Dunbar                   C.getArgsForToolChain(TC, BoundArch), LinkingOutput);
13215c3c1d7b494660ba5e8983ee4584622750725ac2Daniel Dunbar  }
1322f353c8cc2ee1cc16ff194b399a8d951f707fb129Daniel Dunbar}
1323f353c8cc2ee1cc16ff194b399a8d951f707fb129Daniel Dunbar
1324a82318332c9e9b61d3d17371e675ca2859877ee5Daniel Dunbarconst char *Driver::GetNamedOutputPath(Compilation &C,
1325441d060838a5797691777dfcc992ff836b73dcd1Daniel Dunbar                                       const JobAction &JA,
1326441d060838a5797691777dfcc992ff836b73dcd1Daniel Dunbar                                       const char *BaseInput,
1327441d060838a5797691777dfcc992ff836b73dcd1Daniel Dunbar                                       bool AtTopLevel) const {
13288f25c79e59d88df41c5a3cabba1c58035d384a6eDaniel Dunbar  llvm::PrettyStackTraceString CrashInfo("Computing output path");
1329441d060838a5797691777dfcc992ff836b73dcd1Daniel Dunbar  // Output to a user requested destination?
1330be1cc3eec682ca73361edb4109a7969452d3dbebDaniel Dunbar  if (AtTopLevel && !isa<DsymutilJobAction>(JA)) {
1331441d060838a5797691777dfcc992ff836b73dcd1Daniel Dunbar    if (Arg *FinalOutput = C.getArgs().getLastArg(options::OPT_o))
1332441d060838a5797691777dfcc992ff836b73dcd1Daniel Dunbar      return C.addResultFile(FinalOutput->getValue(C.getArgs()));
1333441d060838a5797691777dfcc992ff836b73dcd1Daniel Dunbar  }
1334441d060838a5797691777dfcc992ff836b73dcd1Daniel Dunbar
1335bfd21240b6b4989854c8f5331dc86ce7aecf1ad4Nick Lewycky  // Default to writing to stdout?
13362b81910618f63e4ce2373c926a26e76b4b91373fChad Rosier  if (AtTopLevel && isa<PreprocessJobAction>(JA) && !CCGenDiagnostics)
1337bfd21240b6b4989854c8f5331dc86ce7aecf1ad4Nick Lewycky    return "-";
1338bfd21240b6b4989854c8f5331dc86ce7aecf1ad4Nick Lewycky
1339441d060838a5797691777dfcc992ff836b73dcd1Daniel Dunbar  // Output to a temporary file?
13402b81910618f63e4ce2373c926a26e76b4b91373fChad Rosier  if ((!AtTopLevel && !C.getArgs().hasArg(options::OPT_save_temps)) ||
13412b81910618f63e4ce2373c926a26e76b4b91373fChad Rosier      CCGenDiagnostics) {
1342a82318332c9e9b61d3d17371e675ca2859877ee5Daniel Dunbar    std::string TmpName =
1343214399ebd73545dde02b4a45872e7ca9e1d9e742Daniel Dunbar      GetTemporaryPath(types::getTypeTempSuffix(JA.getType()));
1344214399ebd73545dde02b4a45872e7ca9e1d9e742Daniel Dunbar    return C.addTempFile(C.getArgs().MakeArgString(TmpName.c_str()));
1345441d060838a5797691777dfcc992ff836b73dcd1Daniel Dunbar  }
1346441d060838a5797691777dfcc992ff836b73dcd1Daniel Dunbar
1347472ccff00cdbcd095c3ba933b9e3f202719f118fMichael J. Spencer  llvm::SmallString<128> BasePath(BaseInput);
13485f9e272e632e951b1efe824cd16acb4d96077930Chris Lattner  StringRef BaseName;
134959f9046031bc9703d405b5a9ec61541a90e03defDaniel Dunbar
135059f9046031bc9703d405b5a9ec61541a90e03defDaniel Dunbar  // Dsymutil actions should use the full path.
135159f9046031bc9703d405b5a9ec61541a90e03defDaniel Dunbar  if (isa<DsymutilJobAction>(JA))
135259f9046031bc9703d405b5a9ec61541a90e03defDaniel Dunbar    BaseName = BasePath;
135359f9046031bc9703d405b5a9ec61541a90e03defDaniel Dunbar  else
135459f9046031bc9703d405b5a9ec61541a90e03defDaniel Dunbar    BaseName = llvm::sys::path::filename(BasePath);
1355441d060838a5797691777dfcc992ff836b73dcd1Daniel Dunbar
1356441d060838a5797691777dfcc992ff836b73dcd1Daniel Dunbar  // Determine what the derived output name should be.
1357441d060838a5797691777dfcc992ff836b73dcd1Daniel Dunbar  const char *NamedOutput;
1358441d060838a5797691777dfcc992ff836b73dcd1Daniel Dunbar  if (JA.getType() == types::TY_Image) {
1359441d060838a5797691777dfcc992ff836b73dcd1Daniel Dunbar    NamedOutput = DefaultImageName.c_str();
1360441d060838a5797691777dfcc992ff836b73dcd1Daniel Dunbar  } else {
1361441d060838a5797691777dfcc992ff836b73dcd1Daniel Dunbar    const char *Suffix = types::getTypeTempSuffix(JA.getType());
1362441d060838a5797691777dfcc992ff836b73dcd1Daniel Dunbar    assert(Suffix && "All types used for output should have a suffix.");
1363441d060838a5797691777dfcc992ff836b73dcd1Daniel Dunbar
1364441d060838a5797691777dfcc992ff836b73dcd1Daniel Dunbar    std::string::size_type End = std::string::npos;
1365441d060838a5797691777dfcc992ff836b73dcd1Daniel Dunbar    if (!types::appendSuffixForType(JA.getType()))
1366441d060838a5797691777dfcc992ff836b73dcd1Daniel Dunbar      End = BaseName.rfind('.');
1367441d060838a5797691777dfcc992ff836b73dcd1Daniel Dunbar    std::string Suffixed(BaseName.substr(0, End));
1368441d060838a5797691777dfcc992ff836b73dcd1Daniel Dunbar    Suffixed += '.';
1369441d060838a5797691777dfcc992ff836b73dcd1Daniel Dunbar    Suffixed += Suffix;
1370441d060838a5797691777dfcc992ff836b73dcd1Daniel Dunbar    NamedOutput = C.getArgs().MakeArgString(Suffixed.c_str());
1371441d060838a5797691777dfcc992ff836b73dcd1Daniel Dunbar  }
1372441d060838a5797691777dfcc992ff836b73dcd1Daniel Dunbar
13733e4d10917a7ef84ebf86062e8c912de9c00597c9Chad Rosier  // If we're saving temps and the temp filename conflicts with the input
13743e4d10917a7ef84ebf86062e8c912de9c00597c9Chad Rosier  // filename, then avoid overwriting input file.
13753e4d10917a7ef84ebf86062e8c912de9c00597c9Chad Rosier  if (!AtTopLevel && C.getArgs().hasArg(options::OPT_save_temps) &&
13763e4d10917a7ef84ebf86062e8c912de9c00597c9Chad Rosier    NamedOutput == BaseName) {
13773e4d10917a7ef84ebf86062e8c912de9c00597c9Chad Rosier    std::string TmpName =
13783e4d10917a7ef84ebf86062e8c912de9c00597c9Chad Rosier      GetTemporaryPath(types::getTypeTempSuffix(JA.getType()));
13793e4d10917a7ef84ebf86062e8c912de9c00597c9Chad Rosier    return C.addTempFile(C.getArgs().MakeArgString(TmpName.c_str()));
13803e4d10917a7ef84ebf86062e8c912de9c00597c9Chad Rosier  }
13813e4d10917a7ef84ebf86062e8c912de9c00597c9Chad Rosier
1382a82318332c9e9b61d3d17371e675ca2859877ee5Daniel Dunbar  // As an annoying special case, PCH generation doesn't strip the pathname.
1383441d060838a5797691777dfcc992ff836b73dcd1Daniel Dunbar  if (JA.getType() == types::TY_PCH) {
1384472ccff00cdbcd095c3ba933b9e3f202719f118fMichael J. Spencer    llvm::sys::path::remove_filename(BasePath);
1385472ccff00cdbcd095c3ba933b9e3f202719f118fMichael J. Spencer    if (BasePath.empty())
138656c5594515571eab0e02368ed05416b9dac20837Daniel Dunbar      BasePath = NamedOutput;
138756c5594515571eab0e02368ed05416b9dac20837Daniel Dunbar    else
1388472ccff00cdbcd095c3ba933b9e3f202719f118fMichael J. Spencer      llvm::sys::path::append(BasePath, NamedOutput);
1389441d060838a5797691777dfcc992ff836b73dcd1Daniel Dunbar    return C.addResultFile(C.getArgs().MakeArgString(BasePath.c_str()));
1390441d060838a5797691777dfcc992ff836b73dcd1Daniel Dunbar  } else {
1391441d060838a5797691777dfcc992ff836b73dcd1Daniel Dunbar    return C.addResultFile(NamedOutput);
1392441d060838a5797691777dfcc992ff836b73dcd1Daniel Dunbar  }
1393441d060838a5797691777dfcc992ff836b73dcd1Daniel Dunbar}
1394441d060838a5797691777dfcc992ff836b73dcd1Daniel Dunbar
13955ed34f4c58b6ad4e21038d713c1fae31a6146ff5Daniel Dunbarstd::string Driver::GetFilePath(const char *Name, const ToolChain &TC) const {
139648ad6094679ca2bf4f3593068e02e7a208c1a73cChandler Carruth  // Respect a limited subset of the '-Bprefix' functionality in GCC by
139748ad6094679ca2bf4f3593068e02e7a208c1a73cChandler Carruth  // attempting to use this prefix when lokup up program paths.
139809982cec0029bc495591067fa89967b6b4d1fa19Benjamin Kramer  for (Driver::prefix_list::const_iterator it = PrefixDirs.begin(),
139909982cec0029bc495591067fa89967b6b4d1fa19Benjamin Kramer       ie = PrefixDirs.end(); it != ie; ++it) {
14008ab2bdcc4f397e100c684ede8e8ca6e226e1380aJoerg Sonnenberger    std::string Dir(*it);
14018ab2bdcc4f397e100c684ede8e8ca6e226e1380aJoerg Sonnenberger    if (Dir.empty())
14028ab2bdcc4f397e100c684ede8e8ca6e226e1380aJoerg Sonnenberger      continue;
14038ab2bdcc4f397e100c684ede8e8ca6e226e1380aJoerg Sonnenberger    if (Dir[0] == '=')
14048ab2bdcc4f397e100c684ede8e8ca6e226e1380aJoerg Sonnenberger      Dir = SysRoot + Dir.substr(1);
14058ab2bdcc4f397e100c684ede8e8ca6e226e1380aJoerg Sonnenberger    llvm::sys::Path P(Dir);
140648ad6094679ca2bf4f3593068e02e7a208c1a73cChandler Carruth    P.appendComponent(Name);
140732bef4edba854303800b3b01cb49a282e5da4f69Michael J. Spencer    bool Exists;
140832bef4edba854303800b3b01cb49a282e5da4f69Michael J. Spencer    if (!llvm::sys::fs::exists(P.str(), Exists) && Exists)
140948ad6094679ca2bf4f3593068e02e7a208c1a73cChandler Carruth      return P.str();
141048ad6094679ca2bf4f3593068e02e7a208c1a73cChandler Carruth  }
141148ad6094679ca2bf4f3593068e02e7a208c1a73cChandler Carruth
14120edefebc10fbc627d55d53936fc66178d1c08da1Daniel Dunbar  const ToolChain::path_list &List = TC.getFilePaths();
1413a82318332c9e9b61d3d17371e675ca2859877ee5Daniel Dunbar  for (ToolChain::path_list::const_iterator
14140edefebc10fbc627d55d53936fc66178d1c08da1Daniel Dunbar         it = List.begin(), ie = List.end(); it != ie; ++it) {
14158ab2bdcc4f397e100c684ede8e8ca6e226e1380aJoerg Sonnenberger    std::string Dir(*it);
14168ab2bdcc4f397e100c684ede8e8ca6e226e1380aJoerg Sonnenberger    if (Dir.empty())
14178ab2bdcc4f397e100c684ede8e8ca6e226e1380aJoerg Sonnenberger      continue;
14188ab2bdcc4f397e100c684ede8e8ca6e226e1380aJoerg Sonnenberger    if (Dir[0] == '=')
14198ab2bdcc4f397e100c684ede8e8ca6e226e1380aJoerg Sonnenberger      Dir = SysRoot + Dir.substr(1);
14208ab2bdcc4f397e100c684ede8e8ca6e226e1380aJoerg Sonnenberger    llvm::sys::Path P(Dir);
14210edefebc10fbc627d55d53936fc66178d1c08da1Daniel Dunbar    P.appendComponent(Name);
142232bef4edba854303800b3b01cb49a282e5da4f69Michael J. Spencer    bool Exists;
142332bef4edba854303800b3b01cb49a282e5da4f69Michael J. Spencer    if (!llvm::sys::fs::exists(P.str(), Exists) && Exists)
14245ed34f4c58b6ad4e21038d713c1fae31a6146ff5Daniel Dunbar      return P.str();
14250edefebc10fbc627d55d53936fc66178d1c08da1Daniel Dunbar  }
14260edefebc10fbc627d55d53936fc66178d1c08da1Daniel Dunbar
14275ed34f4c58b6ad4e21038d713c1fae31a6146ff5Daniel Dunbar  return Name;
1428cb881672c2c46142ec1bdfa401c9818ae805db0fDaniel Dunbar}
1429cb881672c2c46142ec1bdfa401c9818ae805db0fDaniel Dunbar
14305ed34f4c58b6ad4e21038d713c1fae31a6146ff5Daniel Dunbarstd::string Driver::GetProgramPath(const char *Name, const ToolChain &TC,
14315ed34f4c58b6ad4e21038d713c1fae31a6146ff5Daniel Dunbar                                   bool WantFile) const {
143248ad6094679ca2bf4f3593068e02e7a208c1a73cChandler Carruth  // Respect a limited subset of the '-Bprefix' functionality in GCC by
143348ad6094679ca2bf4f3593068e02e7a208c1a73cChandler Carruth  // attempting to use this prefix when lokup up program paths.
143409982cec0029bc495591067fa89967b6b4d1fa19Benjamin Kramer  for (Driver::prefix_list::const_iterator it = PrefixDirs.begin(),
143509982cec0029bc495591067fa89967b6b4d1fa19Benjamin Kramer       ie = PrefixDirs.end(); it != ie; ++it) {
143609982cec0029bc495591067fa89967b6b4d1fa19Benjamin Kramer    llvm::sys::Path P(*it);
143748ad6094679ca2bf4f3593068e02e7a208c1a73cChandler Carruth    P.appendComponent(Name);
143832bef4edba854303800b3b01cb49a282e5da4f69Michael J. Spencer    bool Exists;
143932bef4edba854303800b3b01cb49a282e5da4f69Michael J. Spencer    if (WantFile ? !llvm::sys::fs::exists(P.str(), Exists) && Exists
144032bef4edba854303800b3b01cb49a282e5da4f69Michael J. Spencer                 : P.canExecute())
144148ad6094679ca2bf4f3593068e02e7a208c1a73cChandler Carruth      return P.str();
144248ad6094679ca2bf4f3593068e02e7a208c1a73cChandler Carruth  }
144348ad6094679ca2bf4f3593068e02e7a208c1a73cChandler Carruth
14440edefebc10fbc627d55d53936fc66178d1c08da1Daniel Dunbar  const ToolChain::path_list &List = TC.getProgramPaths();
1445a82318332c9e9b61d3d17371e675ca2859877ee5Daniel Dunbar  for (ToolChain::path_list::const_iterator
14460edefebc10fbc627d55d53936fc66178d1c08da1Daniel Dunbar         it = List.begin(), ie = List.end(); it != ie; ++it) {
14470edefebc10fbc627d55d53936fc66178d1c08da1Daniel Dunbar    llvm::sys::Path P(*it);
14480edefebc10fbc627d55d53936fc66178d1c08da1Daniel Dunbar    P.appendComponent(Name);
144932bef4edba854303800b3b01cb49a282e5da4f69Michael J. Spencer    bool Exists;
145032bef4edba854303800b3b01cb49a282e5da4f69Michael J. Spencer    if (WantFile ? !llvm::sys::fs::exists(P.str(), Exists) && Exists
145132bef4edba854303800b3b01cb49a282e5da4f69Michael J. Spencer                 : P.canExecute())
14525ed34f4c58b6ad4e21038d713c1fae31a6146ff5Daniel Dunbar      return P.str();
14530edefebc10fbc627d55d53936fc66178d1c08da1Daniel Dunbar  }
14540edefebc10fbc627d55d53936fc66178d1c08da1Daniel Dunbar
1455c50b00dbd843cd929b5f220d4a8699852249f64cDaniel Dunbar  // If all else failed, search the path.
1456c50b00dbd843cd929b5f220d4a8699852249f64cDaniel Dunbar  llvm::sys::Path P(llvm::sys::Program::FindProgramByName(Name));
1457632f50edc08c76ebc643a0d4871bae33a55d7b4eDaniel Dunbar  if (!P.empty())
14585ed34f4c58b6ad4e21038d713c1fae31a6146ff5Daniel Dunbar    return P.str();
1459632f50edc08c76ebc643a0d4871bae33a55d7b4eDaniel Dunbar
14605ed34f4c58b6ad4e21038d713c1fae31a6146ff5Daniel Dunbar  return Name;
1461cb881672c2c46142ec1bdfa401c9818ae805db0fDaniel Dunbar}
1462cb881672c2c46142ec1bdfa401c9818ae805db0fDaniel Dunbar
1463214399ebd73545dde02b4a45872e7ca9e1d9e742Daniel Dunbarstd::string Driver::GetTemporaryPath(const char *Suffix) const {
1464a82318332c9e9b61d3d17371e675ca2859877ee5Daniel Dunbar  // FIXME: This is lame; sys::Path should provide this function (in particular,
1465a82318332c9e9b61d3d17371e675ca2859877ee5Daniel Dunbar  // it should know how to find the temporary files dir).
1466214399ebd73545dde02b4a45872e7ca9e1d9e742Daniel Dunbar  std::string Error;
1467b03417fdc42ae19d2deb2ee1e5d2c3e9896a2a04Daniel Dunbar  const char *TmpDir = ::getenv("TMPDIR");
1468b03417fdc42ae19d2deb2ee1e5d2c3e9896a2a04Daniel Dunbar  if (!TmpDir)
1469b03417fdc42ae19d2deb2ee1e5d2c3e9896a2a04Daniel Dunbar    TmpDir = ::getenv("TEMP");
1470b03417fdc42ae19d2deb2ee1e5d2c3e9896a2a04Daniel Dunbar  if (!TmpDir)
14713ca7ee9a40532167f67bde17fff5e678f183f3f2Daniel Dunbar    TmpDir = ::getenv("TMP");
14723ca7ee9a40532167f67bde17fff5e678f183f3f2Daniel Dunbar  if (!TmpDir)
1473b03417fdc42ae19d2deb2ee1e5d2c3e9896a2a04Daniel Dunbar    TmpDir = "/tmp";
1474b03417fdc42ae19d2deb2ee1e5d2c3e9896a2a04Daniel Dunbar  llvm::sys::Path P(TmpDir);
1475f60c63af0ed33ab890600ee6146e7685901f46dfDaniel Dunbar  P.appendComponent("cc");
1476214399ebd73545dde02b4a45872e7ca9e1d9e742Daniel Dunbar  if (P.makeUnique(false, &Error)) {
1477214399ebd73545dde02b4a45872e7ca9e1d9e742Daniel Dunbar    Diag(clang::diag::err_drv_unable_to_make_temp) << Error;
1478214399ebd73545dde02b4a45872e7ca9e1d9e742Daniel Dunbar    return "";
1479214399ebd73545dde02b4a45872e7ca9e1d9e742Daniel Dunbar  }
1480214399ebd73545dde02b4a45872e7ca9e1d9e742Daniel Dunbar
1481a82318332c9e9b61d3d17371e675ca2859877ee5Daniel Dunbar  // FIXME: Grumble, makeUnique sometimes leaves the file around!?  PR3837.
148284603bc4ed98caca9b82c1a68e63939927d8cd6dDaniel Dunbar  P.eraseFromDisk(false, 0);
148384603bc4ed98caca9b82c1a68e63939927d8cd6dDaniel Dunbar
1484214399ebd73545dde02b4a45872e7ca9e1d9e742Daniel Dunbar  P.appendSuffix(Suffix);
1485d57a7ef9252964bc6c8471451d7bd395b0520cb8Chris Lattner  return P.str();
1486214399ebd73545dde02b4a45872e7ca9e1d9e742Daniel Dunbar}
1487214399ebd73545dde02b4a45872e7ca9e1d9e742Daniel Dunbar
1488cb8ab23f7c800b041aeb6fc38c341d1aa0da86bfDaniel Dunbarconst HostInfo *Driver::GetHostInfo(const char *TripleStr) const {
14898f25c79e59d88df41c5a3cabba1c58035d384a6eDaniel Dunbar  llvm::PrettyStackTraceString CrashInfo("Constructing host");
1490476fc6715c4119a8e39ec70fbf9df1c57580ead8Anton Korobeynikov  llvm::Triple Triple(llvm::Triple::normalize(TripleStr).c_str());
1491dd98e2cad165ca73c769e4f105a4e47c2216387aDaniel Dunbar
14923a47c4e0a3e8d13ee4fb06cc3a98f9cfa9982400Chris Lattner  // TCE is an osless target
14933a47c4e0a3e8d13ee4fb06cc3a98f9cfa9982400Chris Lattner  if (Triple.getArchName() == "tce")
1494f78925f633e949f06521d9ffd937019e59f35efcDaniel Dunbar    return createTCEHostInfo(*this, Triple);
14953a47c4e0a3e8d13ee4fb06cc3a98f9cfa9982400Chris Lattner
1496cb8ab23f7c800b041aeb6fc38c341d1aa0da86bfDaniel Dunbar  switch (Triple.getOS()) {
1497e7925a075f110ab21afeae084670a155dea568e3Edward O'Callaghan  case llvm::Triple::AuroraUX:
1498e7925a075f110ab21afeae084670a155dea568e3Edward O'Callaghan    return createAuroraUXHostInfo(*this, Triple);
1499cb8ab23f7c800b041aeb6fc38c341d1aa0da86bfDaniel Dunbar  case llvm::Triple::Darwin:
1500cb8ab23f7c800b041aeb6fc38c341d1aa0da86bfDaniel Dunbar    return createDarwinHostInfo(*this, Triple);
1501cb8ab23f7c800b041aeb6fc38c341d1aa0da86bfDaniel Dunbar  case llvm::Triple::DragonFly:
1502cb8ab23f7c800b041aeb6fc38c341d1aa0da86bfDaniel Dunbar    return createDragonFlyHostInfo(*this, Triple);
1503f7b8eec37c8c8012fa525c71fb29a58c9f29beefDaniel Dunbar  case llvm::Triple::OpenBSD:
1504f7b8eec37c8c8012fa525c71fb29a58c9f29beefDaniel Dunbar    return createOpenBSDHostInfo(*this, Triple);
15058e50a96b387dca7525caa8a6add31420dd82a2cdBenjamin Kramer  case llvm::Triple::NetBSD:
15068e50a96b387dca7525caa8a6add31420dd82a2cdBenjamin Kramer    return createNetBSDHostInfo(*this, Triple);
1507cb8ab23f7c800b041aeb6fc38c341d1aa0da86bfDaniel Dunbar  case llvm::Triple::FreeBSD:
1508cb8ab23f7c800b041aeb6fc38c341d1aa0da86bfDaniel Dunbar    return createFreeBSDHostInfo(*this, Triple);
150938e317d6dce161b249508686cc67eb7176958762Chris Lattner  case llvm::Triple::Minix:
151038e317d6dce161b249508686cc67eb7176958762Chris Lattner    return createMinixHostInfo(*this, Triple);
15116b3454a219cee5ef36c4668961f93a5c32deab61Eli Friedman  case llvm::Triple::Linux:
15126b3454a219cee5ef36c4668961f93a5c32deab61Eli Friedman    return createLinuxHostInfo(*this, Triple);
1513ff58e3610f4e12094def69eb2d6dcb4330378d8fMichael J. Spencer  case llvm::Triple::Win32:
1514ff58e3610f4e12094def69eb2d6dcb4330378d8fMichael J. Spencer    return createWindowsHostInfo(*this, Triple);
1515ff58e3610f4e12094def69eb2d6dcb4330378d8fMichael J. Spencer  case llvm::Triple::MinGW32:
1516ff58e3610f4e12094def69eb2d6dcb4330378d8fMichael J. Spencer    return createMinGWHostInfo(*this, Triple);
1517cb8ab23f7c800b041aeb6fc38c341d1aa0da86bfDaniel Dunbar  default:
1518cb8ab23f7c800b041aeb6fc38c341d1aa0da86bfDaniel Dunbar    return createUnknownHostInfo(*this, Triple);
1519cb8ab23f7c800b041aeb6fc38c341d1aa0da86bfDaniel Dunbar  }
1520dd98e2cad165ca73c769e4f105a4e47c2216387aDaniel Dunbar}
1521af80e1ffafeb77929cc0b9ba8940a7f1c0b80d51Daniel Dunbar
1522af80e1ffafeb77929cc0b9ba8940a7f1c0b80d51Daniel Dunbarbool Driver::ShouldUseClangCompiler(const Compilation &C, const JobAction &JA,
1523a6046bec7fc835186dde134fb81aa1b7d45cd9f0Daniel Dunbar                                    const llvm::Triple &Triple) const {
1524a82318332c9e9b61d3d17371e675ca2859877ee5Daniel Dunbar  // Check if user requested no clang, or clang doesn't understand this type (we
1525a82318332c9e9b61d3d17371e675ca2859877ee5Daniel Dunbar  // only handle single inputs for now).
15265915fbf310e171c4cd3c2af05e9de360c0fa988aDaniel Dunbar  if (!CCCUseClang || JA.size() != 1 ||
1527af80e1ffafeb77929cc0b9ba8940a7f1c0b80d51Daniel Dunbar      !types::isAcceptedByClang((*JA.begin())->getType()))
1528af80e1ffafeb77929cc0b9ba8940a7f1c0b80d51Daniel Dunbar    return false;
1529af80e1ffafeb77929cc0b9ba8940a7f1c0b80d51Daniel Dunbar
15300f99d2e57d8e3cf2508e7f9f868d41eccdc229c9Daniel Dunbar  // Otherwise make sure this is an action clang understands.
1531af80e1ffafeb77929cc0b9ba8940a7f1c0b80d51Daniel Dunbar  if (isa<PreprocessJobAction>(JA)) {
15326256d3654533547a7996170647c21a859cb441e1Daniel Dunbar    if (!CCCUseClangCPP) {
15336256d3654533547a7996170647c21a859cb441e1Daniel Dunbar      Diag(clang::diag::warn_drv_not_using_clang_cpp);
1534af80e1ffafeb77929cc0b9ba8940a7f1c0b80d51Daniel Dunbar      return false;
15356256d3654533547a7996170647c21a859cb441e1Daniel Dunbar    }
1536af80e1ffafeb77929cc0b9ba8940a7f1c0b80d51Daniel Dunbar  } else if (!isa<PrecompileJobAction>(JA) && !isa<CompileJobAction>(JA))
1537af80e1ffafeb77929cc0b9ba8940a7f1c0b80d51Daniel Dunbar    return false;
1538af80e1ffafeb77929cc0b9ba8940a7f1c0b80d51Daniel Dunbar
15390f99d2e57d8e3cf2508e7f9f868d41eccdc229c9Daniel Dunbar  // Use clang for C++?
15406256d3654533547a7996170647c21a859cb441e1Daniel Dunbar  if (!CCCUseClangCXX && types::isCXX((*JA.begin())->getType())) {
15416256d3654533547a7996170647c21a859cb441e1Daniel Dunbar    Diag(clang::diag::warn_drv_not_using_clang_cxx);
1542af80e1ffafeb77929cc0b9ba8940a7f1c0b80d51Daniel Dunbar    return false;
15436256d3654533547a7996170647c21a859cb441e1Daniel Dunbar  }
1544af80e1ffafeb77929cc0b9ba8940a7f1c0b80d51Daniel Dunbar
154564952508c2b0c8bffb45c8b410f0af3d2457f59bDaniel Dunbar  // Always use clang for precompiling, AST generation, and rewriting,
154664952508c2b0c8bffb45c8b410f0af3d2457f59bDaniel Dunbar  // regardless of archs.
15476c6424bc0d3b5f080a97b5f6ef4a8d70c38e38f5Daniel Dunbar  if (isa<PrecompileJobAction>(JA) ||
15486c6424bc0d3b5f080a97b5f6ef4a8d70c38e38f5Daniel Dunbar      types::isOnlyAcceptedByClang(JA.getType()))
1549fec26bd1f4681db8c253fb86529e52bcad28a3ffDaniel Dunbar    return true;
1550fec26bd1f4681db8c253fb86529e52bcad28a3ffDaniel Dunbar
1551a82318332c9e9b61d3d17371e675ca2859877ee5Daniel Dunbar  // Finally, don't use clang if this isn't one of the user specified archs to
1552a82318332c9e9b61d3d17371e675ca2859877ee5Daniel Dunbar  // build.
1553a6046bec7fc835186dde134fb81aa1b7d45cd9f0Daniel Dunbar  if (!CCCClangArchs.empty() && !CCCClangArchs.count(Triple.getArch())) {
1554a6046bec7fc835186dde134fb81aa1b7d45cd9f0Daniel Dunbar    Diag(clang::diag::warn_drv_not_using_clang_arch) << Triple.getArchName();
1555af80e1ffafeb77929cc0b9ba8940a7f1c0b80d51Daniel Dunbar    return false;
15566256d3654533547a7996170647c21a859cb441e1Daniel Dunbar  }
1557af80e1ffafeb77929cc0b9ba8940a7f1c0b80d51Daniel Dunbar
1558af80e1ffafeb77929cc0b9ba8940a7f1c0b80d51Daniel Dunbar  return true;
1559af80e1ffafeb77929cc0b9ba8940a7f1c0b80d51Daniel Dunbar}
1560d73fe9b70c5f6738d004744562287a62831f39bfDaniel Dunbar
1561a82318332c9e9b61d3d17371e675ca2859877ee5Daniel Dunbar/// GetReleaseVersion - Parse (([0-9]+)(.([0-9]+)(.([0-9]+)?))?)? and return the
1562a82318332c9e9b61d3d17371e675ca2859877ee5Daniel Dunbar/// grouped values as integers. Numbers which are not provided are set to 0.
1563d73fe9b70c5f6738d004744562287a62831f39bfDaniel Dunbar///
1564a82318332c9e9b61d3d17371e675ca2859877ee5Daniel Dunbar/// \return True if the entire string was parsed (9.2), or all groups were
1565a82318332c9e9b61d3d17371e675ca2859877ee5Daniel Dunbar/// parsed (10.3.5extrastuff).
1566a82318332c9e9b61d3d17371e675ca2859877ee5Daniel Dunbarbool Driver::GetReleaseVersion(const char *Str, unsigned &Major,
1567d73fe9b70c5f6738d004744562287a62831f39bfDaniel Dunbar                               unsigned &Minor, unsigned &Micro,
1568d73fe9b70c5f6738d004744562287a62831f39bfDaniel Dunbar                               bool &HadExtra) {
1569d73fe9b70c5f6738d004744562287a62831f39bfDaniel Dunbar  HadExtra = false;
1570d73fe9b70c5f6738d004744562287a62831f39bfDaniel Dunbar
1571d73fe9b70c5f6738d004744562287a62831f39bfDaniel Dunbar  Major = Minor = Micro = 0;
1572a82318332c9e9b61d3d17371e675ca2859877ee5Daniel Dunbar  if (*Str == '\0')
1573d73fe9b70c5f6738d004744562287a62831f39bfDaniel Dunbar    return true;
1574d73fe9b70c5f6738d004744562287a62831f39bfDaniel Dunbar
1575d73fe9b70c5f6738d004744562287a62831f39bfDaniel Dunbar  char *End;
1576d73fe9b70c5f6738d004744562287a62831f39bfDaniel Dunbar  Major = (unsigned) strtol(Str, &End, 10);
1577d73fe9b70c5f6738d004744562287a62831f39bfDaniel Dunbar  if (*Str != '\0' && *End == '\0')
1578d73fe9b70c5f6738d004744562287a62831f39bfDaniel Dunbar    return true;
1579d73fe9b70c5f6738d004744562287a62831f39bfDaniel Dunbar  if (*End != '.')
1580d73fe9b70c5f6738d004744562287a62831f39bfDaniel Dunbar    return false;
1581a82318332c9e9b61d3d17371e675ca2859877ee5Daniel Dunbar
1582d73fe9b70c5f6738d004744562287a62831f39bfDaniel Dunbar  Str = End+1;
1583d73fe9b70c5f6738d004744562287a62831f39bfDaniel Dunbar  Minor = (unsigned) strtol(Str, &End, 10);
1584d73fe9b70c5f6738d004744562287a62831f39bfDaniel Dunbar  if (*Str != '\0' && *End == '\0')
1585d73fe9b70c5f6738d004744562287a62831f39bfDaniel Dunbar    return true;
1586d73fe9b70c5f6738d004744562287a62831f39bfDaniel Dunbar  if (*End != '.')
1587d73fe9b70c5f6738d004744562287a62831f39bfDaniel Dunbar    return false;
1588d73fe9b70c5f6738d004744562287a62831f39bfDaniel Dunbar
1589d73fe9b70c5f6738d004744562287a62831f39bfDaniel Dunbar  Str = End+1;
1590d73fe9b70c5f6738d004744562287a62831f39bfDaniel Dunbar  Micro = (unsigned) strtol(Str, &End, 10);
1591d73fe9b70c5f6738d004744562287a62831f39bfDaniel Dunbar  if (*Str != '\0' && *End == '\0')
1592d73fe9b70c5f6738d004744562287a62831f39bfDaniel Dunbar    return true;
1593d73fe9b70c5f6738d004744562287a62831f39bfDaniel Dunbar  if (Str == End)
1594d73fe9b70c5f6738d004744562287a62831f39bfDaniel Dunbar    return false;
1595d73fe9b70c5f6738d004744562287a62831f39bfDaniel Dunbar  HadExtra = true;
1596d73fe9b70c5f6738d004744562287a62831f39bfDaniel Dunbar  return true;
1597d73fe9b70c5f6738d004744562287a62831f39bfDaniel Dunbar}
1598