Driver.cpp revision 53ec55215075c8f4ddd47ca6ed7d382f16beb670
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" 16dd98e2cad165ca73c769e4f105a4e47c2216387aDaniel Dunbar#include "clang/Driver/HostInfo.h" 170648262df75d97b464c2be0ed867da3615659785Daniel Dunbar#include "clang/Driver/Option.h" 181b3bb6efc59a21f794b534078f9ae7e95393f510Daniel Dunbar#include "clang/Driver/Options.h" 1953ec55215075c8f4ddd47ca6ed7d382f16beb670Daniel Dunbar#include "clang/Driver/Types.h" 200648262df75d97b464c2be0ed867da3615659785Daniel Dunbar 210648262df75d97b464c2be0ed867da3615659785Daniel Dunbar#include "llvm/Support/raw_ostream.h" 2253ec55215075c8f4ddd47ca6ed7d382f16beb670Daniel Dunbar#include "llvm/System/Path.h" 231b3bb6efc59a21f794b534078f9ae7e95393f510Daniel Dunbarusing namespace clang::driver; 241b3bb6efc59a21f794b534078f9ae7e95393f510Daniel Dunbar 25dd98e2cad165ca73c769e4f105a4e47c2216387aDaniel DunbarDriver::Driver(const char *_Name, const char *_Dir, 26dd98e2cad165ca73c769e4f105a4e47c2216387aDaniel Dunbar const char *_DefaultHostTriple) 27365c02f65be026f90e67a8e00e7b827cee60e228Daniel Dunbar : Opts(new OptTable()), 28dd98e2cad165ca73c769e4f105a4e47c2216387aDaniel Dunbar Name(_Name), Dir(_Dir), DefaultHostTriple(_DefaultHostTriple), 29dd98e2cad165ca73c769e4f105a4e47c2216387aDaniel Dunbar Host(0), 30365c02f65be026f90e67a8e00e7b827cee60e228Daniel Dunbar CCCIsCXX(false), CCCEcho(false), 31365c02f65be026f90e67a8e00e7b827cee60e228Daniel Dunbar CCCNoClang(false), CCCNoClangCXX(false), CCCNoClangCPP(false) 32365c02f65be026f90e67a8e00e7b827cee60e228Daniel Dunbar{ 331b3bb6efc59a21f794b534078f9ae7e95393f510Daniel Dunbar 343ede8d0a7d1813f678ccc6011a99a0834b1b6116Daniel Dunbar} 353ede8d0a7d1813f678ccc6011a99a0834b1b6116Daniel Dunbar 363ede8d0a7d1813f678ccc6011a99a0834b1b6116Daniel DunbarDriver::~Driver() { 371b3bb6efc59a21f794b534078f9ae7e95393f510Daniel Dunbar delete Opts; 383ede8d0a7d1813f678ccc6011a99a0834b1b6116Daniel Dunbar} 393ede8d0a7d1813f678ccc6011a99a0834b1b6116Daniel Dunbar 400648262df75d97b464c2be0ed867da3615659785Daniel DunbarArgList *Driver::ParseArgStrings(const char **ArgBegin, const char **ArgEnd) { 410648262df75d97b464c2be0ed867da3615659785Daniel Dunbar ArgList *Args = new ArgList(ArgBegin, ArgEnd); 420648262df75d97b464c2be0ed867da3615659785Daniel Dunbar 430648262df75d97b464c2be0ed867da3615659785Daniel Dunbar unsigned Index = 0, End = ArgEnd - ArgBegin; 440648262df75d97b464c2be0ed867da3615659785Daniel Dunbar while (Index < End) { 450648262df75d97b464c2be0ed867da3615659785Daniel Dunbar unsigned Prev = Index; 460648262df75d97b464c2be0ed867da3615659785Daniel Dunbar Arg *A = getOpts().ParseOneArg(*Args, Index, End); 4753ec55215075c8f4ddd47ca6ed7d382f16beb670Daniel Dunbar if (A) { 4853ec55215075c8f4ddd47ca6ed7d382f16beb670Daniel Dunbar if (A->getOption().isUnsupported()) { 4953ec55215075c8f4ddd47ca6ed7d382f16beb670Daniel Dunbar Diag("unsupported option: ") << A->getOption().getName() << "\n"; 5053ec55215075c8f4ddd47ca6ed7d382f16beb670Daniel Dunbar continue; 5153ec55215075c8f4ddd47ca6ed7d382f16beb670Daniel Dunbar } 5253ec55215075c8f4ddd47ca6ed7d382f16beb670Daniel Dunbar 530648262df75d97b464c2be0ed867da3615659785Daniel Dunbar Args->append(A); 5453ec55215075c8f4ddd47ca6ed7d382f16beb670Daniel Dunbar } 550648262df75d97b464c2be0ed867da3615659785Daniel Dunbar 560648262df75d97b464c2be0ed867da3615659785Daniel Dunbar assert(Index > Prev && "Parser failed to consume argument."); 570648262df75d97b464c2be0ed867da3615659785Daniel Dunbar } 580648262df75d97b464c2be0ed867da3615659785Daniel Dunbar 590648262df75d97b464c2be0ed867da3615659785Daniel Dunbar return Args; 600648262df75d97b464c2be0ed867da3615659785Daniel Dunbar} 610648262df75d97b464c2be0ed867da3615659785Daniel Dunbar 623ede8d0a7d1813f678ccc6011a99a0834b1b6116Daniel DunbarCompilation *Driver::BuildCompilation(int argc, const char **argv) { 63365c02f65be026f90e67a8e00e7b827cee60e228Daniel Dunbar // FIXME: This stuff needs to go into the Compilation, not the 64365c02f65be026f90e67a8e00e7b827cee60e228Daniel Dunbar // driver. 6553ec55215075c8f4ddd47ca6ed7d382f16beb670Daniel Dunbar bool CCCPrintOptions = false, CCCPrintActions = false; 660648262df75d97b464c2be0ed867da3615659785Daniel Dunbar 67365c02f65be026f90e67a8e00e7b827cee60e228Daniel Dunbar const char **Start = argv + 1, **End = argv + argc; 68dd98e2cad165ca73c769e4f105a4e47c2216387aDaniel Dunbar const char *HostTriple = DefaultHostTriple.c_str(); 69365c02f65be026f90e67a8e00e7b827cee60e228Daniel Dunbar 70365c02f65be026f90e67a8e00e7b827cee60e228Daniel Dunbar // Read -ccc args. 71365c02f65be026f90e67a8e00e7b827cee60e228Daniel Dunbar // 72365c02f65be026f90e67a8e00e7b827cee60e228Daniel Dunbar // FIXME: We need to figure out where this behavior should 73365c02f65be026f90e67a8e00e7b827cee60e228Daniel Dunbar // live. Most of it should be outside in the client; the parts that 74365c02f65be026f90e67a8e00e7b827cee60e228Daniel Dunbar // aren't should have proper options, either by introducing new ones 75365c02f65be026f90e67a8e00e7b827cee60e228Daniel Dunbar // or by overloading gcc ones like -V or -b. 76365c02f65be026f90e67a8e00e7b827cee60e228Daniel Dunbar for (; Start != End && memcmp(*Start, "-ccc-", 5) == 0; ++Start) { 77365c02f65be026f90e67a8e00e7b827cee60e228Daniel Dunbar const char *Opt = *Start + 5; 78365c02f65be026f90e67a8e00e7b827cee60e228Daniel Dunbar 79365c02f65be026f90e67a8e00e7b827cee60e228Daniel Dunbar if (!strcmp(Opt, "print-options")) { 80365c02f65be026f90e67a8e00e7b827cee60e228Daniel Dunbar CCCPrintOptions = true; 81365c02f65be026f90e67a8e00e7b827cee60e228Daniel Dunbar } else if (!strcmp(Opt, "print-phases")) { 8253ec55215075c8f4ddd47ca6ed7d382f16beb670Daniel Dunbar CCCPrintActions = true; 83365c02f65be026f90e67a8e00e7b827cee60e228Daniel Dunbar } else if (!strcmp(Opt, "cxx")) { 84365c02f65be026f90e67a8e00e7b827cee60e228Daniel Dunbar CCCIsCXX = true; 85365c02f65be026f90e67a8e00e7b827cee60e228Daniel Dunbar } else if (!strcmp(Opt, "echo")) { 86365c02f65be026f90e67a8e00e7b827cee60e228Daniel Dunbar CCCEcho = true; 87365c02f65be026f90e67a8e00e7b827cee60e228Daniel Dunbar 88365c02f65be026f90e67a8e00e7b827cee60e228Daniel Dunbar } else if (!strcmp(Opt, "no-clang")) { 89365c02f65be026f90e67a8e00e7b827cee60e228Daniel Dunbar CCCNoClang = true; 90365c02f65be026f90e67a8e00e7b827cee60e228Daniel Dunbar } else if (!strcmp(Opt, "no-clang-cxx")) { 91365c02f65be026f90e67a8e00e7b827cee60e228Daniel Dunbar CCCNoClangCXX = true; 92365c02f65be026f90e67a8e00e7b827cee60e228Daniel Dunbar } else if (!strcmp(Opt, "no-clang-cpp")) { 93365c02f65be026f90e67a8e00e7b827cee60e228Daniel Dunbar CCCNoClangCPP = true; 94365c02f65be026f90e67a8e00e7b827cee60e228Daniel Dunbar } else if (!strcmp(Opt, "clang-archs")) { 95365c02f65be026f90e67a8e00e7b827cee60e228Daniel Dunbar assert(Start+1 < End && "FIXME: -ccc- argument handling."); 96365c02f65be026f90e67a8e00e7b827cee60e228Daniel Dunbar const char *Cur = *++Start; 97365c02f65be026f90e67a8e00e7b827cee60e228Daniel Dunbar 98365c02f65be026f90e67a8e00e7b827cee60e228Daniel Dunbar for (;;) { 99365c02f65be026f90e67a8e00e7b827cee60e228Daniel Dunbar const char *Next = strchr(Cur, ','); 100365c02f65be026f90e67a8e00e7b827cee60e228Daniel Dunbar 101365c02f65be026f90e67a8e00e7b827cee60e228Daniel Dunbar if (Next) { 102365c02f65be026f90e67a8e00e7b827cee60e228Daniel Dunbar CCCClangArchs.insert(std::string(Cur, Next)); 103365c02f65be026f90e67a8e00e7b827cee60e228Daniel Dunbar Cur = Next + 1; 104365c02f65be026f90e67a8e00e7b827cee60e228Daniel Dunbar } else { 105365c02f65be026f90e67a8e00e7b827cee60e228Daniel Dunbar CCCClangArchs.insert(std::string(Cur)); 106365c02f65be026f90e67a8e00e7b827cee60e228Daniel Dunbar break; 107365c02f65be026f90e67a8e00e7b827cee60e228Daniel Dunbar } 108365c02f65be026f90e67a8e00e7b827cee60e228Daniel Dunbar } 109365c02f65be026f90e67a8e00e7b827cee60e228Daniel Dunbar 110dd98e2cad165ca73c769e4f105a4e47c2216387aDaniel Dunbar } else if (!strcmp(Opt, "host-triple")) { 111365c02f65be026f90e67a8e00e7b827cee60e228Daniel Dunbar assert(Start+1 < End && "FIXME: -ccc- argument handling."); 112dd98e2cad165ca73c769e4f105a4e47c2216387aDaniel Dunbar HostTriple = *++Start; 113365c02f65be026f90e67a8e00e7b827cee60e228Daniel Dunbar 114365c02f65be026f90e67a8e00e7b827cee60e228Daniel Dunbar } else { 115365c02f65be026f90e67a8e00e7b827cee60e228Daniel Dunbar // FIXME: Error handling. 116365c02f65be026f90e67a8e00e7b827cee60e228Daniel Dunbar llvm::errs() << "invalid option: " << *Start << "\n"; 117365c02f65be026f90e67a8e00e7b827cee60e228Daniel Dunbar exit(1); 118365c02f65be026f90e67a8e00e7b827cee60e228Daniel Dunbar } 119365c02f65be026f90e67a8e00e7b827cee60e228Daniel Dunbar } 120dd98e2cad165ca73c769e4f105a4e47c2216387aDaniel Dunbar 121dd98e2cad165ca73c769e4f105a4e47c2216387aDaniel Dunbar Host = Driver::GetHostInfo(HostTriple); 122dd98e2cad165ca73c769e4f105a4e47c2216387aDaniel Dunbar 123365c02f65be026f90e67a8e00e7b827cee60e228Daniel Dunbar ArgList *Args = ParseArgStrings(Start, End); 124365c02f65be026f90e67a8e00e7b827cee60e228Daniel Dunbar 125365c02f65be026f90e67a8e00e7b827cee60e228Daniel Dunbar // FIXME: This behavior shouldn't be here. 126365c02f65be026f90e67a8e00e7b827cee60e228Daniel Dunbar if (CCCPrintOptions) { 12753ec55215075c8f4ddd47ca6ed7d382f16beb670Daniel Dunbar PrintOptions(*Args); 128365c02f65be026f90e67a8e00e7b827cee60e228Daniel Dunbar exit(0); 129365c02f65be026f90e67a8e00e7b827cee60e228Daniel Dunbar } 13053ec55215075c8f4ddd47ca6ed7d382f16beb670Daniel Dunbar 13153ec55215075c8f4ddd47ca6ed7d382f16beb670Daniel Dunbar // Construct the list of abstract actions to perform for this 13253ec55215075c8f4ddd47ca6ed7d382f16beb670Daniel Dunbar // compilation. 13353ec55215075c8f4ddd47ca6ed7d382f16beb670Daniel Dunbar llvm::SmallVector<Action*, 2> Actions; 13453ec55215075c8f4ddd47ca6ed7d382f16beb670Daniel Dunbar if (Host->useDriverDriver()) 13553ec55215075c8f4ddd47ca6ed7d382f16beb670Daniel Dunbar BuildUniversalActions(*Args, Actions); 13653ec55215075c8f4ddd47ca6ed7d382f16beb670Daniel Dunbar else 13753ec55215075c8f4ddd47ca6ed7d382f16beb670Daniel Dunbar BuildActions(*Args, Actions); 13853ec55215075c8f4ddd47ca6ed7d382f16beb670Daniel Dunbar 13953ec55215075c8f4ddd47ca6ed7d382f16beb670Daniel Dunbar // FIXME: This behavior shouldn't be here. 14053ec55215075c8f4ddd47ca6ed7d382f16beb670Daniel Dunbar if (CCCPrintActions) { 14153ec55215075c8f4ddd47ca6ed7d382f16beb670Daniel Dunbar PrintActions(Actions); 14253ec55215075c8f4ddd47ca6ed7d382f16beb670Daniel Dunbar exit(0); 14353ec55215075c8f4ddd47ca6ed7d382f16beb670Daniel Dunbar } 14453ec55215075c8f4ddd47ca6ed7d382f16beb670Daniel Dunbar 145365c02f65be026f90e67a8e00e7b827cee60e228Daniel Dunbar assert(0 && "FIXME: Implement"); 146365c02f65be026f90e67a8e00e7b827cee60e228Daniel Dunbar 147365c02f65be026f90e67a8e00e7b827cee60e228Daniel Dunbar return new Compilation(); 148365c02f65be026f90e67a8e00e7b827cee60e228Daniel Dunbar} 149365c02f65be026f90e67a8e00e7b827cee60e228Daniel Dunbar 15053ec55215075c8f4ddd47ca6ed7d382f16beb670Daniel Dunbarvoid Driver::PrintOptions(const ArgList &Args) { 1510648262df75d97b464c2be0ed867da3615659785Daniel Dunbar unsigned i = 0; 15253ec55215075c8f4ddd47ca6ed7d382f16beb670Daniel Dunbar for (ArgList::const_iterator it = Args.begin(), ie = Args.end(); 1530648262df75d97b464c2be0ed867da3615659785Daniel Dunbar it != ie; ++it, ++i) { 1540648262df75d97b464c2be0ed867da3615659785Daniel Dunbar Arg *A = *it; 1550648262df75d97b464c2be0ed867da3615659785Daniel Dunbar llvm::errs() << "Option " << i << " - " 1560648262df75d97b464c2be0ed867da3615659785Daniel Dunbar << "Name: \"" << A->getOption().getName() << "\", " 1570648262df75d97b464c2be0ed867da3615659785Daniel Dunbar << "Values: {"; 1580648262df75d97b464c2be0ed867da3615659785Daniel Dunbar for (unsigned j = 0; j < A->getNumValues(); ++j) { 1590648262df75d97b464c2be0ed867da3615659785Daniel Dunbar if (j) 1600648262df75d97b464c2be0ed867da3615659785Daniel Dunbar llvm::errs() << ", "; 16153ec55215075c8f4ddd47ca6ed7d382f16beb670Daniel Dunbar llvm::errs() << '"' << A->getValue(Args, j) << '"'; 1620648262df75d97b464c2be0ed867da3615659785Daniel Dunbar } 1630648262df75d97b464c2be0ed867da3615659785Daniel Dunbar llvm::errs() << "}\n"; 1640648262df75d97b464c2be0ed867da3615659785Daniel Dunbar } 1653ede8d0a7d1813f678ccc6011a99a0834b1b6116Daniel Dunbar} 166dd98e2cad165ca73c769e4f105a4e47c2216387aDaniel Dunbar 16753ec55215075c8f4ddd47ca6ed7d382f16beb670Daniel Dunbarvoid Driver::PrintActions(const llvm::SmallVector<Action*, 2> &Actions) { 16853ec55215075c8f4ddd47ca6ed7d382f16beb670Daniel Dunbar llvm::errs() << "FIXME: Print actions."; 16953ec55215075c8f4ddd47ca6ed7d382f16beb670Daniel Dunbar} 17053ec55215075c8f4ddd47ca6ed7d382f16beb670Daniel Dunbar 17153ec55215075c8f4ddd47ca6ed7d382f16beb670Daniel Dunbarvoid Driver::BuildUniversalActions(const ArgList &Args, 17253ec55215075c8f4ddd47ca6ed7d382f16beb670Daniel Dunbar llvm::SmallVector<Action*, 2> &Actions) { 17353ec55215075c8f4ddd47ca6ed7d382f16beb670Daniel Dunbar // FIXME: Implement 17453ec55215075c8f4ddd47ca6ed7d382f16beb670Daniel Dunbar BuildActions(Args, Actions); 17553ec55215075c8f4ddd47ca6ed7d382f16beb670Daniel Dunbar} 17653ec55215075c8f4ddd47ca6ed7d382f16beb670Daniel Dunbar 17753ec55215075c8f4ddd47ca6ed7d382f16beb670Daniel Dunbarvoid Driver::BuildActions(const ArgList &Args, 17853ec55215075c8f4ddd47ca6ed7d382f16beb670Daniel Dunbar llvm::SmallVector<Action*, 2> &Actions) { 17953ec55215075c8f4ddd47ca6ed7d382f16beb670Daniel Dunbar types::ID InputType = types::TY_INVALID; 18053ec55215075c8f4ddd47ca6ed7d382f16beb670Daniel Dunbar Arg *InputTypeArg = 0; 18153ec55215075c8f4ddd47ca6ed7d382f16beb670Daniel Dunbar 18253ec55215075c8f4ddd47ca6ed7d382f16beb670Daniel Dunbar llvm::SmallVector<std::pair<types::ID, const Arg*>, 16> Inputs; 18353ec55215075c8f4ddd47ca6ed7d382f16beb670Daniel Dunbar for (ArgList::const_iterator it = Args.begin(), ie = Args.end(); 18453ec55215075c8f4ddd47ca6ed7d382f16beb670Daniel Dunbar it != ie; ++it) { 18553ec55215075c8f4ddd47ca6ed7d382f16beb670Daniel Dunbar Arg *A = *it; 18653ec55215075c8f4ddd47ca6ed7d382f16beb670Daniel Dunbar 18753ec55215075c8f4ddd47ca6ed7d382f16beb670Daniel Dunbar if (isa<InputOption>(A->getOption())) { 18853ec55215075c8f4ddd47ca6ed7d382f16beb670Daniel Dunbar const char *Value = A->getValue(Args); 18953ec55215075c8f4ddd47ca6ed7d382f16beb670Daniel Dunbar types::ID Ty = types::TY_INVALID; 19053ec55215075c8f4ddd47ca6ed7d382f16beb670Daniel Dunbar 19153ec55215075c8f4ddd47ca6ed7d382f16beb670Daniel Dunbar // Infer the input type if necessary. 19253ec55215075c8f4ddd47ca6ed7d382f16beb670Daniel Dunbar if (!InputType) { 19353ec55215075c8f4ddd47ca6ed7d382f16beb670Daniel Dunbar // stdin must be handled specially. 19453ec55215075c8f4ddd47ca6ed7d382f16beb670Daniel Dunbar if (memcmp(Value, "-", 2) == 0) { 19553ec55215075c8f4ddd47ca6ed7d382f16beb670Daniel Dunbar // If running with -E, treat as a C input (this changes the 19653ec55215075c8f4ddd47ca6ed7d382f16beb670Daniel Dunbar // builtin macros, for example). This may be overridden by 19753ec55215075c8f4ddd47ca6ed7d382f16beb670Daniel Dunbar // -ObjC below. 19853ec55215075c8f4ddd47ca6ed7d382f16beb670Daniel Dunbar // 19953ec55215075c8f4ddd47ca6ed7d382f16beb670Daniel Dunbar // Otherwise emit an error but still use a valid type to 20053ec55215075c8f4ddd47ca6ed7d382f16beb670Daniel Dunbar // avoid spurious errors (e.g., no inputs). 20153ec55215075c8f4ddd47ca6ed7d382f16beb670Daniel Dunbar if (!Args.hasArg(options::OPT_E)) 20253ec55215075c8f4ddd47ca6ed7d382f16beb670Daniel Dunbar Diag("-E or -x required when input is from standard input"); 20353ec55215075c8f4ddd47ca6ed7d382f16beb670Daniel Dunbar Ty = types::TY_C; 20453ec55215075c8f4ddd47ca6ed7d382f16beb670Daniel Dunbar } else { 20553ec55215075c8f4ddd47ca6ed7d382f16beb670Daniel Dunbar // Otherwise lookup by extension, and fallback to ObjectType 20653ec55215075c8f4ddd47ca6ed7d382f16beb670Daniel Dunbar // if not found. 20753ec55215075c8f4ddd47ca6ed7d382f16beb670Daniel Dunbar if (const char *Ext = strrchr(Value, '.')) 20853ec55215075c8f4ddd47ca6ed7d382f16beb670Daniel Dunbar Ty = types::lookupTypeForExtension(Ext + 1); 20953ec55215075c8f4ddd47ca6ed7d382f16beb670Daniel Dunbar if (Ty == types::TY_INVALID) 21053ec55215075c8f4ddd47ca6ed7d382f16beb670Daniel Dunbar Ty = types::TY_Object; 21153ec55215075c8f4ddd47ca6ed7d382f16beb670Daniel Dunbar } 21253ec55215075c8f4ddd47ca6ed7d382f16beb670Daniel Dunbar 21353ec55215075c8f4ddd47ca6ed7d382f16beb670Daniel Dunbar // -ObjC and -ObjC++ override the default language, but only 21453ec55215075c8f4ddd47ca6ed7d382f16beb670Daniel Dunbar // -for "source files". We just treat everything that isn't a 21553ec55215075c8f4ddd47ca6ed7d382f16beb670Daniel Dunbar // -linker input as a source file. 21653ec55215075c8f4ddd47ca6ed7d382f16beb670Daniel Dunbar // 21753ec55215075c8f4ddd47ca6ed7d382f16beb670Daniel Dunbar // FIXME: Clean this up if we move the phase sequence into the 21853ec55215075c8f4ddd47ca6ed7d382f16beb670Daniel Dunbar // type. 21953ec55215075c8f4ddd47ca6ed7d382f16beb670Daniel Dunbar if (Ty != types::TY_Object) { 22053ec55215075c8f4ddd47ca6ed7d382f16beb670Daniel Dunbar if (Args.hasArg(options::OPT_ObjC)) 22153ec55215075c8f4ddd47ca6ed7d382f16beb670Daniel Dunbar Ty = types::TY_ObjC; 22253ec55215075c8f4ddd47ca6ed7d382f16beb670Daniel Dunbar else if (Args.hasArg(options::OPT_ObjCXX)) 22353ec55215075c8f4ddd47ca6ed7d382f16beb670Daniel Dunbar Ty = types::TY_ObjCXX; 22453ec55215075c8f4ddd47ca6ed7d382f16beb670Daniel Dunbar } 22553ec55215075c8f4ddd47ca6ed7d382f16beb670Daniel Dunbar } else { 22653ec55215075c8f4ddd47ca6ed7d382f16beb670Daniel Dunbar assert(InputTypeArg && "InputType set w/o InputTypeArg"); 22753ec55215075c8f4ddd47ca6ed7d382f16beb670Daniel Dunbar InputTypeArg->claim(); 22853ec55215075c8f4ddd47ca6ed7d382f16beb670Daniel Dunbar Ty = InputType; 22953ec55215075c8f4ddd47ca6ed7d382f16beb670Daniel Dunbar } 23053ec55215075c8f4ddd47ca6ed7d382f16beb670Daniel Dunbar 23153ec55215075c8f4ddd47ca6ed7d382f16beb670Daniel Dunbar // Check that the file exists. It isn't clear this is worth 23253ec55215075c8f4ddd47ca6ed7d382f16beb670Daniel Dunbar // doing, since the tool presumably does this anyway, and this 23353ec55215075c8f4ddd47ca6ed7d382f16beb670Daniel Dunbar // just adds an extra stat to the equation, but this is gcc 23453ec55215075c8f4ddd47ca6ed7d382f16beb670Daniel Dunbar // compatible. 23553ec55215075c8f4ddd47ca6ed7d382f16beb670Daniel Dunbar if (memcmp(Value, "-", 2) != 0 && !llvm::sys::Path(Value).exists()) 23653ec55215075c8f4ddd47ca6ed7d382f16beb670Daniel Dunbar Diag("no such file or directory: ") << A->getValue(Args) << "\n"; 23753ec55215075c8f4ddd47ca6ed7d382f16beb670Daniel Dunbar else 23853ec55215075c8f4ddd47ca6ed7d382f16beb670Daniel Dunbar Inputs.push_back(std::make_pair(Ty, A)); 23953ec55215075c8f4ddd47ca6ed7d382f16beb670Daniel Dunbar 24053ec55215075c8f4ddd47ca6ed7d382f16beb670Daniel Dunbar } else if (A->getOption().isLinkerInput()) { 24153ec55215075c8f4ddd47ca6ed7d382f16beb670Daniel Dunbar // Just treat as object type, we could make a special type for 24253ec55215075c8f4ddd47ca6ed7d382f16beb670Daniel Dunbar // this if necessary. 24353ec55215075c8f4ddd47ca6ed7d382f16beb670Daniel Dunbar Inputs.push_back(std::make_pair(types::TY_Object, A)); 24453ec55215075c8f4ddd47ca6ed7d382f16beb670Daniel Dunbar 24553ec55215075c8f4ddd47ca6ed7d382f16beb670Daniel Dunbar } else if (A->getOption().getId() == options::OPT_x) { 24653ec55215075c8f4ddd47ca6ed7d382f16beb670Daniel Dunbar InputTypeArg = A; 24753ec55215075c8f4ddd47ca6ed7d382f16beb670Daniel Dunbar InputType = types::lookupTypeForTypeSpecifier(A->getValue(Args)); 24853ec55215075c8f4ddd47ca6ed7d382f16beb670Daniel Dunbar 24953ec55215075c8f4ddd47ca6ed7d382f16beb670Daniel Dunbar // Follow gcc behavior and treat as linker input for invalid -x 25053ec55215075c8f4ddd47ca6ed7d382f16beb670Daniel Dunbar // options. Its not clear why we shouldn't just revert to 25153ec55215075c8f4ddd47ca6ed7d382f16beb670Daniel Dunbar // unknown; but this isn't very important, we might as well be 25253ec55215075c8f4ddd47ca6ed7d382f16beb670Daniel Dunbar // bug comatible. 25353ec55215075c8f4ddd47ca6ed7d382f16beb670Daniel Dunbar if (!InputType) { 25453ec55215075c8f4ddd47ca6ed7d382f16beb670Daniel Dunbar Diag("language not recognized: ") << A->getValue(Args) << "\n"; 25553ec55215075c8f4ddd47ca6ed7d382f16beb670Daniel Dunbar InputType = types::TY_Object; 25653ec55215075c8f4ddd47ca6ed7d382f16beb670Daniel Dunbar } 25753ec55215075c8f4ddd47ca6ed7d382f16beb670Daniel Dunbar } 25853ec55215075c8f4ddd47ca6ed7d382f16beb670Daniel Dunbar } 25953ec55215075c8f4ddd47ca6ed7d382f16beb670Daniel Dunbar 26053ec55215075c8f4ddd47ca6ed7d382f16beb670Daniel Dunbar for (unsigned i = 0, e = Inputs.size(); i != e; ++i) { 26153ec55215075c8f4ddd47ca6ed7d382f16beb670Daniel Dunbar llvm::errs() << "input " << i << ": " 26253ec55215075c8f4ddd47ca6ed7d382f16beb670Daniel Dunbar << Inputs[i].second->getValue(Args) << "\n"; 26353ec55215075c8f4ddd47ca6ed7d382f16beb670Daniel Dunbar } 26453ec55215075c8f4ddd47ca6ed7d382f16beb670Daniel Dunbar exit(0); 26553ec55215075c8f4ddd47ca6ed7d382f16beb670Daniel Dunbar} 26653ec55215075c8f4ddd47ca6ed7d382f16beb670Daniel Dunbar 267dd98e2cad165ca73c769e4f105a4e47c2216387aDaniel DunbarHostInfo *Driver::GetHostInfo(const char *Triple) { 268dd98e2cad165ca73c769e4f105a4e47c2216387aDaniel Dunbar // Dice into arch, platform, and OS. This matches 269dd98e2cad165ca73c769e4f105a4e47c2216387aDaniel Dunbar // arch,platform,os = '(.*?)-(.*?)-(.*?)' 270dd98e2cad165ca73c769e4f105a4e47c2216387aDaniel Dunbar // and missing fields are left empty. 271dd98e2cad165ca73c769e4f105a4e47c2216387aDaniel Dunbar std::string Arch, Platform, OS; 272dd98e2cad165ca73c769e4f105a4e47c2216387aDaniel Dunbar 273dd98e2cad165ca73c769e4f105a4e47c2216387aDaniel Dunbar if (const char *ArchEnd = strchr(Triple, '-')) { 274dd98e2cad165ca73c769e4f105a4e47c2216387aDaniel Dunbar Arch = std::string(Triple, ArchEnd); 275dd98e2cad165ca73c769e4f105a4e47c2216387aDaniel Dunbar 276dd98e2cad165ca73c769e4f105a4e47c2216387aDaniel Dunbar if (const char *PlatformEnd = strchr(ArchEnd+1, '-')) { 277dd98e2cad165ca73c769e4f105a4e47c2216387aDaniel Dunbar Platform = std::string(ArchEnd+1, PlatformEnd); 278dd98e2cad165ca73c769e4f105a4e47c2216387aDaniel Dunbar OS = PlatformEnd+1; 279dd98e2cad165ca73c769e4f105a4e47c2216387aDaniel Dunbar } else 280dd98e2cad165ca73c769e4f105a4e47c2216387aDaniel Dunbar Platform = ArchEnd+1; 281dd98e2cad165ca73c769e4f105a4e47c2216387aDaniel Dunbar } else 282dd98e2cad165ca73c769e4f105a4e47c2216387aDaniel Dunbar Arch = Triple; 283dd98e2cad165ca73c769e4f105a4e47c2216387aDaniel Dunbar 284dd98e2cad165ca73c769e4f105a4e47c2216387aDaniel Dunbar if (memcmp(&Platform[0], "darwin", 6) == 0) 285dd98e2cad165ca73c769e4f105a4e47c2216387aDaniel Dunbar return new DarwinHostInfo(Arch.c_str(), Platform.c_str(), OS.c_str()); 286dd98e2cad165ca73c769e4f105a4e47c2216387aDaniel Dunbar 287dd98e2cad165ca73c769e4f105a4e47c2216387aDaniel Dunbar return new UnknownHostInfo(Arch.c_str(), Platform.c_str(), OS.c_str()); 288dd98e2cad165ca73c769e4f105a4e47c2216387aDaniel Dunbar} 28953ec55215075c8f4ddd47ca6ed7d382f16beb670Daniel Dunbar 29053ec55215075c8f4ddd47ca6ed7d382f16beb670Daniel Dunbar// FIXME: Migrate to a normal diagnostics client. 29153ec55215075c8f4ddd47ca6ed7d382f16beb670Daniel Dunbarllvm::raw_ostream &Driver::Diag(const char *Message) const { 29253ec55215075c8f4ddd47ca6ed7d382f16beb670Daniel Dunbar return (llvm::errs() << Message); 29353ec55215075c8f4ddd47ca6ed7d382f16beb670Daniel Dunbar} 294