Driver.cpp revision 4ad4b3ebbe5769143389dccfcfadb666a4ba5940
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 220648262df75d97b464c2be0ed867da3615659785Daniel Dunbar#include "llvm/Support/raw_ostream.h" 2353ec55215075c8f4ddd47ca6ed7d382f16beb670Daniel Dunbar#include "llvm/System/Path.h" 241b3bb6efc59a21f794b534078f9ae7e95393f510Daniel Dunbarusing namespace clang::driver; 251b3bb6efc59a21f794b534078f9ae7e95393f510Daniel Dunbar 26dd98e2cad165ca73c769e4f105a4e47c2216387aDaniel DunbarDriver::Driver(const char *_Name, const char *_Dir, 274ad4b3ebbe5769143389dccfcfadb666a4ba5940Daniel Dunbar const char *_DefaultHostTriple, 284ad4b3ebbe5769143389dccfcfadb666a4ba5940Daniel Dunbar Diagnostic &_Diags) 294ad4b3ebbe5769143389dccfcfadb666a4ba5940Daniel Dunbar : Opts(new OptTable()), Diags(_Diags), 30dd98e2cad165ca73c769e4f105a4e47c2216387aDaniel Dunbar Name(_Name), Dir(_Dir), DefaultHostTriple(_DefaultHostTriple), 31dd98e2cad165ca73c769e4f105a4e47c2216387aDaniel Dunbar Host(0), 32365c02f65be026f90e67a8e00e7b827cee60e228Daniel Dunbar CCCIsCXX(false), CCCEcho(false), 33365c02f65be026f90e67a8e00e7b827cee60e228Daniel Dunbar CCCNoClang(false), CCCNoClangCXX(false), CCCNoClangCPP(false) 34365c02f65be026f90e67a8e00e7b827cee60e228Daniel Dunbar{ 351b3bb6efc59a21f794b534078f9ae7e95393f510Daniel Dunbar 363ede8d0a7d1813f678ccc6011a99a0834b1b6116Daniel Dunbar} 373ede8d0a7d1813f678ccc6011a99a0834b1b6116Daniel Dunbar 383ede8d0a7d1813f678ccc6011a99a0834b1b6116Daniel DunbarDriver::~Driver() { 391b3bb6efc59a21f794b534078f9ae7e95393f510Daniel Dunbar delete Opts; 403ede8d0a7d1813f678ccc6011a99a0834b1b6116Daniel Dunbar} 413ede8d0a7d1813f678ccc6011a99a0834b1b6116Daniel Dunbar 420648262df75d97b464c2be0ed867da3615659785Daniel DunbarArgList *Driver::ParseArgStrings(const char **ArgBegin, const char **ArgEnd) { 430648262df75d97b464c2be0ed867da3615659785Daniel Dunbar ArgList *Args = new ArgList(ArgBegin, ArgEnd); 440648262df75d97b464c2be0ed867da3615659785Daniel Dunbar 450648262df75d97b464c2be0ed867da3615659785Daniel Dunbar unsigned Index = 0, End = ArgEnd - ArgBegin; 460648262df75d97b464c2be0ed867da3615659785Daniel Dunbar while (Index < End) { 470648262df75d97b464c2be0ed867da3615659785Daniel Dunbar unsigned Prev = Index; 480648262df75d97b464c2be0ed867da3615659785Daniel Dunbar Arg *A = getOpts().ParseOneArg(*Args, Index, End); 4953ec55215075c8f4ddd47ca6ed7d382f16beb670Daniel Dunbar if (A) { 5053ec55215075c8f4ddd47ca6ed7d382f16beb670Daniel Dunbar if (A->getOption().isUnsupported()) { 514ad4b3ebbe5769143389dccfcfadb666a4ba5940Daniel Dunbar Diag(clang::diag::driver_unsupported_opt) << A->getOption().getName(); 5253ec55215075c8f4ddd47ca6ed7d382f16beb670Daniel Dunbar continue; 5353ec55215075c8f4ddd47ca6ed7d382f16beb670Daniel Dunbar } 5453ec55215075c8f4ddd47ca6ed7d382f16beb670Daniel Dunbar 550648262df75d97b464c2be0ed867da3615659785Daniel Dunbar Args->append(A); 5653ec55215075c8f4ddd47ca6ed7d382f16beb670Daniel Dunbar } 570648262df75d97b464c2be0ed867da3615659785Daniel Dunbar 580648262df75d97b464c2be0ed867da3615659785Daniel Dunbar assert(Index > Prev && "Parser failed to consume argument."); 590648262df75d97b464c2be0ed867da3615659785Daniel Dunbar } 600648262df75d97b464c2be0ed867da3615659785Daniel Dunbar 610648262df75d97b464c2be0ed867da3615659785Daniel Dunbar return Args; 620648262df75d97b464c2be0ed867da3615659785Daniel Dunbar} 630648262df75d97b464c2be0ed867da3615659785Daniel Dunbar 643ede8d0a7d1813f678ccc6011a99a0834b1b6116Daniel DunbarCompilation *Driver::BuildCompilation(int argc, const char **argv) { 65365c02f65be026f90e67a8e00e7b827cee60e228Daniel Dunbar // FIXME: This stuff needs to go into the Compilation, not the 66365c02f65be026f90e67a8e00e7b827cee60e228Daniel Dunbar // driver. 6753ec55215075c8f4ddd47ca6ed7d382f16beb670Daniel Dunbar bool CCCPrintOptions = false, CCCPrintActions = false; 680648262df75d97b464c2be0ed867da3615659785Daniel Dunbar 69365c02f65be026f90e67a8e00e7b827cee60e228Daniel Dunbar const char **Start = argv + 1, **End = argv + argc; 70dd98e2cad165ca73c769e4f105a4e47c2216387aDaniel Dunbar const char *HostTriple = DefaultHostTriple.c_str(); 71365c02f65be026f90e67a8e00e7b827cee60e228Daniel Dunbar 72365c02f65be026f90e67a8e00e7b827cee60e228Daniel Dunbar // Read -ccc args. 73365c02f65be026f90e67a8e00e7b827cee60e228Daniel Dunbar // 74365c02f65be026f90e67a8e00e7b827cee60e228Daniel Dunbar // FIXME: We need to figure out where this behavior should 75365c02f65be026f90e67a8e00e7b827cee60e228Daniel Dunbar // live. Most of it should be outside in the client; the parts that 76365c02f65be026f90e67a8e00e7b827cee60e228Daniel Dunbar // aren't should have proper options, either by introducing new ones 77365c02f65be026f90e67a8e00e7b827cee60e228Daniel Dunbar // or by overloading gcc ones like -V or -b. 78365c02f65be026f90e67a8e00e7b827cee60e228Daniel Dunbar for (; Start != End && memcmp(*Start, "-ccc-", 5) == 0; ++Start) { 79365c02f65be026f90e67a8e00e7b827cee60e228Daniel Dunbar const char *Opt = *Start + 5; 80365c02f65be026f90e67a8e00e7b827cee60e228Daniel Dunbar 81365c02f65be026f90e67a8e00e7b827cee60e228Daniel Dunbar if (!strcmp(Opt, "print-options")) { 82365c02f65be026f90e67a8e00e7b827cee60e228Daniel Dunbar CCCPrintOptions = true; 83365c02f65be026f90e67a8e00e7b827cee60e228Daniel Dunbar } else if (!strcmp(Opt, "print-phases")) { 8453ec55215075c8f4ddd47ca6ed7d382f16beb670Daniel Dunbar CCCPrintActions = true; 85365c02f65be026f90e67a8e00e7b827cee60e228Daniel Dunbar } else if (!strcmp(Opt, "cxx")) { 86365c02f65be026f90e67a8e00e7b827cee60e228Daniel Dunbar CCCIsCXX = true; 87365c02f65be026f90e67a8e00e7b827cee60e228Daniel Dunbar } else if (!strcmp(Opt, "echo")) { 88365c02f65be026f90e67a8e00e7b827cee60e228Daniel Dunbar CCCEcho = true; 89365c02f65be026f90e67a8e00e7b827cee60e228Daniel Dunbar 90365c02f65be026f90e67a8e00e7b827cee60e228Daniel Dunbar } else if (!strcmp(Opt, "no-clang")) { 91365c02f65be026f90e67a8e00e7b827cee60e228Daniel Dunbar CCCNoClang = true; 92365c02f65be026f90e67a8e00e7b827cee60e228Daniel Dunbar } else if (!strcmp(Opt, "no-clang-cxx")) { 93365c02f65be026f90e67a8e00e7b827cee60e228Daniel Dunbar CCCNoClangCXX = true; 94365c02f65be026f90e67a8e00e7b827cee60e228Daniel Dunbar } else if (!strcmp(Opt, "no-clang-cpp")) { 95365c02f65be026f90e67a8e00e7b827cee60e228Daniel Dunbar CCCNoClangCPP = true; 96365c02f65be026f90e67a8e00e7b827cee60e228Daniel Dunbar } else if (!strcmp(Opt, "clang-archs")) { 97365c02f65be026f90e67a8e00e7b827cee60e228Daniel Dunbar assert(Start+1 < End && "FIXME: -ccc- argument handling."); 98365c02f65be026f90e67a8e00e7b827cee60e228Daniel Dunbar const char *Cur = *++Start; 99365c02f65be026f90e67a8e00e7b827cee60e228Daniel Dunbar 100365c02f65be026f90e67a8e00e7b827cee60e228Daniel Dunbar for (;;) { 101365c02f65be026f90e67a8e00e7b827cee60e228Daniel Dunbar const char *Next = strchr(Cur, ','); 102365c02f65be026f90e67a8e00e7b827cee60e228Daniel Dunbar 103365c02f65be026f90e67a8e00e7b827cee60e228Daniel Dunbar if (Next) { 104365c02f65be026f90e67a8e00e7b827cee60e228Daniel Dunbar CCCClangArchs.insert(std::string(Cur, Next)); 105365c02f65be026f90e67a8e00e7b827cee60e228Daniel Dunbar Cur = Next + 1; 106365c02f65be026f90e67a8e00e7b827cee60e228Daniel Dunbar } else { 107365c02f65be026f90e67a8e00e7b827cee60e228Daniel Dunbar CCCClangArchs.insert(std::string(Cur)); 108365c02f65be026f90e67a8e00e7b827cee60e228Daniel Dunbar break; 109365c02f65be026f90e67a8e00e7b827cee60e228Daniel Dunbar } 110365c02f65be026f90e67a8e00e7b827cee60e228Daniel Dunbar } 111365c02f65be026f90e67a8e00e7b827cee60e228Daniel Dunbar 112dd98e2cad165ca73c769e4f105a4e47c2216387aDaniel Dunbar } else if (!strcmp(Opt, "host-triple")) { 113365c02f65be026f90e67a8e00e7b827cee60e228Daniel Dunbar assert(Start+1 < End && "FIXME: -ccc- argument handling."); 114dd98e2cad165ca73c769e4f105a4e47c2216387aDaniel Dunbar HostTriple = *++Start; 115365c02f65be026f90e67a8e00e7b827cee60e228Daniel Dunbar 116365c02f65be026f90e67a8e00e7b827cee60e228Daniel Dunbar } else { 117365c02f65be026f90e67a8e00e7b827cee60e228Daniel Dunbar // FIXME: Error handling. 118365c02f65be026f90e67a8e00e7b827cee60e228Daniel Dunbar llvm::errs() << "invalid option: " << *Start << "\n"; 119365c02f65be026f90e67a8e00e7b827cee60e228Daniel Dunbar exit(1); 120365c02f65be026f90e67a8e00e7b827cee60e228Daniel Dunbar } 121365c02f65be026f90e67a8e00e7b827cee60e228Daniel Dunbar } 122dd98e2cad165ca73c769e4f105a4e47c2216387aDaniel Dunbar 123dd98e2cad165ca73c769e4f105a4e47c2216387aDaniel Dunbar Host = Driver::GetHostInfo(HostTriple); 124dd98e2cad165ca73c769e4f105a4e47c2216387aDaniel Dunbar 125365c02f65be026f90e67a8e00e7b827cee60e228Daniel Dunbar ArgList *Args = ParseArgStrings(Start, End); 126365c02f65be026f90e67a8e00e7b827cee60e228Daniel Dunbar 127365c02f65be026f90e67a8e00e7b827cee60e228Daniel Dunbar // FIXME: This behavior shouldn't be here. 128365c02f65be026f90e67a8e00e7b827cee60e228Daniel Dunbar if (CCCPrintOptions) { 12953ec55215075c8f4ddd47ca6ed7d382f16beb670Daniel Dunbar PrintOptions(*Args); 130365c02f65be026f90e67a8e00e7b827cee60e228Daniel Dunbar exit(0); 131365c02f65be026f90e67a8e00e7b827cee60e228Daniel Dunbar } 13253ec55215075c8f4ddd47ca6ed7d382f16beb670Daniel Dunbar 13353ec55215075c8f4ddd47ca6ed7d382f16beb670Daniel Dunbar // Construct the list of abstract actions to perform for this 13453ec55215075c8f4ddd47ca6ed7d382f16beb670Daniel Dunbar // compilation. 13553ec55215075c8f4ddd47ca6ed7d382f16beb670Daniel Dunbar llvm::SmallVector<Action*, 2> Actions; 13653ec55215075c8f4ddd47ca6ed7d382f16beb670Daniel Dunbar if (Host->useDriverDriver()) 13753ec55215075c8f4ddd47ca6ed7d382f16beb670Daniel Dunbar BuildUniversalActions(*Args, Actions); 13853ec55215075c8f4ddd47ca6ed7d382f16beb670Daniel Dunbar else 13953ec55215075c8f4ddd47ca6ed7d382f16beb670Daniel Dunbar BuildActions(*Args, Actions); 14053ec55215075c8f4ddd47ca6ed7d382f16beb670Daniel Dunbar 14153ec55215075c8f4ddd47ca6ed7d382f16beb670Daniel Dunbar // FIXME: This behavior shouldn't be here. 14253ec55215075c8f4ddd47ca6ed7d382f16beb670Daniel Dunbar if (CCCPrintActions) { 14353ec55215075c8f4ddd47ca6ed7d382f16beb670Daniel Dunbar PrintActions(Actions); 14453ec55215075c8f4ddd47ca6ed7d382f16beb670Daniel Dunbar exit(0); 14553ec55215075c8f4ddd47ca6ed7d382f16beb670Daniel Dunbar } 14653ec55215075c8f4ddd47ca6ed7d382f16beb670Daniel Dunbar 147365c02f65be026f90e67a8e00e7b827cee60e228Daniel Dunbar assert(0 && "FIXME: Implement"); 148365c02f65be026f90e67a8e00e7b827cee60e228Daniel Dunbar 149365c02f65be026f90e67a8e00e7b827cee60e228Daniel Dunbar return new Compilation(); 150365c02f65be026f90e67a8e00e7b827cee60e228Daniel Dunbar} 151365c02f65be026f90e67a8e00e7b827cee60e228Daniel Dunbar 15253ec55215075c8f4ddd47ca6ed7d382f16beb670Daniel Dunbarvoid Driver::PrintOptions(const ArgList &Args) { 1530648262df75d97b464c2be0ed867da3615659785Daniel Dunbar unsigned i = 0; 15453ec55215075c8f4ddd47ca6ed7d382f16beb670Daniel Dunbar for (ArgList::const_iterator it = Args.begin(), ie = Args.end(); 1550648262df75d97b464c2be0ed867da3615659785Daniel Dunbar it != ie; ++it, ++i) { 1560648262df75d97b464c2be0ed867da3615659785Daniel Dunbar Arg *A = *it; 1570648262df75d97b464c2be0ed867da3615659785Daniel Dunbar llvm::errs() << "Option " << i << " - " 1580648262df75d97b464c2be0ed867da3615659785Daniel Dunbar << "Name: \"" << A->getOption().getName() << "\", " 1590648262df75d97b464c2be0ed867da3615659785Daniel Dunbar << "Values: {"; 1600648262df75d97b464c2be0ed867da3615659785Daniel Dunbar for (unsigned j = 0; j < A->getNumValues(); ++j) { 1610648262df75d97b464c2be0ed867da3615659785Daniel Dunbar if (j) 1620648262df75d97b464c2be0ed867da3615659785Daniel Dunbar llvm::errs() << ", "; 16353ec55215075c8f4ddd47ca6ed7d382f16beb670Daniel Dunbar llvm::errs() << '"' << A->getValue(Args, j) << '"'; 1640648262df75d97b464c2be0ed867da3615659785Daniel Dunbar } 1650648262df75d97b464c2be0ed867da3615659785Daniel Dunbar llvm::errs() << "}\n"; 1660648262df75d97b464c2be0ed867da3615659785Daniel Dunbar } 1673ede8d0a7d1813f678ccc6011a99a0834b1b6116Daniel Dunbar} 168dd98e2cad165ca73c769e4f105a4e47c2216387aDaniel Dunbar 16953ec55215075c8f4ddd47ca6ed7d382f16beb670Daniel Dunbarvoid Driver::PrintActions(const llvm::SmallVector<Action*, 2> &Actions) { 17053ec55215075c8f4ddd47ca6ed7d382f16beb670Daniel Dunbar llvm::errs() << "FIXME: Print actions."; 17153ec55215075c8f4ddd47ca6ed7d382f16beb670Daniel Dunbar} 17253ec55215075c8f4ddd47ca6ed7d382f16beb670Daniel Dunbar 17353ec55215075c8f4ddd47ca6ed7d382f16beb670Daniel Dunbarvoid Driver::BuildUniversalActions(const ArgList &Args, 17453ec55215075c8f4ddd47ca6ed7d382f16beb670Daniel Dunbar llvm::SmallVector<Action*, 2> &Actions) { 17553ec55215075c8f4ddd47ca6ed7d382f16beb670Daniel Dunbar // FIXME: Implement 17653ec55215075c8f4ddd47ca6ed7d382f16beb670Daniel Dunbar BuildActions(Args, Actions); 17753ec55215075c8f4ddd47ca6ed7d382f16beb670Daniel Dunbar} 17853ec55215075c8f4ddd47ca6ed7d382f16beb670Daniel Dunbar 17953ec55215075c8f4ddd47ca6ed7d382f16beb670Daniel Dunbarvoid Driver::BuildActions(const ArgList &Args, 18053ec55215075c8f4ddd47ca6ed7d382f16beb670Daniel Dunbar llvm::SmallVector<Action*, 2> &Actions) { 18153ec55215075c8f4ddd47ca6ed7d382f16beb670Daniel Dunbar types::ID InputType = types::TY_INVALID; 18253ec55215075c8f4ddd47ca6ed7d382f16beb670Daniel Dunbar Arg *InputTypeArg = 0; 18353ec55215075c8f4ddd47ca6ed7d382f16beb670Daniel Dunbar 18453ec55215075c8f4ddd47ca6ed7d382f16beb670Daniel Dunbar llvm::SmallVector<std::pair<types::ID, const Arg*>, 16> Inputs; 18553ec55215075c8f4ddd47ca6ed7d382f16beb670Daniel Dunbar for (ArgList::const_iterator it = Args.begin(), ie = Args.end(); 18653ec55215075c8f4ddd47ca6ed7d382f16beb670Daniel Dunbar it != ie; ++it) { 18753ec55215075c8f4ddd47ca6ed7d382f16beb670Daniel Dunbar Arg *A = *it; 18853ec55215075c8f4ddd47ca6ed7d382f16beb670Daniel Dunbar 18953ec55215075c8f4ddd47ca6ed7d382f16beb670Daniel Dunbar if (isa<InputOption>(A->getOption())) { 19053ec55215075c8f4ddd47ca6ed7d382f16beb670Daniel Dunbar const char *Value = A->getValue(Args); 19153ec55215075c8f4ddd47ca6ed7d382f16beb670Daniel Dunbar types::ID Ty = types::TY_INVALID; 19253ec55215075c8f4ddd47ca6ed7d382f16beb670Daniel Dunbar 19353ec55215075c8f4ddd47ca6ed7d382f16beb670Daniel Dunbar // Infer the input type if necessary. 1944ad4b3ebbe5769143389dccfcfadb666a4ba5940Daniel Dunbar if (InputType == types::TY_INVALID) { 19553ec55215075c8f4ddd47ca6ed7d382f16beb670Daniel Dunbar // stdin must be handled specially. 19653ec55215075c8f4ddd47ca6ed7d382f16beb670Daniel Dunbar if (memcmp(Value, "-", 2) == 0) { 19753ec55215075c8f4ddd47ca6ed7d382f16beb670Daniel Dunbar // If running with -E, treat as a C input (this changes the 19853ec55215075c8f4ddd47ca6ed7d382f16beb670Daniel Dunbar // builtin macros, for example). This may be overridden by 19953ec55215075c8f4ddd47ca6ed7d382f16beb670Daniel Dunbar // -ObjC below. 20053ec55215075c8f4ddd47ca6ed7d382f16beb670Daniel Dunbar // 20153ec55215075c8f4ddd47ca6ed7d382f16beb670Daniel Dunbar // Otherwise emit an error but still use a valid type to 20253ec55215075c8f4ddd47ca6ed7d382f16beb670Daniel Dunbar // avoid spurious errors (e.g., no inputs). 20353ec55215075c8f4ddd47ca6ed7d382f16beb670Daniel Dunbar if (!Args.hasArg(options::OPT_E)) 2044ad4b3ebbe5769143389dccfcfadb666a4ba5940Daniel Dunbar Diag(clang::diag::driver_unknown_stdin_type); 20553ec55215075c8f4ddd47ca6ed7d382f16beb670Daniel Dunbar Ty = types::TY_C; 20653ec55215075c8f4ddd47ca6ed7d382f16beb670Daniel Dunbar } else { 20753ec55215075c8f4ddd47ca6ed7d382f16beb670Daniel Dunbar // Otherwise lookup by extension, and fallback to ObjectType 20853ec55215075c8f4ddd47ca6ed7d382f16beb670Daniel Dunbar // if not found. 20953ec55215075c8f4ddd47ca6ed7d382f16beb670Daniel Dunbar if (const char *Ext = strrchr(Value, '.')) 21053ec55215075c8f4ddd47ca6ed7d382f16beb670Daniel Dunbar Ty = types::lookupTypeForExtension(Ext + 1); 21153ec55215075c8f4ddd47ca6ed7d382f16beb670Daniel Dunbar if (Ty == types::TY_INVALID) 21253ec55215075c8f4ddd47ca6ed7d382f16beb670Daniel Dunbar Ty = types::TY_Object; 21353ec55215075c8f4ddd47ca6ed7d382f16beb670Daniel Dunbar } 21453ec55215075c8f4ddd47ca6ed7d382f16beb670Daniel Dunbar 21553ec55215075c8f4ddd47ca6ed7d382f16beb670Daniel Dunbar // -ObjC and -ObjC++ override the default language, but only 21653ec55215075c8f4ddd47ca6ed7d382f16beb670Daniel Dunbar // -for "source files". We just treat everything that isn't a 21753ec55215075c8f4ddd47ca6ed7d382f16beb670Daniel Dunbar // -linker input as a source file. 21853ec55215075c8f4ddd47ca6ed7d382f16beb670Daniel Dunbar // 21953ec55215075c8f4ddd47ca6ed7d382f16beb670Daniel Dunbar // FIXME: Clean this up if we move the phase sequence into the 22053ec55215075c8f4ddd47ca6ed7d382f16beb670Daniel Dunbar // type. 22153ec55215075c8f4ddd47ca6ed7d382f16beb670Daniel Dunbar if (Ty != types::TY_Object) { 22253ec55215075c8f4ddd47ca6ed7d382f16beb670Daniel Dunbar if (Args.hasArg(options::OPT_ObjC)) 22353ec55215075c8f4ddd47ca6ed7d382f16beb670Daniel Dunbar Ty = types::TY_ObjC; 22453ec55215075c8f4ddd47ca6ed7d382f16beb670Daniel Dunbar else if (Args.hasArg(options::OPT_ObjCXX)) 22553ec55215075c8f4ddd47ca6ed7d382f16beb670Daniel Dunbar Ty = types::TY_ObjCXX; 22653ec55215075c8f4ddd47ca6ed7d382f16beb670Daniel Dunbar } 22753ec55215075c8f4ddd47ca6ed7d382f16beb670Daniel Dunbar } else { 22853ec55215075c8f4ddd47ca6ed7d382f16beb670Daniel Dunbar assert(InputTypeArg && "InputType set w/o InputTypeArg"); 22953ec55215075c8f4ddd47ca6ed7d382f16beb670Daniel Dunbar InputTypeArg->claim(); 23053ec55215075c8f4ddd47ca6ed7d382f16beb670Daniel Dunbar Ty = InputType; 23153ec55215075c8f4ddd47ca6ed7d382f16beb670Daniel Dunbar } 23253ec55215075c8f4ddd47ca6ed7d382f16beb670Daniel Dunbar 23353ec55215075c8f4ddd47ca6ed7d382f16beb670Daniel Dunbar // Check that the file exists. It isn't clear this is worth 23453ec55215075c8f4ddd47ca6ed7d382f16beb670Daniel Dunbar // doing, since the tool presumably does this anyway, and this 23553ec55215075c8f4ddd47ca6ed7d382f16beb670Daniel Dunbar // just adds an extra stat to the equation, but this is gcc 23653ec55215075c8f4ddd47ca6ed7d382f16beb670Daniel Dunbar // compatible. 23753ec55215075c8f4ddd47ca6ed7d382f16beb670Daniel Dunbar if (memcmp(Value, "-", 2) != 0 && !llvm::sys::Path(Value).exists()) 2384ad4b3ebbe5769143389dccfcfadb666a4ba5940Daniel Dunbar Diag(clang::diag::driver_no_such_file) << A->getValue(Args); 23953ec55215075c8f4ddd47ca6ed7d382f16beb670Daniel Dunbar else 24053ec55215075c8f4ddd47ca6ed7d382f16beb670Daniel Dunbar Inputs.push_back(std::make_pair(Ty, A)); 24153ec55215075c8f4ddd47ca6ed7d382f16beb670Daniel Dunbar 24253ec55215075c8f4ddd47ca6ed7d382f16beb670Daniel Dunbar } else if (A->getOption().isLinkerInput()) { 24353ec55215075c8f4ddd47ca6ed7d382f16beb670Daniel Dunbar // Just treat as object type, we could make a special type for 24453ec55215075c8f4ddd47ca6ed7d382f16beb670Daniel Dunbar // this if necessary. 24553ec55215075c8f4ddd47ca6ed7d382f16beb670Daniel Dunbar Inputs.push_back(std::make_pair(types::TY_Object, A)); 24653ec55215075c8f4ddd47ca6ed7d382f16beb670Daniel Dunbar 24753ec55215075c8f4ddd47ca6ed7d382f16beb670Daniel Dunbar } else if (A->getOption().getId() == options::OPT_x) { 24853ec55215075c8f4ddd47ca6ed7d382f16beb670Daniel Dunbar InputTypeArg = A; 24953ec55215075c8f4ddd47ca6ed7d382f16beb670Daniel Dunbar InputType = types::lookupTypeForTypeSpecifier(A->getValue(Args)); 25053ec55215075c8f4ddd47ca6ed7d382f16beb670Daniel Dunbar 25153ec55215075c8f4ddd47ca6ed7d382f16beb670Daniel Dunbar // Follow gcc behavior and treat as linker input for invalid -x 25253ec55215075c8f4ddd47ca6ed7d382f16beb670Daniel Dunbar // options. Its not clear why we shouldn't just revert to 25353ec55215075c8f4ddd47ca6ed7d382f16beb670Daniel Dunbar // unknown; but this isn't very important, we might as well be 25453ec55215075c8f4ddd47ca6ed7d382f16beb670Daniel Dunbar // bug comatible. 25553ec55215075c8f4ddd47ca6ed7d382f16beb670Daniel Dunbar if (!InputType) { 2564ad4b3ebbe5769143389dccfcfadb666a4ba5940Daniel Dunbar Diag(clang::diag::driver_unknown_language) << A->getValue(Args); 25753ec55215075c8f4ddd47ca6ed7d382f16beb670Daniel Dunbar InputType = types::TY_Object; 25853ec55215075c8f4ddd47ca6ed7d382f16beb670Daniel Dunbar } 25953ec55215075c8f4ddd47ca6ed7d382f16beb670Daniel Dunbar } 26053ec55215075c8f4ddd47ca6ed7d382f16beb670Daniel Dunbar } 26153ec55215075c8f4ddd47ca6ed7d382f16beb670Daniel Dunbar 26253ec55215075c8f4ddd47ca6ed7d382f16beb670Daniel Dunbar for (unsigned i = 0, e = Inputs.size(); i != e; ++i) { 26353ec55215075c8f4ddd47ca6ed7d382f16beb670Daniel Dunbar llvm::errs() << "input " << i << ": " 26453ec55215075c8f4ddd47ca6ed7d382f16beb670Daniel Dunbar << Inputs[i].second->getValue(Args) << "\n"; 26553ec55215075c8f4ddd47ca6ed7d382f16beb670Daniel Dunbar } 26653ec55215075c8f4ddd47ca6ed7d382f16beb670Daniel Dunbar exit(0); 26753ec55215075c8f4ddd47ca6ed7d382f16beb670Daniel Dunbar} 26853ec55215075c8f4ddd47ca6ed7d382f16beb670Daniel Dunbar 269dd98e2cad165ca73c769e4f105a4e47c2216387aDaniel DunbarHostInfo *Driver::GetHostInfo(const char *Triple) { 270dd98e2cad165ca73c769e4f105a4e47c2216387aDaniel Dunbar // Dice into arch, platform, and OS. This matches 271dd98e2cad165ca73c769e4f105a4e47c2216387aDaniel Dunbar // arch,platform,os = '(.*?)-(.*?)-(.*?)' 272dd98e2cad165ca73c769e4f105a4e47c2216387aDaniel Dunbar // and missing fields are left empty. 273dd98e2cad165ca73c769e4f105a4e47c2216387aDaniel Dunbar std::string Arch, Platform, OS; 274dd98e2cad165ca73c769e4f105a4e47c2216387aDaniel Dunbar 275dd98e2cad165ca73c769e4f105a4e47c2216387aDaniel Dunbar if (const char *ArchEnd = strchr(Triple, '-')) { 276dd98e2cad165ca73c769e4f105a4e47c2216387aDaniel Dunbar Arch = std::string(Triple, ArchEnd); 277dd98e2cad165ca73c769e4f105a4e47c2216387aDaniel Dunbar 278dd98e2cad165ca73c769e4f105a4e47c2216387aDaniel Dunbar if (const char *PlatformEnd = strchr(ArchEnd+1, '-')) { 279dd98e2cad165ca73c769e4f105a4e47c2216387aDaniel Dunbar Platform = std::string(ArchEnd+1, PlatformEnd); 280dd98e2cad165ca73c769e4f105a4e47c2216387aDaniel Dunbar OS = PlatformEnd+1; 281dd98e2cad165ca73c769e4f105a4e47c2216387aDaniel Dunbar } else 282dd98e2cad165ca73c769e4f105a4e47c2216387aDaniel Dunbar Platform = ArchEnd+1; 283dd98e2cad165ca73c769e4f105a4e47c2216387aDaniel Dunbar } else 284dd98e2cad165ca73c769e4f105a4e47c2216387aDaniel Dunbar Arch = Triple; 285dd98e2cad165ca73c769e4f105a4e47c2216387aDaniel Dunbar 286dd98e2cad165ca73c769e4f105a4e47c2216387aDaniel Dunbar if (memcmp(&Platform[0], "darwin", 6) == 0) 287dd98e2cad165ca73c769e4f105a4e47c2216387aDaniel Dunbar return new DarwinHostInfo(Arch.c_str(), Platform.c_str(), OS.c_str()); 288dd98e2cad165ca73c769e4f105a4e47c2216387aDaniel Dunbar 289dd98e2cad165ca73c769e4f105a4e47c2216387aDaniel Dunbar return new UnknownHostInfo(Arch.c_str(), Platform.c_str(), OS.c_str()); 290dd98e2cad165ca73c769e4f105a4e47c2216387aDaniel Dunbar} 291