Tools.cpp revision f7efb0e7478da45bc7f2d24dbeb08406d2399591
1e3365aa452673f7ea3244bb6638551f13ab7570dNick Lewycky//===--- Tools.cpp - Tools Implementations --------------------------------===//
247ac7d27c44bd64a7d0fc03d4babc196cf2b8230Daniel Dunbar//
347ac7d27c44bd64a7d0fc03d4babc196cf2b8230Daniel Dunbar//                     The LLVM Compiler Infrastructure
447ac7d27c44bd64a7d0fc03d4babc196cf2b8230Daniel Dunbar//
547ac7d27c44bd64a7d0fc03d4babc196cf2b8230Daniel Dunbar// This file is distributed under the University of Illinois Open Source
647ac7d27c44bd64a7d0fc03d4babc196cf2b8230Daniel Dunbar// License. See LICENSE.TXT for details.
747ac7d27c44bd64a7d0fc03d4babc196cf2b8230Daniel Dunbar//
847ac7d27c44bd64a7d0fc03d4babc196cf2b8230Daniel Dunbar//===----------------------------------------------------------------------===//
947ac7d27c44bd64a7d0fc03d4babc196cf2b8230Daniel Dunbar
1047ac7d27c44bd64a7d0fc03d4babc196cf2b8230Daniel Dunbar#include "Tools.h"
1147ac7d27c44bd64a7d0fc03d4babc196cf2b8230Daniel Dunbar
121d46033f760ba5fd266ce59fe391fac473f04f52Daniel Dunbar#include "clang/Driver/Action.h"
13871adcf4e41285e3f4c3b62eaa1b2e05b60b92daDaniel Dunbar#include "clang/Driver/Arg.h"
14b488c1dac8e53206f07103d794a62a3f5012c0f4Daniel Dunbar#include "clang/Driver/ArgList.h"
15ee848a73e5f8ffe7511af8652ba811c020d1c7a0Daniel Dunbar#include "clang/Driver/Driver.h"
16ee848a73e5f8ffe7511af8652ba811c020d1c7a0Daniel Dunbar#include "clang/Driver/DriverDiagnostic.h"
17871adcf4e41285e3f4c3b62eaa1b2e05b60b92daDaniel Dunbar#include "clang/Driver/Compilation.h"
18871adcf4e41285e3f4c3b62eaa1b2e05b60b92daDaniel Dunbar#include "clang/Driver/Job.h"
199f084a3166b684573ba49df28fc5792bc37d92e1John McCall#include "clang/Driver/ObjCRuntime.h"
20b488c1dac8e53206f07103d794a62a3f5012c0f4Daniel Dunbar#include "clang/Driver/Option.h"
21265e9ef9f3ef30a97790e6e7bbc3c17d97981ca7Daniel Dunbar#include "clang/Driver/Options.h"
22b488c1dac8e53206f07103d794a62a3f5012c0f4Daniel Dunbar#include "clang/Driver/ToolChain.h"
23871adcf4e41285e3f4c3b62eaa1b2e05b60b92daDaniel Dunbar#include "clang/Driver/Util.h"
24871adcf4e41285e3f4c3b62eaa1b2e05b60b92daDaniel Dunbar
25881376467c46c5c6cc16fa6790271c2c22e1d4f1Daniel Dunbar#include "llvm/ADT/SmallString.h"
2655d3f7ae512875a1d6402943c3a619633feb2a18Douglas Gregor#include "llvm/ADT/StringSwitch.h"
275b750fe6189a41937ff2b080a983c95ea273769fDaniel Dunbar#include "llvm/ADT/Twine.h"
2832bef4edba854303800b3b01cb49a282e5da4f69Michael J. Spencer#include "llvm/Support/FileSystem.h"
2902633b541b04ad5ffc1c70f4c2feeeb13e607057Daniel Dunbar#include "llvm/Support/Format.h"
3002633b541b04ad5ffc1c70f4c2feeeb13e607057Daniel Dunbar#include "llvm/Support/raw_ostream.h"
3103013fa9a0bf1ef4b907f5fec006c8f4000fdd21Michael J. Spencer#include "llvm/Support/Host.h"
3203013fa9a0bf1ef4b907f5fec006c8f4000fdd21Michael J. Spencer#include "llvm/Support/Process.h"
33f85e193739c953358c865005855253af4f68a497John McCall#include "llvm/Support/ErrorHandling.h"
34871adcf4e41285e3f4c3b62eaa1b2e05b60b92daDaniel Dunbar
35871adcf4e41285e3f4c3b62eaa1b2e05b60b92daDaniel Dunbar#include "InputInfo.h"
3602633b541b04ad5ffc1c70f4c2feeeb13e607057Daniel Dunbar#include "ToolChains.h"
37871adcf4e41285e3f4c3b62eaa1b2e05b60b92daDaniel Dunbar
3847ac7d27c44bd64a7d0fc03d4babc196cf2b8230Daniel Dunbarusing namespace clang::driver;
3947ac7d27c44bd64a7d0fc03d4babc196cf2b8230Daniel Dunbarusing namespace clang::driver::tools;
405f9e272e632e951b1efe824cd16acb4d96077930Chris Lattnerusing namespace clang;
4147ac7d27c44bd64a7d0fc03d4babc196cf2b8230Daniel Dunbar
4288a3d6cf5ebab81614f89ba48a8d89023270637aDaniel Dunbar/// CheckPreprocessingOptions - Perform some validation of preprocessing
4388a3d6cf5ebab81614f89ba48a8d89023270637aDaniel Dunbar/// arguments that is shared with gcc.
4488a3d6cf5ebab81614f89ba48a8d89023270637aDaniel Dunbarstatic void CheckPreprocessingOptions(const Driver &D, const ArgList &Args) {
4588a3d6cf5ebab81614f89ba48a8d89023270637aDaniel Dunbar  if (Arg *A = Args.getLastArg(options::OPT_C, options::OPT_CC))
469ade4ae4fb7ed1fcbd63835d9f8f53052f0657a2Joerg Sonnenberger    if (!Args.hasArg(options::OPT_E) && !D.CCCIsCPP)
475f9e272e632e951b1efe824cd16acb4d96077930Chris Lattner      D.Diag(diag::err_drv_argument_only_allowed_with)
4888a3d6cf5ebab81614f89ba48a8d89023270637aDaniel Dunbar        << A->getAsString(Args) << "-E";
4988a3d6cf5ebab81614f89ba48a8d89023270637aDaniel Dunbar}
5088a3d6cf5ebab81614f89ba48a8d89023270637aDaniel Dunbar
51e2fd66418eca3d70cf6b62087d745d0c5181db69Daniel Dunbar/// CheckCodeGenerationOptions - Perform some validation of code generation
52e2fd66418eca3d70cf6b62087d745d0c5181db69Daniel Dunbar/// arguments that is shared with gcc.
53e2fd66418eca3d70cf6b62087d745d0c5181db69Daniel Dunbarstatic void CheckCodeGenerationOptions(const Driver &D, const ArgList &Args) {
54e2fd66418eca3d70cf6b62087d745d0c5181db69Daniel Dunbar  // In gcc, only ARM checks this, but it seems reasonable to check universally.
55e2fd66418eca3d70cf6b62087d745d0c5181db69Daniel Dunbar  if (Args.hasArg(options::OPT_static))
56e2fd66418eca3d70cf6b62087d745d0c5181db69Daniel Dunbar    if (const Arg *A = Args.getLastArg(options::OPT_dynamic,
57e2fd66418eca3d70cf6b62087d745d0c5181db69Daniel Dunbar                                       options::OPT_mdynamic_no_pic))
585f9e272e632e951b1efe824cd16acb4d96077930Chris Lattner      D.Diag(diag::err_drv_argument_not_allowed_with)
59e2fd66418eca3d70cf6b62087d745d0c5181db69Daniel Dunbar        << A->getAsString(Args) << "-static";
60e2fd66418eca3d70cf6b62087d745d0c5181db69Daniel Dunbar}
61e2fd66418eca3d70cf6b62087d745d0c5181db69Daniel Dunbar
623edbeb78fe5ea7fffea7a94575478cde19e830e0Chris Lattner// Quote target names for inclusion in GNU Make dependency files.
633edbeb78fe5ea7fffea7a94575478cde19e830e0Chris Lattner// Only the characters '$', '#', ' ', '\t' are quoted.
645f9e272e632e951b1efe824cd16acb4d96077930Chris Lattnerstatic void QuoteTarget(StringRef Target,
655f9e272e632e951b1efe824cd16acb4d96077930Chris Lattner                        SmallVectorImpl<char> &Res) {
663edbeb78fe5ea7fffea7a94575478cde19e830e0Chris Lattner  for (unsigned i = 0, e = Target.size(); i != e; ++i) {
673edbeb78fe5ea7fffea7a94575478cde19e830e0Chris Lattner    switch (Target[i]) {
683edbeb78fe5ea7fffea7a94575478cde19e830e0Chris Lattner    case ' ':
693edbeb78fe5ea7fffea7a94575478cde19e830e0Chris Lattner    case '\t':
703edbeb78fe5ea7fffea7a94575478cde19e830e0Chris Lattner      // Escape the preceding backslashes
713edbeb78fe5ea7fffea7a94575478cde19e830e0Chris Lattner      for (int j = i - 1; j >= 0 && Target[j] == '\\'; --j)
723edbeb78fe5ea7fffea7a94575478cde19e830e0Chris Lattner        Res.push_back('\\');
733edbeb78fe5ea7fffea7a94575478cde19e830e0Chris Lattner
743edbeb78fe5ea7fffea7a94575478cde19e830e0Chris Lattner      // Escape the space/tab
753edbeb78fe5ea7fffea7a94575478cde19e830e0Chris Lattner      Res.push_back('\\');
763edbeb78fe5ea7fffea7a94575478cde19e830e0Chris Lattner      break;
773edbeb78fe5ea7fffea7a94575478cde19e830e0Chris Lattner    case '$':
783edbeb78fe5ea7fffea7a94575478cde19e830e0Chris Lattner      Res.push_back('$');
793edbeb78fe5ea7fffea7a94575478cde19e830e0Chris Lattner      break;
803edbeb78fe5ea7fffea7a94575478cde19e830e0Chris Lattner    case '#':
813edbeb78fe5ea7fffea7a94575478cde19e830e0Chris Lattner      Res.push_back('\\');
823edbeb78fe5ea7fffea7a94575478cde19e830e0Chris Lattner      break;
833edbeb78fe5ea7fffea7a94575478cde19e830e0Chris Lattner    default:
843edbeb78fe5ea7fffea7a94575478cde19e830e0Chris Lattner      break;
853edbeb78fe5ea7fffea7a94575478cde19e830e0Chris Lattner    }
863edbeb78fe5ea7fffea7a94575478cde19e830e0Chris Lattner
873edbeb78fe5ea7fffea7a94575478cde19e830e0Chris Lattner    Res.push_back(Target[i]);
883edbeb78fe5ea7fffea7a94575478cde19e830e0Chris Lattner  }
893edbeb78fe5ea7fffea7a94575478cde19e830e0Chris Lattner}
903edbeb78fe5ea7fffea7a94575478cde19e830e0Chris Lattner
913d7171582b026e043916fc5d65a7d7aada547206Bill Wendlingstatic void addDirectoryList(const ArgList &Args,
92bdb8f3ce95e3e5c43497292fd05764faa6ad46b1Bill Wendling                             ArgStringList &CmdArgs,
93bdb8f3ce95e3e5c43497292fd05764faa6ad46b1Bill Wendling                             const char *ArgName,
943d7171582b026e043916fc5d65a7d7aada547206Bill Wendling                             const char *EnvVar) {
953d7171582b026e043916fc5d65a7d7aada547206Bill Wendling  const char *DirList = ::getenv(EnvVar);
96bdb8f3ce95e3e5c43497292fd05764faa6ad46b1Bill Wendling  if (!DirList)
97bdb8f3ce95e3e5c43497292fd05764faa6ad46b1Bill Wendling    return; // Nothing to do.
98bdb8f3ce95e3e5c43497292fd05764faa6ad46b1Bill Wendling
99bdb8f3ce95e3e5c43497292fd05764faa6ad46b1Bill Wendling  StringRef Dirs(DirList);
100bdb8f3ce95e3e5c43497292fd05764faa6ad46b1Bill Wendling  if (Dirs.empty()) // Empty string should not add '.'.
101bdb8f3ce95e3e5c43497292fd05764faa6ad46b1Bill Wendling    return;
102bdb8f3ce95e3e5c43497292fd05764faa6ad46b1Bill Wendling
103bdb8f3ce95e3e5c43497292fd05764faa6ad46b1Bill Wendling  StringRef::size_type Delim;
104bdb8f3ce95e3e5c43497292fd05764faa6ad46b1Bill Wendling  while ((Delim = Dirs.find(llvm::sys::PathSeparator)) != StringRef::npos) {
105bdb8f3ce95e3e5c43497292fd05764faa6ad46b1Bill Wendling    if (Delim == 0) { // Leading colon.
106bdb8f3ce95e3e5c43497292fd05764faa6ad46b1Bill Wendling      CmdArgs.push_back(ArgName);
107bdb8f3ce95e3e5c43497292fd05764faa6ad46b1Bill Wendling      CmdArgs.push_back(".");
108bdb8f3ce95e3e5c43497292fd05764faa6ad46b1Bill Wendling    } else {
109bdb8f3ce95e3e5c43497292fd05764faa6ad46b1Bill Wendling      CmdArgs.push_back(ArgName);
11009c5c39590caa92aa7ce660607a070ea275f5ad7Nico Weber      CmdArgs.push_back(Args.MakeArgString(Dirs.substr(0, Delim)));
111bdb8f3ce95e3e5c43497292fd05764faa6ad46b1Bill Wendling    }
11209c5c39590caa92aa7ce660607a070ea275f5ad7Nico Weber    Dirs = Dirs.substr(Delim + 1);
113bdb8f3ce95e3e5c43497292fd05764faa6ad46b1Bill Wendling  }
114bdb8f3ce95e3e5c43497292fd05764faa6ad46b1Bill Wendling
115bdb8f3ce95e3e5c43497292fd05764faa6ad46b1Bill Wendling  if (Dirs.empty()) { // Trailing colon.
116bdb8f3ce95e3e5c43497292fd05764faa6ad46b1Bill Wendling    CmdArgs.push_back(ArgName);
117bdb8f3ce95e3e5c43497292fd05764faa6ad46b1Bill Wendling    CmdArgs.push_back(".");
118bdb8f3ce95e3e5c43497292fd05764faa6ad46b1Bill Wendling  } else { // Add the last path.
119bdb8f3ce95e3e5c43497292fd05764faa6ad46b1Bill Wendling    CmdArgs.push_back(ArgName);
120bdb8f3ce95e3e5c43497292fd05764faa6ad46b1Bill Wendling    CmdArgs.push_back(Args.MakeArgString(Dirs));
121bdb8f3ce95e3e5c43497292fd05764faa6ad46b1Bill Wendling  }
122bdb8f3ce95e3e5c43497292fd05764faa6ad46b1Bill Wendling}
123bdb8f3ce95e3e5c43497292fd05764faa6ad46b1Bill Wendling
1242008feead855f08500fb01ff43ef5eebee05d1e5Daniel Dunbarstatic void AddLinkerInputs(const ToolChain &TC,
1252008feead855f08500fb01ff43ef5eebee05d1e5Daniel Dunbar                            const InputInfoList &Inputs, const ArgList &Args,
1262008feead855f08500fb01ff43ef5eebee05d1e5Daniel Dunbar                            ArgStringList &CmdArgs) {
1272008feead855f08500fb01ff43ef5eebee05d1e5Daniel Dunbar  const Driver &D = TC.getDriver();
1282008feead855f08500fb01ff43ef5eebee05d1e5Daniel Dunbar
1298ac38d7b5d88d12f454a7cda1275bf429813151dDaniel Dunbar  // Add extra linker input arguments which are not treated as inputs
1308ac38d7b5d88d12f454a7cda1275bf429813151dDaniel Dunbar  // (constructed via -Xarch_).
1318ac38d7b5d88d12f454a7cda1275bf429813151dDaniel Dunbar  Args.AddAllArgValues(CmdArgs, options::OPT_Zlinker_input);
1328ac38d7b5d88d12f454a7cda1275bf429813151dDaniel Dunbar
1332008feead855f08500fb01ff43ef5eebee05d1e5Daniel Dunbar  for (InputInfoList::const_iterator
1342008feead855f08500fb01ff43ef5eebee05d1e5Daniel Dunbar         it = Inputs.begin(), ie = Inputs.end(); it != ie; ++it) {
1352008feead855f08500fb01ff43ef5eebee05d1e5Daniel Dunbar    const InputInfo &II = *it;
1362008feead855f08500fb01ff43ef5eebee05d1e5Daniel Dunbar
1372008feead855f08500fb01ff43ef5eebee05d1e5Daniel Dunbar    if (!TC.HasNativeLLVMSupport()) {
1382008feead855f08500fb01ff43ef5eebee05d1e5Daniel Dunbar      // Don't try to pass LLVM inputs unless we have native support.
1392008feead855f08500fb01ff43ef5eebee05d1e5Daniel Dunbar      if (II.getType() == types::TY_LLVM_IR ||
1402008feead855f08500fb01ff43ef5eebee05d1e5Daniel Dunbar          II.getType() == types::TY_LTO_IR ||
1412008feead855f08500fb01ff43ef5eebee05d1e5Daniel Dunbar          II.getType() == types::TY_LLVM_BC ||
1422008feead855f08500fb01ff43ef5eebee05d1e5Daniel Dunbar          II.getType() == types::TY_LTO_BC)
1435f9e272e632e951b1efe824cd16acb4d96077930Chris Lattner        D.Diag(diag::err_drv_no_linker_llvm_support)
1442008feead855f08500fb01ff43ef5eebee05d1e5Daniel Dunbar          << TC.getTripleString();
1452008feead855f08500fb01ff43ef5eebee05d1e5Daniel Dunbar    }
1462008feead855f08500fb01ff43ef5eebee05d1e5Daniel Dunbar
147e5a37f48388c7e4cc081f44d13a4910bfa56cd35Daniel Dunbar    // Add filenames immediately.
148e5a37f48388c7e4cc081f44d13a4910bfa56cd35Daniel Dunbar    if (II.isFilename()) {
1492008feead855f08500fb01ff43ef5eebee05d1e5Daniel Dunbar      CmdArgs.push_back(II.getFilename());
150e5a37f48388c7e4cc081f44d13a4910bfa56cd35Daniel Dunbar      continue;
151e5a37f48388c7e4cc081f44d13a4910bfa56cd35Daniel Dunbar    }
152e5a37f48388c7e4cc081f44d13a4910bfa56cd35Daniel Dunbar
153e5a37f48388c7e4cc081f44d13a4910bfa56cd35Daniel Dunbar    // Otherwise, this is a linker input argument.
154e5a37f48388c7e4cc081f44d13a4910bfa56cd35Daniel Dunbar    const Arg &A = II.getInputArg();
155e5a37f48388c7e4cc081f44d13a4910bfa56cd35Daniel Dunbar
156e5a37f48388c7e4cc081f44d13a4910bfa56cd35Daniel Dunbar    // Handle reserved library options.
157e5a37f48388c7e4cc081f44d13a4910bfa56cd35Daniel Dunbar    if (A.getOption().matches(options::OPT_Z_reserved_lib_stdcxx)) {
158132e35d2f87895d20e7ea146c8c00404b80221a1Daniel Dunbar      TC.AddCXXStdlibLibArgs(Args, CmdArgs);
1597433fedce98a58341d0f30c2e12e8d53f3bba575Shantonu Sen    } else if (A.getOption().matches(options::OPT_Z_reserved_lib_cckext)) {
1607433fedce98a58341d0f30c2e12e8d53f3bba575Shantonu Sen      TC.AddCCKextLibArgs(Args, CmdArgs);
161e5a37f48388c7e4cc081f44d13a4910bfa56cd35Daniel Dunbar    } else
162e5a37f48388c7e4cc081f44d13a4910bfa56cd35Daniel Dunbar      A.renderAsInput(Args, CmdArgs);
1632008feead855f08500fb01ff43ef5eebee05d1e5Daniel Dunbar  }
164bdb8f3ce95e3e5c43497292fd05764faa6ad46b1Bill Wendling
165bdb8f3ce95e3e5c43497292fd05764faa6ad46b1Bill Wendling  // LIBRARY_PATH - included following the user specified library paths.
1663d7171582b026e043916fc5d65a7d7aada547206Bill Wendling  addDirectoryList(Args, CmdArgs, "-L", "LIBRARY_PATH");
1672008feead855f08500fb01ff43ef5eebee05d1e5Daniel Dunbar}
1682008feead855f08500fb01ff43ef5eebee05d1e5Daniel Dunbar
169f85e193739c953358c865005855253af4f68a497John McCall/// \brief Determine whether Objective-C automated reference counting is
170f85e193739c953358c865005855253af4f68a497John McCall/// enabled.
171f85e193739c953358c865005855253af4f68a497John McCallstatic bool isObjCAutoRefCount(const ArgList &Args) {
172f85e193739c953358c865005855253af4f68a497John McCall  return Args.hasFlag(options::OPT_fobjc_arc, options::OPT_fno_objc_arc, false);
173f85e193739c953358c865005855253af4f68a497John McCall}
174f85e193739c953358c865005855253af4f68a497John McCall
175ebcb57a8d298862c65043e88b2429591ab3c58d3Ted Kremenek/// \brief Determine whether we are linking the ObjC runtime.
176ebcb57a8d298862c65043e88b2429591ab3c58d3Ted Kremenekstatic bool isObjCRuntimeLinked(const ArgList &Args) {
177ebcb57a8d298862c65043e88b2429591ab3c58d3Ted Kremenek  if (isObjCAutoRefCount(Args))
178ebcb57a8d298862c65043e88b2429591ab3c58d3Ted Kremenek    return true;
179ebcb57a8d298862c65043e88b2429591ab3c58d3Ted Kremenek  return Args.hasArg(options::OPT_fobjc_link_runtime);
180ebcb57a8d298862c65043e88b2429591ab3c58d3Ted Kremenek}
181ebcb57a8d298862c65043e88b2429591ab3c58d3Ted Kremenek
182db3f24ac0dafad175e9daef1b8733600194f56e0Rafael Espindolastatic void addProfileRT(const ToolChain &TC, const ArgList &Args,
1833f4be6fb8872942f567166ab8d99c89885f26103Bill Wendling                         ArgStringList &CmdArgs,
1843f4be6fb8872942f567166ab8d99c89885f26103Bill Wendling                         llvm::Triple Triple) {
1853f4be6fb8872942f567166ab8d99c89885f26103Bill Wendling  if (!(Args.hasArg(options::OPT_fprofile_arcs) ||
1863f4be6fb8872942f567166ab8d99c89885f26103Bill Wendling        Args.hasArg(options::OPT_fprofile_generate) ||
1873f4be6fb8872942f567166ab8d99c89885f26103Bill Wendling        Args.hasArg(options::OPT_fcreate_profile) ||
1883f4be6fb8872942f567166ab8d99c89885f26103Bill Wendling        Args.hasArg(options::OPT_coverage)))
1893f4be6fb8872942f567166ab8d99c89885f26103Bill Wendling    return;
1903f4be6fb8872942f567166ab8d99c89885f26103Bill Wendling
1913f4be6fb8872942f567166ab8d99c89885f26103Bill Wendling  // GCC links libgcov.a by adding -L<inst>/gcc/lib/gcc/<triple>/<ver> -lgcov to
1923f4be6fb8872942f567166ab8d99c89885f26103Bill Wendling  // the link line. We cannot do the same thing because unlike gcov there is a
1933f4be6fb8872942f567166ab8d99c89885f26103Bill Wendling  // libprofile_rt.so. We used to use the -l:libprofile_rt.a syntax, but that is
1943f4be6fb8872942f567166ab8d99c89885f26103Bill Wendling  // not supported by old linkers.
195f2db04c49429a6d53069b813d42999fa36ddd9a4Benjamin Kramer  std::string ProfileRT =
196f2db04c49429a6d53069b813d42999fa36ddd9a4Benjamin Kramer    std::string(TC.getDriver().Dir) + "/../lib/libprofile_rt.a";
1973f4be6fb8872942f567166ab8d99c89885f26103Bill Wendling
1983f4be6fb8872942f567166ab8d99c89885f26103Bill Wendling  CmdArgs.push_back(Args.MakeArgString(ProfileRT));
199db3f24ac0dafad175e9daef1b8733600194f56e0Rafael Espindola}
200db3f24ac0dafad175e9daef1b8733600194f56e0Rafael Espindola
20154db68bf0e389b8aabe1a434f825a81a9c1f7db8Peter Collingbournevoid Clang::AddPreprocessingOptions(Compilation &C,
20254db68bf0e389b8aabe1a434f825a81a9c1f7db8Peter Collingbourne                                    const Driver &D,
203df91ef3d6c55692a0236f67b6c6b134a3bf84098Douglas Gregor                                    const ArgList &Args,
204c21c485b4fb58ef5d55cf3e523263dd824a2ace4Daniel Dunbar                                    ArgStringList &CmdArgs,
205c21c485b4fb58ef5d55cf3e523263dd824a2ace4Daniel Dunbar                                    const InputInfo &Output,
206c21c485b4fb58ef5d55cf3e523263dd824a2ace4Daniel Dunbar                                    const InputInfoList &Inputs) const {
207c21c485b4fb58ef5d55cf3e523263dd824a2ace4Daniel Dunbar  Arg *A;
2083a183d3d46426d8719031553131b8928f50aa606Daniel Dunbar
20988a3d6cf5ebab81614f89ba48a8d89023270637aDaniel Dunbar  CheckPreprocessingOptions(D, Args);
21088a3d6cf5ebab81614f89ba48a8d89023270637aDaniel Dunbar
21188a3d6cf5ebab81614f89ba48a8d89023270637aDaniel Dunbar  Args.AddLastArg(CmdArgs, options::OPT_C);
21288a3d6cf5ebab81614f89ba48a8d89023270637aDaniel Dunbar  Args.AddLastArg(CmdArgs, options::OPT_CC);
2133a183d3d46426d8719031553131b8928f50aa606Daniel Dunbar
2143a183d3d46426d8719031553131b8928f50aa606Daniel Dunbar  // Handle dependency file generation.
2159eb93b07ea913e7ad0bcd15bd3e3662e2760c323Daniel Dunbar  if ((A = Args.getLastArg(options::OPT_M, options::OPT_MM)) ||
216c21c485b4fb58ef5d55cf3e523263dd824a2ace4Daniel Dunbar      (A = Args.getLastArg(options::OPT_MD)) ||
217c21c485b4fb58ef5d55cf3e523263dd824a2ace4Daniel Dunbar      (A = Args.getLastArg(options::OPT_MMD))) {
218c21c485b4fb58ef5d55cf3e523263dd824a2ace4Daniel Dunbar    // Determine the output location.
219c21c485b4fb58ef5d55cf3e523263dd824a2ace4Daniel Dunbar    const char *DepFile;
220c21c485b4fb58ef5d55cf3e523263dd824a2ace4Daniel Dunbar    if (Output.getType() == types::TY_Dependencies) {
2217c1e46533cae07216e2a67d5636a5afb44253155Daniel Dunbar      DepFile = Output.getFilename();
222c21c485b4fb58ef5d55cf3e523263dd824a2ace4Daniel Dunbar    } else if (Arg *MF = Args.getLastArg(options::OPT_MF)) {
223c21c485b4fb58ef5d55cf3e523263dd824a2ace4Daniel Dunbar      DepFile = MF->getValue(Args);
2245d4d9807a65291cbe6ab88d4a4f74cb7fff01bdePeter Collingbourne      C.addFailureResultFile(DepFile);
225b827a0541b5fd095fcdb7ad0c3df93ca158c619aDaniel Dunbar    } else if (A->getOption().matches(options::OPT_M) ||
226b827a0541b5fd095fcdb7ad0c3df93ca158c619aDaniel Dunbar               A->getOption().matches(options::OPT_MM)) {
227c21c485b4fb58ef5d55cf3e523263dd824a2ace4Daniel Dunbar      DepFile = "-";
228c21c485b4fb58ef5d55cf3e523263dd824a2ace4Daniel Dunbar    } else {
229c21c485b4fb58ef5d55cf3e523263dd824a2ace4Daniel Dunbar      DepFile = darwin::CC1::getDependencyFileName(Args, Inputs);
2305d4d9807a65291cbe6ab88d4a4f74cb7fff01bdePeter Collingbourne      C.addFailureResultFile(DepFile);
231c21c485b4fb58ef5d55cf3e523263dd824a2ace4Daniel Dunbar    }
232c21c485b4fb58ef5d55cf3e523263dd824a2ace4Daniel Dunbar    CmdArgs.push_back("-dependency-file");
233c21c485b4fb58ef5d55cf3e523263dd824a2ace4Daniel Dunbar    CmdArgs.push_back(DepFile);
234c21c485b4fb58ef5d55cf3e523263dd824a2ace4Daniel Dunbar
2353edbeb78fe5ea7fffea7a94575478cde19e830e0Chris Lattner    // Add a default target if one wasn't specified.
236c21c485b4fb58ef5d55cf3e523263dd824a2ace4Daniel Dunbar    if (!Args.hasArg(options::OPT_MT) && !Args.hasArg(options::OPT_MQ)) {
237c21c485b4fb58ef5d55cf3e523263dd824a2ace4Daniel Dunbar      const char *DepTarget;
238c21c485b4fb58ef5d55cf3e523263dd824a2ace4Daniel Dunbar
239c21c485b4fb58ef5d55cf3e523263dd824a2ace4Daniel Dunbar      // If user provided -o, that is the dependency target, except
240c21c485b4fb58ef5d55cf3e523263dd824a2ace4Daniel Dunbar      // when we are only generating a dependency file.
241c21c485b4fb58ef5d55cf3e523263dd824a2ace4Daniel Dunbar      Arg *OutputOpt = Args.getLastArg(options::OPT_o);
242c21c485b4fb58ef5d55cf3e523263dd824a2ace4Daniel Dunbar      if (OutputOpt && Output.getType() != types::TY_Dependencies) {
243c21c485b4fb58ef5d55cf3e523263dd824a2ace4Daniel Dunbar        DepTarget = OutputOpt->getValue(Args);
244c21c485b4fb58ef5d55cf3e523263dd824a2ace4Daniel Dunbar      } else {
245c21c485b4fb58ef5d55cf3e523263dd824a2ace4Daniel Dunbar        // Otherwise derive from the base input.
246c21c485b4fb58ef5d55cf3e523263dd824a2ace4Daniel Dunbar        //
247c21c485b4fb58ef5d55cf3e523263dd824a2ace4Daniel Dunbar        // FIXME: This should use the computed output file location.
248f7ccbad5d9949e7ddd1cbef43d482553b811e026Dylan Noblesmith        SmallString<128> P(Inputs[0].getBaseInput());
249472ccff00cdbcd095c3ba933b9e3f202719f118fMichael J. Spencer        llvm::sys::path::replace_extension(P, "o");
250472ccff00cdbcd095c3ba933b9e3f202719f118fMichael J. Spencer        DepTarget = Args.MakeArgString(llvm::sys::path::filename(P));
251c21c485b4fb58ef5d55cf3e523263dd824a2ace4Daniel Dunbar      }
252c21c485b4fb58ef5d55cf3e523263dd824a2ace4Daniel Dunbar
253c21c485b4fb58ef5d55cf3e523263dd824a2ace4Daniel Dunbar      CmdArgs.push_back("-MT");
254f7ccbad5d9949e7ddd1cbef43d482553b811e026Dylan Noblesmith      SmallString<128> Quoted;
2553edbeb78fe5ea7fffea7a94575478cde19e830e0Chris Lattner      QuoteTarget(DepTarget, Quoted);
2563edbeb78fe5ea7fffea7a94575478cde19e830e0Chris Lattner      CmdArgs.push_back(Args.MakeArgString(Quoted));
257c21c485b4fb58ef5d55cf3e523263dd824a2ace4Daniel Dunbar    }
258c21c485b4fb58ef5d55cf3e523263dd824a2ace4Daniel Dunbar
259b827a0541b5fd095fcdb7ad0c3df93ca158c619aDaniel Dunbar    if (A->getOption().matches(options::OPT_M) ||
260b827a0541b5fd095fcdb7ad0c3df93ca158c619aDaniel Dunbar        A->getOption().matches(options::OPT_MD))
261c21c485b4fb58ef5d55cf3e523263dd824a2ace4Daniel Dunbar      CmdArgs.push_back("-sys-header-deps");
262c21c485b4fb58ef5d55cf3e523263dd824a2ace4Daniel Dunbar  }
263c21c485b4fb58ef5d55cf3e523263dd824a2ace4Daniel Dunbar
264bb52786da8d055568eef6e5694288c1258bc8c2aPeter Collingbourne  if (Args.hasArg(options::OPT_MG)) {
265bb52786da8d055568eef6e5694288c1258bc8c2aPeter Collingbourne    if (!A || A->getOption().matches(options::OPT_MD) ||
266bb52786da8d055568eef6e5694288c1258bc8c2aPeter Collingbourne              A->getOption().matches(options::OPT_MMD))
2675f9e272e632e951b1efe824cd16acb4d96077930Chris Lattner      D.Diag(diag::err_drv_mg_requires_m_or_mm);
268bb52786da8d055568eef6e5694288c1258bc8c2aPeter Collingbourne    CmdArgs.push_back("-MG");
269bb52786da8d055568eef6e5694288c1258bc8c2aPeter Collingbourne  }
270bb52786da8d055568eef6e5694288c1258bc8c2aPeter Collingbourne
271c21c485b4fb58ef5d55cf3e523263dd824a2ace4Daniel Dunbar  Args.AddLastArg(CmdArgs, options::OPT_MP);
2723edbeb78fe5ea7fffea7a94575478cde19e830e0Chris Lattner
2733edbeb78fe5ea7fffea7a94575478cde19e830e0Chris Lattner  // Convert all -MQ <target> args to -MT <quoted target>
2743edbeb78fe5ea7fffea7a94575478cde19e830e0Chris Lattner  for (arg_iterator it = Args.filtered_begin(options::OPT_MT,
2753edbeb78fe5ea7fffea7a94575478cde19e830e0Chris Lattner                                             options::OPT_MQ),
2763edbeb78fe5ea7fffea7a94575478cde19e830e0Chris Lattner         ie = Args.filtered_end(); it != ie; ++it) {
2777e4953e5c60409007545288f14b430bd23d68570Daniel Dunbar    const Arg *A = *it;
2787e4953e5c60409007545288f14b430bd23d68570Daniel Dunbar    A->claim();
2793edbeb78fe5ea7fffea7a94575478cde19e830e0Chris Lattner
2807e4953e5c60409007545288f14b430bd23d68570Daniel Dunbar    if (A->getOption().matches(options::OPT_MQ)) {
2813edbeb78fe5ea7fffea7a94575478cde19e830e0Chris Lattner      CmdArgs.push_back("-MT");
282f7ccbad5d9949e7ddd1cbef43d482553b811e026Dylan Noblesmith      SmallString<128> Quoted;
2837e4953e5c60409007545288f14b430bd23d68570Daniel Dunbar      QuoteTarget(A->getValue(Args), Quoted);
2843edbeb78fe5ea7fffea7a94575478cde19e830e0Chris Lattner      CmdArgs.push_back(Args.MakeArgString(Quoted));
2853edbeb78fe5ea7fffea7a94575478cde19e830e0Chris Lattner
2863edbeb78fe5ea7fffea7a94575478cde19e830e0Chris Lattner    // -MT flag - no change
2873edbeb78fe5ea7fffea7a94575478cde19e830e0Chris Lattner    } else {
2887e4953e5c60409007545288f14b430bd23d68570Daniel Dunbar      A->render(Args, CmdArgs);
2893edbeb78fe5ea7fffea7a94575478cde19e830e0Chris Lattner    }
2903edbeb78fe5ea7fffea7a94575478cde19e830e0Chris Lattner  }
291c21c485b4fb58ef5d55cf3e523263dd824a2ace4Daniel Dunbar
292df91ef3d6c55692a0236f67b6c6b134a3bf84098Douglas Gregor  // Add -i* options, and automatically translate to
293df91ef3d6c55692a0236f67b6c6b134a3bf84098Douglas Gregor  // -include-pch/-include-pth for transparent PCH support. It's
294df91ef3d6c55692a0236f67b6c6b134a3bf84098Douglas Gregor  // wonky, but we include looking for .gch so we can support seamless
295df91ef3d6c55692a0236f67b6c6b134a3bf84098Douglas Gregor  // replacement into a build system already set up to be generating
296df91ef3d6c55692a0236f67b6c6b134a3bf84098Douglas Gregor  // .gch files.
297990142a23e41392ef7c0f14db4c0fcac67311cdfArgyrios Kyrtzidis  bool RenderedImplicitInclude = false;
298cdd9686b890ebdc10039ae256ef4c9dfb5ebacb7Daniel Dunbar  for (arg_iterator it = Args.filtered_begin(options::OPT_clang_i_Group),
299cdd9686b890ebdc10039ae256ef4c9dfb5ebacb7Daniel Dunbar         ie = Args.filtered_end(); it != ie; ++it) {
300cdd9686b890ebdc10039ae256ef4c9dfb5ebacb7Daniel Dunbar    const Arg *A = it;
301c21c485b4fb58ef5d55cf3e523263dd824a2ace4Daniel Dunbar
302c21c485b4fb58ef5d55cf3e523263dd824a2ace4Daniel Dunbar    if (A->getOption().matches(options::OPT_include)) {
303990142a23e41392ef7c0f14db4c0fcac67311cdfArgyrios Kyrtzidis      bool IsFirstImplicitInclude = !RenderedImplicitInclude;
304990142a23e41392ef7c0f14db4c0fcac67311cdfArgyrios Kyrtzidis      RenderedImplicitInclude = true;
305990142a23e41392ef7c0f14db4c0fcac67311cdfArgyrios Kyrtzidis
306e5c35377020d6c38d16434c9f373a5fa9bb4f2ebArgyrios Kyrtzidis      // Use PCH if the user requested it.
3070ebd9321ba380471010341f24c874f46f56e7581Daniel Dunbar      bool UsePCH = D.CCCUsePCH;
3080ebd9321ba380471010341f24c874f46f56e7581Daniel Dunbar
309c21c485b4fb58ef5d55cf3e523263dd824a2ace4Daniel Dunbar      bool FoundPTH = false;
310df91ef3d6c55692a0236f67b6c6b134a3bf84098Douglas Gregor      bool FoundPCH = false;
311c21c485b4fb58ef5d55cf3e523263dd824a2ace4Daniel Dunbar      llvm::sys::Path P(A->getValue(Args));
31232bef4edba854303800b3b01cb49a282e5da4f69Michael J. Spencer      bool Exists;
3130ebd9321ba380471010341f24c874f46f56e7581Daniel Dunbar      if (UsePCH) {
314df91ef3d6c55692a0236f67b6c6b134a3bf84098Douglas Gregor        P.appendSuffix("pch");
31532bef4edba854303800b3b01cb49a282e5da4f69Michael J. Spencer        if (!llvm::sys::fs::exists(P.str(), Exists) && Exists)
316df91ef3d6c55692a0236f67b6c6b134a3bf84098Douglas Gregor          FoundPCH = true;
3171eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump        else
318df91ef3d6c55692a0236f67b6c6b134a3bf84098Douglas Gregor          P.eraseSuffix();
319df91ef3d6c55692a0236f67b6c6b134a3bf84098Douglas Gregor      }
320df91ef3d6c55692a0236f67b6c6b134a3bf84098Douglas Gregor
321df91ef3d6c55692a0236f67b6c6b134a3bf84098Douglas Gregor      if (!FoundPCH) {
322df91ef3d6c55692a0236f67b6c6b134a3bf84098Douglas Gregor        P.appendSuffix("pth");
32332bef4edba854303800b3b01cb49a282e5da4f69Michael J. Spencer        if (!llvm::sys::fs::exists(P.str(), Exists) && Exists)
324c21c485b4fb58ef5d55cf3e523263dd824a2ace4Daniel Dunbar          FoundPTH = true;
325df91ef3d6c55692a0236f67b6c6b134a3bf84098Douglas Gregor        else
326df91ef3d6c55692a0236f67b6c6b134a3bf84098Douglas Gregor          P.eraseSuffix();
3271eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump      }
3281eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump
329df91ef3d6c55692a0236f67b6c6b134a3bf84098Douglas Gregor      if (!FoundPCH && !FoundPTH) {
330df91ef3d6c55692a0236f67b6c6b134a3bf84098Douglas Gregor        P.appendSuffix("gch");
33132bef4edba854303800b3b01cb49a282e5da4f69Michael J. Spencer        if (!llvm::sys::fs::exists(P.str(), Exists) && Exists) {
3320ebd9321ba380471010341f24c874f46f56e7581Daniel Dunbar          FoundPCH = UsePCH;
3330ebd9321ba380471010341f24c874f46f56e7581Daniel Dunbar          FoundPTH = !UsePCH;
334df91ef3d6c55692a0236f67b6c6b134a3bf84098Douglas Gregor        }
3351eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump        else
336df91ef3d6c55692a0236f67b6c6b134a3bf84098Douglas Gregor          P.eraseSuffix();
337c21c485b4fb58ef5d55cf3e523263dd824a2ace4Daniel Dunbar      }
338c21c485b4fb58ef5d55cf3e523263dd824a2ace4Daniel Dunbar
339df91ef3d6c55692a0236f67b6c6b134a3bf84098Douglas Gregor      if (FoundPCH || FoundPTH) {
340990142a23e41392ef7c0f14db4c0fcac67311cdfArgyrios Kyrtzidis        if (IsFirstImplicitInclude) {
341990142a23e41392ef7c0f14db4c0fcac67311cdfArgyrios Kyrtzidis          A->claim();
342990142a23e41392ef7c0f14db4c0fcac67311cdfArgyrios Kyrtzidis          if (UsePCH)
343990142a23e41392ef7c0f14db4c0fcac67311cdfArgyrios Kyrtzidis            CmdArgs.push_back("-include-pch");
344990142a23e41392ef7c0f14db4c0fcac67311cdfArgyrios Kyrtzidis          else
345990142a23e41392ef7c0f14db4c0fcac67311cdfArgyrios Kyrtzidis            CmdArgs.push_back("-include-pth");
346990142a23e41392ef7c0f14db4c0fcac67311cdfArgyrios Kyrtzidis          CmdArgs.push_back(Args.MakeArgString(P.str()));
347990142a23e41392ef7c0f14db4c0fcac67311cdfArgyrios Kyrtzidis          continue;
348990142a23e41392ef7c0f14db4c0fcac67311cdfArgyrios Kyrtzidis        } else {
349990142a23e41392ef7c0f14db4c0fcac67311cdfArgyrios Kyrtzidis          // Ignore the PCH if not first on command line and emit warning.
3505f9e272e632e951b1efe824cd16acb4d96077930Chris Lattner          D.Diag(diag::warn_drv_pch_not_first_include)
351990142a23e41392ef7c0f14db4c0fcac67311cdfArgyrios Kyrtzidis              << P.str() << A->getAsString(Args);
352990142a23e41392ef7c0f14db4c0fcac67311cdfArgyrios Kyrtzidis        }
353c21c485b4fb58ef5d55cf3e523263dd824a2ace4Daniel Dunbar      }
354c21c485b4fb58ef5d55cf3e523263dd824a2ace4Daniel Dunbar    }
355c21c485b4fb58ef5d55cf3e523263dd824a2ace4Daniel Dunbar
356c21c485b4fb58ef5d55cf3e523263dd824a2ace4Daniel Dunbar    // Not translated, render as usual.
357c21c485b4fb58ef5d55cf3e523263dd824a2ace4Daniel Dunbar    A->claim();
358c21c485b4fb58ef5d55cf3e523263dd824a2ace4Daniel Dunbar    A->render(Args, CmdArgs);
359c21c485b4fb58ef5d55cf3e523263dd824a2ace4Daniel Dunbar  }
360c21c485b4fb58ef5d55cf3e523263dd824a2ace4Daniel Dunbar
361c21c485b4fb58ef5d55cf3e523263dd824a2ace4Daniel Dunbar  Args.AddAllArgs(CmdArgs, options::OPT_D, options::OPT_U);
36265e02fa80e1c185f18e5f81cefc30d75383a7301Douglas Gregor  Args.AddAllArgs(CmdArgs, options::OPT_I_Group, options::OPT_F,
36365e02fa80e1c185f18e5f81cefc30d75383a7301Douglas Gregor                  options::OPT_index_header_map);
364c21c485b4fb58ef5d55cf3e523263dd824a2ace4Daniel Dunbar
365c21c485b4fb58ef5d55cf3e523263dd824a2ace4Daniel Dunbar  // Add -Wp, and -Xassembler if using the preprocessor.
366c21c485b4fb58ef5d55cf3e523263dd824a2ace4Daniel Dunbar
367c21c485b4fb58ef5d55cf3e523263dd824a2ace4Daniel Dunbar  // FIXME: There is a very unfortunate problem here, some troubled
368c21c485b4fb58ef5d55cf3e523263dd824a2ace4Daniel Dunbar  // souls abuse -Wp, to pass preprocessor options in gcc syntax. To
369c21c485b4fb58ef5d55cf3e523263dd824a2ace4Daniel Dunbar  // really support that we would have to parse and then translate
370c21c485b4fb58ef5d55cf3e523263dd824a2ace4Daniel Dunbar  // those options. :(
371c21c485b4fb58ef5d55cf3e523263dd824a2ace4Daniel Dunbar  Args.AddAllArgValues(CmdArgs, options::OPT_Wp_COMMA,
372c21c485b4fb58ef5d55cf3e523263dd824a2ace4Daniel Dunbar                       options::OPT_Xpreprocessor);
373607d7f6d8f21066cc48bbe2c51e6ca412a00943fDaniel Dunbar
374607d7f6d8f21066cc48bbe2c51e6ca412a00943fDaniel Dunbar  // -I- is a deprecated GCC feature, reject it.
375607d7f6d8f21066cc48bbe2c51e6ca412a00943fDaniel Dunbar  if (Arg *A = Args.getLastArg(options::OPT_I_))
3765f9e272e632e951b1efe824cd16acb4d96077930Chris Lattner    D.Diag(diag::err_drv_I_dash_not_supported) << A->getAsString(Args);
377feee58ce268765742e41c473c8648607fd4831a7Chandler Carruth
378feee58ce268765742e41c473c8648607fd4831a7Chandler Carruth  // If we have a --sysroot, and don't have an explicit -isysroot flag, add an
379feee58ce268765742e41c473c8648607fd4831a7Chandler Carruth  // -isysroot to the CC1 invocation.
3804762a2da74875d2ae94e0d77d38ed964816cce36Sebastian Pop  StringRef sysroot = C.getSysRoot();
3814762a2da74875d2ae94e0d77d38ed964816cce36Sebastian Pop  if (sysroot != "") {
382feee58ce268765742e41c473c8648607fd4831a7Chandler Carruth    if (!Args.hasArg(options::OPT_isysroot)) {
383feee58ce268765742e41c473c8648607fd4831a7Chandler Carruth      CmdArgs.push_back("-isysroot");
3844762a2da74875d2ae94e0d77d38ed964816cce36Sebastian Pop      CmdArgs.push_back(C.getArgs().MakeArgString(sysroot));
385feee58ce268765742e41c473c8648607fd4831a7Chandler Carruth    }
386feee58ce268765742e41c473c8648607fd4831a7Chandler Carruth  }
3878ee51ef211bfed9ce04bc93835e19aee014f2faeDouglas Gregor
3888ee51ef211bfed9ce04bc93835e19aee014f2faeDouglas Gregor  // If a module path was provided, pass it along. Otherwise, use a temporary
3898ee51ef211bfed9ce04bc93835e19aee014f2faeDouglas Gregor  // directory.
3908ee51ef211bfed9ce04bc93835e19aee014f2faeDouglas Gregor  if (Arg *A = Args.getLastArg(options::OPT_fmodule_cache_path)) {
3918ee51ef211bfed9ce04bc93835e19aee014f2faeDouglas Gregor    A->claim();
3928ee51ef211bfed9ce04bc93835e19aee014f2faeDouglas Gregor    A->render(Args, CmdArgs);
3938ee51ef211bfed9ce04bc93835e19aee014f2faeDouglas Gregor  } else {
394f7ccbad5d9949e7ddd1cbef43d482553b811e026Dylan Noblesmith    SmallString<128> DefaultModuleCache;
3958ee51ef211bfed9ce04bc93835e19aee014f2faeDouglas Gregor    llvm::sys::path::system_temp_directory(/*erasedOnReboot=*/false,
3968ee51ef211bfed9ce04bc93835e19aee014f2faeDouglas Gregor                                           DefaultModuleCache);
3978ee51ef211bfed9ce04bc93835e19aee014f2faeDouglas Gregor    llvm::sys::path::append(DefaultModuleCache, "clang-module-cache");
3988ee51ef211bfed9ce04bc93835e19aee014f2faeDouglas Gregor    CmdArgs.push_back("-fmodule-cache-path");
3998ee51ef211bfed9ce04bc93835e19aee014f2faeDouglas Gregor    CmdArgs.push_back(Args.MakeArgString(DefaultModuleCache));
4008ee51ef211bfed9ce04bc93835e19aee014f2faeDouglas Gregor  }
401fba18aa8f2cd1994dc65e8cb9f4be201c560dc0bDouglas Gregor
40247adebef0df6dce752fe9a45e9190e8005b5d07cBenjamin Kramer  // Parse additional include paths from environment variables.
403b5870e77a9a872e2a84e904a332bb60bbe207da9Chandler Carruth  // FIXME: We should probably sink the logic for handling these from the
404b5870e77a9a872e2a84e904a332bb60bbe207da9Chandler Carruth  // frontend into the driver. It will allow deleting 4 otherwise unused flags.
40547adebef0df6dce752fe9a45e9190e8005b5d07cBenjamin Kramer  // CPATH - included following the user specified includes (but prior to
40647adebef0df6dce752fe9a45e9190e8005b5d07cBenjamin Kramer  // builtin and standard includes).
4073d7171582b026e043916fc5d65a7d7aada547206Bill Wendling  addDirectoryList(Args, CmdArgs, "-I", "CPATH");
40847adebef0df6dce752fe9a45e9190e8005b5d07cBenjamin Kramer  // C_INCLUDE_PATH - system includes enabled when compiling C.
4093d7171582b026e043916fc5d65a7d7aada547206Bill Wendling  addDirectoryList(Args, CmdArgs, "-c-isystem", "C_INCLUDE_PATH");
41047adebef0df6dce752fe9a45e9190e8005b5d07cBenjamin Kramer  // CPLUS_INCLUDE_PATH - system includes enabled when compiling C++.
4113d7171582b026e043916fc5d65a7d7aada547206Bill Wendling  addDirectoryList(Args, CmdArgs, "-cxx-isystem", "CPLUS_INCLUDE_PATH");
41247adebef0df6dce752fe9a45e9190e8005b5d07cBenjamin Kramer  // OBJC_INCLUDE_PATH - system includes enabled when compiling ObjC.
4133d7171582b026e043916fc5d65a7d7aada547206Bill Wendling  addDirectoryList(Args, CmdArgs, "-objc-isystem", "OBJC_INCLUDE_PATH");
41447adebef0df6dce752fe9a45e9190e8005b5d07cBenjamin Kramer  // OBJCPLUS_INCLUDE_PATH - system includes enabled when compiling ObjC++.
4153d7171582b026e043916fc5d65a7d7aada547206Bill Wendling  addDirectoryList(Args, CmdArgs, "-objcxx-isystem", "OBJCPLUS_INCLUDE_PATH");
41688491fc6dfc7ebbd856d57a9acb49fb83077d6c8Chandler Carruth
41788491fc6dfc7ebbd856d57a9acb49fb83077d6c8Chandler Carruth  // Add C++ include arguments, if needed.
418a461442ed99883d2760833592f65e1e95a4889bbChandler Carruth  if (types::isCXX(Inputs[0].getType()))
4197ffa0325bd61f656697f99434334d425c39af309Chandler Carruth    getToolChain().AddClangCXXStdlibIncludeArgs(Args, CmdArgs);
4207d7e9f963a4977e36efb90fd9c369f33ced1a95aChandler Carruth
4217d7e9f963a4977e36efb90fd9c369f33ced1a95aChandler Carruth  // Add system include arguments.
4227d7e9f963a4977e36efb90fd9c369f33ced1a95aChandler Carruth  getToolChain().AddClangSystemIncludeArgs(Args, CmdArgs);
423c21c485b4fb58ef5d55cf3e523263dd824a2ace4Daniel Dunbar}
424c21c485b4fb58ef5d55cf3e523263dd824a2ace4Daniel Dunbar
425fc8f0e14ad142ed811e90fbd9a30e419e301c717Chris Lattner/// getARMTargetCPU - Get the (LLVM) name of the ARM cpu we are targeting.
426728a512753d85a6ccaae34e81385c8665c2de0e1Daniel Dunbar//
427728a512753d85a6ccaae34e81385c8665c2de0e1Daniel Dunbar// FIXME: tblgen this.
428bcd6df662471e0ac2d3d85fdba09b1295c2fc468Rafael Espindolastatic const char *getARMTargetCPU(const ArgList &Args,
429bcd6df662471e0ac2d3d85fdba09b1295c2fc468Rafael Espindola                                   const llvm::Triple &Triple) {
430728a512753d85a6ccaae34e81385c8665c2de0e1Daniel Dunbar  // FIXME: Warn on inconsistent use of -mcpu and -march.
431b163ef7e7a5d904ef0962a7c38c460be083c4d63Daniel Dunbar
432b163ef7e7a5d904ef0962a7c38c460be083c4d63Daniel Dunbar  // If we have -mcpu=, use that.
433b163ef7e7a5d904ef0962a7c38c460be083c4d63Daniel Dunbar  if (Arg *A = Args.getLastArg(options::OPT_mcpu_EQ))
434b163ef7e7a5d904ef0962a7c38c460be083c4d63Daniel Dunbar    return A->getValue(Args);
435b163ef7e7a5d904ef0962a7c38c460be083c4d63Daniel Dunbar
4365f9e272e632e951b1efe824cd16acb4d96077930Chris Lattner  StringRef MArch;
437b163ef7e7a5d904ef0962a7c38c460be083c4d63Daniel Dunbar  if (Arg *A = Args.getLastArg(options::OPT_march_EQ)) {
438bcd6df662471e0ac2d3d85fdba09b1295c2fc468Rafael Espindola    // Otherwise, if we have -march= choose the base CPU for that arch.
439bcd6df662471e0ac2d3d85fdba09b1295c2fc468Rafael Espindola    MArch = A->getValue(Args);
440bcd6df662471e0ac2d3d85fdba09b1295c2fc468Rafael Espindola  } else {
441bcd6df662471e0ac2d3d85fdba09b1295c2fc468Rafael Espindola    // Otherwise, use the Arch from the triple.
442bcd6df662471e0ac2d3d85fdba09b1295c2fc468Rafael Espindola    MArch = Triple.getArchName();
443b163ef7e7a5d904ef0962a7c38c460be083c4d63Daniel Dunbar  }
444b163ef7e7a5d904ef0962a7c38c460be083c4d63Daniel Dunbar
445ae1aee6683d486d1c92e51b2a5da6ba75f633308Chad Rosier  return llvm::StringSwitch<const char *>(MArch)
446ae1aee6683d486d1c92e51b2a5da6ba75f633308Chad Rosier    .Cases("armv2", "armv2a","arm2")
447ae1aee6683d486d1c92e51b2a5da6ba75f633308Chad Rosier    .Case("armv3", "arm6")
448ae1aee6683d486d1c92e51b2a5da6ba75f633308Chad Rosier    .Case("armv3m", "arm7m")
449ae1aee6683d486d1c92e51b2a5da6ba75f633308Chad Rosier    .Cases("armv4", "armv4t", "arm7tdmi")
450ae1aee6683d486d1c92e51b2a5da6ba75f633308Chad Rosier    .Cases("armv5", "armv5t", "arm10tdmi")
4514add84f83f4505304ab3f94ebfa6bbc0be60058dEvgeniy Stepanov    .Cases("armv5e", "armv5te", "arm1022e")
452ae1aee6683d486d1c92e51b2a5da6ba75f633308Chad Rosier    .Case("armv5tej", "arm926ej-s")
453ae1aee6683d486d1c92e51b2a5da6ba75f633308Chad Rosier    .Cases("armv6", "armv6k", "arm1136jf-s")
454ae1aee6683d486d1c92e51b2a5da6ba75f633308Chad Rosier    .Case("armv6j", "arm1136j-s")
455ae1aee6683d486d1c92e51b2a5da6ba75f633308Chad Rosier    .Cases("armv6z", "armv6zk", "arm1176jzf-s")
456ae1aee6683d486d1c92e51b2a5da6ba75f633308Chad Rosier    .Case("armv6t2", "arm1156t2-s")
457ae1aee6683d486d1c92e51b2a5da6ba75f633308Chad Rosier    .Cases("armv7", "armv7a", "armv7-a", "cortex-a8")
458ae1aee6683d486d1c92e51b2a5da6ba75f633308Chad Rosier    .Cases("armv7r", "armv7-r", "cortex-r4")
459ae1aee6683d486d1c92e51b2a5da6ba75f633308Chad Rosier    .Cases("armv7m", "armv7-m", "cortex-m3")
460ae1aee6683d486d1c92e51b2a5da6ba75f633308Chad Rosier    .Case("ep9312", "ep9312")
461ae1aee6683d486d1c92e51b2a5da6ba75f633308Chad Rosier    .Case("iwmmxt", "iwmmxt")
462ae1aee6683d486d1c92e51b2a5da6ba75f633308Chad Rosier    .Case("xscale", "xscale")
463ae1aee6683d486d1c92e51b2a5da6ba75f633308Chad Rosier    .Cases("armv6m", "armv6-m", "cortex-m0")
464ae1aee6683d486d1c92e51b2a5da6ba75f633308Chad Rosier    // If all else failed, return the most base CPU LLVM supports.
465ae1aee6683d486d1c92e51b2a5da6ba75f633308Chad Rosier    .Default("arm7tdmi");
466b163ef7e7a5d904ef0962a7c38c460be083c4d63Daniel Dunbar}
467b163ef7e7a5d904ef0962a7c38c460be083c4d63Daniel Dunbar
4681d65e4be6f22f7e4b4974efbaef92fa3454f1ec8Daniel Dunbar/// getLLVMArchSuffixForARM - Get the LLVM arch name to use for a particular
469728a512753d85a6ccaae34e81385c8665c2de0e1Daniel Dunbar/// CPU.
470728a512753d85a6ccaae34e81385c8665c2de0e1Daniel Dunbar//
471728a512753d85a6ccaae34e81385c8665c2de0e1Daniel Dunbar// FIXME: This is redundant with -mcpu, why does LLVM use this.
472728a512753d85a6ccaae34e81385c8665c2de0e1Daniel Dunbar// FIXME: tblgen this, or kill it!
4735f9e272e632e951b1efe824cd16acb4d96077930Chris Lattnerstatic const char *getLLVMArchSuffixForARM(StringRef CPU) {
474ae1aee6683d486d1c92e51b2a5da6ba75f633308Chad Rosier  return llvm::StringSwitch<const char *>(CPU)
475ae1aee6683d486d1c92e51b2a5da6ba75f633308Chad Rosier    .Cases("arm7tdmi", "arm7tdmi-s", "arm710t", "v4t")
476ae1aee6683d486d1c92e51b2a5da6ba75f633308Chad Rosier    .Cases("arm720t", "arm9", "arm9tdmi", "v4t")
477ae1aee6683d486d1c92e51b2a5da6ba75f633308Chad Rosier    .Cases("arm920", "arm920t", "arm922t", "v4t")
478ae1aee6683d486d1c92e51b2a5da6ba75f633308Chad Rosier    .Cases("arm940t", "ep9312","v4t")
479ae1aee6683d486d1c92e51b2a5da6ba75f633308Chad Rosier    .Cases("arm10tdmi",  "arm1020t", "v5")
480ae1aee6683d486d1c92e51b2a5da6ba75f633308Chad Rosier    .Cases("arm9e",  "arm926ej-s",  "arm946e-s", "v5e")
481ae1aee6683d486d1c92e51b2a5da6ba75f633308Chad Rosier    .Cases("arm966e-s",  "arm968e-s",  "arm10e", "v5e")
482ae1aee6683d486d1c92e51b2a5da6ba75f633308Chad Rosier    .Cases("arm1020e",  "arm1022e",  "xscale", "iwmmxt", "v5e")
483ae1aee6683d486d1c92e51b2a5da6ba75f633308Chad Rosier    .Cases("arm1136j-s",  "arm1136jf-s",  "arm1176jz-s", "v6")
484ae1aee6683d486d1c92e51b2a5da6ba75f633308Chad Rosier    .Cases("arm1176jzf-s",  "mpcorenovfp",  "mpcore", "v6")
485ae1aee6683d486d1c92e51b2a5da6ba75f633308Chad Rosier    .Cases("arm1156t2-s",  "arm1156t2f-s", "v6t2")
486ae1aee6683d486d1c92e51b2a5da6ba75f633308Chad Rosier    .Cases("cortex-a8", "cortex-a9", "v7")
48757f6d1946b1026eb4d0bbc1904b2833b254d4caaBob Wilson    .Case("cortex-m3", "v7m")
4886903313102c4e1ca598305850cc209b62711b1b6Jim Grosbach    .Case("cortex-m4", "v7m")
48957f6d1946b1026eb4d0bbc1904b2833b254d4caaBob Wilson    .Case("cortex-m0", "v6m")
490ae1aee6683d486d1c92e51b2a5da6ba75f633308Chad Rosier    .Default("");
491728a512753d85a6ccaae34e81385c8665c2de0e1Daniel Dunbar}
492728a512753d85a6ccaae34e81385c8665c2de0e1Daniel Dunbar
4931f95e6567faab67f4363d650f73121359c4bdbabDaniel Dunbar// FIXME: Move to target hook.
4941f95e6567faab67f4363d650f73121359c4bdbabDaniel Dunbarstatic bool isSignedCharDefault(const llvm::Triple &Triple) {
4951f95e6567faab67f4363d650f73121359c4bdbabDaniel Dunbar  switch (Triple.getArch()) {
4961f95e6567faab67f4363d650f73121359c4bdbabDaniel Dunbar  default:
4971f95e6567faab67f4363d650f73121359c4bdbabDaniel Dunbar    return true;
4981f95e6567faab67f4363d650f73121359c4bdbabDaniel Dunbar
4995b4e7b11e745329d8a55fd56504450dede1b2100Jim Grosbach  case llvm::Triple::arm:
5001f95e6567faab67f4363d650f73121359c4bdbabDaniel Dunbar  case llvm::Triple::ppc:
5011f95e6567faab67f4363d650f73121359c4bdbabDaniel Dunbar  case llvm::Triple::ppc64:
502905c45f15a25598620d19160c139c6b785aeea89Bob Wilson    if (Triple.isOSDarwin())
5031f95e6567faab67f4363d650f73121359c4bdbabDaniel Dunbar      return true;
5041f95e6567faab67f4363d650f73121359c4bdbabDaniel Dunbar    return false;
5051f95e6567faab67f4363d650f73121359c4bdbabDaniel Dunbar  }
5061f95e6567faab67f4363d650f73121359c4bdbabDaniel Dunbar}
5071f95e6567faab67f4363d650f73121359c4bdbabDaniel Dunbar
508993172757762436d22b2dfc74e7cca1bade1a7bfChad Rosier// Handle -mfpu=.
509993172757762436d22b2dfc74e7cca1bade1a7bfChad Rosier//
510993172757762436d22b2dfc74e7cca1bade1a7bfChad Rosier// FIXME: Centralize feature selection, defaulting shouldn't be also in the
511993172757762436d22b2dfc74e7cca1bade1a7bfChad Rosier// frontend target.
512993172757762436d22b2dfc74e7cca1bade1a7bfChad Rosierstatic void addFPUArgs(const Driver &D, const Arg *A, const ArgList &Args,
513993172757762436d22b2dfc74e7cca1bade1a7bfChad Rosier                       ArgStringList &CmdArgs) {
514993172757762436d22b2dfc74e7cca1bade1a7bfChad Rosier  StringRef FPU = A->getValue(Args);
515993172757762436d22b2dfc74e7cca1bade1a7bfChad Rosier
516993172757762436d22b2dfc74e7cca1bade1a7bfChad Rosier  // Set the target features based on the FPU.
517993172757762436d22b2dfc74e7cca1bade1a7bfChad Rosier  if (FPU == "fpa" || FPU == "fpe2" || FPU == "fpe3" || FPU == "maverick") {
518993172757762436d22b2dfc74e7cca1bade1a7bfChad Rosier    // Disable any default FPU support.
519993172757762436d22b2dfc74e7cca1bade1a7bfChad Rosier    CmdArgs.push_back("-target-feature");
520993172757762436d22b2dfc74e7cca1bade1a7bfChad Rosier    CmdArgs.push_back("-vfp2");
521993172757762436d22b2dfc74e7cca1bade1a7bfChad Rosier    CmdArgs.push_back("-target-feature");
522993172757762436d22b2dfc74e7cca1bade1a7bfChad Rosier    CmdArgs.push_back("-vfp3");
523993172757762436d22b2dfc74e7cca1bade1a7bfChad Rosier    CmdArgs.push_back("-target-feature");
524993172757762436d22b2dfc74e7cca1bade1a7bfChad Rosier    CmdArgs.push_back("-neon");
525993172757762436d22b2dfc74e7cca1bade1a7bfChad Rosier  } else if (FPU == "vfp3-d16" || FPU == "vfpv3-d16") {
526993172757762436d22b2dfc74e7cca1bade1a7bfChad Rosier    CmdArgs.push_back("-target-feature");
527993172757762436d22b2dfc74e7cca1bade1a7bfChad Rosier    CmdArgs.push_back("+vfp3");
528993172757762436d22b2dfc74e7cca1bade1a7bfChad Rosier    CmdArgs.push_back("-target-feature");
529993172757762436d22b2dfc74e7cca1bade1a7bfChad Rosier    CmdArgs.push_back("+d16");
530993172757762436d22b2dfc74e7cca1bade1a7bfChad Rosier    CmdArgs.push_back("-target-feature");
531993172757762436d22b2dfc74e7cca1bade1a7bfChad Rosier    CmdArgs.push_back("-neon");
532993172757762436d22b2dfc74e7cca1bade1a7bfChad Rosier  } else if (FPU == "vfp") {
533993172757762436d22b2dfc74e7cca1bade1a7bfChad Rosier    CmdArgs.push_back("-target-feature");
534993172757762436d22b2dfc74e7cca1bade1a7bfChad Rosier    CmdArgs.push_back("+vfp2");
535993172757762436d22b2dfc74e7cca1bade1a7bfChad Rosier    CmdArgs.push_back("-target-feature");
536993172757762436d22b2dfc74e7cca1bade1a7bfChad Rosier    CmdArgs.push_back("-neon");
537993172757762436d22b2dfc74e7cca1bade1a7bfChad Rosier  } else if (FPU == "vfp3" || FPU == "vfpv3") {
538993172757762436d22b2dfc74e7cca1bade1a7bfChad Rosier    CmdArgs.push_back("-target-feature");
539993172757762436d22b2dfc74e7cca1bade1a7bfChad Rosier    CmdArgs.push_back("+vfp3");
540993172757762436d22b2dfc74e7cca1bade1a7bfChad Rosier    CmdArgs.push_back("-target-feature");
541993172757762436d22b2dfc74e7cca1bade1a7bfChad Rosier    CmdArgs.push_back("-neon");
542993172757762436d22b2dfc74e7cca1bade1a7bfChad Rosier  } else if (FPU == "neon") {
543993172757762436d22b2dfc74e7cca1bade1a7bfChad Rosier    CmdArgs.push_back("-target-feature");
544993172757762436d22b2dfc74e7cca1bade1a7bfChad Rosier    CmdArgs.push_back("+neon");
545993172757762436d22b2dfc74e7cca1bade1a7bfChad Rosier  } else
546993172757762436d22b2dfc74e7cca1bade1a7bfChad Rosier    D.Diag(diag::err_drv_clang_unsupported) << A->getAsString(Args);
547993172757762436d22b2dfc74e7cca1bade1a7bfChad Rosier}
548993172757762436d22b2dfc74e7cca1bade1a7bfChad Rosier
5497a938fa66be42710b034a79106de337a275fd265Chad Rosier// Handle -mfpmath=.
5507a938fa66be42710b034a79106de337a275fd265Chad Rosierstatic void addFPMathArgs(const Driver &D, const Arg *A, const ArgList &Args,
55130fe6baf95662ea82a794a8fe3b76998713c183dChad Rosier                          ArgStringList &CmdArgs, StringRef CPU) {
5527a938fa66be42710b034a79106de337a275fd265Chad Rosier  StringRef FPMath = A->getValue(Args);
5537a938fa66be42710b034a79106de337a275fd265Chad Rosier
5547a938fa66be42710b034a79106de337a275fd265Chad Rosier  // Set the target features based on the FPMath.
5557a938fa66be42710b034a79106de337a275fd265Chad Rosier  if (FPMath == "neon") {
5567a938fa66be42710b034a79106de337a275fd265Chad Rosier    CmdArgs.push_back("-target-feature");
5577a938fa66be42710b034a79106de337a275fd265Chad Rosier    CmdArgs.push_back("+neonfp");
55830fe6baf95662ea82a794a8fe3b76998713c183dChad Rosier
55930fe6baf95662ea82a794a8fe3b76998713c183dChad Rosier    if (CPU != "cortex-a8" && CPU != "cortex-a9" && CPU != "cortex-a9-mp")
56030fe6baf95662ea82a794a8fe3b76998713c183dChad Rosier      D.Diag(diag::err_drv_invalid_feature) << "-mfpmath=neon" << CPU;
56130fe6baf95662ea82a794a8fe3b76998713c183dChad Rosier
5627a938fa66be42710b034a79106de337a275fd265Chad Rosier  } else if (FPMath == "vfp" || FPMath == "vfp2" || FPMath == "vfp3" ||
5637a938fa66be42710b034a79106de337a275fd265Chad Rosier             FPMath == "vfp4") {
5647a938fa66be42710b034a79106de337a275fd265Chad Rosier    CmdArgs.push_back("-target-feature");
5657a938fa66be42710b034a79106de337a275fd265Chad Rosier    CmdArgs.push_back("-neonfp");
56630fe6baf95662ea82a794a8fe3b76998713c183dChad Rosier
56730fe6baf95662ea82a794a8fe3b76998713c183dChad Rosier    // FIXME: Add warnings when disabling a feature not present for a given CPU.
5687a938fa66be42710b034a79106de337a275fd265Chad Rosier  } else
5697a938fa66be42710b034a79106de337a275fd265Chad Rosier    D.Diag(diag::err_drv_clang_unsupported) << A->getAsString(Args);
5707a938fa66be42710b034a79106de337a275fd265Chad Rosier}
5717a938fa66be42710b034a79106de337a275fd265Chad Rosier
572e2571793ba6fc13e5525b8d7224812f99842a1a4Anton Korobeynikov// Select the float ABI as determined by -msoft-float, -mhard-float, and
573e2571793ba6fc13e5525b8d7224812f99842a1a4Anton Korobeynikov// -mfloat-abi=.
574e2571793ba6fc13e5525b8d7224812f99842a1a4Anton Korobeynikovstatic StringRef getARMFloatABI(const Driver &D,
575e2571793ba6fc13e5525b8d7224812f99842a1a4Anton Korobeynikov                                const ArgList &Args,
576e2571793ba6fc13e5525b8d7224812f99842a1a4Anton Korobeynikov                                const llvm::Triple &Triple) {
5775f9e272e632e951b1efe824cd16acb4d96077930Chris Lattner  StringRef FloatABI;
578cbd1933f83e2332b2d7add10459f80cc4e7eb7bfDaniel Dunbar  if (Arg *A = Args.getLastArg(options::OPT_msoft_float,
579cbd1933f83e2332b2d7add10459f80cc4e7eb7bfDaniel Dunbar                               options::OPT_mhard_float,
580cbd1933f83e2332b2d7add10459f80cc4e7eb7bfDaniel Dunbar                               options::OPT_mfloat_abi_EQ)) {
581cbd1933f83e2332b2d7add10459f80cc4e7eb7bfDaniel Dunbar    if (A->getOption().matches(options::OPT_msoft_float))
582cbd1933f83e2332b2d7add10459f80cc4e7eb7bfDaniel Dunbar      FloatABI = "soft";
583cbd1933f83e2332b2d7add10459f80cc4e7eb7bfDaniel Dunbar    else if (A->getOption().matches(options::OPT_mhard_float))
584cbd1933f83e2332b2d7add10459f80cc4e7eb7bfDaniel Dunbar      FloatABI = "hard";
585cbd1933f83e2332b2d7add10459f80cc4e7eb7bfDaniel Dunbar    else {
586cbd1933f83e2332b2d7add10459f80cc4e7eb7bfDaniel Dunbar      FloatABI = A->getValue(Args);
587cbd1933f83e2332b2d7add10459f80cc4e7eb7bfDaniel Dunbar      if (FloatABI != "soft" && FloatABI != "softfp" && FloatABI != "hard") {
5885f9e272e632e951b1efe824cd16acb4d96077930Chris Lattner        D.Diag(diag::err_drv_invalid_mfloat_abi)
589cbd1933f83e2332b2d7add10459f80cc4e7eb7bfDaniel Dunbar          << A->getAsString(Args);
590cbd1933f83e2332b2d7add10459f80cc4e7eb7bfDaniel Dunbar        FloatABI = "soft";
591cbd1933f83e2332b2d7add10459f80cc4e7eb7bfDaniel Dunbar      }
592cbd1933f83e2332b2d7add10459f80cc4e7eb7bfDaniel Dunbar    }
593cbd1933f83e2332b2d7add10459f80cc4e7eb7bfDaniel Dunbar  }
594cbd1933f83e2332b2d7add10459f80cc4e7eb7bfDaniel Dunbar
595cbd1933f83e2332b2d7add10459f80cc4e7eb7bfDaniel Dunbar  // If unspecified, choose the default based on the platform.
596cbd1933f83e2332b2d7add10459f80cc4e7eb7bfDaniel Dunbar  if (FloatABI.empty()) {
597bcd6df662471e0ac2d3d85fdba09b1295c2fc468Rafael Espindola    switch (Triple.getOS()) {
598905c45f15a25598620d19160c139c6b785aeea89Bob Wilson    case llvm::Triple::Darwin:
599905c45f15a25598620d19160c139c6b785aeea89Bob Wilson    case llvm::Triple::MacOSX:
600905c45f15a25598620d19160c139c6b785aeea89Bob Wilson    case llvm::Triple::IOS: {
601cbd1933f83e2332b2d7add10459f80cc4e7eb7bfDaniel Dunbar      // Darwin defaults to "softfp" for v6 and v7.
602cbd1933f83e2332b2d7add10459f80cc4e7eb7bfDaniel Dunbar      //
603cbd1933f83e2332b2d7add10459f80cc4e7eb7bfDaniel Dunbar      // FIXME: Factor out an ARM class so we can cache the arch somewhere.
6045f9e272e632e951b1efe824cd16acb4d96077930Chris Lattner      StringRef ArchName =
605bcd6df662471e0ac2d3d85fdba09b1295c2fc468Rafael Espindola        getLLVMArchSuffixForARM(getARMTargetCPU(Args, Triple));
606cbd1933f83e2332b2d7add10459f80cc4e7eb7bfDaniel Dunbar      if (ArchName.startswith("v6") || ArchName.startswith("v7"))
607cbd1933f83e2332b2d7add10459f80cc4e7eb7bfDaniel Dunbar        FloatABI = "softfp";
608cbd1933f83e2332b2d7add10459f80cc4e7eb7bfDaniel Dunbar      else
609cbd1933f83e2332b2d7add10459f80cc4e7eb7bfDaniel Dunbar        FloatABI = "soft";
610cbd1933f83e2332b2d7add10459f80cc4e7eb7bfDaniel Dunbar      break;
611cbd1933f83e2332b2d7add10459f80cc4e7eb7bfDaniel Dunbar    }
612cbd1933f83e2332b2d7add10459f80cc4e7eb7bfDaniel Dunbar
6137e9cebfe1246bb9051a364474b6570eb40dbac4bRafael Espindola    case llvm::Triple::Linux: {
6144ce83eba01c582fa4cbed25f74aaa2c5bf7d4fdeBob Wilson      if (Triple.getEnvironment() == llvm::Triple::GNUEABI) {
6157e9cebfe1246bb9051a364474b6570eb40dbac4bRafael Espindola        FloatABI = "softfp";
6167e9cebfe1246bb9051a364474b6570eb40dbac4bRafael Espindola        break;
6177e9cebfe1246bb9051a364474b6570eb40dbac4bRafael Espindola      }
6187e9cebfe1246bb9051a364474b6570eb40dbac4bRafael Espindola    }
6197e9cebfe1246bb9051a364474b6570eb40dbac4bRafael Espindola    // fall through
6207e9cebfe1246bb9051a364474b6570eb40dbac4bRafael Espindola
621cbd1933f83e2332b2d7add10459f80cc4e7eb7bfDaniel Dunbar    default:
622fc2bd7c3efed6756a030d58a5f6ae31947e7d451Bob Wilson      switch(Triple.getEnvironment()) {
623fc2bd7c3efed6756a030d58a5f6ae31947e7d451Bob Wilson      case llvm::Triple::GNUEABI:
624fc2bd7c3efed6756a030d58a5f6ae31947e7d451Bob Wilson        FloatABI = "softfp";
625fc2bd7c3efed6756a030d58a5f6ae31947e7d451Bob Wilson        break;
626fc2bd7c3efed6756a030d58a5f6ae31947e7d451Bob Wilson      case llvm::Triple::EABI:
627fc2bd7c3efed6756a030d58a5f6ae31947e7d451Bob Wilson        // EABI is always AAPCS, and if it was not marked 'hard', it's softfp
628fc2bd7c3efed6756a030d58a5f6ae31947e7d451Bob Wilson        FloatABI = "softfp";
629fc2bd7c3efed6756a030d58a5f6ae31947e7d451Bob Wilson        break;
630b43550bf1bd944a16cdae9703cb1c2049b04e6bdChandler Carruth      case llvm::Triple::ANDROIDEABI: {
631b43550bf1bd944a16cdae9703cb1c2049b04e6bdChandler Carruth        StringRef ArchName =
632b43550bf1bd944a16cdae9703cb1c2049b04e6bdChandler Carruth          getLLVMArchSuffixForARM(getARMTargetCPU(Args, Triple));
633b43550bf1bd944a16cdae9703cb1c2049b04e6bdChandler Carruth        if (ArchName.startswith("v7"))
634b43550bf1bd944a16cdae9703cb1c2049b04e6bdChandler Carruth          FloatABI = "softfp";
635b43550bf1bd944a16cdae9703cb1c2049b04e6bdChandler Carruth        else
636b43550bf1bd944a16cdae9703cb1c2049b04e6bdChandler Carruth          FloatABI = "soft";
637b43550bf1bd944a16cdae9703cb1c2049b04e6bdChandler Carruth        break;
638b43550bf1bd944a16cdae9703cb1c2049b04e6bdChandler Carruth      }
639fc2bd7c3efed6756a030d58a5f6ae31947e7d451Bob Wilson      default:
640fc2bd7c3efed6756a030d58a5f6ae31947e7d451Bob Wilson        // Assume "soft", but warn the user we are guessing.
641fc2bd7c3efed6756a030d58a5f6ae31947e7d451Bob Wilson        FloatABI = "soft";
6425f9e272e632e951b1efe824cd16acb4d96077930Chris Lattner        D.Diag(diag::warn_drv_assuming_mfloat_abi_is) << "soft";
643fc2bd7c3efed6756a030d58a5f6ae31947e7d451Bob Wilson        break;
644fc2bd7c3efed6756a030d58a5f6ae31947e7d451Bob Wilson      }
645cbd1933f83e2332b2d7add10459f80cc4e7eb7bfDaniel Dunbar    }
646cbd1933f83e2332b2d7add10459f80cc4e7eb7bfDaniel Dunbar  }
647cbd1933f83e2332b2d7add10459f80cc4e7eb7bfDaniel Dunbar
648e2571793ba6fc13e5525b8d7224812f99842a1a4Anton Korobeynikov  return FloatABI;
649e2571793ba6fc13e5525b8d7224812f99842a1a4Anton Korobeynikov}
650e2571793ba6fc13e5525b8d7224812f99842a1a4Anton Korobeynikov
651e2571793ba6fc13e5525b8d7224812f99842a1a4Anton Korobeynikov
652e2571793ba6fc13e5525b8d7224812f99842a1a4Anton Korobeynikovvoid Clang::AddARMTargetArgs(const ArgList &Args,
653e2571793ba6fc13e5525b8d7224812f99842a1a4Anton Korobeynikov                             ArgStringList &CmdArgs,
654e2571793ba6fc13e5525b8d7224812f99842a1a4Anton Korobeynikov                             bool KernelOrKext) const {
655e2571793ba6fc13e5525b8d7224812f99842a1a4Anton Korobeynikov  const Driver &D = getToolChain().getDriver();
656e2571793ba6fc13e5525b8d7224812f99842a1a4Anton Korobeynikov  llvm::Triple Triple = getToolChain().getTriple();
657e2571793ba6fc13e5525b8d7224812f99842a1a4Anton Korobeynikov
658e2571793ba6fc13e5525b8d7224812f99842a1a4Anton Korobeynikov  // Select the ABI to use.
659e2571793ba6fc13e5525b8d7224812f99842a1a4Anton Korobeynikov  //
660e2571793ba6fc13e5525b8d7224812f99842a1a4Anton Korobeynikov  // FIXME: Support -meabi.
661e2571793ba6fc13e5525b8d7224812f99842a1a4Anton Korobeynikov  const char *ABIName = 0;
662e2571793ba6fc13e5525b8d7224812f99842a1a4Anton Korobeynikov  if (Arg *A = Args.getLastArg(options::OPT_mabi_EQ)) {
663e2571793ba6fc13e5525b8d7224812f99842a1a4Anton Korobeynikov    ABIName = A->getValue(Args);
664e2571793ba6fc13e5525b8d7224812f99842a1a4Anton Korobeynikov  } else {
665e2571793ba6fc13e5525b8d7224812f99842a1a4Anton Korobeynikov    // Select the default based on the platform.
666e2571793ba6fc13e5525b8d7224812f99842a1a4Anton Korobeynikov    switch(Triple.getEnvironment()) {
667e2571793ba6fc13e5525b8d7224812f99842a1a4Anton Korobeynikov    case llvm::Triple::ANDROIDEABI:
668e2571793ba6fc13e5525b8d7224812f99842a1a4Anton Korobeynikov    case llvm::Triple::GNUEABI:
669e2571793ba6fc13e5525b8d7224812f99842a1a4Anton Korobeynikov      ABIName = "aapcs-linux";
670e2571793ba6fc13e5525b8d7224812f99842a1a4Anton Korobeynikov      break;
671e2571793ba6fc13e5525b8d7224812f99842a1a4Anton Korobeynikov    case llvm::Triple::EABI:
672e2571793ba6fc13e5525b8d7224812f99842a1a4Anton Korobeynikov      ABIName = "aapcs";
673e2571793ba6fc13e5525b8d7224812f99842a1a4Anton Korobeynikov      break;
674e2571793ba6fc13e5525b8d7224812f99842a1a4Anton Korobeynikov    default:
675e2571793ba6fc13e5525b8d7224812f99842a1a4Anton Korobeynikov      ABIName = "apcs-gnu";
676e2571793ba6fc13e5525b8d7224812f99842a1a4Anton Korobeynikov    }
677e2571793ba6fc13e5525b8d7224812f99842a1a4Anton Korobeynikov  }
678e2571793ba6fc13e5525b8d7224812f99842a1a4Anton Korobeynikov  CmdArgs.push_back("-target-abi");
679e2571793ba6fc13e5525b8d7224812f99842a1a4Anton Korobeynikov  CmdArgs.push_back(ABIName);
680e2571793ba6fc13e5525b8d7224812f99842a1a4Anton Korobeynikov
681e2571793ba6fc13e5525b8d7224812f99842a1a4Anton Korobeynikov  // Set the CPU based on -march= and -mcpu=.
682e2571793ba6fc13e5525b8d7224812f99842a1a4Anton Korobeynikov  CmdArgs.push_back("-target-cpu");
683e2571793ba6fc13e5525b8d7224812f99842a1a4Anton Korobeynikov  CmdArgs.push_back(getARMTargetCPU(Args, Triple));
684e2571793ba6fc13e5525b8d7224812f99842a1a4Anton Korobeynikov
685e2571793ba6fc13e5525b8d7224812f99842a1a4Anton Korobeynikov  // Determine floating point ABI from the options & target defaults.
686e2571793ba6fc13e5525b8d7224812f99842a1a4Anton Korobeynikov  StringRef FloatABI = getARMFloatABI(D, Args, Triple);
687cbd1933f83e2332b2d7add10459f80cc4e7eb7bfDaniel Dunbar  if (FloatABI == "soft") {
688cbd1933f83e2332b2d7add10459f80cc4e7eb7bfDaniel Dunbar    // Floating point operations and argument passing are soft.
689cbd1933f83e2332b2d7add10459f80cc4e7eb7bfDaniel Dunbar    //
690cbd1933f83e2332b2d7add10459f80cc4e7eb7bfDaniel Dunbar    // FIXME: This changes CPP defines, we need -target-soft-float.
6913b315264d1a6fa303e20fe0caec306ccafc090deDaniel Dunbar    CmdArgs.push_back("-msoft-float");
69287667aafe68c366be57f5afb60428237593da0edDaniel Dunbar    CmdArgs.push_back("-mfloat-abi");
69387667aafe68c366be57f5afb60428237593da0edDaniel Dunbar    CmdArgs.push_back("soft");
694cbd1933f83e2332b2d7add10459f80cc4e7eb7bfDaniel Dunbar  } else if (FloatABI == "softfp") {
695cbd1933f83e2332b2d7add10459f80cc4e7eb7bfDaniel Dunbar    // Floating point operations are hard, but argument passing is soft.
69687667aafe68c366be57f5afb60428237593da0edDaniel Dunbar    CmdArgs.push_back("-mfloat-abi");
69787667aafe68c366be57f5afb60428237593da0edDaniel Dunbar    CmdArgs.push_back("soft");
698cbd1933f83e2332b2d7add10459f80cc4e7eb7bfDaniel Dunbar  } else {
699cbd1933f83e2332b2d7add10459f80cc4e7eb7bfDaniel Dunbar    // Floating point operations and argument passing are hard.
700cbd1933f83e2332b2d7add10459f80cc4e7eb7bfDaniel Dunbar    assert(FloatABI == "hard" && "Invalid float abi!");
70187667aafe68c366be57f5afb60428237593da0edDaniel Dunbar    CmdArgs.push_back("-mfloat-abi");
70287667aafe68c366be57f5afb60428237593da0edDaniel Dunbar    CmdArgs.push_back("hard");
703cbd1933f83e2332b2d7add10459f80cc4e7eb7bfDaniel Dunbar  }
70497f52ac45369f6925b548404e61d511034c874ecDaniel Dunbar
70597f52ac45369f6925b548404e61d511034c874ecDaniel Dunbar  // Set appropriate target features for floating point mode.
70697f52ac45369f6925b548404e61d511034c874ecDaniel Dunbar  //
70797f52ac45369f6925b548404e61d511034c874ecDaniel Dunbar  // FIXME: Note, this is a hack, the LLVM backend doesn't actually use these
70897f52ac45369f6925b548404e61d511034c874ecDaniel Dunbar  // yet (it uses the -mfloat-abi and -msoft-float options above), and it is
70997f52ac45369f6925b548404e61d511034c874ecDaniel Dunbar  // stripped out by the ARM target.
71097f52ac45369f6925b548404e61d511034c874ecDaniel Dunbar
71197f52ac45369f6925b548404e61d511034c874ecDaniel Dunbar  // Use software floating point operations?
71297f52ac45369f6925b548404e61d511034c874ecDaniel Dunbar  if (FloatABI == "soft") {
71397f52ac45369f6925b548404e61d511034c874ecDaniel Dunbar    CmdArgs.push_back("-target-feature");
71497f52ac45369f6925b548404e61d511034c874ecDaniel Dunbar    CmdArgs.push_back("+soft-float");
71597f52ac45369f6925b548404e61d511034c874ecDaniel Dunbar  }
71697f52ac45369f6925b548404e61d511034c874ecDaniel Dunbar
71797f52ac45369f6925b548404e61d511034c874ecDaniel Dunbar  // Use software floating point argument passing?
71897f52ac45369f6925b548404e61d511034c874ecDaniel Dunbar  if (FloatABI != "hard") {
71997f52ac45369f6925b548404e61d511034c874ecDaniel Dunbar    CmdArgs.push_back("-target-feature");
72097f52ac45369f6925b548404e61d511034c874ecDaniel Dunbar    CmdArgs.push_back("+soft-float-abi");
72197f52ac45369f6925b548404e61d511034c874ecDaniel Dunbar  }
722a91320b8af7143f7af4c0665ffa62a3b244c0bd9Daniel Dunbar
723a91320b8af7143f7af4c0665ffa62a3b244c0bd9Daniel Dunbar  // Honor -mfpu=.
724993172757762436d22b2dfc74e7cca1bade1a7bfChad Rosier  if (const Arg *A = Args.getLastArg(options::OPT_mfpu_EQ))
725f80f2a5098218211704bc4e66a8c2f46a8fa1d25Chad Rosier    addFPUArgs(D, A, Args, CmdArgs);
7267187fac0f19f75c62f575c9f15f0ed68b7d97810Daniel Dunbar
7277a938fa66be42710b034a79106de337a275fd265Chad Rosier  // Honor -mfpmath=.
7287a938fa66be42710b034a79106de337a275fd265Chad Rosier  if (const Arg *A = Args.getLastArg(options::OPT_mfpmath_EQ))
72930fe6baf95662ea82a794a8fe3b76998713c183dChad Rosier    addFPMathArgs(D, A, Args, CmdArgs, getARMTargetCPU(Args, Triple));
7307a938fa66be42710b034a79106de337a275fd265Chad Rosier
7317187fac0f19f75c62f575c9f15f0ed68b7d97810Daniel Dunbar  // Setting -msoft-float effectively disables NEON because of the GCC
7327187fac0f19f75c62f575c9f15f0ed68b7d97810Daniel Dunbar  // implementation, although the same isn't true of VFP or VFP3.
7337187fac0f19f75c62f575c9f15f0ed68b7d97810Daniel Dunbar  if (FloatABI == "soft") {
734fa41d6975058ceb1b8a24564f6dcec72f89f62e8Daniel Dunbar    CmdArgs.push_back("-target-feature");
735fa41d6975058ceb1b8a24564f6dcec72f89f62e8Daniel Dunbar    CmdArgs.push_back("-neon");
736fa41d6975058ceb1b8a24564f6dcec72f89f62e8Daniel Dunbar  }
737fa41d6975058ceb1b8a24564f6dcec72f89f62e8Daniel Dunbar
738fa41d6975058ceb1b8a24564f6dcec72f89f62e8Daniel Dunbar  // Kernel code has more strict alignment requirements.
739fa41d6975058ceb1b8a24564f6dcec72f89f62e8Daniel Dunbar  if (KernelOrKext) {
7403c66d30d513106bb794990c5e4ba36a31ac19f15Daniel Dunbar    CmdArgs.push_back("-backend-option");
741fa41d6975058ceb1b8a24564f6dcec72f89f62e8Daniel Dunbar    CmdArgs.push_back("-arm-long-calls");
742fa41d6975058ceb1b8a24564f6dcec72f89f62e8Daniel Dunbar
7433c66d30d513106bb794990c5e4ba36a31ac19f15Daniel Dunbar    CmdArgs.push_back("-backend-option");
744fa41d6975058ceb1b8a24564f6dcec72f89f62e8Daniel Dunbar    CmdArgs.push_back("-arm-strict-align");
745b5fbb8931466eeab70a30a27a8d5f385472305a1Daniel Dunbar
746b5fbb8931466eeab70a30a27a8d5f385472305a1Daniel Dunbar    // The kext linker doesn't know how to deal with movw/movt.
747b5fbb8931466eeab70a30a27a8d5f385472305a1Daniel Dunbar    CmdArgs.push_back("-backend-option");
748b5fbb8931466eeab70a30a27a8d5f385472305a1Daniel Dunbar    CmdArgs.push_back("-arm-darwin-use-movt=0");
7497187fac0f19f75c62f575c9f15f0ed68b7d97810Daniel Dunbar  }
7501b9060553221720152e12981109549e0a1d8e3a1Chad Rosier
7511b9060553221720152e12981109549e0a1d8e3a1Chad Rosier  // Setting -mno-global-merge disables the codegen global merge pass. Setting
7521b9060553221720152e12981109549e0a1d8e3a1Chad Rosier  // -mglobal-merge has no effect as the pass is enabled by default.
7531b9060553221720152e12981109549e0a1d8e3a1Chad Rosier  if (Arg *A = Args.getLastArg(options::OPT_mglobal_merge,
7541b9060553221720152e12981109549e0a1d8e3a1Chad Rosier                               options::OPT_mno_global_merge)) {
7551b9060553221720152e12981109549e0a1d8e3a1Chad Rosier    if (A->getOption().matches(options::OPT_mno_global_merge))
7561b9060553221720152e12981109549e0a1d8e3a1Chad Rosier      CmdArgs.push_back("-mno-global-merge");
7571b9060553221720152e12981109549e0a1d8e3a1Chad Rosier  }
758b163ef7e7a5d904ef0962a7c38c460be083c4d63Daniel Dunbar}
759b163ef7e7a5d904ef0962a7c38c460be083c4d63Daniel Dunbar
7609f36062866e6e4bbbfd3efce85fcfb1ce62df97fAkira Hatanaka// Get default architecture.
7619f36062866e6e4bbbfd3efce85fcfb1ce62df97fAkira Hatanakastatic const char* getMipsArchFromCPU(StringRef CPUName) {
762592d26eafab66ba6288c09b66068c67ab2764c35Akira Hatanaka  if (CPUName == "mips32" || CPUName == "mips32r2")
7639f36062866e6e4bbbfd3efce85fcfb1ce62df97fAkira Hatanaka    return "mips";
7649f36062866e6e4bbbfd3efce85fcfb1ce62df97fAkira Hatanaka
765592d26eafab66ba6288c09b66068c67ab2764c35Akira Hatanaka  assert((CPUName == "mips64" || CPUName == "mips64r2") &&
7669f36062866e6e4bbbfd3efce85fcfb1ce62df97fAkira Hatanaka         "Unexpected cpu name.");
7679f36062866e6e4bbbfd3efce85fcfb1ce62df97fAkira Hatanaka
7689f36062866e6e4bbbfd3efce85fcfb1ce62df97fAkira Hatanaka  return "mips64";
7699f36062866e6e4bbbfd3efce85fcfb1ce62df97fAkira Hatanaka}
7709f36062866e6e4bbbfd3efce85fcfb1ce62df97fAkira Hatanaka
771c85900f4d6aec17ef29140bfc97977463ac75cb2Akira Hatanaka// Check that ArchName is a known Mips architecture name.
772c85900f4d6aec17ef29140bfc97977463ac75cb2Akira Hatanakastatic bool checkMipsArchName(StringRef ArchName) {
773c85900f4d6aec17ef29140bfc97977463ac75cb2Akira Hatanaka  return ArchName == "mips" ||
774c85900f4d6aec17ef29140bfc97977463ac75cb2Akira Hatanaka         ArchName == "mipsel" ||
775c85900f4d6aec17ef29140bfc97977463ac75cb2Akira Hatanaka         ArchName == "mips64" ||
776c85900f4d6aec17ef29140bfc97977463ac75cb2Akira Hatanaka         ArchName == "mips64el";
777c85900f4d6aec17ef29140bfc97977463ac75cb2Akira Hatanaka}
778c85900f4d6aec17ef29140bfc97977463ac75cb2Akira Hatanaka
7799f36062866e6e4bbbfd3efce85fcfb1ce62df97fAkira Hatanaka// Get default target cpu.
780c85900f4d6aec17ef29140bfc97977463ac75cb2Akira Hatanakastatic const char* getMipsCPUFromArch(StringRef ArchName) {
7819f36062866e6e4bbbfd3efce85fcfb1ce62df97fAkira Hatanaka  if (ArchName == "mips" || ArchName == "mipsel")
782592d26eafab66ba6288c09b66068c67ab2764c35Akira Hatanaka    return "mips32";
7839f36062866e6e4bbbfd3efce85fcfb1ce62df97fAkira Hatanaka
784c85900f4d6aec17ef29140bfc97977463ac75cb2Akira Hatanaka  assert((ArchName == "mips64" || ArchName == "mips64el") &&
785c85900f4d6aec17ef29140bfc97977463ac75cb2Akira Hatanaka         "Unexpected arch name.");
786c85900f4d6aec17ef29140bfc97977463ac75cb2Akira Hatanaka
787c85900f4d6aec17ef29140bfc97977463ac75cb2Akira Hatanaka  return "mips64";
7889f36062866e6e4bbbfd3efce85fcfb1ce62df97fAkira Hatanaka}
7899f36062866e6e4bbbfd3efce85fcfb1ce62df97fAkira Hatanaka
7909f36062866e6e4bbbfd3efce85fcfb1ce62df97fAkira Hatanaka// Get default ABI.
7919f36062866e6e4bbbfd3efce85fcfb1ce62df97fAkira Hatanakastatic const char* getMipsABIFromArch(StringRef ArchName) {
7929f36062866e6e4bbbfd3efce85fcfb1ce62df97fAkira Hatanaka    if (ArchName == "mips" || ArchName == "mipsel")
7939f36062866e6e4bbbfd3efce85fcfb1ce62df97fAkira Hatanaka      return "o32";
7949f36062866e6e4bbbfd3efce85fcfb1ce62df97fAkira Hatanaka
7959f36062866e6e4bbbfd3efce85fcfb1ce62df97fAkira Hatanaka    assert((ArchName == "mips64" || ArchName == "mips64el") &&
7969f36062866e6e4bbbfd3efce85fcfb1ce62df97fAkira Hatanaka           "Unexpected arch name.");
7979f36062866e6e4bbbfd3efce85fcfb1ce62df97fAkira Hatanaka    return "n64";
7989f36062866e6e4bbbfd3efce85fcfb1ce62df97fAkira Hatanaka}
7999f36062866e6e4bbbfd3efce85fcfb1ce62df97fAkira Hatanaka
800a2768be144256f9eb721bef8b751e56e0b64fa0bSimon Atanasyan// Get CPU and ABI names. They are not independent
801a2768be144256f9eb721bef8b751e56e0b64fa0bSimon Atanasyan// so we have to calculate them together.
802a2768be144256f9eb721bef8b751e56e0b64fa0bSimon Atanasyanstatic void getMipsCPUAndABI(const ArgList &Args,
803a2768be144256f9eb721bef8b751e56e0b64fa0bSimon Atanasyan                             const ToolChain &TC,
804a2768be144256f9eb721bef8b751e56e0b64fa0bSimon Atanasyan                             StringRef &CPUName,
805a2768be144256f9eb721bef8b751e56e0b64fa0bSimon Atanasyan                             StringRef &ABIName) {
8069f36062866e6e4bbbfd3efce85fcfb1ce62df97fAkira Hatanaka  StringRef ArchName;
8079f36062866e6e4bbbfd3efce85fcfb1ce62df97fAkira Hatanaka
808a2768be144256f9eb721bef8b751e56e0b64fa0bSimon Atanasyan  // Select target cpu and architecture.
8099f36062866e6e4bbbfd3efce85fcfb1ce62df97fAkira Hatanaka  if (Arg *A = Args.getLastArg(options::OPT_mcpu_EQ)) {
8109f36062866e6e4bbbfd3efce85fcfb1ce62df97fAkira Hatanaka    CPUName = A->getValue(Args);
8119f36062866e6e4bbbfd3efce85fcfb1ce62df97fAkira Hatanaka    ArchName = getMipsArchFromCPU(CPUName);
8129f36062866e6e4bbbfd3efce85fcfb1ce62df97fAkira Hatanaka  }
8139f36062866e6e4bbbfd3efce85fcfb1ce62df97fAkira Hatanaka  else {
814a2768be144256f9eb721bef8b751e56e0b64fa0bSimon Atanasyan    ArchName = Args.MakeArgString(TC.getArchName());
815c85900f4d6aec17ef29140bfc97977463ac75cb2Akira Hatanaka    if (!checkMipsArchName(ArchName))
816a2768be144256f9eb721bef8b751e56e0b64fa0bSimon Atanasyan      TC.getDriver().Diag(diag::err_drv_invalid_arch_name) << ArchName;
817c85900f4d6aec17ef29140bfc97977463ac75cb2Akira Hatanaka    else
818c85900f4d6aec17ef29140bfc97977463ac75cb2Akira Hatanaka      CPUName = getMipsCPUFromArch(ArchName);
8199f36062866e6e4bbbfd3efce85fcfb1ce62df97fAkira Hatanaka  }
8209f36062866e6e4bbbfd3efce85fcfb1ce62df97fAkira Hatanaka
821ed734737d5af31906e30e537d4a41c760ddcfc59Eric Christopher  // Select the ABI to use.
8229f36062866e6e4bbbfd3efce85fcfb1ce62df97fAkira Hatanaka  if (Arg *A = Args.getLastArg(options::OPT_mabi_EQ))
823ed734737d5af31906e30e537d4a41c760ddcfc59Eric Christopher    ABIName = A->getValue(Args);
8249f36062866e6e4bbbfd3efce85fcfb1ce62df97fAkira Hatanaka  else
8259f36062866e6e4bbbfd3efce85fcfb1ce62df97fAkira Hatanaka    ABIName = getMipsABIFromArch(ArchName);
826a2768be144256f9eb721bef8b751e56e0b64fa0bSimon Atanasyan}
827a2768be144256f9eb721bef8b751e56e0b64fa0bSimon Atanasyan
828a2768be144256f9eb721bef8b751e56e0b64fa0bSimon Atanasyanvoid Clang::AddMIPSTargetArgs(const ArgList &Args,
829a2768be144256f9eb721bef8b751e56e0b64fa0bSimon Atanasyan                             ArgStringList &CmdArgs) const {
830a2768be144256f9eb721bef8b751e56e0b64fa0bSimon Atanasyan  const Driver &D = getToolChain().getDriver();
831a2768be144256f9eb721bef8b751e56e0b64fa0bSimon Atanasyan  StringRef CPUName;
832a2768be144256f9eb721bef8b751e56e0b64fa0bSimon Atanasyan  StringRef ABIName;
833a2768be144256f9eb721bef8b751e56e0b64fa0bSimon Atanasyan  getMipsCPUAndABI(Args, getToolChain(), CPUName, ABIName);
834a2768be144256f9eb721bef8b751e56e0b64fa0bSimon Atanasyan
835a2768be144256f9eb721bef8b751e56e0b64fa0bSimon Atanasyan  CmdArgs.push_back("-target-cpu");
836a2768be144256f9eb721bef8b751e56e0b64fa0bSimon Atanasyan  CmdArgs.push_back(CPUName.data());
837ed734737d5af31906e30e537d4a41c760ddcfc59Eric Christopher
838ed734737d5af31906e30e537d4a41c760ddcfc59Eric Christopher  CmdArgs.push_back("-target-abi");
839a2768be144256f9eb721bef8b751e56e0b64fa0bSimon Atanasyan  CmdArgs.push_back(ABIName.data());
840ed734737d5af31906e30e537d4a41c760ddcfc59Eric Christopher
841ad8d8a31b010ceac4cad2553f16fc1a77c4b2e5eAkira Hatanaka  // Select the float ABI as determined by -msoft-float, -mhard-float,
842ad8d8a31b010ceac4cad2553f16fc1a77c4b2e5eAkira Hatanaka  // and -mfloat-abi=.
8435f9e272e632e951b1efe824cd16acb4d96077930Chris Lattner  StringRef FloatABI;
844ed734737d5af31906e30e537d4a41c760ddcfc59Eric Christopher  if (Arg *A = Args.getLastArg(options::OPT_msoft_float,
845ad8d8a31b010ceac4cad2553f16fc1a77c4b2e5eAkira Hatanaka                               options::OPT_mhard_float,
846ad8d8a31b010ceac4cad2553f16fc1a77c4b2e5eAkira Hatanaka                               options::OPT_mfloat_abi_EQ)) {
847ed734737d5af31906e30e537d4a41c760ddcfc59Eric Christopher    if (A->getOption().matches(options::OPT_msoft_float))
848ed734737d5af31906e30e537d4a41c760ddcfc59Eric Christopher      FloatABI = "soft";
849ed734737d5af31906e30e537d4a41c760ddcfc59Eric Christopher    else if (A->getOption().matches(options::OPT_mhard_float))
850ed734737d5af31906e30e537d4a41c760ddcfc59Eric Christopher      FloatABI = "hard";
851ad8d8a31b010ceac4cad2553f16fc1a77c4b2e5eAkira Hatanaka    else {
852ad8d8a31b010ceac4cad2553f16fc1a77c4b2e5eAkira Hatanaka      FloatABI = A->getValue(Args);
853ad8d8a31b010ceac4cad2553f16fc1a77c4b2e5eAkira Hatanaka      if (FloatABI != "soft" && FloatABI != "single" && FloatABI != "hard") {
854ad8d8a31b010ceac4cad2553f16fc1a77c4b2e5eAkira Hatanaka        D.Diag(diag::err_drv_invalid_mfloat_abi)
855ad8d8a31b010ceac4cad2553f16fc1a77c4b2e5eAkira Hatanaka          << A->getAsString(Args);
856ad8d8a31b010ceac4cad2553f16fc1a77c4b2e5eAkira Hatanaka        FloatABI = "hard";
857ad8d8a31b010ceac4cad2553f16fc1a77c4b2e5eAkira Hatanaka      }
858ad8d8a31b010ceac4cad2553f16fc1a77c4b2e5eAkira Hatanaka    }
859ed734737d5af31906e30e537d4a41c760ddcfc59Eric Christopher  }
860ed734737d5af31906e30e537d4a41c760ddcfc59Eric Christopher
861ed734737d5af31906e30e537d4a41c760ddcfc59Eric Christopher  // If unspecified, choose the default based on the platform.
862ed734737d5af31906e30e537d4a41c760ddcfc59Eric Christopher  if (FloatABI.empty()) {
863ad8d8a31b010ceac4cad2553f16fc1a77c4b2e5eAkira Hatanaka    // Assume "hard", because it's a default value used by gcc.
864ad8d8a31b010ceac4cad2553f16fc1a77c4b2e5eAkira Hatanaka    // When we start to recognize specific target MIPS processors,
865ad8d8a31b010ceac4cad2553f16fc1a77c4b2e5eAkira Hatanaka    // we will be able to select the default more correctly.
866ad8d8a31b010ceac4cad2553f16fc1a77c4b2e5eAkira Hatanaka    FloatABI = "hard";
867ed734737d5af31906e30e537d4a41c760ddcfc59Eric Christopher  }
868ed734737d5af31906e30e537d4a41c760ddcfc59Eric Christopher
869ed734737d5af31906e30e537d4a41c760ddcfc59Eric Christopher  if (FloatABI == "soft") {
870ed734737d5af31906e30e537d4a41c760ddcfc59Eric Christopher    // Floating point operations and argument passing are soft.
871ed734737d5af31906e30e537d4a41c760ddcfc59Eric Christopher    CmdArgs.push_back("-msoft-float");
872ad8d8a31b010ceac4cad2553f16fc1a77c4b2e5eAkira Hatanaka    CmdArgs.push_back("-mfloat-abi");
873ad8d8a31b010ceac4cad2553f16fc1a77c4b2e5eAkira Hatanaka    CmdArgs.push_back("soft");
874ad8d8a31b010ceac4cad2553f16fc1a77c4b2e5eAkira Hatanaka
875ad8d8a31b010ceac4cad2553f16fc1a77c4b2e5eAkira Hatanaka    // FIXME: Note, this is a hack. We need to pass the selected float
876ad8d8a31b010ceac4cad2553f16fc1a77c4b2e5eAkira Hatanaka    // mode to the MipsTargetInfoBase to define appropriate macros there.
877ad8d8a31b010ceac4cad2553f16fc1a77c4b2e5eAkira Hatanaka    // Now it is the only method.
878ad8d8a31b010ceac4cad2553f16fc1a77c4b2e5eAkira Hatanaka    CmdArgs.push_back("-target-feature");
879ad8d8a31b010ceac4cad2553f16fc1a77c4b2e5eAkira Hatanaka    CmdArgs.push_back("+soft-float");
880ad8d8a31b010ceac4cad2553f16fc1a77c4b2e5eAkira Hatanaka  }
881ad8d8a31b010ceac4cad2553f16fc1a77c4b2e5eAkira Hatanaka  else if (FloatABI == "single") {
882ad8d8a31b010ceac4cad2553f16fc1a77c4b2e5eAkira Hatanaka    // Restrict the use of hardware floating-point
883ad8d8a31b010ceac4cad2553f16fc1a77c4b2e5eAkira Hatanaka    // instructions to 32-bit operations.
884ad8d8a31b010ceac4cad2553f16fc1a77c4b2e5eAkira Hatanaka    CmdArgs.push_back("-target-feature");
885ad8d8a31b010ceac4cad2553f16fc1a77c4b2e5eAkira Hatanaka    CmdArgs.push_back("+single-float");
886ad8d8a31b010ceac4cad2553f16fc1a77c4b2e5eAkira Hatanaka  }
887ad8d8a31b010ceac4cad2553f16fc1a77c4b2e5eAkira Hatanaka  else {
888ad8d8a31b010ceac4cad2553f16fc1a77c4b2e5eAkira Hatanaka    // Floating point operations and argument passing are hard.
889ed734737d5af31906e30e537d4a41c760ddcfc59Eric Christopher    assert(FloatABI == "hard" && "Invalid float abi!");
890ad8d8a31b010ceac4cad2553f16fc1a77c4b2e5eAkira Hatanaka    CmdArgs.push_back("-mfloat-abi");
891ad8d8a31b010ceac4cad2553f16fc1a77c4b2e5eAkira Hatanaka    CmdArgs.push_back("hard");
892ed734737d5af31906e30e537d4a41c760ddcfc59Eric Christopher  }
893ed734737d5af31906e30e537d4a41c760ddcfc59Eric Christopher}
894ed734737d5af31906e30e537d4a41c760ddcfc59Eric Christopher
8959284d215022457ba867080a713f08f026d89ea17Bruno Cardoso Lopesvoid Clang::AddSparcTargetArgs(const ArgList &Args,
8969284d215022457ba867080a713f08f026d89ea17Bruno Cardoso Lopes                             ArgStringList &CmdArgs) const {
8979284d215022457ba867080a713f08f026d89ea17Bruno Cardoso Lopes  const Driver &D = getToolChain().getDriver();
8989284d215022457ba867080a713f08f026d89ea17Bruno Cardoso Lopes
8999284d215022457ba867080a713f08f026d89ea17Bruno Cardoso Lopes  if (const Arg *A = Args.getLastArg(options::OPT_march_EQ)) {
9009284d215022457ba867080a713f08f026d89ea17Bruno Cardoso Lopes    CmdArgs.push_back("-target-cpu");
901a11d3098624dd9c136c713ff8a513150ce88580eBenjamin Kramer    CmdArgs.push_back(A->getValue(Args));
9029284d215022457ba867080a713f08f026d89ea17Bruno Cardoso Lopes  }
9039284d215022457ba867080a713f08f026d89ea17Bruno Cardoso Lopes
9049284d215022457ba867080a713f08f026d89ea17Bruno Cardoso Lopes  // Select the float ABI as determined by -msoft-float, -mhard-float, and
9055f9e272e632e951b1efe824cd16acb4d96077930Chris Lattner  StringRef FloatABI;
9069284d215022457ba867080a713f08f026d89ea17Bruno Cardoso Lopes  if (Arg *A = Args.getLastArg(options::OPT_msoft_float,
9079284d215022457ba867080a713f08f026d89ea17Bruno Cardoso Lopes                               options::OPT_mhard_float)) {
9089284d215022457ba867080a713f08f026d89ea17Bruno Cardoso Lopes    if (A->getOption().matches(options::OPT_msoft_float))
9099284d215022457ba867080a713f08f026d89ea17Bruno Cardoso Lopes      FloatABI = "soft";
9109284d215022457ba867080a713f08f026d89ea17Bruno Cardoso Lopes    else if (A->getOption().matches(options::OPT_mhard_float))
9119284d215022457ba867080a713f08f026d89ea17Bruno Cardoso Lopes      FloatABI = "hard";
9129284d215022457ba867080a713f08f026d89ea17Bruno Cardoso Lopes  }
9139284d215022457ba867080a713f08f026d89ea17Bruno Cardoso Lopes
9149284d215022457ba867080a713f08f026d89ea17Bruno Cardoso Lopes  // If unspecified, choose the default based on the platform.
9159284d215022457ba867080a713f08f026d89ea17Bruno Cardoso Lopes  if (FloatABI.empty()) {
9169284d215022457ba867080a713f08f026d89ea17Bruno Cardoso Lopes    switch (getToolChain().getTriple().getOS()) {
9179284d215022457ba867080a713f08f026d89ea17Bruno Cardoso Lopes    default:
9189284d215022457ba867080a713f08f026d89ea17Bruno Cardoso Lopes      // Assume "soft", but warn the user we are guessing.
9199284d215022457ba867080a713f08f026d89ea17Bruno Cardoso Lopes      FloatABI = "soft";
9205f9e272e632e951b1efe824cd16acb4d96077930Chris Lattner      D.Diag(diag::warn_drv_assuming_mfloat_abi_is) << "soft";
9219284d215022457ba867080a713f08f026d89ea17Bruno Cardoso Lopes      break;
9229284d215022457ba867080a713f08f026d89ea17Bruno Cardoso Lopes    }
9239284d215022457ba867080a713f08f026d89ea17Bruno Cardoso Lopes  }
9249284d215022457ba867080a713f08f026d89ea17Bruno Cardoso Lopes
9259284d215022457ba867080a713f08f026d89ea17Bruno Cardoso Lopes  if (FloatABI == "soft") {
9269284d215022457ba867080a713f08f026d89ea17Bruno Cardoso Lopes    // Floating point operations and argument passing are soft.
9279284d215022457ba867080a713f08f026d89ea17Bruno Cardoso Lopes    //
9289284d215022457ba867080a713f08f026d89ea17Bruno Cardoso Lopes    // FIXME: This changes CPP defines, we need -target-soft-float.
9299284d215022457ba867080a713f08f026d89ea17Bruno Cardoso Lopes    CmdArgs.push_back("-msoft-float");
9309284d215022457ba867080a713f08f026d89ea17Bruno Cardoso Lopes    CmdArgs.push_back("-target-feature");
9319284d215022457ba867080a713f08f026d89ea17Bruno Cardoso Lopes    CmdArgs.push_back("+soft-float");
9329284d215022457ba867080a713f08f026d89ea17Bruno Cardoso Lopes  } else {
9339284d215022457ba867080a713f08f026d89ea17Bruno Cardoso Lopes    assert(FloatABI == "hard" && "Invalid float abi!");
9349284d215022457ba867080a713f08f026d89ea17Bruno Cardoso Lopes    CmdArgs.push_back("-mhard-float");
9359284d215022457ba867080a713f08f026d89ea17Bruno Cardoso Lopes  }
9369284d215022457ba867080a713f08f026d89ea17Bruno Cardoso Lopes}
9379284d215022457ba867080a713f08f026d89ea17Bruno Cardoso Lopes
9386acda16e9c194dcbd0dea64341e182bdb65d0f41Daniel Dunbarvoid Clang::AddX86TargetArgs(const ArgList &Args,
9396acda16e9c194dcbd0dea64341e182bdb65d0f41Daniel Dunbar                             ArgStringList &CmdArgs) const {
940e6ad3f9fceef0ecc422ff26754ea069a5fd18c69Daniel Dunbar  if (!Args.hasFlag(options::OPT_mred_zone,
941e6ad3f9fceef0ecc422ff26754ea069a5fd18c69Daniel Dunbar                    options::OPT_mno_red_zone,
942e6ad3f9fceef0ecc422ff26754ea069a5fd18c69Daniel Dunbar                    true) ||
943e6ad3f9fceef0ecc422ff26754ea069a5fd18c69Daniel Dunbar      Args.hasArg(options::OPT_mkernel) ||
944e6ad3f9fceef0ecc422ff26754ea069a5fd18c69Daniel Dunbar      Args.hasArg(options::OPT_fapple_kext))
94566861e09d590994a8b941eaa328e4d8f33adec9eDaniel Dunbar    CmdArgs.push_back("-disable-red-zone");
946e6ad3f9fceef0ecc422ff26754ea069a5fd18c69Daniel Dunbar
947e6ad3f9fceef0ecc422ff26754ea069a5fd18c69Daniel Dunbar  if (Args.hasFlag(options::OPT_msoft_float,
948e6ad3f9fceef0ecc422ff26754ea069a5fd18c69Daniel Dunbar                   options::OPT_mno_soft_float,
949e6ad3f9fceef0ecc422ff26754ea069a5fd18c69Daniel Dunbar                   false))
95066861e09d590994a8b941eaa328e4d8f33adec9eDaniel Dunbar    CmdArgs.push_back("-no-implicit-float");
951e6ad3f9fceef0ecc422ff26754ea069a5fd18c69Daniel Dunbar
952f86feddbd5b13d2c144132e35d608fa630784dbbDaniel Dunbar  const char *CPUName = 0;
9536acda16e9c194dcbd0dea64341e182bdb65d0f41Daniel Dunbar  if (const Arg *A = Args.getLastArg(options::OPT_march_EQ)) {
9545f9e272e632e951b1efe824cd16acb4d96077930Chris Lattner    if (StringRef(A->getValue(Args)) == "native") {
955f86feddbd5b13d2c144132e35d608fa630784dbbDaniel Dunbar      // FIXME: Reject attempts to use -march=native unless the target matches
956f86feddbd5b13d2c144132e35d608fa630784dbbDaniel Dunbar      // the host.
957f86feddbd5b13d2c144132e35d608fa630784dbbDaniel Dunbar      //
958f86feddbd5b13d2c144132e35d608fa630784dbbDaniel Dunbar      // FIXME: We should also incorporate the detected target features for use
959f86feddbd5b13d2c144132e35d608fa630784dbbDaniel Dunbar      // with -native.
960f86feddbd5b13d2c144132e35d608fa630784dbbDaniel Dunbar      std::string CPU = llvm::sys::getHostCPUName();
961e0cc309536817cc5701c5a26119c8eeb7080057cBob Wilson      if (!CPU.empty() && CPU != "generic")
962f86feddbd5b13d2c144132e35d608fa630784dbbDaniel Dunbar        CPUName = Args.MakeArgString(CPU);
963f86feddbd5b13d2c144132e35d608fa630784dbbDaniel Dunbar    } else
964f86feddbd5b13d2c144132e35d608fa630784dbbDaniel Dunbar      CPUName = A->getValue(Args);
965f86feddbd5b13d2c144132e35d608fa630784dbbDaniel Dunbar  }
9666acda16e9c194dcbd0dea64341e182bdb65d0f41Daniel Dunbar
967f86feddbd5b13d2c144132e35d608fa630784dbbDaniel Dunbar  // Select the default CPU if none was given (or detection failed).
968f86feddbd5b13d2c144132e35d608fa630784dbbDaniel Dunbar  if (!CPUName) {
9696acda16e9c194dcbd0dea64341e182bdb65d0f41Daniel Dunbar    // FIXME: Need target hooks.
970905c45f15a25598620d19160c139c6b785aeea89Bob Wilson    if (getToolChain().getTriple().isOSDarwin()) {
971951733d6ce270679db19e144782d76d9866eb166Daniel Dunbar      if (getToolChain().getArch() == llvm::Triple::x86_64)
972f86feddbd5b13d2c144132e35d608fa630784dbbDaniel Dunbar        CPUName = "core2";
973951733d6ce270679db19e144782d76d9866eb166Daniel Dunbar      else if (getToolChain().getArch() == llvm::Triple::x86)
974f86feddbd5b13d2c144132e35d608fa630784dbbDaniel Dunbar        CPUName = "yonah";
97586ed3a326342fa2a8c9d9b5d1d7280c9bad2b007Chris Lattner    } else if (getToolChain().getOS().startswith("haiku"))  {
976951733d6ce270679db19e144782d76d9866eb166Daniel Dunbar      if (getToolChain().getArch() == llvm::Triple::x86_64)
97786ed3a326342fa2a8c9d9b5d1d7280c9bad2b007Chris Lattner        CPUName = "x86-64";
978951733d6ce270679db19e144782d76d9866eb166Daniel Dunbar      else if (getToolChain().getArch() == llvm::Triple::x86)
97986ed3a326342fa2a8c9d9b5d1d7280c9bad2b007Chris Lattner        CPUName = "i586";
98095c0457054518102af6250e718a13a5b2ee5dbeaDaniel Dunbar    } else if (getToolChain().getOS().startswith("openbsd"))  {
981951733d6ce270679db19e144782d76d9866eb166Daniel Dunbar      if (getToolChain().getArch() == llvm::Triple::x86_64)
98295c0457054518102af6250e718a13a5b2ee5dbeaDaniel Dunbar        CPUName = "x86-64";
983951733d6ce270679db19e144782d76d9866eb166Daniel Dunbar      else if (getToolChain().getArch() == llvm::Triple::x86)
98495c0457054518102af6250e718a13a5b2ee5dbeaDaniel Dunbar        CPUName = "i486";
985451f8caf37fb6691936f9003833e857e1d1dc987Roman Divacky    } else if (getToolChain().getOS().startswith("freebsd"))  {
986951733d6ce270679db19e144782d76d9866eb166Daniel Dunbar      if (getToolChain().getArch() == llvm::Triple::x86_64)
987451f8caf37fb6691936f9003833e857e1d1dc987Roman Divacky        CPUName = "x86-64";
988951733d6ce270679db19e144782d76d9866eb166Daniel Dunbar      else if (getToolChain().getArch() == llvm::Triple::x86)
989451f8caf37fb6691936f9003833e857e1d1dc987Roman Divacky        CPUName = "i486";
9908e50a96b387dca7525caa8a6add31420dd82a2cdBenjamin Kramer    } else if (getToolChain().getOS().startswith("netbsd"))  {
991951733d6ce270679db19e144782d76d9866eb166Daniel Dunbar      if (getToolChain().getArch() == llvm::Triple::x86_64)
9928e50a96b387dca7525caa8a6add31420dd82a2cdBenjamin Kramer        CPUName = "x86-64";
993951733d6ce270679db19e144782d76d9866eb166Daniel Dunbar      else if (getToolChain().getArch() == llvm::Triple::x86)
9948e50a96b387dca7525caa8a6add31420dd82a2cdBenjamin Kramer        CPUName = "i486";
9956acda16e9c194dcbd0dea64341e182bdb65d0f41Daniel Dunbar    } else {
996951733d6ce270679db19e144782d76d9866eb166Daniel Dunbar      if (getToolChain().getArch() == llvm::Triple::x86_64)
997f86feddbd5b13d2c144132e35d608fa630784dbbDaniel Dunbar        CPUName = "x86-64";
998951733d6ce270679db19e144782d76d9866eb166Daniel Dunbar      else if (getToolChain().getArch() == llvm::Triple::x86)
999f86feddbd5b13d2c144132e35d608fa630784dbbDaniel Dunbar        CPUName = "pentium4";
10006acda16e9c194dcbd0dea64341e182bdb65d0f41Daniel Dunbar    }
10016acda16e9c194dcbd0dea64341e182bdb65d0f41Daniel Dunbar  }
10026acda16e9c194dcbd0dea64341e182bdb65d0f41Daniel Dunbar
1003f86feddbd5b13d2c144132e35d608fa630784dbbDaniel Dunbar  if (CPUName) {
100438b48afd338d494099697d2611e1f45e558e469eDaniel Dunbar    CmdArgs.push_back("-target-cpu");
1005f86feddbd5b13d2c144132e35d608fa630784dbbDaniel Dunbar    CmdArgs.push_back(CPUName);
1006f86feddbd5b13d2c144132e35d608fa630784dbbDaniel Dunbar  }
1007f86feddbd5b13d2c144132e35d608fa630784dbbDaniel Dunbar
1008d18eecac712bfbf63372cb78940d662ce9017840Eli Friedman  // The required algorithm here is slightly strange: the options are applied
1009d18eecac712bfbf63372cb78940d662ce9017840Eli Friedman  // in order (so -mno-sse -msse2 disables SSE3), but any option that gets
1010d18eecac712bfbf63372cb78940d662ce9017840Eli Friedman  // directly overridden later is ignored (so "-mno-sse -msse2 -mno-sse2 -msse"
1011d18eecac712bfbf63372cb78940d662ce9017840Eli Friedman  // is equivalent to "-mno-sse2 -msse"). The -cc1 handling deals with the
1012d18eecac712bfbf63372cb78940d662ce9017840Eli Friedman  // former correctly, but not the latter; handle directly-overridden
1013d18eecac712bfbf63372cb78940d662ce9017840Eli Friedman  // attributes here.
1014d18eecac712bfbf63372cb78940d662ce9017840Eli Friedman  llvm::StringMap<unsigned> PrevFeature;
1015d18eecac712bfbf63372cb78940d662ce9017840Eli Friedman  std::vector<const char*> Features;
1016cdd9686b890ebdc10039ae256ef4c9dfb5ebacb7Daniel Dunbar  for (arg_iterator it = Args.filtered_begin(options::OPT_m_x86_Features_Group),
1017cdd9686b890ebdc10039ae256ef4c9dfb5ebacb7Daniel Dunbar         ie = Args.filtered_end(); it != ie; ++it) {
10185f9e272e632e951b1efe824cd16acb4d96077930Chris Lattner    StringRef Name = (*it)->getOption().getName();
10197e4953e5c60409007545288f14b430bd23d68570Daniel Dunbar    (*it)->claim();
10206acda16e9c194dcbd0dea64341e182bdb65d0f41Daniel Dunbar
1021cdd9686b890ebdc10039ae256ef4c9dfb5ebacb7Daniel Dunbar    // Skip over "-m".
1022cdd9686b890ebdc10039ae256ef4c9dfb5ebacb7Daniel Dunbar    assert(Name.startswith("-m") && "Invalid feature name.");
1023cdd9686b890ebdc10039ae256ef4c9dfb5ebacb7Daniel Dunbar    Name = Name.substr(2);
10246acda16e9c194dcbd0dea64341e182bdb65d0f41Daniel Dunbar
1025cdd9686b890ebdc10039ae256ef4c9dfb5ebacb7Daniel Dunbar    bool IsNegative = Name.startswith("no-");
1026cdd9686b890ebdc10039ae256ef4c9dfb5ebacb7Daniel Dunbar    if (IsNegative)
1027cdd9686b890ebdc10039ae256ef4c9dfb5ebacb7Daniel Dunbar      Name = Name.substr(3);
10286acda16e9c194dcbd0dea64341e182bdb65d0f41Daniel Dunbar
1029d18eecac712bfbf63372cb78940d662ce9017840Eli Friedman    unsigned& Prev = PrevFeature[Name];
1030d18eecac712bfbf63372cb78940d662ce9017840Eli Friedman    if (Prev)
1031d18eecac712bfbf63372cb78940d662ce9017840Eli Friedman      Features[Prev - 1] = 0;
1032d18eecac712bfbf63372cb78940d662ce9017840Eli Friedman    Prev = Features.size() + 1;
1033d18eecac712bfbf63372cb78940d662ce9017840Eli Friedman    Features.push_back(Args.MakeArgString((IsNegative ? "-" : "+") + Name));
1034d18eecac712bfbf63372cb78940d662ce9017840Eli Friedman  }
1035d18eecac712bfbf63372cb78940d662ce9017840Eli Friedman  for (unsigned i = 0; i < Features.size(); i++) {
1036d18eecac712bfbf63372cb78940d662ce9017840Eli Friedman    if (Features[i]) {
1037d18eecac712bfbf63372cb78940d662ce9017840Eli Friedman      CmdArgs.push_back("-target-feature");
1038d18eecac712bfbf63372cb78940d662ce9017840Eli Friedman      CmdArgs.push_back(Features[i]);
1039d18eecac712bfbf63372cb78940d662ce9017840Eli Friedman    }
10406acda16e9c194dcbd0dea64341e182bdb65d0f41Daniel Dunbar  }
10416acda16e9c194dcbd0dea64341e182bdb65d0f41Daniel Dunbar}
10426acda16e9c194dcbd0dea64341e182bdb65d0f41Daniel Dunbar
10439631939f82c0eaa6fb3936a0ce58a41adfbc9011Tony Linthicumstatic Arg* getLastHexagonArchArg (const ArgList &Args)
10449631939f82c0eaa6fb3936a0ce58a41adfbc9011Tony Linthicum{
10459631939f82c0eaa6fb3936a0ce58a41adfbc9011Tony Linthicum  Arg * A = NULL;
10469631939f82c0eaa6fb3936a0ce58a41adfbc9011Tony Linthicum
104743115d4904431917ef6852ee089a8520b9940ba5Sebastian Pop  for (ArgList::const_iterator it = Args.begin(), ie = Args.end();
104843115d4904431917ef6852ee089a8520b9940ba5Sebastian Pop       it != ie; ++it) {
104943115d4904431917ef6852ee089a8520b9940ba5Sebastian Pop    if ((*it)->getOption().matches(options::OPT_march_EQ) ||
10509631939f82c0eaa6fb3936a0ce58a41adfbc9011Tony Linthicum        (*it)->getOption().matches(options::OPT_mcpu_EQ)) {
10519631939f82c0eaa6fb3936a0ce58a41adfbc9011Tony Linthicum      A = *it;
10529631939f82c0eaa6fb3936a0ce58a41adfbc9011Tony Linthicum      A->claim();
10539631939f82c0eaa6fb3936a0ce58a41adfbc9011Tony Linthicum    }
105443115d4904431917ef6852ee089a8520b9940ba5Sebastian Pop    else if ((*it)->getOption().matches(options::OPT_m_Joined)){
105543115d4904431917ef6852ee089a8520b9940ba5Sebastian Pop      StringRef Value = (*it)->getValue(Args,0);
105643115d4904431917ef6852ee089a8520b9940ba5Sebastian Pop      if (Value.startswith("v")) {
105743115d4904431917ef6852ee089a8520b9940ba5Sebastian Pop        A = *it;
105843115d4904431917ef6852ee089a8520b9940ba5Sebastian Pop        A->claim();
105943115d4904431917ef6852ee089a8520b9940ba5Sebastian Pop      }
106043115d4904431917ef6852ee089a8520b9940ba5Sebastian Pop    }
10619631939f82c0eaa6fb3936a0ce58a41adfbc9011Tony Linthicum  }
10629631939f82c0eaa6fb3936a0ce58a41adfbc9011Tony Linthicum  return A;
10639631939f82c0eaa6fb3936a0ce58a41adfbc9011Tony Linthicum}
10649631939f82c0eaa6fb3936a0ce58a41adfbc9011Tony Linthicum
106543115d4904431917ef6852ee089a8520b9940ba5Sebastian Popstatic StringRef getHexagonTargetCPU(const ArgList &Args)
10669631939f82c0eaa6fb3936a0ce58a41adfbc9011Tony Linthicum{
10679631939f82c0eaa6fb3936a0ce58a41adfbc9011Tony Linthicum  Arg *A;
10689631939f82c0eaa6fb3936a0ce58a41adfbc9011Tony Linthicum  llvm::StringRef WhichHexagon;
10699631939f82c0eaa6fb3936a0ce58a41adfbc9011Tony Linthicum
107043115d4904431917ef6852ee089a8520b9940ba5Sebastian Pop  // Select the default CPU (v4) if none was given or detection failed.
10719631939f82c0eaa6fb3936a0ce58a41adfbc9011Tony Linthicum  if ((A = getLastHexagonArchArg (Args))) {
107243115d4904431917ef6852ee089a8520b9940ba5Sebastian Pop    WhichHexagon = A->getValue(Args);
107343115d4904431917ef6852ee089a8520b9940ba5Sebastian Pop    if (WhichHexagon == "")
107443115d4904431917ef6852ee089a8520b9940ba5Sebastian Pop      return "v4";
107543115d4904431917ef6852ee089a8520b9940ba5Sebastian Pop    else
107643115d4904431917ef6852ee089a8520b9940ba5Sebastian Pop      return WhichHexagon;
10779631939f82c0eaa6fb3936a0ce58a41adfbc9011Tony Linthicum  }
107843115d4904431917ef6852ee089a8520b9940ba5Sebastian Pop  else
107943115d4904431917ef6852ee089a8520b9940ba5Sebastian Pop    return "v4";
10809631939f82c0eaa6fb3936a0ce58a41adfbc9011Tony Linthicum}
10819631939f82c0eaa6fb3936a0ce58a41adfbc9011Tony Linthicum
10829631939f82c0eaa6fb3936a0ce58a41adfbc9011Tony Linthicumvoid Clang::AddHexagonTargetArgs(const ArgList &Args,
10839631939f82c0eaa6fb3936a0ce58a41adfbc9011Tony Linthicum                                 ArgStringList &CmdArgs) const {
10849631939f82c0eaa6fb3936a0ce58a41adfbc9011Tony Linthicum  llvm::Triple Triple = getToolChain().getTriple();
10859631939f82c0eaa6fb3936a0ce58a41adfbc9011Tony Linthicum
10869631939f82c0eaa6fb3936a0ce58a41adfbc9011Tony Linthicum  CmdArgs.push_back("-target-cpu");
108743115d4904431917ef6852ee089a8520b9940ba5Sebastian Pop  CmdArgs.push_back(Args.MakeArgString("hexagon" + getHexagonTargetCPU(Args)));
10889631939f82c0eaa6fb3936a0ce58a41adfbc9011Tony Linthicum  CmdArgs.push_back("-fno-signed-char");
10899631939f82c0eaa6fb3936a0ce58a41adfbc9011Tony Linthicum  CmdArgs.push_back("-nobuiltininc");
10909631939f82c0eaa6fb3936a0ce58a41adfbc9011Tony Linthicum
10915f9688b7c7fdeafdf530056d49f82d2ec6ca457fSirish Pande  if (Args.hasArg(options::OPT_mqdsp6_compat))
10929631939f82c0eaa6fb3936a0ce58a41adfbc9011Tony Linthicum    CmdArgs.push_back("-mqdsp6-compat");
10939631939f82c0eaa6fb3936a0ce58a41adfbc9011Tony Linthicum
10949631939f82c0eaa6fb3936a0ce58a41adfbc9011Tony Linthicum  if (Arg *A = Args.getLastArg(options::OPT_G,
10959631939f82c0eaa6fb3936a0ce58a41adfbc9011Tony Linthicum                               options::OPT_msmall_data_threshold_EQ)) {
10969631939f82c0eaa6fb3936a0ce58a41adfbc9011Tony Linthicum    std::string SmallDataThreshold="-small-data-threshold=";
10979631939f82c0eaa6fb3936a0ce58a41adfbc9011Tony Linthicum    SmallDataThreshold += A->getValue(Args);
10989631939f82c0eaa6fb3936a0ce58a41adfbc9011Tony Linthicum    CmdArgs.push_back ("-mllvm");
10999631939f82c0eaa6fb3936a0ce58a41adfbc9011Tony Linthicum    CmdArgs.push_back(Args.MakeArgString(SmallDataThreshold));
11009631939f82c0eaa6fb3936a0ce58a41adfbc9011Tony Linthicum    A->claim();
11019631939f82c0eaa6fb3936a0ce58a41adfbc9011Tony Linthicum  }
11029631939f82c0eaa6fb3936a0ce58a41adfbc9011Tony Linthicum
11035f9688b7c7fdeafdf530056d49f82d2ec6ca457fSirish Pande  if (!Args.hasArg(options::OPT_fno_short_enums))
11045f9688b7c7fdeafdf530056d49f82d2ec6ca457fSirish Pande    CmdArgs.push_back("-fshort-enums");
11055f9688b7c7fdeafdf530056d49f82d2ec6ca457fSirish Pande  if (Args.getLastArg(options::OPT_mieee_rnd_near)) {
11065f9688b7c7fdeafdf530056d49f82d2ec6ca457fSirish Pande    CmdArgs.push_back ("-mllvm");
11075f9688b7c7fdeafdf530056d49f82d2ec6ca457fSirish Pande    CmdArgs.push_back ("-enable-hexagon-ieee-rnd-near");
11085f9688b7c7fdeafdf530056d49f82d2ec6ca457fSirish Pande  }
11099631939f82c0eaa6fb3936a0ce58a41adfbc9011Tony Linthicum  CmdArgs.push_back ("-mllvm");
11109631939f82c0eaa6fb3936a0ce58a41adfbc9011Tony Linthicum  CmdArgs.push_back ("-machine-sink-split=0");
11119631939f82c0eaa6fb3936a0ce58a41adfbc9011Tony Linthicum}
11129631939f82c0eaa6fb3936a0ce58a41adfbc9011Tony Linthicum
111388b7cf00fcb582728c642da3927c59468efaf926Eric Christopherstatic bool
1114d71315c5511bd1204732216964faa6254dc4b2b6John McCallshouldUseExceptionTablesForObjCExceptions(unsigned objcABIVersion,
1115525544de0835d5ee7497f4897e255727b162e0aaAnders Carlsson                                          const llvm::Triple &Triple) {
1116525544de0835d5ee7497f4897e255727b162e0aaAnders Carlsson  // We use the zero-cost exception tables for Objective-C if the non-fragile
1117525544de0835d5ee7497f4897e255727b162e0aaAnders Carlsson  // ABI is enabled or when compiling for x86_64 and ARM on Snow Leopard and
1118525544de0835d5ee7497f4897e255727b162e0aaAnders Carlsson  // later.
1119525544de0835d5ee7497f4897e255727b162e0aaAnders Carlsson
1120d71315c5511bd1204732216964faa6254dc4b2b6John McCall  if (objcABIVersion >= 2)
1121525544de0835d5ee7497f4897e255727b162e0aaAnders Carlsson    return true;
1122525544de0835d5ee7497f4897e255727b162e0aaAnders Carlsson
1123905c45f15a25598620d19160c139c6b785aeea89Bob Wilson  if (!Triple.isOSDarwin())
1124525544de0835d5ee7497f4897e255727b162e0aaAnders Carlsson    return false;
1125525544de0835d5ee7497f4897e255727b162e0aaAnders Carlsson
1126aa7333c860ac651c75da495217e0d6a9c10c0bb0Eric Christopher  return (!Triple.isMacOSXVersionLT(10,5) &&
1127525544de0835d5ee7497f4897e255727b162e0aaAnders Carlsson          (Triple.getArch() == llvm::Triple::x86_64 ||
112888b7cf00fcb582728c642da3927c59468efaf926Eric Christopher           Triple.getArch() == llvm::Triple::arm));
1129525544de0835d5ee7497f4897e255727b162e0aaAnders Carlsson}
1130525544de0835d5ee7497f4897e255727b162e0aaAnders Carlsson
113115348aeb81285c75b2e92b5bf8d2db3445d147c2Anders Carlsson/// addExceptionArgs - Adds exception related arguments to the driver command
113215348aeb81285c75b2e92b5bf8d2db3445d147c2Anders Carlsson/// arguments. There's a master flag, -fexceptions and also language specific
113315348aeb81285c75b2e92b5bf8d2db3445d147c2Anders Carlsson/// flags to enable/disable C++ and Objective-C exceptions.
113415348aeb81285c75b2e92b5bf8d2db3445d147c2Anders Carlsson/// This makes it possible to for example disable C++ exceptions but enable
113515348aeb81285c75b2e92b5bf8d2db3445d147c2Anders Carlsson/// Objective-C exceptions.
113615348aeb81285c75b2e92b5bf8d2db3445d147c2Anders Carlssonstatic void addExceptionArgs(const ArgList &Args, types::ID InputType,
113715348aeb81285c75b2e92b5bf8d2db3445d147c2Anders Carlsson                             const llvm::Triple &Triple,
113815b77319d0ce4332275992b2f191898a1df50efeFariborz Jahanian                             bool KernelOrKext,
1139d71315c5511bd1204732216964faa6254dc4b2b6John McCall                             unsigned objcABIVersion,
114015348aeb81285c75b2e92b5bf8d2db3445d147c2Anders Carlsson                             ArgStringList &CmdArgs) {
1141afc4baa37c2f38fadf05b15456b10a0994d51b0bChad Rosier  if (KernelOrKext) {
1142afc4baa37c2f38fadf05b15456b10a0994d51b0bChad Rosier    // -mkernel and -fapple-kext imply no exceptions, so claim exception related
1143afc4baa37c2f38fadf05b15456b10a0994d51b0bChad Rosier    // arguments now to avoid warnings about unused arguments.
1144afc4baa37c2f38fadf05b15456b10a0994d51b0bChad Rosier    Args.ClaimAllArgs(options::OPT_fexceptions);
1145afc4baa37c2f38fadf05b15456b10a0994d51b0bChad Rosier    Args.ClaimAllArgs(options::OPT_fno_exceptions);
1146afc4baa37c2f38fadf05b15456b10a0994d51b0bChad Rosier    Args.ClaimAllArgs(options::OPT_fobjc_exceptions);
1147afc4baa37c2f38fadf05b15456b10a0994d51b0bChad Rosier    Args.ClaimAllArgs(options::OPT_fno_objc_exceptions);
1148afc4baa37c2f38fadf05b15456b10a0994d51b0bChad Rosier    Args.ClaimAllArgs(options::OPT_fcxx_exceptions);
1149afc4baa37c2f38fadf05b15456b10a0994d51b0bChad Rosier    Args.ClaimAllArgs(options::OPT_fno_cxx_exceptions);
115015348aeb81285c75b2e92b5bf8d2db3445d147c2Anders Carlsson    return;
1151afc4baa37c2f38fadf05b15456b10a0994d51b0bChad Rosier  }
115215348aeb81285c75b2e92b5bf8d2db3445d147c2Anders Carlsson
115315348aeb81285c75b2e92b5bf8d2db3445d147c2Anders Carlsson  // Exceptions are enabled by default.
115415348aeb81285c75b2e92b5bf8d2db3445d147c2Anders Carlsson  bool ExceptionsEnabled = true;
115515348aeb81285c75b2e92b5bf8d2db3445d147c2Anders Carlsson
115615348aeb81285c75b2e92b5bf8d2db3445d147c2Anders Carlsson  // This keeps track of whether exceptions were explicitly turned on or off.
115715348aeb81285c75b2e92b5bf8d2db3445d147c2Anders Carlsson  bool DidHaveExplicitExceptionFlag = false;
115815348aeb81285c75b2e92b5bf8d2db3445d147c2Anders Carlsson
1159f759df06d997050559fd925758bcd2cdef24db05Rafael Espindola  if (Arg *A = Args.getLastArg(options::OPT_fexceptions,
1160f759df06d997050559fd925758bcd2cdef24db05Rafael Espindola                               options::OPT_fno_exceptions)) {
1161f759df06d997050559fd925758bcd2cdef24db05Rafael Espindola    if (A->getOption().matches(options::OPT_fexceptions))
116215348aeb81285c75b2e92b5bf8d2db3445d147c2Anders Carlsson      ExceptionsEnabled = true;
116388b7cf00fcb582728c642da3927c59468efaf926Eric Christopher    else
116415348aeb81285c75b2e92b5bf8d2db3445d147c2Anders Carlsson      ExceptionsEnabled = false;
116515348aeb81285c75b2e92b5bf8d2db3445d147c2Anders Carlsson
116615348aeb81285c75b2e92b5bf8d2db3445d147c2Anders Carlsson    DidHaveExplicitExceptionFlag = true;
1167f759df06d997050559fd925758bcd2cdef24db05Rafael Espindola  }
11681a2cd4fd5d384faf171a39dea7136ca4672ac35eDaniel Dunbar
116915348aeb81285c75b2e92b5bf8d2db3445d147c2Anders Carlsson  bool ShouldUseExceptionTables = false;
117015348aeb81285c75b2e92b5bf8d2db3445d147c2Anders Carlsson
117115348aeb81285c75b2e92b5bf8d2db3445d147c2Anders Carlsson  // Exception tables and cleanups can be enabled with -fexceptions even if the
117215348aeb81285c75b2e92b5bf8d2db3445d147c2Anders Carlsson  // language itself doesn't support exceptions.
117315348aeb81285c75b2e92b5bf8d2db3445d147c2Anders Carlsson  if (ExceptionsEnabled && DidHaveExplicitExceptionFlag)
117415348aeb81285c75b2e92b5bf8d2db3445d147c2Anders Carlsson    ShouldUseExceptionTables = true;
117515348aeb81285c75b2e92b5bf8d2db3445d147c2Anders Carlsson
1176d47ea693706f7b0ffa68e879b73a71609a337786Daniel Dunbar  // Obj-C exceptions are enabled by default, regardless of -fexceptions. This
1177d47ea693706f7b0ffa68e879b73a71609a337786Daniel Dunbar  // is not necessarily sensible, but follows GCC.
1178d47ea693706f7b0ffa68e879b73a71609a337786Daniel Dunbar  if (types::isObjC(InputType) &&
117988b7cf00fcb582728c642da3927c59468efaf926Eric Christopher      Args.hasFlag(options::OPT_fobjc_exceptions,
1180d47ea693706f7b0ffa68e879b73a71609a337786Daniel Dunbar                   options::OPT_fno_objc_exceptions,
1181d47ea693706f7b0ffa68e879b73a71609a337786Daniel Dunbar                   true)) {
1182d47ea693706f7b0ffa68e879b73a71609a337786Daniel Dunbar    CmdArgs.push_back("-fobjc-exceptions");
1183d47ea693706f7b0ffa68e879b73a71609a337786Daniel Dunbar
118488b7cf00fcb582728c642da3927c59468efaf926Eric Christopher    ShouldUseExceptionTables |=
1185d71315c5511bd1204732216964faa6254dc4b2b6John McCall      shouldUseExceptionTablesForObjCExceptions(objcABIVersion, Triple);
118615348aeb81285c75b2e92b5bf8d2db3445d147c2Anders Carlsson  }
118785caf03ee49c4de87ee9624a9b725ef5d20ee624Fariborz Jahanian
118815348aeb81285c75b2e92b5bf8d2db3445d147c2Anders Carlsson  if (types::isCXX(InputType)) {
118915348aeb81285c75b2e92b5bf8d2db3445d147c2Anders Carlsson    bool CXXExceptionsEnabled = ExceptionsEnabled;
11901a2cd4fd5d384faf171a39dea7136ca4672ac35eDaniel Dunbar
119188b7cf00fcb582728c642da3927c59468efaf926Eric Christopher    if (Arg *A = Args.getLastArg(options::OPT_fcxx_exceptions,
119288b7cf00fcb582728c642da3927c59468efaf926Eric Christopher                                 options::OPT_fno_cxx_exceptions,
119315348aeb81285c75b2e92b5bf8d2db3445d147c2Anders Carlsson                                 options::OPT_fexceptions,
119415348aeb81285c75b2e92b5bf8d2db3445d147c2Anders Carlsson                                 options::OPT_fno_exceptions)) {
119515348aeb81285c75b2e92b5bf8d2db3445d147c2Anders Carlsson      if (A->getOption().matches(options::OPT_fcxx_exceptions))
119615348aeb81285c75b2e92b5bf8d2db3445d147c2Anders Carlsson        CXXExceptionsEnabled = true;
119743f220f6d74e01f2606e429810484177903a28e6Chandler Carruth      else if (A->getOption().matches(options::OPT_fno_cxx_exceptions))
119815348aeb81285c75b2e92b5bf8d2db3445d147c2Anders Carlsson        CXXExceptionsEnabled = false;
119915348aeb81285c75b2e92b5bf8d2db3445d147c2Anders Carlsson    }
120015348aeb81285c75b2e92b5bf8d2db3445d147c2Anders Carlsson
120115348aeb81285c75b2e92b5bf8d2db3445d147c2Anders Carlsson    if (CXXExceptionsEnabled) {
120215348aeb81285c75b2e92b5bf8d2db3445d147c2Anders Carlsson      CmdArgs.push_back("-fcxx-exceptions");
120315348aeb81285c75b2e92b5bf8d2db3445d147c2Anders Carlsson
120415348aeb81285c75b2e92b5bf8d2db3445d147c2Anders Carlsson      ShouldUseExceptionTables = true;
120515348aeb81285c75b2e92b5bf8d2db3445d147c2Anders Carlsson    }
120615348aeb81285c75b2e92b5bf8d2db3445d147c2Anders Carlsson  }
120715348aeb81285c75b2e92b5bf8d2db3445d147c2Anders Carlsson
120815348aeb81285c75b2e92b5bf8d2db3445d147c2Anders Carlsson  if (ShouldUseExceptionTables)
120915348aeb81285c75b2e92b5bf8d2db3445d147c2Anders Carlsson    CmdArgs.push_back("-fexceptions");
1210f759df06d997050559fd925758bcd2cdef24db05Rafael Espindola}
1211f759df06d997050559fd925758bcd2cdef24db05Rafael Espindola
121261b1efe2d0b459a98962fd9b4c097ad8bb9bfdecRafael Espindolastatic bool ShouldDisableCFI(const ArgList &Args,
121361b1efe2d0b459a98962fd9b4c097ad8bb9bfdecRafael Espindola                             const ToolChain &TC) {
1214701ec8d11039fd0c571312253e6b15f22f29c592Rafael Espindola  bool Default = true;
1215905c45f15a25598620d19160c139c6b785aeea89Bob Wilson  if (TC.getTriple().isOSDarwin()) {
121697f6abb4470a82be4a8c6f1603e7bb303f9079b5Rafael Espindola    // The native darwin assembler doesn't support cfi directives, so
1217cb773921b1e8e7cf2a5dba25bd596d4f258a9daaRafael Espindola    // we disable them if we think the .s file will be passed to it.
1218701ec8d11039fd0c571312253e6b15f22f29c592Rafael Espindola    Default = Args.hasFlag(options::OPT_integrated_as,
1219701ec8d11039fd0c571312253e6b15f22f29c592Rafael Espindola			   options::OPT_no_integrated_as,
1220701ec8d11039fd0c571312253e6b15f22f29c592Rafael Espindola			   TC.IsIntegratedAssemblerDefault());
122197f6abb4470a82be4a8c6f1603e7bb303f9079b5Rafael Espindola  }
1222701ec8d11039fd0c571312253e6b15f22f29c592Rafael Espindola  return !Args.hasFlag(options::OPT_fdwarf2_cfi_asm,
1223701ec8d11039fd0c571312253e6b15f22f29c592Rafael Espindola		       options::OPT_fno_dwarf2_cfi_asm,
1224701ec8d11039fd0c571312253e6b15f22f29c592Rafael Espindola		       Default);
122561b1efe2d0b459a98962fd9b4c097ad8bb9bfdecRafael Espindola}
122661b1efe2d0b459a98962fd9b4c097ad8bb9bfdecRafael Espindola
1227ea523d73a6de06f828952a02f5ff86e4cc631695Nick Lewyckystatic bool ShouldDisableDwarfDirectory(const ArgList &Args,
1228ea523d73a6de06f828952a02f5ff86e4cc631695Nick Lewycky                                        const ToolChain &TC) {
1229ea523d73a6de06f828952a02f5ff86e4cc631695Nick Lewycky  bool IsIADefault = TC.IsIntegratedAssemblerDefault();
1230ea523d73a6de06f828952a02f5ff86e4cc631695Nick Lewycky  bool UseIntegratedAs = Args.hasFlag(options::OPT_integrated_as,
1231ea523d73a6de06f828952a02f5ff86e4cc631695Nick Lewycky                                      options::OPT_no_integrated_as,
1232ea523d73a6de06f828952a02f5ff86e4cc631695Nick Lewycky                                      IsIADefault);
1233ea523d73a6de06f828952a02f5ff86e4cc631695Nick Lewycky  bool UseDwarfDirectory = Args.hasFlag(options::OPT_fdwarf_directory_asm,
1234ea523d73a6de06f828952a02f5ff86e4cc631695Nick Lewycky                                        options::OPT_fno_dwarf_directory_asm,
1235ea523d73a6de06f828952a02f5ff86e4cc631695Nick Lewycky                                        UseIntegratedAs);
1236ea523d73a6de06f828952a02f5ff86e4cc631695Nick Lewycky  return !UseDwarfDirectory;
1237ea523d73a6de06f828952a02f5ff86e4cc631695Nick Lewycky}
1238ea523d73a6de06f828952a02f5ff86e4cc631695Nick Lewycky
1239359cf927cf4980099a04b3f3cf040b81d181fe3dJoerg Sonnenberger/// \brief Check whether the given input tree contains any compilation actions.
1240359cf927cf4980099a04b3f3cf040b81d181fe3dJoerg Sonnenbergerstatic bool ContainsCompileAction(const Action *A) {
12415f9e272e632e951b1efe824cd16acb4d96077930Chris Lattner  if (isa<CompileJobAction>(A))
1242359cf927cf4980099a04b3f3cf040b81d181fe3dJoerg Sonnenberger    return true;
1243359cf927cf4980099a04b3f3cf040b81d181fe3dJoerg Sonnenberger
1244359cf927cf4980099a04b3f3cf040b81d181fe3dJoerg Sonnenberger  for (Action::const_iterator it = A->begin(), ie = A->end(); it != ie; ++it)
1245359cf927cf4980099a04b3f3cf040b81d181fe3dJoerg Sonnenberger    if (ContainsCompileAction(*it))
1246359cf927cf4980099a04b3f3cf040b81d181fe3dJoerg Sonnenberger      return true;
1247359cf927cf4980099a04b3f3cf040b81d181fe3dJoerg Sonnenberger
1248359cf927cf4980099a04b3f3cf040b81d181fe3dJoerg Sonnenberger  return false;
1249359cf927cf4980099a04b3f3cf040b81d181fe3dJoerg Sonnenberger}
1250359cf927cf4980099a04b3f3cf040b81d181fe3dJoerg Sonnenberger
1251359cf927cf4980099a04b3f3cf040b81d181fe3dJoerg Sonnenberger/// \brief Check if -relax-all should be passed to the internal assembler.
1252359cf927cf4980099a04b3f3cf040b81d181fe3dJoerg Sonnenberger/// This is done by default when compiling non-assembler source with -O0.
1253359cf927cf4980099a04b3f3cf040b81d181fe3dJoerg Sonnenbergerstatic bool UseRelaxAll(Compilation &C, const ArgList &Args) {
1254359cf927cf4980099a04b3f3cf040b81d181fe3dJoerg Sonnenberger  bool RelaxDefault = true;
1255359cf927cf4980099a04b3f3cf040b81d181fe3dJoerg Sonnenberger
1256359cf927cf4980099a04b3f3cf040b81d181fe3dJoerg Sonnenberger  if (Arg *A = Args.getLastArg(options::OPT_O_Group))
1257359cf927cf4980099a04b3f3cf040b81d181fe3dJoerg Sonnenberger    RelaxDefault = A->getOption().matches(options::OPT_O0);
1258359cf927cf4980099a04b3f3cf040b81d181fe3dJoerg Sonnenberger
1259359cf927cf4980099a04b3f3cf040b81d181fe3dJoerg Sonnenberger  if (RelaxDefault) {
1260359cf927cf4980099a04b3f3cf040b81d181fe3dJoerg Sonnenberger    RelaxDefault = false;
1261359cf927cf4980099a04b3f3cf040b81d181fe3dJoerg Sonnenberger    for (ActionList::const_iterator it = C.getActions().begin(),
1262359cf927cf4980099a04b3f3cf040b81d181fe3dJoerg Sonnenberger           ie = C.getActions().end(); it != ie; ++it) {
1263359cf927cf4980099a04b3f3cf040b81d181fe3dJoerg Sonnenberger      if (ContainsCompileAction(*it)) {
1264359cf927cf4980099a04b3f3cf040b81d181fe3dJoerg Sonnenberger        RelaxDefault = true;
1265359cf927cf4980099a04b3f3cf040b81d181fe3dJoerg Sonnenberger        break;
1266359cf927cf4980099a04b3f3cf040b81d181fe3dJoerg Sonnenberger      }
1267359cf927cf4980099a04b3f3cf040b81d181fe3dJoerg Sonnenberger    }
1268359cf927cf4980099a04b3f3cf040b81d181fe3dJoerg Sonnenberger  }
1269359cf927cf4980099a04b3f3cf040b81d181fe3dJoerg Sonnenberger
1270359cf927cf4980099a04b3f3cf040b81d181fe3dJoerg Sonnenberger  return Args.hasFlag(options::OPT_mrelax_all, options::OPT_mno_relax_all,
1271359cf927cf4980099a04b3f3cf040b81d181fe3dJoerg Sonnenberger    RelaxDefault);
1272359cf927cf4980099a04b3f3cf040b81d181fe3dJoerg Sonnenberger}
1273359cf927cf4980099a04b3f3cf040b81d181fe3dJoerg Sonnenberger
1274dff466c0791465f929a1d8cd551d4c84b360ba32Kostya Serebryany/// If AddressSanitizer is enabled, add appropriate linker flags (Linux).
1275dff466c0791465f929a1d8cd551d4c84b360ba32Kostya Serebryany/// This needs to be called before we add the C run-time (malloc, etc).
1276dff466c0791465f929a1d8cd551d4c84b360ba32Kostya Serebryanystatic void addAsanRTLinux(const ToolChain &TC, const ArgList &Args,
12777b5f1013c5b7f541dc1fae7fc43189377874eabbKostya Serebryany                           ArgStringList &CmdArgs) {
1278a6ddc02921d47d0a1dc9ffe4d31438f250751e05Evgeniy Stepanov  if (!Args.hasFlag(options::OPT_faddress_sanitizer,
1279dff466c0791465f929a1d8cd551d4c84b360ba32Kostya Serebryany                    options::OPT_fno_address_sanitizer, false))
1280dff466c0791465f929a1d8cd551d4c84b360ba32Kostya Serebryany    return;
1281a6ddc02921d47d0a1dc9ffe4d31438f250751e05Evgeniy Stepanov  if(TC.getTriple().getEnvironment() == llvm::Triple::ANDROIDEABI) {
1282a6ddc02921d47d0a1dc9ffe4d31438f250751e05Evgeniy Stepanov    if (!Args.hasArg(options::OPT_shared)) {
1283a6ddc02921d47d0a1dc9ffe4d31438f250751e05Evgeniy Stepanov      // For an executable, we add a .preinit_array stub.
1284a6ddc02921d47d0a1dc9ffe4d31438f250751e05Evgeniy Stepanov      CmdArgs.push_back("-u");
1285a6ddc02921d47d0a1dc9ffe4d31438f250751e05Evgeniy Stepanov      CmdArgs.push_back("__asan_preinit");
1286a6ddc02921d47d0a1dc9ffe4d31438f250751e05Evgeniy Stepanov      CmdArgs.push_back("-lasan");
1287a6ddc02921d47d0a1dc9ffe4d31438f250751e05Evgeniy Stepanov    }
12888cd0d25df91d7172bfd0ed6013f89ad0083ce301Daniel Dunbar
1289a6ddc02921d47d0a1dc9ffe4d31438f250751e05Evgeniy Stepanov    CmdArgs.push_back("-lasan_preload");
1290a6ddc02921d47d0a1dc9ffe4d31438f250751e05Evgeniy Stepanov    CmdArgs.push_back("-ldl");
1291a6ddc02921d47d0a1dc9ffe4d31438f250751e05Evgeniy Stepanov  } else {
1292a6ddc02921d47d0a1dc9ffe4d31438f250751e05Evgeniy Stepanov    if (!Args.hasArg(options::OPT_shared)) {
1293a6ddc02921d47d0a1dc9ffe4d31438f250751e05Evgeniy Stepanov      // LibAsan is "libclang_rt.asan-<ArchName>.a" in the Linux library
1294a6ddc02921d47d0a1dc9ffe4d31438f250751e05Evgeniy Stepanov      // resource directory.
1295a6ddc02921d47d0a1dc9ffe4d31438f250751e05Evgeniy Stepanov      SmallString<128> LibAsan(TC.getDriver().ResourceDir);
1296a6ddc02921d47d0a1dc9ffe4d31438f250751e05Evgeniy Stepanov      llvm::sys::path::append(LibAsan, "lib", "linux",
1297a6ddc02921d47d0a1dc9ffe4d31438f250751e05Evgeniy Stepanov                              (Twine("libclang_rt.asan-") +
1298a6ddc02921d47d0a1dc9ffe4d31438f250751e05Evgeniy Stepanov                               TC.getArchName() + ".a"));
1299a6ddc02921d47d0a1dc9ffe4d31438f250751e05Evgeniy Stepanov      CmdArgs.push_back(Args.MakeArgString(LibAsan));
1300a6ddc02921d47d0a1dc9ffe4d31438f250751e05Evgeniy Stepanov      CmdArgs.push_back("-lpthread");
1301a6ddc02921d47d0a1dc9ffe4d31438f250751e05Evgeniy Stepanov      CmdArgs.push_back("-ldl");
1302a6ddc02921d47d0a1dc9ffe4d31438f250751e05Evgeniy Stepanov      CmdArgs.push_back("-export-dynamic");
1303a6ddc02921d47d0a1dc9ffe4d31438f250751e05Evgeniy Stepanov    }
1304a6ddc02921d47d0a1dc9ffe4d31438f250751e05Evgeniy Stepanov  }
1305dff466c0791465f929a1d8cd551d4c84b360ba32Kostya Serebryany}
1306dff466c0791465f929a1d8cd551d4c84b360ba32Kostya Serebryany
1307f7efb0e7478da45bc7f2d24dbeb08406d2399591Kostya Serebryany/// If ThreadSanitizer is enabled, add appropriate linker flags (Linux).
1308f7efb0e7478da45bc7f2d24dbeb08406d2399591Kostya Serebryany/// This needs to be called before we add the C run-time (malloc, etc).
1309f7efb0e7478da45bc7f2d24dbeb08406d2399591Kostya Serebryanystatic void addTsanRTLinux(const ToolChain &TC, const ArgList &Args,
1310f7efb0e7478da45bc7f2d24dbeb08406d2399591Kostya Serebryany                           ArgStringList &CmdArgs) {
1311f7efb0e7478da45bc7f2d24dbeb08406d2399591Kostya Serebryany  if (!Args.hasFlag(options::OPT_fthread_sanitizer,
1312f7efb0e7478da45bc7f2d24dbeb08406d2399591Kostya Serebryany                    options::OPT_fno_thread_sanitizer, false))
1313f7efb0e7478da45bc7f2d24dbeb08406d2399591Kostya Serebryany    return;
1314f7efb0e7478da45bc7f2d24dbeb08406d2399591Kostya Serebryany  if (!Args.hasArg(options::OPT_shared)) {
1315f7efb0e7478da45bc7f2d24dbeb08406d2399591Kostya Serebryany    // LibTsan is "libclang_rt.tsan-<ArchName>.a" in the Linux library
1316f7efb0e7478da45bc7f2d24dbeb08406d2399591Kostya Serebryany    // resource directory.
1317f7efb0e7478da45bc7f2d24dbeb08406d2399591Kostya Serebryany    SmallString<128> LibTsan(TC.getDriver().ResourceDir);
1318f7efb0e7478da45bc7f2d24dbeb08406d2399591Kostya Serebryany    llvm::sys::path::append(LibTsan, "lib", "linux",
1319f7efb0e7478da45bc7f2d24dbeb08406d2399591Kostya Serebryany                            (Twine("libclang_rt.tsan-") +
1320f7efb0e7478da45bc7f2d24dbeb08406d2399591Kostya Serebryany                             TC.getArchName() + ".a"));
1321f7efb0e7478da45bc7f2d24dbeb08406d2399591Kostya Serebryany    CmdArgs.push_back(Args.MakeArgString(LibTsan));
1322f7efb0e7478da45bc7f2d24dbeb08406d2399591Kostya Serebryany    CmdArgs.push_back("-lpthread");
1323f7efb0e7478da45bc7f2d24dbeb08406d2399591Kostya Serebryany    CmdArgs.push_back("-ldl");
1324f7efb0e7478da45bc7f2d24dbeb08406d2399591Kostya Serebryany    CmdArgs.push_back("-export-dynamic");
1325f7efb0e7478da45bc7f2d24dbeb08406d2399591Kostya Serebryany  }
1326f7efb0e7478da45bc7f2d24dbeb08406d2399591Kostya Serebryany}
1327f7efb0e7478da45bc7f2d24dbeb08406d2399591Kostya Serebryany
13286af27ec69560f7e4b0dac4a0b4341cd6062f6852Rafael Espindolastatic bool shouldUseFramePointer(const ArgList &Args,
13296af27ec69560f7e4b0dac4a0b4341cd6062f6852Rafael Espindola                                  const llvm::Triple &Triple) {
13306af27ec69560f7e4b0dac4a0b4341cd6062f6852Rafael Espindola  if (Arg *A = Args.getLastArg(options::OPT_fno_omit_frame_pointer,
13316af27ec69560f7e4b0dac4a0b4341cd6062f6852Rafael Espindola                               options::OPT_fomit_frame_pointer))
13326af27ec69560f7e4b0dac4a0b4341cd6062f6852Rafael Espindola    return A->getOption().matches(options::OPT_fno_omit_frame_pointer);
13336af27ec69560f7e4b0dac4a0b4341cd6062f6852Rafael Espindola
1334a2a178989b2f6623b6a8ccf73dc0ccd98ee5bdf9Rafael Espindola  // Don't use a frame pointer on linux x86 and x86_64 if optimizing.
13356af27ec69560f7e4b0dac4a0b4341cd6062f6852Rafael Espindola  if ((Triple.getArch() == llvm::Triple::x86_64 ||
13366af27ec69560f7e4b0dac4a0b4341cd6062f6852Rafael Espindola       Triple.getArch() == llvm::Triple::x86) &&
13376af27ec69560f7e4b0dac4a0b4341cd6062f6852Rafael Espindola      Triple.getOS() == llvm::Triple::Linux) {
13386af27ec69560f7e4b0dac4a0b4341cd6062f6852Rafael Espindola    if (Arg *A = Args.getLastArg(options::OPT_O_Group))
13396af27ec69560f7e4b0dac4a0b4341cd6062f6852Rafael Espindola      if (!A->getOption().matches(options::OPT_O0))
13406af27ec69560f7e4b0dac4a0b4341cd6062f6852Rafael Espindola        return false;
13416af27ec69560f7e4b0dac4a0b4341cd6062f6852Rafael Espindola  }
13426af27ec69560f7e4b0dac4a0b4341cd6062f6852Rafael Espindola
13436af27ec69560f7e4b0dac4a0b4341cd6062f6852Rafael Espindola  return true;
13446af27ec69560f7e4b0dac4a0b4341cd6062f6852Rafael Espindola}
13456af27ec69560f7e4b0dac4a0b4341cd6062f6852Rafael Espindola
134647ac7d27c44bd64a7d0fc03d4babc196cf2b8230Daniel Dunbarvoid Clang::ConstructJob(Compilation &C, const JobAction &JA,
1347871adcf4e41285e3f4c3b62eaa1b2e05b60b92daDaniel Dunbar                         const InputInfo &Output,
134862cf601812e03dd9bc5df42b8ef06a0cdedc38bfDaniel Dunbar                         const InputInfoList &Inputs,
13491d46033f760ba5fd266ce59fe391fac473f04f52Daniel Dunbar                         const ArgList &Args,
135047ac7d27c44bd64a7d0fc03d4babc196cf2b8230Daniel Dunbar                         const char *LinkingOutput) const {
13510a80ba74ffa3d3df55abfbc4474d7470c7c923e3Daniel Dunbar  bool KernelOrKext = Args.hasArg(options::OPT_mkernel,
13520a80ba74ffa3d3df55abfbc4474d7470c7c923e3Daniel Dunbar                                  options::OPT_fapple_kext);
1353ee788e70fcd0adf76103b17c78ac658d4ea30c9bDaniel Dunbar  const Driver &D = getToolChain().getDriver();
1354b488c1dac8e53206f07103d794a62a3f5012c0f4Daniel Dunbar  ArgStringList CmdArgs;
1355b488c1dac8e53206f07103d794a62a3f5012c0f4Daniel Dunbar
1356077ba6a3ac3628afb0d3c460e81ce013bccbdbedDaniel Dunbar  assert(Inputs.size() == 1 && "Unable to handle multiple inputs.");
1357077ba6a3ac3628afb0d3c460e81ce013bccbdbedDaniel Dunbar
13588ff5b28d6efcffe2251e77634c7edf83a4763344Daniel Dunbar  // Invoke ourselves in -cc1 mode.
13598ff5b28d6efcffe2251e77634c7edf83a4763344Daniel Dunbar  //
13608ff5b28d6efcffe2251e77634c7edf83a4763344Daniel Dunbar  // FIXME: Implement custom jobs for internal actions.
13618ff5b28d6efcffe2251e77634c7edf83a4763344Daniel Dunbar  CmdArgs.push_back("-cc1");
13628ff5b28d6efcffe2251e77634c7edf83a4763344Daniel Dunbar
1363dd4fe00f03d8749b283948ea86aa1e4a53ed21abDaniel Dunbar  // Add the "effective" target triple.
1364af07f936b698575f2c91f1c1134c116f1ef0deddDaniel Dunbar  CmdArgs.push_back("-triple");
136500577ada44c889fbe311d61c51a8da89e65c7c9aDaniel Dunbar  std::string TripleStr = getToolChain().ComputeEffectiveClangTriple(Args);
1366dd4fe00f03d8749b283948ea86aa1e4a53ed21abDaniel Dunbar  CmdArgs.push_back(Args.MakeArgString(TripleStr));
1367728a512753d85a6ccaae34e81385c8665c2de0e1Daniel Dunbar
1368dd4fe00f03d8749b283948ea86aa1e4a53ed21abDaniel Dunbar  // Select the appropriate action.
13695314e448631f166c89e908cc1ab45dc7eda916baDaniel Dunbar  bool IsRewriter = false;
1370e982cc0ea3e9255b8aacf8f0bff559e9b1cfd72eFariborz Jahanian  bool IsModernRewriter = false;
1371e982cc0ea3e9255b8aacf8f0bff559e9b1cfd72eFariborz Jahanian
13721d46033f760ba5fd266ce59fe391fac473f04f52Daniel Dunbar  if (isa<AnalyzeJobAction>(JA)) {
13731d46033f760ba5fd266ce59fe391fac473f04f52Daniel Dunbar    assert(JA.getType() == types::TY_Plist && "Invalid output type.");
13741d46033f760ba5fd266ce59fe391fac473f04f52Daniel Dunbar    CmdArgs.push_back("-analyze");
137530660a898545416f0fea2d717f16f75640001e38Ted Kremenek  } else if (isa<MigrateJobAction>(JA)) {
137630660a898545416f0fea2d717f16f75640001e38Ted Kremenek    CmdArgs.push_back("-migrate");
13771d46033f760ba5fd266ce59fe391fac473f04f52Daniel Dunbar  } else if (isa<PreprocessJobAction>(JA)) {
1378cd8e4c44dd068956e9181381be3ee2d49a0fac52Daniel Dunbar    if (Output.getType() == types::TY_Dependencies)
1379cd8e4c44dd068956e9181381be3ee2d49a0fac52Daniel Dunbar      CmdArgs.push_back("-Eonly");
1380cd8e4c44dd068956e9181381be3ee2d49a0fac52Daniel Dunbar    else
1381cd8e4c44dd068956e9181381be3ee2d49a0fac52Daniel Dunbar      CmdArgs.push_back("-E");
13828767cbc475ed96397b6f08617814eeb9cab121bdDaniel Dunbar  } else if (isa<AssembleJobAction>(JA)) {
13838767cbc475ed96397b6f08617814eeb9cab121bdDaniel Dunbar    CmdArgs.push_back("-emit-obj");
13849929800b8dfced61e9c97dc8d6e71e144ebf8accDaniel Dunbar
1385359cf927cf4980099a04b3f3cf040b81d181fe3dJoerg Sonnenberger    if (UseRelaxAll(C, Args))
13869929800b8dfced61e9c97dc8d6e71e144ebf8accDaniel Dunbar      CmdArgs.push_back("-mrelax-all");
1387ca0e0545c216afaacba6da6c82a270dc2efc4e3fDaniel Dunbar
1388fcec10bded7b9b9268af5232fa17617db0df68edDaniel Dunbar    // When using an integrated assembler, translate -Wa, and -Xassembler
1389fcec10bded7b9b9268af5232fa17617db0df68edDaniel Dunbar    // options.
1390fcec10bded7b9b9268af5232fa17617db0df68edDaniel Dunbar    for (arg_iterator it = Args.filtered_begin(options::OPT_Wa_COMMA,
1391fcec10bded7b9b9268af5232fa17617db0df68edDaniel Dunbar                                               options::OPT_Xassembler),
1392fcec10bded7b9b9268af5232fa17617db0df68edDaniel Dunbar           ie = Args.filtered_end(); it != ie; ++it) {
1393fcec10bded7b9b9268af5232fa17617db0df68edDaniel Dunbar      const Arg *A = *it;
1394fcec10bded7b9b9268af5232fa17617db0df68edDaniel Dunbar      A->claim();
1395fcec10bded7b9b9268af5232fa17617db0df68edDaniel Dunbar
1396fcec10bded7b9b9268af5232fa17617db0df68edDaniel Dunbar      for (unsigned i = 0, e = A->getNumValues(); i != e; ++i) {
13975f9e272e632e951b1efe824cd16acb4d96077930Chris Lattner        StringRef Value = A->getValue(Args, i);
1398fcec10bded7b9b9268af5232fa17617db0df68edDaniel Dunbar
1399fcec10bded7b9b9268af5232fa17617db0df68edDaniel Dunbar        if (Value == "-force_cpusubtype_ALL") {
1400fcec10bded7b9b9268af5232fa17617db0df68edDaniel Dunbar          // Do nothing, this is the default and we don't support anything else.
1401b14eed0ed44ed3af881219dab7dc6464cad5303bDaniel Dunbar        } else if (Value == "-L") {
1402969323239f16589329d091a2b8ef200fcfe7c9e9Daniel Dunbar          CmdArgs.push_back("-msave-temp-labels");
140346a49391efab20d7a2a1c18f22edb3d76b465252Joerg Sonnenberger        } else if (Value == "--fatal-warnings") {
1404d793350dee89688f1cc939096dc60c3bc15c20feJoerg Sonnenberger          CmdArgs.push_back("-mllvm");
1405d793350dee89688f1cc939096dc60c3bc15c20feJoerg Sonnenberger          CmdArgs.push_back("-fatal-assembler-warnings");
1406c3b9014c7236a15cf467662264b243a22c420312Nick Lewycky        } else if (Value == "--noexecstack") {
1407c3b9014c7236a15cf467662264b243a22c420312Nick Lewycky          CmdArgs.push_back("-mnoexecstack");
1408fcec10bded7b9b9268af5232fa17617db0df68edDaniel Dunbar        } else {
14095f9e272e632e951b1efe824cd16acb4d96077930Chris Lattner          D.Diag(diag::err_drv_unsupported_option_argument)
1410fcec10bded7b9b9268af5232fa17617db0df68edDaniel Dunbar            << A->getOption().getName() << Value;
1411fcec10bded7b9b9268af5232fa17617db0df68edDaniel Dunbar        }
1412fcec10bded7b9b9268af5232fa17617db0df68edDaniel Dunbar      }
1413fcec10bded7b9b9268af5232fa17617db0df68edDaniel Dunbar    }
1414d02bba8e2abceebd91c162ee4479623791f455b5Daniel Dunbar
1415d02bba8e2abceebd91c162ee4479623791f455b5Daniel Dunbar    // Also ignore explicit -force_cpusubtype_ALL option.
1416d02bba8e2abceebd91c162ee4479623791f455b5Daniel Dunbar    (void) Args.hasArg(options::OPT_force__cpusubtype__ALL);
14171d46033f760ba5fd266ce59fe391fac473f04f52Daniel Dunbar  } else if (isa<PrecompileJobAction>(JA)) {
1418e5c35377020d6c38d16434c9f373a5fa9bb4f2ebArgyrios Kyrtzidis    // Use PCH if the user requested it.
14190ebd9321ba380471010341f24c874f46f56e7581Daniel Dunbar    bool UsePCH = D.CCCUsePCH;
14200ebd9321ba380471010341f24c874f46f56e7581Daniel Dunbar
14210ebd9321ba380471010341f24c874f46f56e7581Daniel Dunbar    if (UsePCH)
1422df91ef3d6c55692a0236f67b6c6b134a3bf84098Douglas Gregor      CmdArgs.push_back("-emit-pch");
1423df91ef3d6c55692a0236f67b6c6b134a3bf84098Douglas Gregor    else
1424df91ef3d6c55692a0236f67b6c6b134a3bf84098Douglas Gregor      CmdArgs.push_back("-emit-pth");
14251d46033f760ba5fd266ce59fe391fac473f04f52Daniel Dunbar  } else {
14261d46033f760ba5fd266ce59fe391fac473f04f52Daniel Dunbar    assert(isa<CompileJobAction>(JA) && "Invalid action for clang tool.");
1427c21c485b4fb58ef5d55cf3e523263dd824a2ace4Daniel Dunbar
14281d46033f760ba5fd266ce59fe391fac473f04f52Daniel Dunbar    if (JA.getType() == types::TY_Nothing) {
14291d46033f760ba5fd266ce59fe391fac473f04f52Daniel Dunbar      CmdArgs.push_back("-fsyntax-only");
14306c6424bc0d3b5f080a97b5f6ef4a8d70c38e38f5Daniel Dunbar    } else if (JA.getType() == types::TY_LLVM_IR ||
14316c6424bc0d3b5f080a97b5f6ef4a8d70c38e38f5Daniel Dunbar               JA.getType() == types::TY_LTO_IR) {
14321d46033f760ba5fd266ce59fe391fac473f04f52Daniel Dunbar      CmdArgs.push_back("-emit-llvm");
14336c6424bc0d3b5f080a97b5f6ef4a8d70c38e38f5Daniel Dunbar    } else if (JA.getType() == types::TY_LLVM_BC ||
14346c6424bc0d3b5f080a97b5f6ef4a8d70c38e38f5Daniel Dunbar               JA.getType() == types::TY_LTO_BC) {
14351d46033f760ba5fd266ce59fe391fac473f04f52Daniel Dunbar      CmdArgs.push_back("-emit-llvm-bc");
14361d46033f760ba5fd266ce59fe391fac473f04f52Daniel Dunbar    } else if (JA.getType() == types::TY_PP_Asm) {
1437e3b8d07e02861d245612b02b5f5a2c1f34b2a394Daniel Dunbar      CmdArgs.push_back("-S");
14385915fbf310e171c4cd3c2af05e9de360c0fa988aDaniel Dunbar    } else if (JA.getType() == types::TY_AST) {
14395915fbf310e171c4cd3c2af05e9de360c0fa988aDaniel Dunbar      CmdArgs.push_back("-emit-pch");
144064952508c2b0c8bffb45c8b410f0af3d2457f59bDaniel Dunbar    } else if (JA.getType() == types::TY_RewrittenObjC) {
144164952508c2b0c8bffb45c8b410f0af3d2457f59bDaniel Dunbar      CmdArgs.push_back("-rewrite-objc");
1442e982cc0ea3e9255b8aacf8f0bff559e9b1cfd72eFariborz Jahanian      IsModernRewriter = true;
1443582b395ea4d5dfe353e2132a470d39efe2f84a54Fariborz Jahanian    } else if (JA.getType() == types::TY_RewrittenLegacyObjC) {
1444582b395ea4d5dfe353e2132a470d39efe2f84a54Fariborz Jahanian      CmdArgs.push_back("-rewrite-objc");
14455314e448631f166c89e908cc1ab45dc7eda916baDaniel Dunbar      IsRewriter = true;
144664952508c2b0c8bffb45c8b410f0af3d2457f59bDaniel Dunbar    } else {
144764952508c2b0c8bffb45c8b410f0af3d2457f59bDaniel Dunbar      assert(JA.getType() == types::TY_PP_Asm &&
144864952508c2b0c8bffb45c8b410f0af3d2457f59bDaniel Dunbar             "Unexpected output type!");
14491d46033f760ba5fd266ce59fe391fac473f04f52Daniel Dunbar    }
14501d46033f760ba5fd266ce59fe391fac473f04f52Daniel Dunbar  }
14511d46033f760ba5fd266ce59fe391fac473f04f52Daniel Dunbar
14521d46033f760ba5fd266ce59fe391fac473f04f52Daniel Dunbar  // The make clang go fast button.
14531d46033f760ba5fd266ce59fe391fac473f04f52Daniel Dunbar  CmdArgs.push_back("-disable-free");
14541d46033f760ba5fd266ce59fe391fac473f04f52Daniel Dunbar
1455b689afb75049012a431d483432114ad5e75d4a92John McCall  // Disable the verification pass in -asserts builds.
1456b689afb75049012a431d483432114ad5e75d4a92John McCall#ifdef NDEBUG
1457b689afb75049012a431d483432114ad5e75d4a92John McCall  CmdArgs.push_back("-disable-llvm-verifier");
1458b689afb75049012a431d483432114ad5e75d4a92John McCall#endif
1459b689afb75049012a431d483432114ad5e75d4a92John McCall
1460c9abc043af88f90d177a5bd147f627b78ca49fdeDaniel Dunbar  // Set the main file name, so that debug info works even with
1461c9abc043af88f90d177a5bd147f627b78ca49fdeDaniel Dunbar  // -save-temps.
1462c9abc043af88f90d177a5bd147f627b78ca49fdeDaniel Dunbar  CmdArgs.push_back("-main-file-name");
1463c9abc043af88f90d177a5bd147f627b78ca49fdeDaniel Dunbar  CmdArgs.push_back(darwin::CC1::getBaseInputName(Args, Inputs));
1464c9abc043af88f90d177a5bd147f627b78ca49fdeDaniel Dunbar
14653bbc75302fd43cf13d868b46c94ff8794b302e43Daniel Dunbar  // Some flags which affect the language (via preprocessor
14663bbc75302fd43cf13d868b46c94ff8794b302e43Daniel Dunbar  // defines). See darwin::CC1::AddCPPArgs.
14673bbc75302fd43cf13d868b46c94ff8794b302e43Daniel Dunbar  if (Args.hasArg(options::OPT_static))
14683bbc75302fd43cf13d868b46c94ff8794b302e43Daniel Dunbar    CmdArgs.push_back("-static-define");
14693bbc75302fd43cf13d868b46c94ff8794b302e43Daniel Dunbar
14701d46033f760ba5fd266ce59fe391fac473f04f52Daniel Dunbar  if (isa<AnalyzeJobAction>(JA)) {
1471b8bb3e797c5687715c6d9d960ee573e4d0e62230Ted Kremenek    // Enable region store model by default.
1472b8bb3e797c5687715c6d9d960ee573e4d0e62230Ted Kremenek    CmdArgs.push_back("-analyzer-store=region");
1473b8bb3e797c5687715c6d9d960ee573e4d0e62230Ted Kremenek
1474b40d06dec23b53bbc1157a9adae7f887be31aa3bTed Kremenek    // Treat blocks as analysis entry points.
1475b40d06dec23b53bbc1157a9adae7f887be31aa3bTed Kremenek    CmdArgs.push_back("-analyzer-opt-analyze-nested-blocks");
1476b40d06dec23b53bbc1157a9adae7f887be31aa3bTed Kremenek
14775188507b9a1b09ec95c14ffadf0e832f2b47aa8aTed Kremenek    CmdArgs.push_back("-analyzer-eagerly-assume");
14785188507b9a1b09ec95c14ffadf0e832f2b47aa8aTed Kremenek
147966253352131e3e7a22b3bfd0e180607aa2bfb988Anna Zaks    CmdArgs.push_back("-analyzer-ipa=inlining");
1480278f1f8d9557babb22b966379dd89039f3f8a440Anna Zaks
14811d46033f760ba5fd266ce59fe391fac473f04f52Daniel Dunbar    // Add default argument set.
1482d8fc0f2e7751cf31cec5c2f3cc6a0b447e9debb3Daniel Dunbar    if (!Args.hasArg(options::OPT__analyzer_no_default_checks)) {
1483027a6abdd6cedc0b8203da72eed6d15c796dce9dArgyrios Kyrtzidis      CmdArgs.push_back("-analyzer-checker=core");
14845188507b9a1b09ec95c14ffadf0e832f2b47aa8aTed Kremenek
1485027a6abdd6cedc0b8203da72eed6d15c796dce9dArgyrios Kyrtzidis      if (getToolChain().getTriple().getOS() != llvm::Triple::Win32)
1486027a6abdd6cedc0b8203da72eed6d15c796dce9dArgyrios Kyrtzidis        CmdArgs.push_back("-analyzer-checker=unix");
1487027a6abdd6cedc0b8203da72eed6d15c796dce9dArgyrios Kyrtzidis
14885188507b9a1b09ec95c14ffadf0e832f2b47aa8aTed Kremenek      if (getToolChain().getTriple().getVendor() == llvm::Triple::Apple)
14895188507b9a1b09ec95c14ffadf0e832f2b47aa8aTed Kremenek        CmdArgs.push_back("-analyzer-checker=osx");
1490a8180e5a8795b4b80587662167dfc13646a494a1Ted Kremenek
1491a8180e5a8795b4b80587662167dfc13646a494a1Ted Kremenek      CmdArgs.push_back("-analyzer-checker=deadcode");
14928dc0506df167a426df324f47d8367bd824f26e7fTed Kremenek
14938dc0506df167a426df324f47d8367bd824f26e7fTed Kremenek      // Enable the following experimental checkers for testing.
14948dc0506df167a426df324f47d8367bd824f26e7fTed Kremenek      CmdArgs.push_back("-analyzer-checker=security.insecureAPI.UncheckedReturn");
14958dc0506df167a426df324f47d8367bd824f26e7fTed Kremenek      CmdArgs.push_back("-analyzer-checker=security.insecureAPI.getpw");
14968dc0506df167a426df324f47d8367bd824f26e7fTed Kremenek      CmdArgs.push_back("-analyzer-checker=security.insecureAPI.gets");
14978dc0506df167a426df324f47d8367bd824f26e7fTed Kremenek      CmdArgs.push_back("-analyzer-checker=security.insecureAPI.mktemp");
14988dc0506df167a426df324f47d8367bd824f26e7fTed Kremenek      CmdArgs.push_back("-analyzer-checker=security.insecureAPI.mkstemp");
14998dc0506df167a426df324f47d8367bd824f26e7fTed Kremenek      CmdArgs.push_back("-analyzer-checker=security.insecureAPI.vfork");
1500d8fc0f2e7751cf31cec5c2f3cc6a0b447e9debb3Daniel Dunbar    }
1501d8fc0f2e7751cf31cec5c2f3cc6a0b447e9debb3Daniel Dunbar
1502d8fc0f2e7751cf31cec5c2f3cc6a0b447e9debb3Daniel Dunbar    // Set the output format. The default is plist, for (lame) historical
1503d8fc0f2e7751cf31cec5c2f3cc6a0b447e9debb3Daniel Dunbar    // reasons.
1504d8fc0f2e7751cf31cec5c2f3cc6a0b447e9debb3Daniel Dunbar    CmdArgs.push_back("-analyzer-output");
1505d8fc0f2e7751cf31cec5c2f3cc6a0b447e9debb3Daniel Dunbar    if (Arg *A = Args.getLastArg(options::OPT__analyzer_output))
1506d8fc0f2e7751cf31cec5c2f3cc6a0b447e9debb3Daniel Dunbar      CmdArgs.push_back(A->getValue(Args));
1507d8fc0f2e7751cf31cec5c2f3cc6a0b447e9debb3Daniel Dunbar    else
1508d8fc0f2e7751cf31cec5c2f3cc6a0b447e9debb3Daniel Dunbar      CmdArgs.push_back("plist");
15091d46033f760ba5fd266ce59fe391fac473f04f52Daniel Dunbar
15100647a7b9ad844565b8a4b5e1a5de882dd64efabfTed Kremenek    // Disable the presentation of standard compiler warnings when
15110647a7b9ad844565b8a4b5e1a5de882dd64efabfTed Kremenek    // using --analyze.  We only want to show static analyzer diagnostics
15120647a7b9ad844565b8a4b5e1a5de882dd64efabfTed Kremenek    // or frontend errors.
15130647a7b9ad844565b8a4b5e1a5de882dd64efabfTed Kremenek    CmdArgs.push_back("-w");
15140647a7b9ad844565b8a4b5e1a5de882dd64efabfTed Kremenek
15151d46033f760ba5fd266ce59fe391fac473f04f52Daniel Dunbar    // Add -Xanalyzer arguments when running as analyzer.
15161d46033f760ba5fd266ce59fe391fac473f04f52Daniel Dunbar    Args.AddAllArgValues(CmdArgs, options::OPT_Xanalyzer);
15171eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump  }
15181eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump
1519e2fd66418eca3d70cf6b62087d745d0c5181db69Daniel Dunbar  CheckCodeGenerationOptions(D, Args);
1520e2fd66418eca3d70cf6b62087d745d0c5181db69Daniel Dunbar
1521bc85be85779a47bae728bbe6a2cd2e3732b1333dDaniel Dunbar  // Perform argument translation for LLVM backend. This
1522bc85be85779a47bae728bbe6a2cd2e3732b1333dDaniel Dunbar  // takes some care in reconciling with llvm-gcc. The
1523bc85be85779a47bae728bbe6a2cd2e3732b1333dDaniel Dunbar  // issue is that llvm-gcc translates these options based on
1524bc85be85779a47bae728bbe6a2cd2e3732b1333dDaniel Dunbar  // the values in cc1, whereas we are processing based on
1525bc85be85779a47bae728bbe6a2cd2e3732b1333dDaniel Dunbar  // the driver arguments.
15269fd0b1f845a61e71dd8099f596532d34c519630aDaniel Dunbar
1527bc85be85779a47bae728bbe6a2cd2e3732b1333dDaniel Dunbar  // This comes from the default translation the driver + cc1
1528bc85be85779a47bae728bbe6a2cd2e3732b1333dDaniel Dunbar  // would do to enable flag_pic.
1529bc85be85779a47bae728bbe6a2cd2e3732b1333dDaniel Dunbar  //
1530bc85be85779a47bae728bbe6a2cd2e3732b1333dDaniel Dunbar  // FIXME: Centralize this code.
15315e219cf7f896873c1c1e64b9e87a7dade99debbaChandler Carruth  Arg *LastPICArg = 0;
15325e219cf7f896873c1c1e64b9e87a7dade99debbaChandler Carruth  for (ArgList::const_iterator I = Args.begin(), E = Args.end(); I != E; ++I) {
15335e219cf7f896873c1c1e64b9e87a7dade99debbaChandler Carruth    if ((*I)->getOption().matches(options::OPT_fPIC) ||
15345e219cf7f896873c1c1e64b9e87a7dade99debbaChandler Carruth        (*I)->getOption().matches(options::OPT_fno_PIC) ||
15355e219cf7f896873c1c1e64b9e87a7dade99debbaChandler Carruth        (*I)->getOption().matches(options::OPT_fpic) ||
15365e219cf7f896873c1c1e64b9e87a7dade99debbaChandler Carruth        (*I)->getOption().matches(options::OPT_fno_pic) ||
15375e219cf7f896873c1c1e64b9e87a7dade99debbaChandler Carruth        (*I)->getOption().matches(options::OPT_fPIE) ||
15385e219cf7f896873c1c1e64b9e87a7dade99debbaChandler Carruth        (*I)->getOption().matches(options::OPT_fno_PIE) ||
15395e219cf7f896873c1c1e64b9e87a7dade99debbaChandler Carruth        (*I)->getOption().matches(options::OPT_fpie) ||
15405e219cf7f896873c1c1e64b9e87a7dade99debbaChandler Carruth        (*I)->getOption().matches(options::OPT_fno_pie)) {
15415e219cf7f896873c1c1e64b9e87a7dade99debbaChandler Carruth      LastPICArg = *I;
15425e219cf7f896873c1c1e64b9e87a7dade99debbaChandler Carruth      (*I)->claim();
15435e219cf7f896873c1c1e64b9e87a7dade99debbaChandler Carruth    }
15445e219cf7f896873c1c1e64b9e87a7dade99debbaChandler Carruth  }
15455e219cf7f896873c1c1e64b9e87a7dade99debbaChandler Carruth  bool PICDisabled = false;
15465e219cf7f896873c1c1e64b9e87a7dade99debbaChandler Carruth  bool PICEnabled = false;
15475e219cf7f896873c1c1e64b9e87a7dade99debbaChandler Carruth  bool PICForPIE = false;
15485e219cf7f896873c1c1e64b9e87a7dade99debbaChandler Carruth  if (LastPICArg) {
15495e219cf7f896873c1c1e64b9e87a7dade99debbaChandler Carruth    PICForPIE = (LastPICArg->getOption().matches(options::OPT_fPIE) ||
15505e219cf7f896873c1c1e64b9e87a7dade99debbaChandler Carruth                 LastPICArg->getOption().matches(options::OPT_fpie));
15515e219cf7f896873c1c1e64b9e87a7dade99debbaChandler Carruth    PICEnabled = (PICForPIE ||
15525e219cf7f896873c1c1e64b9e87a7dade99debbaChandler Carruth                  LastPICArg->getOption().matches(options::OPT_fPIC) ||
15535e219cf7f896873c1c1e64b9e87a7dade99debbaChandler Carruth                  LastPICArg->getOption().matches(options::OPT_fpic));
15545e219cf7f896873c1c1e64b9e87a7dade99debbaChandler Carruth    PICDisabled = !PICEnabled;
15555e219cf7f896873c1c1e64b9e87a7dade99debbaChandler Carruth  }
15565e219cf7f896873c1c1e64b9e87a7dade99debbaChandler Carruth  // Note that these flags are trump-cards. Regardless of the order w.r.t. the
15575e219cf7f896873c1c1e64b9e87a7dade99debbaChandler Carruth  // PIC or PIE options above, if these show up, PIC is disabled.
15585e219cf7f896873c1c1e64b9e87a7dade99debbaChandler Carruth  if (Args.hasArg(options::OPT_mkernel))
15595e219cf7f896873c1c1e64b9e87a7dade99debbaChandler Carruth    PICDisabled = true;
15605e219cf7f896873c1c1e64b9e87a7dade99debbaChandler Carruth  if (Args.hasArg(options::OPT_static))
15615e219cf7f896873c1c1e64b9e87a7dade99debbaChandler Carruth    PICDisabled = true;
15625e219cf7f896873c1c1e64b9e87a7dade99debbaChandler Carruth  bool DynamicNoPIC = Args.hasArg(options::OPT_mdynamic_no_pic);
15635e219cf7f896873c1c1e64b9e87a7dade99debbaChandler Carruth
15645e219cf7f896873c1c1e64b9e87a7dade99debbaChandler Carruth  // Select the relocation model.
1565bc85be85779a47bae728bbe6a2cd2e3732b1333dDaniel Dunbar  const char *Model = getToolChain().GetForcedPicModel();
1566bc85be85779a47bae728bbe6a2cd2e3732b1333dDaniel Dunbar  if (!Model) {
15675e219cf7f896873c1c1e64b9e87a7dade99debbaChandler Carruth    if (DynamicNoPIC)
1568bc85be85779a47bae728bbe6a2cd2e3732b1333dDaniel Dunbar      Model = "dynamic-no-pic";
1569bc85be85779a47bae728bbe6a2cd2e3732b1333dDaniel Dunbar    else if (PICDisabled)
1570bc85be85779a47bae728bbe6a2cd2e3732b1333dDaniel Dunbar      Model = "static";
1571bc85be85779a47bae728bbe6a2cd2e3732b1333dDaniel Dunbar    else if (PICEnabled)
1572bc85be85779a47bae728bbe6a2cd2e3732b1333dDaniel Dunbar      Model = "pic";
15731d46033f760ba5fd266ce59fe391fac473f04f52Daniel Dunbar    else
1574bc85be85779a47bae728bbe6a2cd2e3732b1333dDaniel Dunbar      Model = getToolChain().GetDefaultRelocationModel();
1575bc85be85779a47bae728bbe6a2cd2e3732b1333dDaniel Dunbar  }
15765e219cf7f896873c1c1e64b9e87a7dade99debbaChandler Carruth  StringRef ModelStr = Model ? Model : "";
15775e219cf7f896873c1c1e64b9e87a7dade99debbaChandler Carruth  if (Model && ModelStr != "pic") {
1578f219e7c1529fac29e34483667f740b452e5ef9ccDaniel Dunbar    CmdArgs.push_back("-mrelocation-model");
1579f219e7c1529fac29e34483667f740b452e5ef9ccDaniel Dunbar    CmdArgs.push_back(Model);
1580f219e7c1529fac29e34483667f740b452e5ef9ccDaniel Dunbar  }
15811d46033f760ba5fd266ce59fe391fac473f04f52Daniel Dunbar
15825e219cf7f896873c1c1e64b9e87a7dade99debbaChandler Carruth  // Infer the __PIC__ and __PIE__ values.
15835e219cf7f896873c1c1e64b9e87a7dade99debbaChandler Carruth  if (ModelStr == "pic" && PICForPIE) {
15845e219cf7f896873c1c1e64b9e87a7dade99debbaChandler Carruth    CmdArgs.push_back("-pie-level");
15855e219cf7f896873c1c1e64b9e87a7dade99debbaChandler Carruth    CmdArgs.push_back((LastPICArg &&
15865e219cf7f896873c1c1e64b9e87a7dade99debbaChandler Carruth                       LastPICArg->getOption().matches(options::OPT_fPIE)) ?
15875e219cf7f896873c1c1e64b9e87a7dade99debbaChandler Carruth                      "2" : "1");
15885e219cf7f896873c1c1e64b9e87a7dade99debbaChandler Carruth  } else if (ModelStr == "pic" || ModelStr == "dynamic-no-pic") {
15897674352cf3e8f699914a2f739f1ae8c8c3480813Daniel Dunbar    CmdArgs.push_back("-pic-level");
15905e219cf7f896873c1c1e64b9e87a7dade99debbaChandler Carruth    CmdArgs.push_back(((ModelStr != "dynamic-no-pic" && LastPICArg &&
15915e219cf7f896873c1c1e64b9e87a7dade99debbaChandler Carruth                        LastPICArg->getOption().matches(options::OPT_fPIC)) ||
15925e219cf7f896873c1c1e64b9e87a7dade99debbaChandler Carruth                       getToolChain().getTriple().isOSDarwin()) ? "2" : "1");
1593bc85be85779a47bae728bbe6a2cd2e3732b1333dDaniel Dunbar  }
15945e219cf7f896873c1c1e64b9e87a7dade99debbaChandler Carruth
1595f219e7c1529fac29e34483667f740b452e5ef9ccDaniel Dunbar  if (!Args.hasFlag(options::OPT_fmerge_all_constants,
1596f219e7c1529fac29e34483667f740b452e5ef9ccDaniel Dunbar                    options::OPT_fno_merge_all_constants))
1597f44a1a04a36453527de2285c402fbe9453184121Chris Lattner    CmdArgs.push_back("-fno-merge-all-constants");
1598f219e7c1529fac29e34483667f740b452e5ef9ccDaniel Dunbar
1599f219e7c1529fac29e34483667f740b452e5ef9ccDaniel Dunbar  // LLVM Code Generator Options.
16001d46033f760ba5fd266ce59fe391fac473f04f52Daniel Dunbar
160117d3fea677753e6e3e82ffe2cbdeccbf5f2e7497Daniel Dunbar  if (Arg *A = Args.getLastArg(options::OPT_mregparm_EQ)) {
160217d3fea677753e6e3e82ffe2cbdeccbf5f2e7497Daniel Dunbar    CmdArgs.push_back("-mregparm");
160317d3fea677753e6e3e82ffe2cbdeccbf5f2e7497Daniel Dunbar    CmdArgs.push_back(A->getValue(Args));
160417d3fea677753e6e3e82ffe2cbdeccbf5f2e7497Daniel Dunbar  }
160517d3fea677753e6e3e82ffe2cbdeccbf5f2e7497Daniel Dunbar
1606cfe9af250f466e7e38becea4428990448ae07737Roman Divacky  if (Args.hasFlag(options::OPT_mrtd, options::OPT_mno_rtd, false))
1607cfe9af250f466e7e38becea4428990448ae07737Roman Divacky    CmdArgs.push_back("-mrtd");
1608cfe9af250f466e7e38becea4428990448ae07737Roman Divacky
16096af27ec69560f7e4b0dac4a0b4341cd6062f6852Rafael Espindola  if (shouldUseFramePointer(Args, getToolChain().getTriple()))
1610f219e7c1529fac29e34483667f740b452e5ef9ccDaniel Dunbar    CmdArgs.push_back("-mdisable-fp-elim");
1611bc85be85779a47bae728bbe6a2cd2e3732b1333dDaniel Dunbar  if (!Args.hasFlag(options::OPT_fzero_initialized_in_bss,
1612f219e7c1529fac29e34483667f740b452e5ef9ccDaniel Dunbar                    options::OPT_fno_zero_initialized_in_bss))
1613f219e7c1529fac29e34483667f740b452e5ef9ccDaniel Dunbar    CmdArgs.push_back("-mno-zero-initialized-in-bss");
1614398c610b16728b4398214367dd0effd9d2e61340Daniel Dunbar  if (!Args.hasFlag(options::OPT_fstrict_aliasing,
1615398c610b16728b4398214367dd0effd9d2e61340Daniel Dunbar                    options::OPT_fno_strict_aliasing,
1616398c610b16728b4398214367dd0effd9d2e61340Daniel Dunbar                    getToolChain().IsStrictAliasingDefault()))
16174d5625e15bb215c2241c022df8dc7b04438970c6Dan Gohman    CmdArgs.push_back("-relaxed-aliasing");
161882fe6aea407a5a09a6131452ce622087ba83880dChandler Carruth  if (Args.hasFlag(options::OPT_fstrict_enums, options::OPT_fno_strict_enums,
161982fe6aea407a5a09a6131452ce622087ba83880dChandler Carruth                   false))
162082fe6aea407a5a09a6131452ce622087ba83880dChandler Carruth    CmdArgs.push_back("-fstrict-enums");
16211db772bd68502e0dabbd8efeb7f7c64a4ab2e37aNick Lewycky  if (!Args.hasFlag(options::OPT_foptimize_sibling_calls,
16221db772bd68502e0dabbd8efeb7f7c64a4ab2e37aNick Lewycky                    options::OPT_fno_optimize_sibling_calls))
16231db772bd68502e0dabbd8efeb7f7c64a4ab2e37aNick Lewycky    CmdArgs.push_back("-mdisable-tail-calls");
16241b71848c5238747ede9650b7907172f8a7e088a5Daniel Dunbar
1625abf07a7fb669dcb74040eef948d61dfe3c59ff17Chandler Carruth  // Handle various floating point optimization flags, mapping them to the
1626abf07a7fb669dcb74040eef948d61dfe3c59ff17Chandler Carruth  // appropriate LLVM code generation flags. The pattern for all of these is to
1627abf07a7fb669dcb74040eef948d61dfe3c59ff17Chandler Carruth  // default off the codegen optimizations, and if any flag enables them and no
1628abf07a7fb669dcb74040eef948d61dfe3c59ff17Chandler Carruth  // flag disables them after the flag enabling them, enable the codegen
1629abf07a7fb669dcb74040eef948d61dfe3c59ff17Chandler Carruth  // optimization. This is complicated by several "umbrella" flags.
1630abf07a7fb669dcb74040eef948d61dfe3c59ff17Chandler Carruth  if (Arg *A = Args.getLastArg(options::OPT_ffast_math,
1631abf07a7fb669dcb74040eef948d61dfe3c59ff17Chandler Carruth                               options::OPT_ffinite_math_only,
1632abf07a7fb669dcb74040eef948d61dfe3c59ff17Chandler Carruth                               options::OPT_fno_finite_math_only,
1633abf07a7fb669dcb74040eef948d61dfe3c59ff17Chandler Carruth                               options::OPT_fhonor_infinities,
1634abf07a7fb669dcb74040eef948d61dfe3c59ff17Chandler Carruth                               options::OPT_fno_honor_infinities))
1635abf07a7fb669dcb74040eef948d61dfe3c59ff17Chandler Carruth    if (A->getOption().getID() != options::OPT_fno_finite_math_only &&
1636abf07a7fb669dcb74040eef948d61dfe3c59ff17Chandler Carruth        A->getOption().getID() != options::OPT_fhonor_infinities)
1637abf07a7fb669dcb74040eef948d61dfe3c59ff17Chandler Carruth      CmdArgs.push_back("-menable-no-infs");
1638abf07a7fb669dcb74040eef948d61dfe3c59ff17Chandler Carruth  if (Arg *A = Args.getLastArg(options::OPT_ffast_math,
1639abf07a7fb669dcb74040eef948d61dfe3c59ff17Chandler Carruth                               options::OPT_ffinite_math_only,
1640abf07a7fb669dcb74040eef948d61dfe3c59ff17Chandler Carruth                               options::OPT_fno_finite_math_only,
1641abf07a7fb669dcb74040eef948d61dfe3c59ff17Chandler Carruth                               options::OPT_fhonor_nans,
1642abf07a7fb669dcb74040eef948d61dfe3c59ff17Chandler Carruth                               options::OPT_fno_honor_nans))
1643abf07a7fb669dcb74040eef948d61dfe3c59ff17Chandler Carruth    if (A->getOption().getID() != options::OPT_fno_finite_math_only &&
1644abf07a7fb669dcb74040eef948d61dfe3c59ff17Chandler Carruth        A->getOption().getID() != options::OPT_fhonor_nans)
1645abf07a7fb669dcb74040eef948d61dfe3c59ff17Chandler Carruth      CmdArgs.push_back("-menable-no-nans");
1646abf07a7fb669dcb74040eef948d61dfe3c59ff17Chandler Carruth
1647769aa2d46fa5dc0bee5285c95a80ad8749cb79cfBenjamin Kramer  // -fmath-errno is the default on some platforms, e.g. BSD-derived OSes.
1648769aa2d46fa5dc0bee5285c95a80ad8749cb79cfBenjamin Kramer  bool MathErrno = getToolChain().IsMathErrnoDefault();
1649abf07a7fb669dcb74040eef948d61dfe3c59ff17Chandler Carruth  if (Arg *A = Args.getLastArg(options::OPT_ffast_math,
1650abf07a7fb669dcb74040eef948d61dfe3c59ff17Chandler Carruth                               options::OPT_fmath_errno,
16514f50c50e783461ea1ec47dd6fe9be10aafcd76adChandler Carruth                               options::OPT_fno_math_errno))
16524f50c50e783461ea1ec47dd6fe9be10aafcd76adChandler Carruth    MathErrno = A->getOption().getID() == options::OPT_fmath_errno;
16534f50c50e783461ea1ec47dd6fe9be10aafcd76adChandler Carruth  if (MathErrno)
16544f50c50e783461ea1ec47dd6fe9be10aafcd76adChandler Carruth    CmdArgs.push_back("-fmath-errno");
1655abf07a7fb669dcb74040eef948d61dfe3c59ff17Chandler Carruth
1656abf07a7fb669dcb74040eef948d61dfe3c59ff17Chandler Carruth  // There are several flags which require disabling very specific
1657abf07a7fb669dcb74040eef948d61dfe3c59ff17Chandler Carruth  // optimizations. Any of these being disabled forces us to turn off the
1658abf07a7fb669dcb74040eef948d61dfe3c59ff17Chandler Carruth  // entire set of LLVM optimizations, so collect them through all the flag
1659abf07a7fb669dcb74040eef948d61dfe3c59ff17Chandler Carruth  // madness.
1660abf07a7fb669dcb74040eef948d61dfe3c59ff17Chandler Carruth  bool AssociativeMath = false;
1661abf07a7fb669dcb74040eef948d61dfe3c59ff17Chandler Carruth  if (Arg *A = Args.getLastArg(options::OPT_ffast_math,
1662abf07a7fb669dcb74040eef948d61dfe3c59ff17Chandler Carruth                               options::OPT_funsafe_math_optimizations,
1663abf07a7fb669dcb74040eef948d61dfe3c59ff17Chandler Carruth                               options::OPT_fno_unsafe_math_optimizations,
1664abf07a7fb669dcb74040eef948d61dfe3c59ff17Chandler Carruth                               options::OPT_fassociative_math,
1665abf07a7fb669dcb74040eef948d61dfe3c59ff17Chandler Carruth                               options::OPT_fno_associative_math))
1666abf07a7fb669dcb74040eef948d61dfe3c59ff17Chandler Carruth    if (A->getOption().getID() != options::OPT_fno_unsafe_math_optimizations &&
1667abf07a7fb669dcb74040eef948d61dfe3c59ff17Chandler Carruth        A->getOption().getID() != options::OPT_fno_associative_math)
1668abf07a7fb669dcb74040eef948d61dfe3c59ff17Chandler Carruth      AssociativeMath = true;
1669abf07a7fb669dcb74040eef948d61dfe3c59ff17Chandler Carruth  bool ReciprocalMath = false;
1670abf07a7fb669dcb74040eef948d61dfe3c59ff17Chandler Carruth  if (Arg *A = Args.getLastArg(options::OPT_ffast_math,
1671abf07a7fb669dcb74040eef948d61dfe3c59ff17Chandler Carruth                               options::OPT_funsafe_math_optimizations,
1672abf07a7fb669dcb74040eef948d61dfe3c59ff17Chandler Carruth                               options::OPT_fno_unsafe_math_optimizations,
1673abf07a7fb669dcb74040eef948d61dfe3c59ff17Chandler Carruth                               options::OPT_freciprocal_math,
1674abf07a7fb669dcb74040eef948d61dfe3c59ff17Chandler Carruth                               options::OPT_fno_reciprocal_math))
1675abf07a7fb669dcb74040eef948d61dfe3c59ff17Chandler Carruth    if (A->getOption().getID() != options::OPT_fno_unsafe_math_optimizations &&
1676abf07a7fb669dcb74040eef948d61dfe3c59ff17Chandler Carruth        A->getOption().getID() != options::OPT_fno_reciprocal_math)
1677abf07a7fb669dcb74040eef948d61dfe3c59ff17Chandler Carruth      ReciprocalMath = true;
1678abf07a7fb669dcb74040eef948d61dfe3c59ff17Chandler Carruth  bool SignedZeros = true;
1679abf07a7fb669dcb74040eef948d61dfe3c59ff17Chandler Carruth  if (Arg *A = Args.getLastArg(options::OPT_ffast_math,
1680abf07a7fb669dcb74040eef948d61dfe3c59ff17Chandler Carruth                               options::OPT_funsafe_math_optimizations,
1681abf07a7fb669dcb74040eef948d61dfe3c59ff17Chandler Carruth                               options::OPT_fno_unsafe_math_optimizations,
1682abf07a7fb669dcb74040eef948d61dfe3c59ff17Chandler Carruth                               options::OPT_fsigned_zeros,
1683abf07a7fb669dcb74040eef948d61dfe3c59ff17Chandler Carruth                               options::OPT_fno_signed_zeros))
1684abf07a7fb669dcb74040eef948d61dfe3c59ff17Chandler Carruth    if (A->getOption().getID() != options::OPT_fno_unsafe_math_optimizations &&
1685abf07a7fb669dcb74040eef948d61dfe3c59ff17Chandler Carruth        A->getOption().getID() != options::OPT_fsigned_zeros)
1686abf07a7fb669dcb74040eef948d61dfe3c59ff17Chandler Carruth      SignedZeros = false;
1687abf07a7fb669dcb74040eef948d61dfe3c59ff17Chandler Carruth  bool TrappingMath = true;
1688abf07a7fb669dcb74040eef948d61dfe3c59ff17Chandler Carruth  if (Arg *A = Args.getLastArg(options::OPT_ffast_math,
1689abf07a7fb669dcb74040eef948d61dfe3c59ff17Chandler Carruth                               options::OPT_funsafe_math_optimizations,
1690abf07a7fb669dcb74040eef948d61dfe3c59ff17Chandler Carruth                               options::OPT_fno_unsafe_math_optimizations,
1691abf07a7fb669dcb74040eef948d61dfe3c59ff17Chandler Carruth                               options::OPT_ftrapping_math,
1692abf07a7fb669dcb74040eef948d61dfe3c59ff17Chandler Carruth                               options::OPT_fno_trapping_math))
1693abf07a7fb669dcb74040eef948d61dfe3c59ff17Chandler Carruth    if (A->getOption().getID() != options::OPT_fno_unsafe_math_optimizations &&
1694abf07a7fb669dcb74040eef948d61dfe3c59ff17Chandler Carruth        A->getOption().getID() != options::OPT_ftrapping_math)
1695abf07a7fb669dcb74040eef948d61dfe3c59ff17Chandler Carruth      TrappingMath = false;
1696abf07a7fb669dcb74040eef948d61dfe3c59ff17Chandler Carruth  if (!MathErrno && AssociativeMath && ReciprocalMath && !SignedZeros &&
1697abf07a7fb669dcb74040eef948d61dfe3c59ff17Chandler Carruth      !TrappingMath)
1698abf07a7fb669dcb74040eef948d61dfe3c59ff17Chandler Carruth    CmdArgs.push_back("-menable-unsafe-fp-math");
1699abf07a7fb669dcb74040eef948d61dfe3c59ff17Chandler Carruth
1700abf07a7fb669dcb74040eef948d61dfe3c59ff17Chandler Carruth  // We separately look for the '-ffast-math' flag, and if we find it, tell the
1701abf07a7fb669dcb74040eef948d61dfe3c59ff17Chandler Carruth  // frontend to provide the appropriate preprocessor macros. This is distinct
1702abf07a7fb669dcb74040eef948d61dfe3c59ff17Chandler Carruth  // from enabling any optimizations as it induces a language change which must
1703abf07a7fb669dcb74040eef948d61dfe3c59ff17Chandler Carruth  // survive serialization and deserialization, etc.
1704abf07a7fb669dcb74040eef948d61dfe3c59ff17Chandler Carruth  if (Args.hasArg(options::OPT_ffast_math))
1705abf07a7fb669dcb74040eef948d61dfe3c59ff17Chandler Carruth    CmdArgs.push_back("-ffast-math");
1706abf07a7fb669dcb74040eef948d61dfe3c59ff17Chandler Carruth
17071b71848c5238747ede9650b7907172f8a7e088a5Daniel Dunbar  // Decide whether to use verbose asm. Verbose assembly is the default on
17081b71848c5238747ede9650b7907172f8a7e088a5Daniel Dunbar  // toolchains which have the integrated assembler on by default.
17091b71848c5238747ede9650b7907172f8a7e088a5Daniel Dunbar  bool IsVerboseAsmDefault = getToolChain().IsIntegratedAssemblerDefault();
17101b71848c5238747ede9650b7907172f8a7e088a5Daniel Dunbar  if (Args.hasFlag(options::OPT_fverbose_asm, options::OPT_fno_verbose_asm,
171120249a1af2e462dcafdd6a350f1c7967b264ff25Michael J. Spencer                   IsVerboseAsmDefault) ||
17121b71848c5238747ede9650b7907172f8a7e088a5Daniel Dunbar      Args.hasArg(options::OPT_dA))
1713f219e7c1529fac29e34483667f740b452e5ef9ccDaniel Dunbar    CmdArgs.push_back("-masm-verbose");
17141b71848c5238747ede9650b7907172f8a7e088a5Daniel Dunbar
1715f219e7c1529fac29e34483667f740b452e5ef9ccDaniel Dunbar  if (Args.hasArg(options::OPT_fdebug_pass_structure)) {
1716f219e7c1529fac29e34483667f740b452e5ef9ccDaniel Dunbar    CmdArgs.push_back("-mdebug-pass");
1717f219e7c1529fac29e34483667f740b452e5ef9ccDaniel Dunbar    CmdArgs.push_back("Structure");
1718f219e7c1529fac29e34483667f740b452e5ef9ccDaniel Dunbar  }
1719f219e7c1529fac29e34483667f740b452e5ef9ccDaniel Dunbar  if (Args.hasArg(options::OPT_fdebug_pass_arguments)) {
1720f219e7c1529fac29e34483667f740b452e5ef9ccDaniel Dunbar    CmdArgs.push_back("-mdebug-pass");
1721f219e7c1529fac29e34483667f740b452e5ef9ccDaniel Dunbar    CmdArgs.push_back("Arguments");
1722f219e7c1529fac29e34483667f740b452e5ef9ccDaniel Dunbar  }
17236bea73b3305a03479589e2642fbdcf6c096851aaDaniel Dunbar
1724d0c2ec44e093011256b6a0f57d455f36dffdea70John McCall  // Enable -mconstructor-aliases except on darwin, where we have to
1725d0c2ec44e093011256b6a0f57d455f36dffdea70John McCall  // work around a linker bug;  see <rdar://problem/7651567>.
1726905c45f15a25598620d19160c139c6b785aeea89Bob Wilson  if (!getToolChain().getTriple().isOSDarwin())
1727d0c2ec44e093011256b6a0f57d455f36dffdea70John McCall    CmdArgs.push_back("-mconstructor-aliases");
1728125b4cb35536e45201f8f2cb19ee620e3ad67c49NAKAMURA Takumi
172932096695c76033a6b0b1747c439f7378a11e8312John McCall  // Darwin's kernel doesn't support guard variables; just die if we
173032096695c76033a6b0b1747c439f7378a11e8312John McCall  // try to use them.
1731905c45f15a25598620d19160c139c6b785aeea89Bob Wilson  if (KernelOrKext && getToolChain().getTriple().isOSDarwin())
173232096695c76033a6b0b1747c439f7378a11e8312John McCall    CmdArgs.push_back("-fforbid-guard-variables");
173332096695c76033a6b0b1747c439f7378a11e8312John McCall
17346f75550e40a9177db9979fc130ce3ece026b137dDouglas Gregor  if (Args.hasArg(options::OPT_mms_bitfields)) {
17356f75550e40a9177db9979fc130ce3ece026b137dDouglas Gregor    CmdArgs.push_back("-mms-bitfields");
17366f75550e40a9177db9979fc130ce3ece026b137dDouglas Gregor  }
1737d0c2ec44e093011256b6a0f57d455f36dffdea70John McCall
17386bea73b3305a03479589e2642fbdcf6c096851aaDaniel Dunbar  // This is a coarse approximation of what llvm-gcc actually does, both
17396bea73b3305a03479589e2642fbdcf6c096851aaDaniel Dunbar  // -fasynchronous-unwind-tables and -fnon-call-exceptions interact in more
17406bea73b3305a03479589e2642fbdcf6c096851aaDaniel Dunbar  // complicated ways.
17416bea73b3305a03479589e2642fbdcf6c096851aaDaniel Dunbar  bool AsynchronousUnwindTables =
17426bea73b3305a03479589e2642fbdcf6c096851aaDaniel Dunbar    Args.hasFlag(options::OPT_fasynchronous_unwind_tables,
17436bea73b3305a03479589e2642fbdcf6c096851aaDaniel Dunbar                 options::OPT_fno_asynchronous_unwind_tables,
17446bea73b3305a03479589e2642fbdcf6c096851aaDaniel Dunbar                 getToolChain().IsUnwindTablesDefault() &&
17450a80ba74ffa3d3df55abfbc4474d7470c7c923e3Daniel Dunbar                 !KernelOrKext);
17466bea73b3305a03479589e2642fbdcf6c096851aaDaniel Dunbar  if (Args.hasFlag(options::OPT_funwind_tables, options::OPT_fno_unwind_tables,
17476bea73b3305a03479589e2642fbdcf6c096851aaDaniel Dunbar                   AsynchronousUnwindTables))
1748f219e7c1529fac29e34483667f740b452e5ef9ccDaniel Dunbar    CmdArgs.push_back("-munwind-tables");
1749f219e7c1529fac29e34483667f740b452e5ef9ccDaniel Dunbar
1750f219e7c1529fac29e34483667f740b452e5ef9ccDaniel Dunbar  if (Arg *A = Args.getLastArg(options::OPT_flimited_precision_EQ)) {
1751f219e7c1529fac29e34483667f740b452e5ef9ccDaniel Dunbar    CmdArgs.push_back("-mlimit-float-precision");
1752f219e7c1529fac29e34483667f740b452e5ef9ccDaniel Dunbar    CmdArgs.push_back(A->getValue(Args));
1753f219e7c1529fac29e34483667f740b452e5ef9ccDaniel Dunbar  }
1754bc85be85779a47bae728bbe6a2cd2e3732b1333dDaniel Dunbar
1755868bd0aa9281929ef50d2e9a8c82a036906f53f5Daniel Dunbar  // FIXME: Handle -mtune=.
1756868bd0aa9281929ef50d2e9a8c82a036906f53f5Daniel Dunbar  (void) Args.hasArg(options::OPT_mtune_EQ);
1757bc85be85779a47bae728bbe6a2cd2e3732b1333dDaniel Dunbar
17588e9ef0d87dad25f02e5abc6facf528778236115aBenjamin Kramer  if (Arg *A = Args.getLastArg(options::OPT_mcmodel_EQ)) {
1759f219e7c1529fac29e34483667f740b452e5ef9ccDaniel Dunbar    CmdArgs.push_back("-mcode-model");
17608e9ef0d87dad25f02e5abc6facf528778236115aBenjamin Kramer    CmdArgs.push_back(A->getValue(Args));
17618e9ef0d87dad25f02e5abc6facf528778236115aBenjamin Kramer  }
17628e9ef0d87dad25f02e5abc6facf528778236115aBenjamin Kramer
17636acda16e9c194dcbd0dea64341e182bdb65d0f41Daniel Dunbar  // Add target specific cpu and features flags.
17646acda16e9c194dcbd0dea64341e182bdb65d0f41Daniel Dunbar  switch(getToolChain().getTriple().getArch()) {
17656acda16e9c194dcbd0dea64341e182bdb65d0f41Daniel Dunbar  default:
17666acda16e9c194dcbd0dea64341e182bdb65d0f41Daniel Dunbar    break;
1767868bd0aa9281929ef50d2e9a8c82a036906f53f5Daniel Dunbar
1768b163ef7e7a5d904ef0962a7c38c460be083c4d63Daniel Dunbar  case llvm::Triple::arm:
1769b163ef7e7a5d904ef0962a7c38c460be083c4d63Daniel Dunbar  case llvm::Triple::thumb:
1770fa41d6975058ceb1b8a24564f6dcec72f89f62e8Daniel Dunbar    AddARMTargetArgs(Args, CmdArgs, KernelOrKext);
1771b163ef7e7a5d904ef0962a7c38c460be083c4d63Daniel Dunbar    break;
1772b163ef7e7a5d904ef0962a7c38c460be083c4d63Daniel Dunbar
1773ed734737d5af31906e30e537d4a41c760ddcfc59Eric Christopher  case llvm::Triple::mips:
1774ed734737d5af31906e30e537d4a41c760ddcfc59Eric Christopher  case llvm::Triple::mipsel:
17757ec0258505a11e7e8229d2c96507be6bbc40d7c1Akira Hatanaka  case llvm::Triple::mips64:
17767ec0258505a11e7e8229d2c96507be6bbc40d7c1Akira Hatanaka  case llvm::Triple::mips64el:
1777ed734737d5af31906e30e537d4a41c760ddcfc59Eric Christopher    AddMIPSTargetArgs(Args, CmdArgs);
17789284d215022457ba867080a713f08f026d89ea17Bruno Cardoso Lopes    break;
17799284d215022457ba867080a713f08f026d89ea17Bruno Cardoso Lopes
17809284d215022457ba867080a713f08f026d89ea17Bruno Cardoso Lopes  case llvm::Triple::sparc:
17819284d215022457ba867080a713f08f026d89ea17Bruno Cardoso Lopes    AddSparcTargetArgs(Args, CmdArgs);
1782ed734737d5af31906e30e537d4a41c760ddcfc59Eric Christopher    break;
1783ed734737d5af31906e30e537d4a41c760ddcfc59Eric Christopher
17846acda16e9c194dcbd0dea64341e182bdb65d0f41Daniel Dunbar  case llvm::Triple::x86:
17856acda16e9c194dcbd0dea64341e182bdb65d0f41Daniel Dunbar  case llvm::Triple::x86_64:
17866acda16e9c194dcbd0dea64341e182bdb65d0f41Daniel Dunbar    AddX86TargetArgs(Args, CmdArgs);
17876acda16e9c194dcbd0dea64341e182bdb65d0f41Daniel Dunbar    break;
17889631939f82c0eaa6fb3936a0ce58a41adfbc9011Tony Linthicum
17899631939f82c0eaa6fb3936a0ce58a41adfbc9011Tony Linthicum  case llvm::Triple::hexagon:
17909631939f82c0eaa6fb3936a0ce58a41adfbc9011Tony Linthicum    AddHexagonTargetArgs(Args, CmdArgs);
17919631939f82c0eaa6fb3936a0ce58a41adfbc9011Tony Linthicum    break;
1792bc85be85779a47bae728bbe6a2cd2e3732b1333dDaniel Dunbar  }
1793c21c485b4fb58ef5d55cf3e523263dd824a2ace4Daniel Dunbar
17949631939f82c0eaa6fb3936a0ce58a41adfbc9011Tony Linthicum
17959631939f82c0eaa6fb3936a0ce58a41adfbc9011Tony Linthicum
1796c176bc6be6f1407e7c6bd062f05a8636ea9a08e3Daniel Dunbar  // Pass the linker version in use.
1797c176bc6be6f1407e7c6bd062f05a8636ea9a08e3Daniel Dunbar  if (Arg *A = Args.getLastArg(options::OPT_mlinker_version_EQ)) {
1798c176bc6be6f1407e7c6bd062f05a8636ea9a08e3Daniel Dunbar    CmdArgs.push_back("-target-linker-version");
1799c176bc6be6f1407e7c6bd062f05a8636ea9a08e3Daniel Dunbar    CmdArgs.push_back(A->getValue(Args));
1800c176bc6be6f1407e7c6bd062f05a8636ea9a08e3Daniel Dunbar  }
1801c176bc6be6f1407e7c6bd062f05a8636ea9a08e3Daniel Dunbar
1802b2d11cc3abd5ddf421a9bd36c6ec558038748a83Nick Lewycky  // -mno-omit-leaf-frame-pointer is the default on Darwin.
18031ad6648cce57bd187f1853f58fef26cd9bf4934fDaniel Dunbar  if (Args.hasFlag(options::OPT_momit_leaf_frame_pointer,
1804b2d11cc3abd5ddf421a9bd36c6ec558038748a83Nick Lewycky                   options::OPT_mno_omit_leaf_frame_pointer,
1805905c45f15a25598620d19160c139c6b785aeea89Bob Wilson                   !getToolChain().getTriple().isOSDarwin()))
18061ad6648cce57bd187f1853f58fef26cd9bf4934fDaniel Dunbar    CmdArgs.push_back("-momit-leaf-frame-pointer");
18071ad6648cce57bd187f1853f58fef26cd9bf4934fDaniel Dunbar
1808b30575c22f249c0697df0cd2aa872d14d4fa9c57Daniel Dunbar  // Explicitly error on some things we know we don't support and can't just
1809b30575c22f249c0697df0cd2aa872d14d4fa9c57Daniel Dunbar  // ignore.
1810b30575c22f249c0697df0cd2aa872d14d4fa9c57Daniel Dunbar  types::ID InputType = Inputs[0].getType();
1811e94db4771856659c12e1f269141cbbc4e55b1c47Daniel Dunbar  if (!Args.hasArg(options::OPT_fallow_unsupported)) {
1812e94db4771856659c12e1f269141cbbc4e55b1c47Daniel Dunbar    Arg *Unsupported;
1813e94db4771856659c12e1f269141cbbc4e55b1c47Daniel Dunbar    if (types::isCXX(InputType) &&
1814905c45f15a25598620d19160c139c6b785aeea89Bob Wilson        getToolChain().getTriple().isOSDarwin() &&
1815e94db4771856659c12e1f269141cbbc4e55b1c47Daniel Dunbar        getToolChain().getTriple().getArch() == llvm::Triple::x86) {
1816a544aeece3e16296bdbbc9ee32053fac9616f85bBob Wilson      if ((Unsupported = Args.getLastArg(options::OPT_fapple_kext)) ||
1817a544aeece3e16296bdbbc9ee32053fac9616f85bBob Wilson          (Unsupported = Args.getLastArg(options::OPT_mkernel)))
18185f9e272e632e951b1efe824cd16acb4d96077930Chris Lattner        D.Diag(diag::err_drv_clang_unsupported_opt_cxx_darwin_i386)
1819e94db4771856659c12e1f269141cbbc4e55b1c47Daniel Dunbar          << Unsupported->getOption().getName();
1820e94db4771856659c12e1f269141cbbc4e55b1c47Daniel Dunbar    }
1821b30575c22f249c0697df0cd2aa872d14d4fa9c57Daniel Dunbar  }
1822b30575c22f249c0697df0cd2aa872d14d4fa9c57Daniel Dunbar
18231d46033f760ba5fd266ce59fe391fac473f04f52Daniel Dunbar  Args.AddAllArgs(CmdArgs, options::OPT_v);
1824f7c16d903f11814e2d6780e2a2e189b7a7afc4edDaniel Dunbar  Args.AddLastArg(CmdArgs, options::OPT_H);
18252b81910618f63e4ce2373c926a26e76b4b91373fChad Rosier  if (D.CCPrintHeaders && !D.CCGenDiagnostics) {
1826322c29fefe7fa33f03273136eb5f8b7f5b4df7c0Daniel Dunbar    CmdArgs.push_back("-header-include-file");
1827322c29fefe7fa33f03273136eb5f8b7f5b4df7c0Daniel Dunbar    CmdArgs.push_back(D.CCPrintHeadersFilename ?
1828322c29fefe7fa33f03273136eb5f8b7f5b4df7c0Daniel Dunbar                      D.CCPrintHeadersFilename : "-");
1829322c29fefe7fa33f03273136eb5f8b7f5b4df7c0Daniel Dunbar  }
18301d46033f760ba5fd266ce59fe391fac473f04f52Daniel Dunbar  Args.AddLastArg(CmdArgs, options::OPT_P);
18311eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump  Args.AddLastArg(CmdArgs, options::OPT_print_ivar_layout);
18321d46033f760ba5fd266ce59fe391fac473f04f52Daniel Dunbar
18332b81910618f63e4ce2373c926a26e76b4b91373fChad Rosier  if (D.CCLogDiagnostics && !D.CCGenDiagnostics) {
1834c8a22b091677c02003880166e5d5767ca8d74b70Daniel Dunbar    CmdArgs.push_back("-diagnostic-log-file");
1835c8a22b091677c02003880166e5d5767ca8d74b70Daniel Dunbar    CmdArgs.push_back(D.CCLogDiagnosticsFilename ?
1836c8a22b091677c02003880166e5d5767ca8d74b70Daniel Dunbar                      D.CCLogDiagnosticsFilename : "-");
1837c8a22b091677c02003880166e5d5767ca8d74b70Daniel Dunbar  }
1838c8a22b091677c02003880166e5d5767ca8d74b70Daniel Dunbar
18391d46033f760ba5fd266ce59fe391fac473f04f52Daniel Dunbar  // Special case debug options to only pass -g to clang. This is
18401d46033f760ba5fd266ce59fe391fac473f04f52Daniel Dunbar  // wrong.
184118f36d9eac8b425e8cfed389bbbf02c030f26be7Rafael Espindola  Args.ClaimAllArgs(options::OPT_g_Group);
18426b3d5a65cb486f46604d12a16831e8a228ee610fDaniel Dunbar  if (Arg *A = Args.getLastArg(options::OPT_g_Group))
18432875bda1505bce995f745002affb20862765ed04Chad Rosier    if (!A->getOption().matches(options::OPT_g0)) {
1844cf6ba2eeaeabb03541ee98859805800c39759a47Chad Rosier      CmdArgs.push_back("-g");
18452875bda1505bce995f745002affb20862765ed04Chad Rosier    }
1846fd00eecad6fa5400cf37269d84361a0551d0e6d3Alexey Samsonov  if (Args.hasArg(options::OPT_gline_tables_only))
1847fd00eecad6fa5400cf37269d84361a0551d0e6d3Alexey Samsonov    CmdArgs.push_back("-gline-tables-only");
18481d46033f760ba5fd266ce59fe391fac473f04f52Daniel Dunbar
18499cf933a67e54bea5475c5027fee2c1cf7365ee05Rafael Espindola  Args.AddAllArgs(CmdArgs, options::OPT_ffunction_sections);
18509cf933a67e54bea5475c5027fee2c1cf7365ee05Rafael Espindola  Args.AddAllArgs(CmdArgs, options::OPT_fdata_sections);
18519cf933a67e54bea5475c5027fee2c1cf7365ee05Rafael Espindola
18527255a2d997b15beae82e627052fdb1b2474495c2Chris Lattner  Args.AddAllArgs(CmdArgs, options::OPT_finstrument_functions);
18537255a2d997b15beae82e627052fdb1b2474495c2Chris Lattner
1854e8ba8d78a258ec992d3521eebdae8324db777b14Nick Lewycky  if (Args.hasArg(options::OPT_ftest_coverage) ||
1855e8ba8d78a258ec992d3521eebdae8324db777b14Nick Lewycky      Args.hasArg(options::OPT_coverage))
1856e8ba8d78a258ec992d3521eebdae8324db777b14Nick Lewycky    CmdArgs.push_back("-femit-coverage-notes");
1857e8ba8d78a258ec992d3521eebdae8324db777b14Nick Lewycky  if (Args.hasArg(options::OPT_fprofile_arcs) ||
1858e8ba8d78a258ec992d3521eebdae8324db777b14Nick Lewycky      Args.hasArg(options::OPT_coverage))
1859e8ba8d78a258ec992d3521eebdae8324db777b14Nick Lewycky    CmdArgs.push_back("-femit-coverage-data");
1860e8ba8d78a258ec992d3521eebdae8324db777b14Nick Lewycky
18615ea4f44e34449a78d6b38aa47c14b527839d7aacNick Lewycky  if (C.getArgs().hasArg(options::OPT_c) ||
18625ea4f44e34449a78d6b38aa47c14b527839d7aacNick Lewycky      C.getArgs().hasArg(options::OPT_S)) {
18635ea4f44e34449a78d6b38aa47c14b527839d7aacNick Lewycky    if (Output.isFilename()) {
18643dc05418538c719fea48b906bfa4febe5296e126Nick Lewycky      CmdArgs.push_back("-coverage-file");
18653dc05418538c719fea48b906bfa4febe5296e126Nick Lewycky      CmdArgs.push_back(Args.MakeArgString(Output.getFilename()));
18665ea4f44e34449a78d6b38aa47c14b527839d7aacNick Lewycky    }
18675ea4f44e34449a78d6b38aa47c14b527839d7aacNick Lewycky  }
18685ea4f44e34449a78d6b38aa47c14b527839d7aacNick Lewycky
1869a268fc0f2229eb132ebc8501b140093aeb5516bfDaniel Dunbar  // Pass options for controlling the default header search paths.
1870a268fc0f2229eb132ebc8501b140093aeb5516bfDaniel Dunbar  if (Args.hasArg(options::OPT_nostdinc)) {
1871a268fc0f2229eb132ebc8501b140093aeb5516bfDaniel Dunbar    CmdArgs.push_back("-nostdsysteminc");
1872a268fc0f2229eb132ebc8501b140093aeb5516bfDaniel Dunbar    CmdArgs.push_back("-nobuiltininc");
1873a268fc0f2229eb132ebc8501b140093aeb5516bfDaniel Dunbar  } else {
187492d6d404833468120f9a86fb360691ac60585551Daniel Dunbar    if (Args.hasArg(options::OPT_nostdlibinc))
187592d6d404833468120f9a86fb360691ac60585551Daniel Dunbar        CmdArgs.push_back("-nostdsysteminc");
1876a268fc0f2229eb132ebc8501b140093aeb5516bfDaniel Dunbar    Args.AddLastArg(CmdArgs, options::OPT_nostdincxx);
1877a268fc0f2229eb132ebc8501b140093aeb5516bfDaniel Dunbar    Args.AddLastArg(CmdArgs, options::OPT_nobuiltininc);
1878a268fc0f2229eb132ebc8501b140093aeb5516bfDaniel Dunbar  }
18791d46033f760ba5fd266ce59fe391fac473f04f52Daniel Dunbar
18805f12232ef39e3d6c36d6600a73ebbe3c4a79f514Daniel Dunbar  // Pass the path to compiler resource files.
18815f12232ef39e3d6c36d6600a73ebbe3c4a79f514Daniel Dunbar  CmdArgs.push_back("-resource-dir");
1882225c41706dc0f3682236e351820d339e14390e00Daniel Dunbar  CmdArgs.push_back(D.ResourceDir.c_str());
18832ac9fc2ad64e16127df8c60caeea2edfe9a400a2Daniel Dunbar
1884389db16c63eec6ecfa9b235155252d8da766e94eArgyrios Kyrtzidis  Args.AddLastArg(CmdArgs, options::OPT_working_directory);
1885389db16c63eec6ecfa9b235155252d8da766e94eArgyrios Kyrtzidis
188630660a898545416f0fea2d717f16f75640001e38Ted Kremenek  bool ARCMTEnabled = false;
18878f0e8d22960d56f8390f4971e2c0f2f0a0884602John McCall  if (!Args.hasArg(options::OPT_fno_objc_arc)) {
188872ac120023abb73f3ff9386e193fed55fa9a96e2Argyrios Kyrtzidis    if (const Arg *A = Args.getLastArg(options::OPT_ccc_arcmt_check,
188969325d5b7cfecf1b3128745efc33612aedf1b8b4Argyrios Kyrtzidis                                       options::OPT_ccc_arcmt_modify,
189069325d5b7cfecf1b3128745efc33612aedf1b8b4Argyrios Kyrtzidis                                       options::OPT_ccc_arcmt_migrate)) {
189130660a898545416f0fea2d717f16f75640001e38Ted Kremenek      ARCMTEnabled = true;
18928f0e8d22960d56f8390f4971e2c0f2f0a0884602John McCall      switch (A->getOption().getID()) {
18938f0e8d22960d56f8390f4971e2c0f2f0a0884602John McCall      default:
18948f0e8d22960d56f8390f4971e2c0f2f0a0884602John McCall        llvm_unreachable("missed a case");
189572ac120023abb73f3ff9386e193fed55fa9a96e2Argyrios Kyrtzidis      case options::OPT_ccc_arcmt_check:
18968f0e8d22960d56f8390f4971e2c0f2f0a0884602John McCall        CmdArgs.push_back("-arcmt-check");
18978f0e8d22960d56f8390f4971e2c0f2f0a0884602John McCall        break;
189872ac120023abb73f3ff9386e193fed55fa9a96e2Argyrios Kyrtzidis      case options::OPT_ccc_arcmt_modify:
18998f0e8d22960d56f8390f4971e2c0f2f0a0884602John McCall        CmdArgs.push_back("-arcmt-modify");
19008f0e8d22960d56f8390f4971e2c0f2f0a0884602John McCall        break;
190169325d5b7cfecf1b3128745efc33612aedf1b8b4Argyrios Kyrtzidis      case options::OPT_ccc_arcmt_migrate:
190269325d5b7cfecf1b3128745efc33612aedf1b8b4Argyrios Kyrtzidis        CmdArgs.push_back("-arcmt-migrate");
190330660a898545416f0fea2d717f16f75640001e38Ted Kremenek        CmdArgs.push_back("-mt-migrate-directory");
190469325d5b7cfecf1b3128745efc33612aedf1b8b4Argyrios Kyrtzidis        CmdArgs.push_back(A->getValue(Args));
19057ee2049278b98d42709380054eb83f4952af1200Argyrios Kyrtzidis
19067ee2049278b98d42709380054eb83f4952af1200Argyrios Kyrtzidis        Args.AddLastArg(CmdArgs, options::OPT_arcmt_migrate_report_output);
19077ee2049278b98d42709380054eb83f4952af1200Argyrios Kyrtzidis        Args.AddLastArg(CmdArgs, options::OPT_arcmt_migrate_emit_arc_errors);
190869325d5b7cfecf1b3128745efc33612aedf1b8b4Argyrios Kyrtzidis        break;
19098f0e8d22960d56f8390f4971e2c0f2f0a0884602John McCall      }
19108f0e8d22960d56f8390f4971e2c0f2f0a0884602John McCall    }
19118f0e8d22960d56f8390f4971e2c0f2f0a0884602John McCall  }
191288b7cf00fcb582728c642da3927c59468efaf926Eric Christopher
191330660a898545416f0fea2d717f16f75640001e38Ted Kremenek  if (const Arg *A = Args.getLastArg(options::OPT_ccc_objcmt_migrate)) {
191430660a898545416f0fea2d717f16f75640001e38Ted Kremenek    if (ARCMTEnabled) {
191530660a898545416f0fea2d717f16f75640001e38Ted Kremenek      D.Diag(diag::err_drv_argument_not_allowed_with)
191630660a898545416f0fea2d717f16f75640001e38Ted Kremenek        << A->getAsString(Args) << "-ccc-arcmt-migrate";
191730660a898545416f0fea2d717f16f75640001e38Ted Kremenek    }
191830660a898545416f0fea2d717f16f75640001e38Ted Kremenek    CmdArgs.push_back("-mt-migrate-directory");
191930660a898545416f0fea2d717f16f75640001e38Ted Kremenek    CmdArgs.push_back(A->getValue(Args));
192030660a898545416f0fea2d717f16f75640001e38Ted Kremenek
192130660a898545416f0fea2d717f16f75640001e38Ted Kremenek    if (!Args.hasArg(options::OPT_objcmt_migrate_literals,
192230660a898545416f0fea2d717f16f75640001e38Ted Kremenek                     options::OPT_objcmt_migrate_subscripting)) {
192330660a898545416f0fea2d717f16f75640001e38Ted Kremenek      // None specified, means enable them all.
192430660a898545416f0fea2d717f16f75640001e38Ted Kremenek      CmdArgs.push_back("-objcmt-migrate-literals");
192530660a898545416f0fea2d717f16f75640001e38Ted Kremenek      CmdArgs.push_back("-objcmt-migrate-subscripting");
192630660a898545416f0fea2d717f16f75640001e38Ted Kremenek    } else {
192730660a898545416f0fea2d717f16f75640001e38Ted Kremenek      Args.AddLastArg(CmdArgs, options::OPT_objcmt_migrate_literals);
192830660a898545416f0fea2d717f16f75640001e38Ted Kremenek      Args.AddLastArg(CmdArgs, options::OPT_objcmt_migrate_subscripting);
192930660a898545416f0fea2d717f16f75640001e38Ted Kremenek    }
193030660a898545416f0fea2d717f16f75640001e38Ted Kremenek  }
193130660a898545416f0fea2d717f16f75640001e38Ted Kremenek
1932c21c485b4fb58ef5d55cf3e523263dd824a2ace4Daniel Dunbar  // Add preprocessing options like -I, -D, etc. if we are using the
1933c21c485b4fb58ef5d55cf3e523263dd824a2ace4Daniel Dunbar  // preprocessor.
1934c21c485b4fb58ef5d55cf3e523263dd824a2ace4Daniel Dunbar  //
1935c21c485b4fb58ef5d55cf3e523263dd824a2ace4Daniel Dunbar  // FIXME: Support -fpreprocessed
1936c21c485b4fb58ef5d55cf3e523263dd824a2ace4Daniel Dunbar  if (types::getPreprocessedType(InputType) != types::TY_INVALID)
193754db68bf0e389b8aabe1a434f825a81a9c1f7db8Peter Collingbourne    AddPreprocessingOptions(C, D, Args, CmdArgs, Output, Inputs);
19381d46033f760ba5fd266ce59fe391fac473f04f52Daniel Dunbar
193919d9d2ebbed9164e3f3a20fa065a26585c990a2eRafael Espindola  // Don't warn about "clang -c -DPIC -fPIC test.i" because libtool.m4 assumes
194019d9d2ebbed9164e3f3a20fa065a26585c990a2eRafael Espindola  // that "The compiler can only warn and ignore the option if not recognized".
194119d9d2ebbed9164e3f3a20fa065a26585c990a2eRafael Espindola  // When building with ccache, it will pass -D options to clang even on
194219d9d2ebbed9164e3f3a20fa065a26585c990a2eRafael Espindola  // preprocessed inputs and configure concludes that -fPIC is not supported.
194319d9d2ebbed9164e3f3a20fa065a26585c990a2eRafael Espindola  Args.ClaimAllArgs(options::OPT_D);
194419d9d2ebbed9164e3f3a20fa065a26585c990a2eRafael Espindola
194520f0eacf1682e4594da9d318b5b13ed4f6d6e7e5Daniel Dunbar  // Manually translate -O to -O2 and -O4 to -O3; let clang reject
1946337a6271b98c4c183f7eaad1563a75260b4f2871Daniel Dunbar  // others.
1947337a6271b98c4c183f7eaad1563a75260b4f2871Daniel Dunbar  if (Arg *A = Args.getLastArg(options::OPT_O_Group)) {
1948b827a0541b5fd095fcdb7ad0c3df93ca158c619aDaniel Dunbar    if (A->getOption().matches(options::OPT_O4))
1949337a6271b98c4c183f7eaad1563a75260b4f2871Daniel Dunbar      CmdArgs.push_back("-O3");
1950473916c038f75fa3b0c51a0bc7afc5b082e5c22fDaniel Dunbar    else if (A->getOption().matches(options::OPT_O) &&
1951473916c038f75fa3b0c51a0bc7afc5b082e5c22fDaniel Dunbar             A->getValue(Args)[0] == '\0')
195220f0eacf1682e4594da9d318b5b13ed4f6d6e7e5Daniel Dunbar      CmdArgs.push_back("-O2");
19531d46033f760ba5fd266ce59fe391fac473f04f52Daniel Dunbar    else
19545697aa0d75c87bafec78984048d558f8d12ca1b3Daniel Dunbar      A->render(Args, CmdArgs);
19551d46033f760ba5fd266ce59fe391fac473f04f52Daniel Dunbar  }
19561d46033f760ba5fd266ce59fe391fac473f04f52Daniel Dunbar
19576e8371eb97a08f724be22ae6042d1e9eacbe4c48Daniel Dunbar  Args.AddAllArgs(CmdArgs, options::OPT_W_Group);
19586e8371eb97a08f724be22ae6042d1e9eacbe4c48Daniel Dunbar  Args.AddLastArg(CmdArgs, options::OPT_pedantic);
19596e8371eb97a08f724be22ae6042d1e9eacbe4c48Daniel Dunbar  Args.AddLastArg(CmdArgs, options::OPT_pedantic_errors);
19601d46033f760ba5fd266ce59fe391fac473f04f52Daniel Dunbar  Args.AddLastArg(CmdArgs, options::OPT_w);
1961d573d26e1abcce24c31ece3d6f7af158db569e4cDaniel Dunbar
1962d573d26e1abcce24c31ece3d6f7af158db569e4cDaniel Dunbar  // Handle -{std, ansi, trigraphs} -- take the last of -{std, ansi}
1963d573d26e1abcce24c31ece3d6f7af158db569e4cDaniel Dunbar  // (-ansi is equivalent to -std=c89).
1964d573d26e1abcce24c31ece3d6f7af158db569e4cDaniel Dunbar  //
1965d573d26e1abcce24c31ece3d6f7af158db569e4cDaniel Dunbar  // If a std is supplied, only add -trigraphs if it follows the
1966d573d26e1abcce24c31ece3d6f7af158db569e4cDaniel Dunbar  // option.
1967d573d26e1abcce24c31ece3d6f7af158db569e4cDaniel Dunbar  if (Arg *Std = Args.getLastArg(options::OPT_std_EQ, options::OPT_ansi)) {
1968d573d26e1abcce24c31ece3d6f7af158db569e4cDaniel Dunbar    if (Std->getOption().matches(options::OPT_ansi))
1969528365d3189d27f3a90a4012baaa8b2814e0a231Nuno Lopes      if (types::isCXX(InputType))
1970294691eb1caf551083acd7b08630ef21c3fd760dDaniel Dunbar        CmdArgs.push_back("-std=c++98");
1971528365d3189d27f3a90a4012baaa8b2814e0a231Nuno Lopes      else
1972294691eb1caf551083acd7b08630ef21c3fd760dDaniel Dunbar        CmdArgs.push_back("-std=c89");
1973d573d26e1abcce24c31ece3d6f7af158db569e4cDaniel Dunbar    else
1974d573d26e1abcce24c31ece3d6f7af158db569e4cDaniel Dunbar      Std->render(Args, CmdArgs);
1975d573d26e1abcce24c31ece3d6f7af158db569e4cDaniel Dunbar
19760e10031ba5d0f9b3e5bc5570f39382d288779ab8Daniel Dunbar    if (Arg *A = Args.getLastArg(options::OPT_std_EQ, options::OPT_ansi,
19770e10031ba5d0f9b3e5bc5570f39382d288779ab8Daniel Dunbar                                 options::OPT_trigraphs))
19780e10031ba5d0f9b3e5bc5570f39382d288779ab8Daniel Dunbar      if (A != Std)
1979d573d26e1abcce24c31ece3d6f7af158db569e4cDaniel Dunbar        A->render(Args, CmdArgs);
1980a3ff202ee4fb21728e930d5d029ba4925129912cDaniel Dunbar  } else {
1981a3ff202ee4fb21728e930d5d029ba4925129912cDaniel Dunbar    // Honor -std-default.
19824a5290e773e70ec2c3b4353a3a4aa7d1a3e3cd66Daniel Dunbar    //
19834a5290e773e70ec2c3b4353a3a4aa7d1a3e3cd66Daniel Dunbar    // FIXME: Clang doesn't correctly handle -std= when the input language
19844a5290e773e70ec2c3b4353a3a4aa7d1a3e3cd66Daniel Dunbar    // doesn't match. For the time being just ignore this for C++ inputs;
19854a5290e773e70ec2c3b4353a3a4aa7d1a3e3cd66Daniel Dunbar    // eventually we want to do all the standard defaulting here instead of
19864a5290e773e70ec2c3b4353a3a4aa7d1a3e3cd66Daniel Dunbar    // splitting it between the driver and clang -cc1.
19874a5290e773e70ec2c3b4353a3a4aa7d1a3e3cd66Daniel Dunbar    if (!types::isCXX(InputType))
19884a5290e773e70ec2c3b4353a3a4aa7d1a3e3cd66Daniel Dunbar        Args.AddAllArgsTranslated(CmdArgs, options::OPT_std_default_EQ,
19894a5290e773e70ec2c3b4353a3a4aa7d1a3e3cd66Daniel Dunbar                                  "-std=", /*Joined=*/true);
1990d573d26e1abcce24c31ece3d6f7af158db569e4cDaniel Dunbar    Args.AddLastArg(CmdArgs, options::OPT_trigraphs);
1991a3ff202ee4fb21728e930d5d029ba4925129912cDaniel Dunbar  }
1992c21c485b4fb58ef5d55cf3e523263dd824a2ace4Daniel Dunbar
199350465d1d2f5f6dd3d8e18e2cf7bad4691e5ca6a8Chandler Carruth  // Map the bizarre '-Wwrite-strings' flag to a more sensible
199450465d1d2f5f6dd3d8e18e2cf7bad4691e5ca6a8Chandler Carruth  // '-fconst-strings'; this better indicates its actual behavior.
199550465d1d2f5f6dd3d8e18e2cf7bad4691e5ca6a8Chandler Carruth  if (Args.hasFlag(options::OPT_Wwrite_strings, options::OPT_Wno_write_strings,
199650465d1d2f5f6dd3d8e18e2cf7bad4691e5ca6a8Chandler Carruth                   false)) {
199750465d1d2f5f6dd3d8e18e2cf7bad4691e5ca6a8Chandler Carruth    // For perfect compatibility with GCC, we do this even in the presence of
199850465d1d2f5f6dd3d8e18e2cf7bad4691e5ca6a8Chandler Carruth    // '-w'. This flag names something other than a warning for GCC.
199950465d1d2f5f6dd3d8e18e2cf7bad4691e5ca6a8Chandler Carruth    CmdArgs.push_back("-fconst-strings");
200050465d1d2f5f6dd3d8e18e2cf7bad4691e5ca6a8Chandler Carruth  }
200150465d1d2f5f6dd3d8e18e2cf7bad4691e5ca6a8Chandler Carruth
20021cfe3c305c0d5393fd94167808b8f5d96cd65227Chandler Carruth  // GCC provides a macro definition '__DEPRECATED' when -Wdeprecated is active
2003f8c247d247f9f7ab2bf4965677e6d056711c99d5Chandler Carruth  // during C++ compilation, which it is by default. GCC keeps this define even
2004f8c247d247f9f7ab2bf4965677e6d056711c99d5Chandler Carruth  // in the presence of '-w', match this behavior bug-for-bug.
2005f8c247d247f9f7ab2bf4965677e6d056711c99d5Chandler Carruth  if (types::isCXX(InputType) &&
2006f8c247d247f9f7ab2bf4965677e6d056711c99d5Chandler Carruth      Args.hasFlag(options::OPT_Wdeprecated, options::OPT_Wno_deprecated,
2007f8c247d247f9f7ab2bf4965677e6d056711c99d5Chandler Carruth                   true)) {
2008f8c247d247f9f7ab2bf4965677e6d056711c99d5Chandler Carruth    CmdArgs.push_back("-fdeprecated-macro");
20091cfe3c305c0d5393fd94167808b8f5d96cd65227Chandler Carruth  }
20101cfe3c305c0d5393fd94167808b8f5d96cd65227Chandler Carruth
2011c304ba341a7daa88da42faf8f86310b764dd7b6aChandler Carruth  // Translate GCC's misnamer '-fasm' arguments to '-fgnu-keywords'.
2012c304ba341a7daa88da42faf8f86310b764dd7b6aChandler Carruth  if (Arg *Asm = Args.getLastArg(options::OPT_fasm, options::OPT_fno_asm)) {
2013c304ba341a7daa88da42faf8f86310b764dd7b6aChandler Carruth    if (Asm->getOption().matches(options::OPT_fasm))
2014c304ba341a7daa88da42faf8f86310b764dd7b6aChandler Carruth      CmdArgs.push_back("-fgnu-keywords");
2015c304ba341a7daa88da42faf8f86310b764dd7b6aChandler Carruth    else
2016c304ba341a7daa88da42faf8f86310b764dd7b6aChandler Carruth      CmdArgs.push_back("-fno-gnu-keywords");
2017c304ba341a7daa88da42faf8f86310b764dd7b6aChandler Carruth  }
2018c304ba341a7daa88da42faf8f86310b764dd7b6aChandler Carruth
201961b1efe2d0b459a98962fd9b4c097ad8bb9bfdecRafael Espindola  if (ShouldDisableCFI(Args, getToolChain()))
202061b1efe2d0b459a98962fd9b4c097ad8bb9bfdecRafael Espindola    CmdArgs.push_back("-fno-dwarf2-cfi-asm");
2021f24a151d645abc89f94aa58ad59f3131502041b1Rafael Espindola
2022ea523d73a6de06f828952a02f5ff86e4cc631695Nick Lewycky  if (ShouldDisableDwarfDirectory(Args, getToolChain()))
2023ea523d73a6de06f828952a02f5ff86e4cc631695Nick Lewycky    CmdArgs.push_back("-fno-dwarf-directory-asm");
2024ea523d73a6de06f828952a02f5ff86e4cc631695Nick Lewycky
20257c4fd9121f5885096fd3258d20a984e3f08f8603Nick Lewycky  if (const char *pwd = ::getenv("PWD")) {
20267c4fd9121f5885096fd3258d20a984e3f08f8603Nick Lewycky    // GCC also verifies that stat(pwd) and stat(".") have the same inode
20277c4fd9121f5885096fd3258d20a984e3f08f8603Nick Lewycky    // number. Not doing those because stats are slow, but we could.
2028813a40750f7e8cd1e09a8aa1091283224a6adf21NAKAMURA Takumi    if (llvm::sys::path::is_absolute(pwd)) {
20297c4fd9121f5885096fd3258d20a984e3f08f8603Nick Lewycky      std::string CompDir = pwd;
20307c4fd9121f5885096fd3258d20a984e3f08f8603Nick Lewycky      CmdArgs.push_back("-fdebug-compilation-dir");
20317c4fd9121f5885096fd3258d20a984e3f08f8603Nick Lewycky      CmdArgs.push_back(Args.MakeArgString(CompDir));
20327c4fd9121f5885096fd3258d20a984e3f08f8603Nick Lewycky    }
20337c4fd9121f5885096fd3258d20a984e3f08f8603Nick Lewycky  }
20347c4fd9121f5885096fd3258d20a984e3f08f8603Nick Lewycky
2035c18c42345636e2866fed75c7e434fb659d747672Richard Smith  if (Arg *A = Args.getLastArg(options::OPT_ftemplate_depth_,
2036c18c42345636e2866fed75c7e434fb659d747672Richard Smith                               options::OPT_ftemplate_depth_EQ)) {
20371d46033f760ba5fd266ce59fe391fac473f04f52Daniel Dunbar    CmdArgs.push_back("-ftemplate-depth");
20381d46033f760ba5fd266ce59fe391fac473f04f52Daniel Dunbar    CmdArgs.push_back(A->getValue(Args));
2039b488c1dac8e53206f07103d794a62a3f5012c0f4Daniel Dunbar  }
2040b488c1dac8e53206f07103d794a62a3f5012c0f4Daniel Dunbar
2041c18c42345636e2866fed75c7e434fb659d747672Richard Smith  if (Arg *A = Args.getLastArg(options::OPT_fconstexpr_depth_EQ)) {
2042c18c42345636e2866fed75c7e434fb659d747672Richard Smith    CmdArgs.push_back("-fconstexpr-depth");
2043c18c42345636e2866fed75c7e434fb659d747672Richard Smith    CmdArgs.push_back(A->getValue(Args));
2044c18c42345636e2866fed75c7e434fb659d747672Richard Smith  }
2045c18c42345636e2866fed75c7e434fb659d747672Richard Smith
20461380a147d4578b619c215b23aa79ce17036d3c46Argyrios Kyrtzidis  if (Arg *A = Args.getLastArg(options::OPT_Wlarge_by_value_copy_EQ,
20471380a147d4578b619c215b23aa79ce17036d3c46Argyrios Kyrtzidis                               options::OPT_Wlarge_by_value_copy_def)) {
20482e4fd6d9a1c8ba9c400324d230cfc49050550deaJean-Daniel Dupas    if (A->getNumValues()) {
20492e4fd6d9a1c8ba9c400324d230cfc49050550deaJean-Daniel Dupas      StringRef bytes = A->getValue(Args);
20502e4fd6d9a1c8ba9c400324d230cfc49050550deaJean-Daniel Dupas      CmdArgs.push_back(Args.MakeArgString("-Wlarge-by-value-copy=" + bytes));
20512e4fd6d9a1c8ba9c400324d230cfc49050550deaJean-Daniel Dupas    } else
20522e4fd6d9a1c8ba9c400324d230cfc49050550deaJean-Daniel Dupas      CmdArgs.push_back("-Wlarge-by-value-copy=64"); // default value
20533532fdd1db8ff6f353f2a5b215cebe3e0e2ff3c2Argyrios Kyrtzidis  }
20543532fdd1db8ff6f353f2a5b215cebe3e0e2ff3c2Argyrios Kyrtzidis
2055b3198a841e7f356f171f1e11faff014b2deb1eb8Nuno Lopes  if (Arg *A = Args.getLastArg(options::OPT_fbounds_checking,
2056b3198a841e7f356f171f1e11faff014b2deb1eb8Nuno Lopes                               options::OPT_fbounds_checking_EQ)) {
2057b3198a841e7f356f171f1e11faff014b2deb1eb8Nuno Lopes    if (A->getNumValues()) {
2058b3198a841e7f356f171f1e11faff014b2deb1eb8Nuno Lopes      StringRef val = A->getValue(Args);
2059b3198a841e7f356f171f1e11faff014b2deb1eb8Nuno Lopes      CmdArgs.push_back(Args.MakeArgString("-fbounds-checking=" + val));
2060b3198a841e7f356f171f1e11faff014b2deb1eb8Nuno Lopes    } else
2061b3198a841e7f356f171f1e11faff014b2deb1eb8Nuno Lopes      CmdArgs.push_back("-fbounds-checking=1");
2062b3198a841e7f356f171f1e11faff014b2deb1eb8Nuno Lopes  }
2063b3198a841e7f356f171f1e11faff014b2deb1eb8Nuno Lopes
2064e4bdae78c69d2a09ee96619cc5ccf81441674412Daniel Dunbar  if (Args.hasArg(options::OPT__relocatable_pch))
206566861e09d590994a8b941eaa328e4d8f33adec9eDaniel Dunbar    CmdArgs.push_back("-relocatable-pch");
20661eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump
2067294691eb1caf551083acd7b08630ef21c3fd760dDaniel Dunbar  if (Arg *A = Args.getLastArg(options::OPT_fconstant_string_class_EQ)) {
2068294691eb1caf551083acd7b08630ef21c3fd760dDaniel Dunbar    CmdArgs.push_back("-fconstant-string-class");
2069294691eb1caf551083acd7b08630ef21c3fd760dDaniel Dunbar    CmdArgs.push_back(A->getValue(Args));
2070294691eb1caf551083acd7b08630ef21c3fd760dDaniel Dunbar  }
20718a5a9aaddb627c0884c2ed8db55cc29fdb601195David Chisnall
2072124fca533d9fef2e3f6359283909bd342b5f5f26Chris Lattner  if (Arg *A = Args.getLastArg(options::OPT_ftabstop_EQ)) {
2073124fca533d9fef2e3f6359283909bd342b5f5f26Chris Lattner    CmdArgs.push_back("-ftabstop");
2074124fca533d9fef2e3f6359283909bd342b5f5f26Chris Lattner    CmdArgs.push_back(A->getValue(Args));
2075124fca533d9fef2e3f6359283909bd342b5f5f26Chris Lattner  }
2076124fca533d9fef2e3f6359283909bd342b5f5f26Chris Lattner
20770f0c963f9b7ac6f0176c34d405d48fcb005dfab6Chris Lattner  CmdArgs.push_back("-ferror-limit");
20780f0c963f9b7ac6f0176c34d405d48fcb005dfab6Chris Lattner  if (Arg *A = Args.getLastArg(options::OPT_ferror_limit_EQ))
20790f0c963f9b7ac6f0176c34d405d48fcb005dfab6Chris Lattner    CmdArgs.push_back(A->getValue(Args));
20800f0c963f9b7ac6f0176c34d405d48fcb005dfab6Chris Lattner  else
20810f0c963f9b7ac6f0176c34d405d48fcb005dfab6Chris Lattner    CmdArgs.push_back("19");
2082575cf3791216c33770ba950430493cdd43099f8fDouglas Gregor
2083c40f73c6e715044d327409564bf3656254101d46Chandler Carruth  if (Arg *A = Args.getLastArg(options::OPT_fmacro_backtrace_limit_EQ)) {
2084c40f73c6e715044d327409564bf3656254101d46Chandler Carruth    CmdArgs.push_back("-fmacro-backtrace-limit");
20856c1cb9916e9988dcdd65b9266dbe24afd173427aDouglas Gregor    CmdArgs.push_back(A->getValue(Args));
2086c40f73c6e715044d327409564bf3656254101d46Chandler Carruth  }
2087c40f73c6e715044d327409564bf3656254101d46Chandler Carruth
2088c40f73c6e715044d327409564bf3656254101d46Chandler Carruth  if (Arg *A = Args.getLastArg(options::OPT_ftemplate_backtrace_limit_EQ)) {
2089c40f73c6e715044d327409564bf3656254101d46Chandler Carruth    CmdArgs.push_back("-ftemplate-backtrace-limit");
2090575cf3791216c33770ba950430493cdd43099f8fDouglas Gregor    CmdArgs.push_back(A->getValue(Args));
2091c40f73c6e715044d327409564bf3656254101d46Chandler Carruth  }
2092c40f73c6e715044d327409564bf3656254101d46Chandler Carruth
209308d6e032a2a0a8656d12b3b7b93942987bb12eb7Richard Smith  if (Arg *A = Args.getLastArg(options::OPT_fconstexpr_backtrace_limit_EQ)) {
209408d6e032a2a0a8656d12b3b7b93942987bb12eb7Richard Smith    CmdArgs.push_back("-fconstexpr-backtrace-limit");
209508d6e032a2a0a8656d12b3b7b93942987bb12eb7Richard Smith    CmdArgs.push_back(A->getValue(Args));
209608d6e032a2a0a8656d12b3b7b93942987bb12eb7Richard Smith  }
209708d6e032a2a0a8656d12b3b7b93942987bb12eb7Richard Smith
209855efe142a84b2aab6d0186c20a311c347a65f794Daniel Dunbar  // Pass -fmessage-length=.
2099a28690e5b0e423a6287ebe3a5565fd1896d7ebffDaniel Dunbar  CmdArgs.push_back("-fmessage-length");
210055efe142a84b2aab6d0186c20a311c347a65f794Daniel Dunbar  if (Arg *A = Args.getLastArg(options::OPT_fmessage_length_EQ)) {
2101a28690e5b0e423a6287ebe3a5565fd1896d7ebffDaniel Dunbar    CmdArgs.push_back(A->getValue(Args));
210255efe142a84b2aab6d0186c20a311c347a65f794Daniel Dunbar  } else {
210355efe142a84b2aab6d0186c20a311c347a65f794Daniel Dunbar    // If -fmessage-length=N was not specified, determine whether this is a
210455efe142a84b2aab6d0186c20a311c347a65f794Daniel Dunbar    // terminal and, if so, implicitly define -fmessage-length appropriately.
210555efe142a84b2aab6d0186c20a311c347a65f794Daniel Dunbar    unsigned N = llvm::sys::Process::StandardErrColumns();
21065f9e272e632e951b1efe824cd16acb4d96077930Chris Lattner    CmdArgs.push_back(Args.MakeArgString(Twine(N)));
210755efe142a84b2aab6d0186c20a311c347a65f794Daniel Dunbar  }
210855efe142a84b2aab6d0186c20a311c347a65f794Daniel Dunbar
2109ba8d86172c8d9e2476c6fd2415731639223174c5Daniel Dunbar  if (const Arg *A = Args.getLastArg(options::OPT_fvisibility_EQ)) {
2110ba8d86172c8d9e2476c6fd2415731639223174c5Daniel Dunbar    CmdArgs.push_back("-fvisibility");
2111ba8d86172c8d9e2476c6fd2415731639223174c5Daniel Dunbar    CmdArgs.push_back(A->getValue(Args));
2112ba8d86172c8d9e2476c6fd2415731639223174c5Daniel Dunbar  }
2113ba8d86172c8d9e2476c6fd2415731639223174c5Daniel Dunbar
21147cf84d66965a7706004d8590b5af5fe54b85f525Douglas Gregor  Args.AddLastArg(CmdArgs, options::OPT_fvisibility_inlines_hidden);
211520249a1af2e462dcafdd6a350f1c7967b264ff25Michael J. Spencer
21160a80ba74ffa3d3df55abfbc4474d7470c7c923e3Daniel Dunbar  // -fhosted is default.
2117afc4baa37c2f38fadf05b15456b10a0994d51b0bChad Rosier  if (Args.hasFlag(options::OPT_ffreestanding, options::OPT_fhosted, false) ||
2118afc4baa37c2f38fadf05b15456b10a0994d51b0bChad Rosier      KernelOrKext)
21190a80ba74ffa3d3df55abfbc4474d7470c7c923e3Daniel Dunbar    CmdArgs.push_back("-ffreestanding");
21200a80ba74ffa3d3df55abfbc4474d7470c7c923e3Daniel Dunbar
2121ba8d86172c8d9e2476c6fd2415731639223174c5Daniel Dunbar  // Forward -f (flag) options which we can pass directly.
21229c276ae0f24d4cee8f7954069d4b8eae45d0447dMike Stump  Args.AddLastArg(CmdArgs, options::OPT_fcatch_undefined_behavior);
21233aaf082689d3235937a2e56a60f90fc1b3aebfb2Daniel Dunbar  Args.AddLastArg(CmdArgs, options::OPT_femit_all_decls);
21243aaf082689d3235937a2e56a60f90fc1b3aebfb2Daniel Dunbar  Args.AddLastArg(CmdArgs, options::OPT_fheinous_gnu_extensions);
2125c69e1cf04323f2e786d40e8a5ba84e77ee1c6827Devang Patel  Args.AddLastArg(CmdArgs, options::OPT_flimit_debug_info);
2126033be8bd33e0f84db8158771e13528e071563b73Devang Patel  Args.AddLastArg(CmdArgs, options::OPT_fno_limit_debug_info);
2127e88c4513157cc551ed8080b1e3b3b875a9a570e1Eric Christopher  Args.AddLastArg(CmdArgs, options::OPT_fno_operator_names);
212817ba267cae596d5eb35fa0963ebcf73571572940Anton Yartsev  Args.AddLastArg(CmdArgs, options::OPT_faltivec);
21294574c3d75edb0a496d36246b760094f3acf1ba27Chad Rosier
21304574c3d75edb0a496d36246b760094f3acf1ba27Chad Rosier  // Report and error for -faltivec on anything other then PowerPC.
21314574c3d75edb0a496d36246b760094f3acf1ba27Chad Rosier  if (const Arg *A = Args.getLastArg(options::OPT_faltivec))
21324574c3d75edb0a496d36246b760094f3acf1ba27Chad Rosier    if (!(getToolChain().getTriple().getArch() == llvm::Triple::ppc ||
21334574c3d75edb0a496d36246b760094f3acf1ba27Chad Rosier          getToolChain().getTriple().getArch() == llvm::Triple::ppc64))
21344574c3d75edb0a496d36246b760094f3acf1ba27Chad Rosier      D.Diag(diag::err_drv_argument_only_allowed_with)
21354574c3d75edb0a496d36246b760094f3acf1ba27Chad Rosier        << A->getAsString(Args) << "ppc/ppc64";
21364574c3d75edb0a496d36246b760094f3acf1ba27Chad Rosier
2137bbe8e3eff56ac1d79f3668d706536e3cebe28c18Daniel Dunbar  if (getToolChain().SupportsProfiling())
2138bbe8e3eff56ac1d79f3668d706536e3cebe28c18Daniel Dunbar    Args.AddLastArg(CmdArgs, options::OPT_pg);
21398c6fa84b2e4a30317b7b214a7657cb593d67773bDaniel Dunbar
21401b4eca67e073f0beefb9924cbe6c65427869f1faKostya Serebryany  if (Args.hasFlag(options::OPT_faddress_sanitizer,
21411b4eca67e073f0beefb9924cbe6c65427869f1faKostya Serebryany                   options::OPT_fno_address_sanitizer, false))
21421b4eca67e073f0beefb9924cbe6c65427869f1faKostya Serebryany    CmdArgs.push_back("-faddress-sanitizer");
21431b4eca67e073f0beefb9924cbe6c65427869f1faKostya Serebryany
21443c93122d31924d6d4a6265f36a0c98a164002da6Kostya Serebryany  if (Args.hasFlag(options::OPT_fthread_sanitizer,
21453c93122d31924d6d4a6265f36a0c98a164002da6Kostya Serebryany                   options::OPT_fno_thread_sanitizer, false))
21463c93122d31924d6d4a6265f36a0c98a164002da6Kostya Serebryany    CmdArgs.push_back("-fthread-sanitizer");
21473c93122d31924d6d4a6265f36a0c98a164002da6Kostya Serebryany
21488c6fa84b2e4a30317b7b214a7657cb593d67773bDaniel Dunbar  // -flax-vector-conversions is default.
21498c6fa84b2e4a30317b7b214a7657cb593d67773bDaniel Dunbar  if (!Args.hasFlag(options::OPT_flax_vector_conversions,
21508c6fa84b2e4a30317b7b214a7657cb593d67773bDaniel Dunbar                    options::OPT_fno_lax_vector_conversions))
21518c6fa84b2e4a30317b7b214a7657cb593d67773bDaniel Dunbar    CmdArgs.push_back("-fno-lax-vector-conversions");
21528c6fa84b2e4a30317b7b214a7657cb593d67773bDaniel Dunbar
2153b466d01e464b21832c23eeed90112bc5c26c0236Fariborz Jahanian  if (Args.getLastArg(options::OPT_fapple_kext))
2154b466d01e464b21832c23eeed90112bc5c26c0236Fariborz Jahanian    CmdArgs.push_back("-fapple-kext");
2155b466d01e464b21832c23eeed90112bc5c26c0236Fariborz Jahanian
215634e65770ad6142b033d6cec4f476ed20fb248bf3Fariborz Jahanian  Args.AddLastArg(CmdArgs, options::OPT_fobjc_sender_dependent_dispatch);
2157182e09240a33c6f1d303deecabec6e0e9c9d109dChris Lattner  Args.AddLastArg(CmdArgs, options::OPT_fdiagnostics_print_source_range_info);
21584786c15f4977c7cee98fde3ebdee213dba23848bDouglas Gregor  Args.AddLastArg(CmdArgs, options::OPT_fdiagnostics_parseable_fixits);
21593aaf082689d3235937a2e56a60f90fc1b3aebfb2Daniel Dunbar  Args.AddLastArg(CmdArgs, options::OPT_ftime_report);
21603aaf082689d3235937a2e56a60f90fc1b3aebfb2Daniel Dunbar  Args.AddLastArg(CmdArgs, options::OPT_ftrapv);
21617f18e67e1b577a50402e8b43508ab2311a5c45b5David Chisnall
21627f18e67e1b577a50402e8b43508ab2311a5c45b5David Chisnall  if (Arg *A = Args.getLastArg(options::OPT_ftrapv_handler_EQ)) {
21637f18e67e1b577a50402e8b43508ab2311a5c45b5David Chisnall    CmdArgs.push_back("-ftrapv-handler");
21647f18e67e1b577a50402e8b43508ab2311a5c45b5David Chisnall    CmdArgs.push_back(A->getValue(Args));
21657f18e67e1b577a50402e8b43508ab2311a5c45b5David Chisnall  }
21667f18e67e1b577a50402e8b43508ab2311a5c45b5David Chisnall
216771fd6cc843719cab528a5df0899ad3d15cb9297fBob Wilson  Args.AddLastArg(CmdArgs, options::OPT_ftrap_function_EQ);
216849af1f3cedc55726e4a3dd343eb4a8e24eab8439Evan Cheng
21695adb5a84bfb4f2e5f1ea28fdfc6ee1cd9b622c60Chandler Carruth  // -fno-strict-overflow implies -fwrapv if it isn't disabled, but
21705adb5a84bfb4f2e5f1ea28fdfc6ee1cd9b622c60Chandler Carruth  // -fstrict-overflow won't turn off an explicitly enabled -fwrapv.
21715adb5a84bfb4f2e5f1ea28fdfc6ee1cd9b622c60Chandler Carruth  if (Arg *A = Args.getLastArg(options::OPT_fwrapv,
21725adb5a84bfb4f2e5f1ea28fdfc6ee1cd9b622c60Chandler Carruth                               options::OPT_fno_wrapv)) {
21735adb5a84bfb4f2e5f1ea28fdfc6ee1cd9b622c60Chandler Carruth    if (A->getOption().matches(options::OPT_fwrapv))
21745adb5a84bfb4f2e5f1ea28fdfc6ee1cd9b622c60Chandler Carruth      CmdArgs.push_back("-fwrapv");
21755adb5a84bfb4f2e5f1ea28fdfc6ee1cd9b622c60Chandler Carruth  } else if (Arg *A = Args.getLastArg(options::OPT_fstrict_overflow,
21765adb5a84bfb4f2e5f1ea28fdfc6ee1cd9b622c60Chandler Carruth                                      options::OPT_fno_strict_overflow)) {
21775adb5a84bfb4f2e5f1ea28fdfc6ee1cd9b622c60Chandler Carruth    if (A->getOption().matches(options::OPT_fno_strict_overflow))
21785adb5a84bfb4f2e5f1ea28fdfc6ee1cd9b622c60Chandler Carruth      CmdArgs.push_back("-fwrapv");
21795adb5a84bfb4f2e5f1ea28fdfc6ee1cd9b622c60Chandler Carruth  }
21803aaf082689d3235937a2e56a60f90fc1b3aebfb2Daniel Dunbar  Args.AddLastArg(CmdArgs, options::OPT_fwritable_strings);
2181f84d409903dd4107c8cef5a08fcfce6e5c21d4deEric Christopher  Args.AddLastArg(CmdArgs, options::OPT_funroll_loops);
21821d46033f760ba5fd266ce59fe391fac473f04f52Daniel Dunbar
21835345c391c65d1780a0d7b0102b7f735cc3f82732Daniel Dunbar  Args.AddLastArg(CmdArgs, options::OPT_pthread);
21845345c391c65d1780a0d7b0102b7f735cc3f82732Daniel Dunbar
21859e5cc6b703b2d0013f13800c2ffbeb3cf85fcfadDaniel Dunbar  // -stack-protector=0 is default.
21869e5cc6b703b2d0013f13800c2ffbeb3cf85fcfadDaniel Dunbar  unsigned StackProtectorLevel = 0;
218745483f7a1b3e57b4603b141bee80596b2d4dd443Bill Wendling  if (Arg *A = Args.getLastArg(options::OPT_fno_stack_protector,
218845483f7a1b3e57b4603b141bee80596b2d4dd443Bill Wendling                               options::OPT_fstack_protector_all,
218945483f7a1b3e57b4603b141bee80596b2d4dd443Bill Wendling                               options::OPT_fstack_protector)) {
21909e5cc6b703b2d0013f13800c2ffbeb3cf85fcfadDaniel Dunbar    if (A->getOption().matches(options::OPT_fstack_protector))
21919e5cc6b703b2d0013f13800c2ffbeb3cf85fcfadDaniel Dunbar      StackProtectorLevel = 1;
21929e5cc6b703b2d0013f13800c2ffbeb3cf85fcfadDaniel Dunbar    else if (A->getOption().matches(options::OPT_fstack_protector_all))
21939e5cc6b703b2d0013f13800c2ffbeb3cf85fcfadDaniel Dunbar      StackProtectorLevel = 2;
21942fef11164cbe804f7b808c07757c6f900c08d765Nico Weber  } else {
21952fef11164cbe804f7b808c07757c6f900c08d765Nico Weber    StackProtectorLevel =
21962fef11164cbe804f7b808c07757c6f900c08d765Nico Weber      getToolChain().GetDefaultStackProtectorLevel(KernelOrKext);
21972fef11164cbe804f7b808c07757c6f900c08d765Nico Weber  }
21989e5cc6b703b2d0013f13800c2ffbeb3cf85fcfadDaniel Dunbar  if (StackProtectorLevel) {
21999e5cc6b703b2d0013f13800c2ffbeb3cf85fcfadDaniel Dunbar    CmdArgs.push_back("-stack-protector");
22005f9e272e632e951b1efe824cd16acb4d96077930Chris Lattner    CmdArgs.push_back(Args.MakeArgString(Twine(StackProtectorLevel)));
220145483f7a1b3e57b4603b141bee80596b2d4dd443Bill Wendling  }
220245483f7a1b3e57b4603b141bee80596b2d4dd443Bill Wendling
22034e785c908ae01519d3592eae2828e2cc94fb02ebNick Lewycky  // Translate -mstackrealign
22044e785c908ae01519d3592eae2828e2cc94fb02ebNick Lewycky  if (Args.hasFlag(options::OPT_mstackrealign, options::OPT_mno_stackrealign,
22054e785c908ae01519d3592eae2828e2cc94fb02ebNick Lewycky                   false)) {
22064e785c908ae01519d3592eae2828e2cc94fb02ebNick Lewycky    CmdArgs.push_back("-backend-option");
22074e785c908ae01519d3592eae2828e2cc94fb02ebNick Lewycky    CmdArgs.push_back("-force-align-stack");
22084e785c908ae01519d3592eae2828e2cc94fb02ebNick Lewycky  }
22094e785c908ae01519d3592eae2828e2cc94fb02ebNick Lewycky  if (!Args.hasFlag(options::OPT_mno_stackrealign, options::OPT_mstackrealign,
22104e785c908ae01519d3592eae2828e2cc94fb02ebNick Lewycky                   false)) {
22114e785c908ae01519d3592eae2828e2cc94fb02ebNick Lewycky    CmdArgs.push_back(Args.MakeArgString("-mstackrealign"));
22124e785c908ae01519d3592eae2828e2cc94fb02ebNick Lewycky  }
22134e785c908ae01519d3592eae2828e2cc94fb02ebNick Lewycky
2214e9d11dbfe1f3286c5f8a2f2fc8ac759f63890655Joerg Sonnenberger  if (Args.hasArg(options::OPT_mstack_alignment)) {
2215e9d11dbfe1f3286c5f8a2f2fc8ac759f63890655Joerg Sonnenberger    StringRef alignment = Args.getLastArgValue(options::OPT_mstack_alignment);
2216e9d11dbfe1f3286c5f8a2f2fc8ac759f63890655Joerg Sonnenberger    CmdArgs.push_back(Args.MakeArgString("-mstack-alignment=" + alignment));
22171a584022c86bd0778cf7ad1fbea08c78869cf216Eric Christopher  }
221888b7cf00fcb582728c642da3927c59468efaf926Eric Christopher
221948d1ef782c8c88066b5febf60f8f456064d7d3f0Daniel Dunbar  // Forward -f options with positive and negative forms; we translate
222048d1ef782c8c88066b5febf60f8f456064d7d3f0Daniel Dunbar  // these by hand.
222148d1ef782c8c88066b5febf60f8f456064d7d3f0Daniel Dunbar
2222b466d01e464b21832c23eeed90112bc5c26c0236Fariborz Jahanian  if (Args.hasArg(options::OPT_mkernel)) {
22232843c1900b6da763885f47d0999e923e7c67fd65Daniel Dunbar    if (!Args.hasArg(options::OPT_fapple_kext) && types::isCXX(InputType))
2224b466d01e464b21832c23eeed90112bc5c26c0236Fariborz Jahanian      CmdArgs.push_back("-fapple-kext");
2225b466d01e464b21832c23eeed90112bc5c26c0236Fariborz Jahanian    if (!Args.hasArg(options::OPT_fbuiltin))
2226b466d01e464b21832c23eeed90112bc5c26c0236Fariborz Jahanian      CmdArgs.push_back("-fno-builtin");
22273d26550ba88d2c15292b3f290d6eadec83749e95Chad Rosier    Args.ClaimAllArgs(options::OPT_fno_builtin);
2228b466d01e464b21832c23eeed90112bc5c26c0236Fariborz Jahanian  }
22299e5cc6b703b2d0013f13800c2ffbeb3cf85fcfadDaniel Dunbar  // -fbuiltin is default.
2230b466d01e464b21832c23eeed90112bc5c26c0236Fariborz Jahanian  else if (!Args.hasFlag(options::OPT_fbuiltin, options::OPT_fno_builtin))
223153e8484581ca358c3a2ccd8ea39c136c6e85d606Daniel Dunbar    CmdArgs.push_back("-fno-builtin");
223248d1ef782c8c88066b5febf60f8f456064d7d3f0Daniel Dunbar
2233fc2844846e91398205fddc71196fe9dda04e105fNuno Lopes  if (!Args.hasFlag(options::OPT_fassume_sane_operator_new,
2234fc2844846e91398205fddc71196fe9dda04e105fNuno Lopes                    options::OPT_fno_assume_sane_operator_new))
2235fc2844846e91398205fddc71196fe9dda04e105fNuno Lopes    CmdArgs.push_back("-fno-assume-sane-operator-new");
2236fc2844846e91398205fddc71196fe9dda04e105fNuno Lopes
22379e5cc6b703b2d0013f13800c2ffbeb3cf85fcfadDaniel Dunbar  // -fblocks=0 is default.
22389e5cc6b703b2d0013f13800c2ffbeb3cf85fcfadDaniel Dunbar  if (Args.hasFlag(options::OPT_fblocks, options::OPT_fno_blocks,
2239e6533ffc680e84cd193b4ea0d81548e251cb1f2fDavid Chisnall                   getToolChain().IsBlocksDefault()) ||
2240e6533ffc680e84cd193b4ea0d81548e251cb1f2fDavid Chisnall        (Args.hasArg(options::OPT_fgnu_runtime) &&
2241e6533ffc680e84cd193b4ea0d81548e251cb1f2fDavid Chisnall         Args.hasArg(options::OPT_fobjc_nonfragile_abi) &&
2242e6533ffc680e84cd193b4ea0d81548e251cb1f2fDavid Chisnall         !Args.hasArg(options::OPT_fno_blocks))) {
22439e5cc6b703b2d0013f13800c2ffbeb3cf85fcfadDaniel Dunbar    CmdArgs.push_back("-fblocks");
224413db5cfc4e5f03eb70efe0d227b53b8280f16161John McCall
224513db5cfc4e5f03eb70efe0d227b53b8280f16161John McCall    if (!Args.hasArg(options::OPT_fgnu_runtime) &&
224613db5cfc4e5f03eb70efe0d227b53b8280f16161John McCall        !getToolChain().hasBlocksRuntime())
224713db5cfc4e5f03eb70efe0d227b53b8280f16161John McCall      CmdArgs.push_back("-fblocks-runtime-optional");
22485e530af5d51572a0ed5dbe50da54bd333840c63dDavid Chisnall  }
224948d1ef782c8c88066b5febf60f8f456064d7d3f0Daniel Dunbar
225064554ba9fc5f251108fd7d10a9c218e7bf985941Douglas Gregor  // -fmodules enables modules (off by default). However, for C++/Objective-C++,
225164554ba9fc5f251108fd7d10a9c218e7bf985941Douglas Gregor  // users must also pass -fcxx-modules. The latter flag will disappear once the
225264554ba9fc5f251108fd7d10a9c218e7bf985941Douglas Gregor  // modules implementation is solid for C++/Objective-C++ programs as well.
225364554ba9fc5f251108fd7d10a9c218e7bf985941Douglas Gregor  if (Args.hasFlag(options::OPT_fmodules, options::OPT_fno_modules, false)) {
225464554ba9fc5f251108fd7d10a9c218e7bf985941Douglas Gregor    bool AllowedInCXX = Args.hasFlag(options::OPT_fcxx_modules,
225564554ba9fc5f251108fd7d10a9c218e7bf985941Douglas Gregor                                     options::OPT_fno_cxx_modules,
225664554ba9fc5f251108fd7d10a9c218e7bf985941Douglas Gregor                                     false);
225764554ba9fc5f251108fd7d10a9c218e7bf985941Douglas Gregor    if (AllowedInCXX || !types::isCXX(InputType))
225864554ba9fc5f251108fd7d10a9c218e7bf985941Douglas Gregor      CmdArgs.push_back("-fmodules");
225964554ba9fc5f251108fd7d10a9c218e7bf985941Douglas Gregor  }
22607025d2cc327ec75353454586df2987afce5e5789Douglas Gregor
226132579cf507d088e776b67327c5d6bc46e1f217ccJohn McCall  // -faccess-control is default.
22627002f4c03c2d0544f4e8bea8d3a5636519081e35John McCall  if (Args.hasFlag(options::OPT_fno_access_control,
22637002f4c03c2d0544f4e8bea8d3a5636519081e35John McCall                   options::OPT_faccess_control,
226432579cf507d088e776b67327c5d6bc46e1f217ccJohn McCall                   false))
22657002f4c03c2d0544f4e8bea8d3a5636519081e35John McCall    CmdArgs.push_back("-fno-access-control");
22663ddd6e026a173e9519e84e27f8d6aed5473b8b4eJohn McCall
2267a4c2475961184a4bad6f6f087eeb1038bb784cadAnders Carlsson  // -felide-constructors is the default.
2268a4c2475961184a4bad6f6f087eeb1038bb784cadAnders Carlsson  if (Args.hasFlag(options::OPT_fno_elide_constructors,
2269a4c2475961184a4bad6f6f087eeb1038bb784cadAnders Carlsson                   options::OPT_felide_constructors,
2270a4c2475961184a4bad6f6f087eeb1038bb784cadAnders Carlsson                   false))
2271a4c2475961184a4bad6f6f087eeb1038bb784cadAnders Carlsson    CmdArgs.push_back("-fno-elide-constructors");
2272a4c2475961184a4bad6f6f087eeb1038bb784cadAnders Carlsson
22730be42c44f0199c5023b542d6a6d2e66eb594f27dDaniel Dunbar  // -frtti is default.
2274afc4baa37c2f38fadf05b15456b10a0994d51b0bChad Rosier  if (!Args.hasFlag(options::OPT_frtti, options::OPT_fno_rtti) ||
2275afc4baa37c2f38fadf05b15456b10a0994d51b0bChad Rosier      KernelOrKext)
227653e8484581ca358c3a2ccd8ea39c136c6e85d606Daniel Dunbar    CmdArgs.push_back("-fno-rtti");
2277738f8c278da5950d0d4607de2debe0bdfad64185Mike Stump
22789631939f82c0eaa6fb3936a0ce58a41adfbc9011Tony Linthicum  // -fshort-enums=0 is default for all architectures except Hexagon.
22799a2b9d794bdf349b517ff799170f4409f45d147cArgyrios Kyrtzidis  if (Args.hasFlag(options::OPT_fshort_enums,
22809631939f82c0eaa6fb3936a0ce58a41adfbc9011Tony Linthicum                   options::OPT_fno_short_enums,
22819631939f82c0eaa6fb3936a0ce58a41adfbc9011Tony Linthicum                   getToolChain().getTriple().getArch() ==
22829631939f82c0eaa6fb3936a0ce58a41adfbc9011Tony Linthicum                   llvm::Triple::hexagon))
22839a2b9d794bdf349b517ff799170f4409f45d147cArgyrios Kyrtzidis    CmdArgs.push_back("-fshort-enums");
22849a2b9d794bdf349b517ff799170f4409f45d147cArgyrios Kyrtzidis
22851f95e6567faab67f4363d650f73121359c4bdbabDaniel Dunbar  // -fsigned-char is default.
22866d2eb4d07d40795131f28d719ef9146a2be500f6Daniel Dunbar  if (!Args.hasFlag(options::OPT_fsigned_char, options::OPT_funsigned_char,
22871f95e6567faab67f4363d650f73121359c4bdbabDaniel Dunbar                    isSignedCharDefault(getToolChain().getTriple())))
22887674352cf3e8f699914a2f739f1ae8c8c3480813Daniel Dunbar    CmdArgs.push_back("-fno-signed-char");
22895a77973d9bc2c9cdbdb7860dcf3ac795abe258ecEli Friedman
2290a508b7de6c5246ab04ed69d0ab4e9977ec1fb4d4Anders Carlsson  // -fthreadsafe-static is default.
229120249a1af2e462dcafdd6a350f1c7967b264ff25Michael J. Spencer  if (!Args.hasFlag(options::OPT_fthreadsafe_statics,
2292a508b7de6c5246ab04ed69d0ab4e9977ec1fb4d4Anders Carlsson                    options::OPT_fno_threadsafe_statics))
2293a508b7de6c5246ab04ed69d0ab4e9977ec1fb4d4Anders Carlsson    CmdArgs.push_back("-fno-threadsafe-statics");
2294a508b7de6c5246ab04ed69d0ab4e9977ec1fb4d4Anders Carlsson
2295efb0fa9e11f75af51744a6159530ef7cc8efa24aDaniel Dunbar  // -fuse-cxa-atexit is default.
2296afc4baa37c2f38fadf05b15456b10a0994d51b0bChad Rosier  if (!Args.hasFlag(options::OPT_fuse_cxa_atexit,
2297afc4baa37c2f38fadf05b15456b10a0994d51b0bChad Rosier                    options::OPT_fno_use_cxa_atexit,
2298afc4baa37c2f38fadf05b15456b10a0994d51b0bChad Rosier                   getToolChain().getTriple().getOS() != llvm::Triple::Cygwin &&
22999631939f82c0eaa6fb3936a0ce58a41adfbc9011Tony Linthicum                  getToolChain().getTriple().getOS() != llvm::Triple::MinGW32 &&
2300afc4baa37c2f38fadf05b15456b10a0994d51b0bChad Rosier              getToolChain().getTriple().getArch() != llvm::Triple::hexagon) ||
2301afc4baa37c2f38fadf05b15456b10a0994d51b0bChad Rosier      KernelOrKext)
2302efb0fa9e11f75af51744a6159530ef7cc8efa24aDaniel Dunbar    CmdArgs.push_back("-fno-use-cxa-atexit");
2303efb0fa9e11f75af51744a6159530ef7cc8efa24aDaniel Dunbar
23040be42c44f0199c5023b542d6a6d2e66eb594f27dDaniel Dunbar  // -fms-extensions=0 is default.
23056d2eb4d07d40795131f28d719ef9146a2be500f6Daniel Dunbar  if (Args.hasFlag(options::OPT_fms_extensions, options::OPT_fno_ms_extensions,
23060be42c44f0199c5023b542d6a6d2e66eb594f27dDaniel Dunbar                   getToolChain().getTriple().getOS() == llvm::Triple::Win32))
23070be42c44f0199c5023b542d6a6d2e66eb594f27dDaniel Dunbar    CmdArgs.push_back("-fms-extensions");
23080be42c44f0199c5023b542d6a6d2e66eb594f27dDaniel Dunbar
2309ae55608a29d61737b7c5390e2d1bb30ab8d5febbFrancois Pichet  // -fms-compatibility=0 is default.
2310ba97b6ea0e8933ab801b0d06bba133836627794aDouglas Gregor  if (Args.hasFlag(options::OPT_fms_compatibility,
2311ba97b6ea0e8933ab801b0d06bba133836627794aDouglas Gregor                   options::OPT_fno_ms_compatibility,
2312ba97b6ea0e8933ab801b0d06bba133836627794aDouglas Gregor                   (getToolChain().getTriple().getOS() == llvm::Triple::Win32 &&
2313ba97b6ea0e8933ab801b0d06bba133836627794aDouglas Gregor                    Args.hasFlag(options::OPT_fms_extensions,
2314ba97b6ea0e8933ab801b0d06bba133836627794aDouglas Gregor                                 options::OPT_fno_ms_extensions,
2315ba97b6ea0e8933ab801b0d06bba133836627794aDouglas Gregor                                 true))))
2316ae55608a29d61737b7c5390e2d1bb30ab8d5febbFrancois Pichet    CmdArgs.push_back("-fms-compatibility");
2317ae55608a29d61737b7c5390e2d1bb30ab8d5febbFrancois Pichet
2318dae4ac4fe56ec60fc93b3e3c9f51e79e682084b9Michael J. Spencer  // -fmsc-version=1300 is default.
2319dae4ac4fe56ec60fc93b3e3c9f51e79e682084b9Michael J. Spencer  if (Args.hasFlag(options::OPT_fms_extensions, options::OPT_fno_ms_extensions,
2320dae4ac4fe56ec60fc93b3e3c9f51e79e682084b9Michael J. Spencer                   getToolChain().getTriple().getOS() == llvm::Triple::Win32) ||
2321dae4ac4fe56ec60fc93b3e3c9f51e79e682084b9Michael J. Spencer      Args.hasArg(options::OPT_fmsc_version)) {
23225f9e272e632e951b1efe824cd16acb4d96077930Chris Lattner    StringRef msc_ver = Args.getLastArgValue(options::OPT_fmsc_version);
2323dae4ac4fe56ec60fc93b3e3c9f51e79e682084b9Michael J. Spencer    if (msc_ver.empty())
2324dae4ac4fe56ec60fc93b3e3c9f51e79e682084b9Michael J. Spencer      CmdArgs.push_back("-fmsc-version=1300");
2325dae4ac4fe56ec60fc93b3e3c9f51e79e682084b9Michael J. Spencer    else
2326dae4ac4fe56ec60fc93b3e3c9f51e79e682084b9Michael J. Spencer      CmdArgs.push_back(Args.MakeArgString("-fmsc-version=" + msc_ver));
2327dae4ac4fe56ec60fc93b3e3c9f51e79e682084b9Michael J. Spencer  }
2328dae4ac4fe56ec60fc93b3e3c9f51e79e682084b9Michael J. Spencer
2329dae4ac4fe56ec60fc93b3e3c9f51e79e682084b9Michael J. Spencer
2330400b607546a8dbfcee3b690f3d0a2fee0ea6480bDawn Perchik  // -fborland-extensions=0 is default.
2331400b607546a8dbfcee3b690f3d0a2fee0ea6480bDawn Perchik  if (Args.hasFlag(options::OPT_fborland_extensions,
2332400b607546a8dbfcee3b690f3d0a2fee0ea6480bDawn Perchik                   options::OPT_fno_borland_extensions, false))
2333400b607546a8dbfcee3b690f3d0a2fee0ea6480bDawn Perchik    CmdArgs.push_back("-fborland-extensions");
2334400b607546a8dbfcee3b690f3d0a2fee0ea6480bDawn Perchik
23358efcc0184a6dfe1ea799d3a6b9c1312ef1fac11dFrancois Pichet  // -fno-delayed-template-parsing is default, except for Windows where MSVC STL
23368efcc0184a6dfe1ea799d3a6b9c1312ef1fac11dFrancois Pichet  // needs it.
23378387e2a41eef6fa17fb140a18c29b6eee9dd2b8aFrancois Pichet  if (Args.hasFlag(options::OPT_fdelayed_template_parsing,
23388387e2a41eef6fa17fb140a18c29b6eee9dd2b8aFrancois Pichet                   options::OPT_fno_delayed_template_parsing,
23398efcc0184a6dfe1ea799d3a6b9c1312ef1fac11dFrancois Pichet                   getToolChain().getTriple().getOS() == llvm::Triple::Win32))
2340805bc1f6fb9b7bc85222d0211761a8c624f2dd75Francois Pichet    CmdArgs.push_back("-fdelayed-template-parsing");
23418387e2a41eef6fa17fb140a18c29b6eee9dd2b8aFrancois Pichet
2342eb5d7b752651283de5abfcc2f91df7227582a08dChandler Carruth  // -fgnu-keywords default varies depending on language; only pass if
2343eb5d7b752651283de5abfcc2f91df7227582a08dChandler Carruth  // specified.
2344eb5d7b752651283de5abfcc2f91df7227582a08dChandler Carruth  if (Arg *A = Args.getLastArg(options::OPT_fgnu_keywords,
234540788d909ad52fc732fe0769d0ef22e5edad5e47Daniel Dunbar                               options::OPT_fno_gnu_keywords))
234640788d909ad52fc732fe0769d0ef22e5edad5e47Daniel Dunbar    A->render(Args, CmdArgs);
2347eb5d7b752651283de5abfcc2f91df7227582a08dChandler Carruth
234801ba8545fb6bae2a370606b4f40f0d17eb0a8c6cRafael Espindola  if (Args.hasFlag(options::OPT_fgnu89_inline,
234901ba8545fb6bae2a370606b4f40f0d17eb0a8c6cRafael Espindola                   options::OPT_fno_gnu89_inline,
235001ba8545fb6bae2a370606b4f40f0d17eb0a8c6cRafael Espindola                   false))
2351fb3f4aad0436a9c40e9130598162150890c405b5Rafael Espindola    CmdArgs.push_back("-fgnu89-inline");
2352fb3f4aad0436a9c40e9130598162150890c405b5Rafael Espindola
2353fc055f943d154c9b7463f43a3b59e093723362c9Chad Rosier  if (Args.hasArg(options::OPT_fno_inline))
2354fc055f943d154c9b7463f43a3b59e093723362c9Chad Rosier    CmdArgs.push_back("-fno-inline");
2355fc055f943d154c9b7463f43a3b59e093723362c9Chad Rosier
2356634a4b1b045b13e7ddfa57934cf2b85d4348f77fChad Rosier  if (Args.hasArg(options::OPT_fno_inline_functions))
2357634a4b1b045b13e7ddfa57934cf2b85d4348f77fChad Rosier    CmdArgs.push_back("-fno-inline-functions");
2358250008b4678b19ef80866702e300bb4e53d9ff2dChad Rosier
23599e5cc6b703b2d0013f13800c2ffbeb3cf85fcfadDaniel Dunbar  // -fobjc-nonfragile-abi=0 is default.
23609f084a3166b684573ba49df28fc5792bc37d92e1John McCall  ObjCRuntime objCRuntime;
2361d71315c5511bd1204732216964faa6254dc4b2b6John McCall  unsigned objcABIVersion = 0;
23623c3ccd283f8c35dbb200a76eacfa17f7861e03bbDavid Chisnall  bool NeXTRuntimeIsDefault
2363e982cc0ea3e9255b8aacf8f0bff559e9b1cfd72eFariborz Jahanian    = (IsRewriter || IsModernRewriter ||
2364e982cc0ea3e9255b8aacf8f0bff559e9b1cfd72eFariborz Jahanian       getToolChain().getTriple().isOSDarwin());
23653c3ccd283f8c35dbb200a76eacfa17f7861e03bbDavid Chisnall  if (Args.hasFlag(options::OPT_fnext_runtime, options::OPT_fgnu_runtime,
23663c3ccd283f8c35dbb200a76eacfa17f7861e03bbDavid Chisnall                   NeXTRuntimeIsDefault)) {
23673c3ccd283f8c35dbb200a76eacfa17f7861e03bbDavid Chisnall    objCRuntime.setKind(ObjCRuntime::NeXT);
23683c3ccd283f8c35dbb200a76eacfa17f7861e03bbDavid Chisnall  } else {
23693c3ccd283f8c35dbb200a76eacfa17f7861e03bbDavid Chisnall    CmdArgs.push_back("-fgnu-runtime");
23703c3ccd283f8c35dbb200a76eacfa17f7861e03bbDavid Chisnall    objCRuntime.setKind(ObjCRuntime::GNU);
23713c3ccd283f8c35dbb200a76eacfa17f7861e03bbDavid Chisnall  }
23723c3ccd283f8c35dbb200a76eacfa17f7861e03bbDavid Chisnall  getToolChain().configureObjCRuntime(objCRuntime);
23733c3ccd283f8c35dbb200a76eacfa17f7861e03bbDavid Chisnall  if (objCRuntime.HasARC)
23743c3ccd283f8c35dbb200a76eacfa17f7861e03bbDavid Chisnall    CmdArgs.push_back("-fobjc-runtime-has-arc");
23753c3ccd283f8c35dbb200a76eacfa17f7861e03bbDavid Chisnall  if (objCRuntime.HasWeak)
23763c3ccd283f8c35dbb200a76eacfa17f7861e03bbDavid Chisnall    CmdArgs.push_back("-fobjc-runtime-has-weak");
23773c3ccd283f8c35dbb200a76eacfa17f7861e03bbDavid Chisnall  if (objCRuntime.HasTerminate)
23783c3ccd283f8c35dbb200a76eacfa17f7861e03bbDavid Chisnall    CmdArgs.push_back("-fobjc-runtime-has-terminate");
23793c3ccd283f8c35dbb200a76eacfa17f7861e03bbDavid Chisnall
23803c3ccd283f8c35dbb200a76eacfa17f7861e03bbDavid Chisnall  // Compute the Objective-C ABI "version" to use. Version numbers are
23813c3ccd283f8c35dbb200a76eacfa17f7861e03bbDavid Chisnall  // slightly confusing for historical reasons:
23823c3ccd283f8c35dbb200a76eacfa17f7861e03bbDavid Chisnall  //   1 - Traditional "fragile" ABI
23833c3ccd283f8c35dbb200a76eacfa17f7861e03bbDavid Chisnall  //   2 - Non-fragile ABI, version 1
23843c3ccd283f8c35dbb200a76eacfa17f7861e03bbDavid Chisnall  //   3 - Non-fragile ABI, version 2
23853c3ccd283f8c35dbb200a76eacfa17f7861e03bbDavid Chisnall  objcABIVersion = 1;
23863c3ccd283f8c35dbb200a76eacfa17f7861e03bbDavid Chisnall  // If -fobjc-abi-version= is present, use that to set the version.
23873c3ccd283f8c35dbb200a76eacfa17f7861e03bbDavid Chisnall  if (Arg *A = Args.getLastArg(options::OPT_fobjc_abi_version_EQ)) {
23883c3ccd283f8c35dbb200a76eacfa17f7861e03bbDavid Chisnall    if (StringRef(A->getValue(Args)) == "1")
23893c3ccd283f8c35dbb200a76eacfa17f7861e03bbDavid Chisnall      objcABIVersion = 1;
23903c3ccd283f8c35dbb200a76eacfa17f7861e03bbDavid Chisnall    else if (StringRef(A->getValue(Args)) == "2")
23913c3ccd283f8c35dbb200a76eacfa17f7861e03bbDavid Chisnall      objcABIVersion = 2;
23923c3ccd283f8c35dbb200a76eacfa17f7861e03bbDavid Chisnall    else if (StringRef(A->getValue(Args)) == "3")
23933c3ccd283f8c35dbb200a76eacfa17f7861e03bbDavid Chisnall      objcABIVersion = 3;
23943c3ccd283f8c35dbb200a76eacfa17f7861e03bbDavid Chisnall    else
23953c3ccd283f8c35dbb200a76eacfa17f7861e03bbDavid Chisnall      D.Diag(diag::err_drv_clang_unsupported) << A->getAsString(Args);
23963c3ccd283f8c35dbb200a76eacfa17f7861e03bbDavid Chisnall  } else {
23973c3ccd283f8c35dbb200a76eacfa17f7861e03bbDavid Chisnall    // Otherwise, determine if we are using the non-fragile ABI.
2398e982cc0ea3e9255b8aacf8f0bff559e9b1cfd72eFariborz Jahanian    bool NonFragileABIIsDefault =
2399e982cc0ea3e9255b8aacf8f0bff559e9b1cfd72eFariborz Jahanian      (IsModernRewriter ||
2400e982cc0ea3e9255b8aacf8f0bff559e9b1cfd72eFariborz Jahanian       (!IsRewriter && getToolChain().IsObjCNonFragileABIDefault()));
24013c3ccd283f8c35dbb200a76eacfa17f7861e03bbDavid Chisnall    if (Args.hasFlag(options::OPT_fobjc_nonfragile_abi,
24023c3ccd283f8c35dbb200a76eacfa17f7861e03bbDavid Chisnall                     options::OPT_fno_objc_nonfragile_abi,
2403d596c4d3f8931f4d479e965bf46d0e7edad85570Douglas Gregor                     NonFragileABIIsDefault)) {
24043c3ccd283f8c35dbb200a76eacfa17f7861e03bbDavid Chisnall      // Determine the non-fragile ABI version to use.
2405de17ba7af23bd3693add73af127600b568cb210bDaniel Dunbar#ifdef DISABLE_DEFAULT_NONFRAGILEABI_TWO
24063c3ccd283f8c35dbb200a76eacfa17f7861e03bbDavid Chisnall      unsigned NonFragileABIVersion = 1;
2407de17ba7af23bd3693add73af127600b568cb210bDaniel Dunbar#else
24083c3ccd283f8c35dbb200a76eacfa17f7861e03bbDavid Chisnall      unsigned NonFragileABIVersion = 2;
2409de17ba7af23bd3693add73af127600b568cb210bDaniel Dunbar#endif
2410dea63134a51d463cf32f3eec3c359d9215359d69Daniel Dunbar
24113c3ccd283f8c35dbb200a76eacfa17f7861e03bbDavid Chisnall      if (Arg *A = Args.getLastArg(
24123c3ccd283f8c35dbb200a76eacfa17f7861e03bbDavid Chisnall            options::OPT_fobjc_nonfragile_abi_version_EQ)) {
24133c3ccd283f8c35dbb200a76eacfa17f7861e03bbDavid Chisnall        if (StringRef(A->getValue(Args)) == "1")
24143c3ccd283f8c35dbb200a76eacfa17f7861e03bbDavid Chisnall          NonFragileABIVersion = 1;
24153c3ccd283f8c35dbb200a76eacfa17f7861e03bbDavid Chisnall        else if (StringRef(A->getValue(Args)) == "2")
24163c3ccd283f8c35dbb200a76eacfa17f7861e03bbDavid Chisnall          NonFragileABIVersion = 2;
24173c3ccd283f8c35dbb200a76eacfa17f7861e03bbDavid Chisnall        else
24183c3ccd283f8c35dbb200a76eacfa17f7861e03bbDavid Chisnall          D.Diag(diag::err_drv_clang_unsupported)
24193c3ccd283f8c35dbb200a76eacfa17f7861e03bbDavid Chisnall            << A->getAsString(Args);
2420dea63134a51d463cf32f3eec3c359d9215359d69Daniel Dunbar      }
24213c3ccd283f8c35dbb200a76eacfa17f7861e03bbDavid Chisnall
24223c3ccd283f8c35dbb200a76eacfa17f7861e03bbDavid Chisnall      objcABIVersion = 1 + NonFragileABIVersion;
24233c3ccd283f8c35dbb200a76eacfa17f7861e03bbDavid Chisnall    } else {
24243c3ccd283f8c35dbb200a76eacfa17f7861e03bbDavid Chisnall      objcABIVersion = 1;
24255e2a8ac6599f0c68b14afb2f328ac98b264f770aDaniel Dunbar    }
24263c3ccd283f8c35dbb200a76eacfa17f7861e03bbDavid Chisnall  }
242720249a1af2e462dcafdd6a350f1c7967b264ff25Michael J. Spencer
2428d1e40d5389a4382cbebc97d54792f41ee0414af4John McCall  if (objcABIVersion == 1) {
2429d1e40d5389a4382cbebc97d54792f41ee0414af4John McCall    CmdArgs.push_back("-fobjc-fragile-abi");
2430d1e40d5389a4382cbebc97d54792f41ee0414af4John McCall  } else {
24313c3ccd283f8c35dbb200a76eacfa17f7861e03bbDavid Chisnall    // -fobjc-dispatch-method is only relevant with the nonfragile-abi, and
24323c3ccd283f8c35dbb200a76eacfa17f7861e03bbDavid Chisnall    // legacy is the default.
24333c3ccd283f8c35dbb200a76eacfa17f7861e03bbDavid Chisnall    if (!Args.hasFlag(options::OPT_fobjc_legacy_dispatch,
24343c3ccd283f8c35dbb200a76eacfa17f7861e03bbDavid Chisnall                      options::OPT_fno_objc_legacy_dispatch,
24353c3ccd283f8c35dbb200a76eacfa17f7861e03bbDavid Chisnall                      getToolChain().IsObjCLegacyDispatchDefault())) {
24363c3ccd283f8c35dbb200a76eacfa17f7861e03bbDavid Chisnall      if (getToolChain().UseObjCMixedDispatch())
24373c3ccd283f8c35dbb200a76eacfa17f7861e03bbDavid Chisnall        CmdArgs.push_back("-fobjc-dispatch-method=mixed");
24383c3ccd283f8c35dbb200a76eacfa17f7861e03bbDavid Chisnall      else
24393c3ccd283f8c35dbb200a76eacfa17f7861e03bbDavid Chisnall        CmdArgs.push_back("-fobjc-dispatch-method=non-legacy");
2440984eb8611d9ee46fc6351dee43609f2deed99f3cDaniel Dunbar    }
24413c3ccd283f8c35dbb200a76eacfa17f7861e03bbDavid Chisnall  }
2442125b4cb35536e45201f8f2cb19ee620e3ad67c49NAKAMURA Takumi
2443df423545a19275559b675bb4f20b6fbe738f0a11Nico Weber  // -fobjc-default-synthesize-properties=1 is default. This only has an effect
2444df423545a19275559b675bb4f20b6fbe738f0a11Nico Weber  // if the nonfragile objc abi is used.
2445e51fe0972a781e79abae550786ebed7d1da54252Fariborz Jahanian  if (getToolChain().IsObjCDefaultSynthPropertiesDefault()) {
24463c3ccd283f8c35dbb200a76eacfa17f7861e03bbDavid Chisnall    CmdArgs.push_back("-fobjc-default-synthesize-properties");
24479e5cc6b703b2d0013f13800c2ffbeb3cf85fcfadDaniel Dunbar  }
24489e5cc6b703b2d0013f13800c2ffbeb3cf85fcfadDaniel Dunbar
24499f084a3166b684573ba49df28fc5792bc37d92e1John McCall  // Allow -fno-objc-arr to trump -fobjc-arr/-fobjc-arc.
24509f084a3166b684573ba49df28fc5792bc37d92e1John McCall  // NOTE: This logic is duplicated in ToolChains.cpp.
24519f084a3166b684573ba49df28fc5792bc37d92e1John McCall  bool ARC = isObjCAutoRefCount(Args);
24529f084a3166b684573ba49df28fc5792bc37d92e1John McCall  if (ARC) {
24535840dd9a09c458ef894e7d47caab1d90dc4c1112Argyrios Kyrtzidis    if (!getToolChain().SupportsObjCARC())
24545840dd9a09c458ef894e7d47caab1d90dc4c1112Argyrios Kyrtzidis      D.Diag(diag::err_arc_unsupported);
24555840dd9a09c458ef894e7d47caab1d90dc4c1112Argyrios Kyrtzidis
24569f084a3166b684573ba49df28fc5792bc37d92e1John McCall    CmdArgs.push_back("-fobjc-arc");
24579f084a3166b684573ba49df28fc5792bc37d92e1John McCall
24587ffa0325bd61f656697f99434334d425c39af309Chandler Carruth    // FIXME: It seems like this entire block, and several around it should be
24597ffa0325bd61f656697f99434334d425c39af309Chandler Carruth    // wrapped in isObjC, but for now we just use it here as this is where it
24607ffa0325bd61f656697f99434334d425c39af309Chandler Carruth    // was being used previously.
24617ffa0325bd61f656697f99434334d425c39af309Chandler Carruth    if (types::isCXX(InputType) && types::isObjC(InputType)) {
24627ffa0325bd61f656697f99434334d425c39af309Chandler Carruth      if (getToolChain().GetCXXStdlibType(Args) == ToolChain::CST_Libcxx)
24637ffa0325bd61f656697f99434334d425c39af309Chandler Carruth        CmdArgs.push_back("-fobjc-arc-cxxlib=libc++");
24647ffa0325bd61f656697f99434334d425c39af309Chandler Carruth      else
24657ffa0325bd61f656697f99434334d425c39af309Chandler Carruth        CmdArgs.push_back("-fobjc-arc-cxxlib=libstdc++");
24667ffa0325bd61f656697f99434334d425c39af309Chandler Carruth    }
24677ffa0325bd61f656697f99434334d425c39af309Chandler Carruth
24689f084a3166b684573ba49df28fc5792bc37d92e1John McCall    // Allow the user to enable full exceptions code emission.
24699f084a3166b684573ba49df28fc5792bc37d92e1John McCall    // We define off for Objective-CC, on for Objective-C++.
24709f084a3166b684573ba49df28fc5792bc37d92e1John McCall    if (Args.hasFlag(options::OPT_fobjc_arc_exceptions,
24719f084a3166b684573ba49df28fc5792bc37d92e1John McCall                     options::OPT_fno_objc_arc_exceptions,
24729f084a3166b684573ba49df28fc5792bc37d92e1John McCall                     /*default*/ types::isCXX(InputType)))
24739f084a3166b684573ba49df28fc5792bc37d92e1John McCall      CmdArgs.push_back("-fobjc-arc-exceptions");
24749f084a3166b684573ba49df28fc5792bc37d92e1John McCall  }
24759f084a3166b684573ba49df28fc5792bc37d92e1John McCall
24769f084a3166b684573ba49df28fc5792bc37d92e1John McCall  // -fobjc-infer-related-result-type is the default, except in the Objective-C
24779f084a3166b684573ba49df28fc5792bc37d92e1John McCall  // rewriter.
2478e982cc0ea3e9255b8aacf8f0bff559e9b1cfd72eFariborz Jahanian  if (IsRewriter || IsModernRewriter)
24799f084a3166b684573ba49df28fc5792bc37d92e1John McCall    CmdArgs.push_back("-fno-objc-infer-related-result-type");
248088b7cf00fcb582728c642da3927c59468efaf926Eric Christopher
24819f084a3166b684573ba49df28fc5792bc37d92e1John McCall  // Handle -fobjc-gc and -fobjc-gc-only. They are exclusive, and -fobjc-gc-only
24829f084a3166b684573ba49df28fc5792bc37d92e1John McCall  // takes precedence.
24839f084a3166b684573ba49df28fc5792bc37d92e1John McCall  const Arg *GCArg = Args.getLastArg(options::OPT_fobjc_gc_only);
24849f084a3166b684573ba49df28fc5792bc37d92e1John McCall  if (!GCArg)
24859f084a3166b684573ba49df28fc5792bc37d92e1John McCall    GCArg = Args.getLastArg(options::OPT_fobjc_gc);
24869f084a3166b684573ba49df28fc5792bc37d92e1John McCall  if (GCArg) {
24879f084a3166b684573ba49df28fc5792bc37d92e1John McCall    if (ARC) {
24885f9e272e632e951b1efe824cd16acb4d96077930Chris Lattner      D.Diag(diag::err_drv_objc_gc_arr)
24899f084a3166b684573ba49df28fc5792bc37d92e1John McCall        << GCArg->getAsString(Args);
24909f084a3166b684573ba49df28fc5792bc37d92e1John McCall    } else if (getToolChain().SupportsObjCGC()) {
24919f084a3166b684573ba49df28fc5792bc37d92e1John McCall      GCArg->render(Args, CmdArgs);
24929f084a3166b684573ba49df28fc5792bc37d92e1John McCall    } else {
24939f084a3166b684573ba49df28fc5792bc37d92e1John McCall      // FIXME: We should move this to a hard error.
24945f9e272e632e951b1efe824cd16acb4d96077930Chris Lattner      D.Diag(diag::warn_drv_objc_gc_unsupported)
24959f084a3166b684573ba49df28fc5792bc37d92e1John McCall        << GCArg->getAsString(Args);
24969f084a3166b684573ba49df28fc5792bc37d92e1John McCall    }
24979f084a3166b684573ba49df28fc5792bc37d92e1John McCall  }
24989f084a3166b684573ba49df28fc5792bc37d92e1John McCall
2499d71315c5511bd1204732216964faa6254dc4b2b6John McCall  // Add exception args.
2500d71315c5511bd1204732216964faa6254dc4b2b6John McCall  addExceptionArgs(Args, InputType, getToolChain().getTriple(),
250115b77319d0ce4332275992b2f191898a1df50efeFariborz Jahanian                   KernelOrKext, objcABIVersion, CmdArgs);
2502d71315c5511bd1204732216964faa6254dc4b2b6John McCall
2503d71315c5511bd1204732216964faa6254dc4b2b6John McCall  if (getToolChain().UseSjLjExceptions())
2504d71315c5511bd1204732216964faa6254dc4b2b6John McCall    CmdArgs.push_back("-fsjlj-exceptions");
2505d71315c5511bd1204732216964faa6254dc4b2b6John McCall
2506d71315c5511bd1204732216964faa6254dc4b2b6John McCall  // C++ "sane" operator new.
2507984eb8611d9ee46fc6351dee43609f2deed99f3cDaniel Dunbar  if (!Args.hasFlag(options::OPT_fassume_sane_operator_new,
2508984eb8611d9ee46fc6351dee43609f2deed99f3cDaniel Dunbar                    options::OPT_fno_assume_sane_operator_new))
2509984eb8611d9ee46fc6351dee43609f2deed99f3cDaniel Dunbar    CmdArgs.push_back("-fno-assume-sane-operator-new");
2510984eb8611d9ee46fc6351dee43609f2deed99f3cDaniel Dunbar
2511f35f14d474632142280ec1526d16e87706ce6625Daniel Dunbar  // -fconstant-cfstrings is default, and may be subject to argument translation
2512f35f14d474632142280ec1526d16e87706ce6625Daniel Dunbar  // on Darwin.
2513f35f14d474632142280ec1526d16e87706ce6625Daniel Dunbar  if (!Args.hasFlag(options::OPT_fconstant_cfstrings,
2514f35f14d474632142280ec1526d16e87706ce6625Daniel Dunbar                    options::OPT_fno_constant_cfstrings) ||
2515f35f14d474632142280ec1526d16e87706ce6625Daniel Dunbar      !Args.hasFlag(options::OPT_mconstant_cfstrings,
2516f35f14d474632142280ec1526d16e87706ce6625Daniel Dunbar                    options::OPT_mno_constant_cfstrings))
2517f35f14d474632142280ec1526d16e87706ce6625Daniel Dunbar    CmdArgs.push_back("-fno-constant-cfstrings");
2518f35f14d474632142280ec1526d16e87706ce6625Daniel Dunbar
2519a6fda124bf380479529d6a80b84b62cacd3cb707John Thompson  // -fshort-wchar default varies depending on platform; only
2520a6fda124bf380479529d6a80b84b62cacd3cb707John Thompson  // pass if specified.
25211744a3504af13343f4bc0e566f6d7349fc6e3f04Daniel Dunbar  if (Arg *A = Args.getLastArg(options::OPT_fshort_wchar))
25221744a3504af13343f4bc0e566f6d7349fc6e3f04Daniel Dunbar    A->render(Args, CmdArgs);
2523a6fda124bf380479529d6a80b84b62cacd3cb707John Thompson
2524ee848a73e5f8ffe7511af8652ba811c020d1c7a0Daniel Dunbar  // -fno-pascal-strings is default, only pass non-default. If the tool chain
2525ee848a73e5f8ffe7511af8652ba811c020d1c7a0Daniel Dunbar  // happened to translate to -mpascal-strings, we want to back translate here.
252682d00688525c876bf47bce414dedae9c343e67f5Daniel Dunbar  //
252782d00688525c876bf47bce414dedae9c343e67f5Daniel Dunbar  // FIXME: This is gross; that translation should be pulled from the
252882d00688525c876bf47bce414dedae9c343e67f5Daniel Dunbar  // tool chain.
2529c21c485b4fb58ef5d55cf3e523263dd824a2ace4Daniel Dunbar  if (Args.hasFlag(options::OPT_fpascal_strings,
253082d00688525c876bf47bce414dedae9c343e67f5Daniel Dunbar                   options::OPT_fno_pascal_strings,
253182d00688525c876bf47bce414dedae9c343e67f5Daniel Dunbar                   false) ||
253282d00688525c876bf47bce414dedae9c343e67f5Daniel Dunbar      Args.hasFlag(options::OPT_mpascal_strings,
253382d00688525c876bf47bce414dedae9c343e67f5Daniel Dunbar                   options::OPT_mno_pascal_strings,
253482d00688525c876bf47bce414dedae9c343e67f5Daniel Dunbar                   false))
253548d1ef782c8c88066b5febf60f8f456064d7d3f0Daniel Dunbar    CmdArgs.push_back("-fpascal-strings");
2536125b4cb35536e45201f8f2cb19ee620e3ad67c49NAKAMURA Takumi
253788934e85f81abdc4fb5202325252be3bcab5ebf0Daniel Dunbar  // Honor -fpack-struct= and -fpack-struct, if given. Note that
253888934e85f81abdc4fb5202325252be3bcab5ebf0Daniel Dunbar  // -fno-pack-struct doesn't apply to -fpack-struct=.
253988934e85f81abdc4fb5202325252be3bcab5ebf0Daniel Dunbar  if (Arg *A = Args.getLastArg(options::OPT_fpack_struct_EQ)) {
25408049c44d972fc7266b4369e8960875c118c067e0James Molloy    std::string PackStructStr = "-fpack-struct=";
25418049c44d972fc7266b4369e8960875c118c067e0James Molloy    PackStructStr += A->getValue(Args);
25428049c44d972fc7266b4369e8960875c118c067e0James Molloy    CmdArgs.push_back(Args.MakeArgString(PackStructStr));
254388934e85f81abdc4fb5202325252be3bcab5ebf0Daniel Dunbar  } else if (Args.hasFlag(options::OPT_fpack_struct,
254488934e85f81abdc4fb5202325252be3bcab5ebf0Daniel Dunbar                          options::OPT_fno_pack_struct, false)) {
25458049c44d972fc7266b4369e8960875c118c067e0James Molloy    CmdArgs.push_back("-fpack-struct=1");
254688934e85f81abdc4fb5202325252be3bcab5ebf0Daniel Dunbar  }
254788934e85f81abdc4fb5202325252be3bcab5ebf0Daniel Dunbar
2548b466d01e464b21832c23eeed90112bc5c26c0236Fariborz Jahanian  if (Args.hasArg(options::OPT_mkernel) ||
2549b466d01e464b21832c23eeed90112bc5c26c0236Fariborz Jahanian      Args.hasArg(options::OPT_fapple_kext)) {
2550b466d01e464b21832c23eeed90112bc5c26c0236Fariborz Jahanian    if (!Args.hasArg(options::OPT_fcommon))
2551b466d01e464b21832c23eeed90112bc5c26c0236Fariborz Jahanian      CmdArgs.push_back("-fno-common");
2552ec09b3e0c5d96a1b7a3e797cdff2875eca1e9907Chad Rosier    Args.ClaimAllArgs(options::OPT_fno_common);
2553b466d01e464b21832c23eeed90112bc5c26c0236Fariborz Jahanian  }
255488934e85f81abdc4fb5202325252be3bcab5ebf0Daniel Dunbar
255548d1ef782c8c88066b5febf60f8f456064d7d3f0Daniel Dunbar  // -fcommon is default, only pass non-default.
2556b466d01e464b21832c23eeed90112bc5c26c0236Fariborz Jahanian  else if (!Args.hasFlag(options::OPT_fcommon, options::OPT_fno_common))
255748d1ef782c8c88066b5febf60f8f456064d7d3f0Daniel Dunbar    CmdArgs.push_back("-fno-common");
255848d1ef782c8c88066b5febf60f8f456064d7d3f0Daniel Dunbar
255970d3c92820f590b10553da9c96eda24e4325ba34Daniel Dunbar  // -fsigned-bitfields is default, and clang doesn't yet support
256006205ca78ca2fd4384b237f120ec66614df0d9fcDaniel Dunbar  // -funsigned-bitfields.
25611eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump  if (!Args.hasFlag(options::OPT_fsigned_bitfields,
256270d3c92820f590b10553da9c96eda24e4325ba34Daniel Dunbar                    options::OPT_funsigned_bitfields))
25635f9e272e632e951b1efe824cd16acb4d96077930Chris Lattner    D.Diag(diag::warn_drv_clang_unsupported)
256470d3c92820f590b10553da9c96eda24e4325ba34Daniel Dunbar      << Args.getLastArg(options::OPT_funsigned_bitfields)->getAsString(Args);
256570d3c92820f590b10553da9c96eda24e4325ba34Daniel Dunbar
256606205ca78ca2fd4384b237f120ec66614df0d9fcDaniel Dunbar  // -fsigned-bitfields is default, and clang doesn't support -fno-for-scope.
256706205ca78ca2fd4384b237f120ec66614df0d9fcDaniel Dunbar  if (!Args.hasFlag(options::OPT_ffor_scope,
256806205ca78ca2fd4384b237f120ec66614df0d9fcDaniel Dunbar                    options::OPT_fno_for_scope))
25695f9e272e632e951b1efe824cd16acb4d96077930Chris Lattner    D.Diag(diag::err_drv_clang_unsupported)
257006205ca78ca2fd4384b237f120ec66614df0d9fcDaniel Dunbar      << Args.getLastArg(options::OPT_fno_for_scope)->getAsString(Args);
257106205ca78ca2fd4384b237f120ec66614df0d9fcDaniel Dunbar
25720ea22fdfda0558393950cef5db50d050e3eb1e60Jeffrey Yasskin  // -fcaret-diagnostics is default.
25730ea22fdfda0558393950cef5db50d050e3eb1e60Jeffrey Yasskin  if (!Args.hasFlag(options::OPT_fcaret_diagnostics,
25740ea22fdfda0558393950cef5db50d050e3eb1e60Jeffrey Yasskin                    options::OPT_fno_caret_diagnostics, true))
25750ea22fdfda0558393950cef5db50d050e3eb1e60Jeffrey Yasskin    CmdArgs.push_back("-fno-caret-diagnostics");
25760ea22fdfda0558393950cef5db50d050e3eb1e60Jeffrey Yasskin
257749138fc59eeac2aacd3b7e04c2642180d5baefd7Daniel Dunbar  // -fdiagnostics-fixit-info is default, only pass non-default.
25781eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump  if (!Args.hasFlag(options::OPT_fdiagnostics_fixit_info,
257949138fc59eeac2aacd3b7e04c2642180d5baefd7Daniel Dunbar                    options::OPT_fno_diagnostics_fixit_info))
258049138fc59eeac2aacd3b7e04c2642180d5baefd7Daniel Dunbar    CmdArgs.push_back("-fno-diagnostics-fixit-info");
258188b7cf00fcb582728c642da3927c59468efaf926Eric Christopher
25829e820ee054fefe5422b4db3f681e567a8976747eDaniel Dunbar  // Enable -fdiagnostics-show-option by default.
25831eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump  if (Args.hasFlag(options::OPT_fdiagnostics_show_option,
25849e820ee054fefe5422b4db3f681e567a8976747eDaniel Dunbar                   options::OPT_fno_diagnostics_show_option))
25859e820ee054fefe5422b4db3f681e567a8976747eDaniel Dunbar    CmdArgs.push_back("-fdiagnostics-show-option");
2586838be483dcf10ea3f2acd85f2cd65adc310011f9Daniel Dunbar
25876fbe8398ba1680ffc5daa7395850ff8765b7905bChris Lattner  if (const Arg *A =
25886fbe8398ba1680ffc5daa7395850ff8765b7905bChris Lattner        Args.getLastArg(options::OPT_fdiagnostics_show_category_EQ)) {
25896fbe8398ba1680ffc5daa7395850ff8765b7905bChris Lattner    CmdArgs.push_back("-fdiagnostics-show-category");
25906fbe8398ba1680ffc5daa7395850ff8765b7905bChris Lattner    CmdArgs.push_back(A->getValue(Args));
25916fbe8398ba1680ffc5daa7395850ff8765b7905bChris Lattner  }
2592ca0e0545c216afaacba6da6c82a270dc2efc4e3fDaniel Dunbar
2593c9471b0ff1815ed0149dbfcad0f385ed8648eeb0Douglas Gregor  if (const Arg *A =
2594c9471b0ff1815ed0149dbfcad0f385ed8648eeb0Douglas Gregor        Args.getLastArg(options::OPT_fdiagnostics_format_EQ)) {
2595c9471b0ff1815ed0149dbfcad0f385ed8648eeb0Douglas Gregor    CmdArgs.push_back("-fdiagnostics-format");
2596c9471b0ff1815ed0149dbfcad0f385ed8648eeb0Douglas Gregor    CmdArgs.push_back(A->getValue(Args));
2597c9471b0ff1815ed0149dbfcad0f385ed8648eeb0Douglas Gregor  }
2598c9471b0ff1815ed0149dbfcad0f385ed8648eeb0Douglas Gregor
2599abaca7a8be8e79cc01354676e3bcb26575640311Chandler Carruth  if (Arg *A = Args.getLastArg(
2600abaca7a8be8e79cc01354676e3bcb26575640311Chandler Carruth      options::OPT_fdiagnostics_show_note_include_stack,
2601abaca7a8be8e79cc01354676e3bcb26575640311Chandler Carruth      options::OPT_fno_diagnostics_show_note_include_stack)) {
2602abaca7a8be8e79cc01354676e3bcb26575640311Chandler Carruth    if (A->getOption().matches(
2603abaca7a8be8e79cc01354676e3bcb26575640311Chandler Carruth        options::OPT_fdiagnostics_show_note_include_stack))
2604abaca7a8be8e79cc01354676e3bcb26575640311Chandler Carruth      CmdArgs.push_back("-fdiagnostics-show-note-include-stack");
2605abaca7a8be8e79cc01354676e3bcb26575640311Chandler Carruth    else
2606abaca7a8be8e79cc01354676e3bcb26575640311Chandler Carruth      CmdArgs.push_back("-fno-diagnostics-show-note-include-stack");
2607abaca7a8be8e79cc01354676e3bcb26575640311Chandler Carruth  }
2608abaca7a8be8e79cc01354676e3bcb26575640311Chandler Carruth
2609838be483dcf10ea3f2acd85f2cd65adc310011f9Daniel Dunbar  // Color diagnostics are the default, unless the terminal doesn't support
2610838be483dcf10ea3f2acd85f2cd65adc310011f9Daniel Dunbar  // them.
2611838be483dcf10ea3f2acd85f2cd65adc310011f9Daniel Dunbar  if (Args.hasFlag(options::OPT_fcolor_diagnostics,
2612f765d76407d82e629337bba4ca6c26bdfc8bc9a6Argyrios Kyrtzidis                   options::OPT_fno_color_diagnostics,
2613f765d76407d82e629337bba4ca6c26bdfc8bc9a6Argyrios Kyrtzidis                   llvm::sys::Process::StandardErrHasColors()))
2614838be483dcf10ea3f2acd85f2cd65adc310011f9Daniel Dunbar    CmdArgs.push_back("-fcolor-diagnostics");
2615838be483dcf10ea3f2acd85f2cd65adc310011f9Daniel Dunbar
261675eb1d64784946a37fc0b27596e2d92b6cf7033bDaniel Dunbar  if (!Args.hasFlag(options::OPT_fshow_source_location,
261775eb1d64784946a37fc0b27596e2d92b6cf7033bDaniel Dunbar                    options::OPT_fno_show_source_location))
261875eb1d64784946a37fc0b27596e2d92b6cf7033bDaniel Dunbar    CmdArgs.push_back("-fno-show-source-location");
26199e820ee054fefe5422b4db3f681e567a8976747eDaniel Dunbar
2620c9471b0ff1815ed0149dbfcad0f385ed8648eeb0Douglas Gregor  if (!Args.hasFlag(options::OPT_fshow_column,
2621c9471b0ff1815ed0149dbfcad0f385ed8648eeb0Douglas Gregor                    options::OPT_fno_show_column,
2622c9471b0ff1815ed0149dbfcad0f385ed8648eeb0Douglas Gregor                    true))
2623c9471b0ff1815ed0149dbfcad0f385ed8648eeb0Douglas Gregor    CmdArgs.push_back("-fno-show-column");
2624c9471b0ff1815ed0149dbfcad0f385ed8648eeb0Douglas Gregor
2625a0068fc64351db9c47916566e3b85ab733cd8d6dDouglas Gregor  if (!Args.hasFlag(options::OPT_fspell_checking,
2626a0068fc64351db9c47916566e3b85ab733cd8d6dDouglas Gregor                    options::OPT_fno_spell_checking))
2627a0068fc64351db9c47916566e3b85ab733cd8d6dDouglas Gregor    CmdArgs.push_back("-fno-spell-checking");
2628ca0e0545c216afaacba6da6c82a270dc2efc4e3fDaniel Dunbar
262925b26ebdebe46bb4576247e0c64d1c11410a8e9dDaniel Dunbar
2630168943947a42d6819dce56b420dc5aef4d0831ceDaniel Dunbar  // Silently ignore -fasm-blocks for now.
2631168943947a42d6819dce56b420dc5aef4d0831ceDaniel Dunbar  (void) Args.hasFlag(options::OPT_fasm_blocks, options::OPT_fno_asm_blocks,
2632168943947a42d6819dce56b420dc5aef4d0831ceDaniel Dunbar                      false);
263325b26ebdebe46bb4576247e0c64d1c11410a8e9dDaniel Dunbar
26345edbdcc62098e305cd55654814dcf783a3f3c477Jeffrey Yasskin  if (Arg *A = Args.getLastArg(options::OPT_fshow_overloads_EQ))
26355edbdcc62098e305cd55654814dcf783a3f3c477Jeffrey Yasskin    A->render(Args, CmdArgs);
26365edbdcc62098e305cd55654814dcf783a3f3c477Jeffrey Yasskin
26377695fba30221613b7cf31276456217c41bb90960Daniel Dunbar  // -fdollars-in-identifiers default varies depending on platform and
26387695fba30221613b7cf31276456217c41bb90960Daniel Dunbar  // language; only pass if specified.
26391eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump  if (Arg *A = Args.getLastArg(options::OPT_fdollars_in_identifiers,
26407695fba30221613b7cf31276456217c41bb90960Daniel Dunbar                               options::OPT_fno_dollars_in_identifiers)) {
26417695fba30221613b7cf31276456217c41bb90960Daniel Dunbar    if (A->getOption().matches(options::OPT_fdollars_in_identifiers))
26428663b180085e9bc7a0a87c80cc3f722efef99e79Daniel Dunbar      CmdArgs.push_back("-fdollars-in-identifiers");
26437695fba30221613b7cf31276456217c41bb90960Daniel Dunbar    else
26448663b180085e9bc7a0a87c80cc3f722efef99e79Daniel Dunbar      CmdArgs.push_back("-fno-dollars-in-identifiers");
26457695fba30221613b7cf31276456217c41bb90960Daniel Dunbar  }
26467695fba30221613b7cf31276456217c41bb90960Daniel Dunbar
2647e027a4b2399e9b0acfe0f77220c66bbe369067eeDaniel Dunbar  // -funit-at-a-time is default, and we don't support -fno-unit-at-a-time for
2648e027a4b2399e9b0acfe0f77220c66bbe369067eeDaniel Dunbar  // practical purposes.
26491eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump  if (Arg *A = Args.getLastArg(options::OPT_funit_at_a_time,
2650e027a4b2399e9b0acfe0f77220c66bbe369067eeDaniel Dunbar                               options::OPT_fno_unit_at_a_time)) {
2651e027a4b2399e9b0acfe0f77220c66bbe369067eeDaniel Dunbar    if (A->getOption().matches(options::OPT_fno_unit_at_a_time))
26525f9e272e632e951b1efe824cd16acb4d96077930Chris Lattner      D.Diag(diag::warn_drv_clang_unsupported) << A->getAsString(Args);
2653e027a4b2399e9b0acfe0f77220c66bbe369067eeDaniel Dunbar  }
2654ceb5c5b7f67a30fae305d1d19b478b623e4fbcedEli Friedman
265519bda3ad8b5d37e505214e82fab1d0a0bf00f0fdEli Friedman  if (Args.hasFlag(options::OPT_fapple_pragma_pack,
265619bda3ad8b5d37e505214e82fab1d0a0bf00f0fdEli Friedman                   options::OPT_fno_apple_pragma_pack, false))
265719bda3ad8b5d37e505214e82fab1d0a0bf00f0fdEli Friedman    CmdArgs.push_back("-fapple-pragma-pack");
265819bda3ad8b5d37e505214e82fab1d0a0bf00f0fdEli Friedman
26592ba91575905a54f712a7f64304e56002e4882499Daniel Dunbar  // Default to -fno-builtin-str{cat,cpy} on Darwin for ARM.
2660f84a4a469d8a45c76cb941595582a0fd3b9b15d3Daniel Dunbar  //
26618ff5b28d6efcffe2251e77634c7edf83a4763344Daniel Dunbar  // FIXME: This is disabled until clang -cc1 supports -fno-builtin-foo. PR4941.
2662f84a4a469d8a45c76cb941595582a0fd3b9b15d3Daniel Dunbar#if 0
2663905c45f15a25598620d19160c139c6b785aeea89Bob Wilson  if (getToolChain().getTriple().isOSDarwin() &&
26642ba91575905a54f712a7f64304e56002e4882499Daniel Dunbar      (getToolChain().getTriple().getArch() == llvm::Triple::arm ||
26652ba91575905a54f712a7f64304e56002e4882499Daniel Dunbar       getToolChain().getTriple().getArch() == llvm::Triple::thumb)) {
26662ba91575905a54f712a7f64304e56002e4882499Daniel Dunbar    if (!Args.hasArg(options::OPT_fbuiltin_strcat))
26672ba91575905a54f712a7f64304e56002e4882499Daniel Dunbar      CmdArgs.push_back("-fno-builtin-strcat");
26682ba91575905a54f712a7f64304e56002e4882499Daniel Dunbar    if (!Args.hasArg(options::OPT_fbuiltin_strcpy))
26692ba91575905a54f712a7f64304e56002e4882499Daniel Dunbar      CmdArgs.push_back("-fno-builtin-strcpy");
26702ba91575905a54f712a7f64304e56002e4882499Daniel Dunbar  }
2671f84a4a469d8a45c76cb941595582a0fd3b9b15d3Daniel Dunbar#endif
26722ba91575905a54f712a7f64304e56002e4882499Daniel Dunbar
2673d98750f065fd8d6278df72f6218e3d59b2df2aa9Daniel Dunbar  // Only allow -traditional or -traditional-cpp outside in preprocessing modes.
26741eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump  if (Arg *A = Args.getLastArg(options::OPT_traditional,
2675d98750f065fd8d6278df72f6218e3d59b2df2aa9Daniel Dunbar                               options::OPT_traditional_cpp)) {
2676d98750f065fd8d6278df72f6218e3d59b2df2aa9Daniel Dunbar    if (isa<PreprocessJobAction>(JA))
2677d98750f065fd8d6278df72f6218e3d59b2df2aa9Daniel Dunbar      CmdArgs.push_back("-traditional-cpp");
267888b7cf00fcb582728c642da3927c59468efaf926Eric Christopher    else
26795f9e272e632e951b1efe824cd16acb4d96077930Chris Lattner      D.Diag(diag::err_drv_clang_unsupported) << A->getAsString(Args);
2680d98750f065fd8d6278df72f6218e3d59b2df2aa9Daniel Dunbar  }
2681ceb5c5b7f67a30fae305d1d19b478b623e4fbcedEli Friedman
26821d46033f760ba5fd266ce59fe391fac473f04f52Daniel Dunbar  Args.AddLastArg(CmdArgs, options::OPT_dM);
2683d82df3ad430397d7f9ef511e7c5157f997c41f53Chris Lattner  Args.AddLastArg(CmdArgs, options::OPT_dD);
268436f6e30d5c21a693abf2612ef086e83e9696f0e0Ted Kremenek
268536f6e30d5c21a693abf2612ef086e83e9696f0e0Ted Kremenek  // Handle serialized diagnostics.
268636f6e30d5c21a693abf2612ef086e83e9696f0e0Ted Kremenek  if (Arg *A = Args.getLastArg(options::OPT__serialize_diags)) {
268736f6e30d5c21a693abf2612ef086e83e9696f0e0Ted Kremenek    CmdArgs.push_back("-serialize-diagnostic-file");
268836f6e30d5c21a693abf2612ef086e83e9696f0e0Ted Kremenek    CmdArgs.push_back(Args.MakeArgString(A->getValue(Args)));
268936f6e30d5c21a693abf2612ef086e83e9696f0e0Ted Kremenek  }
26901d46033f760ba5fd266ce59fe391fac473f04f52Daniel Dunbar
26913f87fb08dd502309960646db01099fb4c1be9a7cDaniel Dunbar  // Forward -Xclang arguments to -cc1, and -mllvm arguments to the LLVM option
26923f87fb08dd502309960646db01099fb4c1be9a7cDaniel Dunbar  // parser.
26931d46033f760ba5fd266ce59fe391fac473f04f52Daniel Dunbar  Args.AddAllArgValues(CmdArgs, options::OPT_Xclang);
26943f87fb08dd502309960646db01099fb4c1be9a7cDaniel Dunbar  for (arg_iterator it = Args.filtered_begin(options::OPT_mllvm),
26953f87fb08dd502309960646db01099fb4c1be9a7cDaniel Dunbar         ie = Args.filtered_end(); it != ie; ++it) {
26967e4953e5c60409007545288f14b430bd23d68570Daniel Dunbar    (*it)->claim();
2697fb36d21960a3bd422665a961eac6ca269cd6445bDaniel Dunbar
26983f87fb08dd502309960646db01099fb4c1be9a7cDaniel Dunbar    // We translate this by hand to the -cc1 argument, since nightly test uses
26993f87fb08dd502309960646db01099fb4c1be9a7cDaniel Dunbar    // it and developers have been trained to spell it with -mllvm.
27005f9e272e632e951b1efe824cd16acb4d96077930Chris Lattner    if (StringRef((*it)->getValue(Args, 0)) == "-disable-llvm-optzns")
27013f87fb08dd502309960646db01099fb4c1be9a7cDaniel Dunbar      CmdArgs.push_back("-disable-llvm-optzns");
27023f87fb08dd502309960646db01099fb4c1be9a7cDaniel Dunbar    else
27037e4953e5c60409007545288f14b430bd23d68570Daniel Dunbar      (*it)->render(Args, CmdArgs);
27043f87fb08dd502309960646db01099fb4c1be9a7cDaniel Dunbar  }
27051d46033f760ba5fd266ce59fe391fac473f04f52Daniel Dunbar
2706cd8e4c44dd068956e9181381be3ee2d49a0fac52Daniel Dunbar  if (Output.getType() == types::TY_Dependencies) {
2707cd8e4c44dd068956e9181381be3ee2d49a0fac52Daniel Dunbar    // Handled with other dependency code.
2708115a79277edababaf1b26e3654044ae983197679Daniel Dunbar  } else if (Output.isFilename()) {
2709b488c1dac8e53206f07103d794a62a3f5012c0f4Daniel Dunbar    CmdArgs.push_back("-o");
2710115a79277edababaf1b26e3654044ae983197679Daniel Dunbar    CmdArgs.push_back(Output.getFilename());
2711115a79277edababaf1b26e3654044ae983197679Daniel Dunbar  } else {
2712115a79277edababaf1b26e3654044ae983197679Daniel Dunbar    assert(Output.isNothing() && "Invalid output.");
2713b488c1dac8e53206f07103d794a62a3f5012c0f4Daniel Dunbar  }
2714b488c1dac8e53206f07103d794a62a3f5012c0f4Daniel Dunbar
27151d46033f760ba5fd266ce59fe391fac473f04f52Daniel Dunbar  for (InputInfoList::const_iterator
27161d46033f760ba5fd266ce59fe391fac473f04f52Daniel Dunbar         it = Inputs.begin(), ie = Inputs.end(); it != ie; ++it) {
27171d46033f760ba5fd266ce59fe391fac473f04f52Daniel Dunbar    const InputInfo &II = *it;
27181d46033f760ba5fd266ce59fe391fac473f04f52Daniel Dunbar    CmdArgs.push_back("-x");
27191d46033f760ba5fd266ce59fe391fac473f04f52Daniel Dunbar    CmdArgs.push_back(types::getTypeName(II.getType()));
27207c1e46533cae07216e2a67d5636a5afb44253155Daniel Dunbar    if (II.isFilename())
2721115a79277edababaf1b26e3654044ae983197679Daniel Dunbar      CmdArgs.push_back(II.getFilename());
27221d46033f760ba5fd266ce59fe391fac473f04f52Daniel Dunbar    else
2723115a79277edababaf1b26e3654044ae983197679Daniel Dunbar      II.getInputArg().renderAsInput(Args, CmdArgs);
27241d46033f760ba5fd266ce59fe391fac473f04f52Daniel Dunbar  }
2725c21c485b4fb58ef5d55cf3e523263dd824a2ace4Daniel Dunbar
2726e6113de52df132b89c3a5a6141f17d37e83322aeChris Lattner  Args.AddAllArgs(CmdArgs, options::OPT_undef);
2727e6113de52df132b89c3a5a6141f17d37e83322aeChris Lattner
2728a001c1ce5fcb669624a5b8e50d0a629d673da901Daniel Dunbar  const char *Exec = getToolChain().getDriver().getClangProgramPath();
2729f2d8b9f967a1ab53ee9fdbcc3ac0a4ee0a83a26eDaniel Dunbar
2730f2d8b9f967a1ab53ee9fdbcc3ac0a4ee0a83a26eDaniel Dunbar  // Optionally embed the -cc1 level arguments into the debug info, for build
2731f2d8b9f967a1ab53ee9fdbcc3ac0a4ee0a83a26eDaniel Dunbar  // analysis.
2732f2d8b9f967a1ab53ee9fdbcc3ac0a4ee0a83a26eDaniel Dunbar  if (getToolChain().UseDwarfDebugFlags()) {
27336e90047520c8b4d6daa110bdbdaf15041016bd7cDaniel Dunbar    ArgStringList OriginalArgs;
27346e90047520c8b4d6daa110bdbdaf15041016bd7cDaniel Dunbar    for (ArgList::const_iterator it = Args.begin(),
27356e90047520c8b4d6daa110bdbdaf15041016bd7cDaniel Dunbar           ie = Args.end(); it != ie; ++it)
27366e90047520c8b4d6daa110bdbdaf15041016bd7cDaniel Dunbar      (*it)->render(Args, OriginalArgs);
2737ca0e0545c216afaacba6da6c82a270dc2efc4e3fDaniel Dunbar
2738f7ccbad5d9949e7ddd1cbef43d482553b811e026Dylan Noblesmith    SmallString<256> Flags;
2739f2d8b9f967a1ab53ee9fdbcc3ac0a4ee0a83a26eDaniel Dunbar    Flags += Exec;
27406e90047520c8b4d6daa110bdbdaf15041016bd7cDaniel Dunbar    for (unsigned i = 0, e = OriginalArgs.size(); i != e; ++i) {
2741f2d8b9f967a1ab53ee9fdbcc3ac0a4ee0a83a26eDaniel Dunbar      Flags += " ";
27426e90047520c8b4d6daa110bdbdaf15041016bd7cDaniel Dunbar      Flags += OriginalArgs[i];
2743f2d8b9f967a1ab53ee9fdbcc3ac0a4ee0a83a26eDaniel Dunbar    }
2744f2d8b9f967a1ab53ee9fdbcc3ac0a4ee0a83a26eDaniel Dunbar    CmdArgs.push_back("-dwarf-debug-flags");
2745f2d8b9f967a1ab53ee9fdbcc3ac0a4ee0a83a26eDaniel Dunbar    CmdArgs.push_back(Args.MakeArgString(Flags.str()));
2746f2d8b9f967a1ab53ee9fdbcc3ac0a4ee0a83a26eDaniel Dunbar  }
2747f2d8b9f967a1ab53ee9fdbcc3ac0a4ee0a83a26eDaniel Dunbar
27482fe238ed293bd4bc27af9beb9fa151fad2146fa8Daniel Dunbar  C.addCommand(new Command(JA, *this, Exec, CmdArgs));
2749a880db0b0fc028abf754c290d921d809eec0518aDaniel Dunbar
2750be4c8705e499b55548467eb7adaa23cbc6edfef9Roman Divacky  if (Arg *A = Args.getLastArg(options::OPT_pg))
2751be4c8705e499b55548467eb7adaa23cbc6edfef9Roman Divacky    if (Args.hasArg(options::OPT_fomit_frame_pointer))
27525f9e272e632e951b1efe824cd16acb4d96077930Chris Lattner      D.Diag(diag::err_drv_argument_not_allowed_with)
2753be4c8705e499b55548467eb7adaa23cbc6edfef9Roman Divacky        << "-fomit-frame-pointer" << A->getAsString(Args);
275420249a1af2e462dcafdd6a350f1c7967b264ff25Michael J. Spencer
275568fb469aeb19144403e703b825854d08353c8eeaDaniel Dunbar  // Claim some arguments which clang supports automatically.
275668fb469aeb19144403e703b825854d08353c8eeaDaniel Dunbar
2757f4046866e20fe3279b0daa2f48d9e83263dfdbfeDaniel Dunbar  // -fpch-preprocess is used with gcc to add a special marker in the output to
2758f4046866e20fe3279b0daa2f48d9e83263dfdbfeDaniel Dunbar  // include the PCH file. Clang's PTH solution is completely transparent, so we
2759f4046866e20fe3279b0daa2f48d9e83263dfdbfeDaniel Dunbar  // do not need to deal with it at all.
276068fb469aeb19144403e703b825854d08353c8eeaDaniel Dunbar  Args.ClaimAllArgs(options::OPT_fpch_preprocess);
2761c21c485b4fb58ef5d55cf3e523263dd824a2ace4Daniel Dunbar
2762a880db0b0fc028abf754c290d921d809eec0518aDaniel Dunbar  // Claim some arguments which clang doesn't support, but we don't
2763a880db0b0fc028abf754c290d921d809eec0518aDaniel Dunbar  // care to warn the user about.
2764cdd9686b890ebdc10039ae256ef4c9dfb5ebacb7Daniel Dunbar  Args.ClaimAllArgs(options::OPT_clang_ignored_f_Group);
2765cdd9686b890ebdc10039ae256ef4c9dfb5ebacb7Daniel Dunbar  Args.ClaimAllArgs(options::OPT_clang_ignored_m_Group);
2766035ff0c6746a2689667c83d4c02a47d5a7b71e82Rafael Espindola
27679c094fbcfaba49fc1aeca119c0e12bec59779692Rafael Espindola  // Disable warnings for clang -E -use-gold-plugin -emit-llvm foo.c
2768035ff0c6746a2689667c83d4c02a47d5a7b71e82Rafael Espindola  Args.ClaimAllArgs(options::OPT_use_gold_plugin);
27699c094fbcfaba49fc1aeca119c0e12bec59779692Rafael Espindola  Args.ClaimAllArgs(options::OPT_emit_llvm);
277047ac7d27c44bd64a7d0fc03d4babc196cf2b8230Daniel Dunbar}
277147ac7d27c44bd64a7d0fc03d4babc196cf2b8230Daniel Dunbar
2772fc30829694e62040c14f329f5491724fe7476241Jim Grosbachvoid ClangAs::AddARMTargetArgs(const ArgList &Args,
2773fc30829694e62040c14f329f5491724fe7476241Jim Grosbach                               ArgStringList &CmdArgs) const {
2774fc30829694e62040c14f329f5491724fe7476241Jim Grosbach  const Driver &D = getToolChain().getDriver();
2775fc30829694e62040c14f329f5491724fe7476241Jim Grosbach  llvm::Triple Triple = getToolChain().getTriple();
2776fc30829694e62040c14f329f5491724fe7476241Jim Grosbach
2777fc30829694e62040c14f329f5491724fe7476241Jim Grosbach  // Set the CPU based on -march= and -mcpu=.
2778fc30829694e62040c14f329f5491724fe7476241Jim Grosbach  CmdArgs.push_back("-target-cpu");
2779fc30829694e62040c14f329f5491724fe7476241Jim Grosbach  CmdArgs.push_back(getARMTargetCPU(Args, Triple));
2780fc30829694e62040c14f329f5491724fe7476241Jim Grosbach
2781fc30829694e62040c14f329f5491724fe7476241Jim Grosbach  // Honor -mfpu=.
2782993172757762436d22b2dfc74e7cca1bade1a7bfChad Rosier  if (const Arg *A = Args.getLastArg(options::OPT_mfpu_EQ))
2783f80f2a5098218211704bc4e66a8c2f46a8fa1d25Chad Rosier    addFPUArgs(D, A, Args, CmdArgs);
27847a938fa66be42710b034a79106de337a275fd265Chad Rosier
27857a938fa66be42710b034a79106de337a275fd265Chad Rosier  // Honor -mfpmath=.
27867a938fa66be42710b034a79106de337a275fd265Chad Rosier  if (const Arg *A = Args.getLastArg(options::OPT_mfpmath_EQ))
278730fe6baf95662ea82a794a8fe3b76998713c183dChad Rosier    addFPMathArgs(D, A, Args, CmdArgs, getARMTargetCPU(Args, Triple));
2788fc30829694e62040c14f329f5491724fe7476241Jim Grosbach}
2789fc30829694e62040c14f329f5491724fe7476241Jim Grosbach
279020a9aa50f9a7d4b03f97bc67e96da1d605c309a2Daniel Dunbarvoid ClangAs::ConstructJob(Compilation &C, const JobAction &JA,
279120a9aa50f9a7d4b03f97bc67e96da1d605c309a2Daniel Dunbar                           const InputInfo &Output,
279220a9aa50f9a7d4b03f97bc67e96da1d605c309a2Daniel Dunbar                           const InputInfoList &Inputs,
279320a9aa50f9a7d4b03f97bc67e96da1d605c309a2Daniel Dunbar                           const ArgList &Args,
279420a9aa50f9a7d4b03f97bc67e96da1d605c309a2Daniel Dunbar                           const char *LinkingOutput) const {
279520a9aa50f9a7d4b03f97bc67e96da1d605c309a2Daniel Dunbar  ArgStringList CmdArgs;
279620a9aa50f9a7d4b03f97bc67e96da1d605c309a2Daniel Dunbar
279720a9aa50f9a7d4b03f97bc67e96da1d605c309a2Daniel Dunbar  assert(Inputs.size() == 1 && "Unexpected number of inputs.");
279820a9aa50f9a7d4b03f97bc67e96da1d605c309a2Daniel Dunbar  const InputInfo &Input = Inputs[0];
279920a9aa50f9a7d4b03f97bc67e96da1d605c309a2Daniel Dunbar
2800dbe80d9933e1fb0c26bd339e1f1f2f2d76dcac0aRafael Espindola  // Don't warn about "clang -w -c foo.s"
2801dbe80d9933e1fb0c26bd339e1f1f2f2d76dcac0aRafael Espindola  Args.ClaimAllArgs(options::OPT_w);
28029c094fbcfaba49fc1aeca119c0e12bec59779692Rafael Espindola  // and "clang -emit-llvm -c foo.s"
28039c094fbcfaba49fc1aeca119c0e12bec59779692Rafael Espindola  Args.ClaimAllArgs(options::OPT_emit_llvm);
28049c094fbcfaba49fc1aeca119c0e12bec59779692Rafael Espindola  // and "clang -use-gold-plugin -c foo.s"
28059c094fbcfaba49fc1aeca119c0e12bec59779692Rafael Espindola  Args.ClaimAllArgs(options::OPT_use_gold_plugin);
2806dbe80d9933e1fb0c26bd339e1f1f2f2d76dcac0aRafael Espindola
280720a9aa50f9a7d4b03f97bc67e96da1d605c309a2Daniel Dunbar  // Invoke ourselves in -cc1as mode.
280820a9aa50f9a7d4b03f97bc67e96da1d605c309a2Daniel Dunbar  //
280920a9aa50f9a7d4b03f97bc67e96da1d605c309a2Daniel Dunbar  // FIXME: Implement custom jobs for internal actions.
281020a9aa50f9a7d4b03f97bc67e96da1d605c309a2Daniel Dunbar  CmdArgs.push_back("-cc1as");
281120a9aa50f9a7d4b03f97bc67e96da1d605c309a2Daniel Dunbar
281220a9aa50f9a7d4b03f97bc67e96da1d605c309a2Daniel Dunbar  // Add the "effective" target triple.
281320a9aa50f9a7d4b03f97bc67e96da1d605c309a2Daniel Dunbar  CmdArgs.push_back("-triple");
281461ab80a8b35e6fe9363e8ef1b3d27209b0e89349Chad Rosier  std::string TripleStr =
281561ab80a8b35e6fe9363e8ef1b3d27209b0e89349Chad Rosier    getToolChain().ComputeEffectiveClangTriple(Args, Input.getType());
281620a9aa50f9a7d4b03f97bc67e96da1d605c309a2Daniel Dunbar  CmdArgs.push_back(Args.MakeArgString(TripleStr));
281720a9aa50f9a7d4b03f97bc67e96da1d605c309a2Daniel Dunbar
281820a9aa50f9a7d4b03f97bc67e96da1d605c309a2Daniel Dunbar  // Set the output mode, we currently only expect to be used as a real
281920a9aa50f9a7d4b03f97bc67e96da1d605c309a2Daniel Dunbar  // assembler.
282020a9aa50f9a7d4b03f97bc67e96da1d605c309a2Daniel Dunbar  CmdArgs.push_back("-filetype");
282120a9aa50f9a7d4b03f97bc67e96da1d605c309a2Daniel Dunbar  CmdArgs.push_back("obj");
282220a9aa50f9a7d4b03f97bc67e96da1d605c309a2Daniel Dunbar
2823359cf927cf4980099a04b3f3cf040b81d181fe3dJoerg Sonnenberger  if (UseRelaxAll(C, Args))
2824469d40ef5a95d0eaddfd541616ad4cd26668e856Daniel Dunbar    CmdArgs.push_back("-relax-all");
28259929800b8dfced61e9c97dc8d6e71e144ebf8accDaniel Dunbar
2826fc30829694e62040c14f329f5491724fe7476241Jim Grosbach  // Add target specific cpu and features flags.
2827fc30829694e62040c14f329f5491724fe7476241Jim Grosbach  switch(getToolChain().getTriple().getArch()) {
2828fc30829694e62040c14f329f5491724fe7476241Jim Grosbach  default:
2829fc30829694e62040c14f329f5491724fe7476241Jim Grosbach    break;
2830fc30829694e62040c14f329f5491724fe7476241Jim Grosbach
2831fc30829694e62040c14f329f5491724fe7476241Jim Grosbach  case llvm::Triple::arm:
2832fc30829694e62040c14f329f5491724fe7476241Jim Grosbach  case llvm::Triple::thumb:
2833fc30829694e62040c14f329f5491724fe7476241Jim Grosbach    AddARMTargetArgs(Args, CmdArgs);
2834fc30829694e62040c14f329f5491724fe7476241Jim Grosbach    break;
2835fc30829694e62040c14f329f5491724fe7476241Jim Grosbach  }
2836fc30829694e62040c14f329f5491724fe7476241Jim Grosbach
28377f6f8c8ab29db9221ed40ab7d5317df29848cc52Daniel Dunbar  // Ignore explicit -force_cpusubtype_ALL option.
28387f6f8c8ab29db9221ed40ab7d5317df29848cc52Daniel Dunbar  (void) Args.hasArg(options::OPT_force__cpusubtype__ALL);
283920a9aa50f9a7d4b03f97bc67e96da1d605c309a2Daniel Dunbar
28408f0a403945b60a8a8a56a7721bb66f6b84ec129bEric Christopher  // Determine the original source input.
28418f0a403945b60a8a8a56a7721bb66f6b84ec129bEric Christopher  const Action *SourceAction = &JA;
28428f0a403945b60a8a8a56a7721bb66f6b84ec129bEric Christopher  while (SourceAction->getKind() != Action::InputClass) {
28438f0a403945b60a8a8a56a7721bb66f6b84ec129bEric Christopher    assert(!SourceAction->getInputs().empty() && "unexpected root action!");
28448f0a403945b60a8a8a56a7721bb66f6b84ec129bEric Christopher    SourceAction = SourceAction->getInputs()[0];
28458f0a403945b60a8a8a56a7721bb66f6b84ec129bEric Christopher  }
28468f0a403945b60a8a8a56a7721bb66f6b84ec129bEric Christopher
28478f0a403945b60a8a8a56a7721bb66f6b84ec129bEric Christopher  // Forward -g, assuming we are dealing with an actual assembly file.
28488f0a403945b60a8a8a56a7721bb66f6b84ec129bEric Christopher  if (SourceAction->getType() == types::TY_Asm ||
28498f0a403945b60a8a8a56a7721bb66f6b84ec129bEric Christopher      SourceAction->getType() == types::TY_PP_Asm) {
28508f0a403945b60a8a8a56a7721bb66f6b84ec129bEric Christopher    Args.ClaimAllArgs(options::OPT_g_Group);
28518f0a403945b60a8a8a56a7721bb66f6b84ec129bEric Christopher    if (Arg *A = Args.getLastArg(options::OPT_g_Group))
28528f0a403945b60a8a8a56a7721bb66f6b84ec129bEric Christopher      if (!A->getOption().matches(options::OPT_g0))
28538f0a403945b60a8a8a56a7721bb66f6b84ec129bEric Christopher        CmdArgs.push_back("-g");
28548f0a403945b60a8a8a56a7721bb66f6b84ec129bEric Christopher  }
2855567003e572eed69cf1e8a04601076c8803355c7aKevin Enderby
2856567003e572eed69cf1e8a04601076c8803355c7aKevin Enderby  // Optionally embed the -cc1as level arguments into the debug info, for build
2857567003e572eed69cf1e8a04601076c8803355c7aKevin Enderby  // analysis.
2858567003e572eed69cf1e8a04601076c8803355c7aKevin Enderby  if (getToolChain().UseDwarfDebugFlags()) {
2859567003e572eed69cf1e8a04601076c8803355c7aKevin Enderby    ArgStringList OriginalArgs;
2860567003e572eed69cf1e8a04601076c8803355c7aKevin Enderby    for (ArgList::const_iterator it = Args.begin(),
2861567003e572eed69cf1e8a04601076c8803355c7aKevin Enderby           ie = Args.end(); it != ie; ++it)
2862567003e572eed69cf1e8a04601076c8803355c7aKevin Enderby      (*it)->render(Args, OriginalArgs);
2863567003e572eed69cf1e8a04601076c8803355c7aKevin Enderby
2864f7ccbad5d9949e7ddd1cbef43d482553b811e026Dylan Noblesmith    SmallString<256> Flags;
2865567003e572eed69cf1e8a04601076c8803355c7aKevin Enderby    const char *Exec = getToolChain().getDriver().getClangProgramPath();
2866567003e572eed69cf1e8a04601076c8803355c7aKevin Enderby    Flags += Exec;
2867567003e572eed69cf1e8a04601076c8803355c7aKevin Enderby    for (unsigned i = 0, e = OriginalArgs.size(); i != e; ++i) {
2868567003e572eed69cf1e8a04601076c8803355c7aKevin Enderby      Flags += " ";
2869567003e572eed69cf1e8a04601076c8803355c7aKevin Enderby      Flags += OriginalArgs[i];
2870567003e572eed69cf1e8a04601076c8803355c7aKevin Enderby    }
2871567003e572eed69cf1e8a04601076c8803355c7aKevin Enderby    CmdArgs.push_back("-dwarf-debug-flags");
2872567003e572eed69cf1e8a04601076c8803355c7aKevin Enderby    CmdArgs.push_back(Args.MakeArgString(Flags.str()));
2873567003e572eed69cf1e8a04601076c8803355c7aKevin Enderby  }
287420a9aa50f9a7d4b03f97bc67e96da1d605c309a2Daniel Dunbar
287520a9aa50f9a7d4b03f97bc67e96da1d605c309a2Daniel Dunbar  // FIXME: Add -static support, once we have it.
287620a9aa50f9a7d4b03f97bc67e96da1d605c309a2Daniel Dunbar
287720a9aa50f9a7d4b03f97bc67e96da1d605c309a2Daniel Dunbar  Args.AddAllArgValues(CmdArgs, options::OPT_Wa_COMMA,
287820a9aa50f9a7d4b03f97bc67e96da1d605c309a2Daniel Dunbar                       options::OPT_Xassembler);
28793df2325a0fd4b868b804aa1708beb3634402c22dDaniel Dunbar  Args.AddAllArgs(CmdArgs, options::OPT_mllvm);
288020a9aa50f9a7d4b03f97bc67e96da1d605c309a2Daniel Dunbar
288120a9aa50f9a7d4b03f97bc67e96da1d605c309a2Daniel Dunbar  assert(Output.isFilename() && "Unexpected lipo output.");
288220a9aa50f9a7d4b03f97bc67e96da1d605c309a2Daniel Dunbar  CmdArgs.push_back("-o");
288320a9aa50f9a7d4b03f97bc67e96da1d605c309a2Daniel Dunbar  CmdArgs.push_back(Output.getFilename());
288420a9aa50f9a7d4b03f97bc67e96da1d605c309a2Daniel Dunbar
28857c1e46533cae07216e2a67d5636a5afb44253155Daniel Dunbar  assert(Input.isFilename() && "Invalid input.");
28867c1e46533cae07216e2a67d5636a5afb44253155Daniel Dunbar  CmdArgs.push_back(Input.getFilename());
288720a9aa50f9a7d4b03f97bc67e96da1d605c309a2Daniel Dunbar
2888a001c1ce5fcb669624a5b8e50d0a629d673da901Daniel Dunbar  const char *Exec = getToolChain().getDriver().getClangProgramPath();
28892fe238ed293bd4bc27af9beb9fa151fad2146fa8Daniel Dunbar  C.addCommand(new Command(JA, *this, Exec, CmdArgs));
289020a9aa50f9a7d4b03f97bc67e96da1d605c309a2Daniel Dunbar}
289120a9aa50f9a7d4b03f97bc67e96da1d605c309a2Daniel Dunbar
2892b488c1dac8e53206f07103d794a62a3f5012c0f4Daniel Dunbarvoid gcc::Common::ConstructJob(Compilation &C, const JobAction &JA,
2893b488c1dac8e53206f07103d794a62a3f5012c0f4Daniel Dunbar                               const InputInfo &Output,
2894b488c1dac8e53206f07103d794a62a3f5012c0f4Daniel Dunbar                               const InputInfoList &Inputs,
28951d46033f760ba5fd266ce59fe391fac473f04f52Daniel Dunbar                               const ArgList &Args,
2896b488c1dac8e53206f07103d794a62a3f5012c0f4Daniel Dunbar                               const char *LinkingOutput) const {
2897ee788e70fcd0adf76103b17c78ac658d4ea30c9bDaniel Dunbar  const Driver &D = getToolChain().getDriver();
2898b488c1dac8e53206f07103d794a62a3f5012c0f4Daniel Dunbar  ArgStringList CmdArgs;
2899b488c1dac8e53206f07103d794a62a3f5012c0f4Daniel Dunbar
2900c21c485b4fb58ef5d55cf3e523263dd824a2ace4Daniel Dunbar  for (ArgList::const_iterator
29011d46033f760ba5fd266ce59fe391fac473f04f52Daniel Dunbar         it = Args.begin(), ie = Args.end(); it != ie; ++it) {
2902b488c1dac8e53206f07103d794a62a3f5012c0f4Daniel Dunbar    Arg *A = *it;
29037587719c40ebf02bf11e5e66c30bd20e98edebc2Daniel Dunbar    if (A->getOption().hasForwardToGCC()) {
29042dffe2d9d631fefd79d4999f6ffe7ac0d70882b1Daniel Dunbar      // Don't forward any -g arguments to assembly steps.
29052dffe2d9d631fefd79d4999f6ffe7ac0d70882b1Daniel Dunbar      if (isa<AssembleJobAction>(JA) &&
29062dffe2d9d631fefd79d4999f6ffe7ac0d70882b1Daniel Dunbar          A->getOption().matches(options::OPT_g_Group))
29072dffe2d9d631fefd79d4999f6ffe7ac0d70882b1Daniel Dunbar        continue;
29082dffe2d9d631fefd79d4999f6ffe7ac0d70882b1Daniel Dunbar
29097587719c40ebf02bf11e5e66c30bd20e98edebc2Daniel Dunbar      // It is unfortunate that we have to claim here, as this means
29107587719c40ebf02bf11e5e66c30bd20e98edebc2Daniel Dunbar      // we will basically never report anything interesting for
29116ecc7a993f939c5255c36c7c0d965fb9c1543f2aDaniel Dunbar      // platforms using a generic gcc, even if we are just using gcc
29126ecc7a993f939c5255c36c7c0d965fb9c1543f2aDaniel Dunbar      // to get to the assembler.
29137587719c40ebf02bf11e5e66c30bd20e98edebc2Daniel Dunbar      A->claim();
29141d46033f760ba5fd266ce59fe391fac473f04f52Daniel Dunbar      A->render(Args, CmdArgs);
29157587719c40ebf02bf11e5e66c30bd20e98edebc2Daniel Dunbar    }
2916b488c1dac8e53206f07103d794a62a3f5012c0f4Daniel Dunbar  }
2917c21c485b4fb58ef5d55cf3e523263dd824a2ace4Daniel Dunbar
291882b51cce8cea6b6bb6175c406c2ab425c91d9dc8Daniel Dunbar  RenderExtraToolArgs(JA, CmdArgs);
2919b488c1dac8e53206f07103d794a62a3f5012c0f4Daniel Dunbar
2920b488c1dac8e53206f07103d794a62a3f5012c0f4Daniel Dunbar  // If using a driver driver, force the arch.
29217cfe31a713d8fcfc2a1328e8fbd8efdeb0aec51bDaniel Dunbar  const std::string &Arch = getToolChain().getArchName();
2922905c45f15a25598620d19160c139c6b785aeea89Bob Wilson  if (getToolChain().getTriple().isOSDarwin()) {
2923b488c1dac8e53206f07103d794a62a3f5012c0f4Daniel Dunbar    CmdArgs.push_back("-arch");
2924bf54a06f9b771c2a2730cc63eb89bce0522515b5Daniel Dunbar
2925bf54a06f9b771c2a2730cc63eb89bce0522515b5Daniel Dunbar    // FIXME: Remove these special cases.
29267cfe31a713d8fcfc2a1328e8fbd8efdeb0aec51bDaniel Dunbar    if (Arch == "powerpc")
29277cfe31a713d8fcfc2a1328e8fbd8efdeb0aec51bDaniel Dunbar      CmdArgs.push_back("ppc");
29287cfe31a713d8fcfc2a1328e8fbd8efdeb0aec51bDaniel Dunbar    else if (Arch == "powerpc64")
29297cfe31a713d8fcfc2a1328e8fbd8efdeb0aec51bDaniel Dunbar      CmdArgs.push_back("ppc64");
29307cfe31a713d8fcfc2a1328e8fbd8efdeb0aec51bDaniel Dunbar    else
2931881376467c46c5c6cc16fa6790271c2c22e1d4f1Daniel Dunbar      CmdArgs.push_back(Args.MakeArgString(Arch));
2932b488c1dac8e53206f07103d794a62a3f5012c0f4Daniel Dunbar  }
2933b488c1dac8e53206f07103d794a62a3f5012c0f4Daniel Dunbar
29346ecc7a993f939c5255c36c7c0d965fb9c1543f2aDaniel Dunbar  // Try to force gcc to match the tool chain we want, if we recognize
29356ecc7a993f939c5255c36c7c0d965fb9c1543f2aDaniel Dunbar  // the arch.
29367cfe31a713d8fcfc2a1328e8fbd8efdeb0aec51bDaniel Dunbar  //
29377cfe31a713d8fcfc2a1328e8fbd8efdeb0aec51bDaniel Dunbar  // FIXME: The triple class should directly provide the information we want
29387cfe31a713d8fcfc2a1328e8fbd8efdeb0aec51bDaniel Dunbar  // here.
29397cfe31a713d8fcfc2a1328e8fbd8efdeb0aec51bDaniel Dunbar  if (Arch == "i386" || Arch == "powerpc")
29406ecc7a993f939c5255c36c7c0d965fb9c1543f2aDaniel Dunbar    CmdArgs.push_back("-m32");
29417cfe31a713d8fcfc2a1328e8fbd8efdeb0aec51bDaniel Dunbar  else if (Arch == "x86_64" || Arch == "powerpc64")
29426ecc7a993f939c5255c36c7c0d965fb9c1543f2aDaniel Dunbar    CmdArgs.push_back("-m64");
29436ecc7a993f939c5255c36c7c0d965fb9c1543f2aDaniel Dunbar
29447c1e46533cae07216e2a67d5636a5afb44253155Daniel Dunbar  if (Output.isFilename()) {
2945b488c1dac8e53206f07103d794a62a3f5012c0f4Daniel Dunbar    CmdArgs.push_back("-o");
2946115a79277edababaf1b26e3654044ae983197679Daniel Dunbar    CmdArgs.push_back(Output.getFilename());
2947115a79277edababaf1b26e3654044ae983197679Daniel Dunbar  } else {
2948115a79277edababaf1b26e3654044ae983197679Daniel Dunbar    assert(Output.isNothing() && "Unexpected output");
2949b488c1dac8e53206f07103d794a62a3f5012c0f4Daniel Dunbar    CmdArgs.push_back("-fsyntax-only");
2950115a79277edababaf1b26e3654044ae983197679Daniel Dunbar  }
2951b488c1dac8e53206f07103d794a62a3f5012c0f4Daniel Dunbar
29529631939f82c0eaa6fb3936a0ce58a41adfbc9011Tony Linthicum  Args.AddAllArgValues(CmdArgs, options::OPT_Wa_COMMA,
29539631939f82c0eaa6fb3936a0ce58a41adfbc9011Tony Linthicum                       options::OPT_Xassembler);
2954b488c1dac8e53206f07103d794a62a3f5012c0f4Daniel Dunbar
2955b488c1dac8e53206f07103d794a62a3f5012c0f4Daniel Dunbar  // Only pass -x if gcc will understand it; otherwise hope gcc
2956b488c1dac8e53206f07103d794a62a3f5012c0f4Daniel Dunbar  // understands the suffix correctly. The main use case this would go
2957b488c1dac8e53206f07103d794a62a3f5012c0f4Daniel Dunbar  // wrong in is for linker inputs if they happened to have an odd
2958b488c1dac8e53206f07103d794a62a3f5012c0f4Daniel Dunbar  // suffix; really the only way to get this to happen is a command
2959b488c1dac8e53206f07103d794a62a3f5012c0f4Daniel Dunbar  // like '-x foobar a.c' which will treat a.c like a linker input.
2960b488c1dac8e53206f07103d794a62a3f5012c0f4Daniel Dunbar  //
2961b488c1dac8e53206f07103d794a62a3f5012c0f4Daniel Dunbar  // FIXME: For the linker case specifically, can we safely convert
2962b488c1dac8e53206f07103d794a62a3f5012c0f4Daniel Dunbar  // inputs into '-Wl,' options?
2963b488c1dac8e53206f07103d794a62a3f5012c0f4Daniel Dunbar  for (InputInfoList::const_iterator
2964b488c1dac8e53206f07103d794a62a3f5012c0f4Daniel Dunbar         it = Inputs.begin(), ie = Inputs.end(); it != ie; ++it) {
2965b488c1dac8e53206f07103d794a62a3f5012c0f4Daniel Dunbar    const InputInfo &II = *it;
2966a8304f67291b0182fb64f3afc621615288dd1d31Daniel Dunbar
29675915fbf310e171c4cd3c2af05e9de360c0fa988aDaniel Dunbar    // Don't try to pass LLVM or AST inputs to a generic gcc.
29686c6424bc0d3b5f080a97b5f6ef4a8d70c38e38f5Daniel Dunbar    if (II.getType() == types::TY_LLVM_IR || II.getType() == types::TY_LTO_IR ||
29696c6424bc0d3b5f080a97b5f6ef4a8d70c38e38f5Daniel Dunbar        II.getType() == types::TY_LLVM_BC || II.getType() == types::TY_LTO_BC)
29705f9e272e632e951b1efe824cd16acb4d96077930Chris Lattner      D.Diag(diag::err_drv_no_linker_llvm_support)
2971881376467c46c5c6cc16fa6790271c2c22e1d4f1Daniel Dunbar        << getToolChain().getTripleString();
29725915fbf310e171c4cd3c2af05e9de360c0fa988aDaniel Dunbar    else if (II.getType() == types::TY_AST)
29735f9e272e632e951b1efe824cd16acb4d96077930Chris Lattner      D.Diag(diag::err_drv_no_ast_support)
2974881376467c46c5c6cc16fa6790271c2c22e1d4f1Daniel Dunbar        << getToolChain().getTripleString();
2975a8304f67291b0182fb64f3afc621615288dd1d31Daniel Dunbar
2976b488c1dac8e53206f07103d794a62a3f5012c0f4Daniel Dunbar    if (types::canTypeBeUserSpecified(II.getType())) {
2977b488c1dac8e53206f07103d794a62a3f5012c0f4Daniel Dunbar      CmdArgs.push_back("-x");
2978b488c1dac8e53206f07103d794a62a3f5012c0f4Daniel Dunbar      CmdArgs.push_back(types::getTypeName(II.getType()));
2979b488c1dac8e53206f07103d794a62a3f5012c0f4Daniel Dunbar    }
2980b488c1dac8e53206f07103d794a62a3f5012c0f4Daniel Dunbar
29817c1e46533cae07216e2a67d5636a5afb44253155Daniel Dunbar    if (II.isFilename())
2982115a79277edababaf1b26e3654044ae983197679Daniel Dunbar      CmdArgs.push_back(II.getFilename());
298348f9994bdd9f7f1853782109595b1f80f50afcfaDaniel Dunbar    else {
298448f9994bdd9f7f1853782109595b1f80f50afcfaDaniel Dunbar      const Arg &A = II.getInputArg();
298548f9994bdd9f7f1853782109595b1f80f50afcfaDaniel Dunbar
298648f9994bdd9f7f1853782109595b1f80f50afcfaDaniel Dunbar      // Reverse translate some rewritten options.
298748f9994bdd9f7f1853782109595b1f80f50afcfaDaniel Dunbar      if (A.getOption().matches(options::OPT_Z_reserved_lib_stdcxx)) {
298848f9994bdd9f7f1853782109595b1f80f50afcfaDaniel Dunbar        CmdArgs.push_back("-lstdc++");
298948f9994bdd9f7f1853782109595b1f80f50afcfaDaniel Dunbar        continue;
299048f9994bdd9f7f1853782109595b1f80f50afcfaDaniel Dunbar      }
299148f9994bdd9f7f1853782109595b1f80f50afcfaDaniel Dunbar
2992115a79277edababaf1b26e3654044ae983197679Daniel Dunbar      // Don't render as input, we need gcc to do the translations.
299348f9994bdd9f7f1853782109595b1f80f50afcfaDaniel Dunbar      A.render(Args, CmdArgs);
299448f9994bdd9f7f1853782109595b1f80f50afcfaDaniel Dunbar    }
2995b488c1dac8e53206f07103d794a62a3f5012c0f4Daniel Dunbar  }
2996b488c1dac8e53206f07103d794a62a3f5012c0f4Daniel Dunbar
2997b8a3e8139b9fe513500c89bbcd9133415654a689Dylan Noblesmith  const std::string customGCCName = D.getCCCGenericGCCName();
2998b8a3e8139b9fe513500c89bbcd9133415654a689Dylan Noblesmith  const char *GCCName;
2999b8a3e8139b9fe513500c89bbcd9133415654a689Dylan Noblesmith  if (!customGCCName.empty())
3000b8a3e8139b9fe513500c89bbcd9133415654a689Dylan Noblesmith    GCCName = customGCCName.c_str();
3001b8a3e8139b9fe513500c89bbcd9133415654a689Dylan Noblesmith  else if (D.CCCIsCXX) {
3002b8a3e8139b9fe513500c89bbcd9133415654a689Dylan Noblesmith    GCCName = "g++";
3003b8a3e8139b9fe513500c89bbcd9133415654a689Dylan Noblesmith  } else
3004b8a3e8139b9fe513500c89bbcd9133415654a689Dylan Noblesmith    GCCName = "gcc";
3005b8a3e8139b9fe513500c89bbcd9133415654a689Dylan Noblesmith
3006c21c485b4fb58ef5d55cf3e523263dd824a2ace4Daniel Dunbar  const char *Exec =
30074a7e88978cf646ad10d654020cb00b3877069210Daniel Dunbar    Args.MakeArgString(getToolChain().GetProgramPath(GCCName));
30082fe238ed293bd4bc27af9beb9fa151fad2146fa8Daniel Dunbar  C.addCommand(new Command(JA, *this, Exec, CmdArgs));
300947ac7d27c44bd64a7d0fc03d4babc196cf2b8230Daniel Dunbar}
301047ac7d27c44bd64a7d0fc03d4babc196cf2b8230Daniel Dunbar
301182b51cce8cea6b6bb6175c406c2ab425c91d9dc8Daniel Dunbarvoid gcc::Preprocess::RenderExtraToolArgs(const JobAction &JA,
301282b51cce8cea6b6bb6175c406c2ab425c91d9dc8Daniel Dunbar                                          ArgStringList &CmdArgs) const {
3013b488c1dac8e53206f07103d794a62a3f5012c0f4Daniel Dunbar  CmdArgs.push_back("-E");
301447ac7d27c44bd64a7d0fc03d4babc196cf2b8230Daniel Dunbar}
301547ac7d27c44bd64a7d0fc03d4babc196cf2b8230Daniel Dunbar
301682b51cce8cea6b6bb6175c406c2ab425c91d9dc8Daniel Dunbarvoid gcc::Precompile::RenderExtraToolArgs(const JobAction &JA,
301782b51cce8cea6b6bb6175c406c2ab425c91d9dc8Daniel Dunbar                                          ArgStringList &CmdArgs) const {
3018b488c1dac8e53206f07103d794a62a3f5012c0f4Daniel Dunbar  // The type is good enough.
301947ac7d27c44bd64a7d0fc03d4babc196cf2b8230Daniel Dunbar}
302047ac7d27c44bd64a7d0fc03d4babc196cf2b8230Daniel Dunbar
302182b51cce8cea6b6bb6175c406c2ab425c91d9dc8Daniel Dunbarvoid gcc::Compile::RenderExtraToolArgs(const JobAction &JA,
302282b51cce8cea6b6bb6175c406c2ab425c91d9dc8Daniel Dunbar                                       ArgStringList &CmdArgs) const {
302364952508c2b0c8bffb45c8b410f0af3d2457f59bDaniel Dunbar  const Driver &D = getToolChain().getDriver();
302464952508c2b0c8bffb45c8b410f0af3d2457f59bDaniel Dunbar
302582b51cce8cea6b6bb6175c406c2ab425c91d9dc8Daniel Dunbar  // If -flto, etc. are present then make sure not to force assembly output.
30266c6424bc0d3b5f080a97b5f6ef4a8d70c38e38f5Daniel Dunbar  if (JA.getType() == types::TY_LLVM_IR || JA.getType() == types::TY_LTO_IR ||
30276c6424bc0d3b5f080a97b5f6ef4a8d70c38e38f5Daniel Dunbar      JA.getType() == types::TY_LLVM_BC || JA.getType() == types::TY_LTO_BC)
302882b51cce8cea6b6bb6175c406c2ab425c91d9dc8Daniel Dunbar    CmdArgs.push_back("-c");
302964952508c2b0c8bffb45c8b410f0af3d2457f59bDaniel Dunbar  else {
303064952508c2b0c8bffb45c8b410f0af3d2457f59bDaniel Dunbar    if (JA.getType() != types::TY_PP_Asm)
30315f9e272e632e951b1efe824cd16acb4d96077930Chris Lattner      D.Diag(diag::err_drv_invalid_gcc_output_type)
303264952508c2b0c8bffb45c8b410f0af3d2457f59bDaniel Dunbar        << getTypeName(JA.getType());
303320249a1af2e462dcafdd6a350f1c7967b264ff25Michael J. Spencer
303482b51cce8cea6b6bb6175c406c2ab425c91d9dc8Daniel Dunbar    CmdArgs.push_back("-S");
303564952508c2b0c8bffb45c8b410f0af3d2457f59bDaniel Dunbar  }
303647ac7d27c44bd64a7d0fc03d4babc196cf2b8230Daniel Dunbar}
303747ac7d27c44bd64a7d0fc03d4babc196cf2b8230Daniel Dunbar
303882b51cce8cea6b6bb6175c406c2ab425c91d9dc8Daniel Dunbarvoid gcc::Assemble::RenderExtraToolArgs(const JobAction &JA,
303982b51cce8cea6b6bb6175c406c2ab425c91d9dc8Daniel Dunbar                                        ArgStringList &CmdArgs) const {
3040b488c1dac8e53206f07103d794a62a3f5012c0f4Daniel Dunbar  CmdArgs.push_back("-c");
3041b488c1dac8e53206f07103d794a62a3f5012c0f4Daniel Dunbar}
304247ac7d27c44bd64a7d0fc03d4babc196cf2b8230Daniel Dunbar
304382b51cce8cea6b6bb6175c406c2ab425c91d9dc8Daniel Dunbarvoid gcc::Link::RenderExtraToolArgs(const JobAction &JA,
304482b51cce8cea6b6bb6175c406c2ab425c91d9dc8Daniel Dunbar                                    ArgStringList &CmdArgs) const {
3045b488c1dac8e53206f07103d794a62a3f5012c0f4Daniel Dunbar  // The types are (hopefully) good enough.
304647ac7d27c44bd64a7d0fc03d4babc196cf2b8230Daniel Dunbar}
3047b488c1dac8e53206f07103d794a62a3f5012c0f4Daniel Dunbar
30489631939f82c0eaa6fb3936a0ce58a41adfbc9011Tony Linthicum// Hexagon tools start.
30499631939f82c0eaa6fb3936a0ce58a41adfbc9011Tony Linthicumvoid hexagon::Assemble::RenderExtraToolArgs(const JobAction &JA,
30509631939f82c0eaa6fb3936a0ce58a41adfbc9011Tony Linthicum                                        ArgStringList &CmdArgs) const {
30519631939f82c0eaa6fb3936a0ce58a41adfbc9011Tony Linthicum
30529631939f82c0eaa6fb3936a0ce58a41adfbc9011Tony Linthicum}
30539631939f82c0eaa6fb3936a0ce58a41adfbc9011Tony Linthicumvoid hexagon::Assemble::ConstructJob(Compilation &C, const JobAction &JA,
30549631939f82c0eaa6fb3936a0ce58a41adfbc9011Tony Linthicum                               const InputInfo &Output,
30559631939f82c0eaa6fb3936a0ce58a41adfbc9011Tony Linthicum                               const InputInfoList &Inputs,
30569631939f82c0eaa6fb3936a0ce58a41adfbc9011Tony Linthicum                               const ArgList &Args,
30579631939f82c0eaa6fb3936a0ce58a41adfbc9011Tony Linthicum                               const char *LinkingOutput) const {
30589631939f82c0eaa6fb3936a0ce58a41adfbc9011Tony Linthicum
30599631939f82c0eaa6fb3936a0ce58a41adfbc9011Tony Linthicum  const Driver &D = getToolChain().getDriver();
30609631939f82c0eaa6fb3936a0ce58a41adfbc9011Tony Linthicum  ArgStringList CmdArgs;
30619631939f82c0eaa6fb3936a0ce58a41adfbc9011Tony Linthicum
30629631939f82c0eaa6fb3936a0ce58a41adfbc9011Tony Linthicum  std::string MarchString = "-march=";
30639631939f82c0eaa6fb3936a0ce58a41adfbc9011Tony Linthicum  MarchString += getHexagonTargetCPU(Args);
30649631939f82c0eaa6fb3936a0ce58a41adfbc9011Tony Linthicum  CmdArgs.push_back(Args.MakeArgString(MarchString));
30659631939f82c0eaa6fb3936a0ce58a41adfbc9011Tony Linthicum
30669631939f82c0eaa6fb3936a0ce58a41adfbc9011Tony Linthicum  RenderExtraToolArgs(JA, CmdArgs);
30679631939f82c0eaa6fb3936a0ce58a41adfbc9011Tony Linthicum
30689631939f82c0eaa6fb3936a0ce58a41adfbc9011Tony Linthicum  if (Output.isFilename()) {
30699631939f82c0eaa6fb3936a0ce58a41adfbc9011Tony Linthicum    CmdArgs.push_back("-o");
30709631939f82c0eaa6fb3936a0ce58a41adfbc9011Tony Linthicum    CmdArgs.push_back(Output.getFilename());
30719631939f82c0eaa6fb3936a0ce58a41adfbc9011Tony Linthicum  } else {
30729631939f82c0eaa6fb3936a0ce58a41adfbc9011Tony Linthicum    assert(Output.isNothing() && "Unexpected output");
30739631939f82c0eaa6fb3936a0ce58a41adfbc9011Tony Linthicum    CmdArgs.push_back("-fsyntax-only");
30749631939f82c0eaa6fb3936a0ce58a41adfbc9011Tony Linthicum  }
30759631939f82c0eaa6fb3936a0ce58a41adfbc9011Tony Linthicum
30769631939f82c0eaa6fb3936a0ce58a41adfbc9011Tony Linthicum
30779631939f82c0eaa6fb3936a0ce58a41adfbc9011Tony Linthicum  // Only pass -x if gcc will understand it; otherwise hope gcc
30789631939f82c0eaa6fb3936a0ce58a41adfbc9011Tony Linthicum  // understands the suffix correctly. The main use case this would go
30799631939f82c0eaa6fb3936a0ce58a41adfbc9011Tony Linthicum  // wrong in is for linker inputs if they happened to have an odd
30809631939f82c0eaa6fb3936a0ce58a41adfbc9011Tony Linthicum  // suffix; really the only way to get this to happen is a command
30819631939f82c0eaa6fb3936a0ce58a41adfbc9011Tony Linthicum  // like '-x foobar a.c' which will treat a.c like a linker input.
30829631939f82c0eaa6fb3936a0ce58a41adfbc9011Tony Linthicum  //
30839631939f82c0eaa6fb3936a0ce58a41adfbc9011Tony Linthicum  // FIXME: For the linker case specifically, can we safely convert
30849631939f82c0eaa6fb3936a0ce58a41adfbc9011Tony Linthicum  // inputs into '-Wl,' options?
30859631939f82c0eaa6fb3936a0ce58a41adfbc9011Tony Linthicum  for (InputInfoList::const_iterator
30869631939f82c0eaa6fb3936a0ce58a41adfbc9011Tony Linthicum         it = Inputs.begin(), ie = Inputs.end(); it != ie; ++it) {
30879631939f82c0eaa6fb3936a0ce58a41adfbc9011Tony Linthicum    const InputInfo &II = *it;
30889631939f82c0eaa6fb3936a0ce58a41adfbc9011Tony Linthicum
30899631939f82c0eaa6fb3936a0ce58a41adfbc9011Tony Linthicum    // Don't try to pass LLVM or AST inputs to a generic gcc.
30909631939f82c0eaa6fb3936a0ce58a41adfbc9011Tony Linthicum    if (II.getType() == types::TY_LLVM_IR || II.getType() == types::TY_LTO_IR ||
30919631939f82c0eaa6fb3936a0ce58a41adfbc9011Tony Linthicum        II.getType() == types::TY_LLVM_BC || II.getType() == types::TY_LTO_BC)
30929631939f82c0eaa6fb3936a0ce58a41adfbc9011Tony Linthicum      D.Diag(clang::diag::err_drv_no_linker_llvm_support)
30939631939f82c0eaa6fb3936a0ce58a41adfbc9011Tony Linthicum        << getToolChain().getTripleString();
30949631939f82c0eaa6fb3936a0ce58a41adfbc9011Tony Linthicum    else if (II.getType() == types::TY_AST)
30959631939f82c0eaa6fb3936a0ce58a41adfbc9011Tony Linthicum      D.Diag(clang::diag::err_drv_no_ast_support)
30969631939f82c0eaa6fb3936a0ce58a41adfbc9011Tony Linthicum        << getToolChain().getTripleString();
30979631939f82c0eaa6fb3936a0ce58a41adfbc9011Tony Linthicum
30989631939f82c0eaa6fb3936a0ce58a41adfbc9011Tony Linthicum    if (II.isFilename())
30999631939f82c0eaa6fb3936a0ce58a41adfbc9011Tony Linthicum      CmdArgs.push_back(II.getFilename());
31009631939f82c0eaa6fb3936a0ce58a41adfbc9011Tony Linthicum    else
31019631939f82c0eaa6fb3936a0ce58a41adfbc9011Tony Linthicum      // Don't render as input, we need gcc to do the translations. FIXME: Pranav: What is this ?
31029631939f82c0eaa6fb3936a0ce58a41adfbc9011Tony Linthicum      II.getInputArg().render(Args, CmdArgs);
31039631939f82c0eaa6fb3936a0ce58a41adfbc9011Tony Linthicum  }
31049631939f82c0eaa6fb3936a0ce58a41adfbc9011Tony Linthicum
31059631939f82c0eaa6fb3936a0ce58a41adfbc9011Tony Linthicum  const char *GCCName = "hexagon-as";
31069631939f82c0eaa6fb3936a0ce58a41adfbc9011Tony Linthicum  const char *Exec =
31079631939f82c0eaa6fb3936a0ce58a41adfbc9011Tony Linthicum    Args.MakeArgString(getToolChain().GetProgramPath(GCCName));
31089631939f82c0eaa6fb3936a0ce58a41adfbc9011Tony Linthicum  C.addCommand(new Command(JA, *this, Exec, CmdArgs));
31099631939f82c0eaa6fb3936a0ce58a41adfbc9011Tony Linthicum
31109631939f82c0eaa6fb3936a0ce58a41adfbc9011Tony Linthicum}
31119631939f82c0eaa6fb3936a0ce58a41adfbc9011Tony Linthicumvoid hexagon::Link::RenderExtraToolArgs(const JobAction &JA,
31129631939f82c0eaa6fb3936a0ce58a41adfbc9011Tony Linthicum                                    ArgStringList &CmdArgs) const {
31139631939f82c0eaa6fb3936a0ce58a41adfbc9011Tony Linthicum  // The types are (hopefully) good enough.
31149631939f82c0eaa6fb3936a0ce58a41adfbc9011Tony Linthicum}
31159631939f82c0eaa6fb3936a0ce58a41adfbc9011Tony Linthicum
31169631939f82c0eaa6fb3936a0ce58a41adfbc9011Tony Linthicumvoid hexagon::Link::ConstructJob(Compilation &C, const JobAction &JA,
31179631939f82c0eaa6fb3936a0ce58a41adfbc9011Tony Linthicum                               const InputInfo &Output,
31189631939f82c0eaa6fb3936a0ce58a41adfbc9011Tony Linthicum                               const InputInfoList &Inputs,
31199631939f82c0eaa6fb3936a0ce58a41adfbc9011Tony Linthicum                               const ArgList &Args,
31209631939f82c0eaa6fb3936a0ce58a41adfbc9011Tony Linthicum                               const char *LinkingOutput) const {
31219631939f82c0eaa6fb3936a0ce58a41adfbc9011Tony Linthicum
31229631939f82c0eaa6fb3936a0ce58a41adfbc9011Tony Linthicum  const Driver &D = getToolChain().getDriver();
31239631939f82c0eaa6fb3936a0ce58a41adfbc9011Tony Linthicum  ArgStringList CmdArgs;
31249631939f82c0eaa6fb3936a0ce58a41adfbc9011Tony Linthicum
31259631939f82c0eaa6fb3936a0ce58a41adfbc9011Tony Linthicum  for (ArgList::const_iterator
31269631939f82c0eaa6fb3936a0ce58a41adfbc9011Tony Linthicum         it = Args.begin(), ie = Args.end(); it != ie; ++it) {
31279631939f82c0eaa6fb3936a0ce58a41adfbc9011Tony Linthicum    Arg *A = *it;
31289631939f82c0eaa6fb3936a0ce58a41adfbc9011Tony Linthicum    if (A->getOption().hasForwardToGCC()) {
31299631939f82c0eaa6fb3936a0ce58a41adfbc9011Tony Linthicum      // Don't forward any -g arguments to assembly steps.
31309631939f82c0eaa6fb3936a0ce58a41adfbc9011Tony Linthicum      if (isa<AssembleJobAction>(JA) &&
31319631939f82c0eaa6fb3936a0ce58a41adfbc9011Tony Linthicum          A->getOption().matches(options::OPT_g_Group))
31329631939f82c0eaa6fb3936a0ce58a41adfbc9011Tony Linthicum        continue;
31339631939f82c0eaa6fb3936a0ce58a41adfbc9011Tony Linthicum
31349631939f82c0eaa6fb3936a0ce58a41adfbc9011Tony Linthicum      // It is unfortunate that we have to claim here, as this means
31359631939f82c0eaa6fb3936a0ce58a41adfbc9011Tony Linthicum      // we will basically never report anything interesting for
31369631939f82c0eaa6fb3936a0ce58a41adfbc9011Tony Linthicum      // platforms using a generic gcc, even if we are just using gcc
31379631939f82c0eaa6fb3936a0ce58a41adfbc9011Tony Linthicum      // to get to the assembler.
31389631939f82c0eaa6fb3936a0ce58a41adfbc9011Tony Linthicum      A->claim();
31399631939f82c0eaa6fb3936a0ce58a41adfbc9011Tony Linthicum      A->render(Args, CmdArgs);
31409631939f82c0eaa6fb3936a0ce58a41adfbc9011Tony Linthicum    }
31419631939f82c0eaa6fb3936a0ce58a41adfbc9011Tony Linthicum  }
31429631939f82c0eaa6fb3936a0ce58a41adfbc9011Tony Linthicum
31439631939f82c0eaa6fb3936a0ce58a41adfbc9011Tony Linthicum  RenderExtraToolArgs(JA, CmdArgs);
31449631939f82c0eaa6fb3936a0ce58a41adfbc9011Tony Linthicum
31459631939f82c0eaa6fb3936a0ce58a41adfbc9011Tony Linthicum  // Add Arch Information
31469631939f82c0eaa6fb3936a0ce58a41adfbc9011Tony Linthicum  Arg *A;
314743115d4904431917ef6852ee089a8520b9940ba5Sebastian Pop  if ((A = getLastHexagonArchArg(Args))) {
314843115d4904431917ef6852ee089a8520b9940ba5Sebastian Pop    if (A->getOption().matches(options::OPT_m_Joined))
314943115d4904431917ef6852ee089a8520b9940ba5Sebastian Pop      A->render(Args, CmdArgs);
31509631939f82c0eaa6fb3936a0ce58a41adfbc9011Tony Linthicum    else
315143115d4904431917ef6852ee089a8520b9940ba5Sebastian Pop      CmdArgs.push_back (Args.MakeArgString("-m" + getHexagonTargetCPU(Args)));
31529631939f82c0eaa6fb3936a0ce58a41adfbc9011Tony Linthicum  }
315343115d4904431917ef6852ee089a8520b9940ba5Sebastian Pop  else {
315443115d4904431917ef6852ee089a8520b9940ba5Sebastian Pop    CmdArgs.push_back (Args.MakeArgString("-m" + getHexagonTargetCPU(Args)));
315543115d4904431917ef6852ee089a8520b9940ba5Sebastian Pop  }
315643115d4904431917ef6852ee089a8520b9940ba5Sebastian Pop
31579631939f82c0eaa6fb3936a0ce58a41adfbc9011Tony Linthicum  CmdArgs.push_back("-mqdsp6-compat");
31589631939f82c0eaa6fb3936a0ce58a41adfbc9011Tony Linthicum
31599631939f82c0eaa6fb3936a0ce58a41adfbc9011Tony Linthicum  const char *GCCName;
31609631939f82c0eaa6fb3936a0ce58a41adfbc9011Tony Linthicum  if (C.getDriver().CCCIsCXX)
31619631939f82c0eaa6fb3936a0ce58a41adfbc9011Tony Linthicum    GCCName = "hexagon-g++";
31629631939f82c0eaa6fb3936a0ce58a41adfbc9011Tony Linthicum  else
31639631939f82c0eaa6fb3936a0ce58a41adfbc9011Tony Linthicum    GCCName = "hexagon-gcc";
31649631939f82c0eaa6fb3936a0ce58a41adfbc9011Tony Linthicum  const char *Exec =
31659631939f82c0eaa6fb3936a0ce58a41adfbc9011Tony Linthicum    Args.MakeArgString(getToolChain().GetProgramPath(GCCName));
31669631939f82c0eaa6fb3936a0ce58a41adfbc9011Tony Linthicum
31679631939f82c0eaa6fb3936a0ce58a41adfbc9011Tony Linthicum  if (Output.isFilename()) {
31689631939f82c0eaa6fb3936a0ce58a41adfbc9011Tony Linthicum    CmdArgs.push_back("-o");
31699631939f82c0eaa6fb3936a0ce58a41adfbc9011Tony Linthicum    CmdArgs.push_back(Output.getFilename());
31709631939f82c0eaa6fb3936a0ce58a41adfbc9011Tony Linthicum  }
31719631939f82c0eaa6fb3936a0ce58a41adfbc9011Tony Linthicum
31729631939f82c0eaa6fb3936a0ce58a41adfbc9011Tony Linthicum  for (InputInfoList::const_iterator
31739631939f82c0eaa6fb3936a0ce58a41adfbc9011Tony Linthicum         it = Inputs.begin(), ie = Inputs.end(); it != ie; ++it) {
31749631939f82c0eaa6fb3936a0ce58a41adfbc9011Tony Linthicum    const InputInfo &II = *it;
31759631939f82c0eaa6fb3936a0ce58a41adfbc9011Tony Linthicum
31769631939f82c0eaa6fb3936a0ce58a41adfbc9011Tony Linthicum    // Don't try to pass LLVM or AST inputs to a generic gcc.
31779631939f82c0eaa6fb3936a0ce58a41adfbc9011Tony Linthicum    if (II.getType() == types::TY_LLVM_IR || II.getType() == types::TY_LTO_IR ||
31789631939f82c0eaa6fb3936a0ce58a41adfbc9011Tony Linthicum        II.getType() == types::TY_LLVM_BC || II.getType() == types::TY_LTO_BC)
31799631939f82c0eaa6fb3936a0ce58a41adfbc9011Tony Linthicum      D.Diag(clang::diag::err_drv_no_linker_llvm_support)
31809631939f82c0eaa6fb3936a0ce58a41adfbc9011Tony Linthicum        << getToolChain().getTripleString();
31819631939f82c0eaa6fb3936a0ce58a41adfbc9011Tony Linthicum    else if (II.getType() == types::TY_AST)
31829631939f82c0eaa6fb3936a0ce58a41adfbc9011Tony Linthicum      D.Diag(clang::diag::err_drv_no_ast_support)
31839631939f82c0eaa6fb3936a0ce58a41adfbc9011Tony Linthicum        << getToolChain().getTripleString();
31849631939f82c0eaa6fb3936a0ce58a41adfbc9011Tony Linthicum
31859631939f82c0eaa6fb3936a0ce58a41adfbc9011Tony Linthicum    if (II.isFilename())
31869631939f82c0eaa6fb3936a0ce58a41adfbc9011Tony Linthicum      CmdArgs.push_back(II.getFilename());
31879631939f82c0eaa6fb3936a0ce58a41adfbc9011Tony Linthicum    else
31889631939f82c0eaa6fb3936a0ce58a41adfbc9011Tony Linthicum      // Don't render as input, we need gcc to do the translations. FIXME: Pranav: What is this ?
31899631939f82c0eaa6fb3936a0ce58a41adfbc9011Tony Linthicum      II.getInputArg().render(Args, CmdArgs);
31909631939f82c0eaa6fb3936a0ce58a41adfbc9011Tony Linthicum  }
31919631939f82c0eaa6fb3936a0ce58a41adfbc9011Tony Linthicum  C.addCommand(new Command(JA, *this, Exec, CmdArgs));
31929631939f82c0eaa6fb3936a0ce58a41adfbc9011Tony Linthicum
31939631939f82c0eaa6fb3936a0ce58a41adfbc9011Tony Linthicum}
31949631939f82c0eaa6fb3936a0ce58a41adfbc9011Tony Linthicum// Hexagon tools end.
31959631939f82c0eaa6fb3936a0ce58a41adfbc9011Tony Linthicum
31969631939f82c0eaa6fb3936a0ce58a41adfbc9011Tony Linthicum
319740f1265ebd42ece3e7f7917319b56012e8e2bce2Daniel Dunbarconst char *darwin::CC1::getCC1Name(types::ID Type) const {
319840f1265ebd42ece3e7f7917319b56012e8e2bce2Daniel Dunbar  switch (Type) {
319940f1265ebd42ece3e7f7917319b56012e8e2bce2Daniel Dunbar  default:
3200b219cfc4d75f0a03630b7c4509ef791b7e97b2c8David Blaikie    llvm_unreachable("Unexpected type for Darwin CC1 tool.");
320140f1265ebd42ece3e7f7917319b56012e8e2bce2Daniel Dunbar  case types::TY_Asm:
320240f1265ebd42ece3e7f7917319b56012e8e2bce2Daniel Dunbar  case types::TY_C: case types::TY_CHeader:
320340f1265ebd42ece3e7f7917319b56012e8e2bce2Daniel Dunbar  case types::TY_PP_C: case types::TY_PP_CHeader:
320440f1265ebd42ece3e7f7917319b56012e8e2bce2Daniel Dunbar    return "cc1";
320540f1265ebd42ece3e7f7917319b56012e8e2bce2Daniel Dunbar  case types::TY_ObjC: case types::TY_ObjCHeader:
3206cc52a0688f46cd04dd6b4670b304cbe82e3018c0Nico Weber  case types::TY_PP_ObjC: case types::TY_PP_ObjC_Alias:
3207cc52a0688f46cd04dd6b4670b304cbe82e3018c0Nico Weber  case types::TY_PP_ObjCHeader:
320840f1265ebd42ece3e7f7917319b56012e8e2bce2Daniel Dunbar    return "cc1obj";
320940f1265ebd42ece3e7f7917319b56012e8e2bce2Daniel Dunbar  case types::TY_CXX: case types::TY_CXXHeader:
321040f1265ebd42ece3e7f7917319b56012e8e2bce2Daniel Dunbar  case types::TY_PP_CXX: case types::TY_PP_CXXHeader:
321140f1265ebd42ece3e7f7917319b56012e8e2bce2Daniel Dunbar    return "cc1plus";
321240f1265ebd42ece3e7f7917319b56012e8e2bce2Daniel Dunbar  case types::TY_ObjCXX: case types::TY_ObjCXXHeader:
3213cc52a0688f46cd04dd6b4670b304cbe82e3018c0Nico Weber  case types::TY_PP_ObjCXX: case types::TY_PP_ObjCXX_Alias:
3214cc52a0688f46cd04dd6b4670b304cbe82e3018c0Nico Weber  case types::TY_PP_ObjCXXHeader:
321540f1265ebd42ece3e7f7917319b56012e8e2bce2Daniel Dunbar    return "cc1objplus";
321640f1265ebd42ece3e7f7917319b56012e8e2bce2Daniel Dunbar  }
321740f1265ebd42ece3e7f7917319b56012e8e2bce2Daniel Dunbar}
321840f1265ebd42ece3e7f7917319b56012e8e2bce2Daniel Dunbar
321999ba9e3bd70671f3441fb974895f226a83ce0e66David Blaikievoid darwin::CC1::anchor() {}
322099ba9e3bd70671f3441fb974895f226a83ce0e66David Blaikie
3221c21c485b4fb58ef5d55cf3e523263dd824a2ace4Daniel Dunbarconst char *darwin::CC1::getBaseInputName(const ArgList &Args,
3222a5a7bd0de7b6b80212095195a055a4a43f21d4b2Daniel Dunbar                                          const InputInfoList &Inputs) {
3223472ccff00cdbcd095c3ba933b9e3f202719f118fMichael J. Spencer  return Args.MakeArgString(
3224472ccff00cdbcd095c3ba933b9e3f202719f118fMichael J. Spencer    llvm::sys::path::filename(Inputs[0].getBaseInput()));
3225a3ec60e0cf2a1916f479288998d31bd980b1a306Daniel Dunbar}
3226a3ec60e0cf2a1916f479288998d31bd980b1a306Daniel Dunbar
3227c21c485b4fb58ef5d55cf3e523263dd824a2ace4Daniel Dunbarconst char *darwin::CC1::getBaseInputStem(const ArgList &Args,
3228a5a7bd0de7b6b80212095195a055a4a43f21d4b2Daniel Dunbar                                          const InputInfoList &Inputs) {
3229a3ec60e0cf2a1916f479288998d31bd980b1a306Daniel Dunbar  const char *Str = getBaseInputName(Args, Inputs);
3230a3ec60e0cf2a1916f479288998d31bd980b1a306Daniel Dunbar
3231657ca6683d754c903026221a3aa3aa9cedb7556fChris Lattner  if (const char *End = strrchr(Str, '.'))
3232881376467c46c5c6cc16fa6790271c2c22e1d4f1Daniel Dunbar    return Args.MakeArgString(std::string(Str, End));
3233a3ec60e0cf2a1916f479288998d31bd980b1a306Daniel Dunbar
3234a3ec60e0cf2a1916f479288998d31bd980b1a306Daniel Dunbar  return Str;
3235a3ec60e0cf2a1916f479288998d31bd980b1a306Daniel Dunbar}
3236a3ec60e0cf2a1916f479288998d31bd980b1a306Daniel Dunbar
3237a3ec60e0cf2a1916f479288998d31bd980b1a306Daniel Dunbarconst char *
3238c21c485b4fb58ef5d55cf3e523263dd824a2ace4Daniel Dunbardarwin::CC1::getDependencyFileName(const ArgList &Args,
3239a5a7bd0de7b6b80212095195a055a4a43f21d4b2Daniel Dunbar                                   const InputInfoList &Inputs) {
3240a3ec60e0cf2a1916f479288998d31bd980b1a306Daniel Dunbar  // FIXME: Think about this more.
3241a3ec60e0cf2a1916f479288998d31bd980b1a306Daniel Dunbar  std::string Res;
3242a3ec60e0cf2a1916f479288998d31bd980b1a306Daniel Dunbar
3243a3ec60e0cf2a1916f479288998d31bd980b1a306Daniel Dunbar  if (Arg *OutputOpt = Args.getLastArg(options::OPT_o)) {
3244a3ec60e0cf2a1916f479288998d31bd980b1a306Daniel Dunbar    std::string Str(OutputOpt->getValue(Args));
3245a3ec60e0cf2a1916f479288998d31bd980b1a306Daniel Dunbar    Res = Str.substr(0, Str.rfind('.'));
32463060178ad9df29789505c1e6debcfc80a3a13587Chad Rosier  } else {
3247a5a7bd0de7b6b80212095195a055a4a43f21d4b2Daniel Dunbar    Res = darwin::CC1::getBaseInputStem(Args, Inputs);
32483060178ad9df29789505c1e6debcfc80a3a13587Chad Rosier  }
3249881376467c46c5c6cc16fa6790271c2c22e1d4f1Daniel Dunbar  return Args.MakeArgString(Res + ".d");
3250a3ec60e0cf2a1916f479288998d31bd980b1a306Daniel Dunbar}
3251a3ec60e0cf2a1916f479288998d31bd980b1a306Daniel Dunbar
3252285f9a284704c07cd50e4597408d5f93518cd7c3Chad Rosiervoid darwin::CC1::RemoveCC1UnsupportedArgs(ArgStringList &CmdArgs) const {
325388b7cf00fcb582728c642da3927c59468efaf926Eric Christopher  for (ArgStringList::iterator it = CmdArgs.begin(), ie = CmdArgs.end();
3254285f9a284704c07cd50e4597408d5f93518cd7c3Chad Rosier       it != ie;) {
32558722a5d48340659c98c79af820b9088a64ef0303Chad Rosier
32568722a5d48340659c98c79af820b9088a64ef0303Chad Rosier    StringRef Option = *it;
3257807179763b87a24de26b3c89e7ae9e898bab420cChad Rosier    bool RemoveOption = false;
325804225c1409d1cc9fe0aca758ab0b6f1d213ce267Chad Rosier
32592872c8d5465623c1207b17873f228f5d96038d5eBob Wilson    // Erase both -fmodule-cache-path and its argument.
32602872c8d5465623c1207b17873f228f5d96038d5eBob Wilson    if (Option.equals("-fmodule-cache-path") && it+2 != ie) {
32612872c8d5465623c1207b17873f228f5d96038d5eBob Wilson      it = CmdArgs.erase(it, it+2);
3262807179763b87a24de26b3c89e7ae9e898bab420cChad Rosier      ie = CmdArgs.end();
326304225c1409d1cc9fe0aca758ab0b6f1d213ce267Chad Rosier      continue;
326404225c1409d1cc9fe0aca758ab0b6f1d213ce267Chad Rosier    }
326504225c1409d1cc9fe0aca758ab0b6f1d213ce267Chad Rosier
32662872c8d5465623c1207b17873f228f5d96038d5eBob Wilson    // Remove unsupported -f options.
32672872c8d5465623c1207b17873f228f5d96038d5eBob Wilson    if (Option.startswith("-f")) {
32682872c8d5465623c1207b17873f228f5d96038d5eBob Wilson      // Remove -f/-fno- to reduce the number of cases.
32692872c8d5465623c1207b17873f228f5d96038d5eBob Wilson      if (Option.startswith("-fno-"))
32702872c8d5465623c1207b17873f228f5d96038d5eBob Wilson        Option = Option.substr(5);
32712872c8d5465623c1207b17873f228f5d96038d5eBob Wilson      else
32722872c8d5465623c1207b17873f228f5d96038d5eBob Wilson        Option = Option.substr(2);
32732872c8d5465623c1207b17873f228f5d96038d5eBob Wilson      RemoveOption = llvm::StringSwitch<bool>(Option)
32742872c8d5465623c1207b17873f228f5d96038d5eBob Wilson        .Case("altivec", true)
32752872c8d5465623c1207b17873f228f5d96038d5eBob Wilson        .Case("modules", true)
32762872c8d5465623c1207b17873f228f5d96038d5eBob Wilson        .Case("diagnostics-show-note-include-stack", true)
32772872c8d5465623c1207b17873f228f5d96038d5eBob Wilson        .Default(false);
32782872c8d5465623c1207b17873f228f5d96038d5eBob Wilson    }
32792872c8d5465623c1207b17873f228f5d96038d5eBob Wilson
3280807179763b87a24de26b3c89e7ae9e898bab420cChad Rosier    // Handle machine specific options.
3281807179763b87a24de26b3c89e7ae9e898bab420cChad Rosier    if (Option.startswith("-m")) {
3282807179763b87a24de26b3c89e7ae9e898bab420cChad Rosier      RemoveOption = llvm::StringSwitch<bool>(Option)
3283807179763b87a24de26b3c89e7ae9e898bab420cChad Rosier        .Case("-mthumb", true)
3284807179763b87a24de26b3c89e7ae9e898bab420cChad Rosier        .Case("-mno-thumb", true)
3285807179763b87a24de26b3c89e7ae9e898bab420cChad Rosier        .Case("-mno-fused-madd", true)
3286807179763b87a24de26b3c89e7ae9e898bab420cChad Rosier        .Case("-mlong-branch", true)
3287807179763b87a24de26b3c89e7ae9e898bab420cChad Rosier        .Case("-mlongcall", true)
3288807179763b87a24de26b3c89e7ae9e898bab420cChad Rosier        .Case("-mcpu=G4", true)
3289807179763b87a24de26b3c89e7ae9e898bab420cChad Rosier        .Case("-mcpu=G5", true)
3290807179763b87a24de26b3c89e7ae9e898bab420cChad Rosier        .Default(false);
3291807179763b87a24de26b3c89e7ae9e898bab420cChad Rosier    }
3292807179763b87a24de26b3c89e7ae9e898bab420cChad Rosier
3293807179763b87a24de26b3c89e7ae9e898bab420cChad Rosier    // Handle warning options.
3294807179763b87a24de26b3c89e7ae9e898bab420cChad Rosier    if (Option.startswith("-W")) {
3295807179763b87a24de26b3c89e7ae9e898bab420cChad Rosier      // Remove -W/-Wno- to reduce the number of cases.
3296807179763b87a24de26b3c89e7ae9e898bab420cChad Rosier      if (Option.startswith("-Wno-"))
3297807179763b87a24de26b3c89e7ae9e898bab420cChad Rosier        Option = Option.substr(5);
3298807179763b87a24de26b3c89e7ae9e898bab420cChad Rosier      else
3299807179763b87a24de26b3c89e7ae9e898bab420cChad Rosier        Option = Option.substr(2);
3300807179763b87a24de26b3c89e7ae9e898bab420cChad Rosier
3301807179763b87a24de26b3c89e7ae9e898bab420cChad Rosier      RemoveOption = llvm::StringSwitch<bool>(Option)
3302807179763b87a24de26b3c89e7ae9e898bab420cChad Rosier        .Case("address-of-temporary", true)
3303807179763b87a24de26b3c89e7ae9e898bab420cChad Rosier        .Case("ambiguous-member-template", true)
3304807179763b87a24de26b3c89e7ae9e898bab420cChad Rosier        .Case("analyzer-incompatible-plugin", true)
3305807179763b87a24de26b3c89e7ae9e898bab420cChad Rosier        .Case("array-bounds", true)
3306807179763b87a24de26b3c89e7ae9e898bab420cChad Rosier        .Case("array-bounds-pointer-arithmetic", true)
3307807179763b87a24de26b3c89e7ae9e898bab420cChad Rosier        .Case("bind-to-temporary-copy", true)
3308807179763b87a24de26b3c89e7ae9e898bab420cChad Rosier        .Case("bitwise-op-parentheses", true)
3309807179763b87a24de26b3c89e7ae9e898bab420cChad Rosier        .Case("bool-conversions", true)
3310807179763b87a24de26b3c89e7ae9e898bab420cChad Rosier        .Case("builtin-macro-redefined", true)
3311807179763b87a24de26b3c89e7ae9e898bab420cChad Rosier        .Case("c++-hex-floats", true)
3312807179763b87a24de26b3c89e7ae9e898bab420cChad Rosier        .Case("c++0x-compat", true)
3313807179763b87a24de26b3c89e7ae9e898bab420cChad Rosier        .Case("c++0x-extensions", true)
3314807179763b87a24de26b3c89e7ae9e898bab420cChad Rosier        .Case("c++0x-narrowing", true)
3315575fdda948e07c1afc6fcdced9e5cf0b7905a54eRichard Smith        .Case("c++11-compat", true)
3316575fdda948e07c1afc6fcdced9e5cf0b7905a54eRichard Smith        .Case("c++11-extensions", true)
3317575fdda948e07c1afc6fcdced9e5cf0b7905a54eRichard Smith        .Case("c++11-narrowing", true)
3318807179763b87a24de26b3c89e7ae9e898bab420cChad Rosier        .Case("conditional-uninitialized", true)
3319807179763b87a24de26b3c89e7ae9e898bab420cChad Rosier        .Case("constant-conversion", true)
332095187bdd5c955c8edf3527eae41f1e4f80377f27David Blaikie        .Case("conversion-null", true)
3321807179763b87a24de26b3c89e7ae9e898bab420cChad Rosier        .Case("CFString-literal", true)
3322807179763b87a24de26b3c89e7ae9e898bab420cChad Rosier        .Case("constant-logical-operand", true)
3323807179763b87a24de26b3c89e7ae9e898bab420cChad Rosier        .Case("custom-atomic-properties", true)
3324807179763b87a24de26b3c89e7ae9e898bab420cChad Rosier        .Case("default-arg-special-member", true)
3325807179763b87a24de26b3c89e7ae9e898bab420cChad Rosier        .Case("delegating-ctor-cycles", true)
3326807179763b87a24de26b3c89e7ae9e898bab420cChad Rosier        .Case("delete-non-virtual-dtor", true)
3327807179763b87a24de26b3c89e7ae9e898bab420cChad Rosier        .Case("deprecated-implementations", true)
3328807179763b87a24de26b3c89e7ae9e898bab420cChad Rosier        .Case("deprecated-writable-strings", true)
3329807179763b87a24de26b3c89e7ae9e898bab420cChad Rosier        .Case("distributed-object-modifiers", true)
3330807179763b87a24de26b3c89e7ae9e898bab420cChad Rosier        .Case("duplicate-method-arg", true)
3331807179763b87a24de26b3c89e7ae9e898bab420cChad Rosier        .Case("dynamic-class-memaccess", true)
3332807179763b87a24de26b3c89e7ae9e898bab420cChad Rosier        .Case("enum-compare", true)
3333807179763b87a24de26b3c89e7ae9e898bab420cChad Rosier        .Case("exit-time-destructors", true)
3334807179763b87a24de26b3c89e7ae9e898bab420cChad Rosier        .Case("gnu", true)
3335807179763b87a24de26b3c89e7ae9e898bab420cChad Rosier        .Case("gnu-designator", true)
3336807179763b87a24de26b3c89e7ae9e898bab420cChad Rosier        .Case("header-hygiene", true)
3337807179763b87a24de26b3c89e7ae9e898bab420cChad Rosier        .Case("idiomatic-parentheses", true)
3338807179763b87a24de26b3c89e7ae9e898bab420cChad Rosier        .Case("ignored-qualifiers", true)
3339807179763b87a24de26b3c89e7ae9e898bab420cChad Rosier        .Case("implicit-atomic-properties", true)
3340807179763b87a24de26b3c89e7ae9e898bab420cChad Rosier        .Case("incompatible-pointer-types", true)
3341807179763b87a24de26b3c89e7ae9e898bab420cChad Rosier        .Case("incomplete-implementation", true)
3342807179763b87a24de26b3c89e7ae9e898bab420cChad Rosier        .Case("initializer-overrides", true)
3343807179763b87a24de26b3c89e7ae9e898bab420cChad Rosier        .Case("invalid-noreturn", true)
3344807179763b87a24de26b3c89e7ae9e898bab420cChad Rosier        .Case("invalid-token-paste", true)
334508f35a79f7506d6ac0349764aa4d6021a1e1c6e2Ivan Krasin        .Case("language-extension-token", true)
3346807179763b87a24de26b3c89e7ae9e898bab420cChad Rosier        .Case("literal-conversion", true)
3347807179763b87a24de26b3c89e7ae9e898bab420cChad Rosier        .Case("literal-range", true)
3348807179763b87a24de26b3c89e7ae9e898bab420cChad Rosier        .Case("local-type-template-args", true)
3349807179763b87a24de26b3c89e7ae9e898bab420cChad Rosier        .Case("logical-op-parentheses", true)
3350807179763b87a24de26b3c89e7ae9e898bab420cChad Rosier        .Case("method-signatures", true)
3351807179763b87a24de26b3c89e7ae9e898bab420cChad Rosier        .Case("microsoft", true)
3352807179763b87a24de26b3c89e7ae9e898bab420cChad Rosier        .Case("mismatched-tags", true)
3353807179763b87a24de26b3c89e7ae9e898bab420cChad Rosier        .Case("missing-method-return-type", true)
3354807179763b87a24de26b3c89e7ae9e898bab420cChad Rosier        .Case("non-pod-varargs", true)
3355807179763b87a24de26b3c89e7ae9e898bab420cChad Rosier        .Case("nonfragile-abi2", true)
3356807179763b87a24de26b3c89e7ae9e898bab420cChad Rosier        .Case("null-arithmetic", true)
3357807179763b87a24de26b3c89e7ae9e898bab420cChad Rosier        .Case("null-dereference", true)
3358807179763b87a24de26b3c89e7ae9e898bab420cChad Rosier        .Case("out-of-line-declaration", true)
3359807179763b87a24de26b3c89e7ae9e898bab420cChad Rosier        .Case("overriding-method-mismatch", true)
3360807179763b87a24de26b3c89e7ae9e898bab420cChad Rosier        .Case("readonly-setter-attrs", true)
3361807179763b87a24de26b3c89e7ae9e898bab420cChad Rosier        .Case("return-stack-address", true)
3362807179763b87a24de26b3c89e7ae9e898bab420cChad Rosier        .Case("self-assign", true)
3363807179763b87a24de26b3c89e7ae9e898bab420cChad Rosier        .Case("semicolon-before-method-body", true)
3364807179763b87a24de26b3c89e7ae9e898bab420cChad Rosier        .Case("sentinel", true)
3365807179763b87a24de26b3c89e7ae9e898bab420cChad Rosier        .Case("shift-overflow", true)
3366807179763b87a24de26b3c89e7ae9e898bab420cChad Rosier        .Case("shift-sign-overflow", true)
3367807179763b87a24de26b3c89e7ae9e898bab420cChad Rosier        .Case("sign-conversion", true)
3368807179763b87a24de26b3c89e7ae9e898bab420cChad Rosier        .Case("sizeof-array-argument", true)
3369807179763b87a24de26b3c89e7ae9e898bab420cChad Rosier        .Case("sizeof-pointer-memaccess", true)
3370807179763b87a24de26b3c89e7ae9e898bab420cChad Rosier        .Case("string-compare", true)
3371807179763b87a24de26b3c89e7ae9e898bab420cChad Rosier        .Case("super-class-method-mismatch", true)
3372807179763b87a24de26b3c89e7ae9e898bab420cChad Rosier        .Case("tautological-compare", true)
3373807179763b87a24de26b3c89e7ae9e898bab420cChad Rosier        .Case("typedef-redefinition", true)
3374807179763b87a24de26b3c89e7ae9e898bab420cChad Rosier        .Case("typename-missing", true)
3375807179763b87a24de26b3c89e7ae9e898bab420cChad Rosier        .Case("undefined-reinterpret-cast", true)
3376807179763b87a24de26b3c89e7ae9e898bab420cChad Rosier        .Case("unknown-warning-option", true)
3377807179763b87a24de26b3c89e7ae9e898bab420cChad Rosier        .Case("unnamed-type-template-args", true)
3378807179763b87a24de26b3c89e7ae9e898bab420cChad Rosier        .Case("unneeded-internal-declaration", true)
3379807179763b87a24de26b3c89e7ae9e898bab420cChad Rosier        .Case("unneeded-member-function", true)
3380807179763b87a24de26b3c89e7ae9e898bab420cChad Rosier        .Case("unused-comparison", true)
3381807179763b87a24de26b3c89e7ae9e898bab420cChad Rosier        .Case("unused-exception-parameter", true)
3382807179763b87a24de26b3c89e7ae9e898bab420cChad Rosier        .Case("unused-member-function", true)
3383807179763b87a24de26b3c89e7ae9e898bab420cChad Rosier        .Case("unused-result", true)
3384807179763b87a24de26b3c89e7ae9e898bab420cChad Rosier        .Case("vector-conversions", true)
3385807179763b87a24de26b3c89e7ae9e898bab420cChad Rosier        .Case("vla", true)
3386807179763b87a24de26b3c89e7ae9e898bab420cChad Rosier        .Case("used-but-marked-unused", true)
3387807179763b87a24de26b3c89e7ae9e898bab420cChad Rosier        .Case("weak-vtables", true)
3388807179763b87a24de26b3c89e7ae9e898bab420cChad Rosier        .Default(false);
3389807179763b87a24de26b3c89e7ae9e898bab420cChad Rosier    } // if (Option.startswith("-W"))
339004225c1409d1cc9fe0aca758ab0b6f1d213ce267Chad Rosier    if (RemoveOption) {
3391285f9a284704c07cd50e4597408d5f93518cd7c3Chad Rosier      it = CmdArgs.erase(it);
3392cc0de8c08128023544dd0c9c7ee67b105fed2985Chad Rosier      ie = CmdArgs.end();
33933060178ad9df29789505c1e6debcfc80a3a13587Chad Rosier    } else {
3394285f9a284704c07cd50e4597408d5f93518cd7c3Chad Rosier      ++it;
33953060178ad9df29789505c1e6debcfc80a3a13587Chad Rosier    }
3396285f9a284704c07cd50e4597408d5f93518cd7c3Chad Rosier  }
3397285f9a284704c07cd50e4597408d5f93518cd7c3Chad Rosier}
3398285f9a284704c07cd50e4597408d5f93518cd7c3Chad Rosier
3399c21c485b4fb58ef5d55cf3e523263dd824a2ace4Daniel Dunbarvoid darwin::CC1::AddCC1Args(const ArgList &Args,
3400a3ec60e0cf2a1916f479288998d31bd980b1a306Daniel Dunbar                             ArgStringList &CmdArgs) const {
3401ee788e70fcd0adf76103b17c78ac658d4ea30c9bDaniel Dunbar  const Driver &D = getToolChain().getDriver();
3402e2fd66418eca3d70cf6b62087d745d0c5181db69Daniel Dunbar
3403e2fd66418eca3d70cf6b62087d745d0c5181db69Daniel Dunbar  CheckCodeGenerationOptions(D, Args);
3404e2fd66418eca3d70cf6b62087d745d0c5181db69Daniel Dunbar
3405a3ec60e0cf2a1916f479288998d31bd980b1a306Daniel Dunbar  // Derived from cc1 spec.
3406a3ec60e0cf2a1916f479288998d31bd980b1a306Daniel Dunbar  if (!Args.hasArg(options::OPT_mkernel) && !Args.hasArg(options::OPT_static) &&
3407a3ec60e0cf2a1916f479288998d31bd980b1a306Daniel Dunbar      !Args.hasArg(options::OPT_mdynamic_no_pic))
3408a3ec60e0cf2a1916f479288998d31bd980b1a306Daniel Dunbar    CmdArgs.push_back("-fPIC");
3409a3ec60e0cf2a1916f479288998d31bd980b1a306Daniel Dunbar
34102ba91575905a54f712a7f64304e56002e4882499Daniel Dunbar  if (getToolChain().getTriple().getArch() == llvm::Triple::arm ||
34112ba91575905a54f712a7f64304e56002e4882499Daniel Dunbar      getToolChain().getTriple().getArch() == llvm::Triple::thumb) {
34122ba91575905a54f712a7f64304e56002e4882499Daniel Dunbar    if (!Args.hasArg(options::OPT_fbuiltin_strcat))
34132ba91575905a54f712a7f64304e56002e4882499Daniel Dunbar      CmdArgs.push_back("-fno-builtin-strcat");
34142ba91575905a54f712a7f64304e56002e4882499Daniel Dunbar    if (!Args.hasArg(options::OPT_fbuiltin_strcpy))
34152ba91575905a54f712a7f64304e56002e4882499Daniel Dunbar      CmdArgs.push_back("-fno-builtin-strcpy");
34162ba91575905a54f712a7f64304e56002e4882499Daniel Dunbar  }
34172ba91575905a54f712a7f64304e56002e4882499Daniel Dunbar
3418a3ec60e0cf2a1916f479288998d31bd980b1a306Daniel Dunbar  if (Args.hasArg(options::OPT_g_Flag) &&
3419a3ec60e0cf2a1916f479288998d31bd980b1a306Daniel Dunbar      !Args.hasArg(options::OPT_fno_eliminate_unused_debug_symbols))
3420a3ec60e0cf2a1916f479288998d31bd980b1a306Daniel Dunbar    CmdArgs.push_back("-feliminate-unused-debug-symbols");
3421a3ec60e0cf2a1916f479288998d31bd980b1a306Daniel Dunbar}
3422a3ec60e0cf2a1916f479288998d31bd980b1a306Daniel Dunbar
3423a3ec60e0cf2a1916f479288998d31bd980b1a306Daniel Dunbarvoid darwin::CC1::AddCC1OptionsArgs(const ArgList &Args, ArgStringList &CmdArgs,
3424a3ec60e0cf2a1916f479288998d31bd980b1a306Daniel Dunbar                                    const InputInfoList &Inputs,
3425a3ec60e0cf2a1916f479288998d31bd980b1a306Daniel Dunbar                                    const ArgStringList &OutputArgs) const {
3426ee788e70fcd0adf76103b17c78ac658d4ea30c9bDaniel Dunbar  const Driver &D = getToolChain().getDriver();
3427a3ec60e0cf2a1916f479288998d31bd980b1a306Daniel Dunbar
3428a3ec60e0cf2a1916f479288998d31bd980b1a306Daniel Dunbar  // Derived from cc1_options spec.
3429a3ec60e0cf2a1916f479288998d31bd980b1a306Daniel Dunbar  if (Args.hasArg(options::OPT_fast) ||
3430a3ec60e0cf2a1916f479288998d31bd980b1a306Daniel Dunbar      Args.hasArg(options::OPT_fastf) ||
3431a3ec60e0cf2a1916f479288998d31bd980b1a306Daniel Dunbar      Args.hasArg(options::OPT_fastcp))
3432a3ec60e0cf2a1916f479288998d31bd980b1a306Daniel Dunbar    CmdArgs.push_back("-O3");
3433c21c485b4fb58ef5d55cf3e523263dd824a2ace4Daniel Dunbar
3434a3ec60e0cf2a1916f479288998d31bd980b1a306Daniel Dunbar  if (Arg *A = Args.getLastArg(options::OPT_pg))
3435a3ec60e0cf2a1916f479288998d31bd980b1a306Daniel Dunbar    if (Args.hasArg(options::OPT_fomit_frame_pointer))
34365f9e272e632e951b1efe824cd16acb4d96077930Chris Lattner      D.Diag(diag::err_drv_argument_not_allowed_with)
3437a3ec60e0cf2a1916f479288998d31bd980b1a306Daniel Dunbar        << A->getAsString(Args) << "-fomit-frame-pointer";
3438a3ec60e0cf2a1916f479288998d31bd980b1a306Daniel Dunbar
3439a3ec60e0cf2a1916f479288998d31bd980b1a306Daniel Dunbar  AddCC1Args(Args, CmdArgs);
3440a3ec60e0cf2a1916f479288998d31bd980b1a306Daniel Dunbar
3441a3ec60e0cf2a1916f479288998d31bd980b1a306Daniel Dunbar  if (!Args.hasArg(options::OPT_Q))
3442a3ec60e0cf2a1916f479288998d31bd980b1a306Daniel Dunbar    CmdArgs.push_back("-quiet");
3443a3ec60e0cf2a1916f479288998d31bd980b1a306Daniel Dunbar
3444a3ec60e0cf2a1916f479288998d31bd980b1a306Daniel Dunbar  CmdArgs.push_back("-dumpbase");
3445a5a7bd0de7b6b80212095195a055a4a43f21d4b2Daniel Dunbar  CmdArgs.push_back(darwin::CC1::getBaseInputName(Args, Inputs));
3446a3ec60e0cf2a1916f479288998d31bd980b1a306Daniel Dunbar
3447a3ec60e0cf2a1916f479288998d31bd980b1a306Daniel Dunbar  Args.AddAllArgs(CmdArgs, options::OPT_d_Group);
3448a3ec60e0cf2a1916f479288998d31bd980b1a306Daniel Dunbar
3449a3ec60e0cf2a1916f479288998d31bd980b1a306Daniel Dunbar  Args.AddAllArgs(CmdArgs, options::OPT_m_Group);
3450a3ec60e0cf2a1916f479288998d31bd980b1a306Daniel Dunbar  Args.AddAllArgs(CmdArgs, options::OPT_a_Group);
3451a3ec60e0cf2a1916f479288998d31bd980b1a306Daniel Dunbar
3452a3ec60e0cf2a1916f479288998d31bd980b1a306Daniel Dunbar  // FIXME: The goal is to use the user provided -o if that is our
3453a3ec60e0cf2a1916f479288998d31bd980b1a306Daniel Dunbar  // final output, otherwise to drive from the original input
3454a3ec60e0cf2a1916f479288998d31bd980b1a306Daniel Dunbar  // name. Find a clean way to go about this.
3455a3ec60e0cf2a1916f479288998d31bd980b1a306Daniel Dunbar  if ((Args.hasArg(options::OPT_c) || Args.hasArg(options::OPT_S)) &&
3456a3ec60e0cf2a1916f479288998d31bd980b1a306Daniel Dunbar      Args.hasArg(options::OPT_o)) {
3457a3ec60e0cf2a1916f479288998d31bd980b1a306Daniel Dunbar    Arg *OutputOpt = Args.getLastArg(options::OPT_o);
3458a3ec60e0cf2a1916f479288998d31bd980b1a306Daniel Dunbar    CmdArgs.push_back("-auxbase-strip");
3459a3ec60e0cf2a1916f479288998d31bd980b1a306Daniel Dunbar    CmdArgs.push_back(OutputOpt->getValue(Args));
3460a3ec60e0cf2a1916f479288998d31bd980b1a306Daniel Dunbar  } else {
3461a3ec60e0cf2a1916f479288998d31bd980b1a306Daniel Dunbar    CmdArgs.push_back("-auxbase");
3462a5a7bd0de7b6b80212095195a055a4a43f21d4b2Daniel Dunbar    CmdArgs.push_back(darwin::CC1::getBaseInputStem(Args, Inputs));
3463a3ec60e0cf2a1916f479288998d31bd980b1a306Daniel Dunbar  }
3464a3ec60e0cf2a1916f479288998d31bd980b1a306Daniel Dunbar
3465a3ec60e0cf2a1916f479288998d31bd980b1a306Daniel Dunbar  Args.AddAllArgs(CmdArgs, options::OPT_g_Group);
3466a3ec60e0cf2a1916f479288998d31bd980b1a306Daniel Dunbar
3467a3ec60e0cf2a1916f479288998d31bd980b1a306Daniel Dunbar  Args.AddAllArgs(CmdArgs, options::OPT_O);
3468a3ec60e0cf2a1916f479288998d31bd980b1a306Daniel Dunbar  // FIXME: -Wall is getting some special treatment. Investigate.
3469a3ec60e0cf2a1916f479288998d31bd980b1a306Daniel Dunbar  Args.AddAllArgs(CmdArgs, options::OPT_W_Group, options::OPT_pedantic_Group);
3470a3ec60e0cf2a1916f479288998d31bd980b1a306Daniel Dunbar  Args.AddLastArg(CmdArgs, options::OPT_w);
3471c21c485b4fb58ef5d55cf3e523263dd824a2ace4Daniel Dunbar  Args.AddAllArgs(CmdArgs, options::OPT_std_EQ, options::OPT_ansi,
3472a3ec60e0cf2a1916f479288998d31bd980b1a306Daniel Dunbar                  options::OPT_trigraphs);
3473a3ff202ee4fb21728e930d5d029ba4925129912cDaniel Dunbar  if (!Args.getLastArg(options::OPT_std_EQ, options::OPT_ansi)) {
3474a3ff202ee4fb21728e930d5d029ba4925129912cDaniel Dunbar    // Honor -std-default.
3475a3ff202ee4fb21728e930d5d029ba4925129912cDaniel Dunbar    Args.AddAllArgsTranslated(CmdArgs, options::OPT_std_default_EQ,
3476a3ff202ee4fb21728e930d5d029ba4925129912cDaniel Dunbar                              "-std=", /*Joined=*/true);
3477a3ff202ee4fb21728e930d5d029ba4925129912cDaniel Dunbar  }
3478a3ff202ee4fb21728e930d5d029ba4925129912cDaniel Dunbar
3479a3ec60e0cf2a1916f479288998d31bd980b1a306Daniel Dunbar  if (Args.hasArg(options::OPT_v))
3480a3ec60e0cf2a1916f479288998d31bd980b1a306Daniel Dunbar    CmdArgs.push_back("-version");
3481bbe8e3eff56ac1d79f3668d706536e3cebe28c18Daniel Dunbar  if (Args.hasArg(options::OPT_pg) &&
3482bbe8e3eff56ac1d79f3668d706536e3cebe28c18Daniel Dunbar      getToolChain().SupportsProfiling())
3483a3ec60e0cf2a1916f479288998d31bd980b1a306Daniel Dunbar    CmdArgs.push_back("-p");
3484a3ec60e0cf2a1916f479288998d31bd980b1a306Daniel Dunbar  Args.AddLastArg(CmdArgs, options::OPT_p);
3485c21c485b4fb58ef5d55cf3e523263dd824a2ace4Daniel Dunbar
3486a3ec60e0cf2a1916f479288998d31bd980b1a306Daniel Dunbar  // The driver treats -fsyntax-only specially.
34872ba91575905a54f712a7f64304e56002e4882499Daniel Dunbar  if (getToolChain().getTriple().getArch() == llvm::Triple::arm ||
34882ba91575905a54f712a7f64304e56002e4882499Daniel Dunbar      getToolChain().getTriple().getArch() == llvm::Triple::thumb) {
34892ba91575905a54f712a7f64304e56002e4882499Daniel Dunbar    // Removes -fbuiltin-str{cat,cpy}; these aren't recognized by cc1 but are
34902ba91575905a54f712a7f64304e56002e4882499Daniel Dunbar    // used to inhibit the default -fno-builtin-str{cat,cpy}.
34912ba91575905a54f712a7f64304e56002e4882499Daniel Dunbar    //
34922ba91575905a54f712a7f64304e56002e4882499Daniel Dunbar    // FIXME: Should we grow a better way to deal with "removing" args?
3493cdd9686b890ebdc10039ae256ef4c9dfb5ebacb7Daniel Dunbar    for (arg_iterator it = Args.filtered_begin(options::OPT_f_Group,
3494cdd9686b890ebdc10039ae256ef4c9dfb5ebacb7Daniel Dunbar                                               options::OPT_fsyntax_only),
3495cdd9686b890ebdc10039ae256ef4c9dfb5ebacb7Daniel Dunbar           ie = Args.filtered_end(); it != ie; ++it) {
34967e4953e5c60409007545288f14b430bd23d68570Daniel Dunbar      if (!(*it)->getOption().matches(options::OPT_fbuiltin_strcat) &&
34977e4953e5c60409007545288f14b430bd23d68570Daniel Dunbar          !(*it)->getOption().matches(options::OPT_fbuiltin_strcpy)) {
34987e4953e5c60409007545288f14b430bd23d68570Daniel Dunbar        (*it)->claim();
34997e4953e5c60409007545288f14b430bd23d68570Daniel Dunbar        (*it)->render(Args, CmdArgs);
35002ba91575905a54f712a7f64304e56002e4882499Daniel Dunbar      }
35012ba91575905a54f712a7f64304e56002e4882499Daniel Dunbar    }
35022ba91575905a54f712a7f64304e56002e4882499Daniel Dunbar  } else
35032ba91575905a54f712a7f64304e56002e4882499Daniel Dunbar    Args.AddAllArgs(CmdArgs, options::OPT_f_Group, options::OPT_fsyntax_only);
3504c21c485b4fb58ef5d55cf3e523263dd824a2ace4Daniel Dunbar
3505089f872fedb175f7569f24f1dba362ffbc403528Daniel Dunbar  // Claim Clang only -f options, they aren't worth warning about.
3506089f872fedb175f7569f24f1dba362ffbc403528Daniel Dunbar  Args.ClaimAllArgs(options::OPT_f_clang_Group);
3507089f872fedb175f7569f24f1dba362ffbc403528Daniel Dunbar
3508a3ec60e0cf2a1916f479288998d31bd980b1a306Daniel Dunbar  Args.AddAllArgs(CmdArgs, options::OPT_undef);
3509a3ec60e0cf2a1916f479288998d31bd980b1a306Daniel Dunbar  if (Args.hasArg(options::OPT_Qn))
3510a3ec60e0cf2a1916f479288998d31bd980b1a306Daniel Dunbar    CmdArgs.push_back("-fno-ident");
3511c21c485b4fb58ef5d55cf3e523263dd824a2ace4Daniel Dunbar
3512a3ec60e0cf2a1916f479288998d31bd980b1a306Daniel Dunbar  // FIXME: This isn't correct.
3513a3ec60e0cf2a1916f479288998d31bd980b1a306Daniel Dunbar  //Args.AddLastArg(CmdArgs, options::OPT__help)
3514a3ec60e0cf2a1916f479288998d31bd980b1a306Daniel Dunbar  //Args.AddLastArg(CmdArgs, options::OPT__targetHelp)
3515a3ec60e0cf2a1916f479288998d31bd980b1a306Daniel Dunbar
3516a3ec60e0cf2a1916f479288998d31bd980b1a306Daniel Dunbar  CmdArgs.append(OutputArgs.begin(), OutputArgs.end());
3517a3ec60e0cf2a1916f479288998d31bd980b1a306Daniel Dunbar
3518a3ec60e0cf2a1916f479288998d31bd980b1a306Daniel Dunbar  // FIXME: Still don't get what is happening here. Investigate.
3519a3ec60e0cf2a1916f479288998d31bd980b1a306Daniel Dunbar  Args.AddAllArgs(CmdArgs, options::OPT__param);
3520a3ec60e0cf2a1916f479288998d31bd980b1a306Daniel Dunbar
3521a3ec60e0cf2a1916f479288998d31bd980b1a306Daniel Dunbar  if (Args.hasArg(options::OPT_fmudflap) ||
3522a3ec60e0cf2a1916f479288998d31bd980b1a306Daniel Dunbar      Args.hasArg(options::OPT_fmudflapth)) {
3523a3ec60e0cf2a1916f479288998d31bd980b1a306Daniel Dunbar    CmdArgs.push_back("-fno-builtin");
3524a3ec60e0cf2a1916f479288998d31bd980b1a306Daniel Dunbar    CmdArgs.push_back("-fno-merge-constants");
3525a3ec60e0cf2a1916f479288998d31bd980b1a306Daniel Dunbar  }
3526c21c485b4fb58ef5d55cf3e523263dd824a2ace4Daniel Dunbar
3527a3ec60e0cf2a1916f479288998d31bd980b1a306Daniel Dunbar  if (Args.hasArg(options::OPT_coverage)) {
3528a3ec60e0cf2a1916f479288998d31bd980b1a306Daniel Dunbar    CmdArgs.push_back("-fprofile-arcs");
3529a3ec60e0cf2a1916f479288998d31bd980b1a306Daniel Dunbar    CmdArgs.push_back("-ftest-coverage");
3530a3ec60e0cf2a1916f479288998d31bd980b1a306Daniel Dunbar  }
3531a3ec60e0cf2a1916f479288998d31bd980b1a306Daniel Dunbar
3532a3ec60e0cf2a1916f479288998d31bd980b1a306Daniel Dunbar  if (types::isCXX(Inputs[0].getType()))
3533a3ec60e0cf2a1916f479288998d31bd980b1a306Daniel Dunbar    CmdArgs.push_back("-D__private_extern__=extern");
3534a3ec60e0cf2a1916f479288998d31bd980b1a306Daniel Dunbar}
3535a3ec60e0cf2a1916f479288998d31bd980b1a306Daniel Dunbar
3536a3ec60e0cf2a1916f479288998d31bd980b1a306Daniel Dunbarvoid darwin::CC1::AddCPPOptionsArgs(const ArgList &Args, ArgStringList &CmdArgs,
3537a3ec60e0cf2a1916f479288998d31bd980b1a306Daniel Dunbar                                    const InputInfoList &Inputs,
3538a3ec60e0cf2a1916f479288998d31bd980b1a306Daniel Dunbar                                    const ArgStringList &OutputArgs) const {
3539a3ec60e0cf2a1916f479288998d31bd980b1a306Daniel Dunbar  // Derived from cpp_options
3540a3ec60e0cf2a1916f479288998d31bd980b1a306Daniel Dunbar  AddCPPUniqueOptionsArgs(Args, CmdArgs, Inputs);
3541c21c485b4fb58ef5d55cf3e523263dd824a2ace4Daniel Dunbar
3542a3ec60e0cf2a1916f479288998d31bd980b1a306Daniel Dunbar  CmdArgs.append(OutputArgs.begin(), OutputArgs.end());
3543a3ec60e0cf2a1916f479288998d31bd980b1a306Daniel Dunbar
3544a3ec60e0cf2a1916f479288998d31bd980b1a306Daniel Dunbar  AddCC1Args(Args, CmdArgs);
3545a3ec60e0cf2a1916f479288998d31bd980b1a306Daniel Dunbar
3546a3ec60e0cf2a1916f479288998d31bd980b1a306Daniel Dunbar  // NOTE: The code below has some commonality with cpp_options, but
3547a3ec60e0cf2a1916f479288998d31bd980b1a306Daniel Dunbar  // in classic gcc style ends up sending things in different
3548a3ec60e0cf2a1916f479288998d31bd980b1a306Daniel Dunbar  // orders. This may be a good merge candidate once we drop pedantic
3549a3ec60e0cf2a1916f479288998d31bd980b1a306Daniel Dunbar  // compatibility.
3550a3ec60e0cf2a1916f479288998d31bd980b1a306Daniel Dunbar
3551a3ec60e0cf2a1916f479288998d31bd980b1a306Daniel Dunbar  Args.AddAllArgs(CmdArgs, options::OPT_m_Group);
3552c21c485b4fb58ef5d55cf3e523263dd824a2ace4Daniel Dunbar  Args.AddAllArgs(CmdArgs, options::OPT_std_EQ, options::OPT_ansi,
3553a3ec60e0cf2a1916f479288998d31bd980b1a306Daniel Dunbar                  options::OPT_trigraphs);
3554a3ff202ee4fb21728e930d5d029ba4925129912cDaniel Dunbar  if (!Args.getLastArg(options::OPT_std_EQ, options::OPT_ansi)) {
3555a3ff202ee4fb21728e930d5d029ba4925129912cDaniel Dunbar    // Honor -std-default.
3556a3ff202ee4fb21728e930d5d029ba4925129912cDaniel Dunbar    Args.AddAllArgsTranslated(CmdArgs, options::OPT_std_default_EQ,
3557a3ff202ee4fb21728e930d5d029ba4925129912cDaniel Dunbar                              "-std=", /*Joined=*/true);
3558a3ff202ee4fb21728e930d5d029ba4925129912cDaniel Dunbar  }
3559a3ec60e0cf2a1916f479288998d31bd980b1a306Daniel Dunbar  Args.AddAllArgs(CmdArgs, options::OPT_W_Group, options::OPT_pedantic_Group);
3560a3ec60e0cf2a1916f479288998d31bd980b1a306Daniel Dunbar  Args.AddLastArg(CmdArgs, options::OPT_w);
3561c21c485b4fb58ef5d55cf3e523263dd824a2ace4Daniel Dunbar
3562a3ec60e0cf2a1916f479288998d31bd980b1a306Daniel Dunbar  // The driver treats -fsyntax-only specially.
3563a3ec60e0cf2a1916f479288998d31bd980b1a306Daniel Dunbar  Args.AddAllArgs(CmdArgs, options::OPT_f_Group, options::OPT_fsyntax_only);
3564a3ec60e0cf2a1916f479288998d31bd980b1a306Daniel Dunbar
3565089f872fedb175f7569f24f1dba362ffbc403528Daniel Dunbar  // Claim Clang only -f options, they aren't worth warning about.
3566089f872fedb175f7569f24f1dba362ffbc403528Daniel Dunbar  Args.ClaimAllArgs(options::OPT_f_clang_Group);
3567089f872fedb175f7569f24f1dba362ffbc403528Daniel Dunbar
3568a3ec60e0cf2a1916f479288998d31bd980b1a306Daniel Dunbar  if (Args.hasArg(options::OPT_g_Group) && !Args.hasArg(options::OPT_g0) &&
3569a3ec60e0cf2a1916f479288998d31bd980b1a306Daniel Dunbar      !Args.hasArg(options::OPT_fno_working_directory))
3570a3ec60e0cf2a1916f479288998d31bd980b1a306Daniel Dunbar    CmdArgs.push_back("-fworking-directory");
3571a3ec60e0cf2a1916f479288998d31bd980b1a306Daniel Dunbar
3572a3ec60e0cf2a1916f479288998d31bd980b1a306Daniel Dunbar  Args.AddAllArgs(CmdArgs, options::OPT_O);
3573a3ec60e0cf2a1916f479288998d31bd980b1a306Daniel Dunbar  Args.AddAllArgs(CmdArgs, options::OPT_undef);
3574a3ec60e0cf2a1916f479288998d31bd980b1a306Daniel Dunbar  if (Args.hasArg(options::OPT_save_temps))
3575a3ec60e0cf2a1916f479288998d31bd980b1a306Daniel Dunbar    CmdArgs.push_back("-fpch-preprocess");
3576a3ec60e0cf2a1916f479288998d31bd980b1a306Daniel Dunbar}
3577a3ec60e0cf2a1916f479288998d31bd980b1a306Daniel Dunbar
3578c21c485b4fb58ef5d55cf3e523263dd824a2ace4Daniel Dunbarvoid darwin::CC1::AddCPPUniqueOptionsArgs(const ArgList &Args,
3579a3ec60e0cf2a1916f479288998d31bd980b1a306Daniel Dunbar                                          ArgStringList &CmdArgs,
35801eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump                                          const InputInfoList &Inputs) const {
3581ee788e70fcd0adf76103b17c78ac658d4ea30c9bDaniel Dunbar  const Driver &D = getToolChain().getDriver();
3582a3ec60e0cf2a1916f479288998d31bd980b1a306Daniel Dunbar
358388a3d6cf5ebab81614f89ba48a8d89023270637aDaniel Dunbar  CheckPreprocessingOptions(D, Args);
358488a3d6cf5ebab81614f89ba48a8d89023270637aDaniel Dunbar
3585a3ec60e0cf2a1916f479288998d31bd980b1a306Daniel Dunbar  // Derived from cpp_unique_options.
358688a3d6cf5ebab81614f89ba48a8d89023270637aDaniel Dunbar  // -{C,CC} only with -E is checked in CheckPreprocessingOptions().
358788a3d6cf5ebab81614f89ba48a8d89023270637aDaniel Dunbar  Args.AddLastArg(CmdArgs, options::OPT_C);
358888a3d6cf5ebab81614f89ba48a8d89023270637aDaniel Dunbar  Args.AddLastArg(CmdArgs, options::OPT_CC);
3589a3ec60e0cf2a1916f479288998d31bd980b1a306Daniel Dunbar  if (!Args.hasArg(options::OPT_Q))
3590a3ec60e0cf2a1916f479288998d31bd980b1a306Daniel Dunbar    CmdArgs.push_back("-quiet");
3591a3ec60e0cf2a1916f479288998d31bd980b1a306Daniel Dunbar  Args.AddAllArgs(CmdArgs, options::OPT_nostdinc);
35924c2bcad7b843c10fd4a2ffd43da40bfefb4dc8baDouglas Gregor  Args.AddAllArgs(CmdArgs, options::OPT_nostdincxx);
3593a3ec60e0cf2a1916f479288998d31bd980b1a306Daniel Dunbar  Args.AddLastArg(CmdArgs, options::OPT_v);
3594a3ec60e0cf2a1916f479288998d31bd980b1a306Daniel Dunbar  Args.AddAllArgs(CmdArgs, options::OPT_I_Group, options::OPT_F);
3595a3ec60e0cf2a1916f479288998d31bd980b1a306Daniel Dunbar  Args.AddLastArg(CmdArgs, options::OPT_P);
3596a3ec60e0cf2a1916f479288998d31bd980b1a306Daniel Dunbar
3597a3ec60e0cf2a1916f479288998d31bd980b1a306Daniel Dunbar  // FIXME: Handle %I properly.
3598a3ec60e0cf2a1916f479288998d31bd980b1a306Daniel Dunbar  if (getToolChain().getArchName() == "x86_64") {
3599a3ec60e0cf2a1916f479288998d31bd980b1a306Daniel Dunbar    CmdArgs.push_back("-imultilib");
3600a3ec60e0cf2a1916f479288998d31bd980b1a306Daniel Dunbar    CmdArgs.push_back("x86_64");
3601a3ec60e0cf2a1916f479288998d31bd980b1a306Daniel Dunbar  }
3602a3ec60e0cf2a1916f479288998d31bd980b1a306Daniel Dunbar
3603a3ec60e0cf2a1916f479288998d31bd980b1a306Daniel Dunbar  if (Args.hasArg(options::OPT_MD)) {
3604a3ec60e0cf2a1916f479288998d31bd980b1a306Daniel Dunbar    CmdArgs.push_back("-MD");
3605a5a7bd0de7b6b80212095195a055a4a43f21d4b2Daniel Dunbar    CmdArgs.push_back(darwin::CC1::getDependencyFileName(Args, Inputs));
3606a3ec60e0cf2a1916f479288998d31bd980b1a306Daniel Dunbar  }
3607a3ec60e0cf2a1916f479288998d31bd980b1a306Daniel Dunbar
3608a3ec60e0cf2a1916f479288998d31bd980b1a306Daniel Dunbar  if (Args.hasArg(options::OPT_MMD)) {
3609a3ec60e0cf2a1916f479288998d31bd980b1a306Daniel Dunbar    CmdArgs.push_back("-MMD");
3610a5a7bd0de7b6b80212095195a055a4a43f21d4b2Daniel Dunbar    CmdArgs.push_back(darwin::CC1::getDependencyFileName(Args, Inputs));
3611a3ec60e0cf2a1916f479288998d31bd980b1a306Daniel Dunbar  }
3612a3ec60e0cf2a1916f479288998d31bd980b1a306Daniel Dunbar
3613a3ec60e0cf2a1916f479288998d31bd980b1a306Daniel Dunbar  Args.AddLastArg(CmdArgs, options::OPT_M);
3614a3ec60e0cf2a1916f479288998d31bd980b1a306Daniel Dunbar  Args.AddLastArg(CmdArgs, options::OPT_MM);
3615a3ec60e0cf2a1916f479288998d31bd980b1a306Daniel Dunbar  Args.AddAllArgs(CmdArgs, options::OPT_MF);
3616a3ec60e0cf2a1916f479288998d31bd980b1a306Daniel Dunbar  Args.AddLastArg(CmdArgs, options::OPT_MG);
3617a3ec60e0cf2a1916f479288998d31bd980b1a306Daniel Dunbar  Args.AddLastArg(CmdArgs, options::OPT_MP);
3618a3ec60e0cf2a1916f479288998d31bd980b1a306Daniel Dunbar  Args.AddAllArgs(CmdArgs, options::OPT_MQ);
3619a3ec60e0cf2a1916f479288998d31bd980b1a306Daniel Dunbar  Args.AddAllArgs(CmdArgs, options::OPT_MT);
3620a3ec60e0cf2a1916f479288998d31bd980b1a306Daniel Dunbar  if (!Args.hasArg(options::OPT_M) && !Args.hasArg(options::OPT_MM) &&
3621a3ec60e0cf2a1916f479288998d31bd980b1a306Daniel Dunbar      (Args.hasArg(options::OPT_MD) || Args.hasArg(options::OPT_MMD))) {
3622a3ec60e0cf2a1916f479288998d31bd980b1a306Daniel Dunbar    if (Arg *OutputOpt = Args.getLastArg(options::OPT_o)) {
3623a3ec60e0cf2a1916f479288998d31bd980b1a306Daniel Dunbar      CmdArgs.push_back("-MQ");
3624a3ec60e0cf2a1916f479288998d31bd980b1a306Daniel Dunbar      CmdArgs.push_back(OutputOpt->getValue(Args));
3625a3ec60e0cf2a1916f479288998d31bd980b1a306Daniel Dunbar    }
3626a3ec60e0cf2a1916f479288998d31bd980b1a306Daniel Dunbar  }
3627a3ec60e0cf2a1916f479288998d31bd980b1a306Daniel Dunbar
3628a3ec60e0cf2a1916f479288998d31bd980b1a306Daniel Dunbar  Args.AddLastArg(CmdArgs, options::OPT_remap);
3629a3ec60e0cf2a1916f479288998d31bd980b1a306Daniel Dunbar  if (Args.hasArg(options::OPT_g3))
3630a3ec60e0cf2a1916f479288998d31bd980b1a306Daniel Dunbar    CmdArgs.push_back("-dD");
3631a3ec60e0cf2a1916f479288998d31bd980b1a306Daniel Dunbar  Args.AddLastArg(CmdArgs, options::OPT_H);
3632a3ec60e0cf2a1916f479288998d31bd980b1a306Daniel Dunbar
3633a3ec60e0cf2a1916f479288998d31bd980b1a306Daniel Dunbar  AddCPPArgs(Args, CmdArgs);
3634a3ec60e0cf2a1916f479288998d31bd980b1a306Daniel Dunbar
3635a3ec60e0cf2a1916f479288998d31bd980b1a306Daniel Dunbar  Args.AddAllArgs(CmdArgs, options::OPT_D, options::OPT_U, options::OPT_A);
3636a3ec60e0cf2a1916f479288998d31bd980b1a306Daniel Dunbar  Args.AddAllArgs(CmdArgs, options::OPT_i_Group);
3637a3ec60e0cf2a1916f479288998d31bd980b1a306Daniel Dunbar
3638a3ec60e0cf2a1916f479288998d31bd980b1a306Daniel Dunbar  for (InputInfoList::const_iterator
3639a3ec60e0cf2a1916f479288998d31bd980b1a306Daniel Dunbar         it = Inputs.begin(), ie = Inputs.end(); it != ie; ++it) {
3640a3ec60e0cf2a1916f479288998d31bd980b1a306Daniel Dunbar    const InputInfo &II = *it;
3641c21c485b4fb58ef5d55cf3e523263dd824a2ace4Daniel Dunbar
36427c1e46533cae07216e2a67d5636a5afb44253155Daniel Dunbar    CmdArgs.push_back(II.getFilename());
3643a3ec60e0cf2a1916f479288998d31bd980b1a306Daniel Dunbar  }
3644a3ec60e0cf2a1916f479288998d31bd980b1a306Daniel Dunbar
3645a3ec60e0cf2a1916f479288998d31bd980b1a306Daniel Dunbar  Args.AddAllArgValues(CmdArgs, options::OPT_Wp_COMMA,
3646a3ec60e0cf2a1916f479288998d31bd980b1a306Daniel Dunbar                       options::OPT_Xpreprocessor);
3647a3ec60e0cf2a1916f479288998d31bd980b1a306Daniel Dunbar
3648a3ec60e0cf2a1916f479288998d31bd980b1a306Daniel Dunbar  if (Args.hasArg(options::OPT_fmudflap)) {
3649a3ec60e0cf2a1916f479288998d31bd980b1a306Daniel Dunbar    CmdArgs.push_back("-D_MUDFLAP");
3650a3ec60e0cf2a1916f479288998d31bd980b1a306Daniel Dunbar    CmdArgs.push_back("-include");
3651a3ec60e0cf2a1916f479288998d31bd980b1a306Daniel Dunbar    CmdArgs.push_back("mf-runtime.h");
3652a3ec60e0cf2a1916f479288998d31bd980b1a306Daniel Dunbar  }
3653a3ec60e0cf2a1916f479288998d31bd980b1a306Daniel Dunbar
3654a3ec60e0cf2a1916f479288998d31bd980b1a306Daniel Dunbar  if (Args.hasArg(options::OPT_fmudflapth)) {
3655a3ec60e0cf2a1916f479288998d31bd980b1a306Daniel Dunbar    CmdArgs.push_back("-D_MUDFLAP");
3656a3ec60e0cf2a1916f479288998d31bd980b1a306Daniel Dunbar    CmdArgs.push_back("-D_MUDFLAPTH");
3657a3ec60e0cf2a1916f479288998d31bd980b1a306Daniel Dunbar    CmdArgs.push_back("-include");
3658a3ec60e0cf2a1916f479288998d31bd980b1a306Daniel Dunbar    CmdArgs.push_back("mf-runtime.h");
3659a3ec60e0cf2a1916f479288998d31bd980b1a306Daniel Dunbar  }
3660a3ec60e0cf2a1916f479288998d31bd980b1a306Daniel Dunbar}
3661a3ec60e0cf2a1916f479288998d31bd980b1a306Daniel Dunbar
3662c21c485b4fb58ef5d55cf3e523263dd824a2ace4Daniel Dunbarvoid darwin::CC1::AddCPPArgs(const ArgList &Args,
3663a3ec60e0cf2a1916f479288998d31bd980b1a306Daniel Dunbar                             ArgStringList &CmdArgs) const {
3664a3ec60e0cf2a1916f479288998d31bd980b1a306Daniel Dunbar  // Derived from cpp spec.
3665a3ec60e0cf2a1916f479288998d31bd980b1a306Daniel Dunbar
3666a3ec60e0cf2a1916f479288998d31bd980b1a306Daniel Dunbar  if (Args.hasArg(options::OPT_static)) {
3667a3ec60e0cf2a1916f479288998d31bd980b1a306Daniel Dunbar    // The gcc spec is broken here, it refers to dynamic but
3668a3ec60e0cf2a1916f479288998d31bd980b1a306Daniel Dunbar    // that has been translated. Start by being bug compatible.
3669c21c485b4fb58ef5d55cf3e523263dd824a2ace4Daniel Dunbar
3670a3ec60e0cf2a1916f479288998d31bd980b1a306Daniel Dunbar    // if (!Args.hasArg(arglist.parser.dynamicOption))
3671a3ec60e0cf2a1916f479288998d31bd980b1a306Daniel Dunbar    CmdArgs.push_back("-D__STATIC__");
3672a3ec60e0cf2a1916f479288998d31bd980b1a306Daniel Dunbar  } else
3673a3ec60e0cf2a1916f479288998d31bd980b1a306Daniel Dunbar    CmdArgs.push_back("-D__DYNAMIC__");
3674a3ec60e0cf2a1916f479288998d31bd980b1a306Daniel Dunbar
3675a3ec60e0cf2a1916f479288998d31bd980b1a306Daniel Dunbar  if (Args.hasArg(options::OPT_pthread))
3676a3ec60e0cf2a1916f479288998d31bd980b1a306Daniel Dunbar    CmdArgs.push_back("-D_REENTRANT");
3677a3ec60e0cf2a1916f479288998d31bd980b1a306Daniel Dunbar}
3678a3ec60e0cf2a1916f479288998d31bd980b1a306Daniel Dunbar
367940f1265ebd42ece3e7f7917319b56012e8e2bce2Daniel Dunbarvoid darwin::Preprocess::ConstructJob(Compilation &C, const JobAction &JA,
36802fe238ed293bd4bc27af9beb9fa151fad2146fa8Daniel Dunbar                                      const InputInfo &Output,
3681c21c485b4fb58ef5d55cf3e523263dd824a2ace4Daniel Dunbar                                      const InputInfoList &Inputs,
3682c21c485b4fb58ef5d55cf3e523263dd824a2ace4Daniel Dunbar                                      const ArgList &Args,
368340f1265ebd42ece3e7f7917319b56012e8e2bce2Daniel Dunbar                                      const char *LinkingOutput) const {
368440f1265ebd42ece3e7f7917319b56012e8e2bce2Daniel Dunbar  ArgStringList CmdArgs;
368540f1265ebd42ece3e7f7917319b56012e8e2bce2Daniel Dunbar
368640f1265ebd42ece3e7f7917319b56012e8e2bce2Daniel Dunbar  assert(Inputs.size() == 1 && "Unexpected number of inputs!");
368740f1265ebd42ece3e7f7917319b56012e8e2bce2Daniel Dunbar
368840f1265ebd42ece3e7f7917319b56012e8e2bce2Daniel Dunbar  CmdArgs.push_back("-E");
368940f1265ebd42ece3e7f7917319b56012e8e2bce2Daniel Dunbar
369040f1265ebd42ece3e7f7917319b56012e8e2bce2Daniel Dunbar  if (Args.hasArg(options::OPT_traditional) ||
369140f1265ebd42ece3e7f7917319b56012e8e2bce2Daniel Dunbar      Args.hasArg(options::OPT_traditional_cpp))
369240f1265ebd42ece3e7f7917319b56012e8e2bce2Daniel Dunbar    CmdArgs.push_back("-traditional-cpp");
3693c21c485b4fb58ef5d55cf3e523263dd824a2ace4Daniel Dunbar
369440f1265ebd42ece3e7f7917319b56012e8e2bce2Daniel Dunbar  ArgStringList OutputArgs;
36957c1e46533cae07216e2a67d5636a5afb44253155Daniel Dunbar  assert(Output.isFilename() && "Unexpected CC1 output.");
36967c1e46533cae07216e2a67d5636a5afb44253155Daniel Dunbar  OutputArgs.push_back("-o");
36977c1e46533cae07216e2a67d5636a5afb44253155Daniel Dunbar  OutputArgs.push_back(Output.getFilename());
369840f1265ebd42ece3e7f7917319b56012e8e2bce2Daniel Dunbar
36999ade4ae4fb7ed1fcbd63835d9f8f53052f0657a2Joerg Sonnenberger  if (Args.hasArg(options::OPT_E) || getToolChain().getDriver().CCCIsCPP) {
37009120f179fd2e354f067e4ef2c76dcf3fc4db8a16Daniel Dunbar    AddCPPOptionsArgs(Args, CmdArgs, Inputs, OutputArgs);
37019120f179fd2e354f067e4ef2c76dcf3fc4db8a16Daniel Dunbar  } else {
37029120f179fd2e354f067e4ef2c76dcf3fc4db8a16Daniel Dunbar    AddCPPOptionsArgs(Args, CmdArgs, Inputs, ArgStringList());
37039120f179fd2e354f067e4ef2c76dcf3fc4db8a16Daniel Dunbar    CmdArgs.append(OutputArgs.begin(), OutputArgs.end());
37049120f179fd2e354f067e4ef2c76dcf3fc4db8a16Daniel Dunbar  }
3705c21c485b4fb58ef5d55cf3e523263dd824a2ace4Daniel Dunbar
37068a2073a85670a13b0bcc1726bc7f80d458f8245bDaniel Dunbar  Args.AddAllArgs(CmdArgs, options::OPT_d_Group);
37078a2073a85670a13b0bcc1726bc7f80d458f8245bDaniel Dunbar
37084fe4d73bce7aba5446dcbfa36ee8782c6d496710Chad Rosier  RemoveCC1UnsupportedArgs(CmdArgs);
37094fe4d73bce7aba5446dcbfa36ee8782c6d496710Chad Rosier
371040f1265ebd42ece3e7f7917319b56012e8e2bce2Daniel Dunbar  const char *CC1Name = getCC1Name(Inputs[0].getType());
3711c21c485b4fb58ef5d55cf3e523263dd824a2ace4Daniel Dunbar  const char *Exec =
37124a7e88978cf646ad10d654020cb00b3877069210Daniel Dunbar    Args.MakeArgString(getToolChain().GetProgramPath(CC1Name));
37132fe238ed293bd4bc27af9beb9fa151fad2146fa8Daniel Dunbar  C.addCommand(new Command(JA, *this, Exec, CmdArgs));
371440f1265ebd42ece3e7f7917319b56012e8e2bce2Daniel Dunbar}
371540f1265ebd42ece3e7f7917319b56012e8e2bce2Daniel Dunbar
371640f1265ebd42ece3e7f7917319b56012e8e2bce2Daniel Dunbarvoid darwin::Compile::ConstructJob(Compilation &C, const JobAction &JA,
37172fe238ed293bd4bc27af9beb9fa151fad2146fa8Daniel Dunbar                                   const InputInfo &Output,
3718c21c485b4fb58ef5d55cf3e523263dd824a2ace4Daniel Dunbar                                   const InputInfoList &Inputs,
3719c21c485b4fb58ef5d55cf3e523263dd824a2ace4Daniel Dunbar                                   const ArgList &Args,
372040f1265ebd42ece3e7f7917319b56012e8e2bce2Daniel Dunbar                                   const char *LinkingOutput) const {
3721ee788e70fcd0adf76103b17c78ac658d4ea30c9bDaniel Dunbar  const Driver &D = getToolChain().getDriver();
372240f1265ebd42ece3e7f7917319b56012e8e2bce2Daniel Dunbar  ArgStringList CmdArgs;
372340f1265ebd42ece3e7f7917319b56012e8e2bce2Daniel Dunbar
372440f1265ebd42ece3e7f7917319b56012e8e2bce2Daniel Dunbar  assert(Inputs.size() == 1 && "Unexpected number of inputs!");
372540f1265ebd42ece3e7f7917319b56012e8e2bce2Daniel Dunbar
3726651f3d44dbae18c74c5f475d7a601d65b07b45c4Bob Wilson  // Silence warning about unused --serialize-diagnostics
3727651f3d44dbae18c74c5f475d7a601d65b07b45c4Bob Wilson  Args.ClaimAllArgs(options::OPT__serialize_diags);
3728651f3d44dbae18c74c5f475d7a601d65b07b45c4Bob Wilson
372940f1265ebd42ece3e7f7917319b56012e8e2bce2Daniel Dunbar  types::ID InputType = Inputs[0].getType();
3730d624a5b43a970bd3102d7075baeea89b8ca336a4David Blaikie  if (const Arg *A = Args.getLastArg(options::OPT_traditional))
37315f9e272e632e951b1efe824cd16acb4d96077930Chris Lattner    D.Diag(diag::err_drv_argument_only_allowed_with)
373240f1265ebd42ece3e7f7917319b56012e8e2bce2Daniel Dunbar      << A->getAsString(Args) << "-E";
373340f1265ebd42ece3e7f7917319b56012e8e2bce2Daniel Dunbar
37346c6424bc0d3b5f080a97b5f6ef4a8d70c38e38f5Daniel Dunbar  if (JA.getType() == types::TY_LLVM_IR ||
37356c6424bc0d3b5f080a97b5f6ef4a8d70c38e38f5Daniel Dunbar      JA.getType() == types::TY_LTO_IR)
373640f1265ebd42ece3e7f7917319b56012e8e2bce2Daniel Dunbar    CmdArgs.push_back("-emit-llvm");
37376c6424bc0d3b5f080a97b5f6ef4a8d70c38e38f5Daniel Dunbar  else if (JA.getType() == types::TY_LLVM_BC ||
37386c6424bc0d3b5f080a97b5f6ef4a8d70c38e38f5Daniel Dunbar           JA.getType() == types::TY_LTO_BC)
373940f1265ebd42ece3e7f7917319b56012e8e2bce2Daniel Dunbar    CmdArgs.push_back("-emit-llvm-bc");
37405915fbf310e171c4cd3c2af05e9de360c0fa988aDaniel Dunbar  else if (Output.getType() == types::TY_AST)
37415f9e272e632e951b1efe824cd16acb4d96077930Chris Lattner    D.Diag(diag::err_drv_no_ast_support)
3742881376467c46c5c6cc16fa6790271c2c22e1d4f1Daniel Dunbar      << getToolChain().getTripleString();
3743ae24a88655c461e751d0984cc21dda6e17882356Daniel Dunbar  else if (JA.getType() != types::TY_PP_Asm &&
3744ae24a88655c461e751d0984cc21dda6e17882356Daniel Dunbar           JA.getType() != types::TY_PCH)
37455f9e272e632e951b1efe824cd16acb4d96077930Chris Lattner    D.Diag(diag::err_drv_invalid_gcc_output_type)
374664952508c2b0c8bffb45c8b410f0af3d2457f59bDaniel Dunbar      << getTypeName(JA.getType());
374740f1265ebd42ece3e7f7917319b56012e8e2bce2Daniel Dunbar
374840f1265ebd42ece3e7f7917319b56012e8e2bce2Daniel Dunbar  ArgStringList OutputArgs;
374940f1265ebd42ece3e7f7917319b56012e8e2bce2Daniel Dunbar  if (Output.getType() != types::TY_PCH) {
375040f1265ebd42ece3e7f7917319b56012e8e2bce2Daniel Dunbar    OutputArgs.push_back("-o");
37517c1e46533cae07216e2a67d5636a5afb44253155Daniel Dunbar    if (Output.isNothing())
375240f1265ebd42ece3e7f7917319b56012e8e2bce2Daniel Dunbar      OutputArgs.push_back("/dev/null");
375340f1265ebd42ece3e7f7917319b56012e8e2bce2Daniel Dunbar    else
375440f1265ebd42ece3e7f7917319b56012e8e2bce2Daniel Dunbar      OutputArgs.push_back(Output.getFilename());
375540f1265ebd42ece3e7f7917319b56012e8e2bce2Daniel Dunbar  }
375640f1265ebd42ece3e7f7917319b56012e8e2bce2Daniel Dunbar
375740f1265ebd42ece3e7f7917319b56012e8e2bce2Daniel Dunbar  // There is no need for this level of compatibility, but it makes
375840f1265ebd42ece3e7f7917319b56012e8e2bce2Daniel Dunbar  // diffing easier.
375940f1265ebd42ece3e7f7917319b56012e8e2bce2Daniel Dunbar  bool OutputArgsEarly = (Args.hasArg(options::OPT_fsyntax_only) ||
376040f1265ebd42ece3e7f7917319b56012e8e2bce2Daniel Dunbar                          Args.hasArg(options::OPT_S));
376140f1265ebd42ece3e7f7917319b56012e8e2bce2Daniel Dunbar
376240f1265ebd42ece3e7f7917319b56012e8e2bce2Daniel Dunbar  if (types::getPreprocessedType(InputType) != types::TY_INVALID) {
3763a3ec60e0cf2a1916f479288998d31bd980b1a306Daniel Dunbar    AddCPPUniqueOptionsArgs(Args, CmdArgs, Inputs);
376440f1265ebd42ece3e7f7917319b56012e8e2bce2Daniel Dunbar    if (OutputArgsEarly) {
376540f1265ebd42ece3e7f7917319b56012e8e2bce2Daniel Dunbar      AddCC1OptionsArgs(Args, CmdArgs, Inputs, OutputArgs);
376640f1265ebd42ece3e7f7917319b56012e8e2bce2Daniel Dunbar    } else {
376740f1265ebd42ece3e7f7917319b56012e8e2bce2Daniel Dunbar      AddCC1OptionsArgs(Args, CmdArgs, Inputs, ArgStringList());
376840f1265ebd42ece3e7f7917319b56012e8e2bce2Daniel Dunbar      CmdArgs.append(OutputArgs.begin(), OutputArgs.end());
376940f1265ebd42ece3e7f7917319b56012e8e2bce2Daniel Dunbar    }
377040f1265ebd42ece3e7f7917319b56012e8e2bce2Daniel Dunbar  } else {
377140f1265ebd42ece3e7f7917319b56012e8e2bce2Daniel Dunbar    CmdArgs.push_back("-fpreprocessed");
3772c21c485b4fb58ef5d55cf3e523263dd824a2ace4Daniel Dunbar
377340f1265ebd42ece3e7f7917319b56012e8e2bce2Daniel Dunbar    for (InputInfoList::const_iterator
377440f1265ebd42ece3e7f7917319b56012e8e2bce2Daniel Dunbar           it = Inputs.begin(), ie = Inputs.end(); it != ie; ++it) {
377540f1265ebd42ece3e7f7917319b56012e8e2bce2Daniel Dunbar      const InputInfo &II = *it;
377640f1265ebd42ece3e7f7917319b56012e8e2bce2Daniel Dunbar
37775915fbf310e171c4cd3c2af05e9de360c0fa988aDaniel Dunbar      // Reject AST inputs.
37785915fbf310e171c4cd3c2af05e9de360c0fa988aDaniel Dunbar      if (II.getType() == types::TY_AST) {
37795f9e272e632e951b1efe824cd16acb4d96077930Chris Lattner        D.Diag(diag::err_drv_no_ast_support)
3780881376467c46c5c6cc16fa6790271c2c22e1d4f1Daniel Dunbar          << getToolChain().getTripleString();
37815915fbf310e171c4cd3c2af05e9de360c0fa988aDaniel Dunbar        return;
37825915fbf310e171c4cd3c2af05e9de360c0fa988aDaniel Dunbar      }
37835915fbf310e171c4cd3c2af05e9de360c0fa988aDaniel Dunbar
37847c1e46533cae07216e2a67d5636a5afb44253155Daniel Dunbar      CmdArgs.push_back(II.getFilename());
378540f1265ebd42ece3e7f7917319b56012e8e2bce2Daniel Dunbar    }
378640f1265ebd42ece3e7f7917319b56012e8e2bce2Daniel Dunbar
378740f1265ebd42ece3e7f7917319b56012e8e2bce2Daniel Dunbar    if (OutputArgsEarly) {
378840f1265ebd42ece3e7f7917319b56012e8e2bce2Daniel Dunbar      AddCC1OptionsArgs(Args, CmdArgs, Inputs, OutputArgs);
378940f1265ebd42ece3e7f7917319b56012e8e2bce2Daniel Dunbar    } else {
379040f1265ebd42ece3e7f7917319b56012e8e2bce2Daniel Dunbar      AddCC1OptionsArgs(Args, CmdArgs, Inputs, ArgStringList());
379140f1265ebd42ece3e7f7917319b56012e8e2bce2Daniel Dunbar      CmdArgs.append(OutputArgs.begin(), OutputArgs.end());
379240f1265ebd42ece3e7f7917319b56012e8e2bce2Daniel Dunbar    }
379340f1265ebd42ece3e7f7917319b56012e8e2bce2Daniel Dunbar  }
3794c21c485b4fb58ef5d55cf3e523263dd824a2ace4Daniel Dunbar
379540f1265ebd42ece3e7f7917319b56012e8e2bce2Daniel Dunbar  if (Output.getType() == types::TY_PCH) {
379640f1265ebd42ece3e7f7917319b56012e8e2bce2Daniel Dunbar    assert(Output.isFilename() && "Invalid PCH output.");
379740f1265ebd42ece3e7f7917319b56012e8e2bce2Daniel Dunbar
379840f1265ebd42ece3e7f7917319b56012e8e2bce2Daniel Dunbar    CmdArgs.push_back("-o");
379940f1265ebd42ece3e7f7917319b56012e8e2bce2Daniel Dunbar    // NOTE: gcc uses a temp .s file for this, but there doesn't seem
380040f1265ebd42ece3e7f7917319b56012e8e2bce2Daniel Dunbar    // to be a good reason.
38018c221b84caff1f10ef4aad5c6ff77d36633f607cChad Rosier    const char *TmpPath = C.getArgs().MakeArgString(
3802fe87fc73c0091a8d6ba04b7e3b5f144d4a0517a3Chad Rosier      D.GetTemporaryPath("cc", "s"));
38038c221b84caff1f10ef4aad5c6ff77d36633f607cChad Rosier    C.addTempFile(TmpPath);
38048c221b84caff1f10ef4aad5c6ff77d36633f607cChad Rosier    CmdArgs.push_back(TmpPath);
3805c21c485b4fb58ef5d55cf3e523263dd824a2ace4Daniel Dunbar
380688b7cf00fcb582728c642da3927c59468efaf926Eric Christopher    // If we're emitting a pch file with the last 4 characters of ".pth"
380788b7cf00fcb582728c642da3927c59468efaf926Eric Christopher    // and falling back to llvm-gcc we want to use ".gch" instead.
380888b7cf00fcb582728c642da3927c59468efaf926Eric Christopher    std::string OutputFile(Output.getFilename());
380988b7cf00fcb582728c642da3927c59468efaf926Eric Christopher    size_t loc = OutputFile.rfind(".pth");
381088b7cf00fcb582728c642da3927c59468efaf926Eric Christopher    if (loc != std::string::npos)
381188b7cf00fcb582728c642da3927c59468efaf926Eric Christopher      OutputFile.replace(loc, 4, ".gch");
381288b7cf00fcb582728c642da3927c59468efaf926Eric Christopher    const char *Tmp = C.getArgs().MakeArgString("--output-pch="+OutputFile);
381388b7cf00fcb582728c642da3927c59468efaf926Eric Christopher    CmdArgs.push_back(Tmp);
3814c21c485b4fb58ef5d55cf3e523263dd824a2ace4Daniel Dunbar  }
381540f1265ebd42ece3e7f7917319b56012e8e2bce2Daniel Dunbar
3816285f9a284704c07cd50e4597408d5f93518cd7c3Chad Rosier  RemoveCC1UnsupportedArgs(CmdArgs);
3817285f9a284704c07cd50e4597408d5f93518cd7c3Chad Rosier
381840f1265ebd42ece3e7f7917319b56012e8e2bce2Daniel Dunbar  const char *CC1Name = getCC1Name(Inputs[0].getType());
3819c21c485b4fb58ef5d55cf3e523263dd824a2ace4Daniel Dunbar  const char *Exec =
38204a7e88978cf646ad10d654020cb00b3877069210Daniel Dunbar    Args.MakeArgString(getToolChain().GetProgramPath(CC1Name));
38212fe238ed293bd4bc27af9beb9fa151fad2146fa8Daniel Dunbar  C.addCommand(new Command(JA, *this, Exec, CmdArgs));
382240f1265ebd42ece3e7f7917319b56012e8e2bce2Daniel Dunbar}
382340f1265ebd42ece3e7f7917319b56012e8e2bce2Daniel Dunbar
38248cac5f7e1ce63dd77ee0fb4ef68f9fa804f41ea6Daniel Dunbarvoid darwin::Assemble::ConstructJob(Compilation &C, const JobAction &JA,
38252fe238ed293bd4bc27af9beb9fa151fad2146fa8Daniel Dunbar                                    const InputInfo &Output,
3826c21c485b4fb58ef5d55cf3e523263dd824a2ace4Daniel Dunbar                                    const InputInfoList &Inputs,
3827c21c485b4fb58ef5d55cf3e523263dd824a2ace4Daniel Dunbar                                    const ArgList &Args,
38288cac5f7e1ce63dd77ee0fb4ef68f9fa804f41ea6Daniel Dunbar                                    const char *LinkingOutput) const {
38298cac5f7e1ce63dd77ee0fb4ef68f9fa804f41ea6Daniel Dunbar  ArgStringList CmdArgs;
38308cac5f7e1ce63dd77ee0fb4ef68f9fa804f41ea6Daniel Dunbar
38318cac5f7e1ce63dd77ee0fb4ef68f9fa804f41ea6Daniel Dunbar  assert(Inputs.size() == 1 && "Unexpected number of inputs.");
38328cac5f7e1ce63dd77ee0fb4ef68f9fa804f41ea6Daniel Dunbar  const InputInfo &Input = Inputs[0];
38338cac5f7e1ce63dd77ee0fb4ef68f9fa804f41ea6Daniel Dunbar
383434bac1f7b1ad8018b0d456f38744891c4bf56f63Daniel Dunbar  // Determine the original source input.
383534bac1f7b1ad8018b0d456f38744891c4bf56f63Daniel Dunbar  const Action *SourceAction = &JA;
383634bac1f7b1ad8018b0d456f38744891c4bf56f63Daniel Dunbar  while (SourceAction->getKind() != Action::InputClass) {
383734bac1f7b1ad8018b0d456f38744891c4bf56f63Daniel Dunbar    assert(!SourceAction->getInputs().empty() && "unexpected root action!");
383834bac1f7b1ad8018b0d456f38744891c4bf56f63Daniel Dunbar    SourceAction = SourceAction->getInputs()[0];
383934bac1f7b1ad8018b0d456f38744891c4bf56f63Daniel Dunbar  }
384034bac1f7b1ad8018b0d456f38744891c4bf56f63Daniel Dunbar
384134bac1f7b1ad8018b0d456f38744891c4bf56f63Daniel Dunbar  // Forward -g, assuming we are dealing with an actual assembly file.
384288b7cf00fcb582728c642da3927c59468efaf926Eric Christopher  if (SourceAction->getType() == types::TY_Asm ||
384334bac1f7b1ad8018b0d456f38744891c4bf56f63Daniel Dunbar      SourceAction->getType() == types::TY_PP_Asm) {
38448e4fea6750dbac032c172f3279c63b7815b7423eDaniel Dunbar    if (Args.hasArg(options::OPT_gstabs))
38458e4fea6750dbac032c172f3279c63b7815b7423eDaniel Dunbar      CmdArgs.push_back("--gstabs");
38468e4fea6750dbac032c172f3279c63b7815b7423eDaniel Dunbar    else if (Args.hasArg(options::OPT_g_Group))
3847591ff15d4a7ae25ea7ac3f00f04f203d3ccec0b7Bob Wilson      CmdArgs.push_back("-g");
38488e4fea6750dbac032c172f3279c63b7815b7423eDaniel Dunbar  }
3849c21c485b4fb58ef5d55cf3e523263dd824a2ace4Daniel Dunbar
38508cac5f7e1ce63dd77ee0fb4ef68f9fa804f41ea6Daniel Dunbar  // Derived from asm spec.
3851cc6f803f98fa6ba9a9c366400210448516d01b3cDaniel Dunbar  AddDarwinArch(Args, CmdArgs);
3852cc6f803f98fa6ba9a9c366400210448516d01b3cDaniel Dunbar
3853f5438e3462f37d7c58f847b594b4b3ab84085d67Daniel Dunbar  // Use -force_cpusubtype_ALL on x86 by default.
3854f5438e3462f37d7c58f847b594b4b3ab84085d67Daniel Dunbar  if (getToolChain().getTriple().getArch() == llvm::Triple::x86 ||
3855f5438e3462f37d7c58f847b594b4b3ab84085d67Daniel Dunbar      getToolChain().getTriple().getArch() == llvm::Triple::x86_64 ||
3856cc6f803f98fa6ba9a9c366400210448516d01b3cDaniel Dunbar      Args.hasArg(options::OPT_force__cpusubtype__ALL))
3857cc6f803f98fa6ba9a9c366400210448516d01b3cDaniel Dunbar    CmdArgs.push_back("-force_cpusubtype_ALL");
38588cac5f7e1ce63dd77ee0fb4ef68f9fa804f41ea6Daniel Dunbar
38590e2679d29be70186fc1197a1484948ed239922baDaniel Dunbar  if (getToolChain().getTriple().getArch() != llvm::Triple::x86_64 &&
38600e2679d29be70186fc1197a1484948ed239922baDaniel Dunbar      (Args.hasArg(options::OPT_mkernel) ||
38618cac5f7e1ce63dd77ee0fb4ef68f9fa804f41ea6Daniel Dunbar       Args.hasArg(options::OPT_static) ||
38620e2679d29be70186fc1197a1484948ed239922baDaniel Dunbar       Args.hasArg(options::OPT_fapple_kext)))
3863c21c485b4fb58ef5d55cf3e523263dd824a2ace4Daniel Dunbar    CmdArgs.push_back("-static");
3864c21c485b4fb58ef5d55cf3e523263dd824a2ace4Daniel Dunbar
38658cac5f7e1ce63dd77ee0fb4ef68f9fa804f41ea6Daniel Dunbar  Args.AddAllArgValues(CmdArgs, options::OPT_Wa_COMMA,
38668cac5f7e1ce63dd77ee0fb4ef68f9fa804f41ea6Daniel Dunbar                       options::OPT_Xassembler);
38678cac5f7e1ce63dd77ee0fb4ef68f9fa804f41ea6Daniel Dunbar
38688cac5f7e1ce63dd77ee0fb4ef68f9fa804f41ea6Daniel Dunbar  assert(Output.isFilename() && "Unexpected lipo output.");
38698cac5f7e1ce63dd77ee0fb4ef68f9fa804f41ea6Daniel Dunbar  CmdArgs.push_back("-o");
38708cac5f7e1ce63dd77ee0fb4ef68f9fa804f41ea6Daniel Dunbar  CmdArgs.push_back(Output.getFilename());
38718cac5f7e1ce63dd77ee0fb4ef68f9fa804f41ea6Daniel Dunbar
38727c1e46533cae07216e2a67d5636a5afb44253155Daniel Dunbar  assert(Input.isFilename() && "Invalid input.");
38737c1e46533cae07216e2a67d5636a5afb44253155Daniel Dunbar  CmdArgs.push_back(Input.getFilename());
38748cac5f7e1ce63dd77ee0fb4ef68f9fa804f41ea6Daniel Dunbar
38758cac5f7e1ce63dd77ee0fb4ef68f9fa804f41ea6Daniel Dunbar  // asm_final spec is empty.
38768cac5f7e1ce63dd77ee0fb4ef68f9fa804f41ea6Daniel Dunbar
3877c21c485b4fb58ef5d55cf3e523263dd824a2ace4Daniel Dunbar  const char *Exec =
38784a7e88978cf646ad10d654020cb00b3877069210Daniel Dunbar    Args.MakeArgString(getToolChain().GetProgramPath("as"));
38792fe238ed293bd4bc27af9beb9fa151fad2146fa8Daniel Dunbar  C.addCommand(new Command(JA, *this, Exec, CmdArgs));
38808cac5f7e1ce63dd77ee0fb4ef68f9fa804f41ea6Daniel Dunbar}
3881ff7488dc9a766f94daf54d81b03ab9160d0bfd88Daniel Dunbar
388299ba9e3bd70671f3441fb974895f226a83ce0e66David Blaikievoid darwin::DarwinTool::anchor() {}
388399ba9e3bd70671f3441fb974895f226a83ce0e66David Blaikie
3884fbefe6bd6f62a3361813498dc672ab0d6c0d4fd1Daniel Dunbarvoid darwin::DarwinTool::AddDarwinArch(const ArgList &Args,
3885fbefe6bd6f62a3361813498dc672ab0d6c0d4fd1Daniel Dunbar                                       ArgStringList &CmdArgs) const {
38865f9e272e632e951b1efe824cd16acb4d96077930Chris Lattner  StringRef ArchName = getDarwinToolChain().getDarwinArchName(Args);
3887eeff406730f50afd973f005a8d501a19af4785e5Daniel Dunbar
388802633b541b04ad5ffc1c70f4c2feeeb13e607057Daniel Dunbar  // Derived from darwin_arch spec.
388902633b541b04ad5ffc1c70f4c2feeeb13e607057Daniel Dunbar  CmdArgs.push_back("-arch");
3890eeff406730f50afd973f005a8d501a19af4785e5Daniel Dunbar  CmdArgs.push_back(Args.MakeArgString(ArchName));
389178dbd580a02759bbc408dbefb6754afa71b2c24cDaniel Dunbar
3892eeff406730f50afd973f005a8d501a19af4785e5Daniel Dunbar  // FIXME: Is this needed anymore?
3893eeff406730f50afd973f005a8d501a19af4785e5Daniel Dunbar  if (ArchName == "arm")
389478dbd580a02759bbc408dbefb6754afa71b2c24cDaniel Dunbar    CmdArgs.push_back("-force_cpusubtype_ALL");
389502633b541b04ad5ffc1c70f4c2feeeb13e607057Daniel Dunbar}
389602633b541b04ad5ffc1c70f4c2feeeb13e607057Daniel Dunbar
3897748de8eda222f087434d8bd703176b316a061341Daniel Dunbarvoid darwin::Link::AddLinkArgs(Compilation &C,
3898748de8eda222f087434d8bd703176b316a061341Daniel Dunbar                               const ArgList &Args,
389902633b541b04ad5ffc1c70f4c2feeeb13e607057Daniel Dunbar                               ArgStringList &CmdArgs) const {
3900ee788e70fcd0adf76103b17c78ac658d4ea30c9bDaniel Dunbar  const Driver &D = getToolChain().getDriver();
3901ce911f5fd76375948d18e6528fe7a7314c6e1ac9Daniel Dunbar  const toolchains::Darwin &DarwinTC = getDarwinToolChain();
390202633b541b04ad5ffc1c70f4c2feeeb13e607057Daniel Dunbar
3903b18dc5b8376f42f7b4802bf1279e95eeb813fa06Daniel Dunbar  unsigned Version[3] = { 0, 0, 0 };
3904b18dc5b8376f42f7b4802bf1279e95eeb813fa06Daniel Dunbar  if (Arg *A = Args.getLastArg(options::OPT_mlinker_version_EQ)) {
3905b18dc5b8376f42f7b4802bf1279e95eeb813fa06Daniel Dunbar    bool HadExtra;
3906b18dc5b8376f42f7b4802bf1279e95eeb813fa06Daniel Dunbar    if (!Driver::GetReleaseVersion(A->getValue(Args), Version[0],
3907b18dc5b8376f42f7b4802bf1279e95eeb813fa06Daniel Dunbar                                   Version[1], Version[2], HadExtra) ||
3908b18dc5b8376f42f7b4802bf1279e95eeb813fa06Daniel Dunbar        HadExtra)
39095f9e272e632e951b1efe824cd16acb4d96077930Chris Lattner      D.Diag(diag::err_drv_invalid_version_number)
3910b18dc5b8376f42f7b4802bf1279e95eeb813fa06Daniel Dunbar        << A->getAsString(Args);
3911b18dc5b8376f42f7b4802bf1279e95eeb813fa06Daniel Dunbar  }
3912b18dc5b8376f42f7b4802bf1279e95eeb813fa06Daniel Dunbar
3913b18dc5b8376f42f7b4802bf1279e95eeb813fa06Daniel Dunbar  // Newer linkers support -demangle, pass it if supported and not disabled by
3914b18dc5b8376f42f7b4802bf1279e95eeb813fa06Daniel Dunbar  // the user.
3915d2d2088c569a15c8ad75e70f995ff5a879f4fc49Daniel Dunbar  if (Version[0] >= 100 && !Args.hasArg(options::OPT_Z_Xlinker__no_demangle)) {
3916bcf1da8ff6ab007a23a8d1be8e950d92cee4241eDaniel Dunbar    // Don't pass -demangle to ld_classic.
3917bcf1da8ff6ab007a23a8d1be8e950d92cee4241eDaniel Dunbar    //
3918bcf1da8ff6ab007a23a8d1be8e950d92cee4241eDaniel Dunbar    // FIXME: This is a temporary workaround, ld should be handling this.
3919bcf1da8ff6ab007a23a8d1be8e950d92cee4241eDaniel Dunbar    bool UsesLdClassic = (getToolChain().getArch() == llvm::Triple::x86 &&
3920bcf1da8ff6ab007a23a8d1be8e950d92cee4241eDaniel Dunbar                          Args.hasArg(options::OPT_static));
39219ced7049caf7c9543badb302f3bb43a6bc264705Daniel Dunbar    if (getToolChain().getArch() == llvm::Triple::x86) {
39229ced7049caf7c9543badb302f3bb43a6bc264705Daniel Dunbar      for (arg_iterator it = Args.filtered_begin(options::OPT_Xlinker,
39239ced7049caf7c9543badb302f3bb43a6bc264705Daniel Dunbar                                                 options::OPT_Wl_COMMA),
39249ced7049caf7c9543badb302f3bb43a6bc264705Daniel Dunbar             ie = Args.filtered_end(); it != ie; ++it) {
39259ced7049caf7c9543badb302f3bb43a6bc264705Daniel Dunbar        const Arg *A = *it;
39269ced7049caf7c9543badb302f3bb43a6bc264705Daniel Dunbar        for (unsigned i = 0, e = A->getNumValues(); i != e; ++i)
39275f9e272e632e951b1efe824cd16acb4d96077930Chris Lattner          if (StringRef(A->getValue(Args, i)) == "-kext")
39289ced7049caf7c9543badb302f3bb43a6bc264705Daniel Dunbar            UsesLdClassic = true;
39299ced7049caf7c9543badb302f3bb43a6bc264705Daniel Dunbar      }
39309ced7049caf7c9543badb302f3bb43a6bc264705Daniel Dunbar    }
3931bcf1da8ff6ab007a23a8d1be8e950d92cee4241eDaniel Dunbar    if (!UsesLdClassic)
3932bcf1da8ff6ab007a23a8d1be8e950d92cee4241eDaniel Dunbar      CmdArgs.push_back("-demangle");
3933b18dc5b8376f42f7b4802bf1279e95eeb813fa06Daniel Dunbar  }
3934b18dc5b8376f42f7b4802bf1279e95eeb813fa06Daniel Dunbar
39355bfa656e132560e616310b455d65604a49e33e35Daniel Dunbar  // If we are using LTO, then automatically create a temporary file path for
39365bfa656e132560e616310b455d65604a49e33e35Daniel Dunbar  // the linker to use, so that it's lifetime will extend past a possible
39375bfa656e132560e616310b455d65604a49e33e35Daniel Dunbar  // dsymutil step.
3938a68e1c398a0ab9c24e82090fbb26c755dbc62c3cDaniel Dunbar  if (Version[0] >= 116 && D.IsUsingLTO(Args)) {
39395bfa656e132560e616310b455d65604a49e33e35Daniel Dunbar    const char *TmpPath = C.getArgs().MakeArgString(
3940fe87fc73c0091a8d6ba04b7e3b5f144d4a0517a3Chad Rosier      D.GetTemporaryPath("cc", types::getTypeTempSuffix(types::TY_Object)));
39415bfa656e132560e616310b455d65604a49e33e35Daniel Dunbar    C.addTempFile(TmpPath);
39425bfa656e132560e616310b455d65604a49e33e35Daniel Dunbar    CmdArgs.push_back("-object_path_lto");
39435bfa656e132560e616310b455d65604a49e33e35Daniel Dunbar    CmdArgs.push_back(TmpPath);
39445bfa656e132560e616310b455d65604a49e33e35Daniel Dunbar  }
39455bfa656e132560e616310b455d65604a49e33e35Daniel Dunbar
394602633b541b04ad5ffc1c70f4c2feeeb13e607057Daniel Dunbar  // Derived from the "link" spec.
394702633b541b04ad5ffc1c70f4c2feeeb13e607057Daniel Dunbar  Args.AddAllArgs(CmdArgs, options::OPT_static);
394802633b541b04ad5ffc1c70f4c2feeeb13e607057Daniel Dunbar  if (!Args.hasArg(options::OPT_static))
394902633b541b04ad5ffc1c70f4c2feeeb13e607057Daniel Dunbar    CmdArgs.push_back("-dynamic");
395002633b541b04ad5ffc1c70f4c2feeeb13e607057Daniel Dunbar  if (Args.hasArg(options::OPT_fgnu_runtime)) {
395102633b541b04ad5ffc1c70f4c2feeeb13e607057Daniel Dunbar    // FIXME: gcc replaces -lobjc in forward args with -lobjc-gnu
395202633b541b04ad5ffc1c70f4c2feeeb13e607057Daniel Dunbar    // here. How do we wish to handle such things?
395302633b541b04ad5ffc1c70f4c2feeeb13e607057Daniel Dunbar  }
3954c21c485b4fb58ef5d55cf3e523263dd824a2ace4Daniel Dunbar
395502633b541b04ad5ffc1c70f4c2feeeb13e607057Daniel Dunbar  if (!Args.hasArg(options::OPT_dynamiclib)) {
3956a6d38494d18e260958e73bfe5e2b3f1dc4160459Daniel Dunbar    AddDarwinArch(Args, CmdArgs);
3957a6d38494d18e260958e73bfe5e2b3f1dc4160459Daniel Dunbar    // FIXME: Why do this only on this path?
39588917dd4457affb8750c81f08cbc21902a36cff26Daniel Dunbar    Args.AddLastArg(CmdArgs, options::OPT_force__cpusubtype__ALL);
395902633b541b04ad5ffc1c70f4c2feeeb13e607057Daniel Dunbar
396002633b541b04ad5ffc1c70f4c2feeeb13e607057Daniel Dunbar    Args.AddLastArg(CmdArgs, options::OPT_bundle);
396102633b541b04ad5ffc1c70f4c2feeeb13e607057Daniel Dunbar    Args.AddAllArgs(CmdArgs, options::OPT_bundle__loader);
396202633b541b04ad5ffc1c70f4c2feeeb13e607057Daniel Dunbar    Args.AddAllArgs(CmdArgs, options::OPT_client__name);
396302633b541b04ad5ffc1c70f4c2feeeb13e607057Daniel Dunbar
396402633b541b04ad5ffc1c70f4c2feeeb13e607057Daniel Dunbar    Arg *A;
396502633b541b04ad5ffc1c70f4c2feeeb13e607057Daniel Dunbar    if ((A = Args.getLastArg(options::OPT_compatibility__version)) ||
396602633b541b04ad5ffc1c70f4c2feeeb13e607057Daniel Dunbar        (A = Args.getLastArg(options::OPT_current__version)) ||
396702633b541b04ad5ffc1c70f4c2feeeb13e607057Daniel Dunbar        (A = Args.getLastArg(options::OPT_install__name)))
39685f9e272e632e951b1efe824cd16acb4d96077930Chris Lattner      D.Diag(diag::err_drv_argument_only_allowed_with)
396902633b541b04ad5ffc1c70f4c2feeeb13e607057Daniel Dunbar        << A->getAsString(Args) << "-dynamiclib";
397002633b541b04ad5ffc1c70f4c2feeeb13e607057Daniel Dunbar
397102633b541b04ad5ffc1c70f4c2feeeb13e607057Daniel Dunbar    Args.AddLastArg(CmdArgs, options::OPT_force__flat__namespace);
397202633b541b04ad5ffc1c70f4c2feeeb13e607057Daniel Dunbar    Args.AddLastArg(CmdArgs, options::OPT_keep__private__externs);
397302633b541b04ad5ffc1c70f4c2feeeb13e607057Daniel Dunbar    Args.AddLastArg(CmdArgs, options::OPT_private__bundle);
397402633b541b04ad5ffc1c70f4c2feeeb13e607057Daniel Dunbar  } else {
397502633b541b04ad5ffc1c70f4c2feeeb13e607057Daniel Dunbar    CmdArgs.push_back("-dylib");
397602633b541b04ad5ffc1c70f4c2feeeb13e607057Daniel Dunbar
397702633b541b04ad5ffc1c70f4c2feeeb13e607057Daniel Dunbar    Arg *A;
397802633b541b04ad5ffc1c70f4c2feeeb13e607057Daniel Dunbar    if ((A = Args.getLastArg(options::OPT_bundle)) ||
397902633b541b04ad5ffc1c70f4c2feeeb13e607057Daniel Dunbar        (A = Args.getLastArg(options::OPT_bundle__loader)) ||
398002633b541b04ad5ffc1c70f4c2feeeb13e607057Daniel Dunbar        (A = Args.getLastArg(options::OPT_client__name)) ||
398102633b541b04ad5ffc1c70f4c2feeeb13e607057Daniel Dunbar        (A = Args.getLastArg(options::OPT_force__flat__namespace)) ||
398202633b541b04ad5ffc1c70f4c2feeeb13e607057Daniel Dunbar        (A = Args.getLastArg(options::OPT_keep__private__externs)) ||
398302633b541b04ad5ffc1c70f4c2feeeb13e607057Daniel Dunbar        (A = Args.getLastArg(options::OPT_private__bundle)))
39845f9e272e632e951b1efe824cd16acb4d96077930Chris Lattner      D.Diag(diag::err_drv_argument_not_allowed_with)
398502633b541b04ad5ffc1c70f4c2feeeb13e607057Daniel Dunbar        << A->getAsString(Args) << "-dynamiclib";
3986c21c485b4fb58ef5d55cf3e523263dd824a2ace4Daniel Dunbar
398702633b541b04ad5ffc1c70f4c2feeeb13e607057Daniel Dunbar    Args.AddAllArgsTranslated(CmdArgs, options::OPT_compatibility__version,
398802633b541b04ad5ffc1c70f4c2feeeb13e607057Daniel Dunbar                              "-dylib_compatibility_version");
398902633b541b04ad5ffc1c70f4c2feeeb13e607057Daniel Dunbar    Args.AddAllArgsTranslated(CmdArgs, options::OPT_current__version,
399002633b541b04ad5ffc1c70f4c2feeeb13e607057Daniel Dunbar                              "-dylib_current_version");
399102633b541b04ad5ffc1c70f4c2feeeb13e607057Daniel Dunbar
3992a6d38494d18e260958e73bfe5e2b3f1dc4160459Daniel Dunbar    AddDarwinArch(Args, CmdArgs);
399302633b541b04ad5ffc1c70f4c2feeeb13e607057Daniel Dunbar
399402633b541b04ad5ffc1c70f4c2feeeb13e607057Daniel Dunbar    Args.AddAllArgsTranslated(CmdArgs, options::OPT_install__name,
399502633b541b04ad5ffc1c70f4c2feeeb13e607057Daniel Dunbar                              "-dylib_install_name");
399602633b541b04ad5ffc1c70f4c2feeeb13e607057Daniel Dunbar  }
399702633b541b04ad5ffc1c70f4c2feeeb13e607057Daniel Dunbar
399802633b541b04ad5ffc1c70f4c2feeeb13e607057Daniel Dunbar  Args.AddLastArg(CmdArgs, options::OPT_all__load);
399902633b541b04ad5ffc1c70f4c2feeeb13e607057Daniel Dunbar  Args.AddAllArgs(CmdArgs, options::OPT_allowable__client);
400002633b541b04ad5ffc1c70f4c2feeeb13e607057Daniel Dunbar  Args.AddLastArg(CmdArgs, options::OPT_bind__at__load);
4001ce911f5fd76375948d18e6528fe7a7314c6e1ac9Daniel Dunbar  if (DarwinTC.isTargetIPhoneOS())
4002d82f8fa53771b454885c546f0fd452a4980b3a3eDaniel Dunbar    Args.AddLastArg(CmdArgs, options::OPT_arch__errors__fatal);
400302633b541b04ad5ffc1c70f4c2feeeb13e607057Daniel Dunbar  Args.AddLastArg(CmdArgs, options::OPT_dead__strip);
400402633b541b04ad5ffc1c70f4c2feeeb13e607057Daniel Dunbar  Args.AddLastArg(CmdArgs, options::OPT_no__dead__strip__inits__and__terms);
400502633b541b04ad5ffc1c70f4c2feeeb13e607057Daniel Dunbar  Args.AddAllArgs(CmdArgs, options::OPT_dylib__file);
400602633b541b04ad5ffc1c70f4c2feeeb13e607057Daniel Dunbar  Args.AddLastArg(CmdArgs, options::OPT_dynamic);
400702633b541b04ad5ffc1c70f4c2feeeb13e607057Daniel Dunbar  Args.AddAllArgs(CmdArgs, options::OPT_exported__symbols__list);
400802633b541b04ad5ffc1c70f4c2feeeb13e607057Daniel Dunbar  Args.AddLastArg(CmdArgs, options::OPT_flat__namespace);
400999ca47b21f6b32ea8a92b0c8e0bea18170f86b9eDaniel Dunbar  Args.AddAllArgs(CmdArgs, options::OPT_force__load);
401002633b541b04ad5ffc1c70f4c2feeeb13e607057Daniel Dunbar  Args.AddAllArgs(CmdArgs, options::OPT_headerpad__max__install__names);
401102633b541b04ad5ffc1c70f4c2feeeb13e607057Daniel Dunbar  Args.AddAllArgs(CmdArgs, options::OPT_image__base);
401202633b541b04ad5ffc1c70f4c2feeeb13e607057Daniel Dunbar  Args.AddAllArgs(CmdArgs, options::OPT_init);
401302633b541b04ad5ffc1c70f4c2feeeb13e607057Daniel Dunbar
4014ce911f5fd76375948d18e6528fe7a7314c6e1ac9Daniel Dunbar  // Add the deployment target.
401509c9a5635f10a7dfa3373ef0941597c16b048362Benjamin Kramer  VersionTuple TargetVersion = DarwinTC.getTargetVersion();
4016b7f5ef73aee479b2fa54c30cfebed665be8fccb9Daniel Dunbar
4017b7f5ef73aee479b2fa54c30cfebed665be8fccb9Daniel Dunbar  // If we had an explicit -mios-simulator-version-min argument, honor that,
4018b7f5ef73aee479b2fa54c30cfebed665be8fccb9Daniel Dunbar  // otherwise use the traditional deployment targets. We can't just check the
4019b7f5ef73aee479b2fa54c30cfebed665be8fccb9Daniel Dunbar  // is-sim attribute because existing code follows this path, and the linker
4020b7f5ef73aee479b2fa54c30cfebed665be8fccb9Daniel Dunbar  // may not handle the argument.
4021b7f5ef73aee479b2fa54c30cfebed665be8fccb9Daniel Dunbar  //
4022b7f5ef73aee479b2fa54c30cfebed665be8fccb9Daniel Dunbar  // FIXME: We may be able to remove this, once we can verify no one depends on
4023b7f5ef73aee479b2fa54c30cfebed665be8fccb9Daniel Dunbar  // it.
4024b7f5ef73aee479b2fa54c30cfebed665be8fccb9Daniel Dunbar  if (Args.hasArg(options::OPT_mios_simulator_version_min_EQ))
4025b7f5ef73aee479b2fa54c30cfebed665be8fccb9Daniel Dunbar    CmdArgs.push_back("-ios_simulator_version_min");
4026b7f5ef73aee479b2fa54c30cfebed665be8fccb9Daniel Dunbar  else if (DarwinTC.isTargetIPhoneOS())
4027b7f5ef73aee479b2fa54c30cfebed665be8fccb9Daniel Dunbar    CmdArgs.push_back("-iphoneos_version_min");
4028b7f5ef73aee479b2fa54c30cfebed665be8fccb9Daniel Dunbar  else
4029b7f5ef73aee479b2fa54c30cfebed665be8fccb9Daniel Dunbar    CmdArgs.push_back("-macosx_version_min");
403009c9a5635f10a7dfa3373ef0941597c16b048362Benjamin Kramer  CmdArgs.push_back(Args.MakeArgString(TargetVersion.getAsString()));
4031ce911f5fd76375948d18e6528fe7a7314c6e1ac9Daniel Dunbar
403202633b541b04ad5ffc1c70f4c2feeeb13e607057Daniel Dunbar  Args.AddLastArg(CmdArgs, options::OPT_nomultidefs);
403302633b541b04ad5ffc1c70f4c2feeeb13e607057Daniel Dunbar  Args.AddLastArg(CmdArgs, options::OPT_multi__module);
403402633b541b04ad5ffc1c70f4c2feeeb13e607057Daniel Dunbar  Args.AddLastArg(CmdArgs, options::OPT_single__module);
403502633b541b04ad5ffc1c70f4c2feeeb13e607057Daniel Dunbar  Args.AddAllArgs(CmdArgs, options::OPT_multiply__defined);
403602633b541b04ad5ffc1c70f4c2feeeb13e607057Daniel Dunbar  Args.AddAllArgs(CmdArgs, options::OPT_multiply__defined__unused);
4037c21c485b4fb58ef5d55cf3e523263dd824a2ace4Daniel Dunbar
403847e879dfa735f81472a51b1bd69cc4eb9159db39Daniel Dunbar  if (const Arg *A = Args.getLastArg(options::OPT_fpie, options::OPT_fPIE,
403947e879dfa735f81472a51b1bd69cc4eb9159db39Daniel Dunbar                                     options::OPT_fno_pie,
404047e879dfa735f81472a51b1bd69cc4eb9159db39Daniel Dunbar                                     options::OPT_fno_PIE)) {
404147e879dfa735f81472a51b1bd69cc4eb9159db39Daniel Dunbar    if (A->getOption().matches(options::OPT_fpie) ||
404247e879dfa735f81472a51b1bd69cc4eb9159db39Daniel Dunbar        A->getOption().matches(options::OPT_fPIE))
404347e879dfa735f81472a51b1bd69cc4eb9159db39Daniel Dunbar      CmdArgs.push_back("-pie");
404447e879dfa735f81472a51b1bd69cc4eb9159db39Daniel Dunbar    else
404547e879dfa735f81472a51b1bd69cc4eb9159db39Daniel Dunbar      CmdArgs.push_back("-no_pie");
404647e879dfa735f81472a51b1bd69cc4eb9159db39Daniel Dunbar  }
404702633b541b04ad5ffc1c70f4c2feeeb13e607057Daniel Dunbar
404802633b541b04ad5ffc1c70f4c2feeeb13e607057Daniel Dunbar  Args.AddLastArg(CmdArgs, options::OPT_prebind);
404902633b541b04ad5ffc1c70f4c2feeeb13e607057Daniel Dunbar  Args.AddLastArg(CmdArgs, options::OPT_noprebind);
405002633b541b04ad5ffc1c70f4c2feeeb13e607057Daniel Dunbar  Args.AddLastArg(CmdArgs, options::OPT_nofixprebinding);
405102633b541b04ad5ffc1c70f4c2feeeb13e607057Daniel Dunbar  Args.AddLastArg(CmdArgs, options::OPT_prebind__all__twolevel__modules);
405202633b541b04ad5ffc1c70f4c2feeeb13e607057Daniel Dunbar  Args.AddLastArg(CmdArgs, options::OPT_read__only__relocs);
405302633b541b04ad5ffc1c70f4c2feeeb13e607057Daniel Dunbar  Args.AddAllArgs(CmdArgs, options::OPT_sectcreate);
405402633b541b04ad5ffc1c70f4c2feeeb13e607057Daniel Dunbar  Args.AddAllArgs(CmdArgs, options::OPT_sectorder);
405502633b541b04ad5ffc1c70f4c2feeeb13e607057Daniel Dunbar  Args.AddAllArgs(CmdArgs, options::OPT_seg1addr);
405602633b541b04ad5ffc1c70f4c2feeeb13e607057Daniel Dunbar  Args.AddAllArgs(CmdArgs, options::OPT_segprot);
405702633b541b04ad5ffc1c70f4c2feeeb13e607057Daniel Dunbar  Args.AddAllArgs(CmdArgs, options::OPT_segaddr);
405802633b541b04ad5ffc1c70f4c2feeeb13e607057Daniel Dunbar  Args.AddAllArgs(CmdArgs, options::OPT_segs__read__only__addr);
405902633b541b04ad5ffc1c70f4c2feeeb13e607057Daniel Dunbar  Args.AddAllArgs(CmdArgs, options::OPT_segs__read__write__addr);
406002633b541b04ad5ffc1c70f4c2feeeb13e607057Daniel Dunbar  Args.AddAllArgs(CmdArgs, options::OPT_seg__addr__table);
406102633b541b04ad5ffc1c70f4c2feeeb13e607057Daniel Dunbar  Args.AddAllArgs(CmdArgs, options::OPT_seg__addr__table__filename);
406202633b541b04ad5ffc1c70f4c2feeeb13e607057Daniel Dunbar  Args.AddAllArgs(CmdArgs, options::OPT_sub__library);
406302633b541b04ad5ffc1c70f4c2feeeb13e607057Daniel Dunbar  Args.AddAllArgs(CmdArgs, options::OPT_sub__umbrella);
4064d82f8fa53771b454885c546f0fd452a4980b3a3eDaniel Dunbar
4065cc95719054ef9949c88d21c6c8d349dac8b4fd36Daniel Dunbar  // Give --sysroot= preference, over the Apple specific behavior to also use
4066cc95719054ef9949c88d21c6c8d349dac8b4fd36Daniel Dunbar  // --isysroot as the syslibroot.
40674762a2da74875d2ae94e0d77d38ed964816cce36Sebastian Pop  StringRef sysroot = C.getSysRoot();
40684762a2da74875d2ae94e0d77d38ed964816cce36Sebastian Pop  if (sysroot != "") {
4069cc95719054ef9949c88d21c6c8d349dac8b4fd36Daniel Dunbar    CmdArgs.push_back("-syslibroot");
40704762a2da74875d2ae94e0d77d38ed964816cce36Sebastian Pop    CmdArgs.push_back(C.getArgs().MakeArgString(sysroot));
4071cc95719054ef9949c88d21c6c8d349dac8b4fd36Daniel Dunbar  } else if (const Arg *A = Args.getLastArg(options::OPT_isysroot)) {
4072cc95719054ef9949c88d21c6c8d349dac8b4fd36Daniel Dunbar    CmdArgs.push_back("-syslibroot");
4073cc95719054ef9949c88d21c6c8d349dac8b4fd36Daniel Dunbar    CmdArgs.push_back(A->getValue(Args));
4074d82f8fa53771b454885c546f0fd452a4980b3a3eDaniel Dunbar  }
4075d82f8fa53771b454885c546f0fd452a4980b3a3eDaniel Dunbar
407602633b541b04ad5ffc1c70f4c2feeeb13e607057Daniel Dunbar  Args.AddLastArg(CmdArgs, options::OPT_twolevel__namespace);
407702633b541b04ad5ffc1c70f4c2feeeb13e607057Daniel Dunbar  Args.AddLastArg(CmdArgs, options::OPT_twolevel__namespace__hints);
407802633b541b04ad5ffc1c70f4c2feeeb13e607057Daniel Dunbar  Args.AddAllArgs(CmdArgs, options::OPT_umbrella);
407902633b541b04ad5ffc1c70f4c2feeeb13e607057Daniel Dunbar  Args.AddAllArgs(CmdArgs, options::OPT_undefined);
408002633b541b04ad5ffc1c70f4c2feeeb13e607057Daniel Dunbar  Args.AddAllArgs(CmdArgs, options::OPT_unexported__symbols__list);
4081d82f8fa53771b454885c546f0fd452a4980b3a3eDaniel Dunbar  Args.AddAllArgs(CmdArgs, options::OPT_weak__reference__mismatches);
408202633b541b04ad5ffc1c70f4c2feeeb13e607057Daniel Dunbar  Args.AddLastArg(CmdArgs, options::OPT_X_Flag);
408302633b541b04ad5ffc1c70f4c2feeeb13e607057Daniel Dunbar  Args.AddAllArgs(CmdArgs, options::OPT_y);
408402633b541b04ad5ffc1c70f4c2feeeb13e607057Daniel Dunbar  Args.AddLastArg(CmdArgs, options::OPT_w);
408502633b541b04ad5ffc1c70f4c2feeeb13e607057Daniel Dunbar  Args.AddAllArgs(CmdArgs, options::OPT_pagezero__size);
408602633b541b04ad5ffc1c70f4c2feeeb13e607057Daniel Dunbar  Args.AddAllArgs(CmdArgs, options::OPT_segs__read__);
408702633b541b04ad5ffc1c70f4c2feeeb13e607057Daniel Dunbar  Args.AddLastArg(CmdArgs, options::OPT_seglinkedit);
408802633b541b04ad5ffc1c70f4c2feeeb13e607057Daniel Dunbar  Args.AddLastArg(CmdArgs, options::OPT_noseglinkedit);
408902633b541b04ad5ffc1c70f4c2feeeb13e607057Daniel Dunbar  Args.AddAllArgs(CmdArgs, options::OPT_sectalign);
409002633b541b04ad5ffc1c70f4c2feeeb13e607057Daniel Dunbar  Args.AddAllArgs(CmdArgs, options::OPT_sectobjectsymbols);
409102633b541b04ad5ffc1c70f4c2feeeb13e607057Daniel Dunbar  Args.AddAllArgs(CmdArgs, options::OPT_segcreate);
409202633b541b04ad5ffc1c70f4c2feeeb13e607057Daniel Dunbar  Args.AddLastArg(CmdArgs, options::OPT_whyload);
409302633b541b04ad5ffc1c70f4c2feeeb13e607057Daniel Dunbar  Args.AddLastArg(CmdArgs, options::OPT_whatsloaded);
409402633b541b04ad5ffc1c70f4c2feeeb13e607057Daniel Dunbar  Args.AddAllArgs(CmdArgs, options::OPT_dylinker__install__name);
409502633b541b04ad5ffc1c70f4c2feeeb13e607057Daniel Dunbar  Args.AddLastArg(CmdArgs, options::OPT_dylinker);
409602633b541b04ad5ffc1c70f4c2feeeb13e607057Daniel Dunbar  Args.AddLastArg(CmdArgs, options::OPT_Mach);
409702633b541b04ad5ffc1c70f4c2feeeb13e607057Daniel Dunbar}
409802633b541b04ad5ffc1c70f4c2feeeb13e607057Daniel Dunbar
409902633b541b04ad5ffc1c70f4c2feeeb13e607057Daniel Dunbarvoid darwin::Link::ConstructJob(Compilation &C, const JobAction &JA,
41002fe238ed293bd4bc27af9beb9fa151fad2146fa8Daniel Dunbar                                const InputInfo &Output,
4101c21c485b4fb58ef5d55cf3e523263dd824a2ace4Daniel Dunbar                                const InputInfoList &Inputs,
4102c21c485b4fb58ef5d55cf3e523263dd824a2ace4Daniel Dunbar                                const ArgList &Args,
410302633b541b04ad5ffc1c70f4c2feeeb13e607057Daniel Dunbar                                const char *LinkingOutput) const {
410402633b541b04ad5ffc1c70f4c2feeeb13e607057Daniel Dunbar  assert(Output.getType() == types::TY_Image && "Invalid linker output type.");
4105e0be8b1729d8978de433d229c065830b95d0ae68Daniel Dunbar
410602633b541b04ad5ffc1c70f4c2feeeb13e607057Daniel Dunbar  // The logic here is derived from gcc's behavior; most of which
410702633b541b04ad5ffc1c70f4c2feeeb13e607057Daniel Dunbar  // comes from specs (starting with link_command). Consult gcc for
410802633b541b04ad5ffc1c70f4c2feeeb13e607057Daniel Dunbar  // more information.
410902633b541b04ad5ffc1c70f4c2feeeb13e607057Daniel Dunbar  ArgStringList CmdArgs;
411002633b541b04ad5ffc1c70f4c2feeeb13e607057Daniel Dunbar
4111228971738f80de6f02aee0d6f8018f5209cf7c9cArgyrios Kyrtzidis  /// Hack(tm) to ignore linking errors when we are doing ARC migration.
4112228971738f80de6f02aee0d6f8018f5209cf7c9cArgyrios Kyrtzidis  if (Args.hasArg(options::OPT_ccc_arcmt_check,
4113228971738f80de6f02aee0d6f8018f5209cf7c9cArgyrios Kyrtzidis                  options::OPT_ccc_arcmt_migrate)) {
4114228971738f80de6f02aee0d6f8018f5209cf7c9cArgyrios Kyrtzidis    for (ArgList::const_iterator I = Args.begin(), E = Args.end(); I != E; ++I)
4115228971738f80de6f02aee0d6f8018f5209cf7c9cArgyrios Kyrtzidis      (*I)->claim();
4116228971738f80de6f02aee0d6f8018f5209cf7c9cArgyrios Kyrtzidis    const char *Exec =
4117228971738f80de6f02aee0d6f8018f5209cf7c9cArgyrios Kyrtzidis      Args.MakeArgString(getToolChain().GetProgramPath("touch"));
4118228971738f80de6f02aee0d6f8018f5209cf7c9cArgyrios Kyrtzidis    CmdArgs.push_back(Output.getFilename());
4119228971738f80de6f02aee0d6f8018f5209cf7c9cArgyrios Kyrtzidis    C.addCommand(new Command(JA, *this, Exec, CmdArgs));
4120228971738f80de6f02aee0d6f8018f5209cf7c9cArgyrios Kyrtzidis    return;
4121228971738f80de6f02aee0d6f8018f5209cf7c9cArgyrios Kyrtzidis  }
4122228971738f80de6f02aee0d6f8018f5209cf7c9cArgyrios Kyrtzidis
412302633b541b04ad5ffc1c70f4c2feeeb13e607057Daniel Dunbar  // I'm not sure why this particular decomposition exists in gcc, but
412402633b541b04ad5ffc1c70f4c2feeeb13e607057Daniel Dunbar  // we follow suite for ease of comparison.
4125748de8eda222f087434d8bd703176b316a061341Daniel Dunbar  AddLinkArgs(C, Args, CmdArgs);
412602633b541b04ad5ffc1c70f4c2feeeb13e607057Daniel Dunbar
412702633b541b04ad5ffc1c70f4c2feeeb13e607057Daniel Dunbar  Args.AddAllArgs(CmdArgs, options::OPT_d_Flag);
412802633b541b04ad5ffc1c70f4c2feeeb13e607057Daniel Dunbar  Args.AddAllArgs(CmdArgs, options::OPT_s);
412902633b541b04ad5ffc1c70f4c2feeeb13e607057Daniel Dunbar  Args.AddAllArgs(CmdArgs, options::OPT_t);
413002633b541b04ad5ffc1c70f4c2feeeb13e607057Daniel Dunbar  Args.AddAllArgs(CmdArgs, options::OPT_Z_Flag);
413102633b541b04ad5ffc1c70f4c2feeeb13e607057Daniel Dunbar  Args.AddAllArgs(CmdArgs, options::OPT_u_Group);
413202633b541b04ad5ffc1c70f4c2feeeb13e607057Daniel Dunbar  Args.AddAllArgs(CmdArgs, options::OPT_A);
413302633b541b04ad5ffc1c70f4c2feeeb13e607057Daniel Dunbar  Args.AddLastArg(CmdArgs, options::OPT_e);
413402633b541b04ad5ffc1c70f4c2feeeb13e607057Daniel Dunbar  Args.AddAllArgs(CmdArgs, options::OPT_m_Separate);
413502633b541b04ad5ffc1c70f4c2feeeb13e607057Daniel Dunbar  Args.AddAllArgs(CmdArgs, options::OPT_r);
413602633b541b04ad5ffc1c70f4c2feeeb13e607057Daniel Dunbar
4137270073c1e44d073e9732204fc099f280b368fab5Daniel Dunbar  // Forward -ObjC when either -ObjC or -ObjC++ is used, to force loading
4138270073c1e44d073e9732204fc099f280b368fab5Daniel Dunbar  // members of static archive libraries which implement Objective-C classes or
4139270073c1e44d073e9732204fc099f280b368fab5Daniel Dunbar  // categories.
4140270073c1e44d073e9732204fc099f280b368fab5Daniel Dunbar  if (Args.hasArg(options::OPT_ObjC) || Args.hasArg(options::OPT_ObjCXX))
4141270073c1e44d073e9732204fc099f280b368fab5Daniel Dunbar    CmdArgs.push_back("-ObjC");
414220249a1af2e462dcafdd6a350f1c7967b264ff25Michael J. Spencer
414302633b541b04ad5ffc1c70f4c2feeeb13e607057Daniel Dunbar  CmdArgs.push_back("-o");
414402633b541b04ad5ffc1c70f4c2feeeb13e607057Daniel Dunbar  CmdArgs.push_back(Output.getFilename());
414502633b541b04ad5ffc1c70f4c2feeeb13e607057Daniel Dunbar
414602633b541b04ad5ffc1c70f4c2feeeb13e607057Daniel Dunbar  if (!Args.hasArg(options::OPT_A) &&
414702633b541b04ad5ffc1c70f4c2feeeb13e607057Daniel Dunbar      !Args.hasArg(options::OPT_nostdlib) &&
414802633b541b04ad5ffc1c70f4c2feeeb13e607057Daniel Dunbar      !Args.hasArg(options::OPT_nostartfiles)) {
414902633b541b04ad5ffc1c70f4c2feeeb13e607057Daniel Dunbar    // Derived from startfile spec.
415002633b541b04ad5ffc1c70f4c2feeeb13e607057Daniel Dunbar    if (Args.hasArg(options::OPT_dynamiclib)) {
4151c21c485b4fb58ef5d55cf3e523263dd824a2ace4Daniel Dunbar      // Derived from darwin_dylib1 spec.
41521051fc0ba0fb924d6d4a88a2113460a40a542614Daniel Dunbar      if (getDarwinToolChain().isTargetIOSSimulator()) {
41531051fc0ba0fb924d6d4a88a2113460a40a542614Daniel Dunbar        // The simulator doesn't have a versioned crt1 file.
41541051fc0ba0fb924d6d4a88a2113460a40a542614Daniel Dunbar        CmdArgs.push_back("-ldylib1.o");
41551051fc0ba0fb924d6d4a88a2113460a40a542614Daniel Dunbar      } else if (getDarwinToolChain().isTargetIPhoneOS()) {
4156cacb0f007001f7463d44ebd5dde7bfaecf876a71Daniel Dunbar        if (getDarwinToolChain().isIPhoneOSVersionLT(3, 1))
4157cacb0f007001f7463d44ebd5dde7bfaecf876a71Daniel Dunbar          CmdArgs.push_back("-ldylib1.o");
4158cacb0f007001f7463d44ebd5dde7bfaecf876a71Daniel Dunbar      } else {
4159ce3fdf233353b10f20d74dceda3d77a82285de17Daniel Dunbar        if (getDarwinToolChain().isMacosxVersionLT(10, 5))
4160cacb0f007001f7463d44ebd5dde7bfaecf876a71Daniel Dunbar          CmdArgs.push_back("-ldylib1.o");
4161ce3fdf233353b10f20d74dceda3d77a82285de17Daniel Dunbar        else if (getDarwinToolChain().isMacosxVersionLT(10, 6))
4162cacb0f007001f7463d44ebd5dde7bfaecf876a71Daniel Dunbar          CmdArgs.push_back("-ldylib1.10.5.o");
4163cacb0f007001f7463d44ebd5dde7bfaecf876a71Daniel Dunbar      }
416402633b541b04ad5ffc1c70f4c2feeeb13e607057Daniel Dunbar    } else {
416502633b541b04ad5ffc1c70f4c2feeeb13e607057Daniel Dunbar      if (Args.hasArg(options::OPT_bundle)) {
41668a8d8afa3df40e9f122d2b826f1a825a66f6908dDaniel Dunbar        if (!Args.hasArg(options::OPT_static)) {
41678a8d8afa3df40e9f122d2b826f1a825a66f6908dDaniel Dunbar          // Derived from darwin_bundle1 spec.
41681051fc0ba0fb924d6d4a88a2113460a40a542614Daniel Dunbar          if (getDarwinToolChain().isTargetIOSSimulator()) {
41691051fc0ba0fb924d6d4a88a2113460a40a542614Daniel Dunbar            // The simulator doesn't have a versioned crt1 file.
41701051fc0ba0fb924d6d4a88a2113460a40a542614Daniel Dunbar            CmdArgs.push_back("-lbundle1.o");
41711051fc0ba0fb924d6d4a88a2113460a40a542614Daniel Dunbar          } else if (getDarwinToolChain().isTargetIPhoneOS()) {
4172cacb0f007001f7463d44ebd5dde7bfaecf876a71Daniel Dunbar            if (getDarwinToolChain().isIPhoneOSVersionLT(3, 1))
4173cacb0f007001f7463d44ebd5dde7bfaecf876a71Daniel Dunbar              CmdArgs.push_back("-lbundle1.o");
4174cacb0f007001f7463d44ebd5dde7bfaecf876a71Daniel Dunbar          } else {
4175ce3fdf233353b10f20d74dceda3d77a82285de17Daniel Dunbar            if (getDarwinToolChain().isMacosxVersionLT(10, 6))
4176cacb0f007001f7463d44ebd5dde7bfaecf876a71Daniel Dunbar              CmdArgs.push_back("-lbundle1.o");
4177cacb0f007001f7463d44ebd5dde7bfaecf876a71Daniel Dunbar          }
41788a8d8afa3df40e9f122d2b826f1a825a66f6908dDaniel Dunbar        }
417902633b541b04ad5ffc1c70f4c2feeeb13e607057Daniel Dunbar      } else {
4180bbe8e3eff56ac1d79f3668d706536e3cebe28c18Daniel Dunbar        if (Args.hasArg(options::OPT_pg) &&
4181bbe8e3eff56ac1d79f3668d706536e3cebe28c18Daniel Dunbar            getToolChain().SupportsProfiling()) {
418202633b541b04ad5ffc1c70f4c2feeeb13e607057Daniel Dunbar          if (Args.hasArg(options::OPT_static) ||
418302633b541b04ad5ffc1c70f4c2feeeb13e607057Daniel Dunbar              Args.hasArg(options::OPT_object) ||
418402633b541b04ad5ffc1c70f4c2feeeb13e607057Daniel Dunbar              Args.hasArg(options::OPT_preload)) {
418502633b541b04ad5ffc1c70f4c2feeeb13e607057Daniel Dunbar            CmdArgs.push_back("-lgcrt0.o");
418602633b541b04ad5ffc1c70f4c2feeeb13e607057Daniel Dunbar          } else {
418702633b541b04ad5ffc1c70f4c2feeeb13e607057Daniel Dunbar            CmdArgs.push_back("-lgcrt1.o");
4188c21c485b4fb58ef5d55cf3e523263dd824a2ace4Daniel Dunbar
418902633b541b04ad5ffc1c70f4c2feeeb13e607057Daniel Dunbar            // darwin_crt2 spec is empty.
4190c21c485b4fb58ef5d55cf3e523263dd824a2ace4Daniel Dunbar          }
419102633b541b04ad5ffc1c70f4c2feeeb13e607057Daniel Dunbar        } else {
419202633b541b04ad5ffc1c70f4c2feeeb13e607057Daniel Dunbar          if (Args.hasArg(options::OPT_static) ||
419302633b541b04ad5ffc1c70f4c2feeeb13e607057Daniel Dunbar              Args.hasArg(options::OPT_object) ||
419402633b541b04ad5ffc1c70f4c2feeeb13e607057Daniel Dunbar              Args.hasArg(options::OPT_preload)) {
419502633b541b04ad5ffc1c70f4c2feeeb13e607057Daniel Dunbar            CmdArgs.push_back("-lcrt0.o");
419602633b541b04ad5ffc1c70f4c2feeeb13e607057Daniel Dunbar          } else {
419702633b541b04ad5ffc1c70f4c2feeeb13e607057Daniel Dunbar            // Derived from darwin_crt1 spec.
41984035580e3475db9013f335ce2b8a49dd1988a79aDaniel Dunbar            if (getDarwinToolChain().isTargetIOSSimulator()) {
41994035580e3475db9013f335ce2b8a49dd1988a79aDaniel Dunbar              // The simulator doesn't have a versioned crt1 file.
42004035580e3475db9013f335ce2b8a49dd1988a79aDaniel Dunbar              CmdArgs.push_back("-lcrt1.o");
42014035580e3475db9013f335ce2b8a49dd1988a79aDaniel Dunbar            } else if (getDarwinToolChain().isTargetIPhoneOS()) {
4202cacb0f007001f7463d44ebd5dde7bfaecf876a71Daniel Dunbar              if (getDarwinToolChain().isIPhoneOSVersionLT(3, 1))
4203cacb0f007001f7463d44ebd5dde7bfaecf876a71Daniel Dunbar                CmdArgs.push_back("-lcrt1.o");
4204cacb0f007001f7463d44ebd5dde7bfaecf876a71Daniel Dunbar              else
4205cacb0f007001f7463d44ebd5dde7bfaecf876a71Daniel Dunbar                CmdArgs.push_back("-lcrt1.3.1.o");
4206ce3fdf233353b10f20d74dceda3d77a82285de17Daniel Dunbar            } else {
4207ce3fdf233353b10f20d74dceda3d77a82285de17Daniel Dunbar              if (getDarwinToolChain().isMacosxVersionLT(10, 5))
4208ce3fdf233353b10f20d74dceda3d77a82285de17Daniel Dunbar                CmdArgs.push_back("-lcrt1.o");
4209ce3fdf233353b10f20d74dceda3d77a82285de17Daniel Dunbar              else if (getDarwinToolChain().isMacosxVersionLT(10, 6))
4210ce3fdf233353b10f20d74dceda3d77a82285de17Daniel Dunbar                CmdArgs.push_back("-lcrt1.10.5.o");
4211ebcb57a8d298862c65043e88b2429591ab3c58d3Ted Kremenek              else if (getDarwinToolChain().isMacosxVersionLT(10, 8))
4212ce3fdf233353b10f20d74dceda3d77a82285de17Daniel Dunbar                CmdArgs.push_back("-lcrt1.10.6.o");
4213c21c485b4fb58ef5d55cf3e523263dd824a2ace4Daniel Dunbar
4214ce3fdf233353b10f20d74dceda3d77a82285de17Daniel Dunbar              // darwin_crt2 spec is empty.
4215ce3fdf233353b10f20d74dceda3d77a82285de17Daniel Dunbar            }
421602633b541b04ad5ffc1c70f4c2feeeb13e607057Daniel Dunbar          }
421702633b541b04ad5ffc1c70f4c2feeeb13e607057Daniel Dunbar        }
421802633b541b04ad5ffc1c70f4c2feeeb13e607057Daniel Dunbar      }
421902633b541b04ad5ffc1c70f4c2feeeb13e607057Daniel Dunbar    }
422002633b541b04ad5ffc1c70f4c2feeeb13e607057Daniel Dunbar
4221ce3fdf233353b10f20d74dceda3d77a82285de17Daniel Dunbar    if (!getDarwinToolChain().isTargetIPhoneOS() &&
4222ce3fdf233353b10f20d74dceda3d77a82285de17Daniel Dunbar        Args.hasArg(options::OPT_shared_libgcc) &&
4223ce3fdf233353b10f20d74dceda3d77a82285de17Daniel Dunbar        getDarwinToolChain().isMacosxVersionLT(10, 5)) {
4224881376467c46c5c6cc16fa6790271c2c22e1d4f1Daniel Dunbar      const char *Str =
42254a7e88978cf646ad10d654020cb00b3877069210Daniel Dunbar        Args.MakeArgString(getToolChain().GetFilePath("crt3.o"));
4226881376467c46c5c6cc16fa6790271c2c22e1d4f1Daniel Dunbar      CmdArgs.push_back(Str);
422702633b541b04ad5ffc1c70f4c2feeeb13e607057Daniel Dunbar    }
422802633b541b04ad5ffc1c70f4c2feeeb13e607057Daniel Dunbar  }
422902633b541b04ad5ffc1c70f4c2feeeb13e607057Daniel Dunbar
423002633b541b04ad5ffc1c70f4c2feeeb13e607057Daniel Dunbar  Args.AddAllArgs(CmdArgs, options::OPT_L);
4231c21c485b4fb58ef5d55cf3e523263dd824a2ace4Daniel Dunbar
42327b5f1013c5b7f541dc1fae7fc43189377874eabbKostya Serebryany  // If we're building a dynamic lib with -faddress-sanitizer, unresolved
42337b5f1013c5b7f541dc1fae7fc43189377874eabbKostya Serebryany  // symbols may appear. Mark all of them as dynamic_lookup.
42347b5f1013c5b7f541dc1fae7fc43189377874eabbKostya Serebryany  // Linking executables is handled in lib/Driver/ToolChains.cpp.
42357b5f1013c5b7f541dc1fae7fc43189377874eabbKostya Serebryany  if (Args.hasFlag(options::OPT_faddress_sanitizer,
42367b5f1013c5b7f541dc1fae7fc43189377874eabbKostya Serebryany                   options::OPT_fno_address_sanitizer, false)) {
42377b5f1013c5b7f541dc1fae7fc43189377874eabbKostya Serebryany    if (Args.hasArg(options::OPT_dynamiclib) ||
42387b5f1013c5b7f541dc1fae7fc43189377874eabbKostya Serebryany        Args.hasArg(options::OPT_bundle)) {
42397b5f1013c5b7f541dc1fae7fc43189377874eabbKostya Serebryany      CmdArgs.push_back("-undefined");
42407b5f1013c5b7f541dc1fae7fc43189377874eabbKostya Serebryany      CmdArgs.push_back("dynamic_lookup");
42417b5f1013c5b7f541dc1fae7fc43189377874eabbKostya Serebryany    }
42427b5f1013c5b7f541dc1fae7fc43189377874eabbKostya Serebryany  }
42437b5f1013c5b7f541dc1fae7fc43189377874eabbKostya Serebryany
424402633b541b04ad5ffc1c70f4c2feeeb13e607057Daniel Dunbar  if (Args.hasArg(options::OPT_fopenmp))
424502633b541b04ad5ffc1c70f4c2feeeb13e607057Daniel Dunbar    // This is more complicated in gcc...
424602633b541b04ad5ffc1c70f4c2feeeb13e607057Daniel Dunbar    CmdArgs.push_back("-lgomp");
424702633b541b04ad5ffc1c70f4c2feeeb13e607057Daniel Dunbar
424804e326b3d0ae1a84643b7366ce0ea5137e06ed69Douglas Gregor  AddLinkerInputs(getToolChain(), Inputs, Args, CmdArgs);
424904e326b3d0ae1a84643b7366ce0ea5137e06ed69Douglas Gregor
425063d9f3cddee40a3f3e5579e9004b31ec8663b5d9Bob Wilson  if (isObjCRuntimeLinked(Args) &&
425163d9f3cddee40a3f3e5579e9004b31ec8663b5d9Bob Wilson      !Args.hasArg(options::OPT_nostdlib) &&
425263d9f3cddee40a3f3e5579e9004b31ec8663b5d9Bob Wilson      !Args.hasArg(options::OPT_nodefaultlibs)) {
4253ebcb57a8d298862c65043e88b2429591ab3c58d3Ted Kremenek    // Avoid linking compatibility stubs on i386 mac.
4254ebcb57a8d298862c65043e88b2429591ab3c58d3Ted Kremenek    if (!getDarwinToolChain().isTargetMacOS() ||
4255ebcb57a8d298862c65043e88b2429591ab3c58d3Ted Kremenek        getDarwinToolChain().getArchName() != "i386") {
4256ebcb57a8d298862c65043e88b2429591ab3c58d3Ted Kremenek      // If we don't have ARC or subscripting runtime support, link in the
4257ebcb57a8d298862c65043e88b2429591ab3c58d3Ted Kremenek      // runtime stubs.  We have to do this *before* adding any of the normal
4258ebcb57a8d298862c65043e88b2429591ab3c58d3Ted Kremenek      // linker inputs so that its initializer gets run first.
4259ebcb57a8d298862c65043e88b2429591ab3c58d3Ted Kremenek      ObjCRuntime runtime;
4260ebcb57a8d298862c65043e88b2429591ab3c58d3Ted Kremenek      getDarwinToolChain().configureObjCRuntime(runtime);
4261ebcb57a8d298862c65043e88b2429591ab3c58d3Ted Kremenek      // We use arclite library for both ARC and subscripting support.
4262ebcb57a8d298862c65043e88b2429591ab3c58d3Ted Kremenek      if ((!runtime.HasARC && isObjCAutoRefCount(Args)) ||
4263ebcb57a8d298862c65043e88b2429591ab3c58d3Ted Kremenek          !runtime.HasSubscripting)
4264ebcb57a8d298862c65043e88b2429591ab3c58d3Ted Kremenek        getDarwinToolChain().AddLinkARCArgs(Args, CmdArgs);
4265ebcb57a8d298862c65043e88b2429591ab3c58d3Ted Kremenek    }
42660b1c7156844f1e0e37766a64879b1d1d77fc5385Bob Wilson    CmdArgs.push_back("-framework");
42670b1c7156844f1e0e37766a64879b1d1d77fc5385Bob Wilson    CmdArgs.push_back("Foundation");
4268ebcb57a8d298862c65043e88b2429591ab3c58d3Ted Kremenek    // Link libobj.
4269ebcb57a8d298862c65043e88b2429591ab3c58d3Ted Kremenek    CmdArgs.push_back("-lobjc");
42709f084a3166b684573ba49df28fc5792bc37d92e1John McCall  }
4271c21c485b4fb58ef5d55cf3e523263dd824a2ace4Daniel Dunbar
427202633b541b04ad5ffc1c70f4c2feeeb13e607057Daniel Dunbar  if (LinkingOutput) {
427302633b541b04ad5ffc1c70f4c2feeeb13e607057Daniel Dunbar    CmdArgs.push_back("-arch_multiple");
427402633b541b04ad5ffc1c70f4c2feeeb13e607057Daniel Dunbar    CmdArgs.push_back("-final_output");
427502633b541b04ad5ffc1c70f4c2feeeb13e607057Daniel Dunbar    CmdArgs.push_back(LinkingOutput);
427602633b541b04ad5ffc1c70f4c2feeeb13e607057Daniel Dunbar  }
427702633b541b04ad5ffc1c70f4c2feeeb13e607057Daniel Dunbar
427802633b541b04ad5ffc1c70f4c2feeeb13e607057Daniel Dunbar  if (Args.hasArg(options::OPT_fnested_functions))
427902633b541b04ad5ffc1c70f4c2feeeb13e607057Daniel Dunbar    CmdArgs.push_back("-allow_stack_execute");
4280c21c485b4fb58ef5d55cf3e523263dd824a2ace4Daniel Dunbar
428102633b541b04ad5ffc1c70f4c2feeeb13e607057Daniel Dunbar  if (!Args.hasArg(options::OPT_nostdlib) &&
428202633b541b04ad5ffc1c70f4c2feeeb13e607057Daniel Dunbar      !Args.hasArg(options::OPT_nodefaultlibs)) {
4283ee788e70fcd0adf76103b17c78ac658d4ea30c9bDaniel Dunbar    if (getToolChain().getDriver().CCCIsCXX)
4284132e35d2f87895d20e7ea146c8c00404b80221a1Daniel Dunbar      getToolChain().AddCXXStdlibLibArgs(Args, CmdArgs);
4285edfa02b85b186e9ea9e0c841539a77ed32ee9148Daniel Dunbar
428602633b541b04ad5ffc1c70f4c2feeeb13e607057Daniel Dunbar    // link_ssp spec is empty.
428702633b541b04ad5ffc1c70f4c2feeeb13e607057Daniel Dunbar
42886cd4154b9088fa18ae05d11c0f3140fafd76c734Daniel Dunbar    // Let the tool chain choose which runtime library to link.
42896cd4154b9088fa18ae05d11c0f3140fafd76c734Daniel Dunbar    getDarwinToolChain().AddLinkRuntimeLibArgs(Args, CmdArgs);
429002633b541b04ad5ffc1c70f4c2feeeb13e607057Daniel Dunbar  }
429102633b541b04ad5ffc1c70f4c2feeeb13e607057Daniel Dunbar
429202633b541b04ad5ffc1c70f4c2feeeb13e607057Daniel Dunbar  if (!Args.hasArg(options::OPT_A) &&
429302633b541b04ad5ffc1c70f4c2feeeb13e607057Daniel Dunbar      !Args.hasArg(options::OPT_nostdlib) &&
429402633b541b04ad5ffc1c70f4c2feeeb13e607057Daniel Dunbar      !Args.hasArg(options::OPT_nostartfiles)) {
429502633b541b04ad5ffc1c70f4c2feeeb13e607057Daniel Dunbar    // endfile_spec is empty.
429602633b541b04ad5ffc1c70f4c2feeeb13e607057Daniel Dunbar  }
429702633b541b04ad5ffc1c70f4c2feeeb13e607057Daniel Dunbar
429802633b541b04ad5ffc1c70f4c2feeeb13e607057Daniel Dunbar  Args.AddAllArgs(CmdArgs, options::OPT_T_Group);
429902633b541b04ad5ffc1c70f4c2feeeb13e607057Daniel Dunbar  Args.AddAllArgs(CmdArgs, options::OPT_F);
430002633b541b04ad5ffc1c70f4c2feeeb13e607057Daniel Dunbar
4301c21c485b4fb58ef5d55cf3e523263dd824a2ace4Daniel Dunbar  const char *Exec =
43024a7e88978cf646ad10d654020cb00b3877069210Daniel Dunbar    Args.MakeArgString(getToolChain().GetProgramPath("ld"));
43032fe238ed293bd4bc27af9beb9fa151fad2146fa8Daniel Dunbar  C.addCommand(new Command(JA, *this, Exec, CmdArgs));
430402633b541b04ad5ffc1c70f4c2feeeb13e607057Daniel Dunbar}
430502633b541b04ad5ffc1c70f4c2feeeb13e607057Daniel Dunbar
4306ff7488dc9a766f94daf54d81b03ab9160d0bfd88Daniel Dunbarvoid darwin::Lipo::ConstructJob(Compilation &C, const JobAction &JA,
43072fe238ed293bd4bc27af9beb9fa151fad2146fa8Daniel Dunbar                                const InputInfo &Output,
4308c21c485b4fb58ef5d55cf3e523263dd824a2ace4Daniel Dunbar                                const InputInfoList &Inputs,
4309c21c485b4fb58ef5d55cf3e523263dd824a2ace4Daniel Dunbar                                const ArgList &Args,
4310ff7488dc9a766f94daf54d81b03ab9160d0bfd88Daniel Dunbar                                const char *LinkingOutput) const {
4311ff7488dc9a766f94daf54d81b03ab9160d0bfd88Daniel Dunbar  ArgStringList CmdArgs;
4312ff7488dc9a766f94daf54d81b03ab9160d0bfd88Daniel Dunbar
4313ff7488dc9a766f94daf54d81b03ab9160d0bfd88Daniel Dunbar  CmdArgs.push_back("-create");
4314ff7488dc9a766f94daf54d81b03ab9160d0bfd88Daniel Dunbar  assert(Output.isFilename() && "Unexpected lipo output.");
4315a428df828ea4cc6916ea90dcd9fbbc840776d207Daniel Dunbar
4316a428df828ea4cc6916ea90dcd9fbbc840776d207Daniel Dunbar  CmdArgs.push_back("-output");
4317ff7488dc9a766f94daf54d81b03ab9160d0bfd88Daniel Dunbar  CmdArgs.push_back(Output.getFilename());
4318a428df828ea4cc6916ea90dcd9fbbc840776d207Daniel Dunbar
4319ff7488dc9a766f94daf54d81b03ab9160d0bfd88Daniel Dunbar  for (InputInfoList::const_iterator
4320ff7488dc9a766f94daf54d81b03ab9160d0bfd88Daniel Dunbar         it = Inputs.begin(), ie = Inputs.end(); it != ie; ++it) {
4321ff7488dc9a766f94daf54d81b03ab9160d0bfd88Daniel Dunbar    const InputInfo &II = *it;
4322ff7488dc9a766f94daf54d81b03ab9160d0bfd88Daniel Dunbar    assert(II.isFilename() && "Unexpected lipo input.");
4323ff7488dc9a766f94daf54d81b03ab9160d0bfd88Daniel Dunbar    CmdArgs.push_back(II.getFilename());
4324ff7488dc9a766f94daf54d81b03ab9160d0bfd88Daniel Dunbar  }
4325c21c485b4fb58ef5d55cf3e523263dd824a2ace4Daniel Dunbar  const char *Exec =
43264a7e88978cf646ad10d654020cb00b3877069210Daniel Dunbar    Args.MakeArgString(getToolChain().GetProgramPath("lipo"));
43272fe238ed293bd4bc27af9beb9fa151fad2146fa8Daniel Dunbar  C.addCommand(new Command(JA, *this, Exec, CmdArgs));
4328ff7488dc9a766f94daf54d81b03ab9160d0bfd88Daniel Dunbar}
432968a31d406c6dc4382c700d1199b062de2aa7e1daDaniel Dunbar
43306e0f25483b1a801cd1155ea89c2b725feab16332Daniel Dunbarvoid darwin::Dsymutil::ConstructJob(Compilation &C, const JobAction &JA,
43312fe238ed293bd4bc27af9beb9fa151fad2146fa8Daniel Dunbar                                    const InputInfo &Output,
43326e0f25483b1a801cd1155ea89c2b725feab16332Daniel Dunbar                                    const InputInfoList &Inputs,
43336e0f25483b1a801cd1155ea89c2b725feab16332Daniel Dunbar                                    const ArgList &Args,
43346e0f25483b1a801cd1155ea89c2b725feab16332Daniel Dunbar                                    const char *LinkingOutput) const {
43356e0f25483b1a801cd1155ea89c2b725feab16332Daniel Dunbar  ArgStringList CmdArgs;
43366e0f25483b1a801cd1155ea89c2b725feab16332Daniel Dunbar
433703e92303e6e9d366ff35388b982eea7f7db33e62Daniel Dunbar  CmdArgs.push_back("-o");
433803e92303e6e9d366ff35388b982eea7f7db33e62Daniel Dunbar  CmdArgs.push_back(Output.getFilename());
433903e92303e6e9d366ff35388b982eea7f7db33e62Daniel Dunbar
43406e0f25483b1a801cd1155ea89c2b725feab16332Daniel Dunbar  assert(Inputs.size() == 1 && "Unable to handle multiple inputs.");
43416e0f25483b1a801cd1155ea89c2b725feab16332Daniel Dunbar  const InputInfo &Input = Inputs[0];
43426e0f25483b1a801cd1155ea89c2b725feab16332Daniel Dunbar  assert(Input.isFilename() && "Unexpected dsymutil input.");
43436e0f25483b1a801cd1155ea89c2b725feab16332Daniel Dunbar  CmdArgs.push_back(Input.getFilename());
43446e0f25483b1a801cd1155ea89c2b725feab16332Daniel Dunbar
43456e0f25483b1a801cd1155ea89c2b725feab16332Daniel Dunbar  const char *Exec =
43464a7e88978cf646ad10d654020cb00b3877069210Daniel Dunbar    Args.MakeArgString(getToolChain().GetProgramPath("dsymutil"));
43472fe238ed293bd4bc27af9beb9fa151fad2146fa8Daniel Dunbar  C.addCommand(new Command(JA, *this, Exec, CmdArgs));
43486e0f25483b1a801cd1155ea89c2b725feab16332Daniel Dunbar}
43496e0f25483b1a801cd1155ea89c2b725feab16332Daniel Dunbar
4350f857186fd1995b34185d063a29b11ad4f948519fEric Christophervoid darwin::VerifyDebug::ConstructJob(Compilation &C, const JobAction &JA,
4351f857186fd1995b34185d063a29b11ad4f948519fEric Christopher				       const InputInfo &Output,
4352f857186fd1995b34185d063a29b11ad4f948519fEric Christopher				       const InputInfoList &Inputs,
4353f857186fd1995b34185d063a29b11ad4f948519fEric Christopher				       const ArgList &Args,
4354f857186fd1995b34185d063a29b11ad4f948519fEric Christopher				       const char *LinkingOutput) const {
4355f857186fd1995b34185d063a29b11ad4f948519fEric Christopher  ArgStringList CmdArgs;
4356f857186fd1995b34185d063a29b11ad4f948519fEric Christopher  CmdArgs.push_back("--verify");
43571c79dc4086a5fc754689ace567cb7418ed022fccEric Christopher  CmdArgs.push_back("--debug-info");
43581c79dc4086a5fc754689ace567cb7418ed022fccEric Christopher  CmdArgs.push_back("--eh-frame");
4359b822f72c708e235a135fcaf9eb1dba8c20c6a680Eric Christopher  CmdArgs.push_back("--quiet");
4360f857186fd1995b34185d063a29b11ad4f948519fEric Christopher
4361f857186fd1995b34185d063a29b11ad4f948519fEric Christopher  assert(Inputs.size() == 1 && "Unable to handle multiple inputs.");
4362f857186fd1995b34185d063a29b11ad4f948519fEric Christopher  const InputInfo &Input = Inputs[0];
4363f857186fd1995b34185d063a29b11ad4f948519fEric Christopher  assert(Input.isFilename() && "Unexpected verify input");
4364f857186fd1995b34185d063a29b11ad4f948519fEric Christopher
4365f857186fd1995b34185d063a29b11ad4f948519fEric Christopher  // Grabbing the output of the earlier dsymutil run.
4366f857186fd1995b34185d063a29b11ad4f948519fEric Christopher  CmdArgs.push_back(Input.getFilename());
4367f857186fd1995b34185d063a29b11ad4f948519fEric Christopher
4368f857186fd1995b34185d063a29b11ad4f948519fEric Christopher  const char *Exec =
4369f857186fd1995b34185d063a29b11ad4f948519fEric Christopher    Args.MakeArgString(getToolChain().GetProgramPath("dwarfdump"));
4370f857186fd1995b34185d063a29b11ad4f948519fEric Christopher  C.addCommand(new Command(JA, *this, Exec, CmdArgs));
4371f857186fd1995b34185d063a29b11ad4f948519fEric Christopher}
4372f857186fd1995b34185d063a29b11ad4f948519fEric Christopher
437331c4690047f5f362ecf886f1586844b1aef0c4d2David Chisnallvoid solaris::Assemble::ConstructJob(Compilation &C, const JobAction &JA,
437431c4690047f5f362ecf886f1586844b1aef0c4d2David Chisnall                                      const InputInfo &Output,
437531c4690047f5f362ecf886f1586844b1aef0c4d2David Chisnall                                      const InputInfoList &Inputs,
437631c4690047f5f362ecf886f1586844b1aef0c4d2David Chisnall                                      const ArgList &Args,
437731c4690047f5f362ecf886f1586844b1aef0c4d2David Chisnall                                      const char *LinkingOutput) const {
437831c4690047f5f362ecf886f1586844b1aef0c4d2David Chisnall  ArgStringList CmdArgs;
437931c4690047f5f362ecf886f1586844b1aef0c4d2David Chisnall
438031c4690047f5f362ecf886f1586844b1aef0c4d2David Chisnall  Args.AddAllArgValues(CmdArgs, options::OPT_Wa_COMMA,
438131c4690047f5f362ecf886f1586844b1aef0c4d2David Chisnall                       options::OPT_Xassembler);
438231c4690047f5f362ecf886f1586844b1aef0c4d2David Chisnall
438331c4690047f5f362ecf886f1586844b1aef0c4d2David Chisnall  CmdArgs.push_back("-o");
438431c4690047f5f362ecf886f1586844b1aef0c4d2David Chisnall  CmdArgs.push_back(Output.getFilename());
438531c4690047f5f362ecf886f1586844b1aef0c4d2David Chisnall
438631c4690047f5f362ecf886f1586844b1aef0c4d2David Chisnall  for (InputInfoList::const_iterator
438731c4690047f5f362ecf886f1586844b1aef0c4d2David Chisnall         it = Inputs.begin(), ie = Inputs.end(); it != ie; ++it) {
438831c4690047f5f362ecf886f1586844b1aef0c4d2David Chisnall    const InputInfo &II = *it;
438931c4690047f5f362ecf886f1586844b1aef0c4d2David Chisnall    CmdArgs.push_back(II.getFilename());
439031c4690047f5f362ecf886f1586844b1aef0c4d2David Chisnall  }
439131c4690047f5f362ecf886f1586844b1aef0c4d2David Chisnall
439231c4690047f5f362ecf886f1586844b1aef0c4d2David Chisnall  const char *Exec =
439331c4690047f5f362ecf886f1586844b1aef0c4d2David Chisnall    Args.MakeArgString(getToolChain().GetProgramPath("as"));
439431c4690047f5f362ecf886f1586844b1aef0c4d2David Chisnall  C.addCommand(new Command(JA, *this, Exec, CmdArgs));
439531c4690047f5f362ecf886f1586844b1aef0c4d2David Chisnall}
439631c4690047f5f362ecf886f1586844b1aef0c4d2David Chisnall
439731c4690047f5f362ecf886f1586844b1aef0c4d2David Chisnall
439831c4690047f5f362ecf886f1586844b1aef0c4d2David Chisnallvoid solaris::Link::ConstructJob(Compilation &C, const JobAction &JA,
439931c4690047f5f362ecf886f1586844b1aef0c4d2David Chisnall                                  const InputInfo &Output,
440031c4690047f5f362ecf886f1586844b1aef0c4d2David Chisnall                                  const InputInfoList &Inputs,
440131c4690047f5f362ecf886f1586844b1aef0c4d2David Chisnall                                  const ArgList &Args,
440231c4690047f5f362ecf886f1586844b1aef0c4d2David Chisnall                                  const char *LinkingOutput) const {
440331c4690047f5f362ecf886f1586844b1aef0c4d2David Chisnall  // FIXME: Find a real GCC, don't hard-code versions here
440431c4690047f5f362ecf886f1586844b1aef0c4d2David Chisnall  std::string GCCLibPath = "/usr/gcc/4.5/lib/gcc/";
440531c4690047f5f362ecf886f1586844b1aef0c4d2David Chisnall  const llvm::Triple &T = getToolChain().getTriple();
440631c4690047f5f362ecf886f1586844b1aef0c4d2David Chisnall  std::string LibPath = "/usr/lib/";
440731c4690047f5f362ecf886f1586844b1aef0c4d2David Chisnall  llvm::Triple::ArchType Arch = T.getArch();
440831c4690047f5f362ecf886f1586844b1aef0c4d2David Chisnall  switch (Arch) {
440931c4690047f5f362ecf886f1586844b1aef0c4d2David Chisnall        case llvm::Triple::x86:
441031c4690047f5f362ecf886f1586844b1aef0c4d2David Chisnall          GCCLibPath += ("i386-" + T.getVendorName() + "-" +
441131c4690047f5f362ecf886f1586844b1aef0c4d2David Chisnall              T.getOSName()).str() + "/4.5.2/";
441231c4690047f5f362ecf886f1586844b1aef0c4d2David Chisnall          break;
441331c4690047f5f362ecf886f1586844b1aef0c4d2David Chisnall        case llvm::Triple::x86_64:
441431c4690047f5f362ecf886f1586844b1aef0c4d2David Chisnall          GCCLibPath += ("i386-" + T.getVendorName() + "-" +
441531c4690047f5f362ecf886f1586844b1aef0c4d2David Chisnall              T.getOSName()).str();
441631c4690047f5f362ecf886f1586844b1aef0c4d2David Chisnall          GCCLibPath += "/4.5.2/amd64/";
441731c4690047f5f362ecf886f1586844b1aef0c4d2David Chisnall          LibPath += "amd64/";
441831c4690047f5f362ecf886f1586844b1aef0c4d2David Chisnall          break;
441931c4690047f5f362ecf886f1586844b1aef0c4d2David Chisnall        default:
442031c4690047f5f362ecf886f1586844b1aef0c4d2David Chisnall          assert(0 && "Unsupported architecture");
442131c4690047f5f362ecf886f1586844b1aef0c4d2David Chisnall  }
442231c4690047f5f362ecf886f1586844b1aef0c4d2David Chisnall
442331c4690047f5f362ecf886f1586844b1aef0c4d2David Chisnall  ArgStringList CmdArgs;
442431c4690047f5f362ecf886f1586844b1aef0c4d2David Chisnall
442541d476d307973cefddeee5661b0573a2cf1b0f24David Chisnall  // Demangle C++ names in errors
442641d476d307973cefddeee5661b0573a2cf1b0f24David Chisnall  CmdArgs.push_back("-C");
442741d476d307973cefddeee5661b0573a2cf1b0f24David Chisnall
442831c4690047f5f362ecf886f1586844b1aef0c4d2David Chisnall  if ((!Args.hasArg(options::OPT_nostdlib)) &&
442931c4690047f5f362ecf886f1586844b1aef0c4d2David Chisnall      (!Args.hasArg(options::OPT_shared))) {
443031c4690047f5f362ecf886f1586844b1aef0c4d2David Chisnall    CmdArgs.push_back("-e");
443131c4690047f5f362ecf886f1586844b1aef0c4d2David Chisnall    CmdArgs.push_back("_start");
443231c4690047f5f362ecf886f1586844b1aef0c4d2David Chisnall  }
443331c4690047f5f362ecf886f1586844b1aef0c4d2David Chisnall
443431c4690047f5f362ecf886f1586844b1aef0c4d2David Chisnall  if (Args.hasArg(options::OPT_static)) {
443531c4690047f5f362ecf886f1586844b1aef0c4d2David Chisnall    CmdArgs.push_back("-Bstatic");
443631c4690047f5f362ecf886f1586844b1aef0c4d2David Chisnall    CmdArgs.push_back("-dn");
443731c4690047f5f362ecf886f1586844b1aef0c4d2David Chisnall  } else {
443831c4690047f5f362ecf886f1586844b1aef0c4d2David Chisnall    CmdArgs.push_back("-Bdynamic");
443931c4690047f5f362ecf886f1586844b1aef0c4d2David Chisnall    if (Args.hasArg(options::OPT_shared)) {
444031c4690047f5f362ecf886f1586844b1aef0c4d2David Chisnall      CmdArgs.push_back("-shared");
444131c4690047f5f362ecf886f1586844b1aef0c4d2David Chisnall    } else {
444231c4690047f5f362ecf886f1586844b1aef0c4d2David Chisnall      CmdArgs.push_back("--dynamic-linker");
444331c4690047f5f362ecf886f1586844b1aef0c4d2David Chisnall      CmdArgs.push_back(Args.MakeArgString(LibPath + "ld.so.1"));
444431c4690047f5f362ecf886f1586844b1aef0c4d2David Chisnall    }
444531c4690047f5f362ecf886f1586844b1aef0c4d2David Chisnall  }
444631c4690047f5f362ecf886f1586844b1aef0c4d2David Chisnall
444731c4690047f5f362ecf886f1586844b1aef0c4d2David Chisnall  if (Output.isFilename()) {
444831c4690047f5f362ecf886f1586844b1aef0c4d2David Chisnall    CmdArgs.push_back("-o");
444931c4690047f5f362ecf886f1586844b1aef0c4d2David Chisnall    CmdArgs.push_back(Output.getFilename());
445031c4690047f5f362ecf886f1586844b1aef0c4d2David Chisnall  } else {
445131c4690047f5f362ecf886f1586844b1aef0c4d2David Chisnall    assert(Output.isNothing() && "Invalid output.");
445231c4690047f5f362ecf886f1586844b1aef0c4d2David Chisnall  }
445331c4690047f5f362ecf886f1586844b1aef0c4d2David Chisnall
445431c4690047f5f362ecf886f1586844b1aef0c4d2David Chisnall  if (!Args.hasArg(options::OPT_nostdlib) &&
445531c4690047f5f362ecf886f1586844b1aef0c4d2David Chisnall      !Args.hasArg(options::OPT_nostartfiles)) {
445631c4690047f5f362ecf886f1586844b1aef0c4d2David Chisnall    if (!Args.hasArg(options::OPT_shared)) {
445731c4690047f5f362ecf886f1586844b1aef0c4d2David Chisnall      CmdArgs.push_back(Args.MakeArgString(LibPath + "crt1.o"));
445831c4690047f5f362ecf886f1586844b1aef0c4d2David Chisnall      CmdArgs.push_back(Args.MakeArgString(LibPath + "crti.o"));
4459165329c1d134d000904d6e08b1d166bf34e05517David Chisnall      CmdArgs.push_back(Args.MakeArgString(LibPath + "values-Xa.o"));
446031c4690047f5f362ecf886f1586844b1aef0c4d2David Chisnall      CmdArgs.push_back(Args.MakeArgString(GCCLibPath + "crtbegin.o"));
446131c4690047f5f362ecf886f1586844b1aef0c4d2David Chisnall    } else {
446231c4690047f5f362ecf886f1586844b1aef0c4d2David Chisnall      CmdArgs.push_back(Args.MakeArgString(LibPath + "crti.o"));
4463165329c1d134d000904d6e08b1d166bf34e05517David Chisnall      CmdArgs.push_back(Args.MakeArgString(LibPath + "values-Xa.o"));
4464165329c1d134d000904d6e08b1d166bf34e05517David Chisnall      CmdArgs.push_back(Args.MakeArgString(GCCLibPath + "crtbegin.o"));
446531c4690047f5f362ecf886f1586844b1aef0c4d2David Chisnall    }
4466e6dd683d99b14ff8cd886cd81e6588cd1883ca52David Chisnall    if (getToolChain().getDriver().CCCIsCXX)
4467e6dd683d99b14ff8cd886cd81e6588cd1883ca52David Chisnall      CmdArgs.push_back(Args.MakeArgString(LibPath + "cxa_finalize.o"));
446831c4690047f5f362ecf886f1586844b1aef0c4d2David Chisnall  }
446931c4690047f5f362ecf886f1586844b1aef0c4d2David Chisnall
447031c4690047f5f362ecf886f1586844b1aef0c4d2David Chisnall  CmdArgs.push_back(Args.MakeArgString("-L" + GCCLibPath));
447131c4690047f5f362ecf886f1586844b1aef0c4d2David Chisnall
447231c4690047f5f362ecf886f1586844b1aef0c4d2David Chisnall  Args.AddAllArgs(CmdArgs, options::OPT_L);
447331c4690047f5f362ecf886f1586844b1aef0c4d2David Chisnall  Args.AddAllArgs(CmdArgs, options::OPT_T_Group);
447431c4690047f5f362ecf886f1586844b1aef0c4d2David Chisnall  Args.AddAllArgs(CmdArgs, options::OPT_e);
4475165329c1d134d000904d6e08b1d166bf34e05517David Chisnall  Args.AddAllArgs(CmdArgs, options::OPT_r);
447631c4690047f5f362ecf886f1586844b1aef0c4d2David Chisnall
447731c4690047f5f362ecf886f1586844b1aef0c4d2David Chisnall  AddLinkerInputs(getToolChain(), Inputs, Args, CmdArgs);
447831c4690047f5f362ecf886f1586844b1aef0c4d2David Chisnall
447931c4690047f5f362ecf886f1586844b1aef0c4d2David Chisnall  if (!Args.hasArg(options::OPT_nostdlib) &&
448031c4690047f5f362ecf886f1586844b1aef0c4d2David Chisnall      !Args.hasArg(options::OPT_nodefaultlibs)) {
4481e58e6f9114e61f0e490b5dc1c4f20b23a30f12dcDavid Chisnall    if (getToolChain().getDriver().CCCIsCXX)
4482e58e6f9114e61f0e490b5dc1c4f20b23a30f12dcDavid Chisnall      getToolChain().AddCXXStdlibLibArgs(Args, CmdArgs);
4483b622959527c07cc6b68739eac1412f75f0ca77faDavid Chisnall    CmdArgs.push_back("-lgcc_s");
4484165329c1d134d000904d6e08b1d166bf34e05517David Chisnall    if (!Args.hasArg(options::OPT_shared)) {
4485165329c1d134d000904d6e08b1d166bf34e05517David Chisnall      CmdArgs.push_back("-lgcc");
448631c4690047f5f362ecf886f1586844b1aef0c4d2David Chisnall      CmdArgs.push_back("-lc");
44877dbefe1b1ffbe1d69cc94d07368065976baa49a1David Chisnall      CmdArgs.push_back("-lm");
4488165329c1d134d000904d6e08b1d166bf34e05517David Chisnall    }
448931c4690047f5f362ecf886f1586844b1aef0c4d2David Chisnall  }
449031c4690047f5f362ecf886f1586844b1aef0c4d2David Chisnall
449131c4690047f5f362ecf886f1586844b1aef0c4d2David Chisnall  if (!Args.hasArg(options::OPT_nostdlib) &&
449231c4690047f5f362ecf886f1586844b1aef0c4d2David Chisnall      !Args.hasArg(options::OPT_nostartfiles)) {
4493165329c1d134d000904d6e08b1d166bf34e05517David Chisnall    CmdArgs.push_back(Args.MakeArgString(GCCLibPath + "crtend.o"));
449431c4690047f5f362ecf886f1586844b1aef0c4d2David Chisnall  }
4495d1ac03ebac3ab5a8456b955e3f8634f786843f9aDavid Chisnall  CmdArgs.push_back(Args.MakeArgString(LibPath + "crtn.o"));
449631c4690047f5f362ecf886f1586844b1aef0c4d2David Chisnall
449731c4690047f5f362ecf886f1586844b1aef0c4d2David Chisnall  addProfileRT(getToolChain(), Args, CmdArgs, getToolChain().getTriple());
449831c4690047f5f362ecf886f1586844b1aef0c4d2David Chisnall
449931c4690047f5f362ecf886f1586844b1aef0c4d2David Chisnall  const char *Exec =
450031c4690047f5f362ecf886f1586844b1aef0c4d2David Chisnall    Args.MakeArgString(getToolChain().GetProgramPath("ld"));
450131c4690047f5f362ecf886f1586844b1aef0c4d2David Chisnall  C.addCommand(new Command(JA, *this, Exec, CmdArgs));
450231c4690047f5f362ecf886f1586844b1aef0c4d2David Chisnall}
450331c4690047f5f362ecf886f1586844b1aef0c4d2David Chisnall
4504e7925a075f110ab21afeae084670a155dea568e3Edward O'Callaghanvoid auroraux::Assemble::ConstructJob(Compilation &C, const JobAction &JA,
45052fe238ed293bd4bc27af9beb9fa151fad2146fa8Daniel Dunbar                                      const InputInfo &Output,
4506294691eb1caf551083acd7b08630ef21c3fd760dDaniel Dunbar                                      const InputInfoList &Inputs,
4507294691eb1caf551083acd7b08630ef21c3fd760dDaniel Dunbar                                      const ArgList &Args,
4508294691eb1caf551083acd7b08630ef21c3fd760dDaniel Dunbar                                      const char *LinkingOutput) const {
4509e7925a075f110ab21afeae084670a155dea568e3Edward O'Callaghan  ArgStringList CmdArgs;
4510e7925a075f110ab21afeae084670a155dea568e3Edward O'Callaghan
4511e7925a075f110ab21afeae084670a155dea568e3Edward O'Callaghan  Args.AddAllArgValues(CmdArgs, options::OPT_Wa_COMMA,
4512e7925a075f110ab21afeae084670a155dea568e3Edward O'Callaghan                       options::OPT_Xassembler);
4513e7925a075f110ab21afeae084670a155dea568e3Edward O'Callaghan
4514e7925a075f110ab21afeae084670a155dea568e3Edward O'Callaghan  CmdArgs.push_back("-o");
45157c1e46533cae07216e2a67d5636a5afb44253155Daniel Dunbar  CmdArgs.push_back(Output.getFilename());
4516e7925a075f110ab21afeae084670a155dea568e3Edward O'Callaghan
4517e7925a075f110ab21afeae084670a155dea568e3Edward O'Callaghan  for (InputInfoList::const_iterator
4518e7925a075f110ab21afeae084670a155dea568e3Edward O'Callaghan         it = Inputs.begin(), ie = Inputs.end(); it != ie; ++it) {
4519e7925a075f110ab21afeae084670a155dea568e3Edward O'Callaghan    const InputInfo &II = *it;
45207c1e46533cae07216e2a67d5636a5afb44253155Daniel Dunbar    CmdArgs.push_back(II.getFilename());
4521e7925a075f110ab21afeae084670a155dea568e3Edward O'Callaghan  }
4522e7925a075f110ab21afeae084670a155dea568e3Edward O'Callaghan
4523e7925a075f110ab21afeae084670a155dea568e3Edward O'Callaghan  const char *Exec =
45244a7e88978cf646ad10d654020cb00b3877069210Daniel Dunbar    Args.MakeArgString(getToolChain().GetProgramPath("gas"));
45252fe238ed293bd4bc27af9beb9fa151fad2146fa8Daniel Dunbar  C.addCommand(new Command(JA, *this, Exec, CmdArgs));
4526e7925a075f110ab21afeae084670a155dea568e3Edward O'Callaghan}
4527e7925a075f110ab21afeae084670a155dea568e3Edward O'Callaghan
4528e7925a075f110ab21afeae084670a155dea568e3Edward O'Callaghanvoid auroraux::Link::ConstructJob(Compilation &C, const JobAction &JA,
45292fe238ed293bd4bc27af9beb9fa151fad2146fa8Daniel Dunbar                                  const InputInfo &Output,
4530294691eb1caf551083acd7b08630ef21c3fd760dDaniel Dunbar                                  const InputInfoList &Inputs,
4531294691eb1caf551083acd7b08630ef21c3fd760dDaniel Dunbar                                  const ArgList &Args,
4532294691eb1caf551083acd7b08630ef21c3fd760dDaniel Dunbar                                  const char *LinkingOutput) const {
4533e7925a075f110ab21afeae084670a155dea568e3Edward O'Callaghan  ArgStringList CmdArgs;
4534e7925a075f110ab21afeae084670a155dea568e3Edward O'Callaghan
4535e7925a075f110ab21afeae084670a155dea568e3Edward O'Callaghan  if ((!Args.hasArg(options::OPT_nostdlib)) &&
4536294691eb1caf551083acd7b08630ef21c3fd760dDaniel Dunbar      (!Args.hasArg(options::OPT_shared))) {
4537e7925a075f110ab21afeae084670a155dea568e3Edward O'Callaghan    CmdArgs.push_back("-e");
45387adf94906e23eae295a006659c55eab9ffcf8b37Edward O'Callaghan    CmdArgs.push_back("_start");
4539e7925a075f110ab21afeae084670a155dea568e3Edward O'Callaghan  }
4540e7925a075f110ab21afeae084670a155dea568e3Edward O'Callaghan
4541e7925a075f110ab21afeae084670a155dea568e3Edward O'Callaghan  if (Args.hasArg(options::OPT_static)) {
4542e7925a075f110ab21afeae084670a155dea568e3Edward O'Callaghan    CmdArgs.push_back("-Bstatic");
45437adf94906e23eae295a006659c55eab9ffcf8b37Edward O'Callaghan    CmdArgs.push_back("-dn");
4544e7925a075f110ab21afeae084670a155dea568e3Edward O'Callaghan  } else {
45457adf94906e23eae295a006659c55eab9ffcf8b37Edward O'Callaghan//    CmdArgs.push_back("--eh-frame-hdr");
4546e7925a075f110ab21afeae084670a155dea568e3Edward O'Callaghan    CmdArgs.push_back("-Bdynamic");
4547e7925a075f110ab21afeae084670a155dea568e3Edward O'Callaghan    if (Args.hasArg(options::OPT_shared)) {
4548e7925a075f110ab21afeae084670a155dea568e3Edward O'Callaghan      CmdArgs.push_back("-shared");
4549e7925a075f110ab21afeae084670a155dea568e3Edward O'Callaghan    } else {
45503cecc19f606ba1000da885b8ff4c089abad224ddEdward O'Callaghan      CmdArgs.push_back("--dynamic-linker");
4551e7925a075f110ab21afeae084670a155dea568e3Edward O'Callaghan      CmdArgs.push_back("/lib/ld.so.1"); // 64Bit Path /lib/amd64/ld.so.1
4552e7925a075f110ab21afeae084670a155dea568e3Edward O'Callaghan    }
4553e7925a075f110ab21afeae084670a155dea568e3Edward O'Callaghan  }
4554e7925a075f110ab21afeae084670a155dea568e3Edward O'Callaghan
45557c1e46533cae07216e2a67d5636a5afb44253155Daniel Dunbar  if (Output.isFilename()) {
4556e7925a075f110ab21afeae084670a155dea568e3Edward O'Callaghan    CmdArgs.push_back("-o");
4557e7925a075f110ab21afeae084670a155dea568e3Edward O'Callaghan    CmdArgs.push_back(Output.getFilename());
4558e7925a075f110ab21afeae084670a155dea568e3Edward O'Callaghan  } else {
4559e7925a075f110ab21afeae084670a155dea568e3Edward O'Callaghan    assert(Output.isNothing() && "Invalid output.");
4560e7925a075f110ab21afeae084670a155dea568e3Edward O'Callaghan  }
4561e7925a075f110ab21afeae084670a155dea568e3Edward O'Callaghan
4562e7925a075f110ab21afeae084670a155dea568e3Edward O'Callaghan  if (!Args.hasArg(options::OPT_nostdlib) &&
4563e7925a075f110ab21afeae084670a155dea568e3Edward O'Callaghan      !Args.hasArg(options::OPT_nostartfiles)) {
4564e7925a075f110ab21afeae084670a155dea568e3Edward O'Callaghan    if (!Args.hasArg(options::OPT_shared)) {
456538e317d6dce161b249508686cc67eb7176958762Chris Lattner      CmdArgs.push_back(Args.MakeArgString(
45664a7e88978cf646ad10d654020cb00b3877069210Daniel Dunbar                                getToolChain().GetFilePath("crt1.o")));
456738e317d6dce161b249508686cc67eb7176958762Chris Lattner      CmdArgs.push_back(Args.MakeArgString(
45684a7e88978cf646ad10d654020cb00b3877069210Daniel Dunbar                                getToolChain().GetFilePath("crti.o")));
456938e317d6dce161b249508686cc67eb7176958762Chris Lattner      CmdArgs.push_back(Args.MakeArgString(
45704a7e88978cf646ad10d654020cb00b3877069210Daniel Dunbar                                getToolChain().GetFilePath("crtbegin.o")));
4571e7925a075f110ab21afeae084670a155dea568e3Edward O'Callaghan    } else {
457238e317d6dce161b249508686cc67eb7176958762Chris Lattner      CmdArgs.push_back(Args.MakeArgString(
45734a7e88978cf646ad10d654020cb00b3877069210Daniel Dunbar                                getToolChain().GetFilePath("crti.o")));
4574e7925a075f110ab21afeae084670a155dea568e3Edward O'Callaghan    }
457538e317d6dce161b249508686cc67eb7176958762Chris Lattner    CmdArgs.push_back(Args.MakeArgString(
45764a7e88978cf646ad10d654020cb00b3877069210Daniel Dunbar                                getToolChain().GetFilePath("crtn.o")));
4577e7925a075f110ab21afeae084670a155dea568e3Edward O'Callaghan  }
4578e7925a075f110ab21afeae084670a155dea568e3Edward O'Callaghan
4579294691eb1caf551083acd7b08630ef21c3fd760dDaniel Dunbar  CmdArgs.push_back(Args.MakeArgString("-L/opt/gcc4/lib/gcc/"
4580294691eb1caf551083acd7b08630ef21c3fd760dDaniel Dunbar                                       + getToolChain().getTripleString()
4581f7fb31f4751c9c5ac3d9f93c19ec05a74dd9546fDaniel Dunbar                                       + "/4.2.4"));
4582e7925a075f110ab21afeae084670a155dea568e3Edward O'Callaghan
4583e7925a075f110ab21afeae084670a155dea568e3Edward O'Callaghan  Args.AddAllArgs(CmdArgs, options::OPT_L);
4584e7925a075f110ab21afeae084670a155dea568e3Edward O'Callaghan  Args.AddAllArgs(CmdArgs, options::OPT_T_Group);
4585e7925a075f110ab21afeae084670a155dea568e3Edward O'Callaghan  Args.AddAllArgs(CmdArgs, options::OPT_e);
4586e7925a075f110ab21afeae084670a155dea568e3Edward O'Callaghan
45872008feead855f08500fb01ff43ef5eebee05d1e5Daniel Dunbar  AddLinkerInputs(getToolChain(), Inputs, Args, CmdArgs);
4588e7925a075f110ab21afeae084670a155dea568e3Edward O'Callaghan
4589e7925a075f110ab21afeae084670a155dea568e3Edward O'Callaghan  if (!Args.hasArg(options::OPT_nostdlib) &&
4590e7925a075f110ab21afeae084670a155dea568e3Edward O'Callaghan      !Args.hasArg(options::OPT_nodefaultlibs)) {
4591e7925a075f110ab21afeae084670a155dea568e3Edward O'Callaghan    // FIXME: For some reason GCC passes -lgcc before adding
4592e7925a075f110ab21afeae084670a155dea568e3Edward O'Callaghan    // the default system libraries. Just mimic this for now.
4593e7925a075f110ab21afeae084670a155dea568e3Edward O'Callaghan    CmdArgs.push_back("-lgcc");
4594e7925a075f110ab21afeae084670a155dea568e3Edward O'Callaghan
4595e7925a075f110ab21afeae084670a155dea568e3Edward O'Callaghan    if (Args.hasArg(options::OPT_pthread))
4596e7925a075f110ab21afeae084670a155dea568e3Edward O'Callaghan      CmdArgs.push_back("-pthread");
4597e7925a075f110ab21afeae084670a155dea568e3Edward O'Callaghan    if (!Args.hasArg(options::OPT_shared))
4598e7925a075f110ab21afeae084670a155dea568e3Edward O'Callaghan      CmdArgs.push_back("-lc");
4599e7925a075f110ab21afeae084670a155dea568e3Edward O'Callaghan    CmdArgs.push_back("-lgcc");
4600e7925a075f110ab21afeae084670a155dea568e3Edward O'Callaghan  }
4601e7925a075f110ab21afeae084670a155dea568e3Edward O'Callaghan
4602e7925a075f110ab21afeae084670a155dea568e3Edward O'Callaghan  if (!Args.hasArg(options::OPT_nostdlib) &&
4603e7925a075f110ab21afeae084670a155dea568e3Edward O'Callaghan      !Args.hasArg(options::OPT_nostartfiles)) {
4604e7925a075f110ab21afeae084670a155dea568e3Edward O'Callaghan    if (!Args.hasArg(options::OPT_shared))
460538e317d6dce161b249508686cc67eb7176958762Chris Lattner      CmdArgs.push_back(Args.MakeArgString(
46064a7e88978cf646ad10d654020cb00b3877069210Daniel Dunbar                                getToolChain().GetFilePath("crtend.o")));
4607e7925a075f110ab21afeae084670a155dea568e3Edward O'Callaghan  }
4608e7925a075f110ab21afeae084670a155dea568e3Edward O'Callaghan
46093f4be6fb8872942f567166ab8d99c89885f26103Bill Wendling  addProfileRT(getToolChain(), Args, CmdArgs, getToolChain().getTriple());
46102e95a6d7d0b5aed39747875d7474c27824f7319fNick Lewycky
4611e7925a075f110ab21afeae084670a155dea568e3Edward O'Callaghan  const char *Exec =
46124a7e88978cf646ad10d654020cb00b3877069210Daniel Dunbar    Args.MakeArgString(getToolChain().GetProgramPath("ld"));
46132fe238ed293bd4bc27af9beb9fa151fad2146fa8Daniel Dunbar  C.addCommand(new Command(JA, *this, Exec, CmdArgs));
4614e7925a075f110ab21afeae084670a155dea568e3Edward O'Callaghan}
4615e7925a075f110ab21afeae084670a155dea568e3Edward O'Callaghan
4616f7b8eec37c8c8012fa525c71fb29a58c9f29beefDaniel Dunbarvoid openbsd::Assemble::ConstructJob(Compilation &C, const JobAction &JA,
46172fe238ed293bd4bc27af9beb9fa151fad2146fa8Daniel Dunbar                                     const InputInfo &Output,
4618f7b8eec37c8c8012fa525c71fb29a58c9f29beefDaniel Dunbar                                     const InputInfoList &Inputs,
4619f7b8eec37c8c8012fa525c71fb29a58c9f29beefDaniel Dunbar                                     const ArgList &Args,
46201eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump                                     const char *LinkingOutput) const {
4621f7b8eec37c8c8012fa525c71fb29a58c9f29beefDaniel Dunbar  ArgStringList CmdArgs;
4622f7b8eec37c8c8012fa525c71fb29a58c9f29beefDaniel Dunbar
4623f7b8eec37c8c8012fa525c71fb29a58c9f29beefDaniel Dunbar  Args.AddAllArgValues(CmdArgs, options::OPT_Wa_COMMA,
4624f7b8eec37c8c8012fa525c71fb29a58c9f29beefDaniel Dunbar                       options::OPT_Xassembler);
4625f7b8eec37c8c8012fa525c71fb29a58c9f29beefDaniel Dunbar
4626f7b8eec37c8c8012fa525c71fb29a58c9f29beefDaniel Dunbar  CmdArgs.push_back("-o");
46277c1e46533cae07216e2a67d5636a5afb44253155Daniel Dunbar  CmdArgs.push_back(Output.getFilename());
4628f7b8eec37c8c8012fa525c71fb29a58c9f29beefDaniel Dunbar
4629f7b8eec37c8c8012fa525c71fb29a58c9f29beefDaniel Dunbar  for (InputInfoList::const_iterator
4630f7b8eec37c8c8012fa525c71fb29a58c9f29beefDaniel Dunbar         it = Inputs.begin(), ie = Inputs.end(); it != ie; ++it) {
4631f7b8eec37c8c8012fa525c71fb29a58c9f29beefDaniel Dunbar    const InputInfo &II = *it;
46327c1e46533cae07216e2a67d5636a5afb44253155Daniel Dunbar    CmdArgs.push_back(II.getFilename());
4633f7b8eec37c8c8012fa525c71fb29a58c9f29beefDaniel Dunbar  }
4634f7b8eec37c8c8012fa525c71fb29a58c9f29beefDaniel Dunbar
4635f7b8eec37c8c8012fa525c71fb29a58c9f29beefDaniel Dunbar  const char *Exec =
46364a7e88978cf646ad10d654020cb00b3877069210Daniel Dunbar    Args.MakeArgString(getToolChain().GetProgramPath("as"));
46372fe238ed293bd4bc27af9beb9fa151fad2146fa8Daniel Dunbar  C.addCommand(new Command(JA, *this, Exec, CmdArgs));
4638f7b8eec37c8c8012fa525c71fb29a58c9f29beefDaniel Dunbar}
4639f7b8eec37c8c8012fa525c71fb29a58c9f29beefDaniel Dunbar
4640f7b8eec37c8c8012fa525c71fb29a58c9f29beefDaniel Dunbarvoid openbsd::Link::ConstructJob(Compilation &C, const JobAction &JA,
46412fe238ed293bd4bc27af9beb9fa151fad2146fa8Daniel Dunbar                                 const InputInfo &Output,
4642f7b8eec37c8c8012fa525c71fb29a58c9f29beefDaniel Dunbar                                 const InputInfoList &Inputs,
4643f7b8eec37c8c8012fa525c71fb29a58c9f29beefDaniel Dunbar                                 const ArgList &Args,
4644f7b8eec37c8c8012fa525c71fb29a58c9f29beefDaniel Dunbar                                 const char *LinkingOutput) const {
4645ee788e70fcd0adf76103b17c78ac658d4ea30c9bDaniel Dunbar  const Driver &D = getToolChain().getDriver();
4646f7b8eec37c8c8012fa525c71fb29a58c9f29beefDaniel Dunbar  ArgStringList CmdArgs;
4647f7b8eec37c8c8012fa525c71fb29a58c9f29beefDaniel Dunbar
46482bbcf669742b6b27748414e22f8042236fceef65Daniel Dunbar  if ((!Args.hasArg(options::OPT_nostdlib)) &&
4649294691eb1caf551083acd7b08630ef21c3fd760dDaniel Dunbar      (!Args.hasArg(options::OPT_shared))) {
46502bbcf669742b6b27748414e22f8042236fceef65Daniel Dunbar    CmdArgs.push_back("-e");
46512bbcf669742b6b27748414e22f8042236fceef65Daniel Dunbar    CmdArgs.push_back("__start");
46522bbcf669742b6b27748414e22f8042236fceef65Daniel Dunbar  }
46532bbcf669742b6b27748414e22f8042236fceef65Daniel Dunbar
4654f7b8eec37c8c8012fa525c71fb29a58c9f29beefDaniel Dunbar  if (Args.hasArg(options::OPT_static)) {
4655f7b8eec37c8c8012fa525c71fb29a58c9f29beefDaniel Dunbar    CmdArgs.push_back("-Bstatic");
4656f7b8eec37c8c8012fa525c71fb29a58c9f29beefDaniel Dunbar  } else {
465765ba55da577b23b24513b815031fc870d1d27971Rafael Espindola    if (Args.hasArg(options::OPT_rdynamic))
465865ba55da577b23b24513b815031fc870d1d27971Rafael Espindola      CmdArgs.push_back("-export-dynamic");
4659f7b8eec37c8c8012fa525c71fb29a58c9f29beefDaniel Dunbar    CmdArgs.push_back("--eh-frame-hdr");
46602bbcf669742b6b27748414e22f8042236fceef65Daniel Dunbar    CmdArgs.push_back("-Bdynamic");
4661f7b8eec37c8c8012fa525c71fb29a58c9f29beefDaniel Dunbar    if (Args.hasArg(options::OPT_shared)) {
46622bbcf669742b6b27748414e22f8042236fceef65Daniel Dunbar      CmdArgs.push_back("-shared");
4663f7b8eec37c8c8012fa525c71fb29a58c9f29beefDaniel Dunbar    } else {
4664f7b8eec37c8c8012fa525c71fb29a58c9f29beefDaniel Dunbar      CmdArgs.push_back("-dynamic-linker");
4665f7b8eec37c8c8012fa525c71fb29a58c9f29beefDaniel Dunbar      CmdArgs.push_back("/usr/libexec/ld.so");
4666f7b8eec37c8c8012fa525c71fb29a58c9f29beefDaniel Dunbar    }
4667f7b8eec37c8c8012fa525c71fb29a58c9f29beefDaniel Dunbar  }
4668f7b8eec37c8c8012fa525c71fb29a58c9f29beefDaniel Dunbar
46697c1e46533cae07216e2a67d5636a5afb44253155Daniel Dunbar  if (Output.isFilename()) {
4670f7b8eec37c8c8012fa525c71fb29a58c9f29beefDaniel Dunbar    CmdArgs.push_back("-o");
4671f7b8eec37c8c8012fa525c71fb29a58c9f29beefDaniel Dunbar    CmdArgs.push_back(Output.getFilename());
4672f7b8eec37c8c8012fa525c71fb29a58c9f29beefDaniel Dunbar  } else {
4673f7b8eec37c8c8012fa525c71fb29a58c9f29beefDaniel Dunbar    assert(Output.isNothing() && "Invalid output.");
4674f7b8eec37c8c8012fa525c71fb29a58c9f29beefDaniel Dunbar  }
4675f7b8eec37c8c8012fa525c71fb29a58c9f29beefDaniel Dunbar
4676f7b8eec37c8c8012fa525c71fb29a58c9f29beefDaniel Dunbar  if (!Args.hasArg(options::OPT_nostdlib) &&
4677f7b8eec37c8c8012fa525c71fb29a58c9f29beefDaniel Dunbar      !Args.hasArg(options::OPT_nostartfiles)) {
4678f7b8eec37c8c8012fa525c71fb29a58c9f29beefDaniel Dunbar    if (!Args.hasArg(options::OPT_shared)) {
467962d829abaf61d70483a5a584059440a549a306bfEli Friedman      if (Args.hasArg(options::OPT_pg))
468062d829abaf61d70483a5a584059440a549a306bfEli Friedman        CmdArgs.push_back(Args.MakeArgString(
468162d829abaf61d70483a5a584059440a549a306bfEli Friedman                                getToolChain().GetFilePath("gcrt0.o")));
468262d829abaf61d70483a5a584059440a549a306bfEli Friedman      else
468362d829abaf61d70483a5a584059440a549a306bfEli Friedman        CmdArgs.push_back(Args.MakeArgString(
468462d829abaf61d70483a5a584059440a549a306bfEli Friedman                                getToolChain().GetFilePath("crt0.o")));
468538e317d6dce161b249508686cc67eb7176958762Chris Lattner      CmdArgs.push_back(Args.MakeArgString(
46864a7e88978cf646ad10d654020cb00b3877069210Daniel Dunbar                              getToolChain().GetFilePath("crtbegin.o")));
4687f7b8eec37c8c8012fa525c71fb29a58c9f29beefDaniel Dunbar    } else {
468838e317d6dce161b249508686cc67eb7176958762Chris Lattner      CmdArgs.push_back(Args.MakeArgString(
46894a7e88978cf646ad10d654020cb00b3877069210Daniel Dunbar                              getToolChain().GetFilePath("crtbeginS.o")));
4690f7b8eec37c8c8012fa525c71fb29a58c9f29beefDaniel Dunbar    }
4691f7b8eec37c8c8012fa525c71fb29a58c9f29beefDaniel Dunbar  }
4692f7b8eec37c8c8012fa525c71fb29a58c9f29beefDaniel Dunbar
4693e7e18200e614a5e619602a088544c85ac8305a1fEdward O'Callaghan  std::string Triple = getToolChain().getTripleString();
4694e7e18200e614a5e619602a088544c85ac8305a1fEdward O'Callaghan  if (Triple.substr(0, 6) == "x86_64")
4695294691eb1caf551083acd7b08630ef21c3fd760dDaniel Dunbar    Triple.replace(0, 6, "amd64");
4696f7fb31f4751c9c5ac3d9f93c19ec05a74dd9546fDaniel Dunbar  CmdArgs.push_back(Args.MakeArgString("-L/usr/lib/gcc-lib/" + Triple +
469795c0457054518102af6250e718a13a5b2ee5dbeaDaniel Dunbar                                       "/4.2.1"));
46982bbcf669742b6b27748414e22f8042236fceef65Daniel Dunbar
4699f7b8eec37c8c8012fa525c71fb29a58c9f29beefDaniel Dunbar  Args.AddAllArgs(CmdArgs, options::OPT_L);
4700f7b8eec37c8c8012fa525c71fb29a58c9f29beefDaniel Dunbar  Args.AddAllArgs(CmdArgs, options::OPT_T_Group);
4701f7b8eec37c8c8012fa525c71fb29a58c9f29beefDaniel Dunbar  Args.AddAllArgs(CmdArgs, options::OPT_e);
4702f7b8eec37c8c8012fa525c71fb29a58c9f29beefDaniel Dunbar
47032008feead855f08500fb01ff43ef5eebee05d1e5Daniel Dunbar  AddLinkerInputs(getToolChain(), Inputs, Args, CmdArgs);
4704f7b8eec37c8c8012fa525c71fb29a58c9f29beefDaniel Dunbar
4705f7b8eec37c8c8012fa525c71fb29a58c9f29beefDaniel Dunbar  if (!Args.hasArg(options::OPT_nostdlib) &&
4706f7b8eec37c8c8012fa525c71fb29a58c9f29beefDaniel Dunbar      !Args.hasArg(options::OPT_nodefaultlibs)) {
470795c0457054518102af6250e718a13a5b2ee5dbeaDaniel Dunbar    if (D.CCCIsCXX) {
4708132e35d2f87895d20e7ea146c8c00404b80221a1Daniel Dunbar      getToolChain().AddCXXStdlibLibArgs(Args, CmdArgs);
470962d829abaf61d70483a5a584059440a549a306bfEli Friedman      if (Args.hasArg(options::OPT_pg))
471062d829abaf61d70483a5a584059440a549a306bfEli Friedman        CmdArgs.push_back("-lm_p");
471162d829abaf61d70483a5a584059440a549a306bfEli Friedman      else
471262d829abaf61d70483a5a584059440a549a306bfEli Friedman        CmdArgs.push_back("-lm");
471395c0457054518102af6250e718a13a5b2ee5dbeaDaniel Dunbar    }
471495c0457054518102af6250e718a13a5b2ee5dbeaDaniel Dunbar
47152bbcf669742b6b27748414e22f8042236fceef65Daniel Dunbar    // FIXME: For some reason GCC passes -lgcc before adding
47162bbcf669742b6b27748414e22f8042236fceef65Daniel Dunbar    // the default system libraries. Just mimic this for now.
47172bbcf669742b6b27748414e22f8042236fceef65Daniel Dunbar    CmdArgs.push_back("-lgcc");
4718f7b8eec37c8c8012fa525c71fb29a58c9f29beefDaniel Dunbar
4719f7b8eec37c8c8012fa525c71fb29a58c9f29beefDaniel Dunbar    if (Args.hasArg(options::OPT_pthread))
4720a2e40219e0a8f609a6c4cfc213223f02a3cef3c9Chris Lattner      CmdArgs.push_back("-lpthread");
4721657849c60378b045a9e904f35ece8fd84425a20aChandler Carruth    if (!Args.hasArg(options::OPT_shared)) {
472262d829abaf61d70483a5a584059440a549a306bfEli Friedman      if (Args.hasArg(options::OPT_pg))
472362d829abaf61d70483a5a584059440a549a306bfEli Friedman         CmdArgs.push_back("-lc_p");
472462d829abaf61d70483a5a584059440a549a306bfEli Friedman      else
472562d829abaf61d70483a5a584059440a549a306bfEli Friedman         CmdArgs.push_back("-lc");
4726657849c60378b045a9e904f35ece8fd84425a20aChandler Carruth    }
47272bbcf669742b6b27748414e22f8042236fceef65Daniel Dunbar    CmdArgs.push_back("-lgcc");
4728f7b8eec37c8c8012fa525c71fb29a58c9f29beefDaniel Dunbar  }
4729f7b8eec37c8c8012fa525c71fb29a58c9f29beefDaniel Dunbar
4730f7b8eec37c8c8012fa525c71fb29a58c9f29beefDaniel Dunbar  if (!Args.hasArg(options::OPT_nostdlib) &&
4731f7b8eec37c8c8012fa525c71fb29a58c9f29beefDaniel Dunbar      !Args.hasArg(options::OPT_nostartfiles)) {
4732f7b8eec37c8c8012fa525c71fb29a58c9f29beefDaniel Dunbar    if (!Args.hasArg(options::OPT_shared))
473338e317d6dce161b249508686cc67eb7176958762Chris Lattner      CmdArgs.push_back(Args.MakeArgString(
47344a7e88978cf646ad10d654020cb00b3877069210Daniel Dunbar                              getToolChain().GetFilePath("crtend.o")));
4735f7b8eec37c8c8012fa525c71fb29a58c9f29beefDaniel Dunbar    else
473638e317d6dce161b249508686cc67eb7176958762Chris Lattner      CmdArgs.push_back(Args.MakeArgString(
47374a7e88978cf646ad10d654020cb00b3877069210Daniel Dunbar                              getToolChain().GetFilePath("crtendS.o")));
4738f7b8eec37c8c8012fa525c71fb29a58c9f29beefDaniel Dunbar  }
4739f7b8eec37c8c8012fa525c71fb29a58c9f29beefDaniel Dunbar
4740f7b8eec37c8c8012fa525c71fb29a58c9f29beefDaniel Dunbar  const char *Exec =
47414a7e88978cf646ad10d654020cb00b3877069210Daniel Dunbar    Args.MakeArgString(getToolChain().GetProgramPath("ld"));
47422fe238ed293bd4bc27af9beb9fa151fad2146fa8Daniel Dunbar  C.addCommand(new Command(JA, *this, Exec, CmdArgs));
4743f7b8eec37c8c8012fa525c71fb29a58c9f29beefDaniel Dunbar}
4744c66a5a30a27e7b9cfab46ac8be918e3ea5b0c5a5Ed Schouten
474568a31d406c6dc4382c700d1199b062de2aa7e1daDaniel Dunbarvoid freebsd::Assemble::ConstructJob(Compilation &C, const JobAction &JA,
47462fe238ed293bd4bc27af9beb9fa151fad2146fa8Daniel Dunbar                                     const InputInfo &Output,
4747c21c485b4fb58ef5d55cf3e523263dd824a2ace4Daniel Dunbar                                     const InputInfoList &Inputs,
4748c21c485b4fb58ef5d55cf3e523263dd824a2ace4Daniel Dunbar                                     const ArgList &Args,
47491eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump                                     const char *LinkingOutput) const {
475068a31d406c6dc4382c700d1199b062de2aa7e1daDaniel Dunbar  ArgStringList CmdArgs;
475168a31d406c6dc4382c700d1199b062de2aa7e1daDaniel Dunbar
4752008f54a54299eaafdaa940e2bdeaf55935ecd95aDaniel Dunbar  // When building 32-bit code on FreeBSD/amd64, we have to explicitly
4753008f54a54299eaafdaa940e2bdeaf55935ecd95aDaniel Dunbar  // instruct as in the base system to assemble 32-bit code.
4754008f54a54299eaafdaa940e2bdeaf55935ecd95aDaniel Dunbar  if (getToolChain().getArchName() == "i386")
475568a31d406c6dc4382c700d1199b062de2aa7e1daDaniel Dunbar    CmdArgs.push_back("--32");
475668a31d406c6dc4382c700d1199b062de2aa7e1daDaniel Dunbar
47573393cef18e887723aaa2395d33550ab35551af1dRoman Divacky  if (getToolChain().getArchName() == "powerpc")
47583393cef18e887723aaa2395d33550ab35551af1dRoman Divacky    CmdArgs.push_back("-a32");
475920249a1af2e462dcafdd6a350f1c7967b264ff25Michael J. Spencer
4760ed734737d5af31906e30e537d4a41c760ddcfc59Eric Christopher  // Set byte order explicitly
4761ed734737d5af31906e30e537d4a41c760ddcfc59Eric Christopher  if (getToolChain().getArchName() == "mips")
4762ed734737d5af31906e30e537d4a41c760ddcfc59Eric Christopher    CmdArgs.push_back("-EB");
4763ed734737d5af31906e30e537d4a41c760ddcfc59Eric Christopher  else if (getToolChain().getArchName() == "mipsel")
4764ed734737d5af31906e30e537d4a41c760ddcfc59Eric Christopher    CmdArgs.push_back("-EL");
4765ed734737d5af31906e30e537d4a41c760ddcfc59Eric Christopher
476668a31d406c6dc4382c700d1199b062de2aa7e1daDaniel Dunbar  Args.AddAllArgValues(CmdArgs, options::OPT_Wa_COMMA,
476768a31d406c6dc4382c700d1199b062de2aa7e1daDaniel Dunbar                       options::OPT_Xassembler);
476868a31d406c6dc4382c700d1199b062de2aa7e1daDaniel Dunbar
476968a31d406c6dc4382c700d1199b062de2aa7e1daDaniel Dunbar  CmdArgs.push_back("-o");
47707c1e46533cae07216e2a67d5636a5afb44253155Daniel Dunbar  CmdArgs.push_back(Output.getFilename());
477168a31d406c6dc4382c700d1199b062de2aa7e1daDaniel Dunbar
477268a31d406c6dc4382c700d1199b062de2aa7e1daDaniel Dunbar  for (InputInfoList::const_iterator
477368a31d406c6dc4382c700d1199b062de2aa7e1daDaniel Dunbar         it = Inputs.begin(), ie = Inputs.end(); it != ie; ++it) {
477468a31d406c6dc4382c700d1199b062de2aa7e1daDaniel Dunbar    const InputInfo &II = *it;
47757c1e46533cae07216e2a67d5636a5afb44253155Daniel Dunbar    CmdArgs.push_back(II.getFilename());
477668a31d406c6dc4382c700d1199b062de2aa7e1daDaniel Dunbar  }
477768a31d406c6dc4382c700d1199b062de2aa7e1daDaniel Dunbar
4778c21c485b4fb58ef5d55cf3e523263dd824a2ace4Daniel Dunbar  const char *Exec =
47794a7e88978cf646ad10d654020cb00b3877069210Daniel Dunbar    Args.MakeArgString(getToolChain().GetProgramPath("as"));
47802fe238ed293bd4bc27af9beb9fa151fad2146fa8Daniel Dunbar  C.addCommand(new Command(JA, *this, Exec, CmdArgs));
478168a31d406c6dc4382c700d1199b062de2aa7e1daDaniel Dunbar}
4782008f54a54299eaafdaa940e2bdeaf55935ecd95aDaniel Dunbar
4783008f54a54299eaafdaa940e2bdeaf55935ecd95aDaniel Dunbarvoid freebsd::Link::ConstructJob(Compilation &C, const JobAction &JA,
47842fe238ed293bd4bc27af9beb9fa151fad2146fa8Daniel Dunbar                                 const InputInfo &Output,
4785c21c485b4fb58ef5d55cf3e523263dd824a2ace4Daniel Dunbar                                 const InputInfoList &Inputs,
4786c21c485b4fb58ef5d55cf3e523263dd824a2ace4Daniel Dunbar                                 const ArgList &Args,
4787a8304f67291b0182fb64f3afc621615288dd1d31Daniel Dunbar                                 const char *LinkingOutput) const {
4788ee788e70fcd0adf76103b17c78ac658d4ea30c9bDaniel Dunbar  const Driver &D = getToolChain().getDriver();
4789008f54a54299eaafdaa940e2bdeaf55935ecd95aDaniel Dunbar  ArgStringList CmdArgs;
4790008f54a54299eaafdaa940e2bdeaf55935ecd95aDaniel Dunbar
47918ab2bdcc4f397e100c684ede8e8ca6e226e1380aJoerg Sonnenberger  if (!D.SysRoot.empty())
47928ab2bdcc4f397e100c684ede8e8ca6e226e1380aJoerg Sonnenberger    CmdArgs.push_back(Args.MakeArgString("--sysroot=" + D.SysRoot));
47938ab2bdcc4f397e100c684ede8e8ca6e226e1380aJoerg Sonnenberger
4794008f54a54299eaafdaa940e2bdeaf55935ecd95aDaniel Dunbar  if (Args.hasArg(options::OPT_static)) {
4795008f54a54299eaafdaa940e2bdeaf55935ecd95aDaniel Dunbar    CmdArgs.push_back("-Bstatic");
4796008f54a54299eaafdaa940e2bdeaf55935ecd95aDaniel Dunbar  } else {
479765ba55da577b23b24513b815031fc870d1d27971Rafael Espindola    if (Args.hasArg(options::OPT_rdynamic))
479865ba55da577b23b24513b815031fc870d1d27971Rafael Espindola      CmdArgs.push_back("-export-dynamic");
4799008f54a54299eaafdaa940e2bdeaf55935ecd95aDaniel Dunbar    CmdArgs.push_back("--eh-frame-hdr");
4800008f54a54299eaafdaa940e2bdeaf55935ecd95aDaniel Dunbar    if (Args.hasArg(options::OPT_shared)) {
4801008f54a54299eaafdaa940e2bdeaf55935ecd95aDaniel Dunbar      CmdArgs.push_back("-Bshareable");
4802008f54a54299eaafdaa940e2bdeaf55935ecd95aDaniel Dunbar    } else {
4803008f54a54299eaafdaa940e2bdeaf55935ecd95aDaniel Dunbar      CmdArgs.push_back("-dynamic-linker");
4804008f54a54299eaafdaa940e2bdeaf55935ecd95aDaniel Dunbar      CmdArgs.push_back("/libexec/ld-elf.so.1");
4805008f54a54299eaafdaa940e2bdeaf55935ecd95aDaniel Dunbar    }
4806008f54a54299eaafdaa940e2bdeaf55935ecd95aDaniel Dunbar  }
4807008f54a54299eaafdaa940e2bdeaf55935ecd95aDaniel Dunbar
4808008f54a54299eaafdaa940e2bdeaf55935ecd95aDaniel Dunbar  // When building 32-bit code on FreeBSD/amd64, we have to explicitly
4809008f54a54299eaafdaa940e2bdeaf55935ecd95aDaniel Dunbar  // instruct ld in the base system to link 32-bit code.
4810008f54a54299eaafdaa940e2bdeaf55935ecd95aDaniel Dunbar  if (getToolChain().getArchName() == "i386") {
4811008f54a54299eaafdaa940e2bdeaf55935ecd95aDaniel Dunbar    CmdArgs.push_back("-m");
4812008f54a54299eaafdaa940e2bdeaf55935ecd95aDaniel Dunbar    CmdArgs.push_back("elf_i386_fbsd");
4813008f54a54299eaafdaa940e2bdeaf55935ecd95aDaniel Dunbar  }
4814008f54a54299eaafdaa940e2bdeaf55935ecd95aDaniel Dunbar
4815000a6552adc6372576d65170dfb5969fd03cc521Roman Divacky  if (getToolChain().getArchName() == "powerpc") {
4816000a6552adc6372576d65170dfb5969fd03cc521Roman Divacky    CmdArgs.push_back("-m");
48171052c1dc52447643dac5484d3a22ab836c781f47Roman Divacky    CmdArgs.push_back("elf32ppc_fbsd");
4818000a6552adc6372576d65170dfb5969fd03cc521Roman Divacky  }
4819000a6552adc6372576d65170dfb5969fd03cc521Roman Divacky
48207c1e46533cae07216e2a67d5636a5afb44253155Daniel Dunbar  if (Output.isFilename()) {
4821008f54a54299eaafdaa940e2bdeaf55935ecd95aDaniel Dunbar    CmdArgs.push_back("-o");
4822008f54a54299eaafdaa940e2bdeaf55935ecd95aDaniel Dunbar    CmdArgs.push_back(Output.getFilename());
4823008f54a54299eaafdaa940e2bdeaf55935ecd95aDaniel Dunbar  } else {
4824008f54a54299eaafdaa940e2bdeaf55935ecd95aDaniel Dunbar    assert(Output.isNothing() && "Invalid output.");
4825008f54a54299eaafdaa940e2bdeaf55935ecd95aDaniel Dunbar  }
4826008f54a54299eaafdaa940e2bdeaf55935ecd95aDaniel Dunbar
4827008f54a54299eaafdaa940e2bdeaf55935ecd95aDaniel Dunbar  if (!Args.hasArg(options::OPT_nostdlib) &&
4828008f54a54299eaafdaa940e2bdeaf55935ecd95aDaniel Dunbar      !Args.hasArg(options::OPT_nostartfiles)) {
4829008f54a54299eaafdaa940e2bdeaf55935ecd95aDaniel Dunbar    if (!Args.hasArg(options::OPT_shared)) {
4830c16bb76f25ada63864aa89827a9906c1579d2ad3Roman Divacky      if (Args.hasArg(options::OPT_pg))
4831c16bb76f25ada63864aa89827a9906c1579d2ad3Roman Divacky        CmdArgs.push_back(Args.MakeArgString(
4832c16bb76f25ada63864aa89827a9906c1579d2ad3Roman Divacky                                getToolChain().GetFilePath("gcrt1.o")));
48338642f21ca7b5963293a5424de7fe158305ae5229Roman Divacky      else {
48348642f21ca7b5963293a5424de7fe158305ae5229Roman Divacky        const char *crt = Args.hasArg(options::OPT_pie) ? "Scrt1.o" : "crt1.o";
4835c16bb76f25ada63864aa89827a9906c1579d2ad3Roman Divacky        CmdArgs.push_back(Args.MakeArgString(
48368642f21ca7b5963293a5424de7fe158305ae5229Roman Divacky                                getToolChain().GetFilePath(crt)));
48378642f21ca7b5963293a5424de7fe158305ae5229Roman Divacky      }
483838e317d6dce161b249508686cc67eb7176958762Chris Lattner      CmdArgs.push_back(Args.MakeArgString(
48394a7e88978cf646ad10d654020cb00b3877069210Daniel Dunbar                              getToolChain().GetFilePath("crti.o")));
484038e317d6dce161b249508686cc67eb7176958762Chris Lattner      CmdArgs.push_back(Args.MakeArgString(
48414a7e88978cf646ad10d654020cb00b3877069210Daniel Dunbar                              getToolChain().GetFilePath("crtbegin.o")));
4842008f54a54299eaafdaa940e2bdeaf55935ecd95aDaniel Dunbar    } else {
484338e317d6dce161b249508686cc67eb7176958762Chris Lattner      CmdArgs.push_back(Args.MakeArgString(
48444a7e88978cf646ad10d654020cb00b3877069210Daniel Dunbar                              getToolChain().GetFilePath("crti.o")));
484538e317d6dce161b249508686cc67eb7176958762Chris Lattner      CmdArgs.push_back(Args.MakeArgString(
48464a7e88978cf646ad10d654020cb00b3877069210Daniel Dunbar                              getToolChain().GetFilePath("crtbeginS.o")));
4847008f54a54299eaafdaa940e2bdeaf55935ecd95aDaniel Dunbar    }
4848008f54a54299eaafdaa940e2bdeaf55935ecd95aDaniel Dunbar  }
4849008f54a54299eaafdaa940e2bdeaf55935ecd95aDaniel Dunbar
4850008f54a54299eaafdaa940e2bdeaf55935ecd95aDaniel Dunbar  Args.AddAllArgs(CmdArgs, options::OPT_L);
485158e5ac9d41d8186bea92e892d572e2eea28d3f9cRoman Divacky  const ToolChain::path_list Paths = getToolChain().getFilePaths();
485258e5ac9d41d8186bea92e892d572e2eea28d3f9cRoman Divacky  for (ToolChain::path_list::const_iterator i = Paths.begin(), e = Paths.end();
485358e5ac9d41d8186bea92e892d572e2eea28d3f9cRoman Divacky       i != e; ++i)
48545f9e272e632e951b1efe824cd16acb4d96077930Chris Lattner    CmdArgs.push_back(Args.MakeArgString(StringRef("-L") + *i));
4855008f54a54299eaafdaa940e2bdeaf55935ecd95aDaniel Dunbar  Args.AddAllArgs(CmdArgs, options::OPT_T_Group);
4856008f54a54299eaafdaa940e2bdeaf55935ecd95aDaniel Dunbar  Args.AddAllArgs(CmdArgs, options::OPT_e);
4857c736377543edcfbb00a4150fae79b4d9d9f66849David Chisnall  Args.AddAllArgs(CmdArgs, options::OPT_s);
4858c736377543edcfbb00a4150fae79b4d9d9f66849David Chisnall  Args.AddAllArgs(CmdArgs, options::OPT_t);
4859c736377543edcfbb00a4150fae79b4d9d9f66849David Chisnall  Args.AddAllArgs(CmdArgs, options::OPT_Z_Flag);
4860c736377543edcfbb00a4150fae79b4d9d9f66849David Chisnall  Args.AddAllArgs(CmdArgs, options::OPT_r);
4861008f54a54299eaafdaa940e2bdeaf55935ecd95aDaniel Dunbar
48622008feead855f08500fb01ff43ef5eebee05d1e5Daniel Dunbar  AddLinkerInputs(getToolChain(), Inputs, Args, CmdArgs);
48638e50a96b387dca7525caa8a6add31420dd82a2cdBenjamin Kramer
48648e50a96b387dca7525caa8a6add31420dd82a2cdBenjamin Kramer  if (!Args.hasArg(options::OPT_nostdlib) &&
48658e50a96b387dca7525caa8a6add31420dd82a2cdBenjamin Kramer      !Args.hasArg(options::OPT_nodefaultlibs)) {
48668e50a96b387dca7525caa8a6add31420dd82a2cdBenjamin Kramer    if (D.CCCIsCXX) {
48678e50a96b387dca7525caa8a6add31420dd82a2cdBenjamin Kramer      getToolChain().AddCXXStdlibLibArgs(Args, CmdArgs);
4868c16bb76f25ada63864aa89827a9906c1579d2ad3Roman Divacky      if (Args.hasArg(options::OPT_pg))
4869c16bb76f25ada63864aa89827a9906c1579d2ad3Roman Divacky        CmdArgs.push_back("-lm_p");
4870c16bb76f25ada63864aa89827a9906c1579d2ad3Roman Divacky      else
4871c16bb76f25ada63864aa89827a9906c1579d2ad3Roman Divacky        CmdArgs.push_back("-lm");
48728e50a96b387dca7525caa8a6add31420dd82a2cdBenjamin Kramer    }
48738e50a96b387dca7525caa8a6add31420dd82a2cdBenjamin Kramer    // FIXME: For some reason GCC passes -lgcc and -lgcc_s before adding
48748e50a96b387dca7525caa8a6add31420dd82a2cdBenjamin Kramer    // the default system libraries. Just mimic this for now.
4875c16bb76f25ada63864aa89827a9906c1579d2ad3Roman Divacky    if (Args.hasArg(options::OPT_pg))
4876c16bb76f25ada63864aa89827a9906c1579d2ad3Roman Divacky      CmdArgs.push_back("-lgcc_p");
4877c16bb76f25ada63864aa89827a9906c1579d2ad3Roman Divacky    else
4878c16bb76f25ada63864aa89827a9906c1579d2ad3Roman Divacky      CmdArgs.push_back("-lgcc");
48798e50a96b387dca7525caa8a6add31420dd82a2cdBenjamin Kramer    if (Args.hasArg(options::OPT_static)) {
48808e50a96b387dca7525caa8a6add31420dd82a2cdBenjamin Kramer      CmdArgs.push_back("-lgcc_eh");
4881c16bb76f25ada63864aa89827a9906c1579d2ad3Roman Divacky    } else if (Args.hasArg(options::OPT_pg)) {
4882c16bb76f25ada63864aa89827a9906c1579d2ad3Roman Divacky      CmdArgs.push_back("-lgcc_eh_p");
48838e50a96b387dca7525caa8a6add31420dd82a2cdBenjamin Kramer    } else {
48848e50a96b387dca7525caa8a6add31420dd82a2cdBenjamin Kramer      CmdArgs.push_back("--as-needed");
48858e50a96b387dca7525caa8a6add31420dd82a2cdBenjamin Kramer      CmdArgs.push_back("-lgcc_s");
48868e50a96b387dca7525caa8a6add31420dd82a2cdBenjamin Kramer      CmdArgs.push_back("--no-as-needed");
48878e50a96b387dca7525caa8a6add31420dd82a2cdBenjamin Kramer    }
48888e50a96b387dca7525caa8a6add31420dd82a2cdBenjamin Kramer
4889242302673bdcf35b49579a30fed9dc068a4e10f2Matt Beaumont-Gay    if (Args.hasArg(options::OPT_pthread)) {
4890c16bb76f25ada63864aa89827a9906c1579d2ad3Roman Divacky      if (Args.hasArg(options::OPT_pg))
4891c16bb76f25ada63864aa89827a9906c1579d2ad3Roman Divacky        CmdArgs.push_back("-lpthread_p");
4892c16bb76f25ada63864aa89827a9906c1579d2ad3Roman Divacky      else
4893c16bb76f25ada63864aa89827a9906c1579d2ad3Roman Divacky        CmdArgs.push_back("-lpthread");
4894242302673bdcf35b49579a30fed9dc068a4e10f2Matt Beaumont-Gay    }
4895c16bb76f25ada63864aa89827a9906c1579d2ad3Roman Divacky
4896c16bb76f25ada63864aa89827a9906c1579d2ad3Roman Divacky    if (Args.hasArg(options::OPT_pg)) {
4897c16bb76f25ada63864aa89827a9906c1579d2ad3Roman Divacky      if (Args.hasArg(options::OPT_shared))
4898c16bb76f25ada63864aa89827a9906c1579d2ad3Roman Divacky        CmdArgs.push_back("-lc");
4899c16bb76f25ada63864aa89827a9906c1579d2ad3Roman Divacky      else
4900c16bb76f25ada63864aa89827a9906c1579d2ad3Roman Divacky        CmdArgs.push_back("-lc_p");
4901c16bb76f25ada63864aa89827a9906c1579d2ad3Roman Divacky      CmdArgs.push_back("-lgcc_p");
4902c16bb76f25ada63864aa89827a9906c1579d2ad3Roman Divacky    } else {
4903c16bb76f25ada63864aa89827a9906c1579d2ad3Roman Divacky      CmdArgs.push_back("-lc");
4904c16bb76f25ada63864aa89827a9906c1579d2ad3Roman Divacky      CmdArgs.push_back("-lgcc");
4905c16bb76f25ada63864aa89827a9906c1579d2ad3Roman Divacky    }
49068e50a96b387dca7525caa8a6add31420dd82a2cdBenjamin Kramer
49078e50a96b387dca7525caa8a6add31420dd82a2cdBenjamin Kramer    if (Args.hasArg(options::OPT_static)) {
49088e50a96b387dca7525caa8a6add31420dd82a2cdBenjamin Kramer      CmdArgs.push_back("-lgcc_eh");
4909c16bb76f25ada63864aa89827a9906c1579d2ad3Roman Divacky    } else if (Args.hasArg(options::OPT_pg)) {
4910c16bb76f25ada63864aa89827a9906c1579d2ad3Roman Divacky      CmdArgs.push_back("-lgcc_eh_p");
49118e50a96b387dca7525caa8a6add31420dd82a2cdBenjamin Kramer    } else {
49128e50a96b387dca7525caa8a6add31420dd82a2cdBenjamin Kramer      CmdArgs.push_back("--as-needed");
49138e50a96b387dca7525caa8a6add31420dd82a2cdBenjamin Kramer      CmdArgs.push_back("-lgcc_s");
49148e50a96b387dca7525caa8a6add31420dd82a2cdBenjamin Kramer      CmdArgs.push_back("--no-as-needed");
49158e50a96b387dca7525caa8a6add31420dd82a2cdBenjamin Kramer    }
49168e50a96b387dca7525caa8a6add31420dd82a2cdBenjamin Kramer  }
49178e50a96b387dca7525caa8a6add31420dd82a2cdBenjamin Kramer
49188e50a96b387dca7525caa8a6add31420dd82a2cdBenjamin Kramer  if (!Args.hasArg(options::OPT_nostdlib) &&
49198e50a96b387dca7525caa8a6add31420dd82a2cdBenjamin Kramer      !Args.hasArg(options::OPT_nostartfiles)) {
49208e50a96b387dca7525caa8a6add31420dd82a2cdBenjamin Kramer    if (!Args.hasArg(options::OPT_shared))
49218e50a96b387dca7525caa8a6add31420dd82a2cdBenjamin Kramer      CmdArgs.push_back(Args.MakeArgString(getToolChain().GetFilePath(
49228e50a96b387dca7525caa8a6add31420dd82a2cdBenjamin Kramer                                                                  "crtend.o")));
49238e50a96b387dca7525caa8a6add31420dd82a2cdBenjamin Kramer    else
49248e50a96b387dca7525caa8a6add31420dd82a2cdBenjamin Kramer      CmdArgs.push_back(Args.MakeArgString(getToolChain().GetFilePath(
49258e50a96b387dca7525caa8a6add31420dd82a2cdBenjamin Kramer                                                                 "crtendS.o")));
49268e50a96b387dca7525caa8a6add31420dd82a2cdBenjamin Kramer    CmdArgs.push_back(Args.MakeArgString(getToolChain().GetFilePath(
49278e50a96b387dca7525caa8a6add31420dd82a2cdBenjamin Kramer                                                                    "crtn.o")));
49288e50a96b387dca7525caa8a6add31420dd82a2cdBenjamin Kramer  }
49298e50a96b387dca7525caa8a6add31420dd82a2cdBenjamin Kramer
49303f4be6fb8872942f567166ab8d99c89885f26103Bill Wendling  addProfileRT(getToolChain(), Args, CmdArgs, getToolChain().getTriple());
49312e95a6d7d0b5aed39747875d7474c27824f7319fNick Lewycky
49328e50a96b387dca7525caa8a6add31420dd82a2cdBenjamin Kramer  const char *Exec =
49338e50a96b387dca7525caa8a6add31420dd82a2cdBenjamin Kramer    Args.MakeArgString(getToolChain().GetProgramPath("ld"));
49348e50a96b387dca7525caa8a6add31420dd82a2cdBenjamin Kramer  C.addCommand(new Command(JA, *this, Exec, CmdArgs));
49358e50a96b387dca7525caa8a6add31420dd82a2cdBenjamin Kramer}
49368e50a96b387dca7525caa8a6add31420dd82a2cdBenjamin Kramer
49378e50a96b387dca7525caa8a6add31420dd82a2cdBenjamin Kramervoid netbsd::Assemble::ConstructJob(Compilation &C, const JobAction &JA,
49388e50a96b387dca7525caa8a6add31420dd82a2cdBenjamin Kramer                                     const InputInfo &Output,
49398e50a96b387dca7525caa8a6add31420dd82a2cdBenjamin Kramer                                     const InputInfoList &Inputs,
49408e50a96b387dca7525caa8a6add31420dd82a2cdBenjamin Kramer                                     const ArgList &Args,
49418e50a96b387dca7525caa8a6add31420dd82a2cdBenjamin Kramer                                     const char *LinkingOutput) const {
49428e50a96b387dca7525caa8a6add31420dd82a2cdBenjamin Kramer  ArgStringList CmdArgs;
49438e50a96b387dca7525caa8a6add31420dd82a2cdBenjamin Kramer
49448e50a96b387dca7525caa8a6add31420dd82a2cdBenjamin Kramer  // When building 32-bit code on NetBSD/amd64, we have to explicitly
49458e50a96b387dca7525caa8a6add31420dd82a2cdBenjamin Kramer  // instruct as in the base system to assemble 32-bit code.
49461bd91374498ac78e72545f08f4daa6491f9c9d14Joerg Sonnenberger  if (getToolChain().getArch() == llvm::Triple::x86)
49478e50a96b387dca7525caa8a6add31420dd82a2cdBenjamin Kramer    CmdArgs.push_back("--32");
49488e50a96b387dca7525caa8a6add31420dd82a2cdBenjamin Kramer
49498e50a96b387dca7525caa8a6add31420dd82a2cdBenjamin Kramer  // Set byte order explicitly
49508e50a96b387dca7525caa8a6add31420dd82a2cdBenjamin Kramer  if (getToolChain().getArchName() == "mips")
49518e50a96b387dca7525caa8a6add31420dd82a2cdBenjamin Kramer    CmdArgs.push_back("-EB");
49528e50a96b387dca7525caa8a6add31420dd82a2cdBenjamin Kramer  else if (getToolChain().getArchName() == "mipsel")
49538e50a96b387dca7525caa8a6add31420dd82a2cdBenjamin Kramer    CmdArgs.push_back("-EL");
49548e50a96b387dca7525caa8a6add31420dd82a2cdBenjamin Kramer
49558e50a96b387dca7525caa8a6add31420dd82a2cdBenjamin Kramer  Args.AddAllArgValues(CmdArgs, options::OPT_Wa_COMMA,
49568e50a96b387dca7525caa8a6add31420dd82a2cdBenjamin Kramer                       options::OPT_Xassembler);
49578e50a96b387dca7525caa8a6add31420dd82a2cdBenjamin Kramer
49588e50a96b387dca7525caa8a6add31420dd82a2cdBenjamin Kramer  CmdArgs.push_back("-o");
49598e50a96b387dca7525caa8a6add31420dd82a2cdBenjamin Kramer  CmdArgs.push_back(Output.getFilename());
49608e50a96b387dca7525caa8a6add31420dd82a2cdBenjamin Kramer
49618e50a96b387dca7525caa8a6add31420dd82a2cdBenjamin Kramer  for (InputInfoList::const_iterator
49628e50a96b387dca7525caa8a6add31420dd82a2cdBenjamin Kramer         it = Inputs.begin(), ie = Inputs.end(); it != ie; ++it) {
49638e50a96b387dca7525caa8a6add31420dd82a2cdBenjamin Kramer    const InputInfo &II = *it;
49648e50a96b387dca7525caa8a6add31420dd82a2cdBenjamin Kramer    CmdArgs.push_back(II.getFilename());
49658e50a96b387dca7525caa8a6add31420dd82a2cdBenjamin Kramer  }
49668e50a96b387dca7525caa8a6add31420dd82a2cdBenjamin Kramer
49675adcec16cb8d9e7bebf310b6c07249dfd852346bDavid Chisnall  const char *Exec = Args.MakeArgString((getToolChain().GetProgramPath("as")));
49688e50a96b387dca7525caa8a6add31420dd82a2cdBenjamin Kramer  C.addCommand(new Command(JA, *this, Exec, CmdArgs));
49698e50a96b387dca7525caa8a6add31420dd82a2cdBenjamin Kramer}
49708e50a96b387dca7525caa8a6add31420dd82a2cdBenjamin Kramer
49718e50a96b387dca7525caa8a6add31420dd82a2cdBenjamin Kramervoid netbsd::Link::ConstructJob(Compilation &C, const JobAction &JA,
49728e50a96b387dca7525caa8a6add31420dd82a2cdBenjamin Kramer                                 const InputInfo &Output,
49738e50a96b387dca7525caa8a6add31420dd82a2cdBenjamin Kramer                                 const InputInfoList &Inputs,
49748e50a96b387dca7525caa8a6add31420dd82a2cdBenjamin Kramer                                 const ArgList &Args,
49758e50a96b387dca7525caa8a6add31420dd82a2cdBenjamin Kramer                                 const char *LinkingOutput) const {
49768e50a96b387dca7525caa8a6add31420dd82a2cdBenjamin Kramer  const Driver &D = getToolChain().getDriver();
49778e50a96b387dca7525caa8a6add31420dd82a2cdBenjamin Kramer  ArgStringList CmdArgs;
49788e50a96b387dca7525caa8a6add31420dd82a2cdBenjamin Kramer
49798ab2bdcc4f397e100c684ede8e8ca6e226e1380aJoerg Sonnenberger  if (!D.SysRoot.empty())
49808ab2bdcc4f397e100c684ede8e8ca6e226e1380aJoerg Sonnenberger    CmdArgs.push_back(Args.MakeArgString("--sysroot=" + D.SysRoot));
49818ab2bdcc4f397e100c684ede8e8ca6e226e1380aJoerg Sonnenberger
49828e50a96b387dca7525caa8a6add31420dd82a2cdBenjamin Kramer  if (Args.hasArg(options::OPT_static)) {
49838e50a96b387dca7525caa8a6add31420dd82a2cdBenjamin Kramer    CmdArgs.push_back("-Bstatic");
49848e50a96b387dca7525caa8a6add31420dd82a2cdBenjamin Kramer  } else {
49858e50a96b387dca7525caa8a6add31420dd82a2cdBenjamin Kramer    if (Args.hasArg(options::OPT_rdynamic))
49868e50a96b387dca7525caa8a6add31420dd82a2cdBenjamin Kramer      CmdArgs.push_back("-export-dynamic");
49878e50a96b387dca7525caa8a6add31420dd82a2cdBenjamin Kramer    CmdArgs.push_back("--eh-frame-hdr");
49888e50a96b387dca7525caa8a6add31420dd82a2cdBenjamin Kramer    if (Args.hasArg(options::OPT_shared)) {
49898e50a96b387dca7525caa8a6add31420dd82a2cdBenjamin Kramer      CmdArgs.push_back("-Bshareable");
49908e50a96b387dca7525caa8a6add31420dd82a2cdBenjamin Kramer    } else {
49918e50a96b387dca7525caa8a6add31420dd82a2cdBenjamin Kramer      CmdArgs.push_back("-dynamic-linker");
49928e50a96b387dca7525caa8a6add31420dd82a2cdBenjamin Kramer      CmdArgs.push_back("/libexec/ld.elf_so");
49938e50a96b387dca7525caa8a6add31420dd82a2cdBenjamin Kramer    }
49948e50a96b387dca7525caa8a6add31420dd82a2cdBenjamin Kramer  }
49958e50a96b387dca7525caa8a6add31420dd82a2cdBenjamin Kramer
49968e50a96b387dca7525caa8a6add31420dd82a2cdBenjamin Kramer  // When building 32-bit code on NetBSD/amd64, we have to explicitly
49978e50a96b387dca7525caa8a6add31420dd82a2cdBenjamin Kramer  // instruct ld in the base system to link 32-bit code.
49981bd91374498ac78e72545f08f4daa6491f9c9d14Joerg Sonnenberger  if (getToolChain().getArch() == llvm::Triple::x86) {
49998e50a96b387dca7525caa8a6add31420dd82a2cdBenjamin Kramer    CmdArgs.push_back("-m");
50008e50a96b387dca7525caa8a6add31420dd82a2cdBenjamin Kramer    CmdArgs.push_back("elf_i386");
50018e50a96b387dca7525caa8a6add31420dd82a2cdBenjamin Kramer  }
50028e50a96b387dca7525caa8a6add31420dd82a2cdBenjamin Kramer
50038e50a96b387dca7525caa8a6add31420dd82a2cdBenjamin Kramer  if (Output.isFilename()) {
50048e50a96b387dca7525caa8a6add31420dd82a2cdBenjamin Kramer    CmdArgs.push_back("-o");
50058e50a96b387dca7525caa8a6add31420dd82a2cdBenjamin Kramer    CmdArgs.push_back(Output.getFilename());
50068e50a96b387dca7525caa8a6add31420dd82a2cdBenjamin Kramer  } else {
50078e50a96b387dca7525caa8a6add31420dd82a2cdBenjamin Kramer    assert(Output.isNothing() && "Invalid output.");
50088e50a96b387dca7525caa8a6add31420dd82a2cdBenjamin Kramer  }
50098e50a96b387dca7525caa8a6add31420dd82a2cdBenjamin Kramer
50108e50a96b387dca7525caa8a6add31420dd82a2cdBenjamin Kramer  if (!Args.hasArg(options::OPT_nostdlib) &&
50118e50a96b387dca7525caa8a6add31420dd82a2cdBenjamin Kramer      !Args.hasArg(options::OPT_nostartfiles)) {
50128e50a96b387dca7525caa8a6add31420dd82a2cdBenjamin Kramer    if (!Args.hasArg(options::OPT_shared)) {
50138e50a96b387dca7525caa8a6add31420dd82a2cdBenjamin Kramer      CmdArgs.push_back(Args.MakeArgString(
50148e50a96b387dca7525caa8a6add31420dd82a2cdBenjamin Kramer                              getToolChain().GetFilePath("crt0.o")));
50158e50a96b387dca7525caa8a6add31420dd82a2cdBenjamin Kramer      CmdArgs.push_back(Args.MakeArgString(
50168e50a96b387dca7525caa8a6add31420dd82a2cdBenjamin Kramer                              getToolChain().GetFilePath("crti.o")));
50178e50a96b387dca7525caa8a6add31420dd82a2cdBenjamin Kramer      CmdArgs.push_back(Args.MakeArgString(
50188e50a96b387dca7525caa8a6add31420dd82a2cdBenjamin Kramer                              getToolChain().GetFilePath("crtbegin.o")));
50198e50a96b387dca7525caa8a6add31420dd82a2cdBenjamin Kramer    } else {
50208e50a96b387dca7525caa8a6add31420dd82a2cdBenjamin Kramer      CmdArgs.push_back(Args.MakeArgString(
50218e50a96b387dca7525caa8a6add31420dd82a2cdBenjamin Kramer                              getToolChain().GetFilePath("crti.o")));
50228e50a96b387dca7525caa8a6add31420dd82a2cdBenjamin Kramer      CmdArgs.push_back(Args.MakeArgString(
50238e50a96b387dca7525caa8a6add31420dd82a2cdBenjamin Kramer                              getToolChain().GetFilePath("crtbeginS.o")));
50248e50a96b387dca7525caa8a6add31420dd82a2cdBenjamin Kramer    }
50258e50a96b387dca7525caa8a6add31420dd82a2cdBenjamin Kramer  }
50268e50a96b387dca7525caa8a6add31420dd82a2cdBenjamin Kramer
50278e50a96b387dca7525caa8a6add31420dd82a2cdBenjamin Kramer  Args.AddAllArgs(CmdArgs, options::OPT_L);
50288e50a96b387dca7525caa8a6add31420dd82a2cdBenjamin Kramer  Args.AddAllArgs(CmdArgs, options::OPT_T_Group);
50298e50a96b387dca7525caa8a6add31420dd82a2cdBenjamin Kramer  Args.AddAllArgs(CmdArgs, options::OPT_e);
50308e50a96b387dca7525caa8a6add31420dd82a2cdBenjamin Kramer  Args.AddAllArgs(CmdArgs, options::OPT_s);
50318e50a96b387dca7525caa8a6add31420dd82a2cdBenjamin Kramer  Args.AddAllArgs(CmdArgs, options::OPT_t);
50328e50a96b387dca7525caa8a6add31420dd82a2cdBenjamin Kramer  Args.AddAllArgs(CmdArgs, options::OPT_Z_Flag);
50338e50a96b387dca7525caa8a6add31420dd82a2cdBenjamin Kramer  Args.AddAllArgs(CmdArgs, options::OPT_r);
50348e50a96b387dca7525caa8a6add31420dd82a2cdBenjamin Kramer
50358e50a96b387dca7525caa8a6add31420dd82a2cdBenjamin Kramer  AddLinkerInputs(getToolChain(), Inputs, Args, CmdArgs);
5036008f54a54299eaafdaa940e2bdeaf55935ecd95aDaniel Dunbar
5037008f54a54299eaafdaa940e2bdeaf55935ecd95aDaniel Dunbar  if (!Args.hasArg(options::OPT_nostdlib) &&
5038008f54a54299eaafdaa940e2bdeaf55935ecd95aDaniel Dunbar      !Args.hasArg(options::OPT_nodefaultlibs)) {
50392002263e10aa369c89008d37cada2908203fd822Daniel Dunbar    if (D.CCCIsCXX) {
5040132e35d2f87895d20e7ea146c8c00404b80221a1Daniel Dunbar      getToolChain().AddCXXStdlibLibArgs(Args, CmdArgs);
50412002263e10aa369c89008d37cada2908203fd822Daniel Dunbar      CmdArgs.push_back("-lm");
50422002263e10aa369c89008d37cada2908203fd822Daniel Dunbar    }
5043008f54a54299eaafdaa940e2bdeaf55935ecd95aDaniel Dunbar    // FIXME: For some reason GCC passes -lgcc and -lgcc_s before adding
5044008f54a54299eaafdaa940e2bdeaf55935ecd95aDaniel Dunbar    // the default system libraries. Just mimic this for now.
5045008f54a54299eaafdaa940e2bdeaf55935ecd95aDaniel Dunbar    if (Args.hasArg(options::OPT_static)) {
5046008f54a54299eaafdaa940e2bdeaf55935ecd95aDaniel Dunbar      CmdArgs.push_back("-lgcc_eh");
5047008f54a54299eaafdaa940e2bdeaf55935ecd95aDaniel Dunbar    } else {
5048008f54a54299eaafdaa940e2bdeaf55935ecd95aDaniel Dunbar      CmdArgs.push_back("--as-needed");
5049008f54a54299eaafdaa940e2bdeaf55935ecd95aDaniel Dunbar      CmdArgs.push_back("-lgcc_s");
5050008f54a54299eaafdaa940e2bdeaf55935ecd95aDaniel Dunbar      CmdArgs.push_back("--no-as-needed");
5051008f54a54299eaafdaa940e2bdeaf55935ecd95aDaniel Dunbar    }
5052db6393f259b8e634302e27d538ca4760f4221d91Joerg Sonnenberger    CmdArgs.push_back("-lgcc");
5053008f54a54299eaafdaa940e2bdeaf55935ecd95aDaniel Dunbar
5054008f54a54299eaafdaa940e2bdeaf55935ecd95aDaniel Dunbar    if (Args.hasArg(options::OPT_pthread))
5055008f54a54299eaafdaa940e2bdeaf55935ecd95aDaniel Dunbar      CmdArgs.push_back("-lpthread");
5056008f54a54299eaafdaa940e2bdeaf55935ecd95aDaniel Dunbar    CmdArgs.push_back("-lc");
5057008f54a54299eaafdaa940e2bdeaf55935ecd95aDaniel Dunbar
5058008f54a54299eaafdaa940e2bdeaf55935ecd95aDaniel Dunbar    CmdArgs.push_back("-lgcc");
5059008f54a54299eaafdaa940e2bdeaf55935ecd95aDaniel Dunbar    if (Args.hasArg(options::OPT_static)) {
5060008f54a54299eaafdaa940e2bdeaf55935ecd95aDaniel Dunbar      CmdArgs.push_back("-lgcc_eh");
5061008f54a54299eaafdaa940e2bdeaf55935ecd95aDaniel Dunbar    } else {
5062008f54a54299eaafdaa940e2bdeaf55935ecd95aDaniel Dunbar      CmdArgs.push_back("--as-needed");
5063008f54a54299eaafdaa940e2bdeaf55935ecd95aDaniel Dunbar      CmdArgs.push_back("-lgcc_s");
5064008f54a54299eaafdaa940e2bdeaf55935ecd95aDaniel Dunbar      CmdArgs.push_back("--no-as-needed");
5065008f54a54299eaafdaa940e2bdeaf55935ecd95aDaniel Dunbar    }
5066008f54a54299eaafdaa940e2bdeaf55935ecd95aDaniel Dunbar  }
5067008f54a54299eaafdaa940e2bdeaf55935ecd95aDaniel Dunbar
5068008f54a54299eaafdaa940e2bdeaf55935ecd95aDaniel Dunbar  if (!Args.hasArg(options::OPT_nostdlib) &&
5069008f54a54299eaafdaa940e2bdeaf55935ecd95aDaniel Dunbar      !Args.hasArg(options::OPT_nostartfiles)) {
5070008f54a54299eaafdaa940e2bdeaf55935ecd95aDaniel Dunbar    if (!Args.hasArg(options::OPT_shared))
50714a7e88978cf646ad10d654020cb00b3877069210Daniel Dunbar      CmdArgs.push_back(Args.MakeArgString(getToolChain().GetFilePath(
507238e317d6dce161b249508686cc67eb7176958762Chris Lattner                                                                  "crtend.o")));
5073008f54a54299eaafdaa940e2bdeaf55935ecd95aDaniel Dunbar    else
50744a7e88978cf646ad10d654020cb00b3877069210Daniel Dunbar      CmdArgs.push_back(Args.MakeArgString(getToolChain().GetFilePath(
507538e317d6dce161b249508686cc67eb7176958762Chris Lattner                                                                 "crtendS.o")));
50764a7e88978cf646ad10d654020cb00b3877069210Daniel Dunbar    CmdArgs.push_back(Args.MakeArgString(getToolChain().GetFilePath(
507738e317d6dce161b249508686cc67eb7176958762Chris Lattner                                                                    "crtn.o")));
5078008f54a54299eaafdaa940e2bdeaf55935ecd95aDaniel Dunbar  }
5079008f54a54299eaafdaa940e2bdeaf55935ecd95aDaniel Dunbar
50803f4be6fb8872942f567166ab8d99c89885f26103Bill Wendling  addProfileRT(getToolChain(), Args, CmdArgs, getToolChain().getTriple());
50812e95a6d7d0b5aed39747875d7474c27824f7319fNick Lewycky
50825adcec16cb8d9e7bebf310b6c07249dfd852346bDavid Chisnall  const char *Exec = Args.MakeArgString(getToolChain().GetProgramPath("ld"));
50832fe238ed293bd4bc27af9beb9fa151fad2146fa8Daniel Dunbar  C.addCommand(new Command(JA, *this, Exec, CmdArgs));
5084008f54a54299eaafdaa940e2bdeaf55935ecd95aDaniel Dunbar}
508511e1b40d759a643086f590f6ffbd9d68360bad46Daniel Dunbar
5086ba30bbe4e36a30a274da809a11a42f9cdc168e92Rafael Espindolavoid linuxtools::Assemble::ConstructJob(Compilation &C, const JobAction &JA,
5087ba30bbe4e36a30a274da809a11a42f9cdc168e92Rafael Espindola                                        const InputInfo &Output,
5088ba30bbe4e36a30a274da809a11a42f9cdc168e92Rafael Espindola                                        const InputInfoList &Inputs,
5089ba30bbe4e36a30a274da809a11a42f9cdc168e92Rafael Espindola                                        const ArgList &Args,
5090ba30bbe4e36a30a274da809a11a42f9cdc168e92Rafael Espindola                                        const char *LinkingOutput) const {
5091ba30bbe4e36a30a274da809a11a42f9cdc168e92Rafael Espindola  ArgStringList CmdArgs;
5092ba30bbe4e36a30a274da809a11a42f9cdc168e92Rafael Espindola
5093ba30bbe4e36a30a274da809a11a42f9cdc168e92Rafael Espindola  // Add --32/--64 to make sure we get the format we want.
5094ba30bbe4e36a30a274da809a11a42f9cdc168e92Rafael Espindola  // This is incomplete
5095ba30bbe4e36a30a274da809a11a42f9cdc168e92Rafael Espindola  if (getToolChain().getArch() == llvm::Triple::x86) {
5096ba30bbe4e36a30a274da809a11a42f9cdc168e92Rafael Espindola    CmdArgs.push_back("--32");
5097ba30bbe4e36a30a274da809a11a42f9cdc168e92Rafael Espindola  } else if (getToolChain().getArch() == llvm::Triple::x86_64) {
5098ba30bbe4e36a30a274da809a11a42f9cdc168e92Rafael Espindola    CmdArgs.push_back("--64");
50997972c88f674475037fa11fea718565e5bcdd61a6Eli Friedman  } else if (getToolChain().getArch() == llvm::Triple::ppc) {
51007972c88f674475037fa11fea718565e5bcdd61a6Eli Friedman    CmdArgs.push_back("-a32");
51017972c88f674475037fa11fea718565e5bcdd61a6Eli Friedman    CmdArgs.push_back("-mppc");
51027972c88f674475037fa11fea718565e5bcdd61a6Eli Friedman    CmdArgs.push_back("-many");
51037972c88f674475037fa11fea718565e5bcdd61a6Eli Friedman  } else if (getToolChain().getArch() == llvm::Triple::ppc64) {
51047972c88f674475037fa11fea718565e5bcdd61a6Eli Friedman    CmdArgs.push_back("-a64");
51057972c88f674475037fa11fea718565e5bcdd61a6Eli Friedman    CmdArgs.push_back("-mppc64");
51067972c88f674475037fa11fea718565e5bcdd61a6Eli Friedman    CmdArgs.push_back("-many");
5107ba30bbe4e36a30a274da809a11a42f9cdc168e92Rafael Espindola  } else if (getToolChain().getArch() == llvm::Triple::arm) {
51085f9e272e632e951b1efe824cd16acb4d96077930Chris Lattner    StringRef MArch = getToolChain().getArchName();
5109ba30bbe4e36a30a274da809a11a42f9cdc168e92Rafael Espindola    if (MArch == "armv7" || MArch == "armv7a" || MArch == "armv7-a")
5110ba30bbe4e36a30a274da809a11a42f9cdc168e92Rafael Espindola      CmdArgs.push_back("-mfpu=neon");
5111700c508fd469a971480c36d54ae12fe9011f27c0Evgeniy Stepanov
5112700c508fd469a971480c36d54ae12fe9011f27c0Evgeniy Stepanov    StringRef ARMFloatABI = getARMFloatABI(getToolChain().getDriver(), Args,
5113700c508fd469a971480c36d54ae12fe9011f27c0Evgeniy Stepanov                                           getToolChain().getTriple());
5114700c508fd469a971480c36d54ae12fe9011f27c0Evgeniy Stepanov    CmdArgs.push_back(Args.MakeArgString("-mfloat-abi=" + ARMFloatABI));
5115eca187e9f20886f20bb0ea78b4f4b87a18a96b8cEvgeniy Stepanov
5116eca187e9f20886f20bb0ea78b4f4b87a18a96b8cEvgeniy Stepanov    Args.AddLastArg(CmdArgs, options::OPT_march_EQ);
5117eca187e9f20886f20bb0ea78b4f4b87a18a96b8cEvgeniy Stepanov    Args.AddLastArg(CmdArgs, options::OPT_mcpu_EQ);
5118eca187e9f20886f20bb0ea78b4f4b87a18a96b8cEvgeniy Stepanov    Args.AddLastArg(CmdArgs, options::OPT_mfpu_EQ);
5119c85900f4d6aec17ef29140bfc97977463ac75cb2Akira Hatanaka  } else if (getToolChain().getArch() == llvm::Triple::mips ||
5120c85900f4d6aec17ef29140bfc97977463ac75cb2Akira Hatanaka             getToolChain().getArch() == llvm::Triple::mipsel ||
5121c85900f4d6aec17ef29140bfc97977463ac75cb2Akira Hatanaka             getToolChain().getArch() == llvm::Triple::mips64 ||
5122c85900f4d6aec17ef29140bfc97977463ac75cb2Akira Hatanaka             getToolChain().getArch() == llvm::Triple::mips64el) {
5123073a780f7cb863cd382d1c966ef11d05c6fad075Simon Atanasyan    StringRef CPUName;
5124073a780f7cb863cd382d1c966ef11d05c6fad075Simon Atanasyan    StringRef ABIName;
5125073a780f7cb863cd382d1c966ef11d05c6fad075Simon Atanasyan    getMipsCPUAndABI(Args, getToolChain(), CPUName, ABIName);
5126c85900f4d6aec17ef29140bfc97977463ac75cb2Akira Hatanaka
5127073a780f7cb863cd382d1c966ef11d05c6fad075Simon Atanasyan    CmdArgs.push_back("-march");
5128073a780f7cb863cd382d1c966ef11d05c6fad075Simon Atanasyan    CmdArgs.push_back(CPUName.data());
5129073a780f7cb863cd382d1c966ef11d05c6fad075Simon Atanasyan
5130073a780f7cb863cd382d1c966ef11d05c6fad075Simon Atanasyan    // Convert ABI name to the GNU tools acceptable variant.
5131073a780f7cb863cd382d1c966ef11d05c6fad075Simon Atanasyan    if (ABIName == "o32")
5132073a780f7cb863cd382d1c966ef11d05c6fad075Simon Atanasyan      ABIName = "32";
5133073a780f7cb863cd382d1c966ef11d05c6fad075Simon Atanasyan    else if (ABIName == "n64")
5134073a780f7cb863cd382d1c966ef11d05c6fad075Simon Atanasyan      ABIName = "64";
5135073a780f7cb863cd382d1c966ef11d05c6fad075Simon Atanasyan
5136073a780f7cb863cd382d1c966ef11d05c6fad075Simon Atanasyan    CmdArgs.push_back("-mabi");
5137073a780f7cb863cd382d1c966ef11d05c6fad075Simon Atanasyan    CmdArgs.push_back(ABIName.data());
51385f0a1c12dacadd5a061ea5b57d51cf6798ae22a1Simon Atanasyan
51395f0a1c12dacadd5a061ea5b57d51cf6798ae22a1Simon Atanasyan    if (getToolChain().getArch() == llvm::Triple::mips ||
51405f0a1c12dacadd5a061ea5b57d51cf6798ae22a1Simon Atanasyan        getToolChain().getArch() == llvm::Triple::mips64)
51415f0a1c12dacadd5a061ea5b57d51cf6798ae22a1Simon Atanasyan      CmdArgs.push_back("-EB");
51425f0a1c12dacadd5a061ea5b57d51cf6798ae22a1Simon Atanasyan    else
51435f0a1c12dacadd5a061ea5b57d51cf6798ae22a1Simon Atanasyan      CmdArgs.push_back("-EL");
5144ba30bbe4e36a30a274da809a11a42f9cdc168e92Rafael Espindola  }
5145ba30bbe4e36a30a274da809a11a42f9cdc168e92Rafael Espindola
5146ba30bbe4e36a30a274da809a11a42f9cdc168e92Rafael Espindola  Args.AddAllArgValues(CmdArgs, options::OPT_Wa_COMMA,
5147ba30bbe4e36a30a274da809a11a42f9cdc168e92Rafael Espindola                       options::OPT_Xassembler);
5148ba30bbe4e36a30a274da809a11a42f9cdc168e92Rafael Espindola
5149ba30bbe4e36a30a274da809a11a42f9cdc168e92Rafael Espindola  CmdArgs.push_back("-o");
5150ba30bbe4e36a30a274da809a11a42f9cdc168e92Rafael Espindola  CmdArgs.push_back(Output.getFilename());
5151ba30bbe4e36a30a274da809a11a42f9cdc168e92Rafael Espindola
5152ba30bbe4e36a30a274da809a11a42f9cdc168e92Rafael Espindola  for (InputInfoList::const_iterator
5153ba30bbe4e36a30a274da809a11a42f9cdc168e92Rafael Espindola         it = Inputs.begin(), ie = Inputs.end(); it != ie; ++it) {
5154ba30bbe4e36a30a274da809a11a42f9cdc168e92Rafael Espindola    const InputInfo &II = *it;
5155ba30bbe4e36a30a274da809a11a42f9cdc168e92Rafael Espindola    CmdArgs.push_back(II.getFilename());
5156ba30bbe4e36a30a274da809a11a42f9cdc168e92Rafael Espindola  }
5157ba30bbe4e36a30a274da809a11a42f9cdc168e92Rafael Espindola
5158ba30bbe4e36a30a274da809a11a42f9cdc168e92Rafael Espindola  const char *Exec =
5159ba30bbe4e36a30a274da809a11a42f9cdc168e92Rafael Espindola    Args.MakeArgString(getToolChain().GetProgramPath("as"));
5160ba30bbe4e36a30a274da809a11a42f9cdc168e92Rafael Espindola  C.addCommand(new Command(JA, *this, Exec, CmdArgs));
5161ba30bbe4e36a30a274da809a11a42f9cdc168e92Rafael Espindola}
5162ba30bbe4e36a30a274da809a11a42f9cdc168e92Rafael Espindola
5163a6ddc02921d47d0a1dc9ffe4d31438f250751e05Evgeniy Stepanovstatic void AddLibgcc(llvm::Triple Triple, const Driver &D,
5164a6ddc02921d47d0a1dc9ffe4d31438f250751e05Evgeniy Stepanov                      ArgStringList &CmdArgs, const ArgList &Args) {
5165a6ddc02921d47d0a1dc9ffe4d31438f250751e05Evgeniy Stepanov  bool isAndroid = Triple.getEnvironment() == llvm::Triple::ANDROIDEABI;
5166a6ddc02921d47d0a1dc9ffe4d31438f250751e05Evgeniy Stepanov  bool StaticLibgcc = isAndroid || Args.hasArg(options::OPT_static) ||
5167abf3ac7131ba8eab1a2ec99397a776fb0c75ff55Rafael Espindola    Args.hasArg(options::OPT_static_libgcc);
5168abf3ac7131ba8eab1a2ec99397a776fb0c75ff55Rafael Espindola  if (!D.CCCIsCXX)
5169abf3ac7131ba8eab1a2ec99397a776fb0c75ff55Rafael Espindola    CmdArgs.push_back("-lgcc");
5170abf3ac7131ba8eab1a2ec99397a776fb0c75ff55Rafael Espindola
5171abf3ac7131ba8eab1a2ec99397a776fb0c75ff55Rafael Espindola  if (StaticLibgcc) {
5172abf3ac7131ba8eab1a2ec99397a776fb0c75ff55Rafael Espindola    if (D.CCCIsCXX)
5173abf3ac7131ba8eab1a2ec99397a776fb0c75ff55Rafael Espindola      CmdArgs.push_back("-lgcc");
5174abf3ac7131ba8eab1a2ec99397a776fb0c75ff55Rafael Espindola  } else {
5175abf3ac7131ba8eab1a2ec99397a776fb0c75ff55Rafael Espindola    if (!D.CCCIsCXX)
5176abf3ac7131ba8eab1a2ec99397a776fb0c75ff55Rafael Espindola      CmdArgs.push_back("--as-needed");
5177abf3ac7131ba8eab1a2ec99397a776fb0c75ff55Rafael Espindola    CmdArgs.push_back("-lgcc_s");
5178abf3ac7131ba8eab1a2ec99397a776fb0c75ff55Rafael Espindola    if (!D.CCCIsCXX)
5179abf3ac7131ba8eab1a2ec99397a776fb0c75ff55Rafael Espindola      CmdArgs.push_back("--no-as-needed");
5180abf3ac7131ba8eab1a2ec99397a776fb0c75ff55Rafael Espindola  }
5181abf3ac7131ba8eab1a2ec99397a776fb0c75ff55Rafael Espindola
5182a6ddc02921d47d0a1dc9ffe4d31438f250751e05Evgeniy Stepanov  if (StaticLibgcc && !isAndroid)
5183abf3ac7131ba8eab1a2ec99397a776fb0c75ff55Rafael Espindola    CmdArgs.push_back("-lgcc_eh");
5184abf3ac7131ba8eab1a2ec99397a776fb0c75ff55Rafael Espindola  else if (!Args.hasArg(options::OPT_shared) && D.CCCIsCXX)
5185abf3ac7131ba8eab1a2ec99397a776fb0c75ff55Rafael Espindola    CmdArgs.push_back("-lgcc");
5186abf3ac7131ba8eab1a2ec99397a776fb0c75ff55Rafael Espindola}
5187abf3ac7131ba8eab1a2ec99397a776fb0c75ff55Rafael Espindola
5188c1da981bba867681004004b2d54ec2fdf3c08913Rafael Espindolavoid linuxtools::Link::ConstructJob(Compilation &C, const JobAction &JA,
5189c1da981bba867681004004b2d54ec2fdf3c08913Rafael Espindola                                    const InputInfo &Output,
5190c1da981bba867681004004b2d54ec2fdf3c08913Rafael Espindola                                    const InputInfoList &Inputs,
5191c1da981bba867681004004b2d54ec2fdf3c08913Rafael Espindola                                    const ArgList &Args,
5192c1da981bba867681004004b2d54ec2fdf3c08913Rafael Espindola                                    const char *LinkingOutput) const {
5193c1da981bba867681004004b2d54ec2fdf3c08913Rafael Espindola  const toolchains::Linux& ToolChain =
5194c1da981bba867681004004b2d54ec2fdf3c08913Rafael Espindola    static_cast<const toolchains::Linux&>(getToolChain());
5195c1da981bba867681004004b2d54ec2fdf3c08913Rafael Espindola  const Driver &D = ToolChain.getDriver();
5196a6ddc02921d47d0a1dc9ffe4d31438f250751e05Evgeniy Stepanov  const bool isAndroid = ToolChain.getTriple().getEnvironment() ==
5197a6ddc02921d47d0a1dc9ffe4d31438f250751e05Evgeniy Stepanov    llvm::Triple::ANDROIDEABI;
5198a6ddc02921d47d0a1dc9ffe4d31438f250751e05Evgeniy Stepanov
5199c1da981bba867681004004b2d54ec2fdf3c08913Rafael Espindola  ArgStringList CmdArgs;
5200c1da981bba867681004004b2d54ec2fdf3c08913Rafael Espindola
520126f14c309e8de2db8c144342808cca2e869c1777Rafael Espindola  // Silence warning for "clang -g foo.o -o foo"
520226f14c309e8de2db8c144342808cca2e869c1777Rafael Espindola  Args.ClaimAllArgs(options::OPT_g_Group);
52039c094fbcfaba49fc1aeca119c0e12bec59779692Rafael Espindola  // and "clang -emit-llvm foo.o -o foo"
52049c094fbcfaba49fc1aeca119c0e12bec59779692Rafael Espindola  Args.ClaimAllArgs(options::OPT_emit_llvm);
52057f6458b7e265d1870f3bd5be2b49bc4d368446b3Rafael Espindola  // and for "clang -g foo.o -o foo". Other warning options are already
52067f6458b7e265d1870f3bd5be2b49bc4d368446b3Rafael Espindola  // handled somewhere else.
52077f6458b7e265d1870f3bd5be2b49bc4d368446b3Rafael Espindola  Args.ClaimAllArgs(options::OPT_w);
520826f14c309e8de2db8c144342808cca2e869c1777Rafael Espindola
52098ab2bdcc4f397e100c684ede8e8ca6e226e1380aJoerg Sonnenberger  if (!D.SysRoot.empty())
52108ab2bdcc4f397e100c684ede8e8ca6e226e1380aJoerg Sonnenberger    CmdArgs.push_back(Args.MakeArgString("--sysroot=" + D.SysRoot));
5211c1da981bba867681004004b2d54ec2fdf3c08913Rafael Espindola
5212fdda17179047ff0b5e28cc777dc89ebc42f083cfRafael Espindola  if (Args.hasArg(options::OPT_pie))
5213fdda17179047ff0b5e28cc777dc89ebc42f083cfRafael Espindola    CmdArgs.push_back("-pie");
5214fdda17179047ff0b5e28cc777dc89ebc42f083cfRafael Espindola
5215dc1b76ddfc687c713a55cc9e3e054e9a0de1aa74Rafael Espindola  if (Args.hasArg(options::OPT_rdynamic))
5216dc1b76ddfc687c713a55cc9e3e054e9a0de1aa74Rafael Espindola    CmdArgs.push_back("-export-dynamic");
5217dc1b76ddfc687c713a55cc9e3e054e9a0de1aa74Rafael Espindola
5218e0e6d3b5cf61dfefad3c0393f4786d2cf3d9c272Rafael Espindola  if (Args.hasArg(options::OPT_s))
5219e0e6d3b5cf61dfefad3c0393f4786d2cf3d9c272Rafael Espindola    CmdArgs.push_back("-s");
5220e0e6d3b5cf61dfefad3c0393f4786d2cf3d9c272Rafael Espindola
5221c1da981bba867681004004b2d54ec2fdf3c08913Rafael Espindola  for (std::vector<std::string>::const_iterator i = ToolChain.ExtraOpts.begin(),
5222c1da981bba867681004004b2d54ec2fdf3c08913Rafael Espindola         e = ToolChain.ExtraOpts.end();
5223c1da981bba867681004004b2d54ec2fdf3c08913Rafael Espindola       i != e; ++i)
5224c1da981bba867681004004b2d54ec2fdf3c08913Rafael Espindola    CmdArgs.push_back(i->c_str());
5225c1da981bba867681004004b2d54ec2fdf3c08913Rafael Espindola
5226c1da981bba867681004004b2d54ec2fdf3c08913Rafael Espindola  if (!Args.hasArg(options::OPT_static)) {
5227c1da981bba867681004004b2d54ec2fdf3c08913Rafael Espindola    CmdArgs.push_back("--eh-frame-hdr");
5228c1da981bba867681004004b2d54ec2fdf3c08913Rafael Espindola  }
5229c1da981bba867681004004b2d54ec2fdf3c08913Rafael Espindola
5230c1da981bba867681004004b2d54ec2fdf3c08913Rafael Espindola  CmdArgs.push_back("-m");
5231c1da981bba867681004004b2d54ec2fdf3c08913Rafael Espindola  if (ToolChain.getArch() == llvm::Triple::x86)
5232c1da981bba867681004004b2d54ec2fdf3c08913Rafael Espindola    CmdArgs.push_back("elf_i386");
523388b7cf00fcb582728c642da3927c59468efaf926Eric Christopher  else if (ToolChain.getArch() == llvm::Triple::arm
5234f0594d8b64cf32c55dde7a49ba849e864446c92bDouglas Gregor           ||  ToolChain.getArch() == llvm::Triple::thumb)
5235c1da981bba867681004004b2d54ec2fdf3c08913Rafael Espindola    CmdArgs.push_back("armelf_linux_eabi");
523643ac2978291bf1471e2c916a88c7f1c1e170dc19Ted Kremenek  else if (ToolChain.getArch() == llvm::Triple::ppc)
523743ac2978291bf1471e2c916a88c7f1c1e170dc19Ted Kremenek    CmdArgs.push_back("elf32ppclinux");
523843ac2978291bf1471e2c916a88c7f1c1e170dc19Ted Kremenek  else if (ToolChain.getArch() == llvm::Triple::ppc64)
523943ac2978291bf1471e2c916a88c7f1c1e170dc19Ted Kremenek    CmdArgs.push_back("elf64ppc");
52405bea4f6860543017be326e3fbe702edb2678d898Eli Friedman  else if (ToolChain.getArch() == llvm::Triple::mips)
52415bea4f6860543017be326e3fbe702edb2678d898Eli Friedman    CmdArgs.push_back("elf32btsmip");
52425bea4f6860543017be326e3fbe702edb2678d898Eli Friedman  else if (ToolChain.getArch() == llvm::Triple::mipsel)
52435bea4f6860543017be326e3fbe702edb2678d898Eli Friedman    CmdArgs.push_back("elf32ltsmip");
52445bea4f6860543017be326e3fbe702edb2678d898Eli Friedman  else if (ToolChain.getArch() == llvm::Triple::mips64)
52455bea4f6860543017be326e3fbe702edb2678d898Eli Friedman    CmdArgs.push_back("elf64btsmip");
52465bea4f6860543017be326e3fbe702edb2678d898Eli Friedman  else if (ToolChain.getArch() == llvm::Triple::mips64el)
52475bea4f6860543017be326e3fbe702edb2678d898Eli Friedman    CmdArgs.push_back("elf64ltsmip");
5248c1da981bba867681004004b2d54ec2fdf3c08913Rafael Espindola  else
5249c1da981bba867681004004b2d54ec2fdf3c08913Rafael Espindola    CmdArgs.push_back("elf_x86_64");
5250c1da981bba867681004004b2d54ec2fdf3c08913Rafael Espindola
5251c1da981bba867681004004b2d54ec2fdf3c08913Rafael Espindola  if (Args.hasArg(options::OPT_static)) {
5252f0594d8b64cf32c55dde7a49ba849e864446c92bDouglas Gregor    if (ToolChain.getArch() == llvm::Triple::arm
5253f0594d8b64cf32c55dde7a49ba849e864446c92bDouglas Gregor        || ToolChain.getArch() == llvm::Triple::thumb)
5254c1da981bba867681004004b2d54ec2fdf3c08913Rafael Espindola      CmdArgs.push_back("-Bstatic");
5255c1da981bba867681004004b2d54ec2fdf3c08913Rafael Espindola    else
5256c1da981bba867681004004b2d54ec2fdf3c08913Rafael Espindola      CmdArgs.push_back("-static");
5257c1da981bba867681004004b2d54ec2fdf3c08913Rafael Espindola  } else if (Args.hasArg(options::OPT_shared)) {
5258c1da981bba867681004004b2d54ec2fdf3c08913Rafael Espindola    CmdArgs.push_back("-shared");
5259a6ddc02921d47d0a1dc9ffe4d31438f250751e05Evgeniy Stepanov    if ((ToolChain.getArch() == llvm::Triple::arm
5260a6ddc02921d47d0a1dc9ffe4d31438f250751e05Evgeniy Stepanov         || ToolChain.getArch() == llvm::Triple::thumb) && isAndroid) {
5261a6ddc02921d47d0a1dc9ffe4d31438f250751e05Evgeniy Stepanov      CmdArgs.push_back("-Bsymbolic");
5262a6ddc02921d47d0a1dc9ffe4d31438f250751e05Evgeniy Stepanov    }
5263c1da981bba867681004004b2d54ec2fdf3c08913Rafael Espindola  }
5264c1da981bba867681004004b2d54ec2fdf3c08913Rafael Espindola
5265c1da981bba867681004004b2d54ec2fdf3c08913Rafael Espindola  if (ToolChain.getArch() == llvm::Triple::arm ||
5266f0594d8b64cf32c55dde7a49ba849e864446c92bDouglas Gregor      ToolChain.getArch() == llvm::Triple::thumb ||
5267c1da981bba867681004004b2d54ec2fdf3c08913Rafael Espindola      (!Args.hasArg(options::OPT_static) &&
5268c1da981bba867681004004b2d54ec2fdf3c08913Rafael Espindola       !Args.hasArg(options::OPT_shared))) {
5269c1da981bba867681004004b2d54ec2fdf3c08913Rafael Espindola    CmdArgs.push_back("-dynamic-linker");
5270a6ddc02921d47d0a1dc9ffe4d31438f250751e05Evgeniy Stepanov    if (isAndroid)
5271a6ddc02921d47d0a1dc9ffe4d31438f250751e05Evgeniy Stepanov      CmdArgs.push_back("/system/bin/linker");
5272a6ddc02921d47d0a1dc9ffe4d31438f250751e05Evgeniy Stepanov    else if (ToolChain.getArch() == llvm::Triple::x86)
5273c1da981bba867681004004b2d54ec2fdf3c08913Rafael Espindola      CmdArgs.push_back("/lib/ld-linux.so.2");
5274f0594d8b64cf32c55dde7a49ba849e864446c92bDouglas Gregor    else if (ToolChain.getArch() == llvm::Triple::arm ||
5275f0594d8b64cf32c55dde7a49ba849e864446c92bDouglas Gregor             ToolChain.getArch() == llvm::Triple::thumb)
5276c1da981bba867681004004b2d54ec2fdf3c08913Rafael Espindola      CmdArgs.push_back("/lib/ld-linux.so.3");
52775bea4f6860543017be326e3fbe702edb2678d898Eli Friedman    else if (ToolChain.getArch() == llvm::Triple::mips ||
52785bea4f6860543017be326e3fbe702edb2678d898Eli Friedman             ToolChain.getArch() == llvm::Triple::mipsel)
52795bea4f6860543017be326e3fbe702edb2678d898Eli Friedman      CmdArgs.push_back("/lib/ld.so.1");
52808491cb245f7fccfb049f860444467130f68189d3Simon Atanasyan    else if (ToolChain.getArch() == llvm::Triple::mips64 ||
52818491cb245f7fccfb049f860444467130f68189d3Simon Atanasyan             ToolChain.getArch() == llvm::Triple::mips64el)
52828491cb245f7fccfb049f860444467130f68189d3Simon Atanasyan      CmdArgs.push_back("/lib64/ld.so.1");
528343ac2978291bf1471e2c916a88c7f1c1e170dc19Ted Kremenek    else if (ToolChain.getArch() == llvm::Triple::ppc)
528409f43ed8a1be67360fde9b335eac60bac8db8e19Chris Lattner      CmdArgs.push_back("/lib/ld.so.1");
528543ac2978291bf1471e2c916a88c7f1c1e170dc19Ted Kremenek    else if (ToolChain.getArch() == llvm::Triple::ppc64)
528609f43ed8a1be67360fde9b335eac60bac8db8e19Chris Lattner      CmdArgs.push_back("/lib64/ld64.so.1");
5287c1da981bba867681004004b2d54ec2fdf3c08913Rafael Espindola    else
5288c1da981bba867681004004b2d54ec2fdf3c08913Rafael Espindola      CmdArgs.push_back("/lib64/ld-linux-x86-64.so.2");
5289c1da981bba867681004004b2d54ec2fdf3c08913Rafael Espindola  }
5290c1da981bba867681004004b2d54ec2fdf3c08913Rafael Espindola
5291c1da981bba867681004004b2d54ec2fdf3c08913Rafael Espindola  CmdArgs.push_back("-o");
5292c1da981bba867681004004b2d54ec2fdf3c08913Rafael Espindola  CmdArgs.push_back(Output.getFilename());
5293c1da981bba867681004004b2d54ec2fdf3c08913Rafael Espindola
529449c64fdcf354c7998b8b301402fb6140c24df36aRafael Espindola  if (!Args.hasArg(options::OPT_nostdlib) &&
529549c64fdcf354c7998b8b301402fb6140c24df36aRafael Espindola      !Args.hasArg(options::OPT_nostartfiles)) {
5296a6ddc02921d47d0a1dc9ffe4d31438f250751e05Evgeniy Stepanov    if (!isAndroid) {
5297a6ddc02921d47d0a1dc9ffe4d31438f250751e05Evgeniy Stepanov      const char *crt1 = NULL;
5298a6ddc02921d47d0a1dc9ffe4d31438f250751e05Evgeniy Stepanov      if (!Args.hasArg(options::OPT_shared)){
5299a6ddc02921d47d0a1dc9ffe4d31438f250751e05Evgeniy Stepanov        if (Args.hasArg(options::OPT_pie))
5300a6ddc02921d47d0a1dc9ffe4d31438f250751e05Evgeniy Stepanov          crt1 = "Scrt1.o";
5301a6ddc02921d47d0a1dc9ffe4d31438f250751e05Evgeniy Stepanov        else
5302a6ddc02921d47d0a1dc9ffe4d31438f250751e05Evgeniy Stepanov          crt1 = "crt1.o";
5303a6ddc02921d47d0a1dc9ffe4d31438f250751e05Evgeniy Stepanov      }
5304a6ddc02921d47d0a1dc9ffe4d31438f250751e05Evgeniy Stepanov      if (crt1)
5305a6ddc02921d47d0a1dc9ffe4d31438f250751e05Evgeniy Stepanov        CmdArgs.push_back(Args.MakeArgString(ToolChain.GetFilePath(crt1)));
5306c1da981bba867681004004b2d54ec2fdf3c08913Rafael Espindola
5307a6ddc02921d47d0a1dc9ffe4d31438f250751e05Evgeniy Stepanov      CmdArgs.push_back(Args.MakeArgString(ToolChain.GetFilePath("crti.o")));
5308a6ddc02921d47d0a1dc9ffe4d31438f250751e05Evgeniy Stepanov    }
5309c1da981bba867681004004b2d54ec2fdf3c08913Rafael Espindola
531089414b384a0004c698244cc675f49d0669bb3463Rafael Espindola    const char *crtbegin;
531189414b384a0004c698244cc675f49d0669bb3463Rafael Espindola    if (Args.hasArg(options::OPT_static))
5312a6ddc02921d47d0a1dc9ffe4d31438f250751e05Evgeniy Stepanov      crtbegin = isAndroid ? "crtbegin_static.o" : "crtbeginT.o";
5313fdda17179047ff0b5e28cc777dc89ebc42f083cfRafael Espindola    else if (Args.hasArg(options::OPT_shared) || Args.hasArg(options::OPT_pie))
5314a6ddc02921d47d0a1dc9ffe4d31438f250751e05Evgeniy Stepanov      crtbegin = isAndroid ? "crtbegin_so.o" : "crtbeginS.o";
531589414b384a0004c698244cc675f49d0669bb3463Rafael Espindola    else
5316a6ddc02921d47d0a1dc9ffe4d31438f250751e05Evgeniy Stepanov      crtbegin = isAndroid ? "crtbegin_dynamic.o" : "crtbegin.o";
531789414b384a0004c698244cc675f49d0669bb3463Rafael Espindola    CmdArgs.push_back(Args.MakeArgString(ToolChain.GetFilePath(crtbegin)));
531889414b384a0004c698244cc675f49d0669bb3463Rafael Espindola  }
5319c1da981bba867681004004b2d54ec2fdf3c08913Rafael Espindola
5320c1da981bba867681004004b2d54ec2fdf3c08913Rafael Espindola  Args.AddAllArgs(CmdArgs, options::OPT_L);
5321c1da981bba867681004004b2d54ec2fdf3c08913Rafael Espindola
5322c1da981bba867681004004b2d54ec2fdf3c08913Rafael Espindola  const ToolChain::path_list Paths = ToolChain.getFilePaths();
5323c1da981bba867681004004b2d54ec2fdf3c08913Rafael Espindola
532458e5ac9d41d8186bea92e892d572e2eea28d3f9cRoman Divacky  for (ToolChain::path_list::const_iterator i = Paths.begin(), e = Paths.end();
532558e5ac9d41d8186bea92e892d572e2eea28d3f9cRoman Divacky       i != e; ++i)
53265f9e272e632e951b1efe824cd16acb4d96077930Chris Lattner    CmdArgs.push_back(Args.MakeArgString(StringRef("-L") + *i));
5327c1da981bba867681004004b2d54ec2fdf3c08913Rafael Espindola
5328c5151543236bd213b8595a079cf9b1d26de4eeb1Rafael Espindola  // Tell the linker to load the plugin. This has to come before AddLinkerInputs
5329c5151543236bd213b8595a079cf9b1d26de4eeb1Rafael Espindola  // as gold requires -plugin to come before any -plugin-opt that -Wl might
5330c5151543236bd213b8595a079cf9b1d26de4eeb1Rafael Espindola  // forward.
5331c5151543236bd213b8595a079cf9b1d26de4eeb1Rafael Espindola  if (D.IsUsingLTO(Args) || Args.hasArg(options::OPT_use_gold_plugin)) {
5332c5151543236bd213b8595a079cf9b1d26de4eeb1Rafael Espindola    CmdArgs.push_back("-plugin");
5333c5151543236bd213b8595a079cf9b1d26de4eeb1Rafael Espindola    std::string Plugin = ToolChain.getDriver().Dir + "/../lib/LLVMgold.so";
5334c5151543236bd213b8595a079cf9b1d26de4eeb1Rafael Espindola    CmdArgs.push_back(Args.MakeArgString(Plugin));
5335c5151543236bd213b8595a079cf9b1d26de4eeb1Rafael Espindola  }
5336c5151543236bd213b8595a079cf9b1d26de4eeb1Rafael Espindola
5337c1da981bba867681004004b2d54ec2fdf3c08913Rafael Espindola  AddLinkerInputs(ToolChain, Inputs, Args, CmdArgs);
5338c1da981bba867681004004b2d54ec2fdf3c08913Rafael Espindola
53392ba542c741c39691940f5d1de0bc88c22f46c430Chandler Carruth  if (D.CCCIsCXX &&
53402ba542c741c39691940f5d1de0bc88c22f46c430Chandler Carruth      !Args.hasArg(options::OPT_nostdlib) &&
53412ba542c741c39691940f5d1de0bc88c22f46c430Chandler Carruth      !Args.hasArg(options::OPT_nodefaultlibs)) {
534219706f8e702c04d19bc1ace504cbb9df008b6daaRafael Espindola    bool OnlyLibstdcxxStatic = Args.hasArg(options::OPT_static_libstdcxx) &&
534319706f8e702c04d19bc1ace504cbb9df008b6daaRafael Espindola      !Args.hasArg(options::OPT_static);
534419706f8e702c04d19bc1ace504cbb9df008b6daaRafael Espindola    if (OnlyLibstdcxxStatic)
534519706f8e702c04d19bc1ace504cbb9df008b6daaRafael Espindola      CmdArgs.push_back("-Bstatic");
5346c1da981bba867681004004b2d54ec2fdf3c08913Rafael Espindola    ToolChain.AddCXXStdlibLibArgs(Args, CmdArgs);
534719706f8e702c04d19bc1ace504cbb9df008b6daaRafael Espindola    if (OnlyLibstdcxxStatic)
534819706f8e702c04d19bc1ace504cbb9df008b6daaRafael Espindola      CmdArgs.push_back("-Bdynamic");
5349c1da981bba867681004004b2d54ec2fdf3c08913Rafael Espindola    CmdArgs.push_back("-lm");
5350c1da981bba867681004004b2d54ec2fdf3c08913Rafael Espindola  }
5351c1da981bba867681004004b2d54ec2fdf3c08913Rafael Espindola
5352dff466c0791465f929a1d8cd551d4c84b360ba32Kostya Serebryany  // Call this before we add the C run-time.
5353dff466c0791465f929a1d8cd551d4c84b360ba32Kostya Serebryany  addAsanRTLinux(getToolChain(), Args, CmdArgs);
5354f7efb0e7478da45bc7f2d24dbeb08406d2399591Kostya Serebryany  addTsanRTLinux(getToolChain(), Args, CmdArgs);
5355dff466c0791465f929a1d8cd551d4c84b360ba32Kostya Serebryany
535689414b384a0004c698244cc675f49d0669bb3463Rafael Espindola  if (!Args.hasArg(options::OPT_nostdlib)) {
53572ba542c741c39691940f5d1de0bc88c22f46c430Chandler Carruth    if (!Args.hasArg(options::OPT_nodefaultlibs)) {
53582ba542c741c39691940f5d1de0bc88c22f46c430Chandler Carruth      if (Args.hasArg(options::OPT_static))
53592ba542c741c39691940f5d1de0bc88c22f46c430Chandler Carruth        CmdArgs.push_back("--start-group");
5360e0e6d3b5cf61dfefad3c0393f4786d2cf3d9c272Rafael Espindola
53612ba542c741c39691940f5d1de0bc88c22f46c430Chandler Carruth      AddLibgcc(ToolChain.getTriple(), D, CmdArgs, Args);
5362c1da981bba867681004004b2d54ec2fdf3c08913Rafael Espindola
53632ba542c741c39691940f5d1de0bc88c22f46c430Chandler Carruth      if (Args.hasArg(options::OPT_pthread) ||
53642ba542c741c39691940f5d1de0bc88c22f46c430Chandler Carruth          Args.hasArg(options::OPT_pthreads))
53652ba542c741c39691940f5d1de0bc88c22f46c430Chandler Carruth        CmdArgs.push_back("-lpthread");
5366c1da981bba867681004004b2d54ec2fdf3c08913Rafael Espindola
53672ba542c741c39691940f5d1de0bc88c22f46c430Chandler Carruth      CmdArgs.push_back("-lc");
5368c1da981bba867681004004b2d54ec2fdf3c08913Rafael Espindola
53692ba542c741c39691940f5d1de0bc88c22f46c430Chandler Carruth      if (Args.hasArg(options::OPT_static))
53702ba542c741c39691940f5d1de0bc88c22f46c430Chandler Carruth        CmdArgs.push_back("--end-group");
53712ba542c741c39691940f5d1de0bc88c22f46c430Chandler Carruth      else
53722ba542c741c39691940f5d1de0bc88c22f46c430Chandler Carruth        AddLibgcc(ToolChain.getTriple(), D, CmdArgs, Args);
53732ba542c741c39691940f5d1de0bc88c22f46c430Chandler Carruth    }
5374fdda17179047ff0b5e28cc777dc89ebc42f083cfRafael Espindola
537549c64fdcf354c7998b8b301402fb6140c24df36aRafael Espindola    if (!Args.hasArg(options::OPT_nostartfiles)) {
537649c64fdcf354c7998b8b301402fb6140c24df36aRafael Espindola      const char *crtend;
537749c64fdcf354c7998b8b301402fb6140c24df36aRafael Espindola      if (Args.hasArg(options::OPT_shared) || Args.hasArg(options::OPT_pie))
5378a6ddc02921d47d0a1dc9ffe4d31438f250751e05Evgeniy Stepanov        crtend = isAndroid ? "crtend_so.o" : "crtendS.o";
537949c64fdcf354c7998b8b301402fb6140c24df36aRafael Espindola      else
5380a6ddc02921d47d0a1dc9ffe4d31438f250751e05Evgeniy Stepanov        crtend = isAndroid ? "crtend_android.o" : "crtend.o";
538189414b384a0004c698244cc675f49d0669bb3463Rafael Espindola
538249c64fdcf354c7998b8b301402fb6140c24df36aRafael Espindola      CmdArgs.push_back(Args.MakeArgString(ToolChain.GetFilePath(crtend)));
5383a6ddc02921d47d0a1dc9ffe4d31438f250751e05Evgeniy Stepanov      if (!isAndroid)
5384a6ddc02921d47d0a1dc9ffe4d31438f250751e05Evgeniy Stepanov        CmdArgs.push_back(Args.MakeArgString(ToolChain.GetFilePath("crtn.o")));
538549c64fdcf354c7998b8b301402fb6140c24df36aRafael Espindola    }
538689414b384a0004c698244cc675f49d0669bb3463Rafael Espindola  }
5387c1da981bba867681004004b2d54ec2fdf3c08913Rafael Espindola
53883f4be6fb8872942f567166ab8d99c89885f26103Bill Wendling  addProfileRT(getToolChain(), Args, CmdArgs, getToolChain().getTriple());
53892e95a6d7d0b5aed39747875d7474c27824f7319fNick Lewycky
5390c1da981bba867681004004b2d54ec2fdf3c08913Rafael Espindola  C.addCommand(new Command(JA, *this, ToolChain.Linker.c_str(), CmdArgs));
5391c1da981bba867681004004b2d54ec2fdf3c08913Rafael Espindola}
5392ba30bbe4e36a30a274da809a11a42f9cdc168e92Rafael Espindola
539338e317d6dce161b249508686cc67eb7176958762Chris Lattnervoid minix::Assemble::ConstructJob(Compilation &C, const JobAction &JA,
53942fe238ed293bd4bc27af9beb9fa151fad2146fa8Daniel Dunbar                                   const InputInfo &Output,
53952fe238ed293bd4bc27af9beb9fa151fad2146fa8Daniel Dunbar                                   const InputInfoList &Inputs,
53962fe238ed293bd4bc27af9beb9fa151fad2146fa8Daniel Dunbar                                   const ArgList &Args,
53972fe238ed293bd4bc27af9beb9fa151fad2146fa8Daniel Dunbar                                   const char *LinkingOutput) const {
539838e317d6dce161b249508686cc67eb7176958762Chris Lattner  ArgStringList CmdArgs;
539938e317d6dce161b249508686cc67eb7176958762Chris Lattner
540038e317d6dce161b249508686cc67eb7176958762Chris Lattner  Args.AddAllArgValues(CmdArgs, options::OPT_Wa_COMMA,
540138e317d6dce161b249508686cc67eb7176958762Chris Lattner                       options::OPT_Xassembler);
540238e317d6dce161b249508686cc67eb7176958762Chris Lattner
540338e317d6dce161b249508686cc67eb7176958762Chris Lattner  CmdArgs.push_back("-o");
54047c1e46533cae07216e2a67d5636a5afb44253155Daniel Dunbar  CmdArgs.push_back(Output.getFilename());
540538e317d6dce161b249508686cc67eb7176958762Chris Lattner
540638e317d6dce161b249508686cc67eb7176958762Chris Lattner  for (InputInfoList::const_iterator
540738e317d6dce161b249508686cc67eb7176958762Chris Lattner         it = Inputs.begin(), ie = Inputs.end(); it != ie; ++it) {
540838e317d6dce161b249508686cc67eb7176958762Chris Lattner    const InputInfo &II = *it;
54097c1e46533cae07216e2a67d5636a5afb44253155Daniel Dunbar    CmdArgs.push_back(II.getFilename());
541038e317d6dce161b249508686cc67eb7176958762Chris Lattner  }
541138e317d6dce161b249508686cc67eb7176958762Chris Lattner
541238e317d6dce161b249508686cc67eb7176958762Chris Lattner  const char *Exec =
54136d402dc963aa32194f3604af4463b113858291aeEli Friedman    Args.MakeArgString(getToolChain().GetProgramPath("as"));
54142fe238ed293bd4bc27af9beb9fa151fad2146fa8Daniel Dunbar  C.addCommand(new Command(JA, *this, Exec, CmdArgs));
541538e317d6dce161b249508686cc67eb7176958762Chris Lattner}
541638e317d6dce161b249508686cc67eb7176958762Chris Lattner
541738e317d6dce161b249508686cc67eb7176958762Chris Lattnervoid minix::Link::ConstructJob(Compilation &C, const JobAction &JA,
54182fe238ed293bd4bc27af9beb9fa151fad2146fa8Daniel Dunbar                               const InputInfo &Output,
54192fe238ed293bd4bc27af9beb9fa151fad2146fa8Daniel Dunbar                               const InputInfoList &Inputs,
54202fe238ed293bd4bc27af9beb9fa151fad2146fa8Daniel Dunbar                               const ArgList &Args,
54212fe238ed293bd4bc27af9beb9fa151fad2146fa8Daniel Dunbar                               const char *LinkingOutput) const {
542238e317d6dce161b249508686cc67eb7176958762Chris Lattner  const Driver &D = getToolChain().getDriver();
542338e317d6dce161b249508686cc67eb7176958762Chris Lattner  ArgStringList CmdArgs;
542438e317d6dce161b249508686cc67eb7176958762Chris Lattner
54257c1e46533cae07216e2a67d5636a5afb44253155Daniel Dunbar  if (Output.isFilename()) {
542638e317d6dce161b249508686cc67eb7176958762Chris Lattner    CmdArgs.push_back("-o");
542738e317d6dce161b249508686cc67eb7176958762Chris Lattner    CmdArgs.push_back(Output.getFilename());
542838e317d6dce161b249508686cc67eb7176958762Chris Lattner  } else {
542938e317d6dce161b249508686cc67eb7176958762Chris Lattner    assert(Output.isNothing() && "Invalid output.");
543038e317d6dce161b249508686cc67eb7176958762Chris Lattner  }
543138e317d6dce161b249508686cc67eb7176958762Chris Lattner
543238e317d6dce161b249508686cc67eb7176958762Chris Lattner  if (!Args.hasArg(options::OPT_nostdlib) &&
54336d402dc963aa32194f3604af4463b113858291aeEli Friedman      !Args.hasArg(options::OPT_nostartfiles)) {
54346d402dc963aa32194f3604af4463b113858291aeEli Friedman      CmdArgs.push_back(Args.MakeArgString(getToolChain().GetFilePath("crt1.o")));
54356d402dc963aa32194f3604af4463b113858291aeEli Friedman      CmdArgs.push_back(Args.MakeArgString(getToolChain().GetFilePath("crti.o")));
54366d402dc963aa32194f3604af4463b113858291aeEli Friedman      CmdArgs.push_back(Args.MakeArgString(getToolChain().GetFilePath("crtbegin.o")));
54376d402dc963aa32194f3604af4463b113858291aeEli Friedman      CmdArgs.push_back(Args.MakeArgString(getToolChain().GetFilePath("crtn.o")));
54386d402dc963aa32194f3604af4463b113858291aeEli Friedman  }
543938e317d6dce161b249508686cc67eb7176958762Chris Lattner
544038e317d6dce161b249508686cc67eb7176958762Chris Lattner  Args.AddAllArgs(CmdArgs, options::OPT_L);
544138e317d6dce161b249508686cc67eb7176958762Chris Lattner  Args.AddAllArgs(CmdArgs, options::OPT_T_Group);
544238e317d6dce161b249508686cc67eb7176958762Chris Lattner  Args.AddAllArgs(CmdArgs, options::OPT_e);
544338e317d6dce161b249508686cc67eb7176958762Chris Lattner
54442008feead855f08500fb01ff43ef5eebee05d1e5Daniel Dunbar  AddLinkerInputs(getToolChain(), Inputs, Args, CmdArgs);
544538e317d6dce161b249508686cc67eb7176958762Chris Lattner
54466d402dc963aa32194f3604af4463b113858291aeEli Friedman  addProfileRT(getToolChain(), Args, CmdArgs, getToolChain().getTriple());
54476d402dc963aa32194f3604af4463b113858291aeEli Friedman
544838e317d6dce161b249508686cc67eb7176958762Chris Lattner  if (!Args.hasArg(options::OPT_nostdlib) &&
544938e317d6dce161b249508686cc67eb7176958762Chris Lattner      !Args.hasArg(options::OPT_nodefaultlibs)) {
545038e317d6dce161b249508686cc67eb7176958762Chris Lattner    if (D.CCCIsCXX) {
5451132e35d2f87895d20e7ea146c8c00404b80221a1Daniel Dunbar      getToolChain().AddCXXStdlibLibArgs(Args, CmdArgs);
545238e317d6dce161b249508686cc67eb7176958762Chris Lattner      CmdArgs.push_back("-lm");
545338e317d6dce161b249508686cc67eb7176958762Chris Lattner    }
545438e317d6dce161b249508686cc67eb7176958762Chris Lattner  }
545538e317d6dce161b249508686cc67eb7176958762Chris Lattner
545638e317d6dce161b249508686cc67eb7176958762Chris Lattner  if (!Args.hasArg(options::OPT_nostdlib) &&
545738e317d6dce161b249508686cc67eb7176958762Chris Lattner      !Args.hasArg(options::OPT_nostartfiles)) {
54586d402dc963aa32194f3604af4463b113858291aeEli Friedman    if (Args.hasArg(options::OPT_pthread))
54596d402dc963aa32194f3604af4463b113858291aeEli Friedman      CmdArgs.push_back("-lpthread");
54606d402dc963aa32194f3604af4463b113858291aeEli Friedman    CmdArgs.push_back("-lc");
54616d402dc963aa32194f3604af4463b113858291aeEli Friedman    CmdArgs.push_back("-lCompilerRT-Generic");
54626d402dc963aa32194f3604af4463b113858291aeEli Friedman    CmdArgs.push_back("-L/usr/pkg/compiler-rt/lib");
54636d402dc963aa32194f3604af4463b113858291aeEli Friedman    CmdArgs.push_back(
54646d402dc963aa32194f3604af4463b113858291aeEli Friedman	 Args.MakeArgString(getToolChain().GetFilePath("crtend.o")));
546538e317d6dce161b249508686cc67eb7176958762Chris Lattner  }
546638e317d6dce161b249508686cc67eb7176958762Chris Lattner
54676d402dc963aa32194f3604af4463b113858291aeEli Friedman  const char *Exec = Args.MakeArgString(getToolChain().GetProgramPath("ld"));
54682fe238ed293bd4bc27af9beb9fa151fad2146fa8Daniel Dunbar  C.addCommand(new Command(JA, *this, Exec, CmdArgs));
546938e317d6dce161b249508686cc67eb7176958762Chris Lattner}
547038e317d6dce161b249508686cc67eb7176958762Chris Lattner
547111e1b40d759a643086f590f6ffbd9d68360bad46Daniel Dunbar/// DragonFly Tools
547211e1b40d759a643086f590f6ffbd9d68360bad46Daniel Dunbar
547311e1b40d759a643086f590f6ffbd9d68360bad46Daniel Dunbar// For now, DragonFly Assemble does just about the same as for
547411e1b40d759a643086f590f6ffbd9d68360bad46Daniel Dunbar// FreeBSD, but this may change soon.
547511e1b40d759a643086f590f6ffbd9d68360bad46Daniel Dunbarvoid dragonfly::Assemble::ConstructJob(Compilation &C, const JobAction &JA,
54762fe238ed293bd4bc27af9beb9fa151fad2146fa8Daniel Dunbar                                       const InputInfo &Output,
5477294691eb1caf551083acd7b08630ef21c3fd760dDaniel Dunbar                                       const InputInfoList &Inputs,
5478294691eb1caf551083acd7b08630ef21c3fd760dDaniel Dunbar                                       const ArgList &Args,
5479294691eb1caf551083acd7b08630ef21c3fd760dDaniel Dunbar                                       const char *LinkingOutput) const {
548011e1b40d759a643086f590f6ffbd9d68360bad46Daniel Dunbar  ArgStringList CmdArgs;
548111e1b40d759a643086f590f6ffbd9d68360bad46Daniel Dunbar
548211e1b40d759a643086f590f6ffbd9d68360bad46Daniel Dunbar  // When building 32-bit code on DragonFly/pc64, we have to explicitly
548311e1b40d759a643086f590f6ffbd9d68360bad46Daniel Dunbar  // instruct as in the base system to assemble 32-bit code.
548411e1b40d759a643086f590f6ffbd9d68360bad46Daniel Dunbar  if (getToolChain().getArchName() == "i386")
548511e1b40d759a643086f590f6ffbd9d68360bad46Daniel Dunbar    CmdArgs.push_back("--32");
548611e1b40d759a643086f590f6ffbd9d68360bad46Daniel Dunbar
548711e1b40d759a643086f590f6ffbd9d68360bad46Daniel Dunbar  Args.AddAllArgValues(CmdArgs, options::OPT_Wa_COMMA,
548811e1b40d759a643086f590f6ffbd9d68360bad46Daniel Dunbar                       options::OPT_Xassembler);
548911e1b40d759a643086f590f6ffbd9d68360bad46Daniel Dunbar
549011e1b40d759a643086f590f6ffbd9d68360bad46Daniel Dunbar  CmdArgs.push_back("-o");
54917c1e46533cae07216e2a67d5636a5afb44253155Daniel Dunbar  CmdArgs.push_back(Output.getFilename());
549211e1b40d759a643086f590f6ffbd9d68360bad46Daniel Dunbar
549311e1b40d759a643086f590f6ffbd9d68360bad46Daniel Dunbar  for (InputInfoList::const_iterator
549411e1b40d759a643086f590f6ffbd9d68360bad46Daniel Dunbar         it = Inputs.begin(), ie = Inputs.end(); it != ie; ++it) {
549511e1b40d759a643086f590f6ffbd9d68360bad46Daniel Dunbar    const InputInfo &II = *it;
54967c1e46533cae07216e2a67d5636a5afb44253155Daniel Dunbar    CmdArgs.push_back(II.getFilename());
549711e1b40d759a643086f590f6ffbd9d68360bad46Daniel Dunbar  }
549811e1b40d759a643086f590f6ffbd9d68360bad46Daniel Dunbar
549911e1b40d759a643086f590f6ffbd9d68360bad46Daniel Dunbar  const char *Exec =
55004a7e88978cf646ad10d654020cb00b3877069210Daniel Dunbar    Args.MakeArgString(getToolChain().GetProgramPath("as"));
55012fe238ed293bd4bc27af9beb9fa151fad2146fa8Daniel Dunbar  C.addCommand(new Command(JA, *this, Exec, CmdArgs));
550211e1b40d759a643086f590f6ffbd9d68360bad46Daniel Dunbar}
550311e1b40d759a643086f590f6ffbd9d68360bad46Daniel Dunbar
550411e1b40d759a643086f590f6ffbd9d68360bad46Daniel Dunbarvoid dragonfly::Link::ConstructJob(Compilation &C, const JobAction &JA,
55052fe238ed293bd4bc27af9beb9fa151fad2146fa8Daniel Dunbar                                   const InputInfo &Output,
55062fe238ed293bd4bc27af9beb9fa151fad2146fa8Daniel Dunbar                                   const InputInfoList &Inputs,
55072fe238ed293bd4bc27af9beb9fa151fad2146fa8Daniel Dunbar                                   const ArgList &Args,
55082fe238ed293bd4bc27af9beb9fa151fad2146fa8Daniel Dunbar                                   const char *LinkingOutput) const {
5509ee788e70fcd0adf76103b17c78ac658d4ea30c9bDaniel Dunbar  const Driver &D = getToolChain().getDriver();
551011e1b40d759a643086f590f6ffbd9d68360bad46Daniel Dunbar  ArgStringList CmdArgs;
551111e1b40d759a643086f590f6ffbd9d68360bad46Daniel Dunbar
55128ab2bdcc4f397e100c684ede8e8ca6e226e1380aJoerg Sonnenberger  if (!D.SysRoot.empty())
55138ab2bdcc4f397e100c684ede8e8ca6e226e1380aJoerg Sonnenberger    CmdArgs.push_back(Args.MakeArgString("--sysroot=" + D.SysRoot));
55148ab2bdcc4f397e100c684ede8e8ca6e226e1380aJoerg Sonnenberger
551511e1b40d759a643086f590f6ffbd9d68360bad46Daniel Dunbar  if (Args.hasArg(options::OPT_static)) {
551611e1b40d759a643086f590f6ffbd9d68360bad46Daniel Dunbar    CmdArgs.push_back("-Bstatic");
551711e1b40d759a643086f590f6ffbd9d68360bad46Daniel Dunbar  } else {
551811e1b40d759a643086f590f6ffbd9d68360bad46Daniel Dunbar    if (Args.hasArg(options::OPT_shared))
551911e1b40d759a643086f590f6ffbd9d68360bad46Daniel Dunbar      CmdArgs.push_back("-Bshareable");
552011e1b40d759a643086f590f6ffbd9d68360bad46Daniel Dunbar    else {
552111e1b40d759a643086f590f6ffbd9d68360bad46Daniel Dunbar      CmdArgs.push_back("-dynamic-linker");
552211e1b40d759a643086f590f6ffbd9d68360bad46Daniel Dunbar      CmdArgs.push_back("/usr/libexec/ld-elf.so.2");
552311e1b40d759a643086f590f6ffbd9d68360bad46Daniel Dunbar    }
552411e1b40d759a643086f590f6ffbd9d68360bad46Daniel Dunbar  }
552511e1b40d759a643086f590f6ffbd9d68360bad46Daniel Dunbar
552611e1b40d759a643086f590f6ffbd9d68360bad46Daniel Dunbar  // When building 32-bit code on DragonFly/pc64, we have to explicitly
552711e1b40d759a643086f590f6ffbd9d68360bad46Daniel Dunbar  // instruct ld in the base system to link 32-bit code.
552811e1b40d759a643086f590f6ffbd9d68360bad46Daniel Dunbar  if (getToolChain().getArchName() == "i386") {
552911e1b40d759a643086f590f6ffbd9d68360bad46Daniel Dunbar    CmdArgs.push_back("-m");
553011e1b40d759a643086f590f6ffbd9d68360bad46Daniel Dunbar    CmdArgs.push_back("elf_i386");
553111e1b40d759a643086f590f6ffbd9d68360bad46Daniel Dunbar  }
553211e1b40d759a643086f590f6ffbd9d68360bad46Daniel Dunbar
55337c1e46533cae07216e2a67d5636a5afb44253155Daniel Dunbar  if (Output.isFilename()) {
553411e1b40d759a643086f590f6ffbd9d68360bad46Daniel Dunbar    CmdArgs.push_back("-o");
553511e1b40d759a643086f590f6ffbd9d68360bad46Daniel Dunbar    CmdArgs.push_back(Output.getFilename());
553611e1b40d759a643086f590f6ffbd9d68360bad46Daniel Dunbar  } else {
553711e1b40d759a643086f590f6ffbd9d68360bad46Daniel Dunbar    assert(Output.isNothing() && "Invalid output.");
553811e1b40d759a643086f590f6ffbd9d68360bad46Daniel Dunbar  }
553911e1b40d759a643086f590f6ffbd9d68360bad46Daniel Dunbar
554011e1b40d759a643086f590f6ffbd9d68360bad46Daniel Dunbar  if (!Args.hasArg(options::OPT_nostdlib) &&
554111e1b40d759a643086f590f6ffbd9d68360bad46Daniel Dunbar      !Args.hasArg(options::OPT_nostartfiles)) {
554211e1b40d759a643086f590f6ffbd9d68360bad46Daniel Dunbar    if (!Args.hasArg(options::OPT_shared)) {
554338e317d6dce161b249508686cc67eb7176958762Chris Lattner      CmdArgs.push_back(
55444a7e88978cf646ad10d654020cb00b3877069210Daniel Dunbar            Args.MakeArgString(getToolChain().GetFilePath("crt1.o")));
554538e317d6dce161b249508686cc67eb7176958762Chris Lattner      CmdArgs.push_back(
55464a7e88978cf646ad10d654020cb00b3877069210Daniel Dunbar            Args.MakeArgString(getToolChain().GetFilePath("crti.o")));
554738e317d6dce161b249508686cc67eb7176958762Chris Lattner      CmdArgs.push_back(
55484a7e88978cf646ad10d654020cb00b3877069210Daniel Dunbar            Args.MakeArgString(getToolChain().GetFilePath("crtbegin.o")));
554911e1b40d759a643086f590f6ffbd9d68360bad46Daniel Dunbar    } else {
555038e317d6dce161b249508686cc67eb7176958762Chris Lattner      CmdArgs.push_back(
55514a7e88978cf646ad10d654020cb00b3877069210Daniel Dunbar            Args.MakeArgString(getToolChain().GetFilePath("crti.o")));
555238e317d6dce161b249508686cc67eb7176958762Chris Lattner      CmdArgs.push_back(
55534a7e88978cf646ad10d654020cb00b3877069210Daniel Dunbar            Args.MakeArgString(getToolChain().GetFilePath("crtbeginS.o")));
555411e1b40d759a643086f590f6ffbd9d68360bad46Daniel Dunbar    }
555511e1b40d759a643086f590f6ffbd9d68360bad46Daniel Dunbar  }
555611e1b40d759a643086f590f6ffbd9d68360bad46Daniel Dunbar
555711e1b40d759a643086f590f6ffbd9d68360bad46Daniel Dunbar  Args.AddAllArgs(CmdArgs, options::OPT_L);
555811e1b40d759a643086f590f6ffbd9d68360bad46Daniel Dunbar  Args.AddAllArgs(CmdArgs, options::OPT_T_Group);
555911e1b40d759a643086f590f6ffbd9d68360bad46Daniel Dunbar  Args.AddAllArgs(CmdArgs, options::OPT_e);
556011e1b40d759a643086f590f6ffbd9d68360bad46Daniel Dunbar
55612008feead855f08500fb01ff43ef5eebee05d1e5Daniel Dunbar  AddLinkerInputs(getToolChain(), Inputs, Args, CmdArgs);
556211e1b40d759a643086f590f6ffbd9d68360bad46Daniel Dunbar
556311e1b40d759a643086f590f6ffbd9d68360bad46Daniel Dunbar  if (!Args.hasArg(options::OPT_nostdlib) &&
556411e1b40d759a643086f590f6ffbd9d68360bad46Daniel Dunbar      !Args.hasArg(options::OPT_nodefaultlibs)) {
556511e1b40d759a643086f590f6ffbd9d68360bad46Daniel Dunbar    // FIXME: GCC passes on -lgcc, -lgcc_pic and a whole lot of
556611e1b40d759a643086f590f6ffbd9d68360bad46Daniel Dunbar    //         rpaths
556711e1b40d759a643086f590f6ffbd9d68360bad46Daniel Dunbar    CmdArgs.push_back("-L/usr/lib/gcc41");
556811e1b40d759a643086f590f6ffbd9d68360bad46Daniel Dunbar
556911e1b40d759a643086f590f6ffbd9d68360bad46Daniel Dunbar    if (!Args.hasArg(options::OPT_static)) {
557011e1b40d759a643086f590f6ffbd9d68360bad46Daniel Dunbar      CmdArgs.push_back("-rpath");
557111e1b40d759a643086f590f6ffbd9d68360bad46Daniel Dunbar      CmdArgs.push_back("/usr/lib/gcc41");
557211e1b40d759a643086f590f6ffbd9d68360bad46Daniel Dunbar
557311e1b40d759a643086f590f6ffbd9d68360bad46Daniel Dunbar      CmdArgs.push_back("-rpath-link");
557411e1b40d759a643086f590f6ffbd9d68360bad46Daniel Dunbar      CmdArgs.push_back("/usr/lib/gcc41");
557511e1b40d759a643086f590f6ffbd9d68360bad46Daniel Dunbar
557611e1b40d759a643086f590f6ffbd9d68360bad46Daniel Dunbar      CmdArgs.push_back("-rpath");
557711e1b40d759a643086f590f6ffbd9d68360bad46Daniel Dunbar      CmdArgs.push_back("/usr/lib");
557811e1b40d759a643086f590f6ffbd9d68360bad46Daniel Dunbar
557911e1b40d759a643086f590f6ffbd9d68360bad46Daniel Dunbar      CmdArgs.push_back("-rpath-link");
558011e1b40d759a643086f590f6ffbd9d68360bad46Daniel Dunbar      CmdArgs.push_back("/usr/lib");
558111e1b40d759a643086f590f6ffbd9d68360bad46Daniel Dunbar    }
558211e1b40d759a643086f590f6ffbd9d68360bad46Daniel Dunbar
5583405861d4ae824795f506d03cd7578f011cbf5b87Rafael Espindola    if (D.CCCIsCXX) {
5584132e35d2f87895d20e7ea146c8c00404b80221a1Daniel Dunbar      getToolChain().AddCXXStdlibLibArgs(Args, CmdArgs);
5585405861d4ae824795f506d03cd7578f011cbf5b87Rafael Espindola      CmdArgs.push_back("-lm");
5586405861d4ae824795f506d03cd7578f011cbf5b87Rafael Espindola    }
5587405861d4ae824795f506d03cd7578f011cbf5b87Rafael Espindola
558811e1b40d759a643086f590f6ffbd9d68360bad46Daniel Dunbar    if (Args.hasArg(options::OPT_shared)) {
558911e1b40d759a643086f590f6ffbd9d68360bad46Daniel Dunbar      CmdArgs.push_back("-lgcc_pic");
559011e1b40d759a643086f590f6ffbd9d68360bad46Daniel Dunbar    } else {
559111e1b40d759a643086f590f6ffbd9d68360bad46Daniel Dunbar      CmdArgs.push_back("-lgcc");
559211e1b40d759a643086f590f6ffbd9d68360bad46Daniel Dunbar    }
559311e1b40d759a643086f590f6ffbd9d68360bad46Daniel Dunbar
559411e1b40d759a643086f590f6ffbd9d68360bad46Daniel Dunbar
559511e1b40d759a643086f590f6ffbd9d68360bad46Daniel Dunbar    if (Args.hasArg(options::OPT_pthread))
55964d63f8bc2686d5d7580324407854f2ca7c128832Mike Stump      CmdArgs.push_back("-lpthread");
559711e1b40d759a643086f590f6ffbd9d68360bad46Daniel Dunbar
559811e1b40d759a643086f590f6ffbd9d68360bad46Daniel Dunbar    if (!Args.hasArg(options::OPT_nolibc)) {
559911e1b40d759a643086f590f6ffbd9d68360bad46Daniel Dunbar      CmdArgs.push_back("-lc");
560011e1b40d759a643086f590f6ffbd9d68360bad46Daniel Dunbar    }
560111e1b40d759a643086f590f6ffbd9d68360bad46Daniel Dunbar
560211e1b40d759a643086f590f6ffbd9d68360bad46Daniel Dunbar    if (Args.hasArg(options::OPT_shared)) {
560311e1b40d759a643086f590f6ffbd9d68360bad46Daniel Dunbar      CmdArgs.push_back("-lgcc_pic");
560411e1b40d759a643086f590f6ffbd9d68360bad46Daniel Dunbar    } else {
560511e1b40d759a643086f590f6ffbd9d68360bad46Daniel Dunbar      CmdArgs.push_back("-lgcc");
560611e1b40d759a643086f590f6ffbd9d68360bad46Daniel Dunbar    }
560711e1b40d759a643086f590f6ffbd9d68360bad46Daniel Dunbar  }
560811e1b40d759a643086f590f6ffbd9d68360bad46Daniel Dunbar
560911e1b40d759a643086f590f6ffbd9d68360bad46Daniel Dunbar  if (!Args.hasArg(options::OPT_nostdlib) &&
561011e1b40d759a643086f590f6ffbd9d68360bad46Daniel Dunbar      !Args.hasArg(options::OPT_nostartfiles)) {
561111e1b40d759a643086f590f6ffbd9d68360bad46Daniel Dunbar    if (!Args.hasArg(options::OPT_shared))
561238e317d6dce161b249508686cc67eb7176958762Chris Lattner      CmdArgs.push_back(Args.MakeArgString(
56134a7e88978cf646ad10d654020cb00b3877069210Daniel Dunbar                              getToolChain().GetFilePath("crtend.o")));
561411e1b40d759a643086f590f6ffbd9d68360bad46Daniel Dunbar    else
561538e317d6dce161b249508686cc67eb7176958762Chris Lattner      CmdArgs.push_back(Args.MakeArgString(
56164a7e88978cf646ad10d654020cb00b3877069210Daniel Dunbar                              getToolChain().GetFilePath("crtendS.o")));
561738e317d6dce161b249508686cc67eb7176958762Chris Lattner    CmdArgs.push_back(Args.MakeArgString(
56184a7e88978cf646ad10d654020cb00b3877069210Daniel Dunbar                              getToolChain().GetFilePath("crtn.o")));
561911e1b40d759a643086f590f6ffbd9d68360bad46Daniel Dunbar  }
562011e1b40d759a643086f590f6ffbd9d68360bad46Daniel Dunbar
56213f4be6fb8872942f567166ab8d99c89885f26103Bill Wendling  addProfileRT(getToolChain(), Args, CmdArgs, getToolChain().getTriple());
56222e95a6d7d0b5aed39747875d7474c27824f7319fNick Lewycky
562311e1b40d759a643086f590f6ffbd9d68360bad46Daniel Dunbar  const char *Exec =
56244a7e88978cf646ad10d654020cb00b3877069210Daniel Dunbar    Args.MakeArgString(getToolChain().GetProgramPath("ld"));
56252fe238ed293bd4bc27af9beb9fa151fad2146fa8Daniel Dunbar  C.addCommand(new Command(JA, *this, Exec, CmdArgs));
562611e1b40d759a643086f590f6ffbd9d68360bad46Daniel Dunbar}
5627ff58e3610f4e12094def69eb2d6dcb4330378d8fMichael J. Spencer
5628ff58e3610f4e12094def69eb2d6dcb4330378d8fMichael J. Spencervoid visualstudio::Link::ConstructJob(Compilation &C, const JobAction &JA,
5629ff58e3610f4e12094def69eb2d6dcb4330378d8fMichael J. Spencer                                      const InputInfo &Output,
5630ff58e3610f4e12094def69eb2d6dcb4330378d8fMichael J. Spencer                                      const InputInfoList &Inputs,
5631ff58e3610f4e12094def69eb2d6dcb4330378d8fMichael J. Spencer                                      const ArgList &Args,
5632ff58e3610f4e12094def69eb2d6dcb4330378d8fMichael J. Spencer                                      const char *LinkingOutput) const {
5633ff58e3610f4e12094def69eb2d6dcb4330378d8fMichael J. Spencer  ArgStringList CmdArgs;
5634ff58e3610f4e12094def69eb2d6dcb4330378d8fMichael J. Spencer
5635ff58e3610f4e12094def69eb2d6dcb4330378d8fMichael J. Spencer  if (Output.isFilename()) {
5636e5a37f48388c7e4cc081f44d13a4910bfa56cd35Daniel Dunbar    CmdArgs.push_back(Args.MakeArgString(std::string("-out:") +
5637e5a37f48388c7e4cc081f44d13a4910bfa56cd35Daniel Dunbar                                         Output.getFilename()));
5638ff58e3610f4e12094def69eb2d6dcb4330378d8fMichael J. Spencer  } else {
5639ff58e3610f4e12094def69eb2d6dcb4330378d8fMichael J. Spencer    assert(Output.isNothing() && "Invalid output.");
5640ff58e3610f4e12094def69eb2d6dcb4330378d8fMichael J. Spencer  }
5641ff58e3610f4e12094def69eb2d6dcb4330378d8fMichael J. Spencer
5642ff58e3610f4e12094def69eb2d6dcb4330378d8fMichael J. Spencer  if (!Args.hasArg(options::OPT_nostdlib) &&
5643ff58e3610f4e12094def69eb2d6dcb4330378d8fMichael J. Spencer    !Args.hasArg(options::OPT_nostartfiles)) {
5644ff58e3610f4e12094def69eb2d6dcb4330378d8fMichael J. Spencer    CmdArgs.push_back("-defaultlib:libcmt");
5645ff58e3610f4e12094def69eb2d6dcb4330378d8fMichael J. Spencer  }
5646ff58e3610f4e12094def69eb2d6dcb4330378d8fMichael J. Spencer
5647ff58e3610f4e12094def69eb2d6dcb4330378d8fMichael J. Spencer  CmdArgs.push_back("-nologo");
5648ff58e3610f4e12094def69eb2d6dcb4330378d8fMichael J. Spencer
56492008feead855f08500fb01ff43ef5eebee05d1e5Daniel Dunbar  AddLinkerInputs(getToolChain(), Inputs, Args, CmdArgs);
5650ff58e3610f4e12094def69eb2d6dcb4330378d8fMichael J. Spencer
5651ff58e3610f4e12094def69eb2d6dcb4330378d8fMichael J. Spencer  const char *Exec =
56522008feead855f08500fb01ff43ef5eebee05d1e5Daniel Dunbar    Args.MakeArgString(getToolChain().GetProgramPath("link.exe"));
5653ff58e3610f4e12094def69eb2d6dcb4330378d8fMichael J. Spencer  C.addCommand(new Command(JA, *this, Exec, CmdArgs));
5654ff58e3610f4e12094def69eb2d6dcb4330378d8fMichael J. Spencer}
5655