Tools.cpp revision 6b200b2b698b6ac9e310f2225c69c85d28ae4fb0
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"
151d46033f760ba5fd266ce59fe391fac473f04f52Daniel Dunbar#include "clang/Driver/Driver.h" // FIXME: Remove?
161d46033f760ba5fd266ce59fe391fac473f04f52Daniel Dunbar#include "clang/Driver/DriverDiagnostic.h" // FIXME: Remove?
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"
21b488c1dac8e53206f07103d794a62a3f5012c0f4Daniel Dunbar#include "clang/Driver/ToolChain.h"
22871adcf4e41285e3f4c3b62eaa1b2e05b60b92daDaniel Dunbar#include "clang/Driver/Util.h"
23871adcf4e41285e3f4c3b62eaa1b2e05b60b92daDaniel Dunbar
24881376467c46c5c6cc16fa6790271c2c22e1d4f1Daniel Dunbar#include "llvm/ADT/SmallString.h"
255b750fe6189a41937ff2b080a983c95ea273769fDaniel Dunbar#include "llvm/ADT/Twine.h"
2602633b541b04ad5ffc1c70f4c2feeeb13e607057Daniel Dunbar#include "llvm/Support/Format.h"
2702633b541b04ad5ffc1c70f4c2feeeb13e607057Daniel Dunbar#include "llvm/Support/raw_ostream.h"
28871adcf4e41285e3f4c3b62eaa1b2e05b60b92daDaniel Dunbar
29871adcf4e41285e3f4c3b62eaa1b2e05b60b92daDaniel Dunbar#include "InputInfo.h"
3002633b541b04ad5ffc1c70f4c2feeeb13e607057Daniel Dunbar#include "ToolChains.h"
31871adcf4e41285e3f4c3b62eaa1b2e05b60b92daDaniel Dunbar
3247ac7d27c44bd64a7d0fc03d4babc196cf2b8230Daniel Dunbarusing namespace clang::driver;
3347ac7d27c44bd64a7d0fc03d4babc196cf2b8230Daniel Dunbarusing namespace clang::driver::tools;
3447ac7d27c44bd64a7d0fc03d4babc196cf2b8230Daniel Dunbar
35868bd0aa9281929ef50d2e9a8c82a036906f53f5Daniel Dunbarstatic const char *MakeFormattedString(const ArgList &Args,
36868bd0aa9281929ef50d2e9a8c82a036906f53f5Daniel Dunbar                                       const llvm::format_object_base &Fmt) {
37881376467c46c5c6cc16fa6790271c2c22e1d4f1Daniel Dunbar  llvm::SmallString<256> Str;
38881376467c46c5c6cc16fa6790271c2c22e1d4f1Daniel Dunbar  llvm::raw_svector_ostream(Str) << Fmt;
39881376467c46c5c6cc16fa6790271c2c22e1d4f1Daniel Dunbar  return Args.MakeArgString(Str.str());
40868bd0aa9281929ef50d2e9a8c82a036906f53f5Daniel Dunbar}
41868bd0aa9281929ef50d2e9a8c82a036906f53f5Daniel Dunbar
4288a3d6cf5ebab81614f89ba48a8d89023270637aDaniel Dunbar/// CheckPreprocessingOptions - Perform some validation of preprocessing
4388a3d6cf5ebab81614f89ba48a8d89023270637aDaniel Dunbar/// arguments that is shared with gcc.
4488a3d6cf5ebab81614f89ba48a8d89023270637aDaniel Dunbarstatic void CheckPreprocessingOptions(const Driver &D, const ArgList &Args) {
4588a3d6cf5ebab81614f89ba48a8d89023270637aDaniel Dunbar  if (Arg *A = Args.getLastArg(options::OPT_C, options::OPT_CC))
4688a3d6cf5ebab81614f89ba48a8d89023270637aDaniel Dunbar    if (!Args.hasArg(options::OPT_E))
4788a3d6cf5ebab81614f89ba48a8d89023270637aDaniel Dunbar      D.Diag(clang::diag::err_drv_argument_only_allowed_with)
4888a3d6cf5ebab81614f89ba48a8d89023270637aDaniel Dunbar        << A->getAsString(Args) << "-E";
4988a3d6cf5ebab81614f89ba48a8d89023270637aDaniel Dunbar}
5088a3d6cf5ebab81614f89ba48a8d89023270637aDaniel Dunbar
51e2fd66418eca3d70cf6b62087d745d0c5181db69Daniel Dunbar/// CheckCodeGenerationOptions - Perform some validation of code generation
52e2fd66418eca3d70cf6b62087d745d0c5181db69Daniel Dunbar/// arguments that is shared with gcc.
53e2fd66418eca3d70cf6b62087d745d0c5181db69Daniel Dunbarstatic void CheckCodeGenerationOptions(const Driver &D, const ArgList &Args) {
54e2fd66418eca3d70cf6b62087d745d0c5181db69Daniel Dunbar  // In gcc, only ARM checks this, but it seems reasonable to check universally.
55e2fd66418eca3d70cf6b62087d745d0c5181db69Daniel Dunbar  if (Args.hasArg(options::OPT_static))
56e2fd66418eca3d70cf6b62087d745d0c5181db69Daniel Dunbar    if (const Arg *A = Args.getLastArg(options::OPT_dynamic,
57e2fd66418eca3d70cf6b62087d745d0c5181db69Daniel Dunbar                                       options::OPT_mdynamic_no_pic))
58e2fd66418eca3d70cf6b62087d745d0c5181db69Daniel Dunbar      D.Diag(clang::diag::err_drv_argument_not_allowed_with)
59e2fd66418eca3d70cf6b62087d745d0c5181db69Daniel Dunbar        << A->getAsString(Args) << "-static";
60e2fd66418eca3d70cf6b62087d745d0c5181db69Daniel Dunbar}
61e2fd66418eca3d70cf6b62087d745d0c5181db69Daniel Dunbar
621eb4433ac451dc16f4133a88af2d002ac26c58efMike Stumpvoid Clang::AddPreprocessingOptions(const Driver &D,
63df91ef3d6c55692a0236f67b6c6b134a3bf84098Douglas Gregor                                    const ArgList &Args,
64c21c485b4fb58ef5d55cf3e523263dd824a2ace4Daniel Dunbar                                    ArgStringList &CmdArgs,
65c21c485b4fb58ef5d55cf3e523263dd824a2ace4Daniel Dunbar                                    const InputInfo &Output,
66c21c485b4fb58ef5d55cf3e523263dd824a2ace4Daniel Dunbar                                    const InputInfoList &Inputs) const {
67c21c485b4fb58ef5d55cf3e523263dd824a2ace4Daniel Dunbar  Arg *A;
683a183d3d46426d8719031553131b8928f50aa606Daniel Dunbar
6988a3d6cf5ebab81614f89ba48a8d89023270637aDaniel Dunbar  CheckPreprocessingOptions(D, Args);
7088a3d6cf5ebab81614f89ba48a8d89023270637aDaniel Dunbar
7188a3d6cf5ebab81614f89ba48a8d89023270637aDaniel Dunbar  Args.AddLastArg(CmdArgs, options::OPT_C);
7288a3d6cf5ebab81614f89ba48a8d89023270637aDaniel Dunbar  Args.AddLastArg(CmdArgs, options::OPT_CC);
733a183d3d46426d8719031553131b8928f50aa606Daniel Dunbar
743a183d3d46426d8719031553131b8928f50aa606Daniel Dunbar  // Handle dependency file generation.
75c21c485b4fb58ef5d55cf3e523263dd824a2ace4Daniel Dunbar  if ((A = Args.getLastArg(options::OPT_M)) ||
76c21c485b4fb58ef5d55cf3e523263dd824a2ace4Daniel Dunbar      (A = Args.getLastArg(options::OPT_MM)) ||
77c21c485b4fb58ef5d55cf3e523263dd824a2ace4Daniel Dunbar      (A = Args.getLastArg(options::OPT_MD)) ||
78c21c485b4fb58ef5d55cf3e523263dd824a2ace4Daniel Dunbar      (A = Args.getLastArg(options::OPT_MMD))) {
79c21c485b4fb58ef5d55cf3e523263dd824a2ace4Daniel Dunbar    // Determine the output location.
80c21c485b4fb58ef5d55cf3e523263dd824a2ace4Daniel Dunbar    const char *DepFile;
81c21c485b4fb58ef5d55cf3e523263dd824a2ace4Daniel Dunbar    if (Output.getType() == types::TY_Dependencies) {
82c21c485b4fb58ef5d55cf3e523263dd824a2ace4Daniel Dunbar      if (Output.isPipe())
83c21c485b4fb58ef5d55cf3e523263dd824a2ace4Daniel Dunbar        DepFile = "-";
84c21c485b4fb58ef5d55cf3e523263dd824a2ace4Daniel Dunbar      else
85c21c485b4fb58ef5d55cf3e523263dd824a2ace4Daniel Dunbar        DepFile = Output.getFilename();
86c21c485b4fb58ef5d55cf3e523263dd824a2ace4Daniel Dunbar    } else if (Arg *MF = Args.getLastArg(options::OPT_MF)) {
87c21c485b4fb58ef5d55cf3e523263dd824a2ace4Daniel Dunbar      DepFile = MF->getValue(Args);
88c21c485b4fb58ef5d55cf3e523263dd824a2ace4Daniel Dunbar    } else if (A->getOption().getId() == options::OPT_M ||
89c21c485b4fb58ef5d55cf3e523263dd824a2ace4Daniel Dunbar               A->getOption().getId() == options::OPT_MM) {
90c21c485b4fb58ef5d55cf3e523263dd824a2ace4Daniel Dunbar      DepFile = "-";
91c21c485b4fb58ef5d55cf3e523263dd824a2ace4Daniel Dunbar    } else {
92c21c485b4fb58ef5d55cf3e523263dd824a2ace4Daniel Dunbar      DepFile = darwin::CC1::getDependencyFileName(Args, Inputs);
93c21c485b4fb58ef5d55cf3e523263dd824a2ace4Daniel Dunbar    }
94c21c485b4fb58ef5d55cf3e523263dd824a2ace4Daniel Dunbar    CmdArgs.push_back("-dependency-file");
95c21c485b4fb58ef5d55cf3e523263dd824a2ace4Daniel Dunbar    CmdArgs.push_back(DepFile);
96c21c485b4fb58ef5d55cf3e523263dd824a2ace4Daniel Dunbar
97c21c485b4fb58ef5d55cf3e523263dd824a2ace4Daniel Dunbar    // Add an -MT option if the user didn't specify their own.
98e0be8b1729d8978de433d229c065830b95d0ae68Daniel Dunbar    //
99c21c485b4fb58ef5d55cf3e523263dd824a2ace4Daniel Dunbar    // FIXME: This should use -MQ, when we support it.
100c21c485b4fb58ef5d55cf3e523263dd824a2ace4Daniel Dunbar    if (!Args.hasArg(options::OPT_MT) && !Args.hasArg(options::OPT_MQ)) {
101c21c485b4fb58ef5d55cf3e523263dd824a2ace4Daniel Dunbar      const char *DepTarget;
102c21c485b4fb58ef5d55cf3e523263dd824a2ace4Daniel Dunbar
103c21c485b4fb58ef5d55cf3e523263dd824a2ace4Daniel Dunbar      // If user provided -o, that is the dependency target, except
104c21c485b4fb58ef5d55cf3e523263dd824a2ace4Daniel Dunbar      // when we are only generating a dependency file.
105c21c485b4fb58ef5d55cf3e523263dd824a2ace4Daniel Dunbar      Arg *OutputOpt = Args.getLastArg(options::OPT_o);
106c21c485b4fb58ef5d55cf3e523263dd824a2ace4Daniel Dunbar      if (OutputOpt && Output.getType() != types::TY_Dependencies) {
107c21c485b4fb58ef5d55cf3e523263dd824a2ace4Daniel Dunbar        DepTarget = OutputOpt->getValue(Args);
108c21c485b4fb58ef5d55cf3e523263dd824a2ace4Daniel Dunbar      } else {
109c21c485b4fb58ef5d55cf3e523263dd824a2ace4Daniel Dunbar        // Otherwise derive from the base input.
110c21c485b4fb58ef5d55cf3e523263dd824a2ace4Daniel Dunbar        //
111c21c485b4fb58ef5d55cf3e523263dd824a2ace4Daniel Dunbar        // FIXME: This should use the computed output file location.
112c21c485b4fb58ef5d55cf3e523263dd824a2ace4Daniel Dunbar        llvm::sys::Path P(Inputs[0].getBaseInput());
113c21c485b4fb58ef5d55cf3e523263dd824a2ace4Daniel Dunbar
114c21c485b4fb58ef5d55cf3e523263dd824a2ace4Daniel Dunbar        P.eraseSuffix();
115c21c485b4fb58ef5d55cf3e523263dd824a2ace4Daniel Dunbar        P.appendSuffix("o");
116881376467c46c5c6cc16fa6790271c2c22e1d4f1Daniel Dunbar        DepTarget = Args.MakeArgString(P.getLast());
117c21c485b4fb58ef5d55cf3e523263dd824a2ace4Daniel Dunbar      }
118c21c485b4fb58ef5d55cf3e523263dd824a2ace4Daniel Dunbar
119c21c485b4fb58ef5d55cf3e523263dd824a2ace4Daniel Dunbar      CmdArgs.push_back("-MT");
120c21c485b4fb58ef5d55cf3e523263dd824a2ace4Daniel Dunbar      CmdArgs.push_back(DepTarget);
121c21c485b4fb58ef5d55cf3e523263dd824a2ace4Daniel Dunbar    }
122c21c485b4fb58ef5d55cf3e523263dd824a2ace4Daniel Dunbar
123c21c485b4fb58ef5d55cf3e523263dd824a2ace4Daniel Dunbar    if (A->getOption().getId() == options::OPT_M ||
124c21c485b4fb58ef5d55cf3e523263dd824a2ace4Daniel Dunbar        A->getOption().getId() == options::OPT_MD)
125c21c485b4fb58ef5d55cf3e523263dd824a2ace4Daniel Dunbar      CmdArgs.push_back("-sys-header-deps");
126c21c485b4fb58ef5d55cf3e523263dd824a2ace4Daniel Dunbar  }
127c21c485b4fb58ef5d55cf3e523263dd824a2ace4Daniel Dunbar
128c21c485b4fb58ef5d55cf3e523263dd824a2ace4Daniel Dunbar  Args.AddLastArg(CmdArgs, options::OPT_MP);
129c21c485b4fb58ef5d55cf3e523263dd824a2ace4Daniel Dunbar  Args.AddAllArgs(CmdArgs, options::OPT_MT);
130c21c485b4fb58ef5d55cf3e523263dd824a2ace4Daniel Dunbar
131df91ef3d6c55692a0236f67b6c6b134a3bf84098Douglas Gregor  // Add -i* options, and automatically translate to
132df91ef3d6c55692a0236f67b6c6b134a3bf84098Douglas Gregor  // -include-pch/-include-pth for transparent PCH support. It's
133df91ef3d6c55692a0236f67b6c6b134a3bf84098Douglas Gregor  // wonky, but we include looking for .gch so we can support seamless
134df91ef3d6c55692a0236f67b6c6b134a3bf84098Douglas Gregor  // replacement into a build system already set up to be generating
135df91ef3d6c55692a0236f67b6c6b134a3bf84098Douglas Gregor  // .gch files.
136e0be8b1729d8978de433d229c065830b95d0ae68Daniel Dunbar  //
137e0be8b1729d8978de433d229c065830b95d0ae68Daniel Dunbar  // FIXME: Use iterator.
138c21c485b4fb58ef5d55cf3e523263dd824a2ace4Daniel Dunbar  for (ArgList::const_iterator
139c21c485b4fb58ef5d55cf3e523263dd824a2ace4Daniel Dunbar         it = Args.begin(), ie = Args.end(); it != ie; ++it) {
140c21c485b4fb58ef5d55cf3e523263dd824a2ace4Daniel Dunbar    const Arg *A = *it;
141c21c485b4fb58ef5d55cf3e523263dd824a2ace4Daniel Dunbar    if (!A->getOption().matches(options::OPT_clang_i_Group))
142c21c485b4fb58ef5d55cf3e523263dd824a2ace4Daniel Dunbar      continue;
143c21c485b4fb58ef5d55cf3e523263dd824a2ace4Daniel Dunbar
144c21c485b4fb58ef5d55cf3e523263dd824a2ace4Daniel Dunbar    if (A->getOption().matches(options::OPT_include)) {
145c21c485b4fb58ef5d55cf3e523263dd824a2ace4Daniel Dunbar      bool FoundPTH = false;
146df91ef3d6c55692a0236f67b6c6b134a3bf84098Douglas Gregor      bool FoundPCH = false;
147c21c485b4fb58ef5d55cf3e523263dd824a2ace4Daniel Dunbar      llvm::sys::Path P(A->getValue(Args));
148df91ef3d6c55692a0236f67b6c6b134a3bf84098Douglas Gregor      if (D.CCCUsePCH) {
149df91ef3d6c55692a0236f67b6c6b134a3bf84098Douglas Gregor        P.appendSuffix("pch");
150c21c485b4fb58ef5d55cf3e523263dd824a2ace4Daniel Dunbar        if (P.exists())
151df91ef3d6c55692a0236f67b6c6b134a3bf84098Douglas Gregor          FoundPCH = true;
1521eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump        else
153df91ef3d6c55692a0236f67b6c6b134a3bf84098Douglas Gregor          P.eraseSuffix();
154df91ef3d6c55692a0236f67b6c6b134a3bf84098Douglas Gregor      }
155df91ef3d6c55692a0236f67b6c6b134a3bf84098Douglas Gregor
156df91ef3d6c55692a0236f67b6c6b134a3bf84098Douglas Gregor      if (!FoundPCH) {
157df91ef3d6c55692a0236f67b6c6b134a3bf84098Douglas Gregor        P.appendSuffix("pth");
1581eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump        if (P.exists())
159c21c485b4fb58ef5d55cf3e523263dd824a2ace4Daniel Dunbar          FoundPTH = true;
160df91ef3d6c55692a0236f67b6c6b134a3bf84098Douglas Gregor        else
161df91ef3d6c55692a0236f67b6c6b134a3bf84098Douglas Gregor          P.eraseSuffix();
1621eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump      }
1631eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump
164df91ef3d6c55692a0236f67b6c6b134a3bf84098Douglas Gregor      if (!FoundPCH && !FoundPTH) {
165df91ef3d6c55692a0236f67b6c6b134a3bf84098Douglas Gregor        P.appendSuffix("gch");
166df91ef3d6c55692a0236f67b6c6b134a3bf84098Douglas Gregor        if (P.exists()) {
167df91ef3d6c55692a0236f67b6c6b134a3bf84098Douglas Gregor          FoundPCH = D.CCCUsePCH;
168df91ef3d6c55692a0236f67b6c6b134a3bf84098Douglas Gregor          FoundPTH = !D.CCCUsePCH;
169df91ef3d6c55692a0236f67b6c6b134a3bf84098Douglas Gregor        }
1701eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump        else
171df91ef3d6c55692a0236f67b6c6b134a3bf84098Douglas Gregor          P.eraseSuffix();
172c21c485b4fb58ef5d55cf3e523263dd824a2ace4Daniel Dunbar      }
173c21c485b4fb58ef5d55cf3e523263dd824a2ace4Daniel Dunbar
174df91ef3d6c55692a0236f67b6c6b134a3bf84098Douglas Gregor      if (FoundPCH || FoundPTH) {
175c21c485b4fb58ef5d55cf3e523263dd824a2ace4Daniel Dunbar        A->claim();
176ea71a5b388bc5bf91cb81ef004d0dd7f011af512Daniel Dunbar        if (D.CCCUsePCH)
177df91ef3d6c55692a0236f67b6c6b134a3bf84098Douglas Gregor          CmdArgs.push_back("-include-pch");
178df91ef3d6c55692a0236f67b6c6b134a3bf84098Douglas Gregor        else
179df91ef3d6c55692a0236f67b6c6b134a3bf84098Douglas Gregor          CmdArgs.push_back("-include-pth");
180881376467c46c5c6cc16fa6790271c2c22e1d4f1Daniel Dunbar        CmdArgs.push_back(Args.MakeArgString(P.str()));
181c21c485b4fb58ef5d55cf3e523263dd824a2ace4Daniel Dunbar        continue;
182c21c485b4fb58ef5d55cf3e523263dd824a2ace4Daniel Dunbar      }
183c21c485b4fb58ef5d55cf3e523263dd824a2ace4Daniel Dunbar    }
184c21c485b4fb58ef5d55cf3e523263dd824a2ace4Daniel Dunbar
185c21c485b4fb58ef5d55cf3e523263dd824a2ace4Daniel Dunbar    // Not translated, render as usual.
186c21c485b4fb58ef5d55cf3e523263dd824a2ace4Daniel Dunbar    A->claim();
187c21c485b4fb58ef5d55cf3e523263dd824a2ace4Daniel Dunbar    A->render(Args, CmdArgs);
188c21c485b4fb58ef5d55cf3e523263dd824a2ace4Daniel Dunbar  }
189c21c485b4fb58ef5d55cf3e523263dd824a2ace4Daniel Dunbar
190c21c485b4fb58ef5d55cf3e523263dd824a2ace4Daniel Dunbar  Args.AddAllArgs(CmdArgs, options::OPT_D, options::OPT_U);
191c21c485b4fb58ef5d55cf3e523263dd824a2ace4Daniel Dunbar  Args.AddAllArgs(CmdArgs, options::OPT_I_Group, options::OPT_F);
192c21c485b4fb58ef5d55cf3e523263dd824a2ace4Daniel Dunbar
193c21c485b4fb58ef5d55cf3e523263dd824a2ace4Daniel Dunbar  // Add -Wp, and -Xassembler if using the preprocessor.
194c21c485b4fb58ef5d55cf3e523263dd824a2ace4Daniel Dunbar
195c21c485b4fb58ef5d55cf3e523263dd824a2ace4Daniel Dunbar  // FIXME: There is a very unfortunate problem here, some troubled
196c21c485b4fb58ef5d55cf3e523263dd824a2ace4Daniel Dunbar  // souls abuse -Wp, to pass preprocessor options in gcc syntax. To
197c21c485b4fb58ef5d55cf3e523263dd824a2ace4Daniel Dunbar  // really support that we would have to parse and then translate
198c21c485b4fb58ef5d55cf3e523263dd824a2ace4Daniel Dunbar  // those options. :(
199c21c485b4fb58ef5d55cf3e523263dd824a2ace4Daniel Dunbar  Args.AddAllArgValues(CmdArgs, options::OPT_Wp_COMMA,
200c21c485b4fb58ef5d55cf3e523263dd824a2ace4Daniel Dunbar                       options::OPT_Xpreprocessor);
201c21c485b4fb58ef5d55cf3e523263dd824a2ace4Daniel Dunbar}
202c21c485b4fb58ef5d55cf3e523263dd824a2ace4Daniel Dunbar
203728a512753d85a6ccaae34e81385c8665c2de0e1Daniel Dunbar/// getARMTargetCPU - Get the (LLVM) name of the ARM cpu we are targetting.
204728a512753d85a6ccaae34e81385c8665c2de0e1Daniel Dunbar//
205728a512753d85a6ccaae34e81385c8665c2de0e1Daniel Dunbar// FIXME: tblgen this.
206b163ef7e7a5d904ef0962a7c38c460be083c4d63Daniel Dunbarstatic llvm::StringRef getARMTargetCPU(const ArgList &Args) {
207728a512753d85a6ccaae34e81385c8665c2de0e1Daniel Dunbar  // FIXME: Warn on inconsistent use of -mcpu and -march.
208b163ef7e7a5d904ef0962a7c38c460be083c4d63Daniel Dunbar
209b163ef7e7a5d904ef0962a7c38c460be083c4d63Daniel Dunbar  // If we have -mcpu=, use that.
210b163ef7e7a5d904ef0962a7c38c460be083c4d63Daniel Dunbar  if (Arg *A = Args.getLastArg(options::OPT_mcpu_EQ))
211b163ef7e7a5d904ef0962a7c38c460be083c4d63Daniel Dunbar    return A->getValue(Args);
212b163ef7e7a5d904ef0962a7c38c460be083c4d63Daniel Dunbar
213b163ef7e7a5d904ef0962a7c38c460be083c4d63Daniel Dunbar  // Otherwise, if we have -march= choose the base CPU for that arch.
214b163ef7e7a5d904ef0962a7c38c460be083c4d63Daniel Dunbar  if (Arg *A = Args.getLastArg(options::OPT_march_EQ)) {
215b163ef7e7a5d904ef0962a7c38c460be083c4d63Daniel Dunbar    llvm::StringRef MArch = A->getValue(Args);
216b163ef7e7a5d904ef0962a7c38c460be083c4d63Daniel Dunbar
217b163ef7e7a5d904ef0962a7c38c460be083c4d63Daniel Dunbar    if (MArch == "armv2" || MArch == "armv2a")
218b163ef7e7a5d904ef0962a7c38c460be083c4d63Daniel Dunbar      return "arm2";
219b163ef7e7a5d904ef0962a7c38c460be083c4d63Daniel Dunbar    if (MArch == "armv3")
220b163ef7e7a5d904ef0962a7c38c460be083c4d63Daniel Dunbar      return "arm6";
221b163ef7e7a5d904ef0962a7c38c460be083c4d63Daniel Dunbar    if (MArch == "armv3m")
222b163ef7e7a5d904ef0962a7c38c460be083c4d63Daniel Dunbar      return "arm7m";
223b163ef7e7a5d904ef0962a7c38c460be083c4d63Daniel Dunbar    if (MArch == "armv4" || MArch == "armv4t")
224b163ef7e7a5d904ef0962a7c38c460be083c4d63Daniel Dunbar      return "arm7tdmi";
225b163ef7e7a5d904ef0962a7c38c460be083c4d63Daniel Dunbar    if (MArch == "armv5" || MArch == "armv5t")
226b163ef7e7a5d904ef0962a7c38c460be083c4d63Daniel Dunbar      return "arm10tdmi";
227b163ef7e7a5d904ef0962a7c38c460be083c4d63Daniel Dunbar    if (MArch == "armv5e" || MArch == "armv5te")
228b163ef7e7a5d904ef0962a7c38c460be083c4d63Daniel Dunbar      return "arm1026ejs";
229b163ef7e7a5d904ef0962a7c38c460be083c4d63Daniel Dunbar    if (MArch == "armv5tej")
230b163ef7e7a5d904ef0962a7c38c460be083c4d63Daniel Dunbar      return "arm926ejs";
231b163ef7e7a5d904ef0962a7c38c460be083c4d63Daniel Dunbar    if (MArch == "armv6" || MArch == "armv6k")
232b163ef7e7a5d904ef0962a7c38c460be083c4d63Daniel Dunbar      return "arm1136jf-s";
233b163ef7e7a5d904ef0962a7c38c460be083c4d63Daniel Dunbar    if (MArch == "armv6j")
234b163ef7e7a5d904ef0962a7c38c460be083c4d63Daniel Dunbar      return "arm1136j-s";
235b163ef7e7a5d904ef0962a7c38c460be083c4d63Daniel Dunbar    if (MArch == "armv6z" || MArch == "armv6zk")
236b163ef7e7a5d904ef0962a7c38c460be083c4d63Daniel Dunbar      return "arm1176jzf-s";
237b163ef7e7a5d904ef0962a7c38c460be083c4d63Daniel Dunbar    if (MArch == "armv6t2")
238b163ef7e7a5d904ef0962a7c38c460be083c4d63Daniel Dunbar      return "arm1156t2-s";
239b163ef7e7a5d904ef0962a7c38c460be083c4d63Daniel Dunbar    if (MArch == "armv7" || MArch == "armv7a" || MArch == "armv7-a")
240b163ef7e7a5d904ef0962a7c38c460be083c4d63Daniel Dunbar      return "cortex-a8";
241b163ef7e7a5d904ef0962a7c38c460be083c4d63Daniel Dunbar    if (MArch == "armv7r" || MArch == "armv7-r")
242b163ef7e7a5d904ef0962a7c38c460be083c4d63Daniel Dunbar      return "cortex-r4";
243b163ef7e7a5d904ef0962a7c38c460be083c4d63Daniel Dunbar    if (MArch == "armv7m" || MArch == "armv7-m")
244b163ef7e7a5d904ef0962a7c38c460be083c4d63Daniel Dunbar      return "cortex-m3";
245b163ef7e7a5d904ef0962a7c38c460be083c4d63Daniel Dunbar    if (MArch == "ep9312")
246b163ef7e7a5d904ef0962a7c38c460be083c4d63Daniel Dunbar      return "ep9312";
247b163ef7e7a5d904ef0962a7c38c460be083c4d63Daniel Dunbar    if (MArch == "iwmmxt")
248b163ef7e7a5d904ef0962a7c38c460be083c4d63Daniel Dunbar      return "iwmmxt";
249b163ef7e7a5d904ef0962a7c38c460be083c4d63Daniel Dunbar    if (MArch == "xscale")
250b163ef7e7a5d904ef0962a7c38c460be083c4d63Daniel Dunbar      return "xscale";
251b163ef7e7a5d904ef0962a7c38c460be083c4d63Daniel Dunbar  }
252b163ef7e7a5d904ef0962a7c38c460be083c4d63Daniel Dunbar
253b163ef7e7a5d904ef0962a7c38c460be083c4d63Daniel Dunbar  // Otherwise return the most base CPU LLVM supports.
254b163ef7e7a5d904ef0962a7c38c460be083c4d63Daniel Dunbar  return "arm7tdmi";
255b163ef7e7a5d904ef0962a7c38c460be083c4d63Daniel Dunbar}
256b163ef7e7a5d904ef0962a7c38c460be083c4d63Daniel Dunbar
2571d65e4be6f22f7e4b4974efbaef92fa3454f1ec8Daniel Dunbar/// getLLVMArchSuffixForARM - Get the LLVM arch name to use for a particular
258728a512753d85a6ccaae34e81385c8665c2de0e1Daniel Dunbar/// CPU.
259728a512753d85a6ccaae34e81385c8665c2de0e1Daniel Dunbar//
260728a512753d85a6ccaae34e81385c8665c2de0e1Daniel Dunbar// FIXME: This is redundant with -mcpu, why does LLVM use this.
261728a512753d85a6ccaae34e81385c8665c2de0e1Daniel Dunbar// FIXME: tblgen this, or kill it!
2621d65e4be6f22f7e4b4974efbaef92fa3454f1ec8Daniel Dunbarstatic const char *getLLVMArchSuffixForARM(llvm::StringRef CPU) {
263728a512753d85a6ccaae34e81385c8665c2de0e1Daniel Dunbar  if (CPU == "arm7tdmi" || CPU == "arm7tdmi-s" || CPU == "arm710t" ||
264728a512753d85a6ccaae34e81385c8665c2de0e1Daniel Dunbar      CPU == "arm720t" || CPU == "arm9" || CPU == "arm9tdmi" ||
265728a512753d85a6ccaae34e81385c8665c2de0e1Daniel Dunbar      CPU == "arm920" || CPU == "arm920t" || CPU == "arm922t" ||
266728a512753d85a6ccaae34e81385c8665c2de0e1Daniel Dunbar      CPU == "arm940t" || CPU == "ep9312")
2671d65e4be6f22f7e4b4974efbaef92fa3454f1ec8Daniel Dunbar    return "v4t";
268728a512753d85a6ccaae34e81385c8665c2de0e1Daniel Dunbar
269728a512753d85a6ccaae34e81385c8665c2de0e1Daniel Dunbar  if (CPU == "arm10tdmi" || CPU == "arm1020t")
2701d65e4be6f22f7e4b4974efbaef92fa3454f1ec8Daniel Dunbar    return "v5";
271728a512753d85a6ccaae34e81385c8665c2de0e1Daniel Dunbar
272728a512753d85a6ccaae34e81385c8665c2de0e1Daniel Dunbar  if (CPU == "arm9e" || CPU == "arm926ej-s" || CPU == "arm946e-s" ||
273728a512753d85a6ccaae34e81385c8665c2de0e1Daniel Dunbar      CPU == "arm966e-s" || CPU == "arm968e-s" || CPU == "arm10e" ||
274728a512753d85a6ccaae34e81385c8665c2de0e1Daniel Dunbar      CPU == "arm1020e" || CPU == "arm1022e" || CPU == "xscale" ||
275728a512753d85a6ccaae34e81385c8665c2de0e1Daniel Dunbar      CPU == "iwmmxt")
2761d65e4be6f22f7e4b4974efbaef92fa3454f1ec8Daniel Dunbar    return "v5e";
277728a512753d85a6ccaae34e81385c8665c2de0e1Daniel Dunbar
278728a512753d85a6ccaae34e81385c8665c2de0e1Daniel Dunbar  if (CPU == "arm1136j-s" || CPU == "arm1136jf-s" || CPU == "arm1176jz-s" ||
279728a512753d85a6ccaae34e81385c8665c2de0e1Daniel Dunbar      CPU == "arm1176jzf-s" || CPU == "mpcorenovfp" || CPU == "mpcore")
2801d65e4be6f22f7e4b4974efbaef92fa3454f1ec8Daniel Dunbar    return "v6";
281728a512753d85a6ccaae34e81385c8665c2de0e1Daniel Dunbar
282728a512753d85a6ccaae34e81385c8665c2de0e1Daniel Dunbar  if (CPU == "arm1156t2-s" || CPU == "arm1156t2f-s")
2831d65e4be6f22f7e4b4974efbaef92fa3454f1ec8Daniel Dunbar    return "v6t2";
284728a512753d85a6ccaae34e81385c8665c2de0e1Daniel Dunbar
285728a512753d85a6ccaae34e81385c8665c2de0e1Daniel Dunbar  if (CPU == "cortex-a8" || CPU == "cortex-a9")
2861d65e4be6f22f7e4b4974efbaef92fa3454f1ec8Daniel Dunbar    return "v7";
287728a512753d85a6ccaae34e81385c8665c2de0e1Daniel Dunbar
2881d65e4be6f22f7e4b4974efbaef92fa3454f1ec8Daniel Dunbar  return "";
289728a512753d85a6ccaae34e81385c8665c2de0e1Daniel Dunbar}
290728a512753d85a6ccaae34e81385c8665c2de0e1Daniel Dunbar
291728a512753d85a6ccaae34e81385c8665c2de0e1Daniel Dunbar/// getLLVMTriple - Get the LLVM triple to use for a particular toolchain, which
292728a512753d85a6ccaae34e81385c8665c2de0e1Daniel Dunbar/// may depend on command line arguments.
293728a512753d85a6ccaae34e81385c8665c2de0e1Daniel Dunbarstatic std::string getLLVMTriple(const ToolChain &TC, const ArgList &Args) {
294728a512753d85a6ccaae34e81385c8665c2de0e1Daniel Dunbar  switch (TC.getTriple().getArch()) {
295728a512753d85a6ccaae34e81385c8665c2de0e1Daniel Dunbar  default:
296728a512753d85a6ccaae34e81385c8665c2de0e1Daniel Dunbar    return TC.getTripleString();
297728a512753d85a6ccaae34e81385c8665c2de0e1Daniel Dunbar
298728a512753d85a6ccaae34e81385c8665c2de0e1Daniel Dunbar  case llvm::Triple::arm:
299728a512753d85a6ccaae34e81385c8665c2de0e1Daniel Dunbar  case llvm::Triple::thumb: {
300f4aa4f61de7d364364dc94bbf83ff71448a11327Daniel Dunbar    // FIXME: Factor into subclasses.
301728a512753d85a6ccaae34e81385c8665c2de0e1Daniel Dunbar    llvm::Triple Triple = TC.getTriple();
302f4aa4f61de7d364364dc94bbf83ff71448a11327Daniel Dunbar
303f4aa4f61de7d364364dc94bbf83ff71448a11327Daniel Dunbar    // Thumb2 is the default for V7 on Darwin.
304f4aa4f61de7d364364dc94bbf83ff71448a11327Daniel Dunbar    //
305f4aa4f61de7d364364dc94bbf83ff71448a11327Daniel Dunbar    // FIXME: Thumb should just be another -target-feaure, not in the triple.
306f4aa4f61de7d364364dc94bbf83ff71448a11327Daniel Dunbar    llvm::StringRef Suffix = getLLVMArchSuffixForARM(getARMTargetCPU(Args));
307f4aa4f61de7d364364dc94bbf83ff71448a11327Daniel Dunbar    bool ThumbDefault =
308f4aa4f61de7d364364dc94bbf83ff71448a11327Daniel Dunbar      (Suffix == "v7" && TC.getTriple().getOS() == llvm::Triple::Darwin);
3091d65e4be6f22f7e4b4974efbaef92fa3454f1ec8Daniel Dunbar    std::string ArchName = "arm";
310f4aa4f61de7d364364dc94bbf83ff71448a11327Daniel Dunbar    if (Args.hasFlag(options::OPT_mthumb, options::OPT_mno_thumb, ThumbDefault))
311f4aa4f61de7d364364dc94bbf83ff71448a11327Daniel Dunbar      ArchName = "thumb";
312f4aa4f61de7d364364dc94bbf83ff71448a11327Daniel Dunbar    Triple.setArchName(ArchName + Suffix.str());
313f4aa4f61de7d364364dc94bbf83ff71448a11327Daniel Dunbar
314728a512753d85a6ccaae34e81385c8665c2de0e1Daniel Dunbar    return Triple.getTriple();
315728a512753d85a6ccaae34e81385c8665c2de0e1Daniel Dunbar  }
316728a512753d85a6ccaae34e81385c8665c2de0e1Daniel Dunbar  }
317728a512753d85a6ccaae34e81385c8665c2de0e1Daniel Dunbar}
318728a512753d85a6ccaae34e81385c8665c2de0e1Daniel Dunbar
319b163ef7e7a5d904ef0962a7c38c460be083c4d63Daniel Dunbarvoid Clang::AddARMTargetArgs(const ArgList &Args,
320b163ef7e7a5d904ef0962a7c38c460be083c4d63Daniel Dunbar                             ArgStringList &CmdArgs) const {
321cbd1933f83e2332b2d7add10459f80cc4e7eb7bfDaniel Dunbar  const Driver &D = getToolChain().getHost().getDriver();
322cbd1933f83e2332b2d7add10459f80cc4e7eb7bfDaniel Dunbar
3232030d8f46b4226fa99e59389e3ca856a79c27e9aDaniel Dunbar  // Select the ABI to use.
3242030d8f46b4226fa99e59389e3ca856a79c27e9aDaniel Dunbar  //
3252030d8f46b4226fa99e59389e3ca856a79c27e9aDaniel Dunbar  // FIXME: Support -meabi.
3262030d8f46b4226fa99e59389e3ca856a79c27e9aDaniel Dunbar  const char *ABIName = 0;
3272030d8f46b4226fa99e59389e3ca856a79c27e9aDaniel Dunbar  if (Arg *A = Args.getLastArg(options::OPT_mabi_EQ)) {
3282030d8f46b4226fa99e59389e3ca856a79c27e9aDaniel Dunbar    ABIName = A->getValue(Args);
3292030d8f46b4226fa99e59389e3ca856a79c27e9aDaniel Dunbar  } else {
3302030d8f46b4226fa99e59389e3ca856a79c27e9aDaniel Dunbar    // Select the default based on the platform.
3312030d8f46b4226fa99e59389e3ca856a79c27e9aDaniel Dunbar    switch (getToolChain().getTriple().getOS()) {
3322030d8f46b4226fa99e59389e3ca856a79c27e9aDaniel Dunbar      // FIXME: Is this right for non-Darwin and non-Linux?
3332030d8f46b4226fa99e59389e3ca856a79c27e9aDaniel Dunbar    default:
3342030d8f46b4226fa99e59389e3ca856a79c27e9aDaniel Dunbar      ABIName = "aapcs";
3352030d8f46b4226fa99e59389e3ca856a79c27e9aDaniel Dunbar      break;
3362030d8f46b4226fa99e59389e3ca856a79c27e9aDaniel Dunbar
3372030d8f46b4226fa99e59389e3ca856a79c27e9aDaniel Dunbar    case llvm::Triple::Darwin:
3382030d8f46b4226fa99e59389e3ca856a79c27e9aDaniel Dunbar      ABIName = "apcs-gnu";
3392030d8f46b4226fa99e59389e3ca856a79c27e9aDaniel Dunbar      break;
3402030d8f46b4226fa99e59389e3ca856a79c27e9aDaniel Dunbar
3412030d8f46b4226fa99e59389e3ca856a79c27e9aDaniel Dunbar    case llvm::Triple::Linux:
3422030d8f46b4226fa99e59389e3ca856a79c27e9aDaniel Dunbar      ABIName = "aapcs-linux";
3432030d8f46b4226fa99e59389e3ca856a79c27e9aDaniel Dunbar      break;
3442030d8f46b4226fa99e59389e3ca856a79c27e9aDaniel Dunbar    }
3452030d8f46b4226fa99e59389e3ca856a79c27e9aDaniel Dunbar  }
3462030d8f46b4226fa99e59389e3ca856a79c27e9aDaniel Dunbar  CmdArgs.push_back("-target-abi");
3472030d8f46b4226fa99e59389e3ca856a79c27e9aDaniel Dunbar  CmdArgs.push_back(ABIName);
3482030d8f46b4226fa99e59389e3ca856a79c27e9aDaniel Dunbar
349b163ef7e7a5d904ef0962a7c38c460be083c4d63Daniel Dunbar  // Set the CPU based on -march= and -mcpu=.
350b163ef7e7a5d904ef0962a7c38c460be083c4d63Daniel Dunbar  CmdArgs.push_back(Args.MakeArgString("-mcpu=" + getARMTargetCPU(Args)));
351b163ef7e7a5d904ef0962a7c38c460be083c4d63Daniel Dunbar
352cbd1933f83e2332b2d7add10459f80cc4e7eb7bfDaniel Dunbar  // Select the float ABI as determined by -msoft-float, -mhard-float, and
353cbd1933f83e2332b2d7add10459f80cc4e7eb7bfDaniel Dunbar  // -mfloat-abi=.
354cbd1933f83e2332b2d7add10459f80cc4e7eb7bfDaniel Dunbar  llvm::StringRef FloatABI;
355cbd1933f83e2332b2d7add10459f80cc4e7eb7bfDaniel Dunbar  if (Arg *A = Args.getLastArg(options::OPT_msoft_float,
356cbd1933f83e2332b2d7add10459f80cc4e7eb7bfDaniel Dunbar                               options::OPT_mhard_float,
357cbd1933f83e2332b2d7add10459f80cc4e7eb7bfDaniel Dunbar                               options::OPT_mfloat_abi_EQ)) {
358cbd1933f83e2332b2d7add10459f80cc4e7eb7bfDaniel Dunbar    if (A->getOption().matches(options::OPT_msoft_float))
359cbd1933f83e2332b2d7add10459f80cc4e7eb7bfDaniel Dunbar      FloatABI = "soft";
360cbd1933f83e2332b2d7add10459f80cc4e7eb7bfDaniel Dunbar    else if (A->getOption().matches(options::OPT_mhard_float))
361cbd1933f83e2332b2d7add10459f80cc4e7eb7bfDaniel Dunbar      FloatABI = "hard";
362cbd1933f83e2332b2d7add10459f80cc4e7eb7bfDaniel Dunbar    else {
363cbd1933f83e2332b2d7add10459f80cc4e7eb7bfDaniel Dunbar      FloatABI = A->getValue(Args);
364cbd1933f83e2332b2d7add10459f80cc4e7eb7bfDaniel Dunbar      if (FloatABI != "soft" && FloatABI != "softfp" && FloatABI != "hard") {
365cbd1933f83e2332b2d7add10459f80cc4e7eb7bfDaniel Dunbar        D.Diag(clang::diag::err_drv_invalid_mfloat_abi)
366cbd1933f83e2332b2d7add10459f80cc4e7eb7bfDaniel Dunbar          << A->getAsString(Args);
367cbd1933f83e2332b2d7add10459f80cc4e7eb7bfDaniel Dunbar        FloatABI = "soft";
368cbd1933f83e2332b2d7add10459f80cc4e7eb7bfDaniel Dunbar      }
369cbd1933f83e2332b2d7add10459f80cc4e7eb7bfDaniel Dunbar    }
370cbd1933f83e2332b2d7add10459f80cc4e7eb7bfDaniel Dunbar  }
371cbd1933f83e2332b2d7add10459f80cc4e7eb7bfDaniel Dunbar
372cbd1933f83e2332b2d7add10459f80cc4e7eb7bfDaniel Dunbar  // If unspecified, choose the default based on the platform.
373cbd1933f83e2332b2d7add10459f80cc4e7eb7bfDaniel Dunbar  if (FloatABI.empty()) {
374cbd1933f83e2332b2d7add10459f80cc4e7eb7bfDaniel Dunbar    // FIXME: This is wrong for non-Darwin, we don't have a mechanism yet for
375cbd1933f83e2332b2d7add10459f80cc4e7eb7bfDaniel Dunbar    // distinguishing things like linux-eabi vs linux-elf.
376cbd1933f83e2332b2d7add10459f80cc4e7eb7bfDaniel Dunbar    switch (getToolChain().getTriple().getOS()) {
377cbd1933f83e2332b2d7add10459f80cc4e7eb7bfDaniel Dunbar    case llvm::Triple::Darwin: {
378cbd1933f83e2332b2d7add10459f80cc4e7eb7bfDaniel Dunbar      // Darwin defaults to "softfp" for v6 and v7.
379cbd1933f83e2332b2d7add10459f80cc4e7eb7bfDaniel Dunbar      //
380cbd1933f83e2332b2d7add10459f80cc4e7eb7bfDaniel Dunbar      // FIXME: Factor out an ARM class so we can cache the arch somewhere.
381cbd1933f83e2332b2d7add10459f80cc4e7eb7bfDaniel Dunbar      llvm::StringRef ArchName = getLLVMArchSuffixForARM(getARMTargetCPU(Args));
382cbd1933f83e2332b2d7add10459f80cc4e7eb7bfDaniel Dunbar      if (ArchName.startswith("v6") || ArchName.startswith("v7"))
383cbd1933f83e2332b2d7add10459f80cc4e7eb7bfDaniel Dunbar        FloatABI = "softfp";
384cbd1933f83e2332b2d7add10459f80cc4e7eb7bfDaniel Dunbar      else
385cbd1933f83e2332b2d7add10459f80cc4e7eb7bfDaniel Dunbar        FloatABI = "soft";
386cbd1933f83e2332b2d7add10459f80cc4e7eb7bfDaniel Dunbar      break;
387cbd1933f83e2332b2d7add10459f80cc4e7eb7bfDaniel Dunbar    }
388cbd1933f83e2332b2d7add10459f80cc4e7eb7bfDaniel Dunbar
389cbd1933f83e2332b2d7add10459f80cc4e7eb7bfDaniel Dunbar    default:
390cbd1933f83e2332b2d7add10459f80cc4e7eb7bfDaniel Dunbar      // Assume "soft", but warn the user we are guessing.
391cbd1933f83e2332b2d7add10459f80cc4e7eb7bfDaniel Dunbar      FloatABI = "soft";
392cbd1933f83e2332b2d7add10459f80cc4e7eb7bfDaniel Dunbar      D.Diag(clang::diag::warn_drv_assuming_mfloat_abi_is) << "soft";
393cbd1933f83e2332b2d7add10459f80cc4e7eb7bfDaniel Dunbar      break;
394cbd1933f83e2332b2d7add10459f80cc4e7eb7bfDaniel Dunbar    }
395cbd1933f83e2332b2d7add10459f80cc4e7eb7bfDaniel Dunbar  }
396cbd1933f83e2332b2d7add10459f80cc4e7eb7bfDaniel Dunbar
397cbd1933f83e2332b2d7add10459f80cc4e7eb7bfDaniel Dunbar  if (FloatABI == "soft") {
398cbd1933f83e2332b2d7add10459f80cc4e7eb7bfDaniel Dunbar    // Floating point operations and argument passing are soft.
399cbd1933f83e2332b2d7add10459f80cc4e7eb7bfDaniel Dunbar    //
400cbd1933f83e2332b2d7add10459f80cc4e7eb7bfDaniel Dunbar    // FIXME: This changes CPP defines, we need -target-soft-float.
401cbd1933f83e2332b2d7add10459f80cc4e7eb7bfDaniel Dunbar    CmdArgs.push_back("-soft-float");
402cbd1933f83e2332b2d7add10459f80cc4e7eb7bfDaniel Dunbar    CmdArgs.push_back("-float-abi=soft");
403cbd1933f83e2332b2d7add10459f80cc4e7eb7bfDaniel Dunbar  } else if (FloatABI == "softfp") {
404cbd1933f83e2332b2d7add10459f80cc4e7eb7bfDaniel Dunbar    // Floating point operations are hard, but argument passing is soft.
405cbd1933f83e2332b2d7add10459f80cc4e7eb7bfDaniel Dunbar    CmdArgs.push_back("-float-abi=soft");
406cbd1933f83e2332b2d7add10459f80cc4e7eb7bfDaniel Dunbar  } else {
407cbd1933f83e2332b2d7add10459f80cc4e7eb7bfDaniel Dunbar    // Floating point operations and argument passing are hard.
408cbd1933f83e2332b2d7add10459f80cc4e7eb7bfDaniel Dunbar    assert(FloatABI == "hard" && "Invalid float abi!");
409cbd1933f83e2332b2d7add10459f80cc4e7eb7bfDaniel Dunbar    CmdArgs.push_back("-float-abi=hard");
410cbd1933f83e2332b2d7add10459f80cc4e7eb7bfDaniel Dunbar  }
411b163ef7e7a5d904ef0962a7c38c460be083c4d63Daniel Dunbar}
412b163ef7e7a5d904ef0962a7c38c460be083c4d63Daniel Dunbar
4136acda16e9c194dcbd0dea64341e182bdb65d0f41Daniel Dunbarvoid Clang::AddX86TargetArgs(const ArgList &Args,
4146acda16e9c194dcbd0dea64341e182bdb65d0f41Daniel Dunbar                             ArgStringList &CmdArgs) const {
415e6ad3f9fceef0ecc422ff26754ea069a5fd18c69Daniel Dunbar  // FIXME: This needs to change to use a clang-cc option, and set the attribute
416e6ad3f9fceef0ecc422ff26754ea069a5fd18c69Daniel Dunbar  // on functions.
417e6ad3f9fceef0ecc422ff26754ea069a5fd18c69Daniel Dunbar  if (!Args.hasFlag(options::OPT_mred_zone,
418e6ad3f9fceef0ecc422ff26754ea069a5fd18c69Daniel Dunbar                    options::OPT_mno_red_zone,
419e6ad3f9fceef0ecc422ff26754ea069a5fd18c69Daniel Dunbar                    true) ||
420e6ad3f9fceef0ecc422ff26754ea069a5fd18c69Daniel Dunbar      Args.hasArg(options::OPT_mkernel) ||
421e6ad3f9fceef0ecc422ff26754ea069a5fd18c69Daniel Dunbar      Args.hasArg(options::OPT_fapple_kext))
422e6ad3f9fceef0ecc422ff26754ea069a5fd18c69Daniel Dunbar    CmdArgs.push_back("--disable-red-zone");
423e6ad3f9fceef0ecc422ff26754ea069a5fd18c69Daniel Dunbar
424e6ad3f9fceef0ecc422ff26754ea069a5fd18c69Daniel Dunbar  // FIXME: This needs to change to use a clang-cc option, and set the attribute
425e6ad3f9fceef0ecc422ff26754ea069a5fd18c69Daniel Dunbar  // on functions.
426e6ad3f9fceef0ecc422ff26754ea069a5fd18c69Daniel Dunbar  if (Args.hasFlag(options::OPT_msoft_float,
427e6ad3f9fceef0ecc422ff26754ea069a5fd18c69Daniel Dunbar                   options::OPT_mno_soft_float,
428e6ad3f9fceef0ecc422ff26754ea069a5fd18c69Daniel Dunbar                   false))
429e6ad3f9fceef0ecc422ff26754ea069a5fd18c69Daniel Dunbar    CmdArgs.push_back("--no-implicit-float");
430e6ad3f9fceef0ecc422ff26754ea069a5fd18c69Daniel Dunbar
4316acda16e9c194dcbd0dea64341e182bdb65d0f41Daniel Dunbar  if (const Arg *A = Args.getLastArg(options::OPT_march_EQ)) {
4326acda16e9c194dcbd0dea64341e182bdb65d0f41Daniel Dunbar    // FIXME: We may need some translation here from the options gcc takes to
4336acda16e9c194dcbd0dea64341e182bdb65d0f41Daniel Dunbar    // names the LLVM backend understand?
4346acda16e9c194dcbd0dea64341e182bdb65d0f41Daniel Dunbar    CmdArgs.push_back("-mcpu");
4356acda16e9c194dcbd0dea64341e182bdb65d0f41Daniel Dunbar    CmdArgs.push_back(A->getValue(Args));
4366acda16e9c194dcbd0dea64341e182bdb65d0f41Daniel Dunbar  } else {
4376acda16e9c194dcbd0dea64341e182bdb65d0f41Daniel Dunbar    // Select default CPU.
4386acda16e9c194dcbd0dea64341e182bdb65d0f41Daniel Dunbar
4396acda16e9c194dcbd0dea64341e182bdb65d0f41Daniel Dunbar    // FIXME: Need target hooks.
4406acda16e9c194dcbd0dea64341e182bdb65d0f41Daniel Dunbar    if (memcmp(getToolChain().getOS().c_str(), "darwin", 6) == 0) {
4416acda16e9c194dcbd0dea64341e182bdb65d0f41Daniel Dunbar      if (getToolChain().getArchName() == "x86_64")
4426acda16e9c194dcbd0dea64341e182bdb65d0f41Daniel Dunbar        CmdArgs.push_back("--mcpu=core2");
4436acda16e9c194dcbd0dea64341e182bdb65d0f41Daniel Dunbar      else if (getToolChain().getArchName() == "i386")
4446acda16e9c194dcbd0dea64341e182bdb65d0f41Daniel Dunbar        CmdArgs.push_back("--mcpu=yonah");
4456acda16e9c194dcbd0dea64341e182bdb65d0f41Daniel Dunbar    } else {
4466acda16e9c194dcbd0dea64341e182bdb65d0f41Daniel Dunbar      if (getToolChain().getArchName() == "x86_64")
4476acda16e9c194dcbd0dea64341e182bdb65d0f41Daniel Dunbar        CmdArgs.push_back("--mcpu=x86-64");
4486acda16e9c194dcbd0dea64341e182bdb65d0f41Daniel Dunbar      else if (getToolChain().getArchName() == "i386")
4496acda16e9c194dcbd0dea64341e182bdb65d0f41Daniel Dunbar        CmdArgs.push_back("--mcpu=pentium4");
4506acda16e9c194dcbd0dea64341e182bdb65d0f41Daniel Dunbar    }
4516acda16e9c194dcbd0dea64341e182bdb65d0f41Daniel Dunbar  }
4526acda16e9c194dcbd0dea64341e182bdb65d0f41Daniel Dunbar
4536acda16e9c194dcbd0dea64341e182bdb65d0f41Daniel Dunbar  // FIXME: Use iterator.
4546acda16e9c194dcbd0dea64341e182bdb65d0f41Daniel Dunbar  for (ArgList::const_iterator
4556acda16e9c194dcbd0dea64341e182bdb65d0f41Daniel Dunbar         it = Args.begin(), ie = Args.end(); it != ie; ++it) {
4566acda16e9c194dcbd0dea64341e182bdb65d0f41Daniel Dunbar    const Arg *A = *it;
4576acda16e9c194dcbd0dea64341e182bdb65d0f41Daniel Dunbar    if (A->getOption().matches(options::OPT_m_x86_Features_Group)) {
4586acda16e9c194dcbd0dea64341e182bdb65d0f41Daniel Dunbar      llvm::StringRef Name = A->getOption().getName();
4596acda16e9c194dcbd0dea64341e182bdb65d0f41Daniel Dunbar
4606acda16e9c194dcbd0dea64341e182bdb65d0f41Daniel Dunbar      // Skip over "-m".
4616acda16e9c194dcbd0dea64341e182bdb65d0f41Daniel Dunbar      assert(Name.startswith("-m") && "Invalid feature name.");
4626acda16e9c194dcbd0dea64341e182bdb65d0f41Daniel Dunbar      Name = Name.substr(2);
4636acda16e9c194dcbd0dea64341e182bdb65d0f41Daniel Dunbar
4646acda16e9c194dcbd0dea64341e182bdb65d0f41Daniel Dunbar      bool IsNegative = Name.startswith("no-");
4656acda16e9c194dcbd0dea64341e182bdb65d0f41Daniel Dunbar      if (IsNegative)
4666acda16e9c194dcbd0dea64341e182bdb65d0f41Daniel Dunbar        Name = Name.substr(3);
4676acda16e9c194dcbd0dea64341e182bdb65d0f41Daniel Dunbar
4686acda16e9c194dcbd0dea64341e182bdb65d0f41Daniel Dunbar      A->claim();
4696acda16e9c194dcbd0dea64341e182bdb65d0f41Daniel Dunbar      CmdArgs.push_back("-target-feature");
4706acda16e9c194dcbd0dea64341e182bdb65d0f41Daniel Dunbar      CmdArgs.push_back(Args.MakeArgString((IsNegative ? "-" : "+") + Name));
4716acda16e9c194dcbd0dea64341e182bdb65d0f41Daniel Dunbar    }
4726acda16e9c194dcbd0dea64341e182bdb65d0f41Daniel Dunbar  }
4736acda16e9c194dcbd0dea64341e182bdb65d0f41Daniel Dunbar}
4746acda16e9c194dcbd0dea64341e182bdb65d0f41Daniel Dunbar
47547ac7d27c44bd64a7d0fc03d4babc196cf2b8230Daniel Dunbarvoid Clang::ConstructJob(Compilation &C, const JobAction &JA,
476871adcf4e41285e3f4c3b62eaa1b2e05b60b92daDaniel Dunbar                         Job &Dest,
477871adcf4e41285e3f4c3b62eaa1b2e05b60b92daDaniel Dunbar                         const InputInfo &Output,
47862cf601812e03dd9bc5df42b8ef06a0cdedc38bfDaniel Dunbar                         const InputInfoList &Inputs,
4791d46033f760ba5fd266ce59fe391fac473f04f52Daniel Dunbar                         const ArgList &Args,
48047ac7d27c44bd64a7d0fc03d4babc196cf2b8230Daniel Dunbar                         const char *LinkingOutput) const {
4815c1aaafbd6dd25a99ca1960e1c3c98aeefe9d728Daniel Dunbar  const Driver &D = getToolChain().getHost().getDriver();
482b488c1dac8e53206f07103d794a62a3f5012c0f4Daniel Dunbar  ArgStringList CmdArgs;
483b488c1dac8e53206f07103d794a62a3f5012c0f4Daniel Dunbar
484077ba6a3ac3628afb0d3c460e81ce013bccbdbedDaniel Dunbar  assert(Inputs.size() == 1 && "Unable to handle multiple inputs.");
485077ba6a3ac3628afb0d3c460e81ce013bccbdbedDaniel Dunbar
486af07f936b698575f2c91f1c1134c116f1ef0deddDaniel Dunbar  CmdArgs.push_back("-triple");
487728a512753d85a6ccaae34e81385c8665c2de0e1Daniel Dunbar
488c21c485b4fb58ef5d55cf3e523263dd824a2ace4Daniel Dunbar  const char *TripleStr =
489728a512753d85a6ccaae34e81385c8665c2de0e1Daniel Dunbar    Args.MakeArgString(getLLVMTriple(getToolChain(), Args));
490af07f936b698575f2c91f1c1134c116f1ef0deddDaniel Dunbar  CmdArgs.push_back(TripleStr);
491af07f936b698575f2c91f1c1134c116f1ef0deddDaniel Dunbar
4921d46033f760ba5fd266ce59fe391fac473f04f52Daniel Dunbar  if (isa<AnalyzeJobAction>(JA)) {
4931d46033f760ba5fd266ce59fe391fac473f04f52Daniel Dunbar    assert(JA.getType() == types::TY_Plist && "Invalid output type.");
4941d46033f760ba5fd266ce59fe391fac473f04f52Daniel Dunbar    CmdArgs.push_back("-analyze");
4951d46033f760ba5fd266ce59fe391fac473f04f52Daniel Dunbar  } else if (isa<PreprocessJobAction>(JA)) {
496cd8e4c44dd068956e9181381be3ee2d49a0fac52Daniel Dunbar    if (Output.getType() == types::TY_Dependencies)
497cd8e4c44dd068956e9181381be3ee2d49a0fac52Daniel Dunbar      CmdArgs.push_back("-Eonly");
498cd8e4c44dd068956e9181381be3ee2d49a0fac52Daniel Dunbar    else
499cd8e4c44dd068956e9181381be3ee2d49a0fac52Daniel Dunbar      CmdArgs.push_back("-E");
5001d46033f760ba5fd266ce59fe391fac473f04f52Daniel Dunbar  } else if (isa<PrecompileJobAction>(JA)) {
501df91ef3d6c55692a0236f67b6c6b134a3bf84098Douglas Gregor    if (D.CCCUsePCH)
502df91ef3d6c55692a0236f67b6c6b134a3bf84098Douglas Gregor      CmdArgs.push_back("-emit-pch");
503df91ef3d6c55692a0236f67b6c6b134a3bf84098Douglas Gregor    else
504df91ef3d6c55692a0236f67b6c6b134a3bf84098Douglas Gregor      CmdArgs.push_back("-emit-pth");
5051d46033f760ba5fd266ce59fe391fac473f04f52Daniel Dunbar  } else {
5061d46033f760ba5fd266ce59fe391fac473f04f52Daniel Dunbar    assert(isa<CompileJobAction>(JA) && "Invalid action for clang tool.");
507c21c485b4fb58ef5d55cf3e523263dd824a2ace4Daniel Dunbar
5081d46033f760ba5fd266ce59fe391fac473f04f52Daniel Dunbar    if (JA.getType() == types::TY_Nothing) {
5091d46033f760ba5fd266ce59fe391fac473f04f52Daniel Dunbar      CmdArgs.push_back("-fsyntax-only");
5101d46033f760ba5fd266ce59fe391fac473f04f52Daniel Dunbar    } else if (JA.getType() == types::TY_LLVMAsm) {
5111d46033f760ba5fd266ce59fe391fac473f04f52Daniel Dunbar      CmdArgs.push_back("-emit-llvm");
5121d46033f760ba5fd266ce59fe391fac473f04f52Daniel Dunbar    } else if (JA.getType() == types::TY_LLVMBC) {
5131d46033f760ba5fd266ce59fe391fac473f04f52Daniel Dunbar      CmdArgs.push_back("-emit-llvm-bc");
5141d46033f760ba5fd266ce59fe391fac473f04f52Daniel Dunbar    } else if (JA.getType() == types::TY_PP_Asm) {
515e3b8d07e02861d245612b02b5f5a2c1f34b2a394Daniel Dunbar      CmdArgs.push_back("-S");
5165915fbf310e171c4cd3c2af05e9de360c0fa988aDaniel Dunbar    } else if (JA.getType() == types::TY_AST) {
5175915fbf310e171c4cd3c2af05e9de360c0fa988aDaniel Dunbar      CmdArgs.push_back("-emit-pch");
5181d46033f760ba5fd266ce59fe391fac473f04f52Daniel Dunbar    }
5191d46033f760ba5fd266ce59fe391fac473f04f52Daniel Dunbar  }
5201d46033f760ba5fd266ce59fe391fac473f04f52Daniel Dunbar
5211d46033f760ba5fd266ce59fe391fac473f04f52Daniel Dunbar  // The make clang go fast button.
5221d46033f760ba5fd266ce59fe391fac473f04f52Daniel Dunbar  CmdArgs.push_back("-disable-free");
5231d46033f760ba5fd266ce59fe391fac473f04f52Daniel Dunbar
524c9abc043af88f90d177a5bd147f627b78ca49fdeDaniel Dunbar  // Set the main file name, so that debug info works even with
525c9abc043af88f90d177a5bd147f627b78ca49fdeDaniel Dunbar  // -save-temps.
526c9abc043af88f90d177a5bd147f627b78ca49fdeDaniel Dunbar  CmdArgs.push_back("-main-file-name");
527c9abc043af88f90d177a5bd147f627b78ca49fdeDaniel Dunbar  CmdArgs.push_back(darwin::CC1::getBaseInputName(Args, Inputs));
528c9abc043af88f90d177a5bd147f627b78ca49fdeDaniel Dunbar
5293bbc75302fd43cf13d868b46c94ff8794b302e43Daniel Dunbar  // Some flags which affect the language (via preprocessor
5303bbc75302fd43cf13d868b46c94ff8794b302e43Daniel Dunbar  // defines). See darwin::CC1::AddCPPArgs.
5313bbc75302fd43cf13d868b46c94ff8794b302e43Daniel Dunbar  if (Args.hasArg(options::OPT_static))
5323bbc75302fd43cf13d868b46c94ff8794b302e43Daniel Dunbar    CmdArgs.push_back("-static-define");
5333bbc75302fd43cf13d868b46c94ff8794b302e43Daniel Dunbar
5341d46033f760ba5fd266ce59fe391fac473f04f52Daniel Dunbar  if (isa<AnalyzeJobAction>(JA)) {
5351d46033f760ba5fd266ce59fe391fac473f04f52Daniel Dunbar    // Add default argument set.
536d8fc0f2e7751cf31cec5c2f3cc6a0b447e9debb3Daniel Dunbar    if (!Args.hasArg(options::OPT__analyzer_no_default_checks)) {
537d8fc0f2e7751cf31cec5c2f3cc6a0b447e9debb3Daniel Dunbar      CmdArgs.push_back("-warn-dead-stores");
53811727519fbdaec68f526ae7c54a83d0a4601f561Ted Kremenek      CmdArgs.push_back("-warn-security-syntactic");
539d8fc0f2e7751cf31cec5c2f3cc6a0b447e9debb3Daniel Dunbar      CmdArgs.push_back("-checker-cfref");
540d8fc0f2e7751cf31cec5c2f3cc6a0b447e9debb3Daniel Dunbar      CmdArgs.push_back("-analyzer-eagerly-assume");
541d8fc0f2e7751cf31cec5c2f3cc6a0b447e9debb3Daniel Dunbar      CmdArgs.push_back("-warn-objc-methodsigs");
542d8fc0f2e7751cf31cec5c2f3cc6a0b447e9debb3Daniel Dunbar      // Do not enable the missing -dealloc check.
543d8fc0f2e7751cf31cec5c2f3cc6a0b447e9debb3Daniel Dunbar      // '-warn-objc-missing-dealloc',
544d8fc0f2e7751cf31cec5c2f3cc6a0b447e9debb3Daniel Dunbar      CmdArgs.push_back("-warn-objc-unused-ivars");
545d8fc0f2e7751cf31cec5c2f3cc6a0b447e9debb3Daniel Dunbar    }
546d8fc0f2e7751cf31cec5c2f3cc6a0b447e9debb3Daniel Dunbar
547d8fc0f2e7751cf31cec5c2f3cc6a0b447e9debb3Daniel Dunbar    // Set the output format. The default is plist, for (lame) historical
548d8fc0f2e7751cf31cec5c2f3cc6a0b447e9debb3Daniel Dunbar    // reasons.
549d8fc0f2e7751cf31cec5c2f3cc6a0b447e9debb3Daniel Dunbar    CmdArgs.push_back("-analyzer-output");
550d8fc0f2e7751cf31cec5c2f3cc6a0b447e9debb3Daniel Dunbar    if (Arg *A = Args.getLastArg(options::OPT__analyzer_output))
551d8fc0f2e7751cf31cec5c2f3cc6a0b447e9debb3Daniel Dunbar      CmdArgs.push_back(A->getValue(Args));
552d8fc0f2e7751cf31cec5c2f3cc6a0b447e9debb3Daniel Dunbar    else
553d8fc0f2e7751cf31cec5c2f3cc6a0b447e9debb3Daniel Dunbar      CmdArgs.push_back("plist");
5541d46033f760ba5fd266ce59fe391fac473f04f52Daniel Dunbar
5551d46033f760ba5fd266ce59fe391fac473f04f52Daniel Dunbar    // Add -Xanalyzer arguments when running as analyzer.
5561d46033f760ba5fd266ce59fe391fac473f04f52Daniel Dunbar    Args.AddAllArgValues(CmdArgs, options::OPT_Xanalyzer);
5571eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump  }
5581eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump
559e2fd66418eca3d70cf6b62087d745d0c5181db69Daniel Dunbar  CheckCodeGenerationOptions(D, Args);
560e2fd66418eca3d70cf6b62087d745d0c5181db69Daniel Dunbar
561bc85be85779a47bae728bbe6a2cd2e3732b1333dDaniel Dunbar  // Perform argument translation for LLVM backend. This
562bc85be85779a47bae728bbe6a2cd2e3732b1333dDaniel Dunbar  // takes some care in reconciling with llvm-gcc. The
563bc85be85779a47bae728bbe6a2cd2e3732b1333dDaniel Dunbar  // issue is that llvm-gcc translates these options based on
564bc85be85779a47bae728bbe6a2cd2e3732b1333dDaniel Dunbar  // the values in cc1, whereas we are processing based on
565bc85be85779a47bae728bbe6a2cd2e3732b1333dDaniel Dunbar  // the driver arguments.
566bc85be85779a47bae728bbe6a2cd2e3732b1333dDaniel Dunbar  //
567bc85be85779a47bae728bbe6a2cd2e3732b1333dDaniel Dunbar  // FIXME: This is currently broken for -f flags when -fno
568bc85be85779a47bae728bbe6a2cd2e3732b1333dDaniel Dunbar  // variants are present.
5699fd0b1f845a61e71dd8099f596532d34c519630aDaniel Dunbar
570bc85be85779a47bae728bbe6a2cd2e3732b1333dDaniel Dunbar  // This comes from the default translation the driver + cc1
571bc85be85779a47bae728bbe6a2cd2e3732b1333dDaniel Dunbar  // would do to enable flag_pic.
572bc85be85779a47bae728bbe6a2cd2e3732b1333dDaniel Dunbar  //
573bc85be85779a47bae728bbe6a2cd2e3732b1333dDaniel Dunbar  // FIXME: Centralize this code.
574bc85be85779a47bae728bbe6a2cd2e3732b1333dDaniel Dunbar  bool PICEnabled = (Args.hasArg(options::OPT_fPIC) ||
575bc85be85779a47bae728bbe6a2cd2e3732b1333dDaniel Dunbar                     Args.hasArg(options::OPT_fpic) ||
576bc85be85779a47bae728bbe6a2cd2e3732b1333dDaniel Dunbar                     Args.hasArg(options::OPT_fPIE) ||
577bc85be85779a47bae728bbe6a2cd2e3732b1333dDaniel Dunbar                     Args.hasArg(options::OPT_fpie));
578bc85be85779a47bae728bbe6a2cd2e3732b1333dDaniel Dunbar  bool PICDisabled = (Args.hasArg(options::OPT_mkernel) ||
579bc85be85779a47bae728bbe6a2cd2e3732b1333dDaniel Dunbar                      Args.hasArg(options::OPT_static));
580bc85be85779a47bae728bbe6a2cd2e3732b1333dDaniel Dunbar  const char *Model = getToolChain().GetForcedPicModel();
581bc85be85779a47bae728bbe6a2cd2e3732b1333dDaniel Dunbar  if (!Model) {
582bc85be85779a47bae728bbe6a2cd2e3732b1333dDaniel Dunbar    if (Args.hasArg(options::OPT_mdynamic_no_pic))
583bc85be85779a47bae728bbe6a2cd2e3732b1333dDaniel Dunbar      Model = "dynamic-no-pic";
584bc85be85779a47bae728bbe6a2cd2e3732b1333dDaniel Dunbar    else if (PICDisabled)
585bc85be85779a47bae728bbe6a2cd2e3732b1333dDaniel Dunbar      Model = "static";
586bc85be85779a47bae728bbe6a2cd2e3732b1333dDaniel Dunbar    else if (PICEnabled)
587bc85be85779a47bae728bbe6a2cd2e3732b1333dDaniel Dunbar      Model = "pic";
5881d46033f760ba5fd266ce59fe391fac473f04f52Daniel Dunbar    else
589bc85be85779a47bae728bbe6a2cd2e3732b1333dDaniel Dunbar      Model = getToolChain().GetDefaultRelocationModel();
590bc85be85779a47bae728bbe6a2cd2e3732b1333dDaniel Dunbar  }
591bc85be85779a47bae728bbe6a2cd2e3732b1333dDaniel Dunbar  CmdArgs.push_back("--relocation-model");
592bc85be85779a47bae728bbe6a2cd2e3732b1333dDaniel Dunbar  CmdArgs.push_back(Model);
5931d46033f760ba5fd266ce59fe391fac473f04f52Daniel Dunbar
594bc85be85779a47bae728bbe6a2cd2e3732b1333dDaniel Dunbar  // Infer the __PIC__ value.
595bc85be85779a47bae728bbe6a2cd2e3732b1333dDaniel Dunbar  //
596bc85be85779a47bae728bbe6a2cd2e3732b1333dDaniel Dunbar  // FIXME:  This isn't quite right on Darwin, which always sets
597bc85be85779a47bae728bbe6a2cd2e3732b1333dDaniel Dunbar  // __PIC__=2.
598bc85be85779a47bae728bbe6a2cd2e3732b1333dDaniel Dunbar  if (strcmp(Model, "pic") == 0 || strcmp(Model, "dynamic-no-pic") == 0) {
599bc85be85779a47bae728bbe6a2cd2e3732b1333dDaniel Dunbar    if (Args.hasArg(options::OPT_fPIC))
600bc85be85779a47bae728bbe6a2cd2e3732b1333dDaniel Dunbar      CmdArgs.push_back("-pic-level=2");
6011d46033f760ba5fd266ce59fe391fac473f04f52Daniel Dunbar    else
602bc85be85779a47bae728bbe6a2cd2e3732b1333dDaniel Dunbar      CmdArgs.push_back("-pic-level=1");
603bc85be85779a47bae728bbe6a2cd2e3732b1333dDaniel Dunbar  }
6041d46033f760ba5fd266ce59fe391fac473f04f52Daniel Dunbar
605bc85be85779a47bae728bbe6a2cd2e3732b1333dDaniel Dunbar  if (Args.hasArg(options::OPT_ftime_report))
606bc85be85779a47bae728bbe6a2cd2e3732b1333dDaniel Dunbar    CmdArgs.push_back("--time-passes");
607bc85be85779a47bae728bbe6a2cd2e3732b1333dDaniel Dunbar  // FIXME: Set --enable-unsafe-fp-math.
60821656ddae8e81df04f142386337cb95a9e0f0971Benjamin Kramer  if (Args.hasFlag(options::OPT_fno_omit_frame_pointer,
60921656ddae8e81df04f142386337cb95a9e0f0971Benjamin Kramer                   options::OPT_fomit_frame_pointer))
610bc85be85779a47bae728bbe6a2cd2e3732b1333dDaniel Dunbar    CmdArgs.push_back("--disable-fp-elim");
611bc85be85779a47bae728bbe6a2cd2e3732b1333dDaniel Dunbar  if (!Args.hasFlag(options::OPT_fzero_initialized_in_bss,
612bc85be85779a47bae728bbe6a2cd2e3732b1333dDaniel Dunbar                    options::OPT_fno_zero_initialized_in_bss,
613bc85be85779a47bae728bbe6a2cd2e3732b1333dDaniel Dunbar                    true))
614bc85be85779a47bae728bbe6a2cd2e3732b1333dDaniel Dunbar    CmdArgs.push_back("--nozero-initialized-in-bss");
615bc85be85779a47bae728bbe6a2cd2e3732b1333dDaniel Dunbar  if (Args.hasArg(options::OPT_dA) || Args.hasArg(options::OPT_fverbose_asm))
616bc85be85779a47bae728bbe6a2cd2e3732b1333dDaniel Dunbar    CmdArgs.push_back("--asm-verbose");
617bc85be85779a47bae728bbe6a2cd2e3732b1333dDaniel Dunbar  if (Args.hasArg(options::OPT_fdebug_pass_structure))
618bc85be85779a47bae728bbe6a2cd2e3732b1333dDaniel Dunbar    CmdArgs.push_back("--debug-pass=Structure");
619bc85be85779a47bae728bbe6a2cd2e3732b1333dDaniel Dunbar  if (Args.hasArg(options::OPT_fdebug_pass_arguments))
620bc85be85779a47bae728bbe6a2cd2e3732b1333dDaniel Dunbar    CmdArgs.push_back("--debug-pass=Arguments");
621bc85be85779a47bae728bbe6a2cd2e3732b1333dDaniel Dunbar  // FIXME: set --inline-threshhold=50 if (optimize_size || optimize
622bc85be85779a47bae728bbe6a2cd2e3732b1333dDaniel Dunbar  // < 3)
6236bea73b3305a03479589e2642fbdcf6c096851aaDaniel Dunbar
6246bea73b3305a03479589e2642fbdcf6c096851aaDaniel Dunbar  // This is a coarse approximation of what llvm-gcc actually does, both
6256bea73b3305a03479589e2642fbdcf6c096851aaDaniel Dunbar  // -fasynchronous-unwind-tables and -fnon-call-exceptions interact in more
6266bea73b3305a03479589e2642fbdcf6c096851aaDaniel Dunbar  // complicated ways.
6276bea73b3305a03479589e2642fbdcf6c096851aaDaniel Dunbar  bool AsynchronousUnwindTables =
6286bea73b3305a03479589e2642fbdcf6c096851aaDaniel Dunbar    Args.hasFlag(options::OPT_fasynchronous_unwind_tables,
6296bea73b3305a03479589e2642fbdcf6c096851aaDaniel Dunbar                 options::OPT_fno_asynchronous_unwind_tables,
6306bea73b3305a03479589e2642fbdcf6c096851aaDaniel Dunbar                 getToolChain().IsUnwindTablesDefault() &&
6316bea73b3305a03479589e2642fbdcf6c096851aaDaniel Dunbar                 !Args.hasArg(options::OPT_mkernel));
6326bea73b3305a03479589e2642fbdcf6c096851aaDaniel Dunbar  if (Args.hasFlag(options::OPT_funwind_tables, options::OPT_fno_unwind_tables,
6336bea73b3305a03479589e2642fbdcf6c096851aaDaniel Dunbar                   AsynchronousUnwindTables))
634bc85be85779a47bae728bbe6a2cd2e3732b1333dDaniel Dunbar    CmdArgs.push_back("--unwind-tables=1");
635bc85be85779a47bae728bbe6a2cd2e3732b1333dDaniel Dunbar  else
636bc85be85779a47bae728bbe6a2cd2e3732b1333dDaniel Dunbar    CmdArgs.push_back("--unwind-tables=0");
637bc85be85779a47bae728bbe6a2cd2e3732b1333dDaniel Dunbar
638868bd0aa9281929ef50d2e9a8c82a036906f53f5Daniel Dunbar  // FIXME: Handle -mtune=.
639868bd0aa9281929ef50d2e9a8c82a036906f53f5Daniel Dunbar  (void) Args.hasArg(options::OPT_mtune_EQ);
640bc85be85779a47bae728bbe6a2cd2e3732b1333dDaniel Dunbar
6418e9ef0d87dad25f02e5abc6facf528778236115aBenjamin Kramer  if (Arg *A = Args.getLastArg(options::OPT_mcmodel_EQ)) {
6428e9ef0d87dad25f02e5abc6facf528778236115aBenjamin Kramer    CmdArgs.push_back("-code-model");
6438e9ef0d87dad25f02e5abc6facf528778236115aBenjamin Kramer    CmdArgs.push_back(A->getValue(Args));
6448e9ef0d87dad25f02e5abc6facf528778236115aBenjamin Kramer  }
6458e9ef0d87dad25f02e5abc6facf528778236115aBenjamin Kramer
6466acda16e9c194dcbd0dea64341e182bdb65d0f41Daniel Dunbar  // Add target specific cpu and features flags.
6476acda16e9c194dcbd0dea64341e182bdb65d0f41Daniel Dunbar  switch(getToolChain().getTriple().getArch()) {
6486acda16e9c194dcbd0dea64341e182bdb65d0f41Daniel Dunbar  default:
6496acda16e9c194dcbd0dea64341e182bdb65d0f41Daniel Dunbar    break;
650868bd0aa9281929ef50d2e9a8c82a036906f53f5Daniel Dunbar
651b163ef7e7a5d904ef0962a7c38c460be083c4d63Daniel Dunbar  case llvm::Triple::arm:
652b163ef7e7a5d904ef0962a7c38c460be083c4d63Daniel Dunbar  case llvm::Triple::thumb:
653b163ef7e7a5d904ef0962a7c38c460be083c4d63Daniel Dunbar    AddARMTargetArgs(Args, CmdArgs);
654b163ef7e7a5d904ef0962a7c38c460be083c4d63Daniel Dunbar    break;
655b163ef7e7a5d904ef0962a7c38c460be083c4d63Daniel Dunbar
6566acda16e9c194dcbd0dea64341e182bdb65d0f41Daniel Dunbar  case llvm::Triple::x86:
6576acda16e9c194dcbd0dea64341e182bdb65d0f41Daniel Dunbar  case llvm::Triple::x86_64:
6586acda16e9c194dcbd0dea64341e182bdb65d0f41Daniel Dunbar    AddX86TargetArgs(Args, CmdArgs);
6596acda16e9c194dcbd0dea64341e182bdb65d0f41Daniel Dunbar    break;
660bc85be85779a47bae728bbe6a2cd2e3732b1333dDaniel Dunbar  }
661c21c485b4fb58ef5d55cf3e523263dd824a2ace4Daniel Dunbar
662bc85be85779a47bae728bbe6a2cd2e3732b1333dDaniel Dunbar  if (Args.hasFlag(options::OPT_fmath_errno,
663bc85be85779a47bae728bbe6a2cd2e3732b1333dDaniel Dunbar                   options::OPT_fno_math_errno,
664bc85be85779a47bae728bbe6a2cd2e3732b1333dDaniel Dunbar                   getToolChain().IsMathErrnoDefault()))
665bc85be85779a47bae728bbe6a2cd2e3732b1333dDaniel Dunbar    CmdArgs.push_back("--fmath-errno=1");
666bc85be85779a47bae728bbe6a2cd2e3732b1333dDaniel Dunbar  else
667bc85be85779a47bae728bbe6a2cd2e3732b1333dDaniel Dunbar    CmdArgs.push_back("--fmath-errno=0");
6681d46033f760ba5fd266ce59fe391fac473f04f52Daniel Dunbar
669bc85be85779a47bae728bbe6a2cd2e3732b1333dDaniel Dunbar  if (Arg *A = Args.getLastArg(options::OPT_flimited_precision_EQ)) {
670bc85be85779a47bae728bbe6a2cd2e3732b1333dDaniel Dunbar    CmdArgs.push_back("--limit-float-precision");
671bc85be85779a47bae728bbe6a2cd2e3732b1333dDaniel Dunbar    CmdArgs.push_back(A->getValue(Args));
6721d46033f760ba5fd266ce59fe391fac473f04f52Daniel Dunbar  }
6731d46033f760ba5fd266ce59fe391fac473f04f52Daniel Dunbar
674bc85be85779a47bae728bbe6a2cd2e3732b1333dDaniel Dunbar  // FIXME: Add --stack-protector-buffer-size=<xxx> on
675bc85be85779a47bae728bbe6a2cd2e3732b1333dDaniel Dunbar  // -fstack-protect.
676bc85be85779a47bae728bbe6a2cd2e3732b1333dDaniel Dunbar
677bc85be85779a47bae728bbe6a2cd2e3732b1333dDaniel Dunbar  Arg *Unsupported;
678bc85be85779a47bae728bbe6a2cd2e3732b1333dDaniel Dunbar  if ((Unsupported = Args.getLastArg(options::OPT_MG)) ||
67995a0da7b263777e6f97e5a08b6eb893681a234baDaniel Dunbar      (Unsupported = Args.getLastArg(options::OPT_MQ)) ||
68095a0da7b263777e6f97e5a08b6eb893681a234baDaniel Dunbar      (Unsupported = Args.getLastArg(options::OPT_iframework)))
681e027a4b2399e9b0acfe0f77220c66bbe369067eeDaniel Dunbar    D.Diag(clang::diag::err_drv_clang_unsupported)
682bc85be85779a47bae728bbe6a2cd2e3732b1333dDaniel Dunbar      << Unsupported->getOption().getName();
683bc85be85779a47bae728bbe6a2cd2e3732b1333dDaniel Dunbar
6841d46033f760ba5fd266ce59fe391fac473f04f52Daniel Dunbar  Args.AddAllArgs(CmdArgs, options::OPT_v);
6851d46033f760ba5fd266ce59fe391fac473f04f52Daniel Dunbar  Args.AddLastArg(CmdArgs, options::OPT_P);
6862ac9fc2ad64e16127df8c60caeea2edfe9a400a2Daniel Dunbar  Args.AddLastArg(CmdArgs, options::OPT_mmacosx_version_min_EQ);
687ff8857a9e6f533765f63b2934902645baa7ddd09Daniel Dunbar  Args.AddLastArg(CmdArgs, options::OPT_miphoneos_version_min_EQ);
6881eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump  Args.AddLastArg(CmdArgs, options::OPT_print_ivar_layout);
6891d46033f760ba5fd266ce59fe391fac473f04f52Daniel Dunbar
6901d46033f760ba5fd266ce59fe391fac473f04f52Daniel Dunbar  // Special case debug options to only pass -g to clang. This is
6911d46033f760ba5fd266ce59fe391fac473f04f52Daniel Dunbar  // wrong.
6921d46033f760ba5fd266ce59fe391fac473f04f52Daniel Dunbar  if (Args.hasArg(options::OPT_g_Group))
6931d46033f760ba5fd266ce59fe391fac473f04f52Daniel Dunbar    CmdArgs.push_back("-g");
6941d46033f760ba5fd266ce59fe391fac473f04f52Daniel Dunbar
6951d46033f760ba5fd266ce59fe391fac473f04f52Daniel Dunbar  Args.AddLastArg(CmdArgs, options::OPT_nostdinc);
6961d46033f760ba5fd266ce59fe391fac473f04f52Daniel Dunbar
6972ac9fc2ad64e16127df8c60caeea2edfe9a400a2Daniel Dunbar  Args.AddLastArg(CmdArgs, options::OPT_isysroot);
6982ac9fc2ad64e16127df8c60caeea2edfe9a400a2Daniel Dunbar
699c21c485b4fb58ef5d55cf3e523263dd824a2ace4Daniel Dunbar  // Add preprocessing options like -I, -D, etc. if we are using the
700c21c485b4fb58ef5d55cf3e523263dd824a2ace4Daniel Dunbar  // preprocessor.
701c21c485b4fb58ef5d55cf3e523263dd824a2ace4Daniel Dunbar  //
702c21c485b4fb58ef5d55cf3e523263dd824a2ace4Daniel Dunbar  // FIXME: Support -fpreprocessed
703c21c485b4fb58ef5d55cf3e523263dd824a2ace4Daniel Dunbar  types::ID InputType = Inputs[0].getType();
704c21c485b4fb58ef5d55cf3e523263dd824a2ace4Daniel Dunbar  if (types::getPreprocessedType(InputType) != types::TY_INVALID)
705df91ef3d6c55692a0236f67b6c6b134a3bf84098Douglas Gregor    AddPreprocessingOptions(D, Args, CmdArgs, Output, Inputs);
7061d46033f760ba5fd266ce59fe391fac473f04f52Daniel Dunbar
70720f0eacf1682e4594da9d318b5b13ed4f6d6e7e5Daniel Dunbar  // Manually translate -O to -O2 and -O4 to -O3; let clang reject
708337a6271b98c4c183f7eaad1563a75260b4f2871Daniel Dunbar  // others.
709337a6271b98c4c183f7eaad1563a75260b4f2871Daniel Dunbar  if (Arg *A = Args.getLastArg(options::OPT_O_Group)) {
710c21c485b4fb58ef5d55cf3e523263dd824a2ace4Daniel Dunbar    if (A->getOption().getId() == options::OPT_O4)
711337a6271b98c4c183f7eaad1563a75260b4f2871Daniel Dunbar      CmdArgs.push_back("-O3");
712337a6271b98c4c183f7eaad1563a75260b4f2871Daniel Dunbar    else if (A->getValue(Args)[0] == '\0')
71320f0eacf1682e4594da9d318b5b13ed4f6d6e7e5Daniel Dunbar      CmdArgs.push_back("-O2");
7141d46033f760ba5fd266ce59fe391fac473f04f52Daniel Dunbar    else
7155697aa0d75c87bafec78984048d558f8d12ca1b3Daniel Dunbar      A->render(Args, CmdArgs);
7161d46033f760ba5fd266ce59fe391fac473f04f52Daniel Dunbar  }
7171d46033f760ba5fd266ce59fe391fac473f04f52Daniel Dunbar
71806ef3c3e9be4923b8e29c8e267b0c56afaa14ff3Daniel Dunbar  Args.AddAllArgs(CmdArgs, options::OPT_W_Group, options::OPT_pedantic_Group);
7191d46033f760ba5fd266ce59fe391fac473f04f52Daniel Dunbar  Args.AddLastArg(CmdArgs, options::OPT_w);
720d573d26e1abcce24c31ece3d6f7af158db569e4cDaniel Dunbar
721d573d26e1abcce24c31ece3d6f7af158db569e4cDaniel Dunbar  // Handle -{std, ansi, trigraphs} -- take the last of -{std, ansi}
722d573d26e1abcce24c31ece3d6f7af158db569e4cDaniel Dunbar  // (-ansi is equivalent to -std=c89).
723d573d26e1abcce24c31ece3d6f7af158db569e4cDaniel Dunbar  //
724d573d26e1abcce24c31ece3d6f7af158db569e4cDaniel Dunbar  // If a std is supplied, only add -trigraphs if it follows the
725d573d26e1abcce24c31ece3d6f7af158db569e4cDaniel Dunbar  // option.
726d573d26e1abcce24c31ece3d6f7af158db569e4cDaniel Dunbar  if (Arg *Std = Args.getLastArg(options::OPT_std_EQ, options::OPT_ansi)) {
727d573d26e1abcce24c31ece3d6f7af158db569e4cDaniel Dunbar    if (Std->getOption().matches(options::OPT_ansi))
728d573d26e1abcce24c31ece3d6f7af158db569e4cDaniel Dunbar      CmdArgs.push_back("-std=c89");
729d573d26e1abcce24c31ece3d6f7af158db569e4cDaniel Dunbar    else
730d573d26e1abcce24c31ece3d6f7af158db569e4cDaniel Dunbar      Std->render(Args, CmdArgs);
731d573d26e1abcce24c31ece3d6f7af158db569e4cDaniel Dunbar
732d573d26e1abcce24c31ece3d6f7af158db569e4cDaniel Dunbar    if (Arg *A = Args.getLastArg(options::OPT_trigraphs))
733d573d26e1abcce24c31ece3d6f7af158db569e4cDaniel Dunbar      if (A->getIndex() > Std->getIndex())
734d573d26e1abcce24c31ece3d6f7af158db569e4cDaniel Dunbar        A->render(Args, CmdArgs);
735a3ff202ee4fb21728e930d5d029ba4925129912cDaniel Dunbar  } else {
736a3ff202ee4fb21728e930d5d029ba4925129912cDaniel Dunbar    // Honor -std-default.
737a3ff202ee4fb21728e930d5d029ba4925129912cDaniel Dunbar    Args.AddAllArgsTranslated(CmdArgs, options::OPT_std_default_EQ,
738a3ff202ee4fb21728e930d5d029ba4925129912cDaniel Dunbar                              "-std=", /*Joined=*/true);
739d573d26e1abcce24c31ece3d6f7af158db569e4cDaniel Dunbar    Args.AddLastArg(CmdArgs, options::OPT_trigraphs);
740a3ff202ee4fb21728e930d5d029ba4925129912cDaniel Dunbar  }
741c21c485b4fb58ef5d55cf3e523263dd824a2ace4Daniel Dunbar
7421d46033f760ba5fd266ce59fe391fac473f04f52Daniel Dunbar  if (Arg *A = Args.getLastArg(options::OPT_ftemplate_depth_)) {
7431d46033f760ba5fd266ce59fe391fac473f04f52Daniel Dunbar    CmdArgs.push_back("-ftemplate-depth");
7441d46033f760ba5fd266ce59fe391fac473f04f52Daniel Dunbar    CmdArgs.push_back(A->getValue(Args));
745b488c1dac8e53206f07103d794a62a3f5012c0f4Daniel Dunbar  }
746b488c1dac8e53206f07103d794a62a3f5012c0f4Daniel Dunbar
747e650c8c3bca2f58cad8ffa8aab63126d26e890cdDouglas Gregor  if (Args.hasArg(options::OPT__relocatable_pch, true))
748e650c8c3bca2f58cad8ffa8aab63126d26e890cdDouglas Gregor    CmdArgs.push_back("--relocatable-pch");
7491eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump
7508a5a9aaddb627c0884c2ed8db55cc29fdb601195David Chisnall   if (Arg *A = Args.getLastArg(options::OPT_fconstant_string_class_EQ)) {
7518a5a9aaddb627c0884c2ed8db55cc29fdb601195David Chisnall     CmdArgs.push_back("-fconstant-string-class");
7528a5a9aaddb627c0884c2ed8db55cc29fdb601195David Chisnall     CmdArgs.push_back(A->getValue(Args));
7538a5a9aaddb627c0884c2ed8db55cc29fdb601195David Chisnall   }
7548a5a9aaddb627c0884c2ed8db55cc29fdb601195David Chisnall
75548d1ef782c8c88066b5febf60f8f456064d7d3f0Daniel Dunbar  // Forward -f options which we can pass directly.
7563aaf082689d3235937a2e56a60f90fc1b3aebfb2Daniel Dunbar  Args.AddLastArg(CmdArgs, options::OPT_femit_all_decls);
7573aaf082689d3235937a2e56a60f90fc1b3aebfb2Daniel Dunbar  Args.AddLastArg(CmdArgs, options::OPT_ffreestanding);
7583aaf082689d3235937a2e56a60f90fc1b3aebfb2Daniel Dunbar  Args.AddLastArg(CmdArgs, options::OPT_fheinous_gnu_extensions);
7593aaf082689d3235937a2e56a60f90fc1b3aebfb2Daniel Dunbar  Args.AddLastArg(CmdArgs, options::OPT_fgnu_runtime);
7603aaf082689d3235937a2e56a60f90fc1b3aebfb2Daniel Dunbar  Args.AddLastArg(CmdArgs, options::OPT_flax_vector_conversions);
761fffd93f38340d4d2ca7ee78a8c91c890b2ff3fa0Douglas Gregor  Args.AddLastArg(CmdArgs, options::OPT_fmessage_length_EQ);
7623aaf082689d3235937a2e56a60f90fc1b3aebfb2Daniel Dunbar  Args.AddLastArg(CmdArgs, options::OPT_fms_extensions);
7633aaf082689d3235937a2e56a60f90fc1b3aebfb2Daniel Dunbar  Args.AddLastArg(CmdArgs, options::OPT_fnext_runtime);
7643aaf082689d3235937a2e56a60f90fc1b3aebfb2Daniel Dunbar  Args.AddLastArg(CmdArgs, options::OPT_fno_caret_diagnostics);
7653aaf082689d3235937a2e56a60f90fc1b3aebfb2Daniel Dunbar  Args.AddLastArg(CmdArgs, options::OPT_fno_show_column);
7663aaf082689d3235937a2e56a60f90fc1b3aebfb2Daniel Dunbar  Args.AddLastArg(CmdArgs, options::OPT_fobjc_gc_only);
7673aaf082689d3235937a2e56a60f90fc1b3aebfb2Daniel Dunbar  Args.AddLastArg(CmdArgs, options::OPT_fobjc_gc);
76834e65770ad6142b033d6cec4f476ed20fb248bf3Fariborz Jahanian  Args.AddLastArg(CmdArgs, options::OPT_fobjc_sender_dependent_dispatch);
7693aaf082689d3235937a2e56a60f90fc1b3aebfb2Daniel Dunbar  // FIXME: Should we remove this?
7703aaf082689d3235937a2e56a60f90fc1b3aebfb2Daniel Dunbar  Args.AddLastArg(CmdArgs, options::OPT_fobjc_nonfragile_abi);
771d6884a0b90091a063478ec7fa31f6d76c94e4917Daniel Dunbar  Args.AddLastArg(CmdArgs, options::OPT_fobjc_tight_layout);
772182e09240a33c6f1d303deecabec6e0e9c9d109dChris Lattner  Args.AddLastArg(CmdArgs, options::OPT_fdiagnostics_print_source_range_info);
7733aaf082689d3235937a2e56a60f90fc1b3aebfb2Daniel Dunbar  Args.AddLastArg(CmdArgs, options::OPT_ftime_report);
7743aaf082689d3235937a2e56a60f90fc1b3aebfb2Daniel Dunbar  Args.AddLastArg(CmdArgs, options::OPT_ftrapv);
7753aaf082689d3235937a2e56a60f90fc1b3aebfb2Daniel Dunbar  Args.AddLastArg(CmdArgs, options::OPT_fvisibility_EQ);
7763aaf082689d3235937a2e56a60f90fc1b3aebfb2Daniel Dunbar  Args.AddLastArg(CmdArgs, options::OPT_fwritable_strings);
7771d46033f760ba5fd266ce59fe391fac473f04f52Daniel Dunbar
7785345c391c65d1780a0d7b0102b7f735cc3f82732Daniel Dunbar  Args.AddLastArg(CmdArgs, options::OPT_pthread);
7795345c391c65d1780a0d7b0102b7f735cc3f82732Daniel Dunbar
78045483f7a1b3e57b4603b141bee80596b2d4dd443Bill Wendling  // Forward stack protector flags.
78145483f7a1b3e57b4603b141bee80596b2d4dd443Bill Wendling  if (Arg *A = Args.getLastArg(options::OPT_fno_stack_protector,
78245483f7a1b3e57b4603b141bee80596b2d4dd443Bill Wendling                               options::OPT_fstack_protector_all,
78345483f7a1b3e57b4603b141bee80596b2d4dd443Bill Wendling                               options::OPT_fstack_protector)) {
78445483f7a1b3e57b4603b141bee80596b2d4dd443Bill Wendling    if (A->getOption().matches(options::OPT_fno_stack_protector))
78545483f7a1b3e57b4603b141bee80596b2d4dd443Bill Wendling      CmdArgs.push_back("--stack-protector=0");
78645483f7a1b3e57b4603b141bee80596b2d4dd443Bill Wendling    else if (A->getOption().matches(options::OPT_fstack_protector))
78745483f7a1b3e57b4603b141bee80596b2d4dd443Bill Wendling      CmdArgs.push_back("--stack-protector=1");
78845483f7a1b3e57b4603b141bee80596b2d4dd443Bill Wendling    else
78945483f7a1b3e57b4603b141bee80596b2d4dd443Bill Wendling      CmdArgs.push_back("--stack-protector=2");
79045483f7a1b3e57b4603b141bee80596b2d4dd443Bill Wendling  }
79145483f7a1b3e57b4603b141bee80596b2d4dd443Bill Wendling
79248d1ef782c8c88066b5febf60f8f456064d7d3f0Daniel Dunbar  // Forward -f options with positive and negative forms; we translate
79348d1ef782c8c88066b5febf60f8f456064d7d3f0Daniel Dunbar  // these by hand.
79448d1ef782c8c88066b5febf60f8f456064d7d3f0Daniel Dunbar
79548d1ef782c8c88066b5febf60f8f456064d7d3f0Daniel Dunbar  // -fbuiltin is default, only pass non-default.
79648d1ef782c8c88066b5febf60f8f456064d7d3f0Daniel Dunbar  if (!Args.hasFlag(options::OPT_fbuiltin, options::OPT_fno_builtin))
79748d1ef782c8c88066b5febf60f8f456064d7d3f0Daniel Dunbar    CmdArgs.push_back("-fbuiltin=0");
79848d1ef782c8c88066b5febf60f8f456064d7d3f0Daniel Dunbar
7997695fba30221613b7cf31276456217c41bb90960Daniel Dunbar  // -fblocks default varies depending on platform and language; only
8007695fba30221613b7cf31276456217c41bb90960Daniel Dunbar  // pass if specified.
80148d1ef782c8c88066b5febf60f8f456064d7d3f0Daniel Dunbar  if (Arg *A = Args.getLastArg(options::OPT_fblocks, options::OPT_fno_blocks)) {
80248d1ef782c8c88066b5febf60f8f456064d7d3f0Daniel Dunbar    if (A->getOption().matches(options::OPT_fblocks))
80348d1ef782c8c88066b5febf60f8f456064d7d3f0Daniel Dunbar      CmdArgs.push_back("-fblocks");
80448d1ef782c8c88066b5febf60f8f456064d7d3f0Daniel Dunbar    else
80548d1ef782c8c88066b5febf60f8f456064d7d3f0Daniel Dunbar      CmdArgs.push_back("-fblocks=0");
80648d1ef782c8c88066b5febf60f8f456064d7d3f0Daniel Dunbar  }
80748d1ef782c8c88066b5febf60f8f456064d7d3f0Daniel Dunbar
808738f8c278da5950d0d4607de2debe0bdfad64185Mike Stump  // -fexceptions default varies depending on platform and language; only
809738f8c278da5950d0d4607de2debe0bdfad64185Mike Stump  // pass if specified.
810738f8c278da5950d0d4607de2debe0bdfad64185Mike Stump if (Arg *A = Args.getLastArg(options::OPT_fexceptions,
811738f8c278da5950d0d4607de2debe0bdfad64185Mike Stump                               options::OPT_fno_exceptions)) {
812738f8c278da5950d0d4607de2debe0bdfad64185Mike Stump    if (A->getOption().matches(options::OPT_fexceptions))
813738f8c278da5950d0d4607de2debe0bdfad64185Mike Stump      CmdArgs.push_back("-fexceptions");
814738f8c278da5950d0d4607de2debe0bdfad64185Mike Stump    else
815738f8c278da5950d0d4607de2debe0bdfad64185Mike Stump      CmdArgs.push_back("-fexceptions=0");
816738f8c278da5950d0d4607de2debe0bdfad64185Mike Stump  }
817738f8c278da5950d0d4607de2debe0bdfad64185Mike Stump
818738f8c278da5950d0d4607de2debe0bdfad64185Mike Stump  // -frtti is default, only pass non-default.
819738f8c278da5950d0d4607de2debe0bdfad64185Mike Stump  if (!Args.hasFlag(options::OPT_frtti, options::OPT_fno_rtti))
820738f8c278da5950d0d4607de2debe0bdfad64185Mike Stump    CmdArgs.push_back("-frtti=0");
821738f8c278da5950d0d4607de2debe0bdfad64185Mike Stump
8225a77973d9bc2c9cdbdb7860dcf3ac795abe258ecEli Friedman  // -fsigned-char/-funsigned-char default varies depending on platform; only
8235a77973d9bc2c9cdbdb7860dcf3ac795abe258ecEli Friedman  // pass if specified.
8245a77973d9bc2c9cdbdb7860dcf3ac795abe258ecEli Friedman  if (Arg *A = Args.getLastArg(options::OPT_fsigned_char,
8255a77973d9bc2c9cdbdb7860dcf3ac795abe258ecEli Friedman                               options::OPT_funsigned_char)) {
8265a77973d9bc2c9cdbdb7860dcf3ac795abe258ecEli Friedman    if (A->getOption().matches(options::OPT_fsigned_char))
8275a77973d9bc2c9cdbdb7860dcf3ac795abe258ecEli Friedman      CmdArgs.push_back("-fsigned-char");
8285a77973d9bc2c9cdbdb7860dcf3ac795abe258ecEli Friedman    else
8295a77973d9bc2c9cdbdb7860dcf3ac795abe258ecEli Friedman      CmdArgs.push_back("-fsigned-char=0");
8305a77973d9bc2c9cdbdb7860dcf3ac795abe258ecEli Friedman  }
8315a77973d9bc2c9cdbdb7860dcf3ac795abe258ecEli Friedman
83282d00688525c876bf47bce414dedae9c343e67f5Daniel Dunbar  // -fno-pascal-strings is default, only pass non-default. If the
83382d00688525c876bf47bce414dedae9c343e67f5Daniel Dunbar  // -tool chain happened to translate to -mpascal-strings, we want to
83482d00688525c876bf47bce414dedae9c343e67f5Daniel Dunbar  // -back translate here.
83582d00688525c876bf47bce414dedae9c343e67f5Daniel Dunbar  //
83682d00688525c876bf47bce414dedae9c343e67f5Daniel Dunbar  // FIXME: This is gross; that translation should be pulled from the
83782d00688525c876bf47bce414dedae9c343e67f5Daniel Dunbar  // tool chain.
838c21c485b4fb58ef5d55cf3e523263dd824a2ace4Daniel Dunbar  if (Args.hasFlag(options::OPT_fpascal_strings,
83982d00688525c876bf47bce414dedae9c343e67f5Daniel Dunbar                   options::OPT_fno_pascal_strings,
84082d00688525c876bf47bce414dedae9c343e67f5Daniel Dunbar                   false) ||
84182d00688525c876bf47bce414dedae9c343e67f5Daniel Dunbar      Args.hasFlag(options::OPT_mpascal_strings,
84282d00688525c876bf47bce414dedae9c343e67f5Daniel Dunbar                   options::OPT_mno_pascal_strings,
84382d00688525c876bf47bce414dedae9c343e67f5Daniel Dunbar                   false))
84448d1ef782c8c88066b5febf60f8f456064d7d3f0Daniel Dunbar    CmdArgs.push_back("-fpascal-strings");
84548d1ef782c8c88066b5febf60f8f456064d7d3f0Daniel Dunbar
84648d1ef782c8c88066b5febf60f8f456064d7d3f0Daniel Dunbar  // -fcommon is default, only pass non-default.
84748d1ef782c8c88066b5febf60f8f456064d7d3f0Daniel Dunbar  if (!Args.hasFlag(options::OPT_fcommon, options::OPT_fno_common))
84848d1ef782c8c88066b5febf60f8f456064d7d3f0Daniel Dunbar    CmdArgs.push_back("-fno-common");
84948d1ef782c8c88066b5febf60f8f456064d7d3f0Daniel Dunbar
85070d3c92820f590b10553da9c96eda24e4325ba34Daniel Dunbar  // -fsigned-bitfields is default, and clang doesn't yet support
85170d3c92820f590b10553da9c96eda24e4325ba34Daniel Dunbar  // --funsigned-bitfields.
8521eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump  if (!Args.hasFlag(options::OPT_fsigned_bitfields,
85370d3c92820f590b10553da9c96eda24e4325ba34Daniel Dunbar                    options::OPT_funsigned_bitfields))
85470d3c92820f590b10553da9c96eda24e4325ba34Daniel Dunbar    D.Diag(clang::diag::warn_drv_clang_unsupported)
85570d3c92820f590b10553da9c96eda24e4325ba34Daniel Dunbar      << Args.getLastArg(options::OPT_funsigned_bitfields)->getAsString(Args);
85670d3c92820f590b10553da9c96eda24e4325ba34Daniel Dunbar
85749138fc59eeac2aacd3b7e04c2642180d5baefd7Daniel Dunbar  // -fdiagnostics-fixit-info is default, only pass non-default.
8581eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump  if (!Args.hasFlag(options::OPT_fdiagnostics_fixit_info,
85949138fc59eeac2aacd3b7e04c2642180d5baefd7Daniel Dunbar                    options::OPT_fno_diagnostics_fixit_info))
86049138fc59eeac2aacd3b7e04c2642180d5baefd7Daniel Dunbar    CmdArgs.push_back("-fno-diagnostics-fixit-info");
86149138fc59eeac2aacd3b7e04c2642180d5baefd7Daniel Dunbar
8629e820ee054fefe5422b4db3f681e567a8976747eDaniel Dunbar  // Enable -fdiagnostics-show-option by default.
8631eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump  if (Args.hasFlag(options::OPT_fdiagnostics_show_option,
8649e820ee054fefe5422b4db3f681e567a8976747eDaniel Dunbar                   options::OPT_fno_diagnostics_show_option))
8659e820ee054fefe5422b4db3f681e567a8976747eDaniel Dunbar    CmdArgs.push_back("-fdiagnostics-show-option");
866a46c71abb1dc2f9758ad1abe3378534fe138e802Torok Edwin  if (!Args.hasFlag(options::OPT_fcolor_diagnostics,
86775eb1d64784946a37fc0b27596e2d92b6cf7033bDaniel Dunbar                    options::OPT_fno_color_diagnostics))
868a46c71abb1dc2f9758ad1abe3378534fe138e802Torok Edwin    CmdArgs.push_back("-fno-color-diagnostics");
86975eb1d64784946a37fc0b27596e2d92b6cf7033bDaniel Dunbar  if (!Args.hasFlag(options::OPT_fshow_source_location,
87075eb1d64784946a37fc0b27596e2d92b6cf7033bDaniel Dunbar                    options::OPT_fno_show_source_location))
87175eb1d64784946a37fc0b27596e2d92b6cf7033bDaniel Dunbar    CmdArgs.push_back("-fno-show-source-location");
8729e820ee054fefe5422b4db3f681e567a8976747eDaniel Dunbar
8737695fba30221613b7cf31276456217c41bb90960Daniel Dunbar  // -fdollars-in-identifiers default varies depending on platform and
8747695fba30221613b7cf31276456217c41bb90960Daniel Dunbar  // language; only pass if specified.
8751eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump  if (Arg *A = Args.getLastArg(options::OPT_fdollars_in_identifiers,
8767695fba30221613b7cf31276456217c41bb90960Daniel Dunbar                               options::OPT_fno_dollars_in_identifiers)) {
8777695fba30221613b7cf31276456217c41bb90960Daniel Dunbar    if (A->getOption().matches(options::OPT_fdollars_in_identifiers))
8787695fba30221613b7cf31276456217c41bb90960Daniel Dunbar      CmdArgs.push_back("-fdollars-in-identifiers=1");
8797695fba30221613b7cf31276456217c41bb90960Daniel Dunbar    else
8807695fba30221613b7cf31276456217c41bb90960Daniel Dunbar      CmdArgs.push_back("-fdollars-in-identifiers=0");
8817695fba30221613b7cf31276456217c41bb90960Daniel Dunbar  }
8827695fba30221613b7cf31276456217c41bb90960Daniel Dunbar
883e027a4b2399e9b0acfe0f77220c66bbe369067eeDaniel Dunbar  // -funit-at-a-time is default, and we don't support -fno-unit-at-a-time for
884e027a4b2399e9b0acfe0f77220c66bbe369067eeDaniel Dunbar  // practical purposes.
8851eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump  if (Arg *A = Args.getLastArg(options::OPT_funit_at_a_time,
886e027a4b2399e9b0acfe0f77220c66bbe369067eeDaniel Dunbar                               options::OPT_fno_unit_at_a_time)) {
887e027a4b2399e9b0acfe0f77220c66bbe369067eeDaniel Dunbar    if (A->getOption().matches(options::OPT_fno_unit_at_a_time))
888e027a4b2399e9b0acfe0f77220c66bbe369067eeDaniel Dunbar      D.Diag(clang::diag::err_drv_clang_unsupported) << A->getAsString(Args);
889e027a4b2399e9b0acfe0f77220c66bbe369067eeDaniel Dunbar  }
890ceb5c5b7f67a30fae305d1d19b478b623e4fbcedEli Friedman
8912ba91575905a54f712a7f64304e56002e4882499Daniel Dunbar  // Default to -fno-builtin-str{cat,cpy} on Darwin for ARM.
892f84a4a469d8a45c76cb941595582a0fd3b9b15d3Daniel Dunbar  //
893f84a4a469d8a45c76cb941595582a0fd3b9b15d3Daniel Dunbar  // FIXME: This is disabled until clang-cc supports -fno-builtin-foo. PR4941.
894f84a4a469d8a45c76cb941595582a0fd3b9b15d3Daniel Dunbar#if 0
8952ba91575905a54f712a7f64304e56002e4882499Daniel Dunbar  if (getToolChain().getTriple().getOS() == llvm::Triple::Darwin &&
8962ba91575905a54f712a7f64304e56002e4882499Daniel Dunbar      (getToolChain().getTriple().getArch() == llvm::Triple::arm ||
8972ba91575905a54f712a7f64304e56002e4882499Daniel Dunbar       getToolChain().getTriple().getArch() == llvm::Triple::thumb)) {
8982ba91575905a54f712a7f64304e56002e4882499Daniel Dunbar    if (!Args.hasArg(options::OPT_fbuiltin_strcat))
8992ba91575905a54f712a7f64304e56002e4882499Daniel Dunbar      CmdArgs.push_back("-fno-builtin-strcat");
9002ba91575905a54f712a7f64304e56002e4882499Daniel Dunbar    if (!Args.hasArg(options::OPT_fbuiltin_strcpy))
9012ba91575905a54f712a7f64304e56002e4882499Daniel Dunbar      CmdArgs.push_back("-fno-builtin-strcpy");
9022ba91575905a54f712a7f64304e56002e4882499Daniel Dunbar  }
903f84a4a469d8a45c76cb941595582a0fd3b9b15d3Daniel Dunbar#endif
9042ba91575905a54f712a7f64304e56002e4882499Daniel Dunbar
9051eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump  if (Arg *A = Args.getLastArg(options::OPT_traditional,
906ceb5c5b7f67a30fae305d1d19b478b623e4fbcedEli Friedman                               options::OPT_traditional_cpp))
907ceb5c5b7f67a30fae305d1d19b478b623e4fbcedEli Friedman    D.Diag(clang::diag::err_drv_clang_unsupported) << A->getAsString(Args);
908ceb5c5b7f67a30fae305d1d19b478b623e4fbcedEli Friedman
9091d46033f760ba5fd266ce59fe391fac473f04f52Daniel Dunbar  Args.AddLastArg(CmdArgs, options::OPT_dM);
910d82df3ad430397d7f9ef511e7c5157f997c41f53Chris Lattner  Args.AddLastArg(CmdArgs, options::OPT_dD);
9111d46033f760ba5fd266ce59fe391fac473f04f52Daniel Dunbar
9121d46033f760ba5fd266ce59fe391fac473f04f52Daniel Dunbar  Args.AddAllArgValues(CmdArgs, options::OPT_Xclang);
913e5280286573d4fe1220cdd66e147b572a05536a8Daniel Dunbar  Args.AddAllArgValues(CmdArgs, options::OPT_mllvm);
9141d46033f760ba5fd266ce59fe391fac473f04f52Daniel Dunbar
915cd8e4c44dd068956e9181381be3ee2d49a0fac52Daniel Dunbar  if (Output.getType() == types::TY_Dependencies) {
916cd8e4c44dd068956e9181381be3ee2d49a0fac52Daniel Dunbar    // Handled with other dependency code.
917a5a7bd0de7b6b80212095195a055a4a43f21d4b2Daniel Dunbar  } else if (Output.isPipe()) {
918b488c1dac8e53206f07103d794a62a3f5012c0f4Daniel Dunbar    CmdArgs.push_back("-o");
919b488c1dac8e53206f07103d794a62a3f5012c0f4Daniel Dunbar    CmdArgs.push_back("-");
920115a79277edababaf1b26e3654044ae983197679Daniel Dunbar  } else if (Output.isFilename()) {
921b488c1dac8e53206f07103d794a62a3f5012c0f4Daniel Dunbar    CmdArgs.push_back("-o");
922115a79277edababaf1b26e3654044ae983197679Daniel Dunbar    CmdArgs.push_back(Output.getFilename());
923115a79277edababaf1b26e3654044ae983197679Daniel Dunbar  } else {
924115a79277edababaf1b26e3654044ae983197679Daniel Dunbar    assert(Output.isNothing() && "Invalid output.");
925b488c1dac8e53206f07103d794a62a3f5012c0f4Daniel Dunbar  }
926b488c1dac8e53206f07103d794a62a3f5012c0f4Daniel Dunbar
9271d46033f760ba5fd266ce59fe391fac473f04f52Daniel Dunbar  for (InputInfoList::const_iterator
9281d46033f760ba5fd266ce59fe391fac473f04f52Daniel Dunbar         it = Inputs.begin(), ie = Inputs.end(); it != ie; ++it) {
9291d46033f760ba5fd266ce59fe391fac473f04f52Daniel Dunbar    const InputInfo &II = *it;
9301d46033f760ba5fd266ce59fe391fac473f04f52Daniel Dunbar    CmdArgs.push_back("-x");
9311d46033f760ba5fd266ce59fe391fac473f04f52Daniel Dunbar    CmdArgs.push_back(types::getTypeName(II.getType()));
9321d46033f760ba5fd266ce59fe391fac473f04f52Daniel Dunbar    if (II.isPipe())
9331d46033f760ba5fd266ce59fe391fac473f04f52Daniel Dunbar      CmdArgs.push_back("-");
934115a79277edababaf1b26e3654044ae983197679Daniel Dunbar    else if (II.isFilename())
935115a79277edababaf1b26e3654044ae983197679Daniel Dunbar      CmdArgs.push_back(II.getFilename());
9361d46033f760ba5fd266ce59fe391fac473f04f52Daniel Dunbar    else
937115a79277edababaf1b26e3654044ae983197679Daniel Dunbar      II.getInputArg().renderAsInput(Args, CmdArgs);
9381d46033f760ba5fd266ce59fe391fac473f04f52Daniel Dunbar  }
939c21c485b4fb58ef5d55cf3e523263dd824a2ace4Daniel Dunbar
940c21c485b4fb58ef5d55cf3e523263dd824a2ace4Daniel Dunbar  const char *Exec =
9415ed34f4c58b6ad4e21038d713c1fae31a6146ff5Daniel Dunbar    Args.MakeArgString(getToolChain().GetProgramPath(C, "clang-cc"));
942cae087e164e94e4286c11bf694dd0ff88f295302Daniel Dunbar  Dest.addCommand(new Command(JA, Exec, CmdArgs));
943a880db0b0fc028abf754c290d921d809eec0518aDaniel Dunbar
9445c1aaafbd6dd25a99ca1960e1c3c98aeefe9d728Daniel Dunbar  // Explicitly warn that these options are unsupported, even though
9455c1aaafbd6dd25a99ca1960e1c3c98aeefe9d728Daniel Dunbar  // we are allowing compilation to continue.
9465c1aaafbd6dd25a99ca1960e1c3c98aeefe9d728Daniel Dunbar  // FIXME: Use iterator.
947c21c485b4fb58ef5d55cf3e523263dd824a2ace4Daniel Dunbar  for (ArgList::const_iterator
9485c1aaafbd6dd25a99ca1960e1c3c98aeefe9d728Daniel Dunbar         it = Args.begin(), ie = Args.end(); it != ie; ++it) {
9495c1aaafbd6dd25a99ca1960e1c3c98aeefe9d728Daniel Dunbar    const Arg *A = *it;
9505c1aaafbd6dd25a99ca1960e1c3c98aeefe9d728Daniel Dunbar    if (A->getOption().matches(options::OPT_pg)) {
9515c1aaafbd6dd25a99ca1960e1c3c98aeefe9d728Daniel Dunbar      A->claim();
952c21c485b4fb58ef5d55cf3e523263dd824a2ace4Daniel Dunbar      D.Diag(clang::diag::warn_drv_clang_unsupported)
9535c1aaafbd6dd25a99ca1960e1c3c98aeefe9d728Daniel Dunbar        << A->getAsString(Args);
9545c1aaafbd6dd25a99ca1960e1c3c98aeefe9d728Daniel Dunbar    }
9555c1aaafbd6dd25a99ca1960e1c3c98aeefe9d728Daniel Dunbar  }
9565c1aaafbd6dd25a99ca1960e1c3c98aeefe9d728Daniel Dunbar
95768fb469aeb19144403e703b825854d08353c8eeaDaniel Dunbar  // Claim some arguments which clang supports automatically.
95868fb469aeb19144403e703b825854d08353c8eeaDaniel Dunbar
95968fb469aeb19144403e703b825854d08353c8eeaDaniel Dunbar  // -fpch-preprocess is used with gcc to add a special marker in the
96068fb469aeb19144403e703b825854d08353c8eeaDaniel Dunbar  // -output to include the PCH file. Clang's PTH solution is
96168fb469aeb19144403e703b825854d08353c8eeaDaniel Dunbar  // -completely transparent, so we do not need to deal with it at
96268fb469aeb19144403e703b825854d08353c8eeaDaniel Dunbar  // -all.
96368fb469aeb19144403e703b825854d08353c8eeaDaniel Dunbar  Args.ClaimAllArgs(options::OPT_fpch_preprocess);
964c21c485b4fb58ef5d55cf3e523263dd824a2ace4Daniel Dunbar
965a880db0b0fc028abf754c290d921d809eec0518aDaniel Dunbar  // Claim some arguments which clang doesn't support, but we don't
966a880db0b0fc028abf754c290d921d809eec0518aDaniel Dunbar  // care to warn the user about.
967c21c485b4fb58ef5d55cf3e523263dd824a2ace4Daniel Dunbar
968a880db0b0fc028abf754c290d921d809eec0518aDaniel Dunbar  // FIXME: Use iterator.
969c21c485b4fb58ef5d55cf3e523263dd824a2ace4Daniel Dunbar  for (ArgList::const_iterator
970a880db0b0fc028abf754c290d921d809eec0518aDaniel Dunbar         it = Args.begin(), ie = Args.end(); it != ie; ++it) {
971a880db0b0fc028abf754c290d921d809eec0518aDaniel Dunbar    const Arg *A = *it;
97206ef3c3e9be4923b8e29c8e267b0c56afaa14ff3Daniel Dunbar    if (A->getOption().matches(options::OPT_clang_ignored_f_Group) ||
97316fd3a9f5159b74bfdd65cf290b4bd091088de91Daniel Dunbar        A->getOption().matches(options::OPT_clang_ignored_m_Group))
974a880db0b0fc028abf754c290d921d809eec0518aDaniel Dunbar      A->claim();
975a880db0b0fc028abf754c290d921d809eec0518aDaniel Dunbar  }
97647ac7d27c44bd64a7d0fc03d4babc196cf2b8230Daniel Dunbar}
97747ac7d27c44bd64a7d0fc03d4babc196cf2b8230Daniel Dunbar
978b488c1dac8e53206f07103d794a62a3f5012c0f4Daniel Dunbarvoid gcc::Common::ConstructJob(Compilation &C, const JobAction &JA,
979b488c1dac8e53206f07103d794a62a3f5012c0f4Daniel Dunbar                               Job &Dest,
980b488c1dac8e53206f07103d794a62a3f5012c0f4Daniel Dunbar                               const InputInfo &Output,
981b488c1dac8e53206f07103d794a62a3f5012c0f4Daniel Dunbar                               const InputInfoList &Inputs,
9821d46033f760ba5fd266ce59fe391fac473f04f52Daniel Dunbar                               const ArgList &Args,
983b488c1dac8e53206f07103d794a62a3f5012c0f4Daniel Dunbar                               const char *LinkingOutput) const {
984a8304f67291b0182fb64f3afc621615288dd1d31Daniel Dunbar  const Driver &D = getToolChain().getHost().getDriver();
985b488c1dac8e53206f07103d794a62a3f5012c0f4Daniel Dunbar  ArgStringList CmdArgs;
986b488c1dac8e53206f07103d794a62a3f5012c0f4Daniel Dunbar
987c21c485b4fb58ef5d55cf3e523263dd824a2ace4Daniel Dunbar  for (ArgList::const_iterator
9881d46033f760ba5fd266ce59fe391fac473f04f52Daniel Dunbar         it = Args.begin(), ie = Args.end(); it != ie; ++it) {
989b488c1dac8e53206f07103d794a62a3f5012c0f4Daniel Dunbar    Arg *A = *it;
9907587719c40ebf02bf11e5e66c30bd20e98edebc2Daniel Dunbar    if (A->getOption().hasForwardToGCC()) {
9917587719c40ebf02bf11e5e66c30bd20e98edebc2Daniel Dunbar      // It is unfortunate that we have to claim here, as this means
9927587719c40ebf02bf11e5e66c30bd20e98edebc2Daniel Dunbar      // we will basically never report anything interesting for
9936ecc7a993f939c5255c36c7c0d965fb9c1543f2aDaniel Dunbar      // platforms using a generic gcc, even if we are just using gcc
9946ecc7a993f939c5255c36c7c0d965fb9c1543f2aDaniel Dunbar      // to get to the assembler.
9957587719c40ebf02bf11e5e66c30bd20e98edebc2Daniel Dunbar      A->claim();
9961d46033f760ba5fd266ce59fe391fac473f04f52Daniel Dunbar      A->render(Args, CmdArgs);
9977587719c40ebf02bf11e5e66c30bd20e98edebc2Daniel Dunbar    }
998b488c1dac8e53206f07103d794a62a3f5012c0f4Daniel Dunbar  }
999c21c485b4fb58ef5d55cf3e523263dd824a2ace4Daniel Dunbar
1000b488c1dac8e53206f07103d794a62a3f5012c0f4Daniel Dunbar  RenderExtraToolArgs(CmdArgs);
1001b488c1dac8e53206f07103d794a62a3f5012c0f4Daniel Dunbar
1002b488c1dac8e53206f07103d794a62a3f5012c0f4Daniel Dunbar  // If using a driver driver, force the arch.
10037cfe31a713d8fcfc2a1328e8fbd8efdeb0aec51bDaniel Dunbar  const std::string &Arch = getToolChain().getArchName();
1004b488c1dac8e53206f07103d794a62a3f5012c0f4Daniel Dunbar  if (getToolChain().getHost().useDriverDriver()) {
1005b488c1dac8e53206f07103d794a62a3f5012c0f4Daniel Dunbar    CmdArgs.push_back("-arch");
1006bf54a06f9b771c2a2730cc63eb89bce0522515b5Daniel Dunbar
1007bf54a06f9b771c2a2730cc63eb89bce0522515b5Daniel Dunbar    // FIXME: Remove these special cases.
10087cfe31a713d8fcfc2a1328e8fbd8efdeb0aec51bDaniel Dunbar    if (Arch == "powerpc")
10097cfe31a713d8fcfc2a1328e8fbd8efdeb0aec51bDaniel Dunbar      CmdArgs.push_back("ppc");
10107cfe31a713d8fcfc2a1328e8fbd8efdeb0aec51bDaniel Dunbar    else if (Arch == "powerpc64")
10117cfe31a713d8fcfc2a1328e8fbd8efdeb0aec51bDaniel Dunbar      CmdArgs.push_back("ppc64");
10127cfe31a713d8fcfc2a1328e8fbd8efdeb0aec51bDaniel Dunbar    else
1013881376467c46c5c6cc16fa6790271c2c22e1d4f1Daniel Dunbar      CmdArgs.push_back(Args.MakeArgString(Arch));
1014b488c1dac8e53206f07103d794a62a3f5012c0f4Daniel Dunbar  }
1015b488c1dac8e53206f07103d794a62a3f5012c0f4Daniel Dunbar
10166ecc7a993f939c5255c36c7c0d965fb9c1543f2aDaniel Dunbar  // Try to force gcc to match the tool chain we want, if we recognize
10176ecc7a993f939c5255c36c7c0d965fb9c1543f2aDaniel Dunbar  // the arch.
10187cfe31a713d8fcfc2a1328e8fbd8efdeb0aec51bDaniel Dunbar  //
10197cfe31a713d8fcfc2a1328e8fbd8efdeb0aec51bDaniel Dunbar  // FIXME: The triple class should directly provide the information we want
10207cfe31a713d8fcfc2a1328e8fbd8efdeb0aec51bDaniel Dunbar  // here.
10217cfe31a713d8fcfc2a1328e8fbd8efdeb0aec51bDaniel Dunbar  if (Arch == "i386" || Arch == "powerpc")
10226ecc7a993f939c5255c36c7c0d965fb9c1543f2aDaniel Dunbar    CmdArgs.push_back("-m32");
10237cfe31a713d8fcfc2a1328e8fbd8efdeb0aec51bDaniel Dunbar  else if (Arch == "x86_64" || Arch == "powerpc64")
10246ecc7a993f939c5255c36c7c0d965fb9c1543f2aDaniel Dunbar    CmdArgs.push_back("-m64");
10256ecc7a993f939c5255c36c7c0d965fb9c1543f2aDaniel Dunbar
1026b488c1dac8e53206f07103d794a62a3f5012c0f4Daniel Dunbar  if (Output.isPipe()) {
1027b488c1dac8e53206f07103d794a62a3f5012c0f4Daniel Dunbar    CmdArgs.push_back("-o");
1028b488c1dac8e53206f07103d794a62a3f5012c0f4Daniel Dunbar    CmdArgs.push_back("-");
1029115a79277edababaf1b26e3654044ae983197679Daniel Dunbar  } else if (Output.isFilename()) {
1030b488c1dac8e53206f07103d794a62a3f5012c0f4Daniel Dunbar    CmdArgs.push_back("-o");
1031115a79277edababaf1b26e3654044ae983197679Daniel Dunbar    CmdArgs.push_back(Output.getFilename());
1032115a79277edababaf1b26e3654044ae983197679Daniel Dunbar  } else {
1033115a79277edababaf1b26e3654044ae983197679Daniel Dunbar    assert(Output.isNothing() && "Unexpected output");
1034b488c1dac8e53206f07103d794a62a3f5012c0f4Daniel Dunbar    CmdArgs.push_back("-fsyntax-only");
1035115a79277edababaf1b26e3654044ae983197679Daniel Dunbar  }
1036b488c1dac8e53206f07103d794a62a3f5012c0f4Daniel Dunbar
1037b488c1dac8e53206f07103d794a62a3f5012c0f4Daniel Dunbar
1038b488c1dac8e53206f07103d794a62a3f5012c0f4Daniel Dunbar  // Only pass -x if gcc will understand it; otherwise hope gcc
1039b488c1dac8e53206f07103d794a62a3f5012c0f4Daniel Dunbar  // understands the suffix correctly. The main use case this would go
1040b488c1dac8e53206f07103d794a62a3f5012c0f4Daniel Dunbar  // wrong in is for linker inputs if they happened to have an odd
1041b488c1dac8e53206f07103d794a62a3f5012c0f4Daniel Dunbar  // suffix; really the only way to get this to happen is a command
1042b488c1dac8e53206f07103d794a62a3f5012c0f4Daniel Dunbar  // like '-x foobar a.c' which will treat a.c like a linker input.
1043b488c1dac8e53206f07103d794a62a3f5012c0f4Daniel Dunbar  //
1044b488c1dac8e53206f07103d794a62a3f5012c0f4Daniel Dunbar  // FIXME: For the linker case specifically, can we safely convert
1045b488c1dac8e53206f07103d794a62a3f5012c0f4Daniel Dunbar  // inputs into '-Wl,' options?
1046b488c1dac8e53206f07103d794a62a3f5012c0f4Daniel Dunbar  for (InputInfoList::const_iterator
1047b488c1dac8e53206f07103d794a62a3f5012c0f4Daniel Dunbar         it = Inputs.begin(), ie = Inputs.end(); it != ie; ++it) {
1048b488c1dac8e53206f07103d794a62a3f5012c0f4Daniel Dunbar    const InputInfo &II = *it;
1049a8304f67291b0182fb64f3afc621615288dd1d31Daniel Dunbar
10505915fbf310e171c4cd3c2af05e9de360c0fa988aDaniel Dunbar    // Don't try to pass LLVM or AST inputs to a generic gcc.
1051a8304f67291b0182fb64f3afc621615288dd1d31Daniel Dunbar    if (II.getType() == types::TY_LLVMBC)
1052a8304f67291b0182fb64f3afc621615288dd1d31Daniel Dunbar      D.Diag(clang::diag::err_drv_no_linker_llvm_support)
1053881376467c46c5c6cc16fa6790271c2c22e1d4f1Daniel Dunbar        << getToolChain().getTripleString();
10545915fbf310e171c4cd3c2af05e9de360c0fa988aDaniel Dunbar    else if (II.getType() == types::TY_AST)
10555915fbf310e171c4cd3c2af05e9de360c0fa988aDaniel Dunbar      D.Diag(clang::diag::err_drv_no_ast_support)
1056881376467c46c5c6cc16fa6790271c2c22e1d4f1Daniel Dunbar        << getToolChain().getTripleString();
1057a8304f67291b0182fb64f3afc621615288dd1d31Daniel Dunbar
1058b488c1dac8e53206f07103d794a62a3f5012c0f4Daniel Dunbar    if (types::canTypeBeUserSpecified(II.getType())) {
1059b488c1dac8e53206f07103d794a62a3f5012c0f4Daniel Dunbar      CmdArgs.push_back("-x");
1060b488c1dac8e53206f07103d794a62a3f5012c0f4Daniel Dunbar      CmdArgs.push_back(types::getTypeName(II.getType()));
1061b488c1dac8e53206f07103d794a62a3f5012c0f4Daniel Dunbar    }
1062b488c1dac8e53206f07103d794a62a3f5012c0f4Daniel Dunbar
1063b488c1dac8e53206f07103d794a62a3f5012c0f4Daniel Dunbar    if (II.isPipe())
1064b488c1dac8e53206f07103d794a62a3f5012c0f4Daniel Dunbar      CmdArgs.push_back("-");
1065115a79277edababaf1b26e3654044ae983197679Daniel Dunbar    else if (II.isFilename())
1066115a79277edababaf1b26e3654044ae983197679Daniel Dunbar      CmdArgs.push_back(II.getFilename());
1067b488c1dac8e53206f07103d794a62a3f5012c0f4Daniel Dunbar    else
1068115a79277edababaf1b26e3654044ae983197679Daniel Dunbar      // Don't render as input, we need gcc to do the translations.
1069115a79277edababaf1b26e3654044ae983197679Daniel Dunbar      II.getInputArg().render(Args, CmdArgs);
1070b488c1dac8e53206f07103d794a62a3f5012c0f4Daniel Dunbar  }
1071b488c1dac8e53206f07103d794a62a3f5012c0f4Daniel Dunbar
1072c21c485b4fb58ef5d55cf3e523263dd824a2ace4Daniel Dunbar  const char *GCCName =
107378d8a089c8f124ba6f47bb37e2c4a36986f60e23Daniel Dunbar    getToolChain().getHost().getDriver().CCCGenericGCCName.c_str();
1074c21c485b4fb58ef5d55cf3e523263dd824a2ace4Daniel Dunbar  const char *Exec =
10755ed34f4c58b6ad4e21038d713c1fae31a6146ff5Daniel Dunbar    Args.MakeArgString(getToolChain().GetProgramPath(C, GCCName));
1076cae087e164e94e4286c11bf694dd0ff88f295302Daniel Dunbar  Dest.addCommand(new Command(JA, Exec, CmdArgs));
107747ac7d27c44bd64a7d0fc03d4babc196cf2b8230Daniel Dunbar}
107847ac7d27c44bd64a7d0fc03d4babc196cf2b8230Daniel Dunbar
1079b488c1dac8e53206f07103d794a62a3f5012c0f4Daniel Dunbarvoid gcc::Preprocess::RenderExtraToolArgs(ArgStringList &CmdArgs) const {
1080b488c1dac8e53206f07103d794a62a3f5012c0f4Daniel Dunbar  CmdArgs.push_back("-E");
108147ac7d27c44bd64a7d0fc03d4babc196cf2b8230Daniel Dunbar}
108247ac7d27c44bd64a7d0fc03d4babc196cf2b8230Daniel Dunbar
1083b488c1dac8e53206f07103d794a62a3f5012c0f4Daniel Dunbarvoid gcc::Precompile::RenderExtraToolArgs(ArgStringList &CmdArgs) const {
1084b488c1dac8e53206f07103d794a62a3f5012c0f4Daniel Dunbar  // The type is good enough.
108547ac7d27c44bd64a7d0fc03d4babc196cf2b8230Daniel Dunbar}
108647ac7d27c44bd64a7d0fc03d4babc196cf2b8230Daniel Dunbar
1087b488c1dac8e53206f07103d794a62a3f5012c0f4Daniel Dunbarvoid gcc::Compile::RenderExtraToolArgs(ArgStringList &CmdArgs) const {
1088b488c1dac8e53206f07103d794a62a3f5012c0f4Daniel Dunbar  CmdArgs.push_back("-S");
108947ac7d27c44bd64a7d0fc03d4babc196cf2b8230Daniel Dunbar}
109047ac7d27c44bd64a7d0fc03d4babc196cf2b8230Daniel Dunbar
1091b488c1dac8e53206f07103d794a62a3f5012c0f4Daniel Dunbarvoid gcc::Assemble::RenderExtraToolArgs(ArgStringList &CmdArgs) const {
1092b488c1dac8e53206f07103d794a62a3f5012c0f4Daniel Dunbar  CmdArgs.push_back("-c");
1093b488c1dac8e53206f07103d794a62a3f5012c0f4Daniel Dunbar}
109447ac7d27c44bd64a7d0fc03d4babc196cf2b8230Daniel Dunbar
1095b488c1dac8e53206f07103d794a62a3f5012c0f4Daniel Dunbarvoid gcc::Link::RenderExtraToolArgs(ArgStringList &CmdArgs) const {
1096b488c1dac8e53206f07103d794a62a3f5012c0f4Daniel Dunbar  // The types are (hopefully) good enough.
109747ac7d27c44bd64a7d0fc03d4babc196cf2b8230Daniel Dunbar}
1098b488c1dac8e53206f07103d794a62a3f5012c0f4Daniel Dunbar
109940f1265ebd42ece3e7f7917319b56012e8e2bce2Daniel Dunbarconst char *darwin::CC1::getCC1Name(types::ID Type) const {
110040f1265ebd42ece3e7f7917319b56012e8e2bce2Daniel Dunbar  switch (Type) {
110140f1265ebd42ece3e7f7917319b56012e8e2bce2Daniel Dunbar  default:
110240f1265ebd42ece3e7f7917319b56012e8e2bce2Daniel Dunbar    assert(0 && "Unexpected type for Darwin CC1 tool.");
110340f1265ebd42ece3e7f7917319b56012e8e2bce2Daniel Dunbar  case types::TY_Asm:
110440f1265ebd42ece3e7f7917319b56012e8e2bce2Daniel Dunbar  case types::TY_C: case types::TY_CHeader:
110540f1265ebd42ece3e7f7917319b56012e8e2bce2Daniel Dunbar  case types::TY_PP_C: case types::TY_PP_CHeader:
110640f1265ebd42ece3e7f7917319b56012e8e2bce2Daniel Dunbar    return "cc1";
110740f1265ebd42ece3e7f7917319b56012e8e2bce2Daniel Dunbar  case types::TY_ObjC: case types::TY_ObjCHeader:
110840f1265ebd42ece3e7f7917319b56012e8e2bce2Daniel Dunbar  case types::TY_PP_ObjC: case types::TY_PP_ObjCHeader:
110940f1265ebd42ece3e7f7917319b56012e8e2bce2Daniel Dunbar    return "cc1obj";
111040f1265ebd42ece3e7f7917319b56012e8e2bce2Daniel Dunbar  case types::TY_CXX: case types::TY_CXXHeader:
111140f1265ebd42ece3e7f7917319b56012e8e2bce2Daniel Dunbar  case types::TY_PP_CXX: case types::TY_PP_CXXHeader:
111240f1265ebd42ece3e7f7917319b56012e8e2bce2Daniel Dunbar    return "cc1plus";
111340f1265ebd42ece3e7f7917319b56012e8e2bce2Daniel Dunbar  case types::TY_ObjCXX: case types::TY_ObjCXXHeader:
111440f1265ebd42ece3e7f7917319b56012e8e2bce2Daniel Dunbar  case types::TY_PP_ObjCXX: case types::TY_PP_ObjCXXHeader:
111540f1265ebd42ece3e7f7917319b56012e8e2bce2Daniel Dunbar    return "cc1objplus";
111640f1265ebd42ece3e7f7917319b56012e8e2bce2Daniel Dunbar  }
111740f1265ebd42ece3e7f7917319b56012e8e2bce2Daniel Dunbar}
111840f1265ebd42ece3e7f7917319b56012e8e2bce2Daniel Dunbar
1119c21c485b4fb58ef5d55cf3e523263dd824a2ace4Daniel Dunbarconst char *darwin::CC1::getBaseInputName(const ArgList &Args,
1120a5a7bd0de7b6b80212095195a055a4a43f21d4b2Daniel Dunbar                                          const InputInfoList &Inputs) {
1121a3ec60e0cf2a1916f479288998d31bd980b1a306Daniel Dunbar  llvm::sys::Path P(Inputs[0].getBaseInput());
1122881376467c46c5c6cc16fa6790271c2c22e1d4f1Daniel Dunbar  return Args.MakeArgString(P.getLast());
1123a3ec60e0cf2a1916f479288998d31bd980b1a306Daniel Dunbar}
1124a3ec60e0cf2a1916f479288998d31bd980b1a306Daniel Dunbar
1125c21c485b4fb58ef5d55cf3e523263dd824a2ace4Daniel Dunbarconst char *darwin::CC1::getBaseInputStem(const ArgList &Args,
1126a5a7bd0de7b6b80212095195a055a4a43f21d4b2Daniel Dunbar                                          const InputInfoList &Inputs) {
1127a3ec60e0cf2a1916f479288998d31bd980b1a306Daniel Dunbar  const char *Str = getBaseInputName(Args, Inputs);
1128a3ec60e0cf2a1916f479288998d31bd980b1a306Daniel Dunbar
1129a3ec60e0cf2a1916f479288998d31bd980b1a306Daniel Dunbar  if (const char *End = strchr(Str, '.'))
1130881376467c46c5c6cc16fa6790271c2c22e1d4f1Daniel Dunbar    return Args.MakeArgString(std::string(Str, End));
1131a3ec60e0cf2a1916f479288998d31bd980b1a306Daniel Dunbar
1132a3ec60e0cf2a1916f479288998d31bd980b1a306Daniel Dunbar  return Str;
1133a3ec60e0cf2a1916f479288998d31bd980b1a306Daniel Dunbar}
1134a3ec60e0cf2a1916f479288998d31bd980b1a306Daniel Dunbar
1135a3ec60e0cf2a1916f479288998d31bd980b1a306Daniel Dunbarconst char *
1136c21c485b4fb58ef5d55cf3e523263dd824a2ace4Daniel Dunbardarwin::CC1::getDependencyFileName(const ArgList &Args,
1137a5a7bd0de7b6b80212095195a055a4a43f21d4b2Daniel Dunbar                                   const InputInfoList &Inputs) {
1138a3ec60e0cf2a1916f479288998d31bd980b1a306Daniel Dunbar  // FIXME: Think about this more.
1139a3ec60e0cf2a1916f479288998d31bd980b1a306Daniel Dunbar  std::string Res;
1140a3ec60e0cf2a1916f479288998d31bd980b1a306Daniel Dunbar
1141a3ec60e0cf2a1916f479288998d31bd980b1a306Daniel Dunbar  if (Arg *OutputOpt = Args.getLastArg(options::OPT_o)) {
1142a3ec60e0cf2a1916f479288998d31bd980b1a306Daniel Dunbar    std::string Str(OutputOpt->getValue(Args));
1143c21c485b4fb58ef5d55cf3e523263dd824a2ace4Daniel Dunbar
1144a3ec60e0cf2a1916f479288998d31bd980b1a306Daniel Dunbar    Res = Str.substr(0, Str.rfind('.'));
1145a3ec60e0cf2a1916f479288998d31bd980b1a306Daniel Dunbar  } else
1146a5a7bd0de7b6b80212095195a055a4a43f21d4b2Daniel Dunbar    Res = darwin::CC1::getBaseInputStem(Args, Inputs);
1147a3ec60e0cf2a1916f479288998d31bd980b1a306Daniel Dunbar
1148881376467c46c5c6cc16fa6790271c2c22e1d4f1Daniel Dunbar  return Args.MakeArgString(Res + ".d");
1149a3ec60e0cf2a1916f479288998d31bd980b1a306Daniel Dunbar}
1150a3ec60e0cf2a1916f479288998d31bd980b1a306Daniel Dunbar
1151c21c485b4fb58ef5d55cf3e523263dd824a2ace4Daniel Dunbarvoid darwin::CC1::AddCC1Args(const ArgList &Args,
1152a3ec60e0cf2a1916f479288998d31bd980b1a306Daniel Dunbar                             ArgStringList &CmdArgs) const {
1153e2fd66418eca3d70cf6b62087d745d0c5181db69Daniel Dunbar  const Driver &D = getToolChain().getHost().getDriver();
1154e2fd66418eca3d70cf6b62087d745d0c5181db69Daniel Dunbar
1155e2fd66418eca3d70cf6b62087d745d0c5181db69Daniel Dunbar  CheckCodeGenerationOptions(D, Args);
1156e2fd66418eca3d70cf6b62087d745d0c5181db69Daniel Dunbar
1157a3ec60e0cf2a1916f479288998d31bd980b1a306Daniel Dunbar  // Derived from cc1 spec.
1158a3ec60e0cf2a1916f479288998d31bd980b1a306Daniel Dunbar  if (!Args.hasArg(options::OPT_mkernel) && !Args.hasArg(options::OPT_static) &&
1159a3ec60e0cf2a1916f479288998d31bd980b1a306Daniel Dunbar      !Args.hasArg(options::OPT_mdynamic_no_pic))
1160a3ec60e0cf2a1916f479288998d31bd980b1a306Daniel Dunbar    CmdArgs.push_back("-fPIC");
1161a3ec60e0cf2a1916f479288998d31bd980b1a306Daniel Dunbar
11622ba91575905a54f712a7f64304e56002e4882499Daniel Dunbar  if (getToolChain().getTriple().getArch() == llvm::Triple::arm ||
11632ba91575905a54f712a7f64304e56002e4882499Daniel Dunbar      getToolChain().getTriple().getArch() == llvm::Triple::thumb) {
11642ba91575905a54f712a7f64304e56002e4882499Daniel Dunbar    if (!Args.hasArg(options::OPT_fbuiltin_strcat))
11652ba91575905a54f712a7f64304e56002e4882499Daniel Dunbar      CmdArgs.push_back("-fno-builtin-strcat");
11662ba91575905a54f712a7f64304e56002e4882499Daniel Dunbar    if (!Args.hasArg(options::OPT_fbuiltin_strcpy))
11672ba91575905a54f712a7f64304e56002e4882499Daniel Dunbar      CmdArgs.push_back("-fno-builtin-strcpy");
11682ba91575905a54f712a7f64304e56002e4882499Daniel Dunbar  }
11692ba91575905a54f712a7f64304e56002e4882499Daniel Dunbar
1170a3ec60e0cf2a1916f479288998d31bd980b1a306Daniel Dunbar  // gcc has some code here to deal with when no -mmacosx-version-min
1171a3ec60e0cf2a1916f479288998d31bd980b1a306Daniel Dunbar  // and no -miphoneos-version-min is present, but this never happens
1172a3ec60e0cf2a1916f479288998d31bd980b1a306Daniel Dunbar  // due to tool chain specific argument translation.
1173a3ec60e0cf2a1916f479288998d31bd980b1a306Daniel Dunbar
1174a3ec60e0cf2a1916f479288998d31bd980b1a306Daniel Dunbar  if (Args.hasArg(options::OPT_g_Flag) &&
1175a3ec60e0cf2a1916f479288998d31bd980b1a306Daniel Dunbar      !Args.hasArg(options::OPT_fno_eliminate_unused_debug_symbols))
1176a3ec60e0cf2a1916f479288998d31bd980b1a306Daniel Dunbar    CmdArgs.push_back("-feliminate-unused-debug-symbols");
1177a3ec60e0cf2a1916f479288998d31bd980b1a306Daniel Dunbar}
1178a3ec60e0cf2a1916f479288998d31bd980b1a306Daniel Dunbar
1179a3ec60e0cf2a1916f479288998d31bd980b1a306Daniel Dunbarvoid darwin::CC1::AddCC1OptionsArgs(const ArgList &Args, ArgStringList &CmdArgs,
1180a3ec60e0cf2a1916f479288998d31bd980b1a306Daniel Dunbar                                    const InputInfoList &Inputs,
1181a3ec60e0cf2a1916f479288998d31bd980b1a306Daniel Dunbar                                    const ArgStringList &OutputArgs) const {
1182a3ec60e0cf2a1916f479288998d31bd980b1a306Daniel Dunbar  const Driver &D = getToolChain().getHost().getDriver();
1183a3ec60e0cf2a1916f479288998d31bd980b1a306Daniel Dunbar
1184a3ec60e0cf2a1916f479288998d31bd980b1a306Daniel Dunbar  // Derived from cc1_options spec.
1185a3ec60e0cf2a1916f479288998d31bd980b1a306Daniel Dunbar  if (Args.hasArg(options::OPT_fast) ||
1186a3ec60e0cf2a1916f479288998d31bd980b1a306Daniel Dunbar      Args.hasArg(options::OPT_fastf) ||
1187a3ec60e0cf2a1916f479288998d31bd980b1a306Daniel Dunbar      Args.hasArg(options::OPT_fastcp))
1188a3ec60e0cf2a1916f479288998d31bd980b1a306Daniel Dunbar    CmdArgs.push_back("-O3");
1189c21c485b4fb58ef5d55cf3e523263dd824a2ace4Daniel Dunbar
1190a3ec60e0cf2a1916f479288998d31bd980b1a306Daniel Dunbar  if (Arg *A = Args.getLastArg(options::OPT_pg))
1191a3ec60e0cf2a1916f479288998d31bd980b1a306Daniel Dunbar    if (Args.hasArg(options::OPT_fomit_frame_pointer))
1192a3ec60e0cf2a1916f479288998d31bd980b1a306Daniel Dunbar      D.Diag(clang::diag::err_drv_argument_not_allowed_with)
1193a3ec60e0cf2a1916f479288998d31bd980b1a306Daniel Dunbar        << A->getAsString(Args) << "-fomit-frame-pointer";
1194a3ec60e0cf2a1916f479288998d31bd980b1a306Daniel Dunbar
1195a3ec60e0cf2a1916f479288998d31bd980b1a306Daniel Dunbar  AddCC1Args(Args, CmdArgs);
1196a3ec60e0cf2a1916f479288998d31bd980b1a306Daniel Dunbar
1197a3ec60e0cf2a1916f479288998d31bd980b1a306Daniel Dunbar  if (!Args.hasArg(options::OPT_Q))
1198a3ec60e0cf2a1916f479288998d31bd980b1a306Daniel Dunbar    CmdArgs.push_back("-quiet");
1199a3ec60e0cf2a1916f479288998d31bd980b1a306Daniel Dunbar
1200a3ec60e0cf2a1916f479288998d31bd980b1a306Daniel Dunbar  CmdArgs.push_back("-dumpbase");
1201a5a7bd0de7b6b80212095195a055a4a43f21d4b2Daniel Dunbar  CmdArgs.push_back(darwin::CC1::getBaseInputName(Args, Inputs));
1202a3ec60e0cf2a1916f479288998d31bd980b1a306Daniel Dunbar
1203a3ec60e0cf2a1916f479288998d31bd980b1a306Daniel Dunbar  Args.AddAllArgs(CmdArgs, options::OPT_d_Group);
1204a3ec60e0cf2a1916f479288998d31bd980b1a306Daniel Dunbar
1205a3ec60e0cf2a1916f479288998d31bd980b1a306Daniel Dunbar  Args.AddAllArgs(CmdArgs, options::OPT_m_Group);
1206a3ec60e0cf2a1916f479288998d31bd980b1a306Daniel Dunbar  Args.AddAllArgs(CmdArgs, options::OPT_a_Group);
1207a3ec60e0cf2a1916f479288998d31bd980b1a306Daniel Dunbar
1208a3ec60e0cf2a1916f479288998d31bd980b1a306Daniel Dunbar  // FIXME: The goal is to use the user provided -o if that is our
1209a3ec60e0cf2a1916f479288998d31bd980b1a306Daniel Dunbar  // final output, otherwise to drive from the original input
1210a3ec60e0cf2a1916f479288998d31bd980b1a306Daniel Dunbar  // name. Find a clean way to go about this.
1211a3ec60e0cf2a1916f479288998d31bd980b1a306Daniel Dunbar  if ((Args.hasArg(options::OPT_c) || Args.hasArg(options::OPT_S)) &&
1212a3ec60e0cf2a1916f479288998d31bd980b1a306Daniel Dunbar      Args.hasArg(options::OPT_o)) {
1213a3ec60e0cf2a1916f479288998d31bd980b1a306Daniel Dunbar    Arg *OutputOpt = Args.getLastArg(options::OPT_o);
1214a3ec60e0cf2a1916f479288998d31bd980b1a306Daniel Dunbar    CmdArgs.push_back("-auxbase-strip");
1215a3ec60e0cf2a1916f479288998d31bd980b1a306Daniel Dunbar    CmdArgs.push_back(OutputOpt->getValue(Args));
1216a3ec60e0cf2a1916f479288998d31bd980b1a306Daniel Dunbar  } else {
1217a3ec60e0cf2a1916f479288998d31bd980b1a306Daniel Dunbar    CmdArgs.push_back("-auxbase");
1218a5a7bd0de7b6b80212095195a055a4a43f21d4b2Daniel Dunbar    CmdArgs.push_back(darwin::CC1::getBaseInputStem(Args, Inputs));
1219a3ec60e0cf2a1916f479288998d31bd980b1a306Daniel Dunbar  }
1220a3ec60e0cf2a1916f479288998d31bd980b1a306Daniel Dunbar
1221a3ec60e0cf2a1916f479288998d31bd980b1a306Daniel Dunbar  Args.AddAllArgs(CmdArgs, options::OPT_g_Group);
1222a3ec60e0cf2a1916f479288998d31bd980b1a306Daniel Dunbar
1223a3ec60e0cf2a1916f479288998d31bd980b1a306Daniel Dunbar  Args.AddAllArgs(CmdArgs, options::OPT_O);
1224a3ec60e0cf2a1916f479288998d31bd980b1a306Daniel Dunbar  // FIXME: -Wall is getting some special treatment. Investigate.
1225a3ec60e0cf2a1916f479288998d31bd980b1a306Daniel Dunbar  Args.AddAllArgs(CmdArgs, options::OPT_W_Group, options::OPT_pedantic_Group);
1226a3ec60e0cf2a1916f479288998d31bd980b1a306Daniel Dunbar  Args.AddLastArg(CmdArgs, options::OPT_w);
1227c21c485b4fb58ef5d55cf3e523263dd824a2ace4Daniel Dunbar  Args.AddAllArgs(CmdArgs, options::OPT_std_EQ, options::OPT_ansi,
1228a3ec60e0cf2a1916f479288998d31bd980b1a306Daniel Dunbar                  options::OPT_trigraphs);
1229a3ff202ee4fb21728e930d5d029ba4925129912cDaniel Dunbar  if (!Args.getLastArg(options::OPT_std_EQ, options::OPT_ansi)) {
1230a3ff202ee4fb21728e930d5d029ba4925129912cDaniel Dunbar    // Honor -std-default.
1231a3ff202ee4fb21728e930d5d029ba4925129912cDaniel Dunbar    Args.AddAllArgsTranslated(CmdArgs, options::OPT_std_default_EQ,
1232a3ff202ee4fb21728e930d5d029ba4925129912cDaniel Dunbar                              "-std=", /*Joined=*/true);
1233a3ff202ee4fb21728e930d5d029ba4925129912cDaniel Dunbar  }
1234a3ff202ee4fb21728e930d5d029ba4925129912cDaniel Dunbar
1235a3ec60e0cf2a1916f479288998d31bd980b1a306Daniel Dunbar  if (Args.hasArg(options::OPT_v))
1236a3ec60e0cf2a1916f479288998d31bd980b1a306Daniel Dunbar    CmdArgs.push_back("-version");
1237a3ec60e0cf2a1916f479288998d31bd980b1a306Daniel Dunbar  if (Args.hasArg(options::OPT_pg))
1238a3ec60e0cf2a1916f479288998d31bd980b1a306Daniel Dunbar    CmdArgs.push_back("-p");
1239a3ec60e0cf2a1916f479288998d31bd980b1a306Daniel Dunbar  Args.AddLastArg(CmdArgs, options::OPT_p);
1240c21c485b4fb58ef5d55cf3e523263dd824a2ace4Daniel Dunbar
1241a3ec60e0cf2a1916f479288998d31bd980b1a306Daniel Dunbar  // The driver treats -fsyntax-only specially.
12422ba91575905a54f712a7f64304e56002e4882499Daniel Dunbar  if (getToolChain().getTriple().getArch() == llvm::Triple::arm ||
12432ba91575905a54f712a7f64304e56002e4882499Daniel Dunbar      getToolChain().getTriple().getArch() == llvm::Triple::thumb) {
12442ba91575905a54f712a7f64304e56002e4882499Daniel Dunbar    // Removes -fbuiltin-str{cat,cpy}; these aren't recognized by cc1 but are
12452ba91575905a54f712a7f64304e56002e4882499Daniel Dunbar    // used to inhibit the default -fno-builtin-str{cat,cpy}.
12462ba91575905a54f712a7f64304e56002e4882499Daniel Dunbar    //
12472ba91575905a54f712a7f64304e56002e4882499Daniel Dunbar    // FIXME: Should we grow a better way to deal with "removing" args?
12482ba91575905a54f712a7f64304e56002e4882499Daniel Dunbar    //
12492ba91575905a54f712a7f64304e56002e4882499Daniel Dunbar    // FIXME: Use iterator.
12502ba91575905a54f712a7f64304e56002e4882499Daniel Dunbar    for (ArgList::const_iterator it = Args.begin(),
12512ba91575905a54f712a7f64304e56002e4882499Daniel Dunbar           ie = Args.end(); it != ie; ++it) {
12522ba91575905a54f712a7f64304e56002e4882499Daniel Dunbar      const Arg *A = *it;
1253728a512753d85a6ccaae34e81385c8665c2de0e1Daniel Dunbar      if (A->getOption().matches(options::OPT_f_Group) ||
12542ba91575905a54f712a7f64304e56002e4882499Daniel Dunbar          A->getOption().matches(options::OPT_fsyntax_only)) {
12552ba91575905a54f712a7f64304e56002e4882499Daniel Dunbar        if (!A->getOption().matches(options::OPT_fbuiltin_strcat) &&
12562ba91575905a54f712a7f64304e56002e4882499Daniel Dunbar            !A->getOption().matches(options::OPT_fbuiltin_strcpy)) {
12572ba91575905a54f712a7f64304e56002e4882499Daniel Dunbar          A->claim();
12582ba91575905a54f712a7f64304e56002e4882499Daniel Dunbar          A->render(Args, CmdArgs);
12592ba91575905a54f712a7f64304e56002e4882499Daniel Dunbar        }
12602ba91575905a54f712a7f64304e56002e4882499Daniel Dunbar      }
12612ba91575905a54f712a7f64304e56002e4882499Daniel Dunbar    }
12622ba91575905a54f712a7f64304e56002e4882499Daniel Dunbar  } else
12632ba91575905a54f712a7f64304e56002e4882499Daniel Dunbar    Args.AddAllArgs(CmdArgs, options::OPT_f_Group, options::OPT_fsyntax_only);
1264c21c485b4fb58ef5d55cf3e523263dd824a2ace4Daniel Dunbar
1265a3ec60e0cf2a1916f479288998d31bd980b1a306Daniel Dunbar  Args.AddAllArgs(CmdArgs, options::OPT_undef);
1266a3ec60e0cf2a1916f479288998d31bd980b1a306Daniel Dunbar  if (Args.hasArg(options::OPT_Qn))
1267a3ec60e0cf2a1916f479288998d31bd980b1a306Daniel Dunbar    CmdArgs.push_back("-fno-ident");
1268c21c485b4fb58ef5d55cf3e523263dd824a2ace4Daniel Dunbar
1269a3ec60e0cf2a1916f479288998d31bd980b1a306Daniel Dunbar  // FIXME: This isn't correct.
1270a3ec60e0cf2a1916f479288998d31bd980b1a306Daniel Dunbar  //Args.AddLastArg(CmdArgs, options::OPT__help)
1271a3ec60e0cf2a1916f479288998d31bd980b1a306Daniel Dunbar  //Args.AddLastArg(CmdArgs, options::OPT__targetHelp)
1272a3ec60e0cf2a1916f479288998d31bd980b1a306Daniel Dunbar
1273a3ec60e0cf2a1916f479288998d31bd980b1a306Daniel Dunbar  CmdArgs.append(OutputArgs.begin(), OutputArgs.end());
1274a3ec60e0cf2a1916f479288998d31bd980b1a306Daniel Dunbar
1275a3ec60e0cf2a1916f479288998d31bd980b1a306Daniel Dunbar  // FIXME: Still don't get what is happening here. Investigate.
1276a3ec60e0cf2a1916f479288998d31bd980b1a306Daniel Dunbar  Args.AddAllArgs(CmdArgs, options::OPT__param);
1277a3ec60e0cf2a1916f479288998d31bd980b1a306Daniel Dunbar
1278a3ec60e0cf2a1916f479288998d31bd980b1a306Daniel Dunbar  if (Args.hasArg(options::OPT_fmudflap) ||
1279a3ec60e0cf2a1916f479288998d31bd980b1a306Daniel Dunbar      Args.hasArg(options::OPT_fmudflapth)) {
1280a3ec60e0cf2a1916f479288998d31bd980b1a306Daniel Dunbar    CmdArgs.push_back("-fno-builtin");
1281a3ec60e0cf2a1916f479288998d31bd980b1a306Daniel Dunbar    CmdArgs.push_back("-fno-merge-constants");
1282a3ec60e0cf2a1916f479288998d31bd980b1a306Daniel Dunbar  }
1283c21c485b4fb58ef5d55cf3e523263dd824a2ace4Daniel Dunbar
1284a3ec60e0cf2a1916f479288998d31bd980b1a306Daniel Dunbar  if (Args.hasArg(options::OPT_coverage)) {
1285a3ec60e0cf2a1916f479288998d31bd980b1a306Daniel Dunbar    CmdArgs.push_back("-fprofile-arcs");
1286a3ec60e0cf2a1916f479288998d31bd980b1a306Daniel Dunbar    CmdArgs.push_back("-ftest-coverage");
1287a3ec60e0cf2a1916f479288998d31bd980b1a306Daniel Dunbar  }
1288a3ec60e0cf2a1916f479288998d31bd980b1a306Daniel Dunbar
1289a3ec60e0cf2a1916f479288998d31bd980b1a306Daniel Dunbar  if (types::isCXX(Inputs[0].getType()))
1290a3ec60e0cf2a1916f479288998d31bd980b1a306Daniel Dunbar    CmdArgs.push_back("-D__private_extern__=extern");
1291a3ec60e0cf2a1916f479288998d31bd980b1a306Daniel Dunbar}
1292a3ec60e0cf2a1916f479288998d31bd980b1a306Daniel Dunbar
1293a3ec60e0cf2a1916f479288998d31bd980b1a306Daniel Dunbarvoid darwin::CC1::AddCPPOptionsArgs(const ArgList &Args, ArgStringList &CmdArgs,
1294a3ec60e0cf2a1916f479288998d31bd980b1a306Daniel Dunbar                                    const InputInfoList &Inputs,
1295a3ec60e0cf2a1916f479288998d31bd980b1a306Daniel Dunbar                                    const ArgStringList &OutputArgs) const {
1296a3ec60e0cf2a1916f479288998d31bd980b1a306Daniel Dunbar  // Derived from cpp_options
1297a3ec60e0cf2a1916f479288998d31bd980b1a306Daniel Dunbar  AddCPPUniqueOptionsArgs(Args, CmdArgs, Inputs);
1298c21c485b4fb58ef5d55cf3e523263dd824a2ace4Daniel Dunbar
1299a3ec60e0cf2a1916f479288998d31bd980b1a306Daniel Dunbar  CmdArgs.append(OutputArgs.begin(), OutputArgs.end());
1300a3ec60e0cf2a1916f479288998d31bd980b1a306Daniel Dunbar
1301a3ec60e0cf2a1916f479288998d31bd980b1a306Daniel Dunbar  AddCC1Args(Args, CmdArgs);
1302a3ec60e0cf2a1916f479288998d31bd980b1a306Daniel Dunbar
1303a3ec60e0cf2a1916f479288998d31bd980b1a306Daniel Dunbar  // NOTE: The code below has some commonality with cpp_options, but
1304a3ec60e0cf2a1916f479288998d31bd980b1a306Daniel Dunbar  // in classic gcc style ends up sending things in different
1305a3ec60e0cf2a1916f479288998d31bd980b1a306Daniel Dunbar  // orders. This may be a good merge candidate once we drop pedantic
1306a3ec60e0cf2a1916f479288998d31bd980b1a306Daniel Dunbar  // compatibility.
1307a3ec60e0cf2a1916f479288998d31bd980b1a306Daniel Dunbar
1308a3ec60e0cf2a1916f479288998d31bd980b1a306Daniel Dunbar  Args.AddAllArgs(CmdArgs, options::OPT_m_Group);
1309c21c485b4fb58ef5d55cf3e523263dd824a2ace4Daniel Dunbar  Args.AddAllArgs(CmdArgs, options::OPT_std_EQ, options::OPT_ansi,
1310a3ec60e0cf2a1916f479288998d31bd980b1a306Daniel Dunbar                  options::OPT_trigraphs);
1311a3ff202ee4fb21728e930d5d029ba4925129912cDaniel Dunbar  if (!Args.getLastArg(options::OPT_std_EQ, options::OPT_ansi)) {
1312a3ff202ee4fb21728e930d5d029ba4925129912cDaniel Dunbar    // Honor -std-default.
1313a3ff202ee4fb21728e930d5d029ba4925129912cDaniel Dunbar    Args.AddAllArgsTranslated(CmdArgs, options::OPT_std_default_EQ,
1314a3ff202ee4fb21728e930d5d029ba4925129912cDaniel Dunbar                              "-std=", /*Joined=*/true);
1315a3ff202ee4fb21728e930d5d029ba4925129912cDaniel Dunbar  }
1316a3ec60e0cf2a1916f479288998d31bd980b1a306Daniel Dunbar  Args.AddAllArgs(CmdArgs, options::OPT_W_Group, options::OPT_pedantic_Group);
1317a3ec60e0cf2a1916f479288998d31bd980b1a306Daniel Dunbar  Args.AddLastArg(CmdArgs, options::OPT_w);
1318c21c485b4fb58ef5d55cf3e523263dd824a2ace4Daniel Dunbar
1319a3ec60e0cf2a1916f479288998d31bd980b1a306Daniel Dunbar  // The driver treats -fsyntax-only specially.
1320a3ec60e0cf2a1916f479288998d31bd980b1a306Daniel Dunbar  Args.AddAllArgs(CmdArgs, options::OPT_f_Group, options::OPT_fsyntax_only);
1321a3ec60e0cf2a1916f479288998d31bd980b1a306Daniel Dunbar
1322a3ec60e0cf2a1916f479288998d31bd980b1a306Daniel Dunbar  if (Args.hasArg(options::OPT_g_Group) && !Args.hasArg(options::OPT_g0) &&
1323a3ec60e0cf2a1916f479288998d31bd980b1a306Daniel Dunbar      !Args.hasArg(options::OPT_fno_working_directory))
1324a3ec60e0cf2a1916f479288998d31bd980b1a306Daniel Dunbar    CmdArgs.push_back("-fworking-directory");
1325a3ec60e0cf2a1916f479288998d31bd980b1a306Daniel Dunbar
1326a3ec60e0cf2a1916f479288998d31bd980b1a306Daniel Dunbar  Args.AddAllArgs(CmdArgs, options::OPT_O);
1327a3ec60e0cf2a1916f479288998d31bd980b1a306Daniel Dunbar  Args.AddAllArgs(CmdArgs, options::OPT_undef);
1328a3ec60e0cf2a1916f479288998d31bd980b1a306Daniel Dunbar  if (Args.hasArg(options::OPT_save_temps))
1329a3ec60e0cf2a1916f479288998d31bd980b1a306Daniel Dunbar    CmdArgs.push_back("-fpch-preprocess");
1330a3ec60e0cf2a1916f479288998d31bd980b1a306Daniel Dunbar}
1331a3ec60e0cf2a1916f479288998d31bd980b1a306Daniel Dunbar
1332c21c485b4fb58ef5d55cf3e523263dd824a2ace4Daniel Dunbarvoid darwin::CC1::AddCPPUniqueOptionsArgs(const ArgList &Args,
1333a3ec60e0cf2a1916f479288998d31bd980b1a306Daniel Dunbar                                          ArgStringList &CmdArgs,
13341eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump                                          const InputInfoList &Inputs) const {
1335a3ec60e0cf2a1916f479288998d31bd980b1a306Daniel Dunbar  const Driver &D = getToolChain().getHost().getDriver();
1336a3ec60e0cf2a1916f479288998d31bd980b1a306Daniel Dunbar
133788a3d6cf5ebab81614f89ba48a8d89023270637aDaniel Dunbar  CheckPreprocessingOptions(D, Args);
133888a3d6cf5ebab81614f89ba48a8d89023270637aDaniel Dunbar
1339a3ec60e0cf2a1916f479288998d31bd980b1a306Daniel Dunbar  // Derived from cpp_unique_options.
134088a3d6cf5ebab81614f89ba48a8d89023270637aDaniel Dunbar  // -{C,CC} only with -E is checked in CheckPreprocessingOptions().
134188a3d6cf5ebab81614f89ba48a8d89023270637aDaniel Dunbar  Args.AddLastArg(CmdArgs, options::OPT_C);
134288a3d6cf5ebab81614f89ba48a8d89023270637aDaniel Dunbar  Args.AddLastArg(CmdArgs, options::OPT_CC);
1343a3ec60e0cf2a1916f479288998d31bd980b1a306Daniel Dunbar  if (!Args.hasArg(options::OPT_Q))
1344a3ec60e0cf2a1916f479288998d31bd980b1a306Daniel Dunbar    CmdArgs.push_back("-quiet");
1345a3ec60e0cf2a1916f479288998d31bd980b1a306Daniel Dunbar  Args.AddAllArgs(CmdArgs, options::OPT_nostdinc);
1346a3ec60e0cf2a1916f479288998d31bd980b1a306Daniel Dunbar  Args.AddLastArg(CmdArgs, options::OPT_v);
1347a3ec60e0cf2a1916f479288998d31bd980b1a306Daniel Dunbar  Args.AddAllArgs(CmdArgs, options::OPT_I_Group, options::OPT_F);
1348a3ec60e0cf2a1916f479288998d31bd980b1a306Daniel Dunbar  Args.AddLastArg(CmdArgs, options::OPT_P);
1349a3ec60e0cf2a1916f479288998d31bd980b1a306Daniel Dunbar
1350a3ec60e0cf2a1916f479288998d31bd980b1a306Daniel Dunbar  // FIXME: Handle %I properly.
1351a3ec60e0cf2a1916f479288998d31bd980b1a306Daniel Dunbar  if (getToolChain().getArchName() == "x86_64") {
1352a3ec60e0cf2a1916f479288998d31bd980b1a306Daniel Dunbar    CmdArgs.push_back("-imultilib");
1353a3ec60e0cf2a1916f479288998d31bd980b1a306Daniel Dunbar    CmdArgs.push_back("x86_64");
1354a3ec60e0cf2a1916f479288998d31bd980b1a306Daniel Dunbar  }
1355a3ec60e0cf2a1916f479288998d31bd980b1a306Daniel Dunbar
1356a3ec60e0cf2a1916f479288998d31bd980b1a306Daniel Dunbar  if (Args.hasArg(options::OPT_MD)) {
1357a3ec60e0cf2a1916f479288998d31bd980b1a306Daniel Dunbar    CmdArgs.push_back("-MD");
1358a5a7bd0de7b6b80212095195a055a4a43f21d4b2Daniel Dunbar    CmdArgs.push_back(darwin::CC1::getDependencyFileName(Args, Inputs));
1359a3ec60e0cf2a1916f479288998d31bd980b1a306Daniel Dunbar  }
1360a3ec60e0cf2a1916f479288998d31bd980b1a306Daniel Dunbar
1361a3ec60e0cf2a1916f479288998d31bd980b1a306Daniel Dunbar  if (Args.hasArg(options::OPT_MMD)) {
1362a3ec60e0cf2a1916f479288998d31bd980b1a306Daniel Dunbar    CmdArgs.push_back("-MMD");
1363a5a7bd0de7b6b80212095195a055a4a43f21d4b2Daniel Dunbar    CmdArgs.push_back(darwin::CC1::getDependencyFileName(Args, Inputs));
1364a3ec60e0cf2a1916f479288998d31bd980b1a306Daniel Dunbar  }
1365a3ec60e0cf2a1916f479288998d31bd980b1a306Daniel Dunbar
1366a3ec60e0cf2a1916f479288998d31bd980b1a306Daniel Dunbar  Args.AddLastArg(CmdArgs, options::OPT_M);
1367a3ec60e0cf2a1916f479288998d31bd980b1a306Daniel Dunbar  Args.AddLastArg(CmdArgs, options::OPT_MM);
1368a3ec60e0cf2a1916f479288998d31bd980b1a306Daniel Dunbar  Args.AddAllArgs(CmdArgs, options::OPT_MF);
1369a3ec60e0cf2a1916f479288998d31bd980b1a306Daniel Dunbar  Args.AddLastArg(CmdArgs, options::OPT_MG);
1370a3ec60e0cf2a1916f479288998d31bd980b1a306Daniel Dunbar  Args.AddLastArg(CmdArgs, options::OPT_MP);
1371a3ec60e0cf2a1916f479288998d31bd980b1a306Daniel Dunbar  Args.AddAllArgs(CmdArgs, options::OPT_MQ);
1372a3ec60e0cf2a1916f479288998d31bd980b1a306Daniel Dunbar  Args.AddAllArgs(CmdArgs, options::OPT_MT);
1373a3ec60e0cf2a1916f479288998d31bd980b1a306Daniel Dunbar  if (!Args.hasArg(options::OPT_M) && !Args.hasArg(options::OPT_MM) &&
1374a3ec60e0cf2a1916f479288998d31bd980b1a306Daniel Dunbar      (Args.hasArg(options::OPT_MD) || Args.hasArg(options::OPT_MMD))) {
1375a3ec60e0cf2a1916f479288998d31bd980b1a306Daniel Dunbar    if (Arg *OutputOpt = Args.getLastArg(options::OPT_o)) {
1376a3ec60e0cf2a1916f479288998d31bd980b1a306Daniel Dunbar      CmdArgs.push_back("-MQ");
1377a3ec60e0cf2a1916f479288998d31bd980b1a306Daniel Dunbar      CmdArgs.push_back(OutputOpt->getValue(Args));
1378a3ec60e0cf2a1916f479288998d31bd980b1a306Daniel Dunbar    }
1379a3ec60e0cf2a1916f479288998d31bd980b1a306Daniel Dunbar  }
1380a3ec60e0cf2a1916f479288998d31bd980b1a306Daniel Dunbar
1381a3ec60e0cf2a1916f479288998d31bd980b1a306Daniel Dunbar  Args.AddLastArg(CmdArgs, options::OPT_remap);
1382a3ec60e0cf2a1916f479288998d31bd980b1a306Daniel Dunbar  if (Args.hasArg(options::OPT_g3))
1383a3ec60e0cf2a1916f479288998d31bd980b1a306Daniel Dunbar    CmdArgs.push_back("-dD");
1384a3ec60e0cf2a1916f479288998d31bd980b1a306Daniel Dunbar  Args.AddLastArg(CmdArgs, options::OPT_H);
1385a3ec60e0cf2a1916f479288998d31bd980b1a306Daniel Dunbar
1386a3ec60e0cf2a1916f479288998d31bd980b1a306Daniel Dunbar  AddCPPArgs(Args, CmdArgs);
1387a3ec60e0cf2a1916f479288998d31bd980b1a306Daniel Dunbar
1388a3ec60e0cf2a1916f479288998d31bd980b1a306Daniel Dunbar  Args.AddAllArgs(CmdArgs, options::OPT_D, options::OPT_U, options::OPT_A);
1389a3ec60e0cf2a1916f479288998d31bd980b1a306Daniel Dunbar  Args.AddAllArgs(CmdArgs, options::OPT_i_Group);
1390a3ec60e0cf2a1916f479288998d31bd980b1a306Daniel Dunbar
1391a3ec60e0cf2a1916f479288998d31bd980b1a306Daniel Dunbar  for (InputInfoList::const_iterator
1392a3ec60e0cf2a1916f479288998d31bd980b1a306Daniel Dunbar         it = Inputs.begin(), ie = Inputs.end(); it != ie; ++it) {
1393a3ec60e0cf2a1916f479288998d31bd980b1a306Daniel Dunbar    const InputInfo &II = *it;
1394c21c485b4fb58ef5d55cf3e523263dd824a2ace4Daniel Dunbar
1395a3ec60e0cf2a1916f479288998d31bd980b1a306Daniel Dunbar    if (II.isPipe())
1396a3ec60e0cf2a1916f479288998d31bd980b1a306Daniel Dunbar      CmdArgs.push_back("-");
1397a3ec60e0cf2a1916f479288998d31bd980b1a306Daniel Dunbar    else
1398a3ec60e0cf2a1916f479288998d31bd980b1a306Daniel Dunbar      CmdArgs.push_back(II.getFilename());
1399a3ec60e0cf2a1916f479288998d31bd980b1a306Daniel Dunbar  }
1400a3ec60e0cf2a1916f479288998d31bd980b1a306Daniel Dunbar
1401a3ec60e0cf2a1916f479288998d31bd980b1a306Daniel Dunbar  Args.AddAllArgValues(CmdArgs, options::OPT_Wp_COMMA,
1402a3ec60e0cf2a1916f479288998d31bd980b1a306Daniel Dunbar                       options::OPT_Xpreprocessor);
1403a3ec60e0cf2a1916f479288998d31bd980b1a306Daniel Dunbar
1404a3ec60e0cf2a1916f479288998d31bd980b1a306Daniel Dunbar  if (Args.hasArg(options::OPT_fmudflap)) {
1405a3ec60e0cf2a1916f479288998d31bd980b1a306Daniel Dunbar    CmdArgs.push_back("-D_MUDFLAP");
1406a3ec60e0cf2a1916f479288998d31bd980b1a306Daniel Dunbar    CmdArgs.push_back("-include");
1407a3ec60e0cf2a1916f479288998d31bd980b1a306Daniel Dunbar    CmdArgs.push_back("mf-runtime.h");
1408a3ec60e0cf2a1916f479288998d31bd980b1a306Daniel Dunbar  }
1409a3ec60e0cf2a1916f479288998d31bd980b1a306Daniel Dunbar
1410a3ec60e0cf2a1916f479288998d31bd980b1a306Daniel Dunbar  if (Args.hasArg(options::OPT_fmudflapth)) {
1411a3ec60e0cf2a1916f479288998d31bd980b1a306Daniel Dunbar    CmdArgs.push_back("-D_MUDFLAP");
1412a3ec60e0cf2a1916f479288998d31bd980b1a306Daniel Dunbar    CmdArgs.push_back("-D_MUDFLAPTH");
1413a3ec60e0cf2a1916f479288998d31bd980b1a306Daniel Dunbar    CmdArgs.push_back("-include");
1414a3ec60e0cf2a1916f479288998d31bd980b1a306Daniel Dunbar    CmdArgs.push_back("mf-runtime.h");
1415a3ec60e0cf2a1916f479288998d31bd980b1a306Daniel Dunbar  }
1416a3ec60e0cf2a1916f479288998d31bd980b1a306Daniel Dunbar}
1417a3ec60e0cf2a1916f479288998d31bd980b1a306Daniel Dunbar
1418c21c485b4fb58ef5d55cf3e523263dd824a2ace4Daniel Dunbarvoid darwin::CC1::AddCPPArgs(const ArgList &Args,
1419a3ec60e0cf2a1916f479288998d31bd980b1a306Daniel Dunbar                             ArgStringList &CmdArgs) const {
1420a3ec60e0cf2a1916f479288998d31bd980b1a306Daniel Dunbar  // Derived from cpp spec.
1421a3ec60e0cf2a1916f479288998d31bd980b1a306Daniel Dunbar
1422a3ec60e0cf2a1916f479288998d31bd980b1a306Daniel Dunbar  if (Args.hasArg(options::OPT_static)) {
1423a3ec60e0cf2a1916f479288998d31bd980b1a306Daniel Dunbar    // The gcc spec is broken here, it refers to dynamic but
1424a3ec60e0cf2a1916f479288998d31bd980b1a306Daniel Dunbar    // that has been translated. Start by being bug compatible.
1425c21c485b4fb58ef5d55cf3e523263dd824a2ace4Daniel Dunbar
1426a3ec60e0cf2a1916f479288998d31bd980b1a306Daniel Dunbar    // if (!Args.hasArg(arglist.parser.dynamicOption))
1427a3ec60e0cf2a1916f479288998d31bd980b1a306Daniel Dunbar    CmdArgs.push_back("-D__STATIC__");
1428a3ec60e0cf2a1916f479288998d31bd980b1a306Daniel Dunbar  } else
1429a3ec60e0cf2a1916f479288998d31bd980b1a306Daniel Dunbar    CmdArgs.push_back("-D__DYNAMIC__");
1430a3ec60e0cf2a1916f479288998d31bd980b1a306Daniel Dunbar
1431a3ec60e0cf2a1916f479288998d31bd980b1a306Daniel Dunbar  if (Args.hasArg(options::OPT_pthread))
1432a3ec60e0cf2a1916f479288998d31bd980b1a306Daniel Dunbar    CmdArgs.push_back("-D_REENTRANT");
1433a3ec60e0cf2a1916f479288998d31bd980b1a306Daniel Dunbar}
1434a3ec60e0cf2a1916f479288998d31bd980b1a306Daniel Dunbar
143540f1265ebd42ece3e7f7917319b56012e8e2bce2Daniel Dunbarvoid darwin::Preprocess::ConstructJob(Compilation &C, const JobAction &JA,
1436c21c485b4fb58ef5d55cf3e523263dd824a2ace4Daniel Dunbar                                      Job &Dest, const InputInfo &Output,
1437c21c485b4fb58ef5d55cf3e523263dd824a2ace4Daniel Dunbar                                      const InputInfoList &Inputs,
1438c21c485b4fb58ef5d55cf3e523263dd824a2ace4Daniel Dunbar                                      const ArgList &Args,
143940f1265ebd42ece3e7f7917319b56012e8e2bce2Daniel Dunbar                                      const char *LinkingOutput) const {
144040f1265ebd42ece3e7f7917319b56012e8e2bce2Daniel Dunbar  ArgStringList CmdArgs;
144140f1265ebd42ece3e7f7917319b56012e8e2bce2Daniel Dunbar
144240f1265ebd42ece3e7f7917319b56012e8e2bce2Daniel Dunbar  assert(Inputs.size() == 1 && "Unexpected number of inputs!");
144340f1265ebd42ece3e7f7917319b56012e8e2bce2Daniel Dunbar
144440f1265ebd42ece3e7f7917319b56012e8e2bce2Daniel Dunbar  CmdArgs.push_back("-E");
144540f1265ebd42ece3e7f7917319b56012e8e2bce2Daniel Dunbar
144640f1265ebd42ece3e7f7917319b56012e8e2bce2Daniel Dunbar  if (Args.hasArg(options::OPT_traditional) ||
144740f1265ebd42ece3e7f7917319b56012e8e2bce2Daniel Dunbar      Args.hasArg(options::OPT_traditional_cpp))
144840f1265ebd42ece3e7f7917319b56012e8e2bce2Daniel Dunbar    CmdArgs.push_back("-traditional-cpp");
1449c21c485b4fb58ef5d55cf3e523263dd824a2ace4Daniel Dunbar
145040f1265ebd42ece3e7f7917319b56012e8e2bce2Daniel Dunbar  ArgStringList OutputArgs;
145140f1265ebd42ece3e7f7917319b56012e8e2bce2Daniel Dunbar  if (Output.isFilename()) {
145240f1265ebd42ece3e7f7917319b56012e8e2bce2Daniel Dunbar    OutputArgs.push_back("-o");
145340f1265ebd42ece3e7f7917319b56012e8e2bce2Daniel Dunbar    OutputArgs.push_back(Output.getFilename());
145440f1265ebd42ece3e7f7917319b56012e8e2bce2Daniel Dunbar  } else {
145540f1265ebd42ece3e7f7917319b56012e8e2bce2Daniel Dunbar    assert(Output.isPipe() && "Unexpected CC1 output.");
145640f1265ebd42ece3e7f7917319b56012e8e2bce2Daniel Dunbar  }
145740f1265ebd42ece3e7f7917319b56012e8e2bce2Daniel Dunbar
14589120f179fd2e354f067e4ef2c76dcf3fc4db8a16Daniel Dunbar  if (Args.hasArg(options::OPT_E)) {
14599120f179fd2e354f067e4ef2c76dcf3fc4db8a16Daniel Dunbar    AddCPPOptionsArgs(Args, CmdArgs, Inputs, OutputArgs);
14609120f179fd2e354f067e4ef2c76dcf3fc4db8a16Daniel Dunbar  } else {
14619120f179fd2e354f067e4ef2c76dcf3fc4db8a16Daniel Dunbar    AddCPPOptionsArgs(Args, CmdArgs, Inputs, ArgStringList());
14629120f179fd2e354f067e4ef2c76dcf3fc4db8a16Daniel Dunbar    CmdArgs.append(OutputArgs.begin(), OutputArgs.end());
14639120f179fd2e354f067e4ef2c76dcf3fc4db8a16Daniel Dunbar  }
1464c21c485b4fb58ef5d55cf3e523263dd824a2ace4Daniel Dunbar
14658a2073a85670a13b0bcc1726bc7f80d458f8245bDaniel Dunbar  Args.AddAllArgs(CmdArgs, options::OPT_d_Group);
14668a2073a85670a13b0bcc1726bc7f80d458f8245bDaniel Dunbar
146740f1265ebd42ece3e7f7917319b56012e8e2bce2Daniel Dunbar  const char *CC1Name = getCC1Name(Inputs[0].getType());
1468c21c485b4fb58ef5d55cf3e523263dd824a2ace4Daniel Dunbar  const char *Exec =
14695ed34f4c58b6ad4e21038d713c1fae31a6146ff5Daniel Dunbar    Args.MakeArgString(getToolChain().GetProgramPath(C, CC1Name));
1470cae087e164e94e4286c11bf694dd0ff88f295302Daniel Dunbar  Dest.addCommand(new Command(JA, Exec, CmdArgs));
147140f1265ebd42ece3e7f7917319b56012e8e2bce2Daniel Dunbar}
147240f1265ebd42ece3e7f7917319b56012e8e2bce2Daniel Dunbar
147340f1265ebd42ece3e7f7917319b56012e8e2bce2Daniel Dunbarvoid darwin::Compile::ConstructJob(Compilation &C, const JobAction &JA,
1474c21c485b4fb58ef5d55cf3e523263dd824a2ace4Daniel Dunbar                                   Job &Dest, const InputInfo &Output,
1475c21c485b4fb58ef5d55cf3e523263dd824a2ace4Daniel Dunbar                                   const InputInfoList &Inputs,
1476c21c485b4fb58ef5d55cf3e523263dd824a2ace4Daniel Dunbar                                   const ArgList &Args,
147740f1265ebd42ece3e7f7917319b56012e8e2bce2Daniel Dunbar                                   const char *LinkingOutput) const {
147840f1265ebd42ece3e7f7917319b56012e8e2bce2Daniel Dunbar  const Driver &D = getToolChain().getHost().getDriver();
147940f1265ebd42ece3e7f7917319b56012e8e2bce2Daniel Dunbar  ArgStringList CmdArgs;
148040f1265ebd42ece3e7f7917319b56012e8e2bce2Daniel Dunbar
148140f1265ebd42ece3e7f7917319b56012e8e2bce2Daniel Dunbar  assert(Inputs.size() == 1 && "Unexpected number of inputs!");
148240f1265ebd42ece3e7f7917319b56012e8e2bce2Daniel Dunbar
148340f1265ebd42ece3e7f7917319b56012e8e2bce2Daniel Dunbar  types::ID InputType = Inputs[0].getType();
148440f1265ebd42ece3e7f7917319b56012e8e2bce2Daniel Dunbar  const Arg *A;
1485ceb5c5b7f67a30fae305d1d19b478b623e4fbcedEli Friedman  if ((A = Args.getLastArg(options::OPT_traditional)))
148640f1265ebd42ece3e7f7917319b56012e8e2bce2Daniel Dunbar    D.Diag(clang::diag::err_drv_argument_only_allowed_with)
148740f1265ebd42ece3e7f7917319b56012e8e2bce2Daniel Dunbar      << A->getAsString(Args) << "-E";
148840f1265ebd42ece3e7f7917319b56012e8e2bce2Daniel Dunbar
148940f1265ebd42ece3e7f7917319b56012e8e2bce2Daniel Dunbar  if (Output.getType() == types::TY_LLVMAsm)
149040f1265ebd42ece3e7f7917319b56012e8e2bce2Daniel Dunbar    CmdArgs.push_back("-emit-llvm");
149140f1265ebd42ece3e7f7917319b56012e8e2bce2Daniel Dunbar  else if (Output.getType() == types::TY_LLVMBC)
149240f1265ebd42ece3e7f7917319b56012e8e2bce2Daniel Dunbar    CmdArgs.push_back("-emit-llvm-bc");
14935915fbf310e171c4cd3c2af05e9de360c0fa988aDaniel Dunbar  else if (Output.getType() == types::TY_AST)
14945915fbf310e171c4cd3c2af05e9de360c0fa988aDaniel Dunbar    D.Diag(clang::diag::err_drv_no_ast_support)
1495881376467c46c5c6cc16fa6790271c2c22e1d4f1Daniel Dunbar      << getToolChain().getTripleString();
149640f1265ebd42ece3e7f7917319b56012e8e2bce2Daniel Dunbar
149740f1265ebd42ece3e7f7917319b56012e8e2bce2Daniel Dunbar  ArgStringList OutputArgs;
149840f1265ebd42ece3e7f7917319b56012e8e2bce2Daniel Dunbar  if (Output.getType() != types::TY_PCH) {
149940f1265ebd42ece3e7f7917319b56012e8e2bce2Daniel Dunbar    OutputArgs.push_back("-o");
150040f1265ebd42ece3e7f7917319b56012e8e2bce2Daniel Dunbar    if (Output.isPipe())
150140f1265ebd42ece3e7f7917319b56012e8e2bce2Daniel Dunbar      OutputArgs.push_back("-");
150240f1265ebd42ece3e7f7917319b56012e8e2bce2Daniel Dunbar    else if (Output.isNothing())
150340f1265ebd42ece3e7f7917319b56012e8e2bce2Daniel Dunbar      OutputArgs.push_back("/dev/null");
150440f1265ebd42ece3e7f7917319b56012e8e2bce2Daniel Dunbar    else
150540f1265ebd42ece3e7f7917319b56012e8e2bce2Daniel Dunbar      OutputArgs.push_back(Output.getFilename());
150640f1265ebd42ece3e7f7917319b56012e8e2bce2Daniel Dunbar  }
150740f1265ebd42ece3e7f7917319b56012e8e2bce2Daniel Dunbar
150840f1265ebd42ece3e7f7917319b56012e8e2bce2Daniel Dunbar  // There is no need for this level of compatibility, but it makes
150940f1265ebd42ece3e7f7917319b56012e8e2bce2Daniel Dunbar  // diffing easier.
151040f1265ebd42ece3e7f7917319b56012e8e2bce2Daniel Dunbar  bool OutputArgsEarly = (Args.hasArg(options::OPT_fsyntax_only) ||
151140f1265ebd42ece3e7f7917319b56012e8e2bce2Daniel Dunbar                          Args.hasArg(options::OPT_S));
151240f1265ebd42ece3e7f7917319b56012e8e2bce2Daniel Dunbar
151340f1265ebd42ece3e7f7917319b56012e8e2bce2Daniel Dunbar  if (types::getPreprocessedType(InputType) != types::TY_INVALID) {
1514a3ec60e0cf2a1916f479288998d31bd980b1a306Daniel Dunbar    AddCPPUniqueOptionsArgs(Args, CmdArgs, Inputs);
151540f1265ebd42ece3e7f7917319b56012e8e2bce2Daniel Dunbar    if (OutputArgsEarly) {
151640f1265ebd42ece3e7f7917319b56012e8e2bce2Daniel Dunbar      AddCC1OptionsArgs(Args, CmdArgs, Inputs, OutputArgs);
151740f1265ebd42ece3e7f7917319b56012e8e2bce2Daniel Dunbar    } else {
151840f1265ebd42ece3e7f7917319b56012e8e2bce2Daniel Dunbar      AddCC1OptionsArgs(Args, CmdArgs, Inputs, ArgStringList());
151940f1265ebd42ece3e7f7917319b56012e8e2bce2Daniel Dunbar      CmdArgs.append(OutputArgs.begin(), OutputArgs.end());
152040f1265ebd42ece3e7f7917319b56012e8e2bce2Daniel Dunbar    }
152140f1265ebd42ece3e7f7917319b56012e8e2bce2Daniel Dunbar  } else {
152240f1265ebd42ece3e7f7917319b56012e8e2bce2Daniel Dunbar    CmdArgs.push_back("-fpreprocessed");
1523c21c485b4fb58ef5d55cf3e523263dd824a2ace4Daniel Dunbar
152440f1265ebd42ece3e7f7917319b56012e8e2bce2Daniel Dunbar    for (InputInfoList::const_iterator
152540f1265ebd42ece3e7f7917319b56012e8e2bce2Daniel Dunbar           it = Inputs.begin(), ie = Inputs.end(); it != ie; ++it) {
152640f1265ebd42ece3e7f7917319b56012e8e2bce2Daniel Dunbar      const InputInfo &II = *it;
152740f1265ebd42ece3e7f7917319b56012e8e2bce2Daniel Dunbar
15285915fbf310e171c4cd3c2af05e9de360c0fa988aDaniel Dunbar      // Reject AST inputs.
15295915fbf310e171c4cd3c2af05e9de360c0fa988aDaniel Dunbar      if (II.getType() == types::TY_AST) {
15305915fbf310e171c4cd3c2af05e9de360c0fa988aDaniel Dunbar        D.Diag(clang::diag::err_drv_no_ast_support)
1531881376467c46c5c6cc16fa6790271c2c22e1d4f1Daniel Dunbar          << getToolChain().getTripleString();
15325915fbf310e171c4cd3c2af05e9de360c0fa988aDaniel Dunbar        return;
15335915fbf310e171c4cd3c2af05e9de360c0fa988aDaniel Dunbar      }
15345915fbf310e171c4cd3c2af05e9de360c0fa988aDaniel Dunbar
153540f1265ebd42ece3e7f7917319b56012e8e2bce2Daniel Dunbar      if (II.isPipe())
153640f1265ebd42ece3e7f7917319b56012e8e2bce2Daniel Dunbar        CmdArgs.push_back("-");
153740f1265ebd42ece3e7f7917319b56012e8e2bce2Daniel Dunbar      else
153840f1265ebd42ece3e7f7917319b56012e8e2bce2Daniel Dunbar        CmdArgs.push_back(II.getFilename());
153940f1265ebd42ece3e7f7917319b56012e8e2bce2Daniel Dunbar    }
154040f1265ebd42ece3e7f7917319b56012e8e2bce2Daniel Dunbar
154140f1265ebd42ece3e7f7917319b56012e8e2bce2Daniel Dunbar    if (OutputArgsEarly) {
154240f1265ebd42ece3e7f7917319b56012e8e2bce2Daniel Dunbar      AddCC1OptionsArgs(Args, CmdArgs, Inputs, OutputArgs);
154340f1265ebd42ece3e7f7917319b56012e8e2bce2Daniel Dunbar    } else {
154440f1265ebd42ece3e7f7917319b56012e8e2bce2Daniel Dunbar      AddCC1OptionsArgs(Args, CmdArgs, Inputs, ArgStringList());
154540f1265ebd42ece3e7f7917319b56012e8e2bce2Daniel Dunbar      CmdArgs.append(OutputArgs.begin(), OutputArgs.end());
154640f1265ebd42ece3e7f7917319b56012e8e2bce2Daniel Dunbar    }
154740f1265ebd42ece3e7f7917319b56012e8e2bce2Daniel Dunbar  }
1548c21c485b4fb58ef5d55cf3e523263dd824a2ace4Daniel Dunbar
154940f1265ebd42ece3e7f7917319b56012e8e2bce2Daniel Dunbar  if (Output.getType() == types::TY_PCH) {
155040f1265ebd42ece3e7f7917319b56012e8e2bce2Daniel Dunbar    assert(Output.isFilename() && "Invalid PCH output.");
155140f1265ebd42ece3e7f7917319b56012e8e2bce2Daniel Dunbar
155240f1265ebd42ece3e7f7917319b56012e8e2bce2Daniel Dunbar    CmdArgs.push_back("-o");
155340f1265ebd42ece3e7f7917319b56012e8e2bce2Daniel Dunbar    // NOTE: gcc uses a temp .s file for this, but there doesn't seem
155440f1265ebd42ece3e7f7917319b56012e8e2bce2Daniel Dunbar    // to be a good reason.
155540f1265ebd42ece3e7f7917319b56012e8e2bce2Daniel Dunbar    CmdArgs.push_back("/dev/null");
1556c21c485b4fb58ef5d55cf3e523263dd824a2ace4Daniel Dunbar
155740f1265ebd42ece3e7f7917319b56012e8e2bce2Daniel Dunbar    CmdArgs.push_back("--output-pch=");
155840f1265ebd42ece3e7f7917319b56012e8e2bce2Daniel Dunbar    CmdArgs.push_back(Output.getFilename());
1559c21c485b4fb58ef5d55cf3e523263dd824a2ace4Daniel Dunbar  }
156040f1265ebd42ece3e7f7917319b56012e8e2bce2Daniel Dunbar
156140f1265ebd42ece3e7f7917319b56012e8e2bce2Daniel Dunbar  const char *CC1Name = getCC1Name(Inputs[0].getType());
1562c21c485b4fb58ef5d55cf3e523263dd824a2ace4Daniel Dunbar  const char *Exec =
15635ed34f4c58b6ad4e21038d713c1fae31a6146ff5Daniel Dunbar    Args.MakeArgString(getToolChain().GetProgramPath(C, CC1Name));
1564cae087e164e94e4286c11bf694dd0ff88f295302Daniel Dunbar  Dest.addCommand(new Command(JA, Exec, CmdArgs));
156540f1265ebd42ece3e7f7917319b56012e8e2bce2Daniel Dunbar}
156640f1265ebd42ece3e7f7917319b56012e8e2bce2Daniel Dunbar
15678cac5f7e1ce63dd77ee0fb4ef68f9fa804f41ea6Daniel Dunbarvoid darwin::Assemble::ConstructJob(Compilation &C, const JobAction &JA,
1568c21c485b4fb58ef5d55cf3e523263dd824a2ace4Daniel Dunbar                                    Job &Dest, const InputInfo &Output,
1569c21c485b4fb58ef5d55cf3e523263dd824a2ace4Daniel Dunbar                                    const InputInfoList &Inputs,
1570c21c485b4fb58ef5d55cf3e523263dd824a2ace4Daniel Dunbar                                    const ArgList &Args,
15718cac5f7e1ce63dd77ee0fb4ef68f9fa804f41ea6Daniel Dunbar                                    const char *LinkingOutput) const {
15728cac5f7e1ce63dd77ee0fb4ef68f9fa804f41ea6Daniel Dunbar  ArgStringList CmdArgs;
15738cac5f7e1ce63dd77ee0fb4ef68f9fa804f41ea6Daniel Dunbar
15748cac5f7e1ce63dd77ee0fb4ef68f9fa804f41ea6Daniel Dunbar  assert(Inputs.size() == 1 && "Unexpected number of inputs.");
15758cac5f7e1ce63dd77ee0fb4ef68f9fa804f41ea6Daniel Dunbar  const InputInfo &Input = Inputs[0];
15768cac5f7e1ce63dd77ee0fb4ef68f9fa804f41ea6Daniel Dunbar
15778cac5f7e1ce63dd77ee0fb4ef68f9fa804f41ea6Daniel Dunbar  // Bit of a hack, this is only used for original inputs.
1578c21c485b4fb58ef5d55cf3e523263dd824a2ace4Daniel Dunbar  //
15798e4fea6750dbac032c172f3279c63b7815b7423eDaniel Dunbar  // FIXME: This is broken for preprocessed .s inputs.
15808cac5f7e1ce63dd77ee0fb4ef68f9fa804f41ea6Daniel Dunbar  if (Input.isFilename() &&
15818e4fea6750dbac032c172f3279c63b7815b7423eDaniel Dunbar      strcmp(Input.getFilename(), Input.getBaseInput()) == 0) {
15828e4fea6750dbac032c172f3279c63b7815b7423eDaniel Dunbar    if (Args.hasArg(options::OPT_gstabs))
15838e4fea6750dbac032c172f3279c63b7815b7423eDaniel Dunbar      CmdArgs.push_back("--gstabs");
15848e4fea6750dbac032c172f3279c63b7815b7423eDaniel Dunbar    else if (Args.hasArg(options::OPT_g_Group))
15858e4fea6750dbac032c172f3279c63b7815b7423eDaniel Dunbar      CmdArgs.push_back("--gdwarf2");
15868e4fea6750dbac032c172f3279c63b7815b7423eDaniel Dunbar  }
1587c21c485b4fb58ef5d55cf3e523263dd824a2ace4Daniel Dunbar
15888cac5f7e1ce63dd77ee0fb4ef68f9fa804f41ea6Daniel Dunbar  // Derived from asm spec.
1589cc6f803f98fa6ba9a9c366400210448516d01b3cDaniel Dunbar  AddDarwinArch(Args, CmdArgs);
1590cc6f803f98fa6ba9a9c366400210448516d01b3cDaniel Dunbar
1591cc6f803f98fa6ba9a9c366400210448516d01b3cDaniel Dunbar  if (!getDarwinToolChain().isIPhone() ||
1592cc6f803f98fa6ba9a9c366400210448516d01b3cDaniel Dunbar      Args.hasArg(options::OPT_force__cpusubtype__ALL))
1593cc6f803f98fa6ba9a9c366400210448516d01b3cDaniel Dunbar    CmdArgs.push_back("-force_cpusubtype_ALL");
15948cac5f7e1ce63dd77ee0fb4ef68f9fa804f41ea6Daniel Dunbar
15950e2679d29be70186fc1197a1484948ed239922baDaniel Dunbar  if (getToolChain().getTriple().getArch() != llvm::Triple::x86_64 &&
15960e2679d29be70186fc1197a1484948ed239922baDaniel Dunbar      (Args.hasArg(options::OPT_mkernel) ||
15978cac5f7e1ce63dd77ee0fb4ef68f9fa804f41ea6Daniel Dunbar       Args.hasArg(options::OPT_static) ||
15980e2679d29be70186fc1197a1484948ed239922baDaniel Dunbar       Args.hasArg(options::OPT_fapple_kext)))
1599c21c485b4fb58ef5d55cf3e523263dd824a2ace4Daniel Dunbar    CmdArgs.push_back("-static");
1600c21c485b4fb58ef5d55cf3e523263dd824a2ace4Daniel Dunbar
16018cac5f7e1ce63dd77ee0fb4ef68f9fa804f41ea6Daniel Dunbar  Args.AddAllArgValues(CmdArgs, options::OPT_Wa_COMMA,
16028cac5f7e1ce63dd77ee0fb4ef68f9fa804f41ea6Daniel Dunbar                       options::OPT_Xassembler);
16038cac5f7e1ce63dd77ee0fb4ef68f9fa804f41ea6Daniel Dunbar
16048cac5f7e1ce63dd77ee0fb4ef68f9fa804f41ea6Daniel Dunbar  assert(Output.isFilename() && "Unexpected lipo output.");
16058cac5f7e1ce63dd77ee0fb4ef68f9fa804f41ea6Daniel Dunbar  CmdArgs.push_back("-o");
16068cac5f7e1ce63dd77ee0fb4ef68f9fa804f41ea6Daniel Dunbar  CmdArgs.push_back(Output.getFilename());
16078cac5f7e1ce63dd77ee0fb4ef68f9fa804f41ea6Daniel Dunbar
16088cac5f7e1ce63dd77ee0fb4ef68f9fa804f41ea6Daniel Dunbar  if (Input.isPipe()) {
16098cac5f7e1ce63dd77ee0fb4ef68f9fa804f41ea6Daniel Dunbar    CmdArgs.push_back("-");
16108cac5f7e1ce63dd77ee0fb4ef68f9fa804f41ea6Daniel Dunbar  } else {
16118cac5f7e1ce63dd77ee0fb4ef68f9fa804f41ea6Daniel Dunbar    assert(Input.isFilename() && "Invalid input.");
16128cac5f7e1ce63dd77ee0fb4ef68f9fa804f41ea6Daniel Dunbar    CmdArgs.push_back(Input.getFilename());
16138cac5f7e1ce63dd77ee0fb4ef68f9fa804f41ea6Daniel Dunbar  }
16148cac5f7e1ce63dd77ee0fb4ef68f9fa804f41ea6Daniel Dunbar
16158cac5f7e1ce63dd77ee0fb4ef68f9fa804f41ea6Daniel Dunbar  // asm_final spec is empty.
16168cac5f7e1ce63dd77ee0fb4ef68f9fa804f41ea6Daniel Dunbar
1617c21c485b4fb58ef5d55cf3e523263dd824a2ace4Daniel Dunbar  const char *Exec =
16185ed34f4c58b6ad4e21038d713c1fae31a6146ff5Daniel Dunbar    Args.MakeArgString(getToolChain().GetProgramPath(C, "as"));
1619cae087e164e94e4286c11bf694dd0ff88f295302Daniel Dunbar  Dest.addCommand(new Command(JA, Exec, CmdArgs));
16208cac5f7e1ce63dd77ee0fb4ef68f9fa804f41ea6Daniel Dunbar}
1621ff7488dc9a766f94daf54d81b03ab9160d0bfd88Daniel Dunbar
162202633b541b04ad5ffc1c70f4c2feeeb13e607057Daniel Dunbar/// Helper routine for seeing if we should use dsymutil; this is a
162302633b541b04ad5ffc1c70f4c2feeeb13e607057Daniel Dunbar/// gcc compatible hack, we should remove it and use the input
162402633b541b04ad5ffc1c70f4c2feeeb13e607057Daniel Dunbar/// type information.
162502633b541b04ad5ffc1c70f4c2feeeb13e607057Daniel Dunbarstatic bool isSourceSuffix(const char *Str) {
162602633b541b04ad5ffc1c70f4c2feeeb13e607057Daniel Dunbar  // match: 'C', 'CPP', 'c', 'cc', 'cp', 'c++', 'cpp', 'cxx', 'm',
162702633b541b04ad5ffc1c70f4c2feeeb13e607057Daniel Dunbar  // 'mm'.
162802633b541b04ad5ffc1c70f4c2feeeb13e607057Daniel Dunbar  switch (strlen(Str)) {
162902633b541b04ad5ffc1c70f4c2feeeb13e607057Daniel Dunbar  default:
163002633b541b04ad5ffc1c70f4c2feeeb13e607057Daniel Dunbar    return false;
163102633b541b04ad5ffc1c70f4c2feeeb13e607057Daniel Dunbar  case 1:
163202633b541b04ad5ffc1c70f4c2feeeb13e607057Daniel Dunbar    return (memcmp(Str, "C", 1) == 0 ||
163302633b541b04ad5ffc1c70f4c2feeeb13e607057Daniel Dunbar            memcmp(Str, "c", 1) == 0 ||
163402633b541b04ad5ffc1c70f4c2feeeb13e607057Daniel Dunbar            memcmp(Str, "m", 1) == 0);
163502633b541b04ad5ffc1c70f4c2feeeb13e607057Daniel Dunbar  case 2:
163602633b541b04ad5ffc1c70f4c2feeeb13e607057Daniel Dunbar    return (memcmp(Str, "cc", 2) == 0 ||
163702633b541b04ad5ffc1c70f4c2feeeb13e607057Daniel Dunbar            memcmp(Str, "cp", 2) == 0 ||
163802633b541b04ad5ffc1c70f4c2feeeb13e607057Daniel Dunbar            memcmp(Str, "mm", 2) == 0);
163902633b541b04ad5ffc1c70f4c2feeeb13e607057Daniel Dunbar  case 3:
164002633b541b04ad5ffc1c70f4c2feeeb13e607057Daniel Dunbar    return (memcmp(Str, "CPP", 3) == 0 ||
164102633b541b04ad5ffc1c70f4c2feeeb13e607057Daniel Dunbar            memcmp(Str, "c++", 3) == 0 ||
164202633b541b04ad5ffc1c70f4c2feeeb13e607057Daniel Dunbar            memcmp(Str, "cpp", 3) == 0 ||
164302633b541b04ad5ffc1c70f4c2feeeb13e607057Daniel Dunbar            memcmp(Str, "cxx", 3) == 0);
164402633b541b04ad5ffc1c70f4c2feeeb13e607057Daniel Dunbar  }
164502633b541b04ad5ffc1c70f4c2feeeb13e607057Daniel Dunbar}
164602633b541b04ad5ffc1c70f4c2feeeb13e607057Daniel Dunbar
164702633b541b04ad5ffc1c70f4c2feeeb13e607057Daniel Dunbarstatic bool isMacosxVersionLT(unsigned (&A)[3], unsigned (&B)[3]) {
164802633b541b04ad5ffc1c70f4c2feeeb13e607057Daniel Dunbar  for (unsigned i=0; i < 3; ++i) {
164902633b541b04ad5ffc1c70f4c2feeeb13e607057Daniel Dunbar    if (A[i] > B[i]) return false;
165002633b541b04ad5ffc1c70f4c2feeeb13e607057Daniel Dunbar    if (A[i] < B[i]) return true;
165102633b541b04ad5ffc1c70f4c2feeeb13e607057Daniel Dunbar  }
165202633b541b04ad5ffc1c70f4c2feeeb13e607057Daniel Dunbar  return false;
165302633b541b04ad5ffc1c70f4c2feeeb13e607057Daniel Dunbar}
165402633b541b04ad5ffc1c70f4c2feeeb13e607057Daniel Dunbar
1655c21c485b4fb58ef5d55cf3e523263dd824a2ace4Daniel Dunbarstatic bool isMacosxVersionLT(unsigned (&A)[3],
165602633b541b04ad5ffc1c70f4c2feeeb13e607057Daniel Dunbar                              unsigned V0, unsigned V1=0, unsigned V2=0) {
165702633b541b04ad5ffc1c70f4c2feeeb13e607057Daniel Dunbar  unsigned B[3] = { V0, V1, V2 };
165802633b541b04ad5ffc1c70f4c2feeeb13e607057Daniel Dunbar  return isMacosxVersionLT(A, B);
165902633b541b04ad5ffc1c70f4c2feeeb13e607057Daniel Dunbar}
166002633b541b04ad5ffc1c70f4c2feeeb13e607057Daniel Dunbar
166178dbd580a02759bbc408dbefb6754afa71b2c24cDaniel Dunbar// FIXME: Can we tablegen this?
166278dbd580a02759bbc408dbefb6754afa71b2c24cDaniel Dunbarstatic const char *GetArmArchForMArch(llvm::StringRef Value) {
166378dbd580a02759bbc408dbefb6754afa71b2c24cDaniel Dunbar  if (Value == "armv6k")
166478dbd580a02759bbc408dbefb6754afa71b2c24cDaniel Dunbar    return "armv6";
166578dbd580a02759bbc408dbefb6754afa71b2c24cDaniel Dunbar
166678dbd580a02759bbc408dbefb6754afa71b2c24cDaniel Dunbar  if (Value == "armv5tej")
166778dbd580a02759bbc408dbefb6754afa71b2c24cDaniel Dunbar    return "armv5";
166878dbd580a02759bbc408dbefb6754afa71b2c24cDaniel Dunbar
166978dbd580a02759bbc408dbefb6754afa71b2c24cDaniel Dunbar  if (Value == "xscale")
167078dbd580a02759bbc408dbefb6754afa71b2c24cDaniel Dunbar    return "xscale";
167178dbd580a02759bbc408dbefb6754afa71b2c24cDaniel Dunbar
167278dbd580a02759bbc408dbefb6754afa71b2c24cDaniel Dunbar  if (Value == "armv4t")
167378dbd580a02759bbc408dbefb6754afa71b2c24cDaniel Dunbar    return "armv4t";
167478dbd580a02759bbc408dbefb6754afa71b2c24cDaniel Dunbar
167578dbd580a02759bbc408dbefb6754afa71b2c24cDaniel Dunbar  if (Value == "armv7" || Value == "armv7-a" || Value == "armv7-r" ||
167678dbd580a02759bbc408dbefb6754afa71b2c24cDaniel Dunbar      Value == "armv7-m" || Value == "armv7a" || Value == "armv7r" ||
167778dbd580a02759bbc408dbefb6754afa71b2c24cDaniel Dunbar      Value == "armv7m")
167878dbd580a02759bbc408dbefb6754afa71b2c24cDaniel Dunbar    return "armv7";
167978dbd580a02759bbc408dbefb6754afa71b2c24cDaniel Dunbar
168078dbd580a02759bbc408dbefb6754afa71b2c24cDaniel Dunbar  return 0;
168178dbd580a02759bbc408dbefb6754afa71b2c24cDaniel Dunbar}
168278dbd580a02759bbc408dbefb6754afa71b2c24cDaniel Dunbar
168378dbd580a02759bbc408dbefb6754afa71b2c24cDaniel Dunbar// FIXME: Can we tablegen this?
168478dbd580a02759bbc408dbefb6754afa71b2c24cDaniel Dunbarstatic const char *GetArmArchForMCpu(llvm::StringRef Value) {
168578dbd580a02759bbc408dbefb6754afa71b2c24cDaniel Dunbar  if (Value == "arm10tdmi" || Value == "arm1020t" || Value == "arm9e" ||
168678dbd580a02759bbc408dbefb6754afa71b2c24cDaniel Dunbar      Value == "arm946e-s" || Value == "arm966e-s" ||
168778dbd580a02759bbc408dbefb6754afa71b2c24cDaniel Dunbar      Value == "arm968e-s" || Value == "arm10e" ||
168878dbd580a02759bbc408dbefb6754afa71b2c24cDaniel Dunbar      Value == "arm1020e" || Value == "arm1022e" || Value == "arm926ej-s" ||
168978dbd580a02759bbc408dbefb6754afa71b2c24cDaniel Dunbar      Value == "arm1026ej-s")
169078dbd580a02759bbc408dbefb6754afa71b2c24cDaniel Dunbar    return "armv5";
169178dbd580a02759bbc408dbefb6754afa71b2c24cDaniel Dunbar
169278dbd580a02759bbc408dbefb6754afa71b2c24cDaniel Dunbar  if (Value == "xscale")
169378dbd580a02759bbc408dbefb6754afa71b2c24cDaniel Dunbar    return "xscale";
169478dbd580a02759bbc408dbefb6754afa71b2c24cDaniel Dunbar
169578dbd580a02759bbc408dbefb6754afa71b2c24cDaniel Dunbar  if (Value == "arm1136j-s" || Value == "arm1136jf-s" ||
169678dbd580a02759bbc408dbefb6754afa71b2c24cDaniel Dunbar      Value == "arm1176jz-s" || Value == "arm1176jzf-s")
169778dbd580a02759bbc408dbefb6754afa71b2c24cDaniel Dunbar    return "armv6";
169878dbd580a02759bbc408dbefb6754afa71b2c24cDaniel Dunbar
169978dbd580a02759bbc408dbefb6754afa71b2c24cDaniel Dunbar  if (Value == "cortex-a8" || Value == "cortex-r4" || Value == "cortex-m3")
170078dbd580a02759bbc408dbefb6754afa71b2c24cDaniel Dunbar    return "armv7";
170178dbd580a02759bbc408dbefb6754afa71b2c24cDaniel Dunbar
170278dbd580a02759bbc408dbefb6754afa71b2c24cDaniel Dunbar  return 0;
170378dbd580a02759bbc408dbefb6754afa71b2c24cDaniel Dunbar}
170478dbd580a02759bbc408dbefb6754afa71b2c24cDaniel Dunbar
1705fbefe6bd6f62a3361813498dc672ab0d6c0d4fd1Daniel Dunbarvoid darwin::DarwinTool::AddDarwinArch(const ArgList &Args,
1706fbefe6bd6f62a3361813498dc672ab0d6c0d4fd1Daniel Dunbar                                       ArgStringList &CmdArgs) const {
170702633b541b04ad5ffc1c70f4c2feeeb13e607057Daniel Dunbar  // Derived from darwin_arch spec.
170802633b541b04ad5ffc1c70f4c2feeeb13e607057Daniel Dunbar  CmdArgs.push_back("-arch");
170978dbd580a02759bbc408dbefb6754afa71b2c24cDaniel Dunbar
171078dbd580a02759bbc408dbefb6754afa71b2c24cDaniel Dunbar  switch (getToolChain().getTriple().getArch()) {
171178dbd580a02759bbc408dbefb6754afa71b2c24cDaniel Dunbar  default:
1712881376467c46c5c6cc16fa6790271c2c22e1d4f1Daniel Dunbar    CmdArgs.push_back(Args.MakeArgString(getToolChain().getArchName()));
171378dbd580a02759bbc408dbefb6754afa71b2c24cDaniel Dunbar    break;
171478dbd580a02759bbc408dbefb6754afa71b2c24cDaniel Dunbar
171578dbd580a02759bbc408dbefb6754afa71b2c24cDaniel Dunbar  case llvm::Triple::arm: {
171678dbd580a02759bbc408dbefb6754afa71b2c24cDaniel Dunbar    if (const Arg *A = Args.getLastArg(options::OPT_march_EQ)) {
171778dbd580a02759bbc408dbefb6754afa71b2c24cDaniel Dunbar      if (const char *Arch = GetArmArchForMArch(A->getValue(Args))) {
171878dbd580a02759bbc408dbefb6754afa71b2c24cDaniel Dunbar        CmdArgs.push_back(Arch);
171978dbd580a02759bbc408dbefb6754afa71b2c24cDaniel Dunbar        return;
172078dbd580a02759bbc408dbefb6754afa71b2c24cDaniel Dunbar      }
172178dbd580a02759bbc408dbefb6754afa71b2c24cDaniel Dunbar    }
172278dbd580a02759bbc408dbefb6754afa71b2c24cDaniel Dunbar
172378dbd580a02759bbc408dbefb6754afa71b2c24cDaniel Dunbar    if (const Arg *A = Args.getLastArg(options::OPT_mcpu_EQ)) {
172478dbd580a02759bbc408dbefb6754afa71b2c24cDaniel Dunbar      if (const char *Arch = GetArmArchForMCpu(A->getValue(Args))) {
172578dbd580a02759bbc408dbefb6754afa71b2c24cDaniel Dunbar        CmdArgs.push_back(Arch);
172678dbd580a02759bbc408dbefb6754afa71b2c24cDaniel Dunbar        return;
172778dbd580a02759bbc408dbefb6754afa71b2c24cDaniel Dunbar      }
172878dbd580a02759bbc408dbefb6754afa71b2c24cDaniel Dunbar    }
172978dbd580a02759bbc408dbefb6754afa71b2c24cDaniel Dunbar
173078dbd580a02759bbc408dbefb6754afa71b2c24cDaniel Dunbar    CmdArgs.push_back("arm");
173178dbd580a02759bbc408dbefb6754afa71b2c24cDaniel Dunbar    CmdArgs.push_back("-force_cpusubtype_ALL");
173278dbd580a02759bbc408dbefb6754afa71b2c24cDaniel Dunbar    return;
173378dbd580a02759bbc408dbefb6754afa71b2c24cDaniel Dunbar  }
173478dbd580a02759bbc408dbefb6754afa71b2c24cDaniel Dunbar  }
173502633b541b04ad5ffc1c70f4c2feeeb13e607057Daniel Dunbar}
173602633b541b04ad5ffc1c70f4c2feeeb13e607057Daniel Dunbar
1737fbefe6bd6f62a3361813498dc672ab0d6c0d4fd1Daniel Dunbarvoid darwin::DarwinTool::AddDarwinSubArch(const ArgList &Args,
1738fbefe6bd6f62a3361813498dc672ab0d6c0d4fd1Daniel Dunbar                                          ArgStringList &CmdArgs) const {
173902633b541b04ad5ffc1c70f4c2feeeb13e607057Daniel Dunbar  // Derived from darwin_subarch spec, not sure what the distinction
174002633b541b04ad5ffc1c70f4c2feeeb13e607057Daniel Dunbar  // exists for but at least for this chain it is the same.
174102633b541b04ad5ffc1c70f4c2feeeb13e607057Daniel Dunbar  AddDarwinArch(Args, CmdArgs);
174202633b541b04ad5ffc1c70f4c2feeeb13e607057Daniel Dunbar}
174302633b541b04ad5ffc1c70f4c2feeeb13e607057Daniel Dunbar
1744c21c485b4fb58ef5d55cf3e523263dd824a2ace4Daniel Dunbarvoid darwin::Link::AddLinkArgs(const ArgList &Args,
174502633b541b04ad5ffc1c70f4c2feeeb13e607057Daniel Dunbar                               ArgStringList &CmdArgs) const {
174602633b541b04ad5ffc1c70f4c2feeeb13e607057Daniel Dunbar  const Driver &D = getToolChain().getHost().getDriver();
174702633b541b04ad5ffc1c70f4c2feeeb13e607057Daniel Dunbar
174802633b541b04ad5ffc1c70f4c2feeeb13e607057Daniel Dunbar  // Derived from the "link" spec.
174902633b541b04ad5ffc1c70f4c2feeeb13e607057Daniel Dunbar  Args.AddAllArgs(CmdArgs, options::OPT_static);
175002633b541b04ad5ffc1c70f4c2feeeb13e607057Daniel Dunbar  if (!Args.hasArg(options::OPT_static))
175102633b541b04ad5ffc1c70f4c2feeeb13e607057Daniel Dunbar    CmdArgs.push_back("-dynamic");
175202633b541b04ad5ffc1c70f4c2feeeb13e607057Daniel Dunbar  if (Args.hasArg(options::OPT_fgnu_runtime)) {
175302633b541b04ad5ffc1c70f4c2feeeb13e607057Daniel Dunbar    // FIXME: gcc replaces -lobjc in forward args with -lobjc-gnu
175402633b541b04ad5ffc1c70f4c2feeeb13e607057Daniel Dunbar    // here. How do we wish to handle such things?
175502633b541b04ad5ffc1c70f4c2feeeb13e607057Daniel Dunbar  }
1756c21c485b4fb58ef5d55cf3e523263dd824a2ace4Daniel Dunbar
175702633b541b04ad5ffc1c70f4c2feeeb13e607057Daniel Dunbar  if (!Args.hasArg(options::OPT_dynamiclib)) {
175802633b541b04ad5ffc1c70f4c2feeeb13e607057Daniel Dunbar    if (Args.hasArg(options::OPT_force__cpusubtype__ALL)) {
175902633b541b04ad5ffc1c70f4c2feeeb13e607057Daniel Dunbar      AddDarwinArch(Args, CmdArgs);
176002633b541b04ad5ffc1c70f4c2feeeb13e607057Daniel Dunbar      CmdArgs.push_back("-force_cpusubtype_ALL");
176102633b541b04ad5ffc1c70f4c2feeeb13e607057Daniel Dunbar    } else
176202633b541b04ad5ffc1c70f4c2feeeb13e607057Daniel Dunbar      AddDarwinSubArch(Args, CmdArgs);
176302633b541b04ad5ffc1c70f4c2feeeb13e607057Daniel Dunbar
176402633b541b04ad5ffc1c70f4c2feeeb13e607057Daniel Dunbar    Args.AddLastArg(CmdArgs, options::OPT_bundle);
176502633b541b04ad5ffc1c70f4c2feeeb13e607057Daniel Dunbar    Args.AddAllArgs(CmdArgs, options::OPT_bundle__loader);
176602633b541b04ad5ffc1c70f4c2feeeb13e607057Daniel Dunbar    Args.AddAllArgs(CmdArgs, options::OPT_client__name);
176702633b541b04ad5ffc1c70f4c2feeeb13e607057Daniel Dunbar
176802633b541b04ad5ffc1c70f4c2feeeb13e607057Daniel Dunbar    Arg *A;
176902633b541b04ad5ffc1c70f4c2feeeb13e607057Daniel Dunbar    if ((A = Args.getLastArg(options::OPT_compatibility__version)) ||
177002633b541b04ad5ffc1c70f4c2feeeb13e607057Daniel Dunbar        (A = Args.getLastArg(options::OPT_current__version)) ||
177102633b541b04ad5ffc1c70f4c2feeeb13e607057Daniel Dunbar        (A = Args.getLastArg(options::OPT_install__name)))
177202633b541b04ad5ffc1c70f4c2feeeb13e607057Daniel Dunbar      D.Diag(clang::diag::err_drv_argument_only_allowed_with)
177302633b541b04ad5ffc1c70f4c2feeeb13e607057Daniel Dunbar        << A->getAsString(Args) << "-dynamiclib";
177402633b541b04ad5ffc1c70f4c2feeeb13e607057Daniel Dunbar
177502633b541b04ad5ffc1c70f4c2feeeb13e607057Daniel Dunbar    Args.AddLastArg(CmdArgs, options::OPT_force__flat__namespace);
177602633b541b04ad5ffc1c70f4c2feeeb13e607057Daniel Dunbar    Args.AddLastArg(CmdArgs, options::OPT_keep__private__externs);
177702633b541b04ad5ffc1c70f4c2feeeb13e607057Daniel Dunbar    Args.AddLastArg(CmdArgs, options::OPT_private__bundle);
177802633b541b04ad5ffc1c70f4c2feeeb13e607057Daniel Dunbar  } else {
177902633b541b04ad5ffc1c70f4c2feeeb13e607057Daniel Dunbar    CmdArgs.push_back("-dylib");
178002633b541b04ad5ffc1c70f4c2feeeb13e607057Daniel Dunbar
178102633b541b04ad5ffc1c70f4c2feeeb13e607057Daniel Dunbar    Arg *A;
178202633b541b04ad5ffc1c70f4c2feeeb13e607057Daniel Dunbar    if ((A = Args.getLastArg(options::OPT_bundle)) ||
178302633b541b04ad5ffc1c70f4c2feeeb13e607057Daniel Dunbar        (A = Args.getLastArg(options::OPT_bundle__loader)) ||
178402633b541b04ad5ffc1c70f4c2feeeb13e607057Daniel Dunbar        (A = Args.getLastArg(options::OPT_client__name)) ||
178502633b541b04ad5ffc1c70f4c2feeeb13e607057Daniel Dunbar        (A = Args.getLastArg(options::OPT_force__flat__namespace)) ||
178602633b541b04ad5ffc1c70f4c2feeeb13e607057Daniel Dunbar        (A = Args.getLastArg(options::OPT_keep__private__externs)) ||
178702633b541b04ad5ffc1c70f4c2feeeb13e607057Daniel Dunbar        (A = Args.getLastArg(options::OPT_private__bundle)))
178802633b541b04ad5ffc1c70f4c2feeeb13e607057Daniel Dunbar      D.Diag(clang::diag::err_drv_argument_not_allowed_with)
178902633b541b04ad5ffc1c70f4c2feeeb13e607057Daniel Dunbar        << A->getAsString(Args) << "-dynamiclib";
1790c21c485b4fb58ef5d55cf3e523263dd824a2ace4Daniel Dunbar
179102633b541b04ad5ffc1c70f4c2feeeb13e607057Daniel Dunbar    Args.AddAllArgsTranslated(CmdArgs, options::OPT_compatibility__version,
179202633b541b04ad5ffc1c70f4c2feeeb13e607057Daniel Dunbar                              "-dylib_compatibility_version");
179302633b541b04ad5ffc1c70f4c2feeeb13e607057Daniel Dunbar    Args.AddAllArgsTranslated(CmdArgs, options::OPT_current__version,
179402633b541b04ad5ffc1c70f4c2feeeb13e607057Daniel Dunbar                              "-dylib_current_version");
179502633b541b04ad5ffc1c70f4c2feeeb13e607057Daniel Dunbar
179602633b541b04ad5ffc1c70f4c2feeeb13e607057Daniel Dunbar    if (Args.hasArg(options::OPT_force__cpusubtype__ALL)) {
179702633b541b04ad5ffc1c70f4c2feeeb13e607057Daniel Dunbar      AddDarwinArch(Args, CmdArgs);
1798c21c485b4fb58ef5d55cf3e523263dd824a2ace4Daniel Dunbar      // NOTE: We don't add -force_cpusubtype_ALL on this path. Ok.
179902633b541b04ad5ffc1c70f4c2feeeb13e607057Daniel Dunbar    } else
180002633b541b04ad5ffc1c70f4c2feeeb13e607057Daniel Dunbar      AddDarwinSubArch(Args, CmdArgs);
180102633b541b04ad5ffc1c70f4c2feeeb13e607057Daniel Dunbar
180202633b541b04ad5ffc1c70f4c2feeeb13e607057Daniel Dunbar    Args.AddAllArgsTranslated(CmdArgs, options::OPT_install__name,
180302633b541b04ad5ffc1c70f4c2feeeb13e607057Daniel Dunbar                              "-dylib_install_name");
180402633b541b04ad5ffc1c70f4c2feeeb13e607057Daniel Dunbar  }
180502633b541b04ad5ffc1c70f4c2feeeb13e607057Daniel Dunbar
180602633b541b04ad5ffc1c70f4c2feeeb13e607057Daniel Dunbar  Args.AddLastArg(CmdArgs, options::OPT_all__load);
180702633b541b04ad5ffc1c70f4c2feeeb13e607057Daniel Dunbar  Args.AddAllArgs(CmdArgs, options::OPT_allowable__client);
180802633b541b04ad5ffc1c70f4c2feeeb13e607057Daniel Dunbar  Args.AddLastArg(CmdArgs, options::OPT_bind__at__load);
1809d82f8fa53771b454885c546f0fd452a4980b3a3eDaniel Dunbar  if (getDarwinToolChain().isIPhone())
1810d82f8fa53771b454885c546f0fd452a4980b3a3eDaniel Dunbar    Args.AddLastArg(CmdArgs, options::OPT_arch__errors__fatal);
181102633b541b04ad5ffc1c70f4c2feeeb13e607057Daniel Dunbar  Args.AddLastArg(CmdArgs, options::OPT_dead__strip);
181202633b541b04ad5ffc1c70f4c2feeeb13e607057Daniel Dunbar  Args.AddLastArg(CmdArgs, options::OPT_no__dead__strip__inits__and__terms);
181302633b541b04ad5ffc1c70f4c2feeeb13e607057Daniel Dunbar  Args.AddAllArgs(CmdArgs, options::OPT_dylib__file);
181402633b541b04ad5ffc1c70f4c2feeeb13e607057Daniel Dunbar  Args.AddLastArg(CmdArgs, options::OPT_dynamic);
181502633b541b04ad5ffc1c70f4c2feeeb13e607057Daniel Dunbar  Args.AddAllArgs(CmdArgs, options::OPT_exported__symbols__list);
181602633b541b04ad5ffc1c70f4c2feeeb13e607057Daniel Dunbar  Args.AddLastArg(CmdArgs, options::OPT_flat__namespace);
181702633b541b04ad5ffc1c70f4c2feeeb13e607057Daniel Dunbar  Args.AddAllArgs(CmdArgs, options::OPT_headerpad__max__install__names);
181802633b541b04ad5ffc1c70f4c2feeeb13e607057Daniel Dunbar  Args.AddAllArgs(CmdArgs, options::OPT_image__base);
181902633b541b04ad5ffc1c70f4c2feeeb13e607057Daniel Dunbar  Args.AddAllArgs(CmdArgs, options::OPT_init);
182002633b541b04ad5ffc1c70f4c2feeeb13e607057Daniel Dunbar
182130392de4681602f1aabc61b0184b1de53bc172f0Daniel Dunbar  if (!Args.hasArg(options::OPT_mmacosx_version_min_EQ) &&
182230392de4681602f1aabc61b0184b1de53bc172f0Daniel Dunbar      !Args.hasArg(options::OPT_miphoneos_version_min_EQ)) {
182330392de4681602f1aabc61b0184b1de53bc172f0Daniel Dunbar    // Add default version min.
182430392de4681602f1aabc61b0184b1de53bc172f0Daniel Dunbar    if (!getDarwinToolChain().isIPhone()) {
1825c21c485b4fb58ef5d55cf3e523263dd824a2ace4Daniel Dunbar      CmdArgs.push_back("-macosx_version_min");
1826c21c485b4fb58ef5d55cf3e523263dd824a2ace4Daniel Dunbar      CmdArgs.push_back(getDarwinToolChain().getMacosxVersionStr());
182730392de4681602f1aabc61b0184b1de53bc172f0Daniel Dunbar    } else {
182830392de4681602f1aabc61b0184b1de53bc172f0Daniel Dunbar      CmdArgs.push_back("-iphoneos_version_min");
182930392de4681602f1aabc61b0184b1de53bc172f0Daniel Dunbar      CmdArgs.push_back(getDarwinToolChain().getIPhoneOSVersionStr());
1830c21c485b4fb58ef5d55cf3e523263dd824a2ace4Daniel Dunbar    }
183102633b541b04ad5ffc1c70f4c2feeeb13e607057Daniel Dunbar  }
183202633b541b04ad5ffc1c70f4c2feeeb13e607057Daniel Dunbar
183330392de4681602f1aabc61b0184b1de53bc172f0Daniel Dunbar  // Adding all arguments doesn't make sense here but this is what
183430392de4681602f1aabc61b0184b1de53bc172f0Daniel Dunbar  // gcc does.
183530392de4681602f1aabc61b0184b1de53bc172f0Daniel Dunbar  Args.AddAllArgsTranslated(CmdArgs, options::OPT_mmacosx_version_min_EQ,
183630392de4681602f1aabc61b0184b1de53bc172f0Daniel Dunbar                              "-macosx_version_min");
183702633b541b04ad5ffc1c70f4c2feeeb13e607057Daniel Dunbar  Args.AddAllArgsTranslated(CmdArgs, options::OPT_miphoneos_version_min_EQ,
183802633b541b04ad5ffc1c70f4c2feeeb13e607057Daniel Dunbar                            "-iphoneos_version_min");
183902633b541b04ad5ffc1c70f4c2feeeb13e607057Daniel Dunbar  Args.AddLastArg(CmdArgs, options::OPT_nomultidefs);
184002633b541b04ad5ffc1c70f4c2feeeb13e607057Daniel Dunbar  Args.AddLastArg(CmdArgs, options::OPT_multi__module);
184102633b541b04ad5ffc1c70f4c2feeeb13e607057Daniel Dunbar  Args.AddLastArg(CmdArgs, options::OPT_single__module);
184202633b541b04ad5ffc1c70f4c2feeeb13e607057Daniel Dunbar  Args.AddAllArgs(CmdArgs, options::OPT_multiply__defined);
184302633b541b04ad5ffc1c70f4c2feeeb13e607057Daniel Dunbar  Args.AddAllArgs(CmdArgs, options::OPT_multiply__defined__unused);
1844c21c485b4fb58ef5d55cf3e523263dd824a2ace4Daniel Dunbar
184502633b541b04ad5ffc1c70f4c2feeeb13e607057Daniel Dunbar  if (Args.hasArg(options::OPT_fpie))
184602633b541b04ad5ffc1c70f4c2feeeb13e607057Daniel Dunbar    CmdArgs.push_back("-pie");
184702633b541b04ad5ffc1c70f4c2feeeb13e607057Daniel Dunbar
184802633b541b04ad5ffc1c70f4c2feeeb13e607057Daniel Dunbar  Args.AddLastArg(CmdArgs, options::OPT_prebind);
184902633b541b04ad5ffc1c70f4c2feeeb13e607057Daniel Dunbar  Args.AddLastArg(CmdArgs, options::OPT_noprebind);
185002633b541b04ad5ffc1c70f4c2feeeb13e607057Daniel Dunbar  Args.AddLastArg(CmdArgs, options::OPT_nofixprebinding);
185102633b541b04ad5ffc1c70f4c2feeeb13e607057Daniel Dunbar  Args.AddLastArg(CmdArgs, options::OPT_prebind__all__twolevel__modules);
185202633b541b04ad5ffc1c70f4c2feeeb13e607057Daniel Dunbar  Args.AddLastArg(CmdArgs, options::OPT_read__only__relocs);
185302633b541b04ad5ffc1c70f4c2feeeb13e607057Daniel Dunbar  Args.AddAllArgs(CmdArgs, options::OPT_sectcreate);
185402633b541b04ad5ffc1c70f4c2feeeb13e607057Daniel Dunbar  Args.AddAllArgs(CmdArgs, options::OPT_sectorder);
185502633b541b04ad5ffc1c70f4c2feeeb13e607057Daniel Dunbar  Args.AddAllArgs(CmdArgs, options::OPT_seg1addr);
185602633b541b04ad5ffc1c70f4c2feeeb13e607057Daniel Dunbar  Args.AddAllArgs(CmdArgs, options::OPT_segprot);
185702633b541b04ad5ffc1c70f4c2feeeb13e607057Daniel Dunbar  Args.AddAllArgs(CmdArgs, options::OPT_segaddr);
185802633b541b04ad5ffc1c70f4c2feeeb13e607057Daniel Dunbar  Args.AddAllArgs(CmdArgs, options::OPT_segs__read__only__addr);
185902633b541b04ad5ffc1c70f4c2feeeb13e607057Daniel Dunbar  Args.AddAllArgs(CmdArgs, options::OPT_segs__read__write__addr);
186002633b541b04ad5ffc1c70f4c2feeeb13e607057Daniel Dunbar  Args.AddAllArgs(CmdArgs, options::OPT_seg__addr__table);
186102633b541b04ad5ffc1c70f4c2feeeb13e607057Daniel Dunbar  Args.AddAllArgs(CmdArgs, options::OPT_seg__addr__table__filename);
186202633b541b04ad5ffc1c70f4c2feeeb13e607057Daniel Dunbar  Args.AddAllArgs(CmdArgs, options::OPT_sub__library);
186302633b541b04ad5ffc1c70f4c2feeeb13e607057Daniel Dunbar  Args.AddAllArgs(CmdArgs, options::OPT_sub__umbrella);
1864d82f8fa53771b454885c546f0fd452a4980b3a3eDaniel Dunbar
186502633b541b04ad5ffc1c70f4c2feeeb13e607057Daniel Dunbar  Args.AddAllArgsTranslated(CmdArgs, options::OPT_isysroot, "-syslibroot");
1866d82f8fa53771b454885c546f0fd452a4980b3a3eDaniel Dunbar  if (getDarwinToolChain().isIPhone()) {
1867d82f8fa53771b454885c546f0fd452a4980b3a3eDaniel Dunbar    if (!Args.hasArg(options::OPT_isysroot)) {
1868d82f8fa53771b454885c546f0fd452a4980b3a3eDaniel Dunbar      CmdArgs.push_back("-syslibroot");
1869d82f8fa53771b454885c546f0fd452a4980b3a3eDaniel Dunbar      CmdArgs.push_back("/Developer/SDKs/Extra");
1870d82f8fa53771b454885c546f0fd452a4980b3a3eDaniel Dunbar    }
1871d82f8fa53771b454885c546f0fd452a4980b3a3eDaniel Dunbar  }
1872d82f8fa53771b454885c546f0fd452a4980b3a3eDaniel Dunbar
187302633b541b04ad5ffc1c70f4c2feeeb13e607057Daniel Dunbar  Args.AddLastArg(CmdArgs, options::OPT_twolevel__namespace);
187402633b541b04ad5ffc1c70f4c2feeeb13e607057Daniel Dunbar  Args.AddLastArg(CmdArgs, options::OPT_twolevel__namespace__hints);
187502633b541b04ad5ffc1c70f4c2feeeb13e607057Daniel Dunbar  Args.AddAllArgs(CmdArgs, options::OPT_umbrella);
187602633b541b04ad5ffc1c70f4c2feeeb13e607057Daniel Dunbar  Args.AddAllArgs(CmdArgs, options::OPT_undefined);
187702633b541b04ad5ffc1c70f4c2feeeb13e607057Daniel Dunbar  Args.AddAllArgs(CmdArgs, options::OPT_unexported__symbols__list);
187802633b541b04ad5ffc1c70f4c2feeeb13e607057Daniel Dunbar
1879d82f8fa53771b454885c546f0fd452a4980b3a3eDaniel Dunbar  Args.AddAllArgs(CmdArgs, options::OPT_weak__reference__mismatches);
188002633b541b04ad5ffc1c70f4c2feeeb13e607057Daniel Dunbar  if (!Args.hasArg(options::OPT_weak__reference__mismatches)) {
188102633b541b04ad5ffc1c70f4c2feeeb13e607057Daniel Dunbar    CmdArgs.push_back("-weak_reference_mismatches");
188202633b541b04ad5ffc1c70f4c2feeeb13e607057Daniel Dunbar    CmdArgs.push_back("non-weak");
188302633b541b04ad5ffc1c70f4c2feeeb13e607057Daniel Dunbar  }
188402633b541b04ad5ffc1c70f4c2feeeb13e607057Daniel Dunbar
188502633b541b04ad5ffc1c70f4c2feeeb13e607057Daniel Dunbar  Args.AddLastArg(CmdArgs, options::OPT_X_Flag);
188602633b541b04ad5ffc1c70f4c2feeeb13e607057Daniel Dunbar  Args.AddAllArgs(CmdArgs, options::OPT_y);
188702633b541b04ad5ffc1c70f4c2feeeb13e607057Daniel Dunbar  Args.AddLastArg(CmdArgs, options::OPT_w);
188802633b541b04ad5ffc1c70f4c2feeeb13e607057Daniel Dunbar  Args.AddAllArgs(CmdArgs, options::OPT_pagezero__size);
188902633b541b04ad5ffc1c70f4c2feeeb13e607057Daniel Dunbar  Args.AddAllArgs(CmdArgs, options::OPT_segs__read__);
189002633b541b04ad5ffc1c70f4c2feeeb13e607057Daniel Dunbar  Args.AddLastArg(CmdArgs, options::OPT_seglinkedit);
189102633b541b04ad5ffc1c70f4c2feeeb13e607057Daniel Dunbar  Args.AddLastArg(CmdArgs, options::OPT_noseglinkedit);
189202633b541b04ad5ffc1c70f4c2feeeb13e607057Daniel Dunbar  Args.AddAllArgs(CmdArgs, options::OPT_sectalign);
189302633b541b04ad5ffc1c70f4c2feeeb13e607057Daniel Dunbar  Args.AddAllArgs(CmdArgs, options::OPT_sectobjectsymbols);
189402633b541b04ad5ffc1c70f4c2feeeb13e607057Daniel Dunbar  Args.AddAllArgs(CmdArgs, options::OPT_segcreate);
189502633b541b04ad5ffc1c70f4c2feeeb13e607057Daniel Dunbar  Args.AddLastArg(CmdArgs, options::OPT_whyload);
189602633b541b04ad5ffc1c70f4c2feeeb13e607057Daniel Dunbar  Args.AddLastArg(CmdArgs, options::OPT_whatsloaded);
189702633b541b04ad5ffc1c70f4c2feeeb13e607057Daniel Dunbar  Args.AddAllArgs(CmdArgs, options::OPT_dylinker__install__name);
189802633b541b04ad5ffc1c70f4c2feeeb13e607057Daniel Dunbar  Args.AddLastArg(CmdArgs, options::OPT_dylinker);
189902633b541b04ad5ffc1c70f4c2feeeb13e607057Daniel Dunbar  Args.AddLastArg(CmdArgs, options::OPT_Mach);
190002633b541b04ad5ffc1c70f4c2feeeb13e607057Daniel Dunbar}
190102633b541b04ad5ffc1c70f4c2feeeb13e607057Daniel Dunbar
190202633b541b04ad5ffc1c70f4c2feeeb13e607057Daniel Dunbarvoid darwin::Link::ConstructJob(Compilation &C, const JobAction &JA,
1903c21c485b4fb58ef5d55cf3e523263dd824a2ace4Daniel Dunbar                                Job &Dest, const InputInfo &Output,
1904c21c485b4fb58ef5d55cf3e523263dd824a2ace4Daniel Dunbar                                const InputInfoList &Inputs,
1905c21c485b4fb58ef5d55cf3e523263dd824a2ace4Daniel Dunbar                                const ArgList &Args,
190602633b541b04ad5ffc1c70f4c2feeeb13e607057Daniel Dunbar                                const char *LinkingOutput) const {
190702633b541b04ad5ffc1c70f4c2feeeb13e607057Daniel Dunbar  assert(Output.getType() == types::TY_Image && "Invalid linker output type.");
1908e0be8b1729d8978de433d229c065830b95d0ae68Daniel Dunbar
190902633b541b04ad5ffc1c70f4c2feeeb13e607057Daniel Dunbar  // The logic here is derived from gcc's behavior; most of which
191002633b541b04ad5ffc1c70f4c2feeeb13e607057Daniel Dunbar  // comes from specs (starting with link_command). Consult gcc for
191102633b541b04ad5ffc1c70f4c2feeeb13e607057Daniel Dunbar  // more information.
191202633b541b04ad5ffc1c70f4c2feeeb13e607057Daniel Dunbar  ArgStringList CmdArgs;
191302633b541b04ad5ffc1c70f4c2feeeb13e607057Daniel Dunbar
191402633b541b04ad5ffc1c70f4c2feeeb13e607057Daniel Dunbar  // I'm not sure why this particular decomposition exists in gcc, but
191502633b541b04ad5ffc1c70f4c2feeeb13e607057Daniel Dunbar  // we follow suite for ease of comparison.
191602633b541b04ad5ffc1c70f4c2feeeb13e607057Daniel Dunbar  AddLinkArgs(Args, CmdArgs);
191702633b541b04ad5ffc1c70f4c2feeeb13e607057Daniel Dunbar
191802633b541b04ad5ffc1c70f4c2feeeb13e607057Daniel Dunbar  Args.AddAllArgs(CmdArgs, options::OPT_d_Flag);
191902633b541b04ad5ffc1c70f4c2feeeb13e607057Daniel Dunbar  Args.AddAllArgs(CmdArgs, options::OPT_s);
192002633b541b04ad5ffc1c70f4c2feeeb13e607057Daniel Dunbar  Args.AddAllArgs(CmdArgs, options::OPT_t);
192102633b541b04ad5ffc1c70f4c2feeeb13e607057Daniel Dunbar  Args.AddAllArgs(CmdArgs, options::OPT_Z_Flag);
192202633b541b04ad5ffc1c70f4c2feeeb13e607057Daniel Dunbar  Args.AddAllArgs(CmdArgs, options::OPT_u_Group);
192302633b541b04ad5ffc1c70f4c2feeeb13e607057Daniel Dunbar  Args.AddAllArgs(CmdArgs, options::OPT_A);
192402633b541b04ad5ffc1c70f4c2feeeb13e607057Daniel Dunbar  Args.AddLastArg(CmdArgs, options::OPT_e);
192502633b541b04ad5ffc1c70f4c2feeeb13e607057Daniel Dunbar  Args.AddAllArgs(CmdArgs, options::OPT_m_Separate);
192602633b541b04ad5ffc1c70f4c2feeeb13e607057Daniel Dunbar  Args.AddAllArgs(CmdArgs, options::OPT_r);
192702633b541b04ad5ffc1c70f4c2feeeb13e607057Daniel Dunbar
192802633b541b04ad5ffc1c70f4c2feeeb13e607057Daniel Dunbar  CmdArgs.push_back("-o");
192902633b541b04ad5ffc1c70f4c2feeeb13e607057Daniel Dunbar  CmdArgs.push_back(Output.getFilename());
193002633b541b04ad5ffc1c70f4c2feeeb13e607057Daniel Dunbar
1931ae54af2fdcf2262e778f551941541913828fde49Daniel Dunbar  unsigned MacosxVersionMin[3];
193202633b541b04ad5ffc1c70f4c2feeeb13e607057Daniel Dunbar  if (Arg *A = Args.getLastArg(options::OPT_mmacosx_version_min_EQ)) {
193302633b541b04ad5ffc1c70f4c2feeeb13e607057Daniel Dunbar    bool HadExtra;
1934ae54af2fdcf2262e778f551941541913828fde49Daniel Dunbar    if (!Driver::GetReleaseVersion(A->getValue(Args), MacosxVersionMin[0],
1935ae54af2fdcf2262e778f551941541913828fde49Daniel Dunbar                                   MacosxVersionMin[1], MacosxVersionMin[2],
193602633b541b04ad5ffc1c70f4c2feeeb13e607057Daniel Dunbar                                   HadExtra) ||
193702633b541b04ad5ffc1c70f4c2feeeb13e607057Daniel Dunbar        HadExtra) {
193802633b541b04ad5ffc1c70f4c2feeeb13e607057Daniel Dunbar      const Driver &D = getToolChain().getHost().getDriver();
193902633b541b04ad5ffc1c70f4c2feeeb13e607057Daniel Dunbar      D.Diag(clang::diag::err_drv_invalid_version_number)
194002633b541b04ad5ffc1c70f4c2feeeb13e607057Daniel Dunbar        << A->getAsString(Args);
194102633b541b04ad5ffc1c70f4c2feeeb13e607057Daniel Dunbar    }
194202633b541b04ad5ffc1c70f4c2feeeb13e607057Daniel Dunbar  } else {
1943ae54af2fdcf2262e778f551941541913828fde49Daniel Dunbar    getDarwinToolChain().getMacosxVersion(MacosxVersionMin);
194402633b541b04ad5ffc1c70f4c2feeeb13e607057Daniel Dunbar  }
1945c21c485b4fb58ef5d55cf3e523263dd824a2ace4Daniel Dunbar
194602633b541b04ad5ffc1c70f4c2feeeb13e607057Daniel Dunbar  if (!Args.hasArg(options::OPT_A) &&
194702633b541b04ad5ffc1c70f4c2feeeb13e607057Daniel Dunbar      !Args.hasArg(options::OPT_nostdlib) &&
194802633b541b04ad5ffc1c70f4c2feeeb13e607057Daniel Dunbar      !Args.hasArg(options::OPT_nostartfiles)) {
194902633b541b04ad5ffc1c70f4c2feeeb13e607057Daniel Dunbar    // Derived from startfile spec.
195002633b541b04ad5ffc1c70f4c2feeeb13e607057Daniel Dunbar    if (Args.hasArg(options::OPT_dynamiclib)) {
1951c21c485b4fb58ef5d55cf3e523263dd824a2ace4Daniel Dunbar      // Derived from darwin_dylib1 spec.
1952ae54af2fdcf2262e778f551941541913828fde49Daniel Dunbar      if (isMacosxVersionLT(MacosxVersionMin, 10, 5))
195302633b541b04ad5ffc1c70f4c2feeeb13e607057Daniel Dunbar        CmdArgs.push_back("-ldylib1.o");
1954ae54af2fdcf2262e778f551941541913828fde49Daniel Dunbar      else if (isMacosxVersionLT(MacosxVersionMin, 10, 6))
195502633b541b04ad5ffc1c70f4c2feeeb13e607057Daniel Dunbar        CmdArgs.push_back("-ldylib1.10.5.o");
195602633b541b04ad5ffc1c70f4c2feeeb13e607057Daniel Dunbar    } else {
195702633b541b04ad5ffc1c70f4c2feeeb13e607057Daniel Dunbar      if (Args.hasArg(options::OPT_bundle)) {
19588a8d8afa3df40e9f122d2b826f1a825a66f6908dDaniel Dunbar        if (!Args.hasArg(options::OPT_static)) {
19598a8d8afa3df40e9f122d2b826f1a825a66f6908dDaniel Dunbar          // Derived from darwin_bundle1 spec.
1960ae54af2fdcf2262e778f551941541913828fde49Daniel Dunbar          if (isMacosxVersionLT(MacosxVersionMin, 10, 6))
19618a8d8afa3df40e9f122d2b826f1a825a66f6908dDaniel Dunbar            CmdArgs.push_back("-lbundle1.o");
19628a8d8afa3df40e9f122d2b826f1a825a66f6908dDaniel Dunbar        }
196302633b541b04ad5ffc1c70f4c2feeeb13e607057Daniel Dunbar      } else {
196402633b541b04ad5ffc1c70f4c2feeeb13e607057Daniel Dunbar        if (Args.hasArg(options::OPT_pg)) {
196502633b541b04ad5ffc1c70f4c2feeeb13e607057Daniel Dunbar          if (Args.hasArg(options::OPT_static) ||
196602633b541b04ad5ffc1c70f4c2feeeb13e607057Daniel Dunbar              Args.hasArg(options::OPT_object) ||
196702633b541b04ad5ffc1c70f4c2feeeb13e607057Daniel Dunbar              Args.hasArg(options::OPT_preload)) {
196802633b541b04ad5ffc1c70f4c2feeeb13e607057Daniel Dunbar            CmdArgs.push_back("-lgcrt0.o");
196902633b541b04ad5ffc1c70f4c2feeeb13e607057Daniel Dunbar          } else {
197002633b541b04ad5ffc1c70f4c2feeeb13e607057Daniel Dunbar            CmdArgs.push_back("-lgcrt1.o");
1971c21c485b4fb58ef5d55cf3e523263dd824a2ace4Daniel Dunbar
197202633b541b04ad5ffc1c70f4c2feeeb13e607057Daniel Dunbar            // darwin_crt2 spec is empty.
1973c21c485b4fb58ef5d55cf3e523263dd824a2ace4Daniel Dunbar          }
197402633b541b04ad5ffc1c70f4c2feeeb13e607057Daniel Dunbar        } else {
197502633b541b04ad5ffc1c70f4c2feeeb13e607057Daniel Dunbar          if (Args.hasArg(options::OPT_static) ||
197602633b541b04ad5ffc1c70f4c2feeeb13e607057Daniel Dunbar              Args.hasArg(options::OPT_object) ||
197702633b541b04ad5ffc1c70f4c2feeeb13e607057Daniel Dunbar              Args.hasArg(options::OPT_preload)) {
197802633b541b04ad5ffc1c70f4c2feeeb13e607057Daniel Dunbar            CmdArgs.push_back("-lcrt0.o");
197902633b541b04ad5ffc1c70f4c2feeeb13e607057Daniel Dunbar          } else {
198002633b541b04ad5ffc1c70f4c2feeeb13e607057Daniel Dunbar            // Derived from darwin_crt1 spec.
1981ae33f8ff4749dd69060c70dae15e68e454dc3011Daniel Dunbar            if (getDarwinToolChain().isIPhone()) {
1982ae33f8ff4749dd69060c70dae15e68e454dc3011Daniel Dunbar              CmdArgs.push_back("-lcrt1.o");
1983ae54af2fdcf2262e778f551941541913828fde49Daniel Dunbar            } else if (isMacosxVersionLT(MacosxVersionMin, 10, 5))
198402633b541b04ad5ffc1c70f4c2feeeb13e607057Daniel Dunbar              CmdArgs.push_back("-lcrt1.o");
1985ae54af2fdcf2262e778f551941541913828fde49Daniel Dunbar            else if (isMacosxVersionLT(MacosxVersionMin, 10, 6))
198602633b541b04ad5ffc1c70f4c2feeeb13e607057Daniel Dunbar              CmdArgs.push_back("-lcrt1.10.5.o");
19878a8d8afa3df40e9f122d2b826f1a825a66f6908dDaniel Dunbar            else
19888a8d8afa3df40e9f122d2b826f1a825a66f6908dDaniel Dunbar              CmdArgs.push_back("-lcrt1.10.6.o");
1989c21c485b4fb58ef5d55cf3e523263dd824a2ace4Daniel Dunbar
19908a8d8afa3df40e9f122d2b826f1a825a66f6908dDaniel Dunbar            // darwin_crt2 spec is empty.
199102633b541b04ad5ffc1c70f4c2feeeb13e607057Daniel Dunbar          }
199202633b541b04ad5ffc1c70f4c2feeeb13e607057Daniel Dunbar        }
199302633b541b04ad5ffc1c70f4c2feeeb13e607057Daniel Dunbar      }
199402633b541b04ad5ffc1c70f4c2feeeb13e607057Daniel Dunbar    }
199502633b541b04ad5ffc1c70f4c2feeeb13e607057Daniel Dunbar
199602633b541b04ad5ffc1c70f4c2feeeb13e607057Daniel Dunbar    if (Args.hasArg(options::OPT_shared_libgcc) &&
199702633b541b04ad5ffc1c70f4c2feeeb13e607057Daniel Dunbar        !Args.hasArg(options::OPT_miphoneos_version_min_EQ) &&
1998ae54af2fdcf2262e778f551941541913828fde49Daniel Dunbar        isMacosxVersionLT(MacosxVersionMin, 10, 5)) {
1999881376467c46c5c6cc16fa6790271c2c22e1d4f1Daniel Dunbar      const char *Str =
20005ed34f4c58b6ad4e21038d713c1fae31a6146ff5Daniel Dunbar        Args.MakeArgString(getToolChain().GetFilePath(C, "crt3.o"));
2001881376467c46c5c6cc16fa6790271c2c22e1d4f1Daniel Dunbar      CmdArgs.push_back(Str);
200202633b541b04ad5ffc1c70f4c2feeeb13e607057Daniel Dunbar    }
200302633b541b04ad5ffc1c70f4c2feeeb13e607057Daniel Dunbar  }
200402633b541b04ad5ffc1c70f4c2feeeb13e607057Daniel Dunbar
200502633b541b04ad5ffc1c70f4c2feeeb13e607057Daniel Dunbar  Args.AddAllArgs(CmdArgs, options::OPT_L);
2006c21c485b4fb58ef5d55cf3e523263dd824a2ace4Daniel Dunbar
200702633b541b04ad5ffc1c70f4c2feeeb13e607057Daniel Dunbar  if (Args.hasArg(options::OPT_fopenmp))
200802633b541b04ad5ffc1c70f4c2feeeb13e607057Daniel Dunbar    // This is more complicated in gcc...
200902633b541b04ad5ffc1c70f4c2feeeb13e607057Daniel Dunbar    CmdArgs.push_back("-lgomp");
201002633b541b04ad5ffc1c70f4c2feeeb13e607057Daniel Dunbar
20116b200b2b698b6ac9e310f2225c69c85d28ae4fb0Daniel Dunbar  getDarwinToolChain().AddLinkSearchPathArgs(Args, CmdArgs);
2012c21c485b4fb58ef5d55cf3e523263dd824a2ace4Daniel Dunbar
201302633b541b04ad5ffc1c70f4c2feeeb13e607057Daniel Dunbar  for (InputInfoList::const_iterator
201402633b541b04ad5ffc1c70f4c2feeeb13e607057Daniel Dunbar         it = Inputs.begin(), ie = Inputs.end(); it != ie; ++it) {
201502633b541b04ad5ffc1c70f4c2feeeb13e607057Daniel Dunbar    const InputInfo &II = *it;
201602633b541b04ad5ffc1c70f4c2feeeb13e607057Daniel Dunbar    if (II.isFilename())
201702633b541b04ad5ffc1c70f4c2feeeb13e607057Daniel Dunbar      CmdArgs.push_back(II.getFilename());
2018c21c485b4fb58ef5d55cf3e523263dd824a2ace4Daniel Dunbar    else
201902633b541b04ad5ffc1c70f4c2feeeb13e607057Daniel Dunbar      II.getInputArg().renderAsInput(Args, CmdArgs);
202002633b541b04ad5ffc1c70f4c2feeeb13e607057Daniel Dunbar  }
202102633b541b04ad5ffc1c70f4c2feeeb13e607057Daniel Dunbar
202202633b541b04ad5ffc1c70f4c2feeeb13e607057Daniel Dunbar  if (LinkingOutput) {
202302633b541b04ad5ffc1c70f4c2feeeb13e607057Daniel Dunbar    CmdArgs.push_back("-arch_multiple");
202402633b541b04ad5ffc1c70f4c2feeeb13e607057Daniel Dunbar    CmdArgs.push_back("-final_output");
202502633b541b04ad5ffc1c70f4c2feeeb13e607057Daniel Dunbar    CmdArgs.push_back(LinkingOutput);
202602633b541b04ad5ffc1c70f4c2feeeb13e607057Daniel Dunbar  }
202702633b541b04ad5ffc1c70f4c2feeeb13e607057Daniel Dunbar
202802633b541b04ad5ffc1c70f4c2feeeb13e607057Daniel Dunbar  if (Args.hasArg(options::OPT_fprofile_arcs) ||
202902633b541b04ad5ffc1c70f4c2feeeb13e607057Daniel Dunbar      Args.hasArg(options::OPT_fprofile_generate) ||
203002633b541b04ad5ffc1c70f4c2feeeb13e607057Daniel Dunbar      Args.hasArg(options::OPT_fcreate_profile) ||
203102633b541b04ad5ffc1c70f4c2feeeb13e607057Daniel Dunbar      Args.hasArg(options::OPT_coverage))
203202633b541b04ad5ffc1c70f4c2feeeb13e607057Daniel Dunbar    CmdArgs.push_back("-lgcov");
2033c21c485b4fb58ef5d55cf3e523263dd824a2ace4Daniel Dunbar
203402633b541b04ad5ffc1c70f4c2feeeb13e607057Daniel Dunbar  if (Args.hasArg(options::OPT_fnested_functions))
203502633b541b04ad5ffc1c70f4c2feeeb13e607057Daniel Dunbar    CmdArgs.push_back("-allow_stack_execute");
2036c21c485b4fb58ef5d55cf3e523263dd824a2ace4Daniel Dunbar
203702633b541b04ad5ffc1c70f4c2feeeb13e607057Daniel Dunbar  if (!Args.hasArg(options::OPT_nostdlib) &&
203802633b541b04ad5ffc1c70f4c2feeeb13e607057Daniel Dunbar      !Args.hasArg(options::OPT_nodefaultlibs)) {
2039edfa02b85b186e9ea9e0c841539a77ed32ee9148Daniel Dunbar    // FIXME: g++ is more complicated here, it tries to put -lstdc++
2040edfa02b85b186e9ea9e0c841539a77ed32ee9148Daniel Dunbar    // before -lm, for example.
2041edfa02b85b186e9ea9e0c841539a77ed32ee9148Daniel Dunbar    if (getToolChain().getHost().getDriver().CCCIsCXX)
2042edfa02b85b186e9ea9e0c841539a77ed32ee9148Daniel Dunbar      CmdArgs.push_back("-lstdc++");
2043edfa02b85b186e9ea9e0c841539a77ed32ee9148Daniel Dunbar
204402633b541b04ad5ffc1c70f4c2feeeb13e607057Daniel Dunbar    // link_ssp spec is empty.
204502633b541b04ad5ffc1c70f4c2feeeb13e607057Daniel Dunbar
20468a8d8afa3df40e9f122d2b826f1a825a66f6908dDaniel Dunbar    // Derived from libgcc and lib specs but refactored.
204702633b541b04ad5ffc1c70f4c2feeeb13e607057Daniel Dunbar    if (Args.hasArg(options::OPT_static)) {
204802633b541b04ad5ffc1c70f4c2feeeb13e607057Daniel Dunbar      CmdArgs.push_back("-lgcc_static");
204902633b541b04ad5ffc1c70f4c2feeeb13e607057Daniel Dunbar    } else {
20508a8d8afa3df40e9f122d2b826f1a825a66f6908dDaniel Dunbar      if (Args.hasArg(options::OPT_static_libgcc)) {
20518a8d8afa3df40e9f122d2b826f1a825a66f6908dDaniel Dunbar        CmdArgs.push_back("-lgcc_eh");
20528a8d8afa3df40e9f122d2b826f1a825a66f6908dDaniel Dunbar      } else if (Args.hasArg(options::OPT_miphoneos_version_min_EQ)) {
20538a8d8afa3df40e9f122d2b826f1a825a66f6908dDaniel Dunbar        // Derived from darwin_iphoneos_libgcc spec.
2054ae33f8ff4749dd69060c70dae15e68e454dc3011Daniel Dunbar        if (getDarwinToolChain().isIPhone()) {
2055ae33f8ff4749dd69060c70dae15e68e454dc3011Daniel Dunbar          CmdArgs.push_back("-lgcc_s.1");
2056ae33f8ff4749dd69060c70dae15e68e454dc3011Daniel Dunbar        } else {
2057ae33f8ff4749dd69060c70dae15e68e454dc3011Daniel Dunbar          CmdArgs.push_back("-lgcc_s.10.5");
2058ae33f8ff4749dd69060c70dae15e68e454dc3011Daniel Dunbar        }
20598a8d8afa3df40e9f122d2b826f1a825a66f6908dDaniel Dunbar      } else if (Args.hasArg(options::OPT_shared_libgcc) ||
2060738f8c278da5950d0d4607de2debe0bdfad64185Mike Stump                 // FIXME: -fexceptions -fno-exceptions means no exceptions
20618a8d8afa3df40e9f122d2b826f1a825a66f6908dDaniel Dunbar                 Args.hasArg(options::OPT_fexceptions) ||
20628a8d8afa3df40e9f122d2b826f1a825a66f6908dDaniel Dunbar                 Args.hasArg(options::OPT_fgnu_runtime)) {
20638a8d8afa3df40e9f122d2b826f1a825a66f6908dDaniel Dunbar        // FIXME: This is probably broken on 10.3?
2064ae54af2fdcf2262e778f551941541913828fde49Daniel Dunbar        if (isMacosxVersionLT(MacosxVersionMin, 10, 5))
20658a8d8afa3df40e9f122d2b826f1a825a66f6908dDaniel Dunbar          CmdArgs.push_back("-lgcc_s.10.4");
2066ae54af2fdcf2262e778f551941541913828fde49Daniel Dunbar        else if (isMacosxVersionLT(MacosxVersionMin, 10, 6))
20678a8d8afa3df40e9f122d2b826f1a825a66f6908dDaniel Dunbar          CmdArgs.push_back("-lgcc_s.10.5");
20688a8d8afa3df40e9f122d2b826f1a825a66f6908dDaniel Dunbar      } else {
2069ae54af2fdcf2262e778f551941541913828fde49Daniel Dunbar        if (isMacosxVersionLT(MacosxVersionMin, 10, 3, 9))
20708a8d8afa3df40e9f122d2b826f1a825a66f6908dDaniel Dunbar          ; // Do nothing.
2071ae54af2fdcf2262e778f551941541913828fde49Daniel Dunbar        else if (isMacosxVersionLT(MacosxVersionMin, 10, 5))
20728a8d8afa3df40e9f122d2b826f1a825a66f6908dDaniel Dunbar          CmdArgs.push_back("-lgcc_s.10.4");
2073ae54af2fdcf2262e778f551941541913828fde49Daniel Dunbar        else if (isMacosxVersionLT(MacosxVersionMin, 10, 6))
20748a8d8afa3df40e9f122d2b826f1a825a66f6908dDaniel Dunbar          CmdArgs.push_back("-lgcc_s.10.5");
20758a8d8afa3df40e9f122d2b826f1a825a66f6908dDaniel Dunbar      }
207602633b541b04ad5ffc1c70f4c2feeeb13e607057Daniel Dunbar
2077ae33f8ff4749dd69060c70dae15e68e454dc3011Daniel Dunbar      if (getDarwinToolChain().isIPhone() ||
2078ae54af2fdcf2262e778f551941541913828fde49Daniel Dunbar          isMacosxVersionLT(MacosxVersionMin, 10, 6)) {
20798a8d8afa3df40e9f122d2b826f1a825a66f6908dDaniel Dunbar        CmdArgs.push_back("-lgcc");
20808a8d8afa3df40e9f122d2b826f1a825a66f6908dDaniel Dunbar        CmdArgs.push_back("-lSystem");
20818a8d8afa3df40e9f122d2b826f1a825a66f6908dDaniel Dunbar      } else {
20828a8d8afa3df40e9f122d2b826f1a825a66f6908dDaniel Dunbar        CmdArgs.push_back("-lSystem");
20838a8d8afa3df40e9f122d2b826f1a825a66f6908dDaniel Dunbar        CmdArgs.push_back("-lgcc");
20848a8d8afa3df40e9f122d2b826f1a825a66f6908dDaniel Dunbar      }
20858a8d8afa3df40e9f122d2b826f1a825a66f6908dDaniel Dunbar    }
208602633b541b04ad5ffc1c70f4c2feeeb13e607057Daniel Dunbar  }
208702633b541b04ad5ffc1c70f4c2feeeb13e607057Daniel Dunbar
208802633b541b04ad5ffc1c70f4c2feeeb13e607057Daniel Dunbar  if (!Args.hasArg(options::OPT_A) &&
208902633b541b04ad5ffc1c70f4c2feeeb13e607057Daniel Dunbar      !Args.hasArg(options::OPT_nostdlib) &&
209002633b541b04ad5ffc1c70f4c2feeeb13e607057Daniel Dunbar      !Args.hasArg(options::OPT_nostartfiles)) {
209102633b541b04ad5ffc1c70f4c2feeeb13e607057Daniel Dunbar    // endfile_spec is empty.
209202633b541b04ad5ffc1c70f4c2feeeb13e607057Daniel Dunbar  }
209302633b541b04ad5ffc1c70f4c2feeeb13e607057Daniel Dunbar
209402633b541b04ad5ffc1c70f4c2feeeb13e607057Daniel Dunbar  Args.AddAllArgs(CmdArgs, options::OPT_T_Group);
209502633b541b04ad5ffc1c70f4c2feeeb13e607057Daniel Dunbar  Args.AddAllArgs(CmdArgs, options::OPT_F);
209602633b541b04ad5ffc1c70f4c2feeeb13e607057Daniel Dunbar
2097c21c485b4fb58ef5d55cf3e523263dd824a2ace4Daniel Dunbar  const char *Exec =
20985ed34f4c58b6ad4e21038d713c1fae31a6146ff5Daniel Dunbar    Args.MakeArgString(getToolChain().GetProgramPath(C, "ld"));
2099cae087e164e94e4286c11bf694dd0ff88f295302Daniel Dunbar  Dest.addCommand(new Command(JA, Exec, CmdArgs));
210002633b541b04ad5ffc1c70f4c2feeeb13e607057Daniel Dunbar
21010b46e1b5389615a8d6641f4d7bf5415d29acfef3Daniel Dunbar  // Find the first non-empty base input (we want to ignore linker
21020b46e1b5389615a8d6641f4d7bf5415d29acfef3Daniel Dunbar  // inputs).
21030b46e1b5389615a8d6641f4d7bf5415d29acfef3Daniel Dunbar  const char *BaseInput = "";
21040b46e1b5389615a8d6641f4d7bf5415d29acfef3Daniel Dunbar  for (unsigned i = 0, e = Inputs.size(); i != e; ++i) {
21050b46e1b5389615a8d6641f4d7bf5415d29acfef3Daniel Dunbar    if (Inputs[i].getBaseInput()[0] != '\0') {
21060b46e1b5389615a8d6641f4d7bf5415d29acfef3Daniel Dunbar      BaseInput = Inputs[i].getBaseInput();
21070b46e1b5389615a8d6641f4d7bf5415d29acfef3Daniel Dunbar      break;
21080b46e1b5389615a8d6641f4d7bf5415d29acfef3Daniel Dunbar    }
21090b46e1b5389615a8d6641f4d7bf5415d29acfef3Daniel Dunbar  }
2110c21c485b4fb58ef5d55cf3e523263dd824a2ace4Daniel Dunbar
21113ed294522653323e4867a2eba03acc98a99e5479Daniel Dunbar  // Run dsymutil if we are making an executable in a single step.
21123ed294522653323e4867a2eba03acc98a99e5479Daniel Dunbar  //
21133ed294522653323e4867a2eba03acc98a99e5479Daniel Dunbar  // FIXME: Currently we don't want to do this when we are part of a
21143ed294522653323e4867a2eba03acc98a99e5479Daniel Dunbar  // universal build step, as this would end up creating stray temp
21153ed294522653323e4867a2eba03acc98a99e5479Daniel Dunbar  // files.
21163ed294522653323e4867a2eba03acc98a99e5479Daniel Dunbar  if (!LinkingOutput &&
21173ed294522653323e4867a2eba03acc98a99e5479Daniel Dunbar      Args.getLastArg(options::OPT_g_Group) &&
211802633b541b04ad5ffc1c70f4c2feeeb13e607057Daniel Dunbar      !Args.getLastArg(options::OPT_gstabs) &&
211902633b541b04ad5ffc1c70f4c2feeeb13e607057Daniel Dunbar      !Args.getLastArg(options::OPT_g0)) {
212002633b541b04ad5ffc1c70f4c2feeeb13e607057Daniel Dunbar    // FIXME: This is gross, but matches gcc. The test only considers
212102633b541b04ad5ffc1c70f4c2feeeb13e607057Daniel Dunbar    // the suffix (not the -x type), and then only of the first
21220b46e1b5389615a8d6641f4d7bf5415d29acfef3Daniel Dunbar    // source input. Awesome.
21230b46e1b5389615a8d6641f4d7bf5415d29acfef3Daniel Dunbar    const char *Suffix = strrchr(BaseInput, '.');
212402633b541b04ad5ffc1c70f4c2feeeb13e607057Daniel Dunbar    if (Suffix && isSourceSuffix(Suffix + 1)) {
2125c21c485b4fb58ef5d55cf3e523263dd824a2ace4Daniel Dunbar      const char *Exec =
21265ed34f4c58b6ad4e21038d713c1fae31a6146ff5Daniel Dunbar        Args.MakeArgString(getToolChain().GetProgramPath(C, "dsymutil"));
212702633b541b04ad5ffc1c70f4c2feeeb13e607057Daniel Dunbar      ArgStringList CmdArgs;
212802633b541b04ad5ffc1c70f4c2feeeb13e607057Daniel Dunbar      CmdArgs.push_back(Output.getFilename());
2129cae087e164e94e4286c11bf694dd0ff88f295302Daniel Dunbar      C.getJobs().addCommand(new Command(JA, Exec, CmdArgs));
213002633b541b04ad5ffc1c70f4c2feeeb13e607057Daniel Dunbar    }
213102633b541b04ad5ffc1c70f4c2feeeb13e607057Daniel Dunbar  }
213202633b541b04ad5ffc1c70f4c2feeeb13e607057Daniel Dunbar}
213302633b541b04ad5ffc1c70f4c2feeeb13e607057Daniel Dunbar
2134ff7488dc9a766f94daf54d81b03ab9160d0bfd88Daniel Dunbarvoid darwin::Lipo::ConstructJob(Compilation &C, const JobAction &JA,
2135c21c485b4fb58ef5d55cf3e523263dd824a2ace4Daniel Dunbar                                Job &Dest, const InputInfo &Output,
2136c21c485b4fb58ef5d55cf3e523263dd824a2ace4Daniel Dunbar                                const InputInfoList &Inputs,
2137c21c485b4fb58ef5d55cf3e523263dd824a2ace4Daniel Dunbar                                const ArgList &Args,
2138ff7488dc9a766f94daf54d81b03ab9160d0bfd88Daniel Dunbar                                const char *LinkingOutput) const {
2139ff7488dc9a766f94daf54d81b03ab9160d0bfd88Daniel Dunbar  ArgStringList CmdArgs;
2140ff7488dc9a766f94daf54d81b03ab9160d0bfd88Daniel Dunbar
2141ff7488dc9a766f94daf54d81b03ab9160d0bfd88Daniel Dunbar  CmdArgs.push_back("-create");
2142ff7488dc9a766f94daf54d81b03ab9160d0bfd88Daniel Dunbar  assert(Output.isFilename() && "Unexpected lipo output.");
2143a428df828ea4cc6916ea90dcd9fbbc840776d207Daniel Dunbar
2144a428df828ea4cc6916ea90dcd9fbbc840776d207Daniel Dunbar  CmdArgs.push_back("-output");
2145ff7488dc9a766f94daf54d81b03ab9160d0bfd88Daniel Dunbar  CmdArgs.push_back(Output.getFilename());
2146a428df828ea4cc6916ea90dcd9fbbc840776d207Daniel Dunbar
2147ff7488dc9a766f94daf54d81b03ab9160d0bfd88Daniel Dunbar  for (InputInfoList::const_iterator
2148ff7488dc9a766f94daf54d81b03ab9160d0bfd88Daniel Dunbar         it = Inputs.begin(), ie = Inputs.end(); it != ie; ++it) {
2149ff7488dc9a766f94daf54d81b03ab9160d0bfd88Daniel Dunbar    const InputInfo &II = *it;
2150ff7488dc9a766f94daf54d81b03ab9160d0bfd88Daniel Dunbar    assert(II.isFilename() && "Unexpected lipo input.");
2151ff7488dc9a766f94daf54d81b03ab9160d0bfd88Daniel Dunbar    CmdArgs.push_back(II.getFilename());
2152ff7488dc9a766f94daf54d81b03ab9160d0bfd88Daniel Dunbar  }
2153c21c485b4fb58ef5d55cf3e523263dd824a2ace4Daniel Dunbar  const char *Exec =
21545ed34f4c58b6ad4e21038d713c1fae31a6146ff5Daniel Dunbar    Args.MakeArgString(getToolChain().GetProgramPath(C, "lipo"));
2155cae087e164e94e4286c11bf694dd0ff88f295302Daniel Dunbar  Dest.addCommand(new Command(JA, Exec, CmdArgs));
2156ff7488dc9a766f94daf54d81b03ab9160d0bfd88Daniel Dunbar}
215768a31d406c6dc4382c700d1199b062de2aa7e1daDaniel Dunbar
2158e7925a075f110ab21afeae084670a155dea568e3Edward O'Callaghanvoid auroraux::Assemble::ConstructJob(Compilation &C, const JobAction &JA,
2159e7925a075f110ab21afeae084670a155dea568e3Edward O'Callaghan                                     Job &Dest, const InputInfo &Output,
2160e7925a075f110ab21afeae084670a155dea568e3Edward O'Callaghan                                     const InputInfoList &Inputs,
2161e7925a075f110ab21afeae084670a155dea568e3Edward O'Callaghan                                     const ArgList &Args,
21621eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump                                     const char *LinkingOutput) const {
2163e7925a075f110ab21afeae084670a155dea568e3Edward O'Callaghan  ArgStringList CmdArgs;
2164e7925a075f110ab21afeae084670a155dea568e3Edward O'Callaghan
2165e7925a075f110ab21afeae084670a155dea568e3Edward O'Callaghan  Args.AddAllArgValues(CmdArgs, options::OPT_Wa_COMMA,
2166e7925a075f110ab21afeae084670a155dea568e3Edward O'Callaghan                       options::OPT_Xassembler);
2167e7925a075f110ab21afeae084670a155dea568e3Edward O'Callaghan
2168e7925a075f110ab21afeae084670a155dea568e3Edward O'Callaghan  CmdArgs.push_back("-o");
2169e7925a075f110ab21afeae084670a155dea568e3Edward O'Callaghan  if (Output.isPipe())
2170e7925a075f110ab21afeae084670a155dea568e3Edward O'Callaghan    CmdArgs.push_back("-");
2171e7925a075f110ab21afeae084670a155dea568e3Edward O'Callaghan  else
2172e7925a075f110ab21afeae084670a155dea568e3Edward O'Callaghan    CmdArgs.push_back(Output.getFilename());
2173e7925a075f110ab21afeae084670a155dea568e3Edward O'Callaghan
2174e7925a075f110ab21afeae084670a155dea568e3Edward O'Callaghan  for (InputInfoList::const_iterator
2175e7925a075f110ab21afeae084670a155dea568e3Edward O'Callaghan         it = Inputs.begin(), ie = Inputs.end(); it != ie; ++it) {
2176e7925a075f110ab21afeae084670a155dea568e3Edward O'Callaghan    const InputInfo &II = *it;
2177e7925a075f110ab21afeae084670a155dea568e3Edward O'Callaghan    if (II.isPipe())
2178e7925a075f110ab21afeae084670a155dea568e3Edward O'Callaghan      CmdArgs.push_back("-");
2179e7925a075f110ab21afeae084670a155dea568e3Edward O'Callaghan    else
2180e7925a075f110ab21afeae084670a155dea568e3Edward O'Callaghan      CmdArgs.push_back(II.getFilename());
2181e7925a075f110ab21afeae084670a155dea568e3Edward O'Callaghan  }
2182e7925a075f110ab21afeae084670a155dea568e3Edward O'Callaghan
2183e7925a075f110ab21afeae084670a155dea568e3Edward O'Callaghan  const char *Exec =
21845ed34f4c58b6ad4e21038d713c1fae31a6146ff5Daniel Dunbar    Args.MakeArgString(getToolChain().GetProgramPath(C, "as"));
2185e7925a075f110ab21afeae084670a155dea568e3Edward O'Callaghan  Dest.addCommand(new Command(JA, Exec, CmdArgs));
2186e7925a075f110ab21afeae084670a155dea568e3Edward O'Callaghan}
2187e7925a075f110ab21afeae084670a155dea568e3Edward O'Callaghan
2188e7925a075f110ab21afeae084670a155dea568e3Edward O'Callaghanvoid auroraux::Link::ConstructJob(Compilation &C, const JobAction &JA,
2189e7925a075f110ab21afeae084670a155dea568e3Edward O'Callaghan                                 Job &Dest, const InputInfo &Output,
2190e7925a075f110ab21afeae084670a155dea568e3Edward O'Callaghan                                 const InputInfoList &Inputs,
2191e7925a075f110ab21afeae084670a155dea568e3Edward O'Callaghan                                 const ArgList &Args,
2192e7925a075f110ab21afeae084670a155dea568e3Edward O'Callaghan                                 const char *LinkingOutput) const {
2193e7925a075f110ab21afeae084670a155dea568e3Edward O'Callaghan  const Driver &D = getToolChain().getHost().getDriver();
2194e7925a075f110ab21afeae084670a155dea568e3Edward O'Callaghan  ArgStringList CmdArgs;
2195e7925a075f110ab21afeae084670a155dea568e3Edward O'Callaghan
2196e7925a075f110ab21afeae084670a155dea568e3Edward O'Callaghan  if ((!Args.hasArg(options::OPT_nostdlib)) &&
2197e7925a075f110ab21afeae084670a155dea568e3Edward O'Callaghan     (!Args.hasArg(options::OPT_shared))) {
2198e7925a075f110ab21afeae084670a155dea568e3Edward O'Callaghan    CmdArgs.push_back("-e");
2199e7925a075f110ab21afeae084670a155dea568e3Edward O'Callaghan    CmdArgs.push_back("__start");
2200e7925a075f110ab21afeae084670a155dea568e3Edward O'Callaghan  }
2201e7925a075f110ab21afeae084670a155dea568e3Edward O'Callaghan
2202e7925a075f110ab21afeae084670a155dea568e3Edward O'Callaghan  if (Args.hasArg(options::OPT_static)) {
2203e7925a075f110ab21afeae084670a155dea568e3Edward O'Callaghan    CmdArgs.push_back("-Bstatic");
2204e7925a075f110ab21afeae084670a155dea568e3Edward O'Callaghan  } else {
2205e7925a075f110ab21afeae084670a155dea568e3Edward O'Callaghan    CmdArgs.push_back("--eh-frame-hdr");
2206e7925a075f110ab21afeae084670a155dea568e3Edward O'Callaghan    CmdArgs.push_back("-Bdynamic");
2207e7925a075f110ab21afeae084670a155dea568e3Edward O'Callaghan    if (Args.hasArg(options::OPT_shared)) {
2208e7925a075f110ab21afeae084670a155dea568e3Edward O'Callaghan      CmdArgs.push_back("-shared");
2209e7925a075f110ab21afeae084670a155dea568e3Edward O'Callaghan    } else {
2210e7925a075f110ab21afeae084670a155dea568e3Edward O'Callaghan      CmdArgs.push_back("-dynamic-linker");
2211e7925a075f110ab21afeae084670a155dea568e3Edward O'Callaghan      CmdArgs.push_back("/lib/ld.so.1"); // 64Bit Path /lib/amd64/ld.so.1
2212e7925a075f110ab21afeae084670a155dea568e3Edward O'Callaghan    }
2213e7925a075f110ab21afeae084670a155dea568e3Edward O'Callaghan  }
2214e7925a075f110ab21afeae084670a155dea568e3Edward O'Callaghan
2215e7925a075f110ab21afeae084670a155dea568e3Edward O'Callaghan  if (Output.isPipe()) {
2216e7925a075f110ab21afeae084670a155dea568e3Edward O'Callaghan    CmdArgs.push_back("-o");
2217e7925a075f110ab21afeae084670a155dea568e3Edward O'Callaghan    CmdArgs.push_back("-");
2218e7925a075f110ab21afeae084670a155dea568e3Edward O'Callaghan  } else if (Output.isFilename()) {
2219e7925a075f110ab21afeae084670a155dea568e3Edward O'Callaghan    CmdArgs.push_back("-o");
2220e7925a075f110ab21afeae084670a155dea568e3Edward O'Callaghan    CmdArgs.push_back(Output.getFilename());
2221e7925a075f110ab21afeae084670a155dea568e3Edward O'Callaghan  } else {
2222e7925a075f110ab21afeae084670a155dea568e3Edward O'Callaghan    assert(Output.isNothing() && "Invalid output.");
2223e7925a075f110ab21afeae084670a155dea568e3Edward O'Callaghan  }
2224e7925a075f110ab21afeae084670a155dea568e3Edward O'Callaghan
2225e7925a075f110ab21afeae084670a155dea568e3Edward O'Callaghan  if (!Args.hasArg(options::OPT_nostdlib) &&
2226e7925a075f110ab21afeae084670a155dea568e3Edward O'Callaghan      !Args.hasArg(options::OPT_nostartfiles)) {
2227e7925a075f110ab21afeae084670a155dea568e3Edward O'Callaghan    if (!Args.hasArg(options::OPT_shared)) {
22285ed34f4c58b6ad4e21038d713c1fae31a6146ff5Daniel Dunbar      CmdArgs.push_back(Args.MakeArgString(getToolChain().GetFilePath(C, "crt0.o")));
22295ed34f4c58b6ad4e21038d713c1fae31a6146ff5Daniel Dunbar      CmdArgs.push_back(Args.MakeArgString(getToolChain().GetFilePath(C, "crtbegin.o")));
2230e7925a075f110ab21afeae084670a155dea568e3Edward O'Callaghan    } else {
22315ed34f4c58b6ad4e21038d713c1fae31a6146ff5Daniel Dunbar      CmdArgs.push_back(Args.MakeArgString(getToolChain().GetFilePath(C, "crtbeginS.o")));
2232e7925a075f110ab21afeae084670a155dea568e3Edward O'Callaghan    }
2233e7925a075f110ab21afeae084670a155dea568e3Edward O'Callaghan  }
2234e7925a075f110ab21afeae084670a155dea568e3Edward O'Callaghan
2235e7925a075f110ab21afeae084670a155dea568e3Edward O'Callaghan  CmdArgs.push_back(MakeFormattedString(Args,
2236e7925a075f110ab21afeae084670a155dea568e3Edward O'Callaghan                           llvm::format("-L/opt/gcc4/lib/gcc/%s/4.2.4",
2237e7925a075f110ab21afeae084670a155dea568e3Edward O'Callaghan                           getToolChain().getTripleString().c_str())));
2238e7925a075f110ab21afeae084670a155dea568e3Edward O'Callaghan
2239e7925a075f110ab21afeae084670a155dea568e3Edward O'Callaghan  Args.AddAllArgs(CmdArgs, options::OPT_L);
2240e7925a075f110ab21afeae084670a155dea568e3Edward O'Callaghan  Args.AddAllArgs(CmdArgs, options::OPT_T_Group);
2241e7925a075f110ab21afeae084670a155dea568e3Edward O'Callaghan  Args.AddAllArgs(CmdArgs, options::OPT_e);
2242e7925a075f110ab21afeae084670a155dea568e3Edward O'Callaghan
2243e7925a075f110ab21afeae084670a155dea568e3Edward O'Callaghan  for (InputInfoList::const_iterator
2244e7925a075f110ab21afeae084670a155dea568e3Edward O'Callaghan         it = Inputs.begin(), ie = Inputs.end(); it != ie; ++it) {
2245e7925a075f110ab21afeae084670a155dea568e3Edward O'Callaghan    const InputInfo &II = *it;
2246e7925a075f110ab21afeae084670a155dea568e3Edward O'Callaghan
2247e7925a075f110ab21afeae084670a155dea568e3Edward O'Callaghan    // Don't try to pass LLVM inputs to a generic gcc.
2248e7925a075f110ab21afeae084670a155dea568e3Edward O'Callaghan    if (II.getType() == types::TY_LLVMBC)
2249e7925a075f110ab21afeae084670a155dea568e3Edward O'Callaghan      D.Diag(clang::diag::err_drv_no_linker_llvm_support)
2250881376467c46c5c6cc16fa6790271c2c22e1d4f1Daniel Dunbar        << getToolChain().getTripleString();
2251e7925a075f110ab21afeae084670a155dea568e3Edward O'Callaghan
2252e7925a075f110ab21afeae084670a155dea568e3Edward O'Callaghan    if (II.isPipe())
2253e7925a075f110ab21afeae084670a155dea568e3Edward O'Callaghan      CmdArgs.push_back("-");
2254e7925a075f110ab21afeae084670a155dea568e3Edward O'Callaghan    else if (II.isFilename())
2255e7925a075f110ab21afeae084670a155dea568e3Edward O'Callaghan      CmdArgs.push_back(II.getFilename());
2256e7925a075f110ab21afeae084670a155dea568e3Edward O'Callaghan    else
2257e7925a075f110ab21afeae084670a155dea568e3Edward O'Callaghan      II.getInputArg().renderAsInput(Args, CmdArgs);
2258e7925a075f110ab21afeae084670a155dea568e3Edward O'Callaghan  }
2259e7925a075f110ab21afeae084670a155dea568e3Edward O'Callaghan
2260e7925a075f110ab21afeae084670a155dea568e3Edward O'Callaghan  if (!Args.hasArg(options::OPT_nostdlib) &&
2261e7925a075f110ab21afeae084670a155dea568e3Edward O'Callaghan      !Args.hasArg(options::OPT_nodefaultlibs)) {
2262e7925a075f110ab21afeae084670a155dea568e3Edward O'Callaghan    // FIXME: For some reason GCC passes -lgcc before adding
2263e7925a075f110ab21afeae084670a155dea568e3Edward O'Callaghan    // the default system libraries. Just mimic this for now.
2264e7925a075f110ab21afeae084670a155dea568e3Edward O'Callaghan    CmdArgs.push_back("-lgcc");
2265e7925a075f110ab21afeae084670a155dea568e3Edward O'Callaghan
2266e7925a075f110ab21afeae084670a155dea568e3Edward O'Callaghan    if (Args.hasArg(options::OPT_pthread))
2267e7925a075f110ab21afeae084670a155dea568e3Edward O'Callaghan      CmdArgs.push_back("-pthread");
2268e7925a075f110ab21afeae084670a155dea568e3Edward O'Callaghan    if (!Args.hasArg(options::OPT_shared))
2269e7925a075f110ab21afeae084670a155dea568e3Edward O'Callaghan      CmdArgs.push_back("-lc");
2270e7925a075f110ab21afeae084670a155dea568e3Edward O'Callaghan    CmdArgs.push_back("-lgcc");
2271e7925a075f110ab21afeae084670a155dea568e3Edward O'Callaghan  }
2272e7925a075f110ab21afeae084670a155dea568e3Edward O'Callaghan
2273e7925a075f110ab21afeae084670a155dea568e3Edward O'Callaghan  if (!Args.hasArg(options::OPT_nostdlib) &&
2274e7925a075f110ab21afeae084670a155dea568e3Edward O'Callaghan      !Args.hasArg(options::OPT_nostartfiles)) {
2275e7925a075f110ab21afeae084670a155dea568e3Edward O'Callaghan    if (!Args.hasArg(options::OPT_shared))
22765ed34f4c58b6ad4e21038d713c1fae31a6146ff5Daniel Dunbar      CmdArgs.push_back(Args.MakeArgString(getToolChain().GetFilePath(C, "crtend.o")));
2277e7925a075f110ab21afeae084670a155dea568e3Edward O'Callaghan    else
22785ed34f4c58b6ad4e21038d713c1fae31a6146ff5Daniel Dunbar      CmdArgs.push_back(Args.MakeArgString(getToolChain().GetFilePath(C, "crtendS.o")));
2279e7925a075f110ab21afeae084670a155dea568e3Edward O'Callaghan  }
2280e7925a075f110ab21afeae084670a155dea568e3Edward O'Callaghan
2281e7925a075f110ab21afeae084670a155dea568e3Edward O'Callaghan  const char *Exec =
22825ed34f4c58b6ad4e21038d713c1fae31a6146ff5Daniel Dunbar    Args.MakeArgString(getToolChain().GetProgramPath(C, "ld"));
2283e7925a075f110ab21afeae084670a155dea568e3Edward O'Callaghan  Dest.addCommand(new Command(JA, Exec, CmdArgs));
2284e7925a075f110ab21afeae084670a155dea568e3Edward O'Callaghan}
2285e7925a075f110ab21afeae084670a155dea568e3Edward O'Callaghan
2286f7b8eec37c8c8012fa525c71fb29a58c9f29beefDaniel Dunbarvoid openbsd::Assemble::ConstructJob(Compilation &C, const JobAction &JA,
2287f7b8eec37c8c8012fa525c71fb29a58c9f29beefDaniel Dunbar                                     Job &Dest, const InputInfo &Output,
2288f7b8eec37c8c8012fa525c71fb29a58c9f29beefDaniel Dunbar                                     const InputInfoList &Inputs,
2289f7b8eec37c8c8012fa525c71fb29a58c9f29beefDaniel Dunbar                                     const ArgList &Args,
22901eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump                                     const char *LinkingOutput) const {
2291f7b8eec37c8c8012fa525c71fb29a58c9f29beefDaniel Dunbar  ArgStringList CmdArgs;
2292f7b8eec37c8c8012fa525c71fb29a58c9f29beefDaniel Dunbar
2293f7b8eec37c8c8012fa525c71fb29a58c9f29beefDaniel Dunbar  Args.AddAllArgValues(CmdArgs, options::OPT_Wa_COMMA,
2294f7b8eec37c8c8012fa525c71fb29a58c9f29beefDaniel Dunbar                       options::OPT_Xassembler);
2295f7b8eec37c8c8012fa525c71fb29a58c9f29beefDaniel Dunbar
2296f7b8eec37c8c8012fa525c71fb29a58c9f29beefDaniel Dunbar  CmdArgs.push_back("-o");
2297f7b8eec37c8c8012fa525c71fb29a58c9f29beefDaniel Dunbar  if (Output.isPipe())
2298f7b8eec37c8c8012fa525c71fb29a58c9f29beefDaniel Dunbar    CmdArgs.push_back("-");
2299f7b8eec37c8c8012fa525c71fb29a58c9f29beefDaniel Dunbar  else
2300f7b8eec37c8c8012fa525c71fb29a58c9f29beefDaniel Dunbar    CmdArgs.push_back(Output.getFilename());
2301f7b8eec37c8c8012fa525c71fb29a58c9f29beefDaniel Dunbar
2302f7b8eec37c8c8012fa525c71fb29a58c9f29beefDaniel Dunbar  for (InputInfoList::const_iterator
2303f7b8eec37c8c8012fa525c71fb29a58c9f29beefDaniel Dunbar         it = Inputs.begin(), ie = Inputs.end(); it != ie; ++it) {
2304f7b8eec37c8c8012fa525c71fb29a58c9f29beefDaniel Dunbar    const InputInfo &II = *it;
2305f7b8eec37c8c8012fa525c71fb29a58c9f29beefDaniel Dunbar    if (II.isPipe())
2306f7b8eec37c8c8012fa525c71fb29a58c9f29beefDaniel Dunbar      CmdArgs.push_back("-");
2307f7b8eec37c8c8012fa525c71fb29a58c9f29beefDaniel Dunbar    else
2308f7b8eec37c8c8012fa525c71fb29a58c9f29beefDaniel Dunbar      CmdArgs.push_back(II.getFilename());
2309f7b8eec37c8c8012fa525c71fb29a58c9f29beefDaniel Dunbar  }
2310f7b8eec37c8c8012fa525c71fb29a58c9f29beefDaniel Dunbar
2311f7b8eec37c8c8012fa525c71fb29a58c9f29beefDaniel Dunbar  const char *Exec =
23125ed34f4c58b6ad4e21038d713c1fae31a6146ff5Daniel Dunbar    Args.MakeArgString(getToolChain().GetProgramPath(C, "as"));
2313cae087e164e94e4286c11bf694dd0ff88f295302Daniel Dunbar  Dest.addCommand(new Command(JA, Exec, CmdArgs));
2314f7b8eec37c8c8012fa525c71fb29a58c9f29beefDaniel Dunbar}
2315f7b8eec37c8c8012fa525c71fb29a58c9f29beefDaniel Dunbar
2316f7b8eec37c8c8012fa525c71fb29a58c9f29beefDaniel Dunbarvoid openbsd::Link::ConstructJob(Compilation &C, const JobAction &JA,
2317f7b8eec37c8c8012fa525c71fb29a58c9f29beefDaniel Dunbar                                 Job &Dest, const InputInfo &Output,
2318f7b8eec37c8c8012fa525c71fb29a58c9f29beefDaniel Dunbar                                 const InputInfoList &Inputs,
2319f7b8eec37c8c8012fa525c71fb29a58c9f29beefDaniel Dunbar                                 const ArgList &Args,
2320f7b8eec37c8c8012fa525c71fb29a58c9f29beefDaniel Dunbar                                 const char *LinkingOutput) const {
2321f7b8eec37c8c8012fa525c71fb29a58c9f29beefDaniel Dunbar  const Driver &D = getToolChain().getHost().getDriver();
2322f7b8eec37c8c8012fa525c71fb29a58c9f29beefDaniel Dunbar  ArgStringList CmdArgs;
2323f7b8eec37c8c8012fa525c71fb29a58c9f29beefDaniel Dunbar
23242bbcf669742b6b27748414e22f8042236fceef65Daniel Dunbar  if ((!Args.hasArg(options::OPT_nostdlib)) &&
23252bbcf669742b6b27748414e22f8042236fceef65Daniel Dunbar     (!Args.hasArg(options::OPT_shared))) {
23262bbcf669742b6b27748414e22f8042236fceef65Daniel Dunbar    CmdArgs.push_back("-e");
23272bbcf669742b6b27748414e22f8042236fceef65Daniel Dunbar    CmdArgs.push_back("__start");
23282bbcf669742b6b27748414e22f8042236fceef65Daniel Dunbar  }
23292bbcf669742b6b27748414e22f8042236fceef65Daniel Dunbar
2330f7b8eec37c8c8012fa525c71fb29a58c9f29beefDaniel Dunbar  if (Args.hasArg(options::OPT_static)) {
2331f7b8eec37c8c8012fa525c71fb29a58c9f29beefDaniel Dunbar    CmdArgs.push_back("-Bstatic");
2332f7b8eec37c8c8012fa525c71fb29a58c9f29beefDaniel Dunbar  } else {
2333f7b8eec37c8c8012fa525c71fb29a58c9f29beefDaniel Dunbar    CmdArgs.push_back("--eh-frame-hdr");
23342bbcf669742b6b27748414e22f8042236fceef65Daniel Dunbar    CmdArgs.push_back("-Bdynamic");
2335f7b8eec37c8c8012fa525c71fb29a58c9f29beefDaniel Dunbar    if (Args.hasArg(options::OPT_shared)) {
23362bbcf669742b6b27748414e22f8042236fceef65Daniel Dunbar      CmdArgs.push_back("-shared");
2337f7b8eec37c8c8012fa525c71fb29a58c9f29beefDaniel Dunbar    } else {
2338f7b8eec37c8c8012fa525c71fb29a58c9f29beefDaniel Dunbar      CmdArgs.push_back("-dynamic-linker");
2339f7b8eec37c8c8012fa525c71fb29a58c9f29beefDaniel Dunbar      CmdArgs.push_back("/usr/libexec/ld.so");
2340f7b8eec37c8c8012fa525c71fb29a58c9f29beefDaniel Dunbar    }
2341f7b8eec37c8c8012fa525c71fb29a58c9f29beefDaniel Dunbar  }
2342f7b8eec37c8c8012fa525c71fb29a58c9f29beefDaniel Dunbar
2343f7b8eec37c8c8012fa525c71fb29a58c9f29beefDaniel Dunbar  if (Output.isPipe()) {
2344f7b8eec37c8c8012fa525c71fb29a58c9f29beefDaniel Dunbar    CmdArgs.push_back("-o");
2345f7b8eec37c8c8012fa525c71fb29a58c9f29beefDaniel Dunbar    CmdArgs.push_back("-");
2346f7b8eec37c8c8012fa525c71fb29a58c9f29beefDaniel Dunbar  } else if (Output.isFilename()) {
2347f7b8eec37c8c8012fa525c71fb29a58c9f29beefDaniel Dunbar    CmdArgs.push_back("-o");
2348f7b8eec37c8c8012fa525c71fb29a58c9f29beefDaniel Dunbar    CmdArgs.push_back(Output.getFilename());
2349f7b8eec37c8c8012fa525c71fb29a58c9f29beefDaniel Dunbar  } else {
2350f7b8eec37c8c8012fa525c71fb29a58c9f29beefDaniel Dunbar    assert(Output.isNothing() && "Invalid output.");
2351f7b8eec37c8c8012fa525c71fb29a58c9f29beefDaniel Dunbar  }
2352f7b8eec37c8c8012fa525c71fb29a58c9f29beefDaniel Dunbar
2353f7b8eec37c8c8012fa525c71fb29a58c9f29beefDaniel Dunbar  if (!Args.hasArg(options::OPT_nostdlib) &&
2354f7b8eec37c8c8012fa525c71fb29a58c9f29beefDaniel Dunbar      !Args.hasArg(options::OPT_nostartfiles)) {
2355f7b8eec37c8c8012fa525c71fb29a58c9f29beefDaniel Dunbar    if (!Args.hasArg(options::OPT_shared)) {
23565ed34f4c58b6ad4e21038d713c1fae31a6146ff5Daniel Dunbar      CmdArgs.push_back(Args.MakeArgString(getToolChain().GetFilePath(C, "crt0.o")));
23575ed34f4c58b6ad4e21038d713c1fae31a6146ff5Daniel Dunbar      CmdArgs.push_back(Args.MakeArgString(getToolChain().GetFilePath(C, "crtbegin.o")));
2358f7b8eec37c8c8012fa525c71fb29a58c9f29beefDaniel Dunbar    } else {
23595ed34f4c58b6ad4e21038d713c1fae31a6146ff5Daniel Dunbar      CmdArgs.push_back(Args.MakeArgString(getToolChain().GetFilePath(C, "crtbeginS.o")));
2360f7b8eec37c8c8012fa525c71fb29a58c9f29beefDaniel Dunbar    }
2361f7b8eec37c8c8012fa525c71fb29a58c9f29beefDaniel Dunbar  }
2362f7b8eec37c8c8012fa525c71fb29a58c9f29beefDaniel Dunbar
23632bbcf669742b6b27748414e22f8042236fceef65Daniel Dunbar  CmdArgs.push_back(MakeFormattedString(Args,
23642bbcf669742b6b27748414e22f8042236fceef65Daniel Dunbar                           llvm::format("-L/usr/lib/gcc-lib/%s/3.3.5",
2365881376467c46c5c6cc16fa6790271c2c22e1d4f1Daniel Dunbar                                    getToolChain().getTripleString().c_str())));
23662bbcf669742b6b27748414e22f8042236fceef65Daniel Dunbar
2367f7b8eec37c8c8012fa525c71fb29a58c9f29beefDaniel Dunbar  Args.AddAllArgs(CmdArgs, options::OPT_L);
2368f7b8eec37c8c8012fa525c71fb29a58c9f29beefDaniel Dunbar  Args.AddAllArgs(CmdArgs, options::OPT_T_Group);
2369f7b8eec37c8c8012fa525c71fb29a58c9f29beefDaniel Dunbar  Args.AddAllArgs(CmdArgs, options::OPT_e);
2370f7b8eec37c8c8012fa525c71fb29a58c9f29beefDaniel Dunbar
2371f7b8eec37c8c8012fa525c71fb29a58c9f29beefDaniel Dunbar  for (InputInfoList::const_iterator
2372f7b8eec37c8c8012fa525c71fb29a58c9f29beefDaniel Dunbar         it = Inputs.begin(), ie = Inputs.end(); it != ie; ++it) {
2373f7b8eec37c8c8012fa525c71fb29a58c9f29beefDaniel Dunbar    const InputInfo &II = *it;
2374f7b8eec37c8c8012fa525c71fb29a58c9f29beefDaniel Dunbar
2375f7b8eec37c8c8012fa525c71fb29a58c9f29beefDaniel Dunbar    // Don't try to pass LLVM inputs to a generic gcc.
2376f7b8eec37c8c8012fa525c71fb29a58c9f29beefDaniel Dunbar    if (II.getType() == types::TY_LLVMBC)
2377f7b8eec37c8c8012fa525c71fb29a58c9f29beefDaniel Dunbar      D.Diag(clang::diag::err_drv_no_linker_llvm_support)
2378881376467c46c5c6cc16fa6790271c2c22e1d4f1Daniel Dunbar        << getToolChain().getTripleString();
2379f7b8eec37c8c8012fa525c71fb29a58c9f29beefDaniel Dunbar
2380f7b8eec37c8c8012fa525c71fb29a58c9f29beefDaniel Dunbar    if (II.isPipe())
2381f7b8eec37c8c8012fa525c71fb29a58c9f29beefDaniel Dunbar      CmdArgs.push_back("-");
2382f7b8eec37c8c8012fa525c71fb29a58c9f29beefDaniel Dunbar    else if (II.isFilename())
2383f7b8eec37c8c8012fa525c71fb29a58c9f29beefDaniel Dunbar      CmdArgs.push_back(II.getFilename());
2384f7b8eec37c8c8012fa525c71fb29a58c9f29beefDaniel Dunbar    else
2385f7b8eec37c8c8012fa525c71fb29a58c9f29beefDaniel Dunbar      II.getInputArg().renderAsInput(Args, CmdArgs);
2386f7b8eec37c8c8012fa525c71fb29a58c9f29beefDaniel Dunbar  }
2387f7b8eec37c8c8012fa525c71fb29a58c9f29beefDaniel Dunbar
2388f7b8eec37c8c8012fa525c71fb29a58c9f29beefDaniel Dunbar  if (!Args.hasArg(options::OPT_nostdlib) &&
2389f7b8eec37c8c8012fa525c71fb29a58c9f29beefDaniel Dunbar      !Args.hasArg(options::OPT_nodefaultlibs)) {
23902bbcf669742b6b27748414e22f8042236fceef65Daniel Dunbar    // FIXME: For some reason GCC passes -lgcc before adding
23912bbcf669742b6b27748414e22f8042236fceef65Daniel Dunbar    // the default system libraries. Just mimic this for now.
23922bbcf669742b6b27748414e22f8042236fceef65Daniel Dunbar    CmdArgs.push_back("-lgcc");
2393f7b8eec37c8c8012fa525c71fb29a58c9f29beefDaniel Dunbar
2394f7b8eec37c8c8012fa525c71fb29a58c9f29beefDaniel Dunbar    if (Args.hasArg(options::OPT_pthread))
2395f7b8eec37c8c8012fa525c71fb29a58c9f29beefDaniel Dunbar      CmdArgs.push_back("-pthread");
23962bbcf669742b6b27748414e22f8042236fceef65Daniel Dunbar    if (!Args.hasArg(options::OPT_shared))
23972bbcf669742b6b27748414e22f8042236fceef65Daniel Dunbar      CmdArgs.push_back("-lc");
23982bbcf669742b6b27748414e22f8042236fceef65Daniel Dunbar    CmdArgs.push_back("-lgcc");
2399f7b8eec37c8c8012fa525c71fb29a58c9f29beefDaniel Dunbar  }
2400f7b8eec37c8c8012fa525c71fb29a58c9f29beefDaniel Dunbar
2401f7b8eec37c8c8012fa525c71fb29a58c9f29beefDaniel Dunbar  if (!Args.hasArg(options::OPT_nostdlib) &&
2402f7b8eec37c8c8012fa525c71fb29a58c9f29beefDaniel Dunbar      !Args.hasArg(options::OPT_nostartfiles)) {
2403f7b8eec37c8c8012fa525c71fb29a58c9f29beefDaniel Dunbar    if (!Args.hasArg(options::OPT_shared))
24045ed34f4c58b6ad4e21038d713c1fae31a6146ff5Daniel Dunbar      CmdArgs.push_back(Args.MakeArgString(getToolChain().GetFilePath(C, "crtend.o")));
2405f7b8eec37c8c8012fa525c71fb29a58c9f29beefDaniel Dunbar    else
24065ed34f4c58b6ad4e21038d713c1fae31a6146ff5Daniel Dunbar      CmdArgs.push_back(Args.MakeArgString(getToolChain().GetFilePath(C, "crtendS.o")));
2407f7b8eec37c8c8012fa525c71fb29a58c9f29beefDaniel Dunbar  }
2408f7b8eec37c8c8012fa525c71fb29a58c9f29beefDaniel Dunbar
2409f7b8eec37c8c8012fa525c71fb29a58c9f29beefDaniel Dunbar  const char *Exec =
24105ed34f4c58b6ad4e21038d713c1fae31a6146ff5Daniel Dunbar    Args.MakeArgString(getToolChain().GetProgramPath(C, "ld"));
2411cae087e164e94e4286c11bf694dd0ff88f295302Daniel Dunbar  Dest.addCommand(new Command(JA, Exec, CmdArgs));
2412f7b8eec37c8c8012fa525c71fb29a58c9f29beefDaniel Dunbar}
2413c66a5a30a27e7b9cfab46ac8be918e3ea5b0c5a5Ed Schouten
241468a31d406c6dc4382c700d1199b062de2aa7e1daDaniel Dunbarvoid freebsd::Assemble::ConstructJob(Compilation &C, const JobAction &JA,
2415c21c485b4fb58ef5d55cf3e523263dd824a2ace4Daniel Dunbar                                     Job &Dest, const InputInfo &Output,
2416c21c485b4fb58ef5d55cf3e523263dd824a2ace4Daniel Dunbar                                     const InputInfoList &Inputs,
2417c21c485b4fb58ef5d55cf3e523263dd824a2ace4Daniel Dunbar                                     const ArgList &Args,
24181eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump                                     const char *LinkingOutput) const {
241968a31d406c6dc4382c700d1199b062de2aa7e1daDaniel Dunbar  ArgStringList CmdArgs;
242068a31d406c6dc4382c700d1199b062de2aa7e1daDaniel Dunbar
2421008f54a54299eaafdaa940e2bdeaf55935ecd95aDaniel Dunbar  // When building 32-bit code on FreeBSD/amd64, we have to explicitly
2422008f54a54299eaafdaa940e2bdeaf55935ecd95aDaniel Dunbar  // instruct as in the base system to assemble 32-bit code.
2423008f54a54299eaafdaa940e2bdeaf55935ecd95aDaniel Dunbar  if (getToolChain().getArchName() == "i386")
242468a31d406c6dc4382c700d1199b062de2aa7e1daDaniel Dunbar    CmdArgs.push_back("--32");
242568a31d406c6dc4382c700d1199b062de2aa7e1daDaniel Dunbar
242668a31d406c6dc4382c700d1199b062de2aa7e1daDaniel Dunbar  Args.AddAllArgValues(CmdArgs, options::OPT_Wa_COMMA,
242768a31d406c6dc4382c700d1199b062de2aa7e1daDaniel Dunbar                       options::OPT_Xassembler);
242868a31d406c6dc4382c700d1199b062de2aa7e1daDaniel Dunbar
242968a31d406c6dc4382c700d1199b062de2aa7e1daDaniel Dunbar  CmdArgs.push_back("-o");
243068a31d406c6dc4382c700d1199b062de2aa7e1daDaniel Dunbar  if (Output.isPipe())
243168a31d406c6dc4382c700d1199b062de2aa7e1daDaniel Dunbar    CmdArgs.push_back("-");
243268a31d406c6dc4382c700d1199b062de2aa7e1daDaniel Dunbar  else
243368a31d406c6dc4382c700d1199b062de2aa7e1daDaniel Dunbar    CmdArgs.push_back(Output.getFilename());
243468a31d406c6dc4382c700d1199b062de2aa7e1daDaniel Dunbar
243568a31d406c6dc4382c700d1199b062de2aa7e1daDaniel Dunbar  for (InputInfoList::const_iterator
243668a31d406c6dc4382c700d1199b062de2aa7e1daDaniel Dunbar         it = Inputs.begin(), ie = Inputs.end(); it != ie; ++it) {
243768a31d406c6dc4382c700d1199b062de2aa7e1daDaniel Dunbar    const InputInfo &II = *it;
243868a31d406c6dc4382c700d1199b062de2aa7e1daDaniel Dunbar    if (II.isPipe())
243968a31d406c6dc4382c700d1199b062de2aa7e1daDaniel Dunbar      CmdArgs.push_back("-");
244068a31d406c6dc4382c700d1199b062de2aa7e1daDaniel Dunbar    else
244168a31d406c6dc4382c700d1199b062de2aa7e1daDaniel Dunbar      CmdArgs.push_back(II.getFilename());
244268a31d406c6dc4382c700d1199b062de2aa7e1daDaniel Dunbar  }
244368a31d406c6dc4382c700d1199b062de2aa7e1daDaniel Dunbar
2444c21c485b4fb58ef5d55cf3e523263dd824a2ace4Daniel Dunbar  const char *Exec =
24455ed34f4c58b6ad4e21038d713c1fae31a6146ff5Daniel Dunbar    Args.MakeArgString(getToolChain().GetProgramPath(C, "as"));
2446cae087e164e94e4286c11bf694dd0ff88f295302Daniel Dunbar  Dest.addCommand(new Command(JA, Exec, CmdArgs));
244768a31d406c6dc4382c700d1199b062de2aa7e1daDaniel Dunbar}
2448008f54a54299eaafdaa940e2bdeaf55935ecd95aDaniel Dunbar
2449008f54a54299eaafdaa940e2bdeaf55935ecd95aDaniel Dunbarvoid freebsd::Link::ConstructJob(Compilation &C, const JobAction &JA,
2450c21c485b4fb58ef5d55cf3e523263dd824a2ace4Daniel Dunbar                                 Job &Dest, const InputInfo &Output,
2451c21c485b4fb58ef5d55cf3e523263dd824a2ace4Daniel Dunbar                                 const InputInfoList &Inputs,
2452c21c485b4fb58ef5d55cf3e523263dd824a2ace4Daniel Dunbar                                 const ArgList &Args,
2453a8304f67291b0182fb64f3afc621615288dd1d31Daniel Dunbar                                 const char *LinkingOutput) const {
2454a8304f67291b0182fb64f3afc621615288dd1d31Daniel Dunbar  const Driver &D = getToolChain().getHost().getDriver();
2455008f54a54299eaafdaa940e2bdeaf55935ecd95aDaniel Dunbar  ArgStringList CmdArgs;
2456008f54a54299eaafdaa940e2bdeaf55935ecd95aDaniel Dunbar
2457008f54a54299eaafdaa940e2bdeaf55935ecd95aDaniel Dunbar  if (Args.hasArg(options::OPT_static)) {
2458008f54a54299eaafdaa940e2bdeaf55935ecd95aDaniel Dunbar    CmdArgs.push_back("-Bstatic");
2459008f54a54299eaafdaa940e2bdeaf55935ecd95aDaniel Dunbar  } else {
2460008f54a54299eaafdaa940e2bdeaf55935ecd95aDaniel Dunbar    CmdArgs.push_back("--eh-frame-hdr");
2461008f54a54299eaafdaa940e2bdeaf55935ecd95aDaniel Dunbar    if (Args.hasArg(options::OPT_shared)) {
2462008f54a54299eaafdaa940e2bdeaf55935ecd95aDaniel Dunbar      CmdArgs.push_back("-Bshareable");
2463008f54a54299eaafdaa940e2bdeaf55935ecd95aDaniel Dunbar    } else {
2464008f54a54299eaafdaa940e2bdeaf55935ecd95aDaniel Dunbar      CmdArgs.push_back("-dynamic-linker");
2465008f54a54299eaafdaa940e2bdeaf55935ecd95aDaniel Dunbar      CmdArgs.push_back("/libexec/ld-elf.so.1");
2466008f54a54299eaafdaa940e2bdeaf55935ecd95aDaniel Dunbar    }
2467008f54a54299eaafdaa940e2bdeaf55935ecd95aDaniel Dunbar  }
2468008f54a54299eaafdaa940e2bdeaf55935ecd95aDaniel Dunbar
2469008f54a54299eaafdaa940e2bdeaf55935ecd95aDaniel Dunbar  // When building 32-bit code on FreeBSD/amd64, we have to explicitly
2470008f54a54299eaafdaa940e2bdeaf55935ecd95aDaniel Dunbar  // instruct ld in the base system to link 32-bit code.
2471008f54a54299eaafdaa940e2bdeaf55935ecd95aDaniel Dunbar  if (getToolChain().getArchName() == "i386") {
2472008f54a54299eaafdaa940e2bdeaf55935ecd95aDaniel Dunbar    CmdArgs.push_back("-m");
2473008f54a54299eaafdaa940e2bdeaf55935ecd95aDaniel Dunbar    CmdArgs.push_back("elf_i386_fbsd");
2474008f54a54299eaafdaa940e2bdeaf55935ecd95aDaniel Dunbar  }
2475008f54a54299eaafdaa940e2bdeaf55935ecd95aDaniel Dunbar
2476008f54a54299eaafdaa940e2bdeaf55935ecd95aDaniel Dunbar  if (Output.isPipe()) {
2477008f54a54299eaafdaa940e2bdeaf55935ecd95aDaniel Dunbar    CmdArgs.push_back("-o");
2478008f54a54299eaafdaa940e2bdeaf55935ecd95aDaniel Dunbar    CmdArgs.push_back("-");
2479008f54a54299eaafdaa940e2bdeaf55935ecd95aDaniel Dunbar  } else if (Output.isFilename()) {
2480008f54a54299eaafdaa940e2bdeaf55935ecd95aDaniel Dunbar    CmdArgs.push_back("-o");
2481008f54a54299eaafdaa940e2bdeaf55935ecd95aDaniel Dunbar    CmdArgs.push_back(Output.getFilename());
2482008f54a54299eaafdaa940e2bdeaf55935ecd95aDaniel Dunbar  } else {
2483008f54a54299eaafdaa940e2bdeaf55935ecd95aDaniel Dunbar    assert(Output.isNothing() && "Invalid output.");
2484008f54a54299eaafdaa940e2bdeaf55935ecd95aDaniel Dunbar  }
2485008f54a54299eaafdaa940e2bdeaf55935ecd95aDaniel Dunbar
2486008f54a54299eaafdaa940e2bdeaf55935ecd95aDaniel Dunbar  if (!Args.hasArg(options::OPT_nostdlib) &&
2487008f54a54299eaafdaa940e2bdeaf55935ecd95aDaniel Dunbar      !Args.hasArg(options::OPT_nostartfiles)) {
2488008f54a54299eaafdaa940e2bdeaf55935ecd95aDaniel Dunbar    if (!Args.hasArg(options::OPT_shared)) {
24895ed34f4c58b6ad4e21038d713c1fae31a6146ff5Daniel Dunbar      CmdArgs.push_back(Args.MakeArgString(getToolChain().GetFilePath(C, "crt1.o")));
24905ed34f4c58b6ad4e21038d713c1fae31a6146ff5Daniel Dunbar      CmdArgs.push_back(Args.MakeArgString(getToolChain().GetFilePath(C, "crti.o")));
24915ed34f4c58b6ad4e21038d713c1fae31a6146ff5Daniel Dunbar      CmdArgs.push_back(Args.MakeArgString(getToolChain().GetFilePath(C, "crtbegin.o")));
2492008f54a54299eaafdaa940e2bdeaf55935ecd95aDaniel Dunbar    } else {
24935ed34f4c58b6ad4e21038d713c1fae31a6146ff5Daniel Dunbar      CmdArgs.push_back(Args.MakeArgString(getToolChain().GetFilePath(C, "crti.o")));
24945ed34f4c58b6ad4e21038d713c1fae31a6146ff5Daniel Dunbar      CmdArgs.push_back(Args.MakeArgString(getToolChain().GetFilePath(C, "crtbeginS.o")));
2495008f54a54299eaafdaa940e2bdeaf55935ecd95aDaniel Dunbar    }
2496008f54a54299eaafdaa940e2bdeaf55935ecd95aDaniel Dunbar  }
2497008f54a54299eaafdaa940e2bdeaf55935ecd95aDaniel Dunbar
2498008f54a54299eaafdaa940e2bdeaf55935ecd95aDaniel Dunbar  Args.AddAllArgs(CmdArgs, options::OPT_L);
2499008f54a54299eaafdaa940e2bdeaf55935ecd95aDaniel Dunbar  Args.AddAllArgs(CmdArgs, options::OPT_T_Group);
2500008f54a54299eaafdaa940e2bdeaf55935ecd95aDaniel Dunbar  Args.AddAllArgs(CmdArgs, options::OPT_e);
2501008f54a54299eaafdaa940e2bdeaf55935ecd95aDaniel Dunbar
2502008f54a54299eaafdaa940e2bdeaf55935ecd95aDaniel Dunbar  for (InputInfoList::const_iterator
2503c21c485b4fb58ef5d55cf3e523263dd824a2ace4Daniel Dunbar         it = Inputs.begin(), ie = Inputs.end(); it != ie; ++it) {
2504008f54a54299eaafdaa940e2bdeaf55935ecd95aDaniel Dunbar    const InputInfo &II = *it;
2505a8304f67291b0182fb64f3afc621615288dd1d31Daniel Dunbar
2506a8304f67291b0182fb64f3afc621615288dd1d31Daniel Dunbar    // Don't try to pass LLVM inputs to a generic gcc.
2507a8304f67291b0182fb64f3afc621615288dd1d31Daniel Dunbar    if (II.getType() == types::TY_LLVMBC)
2508a8304f67291b0182fb64f3afc621615288dd1d31Daniel Dunbar      D.Diag(clang::diag::err_drv_no_linker_llvm_support)
2509881376467c46c5c6cc16fa6790271c2c22e1d4f1Daniel Dunbar        << getToolChain().getTripleString();
2510a8304f67291b0182fb64f3afc621615288dd1d31Daniel Dunbar
2511008f54a54299eaafdaa940e2bdeaf55935ecd95aDaniel Dunbar    if (II.isPipe())
2512008f54a54299eaafdaa940e2bdeaf55935ecd95aDaniel Dunbar      CmdArgs.push_back("-");
2513008f54a54299eaafdaa940e2bdeaf55935ecd95aDaniel Dunbar    else if (II.isFilename())
2514008f54a54299eaafdaa940e2bdeaf55935ecd95aDaniel Dunbar      CmdArgs.push_back(II.getFilename());
2515008f54a54299eaafdaa940e2bdeaf55935ecd95aDaniel Dunbar    else
2516008f54a54299eaafdaa940e2bdeaf55935ecd95aDaniel Dunbar      II.getInputArg().renderAsInput(Args, CmdArgs);
2517008f54a54299eaafdaa940e2bdeaf55935ecd95aDaniel Dunbar  }
2518008f54a54299eaafdaa940e2bdeaf55935ecd95aDaniel Dunbar
2519008f54a54299eaafdaa940e2bdeaf55935ecd95aDaniel Dunbar  if (!Args.hasArg(options::OPT_nostdlib) &&
2520008f54a54299eaafdaa940e2bdeaf55935ecd95aDaniel Dunbar      !Args.hasArg(options::OPT_nodefaultlibs)) {
2521008f54a54299eaafdaa940e2bdeaf55935ecd95aDaniel Dunbar    // FIXME: For some reason GCC passes -lgcc and -lgcc_s before adding
2522008f54a54299eaafdaa940e2bdeaf55935ecd95aDaniel Dunbar    // the default system libraries. Just mimic this for now.
2523008f54a54299eaafdaa940e2bdeaf55935ecd95aDaniel Dunbar    CmdArgs.push_back("-lgcc");
2524008f54a54299eaafdaa940e2bdeaf55935ecd95aDaniel Dunbar    if (Args.hasArg(options::OPT_static)) {
2525008f54a54299eaafdaa940e2bdeaf55935ecd95aDaniel Dunbar      CmdArgs.push_back("-lgcc_eh");
2526008f54a54299eaafdaa940e2bdeaf55935ecd95aDaniel Dunbar    } else {
2527008f54a54299eaafdaa940e2bdeaf55935ecd95aDaniel Dunbar      CmdArgs.push_back("--as-needed");
2528008f54a54299eaafdaa940e2bdeaf55935ecd95aDaniel Dunbar      CmdArgs.push_back("-lgcc_s");
2529008f54a54299eaafdaa940e2bdeaf55935ecd95aDaniel Dunbar      CmdArgs.push_back("--no-as-needed");
2530008f54a54299eaafdaa940e2bdeaf55935ecd95aDaniel Dunbar    }
2531008f54a54299eaafdaa940e2bdeaf55935ecd95aDaniel Dunbar
2532008f54a54299eaafdaa940e2bdeaf55935ecd95aDaniel Dunbar    if (Args.hasArg(options::OPT_pthread))
2533008f54a54299eaafdaa940e2bdeaf55935ecd95aDaniel Dunbar      CmdArgs.push_back("-lpthread");
2534008f54a54299eaafdaa940e2bdeaf55935ecd95aDaniel Dunbar    CmdArgs.push_back("-lc");
2535008f54a54299eaafdaa940e2bdeaf55935ecd95aDaniel Dunbar
2536008f54a54299eaafdaa940e2bdeaf55935ecd95aDaniel Dunbar    CmdArgs.push_back("-lgcc");
2537008f54a54299eaafdaa940e2bdeaf55935ecd95aDaniel Dunbar    if (Args.hasArg(options::OPT_static)) {
2538008f54a54299eaafdaa940e2bdeaf55935ecd95aDaniel Dunbar      CmdArgs.push_back("-lgcc_eh");
2539008f54a54299eaafdaa940e2bdeaf55935ecd95aDaniel Dunbar    } else {
2540008f54a54299eaafdaa940e2bdeaf55935ecd95aDaniel Dunbar      CmdArgs.push_back("--as-needed");
2541008f54a54299eaafdaa940e2bdeaf55935ecd95aDaniel Dunbar      CmdArgs.push_back("-lgcc_s");
2542008f54a54299eaafdaa940e2bdeaf55935ecd95aDaniel Dunbar      CmdArgs.push_back("--no-as-needed");
2543008f54a54299eaafdaa940e2bdeaf55935ecd95aDaniel Dunbar    }
2544008f54a54299eaafdaa940e2bdeaf55935ecd95aDaniel Dunbar  }
2545008f54a54299eaafdaa940e2bdeaf55935ecd95aDaniel Dunbar
2546008f54a54299eaafdaa940e2bdeaf55935ecd95aDaniel Dunbar  if (!Args.hasArg(options::OPT_nostdlib) &&
2547008f54a54299eaafdaa940e2bdeaf55935ecd95aDaniel Dunbar      !Args.hasArg(options::OPT_nostartfiles)) {
2548008f54a54299eaafdaa940e2bdeaf55935ecd95aDaniel Dunbar    if (!Args.hasArg(options::OPT_shared))
25495ed34f4c58b6ad4e21038d713c1fae31a6146ff5Daniel Dunbar      CmdArgs.push_back(Args.MakeArgString(getToolChain().GetFilePath(C, "crtend.o")));
2550008f54a54299eaafdaa940e2bdeaf55935ecd95aDaniel Dunbar    else
25515ed34f4c58b6ad4e21038d713c1fae31a6146ff5Daniel Dunbar      CmdArgs.push_back(Args.MakeArgString(getToolChain().GetFilePath(C, "crtendS.o")));
25525ed34f4c58b6ad4e21038d713c1fae31a6146ff5Daniel Dunbar    CmdArgs.push_back(Args.MakeArgString(getToolChain().GetFilePath(C, "crtn.o")));
2553008f54a54299eaafdaa940e2bdeaf55935ecd95aDaniel Dunbar  }
2554008f54a54299eaafdaa940e2bdeaf55935ecd95aDaniel Dunbar
2555c21c485b4fb58ef5d55cf3e523263dd824a2ace4Daniel Dunbar  const char *Exec =
25565ed34f4c58b6ad4e21038d713c1fae31a6146ff5Daniel Dunbar    Args.MakeArgString(getToolChain().GetProgramPath(C, "ld"));
2557cae087e164e94e4286c11bf694dd0ff88f295302Daniel Dunbar  Dest.addCommand(new Command(JA, Exec, CmdArgs));
2558008f54a54299eaafdaa940e2bdeaf55935ecd95aDaniel Dunbar}
255911e1b40d759a643086f590f6ffbd9d68360bad46Daniel Dunbar
256011e1b40d759a643086f590f6ffbd9d68360bad46Daniel Dunbar/// DragonFly Tools
256111e1b40d759a643086f590f6ffbd9d68360bad46Daniel Dunbar
256211e1b40d759a643086f590f6ffbd9d68360bad46Daniel Dunbar// For now, DragonFly Assemble does just about the same as for
256311e1b40d759a643086f590f6ffbd9d68360bad46Daniel Dunbar// FreeBSD, but this may change soon.
256411e1b40d759a643086f590f6ffbd9d68360bad46Daniel Dunbarvoid dragonfly::Assemble::ConstructJob(Compilation &C, const JobAction &JA,
256511e1b40d759a643086f590f6ffbd9d68360bad46Daniel Dunbar                                     Job &Dest, const InputInfo &Output,
256611e1b40d759a643086f590f6ffbd9d68360bad46Daniel Dunbar                                     const InputInfoList &Inputs,
256711e1b40d759a643086f590f6ffbd9d68360bad46Daniel Dunbar                                     const ArgList &Args,
256811e1b40d759a643086f590f6ffbd9d68360bad46Daniel Dunbar                                     const char *LinkingOutput) const {
256911e1b40d759a643086f590f6ffbd9d68360bad46Daniel Dunbar  ArgStringList CmdArgs;
257011e1b40d759a643086f590f6ffbd9d68360bad46Daniel Dunbar
257111e1b40d759a643086f590f6ffbd9d68360bad46Daniel Dunbar  // When building 32-bit code on DragonFly/pc64, we have to explicitly
257211e1b40d759a643086f590f6ffbd9d68360bad46Daniel Dunbar  // instruct as in the base system to assemble 32-bit code.
257311e1b40d759a643086f590f6ffbd9d68360bad46Daniel Dunbar  if (getToolChain().getArchName() == "i386")
257411e1b40d759a643086f590f6ffbd9d68360bad46Daniel Dunbar    CmdArgs.push_back("--32");
257511e1b40d759a643086f590f6ffbd9d68360bad46Daniel Dunbar
257611e1b40d759a643086f590f6ffbd9d68360bad46Daniel Dunbar  Args.AddAllArgValues(CmdArgs, options::OPT_Wa_COMMA,
257711e1b40d759a643086f590f6ffbd9d68360bad46Daniel Dunbar                       options::OPT_Xassembler);
257811e1b40d759a643086f590f6ffbd9d68360bad46Daniel Dunbar
257911e1b40d759a643086f590f6ffbd9d68360bad46Daniel Dunbar  CmdArgs.push_back("-o");
258011e1b40d759a643086f590f6ffbd9d68360bad46Daniel Dunbar  if (Output.isPipe())
258111e1b40d759a643086f590f6ffbd9d68360bad46Daniel Dunbar    CmdArgs.push_back("-");
258211e1b40d759a643086f590f6ffbd9d68360bad46Daniel Dunbar  else
258311e1b40d759a643086f590f6ffbd9d68360bad46Daniel Dunbar    CmdArgs.push_back(Output.getFilename());
258411e1b40d759a643086f590f6ffbd9d68360bad46Daniel Dunbar
258511e1b40d759a643086f590f6ffbd9d68360bad46Daniel Dunbar  for (InputInfoList::const_iterator
258611e1b40d759a643086f590f6ffbd9d68360bad46Daniel Dunbar         it = Inputs.begin(), ie = Inputs.end(); it != ie; ++it) {
258711e1b40d759a643086f590f6ffbd9d68360bad46Daniel Dunbar    const InputInfo &II = *it;
258811e1b40d759a643086f590f6ffbd9d68360bad46Daniel Dunbar    if (II.isPipe())
258911e1b40d759a643086f590f6ffbd9d68360bad46Daniel Dunbar      CmdArgs.push_back("-");
259011e1b40d759a643086f590f6ffbd9d68360bad46Daniel Dunbar    else
259111e1b40d759a643086f590f6ffbd9d68360bad46Daniel Dunbar      CmdArgs.push_back(II.getFilename());
259211e1b40d759a643086f590f6ffbd9d68360bad46Daniel Dunbar  }
259311e1b40d759a643086f590f6ffbd9d68360bad46Daniel Dunbar
259411e1b40d759a643086f590f6ffbd9d68360bad46Daniel Dunbar  const char *Exec =
25955ed34f4c58b6ad4e21038d713c1fae31a6146ff5Daniel Dunbar    Args.MakeArgString(getToolChain().GetProgramPath(C, "as"));
2596cae087e164e94e4286c11bf694dd0ff88f295302Daniel Dunbar  Dest.addCommand(new Command(JA, Exec, CmdArgs));
259711e1b40d759a643086f590f6ffbd9d68360bad46Daniel Dunbar}
259811e1b40d759a643086f590f6ffbd9d68360bad46Daniel Dunbar
259911e1b40d759a643086f590f6ffbd9d68360bad46Daniel Dunbarvoid dragonfly::Link::ConstructJob(Compilation &C, const JobAction &JA,
260011e1b40d759a643086f590f6ffbd9d68360bad46Daniel Dunbar                                 Job &Dest, const InputInfo &Output,
260111e1b40d759a643086f590f6ffbd9d68360bad46Daniel Dunbar                                 const InputInfoList &Inputs,
260211e1b40d759a643086f590f6ffbd9d68360bad46Daniel Dunbar                                 const ArgList &Args,
260311e1b40d759a643086f590f6ffbd9d68360bad46Daniel Dunbar                                 const char *LinkingOutput) const {
2604a8304f67291b0182fb64f3afc621615288dd1d31Daniel Dunbar  const Driver &D = getToolChain().getHost().getDriver();
260511e1b40d759a643086f590f6ffbd9d68360bad46Daniel Dunbar  ArgStringList CmdArgs;
260611e1b40d759a643086f590f6ffbd9d68360bad46Daniel Dunbar
260711e1b40d759a643086f590f6ffbd9d68360bad46Daniel Dunbar  if (Args.hasArg(options::OPT_static)) {
260811e1b40d759a643086f590f6ffbd9d68360bad46Daniel Dunbar    CmdArgs.push_back("-Bstatic");
260911e1b40d759a643086f590f6ffbd9d68360bad46Daniel Dunbar  } else {
261011e1b40d759a643086f590f6ffbd9d68360bad46Daniel Dunbar    if (Args.hasArg(options::OPT_shared))
261111e1b40d759a643086f590f6ffbd9d68360bad46Daniel Dunbar      CmdArgs.push_back("-Bshareable");
261211e1b40d759a643086f590f6ffbd9d68360bad46Daniel Dunbar    else {
261311e1b40d759a643086f590f6ffbd9d68360bad46Daniel Dunbar      CmdArgs.push_back("-dynamic-linker");
261411e1b40d759a643086f590f6ffbd9d68360bad46Daniel Dunbar      CmdArgs.push_back("/usr/libexec/ld-elf.so.2");
261511e1b40d759a643086f590f6ffbd9d68360bad46Daniel Dunbar    }
261611e1b40d759a643086f590f6ffbd9d68360bad46Daniel Dunbar  }
261711e1b40d759a643086f590f6ffbd9d68360bad46Daniel Dunbar
261811e1b40d759a643086f590f6ffbd9d68360bad46Daniel Dunbar  // When building 32-bit code on DragonFly/pc64, we have to explicitly
261911e1b40d759a643086f590f6ffbd9d68360bad46Daniel Dunbar  // instruct ld in the base system to link 32-bit code.
262011e1b40d759a643086f590f6ffbd9d68360bad46Daniel Dunbar  if (getToolChain().getArchName() == "i386") {
262111e1b40d759a643086f590f6ffbd9d68360bad46Daniel Dunbar    CmdArgs.push_back("-m");
262211e1b40d759a643086f590f6ffbd9d68360bad46Daniel Dunbar    CmdArgs.push_back("elf_i386");
262311e1b40d759a643086f590f6ffbd9d68360bad46Daniel Dunbar  }
262411e1b40d759a643086f590f6ffbd9d68360bad46Daniel Dunbar
262511e1b40d759a643086f590f6ffbd9d68360bad46Daniel Dunbar  if (Output.isPipe()) {
262611e1b40d759a643086f590f6ffbd9d68360bad46Daniel Dunbar    CmdArgs.push_back("-o");
262711e1b40d759a643086f590f6ffbd9d68360bad46Daniel Dunbar    CmdArgs.push_back("-");
262811e1b40d759a643086f590f6ffbd9d68360bad46Daniel Dunbar  } else if (Output.isFilename()) {
262911e1b40d759a643086f590f6ffbd9d68360bad46Daniel Dunbar    CmdArgs.push_back("-o");
263011e1b40d759a643086f590f6ffbd9d68360bad46Daniel Dunbar    CmdArgs.push_back(Output.getFilename());
263111e1b40d759a643086f590f6ffbd9d68360bad46Daniel Dunbar  } else {
263211e1b40d759a643086f590f6ffbd9d68360bad46Daniel Dunbar    assert(Output.isNothing() && "Invalid output.");
263311e1b40d759a643086f590f6ffbd9d68360bad46Daniel Dunbar  }
263411e1b40d759a643086f590f6ffbd9d68360bad46Daniel Dunbar
263511e1b40d759a643086f590f6ffbd9d68360bad46Daniel Dunbar  if (!Args.hasArg(options::OPT_nostdlib) &&
263611e1b40d759a643086f590f6ffbd9d68360bad46Daniel Dunbar      !Args.hasArg(options::OPT_nostartfiles)) {
263711e1b40d759a643086f590f6ffbd9d68360bad46Daniel Dunbar    if (!Args.hasArg(options::OPT_shared)) {
26385ed34f4c58b6ad4e21038d713c1fae31a6146ff5Daniel Dunbar      CmdArgs.push_back(Args.MakeArgString(getToolChain().GetFilePath(C, "crt1.o")));
26395ed34f4c58b6ad4e21038d713c1fae31a6146ff5Daniel Dunbar      CmdArgs.push_back(Args.MakeArgString(getToolChain().GetFilePath(C, "crti.o")));
26405ed34f4c58b6ad4e21038d713c1fae31a6146ff5Daniel Dunbar      CmdArgs.push_back(Args.MakeArgString(getToolChain().GetFilePath(C, "crtbegin.o")));
264111e1b40d759a643086f590f6ffbd9d68360bad46Daniel Dunbar    } else {
26425ed34f4c58b6ad4e21038d713c1fae31a6146ff5Daniel Dunbar      CmdArgs.push_back(Args.MakeArgString(getToolChain().GetFilePath(C, "crti.o")));
26435ed34f4c58b6ad4e21038d713c1fae31a6146ff5Daniel Dunbar      CmdArgs.push_back(Args.MakeArgString(getToolChain().GetFilePath(C, "crtbeginS.o")));
264411e1b40d759a643086f590f6ffbd9d68360bad46Daniel Dunbar    }
264511e1b40d759a643086f590f6ffbd9d68360bad46Daniel Dunbar  }
264611e1b40d759a643086f590f6ffbd9d68360bad46Daniel Dunbar
264711e1b40d759a643086f590f6ffbd9d68360bad46Daniel Dunbar  Args.AddAllArgs(CmdArgs, options::OPT_L);
264811e1b40d759a643086f590f6ffbd9d68360bad46Daniel Dunbar  Args.AddAllArgs(CmdArgs, options::OPT_T_Group);
264911e1b40d759a643086f590f6ffbd9d68360bad46Daniel Dunbar  Args.AddAllArgs(CmdArgs, options::OPT_e);
265011e1b40d759a643086f590f6ffbd9d68360bad46Daniel Dunbar
265111e1b40d759a643086f590f6ffbd9d68360bad46Daniel Dunbar  for (InputInfoList::const_iterator
265211e1b40d759a643086f590f6ffbd9d68360bad46Daniel Dunbar         it = Inputs.begin(), ie = Inputs.end(); it != ie; ++it) {
265311e1b40d759a643086f590f6ffbd9d68360bad46Daniel Dunbar    const InputInfo &II = *it;
2654a8304f67291b0182fb64f3afc621615288dd1d31Daniel Dunbar
2655a8304f67291b0182fb64f3afc621615288dd1d31Daniel Dunbar    // Don't try to pass LLVM inputs to a generic gcc.
2656a8304f67291b0182fb64f3afc621615288dd1d31Daniel Dunbar    if (II.getType() == types::TY_LLVMBC)
2657a8304f67291b0182fb64f3afc621615288dd1d31Daniel Dunbar      D.Diag(clang::diag::err_drv_no_linker_llvm_support)
2658881376467c46c5c6cc16fa6790271c2c22e1d4f1Daniel Dunbar        << getToolChain().getTripleString();
2659a8304f67291b0182fb64f3afc621615288dd1d31Daniel Dunbar
266011e1b40d759a643086f590f6ffbd9d68360bad46Daniel Dunbar    if (II.isPipe())
266111e1b40d759a643086f590f6ffbd9d68360bad46Daniel Dunbar      CmdArgs.push_back("-");
266211e1b40d759a643086f590f6ffbd9d68360bad46Daniel Dunbar    else if (II.isFilename())
266311e1b40d759a643086f590f6ffbd9d68360bad46Daniel Dunbar      CmdArgs.push_back(II.getFilename());
266411e1b40d759a643086f590f6ffbd9d68360bad46Daniel Dunbar    else
266511e1b40d759a643086f590f6ffbd9d68360bad46Daniel Dunbar      II.getInputArg().renderAsInput(Args, CmdArgs);
266611e1b40d759a643086f590f6ffbd9d68360bad46Daniel Dunbar  }
266711e1b40d759a643086f590f6ffbd9d68360bad46Daniel Dunbar
266811e1b40d759a643086f590f6ffbd9d68360bad46Daniel Dunbar  if (!Args.hasArg(options::OPT_nostdlib) &&
266911e1b40d759a643086f590f6ffbd9d68360bad46Daniel Dunbar      !Args.hasArg(options::OPT_nodefaultlibs)) {
267011e1b40d759a643086f590f6ffbd9d68360bad46Daniel Dunbar    // FIXME: GCC passes on -lgcc, -lgcc_pic and a whole lot of
267111e1b40d759a643086f590f6ffbd9d68360bad46Daniel Dunbar    //         rpaths
267211e1b40d759a643086f590f6ffbd9d68360bad46Daniel Dunbar    CmdArgs.push_back("-L/usr/lib/gcc41");
267311e1b40d759a643086f590f6ffbd9d68360bad46Daniel Dunbar
267411e1b40d759a643086f590f6ffbd9d68360bad46Daniel Dunbar    if (!Args.hasArg(options::OPT_static)) {
267511e1b40d759a643086f590f6ffbd9d68360bad46Daniel Dunbar      CmdArgs.push_back("-rpath");
267611e1b40d759a643086f590f6ffbd9d68360bad46Daniel Dunbar      CmdArgs.push_back("/usr/lib/gcc41");
267711e1b40d759a643086f590f6ffbd9d68360bad46Daniel Dunbar
267811e1b40d759a643086f590f6ffbd9d68360bad46Daniel Dunbar      CmdArgs.push_back("-rpath-link");
267911e1b40d759a643086f590f6ffbd9d68360bad46Daniel Dunbar      CmdArgs.push_back("/usr/lib/gcc41");
268011e1b40d759a643086f590f6ffbd9d68360bad46Daniel Dunbar
268111e1b40d759a643086f590f6ffbd9d68360bad46Daniel Dunbar      CmdArgs.push_back("-rpath");
268211e1b40d759a643086f590f6ffbd9d68360bad46Daniel Dunbar      CmdArgs.push_back("/usr/lib");
268311e1b40d759a643086f590f6ffbd9d68360bad46Daniel Dunbar
268411e1b40d759a643086f590f6ffbd9d68360bad46Daniel Dunbar      CmdArgs.push_back("-rpath-link");
268511e1b40d759a643086f590f6ffbd9d68360bad46Daniel Dunbar      CmdArgs.push_back("/usr/lib");
268611e1b40d759a643086f590f6ffbd9d68360bad46Daniel Dunbar    }
268711e1b40d759a643086f590f6ffbd9d68360bad46Daniel Dunbar
268811e1b40d759a643086f590f6ffbd9d68360bad46Daniel Dunbar    if (Args.hasArg(options::OPT_shared)) {
268911e1b40d759a643086f590f6ffbd9d68360bad46Daniel Dunbar      CmdArgs.push_back("-lgcc_pic");
269011e1b40d759a643086f590f6ffbd9d68360bad46Daniel Dunbar    } else {
269111e1b40d759a643086f590f6ffbd9d68360bad46Daniel Dunbar      CmdArgs.push_back("-lgcc");
269211e1b40d759a643086f590f6ffbd9d68360bad46Daniel Dunbar    }
269311e1b40d759a643086f590f6ffbd9d68360bad46Daniel Dunbar
269411e1b40d759a643086f590f6ffbd9d68360bad46Daniel Dunbar
269511e1b40d759a643086f590f6ffbd9d68360bad46Daniel Dunbar    if (Args.hasArg(options::OPT_pthread))
269611e1b40d759a643086f590f6ffbd9d68360bad46Daniel Dunbar      CmdArgs.push_back("-lthread_xu");
269711e1b40d759a643086f590f6ffbd9d68360bad46Daniel Dunbar
269811e1b40d759a643086f590f6ffbd9d68360bad46Daniel Dunbar    if (!Args.hasArg(options::OPT_nolibc)) {
269911e1b40d759a643086f590f6ffbd9d68360bad46Daniel Dunbar      CmdArgs.push_back("-lc");
270011e1b40d759a643086f590f6ffbd9d68360bad46Daniel Dunbar    }
270111e1b40d759a643086f590f6ffbd9d68360bad46Daniel Dunbar
270211e1b40d759a643086f590f6ffbd9d68360bad46Daniel Dunbar    if (Args.hasArg(options::OPT_shared)) {
270311e1b40d759a643086f590f6ffbd9d68360bad46Daniel Dunbar      CmdArgs.push_back("-lgcc_pic");
270411e1b40d759a643086f590f6ffbd9d68360bad46Daniel Dunbar    } else {
270511e1b40d759a643086f590f6ffbd9d68360bad46Daniel Dunbar      CmdArgs.push_back("-lgcc");
270611e1b40d759a643086f590f6ffbd9d68360bad46Daniel Dunbar    }
270711e1b40d759a643086f590f6ffbd9d68360bad46Daniel Dunbar  }
270811e1b40d759a643086f590f6ffbd9d68360bad46Daniel Dunbar
270911e1b40d759a643086f590f6ffbd9d68360bad46Daniel Dunbar  if (!Args.hasArg(options::OPT_nostdlib) &&
271011e1b40d759a643086f590f6ffbd9d68360bad46Daniel Dunbar      !Args.hasArg(options::OPT_nostartfiles)) {
271111e1b40d759a643086f590f6ffbd9d68360bad46Daniel Dunbar    if (!Args.hasArg(options::OPT_shared))
27125ed34f4c58b6ad4e21038d713c1fae31a6146ff5Daniel Dunbar      CmdArgs.push_back(Args.MakeArgString(getToolChain().GetFilePath(C, "crtend.o")));
271311e1b40d759a643086f590f6ffbd9d68360bad46Daniel Dunbar    else
27145ed34f4c58b6ad4e21038d713c1fae31a6146ff5Daniel Dunbar      CmdArgs.push_back(Args.MakeArgString(getToolChain().GetFilePath(C, "crtendS.o")));
27155ed34f4c58b6ad4e21038d713c1fae31a6146ff5Daniel Dunbar    CmdArgs.push_back(Args.MakeArgString(getToolChain().GetFilePath(C, "crtn.o")));
271611e1b40d759a643086f590f6ffbd9d68360bad46Daniel Dunbar  }
271711e1b40d759a643086f590f6ffbd9d68360bad46Daniel Dunbar
271811e1b40d759a643086f590f6ffbd9d68360bad46Daniel Dunbar  const char *Exec =
27195ed34f4c58b6ad4e21038d713c1fae31a6146ff5Daniel Dunbar    Args.MakeArgString(getToolChain().GetProgramPath(C, "ld"));
2720cae087e164e94e4286c11bf694dd0ff88f295302Daniel Dunbar  Dest.addCommand(new Command(JA, Exec, CmdArgs));
272111e1b40d759a643086f590f6ffbd9d68360bad46Daniel Dunbar}
2722