Driver.cpp revision 279c1dbebf37cd128f3c73c70741a6b8c35ad025
15821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)//===--- Driver.cpp - Clang GCC Compatible Driver -----------------------*-===//
25821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)//
35821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)//                     The LLVM Compiler Infrastructure
45821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)//
5116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch// This file is distributed under the University of Illinois Open Source
65821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// License. See LICENSE.TXT for details.
75821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)//
85821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)//===----------------------------------------------------------------------===//
95821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
10ca12bfac764ba476d6cd062bf1dde12cc64c3f40Ben Murdoch#include "clang/Driver/Driver.h"
115e3f23d412006dc4db4e659864679f29341e113fTorne (Richard Coles)
125e3f23d412006dc4db4e659864679f29341e113fTorne (Richard Coles)#include "clang/Driver/Action.h"
13116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch#include "clang/Driver/Arg.h"
14116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch#include "clang/Driver/ArgList.h"
1529b820f8d84e3bc97d62552e54923c42407f2f29Ben Murdoch#include "clang/Driver/Compilation.h"
165821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "clang/Driver/DriverDiagnostic.h"
175821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "clang/Driver/HostInfo.h"
185821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "clang/Driver/Job.h"
190f1bc08d4cfcc34181b0b5cbf065c40f687bf740Torne (Richard Coles)#include "clang/Driver/OptTable.h"
205821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "clang/Driver/Option.h"
215821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "clang/Driver/Options.h"
225821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "clang/Driver/Tool.h"
235821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "clang/Driver/ToolChain.h"
2429b820f8d84e3bc97d62552e54923c42407f2f29Ben Murdoch#include "clang/Driver/Types.h"
2529b820f8d84e3bc97d62552e54923c42407f2f29Ben Murdoch
2629b820f8d84e3bc97d62552e54923c42407f2f29Ben Murdoch#include "clang/Basic/Version.h"
2729b820f8d84e3bc97d62552e54923c42407f2f29Ben Murdoch
2829b820f8d84e3bc97d62552e54923c42407f2f29Ben Murdoch#include "llvm/ADT/StringSet.h"
2929b820f8d84e3bc97d62552e54923c42407f2f29Ben Murdoch#include "llvm/ADT/OwningPtr.h"
3029b820f8d84e3bc97d62552e54923c42407f2f29Ben Murdoch#include "llvm/Support/PrettyStackTrace.h"
3129b820f8d84e3bc97d62552e54923c42407f2f29Ben Murdoch#include "llvm/Support/raw_ostream.h"
3229b820f8d84e3bc97d62552e54923c42407f2f29Ben Murdoch#include "llvm/System/Path.h"
33116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch#include "llvm/System/Program.h"
345821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
355821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "InputInfo.h"
365821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
375821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include <map>
385821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
395d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)using namespace clang::driver;
405d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)using namespace clang;
415d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)
425d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)// Used to set values for "production" clang, for releases.
435d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)// #define USE_PRODUCTION_CLANG
445d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)
455d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)Driver::Driver(llvm::StringRef _Name, llvm::StringRef _Dir,
465d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)               llvm::StringRef _DefaultHostTriple,
475d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)               llvm::StringRef _DefaultImageName,
485d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)               bool IsProduction, bool CXXIsProduction,
495d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)               Diagnostic &_Diags)
505821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  : Opts(createDriverOptTable()), Diags(_Diags),
515821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    Name(_Name), Dir(_Dir), DefaultHostTriple(_DefaultHostTriple),
525821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    DefaultImageName(_DefaultImageName),
535821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    DriverTitle("clang \"gcc-compatible\" driver"),
545821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    Host(0),
555821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    CCCGenericGCCName("gcc"), CCPrintOptionsFilename(0), CCCIsCXX(false),
565821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    CCCEcho(false), CCCPrintBindings(false), CCPrintOptions(false),
575821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    CheckInputsExist(true), CCCUseClang(true), CCCUseClangCXX(true),
585821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    CCCUseClangCPP(true), CCCUsePCH(true), SuppressMissingInputWarning(false) {
595821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  if (IsProduction) {
605821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    // In a "production" build, only use clang on architectures we expect to
615821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    // work, and don't use clang C++.
625821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    //
635821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    // During development its more convenient to always have the driver use
645821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    // clang, but we don't want users to be confused when things don't work, or
655821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    // to file bugs for things we don't support.
665821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    CCCClangArchs.insert(llvm::Triple::x86);
675821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    CCCClangArchs.insert(llvm::Triple::x86_64);
685821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    CCCClangArchs.insert(llvm::Triple::arm);
695821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
705821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    if (!CXXIsProduction)
71f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)      CCCUseClangCXX = false;
725821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  }
735821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
745821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // Compute the path to the resource directory.
755821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  llvm::sys::Path P(Dir);
765821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  P.eraseComponent(); // Remove /bin from foo/bin
775821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  P.appendComponent("lib");
785821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  P.appendComponent("clang");
795821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  P.appendComponent(CLANG_VERSION_STRING);
805821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  ResourceDir = P.str();
815821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
825821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
835821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)Driver::~Driver() {
845821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  delete Opts;
855821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  delete Host;
865821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
875821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
885821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)InputArgList *Driver::ParseArgStrings(const char **ArgBegin,
89f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)                                      const char **ArgEnd) {
90e5d81f57cb97b3b6b7fccc9c5610d21eb81db09dBen Murdoch  llvm::PrettyStackTraceString CrashInfo("Command line argument parsing");
915821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  unsigned MissingArgIndex, MissingArgCount;
925821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  InputArgList *Args = getOpts().ParseArgs(ArgBegin, ArgEnd,
935821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                                           MissingArgIndex, MissingArgCount);
94e5d81f57cb97b3b6b7fccc9c5610d21eb81db09dBen Murdoch
955821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // Check for missing argument error.
965821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  if (MissingArgCount)
975821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    Diag(clang::diag::err_drv_missing_argument)
98cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)      << Args->getArgString(MissingArgIndex) << MissingArgCount;
99cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)
100cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)  // Check for unsupported options.
101cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)  for (ArgList::const_iterator it = Args->begin(), ie = Args->end();
102cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)       it != ie; ++it) {
103cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)    Arg *A = *it;
104f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)    if (A->getOption().isUnsupported()) {
105cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)      Diag(clang::diag::err_drv_unsupported_opt) << A->getAsString(*Args);
106cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)      continue;
107cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)    }
108cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)  }
1095821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
1105821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  return Args;
1115821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
1125821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
1135821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)DerivedArgList *Driver::TranslateInputArgs(const InputArgList &Args) const {
1145821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  DerivedArgList *DAL = new DerivedArgList(Args);
1155821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
1165821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  for (ArgList::const_iterator it = Args.begin(),
1175821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)         ie = Args.end(); it != ie; ++it)
1185821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    DAL->append(*it);
1195821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
1205821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  return DAL;
1215821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
1225821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
1235821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)Compilation *Driver::BuildCompilation(int argc, const char **argv) {
1245821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  llvm::PrettyStackTraceString CrashInfo("Compilation construction");
1255821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
1265821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // FIXME: Handle environment options which effect driver behavior, somewhere
1270f1bc08d4cfcc34181b0b5cbf065c40f687bf740Torne (Richard Coles)  // (client?). GCC_EXEC_PREFIX, COMPILER_PATH, LIBRARY_PATH, LPATH,
1280f1bc08d4cfcc34181b0b5cbf065c40f687bf740Torne (Richard Coles)  // CC_PRINT_OPTIONS.
1290f1bc08d4cfcc34181b0b5cbf065c40f687bf740Torne (Richard Coles)
1305821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // FIXME: What are we going to do with -V and -b?
1315821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
1325821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // FIXME: This stuff needs to go into the Compilation, not the driver.
1335821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  bool CCCPrintOptions = false, CCCPrintActions = false;
1345821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
1350f1bc08d4cfcc34181b0b5cbf065c40f687bf740Torne (Richard Coles)  const char **Start = argv + 1, **End = argv + argc;
136e5d81f57cb97b3b6b7fccc9c5610d21eb81db09dBen Murdoch  const char *HostTriple = DefaultHostTriple.c_str();
137e5d81f57cb97b3b6b7fccc9c5610d21eb81db09dBen Murdoch
138e5d81f57cb97b3b6b7fccc9c5610d21eb81db09dBen Murdoch  InputArgList *Args = ParseArgStrings(Start, End);
1395821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
1405821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // -no-canonical-prefixes is used very early in main.
1415821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  Args->ClaimAllArgs(options::OPT_no_canonical_prefixes);
1425821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
1435821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // Extract -ccc args.
1445821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  //
145f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)  // FIXME: We need to figure out where this behavior should live. Most of it
146f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)  // should be outside in the client; the parts that aren't should have proper
147868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)  // options, either by introducing new ones or by overloading gcc ones like -V
148868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)  // or -b.
1495821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  CCCPrintOptions = Args->hasArg(options::OPT_ccc_print_options);
1505821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  CCCPrintActions = Args->hasArg(options::OPT_ccc_print_phases);
1515821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  CCCPrintBindings = Args->hasArg(options::OPT_ccc_print_bindings);
1525821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  CCCIsCXX = Args->hasArg(options::OPT_ccc_cxx) || CCCIsCXX;
1536e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles)  CCCEcho = Args->hasArg(options::OPT_ccc_echo);
1546e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles)  if (const Arg *A = Args->getLastArg(options::OPT_ccc_gcc_name))
1556e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles)    CCCGenericGCCName = A->getValue(*Args);
1565821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  CCCUseClangCXX = Args->hasFlag(options::OPT_ccc_clang_cxx,
15729b820f8d84e3bc97d62552e54923c42407f2f29Ben Murdoch                                 options::OPT_ccc_no_clang_cxx,
15829b820f8d84e3bc97d62552e54923c42407f2f29Ben Murdoch                                 CCCUseClangCXX);
15929b820f8d84e3bc97d62552e54923c42407f2f29Ben Murdoch  CCCUsePCH = Args->hasFlag(options::OPT_ccc_pch_is_pch,
16029b820f8d84e3bc97d62552e54923c42407f2f29Ben Murdoch                            options::OPT_ccc_pch_is_pth);
16129b820f8d84e3bc97d62552e54923c42407f2f29Ben Murdoch  CCCUseClang = !Args->hasArg(options::OPT_ccc_no_clang);
16229b820f8d84e3bc97d62552e54923c42407f2f29Ben Murdoch  CCCUseClangCPP = !Args->hasArg(options::OPT_ccc_no_clang_cpp);
16329b820f8d84e3bc97d62552e54923c42407f2f29Ben Murdoch  if (const Arg *A = Args->getLastArg(options::OPT_ccc_clang_archs)) {
16429b820f8d84e3bc97d62552e54923c42407f2f29Ben Murdoch    llvm::StringRef Cur = A->getValue(*Args);
16529b820f8d84e3bc97d62552e54923c42407f2f29Ben Murdoch
16629b820f8d84e3bc97d62552e54923c42407f2f29Ben Murdoch    CCCClangArchs.clear();
1675821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    while (!Cur.empty()) {
168effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch      std::pair<llvm::StringRef, llvm::StringRef> Split = Cur.split(',');
169e5d81f57cb97b3b6b7fccc9c5610d21eb81db09dBen Murdoch
1705821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      if (!Split.first.empty()) {
1715d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)        llvm::Triple::ArchType Arch =
1725821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)          llvm::Triple(Split.first, "", "").getArch();
1735821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
1745821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        if (Arch == llvm::Triple::UnknownArch)
1755821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)          Diag(clang::diag::err_drv_invalid_arch_name) << Split.first;
1765821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
1775821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        CCCClangArchs.insert(Arch);
1785d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)      }
179effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch
1805d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)      Cur = Split.second;
181effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch    }
182effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch  }
1835d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)  if (const Arg *A = Args->getLastArg(options::OPT_ccc_host_triple))
1845821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    HostTriple = A->getValue(*Args);
1855821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  if (const Arg *A = Args->getLastArg(options::OPT_ccc_install_dir))
1865821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    Dir = A->getValue(*Args);
1875821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  if (const Arg *A = Args->getLastArg(options::OPT_B))
1885821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    PrefixDir = A->getValue(*Args);
1895821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
1905821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  Host = GetHostInfo(HostTriple);
1915821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
1925821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // Perform the default argument translations.
1935821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  DerivedArgList *TranslatedArgs = TranslateInputArgs(*Args);
1945821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
1955821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // The compilation takes ownership of Args.
196e5d81f57cb97b3b6b7fccc9c5610d21eb81db09dBen Murdoch  Compilation *C = new Compilation(*this, *Host->CreateToolChain(*Args), Args,
1975821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                                   TranslatedArgs);
1985d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)
1995821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // FIXME: This behavior shouldn't be here.
2005821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  if (CCCPrintOptions) {
2015821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    PrintOptions(C->getArgs());
2025821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    return C;
2035821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  }
2045821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
2055821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  if (!HandleImmediateArgs(*C))
2065821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    return C;
2075821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
2085821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // Construct the list of abstract actions to perform for this compilation. We
2095821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // avoid passing a Compilation here simply to enforce the abstraction that
2105821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // pipelining is not host or toolchain dependent (other than the driver driver
2115821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // test).
212868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)  if (Host->useDriverDriver())
2135821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    BuildUniversalActions(C->getArgs(), C->getActions());
2145821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  else
2155821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    BuildActions(C->getArgs(), C->getActions());
2165821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
2175821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  if (CCCPrintActions) {
2185d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)    PrintActions(*C);
2195d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)    return C;
2205d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)  }
2215d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)
2225821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  BuildJobs(*C);
2235821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
2245821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  return C;
2255821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
2265821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
2275821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)int Driver::ExecuteCompilation(const Compilation &C) const {
2285821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // Just print if -### was present.
2295821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  if (C.getArgs().hasArg(options::OPT__HASH_HASH_HASH)) {
2305821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    C.PrintJob(llvm::errs(), C.getJobs(), "\n", true);
231effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch    return 0;
2325821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  }
2335821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
2345821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // If there were errors building the compilation, quit now.
235868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)  if (getDiags().getNumErrors())
2365821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    return 1;
2375821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
2385821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  const Command *FailingCommand = 0;
2395821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  int Res = C.ExecuteJob(C.getJobs(), FailingCommand);
2405821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
2415821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // Remove temp files.
2425821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  C.CleanupFileList(C.getTempFiles());
2435821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
2445821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // If the command succeeded, we are done.
2455821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  if (Res == 0)
246a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)    return Res;
247a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)
2485821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // Otherwise, remove result files as well.
249a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)  if (!C.getArgs().hasArg(options::OPT_save_temps))
2505821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    C.CleanupFileList(C.getResultFiles(), true);
2515821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
2525821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // Print extra information about abnormal failures, if possible.
2535821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  //
2545821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // This is ad-hoc, but we don't want to be excessively noisy. If the result
2555821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // status was 1, assume the command failed normally. In particular, if it was
2565821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // the compiler then assume it gave a reasonable error code. Failures in other
2575821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // tools are less common, and they generally have worse diagnostics, so always
2585821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // print the diagnostic there.
2595821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  const Tool &FailingTool = FailingCommand->getCreator();
2605821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
2615821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  if (!FailingCommand->getCreator().hasGoodDiagnostics() || Res != 1) {
2625821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    // FIXME: See FIXME above regarding result code interpretation.
2635821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    if (Res < 0)
2645821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      Diag(clang::diag::err_drv_command_signalled)
2655821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        << FailingTool.getShortName() << -Res;
2665821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    else
2675821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      Diag(clang::diag::err_drv_command_failed)
2685821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        << FailingTool.getShortName() << Res;
2695821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  }
2705821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
2715821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  return Res;
2725821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
2735821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
2745821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)void Driver::PrintOptions(const ArgList &Args) const {
2755821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  unsigned i = 0;
2765821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  for (ArgList::const_iterator it = Args.begin(), ie = Args.end();
2775821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)       it != ie; ++it, ++i) {
2785821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    Arg *A = *it;
2795821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    llvm::errs() << "Option " << i << " - "
2805821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                 << "Name: \"" << A->getOption().getName() << "\", "
2815d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)                 << "Values: {";
2825821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    for (unsigned j = 0; j < A->getNumValues(); ++j) {
2835821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      if (j)
2845821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        llvm::errs() << ", ";
2855821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      llvm::errs() << '"' << A->getValue(Args, j) << '"';
2865821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    }
2875821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    llvm::errs() << "}\n";
2885821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  }
2895821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
2905821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
2915821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)void Driver::PrintHelp(bool ShowHidden) const {
2925821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  getOpts().PrintHelp(llvm::outs(), Name.c_str(), DriverTitle.c_str(),
293868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)                      ShowHidden);
2945821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
2955821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
2965821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)void Driver::PrintVersion(const Compilation &C, llvm::raw_ostream &OS) const {
2975821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // FIXME: The following handlers should use a callback mechanism, we don't
2985821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // know what the client would like to do.
2995821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  OS << getClangFullVersion() << '\n';
3005821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  const ToolChain &TC = C.getDefaultToolChain();
3015821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  OS << "Target: " << TC.getTripleString() << '\n';
3025821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
3035821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // Print the threading model.
3045821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  //
3055821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // FIXME: Implement correctly.
3065821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  OS << "Thread model: " << "posix" << '\n';
3075821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
3085821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
3095821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)/// PrintDiagnosticCategories - Implement the --print-diagnostic-categories
3105821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)/// option.
311868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)static void PrintDiagnosticCategories(llvm::raw_ostream &OS) {
312868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)  for (unsigned i = 1; // Skip the empty category.
3135821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)       const char *CategoryName = Diagnostic::getCategoryNameFromID(i); ++i)
3145821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    OS << i << ',' << CategoryName << '\n';
3155821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
3165821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
3175821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)bool Driver::HandleImmediateArgs(const Compilation &C) {
3185821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // The order these options are handled in gcc is all over the place, but we
3195821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // don't expect inconsistencies w.r.t. that to matter in practice.
3205821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
3215821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  if (C.getArgs().hasArg(options::OPT_dumpversion)) {
322effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch    llvm::outs() << CLANG_VERSION_STRING "\n";
323effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch    return false;
324effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch  }
3255821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
3265821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  if (C.getArgs().hasArg(options::OPT__print_diagnostic_categories)) {
3275821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    PrintDiagnosticCategories(llvm::outs());
3285821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    return false;
3295821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  }
3305821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
3315821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  if (C.getArgs().hasArg(options::OPT__help) ||
3325821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      C.getArgs().hasArg(options::OPT__help_hidden)) {
3335821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    PrintHelp(C.getArgs().hasArg(options::OPT__help_hidden));
3345821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    return false;
3355821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  }
3365821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
3375821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  if (C.getArgs().hasArg(options::OPT__version)) {
3385821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    // Follow gcc behavior and use stdout for --version and stderr for -v.
3395821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    PrintVersion(C, llvm::outs());
3405821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    return false;
3415821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  }
3425821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
3435821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  if (C.getArgs().hasArg(options::OPT_v) ||
3445821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      C.getArgs().hasArg(options::OPT__HASH_HASH_HASH)) {
3455821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    PrintVersion(C, llvm::errs());
3465821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    SuppressMissingInputWarning = true;
3475821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  }
3485821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
3495821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  const ToolChain &TC = C.getDefaultToolChain();
3505821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  if (C.getArgs().hasArg(options::OPT_print_search_dirs)) {
3515821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    llvm::outs() << "programs: =";
3525821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    for (ToolChain::path_list::const_iterator it = TC.getProgramPaths().begin(),
3535821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)           ie = TC.getProgramPaths().end(); it != ie; ++it) {
3545821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      if (it != TC.getProgramPaths().begin())
3555821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        llvm::outs() << ':';
3565821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      llvm::outs() << *it;
3575821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    }
358a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)    llvm::outs() << "\n";
3590f1bc08d4cfcc34181b0b5cbf065c40f687bf740Torne (Richard Coles)    llvm::outs() << "libraries: =";
360a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)    for (ToolChain::path_list::const_iterator it = TC.getFilePaths().begin(),
3615821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)           ie = TC.getFilePaths().end(); it != ie; ++it) {
3625821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      if (it != TC.getFilePaths().begin())
3635821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        llvm::outs() << ':';
3645821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      llvm::outs() << *it;
36546d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles)    }
3665821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    llvm::outs() << "\n";
3675821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    return false;
3685821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  }
3695821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
3705821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // FIXME: The following handlers should use a callback mechanism, we don't
3715821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // know what the client would like to do.
3725821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  if (Arg *A = C.getArgs().getLastArg(options::OPT_print_file_name_EQ)) {
3735821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    llvm::outs() << GetFilePath(A->getValue(C.getArgs()), TC) << "\n";
3745821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    return false;
375cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)  }
3761e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles)
3771e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles)  if (Arg *A = C.getArgs().getLastArg(options::OPT_print_prog_name_EQ)) {
3781e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles)    llvm::outs() << GetProgramPath(A->getValue(C.getArgs()), TC) << "\n";
3795821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    return false;
3805821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  }
3815821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
3821e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles)  if (C.getArgs().hasArg(options::OPT_print_libgcc_file_name)) {
3831e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles)    llvm::outs() << GetFilePath("libgcc.a", TC) << "\n";
3845821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    return false;
3855821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  }
3865821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
3875821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  if (C.getArgs().hasArg(options::OPT_print_multi_lib)) {
3885821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    // FIXME: We need tool chain support for this.
389868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)    llvm::outs() << ".;\n";
3905821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
3915821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    switch (C.getDefaultToolChain().getTriple().getArch()) {
3925821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    default:
3935821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      break;
394f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)
3955821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    case llvm::Triple::x86_64:
3965821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      llvm::outs() << "x86_64;@m64" << "\n";
3975821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      break;
3985821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
3995821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    case llvm::Triple::ppc64:
4005821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      llvm::outs() << "ppc64;@m64" << "\n";
4015821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      break;
4025821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    }
4035821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    return false;
4045821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  }
4055821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
4065821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // FIXME: What is the difference between print-multi-directory and
4075821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // print-multi-os-directory?
4085821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  if (C.getArgs().hasArg(options::OPT_print_multi_directory) ||
4095821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      C.getArgs().hasArg(options::OPT_print_multi_os_directory)) {
4105821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    switch (C.getDefaultToolChain().getTriple().getArch()) {
4115821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    default:
4125821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    case llvm::Triple::x86:
4135821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    case llvm::Triple::ppc:
4145821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      llvm::outs() << "." << "\n";
4155821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      break;
4165821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
4175821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    case llvm::Triple::x86_64:
4185821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      llvm::outs() << "x86_64" << "\n";
4195821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      break;
4205821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
4215821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    case llvm::Triple::ppc64:
4225821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      llvm::outs() << "ppc64" << "\n";
423f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)      break;
4245821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    }
4255821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    return false;
4265821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  }
427f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)
4285821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  return true;
429f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)}
4305821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
4315821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)static unsigned PrintActions1(const Compilation &C, Action *A,
4325821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                              std::map<Action*, unsigned> &Ids) {
4335821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  if (Ids.count(A))
4345821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    return Ids[A];
4355821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
4365821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  std::string str;
4375821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  llvm::raw_string_ostream os(str);
4385821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
4395821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  os << Action::getClassName(A->getKind()) << ", ";
4405821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  if (InputAction *IA = dyn_cast<InputAction>(A)) {
441effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch    os << "\"" << IA->getInputArg().getValue(C.getArgs()) << "\"";
442f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)  } else if (BindArchAction *BIA = dyn_cast<BindArchAction>(A)) {
4435821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    os << '"' << (BIA->getArchName() ? BIA->getArchName() :
4445821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                  C.getDefaultToolChain().getArchName()) << '"'
445f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)       << ", {" << PrintActions1(C, *BIA->begin(), Ids) << "}";
4465821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  } else {
4475821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    os << "{";
4485821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    for (Action::iterator it = A->begin(), ie = A->end(); it != ie;) {
449f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)      os << PrintActions1(C, *it, Ids);
4505821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      ++it;
4515821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      if (it != ie)
4525821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        os << ", ";
4535821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    }
4545821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    os << "}";
4555821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  }
4565821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
4575821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  unsigned Id = Ids.size();
4585821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  Ids[A] = Id;
4595821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  llvm::errs() << Id << ": " << os.str() << ", "
4605821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)               << types::getTypeName(A->getType()) << "\n";
4615821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
4621e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles)  return Id;
4635821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
4645821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
4655821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)void Driver::PrintActions(const Compilation &C) const {
4665821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  std::map<Action*, unsigned> Ids;
4675821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  for (ActionList::const_iterator it = C.getActions().begin(),
468f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)         ie = C.getActions().end(); it != ie; ++it)
469f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)    PrintActions1(C, *it, Ids);
470f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)}
471f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)
4725821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)void Driver::BuildUniversalActions(const ArgList &Args,
4735821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                                   ActionList &Actions) const {
474e5d81f57cb97b3b6b7fccc9c5610d21eb81db09dBen Murdoch  llvm::PrettyStackTraceString CrashInfo("Building universal build actions");
4755d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)  // Collect the list of architectures. Duplicates are allowed, but should only
4765821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // be handled once (in the order seen).
477effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch  llvm::StringSet<> ArchNames;
4785821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  llvm::SmallVector<const char *, 4> Archs;
479e5d81f57cb97b3b6b7fccc9c5610d21eb81db09dBen Murdoch  for (ArgList::const_iterator it = Args.begin(), ie = Args.end();
480e5d81f57cb97b3b6b7fccc9c5610d21eb81db09dBen Murdoch       it != ie; ++it) {
4815821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    Arg *A = *it;
4825821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
4835821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    if (A->getOption().matches(options::OPT_arch)) {
4845821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      // Validate the option here; we don't save the type here because its
4855821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      // particular spelling may participate in other driver choices.
4865821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      llvm::Triple::ArchType Arch =
4875821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        llvm::Triple::getArchTypeForDarwinArchName(A->getValue(Args));
4885821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      if (Arch == llvm::Triple::UnknownArch) {
4895821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        Diag(clang::diag::err_drv_invalid_arch_name)
4905821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)          << A->getAsString(Args);
4915821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        continue;
4925821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      }
4935821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
4945821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      A->claim();
4955821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      if (ArchNames.insert(A->getValue(Args)))
4965821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        Archs.push_back(A->getValue(Args));
4975821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    }
4985821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  }
4995821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
5001e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles)  // When there is no explicit arch for this platform, make sure we still bind
5011e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles)  // the architecture (to the default) so that -Xarch_ is handled correctly.
5025821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  if (!Archs.size())
5035821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    Archs.push_back(0);
5045821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
5055821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // FIXME: We killed off some others but these aren't yet detected in a
5065821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // functional manner. If we added information to jobs about which "auxiliary"
5075821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // files they wrote then we could detect the conflict these cause downstream.
5085821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  if (Archs.size() > 1) {
509868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)    // No recovery needed, the point of this is just to prevent
5105821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    // overwriting the same files.
5115821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    if (const Arg *A = Args.getLastArg(options::OPT_save_temps))
5125821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      Diag(clang::diag::err_drv_invalid_opt_with_multiple_archs)
5135821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        << A->getAsString(Args);
5145821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  }
5155821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
5165821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  ActionList SingleActions;
5175821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  BuildActions(Args, SingleActions);
5185821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
5195821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // Add in arch bindings for every top level action, as well as lipo and
5205821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // dsymutil steps if needed.
5215821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  for (unsigned i = 0, e = SingleActions.size(); i != e; ++i) {
5225821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    Action *Act = SingleActions[i];
5235821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
5245821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    // Make sure we can lipo this kind of output. If not (and it is an actual
5255821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    // output) then we disallow, since we can't create an output file with the
5265821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    // right name without overwriting it. We could remove this oddity by just
527cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)    // changing the output names to include the arch, which would also fix
528cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)    // -save-temps. Compatibility wins for now.
529cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)
530cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)    if (Archs.size() > 1 && !types::canLipoType(Act->getType()))
5315821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      Diag(clang::diag::err_drv_invalid_output_with_multiple_archs)
5325821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        << types::getTypeName(Act->getType());
5335821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
5345821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    ActionList Inputs;
5355821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    for (unsigned i = 0, e = Archs.size(); i != e; ++i) {
5365821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      Inputs.push_back(new BindArchAction(Act, Archs[i]));
5375821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      if (i != 0)
5385821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        Inputs.back()->setOwnsInputs(false);
5395821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    }
5405821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
5415821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    // Lipo if necessary, we do it this way because we need to set the arch flag
5425821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    // so that -Xarch_ gets overwritten.
5435821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    if (Inputs.size() == 1 || Act->getType() == types::TY_Nothing)
5445821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      Actions.append(Inputs.begin(), Inputs.end());
545e5d81f57cb97b3b6b7fccc9c5610d21eb81db09dBen Murdoch    else
5465821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      Actions.push_back(new LipoJobAction(Inputs, Act->getType()));
5475821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
5485d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)    // Add a 'dsymutil' step if necessary.
5495d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)    if (Act->getType() == types::TY_Image) {
550f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)      Arg *A = Args.getLastArg(options::OPT_g_Group);
551116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch      if (A && !A->getOption().matches(options::OPT_g0) &&
552e5d81f57cb97b3b6b7fccc9c5610d21eb81db09dBen Murdoch          !A->getOption().matches(options::OPT_gstabs)) {
553e5d81f57cb97b3b6b7fccc9c5610d21eb81db09dBen Murdoch        ActionList Inputs;
554e5d81f57cb97b3b6b7fccc9c5610d21eb81db09dBen Murdoch        Inputs.push_back(Actions.back());
555e5d81f57cb97b3b6b7fccc9c5610d21eb81db09dBen Murdoch        Actions.pop_back();
556e5d81f57cb97b3b6b7fccc9c5610d21eb81db09dBen Murdoch
5575821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        Actions.push_back(new DsymutilJobAction(Inputs, types::TY_dSYM));
5585821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      }
5595821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    }
5605821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  }
561e5d81f57cb97b3b6b7fccc9c5610d21eb81db09dBen Murdoch}
562e5d81f57cb97b3b6b7fccc9c5610d21eb81db09dBen Murdoch
5635821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)void Driver::BuildActions(const ArgList &Args, ActionList &Actions) const {
564f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)  llvm::PrettyStackTraceString CrashInfo("Building compilation actions");
565e5d81f57cb97b3b6b7fccc9c5610d21eb81db09dBen Murdoch  // Start by constructing the list of inputs and their types.
566e5d81f57cb97b3b6b7fccc9c5610d21eb81db09dBen Murdoch
567116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch  // Track the current user specified (-x) input. We also explicitly track the
568e5d81f57cb97b3b6b7fccc9c5610d21eb81db09dBen Murdoch  // argument used to set the type; we only want to claim the type when we
569e5d81f57cb97b3b6b7fccc9c5610d21eb81db09dBen Murdoch  // actually use it, so we warn about unused -x arguments.
570e5d81f57cb97b3b6b7fccc9c5610d21eb81db09dBen Murdoch  types::ID InputType = types::TY_Nothing;
5715821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  Arg *InputTypeArg = 0;
5725821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
573f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)  llvm::SmallVector<std::pair<types::ID, const Arg*>, 16> Inputs;
5745821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  for (ArgList::const_iterator it = Args.begin(), ie = Args.end();
5755821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)       it != ie; ++it) {
5765821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    Arg *A = *it;
5775821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
578f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)    if (isa<InputOption>(A->getOption())) {
579f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)      const char *Value = A->getValue(Args);
580f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)      types::ID Ty = types::TY_INVALID;
581f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)
582f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)      // Infer the input type if necessary.
583f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)      if (InputType == types::TY_Nothing) {
584e5d81f57cb97b3b6b7fccc9c5610d21eb81db09dBen Murdoch        // If there was an explicit arg for this, claim it.
585e5d81f57cb97b3b6b7fccc9c5610d21eb81db09dBen Murdoch        if (InputTypeArg)
5865821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)          InputTypeArg->claim();
5875821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
5885821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        // stdin must be handled specially.
5895821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        if (memcmp(Value, "-", 2) == 0) {
5905821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)          // If running with -E, treat as a C input (this changes the builtin
5915821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)          // macros, for example). This may be overridden by -ObjC below.
5925821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)          //
5935821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)          // Otherwise emit an error but still use a valid type to avoid
5945821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)          // spurious errors (e.g., no inputs).
5955821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)          if (!Args.hasArgNoClaim(options::OPT_E))
5965821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)            Diag(clang::diag::err_drv_unknown_stdin_type);
5975821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)          Ty = types::TY_C;
5985821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        } else {
5995821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)          // Otherwise lookup by extension, and fallback to ObjectType if not
6005821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)          // found. We use a host hook here because Darwin at least has its own
6015821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)          // idea of what .s is.
6021320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci          if (const char *Ext = strrchr(Value, '.'))
6035821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)            Ty = Host->lookupTypeForExtension(Ext + 1);
604cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)
605cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)          if (Ty == types::TY_INVALID)
606cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)            Ty = types::TY_Object;
607cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)
608cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)          // If the driver is invoked as C++ compiler (like clang++ or c++) it
6095821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)          // should autodetect some input files as C++ for g++ compatibility.
6105821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)          if (CCCIsCXX) {
6115821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)            types::ID OldTy = Ty;
612e5d81f57cb97b3b6b7fccc9c5610d21eb81db09dBen Murdoch            Ty = types::lookupCXXTypeForCType(Ty);
613f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)
614f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)            if (Ty != OldTy)
615f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)              Diag(clang::diag::warn_drv_treating_input_as_cxx)
616116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch                << getTypeName(OldTy) << getTypeName(Ty);
617e5d81f57cb97b3b6b7fccc9c5610d21eb81db09dBen Murdoch          }
6185821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        }
6195821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
6205821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        // -ObjC and -ObjC++ override the default language, but only for "source
6215821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        // files". We just treat everything that isn't a linker input as a
6225821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        // source file.
6235821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        //
6241e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles)        // FIXME: Clean this up if we move the phase sequence into the type.
6255821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        if (Ty != types::TY_Object) {
6265821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)          if (Args.hasArg(options::OPT_ObjC))
6275821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)            Ty = types::TY_ObjC;
6285821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)          else if (Args.hasArg(options::OPT_ObjCXX))
6295821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)            Ty = types::TY_ObjCXX;
6305821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        }
6315821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      } else {
6325821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        assert(InputTypeArg && "InputType set w/o InputTypeArg");
6335821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        InputTypeArg->claim();
634868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)        Ty = InputType;
635868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)      }
6365821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
6375821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      // Check that the file exists, if enabled.
6385821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      if (CheckInputsExist && memcmp(Value, "-", 2) != 0 &&
639cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)          !llvm::sys::Path(Value).exists())
640cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)        Diag(clang::diag::err_drv_no_such_file) << A->getValue(Args);
641cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)      else
642cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)        Inputs.push_back(std::make_pair(Ty, A));
643cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)
644cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)    } else if (A->getOption().isLinkerInput()) {
645cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)      // Just treat as object type, we could make a special type for this if
646cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)      // necessary.
647f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)      Inputs.push_back(std::make_pair(types::TY_Object, A));
648f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)
6495821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    } else if (A->getOption().matches(options::OPT_x)) {
6505821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      InputTypeArg = A;
6515821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      InputType = types::lookupTypeForTypeSpecifier(A->getValue(Args));
6525821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
6535821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      // Follow gcc behavior and treat as linker input for invalid -x
6545821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      // options. Its not clear why we shouldn't just revert to unknown; but
6555821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      // this isn't very important, we might as well be bug comatible.
6565821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      if (!InputType) {
6575821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        Diag(clang::diag::err_drv_unknown_language) << A->getValue(Args);
6585821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        InputType = types::TY_Object;
6595821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      }
6605821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    }
6615821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  }
6625821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
6635821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  if (!SuppressMissingInputWarning && Inputs.empty()) {
664e5d81f57cb97b3b6b7fccc9c5610d21eb81db09dBen Murdoch    Diag(clang::diag::err_drv_no_input_files);
665e5d81f57cb97b3b6b7fccc9c5610d21eb81db09dBen Murdoch    return;
666e5d81f57cb97b3b6b7fccc9c5610d21eb81db09dBen Murdoch  }
6675821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
6685821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // Determine which compilation mode we are in. We look for options which
6695821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // affect the phase, starting with the earliest phases, and record which
6705821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // option we used to determine the final phase.
6715821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  Arg *FinalPhaseArg = 0;
6725821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  phases::ID FinalPhase;
6735821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
6745821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // -{E,M,MM} only run the preprocessor.
6755821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  if ((FinalPhaseArg = Args.getLastArg(options::OPT_E)) ||
6765821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      (FinalPhaseArg = Args.getLastArg(options::OPT_M)) ||
6775821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      (FinalPhaseArg = Args.getLastArg(options::OPT_MM))) {
6785821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    FinalPhase = phases::Preprocess;
6795821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
6805821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    // -{fsyntax-only,-analyze,emit-ast,S} only run up to the compiler.
6815821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  } else if ((FinalPhaseArg = Args.getLastArg(options::OPT_fsyntax_only)) ||
6825821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)             (FinalPhaseArg = Args.getLastArg(options::OPT_rewrite_objc)) ||
6835821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)             (FinalPhaseArg = Args.getLastArg(options::OPT__analyze,
6845821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                                              options::OPT__analyze_auto)) ||
6855821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)             (FinalPhaseArg = Args.getLastArg(options::OPT_emit_ast)) ||
6865821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)             (FinalPhaseArg = Args.getLastArg(options::OPT_S))) {
6875821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    FinalPhase = phases::Compile;
6885821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
6895821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    // -c only runs up to the assembler.
6905821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  } else if ((FinalPhaseArg = Args.getLastArg(options::OPT_c))) {
6915821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    FinalPhase = phases::Assemble;
6925821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
6935821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    // Otherwise do everything.
6945821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  } else
6955821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    FinalPhase = phases::Link;
6965821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
6975821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // Reject -Z* at the top level, these options should never have been exposed
6985821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // by gcc.
6995d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)  if (Arg *A = Args.getLastArg(options::OPT_Z_Joined))
7005d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)    Diag(clang::diag::err_drv_use_of_Z_option) << A->getAsString(Args);
701e5d81f57cb97b3b6b7fccc9c5610d21eb81db09dBen Murdoch
702e5d81f57cb97b3b6b7fccc9c5610d21eb81db09dBen Murdoch  // Construct the actions to perform.
703e5d81f57cb97b3b6b7fccc9c5610d21eb81db09dBen Murdoch  ActionList LinkerInputs;
704e5d81f57cb97b3b6b7fccc9c5610d21eb81db09dBen Murdoch  for (unsigned i = 0, e = Inputs.size(); i != e; ++i) {
705e5d81f57cb97b3b6b7fccc9c5610d21eb81db09dBen Murdoch    types::ID InputType = Inputs[i].first;
706f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)    const Arg *InputArg = Inputs[i].second;
707f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)
708f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)    unsigned NumSteps = types::getNumCompilationPhases(InputType);
709e5d81f57cb97b3b6b7fccc9c5610d21eb81db09dBen Murdoch    assert(NumSteps && "Invalid number of steps!");
710e5d81f57cb97b3b6b7fccc9c5610d21eb81db09dBen Murdoch
711e5d81f57cb97b3b6b7fccc9c5610d21eb81db09dBen Murdoch    // If the first step comes after the final phase we are doing as part of
712e5d81f57cb97b3b6b7fccc9c5610d21eb81db09dBen Murdoch    // this compilation, warn the user about it.
713e5d81f57cb97b3b6b7fccc9c5610d21eb81db09dBen Murdoch    phases::ID InitialPhase = types::getCompilationPhase(InputType, 0);
714f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)    if (InitialPhase > FinalPhase) {
715f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)      // Claim here to avoid the more general unused warning.
716e5d81f57cb97b3b6b7fccc9c5610d21eb81db09dBen Murdoch      InputArg->claim();
717e5d81f57cb97b3b6b7fccc9c5610d21eb81db09dBen Murdoch
718e5d81f57cb97b3b6b7fccc9c5610d21eb81db09dBen Murdoch      // Special case '-E' warning on a previously preprocessed file to make
719e5d81f57cb97b3b6b7fccc9c5610d21eb81db09dBen Murdoch      // more sense.
720f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)      if (InitialPhase == phases::Compile && FinalPhase == phases::Preprocess &&
721f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)          getPreprocessedType(InputType) == types::TY_INVALID)
722e5d81f57cb97b3b6b7fccc9c5610d21eb81db09dBen Murdoch        Diag(clang::diag::warn_drv_preprocessed_input_file_unused)
723e5d81f57cb97b3b6b7fccc9c5610d21eb81db09dBen Murdoch          << InputArg->getAsString(Args)
724e5d81f57cb97b3b6b7fccc9c5610d21eb81db09dBen Murdoch          << FinalPhaseArg->getOption().getName();
725e5d81f57cb97b3b6b7fccc9c5610d21eb81db09dBen Murdoch      else
726e5d81f57cb97b3b6b7fccc9c5610d21eb81db09dBen Murdoch        Diag(clang::diag::warn_drv_input_file_unused)
727e5d81f57cb97b3b6b7fccc9c5610d21eb81db09dBen Murdoch          << InputArg->getAsString(Args)
728e5d81f57cb97b3b6b7fccc9c5610d21eb81db09dBen Murdoch          << getPhaseName(InitialPhase)
7295821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)          << FinalPhaseArg->getOption().getName();
7305821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      continue;
7315821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    }
7325821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
7335821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    // Build the pipeline for this file.
7345821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    llvm::OwningPtr<Action> Current(new InputAction(*InputArg, InputType));
7355821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    for (unsigned i = 0; i != NumSteps; ++i) {
7365821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      phases::ID Phase = types::getCompilationPhase(InputType, i);
7375821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
7385821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      // We are done if this step is past what the user requested.
7395821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      if (Phase > FinalPhase)
7405821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        break;
7415821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
7425821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      // Queue linker inputs.
7435821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      if (Phase == phases::Link) {
7445821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        assert(i + 1 == NumSteps && "linking must be final compilation step.");
7455821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        LinkerInputs.push_back(Current.take());
7465821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        break;
7475821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      }
7485821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
7495821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      // Some types skip the assembler phase (e.g., llvm-bc), but we can't
7505821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      // encode this in the steps because the intermediate type depends on
7515821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      // arguments. Just special case here.
7525821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      if (Phase == phases::Assemble && Current->getType() != types::TY_PP_Asm)
7535821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        continue;
7545821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
7555821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      // Otherwise construct the appropriate action.
7565821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      Current.reset(ConstructPhaseAction(Args, Phase, Current.take()));
7575821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      if (Current->getType() == types::TY_Nothing)
7585821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        break;
7595821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    }
7605821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
7615821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    // If we ended with something, add to the output list.
7625821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    if (Current)
7635821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      Actions.push_back(Current.take());
7645821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  }
7655821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
7665821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // Add a link action if necessary.
7675821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  if (!LinkerInputs.empty())
7685821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    Actions.push_back(new LinkJobAction(LinkerInputs, types::TY_Image));
7695821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
7705821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // If we are linking, claim any options which are obviously only used for
7715821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // compilation.
7725821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  if (FinalPhase == phases::Link)
7735821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    Args.ClaimAllArgs(options::OPT_CompileOnly_Group);
7745821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
775868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)
776868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)Action *Driver::ConstructPhaseAction(const ArgList &Args, phases::ID Phase,
7775821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                                     Action *Input) const {
7785821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  llvm::PrettyStackTraceString CrashInfo("Constructing phase actions");
7795821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // Build the appropriate action.
7805821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  switch (Phase) {
7815821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  case phases::Link: assert(0 && "link action invalid here.");
7825821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  case phases::Preprocess: {
7835821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    types::ID OutputTy;
7845821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    // -{M, MM} alter the output type.
7855821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    if (Args.hasArg(options::OPT_M) || Args.hasArg(options::OPT_MM)) {
7865821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      OutputTy = types::TY_Dependencies;
787868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)    } else {
7885821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      OutputTy = types::getPreprocessedType(Input->getType());
7895821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      assert(OutputTy != types::TY_INVALID &&
7905821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)             "Cannot preprocess this input type!");
7915821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    }
7925821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    return new PreprocessJobAction(Input, OutputTy);
7935821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  }
7945821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  case phases::Precompile:
7955821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    return new PrecompileJobAction(Input, types::TY_PCH);
7965821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  case phases::Compile: {
7975821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    bool HasO4 = false;
7985821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    if (const Arg *A = Args.getLastArg(options::OPT_O_Group))
7995821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      HasO4 = A->getOption().matches(options::OPT_O4);
8005821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
8015821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    if (Args.hasArg(options::OPT_fsyntax_only)) {
8025821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      return new CompileJobAction(Input, types::TY_Nothing);
803868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)    } else if (Args.hasArg(options::OPT_rewrite_objc)) {
8045821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      return new CompileJobAction(Input, types::TY_RewrittenObjC);
8055821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    } else if (Args.hasArg(options::OPT__analyze, options::OPT__analyze_auto)) {
8065821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      return new AnalyzeJobAction(Input, types::TY_Plist);
8075821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    } else if (Args.hasArg(options::OPT_emit_ast)) {
8085821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      return new CompileJobAction(Input, types::TY_AST);
8095821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    } else if (Args.hasArg(options::OPT_emit_llvm) ||
8105d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)               Args.hasArg(options::OPT_flto) || HasO4) {
8115d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)      types::ID Output =
8125d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)        Args.hasArg(options::OPT_S) ? types::TY_LTO_IR : types::TY_LTO_BC;
813e5d81f57cb97b3b6b7fccc9c5610d21eb81db09dBen Murdoch      return new CompileJobAction(Input, Output);
814f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)    } else {
815116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch      return new CompileJobAction(Input, types::TY_PP_Asm);
816e5d81f57cb97b3b6b7fccc9c5610d21eb81db09dBen Murdoch    }
817e5d81f57cb97b3b6b7fccc9c5610d21eb81db09dBen Murdoch  }
818e5d81f57cb97b3b6b7fccc9c5610d21eb81db09dBen Murdoch  case phases::Assemble:
8195821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    return new AssembleJobAction(Input, types::TY_Object);
8205821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  }
8215821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
822868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)  assert(0 && "invalid phase in ConstructPhaseAction");
8235821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  return 0;
8245821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
8255821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
8265821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)void Driver::BuildJobs(Compilation &C) const {
8275821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  llvm::PrettyStackTraceString CrashInfo("Building compilation jobs");
8285821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  bool SaveTemps = C.getArgs().hasArg(options::OPT_save_temps);
829f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)  bool UsePipes = C.getArgs().hasArg(options::OPT_pipe);
830116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch
831e5d81f57cb97b3b6b7fccc9c5610d21eb81db09dBen Murdoch  // FIXME: Pipes are forcibly disabled until we support executing them.
832e5d81f57cb97b3b6b7fccc9c5610d21eb81db09dBen Murdoch  if (!CCCPrintBindings)
833e5d81f57cb97b3b6b7fccc9c5610d21eb81db09dBen Murdoch    UsePipes = false;
834e5d81f57cb97b3b6b7fccc9c5610d21eb81db09dBen Murdoch
835e5d81f57cb97b3b6b7fccc9c5610d21eb81db09dBen Murdoch  // -save-temps inhibits pipes.
8365821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  if (SaveTemps && UsePipes)
8375821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    Diag(clang::diag::warn_drv_pipe_ignored_with_save_temps);
8385821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
8395821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  Arg *FinalOutput = C.getArgs().getLastArg(options::OPT_o);
8405821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
8415821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // It is an error to provide a -o option if we are making multiple output
8425821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // files.
8435821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  if (FinalOutput) {
8445821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    unsigned NumOutputs = 0;
8455821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    for (ActionList::const_iterator it = C.getActions().begin(),
8465821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)           ie = C.getActions().end(); it != ie; ++it)
8475821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      if ((*it)->getType() != types::TY_Nothing)
8485821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        ++NumOutputs;
8495821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
8505821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    if (NumOutputs > 1) {
8515821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      Diag(clang::diag::err_drv_output_argument_with_multiple_files);
8525821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      FinalOutput = 0;
8535821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    }
8545821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  }
8555821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
8565821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  for (ActionList::const_iterator it = C.getActions().begin(),
8575821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)         ie = C.getActions().end(); it != ie; ++it) {
8585821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    Action *A = *it;
8595821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
8605821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    // If we are linking an image for multiple archs then the linker wants
8615821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    // -arch_multiple and -final_output <final image name>. Unfortunately, this
8625821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    // doesn't fit in cleanly because we have to pass this information down.
8635821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    //
8645821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    // FIXME: This is a hack; find a cleaner way to integrate this into the
8655821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    // process.
8665821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    const char *LinkingOutput = 0;
867868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)    if (isa<LipoJobAction>(A)) {
8685821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      if (FinalOutput)
8695821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        LinkingOutput = FinalOutput->getValue(C.getArgs());
8705821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      else
8715821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        LinkingOutput = DefaultImageName.c_str();
8725821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    }
8735821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
8745821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    InputInfo II;
8755821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    BuildJobsForAction(C, A, &C.getDefaultToolChain(),
8765d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)                       /*BoundArch*/0,
877f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)                       /*CanAcceptPipe*/ true,
878f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)                       /*AtTopLevel*/ true,
879e5d81f57cb97b3b6b7fccc9c5610d21eb81db09dBen Murdoch                       /*LinkingOutput*/ LinkingOutput,
880e5d81f57cb97b3b6b7fccc9c5610d21eb81db09dBen Murdoch                       II);
881e5d81f57cb97b3b6b7fccc9c5610d21eb81db09dBen Murdoch  }
882116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch
883e5d81f57cb97b3b6b7fccc9c5610d21eb81db09dBen Murdoch  // If the user passed -Qunused-arguments or there were errors, don't warn
8845d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)  // about any unused arguments.
8855d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)  if (Diags.getNumErrors() ||
8865d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)      C.getArgs().hasArg(options::OPT_Qunused_arguments))
8875d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)    return;
888f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)
889116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch  // Claim -### here.
890e5d81f57cb97b3b6b7fccc9c5610d21eb81db09dBen Murdoch  (void) C.getArgs().hasArg(options::OPT__HASH_HASH_HASH);
891e5d81f57cb97b3b6b7fccc9c5610d21eb81db09dBen Murdoch
892e5d81f57cb97b3b6b7fccc9c5610d21eb81db09dBen Murdoch  for (ArgList::const_iterator it = C.getArgs().begin(), ie = C.getArgs().end();
893e5d81f57cb97b3b6b7fccc9c5610d21eb81db09dBen Murdoch       it != ie; ++it) {
894e5d81f57cb97b3b6b7fccc9c5610d21eb81db09dBen Murdoch    Arg *A = *it;
8955d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)
8965821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    // FIXME: It would be nice to be able to send the argument to the
8975821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    // Diagnostic, so that extra values, position, and so on could be printed.
8985821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    if (!A->isClaimed()) {
8995821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      if (A->getOption().hasNoArgumentUnused())
9005821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        continue;
9015821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
9025821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      // Suppress the warning automatically if this is just a flag, and it is an
9035821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      // instance of an argument we already claimed.
904868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)      const Option &Opt = A->getOption();
905868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)      if (isa<FlagOption>(Opt)) {
9065821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        bool DuplicateClaimed = false;
9075821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
9085821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        for (arg_iterator it = C.getArgs().filtered_begin(&Opt),
909e5d81f57cb97b3b6b7fccc9c5610d21eb81db09dBen Murdoch               ie = C.getArgs().filtered_end(); it != ie; ++it) {
910f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)          if ((*it)->isClaimed()) {
911f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)            DuplicateClaimed = true;
912e5d81f57cb97b3b6b7fccc9c5610d21eb81db09dBen Murdoch            break;
913e5d81f57cb97b3b6b7fccc9c5610d21eb81db09dBen Murdoch          }
914e5d81f57cb97b3b6b7fccc9c5610d21eb81db09dBen Murdoch        }
915e5d81f57cb97b3b6b7fccc9c5610d21eb81db09dBen Murdoch
916e5d81f57cb97b3b6b7fccc9c5610d21eb81db09dBen Murdoch        if (DuplicateClaimed)
9175821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)          continue;
9185821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      }
9195821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
9205821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      Diag(clang::diag::warn_drv_unused_argument)
9215821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        << A->getAsString(C.getArgs());
9225821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    }
9235821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  }
9245821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
9255821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
9265821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)static const Tool &SelectToolForJob(Compilation &C, const ToolChain *TC,
9275821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                                    const JobAction *JA,
9285821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                                    const ActionList *&Inputs) {
929e5d81f57cb97b3b6b7fccc9c5610d21eb81db09dBen Murdoch  const Tool *ToolForJob = 0;
930f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)
931f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)  // See if we should look for a compiler with an integrated assembler. We match
932e5d81f57cb97b3b6b7fccc9c5610d21eb81db09dBen Murdoch  // bottom up, so what we are actually looking for is an assembler job with a
933e5d81f57cb97b3b6b7fccc9c5610d21eb81db09dBen Murdoch  // compiler input.
934e5d81f57cb97b3b6b7fccc9c5610d21eb81db09dBen Murdoch
935e5d81f57cb97b3b6b7fccc9c5610d21eb81db09dBen Murdoch  // FIXME: This doesn't belong here, but ideally we will support static soon
936e5d81f57cb97b3b6b7fccc9c5610d21eb81db09dBen Murdoch  // anyway.
9375821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  bool HasStatic = (C.getArgs().hasArg(options::OPT_mkernel) ||
9385821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                    C.getArgs().hasArg(options::OPT_static) ||
9395821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                    C.getArgs().hasArg(options::OPT_fapple_kext));
9405821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  bool IsIADefault = (TC->IsIntegratedAssemblerDefault() && !HasStatic);
9415821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  if (C.getArgs().hasFlag(options::OPT_integrated_as,
9425821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                         options::OPT_no_integrated_as,
9435821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                         IsIADefault) &&
944868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)      !C.getArgs().hasArg(options::OPT_save_temps) &&
9455821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      isa<AssembleJobAction>(JA) &&
9465821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      Inputs->size() == 1 && isa<CompileJobAction>(*Inputs->begin())) {
9475821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    const Tool &Compiler = TC->SelectTool(C,cast<JobAction>(**Inputs->begin()));
9485821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    if (Compiler.hasIntegratedAssembler()) {
9495821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      Inputs = &(*Inputs)[0]->getInputs();
9505821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      ToolForJob = &Compiler;
9515821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    }
9521e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles)  }
9535821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
9545821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // Otherwise use the tool for the current job.
9555821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  if (!ToolForJob)
9565821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    ToolForJob = &TC->SelectTool(C, *JA);
9575821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
9585821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // See if we should use an integrated preprocessor. We do so when we have
9595821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // exactly one input, since this is the only use case we care about
9605821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // (irrelevant since we don't support combine yet).
9615821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  if (Inputs->size() == 1 && isa<PreprocessJobAction>(*Inputs->begin()) &&
9625821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      !C.getArgs().hasArg(options::OPT_no_integrated_cpp) &&
9635821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      !C.getArgs().hasArg(options::OPT_traditional_cpp) &&
964a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)      !C.getArgs().hasArg(options::OPT_save_temps) &&
965a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)      ToolForJob->hasIntegratedCPP())
9665821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    Inputs = &(*Inputs)[0]->getInputs();
9675821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
9685821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  return *ToolForJob;
9695821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
9705821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
9715d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)void Driver::BuildJobsForAction(Compilation &C,
972f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)                                const Action *A,
9735821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                                const ToolChain *TC,
9745d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)                                const char *BoundArch,
9755821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                                bool CanAcceptPipe,
976116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch                                bool AtTopLevel,
977116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch                                const char *LinkingOutput,
9785d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)                                InputInfo &Result) const {
979e5d81f57cb97b3b6b7fccc9c5610d21eb81db09dBen Murdoch  llvm::PrettyStackTraceString CrashInfo("Building compilation jobs");
980f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)
981f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)  bool UsePipes = C.getArgs().hasArg(options::OPT_pipe);
982e5d81f57cb97b3b6b7fccc9c5610d21eb81db09dBen Murdoch  // FIXME: Pipes are forcibly disabled until we support executing them.
983e5d81f57cb97b3b6b7fccc9c5610d21eb81db09dBen Murdoch  if (!CCCPrintBindings)
9845821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    UsePipes = false;
9855821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
9865821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  if (const InputAction *IA = dyn_cast<InputAction>(A)) {
9875821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    // FIXME: It would be nice to not claim this here; maybe the old scheme of
988f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)    // just using Args was better?
9895821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    const Arg &Input = IA->getInputArg();
9905821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    Input.claim();
9915821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    if (Input.getOption().matches(options::OPT_INPUT)) {
9925821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      const char *Name = Input.getValue(C.getArgs());
993f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)      Result = InputInfo(Name, A->getType(), Name);
9945821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    } else
9955821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      Result = InputInfo(&Input, A->getType(), "");
9965821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    return;
9975821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  }
9985821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
9995821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  if (const BindArchAction *BAA = dyn_cast<BindArchAction>(A)) {
10005821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    const ToolChain *TC = &C.getDefaultToolChain();
10015821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
10025821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    std::string Arch;
10035821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    if (BAA->getArchName())
10045821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      TC = Host->CreateToolChain(C.getArgs(), BAA->getArchName());
10055821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
10065821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    BuildJobsForAction(C, *BAA->begin(), TC, BAA->getArchName(),
10075821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                       CanAcceptPipe, AtTopLevel, LinkingOutput, Result);
10085821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    return;
10095821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  }
10105821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
1011f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)  const ActionList *Inputs = &A->getInputs();
10125821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
10135821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  const JobAction *JA = cast<JobAction>(A);
1014e5d81f57cb97b3b6b7fccc9c5610d21eb81db09dBen Murdoch  const Tool &T = SelectToolForJob(C, TC, JA, Inputs);
10155821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
10165821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // Only use pipes when there is exactly one input.
1017cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)  bool TryToUsePipeInput = Inputs->size() == 1 && T.acceptsPipedInput();
1018cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)  InputInfoList InputInfos;
1019cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)  for (ActionList::const_iterator it = Inputs->begin(), ie = Inputs->end();
1020cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)       it != ie; ++it) {
1021cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)    // Treat dsymutil sub-jobs as being at the top-level too, they shouldn't get
1022cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)    // temporary output names.
10235821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    //
10245821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    // FIXME: Clean this up.
10255821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    bool SubJobAtTopLevel = false;
10265821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    if (AtTopLevel && isa<DsymutilJobAction>(A))
10275821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      SubJobAtTopLevel = true;
1028868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)
10295821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    InputInfo II;
10305821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    BuildJobsForAction(C, *it, TC, BoundArch, TryToUsePipeInput,
10315821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                       SubJobAtTopLevel, LinkingOutput, II);
10325821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    InputInfos.push_back(II);
10335821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  }
10345821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
10355821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // Determine if we should output to a pipe.
10365821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  bool OutputToPipe = false;
10375821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  if (CanAcceptPipe && T.canPipeOutput()) {
10385821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    // Some actions default to writing to a pipe if they are the top level phase
10395821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    // and there was no user override.
10405821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    //
10415821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    // FIXME: Is there a better way to handle this?
10425821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    if (AtTopLevel) {
10435821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      if (isa<PreprocessJobAction>(A) && !C.getArgs().hasArg(options::OPT_o))
10445821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        OutputToPipe = true;
10455821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    } else if (UsePipes)
10465821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      OutputToPipe = true;
10475821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  }
10485821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
10495821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // Figure out where to put the job (pipes).
10505821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  Job *Dest = &C.getJobs();
10515821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  if (InputInfos[0].isPipe()) {
10525821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    assert(TryToUsePipeInput && "Unrequested pipe!");
10535821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    assert(InputInfos.size() == 1 && "Unexpected pipe with multiple inputs.");
10545821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    Dest = &InputInfos[0].getPipe();
10551e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles)  }
10561e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles)
10571e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles)  // Always use the first input as the base input.
10581e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles)  const char *BaseInput = InputInfos[0].getBaseInput();
10591e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles)
10601e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles)  // ... except dsymutil actions, which use their actual input as the base
10611e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles)  // input.
10621e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles)  if (JA->getType() == types::TY_dSYM)
10635821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    BaseInput = InputInfos[0].getFilename();
10645821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
10651e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles)  // Determine the place to write output to (nothing, pipe, or filename) and
10661e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles)  // where to put the new job.
10671e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles)  if (JA->getType() == types::TY_Nothing) {
10685821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    Result = InputInfo(A->getType(), BaseInput);
10695821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  } else if (OutputToPipe) {
10705821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    // Append to current piped job or create a new one as appropriate.
10711e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles)    PipedJob *PJ = dyn_cast<PipedJob>(Dest);
10721e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles)    if (!PJ) {
107346d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles)      PJ = new PipedJob();
1074e5d81f57cb97b3b6b7fccc9c5610d21eb81db09dBen Murdoch      // FIXME: Temporary hack so that -ccc-print-bindings work until we have
1075f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)      // pipe support. Please remove later.
1076f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)      if (!CCCPrintBindings)
1077e5d81f57cb97b3b6b7fccc9c5610d21eb81db09dBen Murdoch        cast<JobList>(Dest)->addJob(PJ);
1078e5d81f57cb97b3b6b7fccc9c5610d21eb81db09dBen Murdoch      Dest = PJ;
1079e5d81f57cb97b3b6b7fccc9c5610d21eb81db09dBen Murdoch    }
1080e5d81f57cb97b3b6b7fccc9c5610d21eb81db09dBen Murdoch    Result = InputInfo(PJ, A->getType(), BaseInput);
1081e5d81f57cb97b3b6b7fccc9c5610d21eb81db09dBen Murdoch  } else {
10821e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles)    Result = InputInfo(GetNamedOutputPath(C, *JA, BaseInput, AtTopLevel),
10831e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles)                       A->getType(), BaseInput);
10841e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles)  }
10855821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
10865821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  if (CCCPrintBindings) {
10875821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    llvm::errs() << "# \"" << T.getToolChain().getTripleString() << '"'
10885821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                 << " - \"" << T.getName() << "\", inputs: [";
10895821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    for (unsigned i = 0, e = InputInfos.size(); i != e; ++i) {
10901e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles)      llvm::errs() << InputInfos[i].getAsString();
10911e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles)      if (i + 1 != e)
10921e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles)        llvm::errs() << ", ";
10935821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    }
10945821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    llvm::errs() << "], output: " << Result.getAsString() << "\n";
1095868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)  } else {
1096868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)    T.ConstructJob(C, *JA, *Dest, Result, InputInfos,
10975821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                   C.getArgsForToolChain(TC, BoundArch), LinkingOutput);
10985821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  }
10995821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
11005821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
11015821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)const char *Driver::GetNamedOutputPath(Compilation &C,
11025821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                                       const JobAction &JA,
11035821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                                       const char *BaseInput,
11045821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                                       bool AtTopLevel) const {
1105868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)  llvm::PrettyStackTraceString CrashInfo("Computing output path");
1106868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)  // Output to a user requested destination?
11075821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  if (AtTopLevel && !isa<DsymutilJobAction>(JA)) {
11085821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    if (Arg *FinalOutput = C.getArgs().getLastArg(options::OPT_o))
11095821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      return C.addResultFile(FinalOutput->getValue(C.getArgs()));
11105821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  }
11115821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
11125821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // Output to a temporary file?
11135821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  if (!AtTopLevel && !C.getArgs().hasArg(options::OPT_save_temps)) {
11145821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    std::string TmpName =
11155821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      GetTemporaryPath(types::getTypeTempSuffix(JA.getType()));
11165821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    return C.addTempFile(C.getArgs().MakeArgString(TmpName.c_str()));
11171320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci  }
11185821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
11195821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  llvm::sys::Path BasePath(BaseInput);
11205821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  std::string BaseName(BasePath.getLast());
11215821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
11225821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // Determine what the derived output name should be.
11235821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  const char *NamedOutput;
1124116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch  if (JA.getType() == types::TY_Image) {
11255821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    NamedOutput = DefaultImageName.c_str();
1126116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch  } else {
11275821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    const char *Suffix = types::getTypeTempSuffix(JA.getType());
1128c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)    assert(Suffix && "All types used for output should have a suffix.");
1129c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)
1130c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)    std::string::size_type End = std::string::npos;
1131c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)    if (!types::appendSuffixForType(JA.getType()))
11325821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      End = BaseName.rfind('.');
11335821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    std::string Suffixed(BaseName.substr(0, End));
1134116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch    Suffixed += '.';
11355821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    Suffixed += Suffix;
1136116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch    NamedOutput = C.getArgs().MakeArgString(Suffixed.c_str());
11375821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  }
11385821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
11395821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // As an annoying special case, PCH generation doesn't strip the pathname.
11405821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  if (JA.getType() == types::TY_PCH) {
11415821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    BasePath.eraseComponent();
11425821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    if (BasePath.isEmpty())
11435821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      BasePath = NamedOutput;
11445821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    else
11455821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      BasePath.appendComponent(NamedOutput);
11465821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    return C.addResultFile(C.getArgs().MakeArgString(BasePath.c_str()));
11475821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  } else {
11485821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    return C.addResultFile(NamedOutput);
11495821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  }
11505821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
11515821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
11525821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)std::string Driver::GetFilePath(const char *Name, const ToolChain &TC) const {
11535821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // Respect a limited subset of the '-Bprefix' functionality in GCC by
11545821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // attempting to use this prefix when lokup up program paths.
11555821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  if (!PrefixDir.empty()) {
11565821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    llvm::sys::Path P(PrefixDir);
11575821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    P.appendComponent(Name);
11585821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    if (P.exists())
11595821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      return P.str();
11605821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  }
11615821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
11625821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  const ToolChain::path_list &List = TC.getFilePaths();
11635821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  for (ToolChain::path_list::const_iterator
11645821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)         it = List.begin(), ie = List.end(); it != ie; ++it) {
11655821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    llvm::sys::Path P(*it);
11665821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    P.appendComponent(Name);
11675821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    if (P.exists())
11685821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      return P.str();
11695821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  }
11705821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
11715821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  return Name;
11725821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
11735821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
11745821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)std::string Driver::GetProgramPath(const char *Name, const ToolChain &TC,
11755821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                                   bool WantFile) const {
11765821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // Respect a limited subset of the '-Bprefix' functionality in GCC by
11775821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // attempting to use this prefix when lokup up program paths.
11785821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  if (!PrefixDir.empty()) {
11795821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    llvm::sys::Path P(PrefixDir);
11805821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    P.appendComponent(Name);
11815821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    if (WantFile ? P.exists() : P.canExecute())
11825821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      return P.str();
11835821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  }
11845821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
11855821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  const ToolChain::path_list &List = TC.getProgramPaths();
11865821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  for (ToolChain::path_list::const_iterator
11875821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)         it = List.begin(), ie = List.end(); it != ie; ++it) {
11885821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    llvm::sys::Path P(*it);
11895821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    P.appendComponent(Name);
1190868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)    if (WantFile ? P.exists() : P.canExecute())
11915821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      return P.str();
11925821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  }
11935821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
11945821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // If all else failed, search the path.
11955821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  llvm::sys::Path P(llvm::sys::Program::FindProgramByName(Name));
11965821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  if (!P.empty())
11975821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    return P.str();
1198868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)
1199868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)  return Name;
12005821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
12015821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
12025821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)std::string Driver::GetTemporaryPath(const char *Suffix) const {
12035821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // FIXME: This is lame; sys::Path should provide this function (in particular,
12045821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // it should know how to find the temporary files dir).
12055821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  std::string Error;
12065821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  const char *TmpDir = ::getenv("TMPDIR");
12075821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  if (!TmpDir)
12085821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    TmpDir = ::getenv("TEMP");
12095821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  if (!TmpDir)
12105821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    TmpDir = ::getenv("TMP");
12115821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  if (!TmpDir)
12125821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    TmpDir = "/tmp";
12135821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  llvm::sys::Path P(TmpDir);
12145821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  P.appendComponent("cc");
12155821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  if (P.makeUnique(false, &Error)) {
12165821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    Diag(clang::diag::err_drv_unable_to_make_temp) << Error;
12175821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    return "";
12185821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  }
12195821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
12205821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // FIXME: Grumble, makeUnique sometimes leaves the file around!?  PR3837.
12215821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  P.eraseFromDisk(false, 0);
12225821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
12235821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  P.appendSuffix(Suffix);
12245821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  return P.str();
12255821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
12265821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
12275821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)const HostInfo *Driver::GetHostInfo(const char *TripleStr) const {
12285821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  llvm::PrettyStackTraceString CrashInfo("Constructing host");
12295821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  llvm::Triple Triple(TripleStr);
12305821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
12315821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // TCE is an osless target
12325821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  if (Triple.getArchName() == "tce")
12335821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    return createTCEHostInfo(*this, Triple);
12345821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
12355821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  switch (Triple.getOS()) {
12365821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  case llvm::Triple::AuroraUX:
1237868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)    return createAuroraUXHostInfo(*this, Triple);
1238868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)  case llvm::Triple::Darwin:
1239868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)    return createDarwinHostInfo(*this, Triple);
12405821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  case llvm::Triple::DragonFly:
12415821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    return createDragonFlyHostInfo(*this, Triple);
12425821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  case llvm::Triple::OpenBSD:
12435821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    return createOpenBSDHostInfo(*this, Triple);
12445821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  case llvm::Triple::FreeBSD:
12455821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    return createFreeBSDHostInfo(*this, Triple);
12465821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  case llvm::Triple::Linux:
12475821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    return createLinuxHostInfo(*this, Triple);
12485821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  default:
12495821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    return createUnknownHostInfo(*this, Triple);
12505821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  }
12515821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
12525821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
12535821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)bool Driver::ShouldUseClangCompiler(const Compilation &C, const JobAction &JA,
1254868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)                                    const llvm::Triple &Triple) const {
12555821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // Check if user requested no clang, or clang doesn't understand this type (we
1256868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)  // only handle single inputs for now).
12575821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  if (!CCCUseClang || JA.size() != 1 ||
12585821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      !types::isAcceptedByClang((*JA.begin())->getType()))
12595821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    return false;
12605821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
12615821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // Otherwise make sure this is an action clang understands.
12625821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  if (isa<PreprocessJobAction>(JA)) {
12635821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    if (!CCCUseClangCPP) {
12645821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      Diag(clang::diag::warn_drv_not_using_clang_cpp);
12655821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      return false;
1266868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)    }
12675821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  } else if (!isa<PrecompileJobAction>(JA) && !isa<CompileJobAction>(JA))
12685821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    return false;
12695821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
12705821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // Use clang for C++?
12715821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  if (!CCCUseClangCXX && types::isCXX((*JA.begin())->getType())) {
12725821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    Diag(clang::diag::warn_drv_not_using_clang_cxx);
12735821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    return false;
12745821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  }
12755821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
12765821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // Always use clang for precompiling, AST generation, and rewriting,
12775821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // regardless of archs.
12785821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  if (isa<PrecompileJobAction>(JA) ||
12795821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      types::isOnlyAcceptedByClang(JA.getType()))
12805821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    return true;
12815821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
12825821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // Finally, don't use clang if this isn't one of the user specified archs to
12835821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // build.
12845821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  if (!CCCClangArchs.empty() && !CCCClangArchs.count(Triple.getArch())) {
12855821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    Diag(clang::diag::warn_drv_not_using_clang_arch) << Triple.getArchName();
12865821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    return false;
12875821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  }
12885821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
12895821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  return true;
12905821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
12915821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
12925821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)/// GetReleaseVersion - Parse (([0-9]+)(.([0-9]+)(.([0-9]+)?))?)? and return the
12935821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)/// grouped values as integers. Numbers which are not provided are set to 0.
12945821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)///
12955821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)/// \return True if the entire string was parsed (9.2), or all groups were
12965821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)/// parsed (10.3.5extrastuff).
12975821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)bool Driver::GetReleaseVersion(const char *Str, unsigned &Major,
12985821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                               unsigned &Minor, unsigned &Micro,
12995821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                               bool &HadExtra) {
13005821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  HadExtra = false;
13015821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
13025821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  Major = Minor = Micro = 0;
13035821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  if (*Str == '\0')
13045821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    return true;
13055821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
13065821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  char *End;
13075821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  Major = (unsigned) strtol(Str, &End, 10);
13085821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  if (*Str != '\0' && *End == '\0')
13095821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    return true;
13105821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  if (*End != '.')
13115821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    return false;
13125821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
13135821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  Str = End+1;
13145821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  Minor = (unsigned) strtol(Str, &End, 10);
13155821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  if (*Str != '\0' && *End == '\0')
13165821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    return true;
13175821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  if (*End != '.')
13185821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    return false;
13195821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
13205821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  Str = End+1;
13215821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  Micro = (unsigned) strtol(Str, &End, 10);
1322f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)  if (*Str != '\0' && *End == '\0')
13235821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    return true;
13245821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  if (Str == End)
13255821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    return false;
13265821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  HadExtra = true;
13275821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  return true;
13285821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
13295821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)