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"
1155fc873017f10f6f566b182b70f6fc22aefa3464Chandler Carruth#include "InputInfo.h"
1255fc873017f10f6f566b182b70f6fc22aefa3464Chandler Carruth#include "SanitizerArgs.h"
1355fc873017f10f6f566b182b70f6fc22aefa3464Chandler Carruth#include "ToolChains.h"
1455fc873017f10f6f566b182b70f6fc22aefa3464Chandler Carruth#include "clang/Basic/ObjCRuntime.h"
150234179282d59e6dfccc8b2da72a9a71bf5b6ac3Kevin Enderby#include "clang/Basic/Version.h"
161d46033f760ba5fd266ce59fe391fac473f04f52Daniel Dunbar#include "clang/Driver/Action.h"
17871adcf4e41285e3f4c3b62eaa1b2e05b60b92daDaniel Dunbar#include "clang/Driver/Arg.h"
18b488c1dac8e53206f07103d794a62a3f5012c0f4Daniel Dunbar#include "clang/Driver/ArgList.h"
1955fc873017f10f6f566b182b70f6fc22aefa3464Chandler Carruth#include "clang/Driver/Compilation.h"
20ee848a73e5f8ffe7511af8652ba811c020d1c7a0Daniel Dunbar#include "clang/Driver/Driver.h"
21ee848a73e5f8ffe7511af8652ba811c020d1c7a0Daniel Dunbar#include "clang/Driver/DriverDiagnostic.h"
22871adcf4e41285e3f4c3b62eaa1b2e05b60b92daDaniel Dunbar#include "clang/Driver/Job.h"
23b488c1dac8e53206f07103d794a62a3f5012c0f4Daniel Dunbar#include "clang/Driver/Option.h"
24265e9ef9f3ef30a97790e6e7bbc3c17d97981ca7Daniel Dunbar#include "clang/Driver/Options.h"
25b488c1dac8e53206f07103d794a62a3f5012c0f4Daniel Dunbar#include "clang/Driver/ToolChain.h"
26871adcf4e41285e3f4c3b62eaa1b2e05b60b92daDaniel Dunbar#include "clang/Driver/Util.h"
27881376467c46c5c6cc16fa6790271c2c22e1d4f1Daniel Dunbar#include "llvm/ADT/SmallString.h"
2855d3f7ae512875a1d6402943c3a619633feb2a18Douglas Gregor#include "llvm/ADT/StringSwitch.h"
295b750fe6189a41937ff2b080a983c95ea273769fDaniel Dunbar#include "llvm/ADT/Twine.h"
3055fc873017f10f6f566b182b70f6fc22aefa3464Chandler Carruth#include "llvm/Support/ErrorHandling.h"
3132bef4edba854303800b3b01cb49a282e5da4f69Michael J. Spencer#include "llvm/Support/FileSystem.h"
3202633b541b04ad5ffc1c70f4c2feeeb13e607057Daniel Dunbar#include "llvm/Support/Format.h"
3303013fa9a0bf1ef4b907f5fec006c8f4000fdd21Michael J. Spencer#include "llvm/Support/Host.h"
3403013fa9a0bf1ef4b907f5fec006c8f4000fdd21Michael J. Spencer#include "llvm/Support/Process.h"
3555fc873017f10f6f566b182b70f6fc22aefa3464Chandler Carruth#include "llvm/Support/raw_ostream.h"
36871adcf4e41285e3f4c3b62eaa1b2e05b60b92daDaniel Dunbar
3747ac7d27c44bd64a7d0fc03d4babc196cf2b8230Daniel Dunbarusing namespace clang::driver;
3847ac7d27c44bd64a7d0fc03d4babc196cf2b8230Daniel Dunbarusing namespace clang::driver::tools;
395f9e272e632e951b1efe824cd16acb4d96077930Chris Lattnerusing namespace clang;
4047ac7d27c44bd64a7d0fc03d4babc196cf2b8230Daniel Dunbar
4188a3d6cf5ebab81614f89ba48a8d89023270637aDaniel Dunbar/// CheckPreprocessingOptions - Perform some validation of preprocessing
4288a3d6cf5ebab81614f89ba48a8d89023270637aDaniel Dunbar/// arguments that is shared with gcc.
4388a3d6cf5ebab81614f89ba48a8d89023270637aDaniel Dunbarstatic void CheckPreprocessingOptions(const Driver &D, const ArgList &Args) {
4488a3d6cf5ebab81614f89ba48a8d89023270637aDaniel Dunbar  if (Arg *A = Args.getLastArg(options::OPT_C, options::OPT_CC))
459ade4ae4fb7ed1fcbd63835d9f8f53052f0657a2Joerg Sonnenberger    if (!Args.hasArg(options::OPT_E) && !D.CCCIsCPP)
465f9e272e632e951b1efe824cd16acb4d96077930Chris Lattner      D.Diag(diag::err_drv_argument_only_allowed_with)
4788a3d6cf5ebab81614f89ba48a8d89023270637aDaniel Dunbar        << A->getAsString(Args) << "-E";
4888a3d6cf5ebab81614f89ba48a8d89023270637aDaniel Dunbar}
4988a3d6cf5ebab81614f89ba48a8d89023270637aDaniel Dunbar
50e2fd66418eca3d70cf6b62087d745d0c5181db69Daniel Dunbar/// CheckCodeGenerationOptions - Perform some validation of code generation
51e2fd66418eca3d70cf6b62087d745d0c5181db69Daniel Dunbar/// arguments that is shared with gcc.
52e2fd66418eca3d70cf6b62087d745d0c5181db69Daniel Dunbarstatic void CheckCodeGenerationOptions(const Driver &D, const ArgList &Args) {
53e2fd66418eca3d70cf6b62087d745d0c5181db69Daniel Dunbar  // In gcc, only ARM checks this, but it seems reasonable to check universally.
54e2fd66418eca3d70cf6b62087d745d0c5181db69Daniel Dunbar  if (Args.hasArg(options::OPT_static))
55e2fd66418eca3d70cf6b62087d745d0c5181db69Daniel Dunbar    if (const Arg *A = Args.getLastArg(options::OPT_dynamic,
56e2fd66418eca3d70cf6b62087d745d0c5181db69Daniel Dunbar                                       options::OPT_mdynamic_no_pic))
575f9e272e632e951b1efe824cd16acb4d96077930Chris Lattner      D.Diag(diag::err_drv_argument_not_allowed_with)
58e2fd66418eca3d70cf6b62087d745d0c5181db69Daniel Dunbar        << A->getAsString(Args) << "-static";
59e2fd66418eca3d70cf6b62087d745d0c5181db69Daniel Dunbar}
60e2fd66418eca3d70cf6b62087d745d0c5181db69Daniel Dunbar
613edbeb78fe5ea7fffea7a94575478cde19e830e0Chris Lattner// Quote target names for inclusion in GNU Make dependency files.
623edbeb78fe5ea7fffea7a94575478cde19e830e0Chris Lattner// Only the characters '$', '#', ' ', '\t' are quoted.
635f9e272e632e951b1efe824cd16acb4d96077930Chris Lattnerstatic void QuoteTarget(StringRef Target,
645f9e272e632e951b1efe824cd16acb4d96077930Chris Lattner                        SmallVectorImpl<char> &Res) {
653edbeb78fe5ea7fffea7a94575478cde19e830e0Chris Lattner  for (unsigned i = 0, e = Target.size(); i != e; ++i) {
663edbeb78fe5ea7fffea7a94575478cde19e830e0Chris Lattner    switch (Target[i]) {
673edbeb78fe5ea7fffea7a94575478cde19e830e0Chris Lattner    case ' ':
683edbeb78fe5ea7fffea7a94575478cde19e830e0Chris Lattner    case '\t':
693edbeb78fe5ea7fffea7a94575478cde19e830e0Chris Lattner      // Escape the preceding backslashes
703edbeb78fe5ea7fffea7a94575478cde19e830e0Chris Lattner      for (int j = i - 1; j >= 0 && Target[j] == '\\'; --j)
713edbeb78fe5ea7fffea7a94575478cde19e830e0Chris Lattner        Res.push_back('\\');
723edbeb78fe5ea7fffea7a94575478cde19e830e0Chris Lattner
733edbeb78fe5ea7fffea7a94575478cde19e830e0Chris Lattner      // Escape the space/tab
743edbeb78fe5ea7fffea7a94575478cde19e830e0Chris Lattner      Res.push_back('\\');
753edbeb78fe5ea7fffea7a94575478cde19e830e0Chris Lattner      break;
763edbeb78fe5ea7fffea7a94575478cde19e830e0Chris Lattner    case '$':
773edbeb78fe5ea7fffea7a94575478cde19e830e0Chris Lattner      Res.push_back('$');
783edbeb78fe5ea7fffea7a94575478cde19e830e0Chris Lattner      break;
793edbeb78fe5ea7fffea7a94575478cde19e830e0Chris Lattner    case '#':
803edbeb78fe5ea7fffea7a94575478cde19e830e0Chris Lattner      Res.push_back('\\');
813edbeb78fe5ea7fffea7a94575478cde19e830e0Chris Lattner      break;
823edbeb78fe5ea7fffea7a94575478cde19e830e0Chris Lattner    default:
833edbeb78fe5ea7fffea7a94575478cde19e830e0Chris Lattner      break;
843edbeb78fe5ea7fffea7a94575478cde19e830e0Chris Lattner    }
853edbeb78fe5ea7fffea7a94575478cde19e830e0Chris Lattner
863edbeb78fe5ea7fffea7a94575478cde19e830e0Chris Lattner    Res.push_back(Target[i]);
873edbeb78fe5ea7fffea7a94575478cde19e830e0Chris Lattner  }
883edbeb78fe5ea7fffea7a94575478cde19e830e0Chris Lattner}
893edbeb78fe5ea7fffea7a94575478cde19e830e0Chris Lattner
903d7171582b026e043916fc5d65a7d7aada547206Bill Wendlingstatic void addDirectoryList(const ArgList &Args,
91bdb8f3ce95e3e5c43497292fd05764faa6ad46b1Bill Wendling                             ArgStringList &CmdArgs,
92bdb8f3ce95e3e5c43497292fd05764faa6ad46b1Bill Wendling                             const char *ArgName,
933d7171582b026e043916fc5d65a7d7aada547206Bill Wendling                             const char *EnvVar) {
943d7171582b026e043916fc5d65a7d7aada547206Bill Wendling  const char *DirList = ::getenv(EnvVar);
9589aa2ce6d6de2b9200171bd3ecc97fe917f73d62Chad Rosier  bool CombinedArg = false;
9689aa2ce6d6de2b9200171bd3ecc97fe917f73d62Chad Rosier
97bdb8f3ce95e3e5c43497292fd05764faa6ad46b1Bill Wendling  if (!DirList)
98bdb8f3ce95e3e5c43497292fd05764faa6ad46b1Bill Wendling    return; // Nothing to do.
99bdb8f3ce95e3e5c43497292fd05764faa6ad46b1Bill Wendling
10089aa2ce6d6de2b9200171bd3ecc97fe917f73d62Chad Rosier  StringRef Name(ArgName);
10189aa2ce6d6de2b9200171bd3ecc97fe917f73d62Chad Rosier  if (Name.equals("-I") || Name.equals("-L"))
10289aa2ce6d6de2b9200171bd3ecc97fe917f73d62Chad Rosier    CombinedArg = true;
10389aa2ce6d6de2b9200171bd3ecc97fe917f73d62Chad Rosier
104bdb8f3ce95e3e5c43497292fd05764faa6ad46b1Bill Wendling  StringRef Dirs(DirList);
105bdb8f3ce95e3e5c43497292fd05764faa6ad46b1Bill Wendling  if (Dirs.empty()) // Empty string should not add '.'.
106bdb8f3ce95e3e5c43497292fd05764faa6ad46b1Bill Wendling    return;
107bdb8f3ce95e3e5c43497292fd05764faa6ad46b1Bill Wendling
108bdb8f3ce95e3e5c43497292fd05764faa6ad46b1Bill Wendling  StringRef::size_type Delim;
109bdb8f3ce95e3e5c43497292fd05764faa6ad46b1Bill Wendling  while ((Delim = Dirs.find(llvm::sys::PathSeparator)) != StringRef::npos) {
110bdb8f3ce95e3e5c43497292fd05764faa6ad46b1Bill Wendling    if (Delim == 0) { // Leading colon.
11189aa2ce6d6de2b9200171bd3ecc97fe917f73d62Chad Rosier      if (CombinedArg) {
11289aa2ce6d6de2b9200171bd3ecc97fe917f73d62Chad Rosier        CmdArgs.push_back(Args.MakeArgString(std::string(ArgName) + "."));
11389aa2ce6d6de2b9200171bd3ecc97fe917f73d62Chad Rosier      } else {
11489aa2ce6d6de2b9200171bd3ecc97fe917f73d62Chad Rosier        CmdArgs.push_back(ArgName);
11589aa2ce6d6de2b9200171bd3ecc97fe917f73d62Chad Rosier        CmdArgs.push_back(".");
11689aa2ce6d6de2b9200171bd3ecc97fe917f73d62Chad Rosier      }
117bdb8f3ce95e3e5c43497292fd05764faa6ad46b1Bill Wendling    } else {
11889aa2ce6d6de2b9200171bd3ecc97fe917f73d62Chad Rosier      if (CombinedArg) {
11989aa2ce6d6de2b9200171bd3ecc97fe917f73d62Chad Rosier        CmdArgs.push_back(Args.MakeArgString(std::string(ArgName) + Dirs.substr(0, Delim)));
12089aa2ce6d6de2b9200171bd3ecc97fe917f73d62Chad Rosier      } else {
12189aa2ce6d6de2b9200171bd3ecc97fe917f73d62Chad Rosier        CmdArgs.push_back(ArgName);
12289aa2ce6d6de2b9200171bd3ecc97fe917f73d62Chad Rosier        CmdArgs.push_back(Args.MakeArgString(Dirs.substr(0, Delim)));
12389aa2ce6d6de2b9200171bd3ecc97fe917f73d62Chad Rosier      }
124bdb8f3ce95e3e5c43497292fd05764faa6ad46b1Bill Wendling    }
12509c5c39590caa92aa7ce660607a070ea275f5ad7Nico Weber    Dirs = Dirs.substr(Delim + 1);
126bdb8f3ce95e3e5c43497292fd05764faa6ad46b1Bill Wendling  }
127bdb8f3ce95e3e5c43497292fd05764faa6ad46b1Bill Wendling
128bdb8f3ce95e3e5c43497292fd05764faa6ad46b1Bill Wendling  if (Dirs.empty()) { // Trailing colon.
12989aa2ce6d6de2b9200171bd3ecc97fe917f73d62Chad Rosier    if (CombinedArg) {
13089aa2ce6d6de2b9200171bd3ecc97fe917f73d62Chad Rosier      CmdArgs.push_back(Args.MakeArgString(std::string(ArgName) + "."));
13189aa2ce6d6de2b9200171bd3ecc97fe917f73d62Chad Rosier    } else {
13289aa2ce6d6de2b9200171bd3ecc97fe917f73d62Chad Rosier      CmdArgs.push_back(ArgName);
13389aa2ce6d6de2b9200171bd3ecc97fe917f73d62Chad Rosier      CmdArgs.push_back(".");
13489aa2ce6d6de2b9200171bd3ecc97fe917f73d62Chad Rosier    }
135bdb8f3ce95e3e5c43497292fd05764faa6ad46b1Bill Wendling  } else { // Add the last path.
13689aa2ce6d6de2b9200171bd3ecc97fe917f73d62Chad Rosier    if (CombinedArg) {
13789aa2ce6d6de2b9200171bd3ecc97fe917f73d62Chad Rosier      CmdArgs.push_back(Args.MakeArgString(std::string(ArgName) + Dirs));
13889aa2ce6d6de2b9200171bd3ecc97fe917f73d62Chad Rosier    } else {
13989aa2ce6d6de2b9200171bd3ecc97fe917f73d62Chad Rosier      CmdArgs.push_back(ArgName);
14089aa2ce6d6de2b9200171bd3ecc97fe917f73d62Chad Rosier      CmdArgs.push_back(Args.MakeArgString(Dirs));
14189aa2ce6d6de2b9200171bd3ecc97fe917f73d62Chad Rosier    }
142bdb8f3ce95e3e5c43497292fd05764faa6ad46b1Bill Wendling  }
143bdb8f3ce95e3e5c43497292fd05764faa6ad46b1Bill Wendling}
144bdb8f3ce95e3e5c43497292fd05764faa6ad46b1Bill Wendling
1452008feead855f08500fb01ff43ef5eebee05d1e5Daniel Dunbarstatic void AddLinkerInputs(const ToolChain &TC,
1462008feead855f08500fb01ff43ef5eebee05d1e5Daniel Dunbar                            const InputInfoList &Inputs, const ArgList &Args,
1472008feead855f08500fb01ff43ef5eebee05d1e5Daniel Dunbar                            ArgStringList &CmdArgs) {
1482008feead855f08500fb01ff43ef5eebee05d1e5Daniel Dunbar  const Driver &D = TC.getDriver();
1492008feead855f08500fb01ff43ef5eebee05d1e5Daniel Dunbar
1508ac38d7b5d88d12f454a7cda1275bf429813151dDaniel Dunbar  // Add extra linker input arguments which are not treated as inputs
1518ac38d7b5d88d12f454a7cda1275bf429813151dDaniel Dunbar  // (constructed via -Xarch_).
1528ac38d7b5d88d12f454a7cda1275bf429813151dDaniel Dunbar  Args.AddAllArgValues(CmdArgs, options::OPT_Zlinker_input);
1538ac38d7b5d88d12f454a7cda1275bf429813151dDaniel Dunbar
1542008feead855f08500fb01ff43ef5eebee05d1e5Daniel Dunbar  for (InputInfoList::const_iterator
1552008feead855f08500fb01ff43ef5eebee05d1e5Daniel Dunbar         it = Inputs.begin(), ie = Inputs.end(); it != ie; ++it) {
1562008feead855f08500fb01ff43ef5eebee05d1e5Daniel Dunbar    const InputInfo &II = *it;
1572008feead855f08500fb01ff43ef5eebee05d1e5Daniel Dunbar
1582008feead855f08500fb01ff43ef5eebee05d1e5Daniel Dunbar    if (!TC.HasNativeLLVMSupport()) {
1592008feead855f08500fb01ff43ef5eebee05d1e5Daniel Dunbar      // Don't try to pass LLVM inputs unless we have native support.
1602008feead855f08500fb01ff43ef5eebee05d1e5Daniel Dunbar      if (II.getType() == types::TY_LLVM_IR ||
1612008feead855f08500fb01ff43ef5eebee05d1e5Daniel Dunbar          II.getType() == types::TY_LTO_IR ||
1622008feead855f08500fb01ff43ef5eebee05d1e5Daniel Dunbar          II.getType() == types::TY_LLVM_BC ||
1632008feead855f08500fb01ff43ef5eebee05d1e5Daniel Dunbar          II.getType() == types::TY_LTO_BC)
1645f9e272e632e951b1efe824cd16acb4d96077930Chris Lattner        D.Diag(diag::err_drv_no_linker_llvm_support)
1652008feead855f08500fb01ff43ef5eebee05d1e5Daniel Dunbar          << TC.getTripleString();
1662008feead855f08500fb01ff43ef5eebee05d1e5Daniel Dunbar    }
1672008feead855f08500fb01ff43ef5eebee05d1e5Daniel Dunbar
168e5a37f48388c7e4cc081f44d13a4910bfa56cd35Daniel Dunbar    // Add filenames immediately.
169e5a37f48388c7e4cc081f44d13a4910bfa56cd35Daniel Dunbar    if (II.isFilename()) {
1702008feead855f08500fb01ff43ef5eebee05d1e5Daniel Dunbar      CmdArgs.push_back(II.getFilename());
171e5a37f48388c7e4cc081f44d13a4910bfa56cd35Daniel Dunbar      continue;
172e5a37f48388c7e4cc081f44d13a4910bfa56cd35Daniel Dunbar    }
173e5a37f48388c7e4cc081f44d13a4910bfa56cd35Daniel Dunbar
174e5a37f48388c7e4cc081f44d13a4910bfa56cd35Daniel Dunbar    // Otherwise, this is a linker input argument.
175e5a37f48388c7e4cc081f44d13a4910bfa56cd35Daniel Dunbar    const Arg &A = II.getInputArg();
176e5a37f48388c7e4cc081f44d13a4910bfa56cd35Daniel Dunbar
177e5a37f48388c7e4cc081f44d13a4910bfa56cd35Daniel Dunbar    // Handle reserved library options.
178e5a37f48388c7e4cc081f44d13a4910bfa56cd35Daniel Dunbar    if (A.getOption().matches(options::OPT_Z_reserved_lib_stdcxx)) {
179132e35d2f87895d20e7ea146c8c00404b80221a1Daniel Dunbar      TC.AddCXXStdlibLibArgs(Args, CmdArgs);
1807433fedce98a58341d0f30c2e12e8d53f3bba575Shantonu Sen    } else if (A.getOption().matches(options::OPT_Z_reserved_lib_cckext)) {
1817433fedce98a58341d0f30c2e12e8d53f3bba575Shantonu Sen      TC.AddCCKextLibArgs(Args, CmdArgs);
182e5a37f48388c7e4cc081f44d13a4910bfa56cd35Daniel Dunbar    } else
183e5a37f48388c7e4cc081f44d13a4910bfa56cd35Daniel Dunbar      A.renderAsInput(Args, CmdArgs);
1842008feead855f08500fb01ff43ef5eebee05d1e5Daniel Dunbar  }
185bdb8f3ce95e3e5c43497292fd05764faa6ad46b1Bill Wendling
186bdb8f3ce95e3e5c43497292fd05764faa6ad46b1Bill Wendling  // LIBRARY_PATH - included following the user specified library paths.
1873d7171582b026e043916fc5d65a7d7aada547206Bill Wendling  addDirectoryList(Args, CmdArgs, "-L", "LIBRARY_PATH");
1882008feead855f08500fb01ff43ef5eebee05d1e5Daniel Dunbar}
1892008feead855f08500fb01ff43ef5eebee05d1e5Daniel Dunbar
190f85e193739c953358c865005855253af4f68a497John McCall/// \brief Determine whether Objective-C automated reference counting is
191f85e193739c953358c865005855253af4f68a497John McCall/// enabled.
192f85e193739c953358c865005855253af4f68a497John McCallstatic bool isObjCAutoRefCount(const ArgList &Args) {
193f85e193739c953358c865005855253af4f68a497John McCall  return Args.hasFlag(options::OPT_fobjc_arc, options::OPT_fno_objc_arc, false);
194f85e193739c953358c865005855253af4f68a497John McCall}
195f85e193739c953358c865005855253af4f68a497John McCall
196ebcb57a8d298862c65043e88b2429591ab3c58d3Ted Kremenek/// \brief Determine whether we are linking the ObjC runtime.
197ebcb57a8d298862c65043e88b2429591ab3c58d3Ted Kremenekstatic bool isObjCRuntimeLinked(const ArgList &Args) {
198a7635f115ed4fdc5f7982989d67743105dd530cfBob Wilson  if (isObjCAutoRefCount(Args)) {
199a7635f115ed4fdc5f7982989d67743105dd530cfBob Wilson    Args.ClaimAllArgs(options::OPT_fobjc_link_runtime);
200ebcb57a8d298862c65043e88b2429591ab3c58d3Ted Kremenek    return true;
201a7635f115ed4fdc5f7982989d67743105dd530cfBob Wilson  }
202ebcb57a8d298862c65043e88b2429591ab3c58d3Ted Kremenek  return Args.hasArg(options::OPT_fobjc_link_runtime);
203ebcb57a8d298862c65043e88b2429591ab3c58d3Ted Kremenek}
204ebcb57a8d298862c65043e88b2429591ab3c58d3Ted Kremenek
205db3f24ac0dafad175e9daef1b8733600194f56e0Rafael Espindolastatic void addProfileRT(const ToolChain &TC, const ArgList &Args,
2063f4be6fb8872942f567166ab8d99c89885f26103Bill Wendling                         ArgStringList &CmdArgs,
2073f4be6fb8872942f567166ab8d99c89885f26103Bill Wendling                         llvm::Triple Triple) {
2083f4be6fb8872942f567166ab8d99c89885f26103Bill Wendling  if (!(Args.hasArg(options::OPT_fprofile_arcs) ||
2093f4be6fb8872942f567166ab8d99c89885f26103Bill Wendling        Args.hasArg(options::OPT_fprofile_generate) ||
2103f4be6fb8872942f567166ab8d99c89885f26103Bill Wendling        Args.hasArg(options::OPT_fcreate_profile) ||
2113f4be6fb8872942f567166ab8d99c89885f26103Bill Wendling        Args.hasArg(options::OPT_coverage)))
2123f4be6fb8872942f567166ab8d99c89885f26103Bill Wendling    return;
2133f4be6fb8872942f567166ab8d99c89885f26103Bill Wendling
2143f4be6fb8872942f567166ab8d99c89885f26103Bill Wendling  // GCC links libgcov.a by adding -L<inst>/gcc/lib/gcc/<triple>/<ver> -lgcov to
2153f4be6fb8872942f567166ab8d99c89885f26103Bill Wendling  // the link line. We cannot do the same thing because unlike gcov there is a
2163f4be6fb8872942f567166ab8d99c89885f26103Bill Wendling  // libprofile_rt.so. We used to use the -l:libprofile_rt.a syntax, but that is
2173f4be6fb8872942f567166ab8d99c89885f26103Bill Wendling  // not supported by old linkers.
218f2db04c49429a6d53069b813d42999fa36ddd9a4Benjamin Kramer  std::string ProfileRT =
219f2db04c49429a6d53069b813d42999fa36ddd9a4Benjamin Kramer    std::string(TC.getDriver().Dir) + "/../lib/libprofile_rt.a";
2203f4be6fb8872942f567166ab8d99c89885f26103Bill Wendling
2213f4be6fb8872942f567166ab8d99c89885f26103Bill Wendling  CmdArgs.push_back(Args.MakeArgString(ProfileRT));
222db3f24ac0dafad175e9daef1b8733600194f56e0Rafael Espindola}
223db3f24ac0dafad175e9daef1b8733600194f56e0Rafael Espindola
22491e06dab9335ed6b4474a74353549c708cf3d936Michael J. Spencerstatic bool forwardToGCC(const Option &O) {
22591e06dab9335ed6b4474a74353549c708cf3d936Michael J. Spencer  return !O.hasFlag(options::NoForward) &&
22691e06dab9335ed6b4474a74353549c708cf3d936Michael J. Spencer         !O.hasFlag(options::DriverOption) &&
22791e06dab9335ed6b4474a74353549c708cf3d936Michael J. Spencer         !O.hasFlag(options::LinkerInput);
22891e06dab9335ed6b4474a74353549c708cf3d936Michael J. Spencer}
22991e06dab9335ed6b4474a74353549c708cf3d936Michael J. Spencer
23054db68bf0e389b8aabe1a434f825a81a9c1f7db8Peter Collingbournevoid Clang::AddPreprocessingOptions(Compilation &C,
2319d718635fa805674aaba5d938f3dc6b35b8632baChad Rosier                                    const JobAction &JA,
23254db68bf0e389b8aabe1a434f825a81a9c1f7db8Peter Collingbourne                                    const Driver &D,
233df91ef3d6c55692a0236f67b6c6b134a3bf84098Douglas Gregor                                    const ArgList &Args,
234c21c485b4fb58ef5d55cf3e523263dd824a2ace4Daniel Dunbar                                    ArgStringList &CmdArgs,
235c21c485b4fb58ef5d55cf3e523263dd824a2ace4Daniel Dunbar                                    const InputInfo &Output,
236c21c485b4fb58ef5d55cf3e523263dd824a2ace4Daniel Dunbar                                    const InputInfoList &Inputs) const {
237c21c485b4fb58ef5d55cf3e523263dd824a2ace4Daniel Dunbar  Arg *A;
2383a183d3d46426d8719031553131b8928f50aa606Daniel Dunbar
23988a3d6cf5ebab81614f89ba48a8d89023270637aDaniel Dunbar  CheckPreprocessingOptions(D, Args);
24088a3d6cf5ebab81614f89ba48a8d89023270637aDaniel Dunbar
24188a3d6cf5ebab81614f89ba48a8d89023270637aDaniel Dunbar  Args.AddLastArg(CmdArgs, options::OPT_C);
24288a3d6cf5ebab81614f89ba48a8d89023270637aDaniel Dunbar  Args.AddLastArg(CmdArgs, options::OPT_CC);
2433a183d3d46426d8719031553131b8928f50aa606Daniel Dunbar
2443a183d3d46426d8719031553131b8928f50aa606Daniel Dunbar  // Handle dependency file generation.
2459eb93b07ea913e7ad0bcd15bd3e3662e2760c323Daniel Dunbar  if ((A = Args.getLastArg(options::OPT_M, options::OPT_MM)) ||
246c21c485b4fb58ef5d55cf3e523263dd824a2ace4Daniel Dunbar      (A = Args.getLastArg(options::OPT_MD)) ||
247c21c485b4fb58ef5d55cf3e523263dd824a2ace4Daniel Dunbar      (A = Args.getLastArg(options::OPT_MMD))) {
248c21c485b4fb58ef5d55cf3e523263dd824a2ace4Daniel Dunbar    // Determine the output location.
249c21c485b4fb58ef5d55cf3e523263dd824a2ace4Daniel Dunbar    const char *DepFile;
25099c720828a2fcaf368c6a0f2502189d10dbd5c53Benjamin Kramer    if (Arg *MF = Args.getLastArg(options::OPT_MF)) {
2511d489cf4a04ad0ad8ac2696e4eed0995f3a67288Richard Smith      DepFile = MF->getValue();
2529d718635fa805674aaba5d938f3dc6b35b8632baChad Rosier      C.addFailureResultFile(DepFile, &JA);
25399c720828a2fcaf368c6a0f2502189d10dbd5c53Benjamin Kramer    } else if (Output.getType() == types::TY_Dependencies) {
25499c720828a2fcaf368c6a0f2502189d10dbd5c53Benjamin Kramer      DepFile = Output.getFilename();
255b827a0541b5fd095fcdb7ad0c3df93ca158c619aDaniel Dunbar    } else if (A->getOption().matches(options::OPT_M) ||
256b827a0541b5fd095fcdb7ad0c3df93ca158c619aDaniel Dunbar               A->getOption().matches(options::OPT_MM)) {
257c21c485b4fb58ef5d55cf3e523263dd824a2ace4Daniel Dunbar      DepFile = "-";
258c21c485b4fb58ef5d55cf3e523263dd824a2ace4Daniel Dunbar    } else {
25966b8a6671bb5df540dd7200a5286f7ed7a72c1ccBob Wilson      DepFile = getDependencyFileName(Args, Inputs);
2609d718635fa805674aaba5d938f3dc6b35b8632baChad Rosier      C.addFailureResultFile(DepFile, &JA);
261c21c485b4fb58ef5d55cf3e523263dd824a2ace4Daniel Dunbar    }
262c21c485b4fb58ef5d55cf3e523263dd824a2ace4Daniel Dunbar    CmdArgs.push_back("-dependency-file");
263c21c485b4fb58ef5d55cf3e523263dd824a2ace4Daniel Dunbar    CmdArgs.push_back(DepFile);
264c21c485b4fb58ef5d55cf3e523263dd824a2ace4Daniel Dunbar
2653edbeb78fe5ea7fffea7a94575478cde19e830e0Chris Lattner    // Add a default target if one wasn't specified.
266c21c485b4fb58ef5d55cf3e523263dd824a2ace4Daniel Dunbar    if (!Args.hasArg(options::OPT_MT) && !Args.hasArg(options::OPT_MQ)) {
267c21c485b4fb58ef5d55cf3e523263dd824a2ace4Daniel Dunbar      const char *DepTarget;
268c21c485b4fb58ef5d55cf3e523263dd824a2ace4Daniel Dunbar
269c21c485b4fb58ef5d55cf3e523263dd824a2ace4Daniel Dunbar      // If user provided -o, that is the dependency target, except
270c21c485b4fb58ef5d55cf3e523263dd824a2ace4Daniel Dunbar      // when we are only generating a dependency file.
271c21c485b4fb58ef5d55cf3e523263dd824a2ace4Daniel Dunbar      Arg *OutputOpt = Args.getLastArg(options::OPT_o);
272c21c485b4fb58ef5d55cf3e523263dd824a2ace4Daniel Dunbar      if (OutputOpt && Output.getType() != types::TY_Dependencies) {
2731d489cf4a04ad0ad8ac2696e4eed0995f3a67288Richard Smith        DepTarget = OutputOpt->getValue();
274c21c485b4fb58ef5d55cf3e523263dd824a2ace4Daniel Dunbar      } else {
275c21c485b4fb58ef5d55cf3e523263dd824a2ace4Daniel Dunbar        // Otherwise derive from the base input.
276c21c485b4fb58ef5d55cf3e523263dd824a2ace4Daniel Dunbar        //
277c21c485b4fb58ef5d55cf3e523263dd824a2ace4Daniel Dunbar        // FIXME: This should use the computed output file location.
278f7ccbad5d9949e7ddd1cbef43d482553b811e026Dylan Noblesmith        SmallString<128> P(Inputs[0].getBaseInput());
279472ccff00cdbcd095c3ba933b9e3f202719f118fMichael J. Spencer        llvm::sys::path::replace_extension(P, "o");
280472ccff00cdbcd095c3ba933b9e3f202719f118fMichael J. Spencer        DepTarget = Args.MakeArgString(llvm::sys::path::filename(P));
281c21c485b4fb58ef5d55cf3e523263dd824a2ace4Daniel Dunbar      }
282c21c485b4fb58ef5d55cf3e523263dd824a2ace4Daniel Dunbar
283c21c485b4fb58ef5d55cf3e523263dd824a2ace4Daniel Dunbar      CmdArgs.push_back("-MT");
284f7ccbad5d9949e7ddd1cbef43d482553b811e026Dylan Noblesmith      SmallString<128> Quoted;
2853edbeb78fe5ea7fffea7a94575478cde19e830e0Chris Lattner      QuoteTarget(DepTarget, Quoted);
2863edbeb78fe5ea7fffea7a94575478cde19e830e0Chris Lattner      CmdArgs.push_back(Args.MakeArgString(Quoted));
287c21c485b4fb58ef5d55cf3e523263dd824a2ace4Daniel Dunbar    }
288c21c485b4fb58ef5d55cf3e523263dd824a2ace4Daniel Dunbar
289b827a0541b5fd095fcdb7ad0c3df93ca158c619aDaniel Dunbar    if (A->getOption().matches(options::OPT_M) ||
290b827a0541b5fd095fcdb7ad0c3df93ca158c619aDaniel Dunbar        A->getOption().matches(options::OPT_MD))
291c21c485b4fb58ef5d55cf3e523263dd824a2ace4Daniel Dunbar      CmdArgs.push_back("-sys-header-deps");
292c21c485b4fb58ef5d55cf3e523263dd824a2ace4Daniel Dunbar  }
293c21c485b4fb58ef5d55cf3e523263dd824a2ace4Daniel Dunbar
294bb52786da8d055568eef6e5694288c1258bc8c2aPeter Collingbourne  if (Args.hasArg(options::OPT_MG)) {
295bb52786da8d055568eef6e5694288c1258bc8c2aPeter Collingbourne    if (!A || A->getOption().matches(options::OPT_MD) ||
296bb52786da8d055568eef6e5694288c1258bc8c2aPeter Collingbourne              A->getOption().matches(options::OPT_MMD))
2975f9e272e632e951b1efe824cd16acb4d96077930Chris Lattner      D.Diag(diag::err_drv_mg_requires_m_or_mm);
298bb52786da8d055568eef6e5694288c1258bc8c2aPeter Collingbourne    CmdArgs.push_back("-MG");
299bb52786da8d055568eef6e5694288c1258bc8c2aPeter Collingbourne  }
300bb52786da8d055568eef6e5694288c1258bc8c2aPeter Collingbourne
301c21c485b4fb58ef5d55cf3e523263dd824a2ace4Daniel Dunbar  Args.AddLastArg(CmdArgs, options::OPT_MP);
3023edbeb78fe5ea7fffea7a94575478cde19e830e0Chris Lattner
3033edbeb78fe5ea7fffea7a94575478cde19e830e0Chris Lattner  // Convert all -MQ <target> args to -MT <quoted target>
3043edbeb78fe5ea7fffea7a94575478cde19e830e0Chris Lattner  for (arg_iterator it = Args.filtered_begin(options::OPT_MT,
3053edbeb78fe5ea7fffea7a94575478cde19e830e0Chris Lattner                                             options::OPT_MQ),
3063edbeb78fe5ea7fffea7a94575478cde19e830e0Chris Lattner         ie = Args.filtered_end(); it != ie; ++it) {
3077e4953e5c60409007545288f14b430bd23d68570Daniel Dunbar    const Arg *A = *it;
3087e4953e5c60409007545288f14b430bd23d68570Daniel Dunbar    A->claim();
3093edbeb78fe5ea7fffea7a94575478cde19e830e0Chris Lattner
3107e4953e5c60409007545288f14b430bd23d68570Daniel Dunbar    if (A->getOption().matches(options::OPT_MQ)) {
3113edbeb78fe5ea7fffea7a94575478cde19e830e0Chris Lattner      CmdArgs.push_back("-MT");
312f7ccbad5d9949e7ddd1cbef43d482553b811e026Dylan Noblesmith      SmallString<128> Quoted;
3131d489cf4a04ad0ad8ac2696e4eed0995f3a67288Richard Smith      QuoteTarget(A->getValue(), Quoted);
3143edbeb78fe5ea7fffea7a94575478cde19e830e0Chris Lattner      CmdArgs.push_back(Args.MakeArgString(Quoted));
3153edbeb78fe5ea7fffea7a94575478cde19e830e0Chris Lattner
3163edbeb78fe5ea7fffea7a94575478cde19e830e0Chris Lattner    // -MT flag - no change
3173edbeb78fe5ea7fffea7a94575478cde19e830e0Chris Lattner    } else {
3187e4953e5c60409007545288f14b430bd23d68570Daniel Dunbar      A->render(Args, CmdArgs);
3193edbeb78fe5ea7fffea7a94575478cde19e830e0Chris Lattner    }
3203edbeb78fe5ea7fffea7a94575478cde19e830e0Chris Lattner  }
321c21c485b4fb58ef5d55cf3e523263dd824a2ace4Daniel Dunbar
322df91ef3d6c55692a0236f67b6c6b134a3bf84098Douglas Gregor  // Add -i* options, and automatically translate to
323df91ef3d6c55692a0236f67b6c6b134a3bf84098Douglas Gregor  // -include-pch/-include-pth for transparent PCH support. It's
324df91ef3d6c55692a0236f67b6c6b134a3bf84098Douglas Gregor  // wonky, but we include looking for .gch so we can support seamless
325df91ef3d6c55692a0236f67b6c6b134a3bf84098Douglas Gregor  // replacement into a build system already set up to be generating
326df91ef3d6c55692a0236f67b6c6b134a3bf84098Douglas Gregor  // .gch files.
327990142a23e41392ef7c0f14db4c0fcac67311cdfArgyrios Kyrtzidis  bool RenderedImplicitInclude = false;
328cdd9686b890ebdc10039ae256ef4c9dfb5ebacb7Daniel Dunbar  for (arg_iterator it = Args.filtered_begin(options::OPT_clang_i_Group),
329cdd9686b890ebdc10039ae256ef4c9dfb5ebacb7Daniel Dunbar         ie = Args.filtered_end(); it != ie; ++it) {
330cdd9686b890ebdc10039ae256ef4c9dfb5ebacb7Daniel Dunbar    const Arg *A = it;
331c21c485b4fb58ef5d55cf3e523263dd824a2ace4Daniel Dunbar
332c21c485b4fb58ef5d55cf3e523263dd824a2ace4Daniel Dunbar    if (A->getOption().matches(options::OPT_include)) {
333990142a23e41392ef7c0f14db4c0fcac67311cdfArgyrios Kyrtzidis      bool IsFirstImplicitInclude = !RenderedImplicitInclude;
334990142a23e41392ef7c0f14db4c0fcac67311cdfArgyrios Kyrtzidis      RenderedImplicitInclude = true;
335990142a23e41392ef7c0f14db4c0fcac67311cdfArgyrios Kyrtzidis
336e5c35377020d6c38d16434c9f373a5fa9bb4f2ebArgyrios Kyrtzidis      // Use PCH if the user requested it.
3370ebd9321ba380471010341f24c874f46f56e7581Daniel Dunbar      bool UsePCH = D.CCCUsePCH;
3380ebd9321ba380471010341f24c874f46f56e7581Daniel Dunbar
339c21c485b4fb58ef5d55cf3e523263dd824a2ace4Daniel Dunbar      bool FoundPTH = false;
340df91ef3d6c55692a0236f67b6c6b134a3bf84098Douglas Gregor      bool FoundPCH = false;
3411d489cf4a04ad0ad8ac2696e4eed0995f3a67288Richard Smith      llvm::sys::Path P(A->getValue());
34232bef4edba854303800b3b01cb49a282e5da4f69Michael J. Spencer      bool Exists;
3430ebd9321ba380471010341f24c874f46f56e7581Daniel Dunbar      if (UsePCH) {
344df91ef3d6c55692a0236f67b6c6b134a3bf84098Douglas Gregor        P.appendSuffix("pch");
34532bef4edba854303800b3b01cb49a282e5da4f69Michael J. Spencer        if (!llvm::sys::fs::exists(P.str(), Exists) && Exists)
346df91ef3d6c55692a0236f67b6c6b134a3bf84098Douglas Gregor          FoundPCH = true;
3471eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump        else
348df91ef3d6c55692a0236f67b6c6b134a3bf84098Douglas Gregor          P.eraseSuffix();
349df91ef3d6c55692a0236f67b6c6b134a3bf84098Douglas Gregor      }
350df91ef3d6c55692a0236f67b6c6b134a3bf84098Douglas Gregor
351df91ef3d6c55692a0236f67b6c6b134a3bf84098Douglas Gregor      if (!FoundPCH) {
352df91ef3d6c55692a0236f67b6c6b134a3bf84098Douglas Gregor        P.appendSuffix("pth");
35332bef4edba854303800b3b01cb49a282e5da4f69Michael J. Spencer        if (!llvm::sys::fs::exists(P.str(), Exists) && Exists)
354c21c485b4fb58ef5d55cf3e523263dd824a2ace4Daniel Dunbar          FoundPTH = true;
355df91ef3d6c55692a0236f67b6c6b134a3bf84098Douglas Gregor        else
356df91ef3d6c55692a0236f67b6c6b134a3bf84098Douglas Gregor          P.eraseSuffix();
3571eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump      }
3581eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump
359df91ef3d6c55692a0236f67b6c6b134a3bf84098Douglas Gregor      if (!FoundPCH && !FoundPTH) {
360df91ef3d6c55692a0236f67b6c6b134a3bf84098Douglas Gregor        P.appendSuffix("gch");
36132bef4edba854303800b3b01cb49a282e5da4f69Michael J. Spencer        if (!llvm::sys::fs::exists(P.str(), Exists) && Exists) {
3620ebd9321ba380471010341f24c874f46f56e7581Daniel Dunbar          FoundPCH = UsePCH;
3630ebd9321ba380471010341f24c874f46f56e7581Daniel Dunbar          FoundPTH = !UsePCH;
364df91ef3d6c55692a0236f67b6c6b134a3bf84098Douglas Gregor        }
3651eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump        else
366df91ef3d6c55692a0236f67b6c6b134a3bf84098Douglas Gregor          P.eraseSuffix();
367c21c485b4fb58ef5d55cf3e523263dd824a2ace4Daniel Dunbar      }
368c21c485b4fb58ef5d55cf3e523263dd824a2ace4Daniel Dunbar
369df91ef3d6c55692a0236f67b6c6b134a3bf84098Douglas Gregor      if (FoundPCH || FoundPTH) {
370990142a23e41392ef7c0f14db4c0fcac67311cdfArgyrios Kyrtzidis        if (IsFirstImplicitInclude) {
371990142a23e41392ef7c0f14db4c0fcac67311cdfArgyrios Kyrtzidis          A->claim();
372990142a23e41392ef7c0f14db4c0fcac67311cdfArgyrios Kyrtzidis          if (UsePCH)
373990142a23e41392ef7c0f14db4c0fcac67311cdfArgyrios Kyrtzidis            CmdArgs.push_back("-include-pch");
374990142a23e41392ef7c0f14db4c0fcac67311cdfArgyrios Kyrtzidis          else
375990142a23e41392ef7c0f14db4c0fcac67311cdfArgyrios Kyrtzidis            CmdArgs.push_back("-include-pth");
376990142a23e41392ef7c0f14db4c0fcac67311cdfArgyrios Kyrtzidis          CmdArgs.push_back(Args.MakeArgString(P.str()));
377990142a23e41392ef7c0f14db4c0fcac67311cdfArgyrios Kyrtzidis          continue;
378990142a23e41392ef7c0f14db4c0fcac67311cdfArgyrios Kyrtzidis        } else {
379990142a23e41392ef7c0f14db4c0fcac67311cdfArgyrios Kyrtzidis          // Ignore the PCH if not first on command line and emit warning.
3805f9e272e632e951b1efe824cd16acb4d96077930Chris Lattner          D.Diag(diag::warn_drv_pch_not_first_include)
381990142a23e41392ef7c0f14db4c0fcac67311cdfArgyrios Kyrtzidis              << P.str() << A->getAsString(Args);
382990142a23e41392ef7c0f14db4c0fcac67311cdfArgyrios Kyrtzidis        }
383c21c485b4fb58ef5d55cf3e523263dd824a2ace4Daniel Dunbar      }
384c21c485b4fb58ef5d55cf3e523263dd824a2ace4Daniel Dunbar    }
385c21c485b4fb58ef5d55cf3e523263dd824a2ace4Daniel Dunbar
386c21c485b4fb58ef5d55cf3e523263dd824a2ace4Daniel Dunbar    // Not translated, render as usual.
387c21c485b4fb58ef5d55cf3e523263dd824a2ace4Daniel Dunbar    A->claim();
388c21c485b4fb58ef5d55cf3e523263dd824a2ace4Daniel Dunbar    A->render(Args, CmdArgs);
389c21c485b4fb58ef5d55cf3e523263dd824a2ace4Daniel Dunbar  }
390c21c485b4fb58ef5d55cf3e523263dd824a2ace4Daniel Dunbar
391c21c485b4fb58ef5d55cf3e523263dd824a2ace4Daniel Dunbar  Args.AddAllArgs(CmdArgs, options::OPT_D, options::OPT_U);
39265e02fa80e1c185f18e5f81cefc30d75383a7301Douglas Gregor  Args.AddAllArgs(CmdArgs, options::OPT_I_Group, options::OPT_F,
39365e02fa80e1c185f18e5f81cefc30d75383a7301Douglas Gregor                  options::OPT_index_header_map);
394c21c485b4fb58ef5d55cf3e523263dd824a2ace4Daniel Dunbar
395c21c485b4fb58ef5d55cf3e523263dd824a2ace4Daniel Dunbar  // Add -Wp, and -Xassembler if using the preprocessor.
396c21c485b4fb58ef5d55cf3e523263dd824a2ace4Daniel Dunbar
397c21c485b4fb58ef5d55cf3e523263dd824a2ace4Daniel Dunbar  // FIXME: There is a very unfortunate problem here, some troubled
398c21c485b4fb58ef5d55cf3e523263dd824a2ace4Daniel Dunbar  // souls abuse -Wp, to pass preprocessor options in gcc syntax. To
399c21c485b4fb58ef5d55cf3e523263dd824a2ace4Daniel Dunbar  // really support that we would have to parse and then translate
400c21c485b4fb58ef5d55cf3e523263dd824a2ace4Daniel Dunbar  // those options. :(
401c21c485b4fb58ef5d55cf3e523263dd824a2ace4Daniel Dunbar  Args.AddAllArgValues(CmdArgs, options::OPT_Wp_COMMA,
402c21c485b4fb58ef5d55cf3e523263dd824a2ace4Daniel Dunbar                       options::OPT_Xpreprocessor);
403607d7f6d8f21066cc48bbe2c51e6ca412a00943fDaniel Dunbar
404607d7f6d8f21066cc48bbe2c51e6ca412a00943fDaniel Dunbar  // -I- is a deprecated GCC feature, reject it.
405607d7f6d8f21066cc48bbe2c51e6ca412a00943fDaniel Dunbar  if (Arg *A = Args.getLastArg(options::OPT_I_))
4065f9e272e632e951b1efe824cd16acb4d96077930Chris Lattner    D.Diag(diag::err_drv_I_dash_not_supported) << A->getAsString(Args);
407feee58ce268765742e41c473c8648607fd4831a7Chandler Carruth
408feee58ce268765742e41c473c8648607fd4831a7Chandler Carruth  // If we have a --sysroot, and don't have an explicit -isysroot flag, add an
409feee58ce268765742e41c473c8648607fd4831a7Chandler Carruth  // -isysroot to the CC1 invocation.
4104762a2da74875d2ae94e0d77d38ed964816cce36Sebastian Pop  StringRef sysroot = C.getSysRoot();
4114762a2da74875d2ae94e0d77d38ed964816cce36Sebastian Pop  if (sysroot != "") {
412feee58ce268765742e41c473c8648607fd4831a7Chandler Carruth    if (!Args.hasArg(options::OPT_isysroot)) {
413feee58ce268765742e41c473c8648607fd4831a7Chandler Carruth      CmdArgs.push_back("-isysroot");
4144762a2da74875d2ae94e0d77d38ed964816cce36Sebastian Pop      CmdArgs.push_back(C.getArgs().MakeArgString(sysroot));
415feee58ce268765742e41c473c8648607fd4831a7Chandler Carruth    }
416feee58ce268765742e41c473c8648607fd4831a7Chandler Carruth  }
4172a06085281d1b6aee628f85e8676eec04542cbc9Douglas Gregor
41847adebef0df6dce752fe9a45e9190e8005b5d07cBenjamin Kramer  // Parse additional include paths from environment variables.
419b5870e77a9a872e2a84e904a332bb60bbe207da9Chandler Carruth  // FIXME: We should probably sink the logic for handling these from the
420b5870e77a9a872e2a84e904a332bb60bbe207da9Chandler Carruth  // frontend into the driver. It will allow deleting 4 otherwise unused flags.
42147adebef0df6dce752fe9a45e9190e8005b5d07cBenjamin Kramer  // CPATH - included following the user specified includes (but prior to
42247adebef0df6dce752fe9a45e9190e8005b5d07cBenjamin Kramer  // builtin and standard includes).
4233d7171582b026e043916fc5d65a7d7aada547206Bill Wendling  addDirectoryList(Args, CmdArgs, "-I", "CPATH");
42447adebef0df6dce752fe9a45e9190e8005b5d07cBenjamin Kramer  // C_INCLUDE_PATH - system includes enabled when compiling C.
4253d7171582b026e043916fc5d65a7d7aada547206Bill Wendling  addDirectoryList(Args, CmdArgs, "-c-isystem", "C_INCLUDE_PATH");
42647adebef0df6dce752fe9a45e9190e8005b5d07cBenjamin Kramer  // CPLUS_INCLUDE_PATH - system includes enabled when compiling C++.
4273d7171582b026e043916fc5d65a7d7aada547206Bill Wendling  addDirectoryList(Args, CmdArgs, "-cxx-isystem", "CPLUS_INCLUDE_PATH");
42847adebef0df6dce752fe9a45e9190e8005b5d07cBenjamin Kramer  // OBJC_INCLUDE_PATH - system includes enabled when compiling ObjC.
4293d7171582b026e043916fc5d65a7d7aada547206Bill Wendling  addDirectoryList(Args, CmdArgs, "-objc-isystem", "OBJC_INCLUDE_PATH");
43047adebef0df6dce752fe9a45e9190e8005b5d07cBenjamin Kramer  // OBJCPLUS_INCLUDE_PATH - system includes enabled when compiling ObjC++.
4313d7171582b026e043916fc5d65a7d7aada547206Bill Wendling  addDirectoryList(Args, CmdArgs, "-objcxx-isystem", "OBJCPLUS_INCLUDE_PATH");
43288491fc6dfc7ebbd856d57a9acb49fb83077d6c8Chandler Carruth
43388491fc6dfc7ebbd856d57a9acb49fb83077d6c8Chandler Carruth  // Add C++ include arguments, if needed.
434a461442ed99883d2760833592f65e1e95a4889bbChandler Carruth  if (types::isCXX(Inputs[0].getType()))
4357ffa0325bd61f656697f99434334d425c39af309Chandler Carruth    getToolChain().AddClangCXXStdlibIncludeArgs(Args, CmdArgs);
4367d7e9f963a4977e36efb90fd9c369f33ced1a95aChandler Carruth
4377d7e9f963a4977e36efb90fd9c369f33ced1a95aChandler Carruth  // Add system include arguments.
4387d7e9f963a4977e36efb90fd9c369f33ced1a95aChandler Carruth  getToolChain().AddClangSystemIncludeArgs(Args, CmdArgs);
439c21c485b4fb58ef5d55cf3e523263dd824a2ace4Daniel Dunbar}
440c21c485b4fb58ef5d55cf3e523263dd824a2ace4Daniel Dunbar
44192c4fd5c17a5fd433cca7ddecb0ad4a104baa59cBenjamin Kramer/// getLLVMArchSuffixForARM - Get the LLVM arch name to use for a particular
44292c4fd5c17a5fd433cca7ddecb0ad4a104baa59cBenjamin Kramer/// CPU.
44392c4fd5c17a5fd433cca7ddecb0ad4a104baa59cBenjamin Kramer//
44492c4fd5c17a5fd433cca7ddecb0ad4a104baa59cBenjamin Kramer// FIXME: This is redundant with -mcpu, why does LLVM use this.
44592c4fd5c17a5fd433cca7ddecb0ad4a104baa59cBenjamin Kramer// FIXME: tblgen this, or kill it!
44692c4fd5c17a5fd433cca7ddecb0ad4a104baa59cBenjamin Kramerstatic const char *getLLVMArchSuffixForARM(StringRef CPU) {
44792c4fd5c17a5fd433cca7ddecb0ad4a104baa59cBenjamin Kramer  return llvm::StringSwitch<const char *>(CPU)
44892c4fd5c17a5fd433cca7ddecb0ad4a104baa59cBenjamin Kramer    .Cases("arm7tdmi", "arm7tdmi-s", "arm710t", "v4t")
44992c4fd5c17a5fd433cca7ddecb0ad4a104baa59cBenjamin Kramer    .Cases("arm720t", "arm9", "arm9tdmi", "v4t")
45092c4fd5c17a5fd433cca7ddecb0ad4a104baa59cBenjamin Kramer    .Cases("arm920", "arm920t", "arm922t", "v4t")
45192c4fd5c17a5fd433cca7ddecb0ad4a104baa59cBenjamin Kramer    .Cases("arm940t", "ep9312","v4t")
45292c4fd5c17a5fd433cca7ddecb0ad4a104baa59cBenjamin Kramer    .Cases("arm10tdmi",  "arm1020t", "v5")
45392c4fd5c17a5fd433cca7ddecb0ad4a104baa59cBenjamin Kramer    .Cases("arm9e",  "arm926ej-s",  "arm946e-s", "v5e")
45492c4fd5c17a5fd433cca7ddecb0ad4a104baa59cBenjamin Kramer    .Cases("arm966e-s",  "arm968e-s",  "arm10e", "v5e")
45592c4fd5c17a5fd433cca7ddecb0ad4a104baa59cBenjamin Kramer    .Cases("arm1020e",  "arm1022e",  "xscale", "iwmmxt", "v5e")
45692c4fd5c17a5fd433cca7ddecb0ad4a104baa59cBenjamin Kramer    .Cases("arm1136j-s",  "arm1136jf-s",  "arm1176jz-s", "v6")
45792c4fd5c17a5fd433cca7ddecb0ad4a104baa59cBenjamin Kramer    .Cases("arm1176jzf-s",  "mpcorenovfp",  "mpcore", "v6")
45892c4fd5c17a5fd433cca7ddecb0ad4a104baa59cBenjamin Kramer    .Cases("arm1156t2-s",  "arm1156t2f-s", "v6t2")
459fc55345144f636f7687fd37649f0302914981fffBob Wilson    .Cases("cortex-a5", "cortex-a7", "cortex-a8", "v7")
460fc55345144f636f7687fd37649f0302914981fffBob Wilson    .Cases("cortex-a9", "cortex-a15", "v7")
461ab13751d76be4473e9317d3885cb351b79f18492Quentin Colombet    .Case("cortex-r5", "v7r")
46292c4fd5c17a5fd433cca7ddecb0ad4a104baa59cBenjamin Kramer    .Case("cortex-m0", "v6m")
4632503ebd2cf9b4d28319551debaacff8b38765698Bob Wilson    .Case("cortex-m3", "v7m")
4642503ebd2cf9b4d28319551debaacff8b38765698Bob Wilson    .Case("cortex-m4", "v7em")
465336bfa3fb496228a8ab4070def5b4297e5f88358Bob Wilson    .Case("cortex-a9-mp", "v7f")
466336bfa3fb496228a8ab4070def5b4297e5f88358Bob Wilson    .Case("swift", "v7s")
46792c4fd5c17a5fd433cca7ddecb0ad4a104baa59cBenjamin Kramer    .Default("");
46892c4fd5c17a5fd433cca7ddecb0ad4a104baa59cBenjamin Kramer}
46992c4fd5c17a5fd433cca7ddecb0ad4a104baa59cBenjamin Kramer
470fc8f0e14ad142ed811e90fbd9a30e419e301c717Chris Lattner/// getARMTargetCPU - Get the (LLVM) name of the ARM cpu we are targeting.
471728a512753d85a6ccaae34e81385c8665c2de0e1Daniel Dunbar//
472728a512753d85a6ccaae34e81385c8665c2de0e1Daniel Dunbar// FIXME: tblgen this.
47392c4fd5c17a5fd433cca7ddecb0ad4a104baa59cBenjamin Kramerstatic std::string getARMTargetCPU(const ArgList &Args,
474bcd6df662471e0ac2d3d85fdba09b1295c2fc468Rafael Espindola                                   const llvm::Triple &Triple) {
475728a512753d85a6ccaae34e81385c8665c2de0e1Daniel Dunbar  // FIXME: Warn on inconsistent use of -mcpu and -march.
476b163ef7e7a5d904ef0962a7c38c460be083c4d63Daniel Dunbar
477b163ef7e7a5d904ef0962a7c38c460be083c4d63Daniel Dunbar  // If we have -mcpu=, use that.
47892c4fd5c17a5fd433cca7ddecb0ad4a104baa59cBenjamin Kramer  if (Arg *A = Args.getLastArg(options::OPT_mcpu_EQ)) {
4791d489cf4a04ad0ad8ac2696e4eed0995f3a67288Richard Smith    StringRef MCPU = A->getValue();
48092c4fd5c17a5fd433cca7ddecb0ad4a104baa59cBenjamin Kramer    // Handle -mcpu=native.
48192c4fd5c17a5fd433cca7ddecb0ad4a104baa59cBenjamin Kramer    if (MCPU == "native")
48292c4fd5c17a5fd433cca7ddecb0ad4a104baa59cBenjamin Kramer      return llvm::sys::getHostCPUName();
48392c4fd5c17a5fd433cca7ddecb0ad4a104baa59cBenjamin Kramer    else
48492c4fd5c17a5fd433cca7ddecb0ad4a104baa59cBenjamin Kramer      return MCPU;
48592c4fd5c17a5fd433cca7ddecb0ad4a104baa59cBenjamin Kramer  }
486b163ef7e7a5d904ef0962a7c38c460be083c4d63Daniel Dunbar
4875f9e272e632e951b1efe824cd16acb4d96077930Chris Lattner  StringRef MArch;
488b163ef7e7a5d904ef0962a7c38c460be083c4d63Daniel Dunbar  if (Arg *A = Args.getLastArg(options::OPT_march_EQ)) {
489bcd6df662471e0ac2d3d85fdba09b1295c2fc468Rafael Espindola    // Otherwise, if we have -march= choose the base CPU for that arch.
4901d489cf4a04ad0ad8ac2696e4eed0995f3a67288Richard Smith    MArch = A->getValue();
491bcd6df662471e0ac2d3d85fdba09b1295c2fc468Rafael Espindola  } else {
492bcd6df662471e0ac2d3d85fdba09b1295c2fc468Rafael Espindola    // Otherwise, use the Arch from the triple.
493bcd6df662471e0ac2d3d85fdba09b1295c2fc468Rafael Espindola    MArch = Triple.getArchName();
494b163ef7e7a5d904ef0962a7c38c460be083c4d63Daniel Dunbar  }
495b163ef7e7a5d904ef0962a7c38c460be083c4d63Daniel Dunbar
49692c4fd5c17a5fd433cca7ddecb0ad4a104baa59cBenjamin Kramer  // Handle -march=native.
49792c4fd5c17a5fd433cca7ddecb0ad4a104baa59cBenjamin Kramer  std::string NativeMArch;
49892c4fd5c17a5fd433cca7ddecb0ad4a104baa59cBenjamin Kramer  if (MArch == "native") {
49992c4fd5c17a5fd433cca7ddecb0ad4a104baa59cBenjamin Kramer    std::string CPU = llvm::sys::getHostCPUName();
50092c4fd5c17a5fd433cca7ddecb0ad4a104baa59cBenjamin Kramer    if (CPU != "generic") {
50192c4fd5c17a5fd433cca7ddecb0ad4a104baa59cBenjamin Kramer      // Translate the native cpu into the architecture. The switch below will
50292c4fd5c17a5fd433cca7ddecb0ad4a104baa59cBenjamin Kramer      // then chose the minimum cpu for that arch.
50392c4fd5c17a5fd433cca7ddecb0ad4a104baa59cBenjamin Kramer      NativeMArch = std::string("arm") + getLLVMArchSuffixForARM(CPU);
50492c4fd5c17a5fd433cca7ddecb0ad4a104baa59cBenjamin Kramer      MArch = NativeMArch;
50592c4fd5c17a5fd433cca7ddecb0ad4a104baa59cBenjamin Kramer    }
50692c4fd5c17a5fd433cca7ddecb0ad4a104baa59cBenjamin Kramer  }
50792c4fd5c17a5fd433cca7ddecb0ad4a104baa59cBenjamin Kramer
508ae1aee6683d486d1c92e51b2a5da6ba75f633308Chad Rosier  return llvm::StringSwitch<const char *>(MArch)
509ae1aee6683d486d1c92e51b2a5da6ba75f633308Chad Rosier    .Cases("armv2", "armv2a","arm2")
510ae1aee6683d486d1c92e51b2a5da6ba75f633308Chad Rosier    .Case("armv3", "arm6")
511ae1aee6683d486d1c92e51b2a5da6ba75f633308Chad Rosier    .Case("armv3m", "arm7m")
512ae1aee6683d486d1c92e51b2a5da6ba75f633308Chad Rosier    .Cases("armv4", "armv4t", "arm7tdmi")
513ae1aee6683d486d1c92e51b2a5da6ba75f633308Chad Rosier    .Cases("armv5", "armv5t", "arm10tdmi")
5144add84f83f4505304ab3f94ebfa6bbc0be60058dEvgeniy Stepanov    .Cases("armv5e", "armv5te", "arm1022e")
515ae1aee6683d486d1c92e51b2a5da6ba75f633308Chad Rosier    .Case("armv5tej", "arm926ej-s")
516ae1aee6683d486d1c92e51b2a5da6ba75f633308Chad Rosier    .Cases("armv6", "armv6k", "arm1136jf-s")
517ae1aee6683d486d1c92e51b2a5da6ba75f633308Chad Rosier    .Case("armv6j", "arm1136j-s")
518ae1aee6683d486d1c92e51b2a5da6ba75f633308Chad Rosier    .Cases("armv6z", "armv6zk", "arm1176jzf-s")
519ae1aee6683d486d1c92e51b2a5da6ba75f633308Chad Rosier    .Case("armv6t2", "arm1156t2-s")
5202503ebd2cf9b4d28319551debaacff8b38765698Bob Wilson    .Cases("armv6m", "armv6-m", "cortex-m0")
521ae1aee6683d486d1c92e51b2a5da6ba75f633308Chad Rosier    .Cases("armv7", "armv7a", "armv7-a", "cortex-a8")
5222503ebd2cf9b4d28319551debaacff8b38765698Bob Wilson    .Cases("armv7em", "armv7e-m", "cortex-m4")
523336bfa3fb496228a8ab4070def5b4297e5f88358Bob Wilson    .Cases("armv7f", "armv7-f", "cortex-a9-mp")
524336bfa3fb496228a8ab4070def5b4297e5f88358Bob Wilson    .Cases("armv7s", "armv7-s", "swift")
525ae1aee6683d486d1c92e51b2a5da6ba75f633308Chad Rosier    .Cases("armv7r", "armv7-r", "cortex-r4")
526ae1aee6683d486d1c92e51b2a5da6ba75f633308Chad Rosier    .Cases("armv7m", "armv7-m", "cortex-m3")
527ae1aee6683d486d1c92e51b2a5da6ba75f633308Chad Rosier    .Case("ep9312", "ep9312")
528ae1aee6683d486d1c92e51b2a5da6ba75f633308Chad Rosier    .Case("iwmmxt", "iwmmxt")
529ae1aee6683d486d1c92e51b2a5da6ba75f633308Chad Rosier    .Case("xscale", "xscale")
530ae1aee6683d486d1c92e51b2a5da6ba75f633308Chad Rosier    // If all else failed, return the most base CPU LLVM supports.
531ae1aee6683d486d1c92e51b2a5da6ba75f633308Chad Rosier    .Default("arm7tdmi");
532b163ef7e7a5d904ef0962a7c38c460be083c4d63Daniel Dunbar}
533b163ef7e7a5d904ef0962a7c38c460be083c4d63Daniel Dunbar
5341f95e6567faab67f4363d650f73121359c4bdbabDaniel Dunbar// FIXME: Move to target hook.
5351f95e6567faab67f4363d650f73121359c4bdbabDaniel Dunbarstatic bool isSignedCharDefault(const llvm::Triple &Triple) {
5361f95e6567faab67f4363d650f73121359c4bdbabDaniel Dunbar  switch (Triple.getArch()) {
5371f95e6567faab67f4363d650f73121359c4bdbabDaniel Dunbar  default:
5381f95e6567faab67f4363d650f73121359c4bdbabDaniel Dunbar    return true;
5391f95e6567faab67f4363d650f73121359c4bdbabDaniel Dunbar
540c264e16a42b3f6c36521857a29ea0949d9781c22Tim Northover  case llvm::Triple::aarch64:
5415b4e7b11e745329d8a55fd56504450dede1b2100Jim Grosbach  case llvm::Triple::arm:
5421f95e6567faab67f4363d650f73121359c4bdbabDaniel Dunbar  case llvm::Triple::ppc:
5431f95e6567faab67f4363d650f73121359c4bdbabDaniel Dunbar  case llvm::Triple::ppc64:
544905c45f15a25598620d19160c139c6b785aeea89Bob Wilson    if (Triple.isOSDarwin())
5451f95e6567faab67f4363d650f73121359c4bdbabDaniel Dunbar      return true;
5461f95e6567faab67f4363d650f73121359c4bdbabDaniel Dunbar    return false;
5471f95e6567faab67f4363d650f73121359c4bdbabDaniel Dunbar  }
5481f95e6567faab67f4363d650f73121359c4bdbabDaniel Dunbar}
5491f95e6567faab67f4363d650f73121359c4bdbabDaniel Dunbar
550993172757762436d22b2dfc74e7cca1bade1a7bfChad Rosier// Handle -mfpu=.
551993172757762436d22b2dfc74e7cca1bade1a7bfChad Rosier//
552993172757762436d22b2dfc74e7cca1bade1a7bfChad Rosier// FIXME: Centralize feature selection, defaulting shouldn't be also in the
553993172757762436d22b2dfc74e7cca1bade1a7bfChad Rosier// frontend target.
554993172757762436d22b2dfc74e7cca1bade1a7bfChad Rosierstatic void addFPUArgs(const Driver &D, const Arg *A, const ArgList &Args,
555993172757762436d22b2dfc74e7cca1bade1a7bfChad Rosier                       ArgStringList &CmdArgs) {
5561d489cf4a04ad0ad8ac2696e4eed0995f3a67288Richard Smith  StringRef FPU = A->getValue();
557993172757762436d22b2dfc74e7cca1bade1a7bfChad Rosier
558993172757762436d22b2dfc74e7cca1bade1a7bfChad Rosier  // Set the target features based on the FPU.
559993172757762436d22b2dfc74e7cca1bade1a7bfChad Rosier  if (FPU == "fpa" || FPU == "fpe2" || FPU == "fpe3" || FPU == "maverick") {
560993172757762436d22b2dfc74e7cca1bade1a7bfChad Rosier    // Disable any default FPU support.
561993172757762436d22b2dfc74e7cca1bade1a7bfChad Rosier    CmdArgs.push_back("-target-feature");
562993172757762436d22b2dfc74e7cca1bade1a7bfChad Rosier    CmdArgs.push_back("-vfp2");
563993172757762436d22b2dfc74e7cca1bade1a7bfChad Rosier    CmdArgs.push_back("-target-feature");
564993172757762436d22b2dfc74e7cca1bade1a7bfChad Rosier    CmdArgs.push_back("-vfp3");
565993172757762436d22b2dfc74e7cca1bade1a7bfChad Rosier    CmdArgs.push_back("-target-feature");
566993172757762436d22b2dfc74e7cca1bade1a7bfChad Rosier    CmdArgs.push_back("-neon");
567993172757762436d22b2dfc74e7cca1bade1a7bfChad Rosier  } else if (FPU == "vfp3-d16" || FPU == "vfpv3-d16") {
568993172757762436d22b2dfc74e7cca1bade1a7bfChad Rosier    CmdArgs.push_back("-target-feature");
569993172757762436d22b2dfc74e7cca1bade1a7bfChad Rosier    CmdArgs.push_back("+vfp3");
570993172757762436d22b2dfc74e7cca1bade1a7bfChad Rosier    CmdArgs.push_back("-target-feature");
571993172757762436d22b2dfc74e7cca1bade1a7bfChad Rosier    CmdArgs.push_back("+d16");
572993172757762436d22b2dfc74e7cca1bade1a7bfChad Rosier    CmdArgs.push_back("-target-feature");
573993172757762436d22b2dfc74e7cca1bade1a7bfChad Rosier    CmdArgs.push_back("-neon");
574993172757762436d22b2dfc74e7cca1bade1a7bfChad Rosier  } else if (FPU == "vfp") {
575993172757762436d22b2dfc74e7cca1bade1a7bfChad Rosier    CmdArgs.push_back("-target-feature");
576993172757762436d22b2dfc74e7cca1bade1a7bfChad Rosier    CmdArgs.push_back("+vfp2");
577993172757762436d22b2dfc74e7cca1bade1a7bfChad Rosier    CmdArgs.push_back("-target-feature");
578993172757762436d22b2dfc74e7cca1bade1a7bfChad Rosier    CmdArgs.push_back("-neon");
579993172757762436d22b2dfc74e7cca1bade1a7bfChad Rosier  } else if (FPU == "vfp3" || FPU == "vfpv3") {
580993172757762436d22b2dfc74e7cca1bade1a7bfChad Rosier    CmdArgs.push_back("-target-feature");
581993172757762436d22b2dfc74e7cca1bade1a7bfChad Rosier    CmdArgs.push_back("+vfp3");
582993172757762436d22b2dfc74e7cca1bade1a7bfChad Rosier    CmdArgs.push_back("-target-feature");
583993172757762436d22b2dfc74e7cca1bade1a7bfChad Rosier    CmdArgs.push_back("-neon");
584993172757762436d22b2dfc74e7cca1bade1a7bfChad Rosier  } else if (FPU == "neon") {
585993172757762436d22b2dfc74e7cca1bade1a7bfChad Rosier    CmdArgs.push_back("-target-feature");
586993172757762436d22b2dfc74e7cca1bade1a7bfChad Rosier    CmdArgs.push_back("+neon");
587993172757762436d22b2dfc74e7cca1bade1a7bfChad Rosier  } else
588993172757762436d22b2dfc74e7cca1bade1a7bfChad Rosier    D.Diag(diag::err_drv_clang_unsupported) << A->getAsString(Args);
589993172757762436d22b2dfc74e7cca1bade1a7bfChad Rosier}
590993172757762436d22b2dfc74e7cca1bade1a7bfChad Rosier
5917a938fa66be42710b034a79106de337a275fd265Chad Rosier// Handle -mfpmath=.
5927a938fa66be42710b034a79106de337a275fd265Chad Rosierstatic void addFPMathArgs(const Driver &D, const Arg *A, const ArgList &Args,
59330fe6baf95662ea82a794a8fe3b76998713c183dChad Rosier                          ArgStringList &CmdArgs, StringRef CPU) {
5941d489cf4a04ad0ad8ac2696e4eed0995f3a67288Richard Smith  StringRef FPMath = A->getValue();
5957a938fa66be42710b034a79106de337a275fd265Chad Rosier
5967a938fa66be42710b034a79106de337a275fd265Chad Rosier  // Set the target features based on the FPMath.
5977a938fa66be42710b034a79106de337a275fd265Chad Rosier  if (FPMath == "neon") {
5987a938fa66be42710b034a79106de337a275fd265Chad Rosier    CmdArgs.push_back("-target-feature");
5997a938fa66be42710b034a79106de337a275fd265Chad Rosier    CmdArgs.push_back("+neonfp");
60030fe6baf95662ea82a794a8fe3b76998713c183dChad Rosier
601fc55345144f636f7687fd37649f0302914981fffBob Wilson    if (CPU != "cortex-a5" && CPU != "cortex-a7" &&
602fc55345144f636f7687fd37649f0302914981fffBob Wilson        CPU != "cortex-a8" && CPU != "cortex-a9" &&
603fc55345144f636f7687fd37649f0302914981fffBob Wilson        CPU != "cortex-a9-mp" && CPU != "cortex-a15")
60430fe6baf95662ea82a794a8fe3b76998713c183dChad Rosier      D.Diag(diag::err_drv_invalid_feature) << "-mfpmath=neon" << CPU;
60530fe6baf95662ea82a794a8fe3b76998713c183dChad Rosier
6067a938fa66be42710b034a79106de337a275fd265Chad Rosier  } else if (FPMath == "vfp" || FPMath == "vfp2" || FPMath == "vfp3" ||
6077a938fa66be42710b034a79106de337a275fd265Chad Rosier             FPMath == "vfp4") {
6087a938fa66be42710b034a79106de337a275fd265Chad Rosier    CmdArgs.push_back("-target-feature");
6097a938fa66be42710b034a79106de337a275fd265Chad Rosier    CmdArgs.push_back("-neonfp");
61030fe6baf95662ea82a794a8fe3b76998713c183dChad Rosier
61130fe6baf95662ea82a794a8fe3b76998713c183dChad Rosier    // FIXME: Add warnings when disabling a feature not present for a given CPU.
6127a938fa66be42710b034a79106de337a275fd265Chad Rosier  } else
6137a938fa66be42710b034a79106de337a275fd265Chad Rosier    D.Diag(diag::err_drv_clang_unsupported) << A->getAsString(Args);
6147a938fa66be42710b034a79106de337a275fd265Chad Rosier}
6157a938fa66be42710b034a79106de337a275fd265Chad Rosier
616e2571793ba6fc13e5525b8d7224812f99842a1a4Anton Korobeynikov// Select the float ABI as determined by -msoft-float, -mhard-float, and
617e2571793ba6fc13e5525b8d7224812f99842a1a4Anton Korobeynikov// -mfloat-abi=.
618e2571793ba6fc13e5525b8d7224812f99842a1a4Anton Korobeynikovstatic StringRef getARMFloatABI(const Driver &D,
619e2571793ba6fc13e5525b8d7224812f99842a1a4Anton Korobeynikov                                const ArgList &Args,
620e2571793ba6fc13e5525b8d7224812f99842a1a4Anton Korobeynikov                                const llvm::Triple &Triple) {
6215f9e272e632e951b1efe824cd16acb4d96077930Chris Lattner  StringRef FloatABI;
622cbd1933f83e2332b2d7add10459f80cc4e7eb7bfDaniel Dunbar  if (Arg *A = Args.getLastArg(options::OPT_msoft_float,
623cbd1933f83e2332b2d7add10459f80cc4e7eb7bfDaniel Dunbar                               options::OPT_mhard_float,
624cbd1933f83e2332b2d7add10459f80cc4e7eb7bfDaniel Dunbar                               options::OPT_mfloat_abi_EQ)) {
625cbd1933f83e2332b2d7add10459f80cc4e7eb7bfDaniel Dunbar    if (A->getOption().matches(options::OPT_msoft_float))
626cbd1933f83e2332b2d7add10459f80cc4e7eb7bfDaniel Dunbar      FloatABI = "soft";
627cbd1933f83e2332b2d7add10459f80cc4e7eb7bfDaniel Dunbar    else if (A->getOption().matches(options::OPT_mhard_float))
628cbd1933f83e2332b2d7add10459f80cc4e7eb7bfDaniel Dunbar      FloatABI = "hard";
629cbd1933f83e2332b2d7add10459f80cc4e7eb7bfDaniel Dunbar    else {
6301d489cf4a04ad0ad8ac2696e4eed0995f3a67288Richard Smith      FloatABI = A->getValue();
631cbd1933f83e2332b2d7add10459f80cc4e7eb7bfDaniel Dunbar      if (FloatABI != "soft" && FloatABI != "softfp" && FloatABI != "hard") {
6325f9e272e632e951b1efe824cd16acb4d96077930Chris Lattner        D.Diag(diag::err_drv_invalid_mfloat_abi)
633cbd1933f83e2332b2d7add10459f80cc4e7eb7bfDaniel Dunbar          << A->getAsString(Args);
634cbd1933f83e2332b2d7add10459f80cc4e7eb7bfDaniel Dunbar        FloatABI = "soft";
635cbd1933f83e2332b2d7add10459f80cc4e7eb7bfDaniel Dunbar      }
636cbd1933f83e2332b2d7add10459f80cc4e7eb7bfDaniel Dunbar    }
637cbd1933f83e2332b2d7add10459f80cc4e7eb7bfDaniel Dunbar  }
638cbd1933f83e2332b2d7add10459f80cc4e7eb7bfDaniel Dunbar
639cbd1933f83e2332b2d7add10459f80cc4e7eb7bfDaniel Dunbar  // If unspecified, choose the default based on the platform.
640cbd1933f83e2332b2d7add10459f80cc4e7eb7bfDaniel Dunbar  if (FloatABI.empty()) {
641bcd6df662471e0ac2d3d85fdba09b1295c2fc468Rafael Espindola    switch (Triple.getOS()) {
642905c45f15a25598620d19160c139c6b785aeea89Bob Wilson    case llvm::Triple::Darwin:
643905c45f15a25598620d19160c139c6b785aeea89Bob Wilson    case llvm::Triple::MacOSX:
644905c45f15a25598620d19160c139c6b785aeea89Bob Wilson    case llvm::Triple::IOS: {
645cbd1933f83e2332b2d7add10459f80cc4e7eb7bfDaniel Dunbar      // Darwin defaults to "softfp" for v6 and v7.
646cbd1933f83e2332b2d7add10459f80cc4e7eb7bfDaniel Dunbar      //
647cbd1933f83e2332b2d7add10459f80cc4e7eb7bfDaniel Dunbar      // FIXME: Factor out an ARM class so we can cache the arch somewhere.
64892c4fd5c17a5fd433cca7ddecb0ad4a104baa59cBenjamin Kramer      std::string ArchName =
649bcd6df662471e0ac2d3d85fdba09b1295c2fc468Rafael Espindola        getLLVMArchSuffixForARM(getARMTargetCPU(Args, Triple));
65092c4fd5c17a5fd433cca7ddecb0ad4a104baa59cBenjamin Kramer      if (StringRef(ArchName).startswith("v6") ||
65192c4fd5c17a5fd433cca7ddecb0ad4a104baa59cBenjamin Kramer          StringRef(ArchName).startswith("v7"))
652cbd1933f83e2332b2d7add10459f80cc4e7eb7bfDaniel Dunbar        FloatABI = "softfp";
653cbd1933f83e2332b2d7add10459f80cc4e7eb7bfDaniel Dunbar      else
654cbd1933f83e2332b2d7add10459f80cc4e7eb7bfDaniel Dunbar        FloatABI = "soft";
655cbd1933f83e2332b2d7add10459f80cc4e7eb7bfDaniel Dunbar      break;
656cbd1933f83e2332b2d7add10459f80cc4e7eb7bfDaniel Dunbar    }
657cbd1933f83e2332b2d7add10459f80cc4e7eb7bfDaniel Dunbar
65827fa2364b05ab26138c2ecf0eac1937b7fc6c037Rafael Espindola    case llvm::Triple::FreeBSD:
65927fa2364b05ab26138c2ecf0eac1937b7fc6c037Rafael Espindola      // FreeBSD defaults to soft float
66027fa2364b05ab26138c2ecf0eac1937b7fc6c037Rafael Espindola      FloatABI = "soft";
66127fa2364b05ab26138c2ecf0eac1937b7fc6c037Rafael Espindola      break;
66227fa2364b05ab26138c2ecf0eac1937b7fc6c037Rafael Espindola
663cbd1933f83e2332b2d7add10459f80cc4e7eb7bfDaniel Dunbar    default:
664fc2bd7c3efed6756a030d58a5f6ae31947e7d451Bob Wilson      switch(Triple.getEnvironment()) {
665ff104a12d61d34af67f12a7a966847c821d7afa8Jiangning Liu      case llvm::Triple::GNUEABIHF:
666ff104a12d61d34af67f12a7a966847c821d7afa8Jiangning Liu        FloatABI = "hard";
667ff104a12d61d34af67f12a7a966847c821d7afa8Jiangning Liu        break;
668fc2bd7c3efed6756a030d58a5f6ae31947e7d451Bob Wilson      case llvm::Triple::GNUEABI:
669fc2bd7c3efed6756a030d58a5f6ae31947e7d451Bob Wilson        FloatABI = "softfp";
670fc2bd7c3efed6756a030d58a5f6ae31947e7d451Bob Wilson        break;
671fc2bd7c3efed6756a030d58a5f6ae31947e7d451Bob Wilson      case llvm::Triple::EABI:
672fc2bd7c3efed6756a030d58a5f6ae31947e7d451Bob Wilson        // EABI is always AAPCS, and if it was not marked 'hard', it's softfp
673fc2bd7c3efed6756a030d58a5f6ae31947e7d451Bob Wilson        FloatABI = "softfp";
674fc2bd7c3efed6756a030d58a5f6ae31947e7d451Bob Wilson        break;
67594a7142f74bb4a9daa53c22087b19d4568073109Logan Chien      case llvm::Triple::Android: {
67692c4fd5c17a5fd433cca7ddecb0ad4a104baa59cBenjamin Kramer        std::string ArchName =
677b43550bf1bd944a16cdae9703cb1c2049b04e6bdChandler Carruth          getLLVMArchSuffixForARM(getARMTargetCPU(Args, Triple));
67892c4fd5c17a5fd433cca7ddecb0ad4a104baa59cBenjamin Kramer        if (StringRef(ArchName).startswith("v7"))
679b43550bf1bd944a16cdae9703cb1c2049b04e6bdChandler Carruth          FloatABI = "softfp";
680b43550bf1bd944a16cdae9703cb1c2049b04e6bdChandler Carruth        else
681b43550bf1bd944a16cdae9703cb1c2049b04e6bdChandler Carruth          FloatABI = "soft";
682b43550bf1bd944a16cdae9703cb1c2049b04e6bdChandler Carruth        break;
683b43550bf1bd944a16cdae9703cb1c2049b04e6bdChandler Carruth      }
684fc2bd7c3efed6756a030d58a5f6ae31947e7d451Bob Wilson      default:
685fc2bd7c3efed6756a030d58a5f6ae31947e7d451Bob Wilson        // Assume "soft", but warn the user we are guessing.
686fc2bd7c3efed6756a030d58a5f6ae31947e7d451Bob Wilson        FloatABI = "soft";
6875f9e272e632e951b1efe824cd16acb4d96077930Chris Lattner        D.Diag(diag::warn_drv_assuming_mfloat_abi_is) << "soft";
688fc2bd7c3efed6756a030d58a5f6ae31947e7d451Bob Wilson        break;
689fc2bd7c3efed6756a030d58a5f6ae31947e7d451Bob Wilson      }
690cbd1933f83e2332b2d7add10459f80cc4e7eb7bfDaniel Dunbar    }
691cbd1933f83e2332b2d7add10459f80cc4e7eb7bfDaniel Dunbar  }
692cbd1933f83e2332b2d7add10459f80cc4e7eb7bfDaniel Dunbar
693e2571793ba6fc13e5525b8d7224812f99842a1a4Anton Korobeynikov  return FloatABI;
694e2571793ba6fc13e5525b8d7224812f99842a1a4Anton Korobeynikov}
695e2571793ba6fc13e5525b8d7224812f99842a1a4Anton Korobeynikov
696e2571793ba6fc13e5525b8d7224812f99842a1a4Anton Korobeynikov
697e2571793ba6fc13e5525b8d7224812f99842a1a4Anton Korobeynikovvoid Clang::AddARMTargetArgs(const ArgList &Args,
698e2571793ba6fc13e5525b8d7224812f99842a1a4Anton Korobeynikov                             ArgStringList &CmdArgs,
699e2571793ba6fc13e5525b8d7224812f99842a1a4Anton Korobeynikov                             bool KernelOrKext) const {
700e2571793ba6fc13e5525b8d7224812f99842a1a4Anton Korobeynikov  const Driver &D = getToolChain().getDriver();
7017a0c064770355a4918df69f95de8dea6338a59a2Daniel Dunbar  // Get the effective triple, which takes into account the deployment target.
7027a0c064770355a4918df69f95de8dea6338a59a2Daniel Dunbar  std::string TripleStr = getToolChain().ComputeEffectiveClangTriple(Args);
7037a0c064770355a4918df69f95de8dea6338a59a2Daniel Dunbar  llvm::Triple Triple(TripleStr);
7042e4e110a727a0d379a8fbd0cc2afba1ff3801091Daniel Dunbar  std::string CPUName = getARMTargetCPU(Args, Triple);
705e2571793ba6fc13e5525b8d7224812f99842a1a4Anton Korobeynikov
706e2571793ba6fc13e5525b8d7224812f99842a1a4Anton Korobeynikov  // Select the ABI to use.
707e2571793ba6fc13e5525b8d7224812f99842a1a4Anton Korobeynikov  //
708e2571793ba6fc13e5525b8d7224812f99842a1a4Anton Korobeynikov  // FIXME: Support -meabi.
709e2571793ba6fc13e5525b8d7224812f99842a1a4Anton Korobeynikov  const char *ABIName = 0;
710e2571793ba6fc13e5525b8d7224812f99842a1a4Anton Korobeynikov  if (Arg *A = Args.getLastArg(options::OPT_mabi_EQ)) {
7111d489cf4a04ad0ad8ac2696e4eed0995f3a67288Richard Smith    ABIName = A->getValue();
7122e4e110a727a0d379a8fbd0cc2afba1ff3801091Daniel Dunbar  } else if (Triple.isOSDarwin()) {
7132e4e110a727a0d379a8fbd0cc2afba1ff3801091Daniel Dunbar    // The backend is hardwired to assume AAPCS for M-class processors, ensure
7142e4e110a727a0d379a8fbd0cc2afba1ff3801091Daniel Dunbar    // the frontend matches that.
7152e4e110a727a0d379a8fbd0cc2afba1ff3801091Daniel Dunbar    if (StringRef(CPUName).startswith("cortex-m")) {
7162e4e110a727a0d379a8fbd0cc2afba1ff3801091Daniel Dunbar      ABIName = "aapcs";
7172e4e110a727a0d379a8fbd0cc2afba1ff3801091Daniel Dunbar    } else {
7182e4e110a727a0d379a8fbd0cc2afba1ff3801091Daniel Dunbar      ABIName = "apcs-gnu";
7192e4e110a727a0d379a8fbd0cc2afba1ff3801091Daniel Dunbar    }
720e2571793ba6fc13e5525b8d7224812f99842a1a4Anton Korobeynikov  } else {
721e2571793ba6fc13e5525b8d7224812f99842a1a4Anton Korobeynikov    // Select the default based on the platform.
722e2571793ba6fc13e5525b8d7224812f99842a1a4Anton Korobeynikov    switch(Triple.getEnvironment()) {
72394a7142f74bb4a9daa53c22087b19d4568073109Logan Chien    case llvm::Triple::Android:
724e2571793ba6fc13e5525b8d7224812f99842a1a4Anton Korobeynikov    case llvm::Triple::GNUEABI:
725ff104a12d61d34af67f12a7a966847c821d7afa8Jiangning Liu    case llvm::Triple::GNUEABIHF:
726e2571793ba6fc13e5525b8d7224812f99842a1a4Anton Korobeynikov      ABIName = "aapcs-linux";
727e2571793ba6fc13e5525b8d7224812f99842a1a4Anton Korobeynikov      break;
728e2571793ba6fc13e5525b8d7224812f99842a1a4Anton Korobeynikov    case llvm::Triple::EABI:
729e2571793ba6fc13e5525b8d7224812f99842a1a4Anton Korobeynikov      ABIName = "aapcs";
730e2571793ba6fc13e5525b8d7224812f99842a1a4Anton Korobeynikov      break;
731e2571793ba6fc13e5525b8d7224812f99842a1a4Anton Korobeynikov    default:
732e2571793ba6fc13e5525b8d7224812f99842a1a4Anton Korobeynikov      ABIName = "apcs-gnu";
733e2571793ba6fc13e5525b8d7224812f99842a1a4Anton Korobeynikov    }
734e2571793ba6fc13e5525b8d7224812f99842a1a4Anton Korobeynikov  }
735e2571793ba6fc13e5525b8d7224812f99842a1a4Anton Korobeynikov  CmdArgs.push_back("-target-abi");
736e2571793ba6fc13e5525b8d7224812f99842a1a4Anton Korobeynikov  CmdArgs.push_back(ABIName);
737e2571793ba6fc13e5525b8d7224812f99842a1a4Anton Korobeynikov
738e2571793ba6fc13e5525b8d7224812f99842a1a4Anton Korobeynikov  // Set the CPU based on -march= and -mcpu=.
739e2571793ba6fc13e5525b8d7224812f99842a1a4Anton Korobeynikov  CmdArgs.push_back("-target-cpu");
7402e4e110a727a0d379a8fbd0cc2afba1ff3801091Daniel Dunbar  CmdArgs.push_back(Args.MakeArgString(CPUName));
741e2571793ba6fc13e5525b8d7224812f99842a1a4Anton Korobeynikov
742e2571793ba6fc13e5525b8d7224812f99842a1a4Anton Korobeynikov  // Determine floating point ABI from the options & target defaults.
743e2571793ba6fc13e5525b8d7224812f99842a1a4Anton Korobeynikov  StringRef FloatABI = getARMFloatABI(D, Args, Triple);
744cbd1933f83e2332b2d7add10459f80cc4e7eb7bfDaniel Dunbar  if (FloatABI == "soft") {
745cbd1933f83e2332b2d7add10459f80cc4e7eb7bfDaniel Dunbar    // Floating point operations and argument passing are soft.
746cbd1933f83e2332b2d7add10459f80cc4e7eb7bfDaniel Dunbar    //
747cbd1933f83e2332b2d7add10459f80cc4e7eb7bfDaniel Dunbar    // FIXME: This changes CPP defines, we need -target-soft-float.
7483b315264d1a6fa303e20fe0caec306ccafc090deDaniel Dunbar    CmdArgs.push_back("-msoft-float");
74987667aafe68c366be57f5afb60428237593da0edDaniel Dunbar    CmdArgs.push_back("-mfloat-abi");
75087667aafe68c366be57f5afb60428237593da0edDaniel Dunbar    CmdArgs.push_back("soft");
751cbd1933f83e2332b2d7add10459f80cc4e7eb7bfDaniel Dunbar  } else if (FloatABI == "softfp") {
752cbd1933f83e2332b2d7add10459f80cc4e7eb7bfDaniel Dunbar    // Floating point operations are hard, but argument passing is soft.
75387667aafe68c366be57f5afb60428237593da0edDaniel Dunbar    CmdArgs.push_back("-mfloat-abi");
75487667aafe68c366be57f5afb60428237593da0edDaniel Dunbar    CmdArgs.push_back("soft");
755cbd1933f83e2332b2d7add10459f80cc4e7eb7bfDaniel Dunbar  } else {
756cbd1933f83e2332b2d7add10459f80cc4e7eb7bfDaniel Dunbar    // Floating point operations and argument passing are hard.
757cbd1933f83e2332b2d7add10459f80cc4e7eb7bfDaniel Dunbar    assert(FloatABI == "hard" && "Invalid float abi!");
75887667aafe68c366be57f5afb60428237593da0edDaniel Dunbar    CmdArgs.push_back("-mfloat-abi");
75987667aafe68c366be57f5afb60428237593da0edDaniel Dunbar    CmdArgs.push_back("hard");
760cbd1933f83e2332b2d7add10459f80cc4e7eb7bfDaniel Dunbar  }
76197f52ac45369f6925b548404e61d511034c874ecDaniel Dunbar
76297f52ac45369f6925b548404e61d511034c874ecDaniel Dunbar  // Set appropriate target features for floating point mode.
76397f52ac45369f6925b548404e61d511034c874ecDaniel Dunbar  //
76497f52ac45369f6925b548404e61d511034c874ecDaniel Dunbar  // FIXME: Note, this is a hack, the LLVM backend doesn't actually use these
76597f52ac45369f6925b548404e61d511034c874ecDaniel Dunbar  // yet (it uses the -mfloat-abi and -msoft-float options above), and it is
76697f52ac45369f6925b548404e61d511034c874ecDaniel Dunbar  // stripped out by the ARM target.
76797f52ac45369f6925b548404e61d511034c874ecDaniel Dunbar
76897f52ac45369f6925b548404e61d511034c874ecDaniel Dunbar  // Use software floating point operations?
76997f52ac45369f6925b548404e61d511034c874ecDaniel Dunbar  if (FloatABI == "soft") {
77097f52ac45369f6925b548404e61d511034c874ecDaniel Dunbar    CmdArgs.push_back("-target-feature");
77197f52ac45369f6925b548404e61d511034c874ecDaniel Dunbar    CmdArgs.push_back("+soft-float");
77297f52ac45369f6925b548404e61d511034c874ecDaniel Dunbar  }
77397f52ac45369f6925b548404e61d511034c874ecDaniel Dunbar
77497f52ac45369f6925b548404e61d511034c874ecDaniel Dunbar  // Use software floating point argument passing?
77597f52ac45369f6925b548404e61d511034c874ecDaniel Dunbar  if (FloatABI != "hard") {
77697f52ac45369f6925b548404e61d511034c874ecDaniel Dunbar    CmdArgs.push_back("-target-feature");
77797f52ac45369f6925b548404e61d511034c874ecDaniel Dunbar    CmdArgs.push_back("+soft-float-abi");
77897f52ac45369f6925b548404e61d511034c874ecDaniel Dunbar  }
779a91320b8af7143f7af4c0665ffa62a3b244c0bd9Daniel Dunbar
780a91320b8af7143f7af4c0665ffa62a3b244c0bd9Daniel Dunbar  // Honor -mfpu=.
781993172757762436d22b2dfc74e7cca1bade1a7bfChad Rosier  if (const Arg *A = Args.getLastArg(options::OPT_mfpu_EQ))
782f80f2a5098218211704bc4e66a8c2f46a8fa1d25Chad Rosier    addFPUArgs(D, A, Args, CmdArgs);
7837187fac0f19f75c62f575c9f15f0ed68b7d97810Daniel Dunbar
7847a938fa66be42710b034a79106de337a275fd265Chad Rosier  // Honor -mfpmath=.
7857a938fa66be42710b034a79106de337a275fd265Chad Rosier  if (const Arg *A = Args.getLastArg(options::OPT_mfpmath_EQ))
78630fe6baf95662ea82a794a8fe3b76998713c183dChad Rosier    addFPMathArgs(D, A, Args, CmdArgs, getARMTargetCPU(Args, Triple));
7877a938fa66be42710b034a79106de337a275fd265Chad Rosier
7887187fac0f19f75c62f575c9f15f0ed68b7d97810Daniel Dunbar  // Setting -msoft-float effectively disables NEON because of the GCC
7897187fac0f19f75c62f575c9f15f0ed68b7d97810Daniel Dunbar  // implementation, although the same isn't true of VFP or VFP3.
7907187fac0f19f75c62f575c9f15f0ed68b7d97810Daniel Dunbar  if (FloatABI == "soft") {
791fa41d6975058ceb1b8a24564f6dcec72f89f62e8Daniel Dunbar    CmdArgs.push_back("-target-feature");
792fa41d6975058ceb1b8a24564f6dcec72f89f62e8Daniel Dunbar    CmdArgs.push_back("-neon");
793fa41d6975058ceb1b8a24564f6dcec72f89f62e8Daniel Dunbar  }
794fa41d6975058ceb1b8a24564f6dcec72f89f62e8Daniel Dunbar
795fa41d6975058ceb1b8a24564f6dcec72f89f62e8Daniel Dunbar  // Kernel code has more strict alignment requirements.
796fa41d6975058ceb1b8a24564f6dcec72f89f62e8Daniel Dunbar  if (KernelOrKext) {
7977a0c064770355a4918df69f95de8dea6338a59a2Daniel Dunbar    if (Triple.getOS() != llvm::Triple::IOS || Triple.isOSVersionLT(6)) {
7987a0c064770355a4918df69f95de8dea6338a59a2Daniel Dunbar      CmdArgs.push_back("-backend-option");
7997a0c064770355a4918df69f95de8dea6338a59a2Daniel Dunbar      CmdArgs.push_back("-arm-long-calls");
8007a0c064770355a4918df69f95de8dea6338a59a2Daniel Dunbar    }
801fa41d6975058ceb1b8a24564f6dcec72f89f62e8Daniel Dunbar
8023c66d30d513106bb794990c5e4ba36a31ac19f15Daniel Dunbar    CmdArgs.push_back("-backend-option");
803fa41d6975058ceb1b8a24564f6dcec72f89f62e8Daniel Dunbar    CmdArgs.push_back("-arm-strict-align");
804b5fbb8931466eeab70a30a27a8d5f385472305a1Daniel Dunbar
805b5fbb8931466eeab70a30a27a8d5f385472305a1Daniel Dunbar    // The kext linker doesn't know how to deal with movw/movt.
806b5fbb8931466eeab70a30a27a8d5f385472305a1Daniel Dunbar    CmdArgs.push_back("-backend-option");
807b5fbb8931466eeab70a30a27a8d5f385472305a1Daniel Dunbar    CmdArgs.push_back("-arm-darwin-use-movt=0");
8087187fac0f19f75c62f575c9f15f0ed68b7d97810Daniel Dunbar  }
8091b9060553221720152e12981109549e0a1d8e3a1Chad Rosier
8101b9060553221720152e12981109549e0a1d8e3a1Chad Rosier  // Setting -mno-global-merge disables the codegen global merge pass. Setting
8111b9060553221720152e12981109549e0a1d8e3a1Chad Rosier  // -mglobal-merge has no effect as the pass is enabled by default.
8121b9060553221720152e12981109549e0a1d8e3a1Chad Rosier  if (Arg *A = Args.getLastArg(options::OPT_mglobal_merge,
8131b9060553221720152e12981109549e0a1d8e3a1Chad Rosier                               options::OPT_mno_global_merge)) {
8141b9060553221720152e12981109549e0a1d8e3a1Chad Rosier    if (A->getOption().matches(options::OPT_mno_global_merge))
8151b9060553221720152e12981109549e0a1d8e3a1Chad Rosier      CmdArgs.push_back("-mno-global-merge");
8161b9060553221720152e12981109549e0a1d8e3a1Chad Rosier  }
817ee9ad5ce4840b3c95024948c89d00945ffdda9bbChad Rosier
818005af27c607536038864ff36d480b5ecd066a267Chad Rosier  if (Args.hasArg(options::OPT_mno_implicit_float))
819ee9ad5ce4840b3c95024948c89d00945ffdda9bbChad Rosier    CmdArgs.push_back("-no-implicit-float");
820b163ef7e7a5d904ef0962a7c38c460be083c4d63Daniel Dunbar}
821b163ef7e7a5d904ef0962a7c38c460be083c4d63Daniel Dunbar
8228e1c598310d5cd75700cf800cb333b985ce05420Simon Atanasyan// Translate MIPS CPU name alias option to CPU name.
8238e1c598310d5cd75700cf800cb333b985ce05420Simon Atanasyanstatic StringRef getMipsCPUFromAlias(const Arg &A) {
8248e1c598310d5cd75700cf800cb333b985ce05420Simon Atanasyan  if (A.getOption().matches(options::OPT_mips32))
8258e1c598310d5cd75700cf800cb333b985ce05420Simon Atanasyan    return "mips32";
8268e1c598310d5cd75700cf800cb333b985ce05420Simon Atanasyan  if (A.getOption().matches(options::OPT_mips32r2))
8278e1c598310d5cd75700cf800cb333b985ce05420Simon Atanasyan    return "mips32r2";
8288e1c598310d5cd75700cf800cb333b985ce05420Simon Atanasyan  if (A.getOption().matches(options::OPT_mips64))
8298e1c598310d5cd75700cf800cb333b985ce05420Simon Atanasyan    return "mips64";
8308e1c598310d5cd75700cf800cb333b985ce05420Simon Atanasyan  if (A.getOption().matches(options::OPT_mips64r2))
8318e1c598310d5cd75700cf800cb333b985ce05420Simon Atanasyan    return "mips64r2";
8328e1c598310d5cd75700cf800cb333b985ce05420Simon Atanasyan  llvm_unreachable("Unexpected option");
8338e1c598310d5cd75700cf800cb333b985ce05420Simon Atanasyan  return "";
8348e1c598310d5cd75700cf800cb333b985ce05420Simon Atanasyan}
8358e1c598310d5cd75700cf800cb333b985ce05420Simon Atanasyan
836a2768be144256f9eb721bef8b751e56e0b64fa0bSimon Atanasyan// Get CPU and ABI names. They are not independent
837a2768be144256f9eb721bef8b751e56e0b64fa0bSimon Atanasyan// so we have to calculate them together.
838a2768be144256f9eb721bef8b751e56e0b64fa0bSimon Atanasyanstatic void getMipsCPUAndABI(const ArgList &Args,
839a2768be144256f9eb721bef8b751e56e0b64fa0bSimon Atanasyan                             const ToolChain &TC,
840a2768be144256f9eb721bef8b751e56e0b64fa0bSimon Atanasyan                             StringRef &CPUName,
841a2768be144256f9eb721bef8b751e56e0b64fa0bSimon Atanasyan                             StringRef &ABIName) {
84289d83ff23414240555f895d3dad736bd30f5af4eSimon Atanasyan  const char *DefMips32CPU = "mips32";
84389d83ff23414240555f895d3dad736bd30f5af4eSimon Atanasyan  const char *DefMips64CPU = "mips64";
8449f36062866e6e4bbbfd3efce85fcfb1ce62df97fAkira Hatanaka
84589d83ff23414240555f895d3dad736bd30f5af4eSimon Atanasyan  if (Arg *A = Args.getLastArg(options::OPT_march_EQ,
8468e1c598310d5cd75700cf800cb333b985ce05420Simon Atanasyan                               options::OPT_mcpu_EQ,
8478e1c598310d5cd75700cf800cb333b985ce05420Simon Atanasyan                               options::OPT_mips_CPUs_Group)) {
8488e1c598310d5cd75700cf800cb333b985ce05420Simon Atanasyan    if (A->getOption().matches(options::OPT_mips_CPUs_Group))
8498e1c598310d5cd75700cf800cb333b985ce05420Simon Atanasyan      CPUName = getMipsCPUFromAlias(*A);
8508e1c598310d5cd75700cf800cb333b985ce05420Simon Atanasyan    else
8511d489cf4a04ad0ad8ac2696e4eed0995f3a67288Richard Smith      CPUName = A->getValue();
8528e1c598310d5cd75700cf800cb333b985ce05420Simon Atanasyan  }
85389d83ff23414240555f895d3dad736bd30f5af4eSimon Atanasyan
8549f36062866e6e4bbbfd3efce85fcfb1ce62df97fAkira Hatanaka  if (Arg *A = Args.getLastArg(options::OPT_mabi_EQ))
8551d489cf4a04ad0ad8ac2696e4eed0995f3a67288Richard Smith    ABIName = A->getValue();
85689d83ff23414240555f895d3dad736bd30f5af4eSimon Atanasyan
85789d83ff23414240555f895d3dad736bd30f5af4eSimon Atanasyan  // Setup default CPU and ABI names.
85889d83ff23414240555f895d3dad736bd30f5af4eSimon Atanasyan  if (CPUName.empty() && ABIName.empty()) {
85989d83ff23414240555f895d3dad736bd30f5af4eSimon Atanasyan    switch (TC.getTriple().getArch()) {
86089d83ff23414240555f895d3dad736bd30f5af4eSimon Atanasyan    default:
86189d83ff23414240555f895d3dad736bd30f5af4eSimon Atanasyan      llvm_unreachable("Unexpected triple arch name");
86289d83ff23414240555f895d3dad736bd30f5af4eSimon Atanasyan    case llvm::Triple::mips:
86389d83ff23414240555f895d3dad736bd30f5af4eSimon Atanasyan    case llvm::Triple::mipsel:
86489d83ff23414240555f895d3dad736bd30f5af4eSimon Atanasyan      CPUName = DefMips32CPU;
86589d83ff23414240555f895d3dad736bd30f5af4eSimon Atanasyan      break;
86689d83ff23414240555f895d3dad736bd30f5af4eSimon Atanasyan    case llvm::Triple::mips64:
86789d83ff23414240555f895d3dad736bd30f5af4eSimon Atanasyan    case llvm::Triple::mips64el:
86889d83ff23414240555f895d3dad736bd30f5af4eSimon Atanasyan      CPUName = DefMips64CPU;
86989d83ff23414240555f895d3dad736bd30f5af4eSimon Atanasyan      break;
87089d83ff23414240555f895d3dad736bd30f5af4eSimon Atanasyan    }
87189d83ff23414240555f895d3dad736bd30f5af4eSimon Atanasyan  }
87289d83ff23414240555f895d3dad736bd30f5af4eSimon Atanasyan
87389d83ff23414240555f895d3dad736bd30f5af4eSimon Atanasyan  if (!ABIName.empty()) {
87489d83ff23414240555f895d3dad736bd30f5af4eSimon Atanasyan    // Deduce CPU name from ABI name.
87589d83ff23414240555f895d3dad736bd30f5af4eSimon Atanasyan    CPUName = llvm::StringSwitch<const char *>(ABIName)
876e9616a4972a4c2fdc28128c057f21d7a79516c86Simon Atanasyan      .Cases("32", "o32", "eabi", DefMips32CPU)
877e9616a4972a4c2fdc28128c057f21d7a79516c86Simon Atanasyan      .Cases("n32", "n64", "64", DefMips64CPU)
87889d83ff23414240555f895d3dad736bd30f5af4eSimon Atanasyan      .Default("");
87989d83ff23414240555f895d3dad736bd30f5af4eSimon Atanasyan  }
88089d83ff23414240555f895d3dad736bd30f5af4eSimon Atanasyan  else if (!CPUName.empty()) {
88189d83ff23414240555f895d3dad736bd30f5af4eSimon Atanasyan    // Deduce ABI name from CPU name.
88289d83ff23414240555f895d3dad736bd30f5af4eSimon Atanasyan    ABIName = llvm::StringSwitch<const char *>(CPUName)
88389d83ff23414240555f895d3dad736bd30f5af4eSimon Atanasyan      .Cases("mips32", "mips32r2", "o32")
88489d83ff23414240555f895d3dad736bd30f5af4eSimon Atanasyan      .Cases("mips64", "mips64r2", "n64")
88589d83ff23414240555f895d3dad736bd30f5af4eSimon Atanasyan      .Default("");
88689d83ff23414240555f895d3dad736bd30f5af4eSimon Atanasyan  }
88789d83ff23414240555f895d3dad736bd30f5af4eSimon Atanasyan
88889d83ff23414240555f895d3dad736bd30f5af4eSimon Atanasyan  // FIXME: Warn on inconsistent cpu and abi usage.
889a2768be144256f9eb721bef8b751e56e0b64fa0bSimon Atanasyan}
890a2768be144256f9eb721bef8b751e56e0b64fa0bSimon Atanasyan
891e9616a4972a4c2fdc28128c057f21d7a79516c86Simon Atanasyan// Convert ABI name to the GNU tools acceptable variant.
892e9616a4972a4c2fdc28128c057f21d7a79516c86Simon Atanasyanstatic StringRef getGnuCompatibleMipsABIName(StringRef ABI) {
893e9616a4972a4c2fdc28128c057f21d7a79516c86Simon Atanasyan  return llvm::StringSwitch<llvm::StringRef>(ABI)
894e9616a4972a4c2fdc28128c057f21d7a79516c86Simon Atanasyan    .Case("o32", "32")
895e9616a4972a4c2fdc28128c057f21d7a79516c86Simon Atanasyan    .Case("n64", "64")
896e9616a4972a4c2fdc28128c057f21d7a79516c86Simon Atanasyan    .Default(ABI);
897e9616a4972a4c2fdc28128c057f21d7a79516c86Simon Atanasyan}
898e9616a4972a4c2fdc28128c057f21d7a79516c86Simon Atanasyan
8995e62779634ba002d7112a66efc8e075de9b8a3f1Simon Atanasyan// Select the MIPS float ABI as determined by -msoft-float, -mhard-float,
9005e62779634ba002d7112a66efc8e075de9b8a3f1Simon Atanasyan// and -mfloat-abi=.
9015e62779634ba002d7112a66efc8e075de9b8a3f1Simon Atanasyanstatic StringRef getMipsFloatABI(const Driver &D, const ArgList &Args) {
902ad8d8a31b010ceac4cad2553f16fc1a77c4b2e5eAkira Hatanaka  // Select the float ABI as determined by -msoft-float, -mhard-float,
903ad8d8a31b010ceac4cad2553f16fc1a77c4b2e5eAkira Hatanaka  // and -mfloat-abi=.
9045f9e272e632e951b1efe824cd16acb4d96077930Chris Lattner  StringRef FloatABI;
905ed734737d5af31906e30e537d4a41c760ddcfc59Eric Christopher  if (Arg *A = Args.getLastArg(options::OPT_msoft_float,
906ad8d8a31b010ceac4cad2553f16fc1a77c4b2e5eAkira Hatanaka                               options::OPT_mhard_float,
907ad8d8a31b010ceac4cad2553f16fc1a77c4b2e5eAkira Hatanaka                               options::OPT_mfloat_abi_EQ)) {
908ed734737d5af31906e30e537d4a41c760ddcfc59Eric Christopher    if (A->getOption().matches(options::OPT_msoft_float))
909ed734737d5af31906e30e537d4a41c760ddcfc59Eric Christopher      FloatABI = "soft";
910ed734737d5af31906e30e537d4a41c760ddcfc59Eric Christopher    else if (A->getOption().matches(options::OPT_mhard_float))
911ed734737d5af31906e30e537d4a41c760ddcfc59Eric Christopher      FloatABI = "hard";
912ad8d8a31b010ceac4cad2553f16fc1a77c4b2e5eAkira Hatanaka    else {
9131d489cf4a04ad0ad8ac2696e4eed0995f3a67288Richard Smith      FloatABI = A->getValue();
914ad8d8a31b010ceac4cad2553f16fc1a77c4b2e5eAkira Hatanaka      if (FloatABI != "soft" && FloatABI != "single" && FloatABI != "hard") {
9155e62779634ba002d7112a66efc8e075de9b8a3f1Simon Atanasyan        D.Diag(diag::err_drv_invalid_mfloat_abi) << A->getAsString(Args);
916ad8d8a31b010ceac4cad2553f16fc1a77c4b2e5eAkira Hatanaka        FloatABI = "hard";
917ad8d8a31b010ceac4cad2553f16fc1a77c4b2e5eAkira Hatanaka      }
918ad8d8a31b010ceac4cad2553f16fc1a77c4b2e5eAkira Hatanaka    }
919ed734737d5af31906e30e537d4a41c760ddcfc59Eric Christopher  }
920ed734737d5af31906e30e537d4a41c760ddcfc59Eric Christopher
921ed734737d5af31906e30e537d4a41c760ddcfc59Eric Christopher  // If unspecified, choose the default based on the platform.
922ed734737d5af31906e30e537d4a41c760ddcfc59Eric Christopher  if (FloatABI.empty()) {
923ad8d8a31b010ceac4cad2553f16fc1a77c4b2e5eAkira Hatanaka    // Assume "hard", because it's a default value used by gcc.
924ad8d8a31b010ceac4cad2553f16fc1a77c4b2e5eAkira Hatanaka    // When we start to recognize specific target MIPS processors,
925ad8d8a31b010ceac4cad2553f16fc1a77c4b2e5eAkira Hatanaka    // we will be able to select the default more correctly.
926ad8d8a31b010ceac4cad2553f16fc1a77c4b2e5eAkira Hatanaka    FloatABI = "hard";
927ed734737d5af31906e30e537d4a41c760ddcfc59Eric Christopher  }
928ed734737d5af31906e30e537d4a41c760ddcfc59Eric Christopher
9295e62779634ba002d7112a66efc8e075de9b8a3f1Simon Atanasyan  return FloatABI;
9305e62779634ba002d7112a66efc8e075de9b8a3f1Simon Atanasyan}
9315e62779634ba002d7112a66efc8e075de9b8a3f1Simon Atanasyan
932dc536f55c0c85df7644592c69434b7b191d73dc8Simon Atanasyanstatic void AddTargetFeature(const ArgList &Args,
933dc536f55c0c85df7644592c69434b7b191d73dc8Simon Atanasyan                             ArgStringList &CmdArgs,
934dc536f55c0c85df7644592c69434b7b191d73dc8Simon Atanasyan                             OptSpecifier OnOpt,
935dc536f55c0c85df7644592c69434b7b191d73dc8Simon Atanasyan                             OptSpecifier OffOpt,
936dc536f55c0c85df7644592c69434b7b191d73dc8Simon Atanasyan                             StringRef FeatureName) {
937dc536f55c0c85df7644592c69434b7b191d73dc8Simon Atanasyan  if (Arg *A = Args.getLastArg(OnOpt, OffOpt)) {
938dc536f55c0c85df7644592c69434b7b191d73dc8Simon Atanasyan    CmdArgs.push_back("-target-feature");
939dc536f55c0c85df7644592c69434b7b191d73dc8Simon Atanasyan    if (A->getOption().matches(OnOpt))
940dc536f55c0c85df7644592c69434b7b191d73dc8Simon Atanasyan      CmdArgs.push_back(Args.MakeArgString("+" + FeatureName));
941dc536f55c0c85df7644592c69434b7b191d73dc8Simon Atanasyan    else
942dc536f55c0c85df7644592c69434b7b191d73dc8Simon Atanasyan      CmdArgs.push_back(Args.MakeArgString("-" + FeatureName));
943dc536f55c0c85df7644592c69434b7b191d73dc8Simon Atanasyan  }
944dc536f55c0c85df7644592c69434b7b191d73dc8Simon Atanasyan}
945dc536f55c0c85df7644592c69434b7b191d73dc8Simon Atanasyan
9465e62779634ba002d7112a66efc8e075de9b8a3f1Simon Atanasyanvoid Clang::AddMIPSTargetArgs(const ArgList &Args,
9475e62779634ba002d7112a66efc8e075de9b8a3f1Simon Atanasyan                             ArgStringList &CmdArgs) const {
9485e62779634ba002d7112a66efc8e075de9b8a3f1Simon Atanasyan  const Driver &D = getToolChain().getDriver();
9495e62779634ba002d7112a66efc8e075de9b8a3f1Simon Atanasyan  StringRef CPUName;
9505e62779634ba002d7112a66efc8e075de9b8a3f1Simon Atanasyan  StringRef ABIName;
9515e62779634ba002d7112a66efc8e075de9b8a3f1Simon Atanasyan  getMipsCPUAndABI(Args, getToolChain(), CPUName, ABIName);
9525e62779634ba002d7112a66efc8e075de9b8a3f1Simon Atanasyan
9535e62779634ba002d7112a66efc8e075de9b8a3f1Simon Atanasyan  CmdArgs.push_back("-target-cpu");
9545e62779634ba002d7112a66efc8e075de9b8a3f1Simon Atanasyan  CmdArgs.push_back(CPUName.data());
9555e62779634ba002d7112a66efc8e075de9b8a3f1Simon Atanasyan
9565e62779634ba002d7112a66efc8e075de9b8a3f1Simon Atanasyan  CmdArgs.push_back("-target-abi");
9575e62779634ba002d7112a66efc8e075de9b8a3f1Simon Atanasyan  CmdArgs.push_back(ABIName.data());
9585e62779634ba002d7112a66efc8e075de9b8a3f1Simon Atanasyan
9595e62779634ba002d7112a66efc8e075de9b8a3f1Simon Atanasyan  StringRef FloatABI = getMipsFloatABI(D, Args);
9605e62779634ba002d7112a66efc8e075de9b8a3f1Simon Atanasyan
961e1d792f0ee02b5beb4b8e94506b3a0c353df43ddSimon Atanasyan  bool IsMips16 = Args.getLastArg(options::OPT_mips16) != NULL;
962e1d792f0ee02b5beb4b8e94506b3a0c353df43ddSimon Atanasyan
963e1d792f0ee02b5beb4b8e94506b3a0c353df43ddSimon Atanasyan  if (FloatABI == "soft" || (FloatABI == "hard" && IsMips16)) {
964ed734737d5af31906e30e537d4a41c760ddcfc59Eric Christopher    // Floating point operations and argument passing are soft.
965ed734737d5af31906e30e537d4a41c760ddcfc59Eric Christopher    CmdArgs.push_back("-msoft-float");
966ad8d8a31b010ceac4cad2553f16fc1a77c4b2e5eAkira Hatanaka    CmdArgs.push_back("-mfloat-abi");
967ad8d8a31b010ceac4cad2553f16fc1a77c4b2e5eAkira Hatanaka    CmdArgs.push_back("soft");
968ad8d8a31b010ceac4cad2553f16fc1a77c4b2e5eAkira Hatanaka
969ad8d8a31b010ceac4cad2553f16fc1a77c4b2e5eAkira Hatanaka    // FIXME: Note, this is a hack. We need to pass the selected float
970ad8d8a31b010ceac4cad2553f16fc1a77c4b2e5eAkira Hatanaka    // mode to the MipsTargetInfoBase to define appropriate macros there.
971ad8d8a31b010ceac4cad2553f16fc1a77c4b2e5eAkira Hatanaka    // Now it is the only method.
972ad8d8a31b010ceac4cad2553f16fc1a77c4b2e5eAkira Hatanaka    CmdArgs.push_back("-target-feature");
973ad8d8a31b010ceac4cad2553f16fc1a77c4b2e5eAkira Hatanaka    CmdArgs.push_back("+soft-float");
974e1d792f0ee02b5beb4b8e94506b3a0c353df43ddSimon Atanasyan
975e1d792f0ee02b5beb4b8e94506b3a0c353df43ddSimon Atanasyan    if (FloatABI == "hard" && IsMips16) {
976e1d792f0ee02b5beb4b8e94506b3a0c353df43ddSimon Atanasyan      CmdArgs.push_back("-mllvm");
977e1d792f0ee02b5beb4b8e94506b3a0c353df43ddSimon Atanasyan      CmdArgs.push_back("-mips16-hard-float");
978e1d792f0ee02b5beb4b8e94506b3a0c353df43ddSimon Atanasyan    }
979ad8d8a31b010ceac4cad2553f16fc1a77c4b2e5eAkira Hatanaka  }
980ad8d8a31b010ceac4cad2553f16fc1a77c4b2e5eAkira Hatanaka  else if (FloatABI == "single") {
981ad8d8a31b010ceac4cad2553f16fc1a77c4b2e5eAkira Hatanaka    // Restrict the use of hardware floating-point
982ad8d8a31b010ceac4cad2553f16fc1a77c4b2e5eAkira Hatanaka    // instructions to 32-bit operations.
983ad8d8a31b010ceac4cad2553f16fc1a77c4b2e5eAkira Hatanaka    CmdArgs.push_back("-target-feature");
984ad8d8a31b010ceac4cad2553f16fc1a77c4b2e5eAkira Hatanaka    CmdArgs.push_back("+single-float");
985ad8d8a31b010ceac4cad2553f16fc1a77c4b2e5eAkira Hatanaka  }
986ad8d8a31b010ceac4cad2553f16fc1a77c4b2e5eAkira Hatanaka  else {
987ad8d8a31b010ceac4cad2553f16fc1a77c4b2e5eAkira Hatanaka    // Floating point operations and argument passing are hard.
988ed734737d5af31906e30e537d4a41c760ddcfc59Eric Christopher    assert(FloatABI == "hard" && "Invalid float abi!");
989ad8d8a31b010ceac4cad2553f16fc1a77c4b2e5eAkira Hatanaka    CmdArgs.push_back("-mfloat-abi");
990ad8d8a31b010ceac4cad2553f16fc1a77c4b2e5eAkira Hatanaka    CmdArgs.push_back("hard");
991ed734737d5af31906e30e537d4a41c760ddcfc59Eric Christopher  }
9920b273efa37a38deab77dadf72540c9c07c63f8cfSimon Atanasyan
993dc536f55c0c85df7644592c69434b7b191d73dc8Simon Atanasyan  AddTargetFeature(Args, CmdArgs,
994dc536f55c0c85df7644592c69434b7b191d73dc8Simon Atanasyan                   options::OPT_mips16, options::OPT_mno_mips16,
995dc536f55c0c85df7644592c69434b7b191d73dc8Simon Atanasyan                   "mips16");
996d797a85866fd5ce62850dd145396b451364032a3Simon Atanasyan  AddTargetFeature(Args, CmdArgs,
997d797a85866fd5ce62850dd145396b451364032a3Simon Atanasyan                   options::OPT_mdsp, options::OPT_mno_dsp,
998d797a85866fd5ce62850dd145396b451364032a3Simon Atanasyan                   "dsp");
999d797a85866fd5ce62850dd145396b451364032a3Simon Atanasyan  AddTargetFeature(Args, CmdArgs,
1000d797a85866fd5ce62850dd145396b451364032a3Simon Atanasyan                   options::OPT_mdspr2, options::OPT_mno_dspr2,
1001d797a85866fd5ce62850dd145396b451364032a3Simon Atanasyan                   "dspr2");
10029804b761a9743c8248864e94018e4dc26577d471Simon Atanasyan
1003bda07ace55e40bd1a620051156fa9b13ad3936aaSimon Atanasyan  if (Arg *A = Args.getLastArg(options::OPT_mxgot, options::OPT_mno_xgot)) {
1004bda07ace55e40bd1a620051156fa9b13ad3936aaSimon Atanasyan    if (A->getOption().matches(options::OPT_mxgot)) {
1005bda07ace55e40bd1a620051156fa9b13ad3936aaSimon Atanasyan      CmdArgs.push_back("-mllvm");
1006bda07ace55e40bd1a620051156fa9b13ad3936aaSimon Atanasyan      CmdArgs.push_back("-mxgot");
1007bda07ace55e40bd1a620051156fa9b13ad3936aaSimon Atanasyan    }
1008bda07ace55e40bd1a620051156fa9b13ad3936aaSimon Atanasyan  }
1009bda07ace55e40bd1a620051156fa9b13ad3936aaSimon Atanasyan
10109804b761a9743c8248864e94018e4dc26577d471Simon Atanasyan  if (Arg *A = Args.getLastArg(options::OPT_G)) {
10111d489cf4a04ad0ad8ac2696e4eed0995f3a67288Richard Smith    StringRef v = A->getValue();
10129804b761a9743c8248864e94018e4dc26577d471Simon Atanasyan    CmdArgs.push_back("-mllvm");
10139804b761a9743c8248864e94018e4dc26577d471Simon Atanasyan    CmdArgs.push_back(Args.MakeArgString("-mips-ssection-threshold=" + v));
10149804b761a9743c8248864e94018e4dc26577d471Simon Atanasyan    A->claim();
10159804b761a9743c8248864e94018e4dc26577d471Simon Atanasyan  }
1016ed734737d5af31906e30e537d4a41c760ddcfc59Eric Christopher}
1017ed734737d5af31906e30e537d4a41c760ddcfc59Eric Christopher
101802a84277864e5476b12c0ec687ed09f0b2922471Hal Finkel/// getPPCTargetCPU - Get the (LLVM) name of the PowerPC cpu we are targeting.
101902a84277864e5476b12c0ec687ed09f0b2922471Hal Finkelstatic std::string getPPCTargetCPU(const ArgList &Args) {
102002a84277864e5476b12c0ec687ed09f0b2922471Hal Finkel  if (Arg *A = Args.getLastArg(options::OPT_mcpu_EQ)) {
10211d489cf4a04ad0ad8ac2696e4eed0995f3a67288Richard Smith    StringRef CPUName = A->getValue();
102202a84277864e5476b12c0ec687ed09f0b2922471Hal Finkel
102302a84277864e5476b12c0ec687ed09f0b2922471Hal Finkel    if (CPUName == "native") {
102402a84277864e5476b12c0ec687ed09f0b2922471Hal Finkel      std::string CPU = llvm::sys::getHostCPUName();
102502a84277864e5476b12c0ec687ed09f0b2922471Hal Finkel      if (!CPU.empty() && CPU != "generic")
102602a84277864e5476b12c0ec687ed09f0b2922471Hal Finkel        return CPU;
102702a84277864e5476b12c0ec687ed09f0b2922471Hal Finkel      else
102802a84277864e5476b12c0ec687ed09f0b2922471Hal Finkel        return "";
102902a84277864e5476b12c0ec687ed09f0b2922471Hal Finkel    }
103002a84277864e5476b12c0ec687ed09f0b2922471Hal Finkel
103102a84277864e5476b12c0ec687ed09f0b2922471Hal Finkel    return llvm::StringSwitch<const char *>(CPUName)
103202a84277864e5476b12c0ec687ed09f0b2922471Hal Finkel      .Case("common", "generic")
103302a84277864e5476b12c0ec687ed09f0b2922471Hal Finkel      .Case("440", "440")
103402a84277864e5476b12c0ec687ed09f0b2922471Hal Finkel      .Case("440fp", "440")
103502a84277864e5476b12c0ec687ed09f0b2922471Hal Finkel      .Case("450", "450")
103602a84277864e5476b12c0ec687ed09f0b2922471Hal Finkel      .Case("601", "601")
103702a84277864e5476b12c0ec687ed09f0b2922471Hal Finkel      .Case("602", "602")
103802a84277864e5476b12c0ec687ed09f0b2922471Hal Finkel      .Case("603", "603")
103902a84277864e5476b12c0ec687ed09f0b2922471Hal Finkel      .Case("603e", "603e")
104002a84277864e5476b12c0ec687ed09f0b2922471Hal Finkel      .Case("603ev", "603ev")
104102a84277864e5476b12c0ec687ed09f0b2922471Hal Finkel      .Case("604", "604")
104202a84277864e5476b12c0ec687ed09f0b2922471Hal Finkel      .Case("604e", "604e")
104302a84277864e5476b12c0ec687ed09f0b2922471Hal Finkel      .Case("620", "620")
10442821e180094459cbdef37e7d7c12bb406d5b82baBill Schmidt      .Case("630", "pwr3")
104502a84277864e5476b12c0ec687ed09f0b2922471Hal Finkel      .Case("G3", "g3")
104602a84277864e5476b12c0ec687ed09f0b2922471Hal Finkel      .Case("7400", "7400")
104702a84277864e5476b12c0ec687ed09f0b2922471Hal Finkel      .Case("G4", "g4")
104802a84277864e5476b12c0ec687ed09f0b2922471Hal Finkel      .Case("7450", "7450")
104902a84277864e5476b12c0ec687ed09f0b2922471Hal Finkel      .Case("G4+", "g4+")
105002a84277864e5476b12c0ec687ed09f0b2922471Hal Finkel      .Case("750", "750")
105102a84277864e5476b12c0ec687ed09f0b2922471Hal Finkel      .Case("970", "970")
105202a84277864e5476b12c0ec687ed09f0b2922471Hal Finkel      .Case("G5", "g5")
105302a84277864e5476b12c0ec687ed09f0b2922471Hal Finkel      .Case("a2", "a2")
10545ccd3d0214b9d765a1bb41872da27d3c5530ab2bHal Finkel      .Case("a2q", "a2q")
10557de32964026e4c5ff32cbca484ffb24e73393d87Hal Finkel      .Case("e500mc", "e500mc")
10567de32964026e4c5ff32cbca484ffb24e73393d87Hal Finkel      .Case("e5500", "e5500")
10572821e180094459cbdef37e7d7c12bb406d5b82baBill Schmidt      .Case("power3", "pwr3")
10582821e180094459cbdef37e7d7c12bb406d5b82baBill Schmidt      .Case("power4", "pwr4")
10592821e180094459cbdef37e7d7c12bb406d5b82baBill Schmidt      .Case("power5", "pwr5")
10602821e180094459cbdef37e7d7c12bb406d5b82baBill Schmidt      .Case("power5x", "pwr5x")
106102a84277864e5476b12c0ec687ed09f0b2922471Hal Finkel      .Case("power6", "pwr6")
10622821e180094459cbdef37e7d7c12bb406d5b82baBill Schmidt      .Case("power6x", "pwr6x")
106302a84277864e5476b12c0ec687ed09f0b2922471Hal Finkel      .Case("power7", "pwr7")
10642821e180094459cbdef37e7d7c12bb406d5b82baBill Schmidt      .Case("pwr3", "pwr3")
10652821e180094459cbdef37e7d7c12bb406d5b82baBill Schmidt      .Case("pwr4", "pwr4")
10662821e180094459cbdef37e7d7c12bb406d5b82baBill Schmidt      .Case("pwr5", "pwr5")
10672821e180094459cbdef37e7d7c12bb406d5b82baBill Schmidt      .Case("pwr5x", "pwr5x")
10682821e180094459cbdef37e7d7c12bb406d5b82baBill Schmidt      .Case("pwr6", "pwr6")
10692821e180094459cbdef37e7d7c12bb406d5b82baBill Schmidt      .Case("pwr6x", "pwr6x")
10702821e180094459cbdef37e7d7c12bb406d5b82baBill Schmidt      .Case("pwr7", "pwr7")
107102a84277864e5476b12c0ec687ed09f0b2922471Hal Finkel      .Case("powerpc", "ppc")
107202a84277864e5476b12c0ec687ed09f0b2922471Hal Finkel      .Case("powerpc64", "ppc64")
107302a84277864e5476b12c0ec687ed09f0b2922471Hal Finkel      .Default("");
107402a84277864e5476b12c0ec687ed09f0b2922471Hal Finkel  }
107502a84277864e5476b12c0ec687ed09f0b2922471Hal Finkel
107602a84277864e5476b12c0ec687ed09f0b2922471Hal Finkel  return "";
107702a84277864e5476b12c0ec687ed09f0b2922471Hal Finkel}
107802a84277864e5476b12c0ec687ed09f0b2922471Hal Finkel
107902a84277864e5476b12c0ec687ed09f0b2922471Hal Finkelvoid Clang::AddPPCTargetArgs(const ArgList &Args,
108002a84277864e5476b12c0ec687ed09f0b2922471Hal Finkel                             ArgStringList &CmdArgs) const {
108102a84277864e5476b12c0ec687ed09f0b2922471Hal Finkel  std::string TargetCPUName = getPPCTargetCPU(Args);
108202a84277864e5476b12c0ec687ed09f0b2922471Hal Finkel
108302a84277864e5476b12c0ec687ed09f0b2922471Hal Finkel  // LLVM may default to generating code for the native CPU,
108402a84277864e5476b12c0ec687ed09f0b2922471Hal Finkel  // but, like gcc, we default to a more generic option for
108502a84277864e5476b12c0ec687ed09f0b2922471Hal Finkel  // each architecture. (except on Darwin)
108602a84277864e5476b12c0ec687ed09f0b2922471Hal Finkel  llvm::Triple Triple = getToolChain().getTriple();
108702a84277864e5476b12c0ec687ed09f0b2922471Hal Finkel  if (TargetCPUName.empty() && !Triple.isOSDarwin()) {
108802a84277864e5476b12c0ec687ed09f0b2922471Hal Finkel    if (Triple.getArch() == llvm::Triple::ppc64)
108902a84277864e5476b12c0ec687ed09f0b2922471Hal Finkel      TargetCPUName = "ppc64";
109002a84277864e5476b12c0ec687ed09f0b2922471Hal Finkel    else
109102a84277864e5476b12c0ec687ed09f0b2922471Hal Finkel      TargetCPUName = "ppc";
109202a84277864e5476b12c0ec687ed09f0b2922471Hal Finkel  }
109302a84277864e5476b12c0ec687ed09f0b2922471Hal Finkel
109402a84277864e5476b12c0ec687ed09f0b2922471Hal Finkel  if (!TargetCPUName.empty()) {
109502a84277864e5476b12c0ec687ed09f0b2922471Hal Finkel    CmdArgs.push_back("-target-cpu");
109602a84277864e5476b12c0ec687ed09f0b2922471Hal Finkel    CmdArgs.push_back(Args.MakeArgString(TargetCPUName.c_str()));
109702a84277864e5476b12c0ec687ed09f0b2922471Hal Finkel  }
1098199402b9e081dedc28e19ab6e727470b34f2f64dBill Schmidt
1099199402b9e081dedc28e19ab6e727470b34f2f64dBill Schmidt  // Allow override of the Altivec feature.
1100199402b9e081dedc28e19ab6e727470b34f2f64dBill Schmidt  if (Args.hasFlag(options::OPT_fno_altivec, options::OPT_faltivec, false)) {
1101199402b9e081dedc28e19ab6e727470b34f2f64dBill Schmidt    CmdArgs.push_back("-target-feature");
1102199402b9e081dedc28e19ab6e727470b34f2f64dBill Schmidt    CmdArgs.push_back("-altivec");
1103199402b9e081dedc28e19ab6e727470b34f2f64dBill Schmidt  }
11043c6aaeb26202b41173dd9ea982833fe975147d80Hal Finkel
11053c6aaeb26202b41173dd9ea982833fe975147d80Hal Finkel  if (Args.hasFlag(options::OPT_mno_qpx, options::OPT_mqpx, false)) {
11063c6aaeb26202b41173dd9ea982833fe975147d80Hal Finkel    CmdArgs.push_back("-target-feature");
11073c6aaeb26202b41173dd9ea982833fe975147d80Hal Finkel    CmdArgs.push_back("-qpx");
11083c6aaeb26202b41173dd9ea982833fe975147d80Hal Finkel  }
110902a84277864e5476b12c0ec687ed09f0b2922471Hal Finkel}
111002a84277864e5476b12c0ec687ed09f0b2922471Hal Finkel
11119284d215022457ba867080a713f08f026d89ea17Bruno Cardoso Lopesvoid Clang::AddSparcTargetArgs(const ArgList &Args,
11129284d215022457ba867080a713f08f026d89ea17Bruno Cardoso Lopes                             ArgStringList &CmdArgs) const {
11139284d215022457ba867080a713f08f026d89ea17Bruno Cardoso Lopes  const Driver &D = getToolChain().getDriver();
11149284d215022457ba867080a713f08f026d89ea17Bruno Cardoso Lopes
11159284d215022457ba867080a713f08f026d89ea17Bruno Cardoso Lopes  if (const Arg *A = Args.getLastArg(options::OPT_march_EQ)) {
11169284d215022457ba867080a713f08f026d89ea17Bruno Cardoso Lopes    CmdArgs.push_back("-target-cpu");
11171d489cf4a04ad0ad8ac2696e4eed0995f3a67288Richard Smith    CmdArgs.push_back(A->getValue());
11189284d215022457ba867080a713f08f026d89ea17Bruno Cardoso Lopes  }
11199284d215022457ba867080a713f08f026d89ea17Bruno Cardoso Lopes
11209284d215022457ba867080a713f08f026d89ea17Bruno Cardoso Lopes  // Select the float ABI as determined by -msoft-float, -mhard-float, and
11215f9e272e632e951b1efe824cd16acb4d96077930Chris Lattner  StringRef FloatABI;
11229284d215022457ba867080a713f08f026d89ea17Bruno Cardoso Lopes  if (Arg *A = Args.getLastArg(options::OPT_msoft_float,
11239284d215022457ba867080a713f08f026d89ea17Bruno Cardoso Lopes                               options::OPT_mhard_float)) {
11249284d215022457ba867080a713f08f026d89ea17Bruno Cardoso Lopes    if (A->getOption().matches(options::OPT_msoft_float))
11259284d215022457ba867080a713f08f026d89ea17Bruno Cardoso Lopes      FloatABI = "soft";
11269284d215022457ba867080a713f08f026d89ea17Bruno Cardoso Lopes    else if (A->getOption().matches(options::OPT_mhard_float))
11279284d215022457ba867080a713f08f026d89ea17Bruno Cardoso Lopes      FloatABI = "hard";
11289284d215022457ba867080a713f08f026d89ea17Bruno Cardoso Lopes  }
11299284d215022457ba867080a713f08f026d89ea17Bruno Cardoso Lopes
11309284d215022457ba867080a713f08f026d89ea17Bruno Cardoso Lopes  // If unspecified, choose the default based on the platform.
11319284d215022457ba867080a713f08f026d89ea17Bruno Cardoso Lopes  if (FloatABI.empty()) {
11329284d215022457ba867080a713f08f026d89ea17Bruno Cardoso Lopes    switch (getToolChain().getTriple().getOS()) {
11339284d215022457ba867080a713f08f026d89ea17Bruno Cardoso Lopes    default:
11349284d215022457ba867080a713f08f026d89ea17Bruno Cardoso Lopes      // Assume "soft", but warn the user we are guessing.
11359284d215022457ba867080a713f08f026d89ea17Bruno Cardoso Lopes      FloatABI = "soft";
11365f9e272e632e951b1efe824cd16acb4d96077930Chris Lattner      D.Diag(diag::warn_drv_assuming_mfloat_abi_is) << "soft";
11379284d215022457ba867080a713f08f026d89ea17Bruno Cardoso Lopes      break;
11389284d215022457ba867080a713f08f026d89ea17Bruno Cardoso Lopes    }
11399284d215022457ba867080a713f08f026d89ea17Bruno Cardoso Lopes  }
11409284d215022457ba867080a713f08f026d89ea17Bruno Cardoso Lopes
11419284d215022457ba867080a713f08f026d89ea17Bruno Cardoso Lopes  if (FloatABI == "soft") {
11429284d215022457ba867080a713f08f026d89ea17Bruno Cardoso Lopes    // Floating point operations and argument passing are soft.
11439284d215022457ba867080a713f08f026d89ea17Bruno Cardoso Lopes    //
11449284d215022457ba867080a713f08f026d89ea17Bruno Cardoso Lopes    // FIXME: This changes CPP defines, we need -target-soft-float.
11459284d215022457ba867080a713f08f026d89ea17Bruno Cardoso Lopes    CmdArgs.push_back("-msoft-float");
11469284d215022457ba867080a713f08f026d89ea17Bruno Cardoso Lopes    CmdArgs.push_back("-target-feature");
11479284d215022457ba867080a713f08f026d89ea17Bruno Cardoso Lopes    CmdArgs.push_back("+soft-float");
11489284d215022457ba867080a713f08f026d89ea17Bruno Cardoso Lopes  } else {
11499284d215022457ba867080a713f08f026d89ea17Bruno Cardoso Lopes    assert(FloatABI == "hard" && "Invalid float abi!");
11509284d215022457ba867080a713f08f026d89ea17Bruno Cardoso Lopes    CmdArgs.push_back("-mhard-float");
11519284d215022457ba867080a713f08f026d89ea17Bruno Cardoso Lopes  }
11529284d215022457ba867080a713f08f026d89ea17Bruno Cardoso Lopes}
11539284d215022457ba867080a713f08f026d89ea17Bruno Cardoso Lopes
1154700d4e44793697288dd827c272ad363945f590a9Chandler Carruthstatic const char *getX86TargetCPU(const ArgList &Args,
1155700d4e44793697288dd827c272ad363945f590a9Chandler Carruth                                   const llvm::Triple &Triple) {
1156700d4e44793697288dd827c272ad363945f590a9Chandler Carruth  if (const Arg *A = Args.getLastArg(options::OPT_march_EQ)) {
1157700d4e44793697288dd827c272ad363945f590a9Chandler Carruth    if (StringRef(A->getValue()) != "native")
1158700d4e44793697288dd827c272ad363945f590a9Chandler Carruth      return A->getValue();
1159700d4e44793697288dd827c272ad363945f590a9Chandler Carruth
1160700d4e44793697288dd827c272ad363945f590a9Chandler Carruth    // FIXME: Reject attempts to use -march=native unless the target matches
1161700d4e44793697288dd827c272ad363945f590a9Chandler Carruth    // the host.
1162700d4e44793697288dd827c272ad363945f590a9Chandler Carruth    //
1163700d4e44793697288dd827c272ad363945f590a9Chandler Carruth    // FIXME: We should also incorporate the detected target features for use
1164700d4e44793697288dd827c272ad363945f590a9Chandler Carruth    // with -native.
1165700d4e44793697288dd827c272ad363945f590a9Chandler Carruth    std::string CPU = llvm::sys::getHostCPUName();
1166700d4e44793697288dd827c272ad363945f590a9Chandler Carruth    if (!CPU.empty() && CPU != "generic")
1167700d4e44793697288dd827c272ad363945f590a9Chandler Carruth      return Args.MakeArgString(CPU);
1168700d4e44793697288dd827c272ad363945f590a9Chandler Carruth  }
1169700d4e44793697288dd827c272ad363945f590a9Chandler Carruth
1170700d4e44793697288dd827c272ad363945f590a9Chandler Carruth  // Select the default CPU if none was given (or detection failed).
1171700d4e44793697288dd827c272ad363945f590a9Chandler Carruth
1172700d4e44793697288dd827c272ad363945f590a9Chandler Carruth  if (Triple.getArch() != llvm::Triple::x86_64 &&
1173700d4e44793697288dd827c272ad363945f590a9Chandler Carruth      Triple.getArch() != llvm::Triple::x86)
1174700d4e44793697288dd827c272ad363945f590a9Chandler Carruth    return 0; // This routine is only handling x86 targets.
1175700d4e44793697288dd827c272ad363945f590a9Chandler Carruth
1176700d4e44793697288dd827c272ad363945f590a9Chandler Carruth  bool Is64Bit = Triple.getArch() == llvm::Triple::x86_64;
1177700d4e44793697288dd827c272ad363945f590a9Chandler Carruth
1178700d4e44793697288dd827c272ad363945f590a9Chandler Carruth  // FIXME: Need target hooks.
1179700d4e44793697288dd827c272ad363945f590a9Chandler Carruth  if (Triple.isOSDarwin())
1180700d4e44793697288dd827c272ad363945f590a9Chandler Carruth    return Is64Bit ? "core2" : "yonah";
1181700d4e44793697288dd827c272ad363945f590a9Chandler Carruth
1182700d4e44793697288dd827c272ad363945f590a9Chandler Carruth  // Everything else goes to x86-64 in 64-bit mode.
1183700d4e44793697288dd827c272ad363945f590a9Chandler Carruth  if (Is64Bit)
1184700d4e44793697288dd827c272ad363945f590a9Chandler Carruth    return "x86-64";
1185700d4e44793697288dd827c272ad363945f590a9Chandler Carruth
1186700d4e44793697288dd827c272ad363945f590a9Chandler Carruth  if (Triple.getOSName().startswith("haiku"))
1187700d4e44793697288dd827c272ad363945f590a9Chandler Carruth    return "i586";
1188700d4e44793697288dd827c272ad363945f590a9Chandler Carruth  if (Triple.getOSName().startswith("openbsd"))
1189700d4e44793697288dd827c272ad363945f590a9Chandler Carruth    return "i486";
1190700d4e44793697288dd827c272ad363945f590a9Chandler Carruth  if (Triple.getOSName().startswith("bitrig"))
1191700d4e44793697288dd827c272ad363945f590a9Chandler Carruth    return "i686";
1192700d4e44793697288dd827c272ad363945f590a9Chandler Carruth  if (Triple.getOSName().startswith("freebsd"))
1193700d4e44793697288dd827c272ad363945f590a9Chandler Carruth    return "i486";
1194700d4e44793697288dd827c272ad363945f590a9Chandler Carruth  if (Triple.getOSName().startswith("netbsd"))
1195700d4e44793697288dd827c272ad363945f590a9Chandler Carruth    return "i486";
1196700d4e44793697288dd827c272ad363945f590a9Chandler Carruth  // All x86 devices running Android have core2 as their common
1197700d4e44793697288dd827c272ad363945f590a9Chandler Carruth  // denominator. This makes a better choice than pentium4.
1198700d4e44793697288dd827c272ad363945f590a9Chandler Carruth  if (Triple.getEnvironment() == llvm::Triple::Android)
1199700d4e44793697288dd827c272ad363945f590a9Chandler Carruth    return "core2";
1200700d4e44793697288dd827c272ad363945f590a9Chandler Carruth
1201700d4e44793697288dd827c272ad363945f590a9Chandler Carruth  // Fallback to p4.
1202700d4e44793697288dd827c272ad363945f590a9Chandler Carruth  return "pentium4";
1203700d4e44793697288dd827c272ad363945f590a9Chandler Carruth}
1204700d4e44793697288dd827c272ad363945f590a9Chandler Carruth
12056acda16e9c194dcbd0dea64341e182bdb65d0f41Daniel Dunbarvoid Clang::AddX86TargetArgs(const ArgList &Args,
12066acda16e9c194dcbd0dea64341e182bdb65d0f41Daniel Dunbar                             ArgStringList &CmdArgs) const {
1207e6ad3f9fceef0ecc422ff26754ea069a5fd18c69Daniel Dunbar  if (!Args.hasFlag(options::OPT_mred_zone,
1208e6ad3f9fceef0ecc422ff26754ea069a5fd18c69Daniel Dunbar                    options::OPT_mno_red_zone,
1209e6ad3f9fceef0ecc422ff26754ea069a5fd18c69Daniel Dunbar                    true) ||
1210e6ad3f9fceef0ecc422ff26754ea069a5fd18c69Daniel Dunbar      Args.hasArg(options::OPT_mkernel) ||
1211e6ad3f9fceef0ecc422ff26754ea069a5fd18c69Daniel Dunbar      Args.hasArg(options::OPT_fapple_kext))
121266861e09d590994a8b941eaa328e4d8f33adec9eDaniel Dunbar    CmdArgs.push_back("-disable-red-zone");
1213e6ad3f9fceef0ecc422ff26754ea069a5fd18c69Daniel Dunbar
1214f0c5456d7d6a9f74281011297d86cb3b1fa53cc1Bob Wilson  // Default to avoid implicit floating-point for kernel/kext code, but allow
1215f0c5456d7d6a9f74281011297d86cb3b1fa53cc1Bob Wilson  // that to be overridden with -mno-soft-float.
1216f0c5456d7d6a9f74281011297d86cb3b1fa53cc1Bob Wilson  bool NoImplicitFloat = (Args.hasArg(options::OPT_mkernel) ||
1217f0c5456d7d6a9f74281011297d86cb3b1fa53cc1Bob Wilson                          Args.hasArg(options::OPT_fapple_kext));
1218f0c5456d7d6a9f74281011297d86cb3b1fa53cc1Bob Wilson  if (Arg *A = Args.getLastArg(options::OPT_msoft_float,
1219f0c5456d7d6a9f74281011297d86cb3b1fa53cc1Bob Wilson                               options::OPT_mno_soft_float,
1220f0c5456d7d6a9f74281011297d86cb3b1fa53cc1Bob Wilson                               options::OPT_mno_implicit_float)) {
1221f0c5456d7d6a9f74281011297d86cb3b1fa53cc1Bob Wilson    const Option &O = A->getOption();
1222f0c5456d7d6a9f74281011297d86cb3b1fa53cc1Bob Wilson    NoImplicitFloat = (O.matches(options::OPT_mno_implicit_float) ||
1223f0c5456d7d6a9f74281011297d86cb3b1fa53cc1Bob Wilson                       O.matches(options::OPT_msoft_float));
1224f0c5456d7d6a9f74281011297d86cb3b1fa53cc1Bob Wilson  }
1225f0c5456d7d6a9f74281011297d86cb3b1fa53cc1Bob Wilson  if (NoImplicitFloat)
122666861e09d590994a8b941eaa328e4d8f33adec9eDaniel Dunbar    CmdArgs.push_back("-no-implicit-float");
1227e6ad3f9fceef0ecc422ff26754ea069a5fd18c69Daniel Dunbar
1228700d4e44793697288dd827c272ad363945f590a9Chandler Carruth  if (const char *CPUName = getX86TargetCPU(Args, getToolChain().getTriple())) {
122938b48afd338d494099697d2611e1f45e558e469eDaniel Dunbar    CmdArgs.push_back("-target-cpu");
1230f86feddbd5b13d2c144132e35d608fa630784dbbDaniel Dunbar    CmdArgs.push_back(CPUName);
1231f86feddbd5b13d2c144132e35d608fa630784dbbDaniel Dunbar  }
1232f86feddbd5b13d2c144132e35d608fa630784dbbDaniel Dunbar
1233d18eecac712bfbf63372cb78940d662ce9017840Eli Friedman  // The required algorithm here is slightly strange: the options are applied
1234d18eecac712bfbf63372cb78940d662ce9017840Eli Friedman  // in order (so -mno-sse -msse2 disables SSE3), but any option that gets
1235d18eecac712bfbf63372cb78940d662ce9017840Eli Friedman  // directly overridden later is ignored (so "-mno-sse -msse2 -mno-sse2 -msse"
1236d18eecac712bfbf63372cb78940d662ce9017840Eli Friedman  // is equivalent to "-mno-sse2 -msse"). The -cc1 handling deals with the
1237d18eecac712bfbf63372cb78940d662ce9017840Eli Friedman  // former correctly, but not the latter; handle directly-overridden
1238d18eecac712bfbf63372cb78940d662ce9017840Eli Friedman  // attributes here.
1239d18eecac712bfbf63372cb78940d662ce9017840Eli Friedman  llvm::StringMap<unsigned> PrevFeature;
1240d18eecac712bfbf63372cb78940d662ce9017840Eli Friedman  std::vector<const char*> Features;
1241cdd9686b890ebdc10039ae256ef4c9dfb5ebacb7Daniel Dunbar  for (arg_iterator it = Args.filtered_begin(options::OPT_m_x86_Features_Group),
1242cdd9686b890ebdc10039ae256ef4c9dfb5ebacb7Daniel Dunbar         ie = Args.filtered_end(); it != ie; ++it) {
12435f9e272e632e951b1efe824cd16acb4d96077930Chris Lattner    StringRef Name = (*it)->getOption().getName();
12447e4953e5c60409007545288f14b430bd23d68570Daniel Dunbar    (*it)->claim();
12456acda16e9c194dcbd0dea64341e182bdb65d0f41Daniel Dunbar
1246cdd9686b890ebdc10039ae256ef4c9dfb5ebacb7Daniel Dunbar    // Skip over "-m".
1247c635710bcbb9598acd5a14647ba7ca28bee89a68Michael J. Spencer    assert(Name.startswith("m") && "Invalid feature name.");
1248c635710bcbb9598acd5a14647ba7ca28bee89a68Michael J. Spencer    Name = Name.substr(1);
12496acda16e9c194dcbd0dea64341e182bdb65d0f41Daniel Dunbar
1250cdd9686b890ebdc10039ae256ef4c9dfb5ebacb7Daniel Dunbar    bool IsNegative = Name.startswith("no-");
1251cdd9686b890ebdc10039ae256ef4c9dfb5ebacb7Daniel Dunbar    if (IsNegative)
1252cdd9686b890ebdc10039ae256ef4c9dfb5ebacb7Daniel Dunbar      Name = Name.substr(3);
12536acda16e9c194dcbd0dea64341e182bdb65d0f41Daniel Dunbar
1254d18eecac712bfbf63372cb78940d662ce9017840Eli Friedman    unsigned& Prev = PrevFeature[Name];
1255d18eecac712bfbf63372cb78940d662ce9017840Eli Friedman    if (Prev)
1256d18eecac712bfbf63372cb78940d662ce9017840Eli Friedman      Features[Prev - 1] = 0;
1257d18eecac712bfbf63372cb78940d662ce9017840Eli Friedman    Prev = Features.size() + 1;
1258d18eecac712bfbf63372cb78940d662ce9017840Eli Friedman    Features.push_back(Args.MakeArgString((IsNegative ? "-" : "+") + Name));
1259d18eecac712bfbf63372cb78940d662ce9017840Eli Friedman  }
1260d18eecac712bfbf63372cb78940d662ce9017840Eli Friedman  for (unsigned i = 0; i < Features.size(); i++) {
1261d18eecac712bfbf63372cb78940d662ce9017840Eli Friedman    if (Features[i]) {
1262d18eecac712bfbf63372cb78940d662ce9017840Eli Friedman      CmdArgs.push_back("-target-feature");
1263d18eecac712bfbf63372cb78940d662ce9017840Eli Friedman      CmdArgs.push_back(Features[i]);
1264d18eecac712bfbf63372cb78940d662ce9017840Eli Friedman    }
12656acda16e9c194dcbd0dea64341e182bdb65d0f41Daniel Dunbar  }
12666acda16e9c194dcbd0dea64341e182bdb65d0f41Daniel Dunbar}
12676acda16e9c194dcbd0dea64341e182bdb65d0f41Daniel Dunbar
126833c95f1178999ea06837769f90be8d7b8d57bb4dMatthew Curtisstatic inline bool HasPICArg(const ArgList &Args) {
126933c95f1178999ea06837769f90be8d7b8d57bb4dMatthew Curtis  return Args.hasArg(options::OPT_fPIC)
127033c95f1178999ea06837769f90be8d7b8d57bb4dMatthew Curtis    || Args.hasArg(options::OPT_fpic);
127133c95f1178999ea06837769f90be8d7b8d57bb4dMatthew Curtis}
127233c95f1178999ea06837769f90be8d7b8d57bb4dMatthew Curtis
127333c95f1178999ea06837769f90be8d7b8d57bb4dMatthew Curtisstatic Arg *GetLastSmallDataThresholdArg(const ArgList &Args) {
127433c95f1178999ea06837769f90be8d7b8d57bb4dMatthew Curtis  return Args.getLastArg(options::OPT_G,
127533c95f1178999ea06837769f90be8d7b8d57bb4dMatthew Curtis                         options::OPT_G_EQ,
127633c95f1178999ea06837769f90be8d7b8d57bb4dMatthew Curtis                         options::OPT_msmall_data_threshold_EQ);
127733c95f1178999ea06837769f90be8d7b8d57bb4dMatthew Curtis}
127833c95f1178999ea06837769f90be8d7b8d57bb4dMatthew Curtis
127933c95f1178999ea06837769f90be8d7b8d57bb4dMatthew Curtisstatic std::string GetHexagonSmallDataThresholdValue(const ArgList &Args) {
128033c95f1178999ea06837769f90be8d7b8d57bb4dMatthew Curtis  std::string value;
128133c95f1178999ea06837769f90be8d7b8d57bb4dMatthew Curtis  if (HasPICArg(Args))
128233c95f1178999ea06837769f90be8d7b8d57bb4dMatthew Curtis    value = "0";
128333c95f1178999ea06837769f90be8d7b8d57bb4dMatthew Curtis  else if (Arg *A = GetLastSmallDataThresholdArg(Args)) {
128433c95f1178999ea06837769f90be8d7b8d57bb4dMatthew Curtis    value = A->getValue();
128533c95f1178999ea06837769f90be8d7b8d57bb4dMatthew Curtis    A->claim();
128633c95f1178999ea06837769f90be8d7b8d57bb4dMatthew Curtis  }
128733c95f1178999ea06837769f90be8d7b8d57bb4dMatthew Curtis  return value;
128833c95f1178999ea06837769f90be8d7b8d57bb4dMatthew Curtis}
128933c95f1178999ea06837769f90be8d7b8d57bb4dMatthew Curtis
12909631939f82c0eaa6fb3936a0ce58a41adfbc9011Tony Linthicumvoid Clang::AddHexagonTargetArgs(const ArgList &Args,
12919631939f82c0eaa6fb3936a0ce58a41adfbc9011Tony Linthicum                                 ArgStringList &CmdArgs) const {
12929631939f82c0eaa6fb3936a0ce58a41adfbc9011Tony Linthicum  llvm::Triple Triple = getToolChain().getTriple();
12939631939f82c0eaa6fb3936a0ce58a41adfbc9011Tony Linthicum
12949631939f82c0eaa6fb3936a0ce58a41adfbc9011Tony Linthicum  CmdArgs.push_back("-target-cpu");
12956781415fa6d98aed548e84a70f1cd3ec31bba7d3Matthew Curtis  CmdArgs.push_back(Args.MakeArgString(
12966781415fa6d98aed548e84a70f1cd3ec31bba7d3Matthew Curtis                      "hexagon"
12976781415fa6d98aed548e84a70f1cd3ec31bba7d3Matthew Curtis                      + toolchains::Hexagon_TC::GetTargetCPU(Args)));
12989631939f82c0eaa6fb3936a0ce58a41adfbc9011Tony Linthicum  CmdArgs.push_back("-fno-signed-char");
12991dbaef5fe123c588ed6c995dd0a0b79c285433aeMatthew Curtis  CmdArgs.push_back("-mqdsp6-compat");
13001dbaef5fe123c588ed6c995dd0a0b79c285433aeMatthew Curtis  CmdArgs.push_back("-Wreturn-type");
13019631939f82c0eaa6fb3936a0ce58a41adfbc9011Tony Linthicum
130233c95f1178999ea06837769f90be8d7b8d57bb4dMatthew Curtis  std::string SmallDataThreshold = GetHexagonSmallDataThresholdValue(Args);
130333c95f1178999ea06837769f90be8d7b8d57bb4dMatthew Curtis  if (!SmallDataThreshold.empty()) {
13049631939f82c0eaa6fb3936a0ce58a41adfbc9011Tony Linthicum    CmdArgs.push_back ("-mllvm");
130533c95f1178999ea06837769f90be8d7b8d57bb4dMatthew Curtis    CmdArgs.push_back(Args.MakeArgString(
130633c95f1178999ea06837769f90be8d7b8d57bb4dMatthew Curtis                        "-hexagon-small-data-threshold=" + SmallDataThreshold));
13079631939f82c0eaa6fb3936a0ce58a41adfbc9011Tony Linthicum  }
13089631939f82c0eaa6fb3936a0ce58a41adfbc9011Tony Linthicum
13095f9688b7c7fdeafdf530056d49f82d2ec6ca457fSirish Pande  if (!Args.hasArg(options::OPT_fno_short_enums))
13105f9688b7c7fdeafdf530056d49f82d2ec6ca457fSirish Pande    CmdArgs.push_back("-fshort-enums");
13115f9688b7c7fdeafdf530056d49f82d2ec6ca457fSirish Pande  if (Args.getLastArg(options::OPT_mieee_rnd_near)) {
13125f9688b7c7fdeafdf530056d49f82d2ec6ca457fSirish Pande    CmdArgs.push_back ("-mllvm");
13135f9688b7c7fdeafdf530056d49f82d2ec6ca457fSirish Pande    CmdArgs.push_back ("-enable-hexagon-ieee-rnd-near");
13145f9688b7c7fdeafdf530056d49f82d2ec6ca457fSirish Pande  }
13159631939f82c0eaa6fb3936a0ce58a41adfbc9011Tony Linthicum  CmdArgs.push_back ("-mllvm");
13169631939f82c0eaa6fb3936a0ce58a41adfbc9011Tony Linthicum  CmdArgs.push_back ("-machine-sink-split=0");
13179631939f82c0eaa6fb3936a0ce58a41adfbc9011Tony Linthicum}
13189631939f82c0eaa6fb3936a0ce58a41adfbc9011Tony Linthicum
131988b7cf00fcb582728c642da3927c59468efaf926Eric Christopherstatic bool
1320260611a32535c851237926bfcf78869b13c07d5bJohn McCallshouldUseExceptionTablesForObjCExceptions(const ObjCRuntime &runtime,
1321525544de0835d5ee7497f4897e255727b162e0aaAnders Carlsson                                          const llvm::Triple &Triple) {
1322525544de0835d5ee7497f4897e255727b162e0aaAnders Carlsson  // We use the zero-cost exception tables for Objective-C if the non-fragile
1323525544de0835d5ee7497f4897e255727b162e0aaAnders Carlsson  // ABI is enabled or when compiling for x86_64 and ARM on Snow Leopard and
1324525544de0835d5ee7497f4897e255727b162e0aaAnders Carlsson  // later.
1325260611a32535c851237926bfcf78869b13c07d5bJohn McCall  if (runtime.isNonFragile())
1326525544de0835d5ee7497f4897e255727b162e0aaAnders Carlsson    return true;
1327525544de0835d5ee7497f4897e255727b162e0aaAnders Carlsson
1328905c45f15a25598620d19160c139c6b785aeea89Bob Wilson  if (!Triple.isOSDarwin())
1329525544de0835d5ee7497f4897e255727b162e0aaAnders Carlsson    return false;
1330525544de0835d5ee7497f4897e255727b162e0aaAnders Carlsson
1331aa7333c860ac651c75da495217e0d6a9c10c0bb0Eric Christopher  return (!Triple.isMacOSXVersionLT(10,5) &&
1332525544de0835d5ee7497f4897e255727b162e0aaAnders Carlsson          (Triple.getArch() == llvm::Triple::x86_64 ||
133388b7cf00fcb582728c642da3927c59468efaf926Eric Christopher           Triple.getArch() == llvm::Triple::arm));
1334525544de0835d5ee7497f4897e255727b162e0aaAnders Carlsson}
1335525544de0835d5ee7497f4897e255727b162e0aaAnders Carlsson
133615348aeb81285c75b2e92b5bf8d2db3445d147c2Anders Carlsson/// addExceptionArgs - Adds exception related arguments to the driver command
133715348aeb81285c75b2e92b5bf8d2db3445d147c2Anders Carlsson/// arguments. There's a master flag, -fexceptions and also language specific
133815348aeb81285c75b2e92b5bf8d2db3445d147c2Anders Carlsson/// flags to enable/disable C++ and Objective-C exceptions.
133915348aeb81285c75b2e92b5bf8d2db3445d147c2Anders Carlsson/// This makes it possible to for example disable C++ exceptions but enable
134015348aeb81285c75b2e92b5bf8d2db3445d147c2Anders Carlsson/// Objective-C exceptions.
134115348aeb81285c75b2e92b5bf8d2db3445d147c2Anders Carlssonstatic void addExceptionArgs(const ArgList &Args, types::ID InputType,
134215348aeb81285c75b2e92b5bf8d2db3445d147c2Anders Carlsson                             const llvm::Triple &Triple,
134315b77319d0ce4332275992b2f191898a1df50efeFariborz Jahanian                             bool KernelOrKext,
1344260611a32535c851237926bfcf78869b13c07d5bJohn McCall                             const ObjCRuntime &objcRuntime,
134515348aeb81285c75b2e92b5bf8d2db3445d147c2Anders Carlsson                             ArgStringList &CmdArgs) {
1346afc4baa37c2f38fadf05b15456b10a0994d51b0bChad Rosier  if (KernelOrKext) {
1347afc4baa37c2f38fadf05b15456b10a0994d51b0bChad Rosier    // -mkernel and -fapple-kext imply no exceptions, so claim exception related
1348afc4baa37c2f38fadf05b15456b10a0994d51b0bChad Rosier    // arguments now to avoid warnings about unused arguments.
1349afc4baa37c2f38fadf05b15456b10a0994d51b0bChad Rosier    Args.ClaimAllArgs(options::OPT_fexceptions);
1350afc4baa37c2f38fadf05b15456b10a0994d51b0bChad Rosier    Args.ClaimAllArgs(options::OPT_fno_exceptions);
1351afc4baa37c2f38fadf05b15456b10a0994d51b0bChad Rosier    Args.ClaimAllArgs(options::OPT_fobjc_exceptions);
1352afc4baa37c2f38fadf05b15456b10a0994d51b0bChad Rosier    Args.ClaimAllArgs(options::OPT_fno_objc_exceptions);
1353afc4baa37c2f38fadf05b15456b10a0994d51b0bChad Rosier    Args.ClaimAllArgs(options::OPT_fcxx_exceptions);
1354afc4baa37c2f38fadf05b15456b10a0994d51b0bChad Rosier    Args.ClaimAllArgs(options::OPT_fno_cxx_exceptions);
135515348aeb81285c75b2e92b5bf8d2db3445d147c2Anders Carlsson    return;
1356afc4baa37c2f38fadf05b15456b10a0994d51b0bChad Rosier  }
135715348aeb81285c75b2e92b5bf8d2db3445d147c2Anders Carlsson
135815348aeb81285c75b2e92b5bf8d2db3445d147c2Anders Carlsson  // Exceptions are enabled by default.
135915348aeb81285c75b2e92b5bf8d2db3445d147c2Anders Carlsson  bool ExceptionsEnabled = true;
136015348aeb81285c75b2e92b5bf8d2db3445d147c2Anders Carlsson
136115348aeb81285c75b2e92b5bf8d2db3445d147c2Anders Carlsson  // This keeps track of whether exceptions were explicitly turned on or off.
136215348aeb81285c75b2e92b5bf8d2db3445d147c2Anders Carlsson  bool DidHaveExplicitExceptionFlag = false;
136315348aeb81285c75b2e92b5bf8d2db3445d147c2Anders Carlsson
1364f759df06d997050559fd925758bcd2cdef24db05Rafael Espindola  if (Arg *A = Args.getLastArg(options::OPT_fexceptions,
1365f759df06d997050559fd925758bcd2cdef24db05Rafael Espindola                               options::OPT_fno_exceptions)) {
1366f759df06d997050559fd925758bcd2cdef24db05Rafael Espindola    if (A->getOption().matches(options::OPT_fexceptions))
136715348aeb81285c75b2e92b5bf8d2db3445d147c2Anders Carlsson      ExceptionsEnabled = true;
136888b7cf00fcb582728c642da3927c59468efaf926Eric Christopher    else
136915348aeb81285c75b2e92b5bf8d2db3445d147c2Anders Carlsson      ExceptionsEnabled = false;
137015348aeb81285c75b2e92b5bf8d2db3445d147c2Anders Carlsson
137115348aeb81285c75b2e92b5bf8d2db3445d147c2Anders Carlsson    DidHaveExplicitExceptionFlag = true;
1372f759df06d997050559fd925758bcd2cdef24db05Rafael Espindola  }
13731a2cd4fd5d384faf171a39dea7136ca4672ac35eDaniel Dunbar
137415348aeb81285c75b2e92b5bf8d2db3445d147c2Anders Carlsson  bool ShouldUseExceptionTables = false;
137515348aeb81285c75b2e92b5bf8d2db3445d147c2Anders Carlsson
137615348aeb81285c75b2e92b5bf8d2db3445d147c2Anders Carlsson  // Exception tables and cleanups can be enabled with -fexceptions even if the
137715348aeb81285c75b2e92b5bf8d2db3445d147c2Anders Carlsson  // language itself doesn't support exceptions.
137815348aeb81285c75b2e92b5bf8d2db3445d147c2Anders Carlsson  if (ExceptionsEnabled && DidHaveExplicitExceptionFlag)
137915348aeb81285c75b2e92b5bf8d2db3445d147c2Anders Carlsson    ShouldUseExceptionTables = true;
138015348aeb81285c75b2e92b5bf8d2db3445d147c2Anders Carlsson
1381d47ea693706f7b0ffa68e879b73a71609a337786Daniel Dunbar  // Obj-C exceptions are enabled by default, regardless of -fexceptions. This
1382d47ea693706f7b0ffa68e879b73a71609a337786Daniel Dunbar  // is not necessarily sensible, but follows GCC.
1383d47ea693706f7b0ffa68e879b73a71609a337786Daniel Dunbar  if (types::isObjC(InputType) &&
138488b7cf00fcb582728c642da3927c59468efaf926Eric Christopher      Args.hasFlag(options::OPT_fobjc_exceptions,
1385d47ea693706f7b0ffa68e879b73a71609a337786Daniel Dunbar                   options::OPT_fno_objc_exceptions,
1386d47ea693706f7b0ffa68e879b73a71609a337786Daniel Dunbar                   true)) {
1387d47ea693706f7b0ffa68e879b73a71609a337786Daniel Dunbar    CmdArgs.push_back("-fobjc-exceptions");
1388d47ea693706f7b0ffa68e879b73a71609a337786Daniel Dunbar
138988b7cf00fcb582728c642da3927c59468efaf926Eric Christopher    ShouldUseExceptionTables |=
1390260611a32535c851237926bfcf78869b13c07d5bJohn McCall      shouldUseExceptionTablesForObjCExceptions(objcRuntime, Triple);
139115348aeb81285c75b2e92b5bf8d2db3445d147c2Anders Carlsson  }
139285caf03ee49c4de87ee9624a9b725ef5d20ee624Fariborz Jahanian
139315348aeb81285c75b2e92b5bf8d2db3445d147c2Anders Carlsson  if (types::isCXX(InputType)) {
139415348aeb81285c75b2e92b5bf8d2db3445d147c2Anders Carlsson    bool CXXExceptionsEnabled = ExceptionsEnabled;
13951a2cd4fd5d384faf171a39dea7136ca4672ac35eDaniel Dunbar
139688b7cf00fcb582728c642da3927c59468efaf926Eric Christopher    if (Arg *A = Args.getLastArg(options::OPT_fcxx_exceptions,
139788b7cf00fcb582728c642da3927c59468efaf926Eric Christopher                                 options::OPT_fno_cxx_exceptions,
139815348aeb81285c75b2e92b5bf8d2db3445d147c2Anders Carlsson                                 options::OPT_fexceptions,
139915348aeb81285c75b2e92b5bf8d2db3445d147c2Anders Carlsson                                 options::OPT_fno_exceptions)) {
140015348aeb81285c75b2e92b5bf8d2db3445d147c2Anders Carlsson      if (A->getOption().matches(options::OPT_fcxx_exceptions))
140115348aeb81285c75b2e92b5bf8d2db3445d147c2Anders Carlsson        CXXExceptionsEnabled = true;
140243f220f6d74e01f2606e429810484177903a28e6Chandler Carruth      else if (A->getOption().matches(options::OPT_fno_cxx_exceptions))
140315348aeb81285c75b2e92b5bf8d2db3445d147c2Anders Carlsson        CXXExceptionsEnabled = false;
140415348aeb81285c75b2e92b5bf8d2db3445d147c2Anders Carlsson    }
140515348aeb81285c75b2e92b5bf8d2db3445d147c2Anders Carlsson
140615348aeb81285c75b2e92b5bf8d2db3445d147c2Anders Carlsson    if (CXXExceptionsEnabled) {
140715348aeb81285c75b2e92b5bf8d2db3445d147c2Anders Carlsson      CmdArgs.push_back("-fcxx-exceptions");
140815348aeb81285c75b2e92b5bf8d2db3445d147c2Anders Carlsson
140915348aeb81285c75b2e92b5bf8d2db3445d147c2Anders Carlsson      ShouldUseExceptionTables = true;
141015348aeb81285c75b2e92b5bf8d2db3445d147c2Anders Carlsson    }
141115348aeb81285c75b2e92b5bf8d2db3445d147c2Anders Carlsson  }
141215348aeb81285c75b2e92b5bf8d2db3445d147c2Anders Carlsson
141315348aeb81285c75b2e92b5bf8d2db3445d147c2Anders Carlsson  if (ShouldUseExceptionTables)
141415348aeb81285c75b2e92b5bf8d2db3445d147c2Anders Carlsson    CmdArgs.push_back("-fexceptions");
1415f759df06d997050559fd925758bcd2cdef24db05Rafael Espindola}
1416f759df06d997050559fd925758bcd2cdef24db05Rafael Espindola
141761b1efe2d0b459a98962fd9b4c097ad8bb9bfdecRafael Espindolastatic bool ShouldDisableCFI(const ArgList &Args,
141861b1efe2d0b459a98962fd9b4c097ad8bb9bfdecRafael Espindola                             const ToolChain &TC) {
1419701ec8d11039fd0c571312253e6b15f22f29c592Rafael Espindola  bool Default = true;
1420905c45f15a25598620d19160c139c6b785aeea89Bob Wilson  if (TC.getTriple().isOSDarwin()) {
142197f6abb4470a82be4a8c6f1603e7bb303f9079b5Rafael Espindola    // The native darwin assembler doesn't support cfi directives, so
1422cb773921b1e8e7cf2a5dba25bd596d4f258a9daaRafael Espindola    // we disable them if we think the .s file will be passed to it.
1423af370e6e051e505016637e23418354db625dc796Rafael Espindola    Default = TC.useIntegratedAs();
142497f6abb4470a82be4a8c6f1603e7bb303f9079b5Rafael Espindola  }
1425701ec8d11039fd0c571312253e6b15f22f29c592Rafael Espindola  return !Args.hasFlag(options::OPT_fdwarf2_cfi_asm,
142627e2b983beb8b5a29869639637327725623069a8Eric Christopher                       options::OPT_fno_dwarf2_cfi_asm,
142727e2b983beb8b5a29869639637327725623069a8Eric Christopher                       Default);
142861b1efe2d0b459a98962fd9b4c097ad8bb9bfdecRafael Espindola}
142961b1efe2d0b459a98962fd9b4c097ad8bb9bfdecRafael Espindola
1430c06fcdfacc33ad4f8920bbdf43a0e45bc5e8ac4bTed Kremenekstatic bool ShouldDisableDwarfDirectory(const ArgList &Args,
1431c06fcdfacc33ad4f8920bbdf43a0e45bc5e8ac4bTed Kremenek                                        const ToolChain &TC) {
1432ea523d73a6de06f828952a02f5ff86e4cc631695Nick Lewycky  bool UseDwarfDirectory = Args.hasFlag(options::OPT_fdwarf_directory_asm,
1433ea523d73a6de06f828952a02f5ff86e4cc631695Nick Lewycky                                        options::OPT_fno_dwarf_directory_asm,
1434af370e6e051e505016637e23418354db625dc796Rafael Espindola                                        TC.useIntegratedAs());
1435ea523d73a6de06f828952a02f5ff86e4cc631695Nick Lewycky  return !UseDwarfDirectory;
1436ea523d73a6de06f828952a02f5ff86e4cc631695Nick Lewycky}
1437ea523d73a6de06f828952a02f5ff86e4cc631695Nick Lewycky
1438359cf927cf4980099a04b3f3cf040b81d181fe3dJoerg Sonnenberger/// \brief Check whether the given input tree contains any compilation actions.
1439359cf927cf4980099a04b3f3cf040b81d181fe3dJoerg Sonnenbergerstatic bool ContainsCompileAction(const Action *A) {
14405f9e272e632e951b1efe824cd16acb4d96077930Chris Lattner  if (isa<CompileJobAction>(A))
1441359cf927cf4980099a04b3f3cf040b81d181fe3dJoerg Sonnenberger    return true;
1442359cf927cf4980099a04b3f3cf040b81d181fe3dJoerg Sonnenberger
1443359cf927cf4980099a04b3f3cf040b81d181fe3dJoerg Sonnenberger  for (Action::const_iterator it = A->begin(), ie = A->end(); it != ie; ++it)
1444359cf927cf4980099a04b3f3cf040b81d181fe3dJoerg Sonnenberger    if (ContainsCompileAction(*it))
1445359cf927cf4980099a04b3f3cf040b81d181fe3dJoerg Sonnenberger      return true;
1446359cf927cf4980099a04b3f3cf040b81d181fe3dJoerg Sonnenberger
1447359cf927cf4980099a04b3f3cf040b81d181fe3dJoerg Sonnenberger  return false;
1448359cf927cf4980099a04b3f3cf040b81d181fe3dJoerg Sonnenberger}
1449359cf927cf4980099a04b3f3cf040b81d181fe3dJoerg Sonnenberger
1450359cf927cf4980099a04b3f3cf040b81d181fe3dJoerg Sonnenberger/// \brief Check if -relax-all should be passed to the internal assembler.
1451359cf927cf4980099a04b3f3cf040b81d181fe3dJoerg Sonnenberger/// This is done by default when compiling non-assembler source with -O0.
1452359cf927cf4980099a04b3f3cf040b81d181fe3dJoerg Sonnenbergerstatic bool UseRelaxAll(Compilation &C, const ArgList &Args) {
1453359cf927cf4980099a04b3f3cf040b81d181fe3dJoerg Sonnenberger  bool RelaxDefault = true;
1454359cf927cf4980099a04b3f3cf040b81d181fe3dJoerg Sonnenberger
1455359cf927cf4980099a04b3f3cf040b81d181fe3dJoerg Sonnenberger  if (Arg *A = Args.getLastArg(options::OPT_O_Group))
1456359cf927cf4980099a04b3f3cf040b81d181fe3dJoerg Sonnenberger    RelaxDefault = A->getOption().matches(options::OPT_O0);
1457359cf927cf4980099a04b3f3cf040b81d181fe3dJoerg Sonnenberger
1458359cf927cf4980099a04b3f3cf040b81d181fe3dJoerg Sonnenberger  if (RelaxDefault) {
1459359cf927cf4980099a04b3f3cf040b81d181fe3dJoerg Sonnenberger    RelaxDefault = false;
1460359cf927cf4980099a04b3f3cf040b81d181fe3dJoerg Sonnenberger    for (ActionList::const_iterator it = C.getActions().begin(),
1461359cf927cf4980099a04b3f3cf040b81d181fe3dJoerg Sonnenberger           ie = C.getActions().end(); it != ie; ++it) {
1462359cf927cf4980099a04b3f3cf040b81d181fe3dJoerg Sonnenberger      if (ContainsCompileAction(*it)) {
1463359cf927cf4980099a04b3f3cf040b81d181fe3dJoerg Sonnenberger        RelaxDefault = true;
1464359cf927cf4980099a04b3f3cf040b81d181fe3dJoerg Sonnenberger        break;
1465359cf927cf4980099a04b3f3cf040b81d181fe3dJoerg Sonnenberger      }
1466359cf927cf4980099a04b3f3cf040b81d181fe3dJoerg Sonnenberger    }
1467359cf927cf4980099a04b3f3cf040b81d181fe3dJoerg Sonnenberger  }
1468359cf927cf4980099a04b3f3cf040b81d181fe3dJoerg Sonnenberger
1469359cf927cf4980099a04b3f3cf040b81d181fe3dJoerg Sonnenberger  return Args.hasFlag(options::OPT_mrelax_all, options::OPT_mno_relax_all,
1470359cf927cf4980099a04b3f3cf040b81d181fe3dJoerg Sonnenberger    RelaxDefault);
1471359cf927cf4980099a04b3f3cf040b81d181fe3dJoerg Sonnenberger}
1472359cf927cf4980099a04b3f3cf040b81d181fe3dJoerg Sonnenberger
1473a40548c36d91189506cb61fc66ab915fb91906e3Alexey SamsonovSanitizerArgs::SanitizerArgs(const Driver &D, const ArgList &Args)
14744bdc60434c79126b75aee2bb391275f3bb746364Alexey Samsonov    : Kind(0), BlacklistFile(""), MsanTrackOrigins(false),
14754bdc60434c79126b75aee2bb391275f3bb746364Alexey Samsonov      AsanZeroBaseShadow(false) {
14763e335c118140c40b264a26b13e44af368514cb87Alexey Samsonov  unsigned AllKinds = 0;  // All kinds of sanitizers that were turned on
14773e335c118140c40b264a26b13e44af368514cb87Alexey Samsonov                          // at least once (possibly, disabled further).
14787ac415b489dd3b22b0335af60d874143c9fdf63aAlexey Samsonov  unsigned AllRemovedKinds = 0;  // All kinds of sanitizers that were explicitly
14797ac415b489dd3b22b0335af60d874143c9fdf63aAlexey Samsonov                                 // removed at least once.
1480c4dabadb51475e76b606024f144e7cf93b0bad00Richard Smith  for (ArgList::const_iterator I = Args.begin(), E = Args.end(); I != E; ++I) {
14813325b1617fce0c8c399b3010f8a65420e623d6f7Alexey Samsonov    unsigned Add, Remove;
14823325b1617fce0c8c399b3010f8a65420e623d6f7Alexey Samsonov    if (!parse(D, Args, *I, Add, Remove, true))
1483c4dabadb51475e76b606024f144e7cf93b0bad00Richard Smith      continue;
1484c4dabadb51475e76b606024f144e7cf93b0bad00Richard Smith    (*I)->claim();
1485bb1071c0568db9bd7934e869a53d671632eb9291Alexey Samsonov    Kind |= Add;
1486bb1071c0568db9bd7934e869a53d671632eb9291Alexey Samsonov    Kind &= ~Remove;
14873e335c118140c40b264a26b13e44af368514cb87Alexey Samsonov    AllKinds |= Add;
14887ac415b489dd3b22b0335af60d874143c9fdf63aAlexey Samsonov    AllRemovedKinds |= Remove;
14897ac415b489dd3b22b0335af60d874143c9fdf63aAlexey Samsonov  }
14907ac415b489dd3b22b0335af60d874143c9fdf63aAlexey Samsonov  // Assume -fsanitize=address implies -fsanitize=init-order, if the latter is
14917ac415b489dd3b22b0335af60d874143c9fdf63aAlexey Samsonov  // not disabled explicitly.
14927ac415b489dd3b22b0335af60d874143c9fdf63aAlexey Samsonov  if ((Kind & Address) != 0 && (AllRemovedKinds & InitOrder) == 0) {
14937ac415b489dd3b22b0335af60d874143c9fdf63aAlexey Samsonov    Kind |= InitOrder;
1494c4dabadb51475e76b606024f144e7cf93b0bad00Richard Smith  }
1495c4dabadb51475e76b606024f144e7cf93b0bad00Richard Smith
149678d85b1c5830a881c0a20a1b3fea99ee73149590Chad Rosier  UbsanTrapOnError =
149778d85b1c5830a881c0a20a1b3fea99ee73149590Chad Rosier    Args.hasArg(options::OPT_fcatch_undefined_behavior) ||
149878d85b1c5830a881c0a20a1b3fea99ee73149590Chad Rosier    Args.hasFlag(options::OPT_fsanitize_undefined_trap_on_error,
149978d85b1c5830a881c0a20a1b3fea99ee73149590Chad Rosier                 options::OPT_fno_sanitize_undefined_trap_on_error, false);
150078d85b1c5830a881c0a20a1b3fea99ee73149590Chad Rosier
150178d85b1c5830a881c0a20a1b3fea99ee73149590Chad Rosier  if (Args.hasArg(options::OPT_fcatch_undefined_behavior) &&
150278d85b1c5830a881c0a20a1b3fea99ee73149590Chad Rosier      !Args.hasFlag(options::OPT_fsanitize_undefined_trap_on_error,
150378d85b1c5830a881c0a20a1b3fea99ee73149590Chad Rosier                    options::OPT_fno_sanitize_undefined_trap_on_error, true)) {
150478d85b1c5830a881c0a20a1b3fea99ee73149590Chad Rosier    D.Diag(diag::err_drv_argument_not_allowed_with)
150578d85b1c5830a881c0a20a1b3fea99ee73149590Chad Rosier      << "-fcatch-undefined-behavior"
150678d85b1c5830a881c0a20a1b3fea99ee73149590Chad Rosier      << "-fno-sanitize-undefined-trap-on-error";
150778d85b1c5830a881c0a20a1b3fea99ee73149590Chad Rosier  }
150878d85b1c5830a881c0a20a1b3fea99ee73149590Chad Rosier
150978d85b1c5830a881c0a20a1b3fea99ee73149590Chad Rosier  // Warn about undefined sanitizer options that require runtime support.
151078d85b1c5830a881c0a20a1b3fea99ee73149590Chad Rosier  if (UbsanTrapOnError && notAllowedWithTrap()) {
151178d85b1c5830a881c0a20a1b3fea99ee73149590Chad Rosier    if (Args.hasArg(options::OPT_fcatch_undefined_behavior))
151278d85b1c5830a881c0a20a1b3fea99ee73149590Chad Rosier      D.Diag(diag::err_drv_argument_not_allowed_with)
151378d85b1c5830a881c0a20a1b3fea99ee73149590Chad Rosier        << lastArgumentForKind(D, Args, NotAllowedWithTrap)
151478d85b1c5830a881c0a20a1b3fea99ee73149590Chad Rosier        << "-fcatch-undefined-behavior";
151578d85b1c5830a881c0a20a1b3fea99ee73149590Chad Rosier    else if (Args.hasFlag(options::OPT_fsanitize_undefined_trap_on_error,
151678d85b1c5830a881c0a20a1b3fea99ee73149590Chad Rosier                          options::OPT_fno_sanitize_undefined_trap_on_error,
151778d85b1c5830a881c0a20a1b3fea99ee73149590Chad Rosier                          false))
151878d85b1c5830a881c0a20a1b3fea99ee73149590Chad Rosier      D.Diag(diag::err_drv_argument_not_allowed_with)
151978d85b1c5830a881c0a20a1b3fea99ee73149590Chad Rosier        << lastArgumentForKind(D, Args, NotAllowedWithTrap)
152078d85b1c5830a881c0a20a1b3fea99ee73149590Chad Rosier        << "-fsanitize-undefined-trap-on-error";
152178d85b1c5830a881c0a20a1b3fea99ee73149590Chad Rosier  }
152278d85b1c5830a881c0a20a1b3fea99ee73149590Chad Rosier
1523c4dabadb51475e76b606024f144e7cf93b0bad00Richard Smith  // Only one runtime library can be used at once.
1524bb1071c0568db9bd7934e869a53d671632eb9291Alexey Samsonov  bool NeedsAsan = needsAsanRt();
1525bb1071c0568db9bd7934e869a53d671632eb9291Alexey Samsonov  bool NeedsTsan = needsTsanRt();
152699469f732efbd6600dfd0a70e0a36116a717dd06Evgeniy Stepanov  bool NeedsMsan = needsMsanRt();
1527056503786410c0e72b1389918719a37e9342817bRichard Smith  if (NeedsAsan && NeedsTsan)
1528c4dabadb51475e76b606024f144e7cf93b0bad00Richard Smith    D.Diag(diag::err_drv_argument_not_allowed_with)
1529056503786410c0e72b1389918719a37e9342817bRichard Smith      << lastArgumentForKind(D, Args, NeedsAsanRt)
1530056503786410c0e72b1389918719a37e9342817bRichard Smith      << lastArgumentForKind(D, Args, NeedsTsanRt);
153199469f732efbd6600dfd0a70e0a36116a717dd06Evgeniy Stepanov  if (NeedsAsan && NeedsMsan)
153299469f732efbd6600dfd0a70e0a36116a717dd06Evgeniy Stepanov    D.Diag(diag::err_drv_argument_not_allowed_with)
153399469f732efbd6600dfd0a70e0a36116a717dd06Evgeniy Stepanov      << lastArgumentForKind(D, Args, NeedsAsanRt)
153499469f732efbd6600dfd0a70e0a36116a717dd06Evgeniy Stepanov      << lastArgumentForKind(D, Args, NeedsMsanRt);
153599469f732efbd6600dfd0a70e0a36116a717dd06Evgeniy Stepanov  if (NeedsTsan && NeedsMsan)
153699469f732efbd6600dfd0a70e0a36116a717dd06Evgeniy Stepanov    D.Diag(diag::err_drv_argument_not_allowed_with)
153799469f732efbd6600dfd0a70e0a36116a717dd06Evgeniy Stepanov      << lastArgumentForKind(D, Args, NeedsTsanRt)
153899469f732efbd6600dfd0a70e0a36116a717dd06Evgeniy Stepanov      << lastArgumentForKind(D, Args, NeedsMsanRt);
15394d1a6e41e1eaeaf5a4672c802519f15c8fb91e91Alexey Samsonov
15404d1a6e41e1eaeaf5a4672c802519f15c8fb91e91Alexey Samsonov  // If -fsanitize contains extra features of ASan, it should also
15413e335c118140c40b264a26b13e44af368514cb87Alexey Samsonov  // explicitly contain -fsanitize=address (probably, turned off later in the
15423e335c118140c40b264a26b13e44af368514cb87Alexey Samsonov  // command line).
15433e335c118140c40b264a26b13e44af368514cb87Alexey Samsonov  if ((Kind & AddressFull) != 0 && (AllKinds & Address) == 0)
15443e335c118140c40b264a26b13e44af368514cb87Alexey Samsonov    D.Diag(diag::warn_drv_unused_sanitizer)
15453e335c118140c40b264a26b13e44af368514cb87Alexey Samsonov     << lastArgumentForKind(D, Args, AddressFull)
15463e335c118140c40b264a26b13e44af368514cb87Alexey Samsonov     << "-fsanitize=address";
154791ecfa6af51836d3ccc90beddab1193b0c060739Alexey Samsonov
154891ecfa6af51836d3ccc90beddab1193b0c060739Alexey Samsonov  // Parse -f(no-)sanitize-blacklist options.
154991ecfa6af51836d3ccc90beddab1193b0c060739Alexey Samsonov  if (Arg *BLArg = Args.getLastArg(options::OPT_fsanitize_blacklist,
155091ecfa6af51836d3ccc90beddab1193b0c060739Alexey Samsonov                                   options::OPT_fno_sanitize_blacklist)) {
155191ecfa6af51836d3ccc90beddab1193b0c060739Alexey Samsonov    if (BLArg->getOption().matches(options::OPT_fsanitize_blacklist)) {
155291ecfa6af51836d3ccc90beddab1193b0c060739Alexey Samsonov      std::string BLPath = BLArg->getValue();
155391ecfa6af51836d3ccc90beddab1193b0c060739Alexey Samsonov      bool BLExists = false;
155491ecfa6af51836d3ccc90beddab1193b0c060739Alexey Samsonov      if (!llvm::sys::fs::exists(BLPath, BLExists) && BLExists)
155591ecfa6af51836d3ccc90beddab1193b0c060739Alexey Samsonov        BlacklistFile = BLPath;
155691ecfa6af51836d3ccc90beddab1193b0c060739Alexey Samsonov      else
155791ecfa6af51836d3ccc90beddab1193b0c060739Alexey Samsonov        D.Diag(diag::err_drv_no_such_file) << BLPath;
155891ecfa6af51836d3ccc90beddab1193b0c060739Alexey Samsonov    }
155924697b0a7297f530822dac42e36feb77738c1885Alexey Samsonov  } else {
156024697b0a7297f530822dac42e36feb77738c1885Alexey Samsonov    // If no -fsanitize-blacklist option is specified, try to look up for
156124697b0a7297f530822dac42e36feb77738c1885Alexey Samsonov    // blacklist in the resource directory.
156224697b0a7297f530822dac42e36feb77738c1885Alexey Samsonov    std::string BLPath;
156324697b0a7297f530822dac42e36feb77738c1885Alexey Samsonov    bool BLExists = false;
156424697b0a7297f530822dac42e36feb77738c1885Alexey Samsonov    if (getDefaultBlacklistForKind(D, Kind, BLPath) &&
156524697b0a7297f530822dac42e36feb77738c1885Alexey Samsonov        !llvm::sys::fs::exists(BLPath, BLExists) && BLExists)
156624697b0a7297f530822dac42e36feb77738c1885Alexey Samsonov      BlacklistFile = BLPath;
156791ecfa6af51836d3ccc90beddab1193b0c060739Alexey Samsonov  }
156834ef11be9d09ebf916ab02a521e37be6e9e102d3Evgeniy Stepanov
156934ef11be9d09ebf916ab02a521e37be6e9e102d3Evgeniy Stepanov  // Parse -f(no-)sanitize-memory-track-origins options.
15704bdc60434c79126b75aee2bb391275f3bb746364Alexey Samsonov  if (NeedsMsan)
157134ef11be9d09ebf916ab02a521e37be6e9e102d3Evgeniy Stepanov    MsanTrackOrigins =
157234ef11be9d09ebf916ab02a521e37be6e9e102d3Evgeniy Stepanov      Args.hasFlag(options::OPT_fsanitize_memory_track_origins,
157334ef11be9d09ebf916ab02a521e37be6e9e102d3Evgeniy Stepanov                   options::OPT_fno_sanitize_memory_track_origins,
157434ef11be9d09ebf916ab02a521e37be6e9e102d3Evgeniy Stepanov                   /* Default */false);
15754bdc60434c79126b75aee2bb391275f3bb746364Alexey Samsonov
15764bdc60434c79126b75aee2bb391275f3bb746364Alexey Samsonov  // Parse -f(no-)sanitize-address-zero-base-shadow options.
15774bdc60434c79126b75aee2bb391275f3bb746364Alexey Samsonov  if (NeedsAsan)
15784bdc60434c79126b75aee2bb391275f3bb746364Alexey Samsonov    AsanZeroBaseShadow =
15794bdc60434c79126b75aee2bb391275f3bb746364Alexey Samsonov      Args.hasFlag(options::OPT_fsanitize_address_zero_base_shadow,
15804bdc60434c79126b75aee2bb391275f3bb746364Alexey Samsonov                   options::OPT_fno_sanitize_address_zero_base_shadow,
15814bdc60434c79126b75aee2bb391275f3bb746364Alexey Samsonov                   /* Default */false);
1582c4dabadb51475e76b606024f144e7cf93b0bad00Richard Smith}
1583c4dabadb51475e76b606024f144e7cf93b0bad00Richard Smith
15848614304c0d728d43ef16691708281273101b00afAlexey Samsonovstatic void addSanitizerRTLinkFlagsLinux(
15858614304c0d728d43ef16691708281273101b00afAlexey Samsonov    const ToolChain &TC, const ArgList &Args, ArgStringList &CmdArgs,
15868614304c0d728d43ef16691708281273101b00afAlexey Samsonov    const StringRef Sanitizer, bool BeforeLibStdCXX) {
15878614304c0d728d43ef16691708281273101b00afAlexey Samsonov  // Sanitizer runtime is located in the Linux library directory and
15888614304c0d728d43ef16691708281273101b00afAlexey Samsonov  // has name "libclang_rt.<Sanitizer>-<ArchName>.a".
15898614304c0d728d43ef16691708281273101b00afAlexey Samsonov  SmallString<128> LibSanitizer(TC.getDriver().ResourceDir);
15908614304c0d728d43ef16691708281273101b00afAlexey Samsonov  llvm::sys::path::append(
15918614304c0d728d43ef16691708281273101b00afAlexey Samsonov      LibSanitizer, "lib", "linux",
15928614304c0d728d43ef16691708281273101b00afAlexey Samsonov      (Twine("libclang_rt.") + Sanitizer + "-" + TC.getArchName() + ".a"));
15938614304c0d728d43ef16691708281273101b00afAlexey Samsonov  // Sanitizer runtime may need to come before -lstdc++ (or -lc++, libstdc++.a,
15948614304c0d728d43ef16691708281273101b00afAlexey Samsonov  // etc.) so that the linker picks custom versions of the global 'operator
15958614304c0d728d43ef16691708281273101b00afAlexey Samsonov  // new' and 'operator delete' symbols. We take the extreme (but simple)
15968614304c0d728d43ef16691708281273101b00afAlexey Samsonov  // strategy of inserting it at the front of the link command. It also
15978614304c0d728d43ef16691708281273101b00afAlexey Samsonov  // needs to be forced to end up in the executable, so wrap it in
15988614304c0d728d43ef16691708281273101b00afAlexey Samsonov  // whole-archive.
15998614304c0d728d43ef16691708281273101b00afAlexey Samsonov  if (BeforeLibStdCXX) {
16008614304c0d728d43ef16691708281273101b00afAlexey Samsonov    SmallVector<const char *, 3> PrefixArgs;
16018614304c0d728d43ef16691708281273101b00afAlexey Samsonov    PrefixArgs.push_back("-whole-archive");
16028614304c0d728d43ef16691708281273101b00afAlexey Samsonov    PrefixArgs.push_back(Args.MakeArgString(LibSanitizer));
16038614304c0d728d43ef16691708281273101b00afAlexey Samsonov    PrefixArgs.push_back("-no-whole-archive");
16048614304c0d728d43ef16691708281273101b00afAlexey Samsonov    CmdArgs.insert(CmdArgs.begin(), PrefixArgs.begin(), PrefixArgs.end());
16058614304c0d728d43ef16691708281273101b00afAlexey Samsonov  } else {
16068614304c0d728d43ef16691708281273101b00afAlexey Samsonov    CmdArgs.push_back(Args.MakeArgString(LibSanitizer));
16078614304c0d728d43ef16691708281273101b00afAlexey Samsonov  }
16088614304c0d728d43ef16691708281273101b00afAlexey Samsonov  CmdArgs.push_back("-lpthread");
16098614304c0d728d43ef16691708281273101b00afAlexey Samsonov  CmdArgs.push_back("-ldl");
16108614304c0d728d43ef16691708281273101b00afAlexey Samsonov  CmdArgs.push_back("-export-dynamic");
16118614304c0d728d43ef16691708281273101b00afAlexey Samsonov}
16128614304c0d728d43ef16691708281273101b00afAlexey Samsonov
1613dff466c0791465f929a1d8cd551d4c84b360ba32Kostya Serebryany/// If AddressSanitizer is enabled, add appropriate linker flags (Linux).
1614dff466c0791465f929a1d8cd551d4c84b360ba32Kostya Serebryany/// This needs to be called before we add the C run-time (malloc, etc).
1615dff466c0791465f929a1d8cd551d4c84b360ba32Kostya Serebryanystatic void addAsanRTLinux(const ToolChain &TC, const ArgList &Args,
16167b5f1013c5b7f541dc1fae7fc43189377874eabbKostya Serebryany                           ArgStringList &CmdArgs) {
161794a7142f74bb4a9daa53c22087b19d4568073109Logan Chien  if(TC.getTriple().getEnvironment() == llvm::Triple::Android) {
1618a6ddc02921d47d0a1dc9ffe4d31438f250751e05Evgeniy Stepanov    if (!Args.hasArg(options::OPT_shared)) {
1619837386287f1527c3a1e7ac2ea330c714519ae33aEvgeniy Stepanov      if (!Args.hasArg(options::OPT_pie))
1620837386287f1527c3a1e7ac2ea330c714519ae33aEvgeniy Stepanov        TC.getDriver().Diag(diag::err_drv_asan_android_requires_pie);
1621a6ddc02921d47d0a1dc9ffe4d31438f250751e05Evgeniy Stepanov    }
16228cd0d25df91d7172bfd0ed6013f89ad0083ce301Daniel Dunbar
16238ba7541f12b39aeef4cdb104566dd0503321f48fEvgeniy Stepanov    SmallString<128> LibAsan(TC.getDriver().ResourceDir);
16248ba7541f12b39aeef4cdb104566dd0503321f48fEvgeniy Stepanov    llvm::sys::path::append(LibAsan, "lib", "linux",
16258ba7541f12b39aeef4cdb104566dd0503321f48fEvgeniy Stepanov        (Twine("libclang_rt.asan-") +
16268ba7541f12b39aeef4cdb104566dd0503321f48fEvgeniy Stepanov            TC.getArchName() + "-android.so"));
162745b27380a24dcd6a39faa888b5d31192801c43f4Matt Beaumont-Gay    CmdArgs.insert(CmdArgs.begin(), Args.MakeArgString(LibAsan));
1628a6ddc02921d47d0a1dc9ffe4d31438f250751e05Evgeniy Stepanov  } else {
1629a6ddc02921d47d0a1dc9ffe4d31438f250751e05Evgeniy Stepanov    if (!Args.hasArg(options::OPT_shared)) {
16304bdc60434c79126b75aee2bb391275f3bb746364Alexey Samsonov      bool ZeroBaseShadow = Args.hasFlag(
16314bdc60434c79126b75aee2bb391275f3bb746364Alexey Samsonov          options::OPT_fsanitize_address_zero_base_shadow,
16324bdc60434c79126b75aee2bb391275f3bb746364Alexey Samsonov          options::OPT_fno_sanitize_address_zero_base_shadow, false);
16334bdc60434c79126b75aee2bb391275f3bb746364Alexey Samsonov      if (ZeroBaseShadow && !Args.hasArg(options::OPT_pie)) {
16344bdc60434c79126b75aee2bb391275f3bb746364Alexey Samsonov        TC.getDriver().Diag(diag::err_drv_argument_only_allowed_with) <<
16354bdc60434c79126b75aee2bb391275f3bb746364Alexey Samsonov            "-fsanitize-address-zero-base-shadow" << "-pie";
16364bdc60434c79126b75aee2bb391275f3bb746364Alexey Samsonov      }
16378614304c0d728d43ef16691708281273101b00afAlexey Samsonov      addSanitizerRTLinkFlagsLinux(TC, Args, CmdArgs, "asan", true);
1638a6ddc02921d47d0a1dc9ffe4d31438f250751e05Evgeniy Stepanov    }
1639a6ddc02921d47d0a1dc9ffe4d31438f250751e05Evgeniy Stepanov  }
1640dff466c0791465f929a1d8cd551d4c84b360ba32Kostya Serebryany}
1641dff466c0791465f929a1d8cd551d4c84b360ba32Kostya Serebryany
1642f7efb0e7478da45bc7f2d24dbeb08406d2399591Kostya Serebryany/// If ThreadSanitizer is enabled, add appropriate linker flags (Linux).
1643f7efb0e7478da45bc7f2d24dbeb08406d2399591Kostya Serebryany/// This needs to be called before we add the C run-time (malloc, etc).
1644f7efb0e7478da45bc7f2d24dbeb08406d2399591Kostya Serebryanystatic void addTsanRTLinux(const ToolChain &TC, const ArgList &Args,
1645f7efb0e7478da45bc7f2d24dbeb08406d2399591Kostya Serebryany                           ArgStringList &CmdArgs) {
1646f7efb0e7478da45bc7f2d24dbeb08406d2399591Kostya Serebryany  if (!Args.hasArg(options::OPT_shared)) {
164709ccf39c13cfca102deea2986f45cb908bc232fdEvgeniy Stepanov    if (!Args.hasArg(options::OPT_pie))
164899469f732efbd6600dfd0a70e0a36116a717dd06Evgeniy Stepanov      TC.getDriver().Diag(diag::err_drv_argument_only_allowed_with) <<
164999469f732efbd6600dfd0a70e0a36116a717dd06Evgeniy Stepanov        "-fsanitize=thread" << "-pie";
16508614304c0d728d43ef16691708281273101b00afAlexey Samsonov    addSanitizerRTLinkFlagsLinux(TC, Args, CmdArgs, "tsan", true);
1651f7efb0e7478da45bc7f2d24dbeb08406d2399591Kostya Serebryany  }
1652f7efb0e7478da45bc7f2d24dbeb08406d2399591Kostya Serebryany}
1653f7efb0e7478da45bc7f2d24dbeb08406d2399591Kostya Serebryany
165409ccf39c13cfca102deea2986f45cb908bc232fdEvgeniy Stepanov/// If MemorySanitizer is enabled, add appropriate linker flags (Linux).
165509ccf39c13cfca102deea2986f45cb908bc232fdEvgeniy Stepanov/// This needs to be called before we add the C run-time (malloc, etc).
165609ccf39c13cfca102deea2986f45cb908bc232fdEvgeniy Stepanovstatic void addMsanRTLinux(const ToolChain &TC, const ArgList &Args,
165709ccf39c13cfca102deea2986f45cb908bc232fdEvgeniy Stepanov                           ArgStringList &CmdArgs) {
165809ccf39c13cfca102deea2986f45cb908bc232fdEvgeniy Stepanov  if (!Args.hasArg(options::OPT_shared)) {
165909ccf39c13cfca102deea2986f45cb908bc232fdEvgeniy Stepanov    if (!Args.hasArg(options::OPT_pie))
166099469f732efbd6600dfd0a70e0a36116a717dd06Evgeniy Stepanov      TC.getDriver().Diag(diag::err_drv_argument_only_allowed_with) <<
166199469f732efbd6600dfd0a70e0a36116a717dd06Evgeniy Stepanov        "-fsanitize=memory" << "-pie";
16628614304c0d728d43ef16691708281273101b00afAlexey Samsonov    addSanitizerRTLinkFlagsLinux(TC, Args, CmdArgs, "msan", true);
166309ccf39c13cfca102deea2986f45cb908bc232fdEvgeniy Stepanov  }
166409ccf39c13cfca102deea2986f45cb908bc232fdEvgeniy Stepanov}
166509ccf39c13cfca102deea2986f45cb908bc232fdEvgeniy Stepanov
16664def70d3040e73707c738f7c366737a986135edfRichard Smith/// If UndefinedBehaviorSanitizer is enabled, add appropriate linker flags
16674def70d3040e73707c738f7c366737a986135edfRichard Smith/// (Linux).
16684def70d3040e73707c738f7c366737a986135edfRichard Smithstatic void addUbsanRTLinux(const ToolChain &TC, const ArgList &Args,
16694def70d3040e73707c738f7c366737a986135edfRichard Smith                            ArgStringList &CmdArgs) {
16708614304c0d728d43ef16691708281273101b00afAlexey Samsonov  addSanitizerRTLinkFlagsLinux(TC, Args, CmdArgs, "ubsan", false);
16714def70d3040e73707c738f7c366737a986135edfRichard Smith}
16724def70d3040e73707c738f7c366737a986135edfRichard Smith
16736af27ec69560f7e4b0dac4a0b4341cd6062f6852Rafael Espindolastatic bool shouldUseFramePointer(const ArgList &Args,
16746af27ec69560f7e4b0dac4a0b4341cd6062f6852Rafael Espindola                                  const llvm::Triple &Triple) {
16756af27ec69560f7e4b0dac4a0b4341cd6062f6852Rafael Espindola  if (Arg *A = Args.getLastArg(options::OPT_fno_omit_frame_pointer,
16766af27ec69560f7e4b0dac4a0b4341cd6062f6852Rafael Espindola                               options::OPT_fomit_frame_pointer))
16776af27ec69560f7e4b0dac4a0b4341cd6062f6852Rafael Espindola    return A->getOption().matches(options::OPT_fno_omit_frame_pointer);
16786af27ec69560f7e4b0dac4a0b4341cd6062f6852Rafael Espindola
1679a2a178989b2f6623b6a8ccf73dc0ccd98ee5bdf9Rafael Espindola  // Don't use a frame pointer on linux x86 and x86_64 if optimizing.
16806af27ec69560f7e4b0dac4a0b4341cd6062f6852Rafael Espindola  if ((Triple.getArch() == llvm::Triple::x86_64 ||
16816af27ec69560f7e4b0dac4a0b4341cd6062f6852Rafael Espindola       Triple.getArch() == llvm::Triple::x86) &&
16826af27ec69560f7e4b0dac4a0b4341cd6062f6852Rafael Espindola      Triple.getOS() == llvm::Triple::Linux) {
16836af27ec69560f7e4b0dac4a0b4341cd6062f6852Rafael Espindola    if (Arg *A = Args.getLastArg(options::OPT_O_Group))
16846af27ec69560f7e4b0dac4a0b4341cd6062f6852Rafael Espindola      if (!A->getOption().matches(options::OPT_O0))
16856af27ec69560f7e4b0dac4a0b4341cd6062f6852Rafael Espindola        return false;
16866af27ec69560f7e4b0dac4a0b4341cd6062f6852Rafael Espindola  }
16876af27ec69560f7e4b0dac4a0b4341cd6062f6852Rafael Espindola
16886af27ec69560f7e4b0dac4a0b4341cd6062f6852Rafael Espindola  return true;
16896af27ec69560f7e4b0dac4a0b4341cd6062f6852Rafael Espindola}
16906af27ec69560f7e4b0dac4a0b4341cd6062f6852Rafael Espindola
1691d566df67bed6381f6e859bbd21fd43ff89277cc0Chandler Carruth/// If the PWD environment variable is set, add a CC1 option to specify the
1692d566df67bed6381f6e859bbd21fd43ff89277cc0Chandler Carruth/// debug compilation directory.
1693d566df67bed6381f6e859bbd21fd43ff89277cc0Chandler Carruthstatic void addDebugCompDirArg(const ArgList &Args, ArgStringList &CmdArgs) {
1694d566df67bed6381f6e859bbd21fd43ff89277cc0Chandler Carruth  if (const char *pwd = ::getenv("PWD")) {
1695d566df67bed6381f6e859bbd21fd43ff89277cc0Chandler Carruth    // GCC also verifies that stat(pwd) and stat(".") have the same inode
1696d566df67bed6381f6e859bbd21fd43ff89277cc0Chandler Carruth    // number. Not doing those because stats are slow, but we could.
1697d566df67bed6381f6e859bbd21fd43ff89277cc0Chandler Carruth    if (llvm::sys::path::is_absolute(pwd)) {
1698d566df67bed6381f6e859bbd21fd43ff89277cc0Chandler Carruth      std::string CompDir = pwd;
1699d566df67bed6381f6e859bbd21fd43ff89277cc0Chandler Carruth      CmdArgs.push_back("-fdebug-compilation-dir");
1700d566df67bed6381f6e859bbd21fd43ff89277cc0Chandler Carruth      CmdArgs.push_back(Args.MakeArgString(CompDir));
1701d566df67bed6381f6e859bbd21fd43ff89277cc0Chandler Carruth    }
1702d566df67bed6381f6e859bbd21fd43ff89277cc0Chandler Carruth  }
1703d566df67bed6381f6e859bbd21fd43ff89277cc0Chandler Carruth}
1704d566df67bed6381f6e859bbd21fd43ff89277cc0Chandler Carruth
170580190399f5a062db72127869978699af65951b73Eric Christopherstatic const char *SplitDebugName(const ArgList &Args,
170680190399f5a062db72127869978699af65951b73Eric Christopher                                  const InputInfoList &Inputs) {
170780190399f5a062db72127869978699af65951b73Eric Christopher  Arg *FinalOutput = Args.getLastArg(options::OPT_o);
170880190399f5a062db72127869978699af65951b73Eric Christopher  if (FinalOutput && Args.hasArg(options::OPT_c)) {
170980190399f5a062db72127869978699af65951b73Eric Christopher    SmallString<128> T(FinalOutput->getValue());
171080190399f5a062db72127869978699af65951b73Eric Christopher    llvm::sys::path::replace_extension(T, "dwo");
171180190399f5a062db72127869978699af65951b73Eric Christopher    return Args.MakeArgString(T);
171280190399f5a062db72127869978699af65951b73Eric Christopher  } else {
171380190399f5a062db72127869978699af65951b73Eric Christopher    // Use the compilation dir.
171480190399f5a062db72127869978699af65951b73Eric Christopher    SmallString<128> T(Args.getLastArgValue(options::OPT_fdebug_compilation_dir));
171580190399f5a062db72127869978699af65951b73Eric Christopher    SmallString<128> F(llvm::sys::path::stem(Inputs[0].getBaseInput()));
171680190399f5a062db72127869978699af65951b73Eric Christopher    llvm::sys::path::replace_extension(F, "dwo");
171780190399f5a062db72127869978699af65951b73Eric Christopher    T += F;
171880190399f5a062db72127869978699af65951b73Eric Christopher    return Args.MakeArgString(F);
171980190399f5a062db72127869978699af65951b73Eric Christopher  }
172080190399f5a062db72127869978699af65951b73Eric Christopher}
172180190399f5a062db72127869978699af65951b73Eric Christopher
172280190399f5a062db72127869978699af65951b73Eric Christopherstatic void SplitDebugInfo(const ToolChain &TC, Compilation &C,
172380190399f5a062db72127869978699af65951b73Eric Christopher                           const Tool &T, const JobAction &JA,
172480190399f5a062db72127869978699af65951b73Eric Christopher                           const ArgList &Args, const InputInfo &Output,
172580190399f5a062db72127869978699af65951b73Eric Christopher                           const char *OutFile) {
172659320e770f90a59c74f2be10f198e3c390195628Eric Christopher  ArgStringList ExtractArgs;
172759320e770f90a59c74f2be10f198e3c390195628Eric Christopher  ExtractArgs.push_back("--extract-dwo");
172859320e770f90a59c74f2be10f198e3c390195628Eric Christopher
172959320e770f90a59c74f2be10f198e3c390195628Eric Christopher  ArgStringList StripArgs;
173059320e770f90a59c74f2be10f198e3c390195628Eric Christopher  StripArgs.push_back("--strip-dwo");
173159320e770f90a59c74f2be10f198e3c390195628Eric Christopher
173259320e770f90a59c74f2be10f198e3c390195628Eric Christopher  // Grabbing the output of the earlier compile step.
173359320e770f90a59c74f2be10f198e3c390195628Eric Christopher  StripArgs.push_back(Output.getFilename());
173459320e770f90a59c74f2be10f198e3c390195628Eric Christopher  ExtractArgs.push_back(Output.getFilename());
173559320e770f90a59c74f2be10f198e3c390195628Eric Christopher  ExtractArgs.push_back(OutFile);
173659320e770f90a59c74f2be10f198e3c390195628Eric Christopher
173759320e770f90a59c74f2be10f198e3c390195628Eric Christopher  const char *Exec =
173880190399f5a062db72127869978699af65951b73Eric Christopher    Args.MakeArgString(TC.GetProgramPath("objcopy"));
173959320e770f90a59c74f2be10f198e3c390195628Eric Christopher
174059320e770f90a59c74f2be10f198e3c390195628Eric Christopher  // First extract the dwo sections.
174180190399f5a062db72127869978699af65951b73Eric Christopher  C.addCommand(new Command(JA, T, Exec, ExtractArgs));
174259320e770f90a59c74f2be10f198e3c390195628Eric Christopher
174359320e770f90a59c74f2be10f198e3c390195628Eric Christopher  // Then remove them from the original .o file.
174480190399f5a062db72127869978699af65951b73Eric Christopher  C.addCommand(new Command(JA, T, Exec, StripArgs));
174559320e770f90a59c74f2be10f198e3c390195628Eric Christopher}
174659320e770f90a59c74f2be10f198e3c390195628Eric Christopher
174747ac7d27c44bd64a7d0fc03d4babc196cf2b8230Daniel Dunbarvoid Clang::ConstructJob(Compilation &C, const JobAction &JA,
1748871adcf4e41285e3f4c3b62eaa1b2e05b60b92daDaniel Dunbar                         const InputInfo &Output,
174962cf601812e03dd9bc5df42b8ef06a0cdedc38bfDaniel Dunbar                         const InputInfoList &Inputs,
17501d46033f760ba5fd266ce59fe391fac473f04f52Daniel Dunbar                         const ArgList &Args,
175147ac7d27c44bd64a7d0fc03d4babc196cf2b8230Daniel Dunbar                         const char *LinkingOutput) const {
17520a80ba74ffa3d3df55abfbc4474d7470c7c923e3Daniel Dunbar  bool KernelOrKext = Args.hasArg(options::OPT_mkernel,
17530a80ba74ffa3d3df55abfbc4474d7470c7c923e3Daniel Dunbar                                  options::OPT_fapple_kext);
1754ee788e70fcd0adf76103b17c78ac658d4ea30c9bDaniel Dunbar  const Driver &D = getToolChain().getDriver();
1755b488c1dac8e53206f07103d794a62a3f5012c0f4Daniel Dunbar  ArgStringList CmdArgs;
1756b488c1dac8e53206f07103d794a62a3f5012c0f4Daniel Dunbar
1757077ba6a3ac3628afb0d3c460e81ce013bccbdbedDaniel Dunbar  assert(Inputs.size() == 1 && "Unable to handle multiple inputs.");
1758077ba6a3ac3628afb0d3c460e81ce013bccbdbedDaniel Dunbar
17598ff5b28d6efcffe2251e77634c7edf83a4763344Daniel Dunbar  // Invoke ourselves in -cc1 mode.
17608ff5b28d6efcffe2251e77634c7edf83a4763344Daniel Dunbar  //
17618ff5b28d6efcffe2251e77634c7edf83a4763344Daniel Dunbar  // FIXME: Implement custom jobs for internal actions.
17628ff5b28d6efcffe2251e77634c7edf83a4763344Daniel Dunbar  CmdArgs.push_back("-cc1");
17638ff5b28d6efcffe2251e77634c7edf83a4763344Daniel Dunbar
1764dd4fe00f03d8749b283948ea86aa1e4a53ed21abDaniel Dunbar  // Add the "effective" target triple.
1765af07f936b698575f2c91f1c1134c116f1ef0deddDaniel Dunbar  CmdArgs.push_back("-triple");
176600577ada44c889fbe311d61c51a8da89e65c7c9aDaniel Dunbar  std::string TripleStr = getToolChain().ComputeEffectiveClangTriple(Args);
1767dd4fe00f03d8749b283948ea86aa1e4a53ed21abDaniel Dunbar  CmdArgs.push_back(Args.MakeArgString(TripleStr));
1768728a512753d85a6ccaae34e81385c8665c2de0e1Daniel Dunbar
1769dd4fe00f03d8749b283948ea86aa1e4a53ed21abDaniel Dunbar  // Select the appropriate action.
1770260611a32535c851237926bfcf78869b13c07d5bJohn McCall  RewriteKind rewriteKind = RK_None;
1771e982cc0ea3e9255b8aacf8f0bff559e9b1cfd72eFariborz Jahanian
17721d46033f760ba5fd266ce59fe391fac473f04f52Daniel Dunbar  if (isa<AnalyzeJobAction>(JA)) {
17731d46033f760ba5fd266ce59fe391fac473f04f52Daniel Dunbar    assert(JA.getType() == types::TY_Plist && "Invalid output type.");
17741d46033f760ba5fd266ce59fe391fac473f04f52Daniel Dunbar    CmdArgs.push_back("-analyze");
177530660a898545416f0fea2d717f16f75640001e38Ted Kremenek  } else if (isa<MigrateJobAction>(JA)) {
177630660a898545416f0fea2d717f16f75640001e38Ted Kremenek    CmdArgs.push_back("-migrate");
17771d46033f760ba5fd266ce59fe391fac473f04f52Daniel Dunbar  } else if (isa<PreprocessJobAction>(JA)) {
1778cd8e4c44dd068956e9181381be3ee2d49a0fac52Daniel Dunbar    if (Output.getType() == types::TY_Dependencies)
1779cd8e4c44dd068956e9181381be3ee2d49a0fac52Daniel Dunbar      CmdArgs.push_back("-Eonly");
178051be73daa9df0b9eab157318a9274ebe3e46c627Fariborz Jahanian    else {
1781cd8e4c44dd068956e9181381be3ee2d49a0fac52Daniel Dunbar      CmdArgs.push_back("-E");
178251be73daa9df0b9eab157318a9274ebe3e46c627Fariborz Jahanian      if (Args.hasArg(options::OPT_rewrite_objc) &&
178351be73daa9df0b9eab157318a9274ebe3e46c627Fariborz Jahanian          !Args.hasArg(options::OPT_g_Group))
178451be73daa9df0b9eab157318a9274ebe3e46c627Fariborz Jahanian        CmdArgs.push_back("-P");
178551be73daa9df0b9eab157318a9274ebe3e46c627Fariborz Jahanian    }
17868767cbc475ed96397b6f08617814eeb9cab121bdDaniel Dunbar  } else if (isa<AssembleJobAction>(JA)) {
17878767cbc475ed96397b6f08617814eeb9cab121bdDaniel Dunbar    CmdArgs.push_back("-emit-obj");
17889929800b8dfced61e9c97dc8d6e71e144ebf8accDaniel Dunbar
1789359cf927cf4980099a04b3f3cf040b81d181fe3dJoerg Sonnenberger    if (UseRelaxAll(C, Args))
17909929800b8dfced61e9c97dc8d6e71e144ebf8accDaniel Dunbar      CmdArgs.push_back("-mrelax-all");
1791ca0e0545c216afaacba6da6c82a270dc2efc4e3fDaniel Dunbar
1792fcec10bded7b9b9268af5232fa17617db0df68edDaniel Dunbar    // When using an integrated assembler, translate -Wa, and -Xassembler
1793fcec10bded7b9b9268af5232fa17617db0df68edDaniel Dunbar    // options.
1794fcec10bded7b9b9268af5232fa17617db0df68edDaniel Dunbar    for (arg_iterator it = Args.filtered_begin(options::OPT_Wa_COMMA,
1795fcec10bded7b9b9268af5232fa17617db0df68edDaniel Dunbar                                               options::OPT_Xassembler),
1796fcec10bded7b9b9268af5232fa17617db0df68edDaniel Dunbar           ie = Args.filtered_end(); it != ie; ++it) {
1797fcec10bded7b9b9268af5232fa17617db0df68edDaniel Dunbar      const Arg *A = *it;
1798fcec10bded7b9b9268af5232fa17617db0df68edDaniel Dunbar      A->claim();
1799fcec10bded7b9b9268af5232fa17617db0df68edDaniel Dunbar
1800fcec10bded7b9b9268af5232fa17617db0df68edDaniel Dunbar      for (unsigned i = 0, e = A->getNumValues(); i != e; ++i) {
18011d489cf4a04ad0ad8ac2696e4eed0995f3a67288Richard Smith        StringRef Value = A->getValue(i);
1802fcec10bded7b9b9268af5232fa17617db0df68edDaniel Dunbar
1803fcec10bded7b9b9268af5232fa17617db0df68edDaniel Dunbar        if (Value == "-force_cpusubtype_ALL") {
1804fcec10bded7b9b9268af5232fa17617db0df68edDaniel Dunbar          // Do nothing, this is the default and we don't support anything else.
1805b14eed0ed44ed3af881219dab7dc6464cad5303bDaniel Dunbar        } else if (Value == "-L") {
1806969323239f16589329d091a2b8ef200fcfe7c9e9Daniel Dunbar          CmdArgs.push_back("-msave-temp-labels");
180746a49391efab20d7a2a1c18f22edb3d76b465252Joerg Sonnenberger        } else if (Value == "--fatal-warnings") {
1808d793350dee89688f1cc939096dc60c3bc15c20feJoerg Sonnenberger          CmdArgs.push_back("-mllvm");
1809d793350dee89688f1cc939096dc60c3bc15c20feJoerg Sonnenberger          CmdArgs.push_back("-fatal-assembler-warnings");
1810c3b9014c7236a15cf467662264b243a22c420312Nick Lewycky        } else if (Value == "--noexecstack") {
1811c3b9014c7236a15cf467662264b243a22c420312Nick Lewycky          CmdArgs.push_back("-mnoexecstack");
1812fcec10bded7b9b9268af5232fa17617db0df68edDaniel Dunbar        } else {
18135f9e272e632e951b1efe824cd16acb4d96077930Chris Lattner          D.Diag(diag::err_drv_unsupported_option_argument)
1814fcec10bded7b9b9268af5232fa17617db0df68edDaniel Dunbar            << A->getOption().getName() << Value;
1815fcec10bded7b9b9268af5232fa17617db0df68edDaniel Dunbar        }
1816fcec10bded7b9b9268af5232fa17617db0df68edDaniel Dunbar      }
1817fcec10bded7b9b9268af5232fa17617db0df68edDaniel Dunbar    }
1818d02bba8e2abceebd91c162ee4479623791f455b5Daniel Dunbar
1819d02bba8e2abceebd91c162ee4479623791f455b5Daniel Dunbar    // Also ignore explicit -force_cpusubtype_ALL option.
1820d02bba8e2abceebd91c162ee4479623791f455b5Daniel Dunbar    (void) Args.hasArg(options::OPT_force__cpusubtype__ALL);
18211d46033f760ba5fd266ce59fe391fac473f04f52Daniel Dunbar  } else if (isa<PrecompileJobAction>(JA)) {
1822e5c35377020d6c38d16434c9f373a5fa9bb4f2ebArgyrios Kyrtzidis    // Use PCH if the user requested it.
18230ebd9321ba380471010341f24c874f46f56e7581Daniel Dunbar    bool UsePCH = D.CCCUsePCH;
18240ebd9321ba380471010341f24c874f46f56e7581Daniel Dunbar
1825761322b3bdea727de087dcdf355fee689f5b8358Aaron Ballman    if (JA.getType() == types::TY_Nothing)
1826761322b3bdea727de087dcdf355fee689f5b8358Aaron Ballman      CmdArgs.push_back("-fsyntax-only");
1827761322b3bdea727de087dcdf355fee689f5b8358Aaron Ballman    else if (UsePCH)
1828df91ef3d6c55692a0236f67b6c6b134a3bf84098Douglas Gregor      CmdArgs.push_back("-emit-pch");
1829df91ef3d6c55692a0236f67b6c6b134a3bf84098Douglas Gregor    else
1830df91ef3d6c55692a0236f67b6c6b134a3bf84098Douglas Gregor      CmdArgs.push_back("-emit-pth");
18311d46033f760ba5fd266ce59fe391fac473f04f52Daniel Dunbar  } else {
18321d46033f760ba5fd266ce59fe391fac473f04f52Daniel Dunbar    assert(isa<CompileJobAction>(JA) && "Invalid action for clang tool.");
1833c21c485b4fb58ef5d55cf3e523263dd824a2ace4Daniel Dunbar
18341d46033f760ba5fd266ce59fe391fac473f04f52Daniel Dunbar    if (JA.getType() == types::TY_Nothing) {
18351d46033f760ba5fd266ce59fe391fac473f04f52Daniel Dunbar      CmdArgs.push_back("-fsyntax-only");
18366c6424bc0d3b5f080a97b5f6ef4a8d70c38e38f5Daniel Dunbar    } else if (JA.getType() == types::TY_LLVM_IR ||
18376c6424bc0d3b5f080a97b5f6ef4a8d70c38e38f5Daniel Dunbar               JA.getType() == types::TY_LTO_IR) {
18381d46033f760ba5fd266ce59fe391fac473f04f52Daniel Dunbar      CmdArgs.push_back("-emit-llvm");
18396c6424bc0d3b5f080a97b5f6ef4a8d70c38e38f5Daniel Dunbar    } else if (JA.getType() == types::TY_LLVM_BC ||
18406c6424bc0d3b5f080a97b5f6ef4a8d70c38e38f5Daniel Dunbar               JA.getType() == types::TY_LTO_BC) {
18411d46033f760ba5fd266ce59fe391fac473f04f52Daniel Dunbar      CmdArgs.push_back("-emit-llvm-bc");
18421d46033f760ba5fd266ce59fe391fac473f04f52Daniel Dunbar    } else if (JA.getType() == types::TY_PP_Asm) {
1843e3b8d07e02861d245612b02b5f5a2c1f34b2a394Daniel Dunbar      CmdArgs.push_back("-S");
18445915fbf310e171c4cd3c2af05e9de360c0fa988aDaniel Dunbar    } else if (JA.getType() == types::TY_AST) {
18455915fbf310e171c4cd3c2af05e9de360c0fa988aDaniel Dunbar      CmdArgs.push_back("-emit-pch");
184664952508c2b0c8bffb45c8b410f0af3d2457f59bDaniel Dunbar    } else if (JA.getType() == types::TY_RewrittenObjC) {
184764952508c2b0c8bffb45c8b410f0af3d2457f59bDaniel Dunbar      CmdArgs.push_back("-rewrite-objc");
1848260611a32535c851237926bfcf78869b13c07d5bJohn McCall      rewriteKind = RK_NonFragile;
1849582b395ea4d5dfe353e2132a470d39efe2f84a54Fariborz Jahanian    } else if (JA.getType() == types::TY_RewrittenLegacyObjC) {
1850582b395ea4d5dfe353e2132a470d39efe2f84a54Fariborz Jahanian      CmdArgs.push_back("-rewrite-objc");
1851260611a32535c851237926bfcf78869b13c07d5bJohn McCall      rewriteKind = RK_Fragile;
185264952508c2b0c8bffb45c8b410f0af3d2457f59bDaniel Dunbar    } else {
185364952508c2b0c8bffb45c8b410f0af3d2457f59bDaniel Dunbar      assert(JA.getType() == types::TY_PP_Asm &&
185464952508c2b0c8bffb45c8b410f0af3d2457f59bDaniel Dunbar             "Unexpected output type!");
18551d46033f760ba5fd266ce59fe391fac473f04f52Daniel Dunbar    }
18561d46033f760ba5fd266ce59fe391fac473f04f52Daniel Dunbar  }
18571d46033f760ba5fd266ce59fe391fac473f04f52Daniel Dunbar
18581d46033f760ba5fd266ce59fe391fac473f04f52Daniel Dunbar  // The make clang go fast button.
18591d46033f760ba5fd266ce59fe391fac473f04f52Daniel Dunbar  CmdArgs.push_back("-disable-free");
18601d46033f760ba5fd266ce59fe391fac473f04f52Daniel Dunbar
1861b689afb75049012a431d483432114ad5e75d4a92John McCall  // Disable the verification pass in -asserts builds.
1862b689afb75049012a431d483432114ad5e75d4a92John McCall#ifdef NDEBUG
1863b689afb75049012a431d483432114ad5e75d4a92John McCall  CmdArgs.push_back("-disable-llvm-verifier");
1864b689afb75049012a431d483432114ad5e75d4a92John McCall#endif
1865b689afb75049012a431d483432114ad5e75d4a92John McCall
1866c9abc043af88f90d177a5bd147f627b78ca49fdeDaniel Dunbar  // Set the main file name, so that debug info works even with
1867c9abc043af88f90d177a5bd147f627b78ca49fdeDaniel Dunbar  // -save-temps.
1868c9abc043af88f90d177a5bd147f627b78ca49fdeDaniel Dunbar  CmdArgs.push_back("-main-file-name");
186966b8a6671bb5df540dd7200a5286f7ed7a72c1ccBob Wilson  CmdArgs.push_back(getBaseInputName(Args, Inputs));
1870c9abc043af88f90d177a5bd147f627b78ca49fdeDaniel Dunbar
18713bbc75302fd43cf13d868b46c94ff8794b302e43Daniel Dunbar  // Some flags which affect the language (via preprocessor
187266b8a6671bb5df540dd7200a5286f7ed7a72c1ccBob Wilson  // defines).
18733bbc75302fd43cf13d868b46c94ff8794b302e43Daniel Dunbar  if (Args.hasArg(options::OPT_static))
18743bbc75302fd43cf13d868b46c94ff8794b302e43Daniel Dunbar    CmdArgs.push_back("-static-define");
18753bbc75302fd43cf13d868b46c94ff8794b302e43Daniel Dunbar
18761d46033f760ba5fd266ce59fe391fac473f04f52Daniel Dunbar  if (isa<AnalyzeJobAction>(JA)) {
1877b8bb3e797c5687715c6d9d960ee573e4d0e62230Ted Kremenek    // Enable region store model by default.
1878b8bb3e797c5687715c6d9d960ee573e4d0e62230Ted Kremenek    CmdArgs.push_back("-analyzer-store=region");
1879b8bb3e797c5687715c6d9d960ee573e4d0e62230Ted Kremenek
1880b40d06dec23b53bbc1157a9adae7f887be31aa3bTed Kremenek    // Treat blocks as analysis entry points.
1881b40d06dec23b53bbc1157a9adae7f887be31aa3bTed Kremenek    CmdArgs.push_back("-analyzer-opt-analyze-nested-blocks");
1882b40d06dec23b53bbc1157a9adae7f887be31aa3bTed Kremenek
18835188507b9a1b09ec95c14ffadf0e832f2b47aa8aTed Kremenek    CmdArgs.push_back("-analyzer-eagerly-assume");
18845188507b9a1b09ec95c14ffadf0e832f2b47aa8aTed Kremenek
18851d46033f760ba5fd266ce59fe391fac473f04f52Daniel Dunbar    // Add default argument set.
1886d8fc0f2e7751cf31cec5c2f3cc6a0b447e9debb3Daniel Dunbar    if (!Args.hasArg(options::OPT__analyzer_no_default_checks)) {
1887027a6abdd6cedc0b8203da72eed6d15c796dce9dArgyrios Kyrtzidis      CmdArgs.push_back("-analyzer-checker=core");
18885188507b9a1b09ec95c14ffadf0e832f2b47aa8aTed Kremenek
1889027a6abdd6cedc0b8203da72eed6d15c796dce9dArgyrios Kyrtzidis      if (getToolChain().getTriple().getOS() != llvm::Triple::Win32)
1890027a6abdd6cedc0b8203da72eed6d15c796dce9dArgyrios Kyrtzidis        CmdArgs.push_back("-analyzer-checker=unix");
1891027a6abdd6cedc0b8203da72eed6d15c796dce9dArgyrios Kyrtzidis
18925188507b9a1b09ec95c14ffadf0e832f2b47aa8aTed Kremenek      if (getToolChain().getTriple().getVendor() == llvm::Triple::Apple)
18935188507b9a1b09ec95c14ffadf0e832f2b47aa8aTed Kremenek        CmdArgs.push_back("-analyzer-checker=osx");
1894a8180e5a8795b4b80587662167dfc13646a494a1Ted Kremenek
1895a8180e5a8795b4b80587662167dfc13646a494a1Ted Kremenek      CmdArgs.push_back("-analyzer-checker=deadcode");
18968dc0506df167a426df324f47d8367bd824f26e7fTed Kremenek
18978dc0506df167a426df324f47d8367bd824f26e7fTed Kremenek      // Enable the following experimental checkers for testing.
18988dc0506df167a426df324f47d8367bd824f26e7fTed Kremenek      CmdArgs.push_back("-analyzer-checker=security.insecureAPI.UncheckedReturn");
18998dc0506df167a426df324f47d8367bd824f26e7fTed Kremenek      CmdArgs.push_back("-analyzer-checker=security.insecureAPI.getpw");
19008dc0506df167a426df324f47d8367bd824f26e7fTed Kremenek      CmdArgs.push_back("-analyzer-checker=security.insecureAPI.gets");
19018dc0506df167a426df324f47d8367bd824f26e7fTed Kremenek      CmdArgs.push_back("-analyzer-checker=security.insecureAPI.mktemp");
19028dc0506df167a426df324f47d8367bd824f26e7fTed Kremenek      CmdArgs.push_back("-analyzer-checker=security.insecureAPI.mkstemp");
19038dc0506df167a426df324f47d8367bd824f26e7fTed Kremenek      CmdArgs.push_back("-analyzer-checker=security.insecureAPI.vfork");
1904d8fc0f2e7751cf31cec5c2f3cc6a0b447e9debb3Daniel Dunbar    }
1905d8fc0f2e7751cf31cec5c2f3cc6a0b447e9debb3Daniel Dunbar
1906d8fc0f2e7751cf31cec5c2f3cc6a0b447e9debb3Daniel Dunbar    // Set the output format. The default is plist, for (lame) historical
1907d8fc0f2e7751cf31cec5c2f3cc6a0b447e9debb3Daniel Dunbar    // reasons.
1908d8fc0f2e7751cf31cec5c2f3cc6a0b447e9debb3Daniel Dunbar    CmdArgs.push_back("-analyzer-output");
1909d8fc0f2e7751cf31cec5c2f3cc6a0b447e9debb3Daniel Dunbar    if (Arg *A = Args.getLastArg(options::OPT__analyzer_output))
19101d489cf4a04ad0ad8ac2696e4eed0995f3a67288Richard Smith      CmdArgs.push_back(A->getValue());
1911d8fc0f2e7751cf31cec5c2f3cc6a0b447e9debb3Daniel Dunbar    else
1912d8fc0f2e7751cf31cec5c2f3cc6a0b447e9debb3Daniel Dunbar      CmdArgs.push_back("plist");
19131d46033f760ba5fd266ce59fe391fac473f04f52Daniel Dunbar
19140647a7b9ad844565b8a4b5e1a5de882dd64efabfTed Kremenek    // Disable the presentation of standard compiler warnings when
19150647a7b9ad844565b8a4b5e1a5de882dd64efabfTed Kremenek    // using --analyze.  We only want to show static analyzer diagnostics
19160647a7b9ad844565b8a4b5e1a5de882dd64efabfTed Kremenek    // or frontend errors.
19170647a7b9ad844565b8a4b5e1a5de882dd64efabfTed Kremenek    CmdArgs.push_back("-w");
19180647a7b9ad844565b8a4b5e1a5de882dd64efabfTed Kremenek
19191d46033f760ba5fd266ce59fe391fac473f04f52Daniel Dunbar    // Add -Xanalyzer arguments when running as analyzer.
19201d46033f760ba5fd266ce59fe391fac473f04f52Daniel Dunbar    Args.AddAllArgValues(CmdArgs, options::OPT_Xanalyzer);
19211eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump  }
19221eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump
1923e2fd66418eca3d70cf6b62087d745d0c5181db69Daniel Dunbar  CheckCodeGenerationOptions(D, Args);
1924e2fd66418eca3d70cf6b62087d745d0c5181db69Daniel Dunbar
19257ce816a77dc79f71950e9e96185e3523ee08994bChandler Carruth  // For the PIC and PIE flag options, this logic is different from the legacy
19267ce816a77dc79f71950e9e96185e3523ee08994bChandler Carruth  // logic in very old versions of GCC, as that logic was just a bug no one had
19277ce816a77dc79f71950e9e96185e3523ee08994bChandler Carruth  // ever fixed. This logic is both more rational and consistent with GCC's new
19287ce816a77dc79f71950e9e96185e3523ee08994bChandler Carruth  // logic now that the bugs are fixed. The last argument relating to either
19297ce816a77dc79f71950e9e96185e3523ee08994bChandler Carruth  // PIC or PIE wins, and no other argument is used. If the last argument is
19307ce816a77dc79f71950e9e96185e3523ee08994bChandler Carruth  // any flavor of the '-fno-...' arguments, both PIC and PIE are disabled. Any
19317ce816a77dc79f71950e9e96185e3523ee08994bChandler Carruth  // PIE option implicitly enables PIC at the same level.
19327ce816a77dc79f71950e9e96185e3523ee08994bChandler Carruth  bool PIE = false;
19337ce816a77dc79f71950e9e96185e3523ee08994bChandler Carruth  bool PIC = getToolChain().isPICDefault();
19347ce816a77dc79f71950e9e96185e3523ee08994bChandler Carruth  bool IsPICLevelTwo = PIC;
19357ce816a77dc79f71950e9e96185e3523ee08994bChandler Carruth  if (Arg *A = Args.getLastArg(options::OPT_fPIC, options::OPT_fno_PIC,
19367ce816a77dc79f71950e9e96185e3523ee08994bChandler Carruth                               options::OPT_fpic, options::OPT_fno_pic,
19377ce816a77dc79f71950e9e96185e3523ee08994bChandler Carruth                               options::OPT_fPIE, options::OPT_fno_PIE,
19387ce816a77dc79f71950e9e96185e3523ee08994bChandler Carruth                               options::OPT_fpie, options::OPT_fno_pie)) {
19397ce816a77dc79f71950e9e96185e3523ee08994bChandler Carruth    Option O = A->getOption();
19407ce816a77dc79f71950e9e96185e3523ee08994bChandler Carruth    if (O.matches(options::OPT_fPIC) || O.matches(options::OPT_fpic) ||
19417ce816a77dc79f71950e9e96185e3523ee08994bChandler Carruth        O.matches(options::OPT_fPIE) || O.matches(options::OPT_fpie)) {
19427ce816a77dc79f71950e9e96185e3523ee08994bChandler Carruth      PIE = O.matches(options::OPT_fPIE) || O.matches(options::OPT_fpie);
19437ce816a77dc79f71950e9e96185e3523ee08994bChandler Carruth      PIC = PIE || O.matches(options::OPT_fPIC) || O.matches(options::OPT_fpic);
19447ce816a77dc79f71950e9e96185e3523ee08994bChandler Carruth      IsPICLevelTwo = O.matches(options::OPT_fPIE) ||
19457ce816a77dc79f71950e9e96185e3523ee08994bChandler Carruth                      O.matches(options::OPT_fPIC);
19467ce816a77dc79f71950e9e96185e3523ee08994bChandler Carruth    } else {
19477ce816a77dc79f71950e9e96185e3523ee08994bChandler Carruth      PIE = PIC = false;
19487ce816a77dc79f71950e9e96185e3523ee08994bChandler Carruth    }
19495e219cf7f896873c1c1e64b9e87a7dade99debbaChandler Carruth  }
19507ce816a77dc79f71950e9e96185e3523ee08994bChandler Carruth  // Check whether the tool chain trumps the PIC-ness decision. If the PIC-ness
19517ce816a77dc79f71950e9e96185e3523ee08994bChandler Carruth  // is forced, then neither PIC nor PIE flags will have no effect.
19527ce816a77dc79f71950e9e96185e3523ee08994bChandler Carruth  if (getToolChain().isPICDefaultForced()) {
19537ce816a77dc79f71950e9e96185e3523ee08994bChandler Carruth    PIE = false;
19547ce816a77dc79f71950e9e96185e3523ee08994bChandler Carruth    PIC = getToolChain().isPICDefault();
19557ce816a77dc79f71950e9e96185e3523ee08994bChandler Carruth    IsPICLevelTwo = PIC;
19567ce816a77dc79f71950e9e96185e3523ee08994bChandler Carruth  }
19577ce816a77dc79f71950e9e96185e3523ee08994bChandler Carruth
19587ce816a77dc79f71950e9e96185e3523ee08994bChandler Carruth  // Inroduce a Darwin-specific hack. If the default is PIC but the flags
19597ce816a77dc79f71950e9e96185e3523ee08994bChandler Carruth  // specified while enabling PIC enabled level 1 PIC, just force it back to
19607ce816a77dc79f71950e9e96185e3523ee08994bChandler Carruth  // level 2 PIC instead. This matches the behavior of Darwin GCC (based on my
19617ce816a77dc79f71950e9e96185e3523ee08994bChandler Carruth  // informal testing).
19627ce816a77dc79f71950e9e96185e3523ee08994bChandler Carruth  if (PIC && getToolChain().getTriple().isOSDarwin())
19637ce816a77dc79f71950e9e96185e3523ee08994bChandler Carruth    IsPICLevelTwo |= getToolChain().isPICDefault();
19647ce816a77dc79f71950e9e96185e3523ee08994bChandler Carruth
19655e219cf7f896873c1c1e64b9e87a7dade99debbaChandler Carruth  // Note that these flags are trump-cards. Regardless of the order w.r.t. the
19665e219cf7f896873c1c1e64b9e87a7dade99debbaChandler Carruth  // PIC or PIE options above, if these show up, PIC is disabled.
19677a0c064770355a4918df69f95de8dea6338a59a2Daniel Dunbar  llvm::Triple Triple(TripleStr);
19686c7db8967c383d859eab6d541db816adbeb837a9Eric Christopher  if (KernelOrKext &&
19697a0c064770355a4918df69f95de8dea6338a59a2Daniel Dunbar      (Triple.getOS() != llvm::Triple::IOS ||
19707a0c064770355a4918df69f95de8dea6338a59a2Daniel Dunbar       Triple.isOSVersionLT(6)))
19717ce816a77dc79f71950e9e96185e3523ee08994bChandler Carruth    PIC = PIE = false;
19725e219cf7f896873c1c1e64b9e87a7dade99debbaChandler Carruth  if (Args.hasArg(options::OPT_static))
19737ce816a77dc79f71950e9e96185e3523ee08994bChandler Carruth    PIC = PIE = false;
19747ce816a77dc79f71950e9e96185e3523ee08994bChandler Carruth
19757ce816a77dc79f71950e9e96185e3523ee08994bChandler Carruth  if (Arg *A = Args.getLastArg(options::OPT_mdynamic_no_pic)) {
19767ce816a77dc79f71950e9e96185e3523ee08994bChandler Carruth    // This is a very special mode. It trumps the other modes, almost no one
19777ce816a77dc79f71950e9e96185e3523ee08994bChandler Carruth    // uses it, and it isn't even valid on any OS but Darwin.
19787ce816a77dc79f71950e9e96185e3523ee08994bChandler Carruth    if (!getToolChain().getTriple().isOSDarwin())
19797ce816a77dc79f71950e9e96185e3523ee08994bChandler Carruth      D.Diag(diag::err_drv_unsupported_opt_for_target)
19807ce816a77dc79f71950e9e96185e3523ee08994bChandler Carruth        << A->getSpelling() << getToolChain().getTriple().str();
19817ce816a77dc79f71950e9e96185e3523ee08994bChandler Carruth
19827ce816a77dc79f71950e9e96185e3523ee08994bChandler Carruth    // FIXME: Warn when this flag trumps some other PIC or PIE flag.
19837ce816a77dc79f71950e9e96185e3523ee08994bChandler Carruth
1984f219e7c1529fac29e34483667f740b452e5ef9ccDaniel Dunbar    CmdArgs.push_back("-mrelocation-model");
19857ce816a77dc79f71950e9e96185e3523ee08994bChandler Carruth    CmdArgs.push_back("dynamic-no-pic");
19867ce816a77dc79f71950e9e96185e3523ee08994bChandler Carruth
19877ce816a77dc79f71950e9e96185e3523ee08994bChandler Carruth    // Only a forced PIC mode can cause the actual compile to have PIC defines
19887ce816a77dc79f71950e9e96185e3523ee08994bChandler Carruth    // etc., no flags are sufficient. This behavior was selected to closely
19897ce816a77dc79f71950e9e96185e3523ee08994bChandler Carruth    // match that of llvm-gcc and Apple GCC before that.
19907ce816a77dc79f71950e9e96185e3523ee08994bChandler Carruth    if (getToolChain().isPICDefault() && getToolChain().isPICDefaultForced()) {
19917ce816a77dc79f71950e9e96185e3523ee08994bChandler Carruth      CmdArgs.push_back("-pic-level");
19927ce816a77dc79f71950e9e96185e3523ee08994bChandler Carruth      CmdArgs.push_back("2");
19937ce816a77dc79f71950e9e96185e3523ee08994bChandler Carruth    }
19947ce816a77dc79f71950e9e96185e3523ee08994bChandler Carruth  } else {
19957ce816a77dc79f71950e9e96185e3523ee08994bChandler Carruth    // Currently, LLVM only knows about PIC vs. static; the PIE differences are
19967ce816a77dc79f71950e9e96185e3523ee08994bChandler Carruth    // handled in Clang's IRGen by the -pie-level flag.
19977ce816a77dc79f71950e9e96185e3523ee08994bChandler Carruth    CmdArgs.push_back("-mrelocation-model");
19987ce816a77dc79f71950e9e96185e3523ee08994bChandler Carruth    CmdArgs.push_back(PIC ? "pic" : "static");
19997ce816a77dc79f71950e9e96185e3523ee08994bChandler Carruth
20007ce816a77dc79f71950e9e96185e3523ee08994bChandler Carruth    if (PIC) {
20017ce816a77dc79f71950e9e96185e3523ee08994bChandler Carruth      CmdArgs.push_back("-pic-level");
20027ce816a77dc79f71950e9e96185e3523ee08994bChandler Carruth      CmdArgs.push_back(IsPICLevelTwo ? "2" : "1");
20037ce816a77dc79f71950e9e96185e3523ee08994bChandler Carruth      if (PIE) {
20047ce816a77dc79f71950e9e96185e3523ee08994bChandler Carruth        CmdArgs.push_back("-pie-level");
20057ce816a77dc79f71950e9e96185e3523ee08994bChandler Carruth        CmdArgs.push_back(IsPICLevelTwo ? "2" : "1");
20067ce816a77dc79f71950e9e96185e3523ee08994bChandler Carruth      }
20077ce816a77dc79f71950e9e96185e3523ee08994bChandler Carruth    }
2008bc85be85779a47bae728bbe6a2cd2e3732b1333dDaniel Dunbar  }
20095e219cf7f896873c1c1e64b9e87a7dade99debbaChandler Carruth
2010f219e7c1529fac29e34483667f740b452e5ef9ccDaniel Dunbar  if (!Args.hasFlag(options::OPT_fmerge_all_constants,
2011f219e7c1529fac29e34483667f740b452e5ef9ccDaniel Dunbar                    options::OPT_fno_merge_all_constants))
2012f44a1a04a36453527de2285c402fbe9453184121Chris Lattner    CmdArgs.push_back("-fno-merge-all-constants");
2013f219e7c1529fac29e34483667f740b452e5ef9ccDaniel Dunbar
2014f219e7c1529fac29e34483667f740b452e5ef9ccDaniel Dunbar  // LLVM Code Generator Options.
20151d46033f760ba5fd266ce59fe391fac473f04f52Daniel Dunbar
201617d3fea677753e6e3e82ffe2cbdeccbf5f2e7497Daniel Dunbar  if (Arg *A = Args.getLastArg(options::OPT_mregparm_EQ)) {
201717d3fea677753e6e3e82ffe2cbdeccbf5f2e7497Daniel Dunbar    CmdArgs.push_back("-mregparm");
20181d489cf4a04ad0ad8ac2696e4eed0995f3a67288Richard Smith    CmdArgs.push_back(A->getValue());
201917d3fea677753e6e3e82ffe2cbdeccbf5f2e7497Daniel Dunbar  }
202017d3fea677753e6e3e82ffe2cbdeccbf5f2e7497Daniel Dunbar
2021cfe9af250f466e7e38becea4428990448ae07737Roman Divacky  if (Args.hasFlag(options::OPT_mrtd, options::OPT_mno_rtd, false))
2022cfe9af250f466e7e38becea4428990448ae07737Roman Divacky    CmdArgs.push_back("-mrtd");
2023cfe9af250f466e7e38becea4428990448ae07737Roman Divacky
20246af27ec69560f7e4b0dac4a0b4341cd6062f6852Rafael Espindola  if (shouldUseFramePointer(Args, getToolChain().getTriple()))
2025f219e7c1529fac29e34483667f740b452e5ef9ccDaniel Dunbar    CmdArgs.push_back("-mdisable-fp-elim");
2026bc85be85779a47bae728bbe6a2cd2e3732b1333dDaniel Dunbar  if (!Args.hasFlag(options::OPT_fzero_initialized_in_bss,
2027f219e7c1529fac29e34483667f740b452e5ef9ccDaniel Dunbar                    options::OPT_fno_zero_initialized_in_bss))
2028f219e7c1529fac29e34483667f740b452e5ef9ccDaniel Dunbar    CmdArgs.push_back("-mno-zero-initialized-in-bss");
2029398c610b16728b4398214367dd0effd9d2e61340Daniel Dunbar  if (!Args.hasFlag(options::OPT_fstrict_aliasing,
2030398c610b16728b4398214367dd0effd9d2e61340Daniel Dunbar                    options::OPT_fno_strict_aliasing,
2031398c610b16728b4398214367dd0effd9d2e61340Daniel Dunbar                    getToolChain().IsStrictAliasingDefault()))
20324d5625e15bb215c2241c022df8dc7b04438970c6Dan Gohman    CmdArgs.push_back("-relaxed-aliasing");
203382fe6aea407a5a09a6131452ce622087ba83880dChandler Carruth  if (Args.hasFlag(options::OPT_fstrict_enums, options::OPT_fno_strict_enums,
203482fe6aea407a5a09a6131452ce622087ba83880dChandler Carruth                   false))
203582fe6aea407a5a09a6131452ce622087ba83880dChandler Carruth    CmdArgs.push_back("-fstrict-enums");
20361db772bd68502e0dabbd8efeb7f7c64a4ab2e37aNick Lewycky  if (!Args.hasFlag(options::OPT_foptimize_sibling_calls,
20371db772bd68502e0dabbd8efeb7f7c64a4ab2e37aNick Lewycky                    options::OPT_fno_optimize_sibling_calls))
20381db772bd68502e0dabbd8efeb7f7c64a4ab2e37aNick Lewycky    CmdArgs.push_back("-mdisable-tail-calls");
20391b71848c5238747ede9650b7907172f8a7e088a5Daniel Dunbar
2040abf07a7fb669dcb74040eef948d61dfe3c59ff17Chandler Carruth  // Handle various floating point optimization flags, mapping them to the
2041abf07a7fb669dcb74040eef948d61dfe3c59ff17Chandler Carruth  // appropriate LLVM code generation flags. The pattern for all of these is to
2042abf07a7fb669dcb74040eef948d61dfe3c59ff17Chandler Carruth  // default off the codegen optimizations, and if any flag enables them and no
2043abf07a7fb669dcb74040eef948d61dfe3c59ff17Chandler Carruth  // flag disables them after the flag enabling them, enable the codegen
2044abf07a7fb669dcb74040eef948d61dfe3c59ff17Chandler Carruth  // optimization. This is complicated by several "umbrella" flags.
2045abf07a7fb669dcb74040eef948d61dfe3c59ff17Chandler Carruth  if (Arg *A = Args.getLastArg(options::OPT_ffast_math,
204680ecf5e66738a7058da58489ca55200212f3d42cChad Rosier                               options::OPT_fno_fast_math,
2047abf07a7fb669dcb74040eef948d61dfe3c59ff17Chandler Carruth                               options::OPT_ffinite_math_only,
2048abf07a7fb669dcb74040eef948d61dfe3c59ff17Chandler Carruth                               options::OPT_fno_finite_math_only,
2049abf07a7fb669dcb74040eef948d61dfe3c59ff17Chandler Carruth                               options::OPT_fhonor_infinities,
2050abf07a7fb669dcb74040eef948d61dfe3c59ff17Chandler Carruth                               options::OPT_fno_honor_infinities))
205180ecf5e66738a7058da58489ca55200212f3d42cChad Rosier    if (A->getOption().getID() != options::OPT_fno_fast_math &&
205280ecf5e66738a7058da58489ca55200212f3d42cChad Rosier        A->getOption().getID() != options::OPT_fno_finite_math_only &&
2053abf07a7fb669dcb74040eef948d61dfe3c59ff17Chandler Carruth        A->getOption().getID() != options::OPT_fhonor_infinities)
2054abf07a7fb669dcb74040eef948d61dfe3c59ff17Chandler Carruth      CmdArgs.push_back("-menable-no-infs");
2055abf07a7fb669dcb74040eef948d61dfe3c59ff17Chandler Carruth  if (Arg *A = Args.getLastArg(options::OPT_ffast_math,
205680ecf5e66738a7058da58489ca55200212f3d42cChad Rosier                               options::OPT_fno_fast_math,
2057abf07a7fb669dcb74040eef948d61dfe3c59ff17Chandler Carruth                               options::OPT_ffinite_math_only,
2058abf07a7fb669dcb74040eef948d61dfe3c59ff17Chandler Carruth                               options::OPT_fno_finite_math_only,
2059abf07a7fb669dcb74040eef948d61dfe3c59ff17Chandler Carruth                               options::OPT_fhonor_nans,
2060abf07a7fb669dcb74040eef948d61dfe3c59ff17Chandler Carruth                               options::OPT_fno_honor_nans))
206180ecf5e66738a7058da58489ca55200212f3d42cChad Rosier    if (A->getOption().getID() != options::OPT_fno_fast_math &&
206280ecf5e66738a7058da58489ca55200212f3d42cChad Rosier        A->getOption().getID() != options::OPT_fno_finite_math_only &&
2063abf07a7fb669dcb74040eef948d61dfe3c59ff17Chandler Carruth        A->getOption().getID() != options::OPT_fhonor_nans)
2064abf07a7fb669dcb74040eef948d61dfe3c59ff17Chandler Carruth      CmdArgs.push_back("-menable-no-nans");
2065abf07a7fb669dcb74040eef948d61dfe3c59ff17Chandler Carruth
2066769aa2d46fa5dc0bee5285c95a80ad8749cb79cfBenjamin Kramer  // -fmath-errno is the default on some platforms, e.g. BSD-derived OSes.
2067769aa2d46fa5dc0bee5285c95a80ad8749cb79cfBenjamin Kramer  bool MathErrno = getToolChain().IsMathErrnoDefault();
2068abf07a7fb669dcb74040eef948d61dfe3c59ff17Chandler Carruth  if (Arg *A = Args.getLastArg(options::OPT_ffast_math,
206980ecf5e66738a7058da58489ca55200212f3d42cChad Rosier                               options::OPT_fno_fast_math,
2070abf07a7fb669dcb74040eef948d61dfe3c59ff17Chandler Carruth                               options::OPT_fmath_errno,
20714f50c50e783461ea1ec47dd6fe9be10aafcd76adChandler Carruth                               options::OPT_fno_math_errno))
20724f50c50e783461ea1ec47dd6fe9be10aafcd76adChandler Carruth    MathErrno = A->getOption().getID() == options::OPT_fmath_errno;
20734f50c50e783461ea1ec47dd6fe9be10aafcd76adChandler Carruth  if (MathErrno)
20744f50c50e783461ea1ec47dd6fe9be10aafcd76adChandler Carruth    CmdArgs.push_back("-fmath-errno");
2075abf07a7fb669dcb74040eef948d61dfe3c59ff17Chandler Carruth
2076abf07a7fb669dcb74040eef948d61dfe3c59ff17Chandler Carruth  // There are several flags which require disabling very specific
2077abf07a7fb669dcb74040eef948d61dfe3c59ff17Chandler Carruth  // optimizations. Any of these being disabled forces us to turn off the
2078abf07a7fb669dcb74040eef948d61dfe3c59ff17Chandler Carruth  // entire set of LLVM optimizations, so collect them through all the flag
2079abf07a7fb669dcb74040eef948d61dfe3c59ff17Chandler Carruth  // madness.
2080abf07a7fb669dcb74040eef948d61dfe3c59ff17Chandler Carruth  bool AssociativeMath = false;
2081abf07a7fb669dcb74040eef948d61dfe3c59ff17Chandler Carruth  if (Arg *A = Args.getLastArg(options::OPT_ffast_math,
208280ecf5e66738a7058da58489ca55200212f3d42cChad Rosier                               options::OPT_fno_fast_math,
2083abf07a7fb669dcb74040eef948d61dfe3c59ff17Chandler Carruth                               options::OPT_funsafe_math_optimizations,
2084abf07a7fb669dcb74040eef948d61dfe3c59ff17Chandler Carruth                               options::OPT_fno_unsafe_math_optimizations,
2085abf07a7fb669dcb74040eef948d61dfe3c59ff17Chandler Carruth                               options::OPT_fassociative_math,
2086abf07a7fb669dcb74040eef948d61dfe3c59ff17Chandler Carruth                               options::OPT_fno_associative_math))
208780ecf5e66738a7058da58489ca55200212f3d42cChad Rosier    if (A->getOption().getID() != options::OPT_fno_fast_math &&
208880ecf5e66738a7058da58489ca55200212f3d42cChad Rosier        A->getOption().getID() != options::OPT_fno_unsafe_math_optimizations &&
2089abf07a7fb669dcb74040eef948d61dfe3c59ff17Chandler Carruth        A->getOption().getID() != options::OPT_fno_associative_math)
2090abf07a7fb669dcb74040eef948d61dfe3c59ff17Chandler Carruth      AssociativeMath = true;
2091abf07a7fb669dcb74040eef948d61dfe3c59ff17Chandler Carruth  bool ReciprocalMath = false;
2092abf07a7fb669dcb74040eef948d61dfe3c59ff17Chandler Carruth  if (Arg *A = Args.getLastArg(options::OPT_ffast_math,
209380ecf5e66738a7058da58489ca55200212f3d42cChad Rosier                               options::OPT_fno_fast_math,
2094abf07a7fb669dcb74040eef948d61dfe3c59ff17Chandler Carruth                               options::OPT_funsafe_math_optimizations,
2095abf07a7fb669dcb74040eef948d61dfe3c59ff17Chandler Carruth                               options::OPT_fno_unsafe_math_optimizations,
2096abf07a7fb669dcb74040eef948d61dfe3c59ff17Chandler Carruth                               options::OPT_freciprocal_math,
2097abf07a7fb669dcb74040eef948d61dfe3c59ff17Chandler Carruth                               options::OPT_fno_reciprocal_math))
209880ecf5e66738a7058da58489ca55200212f3d42cChad Rosier    if (A->getOption().getID() != options::OPT_fno_fast_math &&
209980ecf5e66738a7058da58489ca55200212f3d42cChad Rosier        A->getOption().getID() != options::OPT_fno_unsafe_math_optimizations &&
2100abf07a7fb669dcb74040eef948d61dfe3c59ff17Chandler Carruth        A->getOption().getID() != options::OPT_fno_reciprocal_math)
2101abf07a7fb669dcb74040eef948d61dfe3c59ff17Chandler Carruth      ReciprocalMath = true;
2102abf07a7fb669dcb74040eef948d61dfe3c59ff17Chandler Carruth  bool SignedZeros = true;
2103abf07a7fb669dcb74040eef948d61dfe3c59ff17Chandler Carruth  if (Arg *A = Args.getLastArg(options::OPT_ffast_math,
210480ecf5e66738a7058da58489ca55200212f3d42cChad Rosier                               options::OPT_fno_fast_math,
2105abf07a7fb669dcb74040eef948d61dfe3c59ff17Chandler Carruth                               options::OPT_funsafe_math_optimizations,
2106abf07a7fb669dcb74040eef948d61dfe3c59ff17Chandler Carruth                               options::OPT_fno_unsafe_math_optimizations,
2107abf07a7fb669dcb74040eef948d61dfe3c59ff17Chandler Carruth                               options::OPT_fsigned_zeros,
2108abf07a7fb669dcb74040eef948d61dfe3c59ff17Chandler Carruth                               options::OPT_fno_signed_zeros))
210980ecf5e66738a7058da58489ca55200212f3d42cChad Rosier    if (A->getOption().getID() != options::OPT_fno_fast_math &&
211080ecf5e66738a7058da58489ca55200212f3d42cChad Rosier        A->getOption().getID() != options::OPT_fno_unsafe_math_optimizations &&
2111abf07a7fb669dcb74040eef948d61dfe3c59ff17Chandler Carruth        A->getOption().getID() != options::OPT_fsigned_zeros)
2112abf07a7fb669dcb74040eef948d61dfe3c59ff17Chandler Carruth      SignedZeros = false;
2113abf07a7fb669dcb74040eef948d61dfe3c59ff17Chandler Carruth  bool TrappingMath = true;
2114abf07a7fb669dcb74040eef948d61dfe3c59ff17Chandler Carruth  if (Arg *A = Args.getLastArg(options::OPT_ffast_math,
211580ecf5e66738a7058da58489ca55200212f3d42cChad Rosier                               options::OPT_fno_fast_math,
2116abf07a7fb669dcb74040eef948d61dfe3c59ff17Chandler Carruth                               options::OPT_funsafe_math_optimizations,
2117abf07a7fb669dcb74040eef948d61dfe3c59ff17Chandler Carruth                               options::OPT_fno_unsafe_math_optimizations,
2118abf07a7fb669dcb74040eef948d61dfe3c59ff17Chandler Carruth                               options::OPT_ftrapping_math,
2119abf07a7fb669dcb74040eef948d61dfe3c59ff17Chandler Carruth                               options::OPT_fno_trapping_math))
212080ecf5e66738a7058da58489ca55200212f3d42cChad Rosier    if (A->getOption().getID() != options::OPT_fno_fast_math &&
212180ecf5e66738a7058da58489ca55200212f3d42cChad Rosier        A->getOption().getID() != options::OPT_fno_unsafe_math_optimizations &&
2122abf07a7fb669dcb74040eef948d61dfe3c59ff17Chandler Carruth        A->getOption().getID() != options::OPT_ftrapping_math)
2123abf07a7fb669dcb74040eef948d61dfe3c59ff17Chandler Carruth      TrappingMath = false;
2124abf07a7fb669dcb74040eef948d61dfe3c59ff17Chandler Carruth  if (!MathErrno && AssociativeMath && ReciprocalMath && !SignedZeros &&
2125abf07a7fb669dcb74040eef948d61dfe3c59ff17Chandler Carruth      !TrappingMath)
2126abf07a7fb669dcb74040eef948d61dfe3c59ff17Chandler Carruth    CmdArgs.push_back("-menable-unsafe-fp-math");
2127abf07a7fb669dcb74040eef948d61dfe3c59ff17Chandler Carruth
2128c9686716d2ceb5518178dca98670ec34c472a1beLang Hames
2129c9686716d2ceb5518178dca98670ec34c472a1beLang Hames  // Validate and pass through -fp-contract option.
2130c9686716d2ceb5518178dca98670ec34c472a1beLang Hames  if (Arg *A = Args.getLastArg(options::OPT_ffast_math,
213180ecf5e66738a7058da58489ca55200212f3d42cChad Rosier                               options::OPT_fno_fast_math,
2132c9686716d2ceb5518178dca98670ec34c472a1beLang Hames                               options::OPT_ffp_contract)) {
2133c9686716d2ceb5518178dca98670ec34c472a1beLang Hames    if (A->getOption().getID() == options::OPT_ffp_contract) {
21341d489cf4a04ad0ad8ac2696e4eed0995f3a67288Richard Smith      StringRef Val = A->getValue();
2135c9686716d2ceb5518178dca98670ec34c472a1beLang Hames      if (Val == "fast" || Val == "on" || Val == "off") {
2136c9686716d2ceb5518178dca98670ec34c472a1beLang Hames        CmdArgs.push_back(Args.MakeArgString("-ffp-contract=" + Val));
2137c9686716d2ceb5518178dca98670ec34c472a1beLang Hames      } else {
2138c9686716d2ceb5518178dca98670ec34c472a1beLang Hames        D.Diag(diag::err_drv_unsupported_option_argument)
2139c9686716d2ceb5518178dca98670ec34c472a1beLang Hames          << A->getOption().getName() << Val;
2140c9686716d2ceb5518178dca98670ec34c472a1beLang Hames      }
214180ecf5e66738a7058da58489ca55200212f3d42cChad Rosier    } else if (A->getOption().getID() == options::OPT_ffast_math) {
2142c9686716d2ceb5518178dca98670ec34c472a1beLang Hames      // If fast-math is set then set the fp-contract mode to fast.
2143c9686716d2ceb5518178dca98670ec34c472a1beLang Hames      CmdArgs.push_back(Args.MakeArgString("-ffp-contract=fast"));
2144c9686716d2ceb5518178dca98670ec34c472a1beLang Hames    }
2145c9686716d2ceb5518178dca98670ec34c472a1beLang Hames  }
2146c9686716d2ceb5518178dca98670ec34c472a1beLang Hames
2147455e72e7625a8f87c2c302d8d82baee5c111e094Bob Wilson  // We separately look for the '-ffast-math' and '-ffinite-math-only' flags,
2148455e72e7625a8f87c2c302d8d82baee5c111e094Bob Wilson  // and if we find them, tell the frontend to provide the appropriate
2149455e72e7625a8f87c2c302d8d82baee5c111e094Bob Wilson  // preprocessor macros. This is distinct from enabling any optimizations as
2150455e72e7625a8f87c2c302d8d82baee5c111e094Bob Wilson  // these options induce language changes which must survive serialization
2151455e72e7625a8f87c2c302d8d82baee5c111e094Bob Wilson  // and deserialization, etc.
215280ecf5e66738a7058da58489ca55200212f3d42cChad Rosier  if (Arg *A = Args.getLastArg(options::OPT_ffast_math, options::OPT_fno_fast_math))
215380ecf5e66738a7058da58489ca55200212f3d42cChad Rosier    if (A->getOption().matches(options::OPT_ffast_math))
215480ecf5e66738a7058da58489ca55200212f3d42cChad Rosier      CmdArgs.push_back("-ffast-math");
215580ecf5e66738a7058da58489ca55200212f3d42cChad Rosier  if (Arg *A = Args.getLastArg(options::OPT_ffinite_math_only, options::OPT_fno_fast_math))
215680ecf5e66738a7058da58489ca55200212f3d42cChad Rosier    if (A->getOption().matches(options::OPT_ffinite_math_only))
215780ecf5e66738a7058da58489ca55200212f3d42cChad Rosier      CmdArgs.push_back("-ffinite-math-only");
2158abf07a7fb669dcb74040eef948d61dfe3c59ff17Chandler Carruth
21591b71848c5238747ede9650b7907172f8a7e088a5Daniel Dunbar  // Decide whether to use verbose asm. Verbose assembly is the default on
21601b71848c5238747ede9650b7907172f8a7e088a5Daniel Dunbar  // toolchains which have the integrated assembler on by default.
21611b71848c5238747ede9650b7907172f8a7e088a5Daniel Dunbar  bool IsVerboseAsmDefault = getToolChain().IsIntegratedAssemblerDefault();
21621b71848c5238747ede9650b7907172f8a7e088a5Daniel Dunbar  if (Args.hasFlag(options::OPT_fverbose_asm, options::OPT_fno_verbose_asm,
216320249a1af2e462dcafdd6a350f1c7967b264ff25Michael J. Spencer                   IsVerboseAsmDefault) ||
21641b71848c5238747ede9650b7907172f8a7e088a5Daniel Dunbar      Args.hasArg(options::OPT_dA))
2165f219e7c1529fac29e34483667f740b452e5ef9ccDaniel Dunbar    CmdArgs.push_back("-masm-verbose");
21661b71848c5238747ede9650b7907172f8a7e088a5Daniel Dunbar
2167f219e7c1529fac29e34483667f740b452e5ef9ccDaniel Dunbar  if (Args.hasArg(options::OPT_fdebug_pass_structure)) {
2168f219e7c1529fac29e34483667f740b452e5ef9ccDaniel Dunbar    CmdArgs.push_back("-mdebug-pass");
2169f219e7c1529fac29e34483667f740b452e5ef9ccDaniel Dunbar    CmdArgs.push_back("Structure");
2170f219e7c1529fac29e34483667f740b452e5ef9ccDaniel Dunbar  }
2171f219e7c1529fac29e34483667f740b452e5ef9ccDaniel Dunbar  if (Args.hasArg(options::OPT_fdebug_pass_arguments)) {
2172f219e7c1529fac29e34483667f740b452e5ef9ccDaniel Dunbar    CmdArgs.push_back("-mdebug-pass");
2173f219e7c1529fac29e34483667f740b452e5ef9ccDaniel Dunbar    CmdArgs.push_back("Arguments");
2174f219e7c1529fac29e34483667f740b452e5ef9ccDaniel Dunbar  }
21756bea73b3305a03479589e2642fbdcf6c096851aaDaniel Dunbar
2176d0c2ec44e093011256b6a0f57d455f36dffdea70John McCall  // Enable -mconstructor-aliases except on darwin, where we have to
2177d0c2ec44e093011256b6a0f57d455f36dffdea70John McCall  // work around a linker bug;  see <rdar://problem/7651567>.
2178905c45f15a25598620d19160c139c6b785aeea89Bob Wilson  if (!getToolChain().getTriple().isOSDarwin())
2179d0c2ec44e093011256b6a0f57d455f36dffdea70John McCall    CmdArgs.push_back("-mconstructor-aliases");
2180125b4cb35536e45201f8f2cb19ee620e3ad67c49NAKAMURA Takumi
218132096695c76033a6b0b1747c439f7378a11e8312John McCall  // Darwin's kernel doesn't support guard variables; just die if we
218232096695c76033a6b0b1747c439f7378a11e8312John McCall  // try to use them.
2183905c45f15a25598620d19160c139c6b785aeea89Bob Wilson  if (KernelOrKext && getToolChain().getTriple().isOSDarwin())
218432096695c76033a6b0b1747c439f7378a11e8312John McCall    CmdArgs.push_back("-fforbid-guard-variables");
218532096695c76033a6b0b1747c439f7378a11e8312John McCall
21866f75550e40a9177db9979fc130ce3ece026b137dDouglas Gregor  if (Args.hasArg(options::OPT_mms_bitfields)) {
21876f75550e40a9177db9979fc130ce3ece026b137dDouglas Gregor    CmdArgs.push_back("-mms-bitfields");
21886f75550e40a9177db9979fc130ce3ece026b137dDouglas Gregor  }
2189d0c2ec44e093011256b6a0f57d455f36dffdea70John McCall
21906bea73b3305a03479589e2642fbdcf6c096851aaDaniel Dunbar  // This is a coarse approximation of what llvm-gcc actually does, both
21916bea73b3305a03479589e2642fbdcf6c096851aaDaniel Dunbar  // -fasynchronous-unwind-tables and -fnon-call-exceptions interact in more
21926bea73b3305a03479589e2642fbdcf6c096851aaDaniel Dunbar  // complicated ways.
21936bea73b3305a03479589e2642fbdcf6c096851aaDaniel Dunbar  bool AsynchronousUnwindTables =
21946bea73b3305a03479589e2642fbdcf6c096851aaDaniel Dunbar    Args.hasFlag(options::OPT_fasynchronous_unwind_tables,
21956bea73b3305a03479589e2642fbdcf6c096851aaDaniel Dunbar                 options::OPT_fno_asynchronous_unwind_tables,
21966bea73b3305a03479589e2642fbdcf6c096851aaDaniel Dunbar                 getToolChain().IsUnwindTablesDefault() &&
21970a80ba74ffa3d3df55abfbc4474d7470c7c923e3Daniel Dunbar                 !KernelOrKext);
21986bea73b3305a03479589e2642fbdcf6c096851aaDaniel Dunbar  if (Args.hasFlag(options::OPT_funwind_tables, options::OPT_fno_unwind_tables,
21996bea73b3305a03479589e2642fbdcf6c096851aaDaniel Dunbar                   AsynchronousUnwindTables))
2200f219e7c1529fac29e34483667f740b452e5ef9ccDaniel Dunbar    CmdArgs.push_back("-munwind-tables");
2201f219e7c1529fac29e34483667f740b452e5ef9ccDaniel Dunbar
2202a6b2581f9595fb803fe7e2ef1d9f25e75b26d2fbChandler Carruth  getToolChain().addClangTargetOptions(Args, CmdArgs);
22038af669f2f1d92436fe6dc43144bb084a620e7516Rafael Espindola
2204f219e7c1529fac29e34483667f740b452e5ef9ccDaniel Dunbar  if (Arg *A = Args.getLastArg(options::OPT_flimited_precision_EQ)) {
2205f219e7c1529fac29e34483667f740b452e5ef9ccDaniel Dunbar    CmdArgs.push_back("-mlimit-float-precision");
22061d489cf4a04ad0ad8ac2696e4eed0995f3a67288Richard Smith    CmdArgs.push_back(A->getValue());
2207f219e7c1529fac29e34483667f740b452e5ef9ccDaniel Dunbar  }
2208bc85be85779a47bae728bbe6a2cd2e3732b1333dDaniel Dunbar
2209868bd0aa9281929ef50d2e9a8c82a036906f53f5Daniel Dunbar  // FIXME: Handle -mtune=.
2210868bd0aa9281929ef50d2e9a8c82a036906f53f5Daniel Dunbar  (void) Args.hasArg(options::OPT_mtune_EQ);
2211bc85be85779a47bae728bbe6a2cd2e3732b1333dDaniel Dunbar
22128e9ef0d87dad25f02e5abc6facf528778236115aBenjamin Kramer  if (Arg *A = Args.getLastArg(options::OPT_mcmodel_EQ)) {
2213f219e7c1529fac29e34483667f740b452e5ef9ccDaniel Dunbar    CmdArgs.push_back("-mcode-model");
22141d489cf4a04ad0ad8ac2696e4eed0995f3a67288Richard Smith    CmdArgs.push_back(A->getValue());
22158e9ef0d87dad25f02e5abc6facf528778236115aBenjamin Kramer  }
22168e9ef0d87dad25f02e5abc6facf528778236115aBenjamin Kramer
22176acda16e9c194dcbd0dea64341e182bdb65d0f41Daniel Dunbar  // Add target specific cpu and features flags.
22186acda16e9c194dcbd0dea64341e182bdb65d0f41Daniel Dunbar  switch(getToolChain().getTriple().getArch()) {
22196acda16e9c194dcbd0dea64341e182bdb65d0f41Daniel Dunbar  default:
22206acda16e9c194dcbd0dea64341e182bdb65d0f41Daniel Dunbar    break;
2221868bd0aa9281929ef50d2e9a8c82a036906f53f5Daniel Dunbar
2222b163ef7e7a5d904ef0962a7c38c460be083c4d63Daniel Dunbar  case llvm::Triple::arm:
2223b163ef7e7a5d904ef0962a7c38c460be083c4d63Daniel Dunbar  case llvm::Triple::thumb:
2224fa41d6975058ceb1b8a24564f6dcec72f89f62e8Daniel Dunbar    AddARMTargetArgs(Args, CmdArgs, KernelOrKext);
2225b163ef7e7a5d904ef0962a7c38c460be083c4d63Daniel Dunbar    break;
2226b163ef7e7a5d904ef0962a7c38c460be083c4d63Daniel Dunbar
2227ed734737d5af31906e30e537d4a41c760ddcfc59Eric Christopher  case llvm::Triple::mips:
2228ed734737d5af31906e30e537d4a41c760ddcfc59Eric Christopher  case llvm::Triple::mipsel:
22297ec0258505a11e7e8229d2c96507be6bbc40d7c1Akira Hatanaka  case llvm::Triple::mips64:
22307ec0258505a11e7e8229d2c96507be6bbc40d7c1Akira Hatanaka  case llvm::Triple::mips64el:
2231ed734737d5af31906e30e537d4a41c760ddcfc59Eric Christopher    AddMIPSTargetArgs(Args, CmdArgs);
22329284d215022457ba867080a713f08f026d89ea17Bruno Cardoso Lopes    break;
22339284d215022457ba867080a713f08f026d89ea17Bruno Cardoso Lopes
223402a84277864e5476b12c0ec687ed09f0b2922471Hal Finkel  case llvm::Triple::ppc:
223502a84277864e5476b12c0ec687ed09f0b2922471Hal Finkel  case llvm::Triple::ppc64:
223602a84277864e5476b12c0ec687ed09f0b2922471Hal Finkel    AddPPCTargetArgs(Args, CmdArgs);
223702a84277864e5476b12c0ec687ed09f0b2922471Hal Finkel    break;
223802a84277864e5476b12c0ec687ed09f0b2922471Hal Finkel
22399284d215022457ba867080a713f08f026d89ea17Bruno Cardoso Lopes  case llvm::Triple::sparc:
22409284d215022457ba867080a713f08f026d89ea17Bruno Cardoso Lopes    AddSparcTargetArgs(Args, CmdArgs);
2241ed734737d5af31906e30e537d4a41c760ddcfc59Eric Christopher    break;
2242ed734737d5af31906e30e537d4a41c760ddcfc59Eric Christopher
22436acda16e9c194dcbd0dea64341e182bdb65d0f41Daniel Dunbar  case llvm::Triple::x86:
22446acda16e9c194dcbd0dea64341e182bdb65d0f41Daniel Dunbar  case llvm::Triple::x86_64:
22456acda16e9c194dcbd0dea64341e182bdb65d0f41Daniel Dunbar    AddX86TargetArgs(Args, CmdArgs);
22466acda16e9c194dcbd0dea64341e182bdb65d0f41Daniel Dunbar    break;
22479631939f82c0eaa6fb3936a0ce58a41adfbc9011Tony Linthicum
22489631939f82c0eaa6fb3936a0ce58a41adfbc9011Tony Linthicum  case llvm::Triple::hexagon:
22499631939f82c0eaa6fb3936a0ce58a41adfbc9011Tony Linthicum    AddHexagonTargetArgs(Args, CmdArgs);
22509631939f82c0eaa6fb3936a0ce58a41adfbc9011Tony Linthicum    break;
2251bc85be85779a47bae728bbe6a2cd2e3732b1333dDaniel Dunbar  }
2252c21c485b4fb58ef5d55cf3e523263dd824a2ace4Daniel Dunbar
22539631939f82c0eaa6fb3936a0ce58a41adfbc9011Tony Linthicum
22549631939f82c0eaa6fb3936a0ce58a41adfbc9011Tony Linthicum
2255c176bc6be6f1407e7c6bd062f05a8636ea9a08e3Daniel Dunbar  // Pass the linker version in use.
2256c176bc6be6f1407e7c6bd062f05a8636ea9a08e3Daniel Dunbar  if (Arg *A = Args.getLastArg(options::OPT_mlinker_version_EQ)) {
2257c176bc6be6f1407e7c6bd062f05a8636ea9a08e3Daniel Dunbar    CmdArgs.push_back("-target-linker-version");
22581d489cf4a04ad0ad8ac2696e4eed0995f3a67288Richard Smith    CmdArgs.push_back(A->getValue());
2259c176bc6be6f1407e7c6bd062f05a8636ea9a08e3Daniel Dunbar  }
2260c176bc6be6f1407e7c6bd062f05a8636ea9a08e3Daniel Dunbar
2261b2d11cc3abd5ddf421a9bd36c6ec558038748a83Nick Lewycky  // -mno-omit-leaf-frame-pointer is the default on Darwin.
22621ad6648cce57bd187f1853f58fef26cd9bf4934fDaniel Dunbar  if (Args.hasFlag(options::OPT_momit_leaf_frame_pointer,
2263b2d11cc3abd5ddf421a9bd36c6ec558038748a83Nick Lewycky                   options::OPT_mno_omit_leaf_frame_pointer,
2264905c45f15a25598620d19160c139c6b785aeea89Bob Wilson                   !getToolChain().getTriple().isOSDarwin()))
22651ad6648cce57bd187f1853f58fef26cd9bf4934fDaniel Dunbar    CmdArgs.push_back("-momit-leaf-frame-pointer");
22661ad6648cce57bd187f1853f58fef26cd9bf4934fDaniel Dunbar
2267b30575c22f249c0697df0cd2aa872d14d4fa9c57Daniel Dunbar  // Explicitly error on some things we know we don't support and can't just
2268b30575c22f249c0697df0cd2aa872d14d4fa9c57Daniel Dunbar  // ignore.
2269b30575c22f249c0697df0cd2aa872d14d4fa9c57Daniel Dunbar  types::ID InputType = Inputs[0].getType();
2270e94db4771856659c12e1f269141cbbc4e55b1c47Daniel Dunbar  if (!Args.hasArg(options::OPT_fallow_unsupported)) {
2271e94db4771856659c12e1f269141cbbc4e55b1c47Daniel Dunbar    Arg *Unsupported;
2272e94db4771856659c12e1f269141cbbc4e55b1c47Daniel Dunbar    if (types::isCXX(InputType) &&
2273905c45f15a25598620d19160c139c6b785aeea89Bob Wilson        getToolChain().getTriple().isOSDarwin() &&
2274e94db4771856659c12e1f269141cbbc4e55b1c47Daniel Dunbar        getToolChain().getTriple().getArch() == llvm::Triple::x86) {
2275a544aeece3e16296bdbbc9ee32053fac9616f85bBob Wilson      if ((Unsupported = Args.getLastArg(options::OPT_fapple_kext)) ||
2276a544aeece3e16296bdbbc9ee32053fac9616f85bBob Wilson          (Unsupported = Args.getLastArg(options::OPT_mkernel)))
22775f9e272e632e951b1efe824cd16acb4d96077930Chris Lattner        D.Diag(diag::err_drv_clang_unsupported_opt_cxx_darwin_i386)
2278e94db4771856659c12e1f269141cbbc4e55b1c47Daniel Dunbar          << Unsupported->getOption().getName();
2279e94db4771856659c12e1f269141cbbc4e55b1c47Daniel Dunbar    }
2280b30575c22f249c0697df0cd2aa872d14d4fa9c57Daniel Dunbar  }
2281b30575c22f249c0697df0cd2aa872d14d4fa9c57Daniel Dunbar
22821d46033f760ba5fd266ce59fe391fac473f04f52Daniel Dunbar  Args.AddAllArgs(CmdArgs, options::OPT_v);
2283f7c16d903f11814e2d6780e2a2e189b7a7afc4edDaniel Dunbar  Args.AddLastArg(CmdArgs, options::OPT_H);
22842b81910618f63e4ce2373c926a26e76b4b91373fChad Rosier  if (D.CCPrintHeaders && !D.CCGenDiagnostics) {
2285322c29fefe7fa33f03273136eb5f8b7f5b4df7c0Daniel Dunbar    CmdArgs.push_back("-header-include-file");
2286322c29fefe7fa33f03273136eb5f8b7f5b4df7c0Daniel Dunbar    CmdArgs.push_back(D.CCPrintHeadersFilename ?
2287322c29fefe7fa33f03273136eb5f8b7f5b4df7c0Daniel Dunbar                      D.CCPrintHeadersFilename : "-");
2288322c29fefe7fa33f03273136eb5f8b7f5b4df7c0Daniel Dunbar  }
22891d46033f760ba5fd266ce59fe391fac473f04f52Daniel Dunbar  Args.AddLastArg(CmdArgs, options::OPT_P);
22901eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump  Args.AddLastArg(CmdArgs, options::OPT_print_ivar_layout);
22911d46033f760ba5fd266ce59fe391fac473f04f52Daniel Dunbar
22922b81910618f63e4ce2373c926a26e76b4b91373fChad Rosier  if (D.CCLogDiagnostics && !D.CCGenDiagnostics) {
2293c8a22b091677c02003880166e5d5767ca8d74b70Daniel Dunbar    CmdArgs.push_back("-diagnostic-log-file");
2294c8a22b091677c02003880166e5d5767ca8d74b70Daniel Dunbar    CmdArgs.push_back(D.CCLogDiagnosticsFilename ?
2295c8a22b091677c02003880166e5d5767ca8d74b70Daniel Dunbar                      D.CCLogDiagnosticsFilename : "-");
2296c8a22b091677c02003880166e5d5767ca8d74b70Daniel Dunbar  }
2297c8a22b091677c02003880166e5d5767ca8d74b70Daniel Dunbar
2298c706c8e440abf61910c042380e19c67932998395Eric Christopher  // Use the last option from "-g" group. "-gline-tables-only"
2299c706c8e440abf61910c042380e19c67932998395Eric Christopher  // is preserved, all other debug options are substituted with "-g".
230018f36d9eac8b425e8cfed389bbbf02c030f26be7Rafael Espindola  Args.ClaimAllArgs(options::OPT_g_Group);
2301a9cd83b1ddfa7d05e2887f59532e59e626b03ef6Alexey Samsonov  if (Arg *A = Args.getLastArg(options::OPT_g_Group)) {
2302c706c8e440abf61910c042380e19c67932998395Eric Christopher    if (A->getOption().matches(options::OPT_gline_tables_only))
2303a9cd83b1ddfa7d05e2887f59532e59e626b03ef6Alexey Samsonov      CmdArgs.push_back("-gline-tables-only");
2304c706c8e440abf61910c042380e19c67932998395Eric Christopher    else if (!A->getOption().matches(options::OPT_g0) &&
2305c706c8e440abf61910c042380e19c67932998395Eric Christopher             !A->getOption().matches(options::OPT_ggdb0))
2306cf6ba2eeaeabb03541ee98859805800c39759a47Chad Rosier      CmdArgs.push_back("-g");
2307a9cd83b1ddfa7d05e2887f59532e59e626b03ef6Alexey Samsonov  }
23081d46033f760ba5fd266ce59fe391fac473f04f52Daniel Dunbar
23097f3260764a3614e22dcf24d71c1155f14a9b4e6eAlexey Samsonov  // We ignore flags -gstrict-dwarf and -grecord-gcc-switches for now.
23107f3260764a3614e22dcf24d71c1155f14a9b4e6eAlexey Samsonov  Args.ClaimAllArgs(options::OPT_g_flags_Group);
2311da3301eec823fe770bfa49a1cb19649506caa698Eric Christopher  if (Args.hasArg(options::OPT_gcolumn_info))
2312da3301eec823fe770bfa49a1cb19649506caa698Eric Christopher    CmdArgs.push_back("-dwarf-column-info");
23137f3260764a3614e22dcf24d71c1155f14a9b4e6eAlexey Samsonov
2314c706c8e440abf61910c042380e19c67932998395Eric Christopher  // -gsplit-dwarf should turn on -g and enable the backend dwarf
2315c706c8e440abf61910c042380e19c67932998395Eric Christopher  // splitting and extraction.
2316f870e12f2324f48248793035ab0edb35d66e2299Eric Christopher  // FIXME: Currently only works on Linux.
2317f870e12f2324f48248793035ab0edb35d66e2299Eric Christopher  if (getToolChain().getTriple().getOS() == llvm::Triple::Linux &&
2318f870e12f2324f48248793035ab0edb35d66e2299Eric Christopher      Args.hasArg(options::OPT_gsplit_dwarf)) {
2319c706c8e440abf61910c042380e19c67932998395Eric Christopher    CmdArgs.push_back("-g");
2320c706c8e440abf61910c042380e19c67932998395Eric Christopher    CmdArgs.push_back("-backend-option");
2321c706c8e440abf61910c042380e19c67932998395Eric Christopher    CmdArgs.push_back("-split-dwarf=Enable");
2322c706c8e440abf61910c042380e19c67932998395Eric Christopher  }
2323c706c8e440abf61910c042380e19c67932998395Eric Christopher
23249cf933a67e54bea5475c5027fee2c1cf7365ee05Rafael Espindola  Args.AddAllArgs(CmdArgs, options::OPT_ffunction_sections);
23259cf933a67e54bea5475c5027fee2c1cf7365ee05Rafael Espindola  Args.AddAllArgs(CmdArgs, options::OPT_fdata_sections);
23269cf933a67e54bea5475c5027fee2c1cf7365ee05Rafael Espindola
23277255a2d997b15beae82e627052fdb1b2474495c2Chris Lattner  Args.AddAllArgs(CmdArgs, options::OPT_finstrument_functions);
23287255a2d997b15beae82e627052fdb1b2474495c2Chris Lattner
2329e8ba8d78a258ec992d3521eebdae8324db777b14Nick Lewycky  if (Args.hasArg(options::OPT_ftest_coverage) ||
2330e8ba8d78a258ec992d3521eebdae8324db777b14Nick Lewycky      Args.hasArg(options::OPT_coverage))
2331e8ba8d78a258ec992d3521eebdae8324db777b14Nick Lewycky    CmdArgs.push_back("-femit-coverage-notes");
2332e8ba8d78a258ec992d3521eebdae8324db777b14Nick Lewycky  if (Args.hasArg(options::OPT_fprofile_arcs) ||
2333e8ba8d78a258ec992d3521eebdae8324db777b14Nick Lewycky      Args.hasArg(options::OPT_coverage))
2334e8ba8d78a258ec992d3521eebdae8324db777b14Nick Lewycky    CmdArgs.push_back("-femit-coverage-data");
2335e8ba8d78a258ec992d3521eebdae8324db777b14Nick Lewycky
23365ea4f44e34449a78d6b38aa47c14b527839d7aacNick Lewycky  if (C.getArgs().hasArg(options::OPT_c) ||
23375ea4f44e34449a78d6b38aa47c14b527839d7aacNick Lewycky      C.getArgs().hasArg(options::OPT_S)) {
23385ea4f44e34449a78d6b38aa47c14b527839d7aacNick Lewycky    if (Output.isFilename()) {
23393dc05418538c719fea48b906bfa4febe5296e126Nick Lewycky      CmdArgs.push_back("-coverage-file");
2340025b3d4f528ce54242f414057cc45a65e39098dbEric Christopher      SmallString<128> CoverageFilename(Output.getFilename());
23410f815f1f91e5cf0726fd8296445038fec3bed80bNick Lewycky      if (llvm::sys::path::is_relative(CoverageFilename.str())) {
23420f815f1f91e5cf0726fd8296445038fec3bed80bNick Lewycky        if (const char *pwd = ::getenv("PWD")) {
23430f815f1f91e5cf0726fd8296445038fec3bed80bNick Lewycky          if (llvm::sys::path::is_absolute(pwd)) {
23440f815f1f91e5cf0726fd8296445038fec3bed80bNick Lewycky            SmallString<128> Pwd(pwd);
23450f815f1f91e5cf0726fd8296445038fec3bed80bNick Lewycky            llvm::sys::path::append(Pwd, CoverageFilename.str());
23460f815f1f91e5cf0726fd8296445038fec3bed80bNick Lewycky            CoverageFilename.swap(Pwd);
23470f815f1f91e5cf0726fd8296445038fec3bed80bNick Lewycky          }
23480f815f1f91e5cf0726fd8296445038fec3bed80bNick Lewycky        }
23490f815f1f91e5cf0726fd8296445038fec3bed80bNick Lewycky      }
2350025b3d4f528ce54242f414057cc45a65e39098dbEric Christopher      CmdArgs.push_back(Args.MakeArgString(CoverageFilename));
23515ea4f44e34449a78d6b38aa47c14b527839d7aacNick Lewycky    }
23525ea4f44e34449a78d6b38aa47c14b527839d7aacNick Lewycky  }
23535ea4f44e34449a78d6b38aa47c14b527839d7aacNick Lewycky
2354a268fc0f2229eb132ebc8501b140093aeb5516bfDaniel Dunbar  // Pass options for controlling the default header search paths.
2355a268fc0f2229eb132ebc8501b140093aeb5516bfDaniel Dunbar  if (Args.hasArg(options::OPT_nostdinc)) {
2356a268fc0f2229eb132ebc8501b140093aeb5516bfDaniel Dunbar    CmdArgs.push_back("-nostdsysteminc");
2357a268fc0f2229eb132ebc8501b140093aeb5516bfDaniel Dunbar    CmdArgs.push_back("-nobuiltininc");
2358a268fc0f2229eb132ebc8501b140093aeb5516bfDaniel Dunbar  } else {
235992d6d404833468120f9a86fb360691ac60585551Daniel Dunbar    if (Args.hasArg(options::OPT_nostdlibinc))
236092d6d404833468120f9a86fb360691ac60585551Daniel Dunbar        CmdArgs.push_back("-nostdsysteminc");
2361a268fc0f2229eb132ebc8501b140093aeb5516bfDaniel Dunbar    Args.AddLastArg(CmdArgs, options::OPT_nostdincxx);
2362a268fc0f2229eb132ebc8501b140093aeb5516bfDaniel Dunbar    Args.AddLastArg(CmdArgs, options::OPT_nobuiltininc);
2363a268fc0f2229eb132ebc8501b140093aeb5516bfDaniel Dunbar  }
23641d46033f760ba5fd266ce59fe391fac473f04f52Daniel Dunbar
23655f12232ef39e3d6c36d6600a73ebbe3c4a79f514Daniel Dunbar  // Pass the path to compiler resource files.
23665f12232ef39e3d6c36d6600a73ebbe3c4a79f514Daniel Dunbar  CmdArgs.push_back("-resource-dir");
2367225c41706dc0f3682236e351820d339e14390e00Daniel Dunbar  CmdArgs.push_back(D.ResourceDir.c_str());
23682ac9fc2ad64e16127df8c60caeea2edfe9a400a2Daniel Dunbar
2369389db16c63eec6ecfa9b235155252d8da766e94eArgyrios Kyrtzidis  Args.AddLastArg(CmdArgs, options::OPT_working_directory);
2370389db16c63eec6ecfa9b235155252d8da766e94eArgyrios Kyrtzidis
237130660a898545416f0fea2d717f16f75640001e38Ted Kremenek  bool ARCMTEnabled = false;
23728f0e8d22960d56f8390f4971e2c0f2f0a0884602John McCall  if (!Args.hasArg(options::OPT_fno_objc_arc)) {
237372ac120023abb73f3ff9386e193fed55fa9a96e2Argyrios Kyrtzidis    if (const Arg *A = Args.getLastArg(options::OPT_ccc_arcmt_check,
237469325d5b7cfecf1b3128745efc33612aedf1b8b4Argyrios Kyrtzidis                                       options::OPT_ccc_arcmt_modify,
237569325d5b7cfecf1b3128745efc33612aedf1b8b4Argyrios Kyrtzidis                                       options::OPT_ccc_arcmt_migrate)) {
237630660a898545416f0fea2d717f16f75640001e38Ted Kremenek      ARCMTEnabled = true;
23778f0e8d22960d56f8390f4971e2c0f2f0a0884602John McCall      switch (A->getOption().getID()) {
23788f0e8d22960d56f8390f4971e2c0f2f0a0884602John McCall      default:
23798f0e8d22960d56f8390f4971e2c0f2f0a0884602John McCall        llvm_unreachable("missed a case");
238072ac120023abb73f3ff9386e193fed55fa9a96e2Argyrios Kyrtzidis      case options::OPT_ccc_arcmt_check:
23818f0e8d22960d56f8390f4971e2c0f2f0a0884602John McCall        CmdArgs.push_back("-arcmt-check");
23828f0e8d22960d56f8390f4971e2c0f2f0a0884602John McCall        break;
238372ac120023abb73f3ff9386e193fed55fa9a96e2Argyrios Kyrtzidis      case options::OPT_ccc_arcmt_modify:
23848f0e8d22960d56f8390f4971e2c0f2f0a0884602John McCall        CmdArgs.push_back("-arcmt-modify");
23858f0e8d22960d56f8390f4971e2c0f2f0a0884602John McCall        break;
238669325d5b7cfecf1b3128745efc33612aedf1b8b4Argyrios Kyrtzidis      case options::OPT_ccc_arcmt_migrate:
238769325d5b7cfecf1b3128745efc33612aedf1b8b4Argyrios Kyrtzidis        CmdArgs.push_back("-arcmt-migrate");
238830660a898545416f0fea2d717f16f75640001e38Ted Kremenek        CmdArgs.push_back("-mt-migrate-directory");
23891d489cf4a04ad0ad8ac2696e4eed0995f3a67288Richard Smith        CmdArgs.push_back(A->getValue());
23907ee2049278b98d42709380054eb83f4952af1200Argyrios Kyrtzidis
23917ee2049278b98d42709380054eb83f4952af1200Argyrios Kyrtzidis        Args.AddLastArg(CmdArgs, options::OPT_arcmt_migrate_report_output);
23927ee2049278b98d42709380054eb83f4952af1200Argyrios Kyrtzidis        Args.AddLastArg(CmdArgs, options::OPT_arcmt_migrate_emit_arc_errors);
239369325d5b7cfecf1b3128745efc33612aedf1b8b4Argyrios Kyrtzidis        break;
23948f0e8d22960d56f8390f4971e2c0f2f0a0884602John McCall      }
23958f0e8d22960d56f8390f4971e2c0f2f0a0884602John McCall    }
23968f0e8d22960d56f8390f4971e2c0f2f0a0884602John McCall  }
239788b7cf00fcb582728c642da3927c59468efaf926Eric Christopher
239830660a898545416f0fea2d717f16f75640001e38Ted Kremenek  if (const Arg *A = Args.getLastArg(options::OPT_ccc_objcmt_migrate)) {
239930660a898545416f0fea2d717f16f75640001e38Ted Kremenek    if (ARCMTEnabled) {
240030660a898545416f0fea2d717f16f75640001e38Ted Kremenek      D.Diag(diag::err_drv_argument_not_allowed_with)
240130660a898545416f0fea2d717f16f75640001e38Ted Kremenek        << A->getAsString(Args) << "-ccc-arcmt-migrate";
240230660a898545416f0fea2d717f16f75640001e38Ted Kremenek    }
240330660a898545416f0fea2d717f16f75640001e38Ted Kremenek    CmdArgs.push_back("-mt-migrate-directory");
24041d489cf4a04ad0ad8ac2696e4eed0995f3a67288Richard Smith    CmdArgs.push_back(A->getValue());
240530660a898545416f0fea2d717f16f75640001e38Ted Kremenek
240630660a898545416f0fea2d717f16f75640001e38Ted Kremenek    if (!Args.hasArg(options::OPT_objcmt_migrate_literals,
240730660a898545416f0fea2d717f16f75640001e38Ted Kremenek                     options::OPT_objcmt_migrate_subscripting)) {
240830660a898545416f0fea2d717f16f75640001e38Ted Kremenek      // None specified, means enable them all.
240930660a898545416f0fea2d717f16f75640001e38Ted Kremenek      CmdArgs.push_back("-objcmt-migrate-literals");
241030660a898545416f0fea2d717f16f75640001e38Ted Kremenek      CmdArgs.push_back("-objcmt-migrate-subscripting");
241130660a898545416f0fea2d717f16f75640001e38Ted Kremenek    } else {
241230660a898545416f0fea2d717f16f75640001e38Ted Kremenek      Args.AddLastArg(CmdArgs, options::OPT_objcmt_migrate_literals);
241330660a898545416f0fea2d717f16f75640001e38Ted Kremenek      Args.AddLastArg(CmdArgs, options::OPT_objcmt_migrate_subscripting);
241430660a898545416f0fea2d717f16f75640001e38Ted Kremenek    }
241530660a898545416f0fea2d717f16f75640001e38Ted Kremenek  }
241630660a898545416f0fea2d717f16f75640001e38Ted Kremenek
2417c21c485b4fb58ef5d55cf3e523263dd824a2ace4Daniel Dunbar  // Add preprocessing options like -I, -D, etc. if we are using the
2418c21c485b4fb58ef5d55cf3e523263dd824a2ace4Daniel Dunbar  // preprocessor.
2419c21c485b4fb58ef5d55cf3e523263dd824a2ace4Daniel Dunbar  //
2420c21c485b4fb58ef5d55cf3e523263dd824a2ace4Daniel Dunbar  // FIXME: Support -fpreprocessed
2421c21c485b4fb58ef5d55cf3e523263dd824a2ace4Daniel Dunbar  if (types::getPreprocessedType(InputType) != types::TY_INVALID)
24229d718635fa805674aaba5d938f3dc6b35b8632baChad Rosier    AddPreprocessingOptions(C, JA, D, Args, CmdArgs, Output, Inputs);
24231d46033f760ba5fd266ce59fe391fac473f04f52Daniel Dunbar
242419d9d2ebbed9164e3f3a20fa065a26585c990a2eRafael Espindola  // Don't warn about "clang -c -DPIC -fPIC test.i" because libtool.m4 assumes
242519d9d2ebbed9164e3f3a20fa065a26585c990a2eRafael Espindola  // that "The compiler can only warn and ignore the option if not recognized".
242619d9d2ebbed9164e3f3a20fa065a26585c990a2eRafael Espindola  // When building with ccache, it will pass -D options to clang even on
242719d9d2ebbed9164e3f3a20fa065a26585c990a2eRafael Espindola  // preprocessed inputs and configure concludes that -fPIC is not supported.
242819d9d2ebbed9164e3f3a20fa065a26585c990a2eRafael Espindola  Args.ClaimAllArgs(options::OPT_D);
242919d9d2ebbed9164e3f3a20fa065a26585c990a2eRafael Espindola
243020f0eacf1682e4594da9d318b5b13ed4f6d6e7e5Daniel Dunbar  // Manually translate -O to -O2 and -O4 to -O3; let clang reject
2431337a6271b98c4c183f7eaad1563a75260b4f2871Daniel Dunbar  // others.
2432337a6271b98c4c183f7eaad1563a75260b4f2871Daniel Dunbar  if (Arg *A = Args.getLastArg(options::OPT_O_Group)) {
2433b827a0541b5fd095fcdb7ad0c3df93ca158c619aDaniel Dunbar    if (A->getOption().matches(options::OPT_O4))
2434337a6271b98c4c183f7eaad1563a75260b4f2871Daniel Dunbar      CmdArgs.push_back("-O3");
2435473916c038f75fa3b0c51a0bc7afc5b082e5c22fDaniel Dunbar    else if (A->getOption().matches(options::OPT_O) &&
24361d489cf4a04ad0ad8ac2696e4eed0995f3a67288Richard Smith             A->getValue()[0] == '\0')
243720f0eacf1682e4594da9d318b5b13ed4f6d6e7e5Daniel Dunbar      CmdArgs.push_back("-O2");
24381d46033f760ba5fd266ce59fe391fac473f04f52Daniel Dunbar    else
24395697aa0d75c87bafec78984048d558f8d12ca1b3Daniel Dunbar      A->render(Args, CmdArgs);
24401d46033f760ba5fd266ce59fe391fac473f04f52Daniel Dunbar  }
24411d46033f760ba5fd266ce59fe391fac473f04f52Daniel Dunbar
2442b2c0887457ef509c1a93bcddf9ad8f5e87d9945eChad Rosier  // Don't warn about unused -flto.  This can happen when we're preprocessing or
2443b2c0887457ef509c1a93bcddf9ad8f5e87d9945eChad Rosier  // precompiling.
2444b2c0887457ef509c1a93bcddf9ad8f5e87d9945eChad Rosier  Args.ClaimAllArgs(options::OPT_flto);
2445b2c0887457ef509c1a93bcddf9ad8f5e87d9945eChad Rosier
24466e8371eb97a08f724be22ae6042d1e9eacbe4c48Daniel Dunbar  Args.AddAllArgs(CmdArgs, options::OPT_W_Group);
2447e8cf7d143446c45568bb7c9a6fbd8f32ca6ae93eTed Kremenek  if (Args.hasFlag(options::OPT_pedantic, options::OPT_no_pedantic, false))
2448e8cf7d143446c45568bb7c9a6fbd8f32ca6ae93eTed Kremenek    CmdArgs.push_back("-pedantic");
24496e8371eb97a08f724be22ae6042d1e9eacbe4c48Daniel Dunbar  Args.AddLastArg(CmdArgs, options::OPT_pedantic_errors);
24501d46033f760ba5fd266ce59fe391fac473f04f52Daniel Dunbar  Args.AddLastArg(CmdArgs, options::OPT_w);
2451d573d26e1abcce24c31ece3d6f7af158db569e4cDaniel Dunbar
2452d573d26e1abcce24c31ece3d6f7af158db569e4cDaniel Dunbar  // Handle -{std, ansi, trigraphs} -- take the last of -{std, ansi}
2453d573d26e1abcce24c31ece3d6f7af158db569e4cDaniel Dunbar  // (-ansi is equivalent to -std=c89).
2454d573d26e1abcce24c31ece3d6f7af158db569e4cDaniel Dunbar  //
2455d573d26e1abcce24c31ece3d6f7af158db569e4cDaniel Dunbar  // If a std is supplied, only add -trigraphs if it follows the
2456d573d26e1abcce24c31ece3d6f7af158db569e4cDaniel Dunbar  // option.
2457d573d26e1abcce24c31ece3d6f7af158db569e4cDaniel Dunbar  if (Arg *Std = Args.getLastArg(options::OPT_std_EQ, options::OPT_ansi)) {
2458d573d26e1abcce24c31ece3d6f7af158db569e4cDaniel Dunbar    if (Std->getOption().matches(options::OPT_ansi))
2459528365d3189d27f3a90a4012baaa8b2814e0a231Nuno Lopes      if (types::isCXX(InputType))
2460294691eb1caf551083acd7b08630ef21c3fd760dDaniel Dunbar        CmdArgs.push_back("-std=c++98");
2461528365d3189d27f3a90a4012baaa8b2814e0a231Nuno Lopes      else
2462294691eb1caf551083acd7b08630ef21c3fd760dDaniel Dunbar        CmdArgs.push_back("-std=c89");
2463d573d26e1abcce24c31ece3d6f7af158db569e4cDaniel Dunbar    else
2464d573d26e1abcce24c31ece3d6f7af158db569e4cDaniel Dunbar      Std->render(Args, CmdArgs);
2465d573d26e1abcce24c31ece3d6f7af158db569e4cDaniel Dunbar
24660e10031ba5d0f9b3e5bc5570f39382d288779ab8Daniel Dunbar    if (Arg *A = Args.getLastArg(options::OPT_std_EQ, options::OPT_ansi,
24670e10031ba5d0f9b3e5bc5570f39382d288779ab8Daniel Dunbar                                 options::OPT_trigraphs))
24680e10031ba5d0f9b3e5bc5570f39382d288779ab8Daniel Dunbar      if (A != Std)
2469d573d26e1abcce24c31ece3d6f7af158db569e4cDaniel Dunbar        A->render(Args, CmdArgs);
2470a3ff202ee4fb21728e930d5d029ba4925129912cDaniel Dunbar  } else {
2471a3ff202ee4fb21728e930d5d029ba4925129912cDaniel Dunbar    // Honor -std-default.
24724a5290e773e70ec2c3b4353a3a4aa7d1a3e3cd66Daniel Dunbar    //
24734a5290e773e70ec2c3b4353a3a4aa7d1a3e3cd66Daniel Dunbar    // FIXME: Clang doesn't correctly handle -std= when the input language
24744a5290e773e70ec2c3b4353a3a4aa7d1a3e3cd66Daniel Dunbar    // doesn't match. For the time being just ignore this for C++ inputs;
24754a5290e773e70ec2c3b4353a3a4aa7d1a3e3cd66Daniel Dunbar    // eventually we want to do all the standard defaulting here instead of
24764a5290e773e70ec2c3b4353a3a4aa7d1a3e3cd66Daniel Dunbar    // splitting it between the driver and clang -cc1.
24774a5290e773e70ec2c3b4353a3a4aa7d1a3e3cd66Daniel Dunbar    if (!types::isCXX(InputType))
247850f88b99c60c2ed31b339cd8bd484766cc9e916bNico Weber      Args.AddAllArgsTranslated(CmdArgs, options::OPT_std_default_EQ,
247950f88b99c60c2ed31b339cd8bd484766cc9e916bNico Weber                                "-std=", /*Joined=*/true);
248050f88b99c60c2ed31b339cd8bd484766cc9e916bNico Weber    else if (getToolChain().getTriple().getOS() == llvm::Triple::Win32)
248150f88b99c60c2ed31b339cd8bd484766cc9e916bNico Weber      CmdArgs.push_back("-std=c++11");
248250f88b99c60c2ed31b339cd8bd484766cc9e916bNico Weber
2483d573d26e1abcce24c31ece3d6f7af158db569e4cDaniel Dunbar    Args.AddLastArg(CmdArgs, options::OPT_trigraphs);
2484a3ff202ee4fb21728e930d5d029ba4925129912cDaniel Dunbar  }
2485c21c485b4fb58ef5d55cf3e523263dd824a2ace4Daniel Dunbar
248650465d1d2f5f6dd3d8e18e2cf7bad4691e5ca6a8Chandler Carruth  // Map the bizarre '-Wwrite-strings' flag to a more sensible
248750465d1d2f5f6dd3d8e18e2cf7bad4691e5ca6a8Chandler Carruth  // '-fconst-strings'; this better indicates its actual behavior.
248850465d1d2f5f6dd3d8e18e2cf7bad4691e5ca6a8Chandler Carruth  if (Args.hasFlag(options::OPT_Wwrite_strings, options::OPT_Wno_write_strings,
248950465d1d2f5f6dd3d8e18e2cf7bad4691e5ca6a8Chandler Carruth                   false)) {
249050465d1d2f5f6dd3d8e18e2cf7bad4691e5ca6a8Chandler Carruth    // For perfect compatibility with GCC, we do this even in the presence of
249150465d1d2f5f6dd3d8e18e2cf7bad4691e5ca6a8Chandler Carruth    // '-w'. This flag names something other than a warning for GCC.
249250465d1d2f5f6dd3d8e18e2cf7bad4691e5ca6a8Chandler Carruth    CmdArgs.push_back("-fconst-strings");
249350465d1d2f5f6dd3d8e18e2cf7bad4691e5ca6a8Chandler Carruth  }
249450465d1d2f5f6dd3d8e18e2cf7bad4691e5ca6a8Chandler Carruth
24951cfe3c305c0d5393fd94167808b8f5d96cd65227Chandler Carruth  // GCC provides a macro definition '__DEPRECATED' when -Wdeprecated is active
2496f8c247d247f9f7ab2bf4965677e6d056711c99d5Chandler Carruth  // during C++ compilation, which it is by default. GCC keeps this define even
2497f8c247d247f9f7ab2bf4965677e6d056711c99d5Chandler Carruth  // in the presence of '-w', match this behavior bug-for-bug.
2498f8c247d247f9f7ab2bf4965677e6d056711c99d5Chandler Carruth  if (types::isCXX(InputType) &&
2499f8c247d247f9f7ab2bf4965677e6d056711c99d5Chandler Carruth      Args.hasFlag(options::OPT_Wdeprecated, options::OPT_Wno_deprecated,
2500f8c247d247f9f7ab2bf4965677e6d056711c99d5Chandler Carruth                   true)) {
2501f8c247d247f9f7ab2bf4965677e6d056711c99d5Chandler Carruth    CmdArgs.push_back("-fdeprecated-macro");
25021cfe3c305c0d5393fd94167808b8f5d96cd65227Chandler Carruth  }
25031cfe3c305c0d5393fd94167808b8f5d96cd65227Chandler Carruth
2504c304ba341a7daa88da42faf8f86310b764dd7b6aChandler Carruth  // Translate GCC's misnamer '-fasm' arguments to '-fgnu-keywords'.
2505c304ba341a7daa88da42faf8f86310b764dd7b6aChandler Carruth  if (Arg *Asm = Args.getLastArg(options::OPT_fasm, options::OPT_fno_asm)) {
2506c304ba341a7daa88da42faf8f86310b764dd7b6aChandler Carruth    if (Asm->getOption().matches(options::OPT_fasm))
2507c304ba341a7daa88da42faf8f86310b764dd7b6aChandler Carruth      CmdArgs.push_back("-fgnu-keywords");
2508c304ba341a7daa88da42faf8f86310b764dd7b6aChandler Carruth    else
2509c304ba341a7daa88da42faf8f86310b764dd7b6aChandler Carruth      CmdArgs.push_back("-fno-gnu-keywords");
2510c304ba341a7daa88da42faf8f86310b764dd7b6aChandler Carruth  }
2511c304ba341a7daa88da42faf8f86310b764dd7b6aChandler Carruth
251261b1efe2d0b459a98962fd9b4c097ad8bb9bfdecRafael Espindola  if (ShouldDisableCFI(Args, getToolChain()))
251361b1efe2d0b459a98962fd9b4c097ad8bb9bfdecRafael Espindola    CmdArgs.push_back("-fno-dwarf2-cfi-asm");
2514f24a151d645abc89f94aa58ad59f3131502041b1Rafael Espindola
2515ea523d73a6de06f828952a02f5ff86e4cc631695Nick Lewycky  if (ShouldDisableDwarfDirectory(Args, getToolChain()))
2516ea523d73a6de06f828952a02f5ff86e4cc631695Nick Lewycky    CmdArgs.push_back("-fno-dwarf-directory-asm");
2517ea523d73a6de06f828952a02f5ff86e4cc631695Nick Lewycky
2518d566df67bed6381f6e859bbd21fd43ff89277cc0Chandler Carruth  // Add in -fdebug-compilation-dir if necessary.
2519d566df67bed6381f6e859bbd21fd43ff89277cc0Chandler Carruth  addDebugCompDirArg(Args, CmdArgs);
25207c4fd9121f5885096fd3258d20a984e3f08f8603Nick Lewycky
2521c18c42345636e2866fed75c7e434fb659d747672Richard Smith  if (Arg *A = Args.getLastArg(options::OPT_ftemplate_depth_,
2522c18c42345636e2866fed75c7e434fb659d747672Richard Smith                               options::OPT_ftemplate_depth_EQ)) {
25231d46033f760ba5fd266ce59fe391fac473f04f52Daniel Dunbar    CmdArgs.push_back("-ftemplate-depth");
25241d489cf4a04ad0ad8ac2696e4eed0995f3a67288Richard Smith    CmdArgs.push_back(A->getValue());
2525b488c1dac8e53206f07103d794a62a3f5012c0f4Daniel Dunbar  }
2526b488c1dac8e53206f07103d794a62a3f5012c0f4Daniel Dunbar
2527c18c42345636e2866fed75c7e434fb659d747672Richard Smith  if (Arg *A = Args.getLastArg(options::OPT_fconstexpr_depth_EQ)) {
2528c18c42345636e2866fed75c7e434fb659d747672Richard Smith    CmdArgs.push_back("-fconstexpr-depth");
25291d489cf4a04ad0ad8ac2696e4eed0995f3a67288Richard Smith    CmdArgs.push_back(A->getValue());
2530c18c42345636e2866fed75c7e434fb659d747672Richard Smith  }
2531c18c42345636e2866fed75c7e434fb659d747672Richard Smith
25329e738cc9d4b4655c44dadeb22f3a314daf43b995Richard Smith  if (Arg *A = Args.getLastArg(options::OPT_fbracket_depth_EQ)) {
25339e738cc9d4b4655c44dadeb22f3a314daf43b995Richard Smith    CmdArgs.push_back("-fbracket-depth");
25349e738cc9d4b4655c44dadeb22f3a314daf43b995Richard Smith    CmdArgs.push_back(A->getValue());
25359e738cc9d4b4655c44dadeb22f3a314daf43b995Richard Smith  }
25369e738cc9d4b4655c44dadeb22f3a314daf43b995Richard Smith
25371380a147d4578b619c215b23aa79ce17036d3c46Argyrios Kyrtzidis  if (Arg *A = Args.getLastArg(options::OPT_Wlarge_by_value_copy_EQ,
25381380a147d4578b619c215b23aa79ce17036d3c46Argyrios Kyrtzidis                               options::OPT_Wlarge_by_value_copy_def)) {
25392e4fd6d9a1c8ba9c400324d230cfc49050550deaJean-Daniel Dupas    if (A->getNumValues()) {
25401d489cf4a04ad0ad8ac2696e4eed0995f3a67288Richard Smith      StringRef bytes = A->getValue();
25412e4fd6d9a1c8ba9c400324d230cfc49050550deaJean-Daniel Dupas      CmdArgs.push_back(Args.MakeArgString("-Wlarge-by-value-copy=" + bytes));
25422e4fd6d9a1c8ba9c400324d230cfc49050550deaJean-Daniel Dupas    } else
25432e4fd6d9a1c8ba9c400324d230cfc49050550deaJean-Daniel Dupas      CmdArgs.push_back("-Wlarge-by-value-copy=64"); // default value
25443532fdd1db8ff6f353f2a5b215cebe3e0e2ff3c2Argyrios Kyrtzidis  }
25453532fdd1db8ff6f353f2a5b215cebe3e0e2ff3c2Argyrios Kyrtzidis
2546b3198a841e7f356f171f1e11faff014b2deb1eb8Nuno Lopes
2547c635710bcbb9598acd5a14647ba7ca28bee89a68Michael J. Spencer  if (Args.hasArg(options::OPT_relocatable_pch))
254866861e09d590994a8b941eaa328e4d8f33adec9eDaniel Dunbar    CmdArgs.push_back("-relocatable-pch");
25491eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump
2550294691eb1caf551083acd7b08630ef21c3fd760dDaniel Dunbar  if (Arg *A = Args.getLastArg(options::OPT_fconstant_string_class_EQ)) {
2551294691eb1caf551083acd7b08630ef21c3fd760dDaniel Dunbar    CmdArgs.push_back("-fconstant-string-class");
25521d489cf4a04ad0ad8ac2696e4eed0995f3a67288Richard Smith    CmdArgs.push_back(A->getValue());
2553294691eb1caf551083acd7b08630ef21c3fd760dDaniel Dunbar  }
25548a5a9aaddb627c0884c2ed8db55cc29fdb601195David Chisnall
2555124fca533d9fef2e3f6359283909bd342b5f5f26Chris Lattner  if (Arg *A = Args.getLastArg(options::OPT_ftabstop_EQ)) {
2556124fca533d9fef2e3f6359283909bd342b5f5f26Chris Lattner    CmdArgs.push_back("-ftabstop");
25571d489cf4a04ad0ad8ac2696e4eed0995f3a67288Richard Smith    CmdArgs.push_back(A->getValue());
2558124fca533d9fef2e3f6359283909bd342b5f5f26Chris Lattner  }
2559124fca533d9fef2e3f6359283909bd342b5f5f26Chris Lattner
25600f0c963f9b7ac6f0176c34d405d48fcb005dfab6Chris Lattner  CmdArgs.push_back("-ferror-limit");
25610f0c963f9b7ac6f0176c34d405d48fcb005dfab6Chris Lattner  if (Arg *A = Args.getLastArg(options::OPT_ferror_limit_EQ))
25621d489cf4a04ad0ad8ac2696e4eed0995f3a67288Richard Smith    CmdArgs.push_back(A->getValue());
25630f0c963f9b7ac6f0176c34d405d48fcb005dfab6Chris Lattner  else
25640f0c963f9b7ac6f0176c34d405d48fcb005dfab6Chris Lattner    CmdArgs.push_back("19");
2565575cf3791216c33770ba950430493cdd43099f8fDouglas Gregor
2566c40f73c6e715044d327409564bf3656254101d46Chandler Carruth  if (Arg *A = Args.getLastArg(options::OPT_fmacro_backtrace_limit_EQ)) {
2567c40f73c6e715044d327409564bf3656254101d46Chandler Carruth    CmdArgs.push_back("-fmacro-backtrace-limit");
25681d489cf4a04ad0ad8ac2696e4eed0995f3a67288Richard Smith    CmdArgs.push_back(A->getValue());
2569c40f73c6e715044d327409564bf3656254101d46Chandler Carruth  }
2570c40f73c6e715044d327409564bf3656254101d46Chandler Carruth
2571c40f73c6e715044d327409564bf3656254101d46Chandler Carruth  if (Arg *A = Args.getLastArg(options::OPT_ftemplate_backtrace_limit_EQ)) {
2572c40f73c6e715044d327409564bf3656254101d46Chandler Carruth    CmdArgs.push_back("-ftemplate-backtrace-limit");
25731d489cf4a04ad0ad8ac2696e4eed0995f3a67288Richard Smith    CmdArgs.push_back(A->getValue());
2574c40f73c6e715044d327409564bf3656254101d46Chandler Carruth  }
2575c40f73c6e715044d327409564bf3656254101d46Chandler Carruth
257608d6e032a2a0a8656d12b3b7b93942987bb12eb7Richard Smith  if (Arg *A = Args.getLastArg(options::OPT_fconstexpr_backtrace_limit_EQ)) {
257708d6e032a2a0a8656d12b3b7b93942987bb12eb7Richard Smith    CmdArgs.push_back("-fconstexpr-backtrace-limit");
25781d489cf4a04ad0ad8ac2696e4eed0995f3a67288Richard Smith    CmdArgs.push_back(A->getValue());
257908d6e032a2a0a8656d12b3b7b93942987bb12eb7Richard Smith  }
258008d6e032a2a0a8656d12b3b7b93942987bb12eb7Richard Smith
258155efe142a84b2aab6d0186c20a311c347a65f794Daniel Dunbar  // Pass -fmessage-length=.
2582a28690e5b0e423a6287ebe3a5565fd1896d7ebffDaniel Dunbar  CmdArgs.push_back("-fmessage-length");
258355efe142a84b2aab6d0186c20a311c347a65f794Daniel Dunbar  if (Arg *A = Args.getLastArg(options::OPT_fmessage_length_EQ)) {
25841d489cf4a04ad0ad8ac2696e4eed0995f3a67288Richard Smith    CmdArgs.push_back(A->getValue());
258555efe142a84b2aab6d0186c20a311c347a65f794Daniel Dunbar  } else {
258655efe142a84b2aab6d0186c20a311c347a65f794Daniel Dunbar    // If -fmessage-length=N was not specified, determine whether this is a
258755efe142a84b2aab6d0186c20a311c347a65f794Daniel Dunbar    // terminal and, if so, implicitly define -fmessage-length appropriately.
258855efe142a84b2aab6d0186c20a311c347a65f794Daniel Dunbar    unsigned N = llvm::sys::Process::StandardErrColumns();
25895f9e272e632e951b1efe824cd16acb4d96077930Chris Lattner    CmdArgs.push_back(Args.MakeArgString(Twine(N)));
259055efe142a84b2aab6d0186c20a311c347a65f794Daniel Dunbar  }
259155efe142a84b2aab6d0186c20a311c347a65f794Daniel Dunbar
2592a880b19aa6ef1dc95936f5de052be7a7d6ee6814John McCall  // -fvisibility= and -fvisibility-ms-compat are of a piece.
2593a880b19aa6ef1dc95936f5de052be7a7d6ee6814John McCall  if (const Arg *A = Args.getLastArg(options::OPT_fvisibility_EQ,
2594a880b19aa6ef1dc95936f5de052be7a7d6ee6814John McCall                                     options::OPT_fvisibility_ms_compat)) {
2595a880b19aa6ef1dc95936f5de052be7a7d6ee6814John McCall    if (A->getOption().matches(options::OPT_fvisibility_EQ)) {
2596a880b19aa6ef1dc95936f5de052be7a7d6ee6814John McCall      CmdArgs.push_back("-fvisibility");
2597a880b19aa6ef1dc95936f5de052be7a7d6ee6814John McCall      CmdArgs.push_back(A->getValue());
2598a880b19aa6ef1dc95936f5de052be7a7d6ee6814John McCall    } else {
2599a880b19aa6ef1dc95936f5de052be7a7d6ee6814John McCall      assert(A->getOption().matches(options::OPT_fvisibility_ms_compat));
2600a880b19aa6ef1dc95936f5de052be7a7d6ee6814John McCall      CmdArgs.push_back("-fvisibility");
2601a880b19aa6ef1dc95936f5de052be7a7d6ee6814John McCall      CmdArgs.push_back("hidden");
2602a880b19aa6ef1dc95936f5de052be7a7d6ee6814John McCall      CmdArgs.push_back("-ftype-visibility");
2603a880b19aa6ef1dc95936f5de052be7a7d6ee6814John McCall      CmdArgs.push_back("default");
2604a880b19aa6ef1dc95936f5de052be7a7d6ee6814John McCall    }
2605ba8d86172c8d9e2476c6fd2415731639223174c5Daniel Dunbar  }
2606ba8d86172c8d9e2476c6fd2415731639223174c5Daniel Dunbar
26077cf84d66965a7706004d8590b5af5fe54b85f525Douglas Gregor  Args.AddLastArg(CmdArgs, options::OPT_fvisibility_inlines_hidden);
260820249a1af2e462dcafdd6a350f1c7967b264ff25Michael J. Spencer
2609de981f3ff163bc9ec69e4c5e7316e94276412993Hans Wennborg  Args.AddLastArg(CmdArgs, options::OPT_ftlsmodel_EQ);
2610de981f3ff163bc9ec69e4c5e7316e94276412993Hans Wennborg
26110a80ba74ffa3d3df55abfbc4474d7470c7c923e3Daniel Dunbar  // -fhosted is default.
2612afc4baa37c2f38fadf05b15456b10a0994d51b0bChad Rosier  if (Args.hasFlag(options::OPT_ffreestanding, options::OPT_fhosted, false) ||
2613afc4baa37c2f38fadf05b15456b10a0994d51b0bChad Rosier      KernelOrKext)
26140a80ba74ffa3d3df55abfbc4474d7470c7c923e3Daniel Dunbar    CmdArgs.push_back("-ffreestanding");
26150a80ba74ffa3d3df55abfbc4474d7470c7c923e3Daniel Dunbar
2616ba8d86172c8d9e2476c6fd2415731639223174c5Daniel Dunbar  // Forward -f (flag) options which we can pass directly.
26173aaf082689d3235937a2e56a60f90fc1b3aebfb2Daniel Dunbar  Args.AddLastArg(CmdArgs, options::OPT_femit_all_decls);
26183aaf082689d3235937a2e56a60f90fc1b3aebfb2Daniel Dunbar  Args.AddLastArg(CmdArgs, options::OPT_fheinous_gnu_extensions);
2619c69e1cf04323f2e786d40e8a5ba84e77ee1c6827Devang Patel  Args.AddLastArg(CmdArgs, options::OPT_flimit_debug_info);
2620033be8bd33e0f84db8158771e13528e071563b73Devang Patel  Args.AddLastArg(CmdArgs, options::OPT_fno_limit_debug_info);
2621e88c4513157cc551ed8080b1e3b3b875a9a570e1Eric Christopher  Args.AddLastArg(CmdArgs, options::OPT_fno_operator_names);
262217ba267cae596d5eb35fa0963ebcf73571572940Anton Yartsev  Args.AddLastArg(CmdArgs, options::OPT_faltivec);
2623246b6aa6763de8c617d564ef33123a8f3293a80eRichard Trieu  Args.AddLastArg(CmdArgs, options::OPT_fdiagnostics_show_template_tree);
2624246b6aa6763de8c617d564ef33123a8f3293a80eRichard Trieu  Args.AddLastArg(CmdArgs, options::OPT_fno_elide_type);
26254574c3d75edb0a496d36246b760094f3acf1ba27Chad Rosier
2626bb1071c0568db9bd7934e869a53d671632eb9291Alexey Samsonov  SanitizerArgs Sanitize(D, Args);
2627c4dabadb51475e76b606024f144e7cf93b0bad00Richard Smith  Sanitize.addArgs(Args, CmdArgs);
2628c4dabadb51475e76b606024f144e7cf93b0bad00Richard Smith
26292d382d149b442b928fd3fb8edcc8d82ea9325872Will Dietz  if (!Args.hasFlag(options::OPT_fsanitize_recover,
26302d382d149b442b928fd3fb8edcc8d82ea9325872Will Dietz                    options::OPT_fno_sanitize_recover,
26312d382d149b442b928fd3fb8edcc8d82ea9325872Will Dietz                    true))
26322d382d149b442b928fd3fb8edcc8d82ea9325872Will Dietz    CmdArgs.push_back("-fno-sanitize-recover");
26332d382d149b442b928fd3fb8edcc8d82ea9325872Will Dietz
263478d85b1c5830a881c0a20a1b3fea99ee73149590Chad Rosier  if (Args.hasArg(options::OPT_fcatch_undefined_behavior) ||
263578d85b1c5830a881c0a20a1b3fea99ee73149590Chad Rosier      Args.hasFlag(options::OPT_fsanitize_undefined_trap_on_error,
263678d85b1c5830a881c0a20a1b3fea99ee73149590Chad Rosier                   options::OPT_fno_sanitize_undefined_trap_on_error, false))
263778d85b1c5830a881c0a20a1b3fea99ee73149590Chad Rosier    CmdArgs.push_back("-fsanitize-undefined-trap-on-error");
263878d85b1c5830a881c0a20a1b3fea99ee73149590Chad Rosier
263998654c938da09e045ff3c18324d26d52d36ee155Eric Christopher  // Report an error for -faltivec on anything other than PowerPC.
26404574c3d75edb0a496d36246b760094f3acf1ba27Chad Rosier  if (const Arg *A = Args.getLastArg(options::OPT_faltivec))
26414574c3d75edb0a496d36246b760094f3acf1ba27Chad Rosier    if (!(getToolChain().getTriple().getArch() == llvm::Triple::ppc ||
26424574c3d75edb0a496d36246b760094f3acf1ba27Chad Rosier          getToolChain().getTriple().getArch() == llvm::Triple::ppc64))
26434574c3d75edb0a496d36246b760094f3acf1ba27Chad Rosier      D.Diag(diag::err_drv_argument_only_allowed_with)
26444574c3d75edb0a496d36246b760094f3acf1ba27Chad Rosier        << A->getAsString(Args) << "ppc/ppc64";
26454574c3d75edb0a496d36246b760094f3acf1ba27Chad Rosier
2646bbe8e3eff56ac1d79f3668d706536e3cebe28c18Daniel Dunbar  if (getToolChain().SupportsProfiling())
2647bbe8e3eff56ac1d79f3668d706536e3cebe28c18Daniel Dunbar    Args.AddLastArg(CmdArgs, options::OPT_pg);
26488c6fa84b2e4a30317b7b214a7657cb593d67773bDaniel Dunbar
26498c6fa84b2e4a30317b7b214a7657cb593d67773bDaniel Dunbar  // -flax-vector-conversions is default.
26508c6fa84b2e4a30317b7b214a7657cb593d67773bDaniel Dunbar  if (!Args.hasFlag(options::OPT_flax_vector_conversions,
26518c6fa84b2e4a30317b7b214a7657cb593d67773bDaniel Dunbar                    options::OPT_fno_lax_vector_conversions))
26528c6fa84b2e4a30317b7b214a7657cb593d67773bDaniel Dunbar    CmdArgs.push_back("-fno-lax-vector-conversions");
26538c6fa84b2e4a30317b7b214a7657cb593d67773bDaniel Dunbar
2654b466d01e464b21832c23eeed90112bc5c26c0236Fariborz Jahanian  if (Args.getLastArg(options::OPT_fapple_kext))
2655b466d01e464b21832c23eeed90112bc5c26c0236Fariborz Jahanian    CmdArgs.push_back("-fapple-kext");
2656b466d01e464b21832c23eeed90112bc5c26c0236Fariborz Jahanian
2657940152f726353e08e3bdcef6f85bc8aa73173597David Blaikie  if (Args.hasFlag(options::OPT_frewrite_includes,
2658940152f726353e08e3bdcef6f85bc8aa73173597David Blaikie                   options::OPT_fno_rewrite_includes, false))
2659940152f726353e08e3bdcef6f85bc8aa73173597David Blaikie    CmdArgs.push_back("-frewrite-includes");
2660940152f726353e08e3bdcef6f85bc8aa73173597David Blaikie
266134e65770ad6142b033d6cec4f476ed20fb248bf3Fariborz Jahanian  Args.AddLastArg(CmdArgs, options::OPT_fobjc_sender_dependent_dispatch);
2662182e09240a33c6f1d303deecabec6e0e9c9d109dChris Lattner  Args.AddLastArg(CmdArgs, options::OPT_fdiagnostics_print_source_range_info);
26634786c15f4977c7cee98fde3ebdee213dba23848bDouglas Gregor  Args.AddLastArg(CmdArgs, options::OPT_fdiagnostics_parseable_fixits);
26643aaf082689d3235937a2e56a60f90fc1b3aebfb2Daniel Dunbar  Args.AddLastArg(CmdArgs, options::OPT_ftime_report);
26653aaf082689d3235937a2e56a60f90fc1b3aebfb2Daniel Dunbar  Args.AddLastArg(CmdArgs, options::OPT_ftrapv);
26667f18e67e1b577a50402e8b43508ab2311a5c45b5David Chisnall
26677f18e67e1b577a50402e8b43508ab2311a5c45b5David Chisnall  if (Arg *A = Args.getLastArg(options::OPT_ftrapv_handler_EQ)) {
26687f18e67e1b577a50402e8b43508ab2311a5c45b5David Chisnall    CmdArgs.push_back("-ftrapv-handler");
26691d489cf4a04ad0ad8ac2696e4eed0995f3a67288Richard Smith    CmdArgs.push_back(A->getValue());
26707f18e67e1b577a50402e8b43508ab2311a5c45b5David Chisnall  }
26717f18e67e1b577a50402e8b43508ab2311a5c45b5David Chisnall
267271fd6cc843719cab528a5df0899ad3d15cb9297fBob Wilson  Args.AddLastArg(CmdArgs, options::OPT_ftrap_function_EQ);
267349af1f3cedc55726e4a3dd343eb4a8e24eab8439Evan Cheng
26745adb5a84bfb4f2e5f1ea28fdfc6ee1cd9b622c60Chandler Carruth  // -fno-strict-overflow implies -fwrapv if it isn't disabled, but
26755adb5a84bfb4f2e5f1ea28fdfc6ee1cd9b622c60Chandler Carruth  // -fstrict-overflow won't turn off an explicitly enabled -fwrapv.
26765adb5a84bfb4f2e5f1ea28fdfc6ee1cd9b622c60Chandler Carruth  if (Arg *A = Args.getLastArg(options::OPT_fwrapv,
26775adb5a84bfb4f2e5f1ea28fdfc6ee1cd9b622c60Chandler Carruth                               options::OPT_fno_wrapv)) {
26785adb5a84bfb4f2e5f1ea28fdfc6ee1cd9b622c60Chandler Carruth    if (A->getOption().matches(options::OPT_fwrapv))
26795adb5a84bfb4f2e5f1ea28fdfc6ee1cd9b622c60Chandler Carruth      CmdArgs.push_back("-fwrapv");
26805adb5a84bfb4f2e5f1ea28fdfc6ee1cd9b622c60Chandler Carruth  } else if (Arg *A = Args.getLastArg(options::OPT_fstrict_overflow,
26815adb5a84bfb4f2e5f1ea28fdfc6ee1cd9b622c60Chandler Carruth                                      options::OPT_fno_strict_overflow)) {
26825adb5a84bfb4f2e5f1ea28fdfc6ee1cd9b622c60Chandler Carruth    if (A->getOption().matches(options::OPT_fno_strict_overflow))
26835adb5a84bfb4f2e5f1ea28fdfc6ee1cd9b622c60Chandler Carruth      CmdArgs.push_back("-fwrapv");
26845adb5a84bfb4f2e5f1ea28fdfc6ee1cd9b622c60Chandler Carruth  }
26853aaf082689d3235937a2e56a60f90fc1b3aebfb2Daniel Dunbar  Args.AddLastArg(CmdArgs, options::OPT_fwritable_strings);
2686f84d409903dd4107c8cef5a08fcfce6e5c21d4deEric Christopher  Args.AddLastArg(CmdArgs, options::OPT_funroll_loops);
26871d46033f760ba5fd266ce59fe391fac473f04f52Daniel Dunbar
26885345c391c65d1780a0d7b0102b7f735cc3f82732Daniel Dunbar  Args.AddLastArg(CmdArgs, options::OPT_pthread);
26895345c391c65d1780a0d7b0102b7f735cc3f82732Daniel Dunbar
2690f3b52315e2ee52bdff9cba31b037c7e6b3adfadcMahesha S
26919e5cc6b703b2d0013f13800c2ffbeb3cf85fcfadDaniel Dunbar  // -stack-protector=0 is default.
26929e5cc6b703b2d0013f13800c2ffbeb3cf85fcfadDaniel Dunbar  unsigned StackProtectorLevel = 0;
269345483f7a1b3e57b4603b141bee80596b2d4dd443Bill Wendling  if (Arg *A = Args.getLastArg(options::OPT_fno_stack_protector,
269445483f7a1b3e57b4603b141bee80596b2d4dd443Bill Wendling                               options::OPT_fstack_protector_all,
269545483f7a1b3e57b4603b141bee80596b2d4dd443Bill Wendling                               options::OPT_fstack_protector)) {
26969e5cc6b703b2d0013f13800c2ffbeb3cf85fcfadDaniel Dunbar    if (A->getOption().matches(options::OPT_fstack_protector))
26979e5cc6b703b2d0013f13800c2ffbeb3cf85fcfadDaniel Dunbar      StackProtectorLevel = 1;
26989e5cc6b703b2d0013f13800c2ffbeb3cf85fcfadDaniel Dunbar    else if (A->getOption().matches(options::OPT_fstack_protector_all))
26999e5cc6b703b2d0013f13800c2ffbeb3cf85fcfadDaniel Dunbar      StackProtectorLevel = 2;
27002fef11164cbe804f7b808c07757c6f900c08d765Nico Weber  } else {
27012fef11164cbe804f7b808c07757c6f900c08d765Nico Weber    StackProtectorLevel =
27022fef11164cbe804f7b808c07757c6f900c08d765Nico Weber      getToolChain().GetDefaultStackProtectorLevel(KernelOrKext);
27032fef11164cbe804f7b808c07757c6f900c08d765Nico Weber  }
27049e5cc6b703b2d0013f13800c2ffbeb3cf85fcfadDaniel Dunbar  if (StackProtectorLevel) {
27059e5cc6b703b2d0013f13800c2ffbeb3cf85fcfadDaniel Dunbar    CmdArgs.push_back("-stack-protector");
27065f9e272e632e951b1efe824cd16acb4d96077930Chris Lattner    CmdArgs.push_back(Args.MakeArgString(Twine(StackProtectorLevel)));
270753b43a78d575e9e8d0af7a3f4b0a744679d65994Joerg Sonnenberger  }
2708a7afeb040416c0eaac19b92db914913a788044f5Chad Rosier
270953b43a78d575e9e8d0af7a3f4b0a744679d65994Joerg Sonnenberger  // --param ssp-buffer-size=
271053b43a78d575e9e8d0af7a3f4b0a744679d65994Joerg Sonnenberger  for (arg_iterator it = Args.filtered_begin(options::OPT__param),
271153b43a78d575e9e8d0af7a3f4b0a744679d65994Joerg Sonnenberger       ie = Args.filtered_end(); it != ie; ++it) {
27121d489cf4a04ad0ad8ac2696e4eed0995f3a67288Richard Smith    StringRef Str((*it)->getValue());
271353b43a78d575e9e8d0af7a3f4b0a744679d65994Joerg Sonnenberger    if (Str.startswith("ssp-buffer-size=")) {
271453b43a78d575e9e8d0af7a3f4b0a744679d65994Joerg Sonnenberger      if (StackProtectorLevel) {
2715a7afeb040416c0eaac19b92db914913a788044f5Chad Rosier        CmdArgs.push_back("-stack-protector-buffer-size");
2716a7afeb040416c0eaac19b92db914913a788044f5Chad Rosier        // FIXME: Verify the argument is a valid integer.
2717a7afeb040416c0eaac19b92db914913a788044f5Chad Rosier        CmdArgs.push_back(Args.MakeArgString(Str.drop_front(16)));
2718a7afeb040416c0eaac19b92db914913a788044f5Chad Rosier      }
271953b43a78d575e9e8d0af7a3f4b0a744679d65994Joerg Sonnenberger      (*it)->claim();
2720a7afeb040416c0eaac19b92db914913a788044f5Chad Rosier    }
272145483f7a1b3e57b4603b141bee80596b2d4dd443Bill Wendling  }
272245483f7a1b3e57b4603b141bee80596b2d4dd443Bill Wendling
27234e785c908ae01519d3592eae2828e2cc94fb02ebNick Lewycky  // Translate -mstackrealign
27244e785c908ae01519d3592eae2828e2cc94fb02ebNick Lewycky  if (Args.hasFlag(options::OPT_mstackrealign, options::OPT_mno_stackrealign,
27254e785c908ae01519d3592eae2828e2cc94fb02ebNick Lewycky                   false)) {
27264e785c908ae01519d3592eae2828e2cc94fb02ebNick Lewycky    CmdArgs.push_back("-backend-option");
27274e785c908ae01519d3592eae2828e2cc94fb02ebNick Lewycky    CmdArgs.push_back("-force-align-stack");
27284e785c908ae01519d3592eae2828e2cc94fb02ebNick Lewycky  }
27294e785c908ae01519d3592eae2828e2cc94fb02ebNick Lewycky  if (!Args.hasFlag(options::OPT_mno_stackrealign, options::OPT_mstackrealign,
27304e785c908ae01519d3592eae2828e2cc94fb02ebNick Lewycky                   false)) {
27314e785c908ae01519d3592eae2828e2cc94fb02ebNick Lewycky    CmdArgs.push_back(Args.MakeArgString("-mstackrealign"));
27324e785c908ae01519d3592eae2828e2cc94fb02ebNick Lewycky  }
27334e785c908ae01519d3592eae2828e2cc94fb02ebNick Lewycky
2734e9d11dbfe1f3286c5f8a2f2fc8ac759f63890655Joerg Sonnenberger  if (Args.hasArg(options::OPT_mstack_alignment)) {
2735e9d11dbfe1f3286c5f8a2f2fc8ac759f63890655Joerg Sonnenberger    StringRef alignment = Args.getLastArgValue(options::OPT_mstack_alignment);
2736e9d11dbfe1f3286c5f8a2f2fc8ac759f63890655Joerg Sonnenberger    CmdArgs.push_back(Args.MakeArgString("-mstack-alignment=" + alignment));
27371a584022c86bd0778cf7ad1fbea08c78869cf216Eric Christopher  }
2738586a061ad96f750e2a5aefcf3e2ce9e5474cdd61Chad Rosier  // -mkernel implies -mstrict-align; don't add the redundant option.
2739586a061ad96f750e2a5aefcf3e2ce9e5474cdd61Chad Rosier  if (Args.hasArg(options::OPT_mstrict_align) && !KernelOrKext) {
2740485577dcac0b0877cfb5395b365490a0189c66f5Chad Rosier    CmdArgs.push_back("-backend-option");
2741485577dcac0b0877cfb5395b365490a0189c66f5Chad Rosier    CmdArgs.push_back("-arm-strict-align");
27427e293276281bd5bf8526c064d298082b08f0bd8bChad Rosier  }
274388b7cf00fcb582728c642da3927c59468efaf926Eric Christopher
274448d1ef782c8c88066b5febf60f8f456064d7d3f0Daniel Dunbar  // Forward -f options with positive and negative forms; we translate
274548d1ef782c8c88066b5febf60f8f456064d7d3f0Daniel Dunbar  // these by hand.
274648d1ef782c8c88066b5febf60f8f456064d7d3f0Daniel Dunbar
2747b466d01e464b21832c23eeed90112bc5c26c0236Fariborz Jahanian  if (Args.hasArg(options::OPT_mkernel)) {
27482843c1900b6da763885f47d0999e923e7c67fd65Daniel Dunbar    if (!Args.hasArg(options::OPT_fapple_kext) && types::isCXX(InputType))
2749b466d01e464b21832c23eeed90112bc5c26c0236Fariborz Jahanian      CmdArgs.push_back("-fapple-kext");
2750b466d01e464b21832c23eeed90112bc5c26c0236Fariborz Jahanian    if (!Args.hasArg(options::OPT_fbuiltin))
2751b466d01e464b21832c23eeed90112bc5c26c0236Fariborz Jahanian      CmdArgs.push_back("-fno-builtin");
27523d26550ba88d2c15292b3f290d6eadec83749e95Chad Rosier    Args.ClaimAllArgs(options::OPT_fno_builtin);
2753b466d01e464b21832c23eeed90112bc5c26c0236Fariborz Jahanian  }
27549e5cc6b703b2d0013f13800c2ffbeb3cf85fcfadDaniel Dunbar  // -fbuiltin is default.
2755b466d01e464b21832c23eeed90112bc5c26c0236Fariborz Jahanian  else if (!Args.hasFlag(options::OPT_fbuiltin, options::OPT_fno_builtin))
275653e8484581ca358c3a2ccd8ea39c136c6e85d606Daniel Dunbar    CmdArgs.push_back("-fno-builtin");
275748d1ef782c8c88066b5febf60f8f456064d7d3f0Daniel Dunbar
2758fc2844846e91398205fddc71196fe9dda04e105fNuno Lopes  if (!Args.hasFlag(options::OPT_fassume_sane_operator_new,
2759fc2844846e91398205fddc71196fe9dda04e105fNuno Lopes                    options::OPT_fno_assume_sane_operator_new))
2760fc2844846e91398205fddc71196fe9dda04e105fNuno Lopes    CmdArgs.push_back("-fno-assume-sane-operator-new");
2761fc2844846e91398205fddc71196fe9dda04e105fNuno Lopes
27629e5cc6b703b2d0013f13800c2ffbeb3cf85fcfadDaniel Dunbar  // -fblocks=0 is default.
27639e5cc6b703b2d0013f13800c2ffbeb3cf85fcfadDaniel Dunbar  if (Args.hasFlag(options::OPT_fblocks, options::OPT_fno_blocks,
2764e6533ffc680e84cd193b4ea0d81548e251cb1f2fDavid Chisnall                   getToolChain().IsBlocksDefault()) ||
2765e6533ffc680e84cd193b4ea0d81548e251cb1f2fDavid Chisnall        (Args.hasArg(options::OPT_fgnu_runtime) &&
2766e6533ffc680e84cd193b4ea0d81548e251cb1f2fDavid Chisnall         Args.hasArg(options::OPT_fobjc_nonfragile_abi) &&
2767e6533ffc680e84cd193b4ea0d81548e251cb1f2fDavid Chisnall         !Args.hasArg(options::OPT_fno_blocks))) {
27689e5cc6b703b2d0013f13800c2ffbeb3cf85fcfadDaniel Dunbar    CmdArgs.push_back("-fblocks");
276913db5cfc4e5f03eb70efe0d227b53b8280f16161John McCall
277013db5cfc4e5f03eb70efe0d227b53b8280f16161John McCall    if (!Args.hasArg(options::OPT_fgnu_runtime) &&
277113db5cfc4e5f03eb70efe0d227b53b8280f16161John McCall        !getToolChain().hasBlocksRuntime())
277213db5cfc4e5f03eb70efe0d227b53b8280f16161John McCall      CmdArgs.push_back("-fblocks-runtime-optional");
27735e530af5d51572a0ed5dbe50da54bd333840c63dDavid Chisnall  }
277448d1ef782c8c88066b5febf60f8f456064d7d3f0Daniel Dunbar
277564554ba9fc5f251108fd7d10a9c218e7bf985941Douglas Gregor  // -fmodules enables modules (off by default). However, for C++/Objective-C++,
277664554ba9fc5f251108fd7d10a9c218e7bf985941Douglas Gregor  // users must also pass -fcxx-modules. The latter flag will disappear once the
277764554ba9fc5f251108fd7d10a9c218e7bf985941Douglas Gregor  // modules implementation is solid for C++/Objective-C++ programs as well.
2778f43b7214e812ddca74a6213608c69c960e067956Douglas Gregor  bool HaveModules = false;
277964554ba9fc5f251108fd7d10a9c218e7bf985941Douglas Gregor  if (Args.hasFlag(options::OPT_fmodules, options::OPT_fno_modules, false)) {
278064554ba9fc5f251108fd7d10a9c218e7bf985941Douglas Gregor    bool AllowedInCXX = Args.hasFlag(options::OPT_fcxx_modules,
278164554ba9fc5f251108fd7d10a9c218e7bf985941Douglas Gregor                                     options::OPT_fno_cxx_modules,
278264554ba9fc5f251108fd7d10a9c218e7bf985941Douglas Gregor                                     false);
2783f43b7214e812ddca74a6213608c69c960e067956Douglas Gregor    if (AllowedInCXX || !types::isCXX(InputType)) {
278464554ba9fc5f251108fd7d10a9c218e7bf985941Douglas Gregor      CmdArgs.push_back("-fmodules");
2785f43b7214e812ddca74a6213608c69c960e067956Douglas Gregor      HaveModules = true;
2786f43b7214e812ddca74a6213608c69c960e067956Douglas Gregor    }
2787f43b7214e812ddca74a6213608c69c960e067956Douglas Gregor  }
2788f43b7214e812ddca74a6213608c69c960e067956Douglas Gregor
2789953a61f26bf79932b9699b09add4c388764de170Douglas Gregor  // If a module path was provided, pass it along. Otherwise, use a temporary
2790953a61f26bf79932b9699b09add4c388764de170Douglas Gregor  // directory.
2791953a61f26bf79932b9699b09add4c388764de170Douglas Gregor  if (Arg *A = Args.getLastArg(options::OPT_fmodules_cache_path)) {
2792953a61f26bf79932b9699b09add4c388764de170Douglas Gregor    A->claim();
2793953a61f26bf79932b9699b09add4c388764de170Douglas Gregor    if (HaveModules) {
2794953a61f26bf79932b9699b09add4c388764de170Douglas Gregor      A->render(Args, CmdArgs);
2795953a61f26bf79932b9699b09add4c388764de170Douglas Gregor    }
2796953a61f26bf79932b9699b09add4c388764de170Douglas Gregor  } else if (HaveModules) {
2797953a61f26bf79932b9699b09add4c388764de170Douglas Gregor    SmallString<128> DefaultModuleCache;
2798953a61f26bf79932b9699b09add4c388764de170Douglas Gregor    llvm::sys::path::system_temp_directory(/*erasedOnReboot=*/false,
2799953a61f26bf79932b9699b09add4c388764de170Douglas Gregor                                           DefaultModuleCache);
2800953a61f26bf79932b9699b09add4c388764de170Douglas Gregor    llvm::sys::path::append(DefaultModuleCache, "clang-module-cache");
2801250172a851a886c0763b5fd61c20bf21791c21e9Douglas Gregor    const char Arg[] = "-fmodules-cache-path=";
2802250172a851a886c0763b5fd61c20bf21791c21e9Douglas Gregor    DefaultModuleCache.insert(DefaultModuleCache.begin(),
2803250172a851a886c0763b5fd61c20bf21791c21e9Douglas Gregor                              Arg, Arg + strlen(Arg));
2804953a61f26bf79932b9699b09add4c388764de170Douglas Gregor    CmdArgs.push_back(Args.MakeArgString(DefaultModuleCache));
2805953a61f26bf79932b9699b09add4c388764de170Douglas Gregor  }
2806953a61f26bf79932b9699b09add4c388764de170Douglas Gregor
2807953a61f26bf79932b9699b09add4c388764de170Douglas Gregor  // Pass through all -fmodules-ignore-macro arguments.
2808953a61f26bf79932b9699b09add4c388764de170Douglas Gregor  Args.AddAllArgs(CmdArgs, options::OPT_fmodules_ignore_macro);
2809953a61f26bf79932b9699b09add4c388764de170Douglas Gregor
2810f43b7214e812ddca74a6213608c69c960e067956Douglas Gregor  // -fmodules-autolink (on by default when modules is enabled) automatically
28114c1adcc50df4f825150833ad36ef15a0dc1d8b1cTed Kremenek  // links against libraries for imported modules.  This requires the
28124c1adcc50df4f825150833ad36ef15a0dc1d8b1cTed Kremenek  // integrated assembler.
2813af370e6e051e505016637e23418354db625dc796Rafael Espindola  if (HaveModules && getToolChain().useIntegratedAs() &&
2814f43b7214e812ddca74a6213608c69c960e067956Douglas Gregor      Args.hasFlag(options::OPT_fmodules_autolink,
2815f43b7214e812ddca74a6213608c69c960e067956Douglas Gregor                   options::OPT_fno_modules_autolink,
2816f43b7214e812ddca74a6213608c69c960e067956Douglas Gregor                   true)) {
2817f43b7214e812ddca74a6213608c69c960e067956Douglas Gregor    CmdArgs.push_back("-fmodules-autolink");
281864554ba9fc5f251108fd7d10a9c218e7bf985941Douglas Gregor  }
28197025d2cc327ec75353454586df2987afce5e5789Douglas Gregor
282032579cf507d088e776b67327c5d6bc46e1f217ccJohn McCall  // -faccess-control is default.
28217002f4c03c2d0544f4e8bea8d3a5636519081e35John McCall  if (Args.hasFlag(options::OPT_fno_access_control,
28227002f4c03c2d0544f4e8bea8d3a5636519081e35John McCall                   options::OPT_faccess_control,
282332579cf507d088e776b67327c5d6bc46e1f217ccJohn McCall                   false))
28247002f4c03c2d0544f4e8bea8d3a5636519081e35John McCall    CmdArgs.push_back("-fno-access-control");
28253ddd6e026a173e9519e84e27f8d6aed5473b8b4eJohn McCall
2826a4c2475961184a4bad6f6f087eeb1038bb784cadAnders Carlsson  // -felide-constructors is the default.
2827a4c2475961184a4bad6f6f087eeb1038bb784cadAnders Carlsson  if (Args.hasFlag(options::OPT_fno_elide_constructors,
2828a4c2475961184a4bad6f6f087eeb1038bb784cadAnders Carlsson                   options::OPT_felide_constructors,
2829a4c2475961184a4bad6f6f087eeb1038bb784cadAnders Carlsson                   false))
2830a4c2475961184a4bad6f6f087eeb1038bb784cadAnders Carlsson    CmdArgs.push_back("-fno-elide-constructors");
2831a4c2475961184a4bad6f6f087eeb1038bb784cadAnders Carlsson
28320be42c44f0199c5023b542d6a6d2e66eb594f27dDaniel Dunbar  // -frtti is default.
2833afc4baa37c2f38fadf05b15456b10a0994d51b0bChad Rosier  if (!Args.hasFlag(options::OPT_frtti, options::OPT_fno_rtti) ||
2834c4dabadb51475e76b606024f144e7cf93b0bad00Richard Smith      KernelOrKext) {
283553e8484581ca358c3a2ccd8ea39c136c6e85d606Daniel Dunbar    CmdArgs.push_back("-fno-rtti");
2836738f8c278da5950d0d4607de2debe0bdfad64185Mike Stump
2837c4dabadb51475e76b606024f144e7cf93b0bad00Richard Smith    // -fno-rtti cannot usefully be combined with -fsanitize=vptr.
2838bb1071c0568db9bd7934e869a53d671632eb9291Alexey Samsonov    if (Sanitize.sanitizesVptr()) {
283903c60765c7607cbfb4e1e8593028824dab13ad54NAKAMURA Takumi      std::string NoRttiArg =
2840c4dabadb51475e76b606024f144e7cf93b0bad00Richard Smith        Args.getLastArg(options::OPT_mkernel,
2841c4dabadb51475e76b606024f144e7cf93b0bad00Richard Smith                        options::OPT_fapple_kext,
284204fd3820d04032df40ec073a901cade92869c765Richard Smith                        options::OPT_fno_rtti)->getAsString(Args);
2843c4dabadb51475e76b606024f144e7cf93b0bad00Richard Smith      D.Diag(diag::err_drv_argument_not_allowed_with)
2844c4dabadb51475e76b606024f144e7cf93b0bad00Richard Smith        << "-fsanitize=vptr" << NoRttiArg;
2845c4dabadb51475e76b606024f144e7cf93b0bad00Richard Smith    }
2846c4dabadb51475e76b606024f144e7cf93b0bad00Richard Smith  }
2847c4dabadb51475e76b606024f144e7cf93b0bad00Richard Smith
28489631939f82c0eaa6fb3936a0ce58a41adfbc9011Tony Linthicum  // -fshort-enums=0 is default for all architectures except Hexagon.
28499a2b9d794bdf349b517ff799170f4409f45d147cArgyrios Kyrtzidis  if (Args.hasFlag(options::OPT_fshort_enums,
28509631939f82c0eaa6fb3936a0ce58a41adfbc9011Tony Linthicum                   options::OPT_fno_short_enums,
28519631939f82c0eaa6fb3936a0ce58a41adfbc9011Tony Linthicum                   getToolChain().getTriple().getArch() ==
28529631939f82c0eaa6fb3936a0ce58a41adfbc9011Tony Linthicum                   llvm::Triple::hexagon))
28539a2b9d794bdf349b517ff799170f4409f45d147cArgyrios Kyrtzidis    CmdArgs.push_back("-fshort-enums");
28549a2b9d794bdf349b517ff799170f4409f45d147cArgyrios Kyrtzidis
28551f95e6567faab67f4363d650f73121359c4bdbabDaniel Dunbar  // -fsigned-char is default.
28566d2eb4d07d40795131f28d719ef9146a2be500f6Daniel Dunbar  if (!Args.hasFlag(options::OPT_fsigned_char, options::OPT_funsigned_char,
28571f95e6567faab67f4363d650f73121359c4bdbabDaniel Dunbar                    isSignedCharDefault(getToolChain().getTriple())))
28587674352cf3e8f699914a2f739f1ae8c8c3480813Daniel Dunbar    CmdArgs.push_back("-fno-signed-char");
28595a77973d9bc2c9cdbdb7860dcf3ac795abe258ecEli Friedman
2860a508b7de6c5246ab04ed69d0ab4e9977ec1fb4d4Anders Carlsson  // -fthreadsafe-static is default.
286120249a1af2e462dcafdd6a350f1c7967b264ff25Michael J. Spencer  if (!Args.hasFlag(options::OPT_fthreadsafe_statics,
2862a508b7de6c5246ab04ed69d0ab4e9977ec1fb4d4Anders Carlsson                    options::OPT_fno_threadsafe_statics))
2863a508b7de6c5246ab04ed69d0ab4e9977ec1fb4d4Anders Carlsson    CmdArgs.push_back("-fno-threadsafe-statics");
2864a508b7de6c5246ab04ed69d0ab4e9977ec1fb4d4Anders Carlsson
2865efb0fa9e11f75af51744a6159530ef7cc8efa24aDaniel Dunbar  // -fuse-cxa-atexit is default.
2866afc4baa37c2f38fadf05b15456b10a0994d51b0bChad Rosier  if (!Args.hasFlag(options::OPT_fuse_cxa_atexit,
2867afc4baa37c2f38fadf05b15456b10a0994d51b0bChad Rosier                    options::OPT_fno_use_cxa_atexit,
2868afc4baa37c2f38fadf05b15456b10a0994d51b0bChad Rosier                   getToolChain().getTriple().getOS() != llvm::Triple::Cygwin &&
28699631939f82c0eaa6fb3936a0ce58a41adfbc9011Tony Linthicum                  getToolChain().getTriple().getOS() != llvm::Triple::MinGW32 &&
2870afc4baa37c2f38fadf05b15456b10a0994d51b0bChad Rosier              getToolChain().getTriple().getArch() != llvm::Triple::hexagon) ||
2871afc4baa37c2f38fadf05b15456b10a0994d51b0bChad Rosier      KernelOrKext)
2872efb0fa9e11f75af51744a6159530ef7cc8efa24aDaniel Dunbar    CmdArgs.push_back("-fno-use-cxa-atexit");
2873efb0fa9e11f75af51744a6159530ef7cc8efa24aDaniel Dunbar
28740be42c44f0199c5023b542d6a6d2e66eb594f27dDaniel Dunbar  // -fms-extensions=0 is default.
28756d2eb4d07d40795131f28d719ef9146a2be500f6Daniel Dunbar  if (Args.hasFlag(options::OPT_fms_extensions, options::OPT_fno_ms_extensions,
28760be42c44f0199c5023b542d6a6d2e66eb594f27dDaniel Dunbar                   getToolChain().getTriple().getOS() == llvm::Triple::Win32))
28770be42c44f0199c5023b542d6a6d2e66eb594f27dDaniel Dunbar    CmdArgs.push_back("-fms-extensions");
28780be42c44f0199c5023b542d6a6d2e66eb594f27dDaniel Dunbar
2879ae55608a29d61737b7c5390e2d1bb30ab8d5febbFrancois Pichet  // -fms-compatibility=0 is default.
2880ba97b6ea0e8933ab801b0d06bba133836627794aDouglas Gregor  if (Args.hasFlag(options::OPT_fms_compatibility,
2881ba97b6ea0e8933ab801b0d06bba133836627794aDouglas Gregor                   options::OPT_fno_ms_compatibility,
2882ba97b6ea0e8933ab801b0d06bba133836627794aDouglas Gregor                   (getToolChain().getTriple().getOS() == llvm::Triple::Win32 &&
2883ba97b6ea0e8933ab801b0d06bba133836627794aDouglas Gregor                    Args.hasFlag(options::OPT_fms_extensions,
2884ba97b6ea0e8933ab801b0d06bba133836627794aDouglas Gregor                                 options::OPT_fno_ms_extensions,
2885ba97b6ea0e8933ab801b0d06bba133836627794aDouglas Gregor                                 true))))
2886ae55608a29d61737b7c5390e2d1bb30ab8d5febbFrancois Pichet    CmdArgs.push_back("-fms-compatibility");
2887ae55608a29d61737b7c5390e2d1bb30ab8d5febbFrancois Pichet
2888dae4ac4fe56ec60fc93b3e3c9f51e79e682084b9Michael J. Spencer  // -fmsc-version=1300 is default.
2889dae4ac4fe56ec60fc93b3e3c9f51e79e682084b9Michael J. Spencer  if (Args.hasFlag(options::OPT_fms_extensions, options::OPT_fno_ms_extensions,
2890dae4ac4fe56ec60fc93b3e3c9f51e79e682084b9Michael J. Spencer                   getToolChain().getTriple().getOS() == llvm::Triple::Win32) ||
2891dae4ac4fe56ec60fc93b3e3c9f51e79e682084b9Michael J. Spencer      Args.hasArg(options::OPT_fmsc_version)) {
28925f9e272e632e951b1efe824cd16acb4d96077930Chris Lattner    StringRef msc_ver = Args.getLastArgValue(options::OPT_fmsc_version);
2893dae4ac4fe56ec60fc93b3e3c9f51e79e682084b9Michael J. Spencer    if (msc_ver.empty())
2894dae4ac4fe56ec60fc93b3e3c9f51e79e682084b9Michael J. Spencer      CmdArgs.push_back("-fmsc-version=1300");
2895dae4ac4fe56ec60fc93b3e3c9f51e79e682084b9Michael J. Spencer    else
2896dae4ac4fe56ec60fc93b3e3c9f51e79e682084b9Michael J. Spencer      CmdArgs.push_back(Args.MakeArgString("-fmsc-version=" + msc_ver));
2897dae4ac4fe56ec60fc93b3e3c9f51e79e682084b9Michael J. Spencer  }
2898dae4ac4fe56ec60fc93b3e3c9f51e79e682084b9Michael J. Spencer
2899dae4ac4fe56ec60fc93b3e3c9f51e79e682084b9Michael J. Spencer
2900cfc01e45dd2ea51017aea299431c119dbcd94e53Eric Christopher  // -fno-borland-extensions is default.
2901400b607546a8dbfcee3b690f3d0a2fee0ea6480bDawn Perchik  if (Args.hasFlag(options::OPT_fborland_extensions,
2902400b607546a8dbfcee3b690f3d0a2fee0ea6480bDawn Perchik                   options::OPT_fno_borland_extensions, false))
2903400b607546a8dbfcee3b690f3d0a2fee0ea6480bDawn Perchik    CmdArgs.push_back("-fborland-extensions");
2904400b607546a8dbfcee3b690f3d0a2fee0ea6480bDawn Perchik
29058efcc0184a6dfe1ea799d3a6b9c1312ef1fac11dFrancois Pichet  // -fno-delayed-template-parsing is default, except for Windows where MSVC STL
29068efcc0184a6dfe1ea799d3a6b9c1312ef1fac11dFrancois Pichet  // needs it.
29078387e2a41eef6fa17fb140a18c29b6eee9dd2b8aFrancois Pichet  if (Args.hasFlag(options::OPT_fdelayed_template_parsing,
29088387e2a41eef6fa17fb140a18c29b6eee9dd2b8aFrancois Pichet                   options::OPT_fno_delayed_template_parsing,
29098efcc0184a6dfe1ea799d3a6b9c1312ef1fac11dFrancois Pichet                   getToolChain().getTriple().getOS() == llvm::Triple::Win32))
2910805bc1f6fb9b7bc85222d0211761a8c624f2dd75Francois Pichet    CmdArgs.push_back("-fdelayed-template-parsing");
29118387e2a41eef6fa17fb140a18c29b6eee9dd2b8aFrancois Pichet
2912eb5d7b752651283de5abfcc2f91df7227582a08dChandler Carruth  // -fgnu-keywords default varies depending on language; only pass if
2913eb5d7b752651283de5abfcc2f91df7227582a08dChandler Carruth  // specified.
2914eb5d7b752651283de5abfcc2f91df7227582a08dChandler Carruth  if (Arg *A = Args.getLastArg(options::OPT_fgnu_keywords,
291540788d909ad52fc732fe0769d0ef22e5edad5e47Daniel Dunbar                               options::OPT_fno_gnu_keywords))
291640788d909ad52fc732fe0769d0ef22e5edad5e47Daniel Dunbar    A->render(Args, CmdArgs);
2917eb5d7b752651283de5abfcc2f91df7227582a08dChandler Carruth
291801ba8545fb6bae2a370606b4f40f0d17eb0a8c6cRafael Espindola  if (Args.hasFlag(options::OPT_fgnu89_inline,
291901ba8545fb6bae2a370606b4f40f0d17eb0a8c6cRafael Espindola                   options::OPT_fno_gnu89_inline,
292001ba8545fb6bae2a370606b4f40f0d17eb0a8c6cRafael Espindola                   false))
2921fb3f4aad0436a9c40e9130598162150890c405b5Rafael Espindola    CmdArgs.push_back("-fgnu89-inline");
2922fb3f4aad0436a9c40e9130598162150890c405b5Rafael Espindola
2923fc055f943d154c9b7463f43a3b59e093723362c9Chad Rosier  if (Args.hasArg(options::OPT_fno_inline))
2924fc055f943d154c9b7463f43a3b59e093723362c9Chad Rosier    CmdArgs.push_back("-fno-inline");
2925fc055f943d154c9b7463f43a3b59e093723362c9Chad Rosier
2926634a4b1b045b13e7ddfa57934cf2b85d4348f77fChad Rosier  if (Args.hasArg(options::OPT_fno_inline_functions))
2927634a4b1b045b13e7ddfa57934cf2b85d4348f77fChad Rosier    CmdArgs.push_back("-fno-inline-functions");
2928250008b4678b19ef80866702e300bb4e53d9ff2dChad Rosier
2929260611a32535c851237926bfcf78869b13c07d5bJohn McCall  ObjCRuntime objcRuntime = AddObjCRuntimeArgs(Args, CmdArgs, rewriteKind);
293020249a1af2e462dcafdd6a350f1c7967b264ff25Michael J. Spencer
2931260611a32535c851237926bfcf78869b13c07d5bJohn McCall  // -fobjc-dispatch-method is only relevant with the nonfragile-abi, and
2932260611a32535c851237926bfcf78869b13c07d5bJohn McCall  // legacy is the default.
2933260611a32535c851237926bfcf78869b13c07d5bJohn McCall  if (objcRuntime.isNonFragile()) {
29343c3ccd283f8c35dbb200a76eacfa17f7861e03bbDavid Chisnall    if (!Args.hasFlag(options::OPT_fobjc_legacy_dispatch,
29353c3ccd283f8c35dbb200a76eacfa17f7861e03bbDavid Chisnall                      options::OPT_fno_objc_legacy_dispatch,
29362c7886ddec1e2cee68daee9866637d2e02f434efDavid Chisnall                      objcRuntime.isLegacyDispatchDefaultForArch(
29372c7886ddec1e2cee68daee9866637d2e02f434efDavid Chisnall                        getToolChain().getTriple().getArch()))) {
29383c3ccd283f8c35dbb200a76eacfa17f7861e03bbDavid Chisnall      if (getToolChain().UseObjCMixedDispatch())
29393c3ccd283f8c35dbb200a76eacfa17f7861e03bbDavid Chisnall        CmdArgs.push_back("-fobjc-dispatch-method=mixed");
29403c3ccd283f8c35dbb200a76eacfa17f7861e03bbDavid Chisnall      else
29413c3ccd283f8c35dbb200a76eacfa17f7861e03bbDavid Chisnall        CmdArgs.push_back("-fobjc-dispatch-method=non-legacy");
2942984eb8611d9ee46fc6351dee43609f2deed99f3cDaniel Dunbar    }
29433c3ccd283f8c35dbb200a76eacfa17f7861e03bbDavid Chisnall  }
2944125b4cb35536e45201f8f2cb19ee620e3ad67c49NAKAMURA Takumi
2945df423545a19275559b675bb4f20b6fbe738f0a11Nico Weber  // -fobjc-default-synthesize-properties=1 is default. This only has an effect
2946df423545a19275559b675bb4f20b6fbe738f0a11Nico Weber  // if the nonfragile objc abi is used.
2947e51fe0972a781e79abae550786ebed7d1da54252Fariborz Jahanian  if (getToolChain().IsObjCDefaultSynthPropertiesDefault()) {
29483c3ccd283f8c35dbb200a76eacfa17f7861e03bbDavid Chisnall    CmdArgs.push_back("-fobjc-default-synthesize-properties");
29499e5cc6b703b2d0013f13800c2ffbeb3cf85fcfadDaniel Dunbar  }
29509e5cc6b703b2d0013f13800c2ffbeb3cf85fcfadDaniel Dunbar
29513d145f660a23d5bdabdd1ead83c51f3df1489b09Fariborz Jahanian  // -fencode-extended-block-signature=1 is default.
29523d145f660a23d5bdabdd1ead83c51f3df1489b09Fariborz Jahanian  if (getToolChain().IsEncodeExtendedBlockSignatureDefault()) {
29533d145f660a23d5bdabdd1ead83c51f3df1489b09Fariborz Jahanian    CmdArgs.push_back("-fencode-extended-block-signature");
29543d145f660a23d5bdabdd1ead83c51f3df1489b09Fariborz Jahanian  }
29553d145f660a23d5bdabdd1ead83c51f3df1489b09Fariborz Jahanian
29569f084a3166b684573ba49df28fc5792bc37d92e1John McCall  // Allow -fno-objc-arr to trump -fobjc-arr/-fobjc-arc.
29579f084a3166b684573ba49df28fc5792bc37d92e1John McCall  // NOTE: This logic is duplicated in ToolChains.cpp.
29589f084a3166b684573ba49df28fc5792bc37d92e1John McCall  bool ARC = isObjCAutoRefCount(Args);
29599f084a3166b684573ba49df28fc5792bc37d92e1John McCall  if (ARC) {
29600a7dd788dbef975f35f273c7ab913f480f7edd60John McCall    getToolChain().CheckObjCARC();
29615840dd9a09c458ef894e7d47caab1d90dc4c1112Argyrios Kyrtzidis
29629f084a3166b684573ba49df28fc5792bc37d92e1John McCall    CmdArgs.push_back("-fobjc-arc");
29639f084a3166b684573ba49df28fc5792bc37d92e1John McCall
29647ffa0325bd61f656697f99434334d425c39af309Chandler Carruth    // FIXME: It seems like this entire block, and several around it should be
29657ffa0325bd61f656697f99434334d425c39af309Chandler Carruth    // wrapped in isObjC, but for now we just use it here as this is where it
29667ffa0325bd61f656697f99434334d425c39af309Chandler Carruth    // was being used previously.
29677ffa0325bd61f656697f99434334d425c39af309Chandler Carruth    if (types::isCXX(InputType) && types::isObjC(InputType)) {
29687ffa0325bd61f656697f99434334d425c39af309Chandler Carruth      if (getToolChain().GetCXXStdlibType(Args) == ToolChain::CST_Libcxx)
29697ffa0325bd61f656697f99434334d425c39af309Chandler Carruth        CmdArgs.push_back("-fobjc-arc-cxxlib=libc++");
29707ffa0325bd61f656697f99434334d425c39af309Chandler Carruth      else
29717ffa0325bd61f656697f99434334d425c39af309Chandler Carruth        CmdArgs.push_back("-fobjc-arc-cxxlib=libstdc++");
29727ffa0325bd61f656697f99434334d425c39af309Chandler Carruth    }
29737ffa0325bd61f656697f99434334d425c39af309Chandler Carruth
29749f084a3166b684573ba49df28fc5792bc37d92e1John McCall    // Allow the user to enable full exceptions code emission.
29759f084a3166b684573ba49df28fc5792bc37d92e1John McCall    // We define off for Objective-CC, on for Objective-C++.
29769f084a3166b684573ba49df28fc5792bc37d92e1John McCall    if (Args.hasFlag(options::OPT_fobjc_arc_exceptions,
29779f084a3166b684573ba49df28fc5792bc37d92e1John McCall                     options::OPT_fno_objc_arc_exceptions,
29789f084a3166b684573ba49df28fc5792bc37d92e1John McCall                     /*default*/ types::isCXX(InputType)))
29799f084a3166b684573ba49df28fc5792bc37d92e1John McCall      CmdArgs.push_back("-fobjc-arc-exceptions");
29809f084a3166b684573ba49df28fc5792bc37d92e1John McCall  }
29819f084a3166b684573ba49df28fc5792bc37d92e1John McCall
29829f084a3166b684573ba49df28fc5792bc37d92e1John McCall  // -fobjc-infer-related-result-type is the default, except in the Objective-C
29839f084a3166b684573ba49df28fc5792bc37d92e1John McCall  // rewriter.
2984260611a32535c851237926bfcf78869b13c07d5bJohn McCall  if (rewriteKind != RK_None)
29859f084a3166b684573ba49df28fc5792bc37d92e1John McCall    CmdArgs.push_back("-fno-objc-infer-related-result-type");
298688b7cf00fcb582728c642da3927c59468efaf926Eric Christopher
29879f084a3166b684573ba49df28fc5792bc37d92e1John McCall  // Handle -fobjc-gc and -fobjc-gc-only. They are exclusive, and -fobjc-gc-only
29889f084a3166b684573ba49df28fc5792bc37d92e1John McCall  // takes precedence.
29899f084a3166b684573ba49df28fc5792bc37d92e1John McCall  const Arg *GCArg = Args.getLastArg(options::OPT_fobjc_gc_only);
29909f084a3166b684573ba49df28fc5792bc37d92e1John McCall  if (!GCArg)
29919f084a3166b684573ba49df28fc5792bc37d92e1John McCall    GCArg = Args.getLastArg(options::OPT_fobjc_gc);
29929f084a3166b684573ba49df28fc5792bc37d92e1John McCall  if (GCArg) {
29939f084a3166b684573ba49df28fc5792bc37d92e1John McCall    if (ARC) {
29945f9e272e632e951b1efe824cd16acb4d96077930Chris Lattner      D.Diag(diag::err_drv_objc_gc_arr)
29959f084a3166b684573ba49df28fc5792bc37d92e1John McCall        << GCArg->getAsString(Args);
29969f084a3166b684573ba49df28fc5792bc37d92e1John McCall    } else if (getToolChain().SupportsObjCGC()) {
29979f084a3166b684573ba49df28fc5792bc37d92e1John McCall      GCArg->render(Args, CmdArgs);
29989f084a3166b684573ba49df28fc5792bc37d92e1John McCall    } else {
29999f084a3166b684573ba49df28fc5792bc37d92e1John McCall      // FIXME: We should move this to a hard error.
30005f9e272e632e951b1efe824cd16acb4d96077930Chris Lattner      D.Diag(diag::warn_drv_objc_gc_unsupported)
30019f084a3166b684573ba49df28fc5792bc37d92e1John McCall        << GCArg->getAsString(Args);
30029f084a3166b684573ba49df28fc5792bc37d92e1John McCall    }
30039f084a3166b684573ba49df28fc5792bc37d92e1John McCall  }
30049f084a3166b684573ba49df28fc5792bc37d92e1John McCall
3005d71315c5511bd1204732216964faa6254dc4b2b6John McCall  // Add exception args.
3006d71315c5511bd1204732216964faa6254dc4b2b6John McCall  addExceptionArgs(Args, InputType, getToolChain().getTriple(),
3007260611a32535c851237926bfcf78869b13c07d5bJohn McCall                   KernelOrKext, objcRuntime, CmdArgs);
3008d71315c5511bd1204732216964faa6254dc4b2b6John McCall
3009d71315c5511bd1204732216964faa6254dc4b2b6John McCall  if (getToolChain().UseSjLjExceptions())
3010d71315c5511bd1204732216964faa6254dc4b2b6John McCall    CmdArgs.push_back("-fsjlj-exceptions");
3011d71315c5511bd1204732216964faa6254dc4b2b6John McCall
3012d71315c5511bd1204732216964faa6254dc4b2b6John McCall  // C++ "sane" operator new.
3013984eb8611d9ee46fc6351dee43609f2deed99f3cDaniel Dunbar  if (!Args.hasFlag(options::OPT_fassume_sane_operator_new,
3014984eb8611d9ee46fc6351dee43609f2deed99f3cDaniel Dunbar                    options::OPT_fno_assume_sane_operator_new))
3015984eb8611d9ee46fc6351dee43609f2deed99f3cDaniel Dunbar    CmdArgs.push_back("-fno-assume-sane-operator-new");
3016984eb8611d9ee46fc6351dee43609f2deed99f3cDaniel Dunbar
3017f35f14d474632142280ec1526d16e87706ce6625Daniel Dunbar  // -fconstant-cfstrings is default, and may be subject to argument translation
3018f35f14d474632142280ec1526d16e87706ce6625Daniel Dunbar  // on Darwin.
3019f35f14d474632142280ec1526d16e87706ce6625Daniel Dunbar  if (!Args.hasFlag(options::OPT_fconstant_cfstrings,
3020f35f14d474632142280ec1526d16e87706ce6625Daniel Dunbar                    options::OPT_fno_constant_cfstrings) ||
3021f35f14d474632142280ec1526d16e87706ce6625Daniel Dunbar      !Args.hasFlag(options::OPT_mconstant_cfstrings,
3022f35f14d474632142280ec1526d16e87706ce6625Daniel Dunbar                    options::OPT_mno_constant_cfstrings))
3023f35f14d474632142280ec1526d16e87706ce6625Daniel Dunbar    CmdArgs.push_back("-fno-constant-cfstrings");
3024f35f14d474632142280ec1526d16e87706ce6625Daniel Dunbar
3025a6fda124bf380479529d6a80b84b62cacd3cb707John Thompson  // -fshort-wchar default varies depending on platform; only
3026a6fda124bf380479529d6a80b84b62cacd3cb707John Thompson  // pass if specified.
30271744a3504af13343f4bc0e566f6d7349fc6e3f04Daniel Dunbar  if (Arg *A = Args.getLastArg(options::OPT_fshort_wchar))
30281744a3504af13343f4bc0e566f6d7349fc6e3f04Daniel Dunbar    A->render(Args, CmdArgs);
3029a6fda124bf380479529d6a80b84b62cacd3cb707John Thompson
3030ee848a73e5f8ffe7511af8652ba811c020d1c7a0Daniel Dunbar  // -fno-pascal-strings is default, only pass non-default. If the tool chain
3031ee848a73e5f8ffe7511af8652ba811c020d1c7a0Daniel Dunbar  // happened to translate to -mpascal-strings, we want to back translate here.
303282d00688525c876bf47bce414dedae9c343e67f5Daniel Dunbar  //
303382d00688525c876bf47bce414dedae9c343e67f5Daniel Dunbar  // FIXME: This is gross; that translation should be pulled from the
303482d00688525c876bf47bce414dedae9c343e67f5Daniel Dunbar  // tool chain.
3035c21c485b4fb58ef5d55cf3e523263dd824a2ace4Daniel Dunbar  if (Args.hasFlag(options::OPT_fpascal_strings,
303682d00688525c876bf47bce414dedae9c343e67f5Daniel Dunbar                   options::OPT_fno_pascal_strings,
303782d00688525c876bf47bce414dedae9c343e67f5Daniel Dunbar                   false) ||
303882d00688525c876bf47bce414dedae9c343e67f5Daniel Dunbar      Args.hasFlag(options::OPT_mpascal_strings,
303982d00688525c876bf47bce414dedae9c343e67f5Daniel Dunbar                   options::OPT_mno_pascal_strings,
304082d00688525c876bf47bce414dedae9c343e67f5Daniel Dunbar                   false))
304148d1ef782c8c88066b5febf60f8f456064d7d3f0Daniel Dunbar    CmdArgs.push_back("-fpascal-strings");
3042125b4cb35536e45201f8f2cb19ee620e3ad67c49NAKAMURA Takumi
304388934e85f81abdc4fb5202325252be3bcab5ebf0Daniel Dunbar  // Honor -fpack-struct= and -fpack-struct, if given. Note that
304488934e85f81abdc4fb5202325252be3bcab5ebf0Daniel Dunbar  // -fno-pack-struct doesn't apply to -fpack-struct=.
304588934e85f81abdc4fb5202325252be3bcab5ebf0Daniel Dunbar  if (Arg *A = Args.getLastArg(options::OPT_fpack_struct_EQ)) {
30468049c44d972fc7266b4369e8960875c118c067e0James Molloy    std::string PackStructStr = "-fpack-struct=";
30471d489cf4a04ad0ad8ac2696e4eed0995f3a67288Richard Smith    PackStructStr += A->getValue();
30488049c44d972fc7266b4369e8960875c118c067e0James Molloy    CmdArgs.push_back(Args.MakeArgString(PackStructStr));
304988934e85f81abdc4fb5202325252be3bcab5ebf0Daniel Dunbar  } else if (Args.hasFlag(options::OPT_fpack_struct,
305088934e85f81abdc4fb5202325252be3bcab5ebf0Daniel Dunbar                          options::OPT_fno_pack_struct, false)) {
30518049c44d972fc7266b4369e8960875c118c067e0James Molloy    CmdArgs.push_back("-fpack-struct=1");
305288934e85f81abdc4fb5202325252be3bcab5ebf0Daniel Dunbar  }
305388934e85f81abdc4fb5202325252be3bcab5ebf0Daniel Dunbar
30546c7db8967c383d859eab6d541db816adbeb837a9Eric Christopher  if (KernelOrKext) {
3055b466d01e464b21832c23eeed90112bc5c26c0236Fariborz Jahanian    if (!Args.hasArg(options::OPT_fcommon))
3056b466d01e464b21832c23eeed90112bc5c26c0236Fariborz Jahanian      CmdArgs.push_back("-fno-common");
3057ec09b3e0c5d96a1b7a3e797cdff2875eca1e9907Chad Rosier    Args.ClaimAllArgs(options::OPT_fno_common);
3058b466d01e464b21832c23eeed90112bc5c26c0236Fariborz Jahanian  }
305988934e85f81abdc4fb5202325252be3bcab5ebf0Daniel Dunbar
306048d1ef782c8c88066b5febf60f8f456064d7d3f0Daniel Dunbar  // -fcommon is default, only pass non-default.
3061b466d01e464b21832c23eeed90112bc5c26c0236Fariborz Jahanian  else if (!Args.hasFlag(options::OPT_fcommon, options::OPT_fno_common))
306248d1ef782c8c88066b5febf60f8f456064d7d3f0Daniel Dunbar    CmdArgs.push_back("-fno-common");
306348d1ef782c8c88066b5febf60f8f456064d7d3f0Daniel Dunbar
306470d3c92820f590b10553da9c96eda24e4325ba34Daniel Dunbar  // -fsigned-bitfields is default, and clang doesn't yet support
306506205ca78ca2fd4384b237f120ec66614df0d9fcDaniel Dunbar  // -funsigned-bitfields.
30661eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump  if (!Args.hasFlag(options::OPT_fsigned_bitfields,
306770d3c92820f590b10553da9c96eda24e4325ba34Daniel Dunbar                    options::OPT_funsigned_bitfields))
30685f9e272e632e951b1efe824cd16acb4d96077930Chris Lattner    D.Diag(diag::warn_drv_clang_unsupported)
306970d3c92820f590b10553da9c96eda24e4325ba34Daniel Dunbar      << Args.getLastArg(options::OPT_funsigned_bitfields)->getAsString(Args);
307070d3c92820f590b10553da9c96eda24e4325ba34Daniel Dunbar
307106205ca78ca2fd4384b237f120ec66614df0d9fcDaniel Dunbar  // -fsigned-bitfields is default, and clang doesn't support -fno-for-scope.
307206205ca78ca2fd4384b237f120ec66614df0d9fcDaniel Dunbar  if (!Args.hasFlag(options::OPT_ffor_scope,
307306205ca78ca2fd4384b237f120ec66614df0d9fcDaniel Dunbar                    options::OPT_fno_for_scope))
30745f9e272e632e951b1efe824cd16acb4d96077930Chris Lattner    D.Diag(diag::err_drv_clang_unsupported)
307506205ca78ca2fd4384b237f120ec66614df0d9fcDaniel Dunbar      << Args.getLastArg(options::OPT_fno_for_scope)->getAsString(Args);
307606205ca78ca2fd4384b237f120ec66614df0d9fcDaniel Dunbar
30770ea22fdfda0558393950cef5db50d050e3eb1e60Jeffrey Yasskin  // -fcaret-diagnostics is default.
30780ea22fdfda0558393950cef5db50d050e3eb1e60Jeffrey Yasskin  if (!Args.hasFlag(options::OPT_fcaret_diagnostics,
30790ea22fdfda0558393950cef5db50d050e3eb1e60Jeffrey Yasskin                    options::OPT_fno_caret_diagnostics, true))
30800ea22fdfda0558393950cef5db50d050e3eb1e60Jeffrey Yasskin    CmdArgs.push_back("-fno-caret-diagnostics");
30810ea22fdfda0558393950cef5db50d050e3eb1e60Jeffrey Yasskin
308249138fc59eeac2aacd3b7e04c2642180d5baefd7Daniel Dunbar  // -fdiagnostics-fixit-info is default, only pass non-default.
30831eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump  if (!Args.hasFlag(options::OPT_fdiagnostics_fixit_info,
308449138fc59eeac2aacd3b7e04c2642180d5baefd7Daniel Dunbar                    options::OPT_fno_diagnostics_fixit_info))
308549138fc59eeac2aacd3b7e04c2642180d5baefd7Daniel Dunbar    CmdArgs.push_back("-fno-diagnostics-fixit-info");
308688b7cf00fcb582728c642da3927c59468efaf926Eric Christopher
30879e820ee054fefe5422b4db3f681e567a8976747eDaniel Dunbar  // Enable -fdiagnostics-show-option by default.
30881eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump  if (Args.hasFlag(options::OPT_fdiagnostics_show_option,
30899e820ee054fefe5422b4db3f681e567a8976747eDaniel Dunbar                   options::OPT_fno_diagnostics_show_option))
30909e820ee054fefe5422b4db3f681e567a8976747eDaniel Dunbar    CmdArgs.push_back("-fdiagnostics-show-option");
3091838be483dcf10ea3f2acd85f2cd65adc310011f9Daniel Dunbar
30926fbe8398ba1680ffc5daa7395850ff8765b7905bChris Lattner  if (const Arg *A =
30936fbe8398ba1680ffc5daa7395850ff8765b7905bChris Lattner        Args.getLastArg(options::OPT_fdiagnostics_show_category_EQ)) {
30946fbe8398ba1680ffc5daa7395850ff8765b7905bChris Lattner    CmdArgs.push_back("-fdiagnostics-show-category");
30951d489cf4a04ad0ad8ac2696e4eed0995f3a67288Richard Smith    CmdArgs.push_back(A->getValue());
30966fbe8398ba1680ffc5daa7395850ff8765b7905bChris Lattner  }
3097ca0e0545c216afaacba6da6c82a270dc2efc4e3fDaniel Dunbar
3098c9471b0ff1815ed0149dbfcad0f385ed8648eeb0Douglas Gregor  if (const Arg *A =
3099c9471b0ff1815ed0149dbfcad0f385ed8648eeb0Douglas Gregor        Args.getLastArg(options::OPT_fdiagnostics_format_EQ)) {
3100c9471b0ff1815ed0149dbfcad0f385ed8648eeb0Douglas Gregor    CmdArgs.push_back("-fdiagnostics-format");
31011d489cf4a04ad0ad8ac2696e4eed0995f3a67288Richard Smith    CmdArgs.push_back(A->getValue());
3102c9471b0ff1815ed0149dbfcad0f385ed8648eeb0Douglas Gregor  }
3103c9471b0ff1815ed0149dbfcad0f385ed8648eeb0Douglas Gregor
3104abaca7a8be8e79cc01354676e3bcb26575640311Chandler Carruth  if (Arg *A = Args.getLastArg(
3105abaca7a8be8e79cc01354676e3bcb26575640311Chandler Carruth      options::OPT_fdiagnostics_show_note_include_stack,
3106abaca7a8be8e79cc01354676e3bcb26575640311Chandler Carruth      options::OPT_fno_diagnostics_show_note_include_stack)) {
3107abaca7a8be8e79cc01354676e3bcb26575640311Chandler Carruth    if (A->getOption().matches(
3108abaca7a8be8e79cc01354676e3bcb26575640311Chandler Carruth        options::OPT_fdiagnostics_show_note_include_stack))
3109abaca7a8be8e79cc01354676e3bcb26575640311Chandler Carruth      CmdArgs.push_back("-fdiagnostics-show-note-include-stack");
3110abaca7a8be8e79cc01354676e3bcb26575640311Chandler Carruth    else
3111abaca7a8be8e79cc01354676e3bcb26575640311Chandler Carruth      CmdArgs.push_back("-fno-diagnostics-show-note-include-stack");
3112abaca7a8be8e79cc01354676e3bcb26575640311Chandler Carruth  }
3113abaca7a8be8e79cc01354676e3bcb26575640311Chandler Carruth
3114838be483dcf10ea3f2acd85f2cd65adc310011f9Daniel Dunbar  // Color diagnostics are the default, unless the terminal doesn't support
3115838be483dcf10ea3f2acd85f2cd65adc310011f9Daniel Dunbar  // them.
3116838be483dcf10ea3f2acd85f2cd65adc310011f9Daniel Dunbar  if (Args.hasFlag(options::OPT_fcolor_diagnostics,
3117f765d76407d82e629337bba4ca6c26bdfc8bc9a6Argyrios Kyrtzidis                   options::OPT_fno_color_diagnostics,
3118f765d76407d82e629337bba4ca6c26bdfc8bc9a6Argyrios Kyrtzidis                   llvm::sys::Process::StandardErrHasColors()))
3119838be483dcf10ea3f2acd85f2cd65adc310011f9Daniel Dunbar    CmdArgs.push_back("-fcolor-diagnostics");
3120838be483dcf10ea3f2acd85f2cd65adc310011f9Daniel Dunbar
312175eb1d64784946a37fc0b27596e2d92b6cf7033bDaniel Dunbar  if (!Args.hasFlag(options::OPT_fshow_source_location,
312275eb1d64784946a37fc0b27596e2d92b6cf7033bDaniel Dunbar                    options::OPT_fno_show_source_location))
312375eb1d64784946a37fc0b27596e2d92b6cf7033bDaniel Dunbar    CmdArgs.push_back("-fno-show-source-location");
31249e820ee054fefe5422b4db3f681e567a8976747eDaniel Dunbar
3125c9471b0ff1815ed0149dbfcad0f385ed8648eeb0Douglas Gregor  if (!Args.hasFlag(options::OPT_fshow_column,
3126c9471b0ff1815ed0149dbfcad0f385ed8648eeb0Douglas Gregor                    options::OPT_fno_show_column,
3127c9471b0ff1815ed0149dbfcad0f385ed8648eeb0Douglas Gregor                    true))
3128c9471b0ff1815ed0149dbfcad0f385ed8648eeb0Douglas Gregor    CmdArgs.push_back("-fno-show-column");
3129c9471b0ff1815ed0149dbfcad0f385ed8648eeb0Douglas Gregor
3130a0068fc64351db9c47916566e3b85ab733cd8d6dDouglas Gregor  if (!Args.hasFlag(options::OPT_fspell_checking,
3131a0068fc64351db9c47916566e3b85ab733cd8d6dDouglas Gregor                    options::OPT_fno_spell_checking))
3132a0068fc64351db9c47916566e3b85ab733cd8d6dDouglas Gregor    CmdArgs.push_back("-fno-spell-checking");
3133ca0e0545c216afaacba6da6c82a270dc2efc4e3fDaniel Dunbar
313425b26ebdebe46bb4576247e0c64d1c11410a8e9dDaniel Dunbar
313515490fd42d7d8dca2f9b5b3a9dc074892ca1acd7Chad Rosier  // -fno-asm-blocks is default.
313615490fd42d7d8dca2f9b5b3a9dc074892ca1acd7Chad Rosier  if (Args.hasFlag(options::OPT_fasm_blocks, options::OPT_fno_asm_blocks,
313715490fd42d7d8dca2f9b5b3a9dc074892ca1acd7Chad Rosier                   false))
313815490fd42d7d8dca2f9b5b3a9dc074892ca1acd7Chad Rosier    CmdArgs.push_back("-fasm-blocks");
313925b26ebdebe46bb4576247e0c64d1c11410a8e9dDaniel Dunbar
31400f6ef2879083d3c556b9b74d2df7a07dc0b227d5Nadav Rotem  // -fvectorize is default.
3141c04d0934dfc78038ec1c073d9215750bd6a39c76Chad Rosier  if (Args.hasFlag(options::OPT_fvectorize,
31420f6ef2879083d3c556b9b74d2df7a07dc0b227d5Nadav Rotem                   options::OPT_fno_vectorize, true)) {
3143c04d0934dfc78038ec1c073d9215750bd6a39c76Chad Rosier    CmdArgs.push_back("-backend-option");
3144c04d0934dfc78038ec1c073d9215750bd6a39c76Chad Rosier    CmdArgs.push_back("-vectorize-loops");
3145c04d0934dfc78038ec1c073d9215750bd6a39c76Chad Rosier  }
3146c04d0934dfc78038ec1c073d9215750bd6a39c76Chad Rosier
3147443c999c967d555f6942834b0924c60226b3e6f2Hal Finkel  // -fno-slp-vectorize is default.
3148443c999c967d555f6942834b0924c60226b3e6f2Hal Finkel  if (Args.hasFlag(options::OPT_fslp_vectorize,
3149443c999c967d555f6942834b0924c60226b3e6f2Hal Finkel                   options::OPT_fno_slp_vectorize, false)) {
3150443c999c967d555f6942834b0924c60226b3e6f2Hal Finkel    CmdArgs.push_back("-backend-option");
3151443c999c967d555f6942834b0924c60226b3e6f2Hal Finkel    CmdArgs.push_back("-vectorize");
3152443c999c967d555f6942834b0924c60226b3e6f2Hal Finkel  }
3153443c999c967d555f6942834b0924c60226b3e6f2Hal Finkel
31545edbdcc62098e305cd55654814dcf783a3f3c477Jeffrey Yasskin  if (Arg *A = Args.getLastArg(options::OPT_fshow_overloads_EQ))
31555edbdcc62098e305cd55654814dcf783a3f3c477Jeffrey Yasskin    A->render(Args, CmdArgs);
31565edbdcc62098e305cd55654814dcf783a3f3c477Jeffrey Yasskin
31577695fba30221613b7cf31276456217c41bb90960Daniel Dunbar  // -fdollars-in-identifiers default varies depending on platform and
31587695fba30221613b7cf31276456217c41bb90960Daniel Dunbar  // language; only pass if specified.
31591eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump  if (Arg *A = Args.getLastArg(options::OPT_fdollars_in_identifiers,
31607695fba30221613b7cf31276456217c41bb90960Daniel Dunbar                               options::OPT_fno_dollars_in_identifiers)) {
31617695fba30221613b7cf31276456217c41bb90960Daniel Dunbar    if (A->getOption().matches(options::OPT_fdollars_in_identifiers))
31628663b180085e9bc7a0a87c80cc3f722efef99e79Daniel Dunbar      CmdArgs.push_back("-fdollars-in-identifiers");
31637695fba30221613b7cf31276456217c41bb90960Daniel Dunbar    else
31648663b180085e9bc7a0a87c80cc3f722efef99e79Daniel Dunbar      CmdArgs.push_back("-fno-dollars-in-identifiers");
31657695fba30221613b7cf31276456217c41bb90960Daniel Dunbar  }
31667695fba30221613b7cf31276456217c41bb90960Daniel Dunbar
3167e027a4b2399e9b0acfe0f77220c66bbe369067eeDaniel Dunbar  // -funit-at-a-time is default, and we don't support -fno-unit-at-a-time for
3168e027a4b2399e9b0acfe0f77220c66bbe369067eeDaniel Dunbar  // practical purposes.
31691eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump  if (Arg *A = Args.getLastArg(options::OPT_funit_at_a_time,
3170e027a4b2399e9b0acfe0f77220c66bbe369067eeDaniel Dunbar                               options::OPT_fno_unit_at_a_time)) {
3171e027a4b2399e9b0acfe0f77220c66bbe369067eeDaniel Dunbar    if (A->getOption().matches(options::OPT_fno_unit_at_a_time))
31725f9e272e632e951b1efe824cd16acb4d96077930Chris Lattner      D.Diag(diag::warn_drv_clang_unsupported) << A->getAsString(Args);
3173e027a4b2399e9b0acfe0f77220c66bbe369067eeDaniel Dunbar  }
3174ceb5c5b7f67a30fae305d1d19b478b623e4fbcedEli Friedman
317519bda3ad8b5d37e505214e82fab1d0a0bf00f0fdEli Friedman  if (Args.hasFlag(options::OPT_fapple_pragma_pack,
317619bda3ad8b5d37e505214e82fab1d0a0bf00f0fdEli Friedman                   options::OPT_fno_apple_pragma_pack, false))
317719bda3ad8b5d37e505214e82fab1d0a0bf00f0fdEli Friedman    CmdArgs.push_back("-fapple-pragma-pack");
317819bda3ad8b5d37e505214e82fab1d0a0bf00f0fdEli Friedman
31792ba91575905a54f712a7f64304e56002e4882499Daniel Dunbar  // Default to -fno-builtin-str{cat,cpy} on Darwin for ARM.
3180f84a4a469d8a45c76cb941595582a0fd3b9b15d3Daniel Dunbar  //
31818ff5b28d6efcffe2251e77634c7edf83a4763344Daniel Dunbar  // FIXME: This is disabled until clang -cc1 supports -fno-builtin-foo. PR4941.
3182f84a4a469d8a45c76cb941595582a0fd3b9b15d3Daniel Dunbar#if 0
3183905c45f15a25598620d19160c139c6b785aeea89Bob Wilson  if (getToolChain().getTriple().isOSDarwin() &&
31842ba91575905a54f712a7f64304e56002e4882499Daniel Dunbar      (getToolChain().getTriple().getArch() == llvm::Triple::arm ||
31852ba91575905a54f712a7f64304e56002e4882499Daniel Dunbar       getToolChain().getTriple().getArch() == llvm::Triple::thumb)) {
31862ba91575905a54f712a7f64304e56002e4882499Daniel Dunbar    if (!Args.hasArg(options::OPT_fbuiltin_strcat))
31872ba91575905a54f712a7f64304e56002e4882499Daniel Dunbar      CmdArgs.push_back("-fno-builtin-strcat");
31882ba91575905a54f712a7f64304e56002e4882499Daniel Dunbar    if (!Args.hasArg(options::OPT_fbuiltin_strcpy))
31892ba91575905a54f712a7f64304e56002e4882499Daniel Dunbar      CmdArgs.push_back("-fno-builtin-strcpy");
31902ba91575905a54f712a7f64304e56002e4882499Daniel Dunbar  }
3191f84a4a469d8a45c76cb941595582a0fd3b9b15d3Daniel Dunbar#endif
31922ba91575905a54f712a7f64304e56002e4882499Daniel Dunbar
3193d98750f065fd8d6278df72f6218e3d59b2df2aa9Daniel Dunbar  // Only allow -traditional or -traditional-cpp outside in preprocessing modes.
31941eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump  if (Arg *A = Args.getLastArg(options::OPT_traditional,
3195d98750f065fd8d6278df72f6218e3d59b2df2aa9Daniel Dunbar                               options::OPT_traditional_cpp)) {
3196d98750f065fd8d6278df72f6218e3d59b2df2aa9Daniel Dunbar    if (isa<PreprocessJobAction>(JA))
3197d98750f065fd8d6278df72f6218e3d59b2df2aa9Daniel Dunbar      CmdArgs.push_back("-traditional-cpp");
319888b7cf00fcb582728c642da3927c59468efaf926Eric Christopher    else
31995f9e272e632e951b1efe824cd16acb4d96077930Chris Lattner      D.Diag(diag::err_drv_clang_unsupported) << A->getAsString(Args);
3200d98750f065fd8d6278df72f6218e3d59b2df2aa9Daniel Dunbar  }
3201ceb5c5b7f67a30fae305d1d19b478b623e4fbcedEli Friedman
32021d46033f760ba5fd266ce59fe391fac473f04f52Daniel Dunbar  Args.AddLastArg(CmdArgs, options::OPT_dM);
3203d82df3ad430397d7f9ef511e7c5157f997c41f53Chris Lattner  Args.AddLastArg(CmdArgs, options::OPT_dD);
320436f6e30d5c21a693abf2612ef086e83e9696f0e0Ted Kremenek
320536f6e30d5c21a693abf2612ef086e83e9696f0e0Ted Kremenek  // Handle serialized diagnostics.
320636f6e30d5c21a693abf2612ef086e83e9696f0e0Ted Kremenek  if (Arg *A = Args.getLastArg(options::OPT__serialize_diags)) {
320736f6e30d5c21a693abf2612ef086e83e9696f0e0Ted Kremenek    CmdArgs.push_back("-serialize-diagnostic-file");
32081d489cf4a04ad0ad8ac2696e4eed0995f3a67288Richard Smith    CmdArgs.push_back(Args.MakeArgString(A->getValue()));
320936f6e30d5c21a693abf2612ef086e83e9696f0e0Ted Kremenek  }
32101d46033f760ba5fd266ce59fe391fac473f04f52Daniel Dunbar
3211127ff2ea6440c3da4b47f9c8b3b190254a97e7b5Ted Kremenek  if (Args.hasArg(options::OPT_fretain_comments_from_system_headers))
3212127ff2ea6440c3da4b47f9c8b3b190254a97e7b5Ted Kremenek    CmdArgs.push_back("-fretain-comments-from-system-headers");
3213127ff2ea6440c3da4b47f9c8b3b190254a97e7b5Ted Kremenek
32146ebf09130479bc7605aa09a3e6c4dc2ba3513495Dmitri Gribenko  // Forward -fcomment-block-commands to -cc1.
32156ebf09130479bc7605aa09a3e6c4dc2ba3513495Dmitri Gribenko  Args.AddAllArgs(CmdArgs, options::OPT_fcomment_block_commands);
32166ebf09130479bc7605aa09a3e6c4dc2ba3513495Dmitri Gribenko
32173f87fb08dd502309960646db01099fb4c1be9a7cDaniel Dunbar  // Forward -Xclang arguments to -cc1, and -mllvm arguments to the LLVM option
32183f87fb08dd502309960646db01099fb4c1be9a7cDaniel Dunbar  // parser.
32191d46033f760ba5fd266ce59fe391fac473f04f52Daniel Dunbar  Args.AddAllArgValues(CmdArgs, options::OPT_Xclang);
32203f87fb08dd502309960646db01099fb4c1be9a7cDaniel Dunbar  for (arg_iterator it = Args.filtered_begin(options::OPT_mllvm),
32213f87fb08dd502309960646db01099fb4c1be9a7cDaniel Dunbar         ie = Args.filtered_end(); it != ie; ++it) {
32227e4953e5c60409007545288f14b430bd23d68570Daniel Dunbar    (*it)->claim();
3223fb36d21960a3bd422665a961eac6ca269cd6445bDaniel Dunbar
32243f87fb08dd502309960646db01099fb4c1be9a7cDaniel Dunbar    // We translate this by hand to the -cc1 argument, since nightly test uses
32253f87fb08dd502309960646db01099fb4c1be9a7cDaniel Dunbar    // it and developers have been trained to spell it with -mllvm.
32261d489cf4a04ad0ad8ac2696e4eed0995f3a67288Richard Smith    if (StringRef((*it)->getValue(0)) == "-disable-llvm-optzns")
32273f87fb08dd502309960646db01099fb4c1be9a7cDaniel Dunbar      CmdArgs.push_back("-disable-llvm-optzns");
32283f87fb08dd502309960646db01099fb4c1be9a7cDaniel Dunbar    else
32297e4953e5c60409007545288f14b430bd23d68570Daniel Dunbar      (*it)->render(Args, CmdArgs);
32303f87fb08dd502309960646db01099fb4c1be9a7cDaniel Dunbar  }
32311d46033f760ba5fd266ce59fe391fac473f04f52Daniel Dunbar
3232cd8e4c44dd068956e9181381be3ee2d49a0fac52Daniel Dunbar  if (Output.getType() == types::TY_Dependencies) {
3233cd8e4c44dd068956e9181381be3ee2d49a0fac52Daniel Dunbar    // Handled with other dependency code.
3234115a79277edababaf1b26e3654044ae983197679Daniel Dunbar  } else if (Output.isFilename()) {
3235b488c1dac8e53206f07103d794a62a3f5012c0f4Daniel Dunbar    CmdArgs.push_back("-o");
3236115a79277edababaf1b26e3654044ae983197679Daniel Dunbar    CmdArgs.push_back(Output.getFilename());
3237115a79277edababaf1b26e3654044ae983197679Daniel Dunbar  } else {
3238115a79277edababaf1b26e3654044ae983197679Daniel Dunbar    assert(Output.isNothing() && "Invalid output.");
3239b488c1dac8e53206f07103d794a62a3f5012c0f4Daniel Dunbar  }
3240b488c1dac8e53206f07103d794a62a3f5012c0f4Daniel Dunbar
32411d46033f760ba5fd266ce59fe391fac473f04f52Daniel Dunbar  for (InputInfoList::const_iterator
32421d46033f760ba5fd266ce59fe391fac473f04f52Daniel Dunbar         it = Inputs.begin(), ie = Inputs.end(); it != ie; ++it) {
32431d46033f760ba5fd266ce59fe391fac473f04f52Daniel Dunbar    const InputInfo &II = *it;
32441d46033f760ba5fd266ce59fe391fac473f04f52Daniel Dunbar    CmdArgs.push_back("-x");
3245a5ee089fffc9c98d454694f80e7b541e97ca495eFariborz Jahanian    if (Args.hasArg(options::OPT_rewrite_objc))
3246a5ee089fffc9c98d454694f80e7b541e97ca495eFariborz Jahanian      CmdArgs.push_back(types::getTypeName(types::TY_PP_ObjCXX));
3247a5ee089fffc9c98d454694f80e7b541e97ca495eFariborz Jahanian    else
3248a5ee089fffc9c98d454694f80e7b541e97ca495eFariborz Jahanian      CmdArgs.push_back(types::getTypeName(II.getType()));
32497c1e46533cae07216e2a67d5636a5afb44253155Daniel Dunbar    if (II.isFilename())
3250115a79277edababaf1b26e3654044ae983197679Daniel Dunbar      CmdArgs.push_back(II.getFilename());
32511d46033f760ba5fd266ce59fe391fac473f04f52Daniel Dunbar    else
3252115a79277edababaf1b26e3654044ae983197679Daniel Dunbar      II.getInputArg().renderAsInput(Args, CmdArgs);
32531d46033f760ba5fd266ce59fe391fac473f04f52Daniel Dunbar  }
3254c21c485b4fb58ef5d55cf3e523263dd824a2ace4Daniel Dunbar
3255e6113de52df132b89c3a5a6141f17d37e83322aeChris Lattner  Args.AddAllArgs(CmdArgs, options::OPT_undef);
3256e6113de52df132b89c3a5a6141f17d37e83322aeChris Lattner
3257a001c1ce5fcb669624a5b8e50d0a629d673da901Daniel Dunbar  const char *Exec = getToolChain().getDriver().getClangProgramPath();
3258f2d8b9f967a1ab53ee9fdbcc3ac0a4ee0a83a26eDaniel Dunbar
3259f2d8b9f967a1ab53ee9fdbcc3ac0a4ee0a83a26eDaniel Dunbar  // Optionally embed the -cc1 level arguments into the debug info, for build
3260f2d8b9f967a1ab53ee9fdbcc3ac0a4ee0a83a26eDaniel Dunbar  // analysis.
3261f2d8b9f967a1ab53ee9fdbcc3ac0a4ee0a83a26eDaniel Dunbar  if (getToolChain().UseDwarfDebugFlags()) {
32626e90047520c8b4d6daa110bdbdaf15041016bd7cDaniel Dunbar    ArgStringList OriginalArgs;
32636e90047520c8b4d6daa110bdbdaf15041016bd7cDaniel Dunbar    for (ArgList::const_iterator it = Args.begin(),
32646e90047520c8b4d6daa110bdbdaf15041016bd7cDaniel Dunbar           ie = Args.end(); it != ie; ++it)
32656e90047520c8b4d6daa110bdbdaf15041016bd7cDaniel Dunbar      (*it)->render(Args, OriginalArgs);
3266ca0e0545c216afaacba6da6c82a270dc2efc4e3fDaniel Dunbar
3267f7ccbad5d9949e7ddd1cbef43d482553b811e026Dylan Noblesmith    SmallString<256> Flags;
3268f2d8b9f967a1ab53ee9fdbcc3ac0a4ee0a83a26eDaniel Dunbar    Flags += Exec;
32696e90047520c8b4d6daa110bdbdaf15041016bd7cDaniel Dunbar    for (unsigned i = 0, e = OriginalArgs.size(); i != e; ++i) {
3270f2d8b9f967a1ab53ee9fdbcc3ac0a4ee0a83a26eDaniel Dunbar      Flags += " ";
32716e90047520c8b4d6daa110bdbdaf15041016bd7cDaniel Dunbar      Flags += OriginalArgs[i];
3272f2d8b9f967a1ab53ee9fdbcc3ac0a4ee0a83a26eDaniel Dunbar    }
3273f2d8b9f967a1ab53ee9fdbcc3ac0a4ee0a83a26eDaniel Dunbar    CmdArgs.push_back("-dwarf-debug-flags");
3274f2d8b9f967a1ab53ee9fdbcc3ac0a4ee0a83a26eDaniel Dunbar    CmdArgs.push_back(Args.MakeArgString(Flags.str()));
3275f2d8b9f967a1ab53ee9fdbcc3ac0a4ee0a83a26eDaniel Dunbar  }
3276f2d8b9f967a1ab53ee9fdbcc3ac0a4ee0a83a26eDaniel Dunbar
327780190399f5a062db72127869978699af65951b73Eric Christopher  // Add the split debug info name to the command lines here so we
327880190399f5a062db72127869978699af65951b73Eric Christopher  // can propagate it to the backend.
327980190399f5a062db72127869978699af65951b73Eric Christopher  bool SplitDwarf = Args.hasArg(options::OPT_gsplit_dwarf) &&
328080190399f5a062db72127869978699af65951b73Eric Christopher    (getToolChain().getTriple().getOS() == llvm::Triple::Linux) &&
3281ff971d7973aaa00c286b788d30f6919c7b1f4de2Eric Christopher    (isa<AssembleJobAction>(JA) || isa<CompileJobAction>(JA));
328280190399f5a062db72127869978699af65951b73Eric Christopher  const char *SplitDwarfOut;
328380190399f5a062db72127869978699af65951b73Eric Christopher  if (SplitDwarf) {
328480190399f5a062db72127869978699af65951b73Eric Christopher    CmdArgs.push_back("-split-dwarf-file");
328580190399f5a062db72127869978699af65951b73Eric Christopher    SplitDwarfOut = SplitDebugName(Args, Inputs);
328680190399f5a062db72127869978699af65951b73Eric Christopher    CmdArgs.push_back(SplitDwarfOut);
328780190399f5a062db72127869978699af65951b73Eric Christopher  }
328880190399f5a062db72127869978699af65951b73Eric Christopher
328980190399f5a062db72127869978699af65951b73Eric Christopher  // Finally add the compile command to the compilation.
32902fe238ed293bd4bc27af9beb9fa151fad2146fa8Daniel Dunbar  C.addCommand(new Command(JA, *this, Exec, CmdArgs));
3291a880db0b0fc028abf754c290d921d809eec0518aDaniel Dunbar
3292ff971d7973aaa00c286b788d30f6919c7b1f4de2Eric Christopher  // Handle the debug info splitting at object creation time if we're
3293ff971d7973aaa00c286b788d30f6919c7b1f4de2Eric Christopher  // creating an object.
329459320e770f90a59c74f2be10f198e3c390195628Eric Christopher  // TODO: Currently only works on linux with newer objcopy.
3295ff971d7973aaa00c286b788d30f6919c7b1f4de2Eric Christopher  if (SplitDwarf && !isa<CompileJobAction>(JA))
329680190399f5a062db72127869978699af65951b73Eric Christopher    SplitDebugInfo(getToolChain(), C, *this, JA, Args, Output, SplitDwarfOut);
329759320e770f90a59c74f2be10f198e3c390195628Eric Christopher
3298be4c8705e499b55548467eb7adaa23cbc6edfef9Roman Divacky  if (Arg *A = Args.getLastArg(options::OPT_pg))
3299be4c8705e499b55548467eb7adaa23cbc6edfef9Roman Divacky    if (Args.hasArg(options::OPT_fomit_frame_pointer))
33005f9e272e632e951b1efe824cd16acb4d96077930Chris Lattner      D.Diag(diag::err_drv_argument_not_allowed_with)
3301be4c8705e499b55548467eb7adaa23cbc6edfef9Roman Divacky        << "-fomit-frame-pointer" << A->getAsString(Args);
330220249a1af2e462dcafdd6a350f1c7967b264ff25Michael J. Spencer
330368fb469aeb19144403e703b825854d08353c8eeaDaniel Dunbar  // Claim some arguments which clang supports automatically.
330468fb469aeb19144403e703b825854d08353c8eeaDaniel Dunbar
3305f4046866e20fe3279b0daa2f48d9e83263dfdbfeDaniel Dunbar  // -fpch-preprocess is used with gcc to add a special marker in the output to
3306f4046866e20fe3279b0daa2f48d9e83263dfdbfeDaniel Dunbar  // include the PCH file. Clang's PTH solution is completely transparent, so we
3307f4046866e20fe3279b0daa2f48d9e83263dfdbfeDaniel Dunbar  // do not need to deal with it at all.
330868fb469aeb19144403e703b825854d08353c8eeaDaniel Dunbar  Args.ClaimAllArgs(options::OPT_fpch_preprocess);
3309c21c485b4fb58ef5d55cf3e523263dd824a2ace4Daniel Dunbar
3310a880db0b0fc028abf754c290d921d809eec0518aDaniel Dunbar  // Claim some arguments which clang doesn't support, but we don't
3311a880db0b0fc028abf754c290d921d809eec0518aDaniel Dunbar  // care to warn the user about.
3312cdd9686b890ebdc10039ae256ef4c9dfb5ebacb7Daniel Dunbar  Args.ClaimAllArgs(options::OPT_clang_ignored_f_Group);
3313cdd9686b890ebdc10039ae256ef4c9dfb5ebacb7Daniel Dunbar  Args.ClaimAllArgs(options::OPT_clang_ignored_m_Group);
3314035ff0c6746a2689667c83d4c02a47d5a7b71e82Rafael Espindola
33159c094fbcfaba49fc1aeca119c0e12bec59779692Rafael Espindola  // Disable warnings for clang -E -use-gold-plugin -emit-llvm foo.c
3316035ff0c6746a2689667c83d4c02a47d5a7b71e82Rafael Espindola  Args.ClaimAllArgs(options::OPT_use_gold_plugin);
33179c094fbcfaba49fc1aeca119c0e12bec59779692Rafael Espindola  Args.ClaimAllArgs(options::OPT_emit_llvm);
331847ac7d27c44bd64a7d0fc03d4babc196cf2b8230Daniel Dunbar}
331947ac7d27c44bd64a7d0fc03d4babc196cf2b8230Daniel Dunbar
3320fc30829694e62040c14f329f5491724fe7476241Jim Grosbachvoid ClangAs::AddARMTargetArgs(const ArgList &Args,
3321fc30829694e62040c14f329f5491724fe7476241Jim Grosbach                               ArgStringList &CmdArgs) const {
3322fc30829694e62040c14f329f5491724fe7476241Jim Grosbach  const Driver &D = getToolChain().getDriver();
3323fc30829694e62040c14f329f5491724fe7476241Jim Grosbach  llvm::Triple Triple = getToolChain().getTriple();
3324fc30829694e62040c14f329f5491724fe7476241Jim Grosbach
3325fc30829694e62040c14f329f5491724fe7476241Jim Grosbach  // Set the CPU based on -march= and -mcpu=.
3326fc30829694e62040c14f329f5491724fe7476241Jim Grosbach  CmdArgs.push_back("-target-cpu");
332792c4fd5c17a5fd433cca7ddecb0ad4a104baa59cBenjamin Kramer  CmdArgs.push_back(Args.MakeArgString(getARMTargetCPU(Args, Triple)));
3328fc30829694e62040c14f329f5491724fe7476241Jim Grosbach
3329fc30829694e62040c14f329f5491724fe7476241Jim Grosbach  // Honor -mfpu=.
3330993172757762436d22b2dfc74e7cca1bade1a7bfChad Rosier  if (const Arg *A = Args.getLastArg(options::OPT_mfpu_EQ))
3331f80f2a5098218211704bc4e66a8c2f46a8fa1d25Chad Rosier    addFPUArgs(D, A, Args, CmdArgs);
33327a938fa66be42710b034a79106de337a275fd265Chad Rosier
33337a938fa66be42710b034a79106de337a275fd265Chad Rosier  // Honor -mfpmath=.
33347a938fa66be42710b034a79106de337a275fd265Chad Rosier  if (const Arg *A = Args.getLastArg(options::OPT_mfpmath_EQ))
333530fe6baf95662ea82a794a8fe3b76998713c183dChad Rosier    addFPMathArgs(D, A, Args, CmdArgs, getARMTargetCPU(Args, Triple));
3336fc30829694e62040c14f329f5491724fe7476241Jim Grosbach}
3337fc30829694e62040c14f329f5491724fe7476241Jim Grosbach
3338efc5b6713e51726ced594bc566d3291ffbf22ae2Benjamin Kramervoid ClangAs::AddX86TargetArgs(const ArgList &Args,
3339efc5b6713e51726ced594bc566d3291ffbf22ae2Benjamin Kramer                               ArgStringList &CmdArgs) const {
3340efc5b6713e51726ced594bc566d3291ffbf22ae2Benjamin Kramer  // Set the CPU based on -march=.
3341efc5b6713e51726ced594bc566d3291ffbf22ae2Benjamin Kramer  if (const char *CPUName = getX86TargetCPU(Args, getToolChain().getTriple())) {
3342efc5b6713e51726ced594bc566d3291ffbf22ae2Benjamin Kramer    CmdArgs.push_back("-target-cpu");
3343efc5b6713e51726ced594bc566d3291ffbf22ae2Benjamin Kramer    CmdArgs.push_back(CPUName);
3344efc5b6713e51726ced594bc566d3291ffbf22ae2Benjamin Kramer  }
3345efc5b6713e51726ced594bc566d3291ffbf22ae2Benjamin Kramer}
3346efc5b6713e51726ced594bc566d3291ffbf22ae2Benjamin Kramer
3347260611a32535c851237926bfcf78869b13c07d5bJohn McCall/// Add options related to the Objective-C runtime/ABI.
3348260611a32535c851237926bfcf78869b13c07d5bJohn McCall///
3349260611a32535c851237926bfcf78869b13c07d5bJohn McCall/// Returns true if the runtime is non-fragile.
3350260611a32535c851237926bfcf78869b13c07d5bJohn McCallObjCRuntime Clang::AddObjCRuntimeArgs(const ArgList &args,
3351260611a32535c851237926bfcf78869b13c07d5bJohn McCall                                      ArgStringList &cmdArgs,
3352260611a32535c851237926bfcf78869b13c07d5bJohn McCall                                      RewriteKind rewriteKind) const {
3353260611a32535c851237926bfcf78869b13c07d5bJohn McCall  // Look for the controlling runtime option.
3354260611a32535c851237926bfcf78869b13c07d5bJohn McCall  Arg *runtimeArg = args.getLastArg(options::OPT_fnext_runtime,
3355260611a32535c851237926bfcf78869b13c07d5bJohn McCall                                    options::OPT_fgnu_runtime,
3356260611a32535c851237926bfcf78869b13c07d5bJohn McCall                                    options::OPT_fobjc_runtime_EQ);
3357260611a32535c851237926bfcf78869b13c07d5bJohn McCall
3358260611a32535c851237926bfcf78869b13c07d5bJohn McCall  // Just forward -fobjc-runtime= to the frontend.  This supercedes
3359260611a32535c851237926bfcf78869b13c07d5bJohn McCall  // options about fragility.
3360260611a32535c851237926bfcf78869b13c07d5bJohn McCall  if (runtimeArg &&
3361260611a32535c851237926bfcf78869b13c07d5bJohn McCall      runtimeArg->getOption().matches(options::OPT_fobjc_runtime_EQ)) {
3362260611a32535c851237926bfcf78869b13c07d5bJohn McCall    ObjCRuntime runtime;
33631d489cf4a04ad0ad8ac2696e4eed0995f3a67288Richard Smith    StringRef value = runtimeArg->getValue();
3364260611a32535c851237926bfcf78869b13c07d5bJohn McCall    if (runtime.tryParse(value)) {
3365260611a32535c851237926bfcf78869b13c07d5bJohn McCall      getToolChain().getDriver().Diag(diag::err_drv_unknown_objc_runtime)
3366260611a32535c851237926bfcf78869b13c07d5bJohn McCall        << value;
3367260611a32535c851237926bfcf78869b13c07d5bJohn McCall    }
3368260611a32535c851237926bfcf78869b13c07d5bJohn McCall
3369260611a32535c851237926bfcf78869b13c07d5bJohn McCall    runtimeArg->render(args, cmdArgs);
3370260611a32535c851237926bfcf78869b13c07d5bJohn McCall    return runtime;
3371260611a32535c851237926bfcf78869b13c07d5bJohn McCall  }
3372260611a32535c851237926bfcf78869b13c07d5bJohn McCall
3373260611a32535c851237926bfcf78869b13c07d5bJohn McCall  // Otherwise, we'll need the ABI "version".  Version numbers are
3374260611a32535c851237926bfcf78869b13c07d5bJohn McCall  // slightly confusing for historical reasons:
3375260611a32535c851237926bfcf78869b13c07d5bJohn McCall  //   1 - Traditional "fragile" ABI
3376260611a32535c851237926bfcf78869b13c07d5bJohn McCall  //   2 - Non-fragile ABI, version 1
3377260611a32535c851237926bfcf78869b13c07d5bJohn McCall  //   3 - Non-fragile ABI, version 2
3378260611a32535c851237926bfcf78869b13c07d5bJohn McCall  unsigned objcABIVersion = 1;
3379260611a32535c851237926bfcf78869b13c07d5bJohn McCall  // If -fobjc-abi-version= is present, use that to set the version.
3380260611a32535c851237926bfcf78869b13c07d5bJohn McCall  if (Arg *abiArg = args.getLastArg(options::OPT_fobjc_abi_version_EQ)) {
33811d489cf4a04ad0ad8ac2696e4eed0995f3a67288Richard Smith    StringRef value = abiArg->getValue();
3382260611a32535c851237926bfcf78869b13c07d5bJohn McCall    if (value == "1")
3383260611a32535c851237926bfcf78869b13c07d5bJohn McCall      objcABIVersion = 1;
3384260611a32535c851237926bfcf78869b13c07d5bJohn McCall    else if (value == "2")
3385260611a32535c851237926bfcf78869b13c07d5bJohn McCall      objcABIVersion = 2;
3386260611a32535c851237926bfcf78869b13c07d5bJohn McCall    else if (value == "3")
3387260611a32535c851237926bfcf78869b13c07d5bJohn McCall      objcABIVersion = 3;
3388260611a32535c851237926bfcf78869b13c07d5bJohn McCall    else
3389260611a32535c851237926bfcf78869b13c07d5bJohn McCall      getToolChain().getDriver().Diag(diag::err_drv_clang_unsupported)
3390260611a32535c851237926bfcf78869b13c07d5bJohn McCall        << value;
3391260611a32535c851237926bfcf78869b13c07d5bJohn McCall  } else {
3392260611a32535c851237926bfcf78869b13c07d5bJohn McCall    // Otherwise, determine if we are using the non-fragile ABI.
3393260611a32535c851237926bfcf78869b13c07d5bJohn McCall    bool nonFragileABIIsDefault =
3394260611a32535c851237926bfcf78869b13c07d5bJohn McCall      (rewriteKind == RK_NonFragile ||
3395260611a32535c851237926bfcf78869b13c07d5bJohn McCall       (rewriteKind == RK_None &&
3396260611a32535c851237926bfcf78869b13c07d5bJohn McCall        getToolChain().IsObjCNonFragileABIDefault()));
3397260611a32535c851237926bfcf78869b13c07d5bJohn McCall    if (args.hasFlag(options::OPT_fobjc_nonfragile_abi,
3398260611a32535c851237926bfcf78869b13c07d5bJohn McCall                     options::OPT_fno_objc_nonfragile_abi,
3399260611a32535c851237926bfcf78869b13c07d5bJohn McCall                     nonFragileABIIsDefault)) {
3400260611a32535c851237926bfcf78869b13c07d5bJohn McCall      // Determine the non-fragile ABI version to use.
3401260611a32535c851237926bfcf78869b13c07d5bJohn McCall#ifdef DISABLE_DEFAULT_NONFRAGILEABI_TWO
3402260611a32535c851237926bfcf78869b13c07d5bJohn McCall      unsigned nonFragileABIVersion = 1;
3403260611a32535c851237926bfcf78869b13c07d5bJohn McCall#else
3404260611a32535c851237926bfcf78869b13c07d5bJohn McCall      unsigned nonFragileABIVersion = 2;
3405260611a32535c851237926bfcf78869b13c07d5bJohn McCall#endif
3406260611a32535c851237926bfcf78869b13c07d5bJohn McCall
3407260611a32535c851237926bfcf78869b13c07d5bJohn McCall      if (Arg *abiArg = args.getLastArg(
3408260611a32535c851237926bfcf78869b13c07d5bJohn McCall            options::OPT_fobjc_nonfragile_abi_version_EQ)) {
34091d489cf4a04ad0ad8ac2696e4eed0995f3a67288Richard Smith        StringRef value = abiArg->getValue();
3410260611a32535c851237926bfcf78869b13c07d5bJohn McCall        if (value == "1")
3411260611a32535c851237926bfcf78869b13c07d5bJohn McCall          nonFragileABIVersion = 1;
3412260611a32535c851237926bfcf78869b13c07d5bJohn McCall        else if (value == "2")
3413260611a32535c851237926bfcf78869b13c07d5bJohn McCall          nonFragileABIVersion = 2;
3414260611a32535c851237926bfcf78869b13c07d5bJohn McCall        else
3415260611a32535c851237926bfcf78869b13c07d5bJohn McCall          getToolChain().getDriver().Diag(diag::err_drv_clang_unsupported)
3416260611a32535c851237926bfcf78869b13c07d5bJohn McCall            << value;
3417260611a32535c851237926bfcf78869b13c07d5bJohn McCall      }
3418260611a32535c851237926bfcf78869b13c07d5bJohn McCall
3419260611a32535c851237926bfcf78869b13c07d5bJohn McCall      objcABIVersion = 1 + nonFragileABIVersion;
3420260611a32535c851237926bfcf78869b13c07d5bJohn McCall    } else {
3421260611a32535c851237926bfcf78869b13c07d5bJohn McCall      objcABIVersion = 1;
3422260611a32535c851237926bfcf78869b13c07d5bJohn McCall    }
3423260611a32535c851237926bfcf78869b13c07d5bJohn McCall  }
3424260611a32535c851237926bfcf78869b13c07d5bJohn McCall
3425260611a32535c851237926bfcf78869b13c07d5bJohn McCall  // We don't actually care about the ABI version other than whether
3426260611a32535c851237926bfcf78869b13c07d5bJohn McCall  // it's non-fragile.
3427260611a32535c851237926bfcf78869b13c07d5bJohn McCall  bool isNonFragile = objcABIVersion != 1;
3428260611a32535c851237926bfcf78869b13c07d5bJohn McCall
3429260611a32535c851237926bfcf78869b13c07d5bJohn McCall  // If we have no runtime argument, ask the toolchain for its default runtime.
3430260611a32535c851237926bfcf78869b13c07d5bJohn McCall  // However, the rewriter only really supports the Mac runtime, so assume that.
3431260611a32535c851237926bfcf78869b13c07d5bJohn McCall  ObjCRuntime runtime;
3432260611a32535c851237926bfcf78869b13c07d5bJohn McCall  if (!runtimeArg) {
3433260611a32535c851237926bfcf78869b13c07d5bJohn McCall    switch (rewriteKind) {
3434260611a32535c851237926bfcf78869b13c07d5bJohn McCall    case RK_None:
3435260611a32535c851237926bfcf78869b13c07d5bJohn McCall      runtime = getToolChain().getDefaultObjCRuntime(isNonFragile);
3436260611a32535c851237926bfcf78869b13c07d5bJohn McCall      break;
3437260611a32535c851237926bfcf78869b13c07d5bJohn McCall    case RK_Fragile:
3438260611a32535c851237926bfcf78869b13c07d5bJohn McCall      runtime = ObjCRuntime(ObjCRuntime::FragileMacOSX, VersionTuple());
3439260611a32535c851237926bfcf78869b13c07d5bJohn McCall      break;
3440260611a32535c851237926bfcf78869b13c07d5bJohn McCall    case RK_NonFragile:
3441260611a32535c851237926bfcf78869b13c07d5bJohn McCall      runtime = ObjCRuntime(ObjCRuntime::MacOSX, VersionTuple());
3442260611a32535c851237926bfcf78869b13c07d5bJohn McCall      break;
3443260611a32535c851237926bfcf78869b13c07d5bJohn McCall    }
3444260611a32535c851237926bfcf78869b13c07d5bJohn McCall
3445260611a32535c851237926bfcf78869b13c07d5bJohn McCall  // -fnext-runtime
3446260611a32535c851237926bfcf78869b13c07d5bJohn McCall  } else if (runtimeArg->getOption().matches(options::OPT_fnext_runtime)) {
3447260611a32535c851237926bfcf78869b13c07d5bJohn McCall    // On Darwin, make this use the default behavior for the toolchain.
3448260611a32535c851237926bfcf78869b13c07d5bJohn McCall    if (getToolChain().getTriple().isOSDarwin()) {
3449260611a32535c851237926bfcf78869b13c07d5bJohn McCall      runtime = getToolChain().getDefaultObjCRuntime(isNonFragile);
3450260611a32535c851237926bfcf78869b13c07d5bJohn McCall
3451260611a32535c851237926bfcf78869b13c07d5bJohn McCall    // Otherwise, build for a generic macosx port.
3452260611a32535c851237926bfcf78869b13c07d5bJohn McCall    } else {
3453260611a32535c851237926bfcf78869b13c07d5bJohn McCall      runtime = ObjCRuntime(ObjCRuntime::MacOSX, VersionTuple());
3454260611a32535c851237926bfcf78869b13c07d5bJohn McCall    }
3455260611a32535c851237926bfcf78869b13c07d5bJohn McCall
3456260611a32535c851237926bfcf78869b13c07d5bJohn McCall  // -fgnu-runtime
3457260611a32535c851237926bfcf78869b13c07d5bJohn McCall  } else {
3458260611a32535c851237926bfcf78869b13c07d5bJohn McCall    assert(runtimeArg->getOption().matches(options::OPT_fgnu_runtime));
3459a422cd0ed4da8cb5a172498f29bb02065707c6ceDavid Chisnall    // Legacy behaviour is to target the gnustep runtime if we are i
3460a422cd0ed4da8cb5a172498f29bb02065707c6ceDavid Chisnall    // non-fragile mode or the GCC runtime in fragile mode.
3461a422cd0ed4da8cb5a172498f29bb02065707c6ceDavid Chisnall    if (isNonFragile)
3462891dac73bdb090ff845982e4334f5b4c18353dbeDavid Chisnall      runtime = ObjCRuntime(ObjCRuntime::GNUstep, VersionTuple(1,6));
3463a422cd0ed4da8cb5a172498f29bb02065707c6ceDavid Chisnall    else
3464a422cd0ed4da8cb5a172498f29bb02065707c6ceDavid Chisnall      runtime = ObjCRuntime(ObjCRuntime::GCC, VersionTuple());
3465260611a32535c851237926bfcf78869b13c07d5bJohn McCall  }
3466260611a32535c851237926bfcf78869b13c07d5bJohn McCall
3467260611a32535c851237926bfcf78869b13c07d5bJohn McCall  cmdArgs.push_back(args.MakeArgString(
3468260611a32535c851237926bfcf78869b13c07d5bJohn McCall                                 "-fobjc-runtime=" + runtime.getAsString()));
3469260611a32535c851237926bfcf78869b13c07d5bJohn McCall  return runtime;
3470260611a32535c851237926bfcf78869b13c07d5bJohn McCall}
3471260611a32535c851237926bfcf78869b13c07d5bJohn McCall
347220a9aa50f9a7d4b03f97bc67e96da1d605c309a2Daniel Dunbarvoid ClangAs::ConstructJob(Compilation &C, const JobAction &JA,
347320a9aa50f9a7d4b03f97bc67e96da1d605c309a2Daniel Dunbar                           const InputInfo &Output,
347420a9aa50f9a7d4b03f97bc67e96da1d605c309a2Daniel Dunbar                           const InputInfoList &Inputs,
347520a9aa50f9a7d4b03f97bc67e96da1d605c309a2Daniel Dunbar                           const ArgList &Args,
347620a9aa50f9a7d4b03f97bc67e96da1d605c309a2Daniel Dunbar                           const char *LinkingOutput) const {
347720a9aa50f9a7d4b03f97bc67e96da1d605c309a2Daniel Dunbar  ArgStringList CmdArgs;
347820a9aa50f9a7d4b03f97bc67e96da1d605c309a2Daniel Dunbar
347920a9aa50f9a7d4b03f97bc67e96da1d605c309a2Daniel Dunbar  assert(Inputs.size() == 1 && "Unexpected number of inputs.");
348020a9aa50f9a7d4b03f97bc67e96da1d605c309a2Daniel Dunbar  const InputInfo &Input = Inputs[0];
348120a9aa50f9a7d4b03f97bc67e96da1d605c309a2Daniel Dunbar
3482dbe80d9933e1fb0c26bd339e1f1f2f2d76dcac0aRafael Espindola  // Don't warn about "clang -w -c foo.s"
3483dbe80d9933e1fb0c26bd339e1f1f2f2d76dcac0aRafael Espindola  Args.ClaimAllArgs(options::OPT_w);
34849c094fbcfaba49fc1aeca119c0e12bec59779692Rafael Espindola  // and "clang -emit-llvm -c foo.s"
34859c094fbcfaba49fc1aeca119c0e12bec59779692Rafael Espindola  Args.ClaimAllArgs(options::OPT_emit_llvm);
34869c094fbcfaba49fc1aeca119c0e12bec59779692Rafael Espindola  // and "clang -use-gold-plugin -c foo.s"
34879c094fbcfaba49fc1aeca119c0e12bec59779692Rafael Espindola  Args.ClaimAllArgs(options::OPT_use_gold_plugin);
3488dbe80d9933e1fb0c26bd339e1f1f2f2d76dcac0aRafael Espindola
348920a9aa50f9a7d4b03f97bc67e96da1d605c309a2Daniel Dunbar  // Invoke ourselves in -cc1as mode.
349020a9aa50f9a7d4b03f97bc67e96da1d605c309a2Daniel Dunbar  //
349120a9aa50f9a7d4b03f97bc67e96da1d605c309a2Daniel Dunbar  // FIXME: Implement custom jobs for internal actions.
349220a9aa50f9a7d4b03f97bc67e96da1d605c309a2Daniel Dunbar  CmdArgs.push_back("-cc1as");
349320a9aa50f9a7d4b03f97bc67e96da1d605c309a2Daniel Dunbar
349420a9aa50f9a7d4b03f97bc67e96da1d605c309a2Daniel Dunbar  // Add the "effective" target triple.
349520a9aa50f9a7d4b03f97bc67e96da1d605c309a2Daniel Dunbar  CmdArgs.push_back("-triple");
349661ab80a8b35e6fe9363e8ef1b3d27209b0e89349Chad Rosier  std::string TripleStr =
349761ab80a8b35e6fe9363e8ef1b3d27209b0e89349Chad Rosier    getToolChain().ComputeEffectiveClangTriple(Args, Input.getType());
349820a9aa50f9a7d4b03f97bc67e96da1d605c309a2Daniel Dunbar  CmdArgs.push_back(Args.MakeArgString(TripleStr));
349920a9aa50f9a7d4b03f97bc67e96da1d605c309a2Daniel Dunbar
350020a9aa50f9a7d4b03f97bc67e96da1d605c309a2Daniel Dunbar  // Set the output mode, we currently only expect to be used as a real
350120a9aa50f9a7d4b03f97bc67e96da1d605c309a2Daniel Dunbar  // assembler.
350220a9aa50f9a7d4b03f97bc67e96da1d605c309a2Daniel Dunbar  CmdArgs.push_back("-filetype");
350320a9aa50f9a7d4b03f97bc67e96da1d605c309a2Daniel Dunbar  CmdArgs.push_back("obj");
350420a9aa50f9a7d4b03f97bc67e96da1d605c309a2Daniel Dunbar
350527e2b983beb8b5a29869639637327725623069a8Eric Christopher  // Set the main file name, so that debug info works even with
350627e2b983beb8b5a29869639637327725623069a8Eric Christopher  // -save-temps or preprocessed assembly.
350727e2b983beb8b5a29869639637327725623069a8Eric Christopher  CmdArgs.push_back("-main-file-name");
350827e2b983beb8b5a29869639637327725623069a8Eric Christopher  CmdArgs.push_back(Clang::getBaseInputName(Args, Inputs));
350927e2b983beb8b5a29869639637327725623069a8Eric Christopher
3510359cf927cf4980099a04b3f3cf040b81d181fe3dJoerg Sonnenberger  if (UseRelaxAll(C, Args))
3511469d40ef5a95d0eaddfd541616ad4cd26668e856Daniel Dunbar    CmdArgs.push_back("-relax-all");
35129929800b8dfced61e9c97dc8d6e71e144ebf8accDaniel Dunbar
3513fc30829694e62040c14f329f5491724fe7476241Jim Grosbach  // Add target specific cpu and features flags.
3514fc30829694e62040c14f329f5491724fe7476241Jim Grosbach  switch(getToolChain().getTriple().getArch()) {
3515fc30829694e62040c14f329f5491724fe7476241Jim Grosbach  default:
3516fc30829694e62040c14f329f5491724fe7476241Jim Grosbach    break;
3517fc30829694e62040c14f329f5491724fe7476241Jim Grosbach
3518fc30829694e62040c14f329f5491724fe7476241Jim Grosbach  case llvm::Triple::arm:
3519fc30829694e62040c14f329f5491724fe7476241Jim Grosbach  case llvm::Triple::thumb:
3520fc30829694e62040c14f329f5491724fe7476241Jim Grosbach    AddARMTargetArgs(Args, CmdArgs);
3521fc30829694e62040c14f329f5491724fe7476241Jim Grosbach    break;
3522efc5b6713e51726ced594bc566d3291ffbf22ae2Benjamin Kramer
3523efc5b6713e51726ced594bc566d3291ffbf22ae2Benjamin Kramer  case llvm::Triple::x86:
3524efc5b6713e51726ced594bc566d3291ffbf22ae2Benjamin Kramer  case llvm::Triple::x86_64:
3525efc5b6713e51726ced594bc566d3291ffbf22ae2Benjamin Kramer    AddX86TargetArgs(Args, CmdArgs);
3526efc5b6713e51726ced594bc566d3291ffbf22ae2Benjamin Kramer    break;
3527fc30829694e62040c14f329f5491724fe7476241Jim Grosbach  }
3528fc30829694e62040c14f329f5491724fe7476241Jim Grosbach
35297f6f8c8ab29db9221ed40ab7d5317df29848cc52Daniel Dunbar  // Ignore explicit -force_cpusubtype_ALL option.
35307f6f8c8ab29db9221ed40ab7d5317df29848cc52Daniel Dunbar  (void) Args.hasArg(options::OPT_force__cpusubtype__ALL);
353120a9aa50f9a7d4b03f97bc67e96da1d605c309a2Daniel Dunbar
35328f0a403945b60a8a8a56a7721bb66f6b84ec129bEric Christopher  // Determine the original source input.
35338f0a403945b60a8a8a56a7721bb66f6b84ec129bEric Christopher  const Action *SourceAction = &JA;
35348f0a403945b60a8a8a56a7721bb66f6b84ec129bEric Christopher  while (SourceAction->getKind() != Action::InputClass) {
35358f0a403945b60a8a8a56a7721bb66f6b84ec129bEric Christopher    assert(!SourceAction->getInputs().empty() && "unexpected root action!");
35368f0a403945b60a8a8a56a7721bb66f6b84ec129bEric Christopher    SourceAction = SourceAction->getInputs()[0];
35378f0a403945b60a8a8a56a7721bb66f6b84ec129bEric Christopher  }
35388f0a403945b60a8a8a56a7721bb66f6b84ec129bEric Christopher
3539d566df67bed6381f6e859bbd21fd43ff89277cc0Chandler Carruth  // Forward -g and handle debug info related flags, assuming we are dealing
3540d566df67bed6381f6e859bbd21fd43ff89277cc0Chandler Carruth  // with an actual assembly file.
35418f0a403945b60a8a8a56a7721bb66f6b84ec129bEric Christopher  if (SourceAction->getType() == types::TY_Asm ||
35428f0a403945b60a8a8a56a7721bb66f6b84ec129bEric Christopher      SourceAction->getType() == types::TY_PP_Asm) {
35438f0a403945b60a8a8a56a7721bb66f6b84ec129bEric Christopher    Args.ClaimAllArgs(options::OPT_g_Group);
35448f0a403945b60a8a8a56a7721bb66f6b84ec129bEric Christopher    if (Arg *A = Args.getLastArg(options::OPT_g_Group))
35458f0a403945b60a8a8a56a7721bb66f6b84ec129bEric Christopher      if (!A->getOption().matches(options::OPT_g0))
35468f0a403945b60a8a8a56a7721bb66f6b84ec129bEric Christopher        CmdArgs.push_back("-g");
3547d566df67bed6381f6e859bbd21fd43ff89277cc0Chandler Carruth
3548d566df67bed6381f6e859bbd21fd43ff89277cc0Chandler Carruth    // Add the -fdebug-compilation-dir flag if needed.
3549d566df67bed6381f6e859bbd21fd43ff89277cc0Chandler Carruth    addDebugCompDirArg(Args, CmdArgs);
35500234179282d59e6dfccc8b2da72a9a71bf5b6ac3Kevin Enderby
35510234179282d59e6dfccc8b2da72a9a71bf5b6ac3Kevin Enderby    // Set the AT_producer to the clang version when using the integrated
35520234179282d59e6dfccc8b2da72a9a71bf5b6ac3Kevin Enderby    // assembler on assembly source files.
35530234179282d59e6dfccc8b2da72a9a71bf5b6ac3Kevin Enderby    CmdArgs.push_back("-dwarf-debug-producer");
35540234179282d59e6dfccc8b2da72a9a71bf5b6ac3Kevin Enderby    CmdArgs.push_back(Args.MakeArgString(getClangFullVersion()));
35558f0a403945b60a8a8a56a7721bb66f6b84ec129bEric Christopher  }
3556567003e572eed69cf1e8a04601076c8803355c7aKevin Enderby
3557567003e572eed69cf1e8a04601076c8803355c7aKevin Enderby  // Optionally embed the -cc1as level arguments into the debug info, for build
3558567003e572eed69cf1e8a04601076c8803355c7aKevin Enderby  // analysis.
3559567003e572eed69cf1e8a04601076c8803355c7aKevin Enderby  if (getToolChain().UseDwarfDebugFlags()) {
3560567003e572eed69cf1e8a04601076c8803355c7aKevin Enderby    ArgStringList OriginalArgs;
3561567003e572eed69cf1e8a04601076c8803355c7aKevin Enderby    for (ArgList::const_iterator it = Args.begin(),
3562567003e572eed69cf1e8a04601076c8803355c7aKevin Enderby           ie = Args.end(); it != ie; ++it)
3563567003e572eed69cf1e8a04601076c8803355c7aKevin Enderby      (*it)->render(Args, OriginalArgs);
3564567003e572eed69cf1e8a04601076c8803355c7aKevin Enderby
3565f7ccbad5d9949e7ddd1cbef43d482553b811e026Dylan Noblesmith    SmallString<256> Flags;
3566567003e572eed69cf1e8a04601076c8803355c7aKevin Enderby    const char *Exec = getToolChain().getDriver().getClangProgramPath();
3567567003e572eed69cf1e8a04601076c8803355c7aKevin Enderby    Flags += Exec;
3568567003e572eed69cf1e8a04601076c8803355c7aKevin Enderby    for (unsigned i = 0, e = OriginalArgs.size(); i != e; ++i) {
3569567003e572eed69cf1e8a04601076c8803355c7aKevin Enderby      Flags += " ";
3570567003e572eed69cf1e8a04601076c8803355c7aKevin Enderby      Flags += OriginalArgs[i];
3571567003e572eed69cf1e8a04601076c8803355c7aKevin Enderby    }
3572567003e572eed69cf1e8a04601076c8803355c7aKevin Enderby    CmdArgs.push_back("-dwarf-debug-flags");
3573567003e572eed69cf1e8a04601076c8803355c7aKevin Enderby    CmdArgs.push_back(Args.MakeArgString(Flags.str()));
3574567003e572eed69cf1e8a04601076c8803355c7aKevin Enderby  }
357520a9aa50f9a7d4b03f97bc67e96da1d605c309a2Daniel Dunbar
357620a9aa50f9a7d4b03f97bc67e96da1d605c309a2Daniel Dunbar  // FIXME: Add -static support, once we have it.
357720a9aa50f9a7d4b03f97bc67e96da1d605c309a2Daniel Dunbar
357820a9aa50f9a7d4b03f97bc67e96da1d605c309a2Daniel Dunbar  Args.AddAllArgValues(CmdArgs, options::OPT_Wa_COMMA,
357920a9aa50f9a7d4b03f97bc67e96da1d605c309a2Daniel Dunbar                       options::OPT_Xassembler);
35803df2325a0fd4b868b804aa1708beb3634402c22dDaniel Dunbar  Args.AddAllArgs(CmdArgs, options::OPT_mllvm);
358120a9aa50f9a7d4b03f97bc67e96da1d605c309a2Daniel Dunbar
358220a9aa50f9a7d4b03f97bc67e96da1d605c309a2Daniel Dunbar  assert(Output.isFilename() && "Unexpected lipo output.");
358320a9aa50f9a7d4b03f97bc67e96da1d605c309a2Daniel Dunbar  CmdArgs.push_back("-o");
358420a9aa50f9a7d4b03f97bc67e96da1d605c309a2Daniel Dunbar  CmdArgs.push_back(Output.getFilename());
358520a9aa50f9a7d4b03f97bc67e96da1d605c309a2Daniel Dunbar
35867c1e46533cae07216e2a67d5636a5afb44253155Daniel Dunbar  assert(Input.isFilename() && "Invalid input.");
35877c1e46533cae07216e2a67d5636a5afb44253155Daniel Dunbar  CmdArgs.push_back(Input.getFilename());
358820a9aa50f9a7d4b03f97bc67e96da1d605c309a2Daniel Dunbar
3589a001c1ce5fcb669624a5b8e50d0a629d673da901Daniel Dunbar  const char *Exec = getToolChain().getDriver().getClangProgramPath();
35902fe238ed293bd4bc27af9beb9fa151fad2146fa8Daniel Dunbar  C.addCommand(new Command(JA, *this, Exec, CmdArgs));
359120a9aa50f9a7d4b03f97bc67e96da1d605c309a2Daniel Dunbar}
359220a9aa50f9a7d4b03f97bc67e96da1d605c309a2Daniel Dunbar
3593b488c1dac8e53206f07103d794a62a3f5012c0f4Daniel Dunbarvoid gcc::Common::ConstructJob(Compilation &C, const JobAction &JA,
3594b488c1dac8e53206f07103d794a62a3f5012c0f4Daniel Dunbar                               const InputInfo &Output,
3595b488c1dac8e53206f07103d794a62a3f5012c0f4Daniel Dunbar                               const InputInfoList &Inputs,
35961d46033f760ba5fd266ce59fe391fac473f04f52Daniel Dunbar                               const ArgList &Args,
3597b488c1dac8e53206f07103d794a62a3f5012c0f4Daniel Dunbar                               const char *LinkingOutput) const {
3598ee788e70fcd0adf76103b17c78ac658d4ea30c9bDaniel Dunbar  const Driver &D = getToolChain().getDriver();
3599b488c1dac8e53206f07103d794a62a3f5012c0f4Daniel Dunbar  ArgStringList CmdArgs;
3600b488c1dac8e53206f07103d794a62a3f5012c0f4Daniel Dunbar
3601c21c485b4fb58ef5d55cf3e523263dd824a2ace4Daniel Dunbar  for (ArgList::const_iterator
36021d46033f760ba5fd266ce59fe391fac473f04f52Daniel Dunbar         it = Args.begin(), ie = Args.end(); it != ie; ++it) {
3603b488c1dac8e53206f07103d794a62a3f5012c0f4Daniel Dunbar    Arg *A = *it;
360491e06dab9335ed6b4474a74353549c708cf3d936Michael J. Spencer    if (forwardToGCC(A->getOption())) {
36052dffe2d9d631fefd79d4999f6ffe7ac0d70882b1Daniel Dunbar      // Don't forward any -g arguments to assembly steps.
36062dffe2d9d631fefd79d4999f6ffe7ac0d70882b1Daniel Dunbar      if (isa<AssembleJobAction>(JA) &&
36072dffe2d9d631fefd79d4999f6ffe7ac0d70882b1Daniel Dunbar          A->getOption().matches(options::OPT_g_Group))
36082dffe2d9d631fefd79d4999f6ffe7ac0d70882b1Daniel Dunbar        continue;
36092dffe2d9d631fefd79d4999f6ffe7ac0d70882b1Daniel Dunbar
36107587719c40ebf02bf11e5e66c30bd20e98edebc2Daniel Dunbar      // It is unfortunate that we have to claim here, as this means
36117587719c40ebf02bf11e5e66c30bd20e98edebc2Daniel Dunbar      // we will basically never report anything interesting for
36126ecc7a993f939c5255c36c7c0d965fb9c1543f2aDaniel Dunbar      // platforms using a generic gcc, even if we are just using gcc
36136ecc7a993f939c5255c36c7c0d965fb9c1543f2aDaniel Dunbar      // to get to the assembler.
36147587719c40ebf02bf11e5e66c30bd20e98edebc2Daniel Dunbar      A->claim();
36151d46033f760ba5fd266ce59fe391fac473f04f52Daniel Dunbar      A->render(Args, CmdArgs);
36167587719c40ebf02bf11e5e66c30bd20e98edebc2Daniel Dunbar    }
3617b488c1dac8e53206f07103d794a62a3f5012c0f4Daniel Dunbar  }
3618c21c485b4fb58ef5d55cf3e523263dd824a2ace4Daniel Dunbar
361982b51cce8cea6b6bb6175c406c2ab425c91d9dc8Daniel Dunbar  RenderExtraToolArgs(JA, CmdArgs);
3620b488c1dac8e53206f07103d794a62a3f5012c0f4Daniel Dunbar
3621b488c1dac8e53206f07103d794a62a3f5012c0f4Daniel Dunbar  // If using a driver driver, force the arch.
362264f7ad9328e877779ec63638f39de4e10d2ff276Rafael Espindola  llvm::Triple::ArchType Arch = getToolChain().getArch();
3623905c45f15a25598620d19160c139c6b785aeea89Bob Wilson  if (getToolChain().getTriple().isOSDarwin()) {
3624b488c1dac8e53206f07103d794a62a3f5012c0f4Daniel Dunbar    CmdArgs.push_back("-arch");
3625bf54a06f9b771c2a2730cc63eb89bce0522515b5Daniel Dunbar
3626bf54a06f9b771c2a2730cc63eb89bce0522515b5Daniel Dunbar    // FIXME: Remove these special cases.
362764f7ad9328e877779ec63638f39de4e10d2ff276Rafael Espindola    if (Arch == llvm::Triple::ppc)
36287cfe31a713d8fcfc2a1328e8fbd8efdeb0aec51bDaniel Dunbar      CmdArgs.push_back("ppc");
362964f7ad9328e877779ec63638f39de4e10d2ff276Rafael Espindola    else if (Arch == llvm::Triple::ppc64)
36307cfe31a713d8fcfc2a1328e8fbd8efdeb0aec51bDaniel Dunbar      CmdArgs.push_back("ppc64");
36317cfe31a713d8fcfc2a1328e8fbd8efdeb0aec51bDaniel Dunbar    else
363264f7ad9328e877779ec63638f39de4e10d2ff276Rafael Espindola      CmdArgs.push_back(Args.MakeArgString(getToolChain().getArchName()));
3633b488c1dac8e53206f07103d794a62a3f5012c0f4Daniel Dunbar  }
3634b488c1dac8e53206f07103d794a62a3f5012c0f4Daniel Dunbar
36356ecc7a993f939c5255c36c7c0d965fb9c1543f2aDaniel Dunbar  // Try to force gcc to match the tool chain we want, if we recognize
36366ecc7a993f939c5255c36c7c0d965fb9c1543f2aDaniel Dunbar  // the arch.
36377cfe31a713d8fcfc2a1328e8fbd8efdeb0aec51bDaniel Dunbar  //
36387cfe31a713d8fcfc2a1328e8fbd8efdeb0aec51bDaniel Dunbar  // FIXME: The triple class should directly provide the information we want
36397cfe31a713d8fcfc2a1328e8fbd8efdeb0aec51bDaniel Dunbar  // here.
364064f7ad9328e877779ec63638f39de4e10d2ff276Rafael Espindola  if (Arch == llvm::Triple::x86 || Arch == llvm::Triple::ppc)
36416ecc7a993f939c5255c36c7c0d965fb9c1543f2aDaniel Dunbar    CmdArgs.push_back("-m32");
364264f7ad9328e877779ec63638f39de4e10d2ff276Rafael Espindola  else if (Arch == llvm::Triple::x86_64 || Arch == llvm::Triple::x86_64)
36436ecc7a993f939c5255c36c7c0d965fb9c1543f2aDaniel Dunbar    CmdArgs.push_back("-m64");
36446ecc7a993f939c5255c36c7c0d965fb9c1543f2aDaniel Dunbar
36457c1e46533cae07216e2a67d5636a5afb44253155Daniel Dunbar  if (Output.isFilename()) {
3646b488c1dac8e53206f07103d794a62a3f5012c0f4Daniel Dunbar    CmdArgs.push_back("-o");
3647115a79277edababaf1b26e3654044ae983197679Daniel Dunbar    CmdArgs.push_back(Output.getFilename());
3648115a79277edababaf1b26e3654044ae983197679Daniel Dunbar  } else {
3649115a79277edababaf1b26e3654044ae983197679Daniel Dunbar    assert(Output.isNothing() && "Unexpected output");
3650b488c1dac8e53206f07103d794a62a3f5012c0f4Daniel Dunbar    CmdArgs.push_back("-fsyntax-only");
3651115a79277edababaf1b26e3654044ae983197679Daniel Dunbar  }
3652b488c1dac8e53206f07103d794a62a3f5012c0f4Daniel Dunbar
36539631939f82c0eaa6fb3936a0ce58a41adfbc9011Tony Linthicum  Args.AddAllArgValues(CmdArgs, options::OPT_Wa_COMMA,
36549631939f82c0eaa6fb3936a0ce58a41adfbc9011Tony Linthicum                       options::OPT_Xassembler);
3655b488c1dac8e53206f07103d794a62a3f5012c0f4Daniel Dunbar
3656b488c1dac8e53206f07103d794a62a3f5012c0f4Daniel Dunbar  // Only pass -x if gcc will understand it; otherwise hope gcc
3657b488c1dac8e53206f07103d794a62a3f5012c0f4Daniel Dunbar  // understands the suffix correctly. The main use case this would go
3658b488c1dac8e53206f07103d794a62a3f5012c0f4Daniel Dunbar  // wrong in is for linker inputs if they happened to have an odd
3659b488c1dac8e53206f07103d794a62a3f5012c0f4Daniel Dunbar  // suffix; really the only way to get this to happen is a command
3660b488c1dac8e53206f07103d794a62a3f5012c0f4Daniel Dunbar  // like '-x foobar a.c' which will treat a.c like a linker input.
3661b488c1dac8e53206f07103d794a62a3f5012c0f4Daniel Dunbar  //
3662b488c1dac8e53206f07103d794a62a3f5012c0f4Daniel Dunbar  // FIXME: For the linker case specifically, can we safely convert
3663b488c1dac8e53206f07103d794a62a3f5012c0f4Daniel Dunbar  // inputs into '-Wl,' options?
3664b488c1dac8e53206f07103d794a62a3f5012c0f4Daniel Dunbar  for (InputInfoList::const_iterator
3665b488c1dac8e53206f07103d794a62a3f5012c0f4Daniel Dunbar         it = Inputs.begin(), ie = Inputs.end(); it != ie; ++it) {
3666b488c1dac8e53206f07103d794a62a3f5012c0f4Daniel Dunbar    const InputInfo &II = *it;
3667a8304f67291b0182fb64f3afc621615288dd1d31Daniel Dunbar
36685915fbf310e171c4cd3c2af05e9de360c0fa988aDaniel Dunbar    // Don't try to pass LLVM or AST inputs to a generic gcc.
36696c6424bc0d3b5f080a97b5f6ef4a8d70c38e38f5Daniel Dunbar    if (II.getType() == types::TY_LLVM_IR || II.getType() == types::TY_LTO_IR ||
36706c6424bc0d3b5f080a97b5f6ef4a8d70c38e38f5Daniel Dunbar        II.getType() == types::TY_LLVM_BC || II.getType() == types::TY_LTO_BC)
36715f9e272e632e951b1efe824cd16acb4d96077930Chris Lattner      D.Diag(diag::err_drv_no_linker_llvm_support)
3672881376467c46c5c6cc16fa6790271c2c22e1d4f1Daniel Dunbar        << getToolChain().getTripleString();
36735915fbf310e171c4cd3c2af05e9de360c0fa988aDaniel Dunbar    else if (II.getType() == types::TY_AST)
36745f9e272e632e951b1efe824cd16acb4d96077930Chris Lattner      D.Diag(diag::err_drv_no_ast_support)
3675881376467c46c5c6cc16fa6790271c2c22e1d4f1Daniel Dunbar        << getToolChain().getTripleString();
3676a8304f67291b0182fb64f3afc621615288dd1d31Daniel Dunbar
3677b488c1dac8e53206f07103d794a62a3f5012c0f4Daniel Dunbar    if (types::canTypeBeUserSpecified(II.getType())) {
3678b488c1dac8e53206f07103d794a62a3f5012c0f4Daniel Dunbar      CmdArgs.push_back("-x");
3679b488c1dac8e53206f07103d794a62a3f5012c0f4Daniel Dunbar      CmdArgs.push_back(types::getTypeName(II.getType()));
3680b488c1dac8e53206f07103d794a62a3f5012c0f4Daniel Dunbar    }
3681b488c1dac8e53206f07103d794a62a3f5012c0f4Daniel Dunbar
36827c1e46533cae07216e2a67d5636a5afb44253155Daniel Dunbar    if (II.isFilename())
3683115a79277edababaf1b26e3654044ae983197679Daniel Dunbar      CmdArgs.push_back(II.getFilename());
368448f9994bdd9f7f1853782109595b1f80f50afcfaDaniel Dunbar    else {
368548f9994bdd9f7f1853782109595b1f80f50afcfaDaniel Dunbar      const Arg &A = II.getInputArg();
368648f9994bdd9f7f1853782109595b1f80f50afcfaDaniel Dunbar
368748f9994bdd9f7f1853782109595b1f80f50afcfaDaniel Dunbar      // Reverse translate some rewritten options.
368848f9994bdd9f7f1853782109595b1f80f50afcfaDaniel Dunbar      if (A.getOption().matches(options::OPT_Z_reserved_lib_stdcxx)) {
368948f9994bdd9f7f1853782109595b1f80f50afcfaDaniel Dunbar        CmdArgs.push_back("-lstdc++");
369048f9994bdd9f7f1853782109595b1f80f50afcfaDaniel Dunbar        continue;
369148f9994bdd9f7f1853782109595b1f80f50afcfaDaniel Dunbar      }
369248f9994bdd9f7f1853782109595b1f80f50afcfaDaniel Dunbar
3693115a79277edababaf1b26e3654044ae983197679Daniel Dunbar      // Don't render as input, we need gcc to do the translations.
369448f9994bdd9f7f1853782109595b1f80f50afcfaDaniel Dunbar      A.render(Args, CmdArgs);
369548f9994bdd9f7f1853782109595b1f80f50afcfaDaniel Dunbar    }
3696b488c1dac8e53206f07103d794a62a3f5012c0f4Daniel Dunbar  }
3697b488c1dac8e53206f07103d794a62a3f5012c0f4Daniel Dunbar
3698b8a3e8139b9fe513500c89bbcd9133415654a689Dylan Noblesmith  const std::string customGCCName = D.getCCCGenericGCCName();
3699b8a3e8139b9fe513500c89bbcd9133415654a689Dylan Noblesmith  const char *GCCName;
3700b8a3e8139b9fe513500c89bbcd9133415654a689Dylan Noblesmith  if (!customGCCName.empty())
3701b8a3e8139b9fe513500c89bbcd9133415654a689Dylan Noblesmith    GCCName = customGCCName.c_str();
3702b8a3e8139b9fe513500c89bbcd9133415654a689Dylan Noblesmith  else if (D.CCCIsCXX) {
3703b8a3e8139b9fe513500c89bbcd9133415654a689Dylan Noblesmith    GCCName = "g++";
3704b8a3e8139b9fe513500c89bbcd9133415654a689Dylan Noblesmith  } else
3705b8a3e8139b9fe513500c89bbcd9133415654a689Dylan Noblesmith    GCCName = "gcc";
3706b8a3e8139b9fe513500c89bbcd9133415654a689Dylan Noblesmith
3707c21c485b4fb58ef5d55cf3e523263dd824a2ace4Daniel Dunbar  const char *Exec =
37084a7e88978cf646ad10d654020cb00b3877069210Daniel Dunbar    Args.MakeArgString(getToolChain().GetProgramPath(GCCName));
37092fe238ed293bd4bc27af9beb9fa151fad2146fa8Daniel Dunbar  C.addCommand(new Command(JA, *this, Exec, CmdArgs));
371047ac7d27c44bd64a7d0fc03d4babc196cf2b8230Daniel Dunbar}
371147ac7d27c44bd64a7d0fc03d4babc196cf2b8230Daniel Dunbar
371282b51cce8cea6b6bb6175c406c2ab425c91d9dc8Daniel Dunbarvoid gcc::Preprocess::RenderExtraToolArgs(const JobAction &JA,
371382b51cce8cea6b6bb6175c406c2ab425c91d9dc8Daniel Dunbar                                          ArgStringList &CmdArgs) const {
3714b488c1dac8e53206f07103d794a62a3f5012c0f4Daniel Dunbar  CmdArgs.push_back("-E");
371547ac7d27c44bd64a7d0fc03d4babc196cf2b8230Daniel Dunbar}
371647ac7d27c44bd64a7d0fc03d4babc196cf2b8230Daniel Dunbar
371782b51cce8cea6b6bb6175c406c2ab425c91d9dc8Daniel Dunbarvoid gcc::Precompile::RenderExtraToolArgs(const JobAction &JA,
371882b51cce8cea6b6bb6175c406c2ab425c91d9dc8Daniel Dunbar                                          ArgStringList &CmdArgs) const {
3719b488c1dac8e53206f07103d794a62a3f5012c0f4Daniel Dunbar  // The type is good enough.
372047ac7d27c44bd64a7d0fc03d4babc196cf2b8230Daniel Dunbar}
372147ac7d27c44bd64a7d0fc03d4babc196cf2b8230Daniel Dunbar
372282b51cce8cea6b6bb6175c406c2ab425c91d9dc8Daniel Dunbarvoid gcc::Compile::RenderExtraToolArgs(const JobAction &JA,
372382b51cce8cea6b6bb6175c406c2ab425c91d9dc8Daniel Dunbar                                       ArgStringList &CmdArgs) const {
372464952508c2b0c8bffb45c8b410f0af3d2457f59bDaniel Dunbar  const Driver &D = getToolChain().getDriver();
372564952508c2b0c8bffb45c8b410f0af3d2457f59bDaniel Dunbar
372682b51cce8cea6b6bb6175c406c2ab425c91d9dc8Daniel Dunbar  // If -flto, etc. are present then make sure not to force assembly output.
37276c6424bc0d3b5f080a97b5f6ef4a8d70c38e38f5Daniel Dunbar  if (JA.getType() == types::TY_LLVM_IR || JA.getType() == types::TY_LTO_IR ||
37286c6424bc0d3b5f080a97b5f6ef4a8d70c38e38f5Daniel Dunbar      JA.getType() == types::TY_LLVM_BC || JA.getType() == types::TY_LTO_BC)
372982b51cce8cea6b6bb6175c406c2ab425c91d9dc8Daniel Dunbar    CmdArgs.push_back("-c");
373064952508c2b0c8bffb45c8b410f0af3d2457f59bDaniel Dunbar  else {
373164952508c2b0c8bffb45c8b410f0af3d2457f59bDaniel Dunbar    if (JA.getType() != types::TY_PP_Asm)
37325f9e272e632e951b1efe824cd16acb4d96077930Chris Lattner      D.Diag(diag::err_drv_invalid_gcc_output_type)
373364952508c2b0c8bffb45c8b410f0af3d2457f59bDaniel Dunbar        << getTypeName(JA.getType());
373420249a1af2e462dcafdd6a350f1c7967b264ff25Michael J. Spencer
373582b51cce8cea6b6bb6175c406c2ab425c91d9dc8Daniel Dunbar    CmdArgs.push_back("-S");
373664952508c2b0c8bffb45c8b410f0af3d2457f59bDaniel Dunbar  }
373747ac7d27c44bd64a7d0fc03d4babc196cf2b8230Daniel Dunbar}
373847ac7d27c44bd64a7d0fc03d4babc196cf2b8230Daniel Dunbar
373982b51cce8cea6b6bb6175c406c2ab425c91d9dc8Daniel Dunbarvoid gcc::Assemble::RenderExtraToolArgs(const JobAction &JA,
374082b51cce8cea6b6bb6175c406c2ab425c91d9dc8Daniel Dunbar                                        ArgStringList &CmdArgs) const {
3741b488c1dac8e53206f07103d794a62a3f5012c0f4Daniel Dunbar  CmdArgs.push_back("-c");
3742b488c1dac8e53206f07103d794a62a3f5012c0f4Daniel Dunbar}
374347ac7d27c44bd64a7d0fc03d4babc196cf2b8230Daniel Dunbar
374482b51cce8cea6b6bb6175c406c2ab425c91d9dc8Daniel Dunbarvoid gcc::Link::RenderExtraToolArgs(const JobAction &JA,
374582b51cce8cea6b6bb6175c406c2ab425c91d9dc8Daniel Dunbar                                    ArgStringList &CmdArgs) const {
3746b488c1dac8e53206f07103d794a62a3f5012c0f4Daniel Dunbar  // The types are (hopefully) good enough.
374747ac7d27c44bd64a7d0fc03d4babc196cf2b8230Daniel Dunbar}
3748b488c1dac8e53206f07103d794a62a3f5012c0f4Daniel Dunbar
37499631939f82c0eaa6fb3936a0ce58a41adfbc9011Tony Linthicum// Hexagon tools start.
37509631939f82c0eaa6fb3936a0ce58a41adfbc9011Tony Linthicumvoid hexagon::Assemble::RenderExtraToolArgs(const JobAction &JA,
37519631939f82c0eaa6fb3936a0ce58a41adfbc9011Tony Linthicum                                        ArgStringList &CmdArgs) const {
37529631939f82c0eaa6fb3936a0ce58a41adfbc9011Tony Linthicum
37539631939f82c0eaa6fb3936a0ce58a41adfbc9011Tony Linthicum}
37549631939f82c0eaa6fb3936a0ce58a41adfbc9011Tony Linthicumvoid hexagon::Assemble::ConstructJob(Compilation &C, const JobAction &JA,
37559631939f82c0eaa6fb3936a0ce58a41adfbc9011Tony Linthicum                               const InputInfo &Output,
37569631939f82c0eaa6fb3936a0ce58a41adfbc9011Tony Linthicum                               const InputInfoList &Inputs,
37579631939f82c0eaa6fb3936a0ce58a41adfbc9011Tony Linthicum                               const ArgList &Args,
37589631939f82c0eaa6fb3936a0ce58a41adfbc9011Tony Linthicum                               const char *LinkingOutput) const {
37599631939f82c0eaa6fb3936a0ce58a41adfbc9011Tony Linthicum
37609631939f82c0eaa6fb3936a0ce58a41adfbc9011Tony Linthicum  const Driver &D = getToolChain().getDriver();
37619631939f82c0eaa6fb3936a0ce58a41adfbc9011Tony Linthicum  ArgStringList CmdArgs;
37629631939f82c0eaa6fb3936a0ce58a41adfbc9011Tony Linthicum
37639631939f82c0eaa6fb3936a0ce58a41adfbc9011Tony Linthicum  std::string MarchString = "-march=";
37646781415fa6d98aed548e84a70f1cd3ec31bba7d3Matthew Curtis  MarchString += toolchains::Hexagon_TC::GetTargetCPU(Args);
37659631939f82c0eaa6fb3936a0ce58a41adfbc9011Tony Linthicum  CmdArgs.push_back(Args.MakeArgString(MarchString));
37669631939f82c0eaa6fb3936a0ce58a41adfbc9011Tony Linthicum
37679631939f82c0eaa6fb3936a0ce58a41adfbc9011Tony Linthicum  RenderExtraToolArgs(JA, CmdArgs);
37689631939f82c0eaa6fb3936a0ce58a41adfbc9011Tony Linthicum
37699631939f82c0eaa6fb3936a0ce58a41adfbc9011Tony Linthicum  if (Output.isFilename()) {
37709631939f82c0eaa6fb3936a0ce58a41adfbc9011Tony Linthicum    CmdArgs.push_back("-o");
37719631939f82c0eaa6fb3936a0ce58a41adfbc9011Tony Linthicum    CmdArgs.push_back(Output.getFilename());
37729631939f82c0eaa6fb3936a0ce58a41adfbc9011Tony Linthicum  } else {
37739631939f82c0eaa6fb3936a0ce58a41adfbc9011Tony Linthicum    assert(Output.isNothing() && "Unexpected output");
37749631939f82c0eaa6fb3936a0ce58a41adfbc9011Tony Linthicum    CmdArgs.push_back("-fsyntax-only");
37759631939f82c0eaa6fb3936a0ce58a41adfbc9011Tony Linthicum  }
37769631939f82c0eaa6fb3936a0ce58a41adfbc9011Tony Linthicum
377733c95f1178999ea06837769f90be8d7b8d57bb4dMatthew Curtis  std::string SmallDataThreshold = GetHexagonSmallDataThresholdValue(Args);
377833c95f1178999ea06837769f90be8d7b8d57bb4dMatthew Curtis  if (!SmallDataThreshold.empty())
377933c95f1178999ea06837769f90be8d7b8d57bb4dMatthew Curtis    CmdArgs.push_back(
378033c95f1178999ea06837769f90be8d7b8d57bb4dMatthew Curtis      Args.MakeArgString(std::string("-G") + SmallDataThreshold));
37819631939f82c0eaa6fb3936a0ce58a41adfbc9011Tony Linthicum
37823d8d4223813506df2f1b71cbb2f4a175faf85e6aMatthew Curtis  Args.AddAllArgs(CmdArgs, options::OPT_g_Group);
37833d8d4223813506df2f1b71cbb2f4a175faf85e6aMatthew Curtis  Args.AddAllArgValues(CmdArgs, options::OPT_Wa_COMMA,
37843d8d4223813506df2f1b71cbb2f4a175faf85e6aMatthew Curtis                       options::OPT_Xassembler);
37853d8d4223813506df2f1b71cbb2f4a175faf85e6aMatthew Curtis
37869631939f82c0eaa6fb3936a0ce58a41adfbc9011Tony Linthicum  // Only pass -x if gcc will understand it; otherwise hope gcc
37879631939f82c0eaa6fb3936a0ce58a41adfbc9011Tony Linthicum  // understands the suffix correctly. The main use case this would go
37889631939f82c0eaa6fb3936a0ce58a41adfbc9011Tony Linthicum  // wrong in is for linker inputs if they happened to have an odd
37899631939f82c0eaa6fb3936a0ce58a41adfbc9011Tony Linthicum  // suffix; really the only way to get this to happen is a command
37909631939f82c0eaa6fb3936a0ce58a41adfbc9011Tony Linthicum  // like '-x foobar a.c' which will treat a.c like a linker input.
37919631939f82c0eaa6fb3936a0ce58a41adfbc9011Tony Linthicum  //
37929631939f82c0eaa6fb3936a0ce58a41adfbc9011Tony Linthicum  // FIXME: For the linker case specifically, can we safely convert
37939631939f82c0eaa6fb3936a0ce58a41adfbc9011Tony Linthicum  // inputs into '-Wl,' options?
37949631939f82c0eaa6fb3936a0ce58a41adfbc9011Tony Linthicum  for (InputInfoList::const_iterator
37959631939f82c0eaa6fb3936a0ce58a41adfbc9011Tony Linthicum         it = Inputs.begin(), ie = Inputs.end(); it != ie; ++it) {
37969631939f82c0eaa6fb3936a0ce58a41adfbc9011Tony Linthicum    const InputInfo &II = *it;
37979631939f82c0eaa6fb3936a0ce58a41adfbc9011Tony Linthicum
37989631939f82c0eaa6fb3936a0ce58a41adfbc9011Tony Linthicum    // Don't try to pass LLVM or AST inputs to a generic gcc.
37999631939f82c0eaa6fb3936a0ce58a41adfbc9011Tony Linthicum    if (II.getType() == types::TY_LLVM_IR || II.getType() == types::TY_LTO_IR ||
38009631939f82c0eaa6fb3936a0ce58a41adfbc9011Tony Linthicum        II.getType() == types::TY_LLVM_BC || II.getType() == types::TY_LTO_BC)
38019631939f82c0eaa6fb3936a0ce58a41adfbc9011Tony Linthicum      D.Diag(clang::diag::err_drv_no_linker_llvm_support)
38029631939f82c0eaa6fb3936a0ce58a41adfbc9011Tony Linthicum        << getToolChain().getTripleString();
38039631939f82c0eaa6fb3936a0ce58a41adfbc9011Tony Linthicum    else if (II.getType() == types::TY_AST)
38049631939f82c0eaa6fb3936a0ce58a41adfbc9011Tony Linthicum      D.Diag(clang::diag::err_drv_no_ast_support)
38059631939f82c0eaa6fb3936a0ce58a41adfbc9011Tony Linthicum        << getToolChain().getTripleString();
38069631939f82c0eaa6fb3936a0ce58a41adfbc9011Tony Linthicum
38079631939f82c0eaa6fb3936a0ce58a41adfbc9011Tony Linthicum    if (II.isFilename())
38089631939f82c0eaa6fb3936a0ce58a41adfbc9011Tony Linthicum      CmdArgs.push_back(II.getFilename());
38099631939f82c0eaa6fb3936a0ce58a41adfbc9011Tony Linthicum    else
38109631939f82c0eaa6fb3936a0ce58a41adfbc9011Tony Linthicum      // Don't render as input, we need gcc to do the translations. FIXME: Pranav: What is this ?
38119631939f82c0eaa6fb3936a0ce58a41adfbc9011Tony Linthicum      II.getInputArg().render(Args, CmdArgs);
38129631939f82c0eaa6fb3936a0ce58a41adfbc9011Tony Linthicum  }
38139631939f82c0eaa6fb3936a0ce58a41adfbc9011Tony Linthicum
38149631939f82c0eaa6fb3936a0ce58a41adfbc9011Tony Linthicum  const char *GCCName = "hexagon-as";
38159631939f82c0eaa6fb3936a0ce58a41adfbc9011Tony Linthicum  const char *Exec =
38169631939f82c0eaa6fb3936a0ce58a41adfbc9011Tony Linthicum    Args.MakeArgString(getToolChain().GetProgramPath(GCCName));
38179631939f82c0eaa6fb3936a0ce58a41adfbc9011Tony Linthicum  C.addCommand(new Command(JA, *this, Exec, CmdArgs));
38189631939f82c0eaa6fb3936a0ce58a41adfbc9011Tony Linthicum
38199631939f82c0eaa6fb3936a0ce58a41adfbc9011Tony Linthicum}
38209631939f82c0eaa6fb3936a0ce58a41adfbc9011Tony Linthicumvoid hexagon::Link::RenderExtraToolArgs(const JobAction &JA,
38219631939f82c0eaa6fb3936a0ce58a41adfbc9011Tony Linthicum                                    ArgStringList &CmdArgs) const {
38229631939f82c0eaa6fb3936a0ce58a41adfbc9011Tony Linthicum  // The types are (hopefully) good enough.
38239631939f82c0eaa6fb3936a0ce58a41adfbc9011Tony Linthicum}
38249631939f82c0eaa6fb3936a0ce58a41adfbc9011Tony Linthicum
38259631939f82c0eaa6fb3936a0ce58a41adfbc9011Tony Linthicumvoid hexagon::Link::ConstructJob(Compilation &C, const JobAction &JA,
38269631939f82c0eaa6fb3936a0ce58a41adfbc9011Tony Linthicum                               const InputInfo &Output,
38279631939f82c0eaa6fb3936a0ce58a41adfbc9011Tony Linthicum                               const InputInfoList &Inputs,
38289631939f82c0eaa6fb3936a0ce58a41adfbc9011Tony Linthicum                               const ArgList &Args,
38299631939f82c0eaa6fb3936a0ce58a41adfbc9011Tony Linthicum                               const char *LinkingOutput) const {
38309631939f82c0eaa6fb3936a0ce58a41adfbc9011Tony Linthicum
38315fdf350e39c6e260602dbbd709101a9bb55e75f1Matthew Curtis  const toolchains::Hexagon_TC& ToolChain =
38325fdf350e39c6e260602dbbd709101a9bb55e75f1Matthew Curtis    static_cast<const toolchains::Hexagon_TC&>(getToolChain());
38335fdf350e39c6e260602dbbd709101a9bb55e75f1Matthew Curtis  const Driver &D = ToolChain.getDriver();
38345fdf350e39c6e260602dbbd709101a9bb55e75f1Matthew Curtis
38359631939f82c0eaa6fb3936a0ce58a41adfbc9011Tony Linthicum  ArgStringList CmdArgs;
38369631939f82c0eaa6fb3936a0ce58a41adfbc9011Tony Linthicum
38375fdf350e39c6e260602dbbd709101a9bb55e75f1Matthew Curtis  //----------------------------------------------------------------------------
38385fdf350e39c6e260602dbbd709101a9bb55e75f1Matthew Curtis  //
38395fdf350e39c6e260602dbbd709101a9bb55e75f1Matthew Curtis  //----------------------------------------------------------------------------
38405fdf350e39c6e260602dbbd709101a9bb55e75f1Matthew Curtis  bool hasStaticArg = Args.hasArg(options::OPT_static);
38415fdf350e39c6e260602dbbd709101a9bb55e75f1Matthew Curtis  bool buildingLib = Args.hasArg(options::OPT_shared);
384233c95f1178999ea06837769f90be8d7b8d57bb4dMatthew Curtis  bool buildPIE = Args.hasArg(options::OPT_pie);
38435fdf350e39c6e260602dbbd709101a9bb55e75f1Matthew Curtis  bool incStdLib = !Args.hasArg(options::OPT_nostdlib);
38445fdf350e39c6e260602dbbd709101a9bb55e75f1Matthew Curtis  bool incStartFiles = !Args.hasArg(options::OPT_nostartfiles);
38455fdf350e39c6e260602dbbd709101a9bb55e75f1Matthew Curtis  bool incDefLibs = !Args.hasArg(options::OPT_nodefaultlibs);
38465fdf350e39c6e260602dbbd709101a9bb55e75f1Matthew Curtis  bool useShared = buildingLib && !hasStaticArg;
38475fdf350e39c6e260602dbbd709101a9bb55e75f1Matthew Curtis
38485fdf350e39c6e260602dbbd709101a9bb55e75f1Matthew Curtis  //----------------------------------------------------------------------------
38495fdf350e39c6e260602dbbd709101a9bb55e75f1Matthew Curtis  // Silence warnings for various options
38505fdf350e39c6e260602dbbd709101a9bb55e75f1Matthew Curtis  //----------------------------------------------------------------------------
38519631939f82c0eaa6fb3936a0ce58a41adfbc9011Tony Linthicum
38525fdf350e39c6e260602dbbd709101a9bb55e75f1Matthew Curtis  Args.ClaimAllArgs(options::OPT_g_Group);
38535fdf350e39c6e260602dbbd709101a9bb55e75f1Matthew Curtis  Args.ClaimAllArgs(options::OPT_emit_llvm);
38545fdf350e39c6e260602dbbd709101a9bb55e75f1Matthew Curtis  Args.ClaimAllArgs(options::OPT_w); // Other warning options are already
38555fdf350e39c6e260602dbbd709101a9bb55e75f1Matthew Curtis                                     // handled somewhere else.
38565fdf350e39c6e260602dbbd709101a9bb55e75f1Matthew Curtis  Args.ClaimAllArgs(options::OPT_static_libgcc);
38579631939f82c0eaa6fb3936a0ce58a41adfbc9011Tony Linthicum
38585fdf350e39c6e260602dbbd709101a9bb55e75f1Matthew Curtis  //----------------------------------------------------------------------------
38595fdf350e39c6e260602dbbd709101a9bb55e75f1Matthew Curtis  //
38605fdf350e39c6e260602dbbd709101a9bb55e75f1Matthew Curtis  //----------------------------------------------------------------------------
38615fdf350e39c6e260602dbbd709101a9bb55e75f1Matthew Curtis  for (std::vector<std::string>::const_iterator i = ToolChain.ExtraOpts.begin(),
38625fdf350e39c6e260602dbbd709101a9bb55e75f1Matthew Curtis         e = ToolChain.ExtraOpts.end();
38635fdf350e39c6e260602dbbd709101a9bb55e75f1Matthew Curtis       i != e; ++i)
38645fdf350e39c6e260602dbbd709101a9bb55e75f1Matthew Curtis    CmdArgs.push_back(i->c_str());
38659631939f82c0eaa6fb3936a0ce58a41adfbc9011Tony Linthicum
38666781415fa6d98aed548e84a70f1cd3ec31bba7d3Matthew Curtis  std::string MarchString = toolchains::Hexagon_TC::GetTargetCPU(Args);
38676781415fa6d98aed548e84a70f1cd3ec31bba7d3Matthew Curtis  CmdArgs.push_back(Args.MakeArgString("-m" + MarchString));
386843115d4904431917ef6852ee089a8520b9940ba5Sebastian Pop
38695fdf350e39c6e260602dbbd709101a9bb55e75f1Matthew Curtis  if (buildingLib) {
38705fdf350e39c6e260602dbbd709101a9bb55e75f1Matthew Curtis    CmdArgs.push_back("-shared");
38715fdf350e39c6e260602dbbd709101a9bb55e75f1Matthew Curtis    CmdArgs.push_back("-call_shared"); // should be the default, but doing as
38725fdf350e39c6e260602dbbd709101a9bb55e75f1Matthew Curtis                                       // hexagon-gcc does
38735fdf350e39c6e260602dbbd709101a9bb55e75f1Matthew Curtis  }
38749631939f82c0eaa6fb3936a0ce58a41adfbc9011Tony Linthicum
38755fdf350e39c6e260602dbbd709101a9bb55e75f1Matthew Curtis  if (hasStaticArg)
38765fdf350e39c6e260602dbbd709101a9bb55e75f1Matthew Curtis    CmdArgs.push_back("-static");
38779631939f82c0eaa6fb3936a0ce58a41adfbc9011Tony Linthicum
387833c95f1178999ea06837769f90be8d7b8d57bb4dMatthew Curtis  if (buildPIE && !buildingLib)
387933c95f1178999ea06837769f90be8d7b8d57bb4dMatthew Curtis    CmdArgs.push_back("-pie");
388033c95f1178999ea06837769f90be8d7b8d57bb4dMatthew Curtis
388133c95f1178999ea06837769f90be8d7b8d57bb4dMatthew Curtis  std::string SmallDataThreshold = GetHexagonSmallDataThresholdValue(Args);
388233c95f1178999ea06837769f90be8d7b8d57bb4dMatthew Curtis  if (!SmallDataThreshold.empty()) {
388333c95f1178999ea06837769f90be8d7b8d57bb4dMatthew Curtis    CmdArgs.push_back(
388433c95f1178999ea06837769f90be8d7b8d57bb4dMatthew Curtis      Args.MakeArgString(std::string("-G") + SmallDataThreshold));
388533c95f1178999ea06837769f90be8d7b8d57bb4dMatthew Curtis  }
388633c95f1178999ea06837769f90be8d7b8d57bb4dMatthew Curtis
38875fdf350e39c6e260602dbbd709101a9bb55e75f1Matthew Curtis  //----------------------------------------------------------------------------
38885fdf350e39c6e260602dbbd709101a9bb55e75f1Matthew Curtis  //
38895fdf350e39c6e260602dbbd709101a9bb55e75f1Matthew Curtis  //----------------------------------------------------------------------------
38905fdf350e39c6e260602dbbd709101a9bb55e75f1Matthew Curtis  CmdArgs.push_back("-o");
38915fdf350e39c6e260602dbbd709101a9bb55e75f1Matthew Curtis  CmdArgs.push_back(Output.getFilename());
38925fdf350e39c6e260602dbbd709101a9bb55e75f1Matthew Curtis
38935fdf350e39c6e260602dbbd709101a9bb55e75f1Matthew Curtis  const std::string MarchSuffix = "/" + MarchString;
38945fdf350e39c6e260602dbbd709101a9bb55e75f1Matthew Curtis  const std::string G0Suffix = "/G0";
38955fdf350e39c6e260602dbbd709101a9bb55e75f1Matthew Curtis  const std::string MarchG0Suffix = MarchSuffix + G0Suffix;
38965fdf350e39c6e260602dbbd709101a9bb55e75f1Matthew Curtis  const std::string RootDir = toolchains::Hexagon_TC::GetGnuDir(D.InstalledDir)
38975fdf350e39c6e260602dbbd709101a9bb55e75f1Matthew Curtis                              + "/";
38985fdf350e39c6e260602dbbd709101a9bb55e75f1Matthew Curtis  const std::string StartFilesDir = RootDir
38995fdf350e39c6e260602dbbd709101a9bb55e75f1Matthew Curtis                                    + "hexagon/lib"
39005fdf350e39c6e260602dbbd709101a9bb55e75f1Matthew Curtis                                    + (buildingLib
39015fdf350e39c6e260602dbbd709101a9bb55e75f1Matthew Curtis                                       ? MarchG0Suffix : MarchSuffix);
39025fdf350e39c6e260602dbbd709101a9bb55e75f1Matthew Curtis
39035fdf350e39c6e260602dbbd709101a9bb55e75f1Matthew Curtis  //----------------------------------------------------------------------------
39045fdf350e39c6e260602dbbd709101a9bb55e75f1Matthew Curtis  // moslib
39055fdf350e39c6e260602dbbd709101a9bb55e75f1Matthew Curtis  //----------------------------------------------------------------------------
39065fdf350e39c6e260602dbbd709101a9bb55e75f1Matthew Curtis  std::vector<std::string> oslibs;
39075fdf350e39c6e260602dbbd709101a9bb55e75f1Matthew Curtis  bool hasStandalone= false;
39085fdf350e39c6e260602dbbd709101a9bb55e75f1Matthew Curtis
39095fdf350e39c6e260602dbbd709101a9bb55e75f1Matthew Curtis  for (arg_iterator it = Args.filtered_begin(options::OPT_moslib_EQ),
39105fdf350e39c6e260602dbbd709101a9bb55e75f1Matthew Curtis         ie = Args.filtered_end(); it != ie; ++it) {
39115fdf350e39c6e260602dbbd709101a9bb55e75f1Matthew Curtis    (*it)->claim();
39125fdf350e39c6e260602dbbd709101a9bb55e75f1Matthew Curtis    oslibs.push_back((*it)->getValue());
39135fdf350e39c6e260602dbbd709101a9bb55e75f1Matthew Curtis    hasStandalone = hasStandalone || (oslibs.back() == "standalone");
39145fdf350e39c6e260602dbbd709101a9bb55e75f1Matthew Curtis  }
39155fdf350e39c6e260602dbbd709101a9bb55e75f1Matthew Curtis  if (oslibs.empty()) {
39165fdf350e39c6e260602dbbd709101a9bb55e75f1Matthew Curtis    oslibs.push_back("standalone");
39175fdf350e39c6e260602dbbd709101a9bb55e75f1Matthew Curtis    hasStandalone = true;
39189631939f82c0eaa6fb3936a0ce58a41adfbc9011Tony Linthicum  }
39199631939f82c0eaa6fb3936a0ce58a41adfbc9011Tony Linthicum
39205fdf350e39c6e260602dbbd709101a9bb55e75f1Matthew Curtis  //----------------------------------------------------------------------------
39215fdf350e39c6e260602dbbd709101a9bb55e75f1Matthew Curtis  // Start Files
39225fdf350e39c6e260602dbbd709101a9bb55e75f1Matthew Curtis  //----------------------------------------------------------------------------
39235fdf350e39c6e260602dbbd709101a9bb55e75f1Matthew Curtis  if (incStdLib && incStartFiles) {
39249631939f82c0eaa6fb3936a0ce58a41adfbc9011Tony Linthicum
39255fdf350e39c6e260602dbbd709101a9bb55e75f1Matthew Curtis    if (!buildingLib) {
39265fdf350e39c6e260602dbbd709101a9bb55e75f1Matthew Curtis      if (hasStandalone) {
39275fdf350e39c6e260602dbbd709101a9bb55e75f1Matthew Curtis        CmdArgs.push_back(
39285fdf350e39c6e260602dbbd709101a9bb55e75f1Matthew Curtis          Args.MakeArgString(StartFilesDir + "/crt0_standalone.o"));
39295fdf350e39c6e260602dbbd709101a9bb55e75f1Matthew Curtis      }
39305fdf350e39c6e260602dbbd709101a9bb55e75f1Matthew Curtis      CmdArgs.push_back(Args.MakeArgString(StartFilesDir + "/crt0.o"));
39315fdf350e39c6e260602dbbd709101a9bb55e75f1Matthew Curtis    }
39325fdf350e39c6e260602dbbd709101a9bb55e75f1Matthew Curtis    std::string initObj = useShared ? "/initS.o" : "/init.o";
39335fdf350e39c6e260602dbbd709101a9bb55e75f1Matthew Curtis    CmdArgs.push_back(Args.MakeArgString(StartFilesDir + initObj));
39345fdf350e39c6e260602dbbd709101a9bb55e75f1Matthew Curtis  }
39355fdf350e39c6e260602dbbd709101a9bb55e75f1Matthew Curtis
39365fdf350e39c6e260602dbbd709101a9bb55e75f1Matthew Curtis  //----------------------------------------------------------------------------
39375fdf350e39c6e260602dbbd709101a9bb55e75f1Matthew Curtis  // Library Search Paths
39385fdf350e39c6e260602dbbd709101a9bb55e75f1Matthew Curtis  //----------------------------------------------------------------------------
39395fdf350e39c6e260602dbbd709101a9bb55e75f1Matthew Curtis  const ToolChain::path_list &LibPaths = ToolChain.getFilePaths();
39405fdf350e39c6e260602dbbd709101a9bb55e75f1Matthew Curtis  for (ToolChain::path_list::const_iterator
39415fdf350e39c6e260602dbbd709101a9bb55e75f1Matthew Curtis         i = LibPaths.begin(),
39425fdf350e39c6e260602dbbd709101a9bb55e75f1Matthew Curtis         e = LibPaths.end();
39435fdf350e39c6e260602dbbd709101a9bb55e75f1Matthew Curtis       i != e;
39445fdf350e39c6e260602dbbd709101a9bb55e75f1Matthew Curtis       ++i)
39455fdf350e39c6e260602dbbd709101a9bb55e75f1Matthew Curtis    CmdArgs.push_back(Args.MakeArgString(StringRef("-L") + *i));
39465fdf350e39c6e260602dbbd709101a9bb55e75f1Matthew Curtis
39475fdf350e39c6e260602dbbd709101a9bb55e75f1Matthew Curtis  //----------------------------------------------------------------------------
39485fdf350e39c6e260602dbbd709101a9bb55e75f1Matthew Curtis  //
39495fdf350e39c6e260602dbbd709101a9bb55e75f1Matthew Curtis  //----------------------------------------------------------------------------
39505fdf350e39c6e260602dbbd709101a9bb55e75f1Matthew Curtis  Args.AddAllArgs(CmdArgs, options::OPT_T_Group);
39515fdf350e39c6e260602dbbd709101a9bb55e75f1Matthew Curtis  Args.AddAllArgs(CmdArgs, options::OPT_e);
39525fdf350e39c6e260602dbbd709101a9bb55e75f1Matthew Curtis  Args.AddAllArgs(CmdArgs, options::OPT_s);
39535fdf350e39c6e260602dbbd709101a9bb55e75f1Matthew Curtis  Args.AddAllArgs(CmdArgs, options::OPT_t);
39545fdf350e39c6e260602dbbd709101a9bb55e75f1Matthew Curtis  Args.AddAllArgs(CmdArgs, options::OPT_u_Group);
39555fdf350e39c6e260602dbbd709101a9bb55e75f1Matthew Curtis
39565fdf350e39c6e260602dbbd709101a9bb55e75f1Matthew Curtis  AddLinkerInputs(ToolChain, Inputs, Args, CmdArgs);
39575fdf350e39c6e260602dbbd709101a9bb55e75f1Matthew Curtis
39585fdf350e39c6e260602dbbd709101a9bb55e75f1Matthew Curtis  //----------------------------------------------------------------------------
39595fdf350e39c6e260602dbbd709101a9bb55e75f1Matthew Curtis  // Libraries
39605fdf350e39c6e260602dbbd709101a9bb55e75f1Matthew Curtis  //----------------------------------------------------------------------------
39615fdf350e39c6e260602dbbd709101a9bb55e75f1Matthew Curtis  if (incStdLib && incDefLibs) {
39625fdf350e39c6e260602dbbd709101a9bb55e75f1Matthew Curtis    if (D.CCCIsCXX) {
39635fdf350e39c6e260602dbbd709101a9bb55e75f1Matthew Curtis      ToolChain.AddCXXStdlibLibArgs(Args, CmdArgs);
39645fdf350e39c6e260602dbbd709101a9bb55e75f1Matthew Curtis      CmdArgs.push_back("-lm");
39655fdf350e39c6e260602dbbd709101a9bb55e75f1Matthew Curtis    }
39669631939f82c0eaa6fb3936a0ce58a41adfbc9011Tony Linthicum
39675fdf350e39c6e260602dbbd709101a9bb55e75f1Matthew Curtis    CmdArgs.push_back("--start-group");
39685fdf350e39c6e260602dbbd709101a9bb55e75f1Matthew Curtis
39695fdf350e39c6e260602dbbd709101a9bb55e75f1Matthew Curtis    if (!buildingLib) {
39705fdf350e39c6e260602dbbd709101a9bb55e75f1Matthew Curtis      for(std::vector<std::string>::iterator i = oslibs.begin(),
39715fdf350e39c6e260602dbbd709101a9bb55e75f1Matthew Curtis            e = oslibs.end(); i != e; ++i)
39725fdf350e39c6e260602dbbd709101a9bb55e75f1Matthew Curtis        CmdArgs.push_back(Args.MakeArgString("-l" + *i));
39735fdf350e39c6e260602dbbd709101a9bb55e75f1Matthew Curtis      CmdArgs.push_back("-lc");
39745fdf350e39c6e260602dbbd709101a9bb55e75f1Matthew Curtis    }
39755fdf350e39c6e260602dbbd709101a9bb55e75f1Matthew Curtis    CmdArgs.push_back("-lgcc");
39765fdf350e39c6e260602dbbd709101a9bb55e75f1Matthew Curtis
39775fdf350e39c6e260602dbbd709101a9bb55e75f1Matthew Curtis    CmdArgs.push_back("--end-group");
39785fdf350e39c6e260602dbbd709101a9bb55e75f1Matthew Curtis  }
39795fdf350e39c6e260602dbbd709101a9bb55e75f1Matthew Curtis
39805fdf350e39c6e260602dbbd709101a9bb55e75f1Matthew Curtis  //----------------------------------------------------------------------------
39815fdf350e39c6e260602dbbd709101a9bb55e75f1Matthew Curtis  // End files
39825fdf350e39c6e260602dbbd709101a9bb55e75f1Matthew Curtis  //----------------------------------------------------------------------------
39835fdf350e39c6e260602dbbd709101a9bb55e75f1Matthew Curtis  if (incStdLib && incStartFiles) {
39845fdf350e39c6e260602dbbd709101a9bb55e75f1Matthew Curtis    std::string finiObj = useShared ? "/finiS.o" : "/fini.o";
39855fdf350e39c6e260602dbbd709101a9bb55e75f1Matthew Curtis    CmdArgs.push_back(Args.MakeArgString(StartFilesDir + finiObj));
39869631939f82c0eaa6fb3936a0ce58a41adfbc9011Tony Linthicum  }
39879631939f82c0eaa6fb3936a0ce58a41adfbc9011Tony Linthicum
39885fdf350e39c6e260602dbbd709101a9bb55e75f1Matthew Curtis  std::string Linker = ToolChain.GetProgramPath("hexagon-ld");
39895fdf350e39c6e260602dbbd709101a9bb55e75f1Matthew Curtis  C.addCommand(
39905fdf350e39c6e260602dbbd709101a9bb55e75f1Matthew Curtis    new Command(
39915fdf350e39c6e260602dbbd709101a9bb55e75f1Matthew Curtis      JA, *this,
39925fdf350e39c6e260602dbbd709101a9bb55e75f1Matthew Curtis      Args.MakeArgString(Linker), CmdArgs));
39939631939f82c0eaa6fb3936a0ce58a41adfbc9011Tony Linthicum}
39949631939f82c0eaa6fb3936a0ce58a41adfbc9011Tony Linthicum// Hexagon tools end.
39959631939f82c0eaa6fb3936a0ce58a41adfbc9011Tony Linthicum
3996cfed8283c3aeb03ddd837411467d19e250068d39Rafael Espindolallvm::Triple::ArchType darwin::getArchTypeForDarwinArchName(StringRef Str) {
3997cfed8283c3aeb03ddd837411467d19e250068d39Rafael Espindola  // See arch(3) and llvm-gcc's driver-driver.c. We don't implement support for
3998cfed8283c3aeb03ddd837411467d19e250068d39Rafael Espindola  // archs which Darwin doesn't use.
3999cfed8283c3aeb03ddd837411467d19e250068d39Rafael Espindola
4000cfed8283c3aeb03ddd837411467d19e250068d39Rafael Espindola  // The matching this routine does is fairly pointless, since it is neither the
4001cfed8283c3aeb03ddd837411467d19e250068d39Rafael Espindola  // complete architecture list, nor a reasonable subset. The problem is that
4002cfed8283c3aeb03ddd837411467d19e250068d39Rafael Espindola  // historically the driver driver accepts this and also ties its -march=
4003cfed8283c3aeb03ddd837411467d19e250068d39Rafael Espindola  // handling to the architecture name, so we need to be careful before removing
4004cfed8283c3aeb03ddd837411467d19e250068d39Rafael Espindola  // support for it.
4005cfed8283c3aeb03ddd837411467d19e250068d39Rafael Espindola
4006cfed8283c3aeb03ddd837411467d19e250068d39Rafael Espindola  // This code must be kept in sync with Clang's Darwin specific argument
4007cfed8283c3aeb03ddd837411467d19e250068d39Rafael Espindola  // translation.
4008cfed8283c3aeb03ddd837411467d19e250068d39Rafael Espindola
4009cfed8283c3aeb03ddd837411467d19e250068d39Rafael Espindola  return llvm::StringSwitch<llvm::Triple::ArchType>(Str)
4010cfed8283c3aeb03ddd837411467d19e250068d39Rafael Espindola    .Cases("ppc", "ppc601", "ppc603", "ppc604", "ppc604e", llvm::Triple::ppc)
4011cfed8283c3aeb03ddd837411467d19e250068d39Rafael Espindola    .Cases("ppc750", "ppc7400", "ppc7450", "ppc970", llvm::Triple::ppc)
4012cfed8283c3aeb03ddd837411467d19e250068d39Rafael Espindola    .Case("ppc64", llvm::Triple::ppc64)
4013cfed8283c3aeb03ddd837411467d19e250068d39Rafael Espindola    .Cases("i386", "i486", "i486SX", "i586", "i686", llvm::Triple::x86)
4014cfed8283c3aeb03ddd837411467d19e250068d39Rafael Espindola    .Cases("pentium", "pentpro", "pentIIm3", "pentIIm5", "pentium4",
4015cfed8283c3aeb03ddd837411467d19e250068d39Rafael Espindola           llvm::Triple::x86)
4016cfed8283c3aeb03ddd837411467d19e250068d39Rafael Espindola    .Case("x86_64", llvm::Triple::x86_64)
4017cfed8283c3aeb03ddd837411467d19e250068d39Rafael Espindola    // This is derived from the driver driver.
40182503ebd2cf9b4d28319551debaacff8b38765698Bob Wilson    .Cases("arm", "armv4t", "armv5", "armv6", "armv6m", llvm::Triple::arm)
40192503ebd2cf9b4d28319551debaacff8b38765698Bob Wilson    .Cases("armv7", "armv7em", "armv7f", "armv7k", "armv7m", llvm::Triple::arm)
40202503ebd2cf9b4d28319551debaacff8b38765698Bob Wilson    .Cases("armv7s", "xscale", llvm::Triple::arm)
4021cfed8283c3aeb03ddd837411467d19e250068d39Rafael Espindola    .Case("r600", llvm::Triple::r600)
4022cfed8283c3aeb03ddd837411467d19e250068d39Rafael Espindola    .Case("nvptx", llvm::Triple::nvptx)
4023cfed8283c3aeb03ddd837411467d19e250068d39Rafael Espindola    .Case("nvptx64", llvm::Triple::nvptx64)
4024cfed8283c3aeb03ddd837411467d19e250068d39Rafael Espindola    .Case("amdil", llvm::Triple::amdil)
4025cfed8283c3aeb03ddd837411467d19e250068d39Rafael Espindola    .Case("spir", llvm::Triple::spir)
4026cfed8283c3aeb03ddd837411467d19e250068d39Rafael Espindola    .Default(llvm::Triple::UnknownArch);
4027cfed8283c3aeb03ddd837411467d19e250068d39Rafael Espindola}
40289631939f82c0eaa6fb3936a0ce58a41adfbc9011Tony Linthicum
402966b8a6671bb5df540dd7200a5286f7ed7a72c1ccBob Wilsonconst char *Clang::getBaseInputName(const ArgList &Args,
403066b8a6671bb5df540dd7200a5286f7ed7a72c1ccBob Wilson                                    const InputInfoList &Inputs) {
4031472ccff00cdbcd095c3ba933b9e3f202719f118fMichael J. Spencer  return Args.MakeArgString(
4032472ccff00cdbcd095c3ba933b9e3f202719f118fMichael J. Spencer    llvm::sys::path::filename(Inputs[0].getBaseInput()));
4033a3ec60e0cf2a1916f479288998d31bd980b1a306Daniel Dunbar}
4034a3ec60e0cf2a1916f479288998d31bd980b1a306Daniel Dunbar
403566b8a6671bb5df540dd7200a5286f7ed7a72c1ccBob Wilsonconst char *Clang::getBaseInputStem(const ArgList &Args,
403666b8a6671bb5df540dd7200a5286f7ed7a72c1ccBob Wilson                                    const InputInfoList &Inputs) {
4037a3ec60e0cf2a1916f479288998d31bd980b1a306Daniel Dunbar  const char *Str = getBaseInputName(Args, Inputs);
4038a3ec60e0cf2a1916f479288998d31bd980b1a306Daniel Dunbar
4039657ca6683d754c903026221a3aa3aa9cedb7556fChris Lattner  if (const char *End = strrchr(Str, '.'))
4040881376467c46c5c6cc16fa6790271c2c22e1d4f1Daniel Dunbar    return Args.MakeArgString(std::string(Str, End));
4041a3ec60e0cf2a1916f479288998d31bd980b1a306Daniel Dunbar
4042a3ec60e0cf2a1916f479288998d31bd980b1a306Daniel Dunbar  return Str;
4043a3ec60e0cf2a1916f479288998d31bd980b1a306Daniel Dunbar}
4044a3ec60e0cf2a1916f479288998d31bd980b1a306Daniel Dunbar
404566b8a6671bb5df540dd7200a5286f7ed7a72c1ccBob Wilsonconst char *Clang::getDependencyFileName(const ArgList &Args,
404666b8a6671bb5df540dd7200a5286f7ed7a72c1ccBob Wilson                                         const InputInfoList &Inputs) {
4047a3ec60e0cf2a1916f479288998d31bd980b1a306Daniel Dunbar  // FIXME: Think about this more.
4048a3ec60e0cf2a1916f479288998d31bd980b1a306Daniel Dunbar  std::string Res;
4049a3ec60e0cf2a1916f479288998d31bd980b1a306Daniel Dunbar
4050a3ec60e0cf2a1916f479288998d31bd980b1a306Daniel Dunbar  if (Arg *OutputOpt = Args.getLastArg(options::OPT_o)) {
40511d489cf4a04ad0ad8ac2696e4eed0995f3a67288Richard Smith    std::string Str(OutputOpt->getValue());
4052a3ec60e0cf2a1916f479288998d31bd980b1a306Daniel Dunbar    Res = Str.substr(0, Str.rfind('.'));
40533060178ad9df29789505c1e6debcfc80a3a13587Chad Rosier  } else {
405466b8a6671bb5df540dd7200a5286f7ed7a72c1ccBob Wilson    Res = getBaseInputStem(Args, Inputs);
40553060178ad9df29789505c1e6debcfc80a3a13587Chad Rosier  }
4056881376467c46c5c6cc16fa6790271c2c22e1d4f1Daniel Dunbar  return Args.MakeArgString(Res + ".d");
4057a3ec60e0cf2a1916f479288998d31bd980b1a306Daniel Dunbar}
40585bab9ae87c41148ee2f92d312945c1e9303222e8Nick Lewycky
40598cac5f7e1ce63dd77ee0fb4ef68f9fa804f41ea6Daniel Dunbarvoid darwin::Assemble::ConstructJob(Compilation &C, const JobAction &JA,
40602fe238ed293bd4bc27af9beb9fa151fad2146fa8Daniel Dunbar                                    const InputInfo &Output,
4061c21c485b4fb58ef5d55cf3e523263dd824a2ace4Daniel Dunbar                                    const InputInfoList &Inputs,
4062c21c485b4fb58ef5d55cf3e523263dd824a2ace4Daniel Dunbar                                    const ArgList &Args,
40638cac5f7e1ce63dd77ee0fb4ef68f9fa804f41ea6Daniel Dunbar                                    const char *LinkingOutput) const {
40648cac5f7e1ce63dd77ee0fb4ef68f9fa804f41ea6Daniel Dunbar  ArgStringList CmdArgs;
40658cac5f7e1ce63dd77ee0fb4ef68f9fa804f41ea6Daniel Dunbar
40668cac5f7e1ce63dd77ee0fb4ef68f9fa804f41ea6Daniel Dunbar  assert(Inputs.size() == 1 && "Unexpected number of inputs.");
40678cac5f7e1ce63dd77ee0fb4ef68f9fa804f41ea6Daniel Dunbar  const InputInfo &Input = Inputs[0];
40688cac5f7e1ce63dd77ee0fb4ef68f9fa804f41ea6Daniel Dunbar
406934bac1f7b1ad8018b0d456f38744891c4bf56f63Daniel Dunbar  // Determine the original source input.
407034bac1f7b1ad8018b0d456f38744891c4bf56f63Daniel Dunbar  const Action *SourceAction = &JA;
407134bac1f7b1ad8018b0d456f38744891c4bf56f63Daniel Dunbar  while (SourceAction->getKind() != Action::InputClass) {
407234bac1f7b1ad8018b0d456f38744891c4bf56f63Daniel Dunbar    assert(!SourceAction->getInputs().empty() && "unexpected root action!");
407334bac1f7b1ad8018b0d456f38744891c4bf56f63Daniel Dunbar    SourceAction = SourceAction->getInputs()[0];
407434bac1f7b1ad8018b0d456f38744891c4bf56f63Daniel Dunbar  }
407534bac1f7b1ad8018b0d456f38744891c4bf56f63Daniel Dunbar
407634bac1f7b1ad8018b0d456f38744891c4bf56f63Daniel Dunbar  // Forward -g, assuming we are dealing with an actual assembly file.
407788b7cf00fcb582728c642da3927c59468efaf926Eric Christopher  if (SourceAction->getType() == types::TY_Asm ||
407834bac1f7b1ad8018b0d456f38744891c4bf56f63Daniel Dunbar      SourceAction->getType() == types::TY_PP_Asm) {
40798e4fea6750dbac032c172f3279c63b7815b7423eDaniel Dunbar    if (Args.hasArg(options::OPT_gstabs))
40808e4fea6750dbac032c172f3279c63b7815b7423eDaniel Dunbar      CmdArgs.push_back("--gstabs");
40818e4fea6750dbac032c172f3279c63b7815b7423eDaniel Dunbar    else if (Args.hasArg(options::OPT_g_Group))
4082591ff15d4a7ae25ea7ac3f00f04f203d3ccec0b7Bob Wilson      CmdArgs.push_back("-g");
40838e4fea6750dbac032c172f3279c63b7815b7423eDaniel Dunbar  }
4084c21c485b4fb58ef5d55cf3e523263dd824a2ace4Daniel Dunbar
40858cac5f7e1ce63dd77ee0fb4ef68f9fa804f41ea6Daniel Dunbar  // Derived from asm spec.
4086cc6f803f98fa6ba9a9c366400210448516d01b3cDaniel Dunbar  AddDarwinArch(Args, CmdArgs);
4087cc6f803f98fa6ba9a9c366400210448516d01b3cDaniel Dunbar
4088f5438e3462f37d7c58f847b594b4b3ab84085d67Daniel Dunbar  // Use -force_cpusubtype_ALL on x86 by default.
4089f5438e3462f37d7c58f847b594b4b3ab84085d67Daniel Dunbar  if (getToolChain().getTriple().getArch() == llvm::Triple::x86 ||
4090f5438e3462f37d7c58f847b594b4b3ab84085d67Daniel Dunbar      getToolChain().getTriple().getArch() == llvm::Triple::x86_64 ||
4091cc6f803f98fa6ba9a9c366400210448516d01b3cDaniel Dunbar      Args.hasArg(options::OPT_force__cpusubtype__ALL))
4092cc6f803f98fa6ba9a9c366400210448516d01b3cDaniel Dunbar    CmdArgs.push_back("-force_cpusubtype_ALL");
40938cac5f7e1ce63dd77ee0fb4ef68f9fa804f41ea6Daniel Dunbar
40940e2679d29be70186fc1197a1484948ed239922baDaniel Dunbar  if (getToolChain().getTriple().getArch() != llvm::Triple::x86_64 &&
40957a0c064770355a4918df69f95de8dea6338a59a2Daniel Dunbar      (((Args.hasArg(options::OPT_mkernel) ||
409659320e770f90a59c74f2be10f198e3c390195628Eric Christopher         Args.hasArg(options::OPT_fapple_kext)) &&
40977a0c064770355a4918df69f95de8dea6338a59a2Daniel Dunbar        (!getDarwinToolChain().isTargetIPhoneOS() ||
40987a0c064770355a4918df69f95de8dea6338a59a2Daniel Dunbar         getDarwinToolChain().isIPhoneOSVersionLT(6, 0))) ||
40997a0c064770355a4918df69f95de8dea6338a59a2Daniel Dunbar       Args.hasArg(options::OPT_static)))
4100c21c485b4fb58ef5d55cf3e523263dd824a2ace4Daniel Dunbar    CmdArgs.push_back("-static");
4101c21c485b4fb58ef5d55cf3e523263dd824a2ace4Daniel Dunbar
41028cac5f7e1ce63dd77ee0fb4ef68f9fa804f41ea6Daniel Dunbar  Args.AddAllArgValues(CmdArgs, options::OPT_Wa_COMMA,
41038cac5f7e1ce63dd77ee0fb4ef68f9fa804f41ea6Daniel Dunbar                       options::OPT_Xassembler);
41048cac5f7e1ce63dd77ee0fb4ef68f9fa804f41ea6Daniel Dunbar
41058cac5f7e1ce63dd77ee0fb4ef68f9fa804f41ea6Daniel Dunbar  assert(Output.isFilename() && "Unexpected lipo output.");
41068cac5f7e1ce63dd77ee0fb4ef68f9fa804f41ea6Daniel Dunbar  CmdArgs.push_back("-o");
41078cac5f7e1ce63dd77ee0fb4ef68f9fa804f41ea6Daniel Dunbar  CmdArgs.push_back(Output.getFilename());
41088cac5f7e1ce63dd77ee0fb4ef68f9fa804f41ea6Daniel Dunbar
41097c1e46533cae07216e2a67d5636a5afb44253155Daniel Dunbar  assert(Input.isFilename() && "Invalid input.");
41107c1e46533cae07216e2a67d5636a5afb44253155Daniel Dunbar  CmdArgs.push_back(Input.getFilename());
41118cac5f7e1ce63dd77ee0fb4ef68f9fa804f41ea6Daniel Dunbar
41128cac5f7e1ce63dd77ee0fb4ef68f9fa804f41ea6Daniel Dunbar  // asm_final spec is empty.
41138cac5f7e1ce63dd77ee0fb4ef68f9fa804f41ea6Daniel Dunbar
4114c21c485b4fb58ef5d55cf3e523263dd824a2ace4Daniel Dunbar  const char *Exec =
41154a7e88978cf646ad10d654020cb00b3877069210Daniel Dunbar    Args.MakeArgString(getToolChain().GetProgramPath("as"));
41162fe238ed293bd4bc27af9beb9fa151fad2146fa8Daniel Dunbar  C.addCommand(new Command(JA, *this, Exec, CmdArgs));
41178cac5f7e1ce63dd77ee0fb4ef68f9fa804f41ea6Daniel Dunbar}
4118ff7488dc9a766f94daf54d81b03ab9160d0bfd88Daniel Dunbar
411999ba9e3bd70671f3441fb974895f226a83ce0e66David Blaikievoid darwin::DarwinTool::anchor() {}
412099ba9e3bd70671f3441fb974895f226a83ce0e66David Blaikie
4121fbefe6bd6f62a3361813498dc672ab0d6c0d4fd1Daniel Dunbarvoid darwin::DarwinTool::AddDarwinArch(const ArgList &Args,
4122fbefe6bd6f62a3361813498dc672ab0d6c0d4fd1Daniel Dunbar                                       ArgStringList &CmdArgs) const {
41235f9e272e632e951b1efe824cd16acb4d96077930Chris Lattner  StringRef ArchName = getDarwinToolChain().getDarwinArchName(Args);
4124eeff406730f50afd973f005a8d501a19af4785e5Daniel Dunbar
412502633b541b04ad5ffc1c70f4c2feeeb13e607057Daniel Dunbar  // Derived from darwin_arch spec.
412602633b541b04ad5ffc1c70f4c2feeeb13e607057Daniel Dunbar  CmdArgs.push_back("-arch");
4127eeff406730f50afd973f005a8d501a19af4785e5Daniel Dunbar  CmdArgs.push_back(Args.MakeArgString(ArchName));
412878dbd580a02759bbc408dbefb6754afa71b2c24cDaniel Dunbar
4129eeff406730f50afd973f005a8d501a19af4785e5Daniel Dunbar  // FIXME: Is this needed anymore?
4130eeff406730f50afd973f005a8d501a19af4785e5Daniel Dunbar  if (ArchName == "arm")
413178dbd580a02759bbc408dbefb6754afa71b2c24cDaniel Dunbar    CmdArgs.push_back("-force_cpusubtype_ALL");
413202633b541b04ad5ffc1c70f4c2feeeb13e607057Daniel Dunbar}
413302633b541b04ad5ffc1c70f4c2feeeb13e607057Daniel Dunbar
41346acf8b4f9418be93a24b493c2f8a7d32c203002dBill Wendlingbool darwin::Link::NeedsTempPath(const InputInfoList &Inputs) const {
41356acf8b4f9418be93a24b493c2f8a7d32c203002dBill Wendling  // We only need to generate a temp path for LTO if we aren't compiling object
41366acf8b4f9418be93a24b493c2f8a7d32c203002dBill Wendling  // files. When compiling source files, we run 'dsymutil' after linking. We
41376acf8b4f9418be93a24b493c2f8a7d32c203002dBill Wendling  // don't run 'dsymutil' when compiling object files.
41386acf8b4f9418be93a24b493c2f8a7d32c203002dBill Wendling  for (InputInfoList::const_iterator
41396acf8b4f9418be93a24b493c2f8a7d32c203002dBill Wendling         it = Inputs.begin(), ie = Inputs.end(); it != ie; ++it)
41406acf8b4f9418be93a24b493c2f8a7d32c203002dBill Wendling    if (it->getType() != types::TY_Object)
41416acf8b4f9418be93a24b493c2f8a7d32c203002dBill Wendling      return true;
41426acf8b4f9418be93a24b493c2f8a7d32c203002dBill Wendling
41436acf8b4f9418be93a24b493c2f8a7d32c203002dBill Wendling  return false;
41446acf8b4f9418be93a24b493c2f8a7d32c203002dBill Wendling}
41456acf8b4f9418be93a24b493c2f8a7d32c203002dBill Wendling
4146748de8eda222f087434d8bd703176b316a061341Daniel Dunbarvoid darwin::Link::AddLinkArgs(Compilation &C,
4147748de8eda222f087434d8bd703176b316a061341Daniel Dunbar                               const ArgList &Args,
41486acf8b4f9418be93a24b493c2f8a7d32c203002dBill Wendling                               ArgStringList &CmdArgs,
41496acf8b4f9418be93a24b493c2f8a7d32c203002dBill Wendling                               const InputInfoList &Inputs) const {
4150ee788e70fcd0adf76103b17c78ac658d4ea30c9bDaniel Dunbar  const Driver &D = getToolChain().getDriver();
4151ce911f5fd76375948d18e6528fe7a7314c6e1ac9Daniel Dunbar  const toolchains::Darwin &DarwinTC = getDarwinToolChain();
415202633b541b04ad5ffc1c70f4c2feeeb13e607057Daniel Dunbar
4153b18dc5b8376f42f7b4802bf1279e95eeb813fa06Daniel Dunbar  unsigned Version[3] = { 0, 0, 0 };
4154b18dc5b8376f42f7b4802bf1279e95eeb813fa06Daniel Dunbar  if (Arg *A = Args.getLastArg(options::OPT_mlinker_version_EQ)) {
4155b18dc5b8376f42f7b4802bf1279e95eeb813fa06Daniel Dunbar    bool HadExtra;
41561d489cf4a04ad0ad8ac2696e4eed0995f3a67288Richard Smith    if (!Driver::GetReleaseVersion(A->getValue(), Version[0],
4157b18dc5b8376f42f7b4802bf1279e95eeb813fa06Daniel Dunbar                                   Version[1], Version[2], HadExtra) ||
4158b18dc5b8376f42f7b4802bf1279e95eeb813fa06Daniel Dunbar        HadExtra)
41595f9e272e632e951b1efe824cd16acb4d96077930Chris Lattner      D.Diag(diag::err_drv_invalid_version_number)
4160b18dc5b8376f42f7b4802bf1279e95eeb813fa06Daniel Dunbar        << A->getAsString(Args);
4161b18dc5b8376f42f7b4802bf1279e95eeb813fa06Daniel Dunbar  }
4162b18dc5b8376f42f7b4802bf1279e95eeb813fa06Daniel Dunbar
4163b18dc5b8376f42f7b4802bf1279e95eeb813fa06Daniel Dunbar  // Newer linkers support -demangle, pass it if supported and not disabled by
4164b18dc5b8376f42f7b4802bf1279e95eeb813fa06Daniel Dunbar  // the user.
4165d2d2088c569a15c8ad75e70f995ff5a879f4fc49Daniel Dunbar  if (Version[0] >= 100 && !Args.hasArg(options::OPT_Z_Xlinker__no_demangle)) {
4166bcf1da8ff6ab007a23a8d1be8e950d92cee4241eDaniel Dunbar    // Don't pass -demangle to ld_classic.
4167bcf1da8ff6ab007a23a8d1be8e950d92cee4241eDaniel Dunbar    //
4168bcf1da8ff6ab007a23a8d1be8e950d92cee4241eDaniel Dunbar    // FIXME: This is a temporary workaround, ld should be handling this.
4169bcf1da8ff6ab007a23a8d1be8e950d92cee4241eDaniel Dunbar    bool UsesLdClassic = (getToolChain().getArch() == llvm::Triple::x86 &&
4170bcf1da8ff6ab007a23a8d1be8e950d92cee4241eDaniel Dunbar                          Args.hasArg(options::OPT_static));
41719ced7049caf7c9543badb302f3bb43a6bc264705Daniel Dunbar    if (getToolChain().getArch() == llvm::Triple::x86) {
41729ced7049caf7c9543badb302f3bb43a6bc264705Daniel Dunbar      for (arg_iterator it = Args.filtered_begin(options::OPT_Xlinker,
41739ced7049caf7c9543badb302f3bb43a6bc264705Daniel Dunbar                                                 options::OPT_Wl_COMMA),
41749ced7049caf7c9543badb302f3bb43a6bc264705Daniel Dunbar             ie = Args.filtered_end(); it != ie; ++it) {
41759ced7049caf7c9543badb302f3bb43a6bc264705Daniel Dunbar        const Arg *A = *it;
41769ced7049caf7c9543badb302f3bb43a6bc264705Daniel Dunbar        for (unsigned i = 0, e = A->getNumValues(); i != e; ++i)
41771d489cf4a04ad0ad8ac2696e4eed0995f3a67288Richard Smith          if (StringRef(A->getValue(i)) == "-kext")
41789ced7049caf7c9543badb302f3bb43a6bc264705Daniel Dunbar            UsesLdClassic = true;
41799ced7049caf7c9543badb302f3bb43a6bc264705Daniel Dunbar      }
41809ced7049caf7c9543badb302f3bb43a6bc264705Daniel Dunbar    }
4181bcf1da8ff6ab007a23a8d1be8e950d92cee4241eDaniel Dunbar    if (!UsesLdClassic)
4182bcf1da8ff6ab007a23a8d1be8e950d92cee4241eDaniel Dunbar      CmdArgs.push_back("-demangle");
4183b18dc5b8376f42f7b4802bf1279e95eeb813fa06Daniel Dunbar  }
4184b18dc5b8376f42f7b4802bf1279e95eeb813fa06Daniel Dunbar
4185c35f908d81c5fd62c6755766a422844fedd768ceBill Wendling  // If we are using LTO, then automatically create a temporary file path for
4186c35f908d81c5fd62c6755766a422844fedd768ceBill Wendling  // the linker to use, so that it's lifetime will extend past a possible
4187c35f908d81c5fd62c6755766a422844fedd768ceBill Wendling  // dsymutil step.
4188c35f908d81c5fd62c6755766a422844fedd768ceBill Wendling  if (Version[0] >= 116 && D.IsUsingLTO(Args) && NeedsTempPath(Inputs)) {
4189c35f908d81c5fd62c6755766a422844fedd768ceBill Wendling    const char *TmpPath = C.getArgs().MakeArgString(
4190c35f908d81c5fd62c6755766a422844fedd768ceBill Wendling      D.GetTemporaryPath("cc", types::getTypeTempSuffix(types::TY_Object)));
4191c35f908d81c5fd62c6755766a422844fedd768ceBill Wendling    C.addTempFile(TmpPath);
4192c35f908d81c5fd62c6755766a422844fedd768ceBill Wendling    CmdArgs.push_back("-object_path_lto");
4193c35f908d81c5fd62c6755766a422844fedd768ceBill Wendling    CmdArgs.push_back(TmpPath);
41945bfa656e132560e616310b455d65604a49e33e35Daniel Dunbar  }
41955bfa656e132560e616310b455d65604a49e33e35Daniel Dunbar
419602633b541b04ad5ffc1c70f4c2feeeb13e607057Daniel Dunbar  // Derived from the "link" spec.
419702633b541b04ad5ffc1c70f4c2feeeb13e607057Daniel Dunbar  Args.AddAllArgs(CmdArgs, options::OPT_static);
419802633b541b04ad5ffc1c70f4c2feeeb13e607057Daniel Dunbar  if (!Args.hasArg(options::OPT_static))
419902633b541b04ad5ffc1c70f4c2feeeb13e607057Daniel Dunbar    CmdArgs.push_back("-dynamic");
420002633b541b04ad5ffc1c70f4c2feeeb13e607057Daniel Dunbar  if (Args.hasArg(options::OPT_fgnu_runtime)) {
420102633b541b04ad5ffc1c70f4c2feeeb13e607057Daniel Dunbar    // FIXME: gcc replaces -lobjc in forward args with -lobjc-gnu
420202633b541b04ad5ffc1c70f4c2feeeb13e607057Daniel Dunbar    // here. How do we wish to handle such things?
420302633b541b04ad5ffc1c70f4c2feeeb13e607057Daniel Dunbar  }
4204c21c485b4fb58ef5d55cf3e523263dd824a2ace4Daniel Dunbar
420502633b541b04ad5ffc1c70f4c2feeeb13e607057Daniel Dunbar  if (!Args.hasArg(options::OPT_dynamiclib)) {
4206a6d38494d18e260958e73bfe5e2b3f1dc4160459Daniel Dunbar    AddDarwinArch(Args, CmdArgs);
4207a6d38494d18e260958e73bfe5e2b3f1dc4160459Daniel Dunbar    // FIXME: Why do this only on this path?
42088917dd4457affb8750c81f08cbc21902a36cff26Daniel Dunbar    Args.AddLastArg(CmdArgs, options::OPT_force__cpusubtype__ALL);
420902633b541b04ad5ffc1c70f4c2feeeb13e607057Daniel Dunbar
421002633b541b04ad5ffc1c70f4c2feeeb13e607057Daniel Dunbar    Args.AddLastArg(CmdArgs, options::OPT_bundle);
421102633b541b04ad5ffc1c70f4c2feeeb13e607057Daniel Dunbar    Args.AddAllArgs(CmdArgs, options::OPT_bundle__loader);
421202633b541b04ad5ffc1c70f4c2feeeb13e607057Daniel Dunbar    Args.AddAllArgs(CmdArgs, options::OPT_client__name);
421302633b541b04ad5ffc1c70f4c2feeeb13e607057Daniel Dunbar
421402633b541b04ad5ffc1c70f4c2feeeb13e607057Daniel Dunbar    Arg *A;
421502633b541b04ad5ffc1c70f4c2feeeb13e607057Daniel Dunbar    if ((A = Args.getLastArg(options::OPT_compatibility__version)) ||
421602633b541b04ad5ffc1c70f4c2feeeb13e607057Daniel Dunbar        (A = Args.getLastArg(options::OPT_current__version)) ||
421702633b541b04ad5ffc1c70f4c2feeeb13e607057Daniel Dunbar        (A = Args.getLastArg(options::OPT_install__name)))
42185f9e272e632e951b1efe824cd16acb4d96077930Chris Lattner      D.Diag(diag::err_drv_argument_only_allowed_with)
421902633b541b04ad5ffc1c70f4c2feeeb13e607057Daniel Dunbar        << A->getAsString(Args) << "-dynamiclib";
422002633b541b04ad5ffc1c70f4c2feeeb13e607057Daniel Dunbar
422102633b541b04ad5ffc1c70f4c2feeeb13e607057Daniel Dunbar    Args.AddLastArg(CmdArgs, options::OPT_force__flat__namespace);
422202633b541b04ad5ffc1c70f4c2feeeb13e607057Daniel Dunbar    Args.AddLastArg(CmdArgs, options::OPT_keep__private__externs);
422302633b541b04ad5ffc1c70f4c2feeeb13e607057Daniel Dunbar    Args.AddLastArg(CmdArgs, options::OPT_private__bundle);
422402633b541b04ad5ffc1c70f4c2feeeb13e607057Daniel Dunbar  } else {
422502633b541b04ad5ffc1c70f4c2feeeb13e607057Daniel Dunbar    CmdArgs.push_back("-dylib");
422602633b541b04ad5ffc1c70f4c2feeeb13e607057Daniel Dunbar
422702633b541b04ad5ffc1c70f4c2feeeb13e607057Daniel Dunbar    Arg *A;
422802633b541b04ad5ffc1c70f4c2feeeb13e607057Daniel Dunbar    if ((A = Args.getLastArg(options::OPT_bundle)) ||
422902633b541b04ad5ffc1c70f4c2feeeb13e607057Daniel Dunbar        (A = Args.getLastArg(options::OPT_bundle__loader)) ||
423002633b541b04ad5ffc1c70f4c2feeeb13e607057Daniel Dunbar        (A = Args.getLastArg(options::OPT_client__name)) ||
423102633b541b04ad5ffc1c70f4c2feeeb13e607057Daniel Dunbar        (A = Args.getLastArg(options::OPT_force__flat__namespace)) ||
423202633b541b04ad5ffc1c70f4c2feeeb13e607057Daniel Dunbar        (A = Args.getLastArg(options::OPT_keep__private__externs)) ||
423302633b541b04ad5ffc1c70f4c2feeeb13e607057Daniel Dunbar        (A = Args.getLastArg(options::OPT_private__bundle)))
42345f9e272e632e951b1efe824cd16acb4d96077930Chris Lattner      D.Diag(diag::err_drv_argument_not_allowed_with)
423502633b541b04ad5ffc1c70f4c2feeeb13e607057Daniel Dunbar        << A->getAsString(Args) << "-dynamiclib";
4236c21c485b4fb58ef5d55cf3e523263dd824a2ace4Daniel Dunbar
423702633b541b04ad5ffc1c70f4c2feeeb13e607057Daniel Dunbar    Args.AddAllArgsTranslated(CmdArgs, options::OPT_compatibility__version,
423802633b541b04ad5ffc1c70f4c2feeeb13e607057Daniel Dunbar                              "-dylib_compatibility_version");
423902633b541b04ad5ffc1c70f4c2feeeb13e607057Daniel Dunbar    Args.AddAllArgsTranslated(CmdArgs, options::OPT_current__version,
424002633b541b04ad5ffc1c70f4c2feeeb13e607057Daniel Dunbar                              "-dylib_current_version");
424102633b541b04ad5ffc1c70f4c2feeeb13e607057Daniel Dunbar
4242a6d38494d18e260958e73bfe5e2b3f1dc4160459Daniel Dunbar    AddDarwinArch(Args, CmdArgs);
424302633b541b04ad5ffc1c70f4c2feeeb13e607057Daniel Dunbar
424402633b541b04ad5ffc1c70f4c2feeeb13e607057Daniel Dunbar    Args.AddAllArgsTranslated(CmdArgs, options::OPT_install__name,
424502633b541b04ad5ffc1c70f4c2feeeb13e607057Daniel Dunbar                              "-dylib_install_name");
424602633b541b04ad5ffc1c70f4c2feeeb13e607057Daniel Dunbar  }
424702633b541b04ad5ffc1c70f4c2feeeb13e607057Daniel Dunbar
424802633b541b04ad5ffc1c70f4c2feeeb13e607057Daniel Dunbar  Args.AddLastArg(CmdArgs, options::OPT_all__load);
424902633b541b04ad5ffc1c70f4c2feeeb13e607057Daniel Dunbar  Args.AddAllArgs(CmdArgs, options::OPT_allowable__client);
425002633b541b04ad5ffc1c70f4c2feeeb13e607057Daniel Dunbar  Args.AddLastArg(CmdArgs, options::OPT_bind__at__load);
4251ce911f5fd76375948d18e6528fe7a7314c6e1ac9Daniel Dunbar  if (DarwinTC.isTargetIPhoneOS())
4252d82f8fa53771b454885c546f0fd452a4980b3a3eDaniel Dunbar    Args.AddLastArg(CmdArgs, options::OPT_arch__errors__fatal);
425302633b541b04ad5ffc1c70f4c2feeeb13e607057Daniel Dunbar  Args.AddLastArg(CmdArgs, options::OPT_dead__strip);
425402633b541b04ad5ffc1c70f4c2feeeb13e607057Daniel Dunbar  Args.AddLastArg(CmdArgs, options::OPT_no__dead__strip__inits__and__terms);
425502633b541b04ad5ffc1c70f4c2feeeb13e607057Daniel Dunbar  Args.AddAllArgs(CmdArgs, options::OPT_dylib__file);
425602633b541b04ad5ffc1c70f4c2feeeb13e607057Daniel Dunbar  Args.AddLastArg(CmdArgs, options::OPT_dynamic);
425702633b541b04ad5ffc1c70f4c2feeeb13e607057Daniel Dunbar  Args.AddAllArgs(CmdArgs, options::OPT_exported__symbols__list);
425802633b541b04ad5ffc1c70f4c2feeeb13e607057Daniel Dunbar  Args.AddLastArg(CmdArgs, options::OPT_flat__namespace);
425999ca47b21f6b32ea8a92b0c8e0bea18170f86b9eDaniel Dunbar  Args.AddAllArgs(CmdArgs, options::OPT_force__load);
426002633b541b04ad5ffc1c70f4c2feeeb13e607057Daniel Dunbar  Args.AddAllArgs(CmdArgs, options::OPT_headerpad__max__install__names);
426102633b541b04ad5ffc1c70f4c2feeeb13e607057Daniel Dunbar  Args.AddAllArgs(CmdArgs, options::OPT_image__base);
426202633b541b04ad5ffc1c70f4c2feeeb13e607057Daniel Dunbar  Args.AddAllArgs(CmdArgs, options::OPT_init);
426302633b541b04ad5ffc1c70f4c2feeeb13e607057Daniel Dunbar
4264ce911f5fd76375948d18e6528fe7a7314c6e1ac9Daniel Dunbar  // Add the deployment target.
426509c9a5635f10a7dfa3373ef0941597c16b048362Benjamin Kramer  VersionTuple TargetVersion = DarwinTC.getTargetVersion();
4266b7f5ef73aee479b2fa54c30cfebed665be8fccb9Daniel Dunbar
4267b7f5ef73aee479b2fa54c30cfebed665be8fccb9Daniel Dunbar  // If we had an explicit -mios-simulator-version-min argument, honor that,
4268b7f5ef73aee479b2fa54c30cfebed665be8fccb9Daniel Dunbar  // otherwise use the traditional deployment targets. We can't just check the
4269b7f5ef73aee479b2fa54c30cfebed665be8fccb9Daniel Dunbar  // is-sim attribute because existing code follows this path, and the linker
4270b7f5ef73aee479b2fa54c30cfebed665be8fccb9Daniel Dunbar  // may not handle the argument.
4271b7f5ef73aee479b2fa54c30cfebed665be8fccb9Daniel Dunbar  //
4272b7f5ef73aee479b2fa54c30cfebed665be8fccb9Daniel Dunbar  // FIXME: We may be able to remove this, once we can verify no one depends on
4273b7f5ef73aee479b2fa54c30cfebed665be8fccb9Daniel Dunbar  // it.
4274b7f5ef73aee479b2fa54c30cfebed665be8fccb9Daniel Dunbar  if (Args.hasArg(options::OPT_mios_simulator_version_min_EQ))
4275b7f5ef73aee479b2fa54c30cfebed665be8fccb9Daniel Dunbar    CmdArgs.push_back("-ios_simulator_version_min");
4276b7f5ef73aee479b2fa54c30cfebed665be8fccb9Daniel Dunbar  else if (DarwinTC.isTargetIPhoneOS())
4277b7f5ef73aee479b2fa54c30cfebed665be8fccb9Daniel Dunbar    CmdArgs.push_back("-iphoneos_version_min");
4278b7f5ef73aee479b2fa54c30cfebed665be8fccb9Daniel Dunbar  else
4279b7f5ef73aee479b2fa54c30cfebed665be8fccb9Daniel Dunbar    CmdArgs.push_back("-macosx_version_min");
428009c9a5635f10a7dfa3373ef0941597c16b048362Benjamin Kramer  CmdArgs.push_back(Args.MakeArgString(TargetVersion.getAsString()));
4281ce911f5fd76375948d18e6528fe7a7314c6e1ac9Daniel Dunbar
428202633b541b04ad5ffc1c70f4c2feeeb13e607057Daniel Dunbar  Args.AddLastArg(CmdArgs, options::OPT_nomultidefs);
428302633b541b04ad5ffc1c70f4c2feeeb13e607057Daniel Dunbar  Args.AddLastArg(CmdArgs, options::OPT_multi__module);
428402633b541b04ad5ffc1c70f4c2feeeb13e607057Daniel Dunbar  Args.AddLastArg(CmdArgs, options::OPT_single__module);
428502633b541b04ad5ffc1c70f4c2feeeb13e607057Daniel Dunbar  Args.AddAllArgs(CmdArgs, options::OPT_multiply__defined);
428602633b541b04ad5ffc1c70f4c2feeeb13e607057Daniel Dunbar  Args.AddAllArgs(CmdArgs, options::OPT_multiply__defined__unused);
4287c21c485b4fb58ef5d55cf3e523263dd824a2ace4Daniel Dunbar
428847e879dfa735f81472a51b1bd69cc4eb9159db39Daniel Dunbar  if (const Arg *A = Args.getLastArg(options::OPT_fpie, options::OPT_fPIE,
428947e879dfa735f81472a51b1bd69cc4eb9159db39Daniel Dunbar                                     options::OPT_fno_pie,
429047e879dfa735f81472a51b1bd69cc4eb9159db39Daniel Dunbar                                     options::OPT_fno_PIE)) {
429147e879dfa735f81472a51b1bd69cc4eb9159db39Daniel Dunbar    if (A->getOption().matches(options::OPT_fpie) ||
429247e879dfa735f81472a51b1bd69cc4eb9159db39Daniel Dunbar        A->getOption().matches(options::OPT_fPIE))
429347e879dfa735f81472a51b1bd69cc4eb9159db39Daniel Dunbar      CmdArgs.push_back("-pie");
429447e879dfa735f81472a51b1bd69cc4eb9159db39Daniel Dunbar    else
429547e879dfa735f81472a51b1bd69cc4eb9159db39Daniel Dunbar      CmdArgs.push_back("-no_pie");
429647e879dfa735f81472a51b1bd69cc4eb9159db39Daniel Dunbar  }
429702633b541b04ad5ffc1c70f4c2feeeb13e607057Daniel Dunbar
429802633b541b04ad5ffc1c70f4c2feeeb13e607057Daniel Dunbar  Args.AddLastArg(CmdArgs, options::OPT_prebind);
429902633b541b04ad5ffc1c70f4c2feeeb13e607057Daniel Dunbar  Args.AddLastArg(CmdArgs, options::OPT_noprebind);
430002633b541b04ad5ffc1c70f4c2feeeb13e607057Daniel Dunbar  Args.AddLastArg(CmdArgs, options::OPT_nofixprebinding);
430102633b541b04ad5ffc1c70f4c2feeeb13e607057Daniel Dunbar  Args.AddLastArg(CmdArgs, options::OPT_prebind__all__twolevel__modules);
430202633b541b04ad5ffc1c70f4c2feeeb13e607057Daniel Dunbar  Args.AddLastArg(CmdArgs, options::OPT_read__only__relocs);
430302633b541b04ad5ffc1c70f4c2feeeb13e607057Daniel Dunbar  Args.AddAllArgs(CmdArgs, options::OPT_sectcreate);
430402633b541b04ad5ffc1c70f4c2feeeb13e607057Daniel Dunbar  Args.AddAllArgs(CmdArgs, options::OPT_sectorder);
430502633b541b04ad5ffc1c70f4c2feeeb13e607057Daniel Dunbar  Args.AddAllArgs(CmdArgs, options::OPT_seg1addr);
430602633b541b04ad5ffc1c70f4c2feeeb13e607057Daniel Dunbar  Args.AddAllArgs(CmdArgs, options::OPT_segprot);
430702633b541b04ad5ffc1c70f4c2feeeb13e607057Daniel Dunbar  Args.AddAllArgs(CmdArgs, options::OPT_segaddr);
430802633b541b04ad5ffc1c70f4c2feeeb13e607057Daniel Dunbar  Args.AddAllArgs(CmdArgs, options::OPT_segs__read__only__addr);
430902633b541b04ad5ffc1c70f4c2feeeb13e607057Daniel Dunbar  Args.AddAllArgs(CmdArgs, options::OPT_segs__read__write__addr);
431002633b541b04ad5ffc1c70f4c2feeeb13e607057Daniel Dunbar  Args.AddAllArgs(CmdArgs, options::OPT_seg__addr__table);
431102633b541b04ad5ffc1c70f4c2feeeb13e607057Daniel Dunbar  Args.AddAllArgs(CmdArgs, options::OPT_seg__addr__table__filename);
431202633b541b04ad5ffc1c70f4c2feeeb13e607057Daniel Dunbar  Args.AddAllArgs(CmdArgs, options::OPT_sub__library);
431302633b541b04ad5ffc1c70f4c2feeeb13e607057Daniel Dunbar  Args.AddAllArgs(CmdArgs, options::OPT_sub__umbrella);
4314d82f8fa53771b454885c546f0fd452a4980b3a3eDaniel Dunbar
4315cc95719054ef9949c88d21c6c8d349dac8b4fd36Daniel Dunbar  // Give --sysroot= preference, over the Apple specific behavior to also use
4316cc95719054ef9949c88d21c6c8d349dac8b4fd36Daniel Dunbar  // --isysroot as the syslibroot.
43174762a2da74875d2ae94e0d77d38ed964816cce36Sebastian Pop  StringRef sysroot = C.getSysRoot();
43184762a2da74875d2ae94e0d77d38ed964816cce36Sebastian Pop  if (sysroot != "") {
4319cc95719054ef9949c88d21c6c8d349dac8b4fd36Daniel Dunbar    CmdArgs.push_back("-syslibroot");
43204762a2da74875d2ae94e0d77d38ed964816cce36Sebastian Pop    CmdArgs.push_back(C.getArgs().MakeArgString(sysroot));
4321cc95719054ef9949c88d21c6c8d349dac8b4fd36Daniel Dunbar  } else if (const Arg *A = Args.getLastArg(options::OPT_isysroot)) {
4322cc95719054ef9949c88d21c6c8d349dac8b4fd36Daniel Dunbar    CmdArgs.push_back("-syslibroot");
43231d489cf4a04ad0ad8ac2696e4eed0995f3a67288Richard Smith    CmdArgs.push_back(A->getValue());
4324d82f8fa53771b454885c546f0fd452a4980b3a3eDaniel Dunbar  }
4325d82f8fa53771b454885c546f0fd452a4980b3a3eDaniel Dunbar
432602633b541b04ad5ffc1c70f4c2feeeb13e607057Daniel Dunbar  Args.AddLastArg(CmdArgs, options::OPT_twolevel__namespace);
432702633b541b04ad5ffc1c70f4c2feeeb13e607057Daniel Dunbar  Args.AddLastArg(CmdArgs, options::OPT_twolevel__namespace__hints);
432802633b541b04ad5ffc1c70f4c2feeeb13e607057Daniel Dunbar  Args.AddAllArgs(CmdArgs, options::OPT_umbrella);
432902633b541b04ad5ffc1c70f4c2feeeb13e607057Daniel Dunbar  Args.AddAllArgs(CmdArgs, options::OPT_undefined);
433002633b541b04ad5ffc1c70f4c2feeeb13e607057Daniel Dunbar  Args.AddAllArgs(CmdArgs, options::OPT_unexported__symbols__list);
4331d82f8fa53771b454885c546f0fd452a4980b3a3eDaniel Dunbar  Args.AddAllArgs(CmdArgs, options::OPT_weak__reference__mismatches);
433202633b541b04ad5ffc1c70f4c2feeeb13e607057Daniel Dunbar  Args.AddLastArg(CmdArgs, options::OPT_X_Flag);
433302633b541b04ad5ffc1c70f4c2feeeb13e607057Daniel Dunbar  Args.AddAllArgs(CmdArgs, options::OPT_y);
433402633b541b04ad5ffc1c70f4c2feeeb13e607057Daniel Dunbar  Args.AddLastArg(CmdArgs, options::OPT_w);
433502633b541b04ad5ffc1c70f4c2feeeb13e607057Daniel Dunbar  Args.AddAllArgs(CmdArgs, options::OPT_pagezero__size);
433602633b541b04ad5ffc1c70f4c2feeeb13e607057Daniel Dunbar  Args.AddAllArgs(CmdArgs, options::OPT_segs__read__);
433702633b541b04ad5ffc1c70f4c2feeeb13e607057Daniel Dunbar  Args.AddLastArg(CmdArgs, options::OPT_seglinkedit);
433802633b541b04ad5ffc1c70f4c2feeeb13e607057Daniel Dunbar  Args.AddLastArg(CmdArgs, options::OPT_noseglinkedit);
433902633b541b04ad5ffc1c70f4c2feeeb13e607057Daniel Dunbar  Args.AddAllArgs(CmdArgs, options::OPT_sectalign);
434002633b541b04ad5ffc1c70f4c2feeeb13e607057Daniel Dunbar  Args.AddAllArgs(CmdArgs, options::OPT_sectobjectsymbols);
434102633b541b04ad5ffc1c70f4c2feeeb13e607057Daniel Dunbar  Args.AddAllArgs(CmdArgs, options::OPT_segcreate);
434202633b541b04ad5ffc1c70f4c2feeeb13e607057Daniel Dunbar  Args.AddLastArg(CmdArgs, options::OPT_whyload);
434302633b541b04ad5ffc1c70f4c2feeeb13e607057Daniel Dunbar  Args.AddLastArg(CmdArgs, options::OPT_whatsloaded);
434402633b541b04ad5ffc1c70f4c2feeeb13e607057Daniel Dunbar  Args.AddAllArgs(CmdArgs, options::OPT_dylinker__install__name);
434502633b541b04ad5ffc1c70f4c2feeeb13e607057Daniel Dunbar  Args.AddLastArg(CmdArgs, options::OPT_dylinker);
434602633b541b04ad5ffc1c70f4c2feeeb13e607057Daniel Dunbar  Args.AddLastArg(CmdArgs, options::OPT_Mach);
434702633b541b04ad5ffc1c70f4c2feeeb13e607057Daniel Dunbar}
434802633b541b04ad5ffc1c70f4c2feeeb13e607057Daniel Dunbar
434902633b541b04ad5ffc1c70f4c2feeeb13e607057Daniel Dunbarvoid darwin::Link::ConstructJob(Compilation &C, const JobAction &JA,
43502fe238ed293bd4bc27af9beb9fa151fad2146fa8Daniel Dunbar                                const InputInfo &Output,
4351c21c485b4fb58ef5d55cf3e523263dd824a2ace4Daniel Dunbar                                const InputInfoList &Inputs,
4352c21c485b4fb58ef5d55cf3e523263dd824a2ace4Daniel Dunbar                                const ArgList &Args,
435302633b541b04ad5ffc1c70f4c2feeeb13e607057Daniel Dunbar                                const char *LinkingOutput) const {
435402633b541b04ad5ffc1c70f4c2feeeb13e607057Daniel Dunbar  assert(Output.getType() == types::TY_Image && "Invalid linker output type.");
4355e0be8b1729d8978de433d229c065830b95d0ae68Daniel Dunbar
435602633b541b04ad5ffc1c70f4c2feeeb13e607057Daniel Dunbar  // The logic here is derived from gcc's behavior; most of which
435702633b541b04ad5ffc1c70f4c2feeeb13e607057Daniel Dunbar  // comes from specs (starting with link_command). Consult gcc for
435802633b541b04ad5ffc1c70f4c2feeeb13e607057Daniel Dunbar  // more information.
435902633b541b04ad5ffc1c70f4c2feeeb13e607057Daniel Dunbar  ArgStringList CmdArgs;
436002633b541b04ad5ffc1c70f4c2feeeb13e607057Daniel Dunbar
4361228971738f80de6f02aee0d6f8018f5209cf7c9cArgyrios Kyrtzidis  /// Hack(tm) to ignore linking errors when we are doing ARC migration.
4362228971738f80de6f02aee0d6f8018f5209cf7c9cArgyrios Kyrtzidis  if (Args.hasArg(options::OPT_ccc_arcmt_check,
4363228971738f80de6f02aee0d6f8018f5209cf7c9cArgyrios Kyrtzidis                  options::OPT_ccc_arcmt_migrate)) {
4364228971738f80de6f02aee0d6f8018f5209cf7c9cArgyrios Kyrtzidis    for (ArgList::const_iterator I = Args.begin(), E = Args.end(); I != E; ++I)
4365228971738f80de6f02aee0d6f8018f5209cf7c9cArgyrios Kyrtzidis      (*I)->claim();
4366228971738f80de6f02aee0d6f8018f5209cf7c9cArgyrios Kyrtzidis    const char *Exec =
4367228971738f80de6f02aee0d6f8018f5209cf7c9cArgyrios Kyrtzidis      Args.MakeArgString(getToolChain().GetProgramPath("touch"));
4368228971738f80de6f02aee0d6f8018f5209cf7c9cArgyrios Kyrtzidis    CmdArgs.push_back(Output.getFilename());
4369228971738f80de6f02aee0d6f8018f5209cf7c9cArgyrios Kyrtzidis    C.addCommand(new Command(JA, *this, Exec, CmdArgs));
4370228971738f80de6f02aee0d6f8018f5209cf7c9cArgyrios Kyrtzidis    return;
4371228971738f80de6f02aee0d6f8018f5209cf7c9cArgyrios Kyrtzidis  }
4372228971738f80de6f02aee0d6f8018f5209cf7c9cArgyrios Kyrtzidis
437302633b541b04ad5ffc1c70f4c2feeeb13e607057Daniel Dunbar  // I'm not sure why this particular decomposition exists in gcc, but
437402633b541b04ad5ffc1c70f4c2feeeb13e607057Daniel Dunbar  // we follow suite for ease of comparison.
43756acf8b4f9418be93a24b493c2f8a7d32c203002dBill Wendling  AddLinkArgs(C, Args, CmdArgs, Inputs);
437602633b541b04ad5ffc1c70f4c2feeeb13e607057Daniel Dunbar
437702633b541b04ad5ffc1c70f4c2feeeb13e607057Daniel Dunbar  Args.AddAllArgs(CmdArgs, options::OPT_d_Flag);
437802633b541b04ad5ffc1c70f4c2feeeb13e607057Daniel Dunbar  Args.AddAllArgs(CmdArgs, options::OPT_s);
437902633b541b04ad5ffc1c70f4c2feeeb13e607057Daniel Dunbar  Args.AddAllArgs(CmdArgs, options::OPT_t);
438002633b541b04ad5ffc1c70f4c2feeeb13e607057Daniel Dunbar  Args.AddAllArgs(CmdArgs, options::OPT_Z_Flag);
438102633b541b04ad5ffc1c70f4c2feeeb13e607057Daniel Dunbar  Args.AddAllArgs(CmdArgs, options::OPT_u_Group);
438202633b541b04ad5ffc1c70f4c2feeeb13e607057Daniel Dunbar  Args.AddLastArg(CmdArgs, options::OPT_e);
438302633b541b04ad5ffc1c70f4c2feeeb13e607057Daniel Dunbar  Args.AddAllArgs(CmdArgs, options::OPT_m_Separate);
438402633b541b04ad5ffc1c70f4c2feeeb13e607057Daniel Dunbar  Args.AddAllArgs(CmdArgs, options::OPT_r);
438502633b541b04ad5ffc1c70f4c2feeeb13e607057Daniel Dunbar
4386270073c1e44d073e9732204fc099f280b368fab5Daniel Dunbar  // Forward -ObjC when either -ObjC or -ObjC++ is used, to force loading
4387270073c1e44d073e9732204fc099f280b368fab5Daniel Dunbar  // members of static archive libraries which implement Objective-C classes or
4388270073c1e44d073e9732204fc099f280b368fab5Daniel Dunbar  // categories.
4389270073c1e44d073e9732204fc099f280b368fab5Daniel Dunbar  if (Args.hasArg(options::OPT_ObjC) || Args.hasArg(options::OPT_ObjCXX))
4390270073c1e44d073e9732204fc099f280b368fab5Daniel Dunbar    CmdArgs.push_back("-ObjC");
439120249a1af2e462dcafdd6a350f1c7967b264ff25Michael J. Spencer
4392d56f40341374ba5970283a15f27fb1999965967aBill Wendling  if (Args.hasArg(options::OPT_rdynamic))
4393d56f40341374ba5970283a15f27fb1999965967aBill Wendling    CmdArgs.push_back("-export_dynamic");
4394d56f40341374ba5970283a15f27fb1999965967aBill Wendling
439502633b541b04ad5ffc1c70f4c2feeeb13e607057Daniel Dunbar  CmdArgs.push_back("-o");
439602633b541b04ad5ffc1c70f4c2feeeb13e607057Daniel Dunbar  CmdArgs.push_back(Output.getFilename());
439702633b541b04ad5ffc1c70f4c2feeeb13e607057Daniel Dunbar
4398189373170330e3d551bdb28c9762d606f3bcb931Chad Rosier  if (!Args.hasArg(options::OPT_nostdlib) &&
439902633b541b04ad5ffc1c70f4c2feeeb13e607057Daniel Dunbar      !Args.hasArg(options::OPT_nostartfiles)) {
440002633b541b04ad5ffc1c70f4c2feeeb13e607057Daniel Dunbar    // Derived from startfile spec.
440102633b541b04ad5ffc1c70f4c2feeeb13e607057Daniel Dunbar    if (Args.hasArg(options::OPT_dynamiclib)) {
4402c21c485b4fb58ef5d55cf3e523263dd824a2ace4Daniel Dunbar      // Derived from darwin_dylib1 spec.
44031051fc0ba0fb924d6d4a88a2113460a40a542614Daniel Dunbar      if (getDarwinToolChain().isTargetIOSSimulator()) {
44041051fc0ba0fb924d6d4a88a2113460a40a542614Daniel Dunbar        // The simulator doesn't have a versioned crt1 file.
44051051fc0ba0fb924d6d4a88a2113460a40a542614Daniel Dunbar        CmdArgs.push_back("-ldylib1.o");
44061051fc0ba0fb924d6d4a88a2113460a40a542614Daniel Dunbar      } else if (getDarwinToolChain().isTargetIPhoneOS()) {
4407cacb0f007001f7463d44ebd5dde7bfaecf876a71Daniel Dunbar        if (getDarwinToolChain().isIPhoneOSVersionLT(3, 1))
4408cacb0f007001f7463d44ebd5dde7bfaecf876a71Daniel Dunbar          CmdArgs.push_back("-ldylib1.o");
4409cacb0f007001f7463d44ebd5dde7bfaecf876a71Daniel Dunbar      } else {
4410ce3fdf233353b10f20d74dceda3d77a82285de17Daniel Dunbar        if (getDarwinToolChain().isMacosxVersionLT(10, 5))
4411cacb0f007001f7463d44ebd5dde7bfaecf876a71Daniel Dunbar          CmdArgs.push_back("-ldylib1.o");
4412ce3fdf233353b10f20d74dceda3d77a82285de17Daniel Dunbar        else if (getDarwinToolChain().isMacosxVersionLT(10, 6))
4413cacb0f007001f7463d44ebd5dde7bfaecf876a71Daniel Dunbar          CmdArgs.push_back("-ldylib1.10.5.o");
4414cacb0f007001f7463d44ebd5dde7bfaecf876a71Daniel Dunbar      }
441502633b541b04ad5ffc1c70f4c2feeeb13e607057Daniel Dunbar    } else {
441602633b541b04ad5ffc1c70f4c2feeeb13e607057Daniel Dunbar      if (Args.hasArg(options::OPT_bundle)) {
44178a8d8afa3df40e9f122d2b826f1a825a66f6908dDaniel Dunbar        if (!Args.hasArg(options::OPT_static)) {
44188a8d8afa3df40e9f122d2b826f1a825a66f6908dDaniel Dunbar          // Derived from darwin_bundle1 spec.
44191051fc0ba0fb924d6d4a88a2113460a40a542614Daniel Dunbar          if (getDarwinToolChain().isTargetIOSSimulator()) {
44201051fc0ba0fb924d6d4a88a2113460a40a542614Daniel Dunbar            // The simulator doesn't have a versioned crt1 file.
44211051fc0ba0fb924d6d4a88a2113460a40a542614Daniel Dunbar            CmdArgs.push_back("-lbundle1.o");
44221051fc0ba0fb924d6d4a88a2113460a40a542614Daniel Dunbar          } else if (getDarwinToolChain().isTargetIPhoneOS()) {
4423cacb0f007001f7463d44ebd5dde7bfaecf876a71Daniel Dunbar            if (getDarwinToolChain().isIPhoneOSVersionLT(3, 1))
4424cacb0f007001f7463d44ebd5dde7bfaecf876a71Daniel Dunbar              CmdArgs.push_back("-lbundle1.o");
4425cacb0f007001f7463d44ebd5dde7bfaecf876a71Daniel Dunbar          } else {
4426ce3fdf233353b10f20d74dceda3d77a82285de17Daniel Dunbar            if (getDarwinToolChain().isMacosxVersionLT(10, 6))
4427cacb0f007001f7463d44ebd5dde7bfaecf876a71Daniel Dunbar              CmdArgs.push_back("-lbundle1.o");
4428cacb0f007001f7463d44ebd5dde7bfaecf876a71Daniel Dunbar          }
44298a8d8afa3df40e9f122d2b826f1a825a66f6908dDaniel Dunbar        }
443002633b541b04ad5ffc1c70f4c2feeeb13e607057Daniel Dunbar      } else {
4431bbe8e3eff56ac1d79f3668d706536e3cebe28c18Daniel Dunbar        if (Args.hasArg(options::OPT_pg) &&
4432bbe8e3eff56ac1d79f3668d706536e3cebe28c18Daniel Dunbar            getToolChain().SupportsProfiling()) {
443302633b541b04ad5ffc1c70f4c2feeeb13e607057Daniel Dunbar          if (Args.hasArg(options::OPT_static) ||
443402633b541b04ad5ffc1c70f4c2feeeb13e607057Daniel Dunbar              Args.hasArg(options::OPT_object) ||
443502633b541b04ad5ffc1c70f4c2feeeb13e607057Daniel Dunbar              Args.hasArg(options::OPT_preload)) {
443602633b541b04ad5ffc1c70f4c2feeeb13e607057Daniel Dunbar            CmdArgs.push_back("-lgcrt0.o");
443702633b541b04ad5ffc1c70f4c2feeeb13e607057Daniel Dunbar          } else {
443802633b541b04ad5ffc1c70f4c2feeeb13e607057Daniel Dunbar            CmdArgs.push_back("-lgcrt1.o");
4439c21c485b4fb58ef5d55cf3e523263dd824a2ace4Daniel Dunbar
444002633b541b04ad5ffc1c70f4c2feeeb13e607057Daniel Dunbar            // darwin_crt2 spec is empty.
4441c21c485b4fb58ef5d55cf3e523263dd824a2ace4Daniel Dunbar          }
44424e6e791dc53654dd1e6258829d5c3a1e059b11c3Bob Wilson          // By default on OS X 10.8 and later, we don't link with a crt1.o
44434e6e791dc53654dd1e6258829d5c3a1e059b11c3Bob Wilson          // file and the linker knows to use _main as the entry point.  But,
44444e6e791dc53654dd1e6258829d5c3a1e059b11c3Bob Wilson          // when compiling with -pg, we need to link with the gcrt1.o file,
44454e6e791dc53654dd1e6258829d5c3a1e059b11c3Bob Wilson          // so pass the -no_new_main option to tell the linker to use the
44464e6e791dc53654dd1e6258829d5c3a1e059b11c3Bob Wilson          // "start" symbol as the entry point.
44471fc6e4fa79444b2a7be8a1150f646ffbde68b744Bob Wilson          if (getDarwinToolChain().isTargetMacOS() &&
44481fc6e4fa79444b2a7be8a1150f646ffbde68b744Bob Wilson              !getDarwinToolChain().isMacosxVersionLT(10, 8))
44491fc6e4fa79444b2a7be8a1150f646ffbde68b744Bob Wilson            CmdArgs.push_back("-no_new_main");
445002633b541b04ad5ffc1c70f4c2feeeb13e607057Daniel Dunbar        } else {
445102633b541b04ad5ffc1c70f4c2feeeb13e607057Daniel Dunbar          if (Args.hasArg(options::OPT_static) ||
445202633b541b04ad5ffc1c70f4c2feeeb13e607057Daniel Dunbar              Args.hasArg(options::OPT_object) ||
445302633b541b04ad5ffc1c70f4c2feeeb13e607057Daniel Dunbar              Args.hasArg(options::OPT_preload)) {
445402633b541b04ad5ffc1c70f4c2feeeb13e607057Daniel Dunbar            CmdArgs.push_back("-lcrt0.o");
445502633b541b04ad5ffc1c70f4c2feeeb13e607057Daniel Dunbar          } else {
445602633b541b04ad5ffc1c70f4c2feeeb13e607057Daniel Dunbar            // Derived from darwin_crt1 spec.
44574035580e3475db9013f335ce2b8a49dd1988a79aDaniel Dunbar            if (getDarwinToolChain().isTargetIOSSimulator()) {
44584035580e3475db9013f335ce2b8a49dd1988a79aDaniel Dunbar              // The simulator doesn't have a versioned crt1 file.
44594035580e3475db9013f335ce2b8a49dd1988a79aDaniel Dunbar              CmdArgs.push_back("-lcrt1.o");
44604035580e3475db9013f335ce2b8a49dd1988a79aDaniel Dunbar            } else if (getDarwinToolChain().isTargetIPhoneOS()) {
4461cacb0f007001f7463d44ebd5dde7bfaecf876a71Daniel Dunbar              if (getDarwinToolChain().isIPhoneOSVersionLT(3, 1))
4462cacb0f007001f7463d44ebd5dde7bfaecf876a71Daniel Dunbar                CmdArgs.push_back("-lcrt1.o");
44637a0c064770355a4918df69f95de8dea6338a59a2Daniel Dunbar              else if (getDarwinToolChain().isIPhoneOSVersionLT(6, 0))
4464cacb0f007001f7463d44ebd5dde7bfaecf876a71Daniel Dunbar                CmdArgs.push_back("-lcrt1.3.1.o");
4465ce3fdf233353b10f20d74dceda3d77a82285de17Daniel Dunbar            } else {
4466ce3fdf233353b10f20d74dceda3d77a82285de17Daniel Dunbar              if (getDarwinToolChain().isMacosxVersionLT(10, 5))
4467ce3fdf233353b10f20d74dceda3d77a82285de17Daniel Dunbar                CmdArgs.push_back("-lcrt1.o");
4468ce3fdf233353b10f20d74dceda3d77a82285de17Daniel Dunbar              else if (getDarwinToolChain().isMacosxVersionLT(10, 6))
4469ce3fdf233353b10f20d74dceda3d77a82285de17Daniel Dunbar                CmdArgs.push_back("-lcrt1.10.5.o");
4470ebcb57a8d298862c65043e88b2429591ab3c58d3Ted Kremenek              else if (getDarwinToolChain().isMacosxVersionLT(10, 8))
4471ce3fdf233353b10f20d74dceda3d77a82285de17Daniel Dunbar                CmdArgs.push_back("-lcrt1.10.6.o");
4472c21c485b4fb58ef5d55cf3e523263dd824a2ace4Daniel Dunbar
4473ce3fdf233353b10f20d74dceda3d77a82285de17Daniel Dunbar              // darwin_crt2 spec is empty.
4474ce3fdf233353b10f20d74dceda3d77a82285de17Daniel Dunbar            }
447502633b541b04ad5ffc1c70f4c2feeeb13e607057Daniel Dunbar          }
447602633b541b04ad5ffc1c70f4c2feeeb13e607057Daniel Dunbar        }
447702633b541b04ad5ffc1c70f4c2feeeb13e607057Daniel Dunbar      }
447802633b541b04ad5ffc1c70f4c2feeeb13e607057Daniel Dunbar    }
447902633b541b04ad5ffc1c70f4c2feeeb13e607057Daniel Dunbar
4480ce3fdf233353b10f20d74dceda3d77a82285de17Daniel Dunbar    if (!getDarwinToolChain().isTargetIPhoneOS() &&
4481ce3fdf233353b10f20d74dceda3d77a82285de17Daniel Dunbar        Args.hasArg(options::OPT_shared_libgcc) &&
4482ce3fdf233353b10f20d74dceda3d77a82285de17Daniel Dunbar        getDarwinToolChain().isMacosxVersionLT(10, 5)) {
4483881376467c46c5c6cc16fa6790271c2c22e1d4f1Daniel Dunbar      const char *Str =
44844a7e88978cf646ad10d654020cb00b3877069210Daniel Dunbar        Args.MakeArgString(getToolChain().GetFilePath("crt3.o"));
4485881376467c46c5c6cc16fa6790271c2c22e1d4f1Daniel Dunbar      CmdArgs.push_back(Str);
448602633b541b04ad5ffc1c70f4c2feeeb13e607057Daniel Dunbar    }
448702633b541b04ad5ffc1c70f4c2feeeb13e607057Daniel Dunbar  }
448802633b541b04ad5ffc1c70f4c2feeeb13e607057Daniel Dunbar
448902633b541b04ad5ffc1c70f4c2feeeb13e607057Daniel Dunbar  Args.AddAllArgs(CmdArgs, options::OPT_L);
4490c21c485b4fb58ef5d55cf3e523263dd824a2ace4Daniel Dunbar
4491bb1071c0568db9bd7934e869a53d671632eb9291Alexey Samsonov  SanitizerArgs Sanitize(getToolChain().getDriver(), Args);
44922cb3d300ecd36558bf2201debe28808d12a97be2Alexey Samsonov  // If we're building a dynamic lib with -fsanitize=address,
44932cb3d300ecd36558bf2201debe28808d12a97be2Alexey Samsonov  // unresolved symbols may appear. Mark all
449475fcb193aeeec5c4f10cc39df60a5ce7526b1b28Alexey Samsonov  // of them as dynamic_lookup. Linking executables is handled in
449575fcb193aeeec5c4f10cc39df60a5ce7526b1b28Alexey Samsonov  // lib/Driver/ToolChains.cpp.
44962cb3d300ecd36558bf2201debe28808d12a97be2Alexey Samsonov  if (Sanitize.needsAsanRt()) {
44977b5f1013c5b7f541dc1fae7fc43189377874eabbKostya Serebryany    if (Args.hasArg(options::OPT_dynamiclib) ||
44987b5f1013c5b7f541dc1fae7fc43189377874eabbKostya Serebryany        Args.hasArg(options::OPT_bundle)) {
44997b5f1013c5b7f541dc1fae7fc43189377874eabbKostya Serebryany      CmdArgs.push_back("-undefined");
45007b5f1013c5b7f541dc1fae7fc43189377874eabbKostya Serebryany      CmdArgs.push_back("dynamic_lookup");
45017b5f1013c5b7f541dc1fae7fc43189377874eabbKostya Serebryany    }
45027b5f1013c5b7f541dc1fae7fc43189377874eabbKostya Serebryany  }
45037b5f1013c5b7f541dc1fae7fc43189377874eabbKostya Serebryany
450402633b541b04ad5ffc1c70f4c2feeeb13e607057Daniel Dunbar  if (Args.hasArg(options::OPT_fopenmp))
450502633b541b04ad5ffc1c70f4c2feeeb13e607057Daniel Dunbar    // This is more complicated in gcc...
450602633b541b04ad5ffc1c70f4c2feeeb13e607057Daniel Dunbar    CmdArgs.push_back("-lgomp");
450702633b541b04ad5ffc1c70f4c2feeeb13e607057Daniel Dunbar
450804e326b3d0ae1a84643b7366ce0ea5137e06ed69Douglas Gregor  AddLinkerInputs(getToolChain(), Inputs, Args, CmdArgs);
450904e326b3d0ae1a84643b7366ce0ea5137e06ed69Douglas Gregor
451063d9f3cddee40a3f3e5579e9004b31ec8663b5d9Bob Wilson  if (isObjCRuntimeLinked(Args) &&
451163d9f3cddee40a3f3e5579e9004b31ec8663b5d9Bob Wilson      !Args.hasArg(options::OPT_nostdlib) &&
451263d9f3cddee40a3f3e5579e9004b31ec8663b5d9Bob Wilson      !Args.hasArg(options::OPT_nodefaultlibs)) {
4513ebcb57a8d298862c65043e88b2429591ab3c58d3Ted Kremenek    // Avoid linking compatibility stubs on i386 mac.
4514ebcb57a8d298862c65043e88b2429591ab3c58d3Ted Kremenek    if (!getDarwinToolChain().isTargetMacOS() ||
451564f7ad9328e877779ec63638f39de4e10d2ff276Rafael Espindola        getDarwinToolChain().getArch() != llvm::Triple::x86) {
4516ebcb57a8d298862c65043e88b2429591ab3c58d3Ted Kremenek      // If we don't have ARC or subscripting runtime support, link in the
4517ebcb57a8d298862c65043e88b2429591ab3c58d3Ted Kremenek      // runtime stubs.  We have to do this *before* adding any of the normal
4518ebcb57a8d298862c65043e88b2429591ab3c58d3Ted Kremenek      // linker inputs so that its initializer gets run first.
4519260611a32535c851237926bfcf78869b13c07d5bJohn McCall      ObjCRuntime runtime =
4520260611a32535c851237926bfcf78869b13c07d5bJohn McCall        getDarwinToolChain().getDefaultObjCRuntime(/*nonfragile*/ true);
4521ebcb57a8d298862c65043e88b2429591ab3c58d3Ted Kremenek      // We use arclite library for both ARC and subscripting support.
45220a7dd788dbef975f35f273c7ab913f480f7edd60John McCall      if ((!runtime.hasNativeARC() && isObjCAutoRefCount(Args)) ||
4523260611a32535c851237926bfcf78869b13c07d5bJohn McCall          !runtime.hasSubscripting())
4524ebcb57a8d298862c65043e88b2429591ab3c58d3Ted Kremenek        getDarwinToolChain().AddLinkARCArgs(Args, CmdArgs);
4525ebcb57a8d298862c65043e88b2429591ab3c58d3Ted Kremenek    }
45260b1c7156844f1e0e37766a64879b1d1d77fc5385Bob Wilson    CmdArgs.push_back("-framework");
45270b1c7156844f1e0e37766a64879b1d1d77fc5385Bob Wilson    CmdArgs.push_back("Foundation");
4528ebcb57a8d298862c65043e88b2429591ab3c58d3Ted Kremenek    // Link libobj.
4529ebcb57a8d298862c65043e88b2429591ab3c58d3Ted Kremenek    CmdArgs.push_back("-lobjc");
45309f084a3166b684573ba49df28fc5792bc37d92e1John McCall  }
4531c21c485b4fb58ef5d55cf3e523263dd824a2ace4Daniel Dunbar
453202633b541b04ad5ffc1c70f4c2feeeb13e607057Daniel Dunbar  if (LinkingOutput) {
453302633b541b04ad5ffc1c70f4c2feeeb13e607057Daniel Dunbar    CmdArgs.push_back("-arch_multiple");
453402633b541b04ad5ffc1c70f4c2feeeb13e607057Daniel Dunbar    CmdArgs.push_back("-final_output");
453502633b541b04ad5ffc1c70f4c2feeeb13e607057Daniel Dunbar    CmdArgs.push_back(LinkingOutput);
453602633b541b04ad5ffc1c70f4c2feeeb13e607057Daniel Dunbar  }
453702633b541b04ad5ffc1c70f4c2feeeb13e607057Daniel Dunbar
453802633b541b04ad5ffc1c70f4c2feeeb13e607057Daniel Dunbar  if (Args.hasArg(options::OPT_fnested_functions))
453902633b541b04ad5ffc1c70f4c2feeeb13e607057Daniel Dunbar    CmdArgs.push_back("-allow_stack_execute");
4540c21c485b4fb58ef5d55cf3e523263dd824a2ace4Daniel Dunbar
454102633b541b04ad5ffc1c70f4c2feeeb13e607057Daniel Dunbar  if (!Args.hasArg(options::OPT_nostdlib) &&
454202633b541b04ad5ffc1c70f4c2feeeb13e607057Daniel Dunbar      !Args.hasArg(options::OPT_nodefaultlibs)) {
4543ee788e70fcd0adf76103b17c78ac658d4ea30c9bDaniel Dunbar    if (getToolChain().getDriver().CCCIsCXX)
4544132e35d2f87895d20e7ea146c8c00404b80221a1Daniel Dunbar      getToolChain().AddCXXStdlibLibArgs(Args, CmdArgs);
4545edfa02b85b186e9ea9e0c841539a77ed32ee9148Daniel Dunbar
454602633b541b04ad5ffc1c70f4c2feeeb13e607057Daniel Dunbar    // link_ssp spec is empty.
454702633b541b04ad5ffc1c70f4c2feeeb13e607057Daniel Dunbar
45486cd4154b9088fa18ae05d11c0f3140fafd76c734Daniel Dunbar    // Let the tool chain choose which runtime library to link.
45496cd4154b9088fa18ae05d11c0f3140fafd76c734Daniel Dunbar    getDarwinToolChain().AddLinkRuntimeLibArgs(Args, CmdArgs);
455002633b541b04ad5ffc1c70f4c2feeeb13e607057Daniel Dunbar  }
455102633b541b04ad5ffc1c70f4c2feeeb13e607057Daniel Dunbar
4552189373170330e3d551bdb28c9762d606f3bcb931Chad Rosier  if (!Args.hasArg(options::OPT_nostdlib) &&
455302633b541b04ad5ffc1c70f4c2feeeb13e607057Daniel Dunbar      !Args.hasArg(options::OPT_nostartfiles)) {
455402633b541b04ad5ffc1c70f4c2feeeb13e607057Daniel Dunbar    // endfile_spec is empty.
455502633b541b04ad5ffc1c70f4c2feeeb13e607057Daniel Dunbar  }
455602633b541b04ad5ffc1c70f4c2feeeb13e607057Daniel Dunbar
455702633b541b04ad5ffc1c70f4c2feeeb13e607057Daniel Dunbar  Args.AddAllArgs(CmdArgs, options::OPT_T_Group);
455802633b541b04ad5ffc1c70f4c2feeeb13e607057Daniel Dunbar  Args.AddAllArgs(CmdArgs, options::OPT_F);
455902633b541b04ad5ffc1c70f4c2feeeb13e607057Daniel Dunbar
4560c21c485b4fb58ef5d55cf3e523263dd824a2ace4Daniel Dunbar  const char *Exec =
45614a7e88978cf646ad10d654020cb00b3877069210Daniel Dunbar    Args.MakeArgString(getToolChain().GetProgramPath("ld"));
45622fe238ed293bd4bc27af9beb9fa151fad2146fa8Daniel Dunbar  C.addCommand(new Command(JA, *this, Exec, CmdArgs));
456302633b541b04ad5ffc1c70f4c2feeeb13e607057Daniel Dunbar}
456402633b541b04ad5ffc1c70f4c2feeeb13e607057Daniel Dunbar
4565ff7488dc9a766f94daf54d81b03ab9160d0bfd88Daniel Dunbarvoid darwin::Lipo::ConstructJob(Compilation &C, const JobAction &JA,
45662fe238ed293bd4bc27af9beb9fa151fad2146fa8Daniel Dunbar                                const InputInfo &Output,
4567c21c485b4fb58ef5d55cf3e523263dd824a2ace4Daniel Dunbar                                const InputInfoList &Inputs,
4568c21c485b4fb58ef5d55cf3e523263dd824a2ace4Daniel Dunbar                                const ArgList &Args,
4569ff7488dc9a766f94daf54d81b03ab9160d0bfd88Daniel Dunbar                                const char *LinkingOutput) const {
4570ff7488dc9a766f94daf54d81b03ab9160d0bfd88Daniel Dunbar  ArgStringList CmdArgs;
4571ff7488dc9a766f94daf54d81b03ab9160d0bfd88Daniel Dunbar
4572ff7488dc9a766f94daf54d81b03ab9160d0bfd88Daniel Dunbar  CmdArgs.push_back("-create");
4573ff7488dc9a766f94daf54d81b03ab9160d0bfd88Daniel Dunbar  assert(Output.isFilename() && "Unexpected lipo output.");
4574a428df828ea4cc6916ea90dcd9fbbc840776d207Daniel Dunbar
4575a428df828ea4cc6916ea90dcd9fbbc840776d207Daniel Dunbar  CmdArgs.push_back("-output");
4576ff7488dc9a766f94daf54d81b03ab9160d0bfd88Daniel Dunbar  CmdArgs.push_back(Output.getFilename());
4577a428df828ea4cc6916ea90dcd9fbbc840776d207Daniel Dunbar
4578ff7488dc9a766f94daf54d81b03ab9160d0bfd88Daniel Dunbar  for (InputInfoList::const_iterator
4579ff7488dc9a766f94daf54d81b03ab9160d0bfd88Daniel Dunbar         it = Inputs.begin(), ie = Inputs.end(); it != ie; ++it) {
4580ff7488dc9a766f94daf54d81b03ab9160d0bfd88Daniel Dunbar    const InputInfo &II = *it;
4581ff7488dc9a766f94daf54d81b03ab9160d0bfd88Daniel Dunbar    assert(II.isFilename() && "Unexpected lipo input.");
4582ff7488dc9a766f94daf54d81b03ab9160d0bfd88Daniel Dunbar    CmdArgs.push_back(II.getFilename());
4583ff7488dc9a766f94daf54d81b03ab9160d0bfd88Daniel Dunbar  }
4584c21c485b4fb58ef5d55cf3e523263dd824a2ace4Daniel Dunbar  const char *Exec =
45854a7e88978cf646ad10d654020cb00b3877069210Daniel Dunbar    Args.MakeArgString(getToolChain().GetProgramPath("lipo"));
45862fe238ed293bd4bc27af9beb9fa151fad2146fa8Daniel Dunbar  C.addCommand(new Command(JA, *this, Exec, CmdArgs));
4587ff7488dc9a766f94daf54d81b03ab9160d0bfd88Daniel Dunbar}
458868a31d406c6dc4382c700d1199b062de2aa7e1daDaniel Dunbar
45896e0f25483b1a801cd1155ea89c2b725feab16332Daniel Dunbarvoid darwin::Dsymutil::ConstructJob(Compilation &C, const JobAction &JA,
45902fe238ed293bd4bc27af9beb9fa151fad2146fa8Daniel Dunbar                                    const InputInfo &Output,
45916e0f25483b1a801cd1155ea89c2b725feab16332Daniel Dunbar                                    const InputInfoList &Inputs,
45926e0f25483b1a801cd1155ea89c2b725feab16332Daniel Dunbar                                    const ArgList &Args,
45936e0f25483b1a801cd1155ea89c2b725feab16332Daniel Dunbar                                    const char *LinkingOutput) const {
45946e0f25483b1a801cd1155ea89c2b725feab16332Daniel Dunbar  ArgStringList CmdArgs;
45956e0f25483b1a801cd1155ea89c2b725feab16332Daniel Dunbar
459603e92303e6e9d366ff35388b982eea7f7db33e62Daniel Dunbar  CmdArgs.push_back("-o");
459703e92303e6e9d366ff35388b982eea7f7db33e62Daniel Dunbar  CmdArgs.push_back(Output.getFilename());
459803e92303e6e9d366ff35388b982eea7f7db33e62Daniel Dunbar
45996e0f25483b1a801cd1155ea89c2b725feab16332Daniel Dunbar  assert(Inputs.size() == 1 && "Unable to handle multiple inputs.");
46006e0f25483b1a801cd1155ea89c2b725feab16332Daniel Dunbar  const InputInfo &Input = Inputs[0];
46016e0f25483b1a801cd1155ea89c2b725feab16332Daniel Dunbar  assert(Input.isFilename() && "Unexpected dsymutil input.");
46026e0f25483b1a801cd1155ea89c2b725feab16332Daniel Dunbar  CmdArgs.push_back(Input.getFilename());
46036e0f25483b1a801cd1155ea89c2b725feab16332Daniel Dunbar
46046e0f25483b1a801cd1155ea89c2b725feab16332Daniel Dunbar  const char *Exec =
46054a7e88978cf646ad10d654020cb00b3877069210Daniel Dunbar    Args.MakeArgString(getToolChain().GetProgramPath("dsymutil"));
46062fe238ed293bd4bc27af9beb9fa151fad2146fa8Daniel Dunbar  C.addCommand(new Command(JA, *this, Exec, CmdArgs));
46076e0f25483b1a801cd1155ea89c2b725feab16332Daniel Dunbar}
46086e0f25483b1a801cd1155ea89c2b725feab16332Daniel Dunbar
4609f857186fd1995b34185d063a29b11ad4f948519fEric Christophervoid darwin::VerifyDebug::ConstructJob(Compilation &C, const JobAction &JA,
461027e2b983beb8b5a29869639637327725623069a8Eric Christopher                                       const InputInfo &Output,
461127e2b983beb8b5a29869639637327725623069a8Eric Christopher                                       const InputInfoList &Inputs,
461227e2b983beb8b5a29869639637327725623069a8Eric Christopher                                       const ArgList &Args,
461327e2b983beb8b5a29869639637327725623069a8Eric Christopher                                       const char *LinkingOutput) const {
4614f857186fd1995b34185d063a29b11ad4f948519fEric Christopher  ArgStringList CmdArgs;
4615f857186fd1995b34185d063a29b11ad4f948519fEric Christopher  CmdArgs.push_back("--verify");
46161c79dc4086a5fc754689ace567cb7418ed022fccEric Christopher  CmdArgs.push_back("--debug-info");
46171c79dc4086a5fc754689ace567cb7418ed022fccEric Christopher  CmdArgs.push_back("--eh-frame");
4618b822f72c708e235a135fcaf9eb1dba8c20c6a680Eric Christopher  CmdArgs.push_back("--quiet");
4619f857186fd1995b34185d063a29b11ad4f948519fEric Christopher
4620f857186fd1995b34185d063a29b11ad4f948519fEric Christopher  assert(Inputs.size() == 1 && "Unable to handle multiple inputs.");
4621f857186fd1995b34185d063a29b11ad4f948519fEric Christopher  const InputInfo &Input = Inputs[0];
4622f857186fd1995b34185d063a29b11ad4f948519fEric Christopher  assert(Input.isFilename() && "Unexpected verify input");
4623f857186fd1995b34185d063a29b11ad4f948519fEric Christopher
4624f857186fd1995b34185d063a29b11ad4f948519fEric Christopher  // Grabbing the output of the earlier dsymutil run.
4625f857186fd1995b34185d063a29b11ad4f948519fEric Christopher  CmdArgs.push_back(Input.getFilename());
4626f857186fd1995b34185d063a29b11ad4f948519fEric Christopher
4627f857186fd1995b34185d063a29b11ad4f948519fEric Christopher  const char *Exec =
4628f857186fd1995b34185d063a29b11ad4f948519fEric Christopher    Args.MakeArgString(getToolChain().GetProgramPath("dwarfdump"));
4629f857186fd1995b34185d063a29b11ad4f948519fEric Christopher  C.addCommand(new Command(JA, *this, Exec, CmdArgs));
4630f857186fd1995b34185d063a29b11ad4f948519fEric Christopher}
4631f857186fd1995b34185d063a29b11ad4f948519fEric Christopher
463231c4690047f5f362ecf886f1586844b1aef0c4d2David Chisnallvoid solaris::Assemble::ConstructJob(Compilation &C, const JobAction &JA,
463331c4690047f5f362ecf886f1586844b1aef0c4d2David Chisnall                                      const InputInfo &Output,
463431c4690047f5f362ecf886f1586844b1aef0c4d2David Chisnall                                      const InputInfoList &Inputs,
463531c4690047f5f362ecf886f1586844b1aef0c4d2David Chisnall                                      const ArgList &Args,
463631c4690047f5f362ecf886f1586844b1aef0c4d2David Chisnall                                      const char *LinkingOutput) const {
463731c4690047f5f362ecf886f1586844b1aef0c4d2David Chisnall  ArgStringList CmdArgs;
463831c4690047f5f362ecf886f1586844b1aef0c4d2David Chisnall
463931c4690047f5f362ecf886f1586844b1aef0c4d2David Chisnall  Args.AddAllArgValues(CmdArgs, options::OPT_Wa_COMMA,
464031c4690047f5f362ecf886f1586844b1aef0c4d2David Chisnall                       options::OPT_Xassembler);
464131c4690047f5f362ecf886f1586844b1aef0c4d2David Chisnall
464231c4690047f5f362ecf886f1586844b1aef0c4d2David Chisnall  CmdArgs.push_back("-o");
464331c4690047f5f362ecf886f1586844b1aef0c4d2David Chisnall  CmdArgs.push_back(Output.getFilename());
464431c4690047f5f362ecf886f1586844b1aef0c4d2David Chisnall
464531c4690047f5f362ecf886f1586844b1aef0c4d2David Chisnall  for (InputInfoList::const_iterator
464631c4690047f5f362ecf886f1586844b1aef0c4d2David Chisnall         it = Inputs.begin(), ie = Inputs.end(); it != ie; ++it) {
464731c4690047f5f362ecf886f1586844b1aef0c4d2David Chisnall    const InputInfo &II = *it;
464831c4690047f5f362ecf886f1586844b1aef0c4d2David Chisnall    CmdArgs.push_back(II.getFilename());
464931c4690047f5f362ecf886f1586844b1aef0c4d2David Chisnall  }
465031c4690047f5f362ecf886f1586844b1aef0c4d2David Chisnall
465131c4690047f5f362ecf886f1586844b1aef0c4d2David Chisnall  const char *Exec =
465231c4690047f5f362ecf886f1586844b1aef0c4d2David Chisnall    Args.MakeArgString(getToolChain().GetProgramPath("as"));
465331c4690047f5f362ecf886f1586844b1aef0c4d2David Chisnall  C.addCommand(new Command(JA, *this, Exec, CmdArgs));
465431c4690047f5f362ecf886f1586844b1aef0c4d2David Chisnall}
465531c4690047f5f362ecf886f1586844b1aef0c4d2David Chisnall
465631c4690047f5f362ecf886f1586844b1aef0c4d2David Chisnall
465731c4690047f5f362ecf886f1586844b1aef0c4d2David Chisnallvoid solaris::Link::ConstructJob(Compilation &C, const JobAction &JA,
465831c4690047f5f362ecf886f1586844b1aef0c4d2David Chisnall                                  const InputInfo &Output,
465931c4690047f5f362ecf886f1586844b1aef0c4d2David Chisnall                                  const InputInfoList &Inputs,
466031c4690047f5f362ecf886f1586844b1aef0c4d2David Chisnall                                  const ArgList &Args,
466131c4690047f5f362ecf886f1586844b1aef0c4d2David Chisnall                                  const char *LinkingOutput) const {
466231c4690047f5f362ecf886f1586844b1aef0c4d2David Chisnall  // FIXME: Find a real GCC, don't hard-code versions here
466331c4690047f5f362ecf886f1586844b1aef0c4d2David Chisnall  std::string GCCLibPath = "/usr/gcc/4.5/lib/gcc/";
466431c4690047f5f362ecf886f1586844b1aef0c4d2David Chisnall  const llvm::Triple &T = getToolChain().getTriple();
466531c4690047f5f362ecf886f1586844b1aef0c4d2David Chisnall  std::string LibPath = "/usr/lib/";
466631c4690047f5f362ecf886f1586844b1aef0c4d2David Chisnall  llvm::Triple::ArchType Arch = T.getArch();
466731c4690047f5f362ecf886f1586844b1aef0c4d2David Chisnall  switch (Arch) {
466831c4690047f5f362ecf886f1586844b1aef0c4d2David Chisnall        case llvm::Triple::x86:
466931c4690047f5f362ecf886f1586844b1aef0c4d2David Chisnall          GCCLibPath += ("i386-" + T.getVendorName() + "-" +
467031c4690047f5f362ecf886f1586844b1aef0c4d2David Chisnall              T.getOSName()).str() + "/4.5.2/";
467131c4690047f5f362ecf886f1586844b1aef0c4d2David Chisnall          break;
467231c4690047f5f362ecf886f1586844b1aef0c4d2David Chisnall        case llvm::Triple::x86_64:
467331c4690047f5f362ecf886f1586844b1aef0c4d2David Chisnall          GCCLibPath += ("i386-" + T.getVendorName() + "-" +
467431c4690047f5f362ecf886f1586844b1aef0c4d2David Chisnall              T.getOSName()).str();
467531c4690047f5f362ecf886f1586844b1aef0c4d2David Chisnall          GCCLibPath += "/4.5.2/amd64/";
467631c4690047f5f362ecf886f1586844b1aef0c4d2David Chisnall          LibPath += "amd64/";
467731c4690047f5f362ecf886f1586844b1aef0c4d2David Chisnall          break;
467831c4690047f5f362ecf886f1586844b1aef0c4d2David Chisnall        default:
467931c4690047f5f362ecf886f1586844b1aef0c4d2David Chisnall          assert(0 && "Unsupported architecture");
468031c4690047f5f362ecf886f1586844b1aef0c4d2David Chisnall  }
468131c4690047f5f362ecf886f1586844b1aef0c4d2David Chisnall
468231c4690047f5f362ecf886f1586844b1aef0c4d2David Chisnall  ArgStringList CmdArgs;
468331c4690047f5f362ecf886f1586844b1aef0c4d2David Chisnall
468441d476d307973cefddeee5661b0573a2cf1b0f24David Chisnall  // Demangle C++ names in errors
468541d476d307973cefddeee5661b0573a2cf1b0f24David Chisnall  CmdArgs.push_back("-C");
468641d476d307973cefddeee5661b0573a2cf1b0f24David Chisnall
468731c4690047f5f362ecf886f1586844b1aef0c4d2David Chisnall  if ((!Args.hasArg(options::OPT_nostdlib)) &&
468831c4690047f5f362ecf886f1586844b1aef0c4d2David Chisnall      (!Args.hasArg(options::OPT_shared))) {
468931c4690047f5f362ecf886f1586844b1aef0c4d2David Chisnall    CmdArgs.push_back("-e");
469031c4690047f5f362ecf886f1586844b1aef0c4d2David Chisnall    CmdArgs.push_back("_start");
469131c4690047f5f362ecf886f1586844b1aef0c4d2David Chisnall  }
469231c4690047f5f362ecf886f1586844b1aef0c4d2David Chisnall
469331c4690047f5f362ecf886f1586844b1aef0c4d2David Chisnall  if (Args.hasArg(options::OPT_static)) {
469431c4690047f5f362ecf886f1586844b1aef0c4d2David Chisnall    CmdArgs.push_back("-Bstatic");
469531c4690047f5f362ecf886f1586844b1aef0c4d2David Chisnall    CmdArgs.push_back("-dn");
469631c4690047f5f362ecf886f1586844b1aef0c4d2David Chisnall  } else {
469731c4690047f5f362ecf886f1586844b1aef0c4d2David Chisnall    CmdArgs.push_back("-Bdynamic");
469831c4690047f5f362ecf886f1586844b1aef0c4d2David Chisnall    if (Args.hasArg(options::OPT_shared)) {
469931c4690047f5f362ecf886f1586844b1aef0c4d2David Chisnall      CmdArgs.push_back("-shared");
470031c4690047f5f362ecf886f1586844b1aef0c4d2David Chisnall    } else {
470131c4690047f5f362ecf886f1586844b1aef0c4d2David Chisnall      CmdArgs.push_back("--dynamic-linker");
470231c4690047f5f362ecf886f1586844b1aef0c4d2David Chisnall      CmdArgs.push_back(Args.MakeArgString(LibPath + "ld.so.1"));
470331c4690047f5f362ecf886f1586844b1aef0c4d2David Chisnall    }
470431c4690047f5f362ecf886f1586844b1aef0c4d2David Chisnall  }
470531c4690047f5f362ecf886f1586844b1aef0c4d2David Chisnall
470631c4690047f5f362ecf886f1586844b1aef0c4d2David Chisnall  if (Output.isFilename()) {
470731c4690047f5f362ecf886f1586844b1aef0c4d2David Chisnall    CmdArgs.push_back("-o");
470831c4690047f5f362ecf886f1586844b1aef0c4d2David Chisnall    CmdArgs.push_back(Output.getFilename());
470931c4690047f5f362ecf886f1586844b1aef0c4d2David Chisnall  } else {
471031c4690047f5f362ecf886f1586844b1aef0c4d2David Chisnall    assert(Output.isNothing() && "Invalid output.");
471131c4690047f5f362ecf886f1586844b1aef0c4d2David Chisnall  }
471231c4690047f5f362ecf886f1586844b1aef0c4d2David Chisnall
471331c4690047f5f362ecf886f1586844b1aef0c4d2David Chisnall  if (!Args.hasArg(options::OPT_nostdlib) &&
471431c4690047f5f362ecf886f1586844b1aef0c4d2David Chisnall      !Args.hasArg(options::OPT_nostartfiles)) {
471531c4690047f5f362ecf886f1586844b1aef0c4d2David Chisnall    if (!Args.hasArg(options::OPT_shared)) {
471631c4690047f5f362ecf886f1586844b1aef0c4d2David Chisnall      CmdArgs.push_back(Args.MakeArgString(LibPath + "crt1.o"));
471731c4690047f5f362ecf886f1586844b1aef0c4d2David Chisnall      CmdArgs.push_back(Args.MakeArgString(LibPath + "crti.o"));
4718165329c1d134d000904d6e08b1d166bf34e05517David Chisnall      CmdArgs.push_back(Args.MakeArgString(LibPath + "values-Xa.o"));
471931c4690047f5f362ecf886f1586844b1aef0c4d2David Chisnall      CmdArgs.push_back(Args.MakeArgString(GCCLibPath + "crtbegin.o"));
472031c4690047f5f362ecf886f1586844b1aef0c4d2David Chisnall    } else {
472131c4690047f5f362ecf886f1586844b1aef0c4d2David Chisnall      CmdArgs.push_back(Args.MakeArgString(LibPath + "crti.o"));
4722165329c1d134d000904d6e08b1d166bf34e05517David Chisnall      CmdArgs.push_back(Args.MakeArgString(LibPath + "values-Xa.o"));
4723165329c1d134d000904d6e08b1d166bf34e05517David Chisnall      CmdArgs.push_back(Args.MakeArgString(GCCLibPath + "crtbegin.o"));
472431c4690047f5f362ecf886f1586844b1aef0c4d2David Chisnall    }
4725e6dd683d99b14ff8cd886cd81e6588cd1883ca52David Chisnall    if (getToolChain().getDriver().CCCIsCXX)
4726e6dd683d99b14ff8cd886cd81e6588cd1883ca52David Chisnall      CmdArgs.push_back(Args.MakeArgString(LibPath + "cxa_finalize.o"));
472731c4690047f5f362ecf886f1586844b1aef0c4d2David Chisnall  }
472831c4690047f5f362ecf886f1586844b1aef0c4d2David Chisnall
472931c4690047f5f362ecf886f1586844b1aef0c4d2David Chisnall  CmdArgs.push_back(Args.MakeArgString("-L" + GCCLibPath));
473031c4690047f5f362ecf886f1586844b1aef0c4d2David Chisnall
473131c4690047f5f362ecf886f1586844b1aef0c4d2David Chisnall  Args.AddAllArgs(CmdArgs, options::OPT_L);
473231c4690047f5f362ecf886f1586844b1aef0c4d2David Chisnall  Args.AddAllArgs(CmdArgs, options::OPT_T_Group);
473331c4690047f5f362ecf886f1586844b1aef0c4d2David Chisnall  Args.AddAllArgs(CmdArgs, options::OPT_e);
4734165329c1d134d000904d6e08b1d166bf34e05517David Chisnall  Args.AddAllArgs(CmdArgs, options::OPT_r);
473531c4690047f5f362ecf886f1586844b1aef0c4d2David Chisnall
473631c4690047f5f362ecf886f1586844b1aef0c4d2David Chisnall  AddLinkerInputs(getToolChain(), Inputs, Args, CmdArgs);
473731c4690047f5f362ecf886f1586844b1aef0c4d2David Chisnall
473831c4690047f5f362ecf886f1586844b1aef0c4d2David Chisnall  if (!Args.hasArg(options::OPT_nostdlib) &&
473931c4690047f5f362ecf886f1586844b1aef0c4d2David Chisnall      !Args.hasArg(options::OPT_nodefaultlibs)) {
4740e58e6f9114e61f0e490b5dc1c4f20b23a30f12dcDavid Chisnall    if (getToolChain().getDriver().CCCIsCXX)
4741e58e6f9114e61f0e490b5dc1c4f20b23a30f12dcDavid Chisnall      getToolChain().AddCXXStdlibLibArgs(Args, CmdArgs);
4742b622959527c07cc6b68739eac1412f75f0ca77faDavid Chisnall    CmdArgs.push_back("-lgcc_s");
4743165329c1d134d000904d6e08b1d166bf34e05517David Chisnall    if (!Args.hasArg(options::OPT_shared)) {
4744165329c1d134d000904d6e08b1d166bf34e05517David Chisnall      CmdArgs.push_back("-lgcc");
474531c4690047f5f362ecf886f1586844b1aef0c4d2David Chisnall      CmdArgs.push_back("-lc");
47467dbefe1b1ffbe1d69cc94d07368065976baa49a1David Chisnall      CmdArgs.push_back("-lm");
4747165329c1d134d000904d6e08b1d166bf34e05517David Chisnall    }
474831c4690047f5f362ecf886f1586844b1aef0c4d2David Chisnall  }
474931c4690047f5f362ecf886f1586844b1aef0c4d2David Chisnall
475031c4690047f5f362ecf886f1586844b1aef0c4d2David Chisnall  if (!Args.hasArg(options::OPT_nostdlib) &&
475131c4690047f5f362ecf886f1586844b1aef0c4d2David Chisnall      !Args.hasArg(options::OPT_nostartfiles)) {
4752165329c1d134d000904d6e08b1d166bf34e05517David Chisnall    CmdArgs.push_back(Args.MakeArgString(GCCLibPath + "crtend.o"));
475331c4690047f5f362ecf886f1586844b1aef0c4d2David Chisnall  }
4754d1ac03ebac3ab5a8456b955e3f8634f786843f9aDavid Chisnall  CmdArgs.push_back(Args.MakeArgString(LibPath + "crtn.o"));
475531c4690047f5f362ecf886f1586844b1aef0c4d2David Chisnall
475631c4690047f5f362ecf886f1586844b1aef0c4d2David Chisnall  addProfileRT(getToolChain(), Args, CmdArgs, getToolChain().getTriple());
475731c4690047f5f362ecf886f1586844b1aef0c4d2David Chisnall
475831c4690047f5f362ecf886f1586844b1aef0c4d2David Chisnall  const char *Exec =
475931c4690047f5f362ecf886f1586844b1aef0c4d2David Chisnall    Args.MakeArgString(getToolChain().GetProgramPath("ld"));
476031c4690047f5f362ecf886f1586844b1aef0c4d2David Chisnall  C.addCommand(new Command(JA, *this, Exec, CmdArgs));
476131c4690047f5f362ecf886f1586844b1aef0c4d2David Chisnall}
476231c4690047f5f362ecf886f1586844b1aef0c4d2David Chisnall
4763e7925a075f110ab21afeae084670a155dea568e3Edward O'Callaghanvoid auroraux::Assemble::ConstructJob(Compilation &C, const JobAction &JA,
47642fe238ed293bd4bc27af9beb9fa151fad2146fa8Daniel Dunbar                                      const InputInfo &Output,
4765294691eb1caf551083acd7b08630ef21c3fd760dDaniel Dunbar                                      const InputInfoList &Inputs,
4766294691eb1caf551083acd7b08630ef21c3fd760dDaniel Dunbar                                      const ArgList &Args,
4767294691eb1caf551083acd7b08630ef21c3fd760dDaniel Dunbar                                      const char *LinkingOutput) const {
4768e7925a075f110ab21afeae084670a155dea568e3Edward O'Callaghan  ArgStringList CmdArgs;
4769e7925a075f110ab21afeae084670a155dea568e3Edward O'Callaghan
4770e7925a075f110ab21afeae084670a155dea568e3Edward O'Callaghan  Args.AddAllArgValues(CmdArgs, options::OPT_Wa_COMMA,
4771e7925a075f110ab21afeae084670a155dea568e3Edward O'Callaghan                       options::OPT_Xassembler);
4772e7925a075f110ab21afeae084670a155dea568e3Edward O'Callaghan
4773e7925a075f110ab21afeae084670a155dea568e3Edward O'Callaghan  CmdArgs.push_back("-o");
47747c1e46533cae07216e2a67d5636a5afb44253155Daniel Dunbar  CmdArgs.push_back(Output.getFilename());
4775e7925a075f110ab21afeae084670a155dea568e3Edward O'Callaghan
4776e7925a075f110ab21afeae084670a155dea568e3Edward O'Callaghan  for (InputInfoList::const_iterator
4777e7925a075f110ab21afeae084670a155dea568e3Edward O'Callaghan         it = Inputs.begin(), ie = Inputs.end(); it != ie; ++it) {
4778e7925a075f110ab21afeae084670a155dea568e3Edward O'Callaghan    const InputInfo &II = *it;
47797c1e46533cae07216e2a67d5636a5afb44253155Daniel Dunbar    CmdArgs.push_back(II.getFilename());
4780e7925a075f110ab21afeae084670a155dea568e3Edward O'Callaghan  }
4781e7925a075f110ab21afeae084670a155dea568e3Edward O'Callaghan
4782e7925a075f110ab21afeae084670a155dea568e3Edward O'Callaghan  const char *Exec =
47834a7e88978cf646ad10d654020cb00b3877069210Daniel Dunbar    Args.MakeArgString(getToolChain().GetProgramPath("gas"));
47842fe238ed293bd4bc27af9beb9fa151fad2146fa8Daniel Dunbar  C.addCommand(new Command(JA, *this, Exec, CmdArgs));
4785e7925a075f110ab21afeae084670a155dea568e3Edward O'Callaghan}
4786e7925a075f110ab21afeae084670a155dea568e3Edward O'Callaghan
4787e7925a075f110ab21afeae084670a155dea568e3Edward O'Callaghanvoid auroraux::Link::ConstructJob(Compilation &C, const JobAction &JA,
47882fe238ed293bd4bc27af9beb9fa151fad2146fa8Daniel Dunbar                                  const InputInfo &Output,
4789294691eb1caf551083acd7b08630ef21c3fd760dDaniel Dunbar                                  const InputInfoList &Inputs,
4790294691eb1caf551083acd7b08630ef21c3fd760dDaniel Dunbar                                  const ArgList &Args,
4791294691eb1caf551083acd7b08630ef21c3fd760dDaniel Dunbar                                  const char *LinkingOutput) const {
4792e7925a075f110ab21afeae084670a155dea568e3Edward O'Callaghan  ArgStringList CmdArgs;
4793e7925a075f110ab21afeae084670a155dea568e3Edward O'Callaghan
4794e7925a075f110ab21afeae084670a155dea568e3Edward O'Callaghan  if ((!Args.hasArg(options::OPT_nostdlib)) &&
4795294691eb1caf551083acd7b08630ef21c3fd760dDaniel Dunbar      (!Args.hasArg(options::OPT_shared))) {
4796e7925a075f110ab21afeae084670a155dea568e3Edward O'Callaghan    CmdArgs.push_back("-e");
47977adf94906e23eae295a006659c55eab9ffcf8b37Edward O'Callaghan    CmdArgs.push_back("_start");
4798e7925a075f110ab21afeae084670a155dea568e3Edward O'Callaghan  }
4799e7925a075f110ab21afeae084670a155dea568e3Edward O'Callaghan
4800e7925a075f110ab21afeae084670a155dea568e3Edward O'Callaghan  if (Args.hasArg(options::OPT_static)) {
4801e7925a075f110ab21afeae084670a155dea568e3Edward O'Callaghan    CmdArgs.push_back("-Bstatic");
48027adf94906e23eae295a006659c55eab9ffcf8b37Edward O'Callaghan    CmdArgs.push_back("-dn");
4803e7925a075f110ab21afeae084670a155dea568e3Edward O'Callaghan  } else {
48047adf94906e23eae295a006659c55eab9ffcf8b37Edward O'Callaghan//    CmdArgs.push_back("--eh-frame-hdr");
4805e7925a075f110ab21afeae084670a155dea568e3Edward O'Callaghan    CmdArgs.push_back("-Bdynamic");
4806e7925a075f110ab21afeae084670a155dea568e3Edward O'Callaghan    if (Args.hasArg(options::OPT_shared)) {
4807e7925a075f110ab21afeae084670a155dea568e3Edward O'Callaghan      CmdArgs.push_back("-shared");
4808e7925a075f110ab21afeae084670a155dea568e3Edward O'Callaghan    } else {
48093cecc19f606ba1000da885b8ff4c089abad224ddEdward O'Callaghan      CmdArgs.push_back("--dynamic-linker");
4810e7925a075f110ab21afeae084670a155dea568e3Edward O'Callaghan      CmdArgs.push_back("/lib/ld.so.1"); // 64Bit Path /lib/amd64/ld.so.1
4811e7925a075f110ab21afeae084670a155dea568e3Edward O'Callaghan    }
4812e7925a075f110ab21afeae084670a155dea568e3Edward O'Callaghan  }
4813e7925a075f110ab21afeae084670a155dea568e3Edward O'Callaghan
48147c1e46533cae07216e2a67d5636a5afb44253155Daniel Dunbar  if (Output.isFilename()) {
4815e7925a075f110ab21afeae084670a155dea568e3Edward O'Callaghan    CmdArgs.push_back("-o");
4816e7925a075f110ab21afeae084670a155dea568e3Edward O'Callaghan    CmdArgs.push_back(Output.getFilename());
4817e7925a075f110ab21afeae084670a155dea568e3Edward O'Callaghan  } else {
4818e7925a075f110ab21afeae084670a155dea568e3Edward O'Callaghan    assert(Output.isNothing() && "Invalid output.");
4819e7925a075f110ab21afeae084670a155dea568e3Edward O'Callaghan  }
4820e7925a075f110ab21afeae084670a155dea568e3Edward O'Callaghan
4821e7925a075f110ab21afeae084670a155dea568e3Edward O'Callaghan  if (!Args.hasArg(options::OPT_nostdlib) &&
4822e7925a075f110ab21afeae084670a155dea568e3Edward O'Callaghan      !Args.hasArg(options::OPT_nostartfiles)) {
4823e7925a075f110ab21afeae084670a155dea568e3Edward O'Callaghan    if (!Args.hasArg(options::OPT_shared)) {
482438e317d6dce161b249508686cc67eb7176958762Chris Lattner      CmdArgs.push_back(Args.MakeArgString(
48254a7e88978cf646ad10d654020cb00b3877069210Daniel Dunbar                                getToolChain().GetFilePath("crt1.o")));
482638e317d6dce161b249508686cc67eb7176958762Chris Lattner      CmdArgs.push_back(Args.MakeArgString(
48274a7e88978cf646ad10d654020cb00b3877069210Daniel Dunbar                                getToolChain().GetFilePath("crti.o")));
482838e317d6dce161b249508686cc67eb7176958762Chris Lattner      CmdArgs.push_back(Args.MakeArgString(
48294a7e88978cf646ad10d654020cb00b3877069210Daniel Dunbar                                getToolChain().GetFilePath("crtbegin.o")));
4830e7925a075f110ab21afeae084670a155dea568e3Edward O'Callaghan    } else {
483138e317d6dce161b249508686cc67eb7176958762Chris Lattner      CmdArgs.push_back(Args.MakeArgString(
48324a7e88978cf646ad10d654020cb00b3877069210Daniel Dunbar                                getToolChain().GetFilePath("crti.o")));
4833e7925a075f110ab21afeae084670a155dea568e3Edward O'Callaghan    }
483438e317d6dce161b249508686cc67eb7176958762Chris Lattner    CmdArgs.push_back(Args.MakeArgString(
48354a7e88978cf646ad10d654020cb00b3877069210Daniel Dunbar                                getToolChain().GetFilePath("crtn.o")));
4836e7925a075f110ab21afeae084670a155dea568e3Edward O'Callaghan  }
4837e7925a075f110ab21afeae084670a155dea568e3Edward O'Callaghan
4838294691eb1caf551083acd7b08630ef21c3fd760dDaniel Dunbar  CmdArgs.push_back(Args.MakeArgString("-L/opt/gcc4/lib/gcc/"
4839294691eb1caf551083acd7b08630ef21c3fd760dDaniel Dunbar                                       + getToolChain().getTripleString()
4840f7fb31f4751c9c5ac3d9f93c19ec05a74dd9546fDaniel Dunbar                                       + "/4.2.4"));
4841e7925a075f110ab21afeae084670a155dea568e3Edward O'Callaghan
4842e7925a075f110ab21afeae084670a155dea568e3Edward O'Callaghan  Args.AddAllArgs(CmdArgs, options::OPT_L);
4843e7925a075f110ab21afeae084670a155dea568e3Edward O'Callaghan  Args.AddAllArgs(CmdArgs, options::OPT_T_Group);
4844e7925a075f110ab21afeae084670a155dea568e3Edward O'Callaghan  Args.AddAllArgs(CmdArgs, options::OPT_e);
4845e7925a075f110ab21afeae084670a155dea568e3Edward O'Callaghan
48462008feead855f08500fb01ff43ef5eebee05d1e5Daniel Dunbar  AddLinkerInputs(getToolChain(), Inputs, Args, CmdArgs);
4847e7925a075f110ab21afeae084670a155dea568e3Edward O'Callaghan
4848e7925a075f110ab21afeae084670a155dea568e3Edward O'Callaghan  if (!Args.hasArg(options::OPT_nostdlib) &&
4849e7925a075f110ab21afeae084670a155dea568e3Edward O'Callaghan      !Args.hasArg(options::OPT_nodefaultlibs)) {
4850e7925a075f110ab21afeae084670a155dea568e3Edward O'Callaghan    // FIXME: For some reason GCC passes -lgcc before adding
4851e7925a075f110ab21afeae084670a155dea568e3Edward O'Callaghan    // the default system libraries. Just mimic this for now.
4852e7925a075f110ab21afeae084670a155dea568e3Edward O'Callaghan    CmdArgs.push_back("-lgcc");
4853e7925a075f110ab21afeae084670a155dea568e3Edward O'Callaghan
4854e7925a075f110ab21afeae084670a155dea568e3Edward O'Callaghan    if (Args.hasArg(options::OPT_pthread))
4855e7925a075f110ab21afeae084670a155dea568e3Edward O'Callaghan      CmdArgs.push_back("-pthread");
4856e7925a075f110ab21afeae084670a155dea568e3Edward O'Callaghan    if (!Args.hasArg(options::OPT_shared))
4857e7925a075f110ab21afeae084670a155dea568e3Edward O'Callaghan      CmdArgs.push_back("-lc");
4858e7925a075f110ab21afeae084670a155dea568e3Edward O'Callaghan    CmdArgs.push_back("-lgcc");
4859e7925a075f110ab21afeae084670a155dea568e3Edward O'Callaghan  }
4860e7925a075f110ab21afeae084670a155dea568e3Edward O'Callaghan
4861e7925a075f110ab21afeae084670a155dea568e3Edward O'Callaghan  if (!Args.hasArg(options::OPT_nostdlib) &&
4862e7925a075f110ab21afeae084670a155dea568e3Edward O'Callaghan      !Args.hasArg(options::OPT_nostartfiles)) {
4863e7925a075f110ab21afeae084670a155dea568e3Edward O'Callaghan    if (!Args.hasArg(options::OPT_shared))
486438e317d6dce161b249508686cc67eb7176958762Chris Lattner      CmdArgs.push_back(Args.MakeArgString(
48654a7e88978cf646ad10d654020cb00b3877069210Daniel Dunbar                                getToolChain().GetFilePath("crtend.o")));
4866e7925a075f110ab21afeae084670a155dea568e3Edward O'Callaghan  }
4867e7925a075f110ab21afeae084670a155dea568e3Edward O'Callaghan
48683f4be6fb8872942f567166ab8d99c89885f26103Bill Wendling  addProfileRT(getToolChain(), Args, CmdArgs, getToolChain().getTriple());
48692e95a6d7d0b5aed39747875d7474c27824f7319fNick Lewycky
4870e7925a075f110ab21afeae084670a155dea568e3Edward O'Callaghan  const char *Exec =
48714a7e88978cf646ad10d654020cb00b3877069210Daniel Dunbar    Args.MakeArgString(getToolChain().GetProgramPath("ld"));
48722fe238ed293bd4bc27af9beb9fa151fad2146fa8Daniel Dunbar  C.addCommand(new Command(JA, *this, Exec, CmdArgs));
4873e7925a075f110ab21afeae084670a155dea568e3Edward O'Callaghan}
4874e7925a075f110ab21afeae084670a155dea568e3Edward O'Callaghan
4875f7b8eec37c8c8012fa525c71fb29a58c9f29beefDaniel Dunbarvoid openbsd::Assemble::ConstructJob(Compilation &C, const JobAction &JA,
48762fe238ed293bd4bc27af9beb9fa151fad2146fa8Daniel Dunbar                                     const InputInfo &Output,
4877f7b8eec37c8c8012fa525c71fb29a58c9f29beefDaniel Dunbar                                     const InputInfoList &Inputs,
4878f7b8eec37c8c8012fa525c71fb29a58c9f29beefDaniel Dunbar                                     const ArgList &Args,
48791eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump                                     const char *LinkingOutput) const {
4880f7b8eec37c8c8012fa525c71fb29a58c9f29beefDaniel Dunbar  ArgStringList CmdArgs;
4881f7b8eec37c8c8012fa525c71fb29a58c9f29beefDaniel Dunbar
4882f7b8eec37c8c8012fa525c71fb29a58c9f29beefDaniel Dunbar  Args.AddAllArgValues(CmdArgs, options::OPT_Wa_COMMA,
4883f7b8eec37c8c8012fa525c71fb29a58c9f29beefDaniel Dunbar                       options::OPT_Xassembler);
4884f7b8eec37c8c8012fa525c71fb29a58c9f29beefDaniel Dunbar
4885f7b8eec37c8c8012fa525c71fb29a58c9f29beefDaniel Dunbar  CmdArgs.push_back("-o");
48867c1e46533cae07216e2a67d5636a5afb44253155Daniel Dunbar  CmdArgs.push_back(Output.getFilename());
4887f7b8eec37c8c8012fa525c71fb29a58c9f29beefDaniel Dunbar
4888f7b8eec37c8c8012fa525c71fb29a58c9f29beefDaniel Dunbar  for (InputInfoList::const_iterator
4889f7b8eec37c8c8012fa525c71fb29a58c9f29beefDaniel Dunbar         it = Inputs.begin(), ie = Inputs.end(); it != ie; ++it) {
4890f7b8eec37c8c8012fa525c71fb29a58c9f29beefDaniel Dunbar    const InputInfo &II = *it;
48917c1e46533cae07216e2a67d5636a5afb44253155Daniel Dunbar    CmdArgs.push_back(II.getFilename());
4892f7b8eec37c8c8012fa525c71fb29a58c9f29beefDaniel Dunbar  }
4893f7b8eec37c8c8012fa525c71fb29a58c9f29beefDaniel Dunbar
4894f7b8eec37c8c8012fa525c71fb29a58c9f29beefDaniel Dunbar  const char *Exec =
48954a7e88978cf646ad10d654020cb00b3877069210Daniel Dunbar    Args.MakeArgString(getToolChain().GetProgramPath("as"));
48962fe238ed293bd4bc27af9beb9fa151fad2146fa8Daniel Dunbar  C.addCommand(new Command(JA, *this, Exec, CmdArgs));
4897f7b8eec37c8c8012fa525c71fb29a58c9f29beefDaniel Dunbar}
4898f7b8eec37c8c8012fa525c71fb29a58c9f29beefDaniel Dunbar
4899f7b8eec37c8c8012fa525c71fb29a58c9f29beefDaniel Dunbarvoid openbsd::Link::ConstructJob(Compilation &C, const JobAction &JA,
49002fe238ed293bd4bc27af9beb9fa151fad2146fa8Daniel Dunbar                                 const InputInfo &Output,
4901f7b8eec37c8c8012fa525c71fb29a58c9f29beefDaniel Dunbar                                 const InputInfoList &Inputs,
4902f7b8eec37c8c8012fa525c71fb29a58c9f29beefDaniel Dunbar                                 const ArgList &Args,
4903f7b8eec37c8c8012fa525c71fb29a58c9f29beefDaniel Dunbar                                 const char *LinkingOutput) const {
4904ee788e70fcd0adf76103b17c78ac658d4ea30c9bDaniel Dunbar  const Driver &D = getToolChain().getDriver();
4905f7b8eec37c8c8012fa525c71fb29a58c9f29beefDaniel Dunbar  ArgStringList CmdArgs;
4906f7b8eec37c8c8012fa525c71fb29a58c9f29beefDaniel Dunbar
49076cc2a68c1ecb20054819a0b154ccfb7ff7498595Rafael Espindola  // Silence warning for "clang -g foo.o -o foo"
49086cc2a68c1ecb20054819a0b154ccfb7ff7498595Rafael Espindola  Args.ClaimAllArgs(options::OPT_g_Group);
49096cc2a68c1ecb20054819a0b154ccfb7ff7498595Rafael Espindola  // and "clang -emit-llvm foo.o -o foo"
49106cc2a68c1ecb20054819a0b154ccfb7ff7498595Rafael Espindola  Args.ClaimAllArgs(options::OPT_emit_llvm);
49116cc2a68c1ecb20054819a0b154ccfb7ff7498595Rafael Espindola  // and for "clang -w foo.o -o foo". Other warning options are already
49126cc2a68c1ecb20054819a0b154ccfb7ff7498595Rafael Espindola  // handled somewhere else.
49136cc2a68c1ecb20054819a0b154ccfb7ff7498595Rafael Espindola  Args.ClaimAllArgs(options::OPT_w);
49146cc2a68c1ecb20054819a0b154ccfb7ff7498595Rafael Espindola
49152bbcf669742b6b27748414e22f8042236fceef65Daniel Dunbar  if ((!Args.hasArg(options::OPT_nostdlib)) &&
4916294691eb1caf551083acd7b08630ef21c3fd760dDaniel Dunbar      (!Args.hasArg(options::OPT_shared))) {
49172bbcf669742b6b27748414e22f8042236fceef65Daniel Dunbar    CmdArgs.push_back("-e");
49182bbcf669742b6b27748414e22f8042236fceef65Daniel Dunbar    CmdArgs.push_back("__start");
49192bbcf669742b6b27748414e22f8042236fceef65Daniel Dunbar  }
49202bbcf669742b6b27748414e22f8042236fceef65Daniel Dunbar
4921f7b8eec37c8c8012fa525c71fb29a58c9f29beefDaniel Dunbar  if (Args.hasArg(options::OPT_static)) {
4922f7b8eec37c8c8012fa525c71fb29a58c9f29beefDaniel Dunbar    CmdArgs.push_back("-Bstatic");
4923f7b8eec37c8c8012fa525c71fb29a58c9f29beefDaniel Dunbar  } else {
492465ba55da577b23b24513b815031fc870d1d27971Rafael Espindola    if (Args.hasArg(options::OPT_rdynamic))
492565ba55da577b23b24513b815031fc870d1d27971Rafael Espindola      CmdArgs.push_back("-export-dynamic");
4926f7b8eec37c8c8012fa525c71fb29a58c9f29beefDaniel Dunbar    CmdArgs.push_back("--eh-frame-hdr");
49272bbcf669742b6b27748414e22f8042236fceef65Daniel Dunbar    CmdArgs.push_back("-Bdynamic");
4928f7b8eec37c8c8012fa525c71fb29a58c9f29beefDaniel Dunbar    if (Args.hasArg(options::OPT_shared)) {
49292bbcf669742b6b27748414e22f8042236fceef65Daniel Dunbar      CmdArgs.push_back("-shared");
4930f7b8eec37c8c8012fa525c71fb29a58c9f29beefDaniel Dunbar    } else {
4931f7b8eec37c8c8012fa525c71fb29a58c9f29beefDaniel Dunbar      CmdArgs.push_back("-dynamic-linker");
4932f7b8eec37c8c8012fa525c71fb29a58c9f29beefDaniel Dunbar      CmdArgs.push_back("/usr/libexec/ld.so");
4933f7b8eec37c8c8012fa525c71fb29a58c9f29beefDaniel Dunbar    }
4934f7b8eec37c8c8012fa525c71fb29a58c9f29beefDaniel Dunbar  }
4935f7b8eec37c8c8012fa525c71fb29a58c9f29beefDaniel Dunbar
49367c1e46533cae07216e2a67d5636a5afb44253155Daniel Dunbar  if (Output.isFilename()) {
4937f7b8eec37c8c8012fa525c71fb29a58c9f29beefDaniel Dunbar    CmdArgs.push_back("-o");
4938f7b8eec37c8c8012fa525c71fb29a58c9f29beefDaniel Dunbar    CmdArgs.push_back(Output.getFilename());
4939f7b8eec37c8c8012fa525c71fb29a58c9f29beefDaniel Dunbar  } else {
4940f7b8eec37c8c8012fa525c71fb29a58c9f29beefDaniel Dunbar    assert(Output.isNothing() && "Invalid output.");
4941f7b8eec37c8c8012fa525c71fb29a58c9f29beefDaniel Dunbar  }
4942f7b8eec37c8c8012fa525c71fb29a58c9f29beefDaniel Dunbar
4943f7b8eec37c8c8012fa525c71fb29a58c9f29beefDaniel Dunbar  if (!Args.hasArg(options::OPT_nostdlib) &&
4944f7b8eec37c8c8012fa525c71fb29a58c9f29beefDaniel Dunbar      !Args.hasArg(options::OPT_nostartfiles)) {
4945f7b8eec37c8c8012fa525c71fb29a58c9f29beefDaniel Dunbar    if (!Args.hasArg(options::OPT_shared)) {
494662d829abaf61d70483a5a584059440a549a306bfEli Friedman      if (Args.hasArg(options::OPT_pg))
494762d829abaf61d70483a5a584059440a549a306bfEli Friedman        CmdArgs.push_back(Args.MakeArgString(
494862d829abaf61d70483a5a584059440a549a306bfEli Friedman                                getToolChain().GetFilePath("gcrt0.o")));
494962d829abaf61d70483a5a584059440a549a306bfEli Friedman      else
495062d829abaf61d70483a5a584059440a549a306bfEli Friedman        CmdArgs.push_back(Args.MakeArgString(
495162d829abaf61d70483a5a584059440a549a306bfEli Friedman                                getToolChain().GetFilePath("crt0.o")));
495238e317d6dce161b249508686cc67eb7176958762Chris Lattner      CmdArgs.push_back(Args.MakeArgString(
49534a7e88978cf646ad10d654020cb00b3877069210Daniel Dunbar                              getToolChain().GetFilePath("crtbegin.o")));
4954f7b8eec37c8c8012fa525c71fb29a58c9f29beefDaniel Dunbar    } else {
495538e317d6dce161b249508686cc67eb7176958762Chris Lattner      CmdArgs.push_back(Args.MakeArgString(
49564a7e88978cf646ad10d654020cb00b3877069210Daniel Dunbar                              getToolChain().GetFilePath("crtbeginS.o")));
4957f7b8eec37c8c8012fa525c71fb29a58c9f29beefDaniel Dunbar    }
4958f7b8eec37c8c8012fa525c71fb29a58c9f29beefDaniel Dunbar  }
4959f7b8eec37c8c8012fa525c71fb29a58c9f29beefDaniel Dunbar
4960e7e18200e614a5e619602a088544c85ac8305a1fEdward O'Callaghan  std::string Triple = getToolChain().getTripleString();
4961e7e18200e614a5e619602a088544c85ac8305a1fEdward O'Callaghan  if (Triple.substr(0, 6) == "x86_64")
4962294691eb1caf551083acd7b08630ef21c3fd760dDaniel Dunbar    Triple.replace(0, 6, "amd64");
4963f7fb31f4751c9c5ac3d9f93c19ec05a74dd9546fDaniel Dunbar  CmdArgs.push_back(Args.MakeArgString("-L/usr/lib/gcc-lib/" + Triple +
496495c0457054518102af6250e718a13a5b2ee5dbeaDaniel Dunbar                                       "/4.2.1"));
49652bbcf669742b6b27748414e22f8042236fceef65Daniel Dunbar
4966f7b8eec37c8c8012fa525c71fb29a58c9f29beefDaniel Dunbar  Args.AddAllArgs(CmdArgs, options::OPT_L);
4967f7b8eec37c8c8012fa525c71fb29a58c9f29beefDaniel Dunbar  Args.AddAllArgs(CmdArgs, options::OPT_T_Group);
4968f7b8eec37c8c8012fa525c71fb29a58c9f29beefDaniel Dunbar  Args.AddAllArgs(CmdArgs, options::OPT_e);
49696cc2a68c1ecb20054819a0b154ccfb7ff7498595Rafael Espindola  Args.AddAllArgs(CmdArgs, options::OPT_s);
49706cc2a68c1ecb20054819a0b154ccfb7ff7498595Rafael Espindola  Args.AddAllArgs(CmdArgs, options::OPT_t);
49716cc2a68c1ecb20054819a0b154ccfb7ff7498595Rafael Espindola  Args.AddAllArgs(CmdArgs, options::OPT_Z_Flag);
49726cc2a68c1ecb20054819a0b154ccfb7ff7498595Rafael Espindola  Args.AddAllArgs(CmdArgs, options::OPT_r);
4973f7b8eec37c8c8012fa525c71fb29a58c9f29beefDaniel Dunbar
49742008feead855f08500fb01ff43ef5eebee05d1e5Daniel Dunbar  AddLinkerInputs(getToolChain(), Inputs, Args, CmdArgs);
4975f7b8eec37c8c8012fa525c71fb29a58c9f29beefDaniel Dunbar
4976f7b8eec37c8c8012fa525c71fb29a58c9f29beefDaniel Dunbar  if (!Args.hasArg(options::OPT_nostdlib) &&
4977f7b8eec37c8c8012fa525c71fb29a58c9f29beefDaniel Dunbar      !Args.hasArg(options::OPT_nodefaultlibs)) {
497895c0457054518102af6250e718a13a5b2ee5dbeaDaniel Dunbar    if (D.CCCIsCXX) {
4979132e35d2f87895d20e7ea146c8c00404b80221a1Daniel Dunbar      getToolChain().AddCXXStdlibLibArgs(Args, CmdArgs);
498062d829abaf61d70483a5a584059440a549a306bfEli Friedman      if (Args.hasArg(options::OPT_pg))
498162d829abaf61d70483a5a584059440a549a306bfEli Friedman        CmdArgs.push_back("-lm_p");
498262d829abaf61d70483a5a584059440a549a306bfEli Friedman      else
498362d829abaf61d70483a5a584059440a549a306bfEli Friedman        CmdArgs.push_back("-lm");
498495c0457054518102af6250e718a13a5b2ee5dbeaDaniel Dunbar    }
498595c0457054518102af6250e718a13a5b2ee5dbeaDaniel Dunbar
49862bbcf669742b6b27748414e22f8042236fceef65Daniel Dunbar    // FIXME: For some reason GCC passes -lgcc before adding
49872bbcf669742b6b27748414e22f8042236fceef65Daniel Dunbar    // the default system libraries. Just mimic this for now.
49882bbcf669742b6b27748414e22f8042236fceef65Daniel Dunbar    CmdArgs.push_back("-lgcc");
4989f7b8eec37c8c8012fa525c71fb29a58c9f29beefDaniel Dunbar
4990dc6cc87ab68091a714526b391e2a1291d84d485eEric Christopher    if (Args.hasArg(options::OPT_pthread)) {
4991dc6cc87ab68091a714526b391e2a1291d84d485eEric Christopher      if (!Args.hasArg(options::OPT_shared) &&
4992dc6cc87ab68091a714526b391e2a1291d84d485eEric Christopher          Args.hasArg(options::OPT_pg))
4993dc6cc87ab68091a714526b391e2a1291d84d485eEric Christopher         CmdArgs.push_back("-lpthread_p");
4994dc6cc87ab68091a714526b391e2a1291d84d485eEric Christopher      else
4995dc6cc87ab68091a714526b391e2a1291d84d485eEric Christopher         CmdArgs.push_back("-lpthread");
4996dc6cc87ab68091a714526b391e2a1291d84d485eEric Christopher    }
4997dc6cc87ab68091a714526b391e2a1291d84d485eEric Christopher
4998657849c60378b045a9e904f35ece8fd84425a20aChandler Carruth    if (!Args.hasArg(options::OPT_shared)) {
4999dc6cc87ab68091a714526b391e2a1291d84d485eEric Christopher      if (Args.hasArg(options::OPT_pg))
500062d829abaf61d70483a5a584059440a549a306bfEli Friedman         CmdArgs.push_back("-lc_p");
500162d829abaf61d70483a5a584059440a549a306bfEli Friedman      else
500262d829abaf61d70483a5a584059440a549a306bfEli Friedman         CmdArgs.push_back("-lc");
5003657849c60378b045a9e904f35ece8fd84425a20aChandler Carruth    }
5004dc6cc87ab68091a714526b391e2a1291d84d485eEric Christopher
50052bbcf669742b6b27748414e22f8042236fceef65Daniel Dunbar    CmdArgs.push_back("-lgcc");
5006f7b8eec37c8c8012fa525c71fb29a58c9f29beefDaniel Dunbar  }
5007f7b8eec37c8c8012fa525c71fb29a58c9f29beefDaniel Dunbar
5008f7b8eec37c8c8012fa525c71fb29a58c9f29beefDaniel Dunbar  if (!Args.hasArg(options::OPT_nostdlib) &&
5009f7b8eec37c8c8012fa525c71fb29a58c9f29beefDaniel Dunbar      !Args.hasArg(options::OPT_nostartfiles)) {
5010f7b8eec37c8c8012fa525c71fb29a58c9f29beefDaniel Dunbar    if (!Args.hasArg(options::OPT_shared))
501138e317d6dce161b249508686cc67eb7176958762Chris Lattner      CmdArgs.push_back(Args.MakeArgString(
50124a7e88978cf646ad10d654020cb00b3877069210Daniel Dunbar                              getToolChain().GetFilePath("crtend.o")));
5013f7b8eec37c8c8012fa525c71fb29a58c9f29beefDaniel Dunbar    else
501438e317d6dce161b249508686cc67eb7176958762Chris Lattner      CmdArgs.push_back(Args.MakeArgString(
50154a7e88978cf646ad10d654020cb00b3877069210Daniel Dunbar                              getToolChain().GetFilePath("crtendS.o")));
5016f7b8eec37c8c8012fa525c71fb29a58c9f29beefDaniel Dunbar  }
5017f7b8eec37c8c8012fa525c71fb29a58c9f29beefDaniel Dunbar
5018f7b8eec37c8c8012fa525c71fb29a58c9f29beefDaniel Dunbar  const char *Exec =
50194a7e88978cf646ad10d654020cb00b3877069210Daniel Dunbar    Args.MakeArgString(getToolChain().GetProgramPath("ld"));
50202fe238ed293bd4bc27af9beb9fa151fad2146fa8Daniel Dunbar  C.addCommand(new Command(JA, *this, Exec, CmdArgs));
5021f7b8eec37c8c8012fa525c71fb29a58c9f29beefDaniel Dunbar}
5022c66a5a30a27e7b9cfab46ac8be918e3ea5b0c5a5Ed Schouten
502342f74f21ece01dc8573d5377859d327fbb23b26cEli Friedmanvoid bitrig::Assemble::ConstructJob(Compilation &C, const JobAction &JA,
502442f74f21ece01dc8573d5377859d327fbb23b26cEli Friedman                                    const InputInfo &Output,
502542f74f21ece01dc8573d5377859d327fbb23b26cEli Friedman                                    const InputInfoList &Inputs,
502642f74f21ece01dc8573d5377859d327fbb23b26cEli Friedman                                    const ArgList &Args,
502742f74f21ece01dc8573d5377859d327fbb23b26cEli Friedman                                    const char *LinkingOutput) const {
502842f74f21ece01dc8573d5377859d327fbb23b26cEli Friedman  ArgStringList CmdArgs;
502942f74f21ece01dc8573d5377859d327fbb23b26cEli Friedman
503042f74f21ece01dc8573d5377859d327fbb23b26cEli Friedman  Args.AddAllArgValues(CmdArgs, options::OPT_Wa_COMMA,
503142f74f21ece01dc8573d5377859d327fbb23b26cEli Friedman                       options::OPT_Xassembler);
503242f74f21ece01dc8573d5377859d327fbb23b26cEli Friedman
503342f74f21ece01dc8573d5377859d327fbb23b26cEli Friedman  CmdArgs.push_back("-o");
503442f74f21ece01dc8573d5377859d327fbb23b26cEli Friedman  CmdArgs.push_back(Output.getFilename());
503542f74f21ece01dc8573d5377859d327fbb23b26cEli Friedman
503642f74f21ece01dc8573d5377859d327fbb23b26cEli Friedman  for (InputInfoList::const_iterator
503742f74f21ece01dc8573d5377859d327fbb23b26cEli Friedman         it = Inputs.begin(), ie = Inputs.end(); it != ie; ++it) {
503842f74f21ece01dc8573d5377859d327fbb23b26cEli Friedman    const InputInfo &II = *it;
503942f74f21ece01dc8573d5377859d327fbb23b26cEli Friedman    CmdArgs.push_back(II.getFilename());
504042f74f21ece01dc8573d5377859d327fbb23b26cEli Friedman  }
504142f74f21ece01dc8573d5377859d327fbb23b26cEli Friedman
504242f74f21ece01dc8573d5377859d327fbb23b26cEli Friedman  const char *Exec =
504342f74f21ece01dc8573d5377859d327fbb23b26cEli Friedman    Args.MakeArgString(getToolChain().GetProgramPath("as"));
504442f74f21ece01dc8573d5377859d327fbb23b26cEli Friedman  C.addCommand(new Command(JA, *this, Exec, CmdArgs));
504542f74f21ece01dc8573d5377859d327fbb23b26cEli Friedman}
504642f74f21ece01dc8573d5377859d327fbb23b26cEli Friedman
504742f74f21ece01dc8573d5377859d327fbb23b26cEli Friedmanvoid bitrig::Link::ConstructJob(Compilation &C, const JobAction &JA,
504842f74f21ece01dc8573d5377859d327fbb23b26cEli Friedman                                const InputInfo &Output,
504942f74f21ece01dc8573d5377859d327fbb23b26cEli Friedman                                const InputInfoList &Inputs,
505042f74f21ece01dc8573d5377859d327fbb23b26cEli Friedman                                const ArgList &Args,
505142f74f21ece01dc8573d5377859d327fbb23b26cEli Friedman                                const char *LinkingOutput) const {
505242f74f21ece01dc8573d5377859d327fbb23b26cEli Friedman  const Driver &D = getToolChain().getDriver();
505342f74f21ece01dc8573d5377859d327fbb23b26cEli Friedman  ArgStringList CmdArgs;
505442f74f21ece01dc8573d5377859d327fbb23b26cEli Friedman
505542f74f21ece01dc8573d5377859d327fbb23b26cEli Friedman  if ((!Args.hasArg(options::OPT_nostdlib)) &&
505642f74f21ece01dc8573d5377859d327fbb23b26cEli Friedman      (!Args.hasArg(options::OPT_shared))) {
505742f74f21ece01dc8573d5377859d327fbb23b26cEli Friedman    CmdArgs.push_back("-e");
505842f74f21ece01dc8573d5377859d327fbb23b26cEli Friedman    CmdArgs.push_back("__start");
505942f74f21ece01dc8573d5377859d327fbb23b26cEli Friedman  }
506042f74f21ece01dc8573d5377859d327fbb23b26cEli Friedman
506142f74f21ece01dc8573d5377859d327fbb23b26cEli Friedman  if (Args.hasArg(options::OPT_static)) {
506242f74f21ece01dc8573d5377859d327fbb23b26cEli Friedman    CmdArgs.push_back("-Bstatic");
506342f74f21ece01dc8573d5377859d327fbb23b26cEli Friedman  } else {
506442f74f21ece01dc8573d5377859d327fbb23b26cEli Friedman    if (Args.hasArg(options::OPT_rdynamic))
506542f74f21ece01dc8573d5377859d327fbb23b26cEli Friedman      CmdArgs.push_back("-export-dynamic");
506642f74f21ece01dc8573d5377859d327fbb23b26cEli Friedman    CmdArgs.push_back("--eh-frame-hdr");
506742f74f21ece01dc8573d5377859d327fbb23b26cEli Friedman    CmdArgs.push_back("-Bdynamic");
506842f74f21ece01dc8573d5377859d327fbb23b26cEli Friedman    if (Args.hasArg(options::OPT_shared)) {
506942f74f21ece01dc8573d5377859d327fbb23b26cEli Friedman      CmdArgs.push_back("-shared");
507042f74f21ece01dc8573d5377859d327fbb23b26cEli Friedman    } else {
507142f74f21ece01dc8573d5377859d327fbb23b26cEli Friedman      CmdArgs.push_back("-dynamic-linker");
507242f74f21ece01dc8573d5377859d327fbb23b26cEli Friedman      CmdArgs.push_back("/usr/libexec/ld.so");
507342f74f21ece01dc8573d5377859d327fbb23b26cEli Friedman    }
507442f74f21ece01dc8573d5377859d327fbb23b26cEli Friedman  }
507542f74f21ece01dc8573d5377859d327fbb23b26cEli Friedman
507642f74f21ece01dc8573d5377859d327fbb23b26cEli Friedman  if (Output.isFilename()) {
507742f74f21ece01dc8573d5377859d327fbb23b26cEli Friedman    CmdArgs.push_back("-o");
507842f74f21ece01dc8573d5377859d327fbb23b26cEli Friedman    CmdArgs.push_back(Output.getFilename());
507942f74f21ece01dc8573d5377859d327fbb23b26cEli Friedman  } else {
508042f74f21ece01dc8573d5377859d327fbb23b26cEli Friedman    assert(Output.isNothing() && "Invalid output.");
508142f74f21ece01dc8573d5377859d327fbb23b26cEli Friedman  }
508242f74f21ece01dc8573d5377859d327fbb23b26cEli Friedman
508342f74f21ece01dc8573d5377859d327fbb23b26cEli Friedman  if (!Args.hasArg(options::OPT_nostdlib) &&
508442f74f21ece01dc8573d5377859d327fbb23b26cEli Friedman      !Args.hasArg(options::OPT_nostartfiles)) {
508542f74f21ece01dc8573d5377859d327fbb23b26cEli Friedman    if (!Args.hasArg(options::OPT_shared)) {
508642f74f21ece01dc8573d5377859d327fbb23b26cEli Friedman      if (Args.hasArg(options::OPT_pg))
508742f74f21ece01dc8573d5377859d327fbb23b26cEli Friedman        CmdArgs.push_back(Args.MakeArgString(
508842f74f21ece01dc8573d5377859d327fbb23b26cEli Friedman                                getToolChain().GetFilePath("gcrt0.o")));
508942f74f21ece01dc8573d5377859d327fbb23b26cEli Friedman      else
509042f74f21ece01dc8573d5377859d327fbb23b26cEli Friedman        CmdArgs.push_back(Args.MakeArgString(
509142f74f21ece01dc8573d5377859d327fbb23b26cEli Friedman                                getToolChain().GetFilePath("crt0.o")));
509242f74f21ece01dc8573d5377859d327fbb23b26cEli Friedman      CmdArgs.push_back(Args.MakeArgString(
509342f74f21ece01dc8573d5377859d327fbb23b26cEli Friedman                              getToolChain().GetFilePath("crtbegin.o")));
509442f74f21ece01dc8573d5377859d327fbb23b26cEli Friedman    } else {
509542f74f21ece01dc8573d5377859d327fbb23b26cEli Friedman      CmdArgs.push_back(Args.MakeArgString(
509642f74f21ece01dc8573d5377859d327fbb23b26cEli Friedman                              getToolChain().GetFilePath("crtbeginS.o")));
509742f74f21ece01dc8573d5377859d327fbb23b26cEli Friedman    }
509842f74f21ece01dc8573d5377859d327fbb23b26cEli Friedman  }
509942f74f21ece01dc8573d5377859d327fbb23b26cEli Friedman
510042f74f21ece01dc8573d5377859d327fbb23b26cEli Friedman  Args.AddAllArgs(CmdArgs, options::OPT_L);
510142f74f21ece01dc8573d5377859d327fbb23b26cEli Friedman  Args.AddAllArgs(CmdArgs, options::OPT_T_Group);
510242f74f21ece01dc8573d5377859d327fbb23b26cEli Friedman  Args.AddAllArgs(CmdArgs, options::OPT_e);
510342f74f21ece01dc8573d5377859d327fbb23b26cEli Friedman
510442f74f21ece01dc8573d5377859d327fbb23b26cEli Friedman  AddLinkerInputs(getToolChain(), Inputs, Args, CmdArgs);
510542f74f21ece01dc8573d5377859d327fbb23b26cEli Friedman
510642f74f21ece01dc8573d5377859d327fbb23b26cEli Friedman  if (!Args.hasArg(options::OPT_nostdlib) &&
510742f74f21ece01dc8573d5377859d327fbb23b26cEli Friedman      !Args.hasArg(options::OPT_nodefaultlibs)) {
510842f74f21ece01dc8573d5377859d327fbb23b26cEli Friedman    if (D.CCCIsCXX) {
510942f74f21ece01dc8573d5377859d327fbb23b26cEli Friedman      getToolChain().AddCXXStdlibLibArgs(Args, CmdArgs);
511042f74f21ece01dc8573d5377859d327fbb23b26cEli Friedman      if (Args.hasArg(options::OPT_pg))
511142f74f21ece01dc8573d5377859d327fbb23b26cEli Friedman        CmdArgs.push_back("-lm_p");
511242f74f21ece01dc8573d5377859d327fbb23b26cEli Friedman      else
511342f74f21ece01dc8573d5377859d327fbb23b26cEli Friedman        CmdArgs.push_back("-lm");
511442f74f21ece01dc8573d5377859d327fbb23b26cEli Friedman    }
511542f74f21ece01dc8573d5377859d327fbb23b26cEli Friedman
51163667bbe0f235a8b3fc2496acc8f3136dfb559cc9Rafael Espindola    if (Args.hasArg(options::OPT_pthread)) {
51173667bbe0f235a8b3fc2496acc8f3136dfb559cc9Rafael Espindola      if (!Args.hasArg(options::OPT_shared) &&
51183667bbe0f235a8b3fc2496acc8f3136dfb559cc9Rafael Espindola          Args.hasArg(options::OPT_pg))
51193667bbe0f235a8b3fc2496acc8f3136dfb559cc9Rafael Espindola        CmdArgs.push_back("-lpthread_p");
51203667bbe0f235a8b3fc2496acc8f3136dfb559cc9Rafael Espindola      else
51213667bbe0f235a8b3fc2496acc8f3136dfb559cc9Rafael Espindola        CmdArgs.push_back("-lpthread");
51223667bbe0f235a8b3fc2496acc8f3136dfb559cc9Rafael Espindola    }
51233667bbe0f235a8b3fc2496acc8f3136dfb559cc9Rafael Espindola
512442f74f21ece01dc8573d5377859d327fbb23b26cEli Friedman    if (!Args.hasArg(options::OPT_shared)) {
512542f74f21ece01dc8573d5377859d327fbb23b26cEli Friedman      if (Args.hasArg(options::OPT_pg))
512642f74f21ece01dc8573d5377859d327fbb23b26cEli Friedman        CmdArgs.push_back("-lc_p");
512742f74f21ece01dc8573d5377859d327fbb23b26cEli Friedman      else
512842f74f21ece01dc8573d5377859d327fbb23b26cEli Friedman        CmdArgs.push_back("-lc");
512942f74f21ece01dc8573d5377859d327fbb23b26cEli Friedman    }
513042f74f21ece01dc8573d5377859d327fbb23b26cEli Friedman
513142f74f21ece01dc8573d5377859d327fbb23b26cEli Friedman    std::string myarch = "-lclang_rt.";
513242f74f21ece01dc8573d5377859d327fbb23b26cEli Friedman    const llvm::Triple &T = getToolChain().getTriple();
513342f74f21ece01dc8573d5377859d327fbb23b26cEli Friedman    llvm::Triple::ArchType Arch = T.getArch();
513442f74f21ece01dc8573d5377859d327fbb23b26cEli Friedman    switch (Arch) {
513542f74f21ece01dc8573d5377859d327fbb23b26cEli Friedman          case llvm::Triple::arm:
513642f74f21ece01dc8573d5377859d327fbb23b26cEli Friedman            myarch += ("arm");
513742f74f21ece01dc8573d5377859d327fbb23b26cEli Friedman            break;
513842f74f21ece01dc8573d5377859d327fbb23b26cEli Friedman          case llvm::Triple::x86:
513942f74f21ece01dc8573d5377859d327fbb23b26cEli Friedman            myarch += ("i386");
514042f74f21ece01dc8573d5377859d327fbb23b26cEli Friedman            break;
514142f74f21ece01dc8573d5377859d327fbb23b26cEli Friedman          case llvm::Triple::x86_64:
514242f74f21ece01dc8573d5377859d327fbb23b26cEli Friedman            myarch += ("amd64");
514342f74f21ece01dc8573d5377859d327fbb23b26cEli Friedman            break;
514442f74f21ece01dc8573d5377859d327fbb23b26cEli Friedman          default:
514542f74f21ece01dc8573d5377859d327fbb23b26cEli Friedman            assert(0 && "Unsupported architecture");
514642f74f21ece01dc8573d5377859d327fbb23b26cEli Friedman     }
514742f74f21ece01dc8573d5377859d327fbb23b26cEli Friedman     CmdArgs.push_back(Args.MakeArgString(myarch));
514842f74f21ece01dc8573d5377859d327fbb23b26cEli Friedman  }
514942f74f21ece01dc8573d5377859d327fbb23b26cEli Friedman
515042f74f21ece01dc8573d5377859d327fbb23b26cEli Friedman  if (!Args.hasArg(options::OPT_nostdlib) &&
515142f74f21ece01dc8573d5377859d327fbb23b26cEli Friedman      !Args.hasArg(options::OPT_nostartfiles)) {
515242f74f21ece01dc8573d5377859d327fbb23b26cEli Friedman    if (!Args.hasArg(options::OPT_shared))
515342f74f21ece01dc8573d5377859d327fbb23b26cEli Friedman      CmdArgs.push_back(Args.MakeArgString(
515442f74f21ece01dc8573d5377859d327fbb23b26cEli Friedman                              getToolChain().GetFilePath("crtend.o")));
515542f74f21ece01dc8573d5377859d327fbb23b26cEli Friedman    else
515642f74f21ece01dc8573d5377859d327fbb23b26cEli Friedman      CmdArgs.push_back(Args.MakeArgString(
515742f74f21ece01dc8573d5377859d327fbb23b26cEli Friedman                              getToolChain().GetFilePath("crtendS.o")));
515842f74f21ece01dc8573d5377859d327fbb23b26cEli Friedman  }
5159c9c48dba2004b9d25e96d02e12b932a8826c6632Eli Friedman
5160c9c48dba2004b9d25e96d02e12b932a8826c6632Eli Friedman  const char *Exec =
5161c9c48dba2004b9d25e96d02e12b932a8826c6632Eli Friedman    Args.MakeArgString(getToolChain().GetProgramPath("ld"));
5162c9c48dba2004b9d25e96d02e12b932a8826c6632Eli Friedman  C.addCommand(new Command(JA, *this, Exec, CmdArgs));
516342f74f21ece01dc8573d5377859d327fbb23b26cEli Friedman}
516442f74f21ece01dc8573d5377859d327fbb23b26cEli Friedman
516568a31d406c6dc4382c700d1199b062de2aa7e1daDaniel Dunbarvoid freebsd::Assemble::ConstructJob(Compilation &C, const JobAction &JA,
51662fe238ed293bd4bc27af9beb9fa151fad2146fa8Daniel Dunbar                                     const InputInfo &Output,
5167c21c485b4fb58ef5d55cf3e523263dd824a2ace4Daniel Dunbar                                     const InputInfoList &Inputs,
5168c21c485b4fb58ef5d55cf3e523263dd824a2ace4Daniel Dunbar                                     const ArgList &Args,
51691eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump                                     const char *LinkingOutput) const {
517068a31d406c6dc4382c700d1199b062de2aa7e1daDaniel Dunbar  ArgStringList CmdArgs;
517168a31d406c6dc4382c700d1199b062de2aa7e1daDaniel Dunbar
5172008f54a54299eaafdaa940e2bdeaf55935ecd95aDaniel Dunbar  // When building 32-bit code on FreeBSD/amd64, we have to explicitly
5173008f54a54299eaafdaa940e2bdeaf55935ecd95aDaniel Dunbar  // instruct as in the base system to assemble 32-bit code.
5174c55da4bc1d9bfd7ace9c2bd99f98bc4cf09cd27bEric Christopher  if (getToolChain().getArch() == llvm::Triple::x86)
517568a31d406c6dc4382c700d1199b062de2aa7e1daDaniel Dunbar    CmdArgs.push_back("--32");
5176c55da4bc1d9bfd7ace9c2bd99f98bc4cf09cd27bEric Christopher  else if (getToolChain().getArch() == llvm::Triple::ppc)
51773393cef18e887723aaa2395d33550ab35551af1dRoman Divacky    CmdArgs.push_back("-a32");
5178c55da4bc1d9bfd7ace9c2bd99f98bc4cf09cd27bEric Christopher  else if (getToolChain().getArch() == llvm::Triple::mips ||
5179c55da4bc1d9bfd7ace9c2bd99f98bc4cf09cd27bEric Christopher           getToolChain().getArch() == llvm::Triple::mipsel ||
5180c55da4bc1d9bfd7ace9c2bd99f98bc4cf09cd27bEric Christopher           getToolChain().getArch() == llvm::Triple::mips64 ||
5181c55da4bc1d9bfd7ace9c2bd99f98bc4cf09cd27bEric Christopher           getToolChain().getArch() == llvm::Triple::mips64el) {
5182c55da4bc1d9bfd7ace9c2bd99f98bc4cf09cd27bEric Christopher    StringRef CPUName;
5183c55da4bc1d9bfd7ace9c2bd99f98bc4cf09cd27bEric Christopher    StringRef ABIName;
5184c55da4bc1d9bfd7ace9c2bd99f98bc4cf09cd27bEric Christopher    getMipsCPUAndABI(Args, getToolChain(), CPUName, ABIName);
5185c55da4bc1d9bfd7ace9c2bd99f98bc4cf09cd27bEric Christopher
5186c55da4bc1d9bfd7ace9c2bd99f98bc4cf09cd27bEric Christopher    CmdArgs.push_back("-march");
5187c55da4bc1d9bfd7ace9c2bd99f98bc4cf09cd27bEric Christopher    CmdArgs.push_back(CPUName.data());
5188c55da4bc1d9bfd7ace9c2bd99f98bc4cf09cd27bEric Christopher
5189c55da4bc1d9bfd7ace9c2bd99f98bc4cf09cd27bEric Christopher    CmdArgs.push_back("-mabi");
5190e9616a4972a4c2fdc28128c057f21d7a79516c86Simon Atanasyan    CmdArgs.push_back(getGnuCompatibleMipsABIName(ABIName).data());
5191c55da4bc1d9bfd7ace9c2bd99f98bc4cf09cd27bEric Christopher
5192c55da4bc1d9bfd7ace9c2bd99f98bc4cf09cd27bEric Christopher    if (getToolChain().getArch() == llvm::Triple::mips ||
5193c55da4bc1d9bfd7ace9c2bd99f98bc4cf09cd27bEric Christopher        getToolChain().getArch() == llvm::Triple::mips64)
5194c55da4bc1d9bfd7ace9c2bd99f98bc4cf09cd27bEric Christopher      CmdArgs.push_back("-EB");
5195c55da4bc1d9bfd7ace9c2bd99f98bc4cf09cd27bEric Christopher    else
5196c55da4bc1d9bfd7ace9c2bd99f98bc4cf09cd27bEric Christopher      CmdArgs.push_back("-EL");
5197c55da4bc1d9bfd7ace9c2bd99f98bc4cf09cd27bEric Christopher
5198c55da4bc1d9bfd7ace9c2bd99f98bc4cf09cd27bEric Christopher    Arg *LastPICArg = Args.getLastArg(options::OPT_fPIC, options::OPT_fno_PIC,
5199c55da4bc1d9bfd7ace9c2bd99f98bc4cf09cd27bEric Christopher                                      options::OPT_fpic, options::OPT_fno_pic,
5200c55da4bc1d9bfd7ace9c2bd99f98bc4cf09cd27bEric Christopher                                      options::OPT_fPIE, options::OPT_fno_PIE,
5201c55da4bc1d9bfd7ace9c2bd99f98bc4cf09cd27bEric Christopher                                      options::OPT_fpie, options::OPT_fno_pie);
5202c55da4bc1d9bfd7ace9c2bd99f98bc4cf09cd27bEric Christopher    if (LastPICArg &&
5203c55da4bc1d9bfd7ace9c2bd99f98bc4cf09cd27bEric Christopher        (LastPICArg->getOption().matches(options::OPT_fPIC) ||
5204c55da4bc1d9bfd7ace9c2bd99f98bc4cf09cd27bEric Christopher         LastPICArg->getOption().matches(options::OPT_fpic) ||
5205c55da4bc1d9bfd7ace9c2bd99f98bc4cf09cd27bEric Christopher         LastPICArg->getOption().matches(options::OPT_fPIE) ||
5206c55da4bc1d9bfd7ace9c2bd99f98bc4cf09cd27bEric Christopher         LastPICArg->getOption().matches(options::OPT_fpie))) {
5207c55da4bc1d9bfd7ace9c2bd99f98bc4cf09cd27bEric Christopher      CmdArgs.push_back("-KPIC");
5208c55da4bc1d9bfd7ace9c2bd99f98bc4cf09cd27bEric Christopher    }
520927fa2364b05ab26138c2ecf0eac1937b7fc6c037Rafael Espindola  } else if (getToolChain().getArch() == llvm::Triple::arm ||
521027fa2364b05ab26138c2ecf0eac1937b7fc6c037Rafael Espindola             getToolChain().getArch() == llvm::Triple::thumb) {
521127fa2364b05ab26138c2ecf0eac1937b7fc6c037Rafael Espindola    CmdArgs.push_back("-mfpu=softvfp");
521227fa2364b05ab26138c2ecf0eac1937b7fc6c037Rafael Espindola    switch(getToolChain().getTriple().getEnvironment()) {
521327fa2364b05ab26138c2ecf0eac1937b7fc6c037Rafael Espindola    case llvm::Triple::GNUEABI:
521427fa2364b05ab26138c2ecf0eac1937b7fc6c037Rafael Espindola    case llvm::Triple::EABI:
5215b234e7484b8b678977e5c6a6088dee323c72d3abAnton Korobeynikov      CmdArgs.push_back("-meabi=5");
521627fa2364b05ab26138c2ecf0eac1937b7fc6c037Rafael Espindola      break;
521727fa2364b05ab26138c2ecf0eac1937b7fc6c037Rafael Espindola
521827fa2364b05ab26138c2ecf0eac1937b7fc6c037Rafael Espindola    default:
521927fa2364b05ab26138c2ecf0eac1937b7fc6c037Rafael Espindola      CmdArgs.push_back("-matpcs");
522027fa2364b05ab26138c2ecf0eac1937b7fc6c037Rafael Espindola    }
5221c55da4bc1d9bfd7ace9c2bd99f98bc4cf09cd27bEric Christopher  }
5222ed734737d5af31906e30e537d4a41c760ddcfc59Eric Christopher
522368a31d406c6dc4382c700d1199b062de2aa7e1daDaniel Dunbar  Args.AddAllArgValues(CmdArgs, options::OPT_Wa_COMMA,
522468a31d406c6dc4382c700d1199b062de2aa7e1daDaniel Dunbar                       options::OPT_Xassembler);
522568a31d406c6dc4382c700d1199b062de2aa7e1daDaniel Dunbar
522668a31d406c6dc4382c700d1199b062de2aa7e1daDaniel Dunbar  CmdArgs.push_back("-o");
52277c1e46533cae07216e2a67d5636a5afb44253155Daniel Dunbar  CmdArgs.push_back(Output.getFilename());
522868a31d406c6dc4382c700d1199b062de2aa7e1daDaniel Dunbar
522968a31d406c6dc4382c700d1199b062de2aa7e1daDaniel Dunbar  for (InputInfoList::const_iterator
523068a31d406c6dc4382c700d1199b062de2aa7e1daDaniel Dunbar         it = Inputs.begin(), ie = Inputs.end(); it != ie; ++it) {
523168a31d406c6dc4382c700d1199b062de2aa7e1daDaniel Dunbar    const InputInfo &II = *it;
52327c1e46533cae07216e2a67d5636a5afb44253155Daniel Dunbar    CmdArgs.push_back(II.getFilename());
523368a31d406c6dc4382c700d1199b062de2aa7e1daDaniel Dunbar  }
523468a31d406c6dc4382c700d1199b062de2aa7e1daDaniel Dunbar
5235c21c485b4fb58ef5d55cf3e523263dd824a2ace4Daniel Dunbar  const char *Exec =
52364a7e88978cf646ad10d654020cb00b3877069210Daniel Dunbar    Args.MakeArgString(getToolChain().GetProgramPath("as"));
52372fe238ed293bd4bc27af9beb9fa151fad2146fa8Daniel Dunbar  C.addCommand(new Command(JA, *this, Exec, CmdArgs));
523868a31d406c6dc4382c700d1199b062de2aa7e1daDaniel Dunbar}
5239008f54a54299eaafdaa940e2bdeaf55935ecd95aDaniel Dunbar
5240008f54a54299eaafdaa940e2bdeaf55935ecd95aDaniel Dunbarvoid freebsd::Link::ConstructJob(Compilation &C, const JobAction &JA,
52412fe238ed293bd4bc27af9beb9fa151fad2146fa8Daniel Dunbar                                 const InputInfo &Output,
5242c21c485b4fb58ef5d55cf3e523263dd824a2ace4Daniel Dunbar                                 const InputInfoList &Inputs,
5243c21c485b4fb58ef5d55cf3e523263dd824a2ace4Daniel Dunbar                                 const ArgList &Args,
5244a8304f67291b0182fb64f3afc621615288dd1d31Daniel Dunbar                                 const char *LinkingOutput) const {
52459438016db2332aca8b53fd953da06128373cc5beRoman Divacky  const toolchains::FreeBSD& ToolChain =
52469438016db2332aca8b53fd953da06128373cc5beRoman Divacky    static_cast<const toolchains::FreeBSD&>(getToolChain());
52479438016db2332aca8b53fd953da06128373cc5beRoman Divacky  const Driver &D = ToolChain.getDriver();
5248008f54a54299eaafdaa940e2bdeaf55935ecd95aDaniel Dunbar  ArgStringList CmdArgs;
5249dfa210b1e1e403855557f68fe471212787b8540eDavid Chisnall
5250dfa210b1e1e403855557f68fe471212787b8540eDavid Chisnall  // Silence warning for "clang -g foo.o -o foo"
5251dfa210b1e1e403855557f68fe471212787b8540eDavid Chisnall  Args.ClaimAllArgs(options::OPT_g_Group);
5252dfa210b1e1e403855557f68fe471212787b8540eDavid Chisnall  // and "clang -emit-llvm foo.o -o foo"
5253dfa210b1e1e403855557f68fe471212787b8540eDavid Chisnall  Args.ClaimAllArgs(options::OPT_emit_llvm);
5254dfa210b1e1e403855557f68fe471212787b8540eDavid Chisnall  // and for "clang -w foo.o -o foo". Other warning options are already
5255dfa210b1e1e403855557f68fe471212787b8540eDavid Chisnall  // handled somewhere else.
5256dfa210b1e1e403855557f68fe471212787b8540eDavid Chisnall  Args.ClaimAllArgs(options::OPT_w);
5257008f54a54299eaafdaa940e2bdeaf55935ecd95aDaniel Dunbar
52588ab2bdcc4f397e100c684ede8e8ca6e226e1380aJoerg Sonnenberger  if (!D.SysRoot.empty())
52598ab2bdcc4f397e100c684ede8e8ca6e226e1380aJoerg Sonnenberger    CmdArgs.push_back(Args.MakeArgString("--sysroot=" + D.SysRoot));
52608ab2bdcc4f397e100c684ede8e8ca6e226e1380aJoerg Sonnenberger
52619438016db2332aca8b53fd953da06128373cc5beRoman Divacky  if (Args.hasArg(options::OPT_pie))
52629438016db2332aca8b53fd953da06128373cc5beRoman Divacky    CmdArgs.push_back("-pie");
52639438016db2332aca8b53fd953da06128373cc5beRoman Divacky
5264008f54a54299eaafdaa940e2bdeaf55935ecd95aDaniel Dunbar  if (Args.hasArg(options::OPT_static)) {
5265008f54a54299eaafdaa940e2bdeaf55935ecd95aDaniel Dunbar    CmdArgs.push_back("-Bstatic");
5266008f54a54299eaafdaa940e2bdeaf55935ecd95aDaniel Dunbar  } else {
526765ba55da577b23b24513b815031fc870d1d27971Rafael Espindola    if (Args.hasArg(options::OPT_rdynamic))
526865ba55da577b23b24513b815031fc870d1d27971Rafael Espindola      CmdArgs.push_back("-export-dynamic");
5269008f54a54299eaafdaa940e2bdeaf55935ecd95aDaniel Dunbar    CmdArgs.push_back("--eh-frame-hdr");
5270008f54a54299eaafdaa940e2bdeaf55935ecd95aDaniel Dunbar    if (Args.hasArg(options::OPT_shared)) {
5271008f54a54299eaafdaa940e2bdeaf55935ecd95aDaniel Dunbar      CmdArgs.push_back("-Bshareable");
5272008f54a54299eaafdaa940e2bdeaf55935ecd95aDaniel Dunbar    } else {
5273008f54a54299eaafdaa940e2bdeaf55935ecd95aDaniel Dunbar      CmdArgs.push_back("-dynamic-linker");
5274008f54a54299eaafdaa940e2bdeaf55935ecd95aDaniel Dunbar      CmdArgs.push_back("/libexec/ld-elf.so.1");
5275008f54a54299eaafdaa940e2bdeaf55935ecd95aDaniel Dunbar    }
52769438016db2332aca8b53fd953da06128373cc5beRoman Divacky    if (ToolChain.getTriple().getOSMajorVersion() >= 9) {
52779438016db2332aca8b53fd953da06128373cc5beRoman Divacky      llvm::Triple::ArchType Arch = ToolChain.getArch();
5278dfa210b1e1e403855557f68fe471212787b8540eDavid Chisnall      if (Arch == llvm::Triple::arm || Arch == llvm::Triple::sparc ||
5279dfa210b1e1e403855557f68fe471212787b8540eDavid Chisnall          Arch == llvm::Triple::x86 || Arch == llvm::Triple::x86_64) {
5280dfa210b1e1e403855557f68fe471212787b8540eDavid Chisnall        CmdArgs.push_back("--hash-style=both");
5281dfa210b1e1e403855557f68fe471212787b8540eDavid Chisnall      }
5282dfa210b1e1e403855557f68fe471212787b8540eDavid Chisnall    }
5283dfa210b1e1e403855557f68fe471212787b8540eDavid Chisnall    CmdArgs.push_back("--enable-new-dtags");
5284008f54a54299eaafdaa940e2bdeaf55935ecd95aDaniel Dunbar  }
5285008f54a54299eaafdaa940e2bdeaf55935ecd95aDaniel Dunbar
5286008f54a54299eaafdaa940e2bdeaf55935ecd95aDaniel Dunbar  // When building 32-bit code on FreeBSD/amd64, we have to explicitly
5287008f54a54299eaafdaa940e2bdeaf55935ecd95aDaniel Dunbar  // instruct ld in the base system to link 32-bit code.
528864f7ad9328e877779ec63638f39de4e10d2ff276Rafael Espindola  if (ToolChain.getArch() == llvm::Triple::x86) {
5289008f54a54299eaafdaa940e2bdeaf55935ecd95aDaniel Dunbar    CmdArgs.push_back("-m");
5290008f54a54299eaafdaa940e2bdeaf55935ecd95aDaniel Dunbar    CmdArgs.push_back("elf_i386_fbsd");
5291008f54a54299eaafdaa940e2bdeaf55935ecd95aDaniel Dunbar  }
5292008f54a54299eaafdaa940e2bdeaf55935ecd95aDaniel Dunbar
529364f7ad9328e877779ec63638f39de4e10d2ff276Rafael Espindola  if (ToolChain.getArch() == llvm::Triple::ppc) {
5294000a6552adc6372576d65170dfb5969fd03cc521Roman Divacky    CmdArgs.push_back("-m");
52951052c1dc52447643dac5484d3a22ab836c781f47Roman Divacky    CmdArgs.push_back("elf32ppc_fbsd");
5296000a6552adc6372576d65170dfb5969fd03cc521Roman Divacky  }
5297000a6552adc6372576d65170dfb5969fd03cc521Roman Divacky
52987c1e46533cae07216e2a67d5636a5afb44253155Daniel Dunbar  if (Output.isFilename()) {
5299008f54a54299eaafdaa940e2bdeaf55935ecd95aDaniel Dunbar    CmdArgs.push_back("-o");
5300008f54a54299eaafdaa940e2bdeaf55935ecd95aDaniel Dunbar    CmdArgs.push_back(Output.getFilename());
5301008f54a54299eaafdaa940e2bdeaf55935ecd95aDaniel Dunbar  } else {
5302008f54a54299eaafdaa940e2bdeaf55935ecd95aDaniel Dunbar    assert(Output.isNothing() && "Invalid output.");
5303008f54a54299eaafdaa940e2bdeaf55935ecd95aDaniel Dunbar  }
5304008f54a54299eaafdaa940e2bdeaf55935ecd95aDaniel Dunbar
5305008f54a54299eaafdaa940e2bdeaf55935ecd95aDaniel Dunbar  if (!Args.hasArg(options::OPT_nostdlib) &&
5306008f54a54299eaafdaa940e2bdeaf55935ecd95aDaniel Dunbar      !Args.hasArg(options::OPT_nostartfiles)) {
53079438016db2332aca8b53fd953da06128373cc5beRoman Divacky    const char *crt1 = NULL;
5308008f54a54299eaafdaa940e2bdeaf55935ecd95aDaniel Dunbar    if (!Args.hasArg(options::OPT_shared)) {
5309c16bb76f25ada63864aa89827a9906c1579d2ad3Roman Divacky      if (Args.hasArg(options::OPT_pg))
53109438016db2332aca8b53fd953da06128373cc5beRoman Divacky        crt1 = "gcrt1.o";
53119438016db2332aca8b53fd953da06128373cc5beRoman Divacky      else if (Args.hasArg(options::OPT_pie))
53129438016db2332aca8b53fd953da06128373cc5beRoman Divacky        crt1 = "Scrt1.o";
53139438016db2332aca8b53fd953da06128373cc5beRoman Divacky      else
53149438016db2332aca8b53fd953da06128373cc5beRoman Divacky        crt1 = "crt1.o";
5315008f54a54299eaafdaa940e2bdeaf55935ecd95aDaniel Dunbar    }
53169438016db2332aca8b53fd953da06128373cc5beRoman Divacky    if (crt1)
53179438016db2332aca8b53fd953da06128373cc5beRoman Divacky      CmdArgs.push_back(Args.MakeArgString(ToolChain.GetFilePath(crt1)));
53189438016db2332aca8b53fd953da06128373cc5beRoman Divacky
53199438016db2332aca8b53fd953da06128373cc5beRoman Divacky    CmdArgs.push_back(Args.MakeArgString(ToolChain.GetFilePath("crti.o")));
53209438016db2332aca8b53fd953da06128373cc5beRoman Divacky
53219438016db2332aca8b53fd953da06128373cc5beRoman Divacky    const char *crtbegin = NULL;
53229438016db2332aca8b53fd953da06128373cc5beRoman Divacky    if (Args.hasArg(options::OPT_static))
53239438016db2332aca8b53fd953da06128373cc5beRoman Divacky      crtbegin = "crtbeginT.o";
53249438016db2332aca8b53fd953da06128373cc5beRoman Divacky    else if (Args.hasArg(options::OPT_shared) || Args.hasArg(options::OPT_pie))
53259438016db2332aca8b53fd953da06128373cc5beRoman Divacky      crtbegin = "crtbeginS.o";
53269438016db2332aca8b53fd953da06128373cc5beRoman Divacky    else
53279438016db2332aca8b53fd953da06128373cc5beRoman Divacky      crtbegin = "crtbegin.o";
53289438016db2332aca8b53fd953da06128373cc5beRoman Divacky
53299438016db2332aca8b53fd953da06128373cc5beRoman Divacky    CmdArgs.push_back(Args.MakeArgString(ToolChain.GetFilePath(crtbegin)));
5330008f54a54299eaafdaa940e2bdeaf55935ecd95aDaniel Dunbar  }
5331008f54a54299eaafdaa940e2bdeaf55935ecd95aDaniel Dunbar
5332008f54a54299eaafdaa940e2bdeaf55935ecd95aDaniel Dunbar  Args.AddAllArgs(CmdArgs, options::OPT_L);
53339438016db2332aca8b53fd953da06128373cc5beRoman Divacky  const ToolChain::path_list Paths = ToolChain.getFilePaths();
533458e5ac9d41d8186bea92e892d572e2eea28d3f9cRoman Divacky  for (ToolChain::path_list::const_iterator i = Paths.begin(), e = Paths.end();
533558e5ac9d41d8186bea92e892d572e2eea28d3f9cRoman Divacky       i != e; ++i)
53365f9e272e632e951b1efe824cd16acb4d96077930Chris Lattner    CmdArgs.push_back(Args.MakeArgString(StringRef("-L") + *i));
5337008f54a54299eaafdaa940e2bdeaf55935ecd95aDaniel Dunbar  Args.AddAllArgs(CmdArgs, options::OPT_T_Group);
5338008f54a54299eaafdaa940e2bdeaf55935ecd95aDaniel Dunbar  Args.AddAllArgs(CmdArgs, options::OPT_e);
5339c736377543edcfbb00a4150fae79b4d9d9f66849David Chisnall  Args.AddAllArgs(CmdArgs, options::OPT_s);
5340c736377543edcfbb00a4150fae79b4d9d9f66849David Chisnall  Args.AddAllArgs(CmdArgs, options::OPT_t);
5341c736377543edcfbb00a4150fae79b4d9d9f66849David Chisnall  Args.AddAllArgs(CmdArgs, options::OPT_Z_Flag);
5342c736377543edcfbb00a4150fae79b4d9d9f66849David Chisnall  Args.AddAllArgs(CmdArgs, options::OPT_r);
5343008f54a54299eaafdaa940e2bdeaf55935ecd95aDaniel Dunbar
53449438016db2332aca8b53fd953da06128373cc5beRoman Divacky  AddLinkerInputs(ToolChain, Inputs, Args, CmdArgs);
53458e50a96b387dca7525caa8a6add31420dd82a2cdBenjamin Kramer
53468e50a96b387dca7525caa8a6add31420dd82a2cdBenjamin Kramer  if (!Args.hasArg(options::OPT_nostdlib) &&
53478e50a96b387dca7525caa8a6add31420dd82a2cdBenjamin Kramer      !Args.hasArg(options::OPT_nodefaultlibs)) {
53488e50a96b387dca7525caa8a6add31420dd82a2cdBenjamin Kramer    if (D.CCCIsCXX) {
53499438016db2332aca8b53fd953da06128373cc5beRoman Divacky      ToolChain.AddCXXStdlibLibArgs(Args, CmdArgs);
5350c16bb76f25ada63864aa89827a9906c1579d2ad3Roman Divacky      if (Args.hasArg(options::OPT_pg))
5351c16bb76f25ada63864aa89827a9906c1579d2ad3Roman Divacky        CmdArgs.push_back("-lm_p");
5352c16bb76f25ada63864aa89827a9906c1579d2ad3Roman Divacky      else
5353c16bb76f25ada63864aa89827a9906c1579d2ad3Roman Divacky        CmdArgs.push_back("-lm");
53548e50a96b387dca7525caa8a6add31420dd82a2cdBenjamin Kramer    }
53558e50a96b387dca7525caa8a6add31420dd82a2cdBenjamin Kramer    // FIXME: For some reason GCC passes -lgcc and -lgcc_s before adding
53568e50a96b387dca7525caa8a6add31420dd82a2cdBenjamin Kramer    // the default system libraries. Just mimic this for now.
5357c16bb76f25ada63864aa89827a9906c1579d2ad3Roman Divacky    if (Args.hasArg(options::OPT_pg))
5358c16bb76f25ada63864aa89827a9906c1579d2ad3Roman Divacky      CmdArgs.push_back("-lgcc_p");
5359c16bb76f25ada63864aa89827a9906c1579d2ad3Roman Divacky    else
5360c16bb76f25ada63864aa89827a9906c1579d2ad3Roman Divacky      CmdArgs.push_back("-lgcc");
53618e50a96b387dca7525caa8a6add31420dd82a2cdBenjamin Kramer    if (Args.hasArg(options::OPT_static)) {
53628e50a96b387dca7525caa8a6add31420dd82a2cdBenjamin Kramer      CmdArgs.push_back("-lgcc_eh");
5363c16bb76f25ada63864aa89827a9906c1579d2ad3Roman Divacky    } else if (Args.hasArg(options::OPT_pg)) {
5364c16bb76f25ada63864aa89827a9906c1579d2ad3Roman Divacky      CmdArgs.push_back("-lgcc_eh_p");
53658e50a96b387dca7525caa8a6add31420dd82a2cdBenjamin Kramer    } else {
53668e50a96b387dca7525caa8a6add31420dd82a2cdBenjamin Kramer      CmdArgs.push_back("--as-needed");
53678e50a96b387dca7525caa8a6add31420dd82a2cdBenjamin Kramer      CmdArgs.push_back("-lgcc_s");
53688e50a96b387dca7525caa8a6add31420dd82a2cdBenjamin Kramer      CmdArgs.push_back("--no-as-needed");
53698e50a96b387dca7525caa8a6add31420dd82a2cdBenjamin Kramer    }
53708e50a96b387dca7525caa8a6add31420dd82a2cdBenjamin Kramer
5371242302673bdcf35b49579a30fed9dc068a4e10f2Matt Beaumont-Gay    if (Args.hasArg(options::OPT_pthread)) {
5372c16bb76f25ada63864aa89827a9906c1579d2ad3Roman Divacky      if (Args.hasArg(options::OPT_pg))
5373c16bb76f25ada63864aa89827a9906c1579d2ad3Roman Divacky        CmdArgs.push_back("-lpthread_p");
5374c16bb76f25ada63864aa89827a9906c1579d2ad3Roman Divacky      else
5375c16bb76f25ada63864aa89827a9906c1579d2ad3Roman Divacky        CmdArgs.push_back("-lpthread");
5376242302673bdcf35b49579a30fed9dc068a4e10f2Matt Beaumont-Gay    }
5377c16bb76f25ada63864aa89827a9906c1579d2ad3Roman Divacky
5378c16bb76f25ada63864aa89827a9906c1579d2ad3Roman Divacky    if (Args.hasArg(options::OPT_pg)) {
5379c16bb76f25ada63864aa89827a9906c1579d2ad3Roman Divacky      if (Args.hasArg(options::OPT_shared))
5380c16bb76f25ada63864aa89827a9906c1579d2ad3Roman Divacky        CmdArgs.push_back("-lc");
5381c16bb76f25ada63864aa89827a9906c1579d2ad3Roman Divacky      else
5382c16bb76f25ada63864aa89827a9906c1579d2ad3Roman Divacky        CmdArgs.push_back("-lc_p");
5383c16bb76f25ada63864aa89827a9906c1579d2ad3Roman Divacky      CmdArgs.push_back("-lgcc_p");
5384c16bb76f25ada63864aa89827a9906c1579d2ad3Roman Divacky    } else {
5385c16bb76f25ada63864aa89827a9906c1579d2ad3Roman Divacky      CmdArgs.push_back("-lc");
5386c16bb76f25ada63864aa89827a9906c1579d2ad3Roman Divacky      CmdArgs.push_back("-lgcc");
5387c16bb76f25ada63864aa89827a9906c1579d2ad3Roman Divacky    }
53888e50a96b387dca7525caa8a6add31420dd82a2cdBenjamin Kramer
53898e50a96b387dca7525caa8a6add31420dd82a2cdBenjamin Kramer    if (Args.hasArg(options::OPT_static)) {
53908e50a96b387dca7525caa8a6add31420dd82a2cdBenjamin Kramer      CmdArgs.push_back("-lgcc_eh");
5391c16bb76f25ada63864aa89827a9906c1579d2ad3Roman Divacky    } else if (Args.hasArg(options::OPT_pg)) {
5392c16bb76f25ada63864aa89827a9906c1579d2ad3Roman Divacky      CmdArgs.push_back("-lgcc_eh_p");
53938e50a96b387dca7525caa8a6add31420dd82a2cdBenjamin Kramer    } else {
53948e50a96b387dca7525caa8a6add31420dd82a2cdBenjamin Kramer      CmdArgs.push_back("--as-needed");
53958e50a96b387dca7525caa8a6add31420dd82a2cdBenjamin Kramer      CmdArgs.push_back("-lgcc_s");
53968e50a96b387dca7525caa8a6add31420dd82a2cdBenjamin Kramer      CmdArgs.push_back("--no-as-needed");
53978e50a96b387dca7525caa8a6add31420dd82a2cdBenjamin Kramer    }
53988e50a96b387dca7525caa8a6add31420dd82a2cdBenjamin Kramer  }
53998e50a96b387dca7525caa8a6add31420dd82a2cdBenjamin Kramer
54008e50a96b387dca7525caa8a6add31420dd82a2cdBenjamin Kramer  if (!Args.hasArg(options::OPT_nostdlib) &&
54018e50a96b387dca7525caa8a6add31420dd82a2cdBenjamin Kramer      !Args.hasArg(options::OPT_nostartfiles)) {
5402f6513810c9e5bb75336b69e08cf99cc8ba97175fRoman Divacky    if (Args.hasArg(options::OPT_shared) || Args.hasArg(options::OPT_pie))
54039438016db2332aca8b53fd953da06128373cc5beRoman Divacky      CmdArgs.push_back(Args.MakeArgString(ToolChain.GetFilePath("crtendS.o")));
5404f6513810c9e5bb75336b69e08cf99cc8ba97175fRoman Divacky    else
5405f6513810c9e5bb75336b69e08cf99cc8ba97175fRoman Divacky      CmdArgs.push_back(Args.MakeArgString(ToolChain.GetFilePath("crtend.o")));
54069438016db2332aca8b53fd953da06128373cc5beRoman Divacky    CmdArgs.push_back(Args.MakeArgString(ToolChain.GetFilePath("crtn.o")));
54078e50a96b387dca7525caa8a6add31420dd82a2cdBenjamin Kramer  }
54088e50a96b387dca7525caa8a6add31420dd82a2cdBenjamin Kramer
54099438016db2332aca8b53fd953da06128373cc5beRoman Divacky  addProfileRT(ToolChain, Args, CmdArgs, ToolChain.getTriple());
54102e95a6d7d0b5aed39747875d7474c27824f7319fNick Lewycky
54118e50a96b387dca7525caa8a6add31420dd82a2cdBenjamin Kramer  const char *Exec =
54129438016db2332aca8b53fd953da06128373cc5beRoman Divacky    Args.MakeArgString(ToolChain.GetProgramPath("ld"));
54138e50a96b387dca7525caa8a6add31420dd82a2cdBenjamin Kramer  C.addCommand(new Command(JA, *this, Exec, CmdArgs));
54148e50a96b387dca7525caa8a6add31420dd82a2cdBenjamin Kramer}
54158e50a96b387dca7525caa8a6add31420dd82a2cdBenjamin Kramer
54168e50a96b387dca7525caa8a6add31420dd82a2cdBenjamin Kramervoid netbsd::Assemble::ConstructJob(Compilation &C, const JobAction &JA,
54178e50a96b387dca7525caa8a6add31420dd82a2cdBenjamin Kramer                                     const InputInfo &Output,
54188e50a96b387dca7525caa8a6add31420dd82a2cdBenjamin Kramer                                     const InputInfoList &Inputs,
54198e50a96b387dca7525caa8a6add31420dd82a2cdBenjamin Kramer                                     const ArgList &Args,
54208e50a96b387dca7525caa8a6add31420dd82a2cdBenjamin Kramer                                     const char *LinkingOutput) const {
54218e50a96b387dca7525caa8a6add31420dd82a2cdBenjamin Kramer  ArgStringList CmdArgs;
54228e50a96b387dca7525caa8a6add31420dd82a2cdBenjamin Kramer
54238e50a96b387dca7525caa8a6add31420dd82a2cdBenjamin Kramer  // When building 32-bit code on NetBSD/amd64, we have to explicitly
54248e50a96b387dca7525caa8a6add31420dd82a2cdBenjamin Kramer  // instruct as in the base system to assemble 32-bit code.
54251bd91374498ac78e72545f08f4daa6491f9c9d14Joerg Sonnenberger  if (getToolChain().getArch() == llvm::Triple::x86)
54268e50a96b387dca7525caa8a6add31420dd82a2cdBenjamin Kramer    CmdArgs.push_back("--32");
54278e50a96b387dca7525caa8a6add31420dd82a2cdBenjamin Kramer
54288e50a96b387dca7525caa8a6add31420dd82a2cdBenjamin Kramer  // Set byte order explicitly
542964f7ad9328e877779ec63638f39de4e10d2ff276Rafael Espindola  if (getToolChain().getArch() == llvm::Triple::mips)
54308e50a96b387dca7525caa8a6add31420dd82a2cdBenjamin Kramer    CmdArgs.push_back("-EB");
543164f7ad9328e877779ec63638f39de4e10d2ff276Rafael Espindola  else if (getToolChain().getArch() == llvm::Triple::mipsel)
54328e50a96b387dca7525caa8a6add31420dd82a2cdBenjamin Kramer    CmdArgs.push_back("-EL");
54338e50a96b387dca7525caa8a6add31420dd82a2cdBenjamin Kramer
54348e50a96b387dca7525caa8a6add31420dd82a2cdBenjamin Kramer  Args.AddAllArgValues(CmdArgs, options::OPT_Wa_COMMA,
54358e50a96b387dca7525caa8a6add31420dd82a2cdBenjamin Kramer                       options::OPT_Xassembler);
54368e50a96b387dca7525caa8a6add31420dd82a2cdBenjamin Kramer
54378e50a96b387dca7525caa8a6add31420dd82a2cdBenjamin Kramer  CmdArgs.push_back("-o");
54388e50a96b387dca7525caa8a6add31420dd82a2cdBenjamin Kramer  CmdArgs.push_back(Output.getFilename());
54398e50a96b387dca7525caa8a6add31420dd82a2cdBenjamin Kramer
54408e50a96b387dca7525caa8a6add31420dd82a2cdBenjamin Kramer  for (InputInfoList::const_iterator
54418e50a96b387dca7525caa8a6add31420dd82a2cdBenjamin Kramer         it = Inputs.begin(), ie = Inputs.end(); it != ie; ++it) {
54428e50a96b387dca7525caa8a6add31420dd82a2cdBenjamin Kramer    const InputInfo &II = *it;
54438e50a96b387dca7525caa8a6add31420dd82a2cdBenjamin Kramer    CmdArgs.push_back(II.getFilename());
54448e50a96b387dca7525caa8a6add31420dd82a2cdBenjamin Kramer  }
54458e50a96b387dca7525caa8a6add31420dd82a2cdBenjamin Kramer
54465adcec16cb8d9e7bebf310b6c07249dfd852346bDavid Chisnall  const char *Exec = Args.MakeArgString((getToolChain().GetProgramPath("as")));
54478e50a96b387dca7525caa8a6add31420dd82a2cdBenjamin Kramer  C.addCommand(new Command(JA, *this, Exec, CmdArgs));
54488e50a96b387dca7525caa8a6add31420dd82a2cdBenjamin Kramer}
54498e50a96b387dca7525caa8a6add31420dd82a2cdBenjamin Kramer
54508e50a96b387dca7525caa8a6add31420dd82a2cdBenjamin Kramervoid netbsd::Link::ConstructJob(Compilation &C, const JobAction &JA,
54518e50a96b387dca7525caa8a6add31420dd82a2cdBenjamin Kramer                                 const InputInfo &Output,
54528e50a96b387dca7525caa8a6add31420dd82a2cdBenjamin Kramer                                 const InputInfoList &Inputs,
54538e50a96b387dca7525caa8a6add31420dd82a2cdBenjamin Kramer                                 const ArgList &Args,
54548e50a96b387dca7525caa8a6add31420dd82a2cdBenjamin Kramer                                 const char *LinkingOutput) const {
54558e50a96b387dca7525caa8a6add31420dd82a2cdBenjamin Kramer  const Driver &D = getToolChain().getDriver();
54568e50a96b387dca7525caa8a6add31420dd82a2cdBenjamin Kramer  ArgStringList CmdArgs;
54578e50a96b387dca7525caa8a6add31420dd82a2cdBenjamin Kramer
54588ab2bdcc4f397e100c684ede8e8ca6e226e1380aJoerg Sonnenberger  if (!D.SysRoot.empty())
54598ab2bdcc4f397e100c684ede8e8ca6e226e1380aJoerg Sonnenberger    CmdArgs.push_back(Args.MakeArgString("--sysroot=" + D.SysRoot));
54608ab2bdcc4f397e100c684ede8e8ca6e226e1380aJoerg Sonnenberger
54618e50a96b387dca7525caa8a6add31420dd82a2cdBenjamin Kramer  if (Args.hasArg(options::OPT_static)) {
54628e50a96b387dca7525caa8a6add31420dd82a2cdBenjamin Kramer    CmdArgs.push_back("-Bstatic");
54638e50a96b387dca7525caa8a6add31420dd82a2cdBenjamin Kramer  } else {
54648e50a96b387dca7525caa8a6add31420dd82a2cdBenjamin Kramer    if (Args.hasArg(options::OPT_rdynamic))
54658e50a96b387dca7525caa8a6add31420dd82a2cdBenjamin Kramer      CmdArgs.push_back("-export-dynamic");
54668e50a96b387dca7525caa8a6add31420dd82a2cdBenjamin Kramer    CmdArgs.push_back("--eh-frame-hdr");
54678e50a96b387dca7525caa8a6add31420dd82a2cdBenjamin Kramer    if (Args.hasArg(options::OPT_shared)) {
54688e50a96b387dca7525caa8a6add31420dd82a2cdBenjamin Kramer      CmdArgs.push_back("-Bshareable");
54698e50a96b387dca7525caa8a6add31420dd82a2cdBenjamin Kramer    } else {
54708e50a96b387dca7525caa8a6add31420dd82a2cdBenjamin Kramer      CmdArgs.push_back("-dynamic-linker");
54718e50a96b387dca7525caa8a6add31420dd82a2cdBenjamin Kramer      CmdArgs.push_back("/libexec/ld.elf_so");
54728e50a96b387dca7525caa8a6add31420dd82a2cdBenjamin Kramer    }
54738e50a96b387dca7525caa8a6add31420dd82a2cdBenjamin Kramer  }
54748e50a96b387dca7525caa8a6add31420dd82a2cdBenjamin Kramer
54758e50a96b387dca7525caa8a6add31420dd82a2cdBenjamin Kramer  // When building 32-bit code on NetBSD/amd64, we have to explicitly
54768e50a96b387dca7525caa8a6add31420dd82a2cdBenjamin Kramer  // instruct ld in the base system to link 32-bit code.
54771bd91374498ac78e72545f08f4daa6491f9c9d14Joerg Sonnenberger  if (getToolChain().getArch() == llvm::Triple::x86) {
54788e50a96b387dca7525caa8a6add31420dd82a2cdBenjamin Kramer    CmdArgs.push_back("-m");
54798e50a96b387dca7525caa8a6add31420dd82a2cdBenjamin Kramer    CmdArgs.push_back("elf_i386");
54808e50a96b387dca7525caa8a6add31420dd82a2cdBenjamin Kramer  }
54818e50a96b387dca7525caa8a6add31420dd82a2cdBenjamin Kramer
54828e50a96b387dca7525caa8a6add31420dd82a2cdBenjamin Kramer  if (Output.isFilename()) {
54838e50a96b387dca7525caa8a6add31420dd82a2cdBenjamin Kramer    CmdArgs.push_back("-o");
54848e50a96b387dca7525caa8a6add31420dd82a2cdBenjamin Kramer    CmdArgs.push_back(Output.getFilename());
54858e50a96b387dca7525caa8a6add31420dd82a2cdBenjamin Kramer  } else {
54868e50a96b387dca7525caa8a6add31420dd82a2cdBenjamin Kramer    assert(Output.isNothing() && "Invalid output.");
54878e50a96b387dca7525caa8a6add31420dd82a2cdBenjamin Kramer  }
54888e50a96b387dca7525caa8a6add31420dd82a2cdBenjamin Kramer
54898e50a96b387dca7525caa8a6add31420dd82a2cdBenjamin Kramer  if (!Args.hasArg(options::OPT_nostdlib) &&
54908e50a96b387dca7525caa8a6add31420dd82a2cdBenjamin Kramer      !Args.hasArg(options::OPT_nostartfiles)) {
54918e50a96b387dca7525caa8a6add31420dd82a2cdBenjamin Kramer    if (!Args.hasArg(options::OPT_shared)) {
54928e50a96b387dca7525caa8a6add31420dd82a2cdBenjamin Kramer      CmdArgs.push_back(Args.MakeArgString(
54938e50a96b387dca7525caa8a6add31420dd82a2cdBenjamin Kramer                              getToolChain().GetFilePath("crt0.o")));
54948e50a96b387dca7525caa8a6add31420dd82a2cdBenjamin Kramer      CmdArgs.push_back(Args.MakeArgString(
54958e50a96b387dca7525caa8a6add31420dd82a2cdBenjamin Kramer                              getToolChain().GetFilePath("crti.o")));
54968e50a96b387dca7525caa8a6add31420dd82a2cdBenjamin Kramer      CmdArgs.push_back(Args.MakeArgString(
54978e50a96b387dca7525caa8a6add31420dd82a2cdBenjamin Kramer                              getToolChain().GetFilePath("crtbegin.o")));
54988e50a96b387dca7525caa8a6add31420dd82a2cdBenjamin Kramer    } else {
54998e50a96b387dca7525caa8a6add31420dd82a2cdBenjamin Kramer      CmdArgs.push_back(Args.MakeArgString(
55008e50a96b387dca7525caa8a6add31420dd82a2cdBenjamin Kramer                              getToolChain().GetFilePath("crti.o")));
55018e50a96b387dca7525caa8a6add31420dd82a2cdBenjamin Kramer      CmdArgs.push_back(Args.MakeArgString(
55028e50a96b387dca7525caa8a6add31420dd82a2cdBenjamin Kramer                              getToolChain().GetFilePath("crtbeginS.o")));
55038e50a96b387dca7525caa8a6add31420dd82a2cdBenjamin Kramer    }
55048e50a96b387dca7525caa8a6add31420dd82a2cdBenjamin Kramer  }
55058e50a96b387dca7525caa8a6add31420dd82a2cdBenjamin Kramer
55068e50a96b387dca7525caa8a6add31420dd82a2cdBenjamin Kramer  Args.AddAllArgs(CmdArgs, options::OPT_L);
55078e50a96b387dca7525caa8a6add31420dd82a2cdBenjamin Kramer  Args.AddAllArgs(CmdArgs, options::OPT_T_Group);
55088e50a96b387dca7525caa8a6add31420dd82a2cdBenjamin Kramer  Args.AddAllArgs(CmdArgs, options::OPT_e);
55098e50a96b387dca7525caa8a6add31420dd82a2cdBenjamin Kramer  Args.AddAllArgs(CmdArgs, options::OPT_s);
55108e50a96b387dca7525caa8a6add31420dd82a2cdBenjamin Kramer  Args.AddAllArgs(CmdArgs, options::OPT_t);
55118e50a96b387dca7525caa8a6add31420dd82a2cdBenjamin Kramer  Args.AddAllArgs(CmdArgs, options::OPT_Z_Flag);
55128e50a96b387dca7525caa8a6add31420dd82a2cdBenjamin Kramer  Args.AddAllArgs(CmdArgs, options::OPT_r);
55138e50a96b387dca7525caa8a6add31420dd82a2cdBenjamin Kramer
55148e50a96b387dca7525caa8a6add31420dd82a2cdBenjamin Kramer  AddLinkerInputs(getToolChain(), Inputs, Args, CmdArgs);
5515008f54a54299eaafdaa940e2bdeaf55935ecd95aDaniel Dunbar
5516008f54a54299eaafdaa940e2bdeaf55935ecd95aDaniel Dunbar  if (!Args.hasArg(options::OPT_nostdlib) &&
5517008f54a54299eaafdaa940e2bdeaf55935ecd95aDaniel Dunbar      !Args.hasArg(options::OPT_nodefaultlibs)) {
55182002263e10aa369c89008d37cada2908203fd822Daniel Dunbar    if (D.CCCIsCXX) {
5519132e35d2f87895d20e7ea146c8c00404b80221a1Daniel Dunbar      getToolChain().AddCXXStdlibLibArgs(Args, CmdArgs);
55202002263e10aa369c89008d37cada2908203fd822Daniel Dunbar      CmdArgs.push_back("-lm");
55212002263e10aa369c89008d37cada2908203fd822Daniel Dunbar    }
5522008f54a54299eaafdaa940e2bdeaf55935ecd95aDaniel Dunbar    // FIXME: For some reason GCC passes -lgcc and -lgcc_s before adding
5523008f54a54299eaafdaa940e2bdeaf55935ecd95aDaniel Dunbar    // the default system libraries. Just mimic this for now.
5524008f54a54299eaafdaa940e2bdeaf55935ecd95aDaniel Dunbar    if (Args.hasArg(options::OPT_static)) {
5525008f54a54299eaafdaa940e2bdeaf55935ecd95aDaniel Dunbar      CmdArgs.push_back("-lgcc_eh");
5526008f54a54299eaafdaa940e2bdeaf55935ecd95aDaniel Dunbar    } else {
5527008f54a54299eaafdaa940e2bdeaf55935ecd95aDaniel Dunbar      CmdArgs.push_back("--as-needed");
5528008f54a54299eaafdaa940e2bdeaf55935ecd95aDaniel Dunbar      CmdArgs.push_back("-lgcc_s");
5529008f54a54299eaafdaa940e2bdeaf55935ecd95aDaniel Dunbar      CmdArgs.push_back("--no-as-needed");
5530008f54a54299eaafdaa940e2bdeaf55935ecd95aDaniel Dunbar    }
5531db6393f259b8e634302e27d538ca4760f4221d91Joerg Sonnenberger    CmdArgs.push_back("-lgcc");
5532008f54a54299eaafdaa940e2bdeaf55935ecd95aDaniel Dunbar
5533008f54a54299eaafdaa940e2bdeaf55935ecd95aDaniel Dunbar    if (Args.hasArg(options::OPT_pthread))
5534008f54a54299eaafdaa940e2bdeaf55935ecd95aDaniel Dunbar      CmdArgs.push_back("-lpthread");
5535008f54a54299eaafdaa940e2bdeaf55935ecd95aDaniel Dunbar    CmdArgs.push_back("-lc");
5536008f54a54299eaafdaa940e2bdeaf55935ecd95aDaniel Dunbar
5537008f54a54299eaafdaa940e2bdeaf55935ecd95aDaniel Dunbar    CmdArgs.push_back("-lgcc");
5538008f54a54299eaafdaa940e2bdeaf55935ecd95aDaniel Dunbar    if (Args.hasArg(options::OPT_static)) {
5539008f54a54299eaafdaa940e2bdeaf55935ecd95aDaniel Dunbar      CmdArgs.push_back("-lgcc_eh");
5540008f54a54299eaafdaa940e2bdeaf55935ecd95aDaniel Dunbar    } else {
5541008f54a54299eaafdaa940e2bdeaf55935ecd95aDaniel Dunbar      CmdArgs.push_back("--as-needed");
5542008f54a54299eaafdaa940e2bdeaf55935ecd95aDaniel Dunbar      CmdArgs.push_back("-lgcc_s");
5543008f54a54299eaafdaa940e2bdeaf55935ecd95aDaniel Dunbar      CmdArgs.push_back("--no-as-needed");
5544008f54a54299eaafdaa940e2bdeaf55935ecd95aDaniel Dunbar    }
5545008f54a54299eaafdaa940e2bdeaf55935ecd95aDaniel Dunbar  }
5546008f54a54299eaafdaa940e2bdeaf55935ecd95aDaniel Dunbar
5547008f54a54299eaafdaa940e2bdeaf55935ecd95aDaniel Dunbar  if (!Args.hasArg(options::OPT_nostdlib) &&
5548008f54a54299eaafdaa940e2bdeaf55935ecd95aDaniel Dunbar      !Args.hasArg(options::OPT_nostartfiles)) {
5549008f54a54299eaafdaa940e2bdeaf55935ecd95aDaniel Dunbar    if (!Args.hasArg(options::OPT_shared))
55504a7e88978cf646ad10d654020cb00b3877069210Daniel Dunbar      CmdArgs.push_back(Args.MakeArgString(getToolChain().GetFilePath(
555138e317d6dce161b249508686cc67eb7176958762Chris Lattner                                                                  "crtend.o")));
5552008f54a54299eaafdaa940e2bdeaf55935ecd95aDaniel Dunbar    else
55534a7e88978cf646ad10d654020cb00b3877069210Daniel Dunbar      CmdArgs.push_back(Args.MakeArgString(getToolChain().GetFilePath(
555438e317d6dce161b249508686cc67eb7176958762Chris Lattner                                                                 "crtendS.o")));
55554a7e88978cf646ad10d654020cb00b3877069210Daniel Dunbar    CmdArgs.push_back(Args.MakeArgString(getToolChain().GetFilePath(
555638e317d6dce161b249508686cc67eb7176958762Chris Lattner                                                                    "crtn.o")));
5557008f54a54299eaafdaa940e2bdeaf55935ecd95aDaniel Dunbar  }
5558008f54a54299eaafdaa940e2bdeaf55935ecd95aDaniel Dunbar
55593f4be6fb8872942f567166ab8d99c89885f26103Bill Wendling  addProfileRT(getToolChain(), Args, CmdArgs, getToolChain().getTriple());
55602e95a6d7d0b5aed39747875d7474c27824f7319fNick Lewycky
55615adcec16cb8d9e7bebf310b6c07249dfd852346bDavid Chisnall  const char *Exec = Args.MakeArgString(getToolChain().GetProgramPath("ld"));
55622fe238ed293bd4bc27af9beb9fa151fad2146fa8Daniel Dunbar  C.addCommand(new Command(JA, *this, Exec, CmdArgs));
5563008f54a54299eaafdaa940e2bdeaf55935ecd95aDaniel Dunbar}
556411e1b40d759a643086f590f6ffbd9d68360bad46Daniel Dunbar
5565ba30bbe4e36a30a274da809a11a42f9cdc168e92Rafael Espindolavoid linuxtools::Assemble::ConstructJob(Compilation &C, const JobAction &JA,
5566ba30bbe4e36a30a274da809a11a42f9cdc168e92Rafael Espindola                                        const InputInfo &Output,
5567ba30bbe4e36a30a274da809a11a42f9cdc168e92Rafael Espindola                                        const InputInfoList &Inputs,
5568ba30bbe4e36a30a274da809a11a42f9cdc168e92Rafael Espindola                                        const ArgList &Args,
5569ba30bbe4e36a30a274da809a11a42f9cdc168e92Rafael Espindola                                        const char *LinkingOutput) const {
5570ba30bbe4e36a30a274da809a11a42f9cdc168e92Rafael Espindola  ArgStringList CmdArgs;
5571ba30bbe4e36a30a274da809a11a42f9cdc168e92Rafael Espindola
5572ba30bbe4e36a30a274da809a11a42f9cdc168e92Rafael Espindola  // Add --32/--64 to make sure we get the format we want.
5573ba30bbe4e36a30a274da809a11a42f9cdc168e92Rafael Espindola  // This is incomplete
5574ba30bbe4e36a30a274da809a11a42f9cdc168e92Rafael Espindola  if (getToolChain().getArch() == llvm::Triple::x86) {
5575ba30bbe4e36a30a274da809a11a42f9cdc168e92Rafael Espindola    CmdArgs.push_back("--32");
5576ba30bbe4e36a30a274da809a11a42f9cdc168e92Rafael Espindola  } else if (getToolChain().getArch() == llvm::Triple::x86_64) {
5577ba30bbe4e36a30a274da809a11a42f9cdc168e92Rafael Espindola    CmdArgs.push_back("--64");
55787972c88f674475037fa11fea718565e5bcdd61a6Eli Friedman  } else if (getToolChain().getArch() == llvm::Triple::ppc) {
55797972c88f674475037fa11fea718565e5bcdd61a6Eli Friedman    CmdArgs.push_back("-a32");
55807972c88f674475037fa11fea718565e5bcdd61a6Eli Friedman    CmdArgs.push_back("-mppc");
55817972c88f674475037fa11fea718565e5bcdd61a6Eli Friedman    CmdArgs.push_back("-many");
55827972c88f674475037fa11fea718565e5bcdd61a6Eli Friedman  } else if (getToolChain().getArch() == llvm::Triple::ppc64) {
55837972c88f674475037fa11fea718565e5bcdd61a6Eli Friedman    CmdArgs.push_back("-a64");
55847972c88f674475037fa11fea718565e5bcdd61a6Eli Friedman    CmdArgs.push_back("-mppc64");
55857972c88f674475037fa11fea718565e5bcdd61a6Eli Friedman    CmdArgs.push_back("-many");
5586ba30bbe4e36a30a274da809a11a42f9cdc168e92Rafael Espindola  } else if (getToolChain().getArch() == llvm::Triple::arm) {
55875f9e272e632e951b1efe824cd16acb4d96077930Chris Lattner    StringRef MArch = getToolChain().getArchName();
5588ba30bbe4e36a30a274da809a11a42f9cdc168e92Rafael Espindola    if (MArch == "armv7" || MArch == "armv7a" || MArch == "armv7-a")
5589ba30bbe4e36a30a274da809a11a42f9cdc168e92Rafael Espindola      CmdArgs.push_back("-mfpu=neon");
5590700c508fd469a971480c36d54ae12fe9011f27c0Evgeniy Stepanov
5591700c508fd469a971480c36d54ae12fe9011f27c0Evgeniy Stepanov    StringRef ARMFloatABI = getARMFloatABI(getToolChain().getDriver(), Args,
5592700c508fd469a971480c36d54ae12fe9011f27c0Evgeniy Stepanov                                           getToolChain().getTriple());
5593700c508fd469a971480c36d54ae12fe9011f27c0Evgeniy Stepanov    CmdArgs.push_back(Args.MakeArgString("-mfloat-abi=" + ARMFloatABI));
5594eca187e9f20886f20bb0ea78b4f4b87a18a96b8cEvgeniy Stepanov
5595eca187e9f20886f20bb0ea78b4f4b87a18a96b8cEvgeniy Stepanov    Args.AddLastArg(CmdArgs, options::OPT_march_EQ);
5596eca187e9f20886f20bb0ea78b4f4b87a18a96b8cEvgeniy Stepanov    Args.AddLastArg(CmdArgs, options::OPT_mcpu_EQ);
5597eca187e9f20886f20bb0ea78b4f4b87a18a96b8cEvgeniy Stepanov    Args.AddLastArg(CmdArgs, options::OPT_mfpu_EQ);
5598c85900f4d6aec17ef29140bfc97977463ac75cb2Akira Hatanaka  } else if (getToolChain().getArch() == llvm::Triple::mips ||
5599c85900f4d6aec17ef29140bfc97977463ac75cb2Akira Hatanaka             getToolChain().getArch() == llvm::Triple::mipsel ||
5600c85900f4d6aec17ef29140bfc97977463ac75cb2Akira Hatanaka             getToolChain().getArch() == llvm::Triple::mips64 ||
5601c85900f4d6aec17ef29140bfc97977463ac75cb2Akira Hatanaka             getToolChain().getArch() == llvm::Triple::mips64el) {
5602073a780f7cb863cd382d1c966ef11d05c6fad075Simon Atanasyan    StringRef CPUName;
5603073a780f7cb863cd382d1c966ef11d05c6fad075Simon Atanasyan    StringRef ABIName;
5604073a780f7cb863cd382d1c966ef11d05c6fad075Simon Atanasyan    getMipsCPUAndABI(Args, getToolChain(), CPUName, ABIName);
5605c85900f4d6aec17ef29140bfc97977463ac75cb2Akira Hatanaka
5606073a780f7cb863cd382d1c966ef11d05c6fad075Simon Atanasyan    CmdArgs.push_back("-march");
5607073a780f7cb863cd382d1c966ef11d05c6fad075Simon Atanasyan    CmdArgs.push_back(CPUName.data());
5608073a780f7cb863cd382d1c966ef11d05c6fad075Simon Atanasyan
5609073a780f7cb863cd382d1c966ef11d05c6fad075Simon Atanasyan    CmdArgs.push_back("-mabi");
5610e9616a4972a4c2fdc28128c057f21d7a79516c86Simon Atanasyan    CmdArgs.push_back(getGnuCompatibleMipsABIName(ABIName).data());
56115f0a1c12dacadd5a061ea5b57d51cf6798ae22a1Simon Atanasyan
56125f0a1c12dacadd5a061ea5b57d51cf6798ae22a1Simon Atanasyan    if (getToolChain().getArch() == llvm::Triple::mips ||
56135f0a1c12dacadd5a061ea5b57d51cf6798ae22a1Simon Atanasyan        getToolChain().getArch() == llvm::Triple::mips64)
56145f0a1c12dacadd5a061ea5b57d51cf6798ae22a1Simon Atanasyan      CmdArgs.push_back("-EB");
56155f0a1c12dacadd5a061ea5b57d51cf6798ae22a1Simon Atanasyan    else
56165f0a1c12dacadd5a061ea5b57d51cf6798ae22a1Simon Atanasyan      CmdArgs.push_back("-EL");
56171f0646e064c2d853d64db8585f661cacdde75c43Simon Atanasyan
56181f0646e064c2d853d64db8585f661cacdde75c43Simon Atanasyan    Arg *LastPICArg = Args.getLastArg(options::OPT_fPIC, options::OPT_fno_PIC,
56191f0646e064c2d853d64db8585f661cacdde75c43Simon Atanasyan                                      options::OPT_fpic, options::OPT_fno_pic,
56201f0646e064c2d853d64db8585f661cacdde75c43Simon Atanasyan                                      options::OPT_fPIE, options::OPT_fno_PIE,
56211f0646e064c2d853d64db8585f661cacdde75c43Simon Atanasyan                                      options::OPT_fpie, options::OPT_fno_pie);
56221f0646e064c2d853d64db8585f661cacdde75c43Simon Atanasyan    if (LastPICArg &&
56231f0646e064c2d853d64db8585f661cacdde75c43Simon Atanasyan        (LastPICArg->getOption().matches(options::OPT_fPIC) ||
56241f0646e064c2d853d64db8585f661cacdde75c43Simon Atanasyan         LastPICArg->getOption().matches(options::OPT_fpic) ||
56251f0646e064c2d853d64db8585f661cacdde75c43Simon Atanasyan         LastPICArg->getOption().matches(options::OPT_fPIE) ||
56261f0646e064c2d853d64db8585f661cacdde75c43Simon Atanasyan         LastPICArg->getOption().matches(options::OPT_fpie))) {
56271f0646e064c2d853d64db8585f661cacdde75c43Simon Atanasyan      CmdArgs.push_back("-KPIC");
56281f0646e064c2d853d64db8585f661cacdde75c43Simon Atanasyan    }
5629ba30bbe4e36a30a274da809a11a42f9cdc168e92Rafael Espindola  }
5630ba30bbe4e36a30a274da809a11a42f9cdc168e92Rafael Espindola
5631ba30bbe4e36a30a274da809a11a42f9cdc168e92Rafael Espindola  Args.AddAllArgValues(CmdArgs, options::OPT_Wa_COMMA,
5632ba30bbe4e36a30a274da809a11a42f9cdc168e92Rafael Espindola                       options::OPT_Xassembler);
5633ba30bbe4e36a30a274da809a11a42f9cdc168e92Rafael Espindola
5634ba30bbe4e36a30a274da809a11a42f9cdc168e92Rafael Espindola  CmdArgs.push_back("-o");
5635ba30bbe4e36a30a274da809a11a42f9cdc168e92Rafael Espindola  CmdArgs.push_back(Output.getFilename());
5636ba30bbe4e36a30a274da809a11a42f9cdc168e92Rafael Espindola
5637ba30bbe4e36a30a274da809a11a42f9cdc168e92Rafael Espindola  for (InputInfoList::const_iterator
5638ba30bbe4e36a30a274da809a11a42f9cdc168e92Rafael Espindola         it = Inputs.begin(), ie = Inputs.end(); it != ie; ++it) {
5639ba30bbe4e36a30a274da809a11a42f9cdc168e92Rafael Espindola    const InputInfo &II = *it;
5640ba30bbe4e36a30a274da809a11a42f9cdc168e92Rafael Espindola    CmdArgs.push_back(II.getFilename());
5641ba30bbe4e36a30a274da809a11a42f9cdc168e92Rafael Espindola  }
5642ba30bbe4e36a30a274da809a11a42f9cdc168e92Rafael Espindola
5643ba30bbe4e36a30a274da809a11a42f9cdc168e92Rafael Espindola  const char *Exec =
5644ba30bbe4e36a30a274da809a11a42f9cdc168e92Rafael Espindola    Args.MakeArgString(getToolChain().GetProgramPath("as"));
5645ba30bbe4e36a30a274da809a11a42f9cdc168e92Rafael Espindola  C.addCommand(new Command(JA, *this, Exec, CmdArgs));
5646ba30bbe4e36a30a274da809a11a42f9cdc168e92Rafael Espindola}
5647ba30bbe4e36a30a274da809a11a42f9cdc168e92Rafael Espindola
5648a6ddc02921d47d0a1dc9ffe4d31438f250751e05Evgeniy Stepanovstatic void AddLibgcc(llvm::Triple Triple, const Driver &D,
5649a6ddc02921d47d0a1dc9ffe4d31438f250751e05Evgeniy Stepanov                      ArgStringList &CmdArgs, const ArgList &Args) {
565094a7142f74bb4a9daa53c22087b19d4568073109Logan Chien  bool isAndroid = Triple.getEnvironment() == llvm::Triple::Android;
565168f94dbbd20cf41af733f2036c8688894489c3fdChandler Carruth  bool StaticLibgcc = Args.hasArg(options::OPT_static_libgcc) ||
565268f94dbbd20cf41af733f2036c8688894489c3fdChandler Carruth                      Args.hasArg(options::OPT_static);
5653abf3ac7131ba8eab1a2ec99397a776fb0c75ff55Rafael Espindola  if (!D.CCCIsCXX)
5654abf3ac7131ba8eab1a2ec99397a776fb0c75ff55Rafael Espindola    CmdArgs.push_back("-lgcc");
5655abf3ac7131ba8eab1a2ec99397a776fb0c75ff55Rafael Espindola
5656529a73de04a108fe74503a19d9933dbb2b1a6cf0Logan Chien  if (StaticLibgcc || isAndroid) {
5657abf3ac7131ba8eab1a2ec99397a776fb0c75ff55Rafael Espindola    if (D.CCCIsCXX)
5658abf3ac7131ba8eab1a2ec99397a776fb0c75ff55Rafael Espindola      CmdArgs.push_back("-lgcc");
5659abf3ac7131ba8eab1a2ec99397a776fb0c75ff55Rafael Espindola  } else {
5660abf3ac7131ba8eab1a2ec99397a776fb0c75ff55Rafael Espindola    if (!D.CCCIsCXX)
5661abf3ac7131ba8eab1a2ec99397a776fb0c75ff55Rafael Espindola      CmdArgs.push_back("--as-needed");
5662abf3ac7131ba8eab1a2ec99397a776fb0c75ff55Rafael Espindola    CmdArgs.push_back("-lgcc_s");
5663abf3ac7131ba8eab1a2ec99397a776fb0c75ff55Rafael Espindola    if (!D.CCCIsCXX)
5664abf3ac7131ba8eab1a2ec99397a776fb0c75ff55Rafael Espindola      CmdArgs.push_back("--no-as-needed");
5665abf3ac7131ba8eab1a2ec99397a776fb0c75ff55Rafael Espindola  }
5666abf3ac7131ba8eab1a2ec99397a776fb0c75ff55Rafael Espindola
5667a6ddc02921d47d0a1dc9ffe4d31438f250751e05Evgeniy Stepanov  if (StaticLibgcc && !isAndroid)
5668abf3ac7131ba8eab1a2ec99397a776fb0c75ff55Rafael Espindola    CmdArgs.push_back("-lgcc_eh");
5669abf3ac7131ba8eab1a2ec99397a776fb0c75ff55Rafael Espindola  else if (!Args.hasArg(options::OPT_shared) && D.CCCIsCXX)
5670abf3ac7131ba8eab1a2ec99397a776fb0c75ff55Rafael Espindola    CmdArgs.push_back("-lgcc");
5671529a73de04a108fe74503a19d9933dbb2b1a6cf0Logan Chien
5672529a73de04a108fe74503a19d9933dbb2b1a6cf0Logan Chien  // According to Android ABI, we have to link with libdl if we are
5673529a73de04a108fe74503a19d9933dbb2b1a6cf0Logan Chien  // linking with non-static libgcc.
5674529a73de04a108fe74503a19d9933dbb2b1a6cf0Logan Chien  //
5675529a73de04a108fe74503a19d9933dbb2b1a6cf0Logan Chien  // NOTE: This fixes a link error on Android MIPS as well.  The non-static
5676529a73de04a108fe74503a19d9933dbb2b1a6cf0Logan Chien  // libgcc for MIPS relies on _Unwind_Find_FDE and dl_iterate_phdr from libdl.
5677529a73de04a108fe74503a19d9933dbb2b1a6cf0Logan Chien  if (isAndroid && !StaticLibgcc)
5678529a73de04a108fe74503a19d9933dbb2b1a6cf0Logan Chien    CmdArgs.push_back("-ldl");
5679abf3ac7131ba8eab1a2ec99397a776fb0c75ff55Rafael Espindola}
5680abf3ac7131ba8eab1a2ec99397a776fb0c75ff55Rafael Espindola
5681f4bd32957c686891cbdb7e2124630f6686343a2aSimon Atanasyanstatic bool hasMipsN32ABIArg(const ArgList &Args) {
5682f4bd32957c686891cbdb7e2124630f6686343a2aSimon Atanasyan  Arg *A = Args.getLastArg(options::OPT_mabi_EQ);
56831d489cf4a04ad0ad8ac2696e4eed0995f3a67288Richard Smith  return A && (A->getValue() == StringRef("n32"));
5684f4bd32957c686891cbdb7e2124630f6686343a2aSimon Atanasyan}
5685f4bd32957c686891cbdb7e2124630f6686343a2aSimon Atanasyan
5686c1da981bba867681004004b2d54ec2fdf3c08913Rafael Espindolavoid linuxtools::Link::ConstructJob(Compilation &C, const JobAction &JA,
5687c1da981bba867681004004b2d54ec2fdf3c08913Rafael Espindola                                    const InputInfo &Output,
5688c1da981bba867681004004b2d54ec2fdf3c08913Rafael Espindola                                    const InputInfoList &Inputs,
5689c1da981bba867681004004b2d54ec2fdf3c08913Rafael Espindola                                    const ArgList &Args,
5690c1da981bba867681004004b2d54ec2fdf3c08913Rafael Espindola                                    const char *LinkingOutput) const {
5691c1da981bba867681004004b2d54ec2fdf3c08913Rafael Espindola  const toolchains::Linux& ToolChain =
5692c1da981bba867681004004b2d54ec2fdf3c08913Rafael Espindola    static_cast<const toolchains::Linux&>(getToolChain());
5693c1da981bba867681004004b2d54ec2fdf3c08913Rafael Espindola  const Driver &D = ToolChain.getDriver();
5694715852c9ce1a0b6afe1928d8da4d51e138aed851Rafael Espindola  const bool isAndroid =
5695715852c9ce1a0b6afe1928d8da4d51e138aed851Rafael Espindola    ToolChain.getTriple().getEnvironment() == llvm::Triple::Android;
5696a6ddc02921d47d0a1dc9ffe4d31438f250751e05Evgeniy Stepanov
5697c1da981bba867681004004b2d54ec2fdf3c08913Rafael Espindola  ArgStringList CmdArgs;
5698c1da981bba867681004004b2d54ec2fdf3c08913Rafael Espindola
569926f14c309e8de2db8c144342808cca2e869c1777Rafael Espindola  // Silence warning for "clang -g foo.o -o foo"
570026f14c309e8de2db8c144342808cca2e869c1777Rafael Espindola  Args.ClaimAllArgs(options::OPT_g_Group);
57019c094fbcfaba49fc1aeca119c0e12bec59779692Rafael Espindola  // and "clang -emit-llvm foo.o -o foo"
57029c094fbcfaba49fc1aeca119c0e12bec59779692Rafael Espindola  Args.ClaimAllArgs(options::OPT_emit_llvm);
5703dfa210b1e1e403855557f68fe471212787b8540eDavid Chisnall  // and for "clang -w foo.o -o foo". Other warning options are already
57047f6458b7e265d1870f3bd5be2b49bc4d368446b3Rafael Espindola  // handled somewhere else.
57057f6458b7e265d1870f3bd5be2b49bc4d368446b3Rafael Espindola  Args.ClaimAllArgs(options::OPT_w);
570626f14c309e8de2db8c144342808cca2e869c1777Rafael Espindola
57078ab2bdcc4f397e100c684ede8e8ca6e226e1380aJoerg Sonnenberger  if (!D.SysRoot.empty())
57088ab2bdcc4f397e100c684ede8e8ca6e226e1380aJoerg Sonnenberger    CmdArgs.push_back(Args.MakeArgString("--sysroot=" + D.SysRoot));
5709c1da981bba867681004004b2d54ec2fdf3c08913Rafael Espindola
571017d481fb97b304a58e45a136e3f3e2a2a22b76c8Peter Collingbourne  if (Args.hasArg(options::OPT_pie) && !Args.hasArg(options::OPT_shared))
5711fdda17179047ff0b5e28cc777dc89ebc42f083cfRafael Espindola    CmdArgs.push_back("-pie");
5712fdda17179047ff0b5e28cc777dc89ebc42f083cfRafael Espindola
5713dc1b76ddfc687c713a55cc9e3e054e9a0de1aa74Rafael Espindola  if (Args.hasArg(options::OPT_rdynamic))
5714dc1b76ddfc687c713a55cc9e3e054e9a0de1aa74Rafael Espindola    CmdArgs.push_back("-export-dynamic");
5715dc1b76ddfc687c713a55cc9e3e054e9a0de1aa74Rafael Espindola
5716e0e6d3b5cf61dfefad3c0393f4786d2cf3d9c272Rafael Espindola  if (Args.hasArg(options::OPT_s))
5717e0e6d3b5cf61dfefad3c0393f4786d2cf3d9c272Rafael Espindola    CmdArgs.push_back("-s");
5718e0e6d3b5cf61dfefad3c0393f4786d2cf3d9c272Rafael Espindola
5719c1da981bba867681004004b2d54ec2fdf3c08913Rafael Espindola  for (std::vector<std::string>::const_iterator i = ToolChain.ExtraOpts.begin(),
5720c1da981bba867681004004b2d54ec2fdf3c08913Rafael Espindola         e = ToolChain.ExtraOpts.end();
5721c1da981bba867681004004b2d54ec2fdf3c08913Rafael Espindola       i != e; ++i)
5722c1da981bba867681004004b2d54ec2fdf3c08913Rafael Espindola    CmdArgs.push_back(i->c_str());
5723c1da981bba867681004004b2d54ec2fdf3c08913Rafael Espindola
5724c1da981bba867681004004b2d54ec2fdf3c08913Rafael Espindola  if (!Args.hasArg(options::OPT_static)) {
5725c1da981bba867681004004b2d54ec2fdf3c08913Rafael Espindola    CmdArgs.push_back("--eh-frame-hdr");
5726c1da981bba867681004004b2d54ec2fdf3c08913Rafael Espindola  }
5727c1da981bba867681004004b2d54ec2fdf3c08913Rafael Espindola
5728c1da981bba867681004004b2d54ec2fdf3c08913Rafael Espindola  CmdArgs.push_back("-m");
5729c1da981bba867681004004b2d54ec2fdf3c08913Rafael Espindola  if (ToolChain.getArch() == llvm::Triple::x86)
5730c1da981bba867681004004b2d54ec2fdf3c08913Rafael Espindola    CmdArgs.push_back("elf_i386");
5731c264e16a42b3f6c36521857a29ea0949d9781c22Tim Northover  else if (ToolChain.getArch() == llvm::Triple::aarch64)
5732c264e16a42b3f6c36521857a29ea0949d9781c22Tim Northover    CmdArgs.push_back("aarch64linux");
573388b7cf00fcb582728c642da3927c59468efaf926Eric Christopher  else if (ToolChain.getArch() == llvm::Triple::arm
5734f0594d8b64cf32c55dde7a49ba849e864446c92bDouglas Gregor           ||  ToolChain.getArch() == llvm::Triple::thumb)
5735c1da981bba867681004004b2d54ec2fdf3c08913Rafael Espindola    CmdArgs.push_back("armelf_linux_eabi");
573643ac2978291bf1471e2c916a88c7f1c1e170dc19Ted Kremenek  else if (ToolChain.getArch() == llvm::Triple::ppc)
573743ac2978291bf1471e2c916a88c7f1c1e170dc19Ted Kremenek    CmdArgs.push_back("elf32ppclinux");
573843ac2978291bf1471e2c916a88c7f1c1e170dc19Ted Kremenek  else if (ToolChain.getArch() == llvm::Triple::ppc64)
573943ac2978291bf1471e2c916a88c7f1c1e170dc19Ted Kremenek    CmdArgs.push_back("elf64ppc");
57405bea4f6860543017be326e3fbe702edb2678d898Eli Friedman  else if (ToolChain.getArch() == llvm::Triple::mips)
57415bea4f6860543017be326e3fbe702edb2678d898Eli Friedman    CmdArgs.push_back("elf32btsmip");
57425bea4f6860543017be326e3fbe702edb2678d898Eli Friedman  else if (ToolChain.getArch() == llvm::Triple::mipsel)
57435bea4f6860543017be326e3fbe702edb2678d898Eli Friedman    CmdArgs.push_back("elf32ltsmip");
5744f4bd32957c686891cbdb7e2124630f6686343a2aSimon Atanasyan  else if (ToolChain.getArch() == llvm::Triple::mips64) {
5745f4bd32957c686891cbdb7e2124630f6686343a2aSimon Atanasyan    if (hasMipsN32ABIArg(Args))
5746f4bd32957c686891cbdb7e2124630f6686343a2aSimon Atanasyan      CmdArgs.push_back("elf32btsmipn32");
5747f4bd32957c686891cbdb7e2124630f6686343a2aSimon Atanasyan    else
5748f4bd32957c686891cbdb7e2124630f6686343a2aSimon Atanasyan      CmdArgs.push_back("elf64btsmip");
5749f4bd32957c686891cbdb7e2124630f6686343a2aSimon Atanasyan  }
5750f4bd32957c686891cbdb7e2124630f6686343a2aSimon Atanasyan  else if (ToolChain.getArch() == llvm::Triple::mips64el) {
5751f4bd32957c686891cbdb7e2124630f6686343a2aSimon Atanasyan    if (hasMipsN32ABIArg(Args))
5752f4bd32957c686891cbdb7e2124630f6686343a2aSimon Atanasyan      CmdArgs.push_back("elf32ltsmipn32");
5753f4bd32957c686891cbdb7e2124630f6686343a2aSimon Atanasyan    else
5754f4bd32957c686891cbdb7e2124630f6686343a2aSimon Atanasyan      CmdArgs.push_back("elf64ltsmip");
5755f4bd32957c686891cbdb7e2124630f6686343a2aSimon Atanasyan  }
5756c1da981bba867681004004b2d54ec2fdf3c08913Rafael Espindola  else
5757c1da981bba867681004004b2d54ec2fdf3c08913Rafael Espindola    CmdArgs.push_back("elf_x86_64");
5758c1da981bba867681004004b2d54ec2fdf3c08913Rafael Espindola
5759c1da981bba867681004004b2d54ec2fdf3c08913Rafael Espindola  if (Args.hasArg(options::OPT_static)) {
5760f0594d8b64cf32c55dde7a49ba849e864446c92bDouglas Gregor    if (ToolChain.getArch() == llvm::Triple::arm
5761f0594d8b64cf32c55dde7a49ba849e864446c92bDouglas Gregor        || ToolChain.getArch() == llvm::Triple::thumb)
5762c1da981bba867681004004b2d54ec2fdf3c08913Rafael Espindola      CmdArgs.push_back("-Bstatic");
5763c1da981bba867681004004b2d54ec2fdf3c08913Rafael Espindola    else
5764c1da981bba867681004004b2d54ec2fdf3c08913Rafael Espindola      CmdArgs.push_back("-static");
5765c1da981bba867681004004b2d54ec2fdf3c08913Rafael Espindola  } else if (Args.hasArg(options::OPT_shared)) {
5766c1da981bba867681004004b2d54ec2fdf3c08913Rafael Espindola    CmdArgs.push_back("-shared");
5767715852c9ce1a0b6afe1928d8da4d51e138aed851Rafael Espindola    if (isAndroid) {
5768a6ddc02921d47d0a1dc9ffe4d31438f250751e05Evgeniy Stepanov      CmdArgs.push_back("-Bsymbolic");
5769a6ddc02921d47d0a1dc9ffe4d31438f250751e05Evgeniy Stepanov    }
5770c1da981bba867681004004b2d54ec2fdf3c08913Rafael Espindola  }
5771c1da981bba867681004004b2d54ec2fdf3c08913Rafael Espindola
5772c1da981bba867681004004b2d54ec2fdf3c08913Rafael Espindola  if (ToolChain.getArch() == llvm::Triple::arm ||
5773f0594d8b64cf32c55dde7a49ba849e864446c92bDouglas Gregor      ToolChain.getArch() == llvm::Triple::thumb ||
5774c1da981bba867681004004b2d54ec2fdf3c08913Rafael Espindola      (!Args.hasArg(options::OPT_static) &&
5775c1da981bba867681004004b2d54ec2fdf3c08913Rafael Espindola       !Args.hasArg(options::OPT_shared))) {
5776c1da981bba867681004004b2d54ec2fdf3c08913Rafael Espindola    CmdArgs.push_back("-dynamic-linker");
5777a6ddc02921d47d0a1dc9ffe4d31438f250751e05Evgeniy Stepanov    if (isAndroid)
5778a6ddc02921d47d0a1dc9ffe4d31438f250751e05Evgeniy Stepanov      CmdArgs.push_back("/system/bin/linker");
5779a6ddc02921d47d0a1dc9ffe4d31438f250751e05Evgeniy Stepanov    else if (ToolChain.getArch() == llvm::Triple::x86)
5780c1da981bba867681004004b2d54ec2fdf3c08913Rafael Espindola      CmdArgs.push_back("/lib/ld-linux.so.2");
5781c264e16a42b3f6c36521857a29ea0949d9781c22Tim Northover    else if (ToolChain.getArch() == llvm::Triple::aarch64)
5782c264e16a42b3f6c36521857a29ea0949d9781c22Tim Northover      CmdArgs.push_back("/lib/ld-linux-aarch64.so.1");
5783f0594d8b64cf32c55dde7a49ba849e864446c92bDouglas Gregor    else if (ToolChain.getArch() == llvm::Triple::arm ||
57846cc9dc8403c4a8838f4f932e43402090cfe70d98Jiangning Liu             ToolChain.getArch() == llvm::Triple::thumb) {
57856cc9dc8403c4a8838f4f932e43402090cfe70d98Jiangning Liu      if (ToolChain.getTriple().getEnvironment() == llvm::Triple::GNUEABIHF)
57866cc9dc8403c4a8838f4f932e43402090cfe70d98Jiangning Liu        CmdArgs.push_back("/lib/ld-linux-armhf.so.3");
57876cc9dc8403c4a8838f4f932e43402090cfe70d98Jiangning Liu      else
57886cc9dc8403c4a8838f4f932e43402090cfe70d98Jiangning Liu        CmdArgs.push_back("/lib/ld-linux.so.3");
57896cc9dc8403c4a8838f4f932e43402090cfe70d98Jiangning Liu    }
57905bea4f6860543017be326e3fbe702edb2678d898Eli Friedman    else if (ToolChain.getArch() == llvm::Triple::mips ||
57915bea4f6860543017be326e3fbe702edb2678d898Eli Friedman             ToolChain.getArch() == llvm::Triple::mipsel)
57925bea4f6860543017be326e3fbe702edb2678d898Eli Friedman      CmdArgs.push_back("/lib/ld.so.1");
57938491cb245f7fccfb049f860444467130f68189d3Simon Atanasyan    else if (ToolChain.getArch() == llvm::Triple::mips64 ||
5794f4bd32957c686891cbdb7e2124630f6686343a2aSimon Atanasyan             ToolChain.getArch() == llvm::Triple::mips64el) {
5795f4bd32957c686891cbdb7e2124630f6686343a2aSimon Atanasyan      if (hasMipsN32ABIArg(Args))
5796f4bd32957c686891cbdb7e2124630f6686343a2aSimon Atanasyan        CmdArgs.push_back("/lib32/ld.so.1");
5797f4bd32957c686891cbdb7e2124630f6686343a2aSimon Atanasyan      else
5798f4bd32957c686891cbdb7e2124630f6686343a2aSimon Atanasyan        CmdArgs.push_back("/lib64/ld.so.1");
5799f4bd32957c686891cbdb7e2124630f6686343a2aSimon Atanasyan    }
580043ac2978291bf1471e2c916a88c7f1c1e170dc19Ted Kremenek    else if (ToolChain.getArch() == llvm::Triple::ppc)
580109f43ed8a1be67360fde9b335eac60bac8db8e19Chris Lattner      CmdArgs.push_back("/lib/ld.so.1");
580243ac2978291bf1471e2c916a88c7f1c1e170dc19Ted Kremenek    else if (ToolChain.getArch() == llvm::Triple::ppc64)
580309f43ed8a1be67360fde9b335eac60bac8db8e19Chris Lattner      CmdArgs.push_back("/lib64/ld64.so.1");
5804c1da981bba867681004004b2d54ec2fdf3c08913Rafael Espindola    else
5805c1da981bba867681004004b2d54ec2fdf3c08913Rafael Espindola      CmdArgs.push_back("/lib64/ld-linux-x86-64.so.2");
5806c1da981bba867681004004b2d54ec2fdf3c08913Rafael Espindola  }
5807c1da981bba867681004004b2d54ec2fdf3c08913Rafael Espindola
5808c1da981bba867681004004b2d54ec2fdf3c08913Rafael Espindola  CmdArgs.push_back("-o");
5809c1da981bba867681004004b2d54ec2fdf3c08913Rafael Espindola  CmdArgs.push_back(Output.getFilename());
5810c1da981bba867681004004b2d54ec2fdf3c08913Rafael Espindola
581149c64fdcf354c7998b8b301402fb6140c24df36aRafael Espindola  if (!Args.hasArg(options::OPT_nostdlib) &&
581249c64fdcf354c7998b8b301402fb6140c24df36aRafael Espindola      !Args.hasArg(options::OPT_nostartfiles)) {
5813a6ddc02921d47d0a1dc9ffe4d31438f250751e05Evgeniy Stepanov    if (!isAndroid) {
5814a6ddc02921d47d0a1dc9ffe4d31438f250751e05Evgeniy Stepanov      const char *crt1 = NULL;
5815a6ddc02921d47d0a1dc9ffe4d31438f250751e05Evgeniy Stepanov      if (!Args.hasArg(options::OPT_shared)){
5816a6ddc02921d47d0a1dc9ffe4d31438f250751e05Evgeniy Stepanov        if (Args.hasArg(options::OPT_pie))
5817a6ddc02921d47d0a1dc9ffe4d31438f250751e05Evgeniy Stepanov          crt1 = "Scrt1.o";
5818a6ddc02921d47d0a1dc9ffe4d31438f250751e05Evgeniy Stepanov        else
5819a6ddc02921d47d0a1dc9ffe4d31438f250751e05Evgeniy Stepanov          crt1 = "crt1.o";
5820a6ddc02921d47d0a1dc9ffe4d31438f250751e05Evgeniy Stepanov      }
5821a6ddc02921d47d0a1dc9ffe4d31438f250751e05Evgeniy Stepanov      if (crt1)
5822a6ddc02921d47d0a1dc9ffe4d31438f250751e05Evgeniy Stepanov        CmdArgs.push_back(Args.MakeArgString(ToolChain.GetFilePath(crt1)));
5823c1da981bba867681004004b2d54ec2fdf3c08913Rafael Espindola
5824a6ddc02921d47d0a1dc9ffe4d31438f250751e05Evgeniy Stepanov      CmdArgs.push_back(Args.MakeArgString(ToolChain.GetFilePath("crti.o")));
5825a6ddc02921d47d0a1dc9ffe4d31438f250751e05Evgeniy Stepanov    }
5826c1da981bba867681004004b2d54ec2fdf3c08913Rafael Espindola
582789414b384a0004c698244cc675f49d0669bb3463Rafael Espindola    const char *crtbegin;
582889414b384a0004c698244cc675f49d0669bb3463Rafael Espindola    if (Args.hasArg(options::OPT_static))
5829a6ddc02921d47d0a1dc9ffe4d31438f250751e05Evgeniy Stepanov      crtbegin = isAndroid ? "crtbegin_static.o" : "crtbeginT.o";
5830a92983d236c88c942c283a1ee98003b2d5b56ea5Evgeniy Stepanov    else if (Args.hasArg(options::OPT_shared))
5831a6ddc02921d47d0a1dc9ffe4d31438f250751e05Evgeniy Stepanov      crtbegin = isAndroid ? "crtbegin_so.o" : "crtbeginS.o";
5832a92983d236c88c942c283a1ee98003b2d5b56ea5Evgeniy Stepanov    else if (Args.hasArg(options::OPT_pie))
5833a92983d236c88c942c283a1ee98003b2d5b56ea5Evgeniy Stepanov      crtbegin = isAndroid ? "crtbegin_dynamic.o" : "crtbeginS.o";
583489414b384a0004c698244cc675f49d0669bb3463Rafael Espindola    else
5835a6ddc02921d47d0a1dc9ffe4d31438f250751e05Evgeniy Stepanov      crtbegin = isAndroid ? "crtbegin_dynamic.o" : "crtbegin.o";
583689414b384a0004c698244cc675f49d0669bb3463Rafael Espindola    CmdArgs.push_back(Args.MakeArgString(ToolChain.GetFilePath(crtbegin)));
5837e20e508aecf413f84b0dc4928cbf4bb5ce6c5bdcBenjamin Kramer
5838e20e508aecf413f84b0dc4928cbf4bb5ce6c5bdcBenjamin Kramer    // Add crtfastmath.o if available and fast math is enabled.
5839e20e508aecf413f84b0dc4928cbf4bb5ce6c5bdcBenjamin Kramer    ToolChain.AddFastMathRuntimeIfAvailable(Args, CmdArgs);
584089414b384a0004c698244cc675f49d0669bb3463Rafael Espindola  }
5841c1da981bba867681004004b2d54ec2fdf3c08913Rafael Espindola
5842c1da981bba867681004004b2d54ec2fdf3c08913Rafael Espindola  Args.AddAllArgs(CmdArgs, options::OPT_L);
5843c1da981bba867681004004b2d54ec2fdf3c08913Rafael Espindola
5844c1da981bba867681004004b2d54ec2fdf3c08913Rafael Espindola  const ToolChain::path_list Paths = ToolChain.getFilePaths();
5845c1da981bba867681004004b2d54ec2fdf3c08913Rafael Espindola
584658e5ac9d41d8186bea92e892d572e2eea28d3f9cRoman Divacky  for (ToolChain::path_list::const_iterator i = Paths.begin(), e = Paths.end();
584758e5ac9d41d8186bea92e892d572e2eea28d3f9cRoman Divacky       i != e; ++i)
58485f9e272e632e951b1efe824cd16acb4d96077930Chris Lattner    CmdArgs.push_back(Args.MakeArgString(StringRef("-L") + *i));
5849c1da981bba867681004004b2d54ec2fdf3c08913Rafael Espindola
5850c5151543236bd213b8595a079cf9b1d26de4eeb1Rafael Espindola  // Tell the linker to load the plugin. This has to come before AddLinkerInputs
5851c5151543236bd213b8595a079cf9b1d26de4eeb1Rafael Espindola  // as gold requires -plugin to come before any -plugin-opt that -Wl might
5852c5151543236bd213b8595a079cf9b1d26de4eeb1Rafael Espindola  // forward.
5853c5151543236bd213b8595a079cf9b1d26de4eeb1Rafael Espindola  if (D.IsUsingLTO(Args) || Args.hasArg(options::OPT_use_gold_plugin)) {
5854c5151543236bd213b8595a079cf9b1d26de4eeb1Rafael Espindola    CmdArgs.push_back("-plugin");
5855c5151543236bd213b8595a079cf9b1d26de4eeb1Rafael Espindola    std::string Plugin = ToolChain.getDriver().Dir + "/../lib/LLVMgold.so";
5856c5151543236bd213b8595a079cf9b1d26de4eeb1Rafael Espindola    CmdArgs.push_back(Args.MakeArgString(Plugin));
5857700d4e44793697288dd827c272ad363945f590a9Chandler Carruth
5858700d4e44793697288dd827c272ad363945f590a9Chandler Carruth    // Try to pass driver level flags relevant to LTO code generation down to
5859700d4e44793697288dd827c272ad363945f590a9Chandler Carruth    // the plugin.
5860700d4e44793697288dd827c272ad363945f590a9Chandler Carruth
5861700d4e44793697288dd827c272ad363945f590a9Chandler Carruth    // Handle architecture-specific flags for selecting CPU variants.
5862700d4e44793697288dd827c272ad363945f590a9Chandler Carruth    if (ToolChain.getArch() == llvm::Triple::x86 ||
5863700d4e44793697288dd827c272ad363945f590a9Chandler Carruth        ToolChain.getArch() == llvm::Triple::x86_64)
5864700d4e44793697288dd827c272ad363945f590a9Chandler Carruth      CmdArgs.push_back(
5865700d4e44793697288dd827c272ad363945f590a9Chandler Carruth          Args.MakeArgString(Twine("-plugin-opt=mcpu=") +
5866700d4e44793697288dd827c272ad363945f590a9Chandler Carruth                             getX86TargetCPU(Args, ToolChain.getTriple())));
5867700d4e44793697288dd827c272ad363945f590a9Chandler Carruth    else if (ToolChain.getArch() == llvm::Triple::arm ||
5868700d4e44793697288dd827c272ad363945f590a9Chandler Carruth             ToolChain.getArch() == llvm::Triple::thumb)
5869700d4e44793697288dd827c272ad363945f590a9Chandler Carruth      CmdArgs.push_back(
5870700d4e44793697288dd827c272ad363945f590a9Chandler Carruth          Args.MakeArgString(Twine("-plugin-opt=mcpu=") +
5871700d4e44793697288dd827c272ad363945f590a9Chandler Carruth                             getARMTargetCPU(Args, ToolChain.getTriple())));
5872700d4e44793697288dd827c272ad363945f590a9Chandler Carruth
5873700d4e44793697288dd827c272ad363945f590a9Chandler Carruth    // FIXME: Factor out logic for MIPS, PPC, and other targets to support this
5874700d4e44793697288dd827c272ad363945f590a9Chandler Carruth    // as well.
5875c5151543236bd213b8595a079cf9b1d26de4eeb1Rafael Espindola  }
5876c5151543236bd213b8595a079cf9b1d26de4eeb1Rafael Espindola
5877700d4e44793697288dd827c272ad363945f590a9Chandler Carruth
5878e276cfc4e30dd3d85e3904ee270e85d5d0e309adNick Lewycky  if (Args.hasArg(options::OPT_Z_Xlinker__no_demangle))
5879e276cfc4e30dd3d85e3904ee270e85d5d0e309adNick Lewycky    CmdArgs.push_back("--no-demangle");
5880e276cfc4e30dd3d85e3904ee270e85d5d0e309adNick Lewycky
5881c1da981bba867681004004b2d54ec2fdf3c08913Rafael Espindola  AddLinkerInputs(ToolChain, Inputs, Args, CmdArgs);
5882c1da981bba867681004004b2d54ec2fdf3c08913Rafael Espindola
5883bb1071c0568db9bd7934e869a53d671632eb9291Alexey Samsonov  SanitizerArgs Sanitize(D, Args);
5884c4dabadb51475e76b606024f144e7cf93b0bad00Richard Smith
58856716d9443d5d13f4f49a39b9d02f2e256cb83a97Eric Christopher  // Call these before we add the C++ ABI library.
5886c4dabadb51475e76b606024f144e7cf93b0bad00Richard Smith  if (Sanitize.needsUbsanRt())
5887c4dabadb51475e76b606024f144e7cf93b0bad00Richard Smith    addUbsanRTLinux(getToolChain(), Args, CmdArgs);
58886716d9443d5d13f4f49a39b9d02f2e256cb83a97Eric Christopher  if (Sanitize.needsAsanRt())
58896716d9443d5d13f4f49a39b9d02f2e256cb83a97Eric Christopher    addAsanRTLinux(getToolChain(), Args, CmdArgs);
58906716d9443d5d13f4f49a39b9d02f2e256cb83a97Eric Christopher  if (Sanitize.needsTsanRt())
58916716d9443d5d13f4f49a39b9d02f2e256cb83a97Eric Christopher    addTsanRTLinux(getToolChain(), Args, CmdArgs);
589209ccf39c13cfca102deea2986f45cb908bc232fdEvgeniy Stepanov  if (Sanitize.needsMsanRt())
589309ccf39c13cfca102deea2986f45cb908bc232fdEvgeniy Stepanov    addMsanRTLinux(getToolChain(), Args, CmdArgs);
58948e1cee6f23e2552b96b81e5ef419ab3f69c5b5c2Richard Smith
58952ba542c741c39691940f5d1de0bc88c22f46c430Chandler Carruth  if (D.CCCIsCXX &&
58962ba542c741c39691940f5d1de0bc88c22f46c430Chandler Carruth      !Args.hasArg(options::OPT_nostdlib) &&
58972ba542c741c39691940f5d1de0bc88c22f46c430Chandler Carruth      !Args.hasArg(options::OPT_nodefaultlibs)) {
589819706f8e702c04d19bc1ace504cbb9df008b6daaRafael Espindola    bool OnlyLibstdcxxStatic = Args.hasArg(options::OPT_static_libstdcxx) &&
589919706f8e702c04d19bc1ace504cbb9df008b6daaRafael Espindola      !Args.hasArg(options::OPT_static);
590019706f8e702c04d19bc1ace504cbb9df008b6daaRafael Espindola    if (OnlyLibstdcxxStatic)
590119706f8e702c04d19bc1ace504cbb9df008b6daaRafael Espindola      CmdArgs.push_back("-Bstatic");
5902c1da981bba867681004004b2d54ec2fdf3c08913Rafael Espindola    ToolChain.AddCXXStdlibLibArgs(Args, CmdArgs);
590319706f8e702c04d19bc1ace504cbb9df008b6daaRafael Espindola    if (OnlyLibstdcxxStatic)
590419706f8e702c04d19bc1ace504cbb9df008b6daaRafael Espindola      CmdArgs.push_back("-Bdynamic");
5905c1da981bba867681004004b2d54ec2fdf3c08913Rafael Espindola    CmdArgs.push_back("-lm");
5906c1da981bba867681004004b2d54ec2fdf3c08913Rafael Espindola  }
5907c1da981bba867681004004b2d54ec2fdf3c08913Rafael Espindola
590889414b384a0004c698244cc675f49d0669bb3463Rafael Espindola  if (!Args.hasArg(options::OPT_nostdlib)) {
59092ba542c741c39691940f5d1de0bc88c22f46c430Chandler Carruth    if (!Args.hasArg(options::OPT_nodefaultlibs)) {
59102ba542c741c39691940f5d1de0bc88c22f46c430Chandler Carruth      if (Args.hasArg(options::OPT_static))
59112ba542c741c39691940f5d1de0bc88c22f46c430Chandler Carruth        CmdArgs.push_back("--start-group");
5912e0e6d3b5cf61dfefad3c0393f4786d2cf3d9c272Rafael Espindola
5913df96e022e95b8540c51e1bdaed03f66d851c6f93Chandler Carruth      bool OpenMP = Args.hasArg(options::OPT_fopenmp);
5914df96e022e95b8540c51e1bdaed03f66d851c6f93Chandler Carruth      if (OpenMP) {
5915df96e022e95b8540c51e1bdaed03f66d851c6f93Chandler Carruth        CmdArgs.push_back("-lgomp");
5916df96e022e95b8540c51e1bdaed03f66d851c6f93Chandler Carruth
5917df96e022e95b8540c51e1bdaed03f66d851c6f93Chandler Carruth        // FIXME: Exclude this for platforms whith libgomp that doesn't require
5918df96e022e95b8540c51e1bdaed03f66d851c6f93Chandler Carruth        // librt. Most modern Linux platfroms require it, but some may not.
5919df96e022e95b8540c51e1bdaed03f66d851c6f93Chandler Carruth        CmdArgs.push_back("-lrt");
5920df96e022e95b8540c51e1bdaed03f66d851c6f93Chandler Carruth      }
5921df96e022e95b8540c51e1bdaed03f66d851c6f93Chandler Carruth
59222ba542c741c39691940f5d1de0bc88c22f46c430Chandler Carruth      AddLibgcc(ToolChain.getTriple(), D, CmdArgs, Args);
5923c1da981bba867681004004b2d54ec2fdf3c08913Rafael Espindola
59242ba542c741c39691940f5d1de0bc88c22f46c430Chandler Carruth      if (Args.hasArg(options::OPT_pthread) ||
5925df96e022e95b8540c51e1bdaed03f66d851c6f93Chandler Carruth          Args.hasArg(options::OPT_pthreads) || OpenMP)
59262ba542c741c39691940f5d1de0bc88c22f46c430Chandler Carruth        CmdArgs.push_back("-lpthread");
5927c1da981bba867681004004b2d54ec2fdf3c08913Rafael Espindola
59282ba542c741c39691940f5d1de0bc88c22f46c430Chandler Carruth      CmdArgs.push_back("-lc");
5929c1da981bba867681004004b2d54ec2fdf3c08913Rafael Espindola
59302ba542c741c39691940f5d1de0bc88c22f46c430Chandler Carruth      if (Args.hasArg(options::OPT_static))
59312ba542c741c39691940f5d1de0bc88c22f46c430Chandler Carruth        CmdArgs.push_back("--end-group");
59322ba542c741c39691940f5d1de0bc88c22f46c430Chandler Carruth      else
59332ba542c741c39691940f5d1de0bc88c22f46c430Chandler Carruth        AddLibgcc(ToolChain.getTriple(), D, CmdArgs, Args);
59342ba542c741c39691940f5d1de0bc88c22f46c430Chandler Carruth    }
5935fdda17179047ff0b5e28cc777dc89ebc42f083cfRafael Espindola
593649c64fdcf354c7998b8b301402fb6140c24df36aRafael Espindola    if (!Args.hasArg(options::OPT_nostartfiles)) {
593749c64fdcf354c7998b8b301402fb6140c24df36aRafael Espindola      const char *crtend;
5938a92983d236c88c942c283a1ee98003b2d5b56ea5Evgeniy Stepanov      if (Args.hasArg(options::OPT_shared))
5939a6ddc02921d47d0a1dc9ffe4d31438f250751e05Evgeniy Stepanov        crtend = isAndroid ? "crtend_so.o" : "crtendS.o";
5940a92983d236c88c942c283a1ee98003b2d5b56ea5Evgeniy Stepanov      else if (Args.hasArg(options::OPT_pie))
5941a92983d236c88c942c283a1ee98003b2d5b56ea5Evgeniy Stepanov        crtend = isAndroid ? "crtend_android.o" : "crtendS.o";
594249c64fdcf354c7998b8b301402fb6140c24df36aRafael Espindola      else
5943a6ddc02921d47d0a1dc9ffe4d31438f250751e05Evgeniy Stepanov        crtend = isAndroid ? "crtend_android.o" : "crtend.o";
594489414b384a0004c698244cc675f49d0669bb3463Rafael Espindola
594549c64fdcf354c7998b8b301402fb6140c24df36aRafael Espindola      CmdArgs.push_back(Args.MakeArgString(ToolChain.GetFilePath(crtend)));
5946a6ddc02921d47d0a1dc9ffe4d31438f250751e05Evgeniy Stepanov      if (!isAndroid)
5947a6ddc02921d47d0a1dc9ffe4d31438f250751e05Evgeniy Stepanov        CmdArgs.push_back(Args.MakeArgString(ToolChain.GetFilePath("crtn.o")));
594849c64fdcf354c7998b8b301402fb6140c24df36aRafael Espindola    }
594989414b384a0004c698244cc675f49d0669bb3463Rafael Espindola  }
5950c1da981bba867681004004b2d54ec2fdf3c08913Rafael Espindola
59513f4be6fb8872942f567166ab8d99c89885f26103Bill Wendling  addProfileRT(getToolChain(), Args, CmdArgs, getToolChain().getTriple());
59522e95a6d7d0b5aed39747875d7474c27824f7319fNick Lewycky
5953c1da981bba867681004004b2d54ec2fdf3c08913Rafael Espindola  C.addCommand(new Command(JA, *this, ToolChain.Linker.c_str(), CmdArgs));
5954c1da981bba867681004004b2d54ec2fdf3c08913Rafael Espindola}
5955ba30bbe4e36a30a274da809a11a42f9cdc168e92Rafael Espindola
595638e317d6dce161b249508686cc67eb7176958762Chris Lattnervoid minix::Assemble::ConstructJob(Compilation &C, const JobAction &JA,
59572fe238ed293bd4bc27af9beb9fa151fad2146fa8Daniel Dunbar                                   const InputInfo &Output,
59582fe238ed293bd4bc27af9beb9fa151fad2146fa8Daniel Dunbar                                   const InputInfoList &Inputs,
59592fe238ed293bd4bc27af9beb9fa151fad2146fa8Daniel Dunbar                                   const ArgList &Args,
59602fe238ed293bd4bc27af9beb9fa151fad2146fa8Daniel Dunbar                                   const char *LinkingOutput) const {
596138e317d6dce161b249508686cc67eb7176958762Chris Lattner  ArgStringList CmdArgs;
596238e317d6dce161b249508686cc67eb7176958762Chris Lattner
596338e317d6dce161b249508686cc67eb7176958762Chris Lattner  Args.AddAllArgValues(CmdArgs, options::OPT_Wa_COMMA,
596438e317d6dce161b249508686cc67eb7176958762Chris Lattner                       options::OPT_Xassembler);
596538e317d6dce161b249508686cc67eb7176958762Chris Lattner
596638e317d6dce161b249508686cc67eb7176958762Chris Lattner  CmdArgs.push_back("-o");
59677c1e46533cae07216e2a67d5636a5afb44253155Daniel Dunbar  CmdArgs.push_back(Output.getFilename());
596838e317d6dce161b249508686cc67eb7176958762Chris Lattner
596938e317d6dce161b249508686cc67eb7176958762Chris Lattner  for (InputInfoList::const_iterator
597038e317d6dce161b249508686cc67eb7176958762Chris Lattner         it = Inputs.begin(), ie = Inputs.end(); it != ie; ++it) {
597138e317d6dce161b249508686cc67eb7176958762Chris Lattner    const InputInfo &II = *it;
59727c1e46533cae07216e2a67d5636a5afb44253155Daniel Dunbar    CmdArgs.push_back(II.getFilename());
597338e317d6dce161b249508686cc67eb7176958762Chris Lattner  }
597438e317d6dce161b249508686cc67eb7176958762Chris Lattner
597538e317d6dce161b249508686cc67eb7176958762Chris Lattner  const char *Exec =
59766d402dc963aa32194f3604af4463b113858291aeEli Friedman    Args.MakeArgString(getToolChain().GetProgramPath("as"));
59772fe238ed293bd4bc27af9beb9fa151fad2146fa8Daniel Dunbar  C.addCommand(new Command(JA, *this, Exec, CmdArgs));
597838e317d6dce161b249508686cc67eb7176958762Chris Lattner}
597938e317d6dce161b249508686cc67eb7176958762Chris Lattner
598038e317d6dce161b249508686cc67eb7176958762Chris Lattnervoid minix::Link::ConstructJob(Compilation &C, const JobAction &JA,
59812fe238ed293bd4bc27af9beb9fa151fad2146fa8Daniel Dunbar                               const InputInfo &Output,
59822fe238ed293bd4bc27af9beb9fa151fad2146fa8Daniel Dunbar                               const InputInfoList &Inputs,
59832fe238ed293bd4bc27af9beb9fa151fad2146fa8Daniel Dunbar                               const ArgList &Args,
59842fe238ed293bd4bc27af9beb9fa151fad2146fa8Daniel Dunbar                               const char *LinkingOutput) const {
598538e317d6dce161b249508686cc67eb7176958762Chris Lattner  const Driver &D = getToolChain().getDriver();
598638e317d6dce161b249508686cc67eb7176958762Chris Lattner  ArgStringList CmdArgs;
598738e317d6dce161b249508686cc67eb7176958762Chris Lattner
59887c1e46533cae07216e2a67d5636a5afb44253155Daniel Dunbar  if (Output.isFilename()) {
598938e317d6dce161b249508686cc67eb7176958762Chris Lattner    CmdArgs.push_back("-o");
599038e317d6dce161b249508686cc67eb7176958762Chris Lattner    CmdArgs.push_back(Output.getFilename());
599138e317d6dce161b249508686cc67eb7176958762Chris Lattner  } else {
599238e317d6dce161b249508686cc67eb7176958762Chris Lattner    assert(Output.isNothing() && "Invalid output.");
599338e317d6dce161b249508686cc67eb7176958762Chris Lattner  }
599438e317d6dce161b249508686cc67eb7176958762Chris Lattner
599538e317d6dce161b249508686cc67eb7176958762Chris Lattner  if (!Args.hasArg(options::OPT_nostdlib) &&
59966d402dc963aa32194f3604af4463b113858291aeEli Friedman      !Args.hasArg(options::OPT_nostartfiles)) {
59976d402dc963aa32194f3604af4463b113858291aeEli Friedman      CmdArgs.push_back(Args.MakeArgString(getToolChain().GetFilePath("crt1.o")));
59986d402dc963aa32194f3604af4463b113858291aeEli Friedman      CmdArgs.push_back(Args.MakeArgString(getToolChain().GetFilePath("crti.o")));
59996d402dc963aa32194f3604af4463b113858291aeEli Friedman      CmdArgs.push_back(Args.MakeArgString(getToolChain().GetFilePath("crtbegin.o")));
60006d402dc963aa32194f3604af4463b113858291aeEli Friedman      CmdArgs.push_back(Args.MakeArgString(getToolChain().GetFilePath("crtn.o")));
60016d402dc963aa32194f3604af4463b113858291aeEli Friedman  }
600238e317d6dce161b249508686cc67eb7176958762Chris Lattner
600338e317d6dce161b249508686cc67eb7176958762Chris Lattner  Args.AddAllArgs(CmdArgs, options::OPT_L);
600438e317d6dce161b249508686cc67eb7176958762Chris Lattner  Args.AddAllArgs(CmdArgs, options::OPT_T_Group);
600538e317d6dce161b249508686cc67eb7176958762Chris Lattner  Args.AddAllArgs(CmdArgs, options::OPT_e);
600638e317d6dce161b249508686cc67eb7176958762Chris Lattner
60072008feead855f08500fb01ff43ef5eebee05d1e5Daniel Dunbar  AddLinkerInputs(getToolChain(), Inputs, Args, CmdArgs);
600838e317d6dce161b249508686cc67eb7176958762Chris Lattner
60096d402dc963aa32194f3604af4463b113858291aeEli Friedman  addProfileRT(getToolChain(), Args, CmdArgs, getToolChain().getTriple());
60106d402dc963aa32194f3604af4463b113858291aeEli Friedman
601138e317d6dce161b249508686cc67eb7176958762Chris Lattner  if (!Args.hasArg(options::OPT_nostdlib) &&
601238e317d6dce161b249508686cc67eb7176958762Chris Lattner      !Args.hasArg(options::OPT_nodefaultlibs)) {
601338e317d6dce161b249508686cc67eb7176958762Chris Lattner    if (D.CCCIsCXX) {
6014132e35d2f87895d20e7ea146c8c00404b80221a1Daniel Dunbar      getToolChain().AddCXXStdlibLibArgs(Args, CmdArgs);
601538e317d6dce161b249508686cc67eb7176958762Chris Lattner      CmdArgs.push_back("-lm");
601638e317d6dce161b249508686cc67eb7176958762Chris Lattner    }
601738e317d6dce161b249508686cc67eb7176958762Chris Lattner  }
601838e317d6dce161b249508686cc67eb7176958762Chris Lattner
601938e317d6dce161b249508686cc67eb7176958762Chris Lattner  if (!Args.hasArg(options::OPT_nostdlib) &&
602038e317d6dce161b249508686cc67eb7176958762Chris Lattner      !Args.hasArg(options::OPT_nostartfiles)) {
60216d402dc963aa32194f3604af4463b113858291aeEli Friedman    if (Args.hasArg(options::OPT_pthread))
60226d402dc963aa32194f3604af4463b113858291aeEli Friedman      CmdArgs.push_back("-lpthread");
60236d402dc963aa32194f3604af4463b113858291aeEli Friedman    CmdArgs.push_back("-lc");
60246d402dc963aa32194f3604af4463b113858291aeEli Friedman    CmdArgs.push_back("-lCompilerRT-Generic");
60256d402dc963aa32194f3604af4463b113858291aeEli Friedman    CmdArgs.push_back("-L/usr/pkg/compiler-rt/lib");
60266d402dc963aa32194f3604af4463b113858291aeEli Friedman    CmdArgs.push_back(
602727e2b983beb8b5a29869639637327725623069a8Eric Christopher         Args.MakeArgString(getToolChain().GetFilePath("crtend.o")));
602838e317d6dce161b249508686cc67eb7176958762Chris Lattner  }
602938e317d6dce161b249508686cc67eb7176958762Chris Lattner
60306d402dc963aa32194f3604af4463b113858291aeEli Friedman  const char *Exec = Args.MakeArgString(getToolChain().GetProgramPath("ld"));
60312fe238ed293bd4bc27af9beb9fa151fad2146fa8Daniel Dunbar  C.addCommand(new Command(JA, *this, Exec, CmdArgs));
603238e317d6dce161b249508686cc67eb7176958762Chris Lattner}
603338e317d6dce161b249508686cc67eb7176958762Chris Lattner
603411e1b40d759a643086f590f6ffbd9d68360bad46Daniel Dunbar/// DragonFly Tools
603511e1b40d759a643086f590f6ffbd9d68360bad46Daniel Dunbar
603611e1b40d759a643086f590f6ffbd9d68360bad46Daniel Dunbar// For now, DragonFly Assemble does just about the same as for
603711e1b40d759a643086f590f6ffbd9d68360bad46Daniel Dunbar// FreeBSD, but this may change soon.
603811e1b40d759a643086f590f6ffbd9d68360bad46Daniel Dunbarvoid dragonfly::Assemble::ConstructJob(Compilation &C, const JobAction &JA,
60392fe238ed293bd4bc27af9beb9fa151fad2146fa8Daniel Dunbar                                       const InputInfo &Output,
6040294691eb1caf551083acd7b08630ef21c3fd760dDaniel Dunbar                                       const InputInfoList &Inputs,
6041294691eb1caf551083acd7b08630ef21c3fd760dDaniel Dunbar                                       const ArgList &Args,
6042294691eb1caf551083acd7b08630ef21c3fd760dDaniel Dunbar                                       const char *LinkingOutput) const {
604311e1b40d759a643086f590f6ffbd9d68360bad46Daniel Dunbar  ArgStringList CmdArgs;
604411e1b40d759a643086f590f6ffbd9d68360bad46Daniel Dunbar
604511e1b40d759a643086f590f6ffbd9d68360bad46Daniel Dunbar  // When building 32-bit code on DragonFly/pc64, we have to explicitly
604611e1b40d759a643086f590f6ffbd9d68360bad46Daniel Dunbar  // instruct as in the base system to assemble 32-bit code.
604764f7ad9328e877779ec63638f39de4e10d2ff276Rafael Espindola  if (getToolChain().getArch() == llvm::Triple::x86)
604811e1b40d759a643086f590f6ffbd9d68360bad46Daniel Dunbar    CmdArgs.push_back("--32");
604911e1b40d759a643086f590f6ffbd9d68360bad46Daniel Dunbar
605011e1b40d759a643086f590f6ffbd9d68360bad46Daniel Dunbar  Args.AddAllArgValues(CmdArgs, options::OPT_Wa_COMMA,
605111e1b40d759a643086f590f6ffbd9d68360bad46Daniel Dunbar                       options::OPT_Xassembler);
605211e1b40d759a643086f590f6ffbd9d68360bad46Daniel Dunbar
605311e1b40d759a643086f590f6ffbd9d68360bad46Daniel Dunbar  CmdArgs.push_back("-o");
60547c1e46533cae07216e2a67d5636a5afb44253155Daniel Dunbar  CmdArgs.push_back(Output.getFilename());
605511e1b40d759a643086f590f6ffbd9d68360bad46Daniel Dunbar
605611e1b40d759a643086f590f6ffbd9d68360bad46Daniel Dunbar  for (InputInfoList::const_iterator
605711e1b40d759a643086f590f6ffbd9d68360bad46Daniel Dunbar         it = Inputs.begin(), ie = Inputs.end(); it != ie; ++it) {
605811e1b40d759a643086f590f6ffbd9d68360bad46Daniel Dunbar    const InputInfo &II = *it;
60597c1e46533cae07216e2a67d5636a5afb44253155Daniel Dunbar    CmdArgs.push_back(II.getFilename());
606011e1b40d759a643086f590f6ffbd9d68360bad46Daniel Dunbar  }
606111e1b40d759a643086f590f6ffbd9d68360bad46Daniel Dunbar
606211e1b40d759a643086f590f6ffbd9d68360bad46Daniel Dunbar  const char *Exec =
60634a7e88978cf646ad10d654020cb00b3877069210Daniel Dunbar    Args.MakeArgString(getToolChain().GetProgramPath("as"));
60642fe238ed293bd4bc27af9beb9fa151fad2146fa8Daniel Dunbar  C.addCommand(new Command(JA, *this, Exec, CmdArgs));
606511e1b40d759a643086f590f6ffbd9d68360bad46Daniel Dunbar}
606611e1b40d759a643086f590f6ffbd9d68360bad46Daniel Dunbar
606711e1b40d759a643086f590f6ffbd9d68360bad46Daniel Dunbarvoid dragonfly::Link::ConstructJob(Compilation &C, const JobAction &JA,
60682fe238ed293bd4bc27af9beb9fa151fad2146fa8Daniel Dunbar                                   const InputInfo &Output,
60692fe238ed293bd4bc27af9beb9fa151fad2146fa8Daniel Dunbar                                   const InputInfoList &Inputs,
60702fe238ed293bd4bc27af9beb9fa151fad2146fa8Daniel Dunbar                                   const ArgList &Args,
60712fe238ed293bd4bc27af9beb9fa151fad2146fa8Daniel Dunbar                                   const char *LinkingOutput) const {
6072ee788e70fcd0adf76103b17c78ac658d4ea30c9bDaniel Dunbar  const Driver &D = getToolChain().getDriver();
607311e1b40d759a643086f590f6ffbd9d68360bad46Daniel Dunbar  ArgStringList CmdArgs;
607411e1b40d759a643086f590f6ffbd9d68360bad46Daniel Dunbar
60758ab2bdcc4f397e100c684ede8e8ca6e226e1380aJoerg Sonnenberger  if (!D.SysRoot.empty())
60768ab2bdcc4f397e100c684ede8e8ca6e226e1380aJoerg Sonnenberger    CmdArgs.push_back(Args.MakeArgString("--sysroot=" + D.SysRoot));
60778ab2bdcc4f397e100c684ede8e8ca6e226e1380aJoerg Sonnenberger
607811e1b40d759a643086f590f6ffbd9d68360bad46Daniel Dunbar  if (Args.hasArg(options::OPT_static)) {
607911e1b40d759a643086f590f6ffbd9d68360bad46Daniel Dunbar    CmdArgs.push_back("-Bstatic");
608011e1b40d759a643086f590f6ffbd9d68360bad46Daniel Dunbar  } else {
608111e1b40d759a643086f590f6ffbd9d68360bad46Daniel Dunbar    if (Args.hasArg(options::OPT_shared))
608211e1b40d759a643086f590f6ffbd9d68360bad46Daniel Dunbar      CmdArgs.push_back("-Bshareable");
608311e1b40d759a643086f590f6ffbd9d68360bad46Daniel Dunbar    else {
608411e1b40d759a643086f590f6ffbd9d68360bad46Daniel Dunbar      CmdArgs.push_back("-dynamic-linker");
608511e1b40d759a643086f590f6ffbd9d68360bad46Daniel Dunbar      CmdArgs.push_back("/usr/libexec/ld-elf.so.2");
608611e1b40d759a643086f590f6ffbd9d68360bad46Daniel Dunbar    }
608711e1b40d759a643086f590f6ffbd9d68360bad46Daniel Dunbar  }
608811e1b40d759a643086f590f6ffbd9d68360bad46Daniel Dunbar
608911e1b40d759a643086f590f6ffbd9d68360bad46Daniel Dunbar  // When building 32-bit code on DragonFly/pc64, we have to explicitly
609011e1b40d759a643086f590f6ffbd9d68360bad46Daniel Dunbar  // instruct ld in the base system to link 32-bit code.
609164f7ad9328e877779ec63638f39de4e10d2ff276Rafael Espindola  if (getToolChain().getArch() == llvm::Triple::x86) {
609211e1b40d759a643086f590f6ffbd9d68360bad46Daniel Dunbar    CmdArgs.push_back("-m");
609311e1b40d759a643086f590f6ffbd9d68360bad46Daniel Dunbar    CmdArgs.push_back("elf_i386");
609411e1b40d759a643086f590f6ffbd9d68360bad46Daniel Dunbar  }
609511e1b40d759a643086f590f6ffbd9d68360bad46Daniel Dunbar
60967c1e46533cae07216e2a67d5636a5afb44253155Daniel Dunbar  if (Output.isFilename()) {
609711e1b40d759a643086f590f6ffbd9d68360bad46Daniel Dunbar    CmdArgs.push_back("-o");
609811e1b40d759a643086f590f6ffbd9d68360bad46Daniel Dunbar    CmdArgs.push_back(Output.getFilename());
609911e1b40d759a643086f590f6ffbd9d68360bad46Daniel Dunbar  } else {
610011e1b40d759a643086f590f6ffbd9d68360bad46Daniel Dunbar    assert(Output.isNothing() && "Invalid output.");
610111e1b40d759a643086f590f6ffbd9d68360bad46Daniel Dunbar  }
610211e1b40d759a643086f590f6ffbd9d68360bad46Daniel Dunbar
610311e1b40d759a643086f590f6ffbd9d68360bad46Daniel Dunbar  if (!Args.hasArg(options::OPT_nostdlib) &&
610411e1b40d759a643086f590f6ffbd9d68360bad46Daniel Dunbar      !Args.hasArg(options::OPT_nostartfiles)) {
610511e1b40d759a643086f590f6ffbd9d68360bad46Daniel Dunbar    if (!Args.hasArg(options::OPT_shared)) {
610638e317d6dce161b249508686cc67eb7176958762Chris Lattner      CmdArgs.push_back(
61074a7e88978cf646ad10d654020cb00b3877069210Daniel Dunbar            Args.MakeArgString(getToolChain().GetFilePath("crt1.o")));
610838e317d6dce161b249508686cc67eb7176958762Chris Lattner      CmdArgs.push_back(
61094a7e88978cf646ad10d654020cb00b3877069210Daniel Dunbar            Args.MakeArgString(getToolChain().GetFilePath("crti.o")));
611038e317d6dce161b249508686cc67eb7176958762Chris Lattner      CmdArgs.push_back(
61114a7e88978cf646ad10d654020cb00b3877069210Daniel Dunbar            Args.MakeArgString(getToolChain().GetFilePath("crtbegin.o")));
611211e1b40d759a643086f590f6ffbd9d68360bad46Daniel Dunbar    } else {
611338e317d6dce161b249508686cc67eb7176958762Chris Lattner      CmdArgs.push_back(
61144a7e88978cf646ad10d654020cb00b3877069210Daniel Dunbar            Args.MakeArgString(getToolChain().GetFilePath("crti.o")));
611538e317d6dce161b249508686cc67eb7176958762Chris Lattner      CmdArgs.push_back(
61164a7e88978cf646ad10d654020cb00b3877069210Daniel Dunbar            Args.MakeArgString(getToolChain().GetFilePath("crtbeginS.o")));
611711e1b40d759a643086f590f6ffbd9d68360bad46Daniel Dunbar    }
611811e1b40d759a643086f590f6ffbd9d68360bad46Daniel Dunbar  }
611911e1b40d759a643086f590f6ffbd9d68360bad46Daniel Dunbar
612011e1b40d759a643086f590f6ffbd9d68360bad46Daniel Dunbar  Args.AddAllArgs(CmdArgs, options::OPT_L);
612111e1b40d759a643086f590f6ffbd9d68360bad46Daniel Dunbar  Args.AddAllArgs(CmdArgs, options::OPT_T_Group);
612211e1b40d759a643086f590f6ffbd9d68360bad46Daniel Dunbar  Args.AddAllArgs(CmdArgs, options::OPT_e);
612311e1b40d759a643086f590f6ffbd9d68360bad46Daniel Dunbar
61242008feead855f08500fb01ff43ef5eebee05d1e5Daniel Dunbar  AddLinkerInputs(getToolChain(), Inputs, Args, CmdArgs);
612511e1b40d759a643086f590f6ffbd9d68360bad46Daniel Dunbar
612611e1b40d759a643086f590f6ffbd9d68360bad46Daniel Dunbar  if (!Args.hasArg(options::OPT_nostdlib) &&
612711e1b40d759a643086f590f6ffbd9d68360bad46Daniel Dunbar      !Args.hasArg(options::OPT_nodefaultlibs)) {
612811e1b40d759a643086f590f6ffbd9d68360bad46Daniel Dunbar    // FIXME: GCC passes on -lgcc, -lgcc_pic and a whole lot of
612911e1b40d759a643086f590f6ffbd9d68360bad46Daniel Dunbar    //         rpaths
613011e1b40d759a643086f590f6ffbd9d68360bad46Daniel Dunbar    CmdArgs.push_back("-L/usr/lib/gcc41");
613111e1b40d759a643086f590f6ffbd9d68360bad46Daniel Dunbar
613211e1b40d759a643086f590f6ffbd9d68360bad46Daniel Dunbar    if (!Args.hasArg(options::OPT_static)) {
613311e1b40d759a643086f590f6ffbd9d68360bad46Daniel Dunbar      CmdArgs.push_back("-rpath");
613411e1b40d759a643086f590f6ffbd9d68360bad46Daniel Dunbar      CmdArgs.push_back("/usr/lib/gcc41");
613511e1b40d759a643086f590f6ffbd9d68360bad46Daniel Dunbar
613611e1b40d759a643086f590f6ffbd9d68360bad46Daniel Dunbar      CmdArgs.push_back("-rpath-link");
613711e1b40d759a643086f590f6ffbd9d68360bad46Daniel Dunbar      CmdArgs.push_back("/usr/lib/gcc41");
613811e1b40d759a643086f590f6ffbd9d68360bad46Daniel Dunbar
613911e1b40d759a643086f590f6ffbd9d68360bad46Daniel Dunbar      CmdArgs.push_back("-rpath");
614011e1b40d759a643086f590f6ffbd9d68360bad46Daniel Dunbar      CmdArgs.push_back("/usr/lib");
614111e1b40d759a643086f590f6ffbd9d68360bad46Daniel Dunbar
614211e1b40d759a643086f590f6ffbd9d68360bad46Daniel Dunbar      CmdArgs.push_back("-rpath-link");
614311e1b40d759a643086f590f6ffbd9d68360bad46Daniel Dunbar      CmdArgs.push_back("/usr/lib");
614411e1b40d759a643086f590f6ffbd9d68360bad46Daniel Dunbar    }
614511e1b40d759a643086f590f6ffbd9d68360bad46Daniel Dunbar
6146405861d4ae824795f506d03cd7578f011cbf5b87Rafael Espindola    if (D.CCCIsCXX) {
6147132e35d2f87895d20e7ea146c8c00404b80221a1Daniel Dunbar      getToolChain().AddCXXStdlibLibArgs(Args, CmdArgs);
6148405861d4ae824795f506d03cd7578f011cbf5b87Rafael Espindola      CmdArgs.push_back("-lm");
6149405861d4ae824795f506d03cd7578f011cbf5b87Rafael Espindola    }
6150405861d4ae824795f506d03cd7578f011cbf5b87Rafael Espindola
615111e1b40d759a643086f590f6ffbd9d68360bad46Daniel Dunbar    if (Args.hasArg(options::OPT_shared)) {
615211e1b40d759a643086f590f6ffbd9d68360bad46Daniel Dunbar      CmdArgs.push_back("-lgcc_pic");
615311e1b40d759a643086f590f6ffbd9d68360bad46Daniel Dunbar    } else {
615411e1b40d759a643086f590f6ffbd9d68360bad46Daniel Dunbar      CmdArgs.push_back("-lgcc");
615511e1b40d759a643086f590f6ffbd9d68360bad46Daniel Dunbar    }
615611e1b40d759a643086f590f6ffbd9d68360bad46Daniel Dunbar
615711e1b40d759a643086f590f6ffbd9d68360bad46Daniel Dunbar
615811e1b40d759a643086f590f6ffbd9d68360bad46Daniel Dunbar    if (Args.hasArg(options::OPT_pthread))
61594d63f8bc2686d5d7580324407854f2ca7c128832Mike Stump      CmdArgs.push_back("-lpthread");
616011e1b40d759a643086f590f6ffbd9d68360bad46Daniel Dunbar
616111e1b40d759a643086f590f6ffbd9d68360bad46Daniel Dunbar    if (!Args.hasArg(options::OPT_nolibc)) {
616211e1b40d759a643086f590f6ffbd9d68360bad46Daniel Dunbar      CmdArgs.push_back("-lc");
616311e1b40d759a643086f590f6ffbd9d68360bad46Daniel Dunbar    }
616411e1b40d759a643086f590f6ffbd9d68360bad46Daniel Dunbar
616511e1b40d759a643086f590f6ffbd9d68360bad46Daniel Dunbar    if (Args.hasArg(options::OPT_shared)) {
616611e1b40d759a643086f590f6ffbd9d68360bad46Daniel Dunbar      CmdArgs.push_back("-lgcc_pic");
616711e1b40d759a643086f590f6ffbd9d68360bad46Daniel Dunbar    } else {
616811e1b40d759a643086f590f6ffbd9d68360bad46Daniel Dunbar      CmdArgs.push_back("-lgcc");
616911e1b40d759a643086f590f6ffbd9d68360bad46Daniel Dunbar    }
617011e1b40d759a643086f590f6ffbd9d68360bad46Daniel Dunbar  }
617111e1b40d759a643086f590f6ffbd9d68360bad46Daniel Dunbar
617211e1b40d759a643086f590f6ffbd9d68360bad46Daniel Dunbar  if (!Args.hasArg(options::OPT_nostdlib) &&
617311e1b40d759a643086f590f6ffbd9d68360bad46Daniel Dunbar      !Args.hasArg(options::OPT_nostartfiles)) {
617411e1b40d759a643086f590f6ffbd9d68360bad46Daniel Dunbar    if (!Args.hasArg(options::OPT_shared))
617538e317d6dce161b249508686cc67eb7176958762Chris Lattner      CmdArgs.push_back(Args.MakeArgString(
61764a7e88978cf646ad10d654020cb00b3877069210Daniel Dunbar                              getToolChain().GetFilePath("crtend.o")));
617711e1b40d759a643086f590f6ffbd9d68360bad46Daniel Dunbar    else
617838e317d6dce161b249508686cc67eb7176958762Chris Lattner      CmdArgs.push_back(Args.MakeArgString(
61794a7e88978cf646ad10d654020cb00b3877069210Daniel Dunbar                              getToolChain().GetFilePath("crtendS.o")));
618038e317d6dce161b249508686cc67eb7176958762Chris Lattner    CmdArgs.push_back(Args.MakeArgString(
61814a7e88978cf646ad10d654020cb00b3877069210Daniel Dunbar                              getToolChain().GetFilePath("crtn.o")));
618211e1b40d759a643086f590f6ffbd9d68360bad46Daniel Dunbar  }
618311e1b40d759a643086f590f6ffbd9d68360bad46Daniel Dunbar
61843f4be6fb8872942f567166ab8d99c89885f26103Bill Wendling  addProfileRT(getToolChain(), Args, CmdArgs, getToolChain().getTriple());
61852e95a6d7d0b5aed39747875d7474c27824f7319fNick Lewycky
618611e1b40d759a643086f590f6ffbd9d68360bad46Daniel Dunbar  const char *Exec =
61874a7e88978cf646ad10d654020cb00b3877069210Daniel Dunbar    Args.MakeArgString(getToolChain().GetProgramPath("ld"));
61882fe238ed293bd4bc27af9beb9fa151fad2146fa8Daniel Dunbar  C.addCommand(new Command(JA, *this, Exec, CmdArgs));
618911e1b40d759a643086f590f6ffbd9d68360bad46Daniel Dunbar}
6190ff58e3610f4e12094def69eb2d6dcb4330378d8fMichael J. Spencer
6191ff58e3610f4e12094def69eb2d6dcb4330378d8fMichael J. Spencervoid visualstudio::Link::ConstructJob(Compilation &C, const JobAction &JA,
6192ff58e3610f4e12094def69eb2d6dcb4330378d8fMichael J. Spencer                                      const InputInfo &Output,
6193ff58e3610f4e12094def69eb2d6dcb4330378d8fMichael J. Spencer                                      const InputInfoList &Inputs,
6194ff58e3610f4e12094def69eb2d6dcb4330378d8fMichael J. Spencer                                      const ArgList &Args,
6195ff58e3610f4e12094def69eb2d6dcb4330378d8fMichael J. Spencer                                      const char *LinkingOutput) const {
6196ff58e3610f4e12094def69eb2d6dcb4330378d8fMichael J. Spencer  ArgStringList CmdArgs;
6197ff58e3610f4e12094def69eb2d6dcb4330378d8fMichael J. Spencer
6198ff58e3610f4e12094def69eb2d6dcb4330378d8fMichael J. Spencer  if (Output.isFilename()) {
6199e5a37f48388c7e4cc081f44d13a4910bfa56cd35Daniel Dunbar    CmdArgs.push_back(Args.MakeArgString(std::string("-out:") +
6200e5a37f48388c7e4cc081f44d13a4910bfa56cd35Daniel Dunbar                                         Output.getFilename()));
6201ff58e3610f4e12094def69eb2d6dcb4330378d8fMichael J. Spencer  } else {
6202ff58e3610f4e12094def69eb2d6dcb4330378d8fMichael J. Spencer    assert(Output.isNothing() && "Invalid output.");
6203ff58e3610f4e12094def69eb2d6dcb4330378d8fMichael J. Spencer  }
6204ff58e3610f4e12094def69eb2d6dcb4330378d8fMichael J. Spencer
6205ff58e3610f4e12094def69eb2d6dcb4330378d8fMichael J. Spencer  if (!Args.hasArg(options::OPT_nostdlib) &&
6206ff58e3610f4e12094def69eb2d6dcb4330378d8fMichael J. Spencer    !Args.hasArg(options::OPT_nostartfiles)) {
6207ff58e3610f4e12094def69eb2d6dcb4330378d8fMichael J. Spencer    CmdArgs.push_back("-defaultlib:libcmt");
6208ff58e3610f4e12094def69eb2d6dcb4330378d8fMichael J. Spencer  }
6209ff58e3610f4e12094def69eb2d6dcb4330378d8fMichael J. Spencer
6210ff58e3610f4e12094def69eb2d6dcb4330378d8fMichael J. Spencer  CmdArgs.push_back("-nologo");
6211ff58e3610f4e12094def69eb2d6dcb4330378d8fMichael J. Spencer
6212a2284f5dcab3201bb9dd37568a3bed2041f1ab0bMichael J. Spencer  Args.AddAllArgValues(CmdArgs, options::OPT_l);
6213a2284f5dcab3201bb9dd37568a3bed2041f1ab0bMichael J. Spencer
6214a2284f5dcab3201bb9dd37568a3bed2041f1ab0bMichael J. Spencer  // Add filenames immediately.
6215a2284f5dcab3201bb9dd37568a3bed2041f1ab0bMichael J. Spencer  for (InputInfoList::const_iterator
6216a2284f5dcab3201bb9dd37568a3bed2041f1ab0bMichael J. Spencer       it = Inputs.begin(), ie = Inputs.end(); it != ie; ++it) {
6217a2284f5dcab3201bb9dd37568a3bed2041f1ab0bMichael J. Spencer    if (it->isFilename())
6218a2284f5dcab3201bb9dd37568a3bed2041f1ab0bMichael J. Spencer      CmdArgs.push_back(it->getFilename());
6219a2284f5dcab3201bb9dd37568a3bed2041f1ab0bMichael J. Spencer  }
6220ff58e3610f4e12094def69eb2d6dcb4330378d8fMichael J. Spencer
6221ff58e3610f4e12094def69eb2d6dcb4330378d8fMichael J. Spencer  const char *Exec =
62222008feead855f08500fb01ff43ef5eebee05d1e5Daniel Dunbar    Args.MakeArgString(getToolChain().GetProgramPath("link.exe"));
6223ff58e3610f4e12094def69eb2d6dcb4330378d8fMichael J. Spencer  C.addCommand(new Command(JA, *this, Exec, CmdArgs));
6224ff58e3610f4e12094def69eb2d6dcb4330378d8fMichael J. Spencer}
6225