Driver.cpp revision cb881672c2c46142ec1bdfa401c9818ae805db0f
13ede8d0a7d1813f678ccc6011a99a0834b1b6116Daniel Dunbar//===--- Driver.cpp - Clang GCC Compatible Driver -----------------------*-===// 23ede8d0a7d1813f678ccc6011a99a0834b1b6116Daniel Dunbar// 33ede8d0a7d1813f678ccc6011a99a0834b1b6116Daniel Dunbar// The LLVM Compiler Infrastructure 43ede8d0a7d1813f678ccc6011a99a0834b1b6116Daniel Dunbar// 53ede8d0a7d1813f678ccc6011a99a0834b1b6116Daniel Dunbar// This file is distributed under the University of Illinois Open Source 63ede8d0a7d1813f678ccc6011a99a0834b1b6116Daniel Dunbar// License. See LICENSE.TXT for details. 73ede8d0a7d1813f678ccc6011a99a0834b1b6116Daniel Dunbar// 83ede8d0a7d1813f678ccc6011a99a0834b1b6116Daniel Dunbar//===----------------------------------------------------------------------===// 93ede8d0a7d1813f678ccc6011a99a0834b1b6116Daniel Dunbar 103ede8d0a7d1813f678ccc6011a99a0834b1b6116Daniel Dunbar#include "clang/Driver/Driver.h" 113ede8d0a7d1813f678ccc6011a99a0834b1b6116Daniel Dunbar 1253ec55215075c8f4ddd47ca6ed7d382f16beb670Daniel Dunbar#include "clang/Driver/Action.h" 131b3bb6efc59a21f794b534078f9ae7e95393f510Daniel Dunbar#include "clang/Driver/Arg.h" 141b3bb6efc59a21f794b534078f9ae7e95393f510Daniel Dunbar#include "clang/Driver/ArgList.h" 151b3bb6efc59a21f794b534078f9ae7e95393f510Daniel Dunbar#include "clang/Driver/Compilation.h" 164ad4b3ebbe5769143389dccfcfadb666a4ba5940Daniel Dunbar#include "clang/Driver/DriverDiagnostic.h" 17dd98e2cad165ca73c769e4f105a4e47c2216387aDaniel Dunbar#include "clang/Driver/HostInfo.h" 180648262df75d97b464c2be0ed867da3615659785Daniel Dunbar#include "clang/Driver/Option.h" 191b3bb6efc59a21f794b534078f9ae7e95393f510Daniel Dunbar#include "clang/Driver/Options.h" 2053ec55215075c8f4ddd47ca6ed7d382f16beb670Daniel Dunbar#include "clang/Driver/Types.h" 210648262df75d97b464c2be0ed867da3615659785Daniel Dunbar 222fe63e6adac0b9e5f52bcc3100b545e379417e6eDaniel Dunbar#include "llvm/ADT/StringMap.h" 230648262df75d97b464c2be0ed867da3615659785Daniel Dunbar#include "llvm/Support/raw_ostream.h" 2453ec55215075c8f4ddd47ca6ed7d382f16beb670Daniel Dunbar#include "llvm/System/Path.h" 251b3bb6efc59a21f794b534078f9ae7e95393f510Daniel Dunbarusing namespace clang::driver; 261b3bb6efc59a21f794b534078f9ae7e95393f510Daniel Dunbar 27dd98e2cad165ca73c769e4f105a4e47c2216387aDaniel DunbarDriver::Driver(const char *_Name, const char *_Dir, 284ad4b3ebbe5769143389dccfcfadb666a4ba5940Daniel Dunbar const char *_DefaultHostTriple, 294ad4b3ebbe5769143389dccfcfadb666a4ba5940Daniel Dunbar Diagnostic &_Diags) 304ad4b3ebbe5769143389dccfcfadb666a4ba5940Daniel Dunbar : Opts(new OptTable()), Diags(_Diags), 31dd98e2cad165ca73c769e4f105a4e47c2216387aDaniel Dunbar Name(_Name), Dir(_Dir), DefaultHostTriple(_DefaultHostTriple), 32dd98e2cad165ca73c769e4f105a4e47c2216387aDaniel Dunbar Host(0), 33365c02f65be026f90e67a8e00e7b827cee60e228Daniel Dunbar CCCIsCXX(false), CCCEcho(false), 348b1604ece7bf6dc2ba811cd7d8767557e55e2ec2Daniel Dunbar CCCNoClang(false), CCCNoClangCXX(false), CCCNoClangCPP(false), 358b1604ece7bf6dc2ba811cd7d8767557e55e2ec2Daniel Dunbar SuppressMissingInputWarning(false) 36365c02f65be026f90e67a8e00e7b827cee60e228Daniel Dunbar{ 373ede8d0a7d1813f678ccc6011a99a0834b1b6116Daniel Dunbar} 383ede8d0a7d1813f678ccc6011a99a0834b1b6116Daniel Dunbar 393ede8d0a7d1813f678ccc6011a99a0834b1b6116Daniel DunbarDriver::~Driver() { 401b3bb6efc59a21f794b534078f9ae7e95393f510Daniel Dunbar delete Opts; 413ede8d0a7d1813f678ccc6011a99a0834b1b6116Daniel Dunbar} 423ede8d0a7d1813f678ccc6011a99a0834b1b6116Daniel Dunbar 430648262df75d97b464c2be0ed867da3615659785Daniel DunbarArgList *Driver::ParseArgStrings(const char **ArgBegin, const char **ArgEnd) { 440648262df75d97b464c2be0ed867da3615659785Daniel Dunbar ArgList *Args = new ArgList(ArgBegin, ArgEnd); 450648262df75d97b464c2be0ed867da3615659785Daniel Dunbar 460648262df75d97b464c2be0ed867da3615659785Daniel Dunbar unsigned Index = 0, End = ArgEnd - ArgBegin; 470648262df75d97b464c2be0ed867da3615659785Daniel Dunbar while (Index < End) { 480648262df75d97b464c2be0ed867da3615659785Daniel Dunbar unsigned Prev = Index; 490648262df75d97b464c2be0ed867da3615659785Daniel Dunbar Arg *A = getOpts().ParseOneArg(*Args, Index, End); 5053ec55215075c8f4ddd47ca6ed7d382f16beb670Daniel Dunbar if (A) { 5153ec55215075c8f4ddd47ca6ed7d382f16beb670Daniel Dunbar if (A->getOption().isUnsupported()) { 52b897f5d3ebfb62c2745e2e2af7faa9920c882438Daniel Dunbar Diag(clang::diag::err_drv_unsupported_opt) << A->getOption().getName(); 5353ec55215075c8f4ddd47ca6ed7d382f16beb670Daniel Dunbar continue; 5453ec55215075c8f4ddd47ca6ed7d382f16beb670Daniel Dunbar } 5553ec55215075c8f4ddd47ca6ed7d382f16beb670Daniel Dunbar 560648262df75d97b464c2be0ed867da3615659785Daniel Dunbar Args->append(A); 5753ec55215075c8f4ddd47ca6ed7d382f16beb670Daniel Dunbar } 580648262df75d97b464c2be0ed867da3615659785Daniel Dunbar 590648262df75d97b464c2be0ed867da3615659785Daniel Dunbar assert(Index > Prev && "Parser failed to consume argument."); 600648262df75d97b464c2be0ed867da3615659785Daniel Dunbar } 610648262df75d97b464c2be0ed867da3615659785Daniel Dunbar 620648262df75d97b464c2be0ed867da3615659785Daniel Dunbar return Args; 630648262df75d97b464c2be0ed867da3615659785Daniel Dunbar} 640648262df75d97b464c2be0ed867da3615659785Daniel Dunbar 653ede8d0a7d1813f678ccc6011a99a0834b1b6116Daniel DunbarCompilation *Driver::BuildCompilation(int argc, const char **argv) { 66cb881672c2c46142ec1bdfa401c9818ae805db0fDaniel Dunbar // FIXME: Handle environment options which effect driver behavior, 67cb881672c2c46142ec1bdfa401c9818ae805db0fDaniel Dunbar // somewhere (client?). GCC_EXEC_PREFIX, COMPILER_PATH, 68cb881672c2c46142ec1bdfa401c9818ae805db0fDaniel Dunbar // LIBRARY_PATH, LPATH, CC_PRINT_OPTIONS, QA_OVERRIDE_GCC3_OPTIONS. 69cb881672c2c46142ec1bdfa401c9818ae805db0fDaniel Dunbar 70cb881672c2c46142ec1bdfa401c9818ae805db0fDaniel Dunbar // FIXME: What are we going to do with -V and -b? 71cb881672c2c46142ec1bdfa401c9818ae805db0fDaniel Dunbar 72cb881672c2c46142ec1bdfa401c9818ae805db0fDaniel Dunbar // FIXME: Handle CCC_ADD_ARGS. 73cb881672c2c46142ec1bdfa401c9818ae805db0fDaniel Dunbar 74365c02f65be026f90e67a8e00e7b827cee60e228Daniel Dunbar // FIXME: This stuff needs to go into the Compilation, not the 75365c02f65be026f90e67a8e00e7b827cee60e228Daniel Dunbar // driver. 7653ec55215075c8f4ddd47ca6ed7d382f16beb670Daniel Dunbar bool CCCPrintOptions = false, CCCPrintActions = false; 770648262df75d97b464c2be0ed867da3615659785Daniel Dunbar 78365c02f65be026f90e67a8e00e7b827cee60e228Daniel Dunbar const char **Start = argv + 1, **End = argv + argc; 79dd98e2cad165ca73c769e4f105a4e47c2216387aDaniel Dunbar const char *HostTriple = DefaultHostTriple.c_str(); 80365c02f65be026f90e67a8e00e7b827cee60e228Daniel Dunbar 81365c02f65be026f90e67a8e00e7b827cee60e228Daniel Dunbar // Read -ccc args. 82365c02f65be026f90e67a8e00e7b827cee60e228Daniel Dunbar // 83365c02f65be026f90e67a8e00e7b827cee60e228Daniel Dunbar // FIXME: We need to figure out where this behavior should 84365c02f65be026f90e67a8e00e7b827cee60e228Daniel Dunbar // live. Most of it should be outside in the client; the parts that 85365c02f65be026f90e67a8e00e7b827cee60e228Daniel Dunbar // aren't should have proper options, either by introducing new ones 86365c02f65be026f90e67a8e00e7b827cee60e228Daniel Dunbar // or by overloading gcc ones like -V or -b. 87365c02f65be026f90e67a8e00e7b827cee60e228Daniel Dunbar for (; Start != End && memcmp(*Start, "-ccc-", 5) == 0; ++Start) { 88365c02f65be026f90e67a8e00e7b827cee60e228Daniel Dunbar const char *Opt = *Start + 5; 89365c02f65be026f90e67a8e00e7b827cee60e228Daniel Dunbar 90365c02f65be026f90e67a8e00e7b827cee60e228Daniel Dunbar if (!strcmp(Opt, "print-options")) { 91365c02f65be026f90e67a8e00e7b827cee60e228Daniel Dunbar CCCPrintOptions = true; 92365c02f65be026f90e67a8e00e7b827cee60e228Daniel Dunbar } else if (!strcmp(Opt, "print-phases")) { 9353ec55215075c8f4ddd47ca6ed7d382f16beb670Daniel Dunbar CCCPrintActions = true; 94365c02f65be026f90e67a8e00e7b827cee60e228Daniel Dunbar } else if (!strcmp(Opt, "cxx")) { 95365c02f65be026f90e67a8e00e7b827cee60e228Daniel Dunbar CCCIsCXX = true; 96365c02f65be026f90e67a8e00e7b827cee60e228Daniel Dunbar } else if (!strcmp(Opt, "echo")) { 97365c02f65be026f90e67a8e00e7b827cee60e228Daniel Dunbar CCCEcho = true; 98365c02f65be026f90e67a8e00e7b827cee60e228Daniel Dunbar 99365c02f65be026f90e67a8e00e7b827cee60e228Daniel Dunbar } else if (!strcmp(Opt, "no-clang")) { 100365c02f65be026f90e67a8e00e7b827cee60e228Daniel Dunbar CCCNoClang = true; 101365c02f65be026f90e67a8e00e7b827cee60e228Daniel Dunbar } else if (!strcmp(Opt, "no-clang-cxx")) { 102365c02f65be026f90e67a8e00e7b827cee60e228Daniel Dunbar CCCNoClangCXX = true; 103365c02f65be026f90e67a8e00e7b827cee60e228Daniel Dunbar } else if (!strcmp(Opt, "no-clang-cpp")) { 104365c02f65be026f90e67a8e00e7b827cee60e228Daniel Dunbar CCCNoClangCPP = true; 105365c02f65be026f90e67a8e00e7b827cee60e228Daniel Dunbar } else if (!strcmp(Opt, "clang-archs")) { 106365c02f65be026f90e67a8e00e7b827cee60e228Daniel Dunbar assert(Start+1 < End && "FIXME: -ccc- argument handling."); 107365c02f65be026f90e67a8e00e7b827cee60e228Daniel Dunbar const char *Cur = *++Start; 108365c02f65be026f90e67a8e00e7b827cee60e228Daniel Dunbar 109365c02f65be026f90e67a8e00e7b827cee60e228Daniel Dunbar for (;;) { 110365c02f65be026f90e67a8e00e7b827cee60e228Daniel Dunbar const char *Next = strchr(Cur, ','); 111365c02f65be026f90e67a8e00e7b827cee60e228Daniel Dunbar 112365c02f65be026f90e67a8e00e7b827cee60e228Daniel Dunbar if (Next) { 113365c02f65be026f90e67a8e00e7b827cee60e228Daniel Dunbar CCCClangArchs.insert(std::string(Cur, Next)); 114365c02f65be026f90e67a8e00e7b827cee60e228Daniel Dunbar Cur = Next + 1; 115365c02f65be026f90e67a8e00e7b827cee60e228Daniel Dunbar } else { 116365c02f65be026f90e67a8e00e7b827cee60e228Daniel Dunbar CCCClangArchs.insert(std::string(Cur)); 117365c02f65be026f90e67a8e00e7b827cee60e228Daniel Dunbar break; 118365c02f65be026f90e67a8e00e7b827cee60e228Daniel Dunbar } 119365c02f65be026f90e67a8e00e7b827cee60e228Daniel Dunbar } 120365c02f65be026f90e67a8e00e7b827cee60e228Daniel Dunbar 121dd98e2cad165ca73c769e4f105a4e47c2216387aDaniel Dunbar } else if (!strcmp(Opt, "host-triple")) { 122365c02f65be026f90e67a8e00e7b827cee60e228Daniel Dunbar assert(Start+1 < End && "FIXME: -ccc- argument handling."); 123dd98e2cad165ca73c769e4f105a4e47c2216387aDaniel Dunbar HostTriple = *++Start; 124365c02f65be026f90e67a8e00e7b827cee60e228Daniel Dunbar 125365c02f65be026f90e67a8e00e7b827cee60e228Daniel Dunbar } else { 126365c02f65be026f90e67a8e00e7b827cee60e228Daniel Dunbar // FIXME: Error handling. 127365c02f65be026f90e67a8e00e7b827cee60e228Daniel Dunbar llvm::errs() << "invalid option: " << *Start << "\n"; 128365c02f65be026f90e67a8e00e7b827cee60e228Daniel Dunbar exit(1); 129365c02f65be026f90e67a8e00e7b827cee60e228Daniel Dunbar } 130365c02f65be026f90e67a8e00e7b827cee60e228Daniel Dunbar } 131dd98e2cad165ca73c769e4f105a4e47c2216387aDaniel Dunbar 132365c02f65be026f90e67a8e00e7b827cee60e228Daniel Dunbar ArgList *Args = ParseArgStrings(Start, End); 133365c02f65be026f90e67a8e00e7b827cee60e228Daniel Dunbar 134cb881672c2c46142ec1bdfa401c9818ae805db0fDaniel Dunbar Host = Driver::GetHostInfo(HostTriple); 135cb881672c2c46142ec1bdfa401c9818ae805db0fDaniel Dunbar DefaultToolChain = Host->getToolChain(*Args); 136cb881672c2c46142ec1bdfa401c9818ae805db0fDaniel Dunbar 137365c02f65be026f90e67a8e00e7b827cee60e228Daniel Dunbar // FIXME: This behavior shouldn't be here. 138365c02f65be026f90e67a8e00e7b827cee60e228Daniel Dunbar if (CCCPrintOptions) { 13953ec55215075c8f4ddd47ca6ed7d382f16beb670Daniel Dunbar PrintOptions(*Args); 140365c02f65be026f90e67a8e00e7b827cee60e228Daniel Dunbar exit(0); 141365c02f65be026f90e67a8e00e7b827cee60e228Daniel Dunbar } 14253ec55215075c8f4ddd47ca6ed7d382f16beb670Daniel Dunbar 143cb881672c2c46142ec1bdfa401c9818ae805db0fDaniel Dunbar if (!HandleImmediateArgs(*Args)) 144cb881672c2c46142ec1bdfa401c9818ae805db0fDaniel Dunbar return 0; 145cb881672c2c46142ec1bdfa401c9818ae805db0fDaniel Dunbar 14653ec55215075c8f4ddd47ca6ed7d382f16beb670Daniel Dunbar // Construct the list of abstract actions to perform for this 14753ec55215075c8f4ddd47ca6ed7d382f16beb670Daniel Dunbar // compilation. 148d65bddcbe1385a4de212ecbbdc8919c54b3efeb0Daniel Dunbar ActionList Actions; 14953ec55215075c8f4ddd47ca6ed7d382f16beb670Daniel Dunbar if (Host->useDriverDriver()) 15053ec55215075c8f4ddd47ca6ed7d382f16beb670Daniel Dunbar BuildUniversalActions(*Args, Actions); 15153ec55215075c8f4ddd47ca6ed7d382f16beb670Daniel Dunbar else 15253ec55215075c8f4ddd47ca6ed7d382f16beb670Daniel Dunbar BuildActions(*Args, Actions); 15353ec55215075c8f4ddd47ca6ed7d382f16beb670Daniel Dunbar 15453ec55215075c8f4ddd47ca6ed7d382f16beb670Daniel Dunbar // FIXME: This behavior shouldn't be here. 15553ec55215075c8f4ddd47ca6ed7d382f16beb670Daniel Dunbar if (CCCPrintActions) { 15653ec55215075c8f4ddd47ca6ed7d382f16beb670Daniel Dunbar PrintActions(Actions); 15753ec55215075c8f4ddd47ca6ed7d382f16beb670Daniel Dunbar exit(0); 15853ec55215075c8f4ddd47ca6ed7d382f16beb670Daniel Dunbar } 15953ec55215075c8f4ddd47ca6ed7d382f16beb670Daniel Dunbar 160365c02f65be026f90e67a8e00e7b827cee60e228Daniel Dunbar assert(0 && "FIXME: Implement"); 161365c02f65be026f90e67a8e00e7b827cee60e228Daniel Dunbar 162365c02f65be026f90e67a8e00e7b827cee60e228Daniel Dunbar return new Compilation(); 163365c02f65be026f90e67a8e00e7b827cee60e228Daniel Dunbar} 164365c02f65be026f90e67a8e00e7b827cee60e228Daniel Dunbar 165d65bddcbe1385a4de212ecbbdc8919c54b3efeb0Daniel Dunbarvoid Driver::PrintOptions(const ArgList &Args) const { 1660648262df75d97b464c2be0ed867da3615659785Daniel Dunbar unsigned i = 0; 16753ec55215075c8f4ddd47ca6ed7d382f16beb670Daniel Dunbar for (ArgList::const_iterator it = Args.begin(), ie = Args.end(); 1680648262df75d97b464c2be0ed867da3615659785Daniel Dunbar it != ie; ++it, ++i) { 1690648262df75d97b464c2be0ed867da3615659785Daniel Dunbar Arg *A = *it; 1700648262df75d97b464c2be0ed867da3615659785Daniel Dunbar llvm::errs() << "Option " << i << " - " 1710648262df75d97b464c2be0ed867da3615659785Daniel Dunbar << "Name: \"" << A->getOption().getName() << "\", " 1720648262df75d97b464c2be0ed867da3615659785Daniel Dunbar << "Values: {"; 1730648262df75d97b464c2be0ed867da3615659785Daniel Dunbar for (unsigned j = 0; j < A->getNumValues(); ++j) { 1740648262df75d97b464c2be0ed867da3615659785Daniel Dunbar if (j) 1750648262df75d97b464c2be0ed867da3615659785Daniel Dunbar llvm::errs() << ", "; 17653ec55215075c8f4ddd47ca6ed7d382f16beb670Daniel Dunbar llvm::errs() << '"' << A->getValue(Args, j) << '"'; 1770648262df75d97b464c2be0ed867da3615659785Daniel Dunbar } 1780648262df75d97b464c2be0ed867da3615659785Daniel Dunbar llvm::errs() << "}\n"; 1790648262df75d97b464c2be0ed867da3615659785Daniel Dunbar } 1803ede8d0a7d1813f678ccc6011a99a0834b1b6116Daniel Dunbar} 181dd98e2cad165ca73c769e4f105a4e47c2216387aDaniel Dunbar 182cb881672c2c46142ec1bdfa401c9818ae805db0fDaniel Dunbarvoid Driver::PrintVersion() const { 183cb881672c2c46142ec1bdfa401c9818ae805db0fDaniel Dunbar // FIXME: Get a reasonable version number. 184cb881672c2c46142ec1bdfa401c9818ae805db0fDaniel Dunbar 185cb881672c2c46142ec1bdfa401c9818ae805db0fDaniel Dunbar // FIXME: The following handlers should use a callback mechanism, we 186cb881672c2c46142ec1bdfa401c9818ae805db0fDaniel Dunbar // don't know what the client would like to do. 187cb881672c2c46142ec1bdfa401c9818ae805db0fDaniel Dunbar llvm::outs() << "ccc version 1.0" << "\n"; 188cb881672c2c46142ec1bdfa401c9818ae805db0fDaniel Dunbar} 189cb881672c2c46142ec1bdfa401c9818ae805db0fDaniel Dunbar 190cb881672c2c46142ec1bdfa401c9818ae805db0fDaniel Dunbarbool Driver::HandleImmediateArgs(const ArgList &Args) { 191cb881672c2c46142ec1bdfa401c9818ae805db0fDaniel Dunbar // The order these options are handled in in gcc is all over the 192cb881672c2c46142ec1bdfa401c9818ae805db0fDaniel Dunbar // place, but we don't expect inconsistencies w.r.t. that to matter 193cb881672c2c46142ec1bdfa401c9818ae805db0fDaniel Dunbar // in practice. 194cb881672c2c46142ec1bdfa401c9818ae805db0fDaniel Dunbar if (Args.hasArg(options::OPT_v) || 195cb881672c2c46142ec1bdfa401c9818ae805db0fDaniel Dunbar Args.hasArg(options::OPT__HASH_HASH_HASH)) { 196cb881672c2c46142ec1bdfa401c9818ae805db0fDaniel Dunbar PrintVersion(); 197cb881672c2c46142ec1bdfa401c9818ae805db0fDaniel Dunbar SuppressMissingInputWarning = true; 198cb881672c2c46142ec1bdfa401c9818ae805db0fDaniel Dunbar } 199cb881672c2c46142ec1bdfa401c9818ae805db0fDaniel Dunbar 200cb881672c2c46142ec1bdfa401c9818ae805db0fDaniel Dunbar // FIXME: The following handlers should use a callback mechanism, we 201cb881672c2c46142ec1bdfa401c9818ae805db0fDaniel Dunbar // don't know what the client would like to do. 202cb881672c2c46142ec1bdfa401c9818ae805db0fDaniel Dunbar if (Arg *A = Args.getLastArg(options::OPT_print_file_name_EQ)) { 203cb881672c2c46142ec1bdfa401c9818ae805db0fDaniel Dunbar llvm::outs() << GetFilePath(A->getValue(Args)).toString() << "\n"; 204cb881672c2c46142ec1bdfa401c9818ae805db0fDaniel Dunbar return false; 205cb881672c2c46142ec1bdfa401c9818ae805db0fDaniel Dunbar } 206cb881672c2c46142ec1bdfa401c9818ae805db0fDaniel Dunbar 207cb881672c2c46142ec1bdfa401c9818ae805db0fDaniel Dunbar if (Arg *A = Args.getLastArg(options::OPT_print_prog_name_EQ)) { 208cb881672c2c46142ec1bdfa401c9818ae805db0fDaniel Dunbar llvm::outs() << GetProgramPath(A->getValue(Args)).toString() << "\n"; 209cb881672c2c46142ec1bdfa401c9818ae805db0fDaniel Dunbar return false; 210cb881672c2c46142ec1bdfa401c9818ae805db0fDaniel Dunbar } 211cb881672c2c46142ec1bdfa401c9818ae805db0fDaniel Dunbar 212cb881672c2c46142ec1bdfa401c9818ae805db0fDaniel Dunbar if (Arg *A = Args.getLastArg(options::OPT_print_libgcc_file_name)) { 213cb881672c2c46142ec1bdfa401c9818ae805db0fDaniel Dunbar llvm::outs() << GetProgramPath("libgcc.a").toString() << "\n"; 214cb881672c2c46142ec1bdfa401c9818ae805db0fDaniel Dunbar return false; 215cb881672c2c46142ec1bdfa401c9818ae805db0fDaniel Dunbar } 216cb881672c2c46142ec1bdfa401c9818ae805db0fDaniel Dunbar 217cb881672c2c46142ec1bdfa401c9818ae805db0fDaniel Dunbar return true; 218cb881672c2c46142ec1bdfa401c9818ae805db0fDaniel Dunbar} 219cb881672c2c46142ec1bdfa401c9818ae805db0fDaniel Dunbar 220d65bddcbe1385a4de212ecbbdc8919c54b3efeb0Daniel Dunbarvoid Driver::PrintActions(const ActionList &Actions) const { 22153ec55215075c8f4ddd47ca6ed7d382f16beb670Daniel Dunbar llvm::errs() << "FIXME: Print actions."; 22253ec55215075c8f4ddd47ca6ed7d382f16beb670Daniel Dunbar} 22353ec55215075c8f4ddd47ca6ed7d382f16beb670Daniel Dunbar 224d65bddcbe1385a4de212ecbbdc8919c54b3efeb0Daniel Dunbarvoid Driver::BuildUniversalActions(ArgList &Args, ActionList &Actions) { 2252fe63e6adac0b9e5f52bcc3100b545e379417e6eDaniel Dunbar llvm::StringMap<Arg *> Archs; 2262fe63e6adac0b9e5f52bcc3100b545e379417e6eDaniel Dunbar for (ArgList::const_iterator it = Args.begin(), ie = Args.end(); 2272fe63e6adac0b9e5f52bcc3100b545e379417e6eDaniel Dunbar it != ie; ++it) { 2282fe63e6adac0b9e5f52bcc3100b545e379417e6eDaniel Dunbar Arg *A = *it; 2292fe63e6adac0b9e5f52bcc3100b545e379417e6eDaniel Dunbar 2302fe63e6adac0b9e5f52bcc3100b545e379417e6eDaniel Dunbar if (A->getOption().getId() == options::OPT_arch) { 2312fe63e6adac0b9e5f52bcc3100b545e379417e6eDaniel Dunbar // FIXME: We need to handle canonicalization of the specified 2322fe63e6adac0b9e5f52bcc3100b545e379417e6eDaniel Dunbar // arch? 2332fe63e6adac0b9e5f52bcc3100b545e379417e6eDaniel Dunbar 2342fe63e6adac0b9e5f52bcc3100b545e379417e6eDaniel Dunbar Archs[A->getValue(Args)] = A; 2352fe63e6adac0b9e5f52bcc3100b545e379417e6eDaniel Dunbar } 2362fe63e6adac0b9e5f52bcc3100b545e379417e6eDaniel Dunbar } 2372fe63e6adac0b9e5f52bcc3100b545e379417e6eDaniel Dunbar 2382fe63e6adac0b9e5f52bcc3100b545e379417e6eDaniel Dunbar // When there is no explicit arch for this platform, get one from 2392fe63e6adac0b9e5f52bcc3100b545e379417e6eDaniel Dunbar // the host so that -Xarch_ is handled correctly. 2402fe63e6adac0b9e5f52bcc3100b545e379417e6eDaniel Dunbar if (!Archs.size()) { 2412fe63e6adac0b9e5f52bcc3100b545e379417e6eDaniel Dunbar const char *Arch = Host->getArchName().c_str(); 2422fe63e6adac0b9e5f52bcc3100b545e379417e6eDaniel Dunbar Archs[Arch] = Args.MakeSeparateArg(getOpts().getOption(options::OPT_arch), 2432fe63e6adac0b9e5f52bcc3100b545e379417e6eDaniel Dunbar Arch); 2442fe63e6adac0b9e5f52bcc3100b545e379417e6eDaniel Dunbar } 2452fe63e6adac0b9e5f52bcc3100b545e379417e6eDaniel Dunbar 2462fe63e6adac0b9e5f52bcc3100b545e379417e6eDaniel Dunbar // FIXME: We killed off some others but these aren't yet detected in 2472fe63e6adac0b9e5f52bcc3100b545e379417e6eDaniel Dunbar // a functional manner. If we added information to jobs about which 2482fe63e6adac0b9e5f52bcc3100b545e379417e6eDaniel Dunbar // "auxiliary" files they wrote then we could detect the conflict 2492fe63e6adac0b9e5f52bcc3100b545e379417e6eDaniel Dunbar // these cause downstream. 2502fe63e6adac0b9e5f52bcc3100b545e379417e6eDaniel Dunbar if (Archs.size() > 1) { 2512fe63e6adac0b9e5f52bcc3100b545e379417e6eDaniel Dunbar // No recovery needed, the point of this is just to prevent 2522fe63e6adac0b9e5f52bcc3100b545e379417e6eDaniel Dunbar // overwriting the same files. 2532fe63e6adac0b9e5f52bcc3100b545e379417e6eDaniel Dunbar if (const Arg *A = Args.getLastArg(options::OPT_M_Group)) 2542fe63e6adac0b9e5f52bcc3100b545e379417e6eDaniel Dunbar Diag(clang::diag::err_drv_invalid_opt_with_multiple_archs) 2552fe63e6adac0b9e5f52bcc3100b545e379417e6eDaniel Dunbar << A->getOption().getName(); 2562fe63e6adac0b9e5f52bcc3100b545e379417e6eDaniel Dunbar if (const Arg *A = Args.getLastArg(options::OPT_save_temps)) 2572fe63e6adac0b9e5f52bcc3100b545e379417e6eDaniel Dunbar Diag(clang::diag::err_drv_invalid_opt_with_multiple_archs) 2582fe63e6adac0b9e5f52bcc3100b545e379417e6eDaniel Dunbar << A->getOption().getName(); 2592fe63e6adac0b9e5f52bcc3100b545e379417e6eDaniel Dunbar } 2602fe63e6adac0b9e5f52bcc3100b545e379417e6eDaniel Dunbar 2612fe63e6adac0b9e5f52bcc3100b545e379417e6eDaniel Dunbar ActionList SingleActions; 2622fe63e6adac0b9e5f52bcc3100b545e379417e6eDaniel Dunbar BuildActions(Args, SingleActions); 2632fe63e6adac0b9e5f52bcc3100b545e379417e6eDaniel Dunbar 2642fe63e6adac0b9e5f52bcc3100b545e379417e6eDaniel Dunbar // Add in arch binding and lipo (if necessary) for every top level 2652fe63e6adac0b9e5f52bcc3100b545e379417e6eDaniel Dunbar // action. 2662fe63e6adac0b9e5f52bcc3100b545e379417e6eDaniel Dunbar for (unsigned i = 0, e = SingleActions.size(); i != e; ++i) { 2672fe63e6adac0b9e5f52bcc3100b545e379417e6eDaniel Dunbar Action *Act = SingleActions[i]; 2682fe63e6adac0b9e5f52bcc3100b545e379417e6eDaniel Dunbar 2692fe63e6adac0b9e5f52bcc3100b545e379417e6eDaniel Dunbar // Make sure we can lipo this kind of output. If not (and it is an 2702fe63e6adac0b9e5f52bcc3100b545e379417e6eDaniel Dunbar // actual output) then we disallow, since we can't create an 2712fe63e6adac0b9e5f52bcc3100b545e379417e6eDaniel Dunbar // output file with the right name without overwriting it. We 2722fe63e6adac0b9e5f52bcc3100b545e379417e6eDaniel Dunbar // could remove this oddity by just changing the output names to 2732fe63e6adac0b9e5f52bcc3100b545e379417e6eDaniel Dunbar // include the arch, which would also fix 2742fe63e6adac0b9e5f52bcc3100b545e379417e6eDaniel Dunbar // -save-temps. Compatibility wins for now. 2752fe63e6adac0b9e5f52bcc3100b545e379417e6eDaniel Dunbar 2762fe63e6adac0b9e5f52bcc3100b545e379417e6eDaniel Dunbar if (Archs.size() > 1 && types::canLipoType(Act->getType())) 2772fe63e6adac0b9e5f52bcc3100b545e379417e6eDaniel Dunbar Diag(clang::diag::err_drv_invalid_output_with_multiple_archs) 2782fe63e6adac0b9e5f52bcc3100b545e379417e6eDaniel Dunbar << types::getTypeName(Act->getType()); 2792fe63e6adac0b9e5f52bcc3100b545e379417e6eDaniel Dunbar 2802fe63e6adac0b9e5f52bcc3100b545e379417e6eDaniel Dunbar ActionList Inputs; 2812fe63e6adac0b9e5f52bcc3100b545e379417e6eDaniel Dunbar for (llvm::StringMap<Arg*>::iterator it = Archs.begin(), ie = Archs.end(); 2822fe63e6adac0b9e5f52bcc3100b545e379417e6eDaniel Dunbar it != ie; ++it) 2832fe63e6adac0b9e5f52bcc3100b545e379417e6eDaniel Dunbar Inputs.push_back(new BindArchAction(Act, it->second->getValue(Args))); 2842fe63e6adac0b9e5f52bcc3100b545e379417e6eDaniel Dunbar 2852fe63e6adac0b9e5f52bcc3100b545e379417e6eDaniel Dunbar // Lipo if necessary, We do it this way because we need to set the 2862fe63e6adac0b9e5f52bcc3100b545e379417e6eDaniel Dunbar // arch flag so that -Xarch_ gets overwritten. 2872fe63e6adac0b9e5f52bcc3100b545e379417e6eDaniel Dunbar if (Inputs.size() == 1 || Act->getType() == types::TY_Nothing) 2882fe63e6adac0b9e5f52bcc3100b545e379417e6eDaniel Dunbar Actions.append(Inputs.begin(), Inputs.end()); 2892fe63e6adac0b9e5f52bcc3100b545e379417e6eDaniel Dunbar else 2902fe63e6adac0b9e5f52bcc3100b545e379417e6eDaniel Dunbar Actions.push_back(new LipoJobAction(Inputs, Act->getType())); 2912fe63e6adac0b9e5f52bcc3100b545e379417e6eDaniel Dunbar } 29253ec55215075c8f4ddd47ca6ed7d382f16beb670Daniel Dunbar} 29353ec55215075c8f4ddd47ca6ed7d382f16beb670Daniel Dunbar 294d65bddcbe1385a4de212ecbbdc8919c54b3efeb0Daniel Dunbarvoid Driver::BuildActions(ArgList &Args, ActionList &Actions) { 29553ec55215075c8f4ddd47ca6ed7d382f16beb670Daniel Dunbar types::ID InputType = types::TY_INVALID; 29653ec55215075c8f4ddd47ca6ed7d382f16beb670Daniel Dunbar Arg *InputTypeArg = 0; 297af61c71137d1f7239d6b9d7425ce083db7ba31dfDaniel Dunbar 298af61c71137d1f7239d6b9d7425ce083db7ba31dfDaniel Dunbar // Start by constructing the list of inputs and their types. 299af61c71137d1f7239d6b9d7425ce083db7ba31dfDaniel Dunbar 30053ec55215075c8f4ddd47ca6ed7d382f16beb670Daniel Dunbar llvm::SmallVector<std::pair<types::ID, const Arg*>, 16> Inputs; 30153ec55215075c8f4ddd47ca6ed7d382f16beb670Daniel Dunbar for (ArgList::const_iterator it = Args.begin(), ie = Args.end(); 30253ec55215075c8f4ddd47ca6ed7d382f16beb670Daniel Dunbar it != ie; ++it) { 30353ec55215075c8f4ddd47ca6ed7d382f16beb670Daniel Dunbar Arg *A = *it; 30453ec55215075c8f4ddd47ca6ed7d382f16beb670Daniel Dunbar 30553ec55215075c8f4ddd47ca6ed7d382f16beb670Daniel Dunbar if (isa<InputOption>(A->getOption())) { 30653ec55215075c8f4ddd47ca6ed7d382f16beb670Daniel Dunbar const char *Value = A->getValue(Args); 30753ec55215075c8f4ddd47ca6ed7d382f16beb670Daniel Dunbar types::ID Ty = types::TY_INVALID; 30853ec55215075c8f4ddd47ca6ed7d382f16beb670Daniel Dunbar 30953ec55215075c8f4ddd47ca6ed7d382f16beb670Daniel Dunbar // Infer the input type if necessary. 3104ad4b3ebbe5769143389dccfcfadb666a4ba5940Daniel Dunbar if (InputType == types::TY_INVALID) { 31153ec55215075c8f4ddd47ca6ed7d382f16beb670Daniel Dunbar // stdin must be handled specially. 31253ec55215075c8f4ddd47ca6ed7d382f16beb670Daniel Dunbar if (memcmp(Value, "-", 2) == 0) { 31353ec55215075c8f4ddd47ca6ed7d382f16beb670Daniel Dunbar // If running with -E, treat as a C input (this changes the 31453ec55215075c8f4ddd47ca6ed7d382f16beb670Daniel Dunbar // builtin macros, for example). This may be overridden by 31553ec55215075c8f4ddd47ca6ed7d382f16beb670Daniel Dunbar // -ObjC below. 31653ec55215075c8f4ddd47ca6ed7d382f16beb670Daniel Dunbar // 31753ec55215075c8f4ddd47ca6ed7d382f16beb670Daniel Dunbar // Otherwise emit an error but still use a valid type to 31853ec55215075c8f4ddd47ca6ed7d382f16beb670Daniel Dunbar // avoid spurious errors (e.g., no inputs). 31953ec55215075c8f4ddd47ca6ed7d382f16beb670Daniel Dunbar if (!Args.hasArg(options::OPT_E)) 320b897f5d3ebfb62c2745e2e2af7faa9920c882438Daniel Dunbar Diag(clang::diag::err_drv_unknown_stdin_type); 32153ec55215075c8f4ddd47ca6ed7d382f16beb670Daniel Dunbar Ty = types::TY_C; 32253ec55215075c8f4ddd47ca6ed7d382f16beb670Daniel Dunbar } else { 32353ec55215075c8f4ddd47ca6ed7d382f16beb670Daniel Dunbar // Otherwise lookup by extension, and fallback to ObjectType 32453ec55215075c8f4ddd47ca6ed7d382f16beb670Daniel Dunbar // if not found. 32553ec55215075c8f4ddd47ca6ed7d382f16beb670Daniel Dunbar if (const char *Ext = strrchr(Value, '.')) 32653ec55215075c8f4ddd47ca6ed7d382f16beb670Daniel Dunbar Ty = types::lookupTypeForExtension(Ext + 1); 32753ec55215075c8f4ddd47ca6ed7d382f16beb670Daniel Dunbar if (Ty == types::TY_INVALID) 32853ec55215075c8f4ddd47ca6ed7d382f16beb670Daniel Dunbar Ty = types::TY_Object; 32953ec55215075c8f4ddd47ca6ed7d382f16beb670Daniel Dunbar } 33053ec55215075c8f4ddd47ca6ed7d382f16beb670Daniel Dunbar 33153ec55215075c8f4ddd47ca6ed7d382f16beb670Daniel Dunbar // -ObjC and -ObjC++ override the default language, but only 33253ec55215075c8f4ddd47ca6ed7d382f16beb670Daniel Dunbar // -for "source files". We just treat everything that isn't a 33353ec55215075c8f4ddd47ca6ed7d382f16beb670Daniel Dunbar // -linker input as a source file. 33453ec55215075c8f4ddd47ca6ed7d382f16beb670Daniel Dunbar // 33553ec55215075c8f4ddd47ca6ed7d382f16beb670Daniel Dunbar // FIXME: Clean this up if we move the phase sequence into the 33653ec55215075c8f4ddd47ca6ed7d382f16beb670Daniel Dunbar // type. 33753ec55215075c8f4ddd47ca6ed7d382f16beb670Daniel Dunbar if (Ty != types::TY_Object) { 33853ec55215075c8f4ddd47ca6ed7d382f16beb670Daniel Dunbar if (Args.hasArg(options::OPT_ObjC)) 33953ec55215075c8f4ddd47ca6ed7d382f16beb670Daniel Dunbar Ty = types::TY_ObjC; 34053ec55215075c8f4ddd47ca6ed7d382f16beb670Daniel Dunbar else if (Args.hasArg(options::OPT_ObjCXX)) 34153ec55215075c8f4ddd47ca6ed7d382f16beb670Daniel Dunbar Ty = types::TY_ObjCXX; 34253ec55215075c8f4ddd47ca6ed7d382f16beb670Daniel Dunbar } 34353ec55215075c8f4ddd47ca6ed7d382f16beb670Daniel Dunbar } else { 34453ec55215075c8f4ddd47ca6ed7d382f16beb670Daniel Dunbar assert(InputTypeArg && "InputType set w/o InputTypeArg"); 34553ec55215075c8f4ddd47ca6ed7d382f16beb670Daniel Dunbar InputTypeArg->claim(); 34653ec55215075c8f4ddd47ca6ed7d382f16beb670Daniel Dunbar Ty = InputType; 34753ec55215075c8f4ddd47ca6ed7d382f16beb670Daniel Dunbar } 34853ec55215075c8f4ddd47ca6ed7d382f16beb670Daniel Dunbar 34953ec55215075c8f4ddd47ca6ed7d382f16beb670Daniel Dunbar // Check that the file exists. It isn't clear this is worth 35053ec55215075c8f4ddd47ca6ed7d382f16beb670Daniel Dunbar // doing, since the tool presumably does this anyway, and this 35153ec55215075c8f4ddd47ca6ed7d382f16beb670Daniel Dunbar // just adds an extra stat to the equation, but this is gcc 35253ec55215075c8f4ddd47ca6ed7d382f16beb670Daniel Dunbar // compatible. 35353ec55215075c8f4ddd47ca6ed7d382f16beb670Daniel Dunbar if (memcmp(Value, "-", 2) != 0 && !llvm::sys::Path(Value).exists()) 354b897f5d3ebfb62c2745e2e2af7faa9920c882438Daniel Dunbar Diag(clang::diag::err_drv_no_such_file) << A->getValue(Args); 35553ec55215075c8f4ddd47ca6ed7d382f16beb670Daniel Dunbar else 35653ec55215075c8f4ddd47ca6ed7d382f16beb670Daniel Dunbar Inputs.push_back(std::make_pair(Ty, A)); 35753ec55215075c8f4ddd47ca6ed7d382f16beb670Daniel Dunbar 35853ec55215075c8f4ddd47ca6ed7d382f16beb670Daniel Dunbar } else if (A->getOption().isLinkerInput()) { 35953ec55215075c8f4ddd47ca6ed7d382f16beb670Daniel Dunbar // Just treat as object type, we could make a special type for 36053ec55215075c8f4ddd47ca6ed7d382f16beb670Daniel Dunbar // this if necessary. 36153ec55215075c8f4ddd47ca6ed7d382f16beb670Daniel Dunbar Inputs.push_back(std::make_pair(types::TY_Object, A)); 36253ec55215075c8f4ddd47ca6ed7d382f16beb670Daniel Dunbar 36353ec55215075c8f4ddd47ca6ed7d382f16beb670Daniel Dunbar } else if (A->getOption().getId() == options::OPT_x) { 36453ec55215075c8f4ddd47ca6ed7d382f16beb670Daniel Dunbar InputTypeArg = A; 36553ec55215075c8f4ddd47ca6ed7d382f16beb670Daniel Dunbar InputType = types::lookupTypeForTypeSpecifier(A->getValue(Args)); 36653ec55215075c8f4ddd47ca6ed7d382f16beb670Daniel Dunbar 36753ec55215075c8f4ddd47ca6ed7d382f16beb670Daniel Dunbar // Follow gcc behavior and treat as linker input for invalid -x 36853ec55215075c8f4ddd47ca6ed7d382f16beb670Daniel Dunbar // options. Its not clear why we shouldn't just revert to 36953ec55215075c8f4ddd47ca6ed7d382f16beb670Daniel Dunbar // unknown; but this isn't very important, we might as well be 37053ec55215075c8f4ddd47ca6ed7d382f16beb670Daniel Dunbar // bug comatible. 37153ec55215075c8f4ddd47ca6ed7d382f16beb670Daniel Dunbar if (!InputType) { 372b897f5d3ebfb62c2745e2e2af7faa9920c882438Daniel Dunbar Diag(clang::diag::err_drv_unknown_language) << A->getValue(Args); 37353ec55215075c8f4ddd47ca6ed7d382f16beb670Daniel Dunbar InputType = types::TY_Object; 37453ec55215075c8f4ddd47ca6ed7d382f16beb670Daniel Dunbar } 37553ec55215075c8f4ddd47ca6ed7d382f16beb670Daniel Dunbar } 37653ec55215075c8f4ddd47ca6ed7d382f16beb670Daniel Dunbar } 37753ec55215075c8f4ddd47ca6ed7d382f16beb670Daniel Dunbar 3788b1604ece7bf6dc2ba811cd7d8767557e55e2ec2Daniel Dunbar if (!SuppressMissingInputWarning && Inputs.empty()) { 379af61c71137d1f7239d6b9d7425ce083db7ba31dfDaniel Dunbar Diag(clang::diag::err_drv_no_input_files); 380af61c71137d1f7239d6b9d7425ce083db7ba31dfDaniel Dunbar return; 381af61c71137d1f7239d6b9d7425ce083db7ba31dfDaniel Dunbar } 382af61c71137d1f7239d6b9d7425ce083db7ba31dfDaniel Dunbar 383af61c71137d1f7239d6b9d7425ce083db7ba31dfDaniel Dunbar // Determine which compilation mode we are in. We look for options 384af61c71137d1f7239d6b9d7425ce083db7ba31dfDaniel Dunbar // which affect the phase, starting with the earliest phases, and 385af61c71137d1f7239d6b9d7425ce083db7ba31dfDaniel Dunbar // record which option we used to determine the final phase. 386af61c71137d1f7239d6b9d7425ce083db7ba31dfDaniel Dunbar Arg *FinalPhaseOpt = 0; 387af61c71137d1f7239d6b9d7425ce083db7ba31dfDaniel Dunbar PhaseOrder FinalPhase; 388af61c71137d1f7239d6b9d7425ce083db7ba31dfDaniel Dunbar 389af61c71137d1f7239d6b9d7425ce083db7ba31dfDaniel Dunbar // -{E,M,MM} only run the preprocessor. 390af61c71137d1f7239d6b9d7425ce083db7ba31dfDaniel Dunbar if ((FinalPhaseOpt = Args.getLastArg(options::OPT_E)) || 391af61c71137d1f7239d6b9d7425ce083db7ba31dfDaniel Dunbar (FinalPhaseOpt = Args.getLastArg(options::OPT_M)) || 392af61c71137d1f7239d6b9d7425ce083db7ba31dfDaniel Dunbar (FinalPhaseOpt = Args.getLastArg(options::OPT_MM))) { 393af61c71137d1f7239d6b9d7425ce083db7ba31dfDaniel Dunbar FinalPhase = PreprocessPhaseOrder; 394af61c71137d1f7239d6b9d7425ce083db7ba31dfDaniel Dunbar 395af61c71137d1f7239d6b9d7425ce083db7ba31dfDaniel Dunbar // -{-analyze,fsyntax-only,S} only run up to the compiler. 396af61c71137d1f7239d6b9d7425ce083db7ba31dfDaniel Dunbar } else if ((FinalPhaseOpt = Args.getLastArg(options::OPT__analyze)) || 397af61c71137d1f7239d6b9d7425ce083db7ba31dfDaniel Dunbar (FinalPhaseOpt = Args.getLastArg(options::OPT_fsyntax_only)) || 398af61c71137d1f7239d6b9d7425ce083db7ba31dfDaniel Dunbar (FinalPhaseOpt = Args.getLastArg(options::OPT_S))) { 399af61c71137d1f7239d6b9d7425ce083db7ba31dfDaniel Dunbar FinalPhase = CompilePhaseOrder; 400af61c71137d1f7239d6b9d7425ce083db7ba31dfDaniel Dunbar 401af61c71137d1f7239d6b9d7425ce083db7ba31dfDaniel Dunbar // -c only runs up to the assembler. 402af61c71137d1f7239d6b9d7425ce083db7ba31dfDaniel Dunbar } else if ((FinalPhaseOpt = Args.getLastArg(options::OPT_c))) { 403af61c71137d1f7239d6b9d7425ce083db7ba31dfDaniel Dunbar FinalPhase = AssemblePhaseOrder; 404af61c71137d1f7239d6b9d7425ce083db7ba31dfDaniel Dunbar 405af61c71137d1f7239d6b9d7425ce083db7ba31dfDaniel Dunbar // Otherwise do everything. 406af61c71137d1f7239d6b9d7425ce083db7ba31dfDaniel Dunbar } else 407af61c71137d1f7239d6b9d7425ce083db7ba31dfDaniel Dunbar FinalPhase = PostAssemblePhaseOrder; 408af61c71137d1f7239d6b9d7425ce083db7ba31dfDaniel Dunbar 409af61c71137d1f7239d6b9d7425ce083db7ba31dfDaniel Dunbar if (FinalPhaseOpt) 410af61c71137d1f7239d6b9d7425ce083db7ba31dfDaniel Dunbar FinalPhaseOpt->claim(); 411af61c71137d1f7239d6b9d7425ce083db7ba31dfDaniel Dunbar 412af61c71137d1f7239d6b9d7425ce083db7ba31dfDaniel Dunbar // Reject -Z* at the top level, these options should never have been 413af61c71137d1f7239d6b9d7425ce083db7ba31dfDaniel Dunbar // exposed by gcc. 414af61c71137d1f7239d6b9d7425ce083db7ba31dfDaniel Dunbar if (Arg *A = Args.getLastArg(options::OPT_Z)) 415af61c71137d1f7239d6b9d7425ce083db7ba31dfDaniel Dunbar Diag(clang::diag::err_drv_use_of_Z_option) << A->getValue(Args); 416af61c71137d1f7239d6b9d7425ce083db7ba31dfDaniel Dunbar 417af61c71137d1f7239d6b9d7425ce083db7ba31dfDaniel Dunbar // FIXME: This is just debugging code. 41853ec55215075c8f4ddd47ca6ed7d382f16beb670Daniel Dunbar for (unsigned i = 0, e = Inputs.size(); i != e; ++i) { 41953ec55215075c8f4ddd47ca6ed7d382f16beb670Daniel Dunbar llvm::errs() << "input " << i << ": " 42053ec55215075c8f4ddd47ca6ed7d382f16beb670Daniel Dunbar << Inputs[i].second->getValue(Args) << "\n"; 42153ec55215075c8f4ddd47ca6ed7d382f16beb670Daniel Dunbar } 42253ec55215075c8f4ddd47ca6ed7d382f16beb670Daniel Dunbar exit(0); 42353ec55215075c8f4ddd47ca6ed7d382f16beb670Daniel Dunbar} 42453ec55215075c8f4ddd47ca6ed7d382f16beb670Daniel Dunbar 425cb881672c2c46142ec1bdfa401c9818ae805db0fDaniel Dunbarllvm::sys::Path Driver::GetFilePath(const char *Name) const { 426cb881672c2c46142ec1bdfa401c9818ae805db0fDaniel Dunbar // FIXME: Implement. 427cb881672c2c46142ec1bdfa401c9818ae805db0fDaniel Dunbar return llvm::sys::Path(Name); 428cb881672c2c46142ec1bdfa401c9818ae805db0fDaniel Dunbar} 429cb881672c2c46142ec1bdfa401c9818ae805db0fDaniel Dunbar 430cb881672c2c46142ec1bdfa401c9818ae805db0fDaniel Dunbarllvm::sys::Path Driver::GetProgramPath(const char *Name) const { 431cb881672c2c46142ec1bdfa401c9818ae805db0fDaniel Dunbar // FIXME: Implement. 432cb881672c2c46142ec1bdfa401c9818ae805db0fDaniel Dunbar return llvm::sys::Path(Name); 433cb881672c2c46142ec1bdfa401c9818ae805db0fDaniel Dunbar} 434cb881672c2c46142ec1bdfa401c9818ae805db0fDaniel Dunbar 435dd98e2cad165ca73c769e4f105a4e47c2216387aDaniel DunbarHostInfo *Driver::GetHostInfo(const char *Triple) { 436dd98e2cad165ca73c769e4f105a4e47c2216387aDaniel Dunbar // Dice into arch, platform, and OS. This matches 437dd98e2cad165ca73c769e4f105a4e47c2216387aDaniel Dunbar // arch,platform,os = '(.*?)-(.*?)-(.*?)' 438dd98e2cad165ca73c769e4f105a4e47c2216387aDaniel Dunbar // and missing fields are left empty. 439dd98e2cad165ca73c769e4f105a4e47c2216387aDaniel Dunbar std::string Arch, Platform, OS; 440dd98e2cad165ca73c769e4f105a4e47c2216387aDaniel Dunbar 441dd98e2cad165ca73c769e4f105a4e47c2216387aDaniel Dunbar if (const char *ArchEnd = strchr(Triple, '-')) { 442dd98e2cad165ca73c769e4f105a4e47c2216387aDaniel Dunbar Arch = std::string(Triple, ArchEnd); 443dd98e2cad165ca73c769e4f105a4e47c2216387aDaniel Dunbar 444dd98e2cad165ca73c769e4f105a4e47c2216387aDaniel Dunbar if (const char *PlatformEnd = strchr(ArchEnd+1, '-')) { 445dd98e2cad165ca73c769e4f105a4e47c2216387aDaniel Dunbar Platform = std::string(ArchEnd+1, PlatformEnd); 446dd98e2cad165ca73c769e4f105a4e47c2216387aDaniel Dunbar OS = PlatformEnd+1; 447dd98e2cad165ca73c769e4f105a4e47c2216387aDaniel Dunbar } else 448dd98e2cad165ca73c769e4f105a4e47c2216387aDaniel Dunbar Platform = ArchEnd+1; 449dd98e2cad165ca73c769e4f105a4e47c2216387aDaniel Dunbar } else 450dd98e2cad165ca73c769e4f105a4e47c2216387aDaniel Dunbar Arch = Triple; 451dd98e2cad165ca73c769e4f105a4e47c2216387aDaniel Dunbar 452dd98e2cad165ca73c769e4f105a4e47c2216387aDaniel Dunbar if (memcmp(&Platform[0], "darwin", 6) == 0) 453dd98e2cad165ca73c769e4f105a4e47c2216387aDaniel Dunbar return new DarwinHostInfo(Arch.c_str(), Platform.c_str(), OS.c_str()); 454dd98e2cad165ca73c769e4f105a4e47c2216387aDaniel Dunbar 455dd98e2cad165ca73c769e4f105a4e47c2216387aDaniel Dunbar return new UnknownHostInfo(Arch.c_str(), Platform.c_str(), OS.c_str()); 456dd98e2cad165ca73c769e4f105a4e47c2216387aDaniel Dunbar} 457