Tools.cpp revision 035ff0c6746a2689667c83d4c02a47d5a7b71e82
1e3365aa452673f7ea3244bb6638551f13ab7570dNick Lewycky//===--- Tools.cpp - Tools Implementations --------------------------------===//
247ac7d27c44bd64a7d0fc03d4babc196cf2b8230Daniel Dunbar//
347ac7d27c44bd64a7d0fc03d4babc196cf2b8230Daniel Dunbar//                     The LLVM Compiler Infrastructure
447ac7d27c44bd64a7d0fc03d4babc196cf2b8230Daniel Dunbar//
547ac7d27c44bd64a7d0fc03d4babc196cf2b8230Daniel Dunbar// This file is distributed under the University of Illinois Open Source
647ac7d27c44bd64a7d0fc03d4babc196cf2b8230Daniel Dunbar// License. See LICENSE.TXT for details.
747ac7d27c44bd64a7d0fc03d4babc196cf2b8230Daniel Dunbar//
847ac7d27c44bd64a7d0fc03d4babc196cf2b8230Daniel Dunbar//===----------------------------------------------------------------------===//
947ac7d27c44bd64a7d0fc03d4babc196cf2b8230Daniel Dunbar
1047ac7d27c44bd64a7d0fc03d4babc196cf2b8230Daniel Dunbar#include "Tools.h"
1147ac7d27c44bd64a7d0fc03d4babc196cf2b8230Daniel Dunbar
121d46033f760ba5fd266ce59fe391fac473f04f52Daniel Dunbar#include "clang/Driver/Action.h"
13871adcf4e41285e3f4c3b62eaa1b2e05b60b92daDaniel Dunbar#include "clang/Driver/Arg.h"
14b488c1dac8e53206f07103d794a62a3f5012c0f4Daniel Dunbar#include "clang/Driver/ArgList.h"
15ee848a73e5f8ffe7511af8652ba811c020d1c7a0Daniel Dunbar#include "clang/Driver/Driver.h"
16ee848a73e5f8ffe7511af8652ba811c020d1c7a0Daniel Dunbar#include "clang/Driver/DriverDiagnostic.h"
17871adcf4e41285e3f4c3b62eaa1b2e05b60b92daDaniel Dunbar#include "clang/Driver/Compilation.h"
18871adcf4e41285e3f4c3b62eaa1b2e05b60b92daDaniel Dunbar#include "clang/Driver/Job.h"
19b488c1dac8e53206f07103d794a62a3f5012c0f4Daniel Dunbar#include "clang/Driver/HostInfo.h"
20b488c1dac8e53206f07103d794a62a3f5012c0f4Daniel Dunbar#include "clang/Driver/Option.h"
21265e9ef9f3ef30a97790e6e7bbc3c17d97981ca7Daniel Dunbar#include "clang/Driver/Options.h"
22b488c1dac8e53206f07103d794a62a3f5012c0f4Daniel Dunbar#include "clang/Driver/ToolChain.h"
23871adcf4e41285e3f4c3b62eaa1b2e05b60b92daDaniel Dunbar#include "clang/Driver/Util.h"
24871adcf4e41285e3f4c3b62eaa1b2e05b60b92daDaniel Dunbar
25881376467c46c5c6cc16fa6790271c2c22e1d4f1Daniel Dunbar#include "llvm/ADT/SmallString.h"
2655d3f7ae512875a1d6402943c3a619633feb2a18Douglas Gregor#include "llvm/ADT/StringSwitch.h"
275b750fe6189a41937ff2b080a983c95ea273769fDaniel Dunbar#include "llvm/ADT/Twine.h"
2832bef4edba854303800b3b01cb49a282e5da4f69Michael J. Spencer#include "llvm/Support/FileSystem.h"
2902633b541b04ad5ffc1c70f4c2feeeb13e607057Daniel Dunbar#include "llvm/Support/Format.h"
3002633b541b04ad5ffc1c70f4c2feeeb13e607057Daniel Dunbar#include "llvm/Support/raw_ostream.h"
3103013fa9a0bf1ef4b907f5fec006c8f4000fdd21Michael J. Spencer#include "llvm/Support/Host.h"
3203013fa9a0bf1ef4b907f5fec006c8f4000fdd21Michael J. Spencer#include "llvm/Support/Process.h"
33871adcf4e41285e3f4c3b62eaa1b2e05b60b92daDaniel Dunbar
34871adcf4e41285e3f4c3b62eaa1b2e05b60b92daDaniel Dunbar#include "InputInfo.h"
3502633b541b04ad5ffc1c70f4c2feeeb13e607057Daniel Dunbar#include "ToolChains.h"
36871adcf4e41285e3f4c3b62eaa1b2e05b60b92daDaniel Dunbar
3747ac7d27c44bd64a7d0fc03d4babc196cf2b8230Daniel Dunbarusing namespace clang::driver;
3847ac7d27c44bd64a7d0fc03d4babc196cf2b8230Daniel Dunbarusing namespace clang::driver::tools;
3947ac7d27c44bd64a7d0fc03d4babc196cf2b8230Daniel Dunbar
4088a3d6cf5ebab81614f89ba48a8d89023270637aDaniel Dunbar/// CheckPreprocessingOptions - Perform some validation of preprocessing
4188a3d6cf5ebab81614f89ba48a8d89023270637aDaniel Dunbar/// arguments that is shared with gcc.
4288a3d6cf5ebab81614f89ba48a8d89023270637aDaniel Dunbarstatic void CheckPreprocessingOptions(const Driver &D, const ArgList &Args) {
4388a3d6cf5ebab81614f89ba48a8d89023270637aDaniel Dunbar  if (Arg *A = Args.getLastArg(options::OPT_C, options::OPT_CC))
4488a3d6cf5ebab81614f89ba48a8d89023270637aDaniel Dunbar    if (!Args.hasArg(options::OPT_E))
4588a3d6cf5ebab81614f89ba48a8d89023270637aDaniel Dunbar      D.Diag(clang::diag::err_drv_argument_only_allowed_with)
4688a3d6cf5ebab81614f89ba48a8d89023270637aDaniel Dunbar        << A->getAsString(Args) << "-E";
4788a3d6cf5ebab81614f89ba48a8d89023270637aDaniel Dunbar}
4888a3d6cf5ebab81614f89ba48a8d89023270637aDaniel Dunbar
49e2fd66418eca3d70cf6b62087d745d0c5181db69Daniel Dunbar/// CheckCodeGenerationOptions - Perform some validation of code generation
50e2fd66418eca3d70cf6b62087d745d0c5181db69Daniel Dunbar/// arguments that is shared with gcc.
51e2fd66418eca3d70cf6b62087d745d0c5181db69Daniel Dunbarstatic void CheckCodeGenerationOptions(const Driver &D, const ArgList &Args) {
52e2fd66418eca3d70cf6b62087d745d0c5181db69Daniel Dunbar  // In gcc, only ARM checks this, but it seems reasonable to check universally.
53e2fd66418eca3d70cf6b62087d745d0c5181db69Daniel Dunbar  if (Args.hasArg(options::OPT_static))
54e2fd66418eca3d70cf6b62087d745d0c5181db69Daniel Dunbar    if (const Arg *A = Args.getLastArg(options::OPT_dynamic,
55e2fd66418eca3d70cf6b62087d745d0c5181db69Daniel Dunbar                                       options::OPT_mdynamic_no_pic))
56e2fd66418eca3d70cf6b62087d745d0c5181db69Daniel Dunbar      D.Diag(clang::diag::err_drv_argument_not_allowed_with)
57e2fd66418eca3d70cf6b62087d745d0c5181db69Daniel Dunbar        << A->getAsString(Args) << "-static";
58e2fd66418eca3d70cf6b62087d745d0c5181db69Daniel Dunbar}
59e2fd66418eca3d70cf6b62087d745d0c5181db69Daniel Dunbar
603edbeb78fe5ea7fffea7a94575478cde19e830e0Chris Lattner// Quote target names for inclusion in GNU Make dependency files.
613edbeb78fe5ea7fffea7a94575478cde19e830e0Chris Lattner// Only the characters '$', '#', ' ', '\t' are quoted.
623edbeb78fe5ea7fffea7a94575478cde19e830e0Chris Lattnerstatic void QuoteTarget(llvm::StringRef Target,
633edbeb78fe5ea7fffea7a94575478cde19e830e0Chris Lattner                        llvm::SmallVectorImpl<char> &Res) {
643edbeb78fe5ea7fffea7a94575478cde19e830e0Chris Lattner  for (unsigned i = 0, e = Target.size(); i != e; ++i) {
653edbeb78fe5ea7fffea7a94575478cde19e830e0Chris Lattner    switch (Target[i]) {
663edbeb78fe5ea7fffea7a94575478cde19e830e0Chris Lattner    case ' ':
673edbeb78fe5ea7fffea7a94575478cde19e830e0Chris Lattner    case '\t':
683edbeb78fe5ea7fffea7a94575478cde19e830e0Chris Lattner      // Escape the preceding backslashes
693edbeb78fe5ea7fffea7a94575478cde19e830e0Chris Lattner      for (int j = i - 1; j >= 0 && Target[j] == '\\'; --j)
703edbeb78fe5ea7fffea7a94575478cde19e830e0Chris Lattner        Res.push_back('\\');
713edbeb78fe5ea7fffea7a94575478cde19e830e0Chris Lattner
723edbeb78fe5ea7fffea7a94575478cde19e830e0Chris Lattner      // Escape the space/tab
733edbeb78fe5ea7fffea7a94575478cde19e830e0Chris Lattner      Res.push_back('\\');
743edbeb78fe5ea7fffea7a94575478cde19e830e0Chris Lattner      break;
753edbeb78fe5ea7fffea7a94575478cde19e830e0Chris Lattner    case '$':
763edbeb78fe5ea7fffea7a94575478cde19e830e0Chris Lattner      Res.push_back('$');
773edbeb78fe5ea7fffea7a94575478cde19e830e0Chris Lattner      break;
783edbeb78fe5ea7fffea7a94575478cde19e830e0Chris Lattner    case '#':
793edbeb78fe5ea7fffea7a94575478cde19e830e0Chris Lattner      Res.push_back('\\');
803edbeb78fe5ea7fffea7a94575478cde19e830e0Chris Lattner      break;
813edbeb78fe5ea7fffea7a94575478cde19e830e0Chris Lattner    default:
823edbeb78fe5ea7fffea7a94575478cde19e830e0Chris Lattner      break;
833edbeb78fe5ea7fffea7a94575478cde19e830e0Chris Lattner    }
843edbeb78fe5ea7fffea7a94575478cde19e830e0Chris Lattner
853edbeb78fe5ea7fffea7a94575478cde19e830e0Chris Lattner    Res.push_back(Target[i]);
863edbeb78fe5ea7fffea7a94575478cde19e830e0Chris Lattner  }
873edbeb78fe5ea7fffea7a94575478cde19e830e0Chris Lattner}
883edbeb78fe5ea7fffea7a94575478cde19e830e0Chris Lattner
892008feead855f08500fb01ff43ef5eebee05d1e5Daniel Dunbarstatic void AddLinkerInputs(const ToolChain &TC,
902008feead855f08500fb01ff43ef5eebee05d1e5Daniel Dunbar                            const InputInfoList &Inputs, const ArgList &Args,
912008feead855f08500fb01ff43ef5eebee05d1e5Daniel Dunbar                            ArgStringList &CmdArgs) {
922008feead855f08500fb01ff43ef5eebee05d1e5Daniel Dunbar  const Driver &D = TC.getDriver();
932008feead855f08500fb01ff43ef5eebee05d1e5Daniel Dunbar
948ac38d7b5d88d12f454a7cda1275bf429813151dDaniel Dunbar  // Add extra linker input arguments which are not treated as inputs
958ac38d7b5d88d12f454a7cda1275bf429813151dDaniel Dunbar  // (constructed via -Xarch_).
968ac38d7b5d88d12f454a7cda1275bf429813151dDaniel Dunbar  Args.AddAllArgValues(CmdArgs, options::OPT_Zlinker_input);
978ac38d7b5d88d12f454a7cda1275bf429813151dDaniel Dunbar
982008feead855f08500fb01ff43ef5eebee05d1e5Daniel Dunbar  for (InputInfoList::const_iterator
992008feead855f08500fb01ff43ef5eebee05d1e5Daniel Dunbar         it = Inputs.begin(), ie = Inputs.end(); it != ie; ++it) {
1002008feead855f08500fb01ff43ef5eebee05d1e5Daniel Dunbar    const InputInfo &II = *it;
1012008feead855f08500fb01ff43ef5eebee05d1e5Daniel Dunbar
1022008feead855f08500fb01ff43ef5eebee05d1e5Daniel Dunbar    if (!TC.HasNativeLLVMSupport()) {
1032008feead855f08500fb01ff43ef5eebee05d1e5Daniel Dunbar      // Don't try to pass LLVM inputs unless we have native support.
1042008feead855f08500fb01ff43ef5eebee05d1e5Daniel Dunbar      if (II.getType() == types::TY_LLVM_IR ||
1052008feead855f08500fb01ff43ef5eebee05d1e5Daniel Dunbar          II.getType() == types::TY_LTO_IR ||
1062008feead855f08500fb01ff43ef5eebee05d1e5Daniel Dunbar          II.getType() == types::TY_LLVM_BC ||
1072008feead855f08500fb01ff43ef5eebee05d1e5Daniel Dunbar          II.getType() == types::TY_LTO_BC)
1082008feead855f08500fb01ff43ef5eebee05d1e5Daniel Dunbar        D.Diag(clang::diag::err_drv_no_linker_llvm_support)
1092008feead855f08500fb01ff43ef5eebee05d1e5Daniel Dunbar          << TC.getTripleString();
1102008feead855f08500fb01ff43ef5eebee05d1e5Daniel Dunbar    }
1112008feead855f08500fb01ff43ef5eebee05d1e5Daniel Dunbar
112e5a37f48388c7e4cc081f44d13a4910bfa56cd35Daniel Dunbar    // Add filenames immediately.
113e5a37f48388c7e4cc081f44d13a4910bfa56cd35Daniel Dunbar    if (II.isFilename()) {
1142008feead855f08500fb01ff43ef5eebee05d1e5Daniel Dunbar      CmdArgs.push_back(II.getFilename());
115e5a37f48388c7e4cc081f44d13a4910bfa56cd35Daniel Dunbar      continue;
116e5a37f48388c7e4cc081f44d13a4910bfa56cd35Daniel Dunbar    }
117e5a37f48388c7e4cc081f44d13a4910bfa56cd35Daniel Dunbar
118e5a37f48388c7e4cc081f44d13a4910bfa56cd35Daniel Dunbar    // Otherwise, this is a linker input argument.
119e5a37f48388c7e4cc081f44d13a4910bfa56cd35Daniel Dunbar    const Arg &A = II.getInputArg();
120e5a37f48388c7e4cc081f44d13a4910bfa56cd35Daniel Dunbar
121e5a37f48388c7e4cc081f44d13a4910bfa56cd35Daniel Dunbar    // Handle reserved library options.
122e5a37f48388c7e4cc081f44d13a4910bfa56cd35Daniel Dunbar    if (A.getOption().matches(options::OPT_Z_reserved_lib_stdcxx)) {
123132e35d2f87895d20e7ea146c8c00404b80221a1Daniel Dunbar      TC.AddCXXStdlibLibArgs(Args, CmdArgs);
1247433fedce98a58341d0f30c2e12e8d53f3bba575Shantonu Sen    } else if (A.getOption().matches(options::OPT_Z_reserved_lib_cckext)) {
1257433fedce98a58341d0f30c2e12e8d53f3bba575Shantonu Sen      TC.AddCCKextLibArgs(Args, CmdArgs);
126e5a37f48388c7e4cc081f44d13a4910bfa56cd35Daniel Dunbar    } else
127e5a37f48388c7e4cc081f44d13a4910bfa56cd35Daniel Dunbar      A.renderAsInput(Args, CmdArgs);
1282008feead855f08500fb01ff43ef5eebee05d1e5Daniel Dunbar  }
1292008feead855f08500fb01ff43ef5eebee05d1e5Daniel Dunbar}
1302008feead855f08500fb01ff43ef5eebee05d1e5Daniel Dunbar
1311eb4433ac451dc16f4133a88af2d002ac26c58efMike Stumpvoid Clang::AddPreprocessingOptions(const Driver &D,
132df91ef3d6c55692a0236f67b6c6b134a3bf84098Douglas Gregor                                    const ArgList &Args,
133c21c485b4fb58ef5d55cf3e523263dd824a2ace4Daniel Dunbar                                    ArgStringList &CmdArgs,
134c21c485b4fb58ef5d55cf3e523263dd824a2ace4Daniel Dunbar                                    const InputInfo &Output,
135c21c485b4fb58ef5d55cf3e523263dd824a2ace4Daniel Dunbar                                    const InputInfoList &Inputs) const {
136c21c485b4fb58ef5d55cf3e523263dd824a2ace4Daniel Dunbar  Arg *A;
1373a183d3d46426d8719031553131b8928f50aa606Daniel Dunbar
13888a3d6cf5ebab81614f89ba48a8d89023270637aDaniel Dunbar  CheckPreprocessingOptions(D, Args);
13988a3d6cf5ebab81614f89ba48a8d89023270637aDaniel Dunbar
14088a3d6cf5ebab81614f89ba48a8d89023270637aDaniel Dunbar  Args.AddLastArg(CmdArgs, options::OPT_C);
14188a3d6cf5ebab81614f89ba48a8d89023270637aDaniel Dunbar  Args.AddLastArg(CmdArgs, options::OPT_CC);
1423a183d3d46426d8719031553131b8928f50aa606Daniel Dunbar
1433a183d3d46426d8719031553131b8928f50aa606Daniel Dunbar  // Handle dependency file generation.
1449eb93b07ea913e7ad0bcd15bd3e3662e2760c323Daniel Dunbar  if ((A = Args.getLastArg(options::OPT_M, options::OPT_MM)) ||
145c21c485b4fb58ef5d55cf3e523263dd824a2ace4Daniel Dunbar      (A = Args.getLastArg(options::OPT_MD)) ||
146c21c485b4fb58ef5d55cf3e523263dd824a2ace4Daniel Dunbar      (A = Args.getLastArg(options::OPT_MMD))) {
147c21c485b4fb58ef5d55cf3e523263dd824a2ace4Daniel Dunbar    // Determine the output location.
148c21c485b4fb58ef5d55cf3e523263dd824a2ace4Daniel Dunbar    const char *DepFile;
149c21c485b4fb58ef5d55cf3e523263dd824a2ace4Daniel Dunbar    if (Output.getType() == types::TY_Dependencies) {
1507c1e46533cae07216e2a67d5636a5afb44253155Daniel Dunbar      DepFile = Output.getFilename();
151c21c485b4fb58ef5d55cf3e523263dd824a2ace4Daniel Dunbar    } else if (Arg *MF = Args.getLastArg(options::OPT_MF)) {
152c21c485b4fb58ef5d55cf3e523263dd824a2ace4Daniel Dunbar      DepFile = MF->getValue(Args);
153b827a0541b5fd095fcdb7ad0c3df93ca158c619aDaniel Dunbar    } else if (A->getOption().matches(options::OPT_M) ||
154b827a0541b5fd095fcdb7ad0c3df93ca158c619aDaniel Dunbar               A->getOption().matches(options::OPT_MM)) {
155c21c485b4fb58ef5d55cf3e523263dd824a2ace4Daniel Dunbar      DepFile = "-";
156c21c485b4fb58ef5d55cf3e523263dd824a2ace4Daniel Dunbar    } else {
157c21c485b4fb58ef5d55cf3e523263dd824a2ace4Daniel Dunbar      DepFile = darwin::CC1::getDependencyFileName(Args, Inputs);
158c21c485b4fb58ef5d55cf3e523263dd824a2ace4Daniel Dunbar    }
159c21c485b4fb58ef5d55cf3e523263dd824a2ace4Daniel Dunbar    CmdArgs.push_back("-dependency-file");
160c21c485b4fb58ef5d55cf3e523263dd824a2ace4Daniel Dunbar    CmdArgs.push_back(DepFile);
161c21c485b4fb58ef5d55cf3e523263dd824a2ace4Daniel Dunbar
1623edbeb78fe5ea7fffea7a94575478cde19e830e0Chris Lattner    // Add a default target if one wasn't specified.
163c21c485b4fb58ef5d55cf3e523263dd824a2ace4Daniel Dunbar    if (!Args.hasArg(options::OPT_MT) && !Args.hasArg(options::OPT_MQ)) {
164c21c485b4fb58ef5d55cf3e523263dd824a2ace4Daniel Dunbar      const char *DepTarget;
165c21c485b4fb58ef5d55cf3e523263dd824a2ace4Daniel Dunbar
166c21c485b4fb58ef5d55cf3e523263dd824a2ace4Daniel Dunbar      // If user provided -o, that is the dependency target, except
167c21c485b4fb58ef5d55cf3e523263dd824a2ace4Daniel Dunbar      // when we are only generating a dependency file.
168c21c485b4fb58ef5d55cf3e523263dd824a2ace4Daniel Dunbar      Arg *OutputOpt = Args.getLastArg(options::OPT_o);
169c21c485b4fb58ef5d55cf3e523263dd824a2ace4Daniel Dunbar      if (OutputOpt && Output.getType() != types::TY_Dependencies) {
170c21c485b4fb58ef5d55cf3e523263dd824a2ace4Daniel Dunbar        DepTarget = OutputOpt->getValue(Args);
171c21c485b4fb58ef5d55cf3e523263dd824a2ace4Daniel Dunbar      } else {
172c21c485b4fb58ef5d55cf3e523263dd824a2ace4Daniel Dunbar        // Otherwise derive from the base input.
173c21c485b4fb58ef5d55cf3e523263dd824a2ace4Daniel Dunbar        //
174c21c485b4fb58ef5d55cf3e523263dd824a2ace4Daniel Dunbar        // FIXME: This should use the computed output file location.
175472ccff00cdbcd095c3ba933b9e3f202719f118fMichael J. Spencer        llvm::SmallString<128> P(Inputs[0].getBaseInput());
176472ccff00cdbcd095c3ba933b9e3f202719f118fMichael J. Spencer        llvm::sys::path::replace_extension(P, "o");
177472ccff00cdbcd095c3ba933b9e3f202719f118fMichael J. Spencer        DepTarget = Args.MakeArgString(llvm::sys::path::filename(P));
178c21c485b4fb58ef5d55cf3e523263dd824a2ace4Daniel Dunbar      }
179c21c485b4fb58ef5d55cf3e523263dd824a2ace4Daniel Dunbar
180c21c485b4fb58ef5d55cf3e523263dd824a2ace4Daniel Dunbar      CmdArgs.push_back("-MT");
1813edbeb78fe5ea7fffea7a94575478cde19e830e0Chris Lattner      llvm::SmallString<128> Quoted;
1823edbeb78fe5ea7fffea7a94575478cde19e830e0Chris Lattner      QuoteTarget(DepTarget, Quoted);
1833edbeb78fe5ea7fffea7a94575478cde19e830e0Chris Lattner      CmdArgs.push_back(Args.MakeArgString(Quoted));
184c21c485b4fb58ef5d55cf3e523263dd824a2ace4Daniel Dunbar    }
185c21c485b4fb58ef5d55cf3e523263dd824a2ace4Daniel Dunbar
186b827a0541b5fd095fcdb7ad0c3df93ca158c619aDaniel Dunbar    if (A->getOption().matches(options::OPT_M) ||
187b827a0541b5fd095fcdb7ad0c3df93ca158c619aDaniel Dunbar        A->getOption().matches(options::OPT_MD))
188c21c485b4fb58ef5d55cf3e523263dd824a2ace4Daniel Dunbar      CmdArgs.push_back("-sys-header-deps");
189c21c485b4fb58ef5d55cf3e523263dd824a2ace4Daniel Dunbar  }
190c21c485b4fb58ef5d55cf3e523263dd824a2ace4Daniel Dunbar
191c21c485b4fb58ef5d55cf3e523263dd824a2ace4Daniel Dunbar  Args.AddLastArg(CmdArgs, options::OPT_MP);
1923edbeb78fe5ea7fffea7a94575478cde19e830e0Chris Lattner
1933edbeb78fe5ea7fffea7a94575478cde19e830e0Chris Lattner  // Convert all -MQ <target> args to -MT <quoted target>
1943edbeb78fe5ea7fffea7a94575478cde19e830e0Chris Lattner  for (arg_iterator it = Args.filtered_begin(options::OPT_MT,
1953edbeb78fe5ea7fffea7a94575478cde19e830e0Chris Lattner                                             options::OPT_MQ),
1963edbeb78fe5ea7fffea7a94575478cde19e830e0Chris Lattner         ie = Args.filtered_end(); it != ie; ++it) {
1977e4953e5c60409007545288f14b430bd23d68570Daniel Dunbar    const Arg *A = *it;
1987e4953e5c60409007545288f14b430bd23d68570Daniel Dunbar    A->claim();
1993edbeb78fe5ea7fffea7a94575478cde19e830e0Chris Lattner
2007e4953e5c60409007545288f14b430bd23d68570Daniel Dunbar    if (A->getOption().matches(options::OPT_MQ)) {
2013edbeb78fe5ea7fffea7a94575478cde19e830e0Chris Lattner      CmdArgs.push_back("-MT");
2023edbeb78fe5ea7fffea7a94575478cde19e830e0Chris Lattner      llvm::SmallString<128> Quoted;
2037e4953e5c60409007545288f14b430bd23d68570Daniel Dunbar      QuoteTarget(A->getValue(Args), Quoted);
2043edbeb78fe5ea7fffea7a94575478cde19e830e0Chris Lattner      CmdArgs.push_back(Args.MakeArgString(Quoted));
2053edbeb78fe5ea7fffea7a94575478cde19e830e0Chris Lattner
2063edbeb78fe5ea7fffea7a94575478cde19e830e0Chris Lattner    // -MT flag - no change
2073edbeb78fe5ea7fffea7a94575478cde19e830e0Chris Lattner    } else {
2087e4953e5c60409007545288f14b430bd23d68570Daniel Dunbar      A->render(Args, CmdArgs);
2093edbeb78fe5ea7fffea7a94575478cde19e830e0Chris Lattner    }
2103edbeb78fe5ea7fffea7a94575478cde19e830e0Chris Lattner  }
211c21c485b4fb58ef5d55cf3e523263dd824a2ace4Daniel Dunbar
212df91ef3d6c55692a0236f67b6c6b134a3bf84098Douglas Gregor  // Add -i* options, and automatically translate to
213df91ef3d6c55692a0236f67b6c6b134a3bf84098Douglas Gregor  // -include-pch/-include-pth for transparent PCH support. It's
214df91ef3d6c55692a0236f67b6c6b134a3bf84098Douglas Gregor  // wonky, but we include looking for .gch so we can support seamless
215df91ef3d6c55692a0236f67b6c6b134a3bf84098Douglas Gregor  // replacement into a build system already set up to be generating
216df91ef3d6c55692a0236f67b6c6b134a3bf84098Douglas Gregor  // .gch files.
217990142a23e41392ef7c0f14db4c0fcac67311cdfArgyrios Kyrtzidis  bool RenderedImplicitInclude = false;
218cdd9686b890ebdc10039ae256ef4c9dfb5ebacb7Daniel Dunbar  for (arg_iterator it = Args.filtered_begin(options::OPT_clang_i_Group),
219cdd9686b890ebdc10039ae256ef4c9dfb5ebacb7Daniel Dunbar         ie = Args.filtered_end(); it != ie; ++it) {
220cdd9686b890ebdc10039ae256ef4c9dfb5ebacb7Daniel Dunbar    const Arg *A = it;
221c21c485b4fb58ef5d55cf3e523263dd824a2ace4Daniel Dunbar
222c21c485b4fb58ef5d55cf3e523263dd824a2ace4Daniel Dunbar    if (A->getOption().matches(options::OPT_include)) {
223990142a23e41392ef7c0f14db4c0fcac67311cdfArgyrios Kyrtzidis      bool IsFirstImplicitInclude = !RenderedImplicitInclude;
224990142a23e41392ef7c0f14db4c0fcac67311cdfArgyrios Kyrtzidis      RenderedImplicitInclude = true;
225990142a23e41392ef7c0f14db4c0fcac67311cdfArgyrios Kyrtzidis
226e5c35377020d6c38d16434c9f373a5fa9bb4f2ebArgyrios Kyrtzidis      // Use PCH if the user requested it.
2270ebd9321ba380471010341f24c874f46f56e7581Daniel Dunbar      bool UsePCH = D.CCCUsePCH;
2280ebd9321ba380471010341f24c874f46f56e7581Daniel Dunbar
229c21c485b4fb58ef5d55cf3e523263dd824a2ace4Daniel Dunbar      bool FoundPTH = false;
230df91ef3d6c55692a0236f67b6c6b134a3bf84098Douglas Gregor      bool FoundPCH = false;
231c21c485b4fb58ef5d55cf3e523263dd824a2ace4Daniel Dunbar      llvm::sys::Path P(A->getValue(Args));
23232bef4edba854303800b3b01cb49a282e5da4f69Michael J. Spencer      bool Exists;
2330ebd9321ba380471010341f24c874f46f56e7581Daniel Dunbar      if (UsePCH) {
234df91ef3d6c55692a0236f67b6c6b134a3bf84098Douglas Gregor        P.appendSuffix("pch");
23532bef4edba854303800b3b01cb49a282e5da4f69Michael J. Spencer        if (!llvm::sys::fs::exists(P.str(), Exists) && Exists)
236df91ef3d6c55692a0236f67b6c6b134a3bf84098Douglas Gregor          FoundPCH = true;
2371eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump        else
238df91ef3d6c55692a0236f67b6c6b134a3bf84098Douglas Gregor          P.eraseSuffix();
239df91ef3d6c55692a0236f67b6c6b134a3bf84098Douglas Gregor      }
240df91ef3d6c55692a0236f67b6c6b134a3bf84098Douglas Gregor
241df91ef3d6c55692a0236f67b6c6b134a3bf84098Douglas Gregor      if (!FoundPCH) {
242df91ef3d6c55692a0236f67b6c6b134a3bf84098Douglas Gregor        P.appendSuffix("pth");
24332bef4edba854303800b3b01cb49a282e5da4f69Michael J. Spencer        if (!llvm::sys::fs::exists(P.str(), Exists) && Exists)
244c21c485b4fb58ef5d55cf3e523263dd824a2ace4Daniel Dunbar          FoundPTH = true;
245df91ef3d6c55692a0236f67b6c6b134a3bf84098Douglas Gregor        else
246df91ef3d6c55692a0236f67b6c6b134a3bf84098Douglas Gregor          P.eraseSuffix();
2471eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump      }
2481eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump
249df91ef3d6c55692a0236f67b6c6b134a3bf84098Douglas Gregor      if (!FoundPCH && !FoundPTH) {
250df91ef3d6c55692a0236f67b6c6b134a3bf84098Douglas Gregor        P.appendSuffix("gch");
25132bef4edba854303800b3b01cb49a282e5da4f69Michael J. Spencer        if (!llvm::sys::fs::exists(P.str(), Exists) && Exists) {
2520ebd9321ba380471010341f24c874f46f56e7581Daniel Dunbar          FoundPCH = UsePCH;
2530ebd9321ba380471010341f24c874f46f56e7581Daniel Dunbar          FoundPTH = !UsePCH;
254df91ef3d6c55692a0236f67b6c6b134a3bf84098Douglas Gregor        }
2551eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump        else
256df91ef3d6c55692a0236f67b6c6b134a3bf84098Douglas Gregor          P.eraseSuffix();
257c21c485b4fb58ef5d55cf3e523263dd824a2ace4Daniel Dunbar      }
258c21c485b4fb58ef5d55cf3e523263dd824a2ace4Daniel Dunbar
259df91ef3d6c55692a0236f67b6c6b134a3bf84098Douglas Gregor      if (FoundPCH || FoundPTH) {
260990142a23e41392ef7c0f14db4c0fcac67311cdfArgyrios Kyrtzidis        if (IsFirstImplicitInclude) {
261990142a23e41392ef7c0f14db4c0fcac67311cdfArgyrios Kyrtzidis          A->claim();
262990142a23e41392ef7c0f14db4c0fcac67311cdfArgyrios Kyrtzidis          if (UsePCH)
263990142a23e41392ef7c0f14db4c0fcac67311cdfArgyrios Kyrtzidis            CmdArgs.push_back("-include-pch");
264990142a23e41392ef7c0f14db4c0fcac67311cdfArgyrios Kyrtzidis          else
265990142a23e41392ef7c0f14db4c0fcac67311cdfArgyrios Kyrtzidis            CmdArgs.push_back("-include-pth");
266990142a23e41392ef7c0f14db4c0fcac67311cdfArgyrios Kyrtzidis          CmdArgs.push_back(Args.MakeArgString(P.str()));
267990142a23e41392ef7c0f14db4c0fcac67311cdfArgyrios Kyrtzidis          continue;
268990142a23e41392ef7c0f14db4c0fcac67311cdfArgyrios Kyrtzidis        } else {
269990142a23e41392ef7c0f14db4c0fcac67311cdfArgyrios Kyrtzidis          // Ignore the PCH if not first on command line and emit warning.
270990142a23e41392ef7c0f14db4c0fcac67311cdfArgyrios Kyrtzidis          D.Diag(clang::diag::warn_drv_pch_not_first_include)
271990142a23e41392ef7c0f14db4c0fcac67311cdfArgyrios Kyrtzidis              << P.str() << A->getAsString(Args);
272990142a23e41392ef7c0f14db4c0fcac67311cdfArgyrios Kyrtzidis        }
273c21c485b4fb58ef5d55cf3e523263dd824a2ace4Daniel Dunbar      }
274c21c485b4fb58ef5d55cf3e523263dd824a2ace4Daniel Dunbar    }
275c21c485b4fb58ef5d55cf3e523263dd824a2ace4Daniel Dunbar
276c21c485b4fb58ef5d55cf3e523263dd824a2ace4Daniel Dunbar    // Not translated, render as usual.
277c21c485b4fb58ef5d55cf3e523263dd824a2ace4Daniel Dunbar    A->claim();
278c21c485b4fb58ef5d55cf3e523263dd824a2ace4Daniel Dunbar    A->render(Args, CmdArgs);
279c21c485b4fb58ef5d55cf3e523263dd824a2ace4Daniel Dunbar  }
280c21c485b4fb58ef5d55cf3e523263dd824a2ace4Daniel Dunbar
281c21c485b4fb58ef5d55cf3e523263dd824a2ace4Daniel Dunbar  Args.AddAllArgs(CmdArgs, options::OPT_D, options::OPT_U);
282c21c485b4fb58ef5d55cf3e523263dd824a2ace4Daniel Dunbar  Args.AddAllArgs(CmdArgs, options::OPT_I_Group, options::OPT_F);
283c21c485b4fb58ef5d55cf3e523263dd824a2ace4Daniel Dunbar
284641b98b7b52e0067beaf3978f2a8721e5d16c111Daniel Dunbar  // Add C++ include arguments, if needed.
285641b98b7b52e0067beaf3978f2a8721e5d16c111Daniel Dunbar  types::ID InputType = Inputs[0].getType();
286641b98b7b52e0067beaf3978f2a8721e5d16c111Daniel Dunbar  if (types::isCXX(InputType))
287641b98b7b52e0067beaf3978f2a8721e5d16c111Daniel Dunbar    getToolChain().AddClangCXXStdlibIncludeArgs(Args, CmdArgs);
288641b98b7b52e0067beaf3978f2a8721e5d16c111Daniel Dunbar
289c21c485b4fb58ef5d55cf3e523263dd824a2ace4Daniel Dunbar  // Add -Wp, and -Xassembler if using the preprocessor.
290c21c485b4fb58ef5d55cf3e523263dd824a2ace4Daniel Dunbar
291c21c485b4fb58ef5d55cf3e523263dd824a2ace4Daniel Dunbar  // FIXME: There is a very unfortunate problem here, some troubled
292c21c485b4fb58ef5d55cf3e523263dd824a2ace4Daniel Dunbar  // souls abuse -Wp, to pass preprocessor options in gcc syntax. To
293c21c485b4fb58ef5d55cf3e523263dd824a2ace4Daniel Dunbar  // really support that we would have to parse and then translate
294c21c485b4fb58ef5d55cf3e523263dd824a2ace4Daniel Dunbar  // those options. :(
295c21c485b4fb58ef5d55cf3e523263dd824a2ace4Daniel Dunbar  Args.AddAllArgValues(CmdArgs, options::OPT_Wp_COMMA,
296c21c485b4fb58ef5d55cf3e523263dd824a2ace4Daniel Dunbar                       options::OPT_Xpreprocessor);
297607d7f6d8f21066cc48bbe2c51e6ca412a00943fDaniel Dunbar
298607d7f6d8f21066cc48bbe2c51e6ca412a00943fDaniel Dunbar  // -I- is a deprecated GCC feature, reject it.
299607d7f6d8f21066cc48bbe2c51e6ca412a00943fDaniel Dunbar  if (Arg *A = Args.getLastArg(options::OPT_I_))
300607d7f6d8f21066cc48bbe2c51e6ca412a00943fDaniel Dunbar    D.Diag(clang::diag::err_drv_I_dash_not_supported) << A->getAsString(Args);
301feee58ce268765742e41c473c8648607fd4831a7Chandler Carruth
302feee58ce268765742e41c473c8648607fd4831a7Chandler Carruth  // If we have a --sysroot, and don't have an explicit -isysroot flag, add an
303feee58ce268765742e41c473c8648607fd4831a7Chandler Carruth  // -isysroot to the CC1 invocation.
304feee58ce268765742e41c473c8648607fd4831a7Chandler Carruth  if (Arg *A = Args.getLastArg(options::OPT__sysroot_EQ)) {
305feee58ce268765742e41c473c8648607fd4831a7Chandler Carruth    if (!Args.hasArg(options::OPT_isysroot)) {
306feee58ce268765742e41c473c8648607fd4831a7Chandler Carruth      CmdArgs.push_back("-isysroot");
307feee58ce268765742e41c473c8648607fd4831a7Chandler Carruth      CmdArgs.push_back(A->getValue(Args));
308feee58ce268765742e41c473c8648607fd4831a7Chandler Carruth    }
309feee58ce268765742e41c473c8648607fd4831a7Chandler Carruth  }
310c21c485b4fb58ef5d55cf3e523263dd824a2ace4Daniel Dunbar}
311c21c485b4fb58ef5d55cf3e523263dd824a2ace4Daniel Dunbar
312728a512753d85a6ccaae34e81385c8665c2de0e1Daniel Dunbar/// getARMTargetCPU - Get the (LLVM) name of the ARM cpu we are targetting.
313728a512753d85a6ccaae34e81385c8665c2de0e1Daniel Dunbar//
314728a512753d85a6ccaae34e81385c8665c2de0e1Daniel Dunbar// FIXME: tblgen this.
315bcd6df662471e0ac2d3d85fdba09b1295c2fc468Rafael Espindolastatic const char *getARMTargetCPU(const ArgList &Args,
316bcd6df662471e0ac2d3d85fdba09b1295c2fc468Rafael Espindola                                   const llvm::Triple &Triple) {
317728a512753d85a6ccaae34e81385c8665c2de0e1Daniel Dunbar  // FIXME: Warn on inconsistent use of -mcpu and -march.
318b163ef7e7a5d904ef0962a7c38c460be083c4d63Daniel Dunbar
319b163ef7e7a5d904ef0962a7c38c460be083c4d63Daniel Dunbar  // If we have -mcpu=, use that.
320b163ef7e7a5d904ef0962a7c38c460be083c4d63Daniel Dunbar  if (Arg *A = Args.getLastArg(options::OPT_mcpu_EQ))
321b163ef7e7a5d904ef0962a7c38c460be083c4d63Daniel Dunbar    return A->getValue(Args);
322b163ef7e7a5d904ef0962a7c38c460be083c4d63Daniel Dunbar
323bcd6df662471e0ac2d3d85fdba09b1295c2fc468Rafael Espindola  llvm::StringRef MArch;
324b163ef7e7a5d904ef0962a7c38c460be083c4d63Daniel Dunbar  if (Arg *A = Args.getLastArg(options::OPT_march_EQ)) {
325bcd6df662471e0ac2d3d85fdba09b1295c2fc468Rafael Espindola    // Otherwise, if we have -march= choose the base CPU for that arch.
326bcd6df662471e0ac2d3d85fdba09b1295c2fc468Rafael Espindola    MArch = A->getValue(Args);
327bcd6df662471e0ac2d3d85fdba09b1295c2fc468Rafael Espindola  } else {
328bcd6df662471e0ac2d3d85fdba09b1295c2fc468Rafael Espindola    // Otherwise, use the Arch from the triple.
329bcd6df662471e0ac2d3d85fdba09b1295c2fc468Rafael Espindola    MArch = Triple.getArchName();
330b163ef7e7a5d904ef0962a7c38c460be083c4d63Daniel Dunbar  }
331b163ef7e7a5d904ef0962a7c38c460be083c4d63Daniel Dunbar
332bcd6df662471e0ac2d3d85fdba09b1295c2fc468Rafael Espindola  if (MArch == "armv2" || MArch == "armv2a")
333bcd6df662471e0ac2d3d85fdba09b1295c2fc468Rafael Espindola    return "arm2";
334bcd6df662471e0ac2d3d85fdba09b1295c2fc468Rafael Espindola  if (MArch == "armv3")
335bcd6df662471e0ac2d3d85fdba09b1295c2fc468Rafael Espindola    return "arm6";
336bcd6df662471e0ac2d3d85fdba09b1295c2fc468Rafael Espindola  if (MArch == "armv3m")
337bcd6df662471e0ac2d3d85fdba09b1295c2fc468Rafael Espindola    return "arm7m";
338bcd6df662471e0ac2d3d85fdba09b1295c2fc468Rafael Espindola  if (MArch == "armv4" || MArch == "armv4t")
339bcd6df662471e0ac2d3d85fdba09b1295c2fc468Rafael Espindola    return "arm7tdmi";
340bcd6df662471e0ac2d3d85fdba09b1295c2fc468Rafael Espindola  if (MArch == "armv5" || MArch == "armv5t")
341bcd6df662471e0ac2d3d85fdba09b1295c2fc468Rafael Espindola    return "arm10tdmi";
342bcd6df662471e0ac2d3d85fdba09b1295c2fc468Rafael Espindola  if (MArch == "armv5e" || MArch == "armv5te")
343bcd6df662471e0ac2d3d85fdba09b1295c2fc468Rafael Espindola    return "arm1026ejs";
344bcd6df662471e0ac2d3d85fdba09b1295c2fc468Rafael Espindola  if (MArch == "armv5tej")
345bcd6df662471e0ac2d3d85fdba09b1295c2fc468Rafael Espindola    return "arm926ej-s";
346bcd6df662471e0ac2d3d85fdba09b1295c2fc468Rafael Espindola  if (MArch == "armv6" || MArch == "armv6k")
347bcd6df662471e0ac2d3d85fdba09b1295c2fc468Rafael Espindola    return "arm1136jf-s";
348bcd6df662471e0ac2d3d85fdba09b1295c2fc468Rafael Espindola  if (MArch == "armv6j")
349bcd6df662471e0ac2d3d85fdba09b1295c2fc468Rafael Espindola    return "arm1136j-s";
350bcd6df662471e0ac2d3d85fdba09b1295c2fc468Rafael Espindola  if (MArch == "armv6z" || MArch == "armv6zk")
351bcd6df662471e0ac2d3d85fdba09b1295c2fc468Rafael Espindola    return "arm1176jzf-s";
352bcd6df662471e0ac2d3d85fdba09b1295c2fc468Rafael Espindola  if (MArch == "armv6t2")
353bcd6df662471e0ac2d3d85fdba09b1295c2fc468Rafael Espindola    return "arm1156t2-s";
354bcd6df662471e0ac2d3d85fdba09b1295c2fc468Rafael Espindola  if (MArch == "armv7" || MArch == "armv7a" || MArch == "armv7-a")
355bcd6df662471e0ac2d3d85fdba09b1295c2fc468Rafael Espindola    return "cortex-a8";
356bcd6df662471e0ac2d3d85fdba09b1295c2fc468Rafael Espindola  if (MArch == "armv7r" || MArch == "armv7-r")
357bcd6df662471e0ac2d3d85fdba09b1295c2fc468Rafael Espindola    return "cortex-r4";
358bcd6df662471e0ac2d3d85fdba09b1295c2fc468Rafael Espindola  if (MArch == "armv7m" || MArch == "armv7-m")
359bcd6df662471e0ac2d3d85fdba09b1295c2fc468Rafael Espindola    return "cortex-m3";
360bcd6df662471e0ac2d3d85fdba09b1295c2fc468Rafael Espindola  if (MArch == "ep9312")
361bcd6df662471e0ac2d3d85fdba09b1295c2fc468Rafael Espindola    return "ep9312";
362bcd6df662471e0ac2d3d85fdba09b1295c2fc468Rafael Espindola  if (MArch == "iwmmxt")
363bcd6df662471e0ac2d3d85fdba09b1295c2fc468Rafael Espindola    return "iwmmxt";
364bcd6df662471e0ac2d3d85fdba09b1295c2fc468Rafael Espindola  if (MArch == "xscale")
365bcd6df662471e0ac2d3d85fdba09b1295c2fc468Rafael Espindola    return "xscale";
366bcd6df662471e0ac2d3d85fdba09b1295c2fc468Rafael Espindola
367bcd6df662471e0ac2d3d85fdba09b1295c2fc468Rafael Espindola  // If all else failed, return the most base CPU LLVM supports.
368b163ef7e7a5d904ef0962a7c38c460be083c4d63Daniel Dunbar  return "arm7tdmi";
369b163ef7e7a5d904ef0962a7c38c460be083c4d63Daniel Dunbar}
370b163ef7e7a5d904ef0962a7c38c460be083c4d63Daniel Dunbar
3711d65e4be6f22f7e4b4974efbaef92fa3454f1ec8Daniel Dunbar/// getLLVMArchSuffixForARM - Get the LLVM arch name to use for a particular
372728a512753d85a6ccaae34e81385c8665c2de0e1Daniel Dunbar/// CPU.
373728a512753d85a6ccaae34e81385c8665c2de0e1Daniel Dunbar//
374728a512753d85a6ccaae34e81385c8665c2de0e1Daniel Dunbar// FIXME: This is redundant with -mcpu, why does LLVM use this.
375728a512753d85a6ccaae34e81385c8665c2de0e1Daniel Dunbar// FIXME: tblgen this, or kill it!
3761d65e4be6f22f7e4b4974efbaef92fa3454f1ec8Daniel Dunbarstatic const char *getLLVMArchSuffixForARM(llvm::StringRef CPU) {
377728a512753d85a6ccaae34e81385c8665c2de0e1Daniel Dunbar  if (CPU == "arm7tdmi" || CPU == "arm7tdmi-s" || CPU == "arm710t" ||
378728a512753d85a6ccaae34e81385c8665c2de0e1Daniel Dunbar      CPU == "arm720t" || CPU == "arm9" || CPU == "arm9tdmi" ||
379728a512753d85a6ccaae34e81385c8665c2de0e1Daniel Dunbar      CPU == "arm920" || CPU == "arm920t" || CPU == "arm922t" ||
380728a512753d85a6ccaae34e81385c8665c2de0e1Daniel Dunbar      CPU == "arm940t" || CPU == "ep9312")
3811d65e4be6f22f7e4b4974efbaef92fa3454f1ec8Daniel Dunbar    return "v4t";
382728a512753d85a6ccaae34e81385c8665c2de0e1Daniel Dunbar
383728a512753d85a6ccaae34e81385c8665c2de0e1Daniel Dunbar  if (CPU == "arm10tdmi" || CPU == "arm1020t")
3841d65e4be6f22f7e4b4974efbaef92fa3454f1ec8Daniel Dunbar    return "v5";
385728a512753d85a6ccaae34e81385c8665c2de0e1Daniel Dunbar
386728a512753d85a6ccaae34e81385c8665c2de0e1Daniel Dunbar  if (CPU == "arm9e" || CPU == "arm926ej-s" || CPU == "arm946e-s" ||
387728a512753d85a6ccaae34e81385c8665c2de0e1Daniel Dunbar      CPU == "arm966e-s" || CPU == "arm968e-s" || CPU == "arm10e" ||
388728a512753d85a6ccaae34e81385c8665c2de0e1Daniel Dunbar      CPU == "arm1020e" || CPU == "arm1022e" || CPU == "xscale" ||
389728a512753d85a6ccaae34e81385c8665c2de0e1Daniel Dunbar      CPU == "iwmmxt")
3901d65e4be6f22f7e4b4974efbaef92fa3454f1ec8Daniel Dunbar    return "v5e";
391728a512753d85a6ccaae34e81385c8665c2de0e1Daniel Dunbar
392728a512753d85a6ccaae34e81385c8665c2de0e1Daniel Dunbar  if (CPU == "arm1136j-s" || CPU == "arm1136jf-s" || CPU == "arm1176jz-s" ||
393728a512753d85a6ccaae34e81385c8665c2de0e1Daniel Dunbar      CPU == "arm1176jzf-s" || CPU == "mpcorenovfp" || CPU == "mpcore")
3941d65e4be6f22f7e4b4974efbaef92fa3454f1ec8Daniel Dunbar    return "v6";
395728a512753d85a6ccaae34e81385c8665c2de0e1Daniel Dunbar
396728a512753d85a6ccaae34e81385c8665c2de0e1Daniel Dunbar  if (CPU == "arm1156t2-s" || CPU == "arm1156t2f-s")
3971d65e4be6f22f7e4b4974efbaef92fa3454f1ec8Daniel Dunbar    return "v6t2";
398728a512753d85a6ccaae34e81385c8665c2de0e1Daniel Dunbar
399728a512753d85a6ccaae34e81385c8665c2de0e1Daniel Dunbar  if (CPU == "cortex-a8" || CPU == "cortex-a9")
4001d65e4be6f22f7e4b4974efbaef92fa3454f1ec8Daniel Dunbar    return "v7";
401728a512753d85a6ccaae34e81385c8665c2de0e1Daniel Dunbar
4021d65e4be6f22f7e4b4974efbaef92fa3454f1ec8Daniel Dunbar  return "";
403728a512753d85a6ccaae34e81385c8665c2de0e1Daniel Dunbar}
404728a512753d85a6ccaae34e81385c8665c2de0e1Daniel Dunbar
4051f95e6567faab67f4363d650f73121359c4bdbabDaniel Dunbar// FIXME: Move to target hook.
4061f95e6567faab67f4363d650f73121359c4bdbabDaniel Dunbarstatic bool isSignedCharDefault(const llvm::Triple &Triple) {
4071f95e6567faab67f4363d650f73121359c4bdbabDaniel Dunbar  switch (Triple.getArch()) {
4081f95e6567faab67f4363d650f73121359c4bdbabDaniel Dunbar  default:
4091f95e6567faab67f4363d650f73121359c4bdbabDaniel Dunbar    return true;
4101f95e6567faab67f4363d650f73121359c4bdbabDaniel Dunbar
4111f95e6567faab67f4363d650f73121359c4bdbabDaniel Dunbar  case llvm::Triple::ppc:
4121f95e6567faab67f4363d650f73121359c4bdbabDaniel Dunbar  case llvm::Triple::ppc64:
4131f95e6567faab67f4363d650f73121359c4bdbabDaniel Dunbar    if (Triple.getOS() == llvm::Triple::Darwin)
4141f95e6567faab67f4363d650f73121359c4bdbabDaniel Dunbar      return true;
4151f95e6567faab67f4363d650f73121359c4bdbabDaniel Dunbar    return false;
4161f95e6567faab67f4363d650f73121359c4bdbabDaniel Dunbar
4171f95e6567faab67f4363d650f73121359c4bdbabDaniel Dunbar  case llvm::Triple::systemz:
4181f95e6567faab67f4363d650f73121359c4bdbabDaniel Dunbar    return false;
4191f95e6567faab67f4363d650f73121359c4bdbabDaniel Dunbar  }
4201f95e6567faab67f4363d650f73121359c4bdbabDaniel Dunbar}
4211f95e6567faab67f4363d650f73121359c4bdbabDaniel Dunbar
422b163ef7e7a5d904ef0962a7c38c460be083c4d63Daniel Dunbarvoid Clang::AddARMTargetArgs(const ArgList &Args,
423b163ef7e7a5d904ef0962a7c38c460be083c4d63Daniel Dunbar                             ArgStringList &CmdArgs) const {
424ee788e70fcd0adf76103b17c78ac658d4ea30c9bDaniel Dunbar  const Driver &D = getToolChain().getDriver();
425bcd6df662471e0ac2d3d85fdba09b1295c2fc468Rafael Espindola  llvm::Triple Triple = getToolChain().getTriple();
426cbd1933f83e2332b2d7add10459f80cc4e7eb7bfDaniel Dunbar
4272030d8f46b4226fa99e59389e3ca856a79c27e9aDaniel Dunbar  // Select the ABI to use.
4282030d8f46b4226fa99e59389e3ca856a79c27e9aDaniel Dunbar  //
4292030d8f46b4226fa99e59389e3ca856a79c27e9aDaniel Dunbar  // FIXME: Support -meabi.
4302030d8f46b4226fa99e59389e3ca856a79c27e9aDaniel Dunbar  const char *ABIName = 0;
4312030d8f46b4226fa99e59389e3ca856a79c27e9aDaniel Dunbar  if (Arg *A = Args.getLastArg(options::OPT_mabi_EQ)) {
4322030d8f46b4226fa99e59389e3ca856a79c27e9aDaniel Dunbar    ABIName = A->getValue(Args);
4332030d8f46b4226fa99e59389e3ca856a79c27e9aDaniel Dunbar  } else {
4342030d8f46b4226fa99e59389e3ca856a79c27e9aDaniel Dunbar    // Select the default based on the platform.
435fc2bd7c3efed6756a030d58a5f6ae31947e7d451Bob Wilson    switch(Triple.getEnvironment()) {
436fc2bd7c3efed6756a030d58a5f6ae31947e7d451Bob Wilson    case llvm::Triple::GNUEABI:
4371ed1a594e9befc91ebf00d81b41a2fdfab862657Rafael Espindola      ABIName = "aapcs-linux";
438fc2bd7c3efed6756a030d58a5f6ae31947e7d451Bob Wilson      break;
439fc2bd7c3efed6756a030d58a5f6ae31947e7d451Bob Wilson    case llvm::Triple::EABI:
4402030d8f46b4226fa99e59389e3ca856a79c27e9aDaniel Dunbar      ABIName = "aapcs";
441fc2bd7c3efed6756a030d58a5f6ae31947e7d451Bob Wilson      break;
442fc2bd7c3efed6756a030d58a5f6ae31947e7d451Bob Wilson    default:
4432030d8f46b4226fa99e59389e3ca856a79c27e9aDaniel Dunbar      ABIName = "apcs-gnu";
444fc2bd7c3efed6756a030d58a5f6ae31947e7d451Bob Wilson    }
4452030d8f46b4226fa99e59389e3ca856a79c27e9aDaniel Dunbar  }
4462030d8f46b4226fa99e59389e3ca856a79c27e9aDaniel Dunbar  CmdArgs.push_back("-target-abi");
4472030d8f46b4226fa99e59389e3ca856a79c27e9aDaniel Dunbar  CmdArgs.push_back(ABIName);
4482030d8f46b4226fa99e59389e3ca856a79c27e9aDaniel Dunbar
449b163ef7e7a5d904ef0962a7c38c460be083c4d63Daniel Dunbar  // Set the CPU based on -march= and -mcpu=.
45038b48afd338d494099697d2611e1f45e558e469eDaniel Dunbar  CmdArgs.push_back("-target-cpu");
451bcd6df662471e0ac2d3d85fdba09b1295c2fc468Rafael Espindola  CmdArgs.push_back(getARMTargetCPU(Args, Triple));
452b163ef7e7a5d904ef0962a7c38c460be083c4d63Daniel Dunbar
453cbd1933f83e2332b2d7add10459f80cc4e7eb7bfDaniel Dunbar  // Select the float ABI as determined by -msoft-float, -mhard-float, and
454cbd1933f83e2332b2d7add10459f80cc4e7eb7bfDaniel Dunbar  // -mfloat-abi=.
455cbd1933f83e2332b2d7add10459f80cc4e7eb7bfDaniel Dunbar  llvm::StringRef FloatABI;
456cbd1933f83e2332b2d7add10459f80cc4e7eb7bfDaniel Dunbar  if (Arg *A = Args.getLastArg(options::OPT_msoft_float,
457cbd1933f83e2332b2d7add10459f80cc4e7eb7bfDaniel Dunbar                               options::OPT_mhard_float,
458cbd1933f83e2332b2d7add10459f80cc4e7eb7bfDaniel Dunbar                               options::OPT_mfloat_abi_EQ)) {
459cbd1933f83e2332b2d7add10459f80cc4e7eb7bfDaniel Dunbar    if (A->getOption().matches(options::OPT_msoft_float))
460cbd1933f83e2332b2d7add10459f80cc4e7eb7bfDaniel Dunbar      FloatABI = "soft";
461cbd1933f83e2332b2d7add10459f80cc4e7eb7bfDaniel Dunbar    else if (A->getOption().matches(options::OPT_mhard_float))
462cbd1933f83e2332b2d7add10459f80cc4e7eb7bfDaniel Dunbar      FloatABI = "hard";
463cbd1933f83e2332b2d7add10459f80cc4e7eb7bfDaniel Dunbar    else {
464cbd1933f83e2332b2d7add10459f80cc4e7eb7bfDaniel Dunbar      FloatABI = A->getValue(Args);
465cbd1933f83e2332b2d7add10459f80cc4e7eb7bfDaniel Dunbar      if (FloatABI != "soft" && FloatABI != "softfp" && FloatABI != "hard") {
466cbd1933f83e2332b2d7add10459f80cc4e7eb7bfDaniel Dunbar        D.Diag(clang::diag::err_drv_invalid_mfloat_abi)
467cbd1933f83e2332b2d7add10459f80cc4e7eb7bfDaniel Dunbar          << A->getAsString(Args);
468cbd1933f83e2332b2d7add10459f80cc4e7eb7bfDaniel Dunbar        FloatABI = "soft";
469cbd1933f83e2332b2d7add10459f80cc4e7eb7bfDaniel Dunbar      }
470cbd1933f83e2332b2d7add10459f80cc4e7eb7bfDaniel Dunbar    }
471cbd1933f83e2332b2d7add10459f80cc4e7eb7bfDaniel Dunbar  }
472cbd1933f83e2332b2d7add10459f80cc4e7eb7bfDaniel Dunbar
473cbd1933f83e2332b2d7add10459f80cc4e7eb7bfDaniel Dunbar  // If unspecified, choose the default based on the platform.
474cbd1933f83e2332b2d7add10459f80cc4e7eb7bfDaniel Dunbar  if (FloatABI.empty()) {
475bcd6df662471e0ac2d3d85fdba09b1295c2fc468Rafael Espindola    const llvm::Triple &Triple = getToolChain().getTriple();
476bcd6df662471e0ac2d3d85fdba09b1295c2fc468Rafael Espindola    switch (Triple.getOS()) {
477cbd1933f83e2332b2d7add10459f80cc4e7eb7bfDaniel Dunbar    case llvm::Triple::Darwin: {
478cbd1933f83e2332b2d7add10459f80cc4e7eb7bfDaniel Dunbar      // Darwin defaults to "softfp" for v6 and v7.
479cbd1933f83e2332b2d7add10459f80cc4e7eb7bfDaniel Dunbar      //
480cbd1933f83e2332b2d7add10459f80cc4e7eb7bfDaniel Dunbar      // FIXME: Factor out an ARM class so we can cache the arch somewhere.
481bcd6df662471e0ac2d3d85fdba09b1295c2fc468Rafael Espindola      llvm::StringRef ArchName =
482bcd6df662471e0ac2d3d85fdba09b1295c2fc468Rafael Espindola        getLLVMArchSuffixForARM(getARMTargetCPU(Args, Triple));
483cbd1933f83e2332b2d7add10459f80cc4e7eb7bfDaniel Dunbar      if (ArchName.startswith("v6") || ArchName.startswith("v7"))
484cbd1933f83e2332b2d7add10459f80cc4e7eb7bfDaniel Dunbar        FloatABI = "softfp";
485cbd1933f83e2332b2d7add10459f80cc4e7eb7bfDaniel Dunbar      else
486cbd1933f83e2332b2d7add10459f80cc4e7eb7bfDaniel Dunbar        FloatABI = "soft";
487cbd1933f83e2332b2d7add10459f80cc4e7eb7bfDaniel Dunbar      break;
488cbd1933f83e2332b2d7add10459f80cc4e7eb7bfDaniel Dunbar    }
489cbd1933f83e2332b2d7add10459f80cc4e7eb7bfDaniel Dunbar
4907e9cebfe1246bb9051a364474b6570eb40dbac4bRafael Espindola    case llvm::Triple::Linux: {
491fc2bd7c3efed6756a030d58a5f6ae31947e7d451Bob Wilson      if (getToolChain().getTriple().getEnvironment() == llvm::Triple::GNUEABI) {
4927e9cebfe1246bb9051a364474b6570eb40dbac4bRafael Espindola        FloatABI = "softfp";
4937e9cebfe1246bb9051a364474b6570eb40dbac4bRafael Espindola        break;
4947e9cebfe1246bb9051a364474b6570eb40dbac4bRafael Espindola      }
4957e9cebfe1246bb9051a364474b6570eb40dbac4bRafael Espindola    }
4967e9cebfe1246bb9051a364474b6570eb40dbac4bRafael Espindola    // fall through
4977e9cebfe1246bb9051a364474b6570eb40dbac4bRafael Espindola
498cbd1933f83e2332b2d7add10459f80cc4e7eb7bfDaniel Dunbar    default:
499fc2bd7c3efed6756a030d58a5f6ae31947e7d451Bob Wilson      switch(Triple.getEnvironment()) {
500fc2bd7c3efed6756a030d58a5f6ae31947e7d451Bob Wilson      case llvm::Triple::GNUEABI:
501fc2bd7c3efed6756a030d58a5f6ae31947e7d451Bob Wilson        FloatABI = "softfp";
502fc2bd7c3efed6756a030d58a5f6ae31947e7d451Bob Wilson        break;
503fc2bd7c3efed6756a030d58a5f6ae31947e7d451Bob Wilson      case llvm::Triple::EABI:
504fc2bd7c3efed6756a030d58a5f6ae31947e7d451Bob Wilson        // EABI is always AAPCS, and if it was not marked 'hard', it's softfp
505fc2bd7c3efed6756a030d58a5f6ae31947e7d451Bob Wilson        FloatABI = "softfp";
506fc2bd7c3efed6756a030d58a5f6ae31947e7d451Bob Wilson        break;
507fc2bd7c3efed6756a030d58a5f6ae31947e7d451Bob Wilson      default:
508fc2bd7c3efed6756a030d58a5f6ae31947e7d451Bob Wilson        // Assume "soft", but warn the user we are guessing.
509fc2bd7c3efed6756a030d58a5f6ae31947e7d451Bob Wilson        FloatABI = "soft";
510fc2bd7c3efed6756a030d58a5f6ae31947e7d451Bob Wilson        D.Diag(clang::diag::warn_drv_assuming_mfloat_abi_is) << "soft";
511fc2bd7c3efed6756a030d58a5f6ae31947e7d451Bob Wilson        break;
512fc2bd7c3efed6756a030d58a5f6ae31947e7d451Bob Wilson      }
513cbd1933f83e2332b2d7add10459f80cc4e7eb7bfDaniel Dunbar    }
514cbd1933f83e2332b2d7add10459f80cc4e7eb7bfDaniel Dunbar  }
515cbd1933f83e2332b2d7add10459f80cc4e7eb7bfDaniel Dunbar
516cbd1933f83e2332b2d7add10459f80cc4e7eb7bfDaniel Dunbar  if (FloatABI == "soft") {
517cbd1933f83e2332b2d7add10459f80cc4e7eb7bfDaniel Dunbar    // Floating point operations and argument passing are soft.
518cbd1933f83e2332b2d7add10459f80cc4e7eb7bfDaniel Dunbar    //
519cbd1933f83e2332b2d7add10459f80cc4e7eb7bfDaniel Dunbar    // FIXME: This changes CPP defines, we need -target-soft-float.
5203b315264d1a6fa303e20fe0caec306ccafc090deDaniel Dunbar    CmdArgs.push_back("-msoft-float");
52187667aafe68c366be57f5afb60428237593da0edDaniel Dunbar    CmdArgs.push_back("-mfloat-abi");
52287667aafe68c366be57f5afb60428237593da0edDaniel Dunbar    CmdArgs.push_back("soft");
523cbd1933f83e2332b2d7add10459f80cc4e7eb7bfDaniel Dunbar  } else if (FloatABI == "softfp") {
524cbd1933f83e2332b2d7add10459f80cc4e7eb7bfDaniel Dunbar    // Floating point operations are hard, but argument passing is soft.
52587667aafe68c366be57f5afb60428237593da0edDaniel Dunbar    CmdArgs.push_back("-mfloat-abi");
52687667aafe68c366be57f5afb60428237593da0edDaniel Dunbar    CmdArgs.push_back("soft");
527cbd1933f83e2332b2d7add10459f80cc4e7eb7bfDaniel Dunbar  } else {
528cbd1933f83e2332b2d7add10459f80cc4e7eb7bfDaniel Dunbar    // Floating point operations and argument passing are hard.
529cbd1933f83e2332b2d7add10459f80cc4e7eb7bfDaniel Dunbar    assert(FloatABI == "hard" && "Invalid float abi!");
53087667aafe68c366be57f5afb60428237593da0edDaniel Dunbar    CmdArgs.push_back("-mfloat-abi");
53187667aafe68c366be57f5afb60428237593da0edDaniel Dunbar    CmdArgs.push_back("hard");
532cbd1933f83e2332b2d7add10459f80cc4e7eb7bfDaniel Dunbar  }
53397f52ac45369f6925b548404e61d511034c874ecDaniel Dunbar
53497f52ac45369f6925b548404e61d511034c874ecDaniel Dunbar  // Set appropriate target features for floating point mode.
53597f52ac45369f6925b548404e61d511034c874ecDaniel Dunbar  //
53697f52ac45369f6925b548404e61d511034c874ecDaniel Dunbar  // FIXME: Note, this is a hack, the LLVM backend doesn't actually use these
53797f52ac45369f6925b548404e61d511034c874ecDaniel Dunbar  // yet (it uses the -mfloat-abi and -msoft-float options above), and it is
53897f52ac45369f6925b548404e61d511034c874ecDaniel Dunbar  // stripped out by the ARM target.
53997f52ac45369f6925b548404e61d511034c874ecDaniel Dunbar
54097f52ac45369f6925b548404e61d511034c874ecDaniel Dunbar  // Use software floating point operations?
54197f52ac45369f6925b548404e61d511034c874ecDaniel Dunbar  if (FloatABI == "soft") {
54297f52ac45369f6925b548404e61d511034c874ecDaniel Dunbar    CmdArgs.push_back("-target-feature");
54397f52ac45369f6925b548404e61d511034c874ecDaniel Dunbar    CmdArgs.push_back("+soft-float");
54497f52ac45369f6925b548404e61d511034c874ecDaniel Dunbar  }
54597f52ac45369f6925b548404e61d511034c874ecDaniel Dunbar
54697f52ac45369f6925b548404e61d511034c874ecDaniel Dunbar  // Use software floating point argument passing?
54797f52ac45369f6925b548404e61d511034c874ecDaniel Dunbar  if (FloatABI != "hard") {
54897f52ac45369f6925b548404e61d511034c874ecDaniel Dunbar    CmdArgs.push_back("-target-feature");
54997f52ac45369f6925b548404e61d511034c874ecDaniel Dunbar    CmdArgs.push_back("+soft-float-abi");
55097f52ac45369f6925b548404e61d511034c874ecDaniel Dunbar  }
551a91320b8af7143f7af4c0665ffa62a3b244c0bd9Daniel Dunbar
552a91320b8af7143f7af4c0665ffa62a3b244c0bd9Daniel Dunbar  // Honor -mfpu=.
553a91320b8af7143f7af4c0665ffa62a3b244c0bd9Daniel Dunbar  //
554a91320b8af7143f7af4c0665ffa62a3b244c0bd9Daniel Dunbar  // FIXME: Centralize feature selection, defaulting shouldn't be also in the
555a91320b8af7143f7af4c0665ffa62a3b244c0bd9Daniel Dunbar  // frontend target.
556a91320b8af7143f7af4c0665ffa62a3b244c0bd9Daniel Dunbar  if (const Arg *A = Args.getLastArg(options::OPT_mfpu_EQ)) {
557a91320b8af7143f7af4c0665ffa62a3b244c0bd9Daniel Dunbar    llvm::StringRef FPU = A->getValue(Args);
558a91320b8af7143f7af4c0665ffa62a3b244c0bd9Daniel Dunbar
559a91320b8af7143f7af4c0665ffa62a3b244c0bd9Daniel Dunbar    // Set the target features based on the FPU.
560a91320b8af7143f7af4c0665ffa62a3b244c0bd9Daniel Dunbar    if (FPU == "fpa" || FPU == "fpe2" || FPU == "fpe3" || FPU == "maverick") {
561a91320b8af7143f7af4c0665ffa62a3b244c0bd9Daniel Dunbar      // Disable any default FPU support.
562a91320b8af7143f7af4c0665ffa62a3b244c0bd9Daniel Dunbar      CmdArgs.push_back("-target-feature");
563a91320b8af7143f7af4c0665ffa62a3b244c0bd9Daniel Dunbar      CmdArgs.push_back("-vfp2");
564a91320b8af7143f7af4c0665ffa62a3b244c0bd9Daniel Dunbar      CmdArgs.push_back("-target-feature");
565a91320b8af7143f7af4c0665ffa62a3b244c0bd9Daniel Dunbar      CmdArgs.push_back("-vfp3");
566a91320b8af7143f7af4c0665ffa62a3b244c0bd9Daniel Dunbar      CmdArgs.push_back("-target-feature");
567a91320b8af7143f7af4c0665ffa62a3b244c0bd9Daniel Dunbar      CmdArgs.push_back("-neon");
568a91320b8af7143f7af4c0665ffa62a3b244c0bd9Daniel Dunbar    } else if (FPU == "vfp") {
569a91320b8af7143f7af4c0665ffa62a3b244c0bd9Daniel Dunbar      CmdArgs.push_back("-target-feature");
570a91320b8af7143f7af4c0665ffa62a3b244c0bd9Daniel Dunbar      CmdArgs.push_back("+vfp2");
571a91320b8af7143f7af4c0665ffa62a3b244c0bd9Daniel Dunbar    } else if (FPU == "vfp3") {
572a91320b8af7143f7af4c0665ffa62a3b244c0bd9Daniel Dunbar      CmdArgs.push_back("-target-feature");
573a91320b8af7143f7af4c0665ffa62a3b244c0bd9Daniel Dunbar      CmdArgs.push_back("+vfp3");
574a91320b8af7143f7af4c0665ffa62a3b244c0bd9Daniel Dunbar    } else if (FPU == "neon") {
575a91320b8af7143f7af4c0665ffa62a3b244c0bd9Daniel Dunbar      CmdArgs.push_back("-target-feature");
576a91320b8af7143f7af4c0665ffa62a3b244c0bd9Daniel Dunbar      CmdArgs.push_back("+neon");
577a91320b8af7143f7af4c0665ffa62a3b244c0bd9Daniel Dunbar    } else
578a91320b8af7143f7af4c0665ffa62a3b244c0bd9Daniel Dunbar      D.Diag(clang::diag::err_drv_clang_unsupported) << A->getAsString(Args);
579a91320b8af7143f7af4c0665ffa62a3b244c0bd9Daniel Dunbar  }
580b163ef7e7a5d904ef0962a7c38c460be083c4d63Daniel Dunbar}
581b163ef7e7a5d904ef0962a7c38c460be083c4d63Daniel Dunbar
582ed734737d5af31906e30e537d4a41c760ddcfc59Eric Christophervoid Clang::AddMIPSTargetArgs(const ArgList &Args,
583ed734737d5af31906e30e537d4a41c760ddcfc59Eric Christopher                             ArgStringList &CmdArgs) const {
584ed734737d5af31906e30e537d4a41c760ddcfc59Eric Christopher  const Driver &D = getToolChain().getDriver();
585ed734737d5af31906e30e537d4a41c760ddcfc59Eric Christopher
586ed734737d5af31906e30e537d4a41c760ddcfc59Eric Christopher  // Select the ABI to use.
587ed734737d5af31906e30e537d4a41c760ddcfc59Eric Christopher  const char *ABIName = 0;
588ed734737d5af31906e30e537d4a41c760ddcfc59Eric Christopher  if (Arg *A = Args.getLastArg(options::OPT_mabi_EQ)) {
589ed734737d5af31906e30e537d4a41c760ddcfc59Eric Christopher    ABIName = A->getValue(Args);
590ed734737d5af31906e30e537d4a41c760ddcfc59Eric Christopher  } else {
591ed734737d5af31906e30e537d4a41c760ddcfc59Eric Christopher    ABIName = "o32";
592ed734737d5af31906e30e537d4a41c760ddcfc59Eric Christopher  }
593ed734737d5af31906e30e537d4a41c760ddcfc59Eric Christopher
594ed734737d5af31906e30e537d4a41c760ddcfc59Eric Christopher  CmdArgs.push_back("-target-abi");
595ed734737d5af31906e30e537d4a41c760ddcfc59Eric Christopher  CmdArgs.push_back(ABIName);
596ed734737d5af31906e30e537d4a41c760ddcfc59Eric Christopher
597ed734737d5af31906e30e537d4a41c760ddcfc59Eric Christopher  if (const Arg *A = Args.getLastArg(options::OPT_march_EQ)) {
598ed734737d5af31906e30e537d4a41c760ddcfc59Eric Christopher    llvm::StringRef MArch = A->getValue(Args);
599ed734737d5af31906e30e537d4a41c760ddcfc59Eric Christopher    CmdArgs.push_back("-target-cpu");
600ed734737d5af31906e30e537d4a41c760ddcfc59Eric Christopher
601ed734737d5af31906e30e537d4a41c760ddcfc59Eric Christopher    if ((MArch == "r2000") || (MArch == "r3000"))
602ed734737d5af31906e30e537d4a41c760ddcfc59Eric Christopher      CmdArgs.push_back("mips1");
603ed734737d5af31906e30e537d4a41c760ddcfc59Eric Christopher    else if (MArch == "r6000")
604ed734737d5af31906e30e537d4a41c760ddcfc59Eric Christopher      CmdArgs.push_back("mips2");
605ed734737d5af31906e30e537d4a41c760ddcfc59Eric Christopher    else
606ed734737d5af31906e30e537d4a41c760ddcfc59Eric Christopher      CmdArgs.push_back(MArch.str().c_str());
607ed734737d5af31906e30e537d4a41c760ddcfc59Eric Christopher  }
608ed734737d5af31906e30e537d4a41c760ddcfc59Eric Christopher
609ed734737d5af31906e30e537d4a41c760ddcfc59Eric Christopher  // Select the float ABI as determined by -msoft-float, -mhard-float, and
610ed734737d5af31906e30e537d4a41c760ddcfc59Eric Christopher  llvm::StringRef FloatABI;
611ed734737d5af31906e30e537d4a41c760ddcfc59Eric Christopher  if (Arg *A = Args.getLastArg(options::OPT_msoft_float,
612ed734737d5af31906e30e537d4a41c760ddcfc59Eric Christopher                               options::OPT_mhard_float)) {
613ed734737d5af31906e30e537d4a41c760ddcfc59Eric Christopher    if (A->getOption().matches(options::OPT_msoft_float))
614ed734737d5af31906e30e537d4a41c760ddcfc59Eric Christopher      FloatABI = "soft";
615ed734737d5af31906e30e537d4a41c760ddcfc59Eric Christopher    else if (A->getOption().matches(options::OPT_mhard_float))
616ed734737d5af31906e30e537d4a41c760ddcfc59Eric Christopher      FloatABI = "hard";
617ed734737d5af31906e30e537d4a41c760ddcfc59Eric Christopher  }
618ed734737d5af31906e30e537d4a41c760ddcfc59Eric Christopher
619ed734737d5af31906e30e537d4a41c760ddcfc59Eric Christopher  // If unspecified, choose the default based on the platform.
620ed734737d5af31906e30e537d4a41c760ddcfc59Eric Christopher  if (FloatABI.empty()) {
62171c972acd4a2cb5e369e35471dbb719185913cdcBenjamin Kramer    // Assume "soft", but warn the user we are guessing.
62271c972acd4a2cb5e369e35471dbb719185913cdcBenjamin Kramer    FloatABI = "soft";
62371c972acd4a2cb5e369e35471dbb719185913cdcBenjamin Kramer    D.Diag(clang::diag::warn_drv_assuming_mfloat_abi_is) << "soft";
624ed734737d5af31906e30e537d4a41c760ddcfc59Eric Christopher  }
625ed734737d5af31906e30e537d4a41c760ddcfc59Eric Christopher
626ed734737d5af31906e30e537d4a41c760ddcfc59Eric Christopher  if (FloatABI == "soft") {
627ed734737d5af31906e30e537d4a41c760ddcfc59Eric Christopher    // Floating point operations and argument passing are soft.
628ed734737d5af31906e30e537d4a41c760ddcfc59Eric Christopher    //
629ed734737d5af31906e30e537d4a41c760ddcfc59Eric Christopher    // FIXME: This changes CPP defines, we need -target-soft-float.
630ed734737d5af31906e30e537d4a41c760ddcfc59Eric Christopher    CmdArgs.push_back("-msoft-float");
631ed734737d5af31906e30e537d4a41c760ddcfc59Eric Christopher  } else {
632ed734737d5af31906e30e537d4a41c760ddcfc59Eric Christopher    assert(FloatABI == "hard" && "Invalid float abi!");
633ed734737d5af31906e30e537d4a41c760ddcfc59Eric Christopher    CmdArgs.push_back("-mhard-float");
634ed734737d5af31906e30e537d4a41c760ddcfc59Eric Christopher  }
635ed734737d5af31906e30e537d4a41c760ddcfc59Eric Christopher}
636ed734737d5af31906e30e537d4a41c760ddcfc59Eric Christopher
6379284d215022457ba867080a713f08f026d89ea17Bruno Cardoso Lopesvoid Clang::AddSparcTargetArgs(const ArgList &Args,
6389284d215022457ba867080a713f08f026d89ea17Bruno Cardoso Lopes                             ArgStringList &CmdArgs) const {
6399284d215022457ba867080a713f08f026d89ea17Bruno Cardoso Lopes  const Driver &D = getToolChain().getDriver();
6409284d215022457ba867080a713f08f026d89ea17Bruno Cardoso Lopes
6419284d215022457ba867080a713f08f026d89ea17Bruno Cardoso Lopes  if (const Arg *A = Args.getLastArg(options::OPT_march_EQ)) {
6429284d215022457ba867080a713f08f026d89ea17Bruno Cardoso Lopes    llvm::StringRef MArch = A->getValue(Args);
6439284d215022457ba867080a713f08f026d89ea17Bruno Cardoso Lopes    CmdArgs.push_back("-target-cpu");
6449284d215022457ba867080a713f08f026d89ea17Bruno Cardoso Lopes    CmdArgs.push_back(MArch.str().c_str());
6459284d215022457ba867080a713f08f026d89ea17Bruno Cardoso Lopes  }
6469284d215022457ba867080a713f08f026d89ea17Bruno Cardoso Lopes
6479284d215022457ba867080a713f08f026d89ea17Bruno Cardoso Lopes  // Select the float ABI as determined by -msoft-float, -mhard-float, and
6489284d215022457ba867080a713f08f026d89ea17Bruno Cardoso Lopes  llvm::StringRef FloatABI;
6499284d215022457ba867080a713f08f026d89ea17Bruno Cardoso Lopes  if (Arg *A = Args.getLastArg(options::OPT_msoft_float,
6509284d215022457ba867080a713f08f026d89ea17Bruno Cardoso Lopes                               options::OPT_mhard_float)) {
6519284d215022457ba867080a713f08f026d89ea17Bruno Cardoso Lopes    if (A->getOption().matches(options::OPT_msoft_float))
6529284d215022457ba867080a713f08f026d89ea17Bruno Cardoso Lopes      FloatABI = "soft";
6539284d215022457ba867080a713f08f026d89ea17Bruno Cardoso Lopes    else if (A->getOption().matches(options::OPT_mhard_float))
6549284d215022457ba867080a713f08f026d89ea17Bruno Cardoso Lopes      FloatABI = "hard";
6559284d215022457ba867080a713f08f026d89ea17Bruno Cardoso Lopes  }
6569284d215022457ba867080a713f08f026d89ea17Bruno Cardoso Lopes
6579284d215022457ba867080a713f08f026d89ea17Bruno Cardoso Lopes  // If unspecified, choose the default based on the platform.
6589284d215022457ba867080a713f08f026d89ea17Bruno Cardoso Lopes  if (FloatABI.empty()) {
6599284d215022457ba867080a713f08f026d89ea17Bruno Cardoso Lopes    switch (getToolChain().getTriple().getOS()) {
6609284d215022457ba867080a713f08f026d89ea17Bruno Cardoso Lopes    default:
6619284d215022457ba867080a713f08f026d89ea17Bruno Cardoso Lopes      // Assume "soft", but warn the user we are guessing.
6629284d215022457ba867080a713f08f026d89ea17Bruno Cardoso Lopes      FloatABI = "soft";
6639284d215022457ba867080a713f08f026d89ea17Bruno Cardoso Lopes      D.Diag(clang::diag::warn_drv_assuming_mfloat_abi_is) << "soft";
6649284d215022457ba867080a713f08f026d89ea17Bruno Cardoso Lopes      break;
6659284d215022457ba867080a713f08f026d89ea17Bruno Cardoso Lopes    }
6669284d215022457ba867080a713f08f026d89ea17Bruno Cardoso Lopes  }
6679284d215022457ba867080a713f08f026d89ea17Bruno Cardoso Lopes
6689284d215022457ba867080a713f08f026d89ea17Bruno Cardoso Lopes  if (FloatABI == "soft") {
6699284d215022457ba867080a713f08f026d89ea17Bruno Cardoso Lopes    // Floating point operations and argument passing are soft.
6709284d215022457ba867080a713f08f026d89ea17Bruno Cardoso Lopes    //
6719284d215022457ba867080a713f08f026d89ea17Bruno Cardoso Lopes    // FIXME: This changes CPP defines, we need -target-soft-float.
6729284d215022457ba867080a713f08f026d89ea17Bruno Cardoso Lopes    CmdArgs.push_back("-msoft-float");
6739284d215022457ba867080a713f08f026d89ea17Bruno Cardoso Lopes    CmdArgs.push_back("soft");
6749284d215022457ba867080a713f08f026d89ea17Bruno Cardoso Lopes    CmdArgs.push_back("-target-feature");
6759284d215022457ba867080a713f08f026d89ea17Bruno Cardoso Lopes    CmdArgs.push_back("+soft-float");
6769284d215022457ba867080a713f08f026d89ea17Bruno Cardoso Lopes  } else {
6779284d215022457ba867080a713f08f026d89ea17Bruno Cardoso Lopes    assert(FloatABI == "hard" && "Invalid float abi!");
6789284d215022457ba867080a713f08f026d89ea17Bruno Cardoso Lopes    CmdArgs.push_back("-mhard-float");
6799284d215022457ba867080a713f08f026d89ea17Bruno Cardoso Lopes  }
6809284d215022457ba867080a713f08f026d89ea17Bruno Cardoso Lopes}
6819284d215022457ba867080a713f08f026d89ea17Bruno Cardoso Lopes
6826acda16e9c194dcbd0dea64341e182bdb65d0f41Daniel Dunbarvoid Clang::AddX86TargetArgs(const ArgList &Args,
6836acda16e9c194dcbd0dea64341e182bdb65d0f41Daniel Dunbar                             ArgStringList &CmdArgs) const {
684e6ad3f9fceef0ecc422ff26754ea069a5fd18c69Daniel Dunbar  if (!Args.hasFlag(options::OPT_mred_zone,
685e6ad3f9fceef0ecc422ff26754ea069a5fd18c69Daniel Dunbar                    options::OPT_mno_red_zone,
686e6ad3f9fceef0ecc422ff26754ea069a5fd18c69Daniel Dunbar                    true) ||
687e6ad3f9fceef0ecc422ff26754ea069a5fd18c69Daniel Dunbar      Args.hasArg(options::OPT_mkernel) ||
688e6ad3f9fceef0ecc422ff26754ea069a5fd18c69Daniel Dunbar      Args.hasArg(options::OPT_fapple_kext))
68966861e09d590994a8b941eaa328e4d8f33adec9eDaniel Dunbar    CmdArgs.push_back("-disable-red-zone");
690e6ad3f9fceef0ecc422ff26754ea069a5fd18c69Daniel Dunbar
691e6ad3f9fceef0ecc422ff26754ea069a5fd18c69Daniel Dunbar  if (Args.hasFlag(options::OPT_msoft_float,
692e6ad3f9fceef0ecc422ff26754ea069a5fd18c69Daniel Dunbar                   options::OPT_mno_soft_float,
693e6ad3f9fceef0ecc422ff26754ea069a5fd18c69Daniel Dunbar                   false))
69466861e09d590994a8b941eaa328e4d8f33adec9eDaniel Dunbar    CmdArgs.push_back("-no-implicit-float");
695e6ad3f9fceef0ecc422ff26754ea069a5fd18c69Daniel Dunbar
696f86feddbd5b13d2c144132e35d608fa630784dbbDaniel Dunbar  const char *CPUName = 0;
6976acda16e9c194dcbd0dea64341e182bdb65d0f41Daniel Dunbar  if (const Arg *A = Args.getLastArg(options::OPT_march_EQ)) {
698f86feddbd5b13d2c144132e35d608fa630784dbbDaniel Dunbar    if (llvm::StringRef(A->getValue(Args)) == "native") {
699f86feddbd5b13d2c144132e35d608fa630784dbbDaniel Dunbar      // FIXME: Reject attempts to use -march=native unless the target matches
700f86feddbd5b13d2c144132e35d608fa630784dbbDaniel Dunbar      // the host.
701f86feddbd5b13d2c144132e35d608fa630784dbbDaniel Dunbar      //
702f86feddbd5b13d2c144132e35d608fa630784dbbDaniel Dunbar      // FIXME: We should also incorporate the detected target features for use
703f86feddbd5b13d2c144132e35d608fa630784dbbDaniel Dunbar      // with -native.
704f86feddbd5b13d2c144132e35d608fa630784dbbDaniel Dunbar      std::string CPU = llvm::sys::getHostCPUName();
705f86feddbd5b13d2c144132e35d608fa630784dbbDaniel Dunbar      if (!CPU.empty())
706f86feddbd5b13d2c144132e35d608fa630784dbbDaniel Dunbar        CPUName = Args.MakeArgString(CPU);
707f86feddbd5b13d2c144132e35d608fa630784dbbDaniel Dunbar    } else
708f86feddbd5b13d2c144132e35d608fa630784dbbDaniel Dunbar      CPUName = A->getValue(Args);
709f86feddbd5b13d2c144132e35d608fa630784dbbDaniel Dunbar  }
7106acda16e9c194dcbd0dea64341e182bdb65d0f41Daniel Dunbar
711f86feddbd5b13d2c144132e35d608fa630784dbbDaniel Dunbar  // Select the default CPU if none was given (or detection failed).
712f86feddbd5b13d2c144132e35d608fa630784dbbDaniel Dunbar  if (!CPUName) {
7136acda16e9c194dcbd0dea64341e182bdb65d0f41Daniel Dunbar    // FIXME: Need target hooks.
714f22d1fd96d6056a2f271b0f7353b31f47547127bBenjamin Kramer    if (getToolChain().getOS().startswith("darwin")) {
7156acda16e9c194dcbd0dea64341e182bdb65d0f41Daniel Dunbar      if (getToolChain().getArchName() == "x86_64")
716f86feddbd5b13d2c144132e35d608fa630784dbbDaniel Dunbar        CPUName = "core2";
7176acda16e9c194dcbd0dea64341e182bdb65d0f41Daniel Dunbar      else if (getToolChain().getArchName() == "i386")
718f86feddbd5b13d2c144132e35d608fa630784dbbDaniel Dunbar        CPUName = "yonah";
71986ed3a326342fa2a8c9d9b5d1d7280c9bad2b007Chris Lattner    } else if (getToolChain().getOS().startswith("haiku"))  {
72086ed3a326342fa2a8c9d9b5d1d7280c9bad2b007Chris Lattner      if (getToolChain().getArchName() == "x86_64")
72186ed3a326342fa2a8c9d9b5d1d7280c9bad2b007Chris Lattner        CPUName = "x86-64";
72286ed3a326342fa2a8c9d9b5d1d7280c9bad2b007Chris Lattner      else if (getToolChain().getArchName() == "i386")
72386ed3a326342fa2a8c9d9b5d1d7280c9bad2b007Chris Lattner        CPUName = "i586";
72495c0457054518102af6250e718a13a5b2ee5dbeaDaniel Dunbar    } else if (getToolChain().getOS().startswith("openbsd"))  {
72595c0457054518102af6250e718a13a5b2ee5dbeaDaniel Dunbar      if (getToolChain().getArchName() == "x86_64")
72695c0457054518102af6250e718a13a5b2ee5dbeaDaniel Dunbar        CPUName = "x86-64";
72795c0457054518102af6250e718a13a5b2ee5dbeaDaniel Dunbar      else if (getToolChain().getArchName() == "i386")
72895c0457054518102af6250e718a13a5b2ee5dbeaDaniel Dunbar        CPUName = "i486";
7298e50a96b387dca7525caa8a6add31420dd82a2cdBenjamin Kramer    } else if (getToolChain().getOS().startswith("netbsd"))  {
7308e50a96b387dca7525caa8a6add31420dd82a2cdBenjamin Kramer      if (getToolChain().getArchName() == "x86_64")
7318e50a96b387dca7525caa8a6add31420dd82a2cdBenjamin Kramer        CPUName = "x86-64";
7328e50a96b387dca7525caa8a6add31420dd82a2cdBenjamin Kramer      else if (getToolChain().getArchName() == "i386")
7338e50a96b387dca7525caa8a6add31420dd82a2cdBenjamin Kramer        CPUName = "i486";
7346acda16e9c194dcbd0dea64341e182bdb65d0f41Daniel Dunbar    } else {
7356acda16e9c194dcbd0dea64341e182bdb65d0f41Daniel Dunbar      if (getToolChain().getArchName() == "x86_64")
736f86feddbd5b13d2c144132e35d608fa630784dbbDaniel Dunbar        CPUName = "x86-64";
7376acda16e9c194dcbd0dea64341e182bdb65d0f41Daniel Dunbar      else if (getToolChain().getArchName() == "i386")
738f86feddbd5b13d2c144132e35d608fa630784dbbDaniel Dunbar        CPUName = "pentium4";
7396acda16e9c194dcbd0dea64341e182bdb65d0f41Daniel Dunbar    }
7406acda16e9c194dcbd0dea64341e182bdb65d0f41Daniel Dunbar  }
7416acda16e9c194dcbd0dea64341e182bdb65d0f41Daniel Dunbar
742f86feddbd5b13d2c144132e35d608fa630784dbbDaniel Dunbar  if (CPUName) {
74338b48afd338d494099697d2611e1f45e558e469eDaniel Dunbar    CmdArgs.push_back("-target-cpu");
744f86feddbd5b13d2c144132e35d608fa630784dbbDaniel Dunbar    CmdArgs.push_back(CPUName);
745f86feddbd5b13d2c144132e35d608fa630784dbbDaniel Dunbar  }
746f86feddbd5b13d2c144132e35d608fa630784dbbDaniel Dunbar
747cdd9686b890ebdc10039ae256ef4c9dfb5ebacb7Daniel Dunbar  for (arg_iterator it = Args.filtered_begin(options::OPT_m_x86_Features_Group),
748cdd9686b890ebdc10039ae256ef4c9dfb5ebacb7Daniel Dunbar         ie = Args.filtered_end(); it != ie; ++it) {
7497e4953e5c60409007545288f14b430bd23d68570Daniel Dunbar    llvm::StringRef Name = (*it)->getOption().getName();
7507e4953e5c60409007545288f14b430bd23d68570Daniel Dunbar    (*it)->claim();
7516acda16e9c194dcbd0dea64341e182bdb65d0f41Daniel Dunbar
752cdd9686b890ebdc10039ae256ef4c9dfb5ebacb7Daniel Dunbar    // Skip over "-m".
753cdd9686b890ebdc10039ae256ef4c9dfb5ebacb7Daniel Dunbar    assert(Name.startswith("-m") && "Invalid feature name.");
754cdd9686b890ebdc10039ae256ef4c9dfb5ebacb7Daniel Dunbar    Name = Name.substr(2);
7556acda16e9c194dcbd0dea64341e182bdb65d0f41Daniel Dunbar
756cdd9686b890ebdc10039ae256ef4c9dfb5ebacb7Daniel Dunbar    bool IsNegative = Name.startswith("no-");
757cdd9686b890ebdc10039ae256ef4c9dfb5ebacb7Daniel Dunbar    if (IsNegative)
758cdd9686b890ebdc10039ae256ef4c9dfb5ebacb7Daniel Dunbar      Name = Name.substr(3);
7596acda16e9c194dcbd0dea64341e182bdb65d0f41Daniel Dunbar
760cdd9686b890ebdc10039ae256ef4c9dfb5ebacb7Daniel Dunbar    CmdArgs.push_back("-target-feature");
761cdd9686b890ebdc10039ae256ef4c9dfb5ebacb7Daniel Dunbar    CmdArgs.push_back(Args.MakeArgString((IsNegative ? "-" : "+") + Name));
7626acda16e9c194dcbd0dea64341e182bdb65d0f41Daniel Dunbar  }
7636acda16e9c194dcbd0dea64341e182bdb65d0f41Daniel Dunbar}
7646acda16e9c194dcbd0dea64341e182bdb65d0f41Daniel Dunbar
765525544de0835d5ee7497f4897e255727b162e0aaAnders Carlssonstatic bool
766525544de0835d5ee7497f4897e255727b162e0aaAnders CarlssonshouldUseExceptionTablesForObjCExceptions(const ArgList &Args,
767525544de0835d5ee7497f4897e255727b162e0aaAnders Carlsson                                          const llvm::Triple &Triple) {
768525544de0835d5ee7497f4897e255727b162e0aaAnders Carlsson  // We use the zero-cost exception tables for Objective-C if the non-fragile
769525544de0835d5ee7497f4897e255727b162e0aaAnders Carlsson  // ABI is enabled or when compiling for x86_64 and ARM on Snow Leopard and
770525544de0835d5ee7497f4897e255727b162e0aaAnders Carlsson  // later.
771525544de0835d5ee7497f4897e255727b162e0aaAnders Carlsson
772525544de0835d5ee7497f4897e255727b162e0aaAnders Carlsson  if (Args.hasArg(options::OPT_fobjc_nonfragile_abi))
773525544de0835d5ee7497f4897e255727b162e0aaAnders Carlsson    return true;
774525544de0835d5ee7497f4897e255727b162e0aaAnders Carlsson
775525544de0835d5ee7497f4897e255727b162e0aaAnders Carlsson  if (Triple.getOS() != llvm::Triple::Darwin)
776525544de0835d5ee7497f4897e255727b162e0aaAnders Carlsson    return false;
777525544de0835d5ee7497f4897e255727b162e0aaAnders Carlsson
778525544de0835d5ee7497f4897e255727b162e0aaAnders Carlsson  return (Triple.getDarwinMajorNumber() >= 9 &&
779525544de0835d5ee7497f4897e255727b162e0aaAnders Carlsson          (Triple.getArch() == llvm::Triple::x86_64 ||
780525544de0835d5ee7497f4897e255727b162e0aaAnders Carlsson           Triple.getArch() == llvm::Triple::arm));
781525544de0835d5ee7497f4897e255727b162e0aaAnders Carlsson}
782525544de0835d5ee7497f4897e255727b162e0aaAnders Carlsson
78315348aeb81285c75b2e92b5bf8d2db3445d147c2Anders Carlsson/// addExceptionArgs - Adds exception related arguments to the driver command
78415348aeb81285c75b2e92b5bf8d2db3445d147c2Anders Carlsson/// arguments. There's a master flag, -fexceptions and also language specific
78515348aeb81285c75b2e92b5bf8d2db3445d147c2Anders Carlsson/// flags to enable/disable C++ and Objective-C exceptions.
78615348aeb81285c75b2e92b5bf8d2db3445d147c2Anders Carlsson/// This makes it possible to for example disable C++ exceptions but enable
78715348aeb81285c75b2e92b5bf8d2db3445d147c2Anders Carlsson/// Objective-C exceptions.
78815348aeb81285c75b2e92b5bf8d2db3445d147c2Anders Carlssonstatic void addExceptionArgs(const ArgList &Args, types::ID InputType,
78915348aeb81285c75b2e92b5bf8d2db3445d147c2Anders Carlsson                             const llvm::Triple &Triple,
79015348aeb81285c75b2e92b5bf8d2db3445d147c2Anders Carlsson                             bool KernelOrKext, bool IsRewriter,
79115348aeb81285c75b2e92b5bf8d2db3445d147c2Anders Carlsson                             ArgStringList &CmdArgs) {
79215348aeb81285c75b2e92b5bf8d2db3445d147c2Anders Carlsson  if (KernelOrKext)
79315348aeb81285c75b2e92b5bf8d2db3445d147c2Anders Carlsson    return;
79415348aeb81285c75b2e92b5bf8d2db3445d147c2Anders Carlsson
79515348aeb81285c75b2e92b5bf8d2db3445d147c2Anders Carlsson  // Exceptions are enabled by default.
79615348aeb81285c75b2e92b5bf8d2db3445d147c2Anders Carlsson  bool ExceptionsEnabled = true;
79715348aeb81285c75b2e92b5bf8d2db3445d147c2Anders Carlsson
79815348aeb81285c75b2e92b5bf8d2db3445d147c2Anders Carlsson  // This keeps track of whether exceptions were explicitly turned on or off.
79915348aeb81285c75b2e92b5bf8d2db3445d147c2Anders Carlsson  bool DidHaveExplicitExceptionFlag = false;
80015348aeb81285c75b2e92b5bf8d2db3445d147c2Anders Carlsson
801f759df06d997050559fd925758bcd2cdef24db05Rafael Espindola  if (Arg *A = Args.getLastArg(options::OPT_fexceptions,
802f759df06d997050559fd925758bcd2cdef24db05Rafael Espindola                               options::OPT_fno_exceptions)) {
803f759df06d997050559fd925758bcd2cdef24db05Rafael Espindola    if (A->getOption().matches(options::OPT_fexceptions))
80415348aeb81285c75b2e92b5bf8d2db3445d147c2Anders Carlsson      ExceptionsEnabled = true;
80515348aeb81285c75b2e92b5bf8d2db3445d147c2Anders Carlsson    else
80615348aeb81285c75b2e92b5bf8d2db3445d147c2Anders Carlsson      ExceptionsEnabled = false;
80715348aeb81285c75b2e92b5bf8d2db3445d147c2Anders Carlsson
80815348aeb81285c75b2e92b5bf8d2db3445d147c2Anders Carlsson    DidHaveExplicitExceptionFlag = true;
809f759df06d997050559fd925758bcd2cdef24db05Rafael Espindola  }
8101a2cd4fd5d384faf171a39dea7136ca4672ac35eDaniel Dunbar
81115348aeb81285c75b2e92b5bf8d2db3445d147c2Anders Carlsson  bool ShouldUseExceptionTables = false;
81215348aeb81285c75b2e92b5bf8d2db3445d147c2Anders Carlsson
81315348aeb81285c75b2e92b5bf8d2db3445d147c2Anders Carlsson  // Exception tables and cleanups can be enabled with -fexceptions even if the
81415348aeb81285c75b2e92b5bf8d2db3445d147c2Anders Carlsson  // language itself doesn't support exceptions.
81515348aeb81285c75b2e92b5bf8d2db3445d147c2Anders Carlsson  if (ExceptionsEnabled && DidHaveExplicitExceptionFlag)
81615348aeb81285c75b2e92b5bf8d2db3445d147c2Anders Carlsson    ShouldUseExceptionTables = true;
81715348aeb81285c75b2e92b5bf8d2db3445d147c2Anders Carlsson
81815348aeb81285c75b2e92b5bf8d2db3445d147c2Anders Carlsson  if (types::isObjC(InputType)) {
81915348aeb81285c75b2e92b5bf8d2db3445d147c2Anders Carlsson    bool ObjCExceptionsEnabled = ExceptionsEnabled;
82015348aeb81285c75b2e92b5bf8d2db3445d147c2Anders Carlsson
82115348aeb81285c75b2e92b5bf8d2db3445d147c2Anders Carlsson    if (Arg *A = Args.getLastArg(options::OPT_fobjc_exceptions,
82215348aeb81285c75b2e92b5bf8d2db3445d147c2Anders Carlsson                                 options::OPT_fno_objc_exceptions,
82315348aeb81285c75b2e92b5bf8d2db3445d147c2Anders Carlsson                                 options::OPT_fexceptions,
82415348aeb81285c75b2e92b5bf8d2db3445d147c2Anders Carlsson                                 options::OPT_fno_exceptions)) {
82515348aeb81285c75b2e92b5bf8d2db3445d147c2Anders Carlsson      if (A->getOption().matches(options::OPT_fobjc_exceptions))
82615348aeb81285c75b2e92b5bf8d2db3445d147c2Anders Carlsson        ObjCExceptionsEnabled = true;
82715348aeb81285c75b2e92b5bf8d2db3445d147c2Anders Carlsson      else if (A->getOption().matches(options::OPT_fno_objc_exceptions))
82815348aeb81285c75b2e92b5bf8d2db3445d147c2Anders Carlsson        ObjCExceptionsEnabled = false;
82915348aeb81285c75b2e92b5bf8d2db3445d147c2Anders Carlsson    }
83015348aeb81285c75b2e92b5bf8d2db3445d147c2Anders Carlsson
83115348aeb81285c75b2e92b5bf8d2db3445d147c2Anders Carlsson    if (ObjCExceptionsEnabled) {
83215348aeb81285c75b2e92b5bf8d2db3445d147c2Anders Carlsson      CmdArgs.push_back("-fobjc-exceptions");
83315348aeb81285c75b2e92b5bf8d2db3445d147c2Anders Carlsson
83415348aeb81285c75b2e92b5bf8d2db3445d147c2Anders Carlsson      ShouldUseExceptionTables |=
83515348aeb81285c75b2e92b5bf8d2db3445d147c2Anders Carlsson        shouldUseExceptionTablesForObjCExceptions(Args, Triple);
83615348aeb81285c75b2e92b5bf8d2db3445d147c2Anders Carlsson    }
83715348aeb81285c75b2e92b5bf8d2db3445d147c2Anders Carlsson  }
83885caf03ee49c4de87ee9624a9b725ef5d20ee624Fariborz Jahanian
83915348aeb81285c75b2e92b5bf8d2db3445d147c2Anders Carlsson  if (types::isCXX(InputType)) {
84015348aeb81285c75b2e92b5bf8d2db3445d147c2Anders Carlsson    bool CXXExceptionsEnabled = ExceptionsEnabled;
8411a2cd4fd5d384faf171a39dea7136ca4672ac35eDaniel Dunbar
84215348aeb81285c75b2e92b5bf8d2db3445d147c2Anders Carlsson    if (Arg *A = Args.getLastArg(options::OPT_fcxx_exceptions,
84315348aeb81285c75b2e92b5bf8d2db3445d147c2Anders Carlsson                                 options::OPT_fno_cxx_exceptions,
84415348aeb81285c75b2e92b5bf8d2db3445d147c2Anders Carlsson                                 options::OPT_fexceptions,
84515348aeb81285c75b2e92b5bf8d2db3445d147c2Anders Carlsson                                 options::OPT_fno_exceptions)) {
84615348aeb81285c75b2e92b5bf8d2db3445d147c2Anders Carlsson      if (A->getOption().matches(options::OPT_fcxx_exceptions))
84715348aeb81285c75b2e92b5bf8d2db3445d147c2Anders Carlsson        CXXExceptionsEnabled = true;
84843f220f6d74e01f2606e429810484177903a28e6Chandler Carruth      else if (A->getOption().matches(options::OPT_fno_cxx_exceptions))
84915348aeb81285c75b2e92b5bf8d2db3445d147c2Anders Carlsson        CXXExceptionsEnabled = false;
85015348aeb81285c75b2e92b5bf8d2db3445d147c2Anders Carlsson    }
85115348aeb81285c75b2e92b5bf8d2db3445d147c2Anders Carlsson
85215348aeb81285c75b2e92b5bf8d2db3445d147c2Anders Carlsson    if (CXXExceptionsEnabled) {
85315348aeb81285c75b2e92b5bf8d2db3445d147c2Anders Carlsson      CmdArgs.push_back("-fcxx-exceptions");
85415348aeb81285c75b2e92b5bf8d2db3445d147c2Anders Carlsson
85515348aeb81285c75b2e92b5bf8d2db3445d147c2Anders Carlsson      ShouldUseExceptionTables = true;
85615348aeb81285c75b2e92b5bf8d2db3445d147c2Anders Carlsson    }
85715348aeb81285c75b2e92b5bf8d2db3445d147c2Anders Carlsson  }
85815348aeb81285c75b2e92b5bf8d2db3445d147c2Anders Carlsson
85915348aeb81285c75b2e92b5bf8d2db3445d147c2Anders Carlsson  if (ShouldUseExceptionTables)
86015348aeb81285c75b2e92b5bf8d2db3445d147c2Anders Carlsson    CmdArgs.push_back("-fexceptions");
861f759df06d997050559fd925758bcd2cdef24db05Rafael Espindola}
862f759df06d997050559fd925758bcd2cdef24db05Rafael Espindola
86347ac7d27c44bd64a7d0fc03d4babc196cf2b8230Daniel Dunbarvoid Clang::ConstructJob(Compilation &C, const JobAction &JA,
864871adcf4e41285e3f4c3b62eaa1b2e05b60b92daDaniel Dunbar                         const InputInfo &Output,
86562cf601812e03dd9bc5df42b8ef06a0cdedc38bfDaniel Dunbar                         const InputInfoList &Inputs,
8661d46033f760ba5fd266ce59fe391fac473f04f52Daniel Dunbar                         const ArgList &Args,
86747ac7d27c44bd64a7d0fc03d4babc196cf2b8230Daniel Dunbar                         const char *LinkingOutput) const {
8680a80ba74ffa3d3df55abfbc4474d7470c7c923e3Daniel Dunbar  bool KernelOrKext = Args.hasArg(options::OPT_mkernel,
8690a80ba74ffa3d3df55abfbc4474d7470c7c923e3Daniel Dunbar                                  options::OPT_fapple_kext);
870ee788e70fcd0adf76103b17c78ac658d4ea30c9bDaniel Dunbar  const Driver &D = getToolChain().getDriver();
871b488c1dac8e53206f07103d794a62a3f5012c0f4Daniel Dunbar  ArgStringList CmdArgs;
872b488c1dac8e53206f07103d794a62a3f5012c0f4Daniel Dunbar
873077ba6a3ac3628afb0d3c460e81ce013bccbdbedDaniel Dunbar  assert(Inputs.size() == 1 && "Unable to handle multiple inputs.");
874077ba6a3ac3628afb0d3c460e81ce013bccbdbedDaniel Dunbar
8758ff5b28d6efcffe2251e77634c7edf83a4763344Daniel Dunbar  // Invoke ourselves in -cc1 mode.
8768ff5b28d6efcffe2251e77634c7edf83a4763344Daniel Dunbar  //
8778ff5b28d6efcffe2251e77634c7edf83a4763344Daniel Dunbar  // FIXME: Implement custom jobs for internal actions.
8788ff5b28d6efcffe2251e77634c7edf83a4763344Daniel Dunbar  CmdArgs.push_back("-cc1");
8798ff5b28d6efcffe2251e77634c7edf83a4763344Daniel Dunbar
880dd4fe00f03d8749b283948ea86aa1e4a53ed21abDaniel Dunbar  // Add the "effective" target triple.
881af07f936b698575f2c91f1c1134c116f1ef0deddDaniel Dunbar  CmdArgs.push_back("-triple");
88200577ada44c889fbe311d61c51a8da89e65c7c9aDaniel Dunbar  std::string TripleStr = getToolChain().ComputeEffectiveClangTriple(Args);
883dd4fe00f03d8749b283948ea86aa1e4a53ed21abDaniel Dunbar  CmdArgs.push_back(Args.MakeArgString(TripleStr));
884728a512753d85a6ccaae34e81385c8665c2de0e1Daniel Dunbar
885dd4fe00f03d8749b283948ea86aa1e4a53ed21abDaniel Dunbar  // Select the appropriate action.
8865314e448631f166c89e908cc1ab45dc7eda916baDaniel Dunbar  bool IsRewriter = false;
8871d46033f760ba5fd266ce59fe391fac473f04f52Daniel Dunbar  if (isa<AnalyzeJobAction>(JA)) {
8881d46033f760ba5fd266ce59fe391fac473f04f52Daniel Dunbar    assert(JA.getType() == types::TY_Plist && "Invalid output type.");
8891d46033f760ba5fd266ce59fe391fac473f04f52Daniel Dunbar    CmdArgs.push_back("-analyze");
8901d46033f760ba5fd266ce59fe391fac473f04f52Daniel Dunbar  } else if (isa<PreprocessJobAction>(JA)) {
891cd8e4c44dd068956e9181381be3ee2d49a0fac52Daniel Dunbar    if (Output.getType() == types::TY_Dependencies)
892cd8e4c44dd068956e9181381be3ee2d49a0fac52Daniel Dunbar      CmdArgs.push_back("-Eonly");
893cd8e4c44dd068956e9181381be3ee2d49a0fac52Daniel Dunbar    else
894cd8e4c44dd068956e9181381be3ee2d49a0fac52Daniel Dunbar      CmdArgs.push_back("-E");
8958767cbc475ed96397b6f08617814eeb9cab121bdDaniel Dunbar  } else if (isa<AssembleJobAction>(JA)) {
8968767cbc475ed96397b6f08617814eeb9cab121bdDaniel Dunbar    CmdArgs.push_back("-emit-obj");
8979929800b8dfced61e9c97dc8d6e71e144ebf8accDaniel Dunbar
8989929800b8dfced61e9c97dc8d6e71e144ebf8accDaniel Dunbar    // At -O0, we use -mrelax-all by default.
8999929800b8dfced61e9c97dc8d6e71e144ebf8accDaniel Dunbar    bool IsOpt = false;
9009929800b8dfced61e9c97dc8d6e71e144ebf8accDaniel Dunbar    if (Arg *A = Args.getLastArg(options::OPT_O_Group))
9019929800b8dfced61e9c97dc8d6e71e144ebf8accDaniel Dunbar      IsOpt = !A->getOption().matches(options::OPT_O0);
9029929800b8dfced61e9c97dc8d6e71e144ebf8accDaniel Dunbar    if (Args.hasFlag(options::OPT_mrelax_all,
9039929800b8dfced61e9c97dc8d6e71e144ebf8accDaniel Dunbar                      options::OPT_mno_relax_all,
9049929800b8dfced61e9c97dc8d6e71e144ebf8accDaniel Dunbar                      !IsOpt))
9059929800b8dfced61e9c97dc8d6e71e144ebf8accDaniel Dunbar      CmdArgs.push_back("-mrelax-all");
906ca0e0545c216afaacba6da6c82a270dc2efc4e3fDaniel Dunbar
907fcec10bded7b9b9268af5232fa17617db0df68edDaniel Dunbar    // When using an integrated assembler, translate -Wa, and -Xassembler
908fcec10bded7b9b9268af5232fa17617db0df68edDaniel Dunbar    // options.
909fcec10bded7b9b9268af5232fa17617db0df68edDaniel Dunbar    for (arg_iterator it = Args.filtered_begin(options::OPT_Wa_COMMA,
910fcec10bded7b9b9268af5232fa17617db0df68edDaniel Dunbar                                               options::OPT_Xassembler),
911fcec10bded7b9b9268af5232fa17617db0df68edDaniel Dunbar           ie = Args.filtered_end(); it != ie; ++it) {
912fcec10bded7b9b9268af5232fa17617db0df68edDaniel Dunbar      const Arg *A = *it;
913fcec10bded7b9b9268af5232fa17617db0df68edDaniel Dunbar      A->claim();
914fcec10bded7b9b9268af5232fa17617db0df68edDaniel Dunbar
915fcec10bded7b9b9268af5232fa17617db0df68edDaniel Dunbar      for (unsigned i = 0, e = A->getNumValues(); i != e; ++i) {
916fcec10bded7b9b9268af5232fa17617db0df68edDaniel Dunbar        llvm::StringRef Value = A->getValue(Args, i);
917fcec10bded7b9b9268af5232fa17617db0df68edDaniel Dunbar
918fcec10bded7b9b9268af5232fa17617db0df68edDaniel Dunbar        if (Value == "-force_cpusubtype_ALL") {
919fcec10bded7b9b9268af5232fa17617db0df68edDaniel Dunbar          // Do nothing, this is the default and we don't support anything else.
920b14eed0ed44ed3af881219dab7dc6464cad5303bDaniel Dunbar        } else if (Value == "-L") {
921b14eed0ed44ed3af881219dab7dc6464cad5303bDaniel Dunbar          // We don't support -L yet, but it isn't important enough to error
922b14eed0ed44ed3af881219dab7dc6464cad5303bDaniel Dunbar          // on. No one should really be using it for a semantic change.
923b14eed0ed44ed3af881219dab7dc6464cad5303bDaniel Dunbar          D.Diag(clang::diag::warn_drv_unsupported_option_argument)
924b14eed0ed44ed3af881219dab7dc6464cad5303bDaniel Dunbar            << A->getOption().getName() << Value;
925fcec10bded7b9b9268af5232fa17617db0df68edDaniel Dunbar        } else {
926fcec10bded7b9b9268af5232fa17617db0df68edDaniel Dunbar          D.Diag(clang::diag::err_drv_unsupported_option_argument)
927fcec10bded7b9b9268af5232fa17617db0df68edDaniel Dunbar            << A->getOption().getName() << Value;
928fcec10bded7b9b9268af5232fa17617db0df68edDaniel Dunbar        }
929fcec10bded7b9b9268af5232fa17617db0df68edDaniel Dunbar      }
930fcec10bded7b9b9268af5232fa17617db0df68edDaniel Dunbar    }
931d02bba8e2abceebd91c162ee4479623791f455b5Daniel Dunbar
932d02bba8e2abceebd91c162ee4479623791f455b5Daniel Dunbar    // Also ignore explicit -force_cpusubtype_ALL option.
933d02bba8e2abceebd91c162ee4479623791f455b5Daniel Dunbar    (void) Args.hasArg(options::OPT_force__cpusubtype__ALL);
9341d46033f760ba5fd266ce59fe391fac473f04f52Daniel Dunbar  } else if (isa<PrecompileJobAction>(JA)) {
935e5c35377020d6c38d16434c9f373a5fa9bb4f2ebArgyrios Kyrtzidis    // Use PCH if the user requested it.
9360ebd9321ba380471010341f24c874f46f56e7581Daniel Dunbar    bool UsePCH = D.CCCUsePCH;
9370ebd9321ba380471010341f24c874f46f56e7581Daniel Dunbar
9380ebd9321ba380471010341f24c874f46f56e7581Daniel Dunbar    if (UsePCH)
939df91ef3d6c55692a0236f67b6c6b134a3bf84098Douglas Gregor      CmdArgs.push_back("-emit-pch");
940df91ef3d6c55692a0236f67b6c6b134a3bf84098Douglas Gregor    else
941df91ef3d6c55692a0236f67b6c6b134a3bf84098Douglas Gregor      CmdArgs.push_back("-emit-pth");
9421d46033f760ba5fd266ce59fe391fac473f04f52Daniel Dunbar  } else {
9431d46033f760ba5fd266ce59fe391fac473f04f52Daniel Dunbar    assert(isa<CompileJobAction>(JA) && "Invalid action for clang tool.");
944c21c485b4fb58ef5d55cf3e523263dd824a2ace4Daniel Dunbar
9451d46033f760ba5fd266ce59fe391fac473f04f52Daniel Dunbar    if (JA.getType() == types::TY_Nothing) {
9461d46033f760ba5fd266ce59fe391fac473f04f52Daniel Dunbar      CmdArgs.push_back("-fsyntax-only");
9476c6424bc0d3b5f080a97b5f6ef4a8d70c38e38f5Daniel Dunbar    } else if (JA.getType() == types::TY_LLVM_IR ||
9486c6424bc0d3b5f080a97b5f6ef4a8d70c38e38f5Daniel Dunbar               JA.getType() == types::TY_LTO_IR) {
9491d46033f760ba5fd266ce59fe391fac473f04f52Daniel Dunbar      CmdArgs.push_back("-emit-llvm");
9506c6424bc0d3b5f080a97b5f6ef4a8d70c38e38f5Daniel Dunbar    } else if (JA.getType() == types::TY_LLVM_BC ||
9516c6424bc0d3b5f080a97b5f6ef4a8d70c38e38f5Daniel Dunbar               JA.getType() == types::TY_LTO_BC) {
9521d46033f760ba5fd266ce59fe391fac473f04f52Daniel Dunbar      CmdArgs.push_back("-emit-llvm-bc");
9531d46033f760ba5fd266ce59fe391fac473f04f52Daniel Dunbar    } else if (JA.getType() == types::TY_PP_Asm) {
954e3b8d07e02861d245612b02b5f5a2c1f34b2a394Daniel Dunbar      CmdArgs.push_back("-S");
9555915fbf310e171c4cd3c2af05e9de360c0fa988aDaniel Dunbar    } else if (JA.getType() == types::TY_AST) {
9565915fbf310e171c4cd3c2af05e9de360c0fa988aDaniel Dunbar      CmdArgs.push_back("-emit-pch");
95764952508c2b0c8bffb45c8b410f0af3d2457f59bDaniel Dunbar    } else if (JA.getType() == types::TY_RewrittenObjC) {
95864952508c2b0c8bffb45c8b410f0af3d2457f59bDaniel Dunbar      CmdArgs.push_back("-rewrite-objc");
9595314e448631f166c89e908cc1ab45dc7eda916baDaniel Dunbar      IsRewriter = true;
96064952508c2b0c8bffb45c8b410f0af3d2457f59bDaniel Dunbar    } else {
96164952508c2b0c8bffb45c8b410f0af3d2457f59bDaniel Dunbar      assert(JA.getType() == types::TY_PP_Asm &&
96264952508c2b0c8bffb45c8b410f0af3d2457f59bDaniel Dunbar             "Unexpected output type!");
9631d46033f760ba5fd266ce59fe391fac473f04f52Daniel Dunbar    }
9641d46033f760ba5fd266ce59fe391fac473f04f52Daniel Dunbar  }
9651d46033f760ba5fd266ce59fe391fac473f04f52Daniel Dunbar
9661d46033f760ba5fd266ce59fe391fac473f04f52Daniel Dunbar  // The make clang go fast button.
9671d46033f760ba5fd266ce59fe391fac473f04f52Daniel Dunbar  CmdArgs.push_back("-disable-free");
9681d46033f760ba5fd266ce59fe391fac473f04f52Daniel Dunbar
969b689afb75049012a431d483432114ad5e75d4a92John McCall  // Disable the verification pass in -asserts builds.
970b689afb75049012a431d483432114ad5e75d4a92John McCall#ifdef NDEBUG
971b689afb75049012a431d483432114ad5e75d4a92John McCall  CmdArgs.push_back("-disable-llvm-verifier");
972b689afb75049012a431d483432114ad5e75d4a92John McCall#endif
973b689afb75049012a431d483432114ad5e75d4a92John McCall
974c9abc043af88f90d177a5bd147f627b78ca49fdeDaniel Dunbar  // Set the main file name, so that debug info works even with
975c9abc043af88f90d177a5bd147f627b78ca49fdeDaniel Dunbar  // -save-temps.
976c9abc043af88f90d177a5bd147f627b78ca49fdeDaniel Dunbar  CmdArgs.push_back("-main-file-name");
977c9abc043af88f90d177a5bd147f627b78ca49fdeDaniel Dunbar  CmdArgs.push_back(darwin::CC1::getBaseInputName(Args, Inputs));
978c9abc043af88f90d177a5bd147f627b78ca49fdeDaniel Dunbar
9793bbc75302fd43cf13d868b46c94ff8794b302e43Daniel Dunbar  // Some flags which affect the language (via preprocessor
9803bbc75302fd43cf13d868b46c94ff8794b302e43Daniel Dunbar  // defines). See darwin::CC1::AddCPPArgs.
9813bbc75302fd43cf13d868b46c94ff8794b302e43Daniel Dunbar  if (Args.hasArg(options::OPT_static))
9823bbc75302fd43cf13d868b46c94ff8794b302e43Daniel Dunbar    CmdArgs.push_back("-static-define");
9833bbc75302fd43cf13d868b46c94ff8794b302e43Daniel Dunbar
9841d46033f760ba5fd266ce59fe391fac473f04f52Daniel Dunbar  if (isa<AnalyzeJobAction>(JA)) {
985b8bb3e797c5687715c6d9d960ee573e4d0e62230Ted Kremenek    // Enable region store model by default.
986b8bb3e797c5687715c6d9d960ee573e4d0e62230Ted Kremenek    CmdArgs.push_back("-analyzer-store=region");
987b8bb3e797c5687715c6d9d960ee573e4d0e62230Ted Kremenek
988b40d06dec23b53bbc1157a9adae7f887be31aa3bTed Kremenek    // Treat blocks as analysis entry points.
989b40d06dec23b53bbc1157a9adae7f887be31aa3bTed Kremenek    CmdArgs.push_back("-analyzer-opt-analyze-nested-blocks");
990b40d06dec23b53bbc1157a9adae7f887be31aa3bTed Kremenek
9911d46033f760ba5fd266ce59fe391fac473f04f52Daniel Dunbar    // Add default argument set.
992d8fc0f2e7751cf31cec5c2f3cc6a0b447e9debb3Daniel Dunbar    if (!Args.hasArg(options::OPT__analyzer_no_default_checks)) {
993f0335171b4908939bac410f865fc09ceb06ac632Ted Kremenek      types::ID InputType = Inputs[0].getType();
994f0335171b4908939bac410f865fc09ceb06ac632Ted Kremenek
995f0335171b4908939bac410f865fc09ceb06ac632Ted Kremenek      // Checks to perform for all language types.
996027a6abdd6cedc0b8203da72eed6d15c796dce9dArgyrios Kyrtzidis
997027a6abdd6cedc0b8203da72eed6d15c796dce9dArgyrios Kyrtzidis      CmdArgs.push_back("-analyzer-checker=core");
998027a6abdd6cedc0b8203da72eed6d15c796dce9dArgyrios Kyrtzidis      if (getToolChain().getTriple().getOS() != llvm::Triple::Win32)
999027a6abdd6cedc0b8203da72eed6d15c796dce9dArgyrios Kyrtzidis        CmdArgs.push_back("-analyzer-checker=unix");
1000027a6abdd6cedc0b8203da72eed6d15c796dce9dArgyrios Kyrtzidis      if (getToolChain().getTriple().getVendor() == llvm::Triple::Apple)
1001027a6abdd6cedc0b8203da72eed6d15c796dce9dArgyrios Kyrtzidis        CmdArgs.push_back("-analyzer-checker=macosx");
1002027a6abdd6cedc0b8203da72eed6d15c796dce9dArgyrios Kyrtzidis
1003a676d501a001657892c483bd4d651650e168f337Argyrios Kyrtzidis      CmdArgs.push_back("-analyzer-checker=DeadStores");
1004a676d501a001657892c483bd4d651650e168f337Argyrios Kyrtzidis
1005f0335171b4908939bac410f865fc09ceb06ac632Ted Kremenek      // Checks to perform for Objective-C/Objective-C++.
1006f0335171b4908939bac410f865fc09ceb06ac632Ted Kremenek      if (types::isObjC(InputType)) {
100743dee220252ef0b42c5f8a3bb1eca97f84f2565fArgyrios Kyrtzidis        // Enable all checkers in 'cocoa' package.
100843dee220252ef0b42c5f8a3bb1eca97f84f2565fArgyrios Kyrtzidis        CmdArgs.push_back("-analyzer-checker=cocoa");
1009f0335171b4908939bac410f865fc09ceb06ac632Ted Kremenek      }
1010f0335171b4908939bac410f865fc09ceb06ac632Ted Kremenek
10118899ab01d43ca7359cd852e58c5c3182cd0979c5Argyrios Kyrtzidis      CmdArgs.push_back("-analyzer-eagerly-assume");
1012d8fc0f2e7751cf31cec5c2f3cc6a0b447e9debb3Daniel Dunbar    }
1013d8fc0f2e7751cf31cec5c2f3cc6a0b447e9debb3Daniel Dunbar
1014d8fc0f2e7751cf31cec5c2f3cc6a0b447e9debb3Daniel Dunbar    // Set the output format. The default is plist, for (lame) historical
1015d8fc0f2e7751cf31cec5c2f3cc6a0b447e9debb3Daniel Dunbar    // reasons.
1016d8fc0f2e7751cf31cec5c2f3cc6a0b447e9debb3Daniel Dunbar    CmdArgs.push_back("-analyzer-output");
1017d8fc0f2e7751cf31cec5c2f3cc6a0b447e9debb3Daniel Dunbar    if (Arg *A = Args.getLastArg(options::OPT__analyzer_output))
1018d8fc0f2e7751cf31cec5c2f3cc6a0b447e9debb3Daniel Dunbar      CmdArgs.push_back(A->getValue(Args));
1019d8fc0f2e7751cf31cec5c2f3cc6a0b447e9debb3Daniel Dunbar    else
1020d8fc0f2e7751cf31cec5c2f3cc6a0b447e9debb3Daniel Dunbar      CmdArgs.push_back("plist");
10211d46033f760ba5fd266ce59fe391fac473f04f52Daniel Dunbar
10220647a7b9ad844565b8a4b5e1a5de882dd64efabfTed Kremenek    // Disable the presentation of standard compiler warnings when
10230647a7b9ad844565b8a4b5e1a5de882dd64efabfTed Kremenek    // using --analyze.  We only want to show static analyzer diagnostics
10240647a7b9ad844565b8a4b5e1a5de882dd64efabfTed Kremenek    // or frontend errors.
10250647a7b9ad844565b8a4b5e1a5de882dd64efabfTed Kremenek    CmdArgs.push_back("-w");
10260647a7b9ad844565b8a4b5e1a5de882dd64efabfTed Kremenek
10271d46033f760ba5fd266ce59fe391fac473f04f52Daniel Dunbar    // Add -Xanalyzer arguments when running as analyzer.
10281d46033f760ba5fd266ce59fe391fac473f04f52Daniel Dunbar    Args.AddAllArgValues(CmdArgs, options::OPT_Xanalyzer);
10291eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump  }
10301eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump
1031e2fd66418eca3d70cf6b62087d745d0c5181db69Daniel Dunbar  CheckCodeGenerationOptions(D, Args);
1032e2fd66418eca3d70cf6b62087d745d0c5181db69Daniel Dunbar
1033bc85be85779a47bae728bbe6a2cd2e3732b1333dDaniel Dunbar  // Perform argument translation for LLVM backend. This
1034bc85be85779a47bae728bbe6a2cd2e3732b1333dDaniel Dunbar  // takes some care in reconciling with llvm-gcc. The
1035bc85be85779a47bae728bbe6a2cd2e3732b1333dDaniel Dunbar  // issue is that llvm-gcc translates these options based on
1036bc85be85779a47bae728bbe6a2cd2e3732b1333dDaniel Dunbar  // the values in cc1, whereas we are processing based on
1037bc85be85779a47bae728bbe6a2cd2e3732b1333dDaniel Dunbar  // the driver arguments.
10389fd0b1f845a61e71dd8099f596532d34c519630aDaniel Dunbar
1039bc85be85779a47bae728bbe6a2cd2e3732b1333dDaniel Dunbar  // This comes from the default translation the driver + cc1
1040bc85be85779a47bae728bbe6a2cd2e3732b1333dDaniel Dunbar  // would do to enable flag_pic.
1041bc85be85779a47bae728bbe6a2cd2e3732b1333dDaniel Dunbar  //
1042bc85be85779a47bae728bbe6a2cd2e3732b1333dDaniel Dunbar  // FIXME: Centralize this code.
1043bc85be85779a47bae728bbe6a2cd2e3732b1333dDaniel Dunbar  bool PICEnabled = (Args.hasArg(options::OPT_fPIC) ||
1044bc85be85779a47bae728bbe6a2cd2e3732b1333dDaniel Dunbar                     Args.hasArg(options::OPT_fpic) ||
1045bc85be85779a47bae728bbe6a2cd2e3732b1333dDaniel Dunbar                     Args.hasArg(options::OPT_fPIE) ||
1046bc85be85779a47bae728bbe6a2cd2e3732b1333dDaniel Dunbar                     Args.hasArg(options::OPT_fpie));
1047bc85be85779a47bae728bbe6a2cd2e3732b1333dDaniel Dunbar  bool PICDisabled = (Args.hasArg(options::OPT_mkernel) ||
1048bc85be85779a47bae728bbe6a2cd2e3732b1333dDaniel Dunbar                      Args.hasArg(options::OPT_static));
1049bc85be85779a47bae728bbe6a2cd2e3732b1333dDaniel Dunbar  const char *Model = getToolChain().GetForcedPicModel();
1050bc85be85779a47bae728bbe6a2cd2e3732b1333dDaniel Dunbar  if (!Model) {
1051bc85be85779a47bae728bbe6a2cd2e3732b1333dDaniel Dunbar    if (Args.hasArg(options::OPT_mdynamic_no_pic))
1052bc85be85779a47bae728bbe6a2cd2e3732b1333dDaniel Dunbar      Model = "dynamic-no-pic";
1053bc85be85779a47bae728bbe6a2cd2e3732b1333dDaniel Dunbar    else if (PICDisabled)
1054bc85be85779a47bae728bbe6a2cd2e3732b1333dDaniel Dunbar      Model = "static";
1055bc85be85779a47bae728bbe6a2cd2e3732b1333dDaniel Dunbar    else if (PICEnabled)
1056bc85be85779a47bae728bbe6a2cd2e3732b1333dDaniel Dunbar      Model = "pic";
10571d46033f760ba5fd266ce59fe391fac473f04f52Daniel Dunbar    else
1058bc85be85779a47bae728bbe6a2cd2e3732b1333dDaniel Dunbar      Model = getToolChain().GetDefaultRelocationModel();
1059bc85be85779a47bae728bbe6a2cd2e3732b1333dDaniel Dunbar  }
1060f219e7c1529fac29e34483667f740b452e5ef9ccDaniel Dunbar  if (llvm::StringRef(Model) != "pic") {
1061f219e7c1529fac29e34483667f740b452e5ef9ccDaniel Dunbar    CmdArgs.push_back("-mrelocation-model");
1062f219e7c1529fac29e34483667f740b452e5ef9ccDaniel Dunbar    CmdArgs.push_back(Model);
1063f219e7c1529fac29e34483667f740b452e5ef9ccDaniel Dunbar  }
10641d46033f760ba5fd266ce59fe391fac473f04f52Daniel Dunbar
1065bc85be85779a47bae728bbe6a2cd2e3732b1333dDaniel Dunbar  // Infer the __PIC__ value.
1066bc85be85779a47bae728bbe6a2cd2e3732b1333dDaniel Dunbar  //
1067bc85be85779a47bae728bbe6a2cd2e3732b1333dDaniel Dunbar  // FIXME:  This isn't quite right on Darwin, which always sets
1068bc85be85779a47bae728bbe6a2cd2e3732b1333dDaniel Dunbar  // __PIC__=2.
1069bc85be85779a47bae728bbe6a2cd2e3732b1333dDaniel Dunbar  if (strcmp(Model, "pic") == 0 || strcmp(Model, "dynamic-no-pic") == 0) {
10707674352cf3e8f699914a2f739f1ae8c8c3480813Daniel Dunbar    CmdArgs.push_back("-pic-level");
10717674352cf3e8f699914a2f739f1ae8c8c3480813Daniel Dunbar    CmdArgs.push_back(Args.hasArg(options::OPT_fPIC) ? "2" : "1");
1072bc85be85779a47bae728bbe6a2cd2e3732b1333dDaniel Dunbar  }
1073f219e7c1529fac29e34483667f740b452e5ef9ccDaniel Dunbar  if (!Args.hasFlag(options::OPT_fmerge_all_constants,
1074f219e7c1529fac29e34483667f740b452e5ef9ccDaniel Dunbar                    options::OPT_fno_merge_all_constants))
1075f219e7c1529fac29e34483667f740b452e5ef9ccDaniel Dunbar    CmdArgs.push_back("-no-merge-all-constants");
1076f219e7c1529fac29e34483667f740b452e5ef9ccDaniel Dunbar
1077f219e7c1529fac29e34483667f740b452e5ef9ccDaniel Dunbar  // LLVM Code Generator Options.
10781d46033f760ba5fd266ce59fe391fac473f04f52Daniel Dunbar
107917d3fea677753e6e3e82ffe2cbdeccbf5f2e7497Daniel Dunbar  if (Arg *A = Args.getLastArg(options::OPT_mregparm_EQ)) {
108017d3fea677753e6e3e82ffe2cbdeccbf5f2e7497Daniel Dunbar    CmdArgs.push_back("-mregparm");
108117d3fea677753e6e3e82ffe2cbdeccbf5f2e7497Daniel Dunbar    CmdArgs.push_back(A->getValue(Args));
108217d3fea677753e6e3e82ffe2cbdeccbf5f2e7497Daniel Dunbar  }
108317d3fea677753e6e3e82ffe2cbdeccbf5f2e7497Daniel Dunbar
1084bc85be85779a47bae728bbe6a2cd2e3732b1333dDaniel Dunbar  // FIXME: Set --enable-unsafe-fp-math.
108521656ddae8e81df04f142386337cb95a9e0f0971Benjamin Kramer  if (Args.hasFlag(options::OPT_fno_omit_frame_pointer,
108621656ddae8e81df04f142386337cb95a9e0f0971Benjamin Kramer                   options::OPT_fomit_frame_pointer))
1087f219e7c1529fac29e34483667f740b452e5ef9ccDaniel Dunbar    CmdArgs.push_back("-mdisable-fp-elim");
1088bc85be85779a47bae728bbe6a2cd2e3732b1333dDaniel Dunbar  if (!Args.hasFlag(options::OPT_fzero_initialized_in_bss,
1089f219e7c1529fac29e34483667f740b452e5ef9ccDaniel Dunbar                    options::OPT_fno_zero_initialized_in_bss))
1090f219e7c1529fac29e34483667f740b452e5ef9ccDaniel Dunbar    CmdArgs.push_back("-mno-zero-initialized-in-bss");
1091398c610b16728b4398214367dd0effd9d2e61340Daniel Dunbar  if (!Args.hasFlag(options::OPT_fstrict_aliasing,
1092398c610b16728b4398214367dd0effd9d2e61340Daniel Dunbar                    options::OPT_fno_strict_aliasing,
1093398c610b16728b4398214367dd0effd9d2e61340Daniel Dunbar                    getToolChain().IsStrictAliasingDefault()))
10944d5625e15bb215c2241c022df8dc7b04438970c6Dan Gohman    CmdArgs.push_back("-relaxed-aliasing");
10951b71848c5238747ede9650b7907172f8a7e088a5Daniel Dunbar
10961b71848c5238747ede9650b7907172f8a7e088a5Daniel Dunbar  // Decide whether to use verbose asm. Verbose assembly is the default on
10971b71848c5238747ede9650b7907172f8a7e088a5Daniel Dunbar  // toolchains which have the integrated assembler on by default.
10981b71848c5238747ede9650b7907172f8a7e088a5Daniel Dunbar  bool IsVerboseAsmDefault = getToolChain().IsIntegratedAssemblerDefault();
10991b71848c5238747ede9650b7907172f8a7e088a5Daniel Dunbar  if (Args.hasFlag(options::OPT_fverbose_asm, options::OPT_fno_verbose_asm,
110020249a1af2e462dcafdd6a350f1c7967b264ff25Michael J. Spencer                   IsVerboseAsmDefault) ||
11011b71848c5238747ede9650b7907172f8a7e088a5Daniel Dunbar      Args.hasArg(options::OPT_dA))
1102f219e7c1529fac29e34483667f740b452e5ef9ccDaniel Dunbar    CmdArgs.push_back("-masm-verbose");
11031b71848c5238747ede9650b7907172f8a7e088a5Daniel Dunbar
1104f219e7c1529fac29e34483667f740b452e5ef9ccDaniel Dunbar  if (Args.hasArg(options::OPT_fdebug_pass_structure)) {
1105f219e7c1529fac29e34483667f740b452e5ef9ccDaniel Dunbar    CmdArgs.push_back("-mdebug-pass");
1106f219e7c1529fac29e34483667f740b452e5ef9ccDaniel Dunbar    CmdArgs.push_back("Structure");
1107f219e7c1529fac29e34483667f740b452e5ef9ccDaniel Dunbar  }
1108f219e7c1529fac29e34483667f740b452e5ef9ccDaniel Dunbar  if (Args.hasArg(options::OPT_fdebug_pass_arguments)) {
1109f219e7c1529fac29e34483667f740b452e5ef9ccDaniel Dunbar    CmdArgs.push_back("-mdebug-pass");
1110f219e7c1529fac29e34483667f740b452e5ef9ccDaniel Dunbar    CmdArgs.push_back("Arguments");
1111f219e7c1529fac29e34483667f740b452e5ef9ccDaniel Dunbar  }
11126bea73b3305a03479589e2642fbdcf6c096851aaDaniel Dunbar
1113d0c2ec44e093011256b6a0f57d455f36dffdea70John McCall  // Enable -mconstructor-aliases except on darwin, where we have to
1114d0c2ec44e093011256b6a0f57d455f36dffdea70John McCall  // work around a linker bug;  see <rdar://problem/7651567>.
1115d0c2ec44e093011256b6a0f57d455f36dffdea70John McCall  if (getToolChain().getTriple().getOS() != llvm::Triple::Darwin)
1116d0c2ec44e093011256b6a0f57d455f36dffdea70John McCall    CmdArgs.push_back("-mconstructor-aliases");
1117125b4cb35536e45201f8f2cb19ee620e3ad67c49NAKAMURA Takumi
11186f75550e40a9177db9979fc130ce3ece026b137dDouglas Gregor  if (Args.hasArg(options::OPT_mms_bitfields)) {
11196f75550e40a9177db9979fc130ce3ece026b137dDouglas Gregor    CmdArgs.push_back("-mms-bitfields");
11206f75550e40a9177db9979fc130ce3ece026b137dDouglas Gregor  }
1121d0c2ec44e093011256b6a0f57d455f36dffdea70John McCall
11226bea73b3305a03479589e2642fbdcf6c096851aaDaniel Dunbar  // This is a coarse approximation of what llvm-gcc actually does, both
11236bea73b3305a03479589e2642fbdcf6c096851aaDaniel Dunbar  // -fasynchronous-unwind-tables and -fnon-call-exceptions interact in more
11246bea73b3305a03479589e2642fbdcf6c096851aaDaniel Dunbar  // complicated ways.
11256bea73b3305a03479589e2642fbdcf6c096851aaDaniel Dunbar  bool AsynchronousUnwindTables =
11266bea73b3305a03479589e2642fbdcf6c096851aaDaniel Dunbar    Args.hasFlag(options::OPT_fasynchronous_unwind_tables,
11276bea73b3305a03479589e2642fbdcf6c096851aaDaniel Dunbar                 options::OPT_fno_asynchronous_unwind_tables,
11286bea73b3305a03479589e2642fbdcf6c096851aaDaniel Dunbar                 getToolChain().IsUnwindTablesDefault() &&
11290a80ba74ffa3d3df55abfbc4474d7470c7c923e3Daniel Dunbar                 !KernelOrKext);
11306bea73b3305a03479589e2642fbdcf6c096851aaDaniel Dunbar  if (Args.hasFlag(options::OPT_funwind_tables, options::OPT_fno_unwind_tables,
11316bea73b3305a03479589e2642fbdcf6c096851aaDaniel Dunbar                   AsynchronousUnwindTables))
1132f219e7c1529fac29e34483667f740b452e5ef9ccDaniel Dunbar    CmdArgs.push_back("-munwind-tables");
1133f219e7c1529fac29e34483667f740b452e5ef9ccDaniel Dunbar
1134f219e7c1529fac29e34483667f740b452e5ef9ccDaniel Dunbar  if (Arg *A = Args.getLastArg(options::OPT_flimited_precision_EQ)) {
1135f219e7c1529fac29e34483667f740b452e5ef9ccDaniel Dunbar    CmdArgs.push_back("-mlimit-float-precision");
1136f219e7c1529fac29e34483667f740b452e5ef9ccDaniel Dunbar    CmdArgs.push_back(A->getValue(Args));
1137f219e7c1529fac29e34483667f740b452e5ef9ccDaniel Dunbar  }
1138bc85be85779a47bae728bbe6a2cd2e3732b1333dDaniel Dunbar
1139868bd0aa9281929ef50d2e9a8c82a036906f53f5Daniel Dunbar  // FIXME: Handle -mtune=.
1140868bd0aa9281929ef50d2e9a8c82a036906f53f5Daniel Dunbar  (void) Args.hasArg(options::OPT_mtune_EQ);
1141bc85be85779a47bae728bbe6a2cd2e3732b1333dDaniel Dunbar
11428e9ef0d87dad25f02e5abc6facf528778236115aBenjamin Kramer  if (Arg *A = Args.getLastArg(options::OPT_mcmodel_EQ)) {
1143f219e7c1529fac29e34483667f740b452e5ef9ccDaniel Dunbar    CmdArgs.push_back("-mcode-model");
11448e9ef0d87dad25f02e5abc6facf528778236115aBenjamin Kramer    CmdArgs.push_back(A->getValue(Args));
11458e9ef0d87dad25f02e5abc6facf528778236115aBenjamin Kramer  }
11468e9ef0d87dad25f02e5abc6facf528778236115aBenjamin Kramer
11476acda16e9c194dcbd0dea64341e182bdb65d0f41Daniel Dunbar  // Add target specific cpu and features flags.
11486acda16e9c194dcbd0dea64341e182bdb65d0f41Daniel Dunbar  switch(getToolChain().getTriple().getArch()) {
11496acda16e9c194dcbd0dea64341e182bdb65d0f41Daniel Dunbar  default:
11506acda16e9c194dcbd0dea64341e182bdb65d0f41Daniel Dunbar    break;
1151868bd0aa9281929ef50d2e9a8c82a036906f53f5Daniel Dunbar
1152b163ef7e7a5d904ef0962a7c38c460be083c4d63Daniel Dunbar  case llvm::Triple::arm:
1153b163ef7e7a5d904ef0962a7c38c460be083c4d63Daniel Dunbar  case llvm::Triple::thumb:
1154b163ef7e7a5d904ef0962a7c38c460be083c4d63Daniel Dunbar    AddARMTargetArgs(Args, CmdArgs);
1155b163ef7e7a5d904ef0962a7c38c460be083c4d63Daniel Dunbar    break;
1156b163ef7e7a5d904ef0962a7c38c460be083c4d63Daniel Dunbar
1157ed734737d5af31906e30e537d4a41c760ddcfc59Eric Christopher  case llvm::Triple::mips:
1158ed734737d5af31906e30e537d4a41c760ddcfc59Eric Christopher  case llvm::Triple::mipsel:
1159ed734737d5af31906e30e537d4a41c760ddcfc59Eric Christopher    AddMIPSTargetArgs(Args, CmdArgs);
11609284d215022457ba867080a713f08f026d89ea17Bruno Cardoso Lopes    break;
11619284d215022457ba867080a713f08f026d89ea17Bruno Cardoso Lopes
11629284d215022457ba867080a713f08f026d89ea17Bruno Cardoso Lopes  case llvm::Triple::sparc:
11639284d215022457ba867080a713f08f026d89ea17Bruno Cardoso Lopes    AddSparcTargetArgs(Args, CmdArgs);
1164ed734737d5af31906e30e537d4a41c760ddcfc59Eric Christopher    break;
1165ed734737d5af31906e30e537d4a41c760ddcfc59Eric Christopher
11666acda16e9c194dcbd0dea64341e182bdb65d0f41Daniel Dunbar  case llvm::Triple::x86:
11676acda16e9c194dcbd0dea64341e182bdb65d0f41Daniel Dunbar  case llvm::Triple::x86_64:
11686acda16e9c194dcbd0dea64341e182bdb65d0f41Daniel Dunbar    AddX86TargetArgs(Args, CmdArgs);
11696acda16e9c194dcbd0dea64341e182bdb65d0f41Daniel Dunbar    break;
1170bc85be85779a47bae728bbe6a2cd2e3732b1333dDaniel Dunbar  }
1171c21c485b4fb58ef5d55cf3e523263dd824a2ace4Daniel Dunbar
1172c176bc6be6f1407e7c6bd062f05a8636ea9a08e3Daniel Dunbar  // Pass the linker version in use.
1173c176bc6be6f1407e7c6bd062f05a8636ea9a08e3Daniel Dunbar  if (Arg *A = Args.getLastArg(options::OPT_mlinker_version_EQ)) {
1174c176bc6be6f1407e7c6bd062f05a8636ea9a08e3Daniel Dunbar    CmdArgs.push_back("-target-linker-version");
1175c176bc6be6f1407e7c6bd062f05a8636ea9a08e3Daniel Dunbar    CmdArgs.push_back(A->getValue(Args));
1176c176bc6be6f1407e7c6bd062f05a8636ea9a08e3Daniel Dunbar  }
1177c176bc6be6f1407e7c6bd062f05a8636ea9a08e3Daniel Dunbar
1178b2d11cc3abd5ddf421a9bd36c6ec558038748a83Nick Lewycky  // -mno-omit-leaf-frame-pointer is the default on Darwin.
11791ad6648cce57bd187f1853f58fef26cd9bf4934fDaniel Dunbar  if (Args.hasFlag(options::OPT_momit_leaf_frame_pointer,
1180b2d11cc3abd5ddf421a9bd36c6ec558038748a83Nick Lewycky                   options::OPT_mno_omit_leaf_frame_pointer,
1181b2d11cc3abd5ddf421a9bd36c6ec558038748a83Nick Lewycky                   getToolChain().getTriple().getOS() != llvm::Triple::Darwin))
11821ad6648cce57bd187f1853f58fef26cd9bf4934fDaniel Dunbar    CmdArgs.push_back("-momit-leaf-frame-pointer");
11831ad6648cce57bd187f1853f58fef26cd9bf4934fDaniel Dunbar
1184c31176d5ebbcd407aa512bbd5f717e35da629e7dDan Gohman  // -fno-math-errno is default.
1185c31176d5ebbcd407aa512bbd5f717e35da629e7dDan Gohman  if (Args.hasFlag(options::OPT_fmath_errno,
1186bc85be85779a47bae728bbe6a2cd2e3732b1333dDaniel Dunbar                   options::OPT_fno_math_errno,
1187c31176d5ebbcd407aa512bbd5f717e35da629e7dDan Gohman                   false))
1188c31176d5ebbcd407aa512bbd5f717e35da629e7dDan Gohman    CmdArgs.push_back("-fmath-errno");
11891d46033f760ba5fd266ce59fe391fac473f04f52Daniel Dunbar
1190b30575c22f249c0697df0cd2aa872d14d4fa9c57Daniel Dunbar  // Explicitly error on some things we know we don't support and can't just
1191b30575c22f249c0697df0cd2aa872d14d4fa9c57Daniel Dunbar  // ignore.
1192b30575c22f249c0697df0cd2aa872d14d4fa9c57Daniel Dunbar  types::ID InputType = Inputs[0].getType();
1193e94db4771856659c12e1f269141cbbc4e55b1c47Daniel Dunbar  if (!Args.hasArg(options::OPT_fallow_unsupported)) {
1194e94db4771856659c12e1f269141cbbc4e55b1c47Daniel Dunbar    Arg *Unsupported;
1195e94db4771856659c12e1f269141cbbc4e55b1c47Daniel Dunbar    if ((Unsupported = Args.getLastArg(options::OPT_MG)) ||
11969a2b9d794bdf349b517ff799170f4409f45d147cArgyrios Kyrtzidis        (Unsupported = Args.getLastArg(options::OPT_iframework)))
1197e94db4771856659c12e1f269141cbbc4e55b1c47Daniel Dunbar      D.Diag(clang::diag::err_drv_clang_unsupported)
1198b30575c22f249c0697df0cd2aa872d14d4fa9c57Daniel Dunbar        << Unsupported->getOption().getName();
1199e94db4771856659c12e1f269141cbbc4e55b1c47Daniel Dunbar
1200e94db4771856659c12e1f269141cbbc4e55b1c47Daniel Dunbar    if (types::isCXX(InputType) &&
1201e94db4771856659c12e1f269141cbbc4e55b1c47Daniel Dunbar        getToolChain().getTriple().getOS() == llvm::Triple::Darwin &&
1202e94db4771856659c12e1f269141cbbc4e55b1c47Daniel Dunbar        getToolChain().getTriple().getArch() == llvm::Triple::x86) {
1203e94db4771856659c12e1f269141cbbc4e55b1c47Daniel Dunbar      if ((Unsupported = Args.getLastArg(options::OPT_fapple_kext)))
1204e94db4771856659c12e1f269141cbbc4e55b1c47Daniel Dunbar        D.Diag(clang::diag::err_drv_clang_unsupported_opt_cxx_darwin_i386)
1205e94db4771856659c12e1f269141cbbc4e55b1c47Daniel Dunbar          << Unsupported->getOption().getName();
1206e94db4771856659c12e1f269141cbbc4e55b1c47Daniel Dunbar    }
1207b30575c22f249c0697df0cd2aa872d14d4fa9c57Daniel Dunbar  }
1208b30575c22f249c0697df0cd2aa872d14d4fa9c57Daniel Dunbar
12091d46033f760ba5fd266ce59fe391fac473f04f52Daniel Dunbar  Args.AddAllArgs(CmdArgs, options::OPT_v);
1210f7c16d903f11814e2d6780e2a2e189b7a7afc4edDaniel Dunbar  Args.AddLastArg(CmdArgs, options::OPT_H);
1211322c29fefe7fa33f03273136eb5f8b7f5b4df7c0Daniel Dunbar  if (D.CCPrintHeaders) {
1212322c29fefe7fa33f03273136eb5f8b7f5b4df7c0Daniel Dunbar    CmdArgs.push_back("-header-include-file");
1213322c29fefe7fa33f03273136eb5f8b7f5b4df7c0Daniel Dunbar    CmdArgs.push_back(D.CCPrintHeadersFilename ?
1214322c29fefe7fa33f03273136eb5f8b7f5b4df7c0Daniel Dunbar                      D.CCPrintHeadersFilename : "-");
1215322c29fefe7fa33f03273136eb5f8b7f5b4df7c0Daniel Dunbar  }
12161d46033f760ba5fd266ce59fe391fac473f04f52Daniel Dunbar  Args.AddLastArg(CmdArgs, options::OPT_P);
12171eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump  Args.AddLastArg(CmdArgs, options::OPT_print_ivar_layout);
12181d46033f760ba5fd266ce59fe391fac473f04f52Daniel Dunbar
12191d46033f760ba5fd266ce59fe391fac473f04f52Daniel Dunbar  // Special case debug options to only pass -g to clang. This is
12201d46033f760ba5fd266ce59fe391fac473f04f52Daniel Dunbar  // wrong.
122118f36d9eac8b425e8cfed389bbbf02c030f26be7Rafael Espindola  Args.ClaimAllArgs(options::OPT_g_Group);
12226b3d5a65cb486f46604d12a16831e8a228ee610fDaniel Dunbar  if (Arg *A = Args.getLastArg(options::OPT_g_Group))
12236b3d5a65cb486f46604d12a16831e8a228ee610fDaniel Dunbar    if (!A->getOption().matches(options::OPT_g0))
12246b3d5a65cb486f46604d12a16831e8a228ee610fDaniel Dunbar      CmdArgs.push_back("-g");
12251d46033f760ba5fd266ce59fe391fac473f04f52Daniel Dunbar
12269cf933a67e54bea5475c5027fee2c1cf7365ee05Rafael Espindola  Args.AddAllArgs(CmdArgs, options::OPT_ffunction_sections);
12279cf933a67e54bea5475c5027fee2c1cf7365ee05Rafael Espindola  Args.AddAllArgs(CmdArgs, options::OPT_fdata_sections);
12289cf933a67e54bea5475c5027fee2c1cf7365ee05Rafael Espindola
12297255a2d997b15beae82e627052fdb1b2474495c2Chris Lattner  Args.AddAllArgs(CmdArgs, options::OPT_finstrument_functions);
12307255a2d997b15beae82e627052fdb1b2474495c2Chris Lattner
12311d46033f760ba5fd266ce59fe391fac473f04f52Daniel Dunbar  Args.AddLastArg(CmdArgs, options::OPT_nostdinc);
12324c2bcad7b843c10fd4a2ffd43da40bfefb4dc8baDouglas Gregor  Args.AddLastArg(CmdArgs, options::OPT_nostdincxx);
12338d737cc78cb28f39179d6c7ca00eb5d3cf563129Rafael Espindola  Args.AddLastArg(CmdArgs, options::OPT_nobuiltininc);
12341d46033f760ba5fd266ce59fe391fac473f04f52Daniel Dunbar
12355f12232ef39e3d6c36d6600a73ebbe3c4a79f514Daniel Dunbar  // Pass the path to compiler resource files.
12365f12232ef39e3d6c36d6600a73ebbe3c4a79f514Daniel Dunbar  CmdArgs.push_back("-resource-dir");
1237225c41706dc0f3682236e351820d339e14390e00Daniel Dunbar  CmdArgs.push_back(D.ResourceDir.c_str());
12382ac9fc2ad64e16127df8c60caeea2edfe9a400a2Daniel Dunbar
1239389db16c63eec6ecfa9b235155252d8da766e94eArgyrios Kyrtzidis  Args.AddLastArg(CmdArgs, options::OPT_working_directory);
1240389db16c63eec6ecfa9b235155252d8da766e94eArgyrios Kyrtzidis
1241c21c485b4fb58ef5d55cf3e523263dd824a2ace4Daniel Dunbar  // Add preprocessing options like -I, -D, etc. if we are using the
1242c21c485b4fb58ef5d55cf3e523263dd824a2ace4Daniel Dunbar  // preprocessor.
1243c21c485b4fb58ef5d55cf3e523263dd824a2ace4Daniel Dunbar  //
1244c21c485b4fb58ef5d55cf3e523263dd824a2ace4Daniel Dunbar  // FIXME: Support -fpreprocessed
1245c21c485b4fb58ef5d55cf3e523263dd824a2ace4Daniel Dunbar  if (types::getPreprocessedType(InputType) != types::TY_INVALID)
1246df91ef3d6c55692a0236f67b6c6b134a3bf84098Douglas Gregor    AddPreprocessingOptions(D, Args, CmdArgs, Output, Inputs);
12471d46033f760ba5fd266ce59fe391fac473f04f52Daniel Dunbar
124820f0eacf1682e4594da9d318b5b13ed4f6d6e7e5Daniel Dunbar  // Manually translate -O to -O2 and -O4 to -O3; let clang reject
1249337a6271b98c4c183f7eaad1563a75260b4f2871Daniel Dunbar  // others.
1250337a6271b98c4c183f7eaad1563a75260b4f2871Daniel Dunbar  if (Arg *A = Args.getLastArg(options::OPT_O_Group)) {
1251b827a0541b5fd095fcdb7ad0c3df93ca158c619aDaniel Dunbar    if (A->getOption().matches(options::OPT_O4))
1252337a6271b98c4c183f7eaad1563a75260b4f2871Daniel Dunbar      CmdArgs.push_back("-O3");
1253473916c038f75fa3b0c51a0bc7afc5b082e5c22fDaniel Dunbar    else if (A->getOption().matches(options::OPT_O) &&
1254473916c038f75fa3b0c51a0bc7afc5b082e5c22fDaniel Dunbar             A->getValue(Args)[0] == '\0')
125520f0eacf1682e4594da9d318b5b13ed4f6d6e7e5Daniel Dunbar      CmdArgs.push_back("-O2");
12565e3bc947e305b307c6bd8e5d49b5b06e2fe6bbf4Daniel Dunbar    else if (A->getOption().matches(options::OPT_O) &&
12575e3bc947e305b307c6bd8e5d49b5b06e2fe6bbf4Daniel Dunbar             A->getValue(Args)[0] == 'z' &&
12585e3bc947e305b307c6bd8e5d49b5b06e2fe6bbf4Daniel Dunbar             A->getValue(Args)[1] == '\0')
12595e3bc947e305b307c6bd8e5d49b5b06e2fe6bbf4Daniel Dunbar      CmdArgs.push_back("-Os");
12601d46033f760ba5fd266ce59fe391fac473f04f52Daniel Dunbar    else
12615697aa0d75c87bafec78984048d558f8d12ca1b3Daniel Dunbar      A->render(Args, CmdArgs);
12621d46033f760ba5fd266ce59fe391fac473f04f52Daniel Dunbar  }
12631d46033f760ba5fd266ce59fe391fac473f04f52Daniel Dunbar
12646e8371eb97a08f724be22ae6042d1e9eacbe4c48Daniel Dunbar  Args.AddAllArgs(CmdArgs, options::OPT_W_Group);
12656e8371eb97a08f724be22ae6042d1e9eacbe4c48Daniel Dunbar  Args.AddLastArg(CmdArgs, options::OPT_pedantic);
12666e8371eb97a08f724be22ae6042d1e9eacbe4c48Daniel Dunbar  Args.AddLastArg(CmdArgs, options::OPT_pedantic_errors);
12671d46033f760ba5fd266ce59fe391fac473f04f52Daniel Dunbar  Args.AddLastArg(CmdArgs, options::OPT_w);
1268d573d26e1abcce24c31ece3d6f7af158db569e4cDaniel Dunbar
1269d573d26e1abcce24c31ece3d6f7af158db569e4cDaniel Dunbar  // Handle -{std, ansi, trigraphs} -- take the last of -{std, ansi}
1270d573d26e1abcce24c31ece3d6f7af158db569e4cDaniel Dunbar  // (-ansi is equivalent to -std=c89).
1271d573d26e1abcce24c31ece3d6f7af158db569e4cDaniel Dunbar  //
1272d573d26e1abcce24c31ece3d6f7af158db569e4cDaniel Dunbar  // If a std is supplied, only add -trigraphs if it follows the
1273d573d26e1abcce24c31ece3d6f7af158db569e4cDaniel Dunbar  // option.
1274d573d26e1abcce24c31ece3d6f7af158db569e4cDaniel Dunbar  if (Arg *Std = Args.getLastArg(options::OPT_std_EQ, options::OPT_ansi)) {
1275d573d26e1abcce24c31ece3d6f7af158db569e4cDaniel Dunbar    if (Std->getOption().matches(options::OPT_ansi))
1276528365d3189d27f3a90a4012baaa8b2814e0a231Nuno Lopes      if (types::isCXX(InputType))
1277294691eb1caf551083acd7b08630ef21c3fd760dDaniel Dunbar        CmdArgs.push_back("-std=c++98");
1278528365d3189d27f3a90a4012baaa8b2814e0a231Nuno Lopes      else
1279294691eb1caf551083acd7b08630ef21c3fd760dDaniel Dunbar        CmdArgs.push_back("-std=c89");
1280d573d26e1abcce24c31ece3d6f7af158db569e4cDaniel Dunbar    else
1281d573d26e1abcce24c31ece3d6f7af158db569e4cDaniel Dunbar      Std->render(Args, CmdArgs);
1282d573d26e1abcce24c31ece3d6f7af158db569e4cDaniel Dunbar
12830e10031ba5d0f9b3e5bc5570f39382d288779ab8Daniel Dunbar    if (Arg *A = Args.getLastArg(options::OPT_std_EQ, options::OPT_ansi,
12840e10031ba5d0f9b3e5bc5570f39382d288779ab8Daniel Dunbar                                 options::OPT_trigraphs))
12850e10031ba5d0f9b3e5bc5570f39382d288779ab8Daniel Dunbar      if (A != Std)
1286d573d26e1abcce24c31ece3d6f7af158db569e4cDaniel Dunbar        A->render(Args, CmdArgs);
1287a3ff202ee4fb21728e930d5d029ba4925129912cDaniel Dunbar  } else {
1288a3ff202ee4fb21728e930d5d029ba4925129912cDaniel Dunbar    // Honor -std-default.
12894a5290e773e70ec2c3b4353a3a4aa7d1a3e3cd66Daniel Dunbar    //
12904a5290e773e70ec2c3b4353a3a4aa7d1a3e3cd66Daniel Dunbar    // FIXME: Clang doesn't correctly handle -std= when the input language
12914a5290e773e70ec2c3b4353a3a4aa7d1a3e3cd66Daniel Dunbar    // doesn't match. For the time being just ignore this for C++ inputs;
12924a5290e773e70ec2c3b4353a3a4aa7d1a3e3cd66Daniel Dunbar    // eventually we want to do all the standard defaulting here instead of
12934a5290e773e70ec2c3b4353a3a4aa7d1a3e3cd66Daniel Dunbar    // splitting it between the driver and clang -cc1.
12944a5290e773e70ec2c3b4353a3a4aa7d1a3e3cd66Daniel Dunbar    if (!types::isCXX(InputType))
12954a5290e773e70ec2c3b4353a3a4aa7d1a3e3cd66Daniel Dunbar        Args.AddAllArgsTranslated(CmdArgs, options::OPT_std_default_EQ,
12964a5290e773e70ec2c3b4353a3a4aa7d1a3e3cd66Daniel Dunbar                                  "-std=", /*Joined=*/true);
1297d573d26e1abcce24c31ece3d6f7af158db569e4cDaniel Dunbar    Args.AddLastArg(CmdArgs, options::OPT_trigraphs);
1298a3ff202ee4fb21728e930d5d029ba4925129912cDaniel Dunbar  }
1299c21c485b4fb58ef5d55cf3e523263dd824a2ace4Daniel Dunbar
1300c304ba341a7daa88da42faf8f86310b764dd7b6aChandler Carruth  // Translate GCC's misnamer '-fasm' arguments to '-fgnu-keywords'.
1301c304ba341a7daa88da42faf8f86310b764dd7b6aChandler Carruth  if (Arg *Asm = Args.getLastArg(options::OPT_fasm, options::OPT_fno_asm)) {
1302c304ba341a7daa88da42faf8f86310b764dd7b6aChandler Carruth    if (Asm->getOption().matches(options::OPT_fasm))
1303c304ba341a7daa88da42faf8f86310b764dd7b6aChandler Carruth      CmdArgs.push_back("-fgnu-keywords");
1304c304ba341a7daa88da42faf8f86310b764dd7b6aChandler Carruth    else
1305c304ba341a7daa88da42faf8f86310b764dd7b6aChandler Carruth      CmdArgs.push_back("-fno-gnu-keywords");
1306c304ba341a7daa88da42faf8f86310b764dd7b6aChandler Carruth  }
1307c304ba341a7daa88da42faf8f86310b764dd7b6aChandler Carruth
13081d46033f760ba5fd266ce59fe391fac473f04f52Daniel Dunbar  if (Arg *A = Args.getLastArg(options::OPT_ftemplate_depth_)) {
13091d46033f760ba5fd266ce59fe391fac473f04f52Daniel Dunbar    CmdArgs.push_back("-ftemplate-depth");
13101d46033f760ba5fd266ce59fe391fac473f04f52Daniel Dunbar    CmdArgs.push_back(A->getValue(Args));
1311b488c1dac8e53206f07103d794a62a3f5012c0f4Daniel Dunbar  }
1312b488c1dac8e53206f07103d794a62a3f5012c0f4Daniel Dunbar
13131380a147d4578b619c215b23aa79ce17036d3c46Argyrios Kyrtzidis  if (Arg *A = Args.getLastArg(options::OPT_Wlarge_by_value_copy_EQ,
13141380a147d4578b619c215b23aa79ce17036d3c46Argyrios Kyrtzidis                               options::OPT_Wlarge_by_value_copy_def)) {
13151380a147d4578b619c215b23aa79ce17036d3c46Argyrios Kyrtzidis    CmdArgs.push_back("-Wlarge-by-value-copy");
13163532fdd1db8ff6f353f2a5b215cebe3e0e2ff3c2Argyrios Kyrtzidis    if (A->getNumValues())
13173532fdd1db8ff6f353f2a5b215cebe3e0e2ff3c2Argyrios Kyrtzidis      CmdArgs.push_back(A->getValue(Args));
13183532fdd1db8ff6f353f2a5b215cebe3e0e2ff3c2Argyrios Kyrtzidis    else
13191380a147d4578b619c215b23aa79ce17036d3c46Argyrios Kyrtzidis      CmdArgs.push_back("64"); // default value for -Wlarge-by-value-copy.
13203532fdd1db8ff6f353f2a5b215cebe3e0e2ff3c2Argyrios Kyrtzidis  }
13213532fdd1db8ff6f353f2a5b215cebe3e0e2ff3c2Argyrios Kyrtzidis
1322e4bdae78c69d2a09ee96619cc5ccf81441674412Daniel Dunbar  if (Args.hasArg(options::OPT__relocatable_pch))
132366861e09d590994a8b941eaa328e4d8f33adec9eDaniel Dunbar    CmdArgs.push_back("-relocatable-pch");
13241eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump
1325294691eb1caf551083acd7b08630ef21c3fd760dDaniel Dunbar  if (Arg *A = Args.getLastArg(options::OPT_fconstant_string_class_EQ)) {
1326294691eb1caf551083acd7b08630ef21c3fd760dDaniel Dunbar    CmdArgs.push_back("-fconstant-string-class");
1327294691eb1caf551083acd7b08630ef21c3fd760dDaniel Dunbar    CmdArgs.push_back(A->getValue(Args));
1328294691eb1caf551083acd7b08630ef21c3fd760dDaniel Dunbar  }
13298a5a9aaddb627c0884c2ed8db55cc29fdb601195David Chisnall
1330124fca533d9fef2e3f6359283909bd342b5f5f26Chris Lattner  if (Arg *A = Args.getLastArg(options::OPT_ftabstop_EQ)) {
1331124fca533d9fef2e3f6359283909bd342b5f5f26Chris Lattner    CmdArgs.push_back("-ftabstop");
1332124fca533d9fef2e3f6359283909bd342b5f5f26Chris Lattner    CmdArgs.push_back(A->getValue(Args));
1333124fca533d9fef2e3f6359283909bd342b5f5f26Chris Lattner  }
1334124fca533d9fef2e3f6359283909bd342b5f5f26Chris Lattner
13350f0c963f9b7ac6f0176c34d405d48fcb005dfab6Chris Lattner  CmdArgs.push_back("-ferror-limit");
13360f0c963f9b7ac6f0176c34d405d48fcb005dfab6Chris Lattner  if (Arg *A = Args.getLastArg(options::OPT_ferror_limit_EQ))
13370f0c963f9b7ac6f0176c34d405d48fcb005dfab6Chris Lattner    CmdArgs.push_back(A->getValue(Args));
13380f0c963f9b7ac6f0176c34d405d48fcb005dfab6Chris Lattner  else
13390f0c963f9b7ac6f0176c34d405d48fcb005dfab6Chris Lattner    CmdArgs.push_back("19");
1340575cf3791216c33770ba950430493cdd43099f8fDouglas Gregor
1341c40f73c6e715044d327409564bf3656254101d46Chandler Carruth  if (Arg *A = Args.getLastArg(options::OPT_fmacro_backtrace_limit_EQ)) {
1342c40f73c6e715044d327409564bf3656254101d46Chandler Carruth    CmdArgs.push_back("-fmacro-backtrace-limit");
13436c1cb9916e9988dcdd65b9266dbe24afd173427aDouglas Gregor    CmdArgs.push_back(A->getValue(Args));
1344c40f73c6e715044d327409564bf3656254101d46Chandler Carruth  }
1345c40f73c6e715044d327409564bf3656254101d46Chandler Carruth
1346c40f73c6e715044d327409564bf3656254101d46Chandler Carruth  if (Arg *A = Args.getLastArg(options::OPT_ftemplate_backtrace_limit_EQ)) {
1347c40f73c6e715044d327409564bf3656254101d46Chandler Carruth    CmdArgs.push_back("-ftemplate-backtrace-limit");
1348575cf3791216c33770ba950430493cdd43099f8fDouglas Gregor    CmdArgs.push_back(A->getValue(Args));
1349c40f73c6e715044d327409564bf3656254101d46Chandler Carruth  }
1350c40f73c6e715044d327409564bf3656254101d46Chandler Carruth
135155efe142a84b2aab6d0186c20a311c347a65f794Daniel Dunbar  // Pass -fmessage-length=.
1352a28690e5b0e423a6287ebe3a5565fd1896d7ebffDaniel Dunbar  CmdArgs.push_back("-fmessage-length");
135355efe142a84b2aab6d0186c20a311c347a65f794Daniel Dunbar  if (Arg *A = Args.getLastArg(options::OPT_fmessage_length_EQ)) {
1354a28690e5b0e423a6287ebe3a5565fd1896d7ebffDaniel Dunbar    CmdArgs.push_back(A->getValue(Args));
135555efe142a84b2aab6d0186c20a311c347a65f794Daniel Dunbar  } else {
135655efe142a84b2aab6d0186c20a311c347a65f794Daniel Dunbar    // If -fmessage-length=N was not specified, determine whether this is a
135755efe142a84b2aab6d0186c20a311c347a65f794Daniel Dunbar    // terminal and, if so, implicitly define -fmessage-length appropriately.
135855efe142a84b2aab6d0186c20a311c347a65f794Daniel Dunbar    unsigned N = llvm::sys::Process::StandardErrColumns();
135955efe142a84b2aab6d0186c20a311c347a65f794Daniel Dunbar    CmdArgs.push_back(Args.MakeArgString(llvm::Twine(N)));
136055efe142a84b2aab6d0186c20a311c347a65f794Daniel Dunbar  }
136155efe142a84b2aab6d0186c20a311c347a65f794Daniel Dunbar
1362ba8d86172c8d9e2476c6fd2415731639223174c5Daniel Dunbar  if (const Arg *A = Args.getLastArg(options::OPT_fvisibility_EQ)) {
1363ba8d86172c8d9e2476c6fd2415731639223174c5Daniel Dunbar    CmdArgs.push_back("-fvisibility");
1364ba8d86172c8d9e2476c6fd2415731639223174c5Daniel Dunbar    CmdArgs.push_back(A->getValue(Args));
1365ba8d86172c8d9e2476c6fd2415731639223174c5Daniel Dunbar  }
1366ba8d86172c8d9e2476c6fd2415731639223174c5Daniel Dunbar
13677cf84d66965a7706004d8590b5af5fe54b85f525Douglas Gregor  Args.AddLastArg(CmdArgs, options::OPT_fvisibility_inlines_hidden);
136820249a1af2e462dcafdd6a350f1c7967b264ff25Michael J. Spencer
13690a80ba74ffa3d3df55abfbc4474d7470c7c923e3Daniel Dunbar  // -fhosted is default.
13700a80ba74ffa3d3df55abfbc4474d7470c7c923e3Daniel Dunbar  if (KernelOrKext || Args.hasFlag(options::OPT_ffreestanding,
13710a80ba74ffa3d3df55abfbc4474d7470c7c923e3Daniel Dunbar                                   options::OPT_fhosted,
13720a80ba74ffa3d3df55abfbc4474d7470c7c923e3Daniel Dunbar                                   false))
13730a80ba74ffa3d3df55abfbc4474d7470c7c923e3Daniel Dunbar    CmdArgs.push_back("-ffreestanding");
13740a80ba74ffa3d3df55abfbc4474d7470c7c923e3Daniel Dunbar
1375ba8d86172c8d9e2476c6fd2415731639223174c5Daniel Dunbar  // Forward -f (flag) options which we can pass directly.
13769c276ae0f24d4cee8f7954069d4b8eae45d0447dMike Stump  Args.AddLastArg(CmdArgs, options::OPT_fcatch_undefined_behavior);
13773aaf082689d3235937a2e56a60f90fc1b3aebfb2Daniel Dunbar  Args.AddLastArg(CmdArgs, options::OPT_femit_all_decls);
13783aaf082689d3235937a2e56a60f90fc1b3aebfb2Daniel Dunbar  Args.AddLastArg(CmdArgs, options::OPT_fheinous_gnu_extensions);
1379c69e1cf04323f2e786d40e8a5ba84e77ee1c6827Devang Patel  Args.AddLastArg(CmdArgs, options::OPT_flimit_debug_info);
1380be4c8705e499b55548467eb7adaa23cbc6edfef9Roman Divacky  Args.AddLastArg(CmdArgs, options::OPT_pg);
13818c6fa84b2e4a30317b7b214a7657cb593d67773bDaniel Dunbar
13828c6fa84b2e4a30317b7b214a7657cb593d67773bDaniel Dunbar  // -flax-vector-conversions is default.
13838c6fa84b2e4a30317b7b214a7657cb593d67773bDaniel Dunbar  if (!Args.hasFlag(options::OPT_flax_vector_conversions,
13848c6fa84b2e4a30317b7b214a7657cb593d67773bDaniel Dunbar                    options::OPT_fno_lax_vector_conversions))
13858c6fa84b2e4a30317b7b214a7657cb593d67773bDaniel Dunbar    CmdArgs.push_back("-fno-lax-vector-conversions");
13868c6fa84b2e4a30317b7b214a7657cb593d67773bDaniel Dunbar
138743a9b3263cb0bcb050cc75c15b3e6a8951e6b97aDaniel Dunbar  // Handle -fobjc-gc and -fobjc-gc-only. They are exclusive, and -fobjc-gc-only
138843a9b3263cb0bcb050cc75c15b3e6a8951e6b97aDaniel Dunbar  // takes precedence.
138943a9b3263cb0bcb050cc75c15b3e6a8951e6b97aDaniel Dunbar  const Arg *GCArg = Args.getLastArg(options::OPT_fobjc_gc_only);
139043a9b3263cb0bcb050cc75c15b3e6a8951e6b97aDaniel Dunbar  if (!GCArg)
139143a9b3263cb0bcb050cc75c15b3e6a8951e6b97aDaniel Dunbar    GCArg = Args.getLastArg(options::OPT_fobjc_gc);
139243a9b3263cb0bcb050cc75c15b3e6a8951e6b97aDaniel Dunbar  if (GCArg) {
139343a9b3263cb0bcb050cc75c15b3e6a8951e6b97aDaniel Dunbar    if (getToolChain().SupportsObjCGC()) {
139443a9b3263cb0bcb050cc75c15b3e6a8951e6b97aDaniel Dunbar      GCArg->render(Args, CmdArgs);
139543a9b3263cb0bcb050cc75c15b3e6a8951e6b97aDaniel Dunbar    } else {
139643a9b3263cb0bcb050cc75c15b3e6a8951e6b97aDaniel Dunbar      // FIXME: We should move this to a hard error.
139743a9b3263cb0bcb050cc75c15b3e6a8951e6b97aDaniel Dunbar      D.Diag(clang::diag::warn_drv_objc_gc_unsupported)
139843a9b3263cb0bcb050cc75c15b3e6a8951e6b97aDaniel Dunbar        << GCArg->getAsString(Args);
139943a9b3263cb0bcb050cc75c15b3e6a8951e6b97aDaniel Dunbar    }
140043a9b3263cb0bcb050cc75c15b3e6a8951e6b97aDaniel Dunbar  }
140143a9b3263cb0bcb050cc75c15b3e6a8951e6b97aDaniel Dunbar
1402b466d01e464b21832c23eeed90112bc5c26c0236Fariborz Jahanian  if (Args.getLastArg(options::OPT_fapple_kext))
1403b466d01e464b21832c23eeed90112bc5c26c0236Fariborz Jahanian    CmdArgs.push_back("-fapple-kext");
1404b466d01e464b21832c23eeed90112bc5c26c0236Fariborz Jahanian
14053aaf082689d3235937a2e56a60f90fc1b3aebfb2Daniel Dunbar  Args.AddLastArg(CmdArgs, options::OPT_fno_show_column);
140634e65770ad6142b033d6cec4f476ed20fb248bf3Fariborz Jahanian  Args.AddLastArg(CmdArgs, options::OPT_fobjc_sender_dependent_dispatch);
1407182e09240a33c6f1d303deecabec6e0e9c9d109dChris Lattner  Args.AddLastArg(CmdArgs, options::OPT_fdiagnostics_print_source_range_info);
14084786c15f4977c7cee98fde3ebdee213dba23848bDouglas Gregor  Args.AddLastArg(CmdArgs, options::OPT_fdiagnostics_parseable_fixits);
14093aaf082689d3235937a2e56a60f90fc1b3aebfb2Daniel Dunbar  Args.AddLastArg(CmdArgs, options::OPT_ftime_report);
14103aaf082689d3235937a2e56a60f90fc1b3aebfb2Daniel Dunbar  Args.AddLastArg(CmdArgs, options::OPT_ftrapv);
14117f18e67e1b577a50402e8b43508ab2311a5c45b5David Chisnall
14127f18e67e1b577a50402e8b43508ab2311a5c45b5David Chisnall  if (Arg *A = Args.getLastArg(options::OPT_ftrapv_handler_EQ)) {
14137f18e67e1b577a50402e8b43508ab2311a5c45b5David Chisnall    CmdArgs.push_back("-ftrapv-handler");
14147f18e67e1b577a50402e8b43508ab2311a5c45b5David Chisnall    CmdArgs.push_back(A->getValue(Args));
14157f18e67e1b577a50402e8b43508ab2311a5c45b5David Chisnall  }
14167f18e67e1b577a50402e8b43508ab2311a5c45b5David Chisnall
1417a4d71455f0d418e16cc0c5c5aa55a3bad3494aeeChris Lattner  Args.AddLastArg(CmdArgs, options::OPT_fwrapv);
14183aaf082689d3235937a2e56a60f90fc1b3aebfb2Daniel Dunbar  Args.AddLastArg(CmdArgs, options::OPT_fwritable_strings);
1419f84d409903dd4107c8cef5a08fcfce6e5c21d4deEric Christopher  Args.AddLastArg(CmdArgs, options::OPT_funroll_loops);
14201d46033f760ba5fd266ce59fe391fac473f04f52Daniel Dunbar
14215345c391c65d1780a0d7b0102b7f735cc3f82732Daniel Dunbar  Args.AddLastArg(CmdArgs, options::OPT_pthread);
14225345c391c65d1780a0d7b0102b7f735cc3f82732Daniel Dunbar
14239e5cc6b703b2d0013f13800c2ffbeb3cf85fcfadDaniel Dunbar  // -stack-protector=0 is default.
14249e5cc6b703b2d0013f13800c2ffbeb3cf85fcfadDaniel Dunbar  unsigned StackProtectorLevel = 0;
142545483f7a1b3e57b4603b141bee80596b2d4dd443Bill Wendling  if (Arg *A = Args.getLastArg(options::OPT_fno_stack_protector,
142645483f7a1b3e57b4603b141bee80596b2d4dd443Bill Wendling                               options::OPT_fstack_protector_all,
142745483f7a1b3e57b4603b141bee80596b2d4dd443Bill Wendling                               options::OPT_fstack_protector)) {
14289e5cc6b703b2d0013f13800c2ffbeb3cf85fcfadDaniel Dunbar    if (A->getOption().matches(options::OPT_fstack_protector))
14299e5cc6b703b2d0013f13800c2ffbeb3cf85fcfadDaniel Dunbar      StackProtectorLevel = 1;
14309e5cc6b703b2d0013f13800c2ffbeb3cf85fcfadDaniel Dunbar    else if (A->getOption().matches(options::OPT_fstack_protector_all))
14319e5cc6b703b2d0013f13800c2ffbeb3cf85fcfadDaniel Dunbar      StackProtectorLevel = 2;
14329e5cc6b703b2d0013f13800c2ffbeb3cf85fcfadDaniel Dunbar  } else
14339e5cc6b703b2d0013f13800c2ffbeb3cf85fcfadDaniel Dunbar    StackProtectorLevel = getToolChain().GetDefaultStackProtectorLevel();
14349e5cc6b703b2d0013f13800c2ffbeb3cf85fcfadDaniel Dunbar  if (StackProtectorLevel) {
14359e5cc6b703b2d0013f13800c2ffbeb3cf85fcfadDaniel Dunbar    CmdArgs.push_back("-stack-protector");
14369e5cc6b703b2d0013f13800c2ffbeb3cf85fcfadDaniel Dunbar    CmdArgs.push_back(Args.MakeArgString(llvm::Twine(StackProtectorLevel)));
143745483f7a1b3e57b4603b141bee80596b2d4dd443Bill Wendling  }
143845483f7a1b3e57b4603b141bee80596b2d4dd443Bill Wendling
143948d1ef782c8c88066b5febf60f8f456064d7d3f0Daniel Dunbar  // Forward -f options with positive and negative forms; we translate
144048d1ef782c8c88066b5febf60f8f456064d7d3f0Daniel Dunbar  // these by hand.
144148d1ef782c8c88066b5febf60f8f456064d7d3f0Daniel Dunbar
1442b466d01e464b21832c23eeed90112bc5c26c0236Fariborz Jahanian  if (Args.hasArg(options::OPT_mkernel)) {
14432843c1900b6da763885f47d0999e923e7c67fd65Daniel Dunbar    if (!Args.hasArg(options::OPT_fapple_kext) && types::isCXX(InputType))
1444b466d01e464b21832c23eeed90112bc5c26c0236Fariborz Jahanian      CmdArgs.push_back("-fapple-kext");
1445b466d01e464b21832c23eeed90112bc5c26c0236Fariborz Jahanian    if (!Args.hasArg(options::OPT_fbuiltin))
1446b466d01e464b21832c23eeed90112bc5c26c0236Fariborz Jahanian      CmdArgs.push_back("-fno-builtin");
1447b466d01e464b21832c23eeed90112bc5c26c0236Fariborz Jahanian  }
14489e5cc6b703b2d0013f13800c2ffbeb3cf85fcfadDaniel Dunbar  // -fbuiltin is default.
1449b466d01e464b21832c23eeed90112bc5c26c0236Fariborz Jahanian  else if (!Args.hasFlag(options::OPT_fbuiltin, options::OPT_fno_builtin))
145053e8484581ca358c3a2ccd8ea39c136c6e85d606Daniel Dunbar    CmdArgs.push_back("-fno-builtin");
145148d1ef782c8c88066b5febf60f8f456064d7d3f0Daniel Dunbar
1452fc2844846e91398205fddc71196fe9dda04e105fNuno Lopes  if (!Args.hasFlag(options::OPT_fassume_sane_operator_new,
1453fc2844846e91398205fddc71196fe9dda04e105fNuno Lopes                    options::OPT_fno_assume_sane_operator_new))
1454fc2844846e91398205fddc71196fe9dda04e105fNuno Lopes    CmdArgs.push_back("-fno-assume-sane-operator-new");
1455fc2844846e91398205fddc71196fe9dda04e105fNuno Lopes
14569e5cc6b703b2d0013f13800c2ffbeb3cf85fcfadDaniel Dunbar  // -fblocks=0 is default.
14579e5cc6b703b2d0013f13800c2ffbeb3cf85fcfadDaniel Dunbar  if (Args.hasFlag(options::OPT_fblocks, options::OPT_fno_blocks,
1458e6533ffc680e84cd193b4ea0d81548e251cb1f2fDavid Chisnall                   getToolChain().IsBlocksDefault()) ||
1459e6533ffc680e84cd193b4ea0d81548e251cb1f2fDavid Chisnall        (Args.hasArg(options::OPT_fgnu_runtime) &&
1460e6533ffc680e84cd193b4ea0d81548e251cb1f2fDavid Chisnall         Args.hasArg(options::OPT_fobjc_nonfragile_abi) &&
1461e6533ffc680e84cd193b4ea0d81548e251cb1f2fDavid Chisnall         !Args.hasArg(options::OPT_fno_blocks))) {
14629e5cc6b703b2d0013f13800c2ffbeb3cf85fcfadDaniel Dunbar    CmdArgs.push_back("-fblocks");
14635e530af5d51572a0ed5dbe50da54bd333840c63dDavid Chisnall  }
146448d1ef782c8c88066b5febf60f8f456064d7d3f0Daniel Dunbar
146532579cf507d088e776b67327c5d6bc46e1f217ccJohn McCall  // -faccess-control is default.
14667002f4c03c2d0544f4e8bea8d3a5636519081e35John McCall  if (Args.hasFlag(options::OPT_fno_access_control,
14677002f4c03c2d0544f4e8bea8d3a5636519081e35John McCall                   options::OPT_faccess_control,
146832579cf507d088e776b67327c5d6bc46e1f217ccJohn McCall                   false))
14697002f4c03c2d0544f4e8bea8d3a5636519081e35John McCall    CmdArgs.push_back("-fno-access-control");
14703ddd6e026a173e9519e84e27f8d6aed5473b8b4eJohn McCall
1471a4c2475961184a4bad6f6f087eeb1038bb784cadAnders Carlsson  // -felide-constructors is the default.
1472a4c2475961184a4bad6f6f087eeb1038bb784cadAnders Carlsson  if (Args.hasFlag(options::OPT_fno_elide_constructors,
1473a4c2475961184a4bad6f6f087eeb1038bb784cadAnders Carlsson                   options::OPT_felide_constructors,
1474a4c2475961184a4bad6f6f087eeb1038bb784cadAnders Carlsson                   false))
1475a4c2475961184a4bad6f6f087eeb1038bb784cadAnders Carlsson    CmdArgs.push_back("-fno-elide-constructors");
1476a4c2475961184a4bad6f6f087eeb1038bb784cadAnders Carlsson
147715348aeb81285c75b2e92b5bf8d2db3445d147c2Anders Carlsson  // Add exception args.
147815348aeb81285c75b2e92b5bf8d2db3445d147c2Anders Carlsson  addExceptionArgs(Args, InputType, getToolChain().getTriple(),
147915348aeb81285c75b2e92b5bf8d2db3445d147c2Anders Carlsson                   KernelOrKext, IsRewriter, CmdArgs);
1480738f8c278da5950d0d4607de2debe0bdfad64185Mike Stump
1481b2987d159a88ab0ee2e40c884eb4d77b42ab89b6Daniel Dunbar  if (getToolChain().UseSjLjExceptions())
1482b2987d159a88ab0ee2e40c884eb4d77b42ab89b6Daniel Dunbar    CmdArgs.push_back("-fsjlj-exceptions");
1483b2987d159a88ab0ee2e40c884eb4d77b42ab89b6Daniel Dunbar
14840be42c44f0199c5023b542d6a6d2e66eb594f27dDaniel Dunbar  // -frtti is default.
14850a80ba74ffa3d3df55abfbc4474d7470c7c923e3Daniel Dunbar  if (KernelOrKext ||
14860a80ba74ffa3d3df55abfbc4474d7470c7c923e3Daniel Dunbar      !Args.hasFlag(options::OPT_frtti, options::OPT_fno_rtti))
148753e8484581ca358c3a2ccd8ea39c136c6e85d606Daniel Dunbar    CmdArgs.push_back("-fno-rtti");
1488738f8c278da5950d0d4607de2debe0bdfad64185Mike Stump
14899a2b9d794bdf349b517ff799170f4409f45d147cArgyrios Kyrtzidis  // -fshort-enums=0 is default.
14909a2b9d794bdf349b517ff799170f4409f45d147cArgyrios Kyrtzidis  // FIXME: Are there targers where -fshort-enums is on by default ?
14919a2b9d794bdf349b517ff799170f4409f45d147cArgyrios Kyrtzidis  if (Args.hasFlag(options::OPT_fshort_enums,
14929a2b9d794bdf349b517ff799170f4409f45d147cArgyrios Kyrtzidis                   options::OPT_fno_short_enums, false))
14939a2b9d794bdf349b517ff799170f4409f45d147cArgyrios Kyrtzidis    CmdArgs.push_back("-fshort-enums");
14949a2b9d794bdf349b517ff799170f4409f45d147cArgyrios Kyrtzidis
14951f95e6567faab67f4363d650f73121359c4bdbabDaniel Dunbar  // -fsigned-char is default.
14966d2eb4d07d40795131f28d719ef9146a2be500f6Daniel Dunbar  if (!Args.hasFlag(options::OPT_fsigned_char, options::OPT_funsigned_char,
14971f95e6567faab67f4363d650f73121359c4bdbabDaniel Dunbar                    isSignedCharDefault(getToolChain().getTriple())))
14987674352cf3e8f699914a2f739f1ae8c8c3480813Daniel Dunbar    CmdArgs.push_back("-fno-signed-char");
14995a77973d9bc2c9cdbdb7860dcf3ac795abe258ecEli Friedman
1500a508b7de6c5246ab04ed69d0ab4e9977ec1fb4d4Anders Carlsson  // -fthreadsafe-static is default.
150120249a1af2e462dcafdd6a350f1c7967b264ff25Michael J. Spencer  if (!Args.hasFlag(options::OPT_fthreadsafe_statics,
1502a508b7de6c5246ab04ed69d0ab4e9977ec1fb4d4Anders Carlsson                    options::OPT_fno_threadsafe_statics))
1503a508b7de6c5246ab04ed69d0ab4e9977ec1fb4d4Anders Carlsson    CmdArgs.push_back("-fno-threadsafe-statics");
1504a508b7de6c5246ab04ed69d0ab4e9977ec1fb4d4Anders Carlsson
1505efb0fa9e11f75af51744a6159530ef7cc8efa24aDaniel Dunbar  // -fuse-cxa-atexit is default.
1506d0a57d53223eccb482757c5aab436e8bd5a9c794Anton Korobeynikov  if (KernelOrKext ||
1507d0a57d53223eccb482757c5aab436e8bd5a9c794Anton Korobeynikov    !Args.hasFlag(options::OPT_fuse_cxa_atexit, options::OPT_fno_use_cxa_atexit,
1508cd7a30b12c6780d790f4c7924aff05caee05670dNAKAMURA Takumi                  getToolChain().getTriple().getOS() != llvm::Triple::Cygwin &&
15090aa205765aec0aa5eed672f8e3cade543372edcdNAKAMURA Takumi                  getToolChain().getTriple().getOS() != llvm::Triple::MinGW32))
1510efb0fa9e11f75af51744a6159530ef7cc8efa24aDaniel Dunbar    CmdArgs.push_back("-fno-use-cxa-atexit");
1511efb0fa9e11f75af51744a6159530ef7cc8efa24aDaniel Dunbar
15120be42c44f0199c5023b542d6a6d2e66eb594f27dDaniel Dunbar  // -fms-extensions=0 is default.
15136d2eb4d07d40795131f28d719ef9146a2be500f6Daniel Dunbar  if (Args.hasFlag(options::OPT_fms_extensions, options::OPT_fno_ms_extensions,
15140be42c44f0199c5023b542d6a6d2e66eb594f27dDaniel Dunbar                   getToolChain().getTriple().getOS() == llvm::Triple::Win32))
15150be42c44f0199c5023b542d6a6d2e66eb594f27dDaniel Dunbar    CmdArgs.push_back("-fms-extensions");
15160be42c44f0199c5023b542d6a6d2e66eb594f27dDaniel Dunbar
1517dae4ac4fe56ec60fc93b3e3c9f51e79e682084b9Michael J. Spencer  // -fmsc-version=1300 is default.
1518dae4ac4fe56ec60fc93b3e3c9f51e79e682084b9Michael J. Spencer  if (Args.hasFlag(options::OPT_fms_extensions, options::OPT_fno_ms_extensions,
1519dae4ac4fe56ec60fc93b3e3c9f51e79e682084b9Michael J. Spencer                   getToolChain().getTriple().getOS() == llvm::Triple::Win32) ||
1520dae4ac4fe56ec60fc93b3e3c9f51e79e682084b9Michael J. Spencer      Args.hasArg(options::OPT_fmsc_version)) {
1521dae4ac4fe56ec60fc93b3e3c9f51e79e682084b9Michael J. Spencer    llvm::StringRef msc_ver = Args.getLastArgValue(options::OPT_fmsc_version);
1522dae4ac4fe56ec60fc93b3e3c9f51e79e682084b9Michael J. Spencer    if (msc_ver.empty())
1523dae4ac4fe56ec60fc93b3e3c9f51e79e682084b9Michael J. Spencer      CmdArgs.push_back("-fmsc-version=1300");
1524dae4ac4fe56ec60fc93b3e3c9f51e79e682084b9Michael J. Spencer    else
1525dae4ac4fe56ec60fc93b3e3c9f51e79e682084b9Michael J. Spencer      CmdArgs.push_back(Args.MakeArgString("-fmsc-version=" + msc_ver));
1526dae4ac4fe56ec60fc93b3e3c9f51e79e682084b9Michael J. Spencer  }
1527dae4ac4fe56ec60fc93b3e3c9f51e79e682084b9Michael J. Spencer
1528dae4ac4fe56ec60fc93b3e3c9f51e79e682084b9Michael J. Spencer
1529400b607546a8dbfcee3b690f3d0a2fee0ea6480bDawn Perchik  // -fborland-extensions=0 is default.
1530400b607546a8dbfcee3b690f3d0a2fee0ea6480bDawn Perchik  if (Args.hasFlag(options::OPT_fborland_extensions,
1531400b607546a8dbfcee3b690f3d0a2fee0ea6480bDawn Perchik                   options::OPT_fno_borland_extensions, false))
1532400b607546a8dbfcee3b690f3d0a2fee0ea6480bDawn Perchik    CmdArgs.push_back("-fborland-extensions");
1533400b607546a8dbfcee3b690f3d0a2fee0ea6480bDawn Perchik
1534eb5d7b752651283de5abfcc2f91df7227582a08dChandler Carruth  // -fgnu-keywords default varies depending on language; only pass if
1535eb5d7b752651283de5abfcc2f91df7227582a08dChandler Carruth  // specified.
1536eb5d7b752651283de5abfcc2f91df7227582a08dChandler Carruth  if (Arg *A = Args.getLastArg(options::OPT_fgnu_keywords,
153740788d909ad52fc732fe0769d0ef22e5edad5e47Daniel Dunbar                               options::OPT_fno_gnu_keywords))
153840788d909ad52fc732fe0769d0ef22e5edad5e47Daniel Dunbar    A->render(Args, CmdArgs);
1539eb5d7b752651283de5abfcc2f91df7227582a08dChandler Carruth
15405314e448631f166c89e908cc1ab45dc7eda916baDaniel Dunbar  // -fnext-runtime defaults to on Darwin and when rewriting Objective-C, and is
15415314e448631f166c89e908cc1ab45dc7eda916baDaniel Dunbar  // -the -cc1 default.
154220249a1af2e462dcafdd6a350f1c7967b264ff25Michael J. Spencer  bool NeXTRuntimeIsDefault =
15435314e448631f166c89e908cc1ab45dc7eda916baDaniel Dunbar    IsRewriter || getToolChain().getTriple().getOS() == llvm::Triple::Darwin;
15446d2eb4d07d40795131f28d719ef9146a2be500f6Daniel Dunbar  if (!Args.hasFlag(options::OPT_fnext_runtime, options::OPT_fgnu_runtime,
15455314e448631f166c89e908cc1ab45dc7eda916baDaniel Dunbar                    NeXTRuntimeIsDefault))
1546c5a97ec19408c3dca4b6a6385f11d8c783b94d0bDaniel Dunbar    CmdArgs.push_back("-fgnu-runtime");
1547c5a97ec19408c3dca4b6a6385f11d8c783b94d0bDaniel Dunbar
15489e5cc6b703b2d0013f13800c2ffbeb3cf85fcfadDaniel Dunbar  // -fobjc-nonfragile-abi=0 is default.
15499e5cc6b703b2d0013f13800c2ffbeb3cf85fcfadDaniel Dunbar  if (types::isObjC(InputType)) {
1550dea63134a51d463cf32f3eec3c359d9215359d69Daniel Dunbar    // Compute the Objective-C ABI "version" to use. Version numbers are
1551dea63134a51d463cf32f3eec3c359d9215359d69Daniel Dunbar    // slightly confusing for historical reasons:
1552dea63134a51d463cf32f3eec3c359d9215359d69Daniel Dunbar    //   1 - Traditional "fragile" ABI
1553dea63134a51d463cf32f3eec3c359d9215359d69Daniel Dunbar    //   2 - Non-fragile ABI, version 1
1554dea63134a51d463cf32f3eec3c359d9215359d69Daniel Dunbar    //   3 - Non-fragile ABI, version 2
15555e2a8ac6599f0c68b14afb2f328ac98b264f770aDaniel Dunbar    unsigned Version = 1;
1556dea63134a51d463cf32f3eec3c359d9215359d69Daniel Dunbar    // If -fobjc-abi-version= is present, use that to set the version.
15575e2a8ac6599f0c68b14afb2f328ac98b264f770aDaniel Dunbar    if (Arg *A = Args.getLastArg(options::OPT_fobjc_abi_version_EQ)) {
15585e2a8ac6599f0c68b14afb2f328ac98b264f770aDaniel Dunbar      if (llvm::StringRef(A->getValue(Args)) == "1")
15595e2a8ac6599f0c68b14afb2f328ac98b264f770aDaniel Dunbar        Version = 1;
15605e2a8ac6599f0c68b14afb2f328ac98b264f770aDaniel Dunbar      else if (llvm::StringRef(A->getValue(Args)) == "2")
15615e2a8ac6599f0c68b14afb2f328ac98b264f770aDaniel Dunbar        Version = 2;
15625f81d8aa26ad4de6568772c4768b272af96c18beFariborz Jahanian      else if (llvm::StringRef(A->getValue(Args)) == "3")
15635f81d8aa26ad4de6568772c4768b272af96c18beFariborz Jahanian        Version = 3;
15645e2a8ac6599f0c68b14afb2f328ac98b264f770aDaniel Dunbar      else
15655e2a8ac6599f0c68b14afb2f328ac98b264f770aDaniel Dunbar        D.Diag(clang::diag::err_drv_clang_unsupported) << A->getAsString(Args);
1566dea63134a51d463cf32f3eec3c359d9215359d69Daniel Dunbar    } else {
1567dea63134a51d463cf32f3eec3c359d9215359d69Daniel Dunbar      // Otherwise, determine if we are using the non-fragile ABI.
1568dea63134a51d463cf32f3eec3c359d9215359d69Daniel Dunbar      if (Args.hasFlag(options::OPT_fobjc_nonfragile_abi,
1569dea63134a51d463cf32f3eec3c359d9215359d69Daniel Dunbar                       options::OPT_fno_objc_nonfragile_abi,
1570dea63134a51d463cf32f3eec3c359d9215359d69Daniel Dunbar                       getToolChain().IsObjCNonFragileABIDefault())) {
1571dea63134a51d463cf32f3eec3c359d9215359d69Daniel Dunbar        // Determine the non-fragile ABI version to use.
1572de17ba7af23bd3693add73af127600b568cb210bDaniel Dunbar#ifdef DISABLE_DEFAULT_NONFRAGILEABI_TWO
1573de17ba7af23bd3693add73af127600b568cb210bDaniel Dunbar        unsigned NonFragileABIVersion = 1;
1574de17ba7af23bd3693add73af127600b568cb210bDaniel Dunbar#else
1575dea63134a51d463cf32f3eec3c359d9215359d69Daniel Dunbar        unsigned NonFragileABIVersion = 2;
1576de17ba7af23bd3693add73af127600b568cb210bDaniel Dunbar#endif
1577dea63134a51d463cf32f3eec3c359d9215359d69Daniel Dunbar
1578dea63134a51d463cf32f3eec3c359d9215359d69Daniel Dunbar        if (Arg *A = Args.getLastArg(
1579dea63134a51d463cf32f3eec3c359d9215359d69Daniel Dunbar              options::OPT_fobjc_nonfragile_abi_version_EQ)) {
1580dea63134a51d463cf32f3eec3c359d9215359d69Daniel Dunbar          if (llvm::StringRef(A->getValue(Args)) == "1")
1581dea63134a51d463cf32f3eec3c359d9215359d69Daniel Dunbar            NonFragileABIVersion = 1;
1582dea63134a51d463cf32f3eec3c359d9215359d69Daniel Dunbar          else if (llvm::StringRef(A->getValue(Args)) == "2")
1583dea63134a51d463cf32f3eec3c359d9215359d69Daniel Dunbar            NonFragileABIVersion = 2;
1584dea63134a51d463cf32f3eec3c359d9215359d69Daniel Dunbar          else
1585dea63134a51d463cf32f3eec3c359d9215359d69Daniel Dunbar            D.Diag(clang::diag::err_drv_clang_unsupported)
1586dea63134a51d463cf32f3eec3c359d9215359d69Daniel Dunbar              << A->getAsString(Args);
1587dea63134a51d463cf32f3eec3c359d9215359d69Daniel Dunbar        }
1588dea63134a51d463cf32f3eec3c359d9215359d69Daniel Dunbar
1589dea63134a51d463cf32f3eec3c359d9215359d69Daniel Dunbar        Version = 1 + NonFragileABIVersion;
1590dea63134a51d463cf32f3eec3c359d9215359d69Daniel Dunbar      } else {
1591dea63134a51d463cf32f3eec3c359d9215359d69Daniel Dunbar        Version = 1;
1592dea63134a51d463cf32f3eec3c359d9215359d69Daniel Dunbar      }
15935e2a8ac6599f0c68b14afb2f328ac98b264f770aDaniel Dunbar    }
159420249a1af2e462dcafdd6a350f1c7967b264ff25Michael J. Spencer
15955f81d8aa26ad4de6568772c4768b272af96c18beFariborz Jahanian    if (Version == 2 || Version == 3) {
1596112c3307aaa9ae9ee6ff5c2b4f6a53b1ea3c6f19Fariborz Jahanian      CmdArgs.push_back("-fobjc-nonfragile-abi");
1597f643b9b338b797a824447207d7eab5f1187f4f34Daniel Dunbar
1598f643b9b338b797a824447207d7eab5f1187f4f34Daniel Dunbar      // -fobjc-dispatch-method is only relevant with the nonfragile-abi, and
1599f643b9b338b797a824447207d7eab5f1187f4f34Daniel Dunbar      // legacy is the default.
1600f643b9b338b797a824447207d7eab5f1187f4f34Daniel Dunbar      if (!Args.hasFlag(options::OPT_fobjc_legacy_dispatch,
1601f643b9b338b797a824447207d7eab5f1187f4f34Daniel Dunbar                        options::OPT_fno_objc_legacy_dispatch,
1602f643b9b338b797a824447207d7eab5f1187f4f34Daniel Dunbar                        getToolChain().IsObjCLegacyDispatchDefault())) {
1603f643b9b338b797a824447207d7eab5f1187f4f34Daniel Dunbar        if (getToolChain().UseObjCMixedDispatch())
1604f643b9b338b797a824447207d7eab5f1187f4f34Daniel Dunbar          CmdArgs.push_back("-fobjc-dispatch-method=mixed");
1605f643b9b338b797a824447207d7eab5f1187f4f34Daniel Dunbar        else
1606f643b9b338b797a824447207d7eab5f1187f4f34Daniel Dunbar          CmdArgs.push_back("-fobjc-dispatch-method=non-legacy");
1607f643b9b338b797a824447207d7eab5f1187f4f34Daniel Dunbar      }
1608984eb8611d9ee46fc6351dee43609f2deed99f3cDaniel Dunbar    }
1609125b4cb35536e45201f8f2cb19ee620e3ad67c49NAKAMURA Takumi
1610c32647d111e516593b9ba242cad7b8ff4016c155Ted Kremenek    // -fobjc-default-synthesize-properties=0 is default.
1611c32647d111e516593b9ba242cad7b8ff4016c155Ted Kremenek    if (Args.hasFlag(options::OPT_fobjc_default_synthesize_properties,
1612c32647d111e516593b9ba242cad7b8ff4016c155Ted Kremenek                     options::OPT_fno_objc_default_synthesize_properties,
1613c32647d111e516593b9ba242cad7b8ff4016c155Ted Kremenek                     getToolChain().IsObjCDefaultSynthPropertiesDefault())) {
1614c32647d111e516593b9ba242cad7b8ff4016c155Ted Kremenek      CmdArgs.push_back("-fobjc-default-synthesize-properties");
1615c32647d111e516593b9ba242cad7b8ff4016c155Ted Kremenek    }
16169e5cc6b703b2d0013f13800c2ffbeb3cf85fcfadDaniel Dunbar  }
16179e5cc6b703b2d0013f13800c2ffbeb3cf85fcfadDaniel Dunbar
1618984eb8611d9ee46fc6351dee43609f2deed99f3cDaniel Dunbar  if (!Args.hasFlag(options::OPT_fassume_sane_operator_new,
1619984eb8611d9ee46fc6351dee43609f2deed99f3cDaniel Dunbar                    options::OPT_fno_assume_sane_operator_new))
1620984eb8611d9ee46fc6351dee43609f2deed99f3cDaniel Dunbar    CmdArgs.push_back("-fno-assume-sane-operator-new");
1621984eb8611d9ee46fc6351dee43609f2deed99f3cDaniel Dunbar
1622f35f14d474632142280ec1526d16e87706ce6625Daniel Dunbar  // -fconstant-cfstrings is default, and may be subject to argument translation
1623f35f14d474632142280ec1526d16e87706ce6625Daniel Dunbar  // on Darwin.
1624f35f14d474632142280ec1526d16e87706ce6625Daniel Dunbar  if (!Args.hasFlag(options::OPT_fconstant_cfstrings,
1625f35f14d474632142280ec1526d16e87706ce6625Daniel Dunbar                    options::OPT_fno_constant_cfstrings) ||
1626f35f14d474632142280ec1526d16e87706ce6625Daniel Dunbar      !Args.hasFlag(options::OPT_mconstant_cfstrings,
1627f35f14d474632142280ec1526d16e87706ce6625Daniel Dunbar                    options::OPT_mno_constant_cfstrings))
1628f35f14d474632142280ec1526d16e87706ce6625Daniel Dunbar    CmdArgs.push_back("-fno-constant-cfstrings");
1629f35f14d474632142280ec1526d16e87706ce6625Daniel Dunbar
1630a6fda124bf380479529d6a80b84b62cacd3cb707John Thompson  // -fshort-wchar default varies depending on platform; only
1631a6fda124bf380479529d6a80b84b62cacd3cb707John Thompson  // pass if specified.
16321744a3504af13343f4bc0e566f6d7349fc6e3f04Daniel Dunbar  if (Arg *A = Args.getLastArg(options::OPT_fshort_wchar))
16331744a3504af13343f4bc0e566f6d7349fc6e3f04Daniel Dunbar    A->render(Args, CmdArgs);
1634a6fda124bf380479529d6a80b84b62cacd3cb707John Thompson
1635ee848a73e5f8ffe7511af8652ba811c020d1c7a0Daniel Dunbar  // -fno-pascal-strings is default, only pass non-default. If the tool chain
1636ee848a73e5f8ffe7511af8652ba811c020d1c7a0Daniel Dunbar  // happened to translate to -mpascal-strings, we want to back translate here.
163782d00688525c876bf47bce414dedae9c343e67f5Daniel Dunbar  //
163882d00688525c876bf47bce414dedae9c343e67f5Daniel Dunbar  // FIXME: This is gross; that translation should be pulled from the
163982d00688525c876bf47bce414dedae9c343e67f5Daniel Dunbar  // tool chain.
1640c21c485b4fb58ef5d55cf3e523263dd824a2ace4Daniel Dunbar  if (Args.hasFlag(options::OPT_fpascal_strings,
164182d00688525c876bf47bce414dedae9c343e67f5Daniel Dunbar                   options::OPT_fno_pascal_strings,
164282d00688525c876bf47bce414dedae9c343e67f5Daniel Dunbar                   false) ||
164382d00688525c876bf47bce414dedae9c343e67f5Daniel Dunbar      Args.hasFlag(options::OPT_mpascal_strings,
164482d00688525c876bf47bce414dedae9c343e67f5Daniel Dunbar                   options::OPT_mno_pascal_strings,
164582d00688525c876bf47bce414dedae9c343e67f5Daniel Dunbar                   false))
164648d1ef782c8c88066b5febf60f8f456064d7d3f0Daniel Dunbar    CmdArgs.push_back("-fpascal-strings");
1647125b4cb35536e45201f8f2cb19ee620e3ad67c49NAKAMURA Takumi
1648b466d01e464b21832c23eeed90112bc5c26c0236Fariborz Jahanian  if (Args.hasArg(options::OPT_mkernel) ||
1649b466d01e464b21832c23eeed90112bc5c26c0236Fariborz Jahanian      Args.hasArg(options::OPT_fapple_kext)) {
1650b466d01e464b21832c23eeed90112bc5c26c0236Fariborz Jahanian    if (!Args.hasArg(options::OPT_fcommon))
1651b466d01e464b21832c23eeed90112bc5c26c0236Fariborz Jahanian      CmdArgs.push_back("-fno-common");
1652b466d01e464b21832c23eeed90112bc5c26c0236Fariborz Jahanian  }
165348d1ef782c8c88066b5febf60f8f456064d7d3f0Daniel Dunbar  // -fcommon is default, only pass non-default.
1654b466d01e464b21832c23eeed90112bc5c26c0236Fariborz Jahanian  else if (!Args.hasFlag(options::OPT_fcommon, options::OPT_fno_common))
165548d1ef782c8c88066b5febf60f8f456064d7d3f0Daniel Dunbar    CmdArgs.push_back("-fno-common");
165648d1ef782c8c88066b5febf60f8f456064d7d3f0Daniel Dunbar
165770d3c92820f590b10553da9c96eda24e4325ba34Daniel Dunbar  // -fsigned-bitfields is default, and clang doesn't yet support
165806205ca78ca2fd4384b237f120ec66614df0d9fcDaniel Dunbar  // -funsigned-bitfields.
16591eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump  if (!Args.hasFlag(options::OPT_fsigned_bitfields,
166070d3c92820f590b10553da9c96eda24e4325ba34Daniel Dunbar                    options::OPT_funsigned_bitfields))
166170d3c92820f590b10553da9c96eda24e4325ba34Daniel Dunbar    D.Diag(clang::diag::warn_drv_clang_unsupported)
166270d3c92820f590b10553da9c96eda24e4325ba34Daniel Dunbar      << Args.getLastArg(options::OPT_funsigned_bitfields)->getAsString(Args);
166370d3c92820f590b10553da9c96eda24e4325ba34Daniel Dunbar
166406205ca78ca2fd4384b237f120ec66614df0d9fcDaniel Dunbar  // -fsigned-bitfields is default, and clang doesn't support -fno-for-scope.
166506205ca78ca2fd4384b237f120ec66614df0d9fcDaniel Dunbar  if (!Args.hasFlag(options::OPT_ffor_scope,
166606205ca78ca2fd4384b237f120ec66614df0d9fcDaniel Dunbar                    options::OPT_fno_for_scope))
166706205ca78ca2fd4384b237f120ec66614df0d9fcDaniel Dunbar    D.Diag(clang::diag::err_drv_clang_unsupported)
166806205ca78ca2fd4384b237f120ec66614df0d9fcDaniel Dunbar      << Args.getLastArg(options::OPT_fno_for_scope)->getAsString(Args);
166906205ca78ca2fd4384b237f120ec66614df0d9fcDaniel Dunbar
16700ea22fdfda0558393950cef5db50d050e3eb1e60Jeffrey Yasskin  // -fcaret-diagnostics is default.
16710ea22fdfda0558393950cef5db50d050e3eb1e60Jeffrey Yasskin  if (!Args.hasFlag(options::OPT_fcaret_diagnostics,
16720ea22fdfda0558393950cef5db50d050e3eb1e60Jeffrey Yasskin                    options::OPT_fno_caret_diagnostics, true))
16730ea22fdfda0558393950cef5db50d050e3eb1e60Jeffrey Yasskin    CmdArgs.push_back("-fno-caret-diagnostics");
16740ea22fdfda0558393950cef5db50d050e3eb1e60Jeffrey Yasskin
167549138fc59eeac2aacd3b7e04c2642180d5baefd7Daniel Dunbar  // -fdiagnostics-fixit-info is default, only pass non-default.
16761eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump  if (!Args.hasFlag(options::OPT_fdiagnostics_fixit_info,
167749138fc59eeac2aacd3b7e04c2642180d5baefd7Daniel Dunbar                    options::OPT_fno_diagnostics_fixit_info))
167849138fc59eeac2aacd3b7e04c2642180d5baefd7Daniel Dunbar    CmdArgs.push_back("-fno-diagnostics-fixit-info");
167949138fc59eeac2aacd3b7e04c2642180d5baefd7Daniel Dunbar
16809e820ee054fefe5422b4db3f681e567a8976747eDaniel Dunbar  // Enable -fdiagnostics-show-option by default.
16811eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump  if (Args.hasFlag(options::OPT_fdiagnostics_show_option,
16829e820ee054fefe5422b4db3f681e567a8976747eDaniel Dunbar                   options::OPT_fno_diagnostics_show_option))
16839e820ee054fefe5422b4db3f681e567a8976747eDaniel Dunbar    CmdArgs.push_back("-fdiagnostics-show-option");
1684838be483dcf10ea3f2acd85f2cd65adc310011f9Daniel Dunbar
16856fbe8398ba1680ffc5daa7395850ff8765b7905bChris Lattner  if (const Arg *A =
16866fbe8398ba1680ffc5daa7395850ff8765b7905bChris Lattner        Args.getLastArg(options::OPT_fdiagnostics_show_category_EQ)) {
16876fbe8398ba1680ffc5daa7395850ff8765b7905bChris Lattner    CmdArgs.push_back("-fdiagnostics-show-category");
16886fbe8398ba1680ffc5daa7395850ff8765b7905bChris Lattner    CmdArgs.push_back(A->getValue(Args));
16896fbe8398ba1680ffc5daa7395850ff8765b7905bChris Lattner  }
1690ca0e0545c216afaacba6da6c82a270dc2efc4e3fDaniel Dunbar
1691838be483dcf10ea3f2acd85f2cd65adc310011f9Daniel Dunbar  // Color diagnostics are the default, unless the terminal doesn't support
1692838be483dcf10ea3f2acd85f2cd65adc310011f9Daniel Dunbar  // them.
1693838be483dcf10ea3f2acd85f2cd65adc310011f9Daniel Dunbar  if (Args.hasFlag(options::OPT_fcolor_diagnostics,
1694f765d76407d82e629337bba4ca6c26bdfc8bc9a6Argyrios Kyrtzidis                   options::OPT_fno_color_diagnostics,
1695f765d76407d82e629337bba4ca6c26bdfc8bc9a6Argyrios Kyrtzidis                   llvm::sys::Process::StandardErrHasColors()))
1696838be483dcf10ea3f2acd85f2cd65adc310011f9Daniel Dunbar    CmdArgs.push_back("-fcolor-diagnostics");
1697838be483dcf10ea3f2acd85f2cd65adc310011f9Daniel Dunbar
169875eb1d64784946a37fc0b27596e2d92b6cf7033bDaniel Dunbar  if (!Args.hasFlag(options::OPT_fshow_source_location,
169975eb1d64784946a37fc0b27596e2d92b6cf7033bDaniel Dunbar                    options::OPT_fno_show_source_location))
170075eb1d64784946a37fc0b27596e2d92b6cf7033bDaniel Dunbar    CmdArgs.push_back("-fno-show-source-location");
17019e820ee054fefe5422b4db3f681e567a8976747eDaniel Dunbar
1702a0068fc64351db9c47916566e3b85ab733cd8d6dDouglas Gregor  if (!Args.hasFlag(options::OPT_fspell_checking,
1703a0068fc64351db9c47916566e3b85ab733cd8d6dDouglas Gregor                    options::OPT_fno_spell_checking))
1704a0068fc64351db9c47916566e3b85ab733cd8d6dDouglas Gregor    CmdArgs.push_back("-fno-spell-checking");
1705ca0e0545c216afaacba6da6c82a270dc2efc4e3fDaniel Dunbar
170625b26ebdebe46bb4576247e0c64d1c11410a8e9dDaniel Dunbar
1707168943947a42d6819dce56b420dc5aef4d0831ceDaniel Dunbar  // Silently ignore -fasm-blocks for now.
1708168943947a42d6819dce56b420dc5aef4d0831ceDaniel Dunbar  (void) Args.hasFlag(options::OPT_fasm_blocks, options::OPT_fno_asm_blocks,
1709168943947a42d6819dce56b420dc5aef4d0831ceDaniel Dunbar                      false);
171025b26ebdebe46bb4576247e0c64d1c11410a8e9dDaniel Dunbar
17115edbdcc62098e305cd55654814dcf783a3f3c477Jeffrey Yasskin  if (Arg *A = Args.getLastArg(options::OPT_fshow_overloads_EQ))
17125edbdcc62098e305cd55654814dcf783a3f3c477Jeffrey Yasskin    A->render(Args, CmdArgs);
17135edbdcc62098e305cd55654814dcf783a3f3c477Jeffrey Yasskin
17147695fba30221613b7cf31276456217c41bb90960Daniel Dunbar  // -fdollars-in-identifiers default varies depending on platform and
17157695fba30221613b7cf31276456217c41bb90960Daniel Dunbar  // language; only pass if specified.
17161eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump  if (Arg *A = Args.getLastArg(options::OPT_fdollars_in_identifiers,
17177695fba30221613b7cf31276456217c41bb90960Daniel Dunbar                               options::OPT_fno_dollars_in_identifiers)) {
17187695fba30221613b7cf31276456217c41bb90960Daniel Dunbar    if (A->getOption().matches(options::OPT_fdollars_in_identifiers))
17198663b180085e9bc7a0a87c80cc3f722efef99e79Daniel Dunbar      CmdArgs.push_back("-fdollars-in-identifiers");
17207695fba30221613b7cf31276456217c41bb90960Daniel Dunbar    else
17218663b180085e9bc7a0a87c80cc3f722efef99e79Daniel Dunbar      CmdArgs.push_back("-fno-dollars-in-identifiers");
17227695fba30221613b7cf31276456217c41bb90960Daniel Dunbar  }
17237695fba30221613b7cf31276456217c41bb90960Daniel Dunbar
1724e027a4b2399e9b0acfe0f77220c66bbe369067eeDaniel Dunbar  // -funit-at-a-time is default, and we don't support -fno-unit-at-a-time for
1725e027a4b2399e9b0acfe0f77220c66bbe369067eeDaniel Dunbar  // practical purposes.
17261eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump  if (Arg *A = Args.getLastArg(options::OPT_funit_at_a_time,
1727e027a4b2399e9b0acfe0f77220c66bbe369067eeDaniel Dunbar                               options::OPT_fno_unit_at_a_time)) {
1728e027a4b2399e9b0acfe0f77220c66bbe369067eeDaniel Dunbar    if (A->getOption().matches(options::OPT_fno_unit_at_a_time))
1729c37691068db5ceb19c014ddd3e02afa9875f8181Edward O'Callaghan      D.Diag(clang::diag::warn_drv_clang_unsupported) << A->getAsString(Args);
1730e027a4b2399e9b0acfe0f77220c66bbe369067eeDaniel Dunbar  }
1731ceb5c5b7f67a30fae305d1d19b478b623e4fbcedEli Friedman
17322ba91575905a54f712a7f64304e56002e4882499Daniel Dunbar  // Default to -fno-builtin-str{cat,cpy} on Darwin for ARM.
1733f84a4a469d8a45c76cb941595582a0fd3b9b15d3Daniel Dunbar  //
17348ff5b28d6efcffe2251e77634c7edf83a4763344Daniel Dunbar  // FIXME: This is disabled until clang -cc1 supports -fno-builtin-foo. PR4941.
1735f84a4a469d8a45c76cb941595582a0fd3b9b15d3Daniel Dunbar#if 0
17362ba91575905a54f712a7f64304e56002e4882499Daniel Dunbar  if (getToolChain().getTriple().getOS() == llvm::Triple::Darwin &&
17372ba91575905a54f712a7f64304e56002e4882499Daniel Dunbar      (getToolChain().getTriple().getArch() == llvm::Triple::arm ||
17382ba91575905a54f712a7f64304e56002e4882499Daniel Dunbar       getToolChain().getTriple().getArch() == llvm::Triple::thumb)) {
17392ba91575905a54f712a7f64304e56002e4882499Daniel Dunbar    if (!Args.hasArg(options::OPT_fbuiltin_strcat))
17402ba91575905a54f712a7f64304e56002e4882499Daniel Dunbar      CmdArgs.push_back("-fno-builtin-strcat");
17412ba91575905a54f712a7f64304e56002e4882499Daniel Dunbar    if (!Args.hasArg(options::OPT_fbuiltin_strcpy))
17422ba91575905a54f712a7f64304e56002e4882499Daniel Dunbar      CmdArgs.push_back("-fno-builtin-strcpy");
17432ba91575905a54f712a7f64304e56002e4882499Daniel Dunbar  }
1744f84a4a469d8a45c76cb941595582a0fd3b9b15d3Daniel Dunbar#endif
17452ba91575905a54f712a7f64304e56002e4882499Daniel Dunbar
17461eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump  if (Arg *A = Args.getLastArg(options::OPT_traditional,
1747ceb5c5b7f67a30fae305d1d19b478b623e4fbcedEli Friedman                               options::OPT_traditional_cpp))
1748ceb5c5b7f67a30fae305d1d19b478b623e4fbcedEli Friedman    D.Diag(clang::diag::err_drv_clang_unsupported) << A->getAsString(Args);
1749ceb5c5b7f67a30fae305d1d19b478b623e4fbcedEli Friedman
17501d46033f760ba5fd266ce59fe391fac473f04f52Daniel Dunbar  Args.AddLastArg(CmdArgs, options::OPT_dM);
1751d82df3ad430397d7f9ef511e7c5157f997c41f53Chris Lattner  Args.AddLastArg(CmdArgs, options::OPT_dD);
17521d46033f760ba5fd266ce59fe391fac473f04f52Daniel Dunbar
17533f87fb08dd502309960646db01099fb4c1be9a7cDaniel Dunbar  // Forward -Xclang arguments to -cc1, and -mllvm arguments to the LLVM option
17543f87fb08dd502309960646db01099fb4c1be9a7cDaniel Dunbar  // parser.
17551d46033f760ba5fd266ce59fe391fac473f04f52Daniel Dunbar  Args.AddAllArgValues(CmdArgs, options::OPT_Xclang);
17563f87fb08dd502309960646db01099fb4c1be9a7cDaniel Dunbar  for (arg_iterator it = Args.filtered_begin(options::OPT_mllvm),
17573f87fb08dd502309960646db01099fb4c1be9a7cDaniel Dunbar         ie = Args.filtered_end(); it != ie; ++it) {
17587e4953e5c60409007545288f14b430bd23d68570Daniel Dunbar    (*it)->claim();
1759fb36d21960a3bd422665a961eac6ca269cd6445bDaniel Dunbar
17603f87fb08dd502309960646db01099fb4c1be9a7cDaniel Dunbar    // We translate this by hand to the -cc1 argument, since nightly test uses
17613f87fb08dd502309960646db01099fb4c1be9a7cDaniel Dunbar    // it and developers have been trained to spell it with -mllvm.
17627e4953e5c60409007545288f14b430bd23d68570Daniel Dunbar    if (llvm::StringRef((*it)->getValue(Args, 0)) == "-disable-llvm-optzns")
17633f87fb08dd502309960646db01099fb4c1be9a7cDaniel Dunbar      CmdArgs.push_back("-disable-llvm-optzns");
17643f87fb08dd502309960646db01099fb4c1be9a7cDaniel Dunbar    else
17657e4953e5c60409007545288f14b430bd23d68570Daniel Dunbar      (*it)->render(Args, CmdArgs);
17663f87fb08dd502309960646db01099fb4c1be9a7cDaniel Dunbar  }
17671d46033f760ba5fd266ce59fe391fac473f04f52Daniel Dunbar
1768cd8e4c44dd068956e9181381be3ee2d49a0fac52Daniel Dunbar  if (Output.getType() == types::TY_Dependencies) {
1769cd8e4c44dd068956e9181381be3ee2d49a0fac52Daniel Dunbar    // Handled with other dependency code.
1770115a79277edababaf1b26e3654044ae983197679Daniel Dunbar  } else if (Output.isFilename()) {
1771b488c1dac8e53206f07103d794a62a3f5012c0f4Daniel Dunbar    CmdArgs.push_back("-o");
1772115a79277edababaf1b26e3654044ae983197679Daniel Dunbar    CmdArgs.push_back(Output.getFilename());
1773115a79277edababaf1b26e3654044ae983197679Daniel Dunbar  } else {
1774115a79277edababaf1b26e3654044ae983197679Daniel Dunbar    assert(Output.isNothing() && "Invalid output.");
1775b488c1dac8e53206f07103d794a62a3f5012c0f4Daniel Dunbar  }
1776b488c1dac8e53206f07103d794a62a3f5012c0f4Daniel Dunbar
17771d46033f760ba5fd266ce59fe391fac473f04f52Daniel Dunbar  for (InputInfoList::const_iterator
17781d46033f760ba5fd266ce59fe391fac473f04f52Daniel Dunbar         it = Inputs.begin(), ie = Inputs.end(); it != ie; ++it) {
17791d46033f760ba5fd266ce59fe391fac473f04f52Daniel Dunbar    const InputInfo &II = *it;
17801d46033f760ba5fd266ce59fe391fac473f04f52Daniel Dunbar    CmdArgs.push_back("-x");
17811d46033f760ba5fd266ce59fe391fac473f04f52Daniel Dunbar    CmdArgs.push_back(types::getTypeName(II.getType()));
17827c1e46533cae07216e2a67d5636a5afb44253155Daniel Dunbar    if (II.isFilename())
1783115a79277edababaf1b26e3654044ae983197679Daniel Dunbar      CmdArgs.push_back(II.getFilename());
17841d46033f760ba5fd266ce59fe391fac473f04f52Daniel Dunbar    else
1785115a79277edababaf1b26e3654044ae983197679Daniel Dunbar      II.getInputArg().renderAsInput(Args, CmdArgs);
17861d46033f760ba5fd266ce59fe391fac473f04f52Daniel Dunbar  }
1787c21c485b4fb58ef5d55cf3e523263dd824a2ace4Daniel Dunbar
1788e6113de52df132b89c3a5a6141f17d37e83322aeChris Lattner  Args.AddAllArgs(CmdArgs, options::OPT_undef);
1789e6113de52df132b89c3a5a6141f17d37e83322aeChris Lattner
1790a001c1ce5fcb669624a5b8e50d0a629d673da901Daniel Dunbar  const char *Exec = getToolChain().getDriver().getClangProgramPath();
1791f2d8b9f967a1ab53ee9fdbcc3ac0a4ee0a83a26eDaniel Dunbar
1792f2d8b9f967a1ab53ee9fdbcc3ac0a4ee0a83a26eDaniel Dunbar  // Optionally embed the -cc1 level arguments into the debug info, for build
1793f2d8b9f967a1ab53ee9fdbcc3ac0a4ee0a83a26eDaniel Dunbar  // analysis.
1794f2d8b9f967a1ab53ee9fdbcc3ac0a4ee0a83a26eDaniel Dunbar  if (getToolChain().UseDwarfDebugFlags()) {
17956e90047520c8b4d6daa110bdbdaf15041016bd7cDaniel Dunbar    ArgStringList OriginalArgs;
17966e90047520c8b4d6daa110bdbdaf15041016bd7cDaniel Dunbar    for (ArgList::const_iterator it = Args.begin(),
17976e90047520c8b4d6daa110bdbdaf15041016bd7cDaniel Dunbar           ie = Args.end(); it != ie; ++it)
17986e90047520c8b4d6daa110bdbdaf15041016bd7cDaniel Dunbar      (*it)->render(Args, OriginalArgs);
1799ca0e0545c216afaacba6da6c82a270dc2efc4e3fDaniel Dunbar
1800f2d8b9f967a1ab53ee9fdbcc3ac0a4ee0a83a26eDaniel Dunbar    llvm::SmallString<256> Flags;
1801f2d8b9f967a1ab53ee9fdbcc3ac0a4ee0a83a26eDaniel Dunbar    Flags += Exec;
18026e90047520c8b4d6daa110bdbdaf15041016bd7cDaniel Dunbar    for (unsigned i = 0, e = OriginalArgs.size(); i != e; ++i) {
1803f2d8b9f967a1ab53ee9fdbcc3ac0a4ee0a83a26eDaniel Dunbar      Flags += " ";
18046e90047520c8b4d6daa110bdbdaf15041016bd7cDaniel Dunbar      Flags += OriginalArgs[i];
1805f2d8b9f967a1ab53ee9fdbcc3ac0a4ee0a83a26eDaniel Dunbar    }
1806f2d8b9f967a1ab53ee9fdbcc3ac0a4ee0a83a26eDaniel Dunbar    CmdArgs.push_back("-dwarf-debug-flags");
1807f2d8b9f967a1ab53ee9fdbcc3ac0a4ee0a83a26eDaniel Dunbar    CmdArgs.push_back(Args.MakeArgString(Flags.str()));
1808f2d8b9f967a1ab53ee9fdbcc3ac0a4ee0a83a26eDaniel Dunbar  }
1809f2d8b9f967a1ab53ee9fdbcc3ac0a4ee0a83a26eDaniel Dunbar
18102fe238ed293bd4bc27af9beb9fa151fad2146fa8Daniel Dunbar  C.addCommand(new Command(JA, *this, Exec, CmdArgs));
1811a880db0b0fc028abf754c290d921d809eec0518aDaniel Dunbar
1812be4c8705e499b55548467eb7adaa23cbc6edfef9Roman Divacky  if (Arg *A = Args.getLastArg(options::OPT_pg))
1813be4c8705e499b55548467eb7adaa23cbc6edfef9Roman Divacky    if (Args.hasArg(options::OPT_fomit_frame_pointer))
1814be4c8705e499b55548467eb7adaa23cbc6edfef9Roman Divacky      D.Diag(clang::diag::err_drv_argument_not_allowed_with)
1815be4c8705e499b55548467eb7adaa23cbc6edfef9Roman Divacky        << "-fomit-frame-pointer" << A->getAsString(Args);
181620249a1af2e462dcafdd6a350f1c7967b264ff25Michael J. Spencer
181768fb469aeb19144403e703b825854d08353c8eeaDaniel Dunbar  // Claim some arguments which clang supports automatically.
181868fb469aeb19144403e703b825854d08353c8eeaDaniel Dunbar
1819f4046866e20fe3279b0daa2f48d9e83263dfdbfeDaniel Dunbar  // -fpch-preprocess is used with gcc to add a special marker in the output to
1820f4046866e20fe3279b0daa2f48d9e83263dfdbfeDaniel Dunbar  // include the PCH file. Clang's PTH solution is completely transparent, so we
1821f4046866e20fe3279b0daa2f48d9e83263dfdbfeDaniel Dunbar  // do not need to deal with it at all.
182268fb469aeb19144403e703b825854d08353c8eeaDaniel Dunbar  Args.ClaimAllArgs(options::OPT_fpch_preprocess);
1823c21c485b4fb58ef5d55cf3e523263dd824a2ace4Daniel Dunbar
1824a880db0b0fc028abf754c290d921d809eec0518aDaniel Dunbar  // Claim some arguments which clang doesn't support, but we don't
1825a880db0b0fc028abf754c290d921d809eec0518aDaniel Dunbar  // care to warn the user about.
1826cdd9686b890ebdc10039ae256ef4c9dfb5ebacb7Daniel Dunbar  Args.ClaimAllArgs(options::OPT_clang_ignored_f_Group);
1827cdd9686b890ebdc10039ae256ef4c9dfb5ebacb7Daniel Dunbar  Args.ClaimAllArgs(options::OPT_clang_ignored_m_Group);
1828035ff0c6746a2689667c83d4c02a47d5a7b71e82Rafael Espindola
1829035ff0c6746a2689667c83d4c02a47d5a7b71e82Rafael Espindola  Args.ClaimAllArgs(options::OPT_use_gold_plugin);
183047ac7d27c44bd64a7d0fc03d4babc196cf2b8230Daniel Dunbar}
183147ac7d27c44bd64a7d0fc03d4babc196cf2b8230Daniel Dunbar
183220a9aa50f9a7d4b03f97bc67e96da1d605c309a2Daniel Dunbarvoid ClangAs::ConstructJob(Compilation &C, const JobAction &JA,
183320a9aa50f9a7d4b03f97bc67e96da1d605c309a2Daniel Dunbar                           const InputInfo &Output,
183420a9aa50f9a7d4b03f97bc67e96da1d605c309a2Daniel Dunbar                           const InputInfoList &Inputs,
183520a9aa50f9a7d4b03f97bc67e96da1d605c309a2Daniel Dunbar                           const ArgList &Args,
183620a9aa50f9a7d4b03f97bc67e96da1d605c309a2Daniel Dunbar                           const char *LinkingOutput) const {
183720a9aa50f9a7d4b03f97bc67e96da1d605c309a2Daniel Dunbar  ArgStringList CmdArgs;
183820a9aa50f9a7d4b03f97bc67e96da1d605c309a2Daniel Dunbar
183920a9aa50f9a7d4b03f97bc67e96da1d605c309a2Daniel Dunbar  assert(Inputs.size() == 1 && "Unexpected number of inputs.");
184020a9aa50f9a7d4b03f97bc67e96da1d605c309a2Daniel Dunbar  const InputInfo &Input = Inputs[0];
184120a9aa50f9a7d4b03f97bc67e96da1d605c309a2Daniel Dunbar
1842dbe80d9933e1fb0c26bd339e1f1f2f2d76dcac0aRafael Espindola  // Don't warn about "clang -w -c foo.s"
1843dbe80d9933e1fb0c26bd339e1f1f2f2d76dcac0aRafael Espindola  Args.ClaimAllArgs(options::OPT_w);
1844dbe80d9933e1fb0c26bd339e1f1f2f2d76dcac0aRafael Espindola
184520a9aa50f9a7d4b03f97bc67e96da1d605c309a2Daniel Dunbar  // Invoke ourselves in -cc1as mode.
184620a9aa50f9a7d4b03f97bc67e96da1d605c309a2Daniel Dunbar  //
184720a9aa50f9a7d4b03f97bc67e96da1d605c309a2Daniel Dunbar  // FIXME: Implement custom jobs for internal actions.
184820a9aa50f9a7d4b03f97bc67e96da1d605c309a2Daniel Dunbar  CmdArgs.push_back("-cc1as");
184920a9aa50f9a7d4b03f97bc67e96da1d605c309a2Daniel Dunbar
185020a9aa50f9a7d4b03f97bc67e96da1d605c309a2Daniel Dunbar  // Add the "effective" target triple.
185120a9aa50f9a7d4b03f97bc67e96da1d605c309a2Daniel Dunbar  CmdArgs.push_back("-triple");
185200577ada44c889fbe311d61c51a8da89e65c7c9aDaniel Dunbar  std::string TripleStr = getToolChain().ComputeEffectiveClangTriple(Args);
185320a9aa50f9a7d4b03f97bc67e96da1d605c309a2Daniel Dunbar  CmdArgs.push_back(Args.MakeArgString(TripleStr));
185420a9aa50f9a7d4b03f97bc67e96da1d605c309a2Daniel Dunbar
185520a9aa50f9a7d4b03f97bc67e96da1d605c309a2Daniel Dunbar  // Set the output mode, we currently only expect to be used as a real
185620a9aa50f9a7d4b03f97bc67e96da1d605c309a2Daniel Dunbar  // assembler.
185720a9aa50f9a7d4b03f97bc67e96da1d605c309a2Daniel Dunbar  CmdArgs.push_back("-filetype");
185820a9aa50f9a7d4b03f97bc67e96da1d605c309a2Daniel Dunbar  CmdArgs.push_back("obj");
185920a9aa50f9a7d4b03f97bc67e96da1d605c309a2Daniel Dunbar
18609929800b8dfced61e9c97dc8d6e71e144ebf8accDaniel Dunbar  // At -O0, we use -mrelax-all by default.
18619929800b8dfced61e9c97dc8d6e71e144ebf8accDaniel Dunbar  bool IsOpt = false;
18629929800b8dfced61e9c97dc8d6e71e144ebf8accDaniel Dunbar  if (Arg *A = Args.getLastArg(options::OPT_O_Group))
18639929800b8dfced61e9c97dc8d6e71e144ebf8accDaniel Dunbar    IsOpt = !A->getOption().matches(options::OPT_O0);
18649929800b8dfced61e9c97dc8d6e71e144ebf8accDaniel Dunbar  if (Args.hasFlag(options::OPT_mrelax_all,
18659929800b8dfced61e9c97dc8d6e71e144ebf8accDaniel Dunbar                    options::OPT_mno_relax_all,
18669929800b8dfced61e9c97dc8d6e71e144ebf8accDaniel Dunbar                    !IsOpt))
1867469d40ef5a95d0eaddfd541616ad4cd26668e856Daniel Dunbar    CmdArgs.push_back("-relax-all");
18689929800b8dfced61e9c97dc8d6e71e144ebf8accDaniel Dunbar
186920a9aa50f9a7d4b03f97bc67e96da1d605c309a2Daniel Dunbar  // FIXME: Add -force_cpusubtype_ALL support, once we have it.
187020a9aa50f9a7d4b03f97bc67e96da1d605c309a2Daniel Dunbar
187120a9aa50f9a7d4b03f97bc67e96da1d605c309a2Daniel Dunbar  // FIXME: Add -g support, once we have it.
187220a9aa50f9a7d4b03f97bc67e96da1d605c309a2Daniel Dunbar
187320a9aa50f9a7d4b03f97bc67e96da1d605c309a2Daniel Dunbar  // FIXME: Add -static support, once we have it.
187420a9aa50f9a7d4b03f97bc67e96da1d605c309a2Daniel Dunbar
187520a9aa50f9a7d4b03f97bc67e96da1d605c309a2Daniel Dunbar  Args.AddAllArgValues(CmdArgs, options::OPT_Wa_COMMA,
187620a9aa50f9a7d4b03f97bc67e96da1d605c309a2Daniel Dunbar                       options::OPT_Xassembler);
187720a9aa50f9a7d4b03f97bc67e96da1d605c309a2Daniel Dunbar
187820a9aa50f9a7d4b03f97bc67e96da1d605c309a2Daniel Dunbar  assert(Output.isFilename() && "Unexpected lipo output.");
187920a9aa50f9a7d4b03f97bc67e96da1d605c309a2Daniel Dunbar  CmdArgs.push_back("-o");
188020a9aa50f9a7d4b03f97bc67e96da1d605c309a2Daniel Dunbar  CmdArgs.push_back(Output.getFilename());
188120a9aa50f9a7d4b03f97bc67e96da1d605c309a2Daniel Dunbar
18827c1e46533cae07216e2a67d5636a5afb44253155Daniel Dunbar  assert(Input.isFilename() && "Invalid input.");
18837c1e46533cae07216e2a67d5636a5afb44253155Daniel Dunbar  CmdArgs.push_back(Input.getFilename());
188420a9aa50f9a7d4b03f97bc67e96da1d605c309a2Daniel Dunbar
1885a001c1ce5fcb669624a5b8e50d0a629d673da901Daniel Dunbar  const char *Exec = getToolChain().getDriver().getClangProgramPath();
18862fe238ed293bd4bc27af9beb9fa151fad2146fa8Daniel Dunbar  C.addCommand(new Command(JA, *this, Exec, CmdArgs));
188720a9aa50f9a7d4b03f97bc67e96da1d605c309a2Daniel Dunbar}
188820a9aa50f9a7d4b03f97bc67e96da1d605c309a2Daniel Dunbar
1889b488c1dac8e53206f07103d794a62a3f5012c0f4Daniel Dunbarvoid gcc::Common::ConstructJob(Compilation &C, const JobAction &JA,
1890b488c1dac8e53206f07103d794a62a3f5012c0f4Daniel Dunbar                               const InputInfo &Output,
1891b488c1dac8e53206f07103d794a62a3f5012c0f4Daniel Dunbar                               const InputInfoList &Inputs,
18921d46033f760ba5fd266ce59fe391fac473f04f52Daniel Dunbar                               const ArgList &Args,
1893b488c1dac8e53206f07103d794a62a3f5012c0f4Daniel Dunbar                               const char *LinkingOutput) const {
1894ee788e70fcd0adf76103b17c78ac658d4ea30c9bDaniel Dunbar  const Driver &D = getToolChain().getDriver();
1895b488c1dac8e53206f07103d794a62a3f5012c0f4Daniel Dunbar  ArgStringList CmdArgs;
1896b488c1dac8e53206f07103d794a62a3f5012c0f4Daniel Dunbar
1897c21c485b4fb58ef5d55cf3e523263dd824a2ace4Daniel Dunbar  for (ArgList::const_iterator
18981d46033f760ba5fd266ce59fe391fac473f04f52Daniel Dunbar         it = Args.begin(), ie = Args.end(); it != ie; ++it) {
1899b488c1dac8e53206f07103d794a62a3f5012c0f4Daniel Dunbar    Arg *A = *it;
19007587719c40ebf02bf11e5e66c30bd20e98edebc2Daniel Dunbar    if (A->getOption().hasForwardToGCC()) {
19012dffe2d9d631fefd79d4999f6ffe7ac0d70882b1Daniel Dunbar      // Don't forward any -g arguments to assembly steps.
19022dffe2d9d631fefd79d4999f6ffe7ac0d70882b1Daniel Dunbar      if (isa<AssembleJobAction>(JA) &&
19032dffe2d9d631fefd79d4999f6ffe7ac0d70882b1Daniel Dunbar          A->getOption().matches(options::OPT_g_Group))
19042dffe2d9d631fefd79d4999f6ffe7ac0d70882b1Daniel Dunbar        continue;
19052dffe2d9d631fefd79d4999f6ffe7ac0d70882b1Daniel Dunbar
19067587719c40ebf02bf11e5e66c30bd20e98edebc2Daniel Dunbar      // It is unfortunate that we have to claim here, as this means
19077587719c40ebf02bf11e5e66c30bd20e98edebc2Daniel Dunbar      // we will basically never report anything interesting for
19086ecc7a993f939c5255c36c7c0d965fb9c1543f2aDaniel Dunbar      // platforms using a generic gcc, even if we are just using gcc
19096ecc7a993f939c5255c36c7c0d965fb9c1543f2aDaniel Dunbar      // to get to the assembler.
19107587719c40ebf02bf11e5e66c30bd20e98edebc2Daniel Dunbar      A->claim();
19111d46033f760ba5fd266ce59fe391fac473f04f52Daniel Dunbar      A->render(Args, CmdArgs);
19127587719c40ebf02bf11e5e66c30bd20e98edebc2Daniel Dunbar    }
1913b488c1dac8e53206f07103d794a62a3f5012c0f4Daniel Dunbar  }
1914c21c485b4fb58ef5d55cf3e523263dd824a2ace4Daniel Dunbar
191582b51cce8cea6b6bb6175c406c2ab425c91d9dc8Daniel Dunbar  RenderExtraToolArgs(JA, CmdArgs);
1916b488c1dac8e53206f07103d794a62a3f5012c0f4Daniel Dunbar
1917b488c1dac8e53206f07103d794a62a3f5012c0f4Daniel Dunbar  // If using a driver driver, force the arch.
19187cfe31a713d8fcfc2a1328e8fbd8efdeb0aec51bDaniel Dunbar  const std::string &Arch = getToolChain().getArchName();
19191bda434673d3c51a2ba6b412f100ccfcf3e7083fDaniel Dunbar  if (getToolChain().getTriple().getOS() == llvm::Triple::Darwin) {
1920b488c1dac8e53206f07103d794a62a3f5012c0f4Daniel Dunbar    CmdArgs.push_back("-arch");
1921bf54a06f9b771c2a2730cc63eb89bce0522515b5Daniel Dunbar
1922bf54a06f9b771c2a2730cc63eb89bce0522515b5Daniel Dunbar    // FIXME: Remove these special cases.
19237cfe31a713d8fcfc2a1328e8fbd8efdeb0aec51bDaniel Dunbar    if (Arch == "powerpc")
19247cfe31a713d8fcfc2a1328e8fbd8efdeb0aec51bDaniel Dunbar      CmdArgs.push_back("ppc");
19257cfe31a713d8fcfc2a1328e8fbd8efdeb0aec51bDaniel Dunbar    else if (Arch == "powerpc64")
19267cfe31a713d8fcfc2a1328e8fbd8efdeb0aec51bDaniel Dunbar      CmdArgs.push_back("ppc64");
19277cfe31a713d8fcfc2a1328e8fbd8efdeb0aec51bDaniel Dunbar    else
1928881376467c46c5c6cc16fa6790271c2c22e1d4f1Daniel Dunbar      CmdArgs.push_back(Args.MakeArgString(Arch));
1929b488c1dac8e53206f07103d794a62a3f5012c0f4Daniel Dunbar  }
1930b488c1dac8e53206f07103d794a62a3f5012c0f4Daniel Dunbar
19316ecc7a993f939c5255c36c7c0d965fb9c1543f2aDaniel Dunbar  // Try to force gcc to match the tool chain we want, if we recognize
19326ecc7a993f939c5255c36c7c0d965fb9c1543f2aDaniel Dunbar  // the arch.
19337cfe31a713d8fcfc2a1328e8fbd8efdeb0aec51bDaniel Dunbar  //
19347cfe31a713d8fcfc2a1328e8fbd8efdeb0aec51bDaniel Dunbar  // FIXME: The triple class should directly provide the information we want
19357cfe31a713d8fcfc2a1328e8fbd8efdeb0aec51bDaniel Dunbar  // here.
19367cfe31a713d8fcfc2a1328e8fbd8efdeb0aec51bDaniel Dunbar  if (Arch == "i386" || Arch == "powerpc")
19376ecc7a993f939c5255c36c7c0d965fb9c1543f2aDaniel Dunbar    CmdArgs.push_back("-m32");
19387cfe31a713d8fcfc2a1328e8fbd8efdeb0aec51bDaniel Dunbar  else if (Arch == "x86_64" || Arch == "powerpc64")
19396ecc7a993f939c5255c36c7c0d965fb9c1543f2aDaniel Dunbar    CmdArgs.push_back("-m64");
19406ecc7a993f939c5255c36c7c0d965fb9c1543f2aDaniel Dunbar
19417c1e46533cae07216e2a67d5636a5afb44253155Daniel Dunbar  if (Output.isFilename()) {
1942b488c1dac8e53206f07103d794a62a3f5012c0f4Daniel Dunbar    CmdArgs.push_back("-o");
1943115a79277edababaf1b26e3654044ae983197679Daniel Dunbar    CmdArgs.push_back(Output.getFilename());
1944115a79277edababaf1b26e3654044ae983197679Daniel Dunbar  } else {
1945115a79277edababaf1b26e3654044ae983197679Daniel Dunbar    assert(Output.isNothing() && "Unexpected output");
1946b488c1dac8e53206f07103d794a62a3f5012c0f4Daniel Dunbar    CmdArgs.push_back("-fsyntax-only");
1947115a79277edababaf1b26e3654044ae983197679Daniel Dunbar  }
1948b488c1dac8e53206f07103d794a62a3f5012c0f4Daniel Dunbar
1949b488c1dac8e53206f07103d794a62a3f5012c0f4Daniel Dunbar
1950b488c1dac8e53206f07103d794a62a3f5012c0f4Daniel Dunbar  // Only pass -x if gcc will understand it; otherwise hope gcc
1951b488c1dac8e53206f07103d794a62a3f5012c0f4Daniel Dunbar  // understands the suffix correctly. The main use case this would go
1952b488c1dac8e53206f07103d794a62a3f5012c0f4Daniel Dunbar  // wrong in is for linker inputs if they happened to have an odd
1953b488c1dac8e53206f07103d794a62a3f5012c0f4Daniel Dunbar  // suffix; really the only way to get this to happen is a command
1954b488c1dac8e53206f07103d794a62a3f5012c0f4Daniel Dunbar  // like '-x foobar a.c' which will treat a.c like a linker input.
1955b488c1dac8e53206f07103d794a62a3f5012c0f4Daniel Dunbar  //
1956b488c1dac8e53206f07103d794a62a3f5012c0f4Daniel Dunbar  // FIXME: For the linker case specifically, can we safely convert
1957b488c1dac8e53206f07103d794a62a3f5012c0f4Daniel Dunbar  // inputs into '-Wl,' options?
1958b488c1dac8e53206f07103d794a62a3f5012c0f4Daniel Dunbar  for (InputInfoList::const_iterator
1959b488c1dac8e53206f07103d794a62a3f5012c0f4Daniel Dunbar         it = Inputs.begin(), ie = Inputs.end(); it != ie; ++it) {
1960b488c1dac8e53206f07103d794a62a3f5012c0f4Daniel Dunbar    const InputInfo &II = *it;
1961a8304f67291b0182fb64f3afc621615288dd1d31Daniel Dunbar
19625915fbf310e171c4cd3c2af05e9de360c0fa988aDaniel Dunbar    // Don't try to pass LLVM or AST inputs to a generic gcc.
19636c6424bc0d3b5f080a97b5f6ef4a8d70c38e38f5Daniel Dunbar    if (II.getType() == types::TY_LLVM_IR || II.getType() == types::TY_LTO_IR ||
19646c6424bc0d3b5f080a97b5f6ef4a8d70c38e38f5Daniel Dunbar        II.getType() == types::TY_LLVM_BC || II.getType() == types::TY_LTO_BC)
1965a8304f67291b0182fb64f3afc621615288dd1d31Daniel Dunbar      D.Diag(clang::diag::err_drv_no_linker_llvm_support)
1966881376467c46c5c6cc16fa6790271c2c22e1d4f1Daniel Dunbar        << getToolChain().getTripleString();
19675915fbf310e171c4cd3c2af05e9de360c0fa988aDaniel Dunbar    else if (II.getType() == types::TY_AST)
19685915fbf310e171c4cd3c2af05e9de360c0fa988aDaniel Dunbar      D.Diag(clang::diag::err_drv_no_ast_support)
1969881376467c46c5c6cc16fa6790271c2c22e1d4f1Daniel Dunbar        << getToolChain().getTripleString();
1970a8304f67291b0182fb64f3afc621615288dd1d31Daniel Dunbar
1971b488c1dac8e53206f07103d794a62a3f5012c0f4Daniel Dunbar    if (types::canTypeBeUserSpecified(II.getType())) {
1972b488c1dac8e53206f07103d794a62a3f5012c0f4Daniel Dunbar      CmdArgs.push_back("-x");
1973b488c1dac8e53206f07103d794a62a3f5012c0f4Daniel Dunbar      CmdArgs.push_back(types::getTypeName(II.getType()));
1974b488c1dac8e53206f07103d794a62a3f5012c0f4Daniel Dunbar    }
1975b488c1dac8e53206f07103d794a62a3f5012c0f4Daniel Dunbar
19767c1e46533cae07216e2a67d5636a5afb44253155Daniel Dunbar    if (II.isFilename())
1977115a79277edababaf1b26e3654044ae983197679Daniel Dunbar      CmdArgs.push_back(II.getFilename());
197848f9994bdd9f7f1853782109595b1f80f50afcfaDaniel Dunbar    else {
197948f9994bdd9f7f1853782109595b1f80f50afcfaDaniel Dunbar      const Arg &A = II.getInputArg();
198048f9994bdd9f7f1853782109595b1f80f50afcfaDaniel Dunbar
198148f9994bdd9f7f1853782109595b1f80f50afcfaDaniel Dunbar      // Reverse translate some rewritten options.
198248f9994bdd9f7f1853782109595b1f80f50afcfaDaniel Dunbar      if (A.getOption().matches(options::OPT_Z_reserved_lib_stdcxx)) {
198348f9994bdd9f7f1853782109595b1f80f50afcfaDaniel Dunbar        CmdArgs.push_back("-lstdc++");
198448f9994bdd9f7f1853782109595b1f80f50afcfaDaniel Dunbar        continue;
198548f9994bdd9f7f1853782109595b1f80f50afcfaDaniel Dunbar      }
198648f9994bdd9f7f1853782109595b1f80f50afcfaDaniel Dunbar
1987115a79277edababaf1b26e3654044ae983197679Daniel Dunbar      // Don't render as input, we need gcc to do the translations.
198848f9994bdd9f7f1853782109595b1f80f50afcfaDaniel Dunbar      A.render(Args, CmdArgs);
198948f9994bdd9f7f1853782109595b1f80f50afcfaDaniel Dunbar    }
1990b488c1dac8e53206f07103d794a62a3f5012c0f4Daniel Dunbar  }
1991b488c1dac8e53206f07103d794a62a3f5012c0f4Daniel Dunbar
199279e9e9dd533de9609ef141449bf50e705fa68fd0Rafael Espindola  const char *GCCName = getToolChain().getDriver().getCCCGenericGCCName().c_str();
1993c21c485b4fb58ef5d55cf3e523263dd824a2ace4Daniel Dunbar  const char *Exec =
19944a7e88978cf646ad10d654020cb00b3877069210Daniel Dunbar    Args.MakeArgString(getToolChain().GetProgramPath(GCCName));
19952fe238ed293bd4bc27af9beb9fa151fad2146fa8Daniel Dunbar  C.addCommand(new Command(JA, *this, Exec, CmdArgs));
199647ac7d27c44bd64a7d0fc03d4babc196cf2b8230Daniel Dunbar}
199747ac7d27c44bd64a7d0fc03d4babc196cf2b8230Daniel Dunbar
199882b51cce8cea6b6bb6175c406c2ab425c91d9dc8Daniel Dunbarvoid gcc::Preprocess::RenderExtraToolArgs(const JobAction &JA,
199982b51cce8cea6b6bb6175c406c2ab425c91d9dc8Daniel Dunbar                                          ArgStringList &CmdArgs) const {
2000b488c1dac8e53206f07103d794a62a3f5012c0f4Daniel Dunbar  CmdArgs.push_back("-E");
200147ac7d27c44bd64a7d0fc03d4babc196cf2b8230Daniel Dunbar}
200247ac7d27c44bd64a7d0fc03d4babc196cf2b8230Daniel Dunbar
200382b51cce8cea6b6bb6175c406c2ab425c91d9dc8Daniel Dunbarvoid gcc::Precompile::RenderExtraToolArgs(const JobAction &JA,
200482b51cce8cea6b6bb6175c406c2ab425c91d9dc8Daniel Dunbar                                          ArgStringList &CmdArgs) const {
2005b488c1dac8e53206f07103d794a62a3f5012c0f4Daniel Dunbar  // The type is good enough.
200647ac7d27c44bd64a7d0fc03d4babc196cf2b8230Daniel Dunbar}
200747ac7d27c44bd64a7d0fc03d4babc196cf2b8230Daniel Dunbar
200882b51cce8cea6b6bb6175c406c2ab425c91d9dc8Daniel Dunbarvoid gcc::Compile::RenderExtraToolArgs(const JobAction &JA,
200982b51cce8cea6b6bb6175c406c2ab425c91d9dc8Daniel Dunbar                                       ArgStringList &CmdArgs) const {
201064952508c2b0c8bffb45c8b410f0af3d2457f59bDaniel Dunbar  const Driver &D = getToolChain().getDriver();
201164952508c2b0c8bffb45c8b410f0af3d2457f59bDaniel Dunbar
201282b51cce8cea6b6bb6175c406c2ab425c91d9dc8Daniel Dunbar  // If -flto, etc. are present then make sure not to force assembly output.
20136c6424bc0d3b5f080a97b5f6ef4a8d70c38e38f5Daniel Dunbar  if (JA.getType() == types::TY_LLVM_IR || JA.getType() == types::TY_LTO_IR ||
20146c6424bc0d3b5f080a97b5f6ef4a8d70c38e38f5Daniel Dunbar      JA.getType() == types::TY_LLVM_BC || JA.getType() == types::TY_LTO_BC)
201582b51cce8cea6b6bb6175c406c2ab425c91d9dc8Daniel Dunbar    CmdArgs.push_back("-c");
201664952508c2b0c8bffb45c8b410f0af3d2457f59bDaniel Dunbar  else {
201764952508c2b0c8bffb45c8b410f0af3d2457f59bDaniel Dunbar    if (JA.getType() != types::TY_PP_Asm)
201864952508c2b0c8bffb45c8b410f0af3d2457f59bDaniel Dunbar      D.Diag(clang::diag::err_drv_invalid_gcc_output_type)
201964952508c2b0c8bffb45c8b410f0af3d2457f59bDaniel Dunbar        << getTypeName(JA.getType());
202020249a1af2e462dcafdd6a350f1c7967b264ff25Michael J. Spencer
202182b51cce8cea6b6bb6175c406c2ab425c91d9dc8Daniel Dunbar    CmdArgs.push_back("-S");
202264952508c2b0c8bffb45c8b410f0af3d2457f59bDaniel Dunbar  }
202347ac7d27c44bd64a7d0fc03d4babc196cf2b8230Daniel Dunbar}
202447ac7d27c44bd64a7d0fc03d4babc196cf2b8230Daniel Dunbar
202582b51cce8cea6b6bb6175c406c2ab425c91d9dc8Daniel Dunbarvoid gcc::Assemble::RenderExtraToolArgs(const JobAction &JA,
202682b51cce8cea6b6bb6175c406c2ab425c91d9dc8Daniel Dunbar                                        ArgStringList &CmdArgs) const {
2027b488c1dac8e53206f07103d794a62a3f5012c0f4Daniel Dunbar  CmdArgs.push_back("-c");
2028b488c1dac8e53206f07103d794a62a3f5012c0f4Daniel Dunbar}
202947ac7d27c44bd64a7d0fc03d4babc196cf2b8230Daniel Dunbar
203082b51cce8cea6b6bb6175c406c2ab425c91d9dc8Daniel Dunbarvoid gcc::Link::RenderExtraToolArgs(const JobAction &JA,
203182b51cce8cea6b6bb6175c406c2ab425c91d9dc8Daniel Dunbar                                    ArgStringList &CmdArgs) const {
2032b488c1dac8e53206f07103d794a62a3f5012c0f4Daniel Dunbar  // The types are (hopefully) good enough.
203347ac7d27c44bd64a7d0fc03d4babc196cf2b8230Daniel Dunbar}
2034b488c1dac8e53206f07103d794a62a3f5012c0f4Daniel Dunbar
203540f1265ebd42ece3e7f7917319b56012e8e2bce2Daniel Dunbarconst char *darwin::CC1::getCC1Name(types::ID Type) const {
203640f1265ebd42ece3e7f7917319b56012e8e2bce2Daniel Dunbar  switch (Type) {
203740f1265ebd42ece3e7f7917319b56012e8e2bce2Daniel Dunbar  default:
203840f1265ebd42ece3e7f7917319b56012e8e2bce2Daniel Dunbar    assert(0 && "Unexpected type for Darwin CC1 tool.");
203940f1265ebd42ece3e7f7917319b56012e8e2bce2Daniel Dunbar  case types::TY_Asm:
204040f1265ebd42ece3e7f7917319b56012e8e2bce2Daniel Dunbar  case types::TY_C: case types::TY_CHeader:
204140f1265ebd42ece3e7f7917319b56012e8e2bce2Daniel Dunbar  case types::TY_PP_C: case types::TY_PP_CHeader:
204240f1265ebd42ece3e7f7917319b56012e8e2bce2Daniel Dunbar    return "cc1";
204340f1265ebd42ece3e7f7917319b56012e8e2bce2Daniel Dunbar  case types::TY_ObjC: case types::TY_ObjCHeader:
204440f1265ebd42ece3e7f7917319b56012e8e2bce2Daniel Dunbar  case types::TY_PP_ObjC: case types::TY_PP_ObjCHeader:
204540f1265ebd42ece3e7f7917319b56012e8e2bce2Daniel Dunbar    return "cc1obj";
204640f1265ebd42ece3e7f7917319b56012e8e2bce2Daniel Dunbar  case types::TY_CXX: case types::TY_CXXHeader:
204740f1265ebd42ece3e7f7917319b56012e8e2bce2Daniel Dunbar  case types::TY_PP_CXX: case types::TY_PP_CXXHeader:
204840f1265ebd42ece3e7f7917319b56012e8e2bce2Daniel Dunbar    return "cc1plus";
204940f1265ebd42ece3e7f7917319b56012e8e2bce2Daniel Dunbar  case types::TY_ObjCXX: case types::TY_ObjCXXHeader:
205040f1265ebd42ece3e7f7917319b56012e8e2bce2Daniel Dunbar  case types::TY_PP_ObjCXX: case types::TY_PP_ObjCXXHeader:
205140f1265ebd42ece3e7f7917319b56012e8e2bce2Daniel Dunbar    return "cc1objplus";
205240f1265ebd42ece3e7f7917319b56012e8e2bce2Daniel Dunbar  }
205340f1265ebd42ece3e7f7917319b56012e8e2bce2Daniel Dunbar}
205440f1265ebd42ece3e7f7917319b56012e8e2bce2Daniel Dunbar
2055c21c485b4fb58ef5d55cf3e523263dd824a2ace4Daniel Dunbarconst char *darwin::CC1::getBaseInputName(const ArgList &Args,
2056a5a7bd0de7b6b80212095195a055a4a43f21d4b2Daniel Dunbar                                          const InputInfoList &Inputs) {
2057472ccff00cdbcd095c3ba933b9e3f202719f118fMichael J. Spencer  return Args.MakeArgString(
2058472ccff00cdbcd095c3ba933b9e3f202719f118fMichael J. Spencer    llvm::sys::path::filename(Inputs[0].getBaseInput()));
2059a3ec60e0cf2a1916f479288998d31bd980b1a306Daniel Dunbar}
2060a3ec60e0cf2a1916f479288998d31bd980b1a306Daniel Dunbar
2061c21c485b4fb58ef5d55cf3e523263dd824a2ace4Daniel Dunbarconst char *darwin::CC1::getBaseInputStem(const ArgList &Args,
2062a5a7bd0de7b6b80212095195a055a4a43f21d4b2Daniel Dunbar                                          const InputInfoList &Inputs) {
2063a3ec60e0cf2a1916f479288998d31bd980b1a306Daniel Dunbar  const char *Str = getBaseInputName(Args, Inputs);
2064a3ec60e0cf2a1916f479288998d31bd980b1a306Daniel Dunbar
2065657ca6683d754c903026221a3aa3aa9cedb7556fChris Lattner  if (const char *End = strrchr(Str, '.'))
2066881376467c46c5c6cc16fa6790271c2c22e1d4f1Daniel Dunbar    return Args.MakeArgString(std::string(Str, End));
2067a3ec60e0cf2a1916f479288998d31bd980b1a306Daniel Dunbar
2068a3ec60e0cf2a1916f479288998d31bd980b1a306Daniel Dunbar  return Str;
2069a3ec60e0cf2a1916f479288998d31bd980b1a306Daniel Dunbar}
2070a3ec60e0cf2a1916f479288998d31bd980b1a306Daniel Dunbar
2071a3ec60e0cf2a1916f479288998d31bd980b1a306Daniel Dunbarconst char *
2072c21c485b4fb58ef5d55cf3e523263dd824a2ace4Daniel Dunbardarwin::CC1::getDependencyFileName(const ArgList &Args,
2073a5a7bd0de7b6b80212095195a055a4a43f21d4b2Daniel Dunbar                                   const InputInfoList &Inputs) {
2074a3ec60e0cf2a1916f479288998d31bd980b1a306Daniel Dunbar  // FIXME: Think about this more.
2075a3ec60e0cf2a1916f479288998d31bd980b1a306Daniel Dunbar  std::string Res;
2076a3ec60e0cf2a1916f479288998d31bd980b1a306Daniel Dunbar
2077a3ec60e0cf2a1916f479288998d31bd980b1a306Daniel Dunbar  if (Arg *OutputOpt = Args.getLastArg(options::OPT_o)) {
2078a3ec60e0cf2a1916f479288998d31bd980b1a306Daniel Dunbar    std::string Str(OutputOpt->getValue(Args));
2079c21c485b4fb58ef5d55cf3e523263dd824a2ace4Daniel Dunbar
2080a3ec60e0cf2a1916f479288998d31bd980b1a306Daniel Dunbar    Res = Str.substr(0, Str.rfind('.'));
2081a3ec60e0cf2a1916f479288998d31bd980b1a306Daniel Dunbar  } else
2082a5a7bd0de7b6b80212095195a055a4a43f21d4b2Daniel Dunbar    Res = darwin::CC1::getBaseInputStem(Args, Inputs);
2083a3ec60e0cf2a1916f479288998d31bd980b1a306Daniel Dunbar
2084881376467c46c5c6cc16fa6790271c2c22e1d4f1Daniel Dunbar  return Args.MakeArgString(Res + ".d");
2085a3ec60e0cf2a1916f479288998d31bd980b1a306Daniel Dunbar}
2086a3ec60e0cf2a1916f479288998d31bd980b1a306Daniel Dunbar
2087c21c485b4fb58ef5d55cf3e523263dd824a2ace4Daniel Dunbarvoid darwin::CC1::AddCC1Args(const ArgList &Args,
2088a3ec60e0cf2a1916f479288998d31bd980b1a306Daniel Dunbar                             ArgStringList &CmdArgs) const {
2089ee788e70fcd0adf76103b17c78ac658d4ea30c9bDaniel Dunbar  const Driver &D = getToolChain().getDriver();
2090e2fd66418eca3d70cf6b62087d745d0c5181db69Daniel Dunbar
2091e2fd66418eca3d70cf6b62087d745d0c5181db69Daniel Dunbar  CheckCodeGenerationOptions(D, Args);
2092e2fd66418eca3d70cf6b62087d745d0c5181db69Daniel Dunbar
2093a3ec60e0cf2a1916f479288998d31bd980b1a306Daniel Dunbar  // Derived from cc1 spec.
2094a3ec60e0cf2a1916f479288998d31bd980b1a306Daniel Dunbar  if (!Args.hasArg(options::OPT_mkernel) && !Args.hasArg(options::OPT_static) &&
2095a3ec60e0cf2a1916f479288998d31bd980b1a306Daniel Dunbar      !Args.hasArg(options::OPT_mdynamic_no_pic))
2096a3ec60e0cf2a1916f479288998d31bd980b1a306Daniel Dunbar    CmdArgs.push_back("-fPIC");
2097a3ec60e0cf2a1916f479288998d31bd980b1a306Daniel Dunbar
20982ba91575905a54f712a7f64304e56002e4882499Daniel Dunbar  if (getToolChain().getTriple().getArch() == llvm::Triple::arm ||
20992ba91575905a54f712a7f64304e56002e4882499Daniel Dunbar      getToolChain().getTriple().getArch() == llvm::Triple::thumb) {
21002ba91575905a54f712a7f64304e56002e4882499Daniel Dunbar    if (!Args.hasArg(options::OPT_fbuiltin_strcat))
21012ba91575905a54f712a7f64304e56002e4882499Daniel Dunbar      CmdArgs.push_back("-fno-builtin-strcat");
21022ba91575905a54f712a7f64304e56002e4882499Daniel Dunbar    if (!Args.hasArg(options::OPT_fbuiltin_strcpy))
21032ba91575905a54f712a7f64304e56002e4882499Daniel Dunbar      CmdArgs.push_back("-fno-builtin-strcpy");
21042ba91575905a54f712a7f64304e56002e4882499Daniel Dunbar  }
21052ba91575905a54f712a7f64304e56002e4882499Daniel Dunbar
2106a3ec60e0cf2a1916f479288998d31bd980b1a306Daniel Dunbar  // gcc has some code here to deal with when no -mmacosx-version-min
2107a3ec60e0cf2a1916f479288998d31bd980b1a306Daniel Dunbar  // and no -miphoneos-version-min is present, but this never happens
2108a3ec60e0cf2a1916f479288998d31bd980b1a306Daniel Dunbar  // due to tool chain specific argument translation.
2109a3ec60e0cf2a1916f479288998d31bd980b1a306Daniel Dunbar
2110a3ec60e0cf2a1916f479288998d31bd980b1a306Daniel Dunbar  if (Args.hasArg(options::OPT_g_Flag) &&
2111a3ec60e0cf2a1916f479288998d31bd980b1a306Daniel Dunbar      !Args.hasArg(options::OPT_fno_eliminate_unused_debug_symbols))
2112a3ec60e0cf2a1916f479288998d31bd980b1a306Daniel Dunbar    CmdArgs.push_back("-feliminate-unused-debug-symbols");
2113a3ec60e0cf2a1916f479288998d31bd980b1a306Daniel Dunbar}
2114a3ec60e0cf2a1916f479288998d31bd980b1a306Daniel Dunbar
2115a3ec60e0cf2a1916f479288998d31bd980b1a306Daniel Dunbarvoid darwin::CC1::AddCC1OptionsArgs(const ArgList &Args, ArgStringList &CmdArgs,
2116a3ec60e0cf2a1916f479288998d31bd980b1a306Daniel Dunbar                                    const InputInfoList &Inputs,
2117a3ec60e0cf2a1916f479288998d31bd980b1a306Daniel Dunbar                                    const ArgStringList &OutputArgs) const {
2118ee788e70fcd0adf76103b17c78ac658d4ea30c9bDaniel Dunbar  const Driver &D = getToolChain().getDriver();
2119a3ec60e0cf2a1916f479288998d31bd980b1a306Daniel Dunbar
2120a3ec60e0cf2a1916f479288998d31bd980b1a306Daniel Dunbar  // Derived from cc1_options spec.
2121a3ec60e0cf2a1916f479288998d31bd980b1a306Daniel Dunbar  if (Args.hasArg(options::OPT_fast) ||
2122a3ec60e0cf2a1916f479288998d31bd980b1a306Daniel Dunbar      Args.hasArg(options::OPT_fastf) ||
2123a3ec60e0cf2a1916f479288998d31bd980b1a306Daniel Dunbar      Args.hasArg(options::OPT_fastcp))
2124a3ec60e0cf2a1916f479288998d31bd980b1a306Daniel Dunbar    CmdArgs.push_back("-O3");
2125c21c485b4fb58ef5d55cf3e523263dd824a2ace4Daniel Dunbar
2126a3ec60e0cf2a1916f479288998d31bd980b1a306Daniel Dunbar  if (Arg *A = Args.getLastArg(options::OPT_pg))
2127a3ec60e0cf2a1916f479288998d31bd980b1a306Daniel Dunbar    if (Args.hasArg(options::OPT_fomit_frame_pointer))
2128a3ec60e0cf2a1916f479288998d31bd980b1a306Daniel Dunbar      D.Diag(clang::diag::err_drv_argument_not_allowed_with)
2129a3ec60e0cf2a1916f479288998d31bd980b1a306Daniel Dunbar        << A->getAsString(Args) << "-fomit-frame-pointer";
2130a3ec60e0cf2a1916f479288998d31bd980b1a306Daniel Dunbar
2131a3ec60e0cf2a1916f479288998d31bd980b1a306Daniel Dunbar  AddCC1Args(Args, CmdArgs);
2132a3ec60e0cf2a1916f479288998d31bd980b1a306Daniel Dunbar
2133a3ec60e0cf2a1916f479288998d31bd980b1a306Daniel Dunbar  if (!Args.hasArg(options::OPT_Q))
2134a3ec60e0cf2a1916f479288998d31bd980b1a306Daniel Dunbar    CmdArgs.push_back("-quiet");
2135a3ec60e0cf2a1916f479288998d31bd980b1a306Daniel Dunbar
2136a3ec60e0cf2a1916f479288998d31bd980b1a306Daniel Dunbar  CmdArgs.push_back("-dumpbase");
2137a5a7bd0de7b6b80212095195a055a4a43f21d4b2Daniel Dunbar  CmdArgs.push_back(darwin::CC1::getBaseInputName(Args, Inputs));
2138a3ec60e0cf2a1916f479288998d31bd980b1a306Daniel Dunbar
2139a3ec60e0cf2a1916f479288998d31bd980b1a306Daniel Dunbar  Args.AddAllArgs(CmdArgs, options::OPT_d_Group);
2140a3ec60e0cf2a1916f479288998d31bd980b1a306Daniel Dunbar
2141a3ec60e0cf2a1916f479288998d31bd980b1a306Daniel Dunbar  Args.AddAllArgs(CmdArgs, options::OPT_m_Group);
2142a3ec60e0cf2a1916f479288998d31bd980b1a306Daniel Dunbar  Args.AddAllArgs(CmdArgs, options::OPT_a_Group);
2143a3ec60e0cf2a1916f479288998d31bd980b1a306Daniel Dunbar
2144a3ec60e0cf2a1916f479288998d31bd980b1a306Daniel Dunbar  // FIXME: The goal is to use the user provided -o if that is our
2145a3ec60e0cf2a1916f479288998d31bd980b1a306Daniel Dunbar  // final output, otherwise to drive from the original input
2146a3ec60e0cf2a1916f479288998d31bd980b1a306Daniel Dunbar  // name. Find a clean way to go about this.
2147a3ec60e0cf2a1916f479288998d31bd980b1a306Daniel Dunbar  if ((Args.hasArg(options::OPT_c) || Args.hasArg(options::OPT_S)) &&
2148a3ec60e0cf2a1916f479288998d31bd980b1a306Daniel Dunbar      Args.hasArg(options::OPT_o)) {
2149a3ec60e0cf2a1916f479288998d31bd980b1a306Daniel Dunbar    Arg *OutputOpt = Args.getLastArg(options::OPT_o);
2150a3ec60e0cf2a1916f479288998d31bd980b1a306Daniel Dunbar    CmdArgs.push_back("-auxbase-strip");
2151a3ec60e0cf2a1916f479288998d31bd980b1a306Daniel Dunbar    CmdArgs.push_back(OutputOpt->getValue(Args));
2152a3ec60e0cf2a1916f479288998d31bd980b1a306Daniel Dunbar  } else {
2153a3ec60e0cf2a1916f479288998d31bd980b1a306Daniel Dunbar    CmdArgs.push_back("-auxbase");
2154a5a7bd0de7b6b80212095195a055a4a43f21d4b2Daniel Dunbar    CmdArgs.push_back(darwin::CC1::getBaseInputStem(Args, Inputs));
2155a3ec60e0cf2a1916f479288998d31bd980b1a306Daniel Dunbar  }
2156a3ec60e0cf2a1916f479288998d31bd980b1a306Daniel Dunbar
2157a3ec60e0cf2a1916f479288998d31bd980b1a306Daniel Dunbar  Args.AddAllArgs(CmdArgs, options::OPT_g_Group);
2158a3ec60e0cf2a1916f479288998d31bd980b1a306Daniel Dunbar
2159a3ec60e0cf2a1916f479288998d31bd980b1a306Daniel Dunbar  Args.AddAllArgs(CmdArgs, options::OPT_O);
2160a3ec60e0cf2a1916f479288998d31bd980b1a306Daniel Dunbar  // FIXME: -Wall is getting some special treatment. Investigate.
2161a3ec60e0cf2a1916f479288998d31bd980b1a306Daniel Dunbar  Args.AddAllArgs(CmdArgs, options::OPT_W_Group, options::OPT_pedantic_Group);
2162a3ec60e0cf2a1916f479288998d31bd980b1a306Daniel Dunbar  Args.AddLastArg(CmdArgs, options::OPT_w);
2163c21c485b4fb58ef5d55cf3e523263dd824a2ace4Daniel Dunbar  Args.AddAllArgs(CmdArgs, options::OPT_std_EQ, options::OPT_ansi,
2164a3ec60e0cf2a1916f479288998d31bd980b1a306Daniel Dunbar                  options::OPT_trigraphs);
2165a3ff202ee4fb21728e930d5d029ba4925129912cDaniel Dunbar  if (!Args.getLastArg(options::OPT_std_EQ, options::OPT_ansi)) {
2166a3ff202ee4fb21728e930d5d029ba4925129912cDaniel Dunbar    // Honor -std-default.
2167a3ff202ee4fb21728e930d5d029ba4925129912cDaniel Dunbar    Args.AddAllArgsTranslated(CmdArgs, options::OPT_std_default_EQ,
2168a3ff202ee4fb21728e930d5d029ba4925129912cDaniel Dunbar                              "-std=", /*Joined=*/true);
2169a3ff202ee4fb21728e930d5d029ba4925129912cDaniel Dunbar  }
2170a3ff202ee4fb21728e930d5d029ba4925129912cDaniel Dunbar
2171a3ec60e0cf2a1916f479288998d31bd980b1a306Daniel Dunbar  if (Args.hasArg(options::OPT_v))
2172a3ec60e0cf2a1916f479288998d31bd980b1a306Daniel Dunbar    CmdArgs.push_back("-version");
2173a3ec60e0cf2a1916f479288998d31bd980b1a306Daniel Dunbar  if (Args.hasArg(options::OPT_pg))
2174a3ec60e0cf2a1916f479288998d31bd980b1a306Daniel Dunbar    CmdArgs.push_back("-p");
2175a3ec60e0cf2a1916f479288998d31bd980b1a306Daniel Dunbar  Args.AddLastArg(CmdArgs, options::OPT_p);
2176c21c485b4fb58ef5d55cf3e523263dd824a2ace4Daniel Dunbar
2177a3ec60e0cf2a1916f479288998d31bd980b1a306Daniel Dunbar  // The driver treats -fsyntax-only specially.
21782ba91575905a54f712a7f64304e56002e4882499Daniel Dunbar  if (getToolChain().getTriple().getArch() == llvm::Triple::arm ||
21792ba91575905a54f712a7f64304e56002e4882499Daniel Dunbar      getToolChain().getTriple().getArch() == llvm::Triple::thumb) {
21802ba91575905a54f712a7f64304e56002e4882499Daniel Dunbar    // Removes -fbuiltin-str{cat,cpy}; these aren't recognized by cc1 but are
21812ba91575905a54f712a7f64304e56002e4882499Daniel Dunbar    // used to inhibit the default -fno-builtin-str{cat,cpy}.
21822ba91575905a54f712a7f64304e56002e4882499Daniel Dunbar    //
21832ba91575905a54f712a7f64304e56002e4882499Daniel Dunbar    // FIXME: Should we grow a better way to deal with "removing" args?
2184cdd9686b890ebdc10039ae256ef4c9dfb5ebacb7Daniel Dunbar    for (arg_iterator it = Args.filtered_begin(options::OPT_f_Group,
2185cdd9686b890ebdc10039ae256ef4c9dfb5ebacb7Daniel Dunbar                                               options::OPT_fsyntax_only),
2186cdd9686b890ebdc10039ae256ef4c9dfb5ebacb7Daniel Dunbar           ie = Args.filtered_end(); it != ie; ++it) {
21877e4953e5c60409007545288f14b430bd23d68570Daniel Dunbar      if (!(*it)->getOption().matches(options::OPT_fbuiltin_strcat) &&
21887e4953e5c60409007545288f14b430bd23d68570Daniel Dunbar          !(*it)->getOption().matches(options::OPT_fbuiltin_strcpy)) {
21897e4953e5c60409007545288f14b430bd23d68570Daniel Dunbar        (*it)->claim();
21907e4953e5c60409007545288f14b430bd23d68570Daniel Dunbar        (*it)->render(Args, CmdArgs);
21912ba91575905a54f712a7f64304e56002e4882499Daniel Dunbar      }
21922ba91575905a54f712a7f64304e56002e4882499Daniel Dunbar    }
21932ba91575905a54f712a7f64304e56002e4882499Daniel Dunbar  } else
21942ba91575905a54f712a7f64304e56002e4882499Daniel Dunbar    Args.AddAllArgs(CmdArgs, options::OPT_f_Group, options::OPT_fsyntax_only);
2195c21c485b4fb58ef5d55cf3e523263dd824a2ace4Daniel Dunbar
2196a3ec60e0cf2a1916f479288998d31bd980b1a306Daniel Dunbar  Args.AddAllArgs(CmdArgs, options::OPT_undef);
2197a3ec60e0cf2a1916f479288998d31bd980b1a306Daniel Dunbar  if (Args.hasArg(options::OPT_Qn))
2198a3ec60e0cf2a1916f479288998d31bd980b1a306Daniel Dunbar    CmdArgs.push_back("-fno-ident");
2199c21c485b4fb58ef5d55cf3e523263dd824a2ace4Daniel Dunbar
2200a3ec60e0cf2a1916f479288998d31bd980b1a306Daniel Dunbar  // FIXME: This isn't correct.
2201a3ec60e0cf2a1916f479288998d31bd980b1a306Daniel Dunbar  //Args.AddLastArg(CmdArgs, options::OPT__help)
2202a3ec60e0cf2a1916f479288998d31bd980b1a306Daniel Dunbar  //Args.AddLastArg(CmdArgs, options::OPT__targetHelp)
2203a3ec60e0cf2a1916f479288998d31bd980b1a306Daniel Dunbar
2204a3ec60e0cf2a1916f479288998d31bd980b1a306Daniel Dunbar  CmdArgs.append(OutputArgs.begin(), OutputArgs.end());
2205a3ec60e0cf2a1916f479288998d31bd980b1a306Daniel Dunbar
2206a3ec60e0cf2a1916f479288998d31bd980b1a306Daniel Dunbar  // FIXME: Still don't get what is happening here. Investigate.
2207a3ec60e0cf2a1916f479288998d31bd980b1a306Daniel Dunbar  Args.AddAllArgs(CmdArgs, options::OPT__param);
2208a3ec60e0cf2a1916f479288998d31bd980b1a306Daniel Dunbar
2209a3ec60e0cf2a1916f479288998d31bd980b1a306Daniel Dunbar  if (Args.hasArg(options::OPT_fmudflap) ||
2210a3ec60e0cf2a1916f479288998d31bd980b1a306Daniel Dunbar      Args.hasArg(options::OPT_fmudflapth)) {
2211a3ec60e0cf2a1916f479288998d31bd980b1a306Daniel Dunbar    CmdArgs.push_back("-fno-builtin");
2212a3ec60e0cf2a1916f479288998d31bd980b1a306Daniel Dunbar    CmdArgs.push_back("-fno-merge-constants");
2213a3ec60e0cf2a1916f479288998d31bd980b1a306Daniel Dunbar  }
2214c21c485b4fb58ef5d55cf3e523263dd824a2ace4Daniel Dunbar
2215a3ec60e0cf2a1916f479288998d31bd980b1a306Daniel Dunbar  if (Args.hasArg(options::OPT_coverage)) {
2216a3ec60e0cf2a1916f479288998d31bd980b1a306Daniel Dunbar    CmdArgs.push_back("-fprofile-arcs");
2217a3ec60e0cf2a1916f479288998d31bd980b1a306Daniel Dunbar    CmdArgs.push_back("-ftest-coverage");
2218a3ec60e0cf2a1916f479288998d31bd980b1a306Daniel Dunbar  }
2219a3ec60e0cf2a1916f479288998d31bd980b1a306Daniel Dunbar
2220a3ec60e0cf2a1916f479288998d31bd980b1a306Daniel Dunbar  if (types::isCXX(Inputs[0].getType()))
2221a3ec60e0cf2a1916f479288998d31bd980b1a306Daniel Dunbar    CmdArgs.push_back("-D__private_extern__=extern");
2222a3ec60e0cf2a1916f479288998d31bd980b1a306Daniel Dunbar}
2223a3ec60e0cf2a1916f479288998d31bd980b1a306Daniel Dunbar
2224a3ec60e0cf2a1916f479288998d31bd980b1a306Daniel Dunbarvoid darwin::CC1::AddCPPOptionsArgs(const ArgList &Args, ArgStringList &CmdArgs,
2225a3ec60e0cf2a1916f479288998d31bd980b1a306Daniel Dunbar                                    const InputInfoList &Inputs,
2226a3ec60e0cf2a1916f479288998d31bd980b1a306Daniel Dunbar                                    const ArgStringList &OutputArgs) const {
2227a3ec60e0cf2a1916f479288998d31bd980b1a306Daniel Dunbar  // Derived from cpp_options
2228a3ec60e0cf2a1916f479288998d31bd980b1a306Daniel Dunbar  AddCPPUniqueOptionsArgs(Args, CmdArgs, Inputs);
2229c21c485b4fb58ef5d55cf3e523263dd824a2ace4Daniel Dunbar
2230a3ec60e0cf2a1916f479288998d31bd980b1a306Daniel Dunbar  CmdArgs.append(OutputArgs.begin(), OutputArgs.end());
2231a3ec60e0cf2a1916f479288998d31bd980b1a306Daniel Dunbar
2232a3ec60e0cf2a1916f479288998d31bd980b1a306Daniel Dunbar  AddCC1Args(Args, CmdArgs);
2233a3ec60e0cf2a1916f479288998d31bd980b1a306Daniel Dunbar
2234a3ec60e0cf2a1916f479288998d31bd980b1a306Daniel Dunbar  // NOTE: The code below has some commonality with cpp_options, but
2235a3ec60e0cf2a1916f479288998d31bd980b1a306Daniel Dunbar  // in classic gcc style ends up sending things in different
2236a3ec60e0cf2a1916f479288998d31bd980b1a306Daniel Dunbar  // orders. This may be a good merge candidate once we drop pedantic
2237a3ec60e0cf2a1916f479288998d31bd980b1a306Daniel Dunbar  // compatibility.
2238a3ec60e0cf2a1916f479288998d31bd980b1a306Daniel Dunbar
2239a3ec60e0cf2a1916f479288998d31bd980b1a306Daniel Dunbar  Args.AddAllArgs(CmdArgs, options::OPT_m_Group);
2240c21c485b4fb58ef5d55cf3e523263dd824a2ace4Daniel Dunbar  Args.AddAllArgs(CmdArgs, options::OPT_std_EQ, options::OPT_ansi,
2241a3ec60e0cf2a1916f479288998d31bd980b1a306Daniel Dunbar                  options::OPT_trigraphs);
2242a3ff202ee4fb21728e930d5d029ba4925129912cDaniel Dunbar  if (!Args.getLastArg(options::OPT_std_EQ, options::OPT_ansi)) {
2243a3ff202ee4fb21728e930d5d029ba4925129912cDaniel Dunbar    // Honor -std-default.
2244a3ff202ee4fb21728e930d5d029ba4925129912cDaniel Dunbar    Args.AddAllArgsTranslated(CmdArgs, options::OPT_std_default_EQ,
2245a3ff202ee4fb21728e930d5d029ba4925129912cDaniel Dunbar                              "-std=", /*Joined=*/true);
2246a3ff202ee4fb21728e930d5d029ba4925129912cDaniel Dunbar  }
2247a3ec60e0cf2a1916f479288998d31bd980b1a306Daniel Dunbar  Args.AddAllArgs(CmdArgs, options::OPT_W_Group, options::OPT_pedantic_Group);
2248a3ec60e0cf2a1916f479288998d31bd980b1a306Daniel Dunbar  Args.AddLastArg(CmdArgs, options::OPT_w);
2249c21c485b4fb58ef5d55cf3e523263dd824a2ace4Daniel Dunbar
2250a3ec60e0cf2a1916f479288998d31bd980b1a306Daniel Dunbar  // The driver treats -fsyntax-only specially.
2251a3ec60e0cf2a1916f479288998d31bd980b1a306Daniel Dunbar  Args.AddAllArgs(CmdArgs, options::OPT_f_Group, options::OPT_fsyntax_only);
2252a3ec60e0cf2a1916f479288998d31bd980b1a306Daniel Dunbar
2253a3ec60e0cf2a1916f479288998d31bd980b1a306Daniel Dunbar  if (Args.hasArg(options::OPT_g_Group) && !Args.hasArg(options::OPT_g0) &&
2254a3ec60e0cf2a1916f479288998d31bd980b1a306Daniel Dunbar      !Args.hasArg(options::OPT_fno_working_directory))
2255a3ec60e0cf2a1916f479288998d31bd980b1a306Daniel Dunbar    CmdArgs.push_back("-fworking-directory");
2256a3ec60e0cf2a1916f479288998d31bd980b1a306Daniel Dunbar
2257a3ec60e0cf2a1916f479288998d31bd980b1a306Daniel Dunbar  Args.AddAllArgs(CmdArgs, options::OPT_O);
2258a3ec60e0cf2a1916f479288998d31bd980b1a306Daniel Dunbar  Args.AddAllArgs(CmdArgs, options::OPT_undef);
2259a3ec60e0cf2a1916f479288998d31bd980b1a306Daniel Dunbar  if (Args.hasArg(options::OPT_save_temps))
2260a3ec60e0cf2a1916f479288998d31bd980b1a306Daniel Dunbar    CmdArgs.push_back("-fpch-preprocess");
2261a3ec60e0cf2a1916f479288998d31bd980b1a306Daniel Dunbar}
2262a3ec60e0cf2a1916f479288998d31bd980b1a306Daniel Dunbar
2263c21c485b4fb58ef5d55cf3e523263dd824a2ace4Daniel Dunbarvoid darwin::CC1::AddCPPUniqueOptionsArgs(const ArgList &Args,
2264a3ec60e0cf2a1916f479288998d31bd980b1a306Daniel Dunbar                                          ArgStringList &CmdArgs,
22651eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump                                          const InputInfoList &Inputs) const {
2266ee788e70fcd0adf76103b17c78ac658d4ea30c9bDaniel Dunbar  const Driver &D = getToolChain().getDriver();
2267a3ec60e0cf2a1916f479288998d31bd980b1a306Daniel Dunbar
226888a3d6cf5ebab81614f89ba48a8d89023270637aDaniel Dunbar  CheckPreprocessingOptions(D, Args);
226988a3d6cf5ebab81614f89ba48a8d89023270637aDaniel Dunbar
2270a3ec60e0cf2a1916f479288998d31bd980b1a306Daniel Dunbar  // Derived from cpp_unique_options.
227188a3d6cf5ebab81614f89ba48a8d89023270637aDaniel Dunbar  // -{C,CC} only with -E is checked in CheckPreprocessingOptions().
227288a3d6cf5ebab81614f89ba48a8d89023270637aDaniel Dunbar  Args.AddLastArg(CmdArgs, options::OPT_C);
227388a3d6cf5ebab81614f89ba48a8d89023270637aDaniel Dunbar  Args.AddLastArg(CmdArgs, options::OPT_CC);
2274a3ec60e0cf2a1916f479288998d31bd980b1a306Daniel Dunbar  if (!Args.hasArg(options::OPT_Q))
2275a3ec60e0cf2a1916f479288998d31bd980b1a306Daniel Dunbar    CmdArgs.push_back("-quiet");
2276a3ec60e0cf2a1916f479288998d31bd980b1a306Daniel Dunbar  Args.AddAllArgs(CmdArgs, options::OPT_nostdinc);
22774c2bcad7b843c10fd4a2ffd43da40bfefb4dc8baDouglas Gregor  Args.AddAllArgs(CmdArgs, options::OPT_nostdincxx);
2278a3ec60e0cf2a1916f479288998d31bd980b1a306Daniel Dunbar  Args.AddLastArg(CmdArgs, options::OPT_v);
2279a3ec60e0cf2a1916f479288998d31bd980b1a306Daniel Dunbar  Args.AddAllArgs(CmdArgs, options::OPT_I_Group, options::OPT_F);
2280a3ec60e0cf2a1916f479288998d31bd980b1a306Daniel Dunbar  Args.AddLastArg(CmdArgs, options::OPT_P);
2281a3ec60e0cf2a1916f479288998d31bd980b1a306Daniel Dunbar
2282a3ec60e0cf2a1916f479288998d31bd980b1a306Daniel Dunbar  // FIXME: Handle %I properly.
2283a3ec60e0cf2a1916f479288998d31bd980b1a306Daniel Dunbar  if (getToolChain().getArchName() == "x86_64") {
2284a3ec60e0cf2a1916f479288998d31bd980b1a306Daniel Dunbar    CmdArgs.push_back("-imultilib");
2285a3ec60e0cf2a1916f479288998d31bd980b1a306Daniel Dunbar    CmdArgs.push_back("x86_64");
2286a3ec60e0cf2a1916f479288998d31bd980b1a306Daniel Dunbar  }
2287a3ec60e0cf2a1916f479288998d31bd980b1a306Daniel Dunbar
2288a3ec60e0cf2a1916f479288998d31bd980b1a306Daniel Dunbar  if (Args.hasArg(options::OPT_MD)) {
2289a3ec60e0cf2a1916f479288998d31bd980b1a306Daniel Dunbar    CmdArgs.push_back("-MD");
2290a5a7bd0de7b6b80212095195a055a4a43f21d4b2Daniel Dunbar    CmdArgs.push_back(darwin::CC1::getDependencyFileName(Args, Inputs));
2291a3ec60e0cf2a1916f479288998d31bd980b1a306Daniel Dunbar  }
2292a3ec60e0cf2a1916f479288998d31bd980b1a306Daniel Dunbar
2293a3ec60e0cf2a1916f479288998d31bd980b1a306Daniel Dunbar  if (Args.hasArg(options::OPT_MMD)) {
2294a3ec60e0cf2a1916f479288998d31bd980b1a306Daniel Dunbar    CmdArgs.push_back("-MMD");
2295a5a7bd0de7b6b80212095195a055a4a43f21d4b2Daniel Dunbar    CmdArgs.push_back(darwin::CC1::getDependencyFileName(Args, Inputs));
2296a3ec60e0cf2a1916f479288998d31bd980b1a306Daniel Dunbar  }
2297a3ec60e0cf2a1916f479288998d31bd980b1a306Daniel Dunbar
2298a3ec60e0cf2a1916f479288998d31bd980b1a306Daniel Dunbar  Args.AddLastArg(CmdArgs, options::OPT_M);
2299a3ec60e0cf2a1916f479288998d31bd980b1a306Daniel Dunbar  Args.AddLastArg(CmdArgs, options::OPT_MM);
2300a3ec60e0cf2a1916f479288998d31bd980b1a306Daniel Dunbar  Args.AddAllArgs(CmdArgs, options::OPT_MF);
2301a3ec60e0cf2a1916f479288998d31bd980b1a306Daniel Dunbar  Args.AddLastArg(CmdArgs, options::OPT_MG);
2302a3ec60e0cf2a1916f479288998d31bd980b1a306Daniel Dunbar  Args.AddLastArg(CmdArgs, options::OPT_MP);
2303a3ec60e0cf2a1916f479288998d31bd980b1a306Daniel Dunbar  Args.AddAllArgs(CmdArgs, options::OPT_MQ);
2304a3ec60e0cf2a1916f479288998d31bd980b1a306Daniel Dunbar  Args.AddAllArgs(CmdArgs, options::OPT_MT);
2305a3ec60e0cf2a1916f479288998d31bd980b1a306Daniel Dunbar  if (!Args.hasArg(options::OPT_M) && !Args.hasArg(options::OPT_MM) &&
2306a3ec60e0cf2a1916f479288998d31bd980b1a306Daniel Dunbar      (Args.hasArg(options::OPT_MD) || Args.hasArg(options::OPT_MMD))) {
2307a3ec60e0cf2a1916f479288998d31bd980b1a306Daniel Dunbar    if (Arg *OutputOpt = Args.getLastArg(options::OPT_o)) {
2308a3ec60e0cf2a1916f479288998d31bd980b1a306Daniel Dunbar      CmdArgs.push_back("-MQ");
2309a3ec60e0cf2a1916f479288998d31bd980b1a306Daniel Dunbar      CmdArgs.push_back(OutputOpt->getValue(Args));
2310a3ec60e0cf2a1916f479288998d31bd980b1a306Daniel Dunbar    }
2311a3ec60e0cf2a1916f479288998d31bd980b1a306Daniel Dunbar  }
2312a3ec60e0cf2a1916f479288998d31bd980b1a306Daniel Dunbar
2313a3ec60e0cf2a1916f479288998d31bd980b1a306Daniel Dunbar  Args.AddLastArg(CmdArgs, options::OPT_remap);
2314a3ec60e0cf2a1916f479288998d31bd980b1a306Daniel Dunbar  if (Args.hasArg(options::OPT_g3))
2315a3ec60e0cf2a1916f479288998d31bd980b1a306Daniel Dunbar    CmdArgs.push_back("-dD");
2316a3ec60e0cf2a1916f479288998d31bd980b1a306Daniel Dunbar  Args.AddLastArg(CmdArgs, options::OPT_H);
2317a3ec60e0cf2a1916f479288998d31bd980b1a306Daniel Dunbar
2318a3ec60e0cf2a1916f479288998d31bd980b1a306Daniel Dunbar  AddCPPArgs(Args, CmdArgs);
2319a3ec60e0cf2a1916f479288998d31bd980b1a306Daniel Dunbar
2320a3ec60e0cf2a1916f479288998d31bd980b1a306Daniel Dunbar  Args.AddAllArgs(CmdArgs, options::OPT_D, options::OPT_U, options::OPT_A);
2321a3ec60e0cf2a1916f479288998d31bd980b1a306Daniel Dunbar  Args.AddAllArgs(CmdArgs, options::OPT_i_Group);
2322a3ec60e0cf2a1916f479288998d31bd980b1a306Daniel Dunbar
2323a3ec60e0cf2a1916f479288998d31bd980b1a306Daniel Dunbar  for (InputInfoList::const_iterator
2324a3ec60e0cf2a1916f479288998d31bd980b1a306Daniel Dunbar         it = Inputs.begin(), ie = Inputs.end(); it != ie; ++it) {
2325a3ec60e0cf2a1916f479288998d31bd980b1a306Daniel Dunbar    const InputInfo &II = *it;
2326c21c485b4fb58ef5d55cf3e523263dd824a2ace4Daniel Dunbar
23277c1e46533cae07216e2a67d5636a5afb44253155Daniel Dunbar    CmdArgs.push_back(II.getFilename());
2328a3ec60e0cf2a1916f479288998d31bd980b1a306Daniel Dunbar  }
2329a3ec60e0cf2a1916f479288998d31bd980b1a306Daniel Dunbar
2330a3ec60e0cf2a1916f479288998d31bd980b1a306Daniel Dunbar  Args.AddAllArgValues(CmdArgs, options::OPT_Wp_COMMA,
2331a3ec60e0cf2a1916f479288998d31bd980b1a306Daniel Dunbar                       options::OPT_Xpreprocessor);
2332a3ec60e0cf2a1916f479288998d31bd980b1a306Daniel Dunbar
2333a3ec60e0cf2a1916f479288998d31bd980b1a306Daniel Dunbar  if (Args.hasArg(options::OPT_fmudflap)) {
2334a3ec60e0cf2a1916f479288998d31bd980b1a306Daniel Dunbar    CmdArgs.push_back("-D_MUDFLAP");
2335a3ec60e0cf2a1916f479288998d31bd980b1a306Daniel Dunbar    CmdArgs.push_back("-include");
2336a3ec60e0cf2a1916f479288998d31bd980b1a306Daniel Dunbar    CmdArgs.push_back("mf-runtime.h");
2337a3ec60e0cf2a1916f479288998d31bd980b1a306Daniel Dunbar  }
2338a3ec60e0cf2a1916f479288998d31bd980b1a306Daniel Dunbar
2339a3ec60e0cf2a1916f479288998d31bd980b1a306Daniel Dunbar  if (Args.hasArg(options::OPT_fmudflapth)) {
2340a3ec60e0cf2a1916f479288998d31bd980b1a306Daniel Dunbar    CmdArgs.push_back("-D_MUDFLAP");
2341a3ec60e0cf2a1916f479288998d31bd980b1a306Daniel Dunbar    CmdArgs.push_back("-D_MUDFLAPTH");
2342a3ec60e0cf2a1916f479288998d31bd980b1a306Daniel Dunbar    CmdArgs.push_back("-include");
2343a3ec60e0cf2a1916f479288998d31bd980b1a306Daniel Dunbar    CmdArgs.push_back("mf-runtime.h");
2344a3ec60e0cf2a1916f479288998d31bd980b1a306Daniel Dunbar  }
2345a3ec60e0cf2a1916f479288998d31bd980b1a306Daniel Dunbar}
2346a3ec60e0cf2a1916f479288998d31bd980b1a306Daniel Dunbar
2347c21c485b4fb58ef5d55cf3e523263dd824a2ace4Daniel Dunbarvoid darwin::CC1::AddCPPArgs(const ArgList &Args,
2348a3ec60e0cf2a1916f479288998d31bd980b1a306Daniel Dunbar                             ArgStringList &CmdArgs) const {
2349a3ec60e0cf2a1916f479288998d31bd980b1a306Daniel Dunbar  // Derived from cpp spec.
2350a3ec60e0cf2a1916f479288998d31bd980b1a306Daniel Dunbar
2351a3ec60e0cf2a1916f479288998d31bd980b1a306Daniel Dunbar  if (Args.hasArg(options::OPT_static)) {
2352a3ec60e0cf2a1916f479288998d31bd980b1a306Daniel Dunbar    // The gcc spec is broken here, it refers to dynamic but
2353a3ec60e0cf2a1916f479288998d31bd980b1a306Daniel Dunbar    // that has been translated. Start by being bug compatible.
2354c21c485b4fb58ef5d55cf3e523263dd824a2ace4Daniel Dunbar
2355a3ec60e0cf2a1916f479288998d31bd980b1a306Daniel Dunbar    // if (!Args.hasArg(arglist.parser.dynamicOption))
2356a3ec60e0cf2a1916f479288998d31bd980b1a306Daniel Dunbar    CmdArgs.push_back("-D__STATIC__");
2357a3ec60e0cf2a1916f479288998d31bd980b1a306Daniel Dunbar  } else
2358a3ec60e0cf2a1916f479288998d31bd980b1a306Daniel Dunbar    CmdArgs.push_back("-D__DYNAMIC__");
2359a3ec60e0cf2a1916f479288998d31bd980b1a306Daniel Dunbar
2360a3ec60e0cf2a1916f479288998d31bd980b1a306Daniel Dunbar  if (Args.hasArg(options::OPT_pthread))
2361a3ec60e0cf2a1916f479288998d31bd980b1a306Daniel Dunbar    CmdArgs.push_back("-D_REENTRANT");
2362a3ec60e0cf2a1916f479288998d31bd980b1a306Daniel Dunbar}
2363a3ec60e0cf2a1916f479288998d31bd980b1a306Daniel Dunbar
236440f1265ebd42ece3e7f7917319b56012e8e2bce2Daniel Dunbarvoid darwin::Preprocess::ConstructJob(Compilation &C, const JobAction &JA,
23652fe238ed293bd4bc27af9beb9fa151fad2146fa8Daniel Dunbar                                      const InputInfo &Output,
2366c21c485b4fb58ef5d55cf3e523263dd824a2ace4Daniel Dunbar                                      const InputInfoList &Inputs,
2367c21c485b4fb58ef5d55cf3e523263dd824a2ace4Daniel Dunbar                                      const ArgList &Args,
236840f1265ebd42ece3e7f7917319b56012e8e2bce2Daniel Dunbar                                      const char *LinkingOutput) const {
236940f1265ebd42ece3e7f7917319b56012e8e2bce2Daniel Dunbar  ArgStringList CmdArgs;
237040f1265ebd42ece3e7f7917319b56012e8e2bce2Daniel Dunbar
237140f1265ebd42ece3e7f7917319b56012e8e2bce2Daniel Dunbar  assert(Inputs.size() == 1 && "Unexpected number of inputs!");
237240f1265ebd42ece3e7f7917319b56012e8e2bce2Daniel Dunbar
237340f1265ebd42ece3e7f7917319b56012e8e2bce2Daniel Dunbar  CmdArgs.push_back("-E");
237440f1265ebd42ece3e7f7917319b56012e8e2bce2Daniel Dunbar
237540f1265ebd42ece3e7f7917319b56012e8e2bce2Daniel Dunbar  if (Args.hasArg(options::OPT_traditional) ||
237640f1265ebd42ece3e7f7917319b56012e8e2bce2Daniel Dunbar      Args.hasArg(options::OPT_traditional_cpp))
237740f1265ebd42ece3e7f7917319b56012e8e2bce2Daniel Dunbar    CmdArgs.push_back("-traditional-cpp");
2378c21c485b4fb58ef5d55cf3e523263dd824a2ace4Daniel Dunbar
237940f1265ebd42ece3e7f7917319b56012e8e2bce2Daniel Dunbar  ArgStringList OutputArgs;
23807c1e46533cae07216e2a67d5636a5afb44253155Daniel Dunbar  assert(Output.isFilename() && "Unexpected CC1 output.");
23817c1e46533cae07216e2a67d5636a5afb44253155Daniel Dunbar  OutputArgs.push_back("-o");
23827c1e46533cae07216e2a67d5636a5afb44253155Daniel Dunbar  OutputArgs.push_back(Output.getFilename());
238340f1265ebd42ece3e7f7917319b56012e8e2bce2Daniel Dunbar
23849120f179fd2e354f067e4ef2c76dcf3fc4db8a16Daniel Dunbar  if (Args.hasArg(options::OPT_E)) {
23859120f179fd2e354f067e4ef2c76dcf3fc4db8a16Daniel Dunbar    AddCPPOptionsArgs(Args, CmdArgs, Inputs, OutputArgs);
23869120f179fd2e354f067e4ef2c76dcf3fc4db8a16Daniel Dunbar  } else {
23879120f179fd2e354f067e4ef2c76dcf3fc4db8a16Daniel Dunbar    AddCPPOptionsArgs(Args, CmdArgs, Inputs, ArgStringList());
23889120f179fd2e354f067e4ef2c76dcf3fc4db8a16Daniel Dunbar    CmdArgs.append(OutputArgs.begin(), OutputArgs.end());
23899120f179fd2e354f067e4ef2c76dcf3fc4db8a16Daniel Dunbar  }
2390c21c485b4fb58ef5d55cf3e523263dd824a2ace4Daniel Dunbar
23918a2073a85670a13b0bcc1726bc7f80d458f8245bDaniel Dunbar  Args.AddAllArgs(CmdArgs, options::OPT_d_Group);
23928a2073a85670a13b0bcc1726bc7f80d458f8245bDaniel Dunbar
239340f1265ebd42ece3e7f7917319b56012e8e2bce2Daniel Dunbar  const char *CC1Name = getCC1Name(Inputs[0].getType());
2394c21c485b4fb58ef5d55cf3e523263dd824a2ace4Daniel Dunbar  const char *Exec =
23954a7e88978cf646ad10d654020cb00b3877069210Daniel Dunbar    Args.MakeArgString(getToolChain().GetProgramPath(CC1Name));
23962fe238ed293bd4bc27af9beb9fa151fad2146fa8Daniel Dunbar  C.addCommand(new Command(JA, *this, Exec, CmdArgs));
239740f1265ebd42ece3e7f7917319b56012e8e2bce2Daniel Dunbar}
239840f1265ebd42ece3e7f7917319b56012e8e2bce2Daniel Dunbar
239940f1265ebd42ece3e7f7917319b56012e8e2bce2Daniel Dunbarvoid darwin::Compile::ConstructJob(Compilation &C, const JobAction &JA,
24002fe238ed293bd4bc27af9beb9fa151fad2146fa8Daniel Dunbar                                   const InputInfo &Output,
2401c21c485b4fb58ef5d55cf3e523263dd824a2ace4Daniel Dunbar                                   const InputInfoList &Inputs,
2402c21c485b4fb58ef5d55cf3e523263dd824a2ace4Daniel Dunbar                                   const ArgList &Args,
240340f1265ebd42ece3e7f7917319b56012e8e2bce2Daniel Dunbar                                   const char *LinkingOutput) const {
2404ee788e70fcd0adf76103b17c78ac658d4ea30c9bDaniel Dunbar  const Driver &D = getToolChain().getDriver();
240540f1265ebd42ece3e7f7917319b56012e8e2bce2Daniel Dunbar  ArgStringList CmdArgs;
240640f1265ebd42ece3e7f7917319b56012e8e2bce2Daniel Dunbar
240740f1265ebd42ece3e7f7917319b56012e8e2bce2Daniel Dunbar  assert(Inputs.size() == 1 && "Unexpected number of inputs!");
240840f1265ebd42ece3e7f7917319b56012e8e2bce2Daniel Dunbar
240940f1265ebd42ece3e7f7917319b56012e8e2bce2Daniel Dunbar  types::ID InputType = Inputs[0].getType();
241040f1265ebd42ece3e7f7917319b56012e8e2bce2Daniel Dunbar  const Arg *A;
2411ceb5c5b7f67a30fae305d1d19b478b623e4fbcedEli Friedman  if ((A = Args.getLastArg(options::OPT_traditional)))
241240f1265ebd42ece3e7f7917319b56012e8e2bce2Daniel Dunbar    D.Diag(clang::diag::err_drv_argument_only_allowed_with)
241340f1265ebd42ece3e7f7917319b56012e8e2bce2Daniel Dunbar      << A->getAsString(Args) << "-E";
241440f1265ebd42ece3e7f7917319b56012e8e2bce2Daniel Dunbar
24156c6424bc0d3b5f080a97b5f6ef4a8d70c38e38f5Daniel Dunbar  if (JA.getType() == types::TY_LLVM_IR ||
24166c6424bc0d3b5f080a97b5f6ef4a8d70c38e38f5Daniel Dunbar      JA.getType() == types::TY_LTO_IR)
241740f1265ebd42ece3e7f7917319b56012e8e2bce2Daniel Dunbar    CmdArgs.push_back("-emit-llvm");
24186c6424bc0d3b5f080a97b5f6ef4a8d70c38e38f5Daniel Dunbar  else if (JA.getType() == types::TY_LLVM_BC ||
24196c6424bc0d3b5f080a97b5f6ef4a8d70c38e38f5Daniel Dunbar           JA.getType() == types::TY_LTO_BC)
242040f1265ebd42ece3e7f7917319b56012e8e2bce2Daniel Dunbar    CmdArgs.push_back("-emit-llvm-bc");
24215915fbf310e171c4cd3c2af05e9de360c0fa988aDaniel Dunbar  else if (Output.getType() == types::TY_AST)
24225915fbf310e171c4cd3c2af05e9de360c0fa988aDaniel Dunbar    D.Diag(clang::diag::err_drv_no_ast_support)
2423881376467c46c5c6cc16fa6790271c2c22e1d4f1Daniel Dunbar      << getToolChain().getTripleString();
2424ae24a88655c461e751d0984cc21dda6e17882356Daniel Dunbar  else if (JA.getType() != types::TY_PP_Asm &&
2425ae24a88655c461e751d0984cc21dda6e17882356Daniel Dunbar           JA.getType() != types::TY_PCH)
242664952508c2b0c8bffb45c8b410f0af3d2457f59bDaniel Dunbar    D.Diag(clang::diag::err_drv_invalid_gcc_output_type)
242764952508c2b0c8bffb45c8b410f0af3d2457f59bDaniel Dunbar      << getTypeName(JA.getType());
242840f1265ebd42ece3e7f7917319b56012e8e2bce2Daniel Dunbar
242940f1265ebd42ece3e7f7917319b56012e8e2bce2Daniel Dunbar  ArgStringList OutputArgs;
243040f1265ebd42ece3e7f7917319b56012e8e2bce2Daniel Dunbar  if (Output.getType() != types::TY_PCH) {
243140f1265ebd42ece3e7f7917319b56012e8e2bce2Daniel Dunbar    OutputArgs.push_back("-o");
24327c1e46533cae07216e2a67d5636a5afb44253155Daniel Dunbar    if (Output.isNothing())
243340f1265ebd42ece3e7f7917319b56012e8e2bce2Daniel Dunbar      OutputArgs.push_back("/dev/null");
243440f1265ebd42ece3e7f7917319b56012e8e2bce2Daniel Dunbar    else
243540f1265ebd42ece3e7f7917319b56012e8e2bce2Daniel Dunbar      OutputArgs.push_back(Output.getFilename());
243640f1265ebd42ece3e7f7917319b56012e8e2bce2Daniel Dunbar  }
243740f1265ebd42ece3e7f7917319b56012e8e2bce2Daniel Dunbar
243840f1265ebd42ece3e7f7917319b56012e8e2bce2Daniel Dunbar  // There is no need for this level of compatibility, but it makes
243940f1265ebd42ece3e7f7917319b56012e8e2bce2Daniel Dunbar  // diffing easier.
244040f1265ebd42ece3e7f7917319b56012e8e2bce2Daniel Dunbar  bool OutputArgsEarly = (Args.hasArg(options::OPT_fsyntax_only) ||
244140f1265ebd42ece3e7f7917319b56012e8e2bce2Daniel Dunbar                          Args.hasArg(options::OPT_S));
244240f1265ebd42ece3e7f7917319b56012e8e2bce2Daniel Dunbar
244340f1265ebd42ece3e7f7917319b56012e8e2bce2Daniel Dunbar  if (types::getPreprocessedType(InputType) != types::TY_INVALID) {
2444a3ec60e0cf2a1916f479288998d31bd980b1a306Daniel Dunbar    AddCPPUniqueOptionsArgs(Args, CmdArgs, Inputs);
244540f1265ebd42ece3e7f7917319b56012e8e2bce2Daniel Dunbar    if (OutputArgsEarly) {
244640f1265ebd42ece3e7f7917319b56012e8e2bce2Daniel Dunbar      AddCC1OptionsArgs(Args, CmdArgs, Inputs, OutputArgs);
244740f1265ebd42ece3e7f7917319b56012e8e2bce2Daniel Dunbar    } else {
244840f1265ebd42ece3e7f7917319b56012e8e2bce2Daniel Dunbar      AddCC1OptionsArgs(Args, CmdArgs, Inputs, ArgStringList());
244940f1265ebd42ece3e7f7917319b56012e8e2bce2Daniel Dunbar      CmdArgs.append(OutputArgs.begin(), OutputArgs.end());
245040f1265ebd42ece3e7f7917319b56012e8e2bce2Daniel Dunbar    }
245140f1265ebd42ece3e7f7917319b56012e8e2bce2Daniel Dunbar  } else {
245240f1265ebd42ece3e7f7917319b56012e8e2bce2Daniel Dunbar    CmdArgs.push_back("-fpreprocessed");
2453c21c485b4fb58ef5d55cf3e523263dd824a2ace4Daniel Dunbar
245440f1265ebd42ece3e7f7917319b56012e8e2bce2Daniel Dunbar    for (InputInfoList::const_iterator
245540f1265ebd42ece3e7f7917319b56012e8e2bce2Daniel Dunbar           it = Inputs.begin(), ie = Inputs.end(); it != ie; ++it) {
245640f1265ebd42ece3e7f7917319b56012e8e2bce2Daniel Dunbar      const InputInfo &II = *it;
245740f1265ebd42ece3e7f7917319b56012e8e2bce2Daniel Dunbar
24585915fbf310e171c4cd3c2af05e9de360c0fa988aDaniel Dunbar      // Reject AST inputs.
24595915fbf310e171c4cd3c2af05e9de360c0fa988aDaniel Dunbar      if (II.getType() == types::TY_AST) {
24605915fbf310e171c4cd3c2af05e9de360c0fa988aDaniel Dunbar        D.Diag(clang::diag::err_drv_no_ast_support)
2461881376467c46c5c6cc16fa6790271c2c22e1d4f1Daniel Dunbar          << getToolChain().getTripleString();
24625915fbf310e171c4cd3c2af05e9de360c0fa988aDaniel Dunbar        return;
24635915fbf310e171c4cd3c2af05e9de360c0fa988aDaniel Dunbar      }
24645915fbf310e171c4cd3c2af05e9de360c0fa988aDaniel Dunbar
24657c1e46533cae07216e2a67d5636a5afb44253155Daniel Dunbar      CmdArgs.push_back(II.getFilename());
246640f1265ebd42ece3e7f7917319b56012e8e2bce2Daniel Dunbar    }
246740f1265ebd42ece3e7f7917319b56012e8e2bce2Daniel Dunbar
246840f1265ebd42ece3e7f7917319b56012e8e2bce2Daniel Dunbar    if (OutputArgsEarly) {
246940f1265ebd42ece3e7f7917319b56012e8e2bce2Daniel Dunbar      AddCC1OptionsArgs(Args, CmdArgs, Inputs, OutputArgs);
247040f1265ebd42ece3e7f7917319b56012e8e2bce2Daniel Dunbar    } else {
247140f1265ebd42ece3e7f7917319b56012e8e2bce2Daniel Dunbar      AddCC1OptionsArgs(Args, CmdArgs, Inputs, ArgStringList());
247240f1265ebd42ece3e7f7917319b56012e8e2bce2Daniel Dunbar      CmdArgs.append(OutputArgs.begin(), OutputArgs.end());
247340f1265ebd42ece3e7f7917319b56012e8e2bce2Daniel Dunbar    }
247440f1265ebd42ece3e7f7917319b56012e8e2bce2Daniel Dunbar  }
2475c21c485b4fb58ef5d55cf3e523263dd824a2ace4Daniel Dunbar
247640f1265ebd42ece3e7f7917319b56012e8e2bce2Daniel Dunbar  if (Output.getType() == types::TY_PCH) {
247740f1265ebd42ece3e7f7917319b56012e8e2bce2Daniel Dunbar    assert(Output.isFilename() && "Invalid PCH output.");
247840f1265ebd42ece3e7f7917319b56012e8e2bce2Daniel Dunbar
247940f1265ebd42ece3e7f7917319b56012e8e2bce2Daniel Dunbar    CmdArgs.push_back("-o");
248040f1265ebd42ece3e7f7917319b56012e8e2bce2Daniel Dunbar    // NOTE: gcc uses a temp .s file for this, but there doesn't seem
248140f1265ebd42ece3e7f7917319b56012e8e2bce2Daniel Dunbar    // to be a good reason.
248240f1265ebd42ece3e7f7917319b56012e8e2bce2Daniel Dunbar    CmdArgs.push_back("/dev/null");
2483c21c485b4fb58ef5d55cf3e523263dd824a2ace4Daniel Dunbar
2484e6c9ae147835fb450a90800bd378420c0e5ffb35Daniel Dunbar    CmdArgs.push_back("--output-pch=");
248540f1265ebd42ece3e7f7917319b56012e8e2bce2Daniel Dunbar    CmdArgs.push_back(Output.getFilename());
2486c21c485b4fb58ef5d55cf3e523263dd824a2ace4Daniel Dunbar  }
248740f1265ebd42ece3e7f7917319b56012e8e2bce2Daniel Dunbar
248840f1265ebd42ece3e7f7917319b56012e8e2bce2Daniel Dunbar  const char *CC1Name = getCC1Name(Inputs[0].getType());
2489c21c485b4fb58ef5d55cf3e523263dd824a2ace4Daniel Dunbar  const char *Exec =
24904a7e88978cf646ad10d654020cb00b3877069210Daniel Dunbar    Args.MakeArgString(getToolChain().GetProgramPath(CC1Name));
24912fe238ed293bd4bc27af9beb9fa151fad2146fa8Daniel Dunbar  C.addCommand(new Command(JA, *this, Exec, CmdArgs));
249240f1265ebd42ece3e7f7917319b56012e8e2bce2Daniel Dunbar}
249340f1265ebd42ece3e7f7917319b56012e8e2bce2Daniel Dunbar
24948cac5f7e1ce63dd77ee0fb4ef68f9fa804f41ea6Daniel Dunbarvoid darwin::Assemble::ConstructJob(Compilation &C, const JobAction &JA,
24952fe238ed293bd4bc27af9beb9fa151fad2146fa8Daniel Dunbar                                    const InputInfo &Output,
2496c21c485b4fb58ef5d55cf3e523263dd824a2ace4Daniel Dunbar                                    const InputInfoList &Inputs,
2497c21c485b4fb58ef5d55cf3e523263dd824a2ace4Daniel Dunbar                                    const ArgList &Args,
24988cac5f7e1ce63dd77ee0fb4ef68f9fa804f41ea6Daniel Dunbar                                    const char *LinkingOutput) const {
24998cac5f7e1ce63dd77ee0fb4ef68f9fa804f41ea6Daniel Dunbar  ArgStringList CmdArgs;
25008cac5f7e1ce63dd77ee0fb4ef68f9fa804f41ea6Daniel Dunbar
25018cac5f7e1ce63dd77ee0fb4ef68f9fa804f41ea6Daniel Dunbar  assert(Inputs.size() == 1 && "Unexpected number of inputs.");
25028cac5f7e1ce63dd77ee0fb4ef68f9fa804f41ea6Daniel Dunbar  const InputInfo &Input = Inputs[0];
25038cac5f7e1ce63dd77ee0fb4ef68f9fa804f41ea6Daniel Dunbar
25048cac5f7e1ce63dd77ee0fb4ef68f9fa804f41ea6Daniel Dunbar  // Bit of a hack, this is only used for original inputs.
2505c21c485b4fb58ef5d55cf3e523263dd824a2ace4Daniel Dunbar  //
25068e4fea6750dbac032c172f3279c63b7815b7423eDaniel Dunbar  // FIXME: This is broken for preprocessed .s inputs.
25078cac5f7e1ce63dd77ee0fb4ef68f9fa804f41ea6Daniel Dunbar  if (Input.isFilename() &&
25088e4fea6750dbac032c172f3279c63b7815b7423eDaniel Dunbar      strcmp(Input.getFilename(), Input.getBaseInput()) == 0) {
25098e4fea6750dbac032c172f3279c63b7815b7423eDaniel Dunbar    if (Args.hasArg(options::OPT_gstabs))
25108e4fea6750dbac032c172f3279c63b7815b7423eDaniel Dunbar      CmdArgs.push_back("--gstabs");
25118e4fea6750dbac032c172f3279c63b7815b7423eDaniel Dunbar    else if (Args.hasArg(options::OPT_g_Group))
25128e4fea6750dbac032c172f3279c63b7815b7423eDaniel Dunbar      CmdArgs.push_back("--gdwarf2");
25138e4fea6750dbac032c172f3279c63b7815b7423eDaniel Dunbar  }
2514c21c485b4fb58ef5d55cf3e523263dd824a2ace4Daniel Dunbar
25158cac5f7e1ce63dd77ee0fb4ef68f9fa804f41ea6Daniel Dunbar  // Derived from asm spec.
2516cc6f803f98fa6ba9a9c366400210448516d01b3cDaniel Dunbar  AddDarwinArch(Args, CmdArgs);
2517cc6f803f98fa6ba9a9c366400210448516d01b3cDaniel Dunbar
2518f5438e3462f37d7c58f847b594b4b3ab84085d67Daniel Dunbar  // Use -force_cpusubtype_ALL on x86 by default.
2519f5438e3462f37d7c58f847b594b4b3ab84085d67Daniel Dunbar  if (getToolChain().getTriple().getArch() == llvm::Triple::x86 ||
2520f5438e3462f37d7c58f847b594b4b3ab84085d67Daniel Dunbar      getToolChain().getTriple().getArch() == llvm::Triple::x86_64 ||
2521cc6f803f98fa6ba9a9c366400210448516d01b3cDaniel Dunbar      Args.hasArg(options::OPT_force__cpusubtype__ALL))
2522cc6f803f98fa6ba9a9c366400210448516d01b3cDaniel Dunbar    CmdArgs.push_back("-force_cpusubtype_ALL");
25238cac5f7e1ce63dd77ee0fb4ef68f9fa804f41ea6Daniel Dunbar
25240e2679d29be70186fc1197a1484948ed239922baDaniel Dunbar  if (getToolChain().getTriple().getArch() != llvm::Triple::x86_64 &&
25250e2679d29be70186fc1197a1484948ed239922baDaniel Dunbar      (Args.hasArg(options::OPT_mkernel) ||
25268cac5f7e1ce63dd77ee0fb4ef68f9fa804f41ea6Daniel Dunbar       Args.hasArg(options::OPT_static) ||
25270e2679d29be70186fc1197a1484948ed239922baDaniel Dunbar       Args.hasArg(options::OPT_fapple_kext)))
2528c21c485b4fb58ef5d55cf3e523263dd824a2ace4Daniel Dunbar    CmdArgs.push_back("-static");
2529c21c485b4fb58ef5d55cf3e523263dd824a2ace4Daniel Dunbar
25308cac5f7e1ce63dd77ee0fb4ef68f9fa804f41ea6Daniel Dunbar  Args.AddAllArgValues(CmdArgs, options::OPT_Wa_COMMA,
25318cac5f7e1ce63dd77ee0fb4ef68f9fa804f41ea6Daniel Dunbar                       options::OPT_Xassembler);
25328cac5f7e1ce63dd77ee0fb4ef68f9fa804f41ea6Daniel Dunbar
25338cac5f7e1ce63dd77ee0fb4ef68f9fa804f41ea6Daniel Dunbar  assert(Output.isFilename() && "Unexpected lipo output.");
25348cac5f7e1ce63dd77ee0fb4ef68f9fa804f41ea6Daniel Dunbar  CmdArgs.push_back("-o");
25358cac5f7e1ce63dd77ee0fb4ef68f9fa804f41ea6Daniel Dunbar  CmdArgs.push_back(Output.getFilename());
25368cac5f7e1ce63dd77ee0fb4ef68f9fa804f41ea6Daniel Dunbar
25377c1e46533cae07216e2a67d5636a5afb44253155Daniel Dunbar  assert(Input.isFilename() && "Invalid input.");
25387c1e46533cae07216e2a67d5636a5afb44253155Daniel Dunbar  CmdArgs.push_back(Input.getFilename());
25398cac5f7e1ce63dd77ee0fb4ef68f9fa804f41ea6Daniel Dunbar
25408cac5f7e1ce63dd77ee0fb4ef68f9fa804f41ea6Daniel Dunbar  // asm_final spec is empty.
25418cac5f7e1ce63dd77ee0fb4ef68f9fa804f41ea6Daniel Dunbar
2542c21c485b4fb58ef5d55cf3e523263dd824a2ace4Daniel Dunbar  const char *Exec =
25434a7e88978cf646ad10d654020cb00b3877069210Daniel Dunbar    Args.MakeArgString(getToolChain().GetProgramPath("as"));
25442fe238ed293bd4bc27af9beb9fa151fad2146fa8Daniel Dunbar  C.addCommand(new Command(JA, *this, Exec, CmdArgs));
25458cac5f7e1ce63dd77ee0fb4ef68f9fa804f41ea6Daniel Dunbar}
2546ff7488dc9a766f94daf54d81b03ab9160d0bfd88Daniel Dunbar
2547fbefe6bd6f62a3361813498dc672ab0d6c0d4fd1Daniel Dunbarvoid darwin::DarwinTool::AddDarwinArch(const ArgList &Args,
2548fbefe6bd6f62a3361813498dc672ab0d6c0d4fd1Daniel Dunbar                                       ArgStringList &CmdArgs) const {
2549eeff406730f50afd973f005a8d501a19af4785e5Daniel Dunbar  llvm::StringRef ArchName = getDarwinToolChain().getDarwinArchName(Args);
2550eeff406730f50afd973f005a8d501a19af4785e5Daniel Dunbar
255102633b541b04ad5ffc1c70f4c2feeeb13e607057Daniel Dunbar  // Derived from darwin_arch spec.
255202633b541b04ad5ffc1c70f4c2feeeb13e607057Daniel Dunbar  CmdArgs.push_back("-arch");
2553eeff406730f50afd973f005a8d501a19af4785e5Daniel Dunbar  CmdArgs.push_back(Args.MakeArgString(ArchName));
255478dbd580a02759bbc408dbefb6754afa71b2c24cDaniel Dunbar
2555eeff406730f50afd973f005a8d501a19af4785e5Daniel Dunbar  // FIXME: Is this needed anymore?
2556eeff406730f50afd973f005a8d501a19af4785e5Daniel Dunbar  if (ArchName == "arm")
255778dbd580a02759bbc408dbefb6754afa71b2c24cDaniel Dunbar    CmdArgs.push_back("-force_cpusubtype_ALL");
255802633b541b04ad5ffc1c70f4c2feeeb13e607057Daniel Dunbar}
255902633b541b04ad5ffc1c70f4c2feeeb13e607057Daniel Dunbar
2560748de8eda222f087434d8bd703176b316a061341Daniel Dunbarvoid darwin::Link::AddLinkArgs(Compilation &C,
2561748de8eda222f087434d8bd703176b316a061341Daniel Dunbar                               const ArgList &Args,
256202633b541b04ad5ffc1c70f4c2feeeb13e607057Daniel Dunbar                               ArgStringList &CmdArgs) const {
2563ee788e70fcd0adf76103b17c78ac658d4ea30c9bDaniel Dunbar  const Driver &D = getToolChain().getDriver();
256402633b541b04ad5ffc1c70f4c2feeeb13e607057Daniel Dunbar
2565b18dc5b8376f42f7b4802bf1279e95eeb813fa06Daniel Dunbar  unsigned Version[3] = { 0, 0, 0 };
2566b18dc5b8376f42f7b4802bf1279e95eeb813fa06Daniel Dunbar  if (Arg *A = Args.getLastArg(options::OPT_mlinker_version_EQ)) {
2567b18dc5b8376f42f7b4802bf1279e95eeb813fa06Daniel Dunbar    bool HadExtra;
2568b18dc5b8376f42f7b4802bf1279e95eeb813fa06Daniel Dunbar    if (!Driver::GetReleaseVersion(A->getValue(Args), Version[0],
2569b18dc5b8376f42f7b4802bf1279e95eeb813fa06Daniel Dunbar                                   Version[1], Version[2], HadExtra) ||
2570b18dc5b8376f42f7b4802bf1279e95eeb813fa06Daniel Dunbar        HadExtra)
2571b18dc5b8376f42f7b4802bf1279e95eeb813fa06Daniel Dunbar      D.Diag(clang::diag::err_drv_invalid_version_number)
2572b18dc5b8376f42f7b4802bf1279e95eeb813fa06Daniel Dunbar        << A->getAsString(Args);
2573b18dc5b8376f42f7b4802bf1279e95eeb813fa06Daniel Dunbar  }
2574b18dc5b8376f42f7b4802bf1279e95eeb813fa06Daniel Dunbar
2575b18dc5b8376f42f7b4802bf1279e95eeb813fa06Daniel Dunbar  // Newer linkers support -demangle, pass it if supported and not disabled by
2576b18dc5b8376f42f7b4802bf1279e95eeb813fa06Daniel Dunbar  // the user.
2577a30d6cdc3a32af8bd06d5a1a218a32840cd70a00Daniel Dunbar  //
2578a30d6cdc3a32af8bd06d5a1a218a32840cd70a00Daniel Dunbar  // FIXME: We temporarily avoid passing -demangle to any iOS linker, because
2579a30d6cdc3a32af8bd06d5a1a218a32840cd70a00Daniel Dunbar  // unfortunately we can't be guaranteed that the linker version used there
2580a30d6cdc3a32af8bd06d5a1a218a32840cd70a00Daniel Dunbar  // will match the linker version detected at configure time. We need the
2581a30d6cdc3a32af8bd06d5a1a218a32840cd70a00Daniel Dunbar  // universal driver.
2582a30d6cdc3a32af8bd06d5a1a218a32840cd70a00Daniel Dunbar  if (Version[0] >= 100 && !Args.hasArg(options::OPT_Z_Xlinker__no_demangle) &&
2583a30d6cdc3a32af8bd06d5a1a218a32840cd70a00Daniel Dunbar      !getDarwinToolChain().isTargetIPhoneOS()) {
2584bcf1da8ff6ab007a23a8d1be8e950d92cee4241eDaniel Dunbar    // Don't pass -demangle to ld_classic.
2585bcf1da8ff6ab007a23a8d1be8e950d92cee4241eDaniel Dunbar    //
2586bcf1da8ff6ab007a23a8d1be8e950d92cee4241eDaniel Dunbar    // FIXME: This is a temporary workaround, ld should be handling this.
2587bcf1da8ff6ab007a23a8d1be8e950d92cee4241eDaniel Dunbar    bool UsesLdClassic = (getToolChain().getArch() == llvm::Triple::x86 &&
2588bcf1da8ff6ab007a23a8d1be8e950d92cee4241eDaniel Dunbar                          Args.hasArg(options::OPT_static));
25899ced7049caf7c9543badb302f3bb43a6bc264705Daniel Dunbar    if (getToolChain().getArch() == llvm::Triple::x86) {
25909ced7049caf7c9543badb302f3bb43a6bc264705Daniel Dunbar      for (arg_iterator it = Args.filtered_begin(options::OPT_Xlinker,
25919ced7049caf7c9543badb302f3bb43a6bc264705Daniel Dunbar                                                 options::OPT_Wl_COMMA),
25929ced7049caf7c9543badb302f3bb43a6bc264705Daniel Dunbar             ie = Args.filtered_end(); it != ie; ++it) {
25939ced7049caf7c9543badb302f3bb43a6bc264705Daniel Dunbar        const Arg *A = *it;
25949ced7049caf7c9543badb302f3bb43a6bc264705Daniel Dunbar        for (unsigned i = 0, e = A->getNumValues(); i != e; ++i)
25959ced7049caf7c9543badb302f3bb43a6bc264705Daniel Dunbar          if (llvm::StringRef(A->getValue(Args, i)) == "-kext")
25969ced7049caf7c9543badb302f3bb43a6bc264705Daniel Dunbar            UsesLdClassic = true;
25979ced7049caf7c9543badb302f3bb43a6bc264705Daniel Dunbar      }
25989ced7049caf7c9543badb302f3bb43a6bc264705Daniel Dunbar    }
2599bcf1da8ff6ab007a23a8d1be8e950d92cee4241eDaniel Dunbar    if (!UsesLdClassic)
2600bcf1da8ff6ab007a23a8d1be8e950d92cee4241eDaniel Dunbar      CmdArgs.push_back("-demangle");
2601b18dc5b8376f42f7b4802bf1279e95eeb813fa06Daniel Dunbar  }
2602b18dc5b8376f42f7b4802bf1279e95eeb813fa06Daniel Dunbar
260302633b541b04ad5ffc1c70f4c2feeeb13e607057Daniel Dunbar  // Derived from the "link" spec.
260402633b541b04ad5ffc1c70f4c2feeeb13e607057Daniel Dunbar  Args.AddAllArgs(CmdArgs, options::OPT_static);
260502633b541b04ad5ffc1c70f4c2feeeb13e607057Daniel Dunbar  if (!Args.hasArg(options::OPT_static))
260602633b541b04ad5ffc1c70f4c2feeeb13e607057Daniel Dunbar    CmdArgs.push_back("-dynamic");
260702633b541b04ad5ffc1c70f4c2feeeb13e607057Daniel Dunbar  if (Args.hasArg(options::OPT_fgnu_runtime)) {
260802633b541b04ad5ffc1c70f4c2feeeb13e607057Daniel Dunbar    // FIXME: gcc replaces -lobjc in forward args with -lobjc-gnu
260902633b541b04ad5ffc1c70f4c2feeeb13e607057Daniel Dunbar    // here. How do we wish to handle such things?
261002633b541b04ad5ffc1c70f4c2feeeb13e607057Daniel Dunbar  }
2611c21c485b4fb58ef5d55cf3e523263dd824a2ace4Daniel Dunbar
261202633b541b04ad5ffc1c70f4c2feeeb13e607057Daniel Dunbar  if (!Args.hasArg(options::OPT_dynamiclib)) {
2613a6d38494d18e260958e73bfe5e2b3f1dc4160459Daniel Dunbar    AddDarwinArch(Args, CmdArgs);
2614a6d38494d18e260958e73bfe5e2b3f1dc4160459Daniel Dunbar    // FIXME: Why do this only on this path?
26158917dd4457affb8750c81f08cbc21902a36cff26Daniel Dunbar    Args.AddLastArg(CmdArgs, options::OPT_force__cpusubtype__ALL);
261602633b541b04ad5ffc1c70f4c2feeeb13e607057Daniel Dunbar
261702633b541b04ad5ffc1c70f4c2feeeb13e607057Daniel Dunbar    Args.AddLastArg(CmdArgs, options::OPT_bundle);
261802633b541b04ad5ffc1c70f4c2feeeb13e607057Daniel Dunbar    Args.AddAllArgs(CmdArgs, options::OPT_bundle__loader);
261902633b541b04ad5ffc1c70f4c2feeeb13e607057Daniel Dunbar    Args.AddAllArgs(CmdArgs, options::OPT_client__name);
262002633b541b04ad5ffc1c70f4c2feeeb13e607057Daniel Dunbar
262102633b541b04ad5ffc1c70f4c2feeeb13e607057Daniel Dunbar    Arg *A;
262202633b541b04ad5ffc1c70f4c2feeeb13e607057Daniel Dunbar    if ((A = Args.getLastArg(options::OPT_compatibility__version)) ||
262302633b541b04ad5ffc1c70f4c2feeeb13e607057Daniel Dunbar        (A = Args.getLastArg(options::OPT_current__version)) ||
262402633b541b04ad5ffc1c70f4c2feeeb13e607057Daniel Dunbar        (A = Args.getLastArg(options::OPT_install__name)))
262502633b541b04ad5ffc1c70f4c2feeeb13e607057Daniel Dunbar      D.Diag(clang::diag::err_drv_argument_only_allowed_with)
262602633b541b04ad5ffc1c70f4c2feeeb13e607057Daniel Dunbar        << A->getAsString(Args) << "-dynamiclib";
262702633b541b04ad5ffc1c70f4c2feeeb13e607057Daniel Dunbar
262802633b541b04ad5ffc1c70f4c2feeeb13e607057Daniel Dunbar    Args.AddLastArg(CmdArgs, options::OPT_force__flat__namespace);
262902633b541b04ad5ffc1c70f4c2feeeb13e607057Daniel Dunbar    Args.AddLastArg(CmdArgs, options::OPT_keep__private__externs);
263002633b541b04ad5ffc1c70f4c2feeeb13e607057Daniel Dunbar    Args.AddLastArg(CmdArgs, options::OPT_private__bundle);
263102633b541b04ad5ffc1c70f4c2feeeb13e607057Daniel Dunbar  } else {
263202633b541b04ad5ffc1c70f4c2feeeb13e607057Daniel Dunbar    CmdArgs.push_back("-dylib");
263302633b541b04ad5ffc1c70f4c2feeeb13e607057Daniel Dunbar
263402633b541b04ad5ffc1c70f4c2feeeb13e607057Daniel Dunbar    Arg *A;
263502633b541b04ad5ffc1c70f4c2feeeb13e607057Daniel Dunbar    if ((A = Args.getLastArg(options::OPT_bundle)) ||
263602633b541b04ad5ffc1c70f4c2feeeb13e607057Daniel Dunbar        (A = Args.getLastArg(options::OPT_bundle__loader)) ||
263702633b541b04ad5ffc1c70f4c2feeeb13e607057Daniel Dunbar        (A = Args.getLastArg(options::OPT_client__name)) ||
263802633b541b04ad5ffc1c70f4c2feeeb13e607057Daniel Dunbar        (A = Args.getLastArg(options::OPT_force__flat__namespace)) ||
263902633b541b04ad5ffc1c70f4c2feeeb13e607057Daniel Dunbar        (A = Args.getLastArg(options::OPT_keep__private__externs)) ||
264002633b541b04ad5ffc1c70f4c2feeeb13e607057Daniel Dunbar        (A = Args.getLastArg(options::OPT_private__bundle)))
264102633b541b04ad5ffc1c70f4c2feeeb13e607057Daniel Dunbar      D.Diag(clang::diag::err_drv_argument_not_allowed_with)
264202633b541b04ad5ffc1c70f4c2feeeb13e607057Daniel Dunbar        << A->getAsString(Args) << "-dynamiclib";
2643c21c485b4fb58ef5d55cf3e523263dd824a2ace4Daniel Dunbar
264402633b541b04ad5ffc1c70f4c2feeeb13e607057Daniel Dunbar    Args.AddAllArgsTranslated(CmdArgs, options::OPT_compatibility__version,
264502633b541b04ad5ffc1c70f4c2feeeb13e607057Daniel Dunbar                              "-dylib_compatibility_version");
264602633b541b04ad5ffc1c70f4c2feeeb13e607057Daniel Dunbar    Args.AddAllArgsTranslated(CmdArgs, options::OPT_current__version,
264702633b541b04ad5ffc1c70f4c2feeeb13e607057Daniel Dunbar                              "-dylib_current_version");
264802633b541b04ad5ffc1c70f4c2feeeb13e607057Daniel Dunbar
2649a6d38494d18e260958e73bfe5e2b3f1dc4160459Daniel Dunbar    AddDarwinArch(Args, CmdArgs);
265002633b541b04ad5ffc1c70f4c2feeeb13e607057Daniel Dunbar
265102633b541b04ad5ffc1c70f4c2feeeb13e607057Daniel Dunbar    Args.AddAllArgsTranslated(CmdArgs, options::OPT_install__name,
265202633b541b04ad5ffc1c70f4c2feeeb13e607057Daniel Dunbar                              "-dylib_install_name");
265302633b541b04ad5ffc1c70f4c2feeeb13e607057Daniel Dunbar  }
265402633b541b04ad5ffc1c70f4c2feeeb13e607057Daniel Dunbar
265502633b541b04ad5ffc1c70f4c2feeeb13e607057Daniel Dunbar  Args.AddLastArg(CmdArgs, options::OPT_all__load);
265602633b541b04ad5ffc1c70f4c2feeeb13e607057Daniel Dunbar  Args.AddAllArgs(CmdArgs, options::OPT_allowable__client);
265702633b541b04ad5ffc1c70f4c2feeeb13e607057Daniel Dunbar  Args.AddLastArg(CmdArgs, options::OPT_bind__at__load);
2658251ca6c9fb2bb398d9bf9fe7399c27bed7074b5cDaniel Dunbar  if (getDarwinToolChain().isTargetIPhoneOS())
2659d82f8fa53771b454885c546f0fd452a4980b3a3eDaniel Dunbar    Args.AddLastArg(CmdArgs, options::OPT_arch__errors__fatal);
266002633b541b04ad5ffc1c70f4c2feeeb13e607057Daniel Dunbar  Args.AddLastArg(CmdArgs, options::OPT_dead__strip);
266102633b541b04ad5ffc1c70f4c2feeeb13e607057Daniel Dunbar  Args.AddLastArg(CmdArgs, options::OPT_no__dead__strip__inits__and__terms);
266202633b541b04ad5ffc1c70f4c2feeeb13e607057Daniel Dunbar  Args.AddAllArgs(CmdArgs, options::OPT_dylib__file);
266302633b541b04ad5ffc1c70f4c2feeeb13e607057Daniel Dunbar  Args.AddLastArg(CmdArgs, options::OPT_dynamic);
266402633b541b04ad5ffc1c70f4c2feeeb13e607057Daniel Dunbar  Args.AddAllArgs(CmdArgs, options::OPT_exported__symbols__list);
266502633b541b04ad5ffc1c70f4c2feeeb13e607057Daniel Dunbar  Args.AddLastArg(CmdArgs, options::OPT_flat__namespace);
266602633b541b04ad5ffc1c70f4c2feeeb13e607057Daniel Dunbar  Args.AddAllArgs(CmdArgs, options::OPT_headerpad__max__install__names);
266702633b541b04ad5ffc1c70f4c2feeeb13e607057Daniel Dunbar  Args.AddAllArgs(CmdArgs, options::OPT_image__base);
266802633b541b04ad5ffc1c70f4c2feeeb13e607057Daniel Dunbar  Args.AddAllArgs(CmdArgs, options::OPT_init);
266902633b541b04ad5ffc1c70f4c2feeeb13e607057Daniel Dunbar
2670314cba02728c451c783b38bf6c00f220afb193c8Daniel Dunbar  // Adding all arguments doesn't make sense here but this is what gcc does. One
2671314cba02728c451c783b38bf6c00f220afb193c8Daniel Dunbar  // of this should always be present thanks to argument translation.
2672314cba02728c451c783b38bf6c00f220afb193c8Daniel Dunbar  assert((Args.hasArg(options::OPT_mmacosx_version_min_EQ) ||
2673314cba02728c451c783b38bf6c00f220afb193c8Daniel Dunbar          Args.hasArg(options::OPT_miphoneos_version_min_EQ)) &&
2674314cba02728c451c783b38bf6c00f220afb193c8Daniel Dunbar         "Missing version argument (lost in translation)?");
267530392de4681602f1aabc61b0184b1de53bc172f0Daniel Dunbar  Args.AddAllArgsTranslated(CmdArgs, options::OPT_mmacosx_version_min_EQ,
2676294691eb1caf551083acd7b08630ef21c3fd760dDaniel Dunbar                            "-macosx_version_min");
267702633b541b04ad5ffc1c70f4c2feeeb13e607057Daniel Dunbar  Args.AddAllArgsTranslated(CmdArgs, options::OPT_miphoneos_version_min_EQ,
267802633b541b04ad5ffc1c70f4c2feeeb13e607057Daniel Dunbar                            "-iphoneos_version_min");
267902633b541b04ad5ffc1c70f4c2feeeb13e607057Daniel Dunbar  Args.AddLastArg(CmdArgs, options::OPT_nomultidefs);
268002633b541b04ad5ffc1c70f4c2feeeb13e607057Daniel Dunbar  Args.AddLastArg(CmdArgs, options::OPT_multi__module);
268102633b541b04ad5ffc1c70f4c2feeeb13e607057Daniel Dunbar  Args.AddLastArg(CmdArgs, options::OPT_single__module);
268202633b541b04ad5ffc1c70f4c2feeeb13e607057Daniel Dunbar  Args.AddAllArgs(CmdArgs, options::OPT_multiply__defined);
268302633b541b04ad5ffc1c70f4c2feeeb13e607057Daniel Dunbar  Args.AddAllArgs(CmdArgs, options::OPT_multiply__defined__unused);
2684c21c485b4fb58ef5d55cf3e523263dd824a2ace4Daniel Dunbar
268547e879dfa735f81472a51b1bd69cc4eb9159db39Daniel Dunbar  if (const Arg *A = Args.getLastArg(options::OPT_fpie, options::OPT_fPIE,
268647e879dfa735f81472a51b1bd69cc4eb9159db39Daniel Dunbar                                     options::OPT_fno_pie,
268747e879dfa735f81472a51b1bd69cc4eb9159db39Daniel Dunbar                                     options::OPT_fno_PIE)) {
268847e879dfa735f81472a51b1bd69cc4eb9159db39Daniel Dunbar    if (A->getOption().matches(options::OPT_fpie) ||
268947e879dfa735f81472a51b1bd69cc4eb9159db39Daniel Dunbar        A->getOption().matches(options::OPT_fPIE))
269047e879dfa735f81472a51b1bd69cc4eb9159db39Daniel Dunbar      CmdArgs.push_back("-pie");
269147e879dfa735f81472a51b1bd69cc4eb9159db39Daniel Dunbar    else
269247e879dfa735f81472a51b1bd69cc4eb9159db39Daniel Dunbar      CmdArgs.push_back("-no_pie");
269347e879dfa735f81472a51b1bd69cc4eb9159db39Daniel Dunbar  }
269402633b541b04ad5ffc1c70f4c2feeeb13e607057Daniel Dunbar
269502633b541b04ad5ffc1c70f4c2feeeb13e607057Daniel Dunbar  Args.AddLastArg(CmdArgs, options::OPT_prebind);
269602633b541b04ad5ffc1c70f4c2feeeb13e607057Daniel Dunbar  Args.AddLastArg(CmdArgs, options::OPT_noprebind);
269702633b541b04ad5ffc1c70f4c2feeeb13e607057Daniel Dunbar  Args.AddLastArg(CmdArgs, options::OPT_nofixprebinding);
269802633b541b04ad5ffc1c70f4c2feeeb13e607057Daniel Dunbar  Args.AddLastArg(CmdArgs, options::OPT_prebind__all__twolevel__modules);
269902633b541b04ad5ffc1c70f4c2feeeb13e607057Daniel Dunbar  Args.AddLastArg(CmdArgs, options::OPT_read__only__relocs);
270002633b541b04ad5ffc1c70f4c2feeeb13e607057Daniel Dunbar  Args.AddAllArgs(CmdArgs, options::OPT_sectcreate);
270102633b541b04ad5ffc1c70f4c2feeeb13e607057Daniel Dunbar  Args.AddAllArgs(CmdArgs, options::OPT_sectorder);
270202633b541b04ad5ffc1c70f4c2feeeb13e607057Daniel Dunbar  Args.AddAllArgs(CmdArgs, options::OPT_seg1addr);
270302633b541b04ad5ffc1c70f4c2feeeb13e607057Daniel Dunbar  Args.AddAllArgs(CmdArgs, options::OPT_segprot);
270402633b541b04ad5ffc1c70f4c2feeeb13e607057Daniel Dunbar  Args.AddAllArgs(CmdArgs, options::OPT_segaddr);
270502633b541b04ad5ffc1c70f4c2feeeb13e607057Daniel Dunbar  Args.AddAllArgs(CmdArgs, options::OPT_segs__read__only__addr);
270602633b541b04ad5ffc1c70f4c2feeeb13e607057Daniel Dunbar  Args.AddAllArgs(CmdArgs, options::OPT_segs__read__write__addr);
270702633b541b04ad5ffc1c70f4c2feeeb13e607057Daniel Dunbar  Args.AddAllArgs(CmdArgs, options::OPT_seg__addr__table);
270802633b541b04ad5ffc1c70f4c2feeeb13e607057Daniel Dunbar  Args.AddAllArgs(CmdArgs, options::OPT_seg__addr__table__filename);
270902633b541b04ad5ffc1c70f4c2feeeb13e607057Daniel Dunbar  Args.AddAllArgs(CmdArgs, options::OPT_sub__library);
271002633b541b04ad5ffc1c70f4c2feeeb13e607057Daniel Dunbar  Args.AddAllArgs(CmdArgs, options::OPT_sub__umbrella);
2711d82f8fa53771b454885c546f0fd452a4980b3a3eDaniel Dunbar
271202633b541b04ad5ffc1c70f4c2feeeb13e607057Daniel Dunbar  Args.AddAllArgsTranslated(CmdArgs, options::OPT_isysroot, "-syslibroot");
2713251ca6c9fb2bb398d9bf9fe7399c27bed7074b5cDaniel Dunbar  if (getDarwinToolChain().isTargetIPhoneOS()) {
2714d82f8fa53771b454885c546f0fd452a4980b3a3eDaniel Dunbar    if (!Args.hasArg(options::OPT_isysroot)) {
2715d82f8fa53771b454885c546f0fd452a4980b3a3eDaniel Dunbar      CmdArgs.push_back("-syslibroot");
2716d82f8fa53771b454885c546f0fd452a4980b3a3eDaniel Dunbar      CmdArgs.push_back("/Developer/SDKs/Extra");
2717d82f8fa53771b454885c546f0fd452a4980b3a3eDaniel Dunbar    }
2718d82f8fa53771b454885c546f0fd452a4980b3a3eDaniel Dunbar  }
2719d82f8fa53771b454885c546f0fd452a4980b3a3eDaniel Dunbar
272002633b541b04ad5ffc1c70f4c2feeeb13e607057Daniel Dunbar  Args.AddLastArg(CmdArgs, options::OPT_twolevel__namespace);
272102633b541b04ad5ffc1c70f4c2feeeb13e607057Daniel Dunbar  Args.AddLastArg(CmdArgs, options::OPT_twolevel__namespace__hints);
272202633b541b04ad5ffc1c70f4c2feeeb13e607057Daniel Dunbar  Args.AddAllArgs(CmdArgs, options::OPT_umbrella);
272302633b541b04ad5ffc1c70f4c2feeeb13e607057Daniel Dunbar  Args.AddAllArgs(CmdArgs, options::OPT_undefined);
272402633b541b04ad5ffc1c70f4c2feeeb13e607057Daniel Dunbar  Args.AddAllArgs(CmdArgs, options::OPT_unexported__symbols__list);
2725d82f8fa53771b454885c546f0fd452a4980b3a3eDaniel Dunbar  Args.AddAllArgs(CmdArgs, options::OPT_weak__reference__mismatches);
272602633b541b04ad5ffc1c70f4c2feeeb13e607057Daniel Dunbar  Args.AddLastArg(CmdArgs, options::OPT_X_Flag);
272702633b541b04ad5ffc1c70f4c2feeeb13e607057Daniel Dunbar  Args.AddAllArgs(CmdArgs, options::OPT_y);
272802633b541b04ad5ffc1c70f4c2feeeb13e607057Daniel Dunbar  Args.AddLastArg(CmdArgs, options::OPT_w);
272902633b541b04ad5ffc1c70f4c2feeeb13e607057Daniel Dunbar  Args.AddAllArgs(CmdArgs, options::OPT_pagezero__size);
273002633b541b04ad5ffc1c70f4c2feeeb13e607057Daniel Dunbar  Args.AddAllArgs(CmdArgs, options::OPT_segs__read__);
273102633b541b04ad5ffc1c70f4c2feeeb13e607057Daniel Dunbar  Args.AddLastArg(CmdArgs, options::OPT_seglinkedit);
273202633b541b04ad5ffc1c70f4c2feeeb13e607057Daniel Dunbar  Args.AddLastArg(CmdArgs, options::OPT_noseglinkedit);
273302633b541b04ad5ffc1c70f4c2feeeb13e607057Daniel Dunbar  Args.AddAllArgs(CmdArgs, options::OPT_sectalign);
273402633b541b04ad5ffc1c70f4c2feeeb13e607057Daniel Dunbar  Args.AddAllArgs(CmdArgs, options::OPT_sectobjectsymbols);
273502633b541b04ad5ffc1c70f4c2feeeb13e607057Daniel Dunbar  Args.AddAllArgs(CmdArgs, options::OPT_segcreate);
273602633b541b04ad5ffc1c70f4c2feeeb13e607057Daniel Dunbar  Args.AddLastArg(CmdArgs, options::OPT_whyload);
273702633b541b04ad5ffc1c70f4c2feeeb13e607057Daniel Dunbar  Args.AddLastArg(CmdArgs, options::OPT_whatsloaded);
273802633b541b04ad5ffc1c70f4c2feeeb13e607057Daniel Dunbar  Args.AddAllArgs(CmdArgs, options::OPT_dylinker__install__name);
273902633b541b04ad5ffc1c70f4c2feeeb13e607057Daniel Dunbar  Args.AddLastArg(CmdArgs, options::OPT_dylinker);
274002633b541b04ad5ffc1c70f4c2feeeb13e607057Daniel Dunbar  Args.AddLastArg(CmdArgs, options::OPT_Mach);
274102633b541b04ad5ffc1c70f4c2feeeb13e607057Daniel Dunbar}
274202633b541b04ad5ffc1c70f4c2feeeb13e607057Daniel Dunbar
274302633b541b04ad5ffc1c70f4c2feeeb13e607057Daniel Dunbarvoid darwin::Link::ConstructJob(Compilation &C, const JobAction &JA,
27442fe238ed293bd4bc27af9beb9fa151fad2146fa8Daniel Dunbar                                const InputInfo &Output,
2745c21c485b4fb58ef5d55cf3e523263dd824a2ace4Daniel Dunbar                                const InputInfoList &Inputs,
2746c21c485b4fb58ef5d55cf3e523263dd824a2ace4Daniel Dunbar                                const ArgList &Args,
274702633b541b04ad5ffc1c70f4c2feeeb13e607057Daniel Dunbar                                const char *LinkingOutput) const {
274802633b541b04ad5ffc1c70f4c2feeeb13e607057Daniel Dunbar  assert(Output.getType() == types::TY_Image && "Invalid linker output type.");
2749e0be8b1729d8978de433d229c065830b95d0ae68Daniel Dunbar
275002633b541b04ad5ffc1c70f4c2feeeb13e607057Daniel Dunbar  // The logic here is derived from gcc's behavior; most of which
275102633b541b04ad5ffc1c70f4c2feeeb13e607057Daniel Dunbar  // comes from specs (starting with link_command). Consult gcc for
275202633b541b04ad5ffc1c70f4c2feeeb13e607057Daniel Dunbar  // more information.
275302633b541b04ad5ffc1c70f4c2feeeb13e607057Daniel Dunbar  ArgStringList CmdArgs;
275402633b541b04ad5ffc1c70f4c2feeeb13e607057Daniel Dunbar
275502633b541b04ad5ffc1c70f4c2feeeb13e607057Daniel Dunbar  // I'm not sure why this particular decomposition exists in gcc, but
275602633b541b04ad5ffc1c70f4c2feeeb13e607057Daniel Dunbar  // we follow suite for ease of comparison.
2757748de8eda222f087434d8bd703176b316a061341Daniel Dunbar  AddLinkArgs(C, Args, CmdArgs);
275802633b541b04ad5ffc1c70f4c2feeeb13e607057Daniel Dunbar
275902633b541b04ad5ffc1c70f4c2feeeb13e607057Daniel Dunbar  Args.AddAllArgs(CmdArgs, options::OPT_d_Flag);
276002633b541b04ad5ffc1c70f4c2feeeb13e607057Daniel Dunbar  Args.AddAllArgs(CmdArgs, options::OPT_s);
276102633b541b04ad5ffc1c70f4c2feeeb13e607057Daniel Dunbar  Args.AddAllArgs(CmdArgs, options::OPT_t);
276202633b541b04ad5ffc1c70f4c2feeeb13e607057Daniel Dunbar  Args.AddAllArgs(CmdArgs, options::OPT_Z_Flag);
276302633b541b04ad5ffc1c70f4c2feeeb13e607057Daniel Dunbar  Args.AddAllArgs(CmdArgs, options::OPT_u_Group);
276402633b541b04ad5ffc1c70f4c2feeeb13e607057Daniel Dunbar  Args.AddAllArgs(CmdArgs, options::OPT_A);
276502633b541b04ad5ffc1c70f4c2feeeb13e607057Daniel Dunbar  Args.AddLastArg(CmdArgs, options::OPT_e);
276602633b541b04ad5ffc1c70f4c2feeeb13e607057Daniel Dunbar  Args.AddAllArgs(CmdArgs, options::OPT_m_Separate);
276702633b541b04ad5ffc1c70f4c2feeeb13e607057Daniel Dunbar  Args.AddAllArgs(CmdArgs, options::OPT_r);
276802633b541b04ad5ffc1c70f4c2feeeb13e607057Daniel Dunbar
2769270073c1e44d073e9732204fc099f280b368fab5Daniel Dunbar  // Forward -ObjC when either -ObjC or -ObjC++ is used, to force loading
2770270073c1e44d073e9732204fc099f280b368fab5Daniel Dunbar  // members of static archive libraries which implement Objective-C classes or
2771270073c1e44d073e9732204fc099f280b368fab5Daniel Dunbar  // categories.
2772270073c1e44d073e9732204fc099f280b368fab5Daniel Dunbar  if (Args.hasArg(options::OPT_ObjC) || Args.hasArg(options::OPT_ObjCXX))
2773270073c1e44d073e9732204fc099f280b368fab5Daniel Dunbar    CmdArgs.push_back("-ObjC");
277420249a1af2e462dcafdd6a350f1c7967b264ff25Michael J. Spencer
277502633b541b04ad5ffc1c70f4c2feeeb13e607057Daniel Dunbar  CmdArgs.push_back("-o");
277602633b541b04ad5ffc1c70f4c2feeeb13e607057Daniel Dunbar  CmdArgs.push_back(Output.getFilename());
277702633b541b04ad5ffc1c70f4c2feeeb13e607057Daniel Dunbar
277802633b541b04ad5ffc1c70f4c2feeeb13e607057Daniel Dunbar  if (!Args.hasArg(options::OPT_A) &&
277902633b541b04ad5ffc1c70f4c2feeeb13e607057Daniel Dunbar      !Args.hasArg(options::OPT_nostdlib) &&
278002633b541b04ad5ffc1c70f4c2feeeb13e607057Daniel Dunbar      !Args.hasArg(options::OPT_nostartfiles)) {
278102633b541b04ad5ffc1c70f4c2feeeb13e607057Daniel Dunbar    // Derived from startfile spec.
278202633b541b04ad5ffc1c70f4c2feeeb13e607057Daniel Dunbar    if (Args.hasArg(options::OPT_dynamiclib)) {
2783c21c485b4fb58ef5d55cf3e523263dd824a2ace4Daniel Dunbar      // Derived from darwin_dylib1 spec.
2784cacb0f007001f7463d44ebd5dde7bfaecf876a71Daniel Dunbar      if (getDarwinToolChain().isTargetIPhoneOS()) {
2785cacb0f007001f7463d44ebd5dde7bfaecf876a71Daniel Dunbar        if (getDarwinToolChain().isIPhoneOSVersionLT(3, 1))
2786cacb0f007001f7463d44ebd5dde7bfaecf876a71Daniel Dunbar          CmdArgs.push_back("-ldylib1.o");
2787cacb0f007001f7463d44ebd5dde7bfaecf876a71Daniel Dunbar      } else {
2788ce3fdf233353b10f20d74dceda3d77a82285de17Daniel Dunbar        if (getDarwinToolChain().isMacosxVersionLT(10, 5))
2789cacb0f007001f7463d44ebd5dde7bfaecf876a71Daniel Dunbar          CmdArgs.push_back("-ldylib1.o");
2790ce3fdf233353b10f20d74dceda3d77a82285de17Daniel Dunbar        else if (getDarwinToolChain().isMacosxVersionLT(10, 6))
2791cacb0f007001f7463d44ebd5dde7bfaecf876a71Daniel Dunbar          CmdArgs.push_back("-ldylib1.10.5.o");
2792cacb0f007001f7463d44ebd5dde7bfaecf876a71Daniel Dunbar      }
279302633b541b04ad5ffc1c70f4c2feeeb13e607057Daniel Dunbar    } else {
279402633b541b04ad5ffc1c70f4c2feeeb13e607057Daniel Dunbar      if (Args.hasArg(options::OPT_bundle)) {
27958a8d8afa3df40e9f122d2b826f1a825a66f6908dDaniel Dunbar        if (!Args.hasArg(options::OPT_static)) {
27968a8d8afa3df40e9f122d2b826f1a825a66f6908dDaniel Dunbar          // Derived from darwin_bundle1 spec.
2797cacb0f007001f7463d44ebd5dde7bfaecf876a71Daniel Dunbar          if (getDarwinToolChain().isTargetIPhoneOS()) {
2798cacb0f007001f7463d44ebd5dde7bfaecf876a71Daniel Dunbar            if (getDarwinToolChain().isIPhoneOSVersionLT(3, 1))
2799cacb0f007001f7463d44ebd5dde7bfaecf876a71Daniel Dunbar              CmdArgs.push_back("-lbundle1.o");
2800cacb0f007001f7463d44ebd5dde7bfaecf876a71Daniel Dunbar          } else {
2801ce3fdf233353b10f20d74dceda3d77a82285de17Daniel Dunbar            if (getDarwinToolChain().isMacosxVersionLT(10, 6))
2802cacb0f007001f7463d44ebd5dde7bfaecf876a71Daniel Dunbar              CmdArgs.push_back("-lbundle1.o");
2803cacb0f007001f7463d44ebd5dde7bfaecf876a71Daniel Dunbar          }
28048a8d8afa3df40e9f122d2b826f1a825a66f6908dDaniel Dunbar        }
280502633b541b04ad5ffc1c70f4c2feeeb13e607057Daniel Dunbar      } else {
280602633b541b04ad5ffc1c70f4c2feeeb13e607057Daniel Dunbar        if (Args.hasArg(options::OPT_pg)) {
280702633b541b04ad5ffc1c70f4c2feeeb13e607057Daniel Dunbar          if (Args.hasArg(options::OPT_static) ||
280802633b541b04ad5ffc1c70f4c2feeeb13e607057Daniel Dunbar              Args.hasArg(options::OPT_object) ||
280902633b541b04ad5ffc1c70f4c2feeeb13e607057Daniel Dunbar              Args.hasArg(options::OPT_preload)) {
281002633b541b04ad5ffc1c70f4c2feeeb13e607057Daniel Dunbar            CmdArgs.push_back("-lgcrt0.o");
281102633b541b04ad5ffc1c70f4c2feeeb13e607057Daniel Dunbar          } else {
281202633b541b04ad5ffc1c70f4c2feeeb13e607057Daniel Dunbar            CmdArgs.push_back("-lgcrt1.o");
2813c21c485b4fb58ef5d55cf3e523263dd824a2ace4Daniel Dunbar
281402633b541b04ad5ffc1c70f4c2feeeb13e607057Daniel Dunbar            // darwin_crt2 spec is empty.
2815c21c485b4fb58ef5d55cf3e523263dd824a2ace4Daniel Dunbar          }
281602633b541b04ad5ffc1c70f4c2feeeb13e607057Daniel Dunbar        } else {
281702633b541b04ad5ffc1c70f4c2feeeb13e607057Daniel Dunbar          if (Args.hasArg(options::OPT_static) ||
281802633b541b04ad5ffc1c70f4c2feeeb13e607057Daniel Dunbar              Args.hasArg(options::OPT_object) ||
281902633b541b04ad5ffc1c70f4c2feeeb13e607057Daniel Dunbar              Args.hasArg(options::OPT_preload)) {
282002633b541b04ad5ffc1c70f4c2feeeb13e607057Daniel Dunbar            CmdArgs.push_back("-lcrt0.o");
282102633b541b04ad5ffc1c70f4c2feeeb13e607057Daniel Dunbar          } else {
282202633b541b04ad5ffc1c70f4c2feeeb13e607057Daniel Dunbar            // Derived from darwin_crt1 spec.
2823251ca6c9fb2bb398d9bf9fe7399c27bed7074b5cDaniel Dunbar            if (getDarwinToolChain().isTargetIPhoneOS()) {
2824cacb0f007001f7463d44ebd5dde7bfaecf876a71Daniel Dunbar              if (getDarwinToolChain().isIPhoneOSVersionLT(3, 1))
2825cacb0f007001f7463d44ebd5dde7bfaecf876a71Daniel Dunbar                CmdArgs.push_back("-lcrt1.o");
2826cacb0f007001f7463d44ebd5dde7bfaecf876a71Daniel Dunbar              else
2827cacb0f007001f7463d44ebd5dde7bfaecf876a71Daniel Dunbar                CmdArgs.push_back("-lcrt1.3.1.o");
2828ce3fdf233353b10f20d74dceda3d77a82285de17Daniel Dunbar            } else {
2829ce3fdf233353b10f20d74dceda3d77a82285de17Daniel Dunbar              if (getDarwinToolChain().isMacosxVersionLT(10, 5))
2830ce3fdf233353b10f20d74dceda3d77a82285de17Daniel Dunbar                CmdArgs.push_back("-lcrt1.o");
2831ce3fdf233353b10f20d74dceda3d77a82285de17Daniel Dunbar              else if (getDarwinToolChain().isMacosxVersionLT(10, 6))
2832ce3fdf233353b10f20d74dceda3d77a82285de17Daniel Dunbar                CmdArgs.push_back("-lcrt1.10.5.o");
2833ce3fdf233353b10f20d74dceda3d77a82285de17Daniel Dunbar              else
2834ce3fdf233353b10f20d74dceda3d77a82285de17Daniel Dunbar                CmdArgs.push_back("-lcrt1.10.6.o");
2835c21c485b4fb58ef5d55cf3e523263dd824a2ace4Daniel Dunbar
2836ce3fdf233353b10f20d74dceda3d77a82285de17Daniel Dunbar              // darwin_crt2 spec is empty.
2837ce3fdf233353b10f20d74dceda3d77a82285de17Daniel Dunbar            }
283802633b541b04ad5ffc1c70f4c2feeeb13e607057Daniel Dunbar          }
283902633b541b04ad5ffc1c70f4c2feeeb13e607057Daniel Dunbar        }
284002633b541b04ad5ffc1c70f4c2feeeb13e607057Daniel Dunbar      }
284102633b541b04ad5ffc1c70f4c2feeeb13e607057Daniel Dunbar    }
284202633b541b04ad5ffc1c70f4c2feeeb13e607057Daniel Dunbar
2843ce3fdf233353b10f20d74dceda3d77a82285de17Daniel Dunbar    if (!getDarwinToolChain().isTargetIPhoneOS() &&
2844ce3fdf233353b10f20d74dceda3d77a82285de17Daniel Dunbar        Args.hasArg(options::OPT_shared_libgcc) &&
2845ce3fdf233353b10f20d74dceda3d77a82285de17Daniel Dunbar        getDarwinToolChain().isMacosxVersionLT(10, 5)) {
2846881376467c46c5c6cc16fa6790271c2c22e1d4f1Daniel Dunbar      const char *Str =
28474a7e88978cf646ad10d654020cb00b3877069210Daniel Dunbar        Args.MakeArgString(getToolChain().GetFilePath("crt3.o"));
2848881376467c46c5c6cc16fa6790271c2c22e1d4f1Daniel Dunbar      CmdArgs.push_back(Str);
284902633b541b04ad5ffc1c70f4c2feeeb13e607057Daniel Dunbar    }
285002633b541b04ad5ffc1c70f4c2feeeb13e607057Daniel Dunbar  }
285102633b541b04ad5ffc1c70f4c2feeeb13e607057Daniel Dunbar
285202633b541b04ad5ffc1c70f4c2feeeb13e607057Daniel Dunbar  Args.AddAllArgs(CmdArgs, options::OPT_L);
2853c21c485b4fb58ef5d55cf3e523263dd824a2ace4Daniel Dunbar
285402633b541b04ad5ffc1c70f4c2feeeb13e607057Daniel Dunbar  if (Args.hasArg(options::OPT_fopenmp))
285502633b541b04ad5ffc1c70f4c2feeeb13e607057Daniel Dunbar    // This is more complicated in gcc...
285602633b541b04ad5ffc1c70f4c2feeeb13e607057Daniel Dunbar    CmdArgs.push_back("-lgomp");
285702633b541b04ad5ffc1c70f4c2feeeb13e607057Daniel Dunbar
28586b200b2b698b6ac9e310f2225c69c85d28ae4fb0Daniel Dunbar  getDarwinToolChain().AddLinkSearchPathArgs(Args, CmdArgs);
2859c21c485b4fb58ef5d55cf3e523263dd824a2ace4Daniel Dunbar
28602008feead855f08500fb01ff43ef5eebee05d1e5Daniel Dunbar  AddLinkerInputs(getToolChain(), Inputs, Args, CmdArgs);
286102633b541b04ad5ffc1c70f4c2feeeb13e607057Daniel Dunbar
286202633b541b04ad5ffc1c70f4c2feeeb13e607057Daniel Dunbar  if (LinkingOutput) {
286302633b541b04ad5ffc1c70f4c2feeeb13e607057Daniel Dunbar    CmdArgs.push_back("-arch_multiple");
286402633b541b04ad5ffc1c70f4c2feeeb13e607057Daniel Dunbar    CmdArgs.push_back("-final_output");
286502633b541b04ad5ffc1c70f4c2feeeb13e607057Daniel Dunbar    CmdArgs.push_back(LinkingOutput);
286602633b541b04ad5ffc1c70f4c2feeeb13e607057Daniel Dunbar  }
286702633b541b04ad5ffc1c70f4c2feeeb13e607057Daniel Dunbar
286802633b541b04ad5ffc1c70f4c2feeeb13e607057Daniel Dunbar  if (Args.hasArg(options::OPT_fprofile_arcs) ||
286902633b541b04ad5ffc1c70f4c2feeeb13e607057Daniel Dunbar      Args.hasArg(options::OPT_fprofile_generate) ||
287002633b541b04ad5ffc1c70f4c2feeeb13e607057Daniel Dunbar      Args.hasArg(options::OPT_fcreate_profile) ||
287102633b541b04ad5ffc1c70f4c2feeeb13e607057Daniel Dunbar      Args.hasArg(options::OPT_coverage))
287202633b541b04ad5ffc1c70f4c2feeeb13e607057Daniel Dunbar    CmdArgs.push_back("-lgcov");
2873c21c485b4fb58ef5d55cf3e523263dd824a2ace4Daniel Dunbar
287402633b541b04ad5ffc1c70f4c2feeeb13e607057Daniel Dunbar  if (Args.hasArg(options::OPT_fnested_functions))
287502633b541b04ad5ffc1c70f4c2feeeb13e607057Daniel Dunbar    CmdArgs.push_back("-allow_stack_execute");
2876c21c485b4fb58ef5d55cf3e523263dd824a2ace4Daniel Dunbar
287702633b541b04ad5ffc1c70f4c2feeeb13e607057Daniel Dunbar  if (!Args.hasArg(options::OPT_nostdlib) &&
287802633b541b04ad5ffc1c70f4c2feeeb13e607057Daniel Dunbar      !Args.hasArg(options::OPT_nodefaultlibs)) {
2879ee788e70fcd0adf76103b17c78ac658d4ea30c9bDaniel Dunbar    if (getToolChain().getDriver().CCCIsCXX)
2880132e35d2f87895d20e7ea146c8c00404b80221a1Daniel Dunbar      getToolChain().AddCXXStdlibLibArgs(Args, CmdArgs);
2881edfa02b85b186e9ea9e0c841539a77ed32ee9148Daniel Dunbar
288202633b541b04ad5ffc1c70f4c2feeeb13e607057Daniel Dunbar    // link_ssp spec is empty.
288302633b541b04ad5ffc1c70f4c2feeeb13e607057Daniel Dunbar
28846cd4154b9088fa18ae05d11c0f3140fafd76c734Daniel Dunbar    // Let the tool chain choose which runtime library to link.
28856cd4154b9088fa18ae05d11c0f3140fafd76c734Daniel Dunbar    getDarwinToolChain().AddLinkRuntimeLibArgs(Args, CmdArgs);
288602633b541b04ad5ffc1c70f4c2feeeb13e607057Daniel Dunbar  }
288702633b541b04ad5ffc1c70f4c2feeeb13e607057Daniel Dunbar
288802633b541b04ad5ffc1c70f4c2feeeb13e607057Daniel Dunbar  if (!Args.hasArg(options::OPT_A) &&
288902633b541b04ad5ffc1c70f4c2feeeb13e607057Daniel Dunbar      !Args.hasArg(options::OPT_nostdlib) &&
289002633b541b04ad5ffc1c70f4c2feeeb13e607057Daniel Dunbar      !Args.hasArg(options::OPT_nostartfiles)) {
289102633b541b04ad5ffc1c70f4c2feeeb13e607057Daniel Dunbar    // endfile_spec is empty.
289202633b541b04ad5ffc1c70f4c2feeeb13e607057Daniel Dunbar  }
289302633b541b04ad5ffc1c70f4c2feeeb13e607057Daniel Dunbar
289402633b541b04ad5ffc1c70f4c2feeeb13e607057Daniel Dunbar  Args.AddAllArgs(CmdArgs, options::OPT_T_Group);
289502633b541b04ad5ffc1c70f4c2feeeb13e607057Daniel Dunbar  Args.AddAllArgs(CmdArgs, options::OPT_F);
289602633b541b04ad5ffc1c70f4c2feeeb13e607057Daniel Dunbar
2897c21c485b4fb58ef5d55cf3e523263dd824a2ace4Daniel Dunbar  const char *Exec =
28984a7e88978cf646ad10d654020cb00b3877069210Daniel Dunbar    Args.MakeArgString(getToolChain().GetProgramPath("ld"));
28992fe238ed293bd4bc27af9beb9fa151fad2146fa8Daniel Dunbar  C.addCommand(new Command(JA, *this, Exec, CmdArgs));
290002633b541b04ad5ffc1c70f4c2feeeb13e607057Daniel Dunbar}
290102633b541b04ad5ffc1c70f4c2feeeb13e607057Daniel Dunbar
2902ff7488dc9a766f94daf54d81b03ab9160d0bfd88Daniel Dunbarvoid darwin::Lipo::ConstructJob(Compilation &C, const JobAction &JA,
29032fe238ed293bd4bc27af9beb9fa151fad2146fa8Daniel Dunbar                                const InputInfo &Output,
2904c21c485b4fb58ef5d55cf3e523263dd824a2ace4Daniel Dunbar                                const InputInfoList &Inputs,
2905c21c485b4fb58ef5d55cf3e523263dd824a2ace4Daniel Dunbar                                const ArgList &Args,
2906ff7488dc9a766f94daf54d81b03ab9160d0bfd88Daniel Dunbar                                const char *LinkingOutput) const {
2907ff7488dc9a766f94daf54d81b03ab9160d0bfd88Daniel Dunbar  ArgStringList CmdArgs;
2908ff7488dc9a766f94daf54d81b03ab9160d0bfd88Daniel Dunbar
2909ff7488dc9a766f94daf54d81b03ab9160d0bfd88Daniel Dunbar  CmdArgs.push_back("-create");
2910ff7488dc9a766f94daf54d81b03ab9160d0bfd88Daniel Dunbar  assert(Output.isFilename() && "Unexpected lipo output.");
2911a428df828ea4cc6916ea90dcd9fbbc840776d207Daniel Dunbar
2912a428df828ea4cc6916ea90dcd9fbbc840776d207Daniel Dunbar  CmdArgs.push_back("-output");
2913ff7488dc9a766f94daf54d81b03ab9160d0bfd88Daniel Dunbar  CmdArgs.push_back(Output.getFilename());
2914a428df828ea4cc6916ea90dcd9fbbc840776d207Daniel Dunbar
2915ff7488dc9a766f94daf54d81b03ab9160d0bfd88Daniel Dunbar  for (InputInfoList::const_iterator
2916ff7488dc9a766f94daf54d81b03ab9160d0bfd88Daniel Dunbar         it = Inputs.begin(), ie = Inputs.end(); it != ie; ++it) {
2917ff7488dc9a766f94daf54d81b03ab9160d0bfd88Daniel Dunbar    const InputInfo &II = *it;
2918ff7488dc9a766f94daf54d81b03ab9160d0bfd88Daniel Dunbar    assert(II.isFilename() && "Unexpected lipo input.");
2919ff7488dc9a766f94daf54d81b03ab9160d0bfd88Daniel Dunbar    CmdArgs.push_back(II.getFilename());
2920ff7488dc9a766f94daf54d81b03ab9160d0bfd88Daniel Dunbar  }
2921c21c485b4fb58ef5d55cf3e523263dd824a2ace4Daniel Dunbar  const char *Exec =
29224a7e88978cf646ad10d654020cb00b3877069210Daniel Dunbar    Args.MakeArgString(getToolChain().GetProgramPath("lipo"));
29232fe238ed293bd4bc27af9beb9fa151fad2146fa8Daniel Dunbar  C.addCommand(new Command(JA, *this, Exec, CmdArgs));
2924ff7488dc9a766f94daf54d81b03ab9160d0bfd88Daniel Dunbar}
292568a31d406c6dc4382c700d1199b062de2aa7e1daDaniel Dunbar
29266e0f25483b1a801cd1155ea89c2b725feab16332Daniel Dunbarvoid darwin::Dsymutil::ConstructJob(Compilation &C, const JobAction &JA,
29272fe238ed293bd4bc27af9beb9fa151fad2146fa8Daniel Dunbar                                    const InputInfo &Output,
29286e0f25483b1a801cd1155ea89c2b725feab16332Daniel Dunbar                                    const InputInfoList &Inputs,
29296e0f25483b1a801cd1155ea89c2b725feab16332Daniel Dunbar                                    const ArgList &Args,
29306e0f25483b1a801cd1155ea89c2b725feab16332Daniel Dunbar                                    const char *LinkingOutput) const {
29316e0f25483b1a801cd1155ea89c2b725feab16332Daniel Dunbar  ArgStringList CmdArgs;
29326e0f25483b1a801cd1155ea89c2b725feab16332Daniel Dunbar
29336e0f25483b1a801cd1155ea89c2b725feab16332Daniel Dunbar  assert(Inputs.size() == 1 && "Unable to handle multiple inputs.");
29346e0f25483b1a801cd1155ea89c2b725feab16332Daniel Dunbar  const InputInfo &Input = Inputs[0];
29356e0f25483b1a801cd1155ea89c2b725feab16332Daniel Dunbar  assert(Input.isFilename() && "Unexpected dsymutil input.");
29366e0f25483b1a801cd1155ea89c2b725feab16332Daniel Dunbar  CmdArgs.push_back(Input.getFilename());
29376e0f25483b1a801cd1155ea89c2b725feab16332Daniel Dunbar
29386e0f25483b1a801cd1155ea89c2b725feab16332Daniel Dunbar  CmdArgs.push_back("-o");
29396e0f25483b1a801cd1155ea89c2b725feab16332Daniel Dunbar  CmdArgs.push_back(Output.getFilename());
29406e0f25483b1a801cd1155ea89c2b725feab16332Daniel Dunbar
29416e0f25483b1a801cd1155ea89c2b725feab16332Daniel Dunbar  const char *Exec =
29424a7e88978cf646ad10d654020cb00b3877069210Daniel Dunbar    Args.MakeArgString(getToolChain().GetProgramPath("dsymutil"));
29432fe238ed293bd4bc27af9beb9fa151fad2146fa8Daniel Dunbar  C.addCommand(new Command(JA, *this, Exec, CmdArgs));
29446e0f25483b1a801cd1155ea89c2b725feab16332Daniel Dunbar}
29456e0f25483b1a801cd1155ea89c2b725feab16332Daniel Dunbar
2946e7925a075f110ab21afeae084670a155dea568e3Edward O'Callaghanvoid auroraux::Assemble::ConstructJob(Compilation &C, const JobAction &JA,
29472fe238ed293bd4bc27af9beb9fa151fad2146fa8Daniel Dunbar                                      const InputInfo &Output,
2948294691eb1caf551083acd7b08630ef21c3fd760dDaniel Dunbar                                      const InputInfoList &Inputs,
2949294691eb1caf551083acd7b08630ef21c3fd760dDaniel Dunbar                                      const ArgList &Args,
2950294691eb1caf551083acd7b08630ef21c3fd760dDaniel Dunbar                                      const char *LinkingOutput) const {
2951e7925a075f110ab21afeae084670a155dea568e3Edward O'Callaghan  ArgStringList CmdArgs;
2952e7925a075f110ab21afeae084670a155dea568e3Edward O'Callaghan
2953e7925a075f110ab21afeae084670a155dea568e3Edward O'Callaghan  Args.AddAllArgValues(CmdArgs, options::OPT_Wa_COMMA,
2954e7925a075f110ab21afeae084670a155dea568e3Edward O'Callaghan                       options::OPT_Xassembler);
2955e7925a075f110ab21afeae084670a155dea568e3Edward O'Callaghan
2956e7925a075f110ab21afeae084670a155dea568e3Edward O'Callaghan  CmdArgs.push_back("-o");
29577c1e46533cae07216e2a67d5636a5afb44253155Daniel Dunbar  CmdArgs.push_back(Output.getFilename());
2958e7925a075f110ab21afeae084670a155dea568e3Edward O'Callaghan
2959e7925a075f110ab21afeae084670a155dea568e3Edward O'Callaghan  for (InputInfoList::const_iterator
2960e7925a075f110ab21afeae084670a155dea568e3Edward O'Callaghan         it = Inputs.begin(), ie = Inputs.end(); it != ie; ++it) {
2961e7925a075f110ab21afeae084670a155dea568e3Edward O'Callaghan    const InputInfo &II = *it;
29627c1e46533cae07216e2a67d5636a5afb44253155Daniel Dunbar    CmdArgs.push_back(II.getFilename());
2963e7925a075f110ab21afeae084670a155dea568e3Edward O'Callaghan  }
2964e7925a075f110ab21afeae084670a155dea568e3Edward O'Callaghan
2965e7925a075f110ab21afeae084670a155dea568e3Edward O'Callaghan  const char *Exec =
29664a7e88978cf646ad10d654020cb00b3877069210Daniel Dunbar    Args.MakeArgString(getToolChain().GetProgramPath("gas"));
29672fe238ed293bd4bc27af9beb9fa151fad2146fa8Daniel Dunbar  C.addCommand(new Command(JA, *this, Exec, CmdArgs));
2968e7925a075f110ab21afeae084670a155dea568e3Edward O'Callaghan}
2969e7925a075f110ab21afeae084670a155dea568e3Edward O'Callaghan
2970e7925a075f110ab21afeae084670a155dea568e3Edward O'Callaghanvoid auroraux::Link::ConstructJob(Compilation &C, const JobAction &JA,
29712fe238ed293bd4bc27af9beb9fa151fad2146fa8Daniel Dunbar                                  const InputInfo &Output,
2972294691eb1caf551083acd7b08630ef21c3fd760dDaniel Dunbar                                  const InputInfoList &Inputs,
2973294691eb1caf551083acd7b08630ef21c3fd760dDaniel Dunbar                                  const ArgList &Args,
2974294691eb1caf551083acd7b08630ef21c3fd760dDaniel Dunbar                                  const char *LinkingOutput) const {
2975e7925a075f110ab21afeae084670a155dea568e3Edward O'Callaghan  ArgStringList CmdArgs;
2976e7925a075f110ab21afeae084670a155dea568e3Edward O'Callaghan
2977e7925a075f110ab21afeae084670a155dea568e3Edward O'Callaghan  if ((!Args.hasArg(options::OPT_nostdlib)) &&
2978294691eb1caf551083acd7b08630ef21c3fd760dDaniel Dunbar      (!Args.hasArg(options::OPT_shared))) {
2979e7925a075f110ab21afeae084670a155dea568e3Edward O'Callaghan    CmdArgs.push_back("-e");
29807adf94906e23eae295a006659c55eab9ffcf8b37Edward O'Callaghan    CmdArgs.push_back("_start");
2981e7925a075f110ab21afeae084670a155dea568e3Edward O'Callaghan  }
2982e7925a075f110ab21afeae084670a155dea568e3Edward O'Callaghan
2983e7925a075f110ab21afeae084670a155dea568e3Edward O'Callaghan  if (Args.hasArg(options::OPT_static)) {
2984e7925a075f110ab21afeae084670a155dea568e3Edward O'Callaghan    CmdArgs.push_back("-Bstatic");
29857adf94906e23eae295a006659c55eab9ffcf8b37Edward O'Callaghan    CmdArgs.push_back("-dn");
2986e7925a075f110ab21afeae084670a155dea568e3Edward O'Callaghan  } else {
29877adf94906e23eae295a006659c55eab9ffcf8b37Edward O'Callaghan//    CmdArgs.push_back("--eh-frame-hdr");
2988e7925a075f110ab21afeae084670a155dea568e3Edward O'Callaghan    CmdArgs.push_back("-Bdynamic");
2989e7925a075f110ab21afeae084670a155dea568e3Edward O'Callaghan    if (Args.hasArg(options::OPT_shared)) {
2990e7925a075f110ab21afeae084670a155dea568e3Edward O'Callaghan      CmdArgs.push_back("-shared");
2991e7925a075f110ab21afeae084670a155dea568e3Edward O'Callaghan    } else {
29923cecc19f606ba1000da885b8ff4c089abad224ddEdward O'Callaghan      CmdArgs.push_back("--dynamic-linker");
2993e7925a075f110ab21afeae084670a155dea568e3Edward O'Callaghan      CmdArgs.push_back("/lib/ld.so.1"); // 64Bit Path /lib/amd64/ld.so.1
2994e7925a075f110ab21afeae084670a155dea568e3Edward O'Callaghan    }
2995e7925a075f110ab21afeae084670a155dea568e3Edward O'Callaghan  }
2996e7925a075f110ab21afeae084670a155dea568e3Edward O'Callaghan
29977c1e46533cae07216e2a67d5636a5afb44253155Daniel Dunbar  if (Output.isFilename()) {
2998e7925a075f110ab21afeae084670a155dea568e3Edward O'Callaghan    CmdArgs.push_back("-o");
2999e7925a075f110ab21afeae084670a155dea568e3Edward O'Callaghan    CmdArgs.push_back(Output.getFilename());
3000e7925a075f110ab21afeae084670a155dea568e3Edward O'Callaghan  } else {
3001e7925a075f110ab21afeae084670a155dea568e3Edward O'Callaghan    assert(Output.isNothing() && "Invalid output.");
3002e7925a075f110ab21afeae084670a155dea568e3Edward O'Callaghan  }
3003e7925a075f110ab21afeae084670a155dea568e3Edward O'Callaghan
3004e7925a075f110ab21afeae084670a155dea568e3Edward O'Callaghan  if (!Args.hasArg(options::OPT_nostdlib) &&
3005e7925a075f110ab21afeae084670a155dea568e3Edward O'Callaghan      !Args.hasArg(options::OPT_nostartfiles)) {
3006e7925a075f110ab21afeae084670a155dea568e3Edward O'Callaghan    if (!Args.hasArg(options::OPT_shared)) {
300738e317d6dce161b249508686cc67eb7176958762Chris Lattner      CmdArgs.push_back(Args.MakeArgString(
30084a7e88978cf646ad10d654020cb00b3877069210Daniel Dunbar                                getToolChain().GetFilePath("crt1.o")));
300938e317d6dce161b249508686cc67eb7176958762Chris Lattner      CmdArgs.push_back(Args.MakeArgString(
30104a7e88978cf646ad10d654020cb00b3877069210Daniel Dunbar                                getToolChain().GetFilePath("crti.o")));
301138e317d6dce161b249508686cc67eb7176958762Chris Lattner      CmdArgs.push_back(Args.MakeArgString(
30124a7e88978cf646ad10d654020cb00b3877069210Daniel Dunbar                                getToolChain().GetFilePath("crtbegin.o")));
3013e7925a075f110ab21afeae084670a155dea568e3Edward O'Callaghan    } else {
301438e317d6dce161b249508686cc67eb7176958762Chris Lattner      CmdArgs.push_back(Args.MakeArgString(
30154a7e88978cf646ad10d654020cb00b3877069210Daniel Dunbar                                getToolChain().GetFilePath("crti.o")));
3016e7925a075f110ab21afeae084670a155dea568e3Edward O'Callaghan    }
301738e317d6dce161b249508686cc67eb7176958762Chris Lattner    CmdArgs.push_back(Args.MakeArgString(
30184a7e88978cf646ad10d654020cb00b3877069210Daniel Dunbar                                getToolChain().GetFilePath("crtn.o")));
3019e7925a075f110ab21afeae084670a155dea568e3Edward O'Callaghan  }
3020e7925a075f110ab21afeae084670a155dea568e3Edward O'Callaghan
3021294691eb1caf551083acd7b08630ef21c3fd760dDaniel Dunbar  CmdArgs.push_back(Args.MakeArgString("-L/opt/gcc4/lib/gcc/"
3022294691eb1caf551083acd7b08630ef21c3fd760dDaniel Dunbar                                       + getToolChain().getTripleString()
3023f7fb31f4751c9c5ac3d9f93c19ec05a74dd9546fDaniel Dunbar                                       + "/4.2.4"));
3024e7925a075f110ab21afeae084670a155dea568e3Edward O'Callaghan
3025e7925a075f110ab21afeae084670a155dea568e3Edward O'Callaghan  Args.AddAllArgs(CmdArgs, options::OPT_L);
3026e7925a075f110ab21afeae084670a155dea568e3Edward O'Callaghan  Args.AddAllArgs(CmdArgs, options::OPT_T_Group);
3027e7925a075f110ab21afeae084670a155dea568e3Edward O'Callaghan  Args.AddAllArgs(CmdArgs, options::OPT_e);
3028e7925a075f110ab21afeae084670a155dea568e3Edward O'Callaghan
30292008feead855f08500fb01ff43ef5eebee05d1e5Daniel Dunbar  AddLinkerInputs(getToolChain(), Inputs, Args, CmdArgs);
3030e7925a075f110ab21afeae084670a155dea568e3Edward O'Callaghan
3031e7925a075f110ab21afeae084670a155dea568e3Edward O'Callaghan  if (!Args.hasArg(options::OPT_nostdlib) &&
3032e7925a075f110ab21afeae084670a155dea568e3Edward O'Callaghan      !Args.hasArg(options::OPT_nodefaultlibs)) {
3033e7925a075f110ab21afeae084670a155dea568e3Edward O'Callaghan    // FIXME: For some reason GCC passes -lgcc before adding
3034e7925a075f110ab21afeae084670a155dea568e3Edward O'Callaghan    // the default system libraries. Just mimic this for now.
3035e7925a075f110ab21afeae084670a155dea568e3Edward O'Callaghan    CmdArgs.push_back("-lgcc");
3036e7925a075f110ab21afeae084670a155dea568e3Edward O'Callaghan
3037e7925a075f110ab21afeae084670a155dea568e3Edward O'Callaghan    if (Args.hasArg(options::OPT_pthread))
3038e7925a075f110ab21afeae084670a155dea568e3Edward O'Callaghan      CmdArgs.push_back("-pthread");
3039e7925a075f110ab21afeae084670a155dea568e3Edward O'Callaghan    if (!Args.hasArg(options::OPT_shared))
3040e7925a075f110ab21afeae084670a155dea568e3Edward O'Callaghan      CmdArgs.push_back("-lc");
3041e7925a075f110ab21afeae084670a155dea568e3Edward O'Callaghan    CmdArgs.push_back("-lgcc");
3042e7925a075f110ab21afeae084670a155dea568e3Edward O'Callaghan  }
3043e7925a075f110ab21afeae084670a155dea568e3Edward O'Callaghan
3044e7925a075f110ab21afeae084670a155dea568e3Edward O'Callaghan  if (!Args.hasArg(options::OPT_nostdlib) &&
3045e7925a075f110ab21afeae084670a155dea568e3Edward O'Callaghan      !Args.hasArg(options::OPT_nostartfiles)) {
3046e7925a075f110ab21afeae084670a155dea568e3Edward O'Callaghan    if (!Args.hasArg(options::OPT_shared))
304738e317d6dce161b249508686cc67eb7176958762Chris Lattner      CmdArgs.push_back(Args.MakeArgString(
30484a7e88978cf646ad10d654020cb00b3877069210Daniel Dunbar                                getToolChain().GetFilePath("crtend.o")));
3049e7925a075f110ab21afeae084670a155dea568e3Edward O'Callaghan  }
3050e7925a075f110ab21afeae084670a155dea568e3Edward O'Callaghan
3051e7925a075f110ab21afeae084670a155dea568e3Edward O'Callaghan  const char *Exec =
30524a7e88978cf646ad10d654020cb00b3877069210Daniel Dunbar    Args.MakeArgString(getToolChain().GetProgramPath("ld"));
30532fe238ed293bd4bc27af9beb9fa151fad2146fa8Daniel Dunbar  C.addCommand(new Command(JA, *this, Exec, CmdArgs));
3054e7925a075f110ab21afeae084670a155dea568e3Edward O'Callaghan}
3055e7925a075f110ab21afeae084670a155dea568e3Edward O'Callaghan
3056f7b8eec37c8c8012fa525c71fb29a58c9f29beefDaniel Dunbarvoid openbsd::Assemble::ConstructJob(Compilation &C, const JobAction &JA,
30572fe238ed293bd4bc27af9beb9fa151fad2146fa8Daniel Dunbar                                     const InputInfo &Output,
3058f7b8eec37c8c8012fa525c71fb29a58c9f29beefDaniel Dunbar                                     const InputInfoList &Inputs,
3059f7b8eec37c8c8012fa525c71fb29a58c9f29beefDaniel Dunbar                                     const ArgList &Args,
30601eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump                                     const char *LinkingOutput) const {
3061f7b8eec37c8c8012fa525c71fb29a58c9f29beefDaniel Dunbar  ArgStringList CmdArgs;
3062f7b8eec37c8c8012fa525c71fb29a58c9f29beefDaniel Dunbar
3063f7b8eec37c8c8012fa525c71fb29a58c9f29beefDaniel Dunbar  Args.AddAllArgValues(CmdArgs, options::OPT_Wa_COMMA,
3064f7b8eec37c8c8012fa525c71fb29a58c9f29beefDaniel Dunbar                       options::OPT_Xassembler);
3065f7b8eec37c8c8012fa525c71fb29a58c9f29beefDaniel Dunbar
3066f7b8eec37c8c8012fa525c71fb29a58c9f29beefDaniel Dunbar  CmdArgs.push_back("-o");
30677c1e46533cae07216e2a67d5636a5afb44253155Daniel Dunbar  CmdArgs.push_back(Output.getFilename());
3068f7b8eec37c8c8012fa525c71fb29a58c9f29beefDaniel Dunbar
3069f7b8eec37c8c8012fa525c71fb29a58c9f29beefDaniel Dunbar  for (InputInfoList::const_iterator
3070f7b8eec37c8c8012fa525c71fb29a58c9f29beefDaniel Dunbar         it = Inputs.begin(), ie = Inputs.end(); it != ie; ++it) {
3071f7b8eec37c8c8012fa525c71fb29a58c9f29beefDaniel Dunbar    const InputInfo &II = *it;
30727c1e46533cae07216e2a67d5636a5afb44253155Daniel Dunbar    CmdArgs.push_back(II.getFilename());
3073f7b8eec37c8c8012fa525c71fb29a58c9f29beefDaniel Dunbar  }
3074f7b8eec37c8c8012fa525c71fb29a58c9f29beefDaniel Dunbar
3075f7b8eec37c8c8012fa525c71fb29a58c9f29beefDaniel Dunbar  const char *Exec =
30764a7e88978cf646ad10d654020cb00b3877069210Daniel Dunbar    Args.MakeArgString(getToolChain().GetProgramPath("as"));
30772fe238ed293bd4bc27af9beb9fa151fad2146fa8Daniel Dunbar  C.addCommand(new Command(JA, *this, Exec, CmdArgs));
3078f7b8eec37c8c8012fa525c71fb29a58c9f29beefDaniel Dunbar}
3079f7b8eec37c8c8012fa525c71fb29a58c9f29beefDaniel Dunbar
3080f7b8eec37c8c8012fa525c71fb29a58c9f29beefDaniel Dunbarvoid openbsd::Link::ConstructJob(Compilation &C, const JobAction &JA,
30812fe238ed293bd4bc27af9beb9fa151fad2146fa8Daniel Dunbar                                 const InputInfo &Output,
3082f7b8eec37c8c8012fa525c71fb29a58c9f29beefDaniel Dunbar                                 const InputInfoList &Inputs,
3083f7b8eec37c8c8012fa525c71fb29a58c9f29beefDaniel Dunbar                                 const ArgList &Args,
3084f7b8eec37c8c8012fa525c71fb29a58c9f29beefDaniel Dunbar                                 const char *LinkingOutput) const {
3085ee788e70fcd0adf76103b17c78ac658d4ea30c9bDaniel Dunbar  const Driver &D = getToolChain().getDriver();
3086f7b8eec37c8c8012fa525c71fb29a58c9f29beefDaniel Dunbar  ArgStringList CmdArgs;
3087f7b8eec37c8c8012fa525c71fb29a58c9f29beefDaniel Dunbar
30882bbcf669742b6b27748414e22f8042236fceef65Daniel Dunbar  if ((!Args.hasArg(options::OPT_nostdlib)) &&
3089294691eb1caf551083acd7b08630ef21c3fd760dDaniel Dunbar      (!Args.hasArg(options::OPT_shared))) {
30902bbcf669742b6b27748414e22f8042236fceef65Daniel Dunbar    CmdArgs.push_back("-e");
30912bbcf669742b6b27748414e22f8042236fceef65Daniel Dunbar    CmdArgs.push_back("__start");
30922bbcf669742b6b27748414e22f8042236fceef65Daniel Dunbar  }
30932bbcf669742b6b27748414e22f8042236fceef65Daniel Dunbar
3094f7b8eec37c8c8012fa525c71fb29a58c9f29beefDaniel Dunbar  if (Args.hasArg(options::OPT_static)) {
3095f7b8eec37c8c8012fa525c71fb29a58c9f29beefDaniel Dunbar    CmdArgs.push_back("-Bstatic");
3096f7b8eec37c8c8012fa525c71fb29a58c9f29beefDaniel Dunbar  } else {
309765ba55da577b23b24513b815031fc870d1d27971Rafael Espindola    if (Args.hasArg(options::OPT_rdynamic))
309865ba55da577b23b24513b815031fc870d1d27971Rafael Espindola      CmdArgs.push_back("-export-dynamic");
3099f7b8eec37c8c8012fa525c71fb29a58c9f29beefDaniel Dunbar    CmdArgs.push_back("--eh-frame-hdr");
31002bbcf669742b6b27748414e22f8042236fceef65Daniel Dunbar    CmdArgs.push_back("-Bdynamic");
3101f7b8eec37c8c8012fa525c71fb29a58c9f29beefDaniel Dunbar    if (Args.hasArg(options::OPT_shared)) {
31022bbcf669742b6b27748414e22f8042236fceef65Daniel Dunbar      CmdArgs.push_back("-shared");
3103f7b8eec37c8c8012fa525c71fb29a58c9f29beefDaniel Dunbar    } else {
3104f7b8eec37c8c8012fa525c71fb29a58c9f29beefDaniel Dunbar      CmdArgs.push_back("-dynamic-linker");
3105f7b8eec37c8c8012fa525c71fb29a58c9f29beefDaniel Dunbar      CmdArgs.push_back("/usr/libexec/ld.so");
3106f7b8eec37c8c8012fa525c71fb29a58c9f29beefDaniel Dunbar    }
3107f7b8eec37c8c8012fa525c71fb29a58c9f29beefDaniel Dunbar  }
3108f7b8eec37c8c8012fa525c71fb29a58c9f29beefDaniel Dunbar
31097c1e46533cae07216e2a67d5636a5afb44253155Daniel Dunbar  if (Output.isFilename()) {
3110f7b8eec37c8c8012fa525c71fb29a58c9f29beefDaniel Dunbar    CmdArgs.push_back("-o");
3111f7b8eec37c8c8012fa525c71fb29a58c9f29beefDaniel Dunbar    CmdArgs.push_back(Output.getFilename());
3112f7b8eec37c8c8012fa525c71fb29a58c9f29beefDaniel Dunbar  } else {
3113f7b8eec37c8c8012fa525c71fb29a58c9f29beefDaniel Dunbar    assert(Output.isNothing() && "Invalid output.");
3114f7b8eec37c8c8012fa525c71fb29a58c9f29beefDaniel Dunbar  }
3115f7b8eec37c8c8012fa525c71fb29a58c9f29beefDaniel Dunbar
3116f7b8eec37c8c8012fa525c71fb29a58c9f29beefDaniel Dunbar  if (!Args.hasArg(options::OPT_nostdlib) &&
3117f7b8eec37c8c8012fa525c71fb29a58c9f29beefDaniel Dunbar      !Args.hasArg(options::OPT_nostartfiles)) {
3118f7b8eec37c8c8012fa525c71fb29a58c9f29beefDaniel Dunbar    if (!Args.hasArg(options::OPT_shared)) {
311938e317d6dce161b249508686cc67eb7176958762Chris Lattner      CmdArgs.push_back(Args.MakeArgString(
31204a7e88978cf646ad10d654020cb00b3877069210Daniel Dunbar                              getToolChain().GetFilePath("crt0.o")));
312138e317d6dce161b249508686cc67eb7176958762Chris Lattner      CmdArgs.push_back(Args.MakeArgString(
31224a7e88978cf646ad10d654020cb00b3877069210Daniel Dunbar                              getToolChain().GetFilePath("crtbegin.o")));
3123f7b8eec37c8c8012fa525c71fb29a58c9f29beefDaniel Dunbar    } else {
312438e317d6dce161b249508686cc67eb7176958762Chris Lattner      CmdArgs.push_back(Args.MakeArgString(
31254a7e88978cf646ad10d654020cb00b3877069210Daniel Dunbar                              getToolChain().GetFilePath("crtbeginS.o")));
3126f7b8eec37c8c8012fa525c71fb29a58c9f29beefDaniel Dunbar    }
3127f7b8eec37c8c8012fa525c71fb29a58c9f29beefDaniel Dunbar  }
3128f7b8eec37c8c8012fa525c71fb29a58c9f29beefDaniel Dunbar
3129e7e18200e614a5e619602a088544c85ac8305a1fEdward O'Callaghan  std::string Triple = getToolChain().getTripleString();
3130e7e18200e614a5e619602a088544c85ac8305a1fEdward O'Callaghan  if (Triple.substr(0, 6) == "x86_64")
3131294691eb1caf551083acd7b08630ef21c3fd760dDaniel Dunbar    Triple.replace(0, 6, "amd64");
3132f7fb31f4751c9c5ac3d9f93c19ec05a74dd9546fDaniel Dunbar  CmdArgs.push_back(Args.MakeArgString("-L/usr/lib/gcc-lib/" + Triple +
313395c0457054518102af6250e718a13a5b2ee5dbeaDaniel Dunbar                                       "/4.2.1"));
31342bbcf669742b6b27748414e22f8042236fceef65Daniel Dunbar
3135f7b8eec37c8c8012fa525c71fb29a58c9f29beefDaniel Dunbar  Args.AddAllArgs(CmdArgs, options::OPT_L);
3136f7b8eec37c8c8012fa525c71fb29a58c9f29beefDaniel Dunbar  Args.AddAllArgs(CmdArgs, options::OPT_T_Group);
3137f7b8eec37c8c8012fa525c71fb29a58c9f29beefDaniel Dunbar  Args.AddAllArgs(CmdArgs, options::OPT_e);
3138f7b8eec37c8c8012fa525c71fb29a58c9f29beefDaniel Dunbar
31392008feead855f08500fb01ff43ef5eebee05d1e5Daniel Dunbar  AddLinkerInputs(getToolChain(), Inputs, Args, CmdArgs);
3140f7b8eec37c8c8012fa525c71fb29a58c9f29beefDaniel Dunbar
3141f7b8eec37c8c8012fa525c71fb29a58c9f29beefDaniel Dunbar  if (!Args.hasArg(options::OPT_nostdlib) &&
3142f7b8eec37c8c8012fa525c71fb29a58c9f29beefDaniel Dunbar      !Args.hasArg(options::OPT_nodefaultlibs)) {
314395c0457054518102af6250e718a13a5b2ee5dbeaDaniel Dunbar    if (D.CCCIsCXX) {
3144132e35d2f87895d20e7ea146c8c00404b80221a1Daniel Dunbar      getToolChain().AddCXXStdlibLibArgs(Args, CmdArgs);
314595c0457054518102af6250e718a13a5b2ee5dbeaDaniel Dunbar      CmdArgs.push_back("-lm");
314695c0457054518102af6250e718a13a5b2ee5dbeaDaniel Dunbar    }
314795c0457054518102af6250e718a13a5b2ee5dbeaDaniel Dunbar
31482bbcf669742b6b27748414e22f8042236fceef65Daniel Dunbar    // FIXME: For some reason GCC passes -lgcc before adding
31492bbcf669742b6b27748414e22f8042236fceef65Daniel Dunbar    // the default system libraries. Just mimic this for now.
31502bbcf669742b6b27748414e22f8042236fceef65Daniel Dunbar    CmdArgs.push_back("-lgcc");
3151f7b8eec37c8c8012fa525c71fb29a58c9f29beefDaniel Dunbar
3152f7b8eec37c8c8012fa525c71fb29a58c9f29beefDaniel Dunbar    if (Args.hasArg(options::OPT_pthread))
3153a2e40219e0a8f609a6c4cfc213223f02a3cef3c9Chris Lattner      CmdArgs.push_back("-lpthread");
31542bbcf669742b6b27748414e22f8042236fceef65Daniel Dunbar    if (!Args.hasArg(options::OPT_shared))
31552bbcf669742b6b27748414e22f8042236fceef65Daniel Dunbar      CmdArgs.push_back("-lc");
31562bbcf669742b6b27748414e22f8042236fceef65Daniel Dunbar    CmdArgs.push_back("-lgcc");
3157f7b8eec37c8c8012fa525c71fb29a58c9f29beefDaniel Dunbar  }
3158f7b8eec37c8c8012fa525c71fb29a58c9f29beefDaniel Dunbar
3159f7b8eec37c8c8012fa525c71fb29a58c9f29beefDaniel Dunbar  if (!Args.hasArg(options::OPT_nostdlib) &&
3160f7b8eec37c8c8012fa525c71fb29a58c9f29beefDaniel Dunbar      !Args.hasArg(options::OPT_nostartfiles)) {
3161f7b8eec37c8c8012fa525c71fb29a58c9f29beefDaniel Dunbar    if (!Args.hasArg(options::OPT_shared))
316238e317d6dce161b249508686cc67eb7176958762Chris Lattner      CmdArgs.push_back(Args.MakeArgString(
31634a7e88978cf646ad10d654020cb00b3877069210Daniel Dunbar                              getToolChain().GetFilePath("crtend.o")));
3164f7b8eec37c8c8012fa525c71fb29a58c9f29beefDaniel Dunbar    else
316538e317d6dce161b249508686cc67eb7176958762Chris Lattner      CmdArgs.push_back(Args.MakeArgString(
31664a7e88978cf646ad10d654020cb00b3877069210Daniel Dunbar                              getToolChain().GetFilePath("crtendS.o")));
3167f7b8eec37c8c8012fa525c71fb29a58c9f29beefDaniel Dunbar  }
3168f7b8eec37c8c8012fa525c71fb29a58c9f29beefDaniel Dunbar
3169f7b8eec37c8c8012fa525c71fb29a58c9f29beefDaniel Dunbar  const char *Exec =
31704a7e88978cf646ad10d654020cb00b3877069210Daniel Dunbar    Args.MakeArgString(getToolChain().GetProgramPath("ld"));
31712fe238ed293bd4bc27af9beb9fa151fad2146fa8Daniel Dunbar  C.addCommand(new Command(JA, *this, Exec, CmdArgs));
3172f7b8eec37c8c8012fa525c71fb29a58c9f29beefDaniel Dunbar}
3173c66a5a30a27e7b9cfab46ac8be918e3ea5b0c5a5Ed Schouten
317468a31d406c6dc4382c700d1199b062de2aa7e1daDaniel Dunbarvoid freebsd::Assemble::ConstructJob(Compilation &C, const JobAction &JA,
31752fe238ed293bd4bc27af9beb9fa151fad2146fa8Daniel Dunbar                                     const InputInfo &Output,
3176c21c485b4fb58ef5d55cf3e523263dd824a2ace4Daniel Dunbar                                     const InputInfoList &Inputs,
3177c21c485b4fb58ef5d55cf3e523263dd824a2ace4Daniel Dunbar                                     const ArgList &Args,
31781eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump                                     const char *LinkingOutput) const {
317968a31d406c6dc4382c700d1199b062de2aa7e1daDaniel Dunbar  ArgStringList CmdArgs;
318068a31d406c6dc4382c700d1199b062de2aa7e1daDaniel Dunbar
3181008f54a54299eaafdaa940e2bdeaf55935ecd95aDaniel Dunbar  // When building 32-bit code on FreeBSD/amd64, we have to explicitly
3182008f54a54299eaafdaa940e2bdeaf55935ecd95aDaniel Dunbar  // instruct as in the base system to assemble 32-bit code.
3183008f54a54299eaafdaa940e2bdeaf55935ecd95aDaniel Dunbar  if (getToolChain().getArchName() == "i386")
318468a31d406c6dc4382c700d1199b062de2aa7e1daDaniel Dunbar    CmdArgs.push_back("--32");
318568a31d406c6dc4382c700d1199b062de2aa7e1daDaniel Dunbar
318620249a1af2e462dcafdd6a350f1c7967b264ff25Michael J. Spencer
3187ed734737d5af31906e30e537d4a41c760ddcfc59Eric Christopher  // Set byte order explicitly
3188ed734737d5af31906e30e537d4a41c760ddcfc59Eric Christopher  if (getToolChain().getArchName() == "mips")
3189ed734737d5af31906e30e537d4a41c760ddcfc59Eric Christopher    CmdArgs.push_back("-EB");
3190ed734737d5af31906e30e537d4a41c760ddcfc59Eric Christopher  else if (getToolChain().getArchName() == "mipsel")
3191ed734737d5af31906e30e537d4a41c760ddcfc59Eric Christopher    CmdArgs.push_back("-EL");
3192ed734737d5af31906e30e537d4a41c760ddcfc59Eric Christopher
319368a31d406c6dc4382c700d1199b062de2aa7e1daDaniel Dunbar  Args.AddAllArgValues(CmdArgs, options::OPT_Wa_COMMA,
319468a31d406c6dc4382c700d1199b062de2aa7e1daDaniel Dunbar                       options::OPT_Xassembler);
319568a31d406c6dc4382c700d1199b062de2aa7e1daDaniel Dunbar
319668a31d406c6dc4382c700d1199b062de2aa7e1daDaniel Dunbar  CmdArgs.push_back("-o");
31977c1e46533cae07216e2a67d5636a5afb44253155Daniel Dunbar  CmdArgs.push_back(Output.getFilename());
319868a31d406c6dc4382c700d1199b062de2aa7e1daDaniel Dunbar
319968a31d406c6dc4382c700d1199b062de2aa7e1daDaniel Dunbar  for (InputInfoList::const_iterator
320068a31d406c6dc4382c700d1199b062de2aa7e1daDaniel Dunbar         it = Inputs.begin(), ie = Inputs.end(); it != ie; ++it) {
320168a31d406c6dc4382c700d1199b062de2aa7e1daDaniel Dunbar    const InputInfo &II = *it;
32027c1e46533cae07216e2a67d5636a5afb44253155Daniel Dunbar    CmdArgs.push_back(II.getFilename());
320368a31d406c6dc4382c700d1199b062de2aa7e1daDaniel Dunbar  }
320468a31d406c6dc4382c700d1199b062de2aa7e1daDaniel Dunbar
3205c21c485b4fb58ef5d55cf3e523263dd824a2ace4Daniel Dunbar  const char *Exec =
32064a7e88978cf646ad10d654020cb00b3877069210Daniel Dunbar    Args.MakeArgString(getToolChain().GetProgramPath("as"));
32072fe238ed293bd4bc27af9beb9fa151fad2146fa8Daniel Dunbar  C.addCommand(new Command(JA, *this, Exec, CmdArgs));
320868a31d406c6dc4382c700d1199b062de2aa7e1daDaniel Dunbar}
3209008f54a54299eaafdaa940e2bdeaf55935ecd95aDaniel Dunbar
3210008f54a54299eaafdaa940e2bdeaf55935ecd95aDaniel Dunbarvoid freebsd::Link::ConstructJob(Compilation &C, const JobAction &JA,
32112fe238ed293bd4bc27af9beb9fa151fad2146fa8Daniel Dunbar                                 const InputInfo &Output,
3212c21c485b4fb58ef5d55cf3e523263dd824a2ace4Daniel Dunbar                                 const InputInfoList &Inputs,
3213c21c485b4fb58ef5d55cf3e523263dd824a2ace4Daniel Dunbar                                 const ArgList &Args,
3214a8304f67291b0182fb64f3afc621615288dd1d31Daniel Dunbar                                 const char *LinkingOutput) const {
3215ee788e70fcd0adf76103b17c78ac658d4ea30c9bDaniel Dunbar  const Driver &D = getToolChain().getDriver();
3216008f54a54299eaafdaa940e2bdeaf55935ecd95aDaniel Dunbar  ArgStringList CmdArgs;
3217008f54a54299eaafdaa940e2bdeaf55935ecd95aDaniel Dunbar
3218008f54a54299eaafdaa940e2bdeaf55935ecd95aDaniel Dunbar  if (Args.hasArg(options::OPT_static)) {
3219008f54a54299eaafdaa940e2bdeaf55935ecd95aDaniel Dunbar    CmdArgs.push_back("-Bstatic");
3220008f54a54299eaafdaa940e2bdeaf55935ecd95aDaniel Dunbar  } else {
322165ba55da577b23b24513b815031fc870d1d27971Rafael Espindola    if (Args.hasArg(options::OPT_rdynamic))
322265ba55da577b23b24513b815031fc870d1d27971Rafael Espindola      CmdArgs.push_back("-export-dynamic");
3223008f54a54299eaafdaa940e2bdeaf55935ecd95aDaniel Dunbar    CmdArgs.push_back("--eh-frame-hdr");
3224008f54a54299eaafdaa940e2bdeaf55935ecd95aDaniel Dunbar    if (Args.hasArg(options::OPT_shared)) {
3225008f54a54299eaafdaa940e2bdeaf55935ecd95aDaniel Dunbar      CmdArgs.push_back("-Bshareable");
3226008f54a54299eaafdaa940e2bdeaf55935ecd95aDaniel Dunbar    } else {
3227008f54a54299eaafdaa940e2bdeaf55935ecd95aDaniel Dunbar      CmdArgs.push_back("-dynamic-linker");
3228008f54a54299eaafdaa940e2bdeaf55935ecd95aDaniel Dunbar      CmdArgs.push_back("/libexec/ld-elf.so.1");
3229008f54a54299eaafdaa940e2bdeaf55935ecd95aDaniel Dunbar    }
3230008f54a54299eaafdaa940e2bdeaf55935ecd95aDaniel Dunbar  }
3231008f54a54299eaafdaa940e2bdeaf55935ecd95aDaniel Dunbar
3232008f54a54299eaafdaa940e2bdeaf55935ecd95aDaniel Dunbar  // When building 32-bit code on FreeBSD/amd64, we have to explicitly
3233008f54a54299eaafdaa940e2bdeaf55935ecd95aDaniel Dunbar  // instruct ld in the base system to link 32-bit code.
3234008f54a54299eaafdaa940e2bdeaf55935ecd95aDaniel Dunbar  if (getToolChain().getArchName() == "i386") {
3235008f54a54299eaafdaa940e2bdeaf55935ecd95aDaniel Dunbar    CmdArgs.push_back("-m");
3236008f54a54299eaafdaa940e2bdeaf55935ecd95aDaniel Dunbar    CmdArgs.push_back("elf_i386_fbsd");
3237008f54a54299eaafdaa940e2bdeaf55935ecd95aDaniel Dunbar  }
3238008f54a54299eaafdaa940e2bdeaf55935ecd95aDaniel Dunbar
32397c1e46533cae07216e2a67d5636a5afb44253155Daniel Dunbar  if (Output.isFilename()) {
3240008f54a54299eaafdaa940e2bdeaf55935ecd95aDaniel Dunbar    CmdArgs.push_back("-o");
3241008f54a54299eaafdaa940e2bdeaf55935ecd95aDaniel Dunbar    CmdArgs.push_back(Output.getFilename());
3242008f54a54299eaafdaa940e2bdeaf55935ecd95aDaniel Dunbar  } else {
3243008f54a54299eaafdaa940e2bdeaf55935ecd95aDaniel Dunbar    assert(Output.isNothing() && "Invalid output.");
3244008f54a54299eaafdaa940e2bdeaf55935ecd95aDaniel Dunbar  }
3245008f54a54299eaafdaa940e2bdeaf55935ecd95aDaniel Dunbar
3246008f54a54299eaafdaa940e2bdeaf55935ecd95aDaniel Dunbar  if (!Args.hasArg(options::OPT_nostdlib) &&
3247008f54a54299eaafdaa940e2bdeaf55935ecd95aDaniel Dunbar      !Args.hasArg(options::OPT_nostartfiles)) {
3248008f54a54299eaafdaa940e2bdeaf55935ecd95aDaniel Dunbar    if (!Args.hasArg(options::OPT_shared)) {
3249c16bb76f25ada63864aa89827a9906c1579d2ad3Roman Divacky      if (Args.hasArg(options::OPT_pg))
3250c16bb76f25ada63864aa89827a9906c1579d2ad3Roman Divacky        CmdArgs.push_back(Args.MakeArgString(
3251c16bb76f25ada63864aa89827a9906c1579d2ad3Roman Divacky                                getToolChain().GetFilePath("gcrt1.o")));
3252c16bb76f25ada63864aa89827a9906c1579d2ad3Roman Divacky      else
3253c16bb76f25ada63864aa89827a9906c1579d2ad3Roman Divacky        CmdArgs.push_back(Args.MakeArgString(
3254c16bb76f25ada63864aa89827a9906c1579d2ad3Roman Divacky                                getToolChain().GetFilePath("crt1.o")));
325538e317d6dce161b249508686cc67eb7176958762Chris Lattner      CmdArgs.push_back(Args.MakeArgString(
32564a7e88978cf646ad10d654020cb00b3877069210Daniel Dunbar                              getToolChain().GetFilePath("crti.o")));
325738e317d6dce161b249508686cc67eb7176958762Chris Lattner      CmdArgs.push_back(Args.MakeArgString(
32584a7e88978cf646ad10d654020cb00b3877069210Daniel Dunbar                              getToolChain().GetFilePath("crtbegin.o")));
3259008f54a54299eaafdaa940e2bdeaf55935ecd95aDaniel Dunbar    } else {
326038e317d6dce161b249508686cc67eb7176958762Chris Lattner      CmdArgs.push_back(Args.MakeArgString(
32614a7e88978cf646ad10d654020cb00b3877069210Daniel Dunbar                              getToolChain().GetFilePath("crti.o")));
326238e317d6dce161b249508686cc67eb7176958762Chris Lattner      CmdArgs.push_back(Args.MakeArgString(
32634a7e88978cf646ad10d654020cb00b3877069210Daniel Dunbar                              getToolChain().GetFilePath("crtbeginS.o")));
3264008f54a54299eaafdaa940e2bdeaf55935ecd95aDaniel Dunbar    }
3265008f54a54299eaafdaa940e2bdeaf55935ecd95aDaniel Dunbar  }
3266008f54a54299eaafdaa940e2bdeaf55935ecd95aDaniel Dunbar
3267008f54a54299eaafdaa940e2bdeaf55935ecd95aDaniel Dunbar  Args.AddAllArgs(CmdArgs, options::OPT_L);
326880f0ab78f60379589c815b41de5d149c9479ca98Roman Divacky  CmdArgs.push_back("-L/usr/lib");
3269008f54a54299eaafdaa940e2bdeaf55935ecd95aDaniel Dunbar  Args.AddAllArgs(CmdArgs, options::OPT_T_Group);
3270008f54a54299eaafdaa940e2bdeaf55935ecd95aDaniel Dunbar  Args.AddAllArgs(CmdArgs, options::OPT_e);
3271c736377543edcfbb00a4150fae79b4d9d9f66849David Chisnall  Args.AddAllArgs(CmdArgs, options::OPT_s);
3272c736377543edcfbb00a4150fae79b4d9d9f66849David Chisnall  Args.AddAllArgs(CmdArgs, options::OPT_t);
3273c736377543edcfbb00a4150fae79b4d9d9f66849David Chisnall  Args.AddAllArgs(CmdArgs, options::OPT_Z_Flag);
3274c736377543edcfbb00a4150fae79b4d9d9f66849David Chisnall  Args.AddAllArgs(CmdArgs, options::OPT_r);
3275008f54a54299eaafdaa940e2bdeaf55935ecd95aDaniel Dunbar
32762008feead855f08500fb01ff43ef5eebee05d1e5Daniel Dunbar  AddLinkerInputs(getToolChain(), Inputs, Args, CmdArgs);
32778e50a96b387dca7525caa8a6add31420dd82a2cdBenjamin Kramer
32788e50a96b387dca7525caa8a6add31420dd82a2cdBenjamin Kramer  if (!Args.hasArg(options::OPT_nostdlib) &&
32798e50a96b387dca7525caa8a6add31420dd82a2cdBenjamin Kramer      !Args.hasArg(options::OPT_nodefaultlibs)) {
32808e50a96b387dca7525caa8a6add31420dd82a2cdBenjamin Kramer    if (D.CCCIsCXX) {
32818e50a96b387dca7525caa8a6add31420dd82a2cdBenjamin Kramer      getToolChain().AddCXXStdlibLibArgs(Args, CmdArgs);
3282c16bb76f25ada63864aa89827a9906c1579d2ad3Roman Divacky      if (Args.hasArg(options::OPT_pg))
3283c16bb76f25ada63864aa89827a9906c1579d2ad3Roman Divacky        CmdArgs.push_back("-lm_p");
3284c16bb76f25ada63864aa89827a9906c1579d2ad3Roman Divacky      else
3285c16bb76f25ada63864aa89827a9906c1579d2ad3Roman Divacky        CmdArgs.push_back("-lm");
32868e50a96b387dca7525caa8a6add31420dd82a2cdBenjamin Kramer    }
32878e50a96b387dca7525caa8a6add31420dd82a2cdBenjamin Kramer    // FIXME: For some reason GCC passes -lgcc and -lgcc_s before adding
32888e50a96b387dca7525caa8a6add31420dd82a2cdBenjamin Kramer    // the default system libraries. Just mimic this for now.
3289c16bb76f25ada63864aa89827a9906c1579d2ad3Roman Divacky    if (Args.hasArg(options::OPT_pg))
3290c16bb76f25ada63864aa89827a9906c1579d2ad3Roman Divacky      CmdArgs.push_back("-lgcc_p");
3291c16bb76f25ada63864aa89827a9906c1579d2ad3Roman Divacky    else
3292c16bb76f25ada63864aa89827a9906c1579d2ad3Roman Divacky      CmdArgs.push_back("-lgcc");
32938e50a96b387dca7525caa8a6add31420dd82a2cdBenjamin Kramer    if (Args.hasArg(options::OPT_static)) {
32948e50a96b387dca7525caa8a6add31420dd82a2cdBenjamin Kramer      CmdArgs.push_back("-lgcc_eh");
3295c16bb76f25ada63864aa89827a9906c1579d2ad3Roman Divacky    } else if (Args.hasArg(options::OPT_pg)) {
3296c16bb76f25ada63864aa89827a9906c1579d2ad3Roman Divacky      CmdArgs.push_back("-lgcc_eh_p");
32978e50a96b387dca7525caa8a6add31420dd82a2cdBenjamin Kramer    } else {
32988e50a96b387dca7525caa8a6add31420dd82a2cdBenjamin Kramer      CmdArgs.push_back("--as-needed");
32998e50a96b387dca7525caa8a6add31420dd82a2cdBenjamin Kramer      CmdArgs.push_back("-lgcc_s");
33008e50a96b387dca7525caa8a6add31420dd82a2cdBenjamin Kramer      CmdArgs.push_back("--no-as-needed");
33018e50a96b387dca7525caa8a6add31420dd82a2cdBenjamin Kramer    }
33028e50a96b387dca7525caa8a6add31420dd82a2cdBenjamin Kramer
3303242302673bdcf35b49579a30fed9dc068a4e10f2Matt Beaumont-Gay    if (Args.hasArg(options::OPT_pthread)) {
3304c16bb76f25ada63864aa89827a9906c1579d2ad3Roman Divacky      if (Args.hasArg(options::OPT_pg))
3305c16bb76f25ada63864aa89827a9906c1579d2ad3Roman Divacky        CmdArgs.push_back("-lpthread_p");
3306c16bb76f25ada63864aa89827a9906c1579d2ad3Roman Divacky      else
3307c16bb76f25ada63864aa89827a9906c1579d2ad3Roman Divacky        CmdArgs.push_back("-lpthread");
3308242302673bdcf35b49579a30fed9dc068a4e10f2Matt Beaumont-Gay    }
3309c16bb76f25ada63864aa89827a9906c1579d2ad3Roman Divacky
3310c16bb76f25ada63864aa89827a9906c1579d2ad3Roman Divacky    if (Args.hasArg(options::OPT_pg)) {
3311c16bb76f25ada63864aa89827a9906c1579d2ad3Roman Divacky      if (Args.hasArg(options::OPT_shared))
3312c16bb76f25ada63864aa89827a9906c1579d2ad3Roman Divacky        CmdArgs.push_back("-lc");
3313c16bb76f25ada63864aa89827a9906c1579d2ad3Roman Divacky      else
3314c16bb76f25ada63864aa89827a9906c1579d2ad3Roman Divacky        CmdArgs.push_back("-lc_p");
3315c16bb76f25ada63864aa89827a9906c1579d2ad3Roman Divacky      CmdArgs.push_back("-lgcc_p");
3316c16bb76f25ada63864aa89827a9906c1579d2ad3Roman Divacky    } else {
3317c16bb76f25ada63864aa89827a9906c1579d2ad3Roman Divacky      CmdArgs.push_back("-lc");
3318c16bb76f25ada63864aa89827a9906c1579d2ad3Roman Divacky      CmdArgs.push_back("-lgcc");
3319c16bb76f25ada63864aa89827a9906c1579d2ad3Roman Divacky    }
33208e50a96b387dca7525caa8a6add31420dd82a2cdBenjamin Kramer
33218e50a96b387dca7525caa8a6add31420dd82a2cdBenjamin Kramer    if (Args.hasArg(options::OPT_static)) {
33228e50a96b387dca7525caa8a6add31420dd82a2cdBenjamin Kramer      CmdArgs.push_back("-lgcc_eh");
3323c16bb76f25ada63864aa89827a9906c1579d2ad3Roman Divacky    } else if (Args.hasArg(options::OPT_pg)) {
3324c16bb76f25ada63864aa89827a9906c1579d2ad3Roman Divacky      CmdArgs.push_back("-lgcc_eh_p");
33258e50a96b387dca7525caa8a6add31420dd82a2cdBenjamin Kramer    } else {
33268e50a96b387dca7525caa8a6add31420dd82a2cdBenjamin Kramer      CmdArgs.push_back("--as-needed");
33278e50a96b387dca7525caa8a6add31420dd82a2cdBenjamin Kramer      CmdArgs.push_back("-lgcc_s");
33288e50a96b387dca7525caa8a6add31420dd82a2cdBenjamin Kramer      CmdArgs.push_back("--no-as-needed");
33298e50a96b387dca7525caa8a6add31420dd82a2cdBenjamin Kramer    }
33308e50a96b387dca7525caa8a6add31420dd82a2cdBenjamin Kramer  }
33318e50a96b387dca7525caa8a6add31420dd82a2cdBenjamin Kramer
33328e50a96b387dca7525caa8a6add31420dd82a2cdBenjamin Kramer  if (!Args.hasArg(options::OPT_nostdlib) &&
33338e50a96b387dca7525caa8a6add31420dd82a2cdBenjamin Kramer      !Args.hasArg(options::OPT_nostartfiles)) {
33348e50a96b387dca7525caa8a6add31420dd82a2cdBenjamin Kramer    if (!Args.hasArg(options::OPT_shared))
33358e50a96b387dca7525caa8a6add31420dd82a2cdBenjamin Kramer      CmdArgs.push_back(Args.MakeArgString(getToolChain().GetFilePath(
33368e50a96b387dca7525caa8a6add31420dd82a2cdBenjamin Kramer                                                                  "crtend.o")));
33378e50a96b387dca7525caa8a6add31420dd82a2cdBenjamin Kramer    else
33388e50a96b387dca7525caa8a6add31420dd82a2cdBenjamin Kramer      CmdArgs.push_back(Args.MakeArgString(getToolChain().GetFilePath(
33398e50a96b387dca7525caa8a6add31420dd82a2cdBenjamin Kramer                                                                 "crtendS.o")));
33408e50a96b387dca7525caa8a6add31420dd82a2cdBenjamin Kramer    CmdArgs.push_back(Args.MakeArgString(getToolChain().GetFilePath(
33418e50a96b387dca7525caa8a6add31420dd82a2cdBenjamin Kramer                                                                    "crtn.o")));
33428e50a96b387dca7525caa8a6add31420dd82a2cdBenjamin Kramer  }
33438e50a96b387dca7525caa8a6add31420dd82a2cdBenjamin Kramer
33448e50a96b387dca7525caa8a6add31420dd82a2cdBenjamin Kramer  const char *Exec =
33458e50a96b387dca7525caa8a6add31420dd82a2cdBenjamin Kramer    Args.MakeArgString(getToolChain().GetProgramPath("ld"));
33468e50a96b387dca7525caa8a6add31420dd82a2cdBenjamin Kramer  C.addCommand(new Command(JA, *this, Exec, CmdArgs));
33478e50a96b387dca7525caa8a6add31420dd82a2cdBenjamin Kramer}
33488e50a96b387dca7525caa8a6add31420dd82a2cdBenjamin Kramer
33498e50a96b387dca7525caa8a6add31420dd82a2cdBenjamin Kramervoid netbsd::Assemble::ConstructJob(Compilation &C, const JobAction &JA,
33508e50a96b387dca7525caa8a6add31420dd82a2cdBenjamin Kramer                                     const InputInfo &Output,
33518e50a96b387dca7525caa8a6add31420dd82a2cdBenjamin Kramer                                     const InputInfoList &Inputs,
33528e50a96b387dca7525caa8a6add31420dd82a2cdBenjamin Kramer                                     const ArgList &Args,
33538e50a96b387dca7525caa8a6add31420dd82a2cdBenjamin Kramer                                     const char *LinkingOutput) const {
33548e50a96b387dca7525caa8a6add31420dd82a2cdBenjamin Kramer  ArgStringList CmdArgs;
33558e50a96b387dca7525caa8a6add31420dd82a2cdBenjamin Kramer
33568e50a96b387dca7525caa8a6add31420dd82a2cdBenjamin Kramer  // When building 32-bit code on NetBSD/amd64, we have to explicitly
33578e50a96b387dca7525caa8a6add31420dd82a2cdBenjamin Kramer  // instruct as in the base system to assemble 32-bit code.
33588e50a96b387dca7525caa8a6add31420dd82a2cdBenjamin Kramer  if (getToolChain().getArchName() == "i386")
33598e50a96b387dca7525caa8a6add31420dd82a2cdBenjamin Kramer    CmdArgs.push_back("--32");
33608e50a96b387dca7525caa8a6add31420dd82a2cdBenjamin Kramer
33618e50a96b387dca7525caa8a6add31420dd82a2cdBenjamin Kramer
33628e50a96b387dca7525caa8a6add31420dd82a2cdBenjamin Kramer  // Set byte order explicitly
33638e50a96b387dca7525caa8a6add31420dd82a2cdBenjamin Kramer  if (getToolChain().getArchName() == "mips")
33648e50a96b387dca7525caa8a6add31420dd82a2cdBenjamin Kramer    CmdArgs.push_back("-EB");
33658e50a96b387dca7525caa8a6add31420dd82a2cdBenjamin Kramer  else if (getToolChain().getArchName() == "mipsel")
33668e50a96b387dca7525caa8a6add31420dd82a2cdBenjamin Kramer    CmdArgs.push_back("-EL");
33678e50a96b387dca7525caa8a6add31420dd82a2cdBenjamin Kramer
33688e50a96b387dca7525caa8a6add31420dd82a2cdBenjamin Kramer  Args.AddAllArgValues(CmdArgs, options::OPT_Wa_COMMA,
33698e50a96b387dca7525caa8a6add31420dd82a2cdBenjamin Kramer                       options::OPT_Xassembler);
33708e50a96b387dca7525caa8a6add31420dd82a2cdBenjamin Kramer
33718e50a96b387dca7525caa8a6add31420dd82a2cdBenjamin Kramer  CmdArgs.push_back("-o");
33728e50a96b387dca7525caa8a6add31420dd82a2cdBenjamin Kramer  CmdArgs.push_back(Output.getFilename());
33738e50a96b387dca7525caa8a6add31420dd82a2cdBenjamin Kramer
33748e50a96b387dca7525caa8a6add31420dd82a2cdBenjamin Kramer  for (InputInfoList::const_iterator
33758e50a96b387dca7525caa8a6add31420dd82a2cdBenjamin Kramer         it = Inputs.begin(), ie = Inputs.end(); it != ie; ++it) {
33768e50a96b387dca7525caa8a6add31420dd82a2cdBenjamin Kramer    const InputInfo &II = *it;
33778e50a96b387dca7525caa8a6add31420dd82a2cdBenjamin Kramer    CmdArgs.push_back(II.getFilename());
33788e50a96b387dca7525caa8a6add31420dd82a2cdBenjamin Kramer  }
33798e50a96b387dca7525caa8a6add31420dd82a2cdBenjamin Kramer
33808e50a96b387dca7525caa8a6add31420dd82a2cdBenjamin Kramer  const char *Exec =
33818e50a96b387dca7525caa8a6add31420dd82a2cdBenjamin Kramer    Args.MakeArgString(getToolChain().GetProgramPath("as"));
33828e50a96b387dca7525caa8a6add31420dd82a2cdBenjamin Kramer  C.addCommand(new Command(JA, *this, Exec, CmdArgs));
33838e50a96b387dca7525caa8a6add31420dd82a2cdBenjamin Kramer}
33848e50a96b387dca7525caa8a6add31420dd82a2cdBenjamin Kramer
33858e50a96b387dca7525caa8a6add31420dd82a2cdBenjamin Kramervoid netbsd::Link::ConstructJob(Compilation &C, const JobAction &JA,
33868e50a96b387dca7525caa8a6add31420dd82a2cdBenjamin Kramer                                 const InputInfo &Output,
33878e50a96b387dca7525caa8a6add31420dd82a2cdBenjamin Kramer                                 const InputInfoList &Inputs,
33888e50a96b387dca7525caa8a6add31420dd82a2cdBenjamin Kramer                                 const ArgList &Args,
33898e50a96b387dca7525caa8a6add31420dd82a2cdBenjamin Kramer                                 const char *LinkingOutput) const {
33908e50a96b387dca7525caa8a6add31420dd82a2cdBenjamin Kramer  const Driver &D = getToolChain().getDriver();
33918e50a96b387dca7525caa8a6add31420dd82a2cdBenjamin Kramer  ArgStringList CmdArgs;
33928e50a96b387dca7525caa8a6add31420dd82a2cdBenjamin Kramer
33938e50a96b387dca7525caa8a6add31420dd82a2cdBenjamin Kramer  if (Args.hasArg(options::OPT_static)) {
33948e50a96b387dca7525caa8a6add31420dd82a2cdBenjamin Kramer    CmdArgs.push_back("-Bstatic");
33958e50a96b387dca7525caa8a6add31420dd82a2cdBenjamin Kramer  } else {
33968e50a96b387dca7525caa8a6add31420dd82a2cdBenjamin Kramer    if (Args.hasArg(options::OPT_rdynamic))
33978e50a96b387dca7525caa8a6add31420dd82a2cdBenjamin Kramer      CmdArgs.push_back("-export-dynamic");
33988e50a96b387dca7525caa8a6add31420dd82a2cdBenjamin Kramer    CmdArgs.push_back("--eh-frame-hdr");
33998e50a96b387dca7525caa8a6add31420dd82a2cdBenjamin Kramer    if (Args.hasArg(options::OPT_shared)) {
34008e50a96b387dca7525caa8a6add31420dd82a2cdBenjamin Kramer      CmdArgs.push_back("-Bshareable");
34018e50a96b387dca7525caa8a6add31420dd82a2cdBenjamin Kramer    } else {
34028e50a96b387dca7525caa8a6add31420dd82a2cdBenjamin Kramer      CmdArgs.push_back("-dynamic-linker");
34038e50a96b387dca7525caa8a6add31420dd82a2cdBenjamin Kramer      CmdArgs.push_back("/libexec/ld.elf_so");
34048e50a96b387dca7525caa8a6add31420dd82a2cdBenjamin Kramer    }
34058e50a96b387dca7525caa8a6add31420dd82a2cdBenjamin Kramer  }
34068e50a96b387dca7525caa8a6add31420dd82a2cdBenjamin Kramer
34078e50a96b387dca7525caa8a6add31420dd82a2cdBenjamin Kramer  // When building 32-bit code on NetBSD/amd64, we have to explicitly
34088e50a96b387dca7525caa8a6add31420dd82a2cdBenjamin Kramer  // instruct ld in the base system to link 32-bit code.
34098e50a96b387dca7525caa8a6add31420dd82a2cdBenjamin Kramer  if (getToolChain().getArchName() == "i386") {
34108e50a96b387dca7525caa8a6add31420dd82a2cdBenjamin Kramer    CmdArgs.push_back("-m");
34118e50a96b387dca7525caa8a6add31420dd82a2cdBenjamin Kramer    CmdArgs.push_back("elf_i386");
34128e50a96b387dca7525caa8a6add31420dd82a2cdBenjamin Kramer  }
34138e50a96b387dca7525caa8a6add31420dd82a2cdBenjamin Kramer
34148e50a96b387dca7525caa8a6add31420dd82a2cdBenjamin Kramer  if (Output.isFilename()) {
34158e50a96b387dca7525caa8a6add31420dd82a2cdBenjamin Kramer    CmdArgs.push_back("-o");
34168e50a96b387dca7525caa8a6add31420dd82a2cdBenjamin Kramer    CmdArgs.push_back(Output.getFilename());
34178e50a96b387dca7525caa8a6add31420dd82a2cdBenjamin Kramer  } else {
34188e50a96b387dca7525caa8a6add31420dd82a2cdBenjamin Kramer    assert(Output.isNothing() && "Invalid output.");
34198e50a96b387dca7525caa8a6add31420dd82a2cdBenjamin Kramer  }
34208e50a96b387dca7525caa8a6add31420dd82a2cdBenjamin Kramer
34218e50a96b387dca7525caa8a6add31420dd82a2cdBenjamin Kramer  if (!Args.hasArg(options::OPT_nostdlib) &&
34228e50a96b387dca7525caa8a6add31420dd82a2cdBenjamin Kramer      !Args.hasArg(options::OPT_nostartfiles)) {
34238e50a96b387dca7525caa8a6add31420dd82a2cdBenjamin Kramer    if (!Args.hasArg(options::OPT_shared)) {
34248e50a96b387dca7525caa8a6add31420dd82a2cdBenjamin Kramer      CmdArgs.push_back(Args.MakeArgString(
34258e50a96b387dca7525caa8a6add31420dd82a2cdBenjamin Kramer                              getToolChain().GetFilePath("crt0.o")));
34268e50a96b387dca7525caa8a6add31420dd82a2cdBenjamin Kramer      CmdArgs.push_back(Args.MakeArgString(
34278e50a96b387dca7525caa8a6add31420dd82a2cdBenjamin Kramer                              getToolChain().GetFilePath("crti.o")));
34288e50a96b387dca7525caa8a6add31420dd82a2cdBenjamin Kramer      CmdArgs.push_back(Args.MakeArgString(
34298e50a96b387dca7525caa8a6add31420dd82a2cdBenjamin Kramer                              getToolChain().GetFilePath("crtbegin.o")));
34308e50a96b387dca7525caa8a6add31420dd82a2cdBenjamin Kramer    } else {
34318e50a96b387dca7525caa8a6add31420dd82a2cdBenjamin Kramer      CmdArgs.push_back(Args.MakeArgString(
34328e50a96b387dca7525caa8a6add31420dd82a2cdBenjamin Kramer                              getToolChain().GetFilePath("crti.o")));
34338e50a96b387dca7525caa8a6add31420dd82a2cdBenjamin Kramer      CmdArgs.push_back(Args.MakeArgString(
34348e50a96b387dca7525caa8a6add31420dd82a2cdBenjamin Kramer                              getToolChain().GetFilePath("crtbeginS.o")));
34358e50a96b387dca7525caa8a6add31420dd82a2cdBenjamin Kramer    }
34368e50a96b387dca7525caa8a6add31420dd82a2cdBenjamin Kramer  }
34378e50a96b387dca7525caa8a6add31420dd82a2cdBenjamin Kramer
34388e50a96b387dca7525caa8a6add31420dd82a2cdBenjamin Kramer  Args.AddAllArgs(CmdArgs, options::OPT_L);
34398e50a96b387dca7525caa8a6add31420dd82a2cdBenjamin Kramer  Args.AddAllArgs(CmdArgs, options::OPT_T_Group);
34408e50a96b387dca7525caa8a6add31420dd82a2cdBenjamin Kramer  Args.AddAllArgs(CmdArgs, options::OPT_e);
34418e50a96b387dca7525caa8a6add31420dd82a2cdBenjamin Kramer  Args.AddAllArgs(CmdArgs, options::OPT_s);
34428e50a96b387dca7525caa8a6add31420dd82a2cdBenjamin Kramer  Args.AddAllArgs(CmdArgs, options::OPT_t);
34438e50a96b387dca7525caa8a6add31420dd82a2cdBenjamin Kramer  Args.AddAllArgs(CmdArgs, options::OPT_Z_Flag);
34448e50a96b387dca7525caa8a6add31420dd82a2cdBenjamin Kramer  Args.AddAllArgs(CmdArgs, options::OPT_r);
34458e50a96b387dca7525caa8a6add31420dd82a2cdBenjamin Kramer
34468e50a96b387dca7525caa8a6add31420dd82a2cdBenjamin Kramer  AddLinkerInputs(getToolChain(), Inputs, Args, CmdArgs);
3447008f54a54299eaafdaa940e2bdeaf55935ecd95aDaniel Dunbar
3448008f54a54299eaafdaa940e2bdeaf55935ecd95aDaniel Dunbar  if (!Args.hasArg(options::OPT_nostdlib) &&
3449008f54a54299eaafdaa940e2bdeaf55935ecd95aDaniel Dunbar      !Args.hasArg(options::OPT_nodefaultlibs)) {
34502002263e10aa369c89008d37cada2908203fd822Daniel Dunbar    if (D.CCCIsCXX) {
3451132e35d2f87895d20e7ea146c8c00404b80221a1Daniel Dunbar      getToolChain().AddCXXStdlibLibArgs(Args, CmdArgs);
34522002263e10aa369c89008d37cada2908203fd822Daniel Dunbar      CmdArgs.push_back("-lm");
34532002263e10aa369c89008d37cada2908203fd822Daniel Dunbar    }
3454008f54a54299eaafdaa940e2bdeaf55935ecd95aDaniel Dunbar    // FIXME: For some reason GCC passes -lgcc and -lgcc_s before adding
3455008f54a54299eaafdaa940e2bdeaf55935ecd95aDaniel Dunbar    // the default system libraries. Just mimic this for now.
3456008f54a54299eaafdaa940e2bdeaf55935ecd95aDaniel Dunbar    CmdArgs.push_back("-lgcc");
3457008f54a54299eaafdaa940e2bdeaf55935ecd95aDaniel Dunbar    if (Args.hasArg(options::OPT_static)) {
3458008f54a54299eaafdaa940e2bdeaf55935ecd95aDaniel Dunbar      CmdArgs.push_back("-lgcc_eh");
3459008f54a54299eaafdaa940e2bdeaf55935ecd95aDaniel Dunbar    } else {
3460008f54a54299eaafdaa940e2bdeaf55935ecd95aDaniel Dunbar      CmdArgs.push_back("--as-needed");
3461008f54a54299eaafdaa940e2bdeaf55935ecd95aDaniel Dunbar      CmdArgs.push_back("-lgcc_s");
3462008f54a54299eaafdaa940e2bdeaf55935ecd95aDaniel Dunbar      CmdArgs.push_back("--no-as-needed");
3463008f54a54299eaafdaa940e2bdeaf55935ecd95aDaniel Dunbar    }
3464008f54a54299eaafdaa940e2bdeaf55935ecd95aDaniel Dunbar
3465008f54a54299eaafdaa940e2bdeaf55935ecd95aDaniel Dunbar    if (Args.hasArg(options::OPT_pthread))
3466008f54a54299eaafdaa940e2bdeaf55935ecd95aDaniel Dunbar      CmdArgs.push_back("-lpthread");
3467008f54a54299eaafdaa940e2bdeaf55935ecd95aDaniel Dunbar    CmdArgs.push_back("-lc");
3468008f54a54299eaafdaa940e2bdeaf55935ecd95aDaniel Dunbar
3469008f54a54299eaafdaa940e2bdeaf55935ecd95aDaniel Dunbar    CmdArgs.push_back("-lgcc");
3470008f54a54299eaafdaa940e2bdeaf55935ecd95aDaniel Dunbar    if (Args.hasArg(options::OPT_static)) {
3471008f54a54299eaafdaa940e2bdeaf55935ecd95aDaniel Dunbar      CmdArgs.push_back("-lgcc_eh");
3472008f54a54299eaafdaa940e2bdeaf55935ecd95aDaniel Dunbar    } else {
3473008f54a54299eaafdaa940e2bdeaf55935ecd95aDaniel Dunbar      CmdArgs.push_back("--as-needed");
3474008f54a54299eaafdaa940e2bdeaf55935ecd95aDaniel Dunbar      CmdArgs.push_back("-lgcc_s");
3475008f54a54299eaafdaa940e2bdeaf55935ecd95aDaniel Dunbar      CmdArgs.push_back("--no-as-needed");
3476008f54a54299eaafdaa940e2bdeaf55935ecd95aDaniel Dunbar    }
3477008f54a54299eaafdaa940e2bdeaf55935ecd95aDaniel Dunbar  }
3478008f54a54299eaafdaa940e2bdeaf55935ecd95aDaniel Dunbar
3479008f54a54299eaafdaa940e2bdeaf55935ecd95aDaniel Dunbar  if (!Args.hasArg(options::OPT_nostdlib) &&
3480008f54a54299eaafdaa940e2bdeaf55935ecd95aDaniel Dunbar      !Args.hasArg(options::OPT_nostartfiles)) {
3481008f54a54299eaafdaa940e2bdeaf55935ecd95aDaniel Dunbar    if (!Args.hasArg(options::OPT_shared))
34824a7e88978cf646ad10d654020cb00b3877069210Daniel Dunbar      CmdArgs.push_back(Args.MakeArgString(getToolChain().GetFilePath(
348338e317d6dce161b249508686cc67eb7176958762Chris Lattner                                                                  "crtend.o")));
3484008f54a54299eaafdaa940e2bdeaf55935ecd95aDaniel Dunbar    else
34854a7e88978cf646ad10d654020cb00b3877069210Daniel Dunbar      CmdArgs.push_back(Args.MakeArgString(getToolChain().GetFilePath(
348638e317d6dce161b249508686cc67eb7176958762Chris Lattner                                                                 "crtendS.o")));
34874a7e88978cf646ad10d654020cb00b3877069210Daniel Dunbar    CmdArgs.push_back(Args.MakeArgString(getToolChain().GetFilePath(
348838e317d6dce161b249508686cc67eb7176958762Chris Lattner                                                                    "crtn.o")));
3489008f54a54299eaafdaa940e2bdeaf55935ecd95aDaniel Dunbar  }
3490008f54a54299eaafdaa940e2bdeaf55935ecd95aDaniel Dunbar
3491c21c485b4fb58ef5d55cf3e523263dd824a2ace4Daniel Dunbar  const char *Exec =
34924a7e88978cf646ad10d654020cb00b3877069210Daniel Dunbar    Args.MakeArgString(getToolChain().GetProgramPath("ld"));
34932fe238ed293bd4bc27af9beb9fa151fad2146fa8Daniel Dunbar  C.addCommand(new Command(JA, *this, Exec, CmdArgs));
3494008f54a54299eaafdaa940e2bdeaf55935ecd95aDaniel Dunbar}
349511e1b40d759a643086f590f6ffbd9d68360bad46Daniel Dunbar
3496ba30bbe4e36a30a274da809a11a42f9cdc168e92Rafael Espindolavoid linuxtools::Assemble::ConstructJob(Compilation &C, const JobAction &JA,
3497ba30bbe4e36a30a274da809a11a42f9cdc168e92Rafael Espindola                                        const InputInfo &Output,
3498ba30bbe4e36a30a274da809a11a42f9cdc168e92Rafael Espindola                                        const InputInfoList &Inputs,
3499ba30bbe4e36a30a274da809a11a42f9cdc168e92Rafael Espindola                                        const ArgList &Args,
3500ba30bbe4e36a30a274da809a11a42f9cdc168e92Rafael Espindola                                        const char *LinkingOutput) const {
3501ba30bbe4e36a30a274da809a11a42f9cdc168e92Rafael Espindola  ArgStringList CmdArgs;
3502ba30bbe4e36a30a274da809a11a42f9cdc168e92Rafael Espindola
3503ba30bbe4e36a30a274da809a11a42f9cdc168e92Rafael Espindola  // Add --32/--64 to make sure we get the format we want.
3504ba30bbe4e36a30a274da809a11a42f9cdc168e92Rafael Espindola  // This is incomplete
3505ba30bbe4e36a30a274da809a11a42f9cdc168e92Rafael Espindola  if (getToolChain().getArch() == llvm::Triple::x86) {
3506ba30bbe4e36a30a274da809a11a42f9cdc168e92Rafael Espindola    CmdArgs.push_back("--32");
3507ba30bbe4e36a30a274da809a11a42f9cdc168e92Rafael Espindola  } else if (getToolChain().getArch() == llvm::Triple::x86_64) {
3508ba30bbe4e36a30a274da809a11a42f9cdc168e92Rafael Espindola    CmdArgs.push_back("--64");
3509ba30bbe4e36a30a274da809a11a42f9cdc168e92Rafael Espindola  } else if (getToolChain().getArch() == llvm::Triple::arm) {
3510ba30bbe4e36a30a274da809a11a42f9cdc168e92Rafael Espindola    llvm::StringRef MArch = getToolChain().getArchName();
3511ba30bbe4e36a30a274da809a11a42f9cdc168e92Rafael Espindola    if (MArch == "armv7" || MArch == "armv7a" || MArch == "armv7-a")
3512ba30bbe4e36a30a274da809a11a42f9cdc168e92Rafael Espindola      CmdArgs.push_back("-mfpu=neon");
3513ba30bbe4e36a30a274da809a11a42f9cdc168e92Rafael Espindola  }
3514ba30bbe4e36a30a274da809a11a42f9cdc168e92Rafael Espindola
3515ba30bbe4e36a30a274da809a11a42f9cdc168e92Rafael Espindola  Args.AddAllArgValues(CmdArgs, options::OPT_Wa_COMMA,
3516ba30bbe4e36a30a274da809a11a42f9cdc168e92Rafael Espindola                       options::OPT_Xassembler);
3517ba30bbe4e36a30a274da809a11a42f9cdc168e92Rafael Espindola
3518ba30bbe4e36a30a274da809a11a42f9cdc168e92Rafael Espindola  CmdArgs.push_back("-o");
3519ba30bbe4e36a30a274da809a11a42f9cdc168e92Rafael Espindola  CmdArgs.push_back(Output.getFilename());
3520ba30bbe4e36a30a274da809a11a42f9cdc168e92Rafael Espindola
3521ba30bbe4e36a30a274da809a11a42f9cdc168e92Rafael Espindola  for (InputInfoList::const_iterator
3522ba30bbe4e36a30a274da809a11a42f9cdc168e92Rafael Espindola         it = Inputs.begin(), ie = Inputs.end(); it != ie; ++it) {
3523ba30bbe4e36a30a274da809a11a42f9cdc168e92Rafael Espindola    const InputInfo &II = *it;
3524ba30bbe4e36a30a274da809a11a42f9cdc168e92Rafael Espindola    CmdArgs.push_back(II.getFilename());
3525ba30bbe4e36a30a274da809a11a42f9cdc168e92Rafael Espindola  }
3526ba30bbe4e36a30a274da809a11a42f9cdc168e92Rafael Espindola
3527ba30bbe4e36a30a274da809a11a42f9cdc168e92Rafael Espindola  const char *Exec =
3528ba30bbe4e36a30a274da809a11a42f9cdc168e92Rafael Espindola    Args.MakeArgString(getToolChain().GetProgramPath("as"));
3529ba30bbe4e36a30a274da809a11a42f9cdc168e92Rafael Espindola  C.addCommand(new Command(JA, *this, Exec, CmdArgs));
3530ba30bbe4e36a30a274da809a11a42f9cdc168e92Rafael Espindola}
3531ba30bbe4e36a30a274da809a11a42f9cdc168e92Rafael Espindola
3532c1da981bba867681004004b2d54ec2fdf3c08913Rafael Espindolavoid linuxtools::Link::ConstructJob(Compilation &C, const JobAction &JA,
3533c1da981bba867681004004b2d54ec2fdf3c08913Rafael Espindola                                    const InputInfo &Output,
3534c1da981bba867681004004b2d54ec2fdf3c08913Rafael Espindola                                    const InputInfoList &Inputs,
3535c1da981bba867681004004b2d54ec2fdf3c08913Rafael Espindola                                    const ArgList &Args,
3536c1da981bba867681004004b2d54ec2fdf3c08913Rafael Espindola                                    const char *LinkingOutput) const {
3537c1da981bba867681004004b2d54ec2fdf3c08913Rafael Espindola  const toolchains::Linux& ToolChain =
3538c1da981bba867681004004b2d54ec2fdf3c08913Rafael Espindola    static_cast<const toolchains::Linux&>(getToolChain());
3539c1da981bba867681004004b2d54ec2fdf3c08913Rafael Espindola  const Driver &D = ToolChain.getDriver();
3540c1da981bba867681004004b2d54ec2fdf3c08913Rafael Espindola  ArgStringList CmdArgs;
3541c1da981bba867681004004b2d54ec2fdf3c08913Rafael Espindola
354226f14c309e8de2db8c144342808cca2e869c1777Rafael Espindola  // Silence warning for "clang -g foo.o -o foo"
354326f14c309e8de2db8c144342808cca2e869c1777Rafael Espindola  Args.ClaimAllArgs(options::OPT_g_Group);
35447f6458b7e265d1870f3bd5be2b49bc4d368446b3Rafael Espindola  // and for "clang -g foo.o -o foo". Other warning options are already
35457f6458b7e265d1870f3bd5be2b49bc4d368446b3Rafael Espindola  // handled somewhere else.
35467f6458b7e265d1870f3bd5be2b49bc4d368446b3Rafael Espindola  Args.ClaimAllArgs(options::OPT_w);
354726f14c309e8de2db8c144342808cca2e869c1777Rafael Espindola
3548c1da981bba867681004004b2d54ec2fdf3c08913Rafael Espindola  if (Arg *A = Args.getLastArg(options::OPT__sysroot_EQ)) {
3549c1da981bba867681004004b2d54ec2fdf3c08913Rafael Espindola    CmdArgs.push_back("--sysroot");
3550c1da981bba867681004004b2d54ec2fdf3c08913Rafael Espindola    CmdArgs.push_back(A->getValue(Args));
3551c1da981bba867681004004b2d54ec2fdf3c08913Rafael Espindola  }
3552c1da981bba867681004004b2d54ec2fdf3c08913Rafael Espindola
3553fdda17179047ff0b5e28cc777dc89ebc42f083cfRafael Espindola  if (Args.hasArg(options::OPT_pie))
3554fdda17179047ff0b5e28cc777dc89ebc42f083cfRafael Espindola    CmdArgs.push_back("-pie");
3555fdda17179047ff0b5e28cc777dc89ebc42f083cfRafael Espindola
3556dc1b76ddfc687c713a55cc9e3e054e9a0de1aa74Rafael Espindola  if (Args.hasArg(options::OPT_rdynamic))
3557dc1b76ddfc687c713a55cc9e3e054e9a0de1aa74Rafael Espindola    CmdArgs.push_back("-export-dynamic");
3558dc1b76ddfc687c713a55cc9e3e054e9a0de1aa74Rafael Espindola
3559e0e6d3b5cf61dfefad3c0393f4786d2cf3d9c272Rafael Espindola  if (Args.hasArg(options::OPT_s))
3560e0e6d3b5cf61dfefad3c0393f4786d2cf3d9c272Rafael Espindola    CmdArgs.push_back("-s");
3561e0e6d3b5cf61dfefad3c0393f4786d2cf3d9c272Rafael Espindola
3562c1da981bba867681004004b2d54ec2fdf3c08913Rafael Espindola  for (std::vector<std::string>::const_iterator i = ToolChain.ExtraOpts.begin(),
3563c1da981bba867681004004b2d54ec2fdf3c08913Rafael Espindola         e = ToolChain.ExtraOpts.end();
3564c1da981bba867681004004b2d54ec2fdf3c08913Rafael Espindola       i != e; ++i)
3565c1da981bba867681004004b2d54ec2fdf3c08913Rafael Espindola    CmdArgs.push_back(i->c_str());
3566c1da981bba867681004004b2d54ec2fdf3c08913Rafael Espindola
3567c1da981bba867681004004b2d54ec2fdf3c08913Rafael Espindola  if (!Args.hasArg(options::OPT_static)) {
3568c1da981bba867681004004b2d54ec2fdf3c08913Rafael Espindola    CmdArgs.push_back("--eh-frame-hdr");
3569c1da981bba867681004004b2d54ec2fdf3c08913Rafael Espindola  }
3570c1da981bba867681004004b2d54ec2fdf3c08913Rafael Espindola
3571c1da981bba867681004004b2d54ec2fdf3c08913Rafael Espindola  CmdArgs.push_back("-m");
3572c1da981bba867681004004b2d54ec2fdf3c08913Rafael Espindola  if (ToolChain.getArch() == llvm::Triple::x86)
3573c1da981bba867681004004b2d54ec2fdf3c08913Rafael Espindola    CmdArgs.push_back("elf_i386");
3574c1da981bba867681004004b2d54ec2fdf3c08913Rafael Espindola  else if (ToolChain.getArch() == llvm::Triple::arm)
3575c1da981bba867681004004b2d54ec2fdf3c08913Rafael Espindola    CmdArgs.push_back("armelf_linux_eabi");
3576c1da981bba867681004004b2d54ec2fdf3c08913Rafael Espindola  else
3577c1da981bba867681004004b2d54ec2fdf3c08913Rafael Espindola    CmdArgs.push_back("elf_x86_64");
3578c1da981bba867681004004b2d54ec2fdf3c08913Rafael Espindola
3579c1da981bba867681004004b2d54ec2fdf3c08913Rafael Espindola  if (Args.hasArg(options::OPT_static)) {
3580c1da981bba867681004004b2d54ec2fdf3c08913Rafael Espindola    if (ToolChain.getArch() == llvm::Triple::arm)
3581c1da981bba867681004004b2d54ec2fdf3c08913Rafael Espindola      CmdArgs.push_back("-Bstatic");
3582c1da981bba867681004004b2d54ec2fdf3c08913Rafael Espindola    else
3583c1da981bba867681004004b2d54ec2fdf3c08913Rafael Espindola      CmdArgs.push_back("-static");
3584c1da981bba867681004004b2d54ec2fdf3c08913Rafael Espindola  } else if (Args.hasArg(options::OPT_shared)) {
3585c1da981bba867681004004b2d54ec2fdf3c08913Rafael Espindola    CmdArgs.push_back("-shared");
3586c1da981bba867681004004b2d54ec2fdf3c08913Rafael Espindola  }
3587c1da981bba867681004004b2d54ec2fdf3c08913Rafael Espindola
3588c1da981bba867681004004b2d54ec2fdf3c08913Rafael Espindola  if (ToolChain.getArch() == llvm::Triple::arm ||
3589c1da981bba867681004004b2d54ec2fdf3c08913Rafael Espindola      (!Args.hasArg(options::OPT_static) &&
3590c1da981bba867681004004b2d54ec2fdf3c08913Rafael Espindola       !Args.hasArg(options::OPT_shared))) {
3591c1da981bba867681004004b2d54ec2fdf3c08913Rafael Espindola    CmdArgs.push_back("-dynamic-linker");
3592c1da981bba867681004004b2d54ec2fdf3c08913Rafael Espindola    if (ToolChain.getArch() == llvm::Triple::x86)
3593c1da981bba867681004004b2d54ec2fdf3c08913Rafael Espindola      CmdArgs.push_back("/lib/ld-linux.so.2");
3594c1da981bba867681004004b2d54ec2fdf3c08913Rafael Espindola    else if (ToolChain.getArch() == llvm::Triple::arm)
3595c1da981bba867681004004b2d54ec2fdf3c08913Rafael Espindola      CmdArgs.push_back("/lib/ld-linux.so.3");
3596c1da981bba867681004004b2d54ec2fdf3c08913Rafael Espindola    else
3597c1da981bba867681004004b2d54ec2fdf3c08913Rafael Espindola      CmdArgs.push_back("/lib64/ld-linux-x86-64.so.2");
3598c1da981bba867681004004b2d54ec2fdf3c08913Rafael Espindola  }
3599c1da981bba867681004004b2d54ec2fdf3c08913Rafael Espindola
3600c1da981bba867681004004b2d54ec2fdf3c08913Rafael Espindola  CmdArgs.push_back("-o");
3601c1da981bba867681004004b2d54ec2fdf3c08913Rafael Espindola  CmdArgs.push_back(Output.getFilename());
3602c1da981bba867681004004b2d54ec2fdf3c08913Rafael Espindola
360349c64fdcf354c7998b8b301402fb6140c24df36aRafael Espindola  if (!Args.hasArg(options::OPT_nostdlib) &&
360449c64fdcf354c7998b8b301402fb6140c24df36aRafael Espindola      !Args.hasArg(options::OPT_nostartfiles)) {
3605fdda17179047ff0b5e28cc777dc89ebc42f083cfRafael Espindola    const char *crt1 = NULL;
3606fdda17179047ff0b5e28cc777dc89ebc42f083cfRafael Espindola    if (!Args.hasArg(options::OPT_shared)){
3607fdda17179047ff0b5e28cc777dc89ebc42f083cfRafael Espindola      if (Args.hasArg(options::OPT_pie))
3608fdda17179047ff0b5e28cc777dc89ebc42f083cfRafael Espindola        crt1 = "Scrt1.o";
3609fdda17179047ff0b5e28cc777dc89ebc42f083cfRafael Espindola      else
3610fdda17179047ff0b5e28cc777dc89ebc42f083cfRafael Espindola        crt1 = "crt1.o";
3611fdda17179047ff0b5e28cc777dc89ebc42f083cfRafael Espindola    }
3612fdda17179047ff0b5e28cc777dc89ebc42f083cfRafael Espindola    if (crt1)
3613fdda17179047ff0b5e28cc777dc89ebc42f083cfRafael Espindola      CmdArgs.push_back(Args.MakeArgString(ToolChain.GetFilePath(crt1)));
3614c1da981bba867681004004b2d54ec2fdf3c08913Rafael Espindola
361589414b384a0004c698244cc675f49d0669bb3463Rafael Espindola    CmdArgs.push_back(Args.MakeArgString(ToolChain.GetFilePath("crti.o")));
3616c1da981bba867681004004b2d54ec2fdf3c08913Rafael Espindola
361789414b384a0004c698244cc675f49d0669bb3463Rafael Espindola    const char *crtbegin;
361889414b384a0004c698244cc675f49d0669bb3463Rafael Espindola    if (Args.hasArg(options::OPT_static))
361989414b384a0004c698244cc675f49d0669bb3463Rafael Espindola      crtbegin = "crtbeginT.o";
3620fdda17179047ff0b5e28cc777dc89ebc42f083cfRafael Espindola    else if (Args.hasArg(options::OPT_shared) || Args.hasArg(options::OPT_pie))
362189414b384a0004c698244cc675f49d0669bb3463Rafael Espindola      crtbegin = "crtbeginS.o";
362289414b384a0004c698244cc675f49d0669bb3463Rafael Espindola    else
362389414b384a0004c698244cc675f49d0669bb3463Rafael Espindola      crtbegin = "crtbegin.o";
362489414b384a0004c698244cc675f49d0669bb3463Rafael Espindola    CmdArgs.push_back(Args.MakeArgString(ToolChain.GetFilePath(crtbegin)));
362589414b384a0004c698244cc675f49d0669bb3463Rafael Espindola  }
3626c1da981bba867681004004b2d54ec2fdf3c08913Rafael Espindola
3627c1da981bba867681004004b2d54ec2fdf3c08913Rafael Espindola  Args.AddAllArgs(CmdArgs, options::OPT_L);
3628c1da981bba867681004004b2d54ec2fdf3c08913Rafael Espindola
3629c1da981bba867681004004b2d54ec2fdf3c08913Rafael Espindola  const ToolChain::path_list Paths = ToolChain.getFilePaths();
3630c1da981bba867681004004b2d54ec2fdf3c08913Rafael Espindola
3631c1da981bba867681004004b2d54ec2fdf3c08913Rafael Espindola  for (ToolChain::path_list::const_iterator i = Paths.begin(),
3632c1da981bba867681004004b2d54ec2fdf3c08913Rafael Espindola         e = Paths.end();
3633c1da981bba867681004004b2d54ec2fdf3c08913Rafael Espindola       i != e; ++i) {
3634c1da981bba867681004004b2d54ec2fdf3c08913Rafael Espindola    const std::string &s = *i;
3635c1da981bba867681004004b2d54ec2fdf3c08913Rafael Espindola    CmdArgs.push_back(Args.MakeArgString(std::string("-L") + s));
3636c1da981bba867681004004b2d54ec2fdf3c08913Rafael Espindola  }
3637c1da981bba867681004004b2d54ec2fdf3c08913Rafael Espindola
3638c1da981bba867681004004b2d54ec2fdf3c08913Rafael Espindola  AddLinkerInputs(ToolChain, Inputs, Args, CmdArgs);
3639c1da981bba867681004004b2d54ec2fdf3c08913Rafael Espindola
364089414b384a0004c698244cc675f49d0669bb3463Rafael Espindola  if (D.CCCIsCXX && !Args.hasArg(options::OPT_nostdlib)) {
3641c1da981bba867681004004b2d54ec2fdf3c08913Rafael Espindola    ToolChain.AddCXXStdlibLibArgs(Args, CmdArgs);
3642c1da981bba867681004004b2d54ec2fdf3c08913Rafael Espindola    CmdArgs.push_back("-lm");
3643c1da981bba867681004004b2d54ec2fdf3c08913Rafael Espindola  }
3644c1da981bba867681004004b2d54ec2fdf3c08913Rafael Espindola
3645c1da981bba867681004004b2d54ec2fdf3c08913Rafael Espindola  if (Args.hasArg(options::OPT_static))
3646c1da981bba867681004004b2d54ec2fdf3c08913Rafael Espindola    CmdArgs.push_back("--start-group");
3647c1da981bba867681004004b2d54ec2fdf3c08913Rafael Espindola
364889414b384a0004c698244cc675f49d0669bb3463Rafael Espindola  if (!Args.hasArg(options::OPT_nostdlib)) {
3649c1da981bba867681004004b2d54ec2fdf3c08913Rafael Espindola    if (!D.CCCIsCXX)
365089414b384a0004c698244cc675f49d0669bb3463Rafael Espindola      CmdArgs.push_back("-lgcc");
3651c1da981bba867681004004b2d54ec2fdf3c08913Rafael Espindola
365289414b384a0004c698244cc675f49d0669bb3463Rafael Espindola    if (Args.hasArg(options::OPT_static)) {
365389414b384a0004c698244cc675f49d0669bb3463Rafael Espindola      if (D.CCCIsCXX)
365489414b384a0004c698244cc675f49d0669bb3463Rafael Espindola        CmdArgs.push_back("-lgcc");
365589414b384a0004c698244cc675f49d0669bb3463Rafael Espindola    } else {
365689414b384a0004c698244cc675f49d0669bb3463Rafael Espindola      if (!D.CCCIsCXX)
365789414b384a0004c698244cc675f49d0669bb3463Rafael Espindola        CmdArgs.push_back("--as-needed");
365889414b384a0004c698244cc675f49d0669bb3463Rafael Espindola      CmdArgs.push_back("-lgcc_s");
365989414b384a0004c698244cc675f49d0669bb3463Rafael Espindola      if (!D.CCCIsCXX)
366089414b384a0004c698244cc675f49d0669bb3463Rafael Espindola        CmdArgs.push_back("--no-as-needed");
366189414b384a0004c698244cc675f49d0669bb3463Rafael Espindola    }
3662c1da981bba867681004004b2d54ec2fdf3c08913Rafael Espindola
366389414b384a0004c698244cc675f49d0669bb3463Rafael Espindola    if (Args.hasArg(options::OPT_static))
366489414b384a0004c698244cc675f49d0669bb3463Rafael Espindola      CmdArgs.push_back("-lgcc_eh");
366589414b384a0004c698244cc675f49d0669bb3463Rafael Espindola    else if (!Args.hasArg(options::OPT_shared) && D.CCCIsCXX)
366689414b384a0004c698244cc675f49d0669bb3463Rafael Espindola      CmdArgs.push_back("-lgcc");
3667e0e6d3b5cf61dfefad3c0393f4786d2cf3d9c272Rafael Espindola
366889414b384a0004c698244cc675f49d0669bb3463Rafael Espindola    if (Args.hasArg(options::OPT_pthread) ||
366989414b384a0004c698244cc675f49d0669bb3463Rafael Espindola        Args.hasArg(options::OPT_pthreads))
367089414b384a0004c698244cc675f49d0669bb3463Rafael Espindola      CmdArgs.push_back("-lpthread");
3671c1da981bba867681004004b2d54ec2fdf3c08913Rafael Espindola
367289414b384a0004c698244cc675f49d0669bb3463Rafael Espindola    CmdArgs.push_back("-lc");
3673c1da981bba867681004004b2d54ec2fdf3c08913Rafael Espindola
367489414b384a0004c698244cc675f49d0669bb3463Rafael Espindola    if (Args.hasArg(options::OPT_static))
367589414b384a0004c698244cc675f49d0669bb3463Rafael Espindola      CmdArgs.push_back("--end-group");
367689414b384a0004c698244cc675f49d0669bb3463Rafael Espindola    else {
367789414b384a0004c698244cc675f49d0669bb3463Rafael Espindola      if (!D.CCCIsCXX)
367889414b384a0004c698244cc675f49d0669bb3463Rafael Espindola        CmdArgs.push_back("-lgcc");
3679c1da981bba867681004004b2d54ec2fdf3c08913Rafael Espindola
368089414b384a0004c698244cc675f49d0669bb3463Rafael Espindola      if (!D.CCCIsCXX)
368189414b384a0004c698244cc675f49d0669bb3463Rafael Espindola        CmdArgs.push_back("--as-needed");
368289414b384a0004c698244cc675f49d0669bb3463Rafael Espindola      CmdArgs.push_back("-lgcc_s");
368389414b384a0004c698244cc675f49d0669bb3463Rafael Espindola      if (!D.CCCIsCXX)
368489414b384a0004c698244cc675f49d0669bb3463Rafael Espindola        CmdArgs.push_back("--no-as-needed");
3685c1da981bba867681004004b2d54ec2fdf3c08913Rafael Espindola
368689414b384a0004c698244cc675f49d0669bb3463Rafael Espindola      if (!Args.hasArg(options::OPT_shared) && D.CCCIsCXX)
368789414b384a0004c698244cc675f49d0669bb3463Rafael Espindola        CmdArgs.push_back("-lgcc");
368889414b384a0004c698244cc675f49d0669bb3463Rafael Espindola    }
3689c1da981bba867681004004b2d54ec2fdf3c08913Rafael Espindola
3690fdda17179047ff0b5e28cc777dc89ebc42f083cfRafael Espindola
369149c64fdcf354c7998b8b301402fb6140c24df36aRafael Espindola    if (!Args.hasArg(options::OPT_nostartfiles)) {
369249c64fdcf354c7998b8b301402fb6140c24df36aRafael Espindola      const char *crtend;
369349c64fdcf354c7998b8b301402fb6140c24df36aRafael Espindola      if (Args.hasArg(options::OPT_shared) || Args.hasArg(options::OPT_pie))
369449c64fdcf354c7998b8b301402fb6140c24df36aRafael Espindola        crtend = "crtendS.o";
369549c64fdcf354c7998b8b301402fb6140c24df36aRafael Espindola      else
369649c64fdcf354c7998b8b301402fb6140c24df36aRafael Espindola        crtend = "crtend.o";
369789414b384a0004c698244cc675f49d0669bb3463Rafael Espindola
369849c64fdcf354c7998b8b301402fb6140c24df36aRafael Espindola      CmdArgs.push_back(Args.MakeArgString(ToolChain.GetFilePath(crtend)));
369949c64fdcf354c7998b8b301402fb6140c24df36aRafael Espindola      CmdArgs.push_back(Args.MakeArgString(ToolChain.GetFilePath("crtn.o")));
370049c64fdcf354c7998b8b301402fb6140c24df36aRafael Espindola    }
370189414b384a0004c698244cc675f49d0669bb3463Rafael Espindola  }
3702c1da981bba867681004004b2d54ec2fdf3c08913Rafael Espindola
3703c1da981bba867681004004b2d54ec2fdf3c08913Rafael Espindola  if (Args.hasArg(options::OPT_use_gold_plugin)) {
3704c1da981bba867681004004b2d54ec2fdf3c08913Rafael Espindola    CmdArgs.push_back("-plugin");
3705c1da981bba867681004004b2d54ec2fdf3c08913Rafael Espindola    std::string Plugin = ToolChain.getDriver().Dir + "/../lib/LLVMgold.so";
3706c1da981bba867681004004b2d54ec2fdf3c08913Rafael Espindola    CmdArgs.push_back(Args.MakeArgString(Plugin));
3707c1da981bba867681004004b2d54ec2fdf3c08913Rafael Espindola  }
3708c1da981bba867681004004b2d54ec2fdf3c08913Rafael Espindola
3709c1da981bba867681004004b2d54ec2fdf3c08913Rafael Espindola  C.addCommand(new Command(JA, *this, ToolChain.Linker.c_str(), CmdArgs));
3710c1da981bba867681004004b2d54ec2fdf3c08913Rafael Espindola}
3711ba30bbe4e36a30a274da809a11a42f9cdc168e92Rafael Espindola
371238e317d6dce161b249508686cc67eb7176958762Chris Lattnervoid minix::Assemble::ConstructJob(Compilation &C, const JobAction &JA,
37132fe238ed293bd4bc27af9beb9fa151fad2146fa8Daniel Dunbar                                   const InputInfo &Output,
37142fe238ed293bd4bc27af9beb9fa151fad2146fa8Daniel Dunbar                                   const InputInfoList &Inputs,
37152fe238ed293bd4bc27af9beb9fa151fad2146fa8Daniel Dunbar                                   const ArgList &Args,
37162fe238ed293bd4bc27af9beb9fa151fad2146fa8Daniel Dunbar                                   const char *LinkingOutput) const {
371738e317d6dce161b249508686cc67eb7176958762Chris Lattner  ArgStringList CmdArgs;
371838e317d6dce161b249508686cc67eb7176958762Chris Lattner
371938e317d6dce161b249508686cc67eb7176958762Chris Lattner  Args.AddAllArgValues(CmdArgs, options::OPT_Wa_COMMA,
372038e317d6dce161b249508686cc67eb7176958762Chris Lattner                       options::OPT_Xassembler);
372138e317d6dce161b249508686cc67eb7176958762Chris Lattner
372238e317d6dce161b249508686cc67eb7176958762Chris Lattner  CmdArgs.push_back("-o");
37237c1e46533cae07216e2a67d5636a5afb44253155Daniel Dunbar  CmdArgs.push_back(Output.getFilename());
372438e317d6dce161b249508686cc67eb7176958762Chris Lattner
372538e317d6dce161b249508686cc67eb7176958762Chris Lattner  for (InputInfoList::const_iterator
372638e317d6dce161b249508686cc67eb7176958762Chris Lattner         it = Inputs.begin(), ie = Inputs.end(); it != ie; ++it) {
372738e317d6dce161b249508686cc67eb7176958762Chris Lattner    const InputInfo &II = *it;
37287c1e46533cae07216e2a67d5636a5afb44253155Daniel Dunbar    CmdArgs.push_back(II.getFilename());
372938e317d6dce161b249508686cc67eb7176958762Chris Lattner  }
373038e317d6dce161b249508686cc67eb7176958762Chris Lattner
373138e317d6dce161b249508686cc67eb7176958762Chris Lattner  const char *Exec =
37324a7e88978cf646ad10d654020cb00b3877069210Daniel Dunbar    Args.MakeArgString(getToolChain().GetProgramPath("gas"));
37332fe238ed293bd4bc27af9beb9fa151fad2146fa8Daniel Dunbar  C.addCommand(new Command(JA, *this, Exec, CmdArgs));
373438e317d6dce161b249508686cc67eb7176958762Chris Lattner}
373538e317d6dce161b249508686cc67eb7176958762Chris Lattner
373638e317d6dce161b249508686cc67eb7176958762Chris Lattnervoid minix::Link::ConstructJob(Compilation &C, const JobAction &JA,
37372fe238ed293bd4bc27af9beb9fa151fad2146fa8Daniel Dunbar                               const InputInfo &Output,
37382fe238ed293bd4bc27af9beb9fa151fad2146fa8Daniel Dunbar                               const InputInfoList &Inputs,
37392fe238ed293bd4bc27af9beb9fa151fad2146fa8Daniel Dunbar                               const ArgList &Args,
37402fe238ed293bd4bc27af9beb9fa151fad2146fa8Daniel Dunbar                               const char *LinkingOutput) const {
374138e317d6dce161b249508686cc67eb7176958762Chris Lattner  const Driver &D = getToolChain().getDriver();
374238e317d6dce161b249508686cc67eb7176958762Chris Lattner  ArgStringList CmdArgs;
374338e317d6dce161b249508686cc67eb7176958762Chris Lattner
37447c1e46533cae07216e2a67d5636a5afb44253155Daniel Dunbar  if (Output.isFilename()) {
374538e317d6dce161b249508686cc67eb7176958762Chris Lattner    CmdArgs.push_back("-o");
374638e317d6dce161b249508686cc67eb7176958762Chris Lattner    CmdArgs.push_back(Output.getFilename());
374738e317d6dce161b249508686cc67eb7176958762Chris Lattner  } else {
374838e317d6dce161b249508686cc67eb7176958762Chris Lattner    assert(Output.isNothing() && "Invalid output.");
374938e317d6dce161b249508686cc67eb7176958762Chris Lattner  }
375038e317d6dce161b249508686cc67eb7176958762Chris Lattner
375138e317d6dce161b249508686cc67eb7176958762Chris Lattner  if (!Args.hasArg(options::OPT_nostdlib) &&
375238e317d6dce161b249508686cc67eb7176958762Chris Lattner      !Args.hasArg(options::OPT_nostartfiles))
37534a7e88978cf646ad10d654020cb00b3877069210Daniel Dunbar    CmdArgs.push_back(Args.MakeArgString(getToolChain().GetFilePath(
375438e317d6dce161b249508686cc67eb7176958762Chris Lattner                                                      "/usr/gnu/lib/crtso.o")));
375538e317d6dce161b249508686cc67eb7176958762Chris Lattner
375638e317d6dce161b249508686cc67eb7176958762Chris Lattner  Args.AddAllArgs(CmdArgs, options::OPT_L);
375738e317d6dce161b249508686cc67eb7176958762Chris Lattner  Args.AddAllArgs(CmdArgs, options::OPT_T_Group);
375838e317d6dce161b249508686cc67eb7176958762Chris Lattner  Args.AddAllArgs(CmdArgs, options::OPT_e);
375938e317d6dce161b249508686cc67eb7176958762Chris Lattner
37602008feead855f08500fb01ff43ef5eebee05d1e5Daniel Dunbar  AddLinkerInputs(getToolChain(), Inputs, Args, CmdArgs);
376138e317d6dce161b249508686cc67eb7176958762Chris Lattner
376238e317d6dce161b249508686cc67eb7176958762Chris Lattner  if (!Args.hasArg(options::OPT_nostdlib) &&
376338e317d6dce161b249508686cc67eb7176958762Chris Lattner      !Args.hasArg(options::OPT_nodefaultlibs)) {
376438e317d6dce161b249508686cc67eb7176958762Chris Lattner    if (D.CCCIsCXX) {
3765132e35d2f87895d20e7ea146c8c00404b80221a1Daniel Dunbar      getToolChain().AddCXXStdlibLibArgs(Args, CmdArgs);
376638e317d6dce161b249508686cc67eb7176958762Chris Lattner      CmdArgs.push_back("-lm");
376738e317d6dce161b249508686cc67eb7176958762Chris Lattner    }
376838e317d6dce161b249508686cc67eb7176958762Chris Lattner
376938e317d6dce161b249508686cc67eb7176958762Chris Lattner    if (Args.hasArg(options::OPT_pthread))
377038e317d6dce161b249508686cc67eb7176958762Chris Lattner      CmdArgs.push_back("-lpthread");
377138e317d6dce161b249508686cc67eb7176958762Chris Lattner    CmdArgs.push_back("-lc");
377238e317d6dce161b249508686cc67eb7176958762Chris Lattner    CmdArgs.push_back("-lgcc");
377338e317d6dce161b249508686cc67eb7176958762Chris Lattner    CmdArgs.push_back("-L/usr/gnu/lib");
377438e317d6dce161b249508686cc67eb7176958762Chris Lattner    // FIXME: fill in the correct search path for the final
377538e317d6dce161b249508686cc67eb7176958762Chris Lattner    // support libraries.
377638e317d6dce161b249508686cc67eb7176958762Chris Lattner    CmdArgs.push_back("-L/usr/gnu/lib/gcc/i686-pc-minix/4.4.3");
377738e317d6dce161b249508686cc67eb7176958762Chris Lattner  }
377838e317d6dce161b249508686cc67eb7176958762Chris Lattner
377938e317d6dce161b249508686cc67eb7176958762Chris Lattner  if (!Args.hasArg(options::OPT_nostdlib) &&
378038e317d6dce161b249508686cc67eb7176958762Chris Lattner      !Args.hasArg(options::OPT_nostartfiles)) {
37814a7e88978cf646ad10d654020cb00b3877069210Daniel Dunbar    CmdArgs.push_back(Args.MakeArgString(getToolChain().GetFilePath(
378238e317d6dce161b249508686cc67eb7176958762Chris Lattner                                              "/usr/gnu/lib/libend.a")));
378338e317d6dce161b249508686cc67eb7176958762Chris Lattner  }
378438e317d6dce161b249508686cc67eb7176958762Chris Lattner
378538e317d6dce161b249508686cc67eb7176958762Chris Lattner  const char *Exec =
37864a7e88978cf646ad10d654020cb00b3877069210Daniel Dunbar    Args.MakeArgString(getToolChain().GetProgramPath("/usr/gnu/bin/gld"));
37872fe238ed293bd4bc27af9beb9fa151fad2146fa8Daniel Dunbar  C.addCommand(new Command(JA, *this, Exec, CmdArgs));
378838e317d6dce161b249508686cc67eb7176958762Chris Lattner}
378938e317d6dce161b249508686cc67eb7176958762Chris Lattner
379011e1b40d759a643086f590f6ffbd9d68360bad46Daniel Dunbar/// DragonFly Tools
379111e1b40d759a643086f590f6ffbd9d68360bad46Daniel Dunbar
379211e1b40d759a643086f590f6ffbd9d68360bad46Daniel Dunbar// For now, DragonFly Assemble does just about the same as for
379311e1b40d759a643086f590f6ffbd9d68360bad46Daniel Dunbar// FreeBSD, but this may change soon.
379411e1b40d759a643086f590f6ffbd9d68360bad46Daniel Dunbarvoid dragonfly::Assemble::ConstructJob(Compilation &C, const JobAction &JA,
37952fe238ed293bd4bc27af9beb9fa151fad2146fa8Daniel Dunbar                                       const InputInfo &Output,
3796294691eb1caf551083acd7b08630ef21c3fd760dDaniel Dunbar                                       const InputInfoList &Inputs,
3797294691eb1caf551083acd7b08630ef21c3fd760dDaniel Dunbar                                       const ArgList &Args,
3798294691eb1caf551083acd7b08630ef21c3fd760dDaniel Dunbar                                       const char *LinkingOutput) const {
379911e1b40d759a643086f590f6ffbd9d68360bad46Daniel Dunbar  ArgStringList CmdArgs;
380011e1b40d759a643086f590f6ffbd9d68360bad46Daniel Dunbar
380111e1b40d759a643086f590f6ffbd9d68360bad46Daniel Dunbar  // When building 32-bit code on DragonFly/pc64, we have to explicitly
380211e1b40d759a643086f590f6ffbd9d68360bad46Daniel Dunbar  // instruct as in the base system to assemble 32-bit code.
380311e1b40d759a643086f590f6ffbd9d68360bad46Daniel Dunbar  if (getToolChain().getArchName() == "i386")
380411e1b40d759a643086f590f6ffbd9d68360bad46Daniel Dunbar    CmdArgs.push_back("--32");
380511e1b40d759a643086f590f6ffbd9d68360bad46Daniel Dunbar
380611e1b40d759a643086f590f6ffbd9d68360bad46Daniel Dunbar  Args.AddAllArgValues(CmdArgs, options::OPT_Wa_COMMA,
380711e1b40d759a643086f590f6ffbd9d68360bad46Daniel Dunbar                       options::OPT_Xassembler);
380811e1b40d759a643086f590f6ffbd9d68360bad46Daniel Dunbar
380911e1b40d759a643086f590f6ffbd9d68360bad46Daniel Dunbar  CmdArgs.push_back("-o");
38107c1e46533cae07216e2a67d5636a5afb44253155Daniel Dunbar  CmdArgs.push_back(Output.getFilename());
381111e1b40d759a643086f590f6ffbd9d68360bad46Daniel Dunbar
381211e1b40d759a643086f590f6ffbd9d68360bad46Daniel Dunbar  for (InputInfoList::const_iterator
381311e1b40d759a643086f590f6ffbd9d68360bad46Daniel Dunbar         it = Inputs.begin(), ie = Inputs.end(); it != ie; ++it) {
381411e1b40d759a643086f590f6ffbd9d68360bad46Daniel Dunbar    const InputInfo &II = *it;
38157c1e46533cae07216e2a67d5636a5afb44253155Daniel Dunbar    CmdArgs.push_back(II.getFilename());
381611e1b40d759a643086f590f6ffbd9d68360bad46Daniel Dunbar  }
381711e1b40d759a643086f590f6ffbd9d68360bad46Daniel Dunbar
381811e1b40d759a643086f590f6ffbd9d68360bad46Daniel Dunbar  const char *Exec =
38194a7e88978cf646ad10d654020cb00b3877069210Daniel Dunbar    Args.MakeArgString(getToolChain().GetProgramPath("as"));
38202fe238ed293bd4bc27af9beb9fa151fad2146fa8Daniel Dunbar  C.addCommand(new Command(JA, *this, Exec, CmdArgs));
382111e1b40d759a643086f590f6ffbd9d68360bad46Daniel Dunbar}
382211e1b40d759a643086f590f6ffbd9d68360bad46Daniel Dunbar
382311e1b40d759a643086f590f6ffbd9d68360bad46Daniel Dunbarvoid dragonfly::Link::ConstructJob(Compilation &C, const JobAction &JA,
38242fe238ed293bd4bc27af9beb9fa151fad2146fa8Daniel Dunbar                                   const InputInfo &Output,
38252fe238ed293bd4bc27af9beb9fa151fad2146fa8Daniel Dunbar                                   const InputInfoList &Inputs,
38262fe238ed293bd4bc27af9beb9fa151fad2146fa8Daniel Dunbar                                   const ArgList &Args,
38272fe238ed293bd4bc27af9beb9fa151fad2146fa8Daniel Dunbar                                   const char *LinkingOutput) const {
3828ee788e70fcd0adf76103b17c78ac658d4ea30c9bDaniel Dunbar  const Driver &D = getToolChain().getDriver();
382911e1b40d759a643086f590f6ffbd9d68360bad46Daniel Dunbar  ArgStringList CmdArgs;
383011e1b40d759a643086f590f6ffbd9d68360bad46Daniel Dunbar
383111e1b40d759a643086f590f6ffbd9d68360bad46Daniel Dunbar  if (Args.hasArg(options::OPT_static)) {
383211e1b40d759a643086f590f6ffbd9d68360bad46Daniel Dunbar    CmdArgs.push_back("-Bstatic");
383311e1b40d759a643086f590f6ffbd9d68360bad46Daniel Dunbar  } else {
383411e1b40d759a643086f590f6ffbd9d68360bad46Daniel Dunbar    if (Args.hasArg(options::OPT_shared))
383511e1b40d759a643086f590f6ffbd9d68360bad46Daniel Dunbar      CmdArgs.push_back("-Bshareable");
383611e1b40d759a643086f590f6ffbd9d68360bad46Daniel Dunbar    else {
383711e1b40d759a643086f590f6ffbd9d68360bad46Daniel Dunbar      CmdArgs.push_back("-dynamic-linker");
383811e1b40d759a643086f590f6ffbd9d68360bad46Daniel Dunbar      CmdArgs.push_back("/usr/libexec/ld-elf.so.2");
383911e1b40d759a643086f590f6ffbd9d68360bad46Daniel Dunbar    }
384011e1b40d759a643086f590f6ffbd9d68360bad46Daniel Dunbar  }
384111e1b40d759a643086f590f6ffbd9d68360bad46Daniel Dunbar
384211e1b40d759a643086f590f6ffbd9d68360bad46Daniel Dunbar  // When building 32-bit code on DragonFly/pc64, we have to explicitly
384311e1b40d759a643086f590f6ffbd9d68360bad46Daniel Dunbar  // instruct ld in the base system to link 32-bit code.
384411e1b40d759a643086f590f6ffbd9d68360bad46Daniel Dunbar  if (getToolChain().getArchName() == "i386") {
384511e1b40d759a643086f590f6ffbd9d68360bad46Daniel Dunbar    CmdArgs.push_back("-m");
384611e1b40d759a643086f590f6ffbd9d68360bad46Daniel Dunbar    CmdArgs.push_back("elf_i386");
384711e1b40d759a643086f590f6ffbd9d68360bad46Daniel Dunbar  }
384811e1b40d759a643086f590f6ffbd9d68360bad46Daniel Dunbar
38497c1e46533cae07216e2a67d5636a5afb44253155Daniel Dunbar  if (Output.isFilename()) {
385011e1b40d759a643086f590f6ffbd9d68360bad46Daniel Dunbar    CmdArgs.push_back("-o");
385111e1b40d759a643086f590f6ffbd9d68360bad46Daniel Dunbar    CmdArgs.push_back(Output.getFilename());
385211e1b40d759a643086f590f6ffbd9d68360bad46Daniel Dunbar  } else {
385311e1b40d759a643086f590f6ffbd9d68360bad46Daniel Dunbar    assert(Output.isNothing() && "Invalid output.");
385411e1b40d759a643086f590f6ffbd9d68360bad46Daniel Dunbar  }
385511e1b40d759a643086f590f6ffbd9d68360bad46Daniel Dunbar
385611e1b40d759a643086f590f6ffbd9d68360bad46Daniel Dunbar  if (!Args.hasArg(options::OPT_nostdlib) &&
385711e1b40d759a643086f590f6ffbd9d68360bad46Daniel Dunbar      !Args.hasArg(options::OPT_nostartfiles)) {
385811e1b40d759a643086f590f6ffbd9d68360bad46Daniel Dunbar    if (!Args.hasArg(options::OPT_shared)) {
385938e317d6dce161b249508686cc67eb7176958762Chris Lattner      CmdArgs.push_back(
38604a7e88978cf646ad10d654020cb00b3877069210Daniel Dunbar            Args.MakeArgString(getToolChain().GetFilePath("crt1.o")));
386138e317d6dce161b249508686cc67eb7176958762Chris Lattner      CmdArgs.push_back(
38624a7e88978cf646ad10d654020cb00b3877069210Daniel Dunbar            Args.MakeArgString(getToolChain().GetFilePath("crti.o")));
386338e317d6dce161b249508686cc67eb7176958762Chris Lattner      CmdArgs.push_back(
38644a7e88978cf646ad10d654020cb00b3877069210Daniel Dunbar            Args.MakeArgString(getToolChain().GetFilePath("crtbegin.o")));
386511e1b40d759a643086f590f6ffbd9d68360bad46Daniel Dunbar    } else {
386638e317d6dce161b249508686cc67eb7176958762Chris Lattner      CmdArgs.push_back(
38674a7e88978cf646ad10d654020cb00b3877069210Daniel Dunbar            Args.MakeArgString(getToolChain().GetFilePath("crti.o")));
386838e317d6dce161b249508686cc67eb7176958762Chris Lattner      CmdArgs.push_back(
38694a7e88978cf646ad10d654020cb00b3877069210Daniel Dunbar            Args.MakeArgString(getToolChain().GetFilePath("crtbeginS.o")));
387011e1b40d759a643086f590f6ffbd9d68360bad46Daniel Dunbar    }
387111e1b40d759a643086f590f6ffbd9d68360bad46Daniel Dunbar  }
387211e1b40d759a643086f590f6ffbd9d68360bad46Daniel Dunbar
387311e1b40d759a643086f590f6ffbd9d68360bad46Daniel Dunbar  Args.AddAllArgs(CmdArgs, options::OPT_L);
387411e1b40d759a643086f590f6ffbd9d68360bad46Daniel Dunbar  Args.AddAllArgs(CmdArgs, options::OPT_T_Group);
387511e1b40d759a643086f590f6ffbd9d68360bad46Daniel Dunbar  Args.AddAllArgs(CmdArgs, options::OPT_e);
387611e1b40d759a643086f590f6ffbd9d68360bad46Daniel Dunbar
38772008feead855f08500fb01ff43ef5eebee05d1e5Daniel Dunbar  AddLinkerInputs(getToolChain(), Inputs, Args, CmdArgs);
387811e1b40d759a643086f590f6ffbd9d68360bad46Daniel Dunbar
387911e1b40d759a643086f590f6ffbd9d68360bad46Daniel Dunbar  if (!Args.hasArg(options::OPT_nostdlib) &&
388011e1b40d759a643086f590f6ffbd9d68360bad46Daniel Dunbar      !Args.hasArg(options::OPT_nodefaultlibs)) {
388111e1b40d759a643086f590f6ffbd9d68360bad46Daniel Dunbar    // FIXME: GCC passes on -lgcc, -lgcc_pic and a whole lot of
388211e1b40d759a643086f590f6ffbd9d68360bad46Daniel Dunbar    //         rpaths
388311e1b40d759a643086f590f6ffbd9d68360bad46Daniel Dunbar    CmdArgs.push_back("-L/usr/lib/gcc41");
388411e1b40d759a643086f590f6ffbd9d68360bad46Daniel Dunbar
388511e1b40d759a643086f590f6ffbd9d68360bad46Daniel Dunbar    if (!Args.hasArg(options::OPT_static)) {
388611e1b40d759a643086f590f6ffbd9d68360bad46Daniel Dunbar      CmdArgs.push_back("-rpath");
388711e1b40d759a643086f590f6ffbd9d68360bad46Daniel Dunbar      CmdArgs.push_back("/usr/lib/gcc41");
388811e1b40d759a643086f590f6ffbd9d68360bad46Daniel Dunbar
388911e1b40d759a643086f590f6ffbd9d68360bad46Daniel Dunbar      CmdArgs.push_back("-rpath-link");
389011e1b40d759a643086f590f6ffbd9d68360bad46Daniel Dunbar      CmdArgs.push_back("/usr/lib/gcc41");
389111e1b40d759a643086f590f6ffbd9d68360bad46Daniel Dunbar
389211e1b40d759a643086f590f6ffbd9d68360bad46Daniel Dunbar      CmdArgs.push_back("-rpath");
389311e1b40d759a643086f590f6ffbd9d68360bad46Daniel Dunbar      CmdArgs.push_back("/usr/lib");
389411e1b40d759a643086f590f6ffbd9d68360bad46Daniel Dunbar
389511e1b40d759a643086f590f6ffbd9d68360bad46Daniel Dunbar      CmdArgs.push_back("-rpath-link");
389611e1b40d759a643086f590f6ffbd9d68360bad46Daniel Dunbar      CmdArgs.push_back("/usr/lib");
389711e1b40d759a643086f590f6ffbd9d68360bad46Daniel Dunbar    }
389811e1b40d759a643086f590f6ffbd9d68360bad46Daniel Dunbar
3899405861d4ae824795f506d03cd7578f011cbf5b87Rafael Espindola    if (D.CCCIsCXX) {
3900132e35d2f87895d20e7ea146c8c00404b80221a1Daniel Dunbar      getToolChain().AddCXXStdlibLibArgs(Args, CmdArgs);
3901405861d4ae824795f506d03cd7578f011cbf5b87Rafael Espindola      CmdArgs.push_back("-lm");
3902405861d4ae824795f506d03cd7578f011cbf5b87Rafael Espindola    }
3903405861d4ae824795f506d03cd7578f011cbf5b87Rafael Espindola
390411e1b40d759a643086f590f6ffbd9d68360bad46Daniel Dunbar    if (Args.hasArg(options::OPT_shared)) {
390511e1b40d759a643086f590f6ffbd9d68360bad46Daniel Dunbar      CmdArgs.push_back("-lgcc_pic");
390611e1b40d759a643086f590f6ffbd9d68360bad46Daniel Dunbar    } else {
390711e1b40d759a643086f590f6ffbd9d68360bad46Daniel Dunbar      CmdArgs.push_back("-lgcc");
390811e1b40d759a643086f590f6ffbd9d68360bad46Daniel Dunbar    }
390911e1b40d759a643086f590f6ffbd9d68360bad46Daniel Dunbar
391011e1b40d759a643086f590f6ffbd9d68360bad46Daniel Dunbar
391111e1b40d759a643086f590f6ffbd9d68360bad46Daniel Dunbar    if (Args.hasArg(options::OPT_pthread))
39124d63f8bc2686d5d7580324407854f2ca7c128832Mike Stump      CmdArgs.push_back("-lpthread");
391311e1b40d759a643086f590f6ffbd9d68360bad46Daniel Dunbar
391411e1b40d759a643086f590f6ffbd9d68360bad46Daniel Dunbar    if (!Args.hasArg(options::OPT_nolibc)) {
391511e1b40d759a643086f590f6ffbd9d68360bad46Daniel Dunbar      CmdArgs.push_back("-lc");
391611e1b40d759a643086f590f6ffbd9d68360bad46Daniel Dunbar    }
391711e1b40d759a643086f590f6ffbd9d68360bad46Daniel Dunbar
391811e1b40d759a643086f590f6ffbd9d68360bad46Daniel Dunbar    if (Args.hasArg(options::OPT_shared)) {
391911e1b40d759a643086f590f6ffbd9d68360bad46Daniel Dunbar      CmdArgs.push_back("-lgcc_pic");
392011e1b40d759a643086f590f6ffbd9d68360bad46Daniel Dunbar    } else {
392111e1b40d759a643086f590f6ffbd9d68360bad46Daniel Dunbar      CmdArgs.push_back("-lgcc");
392211e1b40d759a643086f590f6ffbd9d68360bad46Daniel Dunbar    }
392311e1b40d759a643086f590f6ffbd9d68360bad46Daniel Dunbar  }
392411e1b40d759a643086f590f6ffbd9d68360bad46Daniel Dunbar
392511e1b40d759a643086f590f6ffbd9d68360bad46Daniel Dunbar  if (!Args.hasArg(options::OPT_nostdlib) &&
392611e1b40d759a643086f590f6ffbd9d68360bad46Daniel Dunbar      !Args.hasArg(options::OPT_nostartfiles)) {
392711e1b40d759a643086f590f6ffbd9d68360bad46Daniel Dunbar    if (!Args.hasArg(options::OPT_shared))
392838e317d6dce161b249508686cc67eb7176958762Chris Lattner      CmdArgs.push_back(Args.MakeArgString(
39294a7e88978cf646ad10d654020cb00b3877069210Daniel Dunbar                              getToolChain().GetFilePath("crtend.o")));
393011e1b40d759a643086f590f6ffbd9d68360bad46Daniel Dunbar    else
393138e317d6dce161b249508686cc67eb7176958762Chris Lattner      CmdArgs.push_back(Args.MakeArgString(
39324a7e88978cf646ad10d654020cb00b3877069210Daniel Dunbar                              getToolChain().GetFilePath("crtendS.o")));
393338e317d6dce161b249508686cc67eb7176958762Chris Lattner    CmdArgs.push_back(Args.MakeArgString(
39344a7e88978cf646ad10d654020cb00b3877069210Daniel Dunbar                              getToolChain().GetFilePath("crtn.o")));
393511e1b40d759a643086f590f6ffbd9d68360bad46Daniel Dunbar  }
393611e1b40d759a643086f590f6ffbd9d68360bad46Daniel Dunbar
393711e1b40d759a643086f590f6ffbd9d68360bad46Daniel Dunbar  const char *Exec =
39384a7e88978cf646ad10d654020cb00b3877069210Daniel Dunbar    Args.MakeArgString(getToolChain().GetProgramPath("ld"));
39392fe238ed293bd4bc27af9beb9fa151fad2146fa8Daniel Dunbar  C.addCommand(new Command(JA, *this, Exec, CmdArgs));
394011e1b40d759a643086f590f6ffbd9d68360bad46Daniel Dunbar}
3941ff58e3610f4e12094def69eb2d6dcb4330378d8fMichael J. Spencer
3942ff58e3610f4e12094def69eb2d6dcb4330378d8fMichael J. Spencervoid visualstudio::Link::ConstructJob(Compilation &C, const JobAction &JA,
3943ff58e3610f4e12094def69eb2d6dcb4330378d8fMichael J. Spencer                                      const InputInfo &Output,
3944ff58e3610f4e12094def69eb2d6dcb4330378d8fMichael J. Spencer                                      const InputInfoList &Inputs,
3945ff58e3610f4e12094def69eb2d6dcb4330378d8fMichael J. Spencer                                      const ArgList &Args,
3946ff58e3610f4e12094def69eb2d6dcb4330378d8fMichael J. Spencer                                      const char *LinkingOutput) const {
3947ff58e3610f4e12094def69eb2d6dcb4330378d8fMichael J. Spencer  ArgStringList CmdArgs;
3948ff58e3610f4e12094def69eb2d6dcb4330378d8fMichael J. Spencer
3949ff58e3610f4e12094def69eb2d6dcb4330378d8fMichael J. Spencer  if (Output.isFilename()) {
3950e5a37f48388c7e4cc081f44d13a4910bfa56cd35Daniel Dunbar    CmdArgs.push_back(Args.MakeArgString(std::string("-out:") +
3951e5a37f48388c7e4cc081f44d13a4910bfa56cd35Daniel Dunbar                                         Output.getFilename()));
3952ff58e3610f4e12094def69eb2d6dcb4330378d8fMichael J. Spencer  } else {
3953ff58e3610f4e12094def69eb2d6dcb4330378d8fMichael J. Spencer    assert(Output.isNothing() && "Invalid output.");
3954ff58e3610f4e12094def69eb2d6dcb4330378d8fMichael J. Spencer  }
3955ff58e3610f4e12094def69eb2d6dcb4330378d8fMichael J. Spencer
3956ff58e3610f4e12094def69eb2d6dcb4330378d8fMichael J. Spencer  if (!Args.hasArg(options::OPT_nostdlib) &&
3957ff58e3610f4e12094def69eb2d6dcb4330378d8fMichael J. Spencer    !Args.hasArg(options::OPT_nostartfiles)) {
3958ff58e3610f4e12094def69eb2d6dcb4330378d8fMichael J. Spencer    CmdArgs.push_back("-defaultlib:libcmt");
3959ff58e3610f4e12094def69eb2d6dcb4330378d8fMichael J. Spencer  }
3960ff58e3610f4e12094def69eb2d6dcb4330378d8fMichael J. Spencer
3961ff58e3610f4e12094def69eb2d6dcb4330378d8fMichael J. Spencer  CmdArgs.push_back("-nologo");
3962ff58e3610f4e12094def69eb2d6dcb4330378d8fMichael J. Spencer
39632008feead855f08500fb01ff43ef5eebee05d1e5Daniel Dunbar  AddLinkerInputs(getToolChain(), Inputs, Args, CmdArgs);
3964ff58e3610f4e12094def69eb2d6dcb4330378d8fMichael J. Spencer
3965ff58e3610f4e12094def69eb2d6dcb4330378d8fMichael J. Spencer  const char *Exec =
39662008feead855f08500fb01ff43ef5eebee05d1e5Daniel Dunbar    Args.MakeArgString(getToolChain().GetProgramPath("link.exe"));
3967ff58e3610f4e12094def69eb2d6dcb4330378d8fMichael J. Spencer  C.addCommand(new Command(JA, *this, Exec, CmdArgs));
3968ff58e3610f4e12094def69eb2d6dcb4330378d8fMichael J. Spencer}
3969