Driver.cpp revision 5f9e272e632e951b1efe824cd16acb4d96077930
1e3365aa452673f7ea3244bb6638551f13ab7570dNick Lewycky//===--- Driver.cpp - Clang GCC Compatible Driver -------------------------===//
23ede8d0a7d1813f678ccc6011a99a0834b1b6116Daniel Dunbar//
33ede8d0a7d1813f678ccc6011a99a0834b1b6116Daniel Dunbar//                     The LLVM Compiler Infrastructure
43ede8d0a7d1813f678ccc6011a99a0834b1b6116Daniel Dunbar//
53ede8d0a7d1813f678ccc6011a99a0834b1b6116Daniel Dunbar// This file is distributed under the University of Illinois Open Source
63ede8d0a7d1813f678ccc6011a99a0834b1b6116Daniel Dunbar// License. See LICENSE.TXT for details.
73ede8d0a7d1813f678ccc6011a99a0834b1b6116Daniel Dunbar//
83ede8d0a7d1813f678ccc6011a99a0834b1b6116Daniel Dunbar//===----------------------------------------------------------------------===//
93ede8d0a7d1813f678ccc6011a99a0834b1b6116Daniel Dunbar
102100fe952a644134b1dca462f2e6330cf14ef47cOscar Fuentes#ifdef HAVE_CLANG_CONFIG_H
112100fe952a644134b1dca462f2e6330cf14ef47cOscar Fuentes# include "clang/Config/config.h"
122100fe952a644134b1dca462f2e6330cf14ef47cOscar Fuentes#endif
132100fe952a644134b1dca462f2e6330cf14ef47cOscar Fuentes
143ede8d0a7d1813f678ccc6011a99a0834b1b6116Daniel Dunbar#include "clang/Driver/Driver.h"
153ede8d0a7d1813f678ccc6011a99a0834b1b6116Daniel Dunbar
1653ec55215075c8f4ddd47ca6ed7d382f16beb670Daniel Dunbar#include "clang/Driver/Action.h"
171b3bb6efc59a21f794b534078f9ae7e95393f510Daniel Dunbar#include "clang/Driver/Arg.h"
181b3bb6efc59a21f794b534078f9ae7e95393f510Daniel Dunbar#include "clang/Driver/ArgList.h"
191b3bb6efc59a21f794b534078f9ae7e95393f510Daniel Dunbar#include "clang/Driver/Compilation.h"
204ad4b3ebbe5769143389dccfcfadb666a4ba5940Daniel Dunbar#include "clang/Driver/DriverDiagnostic.h"
21dd98e2cad165ca73c769e4f105a4e47c2216387aDaniel Dunbar#include "clang/Driver/HostInfo.h"
22f353c8cc2ee1cc16ff194b399a8d951f707fb129Daniel Dunbar#include "clang/Driver/Job.h"
2327e738d0d3f781672a5999d2a9e2827b00a97d0cDaniel Dunbar#include "clang/Driver/OptTable.h"
240648262df75d97b464c2be0ed867da3615659785Daniel Dunbar#include "clang/Driver/Option.h"
251b3bb6efc59a21f794b534078f9ae7e95393f510Daniel Dunbar#include "clang/Driver/Options.h"
26f353c8cc2ee1cc16ff194b399a8d951f707fb129Daniel Dunbar#include "clang/Driver/Tool.h"
27f353c8cc2ee1cc16ff194b399a8d951f707fb129Daniel Dunbar#include "clang/Driver/ToolChain.h"
2853ec55215075c8f4ddd47ca6ed7d382f16beb670Daniel Dunbar#include "clang/Driver/Types.h"
290648262df75d97b464c2be0ed867da3615659785Daniel Dunbar
30ab41e63821dc60ad144d0684df8d79a9eef86b75Douglas Gregor#include "clang/Basic/Version.h"
31ab41e63821dc60ad144d0684df8d79a9eef86b75Douglas Gregor
32a77a723489b0cff63bf90f23416e10b8b6fc1f55Daniel Dunbar#include "llvm/Config/config.h"
337f9fc3f7ce076645cb6aefc99c64d9446caf13d6Chris Lattner#include "llvm/ADT/ArrayRef.h"
341368954db9ce2989ed8f03f5c65e8ee775a5229aDaniel Dunbar#include "llvm/ADT/StringSet.h"
354d7b14734f2285695dcec347f8718b512093390aTed Kremenek#include "llvm/ADT/OwningPtr.h"
368f25c79e59d88df41c5a3cabba1c58035d384a6eDaniel Dunbar#include "llvm/Support/PrettyStackTrace.h"
370648262df75d97b464c2be0ed867da3615659785Daniel Dunbar#include "llvm/Support/raw_ostream.h"
38256053b31e697fdf0cc48f17d621c82fc3b8dff0Michael J. Spencer#include "llvm/Support/FileSystem.h"
3903013fa9a0bf1ef4b907f5fec006c8f4000fdd21Michael J. Spencer#include "llvm/Support/Path.h"
4003013fa9a0bf1ef4b907f5fec006c8f4000fdd21Michael J. Spencer#include "llvm/Support/Program.h"
41ba1021388e6839b76c8968b931189361c7286674Daniel Dunbar
42f353c8cc2ee1cc16ff194b399a8d951f707fb129Daniel Dunbar#include "InputInfo.h"
43f353c8cc2ee1cc16ff194b399a8d951f707fb129Daniel Dunbar
44ba1021388e6839b76c8968b931189361c7286674Daniel Dunbar#include <map>
45ba1021388e6839b76c8968b931189361c7286674Daniel Dunbar
461b3bb6efc59a21f794b534078f9ae7e95393f510Daniel Dunbarusing namespace clang::driver;
4792b369928b8e9ad156fb6eec2bf9f21d657bd69bChris Lattnerusing namespace clang;
481b3bb6efc59a21f794b534078f9ae7e95393f510Daniel Dunbar
495f9e272e632e951b1efe824cd16acb4d96077930Chris LattnerDriver::Driver(StringRef ClangExecutable,
505f9e272e632e951b1efe824cd16acb4d96077930Chris Lattner               StringRef DefaultHostTriple,
515f9e272e632e951b1efe824cd16acb4d96077930Chris Lattner               StringRef DefaultImageName,
525d93ed3c7a2dae0a8f422747e269963b3ef11d95Daniel Dunbar               bool IsProduction, bool CXXIsProduction,
537e46d0b8436d844d77f3ff580b6e1204e0407044Nick Lewycky               Diagnostic &Diags)
547e46d0b8436d844d77f3ff580b6e1204e0407044Nick Lewycky  : Opts(createDriverOptTable()), Diags(Diags),
557e46d0b8436d844d77f3ff580b6e1204e0407044Nick Lewycky    ClangExecutable(ClangExecutable), UseStdLib(true),
567e46d0b8436d844d77f3ff580b6e1204e0407044Nick Lewycky    DefaultHostTriple(DefaultHostTriple), DefaultImageName(DefaultImageName),
5743302d4144b5291961aa160d2fe191c09a9d8ad1Daniel Dunbar    DriverTitle("clang \"gcc-compatible\" driver"),
58dd98e2cad165ca73c769e4f105a4e47c2216387aDaniel Dunbar    Host(0),
59c8a22b091677c02003880166e5d5767ca8d74b70Daniel Dunbar    CCPrintOptionsFilename(0), CCPrintHeadersFilename(0),
60c8a22b091677c02003880166e5d5767ca8d74b70Daniel Dunbar    CCLogDiagnosticsFilename(0), CCCIsCXX(false),
61951c5705771a57eca0bca07aae5d4738619dd6c6Joerg Sonnenberger    CCCIsCPP(false),CCCEcho(false), CCCPrintBindings(false),
62c8a22b091677c02003880166e5d5767ca8d74b70Daniel Dunbar    CCPrintOptions(false), CCPrintHeaders(false), CCLogDiagnostics(false),
63d7a3ba03f69892aac02e0771eb2e6d1b7b1d1267Chad Rosier    CCCGenericGCCName(""), CheckInputsExist(true), CCCUseClang(true),
64d7a3ba03f69892aac02e0771eb2e6d1b7b1d1267Chad Rosier    CCCUseClangCXX(true), CCCUseClangCPP(true), CCCUsePCH(true),
65d7a3ba03f69892aac02e0771eb2e6d1b7b1d1267Chad Rosier    SuppressMissingInputWarning(false) {
66f44c58563286bb448a72ed9c9af5f21718633230Daniel Dunbar  if (IsProduction) {
67f44c58563286bb448a72ed9c9af5f21718633230Daniel Dunbar    // In a "production" build, only use clang on architectures we expect to
68f44c58563286bb448a72ed9c9af5f21718633230Daniel Dunbar    // work, and don't use clang C++.
69f44c58563286bb448a72ed9c9af5f21718633230Daniel Dunbar    //
70f44c58563286bb448a72ed9c9af5f21718633230Daniel Dunbar    // During development its more convenient to always have the driver use
71f44c58563286bb448a72ed9c9af5f21718633230Daniel Dunbar    // clang, but we don't want users to be confused when things don't work, or
72f44c58563286bb448a72ed9c9af5f21718633230Daniel Dunbar    // to file bugs for things we don't support.
73f44c58563286bb448a72ed9c9af5f21718633230Daniel Dunbar    CCCClangArchs.insert(llvm::Triple::x86);
74f44c58563286bb448a72ed9c9af5f21718633230Daniel Dunbar    CCCClangArchs.insert(llvm::Triple::x86_64);
75f44c58563286bb448a72ed9c9af5f21718633230Daniel Dunbar    CCCClangArchs.insert(llvm::Triple::arm);
76f44c58563286bb448a72ed9c9af5f21718633230Daniel Dunbar
775d93ed3c7a2dae0a8f422747e269963b3ef11d95Daniel Dunbar    if (!CXXIsProduction)
785d93ed3c7a2dae0a8f422747e269963b3ef11d95Daniel Dunbar      CCCUseClangCXX = false;
79f44c58563286bb448a72ed9c9af5f21718633230Daniel Dunbar  }
80225c41706dc0f3682236e351820d339e14390e00Daniel Dunbar
81d5b08bee799d4f77f1a25fa5977ca77b983ab031Michael J. Spencer  Name = llvm::sys::path::stem(ClangExecutable);
82d5b08bee799d4f77f1a25fa5977ca77b983ab031Michael J. Spencer  Dir  = llvm::sys::path::parent_path(ClangExecutable);
830bbad519aa068206f1e158d5073f72a39fbe83c5Daniel Dunbar
84225c41706dc0f3682236e351820d339e14390e00Daniel Dunbar  // Compute the path to the resource directory.
855f9e272e632e951b1efe824cd16acb4d96077930Chris Lattner  StringRef ClangResourceDir(CLANG_RESOURCE_DIR);
86d5b08bee799d4f77f1a25fa5977ca77b983ab031Michael J. Spencer  llvm::SmallString<128> P(Dir);
87d5b08bee799d4f77f1a25fa5977ca77b983ab031Michael J. Spencer  if (ClangResourceDir != "")
88d5b08bee799d4f77f1a25fa5977ca77b983ab031Michael J. Spencer    llvm::sys::path::append(P, ClangResourceDir);
89d5b08bee799d4f77f1a25fa5977ca77b983ab031Michael J. Spencer  else
90d5b08bee799d4f77f1a25fa5977ca77b983ab031Michael J. Spencer    llvm::sys::path::append(P, "..", "lib", "clang", CLANG_VERSION_STRING);
91225c41706dc0f3682236e351820d339e14390e00Daniel Dunbar  ResourceDir = P.str();
923ede8d0a7d1813f678ccc6011a99a0834b1b6116Daniel Dunbar}
933ede8d0a7d1813f678ccc6011a99a0834b1b6116Daniel Dunbar
943ede8d0a7d1813f678ccc6011a99a0834b1b6116Daniel DunbarDriver::~Driver() {
951b3bb6efc59a21f794b534078f9ae7e95393f510Daniel Dunbar  delete Opts;
967e4534d9c14febcdea30c057bb2a36e245776865Daniel Dunbar  delete Host;
973ede8d0a7d1813f678ccc6011a99a0834b1b6116Daniel Dunbar}
983ede8d0a7d1813f678ccc6011a99a0834b1b6116Daniel Dunbar
997f9fc3f7ce076645cb6aefc99c64d9446caf13d6Chris LattnerInputArgList *Driver::ParseArgStrings(llvm::ArrayRef<const char *> ArgList) {
1008f25c79e59d88df41c5a3cabba1c58035d384a6eDaniel Dunbar  llvm::PrettyStackTraceString CrashInfo("Command line argument parsing");
101847abaa62883b6c20005bdd3346ebbd44e46dbacDaniel Dunbar  unsigned MissingArgIndex, MissingArgCount;
1027f9fc3f7ce076645cb6aefc99c64d9446caf13d6Chris Lattner  InputArgList *Args = getOpts().ParseArgs(ArgList.begin(), ArgList.end(),
103847abaa62883b6c20005bdd3346ebbd44e46dbacDaniel Dunbar                                           MissingArgIndex, MissingArgCount);
104847abaa62883b6c20005bdd3346ebbd44e46dbacDaniel Dunbar
105847abaa62883b6c20005bdd3346ebbd44e46dbacDaniel Dunbar  // Check for missing argument error.
106847abaa62883b6c20005bdd3346ebbd44e46dbacDaniel Dunbar  if (MissingArgCount)
107847abaa62883b6c20005bdd3346ebbd44e46dbacDaniel Dunbar    Diag(clang::diag::err_drv_missing_argument)
108847abaa62883b6c20005bdd3346ebbd44e46dbacDaniel Dunbar      << Args->getArgString(MissingArgIndex) << MissingArgCount;
109847abaa62883b6c20005bdd3346ebbd44e46dbacDaniel Dunbar
110847abaa62883b6c20005bdd3346ebbd44e46dbacDaniel Dunbar  // Check for unsupported options.
111847abaa62883b6c20005bdd3346ebbd44e46dbacDaniel Dunbar  for (ArgList::const_iterator it = Args->begin(), ie = Args->end();
112847abaa62883b6c20005bdd3346ebbd44e46dbacDaniel Dunbar       it != ie; ++it) {
113847abaa62883b6c20005bdd3346ebbd44e46dbacDaniel Dunbar    Arg *A = *it;
114b0c4df5c4df69a003f26b378eb95961bc7c486e5Daniel Dunbar    if (A->getOption().isUnsupported()) {
115b0c4df5c4df69a003f26b378eb95961bc7c486e5Daniel Dunbar      Diag(clang::diag::err_drv_unsupported_opt) << A->getAsString(*Args);
116b0c4df5c4df69a003f26b378eb95961bc7c486e5Daniel Dunbar      continue;
117b0c4df5c4df69a003f26b378eb95961bc7c486e5Daniel Dunbar    }
1180648262df75d97b464c2be0ed867da3615659785Daniel Dunbar  }
1190648262df75d97b464c2be0ed867da3615659785Daniel Dunbar
1200648262df75d97b464c2be0ed867da3615659785Daniel Dunbar  return Args;
1210648262df75d97b464c2be0ed867da3615659785Daniel Dunbar}
1220648262df75d97b464c2be0ed867da3615659785Daniel Dunbar
123279c1dbebf37cd128f3c73c70741a6b8c35ad025Daniel DunbarDerivedArgList *Driver::TranslateInputArgs(const InputArgList &Args) const {
124279c1dbebf37cd128f3c73c70741a6b8c35ad025Daniel Dunbar  DerivedArgList *DAL = new DerivedArgList(Args);
125279c1dbebf37cd128f3c73c70741a6b8c35ad025Daniel Dunbar
126e5a37f48388c7e4cc081f44d13a4910bfa56cd35Daniel Dunbar  bool HasNostdlib = Args.hasArg(options::OPT_nostdlib);
127279c1dbebf37cd128f3c73c70741a6b8c35ad025Daniel Dunbar  for (ArgList::const_iterator it = Args.begin(),
128f78925f633e949f06521d9ffd937019e59f35efcDaniel Dunbar         ie = Args.end(); it != ie; ++it) {
129f78925f633e949f06521d9ffd937019e59f35efcDaniel Dunbar    const Arg *A = *it;
130f78925f633e949f06521d9ffd937019e59f35efcDaniel Dunbar
131f78925f633e949f06521d9ffd937019e59f35efcDaniel Dunbar    // Unfortunately, we have to parse some forwarding options (-Xassembler,
132f78925f633e949f06521d9ffd937019e59f35efcDaniel Dunbar    // -Xlinker, -Xpreprocessor) because we either integrate their functionality
133f78925f633e949f06521d9ffd937019e59f35efcDaniel Dunbar    // (assembler and preprocessor), or bypass a previous driver ('collect2').
134eda3f707fd53f90f4232b0e694d3f5514237aba5Daniel Dunbar
135eda3f707fd53f90f4232b0e694d3f5514237aba5Daniel Dunbar    // Rewrite linker options, to replace --no-demangle with a custom internal
136eda3f707fd53f90f4232b0e694d3f5514237aba5Daniel Dunbar    // option.
137eda3f707fd53f90f4232b0e694d3f5514237aba5Daniel Dunbar    if ((A->getOption().matches(options::OPT_Wl_COMMA) ||
138eda3f707fd53f90f4232b0e694d3f5514237aba5Daniel Dunbar         A->getOption().matches(options::OPT_Xlinker)) &&
139eda3f707fd53f90f4232b0e694d3f5514237aba5Daniel Dunbar        A->containsValue("--no-demangle")) {
140f78925f633e949f06521d9ffd937019e59f35efcDaniel Dunbar      // Add the rewritten no-demangle argument.
141f78925f633e949f06521d9ffd937019e59f35efcDaniel Dunbar      DAL->AddFlagArg(A, Opts->getOption(options::OPT_Z_Xlinker__no_demangle));
142f78925f633e949f06521d9ffd937019e59f35efcDaniel Dunbar
143f78925f633e949f06521d9ffd937019e59f35efcDaniel Dunbar      // Add the remaining values as Xlinker arguments.
144f78925f633e949f06521d9ffd937019e59f35efcDaniel Dunbar      for (unsigned i = 0, e = A->getNumValues(); i != e; ++i)
1455f9e272e632e951b1efe824cd16acb4d96077930Chris Lattner        if (StringRef(A->getValue(Args, i)) != "--no-demangle")
146f78925f633e949f06521d9ffd937019e59f35efcDaniel Dunbar          DAL->AddSeparateArg(A, Opts->getOption(options::OPT_Xlinker),
147f78925f633e949f06521d9ffd937019e59f35efcDaniel Dunbar                              A->getValue(Args, i));
148f78925f633e949f06521d9ffd937019e59f35efcDaniel Dunbar
149f78925f633e949f06521d9ffd937019e59f35efcDaniel Dunbar      continue;
150f78925f633e949f06521d9ffd937019e59f35efcDaniel Dunbar    }
151f78925f633e949f06521d9ffd937019e59f35efcDaniel Dunbar
152eda3f707fd53f90f4232b0e694d3f5514237aba5Daniel Dunbar    // Rewrite preprocessor options, to replace -Wp,-MD,FOO which is used by
153eda3f707fd53f90f4232b0e694d3f5514237aba5Daniel Dunbar    // some build systems. We don't try to be complete here because we don't
154eda3f707fd53f90f4232b0e694d3f5514237aba5Daniel Dunbar    // care to encourage this usage model.
155eda3f707fd53f90f4232b0e694d3f5514237aba5Daniel Dunbar    if (A->getOption().matches(options::OPT_Wp_COMMA) &&
156eda3f707fd53f90f4232b0e694d3f5514237aba5Daniel Dunbar        A->getNumValues() == 2 &&
1575f9e272e632e951b1efe824cd16acb4d96077930Chris Lattner        (A->getValue(Args, 0) == StringRef("-MD") ||
1585f9e272e632e951b1efe824cd16acb4d96077930Chris Lattner         A->getValue(Args, 0) == StringRef("-MMD"))) {
159212df32d955c34dbb8b976bc0316e8eb83ac579eDaniel Dunbar      // Rewrite to -MD/-MMD along with -MF.
1605f9e272e632e951b1efe824cd16acb4d96077930Chris Lattner      if (A->getValue(Args, 0) == StringRef("-MD"))
161212df32d955c34dbb8b976bc0316e8eb83ac579eDaniel Dunbar        DAL->AddFlagArg(A, Opts->getOption(options::OPT_MD));
162212df32d955c34dbb8b976bc0316e8eb83ac579eDaniel Dunbar      else
163212df32d955c34dbb8b976bc0316e8eb83ac579eDaniel Dunbar        DAL->AddFlagArg(A, Opts->getOption(options::OPT_MMD));
164eda3f707fd53f90f4232b0e694d3f5514237aba5Daniel Dunbar      DAL->AddSeparateArg(A, Opts->getOption(options::OPT_MF),
165eda3f707fd53f90f4232b0e694d3f5514237aba5Daniel Dunbar                          A->getValue(Args, 1));
166eda3f707fd53f90f4232b0e694d3f5514237aba5Daniel Dunbar      continue;
167eda3f707fd53f90f4232b0e694d3f5514237aba5Daniel Dunbar    }
168eda3f707fd53f90f4232b0e694d3f5514237aba5Daniel Dunbar
1697433fedce98a58341d0f30c2e12e8d53f3bba575Shantonu Sen    // Rewrite reserved library names.
1707433fedce98a58341d0f30c2e12e8d53f3bba575Shantonu Sen    if (A->getOption().matches(options::OPT_l)) {
1715f9e272e632e951b1efe824cd16acb4d96077930Chris Lattner      StringRef Value = A->getValue(Args);
172e5a37f48388c7e4cc081f44d13a4910bfa56cd35Daniel Dunbar
1737433fedce98a58341d0f30c2e12e8d53f3bba575Shantonu Sen      // Rewrite unless -nostdlib is present.
1747433fedce98a58341d0f30c2e12e8d53f3bba575Shantonu Sen      if (!HasNostdlib && Value == "stdc++") {
175e5a37f48388c7e4cc081f44d13a4910bfa56cd35Daniel Dunbar        DAL->AddFlagArg(A, Opts->getOption(
176e5a37f48388c7e4cc081f44d13a4910bfa56cd35Daniel Dunbar                              options::OPT_Z_reserved_lib_stdcxx));
177e5a37f48388c7e4cc081f44d13a4910bfa56cd35Daniel Dunbar        continue;
178e5a37f48388c7e4cc081f44d13a4910bfa56cd35Daniel Dunbar      }
1797433fedce98a58341d0f30c2e12e8d53f3bba575Shantonu Sen
1807433fedce98a58341d0f30c2e12e8d53f3bba575Shantonu Sen      // Rewrite unconditionally.
1817433fedce98a58341d0f30c2e12e8d53f3bba575Shantonu Sen      if (Value == "cc_kext") {
1827433fedce98a58341d0f30c2e12e8d53f3bba575Shantonu Sen        DAL->AddFlagArg(A, Opts->getOption(
1837433fedce98a58341d0f30c2e12e8d53f3bba575Shantonu Sen                              options::OPT_Z_reserved_lib_cckext));
1847433fedce98a58341d0f30c2e12e8d53f3bba575Shantonu Sen        continue;
1857433fedce98a58341d0f30c2e12e8d53f3bba575Shantonu Sen      }
186e5a37f48388c7e4cc081f44d13a4910bfa56cd35Daniel Dunbar    }
187e5a37f48388c7e4cc081f44d13a4910bfa56cd35Daniel Dunbar
188279c1dbebf37cd128f3c73c70741a6b8c35ad025Daniel Dunbar    DAL->append(*it);
189f78925f633e949f06521d9ffd937019e59f35efcDaniel Dunbar  }
190279c1dbebf37cd128f3c73c70741a6b8c35ad025Daniel Dunbar
191a77a723489b0cff63bf90f23416e10b8b6fc1f55Daniel Dunbar  // Add a default value of -mlinker-version=, if one was given and the user
192a77a723489b0cff63bf90f23416e10b8b6fc1f55Daniel Dunbar  // didn't specify one.
193a77a723489b0cff63bf90f23416e10b8b6fc1f55Daniel Dunbar#if defined(HOST_LINK_VERSION)
194a77a723489b0cff63bf90f23416e10b8b6fc1f55Daniel Dunbar  if (!Args.hasArg(options::OPT_mlinker_version_EQ)) {
195a77a723489b0cff63bf90f23416e10b8b6fc1f55Daniel Dunbar    DAL->AddJoinedArg(0, Opts->getOption(options::OPT_mlinker_version_EQ),
196a77a723489b0cff63bf90f23416e10b8b6fc1f55Daniel Dunbar                      HOST_LINK_VERSION);
197c326b64a4d14ad89d6a5d227d2460050149d5461Daniel Dunbar    DAL->getLastArg(options::OPT_mlinker_version_EQ)->claim();
198a77a723489b0cff63bf90f23416e10b8b6fc1f55Daniel Dunbar  }
199a77a723489b0cff63bf90f23416e10b8b6fc1f55Daniel Dunbar#endif
200a77a723489b0cff63bf90f23416e10b8b6fc1f55Daniel Dunbar
201279c1dbebf37cd128f3c73c70741a6b8c35ad025Daniel Dunbar  return DAL;
202279c1dbebf37cd128f3c73c70741a6b8c35ad025Daniel Dunbar}
203279c1dbebf37cd128f3c73c70741a6b8c35ad025Daniel Dunbar
2047f9fc3f7ce076645cb6aefc99c64d9446caf13d6Chris LattnerCompilation *Driver::BuildCompilation(llvm::ArrayRef<const char *> ArgList) {
2058f25c79e59d88df41c5a3cabba1c58035d384a6eDaniel Dunbar  llvm::PrettyStackTraceString CrashInfo("Compilation construction");
2068f25c79e59d88df41c5a3cabba1c58035d384a6eDaniel Dunbar
207a82318332c9e9b61d3d17371e675ca2859877ee5Daniel Dunbar  // FIXME: Handle environment options which effect driver behavior, somewhere
208a82318332c9e9b61d3d17371e675ca2859877ee5Daniel Dunbar  // (client?). GCC_EXEC_PREFIX, COMPILER_PATH, LIBRARY_PATH, LPATH,
209a82318332c9e9b61d3d17371e675ca2859877ee5Daniel Dunbar  // CC_PRINT_OPTIONS.
210cb881672c2c46142ec1bdfa401c9818ae805db0fDaniel Dunbar
211cb881672c2c46142ec1bdfa401c9818ae805db0fDaniel Dunbar  // FIXME: What are we going to do with -V and -b?
212cb881672c2c46142ec1bdfa401c9818ae805db0fDaniel Dunbar
213a82318332c9e9b61d3d17371e675ca2859877ee5Daniel Dunbar  // FIXME: This stuff needs to go into the Compilation, not the driver.
21453ec55215075c8f4ddd47ca6ed7d382f16beb670Daniel Dunbar  bool CCCPrintOptions = false, CCCPrintActions = false;
2150648262df75d97b464c2be0ed867da3615659785Daniel Dunbar
2167f9fc3f7ce076645cb6aefc99c64d9446caf13d6Chris Lattner  InputArgList *Args = ParseArgStrings(ArgList.slice(1));
2178477ee93c9d81d1b5fe321706ff95bcd219c744bDaniel Dunbar
2187ca7987669fcd14d91b4227a9ddcf7fdd8b1f8c2Rafael Espindola  // -no-canonical-prefixes is used very early in main.
2197ca7987669fcd14d91b4227a9ddcf7fdd8b1f8c2Rafael Espindola  Args->ClaimAllArgs(options::OPT_no_canonical_prefixes);
2207ca7987669fcd14d91b4227a9ddcf7fdd8b1f8c2Rafael Espindola
221c19a12dc3d441bec62eed55e312b76c12d6d9022Daniel Dunbar  // Ignore -pipe.
222c19a12dc3d441bec62eed55e312b76c12d6d9022Daniel Dunbar  Args->ClaimAllArgs(options::OPT_pipe);
223c19a12dc3d441bec62eed55e312b76c12d6d9022Daniel Dunbar
2248477ee93c9d81d1b5fe321706ff95bcd219c744bDaniel Dunbar  // Extract -ccc args.
225365c02f65be026f90e67a8e00e7b827cee60e228Daniel Dunbar  //
226a82318332c9e9b61d3d17371e675ca2859877ee5Daniel Dunbar  // FIXME: We need to figure out where this behavior should live. Most of it
227a82318332c9e9b61d3d17371e675ca2859877ee5Daniel Dunbar  // should be outside in the client; the parts that aren't should have proper
228a82318332c9e9b61d3d17371e675ca2859877ee5Daniel Dunbar  // options, either by introducing new ones or by overloading gcc ones like -V
229a82318332c9e9b61d3d17371e675ca2859877ee5Daniel Dunbar  // or -b.
2308477ee93c9d81d1b5fe321706ff95bcd219c744bDaniel Dunbar  CCCPrintOptions = Args->hasArg(options::OPT_ccc_print_options);
2318477ee93c9d81d1b5fe321706ff95bcd219c744bDaniel Dunbar  CCCPrintActions = Args->hasArg(options::OPT_ccc_print_phases);
2328477ee93c9d81d1b5fe321706ff95bcd219c744bDaniel Dunbar  CCCPrintBindings = Args->hasArg(options::OPT_ccc_print_bindings);
233f5431e3563a64758584906cb9e0d10719a0756ecDaniel Dunbar  CCCIsCXX = Args->hasArg(options::OPT_ccc_cxx) || CCCIsCXX;
2348477ee93c9d81d1b5fe321706ff95bcd219c744bDaniel Dunbar  CCCEcho = Args->hasArg(options::OPT_ccc_echo);
2358477ee93c9d81d1b5fe321706ff95bcd219c744bDaniel Dunbar  if (const Arg *A = Args->getLastArg(options::OPT_ccc_gcc_name))
2368477ee93c9d81d1b5fe321706ff95bcd219c744bDaniel Dunbar    CCCGenericGCCName = A->getValue(*Args);
2378477ee93c9d81d1b5fe321706ff95bcd219c744bDaniel Dunbar  CCCUseClangCXX = Args->hasFlag(options::OPT_ccc_clang_cxx,
238f5431e3563a64758584906cb9e0d10719a0756ecDaniel Dunbar                                 options::OPT_ccc_no_clang_cxx,
239f5431e3563a64758584906cb9e0d10719a0756ecDaniel Dunbar                                 CCCUseClangCXX);
2408477ee93c9d81d1b5fe321706ff95bcd219c744bDaniel Dunbar  CCCUsePCH = Args->hasFlag(options::OPT_ccc_pch_is_pch,
2418477ee93c9d81d1b5fe321706ff95bcd219c744bDaniel Dunbar                            options::OPT_ccc_pch_is_pth);
2428477ee93c9d81d1b5fe321706ff95bcd219c744bDaniel Dunbar  CCCUseClang = !Args->hasArg(options::OPT_ccc_no_clang);
2438477ee93c9d81d1b5fe321706ff95bcd219c744bDaniel Dunbar  CCCUseClangCPP = !Args->hasArg(options::OPT_ccc_no_clang_cpp);
2448477ee93c9d81d1b5fe321706ff95bcd219c744bDaniel Dunbar  if (const Arg *A = Args->getLastArg(options::OPT_ccc_clang_archs)) {
2455f9e272e632e951b1efe824cd16acb4d96077930Chris Lattner    StringRef Cur = A->getValue(*Args);
2468477ee93c9d81d1b5fe321706ff95bcd219c744bDaniel Dunbar
2478477ee93c9d81d1b5fe321706ff95bcd219c744bDaniel Dunbar    CCCClangArchs.clear();
2488477ee93c9d81d1b5fe321706ff95bcd219c744bDaniel Dunbar    while (!Cur.empty()) {
2495f9e272e632e951b1efe824cd16acb4d96077930Chris Lattner      std::pair<StringRef, StringRef> Split = Cur.split(',');
2508477ee93c9d81d1b5fe321706ff95bcd219c744bDaniel Dunbar
2518477ee93c9d81d1b5fe321706ff95bcd219c744bDaniel Dunbar      if (!Split.first.empty()) {
2528477ee93c9d81d1b5fe321706ff95bcd219c744bDaniel Dunbar        llvm::Triple::ArchType Arch =
2538477ee93c9d81d1b5fe321706ff95bcd219c744bDaniel Dunbar          llvm::Triple(Split.first, "", "").getArch();
2548477ee93c9d81d1b5fe321706ff95bcd219c744bDaniel Dunbar
255e9c7b9ef2f2054401d099dc7666a4143ef14089dDaniel Dunbar        if (Arch == llvm::Triple::UnknownArch)
256e9c7b9ef2f2054401d099dc7666a4143ef14089dDaniel Dunbar          Diag(clang::diag::err_drv_invalid_arch_name) << Split.first;
257365c02f65be026f90e67a8e00e7b827cee60e228Daniel Dunbar
2588477ee93c9d81d1b5fe321706ff95bcd219c744bDaniel Dunbar        CCCClangArchs.insert(Arch);
259a6046bec7fc835186dde134fb81aa1b7d45cd9f0Daniel Dunbar      }
2608477ee93c9d81d1b5fe321706ff95bcd219c744bDaniel Dunbar
2618477ee93c9d81d1b5fe321706ff95bcd219c744bDaniel Dunbar      Cur = Split.second;
262365c02f65be026f90e67a8e00e7b827cee60e228Daniel Dunbar    }
263365c02f65be026f90e67a8e00e7b827cee60e228Daniel Dunbar  }
2646699877c45d119ca74e4c1d7c3c9fb90e95398e1Daniel Dunbar  // FIXME: We shouldn't overwrite the default host triple here, but we have
2656699877c45d119ca74e4c1d7c3c9fb90e95398e1Daniel Dunbar  // nowhere else to put this currently.
2668477ee93c9d81d1b5fe321706ff95bcd219c744bDaniel Dunbar  if (const Arg *A = Args->getLastArg(options::OPT_ccc_host_triple))
2676699877c45d119ca74e4c1d7c3c9fb90e95398e1Daniel Dunbar    DefaultHostTriple = A->getValue(*Args);
2688477ee93c9d81d1b5fe321706ff95bcd219c744bDaniel Dunbar  if (const Arg *A = Args->getLastArg(options::OPT_ccc_install_dir))
269c4ab3493bb3048014895cf577a8f27505a83603dDaniel Dunbar    Dir = InstalledDir = A->getValue(*Args);
27009982cec0029bc495591067fa89967b6b4d1fa19Benjamin Kramer  for (arg_iterator it = Args->filtered_begin(options::OPT_B),
27109982cec0029bc495591067fa89967b6b4d1fa19Benjamin Kramer         ie = Args->filtered_end(); it != ie; ++it) {
27209982cec0029bc495591067fa89967b6b4d1fa19Benjamin Kramer    const Arg *A = *it;
27309982cec0029bc495591067fa89967b6b4d1fa19Benjamin Kramer    A->claim();
27409982cec0029bc495591067fa89967b6b4d1fa19Benjamin Kramer    PrefixDirs.push_back(A->getValue(*Args, 0));
27509982cec0029bc495591067fa89967b6b4d1fa19Benjamin Kramer  }
2768ab2bdcc4f397e100c684ede8e8ca6e226e1380aJoerg Sonnenberger  if (const Arg *A = Args->getLastArg(options::OPT__sysroot_EQ))
2778ab2bdcc4f397e100c684ede8e8ca6e226e1380aJoerg Sonnenberger    SysRoot = A->getValue(*Args);
27805e5930166333e382522b942f00d08abc6c0a28eJoerg Sonnenberger  if (Args->hasArg(options::OPT_nostdlib))
27905e5930166333e382522b942f00d08abc6c0a28eJoerg Sonnenberger    UseStdLib = false;
280365c02f65be026f90e67a8e00e7b827cee60e228Daniel Dunbar
2816699877c45d119ca74e4c1d7c3c9fb90e95398e1Daniel Dunbar  Host = GetHostInfo(DefaultHostTriple.c_str());
282cb881672c2c46142ec1bdfa401c9818ae805db0fDaniel Dunbar
283279c1dbebf37cd128f3c73c70741a6b8c35ad025Daniel Dunbar  // Perform the default argument translations.
284279c1dbebf37cd128f3c73c70741a6b8c35ad025Daniel Dunbar  DerivedArgList *TranslatedArgs = TranslateInputArgs(*Args);
285279c1dbebf37cd128f3c73c70741a6b8c35ad025Daniel Dunbar
28621549237f14505cfc2a18a06416372a36229d0ceDaniel Dunbar  // The compilation takes ownership of Args.
287279c1dbebf37cd128f3c73c70741a6b8c35ad025Daniel Dunbar  Compilation *C = new Compilation(*this, *Host->CreateToolChain(*Args), Args,
288279c1dbebf37cd128f3c73c70741a6b8c35ad025Daniel Dunbar                                   TranslatedArgs);
28921549237f14505cfc2a18a06416372a36229d0ceDaniel Dunbar
290365c02f65be026f90e67a8e00e7b827cee60e228Daniel Dunbar  // FIXME: This behavior shouldn't be here.
291365c02f65be026f90e67a8e00e7b827cee60e228Daniel Dunbar  if (CCCPrintOptions) {
292be21cd0f07726045367861d3882d18ef30f6a30cDaniel Dunbar    PrintOptions(C->getInputArgs());
29321549237f14505cfc2a18a06416372a36229d0ceDaniel Dunbar    return C;
294365c02f65be026f90e67a8e00e7b827cee60e228Daniel Dunbar  }
29553ec55215075c8f4ddd47ca6ed7d382f16beb670Daniel Dunbar
29621549237f14505cfc2a18a06416372a36229d0ceDaniel Dunbar  if (!HandleImmediateArgs(*C))
29721549237f14505cfc2a18a06416372a36229d0ceDaniel Dunbar    return C;
298cb881672c2c46142ec1bdfa401c9818ae805db0fDaniel Dunbar
29974edcea3db1f85ba73ad0fede2ed5e2f096cac4bDaniel Dunbar  // Construct the list of abstract actions to perform for this compilation.
30053ec55215075c8f4ddd47ca6ed7d382f16beb670Daniel Dunbar  if (Host->useDriverDriver())
30165f7165676854bf75494f5b73a620d7237db5d41Joerg Sonnenberger    BuildUniversalActions(C->getDefaultToolChain(), C->getArgs(),
30274edcea3db1f85ba73ad0fede2ed5e2f096cac4bDaniel Dunbar                          C->getActions());
30353ec55215075c8f4ddd47ca6ed7d382f16beb670Daniel Dunbar  else
30465f7165676854bf75494f5b73a620d7237db5d41Joerg Sonnenberger    BuildActions(C->getDefaultToolChain(), C->getArgs(), C->getActions());
30553ec55215075c8f4ddd47ca6ed7d382f16beb670Daniel Dunbar
30653ec55215075c8f4ddd47ca6ed7d382f16beb670Daniel Dunbar  if (CCCPrintActions) {
30710ffa9a4887d9376e3eb3598e40523d1b58773c9Daniel Dunbar    PrintActions(*C);
30821549237f14505cfc2a18a06416372a36229d0ceDaniel Dunbar    return C;
30953ec55215075c8f4ddd47ca6ed7d382f16beb670Daniel Dunbar  }
310ab835430b4f758dd49903251c7c7f21b95933c89Daniel Dunbar
31121549237f14505cfc2a18a06416372a36229d0ceDaniel Dunbar  BuildJobs(*C);
3128d2554a2c3201aa664cbf2108cf9d57aa0aa4b0aDaniel Dunbar
3138d2554a2c3201aa664cbf2108cf9d57aa0aa4b0aDaniel Dunbar  return C;
314365c02f65be026f90e67a8e00e7b827cee60e228Daniel Dunbar}
315365c02f65be026f90e67a8e00e7b827cee60e228Daniel Dunbar
316d7a3ba03f69892aac02e0771eb2e6d1b7b1d1267Chad Rosierint Driver::ExecuteCompilation(const Compilation &C) const {
317c88a88f6f7672b6bb831dce9da4acfa0c846975fDaniel Dunbar  // Just print if -### was present.
318c88a88f6f7672b6bb831dce9da4acfa0c846975fDaniel Dunbar  if (C.getArgs().hasArg(options::OPT__HASH_HASH_HASH)) {
319c88a88f6f7672b6bb831dce9da4acfa0c846975fDaniel Dunbar    C.PrintJob(llvm::errs(), C.getJobs(), "\n", true);
320c88a88f6f7672b6bb831dce9da4acfa0c846975fDaniel Dunbar    return 0;
321c88a88f6f7672b6bb831dce9da4acfa0c846975fDaniel Dunbar  }
322c88a88f6f7672b6bb831dce9da4acfa0c846975fDaniel Dunbar
323c88a88f6f7672b6bb831dce9da4acfa0c846975fDaniel Dunbar  // If there were errors building the compilation, quit now.
324d7a3ba03f69892aac02e0771eb2e6d1b7b1d1267Chad Rosier  if (getDiags().hasErrorOccurred())
325c88a88f6f7672b6bb831dce9da4acfa0c846975fDaniel Dunbar    return 1;
326c88a88f6f7672b6bb831dce9da4acfa0c846975fDaniel Dunbar
327d7a3ba03f69892aac02e0771eb2e6d1b7b1d1267Chad Rosier  const Command *FailingCommand = 0;
328c88a88f6f7672b6bb831dce9da4acfa0c846975fDaniel Dunbar  int Res = C.ExecuteJob(C.getJobs(), FailingCommand);
329a82318332c9e9b61d3d17371e675ca2859877ee5Daniel Dunbar
330c88a88f6f7672b6bb831dce9da4acfa0c846975fDaniel Dunbar  // Remove temp files.
331c88a88f6f7672b6bb831dce9da4acfa0c846975fDaniel Dunbar  C.CleanupFileList(C.getTempFiles());
332c88a88f6f7672b6bb831dce9da4acfa0c846975fDaniel Dunbar
3339fcbc050a704cc5bb46e1c493940aca7c79aebf9Daniel Dunbar  // If the command succeeded, we are done.
3349fcbc050a704cc5bb46e1c493940aca7c79aebf9Daniel Dunbar  if (Res == 0)
3359fcbc050a704cc5bb46e1c493940aca7c79aebf9Daniel Dunbar    return Res;
3369fcbc050a704cc5bb46e1c493940aca7c79aebf9Daniel Dunbar
3379fcbc050a704cc5bb46e1c493940aca7c79aebf9Daniel Dunbar  // Otherwise, remove result files as well.
3389fcbc050a704cc5bb46e1c493940aca7c79aebf9Daniel Dunbar  if (!C.getArgs().hasArg(options::OPT_save_temps))
339c88a88f6f7672b6bb831dce9da4acfa0c846975fDaniel Dunbar    C.CleanupFileList(C.getResultFiles(), true);
340c88a88f6f7672b6bb831dce9da4acfa0c846975fDaniel Dunbar
341c88a88f6f7672b6bb831dce9da4acfa0c846975fDaniel Dunbar  // Print extra information about abnormal failures, if possible.
3429fcbc050a704cc5bb46e1c493940aca7c79aebf9Daniel Dunbar  //
3439fcbc050a704cc5bb46e1c493940aca7c79aebf9Daniel Dunbar  // This is ad-hoc, but we don't want to be excessively noisy. If the result
3449fcbc050a704cc5bb46e1c493940aca7c79aebf9Daniel Dunbar  // status was 1, assume the command failed normally. In particular, if it was
3459fcbc050a704cc5bb46e1c493940aca7c79aebf9Daniel Dunbar  // the compiler then assume it gave a reasonable error code. Failures in other
3469fcbc050a704cc5bb46e1c493940aca7c79aebf9Daniel Dunbar  // tools are less common, and they generally have worse diagnostics, so always
3479fcbc050a704cc5bb46e1c493940aca7c79aebf9Daniel Dunbar  // print the diagnostic there.
3489fcbc050a704cc5bb46e1c493940aca7c79aebf9Daniel Dunbar  const Tool &FailingTool = FailingCommand->getCreator();
3499fcbc050a704cc5bb46e1c493940aca7c79aebf9Daniel Dunbar
3509fcbc050a704cc5bb46e1c493940aca7c79aebf9Daniel Dunbar  if (!FailingCommand->getCreator().hasGoodDiagnostics() || Res != 1) {
3519fcbc050a704cc5bb46e1c493940aca7c79aebf9Daniel Dunbar    // FIXME: See FIXME above regarding result code interpretation.
3529fcbc050a704cc5bb46e1c493940aca7c79aebf9Daniel Dunbar    if (Res < 0)
3539fcbc050a704cc5bb46e1c493940aca7c79aebf9Daniel Dunbar      Diag(clang::diag::err_drv_command_signalled)
3549fcbc050a704cc5bb46e1c493940aca7c79aebf9Daniel Dunbar        << FailingTool.getShortName() << -Res;
3559fcbc050a704cc5bb46e1c493940aca7c79aebf9Daniel Dunbar    else
3569fcbc050a704cc5bb46e1c493940aca7c79aebf9Daniel Dunbar      Diag(clang::diag::err_drv_command_failed)
3579fcbc050a704cc5bb46e1c493940aca7c79aebf9Daniel Dunbar        << FailingTool.getShortName() << Res;
358c88a88f6f7672b6bb831dce9da4acfa0c846975fDaniel Dunbar  }
359c88a88f6f7672b6bb831dce9da4acfa0c846975fDaniel Dunbar
360c88a88f6f7672b6bb831dce9da4acfa0c846975fDaniel Dunbar  return Res;
361c88a88f6f7672b6bb831dce9da4acfa0c846975fDaniel Dunbar}
362c88a88f6f7672b6bb831dce9da4acfa0c846975fDaniel Dunbar
363d65bddcbe1385a4de212ecbbdc8919c54b3efeb0Daniel Dunbarvoid Driver::PrintOptions(const ArgList &Args) const {
3640648262df75d97b464c2be0ed867da3615659785Daniel Dunbar  unsigned i = 0;
365a82318332c9e9b61d3d17371e675ca2859877ee5Daniel Dunbar  for (ArgList::const_iterator it = Args.begin(), ie = Args.end();
3660648262df75d97b464c2be0ed867da3615659785Daniel Dunbar       it != ie; ++it, ++i) {
3670648262df75d97b464c2be0ed867da3615659785Daniel Dunbar    Arg *A = *it;
3680648262df75d97b464c2be0ed867da3615659785Daniel Dunbar    llvm::errs() << "Option " << i << " - "
3690648262df75d97b464c2be0ed867da3615659785Daniel Dunbar                 << "Name: \"" << A->getOption().getName() << "\", "
3700648262df75d97b464c2be0ed867da3615659785Daniel Dunbar                 << "Values: {";
3710648262df75d97b464c2be0ed867da3615659785Daniel Dunbar    for (unsigned j = 0; j < A->getNumValues(); ++j) {
3720648262df75d97b464c2be0ed867da3615659785Daniel Dunbar      if (j)
3730648262df75d97b464c2be0ed867da3615659785Daniel Dunbar        llvm::errs() << ", ";
37453ec55215075c8f4ddd47ca6ed7d382f16beb670Daniel Dunbar      llvm::errs() << '"' << A->getValue(Args, j) << '"';
3750648262df75d97b464c2be0ed867da3615659785Daniel Dunbar    }
3760648262df75d97b464c2be0ed867da3615659785Daniel Dunbar    llvm::errs() << "}\n";
3770648262df75d97b464c2be0ed867da3615659785Daniel Dunbar  }
3783ede8d0a7d1813f678ccc6011a99a0834b1b6116Daniel Dunbar}
379dd98e2cad165ca73c769e4f105a4e47c2216387aDaniel Dunbar
380c35d71f1e0a0c72fd43a73ddecd408bf43d501deDaniel Dunbarvoid Driver::PrintHelp(bool ShowHidden) const {
38143302d4144b5291961aa160d2fe191c09a9d8ad1Daniel Dunbar  getOpts().PrintHelp(llvm::outs(), Name.c_str(), DriverTitle.c_str(),
38243302d4144b5291961aa160d2fe191c09a9d8ad1Daniel Dunbar                      ShowHidden);
38391e28afe3503893c69afd71877f11e3bf03fa4ceDaniel Dunbar}
38491e28afe3503893c69afd71877f11e3bf03fa4ceDaniel Dunbar
3855f9e272e632e951b1efe824cd16acb4d96077930Chris Lattnervoid Driver::PrintVersion(const Compilation &C, raw_ostream &OS) const {
386a82318332c9e9b61d3d17371e675ca2859877ee5Daniel Dunbar  // FIXME: The following handlers should use a callback mechanism, we don't
387a82318332c9e9b61d3d17371e675ca2859877ee5Daniel Dunbar  // know what the client would like to do.
388a18f1b88a7ef3d2c944bb1d3b6586a2860ce2baaTed Kremenek  OS << getClangFullVersion() << '\n';
38970c8db1003af49d3627aeef41fcdd7c6c6a7df79Daniel Dunbar  const ToolChain &TC = C.getDefaultToolChain();
390793007242ba209b68ce14ec7547ac70ee981303aDaniel Dunbar  OS << "Target: " << TC.getTripleString() << '\n';
3913ee96baa3fff269e145855a6f7526c36e59a7f4bDaniel Dunbar
3923ee96baa3fff269e145855a6f7526c36e59a7f4bDaniel Dunbar  // Print the threading model.
3933ee96baa3fff269e145855a6f7526c36e59a7f4bDaniel Dunbar  //
3943ee96baa3fff269e145855a6f7526c36e59a7f4bDaniel Dunbar  // FIXME: Implement correctly.
395793007242ba209b68ce14ec7547ac70ee981303aDaniel Dunbar  OS << "Thread model: " << "posix" << '\n';
396cb881672c2c46142ec1bdfa401c9818ae805db0fDaniel Dunbar}
397cb881672c2c46142ec1bdfa401c9818ae805db0fDaniel Dunbar
398c3d26cc4eea5187ce13ed180b479ff8ef41015a7Chris Lattner/// PrintDiagnosticCategories - Implement the --print-diagnostic-categories
399c3d26cc4eea5187ce13ed180b479ff8ef41015a7Chris Lattner/// option.
4005f9e272e632e951b1efe824cd16acb4d96077930Chris Lattnerstatic void PrintDiagnosticCategories(raw_ostream &OS) {
401477aab6782795e7472055a54108d2df270ce1a89Argyrios Kyrtzidis  // Skip the empty category.
402477aab6782795e7472055a54108d2df270ce1a89Argyrios Kyrtzidis  for (unsigned i = 1, max = DiagnosticIDs::getNumberOfCategories();
403477aab6782795e7472055a54108d2df270ce1a89Argyrios Kyrtzidis       i != max; ++i)
404477aab6782795e7472055a54108d2df270ce1a89Argyrios Kyrtzidis    OS << i << ',' << DiagnosticIDs::getCategoryNameFromID(i) << '\n';
405c3d26cc4eea5187ce13ed180b479ff8ef41015a7Chris Lattner}
406c3d26cc4eea5187ce13ed180b479ff8ef41015a7Chris Lattner
40721549237f14505cfc2a18a06416372a36229d0ceDaniel Dunbarbool Driver::HandleImmediateArgs(const Compilation &C) {
408e82ec0bead14ae262cddbe958b77767a3f6aebcdDaniel Dunbar  // The order these options are handled in gcc is all over the place, but we
409a82318332c9e9b61d3d17371e675ca2859877ee5Daniel Dunbar  // don't expect inconsistencies w.r.t. that to matter in practice.
41091e28afe3503893c69afd71877f11e3bf03fa4ceDaniel Dunbar
411d829950b2b75d50fca2772a20129323a186993a5Daniel Dunbar  if (C.getArgs().hasArg(options::OPT_dumpmachine)) {
412d829950b2b75d50fca2772a20129323a186993a5Daniel Dunbar    llvm::outs() << C.getDefaultToolChain().getTripleString() << '\n';
413d829950b2b75d50fca2772a20129323a186993a5Daniel Dunbar    return false;
414d829950b2b75d50fca2772a20129323a186993a5Daniel Dunbar  }
415d829950b2b75d50fca2772a20129323a186993a5Daniel Dunbar
416e06dc219a869d73b6c9a398a2dee0aa2d4e2dcf0Daniel Dunbar  if (C.getArgs().hasArg(options::OPT_dumpversion)) {
41795a907fc0f2f717dca38a379c1d2353bfea06d4fDaniel Dunbar    // Since -dumpversion is only implemented for pedantic GCC compatibility, we
41895a907fc0f2f717dca38a379c1d2353bfea06d4fDaniel Dunbar    // return an answer which matches our definition of __VERSION__.
41995a907fc0f2f717dca38a379c1d2353bfea06d4fDaniel Dunbar    //
42095a907fc0f2f717dca38a379c1d2353bfea06d4fDaniel Dunbar    // If we want to return a more correct answer some day, then we should
42195a907fc0f2f717dca38a379c1d2353bfea06d4fDaniel Dunbar    // introduce a non-pedantically GCC compatible mode to Clang in which we
42295a907fc0f2f717dca38a379c1d2353bfea06d4fDaniel Dunbar    // provide sensible definitions for -dumpversion, __VERSION__, etc.
42395a907fc0f2f717dca38a379c1d2353bfea06d4fDaniel Dunbar    llvm::outs() << "4.2.1\n";
424e06dc219a869d73b6c9a398a2dee0aa2d4e2dcf0Daniel Dunbar    return false;
425e06dc219a869d73b6c9a398a2dee0aa2d4e2dcf0Daniel Dunbar  }
426f78925f633e949f06521d9ffd937019e59f35efcDaniel Dunbar
427c3d26cc4eea5187ce13ed180b479ff8ef41015a7Chris Lattner  if (C.getArgs().hasArg(options::OPT__print_diagnostic_categories)) {
428c3d26cc4eea5187ce13ed180b479ff8ef41015a7Chris Lattner    PrintDiagnosticCategories(llvm::outs());
429c3d26cc4eea5187ce13ed180b479ff8ef41015a7Chris Lattner    return false;
430c3d26cc4eea5187ce13ed180b479ff8ef41015a7Chris Lattner  }
431e06dc219a869d73b6c9a398a2dee0aa2d4e2dcf0Daniel Dunbar
432a82318332c9e9b61d3d17371e675ca2859877ee5Daniel Dunbar  if (C.getArgs().hasArg(options::OPT__help) ||
433c35d71f1e0a0c72fd43a73ddecd408bf43d501deDaniel Dunbar      C.getArgs().hasArg(options::OPT__help_hidden)) {
434c35d71f1e0a0c72fd43a73ddecd408bf43d501deDaniel Dunbar    PrintHelp(C.getArgs().hasArg(options::OPT__help_hidden));
43591e28afe3503893c69afd71877f11e3bf03fa4ceDaniel Dunbar    return false;
43691e28afe3503893c69afd71877f11e3bf03fa4ceDaniel Dunbar  }
43791e28afe3503893c69afd71877f11e3bf03fa4ceDaniel Dunbar
4386cc73de6ebb3eb00af7dd5149f6778318f1fb76fDaniel Dunbar  if (C.getArgs().hasArg(options::OPT__version)) {
439a82318332c9e9b61d3d17371e675ca2859877ee5Daniel Dunbar    // Follow gcc behavior and use stdout for --version and stderr for -v.
440793007242ba209b68ce14ec7547ac70ee981303aDaniel Dunbar    PrintVersion(C, llvm::outs());
4416cc73de6ebb3eb00af7dd5149f6778318f1fb76fDaniel Dunbar    return false;
4426cc73de6ebb3eb00af7dd5149f6778318f1fb76fDaniel Dunbar  }
4436cc73de6ebb3eb00af7dd5149f6778318f1fb76fDaniel Dunbar
444a82318332c9e9b61d3d17371e675ca2859877ee5Daniel Dunbar  if (C.getArgs().hasArg(options::OPT_v) ||
44521549237f14505cfc2a18a06416372a36229d0ceDaniel Dunbar      C.getArgs().hasArg(options::OPT__HASH_HASH_HASH)) {
446793007242ba209b68ce14ec7547ac70ee981303aDaniel Dunbar    PrintVersion(C, llvm::errs());
447cb881672c2c46142ec1bdfa401c9818ae805db0fDaniel Dunbar    SuppressMissingInputWarning = true;
448cb881672c2c46142ec1bdfa401c9818ae805db0fDaniel Dunbar  }
449cb881672c2c46142ec1bdfa401c9818ae805db0fDaniel Dunbar
45021549237f14505cfc2a18a06416372a36229d0ceDaniel Dunbar  const ToolChain &TC = C.getDefaultToolChain();
451ca3459e95f552cfae6c9c5fb4ed161e3a662c25eDaniel Dunbar  if (C.getArgs().hasArg(options::OPT_print_search_dirs)) {
452ca3459e95f552cfae6c9c5fb4ed161e3a662c25eDaniel Dunbar    llvm::outs() << "programs: =";
453ca3459e95f552cfae6c9c5fb4ed161e3a662c25eDaniel Dunbar    for (ToolChain::path_list::const_iterator it = TC.getProgramPaths().begin(),
454ca3459e95f552cfae6c9c5fb4ed161e3a662c25eDaniel Dunbar           ie = TC.getProgramPaths().end(); it != ie; ++it) {
455ca3459e95f552cfae6c9c5fb4ed161e3a662c25eDaniel Dunbar      if (it != TC.getProgramPaths().begin())
456ca3459e95f552cfae6c9c5fb4ed161e3a662c25eDaniel Dunbar        llvm::outs() << ':';
457ca3459e95f552cfae6c9c5fb4ed161e3a662c25eDaniel Dunbar      llvm::outs() << *it;
458ca3459e95f552cfae6c9c5fb4ed161e3a662c25eDaniel Dunbar    }
459ca3459e95f552cfae6c9c5fb4ed161e3a662c25eDaniel Dunbar    llvm::outs() << "\n";
460ca3459e95f552cfae6c9c5fb4ed161e3a662c25eDaniel Dunbar    llvm::outs() << "libraries: =";
46159c8457f01f908e75d0e61ec3bd99cebcd672ceeJoerg Sonnenberger
46259c8457f01f908e75d0e61ec3bd99cebcd672ceeJoerg Sonnenberger    std::string sysroot;
46359c8457f01f908e75d0e61ec3bd99cebcd672ceeJoerg Sonnenberger    if (Arg *A = C.getArgs().getLastArg(options::OPT__sysroot_EQ))
46459c8457f01f908e75d0e61ec3bd99cebcd672ceeJoerg Sonnenberger      sysroot = A->getValue(C.getArgs());
46559c8457f01f908e75d0e61ec3bd99cebcd672ceeJoerg Sonnenberger
466a82318332c9e9b61d3d17371e675ca2859877ee5Daniel Dunbar    for (ToolChain::path_list::const_iterator it = TC.getFilePaths().begin(),
467ca3459e95f552cfae6c9c5fb4ed161e3a662c25eDaniel Dunbar           ie = TC.getFilePaths().end(); it != ie; ++it) {
468ca3459e95f552cfae6c9c5fb4ed161e3a662c25eDaniel Dunbar      if (it != TC.getFilePaths().begin())
469ca3459e95f552cfae6c9c5fb4ed161e3a662c25eDaniel Dunbar        llvm::outs() << ':';
47059c8457f01f908e75d0e61ec3bd99cebcd672ceeJoerg Sonnenberger      const char *path = it->c_str();
47159c8457f01f908e75d0e61ec3bd99cebcd672ceeJoerg Sonnenberger      if (path[0] == '=')
47259c8457f01f908e75d0e61ec3bd99cebcd672ceeJoerg Sonnenberger        llvm::outs() << sysroot << path + 1;
47359c8457f01f908e75d0e61ec3bd99cebcd672ceeJoerg Sonnenberger      else
47459c8457f01f908e75d0e61ec3bd99cebcd672ceeJoerg Sonnenberger        llvm::outs() << path;
475ca3459e95f552cfae6c9c5fb4ed161e3a662c25eDaniel Dunbar    }
476ca3459e95f552cfae6c9c5fb4ed161e3a662c25eDaniel Dunbar    llvm::outs() << "\n";
47791e28afe3503893c69afd71877f11e3bf03fa4ceDaniel Dunbar    return false;
478ca3459e95f552cfae6c9c5fb4ed161e3a662c25eDaniel Dunbar  }
479ca3459e95f552cfae6c9c5fb4ed161e3a662c25eDaniel Dunbar
480a82318332c9e9b61d3d17371e675ca2859877ee5Daniel Dunbar  // FIXME: The following handlers should use a callback mechanism, we don't
481a82318332c9e9b61d3d17371e675ca2859877ee5Daniel Dunbar  // know what the client would like to do.
48221549237f14505cfc2a18a06416372a36229d0ceDaniel Dunbar  if (Arg *A = C.getArgs().getLastArg(options::OPT_print_file_name_EQ)) {
4835ed34f4c58b6ad4e21038d713c1fae31a6146ff5Daniel Dunbar    llvm::outs() << GetFilePath(A->getValue(C.getArgs()), TC) << "\n";
484cb881672c2c46142ec1bdfa401c9818ae805db0fDaniel Dunbar    return false;
485cb881672c2c46142ec1bdfa401c9818ae805db0fDaniel Dunbar  }
486cb881672c2c46142ec1bdfa401c9818ae805db0fDaniel Dunbar
48721549237f14505cfc2a18a06416372a36229d0ceDaniel Dunbar  if (Arg *A = C.getArgs().getLastArg(options::OPT_print_prog_name_EQ)) {
4885ed34f4c58b6ad4e21038d713c1fae31a6146ff5Daniel Dunbar    llvm::outs() << GetProgramPath(A->getValue(C.getArgs()), TC) << "\n";
489cb881672c2c46142ec1bdfa401c9818ae805db0fDaniel Dunbar    return false;
490cb881672c2c46142ec1bdfa401c9818ae805db0fDaniel Dunbar  }
491cb881672c2c46142ec1bdfa401c9818ae805db0fDaniel Dunbar
49221549237f14505cfc2a18a06416372a36229d0ceDaniel Dunbar  if (C.getArgs().hasArg(options::OPT_print_libgcc_file_name)) {
4935ed34f4c58b6ad4e21038d713c1fae31a6146ff5Daniel Dunbar    llvm::outs() << GetFilePath("libgcc.a", TC) << "\n";
494cb881672c2c46142ec1bdfa401c9818ae805db0fDaniel Dunbar    return false;
495cb881672c2c46142ec1bdfa401c9818ae805db0fDaniel Dunbar  }
496cb881672c2c46142ec1bdfa401c9818ae805db0fDaniel Dunbar
49712cfe036d809173a25af0104844d4bb66a92252bDaniel Dunbar  if (C.getArgs().hasArg(options::OPT_print_multi_lib)) {
49812cfe036d809173a25af0104844d4bb66a92252bDaniel Dunbar    // FIXME: We need tool chain support for this.
49912cfe036d809173a25af0104844d4bb66a92252bDaniel Dunbar    llvm::outs() << ".;\n";
50012cfe036d809173a25af0104844d4bb66a92252bDaniel Dunbar
50112cfe036d809173a25af0104844d4bb66a92252bDaniel Dunbar    switch (C.getDefaultToolChain().getTriple().getArch()) {
50212cfe036d809173a25af0104844d4bb66a92252bDaniel Dunbar    default:
50312cfe036d809173a25af0104844d4bb66a92252bDaniel Dunbar      break;
504a82318332c9e9b61d3d17371e675ca2859877ee5Daniel Dunbar
50512cfe036d809173a25af0104844d4bb66a92252bDaniel Dunbar    case llvm::Triple::x86_64:
50612cfe036d809173a25af0104844d4bb66a92252bDaniel Dunbar      llvm::outs() << "x86_64;@m64" << "\n";
50712cfe036d809173a25af0104844d4bb66a92252bDaniel Dunbar      break;
50812cfe036d809173a25af0104844d4bb66a92252bDaniel Dunbar
50912cfe036d809173a25af0104844d4bb66a92252bDaniel Dunbar    case llvm::Triple::ppc64:
51012cfe036d809173a25af0104844d4bb66a92252bDaniel Dunbar      llvm::outs() << "ppc64;@m64" << "\n";
51112cfe036d809173a25af0104844d4bb66a92252bDaniel Dunbar      break;
51212cfe036d809173a25af0104844d4bb66a92252bDaniel Dunbar    }
51312cfe036d809173a25af0104844d4bb66a92252bDaniel Dunbar    return false;
51412cfe036d809173a25af0104844d4bb66a92252bDaniel Dunbar  }
51512cfe036d809173a25af0104844d4bb66a92252bDaniel Dunbar
51612cfe036d809173a25af0104844d4bb66a92252bDaniel Dunbar  // FIXME: What is the difference between print-multi-directory and
51712cfe036d809173a25af0104844d4bb66a92252bDaniel Dunbar  // print-multi-os-directory?
51812cfe036d809173a25af0104844d4bb66a92252bDaniel Dunbar  if (C.getArgs().hasArg(options::OPT_print_multi_directory) ||
51912cfe036d809173a25af0104844d4bb66a92252bDaniel Dunbar      C.getArgs().hasArg(options::OPT_print_multi_os_directory)) {
52012cfe036d809173a25af0104844d4bb66a92252bDaniel Dunbar    switch (C.getDefaultToolChain().getTriple().getArch()) {
52112cfe036d809173a25af0104844d4bb66a92252bDaniel Dunbar    default:
52212cfe036d809173a25af0104844d4bb66a92252bDaniel Dunbar    case llvm::Triple::x86:
52312cfe036d809173a25af0104844d4bb66a92252bDaniel Dunbar    case llvm::Triple::ppc:
52412cfe036d809173a25af0104844d4bb66a92252bDaniel Dunbar      llvm::outs() << "." << "\n";
52512cfe036d809173a25af0104844d4bb66a92252bDaniel Dunbar      break;
526a82318332c9e9b61d3d17371e675ca2859877ee5Daniel Dunbar
52712cfe036d809173a25af0104844d4bb66a92252bDaniel Dunbar    case llvm::Triple::x86_64:
52812cfe036d809173a25af0104844d4bb66a92252bDaniel Dunbar      llvm::outs() << "x86_64" << "\n";
52912cfe036d809173a25af0104844d4bb66a92252bDaniel Dunbar      break;
53012cfe036d809173a25af0104844d4bb66a92252bDaniel Dunbar
53112cfe036d809173a25af0104844d4bb66a92252bDaniel Dunbar    case llvm::Triple::ppc64:
53212cfe036d809173a25af0104844d4bb66a92252bDaniel Dunbar      llvm::outs() << "ppc64" << "\n";
53312cfe036d809173a25af0104844d4bb66a92252bDaniel Dunbar      break;
53412cfe036d809173a25af0104844d4bb66a92252bDaniel Dunbar    }
53512cfe036d809173a25af0104844d4bb66a92252bDaniel Dunbar    return false;
53612cfe036d809173a25af0104844d4bb66a92252bDaniel Dunbar  }
53712cfe036d809173a25af0104844d4bb66a92252bDaniel Dunbar
538cb881672c2c46142ec1bdfa401c9818ae805db0fDaniel Dunbar  return true;
539cb881672c2c46142ec1bdfa401c9818ae805db0fDaniel Dunbar}
540cb881672c2c46142ec1bdfa401c9818ae805db0fDaniel Dunbar
541a82318332c9e9b61d3d17371e675ca2859877ee5Daniel Dunbarstatic unsigned PrintActions1(const Compilation &C, Action *A,
542ba1021388e6839b76c8968b931189361c7286674Daniel Dunbar                              std::map<Action*, unsigned> &Ids) {
543ba1021388e6839b76c8968b931189361c7286674Daniel Dunbar  if (Ids.count(A))
544ba1021388e6839b76c8968b931189361c7286674Daniel Dunbar    return Ids[A];
545a82318332c9e9b61d3d17371e675ca2859877ee5Daniel Dunbar
546ba1021388e6839b76c8968b931189361c7286674Daniel Dunbar  std::string str;
547ba1021388e6839b76c8968b931189361c7286674Daniel Dunbar  llvm::raw_string_ostream os(str);
548a82318332c9e9b61d3d17371e675ca2859877ee5Daniel Dunbar
549ba1021388e6839b76c8968b931189361c7286674Daniel Dunbar  os << Action::getClassName(A->getKind()) << ", ";
550a82318332c9e9b61d3d17371e675ca2859877ee5Daniel Dunbar  if (InputAction *IA = dyn_cast<InputAction>(A)) {
55110ffa9a4887d9376e3eb3598e40523d1b58773c9Daniel Dunbar    os << "\"" << IA->getInputArg().getValue(C.getArgs()) << "\"";
552ba1021388e6839b76c8968b931189361c7286674Daniel Dunbar  } else if (BindArchAction *BIA = dyn_cast<BindArchAction>(A)) {
553a82318332c9e9b61d3d17371e675ca2859877ee5Daniel Dunbar    os << '"' << (BIA->getArchName() ? BIA->getArchName() :
55410ffa9a4887d9376e3eb3598e40523d1b58773c9Daniel Dunbar                  C.getDefaultToolChain().getArchName()) << '"'
55510ffa9a4887d9376e3eb3598e40523d1b58773c9Daniel Dunbar       << ", {" << PrintActions1(C, *BIA->begin(), Ids) << "}";
556ba1021388e6839b76c8968b931189361c7286674Daniel Dunbar  } else {
557ba1021388e6839b76c8968b931189361c7286674Daniel Dunbar    os << "{";
558ba1021388e6839b76c8968b931189361c7286674Daniel Dunbar    for (Action::iterator it = A->begin(), ie = A->end(); it != ie;) {
55910ffa9a4887d9376e3eb3598e40523d1b58773c9Daniel Dunbar      os << PrintActions1(C, *it, Ids);
560ba1021388e6839b76c8968b931189361c7286674Daniel Dunbar      ++it;
561ba1021388e6839b76c8968b931189361c7286674Daniel Dunbar      if (it != ie)
562ba1021388e6839b76c8968b931189361c7286674Daniel Dunbar        os << ", ";
563ba1021388e6839b76c8968b931189361c7286674Daniel Dunbar    }
564ba1021388e6839b76c8968b931189361c7286674Daniel Dunbar    os << "}";
565ba1021388e6839b76c8968b931189361c7286674Daniel Dunbar  }
566ba1021388e6839b76c8968b931189361c7286674Daniel Dunbar
567ba1021388e6839b76c8968b931189361c7286674Daniel Dunbar  unsigned Id = Ids.size();
568ba1021388e6839b76c8968b931189361c7286674Daniel Dunbar  Ids[A] = Id;
569a82318332c9e9b61d3d17371e675ca2859877ee5Daniel Dunbar  llvm::errs() << Id << ": " << os.str() << ", "
570ba1021388e6839b76c8968b931189361c7286674Daniel Dunbar               << types::getTypeName(A->getType()) << "\n";
571ba1021388e6839b76c8968b931189361c7286674Daniel Dunbar
572ba1021388e6839b76c8968b931189361c7286674Daniel Dunbar  return Id;
573ba1021388e6839b76c8968b931189361c7286674Daniel Dunbar}
574ba1021388e6839b76c8968b931189361c7286674Daniel Dunbar
57510ffa9a4887d9376e3eb3598e40523d1b58773c9Daniel Dunbarvoid Driver::PrintActions(const Compilation &C) const {
576ba1021388e6839b76c8968b931189361c7286674Daniel Dunbar  std::map<Action*, unsigned> Ids;
577a82318332c9e9b61d3d17371e675ca2859877ee5Daniel Dunbar  for (ActionList::const_iterator it = C.getActions().begin(),
57810ffa9a4887d9376e3eb3598e40523d1b58773c9Daniel Dunbar         ie = C.getActions().end(); it != ie; ++it)
57910ffa9a4887d9376e3eb3598e40523d1b58773c9Daniel Dunbar    PrintActions1(C, *it, Ids);
58053ec55215075c8f4ddd47ca6ed7d382f16beb670Daniel Dunbar}
58153ec55215075c8f4ddd47ca6ed7d382f16beb670Daniel Dunbar
5829d0fbeadc455c8292837b738b6af315d27930637Joerg Sonnenberger/// \brief Check whether the given input tree contains any compilation or
5839d0fbeadc455c8292837b738b6af315d27930637Joerg Sonnenberger/// assembly actions.
5849d0fbeadc455c8292837b738b6af315d27930637Joerg Sonnenbergerstatic bool ContainsCompileOrAssembleAction(const Action *A) {
585b5e2f698accd4d3a1379983304a2f31ec194c332Daniel Dunbar  if (isa<CompileJobAction>(A) || isa<AssembleJobAction>(A))
586b5e2f698accd4d3a1379983304a2f31ec194c332Daniel Dunbar    return true;
587b5e2f698accd4d3a1379983304a2f31ec194c332Daniel Dunbar
588b5e2f698accd4d3a1379983304a2f31ec194c332Daniel Dunbar  for (Action::const_iterator it = A->begin(), ie = A->end(); it != ie; ++it)
5899d0fbeadc455c8292837b738b6af315d27930637Joerg Sonnenberger    if (ContainsCompileOrAssembleAction(*it))
590b5e2f698accd4d3a1379983304a2f31ec194c332Daniel Dunbar      return true;
591b5e2f698accd4d3a1379983304a2f31ec194c332Daniel Dunbar
592b5e2f698accd4d3a1379983304a2f31ec194c332Daniel Dunbar  return false;
593b5e2f698accd4d3a1379983304a2f31ec194c332Daniel Dunbar}
594b5e2f698accd4d3a1379983304a2f31ec194c332Daniel Dunbar
59574edcea3db1f85ba73ad0fede2ed5e2f096cac4bDaniel Dunbarvoid Driver::BuildUniversalActions(const ToolChain &TC,
59665f7165676854bf75494f5b73a620d7237db5d41Joerg Sonnenberger                                   const DerivedArgList &Args,
59721549237f14505cfc2a18a06416372a36229d0ceDaniel Dunbar                                   ActionList &Actions) const {
598a82318332c9e9b61d3d17371e675ca2859877ee5Daniel Dunbar  llvm::PrettyStackTraceString CrashInfo("Building universal build actions");
599a82318332c9e9b61d3d17371e675ca2859877ee5Daniel Dunbar  // Collect the list of architectures. Duplicates are allowed, but should only
600a82318332c9e9b61d3d17371e675ca2859877ee5Daniel Dunbar  // be handled once (in the order seen).
6011368954db9ce2989ed8f03f5c65e8ee775a5229aDaniel Dunbar  llvm::StringSet<> ArchNames;
6025f9e272e632e951b1efe824cd16acb4d96077930Chris Lattner  SmallVector<const char *, 4> Archs;
603a82318332c9e9b61d3d17371e675ca2859877ee5Daniel Dunbar  for (ArgList::const_iterator it = Args.begin(), ie = Args.end();
6042fe63e6adac0b9e5f52bcc3100b545e379417e6eDaniel Dunbar       it != ie; ++it) {
6052fe63e6adac0b9e5f52bcc3100b545e379417e6eDaniel Dunbar    Arg *A = *it;
6062fe63e6adac0b9e5f52bcc3100b545e379417e6eDaniel Dunbar
607b827a0541b5fd095fcdb7ad0c3df93ca158c619aDaniel Dunbar    if (A->getOption().matches(options::OPT_arch)) {
60836df2904354ac150500ec16238a1ec3cce4ba83eDaniel Dunbar      // Validate the option here; we don't save the type here because its
60936df2904354ac150500ec16238a1ec3cce4ba83eDaniel Dunbar      // particular spelling may participate in other driver choices.
61036df2904354ac150500ec16238a1ec3cce4ba83eDaniel Dunbar      llvm::Triple::ArchType Arch =
61136df2904354ac150500ec16238a1ec3cce4ba83eDaniel Dunbar        llvm::Triple::getArchTypeForDarwinArchName(A->getValue(Args));
61236df2904354ac150500ec16238a1ec3cce4ba83eDaniel Dunbar      if (Arch == llvm::Triple::UnknownArch) {
61336df2904354ac150500ec16238a1ec3cce4ba83eDaniel Dunbar        Diag(clang::diag::err_drv_invalid_arch_name)
61436df2904354ac150500ec16238a1ec3cce4ba83eDaniel Dunbar          << A->getAsString(Args);
61536df2904354ac150500ec16238a1ec3cce4ba83eDaniel Dunbar        continue;
61636df2904354ac150500ec16238a1ec3cce4ba83eDaniel Dunbar      }
61736df2904354ac150500ec16238a1ec3cce4ba83eDaniel Dunbar
6187587719c40ebf02bf11e5e66c30bd20e98edebc2Daniel Dunbar      A->claim();
6193f30ddf680df44e0c5c43b8db0a22166dcd7066bDaniel Dunbar      if (ArchNames.insert(A->getValue(Args)))
6203f30ddf680df44e0c5c43b8db0a22166dcd7066bDaniel Dunbar        Archs.push_back(A->getValue(Args));
6212fe63e6adac0b9e5f52bcc3100b545e379417e6eDaniel Dunbar    }
6222fe63e6adac0b9e5f52bcc3100b545e379417e6eDaniel Dunbar  }
6232fe63e6adac0b9e5f52bcc3100b545e379417e6eDaniel Dunbar
624a82318332c9e9b61d3d17371e675ca2859877ee5Daniel Dunbar  // When there is no explicit arch for this platform, make sure we still bind
625a82318332c9e9b61d3d17371e675ca2859877ee5Daniel Dunbar  // the architecture (to the default) so that -Xarch_ is handled correctly.
62610ffa9a4887d9376e3eb3598e40523d1b58773c9Daniel Dunbar  if (!Archs.size())
62710ffa9a4887d9376e3eb3598e40523d1b58773c9Daniel Dunbar    Archs.push_back(0);
6282fe63e6adac0b9e5f52bcc3100b545e379417e6eDaniel Dunbar
629a82318332c9e9b61d3d17371e675ca2859877ee5Daniel Dunbar  // FIXME: We killed off some others but these aren't yet detected in a
630a82318332c9e9b61d3d17371e675ca2859877ee5Daniel Dunbar  // functional manner. If we added information to jobs about which "auxiliary"
631a82318332c9e9b61d3d17371e675ca2859877ee5Daniel Dunbar  // files they wrote then we could detect the conflict these cause downstream.
6322fe63e6adac0b9e5f52bcc3100b545e379417e6eDaniel Dunbar  if (Archs.size() > 1) {
6332fe63e6adac0b9e5f52bcc3100b545e379417e6eDaniel Dunbar    // No recovery needed, the point of this is just to prevent
6342fe63e6adac0b9e5f52bcc3100b545e379417e6eDaniel Dunbar    // overwriting the same files.
6352fe63e6adac0b9e5f52bcc3100b545e379417e6eDaniel Dunbar    if (const Arg *A = Args.getLastArg(options::OPT_save_temps))
636a82318332c9e9b61d3d17371e675ca2859877ee5Daniel Dunbar      Diag(clang::diag::err_drv_invalid_opt_with_multiple_archs)
63738dd3d54186cf44ea9d37f463c3f2800ab526b82Daniel Dunbar        << A->getAsString(Args);
6382fe63e6adac0b9e5f52bcc3100b545e379417e6eDaniel Dunbar  }
6392fe63e6adac0b9e5f52bcc3100b545e379417e6eDaniel Dunbar
6402fe63e6adac0b9e5f52bcc3100b545e379417e6eDaniel Dunbar  ActionList SingleActions;
64174edcea3db1f85ba73ad0fede2ed5e2f096cac4bDaniel Dunbar  BuildActions(TC, Args, SingleActions);
6422fe63e6adac0b9e5f52bcc3100b545e379417e6eDaniel Dunbar
643be1cc3eec682ca73361edb4109a7969452d3dbebDaniel Dunbar  // Add in arch bindings for every top level action, as well as lipo and
644be1cc3eec682ca73361edb4109a7969452d3dbebDaniel Dunbar  // dsymutil steps if needed.
6452fe63e6adac0b9e5f52bcc3100b545e379417e6eDaniel Dunbar  for (unsigned i = 0, e = SingleActions.size(); i != e; ++i) {
6462fe63e6adac0b9e5f52bcc3100b545e379417e6eDaniel Dunbar    Action *Act = SingleActions[i];
6472fe63e6adac0b9e5f52bcc3100b545e379417e6eDaniel Dunbar
648a82318332c9e9b61d3d17371e675ca2859877ee5Daniel Dunbar    // Make sure we can lipo this kind of output. If not (and it is an actual
649a82318332c9e9b61d3d17371e675ca2859877ee5Daniel Dunbar    // output) then we disallow, since we can't create an output file with the
650a82318332c9e9b61d3d17371e675ca2859877ee5Daniel Dunbar    // right name without overwriting it. We could remove this oddity by just
651a82318332c9e9b61d3d17371e675ca2859877ee5Daniel Dunbar    // changing the output names to include the arch, which would also fix
6522fe63e6adac0b9e5f52bcc3100b545e379417e6eDaniel Dunbar    // -save-temps. Compatibility wins for now.
6532fe63e6adac0b9e5f52bcc3100b545e379417e6eDaniel Dunbar
6543dbd6c51bcd8a730c3fe58e29d7e0d999a94fa91Daniel Dunbar    if (Archs.size() > 1 && !types::canLipoType(Act->getType()))
6552fe63e6adac0b9e5f52bcc3100b545e379417e6eDaniel Dunbar      Diag(clang::diag::err_drv_invalid_output_with_multiple_archs)
6562fe63e6adac0b9e5f52bcc3100b545e379417e6eDaniel Dunbar        << types::getTypeName(Act->getType());
6572fe63e6adac0b9e5f52bcc3100b545e379417e6eDaniel Dunbar
6582fe63e6adac0b9e5f52bcc3100b545e379417e6eDaniel Dunbar    ActionList Inputs;
65932c1a2ae8b31f32e478c8e504ed81db8c8d25713Daniel Dunbar    for (unsigned i = 0, e = Archs.size(); i != e; ++i) {
6601368954db9ce2989ed8f03f5c65e8ee775a5229aDaniel Dunbar      Inputs.push_back(new BindArchAction(Act, Archs[i]));
66132c1a2ae8b31f32e478c8e504ed81db8c8d25713Daniel Dunbar      if (i != 0)
66232c1a2ae8b31f32e478c8e504ed81db8c8d25713Daniel Dunbar        Inputs.back()->setOwnsInputs(false);
66332c1a2ae8b31f32e478c8e504ed81db8c8d25713Daniel Dunbar    }
6642fe63e6adac0b9e5f52bcc3100b545e379417e6eDaniel Dunbar
665a82318332c9e9b61d3d17371e675ca2859877ee5Daniel Dunbar    // Lipo if necessary, we do it this way because we need to set the arch flag
666a82318332c9e9b61d3d17371e675ca2859877ee5Daniel Dunbar    // so that -Xarch_ gets overwritten.
6672fe63e6adac0b9e5f52bcc3100b545e379417e6eDaniel Dunbar    if (Inputs.size() == 1 || Act->getType() == types::TY_Nothing)
6682fe63e6adac0b9e5f52bcc3100b545e379417e6eDaniel Dunbar      Actions.append(Inputs.begin(), Inputs.end());
6692fe63e6adac0b9e5f52bcc3100b545e379417e6eDaniel Dunbar    else
6702fe63e6adac0b9e5f52bcc3100b545e379417e6eDaniel Dunbar      Actions.push_back(new LipoJobAction(Inputs, Act->getType()));
671be1cc3eec682ca73361edb4109a7969452d3dbebDaniel Dunbar
672b5e2f698accd4d3a1379983304a2f31ec194c332Daniel Dunbar    // Add a 'dsymutil' step if necessary, when debug info is enabled and we
673b5e2f698accd4d3a1379983304a2f31ec194c332Daniel Dunbar    // have a compile input. We need to run 'dsymutil' ourselves in such cases
674b5e2f698accd4d3a1379983304a2f31ec194c332Daniel Dunbar    // because the debug info will refer to a temporary object file which is
675b5e2f698accd4d3a1379983304a2f31ec194c332Daniel Dunbar    // will be removed at the end of the compilation process.
676be1cc3eec682ca73361edb4109a7969452d3dbebDaniel Dunbar    if (Act->getType() == types::TY_Image) {
677be1cc3eec682ca73361edb4109a7969452d3dbebDaniel Dunbar      Arg *A = Args.getLastArg(options::OPT_g_Group);
678be1cc3eec682ca73361edb4109a7969452d3dbebDaniel Dunbar      if (A && !A->getOption().matches(options::OPT_g0) &&
679b5e2f698accd4d3a1379983304a2f31ec194c332Daniel Dunbar          !A->getOption().matches(options::OPT_gstabs) &&
6809d0fbeadc455c8292837b738b6af315d27930637Joerg Sonnenberger          ContainsCompileOrAssembleAction(Actions.back())) {
681be1cc3eec682ca73361edb4109a7969452d3dbebDaniel Dunbar        ActionList Inputs;
682be1cc3eec682ca73361edb4109a7969452d3dbebDaniel Dunbar        Inputs.push_back(Actions.back());
683be1cc3eec682ca73361edb4109a7969452d3dbebDaniel Dunbar        Actions.pop_back();
684be1cc3eec682ca73361edb4109a7969452d3dbebDaniel Dunbar
685be1cc3eec682ca73361edb4109a7969452d3dbebDaniel Dunbar        Actions.push_back(new DsymutilJobAction(Inputs, types::TY_dSYM));
686be1cc3eec682ca73361edb4109a7969452d3dbebDaniel Dunbar      }
687be1cc3eec682ca73361edb4109a7969452d3dbebDaniel Dunbar    }
6882fe63e6adac0b9e5f52bcc3100b545e379417e6eDaniel Dunbar  }
68953ec55215075c8f4ddd47ca6ed7d382f16beb670Daniel Dunbar}
69053ec55215075c8f4ddd47ca6ed7d382f16beb670Daniel Dunbar
69165f7165676854bf75494f5b73a620d7237db5d41Joerg Sonnenbergervoid Driver::BuildActions(const ToolChain &TC, const DerivedArgList &Args,
69274edcea3db1f85ba73ad0fede2ed5e2f096cac4bDaniel Dunbar                          ActionList &Actions) const {
6938f25c79e59d88df41c5a3cabba1c58035d384a6eDaniel Dunbar  llvm::PrettyStackTraceString CrashInfo("Building compilation actions");
694af61c71137d1f7239d6b9d7425ce083db7ba31dfDaniel Dunbar  // Start by constructing the list of inputs and their types.
695af61c71137d1f7239d6b9d7425ce083db7ba31dfDaniel Dunbar
696a82318332c9e9b61d3d17371e675ca2859877ee5Daniel Dunbar  // Track the current user specified (-x) input. We also explicitly track the
697a82318332c9e9b61d3d17371e675ca2859877ee5Daniel Dunbar  // argument used to set the type; we only want to claim the type when we
698a82318332c9e9b61d3d17371e675ca2859877ee5Daniel Dunbar  // actually use it, so we warn about unused -x arguments.
69983dd21f6b4e6e109b893c0d42bc81e4883c342f7Daniel Dunbar  types::ID InputType = types::TY_Nothing;
70083dd21f6b4e6e109b893c0d42bc81e4883c342f7Daniel Dunbar  Arg *InputTypeArg = 0;
70183dd21f6b4e6e109b893c0d42bc81e4883c342f7Daniel Dunbar
7025f9e272e632e951b1efe824cd16acb4d96077930Chris Lattner  SmallVector<std::pair<types::ID, const Arg*>, 16> Inputs;
703a82318332c9e9b61d3d17371e675ca2859877ee5Daniel Dunbar  for (ArgList::const_iterator it = Args.begin(), ie = Args.end();
70453ec55215075c8f4ddd47ca6ed7d382f16beb670Daniel Dunbar       it != ie; ++it) {
70553ec55215075c8f4ddd47ca6ed7d382f16beb670Daniel Dunbar    Arg *A = *it;
70653ec55215075c8f4ddd47ca6ed7d382f16beb670Daniel Dunbar
70753ec55215075c8f4ddd47ca6ed7d382f16beb670Daniel Dunbar    if (isa<InputOption>(A->getOption())) {
70853ec55215075c8f4ddd47ca6ed7d382f16beb670Daniel Dunbar      const char *Value = A->getValue(Args);
70953ec55215075c8f4ddd47ca6ed7d382f16beb670Daniel Dunbar      types::ID Ty = types::TY_INVALID;
71053ec55215075c8f4ddd47ca6ed7d382f16beb670Daniel Dunbar
71153ec55215075c8f4ddd47ca6ed7d382f16beb670Daniel Dunbar      // Infer the input type if necessary.
71283dd21f6b4e6e109b893c0d42bc81e4883c342f7Daniel Dunbar      if (InputType == types::TY_Nothing) {
71383dd21f6b4e6e109b893c0d42bc81e4883c342f7Daniel Dunbar        // If there was an explicit arg for this, claim it.
71483dd21f6b4e6e109b893c0d42bc81e4883c342f7Daniel Dunbar        if (InputTypeArg)
71583dd21f6b4e6e109b893c0d42bc81e4883c342f7Daniel Dunbar          InputTypeArg->claim();
71683dd21f6b4e6e109b893c0d42bc81e4883c342f7Daniel Dunbar
71753ec55215075c8f4ddd47ca6ed7d382f16beb670Daniel Dunbar        // stdin must be handled specially.
71853ec55215075c8f4ddd47ca6ed7d382f16beb670Daniel Dunbar        if (memcmp(Value, "-", 2) == 0) {
719a82318332c9e9b61d3d17371e675ca2859877ee5Daniel Dunbar          // If running with -E, treat as a C input (this changes the builtin
720a82318332c9e9b61d3d17371e675ca2859877ee5Daniel Dunbar          // macros, for example). This may be overridden by -ObjC below.
72153ec55215075c8f4ddd47ca6ed7d382f16beb670Daniel Dunbar          //
722a82318332c9e9b61d3d17371e675ca2859877ee5Daniel Dunbar          // Otherwise emit an error but still use a valid type to avoid
723a82318332c9e9b61d3d17371e675ca2859877ee5Daniel Dunbar          // spurious errors (e.g., no inputs).
7249ade4ae4fb7ed1fcbd63835d9f8f53052f0657a2Joerg Sonnenberger          if (!Args.hasArgNoClaim(options::OPT_E) && !CCCIsCPP)
725b897f5d3ebfb62c2745e2e2af7faa9920c882438Daniel Dunbar            Diag(clang::diag::err_drv_unknown_stdin_type);
72653ec55215075c8f4ddd47ca6ed7d382f16beb670Daniel Dunbar          Ty = types::TY_C;
72753ec55215075c8f4ddd47ca6ed7d382f16beb670Daniel Dunbar        } else {
7289a2927c4e6afa56ade0e5acc654f07fc658a220eJoerg Sonnenberger          // Otherwise lookup by extension.
7299a2927c4e6afa56ade0e5acc654f07fc658a220eJoerg Sonnenberger          // Fallback is C if invoked as C preprocessor or Object otherwise.
7309a2927c4e6afa56ade0e5acc654f07fc658a220eJoerg Sonnenberger          // We use a host hook here because Darwin at least has its own
731a82318332c9e9b61d3d17371e675ca2859877ee5Daniel Dunbar          // idea of what .s is.
73253ec55215075c8f4ddd47ca6ed7d382f16beb670Daniel Dunbar          if (const char *Ext = strrchr(Value, '.'))
7334180011fb8cef06adec04d30486b1bf3b99aa8b8Daniel Dunbar            Ty = TC.LookupTypeForExtension(Ext + 1);
734e33bea4ef34598e7a4a6a3a117392268998552d4Daniel Dunbar
7359a2927c4e6afa56ade0e5acc654f07fc658a220eJoerg Sonnenberger          if (Ty == types::TY_INVALID) {
7369a2927c4e6afa56ade0e5acc654f07fc658a220eJoerg Sonnenberger            if (CCCIsCPP)
7379a2927c4e6afa56ade0e5acc654f07fc658a220eJoerg Sonnenberger              Ty = types::TY_C;
7389a2927c4e6afa56ade0e5acc654f07fc658a220eJoerg Sonnenberger            else
7399a2927c4e6afa56ade0e5acc654f07fc658a220eJoerg Sonnenberger              Ty = types::TY_Object;
7409a2927c4e6afa56ade0e5acc654f07fc658a220eJoerg Sonnenberger          }
74151679c5e4828b8a64953c4f3db162ca963bf7b03Daniel Dunbar
74251679c5e4828b8a64953c4f3db162ca963bf7b03Daniel Dunbar          // If the driver is invoked as C++ compiler (like clang++ or c++) it
74351679c5e4828b8a64953c4f3db162ca963bf7b03Daniel Dunbar          // should autodetect some input files as C++ for g++ compatibility.
74451679c5e4828b8a64953c4f3db162ca963bf7b03Daniel Dunbar          if (CCCIsCXX) {
74551679c5e4828b8a64953c4f3db162ca963bf7b03Daniel Dunbar            types::ID OldTy = Ty;
74651679c5e4828b8a64953c4f3db162ca963bf7b03Daniel Dunbar            Ty = types::lookupCXXTypeForCType(Ty);
74751679c5e4828b8a64953c4f3db162ca963bf7b03Daniel Dunbar
74851679c5e4828b8a64953c4f3db162ca963bf7b03Daniel Dunbar            if (Ty != OldTy)
74951679c5e4828b8a64953c4f3db162ca963bf7b03Daniel Dunbar              Diag(clang::diag::warn_drv_treating_input_as_cxx)
75051679c5e4828b8a64953c4f3db162ca963bf7b03Daniel Dunbar                << getTypeName(OldTy) << getTypeName(Ty);
75151679c5e4828b8a64953c4f3db162ca963bf7b03Daniel Dunbar          }
75253ec55215075c8f4ddd47ca6ed7d382f16beb670Daniel Dunbar        }
75353ec55215075c8f4ddd47ca6ed7d382f16beb670Daniel Dunbar
754683ca381bf2b8dffab535c89d25250518bbec3a0Daniel Dunbar        // -ObjC and -ObjC++ override the default language, but only for "source
755683ca381bf2b8dffab535c89d25250518bbec3a0Daniel Dunbar        // files". We just treat everything that isn't a linker input as a
756683ca381bf2b8dffab535c89d25250518bbec3a0Daniel Dunbar        // source file.
757a82318332c9e9b61d3d17371e675ca2859877ee5Daniel Dunbar        //
758683ca381bf2b8dffab535c89d25250518bbec3a0Daniel Dunbar        // FIXME: Clean this up if we move the phase sequence into the type.
75953ec55215075c8f4ddd47ca6ed7d382f16beb670Daniel Dunbar        if (Ty != types::TY_Object) {
76053ec55215075c8f4ddd47ca6ed7d382f16beb670Daniel Dunbar          if (Args.hasArg(options::OPT_ObjC))
76153ec55215075c8f4ddd47ca6ed7d382f16beb670Daniel Dunbar            Ty = types::TY_ObjC;
76253ec55215075c8f4ddd47ca6ed7d382f16beb670Daniel Dunbar          else if (Args.hasArg(options::OPT_ObjCXX))
76353ec55215075c8f4ddd47ca6ed7d382f16beb670Daniel Dunbar            Ty = types::TY_ObjCXX;
76453ec55215075c8f4ddd47ca6ed7d382f16beb670Daniel Dunbar        }
76553ec55215075c8f4ddd47ca6ed7d382f16beb670Daniel Dunbar      } else {
76653ec55215075c8f4ddd47ca6ed7d382f16beb670Daniel Dunbar        assert(InputTypeArg && "InputType set w/o InputTypeArg");
76753ec55215075c8f4ddd47ca6ed7d382f16beb670Daniel Dunbar        InputTypeArg->claim();
76853ec55215075c8f4ddd47ca6ed7d382f16beb670Daniel Dunbar        Ty = InputType;
76953ec55215075c8f4ddd47ca6ed7d382f16beb670Daniel Dunbar      }
77053ec55215075c8f4ddd47ca6ed7d382f16beb670Daniel Dunbar
7713bd54cc56276c386f4d50940a9fbfcad7a69cb75Daniel Dunbar      // Check that the file exists, if enabled.
772389db16c63eec6ecfa9b235155252d8da766e94eArgyrios Kyrtzidis      if (CheckInputsExist && memcmp(Value, "-", 2) != 0) {
773256053b31e697fdf0cc48f17d621c82fc3b8dff0Michael J. Spencer        llvm::SmallString<64> Path(Value);
774389db16c63eec6ecfa9b235155252d8da766e94eArgyrios Kyrtzidis        if (Arg *WorkDir = Args.getLastArg(options::OPT_working_directory))
775256053b31e697fdf0cc48f17d621c82fc3b8dff0Michael J. Spencer          if (llvm::sys::path::is_absolute(Path.str())) {
776389db16c63eec6ecfa9b235155252d8da766e94eArgyrios Kyrtzidis            Path = WorkDir->getValue(Args);
777256053b31e697fdf0cc48f17d621c82fc3b8dff0Michael J. Spencer            llvm::sys::path::append(Path, Value);
778389db16c63eec6ecfa9b235155252d8da766e94eArgyrios Kyrtzidis          }
779389db16c63eec6ecfa9b235155252d8da766e94eArgyrios Kyrtzidis
780256053b31e697fdf0cc48f17d621c82fc3b8dff0Michael J. Spencer        bool exists = false;
781256053b31e697fdf0cc48f17d621c82fc3b8dff0Michael J. Spencer        if (/*error_code ec =*/llvm::sys::fs::exists(Value, exists) || !exists)
782389db16c63eec6ecfa9b235155252d8da766e94eArgyrios Kyrtzidis          Diag(clang::diag::err_drv_no_such_file) << Path.str();
783389db16c63eec6ecfa9b235155252d8da766e94eArgyrios Kyrtzidis        else
784389db16c63eec6ecfa9b235155252d8da766e94eArgyrios Kyrtzidis          Inputs.push_back(std::make_pair(Ty, A));
785389db16c63eec6ecfa9b235155252d8da766e94eArgyrios Kyrtzidis      } else
78653ec55215075c8f4ddd47ca6ed7d382f16beb670Daniel Dunbar        Inputs.push_back(std::make_pair(Ty, A));
78753ec55215075c8f4ddd47ca6ed7d382f16beb670Daniel Dunbar
78853ec55215075c8f4ddd47ca6ed7d382f16beb670Daniel Dunbar    } else if (A->getOption().isLinkerInput()) {
789a82318332c9e9b61d3d17371e675ca2859877ee5Daniel Dunbar      // Just treat as object type, we could make a special type for this if
790a82318332c9e9b61d3d17371e675ca2859877ee5Daniel Dunbar      // necessary.
79153ec55215075c8f4ddd47ca6ed7d382f16beb670Daniel Dunbar      Inputs.push_back(std::make_pair(types::TY_Object, A));
79253ec55215075c8f4ddd47ca6ed7d382f16beb670Daniel Dunbar
793b827a0541b5fd095fcdb7ad0c3df93ca158c619aDaniel Dunbar    } else if (A->getOption().matches(options::OPT_x)) {
794a82318332c9e9b61d3d17371e675ca2859877ee5Daniel Dunbar      InputTypeArg = A;
79553ec55215075c8f4ddd47ca6ed7d382f16beb670Daniel Dunbar      InputType = types::lookupTypeForTypeSpecifier(A->getValue(Args));
79653ec55215075c8f4ddd47ca6ed7d382f16beb670Daniel Dunbar
79753ec55215075c8f4ddd47ca6ed7d382f16beb670Daniel Dunbar      // Follow gcc behavior and treat as linker input for invalid -x
798a82318332c9e9b61d3d17371e675ca2859877ee5Daniel Dunbar      // options. Its not clear why we shouldn't just revert to unknown; but
79974cae0c64d3cf85bcfbc9e7febac83a580804d57Michael J. Spencer      // this isn't very important, we might as well be bug compatible.
80053ec55215075c8f4ddd47ca6ed7d382f16beb670Daniel Dunbar      if (!InputType) {
801b897f5d3ebfb62c2745e2e2af7faa9920c882438Daniel Dunbar        Diag(clang::diag::err_drv_unknown_language) << A->getValue(Args);
80253ec55215075c8f4ddd47ca6ed7d382f16beb670Daniel Dunbar        InputType = types::TY_Object;
80353ec55215075c8f4ddd47ca6ed7d382f16beb670Daniel Dunbar      }
80453ec55215075c8f4ddd47ca6ed7d382f16beb670Daniel Dunbar    }
80553ec55215075c8f4ddd47ca6ed7d382f16beb670Daniel Dunbar  }
80653ec55215075c8f4ddd47ca6ed7d382f16beb670Daniel Dunbar
8079ade4ae4fb7ed1fcbd63835d9f8f53052f0657a2Joerg Sonnenberger  if (CCCIsCPP && Inputs.empty()) {
8089ade4ae4fb7ed1fcbd63835d9f8f53052f0657a2Joerg Sonnenberger    // If called as standalone preprocessor, stdin is processed
8099ade4ae4fb7ed1fcbd63835d9f8f53052f0657a2Joerg Sonnenberger    // if no other input is present.
81065f7165676854bf75494f5b73a620d7237db5d41Joerg Sonnenberger    unsigned Index = Args.getBaseArgs().MakeIndex("-");
8119ade4ae4fb7ed1fcbd63835d9f8f53052f0657a2Joerg Sonnenberger    Arg *A = Opts->ParseOneArg(Args, Index);
8129ade4ae4fb7ed1fcbd63835d9f8f53052f0657a2Joerg Sonnenberger    A->claim();
8139ade4ae4fb7ed1fcbd63835d9f8f53052f0657a2Joerg Sonnenberger    Inputs.push_back(std::make_pair(types::TY_C, A));
8149ade4ae4fb7ed1fcbd63835d9f8f53052f0657a2Joerg Sonnenberger  }
8159ade4ae4fb7ed1fcbd63835d9f8f53052f0657a2Joerg Sonnenberger
8168b1604ece7bf6dc2ba811cd7d8767557e55e2ec2Daniel Dunbar  if (!SuppressMissingInputWarning && Inputs.empty()) {
817af61c71137d1f7239d6b9d7425ce083db7ba31dfDaniel Dunbar    Diag(clang::diag::err_drv_no_input_files);
818af61c71137d1f7239d6b9d7425ce083db7ba31dfDaniel Dunbar    return;
819af61c71137d1f7239d6b9d7425ce083db7ba31dfDaniel Dunbar  }
820af61c71137d1f7239d6b9d7425ce083db7ba31dfDaniel Dunbar
821a82318332c9e9b61d3d17371e675ca2859877ee5Daniel Dunbar  // Determine which compilation mode we are in. We look for options which
822a82318332c9e9b61d3d17371e675ca2859877ee5Daniel Dunbar  // affect the phase, starting with the earliest phases, and record which
823a82318332c9e9b61d3d17371e675ca2859877ee5Daniel Dunbar  // option we used to determine the final phase.
824ad2a9af666efdd9afe3bb5f886bcb0d1c9a0f0c3Daniel Dunbar  Arg *FinalPhaseArg = 0;
825ad2a9af666efdd9afe3bb5f886bcb0d1c9a0f0c3Daniel Dunbar  phases::ID FinalPhase;
826af61c71137d1f7239d6b9d7425ce083db7ba31dfDaniel Dunbar
827af61c71137d1f7239d6b9d7425ce083db7ba31dfDaniel Dunbar  // -{E,M,MM} only run the preprocessor.
8289ade4ae4fb7ed1fcbd63835d9f8f53052f0657a2Joerg Sonnenberger  if (CCCIsCPP ||
8299ade4ae4fb7ed1fcbd63835d9f8f53052f0657a2Joerg Sonnenberger      (FinalPhaseArg = Args.getLastArg(options::OPT_E)) ||
8309eb93b07ea913e7ad0bcd15bd3e3662e2760c323Daniel Dunbar      (FinalPhaseArg = Args.getLastArg(options::OPT_M, options::OPT_MM))) {
831ad2a9af666efdd9afe3bb5f886bcb0d1c9a0f0c3Daniel Dunbar    FinalPhase = phases::Preprocess;
832a82318332c9e9b61d3d17371e675ca2859877ee5Daniel Dunbar
8335915fbf310e171c4cd3c2af05e9de360c0fa988aDaniel Dunbar    // -{fsyntax-only,-analyze,emit-ast,S} only run up to the compiler.
8348022fd46d45005de63306a7513aece20a1be16edDaniel Dunbar  } else if ((FinalPhaseArg = Args.getLastArg(options::OPT_fsyntax_only)) ||
83564952508c2b0c8bffb45c8b410f0af3d2457f59bDaniel Dunbar             (FinalPhaseArg = Args.getLastArg(options::OPT_rewrite_objc)) ||
83663be57a832b2dab70592d1d9b37a5cd9a627356eDaniel Dunbar             (FinalPhaseArg = Args.getLastArg(options::OPT__analyze,
83763be57a832b2dab70592d1d9b37a5cd9a627356eDaniel Dunbar                                              options::OPT__analyze_auto)) ||
8385915fbf310e171c4cd3c2af05e9de360c0fa988aDaniel Dunbar             (FinalPhaseArg = Args.getLastArg(options::OPT_emit_ast)) ||
839ad2a9af666efdd9afe3bb5f886bcb0d1c9a0f0c3Daniel Dunbar             (FinalPhaseArg = Args.getLastArg(options::OPT_S))) {
840ad2a9af666efdd9afe3bb5f886bcb0d1c9a0f0c3Daniel Dunbar    FinalPhase = phases::Compile;
841af61c71137d1f7239d6b9d7425ce083db7ba31dfDaniel Dunbar
842af61c71137d1f7239d6b9d7425ce083db7ba31dfDaniel Dunbar    // -c only runs up to the assembler.
843ad2a9af666efdd9afe3bb5f886bcb0d1c9a0f0c3Daniel Dunbar  } else if ((FinalPhaseArg = Args.getLastArg(options::OPT_c))) {
844ad2a9af666efdd9afe3bb5f886bcb0d1c9a0f0c3Daniel Dunbar    FinalPhase = phases::Assemble;
845a82318332c9e9b61d3d17371e675ca2859877ee5Daniel Dunbar
846af61c71137d1f7239d6b9d7425ce083db7ba31dfDaniel Dunbar    // Otherwise do everything.
847af61c71137d1f7239d6b9d7425ce083db7ba31dfDaniel Dunbar  } else
848ad2a9af666efdd9afe3bb5f886bcb0d1c9a0f0c3Daniel Dunbar    FinalPhase = phases::Link;
849af61c71137d1f7239d6b9d7425ce083db7ba31dfDaniel Dunbar
850a82318332c9e9b61d3d17371e675ca2859877ee5Daniel Dunbar  // Reject -Z* at the top level, these options should never have been exposed
851a82318332c9e9b61d3d17371e675ca2859877ee5Daniel Dunbar  // by gcc.
852d7b88c2cb8986217f164203747d35c8f596e38c2Daniel Dunbar  if (Arg *A = Args.getLastArg(options::OPT_Z_Joined))
85338dd3d54186cf44ea9d37f463c3f2800ab526b82Daniel Dunbar    Diag(clang::diag::err_drv_use_of_Z_option) << A->getAsString(Args);
854af61c71137d1f7239d6b9d7425ce083db7ba31dfDaniel Dunbar
855ad2a9af666efdd9afe3bb5f886bcb0d1c9a0f0c3Daniel Dunbar  // Construct the actions to perform.
856ad2a9af666efdd9afe3bb5f886bcb0d1c9a0f0c3Daniel Dunbar  ActionList LinkerInputs;
85753ec55215075c8f4ddd47ca6ed7d382f16beb670Daniel Dunbar  for (unsigned i = 0, e = Inputs.size(); i != e; ++i) {
858ad2a9af666efdd9afe3bb5f886bcb0d1c9a0f0c3Daniel Dunbar    types::ID InputType = Inputs[i].first;
859ad2a9af666efdd9afe3bb5f886bcb0d1c9a0f0c3Daniel Dunbar    const Arg *InputArg = Inputs[i].second;
860ad2a9af666efdd9afe3bb5f886bcb0d1c9a0f0c3Daniel Dunbar
861ad2a9af666efdd9afe3bb5f886bcb0d1c9a0f0c3Daniel Dunbar    unsigned NumSteps = types::getNumCompilationPhases(InputType);
862ad2a9af666efdd9afe3bb5f886bcb0d1c9a0f0c3Daniel Dunbar    assert(NumSteps && "Invalid number of steps!");
863ad2a9af666efdd9afe3bb5f886bcb0d1c9a0f0c3Daniel Dunbar
864a82318332c9e9b61d3d17371e675ca2859877ee5Daniel Dunbar    // If the first step comes after the final phase we are doing as part of
865a82318332c9e9b61d3d17371e675ca2859877ee5Daniel Dunbar    // this compilation, warn the user about it.
866ad2a9af666efdd9afe3bb5f886bcb0d1c9a0f0c3Daniel Dunbar    phases::ID InitialPhase = types::getCompilationPhase(InputType, 0);
867ad2a9af666efdd9afe3bb5f886bcb0d1c9a0f0c3Daniel Dunbar    if (InitialPhase > FinalPhase) {
86805494a78c3746a360e81fc1d1797ce52df415b54Daniel Dunbar      // Claim here to avoid the more general unused warning.
86905494a78c3746a360e81fc1d1797ce52df415b54Daniel Dunbar      InputArg->claim();
870634b24563be901f8adc37c07ffba3eeac1f1d4ccDaniel Dunbar
87132c8cb66af6192adb82fe39779b460b605fa14edDaniel Dunbar      // Suppress all unused style warnings with -Qunused-arguments
87232c8cb66af6192adb82fe39779b460b605fa14edDaniel Dunbar      if (Args.hasArg(options::OPT_Qunused_arguments))
87332c8cb66af6192adb82fe39779b460b605fa14edDaniel Dunbar        continue;
87432c8cb66af6192adb82fe39779b460b605fa14edDaniel Dunbar
875634b24563be901f8adc37c07ffba3eeac1f1d4ccDaniel Dunbar      // Special case '-E' warning on a previously preprocessed file to make
876634b24563be901f8adc37c07ffba3eeac1f1d4ccDaniel Dunbar      // more sense.
877634b24563be901f8adc37c07ffba3eeac1f1d4ccDaniel Dunbar      if (InitialPhase == phases::Compile && FinalPhase == phases::Preprocess &&
878634b24563be901f8adc37c07ffba3eeac1f1d4ccDaniel Dunbar          getPreprocessedType(InputType) == types::TY_INVALID)
879634b24563be901f8adc37c07ffba3eeac1f1d4ccDaniel Dunbar        Diag(clang::diag::warn_drv_preprocessed_input_file_unused)
880634b24563be901f8adc37c07ffba3eeac1f1d4ccDaniel Dunbar          << InputArg->getAsString(Args)
881634b24563be901f8adc37c07ffba3eeac1f1d4ccDaniel Dunbar          << FinalPhaseArg->getOption().getName();
882634b24563be901f8adc37c07ffba3eeac1f1d4ccDaniel Dunbar      else
883634b24563be901f8adc37c07ffba3eeac1f1d4ccDaniel Dunbar        Diag(clang::diag::warn_drv_input_file_unused)
884634b24563be901f8adc37c07ffba3eeac1f1d4ccDaniel Dunbar          << InputArg->getAsString(Args)
885634b24563be901f8adc37c07ffba3eeac1f1d4ccDaniel Dunbar          << getPhaseName(InitialPhase)
886634b24563be901f8adc37c07ffba3eeac1f1d4ccDaniel Dunbar          << FinalPhaseArg->getOption().getName();
887ad2a9af666efdd9afe3bb5f886bcb0d1c9a0f0c3Daniel Dunbar      continue;
888ad2a9af666efdd9afe3bb5f886bcb0d1c9a0f0c3Daniel Dunbar    }
889a82318332c9e9b61d3d17371e675ca2859877ee5Daniel Dunbar
890ad2a9af666efdd9afe3bb5f886bcb0d1c9a0f0c3Daniel Dunbar    // Build the pipeline for this file.
8914d7b14734f2285695dcec347f8718b512093390aTed Kremenek    llvm::OwningPtr<Action> Current(new InputAction(*InputArg, InputType));
892ad2a9af666efdd9afe3bb5f886bcb0d1c9a0f0c3Daniel Dunbar    for (unsigned i = 0; i != NumSteps; ++i) {
893ad2a9af666efdd9afe3bb5f886bcb0d1c9a0f0c3Daniel Dunbar      phases::ID Phase = types::getCompilationPhase(InputType, i);
894ad2a9af666efdd9afe3bb5f886bcb0d1c9a0f0c3Daniel Dunbar
895ad2a9af666efdd9afe3bb5f886bcb0d1c9a0f0c3Daniel Dunbar      // We are done if this step is past what the user requested.
896ad2a9af666efdd9afe3bb5f886bcb0d1c9a0f0c3Daniel Dunbar      if (Phase > FinalPhase)
897ad2a9af666efdd9afe3bb5f886bcb0d1c9a0f0c3Daniel Dunbar        break;
898ad2a9af666efdd9afe3bb5f886bcb0d1c9a0f0c3Daniel Dunbar
899ad2a9af666efdd9afe3bb5f886bcb0d1c9a0f0c3Daniel Dunbar      // Queue linker inputs.
900ad2a9af666efdd9afe3bb5f886bcb0d1c9a0f0c3Daniel Dunbar      if (Phase == phases::Link) {
901ad2a9af666efdd9afe3bb5f886bcb0d1c9a0f0c3Daniel Dunbar        assert(i + 1 == NumSteps && "linking must be final compilation step.");
9024d7b14734f2285695dcec347f8718b512093390aTed Kremenek        LinkerInputs.push_back(Current.take());
903ad2a9af666efdd9afe3bb5f886bcb0d1c9a0f0c3Daniel Dunbar        break;
904ad2a9af666efdd9afe3bb5f886bcb0d1c9a0f0c3Daniel Dunbar      }
905ad2a9af666efdd9afe3bb5f886bcb0d1c9a0f0c3Daniel Dunbar
906a82318332c9e9b61d3d17371e675ca2859877ee5Daniel Dunbar      // Some types skip the assembler phase (e.g., llvm-bc), but we can't
907a82318332c9e9b61d3d17371e675ca2859877ee5Daniel Dunbar      // encode this in the steps because the intermediate type depends on
908a82318332c9e9b61d3d17371e675ca2859877ee5Daniel Dunbar      // arguments. Just special case here.
909337a6271b98c4c183f7eaad1563a75260b4f2871Daniel Dunbar      if (Phase == phases::Assemble && Current->getType() != types::TY_PP_Asm)
910337a6271b98c4c183f7eaad1563a75260b4f2871Daniel Dunbar        continue;
911337a6271b98c4c183f7eaad1563a75260b4f2871Daniel Dunbar
912ad2a9af666efdd9afe3bb5f886bcb0d1c9a0f0c3Daniel Dunbar      // Otherwise construct the appropriate action.
9134d7b14734f2285695dcec347f8718b512093390aTed Kremenek      Current.reset(ConstructPhaseAction(Args, Phase, Current.take()));
914ad2a9af666efdd9afe3bb5f886bcb0d1c9a0f0c3Daniel Dunbar      if (Current->getType() == types::TY_Nothing)
915ad2a9af666efdd9afe3bb5f886bcb0d1c9a0f0c3Daniel Dunbar        break;
916ad2a9af666efdd9afe3bb5f886bcb0d1c9a0f0c3Daniel Dunbar    }
917ad2a9af666efdd9afe3bb5f886bcb0d1c9a0f0c3Daniel Dunbar
918ad2a9af666efdd9afe3bb5f886bcb0d1c9a0f0c3Daniel Dunbar    // If we ended with something, add to the output list.
919ad2a9af666efdd9afe3bb5f886bcb0d1c9a0f0c3Daniel Dunbar    if (Current)
9204d7b14734f2285695dcec347f8718b512093390aTed Kremenek      Actions.push_back(Current.take());
92153ec55215075c8f4ddd47ca6ed7d382f16beb670Daniel Dunbar  }
922ad2a9af666efdd9afe3bb5f886bcb0d1c9a0f0c3Daniel Dunbar
923ad2a9af666efdd9afe3bb5f886bcb0d1c9a0f0c3Daniel Dunbar  // Add a link action if necessary.
924ad2a9af666efdd9afe3bb5f886bcb0d1c9a0f0c3Daniel Dunbar  if (!LinkerInputs.empty())
925ad2a9af666efdd9afe3bb5f886bcb0d1c9a0f0c3Daniel Dunbar    Actions.push_back(new LinkJobAction(LinkerInputs, types::TY_Image));
926f3601388f234f70778e3023018dfe57b64cf4043Daniel Dunbar
927f3601388f234f70778e3023018dfe57b64cf4043Daniel Dunbar  // If we are linking, claim any options which are obviously only used for
928f3601388f234f70778e3023018dfe57b64cf4043Daniel Dunbar  // compilation.
929f3601388f234f70778e3023018dfe57b64cf4043Daniel Dunbar  if (FinalPhase == phases::Link)
930f3601388f234f70778e3023018dfe57b64cf4043Daniel Dunbar    Args.ClaimAllArgs(options::OPT_CompileOnly_Group);
931ad2a9af666efdd9afe3bb5f886bcb0d1c9a0f0c3Daniel Dunbar}
932ad2a9af666efdd9afe3bb5f886bcb0d1c9a0f0c3Daniel Dunbar
933ad2a9af666efdd9afe3bb5f886bcb0d1c9a0f0c3Daniel DunbarAction *Driver::ConstructPhaseAction(const ArgList &Args, phases::ID Phase,
934ad2a9af666efdd9afe3bb5f886bcb0d1c9a0f0c3Daniel Dunbar                                     Action *Input) const {
9358f25c79e59d88df41c5a3cabba1c58035d384a6eDaniel Dunbar  llvm::PrettyStackTraceString CrashInfo("Constructing phase actions");
936ad2a9af666efdd9afe3bb5f886bcb0d1c9a0f0c3Daniel Dunbar  // Build the appropriate action.
937ad2a9af666efdd9afe3bb5f886bcb0d1c9a0f0c3Daniel Dunbar  switch (Phase) {
938ad2a9af666efdd9afe3bb5f886bcb0d1c9a0f0c3Daniel Dunbar  case phases::Link: assert(0 && "link action invalid here.");
939ad2a9af666efdd9afe3bb5f886bcb0d1c9a0f0c3Daniel Dunbar  case phases::Preprocess: {
940cd8e4c44dd068956e9181381be3ee2d49a0fac52Daniel Dunbar    types::ID OutputTy;
941cd8e4c44dd068956e9181381be3ee2d49a0fac52Daniel Dunbar    // -{M, MM} alter the output type.
9429eb93b07ea913e7ad0bcd15bd3e3662e2760c323Daniel Dunbar    if (Args.hasArg(options::OPT_M, options::OPT_MM)) {
943cd8e4c44dd068956e9181381be3ee2d49a0fac52Daniel Dunbar      OutputTy = types::TY_Dependencies;
944cd8e4c44dd068956e9181381be3ee2d49a0fac52Daniel Dunbar    } else {
945cd8e4c44dd068956e9181381be3ee2d49a0fac52Daniel Dunbar      OutputTy = types::getPreprocessedType(Input->getType());
946cd8e4c44dd068956e9181381be3ee2d49a0fac52Daniel Dunbar      assert(OutputTy != types::TY_INVALID &&
947cd8e4c44dd068956e9181381be3ee2d49a0fac52Daniel Dunbar             "Cannot preprocess this input type!");
948cd8e4c44dd068956e9181381be3ee2d49a0fac52Daniel Dunbar    }
949ad2a9af666efdd9afe3bb5f886bcb0d1c9a0f0c3Daniel Dunbar    return new PreprocessJobAction(Input, OutputTy);
950ad2a9af666efdd9afe3bb5f886bcb0d1c9a0f0c3Daniel Dunbar  }
951ad2a9af666efdd9afe3bb5f886bcb0d1c9a0f0c3Daniel Dunbar  case phases::Precompile:
952a82318332c9e9b61d3d17371e675ca2859877ee5Daniel Dunbar    return new PrecompileJobAction(Input, types::TY_PCH);
953ad2a9af666efdd9afe3bb5f886bcb0d1c9a0f0c3Daniel Dunbar  case phases::Compile: {
954ad2a9af666efdd9afe3bb5f886bcb0d1c9a0f0c3Daniel Dunbar    if (Args.hasArg(options::OPT_fsyntax_only)) {
955ad2a9af666efdd9afe3bb5f886bcb0d1c9a0f0c3Daniel Dunbar      return new CompileJobAction(Input, types::TY_Nothing);
95664952508c2b0c8bffb45c8b410f0af3d2457f59bDaniel Dunbar    } else if (Args.hasArg(options::OPT_rewrite_objc)) {
95764952508c2b0c8bffb45c8b410f0af3d2457f59bDaniel Dunbar      return new CompileJobAction(Input, types::TY_RewrittenObjC);
95863be57a832b2dab70592d1d9b37a5cd9a627356eDaniel Dunbar    } else if (Args.hasArg(options::OPT__analyze, options::OPT__analyze_auto)) {
959ad2a9af666efdd9afe3bb5f886bcb0d1c9a0f0c3Daniel Dunbar      return new AnalyzeJobAction(Input, types::TY_Plist);
9605915fbf310e171c4cd3c2af05e9de360c0fa988aDaniel Dunbar    } else if (Args.hasArg(options::OPT_emit_ast)) {
9615915fbf310e171c4cd3c2af05e9de360c0fa988aDaniel Dunbar      return new CompileJobAction(Input, types::TY_AST);
962ed798951b46555946c95cb76568ea3cf0b16c9abDaniel Dunbar    } else if (IsUsingLTO(Args)) {
963a82318332c9e9b61d3d17371e675ca2859877ee5Daniel Dunbar      types::ID Output =
9646c6424bc0d3b5f080a97b5f6ef4a8d70c38e38f5Daniel Dunbar        Args.hasArg(options::OPT_S) ? types::TY_LTO_IR : types::TY_LTO_BC;
965ad2a9af666efdd9afe3bb5f886bcb0d1c9a0f0c3Daniel Dunbar      return new CompileJobAction(Input, Output);
966ad2a9af666efdd9afe3bb5f886bcb0d1c9a0f0c3Daniel Dunbar    } else {
967ad2a9af666efdd9afe3bb5f886bcb0d1c9a0f0c3Daniel Dunbar      return new CompileJobAction(Input, types::TY_PP_Asm);
968ad2a9af666efdd9afe3bb5f886bcb0d1c9a0f0c3Daniel Dunbar    }
969ad2a9af666efdd9afe3bb5f886bcb0d1c9a0f0c3Daniel Dunbar  }
970ad2a9af666efdd9afe3bb5f886bcb0d1c9a0f0c3Daniel Dunbar  case phases::Assemble:
971ad2a9af666efdd9afe3bb5f886bcb0d1c9a0f0c3Daniel Dunbar    return new AssembleJobAction(Input, types::TY_Object);
972ad2a9af666efdd9afe3bb5f886bcb0d1c9a0f0c3Daniel Dunbar  }
973ad2a9af666efdd9afe3bb5f886bcb0d1c9a0f0c3Daniel Dunbar
974ad2a9af666efdd9afe3bb5f886bcb0d1c9a0f0c3Daniel Dunbar  assert(0 && "invalid phase in ConstructPhaseAction");
975ad2a9af666efdd9afe3bb5f886bcb0d1c9a0f0c3Daniel Dunbar  return 0;
97653ec55215075c8f4ddd47ca6ed7d382f16beb670Daniel Dunbar}
97753ec55215075c8f4ddd47ca6ed7d382f16beb670Daniel Dunbar
978ed798951b46555946c95cb76568ea3cf0b16c9abDaniel Dunbarbool Driver::IsUsingLTO(const ArgList &Args) const {
979ed798951b46555946c95cb76568ea3cf0b16c9abDaniel Dunbar  // Check for -emit-llvm or -flto.
980ed798951b46555946c95cb76568ea3cf0b16c9abDaniel Dunbar  if (Args.hasArg(options::OPT_emit_llvm) ||
981ed798951b46555946c95cb76568ea3cf0b16c9abDaniel Dunbar      Args.hasFlag(options::OPT_flto, options::OPT_fno_lto, false))
982ed798951b46555946c95cb76568ea3cf0b16c9abDaniel Dunbar    return true;
983ed798951b46555946c95cb76568ea3cf0b16c9abDaniel Dunbar
984ed798951b46555946c95cb76568ea3cf0b16c9abDaniel Dunbar  // Check for -O4.
985ed798951b46555946c95cb76568ea3cf0b16c9abDaniel Dunbar  if (const Arg *A = Args.getLastArg(options::OPT_O_Group))
986ed798951b46555946c95cb76568ea3cf0b16c9abDaniel Dunbar      return A->getOption().matches(options::OPT_O4);
987ed798951b46555946c95cb76568ea3cf0b16c9abDaniel Dunbar
988ed798951b46555946c95cb76568ea3cf0b16c9abDaniel Dunbar  return false;
989ed798951b46555946c95cb76568ea3cf0b16c9abDaniel Dunbar}
990ed798951b46555946c95cb76568ea3cf0b16c9abDaniel Dunbar
99121549237f14505cfc2a18a06416372a36229d0ceDaniel Dunbarvoid Driver::BuildJobs(Compilation &C) const {
9928f25c79e59d88df41c5a3cabba1c58035d384a6eDaniel Dunbar  llvm::PrettyStackTraceString CrashInfo("Building compilation jobs");
993f353c8cc2ee1cc16ff194b399a8d951f707fb129Daniel Dunbar
994f353c8cc2ee1cc16ff194b399a8d951f707fb129Daniel Dunbar  Arg *FinalOutput = C.getArgs().getLastArg(options::OPT_o);
995f353c8cc2ee1cc16ff194b399a8d951f707fb129Daniel Dunbar
996a82318332c9e9b61d3d17371e675ca2859877ee5Daniel Dunbar  // It is an error to provide a -o option if we are making multiple output
997a82318332c9e9b61d3d17371e675ca2859877ee5Daniel Dunbar  // files.
998f353c8cc2ee1cc16ff194b399a8d951f707fb129Daniel Dunbar  if (FinalOutput) {
999f353c8cc2ee1cc16ff194b399a8d951f707fb129Daniel Dunbar    unsigned NumOutputs = 0;
1000a82318332c9e9b61d3d17371e675ca2859877ee5Daniel Dunbar    for (ActionList::const_iterator it = C.getActions().begin(),
100121549237f14505cfc2a18a06416372a36229d0ceDaniel Dunbar           ie = C.getActions().end(); it != ie; ++it)
1002f353c8cc2ee1cc16ff194b399a8d951f707fb129Daniel Dunbar      if ((*it)->getType() != types::TY_Nothing)
1003f353c8cc2ee1cc16ff194b399a8d951f707fb129Daniel Dunbar        ++NumOutputs;
1004a82318332c9e9b61d3d17371e675ca2859877ee5Daniel Dunbar
1005f353c8cc2ee1cc16ff194b399a8d951f707fb129Daniel Dunbar    if (NumOutputs > 1) {
1006f353c8cc2ee1cc16ff194b399a8d951f707fb129Daniel Dunbar      Diag(clang::diag::err_drv_output_argument_with_multiple_files);
1007f353c8cc2ee1cc16ff194b399a8d951f707fb129Daniel Dunbar      FinalOutput = 0;
1008f353c8cc2ee1cc16ff194b399a8d951f707fb129Daniel Dunbar    }
1009f353c8cc2ee1cc16ff194b399a8d951f707fb129Daniel Dunbar  }
1010f353c8cc2ee1cc16ff194b399a8d951f707fb129Daniel Dunbar
1011a82318332c9e9b61d3d17371e675ca2859877ee5Daniel Dunbar  for (ActionList::const_iterator it = C.getActions().begin(),
101221549237f14505cfc2a18a06416372a36229d0ceDaniel Dunbar         ie = C.getActions().end(); it != ie; ++it) {
1013f353c8cc2ee1cc16ff194b399a8d951f707fb129Daniel Dunbar    Action *A = *it;
1014f353c8cc2ee1cc16ff194b399a8d951f707fb129Daniel Dunbar
1015a82318332c9e9b61d3d17371e675ca2859877ee5Daniel Dunbar    // If we are linking an image for multiple archs then the linker wants
1016a82318332c9e9b61d3d17371e675ca2859877ee5Daniel Dunbar    // -arch_multiple and -final_output <final image name>. Unfortunately, this
1017a82318332c9e9b61d3d17371e675ca2859877ee5Daniel Dunbar    // doesn't fit in cleanly because we have to pass this information down.
1018f353c8cc2ee1cc16ff194b399a8d951f707fb129Daniel Dunbar    //
1019a82318332c9e9b61d3d17371e675ca2859877ee5Daniel Dunbar    // FIXME: This is a hack; find a cleaner way to integrate this into the
1020a82318332c9e9b61d3d17371e675ca2859877ee5Daniel Dunbar    // process.
1021f353c8cc2ee1cc16ff194b399a8d951f707fb129Daniel Dunbar    const char *LinkingOutput = 0;
1022d7b88c2cb8986217f164203747d35c8f596e38c2Daniel Dunbar    if (isa<LipoJobAction>(A)) {
1023f353c8cc2ee1cc16ff194b399a8d951f707fb129Daniel Dunbar      if (FinalOutput)
1024f353c8cc2ee1cc16ff194b399a8d951f707fb129Daniel Dunbar        LinkingOutput = FinalOutput->getValue(C.getArgs());
1025f353c8cc2ee1cc16ff194b399a8d951f707fb129Daniel Dunbar      else
1026f353c8cc2ee1cc16ff194b399a8d951f707fb129Daniel Dunbar        LinkingOutput = DefaultImageName.c_str();
1027f353c8cc2ee1cc16ff194b399a8d951f707fb129Daniel Dunbar    }
1028f353c8cc2ee1cc16ff194b399a8d951f707fb129Daniel Dunbar
1029f353c8cc2ee1cc16ff194b399a8d951f707fb129Daniel Dunbar    InputInfo II;
1030a82318332c9e9b61d3d17371e675ca2859877ee5Daniel Dunbar    BuildJobsForAction(C, A, &C.getDefaultToolChain(),
10314954018954bbc97363eef02d0c83bea19ce9b329Daniel Dunbar                       /*BoundArch*/0,
1032f353c8cc2ee1cc16ff194b399a8d951f707fb129Daniel Dunbar                       /*AtTopLevel*/ true,
1033f353c8cc2ee1cc16ff194b399a8d951f707fb129Daniel Dunbar                       /*LinkingOutput*/ LinkingOutput,
1034f353c8cc2ee1cc16ff194b399a8d951f707fb129Daniel Dunbar                       II);
1035f353c8cc2ee1cc16ff194b399a8d951f707fb129Daniel Dunbar  }
1036586dc233bb88f2920c9f3638f69cef0ccd55dcedDaniel Dunbar
1037a82318332c9e9b61d3d17371e675ca2859877ee5Daniel Dunbar  // If the user passed -Qunused-arguments or there were errors, don't warn
1038a82318332c9e9b61d3d17371e675ca2859877ee5Daniel Dunbar  // about any unused arguments.
1039be3aab6abe5e66bb86596da806acc49614eacb69Argyrios Kyrtzidis  if (Diags.hasErrorOccurred() ||
10401e23f5f963dd6a3cee43ace77578161798e41e2dDaniel Dunbar      C.getArgs().hasArg(options::OPT_Qunused_arguments))
1041af2e4baa2a75471e820030701225a1ca02c7308fDaniel Dunbar    return;
1042af2e4baa2a75471e820030701225a1ca02c7308fDaniel Dunbar
1043a2094e76fc545b9e17c851c3d2c46b719c5f17ebDaniel Dunbar  // Claim -### here.
1044a2094e76fc545b9e17c851c3d2c46b719c5f17ebDaniel Dunbar  (void) C.getArgs().hasArg(options::OPT__HASH_HASH_HASH);
1045a82318332c9e9b61d3d17371e675ca2859877ee5Daniel Dunbar
1046586dc233bb88f2920c9f3638f69cef0ccd55dcedDaniel Dunbar  for (ArgList::const_iterator it = C.getArgs().begin(), ie = C.getArgs().end();
1047586dc233bb88f2920c9f3638f69cef0ccd55dcedDaniel Dunbar       it != ie; ++it) {
1048586dc233bb88f2920c9f3638f69cef0ccd55dcedDaniel Dunbar    Arg *A = *it;
1049a82318332c9e9b61d3d17371e675ca2859877ee5Daniel Dunbar
1050586dc233bb88f2920c9f3638f69cef0ccd55dcedDaniel Dunbar    // FIXME: It would be nice to be able to send the argument to the
1051a82318332c9e9b61d3d17371e675ca2859877ee5Daniel Dunbar    // Diagnostic, so that extra values, position, and so on could be printed.
10524f53b298846d720fbb906373f3f28d92f2121f35Daniel Dunbar    if (!A->isClaimed()) {
10531e23f5f963dd6a3cee43ace77578161798e41e2dDaniel Dunbar      if (A->getOption().hasNoArgumentUnused())
10541e23f5f963dd6a3cee43ace77578161798e41e2dDaniel Dunbar        continue;
10551e23f5f963dd6a3cee43ace77578161798e41e2dDaniel Dunbar
1056a82318332c9e9b61d3d17371e675ca2859877ee5Daniel Dunbar      // Suppress the warning automatically if this is just a flag, and it is an
1057a82318332c9e9b61d3d17371e675ca2859877ee5Daniel Dunbar      // instance of an argument we already claimed.
10584f53b298846d720fbb906373f3f28d92f2121f35Daniel Dunbar      const Option &Opt = A->getOption();
10594f53b298846d720fbb906373f3f28d92f2121f35Daniel Dunbar      if (isa<FlagOption>(Opt)) {
10604f53b298846d720fbb906373f3f28d92f2121f35Daniel Dunbar        bool DuplicateClaimed = false;
10614f53b298846d720fbb906373f3f28d92f2121f35Daniel Dunbar
1062cdd9686b890ebdc10039ae256ef4c9dfb5ebacb7Daniel Dunbar        for (arg_iterator it = C.getArgs().filtered_begin(&Opt),
1063cdd9686b890ebdc10039ae256ef4c9dfb5ebacb7Daniel Dunbar               ie = C.getArgs().filtered_end(); it != ie; ++it) {
1064cdd9686b890ebdc10039ae256ef4c9dfb5ebacb7Daniel Dunbar          if ((*it)->isClaimed()) {
10654f53b298846d720fbb906373f3f28d92f2121f35Daniel Dunbar            DuplicateClaimed = true;
10664f53b298846d720fbb906373f3f28d92f2121f35Daniel Dunbar            break;
10674f53b298846d720fbb906373f3f28d92f2121f35Daniel Dunbar          }
10684f53b298846d720fbb906373f3f28d92f2121f35Daniel Dunbar        }
10694f53b298846d720fbb906373f3f28d92f2121f35Daniel Dunbar
10704f53b298846d720fbb906373f3f28d92f2121f35Daniel Dunbar        if (DuplicateClaimed)
10714f53b298846d720fbb906373f3f28d92f2121f35Daniel Dunbar          continue;
10724f53b298846d720fbb906373f3f28d92f2121f35Daniel Dunbar      }
10734f53b298846d720fbb906373f3f28d92f2121f35Daniel Dunbar
1074a82318332c9e9b61d3d17371e675ca2859877ee5Daniel Dunbar      Diag(clang::diag::warn_drv_unused_argument)
107538dd3d54186cf44ea9d37f463c3f2800ab526b82Daniel Dunbar        << A->getAsString(C.getArgs());
10764f53b298846d720fbb906373f3f28d92f2121f35Daniel Dunbar    }
1077586dc233bb88f2920c9f3638f69cef0ccd55dcedDaniel Dunbar  }
107857b704d8d8f49bcaf856a3e37941d5ac6456eb50Daniel Dunbar}
107957b704d8d8f49bcaf856a3e37941d5ac6456eb50Daniel Dunbar
10808767cbc475ed96397b6f08617814eeb9cab121bdDaniel Dunbarstatic const Tool &SelectToolForJob(Compilation &C, const ToolChain *TC,
10818767cbc475ed96397b6f08617814eeb9cab121bdDaniel Dunbar                                    const JobAction *JA,
10828767cbc475ed96397b6f08617814eeb9cab121bdDaniel Dunbar                                    const ActionList *&Inputs) {
10838767cbc475ed96397b6f08617814eeb9cab121bdDaniel Dunbar  const Tool *ToolForJob = 0;
10848767cbc475ed96397b6f08617814eeb9cab121bdDaniel Dunbar
10858767cbc475ed96397b6f08617814eeb9cab121bdDaniel Dunbar  // See if we should look for a compiler with an integrated assembler. We match
10868767cbc475ed96397b6f08617814eeb9cab121bdDaniel Dunbar  // bottom up, so what we are actually looking for is an assembler job with a
10878767cbc475ed96397b6f08617814eeb9cab121bdDaniel Dunbar  // compiler input.
1088eb840bd0e473ee11622e084a0d6ff276ee7aa5c6Daniel Dunbar
1089eb840bd0e473ee11622e084a0d6ff276ee7aa5c6Daniel Dunbar  // FIXME: This doesn't belong here, but ideally we will support static soon
1090eb840bd0e473ee11622e084a0d6ff276ee7aa5c6Daniel Dunbar  // anyway.
1091eb840bd0e473ee11622e084a0d6ff276ee7aa5c6Daniel Dunbar  bool HasStatic = (C.getArgs().hasArg(options::OPT_mkernel) ||
1092eb840bd0e473ee11622e084a0d6ff276ee7aa5c6Daniel Dunbar                    C.getArgs().hasArg(options::OPT_static) ||
1093eb840bd0e473ee11622e084a0d6ff276ee7aa5c6Daniel Dunbar                    C.getArgs().hasArg(options::OPT_fapple_kext));
10947693b1021862ea04f522cca9ca1df67bd1d2d54eRafael Espindola  bool IsDarwin = TC->getTriple().getOS() == llvm::Triple::Darwin;
10957693b1021862ea04f522cca9ca1df67bd1d2d54eRafael Espindola  bool IsIADefault = TC->IsIntegratedAssemblerDefault() &&
10967693b1021862ea04f522cca9ca1df67bd1d2d54eRafael Espindola    !(HasStatic && IsDarwin);
1097eb840bd0e473ee11622e084a0d6ff276ee7aa5c6Daniel Dunbar  if (C.getArgs().hasFlag(options::OPT_integrated_as,
10988767cbc475ed96397b6f08617814eeb9cab121bdDaniel Dunbar                         options::OPT_no_integrated_as,
1099eb840bd0e473ee11622e084a0d6ff276ee7aa5c6Daniel Dunbar                         IsIADefault) &&
11008767cbc475ed96397b6f08617814eeb9cab121bdDaniel Dunbar      !C.getArgs().hasArg(options::OPT_save_temps) &&
11018767cbc475ed96397b6f08617814eeb9cab121bdDaniel Dunbar      isa<AssembleJobAction>(JA) &&
11028767cbc475ed96397b6f08617814eeb9cab121bdDaniel Dunbar      Inputs->size() == 1 && isa<CompileJobAction>(*Inputs->begin())) {
1103ac0659ae4124156915eddf70e78065df224d34c8Daniel Dunbar    const Tool &Compiler = TC->SelectTool(
1104ac0659ae4124156915eddf70e78065df224d34c8Daniel Dunbar      C, cast<JobAction>(**Inputs->begin()), (*Inputs)[0]->getInputs());
11058767cbc475ed96397b6f08617814eeb9cab121bdDaniel Dunbar    if (Compiler.hasIntegratedAssembler()) {
11068767cbc475ed96397b6f08617814eeb9cab121bdDaniel Dunbar      Inputs = &(*Inputs)[0]->getInputs();
11078767cbc475ed96397b6f08617814eeb9cab121bdDaniel Dunbar      ToolForJob = &Compiler;
11088767cbc475ed96397b6f08617814eeb9cab121bdDaniel Dunbar    }
11098767cbc475ed96397b6f08617814eeb9cab121bdDaniel Dunbar  }
11108767cbc475ed96397b6f08617814eeb9cab121bdDaniel Dunbar
11118767cbc475ed96397b6f08617814eeb9cab121bdDaniel Dunbar  // Otherwise use the tool for the current job.
11128767cbc475ed96397b6f08617814eeb9cab121bdDaniel Dunbar  if (!ToolForJob)
1113ac0659ae4124156915eddf70e78065df224d34c8Daniel Dunbar    ToolForJob = &TC->SelectTool(C, *JA, *Inputs);
11148767cbc475ed96397b6f08617814eeb9cab121bdDaniel Dunbar
11158767cbc475ed96397b6f08617814eeb9cab121bdDaniel Dunbar  // See if we should use an integrated preprocessor. We do so when we have
11168767cbc475ed96397b6f08617814eeb9cab121bdDaniel Dunbar  // exactly one input, since this is the only use case we care about
11178767cbc475ed96397b6f08617814eeb9cab121bdDaniel Dunbar  // (irrelevant since we don't support combine yet).
11188767cbc475ed96397b6f08617814eeb9cab121bdDaniel Dunbar  if (Inputs->size() == 1 && isa<PreprocessJobAction>(*Inputs->begin()) &&
11198767cbc475ed96397b6f08617814eeb9cab121bdDaniel Dunbar      !C.getArgs().hasArg(options::OPT_no_integrated_cpp) &&
11208767cbc475ed96397b6f08617814eeb9cab121bdDaniel Dunbar      !C.getArgs().hasArg(options::OPT_traditional_cpp) &&
11218767cbc475ed96397b6f08617814eeb9cab121bdDaniel Dunbar      !C.getArgs().hasArg(options::OPT_save_temps) &&
11228767cbc475ed96397b6f08617814eeb9cab121bdDaniel Dunbar      ToolForJob->hasIntegratedCPP())
11238767cbc475ed96397b6f08617814eeb9cab121bdDaniel Dunbar    Inputs = &(*Inputs)[0]->getInputs();
11248767cbc475ed96397b6f08617814eeb9cab121bdDaniel Dunbar
11258767cbc475ed96397b6f08617814eeb9cab121bdDaniel Dunbar  return *ToolForJob;
11268767cbc475ed96397b6f08617814eeb9cab121bdDaniel Dunbar}
11278767cbc475ed96397b6f08617814eeb9cab121bdDaniel Dunbar
1128f353c8cc2ee1cc16ff194b399a8d951f707fb129Daniel Dunbarvoid Driver::BuildJobsForAction(Compilation &C,
1129f353c8cc2ee1cc16ff194b399a8d951f707fb129Daniel Dunbar                                const Action *A,
1130f353c8cc2ee1cc16ff194b399a8d951f707fb129Daniel Dunbar                                const ToolChain *TC,
11314954018954bbc97363eef02d0c83bea19ce9b329Daniel Dunbar                                const char *BoundArch,
1132f353c8cc2ee1cc16ff194b399a8d951f707fb129Daniel Dunbar                                bool AtTopLevel,
1133f353c8cc2ee1cc16ff194b399a8d951f707fb129Daniel Dunbar                                const char *LinkingOutput,
1134f353c8cc2ee1cc16ff194b399a8d951f707fb129Daniel Dunbar                                InputInfo &Result) const {
1135a82318332c9e9b61d3d17371e675ca2859877ee5Daniel Dunbar  llvm::PrettyStackTraceString CrashInfo("Building compilation jobs");
113660ccc7677a5416df3a8f8bde79ab35f85cb66e14Daniel Dunbar
1137f353c8cc2ee1cc16ff194b399a8d951f707fb129Daniel Dunbar  if (const InputAction *IA = dyn_cast<InputAction>(A)) {
1138a82318332c9e9b61d3d17371e675ca2859877ee5Daniel Dunbar    // FIXME: It would be nice to not claim this here; maybe the old scheme of
1139a82318332c9e9b61d3d17371e675ca2859877ee5Daniel Dunbar    // just using Args was better?
1140115a79277edababaf1b26e3654044ae983197679Daniel Dunbar    const Arg &Input = IA->getInputArg();
1141115a79277edababaf1b26e3654044ae983197679Daniel Dunbar    Input.claim();
1142532c1ec307b8689e95896a11ce5ae4661fa9e5d3Daniel Dunbar    if (Input.getOption().matches(options::OPT_INPUT)) {
1143115a79277edababaf1b26e3654044ae983197679Daniel Dunbar      const char *Name = Input.getValue(C.getArgs());
1144115a79277edababaf1b26e3654044ae983197679Daniel Dunbar      Result = InputInfo(Name, A->getType(), Name);
1145115a79277edababaf1b26e3654044ae983197679Daniel Dunbar    } else
1146115a79277edababaf1b26e3654044ae983197679Daniel Dunbar      Result = InputInfo(&Input, A->getType(), "");
1147f353c8cc2ee1cc16ff194b399a8d951f707fb129Daniel Dunbar    return;
1148f353c8cc2ee1cc16ff194b399a8d951f707fb129Daniel Dunbar  }
1149f353c8cc2ee1cc16ff194b399a8d951f707fb129Daniel Dunbar
1150f353c8cc2ee1cc16ff194b399a8d951f707fb129Daniel Dunbar  if (const BindArchAction *BAA = dyn_cast<BindArchAction>(A)) {
1151d7502d0a662b5c299125aba04245aefce67cbc22Daniel Dunbar    const ToolChain *TC = &C.getDefaultToolChain();
1152d7502d0a662b5c299125aba04245aefce67cbc22Daniel Dunbar
1153cb8ab23f7c800b041aeb6fc38c341d1aa0da86bfDaniel Dunbar    std::string Arch;
1154d7502d0a662b5c299125aba04245aefce67cbc22Daniel Dunbar    if (BAA->getArchName())
1155d7502d0a662b5c299125aba04245aefce67cbc22Daniel Dunbar      TC = Host->CreateToolChain(C.getArgs(), BAA->getArchName());
1156d7502d0a662b5c299125aba04245aefce67cbc22Daniel Dunbar
11574954018954bbc97363eef02d0c83bea19ce9b329Daniel Dunbar    BuildJobsForAction(C, *BAA->begin(), TC, BAA->getArchName(),
1158e4341253cc5d9c05c256b90eb3f816d256264cebDaniel Dunbar                       AtTopLevel, LinkingOutput, Result);
1159f353c8cc2ee1cc16ff194b399a8d951f707fb129Daniel Dunbar    return;
1160f353c8cc2ee1cc16ff194b399a8d951f707fb129Daniel Dunbar  }
1161f353c8cc2ee1cc16ff194b399a8d951f707fb129Daniel Dunbar
1162f353c8cc2ee1cc16ff194b399a8d951f707fb129Daniel Dunbar  const ActionList *Inputs = &A->getInputs();
11638767cbc475ed96397b6f08617814eeb9cab121bdDaniel Dunbar
11648767cbc475ed96397b6f08617814eeb9cab121bdDaniel Dunbar  const JobAction *JA = cast<JobAction>(A);
11658767cbc475ed96397b6f08617814eeb9cab121bdDaniel Dunbar  const Tool &T = SelectToolForJob(C, TC, JA, Inputs);
1166f353c8cc2ee1cc16ff194b399a8d951f707fb129Daniel Dunbar
1167f353c8cc2ee1cc16ff194b399a8d951f707fb129Daniel Dunbar  // Only use pipes when there is exactly one input.
116847ac7d27c44bd64a7d0fc03d4babc196cf2b8230Daniel Dunbar  InputInfoList InputInfos;
1169f353c8cc2ee1cc16ff194b399a8d951f707fb129Daniel Dunbar  for (ActionList::const_iterator it = Inputs->begin(), ie = Inputs->end();
1170f353c8cc2ee1cc16ff194b399a8d951f707fb129Daniel Dunbar       it != ie; ++it) {
1171be1cc3eec682ca73361edb4109a7969452d3dbebDaniel Dunbar    // Treat dsymutil sub-jobs as being at the top-level too, they shouldn't get
1172be1cc3eec682ca73361edb4109a7969452d3dbebDaniel Dunbar    // temporary output names.
1173be1cc3eec682ca73361edb4109a7969452d3dbebDaniel Dunbar    //
1174be1cc3eec682ca73361edb4109a7969452d3dbebDaniel Dunbar    // FIXME: Clean this up.
1175be1cc3eec682ca73361edb4109a7969452d3dbebDaniel Dunbar    bool SubJobAtTopLevel = false;
1176be1cc3eec682ca73361edb4109a7969452d3dbebDaniel Dunbar    if (AtTopLevel && isa<DsymutilJobAction>(A))
1177be1cc3eec682ca73361edb4109a7969452d3dbebDaniel Dunbar      SubJobAtTopLevel = true;
1178be1cc3eec682ca73361edb4109a7969452d3dbebDaniel Dunbar
1179f353c8cc2ee1cc16ff194b399a8d951f707fb129Daniel Dunbar    InputInfo II;
1180e4341253cc5d9c05c256b90eb3f816d256264cebDaniel Dunbar    BuildJobsForAction(C, *it, TC, BoundArch,
1181be1cc3eec682ca73361edb4109a7969452d3dbebDaniel Dunbar                       SubJobAtTopLevel, LinkingOutput, II);
1182f353c8cc2ee1cc16ff194b399a8d951f707fb129Daniel Dunbar    InputInfos.push_back(II);
1183f353c8cc2ee1cc16ff194b399a8d951f707fb129Daniel Dunbar  }
1184f353c8cc2ee1cc16ff194b399a8d951f707fb129Daniel Dunbar
1185f353c8cc2ee1cc16ff194b399a8d951f707fb129Daniel Dunbar  // Always use the first input as the base input.
1186f353c8cc2ee1cc16ff194b399a8d951f707fb129Daniel Dunbar  const char *BaseInput = InputInfos[0].getBaseInput();
1187441d060838a5797691777dfcc992ff836b73dcd1Daniel Dunbar
1188be1cc3eec682ca73361edb4109a7969452d3dbebDaniel Dunbar  // ... except dsymutil actions, which use their actual input as the base
1189be1cc3eec682ca73361edb4109a7969452d3dbebDaniel Dunbar  // input.
1190be1cc3eec682ca73361edb4109a7969452d3dbebDaniel Dunbar  if (JA->getType() == types::TY_dSYM)
1191be1cc3eec682ca73361edb4109a7969452d3dbebDaniel Dunbar    BaseInput = InputInfos[0].getFilename();
1192be1cc3eec682ca73361edb4109a7969452d3dbebDaniel Dunbar
11939b18cca61197421af872df81014390c9cb813516Daniel Dunbar  // Determine the place to write output to, if any.
1194441d060838a5797691777dfcc992ff836b73dcd1Daniel Dunbar  if (JA->getType() == types::TY_Nothing) {
11955c3c1d7b494660ba5e8983ee4584622750725ac2Daniel Dunbar    Result = InputInfo(A->getType(), BaseInput);
1196441d060838a5797691777dfcc992ff836b73dcd1Daniel Dunbar  } else {
11975c3c1d7b494660ba5e8983ee4584622750725ac2Daniel Dunbar    Result = InputInfo(GetNamedOutputPath(C, *JA, BaseInput, AtTopLevel),
11985c3c1d7b494660ba5e8983ee4584622750725ac2Daniel Dunbar                       A->getType(), BaseInput);
1199441d060838a5797691777dfcc992ff836b73dcd1Daniel Dunbar  }
1200441d060838a5797691777dfcc992ff836b73dcd1Daniel Dunbar
1201d7a3ba03f69892aac02e0771eb2e6d1b7b1d1267Chad Rosier  if (CCCPrintBindings) {
1202cd8e4c44dd068956e9181381be3ee2d49a0fac52Daniel Dunbar    llvm::errs() << "# \"" << T.getToolChain().getTripleString() << '"'
1203cd8e4c44dd068956e9181381be3ee2d49a0fac52Daniel Dunbar                 << " - \"" << T.getName() << "\", inputs: [";
12045c3c1d7b494660ba5e8983ee4584622750725ac2Daniel Dunbar    for (unsigned i = 0, e = InputInfos.size(); i != e; ++i) {
12055c3c1d7b494660ba5e8983ee4584622750725ac2Daniel Dunbar      llvm::errs() << InputInfos[i].getAsString();
12065c3c1d7b494660ba5e8983ee4584622750725ac2Daniel Dunbar      if (i + 1 != e)
12075c3c1d7b494660ba5e8983ee4584622750725ac2Daniel Dunbar        llvm::errs() << ", ";
12085c3c1d7b494660ba5e8983ee4584622750725ac2Daniel Dunbar    }
12095c3c1d7b494660ba5e8983ee4584622750725ac2Daniel Dunbar    llvm::errs() << "], output: " << Result.getAsString() << "\n";
12105c3c1d7b494660ba5e8983ee4584622750725ac2Daniel Dunbar  } else {
12112fe238ed293bd4bc27af9beb9fa151fad2146fa8Daniel Dunbar    T.ConstructJob(C, *JA, Result, InputInfos,
12124954018954bbc97363eef02d0c83bea19ce9b329Daniel Dunbar                   C.getArgsForToolChain(TC, BoundArch), LinkingOutput);
12135c3c1d7b494660ba5e8983ee4584622750725ac2Daniel Dunbar  }
1214f353c8cc2ee1cc16ff194b399a8d951f707fb129Daniel Dunbar}
1215f353c8cc2ee1cc16ff194b399a8d951f707fb129Daniel Dunbar
1216a82318332c9e9b61d3d17371e675ca2859877ee5Daniel Dunbarconst char *Driver::GetNamedOutputPath(Compilation &C,
1217441d060838a5797691777dfcc992ff836b73dcd1Daniel Dunbar                                       const JobAction &JA,
1218441d060838a5797691777dfcc992ff836b73dcd1Daniel Dunbar                                       const char *BaseInput,
1219441d060838a5797691777dfcc992ff836b73dcd1Daniel Dunbar                                       bool AtTopLevel) const {
12208f25c79e59d88df41c5a3cabba1c58035d384a6eDaniel Dunbar  llvm::PrettyStackTraceString CrashInfo("Computing output path");
1221441d060838a5797691777dfcc992ff836b73dcd1Daniel Dunbar  // Output to a user requested destination?
1222be1cc3eec682ca73361edb4109a7969452d3dbebDaniel Dunbar  if (AtTopLevel && !isa<DsymutilJobAction>(JA)) {
1223441d060838a5797691777dfcc992ff836b73dcd1Daniel Dunbar    if (Arg *FinalOutput = C.getArgs().getLastArg(options::OPT_o))
1224441d060838a5797691777dfcc992ff836b73dcd1Daniel Dunbar      return C.addResultFile(FinalOutput->getValue(C.getArgs()));
1225441d060838a5797691777dfcc992ff836b73dcd1Daniel Dunbar  }
1226441d060838a5797691777dfcc992ff836b73dcd1Daniel Dunbar
1227bfd21240b6b4989854c8f5331dc86ce7aecf1ad4Nick Lewycky  // Default to writing to stdout?
1228d7a3ba03f69892aac02e0771eb2e6d1b7b1d1267Chad Rosier  if (AtTopLevel && isa<PreprocessJobAction>(JA))
1229bfd21240b6b4989854c8f5331dc86ce7aecf1ad4Nick Lewycky    return "-";
1230bfd21240b6b4989854c8f5331dc86ce7aecf1ad4Nick Lewycky
1231441d060838a5797691777dfcc992ff836b73dcd1Daniel Dunbar  // Output to a temporary file?
1232d7a3ba03f69892aac02e0771eb2e6d1b7b1d1267Chad Rosier  if (!AtTopLevel && !C.getArgs().hasArg(options::OPT_save_temps)) {
1233a82318332c9e9b61d3d17371e675ca2859877ee5Daniel Dunbar    std::string TmpName =
1234214399ebd73545dde02b4a45872e7ca9e1d9e742Daniel Dunbar      GetTemporaryPath(types::getTypeTempSuffix(JA.getType()));
1235214399ebd73545dde02b4a45872e7ca9e1d9e742Daniel Dunbar    return C.addTempFile(C.getArgs().MakeArgString(TmpName.c_str()));
1236441d060838a5797691777dfcc992ff836b73dcd1Daniel Dunbar  }
1237441d060838a5797691777dfcc992ff836b73dcd1Daniel Dunbar
1238472ccff00cdbcd095c3ba933b9e3f202719f118fMichael J. Spencer  llvm::SmallString<128> BasePath(BaseInput);
12395f9e272e632e951b1efe824cd16acb4d96077930Chris Lattner  StringRef BaseName;
124059f9046031bc9703d405b5a9ec61541a90e03defDaniel Dunbar
124159f9046031bc9703d405b5a9ec61541a90e03defDaniel Dunbar  // Dsymutil actions should use the full path.
124259f9046031bc9703d405b5a9ec61541a90e03defDaniel Dunbar  if (isa<DsymutilJobAction>(JA))
124359f9046031bc9703d405b5a9ec61541a90e03defDaniel Dunbar    BaseName = BasePath;
124459f9046031bc9703d405b5a9ec61541a90e03defDaniel Dunbar  else
124559f9046031bc9703d405b5a9ec61541a90e03defDaniel Dunbar    BaseName = llvm::sys::path::filename(BasePath);
1246441d060838a5797691777dfcc992ff836b73dcd1Daniel Dunbar
1247441d060838a5797691777dfcc992ff836b73dcd1Daniel Dunbar  // Determine what the derived output name should be.
1248441d060838a5797691777dfcc992ff836b73dcd1Daniel Dunbar  const char *NamedOutput;
1249441d060838a5797691777dfcc992ff836b73dcd1Daniel Dunbar  if (JA.getType() == types::TY_Image) {
1250441d060838a5797691777dfcc992ff836b73dcd1Daniel Dunbar    NamedOutput = DefaultImageName.c_str();
1251441d060838a5797691777dfcc992ff836b73dcd1Daniel Dunbar  } else {
1252441d060838a5797691777dfcc992ff836b73dcd1Daniel Dunbar    const char *Suffix = types::getTypeTempSuffix(JA.getType());
1253441d060838a5797691777dfcc992ff836b73dcd1Daniel Dunbar    assert(Suffix && "All types used for output should have a suffix.");
1254441d060838a5797691777dfcc992ff836b73dcd1Daniel Dunbar
1255441d060838a5797691777dfcc992ff836b73dcd1Daniel Dunbar    std::string::size_type End = std::string::npos;
1256441d060838a5797691777dfcc992ff836b73dcd1Daniel Dunbar    if (!types::appendSuffixForType(JA.getType()))
1257441d060838a5797691777dfcc992ff836b73dcd1Daniel Dunbar      End = BaseName.rfind('.');
1258441d060838a5797691777dfcc992ff836b73dcd1Daniel Dunbar    std::string Suffixed(BaseName.substr(0, End));
1259441d060838a5797691777dfcc992ff836b73dcd1Daniel Dunbar    Suffixed += '.';
1260441d060838a5797691777dfcc992ff836b73dcd1Daniel Dunbar    Suffixed += Suffix;
1261441d060838a5797691777dfcc992ff836b73dcd1Daniel Dunbar    NamedOutput = C.getArgs().MakeArgString(Suffixed.c_str());
1262441d060838a5797691777dfcc992ff836b73dcd1Daniel Dunbar  }
1263441d060838a5797691777dfcc992ff836b73dcd1Daniel Dunbar
12643e4d10917a7ef84ebf86062e8c912de9c00597c9Chad Rosier  // If we're saving temps and the temp filename conflicts with the input
12653e4d10917a7ef84ebf86062e8c912de9c00597c9Chad Rosier  // filename, then avoid overwriting input file.
12663e4d10917a7ef84ebf86062e8c912de9c00597c9Chad Rosier  if (!AtTopLevel && C.getArgs().hasArg(options::OPT_save_temps) &&
12673e4d10917a7ef84ebf86062e8c912de9c00597c9Chad Rosier    NamedOutput == BaseName) {
12683e4d10917a7ef84ebf86062e8c912de9c00597c9Chad Rosier    std::string TmpName =
12693e4d10917a7ef84ebf86062e8c912de9c00597c9Chad Rosier      GetTemporaryPath(types::getTypeTempSuffix(JA.getType()));
12703e4d10917a7ef84ebf86062e8c912de9c00597c9Chad Rosier    return C.addTempFile(C.getArgs().MakeArgString(TmpName.c_str()));
12713e4d10917a7ef84ebf86062e8c912de9c00597c9Chad Rosier  }
12723e4d10917a7ef84ebf86062e8c912de9c00597c9Chad Rosier
1273a82318332c9e9b61d3d17371e675ca2859877ee5Daniel Dunbar  // As an annoying special case, PCH generation doesn't strip the pathname.
1274441d060838a5797691777dfcc992ff836b73dcd1Daniel Dunbar  if (JA.getType() == types::TY_PCH) {
1275472ccff00cdbcd095c3ba933b9e3f202719f118fMichael J. Spencer    llvm::sys::path::remove_filename(BasePath);
1276472ccff00cdbcd095c3ba933b9e3f202719f118fMichael J. Spencer    if (BasePath.empty())
127756c5594515571eab0e02368ed05416b9dac20837Daniel Dunbar      BasePath = NamedOutput;
127856c5594515571eab0e02368ed05416b9dac20837Daniel Dunbar    else
1279472ccff00cdbcd095c3ba933b9e3f202719f118fMichael J. Spencer      llvm::sys::path::append(BasePath, NamedOutput);
1280441d060838a5797691777dfcc992ff836b73dcd1Daniel Dunbar    return C.addResultFile(C.getArgs().MakeArgString(BasePath.c_str()));
1281441d060838a5797691777dfcc992ff836b73dcd1Daniel Dunbar  } else {
1282441d060838a5797691777dfcc992ff836b73dcd1Daniel Dunbar    return C.addResultFile(NamedOutput);
1283441d060838a5797691777dfcc992ff836b73dcd1Daniel Dunbar  }
1284441d060838a5797691777dfcc992ff836b73dcd1Daniel Dunbar}
1285441d060838a5797691777dfcc992ff836b73dcd1Daniel Dunbar
12865ed34f4c58b6ad4e21038d713c1fae31a6146ff5Daniel Dunbarstd::string Driver::GetFilePath(const char *Name, const ToolChain &TC) const {
128748ad6094679ca2bf4f3593068e02e7a208c1a73cChandler Carruth  // Respect a limited subset of the '-Bprefix' functionality in GCC by
128848ad6094679ca2bf4f3593068e02e7a208c1a73cChandler Carruth  // attempting to use this prefix when lokup up program paths.
128909982cec0029bc495591067fa89967b6b4d1fa19Benjamin Kramer  for (Driver::prefix_list::const_iterator it = PrefixDirs.begin(),
129009982cec0029bc495591067fa89967b6b4d1fa19Benjamin Kramer       ie = PrefixDirs.end(); it != ie; ++it) {
12918ab2bdcc4f397e100c684ede8e8ca6e226e1380aJoerg Sonnenberger    std::string Dir(*it);
12928ab2bdcc4f397e100c684ede8e8ca6e226e1380aJoerg Sonnenberger    if (Dir.empty())
12938ab2bdcc4f397e100c684ede8e8ca6e226e1380aJoerg Sonnenberger      continue;
12948ab2bdcc4f397e100c684ede8e8ca6e226e1380aJoerg Sonnenberger    if (Dir[0] == '=')
12958ab2bdcc4f397e100c684ede8e8ca6e226e1380aJoerg Sonnenberger      Dir = SysRoot + Dir.substr(1);
12968ab2bdcc4f397e100c684ede8e8ca6e226e1380aJoerg Sonnenberger    llvm::sys::Path P(Dir);
129748ad6094679ca2bf4f3593068e02e7a208c1a73cChandler Carruth    P.appendComponent(Name);
129832bef4edba854303800b3b01cb49a282e5da4f69Michael J. Spencer    bool Exists;
129932bef4edba854303800b3b01cb49a282e5da4f69Michael J. Spencer    if (!llvm::sys::fs::exists(P.str(), Exists) && Exists)
130048ad6094679ca2bf4f3593068e02e7a208c1a73cChandler Carruth      return P.str();
130148ad6094679ca2bf4f3593068e02e7a208c1a73cChandler Carruth  }
130248ad6094679ca2bf4f3593068e02e7a208c1a73cChandler Carruth
13030edefebc10fbc627d55d53936fc66178d1c08da1Daniel Dunbar  const ToolChain::path_list &List = TC.getFilePaths();
1304a82318332c9e9b61d3d17371e675ca2859877ee5Daniel Dunbar  for (ToolChain::path_list::const_iterator
13050edefebc10fbc627d55d53936fc66178d1c08da1Daniel Dunbar         it = List.begin(), ie = List.end(); it != ie; ++it) {
13068ab2bdcc4f397e100c684ede8e8ca6e226e1380aJoerg Sonnenberger    std::string Dir(*it);
13078ab2bdcc4f397e100c684ede8e8ca6e226e1380aJoerg Sonnenberger    if (Dir.empty())
13088ab2bdcc4f397e100c684ede8e8ca6e226e1380aJoerg Sonnenberger      continue;
13098ab2bdcc4f397e100c684ede8e8ca6e226e1380aJoerg Sonnenberger    if (Dir[0] == '=')
13108ab2bdcc4f397e100c684ede8e8ca6e226e1380aJoerg Sonnenberger      Dir = SysRoot + Dir.substr(1);
13118ab2bdcc4f397e100c684ede8e8ca6e226e1380aJoerg Sonnenberger    llvm::sys::Path P(Dir);
13120edefebc10fbc627d55d53936fc66178d1c08da1Daniel Dunbar    P.appendComponent(Name);
131332bef4edba854303800b3b01cb49a282e5da4f69Michael J. Spencer    bool Exists;
131432bef4edba854303800b3b01cb49a282e5da4f69Michael J. Spencer    if (!llvm::sys::fs::exists(P.str(), Exists) && Exists)
13155ed34f4c58b6ad4e21038d713c1fae31a6146ff5Daniel Dunbar      return P.str();
13160edefebc10fbc627d55d53936fc66178d1c08da1Daniel Dunbar  }
13170edefebc10fbc627d55d53936fc66178d1c08da1Daniel Dunbar
13185ed34f4c58b6ad4e21038d713c1fae31a6146ff5Daniel Dunbar  return Name;
1319cb881672c2c46142ec1bdfa401c9818ae805db0fDaniel Dunbar}
1320cb881672c2c46142ec1bdfa401c9818ae805db0fDaniel Dunbar
13215ed34f4c58b6ad4e21038d713c1fae31a6146ff5Daniel Dunbarstd::string Driver::GetProgramPath(const char *Name, const ToolChain &TC,
13225ed34f4c58b6ad4e21038d713c1fae31a6146ff5Daniel Dunbar                                   bool WantFile) const {
132348ad6094679ca2bf4f3593068e02e7a208c1a73cChandler Carruth  // Respect a limited subset of the '-Bprefix' functionality in GCC by
132448ad6094679ca2bf4f3593068e02e7a208c1a73cChandler Carruth  // attempting to use this prefix when lokup up program paths.
132509982cec0029bc495591067fa89967b6b4d1fa19Benjamin Kramer  for (Driver::prefix_list::const_iterator it = PrefixDirs.begin(),
132609982cec0029bc495591067fa89967b6b4d1fa19Benjamin Kramer       ie = PrefixDirs.end(); it != ie; ++it) {
132709982cec0029bc495591067fa89967b6b4d1fa19Benjamin Kramer    llvm::sys::Path P(*it);
132848ad6094679ca2bf4f3593068e02e7a208c1a73cChandler Carruth    P.appendComponent(Name);
132932bef4edba854303800b3b01cb49a282e5da4f69Michael J. Spencer    bool Exists;
133032bef4edba854303800b3b01cb49a282e5da4f69Michael J. Spencer    if (WantFile ? !llvm::sys::fs::exists(P.str(), Exists) && Exists
133132bef4edba854303800b3b01cb49a282e5da4f69Michael J. Spencer                 : P.canExecute())
133248ad6094679ca2bf4f3593068e02e7a208c1a73cChandler Carruth      return P.str();
133348ad6094679ca2bf4f3593068e02e7a208c1a73cChandler Carruth  }
133448ad6094679ca2bf4f3593068e02e7a208c1a73cChandler Carruth
13350edefebc10fbc627d55d53936fc66178d1c08da1Daniel Dunbar  const ToolChain::path_list &List = TC.getProgramPaths();
1336a82318332c9e9b61d3d17371e675ca2859877ee5Daniel Dunbar  for (ToolChain::path_list::const_iterator
13370edefebc10fbc627d55d53936fc66178d1c08da1Daniel Dunbar         it = List.begin(), ie = List.end(); it != ie; ++it) {
13380edefebc10fbc627d55d53936fc66178d1c08da1Daniel Dunbar    llvm::sys::Path P(*it);
13390edefebc10fbc627d55d53936fc66178d1c08da1Daniel Dunbar    P.appendComponent(Name);
134032bef4edba854303800b3b01cb49a282e5da4f69Michael J. Spencer    bool Exists;
134132bef4edba854303800b3b01cb49a282e5da4f69Michael J. Spencer    if (WantFile ? !llvm::sys::fs::exists(P.str(), Exists) && Exists
134232bef4edba854303800b3b01cb49a282e5da4f69Michael J. Spencer                 : P.canExecute())
13435ed34f4c58b6ad4e21038d713c1fae31a6146ff5Daniel Dunbar      return P.str();
13440edefebc10fbc627d55d53936fc66178d1c08da1Daniel Dunbar  }
13450edefebc10fbc627d55d53936fc66178d1c08da1Daniel Dunbar
1346c50b00dbd843cd929b5f220d4a8699852249f64cDaniel Dunbar  // If all else failed, search the path.
1347c50b00dbd843cd929b5f220d4a8699852249f64cDaniel Dunbar  llvm::sys::Path P(llvm::sys::Program::FindProgramByName(Name));
1348632f50edc08c76ebc643a0d4871bae33a55d7b4eDaniel Dunbar  if (!P.empty())
13495ed34f4c58b6ad4e21038d713c1fae31a6146ff5Daniel Dunbar    return P.str();
1350632f50edc08c76ebc643a0d4871bae33a55d7b4eDaniel Dunbar
13515ed34f4c58b6ad4e21038d713c1fae31a6146ff5Daniel Dunbar  return Name;
1352cb881672c2c46142ec1bdfa401c9818ae805db0fDaniel Dunbar}
1353cb881672c2c46142ec1bdfa401c9818ae805db0fDaniel Dunbar
1354214399ebd73545dde02b4a45872e7ca9e1d9e742Daniel Dunbarstd::string Driver::GetTemporaryPath(const char *Suffix) const {
1355a82318332c9e9b61d3d17371e675ca2859877ee5Daniel Dunbar  // FIXME: This is lame; sys::Path should provide this function (in particular,
1356a82318332c9e9b61d3d17371e675ca2859877ee5Daniel Dunbar  // it should know how to find the temporary files dir).
1357214399ebd73545dde02b4a45872e7ca9e1d9e742Daniel Dunbar  std::string Error;
1358b03417fdc42ae19d2deb2ee1e5d2c3e9896a2a04Daniel Dunbar  const char *TmpDir = ::getenv("TMPDIR");
1359b03417fdc42ae19d2deb2ee1e5d2c3e9896a2a04Daniel Dunbar  if (!TmpDir)
1360b03417fdc42ae19d2deb2ee1e5d2c3e9896a2a04Daniel Dunbar    TmpDir = ::getenv("TEMP");
1361b03417fdc42ae19d2deb2ee1e5d2c3e9896a2a04Daniel Dunbar  if (!TmpDir)
13623ca7ee9a40532167f67bde17fff5e678f183f3f2Daniel Dunbar    TmpDir = ::getenv("TMP");
13633ca7ee9a40532167f67bde17fff5e678f183f3f2Daniel Dunbar  if (!TmpDir)
1364b03417fdc42ae19d2deb2ee1e5d2c3e9896a2a04Daniel Dunbar    TmpDir = "/tmp";
1365b03417fdc42ae19d2deb2ee1e5d2c3e9896a2a04Daniel Dunbar  llvm::sys::Path P(TmpDir);
1366f60c63af0ed33ab890600ee6146e7685901f46dfDaniel Dunbar  P.appendComponent("cc");
1367214399ebd73545dde02b4a45872e7ca9e1d9e742Daniel Dunbar  if (P.makeUnique(false, &Error)) {
1368214399ebd73545dde02b4a45872e7ca9e1d9e742Daniel Dunbar    Diag(clang::diag::err_drv_unable_to_make_temp) << Error;
1369214399ebd73545dde02b4a45872e7ca9e1d9e742Daniel Dunbar    return "";
1370214399ebd73545dde02b4a45872e7ca9e1d9e742Daniel Dunbar  }
1371214399ebd73545dde02b4a45872e7ca9e1d9e742Daniel Dunbar
1372a82318332c9e9b61d3d17371e675ca2859877ee5Daniel Dunbar  // FIXME: Grumble, makeUnique sometimes leaves the file around!?  PR3837.
137384603bc4ed98caca9b82c1a68e63939927d8cd6dDaniel Dunbar  P.eraseFromDisk(false, 0);
137484603bc4ed98caca9b82c1a68e63939927d8cd6dDaniel Dunbar
1375214399ebd73545dde02b4a45872e7ca9e1d9e742Daniel Dunbar  P.appendSuffix(Suffix);
1376d57a7ef9252964bc6c8471451d7bd395b0520cb8Chris Lattner  return P.str();
1377214399ebd73545dde02b4a45872e7ca9e1d9e742Daniel Dunbar}
1378214399ebd73545dde02b4a45872e7ca9e1d9e742Daniel Dunbar
1379cb8ab23f7c800b041aeb6fc38c341d1aa0da86bfDaniel Dunbarconst HostInfo *Driver::GetHostInfo(const char *TripleStr) const {
13808f25c79e59d88df41c5a3cabba1c58035d384a6eDaniel Dunbar  llvm::PrettyStackTraceString CrashInfo("Constructing host");
1381476fc6715c4119a8e39ec70fbf9df1c57580ead8Anton Korobeynikov  llvm::Triple Triple(llvm::Triple::normalize(TripleStr).c_str());
1382dd98e2cad165ca73c769e4f105a4e47c2216387aDaniel Dunbar
13833a47c4e0a3e8d13ee4fb06cc3a98f9cfa9982400Chris Lattner  // TCE is an osless target
13843a47c4e0a3e8d13ee4fb06cc3a98f9cfa9982400Chris Lattner  if (Triple.getArchName() == "tce")
1385f78925f633e949f06521d9ffd937019e59f35efcDaniel Dunbar    return createTCEHostInfo(*this, Triple);
13863a47c4e0a3e8d13ee4fb06cc3a98f9cfa9982400Chris Lattner
1387cb8ab23f7c800b041aeb6fc38c341d1aa0da86bfDaniel Dunbar  switch (Triple.getOS()) {
1388e7925a075f110ab21afeae084670a155dea568e3Edward O'Callaghan  case llvm::Triple::AuroraUX:
1389e7925a075f110ab21afeae084670a155dea568e3Edward O'Callaghan    return createAuroraUXHostInfo(*this, Triple);
1390cb8ab23f7c800b041aeb6fc38c341d1aa0da86bfDaniel Dunbar  case llvm::Triple::Darwin:
1391cb8ab23f7c800b041aeb6fc38c341d1aa0da86bfDaniel Dunbar    return createDarwinHostInfo(*this, Triple);
1392cb8ab23f7c800b041aeb6fc38c341d1aa0da86bfDaniel Dunbar  case llvm::Triple::DragonFly:
1393cb8ab23f7c800b041aeb6fc38c341d1aa0da86bfDaniel Dunbar    return createDragonFlyHostInfo(*this, Triple);
1394f7b8eec37c8c8012fa525c71fb29a58c9f29beefDaniel Dunbar  case llvm::Triple::OpenBSD:
1395f7b8eec37c8c8012fa525c71fb29a58c9f29beefDaniel Dunbar    return createOpenBSDHostInfo(*this, Triple);
13968e50a96b387dca7525caa8a6add31420dd82a2cdBenjamin Kramer  case llvm::Triple::NetBSD:
13978e50a96b387dca7525caa8a6add31420dd82a2cdBenjamin Kramer    return createNetBSDHostInfo(*this, Triple);
1398cb8ab23f7c800b041aeb6fc38c341d1aa0da86bfDaniel Dunbar  case llvm::Triple::FreeBSD:
1399cb8ab23f7c800b041aeb6fc38c341d1aa0da86bfDaniel Dunbar    return createFreeBSDHostInfo(*this, Triple);
140038e317d6dce161b249508686cc67eb7176958762Chris Lattner  case llvm::Triple::Minix:
140138e317d6dce161b249508686cc67eb7176958762Chris Lattner    return createMinixHostInfo(*this, Triple);
14026b3454a219cee5ef36c4668961f93a5c32deab61Eli Friedman  case llvm::Triple::Linux:
14036b3454a219cee5ef36c4668961f93a5c32deab61Eli Friedman    return createLinuxHostInfo(*this, Triple);
1404ff58e3610f4e12094def69eb2d6dcb4330378d8fMichael J. Spencer  case llvm::Triple::Win32:
1405ff58e3610f4e12094def69eb2d6dcb4330378d8fMichael J. Spencer    return createWindowsHostInfo(*this, Triple);
1406ff58e3610f4e12094def69eb2d6dcb4330378d8fMichael J. Spencer  case llvm::Triple::MinGW32:
1407ff58e3610f4e12094def69eb2d6dcb4330378d8fMichael J. Spencer    return createMinGWHostInfo(*this, Triple);
1408cb8ab23f7c800b041aeb6fc38c341d1aa0da86bfDaniel Dunbar  default:
1409cb8ab23f7c800b041aeb6fc38c341d1aa0da86bfDaniel Dunbar    return createUnknownHostInfo(*this, Triple);
1410cb8ab23f7c800b041aeb6fc38c341d1aa0da86bfDaniel Dunbar  }
1411dd98e2cad165ca73c769e4f105a4e47c2216387aDaniel Dunbar}
1412af80e1ffafeb77929cc0b9ba8940a7f1c0b80d51Daniel Dunbar
1413af80e1ffafeb77929cc0b9ba8940a7f1c0b80d51Daniel Dunbarbool Driver::ShouldUseClangCompiler(const Compilation &C, const JobAction &JA,
1414a6046bec7fc835186dde134fb81aa1b7d45cd9f0Daniel Dunbar                                    const llvm::Triple &Triple) const {
1415a82318332c9e9b61d3d17371e675ca2859877ee5Daniel Dunbar  // Check if user requested no clang, or clang doesn't understand this type (we
1416a82318332c9e9b61d3d17371e675ca2859877ee5Daniel Dunbar  // only handle single inputs for now).
14175915fbf310e171c4cd3c2af05e9de360c0fa988aDaniel Dunbar  if (!CCCUseClang || JA.size() != 1 ||
1418af80e1ffafeb77929cc0b9ba8940a7f1c0b80d51Daniel Dunbar      !types::isAcceptedByClang((*JA.begin())->getType()))
1419af80e1ffafeb77929cc0b9ba8940a7f1c0b80d51Daniel Dunbar    return false;
1420af80e1ffafeb77929cc0b9ba8940a7f1c0b80d51Daniel Dunbar
14210f99d2e57d8e3cf2508e7f9f868d41eccdc229c9Daniel Dunbar  // Otherwise make sure this is an action clang understands.
1422af80e1ffafeb77929cc0b9ba8940a7f1c0b80d51Daniel Dunbar  if (isa<PreprocessJobAction>(JA)) {
14236256d3654533547a7996170647c21a859cb441e1Daniel Dunbar    if (!CCCUseClangCPP) {
14246256d3654533547a7996170647c21a859cb441e1Daniel Dunbar      Diag(clang::diag::warn_drv_not_using_clang_cpp);
1425af80e1ffafeb77929cc0b9ba8940a7f1c0b80d51Daniel Dunbar      return false;
14266256d3654533547a7996170647c21a859cb441e1Daniel Dunbar    }
1427af80e1ffafeb77929cc0b9ba8940a7f1c0b80d51Daniel Dunbar  } else if (!isa<PrecompileJobAction>(JA) && !isa<CompileJobAction>(JA))
1428af80e1ffafeb77929cc0b9ba8940a7f1c0b80d51Daniel Dunbar    return false;
1429af80e1ffafeb77929cc0b9ba8940a7f1c0b80d51Daniel Dunbar
14300f99d2e57d8e3cf2508e7f9f868d41eccdc229c9Daniel Dunbar  // Use clang for C++?
14316256d3654533547a7996170647c21a859cb441e1Daniel Dunbar  if (!CCCUseClangCXX && types::isCXX((*JA.begin())->getType())) {
14326256d3654533547a7996170647c21a859cb441e1Daniel Dunbar    Diag(clang::diag::warn_drv_not_using_clang_cxx);
1433af80e1ffafeb77929cc0b9ba8940a7f1c0b80d51Daniel Dunbar    return false;
14346256d3654533547a7996170647c21a859cb441e1Daniel Dunbar  }
1435af80e1ffafeb77929cc0b9ba8940a7f1c0b80d51Daniel Dunbar
143664952508c2b0c8bffb45c8b410f0af3d2457f59bDaniel Dunbar  // Always use clang for precompiling, AST generation, and rewriting,
143764952508c2b0c8bffb45c8b410f0af3d2457f59bDaniel Dunbar  // regardless of archs.
14386c6424bc0d3b5f080a97b5f6ef4a8d70c38e38f5Daniel Dunbar  if (isa<PrecompileJobAction>(JA) ||
14396c6424bc0d3b5f080a97b5f6ef4a8d70c38e38f5Daniel Dunbar      types::isOnlyAcceptedByClang(JA.getType()))
1440fec26bd1f4681db8c253fb86529e52bcad28a3ffDaniel Dunbar    return true;
1441fec26bd1f4681db8c253fb86529e52bcad28a3ffDaniel Dunbar
1442a82318332c9e9b61d3d17371e675ca2859877ee5Daniel Dunbar  // Finally, don't use clang if this isn't one of the user specified archs to
1443a82318332c9e9b61d3d17371e675ca2859877ee5Daniel Dunbar  // build.
1444a6046bec7fc835186dde134fb81aa1b7d45cd9f0Daniel Dunbar  if (!CCCClangArchs.empty() && !CCCClangArchs.count(Triple.getArch())) {
1445a6046bec7fc835186dde134fb81aa1b7d45cd9f0Daniel Dunbar    Diag(clang::diag::warn_drv_not_using_clang_arch) << Triple.getArchName();
1446af80e1ffafeb77929cc0b9ba8940a7f1c0b80d51Daniel Dunbar    return false;
14476256d3654533547a7996170647c21a859cb441e1Daniel Dunbar  }
1448af80e1ffafeb77929cc0b9ba8940a7f1c0b80d51Daniel Dunbar
1449af80e1ffafeb77929cc0b9ba8940a7f1c0b80d51Daniel Dunbar  return true;
1450af80e1ffafeb77929cc0b9ba8940a7f1c0b80d51Daniel Dunbar}
1451d73fe9b70c5f6738d004744562287a62831f39bfDaniel Dunbar
1452a82318332c9e9b61d3d17371e675ca2859877ee5Daniel Dunbar/// GetReleaseVersion - Parse (([0-9]+)(.([0-9]+)(.([0-9]+)?))?)? and return the
1453a82318332c9e9b61d3d17371e675ca2859877ee5Daniel Dunbar/// grouped values as integers. Numbers which are not provided are set to 0.
1454d73fe9b70c5f6738d004744562287a62831f39bfDaniel Dunbar///
1455a82318332c9e9b61d3d17371e675ca2859877ee5Daniel Dunbar/// \return True if the entire string was parsed (9.2), or all groups were
1456a82318332c9e9b61d3d17371e675ca2859877ee5Daniel Dunbar/// parsed (10.3.5extrastuff).
1457a82318332c9e9b61d3d17371e675ca2859877ee5Daniel Dunbarbool Driver::GetReleaseVersion(const char *Str, unsigned &Major,
1458d73fe9b70c5f6738d004744562287a62831f39bfDaniel Dunbar                               unsigned &Minor, unsigned &Micro,
1459d73fe9b70c5f6738d004744562287a62831f39bfDaniel Dunbar                               bool &HadExtra) {
1460d73fe9b70c5f6738d004744562287a62831f39bfDaniel Dunbar  HadExtra = false;
1461d73fe9b70c5f6738d004744562287a62831f39bfDaniel Dunbar
1462d73fe9b70c5f6738d004744562287a62831f39bfDaniel Dunbar  Major = Minor = Micro = 0;
1463a82318332c9e9b61d3d17371e675ca2859877ee5Daniel Dunbar  if (*Str == '\0')
1464d73fe9b70c5f6738d004744562287a62831f39bfDaniel Dunbar    return true;
1465d73fe9b70c5f6738d004744562287a62831f39bfDaniel Dunbar
1466d73fe9b70c5f6738d004744562287a62831f39bfDaniel Dunbar  char *End;
1467d73fe9b70c5f6738d004744562287a62831f39bfDaniel Dunbar  Major = (unsigned) strtol(Str, &End, 10);
1468d73fe9b70c5f6738d004744562287a62831f39bfDaniel Dunbar  if (*Str != '\0' && *End == '\0')
1469d73fe9b70c5f6738d004744562287a62831f39bfDaniel Dunbar    return true;
1470d73fe9b70c5f6738d004744562287a62831f39bfDaniel Dunbar  if (*End != '.')
1471d73fe9b70c5f6738d004744562287a62831f39bfDaniel Dunbar    return false;
1472a82318332c9e9b61d3d17371e675ca2859877ee5Daniel Dunbar
1473d73fe9b70c5f6738d004744562287a62831f39bfDaniel Dunbar  Str = End+1;
1474d73fe9b70c5f6738d004744562287a62831f39bfDaniel Dunbar  Minor = (unsigned) strtol(Str, &End, 10);
1475d73fe9b70c5f6738d004744562287a62831f39bfDaniel Dunbar  if (*Str != '\0' && *End == '\0')
1476d73fe9b70c5f6738d004744562287a62831f39bfDaniel Dunbar    return true;
1477d73fe9b70c5f6738d004744562287a62831f39bfDaniel Dunbar  if (*End != '.')
1478d73fe9b70c5f6738d004744562287a62831f39bfDaniel Dunbar    return false;
1479d73fe9b70c5f6738d004744562287a62831f39bfDaniel Dunbar
1480d73fe9b70c5f6738d004744562287a62831f39bfDaniel Dunbar  Str = End+1;
1481d73fe9b70c5f6738d004744562287a62831f39bfDaniel Dunbar  Micro = (unsigned) strtol(Str, &End, 10);
1482d73fe9b70c5f6738d004744562287a62831f39bfDaniel Dunbar  if (*Str != '\0' && *End == '\0')
1483d73fe9b70c5f6738d004744562287a62831f39bfDaniel Dunbar    return true;
1484d73fe9b70c5f6738d004744562287a62831f39bfDaniel Dunbar  if (Str == End)
1485d73fe9b70c5f6738d004744562287a62831f39bfDaniel Dunbar    return false;
1486d73fe9b70c5f6738d004744562287a62831f39bfDaniel Dunbar  HadExtra = true;
1487d73fe9b70c5f6738d004744562287a62831f39bfDaniel Dunbar  return true;
1488d73fe9b70c5f6738d004744562287a62831f39bfDaniel Dunbar}
1489