Tools.cpp revision 55d3f7ae512875a1d6402943c3a619633feb2a18
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"
2555d3f7ae512875a1d6402943c3a619633feb2a18Douglas Gregor#include "llvm/ADT/StringSwitch.h"
265b750fe6189a41937ff2b080a983c95ea273769fDaniel Dunbar#include "llvm/ADT/Twine.h"
2702633b541b04ad5ffc1c70f4c2feeeb13e607057Daniel Dunbar#include "llvm/Support/Format.h"
2802633b541b04ad5ffc1c70f4c2feeeb13e607057Daniel Dunbar#include "llvm/Support/raw_ostream.h"
29871adcf4e41285e3f4c3b62eaa1b2e05b60b92daDaniel Dunbar
30871adcf4e41285e3f4c3b62eaa1b2e05b60b92daDaniel Dunbar#include "InputInfo.h"
3102633b541b04ad5ffc1c70f4c2feeeb13e607057Daniel Dunbar#include "ToolChains.h"
32871adcf4e41285e3f4c3b62eaa1b2e05b60b92daDaniel Dunbar
3347ac7d27c44bd64a7d0fc03d4babc196cf2b8230Daniel Dunbarusing namespace clang::driver;
3447ac7d27c44bd64a7d0fc03d4babc196cf2b8230Daniel Dunbarusing namespace clang::driver::tools;
3547ac7d27c44bd64a7d0fc03d4babc196cf2b8230Daniel Dunbar
36868bd0aa9281929ef50d2e9a8c82a036906f53f5Daniel Dunbarstatic const char *MakeFormattedString(const ArgList &Args,
37868bd0aa9281929ef50d2e9a8c82a036906f53f5Daniel Dunbar                                       const llvm::format_object_base &Fmt) {
38881376467c46c5c6cc16fa6790271c2c22e1d4f1Daniel Dunbar  llvm::SmallString<256> Str;
39881376467c46c5c6cc16fa6790271c2c22e1d4f1Daniel Dunbar  llvm::raw_svector_ostream(Str) << Fmt;
40881376467c46c5c6cc16fa6790271c2c22e1d4f1Daniel Dunbar  return Args.MakeArgString(Str.str());
41868bd0aa9281929ef50d2e9a8c82a036906f53f5Daniel Dunbar}
42868bd0aa9281929ef50d2e9a8c82a036906f53f5Daniel Dunbar
4388a3d6cf5ebab81614f89ba48a8d89023270637aDaniel Dunbar/// CheckPreprocessingOptions - Perform some validation of preprocessing
4488a3d6cf5ebab81614f89ba48a8d89023270637aDaniel Dunbar/// arguments that is shared with gcc.
4588a3d6cf5ebab81614f89ba48a8d89023270637aDaniel Dunbarstatic void CheckPreprocessingOptions(const Driver &D, const ArgList &Args) {
4688a3d6cf5ebab81614f89ba48a8d89023270637aDaniel Dunbar  if (Arg *A = Args.getLastArg(options::OPT_C, options::OPT_CC))
4788a3d6cf5ebab81614f89ba48a8d89023270637aDaniel Dunbar    if (!Args.hasArg(options::OPT_E))
4888a3d6cf5ebab81614f89ba48a8d89023270637aDaniel Dunbar      D.Diag(clang::diag::err_drv_argument_only_allowed_with)
4988a3d6cf5ebab81614f89ba48a8d89023270637aDaniel Dunbar        << A->getAsString(Args) << "-E";
5088a3d6cf5ebab81614f89ba48a8d89023270637aDaniel Dunbar}
5188a3d6cf5ebab81614f89ba48a8d89023270637aDaniel Dunbar
52e2fd66418eca3d70cf6b62087d745d0c5181db69Daniel Dunbar/// CheckCodeGenerationOptions - Perform some validation of code generation
53e2fd66418eca3d70cf6b62087d745d0c5181db69Daniel Dunbar/// arguments that is shared with gcc.
54e2fd66418eca3d70cf6b62087d745d0c5181db69Daniel Dunbarstatic void CheckCodeGenerationOptions(const Driver &D, const ArgList &Args) {
55e2fd66418eca3d70cf6b62087d745d0c5181db69Daniel Dunbar  // In gcc, only ARM checks this, but it seems reasonable to check universally.
56e2fd66418eca3d70cf6b62087d745d0c5181db69Daniel Dunbar  if (Args.hasArg(options::OPT_static))
57e2fd66418eca3d70cf6b62087d745d0c5181db69Daniel Dunbar    if (const Arg *A = Args.getLastArg(options::OPT_dynamic,
58e2fd66418eca3d70cf6b62087d745d0c5181db69Daniel Dunbar                                       options::OPT_mdynamic_no_pic))
59e2fd66418eca3d70cf6b62087d745d0c5181db69Daniel Dunbar      D.Diag(clang::diag::err_drv_argument_not_allowed_with)
60e2fd66418eca3d70cf6b62087d745d0c5181db69Daniel Dunbar        << A->getAsString(Args) << "-static";
61e2fd66418eca3d70cf6b62087d745d0c5181db69Daniel Dunbar}
62e2fd66418eca3d70cf6b62087d745d0c5181db69Daniel Dunbar
631eb4433ac451dc16f4133a88af2d002ac26c58efMike Stumpvoid Clang::AddPreprocessingOptions(const Driver &D,
64df91ef3d6c55692a0236f67b6c6b134a3bf84098Douglas Gregor                                    const ArgList &Args,
65c21c485b4fb58ef5d55cf3e523263dd824a2ace4Daniel Dunbar                                    ArgStringList &CmdArgs,
66c21c485b4fb58ef5d55cf3e523263dd824a2ace4Daniel Dunbar                                    const InputInfo &Output,
67c21c485b4fb58ef5d55cf3e523263dd824a2ace4Daniel Dunbar                                    const InputInfoList &Inputs) const {
68c21c485b4fb58ef5d55cf3e523263dd824a2ace4Daniel Dunbar  Arg *A;
693a183d3d46426d8719031553131b8928f50aa606Daniel Dunbar
7088a3d6cf5ebab81614f89ba48a8d89023270637aDaniel Dunbar  CheckPreprocessingOptions(D, Args);
7188a3d6cf5ebab81614f89ba48a8d89023270637aDaniel Dunbar
7288a3d6cf5ebab81614f89ba48a8d89023270637aDaniel Dunbar  Args.AddLastArg(CmdArgs, options::OPT_C);
7388a3d6cf5ebab81614f89ba48a8d89023270637aDaniel Dunbar  Args.AddLastArg(CmdArgs, options::OPT_CC);
743a183d3d46426d8719031553131b8928f50aa606Daniel Dunbar
753a183d3d46426d8719031553131b8928f50aa606Daniel Dunbar  // Handle dependency file generation.
76c21c485b4fb58ef5d55cf3e523263dd824a2ace4Daniel Dunbar  if ((A = Args.getLastArg(options::OPT_M)) ||
77c21c485b4fb58ef5d55cf3e523263dd824a2ace4Daniel Dunbar      (A = Args.getLastArg(options::OPT_MM)) ||
78c21c485b4fb58ef5d55cf3e523263dd824a2ace4Daniel Dunbar      (A = Args.getLastArg(options::OPT_MD)) ||
79c21c485b4fb58ef5d55cf3e523263dd824a2ace4Daniel Dunbar      (A = Args.getLastArg(options::OPT_MMD))) {
80c21c485b4fb58ef5d55cf3e523263dd824a2ace4Daniel Dunbar    // Determine the output location.
81c21c485b4fb58ef5d55cf3e523263dd824a2ace4Daniel Dunbar    const char *DepFile;
82c21c485b4fb58ef5d55cf3e523263dd824a2ace4Daniel Dunbar    if (Output.getType() == types::TY_Dependencies) {
83c21c485b4fb58ef5d55cf3e523263dd824a2ace4Daniel Dunbar      if (Output.isPipe())
84c21c485b4fb58ef5d55cf3e523263dd824a2ace4Daniel Dunbar        DepFile = "-";
85c21c485b4fb58ef5d55cf3e523263dd824a2ace4Daniel Dunbar      else
86c21c485b4fb58ef5d55cf3e523263dd824a2ace4Daniel Dunbar        DepFile = Output.getFilename();
87c21c485b4fb58ef5d55cf3e523263dd824a2ace4Daniel Dunbar    } else if (Arg *MF = Args.getLastArg(options::OPT_MF)) {
88c21c485b4fb58ef5d55cf3e523263dd824a2ace4Daniel Dunbar      DepFile = MF->getValue(Args);
89c21c485b4fb58ef5d55cf3e523263dd824a2ace4Daniel Dunbar    } else if (A->getOption().getId() == options::OPT_M ||
90c21c485b4fb58ef5d55cf3e523263dd824a2ace4Daniel Dunbar               A->getOption().getId() == options::OPT_MM) {
91c21c485b4fb58ef5d55cf3e523263dd824a2ace4Daniel Dunbar      DepFile = "-";
92c21c485b4fb58ef5d55cf3e523263dd824a2ace4Daniel Dunbar    } else {
93c21c485b4fb58ef5d55cf3e523263dd824a2ace4Daniel Dunbar      DepFile = darwin::CC1::getDependencyFileName(Args, Inputs);
94c21c485b4fb58ef5d55cf3e523263dd824a2ace4Daniel Dunbar    }
95c21c485b4fb58ef5d55cf3e523263dd824a2ace4Daniel Dunbar    CmdArgs.push_back("-dependency-file");
96c21c485b4fb58ef5d55cf3e523263dd824a2ace4Daniel Dunbar    CmdArgs.push_back(DepFile);
97c21c485b4fb58ef5d55cf3e523263dd824a2ace4Daniel Dunbar
98c21c485b4fb58ef5d55cf3e523263dd824a2ace4Daniel Dunbar    // Add an -MT option if the user didn't specify their own.
99e0be8b1729d8978de433d229c065830b95d0ae68Daniel Dunbar    //
100c21c485b4fb58ef5d55cf3e523263dd824a2ace4Daniel Dunbar    // FIXME: This should use -MQ, when we support it.
101c21c485b4fb58ef5d55cf3e523263dd824a2ace4Daniel Dunbar    if (!Args.hasArg(options::OPT_MT) && !Args.hasArg(options::OPT_MQ)) {
102c21c485b4fb58ef5d55cf3e523263dd824a2ace4Daniel Dunbar      const char *DepTarget;
103c21c485b4fb58ef5d55cf3e523263dd824a2ace4Daniel Dunbar
104c21c485b4fb58ef5d55cf3e523263dd824a2ace4Daniel Dunbar      // If user provided -o, that is the dependency target, except
105c21c485b4fb58ef5d55cf3e523263dd824a2ace4Daniel Dunbar      // when we are only generating a dependency file.
106c21c485b4fb58ef5d55cf3e523263dd824a2ace4Daniel Dunbar      Arg *OutputOpt = Args.getLastArg(options::OPT_o);
107c21c485b4fb58ef5d55cf3e523263dd824a2ace4Daniel Dunbar      if (OutputOpt && Output.getType() != types::TY_Dependencies) {
108c21c485b4fb58ef5d55cf3e523263dd824a2ace4Daniel Dunbar        DepTarget = OutputOpt->getValue(Args);
109c21c485b4fb58ef5d55cf3e523263dd824a2ace4Daniel Dunbar      } else {
110c21c485b4fb58ef5d55cf3e523263dd824a2ace4Daniel Dunbar        // Otherwise derive from the base input.
111c21c485b4fb58ef5d55cf3e523263dd824a2ace4Daniel Dunbar        //
112c21c485b4fb58ef5d55cf3e523263dd824a2ace4Daniel Dunbar        // FIXME: This should use the computed output file location.
113c21c485b4fb58ef5d55cf3e523263dd824a2ace4Daniel Dunbar        llvm::sys::Path P(Inputs[0].getBaseInput());
114c21c485b4fb58ef5d55cf3e523263dd824a2ace4Daniel Dunbar
115c21c485b4fb58ef5d55cf3e523263dd824a2ace4Daniel Dunbar        P.eraseSuffix();
116c21c485b4fb58ef5d55cf3e523263dd824a2ace4Daniel Dunbar        P.appendSuffix("o");
117881376467c46c5c6cc16fa6790271c2c22e1d4f1Daniel Dunbar        DepTarget = Args.MakeArgString(P.getLast());
118c21c485b4fb58ef5d55cf3e523263dd824a2ace4Daniel Dunbar      }
119c21c485b4fb58ef5d55cf3e523263dd824a2ace4Daniel Dunbar
120c21c485b4fb58ef5d55cf3e523263dd824a2ace4Daniel Dunbar      CmdArgs.push_back("-MT");
121c21c485b4fb58ef5d55cf3e523263dd824a2ace4Daniel Dunbar      CmdArgs.push_back(DepTarget);
122c21c485b4fb58ef5d55cf3e523263dd824a2ace4Daniel Dunbar    }
123c21c485b4fb58ef5d55cf3e523263dd824a2ace4Daniel Dunbar
124c21c485b4fb58ef5d55cf3e523263dd824a2ace4Daniel Dunbar    if (A->getOption().getId() == options::OPT_M ||
125c21c485b4fb58ef5d55cf3e523263dd824a2ace4Daniel Dunbar        A->getOption().getId() == options::OPT_MD)
126c21c485b4fb58ef5d55cf3e523263dd824a2ace4Daniel Dunbar      CmdArgs.push_back("-sys-header-deps");
127c21c485b4fb58ef5d55cf3e523263dd824a2ace4Daniel Dunbar  }
128c21c485b4fb58ef5d55cf3e523263dd824a2ace4Daniel Dunbar
129c21c485b4fb58ef5d55cf3e523263dd824a2ace4Daniel Dunbar  Args.AddLastArg(CmdArgs, options::OPT_MP);
130c21c485b4fb58ef5d55cf3e523263dd824a2ace4Daniel Dunbar  Args.AddAllArgs(CmdArgs, options::OPT_MT);
131c21c485b4fb58ef5d55cf3e523263dd824a2ace4Daniel Dunbar
132df91ef3d6c55692a0236f67b6c6b134a3bf84098Douglas Gregor  // Add -i* options, and automatically translate to
133df91ef3d6c55692a0236f67b6c6b134a3bf84098Douglas Gregor  // -include-pch/-include-pth for transparent PCH support. It's
134df91ef3d6c55692a0236f67b6c6b134a3bf84098Douglas Gregor  // wonky, but we include looking for .gch so we can support seamless
135df91ef3d6c55692a0236f67b6c6b134a3bf84098Douglas Gregor  // replacement into a build system already set up to be generating
136df91ef3d6c55692a0236f67b6c6b134a3bf84098Douglas Gregor  // .gch files.
137e0be8b1729d8978de433d229c065830b95d0ae68Daniel Dunbar  //
138e0be8b1729d8978de433d229c065830b95d0ae68Daniel Dunbar  // FIXME: Use iterator.
139c21c485b4fb58ef5d55cf3e523263dd824a2ace4Daniel Dunbar  for (ArgList::const_iterator
140c21c485b4fb58ef5d55cf3e523263dd824a2ace4Daniel Dunbar         it = Args.begin(), ie = Args.end(); it != ie; ++it) {
141c21c485b4fb58ef5d55cf3e523263dd824a2ace4Daniel Dunbar    const Arg *A = *it;
142c21c485b4fb58ef5d55cf3e523263dd824a2ace4Daniel Dunbar    if (!A->getOption().matches(options::OPT_clang_i_Group))
143c21c485b4fb58ef5d55cf3e523263dd824a2ace4Daniel Dunbar      continue;
144c21c485b4fb58ef5d55cf3e523263dd824a2ace4Daniel Dunbar
145c21c485b4fb58ef5d55cf3e523263dd824a2ace4Daniel Dunbar    if (A->getOption().matches(options::OPT_include)) {
1460ebd9321ba380471010341f24c874f46f56e7581Daniel Dunbar      // Use PCH if the user requested it, except for C++ (for now).
1470ebd9321ba380471010341f24c874f46f56e7581Daniel Dunbar      bool UsePCH = D.CCCUsePCH;
1480ebd9321ba380471010341f24c874f46f56e7581Daniel Dunbar      if (types::isCXX(Inputs[0].getType()))
1490ebd9321ba380471010341f24c874f46f56e7581Daniel Dunbar        UsePCH = false;
1500ebd9321ba380471010341f24c874f46f56e7581Daniel Dunbar
151c21c485b4fb58ef5d55cf3e523263dd824a2ace4Daniel Dunbar      bool FoundPTH = false;
152df91ef3d6c55692a0236f67b6c6b134a3bf84098Douglas Gregor      bool FoundPCH = false;
153c21c485b4fb58ef5d55cf3e523263dd824a2ace4Daniel Dunbar      llvm::sys::Path P(A->getValue(Args));
1540ebd9321ba380471010341f24c874f46f56e7581Daniel Dunbar      if (UsePCH) {
155df91ef3d6c55692a0236f67b6c6b134a3bf84098Douglas Gregor        P.appendSuffix("pch");
156c21c485b4fb58ef5d55cf3e523263dd824a2ace4Daniel Dunbar        if (P.exists())
157df91ef3d6c55692a0236f67b6c6b134a3bf84098Douglas Gregor          FoundPCH = true;
1581eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump        else
159df91ef3d6c55692a0236f67b6c6b134a3bf84098Douglas Gregor          P.eraseSuffix();
160df91ef3d6c55692a0236f67b6c6b134a3bf84098Douglas Gregor      }
161df91ef3d6c55692a0236f67b6c6b134a3bf84098Douglas Gregor
162df91ef3d6c55692a0236f67b6c6b134a3bf84098Douglas Gregor      if (!FoundPCH) {
163df91ef3d6c55692a0236f67b6c6b134a3bf84098Douglas Gregor        P.appendSuffix("pth");
1641eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump        if (P.exists())
165c21c485b4fb58ef5d55cf3e523263dd824a2ace4Daniel Dunbar          FoundPTH = true;
166df91ef3d6c55692a0236f67b6c6b134a3bf84098Douglas Gregor        else
167df91ef3d6c55692a0236f67b6c6b134a3bf84098Douglas Gregor          P.eraseSuffix();
1681eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump      }
1691eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump
170df91ef3d6c55692a0236f67b6c6b134a3bf84098Douglas Gregor      if (!FoundPCH && !FoundPTH) {
171df91ef3d6c55692a0236f67b6c6b134a3bf84098Douglas Gregor        P.appendSuffix("gch");
172df91ef3d6c55692a0236f67b6c6b134a3bf84098Douglas Gregor        if (P.exists()) {
1730ebd9321ba380471010341f24c874f46f56e7581Daniel Dunbar          FoundPCH = UsePCH;
1740ebd9321ba380471010341f24c874f46f56e7581Daniel Dunbar          FoundPTH = !UsePCH;
175df91ef3d6c55692a0236f67b6c6b134a3bf84098Douglas Gregor        }
1761eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump        else
177df91ef3d6c55692a0236f67b6c6b134a3bf84098Douglas Gregor          P.eraseSuffix();
178c21c485b4fb58ef5d55cf3e523263dd824a2ace4Daniel Dunbar      }
179c21c485b4fb58ef5d55cf3e523263dd824a2ace4Daniel Dunbar
180df91ef3d6c55692a0236f67b6c6b134a3bf84098Douglas Gregor      if (FoundPCH || FoundPTH) {
181c21c485b4fb58ef5d55cf3e523263dd824a2ace4Daniel Dunbar        A->claim();
1820ebd9321ba380471010341f24c874f46f56e7581Daniel Dunbar        if (UsePCH)
183df91ef3d6c55692a0236f67b6c6b134a3bf84098Douglas Gregor          CmdArgs.push_back("-include-pch");
184df91ef3d6c55692a0236f67b6c6b134a3bf84098Douglas Gregor        else
185df91ef3d6c55692a0236f67b6c6b134a3bf84098Douglas Gregor          CmdArgs.push_back("-include-pth");
186881376467c46c5c6cc16fa6790271c2c22e1d4f1Daniel Dunbar        CmdArgs.push_back(Args.MakeArgString(P.str()));
187c21c485b4fb58ef5d55cf3e523263dd824a2ace4Daniel Dunbar        continue;
188c21c485b4fb58ef5d55cf3e523263dd824a2ace4Daniel Dunbar      }
189c21c485b4fb58ef5d55cf3e523263dd824a2ace4Daniel Dunbar    }
190c21c485b4fb58ef5d55cf3e523263dd824a2ace4Daniel Dunbar
191c21c485b4fb58ef5d55cf3e523263dd824a2ace4Daniel Dunbar    // Not translated, render as usual.
192c21c485b4fb58ef5d55cf3e523263dd824a2ace4Daniel Dunbar    A->claim();
193c21c485b4fb58ef5d55cf3e523263dd824a2ace4Daniel Dunbar    A->render(Args, CmdArgs);
194c21c485b4fb58ef5d55cf3e523263dd824a2ace4Daniel Dunbar  }
195c21c485b4fb58ef5d55cf3e523263dd824a2ace4Daniel Dunbar
196c21c485b4fb58ef5d55cf3e523263dd824a2ace4Daniel Dunbar  Args.AddAllArgs(CmdArgs, options::OPT_D, options::OPT_U);
197c21c485b4fb58ef5d55cf3e523263dd824a2ace4Daniel Dunbar  Args.AddAllArgs(CmdArgs, options::OPT_I_Group, options::OPT_F);
198c21c485b4fb58ef5d55cf3e523263dd824a2ace4Daniel Dunbar
199c21c485b4fb58ef5d55cf3e523263dd824a2ace4Daniel Dunbar  // Add -Wp, and -Xassembler if using the preprocessor.
200c21c485b4fb58ef5d55cf3e523263dd824a2ace4Daniel Dunbar
201c21c485b4fb58ef5d55cf3e523263dd824a2ace4Daniel Dunbar  // FIXME: There is a very unfortunate problem here, some troubled
202c21c485b4fb58ef5d55cf3e523263dd824a2ace4Daniel Dunbar  // souls abuse -Wp, to pass preprocessor options in gcc syntax. To
203c21c485b4fb58ef5d55cf3e523263dd824a2ace4Daniel Dunbar  // really support that we would have to parse and then translate
204c21c485b4fb58ef5d55cf3e523263dd824a2ace4Daniel Dunbar  // those options. :(
205c21c485b4fb58ef5d55cf3e523263dd824a2ace4Daniel Dunbar  Args.AddAllArgValues(CmdArgs, options::OPT_Wp_COMMA,
206c21c485b4fb58ef5d55cf3e523263dd824a2ace4Daniel Dunbar                       options::OPT_Xpreprocessor);
207c21c485b4fb58ef5d55cf3e523263dd824a2ace4Daniel Dunbar}
208c21c485b4fb58ef5d55cf3e523263dd824a2ace4Daniel Dunbar
209728a512753d85a6ccaae34e81385c8665c2de0e1Daniel Dunbar/// getARMTargetCPU - Get the (LLVM) name of the ARM cpu we are targetting.
210728a512753d85a6ccaae34e81385c8665c2de0e1Daniel Dunbar//
211728a512753d85a6ccaae34e81385c8665c2de0e1Daniel Dunbar// FIXME: tblgen this.
212b163ef7e7a5d904ef0962a7c38c460be083c4d63Daniel Dunbarstatic llvm::StringRef getARMTargetCPU(const ArgList &Args) {
213728a512753d85a6ccaae34e81385c8665c2de0e1Daniel Dunbar  // FIXME: Warn on inconsistent use of -mcpu and -march.
214b163ef7e7a5d904ef0962a7c38c460be083c4d63Daniel Dunbar
215b163ef7e7a5d904ef0962a7c38c460be083c4d63Daniel Dunbar  // If we have -mcpu=, use that.
216b163ef7e7a5d904ef0962a7c38c460be083c4d63Daniel Dunbar  if (Arg *A = Args.getLastArg(options::OPT_mcpu_EQ))
217b163ef7e7a5d904ef0962a7c38c460be083c4d63Daniel Dunbar    return A->getValue(Args);
218b163ef7e7a5d904ef0962a7c38c460be083c4d63Daniel Dunbar
219b163ef7e7a5d904ef0962a7c38c460be083c4d63Daniel Dunbar  // Otherwise, if we have -march= choose the base CPU for that arch.
220b163ef7e7a5d904ef0962a7c38c460be083c4d63Daniel Dunbar  if (Arg *A = Args.getLastArg(options::OPT_march_EQ)) {
221b163ef7e7a5d904ef0962a7c38c460be083c4d63Daniel Dunbar    llvm::StringRef MArch = A->getValue(Args);
222b163ef7e7a5d904ef0962a7c38c460be083c4d63Daniel Dunbar
223b163ef7e7a5d904ef0962a7c38c460be083c4d63Daniel Dunbar    if (MArch == "armv2" || MArch == "armv2a")
224b163ef7e7a5d904ef0962a7c38c460be083c4d63Daniel Dunbar      return "arm2";
225b163ef7e7a5d904ef0962a7c38c460be083c4d63Daniel Dunbar    if (MArch == "armv3")
226b163ef7e7a5d904ef0962a7c38c460be083c4d63Daniel Dunbar      return "arm6";
227b163ef7e7a5d904ef0962a7c38c460be083c4d63Daniel Dunbar    if (MArch == "armv3m")
228b163ef7e7a5d904ef0962a7c38c460be083c4d63Daniel Dunbar      return "arm7m";
229b163ef7e7a5d904ef0962a7c38c460be083c4d63Daniel Dunbar    if (MArch == "armv4" || MArch == "armv4t")
230b163ef7e7a5d904ef0962a7c38c460be083c4d63Daniel Dunbar      return "arm7tdmi";
231b163ef7e7a5d904ef0962a7c38c460be083c4d63Daniel Dunbar    if (MArch == "armv5" || MArch == "armv5t")
232b163ef7e7a5d904ef0962a7c38c460be083c4d63Daniel Dunbar      return "arm10tdmi";
233b163ef7e7a5d904ef0962a7c38c460be083c4d63Daniel Dunbar    if (MArch == "armv5e" || MArch == "armv5te")
234b163ef7e7a5d904ef0962a7c38c460be083c4d63Daniel Dunbar      return "arm1026ejs";
235b163ef7e7a5d904ef0962a7c38c460be083c4d63Daniel Dunbar    if (MArch == "armv5tej")
236b163ef7e7a5d904ef0962a7c38c460be083c4d63Daniel Dunbar      return "arm926ejs";
237b163ef7e7a5d904ef0962a7c38c460be083c4d63Daniel Dunbar    if (MArch == "armv6" || MArch == "armv6k")
238b163ef7e7a5d904ef0962a7c38c460be083c4d63Daniel Dunbar      return "arm1136jf-s";
239b163ef7e7a5d904ef0962a7c38c460be083c4d63Daniel Dunbar    if (MArch == "armv6j")
240b163ef7e7a5d904ef0962a7c38c460be083c4d63Daniel Dunbar      return "arm1136j-s";
241b163ef7e7a5d904ef0962a7c38c460be083c4d63Daniel Dunbar    if (MArch == "armv6z" || MArch == "armv6zk")
242b163ef7e7a5d904ef0962a7c38c460be083c4d63Daniel Dunbar      return "arm1176jzf-s";
243b163ef7e7a5d904ef0962a7c38c460be083c4d63Daniel Dunbar    if (MArch == "armv6t2")
244b163ef7e7a5d904ef0962a7c38c460be083c4d63Daniel Dunbar      return "arm1156t2-s";
245b163ef7e7a5d904ef0962a7c38c460be083c4d63Daniel Dunbar    if (MArch == "armv7" || MArch == "armv7a" || MArch == "armv7-a")
246b163ef7e7a5d904ef0962a7c38c460be083c4d63Daniel Dunbar      return "cortex-a8";
247b163ef7e7a5d904ef0962a7c38c460be083c4d63Daniel Dunbar    if (MArch == "armv7r" || MArch == "armv7-r")
248b163ef7e7a5d904ef0962a7c38c460be083c4d63Daniel Dunbar      return "cortex-r4";
249b163ef7e7a5d904ef0962a7c38c460be083c4d63Daniel Dunbar    if (MArch == "armv7m" || MArch == "armv7-m")
250b163ef7e7a5d904ef0962a7c38c460be083c4d63Daniel Dunbar      return "cortex-m3";
251b163ef7e7a5d904ef0962a7c38c460be083c4d63Daniel Dunbar    if (MArch == "ep9312")
252b163ef7e7a5d904ef0962a7c38c460be083c4d63Daniel Dunbar      return "ep9312";
253b163ef7e7a5d904ef0962a7c38c460be083c4d63Daniel Dunbar    if (MArch == "iwmmxt")
254b163ef7e7a5d904ef0962a7c38c460be083c4d63Daniel Dunbar      return "iwmmxt";
255b163ef7e7a5d904ef0962a7c38c460be083c4d63Daniel Dunbar    if (MArch == "xscale")
256b163ef7e7a5d904ef0962a7c38c460be083c4d63Daniel Dunbar      return "xscale";
257b163ef7e7a5d904ef0962a7c38c460be083c4d63Daniel Dunbar  }
258b163ef7e7a5d904ef0962a7c38c460be083c4d63Daniel Dunbar
259b163ef7e7a5d904ef0962a7c38c460be083c4d63Daniel Dunbar  // Otherwise return the most base CPU LLVM supports.
260b163ef7e7a5d904ef0962a7c38c460be083c4d63Daniel Dunbar  return "arm7tdmi";
261b163ef7e7a5d904ef0962a7c38c460be083c4d63Daniel Dunbar}
262b163ef7e7a5d904ef0962a7c38c460be083c4d63Daniel Dunbar
2631d65e4be6f22f7e4b4974efbaef92fa3454f1ec8Daniel Dunbar/// getLLVMArchSuffixForARM - Get the LLVM arch name to use for a particular
264728a512753d85a6ccaae34e81385c8665c2de0e1Daniel Dunbar/// CPU.
265728a512753d85a6ccaae34e81385c8665c2de0e1Daniel Dunbar//
266728a512753d85a6ccaae34e81385c8665c2de0e1Daniel Dunbar// FIXME: This is redundant with -mcpu, why does LLVM use this.
267728a512753d85a6ccaae34e81385c8665c2de0e1Daniel Dunbar// FIXME: tblgen this, or kill it!
2681d65e4be6f22f7e4b4974efbaef92fa3454f1ec8Daniel Dunbarstatic const char *getLLVMArchSuffixForARM(llvm::StringRef CPU) {
269728a512753d85a6ccaae34e81385c8665c2de0e1Daniel Dunbar  if (CPU == "arm7tdmi" || CPU == "arm7tdmi-s" || CPU == "arm710t" ||
270728a512753d85a6ccaae34e81385c8665c2de0e1Daniel Dunbar      CPU == "arm720t" || CPU == "arm9" || CPU == "arm9tdmi" ||
271728a512753d85a6ccaae34e81385c8665c2de0e1Daniel Dunbar      CPU == "arm920" || CPU == "arm920t" || CPU == "arm922t" ||
272728a512753d85a6ccaae34e81385c8665c2de0e1Daniel Dunbar      CPU == "arm940t" || CPU == "ep9312")
2731d65e4be6f22f7e4b4974efbaef92fa3454f1ec8Daniel Dunbar    return "v4t";
274728a512753d85a6ccaae34e81385c8665c2de0e1Daniel Dunbar
275728a512753d85a6ccaae34e81385c8665c2de0e1Daniel Dunbar  if (CPU == "arm10tdmi" || CPU == "arm1020t")
2761d65e4be6f22f7e4b4974efbaef92fa3454f1ec8Daniel Dunbar    return "v5";
277728a512753d85a6ccaae34e81385c8665c2de0e1Daniel Dunbar
278728a512753d85a6ccaae34e81385c8665c2de0e1Daniel Dunbar  if (CPU == "arm9e" || CPU == "arm926ej-s" || CPU == "arm946e-s" ||
279728a512753d85a6ccaae34e81385c8665c2de0e1Daniel Dunbar      CPU == "arm966e-s" || CPU == "arm968e-s" || CPU == "arm10e" ||
280728a512753d85a6ccaae34e81385c8665c2de0e1Daniel Dunbar      CPU == "arm1020e" || CPU == "arm1022e" || CPU == "xscale" ||
281728a512753d85a6ccaae34e81385c8665c2de0e1Daniel Dunbar      CPU == "iwmmxt")
2821d65e4be6f22f7e4b4974efbaef92fa3454f1ec8Daniel Dunbar    return "v5e";
283728a512753d85a6ccaae34e81385c8665c2de0e1Daniel Dunbar
284728a512753d85a6ccaae34e81385c8665c2de0e1Daniel Dunbar  if (CPU == "arm1136j-s" || CPU == "arm1136jf-s" || CPU == "arm1176jz-s" ||
285728a512753d85a6ccaae34e81385c8665c2de0e1Daniel Dunbar      CPU == "arm1176jzf-s" || CPU == "mpcorenovfp" || CPU == "mpcore")
2861d65e4be6f22f7e4b4974efbaef92fa3454f1ec8Daniel Dunbar    return "v6";
287728a512753d85a6ccaae34e81385c8665c2de0e1Daniel Dunbar
288728a512753d85a6ccaae34e81385c8665c2de0e1Daniel Dunbar  if (CPU == "arm1156t2-s" || CPU == "arm1156t2f-s")
2891d65e4be6f22f7e4b4974efbaef92fa3454f1ec8Daniel Dunbar    return "v6t2";
290728a512753d85a6ccaae34e81385c8665c2de0e1Daniel Dunbar
291728a512753d85a6ccaae34e81385c8665c2de0e1Daniel Dunbar  if (CPU == "cortex-a8" || CPU == "cortex-a9")
2921d65e4be6f22f7e4b4974efbaef92fa3454f1ec8Daniel Dunbar    return "v7";
293728a512753d85a6ccaae34e81385c8665c2de0e1Daniel Dunbar
2941d65e4be6f22f7e4b4974efbaef92fa3454f1ec8Daniel Dunbar  return "";
295728a512753d85a6ccaae34e81385c8665c2de0e1Daniel Dunbar}
296728a512753d85a6ccaae34e81385c8665c2de0e1Daniel Dunbar
297728a512753d85a6ccaae34e81385c8665c2de0e1Daniel Dunbar/// getLLVMTriple - Get the LLVM triple to use for a particular toolchain, which
298728a512753d85a6ccaae34e81385c8665c2de0e1Daniel Dunbar/// may depend on command line arguments.
299728a512753d85a6ccaae34e81385c8665c2de0e1Daniel Dunbarstatic std::string getLLVMTriple(const ToolChain &TC, const ArgList &Args) {
300728a512753d85a6ccaae34e81385c8665c2de0e1Daniel Dunbar  switch (TC.getTriple().getArch()) {
301728a512753d85a6ccaae34e81385c8665c2de0e1Daniel Dunbar  default:
302728a512753d85a6ccaae34e81385c8665c2de0e1Daniel Dunbar    return TC.getTripleString();
303728a512753d85a6ccaae34e81385c8665c2de0e1Daniel Dunbar
304728a512753d85a6ccaae34e81385c8665c2de0e1Daniel Dunbar  case llvm::Triple::arm:
305728a512753d85a6ccaae34e81385c8665c2de0e1Daniel Dunbar  case llvm::Triple::thumb: {
306f4aa4f61de7d364364dc94bbf83ff71448a11327Daniel Dunbar    // FIXME: Factor into subclasses.
307728a512753d85a6ccaae34e81385c8665c2de0e1Daniel Dunbar    llvm::Triple Triple = TC.getTriple();
308f4aa4f61de7d364364dc94bbf83ff71448a11327Daniel Dunbar
309f4aa4f61de7d364364dc94bbf83ff71448a11327Daniel Dunbar    // Thumb2 is the default for V7 on Darwin.
310f4aa4f61de7d364364dc94bbf83ff71448a11327Daniel Dunbar    //
311f4aa4f61de7d364364dc94bbf83ff71448a11327Daniel Dunbar    // FIXME: Thumb should just be another -target-feaure, not in the triple.
312f4aa4f61de7d364364dc94bbf83ff71448a11327Daniel Dunbar    llvm::StringRef Suffix = getLLVMArchSuffixForARM(getARMTargetCPU(Args));
313f4aa4f61de7d364364dc94bbf83ff71448a11327Daniel Dunbar    bool ThumbDefault =
314f4aa4f61de7d364364dc94bbf83ff71448a11327Daniel Dunbar      (Suffix == "v7" && TC.getTriple().getOS() == llvm::Triple::Darwin);
3151d65e4be6f22f7e4b4974efbaef92fa3454f1ec8Daniel Dunbar    std::string ArchName = "arm";
316f4aa4f61de7d364364dc94bbf83ff71448a11327Daniel Dunbar    if (Args.hasFlag(options::OPT_mthumb, options::OPT_mno_thumb, ThumbDefault))
317f4aa4f61de7d364364dc94bbf83ff71448a11327Daniel Dunbar      ArchName = "thumb";
318f4aa4f61de7d364364dc94bbf83ff71448a11327Daniel Dunbar    Triple.setArchName(ArchName + Suffix.str());
319f4aa4f61de7d364364dc94bbf83ff71448a11327Daniel Dunbar
320728a512753d85a6ccaae34e81385c8665c2de0e1Daniel Dunbar    return Triple.getTriple();
321728a512753d85a6ccaae34e81385c8665c2de0e1Daniel Dunbar  }
322728a512753d85a6ccaae34e81385c8665c2de0e1Daniel Dunbar  }
323728a512753d85a6ccaae34e81385c8665c2de0e1Daniel Dunbar}
324728a512753d85a6ccaae34e81385c8665c2de0e1Daniel Dunbar
325b163ef7e7a5d904ef0962a7c38c460be083c4d63Daniel Dunbarvoid Clang::AddARMTargetArgs(const ArgList &Args,
326b163ef7e7a5d904ef0962a7c38c460be083c4d63Daniel Dunbar                             ArgStringList &CmdArgs) const {
327cbd1933f83e2332b2d7add10459f80cc4e7eb7bfDaniel Dunbar  const Driver &D = getToolChain().getHost().getDriver();
328cbd1933f83e2332b2d7add10459f80cc4e7eb7bfDaniel Dunbar
3292030d8f46b4226fa99e59389e3ca856a79c27e9aDaniel Dunbar  // Select the ABI to use.
3302030d8f46b4226fa99e59389e3ca856a79c27e9aDaniel Dunbar  //
3312030d8f46b4226fa99e59389e3ca856a79c27e9aDaniel Dunbar  // FIXME: Support -meabi.
3322030d8f46b4226fa99e59389e3ca856a79c27e9aDaniel Dunbar  const char *ABIName = 0;
3332030d8f46b4226fa99e59389e3ca856a79c27e9aDaniel Dunbar  if (Arg *A = Args.getLastArg(options::OPT_mabi_EQ)) {
3342030d8f46b4226fa99e59389e3ca856a79c27e9aDaniel Dunbar    ABIName = A->getValue(Args);
3352030d8f46b4226fa99e59389e3ca856a79c27e9aDaniel Dunbar  } else {
3362030d8f46b4226fa99e59389e3ca856a79c27e9aDaniel Dunbar    // Select the default based on the platform.
3372030d8f46b4226fa99e59389e3ca856a79c27e9aDaniel Dunbar    switch (getToolChain().getTriple().getOS()) {
3382030d8f46b4226fa99e59389e3ca856a79c27e9aDaniel Dunbar      // FIXME: Is this right for non-Darwin and non-Linux?
3392030d8f46b4226fa99e59389e3ca856a79c27e9aDaniel Dunbar    default:
3402030d8f46b4226fa99e59389e3ca856a79c27e9aDaniel Dunbar      ABIName = "aapcs";
3412030d8f46b4226fa99e59389e3ca856a79c27e9aDaniel Dunbar      break;
3422030d8f46b4226fa99e59389e3ca856a79c27e9aDaniel Dunbar
3432030d8f46b4226fa99e59389e3ca856a79c27e9aDaniel Dunbar    case llvm::Triple::Darwin:
3442030d8f46b4226fa99e59389e3ca856a79c27e9aDaniel Dunbar      ABIName = "apcs-gnu";
3452030d8f46b4226fa99e59389e3ca856a79c27e9aDaniel Dunbar      break;
3462030d8f46b4226fa99e59389e3ca856a79c27e9aDaniel Dunbar
3472030d8f46b4226fa99e59389e3ca856a79c27e9aDaniel Dunbar    case llvm::Triple::Linux:
3482030d8f46b4226fa99e59389e3ca856a79c27e9aDaniel Dunbar      ABIName = "aapcs-linux";
3492030d8f46b4226fa99e59389e3ca856a79c27e9aDaniel Dunbar      break;
3502030d8f46b4226fa99e59389e3ca856a79c27e9aDaniel Dunbar    }
3512030d8f46b4226fa99e59389e3ca856a79c27e9aDaniel Dunbar  }
3522030d8f46b4226fa99e59389e3ca856a79c27e9aDaniel Dunbar  CmdArgs.push_back("-target-abi");
3532030d8f46b4226fa99e59389e3ca856a79c27e9aDaniel Dunbar  CmdArgs.push_back(ABIName);
3542030d8f46b4226fa99e59389e3ca856a79c27e9aDaniel Dunbar
355b163ef7e7a5d904ef0962a7c38c460be083c4d63Daniel Dunbar  // Set the CPU based on -march= and -mcpu=.
356b163ef7e7a5d904ef0962a7c38c460be083c4d63Daniel Dunbar  CmdArgs.push_back(Args.MakeArgString("-mcpu=" + getARMTargetCPU(Args)));
357b163ef7e7a5d904ef0962a7c38c460be083c4d63Daniel Dunbar
358cbd1933f83e2332b2d7add10459f80cc4e7eb7bfDaniel Dunbar  // Select the float ABI as determined by -msoft-float, -mhard-float, and
359cbd1933f83e2332b2d7add10459f80cc4e7eb7bfDaniel Dunbar  // -mfloat-abi=.
360cbd1933f83e2332b2d7add10459f80cc4e7eb7bfDaniel Dunbar  llvm::StringRef FloatABI;
361cbd1933f83e2332b2d7add10459f80cc4e7eb7bfDaniel Dunbar  if (Arg *A = Args.getLastArg(options::OPT_msoft_float,
362cbd1933f83e2332b2d7add10459f80cc4e7eb7bfDaniel Dunbar                               options::OPT_mhard_float,
363cbd1933f83e2332b2d7add10459f80cc4e7eb7bfDaniel Dunbar                               options::OPT_mfloat_abi_EQ)) {
364cbd1933f83e2332b2d7add10459f80cc4e7eb7bfDaniel Dunbar    if (A->getOption().matches(options::OPT_msoft_float))
365cbd1933f83e2332b2d7add10459f80cc4e7eb7bfDaniel Dunbar      FloatABI = "soft";
366cbd1933f83e2332b2d7add10459f80cc4e7eb7bfDaniel Dunbar    else if (A->getOption().matches(options::OPT_mhard_float))
367cbd1933f83e2332b2d7add10459f80cc4e7eb7bfDaniel Dunbar      FloatABI = "hard";
368cbd1933f83e2332b2d7add10459f80cc4e7eb7bfDaniel Dunbar    else {
369cbd1933f83e2332b2d7add10459f80cc4e7eb7bfDaniel Dunbar      FloatABI = A->getValue(Args);
370cbd1933f83e2332b2d7add10459f80cc4e7eb7bfDaniel Dunbar      if (FloatABI != "soft" && FloatABI != "softfp" && FloatABI != "hard") {
371cbd1933f83e2332b2d7add10459f80cc4e7eb7bfDaniel Dunbar        D.Diag(clang::diag::err_drv_invalid_mfloat_abi)
372cbd1933f83e2332b2d7add10459f80cc4e7eb7bfDaniel Dunbar          << A->getAsString(Args);
373cbd1933f83e2332b2d7add10459f80cc4e7eb7bfDaniel Dunbar        FloatABI = "soft";
374cbd1933f83e2332b2d7add10459f80cc4e7eb7bfDaniel Dunbar      }
375cbd1933f83e2332b2d7add10459f80cc4e7eb7bfDaniel Dunbar    }
376cbd1933f83e2332b2d7add10459f80cc4e7eb7bfDaniel Dunbar  }
377cbd1933f83e2332b2d7add10459f80cc4e7eb7bfDaniel Dunbar
378cbd1933f83e2332b2d7add10459f80cc4e7eb7bfDaniel Dunbar  // If unspecified, choose the default based on the platform.
379cbd1933f83e2332b2d7add10459f80cc4e7eb7bfDaniel Dunbar  if (FloatABI.empty()) {
380cbd1933f83e2332b2d7add10459f80cc4e7eb7bfDaniel Dunbar    // FIXME: This is wrong for non-Darwin, we don't have a mechanism yet for
381cbd1933f83e2332b2d7add10459f80cc4e7eb7bfDaniel Dunbar    // distinguishing things like linux-eabi vs linux-elf.
382cbd1933f83e2332b2d7add10459f80cc4e7eb7bfDaniel Dunbar    switch (getToolChain().getTriple().getOS()) {
383cbd1933f83e2332b2d7add10459f80cc4e7eb7bfDaniel Dunbar    case llvm::Triple::Darwin: {
384cbd1933f83e2332b2d7add10459f80cc4e7eb7bfDaniel Dunbar      // Darwin defaults to "softfp" for v6 and v7.
385cbd1933f83e2332b2d7add10459f80cc4e7eb7bfDaniel Dunbar      //
386cbd1933f83e2332b2d7add10459f80cc4e7eb7bfDaniel Dunbar      // FIXME: Factor out an ARM class so we can cache the arch somewhere.
387cbd1933f83e2332b2d7add10459f80cc4e7eb7bfDaniel Dunbar      llvm::StringRef ArchName = getLLVMArchSuffixForARM(getARMTargetCPU(Args));
388cbd1933f83e2332b2d7add10459f80cc4e7eb7bfDaniel Dunbar      if (ArchName.startswith("v6") || ArchName.startswith("v7"))
389cbd1933f83e2332b2d7add10459f80cc4e7eb7bfDaniel Dunbar        FloatABI = "softfp";
390cbd1933f83e2332b2d7add10459f80cc4e7eb7bfDaniel Dunbar      else
391cbd1933f83e2332b2d7add10459f80cc4e7eb7bfDaniel Dunbar        FloatABI = "soft";
392cbd1933f83e2332b2d7add10459f80cc4e7eb7bfDaniel Dunbar      break;
393cbd1933f83e2332b2d7add10459f80cc4e7eb7bfDaniel Dunbar    }
394cbd1933f83e2332b2d7add10459f80cc4e7eb7bfDaniel Dunbar
395cbd1933f83e2332b2d7add10459f80cc4e7eb7bfDaniel Dunbar    default:
396cbd1933f83e2332b2d7add10459f80cc4e7eb7bfDaniel Dunbar      // Assume "soft", but warn the user we are guessing.
397cbd1933f83e2332b2d7add10459f80cc4e7eb7bfDaniel Dunbar      FloatABI = "soft";
398cbd1933f83e2332b2d7add10459f80cc4e7eb7bfDaniel Dunbar      D.Diag(clang::diag::warn_drv_assuming_mfloat_abi_is) << "soft";
399cbd1933f83e2332b2d7add10459f80cc4e7eb7bfDaniel Dunbar      break;
400cbd1933f83e2332b2d7add10459f80cc4e7eb7bfDaniel Dunbar    }
401cbd1933f83e2332b2d7add10459f80cc4e7eb7bfDaniel Dunbar  }
402cbd1933f83e2332b2d7add10459f80cc4e7eb7bfDaniel Dunbar
403cbd1933f83e2332b2d7add10459f80cc4e7eb7bfDaniel Dunbar  if (FloatABI == "soft") {
404cbd1933f83e2332b2d7add10459f80cc4e7eb7bfDaniel Dunbar    // Floating point operations and argument passing are soft.
405cbd1933f83e2332b2d7add10459f80cc4e7eb7bfDaniel Dunbar    //
406cbd1933f83e2332b2d7add10459f80cc4e7eb7bfDaniel Dunbar    // FIXME: This changes CPP defines, we need -target-soft-float.
407cbd1933f83e2332b2d7add10459f80cc4e7eb7bfDaniel Dunbar    CmdArgs.push_back("-soft-float");
408cbd1933f83e2332b2d7add10459f80cc4e7eb7bfDaniel Dunbar    CmdArgs.push_back("-float-abi=soft");
409cbd1933f83e2332b2d7add10459f80cc4e7eb7bfDaniel Dunbar  } else if (FloatABI == "softfp") {
410cbd1933f83e2332b2d7add10459f80cc4e7eb7bfDaniel Dunbar    // Floating point operations are hard, but argument passing is soft.
411cbd1933f83e2332b2d7add10459f80cc4e7eb7bfDaniel Dunbar    CmdArgs.push_back("-float-abi=soft");
412cbd1933f83e2332b2d7add10459f80cc4e7eb7bfDaniel Dunbar  } else {
413cbd1933f83e2332b2d7add10459f80cc4e7eb7bfDaniel Dunbar    // Floating point operations and argument passing are hard.
414cbd1933f83e2332b2d7add10459f80cc4e7eb7bfDaniel Dunbar    assert(FloatABI == "hard" && "Invalid float abi!");
415cbd1933f83e2332b2d7add10459f80cc4e7eb7bfDaniel Dunbar    CmdArgs.push_back("-float-abi=hard");
416cbd1933f83e2332b2d7add10459f80cc4e7eb7bfDaniel Dunbar  }
417b163ef7e7a5d904ef0962a7c38c460be083c4d63Daniel Dunbar}
418b163ef7e7a5d904ef0962a7c38c460be083c4d63Daniel Dunbar
4196acda16e9c194dcbd0dea64341e182bdb65d0f41Daniel Dunbarvoid Clang::AddX86TargetArgs(const ArgList &Args,
4206acda16e9c194dcbd0dea64341e182bdb65d0f41Daniel Dunbar                             ArgStringList &CmdArgs) const {
421e6ad3f9fceef0ecc422ff26754ea069a5fd18c69Daniel Dunbar  // FIXME: This needs to change to use a clang-cc option, and set the attribute
422e6ad3f9fceef0ecc422ff26754ea069a5fd18c69Daniel Dunbar  // on functions.
423e6ad3f9fceef0ecc422ff26754ea069a5fd18c69Daniel Dunbar  if (!Args.hasFlag(options::OPT_mred_zone,
424e6ad3f9fceef0ecc422ff26754ea069a5fd18c69Daniel Dunbar                    options::OPT_mno_red_zone,
425e6ad3f9fceef0ecc422ff26754ea069a5fd18c69Daniel Dunbar                    true) ||
426e6ad3f9fceef0ecc422ff26754ea069a5fd18c69Daniel Dunbar      Args.hasArg(options::OPT_mkernel) ||
427e6ad3f9fceef0ecc422ff26754ea069a5fd18c69Daniel Dunbar      Args.hasArg(options::OPT_fapple_kext))
428e6ad3f9fceef0ecc422ff26754ea069a5fd18c69Daniel Dunbar    CmdArgs.push_back("--disable-red-zone");
429e6ad3f9fceef0ecc422ff26754ea069a5fd18c69Daniel Dunbar
430e6ad3f9fceef0ecc422ff26754ea069a5fd18c69Daniel Dunbar  // FIXME: This needs to change to use a clang-cc option, and set the attribute
431e6ad3f9fceef0ecc422ff26754ea069a5fd18c69Daniel Dunbar  // on functions.
432e6ad3f9fceef0ecc422ff26754ea069a5fd18c69Daniel Dunbar  if (Args.hasFlag(options::OPT_msoft_float,
433e6ad3f9fceef0ecc422ff26754ea069a5fd18c69Daniel Dunbar                   options::OPT_mno_soft_float,
434e6ad3f9fceef0ecc422ff26754ea069a5fd18c69Daniel Dunbar                   false))
435e6ad3f9fceef0ecc422ff26754ea069a5fd18c69Daniel Dunbar    CmdArgs.push_back("--no-implicit-float");
436e6ad3f9fceef0ecc422ff26754ea069a5fd18c69Daniel Dunbar
4376acda16e9c194dcbd0dea64341e182bdb65d0f41Daniel Dunbar  if (const Arg *A = Args.getLastArg(options::OPT_march_EQ)) {
4386acda16e9c194dcbd0dea64341e182bdb65d0f41Daniel Dunbar    // FIXME: We may need some translation here from the options gcc takes to
4396acda16e9c194dcbd0dea64341e182bdb65d0f41Daniel Dunbar    // names the LLVM backend understand?
4406acda16e9c194dcbd0dea64341e182bdb65d0f41Daniel Dunbar    CmdArgs.push_back("-mcpu");
4416acda16e9c194dcbd0dea64341e182bdb65d0f41Daniel Dunbar    CmdArgs.push_back(A->getValue(Args));
4426acda16e9c194dcbd0dea64341e182bdb65d0f41Daniel Dunbar  } else {
4436acda16e9c194dcbd0dea64341e182bdb65d0f41Daniel Dunbar    // Select default CPU.
4446acda16e9c194dcbd0dea64341e182bdb65d0f41Daniel Dunbar
4456acda16e9c194dcbd0dea64341e182bdb65d0f41Daniel Dunbar    // FIXME: Need target hooks.
4466acda16e9c194dcbd0dea64341e182bdb65d0f41Daniel Dunbar    if (memcmp(getToolChain().getOS().c_str(), "darwin", 6) == 0) {
4476acda16e9c194dcbd0dea64341e182bdb65d0f41Daniel Dunbar      if (getToolChain().getArchName() == "x86_64")
4486acda16e9c194dcbd0dea64341e182bdb65d0f41Daniel Dunbar        CmdArgs.push_back("--mcpu=core2");
4496acda16e9c194dcbd0dea64341e182bdb65d0f41Daniel Dunbar      else if (getToolChain().getArchName() == "i386")
4506acda16e9c194dcbd0dea64341e182bdb65d0f41Daniel Dunbar        CmdArgs.push_back("--mcpu=yonah");
4516acda16e9c194dcbd0dea64341e182bdb65d0f41Daniel Dunbar    } else {
4526acda16e9c194dcbd0dea64341e182bdb65d0f41Daniel Dunbar      if (getToolChain().getArchName() == "x86_64")
4536acda16e9c194dcbd0dea64341e182bdb65d0f41Daniel Dunbar        CmdArgs.push_back("--mcpu=x86-64");
4546acda16e9c194dcbd0dea64341e182bdb65d0f41Daniel Dunbar      else if (getToolChain().getArchName() == "i386")
4556acda16e9c194dcbd0dea64341e182bdb65d0f41Daniel Dunbar        CmdArgs.push_back("--mcpu=pentium4");
4566acda16e9c194dcbd0dea64341e182bdb65d0f41Daniel Dunbar    }
4576acda16e9c194dcbd0dea64341e182bdb65d0f41Daniel Dunbar  }
4586acda16e9c194dcbd0dea64341e182bdb65d0f41Daniel Dunbar
4596acda16e9c194dcbd0dea64341e182bdb65d0f41Daniel Dunbar  // FIXME: Use iterator.
4606acda16e9c194dcbd0dea64341e182bdb65d0f41Daniel Dunbar  for (ArgList::const_iterator
4616acda16e9c194dcbd0dea64341e182bdb65d0f41Daniel Dunbar         it = Args.begin(), ie = Args.end(); it != ie; ++it) {
4626acda16e9c194dcbd0dea64341e182bdb65d0f41Daniel Dunbar    const Arg *A = *it;
4636acda16e9c194dcbd0dea64341e182bdb65d0f41Daniel Dunbar    if (A->getOption().matches(options::OPT_m_x86_Features_Group)) {
4646acda16e9c194dcbd0dea64341e182bdb65d0f41Daniel Dunbar      llvm::StringRef Name = A->getOption().getName();
4656acda16e9c194dcbd0dea64341e182bdb65d0f41Daniel Dunbar
4666acda16e9c194dcbd0dea64341e182bdb65d0f41Daniel Dunbar      // Skip over "-m".
4676acda16e9c194dcbd0dea64341e182bdb65d0f41Daniel Dunbar      assert(Name.startswith("-m") && "Invalid feature name.");
4686acda16e9c194dcbd0dea64341e182bdb65d0f41Daniel Dunbar      Name = Name.substr(2);
4696acda16e9c194dcbd0dea64341e182bdb65d0f41Daniel Dunbar
4706acda16e9c194dcbd0dea64341e182bdb65d0f41Daniel Dunbar      bool IsNegative = Name.startswith("no-");
4716acda16e9c194dcbd0dea64341e182bdb65d0f41Daniel Dunbar      if (IsNegative)
4726acda16e9c194dcbd0dea64341e182bdb65d0f41Daniel Dunbar        Name = Name.substr(3);
4736acda16e9c194dcbd0dea64341e182bdb65d0f41Daniel Dunbar
4746acda16e9c194dcbd0dea64341e182bdb65d0f41Daniel Dunbar      A->claim();
4756acda16e9c194dcbd0dea64341e182bdb65d0f41Daniel Dunbar      CmdArgs.push_back("-target-feature");
4766acda16e9c194dcbd0dea64341e182bdb65d0f41Daniel Dunbar      CmdArgs.push_back(Args.MakeArgString((IsNegative ? "-" : "+") + Name));
4776acda16e9c194dcbd0dea64341e182bdb65d0f41Daniel Dunbar    }
4786acda16e9c194dcbd0dea64341e182bdb65d0f41Daniel Dunbar  }
4796acda16e9c194dcbd0dea64341e182bdb65d0f41Daniel Dunbar}
4806acda16e9c194dcbd0dea64341e182bdb65d0f41Daniel Dunbar
48185caf03ee49c4de87ee9624a9b725ef5d20ee624Fariborz Jahanianstatic bool needsExceptions(const ArgList &Args,  types::ID InputType,
48285caf03ee49c4de87ee9624a9b725ef5d20ee624Fariborz Jahanian                            const llvm::Triple &Triple) {
483f759df06d997050559fd925758bcd2cdef24db05Rafael Espindola  if (Arg *A = Args.getLastArg(options::OPT_fexceptions,
484f759df06d997050559fd925758bcd2cdef24db05Rafael Espindola                               options::OPT_fno_exceptions)) {
485f759df06d997050559fd925758bcd2cdef24db05Rafael Espindola    if (A->getOption().matches(options::OPT_fexceptions))
486f759df06d997050559fd925758bcd2cdef24db05Rafael Espindola      return true;
487f759df06d997050559fd925758bcd2cdef24db05Rafael Espindola    else
488f759df06d997050559fd925758bcd2cdef24db05Rafael Espindola      return false;
489f759df06d997050559fd925758bcd2cdef24db05Rafael Espindola  }
490f759df06d997050559fd925758bcd2cdef24db05Rafael Espindola  switch (InputType) {
491f759df06d997050559fd925758bcd2cdef24db05Rafael Espindola  case types::TY_CXX: case types::TY_CXXHeader:
492f759df06d997050559fd925758bcd2cdef24db05Rafael Espindola  case types::TY_PP_CXX: case types::TY_PP_CXXHeader:
493f759df06d997050559fd925758bcd2cdef24db05Rafael Espindola  case types::TY_ObjCXX: case types::TY_ObjCXXHeader:
494f759df06d997050559fd925758bcd2cdef24db05Rafael Espindola  case types::TY_PP_ObjCXX: case types::TY_PP_ObjCXXHeader:
495f759df06d997050559fd925758bcd2cdef24db05Rafael Espindola    return true;
49685caf03ee49c4de87ee9624a9b725ef5d20ee624Fariborz Jahanian
497f759df06d997050559fd925758bcd2cdef24db05Rafael Espindola  case types::TY_ObjC: case types::TY_ObjCHeader:
498f759df06d997050559fd925758bcd2cdef24db05Rafael Espindola  case types::TY_PP_ObjC: case types::TY_PP_ObjCHeader:
499f759df06d997050559fd925758bcd2cdef24db05Rafael Espindola    if (Args.hasArg(options::OPT_fobjc_nonfragile_abi))
500f759df06d997050559fd925758bcd2cdef24db05Rafael Espindola      return true;
50185caf03ee49c4de87ee9624a9b725ef5d20ee624Fariborz Jahanian    if (Triple.getOS() != llvm::Triple::Darwin)
502f759df06d997050559fd925758bcd2cdef24db05Rafael Espindola      return false;
50385caf03ee49c4de87ee9624a9b725ef5d20ee624Fariborz Jahanian    return (Triple.getDarwinMajorNumber() >= 9 &&
50485caf03ee49c4de87ee9624a9b725ef5d20ee624Fariborz Jahanian            Triple.getArch() == llvm::Triple::x86_64);
50585caf03ee49c4de87ee9624a9b725ef5d20ee624Fariborz Jahanian
506f759df06d997050559fd925758bcd2cdef24db05Rafael Espindola  default:
507f759df06d997050559fd925758bcd2cdef24db05Rafael Espindola    return false;
508f759df06d997050559fd925758bcd2cdef24db05Rafael Espindola  }
509f759df06d997050559fd925758bcd2cdef24db05Rafael Espindola}
510f759df06d997050559fd925758bcd2cdef24db05Rafael Espindola
51147ac7d27c44bd64a7d0fc03d4babc196cf2b8230Daniel Dunbarvoid Clang::ConstructJob(Compilation &C, const JobAction &JA,
512871adcf4e41285e3f4c3b62eaa1b2e05b60b92daDaniel Dunbar                         Job &Dest,
513871adcf4e41285e3f4c3b62eaa1b2e05b60b92daDaniel Dunbar                         const InputInfo &Output,
51462cf601812e03dd9bc5df42b8ef06a0cdedc38bfDaniel Dunbar                         const InputInfoList &Inputs,
5151d46033f760ba5fd266ce59fe391fac473f04f52Daniel Dunbar                         const ArgList &Args,
51647ac7d27c44bd64a7d0fc03d4babc196cf2b8230Daniel Dunbar                         const char *LinkingOutput) const {
5175c1aaafbd6dd25a99ca1960e1c3c98aeefe9d728Daniel Dunbar  const Driver &D = getToolChain().getHost().getDriver();
518b488c1dac8e53206f07103d794a62a3f5012c0f4Daniel Dunbar  ArgStringList CmdArgs;
519b488c1dac8e53206f07103d794a62a3f5012c0f4Daniel Dunbar
520077ba6a3ac3628afb0d3c460e81ce013bccbdbedDaniel Dunbar  assert(Inputs.size() == 1 && "Unable to handle multiple inputs.");
521077ba6a3ac3628afb0d3c460e81ce013bccbdbedDaniel Dunbar
522af07f936b698575f2c91f1c1134c116f1ef0deddDaniel Dunbar  CmdArgs.push_back("-triple");
523728a512753d85a6ccaae34e81385c8665c2de0e1Daniel Dunbar
524c21c485b4fb58ef5d55cf3e523263dd824a2ace4Daniel Dunbar  const char *TripleStr =
525728a512753d85a6ccaae34e81385c8665c2de0e1Daniel Dunbar    Args.MakeArgString(getLLVMTriple(getToolChain(), Args));
526af07f936b698575f2c91f1c1134c116f1ef0deddDaniel Dunbar  CmdArgs.push_back(TripleStr);
527af07f936b698575f2c91f1c1134c116f1ef0deddDaniel Dunbar
5281d46033f760ba5fd266ce59fe391fac473f04f52Daniel Dunbar  if (isa<AnalyzeJobAction>(JA)) {
5291d46033f760ba5fd266ce59fe391fac473f04f52Daniel Dunbar    assert(JA.getType() == types::TY_Plist && "Invalid output type.");
5301d46033f760ba5fd266ce59fe391fac473f04f52Daniel Dunbar    CmdArgs.push_back("-analyze");
5311d46033f760ba5fd266ce59fe391fac473f04f52Daniel Dunbar  } else if (isa<PreprocessJobAction>(JA)) {
532cd8e4c44dd068956e9181381be3ee2d49a0fac52Daniel Dunbar    if (Output.getType() == types::TY_Dependencies)
533cd8e4c44dd068956e9181381be3ee2d49a0fac52Daniel Dunbar      CmdArgs.push_back("-Eonly");
534cd8e4c44dd068956e9181381be3ee2d49a0fac52Daniel Dunbar    else
535cd8e4c44dd068956e9181381be3ee2d49a0fac52Daniel Dunbar      CmdArgs.push_back("-E");
5361d46033f760ba5fd266ce59fe391fac473f04f52Daniel Dunbar  } else if (isa<PrecompileJobAction>(JA)) {
5370ebd9321ba380471010341f24c874f46f56e7581Daniel Dunbar    // Use PCH if the user requested it, except for C++ (for now).
5380ebd9321ba380471010341f24c874f46f56e7581Daniel Dunbar    bool UsePCH = D.CCCUsePCH;
5390ebd9321ba380471010341f24c874f46f56e7581Daniel Dunbar    if (types::isCXX(Inputs[0].getType()))
5400ebd9321ba380471010341f24c874f46f56e7581Daniel Dunbar      UsePCH = false;
5410ebd9321ba380471010341f24c874f46f56e7581Daniel Dunbar
5420ebd9321ba380471010341f24c874f46f56e7581Daniel Dunbar    if (UsePCH)
543df91ef3d6c55692a0236f67b6c6b134a3bf84098Douglas Gregor      CmdArgs.push_back("-emit-pch");
544df91ef3d6c55692a0236f67b6c6b134a3bf84098Douglas Gregor    else
545df91ef3d6c55692a0236f67b6c6b134a3bf84098Douglas Gregor      CmdArgs.push_back("-emit-pth");
5461d46033f760ba5fd266ce59fe391fac473f04f52Daniel Dunbar  } else {
5471d46033f760ba5fd266ce59fe391fac473f04f52Daniel Dunbar    assert(isa<CompileJobAction>(JA) && "Invalid action for clang tool.");
548c21c485b4fb58ef5d55cf3e523263dd824a2ace4Daniel Dunbar
5491d46033f760ba5fd266ce59fe391fac473f04f52Daniel Dunbar    if (JA.getType() == types::TY_Nothing) {
5501d46033f760ba5fd266ce59fe391fac473f04f52Daniel Dunbar      CmdArgs.push_back("-fsyntax-only");
5511d46033f760ba5fd266ce59fe391fac473f04f52Daniel Dunbar    } else if (JA.getType() == types::TY_LLVMAsm) {
5521d46033f760ba5fd266ce59fe391fac473f04f52Daniel Dunbar      CmdArgs.push_back("-emit-llvm");
5531d46033f760ba5fd266ce59fe391fac473f04f52Daniel Dunbar    } else if (JA.getType() == types::TY_LLVMBC) {
5541d46033f760ba5fd266ce59fe391fac473f04f52Daniel Dunbar      CmdArgs.push_back("-emit-llvm-bc");
5551d46033f760ba5fd266ce59fe391fac473f04f52Daniel Dunbar    } else if (JA.getType() == types::TY_PP_Asm) {
556e3b8d07e02861d245612b02b5f5a2c1f34b2a394Daniel Dunbar      CmdArgs.push_back("-S");
5575915fbf310e171c4cd3c2af05e9de360c0fa988aDaniel Dunbar    } else if (JA.getType() == types::TY_AST) {
5585915fbf310e171c4cd3c2af05e9de360c0fa988aDaniel Dunbar      CmdArgs.push_back("-emit-pch");
5591d46033f760ba5fd266ce59fe391fac473f04f52Daniel Dunbar    }
5601d46033f760ba5fd266ce59fe391fac473f04f52Daniel Dunbar  }
5611d46033f760ba5fd266ce59fe391fac473f04f52Daniel Dunbar
5621d46033f760ba5fd266ce59fe391fac473f04f52Daniel Dunbar  // The make clang go fast button.
5631d46033f760ba5fd266ce59fe391fac473f04f52Daniel Dunbar  CmdArgs.push_back("-disable-free");
5641d46033f760ba5fd266ce59fe391fac473f04f52Daniel Dunbar
565c9abc043af88f90d177a5bd147f627b78ca49fdeDaniel Dunbar  // Set the main file name, so that debug info works even with
566c9abc043af88f90d177a5bd147f627b78ca49fdeDaniel Dunbar  // -save-temps.
567c9abc043af88f90d177a5bd147f627b78ca49fdeDaniel Dunbar  CmdArgs.push_back("-main-file-name");
568c9abc043af88f90d177a5bd147f627b78ca49fdeDaniel Dunbar  CmdArgs.push_back(darwin::CC1::getBaseInputName(Args, Inputs));
569c9abc043af88f90d177a5bd147f627b78ca49fdeDaniel Dunbar
5703bbc75302fd43cf13d868b46c94ff8794b302e43Daniel Dunbar  // Some flags which affect the language (via preprocessor
5713bbc75302fd43cf13d868b46c94ff8794b302e43Daniel Dunbar  // defines). See darwin::CC1::AddCPPArgs.
5723bbc75302fd43cf13d868b46c94ff8794b302e43Daniel Dunbar  if (Args.hasArg(options::OPT_static))
5733bbc75302fd43cf13d868b46c94ff8794b302e43Daniel Dunbar    CmdArgs.push_back("-static-define");
5743bbc75302fd43cf13d868b46c94ff8794b302e43Daniel Dunbar
5751d46033f760ba5fd266ce59fe391fac473f04f52Daniel Dunbar  if (isa<AnalyzeJobAction>(JA)) {
576b8bb3e797c5687715c6d9d960ee573e4d0e62230Ted Kremenek    // Enable region store model by default.
577b8bb3e797c5687715c6d9d960ee573e4d0e62230Ted Kremenek    CmdArgs.push_back("-analyzer-store=region");
578b8bb3e797c5687715c6d9d960ee573e4d0e62230Ted Kremenek
5791d46033f760ba5fd266ce59fe391fac473f04f52Daniel Dunbar    // Add default argument set.
580d8fc0f2e7751cf31cec5c2f3cc6a0b447e9debb3Daniel Dunbar    if (!Args.hasArg(options::OPT__analyzer_no_default_checks)) {
581d8fc0f2e7751cf31cec5c2f3cc6a0b447e9debb3Daniel Dunbar      CmdArgs.push_back("-warn-dead-stores");
58211727519fbdaec68f526ae7c54a83d0a4601f561Ted Kremenek      CmdArgs.push_back("-warn-security-syntactic");
583d8fc0f2e7751cf31cec5c2f3cc6a0b447e9debb3Daniel Dunbar      CmdArgs.push_back("-checker-cfref");
584d8fc0f2e7751cf31cec5c2f3cc6a0b447e9debb3Daniel Dunbar      CmdArgs.push_back("-analyzer-eagerly-assume");
585d8fc0f2e7751cf31cec5c2f3cc6a0b447e9debb3Daniel Dunbar      CmdArgs.push_back("-warn-objc-methodsigs");
586d8fc0f2e7751cf31cec5c2f3cc6a0b447e9debb3Daniel Dunbar      // Do not enable the missing -dealloc check.
587d8fc0f2e7751cf31cec5c2f3cc6a0b447e9debb3Daniel Dunbar      // '-warn-objc-missing-dealloc',
588d8fc0f2e7751cf31cec5c2f3cc6a0b447e9debb3Daniel Dunbar      CmdArgs.push_back("-warn-objc-unused-ivars");
589d8fc0f2e7751cf31cec5c2f3cc6a0b447e9debb3Daniel Dunbar    }
590d8fc0f2e7751cf31cec5c2f3cc6a0b447e9debb3Daniel Dunbar
591d8fc0f2e7751cf31cec5c2f3cc6a0b447e9debb3Daniel Dunbar    // Set the output format. The default is plist, for (lame) historical
592d8fc0f2e7751cf31cec5c2f3cc6a0b447e9debb3Daniel Dunbar    // reasons.
593d8fc0f2e7751cf31cec5c2f3cc6a0b447e9debb3Daniel Dunbar    CmdArgs.push_back("-analyzer-output");
594d8fc0f2e7751cf31cec5c2f3cc6a0b447e9debb3Daniel Dunbar    if (Arg *A = Args.getLastArg(options::OPT__analyzer_output))
595d8fc0f2e7751cf31cec5c2f3cc6a0b447e9debb3Daniel Dunbar      CmdArgs.push_back(A->getValue(Args));
596d8fc0f2e7751cf31cec5c2f3cc6a0b447e9debb3Daniel Dunbar    else
597d8fc0f2e7751cf31cec5c2f3cc6a0b447e9debb3Daniel Dunbar      CmdArgs.push_back("plist");
5981d46033f760ba5fd266ce59fe391fac473f04f52Daniel Dunbar
5991d46033f760ba5fd266ce59fe391fac473f04f52Daniel Dunbar    // Add -Xanalyzer arguments when running as analyzer.
6001d46033f760ba5fd266ce59fe391fac473f04f52Daniel Dunbar    Args.AddAllArgValues(CmdArgs, options::OPT_Xanalyzer);
6011eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump  }
6021eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump
603e2fd66418eca3d70cf6b62087d745d0c5181db69Daniel Dunbar  CheckCodeGenerationOptions(D, Args);
604e2fd66418eca3d70cf6b62087d745d0c5181db69Daniel Dunbar
605bc85be85779a47bae728bbe6a2cd2e3732b1333dDaniel Dunbar  // Perform argument translation for LLVM backend. This
606bc85be85779a47bae728bbe6a2cd2e3732b1333dDaniel Dunbar  // takes some care in reconciling with llvm-gcc. The
607bc85be85779a47bae728bbe6a2cd2e3732b1333dDaniel Dunbar  // issue is that llvm-gcc translates these options based on
608bc85be85779a47bae728bbe6a2cd2e3732b1333dDaniel Dunbar  // the values in cc1, whereas we are processing based on
609bc85be85779a47bae728bbe6a2cd2e3732b1333dDaniel Dunbar  // the driver arguments.
610bc85be85779a47bae728bbe6a2cd2e3732b1333dDaniel Dunbar  //
611bc85be85779a47bae728bbe6a2cd2e3732b1333dDaniel Dunbar  // FIXME: This is currently broken for -f flags when -fno
612bc85be85779a47bae728bbe6a2cd2e3732b1333dDaniel Dunbar  // variants are present.
6139fd0b1f845a61e71dd8099f596532d34c519630aDaniel Dunbar
614bc85be85779a47bae728bbe6a2cd2e3732b1333dDaniel Dunbar  // This comes from the default translation the driver + cc1
615bc85be85779a47bae728bbe6a2cd2e3732b1333dDaniel Dunbar  // would do to enable flag_pic.
616bc85be85779a47bae728bbe6a2cd2e3732b1333dDaniel Dunbar  //
617bc85be85779a47bae728bbe6a2cd2e3732b1333dDaniel Dunbar  // FIXME: Centralize this code.
618bc85be85779a47bae728bbe6a2cd2e3732b1333dDaniel Dunbar  bool PICEnabled = (Args.hasArg(options::OPT_fPIC) ||
619bc85be85779a47bae728bbe6a2cd2e3732b1333dDaniel Dunbar                     Args.hasArg(options::OPT_fpic) ||
620bc85be85779a47bae728bbe6a2cd2e3732b1333dDaniel Dunbar                     Args.hasArg(options::OPT_fPIE) ||
621bc85be85779a47bae728bbe6a2cd2e3732b1333dDaniel Dunbar                     Args.hasArg(options::OPT_fpie));
622bc85be85779a47bae728bbe6a2cd2e3732b1333dDaniel Dunbar  bool PICDisabled = (Args.hasArg(options::OPT_mkernel) ||
623bc85be85779a47bae728bbe6a2cd2e3732b1333dDaniel Dunbar                      Args.hasArg(options::OPT_static));
624bc85be85779a47bae728bbe6a2cd2e3732b1333dDaniel Dunbar  const char *Model = getToolChain().GetForcedPicModel();
625bc85be85779a47bae728bbe6a2cd2e3732b1333dDaniel Dunbar  if (!Model) {
626bc85be85779a47bae728bbe6a2cd2e3732b1333dDaniel Dunbar    if (Args.hasArg(options::OPT_mdynamic_no_pic))
627bc85be85779a47bae728bbe6a2cd2e3732b1333dDaniel Dunbar      Model = "dynamic-no-pic";
628bc85be85779a47bae728bbe6a2cd2e3732b1333dDaniel Dunbar    else if (PICDisabled)
629bc85be85779a47bae728bbe6a2cd2e3732b1333dDaniel Dunbar      Model = "static";
630bc85be85779a47bae728bbe6a2cd2e3732b1333dDaniel Dunbar    else if (PICEnabled)
631bc85be85779a47bae728bbe6a2cd2e3732b1333dDaniel Dunbar      Model = "pic";
6321d46033f760ba5fd266ce59fe391fac473f04f52Daniel Dunbar    else
633bc85be85779a47bae728bbe6a2cd2e3732b1333dDaniel Dunbar      Model = getToolChain().GetDefaultRelocationModel();
634bc85be85779a47bae728bbe6a2cd2e3732b1333dDaniel Dunbar  }
635bc85be85779a47bae728bbe6a2cd2e3732b1333dDaniel Dunbar  CmdArgs.push_back("--relocation-model");
636bc85be85779a47bae728bbe6a2cd2e3732b1333dDaniel Dunbar  CmdArgs.push_back(Model);
6371d46033f760ba5fd266ce59fe391fac473f04f52Daniel Dunbar
638bc85be85779a47bae728bbe6a2cd2e3732b1333dDaniel Dunbar  // Infer the __PIC__ value.
639bc85be85779a47bae728bbe6a2cd2e3732b1333dDaniel Dunbar  //
640bc85be85779a47bae728bbe6a2cd2e3732b1333dDaniel Dunbar  // FIXME:  This isn't quite right on Darwin, which always sets
641bc85be85779a47bae728bbe6a2cd2e3732b1333dDaniel Dunbar  // __PIC__=2.
642bc85be85779a47bae728bbe6a2cd2e3732b1333dDaniel Dunbar  if (strcmp(Model, "pic") == 0 || strcmp(Model, "dynamic-no-pic") == 0) {
643bc85be85779a47bae728bbe6a2cd2e3732b1333dDaniel Dunbar    if (Args.hasArg(options::OPT_fPIC))
644bc85be85779a47bae728bbe6a2cd2e3732b1333dDaniel Dunbar      CmdArgs.push_back("-pic-level=2");
6451d46033f760ba5fd266ce59fe391fac473f04f52Daniel Dunbar    else
646bc85be85779a47bae728bbe6a2cd2e3732b1333dDaniel Dunbar      CmdArgs.push_back("-pic-level=1");
647bc85be85779a47bae728bbe6a2cd2e3732b1333dDaniel Dunbar  }
6481d46033f760ba5fd266ce59fe391fac473f04f52Daniel Dunbar
649bc85be85779a47bae728bbe6a2cd2e3732b1333dDaniel Dunbar  if (Args.hasArg(options::OPT_ftime_report))
650bc85be85779a47bae728bbe6a2cd2e3732b1333dDaniel Dunbar    CmdArgs.push_back("--time-passes");
651bc85be85779a47bae728bbe6a2cd2e3732b1333dDaniel Dunbar  // FIXME: Set --enable-unsafe-fp-math.
65221656ddae8e81df04f142386337cb95a9e0f0971Benjamin Kramer  if (Args.hasFlag(options::OPT_fno_omit_frame_pointer,
65321656ddae8e81df04f142386337cb95a9e0f0971Benjamin Kramer                   options::OPT_fomit_frame_pointer))
654bc85be85779a47bae728bbe6a2cd2e3732b1333dDaniel Dunbar    CmdArgs.push_back("--disable-fp-elim");
655bc85be85779a47bae728bbe6a2cd2e3732b1333dDaniel Dunbar  if (!Args.hasFlag(options::OPT_fzero_initialized_in_bss,
656bc85be85779a47bae728bbe6a2cd2e3732b1333dDaniel Dunbar                    options::OPT_fno_zero_initialized_in_bss,
657bc85be85779a47bae728bbe6a2cd2e3732b1333dDaniel Dunbar                    true))
658bc85be85779a47bae728bbe6a2cd2e3732b1333dDaniel Dunbar    CmdArgs.push_back("--nozero-initialized-in-bss");
659bc85be85779a47bae728bbe6a2cd2e3732b1333dDaniel Dunbar  if (Args.hasArg(options::OPT_dA) || Args.hasArg(options::OPT_fverbose_asm))
660bc85be85779a47bae728bbe6a2cd2e3732b1333dDaniel Dunbar    CmdArgs.push_back("--asm-verbose");
661bc85be85779a47bae728bbe6a2cd2e3732b1333dDaniel Dunbar  if (Args.hasArg(options::OPT_fdebug_pass_structure))
662bc85be85779a47bae728bbe6a2cd2e3732b1333dDaniel Dunbar    CmdArgs.push_back("--debug-pass=Structure");
663bc85be85779a47bae728bbe6a2cd2e3732b1333dDaniel Dunbar  if (Args.hasArg(options::OPT_fdebug_pass_arguments))
664bc85be85779a47bae728bbe6a2cd2e3732b1333dDaniel Dunbar    CmdArgs.push_back("--debug-pass=Arguments");
665bc85be85779a47bae728bbe6a2cd2e3732b1333dDaniel Dunbar  // FIXME: set --inline-threshhold=50 if (optimize_size || optimize
666bc85be85779a47bae728bbe6a2cd2e3732b1333dDaniel Dunbar  // < 3)
6676bea73b3305a03479589e2642fbdcf6c096851aaDaniel Dunbar
6686bea73b3305a03479589e2642fbdcf6c096851aaDaniel Dunbar  // This is a coarse approximation of what llvm-gcc actually does, both
6696bea73b3305a03479589e2642fbdcf6c096851aaDaniel Dunbar  // -fasynchronous-unwind-tables and -fnon-call-exceptions interact in more
6706bea73b3305a03479589e2642fbdcf6c096851aaDaniel Dunbar  // complicated ways.
6716bea73b3305a03479589e2642fbdcf6c096851aaDaniel Dunbar  bool AsynchronousUnwindTables =
6726bea73b3305a03479589e2642fbdcf6c096851aaDaniel Dunbar    Args.hasFlag(options::OPT_fasynchronous_unwind_tables,
6736bea73b3305a03479589e2642fbdcf6c096851aaDaniel Dunbar                 options::OPT_fno_asynchronous_unwind_tables,
6746bea73b3305a03479589e2642fbdcf6c096851aaDaniel Dunbar                 getToolChain().IsUnwindTablesDefault() &&
6756bea73b3305a03479589e2642fbdcf6c096851aaDaniel Dunbar                 !Args.hasArg(options::OPT_mkernel));
6766bea73b3305a03479589e2642fbdcf6c096851aaDaniel Dunbar  if (Args.hasFlag(options::OPT_funwind_tables, options::OPT_fno_unwind_tables,
6776bea73b3305a03479589e2642fbdcf6c096851aaDaniel Dunbar                   AsynchronousUnwindTables))
678bc85be85779a47bae728bbe6a2cd2e3732b1333dDaniel Dunbar    CmdArgs.push_back("--unwind-tables=1");
679bc85be85779a47bae728bbe6a2cd2e3732b1333dDaniel Dunbar  else
680bc85be85779a47bae728bbe6a2cd2e3732b1333dDaniel Dunbar    CmdArgs.push_back("--unwind-tables=0");
681bc85be85779a47bae728bbe6a2cd2e3732b1333dDaniel Dunbar
682868bd0aa9281929ef50d2e9a8c82a036906f53f5Daniel Dunbar  // FIXME: Handle -mtune=.
683868bd0aa9281929ef50d2e9a8c82a036906f53f5Daniel Dunbar  (void) Args.hasArg(options::OPT_mtune_EQ);
684bc85be85779a47bae728bbe6a2cd2e3732b1333dDaniel Dunbar
6858e9ef0d87dad25f02e5abc6facf528778236115aBenjamin Kramer  if (Arg *A = Args.getLastArg(options::OPT_mcmodel_EQ)) {
6868e9ef0d87dad25f02e5abc6facf528778236115aBenjamin Kramer    CmdArgs.push_back("-code-model");
6878e9ef0d87dad25f02e5abc6facf528778236115aBenjamin Kramer    CmdArgs.push_back(A->getValue(Args));
6888e9ef0d87dad25f02e5abc6facf528778236115aBenjamin Kramer  }
6898e9ef0d87dad25f02e5abc6facf528778236115aBenjamin Kramer
6906acda16e9c194dcbd0dea64341e182bdb65d0f41Daniel Dunbar  // Add target specific cpu and features flags.
6916acda16e9c194dcbd0dea64341e182bdb65d0f41Daniel Dunbar  switch(getToolChain().getTriple().getArch()) {
6926acda16e9c194dcbd0dea64341e182bdb65d0f41Daniel Dunbar  default:
6936acda16e9c194dcbd0dea64341e182bdb65d0f41Daniel Dunbar    break;
694868bd0aa9281929ef50d2e9a8c82a036906f53f5Daniel Dunbar
695b163ef7e7a5d904ef0962a7c38c460be083c4d63Daniel Dunbar  case llvm::Triple::arm:
696b163ef7e7a5d904ef0962a7c38c460be083c4d63Daniel Dunbar  case llvm::Triple::thumb:
697b163ef7e7a5d904ef0962a7c38c460be083c4d63Daniel Dunbar    AddARMTargetArgs(Args, CmdArgs);
698b163ef7e7a5d904ef0962a7c38c460be083c4d63Daniel Dunbar    break;
699b163ef7e7a5d904ef0962a7c38c460be083c4d63Daniel Dunbar
7006acda16e9c194dcbd0dea64341e182bdb65d0f41Daniel Dunbar  case llvm::Triple::x86:
7016acda16e9c194dcbd0dea64341e182bdb65d0f41Daniel Dunbar  case llvm::Triple::x86_64:
7026acda16e9c194dcbd0dea64341e182bdb65d0f41Daniel Dunbar    AddX86TargetArgs(Args, CmdArgs);
7036acda16e9c194dcbd0dea64341e182bdb65d0f41Daniel Dunbar    break;
704bc85be85779a47bae728bbe6a2cd2e3732b1333dDaniel Dunbar  }
705c21c485b4fb58ef5d55cf3e523263dd824a2ace4Daniel Dunbar
706bc85be85779a47bae728bbe6a2cd2e3732b1333dDaniel Dunbar  if (Args.hasFlag(options::OPT_fmath_errno,
707bc85be85779a47bae728bbe6a2cd2e3732b1333dDaniel Dunbar                   options::OPT_fno_math_errno,
708bc85be85779a47bae728bbe6a2cd2e3732b1333dDaniel Dunbar                   getToolChain().IsMathErrnoDefault()))
709bc85be85779a47bae728bbe6a2cd2e3732b1333dDaniel Dunbar    CmdArgs.push_back("--fmath-errno=1");
710bc85be85779a47bae728bbe6a2cd2e3732b1333dDaniel Dunbar  else
711bc85be85779a47bae728bbe6a2cd2e3732b1333dDaniel Dunbar    CmdArgs.push_back("--fmath-errno=0");
7121d46033f760ba5fd266ce59fe391fac473f04f52Daniel Dunbar
713bc85be85779a47bae728bbe6a2cd2e3732b1333dDaniel Dunbar  if (Arg *A = Args.getLastArg(options::OPT_flimited_precision_EQ)) {
714bc85be85779a47bae728bbe6a2cd2e3732b1333dDaniel Dunbar    CmdArgs.push_back("--limit-float-precision");
715bc85be85779a47bae728bbe6a2cd2e3732b1333dDaniel Dunbar    CmdArgs.push_back(A->getValue(Args));
7161d46033f760ba5fd266ce59fe391fac473f04f52Daniel Dunbar  }
7171d46033f760ba5fd266ce59fe391fac473f04f52Daniel Dunbar
718bc85be85779a47bae728bbe6a2cd2e3732b1333dDaniel Dunbar  // FIXME: Add --stack-protector-buffer-size=<xxx> on
719bc85be85779a47bae728bbe6a2cd2e3732b1333dDaniel Dunbar  // -fstack-protect.
720bc85be85779a47bae728bbe6a2cd2e3732b1333dDaniel Dunbar
721bc85be85779a47bae728bbe6a2cd2e3732b1333dDaniel Dunbar  Arg *Unsupported;
722bc85be85779a47bae728bbe6a2cd2e3732b1333dDaniel Dunbar  if ((Unsupported = Args.getLastArg(options::OPT_MG)) ||
72395a0da7b263777e6f97e5a08b6eb893681a234baDaniel Dunbar      (Unsupported = Args.getLastArg(options::OPT_MQ)) ||
72495a0da7b263777e6f97e5a08b6eb893681a234baDaniel Dunbar      (Unsupported = Args.getLastArg(options::OPT_iframework)))
725e027a4b2399e9b0acfe0f77220c66bbe369067eeDaniel Dunbar    D.Diag(clang::diag::err_drv_clang_unsupported)
726bc85be85779a47bae728bbe6a2cd2e3732b1333dDaniel Dunbar      << Unsupported->getOption().getName();
727bc85be85779a47bae728bbe6a2cd2e3732b1333dDaniel Dunbar
7281d46033f760ba5fd266ce59fe391fac473f04f52Daniel Dunbar  Args.AddAllArgs(CmdArgs, options::OPT_v);
7291d46033f760ba5fd266ce59fe391fac473f04f52Daniel Dunbar  Args.AddLastArg(CmdArgs, options::OPT_P);
7302ac9fc2ad64e16127df8c60caeea2edfe9a400a2Daniel Dunbar  Args.AddLastArg(CmdArgs, options::OPT_mmacosx_version_min_EQ);
731ff8857a9e6f533765f63b2934902645baa7ddd09Daniel Dunbar  Args.AddLastArg(CmdArgs, options::OPT_miphoneos_version_min_EQ);
7321eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump  Args.AddLastArg(CmdArgs, options::OPT_print_ivar_layout);
7331d46033f760ba5fd266ce59fe391fac473f04f52Daniel Dunbar
7341d46033f760ba5fd266ce59fe391fac473f04f52Daniel Dunbar  // Special case debug options to only pass -g to clang. This is
7351d46033f760ba5fd266ce59fe391fac473f04f52Daniel Dunbar  // wrong.
7361d46033f760ba5fd266ce59fe391fac473f04f52Daniel Dunbar  if (Args.hasArg(options::OPT_g_Group))
7371d46033f760ba5fd266ce59fe391fac473f04f52Daniel Dunbar    CmdArgs.push_back("-g");
7381d46033f760ba5fd266ce59fe391fac473f04f52Daniel Dunbar
7391d46033f760ba5fd266ce59fe391fac473f04f52Daniel Dunbar  Args.AddLastArg(CmdArgs, options::OPT_nostdinc);
7408d737cc78cb28f39179d6c7ca00eb5d3cf563129Rafael Espindola  Args.AddLastArg(CmdArgs, options::OPT_nobuiltininc);
7411d46033f760ba5fd266ce59fe391fac473f04f52Daniel Dunbar
7422ac9fc2ad64e16127df8c60caeea2edfe9a400a2Daniel Dunbar  Args.AddLastArg(CmdArgs, options::OPT_isysroot);
7432ac9fc2ad64e16127df8c60caeea2edfe9a400a2Daniel Dunbar
744c21c485b4fb58ef5d55cf3e523263dd824a2ace4Daniel Dunbar  // Add preprocessing options like -I, -D, etc. if we are using the
745c21c485b4fb58ef5d55cf3e523263dd824a2ace4Daniel Dunbar  // preprocessor.
746c21c485b4fb58ef5d55cf3e523263dd824a2ace4Daniel Dunbar  //
747c21c485b4fb58ef5d55cf3e523263dd824a2ace4Daniel Dunbar  // FIXME: Support -fpreprocessed
748c21c485b4fb58ef5d55cf3e523263dd824a2ace4Daniel Dunbar  types::ID InputType = Inputs[0].getType();
749c21c485b4fb58ef5d55cf3e523263dd824a2ace4Daniel Dunbar  if (types::getPreprocessedType(InputType) != types::TY_INVALID)
750df91ef3d6c55692a0236f67b6c6b134a3bf84098Douglas Gregor    AddPreprocessingOptions(D, Args, CmdArgs, Output, Inputs);
7511d46033f760ba5fd266ce59fe391fac473f04f52Daniel Dunbar
75220f0eacf1682e4594da9d318b5b13ed4f6d6e7e5Daniel Dunbar  // Manually translate -O to -O2 and -O4 to -O3; let clang reject
753337a6271b98c4c183f7eaad1563a75260b4f2871Daniel Dunbar  // others.
754337a6271b98c4c183f7eaad1563a75260b4f2871Daniel Dunbar  if (Arg *A = Args.getLastArg(options::OPT_O_Group)) {
755c21c485b4fb58ef5d55cf3e523263dd824a2ace4Daniel Dunbar    if (A->getOption().getId() == options::OPT_O4)
756337a6271b98c4c183f7eaad1563a75260b4f2871Daniel Dunbar      CmdArgs.push_back("-O3");
757337a6271b98c4c183f7eaad1563a75260b4f2871Daniel Dunbar    else if (A->getValue(Args)[0] == '\0')
75820f0eacf1682e4594da9d318b5b13ed4f6d6e7e5Daniel Dunbar      CmdArgs.push_back("-O2");
7591d46033f760ba5fd266ce59fe391fac473f04f52Daniel Dunbar    else
7605697aa0d75c87bafec78984048d558f8d12ca1b3Daniel Dunbar      A->render(Args, CmdArgs);
7611d46033f760ba5fd266ce59fe391fac473f04f52Daniel Dunbar  }
7621d46033f760ba5fd266ce59fe391fac473f04f52Daniel Dunbar
76306ef3c3e9be4923b8e29c8e267b0c56afaa14ff3Daniel Dunbar  Args.AddAllArgs(CmdArgs, options::OPT_W_Group, options::OPT_pedantic_Group);
7641d46033f760ba5fd266ce59fe391fac473f04f52Daniel Dunbar  Args.AddLastArg(CmdArgs, options::OPT_w);
765d573d26e1abcce24c31ece3d6f7af158db569e4cDaniel Dunbar
766d573d26e1abcce24c31ece3d6f7af158db569e4cDaniel Dunbar  // Handle -{std, ansi, trigraphs} -- take the last of -{std, ansi}
767d573d26e1abcce24c31ece3d6f7af158db569e4cDaniel Dunbar  // (-ansi is equivalent to -std=c89).
768d573d26e1abcce24c31ece3d6f7af158db569e4cDaniel Dunbar  //
769d573d26e1abcce24c31ece3d6f7af158db569e4cDaniel Dunbar  // If a std is supplied, only add -trigraphs if it follows the
770d573d26e1abcce24c31ece3d6f7af158db569e4cDaniel Dunbar  // option.
771d573d26e1abcce24c31ece3d6f7af158db569e4cDaniel Dunbar  if (Arg *Std = Args.getLastArg(options::OPT_std_EQ, options::OPT_ansi)) {
772d573d26e1abcce24c31ece3d6f7af158db569e4cDaniel Dunbar    if (Std->getOption().matches(options::OPT_ansi))
773528365d3189d27f3a90a4012baaa8b2814e0a231Nuno Lopes      if (types::isCXX(InputType))
774528365d3189d27f3a90a4012baaa8b2814e0a231Nuno Lopes          CmdArgs.push_back("-std=c++98");
775528365d3189d27f3a90a4012baaa8b2814e0a231Nuno Lopes      else
776528365d3189d27f3a90a4012baaa8b2814e0a231Nuno Lopes          CmdArgs.push_back("-std=c89");
777d573d26e1abcce24c31ece3d6f7af158db569e4cDaniel Dunbar    else
778d573d26e1abcce24c31ece3d6f7af158db569e4cDaniel Dunbar      Std->render(Args, CmdArgs);
779d573d26e1abcce24c31ece3d6f7af158db569e4cDaniel Dunbar
780d573d26e1abcce24c31ece3d6f7af158db569e4cDaniel Dunbar    if (Arg *A = Args.getLastArg(options::OPT_trigraphs))
781d573d26e1abcce24c31ece3d6f7af158db569e4cDaniel Dunbar      if (A->getIndex() > Std->getIndex())
782d573d26e1abcce24c31ece3d6f7af158db569e4cDaniel Dunbar        A->render(Args, CmdArgs);
783a3ff202ee4fb21728e930d5d029ba4925129912cDaniel Dunbar  } else {
784a3ff202ee4fb21728e930d5d029ba4925129912cDaniel Dunbar    // Honor -std-default.
785a3ff202ee4fb21728e930d5d029ba4925129912cDaniel Dunbar    Args.AddAllArgsTranslated(CmdArgs, options::OPT_std_default_EQ,
786a3ff202ee4fb21728e930d5d029ba4925129912cDaniel Dunbar                              "-std=", /*Joined=*/true);
787d573d26e1abcce24c31ece3d6f7af158db569e4cDaniel Dunbar    Args.AddLastArg(CmdArgs, options::OPT_trigraphs);
788a3ff202ee4fb21728e930d5d029ba4925129912cDaniel Dunbar  }
789c21c485b4fb58ef5d55cf3e523263dd824a2ace4Daniel Dunbar
7901d46033f760ba5fd266ce59fe391fac473f04f52Daniel Dunbar  if (Arg *A = Args.getLastArg(options::OPT_ftemplate_depth_)) {
7911d46033f760ba5fd266ce59fe391fac473f04f52Daniel Dunbar    CmdArgs.push_back("-ftemplate-depth");
7921d46033f760ba5fd266ce59fe391fac473f04f52Daniel Dunbar    CmdArgs.push_back(A->getValue(Args));
793b488c1dac8e53206f07103d794a62a3f5012c0f4Daniel Dunbar  }
794b488c1dac8e53206f07103d794a62a3f5012c0f4Daniel Dunbar
795e650c8c3bca2f58cad8ffa8aab63126d26e890cdDouglas Gregor  if (Args.hasArg(options::OPT__relocatable_pch, true))
796e650c8c3bca2f58cad8ffa8aab63126d26e890cdDouglas Gregor    CmdArgs.push_back("--relocatable-pch");
7971eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump
7988a5a9aaddb627c0884c2ed8db55cc29fdb601195David Chisnall   if (Arg *A = Args.getLastArg(options::OPT_fconstant_string_class_EQ)) {
7998a5a9aaddb627c0884c2ed8db55cc29fdb601195David Chisnall     CmdArgs.push_back("-fconstant-string-class");
8008a5a9aaddb627c0884c2ed8db55cc29fdb601195David Chisnall     CmdArgs.push_back(A->getValue(Args));
8018a5a9aaddb627c0884c2ed8db55cc29fdb601195David Chisnall   }
8028a5a9aaddb627c0884c2ed8db55cc29fdb601195David Chisnall
80348d1ef782c8c88066b5febf60f8f456064d7d3f0Daniel Dunbar  // Forward -f options which we can pass directly.
8043aaf082689d3235937a2e56a60f90fc1b3aebfb2Daniel Dunbar  Args.AddLastArg(CmdArgs, options::OPT_femit_all_decls);
8053aaf082689d3235937a2e56a60f90fc1b3aebfb2Daniel Dunbar  Args.AddLastArg(CmdArgs, options::OPT_ffreestanding);
8063aaf082689d3235937a2e56a60f90fc1b3aebfb2Daniel Dunbar  Args.AddLastArg(CmdArgs, options::OPT_fheinous_gnu_extensions);
8073aaf082689d3235937a2e56a60f90fc1b3aebfb2Daniel Dunbar  Args.AddLastArg(CmdArgs, options::OPT_fgnu_runtime);
8083aaf082689d3235937a2e56a60f90fc1b3aebfb2Daniel Dunbar  Args.AddLastArg(CmdArgs, options::OPT_flax_vector_conversions);
809fffd93f38340d4d2ca7ee78a8c91c890b2ff3fa0Douglas Gregor  Args.AddLastArg(CmdArgs, options::OPT_fmessage_length_EQ);
8103aaf082689d3235937a2e56a60f90fc1b3aebfb2Daniel Dunbar  Args.AddLastArg(CmdArgs, options::OPT_fms_extensions);
8113aaf082689d3235937a2e56a60f90fc1b3aebfb2Daniel Dunbar  Args.AddLastArg(CmdArgs, options::OPT_fnext_runtime);
8123aaf082689d3235937a2e56a60f90fc1b3aebfb2Daniel Dunbar  Args.AddLastArg(CmdArgs, options::OPT_fno_caret_diagnostics);
8133aaf082689d3235937a2e56a60f90fc1b3aebfb2Daniel Dunbar  Args.AddLastArg(CmdArgs, options::OPT_fno_show_column);
8143aaf082689d3235937a2e56a60f90fc1b3aebfb2Daniel Dunbar  Args.AddLastArg(CmdArgs, options::OPT_fobjc_gc_only);
8153aaf082689d3235937a2e56a60f90fc1b3aebfb2Daniel Dunbar  Args.AddLastArg(CmdArgs, options::OPT_fobjc_gc);
81634e65770ad6142b033d6cec4f476ed20fb248bf3Fariborz Jahanian  Args.AddLastArg(CmdArgs, options::OPT_fobjc_sender_dependent_dispatch);
8173aaf082689d3235937a2e56a60f90fc1b3aebfb2Daniel Dunbar  // FIXME: Should we remove this?
8183aaf082689d3235937a2e56a60f90fc1b3aebfb2Daniel Dunbar  Args.AddLastArg(CmdArgs, options::OPT_fobjc_nonfragile_abi);
819d6884a0b90091a063478ec7fa31f6d76c94e4917Daniel Dunbar  Args.AddLastArg(CmdArgs, options::OPT_fobjc_tight_layout);
820182e09240a33c6f1d303deecabec6e0e9c9d109dChris Lattner  Args.AddLastArg(CmdArgs, options::OPT_fdiagnostics_print_source_range_info);
8213aaf082689d3235937a2e56a60f90fc1b3aebfb2Daniel Dunbar  Args.AddLastArg(CmdArgs, options::OPT_ftime_report);
8223aaf082689d3235937a2e56a60f90fc1b3aebfb2Daniel Dunbar  Args.AddLastArg(CmdArgs, options::OPT_ftrapv);
8233aaf082689d3235937a2e56a60f90fc1b3aebfb2Daniel Dunbar  Args.AddLastArg(CmdArgs, options::OPT_fvisibility_EQ);
8243aaf082689d3235937a2e56a60f90fc1b3aebfb2Daniel Dunbar  Args.AddLastArg(CmdArgs, options::OPT_fwritable_strings);
8251d46033f760ba5fd266ce59fe391fac473f04f52Daniel Dunbar
8265345c391c65d1780a0d7b0102b7f735cc3f82732Daniel Dunbar  Args.AddLastArg(CmdArgs, options::OPT_pthread);
8275345c391c65d1780a0d7b0102b7f735cc3f82732Daniel Dunbar
82845483f7a1b3e57b4603b141bee80596b2d4dd443Bill Wendling  // Forward stack protector flags.
82945483f7a1b3e57b4603b141bee80596b2d4dd443Bill Wendling  if (Arg *A = Args.getLastArg(options::OPT_fno_stack_protector,
83045483f7a1b3e57b4603b141bee80596b2d4dd443Bill Wendling                               options::OPT_fstack_protector_all,
83145483f7a1b3e57b4603b141bee80596b2d4dd443Bill Wendling                               options::OPT_fstack_protector)) {
83245483f7a1b3e57b4603b141bee80596b2d4dd443Bill Wendling    if (A->getOption().matches(options::OPT_fno_stack_protector))
83345483f7a1b3e57b4603b141bee80596b2d4dd443Bill Wendling      CmdArgs.push_back("--stack-protector=0");
83445483f7a1b3e57b4603b141bee80596b2d4dd443Bill Wendling    else if (A->getOption().matches(options::OPT_fstack_protector))
83545483f7a1b3e57b4603b141bee80596b2d4dd443Bill Wendling      CmdArgs.push_back("--stack-protector=1");
83645483f7a1b3e57b4603b141bee80596b2d4dd443Bill Wendling    else
83745483f7a1b3e57b4603b141bee80596b2d4dd443Bill Wendling      CmdArgs.push_back("--stack-protector=2");
83845483f7a1b3e57b4603b141bee80596b2d4dd443Bill Wendling  }
83945483f7a1b3e57b4603b141bee80596b2d4dd443Bill Wendling
84048d1ef782c8c88066b5febf60f8f456064d7d3f0Daniel Dunbar  // Forward -f options with positive and negative forms; we translate
84148d1ef782c8c88066b5febf60f8f456064d7d3f0Daniel Dunbar  // these by hand.
84248d1ef782c8c88066b5febf60f8f456064d7d3f0Daniel Dunbar
84348d1ef782c8c88066b5febf60f8f456064d7d3f0Daniel Dunbar  // -fbuiltin is default, only pass non-default.
84448d1ef782c8c88066b5febf60f8f456064d7d3f0Daniel Dunbar  if (!Args.hasFlag(options::OPT_fbuiltin, options::OPT_fno_builtin))
84548d1ef782c8c88066b5febf60f8f456064d7d3f0Daniel Dunbar    CmdArgs.push_back("-fbuiltin=0");
84648d1ef782c8c88066b5febf60f8f456064d7d3f0Daniel Dunbar
8477695fba30221613b7cf31276456217c41bb90960Daniel Dunbar  // -fblocks default varies depending on platform and language; only
8487695fba30221613b7cf31276456217c41bb90960Daniel Dunbar  // pass if specified.
84948d1ef782c8c88066b5febf60f8f456064d7d3f0Daniel Dunbar  if (Arg *A = Args.getLastArg(options::OPT_fblocks, options::OPT_fno_blocks)) {
85048d1ef782c8c88066b5febf60f8f456064d7d3f0Daniel Dunbar    if (A->getOption().matches(options::OPT_fblocks))
85148d1ef782c8c88066b5febf60f8f456064d7d3f0Daniel Dunbar      CmdArgs.push_back("-fblocks");
85248d1ef782c8c88066b5febf60f8f456064d7d3f0Daniel Dunbar    else
85348d1ef782c8c88066b5febf60f8f456064d7d3f0Daniel Dunbar      CmdArgs.push_back("-fblocks=0");
85448d1ef782c8c88066b5febf60f8f456064d7d3f0Daniel Dunbar  }
85548d1ef782c8c88066b5febf60f8f456064d7d3f0Daniel Dunbar
85685caf03ee49c4de87ee9624a9b725ef5d20ee624Fariborz Jahanian  if (needsExceptions(Args, InputType, getToolChain().getTriple()))
857f759df06d997050559fd925758bcd2cdef24db05Rafael Espindola    CmdArgs.push_back("-fexceptions");
858f759df06d997050559fd925758bcd2cdef24db05Rafael Espindola  else
859f759df06d997050559fd925758bcd2cdef24db05Rafael Espindola    CmdArgs.push_back("-fexceptions=0");
860738f8c278da5950d0d4607de2debe0bdfad64185Mike Stump
861738f8c278da5950d0d4607de2debe0bdfad64185Mike Stump  // -frtti is default, only pass non-default.
862738f8c278da5950d0d4607de2debe0bdfad64185Mike Stump  if (!Args.hasFlag(options::OPT_frtti, options::OPT_fno_rtti))
863738f8c278da5950d0d4607de2debe0bdfad64185Mike Stump    CmdArgs.push_back("-frtti=0");
864738f8c278da5950d0d4607de2debe0bdfad64185Mike Stump
8655a77973d9bc2c9cdbdb7860dcf3ac795abe258ecEli Friedman  // -fsigned-char/-funsigned-char default varies depending on platform; only
8665a77973d9bc2c9cdbdb7860dcf3ac795abe258ecEli Friedman  // pass if specified.
8675a77973d9bc2c9cdbdb7860dcf3ac795abe258ecEli Friedman  if (Arg *A = Args.getLastArg(options::OPT_fsigned_char,
8685a77973d9bc2c9cdbdb7860dcf3ac795abe258ecEli Friedman                               options::OPT_funsigned_char)) {
8695a77973d9bc2c9cdbdb7860dcf3ac795abe258ecEli Friedman    if (A->getOption().matches(options::OPT_fsigned_char))
8705a77973d9bc2c9cdbdb7860dcf3ac795abe258ecEli Friedman      CmdArgs.push_back("-fsigned-char");
8715a77973d9bc2c9cdbdb7860dcf3ac795abe258ecEli Friedman    else
8725a77973d9bc2c9cdbdb7860dcf3ac795abe258ecEli Friedman      CmdArgs.push_back("-fsigned-char=0");
8735a77973d9bc2c9cdbdb7860dcf3ac795abe258ecEli Friedman  }
8745a77973d9bc2c9cdbdb7860dcf3ac795abe258ecEli Friedman
87582d00688525c876bf47bce414dedae9c343e67f5Daniel Dunbar  // -fno-pascal-strings is default, only pass non-default. If the
87682d00688525c876bf47bce414dedae9c343e67f5Daniel Dunbar  // -tool chain happened to translate to -mpascal-strings, we want to
87782d00688525c876bf47bce414dedae9c343e67f5Daniel Dunbar  // -back translate here.
87882d00688525c876bf47bce414dedae9c343e67f5Daniel Dunbar  //
87982d00688525c876bf47bce414dedae9c343e67f5Daniel Dunbar  // FIXME: This is gross; that translation should be pulled from the
88082d00688525c876bf47bce414dedae9c343e67f5Daniel Dunbar  // tool chain.
881c21c485b4fb58ef5d55cf3e523263dd824a2ace4Daniel Dunbar  if (Args.hasFlag(options::OPT_fpascal_strings,
88282d00688525c876bf47bce414dedae9c343e67f5Daniel Dunbar                   options::OPT_fno_pascal_strings,
88382d00688525c876bf47bce414dedae9c343e67f5Daniel Dunbar                   false) ||
88482d00688525c876bf47bce414dedae9c343e67f5Daniel Dunbar      Args.hasFlag(options::OPT_mpascal_strings,
88582d00688525c876bf47bce414dedae9c343e67f5Daniel Dunbar                   options::OPT_mno_pascal_strings,
88682d00688525c876bf47bce414dedae9c343e67f5Daniel Dunbar                   false))
88748d1ef782c8c88066b5febf60f8f456064d7d3f0Daniel Dunbar    CmdArgs.push_back("-fpascal-strings");
88848d1ef782c8c88066b5febf60f8f456064d7d3f0Daniel Dunbar
88948d1ef782c8c88066b5febf60f8f456064d7d3f0Daniel Dunbar  // -fcommon is default, only pass non-default.
89048d1ef782c8c88066b5febf60f8f456064d7d3f0Daniel Dunbar  if (!Args.hasFlag(options::OPT_fcommon, options::OPT_fno_common))
89148d1ef782c8c88066b5febf60f8f456064d7d3f0Daniel Dunbar    CmdArgs.push_back("-fno-common");
89248d1ef782c8c88066b5febf60f8f456064d7d3f0Daniel Dunbar
89370d3c92820f590b10553da9c96eda24e4325ba34Daniel Dunbar  // -fsigned-bitfields is default, and clang doesn't yet support
89470d3c92820f590b10553da9c96eda24e4325ba34Daniel Dunbar  // --funsigned-bitfields.
8951eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump  if (!Args.hasFlag(options::OPT_fsigned_bitfields,
89670d3c92820f590b10553da9c96eda24e4325ba34Daniel Dunbar                    options::OPT_funsigned_bitfields))
89770d3c92820f590b10553da9c96eda24e4325ba34Daniel Dunbar    D.Diag(clang::diag::warn_drv_clang_unsupported)
89870d3c92820f590b10553da9c96eda24e4325ba34Daniel Dunbar      << Args.getLastArg(options::OPT_funsigned_bitfields)->getAsString(Args);
89970d3c92820f590b10553da9c96eda24e4325ba34Daniel Dunbar
90049138fc59eeac2aacd3b7e04c2642180d5baefd7Daniel Dunbar  // -fdiagnostics-fixit-info is default, only pass non-default.
9011eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump  if (!Args.hasFlag(options::OPT_fdiagnostics_fixit_info,
90249138fc59eeac2aacd3b7e04c2642180d5baefd7Daniel Dunbar                    options::OPT_fno_diagnostics_fixit_info))
90349138fc59eeac2aacd3b7e04c2642180d5baefd7Daniel Dunbar    CmdArgs.push_back("-fno-diagnostics-fixit-info");
90449138fc59eeac2aacd3b7e04c2642180d5baefd7Daniel Dunbar
9059e820ee054fefe5422b4db3f681e567a8976747eDaniel Dunbar  // Enable -fdiagnostics-show-option by default.
9061eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump  if (Args.hasFlag(options::OPT_fdiagnostics_show_option,
9079e820ee054fefe5422b4db3f681e567a8976747eDaniel Dunbar                   options::OPT_fno_diagnostics_show_option))
9089e820ee054fefe5422b4db3f681e567a8976747eDaniel Dunbar    CmdArgs.push_back("-fdiagnostics-show-option");
909a46c71abb1dc2f9758ad1abe3378534fe138e802Torok Edwin  if (!Args.hasFlag(options::OPT_fcolor_diagnostics,
91075eb1d64784946a37fc0b27596e2d92b6cf7033bDaniel Dunbar                    options::OPT_fno_color_diagnostics))
911a46c71abb1dc2f9758ad1abe3378534fe138e802Torok Edwin    CmdArgs.push_back("-fno-color-diagnostics");
91275eb1d64784946a37fc0b27596e2d92b6cf7033bDaniel Dunbar  if (!Args.hasFlag(options::OPT_fshow_source_location,
91375eb1d64784946a37fc0b27596e2d92b6cf7033bDaniel Dunbar                    options::OPT_fno_show_source_location))
91475eb1d64784946a37fc0b27596e2d92b6cf7033bDaniel Dunbar    CmdArgs.push_back("-fno-show-source-location");
9159e820ee054fefe5422b4db3f681e567a8976747eDaniel Dunbar
9167695fba30221613b7cf31276456217c41bb90960Daniel Dunbar  // -fdollars-in-identifiers default varies depending on platform and
9177695fba30221613b7cf31276456217c41bb90960Daniel Dunbar  // language; only pass if specified.
9181eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump  if (Arg *A = Args.getLastArg(options::OPT_fdollars_in_identifiers,
9197695fba30221613b7cf31276456217c41bb90960Daniel Dunbar                               options::OPT_fno_dollars_in_identifiers)) {
9207695fba30221613b7cf31276456217c41bb90960Daniel Dunbar    if (A->getOption().matches(options::OPT_fdollars_in_identifiers))
9217695fba30221613b7cf31276456217c41bb90960Daniel Dunbar      CmdArgs.push_back("-fdollars-in-identifiers=1");
9227695fba30221613b7cf31276456217c41bb90960Daniel Dunbar    else
9237695fba30221613b7cf31276456217c41bb90960Daniel Dunbar      CmdArgs.push_back("-fdollars-in-identifiers=0");
9247695fba30221613b7cf31276456217c41bb90960Daniel Dunbar  }
9257695fba30221613b7cf31276456217c41bb90960Daniel Dunbar
926e027a4b2399e9b0acfe0f77220c66bbe369067eeDaniel Dunbar  // -funit-at-a-time is default, and we don't support -fno-unit-at-a-time for
927e027a4b2399e9b0acfe0f77220c66bbe369067eeDaniel Dunbar  // practical purposes.
9281eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump  if (Arg *A = Args.getLastArg(options::OPT_funit_at_a_time,
929e027a4b2399e9b0acfe0f77220c66bbe369067eeDaniel Dunbar                               options::OPT_fno_unit_at_a_time)) {
930e027a4b2399e9b0acfe0f77220c66bbe369067eeDaniel Dunbar    if (A->getOption().matches(options::OPT_fno_unit_at_a_time))
931c37691068db5ceb19c014ddd3e02afa9875f8181Edward O'Callaghan      D.Diag(clang::diag::warn_drv_clang_unsupported) << A->getAsString(Args);
932e027a4b2399e9b0acfe0f77220c66bbe369067eeDaniel Dunbar  }
933ceb5c5b7f67a30fae305d1d19b478b623e4fbcedEli Friedman
9342ba91575905a54f712a7f64304e56002e4882499Daniel Dunbar  // Default to -fno-builtin-str{cat,cpy} on Darwin for ARM.
935f84a4a469d8a45c76cb941595582a0fd3b9b15d3Daniel Dunbar  //
936f84a4a469d8a45c76cb941595582a0fd3b9b15d3Daniel Dunbar  // FIXME: This is disabled until clang-cc supports -fno-builtin-foo. PR4941.
937f84a4a469d8a45c76cb941595582a0fd3b9b15d3Daniel Dunbar#if 0
9382ba91575905a54f712a7f64304e56002e4882499Daniel Dunbar  if (getToolChain().getTriple().getOS() == llvm::Triple::Darwin &&
9392ba91575905a54f712a7f64304e56002e4882499Daniel Dunbar      (getToolChain().getTriple().getArch() == llvm::Triple::arm ||
9402ba91575905a54f712a7f64304e56002e4882499Daniel Dunbar       getToolChain().getTriple().getArch() == llvm::Triple::thumb)) {
9412ba91575905a54f712a7f64304e56002e4882499Daniel Dunbar    if (!Args.hasArg(options::OPT_fbuiltin_strcat))
9422ba91575905a54f712a7f64304e56002e4882499Daniel Dunbar      CmdArgs.push_back("-fno-builtin-strcat");
9432ba91575905a54f712a7f64304e56002e4882499Daniel Dunbar    if (!Args.hasArg(options::OPT_fbuiltin_strcpy))
9442ba91575905a54f712a7f64304e56002e4882499Daniel Dunbar      CmdArgs.push_back("-fno-builtin-strcpy");
9452ba91575905a54f712a7f64304e56002e4882499Daniel Dunbar  }
946f84a4a469d8a45c76cb941595582a0fd3b9b15d3Daniel Dunbar#endif
9472ba91575905a54f712a7f64304e56002e4882499Daniel Dunbar
9481eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump  if (Arg *A = Args.getLastArg(options::OPT_traditional,
949ceb5c5b7f67a30fae305d1d19b478b623e4fbcedEli Friedman                               options::OPT_traditional_cpp))
950ceb5c5b7f67a30fae305d1d19b478b623e4fbcedEli Friedman    D.Diag(clang::diag::err_drv_clang_unsupported) << A->getAsString(Args);
951ceb5c5b7f67a30fae305d1d19b478b623e4fbcedEli Friedman
9521d46033f760ba5fd266ce59fe391fac473f04f52Daniel Dunbar  Args.AddLastArg(CmdArgs, options::OPT_dM);
953d82df3ad430397d7f9ef511e7c5157f997c41f53Chris Lattner  Args.AddLastArg(CmdArgs, options::OPT_dD);
9541d46033f760ba5fd266ce59fe391fac473f04f52Daniel Dunbar
9551d46033f760ba5fd266ce59fe391fac473f04f52Daniel Dunbar  Args.AddAllArgValues(CmdArgs, options::OPT_Xclang);
956e5280286573d4fe1220cdd66e147b572a05536a8Daniel Dunbar  Args.AddAllArgValues(CmdArgs, options::OPT_mllvm);
9571d46033f760ba5fd266ce59fe391fac473f04f52Daniel Dunbar
958cd8e4c44dd068956e9181381be3ee2d49a0fac52Daniel Dunbar  if (Output.getType() == types::TY_Dependencies) {
959cd8e4c44dd068956e9181381be3ee2d49a0fac52Daniel Dunbar    // Handled with other dependency code.
960a5a7bd0de7b6b80212095195a055a4a43f21d4b2Daniel Dunbar  } else if (Output.isPipe()) {
961b488c1dac8e53206f07103d794a62a3f5012c0f4Daniel Dunbar    CmdArgs.push_back("-o");
962b488c1dac8e53206f07103d794a62a3f5012c0f4Daniel Dunbar    CmdArgs.push_back("-");
963115a79277edababaf1b26e3654044ae983197679Daniel Dunbar  } else if (Output.isFilename()) {
964b488c1dac8e53206f07103d794a62a3f5012c0f4Daniel Dunbar    CmdArgs.push_back("-o");
965115a79277edababaf1b26e3654044ae983197679Daniel Dunbar    CmdArgs.push_back(Output.getFilename());
966115a79277edababaf1b26e3654044ae983197679Daniel Dunbar  } else {
967115a79277edababaf1b26e3654044ae983197679Daniel Dunbar    assert(Output.isNothing() && "Invalid output.");
968b488c1dac8e53206f07103d794a62a3f5012c0f4Daniel Dunbar  }
969b488c1dac8e53206f07103d794a62a3f5012c0f4Daniel Dunbar
9701d46033f760ba5fd266ce59fe391fac473f04f52Daniel Dunbar  for (InputInfoList::const_iterator
9711d46033f760ba5fd266ce59fe391fac473f04f52Daniel Dunbar         it = Inputs.begin(), ie = Inputs.end(); it != ie; ++it) {
9721d46033f760ba5fd266ce59fe391fac473f04f52Daniel Dunbar    const InputInfo &II = *it;
9731d46033f760ba5fd266ce59fe391fac473f04f52Daniel Dunbar    CmdArgs.push_back("-x");
9741d46033f760ba5fd266ce59fe391fac473f04f52Daniel Dunbar    CmdArgs.push_back(types::getTypeName(II.getType()));
9751d46033f760ba5fd266ce59fe391fac473f04f52Daniel Dunbar    if (II.isPipe())
9761d46033f760ba5fd266ce59fe391fac473f04f52Daniel Dunbar      CmdArgs.push_back("-");
977115a79277edababaf1b26e3654044ae983197679Daniel Dunbar    else if (II.isFilename())
978115a79277edababaf1b26e3654044ae983197679Daniel Dunbar      CmdArgs.push_back(II.getFilename());
9791d46033f760ba5fd266ce59fe391fac473f04f52Daniel Dunbar    else
980115a79277edababaf1b26e3654044ae983197679Daniel Dunbar      II.getInputArg().renderAsInput(Args, CmdArgs);
9811d46033f760ba5fd266ce59fe391fac473f04f52Daniel Dunbar  }
982c21c485b4fb58ef5d55cf3e523263dd824a2ace4Daniel Dunbar
983c21c485b4fb58ef5d55cf3e523263dd824a2ace4Daniel Dunbar  const char *Exec =
9845ed34f4c58b6ad4e21038d713c1fae31a6146ff5Daniel Dunbar    Args.MakeArgString(getToolChain().GetProgramPath(C, "clang-cc"));
985cae087e164e94e4286c11bf694dd0ff88f295302Daniel Dunbar  Dest.addCommand(new Command(JA, Exec, CmdArgs));
986a880db0b0fc028abf754c290d921d809eec0518aDaniel Dunbar
9875c1aaafbd6dd25a99ca1960e1c3c98aeefe9d728Daniel Dunbar  // Explicitly warn that these options are unsupported, even though
9885c1aaafbd6dd25a99ca1960e1c3c98aeefe9d728Daniel Dunbar  // we are allowing compilation to continue.
9895c1aaafbd6dd25a99ca1960e1c3c98aeefe9d728Daniel Dunbar  // FIXME: Use iterator.
990c21c485b4fb58ef5d55cf3e523263dd824a2ace4Daniel Dunbar  for (ArgList::const_iterator
9915c1aaafbd6dd25a99ca1960e1c3c98aeefe9d728Daniel Dunbar         it = Args.begin(), ie = Args.end(); it != ie; ++it) {
9925c1aaafbd6dd25a99ca1960e1c3c98aeefe9d728Daniel Dunbar    const Arg *A = *it;
9935c1aaafbd6dd25a99ca1960e1c3c98aeefe9d728Daniel Dunbar    if (A->getOption().matches(options::OPT_pg)) {
9945c1aaafbd6dd25a99ca1960e1c3c98aeefe9d728Daniel Dunbar      A->claim();
995c21c485b4fb58ef5d55cf3e523263dd824a2ace4Daniel Dunbar      D.Diag(clang::diag::warn_drv_clang_unsupported)
9965c1aaafbd6dd25a99ca1960e1c3c98aeefe9d728Daniel Dunbar        << A->getAsString(Args);
9975c1aaafbd6dd25a99ca1960e1c3c98aeefe9d728Daniel Dunbar    }
9985c1aaafbd6dd25a99ca1960e1c3c98aeefe9d728Daniel Dunbar  }
9995c1aaafbd6dd25a99ca1960e1c3c98aeefe9d728Daniel Dunbar
100068fb469aeb19144403e703b825854d08353c8eeaDaniel Dunbar  // Claim some arguments which clang supports automatically.
100168fb469aeb19144403e703b825854d08353c8eeaDaniel Dunbar
100268fb469aeb19144403e703b825854d08353c8eeaDaniel Dunbar  // -fpch-preprocess is used with gcc to add a special marker in the
100368fb469aeb19144403e703b825854d08353c8eeaDaniel Dunbar  // -output to include the PCH file. Clang's PTH solution is
100468fb469aeb19144403e703b825854d08353c8eeaDaniel Dunbar  // -completely transparent, so we do not need to deal with it at
100568fb469aeb19144403e703b825854d08353c8eeaDaniel Dunbar  // -all.
100668fb469aeb19144403e703b825854d08353c8eeaDaniel Dunbar  Args.ClaimAllArgs(options::OPT_fpch_preprocess);
1007c21c485b4fb58ef5d55cf3e523263dd824a2ace4Daniel Dunbar
1008a880db0b0fc028abf754c290d921d809eec0518aDaniel Dunbar  // Claim some arguments which clang doesn't support, but we don't
1009a880db0b0fc028abf754c290d921d809eec0518aDaniel Dunbar  // care to warn the user about.
1010c21c485b4fb58ef5d55cf3e523263dd824a2ace4Daniel Dunbar
1011a880db0b0fc028abf754c290d921d809eec0518aDaniel Dunbar  // FIXME: Use iterator.
1012c21c485b4fb58ef5d55cf3e523263dd824a2ace4Daniel Dunbar  for (ArgList::const_iterator
1013a880db0b0fc028abf754c290d921d809eec0518aDaniel Dunbar         it = Args.begin(), ie = Args.end(); it != ie; ++it) {
1014a880db0b0fc028abf754c290d921d809eec0518aDaniel Dunbar    const Arg *A = *it;
101506ef3c3e9be4923b8e29c8e267b0c56afaa14ff3Daniel Dunbar    if (A->getOption().matches(options::OPT_clang_ignored_f_Group) ||
101616fd3a9f5159b74bfdd65cf290b4bd091088de91Daniel Dunbar        A->getOption().matches(options::OPT_clang_ignored_m_Group))
1017a880db0b0fc028abf754c290d921d809eec0518aDaniel Dunbar      A->claim();
1018a880db0b0fc028abf754c290d921d809eec0518aDaniel Dunbar  }
101947ac7d27c44bd64a7d0fc03d4babc196cf2b8230Daniel Dunbar}
102047ac7d27c44bd64a7d0fc03d4babc196cf2b8230Daniel Dunbar
1021b488c1dac8e53206f07103d794a62a3f5012c0f4Daniel Dunbarvoid gcc::Common::ConstructJob(Compilation &C, const JobAction &JA,
1022b488c1dac8e53206f07103d794a62a3f5012c0f4Daniel Dunbar                               Job &Dest,
1023b488c1dac8e53206f07103d794a62a3f5012c0f4Daniel Dunbar                               const InputInfo &Output,
1024b488c1dac8e53206f07103d794a62a3f5012c0f4Daniel Dunbar                               const InputInfoList &Inputs,
10251d46033f760ba5fd266ce59fe391fac473f04f52Daniel Dunbar                               const ArgList &Args,
1026b488c1dac8e53206f07103d794a62a3f5012c0f4Daniel Dunbar                               const char *LinkingOutput) const {
1027a8304f67291b0182fb64f3afc621615288dd1d31Daniel Dunbar  const Driver &D = getToolChain().getHost().getDriver();
1028b488c1dac8e53206f07103d794a62a3f5012c0f4Daniel Dunbar  ArgStringList CmdArgs;
1029b488c1dac8e53206f07103d794a62a3f5012c0f4Daniel Dunbar
1030c21c485b4fb58ef5d55cf3e523263dd824a2ace4Daniel Dunbar  for (ArgList::const_iterator
10311d46033f760ba5fd266ce59fe391fac473f04f52Daniel Dunbar         it = Args.begin(), ie = Args.end(); it != ie; ++it) {
1032b488c1dac8e53206f07103d794a62a3f5012c0f4Daniel Dunbar    Arg *A = *it;
10337587719c40ebf02bf11e5e66c30bd20e98edebc2Daniel Dunbar    if (A->getOption().hasForwardToGCC()) {
10347587719c40ebf02bf11e5e66c30bd20e98edebc2Daniel Dunbar      // It is unfortunate that we have to claim here, as this means
10357587719c40ebf02bf11e5e66c30bd20e98edebc2Daniel Dunbar      // we will basically never report anything interesting for
10366ecc7a993f939c5255c36c7c0d965fb9c1543f2aDaniel Dunbar      // platforms using a generic gcc, even if we are just using gcc
10376ecc7a993f939c5255c36c7c0d965fb9c1543f2aDaniel Dunbar      // to get to the assembler.
10387587719c40ebf02bf11e5e66c30bd20e98edebc2Daniel Dunbar      A->claim();
10391d46033f760ba5fd266ce59fe391fac473f04f52Daniel Dunbar      A->render(Args, CmdArgs);
10407587719c40ebf02bf11e5e66c30bd20e98edebc2Daniel Dunbar    }
1041b488c1dac8e53206f07103d794a62a3f5012c0f4Daniel Dunbar  }
1042c21c485b4fb58ef5d55cf3e523263dd824a2ace4Daniel Dunbar
1043b488c1dac8e53206f07103d794a62a3f5012c0f4Daniel Dunbar  RenderExtraToolArgs(CmdArgs);
1044b488c1dac8e53206f07103d794a62a3f5012c0f4Daniel Dunbar
1045b488c1dac8e53206f07103d794a62a3f5012c0f4Daniel Dunbar  // If using a driver driver, force the arch.
10467cfe31a713d8fcfc2a1328e8fbd8efdeb0aec51bDaniel Dunbar  const std::string &Arch = getToolChain().getArchName();
1047b488c1dac8e53206f07103d794a62a3f5012c0f4Daniel Dunbar  if (getToolChain().getHost().useDriverDriver()) {
1048b488c1dac8e53206f07103d794a62a3f5012c0f4Daniel Dunbar    CmdArgs.push_back("-arch");
1049bf54a06f9b771c2a2730cc63eb89bce0522515b5Daniel Dunbar
1050bf54a06f9b771c2a2730cc63eb89bce0522515b5Daniel Dunbar    // FIXME: Remove these special cases.
10517cfe31a713d8fcfc2a1328e8fbd8efdeb0aec51bDaniel Dunbar    if (Arch == "powerpc")
10527cfe31a713d8fcfc2a1328e8fbd8efdeb0aec51bDaniel Dunbar      CmdArgs.push_back("ppc");
10537cfe31a713d8fcfc2a1328e8fbd8efdeb0aec51bDaniel Dunbar    else if (Arch == "powerpc64")
10547cfe31a713d8fcfc2a1328e8fbd8efdeb0aec51bDaniel Dunbar      CmdArgs.push_back("ppc64");
10557cfe31a713d8fcfc2a1328e8fbd8efdeb0aec51bDaniel Dunbar    else
1056881376467c46c5c6cc16fa6790271c2c22e1d4f1Daniel Dunbar      CmdArgs.push_back(Args.MakeArgString(Arch));
1057b488c1dac8e53206f07103d794a62a3f5012c0f4Daniel Dunbar  }
1058b488c1dac8e53206f07103d794a62a3f5012c0f4Daniel Dunbar
10596ecc7a993f939c5255c36c7c0d965fb9c1543f2aDaniel Dunbar  // Try to force gcc to match the tool chain we want, if we recognize
10606ecc7a993f939c5255c36c7c0d965fb9c1543f2aDaniel Dunbar  // the arch.
10617cfe31a713d8fcfc2a1328e8fbd8efdeb0aec51bDaniel Dunbar  //
10627cfe31a713d8fcfc2a1328e8fbd8efdeb0aec51bDaniel Dunbar  // FIXME: The triple class should directly provide the information we want
10637cfe31a713d8fcfc2a1328e8fbd8efdeb0aec51bDaniel Dunbar  // here.
10647cfe31a713d8fcfc2a1328e8fbd8efdeb0aec51bDaniel Dunbar  if (Arch == "i386" || Arch == "powerpc")
10656ecc7a993f939c5255c36c7c0d965fb9c1543f2aDaniel Dunbar    CmdArgs.push_back("-m32");
10667cfe31a713d8fcfc2a1328e8fbd8efdeb0aec51bDaniel Dunbar  else if (Arch == "x86_64" || Arch == "powerpc64")
10676ecc7a993f939c5255c36c7c0d965fb9c1543f2aDaniel Dunbar    CmdArgs.push_back("-m64");
10686ecc7a993f939c5255c36c7c0d965fb9c1543f2aDaniel Dunbar
1069b488c1dac8e53206f07103d794a62a3f5012c0f4Daniel Dunbar  if (Output.isPipe()) {
1070b488c1dac8e53206f07103d794a62a3f5012c0f4Daniel Dunbar    CmdArgs.push_back("-o");
1071b488c1dac8e53206f07103d794a62a3f5012c0f4Daniel Dunbar    CmdArgs.push_back("-");
1072115a79277edababaf1b26e3654044ae983197679Daniel Dunbar  } else if (Output.isFilename()) {
1073b488c1dac8e53206f07103d794a62a3f5012c0f4Daniel Dunbar    CmdArgs.push_back("-o");
1074115a79277edababaf1b26e3654044ae983197679Daniel Dunbar    CmdArgs.push_back(Output.getFilename());
1075115a79277edababaf1b26e3654044ae983197679Daniel Dunbar  } else {
1076115a79277edababaf1b26e3654044ae983197679Daniel Dunbar    assert(Output.isNothing() && "Unexpected output");
1077b488c1dac8e53206f07103d794a62a3f5012c0f4Daniel Dunbar    CmdArgs.push_back("-fsyntax-only");
1078115a79277edababaf1b26e3654044ae983197679Daniel Dunbar  }
1079b488c1dac8e53206f07103d794a62a3f5012c0f4Daniel Dunbar
1080b488c1dac8e53206f07103d794a62a3f5012c0f4Daniel Dunbar
1081b488c1dac8e53206f07103d794a62a3f5012c0f4Daniel Dunbar  // Only pass -x if gcc will understand it; otherwise hope gcc
1082b488c1dac8e53206f07103d794a62a3f5012c0f4Daniel Dunbar  // understands the suffix correctly. The main use case this would go
1083b488c1dac8e53206f07103d794a62a3f5012c0f4Daniel Dunbar  // wrong in is for linker inputs if they happened to have an odd
1084b488c1dac8e53206f07103d794a62a3f5012c0f4Daniel Dunbar  // suffix; really the only way to get this to happen is a command
1085b488c1dac8e53206f07103d794a62a3f5012c0f4Daniel Dunbar  // like '-x foobar a.c' which will treat a.c like a linker input.
1086b488c1dac8e53206f07103d794a62a3f5012c0f4Daniel Dunbar  //
1087b488c1dac8e53206f07103d794a62a3f5012c0f4Daniel Dunbar  // FIXME: For the linker case specifically, can we safely convert
1088b488c1dac8e53206f07103d794a62a3f5012c0f4Daniel Dunbar  // inputs into '-Wl,' options?
1089b488c1dac8e53206f07103d794a62a3f5012c0f4Daniel Dunbar  for (InputInfoList::const_iterator
1090b488c1dac8e53206f07103d794a62a3f5012c0f4Daniel Dunbar         it = Inputs.begin(), ie = Inputs.end(); it != ie; ++it) {
1091b488c1dac8e53206f07103d794a62a3f5012c0f4Daniel Dunbar    const InputInfo &II = *it;
1092a8304f67291b0182fb64f3afc621615288dd1d31Daniel Dunbar
10935915fbf310e171c4cd3c2af05e9de360c0fa988aDaniel Dunbar    // Don't try to pass LLVM or AST inputs to a generic gcc.
1094a8304f67291b0182fb64f3afc621615288dd1d31Daniel Dunbar    if (II.getType() == types::TY_LLVMBC)
1095a8304f67291b0182fb64f3afc621615288dd1d31Daniel Dunbar      D.Diag(clang::diag::err_drv_no_linker_llvm_support)
1096881376467c46c5c6cc16fa6790271c2c22e1d4f1Daniel Dunbar        << getToolChain().getTripleString();
10975915fbf310e171c4cd3c2af05e9de360c0fa988aDaniel Dunbar    else if (II.getType() == types::TY_AST)
10985915fbf310e171c4cd3c2af05e9de360c0fa988aDaniel Dunbar      D.Diag(clang::diag::err_drv_no_ast_support)
1099881376467c46c5c6cc16fa6790271c2c22e1d4f1Daniel Dunbar        << getToolChain().getTripleString();
1100a8304f67291b0182fb64f3afc621615288dd1d31Daniel Dunbar
1101b488c1dac8e53206f07103d794a62a3f5012c0f4Daniel Dunbar    if (types::canTypeBeUserSpecified(II.getType())) {
1102b488c1dac8e53206f07103d794a62a3f5012c0f4Daniel Dunbar      CmdArgs.push_back("-x");
1103b488c1dac8e53206f07103d794a62a3f5012c0f4Daniel Dunbar      CmdArgs.push_back(types::getTypeName(II.getType()));
1104b488c1dac8e53206f07103d794a62a3f5012c0f4Daniel Dunbar    }
1105b488c1dac8e53206f07103d794a62a3f5012c0f4Daniel Dunbar
1106b488c1dac8e53206f07103d794a62a3f5012c0f4Daniel Dunbar    if (II.isPipe())
1107b488c1dac8e53206f07103d794a62a3f5012c0f4Daniel Dunbar      CmdArgs.push_back("-");
1108115a79277edababaf1b26e3654044ae983197679Daniel Dunbar    else if (II.isFilename())
1109115a79277edababaf1b26e3654044ae983197679Daniel Dunbar      CmdArgs.push_back(II.getFilename());
1110b488c1dac8e53206f07103d794a62a3f5012c0f4Daniel Dunbar    else
1111115a79277edababaf1b26e3654044ae983197679Daniel Dunbar      // Don't render as input, we need gcc to do the translations.
1112115a79277edababaf1b26e3654044ae983197679Daniel Dunbar      II.getInputArg().render(Args, CmdArgs);
1113b488c1dac8e53206f07103d794a62a3f5012c0f4Daniel Dunbar  }
1114b488c1dac8e53206f07103d794a62a3f5012c0f4Daniel Dunbar
1115c21c485b4fb58ef5d55cf3e523263dd824a2ace4Daniel Dunbar  const char *GCCName =
111678d8a089c8f124ba6f47bb37e2c4a36986f60e23Daniel Dunbar    getToolChain().getHost().getDriver().CCCGenericGCCName.c_str();
1117c21c485b4fb58ef5d55cf3e523263dd824a2ace4Daniel Dunbar  const char *Exec =
11185ed34f4c58b6ad4e21038d713c1fae31a6146ff5Daniel Dunbar    Args.MakeArgString(getToolChain().GetProgramPath(C, GCCName));
1119cae087e164e94e4286c11bf694dd0ff88f295302Daniel Dunbar  Dest.addCommand(new Command(JA, Exec, CmdArgs));
112047ac7d27c44bd64a7d0fc03d4babc196cf2b8230Daniel Dunbar}
112147ac7d27c44bd64a7d0fc03d4babc196cf2b8230Daniel Dunbar
1122b488c1dac8e53206f07103d794a62a3f5012c0f4Daniel Dunbarvoid gcc::Preprocess::RenderExtraToolArgs(ArgStringList &CmdArgs) const {
1123b488c1dac8e53206f07103d794a62a3f5012c0f4Daniel Dunbar  CmdArgs.push_back("-E");
112447ac7d27c44bd64a7d0fc03d4babc196cf2b8230Daniel Dunbar}
112547ac7d27c44bd64a7d0fc03d4babc196cf2b8230Daniel Dunbar
1126b488c1dac8e53206f07103d794a62a3f5012c0f4Daniel Dunbarvoid gcc::Precompile::RenderExtraToolArgs(ArgStringList &CmdArgs) const {
1127b488c1dac8e53206f07103d794a62a3f5012c0f4Daniel Dunbar  // The type is good enough.
112847ac7d27c44bd64a7d0fc03d4babc196cf2b8230Daniel Dunbar}
112947ac7d27c44bd64a7d0fc03d4babc196cf2b8230Daniel Dunbar
1130b488c1dac8e53206f07103d794a62a3f5012c0f4Daniel Dunbarvoid gcc::Compile::RenderExtraToolArgs(ArgStringList &CmdArgs) const {
1131b488c1dac8e53206f07103d794a62a3f5012c0f4Daniel Dunbar  CmdArgs.push_back("-S");
113247ac7d27c44bd64a7d0fc03d4babc196cf2b8230Daniel Dunbar}
113347ac7d27c44bd64a7d0fc03d4babc196cf2b8230Daniel Dunbar
1134b488c1dac8e53206f07103d794a62a3f5012c0f4Daniel Dunbarvoid gcc::Assemble::RenderExtraToolArgs(ArgStringList &CmdArgs) const {
1135b488c1dac8e53206f07103d794a62a3f5012c0f4Daniel Dunbar  CmdArgs.push_back("-c");
1136b488c1dac8e53206f07103d794a62a3f5012c0f4Daniel Dunbar}
113747ac7d27c44bd64a7d0fc03d4babc196cf2b8230Daniel Dunbar
1138b488c1dac8e53206f07103d794a62a3f5012c0f4Daniel Dunbarvoid gcc::Link::RenderExtraToolArgs(ArgStringList &CmdArgs) const {
1139b488c1dac8e53206f07103d794a62a3f5012c0f4Daniel Dunbar  // The types are (hopefully) good enough.
114047ac7d27c44bd64a7d0fc03d4babc196cf2b8230Daniel Dunbar}
1141b488c1dac8e53206f07103d794a62a3f5012c0f4Daniel Dunbar
114240f1265ebd42ece3e7f7917319b56012e8e2bce2Daniel Dunbarconst char *darwin::CC1::getCC1Name(types::ID Type) const {
114340f1265ebd42ece3e7f7917319b56012e8e2bce2Daniel Dunbar  switch (Type) {
114440f1265ebd42ece3e7f7917319b56012e8e2bce2Daniel Dunbar  default:
114540f1265ebd42ece3e7f7917319b56012e8e2bce2Daniel Dunbar    assert(0 && "Unexpected type for Darwin CC1 tool.");
114640f1265ebd42ece3e7f7917319b56012e8e2bce2Daniel Dunbar  case types::TY_Asm:
114740f1265ebd42ece3e7f7917319b56012e8e2bce2Daniel Dunbar  case types::TY_C: case types::TY_CHeader:
114840f1265ebd42ece3e7f7917319b56012e8e2bce2Daniel Dunbar  case types::TY_PP_C: case types::TY_PP_CHeader:
114940f1265ebd42ece3e7f7917319b56012e8e2bce2Daniel Dunbar    return "cc1";
115040f1265ebd42ece3e7f7917319b56012e8e2bce2Daniel Dunbar  case types::TY_ObjC: case types::TY_ObjCHeader:
115140f1265ebd42ece3e7f7917319b56012e8e2bce2Daniel Dunbar  case types::TY_PP_ObjC: case types::TY_PP_ObjCHeader:
115240f1265ebd42ece3e7f7917319b56012e8e2bce2Daniel Dunbar    return "cc1obj";
115340f1265ebd42ece3e7f7917319b56012e8e2bce2Daniel Dunbar  case types::TY_CXX: case types::TY_CXXHeader:
115440f1265ebd42ece3e7f7917319b56012e8e2bce2Daniel Dunbar  case types::TY_PP_CXX: case types::TY_PP_CXXHeader:
115540f1265ebd42ece3e7f7917319b56012e8e2bce2Daniel Dunbar    return "cc1plus";
115640f1265ebd42ece3e7f7917319b56012e8e2bce2Daniel Dunbar  case types::TY_ObjCXX: case types::TY_ObjCXXHeader:
115740f1265ebd42ece3e7f7917319b56012e8e2bce2Daniel Dunbar  case types::TY_PP_ObjCXX: case types::TY_PP_ObjCXXHeader:
115840f1265ebd42ece3e7f7917319b56012e8e2bce2Daniel Dunbar    return "cc1objplus";
115940f1265ebd42ece3e7f7917319b56012e8e2bce2Daniel Dunbar  }
116040f1265ebd42ece3e7f7917319b56012e8e2bce2Daniel Dunbar}
116140f1265ebd42ece3e7f7917319b56012e8e2bce2Daniel Dunbar
1162c21c485b4fb58ef5d55cf3e523263dd824a2ace4Daniel Dunbarconst char *darwin::CC1::getBaseInputName(const ArgList &Args,
1163a5a7bd0de7b6b80212095195a055a4a43f21d4b2Daniel Dunbar                                          const InputInfoList &Inputs) {
1164a3ec60e0cf2a1916f479288998d31bd980b1a306Daniel Dunbar  llvm::sys::Path P(Inputs[0].getBaseInput());
1165881376467c46c5c6cc16fa6790271c2c22e1d4f1Daniel Dunbar  return Args.MakeArgString(P.getLast());
1166a3ec60e0cf2a1916f479288998d31bd980b1a306Daniel Dunbar}
1167a3ec60e0cf2a1916f479288998d31bd980b1a306Daniel Dunbar
1168c21c485b4fb58ef5d55cf3e523263dd824a2ace4Daniel Dunbarconst char *darwin::CC1::getBaseInputStem(const ArgList &Args,
1169a5a7bd0de7b6b80212095195a055a4a43f21d4b2Daniel Dunbar                                          const InputInfoList &Inputs) {
1170a3ec60e0cf2a1916f479288998d31bd980b1a306Daniel Dunbar  const char *Str = getBaseInputName(Args, Inputs);
1171a3ec60e0cf2a1916f479288998d31bd980b1a306Daniel Dunbar
1172a3ec60e0cf2a1916f479288998d31bd980b1a306Daniel Dunbar  if (const char *End = strchr(Str, '.'))
1173881376467c46c5c6cc16fa6790271c2c22e1d4f1Daniel Dunbar    return Args.MakeArgString(std::string(Str, End));
1174a3ec60e0cf2a1916f479288998d31bd980b1a306Daniel Dunbar
1175a3ec60e0cf2a1916f479288998d31bd980b1a306Daniel Dunbar  return Str;
1176a3ec60e0cf2a1916f479288998d31bd980b1a306Daniel Dunbar}
1177a3ec60e0cf2a1916f479288998d31bd980b1a306Daniel Dunbar
1178a3ec60e0cf2a1916f479288998d31bd980b1a306Daniel Dunbarconst char *
1179c21c485b4fb58ef5d55cf3e523263dd824a2ace4Daniel Dunbardarwin::CC1::getDependencyFileName(const ArgList &Args,
1180a5a7bd0de7b6b80212095195a055a4a43f21d4b2Daniel Dunbar                                   const InputInfoList &Inputs) {
1181a3ec60e0cf2a1916f479288998d31bd980b1a306Daniel Dunbar  // FIXME: Think about this more.
1182a3ec60e0cf2a1916f479288998d31bd980b1a306Daniel Dunbar  std::string Res;
1183a3ec60e0cf2a1916f479288998d31bd980b1a306Daniel Dunbar
1184a3ec60e0cf2a1916f479288998d31bd980b1a306Daniel Dunbar  if (Arg *OutputOpt = Args.getLastArg(options::OPT_o)) {
1185a3ec60e0cf2a1916f479288998d31bd980b1a306Daniel Dunbar    std::string Str(OutputOpt->getValue(Args));
1186c21c485b4fb58ef5d55cf3e523263dd824a2ace4Daniel Dunbar
1187a3ec60e0cf2a1916f479288998d31bd980b1a306Daniel Dunbar    Res = Str.substr(0, Str.rfind('.'));
1188a3ec60e0cf2a1916f479288998d31bd980b1a306Daniel Dunbar  } else
1189a5a7bd0de7b6b80212095195a055a4a43f21d4b2Daniel Dunbar    Res = darwin::CC1::getBaseInputStem(Args, Inputs);
1190a3ec60e0cf2a1916f479288998d31bd980b1a306Daniel Dunbar
1191881376467c46c5c6cc16fa6790271c2c22e1d4f1Daniel Dunbar  return Args.MakeArgString(Res + ".d");
1192a3ec60e0cf2a1916f479288998d31bd980b1a306Daniel Dunbar}
1193a3ec60e0cf2a1916f479288998d31bd980b1a306Daniel Dunbar
1194c21c485b4fb58ef5d55cf3e523263dd824a2ace4Daniel Dunbarvoid darwin::CC1::AddCC1Args(const ArgList &Args,
1195a3ec60e0cf2a1916f479288998d31bd980b1a306Daniel Dunbar                             ArgStringList &CmdArgs) const {
1196e2fd66418eca3d70cf6b62087d745d0c5181db69Daniel Dunbar  const Driver &D = getToolChain().getHost().getDriver();
1197e2fd66418eca3d70cf6b62087d745d0c5181db69Daniel Dunbar
1198e2fd66418eca3d70cf6b62087d745d0c5181db69Daniel Dunbar  CheckCodeGenerationOptions(D, Args);
1199e2fd66418eca3d70cf6b62087d745d0c5181db69Daniel Dunbar
1200a3ec60e0cf2a1916f479288998d31bd980b1a306Daniel Dunbar  // Derived from cc1 spec.
1201a3ec60e0cf2a1916f479288998d31bd980b1a306Daniel Dunbar  if (!Args.hasArg(options::OPT_mkernel) && !Args.hasArg(options::OPT_static) &&
1202a3ec60e0cf2a1916f479288998d31bd980b1a306Daniel Dunbar      !Args.hasArg(options::OPT_mdynamic_no_pic))
1203a3ec60e0cf2a1916f479288998d31bd980b1a306Daniel Dunbar    CmdArgs.push_back("-fPIC");
1204a3ec60e0cf2a1916f479288998d31bd980b1a306Daniel Dunbar
12052ba91575905a54f712a7f64304e56002e4882499Daniel Dunbar  if (getToolChain().getTriple().getArch() == llvm::Triple::arm ||
12062ba91575905a54f712a7f64304e56002e4882499Daniel Dunbar      getToolChain().getTriple().getArch() == llvm::Triple::thumb) {
12072ba91575905a54f712a7f64304e56002e4882499Daniel Dunbar    if (!Args.hasArg(options::OPT_fbuiltin_strcat))
12082ba91575905a54f712a7f64304e56002e4882499Daniel Dunbar      CmdArgs.push_back("-fno-builtin-strcat");
12092ba91575905a54f712a7f64304e56002e4882499Daniel Dunbar    if (!Args.hasArg(options::OPT_fbuiltin_strcpy))
12102ba91575905a54f712a7f64304e56002e4882499Daniel Dunbar      CmdArgs.push_back("-fno-builtin-strcpy");
12112ba91575905a54f712a7f64304e56002e4882499Daniel Dunbar  }
12122ba91575905a54f712a7f64304e56002e4882499Daniel Dunbar
1213a3ec60e0cf2a1916f479288998d31bd980b1a306Daniel Dunbar  // gcc has some code here to deal with when no -mmacosx-version-min
1214a3ec60e0cf2a1916f479288998d31bd980b1a306Daniel Dunbar  // and no -miphoneos-version-min is present, but this never happens
1215a3ec60e0cf2a1916f479288998d31bd980b1a306Daniel Dunbar  // due to tool chain specific argument translation.
1216a3ec60e0cf2a1916f479288998d31bd980b1a306Daniel Dunbar
1217a3ec60e0cf2a1916f479288998d31bd980b1a306Daniel Dunbar  if (Args.hasArg(options::OPT_g_Flag) &&
1218a3ec60e0cf2a1916f479288998d31bd980b1a306Daniel Dunbar      !Args.hasArg(options::OPT_fno_eliminate_unused_debug_symbols))
1219a3ec60e0cf2a1916f479288998d31bd980b1a306Daniel Dunbar    CmdArgs.push_back("-feliminate-unused-debug-symbols");
1220a3ec60e0cf2a1916f479288998d31bd980b1a306Daniel Dunbar}
1221a3ec60e0cf2a1916f479288998d31bd980b1a306Daniel Dunbar
1222a3ec60e0cf2a1916f479288998d31bd980b1a306Daniel Dunbarvoid darwin::CC1::AddCC1OptionsArgs(const ArgList &Args, ArgStringList &CmdArgs,
1223a3ec60e0cf2a1916f479288998d31bd980b1a306Daniel Dunbar                                    const InputInfoList &Inputs,
1224a3ec60e0cf2a1916f479288998d31bd980b1a306Daniel Dunbar                                    const ArgStringList &OutputArgs) const {
1225a3ec60e0cf2a1916f479288998d31bd980b1a306Daniel Dunbar  const Driver &D = getToolChain().getHost().getDriver();
1226a3ec60e0cf2a1916f479288998d31bd980b1a306Daniel Dunbar
1227a3ec60e0cf2a1916f479288998d31bd980b1a306Daniel Dunbar  // Derived from cc1_options spec.
1228a3ec60e0cf2a1916f479288998d31bd980b1a306Daniel Dunbar  if (Args.hasArg(options::OPT_fast) ||
1229a3ec60e0cf2a1916f479288998d31bd980b1a306Daniel Dunbar      Args.hasArg(options::OPT_fastf) ||
1230a3ec60e0cf2a1916f479288998d31bd980b1a306Daniel Dunbar      Args.hasArg(options::OPT_fastcp))
1231a3ec60e0cf2a1916f479288998d31bd980b1a306Daniel Dunbar    CmdArgs.push_back("-O3");
1232c21c485b4fb58ef5d55cf3e523263dd824a2ace4Daniel Dunbar
1233a3ec60e0cf2a1916f479288998d31bd980b1a306Daniel Dunbar  if (Arg *A = Args.getLastArg(options::OPT_pg))
1234a3ec60e0cf2a1916f479288998d31bd980b1a306Daniel Dunbar    if (Args.hasArg(options::OPT_fomit_frame_pointer))
1235a3ec60e0cf2a1916f479288998d31bd980b1a306Daniel Dunbar      D.Diag(clang::diag::err_drv_argument_not_allowed_with)
1236a3ec60e0cf2a1916f479288998d31bd980b1a306Daniel Dunbar        << A->getAsString(Args) << "-fomit-frame-pointer";
1237a3ec60e0cf2a1916f479288998d31bd980b1a306Daniel Dunbar
1238a3ec60e0cf2a1916f479288998d31bd980b1a306Daniel Dunbar  AddCC1Args(Args, CmdArgs);
1239a3ec60e0cf2a1916f479288998d31bd980b1a306Daniel Dunbar
1240a3ec60e0cf2a1916f479288998d31bd980b1a306Daniel Dunbar  if (!Args.hasArg(options::OPT_Q))
1241a3ec60e0cf2a1916f479288998d31bd980b1a306Daniel Dunbar    CmdArgs.push_back("-quiet");
1242a3ec60e0cf2a1916f479288998d31bd980b1a306Daniel Dunbar
1243a3ec60e0cf2a1916f479288998d31bd980b1a306Daniel Dunbar  CmdArgs.push_back("-dumpbase");
1244a5a7bd0de7b6b80212095195a055a4a43f21d4b2Daniel Dunbar  CmdArgs.push_back(darwin::CC1::getBaseInputName(Args, Inputs));
1245a3ec60e0cf2a1916f479288998d31bd980b1a306Daniel Dunbar
1246a3ec60e0cf2a1916f479288998d31bd980b1a306Daniel Dunbar  Args.AddAllArgs(CmdArgs, options::OPT_d_Group);
1247a3ec60e0cf2a1916f479288998d31bd980b1a306Daniel Dunbar
1248a3ec60e0cf2a1916f479288998d31bd980b1a306Daniel Dunbar  Args.AddAllArgs(CmdArgs, options::OPT_m_Group);
1249a3ec60e0cf2a1916f479288998d31bd980b1a306Daniel Dunbar  Args.AddAllArgs(CmdArgs, options::OPT_a_Group);
1250a3ec60e0cf2a1916f479288998d31bd980b1a306Daniel Dunbar
1251a3ec60e0cf2a1916f479288998d31bd980b1a306Daniel Dunbar  // FIXME: The goal is to use the user provided -o if that is our
1252a3ec60e0cf2a1916f479288998d31bd980b1a306Daniel Dunbar  // final output, otherwise to drive from the original input
1253a3ec60e0cf2a1916f479288998d31bd980b1a306Daniel Dunbar  // name. Find a clean way to go about this.
1254a3ec60e0cf2a1916f479288998d31bd980b1a306Daniel Dunbar  if ((Args.hasArg(options::OPT_c) || Args.hasArg(options::OPT_S)) &&
1255a3ec60e0cf2a1916f479288998d31bd980b1a306Daniel Dunbar      Args.hasArg(options::OPT_o)) {
1256a3ec60e0cf2a1916f479288998d31bd980b1a306Daniel Dunbar    Arg *OutputOpt = Args.getLastArg(options::OPT_o);
1257a3ec60e0cf2a1916f479288998d31bd980b1a306Daniel Dunbar    CmdArgs.push_back("-auxbase-strip");
1258a3ec60e0cf2a1916f479288998d31bd980b1a306Daniel Dunbar    CmdArgs.push_back(OutputOpt->getValue(Args));
1259a3ec60e0cf2a1916f479288998d31bd980b1a306Daniel Dunbar  } else {
1260a3ec60e0cf2a1916f479288998d31bd980b1a306Daniel Dunbar    CmdArgs.push_back("-auxbase");
1261a5a7bd0de7b6b80212095195a055a4a43f21d4b2Daniel Dunbar    CmdArgs.push_back(darwin::CC1::getBaseInputStem(Args, Inputs));
1262a3ec60e0cf2a1916f479288998d31bd980b1a306Daniel Dunbar  }
1263a3ec60e0cf2a1916f479288998d31bd980b1a306Daniel Dunbar
1264a3ec60e0cf2a1916f479288998d31bd980b1a306Daniel Dunbar  Args.AddAllArgs(CmdArgs, options::OPT_g_Group);
1265a3ec60e0cf2a1916f479288998d31bd980b1a306Daniel Dunbar
1266a3ec60e0cf2a1916f479288998d31bd980b1a306Daniel Dunbar  Args.AddAllArgs(CmdArgs, options::OPT_O);
1267a3ec60e0cf2a1916f479288998d31bd980b1a306Daniel Dunbar  // FIXME: -Wall is getting some special treatment. Investigate.
1268a3ec60e0cf2a1916f479288998d31bd980b1a306Daniel Dunbar  Args.AddAllArgs(CmdArgs, options::OPT_W_Group, options::OPT_pedantic_Group);
1269a3ec60e0cf2a1916f479288998d31bd980b1a306Daniel Dunbar  Args.AddLastArg(CmdArgs, options::OPT_w);
1270c21c485b4fb58ef5d55cf3e523263dd824a2ace4Daniel Dunbar  Args.AddAllArgs(CmdArgs, options::OPT_std_EQ, options::OPT_ansi,
1271a3ec60e0cf2a1916f479288998d31bd980b1a306Daniel Dunbar                  options::OPT_trigraphs);
1272a3ff202ee4fb21728e930d5d029ba4925129912cDaniel Dunbar  if (!Args.getLastArg(options::OPT_std_EQ, options::OPT_ansi)) {
1273a3ff202ee4fb21728e930d5d029ba4925129912cDaniel Dunbar    // Honor -std-default.
1274a3ff202ee4fb21728e930d5d029ba4925129912cDaniel Dunbar    Args.AddAllArgsTranslated(CmdArgs, options::OPT_std_default_EQ,
1275a3ff202ee4fb21728e930d5d029ba4925129912cDaniel Dunbar                              "-std=", /*Joined=*/true);
1276a3ff202ee4fb21728e930d5d029ba4925129912cDaniel Dunbar  }
1277a3ff202ee4fb21728e930d5d029ba4925129912cDaniel Dunbar
1278a3ec60e0cf2a1916f479288998d31bd980b1a306Daniel Dunbar  if (Args.hasArg(options::OPT_v))
1279a3ec60e0cf2a1916f479288998d31bd980b1a306Daniel Dunbar    CmdArgs.push_back("-version");
1280a3ec60e0cf2a1916f479288998d31bd980b1a306Daniel Dunbar  if (Args.hasArg(options::OPT_pg))
1281a3ec60e0cf2a1916f479288998d31bd980b1a306Daniel Dunbar    CmdArgs.push_back("-p");
1282a3ec60e0cf2a1916f479288998d31bd980b1a306Daniel Dunbar  Args.AddLastArg(CmdArgs, options::OPT_p);
1283c21c485b4fb58ef5d55cf3e523263dd824a2ace4Daniel Dunbar
1284a3ec60e0cf2a1916f479288998d31bd980b1a306Daniel Dunbar  // The driver treats -fsyntax-only specially.
12852ba91575905a54f712a7f64304e56002e4882499Daniel Dunbar  if (getToolChain().getTriple().getArch() == llvm::Triple::arm ||
12862ba91575905a54f712a7f64304e56002e4882499Daniel Dunbar      getToolChain().getTriple().getArch() == llvm::Triple::thumb) {
12872ba91575905a54f712a7f64304e56002e4882499Daniel Dunbar    // Removes -fbuiltin-str{cat,cpy}; these aren't recognized by cc1 but are
12882ba91575905a54f712a7f64304e56002e4882499Daniel Dunbar    // used to inhibit the default -fno-builtin-str{cat,cpy}.
12892ba91575905a54f712a7f64304e56002e4882499Daniel Dunbar    //
12902ba91575905a54f712a7f64304e56002e4882499Daniel Dunbar    // FIXME: Should we grow a better way to deal with "removing" args?
12912ba91575905a54f712a7f64304e56002e4882499Daniel Dunbar    //
12922ba91575905a54f712a7f64304e56002e4882499Daniel Dunbar    // FIXME: Use iterator.
12932ba91575905a54f712a7f64304e56002e4882499Daniel Dunbar    for (ArgList::const_iterator it = Args.begin(),
12942ba91575905a54f712a7f64304e56002e4882499Daniel Dunbar           ie = Args.end(); it != ie; ++it) {
12952ba91575905a54f712a7f64304e56002e4882499Daniel Dunbar      const Arg *A = *it;
1296728a512753d85a6ccaae34e81385c8665c2de0e1Daniel Dunbar      if (A->getOption().matches(options::OPT_f_Group) ||
12972ba91575905a54f712a7f64304e56002e4882499Daniel Dunbar          A->getOption().matches(options::OPT_fsyntax_only)) {
12982ba91575905a54f712a7f64304e56002e4882499Daniel Dunbar        if (!A->getOption().matches(options::OPT_fbuiltin_strcat) &&
12992ba91575905a54f712a7f64304e56002e4882499Daniel Dunbar            !A->getOption().matches(options::OPT_fbuiltin_strcpy)) {
13002ba91575905a54f712a7f64304e56002e4882499Daniel Dunbar          A->claim();
13012ba91575905a54f712a7f64304e56002e4882499Daniel Dunbar          A->render(Args, CmdArgs);
13022ba91575905a54f712a7f64304e56002e4882499Daniel Dunbar        }
13032ba91575905a54f712a7f64304e56002e4882499Daniel Dunbar      }
13042ba91575905a54f712a7f64304e56002e4882499Daniel Dunbar    }
13052ba91575905a54f712a7f64304e56002e4882499Daniel Dunbar  } else
13062ba91575905a54f712a7f64304e56002e4882499Daniel Dunbar    Args.AddAllArgs(CmdArgs, options::OPT_f_Group, options::OPT_fsyntax_only);
1307c21c485b4fb58ef5d55cf3e523263dd824a2ace4Daniel Dunbar
1308a3ec60e0cf2a1916f479288998d31bd980b1a306Daniel Dunbar  Args.AddAllArgs(CmdArgs, options::OPT_undef);
1309a3ec60e0cf2a1916f479288998d31bd980b1a306Daniel Dunbar  if (Args.hasArg(options::OPT_Qn))
1310a3ec60e0cf2a1916f479288998d31bd980b1a306Daniel Dunbar    CmdArgs.push_back("-fno-ident");
1311c21c485b4fb58ef5d55cf3e523263dd824a2ace4Daniel Dunbar
1312a3ec60e0cf2a1916f479288998d31bd980b1a306Daniel Dunbar  // FIXME: This isn't correct.
1313a3ec60e0cf2a1916f479288998d31bd980b1a306Daniel Dunbar  //Args.AddLastArg(CmdArgs, options::OPT__help)
1314a3ec60e0cf2a1916f479288998d31bd980b1a306Daniel Dunbar  //Args.AddLastArg(CmdArgs, options::OPT__targetHelp)
1315a3ec60e0cf2a1916f479288998d31bd980b1a306Daniel Dunbar
1316a3ec60e0cf2a1916f479288998d31bd980b1a306Daniel Dunbar  CmdArgs.append(OutputArgs.begin(), OutputArgs.end());
1317a3ec60e0cf2a1916f479288998d31bd980b1a306Daniel Dunbar
1318a3ec60e0cf2a1916f479288998d31bd980b1a306Daniel Dunbar  // FIXME: Still don't get what is happening here. Investigate.
1319a3ec60e0cf2a1916f479288998d31bd980b1a306Daniel Dunbar  Args.AddAllArgs(CmdArgs, options::OPT__param);
1320a3ec60e0cf2a1916f479288998d31bd980b1a306Daniel Dunbar
1321a3ec60e0cf2a1916f479288998d31bd980b1a306Daniel Dunbar  if (Args.hasArg(options::OPT_fmudflap) ||
1322a3ec60e0cf2a1916f479288998d31bd980b1a306Daniel Dunbar      Args.hasArg(options::OPT_fmudflapth)) {
1323a3ec60e0cf2a1916f479288998d31bd980b1a306Daniel Dunbar    CmdArgs.push_back("-fno-builtin");
1324a3ec60e0cf2a1916f479288998d31bd980b1a306Daniel Dunbar    CmdArgs.push_back("-fno-merge-constants");
1325a3ec60e0cf2a1916f479288998d31bd980b1a306Daniel Dunbar  }
1326c21c485b4fb58ef5d55cf3e523263dd824a2ace4Daniel Dunbar
1327a3ec60e0cf2a1916f479288998d31bd980b1a306Daniel Dunbar  if (Args.hasArg(options::OPT_coverage)) {
1328a3ec60e0cf2a1916f479288998d31bd980b1a306Daniel Dunbar    CmdArgs.push_back("-fprofile-arcs");
1329a3ec60e0cf2a1916f479288998d31bd980b1a306Daniel Dunbar    CmdArgs.push_back("-ftest-coverage");
1330a3ec60e0cf2a1916f479288998d31bd980b1a306Daniel Dunbar  }
1331a3ec60e0cf2a1916f479288998d31bd980b1a306Daniel Dunbar
1332a3ec60e0cf2a1916f479288998d31bd980b1a306Daniel Dunbar  if (types::isCXX(Inputs[0].getType()))
1333a3ec60e0cf2a1916f479288998d31bd980b1a306Daniel Dunbar    CmdArgs.push_back("-D__private_extern__=extern");
1334a3ec60e0cf2a1916f479288998d31bd980b1a306Daniel Dunbar}
1335a3ec60e0cf2a1916f479288998d31bd980b1a306Daniel Dunbar
1336a3ec60e0cf2a1916f479288998d31bd980b1a306Daniel Dunbarvoid darwin::CC1::AddCPPOptionsArgs(const ArgList &Args, ArgStringList &CmdArgs,
1337a3ec60e0cf2a1916f479288998d31bd980b1a306Daniel Dunbar                                    const InputInfoList &Inputs,
1338a3ec60e0cf2a1916f479288998d31bd980b1a306Daniel Dunbar                                    const ArgStringList &OutputArgs) const {
1339a3ec60e0cf2a1916f479288998d31bd980b1a306Daniel Dunbar  // Derived from cpp_options
1340a3ec60e0cf2a1916f479288998d31bd980b1a306Daniel Dunbar  AddCPPUniqueOptionsArgs(Args, CmdArgs, Inputs);
1341c21c485b4fb58ef5d55cf3e523263dd824a2ace4Daniel Dunbar
1342a3ec60e0cf2a1916f479288998d31bd980b1a306Daniel Dunbar  CmdArgs.append(OutputArgs.begin(), OutputArgs.end());
1343a3ec60e0cf2a1916f479288998d31bd980b1a306Daniel Dunbar
1344a3ec60e0cf2a1916f479288998d31bd980b1a306Daniel Dunbar  AddCC1Args(Args, CmdArgs);
1345a3ec60e0cf2a1916f479288998d31bd980b1a306Daniel Dunbar
1346a3ec60e0cf2a1916f479288998d31bd980b1a306Daniel Dunbar  // NOTE: The code below has some commonality with cpp_options, but
1347a3ec60e0cf2a1916f479288998d31bd980b1a306Daniel Dunbar  // in classic gcc style ends up sending things in different
1348a3ec60e0cf2a1916f479288998d31bd980b1a306Daniel Dunbar  // orders. This may be a good merge candidate once we drop pedantic
1349a3ec60e0cf2a1916f479288998d31bd980b1a306Daniel Dunbar  // compatibility.
1350a3ec60e0cf2a1916f479288998d31bd980b1a306Daniel Dunbar
1351a3ec60e0cf2a1916f479288998d31bd980b1a306Daniel Dunbar  Args.AddAllArgs(CmdArgs, options::OPT_m_Group);
1352c21c485b4fb58ef5d55cf3e523263dd824a2ace4Daniel Dunbar  Args.AddAllArgs(CmdArgs, options::OPT_std_EQ, options::OPT_ansi,
1353a3ec60e0cf2a1916f479288998d31bd980b1a306Daniel Dunbar                  options::OPT_trigraphs);
1354a3ff202ee4fb21728e930d5d029ba4925129912cDaniel Dunbar  if (!Args.getLastArg(options::OPT_std_EQ, options::OPT_ansi)) {
1355a3ff202ee4fb21728e930d5d029ba4925129912cDaniel Dunbar    // Honor -std-default.
1356a3ff202ee4fb21728e930d5d029ba4925129912cDaniel Dunbar    Args.AddAllArgsTranslated(CmdArgs, options::OPT_std_default_EQ,
1357a3ff202ee4fb21728e930d5d029ba4925129912cDaniel Dunbar                              "-std=", /*Joined=*/true);
1358a3ff202ee4fb21728e930d5d029ba4925129912cDaniel Dunbar  }
1359a3ec60e0cf2a1916f479288998d31bd980b1a306Daniel Dunbar  Args.AddAllArgs(CmdArgs, options::OPT_W_Group, options::OPT_pedantic_Group);
1360a3ec60e0cf2a1916f479288998d31bd980b1a306Daniel Dunbar  Args.AddLastArg(CmdArgs, options::OPT_w);
1361c21c485b4fb58ef5d55cf3e523263dd824a2ace4Daniel Dunbar
1362a3ec60e0cf2a1916f479288998d31bd980b1a306Daniel Dunbar  // The driver treats -fsyntax-only specially.
1363a3ec60e0cf2a1916f479288998d31bd980b1a306Daniel Dunbar  Args.AddAllArgs(CmdArgs, options::OPT_f_Group, options::OPT_fsyntax_only);
1364a3ec60e0cf2a1916f479288998d31bd980b1a306Daniel Dunbar
1365a3ec60e0cf2a1916f479288998d31bd980b1a306Daniel Dunbar  if (Args.hasArg(options::OPT_g_Group) && !Args.hasArg(options::OPT_g0) &&
1366a3ec60e0cf2a1916f479288998d31bd980b1a306Daniel Dunbar      !Args.hasArg(options::OPT_fno_working_directory))
1367a3ec60e0cf2a1916f479288998d31bd980b1a306Daniel Dunbar    CmdArgs.push_back("-fworking-directory");
1368a3ec60e0cf2a1916f479288998d31bd980b1a306Daniel Dunbar
1369a3ec60e0cf2a1916f479288998d31bd980b1a306Daniel Dunbar  Args.AddAllArgs(CmdArgs, options::OPT_O);
1370a3ec60e0cf2a1916f479288998d31bd980b1a306Daniel Dunbar  Args.AddAllArgs(CmdArgs, options::OPT_undef);
1371a3ec60e0cf2a1916f479288998d31bd980b1a306Daniel Dunbar  if (Args.hasArg(options::OPT_save_temps))
1372a3ec60e0cf2a1916f479288998d31bd980b1a306Daniel Dunbar    CmdArgs.push_back("-fpch-preprocess");
1373a3ec60e0cf2a1916f479288998d31bd980b1a306Daniel Dunbar}
1374a3ec60e0cf2a1916f479288998d31bd980b1a306Daniel Dunbar
1375c21c485b4fb58ef5d55cf3e523263dd824a2ace4Daniel Dunbarvoid darwin::CC1::AddCPPUniqueOptionsArgs(const ArgList &Args,
1376a3ec60e0cf2a1916f479288998d31bd980b1a306Daniel Dunbar                                          ArgStringList &CmdArgs,
13771eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump                                          const InputInfoList &Inputs) const {
1378a3ec60e0cf2a1916f479288998d31bd980b1a306Daniel Dunbar  const Driver &D = getToolChain().getHost().getDriver();
1379a3ec60e0cf2a1916f479288998d31bd980b1a306Daniel Dunbar
138088a3d6cf5ebab81614f89ba48a8d89023270637aDaniel Dunbar  CheckPreprocessingOptions(D, Args);
138188a3d6cf5ebab81614f89ba48a8d89023270637aDaniel Dunbar
1382a3ec60e0cf2a1916f479288998d31bd980b1a306Daniel Dunbar  // Derived from cpp_unique_options.
138388a3d6cf5ebab81614f89ba48a8d89023270637aDaniel Dunbar  // -{C,CC} only with -E is checked in CheckPreprocessingOptions().
138488a3d6cf5ebab81614f89ba48a8d89023270637aDaniel Dunbar  Args.AddLastArg(CmdArgs, options::OPT_C);
138588a3d6cf5ebab81614f89ba48a8d89023270637aDaniel Dunbar  Args.AddLastArg(CmdArgs, options::OPT_CC);
1386a3ec60e0cf2a1916f479288998d31bd980b1a306Daniel Dunbar  if (!Args.hasArg(options::OPT_Q))
1387a3ec60e0cf2a1916f479288998d31bd980b1a306Daniel Dunbar    CmdArgs.push_back("-quiet");
1388a3ec60e0cf2a1916f479288998d31bd980b1a306Daniel Dunbar  Args.AddAllArgs(CmdArgs, options::OPT_nostdinc);
1389a3ec60e0cf2a1916f479288998d31bd980b1a306Daniel Dunbar  Args.AddLastArg(CmdArgs, options::OPT_v);
1390a3ec60e0cf2a1916f479288998d31bd980b1a306Daniel Dunbar  Args.AddAllArgs(CmdArgs, options::OPT_I_Group, options::OPT_F);
1391a3ec60e0cf2a1916f479288998d31bd980b1a306Daniel Dunbar  Args.AddLastArg(CmdArgs, options::OPT_P);
1392a3ec60e0cf2a1916f479288998d31bd980b1a306Daniel Dunbar
1393a3ec60e0cf2a1916f479288998d31bd980b1a306Daniel Dunbar  // FIXME: Handle %I properly.
1394a3ec60e0cf2a1916f479288998d31bd980b1a306Daniel Dunbar  if (getToolChain().getArchName() == "x86_64") {
1395a3ec60e0cf2a1916f479288998d31bd980b1a306Daniel Dunbar    CmdArgs.push_back("-imultilib");
1396a3ec60e0cf2a1916f479288998d31bd980b1a306Daniel Dunbar    CmdArgs.push_back("x86_64");
1397a3ec60e0cf2a1916f479288998d31bd980b1a306Daniel Dunbar  }
1398a3ec60e0cf2a1916f479288998d31bd980b1a306Daniel Dunbar
1399a3ec60e0cf2a1916f479288998d31bd980b1a306Daniel Dunbar  if (Args.hasArg(options::OPT_MD)) {
1400a3ec60e0cf2a1916f479288998d31bd980b1a306Daniel Dunbar    CmdArgs.push_back("-MD");
1401a5a7bd0de7b6b80212095195a055a4a43f21d4b2Daniel Dunbar    CmdArgs.push_back(darwin::CC1::getDependencyFileName(Args, Inputs));
1402a3ec60e0cf2a1916f479288998d31bd980b1a306Daniel Dunbar  }
1403a3ec60e0cf2a1916f479288998d31bd980b1a306Daniel Dunbar
1404a3ec60e0cf2a1916f479288998d31bd980b1a306Daniel Dunbar  if (Args.hasArg(options::OPT_MMD)) {
1405a3ec60e0cf2a1916f479288998d31bd980b1a306Daniel Dunbar    CmdArgs.push_back("-MMD");
1406a5a7bd0de7b6b80212095195a055a4a43f21d4b2Daniel Dunbar    CmdArgs.push_back(darwin::CC1::getDependencyFileName(Args, Inputs));
1407a3ec60e0cf2a1916f479288998d31bd980b1a306Daniel Dunbar  }
1408a3ec60e0cf2a1916f479288998d31bd980b1a306Daniel Dunbar
1409a3ec60e0cf2a1916f479288998d31bd980b1a306Daniel Dunbar  Args.AddLastArg(CmdArgs, options::OPT_M);
1410a3ec60e0cf2a1916f479288998d31bd980b1a306Daniel Dunbar  Args.AddLastArg(CmdArgs, options::OPT_MM);
1411a3ec60e0cf2a1916f479288998d31bd980b1a306Daniel Dunbar  Args.AddAllArgs(CmdArgs, options::OPT_MF);
1412a3ec60e0cf2a1916f479288998d31bd980b1a306Daniel Dunbar  Args.AddLastArg(CmdArgs, options::OPT_MG);
1413a3ec60e0cf2a1916f479288998d31bd980b1a306Daniel Dunbar  Args.AddLastArg(CmdArgs, options::OPT_MP);
1414a3ec60e0cf2a1916f479288998d31bd980b1a306Daniel Dunbar  Args.AddAllArgs(CmdArgs, options::OPT_MQ);
1415a3ec60e0cf2a1916f479288998d31bd980b1a306Daniel Dunbar  Args.AddAllArgs(CmdArgs, options::OPT_MT);
1416a3ec60e0cf2a1916f479288998d31bd980b1a306Daniel Dunbar  if (!Args.hasArg(options::OPT_M) && !Args.hasArg(options::OPT_MM) &&
1417a3ec60e0cf2a1916f479288998d31bd980b1a306Daniel Dunbar      (Args.hasArg(options::OPT_MD) || Args.hasArg(options::OPT_MMD))) {
1418a3ec60e0cf2a1916f479288998d31bd980b1a306Daniel Dunbar    if (Arg *OutputOpt = Args.getLastArg(options::OPT_o)) {
1419a3ec60e0cf2a1916f479288998d31bd980b1a306Daniel Dunbar      CmdArgs.push_back("-MQ");
1420a3ec60e0cf2a1916f479288998d31bd980b1a306Daniel Dunbar      CmdArgs.push_back(OutputOpt->getValue(Args));
1421a3ec60e0cf2a1916f479288998d31bd980b1a306Daniel Dunbar    }
1422a3ec60e0cf2a1916f479288998d31bd980b1a306Daniel Dunbar  }
1423a3ec60e0cf2a1916f479288998d31bd980b1a306Daniel Dunbar
1424a3ec60e0cf2a1916f479288998d31bd980b1a306Daniel Dunbar  Args.AddLastArg(CmdArgs, options::OPT_remap);
1425a3ec60e0cf2a1916f479288998d31bd980b1a306Daniel Dunbar  if (Args.hasArg(options::OPT_g3))
1426a3ec60e0cf2a1916f479288998d31bd980b1a306Daniel Dunbar    CmdArgs.push_back("-dD");
1427a3ec60e0cf2a1916f479288998d31bd980b1a306Daniel Dunbar  Args.AddLastArg(CmdArgs, options::OPT_H);
1428a3ec60e0cf2a1916f479288998d31bd980b1a306Daniel Dunbar
1429a3ec60e0cf2a1916f479288998d31bd980b1a306Daniel Dunbar  AddCPPArgs(Args, CmdArgs);
1430a3ec60e0cf2a1916f479288998d31bd980b1a306Daniel Dunbar
1431a3ec60e0cf2a1916f479288998d31bd980b1a306Daniel Dunbar  Args.AddAllArgs(CmdArgs, options::OPT_D, options::OPT_U, options::OPT_A);
1432a3ec60e0cf2a1916f479288998d31bd980b1a306Daniel Dunbar  Args.AddAllArgs(CmdArgs, options::OPT_i_Group);
1433a3ec60e0cf2a1916f479288998d31bd980b1a306Daniel Dunbar
1434a3ec60e0cf2a1916f479288998d31bd980b1a306Daniel Dunbar  for (InputInfoList::const_iterator
1435a3ec60e0cf2a1916f479288998d31bd980b1a306Daniel Dunbar         it = Inputs.begin(), ie = Inputs.end(); it != ie; ++it) {
1436a3ec60e0cf2a1916f479288998d31bd980b1a306Daniel Dunbar    const InputInfo &II = *it;
1437c21c485b4fb58ef5d55cf3e523263dd824a2ace4Daniel Dunbar
1438a3ec60e0cf2a1916f479288998d31bd980b1a306Daniel Dunbar    if (II.isPipe())
1439a3ec60e0cf2a1916f479288998d31bd980b1a306Daniel Dunbar      CmdArgs.push_back("-");
1440a3ec60e0cf2a1916f479288998d31bd980b1a306Daniel Dunbar    else
1441a3ec60e0cf2a1916f479288998d31bd980b1a306Daniel Dunbar      CmdArgs.push_back(II.getFilename());
1442a3ec60e0cf2a1916f479288998d31bd980b1a306Daniel Dunbar  }
1443a3ec60e0cf2a1916f479288998d31bd980b1a306Daniel Dunbar
1444a3ec60e0cf2a1916f479288998d31bd980b1a306Daniel Dunbar  Args.AddAllArgValues(CmdArgs, options::OPT_Wp_COMMA,
1445a3ec60e0cf2a1916f479288998d31bd980b1a306Daniel Dunbar                       options::OPT_Xpreprocessor);
1446a3ec60e0cf2a1916f479288998d31bd980b1a306Daniel Dunbar
1447a3ec60e0cf2a1916f479288998d31bd980b1a306Daniel Dunbar  if (Args.hasArg(options::OPT_fmudflap)) {
1448a3ec60e0cf2a1916f479288998d31bd980b1a306Daniel Dunbar    CmdArgs.push_back("-D_MUDFLAP");
1449a3ec60e0cf2a1916f479288998d31bd980b1a306Daniel Dunbar    CmdArgs.push_back("-include");
1450a3ec60e0cf2a1916f479288998d31bd980b1a306Daniel Dunbar    CmdArgs.push_back("mf-runtime.h");
1451a3ec60e0cf2a1916f479288998d31bd980b1a306Daniel Dunbar  }
1452a3ec60e0cf2a1916f479288998d31bd980b1a306Daniel Dunbar
1453a3ec60e0cf2a1916f479288998d31bd980b1a306Daniel Dunbar  if (Args.hasArg(options::OPT_fmudflapth)) {
1454a3ec60e0cf2a1916f479288998d31bd980b1a306Daniel Dunbar    CmdArgs.push_back("-D_MUDFLAP");
1455a3ec60e0cf2a1916f479288998d31bd980b1a306Daniel Dunbar    CmdArgs.push_back("-D_MUDFLAPTH");
1456a3ec60e0cf2a1916f479288998d31bd980b1a306Daniel Dunbar    CmdArgs.push_back("-include");
1457a3ec60e0cf2a1916f479288998d31bd980b1a306Daniel Dunbar    CmdArgs.push_back("mf-runtime.h");
1458a3ec60e0cf2a1916f479288998d31bd980b1a306Daniel Dunbar  }
1459a3ec60e0cf2a1916f479288998d31bd980b1a306Daniel Dunbar}
1460a3ec60e0cf2a1916f479288998d31bd980b1a306Daniel Dunbar
1461c21c485b4fb58ef5d55cf3e523263dd824a2ace4Daniel Dunbarvoid darwin::CC1::AddCPPArgs(const ArgList &Args,
1462a3ec60e0cf2a1916f479288998d31bd980b1a306Daniel Dunbar                             ArgStringList &CmdArgs) const {
1463a3ec60e0cf2a1916f479288998d31bd980b1a306Daniel Dunbar  // Derived from cpp spec.
1464a3ec60e0cf2a1916f479288998d31bd980b1a306Daniel Dunbar
1465a3ec60e0cf2a1916f479288998d31bd980b1a306Daniel Dunbar  if (Args.hasArg(options::OPT_static)) {
1466a3ec60e0cf2a1916f479288998d31bd980b1a306Daniel Dunbar    // The gcc spec is broken here, it refers to dynamic but
1467a3ec60e0cf2a1916f479288998d31bd980b1a306Daniel Dunbar    // that has been translated. Start by being bug compatible.
1468c21c485b4fb58ef5d55cf3e523263dd824a2ace4Daniel Dunbar
1469a3ec60e0cf2a1916f479288998d31bd980b1a306Daniel Dunbar    // if (!Args.hasArg(arglist.parser.dynamicOption))
1470a3ec60e0cf2a1916f479288998d31bd980b1a306Daniel Dunbar    CmdArgs.push_back("-D__STATIC__");
1471a3ec60e0cf2a1916f479288998d31bd980b1a306Daniel Dunbar  } else
1472a3ec60e0cf2a1916f479288998d31bd980b1a306Daniel Dunbar    CmdArgs.push_back("-D__DYNAMIC__");
1473a3ec60e0cf2a1916f479288998d31bd980b1a306Daniel Dunbar
1474a3ec60e0cf2a1916f479288998d31bd980b1a306Daniel Dunbar  if (Args.hasArg(options::OPT_pthread))
1475a3ec60e0cf2a1916f479288998d31bd980b1a306Daniel Dunbar    CmdArgs.push_back("-D_REENTRANT");
1476a3ec60e0cf2a1916f479288998d31bd980b1a306Daniel Dunbar}
1477a3ec60e0cf2a1916f479288998d31bd980b1a306Daniel Dunbar
147840f1265ebd42ece3e7f7917319b56012e8e2bce2Daniel Dunbarvoid darwin::Preprocess::ConstructJob(Compilation &C, const JobAction &JA,
1479c21c485b4fb58ef5d55cf3e523263dd824a2ace4Daniel Dunbar                                      Job &Dest, const InputInfo &Output,
1480c21c485b4fb58ef5d55cf3e523263dd824a2ace4Daniel Dunbar                                      const InputInfoList &Inputs,
1481c21c485b4fb58ef5d55cf3e523263dd824a2ace4Daniel Dunbar                                      const ArgList &Args,
148240f1265ebd42ece3e7f7917319b56012e8e2bce2Daniel Dunbar                                      const char *LinkingOutput) const {
148340f1265ebd42ece3e7f7917319b56012e8e2bce2Daniel Dunbar  ArgStringList CmdArgs;
148440f1265ebd42ece3e7f7917319b56012e8e2bce2Daniel Dunbar
148540f1265ebd42ece3e7f7917319b56012e8e2bce2Daniel Dunbar  assert(Inputs.size() == 1 && "Unexpected number of inputs!");
148640f1265ebd42ece3e7f7917319b56012e8e2bce2Daniel Dunbar
148740f1265ebd42ece3e7f7917319b56012e8e2bce2Daniel Dunbar  CmdArgs.push_back("-E");
148840f1265ebd42ece3e7f7917319b56012e8e2bce2Daniel Dunbar
148940f1265ebd42ece3e7f7917319b56012e8e2bce2Daniel Dunbar  if (Args.hasArg(options::OPT_traditional) ||
149040f1265ebd42ece3e7f7917319b56012e8e2bce2Daniel Dunbar      Args.hasArg(options::OPT_traditional_cpp))
149140f1265ebd42ece3e7f7917319b56012e8e2bce2Daniel Dunbar    CmdArgs.push_back("-traditional-cpp");
1492c21c485b4fb58ef5d55cf3e523263dd824a2ace4Daniel Dunbar
149340f1265ebd42ece3e7f7917319b56012e8e2bce2Daniel Dunbar  ArgStringList OutputArgs;
149440f1265ebd42ece3e7f7917319b56012e8e2bce2Daniel Dunbar  if (Output.isFilename()) {
149540f1265ebd42ece3e7f7917319b56012e8e2bce2Daniel Dunbar    OutputArgs.push_back("-o");
149640f1265ebd42ece3e7f7917319b56012e8e2bce2Daniel Dunbar    OutputArgs.push_back(Output.getFilename());
149740f1265ebd42ece3e7f7917319b56012e8e2bce2Daniel Dunbar  } else {
149840f1265ebd42ece3e7f7917319b56012e8e2bce2Daniel Dunbar    assert(Output.isPipe() && "Unexpected CC1 output.");
149940f1265ebd42ece3e7f7917319b56012e8e2bce2Daniel Dunbar  }
150040f1265ebd42ece3e7f7917319b56012e8e2bce2Daniel Dunbar
15019120f179fd2e354f067e4ef2c76dcf3fc4db8a16Daniel Dunbar  if (Args.hasArg(options::OPT_E)) {
15029120f179fd2e354f067e4ef2c76dcf3fc4db8a16Daniel Dunbar    AddCPPOptionsArgs(Args, CmdArgs, Inputs, OutputArgs);
15039120f179fd2e354f067e4ef2c76dcf3fc4db8a16Daniel Dunbar  } else {
15049120f179fd2e354f067e4ef2c76dcf3fc4db8a16Daniel Dunbar    AddCPPOptionsArgs(Args, CmdArgs, Inputs, ArgStringList());
15059120f179fd2e354f067e4ef2c76dcf3fc4db8a16Daniel Dunbar    CmdArgs.append(OutputArgs.begin(), OutputArgs.end());
15069120f179fd2e354f067e4ef2c76dcf3fc4db8a16Daniel Dunbar  }
1507c21c485b4fb58ef5d55cf3e523263dd824a2ace4Daniel Dunbar
15088a2073a85670a13b0bcc1726bc7f80d458f8245bDaniel Dunbar  Args.AddAllArgs(CmdArgs, options::OPT_d_Group);
15098a2073a85670a13b0bcc1726bc7f80d458f8245bDaniel Dunbar
151040f1265ebd42ece3e7f7917319b56012e8e2bce2Daniel Dunbar  const char *CC1Name = getCC1Name(Inputs[0].getType());
1511c21c485b4fb58ef5d55cf3e523263dd824a2ace4Daniel Dunbar  const char *Exec =
15125ed34f4c58b6ad4e21038d713c1fae31a6146ff5Daniel Dunbar    Args.MakeArgString(getToolChain().GetProgramPath(C, CC1Name));
1513cae087e164e94e4286c11bf694dd0ff88f295302Daniel Dunbar  Dest.addCommand(new Command(JA, Exec, CmdArgs));
151440f1265ebd42ece3e7f7917319b56012e8e2bce2Daniel Dunbar}
151540f1265ebd42ece3e7f7917319b56012e8e2bce2Daniel Dunbar
151640f1265ebd42ece3e7f7917319b56012e8e2bce2Daniel Dunbarvoid darwin::Compile::ConstructJob(Compilation &C, const JobAction &JA,
1517c21c485b4fb58ef5d55cf3e523263dd824a2ace4Daniel Dunbar                                   Job &Dest, const InputInfo &Output,
1518c21c485b4fb58ef5d55cf3e523263dd824a2ace4Daniel Dunbar                                   const InputInfoList &Inputs,
1519c21c485b4fb58ef5d55cf3e523263dd824a2ace4Daniel Dunbar                                   const ArgList &Args,
152040f1265ebd42ece3e7f7917319b56012e8e2bce2Daniel Dunbar                                   const char *LinkingOutput) const {
152140f1265ebd42ece3e7f7917319b56012e8e2bce2Daniel Dunbar  const Driver &D = getToolChain().getHost().getDriver();
152240f1265ebd42ece3e7f7917319b56012e8e2bce2Daniel Dunbar  ArgStringList CmdArgs;
152340f1265ebd42ece3e7f7917319b56012e8e2bce2Daniel Dunbar
152440f1265ebd42ece3e7f7917319b56012e8e2bce2Daniel Dunbar  assert(Inputs.size() == 1 && "Unexpected number of inputs!");
152540f1265ebd42ece3e7f7917319b56012e8e2bce2Daniel Dunbar
152640f1265ebd42ece3e7f7917319b56012e8e2bce2Daniel Dunbar  types::ID InputType = Inputs[0].getType();
152740f1265ebd42ece3e7f7917319b56012e8e2bce2Daniel Dunbar  const Arg *A;
1528ceb5c5b7f67a30fae305d1d19b478b623e4fbcedEli Friedman  if ((A = Args.getLastArg(options::OPT_traditional)))
152940f1265ebd42ece3e7f7917319b56012e8e2bce2Daniel Dunbar    D.Diag(clang::diag::err_drv_argument_only_allowed_with)
153040f1265ebd42ece3e7f7917319b56012e8e2bce2Daniel Dunbar      << A->getAsString(Args) << "-E";
153140f1265ebd42ece3e7f7917319b56012e8e2bce2Daniel Dunbar
153240f1265ebd42ece3e7f7917319b56012e8e2bce2Daniel Dunbar  if (Output.getType() == types::TY_LLVMAsm)
153340f1265ebd42ece3e7f7917319b56012e8e2bce2Daniel Dunbar    CmdArgs.push_back("-emit-llvm");
153440f1265ebd42ece3e7f7917319b56012e8e2bce2Daniel Dunbar  else if (Output.getType() == types::TY_LLVMBC)
153540f1265ebd42ece3e7f7917319b56012e8e2bce2Daniel Dunbar    CmdArgs.push_back("-emit-llvm-bc");
15365915fbf310e171c4cd3c2af05e9de360c0fa988aDaniel Dunbar  else if (Output.getType() == types::TY_AST)
15375915fbf310e171c4cd3c2af05e9de360c0fa988aDaniel Dunbar    D.Diag(clang::diag::err_drv_no_ast_support)
1538881376467c46c5c6cc16fa6790271c2c22e1d4f1Daniel Dunbar      << getToolChain().getTripleString();
153940f1265ebd42ece3e7f7917319b56012e8e2bce2Daniel Dunbar
154040f1265ebd42ece3e7f7917319b56012e8e2bce2Daniel Dunbar  ArgStringList OutputArgs;
154140f1265ebd42ece3e7f7917319b56012e8e2bce2Daniel Dunbar  if (Output.getType() != types::TY_PCH) {
154240f1265ebd42ece3e7f7917319b56012e8e2bce2Daniel Dunbar    OutputArgs.push_back("-o");
154340f1265ebd42ece3e7f7917319b56012e8e2bce2Daniel Dunbar    if (Output.isPipe())
154440f1265ebd42ece3e7f7917319b56012e8e2bce2Daniel Dunbar      OutputArgs.push_back("-");
154540f1265ebd42ece3e7f7917319b56012e8e2bce2Daniel Dunbar    else if (Output.isNothing())
154640f1265ebd42ece3e7f7917319b56012e8e2bce2Daniel Dunbar      OutputArgs.push_back("/dev/null");
154740f1265ebd42ece3e7f7917319b56012e8e2bce2Daniel Dunbar    else
154840f1265ebd42ece3e7f7917319b56012e8e2bce2Daniel Dunbar      OutputArgs.push_back(Output.getFilename());
154940f1265ebd42ece3e7f7917319b56012e8e2bce2Daniel Dunbar  }
155040f1265ebd42ece3e7f7917319b56012e8e2bce2Daniel Dunbar
155140f1265ebd42ece3e7f7917319b56012e8e2bce2Daniel Dunbar  // There is no need for this level of compatibility, but it makes
155240f1265ebd42ece3e7f7917319b56012e8e2bce2Daniel Dunbar  // diffing easier.
155340f1265ebd42ece3e7f7917319b56012e8e2bce2Daniel Dunbar  bool OutputArgsEarly = (Args.hasArg(options::OPT_fsyntax_only) ||
155440f1265ebd42ece3e7f7917319b56012e8e2bce2Daniel Dunbar                          Args.hasArg(options::OPT_S));
155540f1265ebd42ece3e7f7917319b56012e8e2bce2Daniel Dunbar
155640f1265ebd42ece3e7f7917319b56012e8e2bce2Daniel Dunbar  if (types::getPreprocessedType(InputType) != types::TY_INVALID) {
1557a3ec60e0cf2a1916f479288998d31bd980b1a306Daniel Dunbar    AddCPPUniqueOptionsArgs(Args, CmdArgs, Inputs);
155840f1265ebd42ece3e7f7917319b56012e8e2bce2Daniel Dunbar    if (OutputArgsEarly) {
155940f1265ebd42ece3e7f7917319b56012e8e2bce2Daniel Dunbar      AddCC1OptionsArgs(Args, CmdArgs, Inputs, OutputArgs);
156040f1265ebd42ece3e7f7917319b56012e8e2bce2Daniel Dunbar    } else {
156140f1265ebd42ece3e7f7917319b56012e8e2bce2Daniel Dunbar      AddCC1OptionsArgs(Args, CmdArgs, Inputs, ArgStringList());
156240f1265ebd42ece3e7f7917319b56012e8e2bce2Daniel Dunbar      CmdArgs.append(OutputArgs.begin(), OutputArgs.end());
156340f1265ebd42ece3e7f7917319b56012e8e2bce2Daniel Dunbar    }
156440f1265ebd42ece3e7f7917319b56012e8e2bce2Daniel Dunbar  } else {
156540f1265ebd42ece3e7f7917319b56012e8e2bce2Daniel Dunbar    CmdArgs.push_back("-fpreprocessed");
1566c21c485b4fb58ef5d55cf3e523263dd824a2ace4Daniel Dunbar
156740f1265ebd42ece3e7f7917319b56012e8e2bce2Daniel Dunbar    for (InputInfoList::const_iterator
156840f1265ebd42ece3e7f7917319b56012e8e2bce2Daniel Dunbar           it = Inputs.begin(), ie = Inputs.end(); it != ie; ++it) {
156940f1265ebd42ece3e7f7917319b56012e8e2bce2Daniel Dunbar      const InputInfo &II = *it;
157040f1265ebd42ece3e7f7917319b56012e8e2bce2Daniel Dunbar
15715915fbf310e171c4cd3c2af05e9de360c0fa988aDaniel Dunbar      // Reject AST inputs.
15725915fbf310e171c4cd3c2af05e9de360c0fa988aDaniel Dunbar      if (II.getType() == types::TY_AST) {
15735915fbf310e171c4cd3c2af05e9de360c0fa988aDaniel Dunbar        D.Diag(clang::diag::err_drv_no_ast_support)
1574881376467c46c5c6cc16fa6790271c2c22e1d4f1Daniel Dunbar          << getToolChain().getTripleString();
15755915fbf310e171c4cd3c2af05e9de360c0fa988aDaniel Dunbar        return;
15765915fbf310e171c4cd3c2af05e9de360c0fa988aDaniel Dunbar      }
15775915fbf310e171c4cd3c2af05e9de360c0fa988aDaniel Dunbar
157840f1265ebd42ece3e7f7917319b56012e8e2bce2Daniel Dunbar      if (II.isPipe())
157940f1265ebd42ece3e7f7917319b56012e8e2bce2Daniel Dunbar        CmdArgs.push_back("-");
158040f1265ebd42ece3e7f7917319b56012e8e2bce2Daniel Dunbar      else
158140f1265ebd42ece3e7f7917319b56012e8e2bce2Daniel Dunbar        CmdArgs.push_back(II.getFilename());
158240f1265ebd42ece3e7f7917319b56012e8e2bce2Daniel Dunbar    }
158340f1265ebd42ece3e7f7917319b56012e8e2bce2Daniel Dunbar
158440f1265ebd42ece3e7f7917319b56012e8e2bce2Daniel Dunbar    if (OutputArgsEarly) {
158540f1265ebd42ece3e7f7917319b56012e8e2bce2Daniel Dunbar      AddCC1OptionsArgs(Args, CmdArgs, Inputs, OutputArgs);
158640f1265ebd42ece3e7f7917319b56012e8e2bce2Daniel Dunbar    } else {
158740f1265ebd42ece3e7f7917319b56012e8e2bce2Daniel Dunbar      AddCC1OptionsArgs(Args, CmdArgs, Inputs, ArgStringList());
158840f1265ebd42ece3e7f7917319b56012e8e2bce2Daniel Dunbar      CmdArgs.append(OutputArgs.begin(), OutputArgs.end());
158940f1265ebd42ece3e7f7917319b56012e8e2bce2Daniel Dunbar    }
159040f1265ebd42ece3e7f7917319b56012e8e2bce2Daniel Dunbar  }
1591c21c485b4fb58ef5d55cf3e523263dd824a2ace4Daniel Dunbar
159240f1265ebd42ece3e7f7917319b56012e8e2bce2Daniel Dunbar  if (Output.getType() == types::TY_PCH) {
159340f1265ebd42ece3e7f7917319b56012e8e2bce2Daniel Dunbar    assert(Output.isFilename() && "Invalid PCH output.");
159440f1265ebd42ece3e7f7917319b56012e8e2bce2Daniel Dunbar
159540f1265ebd42ece3e7f7917319b56012e8e2bce2Daniel Dunbar    CmdArgs.push_back("-o");
159640f1265ebd42ece3e7f7917319b56012e8e2bce2Daniel Dunbar    // NOTE: gcc uses a temp .s file for this, but there doesn't seem
159740f1265ebd42ece3e7f7917319b56012e8e2bce2Daniel Dunbar    // to be a good reason.
159840f1265ebd42ece3e7f7917319b56012e8e2bce2Daniel Dunbar    CmdArgs.push_back("/dev/null");
1599c21c485b4fb58ef5d55cf3e523263dd824a2ace4Daniel Dunbar
160040f1265ebd42ece3e7f7917319b56012e8e2bce2Daniel Dunbar    CmdArgs.push_back("--output-pch=");
160140f1265ebd42ece3e7f7917319b56012e8e2bce2Daniel Dunbar    CmdArgs.push_back(Output.getFilename());
1602c21c485b4fb58ef5d55cf3e523263dd824a2ace4Daniel Dunbar  }
160340f1265ebd42ece3e7f7917319b56012e8e2bce2Daniel Dunbar
160440f1265ebd42ece3e7f7917319b56012e8e2bce2Daniel Dunbar  const char *CC1Name = getCC1Name(Inputs[0].getType());
1605c21c485b4fb58ef5d55cf3e523263dd824a2ace4Daniel Dunbar  const char *Exec =
16065ed34f4c58b6ad4e21038d713c1fae31a6146ff5Daniel Dunbar    Args.MakeArgString(getToolChain().GetProgramPath(C, CC1Name));
1607cae087e164e94e4286c11bf694dd0ff88f295302Daniel Dunbar  Dest.addCommand(new Command(JA, Exec, CmdArgs));
160840f1265ebd42ece3e7f7917319b56012e8e2bce2Daniel Dunbar}
160940f1265ebd42ece3e7f7917319b56012e8e2bce2Daniel Dunbar
16108cac5f7e1ce63dd77ee0fb4ef68f9fa804f41ea6Daniel Dunbarvoid darwin::Assemble::ConstructJob(Compilation &C, const JobAction &JA,
1611c21c485b4fb58ef5d55cf3e523263dd824a2ace4Daniel Dunbar                                    Job &Dest, const InputInfo &Output,
1612c21c485b4fb58ef5d55cf3e523263dd824a2ace4Daniel Dunbar                                    const InputInfoList &Inputs,
1613c21c485b4fb58ef5d55cf3e523263dd824a2ace4Daniel Dunbar                                    const ArgList &Args,
16148cac5f7e1ce63dd77ee0fb4ef68f9fa804f41ea6Daniel Dunbar                                    const char *LinkingOutput) const {
16158cac5f7e1ce63dd77ee0fb4ef68f9fa804f41ea6Daniel Dunbar  ArgStringList CmdArgs;
16168cac5f7e1ce63dd77ee0fb4ef68f9fa804f41ea6Daniel Dunbar
16178cac5f7e1ce63dd77ee0fb4ef68f9fa804f41ea6Daniel Dunbar  assert(Inputs.size() == 1 && "Unexpected number of inputs.");
16188cac5f7e1ce63dd77ee0fb4ef68f9fa804f41ea6Daniel Dunbar  const InputInfo &Input = Inputs[0];
16198cac5f7e1ce63dd77ee0fb4ef68f9fa804f41ea6Daniel Dunbar
16208cac5f7e1ce63dd77ee0fb4ef68f9fa804f41ea6Daniel Dunbar  // Bit of a hack, this is only used for original inputs.
1621c21c485b4fb58ef5d55cf3e523263dd824a2ace4Daniel Dunbar  //
16228e4fea6750dbac032c172f3279c63b7815b7423eDaniel Dunbar  // FIXME: This is broken for preprocessed .s inputs.
16238cac5f7e1ce63dd77ee0fb4ef68f9fa804f41ea6Daniel Dunbar  if (Input.isFilename() &&
16248e4fea6750dbac032c172f3279c63b7815b7423eDaniel Dunbar      strcmp(Input.getFilename(), Input.getBaseInput()) == 0) {
16258e4fea6750dbac032c172f3279c63b7815b7423eDaniel Dunbar    if (Args.hasArg(options::OPT_gstabs))
16268e4fea6750dbac032c172f3279c63b7815b7423eDaniel Dunbar      CmdArgs.push_back("--gstabs");
16278e4fea6750dbac032c172f3279c63b7815b7423eDaniel Dunbar    else if (Args.hasArg(options::OPT_g_Group))
16288e4fea6750dbac032c172f3279c63b7815b7423eDaniel Dunbar      CmdArgs.push_back("--gdwarf2");
16298e4fea6750dbac032c172f3279c63b7815b7423eDaniel Dunbar  }
1630c21c485b4fb58ef5d55cf3e523263dd824a2ace4Daniel Dunbar
16318cac5f7e1ce63dd77ee0fb4ef68f9fa804f41ea6Daniel Dunbar  // Derived from asm spec.
1632cc6f803f98fa6ba9a9c366400210448516d01b3cDaniel Dunbar  AddDarwinArch(Args, CmdArgs);
1633cc6f803f98fa6ba9a9c366400210448516d01b3cDaniel Dunbar
16341d4612b829500cbe04a2eafca74afac703e34934Daniel Dunbar  if (!getDarwinToolChain().isIPhoneOS() ||
1635cc6f803f98fa6ba9a9c366400210448516d01b3cDaniel Dunbar      Args.hasArg(options::OPT_force__cpusubtype__ALL))
1636cc6f803f98fa6ba9a9c366400210448516d01b3cDaniel Dunbar    CmdArgs.push_back("-force_cpusubtype_ALL");
16378cac5f7e1ce63dd77ee0fb4ef68f9fa804f41ea6Daniel Dunbar
16380e2679d29be70186fc1197a1484948ed239922baDaniel Dunbar  if (getToolChain().getTriple().getArch() != llvm::Triple::x86_64 &&
16390e2679d29be70186fc1197a1484948ed239922baDaniel Dunbar      (Args.hasArg(options::OPT_mkernel) ||
16408cac5f7e1ce63dd77ee0fb4ef68f9fa804f41ea6Daniel Dunbar       Args.hasArg(options::OPT_static) ||
16410e2679d29be70186fc1197a1484948ed239922baDaniel Dunbar       Args.hasArg(options::OPT_fapple_kext)))
1642c21c485b4fb58ef5d55cf3e523263dd824a2ace4Daniel Dunbar    CmdArgs.push_back("-static");
1643c21c485b4fb58ef5d55cf3e523263dd824a2ace4Daniel Dunbar
16448cac5f7e1ce63dd77ee0fb4ef68f9fa804f41ea6Daniel Dunbar  Args.AddAllArgValues(CmdArgs, options::OPT_Wa_COMMA,
16458cac5f7e1ce63dd77ee0fb4ef68f9fa804f41ea6Daniel Dunbar                       options::OPT_Xassembler);
16468cac5f7e1ce63dd77ee0fb4ef68f9fa804f41ea6Daniel Dunbar
16478cac5f7e1ce63dd77ee0fb4ef68f9fa804f41ea6Daniel Dunbar  assert(Output.isFilename() && "Unexpected lipo output.");
16488cac5f7e1ce63dd77ee0fb4ef68f9fa804f41ea6Daniel Dunbar  CmdArgs.push_back("-o");
16498cac5f7e1ce63dd77ee0fb4ef68f9fa804f41ea6Daniel Dunbar  CmdArgs.push_back(Output.getFilename());
16508cac5f7e1ce63dd77ee0fb4ef68f9fa804f41ea6Daniel Dunbar
16518cac5f7e1ce63dd77ee0fb4ef68f9fa804f41ea6Daniel Dunbar  if (Input.isPipe()) {
16528cac5f7e1ce63dd77ee0fb4ef68f9fa804f41ea6Daniel Dunbar    CmdArgs.push_back("-");
16538cac5f7e1ce63dd77ee0fb4ef68f9fa804f41ea6Daniel Dunbar  } else {
16548cac5f7e1ce63dd77ee0fb4ef68f9fa804f41ea6Daniel Dunbar    assert(Input.isFilename() && "Invalid input.");
16558cac5f7e1ce63dd77ee0fb4ef68f9fa804f41ea6Daniel Dunbar    CmdArgs.push_back(Input.getFilename());
16568cac5f7e1ce63dd77ee0fb4ef68f9fa804f41ea6Daniel Dunbar  }
16578cac5f7e1ce63dd77ee0fb4ef68f9fa804f41ea6Daniel Dunbar
16588cac5f7e1ce63dd77ee0fb4ef68f9fa804f41ea6Daniel Dunbar  // asm_final spec is empty.
16598cac5f7e1ce63dd77ee0fb4ef68f9fa804f41ea6Daniel Dunbar
1660c21c485b4fb58ef5d55cf3e523263dd824a2ace4Daniel Dunbar  const char *Exec =
16615ed34f4c58b6ad4e21038d713c1fae31a6146ff5Daniel Dunbar    Args.MakeArgString(getToolChain().GetProgramPath(C, "as"));
1662cae087e164e94e4286c11bf694dd0ff88f295302Daniel Dunbar  Dest.addCommand(new Command(JA, Exec, CmdArgs));
16638cac5f7e1ce63dd77ee0fb4ef68f9fa804f41ea6Daniel Dunbar}
1664ff7488dc9a766f94daf54d81b03ab9160d0bfd88Daniel Dunbar
166502633b541b04ad5ffc1c70f4c2feeeb13e607057Daniel Dunbar/// Helper routine for seeing if we should use dsymutil; this is a
166602633b541b04ad5ffc1c70f4c2feeeb13e607057Daniel Dunbar/// gcc compatible hack, we should remove it and use the input
166702633b541b04ad5ffc1c70f4c2feeeb13e607057Daniel Dunbar/// type information.
166802633b541b04ad5ffc1c70f4c2feeeb13e607057Daniel Dunbarstatic bool isSourceSuffix(const char *Str) {
166902633b541b04ad5ffc1c70f4c2feeeb13e607057Daniel Dunbar  // match: 'C', 'CPP', 'c', 'cc', 'cp', 'c++', 'cpp', 'cxx', 'm',
167002633b541b04ad5ffc1c70f4c2feeeb13e607057Daniel Dunbar  // 'mm'.
167155d3f7ae512875a1d6402943c3a619633feb2a18Douglas Gregor  return llvm::StringSwitch<bool>(Str)
167255d3f7ae512875a1d6402943c3a619633feb2a18Douglas Gregor           .Case("C", true)
167355d3f7ae512875a1d6402943c3a619633feb2a18Douglas Gregor           .Case("c", true)
167455d3f7ae512875a1d6402943c3a619633feb2a18Douglas Gregor           .Case("m", true)
167555d3f7ae512875a1d6402943c3a619633feb2a18Douglas Gregor           .Case("cc", true)
167655d3f7ae512875a1d6402943c3a619633feb2a18Douglas Gregor           .Case("cp", true)
167755d3f7ae512875a1d6402943c3a619633feb2a18Douglas Gregor           .Case("mm", true)
167855d3f7ae512875a1d6402943c3a619633feb2a18Douglas Gregor           .Case("CPP", true)
167955d3f7ae512875a1d6402943c3a619633feb2a18Douglas Gregor           .Case("c++", true)
168055d3f7ae512875a1d6402943c3a619633feb2a18Douglas Gregor           .Case("cpp", true)
168155d3f7ae512875a1d6402943c3a619633feb2a18Douglas Gregor           .Case("cxx", true)
168255d3f7ae512875a1d6402943c3a619633feb2a18Douglas Gregor           .Default(false);
168302633b541b04ad5ffc1c70f4c2feeeb13e607057Daniel Dunbar}
168402633b541b04ad5ffc1c70f4c2feeeb13e607057Daniel Dunbar
168578dbd580a02759bbc408dbefb6754afa71b2c24cDaniel Dunbar// FIXME: Can we tablegen this?
168678dbd580a02759bbc408dbefb6754afa71b2c24cDaniel Dunbarstatic const char *GetArmArchForMArch(llvm::StringRef Value) {
168778dbd580a02759bbc408dbefb6754afa71b2c24cDaniel Dunbar  if (Value == "armv6k")
168878dbd580a02759bbc408dbefb6754afa71b2c24cDaniel Dunbar    return "armv6";
168978dbd580a02759bbc408dbefb6754afa71b2c24cDaniel Dunbar
169078dbd580a02759bbc408dbefb6754afa71b2c24cDaniel Dunbar  if (Value == "armv5tej")
169178dbd580a02759bbc408dbefb6754afa71b2c24cDaniel Dunbar    return "armv5";
169278dbd580a02759bbc408dbefb6754afa71b2c24cDaniel Dunbar
169378dbd580a02759bbc408dbefb6754afa71b2c24cDaniel Dunbar  if (Value == "xscale")
169478dbd580a02759bbc408dbefb6754afa71b2c24cDaniel Dunbar    return "xscale";
169578dbd580a02759bbc408dbefb6754afa71b2c24cDaniel Dunbar
169678dbd580a02759bbc408dbefb6754afa71b2c24cDaniel Dunbar  if (Value == "armv4t")
169778dbd580a02759bbc408dbefb6754afa71b2c24cDaniel Dunbar    return "armv4t";
169878dbd580a02759bbc408dbefb6754afa71b2c24cDaniel Dunbar
169978dbd580a02759bbc408dbefb6754afa71b2c24cDaniel Dunbar  if (Value == "armv7" || Value == "armv7-a" || Value == "armv7-r" ||
170078dbd580a02759bbc408dbefb6754afa71b2c24cDaniel Dunbar      Value == "armv7-m" || Value == "armv7a" || Value == "armv7r" ||
170178dbd580a02759bbc408dbefb6754afa71b2c24cDaniel Dunbar      Value == "armv7m")
170278dbd580a02759bbc408dbefb6754afa71b2c24cDaniel Dunbar    return "armv7";
170378dbd580a02759bbc408dbefb6754afa71b2c24cDaniel Dunbar
170478dbd580a02759bbc408dbefb6754afa71b2c24cDaniel Dunbar  return 0;
170578dbd580a02759bbc408dbefb6754afa71b2c24cDaniel Dunbar}
170678dbd580a02759bbc408dbefb6754afa71b2c24cDaniel Dunbar
170778dbd580a02759bbc408dbefb6754afa71b2c24cDaniel Dunbar// FIXME: Can we tablegen this?
170878dbd580a02759bbc408dbefb6754afa71b2c24cDaniel Dunbarstatic const char *GetArmArchForMCpu(llvm::StringRef Value) {
170978dbd580a02759bbc408dbefb6754afa71b2c24cDaniel Dunbar  if (Value == "arm10tdmi" || Value == "arm1020t" || Value == "arm9e" ||
171078dbd580a02759bbc408dbefb6754afa71b2c24cDaniel Dunbar      Value == "arm946e-s" || Value == "arm966e-s" ||
171178dbd580a02759bbc408dbefb6754afa71b2c24cDaniel Dunbar      Value == "arm968e-s" || Value == "arm10e" ||
171278dbd580a02759bbc408dbefb6754afa71b2c24cDaniel Dunbar      Value == "arm1020e" || Value == "arm1022e" || Value == "arm926ej-s" ||
171378dbd580a02759bbc408dbefb6754afa71b2c24cDaniel Dunbar      Value == "arm1026ej-s")
171478dbd580a02759bbc408dbefb6754afa71b2c24cDaniel Dunbar    return "armv5";
171578dbd580a02759bbc408dbefb6754afa71b2c24cDaniel Dunbar
171678dbd580a02759bbc408dbefb6754afa71b2c24cDaniel Dunbar  if (Value == "xscale")
171778dbd580a02759bbc408dbefb6754afa71b2c24cDaniel Dunbar    return "xscale";
171878dbd580a02759bbc408dbefb6754afa71b2c24cDaniel Dunbar
171978dbd580a02759bbc408dbefb6754afa71b2c24cDaniel Dunbar  if (Value == "arm1136j-s" || Value == "arm1136jf-s" ||
172078dbd580a02759bbc408dbefb6754afa71b2c24cDaniel Dunbar      Value == "arm1176jz-s" || Value == "arm1176jzf-s")
172178dbd580a02759bbc408dbefb6754afa71b2c24cDaniel Dunbar    return "armv6";
172278dbd580a02759bbc408dbefb6754afa71b2c24cDaniel Dunbar
172378dbd580a02759bbc408dbefb6754afa71b2c24cDaniel Dunbar  if (Value == "cortex-a8" || Value == "cortex-r4" || Value == "cortex-m3")
172478dbd580a02759bbc408dbefb6754afa71b2c24cDaniel Dunbar    return "armv7";
172578dbd580a02759bbc408dbefb6754afa71b2c24cDaniel Dunbar
172678dbd580a02759bbc408dbefb6754afa71b2c24cDaniel Dunbar  return 0;
172778dbd580a02759bbc408dbefb6754afa71b2c24cDaniel Dunbar}
172878dbd580a02759bbc408dbefb6754afa71b2c24cDaniel Dunbar
1729fbefe6bd6f62a3361813498dc672ab0d6c0d4fd1Daniel Dunbarvoid darwin::DarwinTool::AddDarwinArch(const ArgList &Args,
1730fbefe6bd6f62a3361813498dc672ab0d6c0d4fd1Daniel Dunbar                                       ArgStringList &CmdArgs) const {
173102633b541b04ad5ffc1c70f4c2feeeb13e607057Daniel Dunbar  // Derived from darwin_arch spec.
173202633b541b04ad5ffc1c70f4c2feeeb13e607057Daniel Dunbar  CmdArgs.push_back("-arch");
173378dbd580a02759bbc408dbefb6754afa71b2c24cDaniel Dunbar
173478dbd580a02759bbc408dbefb6754afa71b2c24cDaniel Dunbar  switch (getToolChain().getTriple().getArch()) {
173578dbd580a02759bbc408dbefb6754afa71b2c24cDaniel Dunbar  default:
1736881376467c46c5c6cc16fa6790271c2c22e1d4f1Daniel Dunbar    CmdArgs.push_back(Args.MakeArgString(getToolChain().getArchName()));
173778dbd580a02759bbc408dbefb6754afa71b2c24cDaniel Dunbar    break;
173878dbd580a02759bbc408dbefb6754afa71b2c24cDaniel Dunbar
173978dbd580a02759bbc408dbefb6754afa71b2c24cDaniel Dunbar  case llvm::Triple::arm: {
174078dbd580a02759bbc408dbefb6754afa71b2c24cDaniel Dunbar    if (const Arg *A = Args.getLastArg(options::OPT_march_EQ)) {
174178dbd580a02759bbc408dbefb6754afa71b2c24cDaniel Dunbar      if (const char *Arch = GetArmArchForMArch(A->getValue(Args))) {
174278dbd580a02759bbc408dbefb6754afa71b2c24cDaniel Dunbar        CmdArgs.push_back(Arch);
174378dbd580a02759bbc408dbefb6754afa71b2c24cDaniel Dunbar        return;
174478dbd580a02759bbc408dbefb6754afa71b2c24cDaniel Dunbar      }
174578dbd580a02759bbc408dbefb6754afa71b2c24cDaniel Dunbar    }
174678dbd580a02759bbc408dbefb6754afa71b2c24cDaniel Dunbar
174778dbd580a02759bbc408dbefb6754afa71b2c24cDaniel Dunbar    if (const Arg *A = Args.getLastArg(options::OPT_mcpu_EQ)) {
174878dbd580a02759bbc408dbefb6754afa71b2c24cDaniel Dunbar      if (const char *Arch = GetArmArchForMCpu(A->getValue(Args))) {
174978dbd580a02759bbc408dbefb6754afa71b2c24cDaniel Dunbar        CmdArgs.push_back(Arch);
175078dbd580a02759bbc408dbefb6754afa71b2c24cDaniel Dunbar        return;
175178dbd580a02759bbc408dbefb6754afa71b2c24cDaniel Dunbar      }
175278dbd580a02759bbc408dbefb6754afa71b2c24cDaniel Dunbar    }
175378dbd580a02759bbc408dbefb6754afa71b2c24cDaniel Dunbar
175478dbd580a02759bbc408dbefb6754afa71b2c24cDaniel Dunbar    CmdArgs.push_back("arm");
175578dbd580a02759bbc408dbefb6754afa71b2c24cDaniel Dunbar    CmdArgs.push_back("-force_cpusubtype_ALL");
175678dbd580a02759bbc408dbefb6754afa71b2c24cDaniel Dunbar    return;
175778dbd580a02759bbc408dbefb6754afa71b2c24cDaniel Dunbar  }
175878dbd580a02759bbc408dbefb6754afa71b2c24cDaniel Dunbar  }
175902633b541b04ad5ffc1c70f4c2feeeb13e607057Daniel Dunbar}
176002633b541b04ad5ffc1c70f4c2feeeb13e607057Daniel Dunbar
1761fbefe6bd6f62a3361813498dc672ab0d6c0d4fd1Daniel Dunbarvoid darwin::DarwinTool::AddDarwinSubArch(const ArgList &Args,
1762fbefe6bd6f62a3361813498dc672ab0d6c0d4fd1Daniel Dunbar                                          ArgStringList &CmdArgs) const {
176302633b541b04ad5ffc1c70f4c2feeeb13e607057Daniel Dunbar  // Derived from darwin_subarch spec, not sure what the distinction
176402633b541b04ad5ffc1c70f4c2feeeb13e607057Daniel Dunbar  // exists for but at least for this chain it is the same.
176502633b541b04ad5ffc1c70f4c2feeeb13e607057Daniel Dunbar  AddDarwinArch(Args, CmdArgs);
176602633b541b04ad5ffc1c70f4c2feeeb13e607057Daniel Dunbar}
176702633b541b04ad5ffc1c70f4c2feeeb13e607057Daniel Dunbar
1768c21c485b4fb58ef5d55cf3e523263dd824a2ace4Daniel Dunbarvoid darwin::Link::AddLinkArgs(const ArgList &Args,
176902633b541b04ad5ffc1c70f4c2feeeb13e607057Daniel Dunbar                               ArgStringList &CmdArgs) const {
177002633b541b04ad5ffc1c70f4c2feeeb13e607057Daniel Dunbar  const Driver &D = getToolChain().getHost().getDriver();
177102633b541b04ad5ffc1c70f4c2feeeb13e607057Daniel Dunbar
177202633b541b04ad5ffc1c70f4c2feeeb13e607057Daniel Dunbar  // Derived from the "link" spec.
177302633b541b04ad5ffc1c70f4c2feeeb13e607057Daniel Dunbar  Args.AddAllArgs(CmdArgs, options::OPT_static);
177402633b541b04ad5ffc1c70f4c2feeeb13e607057Daniel Dunbar  if (!Args.hasArg(options::OPT_static))
177502633b541b04ad5ffc1c70f4c2feeeb13e607057Daniel Dunbar    CmdArgs.push_back("-dynamic");
177602633b541b04ad5ffc1c70f4c2feeeb13e607057Daniel Dunbar  if (Args.hasArg(options::OPT_fgnu_runtime)) {
177702633b541b04ad5ffc1c70f4c2feeeb13e607057Daniel Dunbar    // FIXME: gcc replaces -lobjc in forward args with -lobjc-gnu
177802633b541b04ad5ffc1c70f4c2feeeb13e607057Daniel Dunbar    // here. How do we wish to handle such things?
177902633b541b04ad5ffc1c70f4c2feeeb13e607057Daniel Dunbar  }
1780c21c485b4fb58ef5d55cf3e523263dd824a2ace4Daniel Dunbar
178102633b541b04ad5ffc1c70f4c2feeeb13e607057Daniel Dunbar  if (!Args.hasArg(options::OPT_dynamiclib)) {
178202633b541b04ad5ffc1c70f4c2feeeb13e607057Daniel Dunbar    if (Args.hasArg(options::OPT_force__cpusubtype__ALL)) {
178302633b541b04ad5ffc1c70f4c2feeeb13e607057Daniel Dunbar      AddDarwinArch(Args, CmdArgs);
178402633b541b04ad5ffc1c70f4c2feeeb13e607057Daniel Dunbar      CmdArgs.push_back("-force_cpusubtype_ALL");
178502633b541b04ad5ffc1c70f4c2feeeb13e607057Daniel Dunbar    } else
178602633b541b04ad5ffc1c70f4c2feeeb13e607057Daniel Dunbar      AddDarwinSubArch(Args, CmdArgs);
178702633b541b04ad5ffc1c70f4c2feeeb13e607057Daniel Dunbar
178802633b541b04ad5ffc1c70f4c2feeeb13e607057Daniel Dunbar    Args.AddLastArg(CmdArgs, options::OPT_bundle);
178902633b541b04ad5ffc1c70f4c2feeeb13e607057Daniel Dunbar    Args.AddAllArgs(CmdArgs, options::OPT_bundle__loader);
179002633b541b04ad5ffc1c70f4c2feeeb13e607057Daniel Dunbar    Args.AddAllArgs(CmdArgs, options::OPT_client__name);
179102633b541b04ad5ffc1c70f4c2feeeb13e607057Daniel Dunbar
179202633b541b04ad5ffc1c70f4c2feeeb13e607057Daniel Dunbar    Arg *A;
179302633b541b04ad5ffc1c70f4c2feeeb13e607057Daniel Dunbar    if ((A = Args.getLastArg(options::OPT_compatibility__version)) ||
179402633b541b04ad5ffc1c70f4c2feeeb13e607057Daniel Dunbar        (A = Args.getLastArg(options::OPT_current__version)) ||
179502633b541b04ad5ffc1c70f4c2feeeb13e607057Daniel Dunbar        (A = Args.getLastArg(options::OPT_install__name)))
179602633b541b04ad5ffc1c70f4c2feeeb13e607057Daniel Dunbar      D.Diag(clang::diag::err_drv_argument_only_allowed_with)
179702633b541b04ad5ffc1c70f4c2feeeb13e607057Daniel Dunbar        << A->getAsString(Args) << "-dynamiclib";
179802633b541b04ad5ffc1c70f4c2feeeb13e607057Daniel Dunbar
179902633b541b04ad5ffc1c70f4c2feeeb13e607057Daniel Dunbar    Args.AddLastArg(CmdArgs, options::OPT_force__flat__namespace);
180002633b541b04ad5ffc1c70f4c2feeeb13e607057Daniel Dunbar    Args.AddLastArg(CmdArgs, options::OPT_keep__private__externs);
180102633b541b04ad5ffc1c70f4c2feeeb13e607057Daniel Dunbar    Args.AddLastArg(CmdArgs, options::OPT_private__bundle);
180202633b541b04ad5ffc1c70f4c2feeeb13e607057Daniel Dunbar  } else {
180302633b541b04ad5ffc1c70f4c2feeeb13e607057Daniel Dunbar    CmdArgs.push_back("-dylib");
180402633b541b04ad5ffc1c70f4c2feeeb13e607057Daniel Dunbar
180502633b541b04ad5ffc1c70f4c2feeeb13e607057Daniel Dunbar    Arg *A;
180602633b541b04ad5ffc1c70f4c2feeeb13e607057Daniel Dunbar    if ((A = Args.getLastArg(options::OPT_bundle)) ||
180702633b541b04ad5ffc1c70f4c2feeeb13e607057Daniel Dunbar        (A = Args.getLastArg(options::OPT_bundle__loader)) ||
180802633b541b04ad5ffc1c70f4c2feeeb13e607057Daniel Dunbar        (A = Args.getLastArg(options::OPT_client__name)) ||
180902633b541b04ad5ffc1c70f4c2feeeb13e607057Daniel Dunbar        (A = Args.getLastArg(options::OPT_force__flat__namespace)) ||
181002633b541b04ad5ffc1c70f4c2feeeb13e607057Daniel Dunbar        (A = Args.getLastArg(options::OPT_keep__private__externs)) ||
181102633b541b04ad5ffc1c70f4c2feeeb13e607057Daniel Dunbar        (A = Args.getLastArg(options::OPT_private__bundle)))
181202633b541b04ad5ffc1c70f4c2feeeb13e607057Daniel Dunbar      D.Diag(clang::diag::err_drv_argument_not_allowed_with)
181302633b541b04ad5ffc1c70f4c2feeeb13e607057Daniel Dunbar        << A->getAsString(Args) << "-dynamiclib";
1814c21c485b4fb58ef5d55cf3e523263dd824a2ace4Daniel Dunbar
181502633b541b04ad5ffc1c70f4c2feeeb13e607057Daniel Dunbar    Args.AddAllArgsTranslated(CmdArgs, options::OPT_compatibility__version,
181602633b541b04ad5ffc1c70f4c2feeeb13e607057Daniel Dunbar                              "-dylib_compatibility_version");
181702633b541b04ad5ffc1c70f4c2feeeb13e607057Daniel Dunbar    Args.AddAllArgsTranslated(CmdArgs, options::OPT_current__version,
181802633b541b04ad5ffc1c70f4c2feeeb13e607057Daniel Dunbar                              "-dylib_current_version");
181902633b541b04ad5ffc1c70f4c2feeeb13e607057Daniel Dunbar
182002633b541b04ad5ffc1c70f4c2feeeb13e607057Daniel Dunbar    if (Args.hasArg(options::OPT_force__cpusubtype__ALL)) {
182102633b541b04ad5ffc1c70f4c2feeeb13e607057Daniel Dunbar      AddDarwinArch(Args, CmdArgs);
1822c21c485b4fb58ef5d55cf3e523263dd824a2ace4Daniel Dunbar      // NOTE: We don't add -force_cpusubtype_ALL on this path. Ok.
182302633b541b04ad5ffc1c70f4c2feeeb13e607057Daniel Dunbar    } else
182402633b541b04ad5ffc1c70f4c2feeeb13e607057Daniel Dunbar      AddDarwinSubArch(Args, CmdArgs);
182502633b541b04ad5ffc1c70f4c2feeeb13e607057Daniel Dunbar
182602633b541b04ad5ffc1c70f4c2feeeb13e607057Daniel Dunbar    Args.AddAllArgsTranslated(CmdArgs, options::OPT_install__name,
182702633b541b04ad5ffc1c70f4c2feeeb13e607057Daniel Dunbar                              "-dylib_install_name");
182802633b541b04ad5ffc1c70f4c2feeeb13e607057Daniel Dunbar  }
182902633b541b04ad5ffc1c70f4c2feeeb13e607057Daniel Dunbar
183002633b541b04ad5ffc1c70f4c2feeeb13e607057Daniel Dunbar  Args.AddLastArg(CmdArgs, options::OPT_all__load);
183102633b541b04ad5ffc1c70f4c2feeeb13e607057Daniel Dunbar  Args.AddAllArgs(CmdArgs, options::OPT_allowable__client);
183202633b541b04ad5ffc1c70f4c2feeeb13e607057Daniel Dunbar  Args.AddLastArg(CmdArgs, options::OPT_bind__at__load);
18331d4612b829500cbe04a2eafca74afac703e34934Daniel Dunbar  if (getDarwinToolChain().isIPhoneOS())
1834d82f8fa53771b454885c546f0fd452a4980b3a3eDaniel Dunbar    Args.AddLastArg(CmdArgs, options::OPT_arch__errors__fatal);
183502633b541b04ad5ffc1c70f4c2feeeb13e607057Daniel Dunbar  Args.AddLastArg(CmdArgs, options::OPT_dead__strip);
183602633b541b04ad5ffc1c70f4c2feeeb13e607057Daniel Dunbar  Args.AddLastArg(CmdArgs, options::OPT_no__dead__strip__inits__and__terms);
183702633b541b04ad5ffc1c70f4c2feeeb13e607057Daniel Dunbar  Args.AddAllArgs(CmdArgs, options::OPT_dylib__file);
183802633b541b04ad5ffc1c70f4c2feeeb13e607057Daniel Dunbar  Args.AddLastArg(CmdArgs, options::OPT_dynamic);
183902633b541b04ad5ffc1c70f4c2feeeb13e607057Daniel Dunbar  Args.AddAllArgs(CmdArgs, options::OPT_exported__symbols__list);
184002633b541b04ad5ffc1c70f4c2feeeb13e607057Daniel Dunbar  Args.AddLastArg(CmdArgs, options::OPT_flat__namespace);
184102633b541b04ad5ffc1c70f4c2feeeb13e607057Daniel Dunbar  Args.AddAllArgs(CmdArgs, options::OPT_headerpad__max__install__names);
184202633b541b04ad5ffc1c70f4c2feeeb13e607057Daniel Dunbar  Args.AddAllArgs(CmdArgs, options::OPT_image__base);
184302633b541b04ad5ffc1c70f4c2feeeb13e607057Daniel Dunbar  Args.AddAllArgs(CmdArgs, options::OPT_init);
184402633b541b04ad5ffc1c70f4c2feeeb13e607057Daniel Dunbar
184530392de4681602f1aabc61b0184b1de53bc172f0Daniel Dunbar  if (!Args.hasArg(options::OPT_mmacosx_version_min_EQ) &&
184630392de4681602f1aabc61b0184b1de53bc172f0Daniel Dunbar      !Args.hasArg(options::OPT_miphoneos_version_min_EQ)) {
184730392de4681602f1aabc61b0184b1de53bc172f0Daniel Dunbar    // Add default version min.
18481d4612b829500cbe04a2eafca74afac703e34934Daniel Dunbar    if (!getDarwinToolChain().isIPhoneOS()) {
1849c21c485b4fb58ef5d55cf3e523263dd824a2ace4Daniel Dunbar      CmdArgs.push_back("-macosx_version_min");
1850c21c485b4fb58ef5d55cf3e523263dd824a2ace4Daniel Dunbar      CmdArgs.push_back(getDarwinToolChain().getMacosxVersionStr());
185130392de4681602f1aabc61b0184b1de53bc172f0Daniel Dunbar    } else {
185230392de4681602f1aabc61b0184b1de53bc172f0Daniel Dunbar      CmdArgs.push_back("-iphoneos_version_min");
185330392de4681602f1aabc61b0184b1de53bc172f0Daniel Dunbar      CmdArgs.push_back(getDarwinToolChain().getIPhoneOSVersionStr());
1854c21c485b4fb58ef5d55cf3e523263dd824a2ace4Daniel Dunbar    }
185502633b541b04ad5ffc1c70f4c2feeeb13e607057Daniel Dunbar  }
185602633b541b04ad5ffc1c70f4c2feeeb13e607057Daniel Dunbar
185730392de4681602f1aabc61b0184b1de53bc172f0Daniel Dunbar  // Adding all arguments doesn't make sense here but this is what
185830392de4681602f1aabc61b0184b1de53bc172f0Daniel Dunbar  // gcc does.
185930392de4681602f1aabc61b0184b1de53bc172f0Daniel Dunbar  Args.AddAllArgsTranslated(CmdArgs, options::OPT_mmacosx_version_min_EQ,
186030392de4681602f1aabc61b0184b1de53bc172f0Daniel Dunbar                              "-macosx_version_min");
186102633b541b04ad5ffc1c70f4c2feeeb13e607057Daniel Dunbar  Args.AddAllArgsTranslated(CmdArgs, options::OPT_miphoneos_version_min_EQ,
186202633b541b04ad5ffc1c70f4c2feeeb13e607057Daniel Dunbar                            "-iphoneos_version_min");
186302633b541b04ad5ffc1c70f4c2feeeb13e607057Daniel Dunbar  Args.AddLastArg(CmdArgs, options::OPT_nomultidefs);
186402633b541b04ad5ffc1c70f4c2feeeb13e607057Daniel Dunbar  Args.AddLastArg(CmdArgs, options::OPT_multi__module);
186502633b541b04ad5ffc1c70f4c2feeeb13e607057Daniel Dunbar  Args.AddLastArg(CmdArgs, options::OPT_single__module);
186602633b541b04ad5ffc1c70f4c2feeeb13e607057Daniel Dunbar  Args.AddAllArgs(CmdArgs, options::OPT_multiply__defined);
186702633b541b04ad5ffc1c70f4c2feeeb13e607057Daniel Dunbar  Args.AddAllArgs(CmdArgs, options::OPT_multiply__defined__unused);
1868c21c485b4fb58ef5d55cf3e523263dd824a2ace4Daniel Dunbar
186902633b541b04ad5ffc1c70f4c2feeeb13e607057Daniel Dunbar  if (Args.hasArg(options::OPT_fpie))
187002633b541b04ad5ffc1c70f4c2feeeb13e607057Daniel Dunbar    CmdArgs.push_back("-pie");
187102633b541b04ad5ffc1c70f4c2feeeb13e607057Daniel Dunbar
187202633b541b04ad5ffc1c70f4c2feeeb13e607057Daniel Dunbar  Args.AddLastArg(CmdArgs, options::OPT_prebind);
187302633b541b04ad5ffc1c70f4c2feeeb13e607057Daniel Dunbar  Args.AddLastArg(CmdArgs, options::OPT_noprebind);
187402633b541b04ad5ffc1c70f4c2feeeb13e607057Daniel Dunbar  Args.AddLastArg(CmdArgs, options::OPT_nofixprebinding);
187502633b541b04ad5ffc1c70f4c2feeeb13e607057Daniel Dunbar  Args.AddLastArg(CmdArgs, options::OPT_prebind__all__twolevel__modules);
187602633b541b04ad5ffc1c70f4c2feeeb13e607057Daniel Dunbar  Args.AddLastArg(CmdArgs, options::OPT_read__only__relocs);
187702633b541b04ad5ffc1c70f4c2feeeb13e607057Daniel Dunbar  Args.AddAllArgs(CmdArgs, options::OPT_sectcreate);
187802633b541b04ad5ffc1c70f4c2feeeb13e607057Daniel Dunbar  Args.AddAllArgs(CmdArgs, options::OPT_sectorder);
187902633b541b04ad5ffc1c70f4c2feeeb13e607057Daniel Dunbar  Args.AddAllArgs(CmdArgs, options::OPT_seg1addr);
188002633b541b04ad5ffc1c70f4c2feeeb13e607057Daniel Dunbar  Args.AddAllArgs(CmdArgs, options::OPT_segprot);
188102633b541b04ad5ffc1c70f4c2feeeb13e607057Daniel Dunbar  Args.AddAllArgs(CmdArgs, options::OPT_segaddr);
188202633b541b04ad5ffc1c70f4c2feeeb13e607057Daniel Dunbar  Args.AddAllArgs(CmdArgs, options::OPT_segs__read__only__addr);
188302633b541b04ad5ffc1c70f4c2feeeb13e607057Daniel Dunbar  Args.AddAllArgs(CmdArgs, options::OPT_segs__read__write__addr);
188402633b541b04ad5ffc1c70f4c2feeeb13e607057Daniel Dunbar  Args.AddAllArgs(CmdArgs, options::OPT_seg__addr__table);
188502633b541b04ad5ffc1c70f4c2feeeb13e607057Daniel Dunbar  Args.AddAllArgs(CmdArgs, options::OPT_seg__addr__table__filename);
188602633b541b04ad5ffc1c70f4c2feeeb13e607057Daniel Dunbar  Args.AddAllArgs(CmdArgs, options::OPT_sub__library);
188702633b541b04ad5ffc1c70f4c2feeeb13e607057Daniel Dunbar  Args.AddAllArgs(CmdArgs, options::OPT_sub__umbrella);
1888d82f8fa53771b454885c546f0fd452a4980b3a3eDaniel Dunbar
188902633b541b04ad5ffc1c70f4c2feeeb13e607057Daniel Dunbar  Args.AddAllArgsTranslated(CmdArgs, options::OPT_isysroot, "-syslibroot");
18901d4612b829500cbe04a2eafca74afac703e34934Daniel Dunbar  if (getDarwinToolChain().isIPhoneOS()) {
1891d82f8fa53771b454885c546f0fd452a4980b3a3eDaniel Dunbar    if (!Args.hasArg(options::OPT_isysroot)) {
1892d82f8fa53771b454885c546f0fd452a4980b3a3eDaniel Dunbar      CmdArgs.push_back("-syslibroot");
1893d82f8fa53771b454885c546f0fd452a4980b3a3eDaniel Dunbar      CmdArgs.push_back("/Developer/SDKs/Extra");
1894d82f8fa53771b454885c546f0fd452a4980b3a3eDaniel Dunbar    }
1895d82f8fa53771b454885c546f0fd452a4980b3a3eDaniel Dunbar  }
1896d82f8fa53771b454885c546f0fd452a4980b3a3eDaniel Dunbar
189702633b541b04ad5ffc1c70f4c2feeeb13e607057Daniel Dunbar  Args.AddLastArg(CmdArgs, options::OPT_twolevel__namespace);
189802633b541b04ad5ffc1c70f4c2feeeb13e607057Daniel Dunbar  Args.AddLastArg(CmdArgs, options::OPT_twolevel__namespace__hints);
189902633b541b04ad5ffc1c70f4c2feeeb13e607057Daniel Dunbar  Args.AddAllArgs(CmdArgs, options::OPT_umbrella);
190002633b541b04ad5ffc1c70f4c2feeeb13e607057Daniel Dunbar  Args.AddAllArgs(CmdArgs, options::OPT_undefined);
190102633b541b04ad5ffc1c70f4c2feeeb13e607057Daniel Dunbar  Args.AddAllArgs(CmdArgs, options::OPT_unexported__symbols__list);
190202633b541b04ad5ffc1c70f4c2feeeb13e607057Daniel Dunbar
1903d82f8fa53771b454885c546f0fd452a4980b3a3eDaniel Dunbar  Args.AddAllArgs(CmdArgs, options::OPT_weak__reference__mismatches);
190402633b541b04ad5ffc1c70f4c2feeeb13e607057Daniel Dunbar  if (!Args.hasArg(options::OPT_weak__reference__mismatches)) {
190502633b541b04ad5ffc1c70f4c2feeeb13e607057Daniel Dunbar    CmdArgs.push_back("-weak_reference_mismatches");
190602633b541b04ad5ffc1c70f4c2feeeb13e607057Daniel Dunbar    CmdArgs.push_back("non-weak");
190702633b541b04ad5ffc1c70f4c2feeeb13e607057Daniel Dunbar  }
190802633b541b04ad5ffc1c70f4c2feeeb13e607057Daniel Dunbar
190902633b541b04ad5ffc1c70f4c2feeeb13e607057Daniel Dunbar  Args.AddLastArg(CmdArgs, options::OPT_X_Flag);
191002633b541b04ad5ffc1c70f4c2feeeb13e607057Daniel Dunbar  Args.AddAllArgs(CmdArgs, options::OPT_y);
191102633b541b04ad5ffc1c70f4c2feeeb13e607057Daniel Dunbar  Args.AddLastArg(CmdArgs, options::OPT_w);
191202633b541b04ad5ffc1c70f4c2feeeb13e607057Daniel Dunbar  Args.AddAllArgs(CmdArgs, options::OPT_pagezero__size);
191302633b541b04ad5ffc1c70f4c2feeeb13e607057Daniel Dunbar  Args.AddAllArgs(CmdArgs, options::OPT_segs__read__);
191402633b541b04ad5ffc1c70f4c2feeeb13e607057Daniel Dunbar  Args.AddLastArg(CmdArgs, options::OPT_seglinkedit);
191502633b541b04ad5ffc1c70f4c2feeeb13e607057Daniel Dunbar  Args.AddLastArg(CmdArgs, options::OPT_noseglinkedit);
191602633b541b04ad5ffc1c70f4c2feeeb13e607057Daniel Dunbar  Args.AddAllArgs(CmdArgs, options::OPT_sectalign);
191702633b541b04ad5ffc1c70f4c2feeeb13e607057Daniel Dunbar  Args.AddAllArgs(CmdArgs, options::OPT_sectobjectsymbols);
191802633b541b04ad5ffc1c70f4c2feeeb13e607057Daniel Dunbar  Args.AddAllArgs(CmdArgs, options::OPT_segcreate);
191902633b541b04ad5ffc1c70f4c2feeeb13e607057Daniel Dunbar  Args.AddLastArg(CmdArgs, options::OPT_whyload);
192002633b541b04ad5ffc1c70f4c2feeeb13e607057Daniel Dunbar  Args.AddLastArg(CmdArgs, options::OPT_whatsloaded);
192102633b541b04ad5ffc1c70f4c2feeeb13e607057Daniel Dunbar  Args.AddAllArgs(CmdArgs, options::OPT_dylinker__install__name);
192202633b541b04ad5ffc1c70f4c2feeeb13e607057Daniel Dunbar  Args.AddLastArg(CmdArgs, options::OPT_dylinker);
192302633b541b04ad5ffc1c70f4c2feeeb13e607057Daniel Dunbar  Args.AddLastArg(CmdArgs, options::OPT_Mach);
192402633b541b04ad5ffc1c70f4c2feeeb13e607057Daniel Dunbar}
192502633b541b04ad5ffc1c70f4c2feeeb13e607057Daniel Dunbar
192602633b541b04ad5ffc1c70f4c2feeeb13e607057Daniel Dunbarvoid darwin::Link::ConstructJob(Compilation &C, const JobAction &JA,
1927c21c485b4fb58ef5d55cf3e523263dd824a2ace4Daniel Dunbar                                Job &Dest, const InputInfo &Output,
1928c21c485b4fb58ef5d55cf3e523263dd824a2ace4Daniel Dunbar                                const InputInfoList &Inputs,
1929c21c485b4fb58ef5d55cf3e523263dd824a2ace4Daniel Dunbar                                const ArgList &Args,
193002633b541b04ad5ffc1c70f4c2feeeb13e607057Daniel Dunbar                                const char *LinkingOutput) const {
193102633b541b04ad5ffc1c70f4c2feeeb13e607057Daniel Dunbar  assert(Output.getType() == types::TY_Image && "Invalid linker output type.");
1932e0be8b1729d8978de433d229c065830b95d0ae68Daniel Dunbar
193302633b541b04ad5ffc1c70f4c2feeeb13e607057Daniel Dunbar  // The logic here is derived from gcc's behavior; most of which
193402633b541b04ad5ffc1c70f4c2feeeb13e607057Daniel Dunbar  // comes from specs (starting with link_command). Consult gcc for
193502633b541b04ad5ffc1c70f4c2feeeb13e607057Daniel Dunbar  // more information.
193602633b541b04ad5ffc1c70f4c2feeeb13e607057Daniel Dunbar  ArgStringList CmdArgs;
193702633b541b04ad5ffc1c70f4c2feeeb13e607057Daniel Dunbar
193802633b541b04ad5ffc1c70f4c2feeeb13e607057Daniel Dunbar  // I'm not sure why this particular decomposition exists in gcc, but
193902633b541b04ad5ffc1c70f4c2feeeb13e607057Daniel Dunbar  // we follow suite for ease of comparison.
194002633b541b04ad5ffc1c70f4c2feeeb13e607057Daniel Dunbar  AddLinkArgs(Args, CmdArgs);
194102633b541b04ad5ffc1c70f4c2feeeb13e607057Daniel Dunbar
194202633b541b04ad5ffc1c70f4c2feeeb13e607057Daniel Dunbar  Args.AddAllArgs(CmdArgs, options::OPT_d_Flag);
194302633b541b04ad5ffc1c70f4c2feeeb13e607057Daniel Dunbar  Args.AddAllArgs(CmdArgs, options::OPT_s);
194402633b541b04ad5ffc1c70f4c2feeeb13e607057Daniel Dunbar  Args.AddAllArgs(CmdArgs, options::OPT_t);
194502633b541b04ad5ffc1c70f4c2feeeb13e607057Daniel Dunbar  Args.AddAllArgs(CmdArgs, options::OPT_Z_Flag);
194602633b541b04ad5ffc1c70f4c2feeeb13e607057Daniel Dunbar  Args.AddAllArgs(CmdArgs, options::OPT_u_Group);
194702633b541b04ad5ffc1c70f4c2feeeb13e607057Daniel Dunbar  Args.AddAllArgs(CmdArgs, options::OPT_A);
194802633b541b04ad5ffc1c70f4c2feeeb13e607057Daniel Dunbar  Args.AddLastArg(CmdArgs, options::OPT_e);
194902633b541b04ad5ffc1c70f4c2feeeb13e607057Daniel Dunbar  Args.AddAllArgs(CmdArgs, options::OPT_m_Separate);
195002633b541b04ad5ffc1c70f4c2feeeb13e607057Daniel Dunbar  Args.AddAllArgs(CmdArgs, options::OPT_r);
195102633b541b04ad5ffc1c70f4c2feeeb13e607057Daniel Dunbar
195202633b541b04ad5ffc1c70f4c2feeeb13e607057Daniel Dunbar  CmdArgs.push_back("-o");
195302633b541b04ad5ffc1c70f4c2feeeb13e607057Daniel Dunbar  CmdArgs.push_back(Output.getFilename());
195402633b541b04ad5ffc1c70f4c2feeeb13e607057Daniel Dunbar
1955608d04cb7bee2db28c8689f6626bf9e0b114c473Daniel Dunbar
1956ae54af2fdcf2262e778f551941541913828fde49Daniel Dunbar  unsigned MacosxVersionMin[3];
195748d5aae4387f07aef99dbe03f4047d709e9f4d35Daniel Dunbar  getDarwinToolChain().getMacosxVersionMin(Args, MacosxVersionMin);
1958c21c485b4fb58ef5d55cf3e523263dd824a2ace4Daniel Dunbar
195902633b541b04ad5ffc1c70f4c2feeeb13e607057Daniel Dunbar  if (!Args.hasArg(options::OPT_A) &&
196002633b541b04ad5ffc1c70f4c2feeeb13e607057Daniel Dunbar      !Args.hasArg(options::OPT_nostdlib) &&
196102633b541b04ad5ffc1c70f4c2feeeb13e607057Daniel Dunbar      !Args.hasArg(options::OPT_nostartfiles)) {
196202633b541b04ad5ffc1c70f4c2feeeb13e607057Daniel Dunbar    // Derived from startfile spec.
196302633b541b04ad5ffc1c70f4c2feeeb13e607057Daniel Dunbar    if (Args.hasArg(options::OPT_dynamiclib)) {
1964c21c485b4fb58ef5d55cf3e523263dd824a2ace4Daniel Dunbar      // Derived from darwin_dylib1 spec.
1965608d04cb7bee2db28c8689f6626bf9e0b114c473Daniel Dunbar      if (getDarwinToolChain().isMacosxVersionLT(MacosxVersionMin, 10, 5))
196602633b541b04ad5ffc1c70f4c2feeeb13e607057Daniel Dunbar        CmdArgs.push_back("-ldylib1.o");
1967608d04cb7bee2db28c8689f6626bf9e0b114c473Daniel Dunbar      else if (getDarwinToolChain().isMacosxVersionLT(MacosxVersionMin, 10, 6))
196802633b541b04ad5ffc1c70f4c2feeeb13e607057Daniel Dunbar        CmdArgs.push_back("-ldylib1.10.5.o");
196902633b541b04ad5ffc1c70f4c2feeeb13e607057Daniel Dunbar    } else {
197002633b541b04ad5ffc1c70f4c2feeeb13e607057Daniel Dunbar      if (Args.hasArg(options::OPT_bundle)) {
19718a8d8afa3df40e9f122d2b826f1a825a66f6908dDaniel Dunbar        if (!Args.hasArg(options::OPT_static)) {
19728a8d8afa3df40e9f122d2b826f1a825a66f6908dDaniel Dunbar          // Derived from darwin_bundle1 spec.
1973608d04cb7bee2db28c8689f6626bf9e0b114c473Daniel Dunbar          if (getDarwinToolChain().isMacosxVersionLT(MacosxVersionMin, 10, 6))
19748a8d8afa3df40e9f122d2b826f1a825a66f6908dDaniel Dunbar            CmdArgs.push_back("-lbundle1.o");
19758a8d8afa3df40e9f122d2b826f1a825a66f6908dDaniel Dunbar        }
197602633b541b04ad5ffc1c70f4c2feeeb13e607057Daniel Dunbar      } else {
197702633b541b04ad5ffc1c70f4c2feeeb13e607057Daniel Dunbar        if (Args.hasArg(options::OPT_pg)) {
197802633b541b04ad5ffc1c70f4c2feeeb13e607057Daniel Dunbar          if (Args.hasArg(options::OPT_static) ||
197902633b541b04ad5ffc1c70f4c2feeeb13e607057Daniel Dunbar              Args.hasArg(options::OPT_object) ||
198002633b541b04ad5ffc1c70f4c2feeeb13e607057Daniel Dunbar              Args.hasArg(options::OPT_preload)) {
198102633b541b04ad5ffc1c70f4c2feeeb13e607057Daniel Dunbar            CmdArgs.push_back("-lgcrt0.o");
198202633b541b04ad5ffc1c70f4c2feeeb13e607057Daniel Dunbar          } else {
198302633b541b04ad5ffc1c70f4c2feeeb13e607057Daniel Dunbar            CmdArgs.push_back("-lgcrt1.o");
1984c21c485b4fb58ef5d55cf3e523263dd824a2ace4Daniel Dunbar
198502633b541b04ad5ffc1c70f4c2feeeb13e607057Daniel Dunbar            // darwin_crt2 spec is empty.
1986c21c485b4fb58ef5d55cf3e523263dd824a2ace4Daniel Dunbar          }
198702633b541b04ad5ffc1c70f4c2feeeb13e607057Daniel Dunbar        } else {
198802633b541b04ad5ffc1c70f4c2feeeb13e607057Daniel Dunbar          if (Args.hasArg(options::OPT_static) ||
198902633b541b04ad5ffc1c70f4c2feeeb13e607057Daniel Dunbar              Args.hasArg(options::OPT_object) ||
199002633b541b04ad5ffc1c70f4c2feeeb13e607057Daniel Dunbar              Args.hasArg(options::OPT_preload)) {
199102633b541b04ad5ffc1c70f4c2feeeb13e607057Daniel Dunbar            CmdArgs.push_back("-lcrt0.o");
199202633b541b04ad5ffc1c70f4c2feeeb13e607057Daniel Dunbar          } else {
199302633b541b04ad5ffc1c70f4c2feeeb13e607057Daniel Dunbar            // Derived from darwin_crt1 spec.
19941d4612b829500cbe04a2eafca74afac703e34934Daniel Dunbar            if (getDarwinToolChain().isIPhoneOS()) {
1995ae33f8ff4749dd69060c70dae15e68e454dc3011Daniel Dunbar              CmdArgs.push_back("-lcrt1.o");
1996608d04cb7bee2db28c8689f6626bf9e0b114c473Daniel Dunbar            } else if (getDarwinToolChain().isMacosxVersionLT(MacosxVersionMin,
1997608d04cb7bee2db28c8689f6626bf9e0b114c473Daniel Dunbar                                                              10, 5))
199802633b541b04ad5ffc1c70f4c2feeeb13e607057Daniel Dunbar              CmdArgs.push_back("-lcrt1.o");
1999608d04cb7bee2db28c8689f6626bf9e0b114c473Daniel Dunbar            else if (getDarwinToolChain().isMacosxVersionLT(MacosxVersionMin,
2000608d04cb7bee2db28c8689f6626bf9e0b114c473Daniel Dunbar                                                            10, 6))
200102633b541b04ad5ffc1c70f4c2feeeb13e607057Daniel Dunbar              CmdArgs.push_back("-lcrt1.10.5.o");
20028a8d8afa3df40e9f122d2b826f1a825a66f6908dDaniel Dunbar            else
20038a8d8afa3df40e9f122d2b826f1a825a66f6908dDaniel Dunbar              CmdArgs.push_back("-lcrt1.10.6.o");
2004c21c485b4fb58ef5d55cf3e523263dd824a2ace4Daniel Dunbar
20058a8d8afa3df40e9f122d2b826f1a825a66f6908dDaniel Dunbar            // darwin_crt2 spec is empty.
200602633b541b04ad5ffc1c70f4c2feeeb13e607057Daniel Dunbar          }
200702633b541b04ad5ffc1c70f4c2feeeb13e607057Daniel Dunbar        }
200802633b541b04ad5ffc1c70f4c2feeeb13e607057Daniel Dunbar      }
200902633b541b04ad5ffc1c70f4c2feeeb13e607057Daniel Dunbar    }
201002633b541b04ad5ffc1c70f4c2feeeb13e607057Daniel Dunbar
201102633b541b04ad5ffc1c70f4c2feeeb13e607057Daniel Dunbar    if (Args.hasArg(options::OPT_shared_libgcc) &&
201202633b541b04ad5ffc1c70f4c2feeeb13e607057Daniel Dunbar        !Args.hasArg(options::OPT_miphoneos_version_min_EQ) &&
2013608d04cb7bee2db28c8689f6626bf9e0b114c473Daniel Dunbar        getDarwinToolChain().isMacosxVersionLT(MacosxVersionMin, 10, 5)) {
2014881376467c46c5c6cc16fa6790271c2c22e1d4f1Daniel Dunbar      const char *Str =
20155ed34f4c58b6ad4e21038d713c1fae31a6146ff5Daniel Dunbar        Args.MakeArgString(getToolChain().GetFilePath(C, "crt3.o"));
2016881376467c46c5c6cc16fa6790271c2c22e1d4f1Daniel Dunbar      CmdArgs.push_back(Str);
201702633b541b04ad5ffc1c70f4c2feeeb13e607057Daniel Dunbar    }
201802633b541b04ad5ffc1c70f4c2feeeb13e607057Daniel Dunbar  }
201902633b541b04ad5ffc1c70f4c2feeeb13e607057Daniel Dunbar
202002633b541b04ad5ffc1c70f4c2feeeb13e607057Daniel Dunbar  Args.AddAllArgs(CmdArgs, options::OPT_L);
2021c21c485b4fb58ef5d55cf3e523263dd824a2ace4Daniel Dunbar
202202633b541b04ad5ffc1c70f4c2feeeb13e607057Daniel Dunbar  if (Args.hasArg(options::OPT_fopenmp))
202302633b541b04ad5ffc1c70f4c2feeeb13e607057Daniel Dunbar    // This is more complicated in gcc...
202402633b541b04ad5ffc1c70f4c2feeeb13e607057Daniel Dunbar    CmdArgs.push_back("-lgomp");
202502633b541b04ad5ffc1c70f4c2feeeb13e607057Daniel Dunbar
20266b200b2b698b6ac9e310f2225c69c85d28ae4fb0Daniel Dunbar  getDarwinToolChain().AddLinkSearchPathArgs(Args, CmdArgs);
2027c21c485b4fb58ef5d55cf3e523263dd824a2ace4Daniel Dunbar
202802633b541b04ad5ffc1c70f4c2feeeb13e607057Daniel Dunbar  for (InputInfoList::const_iterator
202902633b541b04ad5ffc1c70f4c2feeeb13e607057Daniel Dunbar         it = Inputs.begin(), ie = Inputs.end(); it != ie; ++it) {
203002633b541b04ad5ffc1c70f4c2feeeb13e607057Daniel Dunbar    const InputInfo &II = *it;
203102633b541b04ad5ffc1c70f4c2feeeb13e607057Daniel Dunbar    if (II.isFilename())
203202633b541b04ad5ffc1c70f4c2feeeb13e607057Daniel Dunbar      CmdArgs.push_back(II.getFilename());
2033c21c485b4fb58ef5d55cf3e523263dd824a2ace4Daniel Dunbar    else
203402633b541b04ad5ffc1c70f4c2feeeb13e607057Daniel Dunbar      II.getInputArg().renderAsInput(Args, CmdArgs);
203502633b541b04ad5ffc1c70f4c2feeeb13e607057Daniel Dunbar  }
203602633b541b04ad5ffc1c70f4c2feeeb13e607057Daniel Dunbar
203702633b541b04ad5ffc1c70f4c2feeeb13e607057Daniel Dunbar  if (LinkingOutput) {
203802633b541b04ad5ffc1c70f4c2feeeb13e607057Daniel Dunbar    CmdArgs.push_back("-arch_multiple");
203902633b541b04ad5ffc1c70f4c2feeeb13e607057Daniel Dunbar    CmdArgs.push_back("-final_output");
204002633b541b04ad5ffc1c70f4c2feeeb13e607057Daniel Dunbar    CmdArgs.push_back(LinkingOutput);
204102633b541b04ad5ffc1c70f4c2feeeb13e607057Daniel Dunbar  }
204202633b541b04ad5ffc1c70f4c2feeeb13e607057Daniel Dunbar
204302633b541b04ad5ffc1c70f4c2feeeb13e607057Daniel Dunbar  if (Args.hasArg(options::OPT_fprofile_arcs) ||
204402633b541b04ad5ffc1c70f4c2feeeb13e607057Daniel Dunbar      Args.hasArg(options::OPT_fprofile_generate) ||
204502633b541b04ad5ffc1c70f4c2feeeb13e607057Daniel Dunbar      Args.hasArg(options::OPT_fcreate_profile) ||
204602633b541b04ad5ffc1c70f4c2feeeb13e607057Daniel Dunbar      Args.hasArg(options::OPT_coverage))
204702633b541b04ad5ffc1c70f4c2feeeb13e607057Daniel Dunbar    CmdArgs.push_back("-lgcov");
2048c21c485b4fb58ef5d55cf3e523263dd824a2ace4Daniel Dunbar
204902633b541b04ad5ffc1c70f4c2feeeb13e607057Daniel Dunbar  if (Args.hasArg(options::OPT_fnested_functions))
205002633b541b04ad5ffc1c70f4c2feeeb13e607057Daniel Dunbar    CmdArgs.push_back("-allow_stack_execute");
2051c21c485b4fb58ef5d55cf3e523263dd824a2ace4Daniel Dunbar
205202633b541b04ad5ffc1c70f4c2feeeb13e607057Daniel Dunbar  if (!Args.hasArg(options::OPT_nostdlib) &&
205302633b541b04ad5ffc1c70f4c2feeeb13e607057Daniel Dunbar      !Args.hasArg(options::OPT_nodefaultlibs)) {
2054edfa02b85b186e9ea9e0c841539a77ed32ee9148Daniel Dunbar    // FIXME: g++ is more complicated here, it tries to put -lstdc++
2055edfa02b85b186e9ea9e0c841539a77ed32ee9148Daniel Dunbar    // before -lm, for example.
2056edfa02b85b186e9ea9e0c841539a77ed32ee9148Daniel Dunbar    if (getToolChain().getHost().getDriver().CCCIsCXX)
2057edfa02b85b186e9ea9e0c841539a77ed32ee9148Daniel Dunbar      CmdArgs.push_back("-lstdc++");
2058edfa02b85b186e9ea9e0c841539a77ed32ee9148Daniel Dunbar
205902633b541b04ad5ffc1c70f4c2feeeb13e607057Daniel Dunbar    // link_ssp spec is empty.
206002633b541b04ad5ffc1c70f4c2feeeb13e607057Daniel Dunbar
20616cd4154b9088fa18ae05d11c0f3140fafd76c734Daniel Dunbar    // Let the tool chain choose which runtime library to link.
20626cd4154b9088fa18ae05d11c0f3140fafd76c734Daniel Dunbar    getDarwinToolChain().AddLinkRuntimeLibArgs(Args, CmdArgs);
206302633b541b04ad5ffc1c70f4c2feeeb13e607057Daniel Dunbar  }
206402633b541b04ad5ffc1c70f4c2feeeb13e607057Daniel Dunbar
206502633b541b04ad5ffc1c70f4c2feeeb13e607057Daniel Dunbar  if (!Args.hasArg(options::OPT_A) &&
206602633b541b04ad5ffc1c70f4c2feeeb13e607057Daniel Dunbar      !Args.hasArg(options::OPT_nostdlib) &&
206702633b541b04ad5ffc1c70f4c2feeeb13e607057Daniel Dunbar      !Args.hasArg(options::OPT_nostartfiles)) {
206802633b541b04ad5ffc1c70f4c2feeeb13e607057Daniel Dunbar    // endfile_spec is empty.
206902633b541b04ad5ffc1c70f4c2feeeb13e607057Daniel Dunbar  }
207002633b541b04ad5ffc1c70f4c2feeeb13e607057Daniel Dunbar
207102633b541b04ad5ffc1c70f4c2feeeb13e607057Daniel Dunbar  Args.AddAllArgs(CmdArgs, options::OPT_T_Group);
207202633b541b04ad5ffc1c70f4c2feeeb13e607057Daniel Dunbar  Args.AddAllArgs(CmdArgs, options::OPT_F);
207302633b541b04ad5ffc1c70f4c2feeeb13e607057Daniel Dunbar
2074c21c485b4fb58ef5d55cf3e523263dd824a2ace4Daniel Dunbar  const char *Exec =
20755ed34f4c58b6ad4e21038d713c1fae31a6146ff5Daniel Dunbar    Args.MakeArgString(getToolChain().GetProgramPath(C, "ld"));
2076cae087e164e94e4286c11bf694dd0ff88f295302Daniel Dunbar  Dest.addCommand(new Command(JA, Exec, CmdArgs));
207702633b541b04ad5ffc1c70f4c2feeeb13e607057Daniel Dunbar
20780b46e1b5389615a8d6641f4d7bf5415d29acfef3Daniel Dunbar  // Find the first non-empty base input (we want to ignore linker
20790b46e1b5389615a8d6641f4d7bf5415d29acfef3Daniel Dunbar  // inputs).
20800b46e1b5389615a8d6641f4d7bf5415d29acfef3Daniel Dunbar  const char *BaseInput = "";
20810b46e1b5389615a8d6641f4d7bf5415d29acfef3Daniel Dunbar  for (unsigned i = 0, e = Inputs.size(); i != e; ++i) {
20820b46e1b5389615a8d6641f4d7bf5415d29acfef3Daniel Dunbar    if (Inputs[i].getBaseInput()[0] != '\0') {
20830b46e1b5389615a8d6641f4d7bf5415d29acfef3Daniel Dunbar      BaseInput = Inputs[i].getBaseInput();
20840b46e1b5389615a8d6641f4d7bf5415d29acfef3Daniel Dunbar      break;
20850b46e1b5389615a8d6641f4d7bf5415d29acfef3Daniel Dunbar    }
20860b46e1b5389615a8d6641f4d7bf5415d29acfef3Daniel Dunbar  }
2087c21c485b4fb58ef5d55cf3e523263dd824a2ace4Daniel Dunbar
20883ed294522653323e4867a2eba03acc98a99e5479Daniel Dunbar  // Run dsymutil if we are making an executable in a single step.
20893ed294522653323e4867a2eba03acc98a99e5479Daniel Dunbar  //
20903ed294522653323e4867a2eba03acc98a99e5479Daniel Dunbar  // FIXME: Currently we don't want to do this when we are part of a
20913ed294522653323e4867a2eba03acc98a99e5479Daniel Dunbar  // universal build step, as this would end up creating stray temp
20923ed294522653323e4867a2eba03acc98a99e5479Daniel Dunbar  // files.
20933ed294522653323e4867a2eba03acc98a99e5479Daniel Dunbar  if (!LinkingOutput &&
20943ed294522653323e4867a2eba03acc98a99e5479Daniel Dunbar      Args.getLastArg(options::OPT_g_Group) &&
209502633b541b04ad5ffc1c70f4c2feeeb13e607057Daniel Dunbar      !Args.getLastArg(options::OPT_gstabs) &&
209602633b541b04ad5ffc1c70f4c2feeeb13e607057Daniel Dunbar      !Args.getLastArg(options::OPT_g0)) {
209702633b541b04ad5ffc1c70f4c2feeeb13e607057Daniel Dunbar    // FIXME: This is gross, but matches gcc. The test only considers
209802633b541b04ad5ffc1c70f4c2feeeb13e607057Daniel Dunbar    // the suffix (not the -x type), and then only of the first
20990b46e1b5389615a8d6641f4d7bf5415d29acfef3Daniel Dunbar    // source input. Awesome.
21000b46e1b5389615a8d6641f4d7bf5415d29acfef3Daniel Dunbar    const char *Suffix = strrchr(BaseInput, '.');
210102633b541b04ad5ffc1c70f4c2feeeb13e607057Daniel Dunbar    if (Suffix && isSourceSuffix(Suffix + 1)) {
2102c21c485b4fb58ef5d55cf3e523263dd824a2ace4Daniel Dunbar      const char *Exec =
21035ed34f4c58b6ad4e21038d713c1fae31a6146ff5Daniel Dunbar        Args.MakeArgString(getToolChain().GetProgramPath(C, "dsymutil"));
210402633b541b04ad5ffc1c70f4c2feeeb13e607057Daniel Dunbar      ArgStringList CmdArgs;
210502633b541b04ad5ffc1c70f4c2feeeb13e607057Daniel Dunbar      CmdArgs.push_back(Output.getFilename());
2106cae087e164e94e4286c11bf694dd0ff88f295302Daniel Dunbar      C.getJobs().addCommand(new Command(JA, Exec, CmdArgs));
210702633b541b04ad5ffc1c70f4c2feeeb13e607057Daniel Dunbar    }
210802633b541b04ad5ffc1c70f4c2feeeb13e607057Daniel Dunbar  }
210902633b541b04ad5ffc1c70f4c2feeeb13e607057Daniel Dunbar}
211002633b541b04ad5ffc1c70f4c2feeeb13e607057Daniel Dunbar
2111ff7488dc9a766f94daf54d81b03ab9160d0bfd88Daniel Dunbarvoid darwin::Lipo::ConstructJob(Compilation &C, const JobAction &JA,
2112c21c485b4fb58ef5d55cf3e523263dd824a2ace4Daniel Dunbar                                Job &Dest, const InputInfo &Output,
2113c21c485b4fb58ef5d55cf3e523263dd824a2ace4Daniel Dunbar                                const InputInfoList &Inputs,
2114c21c485b4fb58ef5d55cf3e523263dd824a2ace4Daniel Dunbar                                const ArgList &Args,
2115ff7488dc9a766f94daf54d81b03ab9160d0bfd88Daniel Dunbar                                const char *LinkingOutput) const {
2116ff7488dc9a766f94daf54d81b03ab9160d0bfd88Daniel Dunbar  ArgStringList CmdArgs;
2117ff7488dc9a766f94daf54d81b03ab9160d0bfd88Daniel Dunbar
2118ff7488dc9a766f94daf54d81b03ab9160d0bfd88Daniel Dunbar  CmdArgs.push_back("-create");
2119ff7488dc9a766f94daf54d81b03ab9160d0bfd88Daniel Dunbar  assert(Output.isFilename() && "Unexpected lipo output.");
2120a428df828ea4cc6916ea90dcd9fbbc840776d207Daniel Dunbar
2121a428df828ea4cc6916ea90dcd9fbbc840776d207Daniel Dunbar  CmdArgs.push_back("-output");
2122ff7488dc9a766f94daf54d81b03ab9160d0bfd88Daniel Dunbar  CmdArgs.push_back(Output.getFilename());
2123a428df828ea4cc6916ea90dcd9fbbc840776d207Daniel Dunbar
2124ff7488dc9a766f94daf54d81b03ab9160d0bfd88Daniel Dunbar  for (InputInfoList::const_iterator
2125ff7488dc9a766f94daf54d81b03ab9160d0bfd88Daniel Dunbar         it = Inputs.begin(), ie = Inputs.end(); it != ie; ++it) {
2126ff7488dc9a766f94daf54d81b03ab9160d0bfd88Daniel Dunbar    const InputInfo &II = *it;
2127ff7488dc9a766f94daf54d81b03ab9160d0bfd88Daniel Dunbar    assert(II.isFilename() && "Unexpected lipo input.");
2128ff7488dc9a766f94daf54d81b03ab9160d0bfd88Daniel Dunbar    CmdArgs.push_back(II.getFilename());
2129ff7488dc9a766f94daf54d81b03ab9160d0bfd88Daniel Dunbar  }
2130c21c485b4fb58ef5d55cf3e523263dd824a2ace4Daniel Dunbar  const char *Exec =
21315ed34f4c58b6ad4e21038d713c1fae31a6146ff5Daniel Dunbar    Args.MakeArgString(getToolChain().GetProgramPath(C, "lipo"));
2132cae087e164e94e4286c11bf694dd0ff88f295302Daniel Dunbar  Dest.addCommand(new Command(JA, Exec, CmdArgs));
2133ff7488dc9a766f94daf54d81b03ab9160d0bfd88Daniel Dunbar}
213468a31d406c6dc4382c700d1199b062de2aa7e1daDaniel Dunbar
2135e7925a075f110ab21afeae084670a155dea568e3Edward O'Callaghanvoid auroraux::Assemble::ConstructJob(Compilation &C, const JobAction &JA,
2136e7925a075f110ab21afeae084670a155dea568e3Edward O'Callaghan                                     Job &Dest, const InputInfo &Output,
2137e7925a075f110ab21afeae084670a155dea568e3Edward O'Callaghan                                     const InputInfoList &Inputs,
2138e7925a075f110ab21afeae084670a155dea568e3Edward O'Callaghan                                     const ArgList &Args,
21391eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump                                     const char *LinkingOutput) const {
2140e7925a075f110ab21afeae084670a155dea568e3Edward O'Callaghan  ArgStringList CmdArgs;
2141e7925a075f110ab21afeae084670a155dea568e3Edward O'Callaghan
2142e7925a075f110ab21afeae084670a155dea568e3Edward O'Callaghan  Args.AddAllArgValues(CmdArgs, options::OPT_Wa_COMMA,
2143e7925a075f110ab21afeae084670a155dea568e3Edward O'Callaghan                       options::OPT_Xassembler);
2144e7925a075f110ab21afeae084670a155dea568e3Edward O'Callaghan
2145e7925a075f110ab21afeae084670a155dea568e3Edward O'Callaghan  CmdArgs.push_back("-o");
2146e7925a075f110ab21afeae084670a155dea568e3Edward O'Callaghan  if (Output.isPipe())
2147e7925a075f110ab21afeae084670a155dea568e3Edward O'Callaghan    CmdArgs.push_back("-");
2148e7925a075f110ab21afeae084670a155dea568e3Edward O'Callaghan  else
2149e7925a075f110ab21afeae084670a155dea568e3Edward O'Callaghan    CmdArgs.push_back(Output.getFilename());
2150e7925a075f110ab21afeae084670a155dea568e3Edward O'Callaghan
2151e7925a075f110ab21afeae084670a155dea568e3Edward O'Callaghan  for (InputInfoList::const_iterator
2152e7925a075f110ab21afeae084670a155dea568e3Edward O'Callaghan         it = Inputs.begin(), ie = Inputs.end(); it != ie; ++it) {
2153e7925a075f110ab21afeae084670a155dea568e3Edward O'Callaghan    const InputInfo &II = *it;
2154e7925a075f110ab21afeae084670a155dea568e3Edward O'Callaghan    if (II.isPipe())
2155e7925a075f110ab21afeae084670a155dea568e3Edward O'Callaghan      CmdArgs.push_back("-");
2156e7925a075f110ab21afeae084670a155dea568e3Edward O'Callaghan    else
2157e7925a075f110ab21afeae084670a155dea568e3Edward O'Callaghan      CmdArgs.push_back(II.getFilename());
2158e7925a075f110ab21afeae084670a155dea568e3Edward O'Callaghan  }
2159e7925a075f110ab21afeae084670a155dea568e3Edward O'Callaghan
2160e7925a075f110ab21afeae084670a155dea568e3Edward O'Callaghan  const char *Exec =
2161ff430e6d68d1bea07046adafa28a52b314eeaa88Edward O'Callaghan    Args.MakeArgString(getToolChain().GetProgramPath(C, "gas"));
2162e7925a075f110ab21afeae084670a155dea568e3Edward O'Callaghan  Dest.addCommand(new Command(JA, Exec, CmdArgs));
2163e7925a075f110ab21afeae084670a155dea568e3Edward O'Callaghan}
2164e7925a075f110ab21afeae084670a155dea568e3Edward O'Callaghan
2165e7925a075f110ab21afeae084670a155dea568e3Edward O'Callaghanvoid auroraux::Link::ConstructJob(Compilation &C, const JobAction &JA,
2166e7925a075f110ab21afeae084670a155dea568e3Edward O'Callaghan                                 Job &Dest, const InputInfo &Output,
2167e7925a075f110ab21afeae084670a155dea568e3Edward O'Callaghan                                 const InputInfoList &Inputs,
2168e7925a075f110ab21afeae084670a155dea568e3Edward O'Callaghan                                 const ArgList &Args,
2169e7925a075f110ab21afeae084670a155dea568e3Edward O'Callaghan                                 const char *LinkingOutput) const {
2170e7925a075f110ab21afeae084670a155dea568e3Edward O'Callaghan  const Driver &D = getToolChain().getHost().getDriver();
2171e7925a075f110ab21afeae084670a155dea568e3Edward O'Callaghan  ArgStringList CmdArgs;
2172e7925a075f110ab21afeae084670a155dea568e3Edward O'Callaghan
2173e7925a075f110ab21afeae084670a155dea568e3Edward O'Callaghan  if ((!Args.hasArg(options::OPT_nostdlib)) &&
2174e7925a075f110ab21afeae084670a155dea568e3Edward O'Callaghan     (!Args.hasArg(options::OPT_shared))) {
2175e7925a075f110ab21afeae084670a155dea568e3Edward O'Callaghan    CmdArgs.push_back("-e");
21767adf94906e23eae295a006659c55eab9ffcf8b37Edward O'Callaghan    CmdArgs.push_back("_start");
2177e7925a075f110ab21afeae084670a155dea568e3Edward O'Callaghan  }
2178e7925a075f110ab21afeae084670a155dea568e3Edward O'Callaghan
2179e7925a075f110ab21afeae084670a155dea568e3Edward O'Callaghan  if (Args.hasArg(options::OPT_static)) {
2180e7925a075f110ab21afeae084670a155dea568e3Edward O'Callaghan    CmdArgs.push_back("-Bstatic");
21817adf94906e23eae295a006659c55eab9ffcf8b37Edward O'Callaghan    CmdArgs.push_back("-dn");
2182e7925a075f110ab21afeae084670a155dea568e3Edward O'Callaghan  } else {
21837adf94906e23eae295a006659c55eab9ffcf8b37Edward O'Callaghan//    CmdArgs.push_back("--eh-frame-hdr");
2184e7925a075f110ab21afeae084670a155dea568e3Edward O'Callaghan    CmdArgs.push_back("-Bdynamic");
2185e7925a075f110ab21afeae084670a155dea568e3Edward O'Callaghan    if (Args.hasArg(options::OPT_shared)) {
2186e7925a075f110ab21afeae084670a155dea568e3Edward O'Callaghan      CmdArgs.push_back("-shared");
2187e7925a075f110ab21afeae084670a155dea568e3Edward O'Callaghan    } else {
21883cecc19f606ba1000da885b8ff4c089abad224ddEdward O'Callaghan      CmdArgs.push_back("--dynamic-linker");
2189e7925a075f110ab21afeae084670a155dea568e3Edward O'Callaghan      CmdArgs.push_back("/lib/ld.so.1"); // 64Bit Path /lib/amd64/ld.so.1
2190e7925a075f110ab21afeae084670a155dea568e3Edward O'Callaghan    }
2191e7925a075f110ab21afeae084670a155dea568e3Edward O'Callaghan  }
2192e7925a075f110ab21afeae084670a155dea568e3Edward O'Callaghan
2193e7925a075f110ab21afeae084670a155dea568e3Edward O'Callaghan  if (Output.isPipe()) {
2194e7925a075f110ab21afeae084670a155dea568e3Edward O'Callaghan    CmdArgs.push_back("-o");
2195e7925a075f110ab21afeae084670a155dea568e3Edward O'Callaghan    CmdArgs.push_back("-");
2196e7925a075f110ab21afeae084670a155dea568e3Edward O'Callaghan  } else if (Output.isFilename()) {
2197e7925a075f110ab21afeae084670a155dea568e3Edward O'Callaghan    CmdArgs.push_back("-o");
2198e7925a075f110ab21afeae084670a155dea568e3Edward O'Callaghan    CmdArgs.push_back(Output.getFilename());
2199e7925a075f110ab21afeae084670a155dea568e3Edward O'Callaghan  } else {
2200e7925a075f110ab21afeae084670a155dea568e3Edward O'Callaghan    assert(Output.isNothing() && "Invalid output.");
2201e7925a075f110ab21afeae084670a155dea568e3Edward O'Callaghan  }
2202e7925a075f110ab21afeae084670a155dea568e3Edward O'Callaghan
2203e7925a075f110ab21afeae084670a155dea568e3Edward O'Callaghan  if (!Args.hasArg(options::OPT_nostdlib) &&
2204e7925a075f110ab21afeae084670a155dea568e3Edward O'Callaghan      !Args.hasArg(options::OPT_nostartfiles)) {
2205e7925a075f110ab21afeae084670a155dea568e3Edward O'Callaghan    if (!Args.hasArg(options::OPT_shared)) {
22067adf94906e23eae295a006659c55eab9ffcf8b37Edward O'Callaghan      CmdArgs.push_back(Args.MakeArgString(getToolChain().GetFilePath(C, "crt1.o")));
22077adf94906e23eae295a006659c55eab9ffcf8b37Edward O'Callaghan      CmdArgs.push_back(Args.MakeArgString(getToolChain().GetFilePath(C, "crti.o")));
22085ed34f4c58b6ad4e21038d713c1fae31a6146ff5Daniel Dunbar      CmdArgs.push_back(Args.MakeArgString(getToolChain().GetFilePath(C, "crtbegin.o")));
2209e7925a075f110ab21afeae084670a155dea568e3Edward O'Callaghan    } else {
22107adf94906e23eae295a006659c55eab9ffcf8b37Edward O'Callaghan      CmdArgs.push_back(Args.MakeArgString(getToolChain().GetFilePath(C, "crti.o")));
22117adf94906e23eae295a006659c55eab9ffcf8b37Edward O'Callaghan//      CmdArgs.push_back(Args.MakeArgString(getToolChain().GetFilePath(C, "crtbeginS.o")));
2212e7925a075f110ab21afeae084670a155dea568e3Edward O'Callaghan    }
22137adf94906e23eae295a006659c55eab9ffcf8b37Edward O'Callaghan    CmdArgs.push_back(Args.MakeArgString(getToolChain().GetFilePath(C, "crtn.o")));
2214e7925a075f110ab21afeae084670a155dea568e3Edward O'Callaghan  }
2215e7925a075f110ab21afeae084670a155dea568e3Edward O'Callaghan
2216e7925a075f110ab21afeae084670a155dea568e3Edward O'Callaghan  CmdArgs.push_back(MakeFormattedString(Args,
2217e7925a075f110ab21afeae084670a155dea568e3Edward O'Callaghan                           llvm::format("-L/opt/gcc4/lib/gcc/%s/4.2.4",
2218e7925a075f110ab21afeae084670a155dea568e3Edward O'Callaghan                           getToolChain().getTripleString().c_str())));
2219e7925a075f110ab21afeae084670a155dea568e3Edward O'Callaghan
2220e7925a075f110ab21afeae084670a155dea568e3Edward O'Callaghan  Args.AddAllArgs(CmdArgs, options::OPT_L);
2221e7925a075f110ab21afeae084670a155dea568e3Edward O'Callaghan  Args.AddAllArgs(CmdArgs, options::OPT_T_Group);
2222e7925a075f110ab21afeae084670a155dea568e3Edward O'Callaghan  Args.AddAllArgs(CmdArgs, options::OPT_e);
2223e7925a075f110ab21afeae084670a155dea568e3Edward O'Callaghan
2224e7925a075f110ab21afeae084670a155dea568e3Edward O'Callaghan  for (InputInfoList::const_iterator
2225e7925a075f110ab21afeae084670a155dea568e3Edward O'Callaghan         it = Inputs.begin(), ie = Inputs.end(); it != ie; ++it) {
2226e7925a075f110ab21afeae084670a155dea568e3Edward O'Callaghan    const InputInfo &II = *it;
2227e7925a075f110ab21afeae084670a155dea568e3Edward O'Callaghan
2228e7925a075f110ab21afeae084670a155dea568e3Edward O'Callaghan    // Don't try to pass LLVM inputs to a generic gcc.
2229e7925a075f110ab21afeae084670a155dea568e3Edward O'Callaghan    if (II.getType() == types::TY_LLVMBC)
2230e7925a075f110ab21afeae084670a155dea568e3Edward O'Callaghan      D.Diag(clang::diag::err_drv_no_linker_llvm_support)
2231881376467c46c5c6cc16fa6790271c2c22e1d4f1Daniel Dunbar        << getToolChain().getTripleString();
2232e7925a075f110ab21afeae084670a155dea568e3Edward O'Callaghan
2233e7925a075f110ab21afeae084670a155dea568e3Edward O'Callaghan    if (II.isPipe())
2234e7925a075f110ab21afeae084670a155dea568e3Edward O'Callaghan      CmdArgs.push_back("-");
2235e7925a075f110ab21afeae084670a155dea568e3Edward O'Callaghan    else if (II.isFilename())
2236e7925a075f110ab21afeae084670a155dea568e3Edward O'Callaghan      CmdArgs.push_back(II.getFilename());
2237e7925a075f110ab21afeae084670a155dea568e3Edward O'Callaghan    else
2238e7925a075f110ab21afeae084670a155dea568e3Edward O'Callaghan      II.getInputArg().renderAsInput(Args, CmdArgs);
2239e7925a075f110ab21afeae084670a155dea568e3Edward O'Callaghan  }
2240e7925a075f110ab21afeae084670a155dea568e3Edward O'Callaghan
2241e7925a075f110ab21afeae084670a155dea568e3Edward O'Callaghan  if (!Args.hasArg(options::OPT_nostdlib) &&
2242e7925a075f110ab21afeae084670a155dea568e3Edward O'Callaghan      !Args.hasArg(options::OPT_nodefaultlibs)) {
2243e7925a075f110ab21afeae084670a155dea568e3Edward O'Callaghan    // FIXME: For some reason GCC passes -lgcc before adding
2244e7925a075f110ab21afeae084670a155dea568e3Edward O'Callaghan    // the default system libraries. Just mimic this for now.
2245e7925a075f110ab21afeae084670a155dea568e3Edward O'Callaghan    CmdArgs.push_back("-lgcc");
2246e7925a075f110ab21afeae084670a155dea568e3Edward O'Callaghan
2247e7925a075f110ab21afeae084670a155dea568e3Edward O'Callaghan    if (Args.hasArg(options::OPT_pthread))
2248e7925a075f110ab21afeae084670a155dea568e3Edward O'Callaghan      CmdArgs.push_back("-pthread");
2249e7925a075f110ab21afeae084670a155dea568e3Edward O'Callaghan    if (!Args.hasArg(options::OPT_shared))
2250e7925a075f110ab21afeae084670a155dea568e3Edward O'Callaghan      CmdArgs.push_back("-lc");
2251e7925a075f110ab21afeae084670a155dea568e3Edward O'Callaghan    CmdArgs.push_back("-lgcc");
2252e7925a075f110ab21afeae084670a155dea568e3Edward O'Callaghan  }
2253e7925a075f110ab21afeae084670a155dea568e3Edward O'Callaghan
2254e7925a075f110ab21afeae084670a155dea568e3Edward O'Callaghan  if (!Args.hasArg(options::OPT_nostdlib) &&
2255e7925a075f110ab21afeae084670a155dea568e3Edward O'Callaghan      !Args.hasArg(options::OPT_nostartfiles)) {
2256e7925a075f110ab21afeae084670a155dea568e3Edward O'Callaghan    if (!Args.hasArg(options::OPT_shared))
22575ed34f4c58b6ad4e21038d713c1fae31a6146ff5Daniel Dunbar      CmdArgs.push_back(Args.MakeArgString(getToolChain().GetFilePath(C, "crtend.o")));
22587adf94906e23eae295a006659c55eab9ffcf8b37Edward O'Callaghan//    else
22597adf94906e23eae295a006659c55eab9ffcf8b37Edward O'Callaghan//      CmdArgs.push_back(Args.MakeArgString(getToolChain().GetFilePath(C, "crtendS.o")));
2260e7925a075f110ab21afeae084670a155dea568e3Edward O'Callaghan  }
2261e7925a075f110ab21afeae084670a155dea568e3Edward O'Callaghan
2262e7925a075f110ab21afeae084670a155dea568e3Edward O'Callaghan  const char *Exec =
22635ed34f4c58b6ad4e21038d713c1fae31a6146ff5Daniel Dunbar    Args.MakeArgString(getToolChain().GetProgramPath(C, "ld"));
2264e7925a075f110ab21afeae084670a155dea568e3Edward O'Callaghan  Dest.addCommand(new Command(JA, Exec, CmdArgs));
2265e7925a075f110ab21afeae084670a155dea568e3Edward O'Callaghan}
2266e7925a075f110ab21afeae084670a155dea568e3Edward O'Callaghan
2267f7b8eec37c8c8012fa525c71fb29a58c9f29beefDaniel Dunbarvoid openbsd::Assemble::ConstructJob(Compilation &C, const JobAction &JA,
2268f7b8eec37c8c8012fa525c71fb29a58c9f29beefDaniel Dunbar                                     Job &Dest, const InputInfo &Output,
2269f7b8eec37c8c8012fa525c71fb29a58c9f29beefDaniel Dunbar                                     const InputInfoList &Inputs,
2270f7b8eec37c8c8012fa525c71fb29a58c9f29beefDaniel Dunbar                                     const ArgList &Args,
22711eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump                                     const char *LinkingOutput) const {
2272f7b8eec37c8c8012fa525c71fb29a58c9f29beefDaniel Dunbar  ArgStringList CmdArgs;
2273f7b8eec37c8c8012fa525c71fb29a58c9f29beefDaniel Dunbar
2274f7b8eec37c8c8012fa525c71fb29a58c9f29beefDaniel Dunbar  Args.AddAllArgValues(CmdArgs, options::OPT_Wa_COMMA,
2275f7b8eec37c8c8012fa525c71fb29a58c9f29beefDaniel Dunbar                       options::OPT_Xassembler);
2276f7b8eec37c8c8012fa525c71fb29a58c9f29beefDaniel Dunbar
2277f7b8eec37c8c8012fa525c71fb29a58c9f29beefDaniel Dunbar  CmdArgs.push_back("-o");
2278f7b8eec37c8c8012fa525c71fb29a58c9f29beefDaniel Dunbar  if (Output.isPipe())
2279f7b8eec37c8c8012fa525c71fb29a58c9f29beefDaniel Dunbar    CmdArgs.push_back("-");
2280f7b8eec37c8c8012fa525c71fb29a58c9f29beefDaniel Dunbar  else
2281f7b8eec37c8c8012fa525c71fb29a58c9f29beefDaniel Dunbar    CmdArgs.push_back(Output.getFilename());
2282f7b8eec37c8c8012fa525c71fb29a58c9f29beefDaniel Dunbar
2283f7b8eec37c8c8012fa525c71fb29a58c9f29beefDaniel Dunbar  for (InputInfoList::const_iterator
2284f7b8eec37c8c8012fa525c71fb29a58c9f29beefDaniel Dunbar         it = Inputs.begin(), ie = Inputs.end(); it != ie; ++it) {
2285f7b8eec37c8c8012fa525c71fb29a58c9f29beefDaniel Dunbar    const InputInfo &II = *it;
2286f7b8eec37c8c8012fa525c71fb29a58c9f29beefDaniel Dunbar    if (II.isPipe())
2287f7b8eec37c8c8012fa525c71fb29a58c9f29beefDaniel Dunbar      CmdArgs.push_back("-");
2288f7b8eec37c8c8012fa525c71fb29a58c9f29beefDaniel Dunbar    else
2289f7b8eec37c8c8012fa525c71fb29a58c9f29beefDaniel Dunbar      CmdArgs.push_back(II.getFilename());
2290f7b8eec37c8c8012fa525c71fb29a58c9f29beefDaniel Dunbar  }
2291f7b8eec37c8c8012fa525c71fb29a58c9f29beefDaniel Dunbar
2292f7b8eec37c8c8012fa525c71fb29a58c9f29beefDaniel Dunbar  const char *Exec =
22935ed34f4c58b6ad4e21038d713c1fae31a6146ff5Daniel Dunbar    Args.MakeArgString(getToolChain().GetProgramPath(C, "as"));
2294cae087e164e94e4286c11bf694dd0ff88f295302Daniel Dunbar  Dest.addCommand(new Command(JA, Exec, CmdArgs));
2295f7b8eec37c8c8012fa525c71fb29a58c9f29beefDaniel Dunbar}
2296f7b8eec37c8c8012fa525c71fb29a58c9f29beefDaniel Dunbar
2297f7b8eec37c8c8012fa525c71fb29a58c9f29beefDaniel Dunbarvoid openbsd::Link::ConstructJob(Compilation &C, const JobAction &JA,
2298f7b8eec37c8c8012fa525c71fb29a58c9f29beefDaniel Dunbar                                 Job &Dest, const InputInfo &Output,
2299f7b8eec37c8c8012fa525c71fb29a58c9f29beefDaniel Dunbar                                 const InputInfoList &Inputs,
2300f7b8eec37c8c8012fa525c71fb29a58c9f29beefDaniel Dunbar                                 const ArgList &Args,
2301f7b8eec37c8c8012fa525c71fb29a58c9f29beefDaniel Dunbar                                 const char *LinkingOutput) const {
2302f7b8eec37c8c8012fa525c71fb29a58c9f29beefDaniel Dunbar  const Driver &D = getToolChain().getHost().getDriver();
2303f7b8eec37c8c8012fa525c71fb29a58c9f29beefDaniel Dunbar  ArgStringList CmdArgs;
2304f7b8eec37c8c8012fa525c71fb29a58c9f29beefDaniel Dunbar
23052bbcf669742b6b27748414e22f8042236fceef65Daniel Dunbar  if ((!Args.hasArg(options::OPT_nostdlib)) &&
23062bbcf669742b6b27748414e22f8042236fceef65Daniel Dunbar     (!Args.hasArg(options::OPT_shared))) {
23072bbcf669742b6b27748414e22f8042236fceef65Daniel Dunbar    CmdArgs.push_back("-e");
23082bbcf669742b6b27748414e22f8042236fceef65Daniel Dunbar    CmdArgs.push_back("__start");
23092bbcf669742b6b27748414e22f8042236fceef65Daniel Dunbar  }
23102bbcf669742b6b27748414e22f8042236fceef65Daniel Dunbar
2311f7b8eec37c8c8012fa525c71fb29a58c9f29beefDaniel Dunbar  if (Args.hasArg(options::OPT_static)) {
2312f7b8eec37c8c8012fa525c71fb29a58c9f29beefDaniel Dunbar    CmdArgs.push_back("-Bstatic");
2313f7b8eec37c8c8012fa525c71fb29a58c9f29beefDaniel Dunbar  } else {
2314f7b8eec37c8c8012fa525c71fb29a58c9f29beefDaniel Dunbar    CmdArgs.push_back("--eh-frame-hdr");
23152bbcf669742b6b27748414e22f8042236fceef65Daniel Dunbar    CmdArgs.push_back("-Bdynamic");
2316f7b8eec37c8c8012fa525c71fb29a58c9f29beefDaniel Dunbar    if (Args.hasArg(options::OPT_shared)) {
23172bbcf669742b6b27748414e22f8042236fceef65Daniel Dunbar      CmdArgs.push_back("-shared");
2318f7b8eec37c8c8012fa525c71fb29a58c9f29beefDaniel Dunbar    } else {
2319f7b8eec37c8c8012fa525c71fb29a58c9f29beefDaniel Dunbar      CmdArgs.push_back("-dynamic-linker");
2320f7b8eec37c8c8012fa525c71fb29a58c9f29beefDaniel Dunbar      CmdArgs.push_back("/usr/libexec/ld.so");
2321f7b8eec37c8c8012fa525c71fb29a58c9f29beefDaniel Dunbar    }
2322f7b8eec37c8c8012fa525c71fb29a58c9f29beefDaniel Dunbar  }
2323f7b8eec37c8c8012fa525c71fb29a58c9f29beefDaniel Dunbar
2324f7b8eec37c8c8012fa525c71fb29a58c9f29beefDaniel Dunbar  if (Output.isPipe()) {
2325f7b8eec37c8c8012fa525c71fb29a58c9f29beefDaniel Dunbar    CmdArgs.push_back("-o");
2326f7b8eec37c8c8012fa525c71fb29a58c9f29beefDaniel Dunbar    CmdArgs.push_back("-");
2327f7b8eec37c8c8012fa525c71fb29a58c9f29beefDaniel Dunbar  } else if (Output.isFilename()) {
2328f7b8eec37c8c8012fa525c71fb29a58c9f29beefDaniel Dunbar    CmdArgs.push_back("-o");
2329f7b8eec37c8c8012fa525c71fb29a58c9f29beefDaniel Dunbar    CmdArgs.push_back(Output.getFilename());
2330f7b8eec37c8c8012fa525c71fb29a58c9f29beefDaniel Dunbar  } else {
2331f7b8eec37c8c8012fa525c71fb29a58c9f29beefDaniel Dunbar    assert(Output.isNothing() && "Invalid output.");
2332f7b8eec37c8c8012fa525c71fb29a58c9f29beefDaniel Dunbar  }
2333f7b8eec37c8c8012fa525c71fb29a58c9f29beefDaniel Dunbar
2334f7b8eec37c8c8012fa525c71fb29a58c9f29beefDaniel Dunbar  if (!Args.hasArg(options::OPT_nostdlib) &&
2335f7b8eec37c8c8012fa525c71fb29a58c9f29beefDaniel Dunbar      !Args.hasArg(options::OPT_nostartfiles)) {
2336f7b8eec37c8c8012fa525c71fb29a58c9f29beefDaniel Dunbar    if (!Args.hasArg(options::OPT_shared)) {
23375ed34f4c58b6ad4e21038d713c1fae31a6146ff5Daniel Dunbar      CmdArgs.push_back(Args.MakeArgString(getToolChain().GetFilePath(C, "crt0.o")));
23385ed34f4c58b6ad4e21038d713c1fae31a6146ff5Daniel Dunbar      CmdArgs.push_back(Args.MakeArgString(getToolChain().GetFilePath(C, "crtbegin.o")));
2339f7b8eec37c8c8012fa525c71fb29a58c9f29beefDaniel Dunbar    } else {
23405ed34f4c58b6ad4e21038d713c1fae31a6146ff5Daniel Dunbar      CmdArgs.push_back(Args.MakeArgString(getToolChain().GetFilePath(C, "crtbeginS.o")));
2341f7b8eec37c8c8012fa525c71fb29a58c9f29beefDaniel Dunbar    }
2342f7b8eec37c8c8012fa525c71fb29a58c9f29beefDaniel Dunbar  }
2343f7b8eec37c8c8012fa525c71fb29a58c9f29beefDaniel Dunbar
2344e7e18200e614a5e619602a088544c85ac8305a1fEdward O'Callaghan  std::string Triple = getToolChain().getTripleString();
2345e7e18200e614a5e619602a088544c85ac8305a1fEdward O'Callaghan  if (Triple.substr(0, 6) == "x86_64")
2346e7e18200e614a5e619602a088544c85ac8305a1fEdward O'Callaghan	Triple.replace(0, 6, "amd64");
23472bbcf669742b6b27748414e22f8042236fceef65Daniel Dunbar  CmdArgs.push_back(MakeFormattedString(Args,
23482bbcf669742b6b27748414e22f8042236fceef65Daniel Dunbar                           llvm::format("-L/usr/lib/gcc-lib/%s/3.3.5",
2349e7e18200e614a5e619602a088544c85ac8305a1fEdward O'Callaghan                                    Triple.c_str())));
23502bbcf669742b6b27748414e22f8042236fceef65Daniel Dunbar
2351f7b8eec37c8c8012fa525c71fb29a58c9f29beefDaniel Dunbar  Args.AddAllArgs(CmdArgs, options::OPT_L);
2352f7b8eec37c8c8012fa525c71fb29a58c9f29beefDaniel Dunbar  Args.AddAllArgs(CmdArgs, options::OPT_T_Group);
2353f7b8eec37c8c8012fa525c71fb29a58c9f29beefDaniel Dunbar  Args.AddAllArgs(CmdArgs, options::OPT_e);
2354f7b8eec37c8c8012fa525c71fb29a58c9f29beefDaniel Dunbar
2355f7b8eec37c8c8012fa525c71fb29a58c9f29beefDaniel Dunbar  for (InputInfoList::const_iterator
2356f7b8eec37c8c8012fa525c71fb29a58c9f29beefDaniel Dunbar         it = Inputs.begin(), ie = Inputs.end(); it != ie; ++it) {
2357f7b8eec37c8c8012fa525c71fb29a58c9f29beefDaniel Dunbar    const InputInfo &II = *it;
2358f7b8eec37c8c8012fa525c71fb29a58c9f29beefDaniel Dunbar
2359f7b8eec37c8c8012fa525c71fb29a58c9f29beefDaniel Dunbar    // Don't try to pass LLVM inputs to a generic gcc.
2360f7b8eec37c8c8012fa525c71fb29a58c9f29beefDaniel Dunbar    if (II.getType() == types::TY_LLVMBC)
2361f7b8eec37c8c8012fa525c71fb29a58c9f29beefDaniel Dunbar      D.Diag(clang::diag::err_drv_no_linker_llvm_support)
2362881376467c46c5c6cc16fa6790271c2c22e1d4f1Daniel Dunbar        << getToolChain().getTripleString();
2363f7b8eec37c8c8012fa525c71fb29a58c9f29beefDaniel Dunbar
2364f7b8eec37c8c8012fa525c71fb29a58c9f29beefDaniel Dunbar    if (II.isPipe())
2365f7b8eec37c8c8012fa525c71fb29a58c9f29beefDaniel Dunbar      CmdArgs.push_back("-");
2366f7b8eec37c8c8012fa525c71fb29a58c9f29beefDaniel Dunbar    else if (II.isFilename())
2367f7b8eec37c8c8012fa525c71fb29a58c9f29beefDaniel Dunbar      CmdArgs.push_back(II.getFilename());
2368f7b8eec37c8c8012fa525c71fb29a58c9f29beefDaniel Dunbar    else
2369f7b8eec37c8c8012fa525c71fb29a58c9f29beefDaniel Dunbar      II.getInputArg().renderAsInput(Args, CmdArgs);
2370f7b8eec37c8c8012fa525c71fb29a58c9f29beefDaniel Dunbar  }
2371f7b8eec37c8c8012fa525c71fb29a58c9f29beefDaniel Dunbar
2372f7b8eec37c8c8012fa525c71fb29a58c9f29beefDaniel Dunbar  if (!Args.hasArg(options::OPT_nostdlib) &&
2373f7b8eec37c8c8012fa525c71fb29a58c9f29beefDaniel Dunbar      !Args.hasArg(options::OPT_nodefaultlibs)) {
23742bbcf669742b6b27748414e22f8042236fceef65Daniel Dunbar    // FIXME: For some reason GCC passes -lgcc before adding
23752bbcf669742b6b27748414e22f8042236fceef65Daniel Dunbar    // the default system libraries. Just mimic this for now.
23762bbcf669742b6b27748414e22f8042236fceef65Daniel Dunbar    CmdArgs.push_back("-lgcc");
2377f7b8eec37c8c8012fa525c71fb29a58c9f29beefDaniel Dunbar
2378f7b8eec37c8c8012fa525c71fb29a58c9f29beefDaniel Dunbar    if (Args.hasArg(options::OPT_pthread))
2379f7b8eec37c8c8012fa525c71fb29a58c9f29beefDaniel Dunbar      CmdArgs.push_back("-pthread");
23802bbcf669742b6b27748414e22f8042236fceef65Daniel Dunbar    if (!Args.hasArg(options::OPT_shared))
23812bbcf669742b6b27748414e22f8042236fceef65Daniel Dunbar      CmdArgs.push_back("-lc");
23822bbcf669742b6b27748414e22f8042236fceef65Daniel Dunbar    CmdArgs.push_back("-lgcc");
2383f7b8eec37c8c8012fa525c71fb29a58c9f29beefDaniel Dunbar  }
2384f7b8eec37c8c8012fa525c71fb29a58c9f29beefDaniel Dunbar
2385f7b8eec37c8c8012fa525c71fb29a58c9f29beefDaniel Dunbar  if (!Args.hasArg(options::OPT_nostdlib) &&
2386f7b8eec37c8c8012fa525c71fb29a58c9f29beefDaniel Dunbar      !Args.hasArg(options::OPT_nostartfiles)) {
2387f7b8eec37c8c8012fa525c71fb29a58c9f29beefDaniel Dunbar    if (!Args.hasArg(options::OPT_shared))
23885ed34f4c58b6ad4e21038d713c1fae31a6146ff5Daniel Dunbar      CmdArgs.push_back(Args.MakeArgString(getToolChain().GetFilePath(C, "crtend.o")));
2389f7b8eec37c8c8012fa525c71fb29a58c9f29beefDaniel Dunbar    else
23905ed34f4c58b6ad4e21038d713c1fae31a6146ff5Daniel Dunbar      CmdArgs.push_back(Args.MakeArgString(getToolChain().GetFilePath(C, "crtendS.o")));
2391f7b8eec37c8c8012fa525c71fb29a58c9f29beefDaniel Dunbar  }
2392f7b8eec37c8c8012fa525c71fb29a58c9f29beefDaniel Dunbar
2393f7b8eec37c8c8012fa525c71fb29a58c9f29beefDaniel Dunbar  const char *Exec =
23945ed34f4c58b6ad4e21038d713c1fae31a6146ff5Daniel Dunbar    Args.MakeArgString(getToolChain().GetProgramPath(C, "ld"));
2395cae087e164e94e4286c11bf694dd0ff88f295302Daniel Dunbar  Dest.addCommand(new Command(JA, Exec, CmdArgs));
2396f7b8eec37c8c8012fa525c71fb29a58c9f29beefDaniel Dunbar}
2397c66a5a30a27e7b9cfab46ac8be918e3ea5b0c5a5Ed Schouten
239868a31d406c6dc4382c700d1199b062de2aa7e1daDaniel Dunbarvoid freebsd::Assemble::ConstructJob(Compilation &C, const JobAction &JA,
2399c21c485b4fb58ef5d55cf3e523263dd824a2ace4Daniel Dunbar                                     Job &Dest, const InputInfo &Output,
2400c21c485b4fb58ef5d55cf3e523263dd824a2ace4Daniel Dunbar                                     const InputInfoList &Inputs,
2401c21c485b4fb58ef5d55cf3e523263dd824a2ace4Daniel Dunbar                                     const ArgList &Args,
24021eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump                                     const char *LinkingOutput) const {
240368a31d406c6dc4382c700d1199b062de2aa7e1daDaniel Dunbar  ArgStringList CmdArgs;
240468a31d406c6dc4382c700d1199b062de2aa7e1daDaniel Dunbar
2405008f54a54299eaafdaa940e2bdeaf55935ecd95aDaniel Dunbar  // When building 32-bit code on FreeBSD/amd64, we have to explicitly
2406008f54a54299eaafdaa940e2bdeaf55935ecd95aDaniel Dunbar  // instruct as in the base system to assemble 32-bit code.
2407008f54a54299eaafdaa940e2bdeaf55935ecd95aDaniel Dunbar  if (getToolChain().getArchName() == "i386")
240868a31d406c6dc4382c700d1199b062de2aa7e1daDaniel Dunbar    CmdArgs.push_back("--32");
240968a31d406c6dc4382c700d1199b062de2aa7e1daDaniel Dunbar
241068a31d406c6dc4382c700d1199b062de2aa7e1daDaniel Dunbar  Args.AddAllArgValues(CmdArgs, options::OPT_Wa_COMMA,
241168a31d406c6dc4382c700d1199b062de2aa7e1daDaniel Dunbar                       options::OPT_Xassembler);
241268a31d406c6dc4382c700d1199b062de2aa7e1daDaniel Dunbar
241368a31d406c6dc4382c700d1199b062de2aa7e1daDaniel Dunbar  CmdArgs.push_back("-o");
241468a31d406c6dc4382c700d1199b062de2aa7e1daDaniel Dunbar  if (Output.isPipe())
241568a31d406c6dc4382c700d1199b062de2aa7e1daDaniel Dunbar    CmdArgs.push_back("-");
241668a31d406c6dc4382c700d1199b062de2aa7e1daDaniel Dunbar  else
241768a31d406c6dc4382c700d1199b062de2aa7e1daDaniel Dunbar    CmdArgs.push_back(Output.getFilename());
241868a31d406c6dc4382c700d1199b062de2aa7e1daDaniel Dunbar
241968a31d406c6dc4382c700d1199b062de2aa7e1daDaniel Dunbar  for (InputInfoList::const_iterator
242068a31d406c6dc4382c700d1199b062de2aa7e1daDaniel Dunbar         it = Inputs.begin(), ie = Inputs.end(); it != ie; ++it) {
242168a31d406c6dc4382c700d1199b062de2aa7e1daDaniel Dunbar    const InputInfo &II = *it;
242268a31d406c6dc4382c700d1199b062de2aa7e1daDaniel Dunbar    if (II.isPipe())
242368a31d406c6dc4382c700d1199b062de2aa7e1daDaniel Dunbar      CmdArgs.push_back("-");
242468a31d406c6dc4382c700d1199b062de2aa7e1daDaniel Dunbar    else
242568a31d406c6dc4382c700d1199b062de2aa7e1daDaniel Dunbar      CmdArgs.push_back(II.getFilename());
242668a31d406c6dc4382c700d1199b062de2aa7e1daDaniel Dunbar  }
242768a31d406c6dc4382c700d1199b062de2aa7e1daDaniel Dunbar
2428c21c485b4fb58ef5d55cf3e523263dd824a2ace4Daniel Dunbar  const char *Exec =
24295ed34f4c58b6ad4e21038d713c1fae31a6146ff5Daniel Dunbar    Args.MakeArgString(getToolChain().GetProgramPath(C, "as"));
2430cae087e164e94e4286c11bf694dd0ff88f295302Daniel Dunbar  Dest.addCommand(new Command(JA, Exec, CmdArgs));
243168a31d406c6dc4382c700d1199b062de2aa7e1daDaniel Dunbar}
2432008f54a54299eaafdaa940e2bdeaf55935ecd95aDaniel Dunbar
2433008f54a54299eaafdaa940e2bdeaf55935ecd95aDaniel Dunbarvoid freebsd::Link::ConstructJob(Compilation &C, const JobAction &JA,
2434c21c485b4fb58ef5d55cf3e523263dd824a2ace4Daniel Dunbar                                 Job &Dest, const InputInfo &Output,
2435c21c485b4fb58ef5d55cf3e523263dd824a2ace4Daniel Dunbar                                 const InputInfoList &Inputs,
2436c21c485b4fb58ef5d55cf3e523263dd824a2ace4Daniel Dunbar                                 const ArgList &Args,
2437a8304f67291b0182fb64f3afc621615288dd1d31Daniel Dunbar                                 const char *LinkingOutput) const {
2438a8304f67291b0182fb64f3afc621615288dd1d31Daniel Dunbar  const Driver &D = getToolChain().getHost().getDriver();
2439008f54a54299eaafdaa940e2bdeaf55935ecd95aDaniel Dunbar  ArgStringList CmdArgs;
2440008f54a54299eaafdaa940e2bdeaf55935ecd95aDaniel Dunbar
2441008f54a54299eaafdaa940e2bdeaf55935ecd95aDaniel Dunbar  if (Args.hasArg(options::OPT_static)) {
2442008f54a54299eaafdaa940e2bdeaf55935ecd95aDaniel Dunbar    CmdArgs.push_back("-Bstatic");
2443008f54a54299eaafdaa940e2bdeaf55935ecd95aDaniel Dunbar  } else {
2444008f54a54299eaafdaa940e2bdeaf55935ecd95aDaniel Dunbar    CmdArgs.push_back("--eh-frame-hdr");
2445008f54a54299eaafdaa940e2bdeaf55935ecd95aDaniel Dunbar    if (Args.hasArg(options::OPT_shared)) {
2446008f54a54299eaafdaa940e2bdeaf55935ecd95aDaniel Dunbar      CmdArgs.push_back("-Bshareable");
2447008f54a54299eaafdaa940e2bdeaf55935ecd95aDaniel Dunbar    } else {
2448008f54a54299eaafdaa940e2bdeaf55935ecd95aDaniel Dunbar      CmdArgs.push_back("-dynamic-linker");
2449008f54a54299eaafdaa940e2bdeaf55935ecd95aDaniel Dunbar      CmdArgs.push_back("/libexec/ld-elf.so.1");
2450008f54a54299eaafdaa940e2bdeaf55935ecd95aDaniel Dunbar    }
2451008f54a54299eaafdaa940e2bdeaf55935ecd95aDaniel Dunbar  }
2452008f54a54299eaafdaa940e2bdeaf55935ecd95aDaniel Dunbar
2453008f54a54299eaafdaa940e2bdeaf55935ecd95aDaniel Dunbar  // When building 32-bit code on FreeBSD/amd64, we have to explicitly
2454008f54a54299eaafdaa940e2bdeaf55935ecd95aDaniel Dunbar  // instruct ld in the base system to link 32-bit code.
2455008f54a54299eaafdaa940e2bdeaf55935ecd95aDaniel Dunbar  if (getToolChain().getArchName() == "i386") {
2456008f54a54299eaafdaa940e2bdeaf55935ecd95aDaniel Dunbar    CmdArgs.push_back("-m");
2457008f54a54299eaafdaa940e2bdeaf55935ecd95aDaniel Dunbar    CmdArgs.push_back("elf_i386_fbsd");
2458008f54a54299eaafdaa940e2bdeaf55935ecd95aDaniel Dunbar  }
2459008f54a54299eaafdaa940e2bdeaf55935ecd95aDaniel Dunbar
2460008f54a54299eaafdaa940e2bdeaf55935ecd95aDaniel Dunbar  if (Output.isPipe()) {
2461008f54a54299eaafdaa940e2bdeaf55935ecd95aDaniel Dunbar    CmdArgs.push_back("-o");
2462008f54a54299eaafdaa940e2bdeaf55935ecd95aDaniel Dunbar    CmdArgs.push_back("-");
2463008f54a54299eaafdaa940e2bdeaf55935ecd95aDaniel Dunbar  } else if (Output.isFilename()) {
2464008f54a54299eaafdaa940e2bdeaf55935ecd95aDaniel Dunbar    CmdArgs.push_back("-o");
2465008f54a54299eaafdaa940e2bdeaf55935ecd95aDaniel Dunbar    CmdArgs.push_back(Output.getFilename());
2466008f54a54299eaafdaa940e2bdeaf55935ecd95aDaniel Dunbar  } else {
2467008f54a54299eaafdaa940e2bdeaf55935ecd95aDaniel Dunbar    assert(Output.isNothing() && "Invalid output.");
2468008f54a54299eaafdaa940e2bdeaf55935ecd95aDaniel Dunbar  }
2469008f54a54299eaafdaa940e2bdeaf55935ecd95aDaniel Dunbar
2470008f54a54299eaafdaa940e2bdeaf55935ecd95aDaniel Dunbar  if (!Args.hasArg(options::OPT_nostdlib) &&
2471008f54a54299eaafdaa940e2bdeaf55935ecd95aDaniel Dunbar      !Args.hasArg(options::OPT_nostartfiles)) {
2472008f54a54299eaafdaa940e2bdeaf55935ecd95aDaniel Dunbar    if (!Args.hasArg(options::OPT_shared)) {
24735ed34f4c58b6ad4e21038d713c1fae31a6146ff5Daniel Dunbar      CmdArgs.push_back(Args.MakeArgString(getToolChain().GetFilePath(C, "crt1.o")));
24745ed34f4c58b6ad4e21038d713c1fae31a6146ff5Daniel Dunbar      CmdArgs.push_back(Args.MakeArgString(getToolChain().GetFilePath(C, "crti.o")));
24755ed34f4c58b6ad4e21038d713c1fae31a6146ff5Daniel Dunbar      CmdArgs.push_back(Args.MakeArgString(getToolChain().GetFilePath(C, "crtbegin.o")));
2476008f54a54299eaafdaa940e2bdeaf55935ecd95aDaniel Dunbar    } else {
24775ed34f4c58b6ad4e21038d713c1fae31a6146ff5Daniel Dunbar      CmdArgs.push_back(Args.MakeArgString(getToolChain().GetFilePath(C, "crti.o")));
24785ed34f4c58b6ad4e21038d713c1fae31a6146ff5Daniel Dunbar      CmdArgs.push_back(Args.MakeArgString(getToolChain().GetFilePath(C, "crtbeginS.o")));
2479008f54a54299eaafdaa940e2bdeaf55935ecd95aDaniel Dunbar    }
2480008f54a54299eaafdaa940e2bdeaf55935ecd95aDaniel Dunbar  }
2481008f54a54299eaafdaa940e2bdeaf55935ecd95aDaniel Dunbar
2482008f54a54299eaafdaa940e2bdeaf55935ecd95aDaniel Dunbar  Args.AddAllArgs(CmdArgs, options::OPT_L);
2483008f54a54299eaafdaa940e2bdeaf55935ecd95aDaniel Dunbar  Args.AddAllArgs(CmdArgs, options::OPT_T_Group);
2484008f54a54299eaafdaa940e2bdeaf55935ecd95aDaniel Dunbar  Args.AddAllArgs(CmdArgs, options::OPT_e);
2485008f54a54299eaafdaa940e2bdeaf55935ecd95aDaniel Dunbar
2486008f54a54299eaafdaa940e2bdeaf55935ecd95aDaniel Dunbar  for (InputInfoList::const_iterator
2487c21c485b4fb58ef5d55cf3e523263dd824a2ace4Daniel Dunbar         it = Inputs.begin(), ie = Inputs.end(); it != ie; ++it) {
2488008f54a54299eaafdaa940e2bdeaf55935ecd95aDaniel Dunbar    const InputInfo &II = *it;
2489a8304f67291b0182fb64f3afc621615288dd1d31Daniel Dunbar
2490a8304f67291b0182fb64f3afc621615288dd1d31Daniel Dunbar    // Don't try to pass LLVM inputs to a generic gcc.
2491a8304f67291b0182fb64f3afc621615288dd1d31Daniel Dunbar    if (II.getType() == types::TY_LLVMBC)
2492a8304f67291b0182fb64f3afc621615288dd1d31Daniel Dunbar      D.Diag(clang::diag::err_drv_no_linker_llvm_support)
2493881376467c46c5c6cc16fa6790271c2c22e1d4f1Daniel Dunbar        << getToolChain().getTripleString();
2494a8304f67291b0182fb64f3afc621615288dd1d31Daniel Dunbar
2495008f54a54299eaafdaa940e2bdeaf55935ecd95aDaniel Dunbar    if (II.isPipe())
2496008f54a54299eaafdaa940e2bdeaf55935ecd95aDaniel Dunbar      CmdArgs.push_back("-");
2497008f54a54299eaafdaa940e2bdeaf55935ecd95aDaniel Dunbar    else if (II.isFilename())
2498008f54a54299eaafdaa940e2bdeaf55935ecd95aDaniel Dunbar      CmdArgs.push_back(II.getFilename());
2499008f54a54299eaafdaa940e2bdeaf55935ecd95aDaniel Dunbar    else
2500008f54a54299eaafdaa940e2bdeaf55935ecd95aDaniel Dunbar      II.getInputArg().renderAsInput(Args, CmdArgs);
2501008f54a54299eaafdaa940e2bdeaf55935ecd95aDaniel Dunbar  }
2502008f54a54299eaafdaa940e2bdeaf55935ecd95aDaniel Dunbar
2503008f54a54299eaafdaa940e2bdeaf55935ecd95aDaniel Dunbar  if (!Args.hasArg(options::OPT_nostdlib) &&
2504008f54a54299eaafdaa940e2bdeaf55935ecd95aDaniel Dunbar      !Args.hasArg(options::OPT_nodefaultlibs)) {
2505008f54a54299eaafdaa940e2bdeaf55935ecd95aDaniel Dunbar    // FIXME: For some reason GCC passes -lgcc and -lgcc_s before adding
2506008f54a54299eaafdaa940e2bdeaf55935ecd95aDaniel Dunbar    // the default system libraries. Just mimic this for now.
2507008f54a54299eaafdaa940e2bdeaf55935ecd95aDaniel Dunbar    CmdArgs.push_back("-lgcc");
2508008f54a54299eaafdaa940e2bdeaf55935ecd95aDaniel Dunbar    if (Args.hasArg(options::OPT_static)) {
2509008f54a54299eaafdaa940e2bdeaf55935ecd95aDaniel Dunbar      CmdArgs.push_back("-lgcc_eh");
2510008f54a54299eaafdaa940e2bdeaf55935ecd95aDaniel Dunbar    } else {
2511008f54a54299eaafdaa940e2bdeaf55935ecd95aDaniel Dunbar      CmdArgs.push_back("--as-needed");
2512008f54a54299eaafdaa940e2bdeaf55935ecd95aDaniel Dunbar      CmdArgs.push_back("-lgcc_s");
2513008f54a54299eaafdaa940e2bdeaf55935ecd95aDaniel Dunbar      CmdArgs.push_back("--no-as-needed");
2514008f54a54299eaafdaa940e2bdeaf55935ecd95aDaniel Dunbar    }
2515008f54a54299eaafdaa940e2bdeaf55935ecd95aDaniel Dunbar
2516008f54a54299eaafdaa940e2bdeaf55935ecd95aDaniel Dunbar    if (Args.hasArg(options::OPT_pthread))
2517008f54a54299eaafdaa940e2bdeaf55935ecd95aDaniel Dunbar      CmdArgs.push_back("-lpthread");
2518008f54a54299eaafdaa940e2bdeaf55935ecd95aDaniel Dunbar    CmdArgs.push_back("-lc");
2519008f54a54299eaafdaa940e2bdeaf55935ecd95aDaniel Dunbar
2520008f54a54299eaafdaa940e2bdeaf55935ecd95aDaniel Dunbar    CmdArgs.push_back("-lgcc");
2521008f54a54299eaafdaa940e2bdeaf55935ecd95aDaniel Dunbar    if (Args.hasArg(options::OPT_static)) {
2522008f54a54299eaafdaa940e2bdeaf55935ecd95aDaniel Dunbar      CmdArgs.push_back("-lgcc_eh");
2523008f54a54299eaafdaa940e2bdeaf55935ecd95aDaniel Dunbar    } else {
2524008f54a54299eaafdaa940e2bdeaf55935ecd95aDaniel Dunbar      CmdArgs.push_back("--as-needed");
2525008f54a54299eaafdaa940e2bdeaf55935ecd95aDaniel Dunbar      CmdArgs.push_back("-lgcc_s");
2526008f54a54299eaafdaa940e2bdeaf55935ecd95aDaniel Dunbar      CmdArgs.push_back("--no-as-needed");
2527008f54a54299eaafdaa940e2bdeaf55935ecd95aDaniel Dunbar    }
2528008f54a54299eaafdaa940e2bdeaf55935ecd95aDaniel Dunbar  }
2529008f54a54299eaafdaa940e2bdeaf55935ecd95aDaniel Dunbar
2530008f54a54299eaafdaa940e2bdeaf55935ecd95aDaniel Dunbar  if (!Args.hasArg(options::OPT_nostdlib) &&
2531008f54a54299eaafdaa940e2bdeaf55935ecd95aDaniel Dunbar      !Args.hasArg(options::OPT_nostartfiles)) {
2532008f54a54299eaafdaa940e2bdeaf55935ecd95aDaniel Dunbar    if (!Args.hasArg(options::OPT_shared))
25335ed34f4c58b6ad4e21038d713c1fae31a6146ff5Daniel Dunbar      CmdArgs.push_back(Args.MakeArgString(getToolChain().GetFilePath(C, "crtend.o")));
2534008f54a54299eaafdaa940e2bdeaf55935ecd95aDaniel Dunbar    else
25355ed34f4c58b6ad4e21038d713c1fae31a6146ff5Daniel Dunbar      CmdArgs.push_back(Args.MakeArgString(getToolChain().GetFilePath(C, "crtendS.o")));
25365ed34f4c58b6ad4e21038d713c1fae31a6146ff5Daniel Dunbar    CmdArgs.push_back(Args.MakeArgString(getToolChain().GetFilePath(C, "crtn.o")));
2537008f54a54299eaafdaa940e2bdeaf55935ecd95aDaniel Dunbar  }
2538008f54a54299eaafdaa940e2bdeaf55935ecd95aDaniel Dunbar
2539c21c485b4fb58ef5d55cf3e523263dd824a2ace4Daniel Dunbar  const char *Exec =
25405ed34f4c58b6ad4e21038d713c1fae31a6146ff5Daniel Dunbar    Args.MakeArgString(getToolChain().GetProgramPath(C, "ld"));
2541cae087e164e94e4286c11bf694dd0ff88f295302Daniel Dunbar  Dest.addCommand(new Command(JA, Exec, CmdArgs));
2542008f54a54299eaafdaa940e2bdeaf55935ecd95aDaniel Dunbar}
254311e1b40d759a643086f590f6ffbd9d68360bad46Daniel Dunbar
254411e1b40d759a643086f590f6ffbd9d68360bad46Daniel Dunbar/// DragonFly Tools
254511e1b40d759a643086f590f6ffbd9d68360bad46Daniel Dunbar
254611e1b40d759a643086f590f6ffbd9d68360bad46Daniel Dunbar// For now, DragonFly Assemble does just about the same as for
254711e1b40d759a643086f590f6ffbd9d68360bad46Daniel Dunbar// FreeBSD, but this may change soon.
254811e1b40d759a643086f590f6ffbd9d68360bad46Daniel Dunbarvoid dragonfly::Assemble::ConstructJob(Compilation &C, const JobAction &JA,
254911e1b40d759a643086f590f6ffbd9d68360bad46Daniel Dunbar                                     Job &Dest, const InputInfo &Output,
255011e1b40d759a643086f590f6ffbd9d68360bad46Daniel Dunbar                                     const InputInfoList &Inputs,
255111e1b40d759a643086f590f6ffbd9d68360bad46Daniel Dunbar                                     const ArgList &Args,
255211e1b40d759a643086f590f6ffbd9d68360bad46Daniel Dunbar                                     const char *LinkingOutput) const {
255311e1b40d759a643086f590f6ffbd9d68360bad46Daniel Dunbar  ArgStringList CmdArgs;
255411e1b40d759a643086f590f6ffbd9d68360bad46Daniel Dunbar
255511e1b40d759a643086f590f6ffbd9d68360bad46Daniel Dunbar  // When building 32-bit code on DragonFly/pc64, we have to explicitly
255611e1b40d759a643086f590f6ffbd9d68360bad46Daniel Dunbar  // instruct as in the base system to assemble 32-bit code.
255711e1b40d759a643086f590f6ffbd9d68360bad46Daniel Dunbar  if (getToolChain().getArchName() == "i386")
255811e1b40d759a643086f590f6ffbd9d68360bad46Daniel Dunbar    CmdArgs.push_back("--32");
255911e1b40d759a643086f590f6ffbd9d68360bad46Daniel Dunbar
256011e1b40d759a643086f590f6ffbd9d68360bad46Daniel Dunbar  Args.AddAllArgValues(CmdArgs, options::OPT_Wa_COMMA,
256111e1b40d759a643086f590f6ffbd9d68360bad46Daniel Dunbar                       options::OPT_Xassembler);
256211e1b40d759a643086f590f6ffbd9d68360bad46Daniel Dunbar
256311e1b40d759a643086f590f6ffbd9d68360bad46Daniel Dunbar  CmdArgs.push_back("-o");
256411e1b40d759a643086f590f6ffbd9d68360bad46Daniel Dunbar  if (Output.isPipe())
256511e1b40d759a643086f590f6ffbd9d68360bad46Daniel Dunbar    CmdArgs.push_back("-");
256611e1b40d759a643086f590f6ffbd9d68360bad46Daniel Dunbar  else
256711e1b40d759a643086f590f6ffbd9d68360bad46Daniel Dunbar    CmdArgs.push_back(Output.getFilename());
256811e1b40d759a643086f590f6ffbd9d68360bad46Daniel Dunbar
256911e1b40d759a643086f590f6ffbd9d68360bad46Daniel Dunbar  for (InputInfoList::const_iterator
257011e1b40d759a643086f590f6ffbd9d68360bad46Daniel Dunbar         it = Inputs.begin(), ie = Inputs.end(); it != ie; ++it) {
257111e1b40d759a643086f590f6ffbd9d68360bad46Daniel Dunbar    const InputInfo &II = *it;
257211e1b40d759a643086f590f6ffbd9d68360bad46Daniel Dunbar    if (II.isPipe())
257311e1b40d759a643086f590f6ffbd9d68360bad46Daniel Dunbar      CmdArgs.push_back("-");
257411e1b40d759a643086f590f6ffbd9d68360bad46Daniel Dunbar    else
257511e1b40d759a643086f590f6ffbd9d68360bad46Daniel Dunbar      CmdArgs.push_back(II.getFilename());
257611e1b40d759a643086f590f6ffbd9d68360bad46Daniel Dunbar  }
257711e1b40d759a643086f590f6ffbd9d68360bad46Daniel Dunbar
257811e1b40d759a643086f590f6ffbd9d68360bad46Daniel Dunbar  const char *Exec =
25795ed34f4c58b6ad4e21038d713c1fae31a6146ff5Daniel Dunbar    Args.MakeArgString(getToolChain().GetProgramPath(C, "as"));
2580cae087e164e94e4286c11bf694dd0ff88f295302Daniel Dunbar  Dest.addCommand(new Command(JA, Exec, CmdArgs));
258111e1b40d759a643086f590f6ffbd9d68360bad46Daniel Dunbar}
258211e1b40d759a643086f590f6ffbd9d68360bad46Daniel Dunbar
258311e1b40d759a643086f590f6ffbd9d68360bad46Daniel Dunbarvoid dragonfly::Link::ConstructJob(Compilation &C, const JobAction &JA,
258411e1b40d759a643086f590f6ffbd9d68360bad46Daniel Dunbar                                 Job &Dest, const InputInfo &Output,
258511e1b40d759a643086f590f6ffbd9d68360bad46Daniel Dunbar                                 const InputInfoList &Inputs,
258611e1b40d759a643086f590f6ffbd9d68360bad46Daniel Dunbar                                 const ArgList &Args,
258711e1b40d759a643086f590f6ffbd9d68360bad46Daniel Dunbar                                 const char *LinkingOutput) const {
2588a8304f67291b0182fb64f3afc621615288dd1d31Daniel Dunbar  const Driver &D = getToolChain().getHost().getDriver();
258911e1b40d759a643086f590f6ffbd9d68360bad46Daniel Dunbar  ArgStringList CmdArgs;
259011e1b40d759a643086f590f6ffbd9d68360bad46Daniel Dunbar
259111e1b40d759a643086f590f6ffbd9d68360bad46Daniel Dunbar  if (Args.hasArg(options::OPT_static)) {
259211e1b40d759a643086f590f6ffbd9d68360bad46Daniel Dunbar    CmdArgs.push_back("-Bstatic");
259311e1b40d759a643086f590f6ffbd9d68360bad46Daniel Dunbar  } else {
259411e1b40d759a643086f590f6ffbd9d68360bad46Daniel Dunbar    if (Args.hasArg(options::OPT_shared))
259511e1b40d759a643086f590f6ffbd9d68360bad46Daniel Dunbar      CmdArgs.push_back("-Bshareable");
259611e1b40d759a643086f590f6ffbd9d68360bad46Daniel Dunbar    else {
259711e1b40d759a643086f590f6ffbd9d68360bad46Daniel Dunbar      CmdArgs.push_back("-dynamic-linker");
259811e1b40d759a643086f590f6ffbd9d68360bad46Daniel Dunbar      CmdArgs.push_back("/usr/libexec/ld-elf.so.2");
259911e1b40d759a643086f590f6ffbd9d68360bad46Daniel Dunbar    }
260011e1b40d759a643086f590f6ffbd9d68360bad46Daniel Dunbar  }
260111e1b40d759a643086f590f6ffbd9d68360bad46Daniel Dunbar
260211e1b40d759a643086f590f6ffbd9d68360bad46Daniel Dunbar  // When building 32-bit code on DragonFly/pc64, we have to explicitly
260311e1b40d759a643086f590f6ffbd9d68360bad46Daniel Dunbar  // instruct ld in the base system to link 32-bit code.
260411e1b40d759a643086f590f6ffbd9d68360bad46Daniel Dunbar  if (getToolChain().getArchName() == "i386") {
260511e1b40d759a643086f590f6ffbd9d68360bad46Daniel Dunbar    CmdArgs.push_back("-m");
260611e1b40d759a643086f590f6ffbd9d68360bad46Daniel Dunbar    CmdArgs.push_back("elf_i386");
260711e1b40d759a643086f590f6ffbd9d68360bad46Daniel Dunbar  }
260811e1b40d759a643086f590f6ffbd9d68360bad46Daniel Dunbar
260911e1b40d759a643086f590f6ffbd9d68360bad46Daniel Dunbar  if (Output.isPipe()) {
261011e1b40d759a643086f590f6ffbd9d68360bad46Daniel Dunbar    CmdArgs.push_back("-o");
261111e1b40d759a643086f590f6ffbd9d68360bad46Daniel Dunbar    CmdArgs.push_back("-");
261211e1b40d759a643086f590f6ffbd9d68360bad46Daniel Dunbar  } else if (Output.isFilename()) {
261311e1b40d759a643086f590f6ffbd9d68360bad46Daniel Dunbar    CmdArgs.push_back("-o");
261411e1b40d759a643086f590f6ffbd9d68360bad46Daniel Dunbar    CmdArgs.push_back(Output.getFilename());
261511e1b40d759a643086f590f6ffbd9d68360bad46Daniel Dunbar  } else {
261611e1b40d759a643086f590f6ffbd9d68360bad46Daniel Dunbar    assert(Output.isNothing() && "Invalid output.");
261711e1b40d759a643086f590f6ffbd9d68360bad46Daniel Dunbar  }
261811e1b40d759a643086f590f6ffbd9d68360bad46Daniel Dunbar
261911e1b40d759a643086f590f6ffbd9d68360bad46Daniel Dunbar  if (!Args.hasArg(options::OPT_nostdlib) &&
262011e1b40d759a643086f590f6ffbd9d68360bad46Daniel Dunbar      !Args.hasArg(options::OPT_nostartfiles)) {
262111e1b40d759a643086f590f6ffbd9d68360bad46Daniel Dunbar    if (!Args.hasArg(options::OPT_shared)) {
26225ed34f4c58b6ad4e21038d713c1fae31a6146ff5Daniel Dunbar      CmdArgs.push_back(Args.MakeArgString(getToolChain().GetFilePath(C, "crt1.o")));
26235ed34f4c58b6ad4e21038d713c1fae31a6146ff5Daniel Dunbar      CmdArgs.push_back(Args.MakeArgString(getToolChain().GetFilePath(C, "crti.o")));
26245ed34f4c58b6ad4e21038d713c1fae31a6146ff5Daniel Dunbar      CmdArgs.push_back(Args.MakeArgString(getToolChain().GetFilePath(C, "crtbegin.o")));
262511e1b40d759a643086f590f6ffbd9d68360bad46Daniel Dunbar    } else {
26265ed34f4c58b6ad4e21038d713c1fae31a6146ff5Daniel Dunbar      CmdArgs.push_back(Args.MakeArgString(getToolChain().GetFilePath(C, "crti.o")));
26275ed34f4c58b6ad4e21038d713c1fae31a6146ff5Daniel Dunbar      CmdArgs.push_back(Args.MakeArgString(getToolChain().GetFilePath(C, "crtbeginS.o")));
262811e1b40d759a643086f590f6ffbd9d68360bad46Daniel Dunbar    }
262911e1b40d759a643086f590f6ffbd9d68360bad46Daniel Dunbar  }
263011e1b40d759a643086f590f6ffbd9d68360bad46Daniel Dunbar
263111e1b40d759a643086f590f6ffbd9d68360bad46Daniel Dunbar  Args.AddAllArgs(CmdArgs, options::OPT_L);
263211e1b40d759a643086f590f6ffbd9d68360bad46Daniel Dunbar  Args.AddAllArgs(CmdArgs, options::OPT_T_Group);
263311e1b40d759a643086f590f6ffbd9d68360bad46Daniel Dunbar  Args.AddAllArgs(CmdArgs, options::OPT_e);
263411e1b40d759a643086f590f6ffbd9d68360bad46Daniel Dunbar
263511e1b40d759a643086f590f6ffbd9d68360bad46Daniel Dunbar  for (InputInfoList::const_iterator
263611e1b40d759a643086f590f6ffbd9d68360bad46Daniel Dunbar         it = Inputs.begin(), ie = Inputs.end(); it != ie; ++it) {
263711e1b40d759a643086f590f6ffbd9d68360bad46Daniel Dunbar    const InputInfo &II = *it;
2638a8304f67291b0182fb64f3afc621615288dd1d31Daniel Dunbar
2639a8304f67291b0182fb64f3afc621615288dd1d31Daniel Dunbar    // Don't try to pass LLVM inputs to a generic gcc.
2640a8304f67291b0182fb64f3afc621615288dd1d31Daniel Dunbar    if (II.getType() == types::TY_LLVMBC)
2641a8304f67291b0182fb64f3afc621615288dd1d31Daniel Dunbar      D.Diag(clang::diag::err_drv_no_linker_llvm_support)
2642881376467c46c5c6cc16fa6790271c2c22e1d4f1Daniel Dunbar        << getToolChain().getTripleString();
2643a8304f67291b0182fb64f3afc621615288dd1d31Daniel Dunbar
264411e1b40d759a643086f590f6ffbd9d68360bad46Daniel Dunbar    if (II.isPipe())
264511e1b40d759a643086f590f6ffbd9d68360bad46Daniel Dunbar      CmdArgs.push_back("-");
264611e1b40d759a643086f590f6ffbd9d68360bad46Daniel Dunbar    else if (II.isFilename())
264711e1b40d759a643086f590f6ffbd9d68360bad46Daniel Dunbar      CmdArgs.push_back(II.getFilename());
264811e1b40d759a643086f590f6ffbd9d68360bad46Daniel Dunbar    else
264911e1b40d759a643086f590f6ffbd9d68360bad46Daniel Dunbar      II.getInputArg().renderAsInput(Args, CmdArgs);
265011e1b40d759a643086f590f6ffbd9d68360bad46Daniel Dunbar  }
265111e1b40d759a643086f590f6ffbd9d68360bad46Daniel Dunbar
265211e1b40d759a643086f590f6ffbd9d68360bad46Daniel Dunbar  if (!Args.hasArg(options::OPT_nostdlib) &&
265311e1b40d759a643086f590f6ffbd9d68360bad46Daniel Dunbar      !Args.hasArg(options::OPT_nodefaultlibs)) {
265411e1b40d759a643086f590f6ffbd9d68360bad46Daniel Dunbar    // FIXME: GCC passes on -lgcc, -lgcc_pic and a whole lot of
265511e1b40d759a643086f590f6ffbd9d68360bad46Daniel Dunbar    //         rpaths
265611e1b40d759a643086f590f6ffbd9d68360bad46Daniel Dunbar    CmdArgs.push_back("-L/usr/lib/gcc41");
265711e1b40d759a643086f590f6ffbd9d68360bad46Daniel Dunbar
265811e1b40d759a643086f590f6ffbd9d68360bad46Daniel Dunbar    if (!Args.hasArg(options::OPT_static)) {
265911e1b40d759a643086f590f6ffbd9d68360bad46Daniel Dunbar      CmdArgs.push_back("-rpath");
266011e1b40d759a643086f590f6ffbd9d68360bad46Daniel Dunbar      CmdArgs.push_back("/usr/lib/gcc41");
266111e1b40d759a643086f590f6ffbd9d68360bad46Daniel Dunbar
266211e1b40d759a643086f590f6ffbd9d68360bad46Daniel Dunbar      CmdArgs.push_back("-rpath-link");
266311e1b40d759a643086f590f6ffbd9d68360bad46Daniel Dunbar      CmdArgs.push_back("/usr/lib/gcc41");
266411e1b40d759a643086f590f6ffbd9d68360bad46Daniel Dunbar
266511e1b40d759a643086f590f6ffbd9d68360bad46Daniel Dunbar      CmdArgs.push_back("-rpath");
266611e1b40d759a643086f590f6ffbd9d68360bad46Daniel Dunbar      CmdArgs.push_back("/usr/lib");
266711e1b40d759a643086f590f6ffbd9d68360bad46Daniel Dunbar
266811e1b40d759a643086f590f6ffbd9d68360bad46Daniel Dunbar      CmdArgs.push_back("-rpath-link");
266911e1b40d759a643086f590f6ffbd9d68360bad46Daniel Dunbar      CmdArgs.push_back("/usr/lib");
267011e1b40d759a643086f590f6ffbd9d68360bad46Daniel Dunbar    }
267111e1b40d759a643086f590f6ffbd9d68360bad46Daniel Dunbar
267211e1b40d759a643086f590f6ffbd9d68360bad46Daniel Dunbar    if (Args.hasArg(options::OPT_shared)) {
267311e1b40d759a643086f590f6ffbd9d68360bad46Daniel Dunbar      CmdArgs.push_back("-lgcc_pic");
267411e1b40d759a643086f590f6ffbd9d68360bad46Daniel Dunbar    } else {
267511e1b40d759a643086f590f6ffbd9d68360bad46Daniel Dunbar      CmdArgs.push_back("-lgcc");
267611e1b40d759a643086f590f6ffbd9d68360bad46Daniel Dunbar    }
267711e1b40d759a643086f590f6ffbd9d68360bad46Daniel Dunbar
267811e1b40d759a643086f590f6ffbd9d68360bad46Daniel Dunbar
267911e1b40d759a643086f590f6ffbd9d68360bad46Daniel Dunbar    if (Args.hasArg(options::OPT_pthread))
268011e1b40d759a643086f590f6ffbd9d68360bad46Daniel Dunbar      CmdArgs.push_back("-lthread_xu");
268111e1b40d759a643086f590f6ffbd9d68360bad46Daniel Dunbar
268211e1b40d759a643086f590f6ffbd9d68360bad46Daniel Dunbar    if (!Args.hasArg(options::OPT_nolibc)) {
268311e1b40d759a643086f590f6ffbd9d68360bad46Daniel Dunbar      CmdArgs.push_back("-lc");
268411e1b40d759a643086f590f6ffbd9d68360bad46Daniel Dunbar    }
268511e1b40d759a643086f590f6ffbd9d68360bad46Daniel Dunbar
268611e1b40d759a643086f590f6ffbd9d68360bad46Daniel Dunbar    if (Args.hasArg(options::OPT_shared)) {
268711e1b40d759a643086f590f6ffbd9d68360bad46Daniel Dunbar      CmdArgs.push_back("-lgcc_pic");
268811e1b40d759a643086f590f6ffbd9d68360bad46Daniel Dunbar    } else {
268911e1b40d759a643086f590f6ffbd9d68360bad46Daniel Dunbar      CmdArgs.push_back("-lgcc");
269011e1b40d759a643086f590f6ffbd9d68360bad46Daniel Dunbar    }
269111e1b40d759a643086f590f6ffbd9d68360bad46Daniel Dunbar  }
269211e1b40d759a643086f590f6ffbd9d68360bad46Daniel Dunbar
269311e1b40d759a643086f590f6ffbd9d68360bad46Daniel Dunbar  if (!Args.hasArg(options::OPT_nostdlib) &&
269411e1b40d759a643086f590f6ffbd9d68360bad46Daniel Dunbar      !Args.hasArg(options::OPT_nostartfiles)) {
269511e1b40d759a643086f590f6ffbd9d68360bad46Daniel Dunbar    if (!Args.hasArg(options::OPT_shared))
26965ed34f4c58b6ad4e21038d713c1fae31a6146ff5Daniel Dunbar      CmdArgs.push_back(Args.MakeArgString(getToolChain().GetFilePath(C, "crtend.o")));
269711e1b40d759a643086f590f6ffbd9d68360bad46Daniel Dunbar    else
26985ed34f4c58b6ad4e21038d713c1fae31a6146ff5Daniel Dunbar      CmdArgs.push_back(Args.MakeArgString(getToolChain().GetFilePath(C, "crtendS.o")));
26995ed34f4c58b6ad4e21038d713c1fae31a6146ff5Daniel Dunbar    CmdArgs.push_back(Args.MakeArgString(getToolChain().GetFilePath(C, "crtn.o")));
270011e1b40d759a643086f590f6ffbd9d68360bad46Daniel Dunbar  }
270111e1b40d759a643086f590f6ffbd9d68360bad46Daniel Dunbar
270211e1b40d759a643086f590f6ffbd9d68360bad46Daniel Dunbar  const char *Exec =
27035ed34f4c58b6ad4e21038d713c1fae31a6146ff5Daniel Dunbar    Args.MakeArgString(getToolChain().GetProgramPath(C, "ld"));
2704cae087e164e94e4286c11bf694dd0ff88f295302Daniel Dunbar  Dest.addCommand(new Command(JA, Exec, CmdArgs));
270511e1b40d759a643086f590f6ffbd9d68360bad46Daniel Dunbar}
2706