Tools.cpp revision 32579cf507d088e776b67327c5d6bc46e1f217cc
147ac7d27c44bd64a7d0fc03d4babc196cf2b8230Daniel Dunbar//===--- 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"
2802633b541b04ad5ffc1c70f4c2feeeb13e607057Daniel Dunbar#include "llvm/Support/Format.h"
2902633b541b04ad5ffc1c70f4c2feeeb13e607057Daniel Dunbar#include "llvm/Support/raw_ostream.h"
30f86feddbd5b13d2c144132e35d608fa630784dbbDaniel Dunbar#include "llvm/System/Host.h"
3155efe142a84b2aab6d0186c20a311c347a65f794Daniel Dunbar#include "llvm/System/Process.h"
32871adcf4e41285e3f4c3b62eaa1b2e05b60b92daDaniel Dunbar
33871adcf4e41285e3f4c3b62eaa1b2e05b60b92daDaniel Dunbar#include "InputInfo.h"
3402633b541b04ad5ffc1c70f4c2feeeb13e607057Daniel Dunbar#include "ToolChains.h"
35871adcf4e41285e3f4c3b62eaa1b2e05b60b92daDaniel Dunbar
3647ac7d27c44bd64a7d0fc03d4babc196cf2b8230Daniel Dunbarusing namespace clang::driver;
3747ac7d27c44bd64a7d0fc03d4babc196cf2b8230Daniel Dunbarusing namespace clang::driver::tools;
3847ac7d27c44bd64a7d0fc03d4babc196cf2b8230Daniel Dunbar
3988a3d6cf5ebab81614f89ba48a8d89023270637aDaniel Dunbar/// CheckPreprocessingOptions - Perform some validation of preprocessing
4088a3d6cf5ebab81614f89ba48a8d89023270637aDaniel Dunbar/// arguments that is shared with gcc.
4188a3d6cf5ebab81614f89ba48a8d89023270637aDaniel Dunbarstatic void CheckPreprocessingOptions(const Driver &D, const ArgList &Args) {
4288a3d6cf5ebab81614f89ba48a8d89023270637aDaniel Dunbar  if (Arg *A = Args.getLastArg(options::OPT_C, options::OPT_CC))
4388a3d6cf5ebab81614f89ba48a8d89023270637aDaniel Dunbar    if (!Args.hasArg(options::OPT_E))
4488a3d6cf5ebab81614f89ba48a8d89023270637aDaniel Dunbar      D.Diag(clang::diag::err_drv_argument_only_allowed_with)
4588a3d6cf5ebab81614f89ba48a8d89023270637aDaniel Dunbar        << A->getAsString(Args) << "-E";
4688a3d6cf5ebab81614f89ba48a8d89023270637aDaniel Dunbar}
4788a3d6cf5ebab81614f89ba48a8d89023270637aDaniel Dunbar
48e2fd66418eca3d70cf6b62087d745d0c5181db69Daniel Dunbar/// CheckCodeGenerationOptions - Perform some validation of code generation
49e2fd66418eca3d70cf6b62087d745d0c5181db69Daniel Dunbar/// arguments that is shared with gcc.
50e2fd66418eca3d70cf6b62087d745d0c5181db69Daniel Dunbarstatic void CheckCodeGenerationOptions(const Driver &D, const ArgList &Args) {
51e2fd66418eca3d70cf6b62087d745d0c5181db69Daniel Dunbar  // In gcc, only ARM checks this, but it seems reasonable to check universally.
52e2fd66418eca3d70cf6b62087d745d0c5181db69Daniel Dunbar  if (Args.hasArg(options::OPT_static))
53e2fd66418eca3d70cf6b62087d745d0c5181db69Daniel Dunbar    if (const Arg *A = Args.getLastArg(options::OPT_dynamic,
54e2fd66418eca3d70cf6b62087d745d0c5181db69Daniel Dunbar                                       options::OPT_mdynamic_no_pic))
55e2fd66418eca3d70cf6b62087d745d0c5181db69Daniel Dunbar      D.Diag(clang::diag::err_drv_argument_not_allowed_with)
56e2fd66418eca3d70cf6b62087d745d0c5181db69Daniel Dunbar        << A->getAsString(Args) << "-static";
57e2fd66418eca3d70cf6b62087d745d0c5181db69Daniel Dunbar}
58e2fd66418eca3d70cf6b62087d745d0c5181db69Daniel Dunbar
593edbeb78fe5ea7fffea7a94575478cde19e830e0Chris Lattner// Quote target names for inclusion in GNU Make dependency files.
603edbeb78fe5ea7fffea7a94575478cde19e830e0Chris Lattner// Only the characters '$', '#', ' ', '\t' are quoted.
613edbeb78fe5ea7fffea7a94575478cde19e830e0Chris Lattnerstatic void QuoteTarget(llvm::StringRef Target,
623edbeb78fe5ea7fffea7a94575478cde19e830e0Chris Lattner                        llvm::SmallVectorImpl<char> &Res) {
633edbeb78fe5ea7fffea7a94575478cde19e830e0Chris Lattner  for (unsigned i = 0, e = Target.size(); i != e; ++i) {
643edbeb78fe5ea7fffea7a94575478cde19e830e0Chris Lattner    switch (Target[i]) {
653edbeb78fe5ea7fffea7a94575478cde19e830e0Chris Lattner    case ' ':
663edbeb78fe5ea7fffea7a94575478cde19e830e0Chris Lattner    case '\t':
673edbeb78fe5ea7fffea7a94575478cde19e830e0Chris Lattner      // Escape the preceding backslashes
683edbeb78fe5ea7fffea7a94575478cde19e830e0Chris Lattner      for (int j = i - 1; j >= 0 && Target[j] == '\\'; --j)
693edbeb78fe5ea7fffea7a94575478cde19e830e0Chris Lattner        Res.push_back('\\');
703edbeb78fe5ea7fffea7a94575478cde19e830e0Chris Lattner
713edbeb78fe5ea7fffea7a94575478cde19e830e0Chris Lattner      // Escape the space/tab
723edbeb78fe5ea7fffea7a94575478cde19e830e0Chris Lattner      Res.push_back('\\');
733edbeb78fe5ea7fffea7a94575478cde19e830e0Chris Lattner      break;
743edbeb78fe5ea7fffea7a94575478cde19e830e0Chris Lattner    case '$':
753edbeb78fe5ea7fffea7a94575478cde19e830e0Chris Lattner      Res.push_back('$');
763edbeb78fe5ea7fffea7a94575478cde19e830e0Chris Lattner      break;
773edbeb78fe5ea7fffea7a94575478cde19e830e0Chris Lattner    case '#':
783edbeb78fe5ea7fffea7a94575478cde19e830e0Chris Lattner      Res.push_back('\\');
793edbeb78fe5ea7fffea7a94575478cde19e830e0Chris Lattner      break;
803edbeb78fe5ea7fffea7a94575478cde19e830e0Chris Lattner    default:
813edbeb78fe5ea7fffea7a94575478cde19e830e0Chris Lattner      break;
823edbeb78fe5ea7fffea7a94575478cde19e830e0Chris Lattner    }
833edbeb78fe5ea7fffea7a94575478cde19e830e0Chris Lattner
843edbeb78fe5ea7fffea7a94575478cde19e830e0Chris Lattner    Res.push_back(Target[i]);
853edbeb78fe5ea7fffea7a94575478cde19e830e0Chris Lattner  }
863edbeb78fe5ea7fffea7a94575478cde19e830e0Chris Lattner}
873edbeb78fe5ea7fffea7a94575478cde19e830e0Chris Lattner
881eb4433ac451dc16f4133a88af2d002ac26c58efMike Stumpvoid Clang::AddPreprocessingOptions(const Driver &D,
89df91ef3d6c55692a0236f67b6c6b134a3bf84098Douglas Gregor                                    const ArgList &Args,
90c21c485b4fb58ef5d55cf3e523263dd824a2ace4Daniel Dunbar                                    ArgStringList &CmdArgs,
91c21c485b4fb58ef5d55cf3e523263dd824a2ace4Daniel Dunbar                                    const InputInfo &Output,
92c21c485b4fb58ef5d55cf3e523263dd824a2ace4Daniel Dunbar                                    const InputInfoList &Inputs) const {
93c21c485b4fb58ef5d55cf3e523263dd824a2ace4Daniel Dunbar  Arg *A;
943a183d3d46426d8719031553131b8928f50aa606Daniel Dunbar
9588a3d6cf5ebab81614f89ba48a8d89023270637aDaniel Dunbar  CheckPreprocessingOptions(D, Args);
9688a3d6cf5ebab81614f89ba48a8d89023270637aDaniel Dunbar
9788a3d6cf5ebab81614f89ba48a8d89023270637aDaniel Dunbar  Args.AddLastArg(CmdArgs, options::OPT_C);
9888a3d6cf5ebab81614f89ba48a8d89023270637aDaniel Dunbar  Args.AddLastArg(CmdArgs, options::OPT_CC);
993a183d3d46426d8719031553131b8928f50aa606Daniel Dunbar
1003a183d3d46426d8719031553131b8928f50aa606Daniel Dunbar  // Handle dependency file generation.
101c21c485b4fb58ef5d55cf3e523263dd824a2ace4Daniel Dunbar  if ((A = Args.getLastArg(options::OPT_M)) ||
102c21c485b4fb58ef5d55cf3e523263dd824a2ace4Daniel Dunbar      (A = Args.getLastArg(options::OPT_MM)) ||
103c21c485b4fb58ef5d55cf3e523263dd824a2ace4Daniel Dunbar      (A = Args.getLastArg(options::OPT_MD)) ||
104c21c485b4fb58ef5d55cf3e523263dd824a2ace4Daniel Dunbar      (A = Args.getLastArg(options::OPT_MMD))) {
105c21c485b4fb58ef5d55cf3e523263dd824a2ace4Daniel Dunbar    // Determine the output location.
106c21c485b4fb58ef5d55cf3e523263dd824a2ace4Daniel Dunbar    const char *DepFile;
107c21c485b4fb58ef5d55cf3e523263dd824a2ace4Daniel Dunbar    if (Output.getType() == types::TY_Dependencies) {
108c21c485b4fb58ef5d55cf3e523263dd824a2ace4Daniel Dunbar      if (Output.isPipe())
109c21c485b4fb58ef5d55cf3e523263dd824a2ace4Daniel Dunbar        DepFile = "-";
110c21c485b4fb58ef5d55cf3e523263dd824a2ace4Daniel Dunbar      else
111c21c485b4fb58ef5d55cf3e523263dd824a2ace4Daniel Dunbar        DepFile = Output.getFilename();
112c21c485b4fb58ef5d55cf3e523263dd824a2ace4Daniel Dunbar    } else if (Arg *MF = Args.getLastArg(options::OPT_MF)) {
113c21c485b4fb58ef5d55cf3e523263dd824a2ace4Daniel Dunbar      DepFile = MF->getValue(Args);
114b827a0541b5fd095fcdb7ad0c3df93ca158c619aDaniel Dunbar    } else if (A->getOption().matches(options::OPT_M) ||
115b827a0541b5fd095fcdb7ad0c3df93ca158c619aDaniel Dunbar               A->getOption().matches(options::OPT_MM)) {
116c21c485b4fb58ef5d55cf3e523263dd824a2ace4Daniel Dunbar      DepFile = "-";
117c21c485b4fb58ef5d55cf3e523263dd824a2ace4Daniel Dunbar    } else {
118c21c485b4fb58ef5d55cf3e523263dd824a2ace4Daniel Dunbar      DepFile = darwin::CC1::getDependencyFileName(Args, Inputs);
119c21c485b4fb58ef5d55cf3e523263dd824a2ace4Daniel Dunbar    }
120c21c485b4fb58ef5d55cf3e523263dd824a2ace4Daniel Dunbar    CmdArgs.push_back("-dependency-file");
121c21c485b4fb58ef5d55cf3e523263dd824a2ace4Daniel Dunbar    CmdArgs.push_back(DepFile);
122c21c485b4fb58ef5d55cf3e523263dd824a2ace4Daniel Dunbar
1233edbeb78fe5ea7fffea7a94575478cde19e830e0Chris Lattner    // Add a default target if one wasn't specified.
124c21c485b4fb58ef5d55cf3e523263dd824a2ace4Daniel Dunbar    if (!Args.hasArg(options::OPT_MT) && !Args.hasArg(options::OPT_MQ)) {
125c21c485b4fb58ef5d55cf3e523263dd824a2ace4Daniel Dunbar      const char *DepTarget;
126c21c485b4fb58ef5d55cf3e523263dd824a2ace4Daniel Dunbar
127c21c485b4fb58ef5d55cf3e523263dd824a2ace4Daniel Dunbar      // If user provided -o, that is the dependency target, except
128c21c485b4fb58ef5d55cf3e523263dd824a2ace4Daniel Dunbar      // when we are only generating a dependency file.
129c21c485b4fb58ef5d55cf3e523263dd824a2ace4Daniel Dunbar      Arg *OutputOpt = Args.getLastArg(options::OPT_o);
130c21c485b4fb58ef5d55cf3e523263dd824a2ace4Daniel Dunbar      if (OutputOpt && Output.getType() != types::TY_Dependencies) {
131c21c485b4fb58ef5d55cf3e523263dd824a2ace4Daniel Dunbar        DepTarget = OutputOpt->getValue(Args);
132c21c485b4fb58ef5d55cf3e523263dd824a2ace4Daniel Dunbar      } else {
133c21c485b4fb58ef5d55cf3e523263dd824a2ace4Daniel Dunbar        // Otherwise derive from the base input.
134c21c485b4fb58ef5d55cf3e523263dd824a2ace4Daniel Dunbar        //
135c21c485b4fb58ef5d55cf3e523263dd824a2ace4Daniel Dunbar        // FIXME: This should use the computed output file location.
136c21c485b4fb58ef5d55cf3e523263dd824a2ace4Daniel Dunbar        llvm::sys::Path P(Inputs[0].getBaseInput());
137c21c485b4fb58ef5d55cf3e523263dd824a2ace4Daniel Dunbar
138c21c485b4fb58ef5d55cf3e523263dd824a2ace4Daniel Dunbar        P.eraseSuffix();
139c21c485b4fb58ef5d55cf3e523263dd824a2ace4Daniel Dunbar        P.appendSuffix("o");
140881376467c46c5c6cc16fa6790271c2c22e1d4f1Daniel Dunbar        DepTarget = Args.MakeArgString(P.getLast());
141c21c485b4fb58ef5d55cf3e523263dd824a2ace4Daniel Dunbar      }
142c21c485b4fb58ef5d55cf3e523263dd824a2ace4Daniel Dunbar
143c21c485b4fb58ef5d55cf3e523263dd824a2ace4Daniel Dunbar      CmdArgs.push_back("-MT");
1443edbeb78fe5ea7fffea7a94575478cde19e830e0Chris Lattner      llvm::SmallString<128> Quoted;
1453edbeb78fe5ea7fffea7a94575478cde19e830e0Chris Lattner      QuoteTarget(DepTarget, Quoted);
1463edbeb78fe5ea7fffea7a94575478cde19e830e0Chris Lattner      CmdArgs.push_back(Args.MakeArgString(Quoted));
147c21c485b4fb58ef5d55cf3e523263dd824a2ace4Daniel Dunbar    }
148c21c485b4fb58ef5d55cf3e523263dd824a2ace4Daniel Dunbar
149b827a0541b5fd095fcdb7ad0c3df93ca158c619aDaniel Dunbar    if (A->getOption().matches(options::OPT_M) ||
150b827a0541b5fd095fcdb7ad0c3df93ca158c619aDaniel Dunbar        A->getOption().matches(options::OPT_MD))
151c21c485b4fb58ef5d55cf3e523263dd824a2ace4Daniel Dunbar      CmdArgs.push_back("-sys-header-deps");
152c21c485b4fb58ef5d55cf3e523263dd824a2ace4Daniel Dunbar  }
153c21c485b4fb58ef5d55cf3e523263dd824a2ace4Daniel Dunbar
154c21c485b4fb58ef5d55cf3e523263dd824a2ace4Daniel Dunbar  Args.AddLastArg(CmdArgs, options::OPT_MP);
1553edbeb78fe5ea7fffea7a94575478cde19e830e0Chris Lattner
1563edbeb78fe5ea7fffea7a94575478cde19e830e0Chris Lattner  // Convert all -MQ <target> args to -MT <quoted target>
1573edbeb78fe5ea7fffea7a94575478cde19e830e0Chris Lattner  for (arg_iterator it = Args.filtered_begin(options::OPT_MT,
1583edbeb78fe5ea7fffea7a94575478cde19e830e0Chris Lattner                                             options::OPT_MQ),
1593edbeb78fe5ea7fffea7a94575478cde19e830e0Chris Lattner         ie = Args.filtered_end(); it != ie; ++it) {
1603edbeb78fe5ea7fffea7a94575478cde19e830e0Chris Lattner
1613edbeb78fe5ea7fffea7a94575478cde19e830e0Chris Lattner    it->claim();
1623edbeb78fe5ea7fffea7a94575478cde19e830e0Chris Lattner
1633edbeb78fe5ea7fffea7a94575478cde19e830e0Chris Lattner    if (it->getOption().matches(options::OPT_MQ)) {
1643edbeb78fe5ea7fffea7a94575478cde19e830e0Chris Lattner      CmdArgs.push_back("-MT");
1653edbeb78fe5ea7fffea7a94575478cde19e830e0Chris Lattner      llvm::SmallString<128> Quoted;
1663edbeb78fe5ea7fffea7a94575478cde19e830e0Chris Lattner      QuoteTarget(it->getValue(Args), Quoted);
1673edbeb78fe5ea7fffea7a94575478cde19e830e0Chris Lattner      CmdArgs.push_back(Args.MakeArgString(Quoted));
1683edbeb78fe5ea7fffea7a94575478cde19e830e0Chris Lattner
1693edbeb78fe5ea7fffea7a94575478cde19e830e0Chris Lattner    // -MT flag - no change
1703edbeb78fe5ea7fffea7a94575478cde19e830e0Chris Lattner    } else {
1713edbeb78fe5ea7fffea7a94575478cde19e830e0Chris Lattner      it->render(Args, CmdArgs);
1723edbeb78fe5ea7fffea7a94575478cde19e830e0Chris Lattner    }
1733edbeb78fe5ea7fffea7a94575478cde19e830e0Chris Lattner  }
174c21c485b4fb58ef5d55cf3e523263dd824a2ace4Daniel Dunbar
175df91ef3d6c55692a0236f67b6c6b134a3bf84098Douglas Gregor  // Add -i* options, and automatically translate to
176df91ef3d6c55692a0236f67b6c6b134a3bf84098Douglas Gregor  // -include-pch/-include-pth for transparent PCH support. It's
177df91ef3d6c55692a0236f67b6c6b134a3bf84098Douglas Gregor  // wonky, but we include looking for .gch so we can support seamless
178df91ef3d6c55692a0236f67b6c6b134a3bf84098Douglas Gregor  // replacement into a build system already set up to be generating
179df91ef3d6c55692a0236f67b6c6b134a3bf84098Douglas Gregor  // .gch files.
180cdd9686b890ebdc10039ae256ef4c9dfb5ebacb7Daniel Dunbar  for (arg_iterator it = Args.filtered_begin(options::OPT_clang_i_Group),
181cdd9686b890ebdc10039ae256ef4c9dfb5ebacb7Daniel Dunbar         ie = Args.filtered_end(); it != ie; ++it) {
182cdd9686b890ebdc10039ae256ef4c9dfb5ebacb7Daniel Dunbar    const Arg *A = it;
183c21c485b4fb58ef5d55cf3e523263dd824a2ace4Daniel Dunbar
184c21c485b4fb58ef5d55cf3e523263dd824a2ace4Daniel Dunbar    if (A->getOption().matches(options::OPT_include)) {
1850ebd9321ba380471010341f24c874f46f56e7581Daniel Dunbar      // Use PCH if the user requested it, except for C++ (for now).
1860ebd9321ba380471010341f24c874f46f56e7581Daniel Dunbar      bool UsePCH = D.CCCUsePCH;
1870ebd9321ba380471010341f24c874f46f56e7581Daniel Dunbar      if (types::isCXX(Inputs[0].getType()))
1880ebd9321ba380471010341f24c874f46f56e7581Daniel Dunbar        UsePCH = false;
1890ebd9321ba380471010341f24c874f46f56e7581Daniel Dunbar
190c21c485b4fb58ef5d55cf3e523263dd824a2ace4Daniel Dunbar      bool FoundPTH = false;
191df91ef3d6c55692a0236f67b6c6b134a3bf84098Douglas Gregor      bool FoundPCH = false;
192c21c485b4fb58ef5d55cf3e523263dd824a2ace4Daniel Dunbar      llvm::sys::Path P(A->getValue(Args));
1930ebd9321ba380471010341f24c874f46f56e7581Daniel Dunbar      if (UsePCH) {
194df91ef3d6c55692a0236f67b6c6b134a3bf84098Douglas Gregor        P.appendSuffix("pch");
195c21c485b4fb58ef5d55cf3e523263dd824a2ace4Daniel Dunbar        if (P.exists())
196df91ef3d6c55692a0236f67b6c6b134a3bf84098Douglas Gregor          FoundPCH = true;
1971eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump        else
198df91ef3d6c55692a0236f67b6c6b134a3bf84098Douglas Gregor          P.eraseSuffix();
199df91ef3d6c55692a0236f67b6c6b134a3bf84098Douglas Gregor      }
200df91ef3d6c55692a0236f67b6c6b134a3bf84098Douglas Gregor
201df91ef3d6c55692a0236f67b6c6b134a3bf84098Douglas Gregor      if (!FoundPCH) {
202df91ef3d6c55692a0236f67b6c6b134a3bf84098Douglas Gregor        P.appendSuffix("pth");
2031eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump        if (P.exists())
204c21c485b4fb58ef5d55cf3e523263dd824a2ace4Daniel Dunbar          FoundPTH = true;
205df91ef3d6c55692a0236f67b6c6b134a3bf84098Douglas Gregor        else
206df91ef3d6c55692a0236f67b6c6b134a3bf84098Douglas Gregor          P.eraseSuffix();
2071eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump      }
2081eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump
209df91ef3d6c55692a0236f67b6c6b134a3bf84098Douglas Gregor      if (!FoundPCH && !FoundPTH) {
210df91ef3d6c55692a0236f67b6c6b134a3bf84098Douglas Gregor        P.appendSuffix("gch");
211df91ef3d6c55692a0236f67b6c6b134a3bf84098Douglas Gregor        if (P.exists()) {
2120ebd9321ba380471010341f24c874f46f56e7581Daniel Dunbar          FoundPCH = UsePCH;
2130ebd9321ba380471010341f24c874f46f56e7581Daniel Dunbar          FoundPTH = !UsePCH;
214df91ef3d6c55692a0236f67b6c6b134a3bf84098Douglas Gregor        }
2151eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump        else
216df91ef3d6c55692a0236f67b6c6b134a3bf84098Douglas Gregor          P.eraseSuffix();
217c21c485b4fb58ef5d55cf3e523263dd824a2ace4Daniel Dunbar      }
218c21c485b4fb58ef5d55cf3e523263dd824a2ace4Daniel Dunbar
219df91ef3d6c55692a0236f67b6c6b134a3bf84098Douglas Gregor      if (FoundPCH || FoundPTH) {
220c21c485b4fb58ef5d55cf3e523263dd824a2ace4Daniel Dunbar        A->claim();
2210ebd9321ba380471010341f24c874f46f56e7581Daniel Dunbar        if (UsePCH)
222df91ef3d6c55692a0236f67b6c6b134a3bf84098Douglas Gregor          CmdArgs.push_back("-include-pch");
223df91ef3d6c55692a0236f67b6c6b134a3bf84098Douglas Gregor        else
224df91ef3d6c55692a0236f67b6c6b134a3bf84098Douglas Gregor          CmdArgs.push_back("-include-pth");
225881376467c46c5c6cc16fa6790271c2c22e1d4f1Daniel Dunbar        CmdArgs.push_back(Args.MakeArgString(P.str()));
226c21c485b4fb58ef5d55cf3e523263dd824a2ace4Daniel Dunbar        continue;
227c21c485b4fb58ef5d55cf3e523263dd824a2ace4Daniel Dunbar      }
228c21c485b4fb58ef5d55cf3e523263dd824a2ace4Daniel Dunbar    }
229c21c485b4fb58ef5d55cf3e523263dd824a2ace4Daniel Dunbar
230c21c485b4fb58ef5d55cf3e523263dd824a2ace4Daniel Dunbar    // Not translated, render as usual.
231c21c485b4fb58ef5d55cf3e523263dd824a2ace4Daniel Dunbar    A->claim();
232c21c485b4fb58ef5d55cf3e523263dd824a2ace4Daniel Dunbar    A->render(Args, CmdArgs);
233c21c485b4fb58ef5d55cf3e523263dd824a2ace4Daniel Dunbar  }
234c21c485b4fb58ef5d55cf3e523263dd824a2ace4Daniel Dunbar
235c21c485b4fb58ef5d55cf3e523263dd824a2ace4Daniel Dunbar  Args.AddAllArgs(CmdArgs, options::OPT_D, options::OPT_U);
236c21c485b4fb58ef5d55cf3e523263dd824a2ace4Daniel Dunbar  Args.AddAllArgs(CmdArgs, options::OPT_I_Group, options::OPT_F);
237c21c485b4fb58ef5d55cf3e523263dd824a2ace4Daniel Dunbar
238c21c485b4fb58ef5d55cf3e523263dd824a2ace4Daniel Dunbar  // Add -Wp, and -Xassembler if using the preprocessor.
239c21c485b4fb58ef5d55cf3e523263dd824a2ace4Daniel Dunbar
240c21c485b4fb58ef5d55cf3e523263dd824a2ace4Daniel Dunbar  // FIXME: There is a very unfortunate problem here, some troubled
241c21c485b4fb58ef5d55cf3e523263dd824a2ace4Daniel Dunbar  // souls abuse -Wp, to pass preprocessor options in gcc syntax. To
242c21c485b4fb58ef5d55cf3e523263dd824a2ace4Daniel Dunbar  // really support that we would have to parse and then translate
243c21c485b4fb58ef5d55cf3e523263dd824a2ace4Daniel Dunbar  // those options. :(
244c21c485b4fb58ef5d55cf3e523263dd824a2ace4Daniel Dunbar  Args.AddAllArgValues(CmdArgs, options::OPT_Wp_COMMA,
245c21c485b4fb58ef5d55cf3e523263dd824a2ace4Daniel Dunbar                       options::OPT_Xpreprocessor);
246607d7f6d8f21066cc48bbe2c51e6ca412a00943fDaniel Dunbar
247607d7f6d8f21066cc48bbe2c51e6ca412a00943fDaniel Dunbar  // -I- is a deprecated GCC feature, reject it.
248607d7f6d8f21066cc48bbe2c51e6ca412a00943fDaniel Dunbar  if (Arg *A = Args.getLastArg(options::OPT_I_))
249607d7f6d8f21066cc48bbe2c51e6ca412a00943fDaniel Dunbar    D.Diag(clang::diag::err_drv_I_dash_not_supported) << A->getAsString(Args);
250c21c485b4fb58ef5d55cf3e523263dd824a2ace4Daniel Dunbar}
251c21c485b4fb58ef5d55cf3e523263dd824a2ace4Daniel Dunbar
252728a512753d85a6ccaae34e81385c8665c2de0e1Daniel Dunbar/// getARMTargetCPU - Get the (LLVM) name of the ARM cpu we are targetting.
253728a512753d85a6ccaae34e81385c8665c2de0e1Daniel Dunbar//
254728a512753d85a6ccaae34e81385c8665c2de0e1Daniel Dunbar// FIXME: tblgen this.
255a31100e62f83933432df9092a04e48f9e5561a14Daniel Dunbarstatic const char *getARMTargetCPU(const ArgList &Args) {
256728a512753d85a6ccaae34e81385c8665c2de0e1Daniel Dunbar  // FIXME: Warn on inconsistent use of -mcpu and -march.
257b163ef7e7a5d904ef0962a7c38c460be083c4d63Daniel Dunbar
258b163ef7e7a5d904ef0962a7c38c460be083c4d63Daniel Dunbar  // If we have -mcpu=, use that.
259b163ef7e7a5d904ef0962a7c38c460be083c4d63Daniel Dunbar  if (Arg *A = Args.getLastArg(options::OPT_mcpu_EQ))
260b163ef7e7a5d904ef0962a7c38c460be083c4d63Daniel Dunbar    return A->getValue(Args);
261b163ef7e7a5d904ef0962a7c38c460be083c4d63Daniel Dunbar
262b163ef7e7a5d904ef0962a7c38c460be083c4d63Daniel Dunbar  // Otherwise, if we have -march= choose the base CPU for that arch.
263b163ef7e7a5d904ef0962a7c38c460be083c4d63Daniel Dunbar  if (Arg *A = Args.getLastArg(options::OPT_march_EQ)) {
264b163ef7e7a5d904ef0962a7c38c460be083c4d63Daniel Dunbar    llvm::StringRef MArch = A->getValue(Args);
265b163ef7e7a5d904ef0962a7c38c460be083c4d63Daniel Dunbar
266b163ef7e7a5d904ef0962a7c38c460be083c4d63Daniel Dunbar    if (MArch == "armv2" || MArch == "armv2a")
267b163ef7e7a5d904ef0962a7c38c460be083c4d63Daniel Dunbar      return "arm2";
268b163ef7e7a5d904ef0962a7c38c460be083c4d63Daniel Dunbar    if (MArch == "armv3")
269b163ef7e7a5d904ef0962a7c38c460be083c4d63Daniel Dunbar      return "arm6";
270b163ef7e7a5d904ef0962a7c38c460be083c4d63Daniel Dunbar    if (MArch == "armv3m")
271b163ef7e7a5d904ef0962a7c38c460be083c4d63Daniel Dunbar      return "arm7m";
272b163ef7e7a5d904ef0962a7c38c460be083c4d63Daniel Dunbar    if (MArch == "armv4" || MArch == "armv4t")
273b163ef7e7a5d904ef0962a7c38c460be083c4d63Daniel Dunbar      return "arm7tdmi";
274b163ef7e7a5d904ef0962a7c38c460be083c4d63Daniel Dunbar    if (MArch == "armv5" || MArch == "armv5t")
275b163ef7e7a5d904ef0962a7c38c460be083c4d63Daniel Dunbar      return "arm10tdmi";
276b163ef7e7a5d904ef0962a7c38c460be083c4d63Daniel Dunbar    if (MArch == "armv5e" || MArch == "armv5te")
277b163ef7e7a5d904ef0962a7c38c460be083c4d63Daniel Dunbar      return "arm1026ejs";
278b163ef7e7a5d904ef0962a7c38c460be083c4d63Daniel Dunbar    if (MArch == "armv5tej")
27997f52ac45369f6925b548404e61d511034c874ecDaniel Dunbar      return "arm926ej-s";
280b163ef7e7a5d904ef0962a7c38c460be083c4d63Daniel Dunbar    if (MArch == "armv6" || MArch == "armv6k")
281b163ef7e7a5d904ef0962a7c38c460be083c4d63Daniel Dunbar      return "arm1136jf-s";
282b163ef7e7a5d904ef0962a7c38c460be083c4d63Daniel Dunbar    if (MArch == "armv6j")
283b163ef7e7a5d904ef0962a7c38c460be083c4d63Daniel Dunbar      return "arm1136j-s";
284b163ef7e7a5d904ef0962a7c38c460be083c4d63Daniel Dunbar    if (MArch == "armv6z" || MArch == "armv6zk")
285b163ef7e7a5d904ef0962a7c38c460be083c4d63Daniel Dunbar      return "arm1176jzf-s";
286b163ef7e7a5d904ef0962a7c38c460be083c4d63Daniel Dunbar    if (MArch == "armv6t2")
287b163ef7e7a5d904ef0962a7c38c460be083c4d63Daniel Dunbar      return "arm1156t2-s";
288b163ef7e7a5d904ef0962a7c38c460be083c4d63Daniel Dunbar    if (MArch == "armv7" || MArch == "armv7a" || MArch == "armv7-a")
289b163ef7e7a5d904ef0962a7c38c460be083c4d63Daniel Dunbar      return "cortex-a8";
290b163ef7e7a5d904ef0962a7c38c460be083c4d63Daniel Dunbar    if (MArch == "armv7r" || MArch == "armv7-r")
291b163ef7e7a5d904ef0962a7c38c460be083c4d63Daniel Dunbar      return "cortex-r4";
292b163ef7e7a5d904ef0962a7c38c460be083c4d63Daniel Dunbar    if (MArch == "armv7m" || MArch == "armv7-m")
293b163ef7e7a5d904ef0962a7c38c460be083c4d63Daniel Dunbar      return "cortex-m3";
294b163ef7e7a5d904ef0962a7c38c460be083c4d63Daniel Dunbar    if (MArch == "ep9312")
295b163ef7e7a5d904ef0962a7c38c460be083c4d63Daniel Dunbar      return "ep9312";
296b163ef7e7a5d904ef0962a7c38c460be083c4d63Daniel Dunbar    if (MArch == "iwmmxt")
297b163ef7e7a5d904ef0962a7c38c460be083c4d63Daniel Dunbar      return "iwmmxt";
298b163ef7e7a5d904ef0962a7c38c460be083c4d63Daniel Dunbar    if (MArch == "xscale")
299b163ef7e7a5d904ef0962a7c38c460be083c4d63Daniel Dunbar      return "xscale";
300b163ef7e7a5d904ef0962a7c38c460be083c4d63Daniel Dunbar  }
301b163ef7e7a5d904ef0962a7c38c460be083c4d63Daniel Dunbar
302b163ef7e7a5d904ef0962a7c38c460be083c4d63Daniel Dunbar  // Otherwise return the most base CPU LLVM supports.
303b163ef7e7a5d904ef0962a7c38c460be083c4d63Daniel Dunbar  return "arm7tdmi";
304b163ef7e7a5d904ef0962a7c38c460be083c4d63Daniel Dunbar}
305b163ef7e7a5d904ef0962a7c38c460be083c4d63Daniel Dunbar
3061d65e4be6f22f7e4b4974efbaef92fa3454f1ec8Daniel Dunbar/// getLLVMArchSuffixForARM - Get the LLVM arch name to use for a particular
307728a512753d85a6ccaae34e81385c8665c2de0e1Daniel Dunbar/// CPU.
308728a512753d85a6ccaae34e81385c8665c2de0e1Daniel Dunbar//
309728a512753d85a6ccaae34e81385c8665c2de0e1Daniel Dunbar// FIXME: This is redundant with -mcpu, why does LLVM use this.
310728a512753d85a6ccaae34e81385c8665c2de0e1Daniel Dunbar// FIXME: tblgen this, or kill it!
3111d65e4be6f22f7e4b4974efbaef92fa3454f1ec8Daniel Dunbarstatic const char *getLLVMArchSuffixForARM(llvm::StringRef CPU) {
312728a512753d85a6ccaae34e81385c8665c2de0e1Daniel Dunbar  if (CPU == "arm7tdmi" || CPU == "arm7tdmi-s" || CPU == "arm710t" ||
313728a512753d85a6ccaae34e81385c8665c2de0e1Daniel Dunbar      CPU == "arm720t" || CPU == "arm9" || CPU == "arm9tdmi" ||
314728a512753d85a6ccaae34e81385c8665c2de0e1Daniel Dunbar      CPU == "arm920" || CPU == "arm920t" || CPU == "arm922t" ||
315728a512753d85a6ccaae34e81385c8665c2de0e1Daniel Dunbar      CPU == "arm940t" || CPU == "ep9312")
3161d65e4be6f22f7e4b4974efbaef92fa3454f1ec8Daniel Dunbar    return "v4t";
317728a512753d85a6ccaae34e81385c8665c2de0e1Daniel Dunbar
318728a512753d85a6ccaae34e81385c8665c2de0e1Daniel Dunbar  if (CPU == "arm10tdmi" || CPU == "arm1020t")
3191d65e4be6f22f7e4b4974efbaef92fa3454f1ec8Daniel Dunbar    return "v5";
320728a512753d85a6ccaae34e81385c8665c2de0e1Daniel Dunbar
321728a512753d85a6ccaae34e81385c8665c2de0e1Daniel Dunbar  if (CPU == "arm9e" || CPU == "arm926ej-s" || CPU == "arm946e-s" ||
322728a512753d85a6ccaae34e81385c8665c2de0e1Daniel Dunbar      CPU == "arm966e-s" || CPU == "arm968e-s" || CPU == "arm10e" ||
323728a512753d85a6ccaae34e81385c8665c2de0e1Daniel Dunbar      CPU == "arm1020e" || CPU == "arm1022e" || CPU == "xscale" ||
324728a512753d85a6ccaae34e81385c8665c2de0e1Daniel Dunbar      CPU == "iwmmxt")
3251d65e4be6f22f7e4b4974efbaef92fa3454f1ec8Daniel Dunbar    return "v5e";
326728a512753d85a6ccaae34e81385c8665c2de0e1Daniel Dunbar
327728a512753d85a6ccaae34e81385c8665c2de0e1Daniel Dunbar  if (CPU == "arm1136j-s" || CPU == "arm1136jf-s" || CPU == "arm1176jz-s" ||
328728a512753d85a6ccaae34e81385c8665c2de0e1Daniel Dunbar      CPU == "arm1176jzf-s" || CPU == "mpcorenovfp" || CPU == "mpcore")
3291d65e4be6f22f7e4b4974efbaef92fa3454f1ec8Daniel Dunbar    return "v6";
330728a512753d85a6ccaae34e81385c8665c2de0e1Daniel Dunbar
331728a512753d85a6ccaae34e81385c8665c2de0e1Daniel Dunbar  if (CPU == "arm1156t2-s" || CPU == "arm1156t2f-s")
3321d65e4be6f22f7e4b4974efbaef92fa3454f1ec8Daniel Dunbar    return "v6t2";
333728a512753d85a6ccaae34e81385c8665c2de0e1Daniel Dunbar
334728a512753d85a6ccaae34e81385c8665c2de0e1Daniel Dunbar  if (CPU == "cortex-a8" || CPU == "cortex-a9")
3351d65e4be6f22f7e4b4974efbaef92fa3454f1ec8Daniel Dunbar    return "v7";
336728a512753d85a6ccaae34e81385c8665c2de0e1Daniel Dunbar
3371d65e4be6f22f7e4b4974efbaef92fa3454f1ec8Daniel Dunbar  return "";
338728a512753d85a6ccaae34e81385c8665c2de0e1Daniel Dunbar}
339728a512753d85a6ccaae34e81385c8665c2de0e1Daniel Dunbar
340728a512753d85a6ccaae34e81385c8665c2de0e1Daniel Dunbar/// getLLVMTriple - Get the LLVM triple to use for a particular toolchain, which
341728a512753d85a6ccaae34e81385c8665c2de0e1Daniel Dunbar/// may depend on command line arguments.
342728a512753d85a6ccaae34e81385c8665c2de0e1Daniel Dunbarstatic std::string getLLVMTriple(const ToolChain &TC, const ArgList &Args) {
343728a512753d85a6ccaae34e81385c8665c2de0e1Daniel Dunbar  switch (TC.getTriple().getArch()) {
344728a512753d85a6ccaae34e81385c8665c2de0e1Daniel Dunbar  default:
345728a512753d85a6ccaae34e81385c8665c2de0e1Daniel Dunbar    return TC.getTripleString();
346728a512753d85a6ccaae34e81385c8665c2de0e1Daniel Dunbar
347728a512753d85a6ccaae34e81385c8665c2de0e1Daniel Dunbar  case llvm::Triple::arm:
348728a512753d85a6ccaae34e81385c8665c2de0e1Daniel Dunbar  case llvm::Triple::thumb: {
349f4aa4f61de7d364364dc94bbf83ff71448a11327Daniel Dunbar    // FIXME: Factor into subclasses.
350728a512753d85a6ccaae34e81385c8665c2de0e1Daniel Dunbar    llvm::Triple Triple = TC.getTriple();
351f4aa4f61de7d364364dc94bbf83ff71448a11327Daniel Dunbar
352f4aa4f61de7d364364dc94bbf83ff71448a11327Daniel Dunbar    // Thumb2 is the default for V7 on Darwin.
353f4aa4f61de7d364364dc94bbf83ff71448a11327Daniel Dunbar    //
354f4aa4f61de7d364364dc94bbf83ff71448a11327Daniel Dunbar    // FIXME: Thumb should just be another -target-feaure, not in the triple.
355f4aa4f61de7d364364dc94bbf83ff71448a11327Daniel Dunbar    llvm::StringRef Suffix = getLLVMArchSuffixForARM(getARMTargetCPU(Args));
356f4aa4f61de7d364364dc94bbf83ff71448a11327Daniel Dunbar    bool ThumbDefault =
357f4aa4f61de7d364364dc94bbf83ff71448a11327Daniel Dunbar      (Suffix == "v7" && TC.getTriple().getOS() == llvm::Triple::Darwin);
3581d65e4be6f22f7e4b4974efbaef92fa3454f1ec8Daniel Dunbar    std::string ArchName = "arm";
359f4aa4f61de7d364364dc94bbf83ff71448a11327Daniel Dunbar    if (Args.hasFlag(options::OPT_mthumb, options::OPT_mno_thumb, ThumbDefault))
360f4aa4f61de7d364364dc94bbf83ff71448a11327Daniel Dunbar      ArchName = "thumb";
361f4aa4f61de7d364364dc94bbf83ff71448a11327Daniel Dunbar    Triple.setArchName(ArchName + Suffix.str());
362f4aa4f61de7d364364dc94bbf83ff71448a11327Daniel Dunbar
363728a512753d85a6ccaae34e81385c8665c2de0e1Daniel Dunbar    return Triple.getTriple();
364728a512753d85a6ccaae34e81385c8665c2de0e1Daniel Dunbar  }
365728a512753d85a6ccaae34e81385c8665c2de0e1Daniel Dunbar  }
366728a512753d85a6ccaae34e81385c8665c2de0e1Daniel Dunbar}
367728a512753d85a6ccaae34e81385c8665c2de0e1Daniel Dunbar
3681f95e6567faab67f4363d650f73121359c4bdbabDaniel Dunbar// FIXME: Move to target hook.
3691f95e6567faab67f4363d650f73121359c4bdbabDaniel Dunbarstatic bool isSignedCharDefault(const llvm::Triple &Triple) {
3701f95e6567faab67f4363d650f73121359c4bdbabDaniel Dunbar  switch (Triple.getArch()) {
3711f95e6567faab67f4363d650f73121359c4bdbabDaniel Dunbar  default:
3721f95e6567faab67f4363d650f73121359c4bdbabDaniel Dunbar    return true;
3731f95e6567faab67f4363d650f73121359c4bdbabDaniel Dunbar
3741f95e6567faab67f4363d650f73121359c4bdbabDaniel Dunbar  case llvm::Triple::ppc:
3751f95e6567faab67f4363d650f73121359c4bdbabDaniel Dunbar  case llvm::Triple::ppc64:
3761f95e6567faab67f4363d650f73121359c4bdbabDaniel Dunbar    if (Triple.getOS() == llvm::Triple::Darwin)
3771f95e6567faab67f4363d650f73121359c4bdbabDaniel Dunbar      return true;
3781f95e6567faab67f4363d650f73121359c4bdbabDaniel Dunbar    return false;
3791f95e6567faab67f4363d650f73121359c4bdbabDaniel Dunbar
3801f95e6567faab67f4363d650f73121359c4bdbabDaniel Dunbar  case llvm::Triple::systemz:
3811f95e6567faab67f4363d650f73121359c4bdbabDaniel Dunbar    return false;
3821f95e6567faab67f4363d650f73121359c4bdbabDaniel Dunbar  }
3831f95e6567faab67f4363d650f73121359c4bdbabDaniel Dunbar}
3841f95e6567faab67f4363d650f73121359c4bdbabDaniel Dunbar
385b163ef7e7a5d904ef0962a7c38c460be083c4d63Daniel Dunbarvoid Clang::AddARMTargetArgs(const ArgList &Args,
386b163ef7e7a5d904ef0962a7c38c460be083c4d63Daniel Dunbar                             ArgStringList &CmdArgs) const {
387ee788e70fcd0adf76103b17c78ac658d4ea30c9bDaniel Dunbar  const Driver &D = getToolChain().getDriver();
388cbd1933f83e2332b2d7add10459f80cc4e7eb7bfDaniel Dunbar
3892030d8f46b4226fa99e59389e3ca856a79c27e9aDaniel Dunbar  // Select the ABI to use.
3902030d8f46b4226fa99e59389e3ca856a79c27e9aDaniel Dunbar  //
3912030d8f46b4226fa99e59389e3ca856a79c27e9aDaniel Dunbar  // FIXME: Support -meabi.
3922030d8f46b4226fa99e59389e3ca856a79c27e9aDaniel Dunbar  const char *ABIName = 0;
3932030d8f46b4226fa99e59389e3ca856a79c27e9aDaniel Dunbar  if (Arg *A = Args.getLastArg(options::OPT_mabi_EQ)) {
3942030d8f46b4226fa99e59389e3ca856a79c27e9aDaniel Dunbar    ABIName = A->getValue(Args);
3952030d8f46b4226fa99e59389e3ca856a79c27e9aDaniel Dunbar  } else {
3962030d8f46b4226fa99e59389e3ca856a79c27e9aDaniel Dunbar    // Select the default based on the platform.
3972030d8f46b4226fa99e59389e3ca856a79c27e9aDaniel Dunbar    switch (getToolChain().getTriple().getOS()) {
3982030d8f46b4226fa99e59389e3ca856a79c27e9aDaniel Dunbar      // FIXME: Is this right for non-Darwin and non-Linux?
3992030d8f46b4226fa99e59389e3ca856a79c27e9aDaniel Dunbar    default:
4002030d8f46b4226fa99e59389e3ca856a79c27e9aDaniel Dunbar      ABIName = "aapcs";
4012030d8f46b4226fa99e59389e3ca856a79c27e9aDaniel Dunbar      break;
4022030d8f46b4226fa99e59389e3ca856a79c27e9aDaniel Dunbar
4032030d8f46b4226fa99e59389e3ca856a79c27e9aDaniel Dunbar    case llvm::Triple::Darwin:
4042030d8f46b4226fa99e59389e3ca856a79c27e9aDaniel Dunbar      ABIName = "apcs-gnu";
4052030d8f46b4226fa99e59389e3ca856a79c27e9aDaniel Dunbar      break;
4062030d8f46b4226fa99e59389e3ca856a79c27e9aDaniel Dunbar
4072030d8f46b4226fa99e59389e3ca856a79c27e9aDaniel Dunbar    case llvm::Triple::Linux:
4082030d8f46b4226fa99e59389e3ca856a79c27e9aDaniel Dunbar      ABIName = "aapcs-linux";
4092030d8f46b4226fa99e59389e3ca856a79c27e9aDaniel Dunbar      break;
4102030d8f46b4226fa99e59389e3ca856a79c27e9aDaniel Dunbar    }
4112030d8f46b4226fa99e59389e3ca856a79c27e9aDaniel Dunbar  }
4122030d8f46b4226fa99e59389e3ca856a79c27e9aDaniel Dunbar  CmdArgs.push_back("-target-abi");
4132030d8f46b4226fa99e59389e3ca856a79c27e9aDaniel Dunbar  CmdArgs.push_back(ABIName);
4142030d8f46b4226fa99e59389e3ca856a79c27e9aDaniel Dunbar
415b163ef7e7a5d904ef0962a7c38c460be083c4d63Daniel Dunbar  // Set the CPU based on -march= and -mcpu=.
41638b48afd338d494099697d2611e1f45e558e469eDaniel Dunbar  CmdArgs.push_back("-target-cpu");
417a31100e62f83933432df9092a04e48f9e5561a14Daniel Dunbar  CmdArgs.push_back(getARMTargetCPU(Args));
418b163ef7e7a5d904ef0962a7c38c460be083c4d63Daniel Dunbar
419cbd1933f83e2332b2d7add10459f80cc4e7eb7bfDaniel Dunbar  // Select the float ABI as determined by -msoft-float, -mhard-float, and
420cbd1933f83e2332b2d7add10459f80cc4e7eb7bfDaniel Dunbar  // -mfloat-abi=.
421cbd1933f83e2332b2d7add10459f80cc4e7eb7bfDaniel Dunbar  llvm::StringRef FloatABI;
422cbd1933f83e2332b2d7add10459f80cc4e7eb7bfDaniel Dunbar  if (Arg *A = Args.getLastArg(options::OPT_msoft_float,
423cbd1933f83e2332b2d7add10459f80cc4e7eb7bfDaniel Dunbar                               options::OPT_mhard_float,
424cbd1933f83e2332b2d7add10459f80cc4e7eb7bfDaniel Dunbar                               options::OPT_mfloat_abi_EQ)) {
425cbd1933f83e2332b2d7add10459f80cc4e7eb7bfDaniel Dunbar    if (A->getOption().matches(options::OPT_msoft_float))
426cbd1933f83e2332b2d7add10459f80cc4e7eb7bfDaniel Dunbar      FloatABI = "soft";
427cbd1933f83e2332b2d7add10459f80cc4e7eb7bfDaniel Dunbar    else if (A->getOption().matches(options::OPT_mhard_float))
428cbd1933f83e2332b2d7add10459f80cc4e7eb7bfDaniel Dunbar      FloatABI = "hard";
429cbd1933f83e2332b2d7add10459f80cc4e7eb7bfDaniel Dunbar    else {
430cbd1933f83e2332b2d7add10459f80cc4e7eb7bfDaniel Dunbar      FloatABI = A->getValue(Args);
431cbd1933f83e2332b2d7add10459f80cc4e7eb7bfDaniel Dunbar      if (FloatABI != "soft" && FloatABI != "softfp" && FloatABI != "hard") {
432cbd1933f83e2332b2d7add10459f80cc4e7eb7bfDaniel Dunbar        D.Diag(clang::diag::err_drv_invalid_mfloat_abi)
433cbd1933f83e2332b2d7add10459f80cc4e7eb7bfDaniel Dunbar          << A->getAsString(Args);
434cbd1933f83e2332b2d7add10459f80cc4e7eb7bfDaniel Dunbar        FloatABI = "soft";
435cbd1933f83e2332b2d7add10459f80cc4e7eb7bfDaniel Dunbar      }
436cbd1933f83e2332b2d7add10459f80cc4e7eb7bfDaniel Dunbar    }
437cbd1933f83e2332b2d7add10459f80cc4e7eb7bfDaniel Dunbar  }
438cbd1933f83e2332b2d7add10459f80cc4e7eb7bfDaniel Dunbar
439cbd1933f83e2332b2d7add10459f80cc4e7eb7bfDaniel Dunbar  // If unspecified, choose the default based on the platform.
440cbd1933f83e2332b2d7add10459f80cc4e7eb7bfDaniel Dunbar  if (FloatABI.empty()) {
441cbd1933f83e2332b2d7add10459f80cc4e7eb7bfDaniel Dunbar    // FIXME: This is wrong for non-Darwin, we don't have a mechanism yet for
442cbd1933f83e2332b2d7add10459f80cc4e7eb7bfDaniel Dunbar    // distinguishing things like linux-eabi vs linux-elf.
443cbd1933f83e2332b2d7add10459f80cc4e7eb7bfDaniel Dunbar    switch (getToolChain().getTriple().getOS()) {
444cbd1933f83e2332b2d7add10459f80cc4e7eb7bfDaniel Dunbar    case llvm::Triple::Darwin: {
445cbd1933f83e2332b2d7add10459f80cc4e7eb7bfDaniel Dunbar      // Darwin defaults to "softfp" for v6 and v7.
446cbd1933f83e2332b2d7add10459f80cc4e7eb7bfDaniel Dunbar      //
447cbd1933f83e2332b2d7add10459f80cc4e7eb7bfDaniel Dunbar      // FIXME: Factor out an ARM class so we can cache the arch somewhere.
448cbd1933f83e2332b2d7add10459f80cc4e7eb7bfDaniel Dunbar      llvm::StringRef ArchName = getLLVMArchSuffixForARM(getARMTargetCPU(Args));
449cbd1933f83e2332b2d7add10459f80cc4e7eb7bfDaniel Dunbar      if (ArchName.startswith("v6") || ArchName.startswith("v7"))
450cbd1933f83e2332b2d7add10459f80cc4e7eb7bfDaniel Dunbar        FloatABI = "softfp";
451cbd1933f83e2332b2d7add10459f80cc4e7eb7bfDaniel Dunbar      else
452cbd1933f83e2332b2d7add10459f80cc4e7eb7bfDaniel Dunbar        FloatABI = "soft";
453cbd1933f83e2332b2d7add10459f80cc4e7eb7bfDaniel Dunbar      break;
454cbd1933f83e2332b2d7add10459f80cc4e7eb7bfDaniel Dunbar    }
455cbd1933f83e2332b2d7add10459f80cc4e7eb7bfDaniel Dunbar
456cbd1933f83e2332b2d7add10459f80cc4e7eb7bfDaniel Dunbar    default:
457cbd1933f83e2332b2d7add10459f80cc4e7eb7bfDaniel Dunbar      // Assume "soft", but warn the user we are guessing.
458cbd1933f83e2332b2d7add10459f80cc4e7eb7bfDaniel Dunbar      FloatABI = "soft";
459cbd1933f83e2332b2d7add10459f80cc4e7eb7bfDaniel Dunbar      D.Diag(clang::diag::warn_drv_assuming_mfloat_abi_is) << "soft";
460cbd1933f83e2332b2d7add10459f80cc4e7eb7bfDaniel Dunbar      break;
461cbd1933f83e2332b2d7add10459f80cc4e7eb7bfDaniel Dunbar    }
462cbd1933f83e2332b2d7add10459f80cc4e7eb7bfDaniel Dunbar  }
463cbd1933f83e2332b2d7add10459f80cc4e7eb7bfDaniel Dunbar
464cbd1933f83e2332b2d7add10459f80cc4e7eb7bfDaniel Dunbar  if (FloatABI == "soft") {
465cbd1933f83e2332b2d7add10459f80cc4e7eb7bfDaniel Dunbar    // Floating point operations and argument passing are soft.
466cbd1933f83e2332b2d7add10459f80cc4e7eb7bfDaniel Dunbar    //
467cbd1933f83e2332b2d7add10459f80cc4e7eb7bfDaniel Dunbar    // FIXME: This changes CPP defines, we need -target-soft-float.
4683b315264d1a6fa303e20fe0caec306ccafc090deDaniel Dunbar    CmdArgs.push_back("-msoft-float");
46987667aafe68c366be57f5afb60428237593da0edDaniel Dunbar    CmdArgs.push_back("-mfloat-abi");
47087667aafe68c366be57f5afb60428237593da0edDaniel Dunbar    CmdArgs.push_back("soft");
471cbd1933f83e2332b2d7add10459f80cc4e7eb7bfDaniel Dunbar  } else if (FloatABI == "softfp") {
472cbd1933f83e2332b2d7add10459f80cc4e7eb7bfDaniel Dunbar    // Floating point operations are hard, but argument passing is soft.
47387667aafe68c366be57f5afb60428237593da0edDaniel Dunbar    CmdArgs.push_back("-mfloat-abi");
47487667aafe68c366be57f5afb60428237593da0edDaniel Dunbar    CmdArgs.push_back("soft");
475cbd1933f83e2332b2d7add10459f80cc4e7eb7bfDaniel Dunbar  } else {
476cbd1933f83e2332b2d7add10459f80cc4e7eb7bfDaniel Dunbar    // Floating point operations and argument passing are hard.
477cbd1933f83e2332b2d7add10459f80cc4e7eb7bfDaniel Dunbar    assert(FloatABI == "hard" && "Invalid float abi!");
47887667aafe68c366be57f5afb60428237593da0edDaniel Dunbar    CmdArgs.push_back("-mfloat-abi");
47987667aafe68c366be57f5afb60428237593da0edDaniel Dunbar    CmdArgs.push_back("hard");
480cbd1933f83e2332b2d7add10459f80cc4e7eb7bfDaniel Dunbar  }
48197f52ac45369f6925b548404e61d511034c874ecDaniel Dunbar
48297f52ac45369f6925b548404e61d511034c874ecDaniel Dunbar  // Set appropriate target features for floating point mode.
48397f52ac45369f6925b548404e61d511034c874ecDaniel Dunbar  //
48497f52ac45369f6925b548404e61d511034c874ecDaniel Dunbar  // FIXME: Note, this is a hack, the LLVM backend doesn't actually use these
48597f52ac45369f6925b548404e61d511034c874ecDaniel Dunbar  // yet (it uses the -mfloat-abi and -msoft-float options above), and it is
48697f52ac45369f6925b548404e61d511034c874ecDaniel Dunbar  // stripped out by the ARM target.
48797f52ac45369f6925b548404e61d511034c874ecDaniel Dunbar
48897f52ac45369f6925b548404e61d511034c874ecDaniel Dunbar  // Use software floating point operations?
48997f52ac45369f6925b548404e61d511034c874ecDaniel Dunbar  if (FloatABI == "soft") {
49097f52ac45369f6925b548404e61d511034c874ecDaniel Dunbar    CmdArgs.push_back("-target-feature");
49197f52ac45369f6925b548404e61d511034c874ecDaniel Dunbar    CmdArgs.push_back("+soft-float");
49297f52ac45369f6925b548404e61d511034c874ecDaniel Dunbar  }
49397f52ac45369f6925b548404e61d511034c874ecDaniel Dunbar
49497f52ac45369f6925b548404e61d511034c874ecDaniel Dunbar  // Use software floating point argument passing?
49597f52ac45369f6925b548404e61d511034c874ecDaniel Dunbar  if (FloatABI != "hard") {
49697f52ac45369f6925b548404e61d511034c874ecDaniel Dunbar    CmdArgs.push_back("-target-feature");
49797f52ac45369f6925b548404e61d511034c874ecDaniel Dunbar    CmdArgs.push_back("+soft-float-abi");
49897f52ac45369f6925b548404e61d511034c874ecDaniel Dunbar  }
499a91320b8af7143f7af4c0665ffa62a3b244c0bd9Daniel Dunbar
500a91320b8af7143f7af4c0665ffa62a3b244c0bd9Daniel Dunbar  // Honor -mfpu=.
501a91320b8af7143f7af4c0665ffa62a3b244c0bd9Daniel Dunbar  //
502a91320b8af7143f7af4c0665ffa62a3b244c0bd9Daniel Dunbar  // FIXME: Centralize feature selection, defaulting shouldn't be also in the
503a91320b8af7143f7af4c0665ffa62a3b244c0bd9Daniel Dunbar  // frontend target.
504a91320b8af7143f7af4c0665ffa62a3b244c0bd9Daniel Dunbar  if (const Arg *A = Args.getLastArg(options::OPT_mfpu_EQ)) {
505a91320b8af7143f7af4c0665ffa62a3b244c0bd9Daniel Dunbar    llvm::StringRef FPU = A->getValue(Args);
506a91320b8af7143f7af4c0665ffa62a3b244c0bd9Daniel Dunbar
507a91320b8af7143f7af4c0665ffa62a3b244c0bd9Daniel Dunbar    // Set the target features based on the FPU.
508a91320b8af7143f7af4c0665ffa62a3b244c0bd9Daniel Dunbar    if (FPU == "fpa" || FPU == "fpe2" || FPU == "fpe3" || FPU == "maverick") {
509a91320b8af7143f7af4c0665ffa62a3b244c0bd9Daniel Dunbar      // Disable any default FPU support.
510a91320b8af7143f7af4c0665ffa62a3b244c0bd9Daniel Dunbar      CmdArgs.push_back("-target-feature");
511a91320b8af7143f7af4c0665ffa62a3b244c0bd9Daniel Dunbar      CmdArgs.push_back("-vfp2");
512a91320b8af7143f7af4c0665ffa62a3b244c0bd9Daniel Dunbar      CmdArgs.push_back("-target-feature");
513a91320b8af7143f7af4c0665ffa62a3b244c0bd9Daniel Dunbar      CmdArgs.push_back("-vfp3");
514a91320b8af7143f7af4c0665ffa62a3b244c0bd9Daniel Dunbar      CmdArgs.push_back("-target-feature");
515a91320b8af7143f7af4c0665ffa62a3b244c0bd9Daniel Dunbar      CmdArgs.push_back("-neon");
516a91320b8af7143f7af4c0665ffa62a3b244c0bd9Daniel Dunbar    } else if (FPU == "vfp") {
517a91320b8af7143f7af4c0665ffa62a3b244c0bd9Daniel Dunbar      CmdArgs.push_back("-target-feature");
518a91320b8af7143f7af4c0665ffa62a3b244c0bd9Daniel Dunbar      CmdArgs.push_back("+vfp2");
519a91320b8af7143f7af4c0665ffa62a3b244c0bd9Daniel Dunbar    } else if (FPU == "vfp3") {
520a91320b8af7143f7af4c0665ffa62a3b244c0bd9Daniel Dunbar      CmdArgs.push_back("-target-feature");
521a91320b8af7143f7af4c0665ffa62a3b244c0bd9Daniel Dunbar      CmdArgs.push_back("+vfp3");
522a91320b8af7143f7af4c0665ffa62a3b244c0bd9Daniel Dunbar    } else if (FPU == "neon") {
523a91320b8af7143f7af4c0665ffa62a3b244c0bd9Daniel Dunbar      CmdArgs.push_back("-target-feature");
524a91320b8af7143f7af4c0665ffa62a3b244c0bd9Daniel Dunbar      CmdArgs.push_back("+neon");
525a91320b8af7143f7af4c0665ffa62a3b244c0bd9Daniel Dunbar    } else
526a91320b8af7143f7af4c0665ffa62a3b244c0bd9Daniel Dunbar      D.Diag(clang::diag::err_drv_clang_unsupported) << A->getAsString(Args);
527a91320b8af7143f7af4c0665ffa62a3b244c0bd9Daniel Dunbar  }
528b163ef7e7a5d904ef0962a7c38c460be083c4d63Daniel Dunbar}
529b163ef7e7a5d904ef0962a7c38c460be083c4d63Daniel Dunbar
530ed734737d5af31906e30e537d4a41c760ddcfc59Eric Christophervoid Clang::AddMIPSTargetArgs(const ArgList &Args,
531ed734737d5af31906e30e537d4a41c760ddcfc59Eric Christopher                             ArgStringList &CmdArgs) const {
532ed734737d5af31906e30e537d4a41c760ddcfc59Eric Christopher  const Driver &D = getToolChain().getDriver();
533ed734737d5af31906e30e537d4a41c760ddcfc59Eric Christopher
534ed734737d5af31906e30e537d4a41c760ddcfc59Eric Christopher  // Select the ABI to use.
535ed734737d5af31906e30e537d4a41c760ddcfc59Eric Christopher  const char *ABIName = 0;
536ed734737d5af31906e30e537d4a41c760ddcfc59Eric Christopher  if (Arg *A = Args.getLastArg(options::OPT_mabi_EQ)) {
537ed734737d5af31906e30e537d4a41c760ddcfc59Eric Christopher    ABIName = A->getValue(Args);
538ed734737d5af31906e30e537d4a41c760ddcfc59Eric Christopher  } else {
539ed734737d5af31906e30e537d4a41c760ddcfc59Eric Christopher    ABIName = "o32";
540ed734737d5af31906e30e537d4a41c760ddcfc59Eric Christopher  }
541ed734737d5af31906e30e537d4a41c760ddcfc59Eric Christopher
542ed734737d5af31906e30e537d4a41c760ddcfc59Eric Christopher  CmdArgs.push_back("-target-abi");
543ed734737d5af31906e30e537d4a41c760ddcfc59Eric Christopher  CmdArgs.push_back(ABIName);
544ed734737d5af31906e30e537d4a41c760ddcfc59Eric Christopher
545ed734737d5af31906e30e537d4a41c760ddcfc59Eric Christopher  if (const Arg *A = Args.getLastArg(options::OPT_march_EQ)) {
546ed734737d5af31906e30e537d4a41c760ddcfc59Eric Christopher    llvm::StringRef MArch = A->getValue(Args);
547ed734737d5af31906e30e537d4a41c760ddcfc59Eric Christopher    CmdArgs.push_back("-target-cpu");
548ed734737d5af31906e30e537d4a41c760ddcfc59Eric Christopher
549ed734737d5af31906e30e537d4a41c760ddcfc59Eric Christopher    if ((MArch == "r2000") || (MArch == "r3000"))
550ed734737d5af31906e30e537d4a41c760ddcfc59Eric Christopher      CmdArgs.push_back("mips1");
551ed734737d5af31906e30e537d4a41c760ddcfc59Eric Christopher    else if (MArch == "r6000")
552ed734737d5af31906e30e537d4a41c760ddcfc59Eric Christopher      CmdArgs.push_back("mips2");
553ed734737d5af31906e30e537d4a41c760ddcfc59Eric Christopher    else
554ed734737d5af31906e30e537d4a41c760ddcfc59Eric Christopher      CmdArgs.push_back(MArch.str().c_str());
555ed734737d5af31906e30e537d4a41c760ddcfc59Eric Christopher  }
556ed734737d5af31906e30e537d4a41c760ddcfc59Eric Christopher
557ed734737d5af31906e30e537d4a41c760ddcfc59Eric Christopher  // Select the float ABI as determined by -msoft-float, -mhard-float, and
558ed734737d5af31906e30e537d4a41c760ddcfc59Eric Christopher  llvm::StringRef FloatABI;
559ed734737d5af31906e30e537d4a41c760ddcfc59Eric Christopher  if (Arg *A = Args.getLastArg(options::OPT_msoft_float,
560ed734737d5af31906e30e537d4a41c760ddcfc59Eric Christopher                               options::OPT_mhard_float)) {
561ed734737d5af31906e30e537d4a41c760ddcfc59Eric Christopher    if (A->getOption().matches(options::OPT_msoft_float))
562ed734737d5af31906e30e537d4a41c760ddcfc59Eric Christopher      FloatABI = "soft";
563ed734737d5af31906e30e537d4a41c760ddcfc59Eric Christopher    else if (A->getOption().matches(options::OPT_mhard_float))
564ed734737d5af31906e30e537d4a41c760ddcfc59Eric Christopher      FloatABI = "hard";
565ed734737d5af31906e30e537d4a41c760ddcfc59Eric Christopher  }
566ed734737d5af31906e30e537d4a41c760ddcfc59Eric Christopher
567ed734737d5af31906e30e537d4a41c760ddcfc59Eric Christopher  // If unspecified, choose the default based on the platform.
568ed734737d5af31906e30e537d4a41c760ddcfc59Eric Christopher  if (FloatABI.empty()) {
56971c972acd4a2cb5e369e35471dbb719185913cdcBenjamin Kramer    // Assume "soft", but warn the user we are guessing.
57071c972acd4a2cb5e369e35471dbb719185913cdcBenjamin Kramer    FloatABI = "soft";
57171c972acd4a2cb5e369e35471dbb719185913cdcBenjamin Kramer    D.Diag(clang::diag::warn_drv_assuming_mfloat_abi_is) << "soft";
572ed734737d5af31906e30e537d4a41c760ddcfc59Eric Christopher  }
573ed734737d5af31906e30e537d4a41c760ddcfc59Eric Christopher
574ed734737d5af31906e30e537d4a41c760ddcfc59Eric Christopher  if (FloatABI == "soft") {
575ed734737d5af31906e30e537d4a41c760ddcfc59Eric Christopher    // Floating point operations and argument passing are soft.
576ed734737d5af31906e30e537d4a41c760ddcfc59Eric Christopher    //
577ed734737d5af31906e30e537d4a41c760ddcfc59Eric Christopher    // FIXME: This changes CPP defines, we need -target-soft-float.
578ed734737d5af31906e30e537d4a41c760ddcfc59Eric Christopher    CmdArgs.push_back("-msoft-float");
579ed734737d5af31906e30e537d4a41c760ddcfc59Eric Christopher  } else {
580ed734737d5af31906e30e537d4a41c760ddcfc59Eric Christopher    assert(FloatABI == "hard" && "Invalid float abi!");
581ed734737d5af31906e30e537d4a41c760ddcfc59Eric Christopher    CmdArgs.push_back("-mhard-float");
582ed734737d5af31906e30e537d4a41c760ddcfc59Eric Christopher  }
583ed734737d5af31906e30e537d4a41c760ddcfc59Eric Christopher}
584ed734737d5af31906e30e537d4a41c760ddcfc59Eric Christopher
5856acda16e9c194dcbd0dea64341e182bdb65d0f41Daniel Dunbarvoid Clang::AddX86TargetArgs(const ArgList &Args,
5866acda16e9c194dcbd0dea64341e182bdb65d0f41Daniel Dunbar                             ArgStringList &CmdArgs) const {
587e6ad3f9fceef0ecc422ff26754ea069a5fd18c69Daniel Dunbar  if (!Args.hasFlag(options::OPT_mred_zone,
588e6ad3f9fceef0ecc422ff26754ea069a5fd18c69Daniel Dunbar                    options::OPT_mno_red_zone,
589e6ad3f9fceef0ecc422ff26754ea069a5fd18c69Daniel Dunbar                    true) ||
590e6ad3f9fceef0ecc422ff26754ea069a5fd18c69Daniel Dunbar      Args.hasArg(options::OPT_mkernel) ||
591e6ad3f9fceef0ecc422ff26754ea069a5fd18c69Daniel Dunbar      Args.hasArg(options::OPT_fapple_kext))
59266861e09d590994a8b941eaa328e4d8f33adec9eDaniel Dunbar    CmdArgs.push_back("-disable-red-zone");
593e6ad3f9fceef0ecc422ff26754ea069a5fd18c69Daniel Dunbar
594e6ad3f9fceef0ecc422ff26754ea069a5fd18c69Daniel Dunbar  if (Args.hasFlag(options::OPT_msoft_float,
595e6ad3f9fceef0ecc422ff26754ea069a5fd18c69Daniel Dunbar                   options::OPT_mno_soft_float,
596e6ad3f9fceef0ecc422ff26754ea069a5fd18c69Daniel Dunbar                   false))
59766861e09d590994a8b941eaa328e4d8f33adec9eDaniel Dunbar    CmdArgs.push_back("-no-implicit-float");
598e6ad3f9fceef0ecc422ff26754ea069a5fd18c69Daniel Dunbar
599f86feddbd5b13d2c144132e35d608fa630784dbbDaniel Dunbar  const char *CPUName = 0;
6006acda16e9c194dcbd0dea64341e182bdb65d0f41Daniel Dunbar  if (const Arg *A = Args.getLastArg(options::OPT_march_EQ)) {
601f86feddbd5b13d2c144132e35d608fa630784dbbDaniel Dunbar    if (llvm::StringRef(A->getValue(Args)) == "native") {
602f86feddbd5b13d2c144132e35d608fa630784dbbDaniel Dunbar      // FIXME: Reject attempts to use -march=native unless the target matches
603f86feddbd5b13d2c144132e35d608fa630784dbbDaniel Dunbar      // the host.
604f86feddbd5b13d2c144132e35d608fa630784dbbDaniel Dunbar      //
605f86feddbd5b13d2c144132e35d608fa630784dbbDaniel Dunbar      // FIXME: We should also incorporate the detected target features for use
606f86feddbd5b13d2c144132e35d608fa630784dbbDaniel Dunbar      // with -native.
607f86feddbd5b13d2c144132e35d608fa630784dbbDaniel Dunbar      std::string CPU = llvm::sys::getHostCPUName();
608f86feddbd5b13d2c144132e35d608fa630784dbbDaniel Dunbar      if (!CPU.empty())
609f86feddbd5b13d2c144132e35d608fa630784dbbDaniel Dunbar        CPUName = Args.MakeArgString(CPU);
610f86feddbd5b13d2c144132e35d608fa630784dbbDaniel Dunbar    } else
611f86feddbd5b13d2c144132e35d608fa630784dbbDaniel Dunbar      CPUName = A->getValue(Args);
612f86feddbd5b13d2c144132e35d608fa630784dbbDaniel Dunbar  }
6136acda16e9c194dcbd0dea64341e182bdb65d0f41Daniel Dunbar
614f86feddbd5b13d2c144132e35d608fa630784dbbDaniel Dunbar  // Select the default CPU if none was given (or detection failed).
615f86feddbd5b13d2c144132e35d608fa630784dbbDaniel Dunbar  if (!CPUName) {
6166acda16e9c194dcbd0dea64341e182bdb65d0f41Daniel Dunbar    // FIXME: Need target hooks.
617f22d1fd96d6056a2f271b0f7353b31f47547127bBenjamin Kramer    if (getToolChain().getOS().startswith("darwin")) {
6186acda16e9c194dcbd0dea64341e182bdb65d0f41Daniel Dunbar      if (getToolChain().getArchName() == "x86_64")
619f86feddbd5b13d2c144132e35d608fa630784dbbDaniel Dunbar        CPUName = "core2";
6206acda16e9c194dcbd0dea64341e182bdb65d0f41Daniel Dunbar      else if (getToolChain().getArchName() == "i386")
621f86feddbd5b13d2c144132e35d608fa630784dbbDaniel Dunbar        CPUName = "yonah";
6226acda16e9c194dcbd0dea64341e182bdb65d0f41Daniel Dunbar    } else {
6236acda16e9c194dcbd0dea64341e182bdb65d0f41Daniel Dunbar      if (getToolChain().getArchName() == "x86_64")
624f86feddbd5b13d2c144132e35d608fa630784dbbDaniel Dunbar        CPUName = "x86-64";
6256acda16e9c194dcbd0dea64341e182bdb65d0f41Daniel Dunbar      else if (getToolChain().getArchName() == "i386")
626f86feddbd5b13d2c144132e35d608fa630784dbbDaniel Dunbar        CPUName = "pentium4";
6276acda16e9c194dcbd0dea64341e182bdb65d0f41Daniel Dunbar    }
6286acda16e9c194dcbd0dea64341e182bdb65d0f41Daniel Dunbar  }
6296acda16e9c194dcbd0dea64341e182bdb65d0f41Daniel Dunbar
630f86feddbd5b13d2c144132e35d608fa630784dbbDaniel Dunbar  if (CPUName) {
63138b48afd338d494099697d2611e1f45e558e469eDaniel Dunbar    CmdArgs.push_back("-target-cpu");
632f86feddbd5b13d2c144132e35d608fa630784dbbDaniel Dunbar    CmdArgs.push_back(CPUName);
633f86feddbd5b13d2c144132e35d608fa630784dbbDaniel Dunbar  }
634f86feddbd5b13d2c144132e35d608fa630784dbbDaniel Dunbar
635cdd9686b890ebdc10039ae256ef4c9dfb5ebacb7Daniel Dunbar  for (arg_iterator it = Args.filtered_begin(options::OPT_m_x86_Features_Group),
636cdd9686b890ebdc10039ae256ef4c9dfb5ebacb7Daniel Dunbar         ie = Args.filtered_end(); it != ie; ++it) {
637cdd9686b890ebdc10039ae256ef4c9dfb5ebacb7Daniel Dunbar    llvm::StringRef Name = it->getOption().getName();
638cdd9686b890ebdc10039ae256ef4c9dfb5ebacb7Daniel Dunbar    it->claim();
6396acda16e9c194dcbd0dea64341e182bdb65d0f41Daniel Dunbar
640cdd9686b890ebdc10039ae256ef4c9dfb5ebacb7Daniel Dunbar    // Skip over "-m".
641cdd9686b890ebdc10039ae256ef4c9dfb5ebacb7Daniel Dunbar    assert(Name.startswith("-m") && "Invalid feature name.");
642cdd9686b890ebdc10039ae256ef4c9dfb5ebacb7Daniel Dunbar    Name = Name.substr(2);
6436acda16e9c194dcbd0dea64341e182bdb65d0f41Daniel Dunbar
644cdd9686b890ebdc10039ae256ef4c9dfb5ebacb7Daniel Dunbar    bool IsNegative = Name.startswith("no-");
645cdd9686b890ebdc10039ae256ef4c9dfb5ebacb7Daniel Dunbar    if (IsNegative)
646cdd9686b890ebdc10039ae256ef4c9dfb5ebacb7Daniel Dunbar      Name = Name.substr(3);
6476acda16e9c194dcbd0dea64341e182bdb65d0f41Daniel Dunbar
648cdd9686b890ebdc10039ae256ef4c9dfb5ebacb7Daniel Dunbar    CmdArgs.push_back("-target-feature");
649cdd9686b890ebdc10039ae256ef4c9dfb5ebacb7Daniel Dunbar    CmdArgs.push_back(Args.MakeArgString((IsNegative ? "-" : "+") + Name));
6506acda16e9c194dcbd0dea64341e182bdb65d0f41Daniel Dunbar  }
6516acda16e9c194dcbd0dea64341e182bdb65d0f41Daniel Dunbar}
6526acda16e9c194dcbd0dea64341e182bdb65d0f41Daniel Dunbar
65385caf03ee49c4de87ee9624a9b725ef5d20ee624Fariborz Jahanianstatic bool needsExceptions(const ArgList &Args,  types::ID InputType,
65485caf03ee49c4de87ee9624a9b725ef5d20ee624Fariborz Jahanian                            const llvm::Triple &Triple) {
655f759df06d997050559fd925758bcd2cdef24db05Rafael Espindola  if (Arg *A = Args.getLastArg(options::OPT_fexceptions,
656f759df06d997050559fd925758bcd2cdef24db05Rafael Espindola                               options::OPT_fno_exceptions)) {
657f759df06d997050559fd925758bcd2cdef24db05Rafael Espindola    if (A->getOption().matches(options::OPT_fexceptions))
658f759df06d997050559fd925758bcd2cdef24db05Rafael Espindola      return true;
659f759df06d997050559fd925758bcd2cdef24db05Rafael Espindola    else
660f759df06d997050559fd925758bcd2cdef24db05Rafael Espindola      return false;
661f759df06d997050559fd925758bcd2cdef24db05Rafael Espindola  }
662f759df06d997050559fd925758bcd2cdef24db05Rafael Espindola  switch (InputType) {
663f759df06d997050559fd925758bcd2cdef24db05Rafael Espindola  case types::TY_CXX: case types::TY_CXXHeader:
664f759df06d997050559fd925758bcd2cdef24db05Rafael Espindola  case types::TY_PP_CXX: case types::TY_PP_CXXHeader:
665f759df06d997050559fd925758bcd2cdef24db05Rafael Espindola  case types::TY_ObjCXX: case types::TY_ObjCXXHeader:
666f759df06d997050559fd925758bcd2cdef24db05Rafael Espindola  case types::TY_PP_ObjCXX: case types::TY_PP_ObjCXXHeader:
667f759df06d997050559fd925758bcd2cdef24db05Rafael Espindola    return true;
66885caf03ee49c4de87ee9624a9b725ef5d20ee624Fariborz Jahanian
669f759df06d997050559fd925758bcd2cdef24db05Rafael Espindola  case types::TY_ObjC: case types::TY_ObjCHeader:
670f759df06d997050559fd925758bcd2cdef24db05Rafael Espindola  case types::TY_PP_ObjC: case types::TY_PP_ObjCHeader:
671f759df06d997050559fd925758bcd2cdef24db05Rafael Espindola    if (Args.hasArg(options::OPT_fobjc_nonfragile_abi))
672f759df06d997050559fd925758bcd2cdef24db05Rafael Espindola      return true;
67385caf03ee49c4de87ee9624a9b725ef5d20ee624Fariborz Jahanian    if (Triple.getOS() != llvm::Triple::Darwin)
674f759df06d997050559fd925758bcd2cdef24db05Rafael Espindola      return false;
67585caf03ee49c4de87ee9624a9b725ef5d20ee624Fariborz Jahanian    return (Triple.getDarwinMajorNumber() >= 9 &&
67685caf03ee49c4de87ee9624a9b725ef5d20ee624Fariborz Jahanian            Triple.getArch() == llvm::Triple::x86_64);
67785caf03ee49c4de87ee9624a9b725ef5d20ee624Fariborz Jahanian
678f759df06d997050559fd925758bcd2cdef24db05Rafael Espindola  default:
679f759df06d997050559fd925758bcd2cdef24db05Rafael Espindola    return false;
680f759df06d997050559fd925758bcd2cdef24db05Rafael Espindola  }
681f759df06d997050559fd925758bcd2cdef24db05Rafael Espindola}
682f759df06d997050559fd925758bcd2cdef24db05Rafael Espindola
683dd4fe00f03d8749b283948ea86aa1e4a53ed21abDaniel Dunbar/// getEffectiveClangTriple - Get the "effective" target triple, which is the
684dd4fe00f03d8749b283948ea86aa1e4a53ed21abDaniel Dunbar/// triple for the target but with the OS version potentially modified for
685dd4fe00f03d8749b283948ea86aa1e4a53ed21abDaniel Dunbar/// Darwin's -mmacosx-version-min.
686dd4fe00f03d8749b283948ea86aa1e4a53ed21abDaniel Dunbarstatic std::string getEffectiveClangTriple(const Driver &D,
687dd4fe00f03d8749b283948ea86aa1e4a53ed21abDaniel Dunbar                                           const ToolChain &TC,
688dd4fe00f03d8749b283948ea86aa1e4a53ed21abDaniel Dunbar                                           const ArgList &Args) {
689dd4fe00f03d8749b283948ea86aa1e4a53ed21abDaniel Dunbar  llvm::Triple Triple(getLLVMTriple(TC, Args));
690dd4fe00f03d8749b283948ea86aa1e4a53ed21abDaniel Dunbar
691408fceda7a518ac25975fb6299c856bfaa753939Daniel Dunbar  // Handle -mmacosx-version-min and -miphoneos-version-min.
692dd4fe00f03d8749b283948ea86aa1e4a53ed21abDaniel Dunbar  if (Triple.getOS() != llvm::Triple::Darwin) {
693dd4fe00f03d8749b283948ea86aa1e4a53ed21abDaniel Dunbar    // Diagnose use of -mmacosx-version-min and -miphoneos-version-min on
694dd4fe00f03d8749b283948ea86aa1e4a53ed21abDaniel Dunbar    // non-Darwin.
695408fceda7a518ac25975fb6299c856bfaa753939Daniel Dunbar    if (Arg *A = Args.getLastArg(options::OPT_mmacosx_version_min_EQ,
696408fceda7a518ac25975fb6299c856bfaa753939Daniel Dunbar                                 options::OPT_miphoneos_version_min_EQ))
697408fceda7a518ac25975fb6299c856bfaa753939Daniel Dunbar      D.Diag(clang::diag::err_drv_clang_unsupported) << A->getAsString(Args);
69821ae3196c9677a79523d294f9a62a4788ba40694Daniel Dunbar  } else {
699408fceda7a518ac25975fb6299c856bfaa753939Daniel Dunbar    const toolchains::Darwin &DarwinTC(
700408fceda7a518ac25975fb6299c856bfaa753939Daniel Dunbar      reinterpret_cast<const toolchains::Darwin&>(TC));
70103d87ee556f9e11ab83f6d2f80c9ee92e3667301Daniel Dunbar
70203d87ee556f9e11ab83f6d2f80c9ee92e3667301Daniel Dunbar    // If the target isn't initialized (e.g., an unknown Darwin platform, return
70303d87ee556f9e11ab83f6d2f80c9ee92e3667301Daniel Dunbar    // the default triple).
70403d87ee556f9e11ab83f6d2f80c9ee92e3667301Daniel Dunbar    if (!DarwinTC.isTargetInitialized())
70503d87ee556f9e11ab83f6d2f80c9ee92e3667301Daniel Dunbar      return Triple.getTriple();
70603d87ee556f9e11ab83f6d2f80c9ee92e3667301Daniel Dunbar
707408fceda7a518ac25975fb6299c856bfaa753939Daniel Dunbar    unsigned Version[3];
708408fceda7a518ac25975fb6299c856bfaa753939Daniel Dunbar    DarwinTC.getTargetVersion(Version);
70921ae3196c9677a79523d294f9a62a4788ba40694Daniel Dunbar
71021ae3196c9677a79523d294f9a62a4788ba40694Daniel Dunbar    // Mangle the target version into the OS triple component.  For historical
71121ae3196c9677a79523d294f9a62a4788ba40694Daniel Dunbar    // reasons that make little sense, the version passed here is the "darwin"
71221ae3196c9677a79523d294f9a62a4788ba40694Daniel Dunbar    // version, which drops the 10 and offsets by 4. See inverse code when
71321ae3196c9677a79523d294f9a62a4788ba40694Daniel Dunbar    // setting the OS version preprocessor define.
714408fceda7a518ac25975fb6299c856bfaa753939Daniel Dunbar    if (!DarwinTC.isTargetIPhoneOS()) {
715408fceda7a518ac25975fb6299c856bfaa753939Daniel Dunbar      Version[0] = Version[1] + 4;
716408fceda7a518ac25975fb6299c856bfaa753939Daniel Dunbar      Version[1] = Version[2];
717408fceda7a518ac25975fb6299c856bfaa753939Daniel Dunbar      Version[2] = 0;
718408fceda7a518ac25975fb6299c856bfaa753939Daniel Dunbar    } else {
719408fceda7a518ac25975fb6299c856bfaa753939Daniel Dunbar      // Use the environment to communicate that we are targetting iPhoneOS.
720408fceda7a518ac25975fb6299c856bfaa753939Daniel Dunbar      Triple.setEnvironmentName("iphoneos");
72121ae3196c9677a79523d294f9a62a4788ba40694Daniel Dunbar    }
722dd4fe00f03d8749b283948ea86aa1e4a53ed21abDaniel Dunbar
723dd4fe00f03d8749b283948ea86aa1e4a53ed21abDaniel Dunbar    llvm::SmallString<16> Str;
724408fceda7a518ac25975fb6299c856bfaa753939Daniel Dunbar    llvm::raw_svector_ostream(Str) << "darwin" << Version[0]
725408fceda7a518ac25975fb6299c856bfaa753939Daniel Dunbar                                   << "." << Version[1] << "." << Version[2];
726dd4fe00f03d8749b283948ea86aa1e4a53ed21abDaniel Dunbar    Triple.setOSName(Str.str());
727dd4fe00f03d8749b283948ea86aa1e4a53ed21abDaniel Dunbar  }
728dd4fe00f03d8749b283948ea86aa1e4a53ed21abDaniel Dunbar
729dd4fe00f03d8749b283948ea86aa1e4a53ed21abDaniel Dunbar  return Triple.getTriple();
730dd4fe00f03d8749b283948ea86aa1e4a53ed21abDaniel Dunbar}
731dd4fe00f03d8749b283948ea86aa1e4a53ed21abDaniel Dunbar
73247ac7d27c44bd64a7d0fc03d4babc196cf2b8230Daniel Dunbarvoid Clang::ConstructJob(Compilation &C, const JobAction &JA,
733871adcf4e41285e3f4c3b62eaa1b2e05b60b92daDaniel Dunbar                         Job &Dest,
734871adcf4e41285e3f4c3b62eaa1b2e05b60b92daDaniel Dunbar                         const InputInfo &Output,
73562cf601812e03dd9bc5df42b8ef06a0cdedc38bfDaniel Dunbar                         const InputInfoList &Inputs,
7361d46033f760ba5fd266ce59fe391fac473f04f52Daniel Dunbar                         const ArgList &Args,
73747ac7d27c44bd64a7d0fc03d4babc196cf2b8230Daniel Dunbar                         const char *LinkingOutput) const {
7380a80ba74ffa3d3df55abfbc4474d7470c7c923e3Daniel Dunbar  bool KernelOrKext = Args.hasArg(options::OPT_mkernel,
7390a80ba74ffa3d3df55abfbc4474d7470c7c923e3Daniel Dunbar                                  options::OPT_fapple_kext);
740ee788e70fcd0adf76103b17c78ac658d4ea30c9bDaniel Dunbar  const Driver &D = getToolChain().getDriver();
741b488c1dac8e53206f07103d794a62a3f5012c0f4Daniel Dunbar  ArgStringList CmdArgs;
742b488c1dac8e53206f07103d794a62a3f5012c0f4Daniel Dunbar
743077ba6a3ac3628afb0d3c460e81ce013bccbdbedDaniel Dunbar  assert(Inputs.size() == 1 && "Unable to handle multiple inputs.");
744077ba6a3ac3628afb0d3c460e81ce013bccbdbedDaniel Dunbar
7458ff5b28d6efcffe2251e77634c7edf83a4763344Daniel Dunbar  // Invoke ourselves in -cc1 mode.
7468ff5b28d6efcffe2251e77634c7edf83a4763344Daniel Dunbar  //
7478ff5b28d6efcffe2251e77634c7edf83a4763344Daniel Dunbar  // FIXME: Implement custom jobs for internal actions.
7488ff5b28d6efcffe2251e77634c7edf83a4763344Daniel Dunbar  CmdArgs.push_back("-cc1");
7498ff5b28d6efcffe2251e77634c7edf83a4763344Daniel Dunbar
750dd4fe00f03d8749b283948ea86aa1e4a53ed21abDaniel Dunbar  // Add the "effective" target triple.
751af07f936b698575f2c91f1c1134c116f1ef0deddDaniel Dunbar  CmdArgs.push_back("-triple");
752dd4fe00f03d8749b283948ea86aa1e4a53ed21abDaniel Dunbar  std::string TripleStr = getEffectiveClangTriple(D, getToolChain(), Args);
753dd4fe00f03d8749b283948ea86aa1e4a53ed21abDaniel Dunbar  CmdArgs.push_back(Args.MakeArgString(TripleStr));
754728a512753d85a6ccaae34e81385c8665c2de0e1Daniel Dunbar
755dd4fe00f03d8749b283948ea86aa1e4a53ed21abDaniel Dunbar  // Select the appropriate action.
7561d46033f760ba5fd266ce59fe391fac473f04f52Daniel Dunbar  if (isa<AnalyzeJobAction>(JA)) {
7571d46033f760ba5fd266ce59fe391fac473f04f52Daniel Dunbar    assert(JA.getType() == types::TY_Plist && "Invalid output type.");
7581d46033f760ba5fd266ce59fe391fac473f04f52Daniel Dunbar    CmdArgs.push_back("-analyze");
7591d46033f760ba5fd266ce59fe391fac473f04f52Daniel Dunbar  } else if (isa<PreprocessJobAction>(JA)) {
760cd8e4c44dd068956e9181381be3ee2d49a0fac52Daniel Dunbar    if (Output.getType() == types::TY_Dependencies)
761cd8e4c44dd068956e9181381be3ee2d49a0fac52Daniel Dunbar      CmdArgs.push_back("-Eonly");
762cd8e4c44dd068956e9181381be3ee2d49a0fac52Daniel Dunbar    else
763cd8e4c44dd068956e9181381be3ee2d49a0fac52Daniel Dunbar      CmdArgs.push_back("-E");
7648767cbc475ed96397b6f08617814eeb9cab121bdDaniel Dunbar  } else if (isa<AssembleJobAction>(JA)) {
7658767cbc475ed96397b6f08617814eeb9cab121bdDaniel Dunbar    CmdArgs.push_back("-emit-obj");
7661d46033f760ba5fd266ce59fe391fac473f04f52Daniel Dunbar  } else if (isa<PrecompileJobAction>(JA)) {
7670ebd9321ba380471010341f24c874f46f56e7581Daniel Dunbar    // Use PCH if the user requested it, except for C++ (for now).
7680ebd9321ba380471010341f24c874f46f56e7581Daniel Dunbar    bool UsePCH = D.CCCUsePCH;
7690ebd9321ba380471010341f24c874f46f56e7581Daniel Dunbar    if (types::isCXX(Inputs[0].getType()))
7700ebd9321ba380471010341f24c874f46f56e7581Daniel Dunbar      UsePCH = false;
7710ebd9321ba380471010341f24c874f46f56e7581Daniel Dunbar
7720ebd9321ba380471010341f24c874f46f56e7581Daniel Dunbar    if (UsePCH)
773df91ef3d6c55692a0236f67b6c6b134a3bf84098Douglas Gregor      CmdArgs.push_back("-emit-pch");
774df91ef3d6c55692a0236f67b6c6b134a3bf84098Douglas Gregor    else
775df91ef3d6c55692a0236f67b6c6b134a3bf84098Douglas Gregor      CmdArgs.push_back("-emit-pth");
7761d46033f760ba5fd266ce59fe391fac473f04f52Daniel Dunbar  } else {
7771d46033f760ba5fd266ce59fe391fac473f04f52Daniel Dunbar    assert(isa<CompileJobAction>(JA) && "Invalid action for clang tool.");
778c21c485b4fb58ef5d55cf3e523263dd824a2ace4Daniel Dunbar
7791d46033f760ba5fd266ce59fe391fac473f04f52Daniel Dunbar    if (JA.getType() == types::TY_Nothing) {
7801d46033f760ba5fd266ce59fe391fac473f04f52Daniel Dunbar      CmdArgs.push_back("-fsyntax-only");
7811d46033f760ba5fd266ce59fe391fac473f04f52Daniel Dunbar    } else if (JA.getType() == types::TY_LLVMAsm) {
7821d46033f760ba5fd266ce59fe391fac473f04f52Daniel Dunbar      CmdArgs.push_back("-emit-llvm");
7831d46033f760ba5fd266ce59fe391fac473f04f52Daniel Dunbar    } else if (JA.getType() == types::TY_LLVMBC) {
7841d46033f760ba5fd266ce59fe391fac473f04f52Daniel Dunbar      CmdArgs.push_back("-emit-llvm-bc");
7851d46033f760ba5fd266ce59fe391fac473f04f52Daniel Dunbar    } else if (JA.getType() == types::TY_PP_Asm) {
786e3b8d07e02861d245612b02b5f5a2c1f34b2a394Daniel Dunbar      CmdArgs.push_back("-S");
7875915fbf310e171c4cd3c2af05e9de360c0fa988aDaniel Dunbar    } else if (JA.getType() == types::TY_AST) {
7885915fbf310e171c4cd3c2af05e9de360c0fa988aDaniel Dunbar      CmdArgs.push_back("-emit-pch");
78964952508c2b0c8bffb45c8b410f0af3d2457f59bDaniel Dunbar    } else if (JA.getType() == types::TY_RewrittenObjC) {
79064952508c2b0c8bffb45c8b410f0af3d2457f59bDaniel Dunbar      CmdArgs.push_back("-rewrite-objc");
79164952508c2b0c8bffb45c8b410f0af3d2457f59bDaniel Dunbar    } else {
79264952508c2b0c8bffb45c8b410f0af3d2457f59bDaniel Dunbar      assert(JA.getType() == types::TY_PP_Asm &&
79364952508c2b0c8bffb45c8b410f0af3d2457f59bDaniel Dunbar             "Unexpected output type!");
7941d46033f760ba5fd266ce59fe391fac473f04f52Daniel Dunbar    }
7951d46033f760ba5fd266ce59fe391fac473f04f52Daniel Dunbar  }
7961d46033f760ba5fd266ce59fe391fac473f04f52Daniel Dunbar
7971d46033f760ba5fd266ce59fe391fac473f04f52Daniel Dunbar  // The make clang go fast button.
7981d46033f760ba5fd266ce59fe391fac473f04f52Daniel Dunbar  CmdArgs.push_back("-disable-free");
7991d46033f760ba5fd266ce59fe391fac473f04f52Daniel Dunbar
800b689afb75049012a431d483432114ad5e75d4a92John McCall  // Disable the verification pass in -asserts builds.
801b689afb75049012a431d483432114ad5e75d4a92John McCall#ifdef NDEBUG
802b689afb75049012a431d483432114ad5e75d4a92John McCall  CmdArgs.push_back("-disable-llvm-verifier");
803b689afb75049012a431d483432114ad5e75d4a92John McCall#endif
804b689afb75049012a431d483432114ad5e75d4a92John McCall
805c9abc043af88f90d177a5bd147f627b78ca49fdeDaniel Dunbar  // Set the main file name, so that debug info works even with
806c9abc043af88f90d177a5bd147f627b78ca49fdeDaniel Dunbar  // -save-temps.
807c9abc043af88f90d177a5bd147f627b78ca49fdeDaniel Dunbar  CmdArgs.push_back("-main-file-name");
808c9abc043af88f90d177a5bd147f627b78ca49fdeDaniel Dunbar  CmdArgs.push_back(darwin::CC1::getBaseInputName(Args, Inputs));
809c9abc043af88f90d177a5bd147f627b78ca49fdeDaniel Dunbar
8103bbc75302fd43cf13d868b46c94ff8794b302e43Daniel Dunbar  // Some flags which affect the language (via preprocessor
8113bbc75302fd43cf13d868b46c94ff8794b302e43Daniel Dunbar  // defines). See darwin::CC1::AddCPPArgs.
8123bbc75302fd43cf13d868b46c94ff8794b302e43Daniel Dunbar  if (Args.hasArg(options::OPT_static))
8133bbc75302fd43cf13d868b46c94ff8794b302e43Daniel Dunbar    CmdArgs.push_back("-static-define");
8143bbc75302fd43cf13d868b46c94ff8794b302e43Daniel Dunbar
8151d46033f760ba5fd266ce59fe391fac473f04f52Daniel Dunbar  if (isa<AnalyzeJobAction>(JA)) {
816b8bb3e797c5687715c6d9d960ee573e4d0e62230Ted Kremenek    // Enable region store model by default.
817b8bb3e797c5687715c6d9d960ee573e4d0e62230Ted Kremenek    CmdArgs.push_back("-analyzer-store=region");
818b8bb3e797c5687715c6d9d960ee573e4d0e62230Ted Kremenek
819b40d06dec23b53bbc1157a9adae7f887be31aa3bTed Kremenek    // Treat blocks as analysis entry points.
820b40d06dec23b53bbc1157a9adae7f887be31aa3bTed Kremenek    CmdArgs.push_back("-analyzer-opt-analyze-nested-blocks");
821b40d06dec23b53bbc1157a9adae7f887be31aa3bTed Kremenek
8221d46033f760ba5fd266ce59fe391fac473f04f52Daniel Dunbar    // Add default argument set.
823d8fc0f2e7751cf31cec5c2f3cc6a0b447e9debb3Daniel Dunbar    if (!Args.hasArg(options::OPT__analyzer_no_default_checks)) {
824cd9902bfb79c5c67559360514951714bdafac36eTed Kremenek      CmdArgs.push_back("-analyzer-check-dead-stores");
825fb3f893bc58071e548c97a3d667c8ab9b0c38cfbTed Kremenek      CmdArgs.push_back("-analyzer-check-security-syntactic");
826565e465c6d0093f1bf8414b2cabdc842022385a9Ted Kremenek      CmdArgs.push_back("-analyzer-check-objc-mem");
827d8fc0f2e7751cf31cec5c2f3cc6a0b447e9debb3Daniel Dunbar      CmdArgs.push_back("-analyzer-eagerly-assume");
828fa15be4cf95b7ed2d1df583497b16a6f897cf789Ted Kremenek      CmdArgs.push_back("-analyzer-check-objc-methodsigs");
829d8fc0f2e7751cf31cec5c2f3cc6a0b447e9debb3Daniel Dunbar      // Do not enable the missing -dealloc check.
8307909fc8833e734aac521d7d6945bd823d75150acTed Kremenek      // '-analyzer-check-objc-missing-dealloc',
8312ade536f6815bf6ff128333520232c3b0e701146Ted Kremenek      CmdArgs.push_back("-analyzer-check-objc-unused-ivars");
832d8fc0f2e7751cf31cec5c2f3cc6a0b447e9debb3Daniel Dunbar    }
833d8fc0f2e7751cf31cec5c2f3cc6a0b447e9debb3Daniel Dunbar
834d8fc0f2e7751cf31cec5c2f3cc6a0b447e9debb3Daniel Dunbar    // Set the output format. The default is plist, for (lame) historical
835d8fc0f2e7751cf31cec5c2f3cc6a0b447e9debb3Daniel Dunbar    // reasons.
836d8fc0f2e7751cf31cec5c2f3cc6a0b447e9debb3Daniel Dunbar    CmdArgs.push_back("-analyzer-output");
837d8fc0f2e7751cf31cec5c2f3cc6a0b447e9debb3Daniel Dunbar    if (Arg *A = Args.getLastArg(options::OPT__analyzer_output))
838d8fc0f2e7751cf31cec5c2f3cc6a0b447e9debb3Daniel Dunbar      CmdArgs.push_back(A->getValue(Args));
839d8fc0f2e7751cf31cec5c2f3cc6a0b447e9debb3Daniel Dunbar    else
840d8fc0f2e7751cf31cec5c2f3cc6a0b447e9debb3Daniel Dunbar      CmdArgs.push_back("plist");
8411d46033f760ba5fd266ce59fe391fac473f04f52Daniel Dunbar
8420647a7b9ad844565b8a4b5e1a5de882dd64efabfTed Kremenek    // Disable the presentation of standard compiler warnings when
8430647a7b9ad844565b8a4b5e1a5de882dd64efabfTed Kremenek    // using --analyze.  We only want to show static analyzer diagnostics
8440647a7b9ad844565b8a4b5e1a5de882dd64efabfTed Kremenek    // or frontend errors.
8450647a7b9ad844565b8a4b5e1a5de882dd64efabfTed Kremenek    CmdArgs.push_back("-w");
8460647a7b9ad844565b8a4b5e1a5de882dd64efabfTed Kremenek
8471d46033f760ba5fd266ce59fe391fac473f04f52Daniel Dunbar    // Add -Xanalyzer arguments when running as analyzer.
8481d46033f760ba5fd266ce59fe391fac473f04f52Daniel Dunbar    Args.AddAllArgValues(CmdArgs, options::OPT_Xanalyzer);
8491eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump  }
8501eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump
851e2fd66418eca3d70cf6b62087d745d0c5181db69Daniel Dunbar  CheckCodeGenerationOptions(D, Args);
852e2fd66418eca3d70cf6b62087d745d0c5181db69Daniel Dunbar
853bc85be85779a47bae728bbe6a2cd2e3732b1333dDaniel Dunbar  // Perform argument translation for LLVM backend. This
854bc85be85779a47bae728bbe6a2cd2e3732b1333dDaniel Dunbar  // takes some care in reconciling with llvm-gcc. The
855bc85be85779a47bae728bbe6a2cd2e3732b1333dDaniel Dunbar  // issue is that llvm-gcc translates these options based on
856bc85be85779a47bae728bbe6a2cd2e3732b1333dDaniel Dunbar  // the values in cc1, whereas we are processing based on
857bc85be85779a47bae728bbe6a2cd2e3732b1333dDaniel Dunbar  // the driver arguments.
8589fd0b1f845a61e71dd8099f596532d34c519630aDaniel Dunbar
859bc85be85779a47bae728bbe6a2cd2e3732b1333dDaniel Dunbar  // This comes from the default translation the driver + cc1
860bc85be85779a47bae728bbe6a2cd2e3732b1333dDaniel Dunbar  // would do to enable flag_pic.
861bc85be85779a47bae728bbe6a2cd2e3732b1333dDaniel Dunbar  //
862bc85be85779a47bae728bbe6a2cd2e3732b1333dDaniel Dunbar  // FIXME: Centralize this code.
863bc85be85779a47bae728bbe6a2cd2e3732b1333dDaniel Dunbar  bool PICEnabled = (Args.hasArg(options::OPT_fPIC) ||
864bc85be85779a47bae728bbe6a2cd2e3732b1333dDaniel Dunbar                     Args.hasArg(options::OPT_fpic) ||
865bc85be85779a47bae728bbe6a2cd2e3732b1333dDaniel Dunbar                     Args.hasArg(options::OPT_fPIE) ||
866bc85be85779a47bae728bbe6a2cd2e3732b1333dDaniel Dunbar                     Args.hasArg(options::OPT_fpie));
867bc85be85779a47bae728bbe6a2cd2e3732b1333dDaniel Dunbar  bool PICDisabled = (Args.hasArg(options::OPT_mkernel) ||
868bc85be85779a47bae728bbe6a2cd2e3732b1333dDaniel Dunbar                      Args.hasArg(options::OPT_static));
869bc85be85779a47bae728bbe6a2cd2e3732b1333dDaniel Dunbar  const char *Model = getToolChain().GetForcedPicModel();
870bc85be85779a47bae728bbe6a2cd2e3732b1333dDaniel Dunbar  if (!Model) {
871bc85be85779a47bae728bbe6a2cd2e3732b1333dDaniel Dunbar    if (Args.hasArg(options::OPT_mdynamic_no_pic))
872bc85be85779a47bae728bbe6a2cd2e3732b1333dDaniel Dunbar      Model = "dynamic-no-pic";
873bc85be85779a47bae728bbe6a2cd2e3732b1333dDaniel Dunbar    else if (PICDisabled)
874bc85be85779a47bae728bbe6a2cd2e3732b1333dDaniel Dunbar      Model = "static";
875bc85be85779a47bae728bbe6a2cd2e3732b1333dDaniel Dunbar    else if (PICEnabled)
876bc85be85779a47bae728bbe6a2cd2e3732b1333dDaniel Dunbar      Model = "pic";
8771d46033f760ba5fd266ce59fe391fac473f04f52Daniel Dunbar    else
878bc85be85779a47bae728bbe6a2cd2e3732b1333dDaniel Dunbar      Model = getToolChain().GetDefaultRelocationModel();
879bc85be85779a47bae728bbe6a2cd2e3732b1333dDaniel Dunbar  }
880f219e7c1529fac29e34483667f740b452e5ef9ccDaniel Dunbar  if (llvm::StringRef(Model) != "pic") {
881f219e7c1529fac29e34483667f740b452e5ef9ccDaniel Dunbar    CmdArgs.push_back("-mrelocation-model");
882f219e7c1529fac29e34483667f740b452e5ef9ccDaniel Dunbar    CmdArgs.push_back(Model);
883f219e7c1529fac29e34483667f740b452e5ef9ccDaniel Dunbar  }
8841d46033f760ba5fd266ce59fe391fac473f04f52Daniel Dunbar
885bc85be85779a47bae728bbe6a2cd2e3732b1333dDaniel Dunbar  // Infer the __PIC__ value.
886bc85be85779a47bae728bbe6a2cd2e3732b1333dDaniel Dunbar  //
887bc85be85779a47bae728bbe6a2cd2e3732b1333dDaniel Dunbar  // FIXME:  This isn't quite right on Darwin, which always sets
888bc85be85779a47bae728bbe6a2cd2e3732b1333dDaniel Dunbar  // __PIC__=2.
889bc85be85779a47bae728bbe6a2cd2e3732b1333dDaniel Dunbar  if (strcmp(Model, "pic") == 0 || strcmp(Model, "dynamic-no-pic") == 0) {
8907674352cf3e8f699914a2f739f1ae8c8c3480813Daniel Dunbar    CmdArgs.push_back("-pic-level");
8917674352cf3e8f699914a2f739f1ae8c8c3480813Daniel Dunbar    CmdArgs.push_back(Args.hasArg(options::OPT_fPIC) ? "2" : "1");
892bc85be85779a47bae728bbe6a2cd2e3732b1333dDaniel Dunbar  }
893f219e7c1529fac29e34483667f740b452e5ef9ccDaniel Dunbar  if (!Args.hasFlag(options::OPT_fmerge_all_constants,
894f219e7c1529fac29e34483667f740b452e5ef9ccDaniel Dunbar                    options::OPT_fno_merge_all_constants))
895f219e7c1529fac29e34483667f740b452e5ef9ccDaniel Dunbar    CmdArgs.push_back("-no-merge-all-constants");
896f219e7c1529fac29e34483667f740b452e5ef9ccDaniel Dunbar
897f219e7c1529fac29e34483667f740b452e5ef9ccDaniel Dunbar  // LLVM Code Generator Options.
8981d46033f760ba5fd266ce59fe391fac473f04f52Daniel Dunbar
899bc85be85779a47bae728bbe6a2cd2e3732b1333dDaniel Dunbar  // FIXME: Set --enable-unsafe-fp-math.
90021656ddae8e81df04f142386337cb95a9e0f0971Benjamin Kramer  if (Args.hasFlag(options::OPT_fno_omit_frame_pointer,
90121656ddae8e81df04f142386337cb95a9e0f0971Benjamin Kramer                   options::OPT_fomit_frame_pointer))
902f219e7c1529fac29e34483667f740b452e5ef9ccDaniel Dunbar    CmdArgs.push_back("-mdisable-fp-elim");
903bc85be85779a47bae728bbe6a2cd2e3732b1333dDaniel Dunbar  if (!Args.hasFlag(options::OPT_fzero_initialized_in_bss,
904f219e7c1529fac29e34483667f740b452e5ef9ccDaniel Dunbar                    options::OPT_fno_zero_initialized_in_bss))
905f219e7c1529fac29e34483667f740b452e5ef9ccDaniel Dunbar    CmdArgs.push_back("-mno-zero-initialized-in-bss");
906bc85be85779a47bae728bbe6a2cd2e3732b1333dDaniel Dunbar  if (Args.hasArg(options::OPT_dA) || Args.hasArg(options::OPT_fverbose_asm))
907f219e7c1529fac29e34483667f740b452e5ef9ccDaniel Dunbar    CmdArgs.push_back("-masm-verbose");
908f219e7c1529fac29e34483667f740b452e5ef9ccDaniel Dunbar  if (Args.hasArg(options::OPT_fdebug_pass_structure)) {
909f219e7c1529fac29e34483667f740b452e5ef9ccDaniel Dunbar    CmdArgs.push_back("-mdebug-pass");
910f219e7c1529fac29e34483667f740b452e5ef9ccDaniel Dunbar    CmdArgs.push_back("Structure");
911f219e7c1529fac29e34483667f740b452e5ef9ccDaniel Dunbar  }
912f219e7c1529fac29e34483667f740b452e5ef9ccDaniel Dunbar  if (Args.hasArg(options::OPT_fdebug_pass_arguments)) {
913f219e7c1529fac29e34483667f740b452e5ef9ccDaniel Dunbar    CmdArgs.push_back("-mdebug-pass");
914f219e7c1529fac29e34483667f740b452e5ef9ccDaniel Dunbar    CmdArgs.push_back("Arguments");
915f219e7c1529fac29e34483667f740b452e5ef9ccDaniel Dunbar  }
9166bea73b3305a03479589e2642fbdcf6c096851aaDaniel Dunbar
917d0c2ec44e093011256b6a0f57d455f36dffdea70John McCall  // Enable -mconstructor-aliases except on darwin, where we have to
918d0c2ec44e093011256b6a0f57d455f36dffdea70John McCall  // work around a linker bug;  see <rdar://problem/7651567>.
919d0c2ec44e093011256b6a0f57d455f36dffdea70John McCall  if (getToolChain().getTriple().getOS() != llvm::Triple::Darwin)
920d0c2ec44e093011256b6a0f57d455f36dffdea70John McCall    CmdArgs.push_back("-mconstructor-aliases");
921d0c2ec44e093011256b6a0f57d455f36dffdea70John McCall
9226bea73b3305a03479589e2642fbdcf6c096851aaDaniel Dunbar  // This is a coarse approximation of what llvm-gcc actually does, both
9236bea73b3305a03479589e2642fbdcf6c096851aaDaniel Dunbar  // -fasynchronous-unwind-tables and -fnon-call-exceptions interact in more
9246bea73b3305a03479589e2642fbdcf6c096851aaDaniel Dunbar  // complicated ways.
9256bea73b3305a03479589e2642fbdcf6c096851aaDaniel Dunbar  bool AsynchronousUnwindTables =
9266bea73b3305a03479589e2642fbdcf6c096851aaDaniel Dunbar    Args.hasFlag(options::OPT_fasynchronous_unwind_tables,
9276bea73b3305a03479589e2642fbdcf6c096851aaDaniel Dunbar                 options::OPT_fno_asynchronous_unwind_tables,
9286bea73b3305a03479589e2642fbdcf6c096851aaDaniel Dunbar                 getToolChain().IsUnwindTablesDefault() &&
9290a80ba74ffa3d3df55abfbc4474d7470c7c923e3Daniel Dunbar                 !KernelOrKext);
9306bea73b3305a03479589e2642fbdcf6c096851aaDaniel Dunbar  if (Args.hasFlag(options::OPT_funwind_tables, options::OPT_fno_unwind_tables,
9316bea73b3305a03479589e2642fbdcf6c096851aaDaniel Dunbar                   AsynchronousUnwindTables))
932f219e7c1529fac29e34483667f740b452e5ef9ccDaniel Dunbar    CmdArgs.push_back("-munwind-tables");
933f219e7c1529fac29e34483667f740b452e5ef9ccDaniel Dunbar
934f219e7c1529fac29e34483667f740b452e5ef9ccDaniel Dunbar  if (Arg *A = Args.getLastArg(options::OPT_flimited_precision_EQ)) {
935f219e7c1529fac29e34483667f740b452e5ef9ccDaniel Dunbar    CmdArgs.push_back("-mlimit-float-precision");
936f219e7c1529fac29e34483667f740b452e5ef9ccDaniel Dunbar    CmdArgs.push_back(A->getValue(Args));
937f219e7c1529fac29e34483667f740b452e5ef9ccDaniel Dunbar  }
938bc85be85779a47bae728bbe6a2cd2e3732b1333dDaniel Dunbar
939868bd0aa9281929ef50d2e9a8c82a036906f53f5Daniel Dunbar  // FIXME: Handle -mtune=.
940868bd0aa9281929ef50d2e9a8c82a036906f53f5Daniel Dunbar  (void) Args.hasArg(options::OPT_mtune_EQ);
941bc85be85779a47bae728bbe6a2cd2e3732b1333dDaniel Dunbar
9428e9ef0d87dad25f02e5abc6facf528778236115aBenjamin Kramer  if (Arg *A = Args.getLastArg(options::OPT_mcmodel_EQ)) {
943f219e7c1529fac29e34483667f740b452e5ef9ccDaniel Dunbar    CmdArgs.push_back("-mcode-model");
9448e9ef0d87dad25f02e5abc6facf528778236115aBenjamin Kramer    CmdArgs.push_back(A->getValue(Args));
9458e9ef0d87dad25f02e5abc6facf528778236115aBenjamin Kramer  }
9468e9ef0d87dad25f02e5abc6facf528778236115aBenjamin Kramer
9476acda16e9c194dcbd0dea64341e182bdb65d0f41Daniel Dunbar  // Add target specific cpu and features flags.
9486acda16e9c194dcbd0dea64341e182bdb65d0f41Daniel Dunbar  switch(getToolChain().getTriple().getArch()) {
9496acda16e9c194dcbd0dea64341e182bdb65d0f41Daniel Dunbar  default:
9506acda16e9c194dcbd0dea64341e182bdb65d0f41Daniel Dunbar    break;
951868bd0aa9281929ef50d2e9a8c82a036906f53f5Daniel Dunbar
952b163ef7e7a5d904ef0962a7c38c460be083c4d63Daniel Dunbar  case llvm::Triple::arm:
953b163ef7e7a5d904ef0962a7c38c460be083c4d63Daniel Dunbar  case llvm::Triple::thumb:
954b163ef7e7a5d904ef0962a7c38c460be083c4d63Daniel Dunbar    AddARMTargetArgs(Args, CmdArgs);
955b163ef7e7a5d904ef0962a7c38c460be083c4d63Daniel Dunbar    break;
956b163ef7e7a5d904ef0962a7c38c460be083c4d63Daniel Dunbar
957ed734737d5af31906e30e537d4a41c760ddcfc59Eric Christopher  case llvm::Triple::mips:
958ed734737d5af31906e30e537d4a41c760ddcfc59Eric Christopher  case llvm::Triple::mipsel:
959ed734737d5af31906e30e537d4a41c760ddcfc59Eric Christopher    AddMIPSTargetArgs(Args, CmdArgs);
960ed734737d5af31906e30e537d4a41c760ddcfc59Eric Christopher    break;
961ed734737d5af31906e30e537d4a41c760ddcfc59Eric Christopher
9626acda16e9c194dcbd0dea64341e182bdb65d0f41Daniel Dunbar  case llvm::Triple::x86:
9636acda16e9c194dcbd0dea64341e182bdb65d0f41Daniel Dunbar  case llvm::Triple::x86_64:
9646acda16e9c194dcbd0dea64341e182bdb65d0f41Daniel Dunbar    AddX86TargetArgs(Args, CmdArgs);
9656acda16e9c194dcbd0dea64341e182bdb65d0f41Daniel Dunbar    break;
966bc85be85779a47bae728bbe6a2cd2e3732b1333dDaniel Dunbar  }
967c21c485b4fb58ef5d55cf3e523263dd824a2ace4Daniel Dunbar
968c31176d5ebbcd407aa512bbd5f717e35da629e7dDan Gohman  // -fno-math-errno is default.
969c31176d5ebbcd407aa512bbd5f717e35da629e7dDan Gohman  if (Args.hasFlag(options::OPT_fmath_errno,
970bc85be85779a47bae728bbe6a2cd2e3732b1333dDaniel Dunbar                   options::OPT_fno_math_errno,
971c31176d5ebbcd407aa512bbd5f717e35da629e7dDan Gohman                   false))
972c31176d5ebbcd407aa512bbd5f717e35da629e7dDan Gohman    CmdArgs.push_back("-fmath-errno");
9731d46033f760ba5fd266ce59fe391fac473f04f52Daniel Dunbar
974bc85be85779a47bae728bbe6a2cd2e3732b1333dDaniel Dunbar  Arg *Unsupported;
975bc85be85779a47bae728bbe6a2cd2e3732b1333dDaniel Dunbar  if ((Unsupported = Args.getLastArg(options::OPT_MG)) ||
9766feaf57b46f0856127c84b03f3aee5fb51d0262bTed Kremenek      (Unsupported = Args.getLastArg(options::OPT_iframework)) ||
9776feaf57b46f0856127c84b03f3aee5fb51d0262bTed Kremenek      (Unsupported = Args.getLastArg(options::OPT_fshort_enums)))
978e027a4b2399e9b0acfe0f77220c66bbe369067eeDaniel Dunbar    D.Diag(clang::diag::err_drv_clang_unsupported)
979bc85be85779a47bae728bbe6a2cd2e3732b1333dDaniel Dunbar      << Unsupported->getOption().getName();
980bc85be85779a47bae728bbe6a2cd2e3732b1333dDaniel Dunbar
9811d46033f760ba5fd266ce59fe391fac473f04f52Daniel Dunbar  Args.AddAllArgs(CmdArgs, options::OPT_v);
9821d46033f760ba5fd266ce59fe391fac473f04f52Daniel Dunbar  Args.AddLastArg(CmdArgs, options::OPT_P);
9831eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump  Args.AddLastArg(CmdArgs, options::OPT_print_ivar_layout);
9841d46033f760ba5fd266ce59fe391fac473f04f52Daniel Dunbar
9851d46033f760ba5fd266ce59fe391fac473f04f52Daniel Dunbar  // Special case debug options to only pass -g to clang. This is
9861d46033f760ba5fd266ce59fe391fac473f04f52Daniel Dunbar  // wrong.
98718f36d9eac8b425e8cfed389bbbf02c030f26be7Rafael Espindola  Args.ClaimAllArgs(options::OPT_g_Group);
98818f36d9eac8b425e8cfed389bbbf02c030f26be7Rafael Espindola  Arg *Garg = Args.getLastArg(options::OPT_g_Group);
98918f36d9eac8b425e8cfed389bbbf02c030f26be7Rafael Espindola  if (Garg && Garg != Args.getLastArg(options::OPT_g0))
9901d46033f760ba5fd266ce59fe391fac473f04f52Daniel Dunbar    CmdArgs.push_back("-g");
9911d46033f760ba5fd266ce59fe391fac473f04f52Daniel Dunbar
9921d46033f760ba5fd266ce59fe391fac473f04f52Daniel Dunbar  Args.AddLastArg(CmdArgs, options::OPT_nostdinc);
9934c2bcad7b843c10fd4a2ffd43da40bfefb4dc8baDouglas Gregor  Args.AddLastArg(CmdArgs, options::OPT_nostdincxx);
9948d737cc78cb28f39179d6c7ca00eb5d3cf563129Rafael Espindola  Args.AddLastArg(CmdArgs, options::OPT_nobuiltininc);
9951d46033f760ba5fd266ce59fe391fac473f04f52Daniel Dunbar
9965f12232ef39e3d6c36d6600a73ebbe3c4a79f514Daniel Dunbar  // Pass the path to compiler resource files.
9975f12232ef39e3d6c36d6600a73ebbe3c4a79f514Daniel Dunbar  CmdArgs.push_back("-resource-dir");
998225c41706dc0f3682236e351820d339e14390e00Daniel Dunbar  CmdArgs.push_back(D.ResourceDir.c_str());
9992ac9fc2ad64e16127df8c60caeea2edfe9a400a2Daniel Dunbar
1000c21c485b4fb58ef5d55cf3e523263dd824a2ace4Daniel Dunbar  // Add preprocessing options like -I, -D, etc. if we are using the
1001c21c485b4fb58ef5d55cf3e523263dd824a2ace4Daniel Dunbar  // preprocessor.
1002c21c485b4fb58ef5d55cf3e523263dd824a2ace4Daniel Dunbar  //
1003c21c485b4fb58ef5d55cf3e523263dd824a2ace4Daniel Dunbar  // FIXME: Support -fpreprocessed
1004c21c485b4fb58ef5d55cf3e523263dd824a2ace4Daniel Dunbar  types::ID InputType = Inputs[0].getType();
1005c21c485b4fb58ef5d55cf3e523263dd824a2ace4Daniel Dunbar  if (types::getPreprocessedType(InputType) != types::TY_INVALID)
1006df91ef3d6c55692a0236f67b6c6b134a3bf84098Douglas Gregor    AddPreprocessingOptions(D, Args, CmdArgs, Output, Inputs);
10071d46033f760ba5fd266ce59fe391fac473f04f52Daniel Dunbar
100820f0eacf1682e4594da9d318b5b13ed4f6d6e7e5Daniel Dunbar  // Manually translate -O to -O2 and -O4 to -O3; let clang reject
1009337a6271b98c4c183f7eaad1563a75260b4f2871Daniel Dunbar  // others.
1010337a6271b98c4c183f7eaad1563a75260b4f2871Daniel Dunbar  if (Arg *A = Args.getLastArg(options::OPT_O_Group)) {
1011b827a0541b5fd095fcdb7ad0c3df93ca158c619aDaniel Dunbar    if (A->getOption().matches(options::OPT_O4))
1012337a6271b98c4c183f7eaad1563a75260b4f2871Daniel Dunbar      CmdArgs.push_back("-O3");
1013337a6271b98c4c183f7eaad1563a75260b4f2871Daniel Dunbar    else if (A->getValue(Args)[0] == '\0')
101420f0eacf1682e4594da9d318b5b13ed4f6d6e7e5Daniel Dunbar      CmdArgs.push_back("-O2");
10151d46033f760ba5fd266ce59fe391fac473f04f52Daniel Dunbar    else
10165697aa0d75c87bafec78984048d558f8d12ca1b3Daniel Dunbar      A->render(Args, CmdArgs);
10171d46033f760ba5fd266ce59fe391fac473f04f52Daniel Dunbar  }
10181d46033f760ba5fd266ce59fe391fac473f04f52Daniel Dunbar
10196e8371eb97a08f724be22ae6042d1e9eacbe4c48Daniel Dunbar  Args.AddAllArgs(CmdArgs, options::OPT_W_Group);
10206e8371eb97a08f724be22ae6042d1e9eacbe4c48Daniel Dunbar  Args.AddLastArg(CmdArgs, options::OPT_pedantic);
10216e8371eb97a08f724be22ae6042d1e9eacbe4c48Daniel Dunbar  Args.AddLastArg(CmdArgs, options::OPT_pedantic_errors);
10221d46033f760ba5fd266ce59fe391fac473f04f52Daniel Dunbar  Args.AddLastArg(CmdArgs, options::OPT_w);
1023d573d26e1abcce24c31ece3d6f7af158db569e4cDaniel Dunbar
1024d573d26e1abcce24c31ece3d6f7af158db569e4cDaniel Dunbar  // Handle -{std, ansi, trigraphs} -- take the last of -{std, ansi}
1025d573d26e1abcce24c31ece3d6f7af158db569e4cDaniel Dunbar  // (-ansi is equivalent to -std=c89).
1026d573d26e1abcce24c31ece3d6f7af158db569e4cDaniel Dunbar  //
1027d573d26e1abcce24c31ece3d6f7af158db569e4cDaniel Dunbar  // If a std is supplied, only add -trigraphs if it follows the
1028d573d26e1abcce24c31ece3d6f7af158db569e4cDaniel Dunbar  // option.
1029d573d26e1abcce24c31ece3d6f7af158db569e4cDaniel Dunbar  if (Arg *Std = Args.getLastArg(options::OPT_std_EQ, options::OPT_ansi)) {
1030d573d26e1abcce24c31ece3d6f7af158db569e4cDaniel Dunbar    if (Std->getOption().matches(options::OPT_ansi))
1031528365d3189d27f3a90a4012baaa8b2814e0a231Nuno Lopes      if (types::isCXX(InputType))
1032294691eb1caf551083acd7b08630ef21c3fd760dDaniel Dunbar        CmdArgs.push_back("-std=c++98");
1033528365d3189d27f3a90a4012baaa8b2814e0a231Nuno Lopes      else
1034294691eb1caf551083acd7b08630ef21c3fd760dDaniel Dunbar        CmdArgs.push_back("-std=c89");
1035d573d26e1abcce24c31ece3d6f7af158db569e4cDaniel Dunbar    else
1036d573d26e1abcce24c31ece3d6f7af158db569e4cDaniel Dunbar      Std->render(Args, CmdArgs);
1037d573d26e1abcce24c31ece3d6f7af158db569e4cDaniel Dunbar
1038d573d26e1abcce24c31ece3d6f7af158db569e4cDaniel Dunbar    if (Arg *A = Args.getLastArg(options::OPT_trigraphs))
1039d573d26e1abcce24c31ece3d6f7af158db569e4cDaniel Dunbar      if (A->getIndex() > Std->getIndex())
1040d573d26e1abcce24c31ece3d6f7af158db569e4cDaniel Dunbar        A->render(Args, CmdArgs);
1041a3ff202ee4fb21728e930d5d029ba4925129912cDaniel Dunbar  } else {
1042a3ff202ee4fb21728e930d5d029ba4925129912cDaniel Dunbar    // Honor -std-default.
10434a5290e773e70ec2c3b4353a3a4aa7d1a3e3cd66Daniel Dunbar    //
10444a5290e773e70ec2c3b4353a3a4aa7d1a3e3cd66Daniel Dunbar    // FIXME: Clang doesn't correctly handle -std= when the input language
10454a5290e773e70ec2c3b4353a3a4aa7d1a3e3cd66Daniel Dunbar    // doesn't match. For the time being just ignore this for C++ inputs;
10464a5290e773e70ec2c3b4353a3a4aa7d1a3e3cd66Daniel Dunbar    // eventually we want to do all the standard defaulting here instead of
10474a5290e773e70ec2c3b4353a3a4aa7d1a3e3cd66Daniel Dunbar    // splitting it between the driver and clang -cc1.
10484a5290e773e70ec2c3b4353a3a4aa7d1a3e3cd66Daniel Dunbar    if (!types::isCXX(InputType))
10494a5290e773e70ec2c3b4353a3a4aa7d1a3e3cd66Daniel Dunbar        Args.AddAllArgsTranslated(CmdArgs, options::OPT_std_default_EQ,
10504a5290e773e70ec2c3b4353a3a4aa7d1a3e3cd66Daniel Dunbar                                  "-std=", /*Joined=*/true);
1051d573d26e1abcce24c31ece3d6f7af158db569e4cDaniel Dunbar    Args.AddLastArg(CmdArgs, options::OPT_trigraphs);
1052a3ff202ee4fb21728e930d5d029ba4925129912cDaniel Dunbar  }
1053c21c485b4fb58ef5d55cf3e523263dd824a2ace4Daniel Dunbar
10541d46033f760ba5fd266ce59fe391fac473f04f52Daniel Dunbar  if (Arg *A = Args.getLastArg(options::OPT_ftemplate_depth_)) {
10551d46033f760ba5fd266ce59fe391fac473f04f52Daniel Dunbar    CmdArgs.push_back("-ftemplate-depth");
10561d46033f760ba5fd266ce59fe391fac473f04f52Daniel Dunbar    CmdArgs.push_back(A->getValue(Args));
1057b488c1dac8e53206f07103d794a62a3f5012c0f4Daniel Dunbar  }
1058b488c1dac8e53206f07103d794a62a3f5012c0f4Daniel Dunbar
1059e4bdae78c69d2a09ee96619cc5ccf81441674412Daniel Dunbar  if (Args.hasArg(options::OPT__relocatable_pch))
106066861e09d590994a8b941eaa328e4d8f33adec9eDaniel Dunbar    CmdArgs.push_back("-relocatable-pch");
10611eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump
1062294691eb1caf551083acd7b08630ef21c3fd760dDaniel Dunbar  if (Arg *A = Args.getLastArg(options::OPT_fconstant_string_class_EQ)) {
1063294691eb1caf551083acd7b08630ef21c3fd760dDaniel Dunbar    CmdArgs.push_back("-fconstant-string-class");
1064294691eb1caf551083acd7b08630ef21c3fd760dDaniel Dunbar    CmdArgs.push_back(A->getValue(Args));
1065294691eb1caf551083acd7b08630ef21c3fd760dDaniel Dunbar  }
10668a5a9aaddb627c0884c2ed8db55cc29fdb601195David Chisnall
1067124fca533d9fef2e3f6359283909bd342b5f5f26Chris Lattner  if (Arg *A = Args.getLastArg(options::OPT_ftabstop_EQ)) {
1068124fca533d9fef2e3f6359283909bd342b5f5f26Chris Lattner    CmdArgs.push_back("-ftabstop");
1069124fca533d9fef2e3f6359283909bd342b5f5f26Chris Lattner    CmdArgs.push_back(A->getValue(Args));
1070124fca533d9fef2e3f6359283909bd342b5f5f26Chris Lattner  }
1071124fca533d9fef2e3f6359283909bd342b5f5f26Chris Lattner
10720f0c963f9b7ac6f0176c34d405d48fcb005dfab6Chris Lattner  CmdArgs.push_back("-ferror-limit");
10730f0c963f9b7ac6f0176c34d405d48fcb005dfab6Chris Lattner  if (Arg *A = Args.getLastArg(options::OPT_ferror_limit_EQ))
10740f0c963f9b7ac6f0176c34d405d48fcb005dfab6Chris Lattner    CmdArgs.push_back(A->getValue(Args));
10750f0c963f9b7ac6f0176c34d405d48fcb005dfab6Chris Lattner  else
10760f0c963f9b7ac6f0176c34d405d48fcb005dfab6Chris Lattner    CmdArgs.push_back("19");
10770f0c963f9b7ac6f0176c34d405d48fcb005dfab6Chris Lattner
107855efe142a84b2aab6d0186c20a311c347a65f794Daniel Dunbar  // Pass -fmessage-length=.
1079a28690e5b0e423a6287ebe3a5565fd1896d7ebffDaniel Dunbar  CmdArgs.push_back("-fmessage-length");
108055efe142a84b2aab6d0186c20a311c347a65f794Daniel Dunbar  if (Arg *A = Args.getLastArg(options::OPT_fmessage_length_EQ)) {
1081a28690e5b0e423a6287ebe3a5565fd1896d7ebffDaniel Dunbar    CmdArgs.push_back(A->getValue(Args));
108255efe142a84b2aab6d0186c20a311c347a65f794Daniel Dunbar  } else {
108355efe142a84b2aab6d0186c20a311c347a65f794Daniel Dunbar    // If -fmessage-length=N was not specified, determine whether this is a
108455efe142a84b2aab6d0186c20a311c347a65f794Daniel Dunbar    // terminal and, if so, implicitly define -fmessage-length appropriately.
108555efe142a84b2aab6d0186c20a311c347a65f794Daniel Dunbar    unsigned N = llvm::sys::Process::StandardErrColumns();
108655efe142a84b2aab6d0186c20a311c347a65f794Daniel Dunbar    CmdArgs.push_back(Args.MakeArgString(llvm::Twine(N)));
108755efe142a84b2aab6d0186c20a311c347a65f794Daniel Dunbar  }
108855efe142a84b2aab6d0186c20a311c347a65f794Daniel Dunbar
1089ba8d86172c8d9e2476c6fd2415731639223174c5Daniel Dunbar  if (const Arg *A = Args.getLastArg(options::OPT_fvisibility_EQ)) {
1090ba8d86172c8d9e2476c6fd2415731639223174c5Daniel Dunbar    CmdArgs.push_back("-fvisibility");
1091ba8d86172c8d9e2476c6fd2415731639223174c5Daniel Dunbar    CmdArgs.push_back(A->getValue(Args));
1092ba8d86172c8d9e2476c6fd2415731639223174c5Daniel Dunbar  }
1093ba8d86172c8d9e2476c6fd2415731639223174c5Daniel Dunbar
10940a80ba74ffa3d3df55abfbc4474d7470c7c923e3Daniel Dunbar  // -fhosted is default.
10950a80ba74ffa3d3df55abfbc4474d7470c7c923e3Daniel Dunbar  if (KernelOrKext || Args.hasFlag(options::OPT_ffreestanding,
10960a80ba74ffa3d3df55abfbc4474d7470c7c923e3Daniel Dunbar                                   options::OPT_fhosted,
10970a80ba74ffa3d3df55abfbc4474d7470c7c923e3Daniel Dunbar                                   false))
10980a80ba74ffa3d3df55abfbc4474d7470c7c923e3Daniel Dunbar    CmdArgs.push_back("-ffreestanding");
10990a80ba74ffa3d3df55abfbc4474d7470c7c923e3Daniel Dunbar
1100ba8d86172c8d9e2476c6fd2415731639223174c5Daniel Dunbar  // Forward -f (flag) options which we can pass directly.
11019c276ae0f24d4cee8f7954069d4b8eae45d0447dMike Stump  Args.AddLastArg(CmdArgs, options::OPT_fcatch_undefined_behavior);
11023aaf082689d3235937a2e56a60f90fc1b3aebfb2Daniel Dunbar  Args.AddLastArg(CmdArgs, options::OPT_femit_all_decls);
11033aaf082689d3235937a2e56a60f90fc1b3aebfb2Daniel Dunbar  Args.AddLastArg(CmdArgs, options::OPT_fheinous_gnu_extensions);
11048c6fa84b2e4a30317b7b214a7657cb593d67773bDaniel Dunbar
11058c6fa84b2e4a30317b7b214a7657cb593d67773bDaniel Dunbar  // -flax-vector-conversions is default.
11068c6fa84b2e4a30317b7b214a7657cb593d67773bDaniel Dunbar  if (!Args.hasFlag(options::OPT_flax_vector_conversions,
11078c6fa84b2e4a30317b7b214a7657cb593d67773bDaniel Dunbar                    options::OPT_fno_lax_vector_conversions))
11088c6fa84b2e4a30317b7b214a7657cb593d67773bDaniel Dunbar    CmdArgs.push_back("-fno-lax-vector-conversions");
11098c6fa84b2e4a30317b7b214a7657cb593d67773bDaniel Dunbar
11103aaf082689d3235937a2e56a60f90fc1b3aebfb2Daniel Dunbar  Args.AddLastArg(CmdArgs, options::OPT_fno_caret_diagnostics);
11113aaf082689d3235937a2e56a60f90fc1b3aebfb2Daniel Dunbar  Args.AddLastArg(CmdArgs, options::OPT_fno_show_column);
11123aaf082689d3235937a2e56a60f90fc1b3aebfb2Daniel Dunbar  Args.AddLastArg(CmdArgs, options::OPT_fobjc_gc_only);
11133aaf082689d3235937a2e56a60f90fc1b3aebfb2Daniel Dunbar  Args.AddLastArg(CmdArgs, options::OPT_fobjc_gc);
111434e65770ad6142b033d6cec4f476ed20fb248bf3Fariborz Jahanian  Args.AddLastArg(CmdArgs, options::OPT_fobjc_sender_dependent_dispatch);
1115182e09240a33c6f1d303deecabec6e0e9c9d109dChris Lattner  Args.AddLastArg(CmdArgs, options::OPT_fdiagnostics_print_source_range_info);
11163aaf082689d3235937a2e56a60f90fc1b3aebfb2Daniel Dunbar  Args.AddLastArg(CmdArgs, options::OPT_ftime_report);
11173aaf082689d3235937a2e56a60f90fc1b3aebfb2Daniel Dunbar  Args.AddLastArg(CmdArgs, options::OPT_ftrapv);
11183aaf082689d3235937a2e56a60f90fc1b3aebfb2Daniel Dunbar  Args.AddLastArg(CmdArgs, options::OPT_fwritable_strings);
11191d46033f760ba5fd266ce59fe391fac473f04f52Daniel Dunbar
11205345c391c65d1780a0d7b0102b7f735cc3f82732Daniel Dunbar  Args.AddLastArg(CmdArgs, options::OPT_pthread);
11215345c391c65d1780a0d7b0102b7f735cc3f82732Daniel Dunbar
11229e5cc6b703b2d0013f13800c2ffbeb3cf85fcfadDaniel Dunbar  // -stack-protector=0 is default.
11239e5cc6b703b2d0013f13800c2ffbeb3cf85fcfadDaniel Dunbar  unsigned StackProtectorLevel = 0;
112445483f7a1b3e57b4603b141bee80596b2d4dd443Bill Wendling  if (Arg *A = Args.getLastArg(options::OPT_fno_stack_protector,
112545483f7a1b3e57b4603b141bee80596b2d4dd443Bill Wendling                               options::OPT_fstack_protector_all,
112645483f7a1b3e57b4603b141bee80596b2d4dd443Bill Wendling                               options::OPT_fstack_protector)) {
11279e5cc6b703b2d0013f13800c2ffbeb3cf85fcfadDaniel Dunbar    if (A->getOption().matches(options::OPT_fstack_protector))
11289e5cc6b703b2d0013f13800c2ffbeb3cf85fcfadDaniel Dunbar      StackProtectorLevel = 1;
11299e5cc6b703b2d0013f13800c2ffbeb3cf85fcfadDaniel Dunbar    else if (A->getOption().matches(options::OPT_fstack_protector_all))
11309e5cc6b703b2d0013f13800c2ffbeb3cf85fcfadDaniel Dunbar      StackProtectorLevel = 2;
11319e5cc6b703b2d0013f13800c2ffbeb3cf85fcfadDaniel Dunbar  } else
11329e5cc6b703b2d0013f13800c2ffbeb3cf85fcfadDaniel Dunbar    StackProtectorLevel = getToolChain().GetDefaultStackProtectorLevel();
11339e5cc6b703b2d0013f13800c2ffbeb3cf85fcfadDaniel Dunbar  if (StackProtectorLevel) {
11349e5cc6b703b2d0013f13800c2ffbeb3cf85fcfadDaniel Dunbar    CmdArgs.push_back("-stack-protector");
11359e5cc6b703b2d0013f13800c2ffbeb3cf85fcfadDaniel Dunbar    CmdArgs.push_back(Args.MakeArgString(llvm::Twine(StackProtectorLevel)));
113645483f7a1b3e57b4603b141bee80596b2d4dd443Bill Wendling  }
113745483f7a1b3e57b4603b141bee80596b2d4dd443Bill Wendling
113848d1ef782c8c88066b5febf60f8f456064d7d3f0Daniel Dunbar  // Forward -f options with positive and negative forms; we translate
113948d1ef782c8c88066b5febf60f8f456064d7d3f0Daniel Dunbar  // these by hand.
114048d1ef782c8c88066b5febf60f8f456064d7d3f0Daniel Dunbar
11419e5cc6b703b2d0013f13800c2ffbeb3cf85fcfadDaniel Dunbar  // -fbuiltin is default.
114248d1ef782c8c88066b5febf60f8f456064d7d3f0Daniel Dunbar  if (!Args.hasFlag(options::OPT_fbuiltin, options::OPT_fno_builtin))
114353e8484581ca358c3a2ccd8ea39c136c6e85d606Daniel Dunbar    CmdArgs.push_back("-fno-builtin");
114448d1ef782c8c88066b5febf60f8f456064d7d3f0Daniel Dunbar
1145fc2844846e91398205fddc71196fe9dda04e105fNuno Lopes  if (!Args.hasFlag(options::OPT_fassume_sane_operator_new,
1146fc2844846e91398205fddc71196fe9dda04e105fNuno Lopes                    options::OPT_fno_assume_sane_operator_new))
1147fc2844846e91398205fddc71196fe9dda04e105fNuno Lopes    CmdArgs.push_back("-fno-assume-sane-operator-new");
1148fc2844846e91398205fddc71196fe9dda04e105fNuno Lopes
11499e5cc6b703b2d0013f13800c2ffbeb3cf85fcfadDaniel Dunbar  // -fblocks=0 is default.
11509e5cc6b703b2d0013f13800c2ffbeb3cf85fcfadDaniel Dunbar  if (Args.hasFlag(options::OPT_fblocks, options::OPT_fno_blocks,
11515e530af5d51572a0ed5dbe50da54bd333840c63dDavid Chisnall                   getToolChain().IsBlocksDefault())) {
11529e5cc6b703b2d0013f13800c2ffbeb3cf85fcfadDaniel Dunbar    CmdArgs.push_back("-fblocks");
11535e530af5d51572a0ed5dbe50da54bd333840c63dDavid Chisnall  }
115448d1ef782c8c88066b5febf60f8f456064d7d3f0Daniel Dunbar
115532579cf507d088e776b67327c5d6bc46e1f217ccJohn McCall  // -faccess-control is default.
11567002f4c03c2d0544f4e8bea8d3a5636519081e35John McCall  if (Args.hasFlag(options::OPT_fno_access_control,
11577002f4c03c2d0544f4e8bea8d3a5636519081e35John McCall                   options::OPT_faccess_control,
115832579cf507d088e776b67327c5d6bc46e1f217ccJohn McCall                   false))
11597002f4c03c2d0544f4e8bea8d3a5636519081e35John McCall    CmdArgs.push_back("-fno-access-control");
11603ddd6e026a173e9519e84e27f8d6aed5473b8b4eJohn McCall
11616d2eb4d07d40795131f28d719ef9146a2be500f6Daniel Dunbar  // -fexceptions=0 is default.
116285caf03ee49c4de87ee9624a9b725ef5d20ee624Fariborz Jahanian  if (needsExceptions(Args, InputType, getToolChain().getTriple()))
1163f759df06d997050559fd925758bcd2cdef24db05Rafael Espindola    CmdArgs.push_back("-fexceptions");
1164738f8c278da5950d0d4607de2debe0bdfad64185Mike Stump
1165b2987d159a88ab0ee2e40c884eb4d77b42ab89b6Daniel Dunbar  if (getToolChain().UseSjLjExceptions())
1166b2987d159a88ab0ee2e40c884eb4d77b42ab89b6Daniel Dunbar    CmdArgs.push_back("-fsjlj-exceptions");
1167b2987d159a88ab0ee2e40c884eb4d77b42ab89b6Daniel Dunbar
11680be42c44f0199c5023b542d6a6d2e66eb594f27dDaniel Dunbar  // -frtti is default.
11690a80ba74ffa3d3df55abfbc4474d7470c7c923e3Daniel Dunbar  if (KernelOrKext ||
11700a80ba74ffa3d3df55abfbc4474d7470c7c923e3Daniel Dunbar      !Args.hasFlag(options::OPT_frtti, options::OPT_fno_rtti))
117153e8484581ca358c3a2ccd8ea39c136c6e85d606Daniel Dunbar    CmdArgs.push_back("-fno-rtti");
1172738f8c278da5950d0d4607de2debe0bdfad64185Mike Stump
11731f95e6567faab67f4363d650f73121359c4bdbabDaniel Dunbar  // -fsigned-char is default.
11746d2eb4d07d40795131f28d719ef9146a2be500f6Daniel Dunbar  if (!Args.hasFlag(options::OPT_fsigned_char, options::OPT_funsigned_char,
11751f95e6567faab67f4363d650f73121359c4bdbabDaniel Dunbar                    isSignedCharDefault(getToolChain().getTriple())))
11767674352cf3e8f699914a2f739f1ae8c8c3480813Daniel Dunbar    CmdArgs.push_back("-fno-signed-char");
11775a77973d9bc2c9cdbdb7860dcf3ac795abe258ecEli Friedman
1178a508b7de6c5246ab04ed69d0ab4e9977ec1fb4d4Anders Carlsson  // -fthreadsafe-static is default.
1179a508b7de6c5246ab04ed69d0ab4e9977ec1fb4d4Anders Carlsson  if (!Args.hasFlag(options::OPT_fthreadsafe_statics,
1180a508b7de6c5246ab04ed69d0ab4e9977ec1fb4d4Anders Carlsson                    options::OPT_fno_threadsafe_statics))
1181a508b7de6c5246ab04ed69d0ab4e9977ec1fb4d4Anders Carlsson    CmdArgs.push_back("-fno-threadsafe-statics");
1182a508b7de6c5246ab04ed69d0ab4e9977ec1fb4d4Anders Carlsson
1183efb0fa9e11f75af51744a6159530ef7cc8efa24aDaniel Dunbar  // -fuse-cxa-atexit is default.
11840a80ba74ffa3d3df55abfbc4474d7470c7c923e3Daniel Dunbar  if (KernelOrKext || !Args.hasFlag(options::OPT_fuse_cxa_atexit,
11850a80ba74ffa3d3df55abfbc4474d7470c7c923e3Daniel Dunbar                                    options::OPT_fno_use_cxa_atexit))
1186efb0fa9e11f75af51744a6159530ef7cc8efa24aDaniel Dunbar    CmdArgs.push_back("-fno-use-cxa-atexit");
1187efb0fa9e11f75af51744a6159530ef7cc8efa24aDaniel Dunbar
11880be42c44f0199c5023b542d6a6d2e66eb594f27dDaniel Dunbar  // -fms-extensions=0 is default.
11896d2eb4d07d40795131f28d719ef9146a2be500f6Daniel Dunbar  if (Args.hasFlag(options::OPT_fms_extensions, options::OPT_fno_ms_extensions,
11900be42c44f0199c5023b542d6a6d2e66eb594f27dDaniel Dunbar                   getToolChain().getTriple().getOS() == llvm::Triple::Win32))
11910be42c44f0199c5023b542d6a6d2e66eb594f27dDaniel Dunbar    CmdArgs.push_back("-fms-extensions");
11920be42c44f0199c5023b542d6a6d2e66eb594f27dDaniel Dunbar
1193c5a97ec19408c3dca4b6a6385f11d8c783b94d0bDaniel Dunbar  // -fnext-runtime is default.
11946d2eb4d07d40795131f28d719ef9146a2be500f6Daniel Dunbar  if (!Args.hasFlag(options::OPT_fnext_runtime, options::OPT_fgnu_runtime,
1195c5a97ec19408c3dca4b6a6385f11d8c783b94d0bDaniel Dunbar                    getToolChain().getTriple().getOS() == llvm::Triple::Darwin))
1196c5a97ec19408c3dca4b6a6385f11d8c783b94d0bDaniel Dunbar    CmdArgs.push_back("-fgnu-runtime");
1197c5a97ec19408c3dca4b6a6385f11d8c783b94d0bDaniel Dunbar
11989e5cc6b703b2d0013f13800c2ffbeb3cf85fcfadDaniel Dunbar  // -fobjc-nonfragile-abi=0 is default.
11999e5cc6b703b2d0013f13800c2ffbeb3cf85fcfadDaniel Dunbar  if (types::isObjC(InputType)) {
12009e5cc6b703b2d0013f13800c2ffbeb3cf85fcfadDaniel Dunbar    if (Args.hasArg(options::OPT_fobjc_nonfragile_abi) ||
1201984eb8611d9ee46fc6351dee43609f2deed99f3cDaniel Dunbar        getToolChain().IsObjCNonFragileABIDefault()) {
12029e5cc6b703b2d0013f13800c2ffbeb3cf85fcfadDaniel Dunbar      CmdArgs.push_back("-fobjc-nonfragile-abi");
1203984eb8611d9ee46fc6351dee43609f2deed99f3cDaniel Dunbar
1204984eb8611d9ee46fc6351dee43609f2deed99f3cDaniel Dunbar      // -fobjc-legacy-dispatch is only relevant with the nonfragile-abi, and
1205984eb8611d9ee46fc6351dee43609f2deed99f3cDaniel Dunbar      // defaults to off.
1206984eb8611d9ee46fc6351dee43609f2deed99f3cDaniel Dunbar      if (Args.hasFlag(options::OPT_fobjc_legacy_dispatch,
1207984eb8611d9ee46fc6351dee43609f2deed99f3cDaniel Dunbar                       options::OPT_fno_objc_legacy_dispatch,
1208609508ce95732e7e7010f79c5207613eced7c9cbDaniel Dunbar                       getToolChain().IsObjCLegacyDispatchDefault()))
1209984eb8611d9ee46fc6351dee43609f2deed99f3cDaniel Dunbar        CmdArgs.push_back("-fobjc-legacy-dispatch");
1210984eb8611d9ee46fc6351dee43609f2deed99f3cDaniel Dunbar    }
12119e5cc6b703b2d0013f13800c2ffbeb3cf85fcfadDaniel Dunbar  }
12129e5cc6b703b2d0013f13800c2ffbeb3cf85fcfadDaniel Dunbar
1213984eb8611d9ee46fc6351dee43609f2deed99f3cDaniel Dunbar  if (!Args.hasFlag(options::OPT_fassume_sane_operator_new,
1214984eb8611d9ee46fc6351dee43609f2deed99f3cDaniel Dunbar                    options::OPT_fno_assume_sane_operator_new))
1215984eb8611d9ee46fc6351dee43609f2deed99f3cDaniel Dunbar    CmdArgs.push_back("-fno-assume-sane-operator-new");
1216984eb8611d9ee46fc6351dee43609f2deed99f3cDaniel Dunbar
1217a6fda124bf380479529d6a80b84b62cacd3cb707John Thompson  // -fshort-wchar default varies depending on platform; only
1218a6fda124bf380479529d6a80b84b62cacd3cb707John Thompson  // pass if specified.
1219a6fda124bf380479529d6a80b84b62cacd3cb707John Thompson  if (Arg *A = Args.getLastArg(options::OPT_fshort_wchar)) {
1220a6fda124bf380479529d6a80b84b62cacd3cb707John Thompson    if (A->getOption().matches(options::OPT_fshort_wchar))
1221a6fda124bf380479529d6a80b84b62cacd3cb707John Thompson      CmdArgs.push_back("-fshort-wchar");
1222a6fda124bf380479529d6a80b84b62cacd3cb707John Thompson  }
1223a6fda124bf380479529d6a80b84b62cacd3cb707John Thompson
1224ee848a73e5f8ffe7511af8652ba811c020d1c7a0Daniel Dunbar  // -fno-pascal-strings is default, only pass non-default. If the tool chain
1225ee848a73e5f8ffe7511af8652ba811c020d1c7a0Daniel Dunbar  // happened to translate to -mpascal-strings, we want to back translate here.
122682d00688525c876bf47bce414dedae9c343e67f5Daniel Dunbar  //
122782d00688525c876bf47bce414dedae9c343e67f5Daniel Dunbar  // FIXME: This is gross; that translation should be pulled from the
122882d00688525c876bf47bce414dedae9c343e67f5Daniel Dunbar  // tool chain.
1229c21c485b4fb58ef5d55cf3e523263dd824a2ace4Daniel Dunbar  if (Args.hasFlag(options::OPT_fpascal_strings,
123082d00688525c876bf47bce414dedae9c343e67f5Daniel Dunbar                   options::OPT_fno_pascal_strings,
123182d00688525c876bf47bce414dedae9c343e67f5Daniel Dunbar                   false) ||
123282d00688525c876bf47bce414dedae9c343e67f5Daniel Dunbar      Args.hasFlag(options::OPT_mpascal_strings,
123382d00688525c876bf47bce414dedae9c343e67f5Daniel Dunbar                   options::OPT_mno_pascal_strings,
123482d00688525c876bf47bce414dedae9c343e67f5Daniel Dunbar                   false))
123548d1ef782c8c88066b5febf60f8f456064d7d3f0Daniel Dunbar    CmdArgs.push_back("-fpascal-strings");
123648d1ef782c8c88066b5febf60f8f456064d7d3f0Daniel Dunbar
123748d1ef782c8c88066b5febf60f8f456064d7d3f0Daniel Dunbar  // -fcommon is default, only pass non-default.
123848d1ef782c8c88066b5febf60f8f456064d7d3f0Daniel Dunbar  if (!Args.hasFlag(options::OPT_fcommon, options::OPT_fno_common))
123948d1ef782c8c88066b5febf60f8f456064d7d3f0Daniel Dunbar    CmdArgs.push_back("-fno-common");
124048d1ef782c8c88066b5febf60f8f456064d7d3f0Daniel Dunbar
124170d3c92820f590b10553da9c96eda24e4325ba34Daniel Dunbar  // -fsigned-bitfields is default, and clang doesn't yet support
124270d3c92820f590b10553da9c96eda24e4325ba34Daniel Dunbar  // --funsigned-bitfields.
12431eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump  if (!Args.hasFlag(options::OPT_fsigned_bitfields,
124470d3c92820f590b10553da9c96eda24e4325ba34Daniel Dunbar                    options::OPT_funsigned_bitfields))
124570d3c92820f590b10553da9c96eda24e4325ba34Daniel Dunbar    D.Diag(clang::diag::warn_drv_clang_unsupported)
124670d3c92820f590b10553da9c96eda24e4325ba34Daniel Dunbar      << Args.getLastArg(options::OPT_funsigned_bitfields)->getAsString(Args);
124770d3c92820f590b10553da9c96eda24e4325ba34Daniel Dunbar
124849138fc59eeac2aacd3b7e04c2642180d5baefd7Daniel Dunbar  // -fdiagnostics-fixit-info is default, only pass non-default.
12491eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump  if (!Args.hasFlag(options::OPT_fdiagnostics_fixit_info,
125049138fc59eeac2aacd3b7e04c2642180d5baefd7Daniel Dunbar                    options::OPT_fno_diagnostics_fixit_info))
125149138fc59eeac2aacd3b7e04c2642180d5baefd7Daniel Dunbar    CmdArgs.push_back("-fno-diagnostics-fixit-info");
125249138fc59eeac2aacd3b7e04c2642180d5baefd7Daniel Dunbar
125374f20838caa266f829bf5ae43997f8ebfca54a9aDaniel Dunbar  Args.AddLastArg(CmdArgs, options::OPT_fdiagnostics_binary);
1254d93256e55673a17d18543397ec462416acb13792Douglas Gregor
12559e820ee054fefe5422b4db3f681e567a8976747eDaniel Dunbar  // Enable -fdiagnostics-show-option by default.
12561eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump  if (Args.hasFlag(options::OPT_fdiagnostics_show_option,
12579e820ee054fefe5422b4db3f681e567a8976747eDaniel Dunbar                   options::OPT_fno_diagnostics_show_option))
12589e820ee054fefe5422b4db3f681e567a8976747eDaniel Dunbar    CmdArgs.push_back("-fdiagnostics-show-option");
1259838be483dcf10ea3f2acd85f2cd65adc310011f9Daniel Dunbar
1260838be483dcf10ea3f2acd85f2cd65adc310011f9Daniel Dunbar  // Color diagnostics are the default, unless the terminal doesn't support
1261838be483dcf10ea3f2acd85f2cd65adc310011f9Daniel Dunbar  // them.
1262838be483dcf10ea3f2acd85f2cd65adc310011f9Daniel Dunbar  if (Args.hasFlag(options::OPT_fcolor_diagnostics,
1263838be483dcf10ea3f2acd85f2cd65adc310011f9Daniel Dunbar                   options::OPT_fno_color_diagnostics) &&
1264838be483dcf10ea3f2acd85f2cd65adc310011f9Daniel Dunbar      llvm::sys::Process::StandardErrHasColors())
1265838be483dcf10ea3f2acd85f2cd65adc310011f9Daniel Dunbar    CmdArgs.push_back("-fcolor-diagnostics");
1266838be483dcf10ea3f2acd85f2cd65adc310011f9Daniel Dunbar
126775eb1d64784946a37fc0b27596e2d92b6cf7033bDaniel Dunbar  if (!Args.hasFlag(options::OPT_fshow_source_location,
126875eb1d64784946a37fc0b27596e2d92b6cf7033bDaniel Dunbar                    options::OPT_fno_show_source_location))
126975eb1d64784946a37fc0b27596e2d92b6cf7033bDaniel Dunbar    CmdArgs.push_back("-fno-show-source-location");
12709e820ee054fefe5422b4db3f681e567a8976747eDaniel Dunbar
12717695fba30221613b7cf31276456217c41bb90960Daniel Dunbar  // -fdollars-in-identifiers default varies depending on platform and
12727695fba30221613b7cf31276456217c41bb90960Daniel Dunbar  // language; only pass if specified.
12731eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump  if (Arg *A = Args.getLastArg(options::OPT_fdollars_in_identifiers,
12747695fba30221613b7cf31276456217c41bb90960Daniel Dunbar                               options::OPT_fno_dollars_in_identifiers)) {
12757695fba30221613b7cf31276456217c41bb90960Daniel Dunbar    if (A->getOption().matches(options::OPT_fdollars_in_identifiers))
12768663b180085e9bc7a0a87c80cc3f722efef99e79Daniel Dunbar      CmdArgs.push_back("-fdollars-in-identifiers");
12777695fba30221613b7cf31276456217c41bb90960Daniel Dunbar    else
12788663b180085e9bc7a0a87c80cc3f722efef99e79Daniel Dunbar      CmdArgs.push_back("-fno-dollars-in-identifiers");
12797695fba30221613b7cf31276456217c41bb90960Daniel Dunbar  }
12807695fba30221613b7cf31276456217c41bb90960Daniel Dunbar
1281e027a4b2399e9b0acfe0f77220c66bbe369067eeDaniel Dunbar  // -funit-at-a-time is default, and we don't support -fno-unit-at-a-time for
1282e027a4b2399e9b0acfe0f77220c66bbe369067eeDaniel Dunbar  // practical purposes.
12831eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump  if (Arg *A = Args.getLastArg(options::OPT_funit_at_a_time,
1284e027a4b2399e9b0acfe0f77220c66bbe369067eeDaniel Dunbar                               options::OPT_fno_unit_at_a_time)) {
1285e027a4b2399e9b0acfe0f77220c66bbe369067eeDaniel Dunbar    if (A->getOption().matches(options::OPT_fno_unit_at_a_time))
1286c37691068db5ceb19c014ddd3e02afa9875f8181Edward O'Callaghan      D.Diag(clang::diag::warn_drv_clang_unsupported) << A->getAsString(Args);
1287e027a4b2399e9b0acfe0f77220c66bbe369067eeDaniel Dunbar  }
1288ceb5c5b7f67a30fae305d1d19b478b623e4fbcedEli Friedman
12892ba91575905a54f712a7f64304e56002e4882499Daniel Dunbar  // Default to -fno-builtin-str{cat,cpy} on Darwin for ARM.
1290f84a4a469d8a45c76cb941595582a0fd3b9b15d3Daniel Dunbar  //
12918ff5b28d6efcffe2251e77634c7edf83a4763344Daniel Dunbar  // FIXME: This is disabled until clang -cc1 supports -fno-builtin-foo. PR4941.
1292f84a4a469d8a45c76cb941595582a0fd3b9b15d3Daniel Dunbar#if 0
12932ba91575905a54f712a7f64304e56002e4882499Daniel Dunbar  if (getToolChain().getTriple().getOS() == llvm::Triple::Darwin &&
12942ba91575905a54f712a7f64304e56002e4882499Daniel Dunbar      (getToolChain().getTriple().getArch() == llvm::Triple::arm ||
12952ba91575905a54f712a7f64304e56002e4882499Daniel Dunbar       getToolChain().getTriple().getArch() == llvm::Triple::thumb)) {
12962ba91575905a54f712a7f64304e56002e4882499Daniel Dunbar    if (!Args.hasArg(options::OPT_fbuiltin_strcat))
12972ba91575905a54f712a7f64304e56002e4882499Daniel Dunbar      CmdArgs.push_back("-fno-builtin-strcat");
12982ba91575905a54f712a7f64304e56002e4882499Daniel Dunbar    if (!Args.hasArg(options::OPT_fbuiltin_strcpy))
12992ba91575905a54f712a7f64304e56002e4882499Daniel Dunbar      CmdArgs.push_back("-fno-builtin-strcpy");
13002ba91575905a54f712a7f64304e56002e4882499Daniel Dunbar  }
1301f84a4a469d8a45c76cb941595582a0fd3b9b15d3Daniel Dunbar#endif
13022ba91575905a54f712a7f64304e56002e4882499Daniel Dunbar
13031eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump  if (Arg *A = Args.getLastArg(options::OPT_traditional,
1304ceb5c5b7f67a30fae305d1d19b478b623e4fbcedEli Friedman                               options::OPT_traditional_cpp))
1305ceb5c5b7f67a30fae305d1d19b478b623e4fbcedEli Friedman    D.Diag(clang::diag::err_drv_clang_unsupported) << A->getAsString(Args);
1306ceb5c5b7f67a30fae305d1d19b478b623e4fbcedEli Friedman
13071d46033f760ba5fd266ce59fe391fac473f04f52Daniel Dunbar  Args.AddLastArg(CmdArgs, options::OPT_dM);
1308d82df3ad430397d7f9ef511e7c5157f997c41f53Chris Lattner  Args.AddLastArg(CmdArgs, options::OPT_dD);
13091d46033f760ba5fd266ce59fe391fac473f04f52Daniel Dunbar
13101d46033f760ba5fd266ce59fe391fac473f04f52Daniel Dunbar  Args.AddAllArgValues(CmdArgs, options::OPT_Xclang);
1311e5280286573d4fe1220cdd66e147b572a05536a8Daniel Dunbar  Args.AddAllArgValues(CmdArgs, options::OPT_mllvm);
13121d46033f760ba5fd266ce59fe391fac473f04f52Daniel Dunbar
1313cd8e4c44dd068956e9181381be3ee2d49a0fac52Daniel Dunbar  if (Output.getType() == types::TY_Dependencies) {
1314cd8e4c44dd068956e9181381be3ee2d49a0fac52Daniel Dunbar    // Handled with other dependency code.
1315a5a7bd0de7b6b80212095195a055a4a43f21d4b2Daniel Dunbar  } else if (Output.isPipe()) {
1316b488c1dac8e53206f07103d794a62a3f5012c0f4Daniel Dunbar    CmdArgs.push_back("-o");
1317b488c1dac8e53206f07103d794a62a3f5012c0f4Daniel Dunbar    CmdArgs.push_back("-");
1318115a79277edababaf1b26e3654044ae983197679Daniel Dunbar  } else if (Output.isFilename()) {
1319b488c1dac8e53206f07103d794a62a3f5012c0f4Daniel Dunbar    CmdArgs.push_back("-o");
1320115a79277edababaf1b26e3654044ae983197679Daniel Dunbar    CmdArgs.push_back(Output.getFilename());
1321115a79277edababaf1b26e3654044ae983197679Daniel Dunbar  } else {
1322115a79277edababaf1b26e3654044ae983197679Daniel Dunbar    assert(Output.isNothing() && "Invalid output.");
1323b488c1dac8e53206f07103d794a62a3f5012c0f4Daniel Dunbar  }
1324b488c1dac8e53206f07103d794a62a3f5012c0f4Daniel Dunbar
13251d46033f760ba5fd266ce59fe391fac473f04f52Daniel Dunbar  for (InputInfoList::const_iterator
13261d46033f760ba5fd266ce59fe391fac473f04f52Daniel Dunbar         it = Inputs.begin(), ie = Inputs.end(); it != ie; ++it) {
13271d46033f760ba5fd266ce59fe391fac473f04f52Daniel Dunbar    const InputInfo &II = *it;
13281d46033f760ba5fd266ce59fe391fac473f04f52Daniel Dunbar    CmdArgs.push_back("-x");
13291d46033f760ba5fd266ce59fe391fac473f04f52Daniel Dunbar    CmdArgs.push_back(types::getTypeName(II.getType()));
13301d46033f760ba5fd266ce59fe391fac473f04f52Daniel Dunbar    if (II.isPipe())
13311d46033f760ba5fd266ce59fe391fac473f04f52Daniel Dunbar      CmdArgs.push_back("-");
1332115a79277edababaf1b26e3654044ae983197679Daniel Dunbar    else if (II.isFilename())
1333115a79277edababaf1b26e3654044ae983197679Daniel Dunbar      CmdArgs.push_back(II.getFilename());
13341d46033f760ba5fd266ce59fe391fac473f04f52Daniel Dunbar    else
1335115a79277edababaf1b26e3654044ae983197679Daniel Dunbar      II.getInputArg().renderAsInput(Args, CmdArgs);
13361d46033f760ba5fd266ce59fe391fac473f04f52Daniel Dunbar  }
1337c21c485b4fb58ef5d55cf3e523263dd824a2ace4Daniel Dunbar
1338e6113de52df132b89c3a5a6141f17d37e83322aeChris Lattner  Args.AddAllArgs(CmdArgs, options::OPT_undef);
1339e6113de52df132b89c3a5a6141f17d37e83322aeChris Lattner
1340c21c485b4fb58ef5d55cf3e523263dd824a2ace4Daniel Dunbar  const char *Exec =
13418ff5b28d6efcffe2251e77634c7edf83a4763344Daniel Dunbar    Args.MakeArgString(getToolChain().GetProgramPath(C, "clang"));
1342f2d8b9f967a1ab53ee9fdbcc3ac0a4ee0a83a26eDaniel Dunbar
1343f2d8b9f967a1ab53ee9fdbcc3ac0a4ee0a83a26eDaniel Dunbar  // Optionally embed the -cc1 level arguments into the debug info, for build
1344f2d8b9f967a1ab53ee9fdbcc3ac0a4ee0a83a26eDaniel Dunbar  // analysis.
1345f2d8b9f967a1ab53ee9fdbcc3ac0a4ee0a83a26eDaniel Dunbar  if (getToolChain().UseDwarfDebugFlags()) {
1346f2d8b9f967a1ab53ee9fdbcc3ac0a4ee0a83a26eDaniel Dunbar    llvm::SmallString<256> Flags;
1347f2d8b9f967a1ab53ee9fdbcc3ac0a4ee0a83a26eDaniel Dunbar    Flags += Exec;
1348f2d8b9f967a1ab53ee9fdbcc3ac0a4ee0a83a26eDaniel Dunbar    for (unsigned i = 0, e = CmdArgs.size(); i != e; ++i) {
1349f2d8b9f967a1ab53ee9fdbcc3ac0a4ee0a83a26eDaniel Dunbar      Flags += " ";
1350f2d8b9f967a1ab53ee9fdbcc3ac0a4ee0a83a26eDaniel Dunbar      Flags += CmdArgs[i];
1351f2d8b9f967a1ab53ee9fdbcc3ac0a4ee0a83a26eDaniel Dunbar    }
1352f2d8b9f967a1ab53ee9fdbcc3ac0a4ee0a83a26eDaniel Dunbar    CmdArgs.push_back("-dwarf-debug-flags");
1353f2d8b9f967a1ab53ee9fdbcc3ac0a4ee0a83a26eDaniel Dunbar    CmdArgs.push_back(Args.MakeArgString(Flags.str()));
1354f2d8b9f967a1ab53ee9fdbcc3ac0a4ee0a83a26eDaniel Dunbar  }
1355f2d8b9f967a1ab53ee9fdbcc3ac0a4ee0a83a26eDaniel Dunbar
1356daab7b1016f0a82fefa4f7be6e63c57c06b19ffcDaniel Dunbar  Dest.addCommand(new Command(JA, *this, Exec, CmdArgs));
1357a880db0b0fc028abf754c290d921d809eec0518aDaniel Dunbar
13585c1aaafbd6dd25a99ca1960e1c3c98aeefe9d728Daniel Dunbar  // Explicitly warn that these options are unsupported, even though
13595c1aaafbd6dd25a99ca1960e1c3c98aeefe9d728Daniel Dunbar  // we are allowing compilation to continue.
1360cdd9686b890ebdc10039ae256ef4c9dfb5ebacb7Daniel Dunbar  for (arg_iterator it = Args.filtered_begin(options::OPT_pg),
1361cdd9686b890ebdc10039ae256ef4c9dfb5ebacb7Daniel Dunbar         ie = Args.filtered_end(); it != ie; ++it) {
1362cdd9686b890ebdc10039ae256ef4c9dfb5ebacb7Daniel Dunbar    it->claim();
1363cdd9686b890ebdc10039ae256ef4c9dfb5ebacb7Daniel Dunbar    D.Diag(clang::diag::warn_drv_clang_unsupported) << it->getAsString(Args);
13645c1aaafbd6dd25a99ca1960e1c3c98aeefe9d728Daniel Dunbar  }
13655c1aaafbd6dd25a99ca1960e1c3c98aeefe9d728Daniel Dunbar
136668fb469aeb19144403e703b825854d08353c8eeaDaniel Dunbar  // Claim some arguments which clang supports automatically.
136768fb469aeb19144403e703b825854d08353c8eeaDaniel Dunbar
136868fb469aeb19144403e703b825854d08353c8eeaDaniel Dunbar  // -fpch-preprocess is used with gcc to add a special marker in the
136968fb469aeb19144403e703b825854d08353c8eeaDaniel Dunbar  // -output to include the PCH file. Clang's PTH solution is
137068fb469aeb19144403e703b825854d08353c8eeaDaniel Dunbar  // -completely transparent, so we do not need to deal with it at
137168fb469aeb19144403e703b825854d08353c8eeaDaniel Dunbar  // -all.
137268fb469aeb19144403e703b825854d08353c8eeaDaniel Dunbar  Args.ClaimAllArgs(options::OPT_fpch_preprocess);
1373c21c485b4fb58ef5d55cf3e523263dd824a2ace4Daniel Dunbar
1374a880db0b0fc028abf754c290d921d809eec0518aDaniel Dunbar  // Claim some arguments which clang doesn't support, but we don't
1375a880db0b0fc028abf754c290d921d809eec0518aDaniel Dunbar  // care to warn the user about.
1376cdd9686b890ebdc10039ae256ef4c9dfb5ebacb7Daniel Dunbar  Args.ClaimAllArgs(options::OPT_clang_ignored_f_Group);
1377cdd9686b890ebdc10039ae256ef4c9dfb5ebacb7Daniel Dunbar  Args.ClaimAllArgs(options::OPT_clang_ignored_m_Group);
137847ac7d27c44bd64a7d0fc03d4babc196cf2b8230Daniel Dunbar}
137947ac7d27c44bd64a7d0fc03d4babc196cf2b8230Daniel Dunbar
1380b488c1dac8e53206f07103d794a62a3f5012c0f4Daniel Dunbarvoid gcc::Common::ConstructJob(Compilation &C, const JobAction &JA,
1381b488c1dac8e53206f07103d794a62a3f5012c0f4Daniel Dunbar                               Job &Dest,
1382b488c1dac8e53206f07103d794a62a3f5012c0f4Daniel Dunbar                               const InputInfo &Output,
1383b488c1dac8e53206f07103d794a62a3f5012c0f4Daniel Dunbar                               const InputInfoList &Inputs,
13841d46033f760ba5fd266ce59fe391fac473f04f52Daniel Dunbar                               const ArgList &Args,
1385b488c1dac8e53206f07103d794a62a3f5012c0f4Daniel Dunbar                               const char *LinkingOutput) const {
1386ee788e70fcd0adf76103b17c78ac658d4ea30c9bDaniel Dunbar  const Driver &D = getToolChain().getDriver();
1387b488c1dac8e53206f07103d794a62a3f5012c0f4Daniel Dunbar  ArgStringList CmdArgs;
1388b488c1dac8e53206f07103d794a62a3f5012c0f4Daniel Dunbar
1389c21c485b4fb58ef5d55cf3e523263dd824a2ace4Daniel Dunbar  for (ArgList::const_iterator
13901d46033f760ba5fd266ce59fe391fac473f04f52Daniel Dunbar         it = Args.begin(), ie = Args.end(); it != ie; ++it) {
1391b488c1dac8e53206f07103d794a62a3f5012c0f4Daniel Dunbar    Arg *A = *it;
13927587719c40ebf02bf11e5e66c30bd20e98edebc2Daniel Dunbar    if (A->getOption().hasForwardToGCC()) {
13937587719c40ebf02bf11e5e66c30bd20e98edebc2Daniel Dunbar      // It is unfortunate that we have to claim here, as this means
13947587719c40ebf02bf11e5e66c30bd20e98edebc2Daniel Dunbar      // we will basically never report anything interesting for
13956ecc7a993f939c5255c36c7c0d965fb9c1543f2aDaniel Dunbar      // platforms using a generic gcc, even if we are just using gcc
13966ecc7a993f939c5255c36c7c0d965fb9c1543f2aDaniel Dunbar      // to get to the assembler.
13977587719c40ebf02bf11e5e66c30bd20e98edebc2Daniel Dunbar      A->claim();
13981d46033f760ba5fd266ce59fe391fac473f04f52Daniel Dunbar      A->render(Args, CmdArgs);
13997587719c40ebf02bf11e5e66c30bd20e98edebc2Daniel Dunbar    }
1400b488c1dac8e53206f07103d794a62a3f5012c0f4Daniel Dunbar  }
1401c21c485b4fb58ef5d55cf3e523263dd824a2ace4Daniel Dunbar
140282b51cce8cea6b6bb6175c406c2ab425c91d9dc8Daniel Dunbar  RenderExtraToolArgs(JA, CmdArgs);
1403b488c1dac8e53206f07103d794a62a3f5012c0f4Daniel Dunbar
1404b488c1dac8e53206f07103d794a62a3f5012c0f4Daniel Dunbar  // If using a driver driver, force the arch.
14057cfe31a713d8fcfc2a1328e8fbd8efdeb0aec51bDaniel Dunbar  const std::string &Arch = getToolChain().getArchName();
14061bda434673d3c51a2ba6b412f100ccfcf3e7083fDaniel Dunbar  if (getToolChain().getTriple().getOS() == llvm::Triple::Darwin) {
1407b488c1dac8e53206f07103d794a62a3f5012c0f4Daniel Dunbar    CmdArgs.push_back("-arch");
1408bf54a06f9b771c2a2730cc63eb89bce0522515b5Daniel Dunbar
1409bf54a06f9b771c2a2730cc63eb89bce0522515b5Daniel Dunbar    // FIXME: Remove these special cases.
14107cfe31a713d8fcfc2a1328e8fbd8efdeb0aec51bDaniel Dunbar    if (Arch == "powerpc")
14117cfe31a713d8fcfc2a1328e8fbd8efdeb0aec51bDaniel Dunbar      CmdArgs.push_back("ppc");
14127cfe31a713d8fcfc2a1328e8fbd8efdeb0aec51bDaniel Dunbar    else if (Arch == "powerpc64")
14137cfe31a713d8fcfc2a1328e8fbd8efdeb0aec51bDaniel Dunbar      CmdArgs.push_back("ppc64");
14147cfe31a713d8fcfc2a1328e8fbd8efdeb0aec51bDaniel Dunbar    else
1415881376467c46c5c6cc16fa6790271c2c22e1d4f1Daniel Dunbar      CmdArgs.push_back(Args.MakeArgString(Arch));
1416b488c1dac8e53206f07103d794a62a3f5012c0f4Daniel Dunbar  }
1417b488c1dac8e53206f07103d794a62a3f5012c0f4Daniel Dunbar
14186ecc7a993f939c5255c36c7c0d965fb9c1543f2aDaniel Dunbar  // Try to force gcc to match the tool chain we want, if we recognize
14196ecc7a993f939c5255c36c7c0d965fb9c1543f2aDaniel Dunbar  // the arch.
14207cfe31a713d8fcfc2a1328e8fbd8efdeb0aec51bDaniel Dunbar  //
14217cfe31a713d8fcfc2a1328e8fbd8efdeb0aec51bDaniel Dunbar  // FIXME: The triple class should directly provide the information we want
14227cfe31a713d8fcfc2a1328e8fbd8efdeb0aec51bDaniel Dunbar  // here.
14237cfe31a713d8fcfc2a1328e8fbd8efdeb0aec51bDaniel Dunbar  if (Arch == "i386" || Arch == "powerpc")
14246ecc7a993f939c5255c36c7c0d965fb9c1543f2aDaniel Dunbar    CmdArgs.push_back("-m32");
14257cfe31a713d8fcfc2a1328e8fbd8efdeb0aec51bDaniel Dunbar  else if (Arch == "x86_64" || Arch == "powerpc64")
14266ecc7a993f939c5255c36c7c0d965fb9c1543f2aDaniel Dunbar    CmdArgs.push_back("-m64");
14276ecc7a993f939c5255c36c7c0d965fb9c1543f2aDaniel Dunbar
1428b488c1dac8e53206f07103d794a62a3f5012c0f4Daniel Dunbar  if (Output.isPipe()) {
1429b488c1dac8e53206f07103d794a62a3f5012c0f4Daniel Dunbar    CmdArgs.push_back("-o");
1430b488c1dac8e53206f07103d794a62a3f5012c0f4Daniel Dunbar    CmdArgs.push_back("-");
1431115a79277edababaf1b26e3654044ae983197679Daniel Dunbar  } else if (Output.isFilename()) {
1432b488c1dac8e53206f07103d794a62a3f5012c0f4Daniel Dunbar    CmdArgs.push_back("-o");
1433115a79277edababaf1b26e3654044ae983197679Daniel Dunbar    CmdArgs.push_back(Output.getFilename());
1434115a79277edababaf1b26e3654044ae983197679Daniel Dunbar  } else {
1435115a79277edababaf1b26e3654044ae983197679Daniel Dunbar    assert(Output.isNothing() && "Unexpected output");
1436b488c1dac8e53206f07103d794a62a3f5012c0f4Daniel Dunbar    CmdArgs.push_back("-fsyntax-only");
1437115a79277edababaf1b26e3654044ae983197679Daniel Dunbar  }
1438b488c1dac8e53206f07103d794a62a3f5012c0f4Daniel Dunbar
1439b488c1dac8e53206f07103d794a62a3f5012c0f4Daniel Dunbar
1440b488c1dac8e53206f07103d794a62a3f5012c0f4Daniel Dunbar  // Only pass -x if gcc will understand it; otherwise hope gcc
1441b488c1dac8e53206f07103d794a62a3f5012c0f4Daniel Dunbar  // understands the suffix correctly. The main use case this would go
1442b488c1dac8e53206f07103d794a62a3f5012c0f4Daniel Dunbar  // wrong in is for linker inputs if they happened to have an odd
1443b488c1dac8e53206f07103d794a62a3f5012c0f4Daniel Dunbar  // suffix; really the only way to get this to happen is a command
1444b488c1dac8e53206f07103d794a62a3f5012c0f4Daniel Dunbar  // like '-x foobar a.c' which will treat a.c like a linker input.
1445b488c1dac8e53206f07103d794a62a3f5012c0f4Daniel Dunbar  //
1446b488c1dac8e53206f07103d794a62a3f5012c0f4Daniel Dunbar  // FIXME: For the linker case specifically, can we safely convert
1447b488c1dac8e53206f07103d794a62a3f5012c0f4Daniel Dunbar  // inputs into '-Wl,' options?
1448b488c1dac8e53206f07103d794a62a3f5012c0f4Daniel Dunbar  for (InputInfoList::const_iterator
1449b488c1dac8e53206f07103d794a62a3f5012c0f4Daniel Dunbar         it = Inputs.begin(), ie = Inputs.end(); it != ie; ++it) {
1450b488c1dac8e53206f07103d794a62a3f5012c0f4Daniel Dunbar    const InputInfo &II = *it;
1451a8304f67291b0182fb64f3afc621615288dd1d31Daniel Dunbar
14525915fbf310e171c4cd3c2af05e9de360c0fa988aDaniel Dunbar    // Don't try to pass LLVM or AST inputs to a generic gcc.
1453a8304f67291b0182fb64f3afc621615288dd1d31Daniel Dunbar    if (II.getType() == types::TY_LLVMBC)
1454a8304f67291b0182fb64f3afc621615288dd1d31Daniel Dunbar      D.Diag(clang::diag::err_drv_no_linker_llvm_support)
1455881376467c46c5c6cc16fa6790271c2c22e1d4f1Daniel Dunbar        << getToolChain().getTripleString();
14565915fbf310e171c4cd3c2af05e9de360c0fa988aDaniel Dunbar    else if (II.getType() == types::TY_AST)
14575915fbf310e171c4cd3c2af05e9de360c0fa988aDaniel Dunbar      D.Diag(clang::diag::err_drv_no_ast_support)
1458881376467c46c5c6cc16fa6790271c2c22e1d4f1Daniel Dunbar        << getToolChain().getTripleString();
1459a8304f67291b0182fb64f3afc621615288dd1d31Daniel Dunbar
1460b488c1dac8e53206f07103d794a62a3f5012c0f4Daniel Dunbar    if (types::canTypeBeUserSpecified(II.getType())) {
1461b488c1dac8e53206f07103d794a62a3f5012c0f4Daniel Dunbar      CmdArgs.push_back("-x");
1462b488c1dac8e53206f07103d794a62a3f5012c0f4Daniel Dunbar      CmdArgs.push_back(types::getTypeName(II.getType()));
1463b488c1dac8e53206f07103d794a62a3f5012c0f4Daniel Dunbar    }
1464b488c1dac8e53206f07103d794a62a3f5012c0f4Daniel Dunbar
1465b488c1dac8e53206f07103d794a62a3f5012c0f4Daniel Dunbar    if (II.isPipe())
1466b488c1dac8e53206f07103d794a62a3f5012c0f4Daniel Dunbar      CmdArgs.push_back("-");
1467115a79277edababaf1b26e3654044ae983197679Daniel Dunbar    else if (II.isFilename())
1468115a79277edababaf1b26e3654044ae983197679Daniel Dunbar      CmdArgs.push_back(II.getFilename());
1469b488c1dac8e53206f07103d794a62a3f5012c0f4Daniel Dunbar    else
1470115a79277edababaf1b26e3654044ae983197679Daniel Dunbar      // Don't render as input, we need gcc to do the translations.
1471115a79277edababaf1b26e3654044ae983197679Daniel Dunbar      II.getInputArg().render(Args, CmdArgs);
1472b488c1dac8e53206f07103d794a62a3f5012c0f4Daniel Dunbar  }
1473b488c1dac8e53206f07103d794a62a3f5012c0f4Daniel Dunbar
1474ee788e70fcd0adf76103b17c78ac658d4ea30c9bDaniel Dunbar  const char *GCCName = getToolChain().getDriver().CCCGenericGCCName.c_str();
1475c21c485b4fb58ef5d55cf3e523263dd824a2ace4Daniel Dunbar  const char *Exec =
14765ed34f4c58b6ad4e21038d713c1fae31a6146ff5Daniel Dunbar    Args.MakeArgString(getToolChain().GetProgramPath(C, GCCName));
1477daab7b1016f0a82fefa4f7be6e63c57c06b19ffcDaniel Dunbar  Dest.addCommand(new Command(JA, *this, Exec, CmdArgs));
147847ac7d27c44bd64a7d0fc03d4babc196cf2b8230Daniel Dunbar}
147947ac7d27c44bd64a7d0fc03d4babc196cf2b8230Daniel Dunbar
148082b51cce8cea6b6bb6175c406c2ab425c91d9dc8Daniel Dunbarvoid gcc::Preprocess::RenderExtraToolArgs(const JobAction &JA,
148182b51cce8cea6b6bb6175c406c2ab425c91d9dc8Daniel Dunbar                                          ArgStringList &CmdArgs) const {
1482b488c1dac8e53206f07103d794a62a3f5012c0f4Daniel Dunbar  CmdArgs.push_back("-E");
148347ac7d27c44bd64a7d0fc03d4babc196cf2b8230Daniel Dunbar}
148447ac7d27c44bd64a7d0fc03d4babc196cf2b8230Daniel Dunbar
148582b51cce8cea6b6bb6175c406c2ab425c91d9dc8Daniel Dunbarvoid gcc::Precompile::RenderExtraToolArgs(const JobAction &JA,
148682b51cce8cea6b6bb6175c406c2ab425c91d9dc8Daniel Dunbar                                          ArgStringList &CmdArgs) const {
1487b488c1dac8e53206f07103d794a62a3f5012c0f4Daniel Dunbar  // The type is good enough.
148847ac7d27c44bd64a7d0fc03d4babc196cf2b8230Daniel Dunbar}
148947ac7d27c44bd64a7d0fc03d4babc196cf2b8230Daniel Dunbar
149082b51cce8cea6b6bb6175c406c2ab425c91d9dc8Daniel Dunbarvoid gcc::Compile::RenderExtraToolArgs(const JobAction &JA,
149182b51cce8cea6b6bb6175c406c2ab425c91d9dc8Daniel Dunbar                                       ArgStringList &CmdArgs) const {
149264952508c2b0c8bffb45c8b410f0af3d2457f59bDaniel Dunbar  const Driver &D = getToolChain().getDriver();
149364952508c2b0c8bffb45c8b410f0af3d2457f59bDaniel Dunbar
149482b51cce8cea6b6bb6175c406c2ab425c91d9dc8Daniel Dunbar  // If -flto, etc. are present then make sure not to force assembly output.
149582b51cce8cea6b6bb6175c406c2ab425c91d9dc8Daniel Dunbar  if (JA.getType() == types::TY_LLVMBC)
149682b51cce8cea6b6bb6175c406c2ab425c91d9dc8Daniel Dunbar    CmdArgs.push_back("-c");
149764952508c2b0c8bffb45c8b410f0af3d2457f59bDaniel Dunbar  else {
149864952508c2b0c8bffb45c8b410f0af3d2457f59bDaniel Dunbar    if (JA.getType() != types::TY_PP_Asm)
149964952508c2b0c8bffb45c8b410f0af3d2457f59bDaniel Dunbar      D.Diag(clang::diag::err_drv_invalid_gcc_output_type)
150064952508c2b0c8bffb45c8b410f0af3d2457f59bDaniel Dunbar        << getTypeName(JA.getType());
150164952508c2b0c8bffb45c8b410f0af3d2457f59bDaniel Dunbar
150282b51cce8cea6b6bb6175c406c2ab425c91d9dc8Daniel Dunbar    CmdArgs.push_back("-S");
150364952508c2b0c8bffb45c8b410f0af3d2457f59bDaniel Dunbar  }
150447ac7d27c44bd64a7d0fc03d4babc196cf2b8230Daniel Dunbar}
150547ac7d27c44bd64a7d0fc03d4babc196cf2b8230Daniel Dunbar
150682b51cce8cea6b6bb6175c406c2ab425c91d9dc8Daniel Dunbarvoid gcc::Assemble::RenderExtraToolArgs(const JobAction &JA,
150782b51cce8cea6b6bb6175c406c2ab425c91d9dc8Daniel Dunbar                                        ArgStringList &CmdArgs) const {
1508b488c1dac8e53206f07103d794a62a3f5012c0f4Daniel Dunbar  CmdArgs.push_back("-c");
1509b488c1dac8e53206f07103d794a62a3f5012c0f4Daniel Dunbar}
151047ac7d27c44bd64a7d0fc03d4babc196cf2b8230Daniel Dunbar
151182b51cce8cea6b6bb6175c406c2ab425c91d9dc8Daniel Dunbarvoid gcc::Link::RenderExtraToolArgs(const JobAction &JA,
151282b51cce8cea6b6bb6175c406c2ab425c91d9dc8Daniel Dunbar                                    ArgStringList &CmdArgs) const {
1513b488c1dac8e53206f07103d794a62a3f5012c0f4Daniel Dunbar  // The types are (hopefully) good enough.
151447ac7d27c44bd64a7d0fc03d4babc196cf2b8230Daniel Dunbar}
1515b488c1dac8e53206f07103d794a62a3f5012c0f4Daniel Dunbar
151640f1265ebd42ece3e7f7917319b56012e8e2bce2Daniel Dunbarconst char *darwin::CC1::getCC1Name(types::ID Type) const {
151740f1265ebd42ece3e7f7917319b56012e8e2bce2Daniel Dunbar  switch (Type) {
151840f1265ebd42ece3e7f7917319b56012e8e2bce2Daniel Dunbar  default:
151940f1265ebd42ece3e7f7917319b56012e8e2bce2Daniel Dunbar    assert(0 && "Unexpected type for Darwin CC1 tool.");
152040f1265ebd42ece3e7f7917319b56012e8e2bce2Daniel Dunbar  case types::TY_Asm:
152140f1265ebd42ece3e7f7917319b56012e8e2bce2Daniel Dunbar  case types::TY_C: case types::TY_CHeader:
152240f1265ebd42ece3e7f7917319b56012e8e2bce2Daniel Dunbar  case types::TY_PP_C: case types::TY_PP_CHeader:
152340f1265ebd42ece3e7f7917319b56012e8e2bce2Daniel Dunbar    return "cc1";
152440f1265ebd42ece3e7f7917319b56012e8e2bce2Daniel Dunbar  case types::TY_ObjC: case types::TY_ObjCHeader:
152540f1265ebd42ece3e7f7917319b56012e8e2bce2Daniel Dunbar  case types::TY_PP_ObjC: case types::TY_PP_ObjCHeader:
152640f1265ebd42ece3e7f7917319b56012e8e2bce2Daniel Dunbar    return "cc1obj";
152740f1265ebd42ece3e7f7917319b56012e8e2bce2Daniel Dunbar  case types::TY_CXX: case types::TY_CXXHeader:
152840f1265ebd42ece3e7f7917319b56012e8e2bce2Daniel Dunbar  case types::TY_PP_CXX: case types::TY_PP_CXXHeader:
152940f1265ebd42ece3e7f7917319b56012e8e2bce2Daniel Dunbar    return "cc1plus";
153040f1265ebd42ece3e7f7917319b56012e8e2bce2Daniel Dunbar  case types::TY_ObjCXX: case types::TY_ObjCXXHeader:
153140f1265ebd42ece3e7f7917319b56012e8e2bce2Daniel Dunbar  case types::TY_PP_ObjCXX: case types::TY_PP_ObjCXXHeader:
153240f1265ebd42ece3e7f7917319b56012e8e2bce2Daniel Dunbar    return "cc1objplus";
153340f1265ebd42ece3e7f7917319b56012e8e2bce2Daniel Dunbar  }
153440f1265ebd42ece3e7f7917319b56012e8e2bce2Daniel Dunbar}
153540f1265ebd42ece3e7f7917319b56012e8e2bce2Daniel Dunbar
1536c21c485b4fb58ef5d55cf3e523263dd824a2ace4Daniel Dunbarconst char *darwin::CC1::getBaseInputName(const ArgList &Args,
1537a5a7bd0de7b6b80212095195a055a4a43f21d4b2Daniel Dunbar                                          const InputInfoList &Inputs) {
1538a3ec60e0cf2a1916f479288998d31bd980b1a306Daniel Dunbar  llvm::sys::Path P(Inputs[0].getBaseInput());
1539881376467c46c5c6cc16fa6790271c2c22e1d4f1Daniel Dunbar  return Args.MakeArgString(P.getLast());
1540a3ec60e0cf2a1916f479288998d31bd980b1a306Daniel Dunbar}
1541a3ec60e0cf2a1916f479288998d31bd980b1a306Daniel Dunbar
1542c21c485b4fb58ef5d55cf3e523263dd824a2ace4Daniel Dunbarconst char *darwin::CC1::getBaseInputStem(const ArgList &Args,
1543a5a7bd0de7b6b80212095195a055a4a43f21d4b2Daniel Dunbar                                          const InputInfoList &Inputs) {
1544a3ec60e0cf2a1916f479288998d31bd980b1a306Daniel Dunbar  const char *Str = getBaseInputName(Args, Inputs);
1545a3ec60e0cf2a1916f479288998d31bd980b1a306Daniel Dunbar
1546a3ec60e0cf2a1916f479288998d31bd980b1a306Daniel Dunbar  if (const char *End = strchr(Str, '.'))
1547881376467c46c5c6cc16fa6790271c2c22e1d4f1Daniel Dunbar    return Args.MakeArgString(std::string(Str, End));
1548a3ec60e0cf2a1916f479288998d31bd980b1a306Daniel Dunbar
1549a3ec60e0cf2a1916f479288998d31bd980b1a306Daniel Dunbar  return Str;
1550a3ec60e0cf2a1916f479288998d31bd980b1a306Daniel Dunbar}
1551a3ec60e0cf2a1916f479288998d31bd980b1a306Daniel Dunbar
1552a3ec60e0cf2a1916f479288998d31bd980b1a306Daniel Dunbarconst char *
1553c21c485b4fb58ef5d55cf3e523263dd824a2ace4Daniel Dunbardarwin::CC1::getDependencyFileName(const ArgList &Args,
1554a5a7bd0de7b6b80212095195a055a4a43f21d4b2Daniel Dunbar                                   const InputInfoList &Inputs) {
1555a3ec60e0cf2a1916f479288998d31bd980b1a306Daniel Dunbar  // FIXME: Think about this more.
1556a3ec60e0cf2a1916f479288998d31bd980b1a306Daniel Dunbar  std::string Res;
1557a3ec60e0cf2a1916f479288998d31bd980b1a306Daniel Dunbar
1558a3ec60e0cf2a1916f479288998d31bd980b1a306Daniel Dunbar  if (Arg *OutputOpt = Args.getLastArg(options::OPT_o)) {
1559a3ec60e0cf2a1916f479288998d31bd980b1a306Daniel Dunbar    std::string Str(OutputOpt->getValue(Args));
1560c21c485b4fb58ef5d55cf3e523263dd824a2ace4Daniel Dunbar
1561a3ec60e0cf2a1916f479288998d31bd980b1a306Daniel Dunbar    Res = Str.substr(0, Str.rfind('.'));
1562a3ec60e0cf2a1916f479288998d31bd980b1a306Daniel Dunbar  } else
1563a5a7bd0de7b6b80212095195a055a4a43f21d4b2Daniel Dunbar    Res = darwin::CC1::getBaseInputStem(Args, Inputs);
1564a3ec60e0cf2a1916f479288998d31bd980b1a306Daniel Dunbar
1565881376467c46c5c6cc16fa6790271c2c22e1d4f1Daniel Dunbar  return Args.MakeArgString(Res + ".d");
1566a3ec60e0cf2a1916f479288998d31bd980b1a306Daniel Dunbar}
1567a3ec60e0cf2a1916f479288998d31bd980b1a306Daniel Dunbar
1568c21c485b4fb58ef5d55cf3e523263dd824a2ace4Daniel Dunbarvoid darwin::CC1::AddCC1Args(const ArgList &Args,
1569a3ec60e0cf2a1916f479288998d31bd980b1a306Daniel Dunbar                             ArgStringList &CmdArgs) const {
1570ee788e70fcd0adf76103b17c78ac658d4ea30c9bDaniel Dunbar  const Driver &D = getToolChain().getDriver();
1571e2fd66418eca3d70cf6b62087d745d0c5181db69Daniel Dunbar
1572e2fd66418eca3d70cf6b62087d745d0c5181db69Daniel Dunbar  CheckCodeGenerationOptions(D, Args);
1573e2fd66418eca3d70cf6b62087d745d0c5181db69Daniel Dunbar
1574a3ec60e0cf2a1916f479288998d31bd980b1a306Daniel Dunbar  // Derived from cc1 spec.
1575a3ec60e0cf2a1916f479288998d31bd980b1a306Daniel Dunbar  if (!Args.hasArg(options::OPT_mkernel) && !Args.hasArg(options::OPT_static) &&
1576a3ec60e0cf2a1916f479288998d31bd980b1a306Daniel Dunbar      !Args.hasArg(options::OPT_mdynamic_no_pic))
1577a3ec60e0cf2a1916f479288998d31bd980b1a306Daniel Dunbar    CmdArgs.push_back("-fPIC");
1578a3ec60e0cf2a1916f479288998d31bd980b1a306Daniel Dunbar
15792ba91575905a54f712a7f64304e56002e4882499Daniel Dunbar  if (getToolChain().getTriple().getArch() == llvm::Triple::arm ||
15802ba91575905a54f712a7f64304e56002e4882499Daniel Dunbar      getToolChain().getTriple().getArch() == llvm::Triple::thumb) {
15812ba91575905a54f712a7f64304e56002e4882499Daniel Dunbar    if (!Args.hasArg(options::OPT_fbuiltin_strcat))
15822ba91575905a54f712a7f64304e56002e4882499Daniel Dunbar      CmdArgs.push_back("-fno-builtin-strcat");
15832ba91575905a54f712a7f64304e56002e4882499Daniel Dunbar    if (!Args.hasArg(options::OPT_fbuiltin_strcpy))
15842ba91575905a54f712a7f64304e56002e4882499Daniel Dunbar      CmdArgs.push_back("-fno-builtin-strcpy");
15852ba91575905a54f712a7f64304e56002e4882499Daniel Dunbar  }
15862ba91575905a54f712a7f64304e56002e4882499Daniel Dunbar
1587a3ec60e0cf2a1916f479288998d31bd980b1a306Daniel Dunbar  // gcc has some code here to deal with when no -mmacosx-version-min
1588a3ec60e0cf2a1916f479288998d31bd980b1a306Daniel Dunbar  // and no -miphoneos-version-min is present, but this never happens
1589a3ec60e0cf2a1916f479288998d31bd980b1a306Daniel Dunbar  // due to tool chain specific argument translation.
1590a3ec60e0cf2a1916f479288998d31bd980b1a306Daniel Dunbar
1591a3ec60e0cf2a1916f479288998d31bd980b1a306Daniel Dunbar  if (Args.hasArg(options::OPT_g_Flag) &&
1592a3ec60e0cf2a1916f479288998d31bd980b1a306Daniel Dunbar      !Args.hasArg(options::OPT_fno_eliminate_unused_debug_symbols))
1593a3ec60e0cf2a1916f479288998d31bd980b1a306Daniel Dunbar    CmdArgs.push_back("-feliminate-unused-debug-symbols");
1594a3ec60e0cf2a1916f479288998d31bd980b1a306Daniel Dunbar}
1595a3ec60e0cf2a1916f479288998d31bd980b1a306Daniel Dunbar
1596a3ec60e0cf2a1916f479288998d31bd980b1a306Daniel Dunbarvoid darwin::CC1::AddCC1OptionsArgs(const ArgList &Args, ArgStringList &CmdArgs,
1597a3ec60e0cf2a1916f479288998d31bd980b1a306Daniel Dunbar                                    const InputInfoList &Inputs,
1598a3ec60e0cf2a1916f479288998d31bd980b1a306Daniel Dunbar                                    const ArgStringList &OutputArgs) const {
1599ee788e70fcd0adf76103b17c78ac658d4ea30c9bDaniel Dunbar  const Driver &D = getToolChain().getDriver();
1600a3ec60e0cf2a1916f479288998d31bd980b1a306Daniel Dunbar
1601a3ec60e0cf2a1916f479288998d31bd980b1a306Daniel Dunbar  // Derived from cc1_options spec.
1602a3ec60e0cf2a1916f479288998d31bd980b1a306Daniel Dunbar  if (Args.hasArg(options::OPT_fast) ||
1603a3ec60e0cf2a1916f479288998d31bd980b1a306Daniel Dunbar      Args.hasArg(options::OPT_fastf) ||
1604a3ec60e0cf2a1916f479288998d31bd980b1a306Daniel Dunbar      Args.hasArg(options::OPT_fastcp))
1605a3ec60e0cf2a1916f479288998d31bd980b1a306Daniel Dunbar    CmdArgs.push_back("-O3");
1606c21c485b4fb58ef5d55cf3e523263dd824a2ace4Daniel Dunbar
1607a3ec60e0cf2a1916f479288998d31bd980b1a306Daniel Dunbar  if (Arg *A = Args.getLastArg(options::OPT_pg))
1608a3ec60e0cf2a1916f479288998d31bd980b1a306Daniel Dunbar    if (Args.hasArg(options::OPT_fomit_frame_pointer))
1609a3ec60e0cf2a1916f479288998d31bd980b1a306Daniel Dunbar      D.Diag(clang::diag::err_drv_argument_not_allowed_with)
1610a3ec60e0cf2a1916f479288998d31bd980b1a306Daniel Dunbar        << A->getAsString(Args) << "-fomit-frame-pointer";
1611a3ec60e0cf2a1916f479288998d31bd980b1a306Daniel Dunbar
1612a3ec60e0cf2a1916f479288998d31bd980b1a306Daniel Dunbar  AddCC1Args(Args, CmdArgs);
1613a3ec60e0cf2a1916f479288998d31bd980b1a306Daniel Dunbar
1614a3ec60e0cf2a1916f479288998d31bd980b1a306Daniel Dunbar  if (!Args.hasArg(options::OPT_Q))
1615a3ec60e0cf2a1916f479288998d31bd980b1a306Daniel Dunbar    CmdArgs.push_back("-quiet");
1616a3ec60e0cf2a1916f479288998d31bd980b1a306Daniel Dunbar
1617a3ec60e0cf2a1916f479288998d31bd980b1a306Daniel Dunbar  CmdArgs.push_back("-dumpbase");
1618a5a7bd0de7b6b80212095195a055a4a43f21d4b2Daniel Dunbar  CmdArgs.push_back(darwin::CC1::getBaseInputName(Args, Inputs));
1619a3ec60e0cf2a1916f479288998d31bd980b1a306Daniel Dunbar
1620a3ec60e0cf2a1916f479288998d31bd980b1a306Daniel Dunbar  Args.AddAllArgs(CmdArgs, options::OPT_d_Group);
1621a3ec60e0cf2a1916f479288998d31bd980b1a306Daniel Dunbar
1622a3ec60e0cf2a1916f479288998d31bd980b1a306Daniel Dunbar  Args.AddAllArgs(CmdArgs, options::OPT_m_Group);
1623a3ec60e0cf2a1916f479288998d31bd980b1a306Daniel Dunbar  Args.AddAllArgs(CmdArgs, options::OPT_a_Group);
1624a3ec60e0cf2a1916f479288998d31bd980b1a306Daniel Dunbar
1625a3ec60e0cf2a1916f479288998d31bd980b1a306Daniel Dunbar  // FIXME: The goal is to use the user provided -o if that is our
1626a3ec60e0cf2a1916f479288998d31bd980b1a306Daniel Dunbar  // final output, otherwise to drive from the original input
1627a3ec60e0cf2a1916f479288998d31bd980b1a306Daniel Dunbar  // name. Find a clean way to go about this.
1628a3ec60e0cf2a1916f479288998d31bd980b1a306Daniel Dunbar  if ((Args.hasArg(options::OPT_c) || Args.hasArg(options::OPT_S)) &&
1629a3ec60e0cf2a1916f479288998d31bd980b1a306Daniel Dunbar      Args.hasArg(options::OPT_o)) {
1630a3ec60e0cf2a1916f479288998d31bd980b1a306Daniel Dunbar    Arg *OutputOpt = Args.getLastArg(options::OPT_o);
1631a3ec60e0cf2a1916f479288998d31bd980b1a306Daniel Dunbar    CmdArgs.push_back("-auxbase-strip");
1632a3ec60e0cf2a1916f479288998d31bd980b1a306Daniel Dunbar    CmdArgs.push_back(OutputOpt->getValue(Args));
1633a3ec60e0cf2a1916f479288998d31bd980b1a306Daniel Dunbar  } else {
1634a3ec60e0cf2a1916f479288998d31bd980b1a306Daniel Dunbar    CmdArgs.push_back("-auxbase");
1635a5a7bd0de7b6b80212095195a055a4a43f21d4b2Daniel Dunbar    CmdArgs.push_back(darwin::CC1::getBaseInputStem(Args, Inputs));
1636a3ec60e0cf2a1916f479288998d31bd980b1a306Daniel Dunbar  }
1637a3ec60e0cf2a1916f479288998d31bd980b1a306Daniel Dunbar
1638a3ec60e0cf2a1916f479288998d31bd980b1a306Daniel Dunbar  Args.AddAllArgs(CmdArgs, options::OPT_g_Group);
1639a3ec60e0cf2a1916f479288998d31bd980b1a306Daniel Dunbar
1640a3ec60e0cf2a1916f479288998d31bd980b1a306Daniel Dunbar  Args.AddAllArgs(CmdArgs, options::OPT_O);
1641a3ec60e0cf2a1916f479288998d31bd980b1a306Daniel Dunbar  // FIXME: -Wall is getting some special treatment. Investigate.
1642a3ec60e0cf2a1916f479288998d31bd980b1a306Daniel Dunbar  Args.AddAllArgs(CmdArgs, options::OPT_W_Group, options::OPT_pedantic_Group);
1643a3ec60e0cf2a1916f479288998d31bd980b1a306Daniel Dunbar  Args.AddLastArg(CmdArgs, options::OPT_w);
1644c21c485b4fb58ef5d55cf3e523263dd824a2ace4Daniel Dunbar  Args.AddAllArgs(CmdArgs, options::OPT_std_EQ, options::OPT_ansi,
1645a3ec60e0cf2a1916f479288998d31bd980b1a306Daniel Dunbar                  options::OPT_trigraphs);
1646a3ff202ee4fb21728e930d5d029ba4925129912cDaniel Dunbar  if (!Args.getLastArg(options::OPT_std_EQ, options::OPT_ansi)) {
1647a3ff202ee4fb21728e930d5d029ba4925129912cDaniel Dunbar    // Honor -std-default.
1648a3ff202ee4fb21728e930d5d029ba4925129912cDaniel Dunbar    Args.AddAllArgsTranslated(CmdArgs, options::OPT_std_default_EQ,
1649a3ff202ee4fb21728e930d5d029ba4925129912cDaniel Dunbar                              "-std=", /*Joined=*/true);
1650a3ff202ee4fb21728e930d5d029ba4925129912cDaniel Dunbar  }
1651a3ff202ee4fb21728e930d5d029ba4925129912cDaniel Dunbar
1652a3ec60e0cf2a1916f479288998d31bd980b1a306Daniel Dunbar  if (Args.hasArg(options::OPT_v))
1653a3ec60e0cf2a1916f479288998d31bd980b1a306Daniel Dunbar    CmdArgs.push_back("-version");
1654a3ec60e0cf2a1916f479288998d31bd980b1a306Daniel Dunbar  if (Args.hasArg(options::OPT_pg))
1655a3ec60e0cf2a1916f479288998d31bd980b1a306Daniel Dunbar    CmdArgs.push_back("-p");
1656a3ec60e0cf2a1916f479288998d31bd980b1a306Daniel Dunbar  Args.AddLastArg(CmdArgs, options::OPT_p);
1657c21c485b4fb58ef5d55cf3e523263dd824a2ace4Daniel Dunbar
1658a3ec60e0cf2a1916f479288998d31bd980b1a306Daniel Dunbar  // The driver treats -fsyntax-only specially.
16592ba91575905a54f712a7f64304e56002e4882499Daniel Dunbar  if (getToolChain().getTriple().getArch() == llvm::Triple::arm ||
16602ba91575905a54f712a7f64304e56002e4882499Daniel Dunbar      getToolChain().getTriple().getArch() == llvm::Triple::thumb) {
16612ba91575905a54f712a7f64304e56002e4882499Daniel Dunbar    // Removes -fbuiltin-str{cat,cpy}; these aren't recognized by cc1 but are
16622ba91575905a54f712a7f64304e56002e4882499Daniel Dunbar    // used to inhibit the default -fno-builtin-str{cat,cpy}.
16632ba91575905a54f712a7f64304e56002e4882499Daniel Dunbar    //
16642ba91575905a54f712a7f64304e56002e4882499Daniel Dunbar    // FIXME: Should we grow a better way to deal with "removing" args?
1665cdd9686b890ebdc10039ae256ef4c9dfb5ebacb7Daniel Dunbar    for (arg_iterator it = Args.filtered_begin(options::OPT_f_Group,
1666cdd9686b890ebdc10039ae256ef4c9dfb5ebacb7Daniel Dunbar                                               options::OPT_fsyntax_only),
1667cdd9686b890ebdc10039ae256ef4c9dfb5ebacb7Daniel Dunbar           ie = Args.filtered_end(); it != ie; ++it) {
1668cdd9686b890ebdc10039ae256ef4c9dfb5ebacb7Daniel Dunbar      if (!it->getOption().matches(options::OPT_fbuiltin_strcat) &&
1669cdd9686b890ebdc10039ae256ef4c9dfb5ebacb7Daniel Dunbar          !it->getOption().matches(options::OPT_fbuiltin_strcpy)) {
1670cdd9686b890ebdc10039ae256ef4c9dfb5ebacb7Daniel Dunbar        it->claim();
1671cdd9686b890ebdc10039ae256ef4c9dfb5ebacb7Daniel Dunbar        it->render(Args, CmdArgs);
16722ba91575905a54f712a7f64304e56002e4882499Daniel Dunbar      }
16732ba91575905a54f712a7f64304e56002e4882499Daniel Dunbar    }
16742ba91575905a54f712a7f64304e56002e4882499Daniel Dunbar  } else
16752ba91575905a54f712a7f64304e56002e4882499Daniel Dunbar    Args.AddAllArgs(CmdArgs, options::OPT_f_Group, options::OPT_fsyntax_only);
1676c21c485b4fb58ef5d55cf3e523263dd824a2ace4Daniel Dunbar
1677a3ec60e0cf2a1916f479288998d31bd980b1a306Daniel Dunbar  Args.AddAllArgs(CmdArgs, options::OPT_undef);
1678a3ec60e0cf2a1916f479288998d31bd980b1a306Daniel Dunbar  if (Args.hasArg(options::OPT_Qn))
1679a3ec60e0cf2a1916f479288998d31bd980b1a306Daniel Dunbar    CmdArgs.push_back("-fno-ident");
1680c21c485b4fb58ef5d55cf3e523263dd824a2ace4Daniel Dunbar
1681a3ec60e0cf2a1916f479288998d31bd980b1a306Daniel Dunbar  // FIXME: This isn't correct.
1682a3ec60e0cf2a1916f479288998d31bd980b1a306Daniel Dunbar  //Args.AddLastArg(CmdArgs, options::OPT__help)
1683a3ec60e0cf2a1916f479288998d31bd980b1a306Daniel Dunbar  //Args.AddLastArg(CmdArgs, options::OPT__targetHelp)
1684a3ec60e0cf2a1916f479288998d31bd980b1a306Daniel Dunbar
1685a3ec60e0cf2a1916f479288998d31bd980b1a306Daniel Dunbar  CmdArgs.append(OutputArgs.begin(), OutputArgs.end());
1686a3ec60e0cf2a1916f479288998d31bd980b1a306Daniel Dunbar
1687a3ec60e0cf2a1916f479288998d31bd980b1a306Daniel Dunbar  // FIXME: Still don't get what is happening here. Investigate.
1688a3ec60e0cf2a1916f479288998d31bd980b1a306Daniel Dunbar  Args.AddAllArgs(CmdArgs, options::OPT__param);
1689a3ec60e0cf2a1916f479288998d31bd980b1a306Daniel Dunbar
1690a3ec60e0cf2a1916f479288998d31bd980b1a306Daniel Dunbar  if (Args.hasArg(options::OPT_fmudflap) ||
1691a3ec60e0cf2a1916f479288998d31bd980b1a306Daniel Dunbar      Args.hasArg(options::OPT_fmudflapth)) {
1692a3ec60e0cf2a1916f479288998d31bd980b1a306Daniel Dunbar    CmdArgs.push_back("-fno-builtin");
1693a3ec60e0cf2a1916f479288998d31bd980b1a306Daniel Dunbar    CmdArgs.push_back("-fno-merge-constants");
1694a3ec60e0cf2a1916f479288998d31bd980b1a306Daniel Dunbar  }
1695c21c485b4fb58ef5d55cf3e523263dd824a2ace4Daniel Dunbar
1696a3ec60e0cf2a1916f479288998d31bd980b1a306Daniel Dunbar  if (Args.hasArg(options::OPT_coverage)) {
1697a3ec60e0cf2a1916f479288998d31bd980b1a306Daniel Dunbar    CmdArgs.push_back("-fprofile-arcs");
1698a3ec60e0cf2a1916f479288998d31bd980b1a306Daniel Dunbar    CmdArgs.push_back("-ftest-coverage");
1699a3ec60e0cf2a1916f479288998d31bd980b1a306Daniel Dunbar  }
1700a3ec60e0cf2a1916f479288998d31bd980b1a306Daniel Dunbar
1701a3ec60e0cf2a1916f479288998d31bd980b1a306Daniel Dunbar  if (types::isCXX(Inputs[0].getType()))
1702a3ec60e0cf2a1916f479288998d31bd980b1a306Daniel Dunbar    CmdArgs.push_back("-D__private_extern__=extern");
1703a3ec60e0cf2a1916f479288998d31bd980b1a306Daniel Dunbar}
1704a3ec60e0cf2a1916f479288998d31bd980b1a306Daniel Dunbar
1705a3ec60e0cf2a1916f479288998d31bd980b1a306Daniel Dunbarvoid darwin::CC1::AddCPPOptionsArgs(const ArgList &Args, ArgStringList &CmdArgs,
1706a3ec60e0cf2a1916f479288998d31bd980b1a306Daniel Dunbar                                    const InputInfoList &Inputs,
1707a3ec60e0cf2a1916f479288998d31bd980b1a306Daniel Dunbar                                    const ArgStringList &OutputArgs) const {
1708a3ec60e0cf2a1916f479288998d31bd980b1a306Daniel Dunbar  // Derived from cpp_options
1709a3ec60e0cf2a1916f479288998d31bd980b1a306Daniel Dunbar  AddCPPUniqueOptionsArgs(Args, CmdArgs, Inputs);
1710c21c485b4fb58ef5d55cf3e523263dd824a2ace4Daniel Dunbar
1711a3ec60e0cf2a1916f479288998d31bd980b1a306Daniel Dunbar  CmdArgs.append(OutputArgs.begin(), OutputArgs.end());
1712a3ec60e0cf2a1916f479288998d31bd980b1a306Daniel Dunbar
1713a3ec60e0cf2a1916f479288998d31bd980b1a306Daniel Dunbar  AddCC1Args(Args, CmdArgs);
1714a3ec60e0cf2a1916f479288998d31bd980b1a306Daniel Dunbar
1715a3ec60e0cf2a1916f479288998d31bd980b1a306Daniel Dunbar  // NOTE: The code below has some commonality with cpp_options, but
1716a3ec60e0cf2a1916f479288998d31bd980b1a306Daniel Dunbar  // in classic gcc style ends up sending things in different
1717a3ec60e0cf2a1916f479288998d31bd980b1a306Daniel Dunbar  // orders. This may be a good merge candidate once we drop pedantic
1718a3ec60e0cf2a1916f479288998d31bd980b1a306Daniel Dunbar  // compatibility.
1719a3ec60e0cf2a1916f479288998d31bd980b1a306Daniel Dunbar
1720a3ec60e0cf2a1916f479288998d31bd980b1a306Daniel Dunbar  Args.AddAllArgs(CmdArgs, options::OPT_m_Group);
1721c21c485b4fb58ef5d55cf3e523263dd824a2ace4Daniel Dunbar  Args.AddAllArgs(CmdArgs, options::OPT_std_EQ, options::OPT_ansi,
1722a3ec60e0cf2a1916f479288998d31bd980b1a306Daniel Dunbar                  options::OPT_trigraphs);
1723a3ff202ee4fb21728e930d5d029ba4925129912cDaniel Dunbar  if (!Args.getLastArg(options::OPT_std_EQ, options::OPT_ansi)) {
1724a3ff202ee4fb21728e930d5d029ba4925129912cDaniel Dunbar    // Honor -std-default.
1725a3ff202ee4fb21728e930d5d029ba4925129912cDaniel Dunbar    Args.AddAllArgsTranslated(CmdArgs, options::OPT_std_default_EQ,
1726a3ff202ee4fb21728e930d5d029ba4925129912cDaniel Dunbar                              "-std=", /*Joined=*/true);
1727a3ff202ee4fb21728e930d5d029ba4925129912cDaniel Dunbar  }
1728a3ec60e0cf2a1916f479288998d31bd980b1a306Daniel Dunbar  Args.AddAllArgs(CmdArgs, options::OPT_W_Group, options::OPT_pedantic_Group);
1729a3ec60e0cf2a1916f479288998d31bd980b1a306Daniel Dunbar  Args.AddLastArg(CmdArgs, options::OPT_w);
1730c21c485b4fb58ef5d55cf3e523263dd824a2ace4Daniel Dunbar
1731a3ec60e0cf2a1916f479288998d31bd980b1a306Daniel Dunbar  // The driver treats -fsyntax-only specially.
1732a3ec60e0cf2a1916f479288998d31bd980b1a306Daniel Dunbar  Args.AddAllArgs(CmdArgs, options::OPT_f_Group, options::OPT_fsyntax_only);
1733a3ec60e0cf2a1916f479288998d31bd980b1a306Daniel Dunbar
1734a3ec60e0cf2a1916f479288998d31bd980b1a306Daniel Dunbar  if (Args.hasArg(options::OPT_g_Group) && !Args.hasArg(options::OPT_g0) &&
1735a3ec60e0cf2a1916f479288998d31bd980b1a306Daniel Dunbar      !Args.hasArg(options::OPT_fno_working_directory))
1736a3ec60e0cf2a1916f479288998d31bd980b1a306Daniel Dunbar    CmdArgs.push_back("-fworking-directory");
1737a3ec60e0cf2a1916f479288998d31bd980b1a306Daniel Dunbar
1738a3ec60e0cf2a1916f479288998d31bd980b1a306Daniel Dunbar  Args.AddAllArgs(CmdArgs, options::OPT_O);
1739a3ec60e0cf2a1916f479288998d31bd980b1a306Daniel Dunbar  Args.AddAllArgs(CmdArgs, options::OPT_undef);
1740a3ec60e0cf2a1916f479288998d31bd980b1a306Daniel Dunbar  if (Args.hasArg(options::OPT_save_temps))
1741a3ec60e0cf2a1916f479288998d31bd980b1a306Daniel Dunbar    CmdArgs.push_back("-fpch-preprocess");
1742a3ec60e0cf2a1916f479288998d31bd980b1a306Daniel Dunbar}
1743a3ec60e0cf2a1916f479288998d31bd980b1a306Daniel Dunbar
1744c21c485b4fb58ef5d55cf3e523263dd824a2ace4Daniel Dunbarvoid darwin::CC1::AddCPPUniqueOptionsArgs(const ArgList &Args,
1745a3ec60e0cf2a1916f479288998d31bd980b1a306Daniel Dunbar                                          ArgStringList &CmdArgs,
17461eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump                                          const InputInfoList &Inputs) const {
1747ee788e70fcd0adf76103b17c78ac658d4ea30c9bDaniel Dunbar  const Driver &D = getToolChain().getDriver();
1748a3ec60e0cf2a1916f479288998d31bd980b1a306Daniel Dunbar
174988a3d6cf5ebab81614f89ba48a8d89023270637aDaniel Dunbar  CheckPreprocessingOptions(D, Args);
175088a3d6cf5ebab81614f89ba48a8d89023270637aDaniel Dunbar
1751a3ec60e0cf2a1916f479288998d31bd980b1a306Daniel Dunbar  // Derived from cpp_unique_options.
175288a3d6cf5ebab81614f89ba48a8d89023270637aDaniel Dunbar  // -{C,CC} only with -E is checked in CheckPreprocessingOptions().
175388a3d6cf5ebab81614f89ba48a8d89023270637aDaniel Dunbar  Args.AddLastArg(CmdArgs, options::OPT_C);
175488a3d6cf5ebab81614f89ba48a8d89023270637aDaniel Dunbar  Args.AddLastArg(CmdArgs, options::OPT_CC);
1755a3ec60e0cf2a1916f479288998d31bd980b1a306Daniel Dunbar  if (!Args.hasArg(options::OPT_Q))
1756a3ec60e0cf2a1916f479288998d31bd980b1a306Daniel Dunbar    CmdArgs.push_back("-quiet");
1757a3ec60e0cf2a1916f479288998d31bd980b1a306Daniel Dunbar  Args.AddAllArgs(CmdArgs, options::OPT_nostdinc);
17584c2bcad7b843c10fd4a2ffd43da40bfefb4dc8baDouglas Gregor  Args.AddAllArgs(CmdArgs, options::OPT_nostdincxx);
1759a3ec60e0cf2a1916f479288998d31bd980b1a306Daniel Dunbar  Args.AddLastArg(CmdArgs, options::OPT_v);
1760a3ec60e0cf2a1916f479288998d31bd980b1a306Daniel Dunbar  Args.AddAllArgs(CmdArgs, options::OPT_I_Group, options::OPT_F);
1761a3ec60e0cf2a1916f479288998d31bd980b1a306Daniel Dunbar  Args.AddLastArg(CmdArgs, options::OPT_P);
1762a3ec60e0cf2a1916f479288998d31bd980b1a306Daniel Dunbar
1763a3ec60e0cf2a1916f479288998d31bd980b1a306Daniel Dunbar  // FIXME: Handle %I properly.
1764a3ec60e0cf2a1916f479288998d31bd980b1a306Daniel Dunbar  if (getToolChain().getArchName() == "x86_64") {
1765a3ec60e0cf2a1916f479288998d31bd980b1a306Daniel Dunbar    CmdArgs.push_back("-imultilib");
1766a3ec60e0cf2a1916f479288998d31bd980b1a306Daniel Dunbar    CmdArgs.push_back("x86_64");
1767a3ec60e0cf2a1916f479288998d31bd980b1a306Daniel Dunbar  }
1768a3ec60e0cf2a1916f479288998d31bd980b1a306Daniel Dunbar
1769a3ec60e0cf2a1916f479288998d31bd980b1a306Daniel Dunbar  if (Args.hasArg(options::OPT_MD)) {
1770a3ec60e0cf2a1916f479288998d31bd980b1a306Daniel Dunbar    CmdArgs.push_back("-MD");
1771a5a7bd0de7b6b80212095195a055a4a43f21d4b2Daniel Dunbar    CmdArgs.push_back(darwin::CC1::getDependencyFileName(Args, Inputs));
1772a3ec60e0cf2a1916f479288998d31bd980b1a306Daniel Dunbar  }
1773a3ec60e0cf2a1916f479288998d31bd980b1a306Daniel Dunbar
1774a3ec60e0cf2a1916f479288998d31bd980b1a306Daniel Dunbar  if (Args.hasArg(options::OPT_MMD)) {
1775a3ec60e0cf2a1916f479288998d31bd980b1a306Daniel Dunbar    CmdArgs.push_back("-MMD");
1776a5a7bd0de7b6b80212095195a055a4a43f21d4b2Daniel Dunbar    CmdArgs.push_back(darwin::CC1::getDependencyFileName(Args, Inputs));
1777a3ec60e0cf2a1916f479288998d31bd980b1a306Daniel Dunbar  }
1778a3ec60e0cf2a1916f479288998d31bd980b1a306Daniel Dunbar
1779a3ec60e0cf2a1916f479288998d31bd980b1a306Daniel Dunbar  Args.AddLastArg(CmdArgs, options::OPT_M);
1780a3ec60e0cf2a1916f479288998d31bd980b1a306Daniel Dunbar  Args.AddLastArg(CmdArgs, options::OPT_MM);
1781a3ec60e0cf2a1916f479288998d31bd980b1a306Daniel Dunbar  Args.AddAllArgs(CmdArgs, options::OPT_MF);
1782a3ec60e0cf2a1916f479288998d31bd980b1a306Daniel Dunbar  Args.AddLastArg(CmdArgs, options::OPT_MG);
1783a3ec60e0cf2a1916f479288998d31bd980b1a306Daniel Dunbar  Args.AddLastArg(CmdArgs, options::OPT_MP);
1784a3ec60e0cf2a1916f479288998d31bd980b1a306Daniel Dunbar  Args.AddAllArgs(CmdArgs, options::OPT_MQ);
1785a3ec60e0cf2a1916f479288998d31bd980b1a306Daniel Dunbar  Args.AddAllArgs(CmdArgs, options::OPT_MT);
1786a3ec60e0cf2a1916f479288998d31bd980b1a306Daniel Dunbar  if (!Args.hasArg(options::OPT_M) && !Args.hasArg(options::OPT_MM) &&
1787a3ec60e0cf2a1916f479288998d31bd980b1a306Daniel Dunbar      (Args.hasArg(options::OPT_MD) || Args.hasArg(options::OPT_MMD))) {
1788a3ec60e0cf2a1916f479288998d31bd980b1a306Daniel Dunbar    if (Arg *OutputOpt = Args.getLastArg(options::OPT_o)) {
1789a3ec60e0cf2a1916f479288998d31bd980b1a306Daniel Dunbar      CmdArgs.push_back("-MQ");
1790a3ec60e0cf2a1916f479288998d31bd980b1a306Daniel Dunbar      CmdArgs.push_back(OutputOpt->getValue(Args));
1791a3ec60e0cf2a1916f479288998d31bd980b1a306Daniel Dunbar    }
1792a3ec60e0cf2a1916f479288998d31bd980b1a306Daniel Dunbar  }
1793a3ec60e0cf2a1916f479288998d31bd980b1a306Daniel Dunbar
1794a3ec60e0cf2a1916f479288998d31bd980b1a306Daniel Dunbar  Args.AddLastArg(CmdArgs, options::OPT_remap);
1795a3ec60e0cf2a1916f479288998d31bd980b1a306Daniel Dunbar  if (Args.hasArg(options::OPT_g3))
1796a3ec60e0cf2a1916f479288998d31bd980b1a306Daniel Dunbar    CmdArgs.push_back("-dD");
1797a3ec60e0cf2a1916f479288998d31bd980b1a306Daniel Dunbar  Args.AddLastArg(CmdArgs, options::OPT_H);
1798a3ec60e0cf2a1916f479288998d31bd980b1a306Daniel Dunbar
1799a3ec60e0cf2a1916f479288998d31bd980b1a306Daniel Dunbar  AddCPPArgs(Args, CmdArgs);
1800a3ec60e0cf2a1916f479288998d31bd980b1a306Daniel Dunbar
1801a3ec60e0cf2a1916f479288998d31bd980b1a306Daniel Dunbar  Args.AddAllArgs(CmdArgs, options::OPT_D, options::OPT_U, options::OPT_A);
1802a3ec60e0cf2a1916f479288998d31bd980b1a306Daniel Dunbar  Args.AddAllArgs(CmdArgs, options::OPT_i_Group);
1803a3ec60e0cf2a1916f479288998d31bd980b1a306Daniel Dunbar
1804a3ec60e0cf2a1916f479288998d31bd980b1a306Daniel Dunbar  for (InputInfoList::const_iterator
1805a3ec60e0cf2a1916f479288998d31bd980b1a306Daniel Dunbar         it = Inputs.begin(), ie = Inputs.end(); it != ie; ++it) {
1806a3ec60e0cf2a1916f479288998d31bd980b1a306Daniel Dunbar    const InputInfo &II = *it;
1807c21c485b4fb58ef5d55cf3e523263dd824a2ace4Daniel Dunbar
1808a3ec60e0cf2a1916f479288998d31bd980b1a306Daniel Dunbar    if (II.isPipe())
1809a3ec60e0cf2a1916f479288998d31bd980b1a306Daniel Dunbar      CmdArgs.push_back("-");
1810a3ec60e0cf2a1916f479288998d31bd980b1a306Daniel Dunbar    else
1811a3ec60e0cf2a1916f479288998d31bd980b1a306Daniel Dunbar      CmdArgs.push_back(II.getFilename());
1812a3ec60e0cf2a1916f479288998d31bd980b1a306Daniel Dunbar  }
1813a3ec60e0cf2a1916f479288998d31bd980b1a306Daniel Dunbar
1814a3ec60e0cf2a1916f479288998d31bd980b1a306Daniel Dunbar  Args.AddAllArgValues(CmdArgs, options::OPT_Wp_COMMA,
1815a3ec60e0cf2a1916f479288998d31bd980b1a306Daniel Dunbar                       options::OPT_Xpreprocessor);
1816a3ec60e0cf2a1916f479288998d31bd980b1a306Daniel Dunbar
1817a3ec60e0cf2a1916f479288998d31bd980b1a306Daniel Dunbar  if (Args.hasArg(options::OPT_fmudflap)) {
1818a3ec60e0cf2a1916f479288998d31bd980b1a306Daniel Dunbar    CmdArgs.push_back("-D_MUDFLAP");
1819a3ec60e0cf2a1916f479288998d31bd980b1a306Daniel Dunbar    CmdArgs.push_back("-include");
1820a3ec60e0cf2a1916f479288998d31bd980b1a306Daniel Dunbar    CmdArgs.push_back("mf-runtime.h");
1821a3ec60e0cf2a1916f479288998d31bd980b1a306Daniel Dunbar  }
1822a3ec60e0cf2a1916f479288998d31bd980b1a306Daniel Dunbar
1823a3ec60e0cf2a1916f479288998d31bd980b1a306Daniel Dunbar  if (Args.hasArg(options::OPT_fmudflapth)) {
1824a3ec60e0cf2a1916f479288998d31bd980b1a306Daniel Dunbar    CmdArgs.push_back("-D_MUDFLAP");
1825a3ec60e0cf2a1916f479288998d31bd980b1a306Daniel Dunbar    CmdArgs.push_back("-D_MUDFLAPTH");
1826a3ec60e0cf2a1916f479288998d31bd980b1a306Daniel Dunbar    CmdArgs.push_back("-include");
1827a3ec60e0cf2a1916f479288998d31bd980b1a306Daniel Dunbar    CmdArgs.push_back("mf-runtime.h");
1828a3ec60e0cf2a1916f479288998d31bd980b1a306Daniel Dunbar  }
1829a3ec60e0cf2a1916f479288998d31bd980b1a306Daniel Dunbar}
1830a3ec60e0cf2a1916f479288998d31bd980b1a306Daniel Dunbar
1831c21c485b4fb58ef5d55cf3e523263dd824a2ace4Daniel Dunbarvoid darwin::CC1::AddCPPArgs(const ArgList &Args,
1832a3ec60e0cf2a1916f479288998d31bd980b1a306Daniel Dunbar                             ArgStringList &CmdArgs) const {
1833a3ec60e0cf2a1916f479288998d31bd980b1a306Daniel Dunbar  // Derived from cpp spec.
1834a3ec60e0cf2a1916f479288998d31bd980b1a306Daniel Dunbar
1835a3ec60e0cf2a1916f479288998d31bd980b1a306Daniel Dunbar  if (Args.hasArg(options::OPT_static)) {
1836a3ec60e0cf2a1916f479288998d31bd980b1a306Daniel Dunbar    // The gcc spec is broken here, it refers to dynamic but
1837a3ec60e0cf2a1916f479288998d31bd980b1a306Daniel Dunbar    // that has been translated. Start by being bug compatible.
1838c21c485b4fb58ef5d55cf3e523263dd824a2ace4Daniel Dunbar
1839a3ec60e0cf2a1916f479288998d31bd980b1a306Daniel Dunbar    // if (!Args.hasArg(arglist.parser.dynamicOption))
1840a3ec60e0cf2a1916f479288998d31bd980b1a306Daniel Dunbar    CmdArgs.push_back("-D__STATIC__");
1841a3ec60e0cf2a1916f479288998d31bd980b1a306Daniel Dunbar  } else
1842a3ec60e0cf2a1916f479288998d31bd980b1a306Daniel Dunbar    CmdArgs.push_back("-D__DYNAMIC__");
1843a3ec60e0cf2a1916f479288998d31bd980b1a306Daniel Dunbar
1844a3ec60e0cf2a1916f479288998d31bd980b1a306Daniel Dunbar  if (Args.hasArg(options::OPT_pthread))
1845a3ec60e0cf2a1916f479288998d31bd980b1a306Daniel Dunbar    CmdArgs.push_back("-D_REENTRANT");
1846a3ec60e0cf2a1916f479288998d31bd980b1a306Daniel Dunbar}
1847a3ec60e0cf2a1916f479288998d31bd980b1a306Daniel Dunbar
184840f1265ebd42ece3e7f7917319b56012e8e2bce2Daniel Dunbarvoid darwin::Preprocess::ConstructJob(Compilation &C, const JobAction &JA,
1849c21c485b4fb58ef5d55cf3e523263dd824a2ace4Daniel Dunbar                                      Job &Dest, const InputInfo &Output,
1850c21c485b4fb58ef5d55cf3e523263dd824a2ace4Daniel Dunbar                                      const InputInfoList &Inputs,
1851c21c485b4fb58ef5d55cf3e523263dd824a2ace4Daniel Dunbar                                      const ArgList &Args,
185240f1265ebd42ece3e7f7917319b56012e8e2bce2Daniel Dunbar                                      const char *LinkingOutput) const {
185340f1265ebd42ece3e7f7917319b56012e8e2bce2Daniel Dunbar  ArgStringList CmdArgs;
185440f1265ebd42ece3e7f7917319b56012e8e2bce2Daniel Dunbar
185540f1265ebd42ece3e7f7917319b56012e8e2bce2Daniel Dunbar  assert(Inputs.size() == 1 && "Unexpected number of inputs!");
185640f1265ebd42ece3e7f7917319b56012e8e2bce2Daniel Dunbar
185740f1265ebd42ece3e7f7917319b56012e8e2bce2Daniel Dunbar  CmdArgs.push_back("-E");
185840f1265ebd42ece3e7f7917319b56012e8e2bce2Daniel Dunbar
185940f1265ebd42ece3e7f7917319b56012e8e2bce2Daniel Dunbar  if (Args.hasArg(options::OPT_traditional) ||
186040f1265ebd42ece3e7f7917319b56012e8e2bce2Daniel Dunbar      Args.hasArg(options::OPT_traditional_cpp))
186140f1265ebd42ece3e7f7917319b56012e8e2bce2Daniel Dunbar    CmdArgs.push_back("-traditional-cpp");
1862c21c485b4fb58ef5d55cf3e523263dd824a2ace4Daniel Dunbar
186340f1265ebd42ece3e7f7917319b56012e8e2bce2Daniel Dunbar  ArgStringList OutputArgs;
186440f1265ebd42ece3e7f7917319b56012e8e2bce2Daniel Dunbar  if (Output.isFilename()) {
186540f1265ebd42ece3e7f7917319b56012e8e2bce2Daniel Dunbar    OutputArgs.push_back("-o");
186640f1265ebd42ece3e7f7917319b56012e8e2bce2Daniel Dunbar    OutputArgs.push_back(Output.getFilename());
186740f1265ebd42ece3e7f7917319b56012e8e2bce2Daniel Dunbar  } else {
186840f1265ebd42ece3e7f7917319b56012e8e2bce2Daniel Dunbar    assert(Output.isPipe() && "Unexpected CC1 output.");
186940f1265ebd42ece3e7f7917319b56012e8e2bce2Daniel Dunbar  }
187040f1265ebd42ece3e7f7917319b56012e8e2bce2Daniel Dunbar
18719120f179fd2e354f067e4ef2c76dcf3fc4db8a16Daniel Dunbar  if (Args.hasArg(options::OPT_E)) {
18729120f179fd2e354f067e4ef2c76dcf3fc4db8a16Daniel Dunbar    AddCPPOptionsArgs(Args, CmdArgs, Inputs, OutputArgs);
18739120f179fd2e354f067e4ef2c76dcf3fc4db8a16Daniel Dunbar  } else {
18749120f179fd2e354f067e4ef2c76dcf3fc4db8a16Daniel Dunbar    AddCPPOptionsArgs(Args, CmdArgs, Inputs, ArgStringList());
18759120f179fd2e354f067e4ef2c76dcf3fc4db8a16Daniel Dunbar    CmdArgs.append(OutputArgs.begin(), OutputArgs.end());
18769120f179fd2e354f067e4ef2c76dcf3fc4db8a16Daniel Dunbar  }
1877c21c485b4fb58ef5d55cf3e523263dd824a2ace4Daniel Dunbar
18788a2073a85670a13b0bcc1726bc7f80d458f8245bDaniel Dunbar  Args.AddAllArgs(CmdArgs, options::OPT_d_Group);
18798a2073a85670a13b0bcc1726bc7f80d458f8245bDaniel Dunbar
188040f1265ebd42ece3e7f7917319b56012e8e2bce2Daniel Dunbar  const char *CC1Name = getCC1Name(Inputs[0].getType());
1881c21c485b4fb58ef5d55cf3e523263dd824a2ace4Daniel Dunbar  const char *Exec =
18825ed34f4c58b6ad4e21038d713c1fae31a6146ff5Daniel Dunbar    Args.MakeArgString(getToolChain().GetProgramPath(C, CC1Name));
1883daab7b1016f0a82fefa4f7be6e63c57c06b19ffcDaniel Dunbar  Dest.addCommand(new Command(JA, *this, Exec, CmdArgs));
188440f1265ebd42ece3e7f7917319b56012e8e2bce2Daniel Dunbar}
188540f1265ebd42ece3e7f7917319b56012e8e2bce2Daniel Dunbar
188640f1265ebd42ece3e7f7917319b56012e8e2bce2Daniel Dunbarvoid darwin::Compile::ConstructJob(Compilation &C, const JobAction &JA,
1887c21c485b4fb58ef5d55cf3e523263dd824a2ace4Daniel Dunbar                                   Job &Dest, const InputInfo &Output,
1888c21c485b4fb58ef5d55cf3e523263dd824a2ace4Daniel Dunbar                                   const InputInfoList &Inputs,
1889c21c485b4fb58ef5d55cf3e523263dd824a2ace4Daniel Dunbar                                   const ArgList &Args,
189040f1265ebd42ece3e7f7917319b56012e8e2bce2Daniel Dunbar                                   const char *LinkingOutput) const {
1891ee788e70fcd0adf76103b17c78ac658d4ea30c9bDaniel Dunbar  const Driver &D = getToolChain().getDriver();
189240f1265ebd42ece3e7f7917319b56012e8e2bce2Daniel Dunbar  ArgStringList CmdArgs;
189340f1265ebd42ece3e7f7917319b56012e8e2bce2Daniel Dunbar
189440f1265ebd42ece3e7f7917319b56012e8e2bce2Daniel Dunbar  assert(Inputs.size() == 1 && "Unexpected number of inputs!");
189540f1265ebd42ece3e7f7917319b56012e8e2bce2Daniel Dunbar
189640f1265ebd42ece3e7f7917319b56012e8e2bce2Daniel Dunbar  types::ID InputType = Inputs[0].getType();
189740f1265ebd42ece3e7f7917319b56012e8e2bce2Daniel Dunbar  const Arg *A;
1898ceb5c5b7f67a30fae305d1d19b478b623e4fbcedEli Friedman  if ((A = Args.getLastArg(options::OPT_traditional)))
189940f1265ebd42ece3e7f7917319b56012e8e2bce2Daniel Dunbar    D.Diag(clang::diag::err_drv_argument_only_allowed_with)
190040f1265ebd42ece3e7f7917319b56012e8e2bce2Daniel Dunbar      << A->getAsString(Args) << "-E";
190140f1265ebd42ece3e7f7917319b56012e8e2bce2Daniel Dunbar
190240f1265ebd42ece3e7f7917319b56012e8e2bce2Daniel Dunbar  if (Output.getType() == types::TY_LLVMAsm)
190340f1265ebd42ece3e7f7917319b56012e8e2bce2Daniel Dunbar    CmdArgs.push_back("-emit-llvm");
190440f1265ebd42ece3e7f7917319b56012e8e2bce2Daniel Dunbar  else if (Output.getType() == types::TY_LLVMBC)
190540f1265ebd42ece3e7f7917319b56012e8e2bce2Daniel Dunbar    CmdArgs.push_back("-emit-llvm-bc");
19065915fbf310e171c4cd3c2af05e9de360c0fa988aDaniel Dunbar  else if (Output.getType() == types::TY_AST)
19075915fbf310e171c4cd3c2af05e9de360c0fa988aDaniel Dunbar    D.Diag(clang::diag::err_drv_no_ast_support)
1908881376467c46c5c6cc16fa6790271c2c22e1d4f1Daniel Dunbar      << getToolChain().getTripleString();
1909ae24a88655c461e751d0984cc21dda6e17882356Daniel Dunbar  else if (JA.getType() != types::TY_PP_Asm &&
1910ae24a88655c461e751d0984cc21dda6e17882356Daniel Dunbar           JA.getType() != types::TY_PCH)
191164952508c2b0c8bffb45c8b410f0af3d2457f59bDaniel Dunbar    D.Diag(clang::diag::err_drv_invalid_gcc_output_type)
191264952508c2b0c8bffb45c8b410f0af3d2457f59bDaniel Dunbar      << getTypeName(JA.getType());
191340f1265ebd42ece3e7f7917319b56012e8e2bce2Daniel Dunbar
191440f1265ebd42ece3e7f7917319b56012e8e2bce2Daniel Dunbar  ArgStringList OutputArgs;
191540f1265ebd42ece3e7f7917319b56012e8e2bce2Daniel Dunbar  if (Output.getType() != types::TY_PCH) {
191640f1265ebd42ece3e7f7917319b56012e8e2bce2Daniel Dunbar    OutputArgs.push_back("-o");
191740f1265ebd42ece3e7f7917319b56012e8e2bce2Daniel Dunbar    if (Output.isPipe())
191840f1265ebd42ece3e7f7917319b56012e8e2bce2Daniel Dunbar      OutputArgs.push_back("-");
191940f1265ebd42ece3e7f7917319b56012e8e2bce2Daniel Dunbar    else if (Output.isNothing())
192040f1265ebd42ece3e7f7917319b56012e8e2bce2Daniel Dunbar      OutputArgs.push_back("/dev/null");
192140f1265ebd42ece3e7f7917319b56012e8e2bce2Daniel Dunbar    else
192240f1265ebd42ece3e7f7917319b56012e8e2bce2Daniel Dunbar      OutputArgs.push_back(Output.getFilename());
192340f1265ebd42ece3e7f7917319b56012e8e2bce2Daniel Dunbar  }
192440f1265ebd42ece3e7f7917319b56012e8e2bce2Daniel Dunbar
192540f1265ebd42ece3e7f7917319b56012e8e2bce2Daniel Dunbar  // There is no need for this level of compatibility, but it makes
192640f1265ebd42ece3e7f7917319b56012e8e2bce2Daniel Dunbar  // diffing easier.
192740f1265ebd42ece3e7f7917319b56012e8e2bce2Daniel Dunbar  bool OutputArgsEarly = (Args.hasArg(options::OPT_fsyntax_only) ||
192840f1265ebd42ece3e7f7917319b56012e8e2bce2Daniel Dunbar                          Args.hasArg(options::OPT_S));
192940f1265ebd42ece3e7f7917319b56012e8e2bce2Daniel Dunbar
193040f1265ebd42ece3e7f7917319b56012e8e2bce2Daniel Dunbar  if (types::getPreprocessedType(InputType) != types::TY_INVALID) {
1931a3ec60e0cf2a1916f479288998d31bd980b1a306Daniel Dunbar    AddCPPUniqueOptionsArgs(Args, CmdArgs, Inputs);
193240f1265ebd42ece3e7f7917319b56012e8e2bce2Daniel Dunbar    if (OutputArgsEarly) {
193340f1265ebd42ece3e7f7917319b56012e8e2bce2Daniel Dunbar      AddCC1OptionsArgs(Args, CmdArgs, Inputs, OutputArgs);
193440f1265ebd42ece3e7f7917319b56012e8e2bce2Daniel Dunbar    } else {
193540f1265ebd42ece3e7f7917319b56012e8e2bce2Daniel Dunbar      AddCC1OptionsArgs(Args, CmdArgs, Inputs, ArgStringList());
193640f1265ebd42ece3e7f7917319b56012e8e2bce2Daniel Dunbar      CmdArgs.append(OutputArgs.begin(), OutputArgs.end());
193740f1265ebd42ece3e7f7917319b56012e8e2bce2Daniel Dunbar    }
193840f1265ebd42ece3e7f7917319b56012e8e2bce2Daniel Dunbar  } else {
193940f1265ebd42ece3e7f7917319b56012e8e2bce2Daniel Dunbar    CmdArgs.push_back("-fpreprocessed");
1940c21c485b4fb58ef5d55cf3e523263dd824a2ace4Daniel Dunbar
194140f1265ebd42ece3e7f7917319b56012e8e2bce2Daniel Dunbar    for (InputInfoList::const_iterator
194240f1265ebd42ece3e7f7917319b56012e8e2bce2Daniel Dunbar           it = Inputs.begin(), ie = Inputs.end(); it != ie; ++it) {
194340f1265ebd42ece3e7f7917319b56012e8e2bce2Daniel Dunbar      const InputInfo &II = *it;
194440f1265ebd42ece3e7f7917319b56012e8e2bce2Daniel Dunbar
19455915fbf310e171c4cd3c2af05e9de360c0fa988aDaniel Dunbar      // Reject AST inputs.
19465915fbf310e171c4cd3c2af05e9de360c0fa988aDaniel Dunbar      if (II.getType() == types::TY_AST) {
19475915fbf310e171c4cd3c2af05e9de360c0fa988aDaniel Dunbar        D.Diag(clang::diag::err_drv_no_ast_support)
1948881376467c46c5c6cc16fa6790271c2c22e1d4f1Daniel Dunbar          << getToolChain().getTripleString();
19495915fbf310e171c4cd3c2af05e9de360c0fa988aDaniel Dunbar        return;
19505915fbf310e171c4cd3c2af05e9de360c0fa988aDaniel Dunbar      }
19515915fbf310e171c4cd3c2af05e9de360c0fa988aDaniel Dunbar
195240f1265ebd42ece3e7f7917319b56012e8e2bce2Daniel Dunbar      if (II.isPipe())
195340f1265ebd42ece3e7f7917319b56012e8e2bce2Daniel Dunbar        CmdArgs.push_back("-");
195440f1265ebd42ece3e7f7917319b56012e8e2bce2Daniel Dunbar      else
195540f1265ebd42ece3e7f7917319b56012e8e2bce2Daniel Dunbar        CmdArgs.push_back(II.getFilename());
195640f1265ebd42ece3e7f7917319b56012e8e2bce2Daniel Dunbar    }
195740f1265ebd42ece3e7f7917319b56012e8e2bce2Daniel Dunbar
195840f1265ebd42ece3e7f7917319b56012e8e2bce2Daniel Dunbar    if (OutputArgsEarly) {
195940f1265ebd42ece3e7f7917319b56012e8e2bce2Daniel Dunbar      AddCC1OptionsArgs(Args, CmdArgs, Inputs, OutputArgs);
196040f1265ebd42ece3e7f7917319b56012e8e2bce2Daniel Dunbar    } else {
196140f1265ebd42ece3e7f7917319b56012e8e2bce2Daniel Dunbar      AddCC1OptionsArgs(Args, CmdArgs, Inputs, ArgStringList());
196240f1265ebd42ece3e7f7917319b56012e8e2bce2Daniel Dunbar      CmdArgs.append(OutputArgs.begin(), OutputArgs.end());
196340f1265ebd42ece3e7f7917319b56012e8e2bce2Daniel Dunbar    }
196440f1265ebd42ece3e7f7917319b56012e8e2bce2Daniel Dunbar  }
1965c21c485b4fb58ef5d55cf3e523263dd824a2ace4Daniel Dunbar
196640f1265ebd42ece3e7f7917319b56012e8e2bce2Daniel Dunbar  if (Output.getType() == types::TY_PCH) {
196740f1265ebd42ece3e7f7917319b56012e8e2bce2Daniel Dunbar    assert(Output.isFilename() && "Invalid PCH output.");
196840f1265ebd42ece3e7f7917319b56012e8e2bce2Daniel Dunbar
196940f1265ebd42ece3e7f7917319b56012e8e2bce2Daniel Dunbar    CmdArgs.push_back("-o");
197040f1265ebd42ece3e7f7917319b56012e8e2bce2Daniel Dunbar    // NOTE: gcc uses a temp .s file for this, but there doesn't seem
197140f1265ebd42ece3e7f7917319b56012e8e2bce2Daniel Dunbar    // to be a good reason.
197240f1265ebd42ece3e7f7917319b56012e8e2bce2Daniel Dunbar    CmdArgs.push_back("/dev/null");
1973c21c485b4fb58ef5d55cf3e523263dd824a2ace4Daniel Dunbar
1974e6c9ae147835fb450a90800bd378420c0e5ffb35Daniel Dunbar    CmdArgs.push_back("--output-pch=");
197540f1265ebd42ece3e7f7917319b56012e8e2bce2Daniel Dunbar    CmdArgs.push_back(Output.getFilename());
1976c21c485b4fb58ef5d55cf3e523263dd824a2ace4Daniel Dunbar  }
197740f1265ebd42ece3e7f7917319b56012e8e2bce2Daniel Dunbar
197840f1265ebd42ece3e7f7917319b56012e8e2bce2Daniel Dunbar  const char *CC1Name = getCC1Name(Inputs[0].getType());
1979c21c485b4fb58ef5d55cf3e523263dd824a2ace4Daniel Dunbar  const char *Exec =
19805ed34f4c58b6ad4e21038d713c1fae31a6146ff5Daniel Dunbar    Args.MakeArgString(getToolChain().GetProgramPath(C, CC1Name));
1981daab7b1016f0a82fefa4f7be6e63c57c06b19ffcDaniel Dunbar  Dest.addCommand(new Command(JA, *this, Exec, CmdArgs));
198240f1265ebd42ece3e7f7917319b56012e8e2bce2Daniel Dunbar}
198340f1265ebd42ece3e7f7917319b56012e8e2bce2Daniel Dunbar
19848cac5f7e1ce63dd77ee0fb4ef68f9fa804f41ea6Daniel Dunbarvoid darwin::Assemble::ConstructJob(Compilation &C, const JobAction &JA,
1985c21c485b4fb58ef5d55cf3e523263dd824a2ace4Daniel Dunbar                                    Job &Dest, const InputInfo &Output,
1986c21c485b4fb58ef5d55cf3e523263dd824a2ace4Daniel Dunbar                                    const InputInfoList &Inputs,
1987c21c485b4fb58ef5d55cf3e523263dd824a2ace4Daniel Dunbar                                    const ArgList &Args,
19888cac5f7e1ce63dd77ee0fb4ef68f9fa804f41ea6Daniel Dunbar                                    const char *LinkingOutput) const {
19898cac5f7e1ce63dd77ee0fb4ef68f9fa804f41ea6Daniel Dunbar  ArgStringList CmdArgs;
19908cac5f7e1ce63dd77ee0fb4ef68f9fa804f41ea6Daniel Dunbar
19918cac5f7e1ce63dd77ee0fb4ef68f9fa804f41ea6Daniel Dunbar  assert(Inputs.size() == 1 && "Unexpected number of inputs.");
19928cac5f7e1ce63dd77ee0fb4ef68f9fa804f41ea6Daniel Dunbar  const InputInfo &Input = Inputs[0];
19938cac5f7e1ce63dd77ee0fb4ef68f9fa804f41ea6Daniel Dunbar
19948cac5f7e1ce63dd77ee0fb4ef68f9fa804f41ea6Daniel Dunbar  // Bit of a hack, this is only used for original inputs.
1995c21c485b4fb58ef5d55cf3e523263dd824a2ace4Daniel Dunbar  //
19968e4fea6750dbac032c172f3279c63b7815b7423eDaniel Dunbar  // FIXME: This is broken for preprocessed .s inputs.
19978cac5f7e1ce63dd77ee0fb4ef68f9fa804f41ea6Daniel Dunbar  if (Input.isFilename() &&
19988e4fea6750dbac032c172f3279c63b7815b7423eDaniel Dunbar      strcmp(Input.getFilename(), Input.getBaseInput()) == 0) {
19998e4fea6750dbac032c172f3279c63b7815b7423eDaniel Dunbar    if (Args.hasArg(options::OPT_gstabs))
20008e4fea6750dbac032c172f3279c63b7815b7423eDaniel Dunbar      CmdArgs.push_back("--gstabs");
20018e4fea6750dbac032c172f3279c63b7815b7423eDaniel Dunbar    else if (Args.hasArg(options::OPT_g_Group))
20028e4fea6750dbac032c172f3279c63b7815b7423eDaniel Dunbar      CmdArgs.push_back("--gdwarf2");
20038e4fea6750dbac032c172f3279c63b7815b7423eDaniel Dunbar  }
2004c21c485b4fb58ef5d55cf3e523263dd824a2ace4Daniel Dunbar
20058cac5f7e1ce63dd77ee0fb4ef68f9fa804f41ea6Daniel Dunbar  // Derived from asm spec.
2006cc6f803f98fa6ba9a9c366400210448516d01b3cDaniel Dunbar  AddDarwinArch(Args, CmdArgs);
2007cc6f803f98fa6ba9a9c366400210448516d01b3cDaniel Dunbar
2008251ca6c9fb2bb398d9bf9fe7399c27bed7074b5cDaniel Dunbar  if (!getDarwinToolChain().isTargetIPhoneOS() ||
2009cc6f803f98fa6ba9a9c366400210448516d01b3cDaniel Dunbar      Args.hasArg(options::OPT_force__cpusubtype__ALL))
2010cc6f803f98fa6ba9a9c366400210448516d01b3cDaniel Dunbar    CmdArgs.push_back("-force_cpusubtype_ALL");
20118cac5f7e1ce63dd77ee0fb4ef68f9fa804f41ea6Daniel Dunbar
20120e2679d29be70186fc1197a1484948ed239922baDaniel Dunbar  if (getToolChain().getTriple().getArch() != llvm::Triple::x86_64 &&
20130e2679d29be70186fc1197a1484948ed239922baDaniel Dunbar      (Args.hasArg(options::OPT_mkernel) ||
20148cac5f7e1ce63dd77ee0fb4ef68f9fa804f41ea6Daniel Dunbar       Args.hasArg(options::OPT_static) ||
20150e2679d29be70186fc1197a1484948ed239922baDaniel Dunbar       Args.hasArg(options::OPT_fapple_kext)))
2016c21c485b4fb58ef5d55cf3e523263dd824a2ace4Daniel Dunbar    CmdArgs.push_back("-static");
2017c21c485b4fb58ef5d55cf3e523263dd824a2ace4Daniel Dunbar
20188cac5f7e1ce63dd77ee0fb4ef68f9fa804f41ea6Daniel Dunbar  Args.AddAllArgValues(CmdArgs, options::OPT_Wa_COMMA,
20198cac5f7e1ce63dd77ee0fb4ef68f9fa804f41ea6Daniel Dunbar                       options::OPT_Xassembler);
20208cac5f7e1ce63dd77ee0fb4ef68f9fa804f41ea6Daniel Dunbar
20218cac5f7e1ce63dd77ee0fb4ef68f9fa804f41ea6Daniel Dunbar  assert(Output.isFilename() && "Unexpected lipo output.");
20228cac5f7e1ce63dd77ee0fb4ef68f9fa804f41ea6Daniel Dunbar  CmdArgs.push_back("-o");
20238cac5f7e1ce63dd77ee0fb4ef68f9fa804f41ea6Daniel Dunbar  CmdArgs.push_back(Output.getFilename());
20248cac5f7e1ce63dd77ee0fb4ef68f9fa804f41ea6Daniel Dunbar
20258cac5f7e1ce63dd77ee0fb4ef68f9fa804f41ea6Daniel Dunbar  if (Input.isPipe()) {
20268cac5f7e1ce63dd77ee0fb4ef68f9fa804f41ea6Daniel Dunbar    CmdArgs.push_back("-");
20278cac5f7e1ce63dd77ee0fb4ef68f9fa804f41ea6Daniel Dunbar  } else {
20288cac5f7e1ce63dd77ee0fb4ef68f9fa804f41ea6Daniel Dunbar    assert(Input.isFilename() && "Invalid input.");
20298cac5f7e1ce63dd77ee0fb4ef68f9fa804f41ea6Daniel Dunbar    CmdArgs.push_back(Input.getFilename());
20308cac5f7e1ce63dd77ee0fb4ef68f9fa804f41ea6Daniel Dunbar  }
20318cac5f7e1ce63dd77ee0fb4ef68f9fa804f41ea6Daniel Dunbar
20328cac5f7e1ce63dd77ee0fb4ef68f9fa804f41ea6Daniel Dunbar  // asm_final spec is empty.
20338cac5f7e1ce63dd77ee0fb4ef68f9fa804f41ea6Daniel Dunbar
2034c21c485b4fb58ef5d55cf3e523263dd824a2ace4Daniel Dunbar  const char *Exec =
20355ed34f4c58b6ad4e21038d713c1fae31a6146ff5Daniel Dunbar    Args.MakeArgString(getToolChain().GetProgramPath(C, "as"));
2036daab7b1016f0a82fefa4f7be6e63c57c06b19ffcDaniel Dunbar  Dest.addCommand(new Command(JA, *this, Exec, CmdArgs));
20378cac5f7e1ce63dd77ee0fb4ef68f9fa804f41ea6Daniel Dunbar}
2038ff7488dc9a766f94daf54d81b03ab9160d0bfd88Daniel Dunbar
203902633b541b04ad5ffc1c70f4c2feeeb13e607057Daniel Dunbar/// Helper routine for seeing if we should use dsymutil; this is a
204002633b541b04ad5ffc1c70f4c2feeeb13e607057Daniel Dunbar/// gcc compatible hack, we should remove it and use the input
204102633b541b04ad5ffc1c70f4c2feeeb13e607057Daniel Dunbar/// type information.
204202633b541b04ad5ffc1c70f4c2feeeb13e607057Daniel Dunbarstatic bool isSourceSuffix(const char *Str) {
204302633b541b04ad5ffc1c70f4c2feeeb13e607057Daniel Dunbar  // match: 'C', 'CPP', 'c', 'cc', 'cp', 'c++', 'cpp', 'cxx', 'm',
204402633b541b04ad5ffc1c70f4c2feeeb13e607057Daniel Dunbar  // 'mm'.
204555d3f7ae512875a1d6402943c3a619633feb2a18Douglas Gregor  return llvm::StringSwitch<bool>(Str)
204655d3f7ae512875a1d6402943c3a619633feb2a18Douglas Gregor           .Case("C", true)
204755d3f7ae512875a1d6402943c3a619633feb2a18Douglas Gregor           .Case("c", true)
204855d3f7ae512875a1d6402943c3a619633feb2a18Douglas Gregor           .Case("m", true)
204955d3f7ae512875a1d6402943c3a619633feb2a18Douglas Gregor           .Case("cc", true)
205055d3f7ae512875a1d6402943c3a619633feb2a18Douglas Gregor           .Case("cp", true)
205155d3f7ae512875a1d6402943c3a619633feb2a18Douglas Gregor           .Case("mm", true)
205255d3f7ae512875a1d6402943c3a619633feb2a18Douglas Gregor           .Case("CPP", true)
205355d3f7ae512875a1d6402943c3a619633feb2a18Douglas Gregor           .Case("c++", true)
205455d3f7ae512875a1d6402943c3a619633feb2a18Douglas Gregor           .Case("cpp", true)
205555d3f7ae512875a1d6402943c3a619633feb2a18Douglas Gregor           .Case("cxx", true)
205655d3f7ae512875a1d6402943c3a619633feb2a18Douglas Gregor           .Default(false);
205702633b541b04ad5ffc1c70f4c2feeeb13e607057Daniel Dunbar}
205802633b541b04ad5ffc1c70f4c2feeeb13e607057Daniel Dunbar
2059fbefe6bd6f62a3361813498dc672ab0d6c0d4fd1Daniel Dunbarvoid darwin::DarwinTool::AddDarwinArch(const ArgList &Args,
2060fbefe6bd6f62a3361813498dc672ab0d6c0d4fd1Daniel Dunbar                                       ArgStringList &CmdArgs) const {
2061eeff406730f50afd973f005a8d501a19af4785e5Daniel Dunbar  llvm::StringRef ArchName = getDarwinToolChain().getDarwinArchName(Args);
2062eeff406730f50afd973f005a8d501a19af4785e5Daniel Dunbar
206302633b541b04ad5ffc1c70f4c2feeeb13e607057Daniel Dunbar  // Derived from darwin_arch spec.
206402633b541b04ad5ffc1c70f4c2feeeb13e607057Daniel Dunbar  CmdArgs.push_back("-arch");
2065eeff406730f50afd973f005a8d501a19af4785e5Daniel Dunbar  CmdArgs.push_back(Args.MakeArgString(ArchName));
206678dbd580a02759bbc408dbefb6754afa71b2c24cDaniel Dunbar
2067eeff406730f50afd973f005a8d501a19af4785e5Daniel Dunbar  // FIXME: Is this needed anymore?
2068eeff406730f50afd973f005a8d501a19af4785e5Daniel Dunbar  if (ArchName == "arm")
206978dbd580a02759bbc408dbefb6754afa71b2c24cDaniel Dunbar    CmdArgs.push_back("-force_cpusubtype_ALL");
207002633b541b04ad5ffc1c70f4c2feeeb13e607057Daniel Dunbar}
207102633b541b04ad5ffc1c70f4c2feeeb13e607057Daniel Dunbar
2072c21c485b4fb58ef5d55cf3e523263dd824a2ace4Daniel Dunbarvoid darwin::Link::AddLinkArgs(const ArgList &Args,
207302633b541b04ad5ffc1c70f4c2feeeb13e607057Daniel Dunbar                               ArgStringList &CmdArgs) const {
2074ee788e70fcd0adf76103b17c78ac658d4ea30c9bDaniel Dunbar  const Driver &D = getToolChain().getDriver();
207502633b541b04ad5ffc1c70f4c2feeeb13e607057Daniel Dunbar
207602633b541b04ad5ffc1c70f4c2feeeb13e607057Daniel Dunbar  // Derived from the "link" spec.
207702633b541b04ad5ffc1c70f4c2feeeb13e607057Daniel Dunbar  Args.AddAllArgs(CmdArgs, options::OPT_static);
207802633b541b04ad5ffc1c70f4c2feeeb13e607057Daniel Dunbar  if (!Args.hasArg(options::OPT_static))
207902633b541b04ad5ffc1c70f4c2feeeb13e607057Daniel Dunbar    CmdArgs.push_back("-dynamic");
208002633b541b04ad5ffc1c70f4c2feeeb13e607057Daniel Dunbar  if (Args.hasArg(options::OPT_fgnu_runtime)) {
208102633b541b04ad5ffc1c70f4c2feeeb13e607057Daniel Dunbar    // FIXME: gcc replaces -lobjc in forward args with -lobjc-gnu
208202633b541b04ad5ffc1c70f4c2feeeb13e607057Daniel Dunbar    // here. How do we wish to handle such things?
208302633b541b04ad5ffc1c70f4c2feeeb13e607057Daniel Dunbar  }
2084c21c485b4fb58ef5d55cf3e523263dd824a2ace4Daniel Dunbar
208502633b541b04ad5ffc1c70f4c2feeeb13e607057Daniel Dunbar  if (!Args.hasArg(options::OPT_dynamiclib)) {
2086a6d38494d18e260958e73bfe5e2b3f1dc4160459Daniel Dunbar    AddDarwinArch(Args, CmdArgs);
2087a6d38494d18e260958e73bfe5e2b3f1dc4160459Daniel Dunbar    // FIXME: Why do this only on this path?
20888917dd4457affb8750c81f08cbc21902a36cff26Daniel Dunbar    Args.AddLastArg(CmdArgs, options::OPT_force__cpusubtype__ALL);
208902633b541b04ad5ffc1c70f4c2feeeb13e607057Daniel Dunbar
209002633b541b04ad5ffc1c70f4c2feeeb13e607057Daniel Dunbar    Args.AddLastArg(CmdArgs, options::OPT_bundle);
209102633b541b04ad5ffc1c70f4c2feeeb13e607057Daniel Dunbar    Args.AddAllArgs(CmdArgs, options::OPT_bundle__loader);
209202633b541b04ad5ffc1c70f4c2feeeb13e607057Daniel Dunbar    Args.AddAllArgs(CmdArgs, options::OPT_client__name);
209302633b541b04ad5ffc1c70f4c2feeeb13e607057Daniel Dunbar
209402633b541b04ad5ffc1c70f4c2feeeb13e607057Daniel Dunbar    Arg *A;
209502633b541b04ad5ffc1c70f4c2feeeb13e607057Daniel Dunbar    if ((A = Args.getLastArg(options::OPT_compatibility__version)) ||
209602633b541b04ad5ffc1c70f4c2feeeb13e607057Daniel Dunbar        (A = Args.getLastArg(options::OPT_current__version)) ||
209702633b541b04ad5ffc1c70f4c2feeeb13e607057Daniel Dunbar        (A = Args.getLastArg(options::OPT_install__name)))
209802633b541b04ad5ffc1c70f4c2feeeb13e607057Daniel Dunbar      D.Diag(clang::diag::err_drv_argument_only_allowed_with)
209902633b541b04ad5ffc1c70f4c2feeeb13e607057Daniel Dunbar        << A->getAsString(Args) << "-dynamiclib";
210002633b541b04ad5ffc1c70f4c2feeeb13e607057Daniel Dunbar
210102633b541b04ad5ffc1c70f4c2feeeb13e607057Daniel Dunbar    Args.AddLastArg(CmdArgs, options::OPT_force__flat__namespace);
210202633b541b04ad5ffc1c70f4c2feeeb13e607057Daniel Dunbar    Args.AddLastArg(CmdArgs, options::OPT_keep__private__externs);
210302633b541b04ad5ffc1c70f4c2feeeb13e607057Daniel Dunbar    Args.AddLastArg(CmdArgs, options::OPT_private__bundle);
210402633b541b04ad5ffc1c70f4c2feeeb13e607057Daniel Dunbar  } else {
210502633b541b04ad5ffc1c70f4c2feeeb13e607057Daniel Dunbar    CmdArgs.push_back("-dylib");
210602633b541b04ad5ffc1c70f4c2feeeb13e607057Daniel Dunbar
210702633b541b04ad5ffc1c70f4c2feeeb13e607057Daniel Dunbar    Arg *A;
210802633b541b04ad5ffc1c70f4c2feeeb13e607057Daniel Dunbar    if ((A = Args.getLastArg(options::OPT_bundle)) ||
210902633b541b04ad5ffc1c70f4c2feeeb13e607057Daniel Dunbar        (A = Args.getLastArg(options::OPT_bundle__loader)) ||
211002633b541b04ad5ffc1c70f4c2feeeb13e607057Daniel Dunbar        (A = Args.getLastArg(options::OPT_client__name)) ||
211102633b541b04ad5ffc1c70f4c2feeeb13e607057Daniel Dunbar        (A = Args.getLastArg(options::OPT_force__flat__namespace)) ||
211202633b541b04ad5ffc1c70f4c2feeeb13e607057Daniel Dunbar        (A = Args.getLastArg(options::OPT_keep__private__externs)) ||
211302633b541b04ad5ffc1c70f4c2feeeb13e607057Daniel Dunbar        (A = Args.getLastArg(options::OPT_private__bundle)))
211402633b541b04ad5ffc1c70f4c2feeeb13e607057Daniel Dunbar      D.Diag(clang::diag::err_drv_argument_not_allowed_with)
211502633b541b04ad5ffc1c70f4c2feeeb13e607057Daniel Dunbar        << A->getAsString(Args) << "-dynamiclib";
2116c21c485b4fb58ef5d55cf3e523263dd824a2ace4Daniel Dunbar
211702633b541b04ad5ffc1c70f4c2feeeb13e607057Daniel Dunbar    Args.AddAllArgsTranslated(CmdArgs, options::OPT_compatibility__version,
211802633b541b04ad5ffc1c70f4c2feeeb13e607057Daniel Dunbar                              "-dylib_compatibility_version");
211902633b541b04ad5ffc1c70f4c2feeeb13e607057Daniel Dunbar    Args.AddAllArgsTranslated(CmdArgs, options::OPT_current__version,
212002633b541b04ad5ffc1c70f4c2feeeb13e607057Daniel Dunbar                              "-dylib_current_version");
212102633b541b04ad5ffc1c70f4c2feeeb13e607057Daniel Dunbar
2122a6d38494d18e260958e73bfe5e2b3f1dc4160459Daniel Dunbar    AddDarwinArch(Args, CmdArgs);
212302633b541b04ad5ffc1c70f4c2feeeb13e607057Daniel Dunbar
212402633b541b04ad5ffc1c70f4c2feeeb13e607057Daniel Dunbar    Args.AddAllArgsTranslated(CmdArgs, options::OPT_install__name,
212502633b541b04ad5ffc1c70f4c2feeeb13e607057Daniel Dunbar                              "-dylib_install_name");
212602633b541b04ad5ffc1c70f4c2feeeb13e607057Daniel Dunbar  }
212702633b541b04ad5ffc1c70f4c2feeeb13e607057Daniel Dunbar
212802633b541b04ad5ffc1c70f4c2feeeb13e607057Daniel Dunbar  Args.AddLastArg(CmdArgs, options::OPT_all__load);
212902633b541b04ad5ffc1c70f4c2feeeb13e607057Daniel Dunbar  Args.AddAllArgs(CmdArgs, options::OPT_allowable__client);
213002633b541b04ad5ffc1c70f4c2feeeb13e607057Daniel Dunbar  Args.AddLastArg(CmdArgs, options::OPT_bind__at__load);
2131251ca6c9fb2bb398d9bf9fe7399c27bed7074b5cDaniel Dunbar  if (getDarwinToolChain().isTargetIPhoneOS())
2132d82f8fa53771b454885c546f0fd452a4980b3a3eDaniel Dunbar    Args.AddLastArg(CmdArgs, options::OPT_arch__errors__fatal);
213302633b541b04ad5ffc1c70f4c2feeeb13e607057Daniel Dunbar  Args.AddLastArg(CmdArgs, options::OPT_dead__strip);
213402633b541b04ad5ffc1c70f4c2feeeb13e607057Daniel Dunbar  Args.AddLastArg(CmdArgs, options::OPT_no__dead__strip__inits__and__terms);
213502633b541b04ad5ffc1c70f4c2feeeb13e607057Daniel Dunbar  Args.AddAllArgs(CmdArgs, options::OPT_dylib__file);
213602633b541b04ad5ffc1c70f4c2feeeb13e607057Daniel Dunbar  Args.AddLastArg(CmdArgs, options::OPT_dynamic);
213702633b541b04ad5ffc1c70f4c2feeeb13e607057Daniel Dunbar  Args.AddAllArgs(CmdArgs, options::OPT_exported__symbols__list);
213802633b541b04ad5ffc1c70f4c2feeeb13e607057Daniel Dunbar  Args.AddLastArg(CmdArgs, options::OPT_flat__namespace);
213902633b541b04ad5ffc1c70f4c2feeeb13e607057Daniel Dunbar  Args.AddAllArgs(CmdArgs, options::OPT_headerpad__max__install__names);
214002633b541b04ad5ffc1c70f4c2feeeb13e607057Daniel Dunbar  Args.AddAllArgs(CmdArgs, options::OPT_image__base);
214102633b541b04ad5ffc1c70f4c2feeeb13e607057Daniel Dunbar  Args.AddAllArgs(CmdArgs, options::OPT_init);
214202633b541b04ad5ffc1c70f4c2feeeb13e607057Daniel Dunbar
2143314cba02728c451c783b38bf6c00f220afb193c8Daniel Dunbar  // Adding all arguments doesn't make sense here but this is what gcc does. One
2144314cba02728c451c783b38bf6c00f220afb193c8Daniel Dunbar  // of this should always be present thanks to argument translation.
2145314cba02728c451c783b38bf6c00f220afb193c8Daniel Dunbar  assert((Args.hasArg(options::OPT_mmacosx_version_min_EQ) ||
2146314cba02728c451c783b38bf6c00f220afb193c8Daniel Dunbar          Args.hasArg(options::OPT_miphoneos_version_min_EQ)) &&
2147314cba02728c451c783b38bf6c00f220afb193c8Daniel Dunbar         "Missing version argument (lost in translation)?");
214830392de4681602f1aabc61b0184b1de53bc172f0Daniel Dunbar  Args.AddAllArgsTranslated(CmdArgs, options::OPT_mmacosx_version_min_EQ,
2149294691eb1caf551083acd7b08630ef21c3fd760dDaniel Dunbar                            "-macosx_version_min");
215002633b541b04ad5ffc1c70f4c2feeeb13e607057Daniel Dunbar  Args.AddAllArgsTranslated(CmdArgs, options::OPT_miphoneos_version_min_EQ,
215102633b541b04ad5ffc1c70f4c2feeeb13e607057Daniel Dunbar                            "-iphoneos_version_min");
215202633b541b04ad5ffc1c70f4c2feeeb13e607057Daniel Dunbar  Args.AddLastArg(CmdArgs, options::OPT_nomultidefs);
215302633b541b04ad5ffc1c70f4c2feeeb13e607057Daniel Dunbar  Args.AddLastArg(CmdArgs, options::OPT_multi__module);
215402633b541b04ad5ffc1c70f4c2feeeb13e607057Daniel Dunbar  Args.AddLastArg(CmdArgs, options::OPT_single__module);
215502633b541b04ad5ffc1c70f4c2feeeb13e607057Daniel Dunbar  Args.AddAllArgs(CmdArgs, options::OPT_multiply__defined);
215602633b541b04ad5ffc1c70f4c2feeeb13e607057Daniel Dunbar  Args.AddAllArgs(CmdArgs, options::OPT_multiply__defined__unused);
2157c21c485b4fb58ef5d55cf3e523263dd824a2ace4Daniel Dunbar
215802633b541b04ad5ffc1c70f4c2feeeb13e607057Daniel Dunbar  if (Args.hasArg(options::OPT_fpie))
215902633b541b04ad5ffc1c70f4c2feeeb13e607057Daniel Dunbar    CmdArgs.push_back("-pie");
216002633b541b04ad5ffc1c70f4c2feeeb13e607057Daniel Dunbar
216102633b541b04ad5ffc1c70f4c2feeeb13e607057Daniel Dunbar  Args.AddLastArg(CmdArgs, options::OPT_prebind);
216202633b541b04ad5ffc1c70f4c2feeeb13e607057Daniel Dunbar  Args.AddLastArg(CmdArgs, options::OPT_noprebind);
216302633b541b04ad5ffc1c70f4c2feeeb13e607057Daniel Dunbar  Args.AddLastArg(CmdArgs, options::OPT_nofixprebinding);
216402633b541b04ad5ffc1c70f4c2feeeb13e607057Daniel Dunbar  Args.AddLastArg(CmdArgs, options::OPT_prebind__all__twolevel__modules);
216502633b541b04ad5ffc1c70f4c2feeeb13e607057Daniel Dunbar  Args.AddLastArg(CmdArgs, options::OPT_read__only__relocs);
216602633b541b04ad5ffc1c70f4c2feeeb13e607057Daniel Dunbar  Args.AddAllArgs(CmdArgs, options::OPT_sectcreate);
216702633b541b04ad5ffc1c70f4c2feeeb13e607057Daniel Dunbar  Args.AddAllArgs(CmdArgs, options::OPT_sectorder);
216802633b541b04ad5ffc1c70f4c2feeeb13e607057Daniel Dunbar  Args.AddAllArgs(CmdArgs, options::OPT_seg1addr);
216902633b541b04ad5ffc1c70f4c2feeeb13e607057Daniel Dunbar  Args.AddAllArgs(CmdArgs, options::OPT_segprot);
217002633b541b04ad5ffc1c70f4c2feeeb13e607057Daniel Dunbar  Args.AddAllArgs(CmdArgs, options::OPT_segaddr);
217102633b541b04ad5ffc1c70f4c2feeeb13e607057Daniel Dunbar  Args.AddAllArgs(CmdArgs, options::OPT_segs__read__only__addr);
217202633b541b04ad5ffc1c70f4c2feeeb13e607057Daniel Dunbar  Args.AddAllArgs(CmdArgs, options::OPT_segs__read__write__addr);
217302633b541b04ad5ffc1c70f4c2feeeb13e607057Daniel Dunbar  Args.AddAllArgs(CmdArgs, options::OPT_seg__addr__table);
217402633b541b04ad5ffc1c70f4c2feeeb13e607057Daniel Dunbar  Args.AddAllArgs(CmdArgs, options::OPT_seg__addr__table__filename);
217502633b541b04ad5ffc1c70f4c2feeeb13e607057Daniel Dunbar  Args.AddAllArgs(CmdArgs, options::OPT_sub__library);
217602633b541b04ad5ffc1c70f4c2feeeb13e607057Daniel Dunbar  Args.AddAllArgs(CmdArgs, options::OPT_sub__umbrella);
2177d82f8fa53771b454885c546f0fd452a4980b3a3eDaniel Dunbar
217802633b541b04ad5ffc1c70f4c2feeeb13e607057Daniel Dunbar  Args.AddAllArgsTranslated(CmdArgs, options::OPT_isysroot, "-syslibroot");
2179251ca6c9fb2bb398d9bf9fe7399c27bed7074b5cDaniel Dunbar  if (getDarwinToolChain().isTargetIPhoneOS()) {
2180d82f8fa53771b454885c546f0fd452a4980b3a3eDaniel Dunbar    if (!Args.hasArg(options::OPT_isysroot)) {
2181d82f8fa53771b454885c546f0fd452a4980b3a3eDaniel Dunbar      CmdArgs.push_back("-syslibroot");
2182d82f8fa53771b454885c546f0fd452a4980b3a3eDaniel Dunbar      CmdArgs.push_back("/Developer/SDKs/Extra");
2183d82f8fa53771b454885c546f0fd452a4980b3a3eDaniel Dunbar    }
2184d82f8fa53771b454885c546f0fd452a4980b3a3eDaniel Dunbar  }
2185d82f8fa53771b454885c546f0fd452a4980b3a3eDaniel Dunbar
218602633b541b04ad5ffc1c70f4c2feeeb13e607057Daniel Dunbar  Args.AddLastArg(CmdArgs, options::OPT_twolevel__namespace);
218702633b541b04ad5ffc1c70f4c2feeeb13e607057Daniel Dunbar  Args.AddLastArg(CmdArgs, options::OPT_twolevel__namespace__hints);
218802633b541b04ad5ffc1c70f4c2feeeb13e607057Daniel Dunbar  Args.AddAllArgs(CmdArgs, options::OPT_umbrella);
218902633b541b04ad5ffc1c70f4c2feeeb13e607057Daniel Dunbar  Args.AddAllArgs(CmdArgs, options::OPT_undefined);
219002633b541b04ad5ffc1c70f4c2feeeb13e607057Daniel Dunbar  Args.AddAllArgs(CmdArgs, options::OPT_unexported__symbols__list);
2191d82f8fa53771b454885c546f0fd452a4980b3a3eDaniel Dunbar  Args.AddAllArgs(CmdArgs, options::OPT_weak__reference__mismatches);
219202633b541b04ad5ffc1c70f4c2feeeb13e607057Daniel Dunbar  Args.AddLastArg(CmdArgs, options::OPT_X_Flag);
219302633b541b04ad5ffc1c70f4c2feeeb13e607057Daniel Dunbar  Args.AddAllArgs(CmdArgs, options::OPT_y);
219402633b541b04ad5ffc1c70f4c2feeeb13e607057Daniel Dunbar  Args.AddLastArg(CmdArgs, options::OPT_w);
219502633b541b04ad5ffc1c70f4c2feeeb13e607057Daniel Dunbar  Args.AddAllArgs(CmdArgs, options::OPT_pagezero__size);
219602633b541b04ad5ffc1c70f4c2feeeb13e607057Daniel Dunbar  Args.AddAllArgs(CmdArgs, options::OPT_segs__read__);
219702633b541b04ad5ffc1c70f4c2feeeb13e607057Daniel Dunbar  Args.AddLastArg(CmdArgs, options::OPT_seglinkedit);
219802633b541b04ad5ffc1c70f4c2feeeb13e607057Daniel Dunbar  Args.AddLastArg(CmdArgs, options::OPT_noseglinkedit);
219902633b541b04ad5ffc1c70f4c2feeeb13e607057Daniel Dunbar  Args.AddAllArgs(CmdArgs, options::OPT_sectalign);
220002633b541b04ad5ffc1c70f4c2feeeb13e607057Daniel Dunbar  Args.AddAllArgs(CmdArgs, options::OPT_sectobjectsymbols);
220102633b541b04ad5ffc1c70f4c2feeeb13e607057Daniel Dunbar  Args.AddAllArgs(CmdArgs, options::OPT_segcreate);
220202633b541b04ad5ffc1c70f4c2feeeb13e607057Daniel Dunbar  Args.AddLastArg(CmdArgs, options::OPT_whyload);
220302633b541b04ad5ffc1c70f4c2feeeb13e607057Daniel Dunbar  Args.AddLastArg(CmdArgs, options::OPT_whatsloaded);
220402633b541b04ad5ffc1c70f4c2feeeb13e607057Daniel Dunbar  Args.AddAllArgs(CmdArgs, options::OPT_dylinker__install__name);
220502633b541b04ad5ffc1c70f4c2feeeb13e607057Daniel Dunbar  Args.AddLastArg(CmdArgs, options::OPT_dylinker);
220602633b541b04ad5ffc1c70f4c2feeeb13e607057Daniel Dunbar  Args.AddLastArg(CmdArgs, options::OPT_Mach);
220702633b541b04ad5ffc1c70f4c2feeeb13e607057Daniel Dunbar}
220802633b541b04ad5ffc1c70f4c2feeeb13e607057Daniel Dunbar
220902633b541b04ad5ffc1c70f4c2feeeb13e607057Daniel Dunbarvoid darwin::Link::ConstructJob(Compilation &C, const JobAction &JA,
2210c21c485b4fb58ef5d55cf3e523263dd824a2ace4Daniel Dunbar                                Job &Dest, const InputInfo &Output,
2211c21c485b4fb58ef5d55cf3e523263dd824a2ace4Daniel Dunbar                                const InputInfoList &Inputs,
2212c21c485b4fb58ef5d55cf3e523263dd824a2ace4Daniel Dunbar                                const ArgList &Args,
221302633b541b04ad5ffc1c70f4c2feeeb13e607057Daniel Dunbar                                const char *LinkingOutput) const {
221402633b541b04ad5ffc1c70f4c2feeeb13e607057Daniel Dunbar  assert(Output.getType() == types::TY_Image && "Invalid linker output type.");
2215e0be8b1729d8978de433d229c065830b95d0ae68Daniel Dunbar
221602633b541b04ad5ffc1c70f4c2feeeb13e607057Daniel Dunbar  // The logic here is derived from gcc's behavior; most of which
221702633b541b04ad5ffc1c70f4c2feeeb13e607057Daniel Dunbar  // comes from specs (starting with link_command). Consult gcc for
221802633b541b04ad5ffc1c70f4c2feeeb13e607057Daniel Dunbar  // more information.
221902633b541b04ad5ffc1c70f4c2feeeb13e607057Daniel Dunbar  ArgStringList CmdArgs;
222002633b541b04ad5ffc1c70f4c2feeeb13e607057Daniel Dunbar
222102633b541b04ad5ffc1c70f4c2feeeb13e607057Daniel Dunbar  // I'm not sure why this particular decomposition exists in gcc, but
222202633b541b04ad5ffc1c70f4c2feeeb13e607057Daniel Dunbar  // we follow suite for ease of comparison.
222302633b541b04ad5ffc1c70f4c2feeeb13e607057Daniel Dunbar  AddLinkArgs(Args, CmdArgs);
222402633b541b04ad5ffc1c70f4c2feeeb13e607057Daniel Dunbar
222502633b541b04ad5ffc1c70f4c2feeeb13e607057Daniel Dunbar  Args.AddAllArgs(CmdArgs, options::OPT_d_Flag);
222602633b541b04ad5ffc1c70f4c2feeeb13e607057Daniel Dunbar  Args.AddAllArgs(CmdArgs, options::OPT_s);
222702633b541b04ad5ffc1c70f4c2feeeb13e607057Daniel Dunbar  Args.AddAllArgs(CmdArgs, options::OPT_t);
222802633b541b04ad5ffc1c70f4c2feeeb13e607057Daniel Dunbar  Args.AddAllArgs(CmdArgs, options::OPT_Z_Flag);
222902633b541b04ad5ffc1c70f4c2feeeb13e607057Daniel Dunbar  Args.AddAllArgs(CmdArgs, options::OPT_u_Group);
223002633b541b04ad5ffc1c70f4c2feeeb13e607057Daniel Dunbar  Args.AddAllArgs(CmdArgs, options::OPT_A);
223102633b541b04ad5ffc1c70f4c2feeeb13e607057Daniel Dunbar  Args.AddLastArg(CmdArgs, options::OPT_e);
223202633b541b04ad5ffc1c70f4c2feeeb13e607057Daniel Dunbar  Args.AddAllArgs(CmdArgs, options::OPT_m_Separate);
223302633b541b04ad5ffc1c70f4c2feeeb13e607057Daniel Dunbar  Args.AddAllArgs(CmdArgs, options::OPT_r);
223402633b541b04ad5ffc1c70f4c2feeeb13e607057Daniel Dunbar
223502633b541b04ad5ffc1c70f4c2feeeb13e607057Daniel Dunbar  CmdArgs.push_back("-o");
223602633b541b04ad5ffc1c70f4c2feeeb13e607057Daniel Dunbar  CmdArgs.push_back(Output.getFilename());
223702633b541b04ad5ffc1c70f4c2feeeb13e607057Daniel Dunbar
223802633b541b04ad5ffc1c70f4c2feeeb13e607057Daniel Dunbar  if (!Args.hasArg(options::OPT_A) &&
223902633b541b04ad5ffc1c70f4c2feeeb13e607057Daniel Dunbar      !Args.hasArg(options::OPT_nostdlib) &&
224002633b541b04ad5ffc1c70f4c2feeeb13e607057Daniel Dunbar      !Args.hasArg(options::OPT_nostartfiles)) {
224102633b541b04ad5ffc1c70f4c2feeeb13e607057Daniel Dunbar    // Derived from startfile spec.
224202633b541b04ad5ffc1c70f4c2feeeb13e607057Daniel Dunbar    if (Args.hasArg(options::OPT_dynamiclib)) {
2243c21c485b4fb58ef5d55cf3e523263dd824a2ace4Daniel Dunbar      // Derived from darwin_dylib1 spec.
2244cacb0f007001f7463d44ebd5dde7bfaecf876a71Daniel Dunbar      if (getDarwinToolChain().isTargetIPhoneOS()) {
2245cacb0f007001f7463d44ebd5dde7bfaecf876a71Daniel Dunbar        if (getDarwinToolChain().isIPhoneOSVersionLT(3, 1))
2246cacb0f007001f7463d44ebd5dde7bfaecf876a71Daniel Dunbar          CmdArgs.push_back("-ldylib1.o");
2247cacb0f007001f7463d44ebd5dde7bfaecf876a71Daniel Dunbar      } else {
2248ce3fdf233353b10f20d74dceda3d77a82285de17Daniel Dunbar        if (getDarwinToolChain().isMacosxVersionLT(10, 5))
2249cacb0f007001f7463d44ebd5dde7bfaecf876a71Daniel Dunbar          CmdArgs.push_back("-ldylib1.o");
2250ce3fdf233353b10f20d74dceda3d77a82285de17Daniel Dunbar        else if (getDarwinToolChain().isMacosxVersionLT(10, 6))
2251cacb0f007001f7463d44ebd5dde7bfaecf876a71Daniel Dunbar          CmdArgs.push_back("-ldylib1.10.5.o");
2252cacb0f007001f7463d44ebd5dde7bfaecf876a71Daniel Dunbar      }
225302633b541b04ad5ffc1c70f4c2feeeb13e607057Daniel Dunbar    } else {
225402633b541b04ad5ffc1c70f4c2feeeb13e607057Daniel Dunbar      if (Args.hasArg(options::OPT_bundle)) {
22558a8d8afa3df40e9f122d2b826f1a825a66f6908dDaniel Dunbar        if (!Args.hasArg(options::OPT_static)) {
22568a8d8afa3df40e9f122d2b826f1a825a66f6908dDaniel Dunbar          // Derived from darwin_bundle1 spec.
2257cacb0f007001f7463d44ebd5dde7bfaecf876a71Daniel Dunbar          if (getDarwinToolChain().isTargetIPhoneOS()) {
2258cacb0f007001f7463d44ebd5dde7bfaecf876a71Daniel Dunbar            if (getDarwinToolChain().isIPhoneOSVersionLT(3, 1))
2259cacb0f007001f7463d44ebd5dde7bfaecf876a71Daniel Dunbar              CmdArgs.push_back("-lbundle1.o");
2260cacb0f007001f7463d44ebd5dde7bfaecf876a71Daniel Dunbar          } else {
2261ce3fdf233353b10f20d74dceda3d77a82285de17Daniel Dunbar            if (getDarwinToolChain().isMacosxVersionLT(10, 6))
2262cacb0f007001f7463d44ebd5dde7bfaecf876a71Daniel Dunbar              CmdArgs.push_back("-lbundle1.o");
2263cacb0f007001f7463d44ebd5dde7bfaecf876a71Daniel Dunbar          }
22648a8d8afa3df40e9f122d2b826f1a825a66f6908dDaniel Dunbar        }
226502633b541b04ad5ffc1c70f4c2feeeb13e607057Daniel Dunbar      } else {
226602633b541b04ad5ffc1c70f4c2feeeb13e607057Daniel Dunbar        if (Args.hasArg(options::OPT_pg)) {
226702633b541b04ad5ffc1c70f4c2feeeb13e607057Daniel Dunbar          if (Args.hasArg(options::OPT_static) ||
226802633b541b04ad5ffc1c70f4c2feeeb13e607057Daniel Dunbar              Args.hasArg(options::OPT_object) ||
226902633b541b04ad5ffc1c70f4c2feeeb13e607057Daniel Dunbar              Args.hasArg(options::OPT_preload)) {
227002633b541b04ad5ffc1c70f4c2feeeb13e607057Daniel Dunbar            CmdArgs.push_back("-lgcrt0.o");
227102633b541b04ad5ffc1c70f4c2feeeb13e607057Daniel Dunbar          } else {
227202633b541b04ad5ffc1c70f4c2feeeb13e607057Daniel Dunbar            CmdArgs.push_back("-lgcrt1.o");
2273c21c485b4fb58ef5d55cf3e523263dd824a2ace4Daniel Dunbar
227402633b541b04ad5ffc1c70f4c2feeeb13e607057Daniel Dunbar            // darwin_crt2 spec is empty.
2275c21c485b4fb58ef5d55cf3e523263dd824a2ace4Daniel Dunbar          }
227602633b541b04ad5ffc1c70f4c2feeeb13e607057Daniel Dunbar        } else {
227702633b541b04ad5ffc1c70f4c2feeeb13e607057Daniel Dunbar          if (Args.hasArg(options::OPT_static) ||
227802633b541b04ad5ffc1c70f4c2feeeb13e607057Daniel Dunbar              Args.hasArg(options::OPT_object) ||
227902633b541b04ad5ffc1c70f4c2feeeb13e607057Daniel Dunbar              Args.hasArg(options::OPT_preload)) {
228002633b541b04ad5ffc1c70f4c2feeeb13e607057Daniel Dunbar            CmdArgs.push_back("-lcrt0.o");
228102633b541b04ad5ffc1c70f4c2feeeb13e607057Daniel Dunbar          } else {
228202633b541b04ad5ffc1c70f4c2feeeb13e607057Daniel Dunbar            // Derived from darwin_crt1 spec.
2283251ca6c9fb2bb398d9bf9fe7399c27bed7074b5cDaniel Dunbar            if (getDarwinToolChain().isTargetIPhoneOS()) {
2284cacb0f007001f7463d44ebd5dde7bfaecf876a71Daniel Dunbar              if (getDarwinToolChain().isIPhoneOSVersionLT(3, 1))
2285cacb0f007001f7463d44ebd5dde7bfaecf876a71Daniel Dunbar                CmdArgs.push_back("-lcrt1.o");
2286cacb0f007001f7463d44ebd5dde7bfaecf876a71Daniel Dunbar              else
2287cacb0f007001f7463d44ebd5dde7bfaecf876a71Daniel Dunbar                CmdArgs.push_back("-lcrt1.3.1.o");
2288ce3fdf233353b10f20d74dceda3d77a82285de17Daniel Dunbar            } else {
2289ce3fdf233353b10f20d74dceda3d77a82285de17Daniel Dunbar              if (getDarwinToolChain().isMacosxVersionLT(10, 5))
2290ce3fdf233353b10f20d74dceda3d77a82285de17Daniel Dunbar                CmdArgs.push_back("-lcrt1.o");
2291ce3fdf233353b10f20d74dceda3d77a82285de17Daniel Dunbar              else if (getDarwinToolChain().isMacosxVersionLT(10, 6))
2292ce3fdf233353b10f20d74dceda3d77a82285de17Daniel Dunbar                CmdArgs.push_back("-lcrt1.10.5.o");
2293ce3fdf233353b10f20d74dceda3d77a82285de17Daniel Dunbar              else
2294ce3fdf233353b10f20d74dceda3d77a82285de17Daniel Dunbar                CmdArgs.push_back("-lcrt1.10.6.o");
2295c21c485b4fb58ef5d55cf3e523263dd824a2ace4Daniel Dunbar
2296ce3fdf233353b10f20d74dceda3d77a82285de17Daniel Dunbar              // darwin_crt2 spec is empty.
2297ce3fdf233353b10f20d74dceda3d77a82285de17Daniel Dunbar            }
229802633b541b04ad5ffc1c70f4c2feeeb13e607057Daniel Dunbar          }
229902633b541b04ad5ffc1c70f4c2feeeb13e607057Daniel Dunbar        }
230002633b541b04ad5ffc1c70f4c2feeeb13e607057Daniel Dunbar      }
230102633b541b04ad5ffc1c70f4c2feeeb13e607057Daniel Dunbar    }
230202633b541b04ad5ffc1c70f4c2feeeb13e607057Daniel Dunbar
2303ce3fdf233353b10f20d74dceda3d77a82285de17Daniel Dunbar    if (!getDarwinToolChain().isTargetIPhoneOS() &&
2304ce3fdf233353b10f20d74dceda3d77a82285de17Daniel Dunbar        Args.hasArg(options::OPT_shared_libgcc) &&
2305ce3fdf233353b10f20d74dceda3d77a82285de17Daniel Dunbar        getDarwinToolChain().isMacosxVersionLT(10, 5)) {
2306881376467c46c5c6cc16fa6790271c2c22e1d4f1Daniel Dunbar      const char *Str =
23075ed34f4c58b6ad4e21038d713c1fae31a6146ff5Daniel Dunbar        Args.MakeArgString(getToolChain().GetFilePath(C, "crt3.o"));
2308881376467c46c5c6cc16fa6790271c2c22e1d4f1Daniel Dunbar      CmdArgs.push_back(Str);
230902633b541b04ad5ffc1c70f4c2feeeb13e607057Daniel Dunbar    }
231002633b541b04ad5ffc1c70f4c2feeeb13e607057Daniel Dunbar  }
231102633b541b04ad5ffc1c70f4c2feeeb13e607057Daniel Dunbar
231202633b541b04ad5ffc1c70f4c2feeeb13e607057Daniel Dunbar  Args.AddAllArgs(CmdArgs, options::OPT_L);
2313c21c485b4fb58ef5d55cf3e523263dd824a2ace4Daniel Dunbar
231402633b541b04ad5ffc1c70f4c2feeeb13e607057Daniel Dunbar  if (Args.hasArg(options::OPT_fopenmp))
231502633b541b04ad5ffc1c70f4c2feeeb13e607057Daniel Dunbar    // This is more complicated in gcc...
231602633b541b04ad5ffc1c70f4c2feeeb13e607057Daniel Dunbar    CmdArgs.push_back("-lgomp");
231702633b541b04ad5ffc1c70f4c2feeeb13e607057Daniel Dunbar
23186b200b2b698b6ac9e310f2225c69c85d28ae4fb0Daniel Dunbar  getDarwinToolChain().AddLinkSearchPathArgs(Args, CmdArgs);
2319c21c485b4fb58ef5d55cf3e523263dd824a2ace4Daniel Dunbar
232002633b541b04ad5ffc1c70f4c2feeeb13e607057Daniel Dunbar  for (InputInfoList::const_iterator
232102633b541b04ad5ffc1c70f4c2feeeb13e607057Daniel Dunbar         it = Inputs.begin(), ie = Inputs.end(); it != ie; ++it) {
232202633b541b04ad5ffc1c70f4c2feeeb13e607057Daniel Dunbar    const InputInfo &II = *it;
232302633b541b04ad5ffc1c70f4c2feeeb13e607057Daniel Dunbar    if (II.isFilename())
232402633b541b04ad5ffc1c70f4c2feeeb13e607057Daniel Dunbar      CmdArgs.push_back(II.getFilename());
2325c21c485b4fb58ef5d55cf3e523263dd824a2ace4Daniel Dunbar    else
232602633b541b04ad5ffc1c70f4c2feeeb13e607057Daniel Dunbar      II.getInputArg().renderAsInput(Args, CmdArgs);
232702633b541b04ad5ffc1c70f4c2feeeb13e607057Daniel Dunbar  }
232802633b541b04ad5ffc1c70f4c2feeeb13e607057Daniel Dunbar
232902633b541b04ad5ffc1c70f4c2feeeb13e607057Daniel Dunbar  if (LinkingOutput) {
233002633b541b04ad5ffc1c70f4c2feeeb13e607057Daniel Dunbar    CmdArgs.push_back("-arch_multiple");
233102633b541b04ad5ffc1c70f4c2feeeb13e607057Daniel Dunbar    CmdArgs.push_back("-final_output");
233202633b541b04ad5ffc1c70f4c2feeeb13e607057Daniel Dunbar    CmdArgs.push_back(LinkingOutput);
233302633b541b04ad5ffc1c70f4c2feeeb13e607057Daniel Dunbar  }
233402633b541b04ad5ffc1c70f4c2feeeb13e607057Daniel Dunbar
233502633b541b04ad5ffc1c70f4c2feeeb13e607057Daniel Dunbar  if (Args.hasArg(options::OPT_fprofile_arcs) ||
233602633b541b04ad5ffc1c70f4c2feeeb13e607057Daniel Dunbar      Args.hasArg(options::OPT_fprofile_generate) ||
233702633b541b04ad5ffc1c70f4c2feeeb13e607057Daniel Dunbar      Args.hasArg(options::OPT_fcreate_profile) ||
233802633b541b04ad5ffc1c70f4c2feeeb13e607057Daniel Dunbar      Args.hasArg(options::OPT_coverage))
233902633b541b04ad5ffc1c70f4c2feeeb13e607057Daniel Dunbar    CmdArgs.push_back("-lgcov");
2340c21c485b4fb58ef5d55cf3e523263dd824a2ace4Daniel Dunbar
234102633b541b04ad5ffc1c70f4c2feeeb13e607057Daniel Dunbar  if (Args.hasArg(options::OPT_fnested_functions))
234202633b541b04ad5ffc1c70f4c2feeeb13e607057Daniel Dunbar    CmdArgs.push_back("-allow_stack_execute");
2343c21c485b4fb58ef5d55cf3e523263dd824a2ace4Daniel Dunbar
234402633b541b04ad5ffc1c70f4c2feeeb13e607057Daniel Dunbar  if (!Args.hasArg(options::OPT_nostdlib) &&
234502633b541b04ad5ffc1c70f4c2feeeb13e607057Daniel Dunbar      !Args.hasArg(options::OPT_nodefaultlibs)) {
2346edfa02b85b186e9ea9e0c841539a77ed32ee9148Daniel Dunbar    // FIXME: g++ is more complicated here, it tries to put -lstdc++
2347edfa02b85b186e9ea9e0c841539a77ed32ee9148Daniel Dunbar    // before -lm, for example.
2348ee788e70fcd0adf76103b17c78ac658d4ea30c9bDaniel Dunbar    if (getToolChain().getDriver().CCCIsCXX)
2349edfa02b85b186e9ea9e0c841539a77ed32ee9148Daniel Dunbar      CmdArgs.push_back("-lstdc++");
2350edfa02b85b186e9ea9e0c841539a77ed32ee9148Daniel Dunbar
235102633b541b04ad5ffc1c70f4c2feeeb13e607057Daniel Dunbar    // link_ssp spec is empty.
235202633b541b04ad5ffc1c70f4c2feeeb13e607057Daniel Dunbar
23536cd4154b9088fa18ae05d11c0f3140fafd76c734Daniel Dunbar    // Let the tool chain choose which runtime library to link.
23546cd4154b9088fa18ae05d11c0f3140fafd76c734Daniel Dunbar    getDarwinToolChain().AddLinkRuntimeLibArgs(Args, CmdArgs);
235502633b541b04ad5ffc1c70f4c2feeeb13e607057Daniel Dunbar  }
235602633b541b04ad5ffc1c70f4c2feeeb13e607057Daniel Dunbar
235702633b541b04ad5ffc1c70f4c2feeeb13e607057Daniel Dunbar  if (!Args.hasArg(options::OPT_A) &&
235802633b541b04ad5ffc1c70f4c2feeeb13e607057Daniel Dunbar      !Args.hasArg(options::OPT_nostdlib) &&
235902633b541b04ad5ffc1c70f4c2feeeb13e607057Daniel Dunbar      !Args.hasArg(options::OPT_nostartfiles)) {
236002633b541b04ad5ffc1c70f4c2feeeb13e607057Daniel Dunbar    // endfile_spec is empty.
236102633b541b04ad5ffc1c70f4c2feeeb13e607057Daniel Dunbar  }
236202633b541b04ad5ffc1c70f4c2feeeb13e607057Daniel Dunbar
236302633b541b04ad5ffc1c70f4c2feeeb13e607057Daniel Dunbar  Args.AddAllArgs(CmdArgs, options::OPT_T_Group);
236402633b541b04ad5ffc1c70f4c2feeeb13e607057Daniel Dunbar  Args.AddAllArgs(CmdArgs, options::OPT_F);
236502633b541b04ad5ffc1c70f4c2feeeb13e607057Daniel Dunbar
2366c21c485b4fb58ef5d55cf3e523263dd824a2ace4Daniel Dunbar  const char *Exec =
23675ed34f4c58b6ad4e21038d713c1fae31a6146ff5Daniel Dunbar    Args.MakeArgString(getToolChain().GetProgramPath(C, "ld"));
2368daab7b1016f0a82fefa4f7be6e63c57c06b19ffcDaniel Dunbar  Dest.addCommand(new Command(JA, *this, Exec, CmdArgs));
236902633b541b04ad5ffc1c70f4c2feeeb13e607057Daniel Dunbar
23700b46e1b5389615a8d6641f4d7bf5415d29acfef3Daniel Dunbar  // Find the first non-empty base input (we want to ignore linker
23710b46e1b5389615a8d6641f4d7bf5415d29acfef3Daniel Dunbar  // inputs).
23720b46e1b5389615a8d6641f4d7bf5415d29acfef3Daniel Dunbar  const char *BaseInput = "";
23730b46e1b5389615a8d6641f4d7bf5415d29acfef3Daniel Dunbar  for (unsigned i = 0, e = Inputs.size(); i != e; ++i) {
23740b46e1b5389615a8d6641f4d7bf5415d29acfef3Daniel Dunbar    if (Inputs[i].getBaseInput()[0] != '\0') {
23750b46e1b5389615a8d6641f4d7bf5415d29acfef3Daniel Dunbar      BaseInput = Inputs[i].getBaseInput();
23760b46e1b5389615a8d6641f4d7bf5415d29acfef3Daniel Dunbar      break;
23770b46e1b5389615a8d6641f4d7bf5415d29acfef3Daniel Dunbar    }
23780b46e1b5389615a8d6641f4d7bf5415d29acfef3Daniel Dunbar  }
2379c21c485b4fb58ef5d55cf3e523263dd824a2ace4Daniel Dunbar
23803ed294522653323e4867a2eba03acc98a99e5479Daniel Dunbar  // Run dsymutil if we are making an executable in a single step.
23813ed294522653323e4867a2eba03acc98a99e5479Daniel Dunbar  //
23823ed294522653323e4867a2eba03acc98a99e5479Daniel Dunbar  // FIXME: Currently we don't want to do this when we are part of a
23833ed294522653323e4867a2eba03acc98a99e5479Daniel Dunbar  // universal build step, as this would end up creating stray temp
23843ed294522653323e4867a2eba03acc98a99e5479Daniel Dunbar  // files.
23853ed294522653323e4867a2eba03acc98a99e5479Daniel Dunbar  if (!LinkingOutput &&
23863ed294522653323e4867a2eba03acc98a99e5479Daniel Dunbar      Args.getLastArg(options::OPT_g_Group) &&
238702633b541b04ad5ffc1c70f4c2feeeb13e607057Daniel Dunbar      !Args.getLastArg(options::OPT_gstabs) &&
238802633b541b04ad5ffc1c70f4c2feeeb13e607057Daniel Dunbar      !Args.getLastArg(options::OPT_g0)) {
238902633b541b04ad5ffc1c70f4c2feeeb13e607057Daniel Dunbar    // FIXME: This is gross, but matches gcc. The test only considers
239002633b541b04ad5ffc1c70f4c2feeeb13e607057Daniel Dunbar    // the suffix (not the -x type), and then only of the first
23910b46e1b5389615a8d6641f4d7bf5415d29acfef3Daniel Dunbar    // source input. Awesome.
23920b46e1b5389615a8d6641f4d7bf5415d29acfef3Daniel Dunbar    const char *Suffix = strrchr(BaseInput, '.');
239302633b541b04ad5ffc1c70f4c2feeeb13e607057Daniel Dunbar    if (Suffix && isSourceSuffix(Suffix + 1)) {
2394c21c485b4fb58ef5d55cf3e523263dd824a2ace4Daniel Dunbar      const char *Exec =
23955ed34f4c58b6ad4e21038d713c1fae31a6146ff5Daniel Dunbar        Args.MakeArgString(getToolChain().GetProgramPath(C, "dsymutil"));
239602633b541b04ad5ffc1c70f4c2feeeb13e607057Daniel Dunbar      ArgStringList CmdArgs;
239702633b541b04ad5ffc1c70f4c2feeeb13e607057Daniel Dunbar      CmdArgs.push_back(Output.getFilename());
2398daab7b1016f0a82fefa4f7be6e63c57c06b19ffcDaniel Dunbar      C.getJobs().addCommand(new Command(JA, *this, Exec, CmdArgs));
239902633b541b04ad5ffc1c70f4c2feeeb13e607057Daniel Dunbar    }
240002633b541b04ad5ffc1c70f4c2feeeb13e607057Daniel Dunbar  }
240102633b541b04ad5ffc1c70f4c2feeeb13e607057Daniel Dunbar}
240202633b541b04ad5ffc1c70f4c2feeeb13e607057Daniel Dunbar
2403ff7488dc9a766f94daf54d81b03ab9160d0bfd88Daniel Dunbarvoid darwin::Lipo::ConstructJob(Compilation &C, const JobAction &JA,
2404c21c485b4fb58ef5d55cf3e523263dd824a2ace4Daniel Dunbar                                Job &Dest, const InputInfo &Output,
2405c21c485b4fb58ef5d55cf3e523263dd824a2ace4Daniel Dunbar                                const InputInfoList &Inputs,
2406c21c485b4fb58ef5d55cf3e523263dd824a2ace4Daniel Dunbar                                const ArgList &Args,
2407ff7488dc9a766f94daf54d81b03ab9160d0bfd88Daniel Dunbar                                const char *LinkingOutput) const {
2408ff7488dc9a766f94daf54d81b03ab9160d0bfd88Daniel Dunbar  ArgStringList CmdArgs;
2409ff7488dc9a766f94daf54d81b03ab9160d0bfd88Daniel Dunbar
2410ff7488dc9a766f94daf54d81b03ab9160d0bfd88Daniel Dunbar  CmdArgs.push_back("-create");
2411ff7488dc9a766f94daf54d81b03ab9160d0bfd88Daniel Dunbar  assert(Output.isFilename() && "Unexpected lipo output.");
2412a428df828ea4cc6916ea90dcd9fbbc840776d207Daniel Dunbar
2413a428df828ea4cc6916ea90dcd9fbbc840776d207Daniel Dunbar  CmdArgs.push_back("-output");
2414ff7488dc9a766f94daf54d81b03ab9160d0bfd88Daniel Dunbar  CmdArgs.push_back(Output.getFilename());
2415a428df828ea4cc6916ea90dcd9fbbc840776d207Daniel Dunbar
2416ff7488dc9a766f94daf54d81b03ab9160d0bfd88Daniel Dunbar  for (InputInfoList::const_iterator
2417ff7488dc9a766f94daf54d81b03ab9160d0bfd88Daniel Dunbar         it = Inputs.begin(), ie = Inputs.end(); it != ie; ++it) {
2418ff7488dc9a766f94daf54d81b03ab9160d0bfd88Daniel Dunbar    const InputInfo &II = *it;
2419ff7488dc9a766f94daf54d81b03ab9160d0bfd88Daniel Dunbar    assert(II.isFilename() && "Unexpected lipo input.");
2420ff7488dc9a766f94daf54d81b03ab9160d0bfd88Daniel Dunbar    CmdArgs.push_back(II.getFilename());
2421ff7488dc9a766f94daf54d81b03ab9160d0bfd88Daniel Dunbar  }
2422c21c485b4fb58ef5d55cf3e523263dd824a2ace4Daniel Dunbar  const char *Exec =
24235ed34f4c58b6ad4e21038d713c1fae31a6146ff5Daniel Dunbar    Args.MakeArgString(getToolChain().GetProgramPath(C, "lipo"));
2424daab7b1016f0a82fefa4f7be6e63c57c06b19ffcDaniel Dunbar  Dest.addCommand(new Command(JA, *this, Exec, CmdArgs));
2425ff7488dc9a766f94daf54d81b03ab9160d0bfd88Daniel Dunbar}
242668a31d406c6dc4382c700d1199b062de2aa7e1daDaniel Dunbar
2427e7925a075f110ab21afeae084670a155dea568e3Edward O'Callaghanvoid auroraux::Assemble::ConstructJob(Compilation &C, const JobAction &JA,
2428294691eb1caf551083acd7b08630ef21c3fd760dDaniel Dunbar                                      Job &Dest, const InputInfo &Output,
2429294691eb1caf551083acd7b08630ef21c3fd760dDaniel Dunbar                                      const InputInfoList &Inputs,
2430294691eb1caf551083acd7b08630ef21c3fd760dDaniel Dunbar                                      const ArgList &Args,
2431294691eb1caf551083acd7b08630ef21c3fd760dDaniel Dunbar                                      const char *LinkingOutput) const {
2432e7925a075f110ab21afeae084670a155dea568e3Edward O'Callaghan  ArgStringList CmdArgs;
2433e7925a075f110ab21afeae084670a155dea568e3Edward O'Callaghan
2434e7925a075f110ab21afeae084670a155dea568e3Edward O'Callaghan  Args.AddAllArgValues(CmdArgs, options::OPT_Wa_COMMA,
2435e7925a075f110ab21afeae084670a155dea568e3Edward O'Callaghan                       options::OPT_Xassembler);
2436e7925a075f110ab21afeae084670a155dea568e3Edward O'Callaghan
2437e7925a075f110ab21afeae084670a155dea568e3Edward O'Callaghan  CmdArgs.push_back("-o");
2438e7925a075f110ab21afeae084670a155dea568e3Edward O'Callaghan  if (Output.isPipe())
2439e7925a075f110ab21afeae084670a155dea568e3Edward O'Callaghan    CmdArgs.push_back("-");
2440e7925a075f110ab21afeae084670a155dea568e3Edward O'Callaghan  else
2441e7925a075f110ab21afeae084670a155dea568e3Edward O'Callaghan    CmdArgs.push_back(Output.getFilename());
2442e7925a075f110ab21afeae084670a155dea568e3Edward O'Callaghan
2443e7925a075f110ab21afeae084670a155dea568e3Edward O'Callaghan  for (InputInfoList::const_iterator
2444e7925a075f110ab21afeae084670a155dea568e3Edward O'Callaghan         it = Inputs.begin(), ie = Inputs.end(); it != ie; ++it) {
2445e7925a075f110ab21afeae084670a155dea568e3Edward O'Callaghan    const InputInfo &II = *it;
2446e7925a075f110ab21afeae084670a155dea568e3Edward O'Callaghan    if (II.isPipe())
2447e7925a075f110ab21afeae084670a155dea568e3Edward O'Callaghan      CmdArgs.push_back("-");
2448e7925a075f110ab21afeae084670a155dea568e3Edward O'Callaghan    else
2449e7925a075f110ab21afeae084670a155dea568e3Edward O'Callaghan      CmdArgs.push_back(II.getFilename());
2450e7925a075f110ab21afeae084670a155dea568e3Edward O'Callaghan  }
2451e7925a075f110ab21afeae084670a155dea568e3Edward O'Callaghan
2452e7925a075f110ab21afeae084670a155dea568e3Edward O'Callaghan  const char *Exec =
2453ff430e6d68d1bea07046adafa28a52b314eeaa88Edward O'Callaghan    Args.MakeArgString(getToolChain().GetProgramPath(C, "gas"));
2454daab7b1016f0a82fefa4f7be6e63c57c06b19ffcDaniel Dunbar  Dest.addCommand(new Command(JA, *this, Exec, CmdArgs));
2455e7925a075f110ab21afeae084670a155dea568e3Edward O'Callaghan}
2456e7925a075f110ab21afeae084670a155dea568e3Edward O'Callaghan
2457e7925a075f110ab21afeae084670a155dea568e3Edward O'Callaghanvoid auroraux::Link::ConstructJob(Compilation &C, const JobAction &JA,
2458294691eb1caf551083acd7b08630ef21c3fd760dDaniel Dunbar                                  Job &Dest, const InputInfo &Output,
2459294691eb1caf551083acd7b08630ef21c3fd760dDaniel Dunbar                                  const InputInfoList &Inputs,
2460294691eb1caf551083acd7b08630ef21c3fd760dDaniel Dunbar                                  const ArgList &Args,
2461294691eb1caf551083acd7b08630ef21c3fd760dDaniel Dunbar                                  const char *LinkingOutput) const {
2462ee788e70fcd0adf76103b17c78ac658d4ea30c9bDaniel Dunbar  const Driver &D = getToolChain().getDriver();
2463e7925a075f110ab21afeae084670a155dea568e3Edward O'Callaghan  ArgStringList CmdArgs;
2464e7925a075f110ab21afeae084670a155dea568e3Edward O'Callaghan
2465e7925a075f110ab21afeae084670a155dea568e3Edward O'Callaghan  if ((!Args.hasArg(options::OPT_nostdlib)) &&
2466294691eb1caf551083acd7b08630ef21c3fd760dDaniel Dunbar      (!Args.hasArg(options::OPT_shared))) {
2467e7925a075f110ab21afeae084670a155dea568e3Edward O'Callaghan    CmdArgs.push_back("-e");
24687adf94906e23eae295a006659c55eab9ffcf8b37Edward O'Callaghan    CmdArgs.push_back("_start");
2469e7925a075f110ab21afeae084670a155dea568e3Edward O'Callaghan  }
2470e7925a075f110ab21afeae084670a155dea568e3Edward O'Callaghan
2471e7925a075f110ab21afeae084670a155dea568e3Edward O'Callaghan  if (Args.hasArg(options::OPT_static)) {
2472e7925a075f110ab21afeae084670a155dea568e3Edward O'Callaghan    CmdArgs.push_back("-Bstatic");
24737adf94906e23eae295a006659c55eab9ffcf8b37Edward O'Callaghan    CmdArgs.push_back("-dn");
2474e7925a075f110ab21afeae084670a155dea568e3Edward O'Callaghan  } else {
24757adf94906e23eae295a006659c55eab9ffcf8b37Edward O'Callaghan//    CmdArgs.push_back("--eh-frame-hdr");
2476e7925a075f110ab21afeae084670a155dea568e3Edward O'Callaghan    CmdArgs.push_back("-Bdynamic");
2477e7925a075f110ab21afeae084670a155dea568e3Edward O'Callaghan    if (Args.hasArg(options::OPT_shared)) {
2478e7925a075f110ab21afeae084670a155dea568e3Edward O'Callaghan      CmdArgs.push_back("-shared");
2479e7925a075f110ab21afeae084670a155dea568e3Edward O'Callaghan    } else {
24803cecc19f606ba1000da885b8ff4c089abad224ddEdward O'Callaghan      CmdArgs.push_back("--dynamic-linker");
2481e7925a075f110ab21afeae084670a155dea568e3Edward O'Callaghan      CmdArgs.push_back("/lib/ld.so.1"); // 64Bit Path /lib/amd64/ld.so.1
2482e7925a075f110ab21afeae084670a155dea568e3Edward O'Callaghan    }
2483e7925a075f110ab21afeae084670a155dea568e3Edward O'Callaghan  }
2484e7925a075f110ab21afeae084670a155dea568e3Edward O'Callaghan
2485e7925a075f110ab21afeae084670a155dea568e3Edward O'Callaghan  if (Output.isPipe()) {
2486e7925a075f110ab21afeae084670a155dea568e3Edward O'Callaghan    CmdArgs.push_back("-o");
2487e7925a075f110ab21afeae084670a155dea568e3Edward O'Callaghan    CmdArgs.push_back("-");
2488e7925a075f110ab21afeae084670a155dea568e3Edward O'Callaghan  } else if (Output.isFilename()) {
2489e7925a075f110ab21afeae084670a155dea568e3Edward O'Callaghan    CmdArgs.push_back("-o");
2490e7925a075f110ab21afeae084670a155dea568e3Edward O'Callaghan    CmdArgs.push_back(Output.getFilename());
2491e7925a075f110ab21afeae084670a155dea568e3Edward O'Callaghan  } else {
2492e7925a075f110ab21afeae084670a155dea568e3Edward O'Callaghan    assert(Output.isNothing() && "Invalid output.");
2493e7925a075f110ab21afeae084670a155dea568e3Edward O'Callaghan  }
2494e7925a075f110ab21afeae084670a155dea568e3Edward O'Callaghan
2495e7925a075f110ab21afeae084670a155dea568e3Edward O'Callaghan  if (!Args.hasArg(options::OPT_nostdlib) &&
2496e7925a075f110ab21afeae084670a155dea568e3Edward O'Callaghan      !Args.hasArg(options::OPT_nostartfiles)) {
2497e7925a075f110ab21afeae084670a155dea568e3Edward O'Callaghan    if (!Args.hasArg(options::OPT_shared)) {
24987adf94906e23eae295a006659c55eab9ffcf8b37Edward O'Callaghan      CmdArgs.push_back(Args.MakeArgString(getToolChain().GetFilePath(C, "crt1.o")));
24997adf94906e23eae295a006659c55eab9ffcf8b37Edward O'Callaghan      CmdArgs.push_back(Args.MakeArgString(getToolChain().GetFilePath(C, "crti.o")));
25005ed34f4c58b6ad4e21038d713c1fae31a6146ff5Daniel Dunbar      CmdArgs.push_back(Args.MakeArgString(getToolChain().GetFilePath(C, "crtbegin.o")));
2501e7925a075f110ab21afeae084670a155dea568e3Edward O'Callaghan    } else {
25027adf94906e23eae295a006659c55eab9ffcf8b37Edward O'Callaghan      CmdArgs.push_back(Args.MakeArgString(getToolChain().GetFilePath(C, "crti.o")));
2503e7925a075f110ab21afeae084670a155dea568e3Edward O'Callaghan    }
25047adf94906e23eae295a006659c55eab9ffcf8b37Edward O'Callaghan    CmdArgs.push_back(Args.MakeArgString(getToolChain().GetFilePath(C, "crtn.o")));
2505e7925a075f110ab21afeae084670a155dea568e3Edward O'Callaghan  }
2506e7925a075f110ab21afeae084670a155dea568e3Edward O'Callaghan
2507294691eb1caf551083acd7b08630ef21c3fd760dDaniel Dunbar  CmdArgs.push_back(Args.MakeArgString("-L/opt/gcc4/lib/gcc/"
2508294691eb1caf551083acd7b08630ef21c3fd760dDaniel Dunbar                                       + getToolChain().getTripleString()
2509f7fb31f4751c9c5ac3d9f93c19ec05a74dd9546fDaniel Dunbar                                       + "/4.2.4"));
2510e7925a075f110ab21afeae084670a155dea568e3Edward O'Callaghan
2511e7925a075f110ab21afeae084670a155dea568e3Edward O'Callaghan  Args.AddAllArgs(CmdArgs, options::OPT_L);
2512e7925a075f110ab21afeae084670a155dea568e3Edward O'Callaghan  Args.AddAllArgs(CmdArgs, options::OPT_T_Group);
2513e7925a075f110ab21afeae084670a155dea568e3Edward O'Callaghan  Args.AddAllArgs(CmdArgs, options::OPT_e);
2514e7925a075f110ab21afeae084670a155dea568e3Edward O'Callaghan
2515e7925a075f110ab21afeae084670a155dea568e3Edward O'Callaghan  for (InputInfoList::const_iterator
2516e7925a075f110ab21afeae084670a155dea568e3Edward O'Callaghan         it = Inputs.begin(), ie = Inputs.end(); it != ie; ++it) {
2517e7925a075f110ab21afeae084670a155dea568e3Edward O'Callaghan    const InputInfo &II = *it;
2518e7925a075f110ab21afeae084670a155dea568e3Edward O'Callaghan
2519e7925a075f110ab21afeae084670a155dea568e3Edward O'Callaghan    // Don't try to pass LLVM inputs to a generic gcc.
2520e7925a075f110ab21afeae084670a155dea568e3Edward O'Callaghan    if (II.getType() == types::TY_LLVMBC)
2521e7925a075f110ab21afeae084670a155dea568e3Edward O'Callaghan      D.Diag(clang::diag::err_drv_no_linker_llvm_support)
2522881376467c46c5c6cc16fa6790271c2c22e1d4f1Daniel Dunbar        << getToolChain().getTripleString();
2523e7925a075f110ab21afeae084670a155dea568e3Edward O'Callaghan
2524e7925a075f110ab21afeae084670a155dea568e3Edward O'Callaghan    if (II.isPipe())
2525e7925a075f110ab21afeae084670a155dea568e3Edward O'Callaghan      CmdArgs.push_back("-");
2526e7925a075f110ab21afeae084670a155dea568e3Edward O'Callaghan    else if (II.isFilename())
2527e7925a075f110ab21afeae084670a155dea568e3Edward O'Callaghan      CmdArgs.push_back(II.getFilename());
2528e7925a075f110ab21afeae084670a155dea568e3Edward O'Callaghan    else
2529e7925a075f110ab21afeae084670a155dea568e3Edward O'Callaghan      II.getInputArg().renderAsInput(Args, CmdArgs);
2530e7925a075f110ab21afeae084670a155dea568e3Edward O'Callaghan  }
2531e7925a075f110ab21afeae084670a155dea568e3Edward O'Callaghan
2532e7925a075f110ab21afeae084670a155dea568e3Edward O'Callaghan  if (!Args.hasArg(options::OPT_nostdlib) &&
2533e7925a075f110ab21afeae084670a155dea568e3Edward O'Callaghan      !Args.hasArg(options::OPT_nodefaultlibs)) {
2534e7925a075f110ab21afeae084670a155dea568e3Edward O'Callaghan    // FIXME: For some reason GCC passes -lgcc before adding
2535e7925a075f110ab21afeae084670a155dea568e3Edward O'Callaghan    // the default system libraries. Just mimic this for now.
2536e7925a075f110ab21afeae084670a155dea568e3Edward O'Callaghan    CmdArgs.push_back("-lgcc");
2537e7925a075f110ab21afeae084670a155dea568e3Edward O'Callaghan
2538e7925a075f110ab21afeae084670a155dea568e3Edward O'Callaghan    if (Args.hasArg(options::OPT_pthread))
2539e7925a075f110ab21afeae084670a155dea568e3Edward O'Callaghan      CmdArgs.push_back("-pthread");
2540e7925a075f110ab21afeae084670a155dea568e3Edward O'Callaghan    if (!Args.hasArg(options::OPT_shared))
2541e7925a075f110ab21afeae084670a155dea568e3Edward O'Callaghan      CmdArgs.push_back("-lc");
2542e7925a075f110ab21afeae084670a155dea568e3Edward O'Callaghan    CmdArgs.push_back("-lgcc");
2543e7925a075f110ab21afeae084670a155dea568e3Edward O'Callaghan  }
2544e7925a075f110ab21afeae084670a155dea568e3Edward O'Callaghan
2545e7925a075f110ab21afeae084670a155dea568e3Edward O'Callaghan  if (!Args.hasArg(options::OPT_nostdlib) &&
2546e7925a075f110ab21afeae084670a155dea568e3Edward O'Callaghan      !Args.hasArg(options::OPT_nostartfiles)) {
2547e7925a075f110ab21afeae084670a155dea568e3Edward O'Callaghan    if (!Args.hasArg(options::OPT_shared))
25485ed34f4c58b6ad4e21038d713c1fae31a6146ff5Daniel Dunbar      CmdArgs.push_back(Args.MakeArgString(getToolChain().GetFilePath(C, "crtend.o")));
25497adf94906e23eae295a006659c55eab9ffcf8b37Edward O'Callaghan//    else
25507adf94906e23eae295a006659c55eab9ffcf8b37Edward O'Callaghan//      CmdArgs.push_back(Args.MakeArgString(getToolChain().GetFilePath(C, "crtendS.o")));
2551e7925a075f110ab21afeae084670a155dea568e3Edward O'Callaghan  }
2552e7925a075f110ab21afeae084670a155dea568e3Edward O'Callaghan
2553e7925a075f110ab21afeae084670a155dea568e3Edward O'Callaghan  const char *Exec =
25545ed34f4c58b6ad4e21038d713c1fae31a6146ff5Daniel Dunbar    Args.MakeArgString(getToolChain().GetProgramPath(C, "ld"));
2555daab7b1016f0a82fefa4f7be6e63c57c06b19ffcDaniel Dunbar  Dest.addCommand(new Command(JA, *this, Exec, CmdArgs));
2556e7925a075f110ab21afeae084670a155dea568e3Edward O'Callaghan}
2557e7925a075f110ab21afeae084670a155dea568e3Edward O'Callaghan
2558f7b8eec37c8c8012fa525c71fb29a58c9f29beefDaniel Dunbarvoid openbsd::Assemble::ConstructJob(Compilation &C, const JobAction &JA,
2559f7b8eec37c8c8012fa525c71fb29a58c9f29beefDaniel Dunbar                                     Job &Dest, const InputInfo &Output,
2560f7b8eec37c8c8012fa525c71fb29a58c9f29beefDaniel Dunbar                                     const InputInfoList &Inputs,
2561f7b8eec37c8c8012fa525c71fb29a58c9f29beefDaniel Dunbar                                     const ArgList &Args,
25621eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump                                     const char *LinkingOutput) const {
2563f7b8eec37c8c8012fa525c71fb29a58c9f29beefDaniel Dunbar  ArgStringList CmdArgs;
2564f7b8eec37c8c8012fa525c71fb29a58c9f29beefDaniel Dunbar
2565f7b8eec37c8c8012fa525c71fb29a58c9f29beefDaniel Dunbar  Args.AddAllArgValues(CmdArgs, options::OPT_Wa_COMMA,
2566f7b8eec37c8c8012fa525c71fb29a58c9f29beefDaniel Dunbar                       options::OPT_Xassembler);
2567f7b8eec37c8c8012fa525c71fb29a58c9f29beefDaniel Dunbar
2568f7b8eec37c8c8012fa525c71fb29a58c9f29beefDaniel Dunbar  CmdArgs.push_back("-o");
2569f7b8eec37c8c8012fa525c71fb29a58c9f29beefDaniel Dunbar  if (Output.isPipe())
2570f7b8eec37c8c8012fa525c71fb29a58c9f29beefDaniel Dunbar    CmdArgs.push_back("-");
2571f7b8eec37c8c8012fa525c71fb29a58c9f29beefDaniel Dunbar  else
2572f7b8eec37c8c8012fa525c71fb29a58c9f29beefDaniel Dunbar    CmdArgs.push_back(Output.getFilename());
2573f7b8eec37c8c8012fa525c71fb29a58c9f29beefDaniel Dunbar
2574f7b8eec37c8c8012fa525c71fb29a58c9f29beefDaniel Dunbar  for (InputInfoList::const_iterator
2575f7b8eec37c8c8012fa525c71fb29a58c9f29beefDaniel Dunbar         it = Inputs.begin(), ie = Inputs.end(); it != ie; ++it) {
2576f7b8eec37c8c8012fa525c71fb29a58c9f29beefDaniel Dunbar    const InputInfo &II = *it;
2577f7b8eec37c8c8012fa525c71fb29a58c9f29beefDaniel Dunbar    if (II.isPipe())
2578f7b8eec37c8c8012fa525c71fb29a58c9f29beefDaniel Dunbar      CmdArgs.push_back("-");
2579f7b8eec37c8c8012fa525c71fb29a58c9f29beefDaniel Dunbar    else
2580f7b8eec37c8c8012fa525c71fb29a58c9f29beefDaniel Dunbar      CmdArgs.push_back(II.getFilename());
2581f7b8eec37c8c8012fa525c71fb29a58c9f29beefDaniel Dunbar  }
2582f7b8eec37c8c8012fa525c71fb29a58c9f29beefDaniel Dunbar
2583f7b8eec37c8c8012fa525c71fb29a58c9f29beefDaniel Dunbar  const char *Exec =
25845ed34f4c58b6ad4e21038d713c1fae31a6146ff5Daniel Dunbar    Args.MakeArgString(getToolChain().GetProgramPath(C, "as"));
2585daab7b1016f0a82fefa4f7be6e63c57c06b19ffcDaniel Dunbar  Dest.addCommand(new Command(JA, *this, Exec, CmdArgs));
2586f7b8eec37c8c8012fa525c71fb29a58c9f29beefDaniel Dunbar}
2587f7b8eec37c8c8012fa525c71fb29a58c9f29beefDaniel Dunbar
2588f7b8eec37c8c8012fa525c71fb29a58c9f29beefDaniel Dunbarvoid openbsd::Link::ConstructJob(Compilation &C, const JobAction &JA,
2589f7b8eec37c8c8012fa525c71fb29a58c9f29beefDaniel Dunbar                                 Job &Dest, const InputInfo &Output,
2590f7b8eec37c8c8012fa525c71fb29a58c9f29beefDaniel Dunbar                                 const InputInfoList &Inputs,
2591f7b8eec37c8c8012fa525c71fb29a58c9f29beefDaniel Dunbar                                 const ArgList &Args,
2592f7b8eec37c8c8012fa525c71fb29a58c9f29beefDaniel Dunbar                                 const char *LinkingOutput) const {
2593ee788e70fcd0adf76103b17c78ac658d4ea30c9bDaniel Dunbar  const Driver &D = getToolChain().getDriver();
2594f7b8eec37c8c8012fa525c71fb29a58c9f29beefDaniel Dunbar  ArgStringList CmdArgs;
2595f7b8eec37c8c8012fa525c71fb29a58c9f29beefDaniel Dunbar
25962bbcf669742b6b27748414e22f8042236fceef65Daniel Dunbar  if ((!Args.hasArg(options::OPT_nostdlib)) &&
2597294691eb1caf551083acd7b08630ef21c3fd760dDaniel Dunbar      (!Args.hasArg(options::OPT_shared))) {
25982bbcf669742b6b27748414e22f8042236fceef65Daniel Dunbar    CmdArgs.push_back("-e");
25992bbcf669742b6b27748414e22f8042236fceef65Daniel Dunbar    CmdArgs.push_back("__start");
26002bbcf669742b6b27748414e22f8042236fceef65Daniel Dunbar  }
26012bbcf669742b6b27748414e22f8042236fceef65Daniel Dunbar
2602f7b8eec37c8c8012fa525c71fb29a58c9f29beefDaniel Dunbar  if (Args.hasArg(options::OPT_static)) {
2603f7b8eec37c8c8012fa525c71fb29a58c9f29beefDaniel Dunbar    CmdArgs.push_back("-Bstatic");
2604f7b8eec37c8c8012fa525c71fb29a58c9f29beefDaniel Dunbar  } else {
2605f7b8eec37c8c8012fa525c71fb29a58c9f29beefDaniel Dunbar    CmdArgs.push_back("--eh-frame-hdr");
26062bbcf669742b6b27748414e22f8042236fceef65Daniel Dunbar    CmdArgs.push_back("-Bdynamic");
2607f7b8eec37c8c8012fa525c71fb29a58c9f29beefDaniel Dunbar    if (Args.hasArg(options::OPT_shared)) {
26082bbcf669742b6b27748414e22f8042236fceef65Daniel Dunbar      CmdArgs.push_back("-shared");
2609f7b8eec37c8c8012fa525c71fb29a58c9f29beefDaniel Dunbar    } else {
2610f7b8eec37c8c8012fa525c71fb29a58c9f29beefDaniel Dunbar      CmdArgs.push_back("-dynamic-linker");
2611f7b8eec37c8c8012fa525c71fb29a58c9f29beefDaniel Dunbar      CmdArgs.push_back("/usr/libexec/ld.so");
2612f7b8eec37c8c8012fa525c71fb29a58c9f29beefDaniel Dunbar    }
2613f7b8eec37c8c8012fa525c71fb29a58c9f29beefDaniel Dunbar  }
2614f7b8eec37c8c8012fa525c71fb29a58c9f29beefDaniel Dunbar
2615f7b8eec37c8c8012fa525c71fb29a58c9f29beefDaniel Dunbar  if (Output.isPipe()) {
2616f7b8eec37c8c8012fa525c71fb29a58c9f29beefDaniel Dunbar    CmdArgs.push_back("-o");
2617f7b8eec37c8c8012fa525c71fb29a58c9f29beefDaniel Dunbar    CmdArgs.push_back("-");
2618f7b8eec37c8c8012fa525c71fb29a58c9f29beefDaniel Dunbar  } else if (Output.isFilename()) {
2619f7b8eec37c8c8012fa525c71fb29a58c9f29beefDaniel Dunbar    CmdArgs.push_back("-o");
2620f7b8eec37c8c8012fa525c71fb29a58c9f29beefDaniel Dunbar    CmdArgs.push_back(Output.getFilename());
2621f7b8eec37c8c8012fa525c71fb29a58c9f29beefDaniel Dunbar  } else {
2622f7b8eec37c8c8012fa525c71fb29a58c9f29beefDaniel Dunbar    assert(Output.isNothing() && "Invalid output.");
2623f7b8eec37c8c8012fa525c71fb29a58c9f29beefDaniel Dunbar  }
2624f7b8eec37c8c8012fa525c71fb29a58c9f29beefDaniel Dunbar
2625f7b8eec37c8c8012fa525c71fb29a58c9f29beefDaniel Dunbar  if (!Args.hasArg(options::OPT_nostdlib) &&
2626f7b8eec37c8c8012fa525c71fb29a58c9f29beefDaniel Dunbar      !Args.hasArg(options::OPT_nostartfiles)) {
2627f7b8eec37c8c8012fa525c71fb29a58c9f29beefDaniel Dunbar    if (!Args.hasArg(options::OPT_shared)) {
26285ed34f4c58b6ad4e21038d713c1fae31a6146ff5Daniel Dunbar      CmdArgs.push_back(Args.MakeArgString(getToolChain().GetFilePath(C, "crt0.o")));
26295ed34f4c58b6ad4e21038d713c1fae31a6146ff5Daniel Dunbar      CmdArgs.push_back(Args.MakeArgString(getToolChain().GetFilePath(C, "crtbegin.o")));
2630f7b8eec37c8c8012fa525c71fb29a58c9f29beefDaniel Dunbar    } else {
26315ed34f4c58b6ad4e21038d713c1fae31a6146ff5Daniel Dunbar      CmdArgs.push_back(Args.MakeArgString(getToolChain().GetFilePath(C, "crtbeginS.o")));
2632f7b8eec37c8c8012fa525c71fb29a58c9f29beefDaniel Dunbar    }
2633f7b8eec37c8c8012fa525c71fb29a58c9f29beefDaniel Dunbar  }
2634f7b8eec37c8c8012fa525c71fb29a58c9f29beefDaniel Dunbar
2635e7e18200e614a5e619602a088544c85ac8305a1fEdward O'Callaghan  std::string Triple = getToolChain().getTripleString();
2636e7e18200e614a5e619602a088544c85ac8305a1fEdward O'Callaghan  if (Triple.substr(0, 6) == "x86_64")
2637294691eb1caf551083acd7b08630ef21c3fd760dDaniel Dunbar    Triple.replace(0, 6, "amd64");
2638f7fb31f4751c9c5ac3d9f93c19ec05a74dd9546fDaniel Dunbar  CmdArgs.push_back(Args.MakeArgString("-L/usr/lib/gcc-lib/" + Triple +
2639f7fb31f4751c9c5ac3d9f93c19ec05a74dd9546fDaniel Dunbar                                       "/3.3.5"));
26402bbcf669742b6b27748414e22f8042236fceef65Daniel Dunbar
2641f7b8eec37c8c8012fa525c71fb29a58c9f29beefDaniel Dunbar  Args.AddAllArgs(CmdArgs, options::OPT_L);
2642f7b8eec37c8c8012fa525c71fb29a58c9f29beefDaniel Dunbar  Args.AddAllArgs(CmdArgs, options::OPT_T_Group);
2643f7b8eec37c8c8012fa525c71fb29a58c9f29beefDaniel Dunbar  Args.AddAllArgs(CmdArgs, options::OPT_e);
2644f7b8eec37c8c8012fa525c71fb29a58c9f29beefDaniel Dunbar
2645f7b8eec37c8c8012fa525c71fb29a58c9f29beefDaniel Dunbar  for (InputInfoList::const_iterator
2646f7b8eec37c8c8012fa525c71fb29a58c9f29beefDaniel Dunbar         it = Inputs.begin(), ie = Inputs.end(); it != ie; ++it) {
2647f7b8eec37c8c8012fa525c71fb29a58c9f29beefDaniel Dunbar    const InputInfo &II = *it;
2648f7b8eec37c8c8012fa525c71fb29a58c9f29beefDaniel Dunbar
2649f7b8eec37c8c8012fa525c71fb29a58c9f29beefDaniel Dunbar    // Don't try to pass LLVM inputs to a generic gcc.
2650f7b8eec37c8c8012fa525c71fb29a58c9f29beefDaniel Dunbar    if (II.getType() == types::TY_LLVMBC)
2651f7b8eec37c8c8012fa525c71fb29a58c9f29beefDaniel Dunbar      D.Diag(clang::diag::err_drv_no_linker_llvm_support)
2652881376467c46c5c6cc16fa6790271c2c22e1d4f1Daniel Dunbar        << getToolChain().getTripleString();
2653f7b8eec37c8c8012fa525c71fb29a58c9f29beefDaniel Dunbar
2654f7b8eec37c8c8012fa525c71fb29a58c9f29beefDaniel Dunbar    if (II.isPipe())
2655f7b8eec37c8c8012fa525c71fb29a58c9f29beefDaniel Dunbar      CmdArgs.push_back("-");
2656f7b8eec37c8c8012fa525c71fb29a58c9f29beefDaniel Dunbar    else if (II.isFilename())
2657f7b8eec37c8c8012fa525c71fb29a58c9f29beefDaniel Dunbar      CmdArgs.push_back(II.getFilename());
2658f7b8eec37c8c8012fa525c71fb29a58c9f29beefDaniel Dunbar    else
2659f7b8eec37c8c8012fa525c71fb29a58c9f29beefDaniel Dunbar      II.getInputArg().renderAsInput(Args, CmdArgs);
2660f7b8eec37c8c8012fa525c71fb29a58c9f29beefDaniel Dunbar  }
2661f7b8eec37c8c8012fa525c71fb29a58c9f29beefDaniel Dunbar
2662f7b8eec37c8c8012fa525c71fb29a58c9f29beefDaniel Dunbar  if (!Args.hasArg(options::OPT_nostdlib) &&
2663f7b8eec37c8c8012fa525c71fb29a58c9f29beefDaniel Dunbar      !Args.hasArg(options::OPT_nodefaultlibs)) {
26642bbcf669742b6b27748414e22f8042236fceef65Daniel Dunbar    // FIXME: For some reason GCC passes -lgcc before adding
26652bbcf669742b6b27748414e22f8042236fceef65Daniel Dunbar    // the default system libraries. Just mimic this for now.
26662bbcf669742b6b27748414e22f8042236fceef65Daniel Dunbar    CmdArgs.push_back("-lgcc");
2667f7b8eec37c8c8012fa525c71fb29a58c9f29beefDaniel Dunbar
2668f7b8eec37c8c8012fa525c71fb29a58c9f29beefDaniel Dunbar    if (Args.hasArg(options::OPT_pthread))
2669f7b8eec37c8c8012fa525c71fb29a58c9f29beefDaniel Dunbar      CmdArgs.push_back("-pthread");
26702bbcf669742b6b27748414e22f8042236fceef65Daniel Dunbar    if (!Args.hasArg(options::OPT_shared))
26712bbcf669742b6b27748414e22f8042236fceef65Daniel Dunbar      CmdArgs.push_back("-lc");
26722bbcf669742b6b27748414e22f8042236fceef65Daniel Dunbar    CmdArgs.push_back("-lgcc");
2673f7b8eec37c8c8012fa525c71fb29a58c9f29beefDaniel Dunbar  }
2674f7b8eec37c8c8012fa525c71fb29a58c9f29beefDaniel Dunbar
2675f7b8eec37c8c8012fa525c71fb29a58c9f29beefDaniel Dunbar  if (!Args.hasArg(options::OPT_nostdlib) &&
2676f7b8eec37c8c8012fa525c71fb29a58c9f29beefDaniel Dunbar      !Args.hasArg(options::OPT_nostartfiles)) {
2677f7b8eec37c8c8012fa525c71fb29a58c9f29beefDaniel Dunbar    if (!Args.hasArg(options::OPT_shared))
26785ed34f4c58b6ad4e21038d713c1fae31a6146ff5Daniel Dunbar      CmdArgs.push_back(Args.MakeArgString(getToolChain().GetFilePath(C, "crtend.o")));
2679f7b8eec37c8c8012fa525c71fb29a58c9f29beefDaniel Dunbar    else
26805ed34f4c58b6ad4e21038d713c1fae31a6146ff5Daniel Dunbar      CmdArgs.push_back(Args.MakeArgString(getToolChain().GetFilePath(C, "crtendS.o")));
2681f7b8eec37c8c8012fa525c71fb29a58c9f29beefDaniel Dunbar  }
2682f7b8eec37c8c8012fa525c71fb29a58c9f29beefDaniel Dunbar
2683f7b8eec37c8c8012fa525c71fb29a58c9f29beefDaniel Dunbar  const char *Exec =
26845ed34f4c58b6ad4e21038d713c1fae31a6146ff5Daniel Dunbar    Args.MakeArgString(getToolChain().GetProgramPath(C, "ld"));
2685daab7b1016f0a82fefa4f7be6e63c57c06b19ffcDaniel Dunbar  Dest.addCommand(new Command(JA, *this, Exec, CmdArgs));
2686f7b8eec37c8c8012fa525c71fb29a58c9f29beefDaniel Dunbar}
2687c66a5a30a27e7b9cfab46ac8be918e3ea5b0c5a5Ed Schouten
268868a31d406c6dc4382c700d1199b062de2aa7e1daDaniel Dunbarvoid freebsd::Assemble::ConstructJob(Compilation &C, const JobAction &JA,
2689c21c485b4fb58ef5d55cf3e523263dd824a2ace4Daniel Dunbar                                     Job &Dest, const InputInfo &Output,
2690c21c485b4fb58ef5d55cf3e523263dd824a2ace4Daniel Dunbar                                     const InputInfoList &Inputs,
2691c21c485b4fb58ef5d55cf3e523263dd824a2ace4Daniel Dunbar                                     const ArgList &Args,
26921eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump                                     const char *LinkingOutput) const {
269368a31d406c6dc4382c700d1199b062de2aa7e1daDaniel Dunbar  ArgStringList CmdArgs;
269468a31d406c6dc4382c700d1199b062de2aa7e1daDaniel Dunbar
2695008f54a54299eaafdaa940e2bdeaf55935ecd95aDaniel Dunbar  // When building 32-bit code on FreeBSD/amd64, we have to explicitly
2696008f54a54299eaafdaa940e2bdeaf55935ecd95aDaniel Dunbar  // instruct as in the base system to assemble 32-bit code.
2697008f54a54299eaafdaa940e2bdeaf55935ecd95aDaniel Dunbar  if (getToolChain().getArchName() == "i386")
269868a31d406c6dc4382c700d1199b062de2aa7e1daDaniel Dunbar    CmdArgs.push_back("--32");
269968a31d406c6dc4382c700d1199b062de2aa7e1daDaniel Dunbar
2700ed734737d5af31906e30e537d4a41c760ddcfc59Eric Christopher
2701ed734737d5af31906e30e537d4a41c760ddcfc59Eric Christopher  // Set byte order explicitly
2702ed734737d5af31906e30e537d4a41c760ddcfc59Eric Christopher  if (getToolChain().getArchName() == "mips")
2703ed734737d5af31906e30e537d4a41c760ddcfc59Eric Christopher    CmdArgs.push_back("-EB");
2704ed734737d5af31906e30e537d4a41c760ddcfc59Eric Christopher  else if (getToolChain().getArchName() == "mipsel")
2705ed734737d5af31906e30e537d4a41c760ddcfc59Eric Christopher    CmdArgs.push_back("-EL");
2706ed734737d5af31906e30e537d4a41c760ddcfc59Eric Christopher
270768a31d406c6dc4382c700d1199b062de2aa7e1daDaniel Dunbar  Args.AddAllArgValues(CmdArgs, options::OPT_Wa_COMMA,
270868a31d406c6dc4382c700d1199b062de2aa7e1daDaniel Dunbar                       options::OPT_Xassembler);
270968a31d406c6dc4382c700d1199b062de2aa7e1daDaniel Dunbar
271068a31d406c6dc4382c700d1199b062de2aa7e1daDaniel Dunbar  CmdArgs.push_back("-o");
271168a31d406c6dc4382c700d1199b062de2aa7e1daDaniel Dunbar  if (Output.isPipe())
271268a31d406c6dc4382c700d1199b062de2aa7e1daDaniel Dunbar    CmdArgs.push_back("-");
271368a31d406c6dc4382c700d1199b062de2aa7e1daDaniel Dunbar  else
271468a31d406c6dc4382c700d1199b062de2aa7e1daDaniel Dunbar    CmdArgs.push_back(Output.getFilename());
271568a31d406c6dc4382c700d1199b062de2aa7e1daDaniel Dunbar
271668a31d406c6dc4382c700d1199b062de2aa7e1daDaniel Dunbar  for (InputInfoList::const_iterator
271768a31d406c6dc4382c700d1199b062de2aa7e1daDaniel Dunbar         it = Inputs.begin(), ie = Inputs.end(); it != ie; ++it) {
271868a31d406c6dc4382c700d1199b062de2aa7e1daDaniel Dunbar    const InputInfo &II = *it;
271968a31d406c6dc4382c700d1199b062de2aa7e1daDaniel Dunbar    if (II.isPipe())
272068a31d406c6dc4382c700d1199b062de2aa7e1daDaniel Dunbar      CmdArgs.push_back("-");
272168a31d406c6dc4382c700d1199b062de2aa7e1daDaniel Dunbar    else
272268a31d406c6dc4382c700d1199b062de2aa7e1daDaniel Dunbar      CmdArgs.push_back(II.getFilename());
272368a31d406c6dc4382c700d1199b062de2aa7e1daDaniel Dunbar  }
272468a31d406c6dc4382c700d1199b062de2aa7e1daDaniel Dunbar
2725c21c485b4fb58ef5d55cf3e523263dd824a2ace4Daniel Dunbar  const char *Exec =
27265ed34f4c58b6ad4e21038d713c1fae31a6146ff5Daniel Dunbar    Args.MakeArgString(getToolChain().GetProgramPath(C, "as"));
2727daab7b1016f0a82fefa4f7be6e63c57c06b19ffcDaniel Dunbar  Dest.addCommand(new Command(JA, *this, Exec, CmdArgs));
272868a31d406c6dc4382c700d1199b062de2aa7e1daDaniel Dunbar}
2729008f54a54299eaafdaa940e2bdeaf55935ecd95aDaniel Dunbar
2730008f54a54299eaafdaa940e2bdeaf55935ecd95aDaniel Dunbarvoid freebsd::Link::ConstructJob(Compilation &C, const JobAction &JA,
2731c21c485b4fb58ef5d55cf3e523263dd824a2ace4Daniel Dunbar                                 Job &Dest, const InputInfo &Output,
2732c21c485b4fb58ef5d55cf3e523263dd824a2ace4Daniel Dunbar                                 const InputInfoList &Inputs,
2733c21c485b4fb58ef5d55cf3e523263dd824a2ace4Daniel Dunbar                                 const ArgList &Args,
2734a8304f67291b0182fb64f3afc621615288dd1d31Daniel Dunbar                                 const char *LinkingOutput) const {
2735ee788e70fcd0adf76103b17c78ac658d4ea30c9bDaniel Dunbar  const Driver &D = getToolChain().getDriver();
2736008f54a54299eaafdaa940e2bdeaf55935ecd95aDaniel Dunbar  ArgStringList CmdArgs;
2737008f54a54299eaafdaa940e2bdeaf55935ecd95aDaniel Dunbar
2738008f54a54299eaafdaa940e2bdeaf55935ecd95aDaniel Dunbar  if (Args.hasArg(options::OPT_static)) {
2739008f54a54299eaafdaa940e2bdeaf55935ecd95aDaniel Dunbar    CmdArgs.push_back("-Bstatic");
2740008f54a54299eaafdaa940e2bdeaf55935ecd95aDaniel Dunbar  } else {
2741008f54a54299eaafdaa940e2bdeaf55935ecd95aDaniel Dunbar    CmdArgs.push_back("--eh-frame-hdr");
2742008f54a54299eaafdaa940e2bdeaf55935ecd95aDaniel Dunbar    if (Args.hasArg(options::OPT_shared)) {
2743008f54a54299eaafdaa940e2bdeaf55935ecd95aDaniel Dunbar      CmdArgs.push_back("-Bshareable");
2744008f54a54299eaafdaa940e2bdeaf55935ecd95aDaniel Dunbar    } else {
2745008f54a54299eaafdaa940e2bdeaf55935ecd95aDaniel Dunbar      CmdArgs.push_back("-dynamic-linker");
2746008f54a54299eaafdaa940e2bdeaf55935ecd95aDaniel Dunbar      CmdArgs.push_back("/libexec/ld-elf.so.1");
2747008f54a54299eaafdaa940e2bdeaf55935ecd95aDaniel Dunbar    }
2748008f54a54299eaafdaa940e2bdeaf55935ecd95aDaniel Dunbar  }
2749008f54a54299eaafdaa940e2bdeaf55935ecd95aDaniel Dunbar
2750008f54a54299eaafdaa940e2bdeaf55935ecd95aDaniel Dunbar  // When building 32-bit code on FreeBSD/amd64, we have to explicitly
2751008f54a54299eaafdaa940e2bdeaf55935ecd95aDaniel Dunbar  // instruct ld in the base system to link 32-bit code.
2752008f54a54299eaafdaa940e2bdeaf55935ecd95aDaniel Dunbar  if (getToolChain().getArchName() == "i386") {
2753008f54a54299eaafdaa940e2bdeaf55935ecd95aDaniel Dunbar    CmdArgs.push_back("-m");
2754008f54a54299eaafdaa940e2bdeaf55935ecd95aDaniel Dunbar    CmdArgs.push_back("elf_i386_fbsd");
2755008f54a54299eaafdaa940e2bdeaf55935ecd95aDaniel Dunbar  }
2756008f54a54299eaafdaa940e2bdeaf55935ecd95aDaniel Dunbar
2757008f54a54299eaafdaa940e2bdeaf55935ecd95aDaniel Dunbar  if (Output.isPipe()) {
2758008f54a54299eaafdaa940e2bdeaf55935ecd95aDaniel Dunbar    CmdArgs.push_back("-o");
2759008f54a54299eaafdaa940e2bdeaf55935ecd95aDaniel Dunbar    CmdArgs.push_back("-");
2760008f54a54299eaafdaa940e2bdeaf55935ecd95aDaniel Dunbar  } else if (Output.isFilename()) {
2761008f54a54299eaafdaa940e2bdeaf55935ecd95aDaniel Dunbar    CmdArgs.push_back("-o");
2762008f54a54299eaafdaa940e2bdeaf55935ecd95aDaniel Dunbar    CmdArgs.push_back(Output.getFilename());
2763008f54a54299eaafdaa940e2bdeaf55935ecd95aDaniel Dunbar  } else {
2764008f54a54299eaafdaa940e2bdeaf55935ecd95aDaniel Dunbar    assert(Output.isNothing() && "Invalid output.");
2765008f54a54299eaafdaa940e2bdeaf55935ecd95aDaniel Dunbar  }
2766008f54a54299eaafdaa940e2bdeaf55935ecd95aDaniel Dunbar
2767008f54a54299eaafdaa940e2bdeaf55935ecd95aDaniel Dunbar  if (!Args.hasArg(options::OPT_nostdlib) &&
2768008f54a54299eaafdaa940e2bdeaf55935ecd95aDaniel Dunbar      !Args.hasArg(options::OPT_nostartfiles)) {
2769008f54a54299eaafdaa940e2bdeaf55935ecd95aDaniel Dunbar    if (!Args.hasArg(options::OPT_shared)) {
27705ed34f4c58b6ad4e21038d713c1fae31a6146ff5Daniel Dunbar      CmdArgs.push_back(Args.MakeArgString(getToolChain().GetFilePath(C, "crt1.o")));
27715ed34f4c58b6ad4e21038d713c1fae31a6146ff5Daniel Dunbar      CmdArgs.push_back(Args.MakeArgString(getToolChain().GetFilePath(C, "crti.o")));
27725ed34f4c58b6ad4e21038d713c1fae31a6146ff5Daniel Dunbar      CmdArgs.push_back(Args.MakeArgString(getToolChain().GetFilePath(C, "crtbegin.o")));
2773008f54a54299eaafdaa940e2bdeaf55935ecd95aDaniel Dunbar    } else {
27745ed34f4c58b6ad4e21038d713c1fae31a6146ff5Daniel Dunbar      CmdArgs.push_back(Args.MakeArgString(getToolChain().GetFilePath(C, "crti.o")));
27755ed34f4c58b6ad4e21038d713c1fae31a6146ff5Daniel Dunbar      CmdArgs.push_back(Args.MakeArgString(getToolChain().GetFilePath(C, "crtbeginS.o")));
2776008f54a54299eaafdaa940e2bdeaf55935ecd95aDaniel Dunbar    }
2777008f54a54299eaafdaa940e2bdeaf55935ecd95aDaniel Dunbar  }
2778008f54a54299eaafdaa940e2bdeaf55935ecd95aDaniel Dunbar
2779008f54a54299eaafdaa940e2bdeaf55935ecd95aDaniel Dunbar  Args.AddAllArgs(CmdArgs, options::OPT_L);
2780008f54a54299eaafdaa940e2bdeaf55935ecd95aDaniel Dunbar  Args.AddAllArgs(CmdArgs, options::OPT_T_Group);
2781008f54a54299eaafdaa940e2bdeaf55935ecd95aDaniel Dunbar  Args.AddAllArgs(CmdArgs, options::OPT_e);
2782008f54a54299eaafdaa940e2bdeaf55935ecd95aDaniel Dunbar
2783008f54a54299eaafdaa940e2bdeaf55935ecd95aDaniel Dunbar  for (InputInfoList::const_iterator
2784c21c485b4fb58ef5d55cf3e523263dd824a2ace4Daniel Dunbar         it = Inputs.begin(), ie = Inputs.end(); it != ie; ++it) {
2785008f54a54299eaafdaa940e2bdeaf55935ecd95aDaniel Dunbar    const InputInfo &II = *it;
2786a8304f67291b0182fb64f3afc621615288dd1d31Daniel Dunbar
2787a8304f67291b0182fb64f3afc621615288dd1d31Daniel Dunbar    // Don't try to pass LLVM inputs to a generic gcc.
2788a8304f67291b0182fb64f3afc621615288dd1d31Daniel Dunbar    if (II.getType() == types::TY_LLVMBC)
2789a8304f67291b0182fb64f3afc621615288dd1d31Daniel Dunbar      D.Diag(clang::diag::err_drv_no_linker_llvm_support)
2790881376467c46c5c6cc16fa6790271c2c22e1d4f1Daniel Dunbar        << getToolChain().getTripleString();
2791a8304f67291b0182fb64f3afc621615288dd1d31Daniel Dunbar
2792008f54a54299eaafdaa940e2bdeaf55935ecd95aDaniel Dunbar    if (II.isPipe())
2793008f54a54299eaafdaa940e2bdeaf55935ecd95aDaniel Dunbar      CmdArgs.push_back("-");
2794008f54a54299eaafdaa940e2bdeaf55935ecd95aDaniel Dunbar    else if (II.isFilename())
2795008f54a54299eaafdaa940e2bdeaf55935ecd95aDaniel Dunbar      CmdArgs.push_back(II.getFilename());
2796008f54a54299eaafdaa940e2bdeaf55935ecd95aDaniel Dunbar    else
2797008f54a54299eaafdaa940e2bdeaf55935ecd95aDaniel Dunbar      II.getInputArg().renderAsInput(Args, CmdArgs);
2798008f54a54299eaafdaa940e2bdeaf55935ecd95aDaniel Dunbar  }
2799008f54a54299eaafdaa940e2bdeaf55935ecd95aDaniel Dunbar
2800008f54a54299eaafdaa940e2bdeaf55935ecd95aDaniel Dunbar  if (!Args.hasArg(options::OPT_nostdlib) &&
2801008f54a54299eaafdaa940e2bdeaf55935ecd95aDaniel Dunbar      !Args.hasArg(options::OPT_nodefaultlibs)) {
28022002263e10aa369c89008d37cada2908203fd822Daniel Dunbar    if (D.CCCIsCXX) {
28032002263e10aa369c89008d37cada2908203fd822Daniel Dunbar      CmdArgs.push_back("-lstdc++");
28042002263e10aa369c89008d37cada2908203fd822Daniel Dunbar      CmdArgs.push_back("-lm");
28052002263e10aa369c89008d37cada2908203fd822Daniel Dunbar    }
2806008f54a54299eaafdaa940e2bdeaf55935ecd95aDaniel Dunbar    // FIXME: For some reason GCC passes -lgcc and -lgcc_s before adding
2807008f54a54299eaafdaa940e2bdeaf55935ecd95aDaniel Dunbar    // the default system libraries. Just mimic this for now.
2808008f54a54299eaafdaa940e2bdeaf55935ecd95aDaniel Dunbar    CmdArgs.push_back("-lgcc");
2809008f54a54299eaafdaa940e2bdeaf55935ecd95aDaniel Dunbar    if (Args.hasArg(options::OPT_static)) {
2810008f54a54299eaafdaa940e2bdeaf55935ecd95aDaniel Dunbar      CmdArgs.push_back("-lgcc_eh");
2811008f54a54299eaafdaa940e2bdeaf55935ecd95aDaniel Dunbar    } else {
2812008f54a54299eaafdaa940e2bdeaf55935ecd95aDaniel Dunbar      CmdArgs.push_back("--as-needed");
2813008f54a54299eaafdaa940e2bdeaf55935ecd95aDaniel Dunbar      CmdArgs.push_back("-lgcc_s");
2814008f54a54299eaafdaa940e2bdeaf55935ecd95aDaniel Dunbar      CmdArgs.push_back("--no-as-needed");
2815008f54a54299eaafdaa940e2bdeaf55935ecd95aDaniel Dunbar    }
2816008f54a54299eaafdaa940e2bdeaf55935ecd95aDaniel Dunbar
2817008f54a54299eaafdaa940e2bdeaf55935ecd95aDaniel Dunbar    if (Args.hasArg(options::OPT_pthread))
2818008f54a54299eaafdaa940e2bdeaf55935ecd95aDaniel Dunbar      CmdArgs.push_back("-lpthread");
2819008f54a54299eaafdaa940e2bdeaf55935ecd95aDaniel Dunbar    CmdArgs.push_back("-lc");
2820008f54a54299eaafdaa940e2bdeaf55935ecd95aDaniel Dunbar
2821008f54a54299eaafdaa940e2bdeaf55935ecd95aDaniel Dunbar    CmdArgs.push_back("-lgcc");
2822008f54a54299eaafdaa940e2bdeaf55935ecd95aDaniel Dunbar    if (Args.hasArg(options::OPT_static)) {
2823008f54a54299eaafdaa940e2bdeaf55935ecd95aDaniel Dunbar      CmdArgs.push_back("-lgcc_eh");
2824008f54a54299eaafdaa940e2bdeaf55935ecd95aDaniel Dunbar    } else {
2825008f54a54299eaafdaa940e2bdeaf55935ecd95aDaniel Dunbar      CmdArgs.push_back("--as-needed");
2826008f54a54299eaafdaa940e2bdeaf55935ecd95aDaniel Dunbar      CmdArgs.push_back("-lgcc_s");
2827008f54a54299eaafdaa940e2bdeaf55935ecd95aDaniel Dunbar      CmdArgs.push_back("--no-as-needed");
2828008f54a54299eaafdaa940e2bdeaf55935ecd95aDaniel Dunbar    }
2829008f54a54299eaafdaa940e2bdeaf55935ecd95aDaniel Dunbar  }
2830008f54a54299eaafdaa940e2bdeaf55935ecd95aDaniel Dunbar
2831008f54a54299eaafdaa940e2bdeaf55935ecd95aDaniel Dunbar  if (!Args.hasArg(options::OPT_nostdlib) &&
2832008f54a54299eaafdaa940e2bdeaf55935ecd95aDaniel Dunbar      !Args.hasArg(options::OPT_nostartfiles)) {
2833008f54a54299eaafdaa940e2bdeaf55935ecd95aDaniel Dunbar    if (!Args.hasArg(options::OPT_shared))
28345ed34f4c58b6ad4e21038d713c1fae31a6146ff5Daniel Dunbar      CmdArgs.push_back(Args.MakeArgString(getToolChain().GetFilePath(C, "crtend.o")));
2835008f54a54299eaafdaa940e2bdeaf55935ecd95aDaniel Dunbar    else
28365ed34f4c58b6ad4e21038d713c1fae31a6146ff5Daniel Dunbar      CmdArgs.push_back(Args.MakeArgString(getToolChain().GetFilePath(C, "crtendS.o")));
28375ed34f4c58b6ad4e21038d713c1fae31a6146ff5Daniel Dunbar    CmdArgs.push_back(Args.MakeArgString(getToolChain().GetFilePath(C, "crtn.o")));
2838008f54a54299eaafdaa940e2bdeaf55935ecd95aDaniel Dunbar  }
2839008f54a54299eaafdaa940e2bdeaf55935ecd95aDaniel Dunbar
2840c21c485b4fb58ef5d55cf3e523263dd824a2ace4Daniel Dunbar  const char *Exec =
28415ed34f4c58b6ad4e21038d713c1fae31a6146ff5Daniel Dunbar    Args.MakeArgString(getToolChain().GetProgramPath(C, "ld"));
2842daab7b1016f0a82fefa4f7be6e63c57c06b19ffcDaniel Dunbar  Dest.addCommand(new Command(JA, *this, Exec, CmdArgs));
2843008f54a54299eaafdaa940e2bdeaf55935ecd95aDaniel Dunbar}
284411e1b40d759a643086f590f6ffbd9d68360bad46Daniel Dunbar
284511e1b40d759a643086f590f6ffbd9d68360bad46Daniel Dunbar/// DragonFly Tools
284611e1b40d759a643086f590f6ffbd9d68360bad46Daniel Dunbar
284711e1b40d759a643086f590f6ffbd9d68360bad46Daniel Dunbar// For now, DragonFly Assemble does just about the same as for
284811e1b40d759a643086f590f6ffbd9d68360bad46Daniel Dunbar// FreeBSD, but this may change soon.
284911e1b40d759a643086f590f6ffbd9d68360bad46Daniel Dunbarvoid dragonfly::Assemble::ConstructJob(Compilation &C, const JobAction &JA,
2850294691eb1caf551083acd7b08630ef21c3fd760dDaniel Dunbar                                       Job &Dest, const InputInfo &Output,
2851294691eb1caf551083acd7b08630ef21c3fd760dDaniel Dunbar                                       const InputInfoList &Inputs,
2852294691eb1caf551083acd7b08630ef21c3fd760dDaniel Dunbar                                       const ArgList &Args,
2853294691eb1caf551083acd7b08630ef21c3fd760dDaniel Dunbar                                       const char *LinkingOutput) const {
285411e1b40d759a643086f590f6ffbd9d68360bad46Daniel Dunbar  ArgStringList CmdArgs;
285511e1b40d759a643086f590f6ffbd9d68360bad46Daniel Dunbar
285611e1b40d759a643086f590f6ffbd9d68360bad46Daniel Dunbar  // When building 32-bit code on DragonFly/pc64, we have to explicitly
285711e1b40d759a643086f590f6ffbd9d68360bad46Daniel Dunbar  // instruct as in the base system to assemble 32-bit code.
285811e1b40d759a643086f590f6ffbd9d68360bad46Daniel Dunbar  if (getToolChain().getArchName() == "i386")
285911e1b40d759a643086f590f6ffbd9d68360bad46Daniel Dunbar    CmdArgs.push_back("--32");
286011e1b40d759a643086f590f6ffbd9d68360bad46Daniel Dunbar
286111e1b40d759a643086f590f6ffbd9d68360bad46Daniel Dunbar  Args.AddAllArgValues(CmdArgs, options::OPT_Wa_COMMA,
286211e1b40d759a643086f590f6ffbd9d68360bad46Daniel Dunbar                       options::OPT_Xassembler);
286311e1b40d759a643086f590f6ffbd9d68360bad46Daniel Dunbar
286411e1b40d759a643086f590f6ffbd9d68360bad46Daniel Dunbar  CmdArgs.push_back("-o");
286511e1b40d759a643086f590f6ffbd9d68360bad46Daniel Dunbar  if (Output.isPipe())
286611e1b40d759a643086f590f6ffbd9d68360bad46Daniel Dunbar    CmdArgs.push_back("-");
286711e1b40d759a643086f590f6ffbd9d68360bad46Daniel Dunbar  else
286811e1b40d759a643086f590f6ffbd9d68360bad46Daniel Dunbar    CmdArgs.push_back(Output.getFilename());
286911e1b40d759a643086f590f6ffbd9d68360bad46Daniel Dunbar
287011e1b40d759a643086f590f6ffbd9d68360bad46Daniel Dunbar  for (InputInfoList::const_iterator
287111e1b40d759a643086f590f6ffbd9d68360bad46Daniel Dunbar         it = Inputs.begin(), ie = Inputs.end(); it != ie; ++it) {
287211e1b40d759a643086f590f6ffbd9d68360bad46Daniel Dunbar    const InputInfo &II = *it;
287311e1b40d759a643086f590f6ffbd9d68360bad46Daniel Dunbar    if (II.isPipe())
287411e1b40d759a643086f590f6ffbd9d68360bad46Daniel Dunbar      CmdArgs.push_back("-");
287511e1b40d759a643086f590f6ffbd9d68360bad46Daniel Dunbar    else
287611e1b40d759a643086f590f6ffbd9d68360bad46Daniel Dunbar      CmdArgs.push_back(II.getFilename());
287711e1b40d759a643086f590f6ffbd9d68360bad46Daniel Dunbar  }
287811e1b40d759a643086f590f6ffbd9d68360bad46Daniel Dunbar
287911e1b40d759a643086f590f6ffbd9d68360bad46Daniel Dunbar  const char *Exec =
28805ed34f4c58b6ad4e21038d713c1fae31a6146ff5Daniel Dunbar    Args.MakeArgString(getToolChain().GetProgramPath(C, "as"));
2881daab7b1016f0a82fefa4f7be6e63c57c06b19ffcDaniel Dunbar  Dest.addCommand(new Command(JA, *this, Exec, CmdArgs));
288211e1b40d759a643086f590f6ffbd9d68360bad46Daniel Dunbar}
288311e1b40d759a643086f590f6ffbd9d68360bad46Daniel Dunbar
288411e1b40d759a643086f590f6ffbd9d68360bad46Daniel Dunbarvoid dragonfly::Link::ConstructJob(Compilation &C, const JobAction &JA,
288511e1b40d759a643086f590f6ffbd9d68360bad46Daniel Dunbar                                 Job &Dest, const InputInfo &Output,
288611e1b40d759a643086f590f6ffbd9d68360bad46Daniel Dunbar                                 const InputInfoList &Inputs,
288711e1b40d759a643086f590f6ffbd9d68360bad46Daniel Dunbar                                 const ArgList &Args,
288811e1b40d759a643086f590f6ffbd9d68360bad46Daniel Dunbar                                 const char *LinkingOutput) const {
2889ee788e70fcd0adf76103b17c78ac658d4ea30c9bDaniel Dunbar  const Driver &D = getToolChain().getDriver();
289011e1b40d759a643086f590f6ffbd9d68360bad46Daniel Dunbar  ArgStringList CmdArgs;
289111e1b40d759a643086f590f6ffbd9d68360bad46Daniel Dunbar
289211e1b40d759a643086f590f6ffbd9d68360bad46Daniel Dunbar  if (Args.hasArg(options::OPT_static)) {
289311e1b40d759a643086f590f6ffbd9d68360bad46Daniel Dunbar    CmdArgs.push_back("-Bstatic");
289411e1b40d759a643086f590f6ffbd9d68360bad46Daniel Dunbar  } else {
289511e1b40d759a643086f590f6ffbd9d68360bad46Daniel Dunbar    if (Args.hasArg(options::OPT_shared))
289611e1b40d759a643086f590f6ffbd9d68360bad46Daniel Dunbar      CmdArgs.push_back("-Bshareable");
289711e1b40d759a643086f590f6ffbd9d68360bad46Daniel Dunbar    else {
289811e1b40d759a643086f590f6ffbd9d68360bad46Daniel Dunbar      CmdArgs.push_back("-dynamic-linker");
289911e1b40d759a643086f590f6ffbd9d68360bad46Daniel Dunbar      CmdArgs.push_back("/usr/libexec/ld-elf.so.2");
290011e1b40d759a643086f590f6ffbd9d68360bad46Daniel Dunbar    }
290111e1b40d759a643086f590f6ffbd9d68360bad46Daniel Dunbar  }
290211e1b40d759a643086f590f6ffbd9d68360bad46Daniel Dunbar
290311e1b40d759a643086f590f6ffbd9d68360bad46Daniel Dunbar  // When building 32-bit code on DragonFly/pc64, we have to explicitly
290411e1b40d759a643086f590f6ffbd9d68360bad46Daniel Dunbar  // instruct ld in the base system to link 32-bit code.
290511e1b40d759a643086f590f6ffbd9d68360bad46Daniel Dunbar  if (getToolChain().getArchName() == "i386") {
290611e1b40d759a643086f590f6ffbd9d68360bad46Daniel Dunbar    CmdArgs.push_back("-m");
290711e1b40d759a643086f590f6ffbd9d68360bad46Daniel Dunbar    CmdArgs.push_back("elf_i386");
290811e1b40d759a643086f590f6ffbd9d68360bad46Daniel Dunbar  }
290911e1b40d759a643086f590f6ffbd9d68360bad46Daniel Dunbar
291011e1b40d759a643086f590f6ffbd9d68360bad46Daniel Dunbar  if (Output.isPipe()) {
291111e1b40d759a643086f590f6ffbd9d68360bad46Daniel Dunbar    CmdArgs.push_back("-o");
291211e1b40d759a643086f590f6ffbd9d68360bad46Daniel Dunbar    CmdArgs.push_back("-");
291311e1b40d759a643086f590f6ffbd9d68360bad46Daniel Dunbar  } else if (Output.isFilename()) {
291411e1b40d759a643086f590f6ffbd9d68360bad46Daniel Dunbar    CmdArgs.push_back("-o");
291511e1b40d759a643086f590f6ffbd9d68360bad46Daniel Dunbar    CmdArgs.push_back(Output.getFilename());
291611e1b40d759a643086f590f6ffbd9d68360bad46Daniel Dunbar  } else {
291711e1b40d759a643086f590f6ffbd9d68360bad46Daniel Dunbar    assert(Output.isNothing() && "Invalid output.");
291811e1b40d759a643086f590f6ffbd9d68360bad46Daniel Dunbar  }
291911e1b40d759a643086f590f6ffbd9d68360bad46Daniel Dunbar
292011e1b40d759a643086f590f6ffbd9d68360bad46Daniel Dunbar  if (!Args.hasArg(options::OPT_nostdlib) &&
292111e1b40d759a643086f590f6ffbd9d68360bad46Daniel Dunbar      !Args.hasArg(options::OPT_nostartfiles)) {
292211e1b40d759a643086f590f6ffbd9d68360bad46Daniel Dunbar    if (!Args.hasArg(options::OPT_shared)) {
29235ed34f4c58b6ad4e21038d713c1fae31a6146ff5Daniel Dunbar      CmdArgs.push_back(Args.MakeArgString(getToolChain().GetFilePath(C, "crt1.o")));
29245ed34f4c58b6ad4e21038d713c1fae31a6146ff5Daniel Dunbar      CmdArgs.push_back(Args.MakeArgString(getToolChain().GetFilePath(C, "crti.o")));
29255ed34f4c58b6ad4e21038d713c1fae31a6146ff5Daniel Dunbar      CmdArgs.push_back(Args.MakeArgString(getToolChain().GetFilePath(C, "crtbegin.o")));
292611e1b40d759a643086f590f6ffbd9d68360bad46Daniel Dunbar    } else {
29275ed34f4c58b6ad4e21038d713c1fae31a6146ff5Daniel Dunbar      CmdArgs.push_back(Args.MakeArgString(getToolChain().GetFilePath(C, "crti.o")));
29285ed34f4c58b6ad4e21038d713c1fae31a6146ff5Daniel Dunbar      CmdArgs.push_back(Args.MakeArgString(getToolChain().GetFilePath(C, "crtbeginS.o")));
292911e1b40d759a643086f590f6ffbd9d68360bad46Daniel Dunbar    }
293011e1b40d759a643086f590f6ffbd9d68360bad46Daniel Dunbar  }
293111e1b40d759a643086f590f6ffbd9d68360bad46Daniel Dunbar
293211e1b40d759a643086f590f6ffbd9d68360bad46Daniel Dunbar  Args.AddAllArgs(CmdArgs, options::OPT_L);
293311e1b40d759a643086f590f6ffbd9d68360bad46Daniel Dunbar  Args.AddAllArgs(CmdArgs, options::OPT_T_Group);
293411e1b40d759a643086f590f6ffbd9d68360bad46Daniel Dunbar  Args.AddAllArgs(CmdArgs, options::OPT_e);
293511e1b40d759a643086f590f6ffbd9d68360bad46Daniel Dunbar
293611e1b40d759a643086f590f6ffbd9d68360bad46Daniel Dunbar  for (InputInfoList::const_iterator
293711e1b40d759a643086f590f6ffbd9d68360bad46Daniel Dunbar         it = Inputs.begin(), ie = Inputs.end(); it != ie; ++it) {
293811e1b40d759a643086f590f6ffbd9d68360bad46Daniel Dunbar    const InputInfo &II = *it;
2939a8304f67291b0182fb64f3afc621615288dd1d31Daniel Dunbar
2940a8304f67291b0182fb64f3afc621615288dd1d31Daniel Dunbar    // Don't try to pass LLVM inputs to a generic gcc.
2941a8304f67291b0182fb64f3afc621615288dd1d31Daniel Dunbar    if (II.getType() == types::TY_LLVMBC)
2942a8304f67291b0182fb64f3afc621615288dd1d31Daniel Dunbar      D.Diag(clang::diag::err_drv_no_linker_llvm_support)
2943881376467c46c5c6cc16fa6790271c2c22e1d4f1Daniel Dunbar        << getToolChain().getTripleString();
2944a8304f67291b0182fb64f3afc621615288dd1d31Daniel Dunbar
294511e1b40d759a643086f590f6ffbd9d68360bad46Daniel Dunbar    if (II.isPipe())
294611e1b40d759a643086f590f6ffbd9d68360bad46Daniel Dunbar      CmdArgs.push_back("-");
294711e1b40d759a643086f590f6ffbd9d68360bad46Daniel Dunbar    else if (II.isFilename())
294811e1b40d759a643086f590f6ffbd9d68360bad46Daniel Dunbar      CmdArgs.push_back(II.getFilename());
294911e1b40d759a643086f590f6ffbd9d68360bad46Daniel Dunbar    else
295011e1b40d759a643086f590f6ffbd9d68360bad46Daniel Dunbar      II.getInputArg().renderAsInput(Args, CmdArgs);
295111e1b40d759a643086f590f6ffbd9d68360bad46Daniel Dunbar  }
295211e1b40d759a643086f590f6ffbd9d68360bad46Daniel Dunbar
295311e1b40d759a643086f590f6ffbd9d68360bad46Daniel Dunbar  if (!Args.hasArg(options::OPT_nostdlib) &&
295411e1b40d759a643086f590f6ffbd9d68360bad46Daniel Dunbar      !Args.hasArg(options::OPT_nodefaultlibs)) {
295511e1b40d759a643086f590f6ffbd9d68360bad46Daniel Dunbar    // FIXME: GCC passes on -lgcc, -lgcc_pic and a whole lot of
295611e1b40d759a643086f590f6ffbd9d68360bad46Daniel Dunbar    //         rpaths
295711e1b40d759a643086f590f6ffbd9d68360bad46Daniel Dunbar    CmdArgs.push_back("-L/usr/lib/gcc41");
295811e1b40d759a643086f590f6ffbd9d68360bad46Daniel Dunbar
295911e1b40d759a643086f590f6ffbd9d68360bad46Daniel Dunbar    if (!Args.hasArg(options::OPT_static)) {
296011e1b40d759a643086f590f6ffbd9d68360bad46Daniel Dunbar      CmdArgs.push_back("-rpath");
296111e1b40d759a643086f590f6ffbd9d68360bad46Daniel Dunbar      CmdArgs.push_back("/usr/lib/gcc41");
296211e1b40d759a643086f590f6ffbd9d68360bad46Daniel Dunbar
296311e1b40d759a643086f590f6ffbd9d68360bad46Daniel Dunbar      CmdArgs.push_back("-rpath-link");
296411e1b40d759a643086f590f6ffbd9d68360bad46Daniel Dunbar      CmdArgs.push_back("/usr/lib/gcc41");
296511e1b40d759a643086f590f6ffbd9d68360bad46Daniel Dunbar
296611e1b40d759a643086f590f6ffbd9d68360bad46Daniel Dunbar      CmdArgs.push_back("-rpath");
296711e1b40d759a643086f590f6ffbd9d68360bad46Daniel Dunbar      CmdArgs.push_back("/usr/lib");
296811e1b40d759a643086f590f6ffbd9d68360bad46Daniel Dunbar
296911e1b40d759a643086f590f6ffbd9d68360bad46Daniel Dunbar      CmdArgs.push_back("-rpath-link");
297011e1b40d759a643086f590f6ffbd9d68360bad46Daniel Dunbar      CmdArgs.push_back("/usr/lib");
297111e1b40d759a643086f590f6ffbd9d68360bad46Daniel Dunbar    }
297211e1b40d759a643086f590f6ffbd9d68360bad46Daniel Dunbar
297311e1b40d759a643086f590f6ffbd9d68360bad46Daniel Dunbar    if (Args.hasArg(options::OPT_shared)) {
297411e1b40d759a643086f590f6ffbd9d68360bad46Daniel Dunbar      CmdArgs.push_back("-lgcc_pic");
297511e1b40d759a643086f590f6ffbd9d68360bad46Daniel Dunbar    } else {
297611e1b40d759a643086f590f6ffbd9d68360bad46Daniel Dunbar      CmdArgs.push_back("-lgcc");
297711e1b40d759a643086f590f6ffbd9d68360bad46Daniel Dunbar    }
297811e1b40d759a643086f590f6ffbd9d68360bad46Daniel Dunbar
297911e1b40d759a643086f590f6ffbd9d68360bad46Daniel Dunbar
298011e1b40d759a643086f590f6ffbd9d68360bad46Daniel Dunbar    if (Args.hasArg(options::OPT_pthread))
29814d63f8bc2686d5d7580324407854f2ca7c128832Mike Stump      CmdArgs.push_back("-lpthread");
298211e1b40d759a643086f590f6ffbd9d68360bad46Daniel Dunbar
298311e1b40d759a643086f590f6ffbd9d68360bad46Daniel Dunbar    if (!Args.hasArg(options::OPT_nolibc)) {
298411e1b40d759a643086f590f6ffbd9d68360bad46Daniel Dunbar      CmdArgs.push_back("-lc");
298511e1b40d759a643086f590f6ffbd9d68360bad46Daniel Dunbar    }
298611e1b40d759a643086f590f6ffbd9d68360bad46Daniel Dunbar
298711e1b40d759a643086f590f6ffbd9d68360bad46Daniel Dunbar    if (Args.hasArg(options::OPT_shared)) {
298811e1b40d759a643086f590f6ffbd9d68360bad46Daniel Dunbar      CmdArgs.push_back("-lgcc_pic");
298911e1b40d759a643086f590f6ffbd9d68360bad46Daniel Dunbar    } else {
299011e1b40d759a643086f590f6ffbd9d68360bad46Daniel Dunbar      CmdArgs.push_back("-lgcc");
299111e1b40d759a643086f590f6ffbd9d68360bad46Daniel Dunbar    }
299211e1b40d759a643086f590f6ffbd9d68360bad46Daniel Dunbar  }
299311e1b40d759a643086f590f6ffbd9d68360bad46Daniel Dunbar
299411e1b40d759a643086f590f6ffbd9d68360bad46Daniel Dunbar  if (!Args.hasArg(options::OPT_nostdlib) &&
299511e1b40d759a643086f590f6ffbd9d68360bad46Daniel Dunbar      !Args.hasArg(options::OPT_nostartfiles)) {
299611e1b40d759a643086f590f6ffbd9d68360bad46Daniel Dunbar    if (!Args.hasArg(options::OPT_shared))
29975ed34f4c58b6ad4e21038d713c1fae31a6146ff5Daniel Dunbar      CmdArgs.push_back(Args.MakeArgString(getToolChain().GetFilePath(C, "crtend.o")));
299811e1b40d759a643086f590f6ffbd9d68360bad46Daniel Dunbar    else
29995ed34f4c58b6ad4e21038d713c1fae31a6146ff5Daniel Dunbar      CmdArgs.push_back(Args.MakeArgString(getToolChain().GetFilePath(C, "crtendS.o")));
30005ed34f4c58b6ad4e21038d713c1fae31a6146ff5Daniel Dunbar    CmdArgs.push_back(Args.MakeArgString(getToolChain().GetFilePath(C, "crtn.o")));
300111e1b40d759a643086f590f6ffbd9d68360bad46Daniel Dunbar  }
300211e1b40d759a643086f590f6ffbd9d68360bad46Daniel Dunbar
300311e1b40d759a643086f590f6ffbd9d68360bad46Daniel Dunbar  const char *Exec =
30045ed34f4c58b6ad4e21038d713c1fae31a6146ff5Daniel Dunbar    Args.MakeArgString(getToolChain().GetProgramPath(C, "ld"));
3005daab7b1016f0a82fefa4f7be6e63c57c06b19ffcDaniel Dunbar  Dest.addCommand(new Command(JA, *this, Exec, CmdArgs));
300611e1b40d759a643086f590f6ffbd9d68360bad46Daniel Dunbar}
3007