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)