13fdcc6fb12d7cf38d2a3111736f80f0dd55447b4Nick Lewycky//===--- ToolChain.cpp - Collections of tools for one platform ------------===//
22ba38ba9a18b8ec88e2509fad622eeec01562769Daniel Dunbar//
32ba38ba9a18b8ec88e2509fad622eeec01562769Daniel Dunbar//                     The LLVM Compiler Infrastructure
42ba38ba9a18b8ec88e2509fad622eeec01562769Daniel Dunbar//
52ba38ba9a18b8ec88e2509fad622eeec01562769Daniel Dunbar// This file is distributed under the University of Illinois Open Source
62ba38ba9a18b8ec88e2509fad622eeec01562769Daniel Dunbar// License. See LICENSE.TXT for details.
72ba38ba9a18b8ec88e2509fad622eeec01562769Daniel Dunbar//
82ba38ba9a18b8ec88e2509fad622eeec01562769Daniel Dunbar//===----------------------------------------------------------------------===//
92ba38ba9a18b8ec88e2509fad622eeec01562769Daniel Dunbar
105b222059399ec9cccba7a393dc470adfb8a3db0fRafael Espindola#include "Tools.h"
1155fc873017f10f6f566b182b70f6fc22aefa3464Chandler Carruth#include "clang/Basic/ObjCRuntime.h"
122ba38ba9a18b8ec88e2509fad622eeec01562769Daniel Dunbar#include "clang/Driver/Action.h"
132ba38ba9a18b8ec88e2509fad622eeec01562769Daniel Dunbar#include "clang/Driver/Driver.h"
1400577ada44c889fbe311d61c51a8da89e65c7c9aDaniel Dunbar#include "clang/Driver/DriverDiagnostic.h"
1500577ada44c889fbe311d61c51a8da89e65c7c9aDaniel Dunbar#include "clang/Driver/Options.h"
16c6911a2b1fc176e4d6053ed86506c17c3d8b0057Peter Collingbourne#include "clang/Driver/SanitizerArgs.h"
17b1e25a1bc03292dc538d336573e0be1490223171Reid Kleckner#include "clang/Driver/ToolChain.h"
18ef8225444452a1486bd721f3285301fe84643b00Stephen Hines#include "llvm/ADT/SmallString.h"
1957f6d1946b1026eb4d0bbc1904b2833b254d4caaBob Wilson#include "llvm/ADT/StringSwitch.h"
20b1e25a1bc03292dc538d336573e0be1490223171Reid Kleckner#include "llvm/Option/Arg.h"
21b1e25a1bc03292dc538d336573e0be1490223171Reid Kleckner#include "llvm/Option/ArgList.h"
22b1e25a1bc03292dc538d336573e0be1490223171Reid Kleckner#include "llvm/Option/Option.h"
239f084a3166b684573ba49df28fc5792bc37d92e1John McCall#include "llvm/Support/ErrorHandling.h"
248e8e95c57c310bbc52cdc8d32df23c95afc77916Simon Atanasyan#include "llvm/Support/FileSystem.h"
252ba38ba9a18b8ec88e2509fad622eeec01562769Daniel Dunbarusing namespace clang::driver;
265f9e272e632e951b1efe824cd16acb4d96077930Chris Lattnerusing namespace clang;
27b1e25a1bc03292dc538d336573e0be1490223171Reid Klecknerusing namespace llvm::opt;
282ba38ba9a18b8ec88e2509fad622eeec01562769Daniel Dunbar
29af370e6e051e505016637e23418354db625dc796Rafael EspindolaToolChain::ToolChain(const Driver &D, const llvm::Triple &T,
30af370e6e051e505016637e23418354db625dc796Rafael Espindola                     const ArgList &A)
31af370e6e051e505016637e23418354db625dc796Rafael Espindola  : D(D), Triple(T), Args(A) {
322ba38ba9a18b8ec88e2509fad622eeec01562769Daniel Dunbar}
332ba38ba9a18b8ec88e2509fad622eeec01562769Daniel Dunbar
342ba38ba9a18b8ec88e2509fad622eeec01562769Daniel DunbarToolChain::~ToolChain() {
352ba38ba9a18b8ec88e2509fad622eeec01562769Daniel Dunbar}
362ba38ba9a18b8ec88e2509fad622eeec01562769Daniel Dunbar
37ee788e70fcd0adf76103b17c78ac658d4ea30c9bDaniel Dunbarconst Driver &ToolChain::getDriver() const {
384d7ff6e8639bdce74e39b90370729ad0179ebccaChandler Carruth return D;
39ee788e70fcd0adf76103b17c78ac658d4ea30c9bDaniel Dunbar}
40ee788e70fcd0adf76103b17c78ac658d4ea30c9bDaniel Dunbar
41af370e6e051e505016637e23418354db625dc796Rafael Espindolabool ToolChain::useIntegratedAs() const {
42651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines  return Args.hasFlag(options::OPT_fintegrated_as,
43651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines                      options::OPT_fno_integrated_as,
445470cd27e47aea163daaa76dde36010753400663Rafael Espindola                      IsIntegratedAssemblerDefault());
455470cd27e47aea163daaa76dde36010753400663Rafael Espindola}
465470cd27e47aea163daaa76dde36010753400663Rafael Espindola
471b8f12d46c10169bb949372ec5fc4c58afc2ced1Alexey Samsonovconst SanitizerArgs& ToolChain::getSanitizerArgs() const {
48c6911a2b1fc176e4d6053ed86506c17c3d8b0057Peter Collingbourne  if (!SanitizerArguments.get())
49c6911a2b1fc176e4d6053ed86506c17c3d8b0057Peter Collingbourne    SanitizerArguments.reset(new SanitizerArgs(*this, Args));
50c6911a2b1fc176e4d6053ed86506c17c3d8b0057Peter Collingbourne  return *SanitizerArguments.get();
511b8f12d46c10169bb949372ec5fc4c58afc2ced1Alexey Samsonov}
521b8f12d46c10169bb949372ec5fc4c58afc2ced1Alexey Samsonov
53d2a527eae6df377b326e8d764782bc34f1e64189Daniel Dunbarstd::string ToolChain::getDefaultUniversalArchName() const {
54d2a527eae6df377b326e8d764782bc34f1e64189Daniel Dunbar  // In universal driver terms, the arch name accepted by -arch isn't exactly
55d2a527eae6df377b326e8d764782bc34f1e64189Daniel Dunbar  // the same as the ones that appear in the triple. Roughly speaking, this is
56d2a527eae6df377b326e8d764782bc34f1e64189Daniel Dunbar  // an inverse of the darwin::getArchTypeForDarwinArchName() function, but the
57d2a527eae6df377b326e8d764782bc34f1e64189Daniel Dunbar  // only interesting special case is powerpc.
58d2a527eae6df377b326e8d764782bc34f1e64189Daniel Dunbar  switch (Triple.getArch()) {
59d2a527eae6df377b326e8d764782bc34f1e64189Daniel Dunbar  case llvm::Triple::ppc:
60d2a527eae6df377b326e8d764782bc34f1e64189Daniel Dunbar    return "ppc";
61d2a527eae6df377b326e8d764782bc34f1e64189Daniel Dunbar  case llvm::Triple::ppc64:
62d2a527eae6df377b326e8d764782bc34f1e64189Daniel Dunbar    return "ppc64";
63ea7fb0ce25acc04664a2e7c2b24af03cef2c0d1fBill Schmidt  case llvm::Triple::ppc64le:
64ea7fb0ce25acc04664a2e7c2b24af03cef2c0d1fBill Schmidt    return "ppc64le";
65d2a527eae6df377b326e8d764782bc34f1e64189Daniel Dunbar  default:
66d2a527eae6df377b326e8d764782bc34f1e64189Daniel Dunbar    return Triple.getArchName();
67d2a527eae6df377b326e8d764782bc34f1e64189Daniel Dunbar  }
68d2a527eae6df377b326e8d764782bc34f1e64189Daniel Dunbar}
69d2a527eae6df377b326e8d764782bc34f1e64189Daniel Dunbar
7003a86385d6628398e1671db1d1970eb83ef0f8b3Rafael Espindolabool ToolChain::IsUnwindTablesDefault() const {
7103a86385d6628398e1671db1d1970eb83ef0f8b3Rafael Espindola  return false;
7203a86385d6628398e1671db1d1970eb83ef0f8b3Rafael Espindola}
7303a86385d6628398e1671db1d1970eb83ef0f8b3Rafael Espindola
74f48b93cb2054e83e43ca4391b8ec70be89fa2e30Rafael EspindolaTool *ToolChain::getClang() const {
75f48b93cb2054e83e43ca4391b8ec70be89fa2e30Rafael Espindola  if (!Clang)
76f48b93cb2054e83e43ca4391b8ec70be89fa2e30Rafael Espindola    Clang.reset(new tools::Clang(*this));
77f48b93cb2054e83e43ca4391b8ec70be89fa2e30Rafael Espindola  return Clang.get();
78f48b93cb2054e83e43ca4391b8ec70be89fa2e30Rafael Espindola}
79f48b93cb2054e83e43ca4391b8ec70be89fa2e30Rafael Espindola
80f48b93cb2054e83e43ca4391b8ec70be89fa2e30Rafael EspindolaTool *ToolChain::buildAssembler() const {
81f48b93cb2054e83e43ca4391b8ec70be89fa2e30Rafael Espindola  return new tools::ClangAs(*this);
82f48b93cb2054e83e43ca4391b8ec70be89fa2e30Rafael Espindola}
83f48b93cb2054e83e43ca4391b8ec70be89fa2e30Rafael Espindola
84f48b93cb2054e83e43ca4391b8ec70be89fa2e30Rafael EspindolaTool *ToolChain::buildLinker() const {
85f48b93cb2054e83e43ca4391b8ec70be89fa2e30Rafael Espindola  llvm_unreachable("Linking is not supported by this toolchain");
86f48b93cb2054e83e43ca4391b8ec70be89fa2e30Rafael Espindola}
87f48b93cb2054e83e43ca4391b8ec70be89fa2e30Rafael Espindola
88f48b93cb2054e83e43ca4391b8ec70be89fa2e30Rafael EspindolaTool *ToolChain::getAssemble() const {
89f48b93cb2054e83e43ca4391b8ec70be89fa2e30Rafael Espindola  if (!Assemble)
90f48b93cb2054e83e43ca4391b8ec70be89fa2e30Rafael Espindola    Assemble.reset(buildAssembler());
91f48b93cb2054e83e43ca4391b8ec70be89fa2e30Rafael Espindola  return Assemble.get();
92f48b93cb2054e83e43ca4391b8ec70be89fa2e30Rafael Espindola}
93f48b93cb2054e83e43ca4391b8ec70be89fa2e30Rafael Espindola
94f48b93cb2054e83e43ca4391b8ec70be89fa2e30Rafael EspindolaTool *ToolChain::getClangAs() const {
95f48b93cb2054e83e43ca4391b8ec70be89fa2e30Rafael Espindola  if (!Assemble)
96f48b93cb2054e83e43ca4391b8ec70be89fa2e30Rafael Espindola    Assemble.reset(new tools::ClangAs(*this));
97f48b93cb2054e83e43ca4391b8ec70be89fa2e30Rafael Espindola  return Assemble.get();
98f48b93cb2054e83e43ca4391b8ec70be89fa2e30Rafael Espindola}
99f48b93cb2054e83e43ca4391b8ec70be89fa2e30Rafael Espindola
100f48b93cb2054e83e43ca4391b8ec70be89fa2e30Rafael EspindolaTool *ToolChain::getLink() const {
101f48b93cb2054e83e43ca4391b8ec70be89fa2e30Rafael Espindola  if (!Link)
102f48b93cb2054e83e43ca4391b8ec70be89fa2e30Rafael Espindola    Link.reset(buildLinker());
103f48b93cb2054e83e43ca4391b8ec70be89fa2e30Rafael Espindola  return Link.get();
104f48b93cb2054e83e43ca4391b8ec70be89fa2e30Rafael Espindola}
105f48b93cb2054e83e43ca4391b8ec70be89fa2e30Rafael Espindola
106f48b93cb2054e83e43ca4391b8ec70be89fa2e30Rafael EspindolaTool *ToolChain::getTool(Action::ActionClass AC) const {
107c0a55d12caff98504eace18b553bb111160a8131Rafael Espindola  switch (AC) {
108c0a55d12caff98504eace18b553bb111160a8131Rafael Espindola  case Action::AssembleJobClass:
109f48b93cb2054e83e43ca4391b8ec70be89fa2e30Rafael Espindola    return getAssemble();
110f48b93cb2054e83e43ca4391b8ec70be89fa2e30Rafael Espindola
111c0a55d12caff98504eace18b553bb111160a8131Rafael Espindola  case Action::LinkJobClass:
112f48b93cb2054e83e43ca4391b8ec70be89fa2e30Rafael Espindola    return getLink();
113f48b93cb2054e83e43ca4391b8ec70be89fa2e30Rafael Espindola
114f48b93cb2054e83e43ca4391b8ec70be89fa2e30Rafael Espindola  case Action::InputClass:
115f48b93cb2054e83e43ca4391b8ec70be89fa2e30Rafael Espindola  case Action::BindArchClass:
116c0a55d12caff98504eace18b553bb111160a8131Rafael Espindola  case Action::LipoJobClass:
117c0a55d12caff98504eace18b553bb111160a8131Rafael Espindola  case Action::DsymutilJobClass:
118651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines  case Action::VerifyDebugInfoJobClass:
119c0a55d12caff98504eace18b553bb111160a8131Rafael Espindola    llvm_unreachable("Invalid tool kind.");
120c0a55d12caff98504eace18b553bb111160a8131Rafael Espindola
121c0a55d12caff98504eace18b553bb111160a8131Rafael Espindola  case Action::CompileJobClass:
122c0a55d12caff98504eace18b553bb111160a8131Rafael Espindola  case Action::PrecompileJobClass:
123c0a55d12caff98504eace18b553bb111160a8131Rafael Espindola  case Action::PreprocessJobClass:
124c0a55d12caff98504eace18b553bb111160a8131Rafael Espindola  case Action::AnalyzeJobClass:
125c0a55d12caff98504eace18b553bb111160a8131Rafael Espindola  case Action::MigrateJobClass:
126651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines  case Action::VerifyPCHJobClass:
127f48b93cb2054e83e43ca4391b8ec70be89fa2e30Rafael Espindola    return getClang();
128c0a55d12caff98504eace18b553bb111160a8131Rafael Espindola  }
1294c49f7b473b0158bb6e3534f70143132cc638ce8Benjamin Kramer
1304c49f7b473b0158bb6e3534f70143132cc638ce8Benjamin Kramer  llvm_unreachable("Invalid tool kind.");
131c0a55d12caff98504eace18b553bb111160a8131Rafael Espindola}
132c0a55d12caff98504eace18b553bb111160a8131Rafael Espindola
13329511875348c49c9c5a14bb086cd51e17feb01c9Rafael EspindolaTool *ToolChain::SelectTool(const JobAction &JA) const {
1345b222059399ec9cccba7a393dc470adfb8a3db0fRafael Espindola  if (getDriver().ShouldUseClangCompiler(JA))
13529511875348c49c9c5a14bb086cd51e17feb01c9Rafael Espindola    return getClang();
136f48b93cb2054e83e43ca4391b8ec70be89fa2e30Rafael Espindola  Action::ActionClass AC = JA.getKind();
137f48b93cb2054e83e43ca4391b8ec70be89fa2e30Rafael Espindola  if (AC == Action::AssembleJobClass && useIntegratedAs())
13829511875348c49c9c5a14bb086cd51e17feb01c9Rafael Espindola    return getClangAs();
13929511875348c49c9c5a14bb086cd51e17feb01c9Rafael Espindola  return getTool(AC);
1405b222059399ec9cccba7a393dc470adfb8a3db0fRafael Espindola}
1415b222059399ec9cccba7a393dc470adfb8a3db0fRafael Espindola
1424a7e88978cf646ad10d654020cb00b3877069210Daniel Dunbarstd::string ToolChain::GetFilePath(const char *Name) const {
1434d7ff6e8639bdce74e39b90370729ad0179ebccaChandler Carruth  return D.GetFilePath(Name, *this);
1441eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump
1452ba38ba9a18b8ec88e2509fad622eeec01562769Daniel Dunbar}
1462ba38ba9a18b8ec88e2509fad622eeec01562769Daniel Dunbar
147fc44e88cbdf013d285f2e4e3962fb80dcad56770Simon Atanasyanstd::string ToolChain::GetProgramPath(const char *Name) const {
148fc44e88cbdf013d285f2e4e3962fb80dcad56770Simon Atanasyan  return D.GetProgramPath(Name, *this);
1492ba38ba9a18b8ec88e2509fad622eeec01562769Daniel Dunbar}
1504180011fb8cef06adec04d30486b1bf3b99aa8b8Daniel Dunbar
151ef8225444452a1486bd721f3285301fe84643b00Stephen Hinesstd::string ToolChain::GetLinkerPath() const {
152ef8225444452a1486bd721f3285301fe84643b00Stephen Hines  if (Arg *A = Args.getLastArg(options::OPT_fuse_ld_EQ)) {
153ef8225444452a1486bd721f3285301fe84643b00Stephen Hines    StringRef Suffix = A->getValue();
154ef8225444452a1486bd721f3285301fe84643b00Stephen Hines
155ef8225444452a1486bd721f3285301fe84643b00Stephen Hines    // If we're passed -fuse-ld= with no argument, or with the argument ld,
156ef8225444452a1486bd721f3285301fe84643b00Stephen Hines    // then use whatever the default system linker is.
157ef8225444452a1486bd721f3285301fe84643b00Stephen Hines    if (Suffix.empty() || Suffix == "ld")
158ef8225444452a1486bd721f3285301fe84643b00Stephen Hines      return GetProgramPath("ld");
159ef8225444452a1486bd721f3285301fe84643b00Stephen Hines
160ef8225444452a1486bd721f3285301fe84643b00Stephen Hines    llvm::SmallString<8> LinkerName("ld.");
161ef8225444452a1486bd721f3285301fe84643b00Stephen Hines    LinkerName.append(Suffix);
162ef8225444452a1486bd721f3285301fe84643b00Stephen Hines
163ef8225444452a1486bd721f3285301fe84643b00Stephen Hines    std::string LinkerPath(GetProgramPath(LinkerName.c_str()));
164ef8225444452a1486bd721f3285301fe84643b00Stephen Hines    if (llvm::sys::fs::exists(LinkerPath))
165ef8225444452a1486bd721f3285301fe84643b00Stephen Hines      return LinkerPath;
166ef8225444452a1486bd721f3285301fe84643b00Stephen Hines
167ef8225444452a1486bd721f3285301fe84643b00Stephen Hines    getDriver().Diag(diag::err_drv_invalid_linker_name) << A->getAsString(Args);
168ef8225444452a1486bd721f3285301fe84643b00Stephen Hines    return "";
169ef8225444452a1486bd721f3285301fe84643b00Stephen Hines  }
170ef8225444452a1486bd721f3285301fe84643b00Stephen Hines
171ef8225444452a1486bd721f3285301fe84643b00Stephen Hines  return GetProgramPath("ld");
172ef8225444452a1486bd721f3285301fe84643b00Stephen Hines}
173ef8225444452a1486bd721f3285301fe84643b00Stephen Hines
174ef8225444452a1486bd721f3285301fe84643b00Stephen Hines
1754180011fb8cef06adec04d30486b1bf3b99aa8b8Daniel Dunbartypes::ID ToolChain::LookupTypeForExtension(const char *Ext) const {
1764180011fb8cef06adec04d30486b1bf3b99aa8b8Daniel Dunbar  return types::lookupTypeForExtension(Ext);
1774180011fb8cef06adec04d30486b1bf3b99aa8b8Daniel Dunbar}
17800577ada44c889fbe311d61c51a8da89e65c7c9aDaniel Dunbar
179b993f5d93b994b9b0aac6aebae669621744bbed7Daniel Dunbarbool ToolChain::HasNativeLLVMSupport() const {
180b993f5d93b994b9b0aac6aebae669621744bbed7Daniel Dunbar  return false;
181b993f5d93b994b9b0aac6aebae669621744bbed7Daniel Dunbar}
182b993f5d93b994b9b0aac6aebae669621744bbed7Daniel Dunbar
183651f13cea278ec967336033dd032faef0e9fc2ecStephen Hinesbool ToolChain::isCrossCompiling() const {
184651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines  llvm::Triple HostTriple(LLVM_HOST_TRIPLE);
185651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines  switch (HostTriple.getArch()) {
186651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines  // The A32/T32/T16 instruction sets are not separate architectures in this
187651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines  // context.
188651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines  case llvm::Triple::arm:
189651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines  case llvm::Triple::armeb:
190651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines  case llvm::Triple::thumb:
191651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines  case llvm::Triple::thumbeb:
192651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines    return getArch() != llvm::Triple::arm && getArch() != llvm::Triple::thumb &&
193651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines           getArch() != llvm::Triple::armeb && getArch() != llvm::Triple::thumbeb;
194651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines  default:
195651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines    return HostTriple.getArch() != getArch();
196651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines  }
197651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines}
198651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines
199260611a32535c851237926bfcf78869b13c07d5bJohn McCallObjCRuntime ToolChain::getDefaultObjCRuntime(bool isNonFragile) const {
20011d3f4cc27e6b923fc32481dc1bb5ec46c7d1f4bDavid Chisnall  return ObjCRuntime(isNonFragile ? ObjCRuntime::GNUstep : ObjCRuntime::GCC,
201260611a32535c851237926bfcf78869b13c07d5bJohn McCall                     VersionTuple());
2029f084a3166b684573ba49df28fc5792bc37d92e1John McCall}
2039f084a3166b684573ba49df28fc5792bc37d92e1John McCall
20432ca73e33fcc7c75ea1c297755a300be3e9e5371Jim Grosbachstd::string ToolChain::ComputeLLVMTriple(const ArgList &Args,
20561ab80a8b35e6fe9363e8ef1b3d27209b0e89349Chad Rosier                                         types::ID InputType) const {
20600577ada44c889fbe311d61c51a8da89e65c7c9aDaniel Dunbar  switch (getTriple().getArch()) {
20700577ada44c889fbe311d61c51a8da89e65c7c9aDaniel Dunbar  default:
20800577ada44c889fbe311d61c51a8da89e65c7c9aDaniel Dunbar    return getTripleString();
20900577ada44c889fbe311d61c51a8da89e65c7c9aDaniel Dunbar
21032ca73e33fcc7c75ea1c297755a300be3e9e5371Jim Grosbach  case llvm::Triple::x86_64: {
21132ca73e33fcc7c75ea1c297755a300be3e9e5371Jim Grosbach    llvm::Triple Triple = getTriple();
212651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines    if (!Triple.isOSBinFormatMachO())
21332ca73e33fcc7c75ea1c297755a300be3e9e5371Jim Grosbach      return getTripleString();
21432ca73e33fcc7c75ea1c297755a300be3e9e5371Jim Grosbach
21532ca73e33fcc7c75ea1c297755a300be3e9e5371Jim Grosbach    if (Arg *A = Args.getLastArg(options::OPT_march_EQ)) {
21632ca73e33fcc7c75ea1c297755a300be3e9e5371Jim Grosbach      // x86_64h goes in the triple. Other -march options just use the
21732ca73e33fcc7c75ea1c297755a300be3e9e5371Jim Grosbach      // vanilla triple we already have.
21832ca73e33fcc7c75ea1c297755a300be3e9e5371Jim Grosbach      StringRef MArch = A->getValue();
21932ca73e33fcc7c75ea1c297755a300be3e9e5371Jim Grosbach      if (MArch == "x86_64h")
22032ca73e33fcc7c75ea1c297755a300be3e9e5371Jim Grosbach        Triple.setArchName(MArch);
22132ca73e33fcc7c75ea1c297755a300be3e9e5371Jim Grosbach    }
22232ca73e33fcc7c75ea1c297755a300be3e9e5371Jim Grosbach    return Triple.getTriple();
22332ca73e33fcc7c75ea1c297755a300be3e9e5371Jim Grosbach  }
22400577ada44c889fbe311d61c51a8da89e65c7c9aDaniel Dunbar  case llvm::Triple::arm:
225651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines  case llvm::Triple::armeb:
226651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines  case llvm::Triple::thumb:
227651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines  case llvm::Triple::thumbeb: {
22800577ada44c889fbe311d61c51a8da89e65c7c9aDaniel Dunbar    // FIXME: Factor into subclasses.
22900577ada44c889fbe311d61c51a8da89e65c7c9aDaniel Dunbar    llvm::Triple Triple = getTriple();
230651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines    bool IsBigEndian = getTriple().getArch() == llvm::Triple::armeb ||
231651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines                       getTriple().getArch() == llvm::Triple::thumbeb;
23200577ada44c889fbe311d61c51a8da89e65c7c9aDaniel Dunbar
2336bcf27bb9a4b5c3f79cb44c0e4654a6d7619ad89Stephen Hines    // Handle pseudo-target flags '-mlittle-endian'/'-EL' and
2346bcf27bb9a4b5c3f79cb44c0e4654a6d7619ad89Stephen Hines    // '-mbig-endian'/'-EB'.
2356bcf27bb9a4b5c3f79cb44c0e4654a6d7619ad89Stephen Hines    if (Arg *A = Args.getLastArg(options::OPT_mlittle_endian,
2366bcf27bb9a4b5c3f79cb44c0e4654a6d7619ad89Stephen Hines                                 options::OPT_mbig_endian)) {
2376bcf27bb9a4b5c3f79cb44c0e4654a6d7619ad89Stephen Hines      if (A->getOption().matches(options::OPT_mlittle_endian))
2386bcf27bb9a4b5c3f79cb44c0e4654a6d7619ad89Stephen Hines        IsBigEndian = false;
2396bcf27bb9a4b5c3f79cb44c0e4654a6d7619ad89Stephen Hines      else
2406bcf27bb9a4b5c3f79cb44c0e4654a6d7619ad89Stephen Hines        IsBigEndian = true;
2416bcf27bb9a4b5c3f79cb44c0e4654a6d7619ad89Stephen Hines    }
2426bcf27bb9a4b5c3f79cb44c0e4654a6d7619ad89Stephen Hines
24300577ada44c889fbe311d61c51a8da89e65c7c9aDaniel Dunbar    // Thumb2 is the default for V7 on Darwin.
24400577ada44c889fbe311d61c51a8da89e65c7c9aDaniel Dunbar    //
24500577ada44c889fbe311d61c51a8da89e65c7c9aDaniel Dunbar    // FIXME: Thumb should just be another -target-feaure, not in the triple.
246651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines    StringRef Suffix = Triple.isOSBinFormatMachO()
247651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines      ? tools::arm::getLLVMArchSuffixForARM(tools::arm::getARMCPUForMArch(Args, Triple))
248651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines      : tools::arm::getLLVMArchSuffixForARM(tools::arm::getARMTargetCPU(Args, Triple));
249651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines    bool ThumbDefault = Suffix.startswith("v6m") || Suffix.startswith("v7m") ||
250651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines      Suffix.startswith("v7em") ||
251651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines      (Suffix.startswith("v7") && getTriple().isOSBinFormatMachO());
2526bcf27bb9a4b5c3f79cb44c0e4654a6d7619ad89Stephen Hines    // FIXME: this is invalid for WindowsCE
2536bcf27bb9a4b5c3f79cb44c0e4654a6d7619ad89Stephen Hines    if (getTriple().isOSWindows())
2546bcf27bb9a4b5c3f79cb44c0e4654a6d7619ad89Stephen Hines      ThumbDefault = true;
255651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines    std::string ArchName;
256651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines    if (IsBigEndian)
257651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines      ArchName = "armeb";
258651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines    else
259651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines      ArchName = "arm";
26061ab80a8b35e6fe9363e8ef1b3d27209b0e89349Chad Rosier
26161ab80a8b35e6fe9363e8ef1b3d27209b0e89349Chad Rosier    // Assembly files should start in ARM mode.
26261ab80a8b35e6fe9363e8ef1b3d27209b0e89349Chad Rosier    if (InputType != types::TY_PP_Asm &&
26361ab80a8b35e6fe9363e8ef1b3d27209b0e89349Chad Rosier        Args.hasFlag(options::OPT_mthumb, options::OPT_mno_thumb, ThumbDefault))
264651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines    {
265651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines      if (IsBigEndian)
266651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines        ArchName = "thumbeb";
267651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines      else
268651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines        ArchName = "thumb";
269651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines    }
27000577ada44c889fbe311d61c51a8da89e65c7c9aDaniel Dunbar    Triple.setArchName(ArchName + Suffix.str());
27100577ada44c889fbe311d61c51a8da89e65c7c9aDaniel Dunbar
27200577ada44c889fbe311d61c51a8da89e65c7c9aDaniel Dunbar    return Triple.getTriple();
27300577ada44c889fbe311d61c51a8da89e65c7c9aDaniel Dunbar  }
27400577ada44c889fbe311d61c51a8da89e65c7c9aDaniel Dunbar  }
27500577ada44c889fbe311d61c51a8da89e65c7c9aDaniel Dunbar}
27600577ada44c889fbe311d61c51a8da89e65c7c9aDaniel Dunbar
27761ab80a8b35e6fe9363e8ef1b3d27209b0e89349Chad Rosierstd::string ToolChain::ComputeEffectiveClangTriple(const ArgList &Args,
27861ab80a8b35e6fe9363e8ef1b3d27209b0e89349Chad Rosier                                                   types::ID InputType) const {
27961ab80a8b35e6fe9363e8ef1b3d27209b0e89349Chad Rosier  return ComputeLLVMTriple(Args, InputType);
28000577ada44c889fbe311d61c51a8da89e65c7c9aDaniel Dunbar}
28100577ada44c889fbe311d61c51a8da89e65c7c9aDaniel Dunbar
28288491fc6dfc7ebbd856d57a9acb49fb83077d6c8Chandler Carruthvoid ToolChain::AddClangSystemIncludeArgs(const ArgList &DriverArgs,
28388491fc6dfc7ebbd856d57a9acb49fb83077d6c8Chandler Carruth                                          ArgStringList &CC1Args) const {
28488491fc6dfc7ebbd856d57a9acb49fb83077d6c8Chandler Carruth  // Each toolchain should provide the appropriate include flags.
28588491fc6dfc7ebbd856d57a9acb49fb83077d6c8Chandler Carruth}
28688491fc6dfc7ebbd856d57a9acb49fb83077d6c8Chandler Carruth
287a6b2581f9595fb803fe7e2ef1d9f25e75b26d2fbChandler Carruthvoid ToolChain::addClangTargetOptions(const ArgList &DriverArgs,
288a6b2581f9595fb803fe7e2ef1d9f25e75b26d2fbChandler Carruth                                      ArgStringList &CC1Args) const {
2898af669f2f1d92436fe6dc43144bb084a620e7516Rafael Espindola}
2908af669f2f1d92436fe6dc43144bb084a620e7516Rafael Espindola
291651f13cea278ec967336033dd032faef0e9fc2ecStephen Hinesvoid ToolChain::addClangWarningOptions(ArgStringList &CC1Args) const {}
292651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines
293c24767c9dd869ba0e78c2d4c86d86ed24b8e401eDaniel DunbarToolChain::RuntimeLibType ToolChain::GetRuntimeLibType(
294c24767c9dd869ba0e78c2d4c86d86ed24b8e401eDaniel Dunbar  const ArgList &Args) const
295c24767c9dd869ba0e78c2d4c86d86ed24b8e401eDaniel Dunbar{
296c24767c9dd869ba0e78c2d4c86d86ed24b8e401eDaniel Dunbar  if (Arg *A = Args.getLastArg(options::OPT_rtlib_EQ)) {
2971d489cf4a04ad0ad8ac2696e4eed0995f3a67288Richard Smith    StringRef Value = A->getValue();
298c24767c9dd869ba0e78c2d4c86d86ed24b8e401eDaniel Dunbar    if (Value == "compiler-rt")
299c24767c9dd869ba0e78c2d4c86d86ed24b8e401eDaniel Dunbar      return ToolChain::RLT_CompilerRT;
300c24767c9dd869ba0e78c2d4c86d86ed24b8e401eDaniel Dunbar    if (Value == "libgcc")
301c24767c9dd869ba0e78c2d4c86d86ed24b8e401eDaniel Dunbar      return ToolChain::RLT_Libgcc;
302c24767c9dd869ba0e78c2d4c86d86ed24b8e401eDaniel Dunbar    getDriver().Diag(diag::err_drv_invalid_rtlib_name)
303c24767c9dd869ba0e78c2d4c86d86ed24b8e401eDaniel Dunbar      << A->getAsString(Args);
304c24767c9dd869ba0e78c2d4c86d86ed24b8e401eDaniel Dunbar  }
305c24767c9dd869ba0e78c2d4c86d86ed24b8e401eDaniel Dunbar
306c24767c9dd869ba0e78c2d4c86d86ed24b8e401eDaniel Dunbar  return GetDefaultRuntimeLibType();
307c24767c9dd869ba0e78c2d4c86d86ed24b8e401eDaniel Dunbar}
308c24767c9dd869ba0e78c2d4c86d86ed24b8e401eDaniel Dunbar
309641b98b7b52e0067beaf3978f2a8721e5d16c111Daniel DunbarToolChain::CXXStdlibType ToolChain::GetCXXStdlibType(const ArgList &Args) const{
3103f16c959e30b7e7ba8e4b8d597c313fbe457206dDaniel Dunbar  if (Arg *A = Args.getLastArg(options::OPT_stdlib_EQ)) {
3111d489cf4a04ad0ad8ac2696e4eed0995f3a67288Richard Smith    StringRef Value = A->getValue();
3123f16c959e30b7e7ba8e4b8d597c313fbe457206dDaniel Dunbar    if (Value == "libc++")
3133f16c959e30b7e7ba8e4b8d597c313fbe457206dDaniel Dunbar      return ToolChain::CST_Libcxx;
3143f16c959e30b7e7ba8e4b8d597c313fbe457206dDaniel Dunbar    if (Value == "libstdc++")
3153f16c959e30b7e7ba8e4b8d597c313fbe457206dDaniel Dunbar      return ToolChain::CST_Libstdcxx;
3165f9e272e632e951b1efe824cd16acb4d96077930Chris Lattner    getDriver().Diag(diag::err_drv_invalid_stdlib_name)
3173f16c959e30b7e7ba8e4b8d597c313fbe457206dDaniel Dunbar      << A->getAsString(Args);
3183f16c959e30b7e7ba8e4b8d597c313fbe457206dDaniel Dunbar  }
3193f16c959e30b7e7ba8e4b8d597c313fbe457206dDaniel Dunbar
320641b98b7b52e0067beaf3978f2a8721e5d16c111Daniel Dunbar  return ToolChain::CST_Libstdcxx;
321641b98b7b52e0067beaf3978f2a8721e5d16c111Daniel Dunbar}
322641b98b7b52e0067beaf3978f2a8721e5d16c111Daniel Dunbar
32379cbbdc8affe52591f7ee487a789639aa38331ecChandler Carruth/// \brief Utility function to add a system include directory to CC1 arguments.
32479cbbdc8affe52591f7ee487a789639aa38331ecChandler Carruth/*static*/ void ToolChain::addSystemInclude(const ArgList &DriverArgs,
32579cbbdc8affe52591f7ee487a789639aa38331ecChandler Carruth                                            ArgStringList &CC1Args,
32679cbbdc8affe52591f7ee487a789639aa38331ecChandler Carruth                                            const Twine &Path) {
32779cbbdc8affe52591f7ee487a789639aa38331ecChandler Carruth  CC1Args.push_back("-internal-isystem");
32879cbbdc8affe52591f7ee487a789639aa38331ecChandler Carruth  CC1Args.push_back(DriverArgs.MakeArgString(Path));
32979cbbdc8affe52591f7ee487a789639aa38331ecChandler Carruth}
33079cbbdc8affe52591f7ee487a789639aa38331ecChandler Carruth
33179cbbdc8affe52591f7ee487a789639aa38331ecChandler Carruth/// \brief Utility function to add a system include directory with extern "C"
33279cbbdc8affe52591f7ee487a789639aa38331ecChandler Carruth/// semantics to CC1 arguments.
33379cbbdc8affe52591f7ee487a789639aa38331ecChandler Carruth///
33479cbbdc8affe52591f7ee487a789639aa38331ecChandler Carruth/// Note that this should be used rarely, and only for directories that
33579cbbdc8affe52591f7ee487a789639aa38331ecChandler Carruth/// historically and for legacy reasons are treated as having implicit extern
33679cbbdc8affe52591f7ee487a789639aa38331ecChandler Carruth/// "C" semantics. These semantics are *ignored* by and large today, but its
33779cbbdc8affe52591f7ee487a789639aa38331ecChandler Carruth/// important to preserve the preprocessor changes resulting from the
33879cbbdc8affe52591f7ee487a789639aa38331ecChandler Carruth/// classification.
33979cbbdc8affe52591f7ee487a789639aa38331ecChandler Carruth/*static*/ void ToolChain::addExternCSystemInclude(const ArgList &DriverArgs,
34079cbbdc8affe52591f7ee487a789639aa38331ecChandler Carruth                                                   ArgStringList &CC1Args,
34179cbbdc8affe52591f7ee487a789639aa38331ecChandler Carruth                                                   const Twine &Path) {
34279cbbdc8affe52591f7ee487a789639aa38331ecChandler Carruth  CC1Args.push_back("-internal-externc-isystem");
34379cbbdc8affe52591f7ee487a789639aa38331ecChandler Carruth  CC1Args.push_back(DriverArgs.MakeArgString(Path));
34479cbbdc8affe52591f7ee487a789639aa38331ecChandler Carruth}
34579cbbdc8affe52591f7ee487a789639aa38331ecChandler Carruth
3468e8e95c57c310bbc52cdc8d32df23c95afc77916Simon Atanasyanvoid ToolChain::addExternCSystemIncludeIfExists(const ArgList &DriverArgs,
3478e8e95c57c310bbc52cdc8d32df23c95afc77916Simon Atanasyan                                                ArgStringList &CC1Args,
3488e8e95c57c310bbc52cdc8d32df23c95afc77916Simon Atanasyan                                                const Twine &Path) {
3498e8e95c57c310bbc52cdc8d32df23c95afc77916Simon Atanasyan  if (llvm::sys::fs::exists(Path))
3508e8e95c57c310bbc52cdc8d32df23c95afc77916Simon Atanasyan    addExternCSystemInclude(DriverArgs, CC1Args, Path);
3518e8e95c57c310bbc52cdc8d32df23c95afc77916Simon Atanasyan}
3528e8e95c57c310bbc52cdc8d32df23c95afc77916Simon Atanasyan
35379cbbdc8affe52591f7ee487a789639aa38331ecChandler Carruth/// \brief Utility function to add a list of system include directories to CC1.
35479cbbdc8affe52591f7ee487a789639aa38331ecChandler Carruth/*static*/ void ToolChain::addSystemIncludes(const ArgList &DriverArgs,
35579cbbdc8affe52591f7ee487a789639aa38331ecChandler Carruth                                             ArgStringList &CC1Args,
35679cbbdc8affe52591f7ee487a789639aa38331ecChandler Carruth                                             ArrayRef<StringRef> Paths) {
35779cbbdc8affe52591f7ee487a789639aa38331ecChandler Carruth  for (ArrayRef<StringRef>::iterator I = Paths.begin(), E = Paths.end();
35879cbbdc8affe52591f7ee487a789639aa38331ecChandler Carruth       I != E; ++I) {
35979cbbdc8affe52591f7ee487a789639aa38331ecChandler Carruth    CC1Args.push_back("-internal-isystem");
36079cbbdc8affe52591f7ee487a789639aa38331ecChandler Carruth    CC1Args.push_back(DriverArgs.MakeArgString(*I));
36179cbbdc8affe52591f7ee487a789639aa38331ecChandler Carruth  }
36279cbbdc8affe52591f7ee487a789639aa38331ecChandler Carruth}
36379cbbdc8affe52591f7ee487a789639aa38331ecChandler Carruth
364ab9fcd0ad3202735d5f21f15b2989d65f2747a13Chandler Carruthvoid ToolChain::AddClangCXXStdlibIncludeArgs(const ArgList &DriverArgs,
365ab9fcd0ad3202735d5f21f15b2989d65f2747a13Chandler Carruth                                             ArgStringList &CC1Args) const {
366a461442ed99883d2760833592f65e1e95a4889bbChandler Carruth  // Header search paths should be handled by each of the subclasses.
367a461442ed99883d2760833592f65e1e95a4889bbChandler Carruth  // Historically, they have not been, and instead have been handled inside of
368a461442ed99883d2760833592f65e1e95a4889bbChandler Carruth  // the CC1-layer frontend. As the logic is hoisted out, this generic function
369a461442ed99883d2760833592f65e1e95a4889bbChandler Carruth  // will slowly stop being called.
370a461442ed99883d2760833592f65e1e95a4889bbChandler Carruth  //
371a461442ed99883d2760833592f65e1e95a4889bbChandler Carruth  // While it is being called, replicate a bit of a hack to propagate the
372a461442ed99883d2760833592f65e1e95a4889bbChandler Carruth  // '-stdlib=' flag down to CC1 so that it can in turn customize the C++
373a461442ed99883d2760833592f65e1e95a4889bbChandler Carruth  // header search paths with it. Once all systems are overriding this
374a461442ed99883d2760833592f65e1e95a4889bbChandler Carruth  // function, the CC1 flag and this line can be removed.
375ab9fcd0ad3202735d5f21f15b2989d65f2747a13Chandler Carruth  DriverArgs.AddAllArgs(CC1Args, options::OPT_stdlib_EQ);
376641b98b7b52e0067beaf3978f2a8721e5d16c111Daniel Dunbar}
377641b98b7b52e0067beaf3978f2a8721e5d16c111Daniel Dunbar
378132e35d2f87895d20e7ea146c8c00404b80221a1Daniel Dunbarvoid ToolChain::AddCXXStdlibLibArgs(const ArgList &Args,
379132e35d2f87895d20e7ea146c8c00404b80221a1Daniel Dunbar                                    ArgStringList &CmdArgs) const {
380641b98b7b52e0067beaf3978f2a8721e5d16c111Daniel Dunbar  CXXStdlibType Type = GetCXXStdlibType(Args);
381641b98b7b52e0067beaf3978f2a8721e5d16c111Daniel Dunbar
382641b98b7b52e0067beaf3978f2a8721e5d16c111Daniel Dunbar  switch (Type) {
3833f16c959e30b7e7ba8e4b8d597c313fbe457206dDaniel Dunbar  case ToolChain::CST_Libcxx:
3843f16c959e30b7e7ba8e4b8d597c313fbe457206dDaniel Dunbar    CmdArgs.push_back("-lc++");
3853f16c959e30b7e7ba8e4b8d597c313fbe457206dDaniel Dunbar    break;
3863f16c959e30b7e7ba8e4b8d597c313fbe457206dDaniel Dunbar
387641b98b7b52e0067beaf3978f2a8721e5d16c111Daniel Dunbar  case ToolChain::CST_Libstdcxx:
388641b98b7b52e0067beaf3978f2a8721e5d16c111Daniel Dunbar    CmdArgs.push_back("-lstdc++");
389641b98b7b52e0067beaf3978f2a8721e5d16c111Daniel Dunbar    break;
390641b98b7b52e0067beaf3978f2a8721e5d16c111Daniel Dunbar  }
391641b98b7b52e0067beaf3978f2a8721e5d16c111Daniel Dunbar}
3927433fedce98a58341d0f30c2e12e8d53f3bba575Shantonu Sen
3937433fedce98a58341d0f30c2e12e8d53f3bba575Shantonu Senvoid ToolChain::AddCCKextLibArgs(const ArgList &Args,
3947433fedce98a58341d0f30c2e12e8d53f3bba575Shantonu Sen                                 ArgStringList &CmdArgs) const {
3957433fedce98a58341d0f30c2e12e8d53f3bba575Shantonu Sen  CmdArgs.push_back("-lcc_kext");
3967433fedce98a58341d0f30c2e12e8d53f3bba575Shantonu Sen}
397e20e508aecf413f84b0dc4928cbf4bb5ce6c5bdcBenjamin Kramer
398e20e508aecf413f84b0dc4928cbf4bb5ce6c5bdcBenjamin Kramerbool ToolChain::AddFastMathRuntimeIfAvailable(const ArgList &Args,
399e20e508aecf413f84b0dc4928cbf4bb5ce6c5bdcBenjamin Kramer                                              ArgStringList &CmdArgs) const {
400651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines  // Do not check for -fno-fast-math or -fno-unsafe-math when -Ofast passed
401651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines  // (to keep the linker options consistent with gcc and clang itself).
402651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines  if (!isOptimizationLevelFast(Args)) {
403651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines    // Check if -ffast-math or -funsafe-math.
404651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines    Arg *A =
405651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines        Args.getLastArg(options::OPT_ffast_math, options::OPT_fno_fast_math,
406651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines                        options::OPT_funsafe_math_optimizations,
407651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines                        options::OPT_fno_unsafe_math_optimizations);
408651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines
409651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines    if (!A || A->getOption().getID() == options::OPT_fno_fast_math ||
410651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines        A->getOption().getID() == options::OPT_fno_unsafe_math_optimizations)
411651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines      return false;
412651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines  }
413e20e508aecf413f84b0dc4928cbf4bb5ce6c5bdcBenjamin Kramer  // If crtfastmath.o exists add it to the arguments.
414e20e508aecf413f84b0dc4928cbf4bb5ce6c5bdcBenjamin Kramer  std::string Path = GetFilePath("crtfastmath.o");
415e20e508aecf413f84b0dc4928cbf4bb5ce6c5bdcBenjamin Kramer  if (Path == "crtfastmath.o") // Not found.
416e20e508aecf413f84b0dc4928cbf4bb5ce6c5bdcBenjamin Kramer    return false;
417e20e508aecf413f84b0dc4928cbf4bb5ce6c5bdcBenjamin Kramer
418e20e508aecf413f84b0dc4928cbf4bb5ce6c5bdcBenjamin Kramer  CmdArgs.push_back(Args.MakeArgString(Path));
419e20e508aecf413f84b0dc4928cbf4bb5ce6c5bdcBenjamin Kramer  return true;
420e20e508aecf413f84b0dc4928cbf4bb5ce6c5bdcBenjamin Kramer}
421