Tools.cpp revision e9756514b410b0ac5afa00cdb4569e1f62f4a7f4
16ba612efffba42bec102ac58a1540496158f747eAndrew Sapperstein//===--- Tools.cpp - Tools Implementations ------------------------------*-===//
26ba612efffba42bec102ac58a1540496158f747eAndrew Sapperstein//
36ba612efffba42bec102ac58a1540496158f747eAndrew Sapperstein//                     The LLVM Compiler Infrastructure
46ba612efffba42bec102ac58a1540496158f747eAndrew Sapperstein//
56ba612efffba42bec102ac58a1540496158f747eAndrew Sapperstein// This file is distributed under the University of Illinois Open Source
66ba612efffba42bec102ac58a1540496158f747eAndrew Sapperstein// License. See LICENSE.TXT for details.
76ba612efffba42bec102ac58a1540496158f747eAndrew Sapperstein//
86ba612efffba42bec102ac58a1540496158f747eAndrew Sapperstein//===----------------------------------------------------------------------===//
96ba612efffba42bec102ac58a1540496158f747eAndrew Sapperstein
106ba612efffba42bec102ac58a1540496158f747eAndrew Sapperstein#include "Tools.h"
116ba612efffba42bec102ac58a1540496158f747eAndrew Sapperstein
126ba612efffba42bec102ac58a1540496158f747eAndrew Sapperstein#include "clang/Basic/Version.h"
136ba612efffba42bec102ac58a1540496158f747eAndrew Sapperstein#include "clang/Driver/Action.h"
146ba612efffba42bec102ac58a1540496158f747eAndrew Sapperstein#include "clang/Driver/Arg.h"
156ba612efffba42bec102ac58a1540496158f747eAndrew Sapperstein#include "clang/Driver/ArgList.h"
166ba612efffba42bec102ac58a1540496158f747eAndrew Sapperstein#include "clang/Driver/Driver.h"
17d6eaacbb9eb56763d38a3815fc509b92ed98a585Andrew Sapperstein#include "clang/Driver/DriverDiagnostic.h"
18d6eaacbb9eb56763d38a3815fc509b92ed98a585Andrew Sapperstein#include "clang/Driver/Compilation.h"
19d6eaacbb9eb56763d38a3815fc509b92ed98a585Andrew Sapperstein#include "clang/Driver/Job.h"
20d6eaacbb9eb56763d38a3815fc509b92ed98a585Andrew Sapperstein#include "clang/Driver/HostInfo.h"
21d6eaacbb9eb56763d38a3815fc509b92ed98a585Andrew Sapperstein#include "clang/Driver/Option.h"
22d6eaacbb9eb56763d38a3815fc509b92ed98a585Andrew Sapperstein#include "clang/Driver/Options.h"
23d6eaacbb9eb56763d38a3815fc509b92ed98a585Andrew Sapperstein#include "clang/Driver/ToolChain.h"
24d6eaacbb9eb56763d38a3815fc509b92ed98a585Andrew Sapperstein#include "clang/Driver/Util.h"
25d6eaacbb9eb56763d38a3815fc509b92ed98a585Andrew Sapperstein
26d6eaacbb9eb56763d38a3815fc509b92ed98a585Andrew Sapperstein#include "llvm/ADT/SmallString.h"
27d6eaacbb9eb56763d38a3815fc509b92ed98a585Andrew Sapperstein#include "llvm/ADT/StringSwitch.h"
28d6eaacbb9eb56763d38a3815fc509b92ed98a585Andrew Sapperstein#include "llvm/ADT/Twine.h"
29d6eaacbb9eb56763d38a3815fc509b92ed98a585Andrew Sapperstein#include "llvm/Support/Format.h"
30d6eaacbb9eb56763d38a3815fc509b92ed98a585Andrew Sapperstein#include "llvm/Support/raw_ostream.h"
31d6eaacbb9eb56763d38a3815fc509b92ed98a585Andrew Sapperstein#include "llvm/System/Host.h"
32d6eaacbb9eb56763d38a3815fc509b92ed98a585Andrew Sapperstein#include "llvm/System/Process.h"
33d6eaacbb9eb56763d38a3815fc509b92ed98a585Andrew Sapperstein
34d6eaacbb9eb56763d38a3815fc509b92ed98a585Andrew Sapperstein#include "InputInfo.h"
35d6eaacbb9eb56763d38a3815fc509b92ed98a585Andrew Sapperstein#include "ToolChains.h"
36d6eaacbb9eb56763d38a3815fc509b92ed98a585Andrew Sapperstein
37d6eaacbb9eb56763d38a3815fc509b92ed98a585Andrew Sappersteinusing namespace clang::driver;
38d6eaacbb9eb56763d38a3815fc509b92ed98a585Andrew Sappersteinusing namespace clang::driver::tools;
39d6eaacbb9eb56763d38a3815fc509b92ed98a585Andrew Sapperstein
40d6eaacbb9eb56763d38a3815fc509b92ed98a585Andrew Sapperstein/// CheckPreprocessingOptions - Perform some validation of preprocessing
41d6eaacbb9eb56763d38a3815fc509b92ed98a585Andrew Sapperstein/// arguments that is shared with gcc.
42d6eaacbb9eb56763d38a3815fc509b92ed98a585Andrew Sappersteinstatic void CheckPreprocessingOptions(const Driver &D, const ArgList &Args) {
43d6eaacbb9eb56763d38a3815fc509b92ed98a585Andrew Sapperstein  if (Arg *A = Args.getLastArg(options::OPT_C, options::OPT_CC))
44d6eaacbb9eb56763d38a3815fc509b92ed98a585Andrew Sapperstein    if (!Args.hasArg(options::OPT_E))
45d6eaacbb9eb56763d38a3815fc509b92ed98a585Andrew Sapperstein      D.Diag(clang::diag::err_drv_argument_only_allowed_with)
46d6eaacbb9eb56763d38a3815fc509b92ed98a585Andrew Sapperstein        << A->getAsString(Args) << "-E";
47d6eaacbb9eb56763d38a3815fc509b92ed98a585Andrew Sapperstein}
48d6eaacbb9eb56763d38a3815fc509b92ed98a585Andrew Sapperstein
49d6eaacbb9eb56763d38a3815fc509b92ed98a585Andrew Sapperstein/// CheckCodeGenerationOptions - Perform some validation of code generation
50d6eaacbb9eb56763d38a3815fc509b92ed98a585Andrew Sapperstein/// arguments that is shared with gcc.
516ba612efffba42bec102ac58a1540496158f747eAndrew Sappersteinstatic void CheckCodeGenerationOptions(const Driver &D, const ArgList &Args) {
526ba612efffba42bec102ac58a1540496158f747eAndrew Sapperstein  // In gcc, only ARM checks this, but it seems reasonable to check universally.
536ba612efffba42bec102ac58a1540496158f747eAndrew Sapperstein  if (Args.hasArg(options::OPT_static))
546ba612efffba42bec102ac58a1540496158f747eAndrew Sapperstein    if (const Arg *A = Args.getLastArg(options::OPT_dynamic,
556ba612efffba42bec102ac58a1540496158f747eAndrew Sapperstein                                       options::OPT_mdynamic_no_pic))
566ba612efffba42bec102ac58a1540496158f747eAndrew Sapperstein      D.Diag(clang::diag::err_drv_argument_not_allowed_with)
576ba612efffba42bec102ac58a1540496158f747eAndrew Sapperstein        << A->getAsString(Args) << "-static";
586ba612efffba42bec102ac58a1540496158f747eAndrew Sapperstein}
596ba612efffba42bec102ac58a1540496158f747eAndrew Sapperstein
606ba612efffba42bec102ac58a1540496158f747eAndrew Sappersteinvoid Clang::AddPreprocessingOptions(const Driver &D,
616ba612efffba42bec102ac58a1540496158f747eAndrew Sapperstein                                    const ArgList &Args,
626ba612efffba42bec102ac58a1540496158f747eAndrew Sapperstein                                    ArgStringList &CmdArgs,
636ba612efffba42bec102ac58a1540496158f747eAndrew Sapperstein                                    const InputInfo &Output,
646ba612efffba42bec102ac58a1540496158f747eAndrew Sapperstein                                    const InputInfoList &Inputs) const {
656ba612efffba42bec102ac58a1540496158f747eAndrew Sapperstein  Arg *A;
666ba612efffba42bec102ac58a1540496158f747eAndrew Sapperstein
676ba612efffba42bec102ac58a1540496158f747eAndrew Sapperstein  CheckPreprocessingOptions(D, Args);
686ba612efffba42bec102ac58a1540496158f747eAndrew Sapperstein
696ba612efffba42bec102ac58a1540496158f747eAndrew Sapperstein  Args.AddLastArg(CmdArgs, options::OPT_C);
706ba612efffba42bec102ac58a1540496158f747eAndrew Sapperstein  Args.AddLastArg(CmdArgs, options::OPT_CC);
716ba612efffba42bec102ac58a1540496158f747eAndrew Sapperstein
726ba612efffba42bec102ac58a1540496158f747eAndrew Sapperstein  // Handle dependency file generation.
736ba612efffba42bec102ac58a1540496158f747eAndrew Sapperstein  if ((A = Args.getLastArg(options::OPT_M)) ||
746ba612efffba42bec102ac58a1540496158f747eAndrew Sapperstein      (A = Args.getLastArg(options::OPT_MM)) ||
756ba612efffba42bec102ac58a1540496158f747eAndrew Sapperstein      (A = Args.getLastArg(options::OPT_MD)) ||
766ba612efffba42bec102ac58a1540496158f747eAndrew Sapperstein      (A = Args.getLastArg(options::OPT_MMD))) {
776ba612efffba42bec102ac58a1540496158f747eAndrew Sapperstein    // Determine the output location.
786ba612efffba42bec102ac58a1540496158f747eAndrew Sapperstein    const char *DepFile;
796ba612efffba42bec102ac58a1540496158f747eAndrew Sapperstein    if (Output.getType() == types::TY_Dependencies) {
806ba612efffba42bec102ac58a1540496158f747eAndrew Sapperstein      if (Output.isPipe())
816ba612efffba42bec102ac58a1540496158f747eAndrew Sapperstein        DepFile = "-";
826ba612efffba42bec102ac58a1540496158f747eAndrew Sapperstein      else
836ba612efffba42bec102ac58a1540496158f747eAndrew Sapperstein        DepFile = Output.getFilename();
846ba612efffba42bec102ac58a1540496158f747eAndrew Sapperstein    } else if (Arg *MF = Args.getLastArg(options::OPT_MF)) {
856ba612efffba42bec102ac58a1540496158f747eAndrew Sapperstein      DepFile = MF->getValue(Args);
866ba612efffba42bec102ac58a1540496158f747eAndrew Sapperstein    } else if (A->getOption().matches(options::OPT_M) ||
876ba612efffba42bec102ac58a1540496158f747eAndrew Sapperstein               A->getOption().matches(options::OPT_MM)) {
886ba612efffba42bec102ac58a1540496158f747eAndrew Sapperstein      DepFile = "-";
896ba612efffba42bec102ac58a1540496158f747eAndrew Sapperstein    } else {
906ba612efffba42bec102ac58a1540496158f747eAndrew Sapperstein      DepFile = darwin::CC1::getDependencyFileName(Args, Inputs);
916ba612efffba42bec102ac58a1540496158f747eAndrew Sapperstein    }
926ba612efffba42bec102ac58a1540496158f747eAndrew Sapperstein    CmdArgs.push_back("-dependency-file");
936ba612efffba42bec102ac58a1540496158f747eAndrew Sapperstein    CmdArgs.push_back(DepFile);
946ba612efffba42bec102ac58a1540496158f747eAndrew Sapperstein
956ba612efffba42bec102ac58a1540496158f747eAndrew Sapperstein    // Add an -MT option if the user didn't specify their own.
966ba612efffba42bec102ac58a1540496158f747eAndrew Sapperstein    //
976ba612efffba42bec102ac58a1540496158f747eAndrew Sapperstein    // FIXME: This should use -MQ, when we support it.
986ba612efffba42bec102ac58a1540496158f747eAndrew Sapperstein    if (!Args.hasArg(options::OPT_MT) && !Args.hasArg(options::OPT_MQ)) {
996ba612efffba42bec102ac58a1540496158f747eAndrew Sapperstein      const char *DepTarget;
1006ba612efffba42bec102ac58a1540496158f747eAndrew Sapperstein
1016ba612efffba42bec102ac58a1540496158f747eAndrew Sapperstein      // If user provided -o, that is the dependency target, except
1026ba612efffba42bec102ac58a1540496158f747eAndrew Sapperstein      // when we are only generating a dependency file.
1036ba612efffba42bec102ac58a1540496158f747eAndrew Sapperstein      Arg *OutputOpt = Args.getLastArg(options::OPT_o);
1046ba612efffba42bec102ac58a1540496158f747eAndrew Sapperstein      if (OutputOpt && Output.getType() != types::TY_Dependencies) {
1056ba612efffba42bec102ac58a1540496158f747eAndrew Sapperstein        DepTarget = OutputOpt->getValue(Args);
1066ba612efffba42bec102ac58a1540496158f747eAndrew Sapperstein      } else {
1076ba612efffba42bec102ac58a1540496158f747eAndrew Sapperstein        // Otherwise derive from the base input.
1086ba612efffba42bec102ac58a1540496158f747eAndrew Sapperstein        //
1096ba612efffba42bec102ac58a1540496158f747eAndrew Sapperstein        // FIXME: This should use the computed output file location.
1106ba612efffba42bec102ac58a1540496158f747eAndrew Sapperstein        llvm::sys::Path P(Inputs[0].getBaseInput());
1116ba612efffba42bec102ac58a1540496158f747eAndrew Sapperstein
1126ba612efffba42bec102ac58a1540496158f747eAndrew Sapperstein        P.eraseSuffix();
1136ba612efffba42bec102ac58a1540496158f747eAndrew Sapperstein        P.appendSuffix("o");
1146ba612efffba42bec102ac58a1540496158f747eAndrew Sapperstein        DepTarget = Args.MakeArgString(P.getLast());
1156ba612efffba42bec102ac58a1540496158f747eAndrew Sapperstein      }
1166ba612efffba42bec102ac58a1540496158f747eAndrew Sapperstein
1176ba612efffba42bec102ac58a1540496158f747eAndrew Sapperstein      CmdArgs.push_back("-MT");
1186ba612efffba42bec102ac58a1540496158f747eAndrew Sapperstein      CmdArgs.push_back(DepTarget);
1196ba612efffba42bec102ac58a1540496158f747eAndrew Sapperstein    }
1206ba612efffba42bec102ac58a1540496158f747eAndrew Sapperstein
1216ba612efffba42bec102ac58a1540496158f747eAndrew Sapperstein    if (A->getOption().matches(options::OPT_M) ||
1226ba612efffba42bec102ac58a1540496158f747eAndrew Sapperstein        A->getOption().matches(options::OPT_MD))
1236ba612efffba42bec102ac58a1540496158f747eAndrew Sapperstein      CmdArgs.push_back("-sys-header-deps");
1246ba612efffba42bec102ac58a1540496158f747eAndrew Sapperstein  }
1256ba612efffba42bec102ac58a1540496158f747eAndrew Sapperstein
1266ba612efffba42bec102ac58a1540496158f747eAndrew Sapperstein  Args.AddLastArg(CmdArgs, options::OPT_MP);
1276ba612efffba42bec102ac58a1540496158f747eAndrew Sapperstein  Args.AddAllArgs(CmdArgs, options::OPT_MT);
1286ba612efffba42bec102ac58a1540496158f747eAndrew Sapperstein
1296ba612efffba42bec102ac58a1540496158f747eAndrew Sapperstein  // Add -i* options, and automatically translate to
1306ba612efffba42bec102ac58a1540496158f747eAndrew Sapperstein  // -include-pch/-include-pth for transparent PCH support. It's
1316ba612efffba42bec102ac58a1540496158f747eAndrew Sapperstein  // wonky, but we include looking for .gch so we can support seamless
1326ba612efffba42bec102ac58a1540496158f747eAndrew Sapperstein  // replacement into a build system already set up to be generating
1336ba612efffba42bec102ac58a1540496158f747eAndrew Sapperstein  // .gch files.
1346ba612efffba42bec102ac58a1540496158f747eAndrew Sapperstein  for (arg_iterator it = Args.filtered_begin(options::OPT_clang_i_Group),
1356ba612efffba42bec102ac58a1540496158f747eAndrew Sapperstein         ie = Args.filtered_end(); it != ie; ++it) {
1366ba612efffba42bec102ac58a1540496158f747eAndrew Sapperstein    const Arg *A = it;
1376ba612efffba42bec102ac58a1540496158f747eAndrew Sapperstein
1386ba612efffba42bec102ac58a1540496158f747eAndrew Sapperstein    if (A->getOption().matches(options::OPT_include)) {
1396ba612efffba42bec102ac58a1540496158f747eAndrew Sapperstein      // Use PCH if the user requested it, except for C++ (for now).
1406ba612efffba42bec102ac58a1540496158f747eAndrew Sapperstein      bool UsePCH = D.CCCUsePCH;
1416ba612efffba42bec102ac58a1540496158f747eAndrew Sapperstein      if (types::isCXX(Inputs[0].getType()))
1426ba612efffba42bec102ac58a1540496158f747eAndrew Sapperstein        UsePCH = false;
1436ba612efffba42bec102ac58a1540496158f747eAndrew Sapperstein
1446ba612efffba42bec102ac58a1540496158f747eAndrew Sapperstein      bool FoundPTH = false;
1456ba612efffba42bec102ac58a1540496158f747eAndrew Sapperstein      bool FoundPCH = false;
1466ba612efffba42bec102ac58a1540496158f747eAndrew Sapperstein      llvm::sys::Path P(A->getValue(Args));
1476ba612efffba42bec102ac58a1540496158f747eAndrew Sapperstein      if (UsePCH) {
1486ba612efffba42bec102ac58a1540496158f747eAndrew Sapperstein        P.appendSuffix("pch");
149d6eaacbb9eb56763d38a3815fc509b92ed98a585Andrew Sapperstein        if (P.exists())
150d6eaacbb9eb56763d38a3815fc509b92ed98a585Andrew Sapperstein          FoundPCH = true;
151d6eaacbb9eb56763d38a3815fc509b92ed98a585Andrew Sapperstein        else
152d6eaacbb9eb56763d38a3815fc509b92ed98a585Andrew Sapperstein          P.eraseSuffix();
153d6eaacbb9eb56763d38a3815fc509b92ed98a585Andrew Sapperstein      }
154d6eaacbb9eb56763d38a3815fc509b92ed98a585Andrew Sapperstein
155d6eaacbb9eb56763d38a3815fc509b92ed98a585Andrew Sapperstein      if (!FoundPCH) {
156d6eaacbb9eb56763d38a3815fc509b92ed98a585Andrew Sapperstein        P.appendSuffix("pth");
157d6eaacbb9eb56763d38a3815fc509b92ed98a585Andrew Sapperstein        if (P.exists())
158d6eaacbb9eb56763d38a3815fc509b92ed98a585Andrew Sapperstein          FoundPTH = true;
159d6eaacbb9eb56763d38a3815fc509b92ed98a585Andrew Sapperstein        else
160d6eaacbb9eb56763d38a3815fc509b92ed98a585Andrew Sapperstein          P.eraseSuffix();
1616ba612efffba42bec102ac58a1540496158f747eAndrew Sapperstein      }
162d6eaacbb9eb56763d38a3815fc509b92ed98a585Andrew Sapperstein
163d6eaacbb9eb56763d38a3815fc509b92ed98a585Andrew Sapperstein      if (!FoundPCH && !FoundPTH) {
164d6eaacbb9eb56763d38a3815fc509b92ed98a585Andrew Sapperstein        P.appendSuffix("gch");
165d6eaacbb9eb56763d38a3815fc509b92ed98a585Andrew Sapperstein        if (P.exists()) {
166d6eaacbb9eb56763d38a3815fc509b92ed98a585Andrew Sapperstein          FoundPCH = UsePCH;
167d6eaacbb9eb56763d38a3815fc509b92ed98a585Andrew Sapperstein          FoundPTH = !UsePCH;
1686ba612efffba42bec102ac58a1540496158f747eAndrew Sapperstein        }
1696ba612efffba42bec102ac58a1540496158f747eAndrew Sapperstein        else
170d6eaacbb9eb56763d38a3815fc509b92ed98a585Andrew Sapperstein          P.eraseSuffix();
171d6eaacbb9eb56763d38a3815fc509b92ed98a585Andrew Sapperstein      }
172d6eaacbb9eb56763d38a3815fc509b92ed98a585Andrew Sapperstein
173d6eaacbb9eb56763d38a3815fc509b92ed98a585Andrew Sapperstein      if (FoundPCH || FoundPTH) {
174d6eaacbb9eb56763d38a3815fc509b92ed98a585Andrew Sapperstein        A->claim();
175d6eaacbb9eb56763d38a3815fc509b92ed98a585Andrew Sapperstein        if (UsePCH)
176d6eaacbb9eb56763d38a3815fc509b92ed98a585Andrew Sapperstein          CmdArgs.push_back("-include-pch");
177d6eaacbb9eb56763d38a3815fc509b92ed98a585Andrew Sapperstein        else
178d6eaacbb9eb56763d38a3815fc509b92ed98a585Andrew Sapperstein          CmdArgs.push_back("-include-pth");
179d6eaacbb9eb56763d38a3815fc509b92ed98a585Andrew Sapperstein        CmdArgs.push_back(Args.MakeArgString(P.str()));
180d6eaacbb9eb56763d38a3815fc509b92ed98a585Andrew Sapperstein        continue;
181d6eaacbb9eb56763d38a3815fc509b92ed98a585Andrew Sapperstein      }
182d6eaacbb9eb56763d38a3815fc509b92ed98a585Andrew Sapperstein    }
183d6eaacbb9eb56763d38a3815fc509b92ed98a585Andrew Sapperstein
184d6eaacbb9eb56763d38a3815fc509b92ed98a585Andrew Sapperstein    // Not translated, render as usual.
185d6eaacbb9eb56763d38a3815fc509b92ed98a585Andrew Sapperstein    A->claim();
186d6eaacbb9eb56763d38a3815fc509b92ed98a585Andrew Sapperstein    A->render(Args, CmdArgs);
187d6eaacbb9eb56763d38a3815fc509b92ed98a585Andrew Sapperstein  }
188d6eaacbb9eb56763d38a3815fc509b92ed98a585Andrew Sapperstein
1896ba612efffba42bec102ac58a1540496158f747eAndrew Sapperstein  Args.AddAllArgs(CmdArgs, options::OPT_D, options::OPT_U);
1906ba612efffba42bec102ac58a1540496158f747eAndrew Sapperstein  Args.AddAllArgs(CmdArgs, options::OPT_I_Group, options::OPT_F);
191d6eaacbb9eb56763d38a3815fc509b92ed98a585Andrew Sapperstein
192d6eaacbb9eb56763d38a3815fc509b92ed98a585Andrew Sapperstein  // Add -Wp, and -Xassembler if using the preprocessor.
193d6eaacbb9eb56763d38a3815fc509b92ed98a585Andrew Sapperstein
194d6eaacbb9eb56763d38a3815fc509b92ed98a585Andrew Sapperstein  // FIXME: There is a very unfortunate problem here, some troubled
195d6eaacbb9eb56763d38a3815fc509b92ed98a585Andrew Sapperstein  // souls abuse -Wp, to pass preprocessor options in gcc syntax. To
196d6eaacbb9eb56763d38a3815fc509b92ed98a585Andrew Sapperstein  // really support that we would have to parse and then translate
197d6eaacbb9eb56763d38a3815fc509b92ed98a585Andrew Sapperstein  // those options. :(
198d6eaacbb9eb56763d38a3815fc509b92ed98a585Andrew Sapperstein  Args.AddAllArgValues(CmdArgs, options::OPT_Wp_COMMA,
199d6eaacbb9eb56763d38a3815fc509b92ed98a585Andrew Sapperstein                       options::OPT_Xpreprocessor);
200d6eaacbb9eb56763d38a3815fc509b92ed98a585Andrew Sapperstein
201d6eaacbb9eb56763d38a3815fc509b92ed98a585Andrew Sapperstein  // -I- is a deprecated GCC feature, reject it.
202d6eaacbb9eb56763d38a3815fc509b92ed98a585Andrew Sapperstein  if (Arg *A = Args.getLastArg(options::OPT_I_))
203d6eaacbb9eb56763d38a3815fc509b92ed98a585Andrew Sapperstein    D.Diag(clang::diag::err_drv_I_dash_not_supported) << A->getAsString(Args);
204d6eaacbb9eb56763d38a3815fc509b92ed98a585Andrew Sapperstein}
205d6eaacbb9eb56763d38a3815fc509b92ed98a585Andrew Sapperstein
206d6eaacbb9eb56763d38a3815fc509b92ed98a585Andrew Sapperstein/// getARMTargetCPU - Get the (LLVM) name of the ARM cpu we are targetting.
2076ba612efffba42bec102ac58a1540496158f747eAndrew Sapperstein//
208d6eaacbb9eb56763d38a3815fc509b92ed98a585Andrew Sapperstein// FIXME: tblgen this.
209d6eaacbb9eb56763d38a3815fc509b92ed98a585Andrew Sappersteinstatic const char *getARMTargetCPU(const ArgList &Args) {
210d6eaacbb9eb56763d38a3815fc509b92ed98a585Andrew Sapperstein  // FIXME: Warn on inconsistent use of -mcpu and -march.
211d6eaacbb9eb56763d38a3815fc509b92ed98a585Andrew Sapperstein
212d6eaacbb9eb56763d38a3815fc509b92ed98a585Andrew Sapperstein  // If we have -mcpu=, use that.
213d6eaacbb9eb56763d38a3815fc509b92ed98a585Andrew Sapperstein  if (Arg *A = Args.getLastArg(options::OPT_mcpu_EQ))
214d6eaacbb9eb56763d38a3815fc509b92ed98a585Andrew Sapperstein    return A->getValue(Args);
215d6eaacbb9eb56763d38a3815fc509b92ed98a585Andrew Sapperstein
216d6eaacbb9eb56763d38a3815fc509b92ed98a585Andrew Sapperstein  // Otherwise, if we have -march= choose the base CPU for that arch.
217d6eaacbb9eb56763d38a3815fc509b92ed98a585Andrew Sapperstein  if (Arg *A = Args.getLastArg(options::OPT_march_EQ)) {
218d6eaacbb9eb56763d38a3815fc509b92ed98a585Andrew Sapperstein    llvm::StringRef MArch = A->getValue(Args);
219d6eaacbb9eb56763d38a3815fc509b92ed98a585Andrew Sapperstein
220d6eaacbb9eb56763d38a3815fc509b92ed98a585Andrew Sapperstein    if (MArch == "armv2" || MArch == "armv2a")
221d6eaacbb9eb56763d38a3815fc509b92ed98a585Andrew Sapperstein      return "arm2";
222d6eaacbb9eb56763d38a3815fc509b92ed98a585Andrew Sapperstein    if (MArch == "armv3")
223d6eaacbb9eb56763d38a3815fc509b92ed98a585Andrew Sapperstein      return "arm6";
224d6eaacbb9eb56763d38a3815fc509b92ed98a585Andrew Sapperstein    if (MArch == "armv3m")
225d6eaacbb9eb56763d38a3815fc509b92ed98a585Andrew Sapperstein      return "arm7m";
226d6eaacbb9eb56763d38a3815fc509b92ed98a585Andrew Sapperstein    if (MArch == "armv4" || MArch == "armv4t")
227d6eaacbb9eb56763d38a3815fc509b92ed98a585Andrew Sapperstein      return "arm7tdmi";
228d6eaacbb9eb56763d38a3815fc509b92ed98a585Andrew Sapperstein    if (MArch == "armv5" || MArch == "armv5t")
229d6eaacbb9eb56763d38a3815fc509b92ed98a585Andrew Sapperstein      return "arm10tdmi";
230d6eaacbb9eb56763d38a3815fc509b92ed98a585Andrew Sapperstein    if (MArch == "armv5e" || MArch == "armv5te")
231d6eaacbb9eb56763d38a3815fc509b92ed98a585Andrew Sapperstein      return "arm1026ejs";
232d6eaacbb9eb56763d38a3815fc509b92ed98a585Andrew Sapperstein    if (MArch == "armv5tej")
233d6eaacbb9eb56763d38a3815fc509b92ed98a585Andrew Sapperstein      return "arm926ejs";
234d6eaacbb9eb56763d38a3815fc509b92ed98a585Andrew Sapperstein    if (MArch == "armv6" || MArch == "armv6k")
235d6eaacbb9eb56763d38a3815fc509b92ed98a585Andrew Sapperstein      return "arm1136jf-s";
236d6eaacbb9eb56763d38a3815fc509b92ed98a585Andrew Sapperstein    if (MArch == "armv6j")
237d6eaacbb9eb56763d38a3815fc509b92ed98a585Andrew Sapperstein      return "arm1136j-s";
238d6eaacbb9eb56763d38a3815fc509b92ed98a585Andrew Sapperstein    if (MArch == "armv6z" || MArch == "armv6zk")
239d6eaacbb9eb56763d38a3815fc509b92ed98a585Andrew Sapperstein      return "arm1176jzf-s";
240d6eaacbb9eb56763d38a3815fc509b92ed98a585Andrew Sapperstein    if (MArch == "armv6t2")
241d6eaacbb9eb56763d38a3815fc509b92ed98a585Andrew Sapperstein      return "arm1156t2-s";
242d6eaacbb9eb56763d38a3815fc509b92ed98a585Andrew Sapperstein    if (MArch == "armv7" || MArch == "armv7a" || MArch == "armv7-a")
243d6eaacbb9eb56763d38a3815fc509b92ed98a585Andrew Sapperstein      return "cortex-a8";
244d6eaacbb9eb56763d38a3815fc509b92ed98a585Andrew Sapperstein    if (MArch == "armv7r" || MArch == "armv7-r")
245d6eaacbb9eb56763d38a3815fc509b92ed98a585Andrew Sapperstein      return "cortex-r4";
2466ba612efffba42bec102ac58a1540496158f747eAndrew Sapperstein    if (MArch == "armv7m" || MArch == "armv7-m")
247d6eaacbb9eb56763d38a3815fc509b92ed98a585Andrew Sapperstein      return "cortex-m3";
248d6eaacbb9eb56763d38a3815fc509b92ed98a585Andrew Sapperstein    if (MArch == "ep9312")
249d6eaacbb9eb56763d38a3815fc509b92ed98a585Andrew Sapperstein      return "ep9312";
250d6eaacbb9eb56763d38a3815fc509b92ed98a585Andrew Sapperstein    if (MArch == "iwmmxt")
251d6eaacbb9eb56763d38a3815fc509b92ed98a585Andrew Sapperstein      return "iwmmxt";
252d6eaacbb9eb56763d38a3815fc509b92ed98a585Andrew Sapperstein    if (MArch == "xscale")
2536ba612efffba42bec102ac58a1540496158f747eAndrew Sapperstein      return "xscale";
254d6eaacbb9eb56763d38a3815fc509b92ed98a585Andrew Sapperstein  }
255d6eaacbb9eb56763d38a3815fc509b92ed98a585Andrew Sapperstein
2566ba612efffba42bec102ac58a1540496158f747eAndrew Sapperstein  // Otherwise return the most base CPU LLVM supports.
257d6eaacbb9eb56763d38a3815fc509b92ed98a585Andrew Sapperstein  return "arm7tdmi";
258d6eaacbb9eb56763d38a3815fc509b92ed98a585Andrew Sapperstein}
259d6eaacbb9eb56763d38a3815fc509b92ed98a585Andrew Sapperstein
260d6eaacbb9eb56763d38a3815fc509b92ed98a585Andrew Sapperstein/// getLLVMArchSuffixForARM - Get the LLVM arch name to use for a particular
261d6eaacbb9eb56763d38a3815fc509b92ed98a585Andrew Sapperstein/// CPU.
262d6eaacbb9eb56763d38a3815fc509b92ed98a585Andrew Sapperstein//
263d6eaacbb9eb56763d38a3815fc509b92ed98a585Andrew Sapperstein// FIXME: This is redundant with -mcpu, why does LLVM use this.
264d6eaacbb9eb56763d38a3815fc509b92ed98a585Andrew Sapperstein// FIXME: tblgen this, or kill it!
265d6eaacbb9eb56763d38a3815fc509b92ed98a585Andrew Sappersteinstatic const char *getLLVMArchSuffixForARM(llvm::StringRef CPU) {
266d6eaacbb9eb56763d38a3815fc509b92ed98a585Andrew Sapperstein  if (CPU == "arm7tdmi" || CPU == "arm7tdmi-s" || CPU == "arm710t" ||
267d6eaacbb9eb56763d38a3815fc509b92ed98a585Andrew Sapperstein      CPU == "arm720t" || CPU == "arm9" || CPU == "arm9tdmi" ||
268d6eaacbb9eb56763d38a3815fc509b92ed98a585Andrew Sapperstein      CPU == "arm920" || CPU == "arm920t" || CPU == "arm922t" ||
2696ba612efffba42bec102ac58a1540496158f747eAndrew Sapperstein      CPU == "arm940t" || CPU == "ep9312")
270d6eaacbb9eb56763d38a3815fc509b92ed98a585Andrew Sapperstein    return "v4t";
271d6eaacbb9eb56763d38a3815fc509b92ed98a585Andrew Sapperstein
272d6eaacbb9eb56763d38a3815fc509b92ed98a585Andrew Sapperstein  if (CPU == "arm10tdmi" || CPU == "arm1020t")
273d6eaacbb9eb56763d38a3815fc509b92ed98a585Andrew Sapperstein    return "v5";
274d6eaacbb9eb56763d38a3815fc509b92ed98a585Andrew Sapperstein
275d6eaacbb9eb56763d38a3815fc509b92ed98a585Andrew Sapperstein  if (CPU == "arm9e" || CPU == "arm926ej-s" || CPU == "arm946e-s" ||
276d6eaacbb9eb56763d38a3815fc509b92ed98a585Andrew Sapperstein      CPU == "arm966e-s" || CPU == "arm968e-s" || CPU == "arm10e" ||
277d6eaacbb9eb56763d38a3815fc509b92ed98a585Andrew Sapperstein      CPU == "arm1020e" || CPU == "arm1022e" || CPU == "xscale" ||
278d6eaacbb9eb56763d38a3815fc509b92ed98a585Andrew Sapperstein      CPU == "iwmmxt")
279d6eaacbb9eb56763d38a3815fc509b92ed98a585Andrew Sapperstein    return "v5e";
280d6eaacbb9eb56763d38a3815fc509b92ed98a585Andrew Sapperstein
281d6eaacbb9eb56763d38a3815fc509b92ed98a585Andrew Sapperstein  if (CPU == "arm1136j-s" || CPU == "arm1136jf-s" || CPU == "arm1176jz-s" ||
282d6eaacbb9eb56763d38a3815fc509b92ed98a585Andrew Sapperstein      CPU == "arm1176jzf-s" || CPU == "mpcorenovfp" || CPU == "mpcore")
283d6eaacbb9eb56763d38a3815fc509b92ed98a585Andrew Sapperstein    return "v6";
284d6eaacbb9eb56763d38a3815fc509b92ed98a585Andrew Sapperstein
2856ba612efffba42bec102ac58a1540496158f747eAndrew Sapperstein  if (CPU == "arm1156t2-s" || CPU == "arm1156t2f-s")
286d6eaacbb9eb56763d38a3815fc509b92ed98a585Andrew Sapperstein    return "v6t2";
287d6eaacbb9eb56763d38a3815fc509b92ed98a585Andrew Sapperstein
2886ba612efffba42bec102ac58a1540496158f747eAndrew Sapperstein  if (CPU == "cortex-a8" || CPU == "cortex-a9")
289d6eaacbb9eb56763d38a3815fc509b92ed98a585Andrew Sapperstein    return "v7";
290d6eaacbb9eb56763d38a3815fc509b92ed98a585Andrew Sapperstein
291d6eaacbb9eb56763d38a3815fc509b92ed98a585Andrew Sapperstein  return "";
292d6eaacbb9eb56763d38a3815fc509b92ed98a585Andrew Sapperstein}
293d6eaacbb9eb56763d38a3815fc509b92ed98a585Andrew Sapperstein
294d6eaacbb9eb56763d38a3815fc509b92ed98a585Andrew Sapperstein/// getLLVMTriple - Get the LLVM triple to use for a particular toolchain, which
295d6eaacbb9eb56763d38a3815fc509b92ed98a585Andrew Sapperstein/// may depend on command line arguments.
296d6eaacbb9eb56763d38a3815fc509b92ed98a585Andrew Sappersteinstatic std::string getLLVMTriple(const ToolChain &TC, const ArgList &Args) {
297d6eaacbb9eb56763d38a3815fc509b92ed98a585Andrew Sapperstein  switch (TC.getTriple().getArch()) {
298d6eaacbb9eb56763d38a3815fc509b92ed98a585Andrew Sapperstein  default:
299d6eaacbb9eb56763d38a3815fc509b92ed98a585Andrew Sapperstein    return TC.getTripleString();
300d6eaacbb9eb56763d38a3815fc509b92ed98a585Andrew Sapperstein
301d6eaacbb9eb56763d38a3815fc509b92ed98a585Andrew Sapperstein  case llvm::Triple::arm:
3026ba612efffba42bec102ac58a1540496158f747eAndrew Sapperstein  case llvm::Triple::thumb: {
303d6eaacbb9eb56763d38a3815fc509b92ed98a585Andrew Sapperstein    // FIXME: Factor into subclasses.
304d6eaacbb9eb56763d38a3815fc509b92ed98a585Andrew Sapperstein    llvm::Triple Triple = TC.getTriple();
305d6eaacbb9eb56763d38a3815fc509b92ed98a585Andrew Sapperstein
306d6eaacbb9eb56763d38a3815fc509b92ed98a585Andrew Sapperstein    // Thumb2 is the default for V7 on Darwin.
307d6eaacbb9eb56763d38a3815fc509b92ed98a585Andrew Sapperstein    //
308d6eaacbb9eb56763d38a3815fc509b92ed98a585Andrew Sapperstein    // FIXME: Thumb should just be another -target-feaure, not in the triple.
309d6eaacbb9eb56763d38a3815fc509b92ed98a585Andrew Sapperstein    llvm::StringRef Suffix = getLLVMArchSuffixForARM(getARMTargetCPU(Args));
310d6eaacbb9eb56763d38a3815fc509b92ed98a585Andrew Sapperstein    bool ThumbDefault =
311d6eaacbb9eb56763d38a3815fc509b92ed98a585Andrew Sapperstein      (Suffix == "v7" && TC.getTriple().getOS() == llvm::Triple::Darwin);
312d6eaacbb9eb56763d38a3815fc509b92ed98a585Andrew Sapperstein    std::string ArchName = "arm";
313d6eaacbb9eb56763d38a3815fc509b92ed98a585Andrew Sapperstein    if (Args.hasFlag(options::OPT_mthumb, options::OPT_mno_thumb, ThumbDefault))
314d6eaacbb9eb56763d38a3815fc509b92ed98a585Andrew Sapperstein      ArchName = "thumb";
315d6eaacbb9eb56763d38a3815fc509b92ed98a585Andrew Sapperstein    Triple.setArchName(ArchName + Suffix.str());
316d6eaacbb9eb56763d38a3815fc509b92ed98a585Andrew Sapperstein
317d6eaacbb9eb56763d38a3815fc509b92ed98a585Andrew Sapperstein    return Triple.getTriple();
318d6eaacbb9eb56763d38a3815fc509b92ed98a585Andrew Sapperstein  }
319d6eaacbb9eb56763d38a3815fc509b92ed98a585Andrew Sapperstein  }
320d6eaacbb9eb56763d38a3815fc509b92ed98a585Andrew Sapperstein}
321d6eaacbb9eb56763d38a3815fc509b92ed98a585Andrew Sapperstein
3226ba612efffba42bec102ac58a1540496158f747eAndrew Sapperstein// FIXME: Move to target hook.
323d6eaacbb9eb56763d38a3815fc509b92ed98a585Andrew Sappersteinstatic bool isSignedCharDefault(const llvm::Triple &Triple) {
324d6eaacbb9eb56763d38a3815fc509b92ed98a585Andrew Sapperstein  switch (Triple.getArch()) {
3256ba612efffba42bec102ac58a1540496158f747eAndrew Sapperstein  default:
326d6eaacbb9eb56763d38a3815fc509b92ed98a585Andrew Sapperstein    return true;
327d6eaacbb9eb56763d38a3815fc509b92ed98a585Andrew Sapperstein
328d6eaacbb9eb56763d38a3815fc509b92ed98a585Andrew Sapperstein  case llvm::Triple::ppc:
329d6eaacbb9eb56763d38a3815fc509b92ed98a585Andrew Sapperstein  case llvm::Triple::ppc64:
330d6eaacbb9eb56763d38a3815fc509b92ed98a585Andrew Sapperstein    if (Triple.getOS() == llvm::Triple::Darwin)
331d6eaacbb9eb56763d38a3815fc509b92ed98a585Andrew Sapperstein      return true;
332d6eaacbb9eb56763d38a3815fc509b92ed98a585Andrew Sapperstein    return false;
333d6eaacbb9eb56763d38a3815fc509b92ed98a585Andrew Sapperstein
334d6eaacbb9eb56763d38a3815fc509b92ed98a585Andrew Sapperstein  case llvm::Triple::systemz:
335d6eaacbb9eb56763d38a3815fc509b92ed98a585Andrew Sapperstein    return false;
336d6eaacbb9eb56763d38a3815fc509b92ed98a585Andrew Sapperstein  }
337d6eaacbb9eb56763d38a3815fc509b92ed98a585Andrew Sapperstein}
338d6eaacbb9eb56763d38a3815fc509b92ed98a585Andrew Sapperstein
3396ba612efffba42bec102ac58a1540496158f747eAndrew Sappersteinvoid Clang::AddARMTargetArgs(const ArgList &Args,
340d6eaacbb9eb56763d38a3815fc509b92ed98a585Andrew Sapperstein                             ArgStringList &CmdArgs) const {
341d6eaacbb9eb56763d38a3815fc509b92ed98a585Andrew Sapperstein  const Driver &D = getToolChain().getHost().getDriver();
342d6eaacbb9eb56763d38a3815fc509b92ed98a585Andrew Sapperstein
343d6eaacbb9eb56763d38a3815fc509b92ed98a585Andrew Sapperstein  // Select the ABI to use.
344d6eaacbb9eb56763d38a3815fc509b92ed98a585Andrew Sapperstein  //
345d6eaacbb9eb56763d38a3815fc509b92ed98a585Andrew Sapperstein  // FIXME: Support -meabi.
346d6eaacbb9eb56763d38a3815fc509b92ed98a585Andrew Sapperstein  const char *ABIName = 0;
347d6eaacbb9eb56763d38a3815fc509b92ed98a585Andrew Sapperstein  if (Arg *A = Args.getLastArg(options::OPT_mabi_EQ)) {
348d6eaacbb9eb56763d38a3815fc509b92ed98a585Andrew Sapperstein    ABIName = A->getValue(Args);
349d6eaacbb9eb56763d38a3815fc509b92ed98a585Andrew Sapperstein  } else {
350d6eaacbb9eb56763d38a3815fc509b92ed98a585Andrew Sapperstein    // Select the default based on the platform.
351d6eaacbb9eb56763d38a3815fc509b92ed98a585Andrew Sapperstein    switch (getToolChain().getTriple().getOS()) {
352d6eaacbb9eb56763d38a3815fc509b92ed98a585Andrew Sapperstein      // FIXME: Is this right for non-Darwin and non-Linux?
353d6eaacbb9eb56763d38a3815fc509b92ed98a585Andrew Sapperstein    default:
354d6eaacbb9eb56763d38a3815fc509b92ed98a585Andrew Sapperstein      ABIName = "aapcs";
355d6eaacbb9eb56763d38a3815fc509b92ed98a585Andrew Sapperstein      break;
356d6eaacbb9eb56763d38a3815fc509b92ed98a585Andrew Sapperstein
357d6eaacbb9eb56763d38a3815fc509b92ed98a585Andrew Sapperstein    case llvm::Triple::Darwin:
358d6eaacbb9eb56763d38a3815fc509b92ed98a585Andrew Sapperstein      ABIName = "apcs-gnu";
359d6eaacbb9eb56763d38a3815fc509b92ed98a585Andrew Sapperstein      break;
360d6eaacbb9eb56763d38a3815fc509b92ed98a585Andrew Sapperstein
361d6eaacbb9eb56763d38a3815fc509b92ed98a585Andrew Sapperstein    case llvm::Triple::Linux:
362d6eaacbb9eb56763d38a3815fc509b92ed98a585Andrew Sapperstein      ABIName = "aapcs-linux";
363d6eaacbb9eb56763d38a3815fc509b92ed98a585Andrew Sapperstein      break;
364d6eaacbb9eb56763d38a3815fc509b92ed98a585Andrew Sapperstein    }
365d6eaacbb9eb56763d38a3815fc509b92ed98a585Andrew Sapperstein  }
366d6eaacbb9eb56763d38a3815fc509b92ed98a585Andrew Sapperstein  CmdArgs.push_back("-target-abi");
367d6eaacbb9eb56763d38a3815fc509b92ed98a585Andrew Sapperstein  CmdArgs.push_back(ABIName);
368d6eaacbb9eb56763d38a3815fc509b92ed98a585Andrew Sapperstein
3696ba612efffba42bec102ac58a1540496158f747eAndrew Sapperstein  // Set the CPU based on -march= and -mcpu=.
370d6eaacbb9eb56763d38a3815fc509b92ed98a585Andrew Sapperstein  CmdArgs.push_back("-mcpu");
371d6eaacbb9eb56763d38a3815fc509b92ed98a585Andrew Sapperstein  CmdArgs.push_back(getARMTargetCPU(Args));
372d6eaacbb9eb56763d38a3815fc509b92ed98a585Andrew Sapperstein
373d6eaacbb9eb56763d38a3815fc509b92ed98a585Andrew Sapperstein  // Select the float ABI as determined by -msoft-float, -mhard-float, and
374d6eaacbb9eb56763d38a3815fc509b92ed98a585Andrew Sapperstein  // -mfloat-abi=.
375d6eaacbb9eb56763d38a3815fc509b92ed98a585Andrew Sapperstein  llvm::StringRef FloatABI;
376d6eaacbb9eb56763d38a3815fc509b92ed98a585Andrew Sapperstein  if (Arg *A = Args.getLastArg(options::OPT_msoft_float,
377d6eaacbb9eb56763d38a3815fc509b92ed98a585Andrew Sapperstein                               options::OPT_mhard_float,
378d6eaacbb9eb56763d38a3815fc509b92ed98a585Andrew Sapperstein                               options::OPT_mfloat_abi_EQ)) {
379d6eaacbb9eb56763d38a3815fc509b92ed98a585Andrew Sapperstein    if (A->getOption().matches(options::OPT_msoft_float))
380d6eaacbb9eb56763d38a3815fc509b92ed98a585Andrew Sapperstein      FloatABI = "soft";
381d6eaacbb9eb56763d38a3815fc509b92ed98a585Andrew Sapperstein    else if (A->getOption().matches(options::OPT_mhard_float))
382d6eaacbb9eb56763d38a3815fc509b92ed98a585Andrew Sapperstein      FloatABI = "hard";
383d6eaacbb9eb56763d38a3815fc509b92ed98a585Andrew Sapperstein    else {
384d6eaacbb9eb56763d38a3815fc509b92ed98a585Andrew Sapperstein      FloatABI = A->getValue(Args);
385d6eaacbb9eb56763d38a3815fc509b92ed98a585Andrew Sapperstein      if (FloatABI != "soft" && FloatABI != "softfp" && FloatABI != "hard") {
386d6eaacbb9eb56763d38a3815fc509b92ed98a585Andrew Sapperstein        D.Diag(clang::diag::err_drv_invalid_mfloat_abi)
387d6eaacbb9eb56763d38a3815fc509b92ed98a585Andrew Sapperstein          << A->getAsString(Args);
388d6eaacbb9eb56763d38a3815fc509b92ed98a585Andrew Sapperstein        FloatABI = "soft";
389d6eaacbb9eb56763d38a3815fc509b92ed98a585Andrew Sapperstein      }
390d6eaacbb9eb56763d38a3815fc509b92ed98a585Andrew Sapperstein    }
391d6eaacbb9eb56763d38a3815fc509b92ed98a585Andrew Sapperstein  }
392d6eaacbb9eb56763d38a3815fc509b92ed98a585Andrew Sapperstein
393d6eaacbb9eb56763d38a3815fc509b92ed98a585Andrew Sapperstein  // If unspecified, choose the default based on the platform.
394d6eaacbb9eb56763d38a3815fc509b92ed98a585Andrew Sapperstein  if (FloatABI.empty()) {
395d6eaacbb9eb56763d38a3815fc509b92ed98a585Andrew Sapperstein    // FIXME: This is wrong for non-Darwin, we don't have a mechanism yet for
396d6eaacbb9eb56763d38a3815fc509b92ed98a585Andrew Sapperstein    // distinguishing things like linux-eabi vs linux-elf.
3976ba612efffba42bec102ac58a1540496158f747eAndrew Sapperstein    switch (getToolChain().getTriple().getOS()) {
398d6eaacbb9eb56763d38a3815fc509b92ed98a585Andrew Sapperstein    case llvm::Triple::Darwin: {
399d6eaacbb9eb56763d38a3815fc509b92ed98a585Andrew Sapperstein      // Darwin defaults to "softfp" for v6 and v7.
400d6eaacbb9eb56763d38a3815fc509b92ed98a585Andrew Sapperstein      //
401d6eaacbb9eb56763d38a3815fc509b92ed98a585Andrew Sapperstein      // FIXME: Factor out an ARM class so we can cache the arch somewhere.
402d6eaacbb9eb56763d38a3815fc509b92ed98a585Andrew Sapperstein      llvm::StringRef ArchName = getLLVMArchSuffixForARM(getARMTargetCPU(Args));
403d6eaacbb9eb56763d38a3815fc509b92ed98a585Andrew Sapperstein      if (ArchName.startswith("v6") || ArchName.startswith("v7"))
404d6eaacbb9eb56763d38a3815fc509b92ed98a585Andrew Sapperstein        FloatABI = "softfp";
4056ba612efffba42bec102ac58a1540496158f747eAndrew Sapperstein      else
406d6eaacbb9eb56763d38a3815fc509b92ed98a585Andrew Sapperstein        FloatABI = "soft";
407d6eaacbb9eb56763d38a3815fc509b92ed98a585Andrew Sapperstein      break;
408d6eaacbb9eb56763d38a3815fc509b92ed98a585Andrew Sapperstein    }
409d6eaacbb9eb56763d38a3815fc509b92ed98a585Andrew Sapperstein
410d6eaacbb9eb56763d38a3815fc509b92ed98a585Andrew Sapperstein    default:
411d6eaacbb9eb56763d38a3815fc509b92ed98a585Andrew Sapperstein      // Assume "soft", but warn the user we are guessing.
412d6eaacbb9eb56763d38a3815fc509b92ed98a585Andrew Sapperstein      FloatABI = "soft";
413d6eaacbb9eb56763d38a3815fc509b92ed98a585Andrew Sapperstein      D.Diag(clang::diag::warn_drv_assuming_mfloat_abi_is) << "soft";
414d6eaacbb9eb56763d38a3815fc509b92ed98a585Andrew Sapperstein      break;
415d6eaacbb9eb56763d38a3815fc509b92ed98a585Andrew Sapperstein    }
416d6eaacbb9eb56763d38a3815fc509b92ed98a585Andrew Sapperstein  }
417d6eaacbb9eb56763d38a3815fc509b92ed98a585Andrew Sapperstein
418d6eaacbb9eb56763d38a3815fc509b92ed98a585Andrew Sapperstein  if (FloatABI == "soft") {
419d6eaacbb9eb56763d38a3815fc509b92ed98a585Andrew Sapperstein    // Floating point operations and argument passing are soft.
420d6eaacbb9eb56763d38a3815fc509b92ed98a585Andrew Sapperstein    //
421d6eaacbb9eb56763d38a3815fc509b92ed98a585Andrew Sapperstein    // FIXME: This changes CPP defines, we need -target-soft-float.
422d6eaacbb9eb56763d38a3815fc509b92ed98a585Andrew Sapperstein    CmdArgs.push_back("-msoft-float");
4236ba612efffba42bec102ac58a1540496158f747eAndrew Sapperstein    CmdArgs.push_back("-mfloat-abi");
4246ba612efffba42bec102ac58a1540496158f747eAndrew Sapperstein    CmdArgs.push_back("soft");
425d6eaacbb9eb56763d38a3815fc509b92ed98a585Andrew Sapperstein  } else if (FloatABI == "softfp") {
426d6eaacbb9eb56763d38a3815fc509b92ed98a585Andrew Sapperstein    // Floating point operations are hard, but argument passing is soft.
427d6eaacbb9eb56763d38a3815fc509b92ed98a585Andrew Sapperstein    CmdArgs.push_back("-mfloat-abi");
428d6eaacbb9eb56763d38a3815fc509b92ed98a585Andrew Sapperstein    CmdArgs.push_back("soft");
429d6eaacbb9eb56763d38a3815fc509b92ed98a585Andrew Sapperstein  } else {
430d6eaacbb9eb56763d38a3815fc509b92ed98a585Andrew Sapperstein    // Floating point operations and argument passing are hard.
431d6eaacbb9eb56763d38a3815fc509b92ed98a585Andrew Sapperstein    assert(FloatABI == "hard" && "Invalid float abi!");
432d6eaacbb9eb56763d38a3815fc509b92ed98a585Andrew Sapperstein    CmdArgs.push_back("-mfloat-abi");
433d6eaacbb9eb56763d38a3815fc509b92ed98a585Andrew Sapperstein    CmdArgs.push_back("hard");
434d6eaacbb9eb56763d38a3815fc509b92ed98a585Andrew Sapperstein  }
435d6eaacbb9eb56763d38a3815fc509b92ed98a585Andrew Sapperstein}
436d6eaacbb9eb56763d38a3815fc509b92ed98a585Andrew Sapperstein
437d6eaacbb9eb56763d38a3815fc509b92ed98a585Andrew Sappersteinvoid Clang::AddX86TargetArgs(const ArgList &Args,
438d6eaacbb9eb56763d38a3815fc509b92ed98a585Andrew Sapperstein                             ArgStringList &CmdArgs) const {
439d6eaacbb9eb56763d38a3815fc509b92ed98a585Andrew Sapperstein  if (!Args.hasFlag(options::OPT_mred_zone,
440d6eaacbb9eb56763d38a3815fc509b92ed98a585Andrew Sapperstein                    options::OPT_mno_red_zone,
441d6eaacbb9eb56763d38a3815fc509b92ed98a585Andrew Sapperstein                    true) ||
442d6eaacbb9eb56763d38a3815fc509b92ed98a585Andrew Sapperstein      Args.hasArg(options::OPT_mkernel) ||
443d6eaacbb9eb56763d38a3815fc509b92ed98a585Andrew Sapperstein      Args.hasArg(options::OPT_fapple_kext))
444d6eaacbb9eb56763d38a3815fc509b92ed98a585Andrew Sapperstein    CmdArgs.push_back("-disable-red-zone");
445d6eaacbb9eb56763d38a3815fc509b92ed98a585Andrew Sapperstein
446d6eaacbb9eb56763d38a3815fc509b92ed98a585Andrew Sapperstein  if (Args.hasFlag(options::OPT_msoft_float,
4476ba612efffba42bec102ac58a1540496158f747eAndrew Sapperstein                   options::OPT_mno_soft_float,
4486ba612efffba42bec102ac58a1540496158f747eAndrew Sapperstein                   false))
449d6eaacbb9eb56763d38a3815fc509b92ed98a585Andrew Sapperstein    CmdArgs.push_back("-no-implicit-float");
450d6eaacbb9eb56763d38a3815fc509b92ed98a585Andrew Sapperstein
451d6eaacbb9eb56763d38a3815fc509b92ed98a585Andrew Sapperstein  const char *CPUName = 0;
452d6eaacbb9eb56763d38a3815fc509b92ed98a585Andrew Sapperstein  if (const Arg *A = Args.getLastArg(options::OPT_march_EQ)) {
453d6eaacbb9eb56763d38a3815fc509b92ed98a585Andrew Sapperstein    if (llvm::StringRef(A->getValue(Args)) == "native") {
454d6eaacbb9eb56763d38a3815fc509b92ed98a585Andrew Sapperstein      // FIXME: Reject attempts to use -march=native unless the target matches
455d6eaacbb9eb56763d38a3815fc509b92ed98a585Andrew Sapperstein      // the host.
456d6eaacbb9eb56763d38a3815fc509b92ed98a585Andrew Sapperstein      //
457d6eaacbb9eb56763d38a3815fc509b92ed98a585Andrew Sapperstein      // FIXME: We should also incorporate the detected target features for use
458d6eaacbb9eb56763d38a3815fc509b92ed98a585Andrew Sapperstein      // with -native.
459d6eaacbb9eb56763d38a3815fc509b92ed98a585Andrew Sapperstein      std::string CPU = llvm::sys::getHostCPUName();
460d6eaacbb9eb56763d38a3815fc509b92ed98a585Andrew Sapperstein      if (!CPU.empty())
461d6eaacbb9eb56763d38a3815fc509b92ed98a585Andrew Sapperstein        CPUName = Args.MakeArgString(CPU);
462d6eaacbb9eb56763d38a3815fc509b92ed98a585Andrew Sapperstein    } else
463d6eaacbb9eb56763d38a3815fc509b92ed98a585Andrew Sapperstein      CPUName = A->getValue(Args);
464d6eaacbb9eb56763d38a3815fc509b92ed98a585Andrew Sapperstein  }
465d6eaacbb9eb56763d38a3815fc509b92ed98a585Andrew Sapperstein
466d6eaacbb9eb56763d38a3815fc509b92ed98a585Andrew Sapperstein  // Select the default CPU if none was given (or detection failed).
467d6eaacbb9eb56763d38a3815fc509b92ed98a585Andrew Sapperstein  if (!CPUName) {
468d6eaacbb9eb56763d38a3815fc509b92ed98a585Andrew Sapperstein    // FIXME: Need target hooks.
469d6eaacbb9eb56763d38a3815fc509b92ed98a585Andrew Sapperstein    if (memcmp(getToolChain().getOS().c_str(), "darwin", 6) == 0) {
470d6eaacbb9eb56763d38a3815fc509b92ed98a585Andrew Sapperstein      if (getToolChain().getArchName() == "x86_64")
4716ba612efffba42bec102ac58a1540496158f747eAndrew Sapperstein        CPUName = "core2";
472d6eaacbb9eb56763d38a3815fc509b92ed98a585Andrew Sapperstein      else if (getToolChain().getArchName() == "i386")
473d6eaacbb9eb56763d38a3815fc509b92ed98a585Andrew Sapperstein        CPUName = "yonah";
474d6eaacbb9eb56763d38a3815fc509b92ed98a585Andrew Sapperstein    } else {
475d6eaacbb9eb56763d38a3815fc509b92ed98a585Andrew Sapperstein      if (getToolChain().getArchName() == "x86_64")
4766ba612efffba42bec102ac58a1540496158f747eAndrew Sapperstein        CPUName = "x86-64";
477d6eaacbb9eb56763d38a3815fc509b92ed98a585Andrew Sapperstein      else if (getToolChain().getArchName() == "i386")
4786ba612efffba42bec102ac58a1540496158f747eAndrew Sapperstein        CPUName = "pentium4";
479d6eaacbb9eb56763d38a3815fc509b92ed98a585Andrew Sapperstein    }
480d6eaacbb9eb56763d38a3815fc509b92ed98a585Andrew Sapperstein  }
481d6eaacbb9eb56763d38a3815fc509b92ed98a585Andrew Sapperstein
482d6eaacbb9eb56763d38a3815fc509b92ed98a585Andrew Sapperstein  if (CPUName) {
483d6eaacbb9eb56763d38a3815fc509b92ed98a585Andrew Sapperstein    CmdArgs.push_back("-mcpu");
484d6eaacbb9eb56763d38a3815fc509b92ed98a585Andrew Sapperstein    CmdArgs.push_back(CPUName);
485d6eaacbb9eb56763d38a3815fc509b92ed98a585Andrew Sapperstein  }
486d6eaacbb9eb56763d38a3815fc509b92ed98a585Andrew Sapperstein
487d6eaacbb9eb56763d38a3815fc509b92ed98a585Andrew Sapperstein  for (arg_iterator it = Args.filtered_begin(options::OPT_m_x86_Features_Group),
488d6eaacbb9eb56763d38a3815fc509b92ed98a585Andrew Sapperstein         ie = Args.filtered_end(); it != ie; ++it) {
489d6eaacbb9eb56763d38a3815fc509b92ed98a585Andrew Sapperstein    llvm::StringRef Name = it->getOption().getName();
490d6eaacbb9eb56763d38a3815fc509b92ed98a585Andrew Sapperstein    it->claim();
491d6eaacbb9eb56763d38a3815fc509b92ed98a585Andrew Sapperstein
4926ba612efffba42bec102ac58a1540496158f747eAndrew Sapperstein    // Skip over "-m".
493d6eaacbb9eb56763d38a3815fc509b92ed98a585Andrew Sapperstein    assert(Name.startswith("-m") && "Invalid feature name.");
494d6eaacbb9eb56763d38a3815fc509b92ed98a585Andrew Sapperstein    Name = Name.substr(2);
495d6eaacbb9eb56763d38a3815fc509b92ed98a585Andrew Sapperstein
496d6eaacbb9eb56763d38a3815fc509b92ed98a585Andrew Sapperstein    bool IsNegative = Name.startswith("no-");
497d6eaacbb9eb56763d38a3815fc509b92ed98a585Andrew Sapperstein    if (IsNegative)
498d6eaacbb9eb56763d38a3815fc509b92ed98a585Andrew Sapperstein      Name = Name.substr(3);
499d6eaacbb9eb56763d38a3815fc509b92ed98a585Andrew Sapperstein
500d6eaacbb9eb56763d38a3815fc509b92ed98a585Andrew Sapperstein    CmdArgs.push_back("-target-feature");
501d6eaacbb9eb56763d38a3815fc509b92ed98a585Andrew Sapperstein    CmdArgs.push_back(Args.MakeArgString((IsNegative ? "-" : "+") + Name));
502d6eaacbb9eb56763d38a3815fc509b92ed98a585Andrew Sapperstein  }
503d6eaacbb9eb56763d38a3815fc509b92ed98a585Andrew Sapperstein}
504d6eaacbb9eb56763d38a3815fc509b92ed98a585Andrew Sapperstein
505d6eaacbb9eb56763d38a3815fc509b92ed98a585Andrew Sappersteinstatic bool needsExceptions(const ArgList &Args,  types::ID InputType,
506d6eaacbb9eb56763d38a3815fc509b92ed98a585Andrew Sapperstein                            const llvm::Triple &Triple) {
507d6eaacbb9eb56763d38a3815fc509b92ed98a585Andrew Sapperstein  if (Arg *A = Args.getLastArg(options::OPT_fexceptions,
508d6eaacbb9eb56763d38a3815fc509b92ed98a585Andrew Sapperstein                               options::OPT_fno_exceptions)) {
5096ba612efffba42bec102ac58a1540496158f747eAndrew Sapperstein    if (A->getOption().matches(options::OPT_fexceptions))
510d6eaacbb9eb56763d38a3815fc509b92ed98a585Andrew Sapperstein      return true;
511d6eaacbb9eb56763d38a3815fc509b92ed98a585Andrew Sapperstein    else
512d6eaacbb9eb56763d38a3815fc509b92ed98a585Andrew Sapperstein      return false;
513d6eaacbb9eb56763d38a3815fc509b92ed98a585Andrew Sapperstein  }
514d6eaacbb9eb56763d38a3815fc509b92ed98a585Andrew Sapperstein  switch (InputType) {
515d6eaacbb9eb56763d38a3815fc509b92ed98a585Andrew Sapperstein  case types::TY_CXX: case types::TY_CXXHeader:
516d6eaacbb9eb56763d38a3815fc509b92ed98a585Andrew Sapperstein  case types::TY_PP_CXX: case types::TY_PP_CXXHeader:
517d6eaacbb9eb56763d38a3815fc509b92ed98a585Andrew Sapperstein  case types::TY_ObjCXX: case types::TY_ObjCXXHeader:
518d6eaacbb9eb56763d38a3815fc509b92ed98a585Andrew Sapperstein  case types::TY_PP_ObjCXX: case types::TY_PP_ObjCXXHeader:
519d6eaacbb9eb56763d38a3815fc509b92ed98a585Andrew Sapperstein    return true;
520d6eaacbb9eb56763d38a3815fc509b92ed98a585Andrew Sapperstein
521d6eaacbb9eb56763d38a3815fc509b92ed98a585Andrew Sapperstein  case types::TY_ObjC: case types::TY_ObjCHeader:
5226ba612efffba42bec102ac58a1540496158f747eAndrew Sapperstein  case types::TY_PP_ObjC: case types::TY_PP_ObjCHeader:
523d6eaacbb9eb56763d38a3815fc509b92ed98a585Andrew Sapperstein    if (Args.hasArg(options::OPT_fobjc_nonfragile_abi))
524d6eaacbb9eb56763d38a3815fc509b92ed98a585Andrew Sapperstein      return true;
525d6eaacbb9eb56763d38a3815fc509b92ed98a585Andrew Sapperstein    if (Triple.getOS() != llvm::Triple::Darwin)
526d6eaacbb9eb56763d38a3815fc509b92ed98a585Andrew Sapperstein      return false;
527d6eaacbb9eb56763d38a3815fc509b92ed98a585Andrew Sapperstein    return (Triple.getDarwinMajorNumber() >= 9 &&
528d6eaacbb9eb56763d38a3815fc509b92ed98a585Andrew Sapperstein            Triple.getArch() == llvm::Triple::x86_64);
529d6eaacbb9eb56763d38a3815fc509b92ed98a585Andrew Sapperstein
530d6eaacbb9eb56763d38a3815fc509b92ed98a585Andrew Sapperstein  default:
531d6eaacbb9eb56763d38a3815fc509b92ed98a585Andrew Sapperstein    return false;
532d6eaacbb9eb56763d38a3815fc509b92ed98a585Andrew Sapperstein  }
533d6eaacbb9eb56763d38a3815fc509b92ed98a585Andrew Sapperstein}
5346ba612efffba42bec102ac58a1540496158f747eAndrew Sapperstein
535d6eaacbb9eb56763d38a3815fc509b92ed98a585Andrew Sapperstein/// getEffectiveClangTriple - Get the "effective" target triple, which is the
536d6eaacbb9eb56763d38a3815fc509b92ed98a585Andrew Sapperstein/// triple for the target but with the OS version potentially modified for
537d6eaacbb9eb56763d38a3815fc509b92ed98a585Andrew Sapperstein/// Darwin's -mmacosx-version-min.
538d6eaacbb9eb56763d38a3815fc509b92ed98a585Andrew Sappersteinstatic std::string getEffectiveClangTriple(const Driver &D,
539d6eaacbb9eb56763d38a3815fc509b92ed98a585Andrew Sapperstein                                           const ToolChain &TC,
540d6eaacbb9eb56763d38a3815fc509b92ed98a585Andrew Sapperstein                                           const ArgList &Args) {
541d6eaacbb9eb56763d38a3815fc509b92ed98a585Andrew Sapperstein  llvm::Triple Triple(getLLVMTriple(TC, Args));
542d6eaacbb9eb56763d38a3815fc509b92ed98a585Andrew Sapperstein
5436ba612efffba42bec102ac58a1540496158f747eAndrew Sapperstein  if (Triple.getOS() != llvm::Triple::Darwin) {
544d6eaacbb9eb56763d38a3815fc509b92ed98a585Andrew Sapperstein    // Diagnose use of -mmacosx-version-min and -miphoneos-version-min on
545d6eaacbb9eb56763d38a3815fc509b92ed98a585Andrew Sapperstein    // non-Darwin.
546d6eaacbb9eb56763d38a3815fc509b92ed98a585Andrew Sapperstein    if (Arg *A = Args.getLastArg(options::OPT_mmacosx_version_min_EQ,
547d6eaacbb9eb56763d38a3815fc509b92ed98a585Andrew Sapperstein                                 options::OPT_miphoneos_version_min_EQ))
548d6eaacbb9eb56763d38a3815fc509b92ed98a585Andrew Sapperstein      D.Diag(clang::diag::err_drv_clang_unsupported) << A->getAsString(Args);
549d6eaacbb9eb56763d38a3815fc509b92ed98a585Andrew Sapperstein    return Triple.getTriple();
550d6eaacbb9eb56763d38a3815fc509b92ed98a585Andrew Sapperstein  }
551d6eaacbb9eb56763d38a3815fc509b92ed98a585Andrew Sapperstein
552d6eaacbb9eb56763d38a3815fc509b92ed98a585Andrew Sapperstein  // If -mmacosx-version-min=10.3.9 is specified, change the effective triple
553d6eaacbb9eb56763d38a3815fc509b92ed98a585Andrew Sapperstein  // from being something like powerpc-apple-darwin9 to powerpc-apple-darwin7.
554d6eaacbb9eb56763d38a3815fc509b92ed98a585Andrew Sapperstein  if (Arg *A = Args.getLastArg(options::OPT_mmacosx_version_min_EQ)) {
555d6eaacbb9eb56763d38a3815fc509b92ed98a585Andrew Sapperstein    unsigned Major, Minor, Micro;
5566ba612efffba42bec102ac58a1540496158f747eAndrew Sapperstein    bool HadExtra;
557d6eaacbb9eb56763d38a3815fc509b92ed98a585Andrew Sapperstein    if (!Driver::GetReleaseVersion(A->getValue(Args), Major, Minor, Micro,
558d6eaacbb9eb56763d38a3815fc509b92ed98a585Andrew Sapperstein                                   HadExtra) || HadExtra ||
5596ba612efffba42bec102ac58a1540496158f747eAndrew Sapperstein        Major != 10)
560d6eaacbb9eb56763d38a3815fc509b92ed98a585Andrew Sapperstein      D.Diag(clang::diag::err_drv_invalid_version_number)
561d6eaacbb9eb56763d38a3815fc509b92ed98a585Andrew Sapperstein        << A->getAsString(Args);
562d6eaacbb9eb56763d38a3815fc509b92ed98a585Andrew Sapperstein
563d6eaacbb9eb56763d38a3815fc509b92ed98a585Andrew Sapperstein    // Mangle the MacOS version min number into the Darwin number: e.g. 10.3.9
564d6eaacbb9eb56763d38a3815fc509b92ed98a585Andrew Sapperstein    // is darwin7.9.
565d6eaacbb9eb56763d38a3815fc509b92ed98a585Andrew Sapperstein    llvm::SmallString<16> Str;
566d6eaacbb9eb56763d38a3815fc509b92ed98a585Andrew Sapperstein    llvm::raw_svector_ostream(Str) << "darwin" << Minor + 4 << "." << Micro;
567d6eaacbb9eb56763d38a3815fc509b92ed98a585Andrew Sapperstein    Triple.setOSName(Str.str());
568d6eaacbb9eb56763d38a3815fc509b92ed98a585Andrew Sapperstein  } else if (Arg *A = Args.getLastArg(options::OPT_miphoneos_version_min_EQ)) {
569d6eaacbb9eb56763d38a3815fc509b92ed98a585Andrew Sapperstein    unsigned Major, Minor, Micro;
570d6eaacbb9eb56763d38a3815fc509b92ed98a585Andrew Sapperstein    bool HadExtra;
571d6eaacbb9eb56763d38a3815fc509b92ed98a585Andrew Sapperstein    if (!Driver::GetReleaseVersion(A->getValue(Args), Major, Minor, Micro,
572d6eaacbb9eb56763d38a3815fc509b92ed98a585Andrew Sapperstein                                   HadExtra) || HadExtra)
5736ba612efffba42bec102ac58a1540496158f747eAndrew Sapperstein      D.Diag(clang::diag::err_drv_invalid_version_number)
574d6eaacbb9eb56763d38a3815fc509b92ed98a585Andrew Sapperstein        << A->getAsString(Args);
575d6eaacbb9eb56763d38a3815fc509b92ed98a585Andrew Sapperstein
576d6eaacbb9eb56763d38a3815fc509b92ed98a585Andrew Sapperstein    // Mangle the iPhoneOS version number into the Darwin number: e.g. 2.0 is 2
577d6eaacbb9eb56763d38a3815fc509b92ed98a585Andrew Sapperstein    // -> 9.2.0.
578d6eaacbb9eb56763d38a3815fc509b92ed98a585Andrew Sapperstein    llvm::SmallString<16> Str;
579d6eaacbb9eb56763d38a3815fc509b92ed98a585Andrew Sapperstein    llvm::raw_svector_ostream(Str) << "darwin9." << Major << "." << Minor;
580d6eaacbb9eb56763d38a3815fc509b92ed98a585Andrew Sapperstein    Triple.setOSName(Str.str());
581d6eaacbb9eb56763d38a3815fc509b92ed98a585Andrew Sapperstein  }
582d6eaacbb9eb56763d38a3815fc509b92ed98a585Andrew Sapperstein
583d6eaacbb9eb56763d38a3815fc509b92ed98a585Andrew Sapperstein  return Triple.getTriple();
584d6eaacbb9eb56763d38a3815fc509b92ed98a585Andrew Sapperstein}
585d6eaacbb9eb56763d38a3815fc509b92ed98a585Andrew Sapperstein
586d6eaacbb9eb56763d38a3815fc509b92ed98a585Andrew Sappersteinvoid Clang::ConstructJob(Compilation &C, const JobAction &JA,
587d6eaacbb9eb56763d38a3815fc509b92ed98a585Andrew Sapperstein                         Job &Dest,
588d6eaacbb9eb56763d38a3815fc509b92ed98a585Andrew Sapperstein                         const InputInfo &Output,
5896ba612efffba42bec102ac58a1540496158f747eAndrew Sapperstein                         const InputInfoList &Inputs,
590d6eaacbb9eb56763d38a3815fc509b92ed98a585Andrew Sapperstein                         const ArgList &Args,
591d6eaacbb9eb56763d38a3815fc509b92ed98a585Andrew Sapperstein                         const char *LinkingOutput) const {
592d6eaacbb9eb56763d38a3815fc509b92ed98a585Andrew Sapperstein  const Driver &D = getToolChain().getHost().getDriver();
593d6eaacbb9eb56763d38a3815fc509b92ed98a585Andrew Sapperstein  ArgStringList CmdArgs;
594d6eaacbb9eb56763d38a3815fc509b92ed98a585Andrew Sapperstein
595d6eaacbb9eb56763d38a3815fc509b92ed98a585Andrew Sapperstein  assert(Inputs.size() == 1 && "Unable to handle multiple inputs.");
596d6eaacbb9eb56763d38a3815fc509b92ed98a585Andrew Sapperstein
597d6eaacbb9eb56763d38a3815fc509b92ed98a585Andrew Sapperstein  // Invoke ourselves in -cc1 mode.
5986ba612efffba42bec102ac58a1540496158f747eAndrew Sapperstein  //
599d6eaacbb9eb56763d38a3815fc509b92ed98a585Andrew Sapperstein  // FIXME: Implement custom jobs for internal actions.
600d6eaacbb9eb56763d38a3815fc509b92ed98a585Andrew Sapperstein  CmdArgs.push_back("-cc1");
601d6eaacbb9eb56763d38a3815fc509b92ed98a585Andrew Sapperstein
602d6eaacbb9eb56763d38a3815fc509b92ed98a585Andrew Sapperstein  // Add the "effective" target triple.
603d6eaacbb9eb56763d38a3815fc509b92ed98a585Andrew Sapperstein  CmdArgs.push_back("-triple");
604d6eaacbb9eb56763d38a3815fc509b92ed98a585Andrew Sapperstein  std::string TripleStr = getEffectiveClangTriple(D, getToolChain(), Args);
605d6eaacbb9eb56763d38a3815fc509b92ed98a585Andrew Sapperstein  CmdArgs.push_back(Args.MakeArgString(TripleStr));
606d6eaacbb9eb56763d38a3815fc509b92ed98a585Andrew Sapperstein
607d6eaacbb9eb56763d38a3815fc509b92ed98a585Andrew Sapperstein  // Select the appropriate action.
608d6eaacbb9eb56763d38a3815fc509b92ed98a585Andrew Sapperstein  if (isa<AnalyzeJobAction>(JA)) {
609d6eaacbb9eb56763d38a3815fc509b92ed98a585Andrew Sapperstein    assert(JA.getType() == types::TY_Plist && "Invalid output type.");
610d6eaacbb9eb56763d38a3815fc509b92ed98a585Andrew Sapperstein    CmdArgs.push_back("-analyze");
6116ba612efffba42bec102ac58a1540496158f747eAndrew Sapperstein  } else if (isa<PreprocessJobAction>(JA)) {
612d6eaacbb9eb56763d38a3815fc509b92ed98a585Andrew Sapperstein    if (Output.getType() == types::TY_Dependencies)
6136ba612efffba42bec102ac58a1540496158f747eAndrew Sapperstein      CmdArgs.push_back("-Eonly");
614d6eaacbb9eb56763d38a3815fc509b92ed98a585Andrew Sapperstein    else
615d6eaacbb9eb56763d38a3815fc509b92ed98a585Andrew Sapperstein      CmdArgs.push_back("-E");
616d6eaacbb9eb56763d38a3815fc509b92ed98a585Andrew Sapperstein  } else if (isa<PrecompileJobAction>(JA)) {
617d6eaacbb9eb56763d38a3815fc509b92ed98a585Andrew Sapperstein    // Use PCH if the user requested it, except for C++ (for now).
618d6eaacbb9eb56763d38a3815fc509b92ed98a585Andrew Sapperstein    bool UsePCH = D.CCCUsePCH;
619d6eaacbb9eb56763d38a3815fc509b92ed98a585Andrew Sapperstein    if (types::isCXX(Inputs[0].getType()))
620d6eaacbb9eb56763d38a3815fc509b92ed98a585Andrew Sapperstein      UsePCH = false;
621d6eaacbb9eb56763d38a3815fc509b92ed98a585Andrew Sapperstein
622d6eaacbb9eb56763d38a3815fc509b92ed98a585Andrew Sapperstein    if (UsePCH)
623d6eaacbb9eb56763d38a3815fc509b92ed98a585Andrew Sapperstein      CmdArgs.push_back("-emit-pch");
624d6eaacbb9eb56763d38a3815fc509b92ed98a585Andrew Sapperstein    else
625d6eaacbb9eb56763d38a3815fc509b92ed98a585Andrew Sapperstein      CmdArgs.push_back("-emit-pth");
626d6eaacbb9eb56763d38a3815fc509b92ed98a585Andrew Sapperstein  } else {
6276ba612efffba42bec102ac58a1540496158f747eAndrew Sapperstein    assert(isa<CompileJobAction>(JA) && "Invalid action for clang tool.");
628d6eaacbb9eb56763d38a3815fc509b92ed98a585Andrew Sapperstein
629d6eaacbb9eb56763d38a3815fc509b92ed98a585Andrew Sapperstein    if (JA.getType() == types::TY_Nothing) {
630d6eaacbb9eb56763d38a3815fc509b92ed98a585Andrew Sapperstein      CmdArgs.push_back("-fsyntax-only");
631d6eaacbb9eb56763d38a3815fc509b92ed98a585Andrew Sapperstein    } else if (JA.getType() == types::TY_LLVMAsm) {
632d6eaacbb9eb56763d38a3815fc509b92ed98a585Andrew Sapperstein      CmdArgs.push_back("-emit-llvm");
633d6eaacbb9eb56763d38a3815fc509b92ed98a585Andrew Sapperstein    } else if (JA.getType() == types::TY_LLVMBC) {
634d6eaacbb9eb56763d38a3815fc509b92ed98a585Andrew Sapperstein      CmdArgs.push_back("-emit-llvm-bc");
635d6eaacbb9eb56763d38a3815fc509b92ed98a585Andrew Sapperstein    } else if (JA.getType() == types::TY_PP_Asm) {
636d6eaacbb9eb56763d38a3815fc509b92ed98a585Andrew Sapperstein      CmdArgs.push_back("-S");
637d6eaacbb9eb56763d38a3815fc509b92ed98a585Andrew Sapperstein    } else if (JA.getType() == types::TY_AST) {
638d6eaacbb9eb56763d38a3815fc509b92ed98a585Andrew Sapperstein      CmdArgs.push_back("-emit-pch");
639d6eaacbb9eb56763d38a3815fc509b92ed98a585Andrew Sapperstein    }
640d6eaacbb9eb56763d38a3815fc509b92ed98a585Andrew Sapperstein  }
641d6eaacbb9eb56763d38a3815fc509b92ed98a585Andrew Sapperstein
642d6eaacbb9eb56763d38a3815fc509b92ed98a585Andrew Sapperstein  // The make clang go fast button.
643d6eaacbb9eb56763d38a3815fc509b92ed98a585Andrew Sapperstein  CmdArgs.push_back("-disable-free");
644d6eaacbb9eb56763d38a3815fc509b92ed98a585Andrew Sapperstein
645d6eaacbb9eb56763d38a3815fc509b92ed98a585Andrew Sapperstein  // Set the main file name, so that debug info works even with
646d6eaacbb9eb56763d38a3815fc509b92ed98a585Andrew Sapperstein  // -save-temps.
647d6eaacbb9eb56763d38a3815fc509b92ed98a585Andrew Sapperstein  CmdArgs.push_back("-main-file-name");
6486ba612efffba42bec102ac58a1540496158f747eAndrew Sapperstein  CmdArgs.push_back(darwin::CC1::getBaseInputName(Args, Inputs));
649d6eaacbb9eb56763d38a3815fc509b92ed98a585Andrew Sapperstein
6506ba612efffba42bec102ac58a1540496158f747eAndrew Sapperstein  // Some flags which affect the language (via preprocessor
651d6eaacbb9eb56763d38a3815fc509b92ed98a585Andrew Sapperstein  // defines). See darwin::CC1::AddCPPArgs.
652d6eaacbb9eb56763d38a3815fc509b92ed98a585Andrew Sapperstein  if (Args.hasArg(options::OPT_static))
653d6eaacbb9eb56763d38a3815fc509b92ed98a585Andrew Sapperstein    CmdArgs.push_back("-static-define");
654d6eaacbb9eb56763d38a3815fc509b92ed98a585Andrew Sapperstein
655d6eaacbb9eb56763d38a3815fc509b92ed98a585Andrew Sapperstein  if (isa<AnalyzeJobAction>(JA)) {
656d6eaacbb9eb56763d38a3815fc509b92ed98a585Andrew Sapperstein    // Enable region store model by default.
657d6eaacbb9eb56763d38a3815fc509b92ed98a585Andrew Sapperstein    CmdArgs.push_back("-analyzer-store=region");
658d6eaacbb9eb56763d38a3815fc509b92ed98a585Andrew Sapperstein
659d6eaacbb9eb56763d38a3815fc509b92ed98a585Andrew Sapperstein    // Treat blocks as analysis entry points.
660d6eaacbb9eb56763d38a3815fc509b92ed98a585Andrew Sapperstein    CmdArgs.push_back("-analyzer-opt-analyze-nested-blocks");
661d6eaacbb9eb56763d38a3815fc509b92ed98a585Andrew Sapperstein
662d6eaacbb9eb56763d38a3815fc509b92ed98a585Andrew Sapperstein    // Add default argument set.
663d6eaacbb9eb56763d38a3815fc509b92ed98a585Andrew Sapperstein    if (!Args.hasArg(options::OPT__analyzer_no_default_checks)) {
6646ba612efffba42bec102ac58a1540496158f747eAndrew Sapperstein      CmdArgs.push_back("-warn-dead-stores");
665d6eaacbb9eb56763d38a3815fc509b92ed98a585Andrew Sapperstein      CmdArgs.push_back("-warn-security-syntactic");
666d6eaacbb9eb56763d38a3815fc509b92ed98a585Andrew Sapperstein      CmdArgs.push_back("-checker-cfref");
667d6eaacbb9eb56763d38a3815fc509b92ed98a585Andrew Sapperstein      CmdArgs.push_back("-analyzer-eagerly-assume");
668d6eaacbb9eb56763d38a3815fc509b92ed98a585Andrew Sapperstein      CmdArgs.push_back("-warn-objc-methodsigs");
669d6eaacbb9eb56763d38a3815fc509b92ed98a585Andrew Sapperstein      // Do not enable the missing -dealloc check.
670d6eaacbb9eb56763d38a3815fc509b92ed98a585Andrew Sapperstein      // '-warn-objc-missing-dealloc',
671d6eaacbb9eb56763d38a3815fc509b92ed98a585Andrew Sapperstein      CmdArgs.push_back("-warn-objc-unused-ivars");
672d6eaacbb9eb56763d38a3815fc509b92ed98a585Andrew Sapperstein    }
673d6eaacbb9eb56763d38a3815fc509b92ed98a585Andrew Sapperstein
674d6eaacbb9eb56763d38a3815fc509b92ed98a585Andrew Sapperstein    // Set the output format. The default is plist, for (lame) historical
675d6eaacbb9eb56763d38a3815fc509b92ed98a585Andrew Sapperstein    // reasons.
676d6eaacbb9eb56763d38a3815fc509b92ed98a585Andrew Sapperstein    CmdArgs.push_back("-analyzer-output");
677d6eaacbb9eb56763d38a3815fc509b92ed98a585Andrew Sapperstein    if (Arg *A = Args.getLastArg(options::OPT__analyzer_output))
678d6eaacbb9eb56763d38a3815fc509b92ed98a585Andrew Sapperstein      CmdArgs.push_back(A->getValue(Args));
679d6eaacbb9eb56763d38a3815fc509b92ed98a585Andrew Sapperstein    else
680d6eaacbb9eb56763d38a3815fc509b92ed98a585Andrew Sapperstein      CmdArgs.push_back("plist");
681d6eaacbb9eb56763d38a3815fc509b92ed98a585Andrew Sapperstein
682d6eaacbb9eb56763d38a3815fc509b92ed98a585Andrew Sapperstein    // Add -Xanalyzer arguments when running as analyzer.
683d6eaacbb9eb56763d38a3815fc509b92ed98a585Andrew Sapperstein    Args.AddAllArgValues(CmdArgs, options::OPT_Xanalyzer);
6846ba612efffba42bec102ac58a1540496158f747eAndrew Sapperstein  }
685d6eaacbb9eb56763d38a3815fc509b92ed98a585Andrew Sapperstein
686d6eaacbb9eb56763d38a3815fc509b92ed98a585Andrew Sapperstein  CheckCodeGenerationOptions(D, Args);
6876ba612efffba42bec102ac58a1540496158f747eAndrew Sapperstein
688d6eaacbb9eb56763d38a3815fc509b92ed98a585Andrew Sapperstein  // Perform argument translation for LLVM backend. This
689d6eaacbb9eb56763d38a3815fc509b92ed98a585Andrew Sapperstein  // takes some care in reconciling with llvm-gcc. The
690d6eaacbb9eb56763d38a3815fc509b92ed98a585Andrew Sapperstein  // issue is that llvm-gcc translates these options based on
691d6eaacbb9eb56763d38a3815fc509b92ed98a585Andrew Sapperstein  // the values in cc1, whereas we are processing based on
692d6eaacbb9eb56763d38a3815fc509b92ed98a585Andrew Sapperstein  // the driver arguments.
693d6eaacbb9eb56763d38a3815fc509b92ed98a585Andrew Sapperstein
694d6eaacbb9eb56763d38a3815fc509b92ed98a585Andrew Sapperstein  // This comes from the default translation the driver + cc1
695d6eaacbb9eb56763d38a3815fc509b92ed98a585Andrew Sapperstein  // would do to enable flag_pic.
696d6eaacbb9eb56763d38a3815fc509b92ed98a585Andrew Sapperstein  //
697d6eaacbb9eb56763d38a3815fc509b92ed98a585Andrew Sapperstein  // FIXME: Centralize this code.
698d6eaacbb9eb56763d38a3815fc509b92ed98a585Andrew Sapperstein  bool PICEnabled = (Args.hasArg(options::OPT_fPIC) ||
699d6eaacbb9eb56763d38a3815fc509b92ed98a585Andrew Sapperstein                     Args.hasArg(options::OPT_fpic) ||
7006ba612efffba42bec102ac58a1540496158f747eAndrew Sapperstein                     Args.hasArg(options::OPT_fPIE) ||
701d6eaacbb9eb56763d38a3815fc509b92ed98a585Andrew Sapperstein                     Args.hasArg(options::OPT_fpie));
702d6eaacbb9eb56763d38a3815fc509b92ed98a585Andrew Sapperstein  bool PICDisabled = (Args.hasArg(options::OPT_mkernel) ||
703d6eaacbb9eb56763d38a3815fc509b92ed98a585Andrew Sapperstein                      Args.hasArg(options::OPT_static));
704d6eaacbb9eb56763d38a3815fc509b92ed98a585Andrew Sapperstein  const char *Model = getToolChain().GetForcedPicModel();
705d6eaacbb9eb56763d38a3815fc509b92ed98a585Andrew Sapperstein  if (!Model) {
706d6eaacbb9eb56763d38a3815fc509b92ed98a585Andrew Sapperstein    if (Args.hasArg(options::OPT_mdynamic_no_pic))
707d6eaacbb9eb56763d38a3815fc509b92ed98a585Andrew Sapperstein      Model = "dynamic-no-pic";
708d6eaacbb9eb56763d38a3815fc509b92ed98a585Andrew Sapperstein    else if (PICDisabled)
709d6eaacbb9eb56763d38a3815fc509b92ed98a585Andrew Sapperstein      Model = "static";
710d6eaacbb9eb56763d38a3815fc509b92ed98a585Andrew Sapperstein    else if (PICEnabled)
711d6eaacbb9eb56763d38a3815fc509b92ed98a585Andrew Sapperstein      Model = "pic";
7126ba612efffba42bec102ac58a1540496158f747eAndrew Sapperstein    else
713d6eaacbb9eb56763d38a3815fc509b92ed98a585Andrew Sapperstein      Model = getToolChain().GetDefaultRelocationModel();
714d6eaacbb9eb56763d38a3815fc509b92ed98a585Andrew Sapperstein  }
715d6eaacbb9eb56763d38a3815fc509b92ed98a585Andrew Sapperstein  if (llvm::StringRef(Model) != "pic") {
716d6eaacbb9eb56763d38a3815fc509b92ed98a585Andrew Sapperstein    CmdArgs.push_back("-mrelocation-model");
717d6eaacbb9eb56763d38a3815fc509b92ed98a585Andrew Sapperstein    CmdArgs.push_back(Model);
718d6eaacbb9eb56763d38a3815fc509b92ed98a585Andrew Sapperstein  }
719d6eaacbb9eb56763d38a3815fc509b92ed98a585Andrew Sapperstein
720d6eaacbb9eb56763d38a3815fc509b92ed98a585Andrew Sapperstein  // Infer the __PIC__ value.
721d6eaacbb9eb56763d38a3815fc509b92ed98a585Andrew Sapperstein  //
722d6eaacbb9eb56763d38a3815fc509b92ed98a585Andrew Sapperstein  // FIXME:  This isn't quite right on Darwin, which always sets
723d6eaacbb9eb56763d38a3815fc509b92ed98a585Andrew Sapperstein  // __PIC__=2.
724d6eaacbb9eb56763d38a3815fc509b92ed98a585Andrew Sapperstein  if (strcmp(Model, "pic") == 0 || strcmp(Model, "dynamic-no-pic") == 0) {
725d6eaacbb9eb56763d38a3815fc509b92ed98a585Andrew Sapperstein    CmdArgs.push_back("-pic-level");
726d6eaacbb9eb56763d38a3815fc509b92ed98a585Andrew Sapperstein    CmdArgs.push_back(Args.hasArg(options::OPT_fPIC) ? "2" : "1");
727d6eaacbb9eb56763d38a3815fc509b92ed98a585Andrew Sapperstein  }
728d6eaacbb9eb56763d38a3815fc509b92ed98a585Andrew Sapperstein  if (!Args.hasFlag(options::OPT_fmerge_all_constants,
729d6eaacbb9eb56763d38a3815fc509b92ed98a585Andrew Sapperstein                    options::OPT_fno_merge_all_constants))
7306ba612efffba42bec102ac58a1540496158f747eAndrew Sapperstein    CmdArgs.push_back("-no-merge-all-constants");
731d6eaacbb9eb56763d38a3815fc509b92ed98a585Andrew Sapperstein
7326ba612efffba42bec102ac58a1540496158f747eAndrew Sapperstein  // LLVM Code Generator Options.
7336ba612efffba42bec102ac58a1540496158f747eAndrew Sapperstein
734d6eaacbb9eb56763d38a3815fc509b92ed98a585Andrew Sapperstein  // FIXME: Set --enable-unsafe-fp-math.
735d6eaacbb9eb56763d38a3815fc509b92ed98a585Andrew Sapperstein  if (Args.hasFlag(options::OPT_fno_omit_frame_pointer,
736d6eaacbb9eb56763d38a3815fc509b92ed98a585Andrew Sapperstein                   options::OPT_fomit_frame_pointer))
737d6eaacbb9eb56763d38a3815fc509b92ed98a585Andrew Sapperstein    CmdArgs.push_back("-mdisable-fp-elim");
738d6eaacbb9eb56763d38a3815fc509b92ed98a585Andrew Sapperstein  if (!Args.hasFlag(options::OPT_fzero_initialized_in_bss,
739d6eaacbb9eb56763d38a3815fc509b92ed98a585Andrew Sapperstein                    options::OPT_fno_zero_initialized_in_bss))
740d6eaacbb9eb56763d38a3815fc509b92ed98a585Andrew Sapperstein    CmdArgs.push_back("-mno-zero-initialized-in-bss");
7416ba612efffba42bec102ac58a1540496158f747eAndrew Sapperstein  if (Args.hasArg(options::OPT_dA) || Args.hasArg(options::OPT_fverbose_asm))
742d6eaacbb9eb56763d38a3815fc509b92ed98a585Andrew Sapperstein    CmdArgs.push_back("-masm-verbose");
7436ba612efffba42bec102ac58a1540496158f747eAndrew Sapperstein  if (Args.hasArg(options::OPT_fdebug_pass_structure)) {
7446ba612efffba42bec102ac58a1540496158f747eAndrew Sapperstein    CmdArgs.push_back("-mdebug-pass");
745d6eaacbb9eb56763d38a3815fc509b92ed98a585Andrew Sapperstein    CmdArgs.push_back("Structure");
746d6eaacbb9eb56763d38a3815fc509b92ed98a585Andrew Sapperstein  }
7476ba612efffba42bec102ac58a1540496158f747eAndrew Sapperstein  if (Args.hasArg(options::OPT_fdebug_pass_arguments)) {
748d6eaacbb9eb56763d38a3815fc509b92ed98a585Andrew Sapperstein    CmdArgs.push_back("-mdebug-pass");
749d6eaacbb9eb56763d38a3815fc509b92ed98a585Andrew Sapperstein    CmdArgs.push_back("Arguments");
750d6eaacbb9eb56763d38a3815fc509b92ed98a585Andrew Sapperstein  }
751d6eaacbb9eb56763d38a3815fc509b92ed98a585Andrew Sapperstein
752d6eaacbb9eb56763d38a3815fc509b92ed98a585Andrew Sapperstein  // This is a coarse approximation of what llvm-gcc actually does, both
753d6eaacbb9eb56763d38a3815fc509b92ed98a585Andrew Sapperstein  // -fasynchronous-unwind-tables and -fnon-call-exceptions interact in more
754d6eaacbb9eb56763d38a3815fc509b92ed98a585Andrew Sapperstein  // complicated ways.
755d6eaacbb9eb56763d38a3815fc509b92ed98a585Andrew Sapperstein  bool AsynchronousUnwindTables =
756d6eaacbb9eb56763d38a3815fc509b92ed98a585Andrew Sapperstein    Args.hasFlag(options::OPT_fasynchronous_unwind_tables,
757d6eaacbb9eb56763d38a3815fc509b92ed98a585Andrew Sapperstein                 options::OPT_fno_asynchronous_unwind_tables,
758d6eaacbb9eb56763d38a3815fc509b92ed98a585Andrew Sapperstein                 getToolChain().IsUnwindTablesDefault() &&
759d6eaacbb9eb56763d38a3815fc509b92ed98a585Andrew Sapperstein                 !Args.hasArg(options::OPT_mkernel));
7606ba612efffba42bec102ac58a1540496158f747eAndrew Sapperstein  if (Args.hasFlag(options::OPT_funwind_tables, options::OPT_fno_unwind_tables,
761d6eaacbb9eb56763d38a3815fc509b92ed98a585Andrew Sapperstein                   AsynchronousUnwindTables))
762d6eaacbb9eb56763d38a3815fc509b92ed98a585Andrew Sapperstein    CmdArgs.push_back("-munwind-tables");
763d6eaacbb9eb56763d38a3815fc509b92ed98a585Andrew Sapperstein
764d6eaacbb9eb56763d38a3815fc509b92ed98a585Andrew Sapperstein  if (Arg *A = Args.getLastArg(options::OPT_flimited_precision_EQ)) {
765d6eaacbb9eb56763d38a3815fc509b92ed98a585Andrew Sapperstein    CmdArgs.push_back("-mlimit-float-precision");
766d6eaacbb9eb56763d38a3815fc509b92ed98a585Andrew Sapperstein    CmdArgs.push_back(A->getValue(Args));
767d6eaacbb9eb56763d38a3815fc509b92ed98a585Andrew Sapperstein  }
768d6eaacbb9eb56763d38a3815fc509b92ed98a585Andrew Sapperstein
769d6eaacbb9eb56763d38a3815fc509b92ed98a585Andrew Sapperstein  // FIXME: Handle -mtune=.
770d6eaacbb9eb56763d38a3815fc509b92ed98a585Andrew Sapperstein  (void) Args.hasArg(options::OPT_mtune_EQ);
771d6eaacbb9eb56763d38a3815fc509b92ed98a585Andrew Sapperstein
772d6eaacbb9eb56763d38a3815fc509b92ed98a585Andrew Sapperstein  if (Arg *A = Args.getLastArg(options::OPT_mcmodel_EQ)) {
773d6eaacbb9eb56763d38a3815fc509b92ed98a585Andrew Sapperstein    CmdArgs.push_back("-mcode-model");
774d6eaacbb9eb56763d38a3815fc509b92ed98a585Andrew Sapperstein    CmdArgs.push_back(A->getValue(Args));
775d6eaacbb9eb56763d38a3815fc509b92ed98a585Andrew Sapperstein  }
776d6eaacbb9eb56763d38a3815fc509b92ed98a585Andrew Sapperstein
777d6eaacbb9eb56763d38a3815fc509b92ed98a585Andrew Sapperstein  // Add target specific cpu and features flags.
778d6eaacbb9eb56763d38a3815fc509b92ed98a585Andrew Sapperstein  switch(getToolChain().getTriple().getArch()) {
779d6eaacbb9eb56763d38a3815fc509b92ed98a585Andrew Sapperstein  default:
780d6eaacbb9eb56763d38a3815fc509b92ed98a585Andrew Sapperstein    break;
781d6eaacbb9eb56763d38a3815fc509b92ed98a585Andrew Sapperstein
782d6eaacbb9eb56763d38a3815fc509b92ed98a585Andrew Sapperstein  case llvm::Triple::arm:
783d6eaacbb9eb56763d38a3815fc509b92ed98a585Andrew Sapperstein  case llvm::Triple::thumb:
784d6eaacbb9eb56763d38a3815fc509b92ed98a585Andrew Sapperstein    AddARMTargetArgs(Args, CmdArgs);
785d6eaacbb9eb56763d38a3815fc509b92ed98a585Andrew Sapperstein    break;
786d6eaacbb9eb56763d38a3815fc509b92ed98a585Andrew Sapperstein
787d6eaacbb9eb56763d38a3815fc509b92ed98a585Andrew Sapperstein  case llvm::Triple::x86:
788d6eaacbb9eb56763d38a3815fc509b92ed98a585Andrew Sapperstein  case llvm::Triple::x86_64:
789d6eaacbb9eb56763d38a3815fc509b92ed98a585Andrew Sapperstein    AddX86TargetArgs(Args, CmdArgs);
7906ba612efffba42bec102ac58a1540496158f747eAndrew Sapperstein    break;
791d6eaacbb9eb56763d38a3815fc509b92ed98a585Andrew Sapperstein  }
792d6eaacbb9eb56763d38a3815fc509b92ed98a585Andrew Sapperstein
793d6eaacbb9eb56763d38a3815fc509b92ed98a585Andrew Sapperstein  // -fmath-errno is default.
794d6eaacbb9eb56763d38a3815fc509b92ed98a585Andrew Sapperstein  if (!Args.hasFlag(options::OPT_fmath_errno,
795d6eaacbb9eb56763d38a3815fc509b92ed98a585Andrew Sapperstein                   options::OPT_fno_math_errno,
796d6eaacbb9eb56763d38a3815fc509b92ed98a585Andrew Sapperstein                   getToolChain().IsMathErrnoDefault()))
797d6eaacbb9eb56763d38a3815fc509b92ed98a585Andrew Sapperstein    CmdArgs.push_back("-fno-math-errno");
798d6eaacbb9eb56763d38a3815fc509b92ed98a585Andrew Sapperstein
7996ba612efffba42bec102ac58a1540496158f747eAndrew Sapperstein  Arg *Unsupported;
800d6eaacbb9eb56763d38a3815fc509b92ed98a585Andrew Sapperstein  if ((Unsupported = Args.getLastArg(options::OPT_MG)) ||
801d6eaacbb9eb56763d38a3815fc509b92ed98a585Andrew Sapperstein      (Unsupported = Args.getLastArg(options::OPT_MQ)) ||
802d6eaacbb9eb56763d38a3815fc509b92ed98a585Andrew Sapperstein      (Unsupported = Args.getLastArg(options::OPT_iframework)) ||
803d6eaacbb9eb56763d38a3815fc509b92ed98a585Andrew Sapperstein      (Unsupported = Args.getLastArg(options::OPT_fshort_enums)))
804d6eaacbb9eb56763d38a3815fc509b92ed98a585Andrew Sapperstein    D.Diag(clang::diag::err_drv_clang_unsupported)
805d6eaacbb9eb56763d38a3815fc509b92ed98a585Andrew Sapperstein      << Unsupported->getOption().getName();
806d6eaacbb9eb56763d38a3815fc509b92ed98a585Andrew Sapperstein
807d6eaacbb9eb56763d38a3815fc509b92ed98a585Andrew Sapperstein  Args.AddAllArgs(CmdArgs, options::OPT_v);
808d6eaacbb9eb56763d38a3815fc509b92ed98a585Andrew Sapperstein  Args.AddLastArg(CmdArgs, options::OPT_P);
809d6eaacbb9eb56763d38a3815fc509b92ed98a585Andrew Sapperstein  Args.AddLastArg(CmdArgs, options::OPT_print_ivar_layout);
810d6eaacbb9eb56763d38a3815fc509b92ed98a585Andrew Sapperstein
811d6eaacbb9eb56763d38a3815fc509b92ed98a585Andrew Sapperstein  // Special case debug options to only pass -g to clang. This is
812d6eaacbb9eb56763d38a3815fc509b92ed98a585Andrew Sapperstein  // wrong.
813d6eaacbb9eb56763d38a3815fc509b92ed98a585Andrew Sapperstein  if (Args.hasArg(options::OPT_g_Group))
814d6eaacbb9eb56763d38a3815fc509b92ed98a585Andrew Sapperstein    CmdArgs.push_back("-g");
815d6eaacbb9eb56763d38a3815fc509b92ed98a585Andrew Sapperstein
8166ba612efffba42bec102ac58a1540496158f747eAndrew Sapperstein  Args.AddLastArg(CmdArgs, options::OPT_nostdinc);
817d6eaacbb9eb56763d38a3815fc509b92ed98a585Andrew Sapperstein  Args.AddLastArg(CmdArgs, options::OPT_nobuiltininc);
818d6eaacbb9eb56763d38a3815fc509b92ed98a585Andrew Sapperstein
819d6eaacbb9eb56763d38a3815fc509b92ed98a585Andrew Sapperstein  // Pass the path to compiler resource files.
820d6eaacbb9eb56763d38a3815fc509b92ed98a585Andrew Sapperstein  //
821d6eaacbb9eb56763d38a3815fc509b92ed98a585Andrew Sapperstein  // FIXME: Get this from a configuration object.
822d6eaacbb9eb56763d38a3815fc509b92ed98a585Andrew Sapperstein  llvm::sys::Path P(D.Dir);
823d6eaacbb9eb56763d38a3815fc509b92ed98a585Andrew Sapperstein  P.eraseComponent(); // Remove /bin from foo/bin
824d6eaacbb9eb56763d38a3815fc509b92ed98a585Andrew Sapperstein  P.appendComponent("lib");
825d6eaacbb9eb56763d38a3815fc509b92ed98a585Andrew Sapperstein  P.appendComponent("clang");
826d6eaacbb9eb56763d38a3815fc509b92ed98a585Andrew Sapperstein  P.appendComponent(CLANG_VERSION_STRING);
827d6eaacbb9eb56763d38a3815fc509b92ed98a585Andrew Sapperstein  CmdArgs.push_back("-resource-dir");
828d6eaacbb9eb56763d38a3815fc509b92ed98a585Andrew Sapperstein  CmdArgs.push_back(Args.MakeArgString(P.str()));
829d6eaacbb9eb56763d38a3815fc509b92ed98a585Andrew Sapperstein
8306ba612efffba42bec102ac58a1540496158f747eAndrew Sapperstein  // Add preprocessing options like -I, -D, etc. if we are using the
831d6eaacbb9eb56763d38a3815fc509b92ed98a585Andrew Sapperstein  // preprocessor.
832d6eaacbb9eb56763d38a3815fc509b92ed98a585Andrew Sapperstein  //
833d6eaacbb9eb56763d38a3815fc509b92ed98a585Andrew Sapperstein  // FIXME: Support -fpreprocessed
834d6eaacbb9eb56763d38a3815fc509b92ed98a585Andrew Sapperstein  types::ID InputType = Inputs[0].getType();
835d6eaacbb9eb56763d38a3815fc509b92ed98a585Andrew Sapperstein  if (types::getPreprocessedType(InputType) != types::TY_INVALID)
836d6eaacbb9eb56763d38a3815fc509b92ed98a585Andrew Sapperstein    AddPreprocessingOptions(D, Args, CmdArgs, Output, Inputs);
837d6eaacbb9eb56763d38a3815fc509b92ed98a585Andrew Sapperstein
838d6eaacbb9eb56763d38a3815fc509b92ed98a585Andrew Sapperstein  // Manually translate -O to -O2 and -O4 to -O3; let clang reject
839d6eaacbb9eb56763d38a3815fc509b92ed98a585Andrew Sapperstein  // others.
840d6eaacbb9eb56763d38a3815fc509b92ed98a585Andrew Sapperstein  if (Arg *A = Args.getLastArg(options::OPT_O_Group)) {
841d6eaacbb9eb56763d38a3815fc509b92ed98a585Andrew Sapperstein    if (A->getOption().matches(options::OPT_O4))
842d6eaacbb9eb56763d38a3815fc509b92ed98a585Andrew Sapperstein      CmdArgs.push_back("-O3");
843d6eaacbb9eb56763d38a3815fc509b92ed98a585Andrew Sapperstein    else if (A->getValue(Args)[0] == '\0')
844d6eaacbb9eb56763d38a3815fc509b92ed98a585Andrew Sapperstein      CmdArgs.push_back("-O2");
845d6eaacbb9eb56763d38a3815fc509b92ed98a585Andrew Sapperstein    else
846d6eaacbb9eb56763d38a3815fc509b92ed98a585Andrew Sapperstein      A->render(Args, CmdArgs);
847d6eaacbb9eb56763d38a3815fc509b92ed98a585Andrew Sapperstein  }
848d6eaacbb9eb56763d38a3815fc509b92ed98a585Andrew Sapperstein
849d6eaacbb9eb56763d38a3815fc509b92ed98a585Andrew Sapperstein  Args.AddAllArgs(CmdArgs, options::OPT_W_Group);
850d6eaacbb9eb56763d38a3815fc509b92ed98a585Andrew Sapperstein  Args.AddLastArg(CmdArgs, options::OPT_pedantic);
851d6eaacbb9eb56763d38a3815fc509b92ed98a585Andrew Sapperstein  Args.AddLastArg(CmdArgs, options::OPT_pedantic_errors);
852d6eaacbb9eb56763d38a3815fc509b92ed98a585Andrew Sapperstein  Args.AddLastArg(CmdArgs, options::OPT_w);
853d6eaacbb9eb56763d38a3815fc509b92ed98a585Andrew Sapperstein
854d6eaacbb9eb56763d38a3815fc509b92ed98a585Andrew Sapperstein  // Handle -{std, ansi, trigraphs} -- take the last of -{std, ansi}
855d6eaacbb9eb56763d38a3815fc509b92ed98a585Andrew Sapperstein  // (-ansi is equivalent to -std=c89).
856d6eaacbb9eb56763d38a3815fc509b92ed98a585Andrew Sapperstein  //
857d6eaacbb9eb56763d38a3815fc509b92ed98a585Andrew Sapperstein  // If a std is supplied, only add -trigraphs if it follows the
858d6eaacbb9eb56763d38a3815fc509b92ed98a585Andrew Sapperstein  // option.
859d6eaacbb9eb56763d38a3815fc509b92ed98a585Andrew Sapperstein  if (Arg *Std = Args.getLastArg(options::OPT_std_EQ, options::OPT_ansi)) {
8606ba612efffba42bec102ac58a1540496158f747eAndrew Sapperstein    if (Std->getOption().matches(options::OPT_ansi))
8616ba612efffba42bec102ac58a1540496158f747eAndrew Sapperstein      if (types::isCXX(InputType))
862d6eaacbb9eb56763d38a3815fc509b92ed98a585Andrew Sapperstein        CmdArgs.push_back("-std=c++98");
863d6eaacbb9eb56763d38a3815fc509b92ed98a585Andrew Sapperstein      else
864d6eaacbb9eb56763d38a3815fc509b92ed98a585Andrew Sapperstein        CmdArgs.push_back("-std=c89");
865d6eaacbb9eb56763d38a3815fc509b92ed98a585Andrew Sapperstein    else
866d6eaacbb9eb56763d38a3815fc509b92ed98a585Andrew Sapperstein      Std->render(Args, CmdArgs);
867d6eaacbb9eb56763d38a3815fc509b92ed98a585Andrew Sapperstein
868d6eaacbb9eb56763d38a3815fc509b92ed98a585Andrew Sapperstein    if (Arg *A = Args.getLastArg(options::OPT_trigraphs))
869d6eaacbb9eb56763d38a3815fc509b92ed98a585Andrew Sapperstein      if (A->getIndex() > Std->getIndex())
870d6eaacbb9eb56763d38a3815fc509b92ed98a585Andrew Sapperstein        A->render(Args, CmdArgs);
871d6eaacbb9eb56763d38a3815fc509b92ed98a585Andrew Sapperstein  } else {
8726ba612efffba42bec102ac58a1540496158f747eAndrew Sapperstein    // Honor -std-default.
873d6eaacbb9eb56763d38a3815fc509b92ed98a585Andrew Sapperstein    Args.AddAllArgsTranslated(CmdArgs, options::OPT_std_default_EQ,
874d6eaacbb9eb56763d38a3815fc509b92ed98a585Andrew Sapperstein                              "-std=", /*Joined=*/true);
875d6eaacbb9eb56763d38a3815fc509b92ed98a585Andrew Sapperstein    Args.AddLastArg(CmdArgs, options::OPT_trigraphs);
876d6eaacbb9eb56763d38a3815fc509b92ed98a585Andrew Sapperstein  }
877d6eaacbb9eb56763d38a3815fc509b92ed98a585Andrew Sapperstein
878d6eaacbb9eb56763d38a3815fc509b92ed98a585Andrew Sapperstein  if (Arg *A = Args.getLastArg(options::OPT_ftemplate_depth_)) {
879d6eaacbb9eb56763d38a3815fc509b92ed98a585Andrew Sapperstein    CmdArgs.push_back("-ftemplate-depth");
880d6eaacbb9eb56763d38a3815fc509b92ed98a585Andrew Sapperstein    CmdArgs.push_back(A->getValue(Args));
8816ba612efffba42bec102ac58a1540496158f747eAndrew Sapperstein  }
882d6eaacbb9eb56763d38a3815fc509b92ed98a585Andrew Sapperstein
883d6eaacbb9eb56763d38a3815fc509b92ed98a585Andrew Sapperstein  if (Args.hasArg(options::OPT__relocatable_pch))
884d6eaacbb9eb56763d38a3815fc509b92ed98a585Andrew Sapperstein    CmdArgs.push_back("-relocatable-pch");
885d6eaacbb9eb56763d38a3815fc509b92ed98a585Andrew Sapperstein
886d6eaacbb9eb56763d38a3815fc509b92ed98a585Andrew Sapperstein  if (Arg *A = Args.getLastArg(options::OPT_fconstant_string_class_EQ)) {
887d6eaacbb9eb56763d38a3815fc509b92ed98a585Andrew Sapperstein    CmdArgs.push_back("-fconstant-string-class");
888d6eaacbb9eb56763d38a3815fc509b92ed98a585Andrew Sapperstein    CmdArgs.push_back(A->getValue(Args));
889d6eaacbb9eb56763d38a3815fc509b92ed98a585Andrew Sapperstein  }
890d6eaacbb9eb56763d38a3815fc509b92ed98a585Andrew Sapperstein
891d6eaacbb9eb56763d38a3815fc509b92ed98a585Andrew Sapperstein  // Pass -fmessage-length=.
892d6eaacbb9eb56763d38a3815fc509b92ed98a585Andrew Sapperstein  CmdArgs.push_back("-fmessage-length");
893d6eaacbb9eb56763d38a3815fc509b92ed98a585Andrew Sapperstein  if (Arg *A = Args.getLastArg(options::OPT_fmessage_length_EQ)) {
894d6eaacbb9eb56763d38a3815fc509b92ed98a585Andrew Sapperstein    CmdArgs.push_back(A->getValue(Args));
895d6eaacbb9eb56763d38a3815fc509b92ed98a585Andrew Sapperstein  } else {
896d6eaacbb9eb56763d38a3815fc509b92ed98a585Andrew Sapperstein    // If -fmessage-length=N was not specified, determine whether this is a
897d6eaacbb9eb56763d38a3815fc509b92ed98a585Andrew Sapperstein    // terminal and, if so, implicitly define -fmessage-length appropriately.
8986ba612efffba42bec102ac58a1540496158f747eAndrew Sapperstein    unsigned N = llvm::sys::Process::StandardErrColumns();
899d6eaacbb9eb56763d38a3815fc509b92ed98a585Andrew Sapperstein    CmdArgs.push_back(Args.MakeArgString(llvm::Twine(N)));
900d6eaacbb9eb56763d38a3815fc509b92ed98a585Andrew Sapperstein  }
901d6eaacbb9eb56763d38a3815fc509b92ed98a585Andrew Sapperstein
902d6eaacbb9eb56763d38a3815fc509b92ed98a585Andrew Sapperstein  if (const Arg *A = Args.getLastArg(options::OPT_fvisibility_EQ)) {
903d6eaacbb9eb56763d38a3815fc509b92ed98a585Andrew Sapperstein    CmdArgs.push_back("-fvisibility");
904d6eaacbb9eb56763d38a3815fc509b92ed98a585Andrew Sapperstein    CmdArgs.push_back(A->getValue(Args));
905d6eaacbb9eb56763d38a3815fc509b92ed98a585Andrew Sapperstein  }
906d6eaacbb9eb56763d38a3815fc509b92ed98a585Andrew Sapperstein
907d6eaacbb9eb56763d38a3815fc509b92ed98a585Andrew Sapperstein  // Forward -f (flag) options which we can pass directly.
908d6eaacbb9eb56763d38a3815fc509b92ed98a585Andrew Sapperstein  Args.AddLastArg(CmdArgs, options::OPT_fcatch_undefined_behavior);
909d6eaacbb9eb56763d38a3815fc509b92ed98a585Andrew Sapperstein  Args.AddLastArg(CmdArgs, options::OPT_femit_all_decls);
910d6eaacbb9eb56763d38a3815fc509b92ed98a585Andrew Sapperstein  Args.AddLastArg(CmdArgs, options::OPT_ffreestanding);
911d6eaacbb9eb56763d38a3815fc509b92ed98a585Andrew Sapperstein  Args.AddLastArg(CmdArgs, options::OPT_fheinous_gnu_extensions);
9126ba612efffba42bec102ac58a1540496158f747eAndrew Sapperstein  Args.AddLastArg(CmdArgs, options::OPT_flax_vector_conversions);
913d6eaacbb9eb56763d38a3815fc509b92ed98a585Andrew Sapperstein  Args.AddLastArg(CmdArgs, options::OPT_fno_caret_diagnostics);
914d6eaacbb9eb56763d38a3815fc509b92ed98a585Andrew Sapperstein  Args.AddLastArg(CmdArgs, options::OPT_fno_show_column);
915d6eaacbb9eb56763d38a3815fc509b92ed98a585Andrew Sapperstein  Args.AddLastArg(CmdArgs, options::OPT_fobjc_gc_only);
916d6eaacbb9eb56763d38a3815fc509b92ed98a585Andrew Sapperstein  Args.AddLastArg(CmdArgs, options::OPT_fobjc_gc);
917d6eaacbb9eb56763d38a3815fc509b92ed98a585Andrew Sapperstein  Args.AddLastArg(CmdArgs, options::OPT_fobjc_sender_dependent_dispatch);
918d6eaacbb9eb56763d38a3815fc509b92ed98a585Andrew Sapperstein  Args.AddLastArg(CmdArgs, options::OPT_fdiagnostics_print_source_range_info);
919d6eaacbb9eb56763d38a3815fc509b92ed98a585Andrew Sapperstein  Args.AddLastArg(CmdArgs, options::OPT_ftime_report);
920d6eaacbb9eb56763d38a3815fc509b92ed98a585Andrew Sapperstein  Args.AddLastArg(CmdArgs, options::OPT_ftrapv);
921d6eaacbb9eb56763d38a3815fc509b92ed98a585Andrew Sapperstein  Args.AddLastArg(CmdArgs, options::OPT_fwritable_strings);
922d6eaacbb9eb56763d38a3815fc509b92ed98a585Andrew Sapperstein
923d6eaacbb9eb56763d38a3815fc509b92ed98a585Andrew Sapperstein  Args.AddLastArg(CmdArgs, options::OPT_pthread);
924d6eaacbb9eb56763d38a3815fc509b92ed98a585Andrew Sapperstein
925d6eaacbb9eb56763d38a3815fc509b92ed98a585Andrew Sapperstein  // -stack-protector=0 is default.
926d6eaacbb9eb56763d38a3815fc509b92ed98a585Andrew Sapperstein  unsigned StackProtectorLevel = 0;
927d6eaacbb9eb56763d38a3815fc509b92ed98a585Andrew Sapperstein  if (Arg *A = Args.getLastArg(options::OPT_fno_stack_protector,
928d6eaacbb9eb56763d38a3815fc509b92ed98a585Andrew Sapperstein                               options::OPT_fstack_protector_all,
929d6eaacbb9eb56763d38a3815fc509b92ed98a585Andrew Sapperstein                               options::OPT_fstack_protector)) {
930d6eaacbb9eb56763d38a3815fc509b92ed98a585Andrew Sapperstein    if (A->getOption().matches(options::OPT_fstack_protector))
931d6eaacbb9eb56763d38a3815fc509b92ed98a585Andrew Sapperstein      StackProtectorLevel = 1;
932d6eaacbb9eb56763d38a3815fc509b92ed98a585Andrew Sapperstein    else if (A->getOption().matches(options::OPT_fstack_protector_all))
933d6eaacbb9eb56763d38a3815fc509b92ed98a585Andrew Sapperstein      StackProtectorLevel = 2;
934d6eaacbb9eb56763d38a3815fc509b92ed98a585Andrew Sapperstein  } else
935d6eaacbb9eb56763d38a3815fc509b92ed98a585Andrew Sapperstein    StackProtectorLevel = getToolChain().GetDefaultStackProtectorLevel();
936d6eaacbb9eb56763d38a3815fc509b92ed98a585Andrew Sapperstein  if (StackProtectorLevel) {
937d6eaacbb9eb56763d38a3815fc509b92ed98a585Andrew Sapperstein    CmdArgs.push_back("-stack-protector");
938d6eaacbb9eb56763d38a3815fc509b92ed98a585Andrew Sapperstein    CmdArgs.push_back(Args.MakeArgString(llvm::Twine(StackProtectorLevel)));
939d6eaacbb9eb56763d38a3815fc509b92ed98a585Andrew Sapperstein  }
9406ba612efffba42bec102ac58a1540496158f747eAndrew Sapperstein
9416ba612efffba42bec102ac58a1540496158f747eAndrew Sapperstein  // Forward -f options with positive and negative forms; we translate
942d6eaacbb9eb56763d38a3815fc509b92ed98a585Andrew Sapperstein  // these by hand.
943d6eaacbb9eb56763d38a3815fc509b92ed98a585Andrew Sapperstein
944d6eaacbb9eb56763d38a3815fc509b92ed98a585Andrew Sapperstein  // -fbuiltin is default.
945d6eaacbb9eb56763d38a3815fc509b92ed98a585Andrew Sapperstein  if (!Args.hasFlag(options::OPT_fbuiltin, options::OPT_fno_builtin))
946d6eaacbb9eb56763d38a3815fc509b92ed98a585Andrew Sapperstein    CmdArgs.push_back("-fno-builtin");
947d6eaacbb9eb56763d38a3815fc509b92ed98a585Andrew Sapperstein
948d6eaacbb9eb56763d38a3815fc509b92ed98a585Andrew Sapperstein  if (!Args.hasFlag(options::OPT_fassume_sane_operator_new,
949d6eaacbb9eb56763d38a3815fc509b92ed98a585Andrew Sapperstein                    options::OPT_fno_assume_sane_operator_new))
950d6eaacbb9eb56763d38a3815fc509b92ed98a585Andrew Sapperstein    CmdArgs.push_back("-fno-assume-sane-operator-new");
951d6eaacbb9eb56763d38a3815fc509b92ed98a585Andrew Sapperstein
952d6eaacbb9eb56763d38a3815fc509b92ed98a585Andrew Sapperstein  // -fblocks=0 is default.
953d6eaacbb9eb56763d38a3815fc509b92ed98a585Andrew Sapperstein  if (Args.hasFlag(options::OPT_fblocks, options::OPT_fno_blocks,
954d6eaacbb9eb56763d38a3815fc509b92ed98a585Andrew Sapperstein                   getToolChain().IsBlocksDefault())) {
955d6eaacbb9eb56763d38a3815fc509b92ed98a585Andrew Sapperstein    Args.AddLastArg(CmdArgs, options::OPT_fblock_introspection);
956d6eaacbb9eb56763d38a3815fc509b92ed98a585Andrew Sapperstein    CmdArgs.push_back("-fblocks");
957d6eaacbb9eb56763d38a3815fc509b92ed98a585Andrew Sapperstein  }
958d6eaacbb9eb56763d38a3815fc509b92ed98a585Andrew Sapperstein
959d6eaacbb9eb56763d38a3815fc509b92ed98a585Andrew Sapperstein  // -fexceptions=0 is default.
960d6eaacbb9eb56763d38a3815fc509b92ed98a585Andrew Sapperstein  if (needsExceptions(Args, InputType, getToolChain().getTriple()))
961d6eaacbb9eb56763d38a3815fc509b92ed98a585Andrew Sapperstein    CmdArgs.push_back("-fexceptions");
962d6eaacbb9eb56763d38a3815fc509b92ed98a585Andrew Sapperstein
963d6eaacbb9eb56763d38a3815fc509b92ed98a585Andrew Sapperstein  // -frtti is default.
9646ba612efffba42bec102ac58a1540496158f747eAndrew Sapperstein  if (!Args.hasFlag(options::OPT_frtti, options::OPT_fno_rtti))
9656ba612efffba42bec102ac58a1540496158f747eAndrew Sapperstein    CmdArgs.push_back("-fno-rtti");
966d6eaacbb9eb56763d38a3815fc509b92ed98a585Andrew Sapperstein
967d6eaacbb9eb56763d38a3815fc509b92ed98a585Andrew Sapperstein  // -fsigned-char is default.
968d6eaacbb9eb56763d38a3815fc509b92ed98a585Andrew Sapperstein  if (!Args.hasFlag(options::OPT_fsigned_char, options::OPT_funsigned_char,
969d6eaacbb9eb56763d38a3815fc509b92ed98a585Andrew Sapperstein                    isSignedCharDefault(getToolChain().getTriple())))
970d6eaacbb9eb56763d38a3815fc509b92ed98a585Andrew Sapperstein    CmdArgs.push_back("-fno-signed-char");
971d6eaacbb9eb56763d38a3815fc509b92ed98a585Andrew Sapperstein
972d6eaacbb9eb56763d38a3815fc509b92ed98a585Andrew Sapperstein  // -fms-extensions=0 is default.
973d6eaacbb9eb56763d38a3815fc509b92ed98a585Andrew Sapperstein  if (Args.hasFlag(options::OPT_fms_extensions, options::OPT_fno_ms_extensions,
974d6eaacbb9eb56763d38a3815fc509b92ed98a585Andrew Sapperstein                   getToolChain().getTriple().getOS() == llvm::Triple::Win32))
975d6eaacbb9eb56763d38a3815fc509b92ed98a585Andrew Sapperstein    CmdArgs.push_back("-fms-extensions");
976d6eaacbb9eb56763d38a3815fc509b92ed98a585Andrew Sapperstein
977d6eaacbb9eb56763d38a3815fc509b92ed98a585Andrew Sapperstein  // -fnext-runtime is default.
978d6eaacbb9eb56763d38a3815fc509b92ed98a585Andrew Sapperstein  if (!Args.hasFlag(options::OPT_fnext_runtime, options::OPT_fgnu_runtime,
979d6eaacbb9eb56763d38a3815fc509b92ed98a585Andrew Sapperstein                    getToolChain().getTriple().getOS() == llvm::Triple::Darwin))
980d6eaacbb9eb56763d38a3815fc509b92ed98a585Andrew Sapperstein    CmdArgs.push_back("-fgnu-runtime");
981d6eaacbb9eb56763d38a3815fc509b92ed98a585Andrew Sapperstein
982d6eaacbb9eb56763d38a3815fc509b92ed98a585Andrew Sapperstein  // -fobjc-nonfragile-abi=0 is default.
983d6eaacbb9eb56763d38a3815fc509b92ed98a585Andrew Sapperstein  if (types::isObjC(InputType)) {
984d6eaacbb9eb56763d38a3815fc509b92ed98a585Andrew Sapperstein    if (Args.hasArg(options::OPT_fobjc_nonfragile_abi) ||
985d6eaacbb9eb56763d38a3815fc509b92ed98a585Andrew Sapperstein        getToolChain().IsObjCNonFragileABIDefault())
986d6eaacbb9eb56763d38a3815fc509b92ed98a585Andrew Sapperstein      CmdArgs.push_back("-fobjc-nonfragile-abi");
987d6eaacbb9eb56763d38a3815fc509b92ed98a585Andrew Sapperstein  }
988d6eaacbb9eb56763d38a3815fc509b92ed98a585Andrew Sapperstein
989d6eaacbb9eb56763d38a3815fc509b92ed98a585Andrew Sapperstein  // -fshort-wchar default varies depending on platform; only
9906ba612efffba42bec102ac58a1540496158f747eAndrew Sapperstein  // pass if specified.
9916ba612efffba42bec102ac58a1540496158f747eAndrew Sapperstein  if (Arg *A = Args.getLastArg(options::OPT_fshort_wchar)) {
992d6eaacbb9eb56763d38a3815fc509b92ed98a585Andrew Sapperstein    if (A->getOption().matches(options::OPT_fshort_wchar))
993d6eaacbb9eb56763d38a3815fc509b92ed98a585Andrew Sapperstein      CmdArgs.push_back("-fshort-wchar");
994d6eaacbb9eb56763d38a3815fc509b92ed98a585Andrew Sapperstein  }
995d6eaacbb9eb56763d38a3815fc509b92ed98a585Andrew Sapperstein
996d6eaacbb9eb56763d38a3815fc509b92ed98a585Andrew Sapperstein  // -fno-pascal-strings is default, only pass non-default. If the tool chain
997d6eaacbb9eb56763d38a3815fc509b92ed98a585Andrew Sapperstein  // happened to translate to -mpascal-strings, we want to back translate here.
998d6eaacbb9eb56763d38a3815fc509b92ed98a585Andrew Sapperstein  //
999d6eaacbb9eb56763d38a3815fc509b92ed98a585Andrew Sapperstein  // FIXME: This is gross; that translation should be pulled from the
1000d6eaacbb9eb56763d38a3815fc509b92ed98a585Andrew Sapperstein  // tool chain.
1001d6eaacbb9eb56763d38a3815fc509b92ed98a585Andrew Sapperstein  if (Args.hasFlag(options::OPT_fpascal_strings,
1002d6eaacbb9eb56763d38a3815fc509b92ed98a585Andrew Sapperstein                   options::OPT_fno_pascal_strings,
1003d6eaacbb9eb56763d38a3815fc509b92ed98a585Andrew Sapperstein                   false) ||
1004d6eaacbb9eb56763d38a3815fc509b92ed98a585Andrew Sapperstein      Args.hasFlag(options::OPT_mpascal_strings,
1005d6eaacbb9eb56763d38a3815fc509b92ed98a585Andrew Sapperstein                   options::OPT_mno_pascal_strings,
1006d6eaacbb9eb56763d38a3815fc509b92ed98a585Andrew Sapperstein                   false))
1007d6eaacbb9eb56763d38a3815fc509b92ed98a585Andrew Sapperstein    CmdArgs.push_back("-fpascal-strings");
1008d6eaacbb9eb56763d38a3815fc509b92ed98a585Andrew Sapperstein
1009d6eaacbb9eb56763d38a3815fc509b92ed98a585Andrew Sapperstein  // -fcommon is default, only pass non-default.
1010d6eaacbb9eb56763d38a3815fc509b92ed98a585Andrew Sapperstein  if (!Args.hasFlag(options::OPT_fcommon, options::OPT_fno_common))
10116ba612efffba42bec102ac58a1540496158f747eAndrew Sapperstein    CmdArgs.push_back("-fno-common");
10126ba612efffba42bec102ac58a1540496158f747eAndrew Sapperstein
1013d6eaacbb9eb56763d38a3815fc509b92ed98a585Andrew Sapperstein  // -fsigned-bitfields is default, and clang doesn't yet support
1014d6eaacbb9eb56763d38a3815fc509b92ed98a585Andrew Sapperstein  // --funsigned-bitfields.
10156ba612efffba42bec102ac58a1540496158f747eAndrew Sapperstein  if (!Args.hasFlag(options::OPT_fsigned_bitfields,
1016d6eaacbb9eb56763d38a3815fc509b92ed98a585Andrew Sapperstein                    options::OPT_funsigned_bitfields))
1017d6eaacbb9eb56763d38a3815fc509b92ed98a585Andrew Sapperstein    D.Diag(clang::diag::warn_drv_clang_unsupported)
1018d6eaacbb9eb56763d38a3815fc509b92ed98a585Andrew Sapperstein      << Args.getLastArg(options::OPT_funsigned_bitfields)->getAsString(Args);
1019d6eaacbb9eb56763d38a3815fc509b92ed98a585Andrew Sapperstein
1020d6eaacbb9eb56763d38a3815fc509b92ed98a585Andrew Sapperstein  // -fdiagnostics-fixit-info is default, only pass non-default.
1021d6eaacbb9eb56763d38a3815fc509b92ed98a585Andrew Sapperstein  if (!Args.hasFlag(options::OPT_fdiagnostics_fixit_info,
1022d6eaacbb9eb56763d38a3815fc509b92ed98a585Andrew Sapperstein                    options::OPT_fno_diagnostics_fixit_info))
1023d6eaacbb9eb56763d38a3815fc509b92ed98a585Andrew Sapperstein    CmdArgs.push_back("-fno-diagnostics-fixit-info");
10246ba612efffba42bec102ac58a1540496158f747eAndrew Sapperstein
1025d6eaacbb9eb56763d38a3815fc509b92ed98a585Andrew Sapperstein  // Enable -fdiagnostics-show-option by default.
1026d6eaacbb9eb56763d38a3815fc509b92ed98a585Andrew Sapperstein  if (Args.hasFlag(options::OPT_fdiagnostics_show_option,
1027d6eaacbb9eb56763d38a3815fc509b92ed98a585Andrew Sapperstein                   options::OPT_fno_diagnostics_show_option))
1028d6eaacbb9eb56763d38a3815fc509b92ed98a585Andrew Sapperstein    CmdArgs.push_back("-fdiagnostics-show-option");
1029d6eaacbb9eb56763d38a3815fc509b92ed98a585Andrew Sapperstein
1030d6eaacbb9eb56763d38a3815fc509b92ed98a585Andrew Sapperstein  // Color diagnostics are the default, unless the terminal doesn't support
1031d6eaacbb9eb56763d38a3815fc509b92ed98a585Andrew Sapperstein  // them.
1032d6eaacbb9eb56763d38a3815fc509b92ed98a585Andrew Sapperstein  if (Args.hasFlag(options::OPT_fcolor_diagnostics,
1033d6eaacbb9eb56763d38a3815fc509b92ed98a585Andrew Sapperstein                   options::OPT_fno_color_diagnostics) &&
1034d6eaacbb9eb56763d38a3815fc509b92ed98a585Andrew Sapperstein      llvm::sys::Process::StandardErrHasColors())
1035d6eaacbb9eb56763d38a3815fc509b92ed98a585Andrew Sapperstein    CmdArgs.push_back("-fcolor-diagnostics");
1036d6eaacbb9eb56763d38a3815fc509b92ed98a585Andrew Sapperstein
1037d6eaacbb9eb56763d38a3815fc509b92ed98a585Andrew Sapperstein  if (!Args.hasFlag(options::OPT_fshow_source_location,
1038d6eaacbb9eb56763d38a3815fc509b92ed98a585Andrew Sapperstein                    options::OPT_fno_show_source_location))
1039d6eaacbb9eb56763d38a3815fc509b92ed98a585Andrew Sapperstein    CmdArgs.push_back("-fno-show-source-location");
1040d6eaacbb9eb56763d38a3815fc509b92ed98a585Andrew Sapperstein
1041d6eaacbb9eb56763d38a3815fc509b92ed98a585Andrew Sapperstein  // -fdollars-in-identifiers default varies depending on platform and
1042d6eaacbb9eb56763d38a3815fc509b92ed98a585Andrew Sapperstein  // language; only pass if specified.
1043d6eaacbb9eb56763d38a3815fc509b92ed98a585Andrew Sapperstein  if (Arg *A = Args.getLastArg(options::OPT_fdollars_in_identifiers,
1044d6eaacbb9eb56763d38a3815fc509b92ed98a585Andrew Sapperstein                               options::OPT_fno_dollars_in_identifiers)) {
1045d6eaacbb9eb56763d38a3815fc509b92ed98a585Andrew Sapperstein    if (A->getOption().matches(options::OPT_fdollars_in_identifiers))
1046d6eaacbb9eb56763d38a3815fc509b92ed98a585Andrew Sapperstein      CmdArgs.push_back("-fdollars-in-identifiers");
1047d6eaacbb9eb56763d38a3815fc509b92ed98a585Andrew Sapperstein    else
1048d6eaacbb9eb56763d38a3815fc509b92ed98a585Andrew Sapperstein      CmdArgs.push_back("-fno-dollars-in-identifiers");
10496ba612efffba42bec102ac58a1540496158f747eAndrew Sapperstein  }
10506ba612efffba42bec102ac58a1540496158f747eAndrew Sapperstein
10516ba612efffba42bec102ac58a1540496158f747eAndrew Sapperstein  // -funit-at-a-time is default, and we don't support -fno-unit-at-a-time for
10526ba612efffba42bec102ac58a1540496158f747eAndrew Sapperstein  // practical purposes.
10536ba612efffba42bec102ac58a1540496158f747eAndrew Sapperstein  if (Arg *A = Args.getLastArg(options::OPT_funit_at_a_time,
1054d6eaacbb9eb56763d38a3815fc509b92ed98a585Andrew Sapperstein                               options::OPT_fno_unit_at_a_time)) {
1055d6eaacbb9eb56763d38a3815fc509b92ed98a585Andrew Sapperstein    if (A->getOption().matches(options::OPT_fno_unit_at_a_time))
10566ba612efffba42bec102ac58a1540496158f747eAndrew Sapperstein      D.Diag(clang::diag::warn_drv_clang_unsupported) << A->getAsString(Args);
10576ba612efffba42bec102ac58a1540496158f747eAndrew Sapperstein  }
1058d6eaacbb9eb56763d38a3815fc509b92ed98a585Andrew Sapperstein
1059d6eaacbb9eb56763d38a3815fc509b92ed98a585Andrew Sapperstein  // Default to -fno-builtin-str{cat,cpy} on Darwin for ARM.
1060d6eaacbb9eb56763d38a3815fc509b92ed98a585Andrew Sapperstein  //
10616ba612efffba42bec102ac58a1540496158f747eAndrew Sapperstein  // FIXME: This is disabled until clang -cc1 supports -fno-builtin-foo. PR4941.
10626ba612efffba42bec102ac58a1540496158f747eAndrew Sapperstein#if 0
10636ba612efffba42bec102ac58a1540496158f747eAndrew Sapperstein  if (getToolChain().getTriple().getOS() == llvm::Triple::Darwin &&
10646ba612efffba42bec102ac58a1540496158f747eAndrew Sapperstein      (getToolChain().getTriple().getArch() == llvm::Triple::arm ||
10656ba612efffba42bec102ac58a1540496158f747eAndrew Sapperstein       getToolChain().getTriple().getArch() == llvm::Triple::thumb)) {
10666ba612efffba42bec102ac58a1540496158f747eAndrew Sapperstein    if (!Args.hasArg(options::OPT_fbuiltin_strcat))
10676ba612efffba42bec102ac58a1540496158f747eAndrew Sapperstein      CmdArgs.push_back("-fno-builtin-strcat");
10686ba612efffba42bec102ac58a1540496158f747eAndrew Sapperstein    if (!Args.hasArg(options::OPT_fbuiltin_strcpy))
10696ba612efffba42bec102ac58a1540496158f747eAndrew Sapperstein      CmdArgs.push_back("-fno-builtin-strcpy");
10706ba612efffba42bec102ac58a1540496158f747eAndrew Sapperstein  }
10716ba612efffba42bec102ac58a1540496158f747eAndrew Sapperstein#endif
10726ba612efffba42bec102ac58a1540496158f747eAndrew Sapperstein
10736ba612efffba42bec102ac58a1540496158f747eAndrew Sapperstein  if (Arg *A = Args.getLastArg(options::OPT_traditional,
10746ba612efffba42bec102ac58a1540496158f747eAndrew Sapperstein                               options::OPT_traditional_cpp))
1075d6eaacbb9eb56763d38a3815fc509b92ed98a585Andrew Sapperstein    D.Diag(clang::diag::err_drv_clang_unsupported) << A->getAsString(Args);
1076d6eaacbb9eb56763d38a3815fc509b92ed98a585Andrew Sapperstein
1077d6eaacbb9eb56763d38a3815fc509b92ed98a585Andrew Sapperstein  Args.AddLastArg(CmdArgs, options::OPT_dM);
1078d6eaacbb9eb56763d38a3815fc509b92ed98a585Andrew Sapperstein  Args.AddLastArg(CmdArgs, options::OPT_dD);
1079d6eaacbb9eb56763d38a3815fc509b92ed98a585Andrew Sapperstein
1080d6eaacbb9eb56763d38a3815fc509b92ed98a585Andrew Sapperstein  Args.AddAllArgValues(CmdArgs, options::OPT_Xclang);
1081d6eaacbb9eb56763d38a3815fc509b92ed98a585Andrew Sapperstein  Args.AddAllArgValues(CmdArgs, options::OPT_mllvm);
1082d6eaacbb9eb56763d38a3815fc509b92ed98a585Andrew Sapperstein
1083d6eaacbb9eb56763d38a3815fc509b92ed98a585Andrew Sapperstein  if (Output.getType() == types::TY_Dependencies) {
1084d6eaacbb9eb56763d38a3815fc509b92ed98a585Andrew Sapperstein    // Handled with other dependency code.
1085d6eaacbb9eb56763d38a3815fc509b92ed98a585Andrew Sapperstein  } else if (Output.isPipe()) {
1086d6eaacbb9eb56763d38a3815fc509b92ed98a585Andrew Sapperstein    CmdArgs.push_back("-o");
10876ba612efffba42bec102ac58a1540496158f747eAndrew Sapperstein    CmdArgs.push_back("-");
1088d6eaacbb9eb56763d38a3815fc509b92ed98a585Andrew Sapperstein  } else if (Output.isFilename()) {
1089d6eaacbb9eb56763d38a3815fc509b92ed98a585Andrew Sapperstein    CmdArgs.push_back("-o");
1090d6eaacbb9eb56763d38a3815fc509b92ed98a585Andrew Sapperstein    CmdArgs.push_back(Output.getFilename());
1091d6eaacbb9eb56763d38a3815fc509b92ed98a585Andrew Sapperstein  } else {
1092d6eaacbb9eb56763d38a3815fc509b92ed98a585Andrew Sapperstein    assert(Output.isNothing() && "Invalid output.");
1093d6eaacbb9eb56763d38a3815fc509b92ed98a585Andrew Sapperstein  }
10946ba612efffba42bec102ac58a1540496158f747eAndrew Sapperstein
1095d6eaacbb9eb56763d38a3815fc509b92ed98a585Andrew Sapperstein  for (InputInfoList::const_iterator
1096d6eaacbb9eb56763d38a3815fc509b92ed98a585Andrew Sapperstein         it = Inputs.begin(), ie = Inputs.end(); it != ie; ++it) {
1097d6eaacbb9eb56763d38a3815fc509b92ed98a585Andrew Sapperstein    const InputInfo &II = *it;
1098d6eaacbb9eb56763d38a3815fc509b92ed98a585Andrew Sapperstein    CmdArgs.push_back("-x");
1099d6eaacbb9eb56763d38a3815fc509b92ed98a585Andrew Sapperstein    CmdArgs.push_back(types::getTypeName(II.getType()));
1100d6eaacbb9eb56763d38a3815fc509b92ed98a585Andrew Sapperstein    if (II.isPipe())
1101d6eaacbb9eb56763d38a3815fc509b92ed98a585Andrew Sapperstein      CmdArgs.push_back("-");
1102d6eaacbb9eb56763d38a3815fc509b92ed98a585Andrew Sapperstein    else if (II.isFilename())
1103d6eaacbb9eb56763d38a3815fc509b92ed98a585Andrew Sapperstein      CmdArgs.push_back(II.getFilename());
1104d6eaacbb9eb56763d38a3815fc509b92ed98a585Andrew Sapperstein    else
1105d6eaacbb9eb56763d38a3815fc509b92ed98a585Andrew Sapperstein      II.getInputArg().renderAsInput(Args, CmdArgs);
1106d6eaacbb9eb56763d38a3815fc509b92ed98a585Andrew Sapperstein  }
1107d6eaacbb9eb56763d38a3815fc509b92ed98a585Andrew Sapperstein
11086ba612efffba42bec102ac58a1540496158f747eAndrew Sapperstein  Args.AddAllArgs(CmdArgs, options::OPT_undef);
11096ba612efffba42bec102ac58a1540496158f747eAndrew Sapperstein
11106ba612efffba42bec102ac58a1540496158f747eAndrew Sapperstein  const char *Exec =
11116ba612efffba42bec102ac58a1540496158f747eAndrew Sapperstein    Args.MakeArgString(getToolChain().GetProgramPath(C, "clang"));
11126ba612efffba42bec102ac58a1540496158f747eAndrew Sapperstein
11136ba612efffba42bec102ac58a1540496158f747eAndrew Sapperstein  // Optionally embed the -cc1 level arguments into the debug info, for build
11146ba612efffba42bec102ac58a1540496158f747eAndrew Sapperstein  // analysis.
1115d6eaacbb9eb56763d38a3815fc509b92ed98a585Andrew Sapperstein  if (getToolChain().UseDwarfDebugFlags()) {
1116d6eaacbb9eb56763d38a3815fc509b92ed98a585Andrew Sapperstein    llvm::SmallString<256> Flags;
1117d6eaacbb9eb56763d38a3815fc509b92ed98a585Andrew Sapperstein    Flags += Exec;
1118d6eaacbb9eb56763d38a3815fc509b92ed98a585Andrew Sapperstein    for (unsigned i = 0, e = CmdArgs.size(); i != e; ++i) {
1119d6eaacbb9eb56763d38a3815fc509b92ed98a585Andrew Sapperstein      Flags += " ";
1120d6eaacbb9eb56763d38a3815fc509b92ed98a585Andrew Sapperstein      Flags += CmdArgs[i];
1121d6eaacbb9eb56763d38a3815fc509b92ed98a585Andrew Sapperstein    }
11226ba612efffba42bec102ac58a1540496158f747eAndrew Sapperstein    CmdArgs.push_back("-dwarf-debug-flags");
11236ba612efffba42bec102ac58a1540496158f747eAndrew Sapperstein    CmdArgs.push_back(Args.MakeArgString(Flags.str()));
11246ba612efffba42bec102ac58a1540496158f747eAndrew Sapperstein  }
1125d6eaacbb9eb56763d38a3815fc509b92ed98a585Andrew Sapperstein
1126d6eaacbb9eb56763d38a3815fc509b92ed98a585Andrew Sapperstein  Dest.addCommand(new Command(JA, *this, Exec, CmdArgs));
1127d6eaacbb9eb56763d38a3815fc509b92ed98a585Andrew Sapperstein
1128d6eaacbb9eb56763d38a3815fc509b92ed98a585Andrew Sapperstein  // Explicitly warn that these options are unsupported, even though
1129d6eaacbb9eb56763d38a3815fc509b92ed98a585Andrew Sapperstein  // we are allowing compilation to continue.
1130d6eaacbb9eb56763d38a3815fc509b92ed98a585Andrew Sapperstein  for (arg_iterator it = Args.filtered_begin(options::OPT_pg),
1131d6eaacbb9eb56763d38a3815fc509b92ed98a585Andrew Sapperstein         ie = Args.filtered_end(); it != ie; ++it) {
1132d6eaacbb9eb56763d38a3815fc509b92ed98a585Andrew Sapperstein    it->claim();
1133d6eaacbb9eb56763d38a3815fc509b92ed98a585Andrew Sapperstein    D.Diag(clang::diag::warn_drv_clang_unsupported) << it->getAsString(Args);
1134d6eaacbb9eb56763d38a3815fc509b92ed98a585Andrew Sapperstein  }
1135d6eaacbb9eb56763d38a3815fc509b92ed98a585Andrew Sapperstein
1136d6eaacbb9eb56763d38a3815fc509b92ed98a585Andrew Sapperstein  // Claim some arguments which clang supports automatically.
1137d6eaacbb9eb56763d38a3815fc509b92ed98a585Andrew Sapperstein
11386ba612efffba42bec102ac58a1540496158f747eAndrew Sapperstein  // -fpch-preprocess is used with gcc to add a special marker in the
11396ba612efffba42bec102ac58a1540496158f747eAndrew Sapperstein  // -output to include the PCH file. Clang's PTH solution is
1140d6eaacbb9eb56763d38a3815fc509b92ed98a585Andrew Sapperstein  // -completely transparent, so we do not need to deal with it at
1141d6eaacbb9eb56763d38a3815fc509b92ed98a585Andrew Sapperstein  // -all.
11426ba612efffba42bec102ac58a1540496158f747eAndrew Sapperstein  Args.ClaimAllArgs(options::OPT_fpch_preprocess);
1143d6eaacbb9eb56763d38a3815fc509b92ed98a585Andrew Sapperstein
1144d6eaacbb9eb56763d38a3815fc509b92ed98a585Andrew Sapperstein  // Claim some arguments which clang doesn't support, but we don't
11456ba612efffba42bec102ac58a1540496158f747eAndrew Sapperstein  // care to warn the user about.
1146d6eaacbb9eb56763d38a3815fc509b92ed98a585Andrew Sapperstein  Args.ClaimAllArgs(options::OPT_clang_ignored_f_Group);
1147d6eaacbb9eb56763d38a3815fc509b92ed98a585Andrew Sapperstein  Args.ClaimAllArgs(options::OPT_clang_ignored_m_Group);
1148d6eaacbb9eb56763d38a3815fc509b92ed98a585Andrew Sapperstein}
11496ba612efffba42bec102ac58a1540496158f747eAndrew Sapperstein
11506ba612efffba42bec102ac58a1540496158f747eAndrew Sappersteinvoid gcc::Common::ConstructJob(Compilation &C, const JobAction &JA,
11516ba612efffba42bec102ac58a1540496158f747eAndrew Sapperstein                               Job &Dest,
11526ba612efffba42bec102ac58a1540496158f747eAndrew Sapperstein                               const InputInfo &Output,
11536ba612efffba42bec102ac58a1540496158f747eAndrew Sapperstein                               const InputInfoList &Inputs,
11546ba612efffba42bec102ac58a1540496158f747eAndrew Sapperstein                               const ArgList &Args,
11556ba612efffba42bec102ac58a1540496158f747eAndrew Sapperstein                               const char *LinkingOutput) const {
11566ba612efffba42bec102ac58a1540496158f747eAndrew Sapperstein  const Driver &D = getToolChain().getHost().getDriver();
11576ba612efffba42bec102ac58a1540496158f747eAndrew Sapperstein  ArgStringList CmdArgs;
11586ba612efffba42bec102ac58a1540496158f747eAndrew Sapperstein
1159d6eaacbb9eb56763d38a3815fc509b92ed98a585Andrew Sapperstein  for (ArgList::const_iterator
1160d6eaacbb9eb56763d38a3815fc509b92ed98a585Andrew Sapperstein         it = Args.begin(), ie = Args.end(); it != ie; ++it) {
1161d6eaacbb9eb56763d38a3815fc509b92ed98a585Andrew Sapperstein    Arg *A = *it;
1162d6eaacbb9eb56763d38a3815fc509b92ed98a585Andrew Sapperstein    if (A->getOption().hasForwardToGCC()) {
1163d6eaacbb9eb56763d38a3815fc509b92ed98a585Andrew Sapperstein      // It is unfortunate that we have to claim here, as this means
1164d6eaacbb9eb56763d38a3815fc509b92ed98a585Andrew Sapperstein      // we will basically never report anything interesting for
1165d6eaacbb9eb56763d38a3815fc509b92ed98a585Andrew Sapperstein      // platforms using a generic gcc, even if we are just using gcc
1166d6eaacbb9eb56763d38a3815fc509b92ed98a585Andrew Sapperstein      // to get to the assembler.
11676ba612efffba42bec102ac58a1540496158f747eAndrew Sapperstein      A->claim();
1168d6eaacbb9eb56763d38a3815fc509b92ed98a585Andrew Sapperstein      A->render(Args, CmdArgs);
1169d6eaacbb9eb56763d38a3815fc509b92ed98a585Andrew Sapperstein    }
1170d6eaacbb9eb56763d38a3815fc509b92ed98a585Andrew Sapperstein  }
1171d6eaacbb9eb56763d38a3815fc509b92ed98a585Andrew Sapperstein
1172d6eaacbb9eb56763d38a3815fc509b92ed98a585Andrew Sapperstein  RenderExtraToolArgs(CmdArgs);
1173d6eaacbb9eb56763d38a3815fc509b92ed98a585Andrew Sapperstein
11746ba612efffba42bec102ac58a1540496158f747eAndrew Sapperstein  // If using a driver driver, force the arch.
1175d6eaacbb9eb56763d38a3815fc509b92ed98a585Andrew Sapperstein  const std::string &Arch = getToolChain().getArchName();
1176d6eaacbb9eb56763d38a3815fc509b92ed98a585Andrew Sapperstein  if (getToolChain().getHost().useDriverDriver()) {
1177d6eaacbb9eb56763d38a3815fc509b92ed98a585Andrew Sapperstein    CmdArgs.push_back("-arch");
1178d6eaacbb9eb56763d38a3815fc509b92ed98a585Andrew Sapperstein
1179d6eaacbb9eb56763d38a3815fc509b92ed98a585Andrew Sapperstein    // FIXME: Remove these special cases.
1180d6eaacbb9eb56763d38a3815fc509b92ed98a585Andrew Sapperstein    if (Arch == "powerpc")
1181d6eaacbb9eb56763d38a3815fc509b92ed98a585Andrew Sapperstein      CmdArgs.push_back("ppc");
1182d6eaacbb9eb56763d38a3815fc509b92ed98a585Andrew Sapperstein    else if (Arch == "powerpc64")
1183d6eaacbb9eb56763d38a3815fc509b92ed98a585Andrew Sapperstein      CmdArgs.push_back("ppc64");
1184d6eaacbb9eb56763d38a3815fc509b92ed98a585Andrew Sapperstein    else
1185d6eaacbb9eb56763d38a3815fc509b92ed98a585Andrew Sapperstein      CmdArgs.push_back(Args.MakeArgString(Arch));
1186d6eaacbb9eb56763d38a3815fc509b92ed98a585Andrew Sapperstein  }
1187d6eaacbb9eb56763d38a3815fc509b92ed98a585Andrew Sapperstein
11886ba612efffba42bec102ac58a1540496158f747eAndrew Sapperstein  // Try to force gcc to match the tool chain we want, if we recognize
11896ba612efffba42bec102ac58a1540496158f747eAndrew Sapperstein  // the arch.
11906ba612efffba42bec102ac58a1540496158f747eAndrew Sapperstein  //
11916ba612efffba42bec102ac58a1540496158f747eAndrew Sapperstein  // FIXME: The triple class should directly provide the information we want
11926ba612efffba42bec102ac58a1540496158f747eAndrew Sapperstein  // here.
11936ba612efffba42bec102ac58a1540496158f747eAndrew Sapperstein  if (Arch == "i386" || Arch == "powerpc")
11946ba612efffba42bec102ac58a1540496158f747eAndrew Sapperstein    CmdArgs.push_back("-m32");
1195d6eaacbb9eb56763d38a3815fc509b92ed98a585Andrew Sapperstein  else if (Arch == "x86_64" || Arch == "powerpc64")
1196d6eaacbb9eb56763d38a3815fc509b92ed98a585Andrew Sapperstein    CmdArgs.push_back("-m64");
1197d6eaacbb9eb56763d38a3815fc509b92ed98a585Andrew Sapperstein
1198d6eaacbb9eb56763d38a3815fc509b92ed98a585Andrew Sapperstein  if (Output.isPipe()) {
1199d6eaacbb9eb56763d38a3815fc509b92ed98a585Andrew Sapperstein    CmdArgs.push_back("-o");
1200d6eaacbb9eb56763d38a3815fc509b92ed98a585Andrew Sapperstein    CmdArgs.push_back("-");
1201d6eaacbb9eb56763d38a3815fc509b92ed98a585Andrew Sapperstein  } else if (Output.isFilename()) {
1202d6eaacbb9eb56763d38a3815fc509b92ed98a585Andrew Sapperstein    CmdArgs.push_back("-o");
1203d6eaacbb9eb56763d38a3815fc509b92ed98a585Andrew Sapperstein    CmdArgs.push_back(Output.getFilename());
1204d6eaacbb9eb56763d38a3815fc509b92ed98a585Andrew Sapperstein  } else {
1205d6eaacbb9eb56763d38a3815fc509b92ed98a585Andrew Sapperstein    assert(Output.isNothing() && "Unexpected output");
1206d6eaacbb9eb56763d38a3815fc509b92ed98a585Andrew Sapperstein    CmdArgs.push_back("-fsyntax-only");
1207d6eaacbb9eb56763d38a3815fc509b92ed98a585Andrew Sapperstein  }
1208d6eaacbb9eb56763d38a3815fc509b92ed98a585Andrew Sapperstein
1209d6eaacbb9eb56763d38a3815fc509b92ed98a585Andrew Sapperstein
1210d6eaacbb9eb56763d38a3815fc509b92ed98a585Andrew Sapperstein  // Only pass -x if gcc will understand it; otherwise hope gcc
1211d6eaacbb9eb56763d38a3815fc509b92ed98a585Andrew Sapperstein  // understands the suffix correctly. The main use case this would go
1212d6eaacbb9eb56763d38a3815fc509b92ed98a585Andrew Sapperstein  // wrong in is for linker inputs if they happened to have an odd
12136ba612efffba42bec102ac58a1540496158f747eAndrew Sapperstein  // suffix; really the only way to get this to happen is a command
12146ba612efffba42bec102ac58a1540496158f747eAndrew Sapperstein  // like '-x foobar a.c' which will treat a.c like a linker input.
12156ba612efffba42bec102ac58a1540496158f747eAndrew Sapperstein  //
12166ba612efffba42bec102ac58a1540496158f747eAndrew Sapperstein  // FIXME: For the linker case specifically, can we safely convert
12176ba612efffba42bec102ac58a1540496158f747eAndrew Sapperstein  // inputs into '-Wl,' options?
12186ba612efffba42bec102ac58a1540496158f747eAndrew Sapperstein  for (InputInfoList::const_iterator
12196ba612efffba42bec102ac58a1540496158f747eAndrew Sapperstein         it = Inputs.begin(), ie = Inputs.end(); it != ie; ++it) {
12206ba612efffba42bec102ac58a1540496158f747eAndrew Sapperstein    const InputInfo &II = *it;
12216ba612efffba42bec102ac58a1540496158f747eAndrew Sapperstein
12226ba612efffba42bec102ac58a1540496158f747eAndrew Sapperstein    // Don't try to pass LLVM or AST inputs to a generic gcc.
12236ba612efffba42bec102ac58a1540496158f747eAndrew Sapperstein    if (II.getType() == types::TY_LLVMBC)
12246ba612efffba42bec102ac58a1540496158f747eAndrew Sapperstein      D.Diag(clang::diag::err_drv_no_linker_llvm_support)
12256ba612efffba42bec102ac58a1540496158f747eAndrew Sapperstein        << getToolChain().getTripleString();
12266ba612efffba42bec102ac58a1540496158f747eAndrew Sapperstein    else if (II.getType() == types::TY_AST)
12276ba612efffba42bec102ac58a1540496158f747eAndrew Sapperstein      D.Diag(clang::diag::err_drv_no_ast_support)
12286ba612efffba42bec102ac58a1540496158f747eAndrew Sapperstein        << getToolChain().getTripleString();
12296ba612efffba42bec102ac58a1540496158f747eAndrew Sapperstein
12306ba612efffba42bec102ac58a1540496158f747eAndrew Sapperstein    if (types::canTypeBeUserSpecified(II.getType())) {
12316ba612efffba42bec102ac58a1540496158f747eAndrew Sapperstein      CmdArgs.push_back("-x");
12326ba612efffba42bec102ac58a1540496158f747eAndrew Sapperstein      CmdArgs.push_back(types::getTypeName(II.getType()));
12336ba612efffba42bec102ac58a1540496158f747eAndrew Sapperstein    }
12346ba612efffba42bec102ac58a1540496158f747eAndrew Sapperstein
12356ba612efffba42bec102ac58a1540496158f747eAndrew Sapperstein    if (II.isPipe())
12366ba612efffba42bec102ac58a1540496158f747eAndrew Sapperstein      CmdArgs.push_back("-");
12376ba612efffba42bec102ac58a1540496158f747eAndrew Sapperstein    else if (II.isFilename())
12386ba612efffba42bec102ac58a1540496158f747eAndrew Sapperstein      CmdArgs.push_back(II.getFilename());
12396ba612efffba42bec102ac58a1540496158f747eAndrew Sapperstein    else
12406ba612efffba42bec102ac58a1540496158f747eAndrew Sapperstein      // Don't render as input, we need gcc to do the translations.
12416ba612efffba42bec102ac58a1540496158f747eAndrew Sapperstein      II.getInputArg().render(Args, CmdArgs);
12426ba612efffba42bec102ac58a1540496158f747eAndrew Sapperstein  }
12436ba612efffba42bec102ac58a1540496158f747eAndrew Sapperstein
12446ba612efffba42bec102ac58a1540496158f747eAndrew Sapperstein  const char *GCCName =
12456ba612efffba42bec102ac58a1540496158f747eAndrew Sapperstein    getToolChain().getHost().getDriver().CCCGenericGCCName.c_str();
12466ba612efffba42bec102ac58a1540496158f747eAndrew Sapperstein  const char *Exec =
12476ba612efffba42bec102ac58a1540496158f747eAndrew Sapperstein    Args.MakeArgString(getToolChain().GetProgramPath(C, GCCName));
12486ba612efffba42bec102ac58a1540496158f747eAndrew Sapperstein  Dest.addCommand(new Command(JA, *this, Exec, CmdArgs));
12496ba612efffba42bec102ac58a1540496158f747eAndrew Sapperstein}
12506ba612efffba42bec102ac58a1540496158f747eAndrew Sapperstein
12516ba612efffba42bec102ac58a1540496158f747eAndrew Sappersteinvoid gcc::Preprocess::RenderExtraToolArgs(ArgStringList &CmdArgs) const {
12526ba612efffba42bec102ac58a1540496158f747eAndrew Sapperstein  CmdArgs.push_back("-E");
12536ba612efffba42bec102ac58a1540496158f747eAndrew Sapperstein}
12546ba612efffba42bec102ac58a1540496158f747eAndrew Sapperstein
12556ba612efffba42bec102ac58a1540496158f747eAndrew Sappersteinvoid gcc::Precompile::RenderExtraToolArgs(ArgStringList &CmdArgs) const {
12566ba612efffba42bec102ac58a1540496158f747eAndrew Sapperstein  // The type is good enough.
12576ba612efffba42bec102ac58a1540496158f747eAndrew Sapperstein}
1258d6eaacbb9eb56763d38a3815fc509b92ed98a585Andrew Sapperstein
1259d6eaacbb9eb56763d38a3815fc509b92ed98a585Andrew Sappersteinvoid gcc::Compile::RenderExtraToolArgs(ArgStringList &CmdArgs) const {
1260d6eaacbb9eb56763d38a3815fc509b92ed98a585Andrew Sapperstein  CmdArgs.push_back("-S");
12616ba612efffba42bec102ac58a1540496158f747eAndrew Sapperstein}
12626ba612efffba42bec102ac58a1540496158f747eAndrew Sapperstein
1263d6eaacbb9eb56763d38a3815fc509b92ed98a585Andrew Sappersteinvoid gcc::Assemble::RenderExtraToolArgs(ArgStringList &CmdArgs) const {
1264d6eaacbb9eb56763d38a3815fc509b92ed98a585Andrew Sapperstein  CmdArgs.push_back("-c");
12656ba612efffba42bec102ac58a1540496158f747eAndrew Sapperstein}
1266d6eaacbb9eb56763d38a3815fc509b92ed98a585Andrew Sapperstein
1267d6eaacbb9eb56763d38a3815fc509b92ed98a585Andrew Sappersteinvoid gcc::Link::RenderExtraToolArgs(ArgStringList &CmdArgs) const {
1268d6eaacbb9eb56763d38a3815fc509b92ed98a585Andrew Sapperstein  // The types are (hopefully) good enough.
1269d6eaacbb9eb56763d38a3815fc509b92ed98a585Andrew Sapperstein}
12706ba612efffba42bec102ac58a1540496158f747eAndrew Sapperstein
1271d6eaacbb9eb56763d38a3815fc509b92ed98a585Andrew Sappersteinconst char *darwin::CC1::getCC1Name(types::ID Type) const {
1272d6eaacbb9eb56763d38a3815fc509b92ed98a585Andrew Sapperstein  switch (Type) {
1273d6eaacbb9eb56763d38a3815fc509b92ed98a585Andrew Sapperstein  default:
1274d6eaacbb9eb56763d38a3815fc509b92ed98a585Andrew Sapperstein    assert(0 && "Unexpected type for Darwin CC1 tool.");
1275d6eaacbb9eb56763d38a3815fc509b92ed98a585Andrew Sapperstein  case types::TY_Asm:
1276d6eaacbb9eb56763d38a3815fc509b92ed98a585Andrew Sapperstein  case types::TY_C: case types::TY_CHeader:
12776ba612efffba42bec102ac58a1540496158f747eAndrew Sapperstein  case types::TY_PP_C: case types::TY_PP_CHeader:
1278d6eaacbb9eb56763d38a3815fc509b92ed98a585Andrew Sapperstein    return "cc1";
1279d6eaacbb9eb56763d38a3815fc509b92ed98a585Andrew Sapperstein  case types::TY_ObjC: case types::TY_ObjCHeader:
1280d6eaacbb9eb56763d38a3815fc509b92ed98a585Andrew Sapperstein  case types::TY_PP_ObjC: case types::TY_PP_ObjCHeader:
1281d6eaacbb9eb56763d38a3815fc509b92ed98a585Andrew Sapperstein    return "cc1obj";
1282d6eaacbb9eb56763d38a3815fc509b92ed98a585Andrew Sapperstein  case types::TY_CXX: case types::TY_CXXHeader:
1283d6eaacbb9eb56763d38a3815fc509b92ed98a585Andrew Sapperstein  case types::TY_PP_CXX: case types::TY_PP_CXXHeader:
12846ba612efffba42bec102ac58a1540496158f747eAndrew Sapperstein    return "cc1plus";
1285d6eaacbb9eb56763d38a3815fc509b92ed98a585Andrew Sapperstein  case types::TY_ObjCXX: case types::TY_ObjCXXHeader:
1286d6eaacbb9eb56763d38a3815fc509b92ed98a585Andrew Sapperstein  case types::TY_PP_ObjCXX: case types::TY_PP_ObjCXXHeader:
1287d6eaacbb9eb56763d38a3815fc509b92ed98a585Andrew Sapperstein    return "cc1objplus";
1288d6eaacbb9eb56763d38a3815fc509b92ed98a585Andrew Sapperstein  }
1289d6eaacbb9eb56763d38a3815fc509b92ed98a585Andrew Sapperstein}
1290d6eaacbb9eb56763d38a3815fc509b92ed98a585Andrew Sapperstein
12916ba612efffba42bec102ac58a1540496158f747eAndrew Sappersteinconst char *darwin::CC1::getBaseInputName(const ArgList &Args,
1292d6eaacbb9eb56763d38a3815fc509b92ed98a585Andrew Sapperstein                                          const InputInfoList &Inputs) {
1293d6eaacbb9eb56763d38a3815fc509b92ed98a585Andrew Sapperstein  llvm::sys::Path P(Inputs[0].getBaseInput());
1294d6eaacbb9eb56763d38a3815fc509b92ed98a585Andrew Sapperstein  return Args.MakeArgString(P.getLast());
1295d6eaacbb9eb56763d38a3815fc509b92ed98a585Andrew Sapperstein}
1296d6eaacbb9eb56763d38a3815fc509b92ed98a585Andrew Sapperstein
1297d6eaacbb9eb56763d38a3815fc509b92ed98a585Andrew Sappersteinconst char *darwin::CC1::getBaseInputStem(const ArgList &Args,
12986ba612efffba42bec102ac58a1540496158f747eAndrew Sapperstein                                          const InputInfoList &Inputs) {
1299d6eaacbb9eb56763d38a3815fc509b92ed98a585Andrew Sapperstein  const char *Str = getBaseInputName(Args, Inputs);
1300d6eaacbb9eb56763d38a3815fc509b92ed98a585Andrew Sapperstein
1301d6eaacbb9eb56763d38a3815fc509b92ed98a585Andrew Sapperstein  if (const char *End = strchr(Str, '.'))
1302d6eaacbb9eb56763d38a3815fc509b92ed98a585Andrew Sapperstein    return Args.MakeArgString(std::string(Str, End));
1303d6eaacbb9eb56763d38a3815fc509b92ed98a585Andrew Sapperstein
1304d6eaacbb9eb56763d38a3815fc509b92ed98a585Andrew Sapperstein  return Str;
13056ba612efffba42bec102ac58a1540496158f747eAndrew Sapperstein}
1306d6eaacbb9eb56763d38a3815fc509b92ed98a585Andrew Sapperstein
1307d6eaacbb9eb56763d38a3815fc509b92ed98a585Andrew Sappersteinconst char *
1308d6eaacbb9eb56763d38a3815fc509b92ed98a585Andrew Sappersteindarwin::CC1::getDependencyFileName(const ArgList &Args,
1309d6eaacbb9eb56763d38a3815fc509b92ed98a585Andrew Sapperstein                                   const InputInfoList &Inputs) {
1310d6eaacbb9eb56763d38a3815fc509b92ed98a585Andrew Sapperstein  // FIXME: Think about this more.
1311d6eaacbb9eb56763d38a3815fc509b92ed98a585Andrew Sapperstein  std::string Res;
13126ba612efffba42bec102ac58a1540496158f747eAndrew Sapperstein
1313d6eaacbb9eb56763d38a3815fc509b92ed98a585Andrew Sapperstein  if (Arg *OutputOpt = Args.getLastArg(options::OPT_o)) {
1314d6eaacbb9eb56763d38a3815fc509b92ed98a585Andrew Sapperstein    std::string Str(OutputOpt->getValue(Args));
1315d6eaacbb9eb56763d38a3815fc509b92ed98a585Andrew Sapperstein
1316d6eaacbb9eb56763d38a3815fc509b92ed98a585Andrew Sapperstein    Res = Str.substr(0, Str.rfind('.'));
1317d6eaacbb9eb56763d38a3815fc509b92ed98a585Andrew Sapperstein  } else
1318d6eaacbb9eb56763d38a3815fc509b92ed98a585Andrew Sapperstein    Res = darwin::CC1::getBaseInputStem(Args, Inputs);
13196ba612efffba42bec102ac58a1540496158f747eAndrew Sapperstein
1320d6eaacbb9eb56763d38a3815fc509b92ed98a585Andrew Sapperstein  return Args.MakeArgString(Res + ".d");
1321d6eaacbb9eb56763d38a3815fc509b92ed98a585Andrew Sapperstein}
1322d6eaacbb9eb56763d38a3815fc509b92ed98a585Andrew Sapperstein
1323d6eaacbb9eb56763d38a3815fc509b92ed98a585Andrew Sappersteinvoid darwin::CC1::AddCC1Args(const ArgList &Args,
1324d6eaacbb9eb56763d38a3815fc509b92ed98a585Andrew Sapperstein                             ArgStringList &CmdArgs) const {
1325d6eaacbb9eb56763d38a3815fc509b92ed98a585Andrew Sapperstein  const Driver &D = getToolChain().getHost().getDriver();
13266ba612efffba42bec102ac58a1540496158f747eAndrew Sapperstein
1327d6eaacbb9eb56763d38a3815fc509b92ed98a585Andrew Sapperstein  CheckCodeGenerationOptions(D, Args);
13286ba612efffba42bec102ac58a1540496158f747eAndrew Sapperstein
13296ba612efffba42bec102ac58a1540496158f747eAndrew Sapperstein  // Derived from cc1 spec.
1330d6eaacbb9eb56763d38a3815fc509b92ed98a585Andrew Sapperstein  if (!Args.hasArg(options::OPT_mkernel) && !Args.hasArg(options::OPT_static) &&
1331d6eaacbb9eb56763d38a3815fc509b92ed98a585Andrew Sapperstein      !Args.hasArg(options::OPT_mdynamic_no_pic))
1332d6eaacbb9eb56763d38a3815fc509b92ed98a585Andrew Sapperstein    CmdArgs.push_back("-fPIC");
1333d6eaacbb9eb56763d38a3815fc509b92ed98a585Andrew Sapperstein
1334d6eaacbb9eb56763d38a3815fc509b92ed98a585Andrew Sapperstein  if (getToolChain().getTriple().getArch() == llvm::Triple::arm ||
13356ba612efffba42bec102ac58a1540496158f747eAndrew Sapperstein      getToolChain().getTriple().getArch() == llvm::Triple::thumb) {
13366ba612efffba42bec102ac58a1540496158f747eAndrew Sapperstein    if (!Args.hasArg(options::OPT_fbuiltin_strcat))
1337d6eaacbb9eb56763d38a3815fc509b92ed98a585Andrew Sapperstein      CmdArgs.push_back("-fno-builtin-strcat");
1338d6eaacbb9eb56763d38a3815fc509b92ed98a585Andrew Sapperstein    if (!Args.hasArg(options::OPT_fbuiltin_strcpy))
1339d6eaacbb9eb56763d38a3815fc509b92ed98a585Andrew Sapperstein      CmdArgs.push_back("-fno-builtin-strcpy");
1340d6eaacbb9eb56763d38a3815fc509b92ed98a585Andrew Sapperstein  }
1341d6eaacbb9eb56763d38a3815fc509b92ed98a585Andrew Sapperstein
13426ba612efffba42bec102ac58a1540496158f747eAndrew Sapperstein  // gcc has some code here to deal with when no -mmacosx-version-min
13436ba612efffba42bec102ac58a1540496158f747eAndrew Sapperstein  // and no -miphoneos-version-min is present, but this never happens
1344d6eaacbb9eb56763d38a3815fc509b92ed98a585Andrew Sapperstein  // due to tool chain specific argument translation.
1345d6eaacbb9eb56763d38a3815fc509b92ed98a585Andrew Sapperstein
1346d6eaacbb9eb56763d38a3815fc509b92ed98a585Andrew Sapperstein  if (Args.hasArg(options::OPT_g_Flag) &&
1347d6eaacbb9eb56763d38a3815fc509b92ed98a585Andrew Sapperstein      !Args.hasArg(options::OPT_fno_eliminate_unused_debug_symbols))
1348d6eaacbb9eb56763d38a3815fc509b92ed98a585Andrew Sapperstein    CmdArgs.push_back("-feliminate-unused-debug-symbols");
1349d6eaacbb9eb56763d38a3815fc509b92ed98a585Andrew Sapperstein}
1350d6eaacbb9eb56763d38a3815fc509b92ed98a585Andrew Sapperstein
1351d6eaacbb9eb56763d38a3815fc509b92ed98a585Andrew Sappersteinvoid darwin::CC1::AddCC1OptionsArgs(const ArgList &Args, ArgStringList &CmdArgs,
1352d6eaacbb9eb56763d38a3815fc509b92ed98a585Andrew Sapperstein                                    const InputInfoList &Inputs,
13536ba612efffba42bec102ac58a1540496158f747eAndrew Sapperstein                                    const ArgStringList &OutputArgs) const {
1354d6eaacbb9eb56763d38a3815fc509b92ed98a585Andrew Sapperstein  const Driver &D = getToolChain().getHost().getDriver();
13556ba612efffba42bec102ac58a1540496158f747eAndrew Sapperstein
13566ba612efffba42bec102ac58a1540496158f747eAndrew Sapperstein  // Derived from cc1_options spec.
1357d6eaacbb9eb56763d38a3815fc509b92ed98a585Andrew Sapperstein  if (Args.hasArg(options::OPT_fast) ||
1358d6eaacbb9eb56763d38a3815fc509b92ed98a585Andrew Sapperstein      Args.hasArg(options::OPT_fastf) ||
1359d6eaacbb9eb56763d38a3815fc509b92ed98a585Andrew Sapperstein      Args.hasArg(options::OPT_fastcp))
1360d6eaacbb9eb56763d38a3815fc509b92ed98a585Andrew Sapperstein    CmdArgs.push_back("-O3");
1361d6eaacbb9eb56763d38a3815fc509b92ed98a585Andrew Sapperstein
13626ba612efffba42bec102ac58a1540496158f747eAndrew Sapperstein  if (Arg *A = Args.getLastArg(options::OPT_pg))
13636ba612efffba42bec102ac58a1540496158f747eAndrew Sapperstein    if (Args.hasArg(options::OPT_fomit_frame_pointer))
1364d6eaacbb9eb56763d38a3815fc509b92ed98a585Andrew Sapperstein      D.Diag(clang::diag::err_drv_argument_not_allowed_with)
1365d6eaacbb9eb56763d38a3815fc509b92ed98a585Andrew Sapperstein        << A->getAsString(Args) << "-fomit-frame-pointer";
1366d6eaacbb9eb56763d38a3815fc509b92ed98a585Andrew Sapperstein
1367d6eaacbb9eb56763d38a3815fc509b92ed98a585Andrew Sapperstein  AddCC1Args(Args, CmdArgs);
1368d6eaacbb9eb56763d38a3815fc509b92ed98a585Andrew Sapperstein
1369d6eaacbb9eb56763d38a3815fc509b92ed98a585Andrew Sapperstein  if (!Args.hasArg(options::OPT_Q))
1370d6eaacbb9eb56763d38a3815fc509b92ed98a585Andrew Sapperstein    CmdArgs.push_back("-quiet");
1371d6eaacbb9eb56763d38a3815fc509b92ed98a585Andrew Sapperstein
1372d6eaacbb9eb56763d38a3815fc509b92ed98a585Andrew Sapperstein  CmdArgs.push_back("-dumpbase");
13736ba612efffba42bec102ac58a1540496158f747eAndrew Sapperstein  CmdArgs.push_back(darwin::CC1::getBaseInputName(Args, Inputs));
1374d6eaacbb9eb56763d38a3815fc509b92ed98a585Andrew Sapperstein
13756ba612efffba42bec102ac58a1540496158f747eAndrew Sapperstein  Args.AddAllArgs(CmdArgs, options::OPT_d_Group);
13766ba612efffba42bec102ac58a1540496158f747eAndrew Sapperstein
1377d6eaacbb9eb56763d38a3815fc509b92ed98a585Andrew Sapperstein  Args.AddAllArgs(CmdArgs, options::OPT_m_Group);
1378d6eaacbb9eb56763d38a3815fc509b92ed98a585Andrew Sapperstein  Args.AddAllArgs(CmdArgs, options::OPT_a_Group);
1379d6eaacbb9eb56763d38a3815fc509b92ed98a585Andrew Sapperstein
1380d6eaacbb9eb56763d38a3815fc509b92ed98a585Andrew Sapperstein  // FIXME: The goal is to use the user provided -o if that is our
1381d6eaacbb9eb56763d38a3815fc509b92ed98a585Andrew Sapperstein  // final output, otherwise to drive from the original input
1382d6eaacbb9eb56763d38a3815fc509b92ed98a585Andrew Sapperstein  // name. Find a clean way to go about this.
1383d6eaacbb9eb56763d38a3815fc509b92ed98a585Andrew Sapperstein  if ((Args.hasArg(options::OPT_c) || Args.hasArg(options::OPT_S)) &&
1384d6eaacbb9eb56763d38a3815fc509b92ed98a585Andrew Sapperstein      Args.hasArg(options::OPT_o)) {
1385d6eaacbb9eb56763d38a3815fc509b92ed98a585Andrew Sapperstein    Arg *OutputOpt = Args.getLastArg(options::OPT_o);
1386d6eaacbb9eb56763d38a3815fc509b92ed98a585Andrew Sapperstein    CmdArgs.push_back("-auxbase-strip");
1387d6eaacbb9eb56763d38a3815fc509b92ed98a585Andrew Sapperstein    CmdArgs.push_back(OutputOpt->getValue(Args));
1388d6eaacbb9eb56763d38a3815fc509b92ed98a585Andrew Sapperstein  } else {
1389d6eaacbb9eb56763d38a3815fc509b92ed98a585Andrew Sapperstein    CmdArgs.push_back("-auxbase");
1390d6eaacbb9eb56763d38a3815fc509b92ed98a585Andrew Sapperstein    CmdArgs.push_back(darwin::CC1::getBaseInputStem(Args, Inputs));
1391d6eaacbb9eb56763d38a3815fc509b92ed98a585Andrew Sapperstein  }
1392d6eaacbb9eb56763d38a3815fc509b92ed98a585Andrew Sapperstein
1393d6eaacbb9eb56763d38a3815fc509b92ed98a585Andrew Sapperstein  Args.AddAllArgs(CmdArgs, options::OPT_g_Group);
1394d6eaacbb9eb56763d38a3815fc509b92ed98a585Andrew Sapperstein
1395d6eaacbb9eb56763d38a3815fc509b92ed98a585Andrew Sapperstein  Args.AddAllArgs(CmdArgs, options::OPT_O);
1396d6eaacbb9eb56763d38a3815fc509b92ed98a585Andrew Sapperstein  // FIXME: -Wall is getting some special treatment. Investigate.
1397d6eaacbb9eb56763d38a3815fc509b92ed98a585Andrew Sapperstein  Args.AddAllArgs(CmdArgs, options::OPT_W_Group, options::OPT_pedantic_Group);
1398d6eaacbb9eb56763d38a3815fc509b92ed98a585Andrew Sapperstein  Args.AddLastArg(CmdArgs, options::OPT_w);
1399d6eaacbb9eb56763d38a3815fc509b92ed98a585Andrew Sapperstein  Args.AddAllArgs(CmdArgs, options::OPT_std_EQ, options::OPT_ansi,
1400d6eaacbb9eb56763d38a3815fc509b92ed98a585Andrew Sapperstein                  options::OPT_trigraphs);
1401d6eaacbb9eb56763d38a3815fc509b92ed98a585Andrew Sapperstein  if (!Args.getLastArg(options::OPT_std_EQ, options::OPT_ansi)) {
14026ba612efffba42bec102ac58a1540496158f747eAndrew Sapperstein    // Honor -std-default.
14036ba612efffba42bec102ac58a1540496158f747eAndrew Sapperstein    Args.AddAllArgsTranslated(CmdArgs, options::OPT_std_default_EQ,
1404d6eaacbb9eb56763d38a3815fc509b92ed98a585Andrew Sapperstein                              "-std=", /*Joined=*/true);
1405d6eaacbb9eb56763d38a3815fc509b92ed98a585Andrew Sapperstein  }
1406d6eaacbb9eb56763d38a3815fc509b92ed98a585Andrew Sapperstein
1407d6eaacbb9eb56763d38a3815fc509b92ed98a585Andrew Sapperstein  if (Args.hasArg(options::OPT_v))
1408d6eaacbb9eb56763d38a3815fc509b92ed98a585Andrew Sapperstein    CmdArgs.push_back("-version");
1409d6eaacbb9eb56763d38a3815fc509b92ed98a585Andrew Sapperstein  if (Args.hasArg(options::OPT_pg))
1410d6eaacbb9eb56763d38a3815fc509b92ed98a585Andrew Sapperstein    CmdArgs.push_back("-p");
1411d6eaacbb9eb56763d38a3815fc509b92ed98a585Andrew Sapperstein  Args.AddLastArg(CmdArgs, options::OPT_p);
1412d6eaacbb9eb56763d38a3815fc509b92ed98a585Andrew Sapperstein
1413d6eaacbb9eb56763d38a3815fc509b92ed98a585Andrew Sapperstein  // The driver treats -fsyntax-only specially.
1414d6eaacbb9eb56763d38a3815fc509b92ed98a585Andrew Sapperstein  if (getToolChain().getTriple().getArch() == llvm::Triple::arm ||
1415d6eaacbb9eb56763d38a3815fc509b92ed98a585Andrew Sapperstein      getToolChain().getTriple().getArch() == llvm::Triple::thumb) {
1416d6eaacbb9eb56763d38a3815fc509b92ed98a585Andrew Sapperstein    // Removes -fbuiltin-str{cat,cpy}; these aren't recognized by cc1 but are
1417d6eaacbb9eb56763d38a3815fc509b92ed98a585Andrew Sapperstein    // used to inhibit the default -fno-builtin-str{cat,cpy}.
1418d6eaacbb9eb56763d38a3815fc509b92ed98a585Andrew Sapperstein    //
1419d6eaacbb9eb56763d38a3815fc509b92ed98a585Andrew Sapperstein    // FIXME: Should we grow a better way to deal with "removing" args?
1420d6eaacbb9eb56763d38a3815fc509b92ed98a585Andrew Sapperstein    for (arg_iterator it = Args.filtered_begin(options::OPT_f_Group,
1421d6eaacbb9eb56763d38a3815fc509b92ed98a585Andrew Sapperstein                                               options::OPT_fsyntax_only),
1422d6eaacbb9eb56763d38a3815fc509b92ed98a585Andrew Sapperstein           ie = Args.filtered_end(); it != ie; ++it) {
1423d6eaacbb9eb56763d38a3815fc509b92ed98a585Andrew Sapperstein      if (!it->getOption().matches(options::OPT_fbuiltin_strcat) &&
1424d6eaacbb9eb56763d38a3815fc509b92ed98a585Andrew Sapperstein          !it->getOption().matches(options::OPT_fbuiltin_strcpy)) {
1425d6eaacbb9eb56763d38a3815fc509b92ed98a585Andrew Sapperstein        it->claim();
1426d6eaacbb9eb56763d38a3815fc509b92ed98a585Andrew Sapperstein        it->render(Args, CmdArgs);
1427d6eaacbb9eb56763d38a3815fc509b92ed98a585Andrew Sapperstein      }
1428d6eaacbb9eb56763d38a3815fc509b92ed98a585Andrew Sapperstein    }
1429d6eaacbb9eb56763d38a3815fc509b92ed98a585Andrew Sapperstein  } else
1430d6eaacbb9eb56763d38a3815fc509b92ed98a585Andrew Sapperstein    Args.AddAllArgs(CmdArgs, options::OPT_f_Group, options::OPT_fsyntax_only);
1431d6eaacbb9eb56763d38a3815fc509b92ed98a585Andrew Sapperstein
1432d6eaacbb9eb56763d38a3815fc509b92ed98a585Andrew Sapperstein  Args.AddAllArgs(CmdArgs, options::OPT_undef);
1433d6eaacbb9eb56763d38a3815fc509b92ed98a585Andrew Sapperstein  if (Args.hasArg(options::OPT_Qn))
1434d6eaacbb9eb56763d38a3815fc509b92ed98a585Andrew Sapperstein    CmdArgs.push_back("-fno-ident");
1435d6eaacbb9eb56763d38a3815fc509b92ed98a585Andrew Sapperstein
14366ba612efffba42bec102ac58a1540496158f747eAndrew Sapperstein  // FIXME: This isn't correct.
14376ba612efffba42bec102ac58a1540496158f747eAndrew Sapperstein  //Args.AddLastArg(CmdArgs, options::OPT__help)
1438d6eaacbb9eb56763d38a3815fc509b92ed98a585Andrew Sapperstein  //Args.AddLastArg(CmdArgs, options::OPT__targetHelp)
1439d6eaacbb9eb56763d38a3815fc509b92ed98a585Andrew Sapperstein
1440d6eaacbb9eb56763d38a3815fc509b92ed98a585Andrew Sapperstein  CmdArgs.append(OutputArgs.begin(), OutputArgs.end());
1441d6eaacbb9eb56763d38a3815fc509b92ed98a585Andrew Sapperstein
1442d6eaacbb9eb56763d38a3815fc509b92ed98a585Andrew Sapperstein  // FIXME: Still don't get what is happening here. Investigate.
1443d6eaacbb9eb56763d38a3815fc509b92ed98a585Andrew Sapperstein  Args.AddAllArgs(CmdArgs, options::OPT__param);
1444d6eaacbb9eb56763d38a3815fc509b92ed98a585Andrew Sapperstein
1445d6eaacbb9eb56763d38a3815fc509b92ed98a585Andrew Sapperstein  if (Args.hasArg(options::OPT_fmudflap) ||
14466ba612efffba42bec102ac58a1540496158f747eAndrew Sapperstein      Args.hasArg(options::OPT_fmudflapth)) {
1447d6eaacbb9eb56763d38a3815fc509b92ed98a585Andrew Sapperstein    CmdArgs.push_back("-fno-builtin");
1448d6eaacbb9eb56763d38a3815fc509b92ed98a585Andrew Sapperstein    CmdArgs.push_back("-fno-merge-constants");
1449d6eaacbb9eb56763d38a3815fc509b92ed98a585Andrew Sapperstein  }
1450d6eaacbb9eb56763d38a3815fc509b92ed98a585Andrew Sapperstein
1451d6eaacbb9eb56763d38a3815fc509b92ed98a585Andrew Sapperstein  if (Args.hasArg(options::OPT_coverage)) {
1452d6eaacbb9eb56763d38a3815fc509b92ed98a585Andrew Sapperstein    CmdArgs.push_back("-fprofile-arcs");
1453d6eaacbb9eb56763d38a3815fc509b92ed98a585Andrew Sapperstein    CmdArgs.push_back("-ftest-coverage");
1454d6eaacbb9eb56763d38a3815fc509b92ed98a585Andrew Sapperstein  }
1455d6eaacbb9eb56763d38a3815fc509b92ed98a585Andrew Sapperstein
1456d6eaacbb9eb56763d38a3815fc509b92ed98a585Andrew Sapperstein  if (types::isCXX(Inputs[0].getType()))
1457d6eaacbb9eb56763d38a3815fc509b92ed98a585Andrew Sapperstein    CmdArgs.push_back("-D__private_extern__=extern");
1458d6eaacbb9eb56763d38a3815fc509b92ed98a585Andrew Sapperstein}
1459d6eaacbb9eb56763d38a3815fc509b92ed98a585Andrew Sapperstein
1460d6eaacbb9eb56763d38a3815fc509b92ed98a585Andrew Sappersteinvoid darwin::CC1::AddCPPOptionsArgs(const ArgList &Args, ArgStringList &CmdArgs,
1461d6eaacbb9eb56763d38a3815fc509b92ed98a585Andrew Sapperstein                                    const InputInfoList &Inputs,
1462d6eaacbb9eb56763d38a3815fc509b92ed98a585Andrew Sapperstein                                    const ArgStringList &OutputArgs) const {
1463d6eaacbb9eb56763d38a3815fc509b92ed98a585Andrew Sapperstein  // Derived from cpp_options
1464d6eaacbb9eb56763d38a3815fc509b92ed98a585Andrew Sapperstein  AddCPPUniqueOptionsArgs(Args, CmdArgs, Inputs);
1465d6eaacbb9eb56763d38a3815fc509b92ed98a585Andrew Sapperstein
1466d6eaacbb9eb56763d38a3815fc509b92ed98a585Andrew Sapperstein  CmdArgs.append(OutputArgs.begin(), OutputArgs.end());
1467d6eaacbb9eb56763d38a3815fc509b92ed98a585Andrew Sapperstein
1468d6eaacbb9eb56763d38a3815fc509b92ed98a585Andrew Sapperstein  AddCC1Args(Args, CmdArgs);
1469d6eaacbb9eb56763d38a3815fc509b92ed98a585Andrew Sapperstein
1470d6eaacbb9eb56763d38a3815fc509b92ed98a585Andrew Sapperstein  // NOTE: The code below has some commonality with cpp_options, but
14716ba612efffba42bec102ac58a1540496158f747eAndrew Sapperstein  // in classic gcc style ends up sending things in different
1472d6eaacbb9eb56763d38a3815fc509b92ed98a585Andrew Sapperstein  // orders. This may be a good merge candidate once we drop pedantic
1473d6eaacbb9eb56763d38a3815fc509b92ed98a585Andrew Sapperstein  // compatibility.
1474d6eaacbb9eb56763d38a3815fc509b92ed98a585Andrew Sapperstein
1475d6eaacbb9eb56763d38a3815fc509b92ed98a585Andrew Sapperstein  Args.AddAllArgs(CmdArgs, options::OPT_m_Group);
1476d6eaacbb9eb56763d38a3815fc509b92ed98a585Andrew Sapperstein  Args.AddAllArgs(CmdArgs, options::OPT_std_EQ, options::OPT_ansi,
1477d6eaacbb9eb56763d38a3815fc509b92ed98a585Andrew Sapperstein                  options::OPT_trigraphs);
1478d6eaacbb9eb56763d38a3815fc509b92ed98a585Andrew Sapperstein  if (!Args.getLastArg(options::OPT_std_EQ, options::OPT_ansi)) {
1479d6eaacbb9eb56763d38a3815fc509b92ed98a585Andrew Sapperstein    // Honor -std-default.
1480d6eaacbb9eb56763d38a3815fc509b92ed98a585Andrew Sapperstein    Args.AddAllArgsTranslated(CmdArgs, options::OPT_std_default_EQ,
1481d6eaacbb9eb56763d38a3815fc509b92ed98a585Andrew Sapperstein                              "-std=", /*Joined=*/true);
1482d6eaacbb9eb56763d38a3815fc509b92ed98a585Andrew Sapperstein  }
1483d6eaacbb9eb56763d38a3815fc509b92ed98a585Andrew Sapperstein  Args.AddAllArgs(CmdArgs, options::OPT_W_Group, options::OPT_pedantic_Group);
1484d6eaacbb9eb56763d38a3815fc509b92ed98a585Andrew Sapperstein  Args.AddLastArg(CmdArgs, options::OPT_w);
1485d6eaacbb9eb56763d38a3815fc509b92ed98a585Andrew Sapperstein
1486d6eaacbb9eb56763d38a3815fc509b92ed98a585Andrew Sapperstein  // The driver treats -fsyntax-only specially.
1487d6eaacbb9eb56763d38a3815fc509b92ed98a585Andrew Sapperstein  Args.AddAllArgs(CmdArgs, options::OPT_f_Group, options::OPT_fsyntax_only);
1488d6eaacbb9eb56763d38a3815fc509b92ed98a585Andrew Sapperstein
1489d6eaacbb9eb56763d38a3815fc509b92ed98a585Andrew Sapperstein  if (Args.hasArg(options::OPT_g_Group) && !Args.hasArg(options::OPT_g0) &&
1490d6eaacbb9eb56763d38a3815fc509b92ed98a585Andrew Sapperstein      !Args.hasArg(options::OPT_fno_working_directory))
1491d6eaacbb9eb56763d38a3815fc509b92ed98a585Andrew Sapperstein    CmdArgs.push_back("-fworking-directory");
1492d6eaacbb9eb56763d38a3815fc509b92ed98a585Andrew Sapperstein
1493d6eaacbb9eb56763d38a3815fc509b92ed98a585Andrew Sapperstein  Args.AddAllArgs(CmdArgs, options::OPT_O);
1494d6eaacbb9eb56763d38a3815fc509b92ed98a585Andrew Sapperstein  Args.AddAllArgs(CmdArgs, options::OPT_undef);
1495d6eaacbb9eb56763d38a3815fc509b92ed98a585Andrew Sapperstein  if (Args.hasArg(options::OPT_save_temps))
1496d6eaacbb9eb56763d38a3815fc509b92ed98a585Andrew Sapperstein    CmdArgs.push_back("-fpch-preprocess");
1497d6eaacbb9eb56763d38a3815fc509b92ed98a585Andrew Sapperstein}
1498d6eaacbb9eb56763d38a3815fc509b92ed98a585Andrew Sapperstein
1499d6eaacbb9eb56763d38a3815fc509b92ed98a585Andrew Sappersteinvoid darwin::CC1::AddCPPUniqueOptionsArgs(const ArgList &Args,
1500d6eaacbb9eb56763d38a3815fc509b92ed98a585Andrew Sapperstein                                          ArgStringList &CmdArgs,
1501d6eaacbb9eb56763d38a3815fc509b92ed98a585Andrew Sapperstein                                          const InputInfoList &Inputs) const {
1502d6eaacbb9eb56763d38a3815fc509b92ed98a585Andrew Sapperstein  const Driver &D = getToolChain().getHost().getDriver();
1503d6eaacbb9eb56763d38a3815fc509b92ed98a585Andrew Sapperstein
1504d6eaacbb9eb56763d38a3815fc509b92ed98a585Andrew Sapperstein  CheckPreprocessingOptions(D, Args);
1505d6eaacbb9eb56763d38a3815fc509b92ed98a585Andrew Sapperstein
1506d6eaacbb9eb56763d38a3815fc509b92ed98a585Andrew Sapperstein  // Derived from cpp_unique_options.
1507d6eaacbb9eb56763d38a3815fc509b92ed98a585Andrew Sapperstein  // -{C,CC} only with -E is checked in CheckPreprocessingOptions().
15086ba612efffba42bec102ac58a1540496158f747eAndrew Sapperstein  Args.AddLastArg(CmdArgs, options::OPT_C);
1509d6eaacbb9eb56763d38a3815fc509b92ed98a585Andrew Sapperstein  Args.AddLastArg(CmdArgs, options::OPT_CC);
1510d6eaacbb9eb56763d38a3815fc509b92ed98a585Andrew Sapperstein  if (!Args.hasArg(options::OPT_Q))
1511d6eaacbb9eb56763d38a3815fc509b92ed98a585Andrew Sapperstein    CmdArgs.push_back("-quiet");
1512d6eaacbb9eb56763d38a3815fc509b92ed98a585Andrew Sapperstein  Args.AddAllArgs(CmdArgs, options::OPT_nostdinc);
15136ba612efffba42bec102ac58a1540496158f747eAndrew Sapperstein  Args.AddLastArg(CmdArgs, options::OPT_v);
1514d6eaacbb9eb56763d38a3815fc509b92ed98a585Andrew Sapperstein  Args.AddAllArgs(CmdArgs, options::OPT_I_Group, options::OPT_F);
1515d6eaacbb9eb56763d38a3815fc509b92ed98a585Andrew Sapperstein  Args.AddLastArg(CmdArgs, options::OPT_P);
1516d6eaacbb9eb56763d38a3815fc509b92ed98a585Andrew Sapperstein
15176ba612efffba42bec102ac58a1540496158f747eAndrew Sapperstein  // FIXME: Handle %I properly.
1518d6eaacbb9eb56763d38a3815fc509b92ed98a585Andrew Sapperstein  if (getToolChain().getArchName() == "x86_64") {
1519d6eaacbb9eb56763d38a3815fc509b92ed98a585Andrew Sapperstein    CmdArgs.push_back("-imultilib");
1520d6eaacbb9eb56763d38a3815fc509b92ed98a585Andrew Sapperstein    CmdArgs.push_back("x86_64");
1521d6eaacbb9eb56763d38a3815fc509b92ed98a585Andrew Sapperstein  }
1522d6eaacbb9eb56763d38a3815fc509b92ed98a585Andrew Sapperstein
1523d6eaacbb9eb56763d38a3815fc509b92ed98a585Andrew Sapperstein  if (Args.hasArg(options::OPT_MD)) {
1524d6eaacbb9eb56763d38a3815fc509b92ed98a585Andrew Sapperstein    CmdArgs.push_back("-MD");
1525d6eaacbb9eb56763d38a3815fc509b92ed98a585Andrew Sapperstein    CmdArgs.push_back(darwin::CC1::getDependencyFileName(Args, Inputs));
1526d6eaacbb9eb56763d38a3815fc509b92ed98a585Andrew Sapperstein  }
1527d6eaacbb9eb56763d38a3815fc509b92ed98a585Andrew Sapperstein
1528d6eaacbb9eb56763d38a3815fc509b92ed98a585Andrew Sapperstein  if (Args.hasArg(options::OPT_MMD)) {
1529d6eaacbb9eb56763d38a3815fc509b92ed98a585Andrew Sapperstein    CmdArgs.push_back("-MMD");
15306ba612efffba42bec102ac58a1540496158f747eAndrew Sapperstein    CmdArgs.push_back(darwin::CC1::getDependencyFileName(Args, Inputs));
1531d6eaacbb9eb56763d38a3815fc509b92ed98a585Andrew Sapperstein  }
1532d6eaacbb9eb56763d38a3815fc509b92ed98a585Andrew Sapperstein
1533d6eaacbb9eb56763d38a3815fc509b92ed98a585Andrew Sapperstein  Args.AddLastArg(CmdArgs, options::OPT_M);
1534d6eaacbb9eb56763d38a3815fc509b92ed98a585Andrew Sapperstein  Args.AddLastArg(CmdArgs, options::OPT_MM);
1535d6eaacbb9eb56763d38a3815fc509b92ed98a585Andrew Sapperstein  Args.AddAllArgs(CmdArgs, options::OPT_MF);
1536d6eaacbb9eb56763d38a3815fc509b92ed98a585Andrew Sapperstein  Args.AddLastArg(CmdArgs, options::OPT_MG);
1537d6eaacbb9eb56763d38a3815fc509b92ed98a585Andrew Sapperstein  Args.AddLastArg(CmdArgs, options::OPT_MP);
1538d6eaacbb9eb56763d38a3815fc509b92ed98a585Andrew Sapperstein  Args.AddAllArgs(CmdArgs, options::OPT_MQ);
1539d6eaacbb9eb56763d38a3815fc509b92ed98a585Andrew Sapperstein  Args.AddAllArgs(CmdArgs, options::OPT_MT);
1540d6eaacbb9eb56763d38a3815fc509b92ed98a585Andrew Sapperstein  if (!Args.hasArg(options::OPT_M) && !Args.hasArg(options::OPT_MM) &&
1541d6eaacbb9eb56763d38a3815fc509b92ed98a585Andrew Sapperstein      (Args.hasArg(options::OPT_MD) || Args.hasArg(options::OPT_MMD))) {
1542d6eaacbb9eb56763d38a3815fc509b92ed98a585Andrew Sapperstein    if (Arg *OutputOpt = Args.getLastArg(options::OPT_o)) {
1543d6eaacbb9eb56763d38a3815fc509b92ed98a585Andrew Sapperstein      CmdArgs.push_back("-MQ");
1544d6eaacbb9eb56763d38a3815fc509b92ed98a585Andrew Sapperstein      CmdArgs.push_back(OutputOpt->getValue(Args));
1545d6eaacbb9eb56763d38a3815fc509b92ed98a585Andrew Sapperstein    }
1546d6eaacbb9eb56763d38a3815fc509b92ed98a585Andrew Sapperstein  }
1547d6eaacbb9eb56763d38a3815fc509b92ed98a585Andrew Sapperstein
1548d6eaacbb9eb56763d38a3815fc509b92ed98a585Andrew Sapperstein  Args.AddLastArg(CmdArgs, options::OPT_remap);
1549d6eaacbb9eb56763d38a3815fc509b92ed98a585Andrew Sapperstein  if (Args.hasArg(options::OPT_g3))
15506ba612efffba42bec102ac58a1540496158f747eAndrew Sapperstein    CmdArgs.push_back("-dD");
1551d6eaacbb9eb56763d38a3815fc509b92ed98a585Andrew Sapperstein  Args.AddLastArg(CmdArgs, options::OPT_H);
1552d6eaacbb9eb56763d38a3815fc509b92ed98a585Andrew Sapperstein
1553d6eaacbb9eb56763d38a3815fc509b92ed98a585Andrew Sapperstein  AddCPPArgs(Args, CmdArgs);
1554d6eaacbb9eb56763d38a3815fc509b92ed98a585Andrew Sapperstein
1555d6eaacbb9eb56763d38a3815fc509b92ed98a585Andrew Sapperstein  Args.AddAllArgs(CmdArgs, options::OPT_D, options::OPT_U, options::OPT_A);
1556d6eaacbb9eb56763d38a3815fc509b92ed98a585Andrew Sapperstein  Args.AddAllArgs(CmdArgs, options::OPT_i_Group);
1557d6eaacbb9eb56763d38a3815fc509b92ed98a585Andrew Sapperstein
1558d6eaacbb9eb56763d38a3815fc509b92ed98a585Andrew Sapperstein  for (InputInfoList::const_iterator
1559d6eaacbb9eb56763d38a3815fc509b92ed98a585Andrew Sapperstein         it = Inputs.begin(), ie = Inputs.end(); it != ie; ++it) {
1560d6eaacbb9eb56763d38a3815fc509b92ed98a585Andrew Sapperstein    const InputInfo &II = *it;
1561d6eaacbb9eb56763d38a3815fc509b92ed98a585Andrew Sapperstein
1562d6eaacbb9eb56763d38a3815fc509b92ed98a585Andrew Sapperstein    if (II.isPipe())
1563d6eaacbb9eb56763d38a3815fc509b92ed98a585Andrew Sapperstein      CmdArgs.push_back("-");
1564d6eaacbb9eb56763d38a3815fc509b92ed98a585Andrew Sapperstein    else
1565d6eaacbb9eb56763d38a3815fc509b92ed98a585Andrew Sapperstein      CmdArgs.push_back(II.getFilename());
1566d6eaacbb9eb56763d38a3815fc509b92ed98a585Andrew Sapperstein  }
1567d6eaacbb9eb56763d38a3815fc509b92ed98a585Andrew Sapperstein
1568d6eaacbb9eb56763d38a3815fc509b92ed98a585Andrew Sapperstein  Args.AddAllArgValues(CmdArgs, options::OPT_Wp_COMMA,
1569d6eaacbb9eb56763d38a3815fc509b92ed98a585Andrew Sapperstein                       options::OPT_Xpreprocessor);
1570d6eaacbb9eb56763d38a3815fc509b92ed98a585Andrew Sapperstein
1571d6eaacbb9eb56763d38a3815fc509b92ed98a585Andrew Sapperstein  if (Args.hasArg(options::OPT_fmudflap)) {
1572d6eaacbb9eb56763d38a3815fc509b92ed98a585Andrew Sapperstein    CmdArgs.push_back("-D_MUDFLAP");
1573d6eaacbb9eb56763d38a3815fc509b92ed98a585Andrew Sapperstein    CmdArgs.push_back("-include");
15746ba612efffba42bec102ac58a1540496158f747eAndrew Sapperstein    CmdArgs.push_back("mf-runtime.h");
1575d6eaacbb9eb56763d38a3815fc509b92ed98a585Andrew Sapperstein  }
1576d6eaacbb9eb56763d38a3815fc509b92ed98a585Andrew Sapperstein
1577d6eaacbb9eb56763d38a3815fc509b92ed98a585Andrew Sapperstein  if (Args.hasArg(options::OPT_fmudflapth)) {
1578d6eaacbb9eb56763d38a3815fc509b92ed98a585Andrew Sapperstein    CmdArgs.push_back("-D_MUDFLAP");
1579d6eaacbb9eb56763d38a3815fc509b92ed98a585Andrew Sapperstein    CmdArgs.push_back("-D_MUDFLAPTH");
1580d6eaacbb9eb56763d38a3815fc509b92ed98a585Andrew Sapperstein    CmdArgs.push_back("-include");
1581d6eaacbb9eb56763d38a3815fc509b92ed98a585Andrew Sapperstein    CmdArgs.push_back("mf-runtime.h");
15826ba612efffba42bec102ac58a1540496158f747eAndrew Sapperstein  }
1583d6eaacbb9eb56763d38a3815fc509b92ed98a585Andrew Sapperstein}
1584d6eaacbb9eb56763d38a3815fc509b92ed98a585Andrew Sapperstein
1585d6eaacbb9eb56763d38a3815fc509b92ed98a585Andrew Sappersteinvoid darwin::CC1::AddCPPArgs(const ArgList &Args,
1586d6eaacbb9eb56763d38a3815fc509b92ed98a585Andrew Sapperstein                             ArgStringList &CmdArgs) const {
1587d6eaacbb9eb56763d38a3815fc509b92ed98a585Andrew Sapperstein  // Derived from cpp spec.
1588d6eaacbb9eb56763d38a3815fc509b92ed98a585Andrew Sapperstein
15896ba612efffba42bec102ac58a1540496158f747eAndrew Sapperstein  if (Args.hasArg(options::OPT_static)) {
1590d6eaacbb9eb56763d38a3815fc509b92ed98a585Andrew Sapperstein    // The gcc spec is broken here, it refers to dynamic but
1591d6eaacbb9eb56763d38a3815fc509b92ed98a585Andrew Sapperstein    // that has been translated. Start by being bug compatible.
1592d6eaacbb9eb56763d38a3815fc509b92ed98a585Andrew Sapperstein
1593d6eaacbb9eb56763d38a3815fc509b92ed98a585Andrew Sapperstein    // if (!Args.hasArg(arglist.parser.dynamicOption))
1594d6eaacbb9eb56763d38a3815fc509b92ed98a585Andrew Sapperstein    CmdArgs.push_back("-D__STATIC__");
1595d6eaacbb9eb56763d38a3815fc509b92ed98a585Andrew Sapperstein  } else
1596d6eaacbb9eb56763d38a3815fc509b92ed98a585Andrew Sapperstein    CmdArgs.push_back("-D__DYNAMIC__");
1597d6eaacbb9eb56763d38a3815fc509b92ed98a585Andrew Sapperstein
1598d6eaacbb9eb56763d38a3815fc509b92ed98a585Andrew Sapperstein  if (Args.hasArg(options::OPT_pthread))
1599d6eaacbb9eb56763d38a3815fc509b92ed98a585Andrew Sapperstein    CmdArgs.push_back("-D_REENTRANT");
1600d6eaacbb9eb56763d38a3815fc509b92ed98a585Andrew Sapperstein}
1601d6eaacbb9eb56763d38a3815fc509b92ed98a585Andrew Sapperstein
1602d6eaacbb9eb56763d38a3815fc509b92ed98a585Andrew Sappersteinvoid darwin::Preprocess::ConstructJob(Compilation &C, const JobAction &JA,
1603d6eaacbb9eb56763d38a3815fc509b92ed98a585Andrew Sapperstein                                      Job &Dest, const InputInfo &Output,
1604d6eaacbb9eb56763d38a3815fc509b92ed98a585Andrew Sapperstein                                      const InputInfoList &Inputs,
16056ba612efffba42bec102ac58a1540496158f747eAndrew Sapperstein                                      const ArgList &Args,
1606d6eaacbb9eb56763d38a3815fc509b92ed98a585Andrew Sapperstein                                      const char *LinkingOutput) const {
1607d6eaacbb9eb56763d38a3815fc509b92ed98a585Andrew Sapperstein  ArgStringList CmdArgs;
1608d6eaacbb9eb56763d38a3815fc509b92ed98a585Andrew Sapperstein
16096ba612efffba42bec102ac58a1540496158f747eAndrew Sapperstein  assert(Inputs.size() == 1 && "Unexpected number of inputs!");
1610d6eaacbb9eb56763d38a3815fc509b92ed98a585Andrew Sapperstein
1611d6eaacbb9eb56763d38a3815fc509b92ed98a585Andrew Sapperstein  CmdArgs.push_back("-E");
1612d6eaacbb9eb56763d38a3815fc509b92ed98a585Andrew Sapperstein
1613d6eaacbb9eb56763d38a3815fc509b92ed98a585Andrew Sapperstein  if (Args.hasArg(options::OPT_traditional) ||
1614d6eaacbb9eb56763d38a3815fc509b92ed98a585Andrew Sapperstein      Args.hasArg(options::OPT_traditional_cpp))
1615d6eaacbb9eb56763d38a3815fc509b92ed98a585Andrew Sapperstein    CmdArgs.push_back("-traditional-cpp");
1616d6eaacbb9eb56763d38a3815fc509b92ed98a585Andrew Sapperstein
1617d6eaacbb9eb56763d38a3815fc509b92ed98a585Andrew Sapperstein  ArgStringList OutputArgs;
1618d6eaacbb9eb56763d38a3815fc509b92ed98a585Andrew Sapperstein  if (Output.isFilename()) {
1619d6eaacbb9eb56763d38a3815fc509b92ed98a585Andrew Sapperstein    OutputArgs.push_back("-o");
1620d6eaacbb9eb56763d38a3815fc509b92ed98a585Andrew Sapperstein    OutputArgs.push_back(Output.getFilename());
1621d6eaacbb9eb56763d38a3815fc509b92ed98a585Andrew Sapperstein  } else {
16226ba612efffba42bec102ac58a1540496158f747eAndrew Sapperstein    assert(Output.isPipe() && "Unexpected CC1 output.");
1623d6eaacbb9eb56763d38a3815fc509b92ed98a585Andrew Sapperstein  }
1624d6eaacbb9eb56763d38a3815fc509b92ed98a585Andrew Sapperstein
1625d6eaacbb9eb56763d38a3815fc509b92ed98a585Andrew Sapperstein  if (Args.hasArg(options::OPT_E)) {
1626d6eaacbb9eb56763d38a3815fc509b92ed98a585Andrew Sapperstein    AddCPPOptionsArgs(Args, CmdArgs, Inputs, OutputArgs);
1627d6eaacbb9eb56763d38a3815fc509b92ed98a585Andrew Sapperstein  } else {
1628d6eaacbb9eb56763d38a3815fc509b92ed98a585Andrew Sapperstein    AddCPPOptionsArgs(Args, CmdArgs, Inputs, ArgStringList());
1629d6eaacbb9eb56763d38a3815fc509b92ed98a585Andrew Sapperstein    CmdArgs.append(OutputArgs.begin(), OutputArgs.end());
1630d6eaacbb9eb56763d38a3815fc509b92ed98a585Andrew Sapperstein  }
1631d6eaacbb9eb56763d38a3815fc509b92ed98a585Andrew Sapperstein
1632d6eaacbb9eb56763d38a3815fc509b92ed98a585Andrew Sapperstein  Args.AddAllArgs(CmdArgs, options::OPT_d_Group);
1633d6eaacbb9eb56763d38a3815fc509b92ed98a585Andrew Sapperstein
1634d6eaacbb9eb56763d38a3815fc509b92ed98a585Andrew Sapperstein  const char *CC1Name = getCC1Name(Inputs[0].getType());
1635d6eaacbb9eb56763d38a3815fc509b92ed98a585Andrew Sapperstein  const char *Exec =
1636d6eaacbb9eb56763d38a3815fc509b92ed98a585Andrew Sapperstein    Args.MakeArgString(getToolChain().GetProgramPath(C, CC1Name));
1637d6eaacbb9eb56763d38a3815fc509b92ed98a585Andrew Sapperstein  Dest.addCommand(new Command(JA, *this, Exec, CmdArgs));
1638d6eaacbb9eb56763d38a3815fc509b92ed98a585Andrew Sapperstein}
1639d6eaacbb9eb56763d38a3815fc509b92ed98a585Andrew Sapperstein
1640d6eaacbb9eb56763d38a3815fc509b92ed98a585Andrew Sappersteinvoid darwin::Compile::ConstructJob(Compilation &C, const JobAction &JA,
1641d6eaacbb9eb56763d38a3815fc509b92ed98a585Andrew Sapperstein                                   Job &Dest, const InputInfo &Output,
1642d6eaacbb9eb56763d38a3815fc509b92ed98a585Andrew Sapperstein                                   const InputInfoList &Inputs,
1643d6eaacbb9eb56763d38a3815fc509b92ed98a585Andrew Sapperstein                                   const ArgList &Args,
1644d6eaacbb9eb56763d38a3815fc509b92ed98a585Andrew Sapperstein                                   const char *LinkingOutput) const {
1645d6eaacbb9eb56763d38a3815fc509b92ed98a585Andrew Sapperstein  const Driver &D = getToolChain().getHost().getDriver();
1646d6eaacbb9eb56763d38a3815fc509b92ed98a585Andrew Sapperstein  ArgStringList CmdArgs;
1647d6eaacbb9eb56763d38a3815fc509b92ed98a585Andrew Sapperstein
1648d6eaacbb9eb56763d38a3815fc509b92ed98a585Andrew Sapperstein  assert(Inputs.size() == 1 && "Unexpected number of inputs!");
1649d6eaacbb9eb56763d38a3815fc509b92ed98a585Andrew Sapperstein
1650d6eaacbb9eb56763d38a3815fc509b92ed98a585Andrew Sapperstein  types::ID InputType = Inputs[0].getType();
1651d6eaacbb9eb56763d38a3815fc509b92ed98a585Andrew Sapperstein  const Arg *A;
1652d6eaacbb9eb56763d38a3815fc509b92ed98a585Andrew Sapperstein  if ((A = Args.getLastArg(options::OPT_traditional)))
1653d6eaacbb9eb56763d38a3815fc509b92ed98a585Andrew Sapperstein    D.Diag(clang::diag::err_drv_argument_only_allowed_with)
1654d6eaacbb9eb56763d38a3815fc509b92ed98a585Andrew Sapperstein      << A->getAsString(Args) << "-E";
1655d6eaacbb9eb56763d38a3815fc509b92ed98a585Andrew Sapperstein
1656d6eaacbb9eb56763d38a3815fc509b92ed98a585Andrew Sapperstein  if (Output.getType() == types::TY_LLVMAsm)
1657d6eaacbb9eb56763d38a3815fc509b92ed98a585Andrew Sapperstein    CmdArgs.push_back("-emit-llvm");
1658d6eaacbb9eb56763d38a3815fc509b92ed98a585Andrew Sapperstein  else if (Output.getType() == types::TY_LLVMBC)
1659d6eaacbb9eb56763d38a3815fc509b92ed98a585Andrew Sapperstein    CmdArgs.push_back("-emit-llvm-bc");
1660d6eaacbb9eb56763d38a3815fc509b92ed98a585Andrew Sapperstein  else if (Output.getType() == types::TY_AST)
1661d6eaacbb9eb56763d38a3815fc509b92ed98a585Andrew Sapperstein    D.Diag(clang::diag::err_drv_no_ast_support)
1662d6eaacbb9eb56763d38a3815fc509b92ed98a585Andrew Sapperstein      << getToolChain().getTripleString();
16636ba612efffba42bec102ac58a1540496158f747eAndrew Sapperstein
16646ba612efffba42bec102ac58a1540496158f747eAndrew Sapperstein  ArgStringList OutputArgs;
1665d6eaacbb9eb56763d38a3815fc509b92ed98a585Andrew Sapperstein  if (Output.getType() != types::TY_PCH) {
1666d6eaacbb9eb56763d38a3815fc509b92ed98a585Andrew Sapperstein    OutputArgs.push_back("-o");
1667d6eaacbb9eb56763d38a3815fc509b92ed98a585Andrew Sapperstein    if (Output.isPipe())
1668d6eaacbb9eb56763d38a3815fc509b92ed98a585Andrew Sapperstein      OutputArgs.push_back("-");
1669d6eaacbb9eb56763d38a3815fc509b92ed98a585Andrew Sapperstein    else if (Output.isNothing())
1670d6eaacbb9eb56763d38a3815fc509b92ed98a585Andrew Sapperstein      OutputArgs.push_back("/dev/null");
1671d6eaacbb9eb56763d38a3815fc509b92ed98a585Andrew Sapperstein    else
1672d6eaacbb9eb56763d38a3815fc509b92ed98a585Andrew Sapperstein      OutputArgs.push_back(Output.getFilename());
1673d6eaacbb9eb56763d38a3815fc509b92ed98a585Andrew Sapperstein  }
1674d6eaacbb9eb56763d38a3815fc509b92ed98a585Andrew Sapperstein
1675d6eaacbb9eb56763d38a3815fc509b92ed98a585Andrew Sapperstein  // There is no need for this level of compatibility, but it makes
1676d6eaacbb9eb56763d38a3815fc509b92ed98a585Andrew Sapperstein  // diffing easier.
1677d6eaacbb9eb56763d38a3815fc509b92ed98a585Andrew Sapperstein  bool OutputArgsEarly = (Args.hasArg(options::OPT_fsyntax_only) ||
1678d6eaacbb9eb56763d38a3815fc509b92ed98a585Andrew Sapperstein                          Args.hasArg(options::OPT_S));
1679d6eaacbb9eb56763d38a3815fc509b92ed98a585Andrew Sapperstein
1680d6eaacbb9eb56763d38a3815fc509b92ed98a585Andrew Sapperstein  if (types::getPreprocessedType(InputType) != types::TY_INVALID) {
1681d6eaacbb9eb56763d38a3815fc509b92ed98a585Andrew Sapperstein    AddCPPUniqueOptionsArgs(Args, CmdArgs, Inputs);
1682d6eaacbb9eb56763d38a3815fc509b92ed98a585Andrew Sapperstein    if (OutputArgsEarly) {
1683d6eaacbb9eb56763d38a3815fc509b92ed98a585Andrew Sapperstein      AddCC1OptionsArgs(Args, CmdArgs, Inputs, OutputArgs);
16846ba612efffba42bec102ac58a1540496158f747eAndrew Sapperstein    } else {
16856ba612efffba42bec102ac58a1540496158f747eAndrew Sapperstein      AddCC1OptionsArgs(Args, CmdArgs, Inputs, ArgStringList());
1686d6eaacbb9eb56763d38a3815fc509b92ed98a585Andrew Sapperstein      CmdArgs.append(OutputArgs.begin(), OutputArgs.end());
1687d6eaacbb9eb56763d38a3815fc509b92ed98a585Andrew Sapperstein    }
1688d6eaacbb9eb56763d38a3815fc509b92ed98a585Andrew Sapperstein  } else {
1689d6eaacbb9eb56763d38a3815fc509b92ed98a585Andrew Sapperstein    CmdArgs.push_back("-fpreprocessed");
1690d6eaacbb9eb56763d38a3815fc509b92ed98a585Andrew Sapperstein
1691d6eaacbb9eb56763d38a3815fc509b92ed98a585Andrew Sapperstein    for (InputInfoList::const_iterator
1692d6eaacbb9eb56763d38a3815fc509b92ed98a585Andrew Sapperstein           it = Inputs.begin(), ie = Inputs.end(); it != ie; ++it) {
1693d6eaacbb9eb56763d38a3815fc509b92ed98a585Andrew Sapperstein      const InputInfo &II = *it;
1694d6eaacbb9eb56763d38a3815fc509b92ed98a585Andrew Sapperstein
1695d6eaacbb9eb56763d38a3815fc509b92ed98a585Andrew Sapperstein      // Reject AST inputs.
1696d6eaacbb9eb56763d38a3815fc509b92ed98a585Andrew Sapperstein      if (II.getType() == types::TY_AST) {
1697d6eaacbb9eb56763d38a3815fc509b92ed98a585Andrew Sapperstein        D.Diag(clang::diag::err_drv_no_ast_support)
1698d6eaacbb9eb56763d38a3815fc509b92ed98a585Andrew Sapperstein          << getToolChain().getTripleString();
1699d6eaacbb9eb56763d38a3815fc509b92ed98a585Andrew Sapperstein        return;
1700d6eaacbb9eb56763d38a3815fc509b92ed98a585Andrew Sapperstein      }
1701d6eaacbb9eb56763d38a3815fc509b92ed98a585Andrew Sapperstein
1702d6eaacbb9eb56763d38a3815fc509b92ed98a585Andrew Sapperstein      if (II.isPipe())
1703d6eaacbb9eb56763d38a3815fc509b92ed98a585Andrew Sapperstein        CmdArgs.push_back("-");
1704d6eaacbb9eb56763d38a3815fc509b92ed98a585Andrew Sapperstein      else
17056ba612efffba42bec102ac58a1540496158f747eAndrew Sapperstein        CmdArgs.push_back(II.getFilename());
17066ba612efffba42bec102ac58a1540496158f747eAndrew Sapperstein    }
1707d6eaacbb9eb56763d38a3815fc509b92ed98a585Andrew Sapperstein
1708d6eaacbb9eb56763d38a3815fc509b92ed98a585Andrew Sapperstein    if (OutputArgsEarly) {
1709d6eaacbb9eb56763d38a3815fc509b92ed98a585Andrew Sapperstein      AddCC1OptionsArgs(Args, CmdArgs, Inputs, OutputArgs);
1710d6eaacbb9eb56763d38a3815fc509b92ed98a585Andrew Sapperstein    } else {
1711d6eaacbb9eb56763d38a3815fc509b92ed98a585Andrew Sapperstein      AddCC1OptionsArgs(Args, CmdArgs, Inputs, ArgStringList());
1712d6eaacbb9eb56763d38a3815fc509b92ed98a585Andrew Sapperstein      CmdArgs.append(OutputArgs.begin(), OutputArgs.end());
1713d6eaacbb9eb56763d38a3815fc509b92ed98a585Andrew Sapperstein    }
1714d6eaacbb9eb56763d38a3815fc509b92ed98a585Andrew Sapperstein  }
1715d6eaacbb9eb56763d38a3815fc509b92ed98a585Andrew Sapperstein
1716d6eaacbb9eb56763d38a3815fc509b92ed98a585Andrew Sapperstein  if (Output.getType() == types::TY_PCH) {
1717d6eaacbb9eb56763d38a3815fc509b92ed98a585Andrew Sapperstein    assert(Output.isFilename() && "Invalid PCH output.");
1718d6eaacbb9eb56763d38a3815fc509b92ed98a585Andrew Sapperstein
1719d6eaacbb9eb56763d38a3815fc509b92ed98a585Andrew Sapperstein    CmdArgs.push_back("-o");
1720d6eaacbb9eb56763d38a3815fc509b92ed98a585Andrew Sapperstein    // NOTE: gcc uses a temp .s file for this, but there doesn't seem
1721d6eaacbb9eb56763d38a3815fc509b92ed98a585Andrew Sapperstein    // to be a good reason.
1722d6eaacbb9eb56763d38a3815fc509b92ed98a585Andrew Sapperstein    CmdArgs.push_back("/dev/null");
1723d6eaacbb9eb56763d38a3815fc509b92ed98a585Andrew Sapperstein
1724d6eaacbb9eb56763d38a3815fc509b92ed98a585Andrew Sapperstein    CmdArgs.push_back("--output-pch=");
1725d6eaacbb9eb56763d38a3815fc509b92ed98a585Andrew Sapperstein    CmdArgs.push_back(Output.getFilename());
17266ba612efffba42bec102ac58a1540496158f747eAndrew Sapperstein  }
17276ba612efffba42bec102ac58a1540496158f747eAndrew Sapperstein
1728d6eaacbb9eb56763d38a3815fc509b92ed98a585Andrew Sapperstein  const char *CC1Name = getCC1Name(Inputs[0].getType());
1729d6eaacbb9eb56763d38a3815fc509b92ed98a585Andrew Sapperstein  const char *Exec =
1730d6eaacbb9eb56763d38a3815fc509b92ed98a585Andrew Sapperstein    Args.MakeArgString(getToolChain().GetProgramPath(C, CC1Name));
1731d6eaacbb9eb56763d38a3815fc509b92ed98a585Andrew Sapperstein  Dest.addCommand(new Command(JA, *this, Exec, CmdArgs));
1732d6eaacbb9eb56763d38a3815fc509b92ed98a585Andrew Sapperstein}
1733d6eaacbb9eb56763d38a3815fc509b92ed98a585Andrew Sapperstein
1734d6eaacbb9eb56763d38a3815fc509b92ed98a585Andrew Sappersteinvoid darwin::Assemble::ConstructJob(Compilation &C, const JobAction &JA,
1735d6eaacbb9eb56763d38a3815fc509b92ed98a585Andrew Sapperstein                                    Job &Dest, const InputInfo &Output,
1736d6eaacbb9eb56763d38a3815fc509b92ed98a585Andrew Sapperstein                                    const InputInfoList &Inputs,
1737d6eaacbb9eb56763d38a3815fc509b92ed98a585Andrew Sapperstein                                    const ArgList &Args,
1738d6eaacbb9eb56763d38a3815fc509b92ed98a585Andrew Sapperstein                                    const char *LinkingOutput) const {
1739d6eaacbb9eb56763d38a3815fc509b92ed98a585Andrew Sapperstein  ArgStringList CmdArgs;
1740d6eaacbb9eb56763d38a3815fc509b92ed98a585Andrew Sapperstein
1741d6eaacbb9eb56763d38a3815fc509b92ed98a585Andrew Sapperstein  assert(Inputs.size() == 1 && "Unexpected number of inputs.");
1742d6eaacbb9eb56763d38a3815fc509b92ed98a585Andrew Sapperstein  const InputInfo &Input = Inputs[0];
1743d6eaacbb9eb56763d38a3815fc509b92ed98a585Andrew Sapperstein
1744d6eaacbb9eb56763d38a3815fc509b92ed98a585Andrew Sapperstein  // Bit of a hack, this is only used for original inputs.
1745d6eaacbb9eb56763d38a3815fc509b92ed98a585Andrew Sapperstein  //
1746d6eaacbb9eb56763d38a3815fc509b92ed98a585Andrew Sapperstein  // FIXME: This is broken for preprocessed .s inputs.
17476ba612efffba42bec102ac58a1540496158f747eAndrew Sapperstein  if (Input.isFilename() &&
17486ba612efffba42bec102ac58a1540496158f747eAndrew Sapperstein      strcmp(Input.getFilename(), Input.getBaseInput()) == 0) {
1749d6eaacbb9eb56763d38a3815fc509b92ed98a585Andrew Sapperstein    if (Args.hasArg(options::OPT_gstabs))
1750d6eaacbb9eb56763d38a3815fc509b92ed98a585Andrew Sapperstein      CmdArgs.push_back("--gstabs");
1751d6eaacbb9eb56763d38a3815fc509b92ed98a585Andrew Sapperstein    else if (Args.hasArg(options::OPT_g_Group))
1752d6eaacbb9eb56763d38a3815fc509b92ed98a585Andrew Sapperstein      CmdArgs.push_back("--gdwarf2");
1753d6eaacbb9eb56763d38a3815fc509b92ed98a585Andrew Sapperstein  }
1754d6eaacbb9eb56763d38a3815fc509b92ed98a585Andrew Sapperstein
1755d6eaacbb9eb56763d38a3815fc509b92ed98a585Andrew Sapperstein  // Derived from asm spec.
1756d6eaacbb9eb56763d38a3815fc509b92ed98a585Andrew Sapperstein  AddDarwinArch(Args, CmdArgs);
1757d6eaacbb9eb56763d38a3815fc509b92ed98a585Andrew Sapperstein
1758d6eaacbb9eb56763d38a3815fc509b92ed98a585Andrew Sapperstein  if (!getDarwinToolChain().isIPhoneOS() ||
1759d6eaacbb9eb56763d38a3815fc509b92ed98a585Andrew Sapperstein      Args.hasArg(options::OPT_force__cpusubtype__ALL))
1760d6eaacbb9eb56763d38a3815fc509b92ed98a585Andrew Sapperstein    CmdArgs.push_back("-force_cpusubtype_ALL");
1761d6eaacbb9eb56763d38a3815fc509b92ed98a585Andrew Sapperstein
1762d6eaacbb9eb56763d38a3815fc509b92ed98a585Andrew Sapperstein  if (getToolChain().getTriple().getArch() != llvm::Triple::x86_64 &&
1763d6eaacbb9eb56763d38a3815fc509b92ed98a585Andrew Sapperstein      (Args.hasArg(options::OPT_mkernel) ||
1764d6eaacbb9eb56763d38a3815fc509b92ed98a585Andrew Sapperstein       Args.hasArg(options::OPT_static) ||
1765d6eaacbb9eb56763d38a3815fc509b92ed98a585Andrew Sapperstein       Args.hasArg(options::OPT_fapple_kext)))
1766d6eaacbb9eb56763d38a3815fc509b92ed98a585Andrew Sapperstein    CmdArgs.push_back("-static");
1767d6eaacbb9eb56763d38a3815fc509b92ed98a585Andrew Sapperstein
17686ba612efffba42bec102ac58a1540496158f747eAndrew Sapperstein  Args.AddAllArgValues(CmdArgs, options::OPT_Wa_COMMA,
17696ba612efffba42bec102ac58a1540496158f747eAndrew Sapperstein                       options::OPT_Xassembler);
1770d6eaacbb9eb56763d38a3815fc509b92ed98a585Andrew Sapperstein
1771d6eaacbb9eb56763d38a3815fc509b92ed98a585Andrew Sapperstein  assert(Output.isFilename() && "Unexpected lipo output.");
1772d6eaacbb9eb56763d38a3815fc509b92ed98a585Andrew Sapperstein  CmdArgs.push_back("-o");
1773d6eaacbb9eb56763d38a3815fc509b92ed98a585Andrew Sapperstein  CmdArgs.push_back(Output.getFilename());
1774d6eaacbb9eb56763d38a3815fc509b92ed98a585Andrew Sapperstein
1775d6eaacbb9eb56763d38a3815fc509b92ed98a585Andrew Sapperstein  if (Input.isPipe()) {
1776d6eaacbb9eb56763d38a3815fc509b92ed98a585Andrew Sapperstein    CmdArgs.push_back("-");
1777d6eaacbb9eb56763d38a3815fc509b92ed98a585Andrew Sapperstein  } else {
1778d6eaacbb9eb56763d38a3815fc509b92ed98a585Andrew Sapperstein    assert(Input.isFilename() && "Invalid input.");
1779d6eaacbb9eb56763d38a3815fc509b92ed98a585Andrew Sapperstein    CmdArgs.push_back(Input.getFilename());
1780d6eaacbb9eb56763d38a3815fc509b92ed98a585Andrew Sapperstein  }
1781d6eaacbb9eb56763d38a3815fc509b92ed98a585Andrew Sapperstein
1782d6eaacbb9eb56763d38a3815fc509b92ed98a585Andrew Sapperstein  // asm_final spec is empty.
1783d6eaacbb9eb56763d38a3815fc509b92ed98a585Andrew Sapperstein
1784d6eaacbb9eb56763d38a3815fc509b92ed98a585Andrew Sapperstein  const char *Exec =
1785d6eaacbb9eb56763d38a3815fc509b92ed98a585Andrew Sapperstein    Args.MakeArgString(getToolChain().GetProgramPath(C, "as"));
1786d6eaacbb9eb56763d38a3815fc509b92ed98a585Andrew Sapperstein  Dest.addCommand(new Command(JA, *this, Exec, CmdArgs));
1787d6eaacbb9eb56763d38a3815fc509b92ed98a585Andrew Sapperstein}
1788d6eaacbb9eb56763d38a3815fc509b92ed98a585Andrew Sapperstein
17896ba612efffba42bec102ac58a1540496158f747eAndrew Sapperstein/// Helper routine for seeing if we should use dsymutil; this is a
17906ba612efffba42bec102ac58a1540496158f747eAndrew Sapperstein/// gcc compatible hack, we should remove it and use the input
1791d6eaacbb9eb56763d38a3815fc509b92ed98a585Andrew Sapperstein/// type information.
1792d6eaacbb9eb56763d38a3815fc509b92ed98a585Andrew Sappersteinstatic bool isSourceSuffix(const char *Str) {
1793d6eaacbb9eb56763d38a3815fc509b92ed98a585Andrew Sapperstein  // match: 'C', 'CPP', 'c', 'cc', 'cp', 'c++', 'cpp', 'cxx', 'm',
1794d6eaacbb9eb56763d38a3815fc509b92ed98a585Andrew Sapperstein  // 'mm'.
1795d6eaacbb9eb56763d38a3815fc509b92ed98a585Andrew Sapperstein  return llvm::StringSwitch<bool>(Str)
1796d6eaacbb9eb56763d38a3815fc509b92ed98a585Andrew Sapperstein           .Case("C", true)
1797d6eaacbb9eb56763d38a3815fc509b92ed98a585Andrew Sapperstein           .Case("c", true)
1798d6eaacbb9eb56763d38a3815fc509b92ed98a585Andrew Sapperstein           .Case("m", true)
1799d6eaacbb9eb56763d38a3815fc509b92ed98a585Andrew Sapperstein           .Case("cc", true)
1800d6eaacbb9eb56763d38a3815fc509b92ed98a585Andrew Sapperstein           .Case("cp", true)
1801d6eaacbb9eb56763d38a3815fc509b92ed98a585Andrew Sapperstein           .Case("mm", true)
1802d6eaacbb9eb56763d38a3815fc509b92ed98a585Andrew Sapperstein           .Case("CPP", true)
1803d6eaacbb9eb56763d38a3815fc509b92ed98a585Andrew Sapperstein           .Case("c++", true)
1804d6eaacbb9eb56763d38a3815fc509b92ed98a585Andrew Sapperstein           .Case("cpp", true)
1805d6eaacbb9eb56763d38a3815fc509b92ed98a585Andrew Sapperstein           .Case("cxx", true)
1806d6eaacbb9eb56763d38a3815fc509b92ed98a585Andrew Sapperstein           .Default(false);
1807d6eaacbb9eb56763d38a3815fc509b92ed98a585Andrew Sapperstein}
1808d6eaacbb9eb56763d38a3815fc509b92ed98a585Andrew Sapperstein
1809d6eaacbb9eb56763d38a3815fc509b92ed98a585Andrew Sapperstein// FIXME: Can we tablegen this?
18106ba612efffba42bec102ac58a1540496158f747eAndrew Sappersteinstatic const char *GetArmArchForMArch(llvm::StringRef Value) {
18116ba612efffba42bec102ac58a1540496158f747eAndrew Sapperstein  if (Value == "armv6k")
1812d6eaacbb9eb56763d38a3815fc509b92ed98a585Andrew Sapperstein    return "armv6";
1813d6eaacbb9eb56763d38a3815fc509b92ed98a585Andrew Sapperstein
1814d6eaacbb9eb56763d38a3815fc509b92ed98a585Andrew Sapperstein  if (Value == "armv5tej")
1815d6eaacbb9eb56763d38a3815fc509b92ed98a585Andrew Sapperstein    return "armv5";
1816d6eaacbb9eb56763d38a3815fc509b92ed98a585Andrew Sapperstein
1817d6eaacbb9eb56763d38a3815fc509b92ed98a585Andrew Sapperstein  if (Value == "xscale")
1818d6eaacbb9eb56763d38a3815fc509b92ed98a585Andrew Sapperstein    return "xscale";
1819d6eaacbb9eb56763d38a3815fc509b92ed98a585Andrew Sapperstein
1820d6eaacbb9eb56763d38a3815fc509b92ed98a585Andrew Sapperstein  if (Value == "armv4t")
1821d6eaacbb9eb56763d38a3815fc509b92ed98a585Andrew Sapperstein    return "armv4t";
1822d6eaacbb9eb56763d38a3815fc509b92ed98a585Andrew Sapperstein
1823d6eaacbb9eb56763d38a3815fc509b92ed98a585Andrew Sapperstein  if (Value == "armv7" || Value == "armv7-a" || Value == "armv7-r" ||
1824d6eaacbb9eb56763d38a3815fc509b92ed98a585Andrew Sapperstein      Value == "armv7-m" || Value == "armv7a" || Value == "armv7r" ||
1825d6eaacbb9eb56763d38a3815fc509b92ed98a585Andrew Sapperstein      Value == "armv7m")
1826d6eaacbb9eb56763d38a3815fc509b92ed98a585Andrew Sapperstein    return "armv7";
1827d6eaacbb9eb56763d38a3815fc509b92ed98a585Andrew Sapperstein
1828d6eaacbb9eb56763d38a3815fc509b92ed98a585Andrew Sapperstein  return 0;
1829d6eaacbb9eb56763d38a3815fc509b92ed98a585Andrew Sapperstein}
1830d6eaacbb9eb56763d38a3815fc509b92ed98a585Andrew Sapperstein
18316ba612efffba42bec102ac58a1540496158f747eAndrew Sapperstein// FIXME: Can we tablegen this?
18326ba612efffba42bec102ac58a1540496158f747eAndrew Sappersteinstatic const char *GetArmArchForMCpu(llvm::StringRef Value) {
1833d6eaacbb9eb56763d38a3815fc509b92ed98a585Andrew Sapperstein  if (Value == "arm10tdmi" || Value == "arm1020t" || Value == "arm9e" ||
1834d6eaacbb9eb56763d38a3815fc509b92ed98a585Andrew Sapperstein      Value == "arm946e-s" || Value == "arm966e-s" ||
1835d6eaacbb9eb56763d38a3815fc509b92ed98a585Andrew Sapperstein      Value == "arm968e-s" || Value == "arm10e" ||
1836d6eaacbb9eb56763d38a3815fc509b92ed98a585Andrew Sapperstein      Value == "arm1020e" || Value == "arm1022e" || Value == "arm926ej-s" ||
1837d6eaacbb9eb56763d38a3815fc509b92ed98a585Andrew Sapperstein      Value == "arm1026ej-s")
1838d6eaacbb9eb56763d38a3815fc509b92ed98a585Andrew Sapperstein    return "armv5";
1839d6eaacbb9eb56763d38a3815fc509b92ed98a585Andrew Sapperstein
1840d6eaacbb9eb56763d38a3815fc509b92ed98a585Andrew Sapperstein  if (Value == "xscale")
1841d6eaacbb9eb56763d38a3815fc509b92ed98a585Andrew Sapperstein    return "xscale";
1842d6eaacbb9eb56763d38a3815fc509b92ed98a585Andrew Sapperstein
1843d6eaacbb9eb56763d38a3815fc509b92ed98a585Andrew Sapperstein  if (Value == "arm1136j-s" || Value == "arm1136jf-s" ||
1844d6eaacbb9eb56763d38a3815fc509b92ed98a585Andrew Sapperstein      Value == "arm1176jz-s" || Value == "arm1176jzf-s")
1845d6eaacbb9eb56763d38a3815fc509b92ed98a585Andrew Sapperstein    return "armv6";
1846d6eaacbb9eb56763d38a3815fc509b92ed98a585Andrew Sapperstein
1847d6eaacbb9eb56763d38a3815fc509b92ed98a585Andrew Sapperstein  if (Value == "cortex-a8" || Value == "cortex-r4" || Value == "cortex-m3")
1848d6eaacbb9eb56763d38a3815fc509b92ed98a585Andrew Sapperstein    return "armv7";
1849d6eaacbb9eb56763d38a3815fc509b92ed98a585Andrew Sapperstein
1850d6eaacbb9eb56763d38a3815fc509b92ed98a585Andrew Sapperstein  return 0;
1851d6eaacbb9eb56763d38a3815fc509b92ed98a585Andrew Sapperstein}
18526ba612efffba42bec102ac58a1540496158f747eAndrew Sapperstein
18536ba612efffba42bec102ac58a1540496158f747eAndrew Sappersteinvoid darwin::DarwinTool::AddDarwinArch(const ArgList &Args,
1854d6eaacbb9eb56763d38a3815fc509b92ed98a585Andrew Sapperstein                                       ArgStringList &CmdArgs) const {
1855d6eaacbb9eb56763d38a3815fc509b92ed98a585Andrew Sapperstein  // Derived from darwin_arch spec.
1856d6eaacbb9eb56763d38a3815fc509b92ed98a585Andrew Sapperstein  CmdArgs.push_back("-arch");
1857d6eaacbb9eb56763d38a3815fc509b92ed98a585Andrew Sapperstein
1858d6eaacbb9eb56763d38a3815fc509b92ed98a585Andrew Sapperstein  switch (getToolChain().getTriple().getArch()) {
1859d6eaacbb9eb56763d38a3815fc509b92ed98a585Andrew Sapperstein  default:
1860d6eaacbb9eb56763d38a3815fc509b92ed98a585Andrew Sapperstein    CmdArgs.push_back(Args.MakeArgString(getToolChain().getArchName()));
1861d6eaacbb9eb56763d38a3815fc509b92ed98a585Andrew Sapperstein    break;
1862d6eaacbb9eb56763d38a3815fc509b92ed98a585Andrew Sapperstein
1863d6eaacbb9eb56763d38a3815fc509b92ed98a585Andrew Sapperstein  case llvm::Triple::arm: {
1864d6eaacbb9eb56763d38a3815fc509b92ed98a585Andrew Sapperstein    if (const Arg *A = Args.getLastArg(options::OPT_march_EQ)) {
1865d6eaacbb9eb56763d38a3815fc509b92ed98a585Andrew Sapperstein      if (const char *Arch = GetArmArchForMArch(A->getValue(Args))) {
1866d6eaacbb9eb56763d38a3815fc509b92ed98a585Andrew Sapperstein        CmdArgs.push_back(Arch);
1867d6eaacbb9eb56763d38a3815fc509b92ed98a585Andrew Sapperstein        return;
1868d6eaacbb9eb56763d38a3815fc509b92ed98a585Andrew Sapperstein      }
1869d6eaacbb9eb56763d38a3815fc509b92ed98a585Andrew Sapperstein    }
1870d6eaacbb9eb56763d38a3815fc509b92ed98a585Andrew Sapperstein
1871d6eaacbb9eb56763d38a3815fc509b92ed98a585Andrew Sapperstein    if (const Arg *A = Args.getLastArg(options::OPT_mcpu_EQ)) {
1872d6eaacbb9eb56763d38a3815fc509b92ed98a585Andrew Sapperstein      if (const char *Arch = GetArmArchForMCpu(A->getValue(Args))) {
18736ba612efffba42bec102ac58a1540496158f747eAndrew Sapperstein        CmdArgs.push_back(Arch);
18746ba612efffba42bec102ac58a1540496158f747eAndrew Sapperstein        return;
1875d6eaacbb9eb56763d38a3815fc509b92ed98a585Andrew Sapperstein      }
1876d6eaacbb9eb56763d38a3815fc509b92ed98a585Andrew Sapperstein    }
1877d6eaacbb9eb56763d38a3815fc509b92ed98a585Andrew Sapperstein
1878d6eaacbb9eb56763d38a3815fc509b92ed98a585Andrew Sapperstein    CmdArgs.push_back("arm");
1879d6eaacbb9eb56763d38a3815fc509b92ed98a585Andrew Sapperstein    CmdArgs.push_back("-force_cpusubtype_ALL");
1880d6eaacbb9eb56763d38a3815fc509b92ed98a585Andrew Sapperstein    return;
1881d6eaacbb9eb56763d38a3815fc509b92ed98a585Andrew Sapperstein  }
1882d6eaacbb9eb56763d38a3815fc509b92ed98a585Andrew Sapperstein  }
1883d6eaacbb9eb56763d38a3815fc509b92ed98a585Andrew Sapperstein}
1884d6eaacbb9eb56763d38a3815fc509b92ed98a585Andrew Sapperstein
1885d6eaacbb9eb56763d38a3815fc509b92ed98a585Andrew Sappersteinvoid darwin::DarwinTool::AddDarwinSubArch(const ArgList &Args,
1886d6eaacbb9eb56763d38a3815fc509b92ed98a585Andrew Sapperstein                                          ArgStringList &CmdArgs) const {
1887d6eaacbb9eb56763d38a3815fc509b92ed98a585Andrew Sapperstein  // Derived from darwin_subarch spec, not sure what the distinction
1888d6eaacbb9eb56763d38a3815fc509b92ed98a585Andrew Sapperstein  // exists for but at least for this chain it is the same.
1889d6eaacbb9eb56763d38a3815fc509b92ed98a585Andrew Sapperstein  AddDarwinArch(Args, CmdArgs);
1890d6eaacbb9eb56763d38a3815fc509b92ed98a585Andrew Sapperstein}
1891d6eaacbb9eb56763d38a3815fc509b92ed98a585Andrew Sapperstein
1892d6eaacbb9eb56763d38a3815fc509b92ed98a585Andrew Sappersteinvoid darwin::Link::AddLinkArgs(const ArgList &Args,
1893d6eaacbb9eb56763d38a3815fc509b92ed98a585Andrew Sapperstein                               ArgStringList &CmdArgs) const {
18946ba612efffba42bec102ac58a1540496158f747eAndrew Sapperstein  const Driver &D = getToolChain().getHost().getDriver();
18956ba612efffba42bec102ac58a1540496158f747eAndrew Sapperstein
1896d6eaacbb9eb56763d38a3815fc509b92ed98a585Andrew Sapperstein  // Derived from the "link" spec.
1897d6eaacbb9eb56763d38a3815fc509b92ed98a585Andrew Sapperstein  Args.AddAllArgs(CmdArgs, options::OPT_static);
1898d6eaacbb9eb56763d38a3815fc509b92ed98a585Andrew Sapperstein  if (!Args.hasArg(options::OPT_static))
1899d6eaacbb9eb56763d38a3815fc509b92ed98a585Andrew Sapperstein    CmdArgs.push_back("-dynamic");
1900d6eaacbb9eb56763d38a3815fc509b92ed98a585Andrew Sapperstein  if (Args.hasArg(options::OPT_fgnu_runtime)) {
1901d6eaacbb9eb56763d38a3815fc509b92ed98a585Andrew Sapperstein    // FIXME: gcc replaces -lobjc in forward args with -lobjc-gnu
1902d6eaacbb9eb56763d38a3815fc509b92ed98a585Andrew Sapperstein    // here. How do we wish to handle such things?
1903d6eaacbb9eb56763d38a3815fc509b92ed98a585Andrew Sapperstein  }
1904d6eaacbb9eb56763d38a3815fc509b92ed98a585Andrew Sapperstein
1905d6eaacbb9eb56763d38a3815fc509b92ed98a585Andrew Sapperstein  if (!Args.hasArg(options::OPT_dynamiclib)) {
1906d6eaacbb9eb56763d38a3815fc509b92ed98a585Andrew Sapperstein    if (Args.hasArg(options::OPT_force__cpusubtype__ALL)) {
1907d6eaacbb9eb56763d38a3815fc509b92ed98a585Andrew Sapperstein      AddDarwinArch(Args, CmdArgs);
1908d6eaacbb9eb56763d38a3815fc509b92ed98a585Andrew Sapperstein      CmdArgs.push_back("-force_cpusubtype_ALL");
1909d6eaacbb9eb56763d38a3815fc509b92ed98a585Andrew Sapperstein    } else
1910d6eaacbb9eb56763d38a3815fc509b92ed98a585Andrew Sapperstein      AddDarwinSubArch(Args, CmdArgs);
1911d6eaacbb9eb56763d38a3815fc509b92ed98a585Andrew Sapperstein
1912d6eaacbb9eb56763d38a3815fc509b92ed98a585Andrew Sapperstein    Args.AddLastArg(CmdArgs, options::OPT_bundle);
1913d6eaacbb9eb56763d38a3815fc509b92ed98a585Andrew Sapperstein    Args.AddAllArgs(CmdArgs, options::OPT_bundle__loader);
1914d6eaacbb9eb56763d38a3815fc509b92ed98a585Andrew Sapperstein    Args.AddAllArgs(CmdArgs, options::OPT_client__name);
19156ba612efffba42bec102ac58a1540496158f747eAndrew Sapperstein
19166ba612efffba42bec102ac58a1540496158f747eAndrew Sapperstein    Arg *A;
1917d6eaacbb9eb56763d38a3815fc509b92ed98a585Andrew Sapperstein    if ((A = Args.getLastArg(options::OPT_compatibility__version)) ||
1918d6eaacbb9eb56763d38a3815fc509b92ed98a585Andrew Sapperstein        (A = Args.getLastArg(options::OPT_current__version)) ||
1919d6eaacbb9eb56763d38a3815fc509b92ed98a585Andrew Sapperstein        (A = Args.getLastArg(options::OPT_install__name)))
1920d6eaacbb9eb56763d38a3815fc509b92ed98a585Andrew Sapperstein      D.Diag(clang::diag::err_drv_argument_only_allowed_with)
1921d6eaacbb9eb56763d38a3815fc509b92ed98a585Andrew Sapperstein        << A->getAsString(Args) << "-dynamiclib";
1922d6eaacbb9eb56763d38a3815fc509b92ed98a585Andrew Sapperstein
1923d6eaacbb9eb56763d38a3815fc509b92ed98a585Andrew Sapperstein    Args.AddLastArg(CmdArgs, options::OPT_force__flat__namespace);
1924d6eaacbb9eb56763d38a3815fc509b92ed98a585Andrew Sapperstein    Args.AddLastArg(CmdArgs, options::OPT_keep__private__externs);
1925d6eaacbb9eb56763d38a3815fc509b92ed98a585Andrew Sapperstein    Args.AddLastArg(CmdArgs, options::OPT_private__bundle);
1926d6eaacbb9eb56763d38a3815fc509b92ed98a585Andrew Sapperstein  } else {
1927d6eaacbb9eb56763d38a3815fc509b92ed98a585Andrew Sapperstein    CmdArgs.push_back("-dylib");
1928d6eaacbb9eb56763d38a3815fc509b92ed98a585Andrew Sapperstein
1929d6eaacbb9eb56763d38a3815fc509b92ed98a585Andrew Sapperstein    Arg *A;
1930d6eaacbb9eb56763d38a3815fc509b92ed98a585Andrew Sapperstein    if ((A = Args.getLastArg(options::OPT_bundle)) ||
1931d6eaacbb9eb56763d38a3815fc509b92ed98a585Andrew Sapperstein        (A = Args.getLastArg(options::OPT_bundle__loader)) ||
1932d6eaacbb9eb56763d38a3815fc509b92ed98a585Andrew Sapperstein        (A = Args.getLastArg(options::OPT_client__name)) ||
1933d6eaacbb9eb56763d38a3815fc509b92ed98a585Andrew Sapperstein        (A = Args.getLastArg(options::OPT_force__flat__namespace)) ||
1934d6eaacbb9eb56763d38a3815fc509b92ed98a585Andrew Sapperstein        (A = Args.getLastArg(options::OPT_keep__private__externs)) ||
1935d6eaacbb9eb56763d38a3815fc509b92ed98a585Andrew Sapperstein        (A = Args.getLastArg(options::OPT_private__bundle)))
19366ba612efffba42bec102ac58a1540496158f747eAndrew Sapperstein      D.Diag(clang::diag::err_drv_argument_not_allowed_with)
19376ba612efffba42bec102ac58a1540496158f747eAndrew Sapperstein        << A->getAsString(Args) << "-dynamiclib";
1938d6eaacbb9eb56763d38a3815fc509b92ed98a585Andrew Sapperstein
1939d6eaacbb9eb56763d38a3815fc509b92ed98a585Andrew Sapperstein    Args.AddAllArgsTranslated(CmdArgs, options::OPT_compatibility__version,
1940d6eaacbb9eb56763d38a3815fc509b92ed98a585Andrew Sapperstein                              "-dylib_compatibility_version");
1941d6eaacbb9eb56763d38a3815fc509b92ed98a585Andrew Sapperstein    Args.AddAllArgsTranslated(CmdArgs, options::OPT_current__version,
1942d6eaacbb9eb56763d38a3815fc509b92ed98a585Andrew Sapperstein                              "-dylib_current_version");
1943d6eaacbb9eb56763d38a3815fc509b92ed98a585Andrew Sapperstein
1944d6eaacbb9eb56763d38a3815fc509b92ed98a585Andrew Sapperstein    if (Args.hasArg(options::OPT_force__cpusubtype__ALL)) {
1945d6eaacbb9eb56763d38a3815fc509b92ed98a585Andrew Sapperstein      AddDarwinArch(Args, CmdArgs);
1946d6eaacbb9eb56763d38a3815fc509b92ed98a585Andrew Sapperstein      // NOTE: We don't add -force_cpusubtype_ALL on this path. Ok.
1947d6eaacbb9eb56763d38a3815fc509b92ed98a585Andrew Sapperstein    } else
1948d6eaacbb9eb56763d38a3815fc509b92ed98a585Andrew Sapperstein      AddDarwinSubArch(Args, CmdArgs);
1949d6eaacbb9eb56763d38a3815fc509b92ed98a585Andrew Sapperstein
1950d6eaacbb9eb56763d38a3815fc509b92ed98a585Andrew Sapperstein    Args.AddAllArgsTranslated(CmdArgs, options::OPT_install__name,
1951d6eaacbb9eb56763d38a3815fc509b92ed98a585Andrew Sapperstein                              "-dylib_install_name");
1952d6eaacbb9eb56763d38a3815fc509b92ed98a585Andrew Sapperstein  }
1953d6eaacbb9eb56763d38a3815fc509b92ed98a585Andrew Sapperstein
1954d6eaacbb9eb56763d38a3815fc509b92ed98a585Andrew Sapperstein  Args.AddLastArg(CmdArgs, options::OPT_all__load);
1955d6eaacbb9eb56763d38a3815fc509b92ed98a585Andrew Sapperstein  Args.AddAllArgs(CmdArgs, options::OPT_allowable__client);
1956d6eaacbb9eb56763d38a3815fc509b92ed98a585Andrew Sapperstein  Args.AddLastArg(CmdArgs, options::OPT_bind__at__load);
19576ba612efffba42bec102ac58a1540496158f747eAndrew Sapperstein  if (getDarwinToolChain().isIPhoneOS())
19586ba612efffba42bec102ac58a1540496158f747eAndrew Sapperstein    Args.AddLastArg(CmdArgs, options::OPT_arch__errors__fatal);
1959d6eaacbb9eb56763d38a3815fc509b92ed98a585Andrew Sapperstein  Args.AddLastArg(CmdArgs, options::OPT_dead__strip);
1960d6eaacbb9eb56763d38a3815fc509b92ed98a585Andrew Sapperstein  Args.AddLastArg(CmdArgs, options::OPT_no__dead__strip__inits__and__terms);
1961d6eaacbb9eb56763d38a3815fc509b92ed98a585Andrew Sapperstein  Args.AddAllArgs(CmdArgs, options::OPT_dylib__file);
1962d6eaacbb9eb56763d38a3815fc509b92ed98a585Andrew Sapperstein  Args.AddLastArg(CmdArgs, options::OPT_dynamic);
1963d6eaacbb9eb56763d38a3815fc509b92ed98a585Andrew Sapperstein  Args.AddAllArgs(CmdArgs, options::OPT_exported__symbols__list);
1964d6eaacbb9eb56763d38a3815fc509b92ed98a585Andrew Sapperstein  Args.AddLastArg(CmdArgs, options::OPT_flat__namespace);
1965d6eaacbb9eb56763d38a3815fc509b92ed98a585Andrew Sapperstein  Args.AddAllArgs(CmdArgs, options::OPT_headerpad__max__install__names);
1966d6eaacbb9eb56763d38a3815fc509b92ed98a585Andrew Sapperstein  Args.AddAllArgs(CmdArgs, options::OPT_image__base);
1967d6eaacbb9eb56763d38a3815fc509b92ed98a585Andrew Sapperstein  Args.AddAllArgs(CmdArgs, options::OPT_init);
1968d6eaacbb9eb56763d38a3815fc509b92ed98a585Andrew Sapperstein
1969d6eaacbb9eb56763d38a3815fc509b92ed98a585Andrew Sapperstein  if (!Args.hasArg(options::OPT_mmacosx_version_min_EQ) &&
1970d6eaacbb9eb56763d38a3815fc509b92ed98a585Andrew Sapperstein      !Args.hasArg(options::OPT_miphoneos_version_min_EQ)) {
1971d6eaacbb9eb56763d38a3815fc509b92ed98a585Andrew Sapperstein    // Add default version min.
1972d6eaacbb9eb56763d38a3815fc509b92ed98a585Andrew Sapperstein    if (!getDarwinToolChain().isIPhoneOS()) {
1973d6eaacbb9eb56763d38a3815fc509b92ed98a585Andrew Sapperstein      CmdArgs.push_back("-macosx_version_min");
1974d6eaacbb9eb56763d38a3815fc509b92ed98a585Andrew Sapperstein      CmdArgs.push_back(getDarwinToolChain().getMacosxVersionStr());
1975d6eaacbb9eb56763d38a3815fc509b92ed98a585Andrew Sapperstein    } else {
1976d6eaacbb9eb56763d38a3815fc509b92ed98a585Andrew Sapperstein      CmdArgs.push_back("-iphoneos_version_min");
1977d6eaacbb9eb56763d38a3815fc509b92ed98a585Andrew Sapperstein      CmdArgs.push_back(getDarwinToolChain().getIPhoneOSVersionStr());
19786ba612efffba42bec102ac58a1540496158f747eAndrew Sapperstein    }
19796ba612efffba42bec102ac58a1540496158f747eAndrew Sapperstein  }
1980d6eaacbb9eb56763d38a3815fc509b92ed98a585Andrew Sapperstein
1981d6eaacbb9eb56763d38a3815fc509b92ed98a585Andrew Sapperstein  // Adding all arguments doesn't make sense here but this is what
1982d6eaacbb9eb56763d38a3815fc509b92ed98a585Andrew Sapperstein  // gcc does.
1983d6eaacbb9eb56763d38a3815fc509b92ed98a585Andrew Sapperstein  Args.AddAllArgsTranslated(CmdArgs, options::OPT_mmacosx_version_min_EQ,
1984d6eaacbb9eb56763d38a3815fc509b92ed98a585Andrew Sapperstein                            "-macosx_version_min");
1985d6eaacbb9eb56763d38a3815fc509b92ed98a585Andrew Sapperstein  Args.AddAllArgsTranslated(CmdArgs, options::OPT_miphoneos_version_min_EQ,
1986d6eaacbb9eb56763d38a3815fc509b92ed98a585Andrew Sapperstein                            "-iphoneos_version_min");
1987d6eaacbb9eb56763d38a3815fc509b92ed98a585Andrew Sapperstein  Args.AddLastArg(CmdArgs, options::OPT_nomultidefs);
1988d6eaacbb9eb56763d38a3815fc509b92ed98a585Andrew Sapperstein  Args.AddLastArg(CmdArgs, options::OPT_multi__module);
1989d6eaacbb9eb56763d38a3815fc509b92ed98a585Andrew Sapperstein  Args.AddLastArg(CmdArgs, options::OPT_single__module);
1990d6eaacbb9eb56763d38a3815fc509b92ed98a585Andrew Sapperstein  Args.AddAllArgs(CmdArgs, options::OPT_multiply__defined);
1991d6eaacbb9eb56763d38a3815fc509b92ed98a585Andrew Sapperstein  Args.AddAllArgs(CmdArgs, options::OPT_multiply__defined__unused);
1992d6eaacbb9eb56763d38a3815fc509b92ed98a585Andrew Sapperstein
1993d6eaacbb9eb56763d38a3815fc509b92ed98a585Andrew Sapperstein  if (Args.hasArg(options::OPT_fpie))
1994d6eaacbb9eb56763d38a3815fc509b92ed98a585Andrew Sapperstein    CmdArgs.push_back("-pie");
1995d6eaacbb9eb56763d38a3815fc509b92ed98a585Andrew Sapperstein
1996d6eaacbb9eb56763d38a3815fc509b92ed98a585Andrew Sapperstein  Args.AddLastArg(CmdArgs, options::OPT_prebind);
1997d6eaacbb9eb56763d38a3815fc509b92ed98a585Andrew Sapperstein  Args.AddLastArg(CmdArgs, options::OPT_noprebind);
1998d6eaacbb9eb56763d38a3815fc509b92ed98a585Andrew Sapperstein  Args.AddLastArg(CmdArgs, options::OPT_nofixprebinding);
19996ba612efffba42bec102ac58a1540496158f747eAndrew Sapperstein  Args.AddLastArg(CmdArgs, options::OPT_prebind__all__twolevel__modules);
20006ba612efffba42bec102ac58a1540496158f747eAndrew Sapperstein  Args.AddLastArg(CmdArgs, options::OPT_read__only__relocs);
2001d6eaacbb9eb56763d38a3815fc509b92ed98a585Andrew Sapperstein  Args.AddAllArgs(CmdArgs, options::OPT_sectcreate);
2002d6eaacbb9eb56763d38a3815fc509b92ed98a585Andrew Sapperstein  Args.AddAllArgs(CmdArgs, options::OPT_sectorder);
2003d6eaacbb9eb56763d38a3815fc509b92ed98a585Andrew Sapperstein  Args.AddAllArgs(CmdArgs, options::OPT_seg1addr);
2004d6eaacbb9eb56763d38a3815fc509b92ed98a585Andrew Sapperstein  Args.AddAllArgs(CmdArgs, options::OPT_segprot);
2005d6eaacbb9eb56763d38a3815fc509b92ed98a585Andrew Sapperstein  Args.AddAllArgs(CmdArgs, options::OPT_segaddr);
2006d6eaacbb9eb56763d38a3815fc509b92ed98a585Andrew Sapperstein  Args.AddAllArgs(CmdArgs, options::OPT_segs__read__only__addr);
2007d6eaacbb9eb56763d38a3815fc509b92ed98a585Andrew Sapperstein  Args.AddAllArgs(CmdArgs, options::OPT_segs__read__write__addr);
2008d6eaacbb9eb56763d38a3815fc509b92ed98a585Andrew Sapperstein  Args.AddAllArgs(CmdArgs, options::OPT_seg__addr__table);
2009d6eaacbb9eb56763d38a3815fc509b92ed98a585Andrew Sapperstein  Args.AddAllArgs(CmdArgs, options::OPT_seg__addr__table__filename);
2010d6eaacbb9eb56763d38a3815fc509b92ed98a585Andrew Sapperstein  Args.AddAllArgs(CmdArgs, options::OPT_sub__library);
2011d6eaacbb9eb56763d38a3815fc509b92ed98a585Andrew Sapperstein  Args.AddAllArgs(CmdArgs, options::OPT_sub__umbrella);
2012d6eaacbb9eb56763d38a3815fc509b92ed98a585Andrew Sapperstein
2013d6eaacbb9eb56763d38a3815fc509b92ed98a585Andrew Sapperstein  Args.AddAllArgsTranslated(CmdArgs, options::OPT_isysroot, "-syslibroot");
2014d6eaacbb9eb56763d38a3815fc509b92ed98a585Andrew Sapperstein  if (getDarwinToolChain().isIPhoneOS()) {
2015d6eaacbb9eb56763d38a3815fc509b92ed98a585Andrew Sapperstein    if (!Args.hasArg(options::OPT_isysroot)) {
2016d6eaacbb9eb56763d38a3815fc509b92ed98a585Andrew Sapperstein      CmdArgs.push_back("-syslibroot");
2017d6eaacbb9eb56763d38a3815fc509b92ed98a585Andrew Sapperstein      CmdArgs.push_back("/Developer/SDKs/Extra");
2018d6eaacbb9eb56763d38a3815fc509b92ed98a585Andrew Sapperstein    }
2019d6eaacbb9eb56763d38a3815fc509b92ed98a585Andrew Sapperstein  }
20206ba612efffba42bec102ac58a1540496158f747eAndrew Sapperstein
20216ba612efffba42bec102ac58a1540496158f747eAndrew Sapperstein  Args.AddLastArg(CmdArgs, options::OPT_twolevel__namespace);
2022d6eaacbb9eb56763d38a3815fc509b92ed98a585Andrew Sapperstein  Args.AddLastArg(CmdArgs, options::OPT_twolevel__namespace__hints);
2023d6eaacbb9eb56763d38a3815fc509b92ed98a585Andrew Sapperstein  Args.AddAllArgs(CmdArgs, options::OPT_umbrella);
2024d6eaacbb9eb56763d38a3815fc509b92ed98a585Andrew Sapperstein  Args.AddAllArgs(CmdArgs, options::OPT_undefined);
2025d6eaacbb9eb56763d38a3815fc509b92ed98a585Andrew Sapperstein  Args.AddAllArgs(CmdArgs, options::OPT_unexported__symbols__list);
2026d6eaacbb9eb56763d38a3815fc509b92ed98a585Andrew Sapperstein
2027d6eaacbb9eb56763d38a3815fc509b92ed98a585Andrew Sapperstein  Args.AddAllArgs(CmdArgs, options::OPT_weak__reference__mismatches);
2028d6eaacbb9eb56763d38a3815fc509b92ed98a585Andrew Sapperstein  if (!Args.hasArg(options::OPT_weak__reference__mismatches)) {
2029d6eaacbb9eb56763d38a3815fc509b92ed98a585Andrew Sapperstein    CmdArgs.push_back("-weak_reference_mismatches");
2030d6eaacbb9eb56763d38a3815fc509b92ed98a585Andrew Sapperstein    CmdArgs.push_back("non-weak");
2031d6eaacbb9eb56763d38a3815fc509b92ed98a585Andrew Sapperstein  }
2032d6eaacbb9eb56763d38a3815fc509b92ed98a585Andrew Sapperstein
2033d6eaacbb9eb56763d38a3815fc509b92ed98a585Andrew Sapperstein  Args.AddLastArg(CmdArgs, options::OPT_X_Flag);
2034d6eaacbb9eb56763d38a3815fc509b92ed98a585Andrew Sapperstein  Args.AddAllArgs(CmdArgs, options::OPT_y);
2035d6eaacbb9eb56763d38a3815fc509b92ed98a585Andrew Sapperstein  Args.AddLastArg(CmdArgs, options::OPT_w);
2036d6eaacbb9eb56763d38a3815fc509b92ed98a585Andrew Sapperstein  Args.AddAllArgs(CmdArgs, options::OPT_pagezero__size);
2037d6eaacbb9eb56763d38a3815fc509b92ed98a585Andrew Sapperstein  Args.AddAllArgs(CmdArgs, options::OPT_segs__read__);
2038d6eaacbb9eb56763d38a3815fc509b92ed98a585Andrew Sapperstein  Args.AddLastArg(CmdArgs, options::OPT_seglinkedit);
2039d6eaacbb9eb56763d38a3815fc509b92ed98a585Andrew Sapperstein  Args.AddLastArg(CmdArgs, options::OPT_noseglinkedit);
2040d6eaacbb9eb56763d38a3815fc509b92ed98a585Andrew Sapperstein  Args.AddAllArgs(CmdArgs, options::OPT_sectalign);
20416ba612efffba42bec102ac58a1540496158f747eAndrew Sapperstein  Args.AddAllArgs(CmdArgs, options::OPT_sectobjectsymbols);
20426ba612efffba42bec102ac58a1540496158f747eAndrew Sapperstein  Args.AddAllArgs(CmdArgs, options::OPT_segcreate);
2043d6eaacbb9eb56763d38a3815fc509b92ed98a585Andrew Sapperstein  Args.AddLastArg(CmdArgs, options::OPT_whyload);
2044d6eaacbb9eb56763d38a3815fc509b92ed98a585Andrew Sapperstein  Args.AddLastArg(CmdArgs, options::OPT_whatsloaded);
2045d6eaacbb9eb56763d38a3815fc509b92ed98a585Andrew Sapperstein  Args.AddAllArgs(CmdArgs, options::OPT_dylinker__install__name);
2046d6eaacbb9eb56763d38a3815fc509b92ed98a585Andrew Sapperstein  Args.AddLastArg(CmdArgs, options::OPT_dylinker);
2047d6eaacbb9eb56763d38a3815fc509b92ed98a585Andrew Sapperstein  Args.AddLastArg(CmdArgs, options::OPT_Mach);
2048d6eaacbb9eb56763d38a3815fc509b92ed98a585Andrew Sapperstein}
2049d6eaacbb9eb56763d38a3815fc509b92ed98a585Andrew Sapperstein
2050d6eaacbb9eb56763d38a3815fc509b92ed98a585Andrew Sappersteinvoid darwin::Link::ConstructJob(Compilation &C, const JobAction &JA,
2051d6eaacbb9eb56763d38a3815fc509b92ed98a585Andrew Sapperstein                                Job &Dest, const InputInfo &Output,
2052d6eaacbb9eb56763d38a3815fc509b92ed98a585Andrew Sapperstein                                const InputInfoList &Inputs,
2053d6eaacbb9eb56763d38a3815fc509b92ed98a585Andrew Sapperstein                                const ArgList &Args,
2054d6eaacbb9eb56763d38a3815fc509b92ed98a585Andrew Sapperstein                                const char *LinkingOutput) const {
2055d6eaacbb9eb56763d38a3815fc509b92ed98a585Andrew Sapperstein  assert(Output.getType() == types::TY_Image && "Invalid linker output type.");
2056d6eaacbb9eb56763d38a3815fc509b92ed98a585Andrew Sapperstein
2057d6eaacbb9eb56763d38a3815fc509b92ed98a585Andrew Sapperstein  // The logic here is derived from gcc's behavior; most of which
2058d6eaacbb9eb56763d38a3815fc509b92ed98a585Andrew Sapperstein  // comes from specs (starting with link_command). Consult gcc for
2059d6eaacbb9eb56763d38a3815fc509b92ed98a585Andrew Sapperstein  // more information.
2060d6eaacbb9eb56763d38a3815fc509b92ed98a585Andrew Sapperstein  ArgStringList CmdArgs;
2061d6eaacbb9eb56763d38a3815fc509b92ed98a585Andrew Sapperstein
20626ba612efffba42bec102ac58a1540496158f747eAndrew Sapperstein  // I'm not sure why this particular decomposition exists in gcc, but
20636ba612efffba42bec102ac58a1540496158f747eAndrew Sapperstein  // we follow suite for ease of comparison.
2064d6eaacbb9eb56763d38a3815fc509b92ed98a585Andrew Sapperstein  AddLinkArgs(Args, CmdArgs);
2065d6eaacbb9eb56763d38a3815fc509b92ed98a585Andrew Sapperstein
2066d6eaacbb9eb56763d38a3815fc509b92ed98a585Andrew Sapperstein  Args.AddAllArgs(CmdArgs, options::OPT_d_Flag);
2067d6eaacbb9eb56763d38a3815fc509b92ed98a585Andrew Sapperstein  Args.AddAllArgs(CmdArgs, options::OPT_s);
2068d6eaacbb9eb56763d38a3815fc509b92ed98a585Andrew Sapperstein  Args.AddAllArgs(CmdArgs, options::OPT_t);
2069d6eaacbb9eb56763d38a3815fc509b92ed98a585Andrew Sapperstein  Args.AddAllArgs(CmdArgs, options::OPT_Z_Flag);
2070d6eaacbb9eb56763d38a3815fc509b92ed98a585Andrew Sapperstein  Args.AddAllArgs(CmdArgs, options::OPT_u_Group);
2071d6eaacbb9eb56763d38a3815fc509b92ed98a585Andrew Sapperstein  Args.AddAllArgs(CmdArgs, options::OPT_A);
2072d6eaacbb9eb56763d38a3815fc509b92ed98a585Andrew Sapperstein  Args.AddLastArg(CmdArgs, options::OPT_e);
2073d6eaacbb9eb56763d38a3815fc509b92ed98a585Andrew Sapperstein  Args.AddAllArgs(CmdArgs, options::OPT_m_Separate);
2074d6eaacbb9eb56763d38a3815fc509b92ed98a585Andrew Sapperstein  Args.AddAllArgs(CmdArgs, options::OPT_r);
2075d6eaacbb9eb56763d38a3815fc509b92ed98a585Andrew Sapperstein
2076d6eaacbb9eb56763d38a3815fc509b92ed98a585Andrew Sapperstein  CmdArgs.push_back("-o");
2077d6eaacbb9eb56763d38a3815fc509b92ed98a585Andrew Sapperstein  CmdArgs.push_back(Output.getFilename());
2078d6eaacbb9eb56763d38a3815fc509b92ed98a585Andrew Sapperstein
2079d6eaacbb9eb56763d38a3815fc509b92ed98a585Andrew Sapperstein
2080d6eaacbb9eb56763d38a3815fc509b92ed98a585Andrew Sapperstein  unsigned MacosxVersionMin[3];
2081d6eaacbb9eb56763d38a3815fc509b92ed98a585Andrew Sapperstein  getDarwinToolChain().getMacosxVersionMin(Args, MacosxVersionMin);
2082d6eaacbb9eb56763d38a3815fc509b92ed98a585Andrew Sapperstein
20836ba612efffba42bec102ac58a1540496158f747eAndrew Sapperstein  if (!Args.hasArg(options::OPT_A) &&
20846ba612efffba42bec102ac58a1540496158f747eAndrew Sapperstein      !Args.hasArg(options::OPT_nostdlib) &&
2085d6eaacbb9eb56763d38a3815fc509b92ed98a585Andrew Sapperstein      !Args.hasArg(options::OPT_nostartfiles)) {
2086d6eaacbb9eb56763d38a3815fc509b92ed98a585Andrew Sapperstein    // Derived from startfile spec.
2087d6eaacbb9eb56763d38a3815fc509b92ed98a585Andrew Sapperstein    if (Args.hasArg(options::OPT_dynamiclib)) {
2088d6eaacbb9eb56763d38a3815fc509b92ed98a585Andrew Sapperstein      // Derived from darwin_dylib1 spec.
2089d6eaacbb9eb56763d38a3815fc509b92ed98a585Andrew Sapperstein      if (getDarwinToolChain().isMacosxVersionLT(MacosxVersionMin, 10, 5))
2090d6eaacbb9eb56763d38a3815fc509b92ed98a585Andrew Sapperstein        CmdArgs.push_back("-ldylib1.o");
2091d6eaacbb9eb56763d38a3815fc509b92ed98a585Andrew Sapperstein      else if (getDarwinToolChain().isMacosxVersionLT(MacosxVersionMin, 10, 6))
2092d6eaacbb9eb56763d38a3815fc509b92ed98a585Andrew Sapperstein        CmdArgs.push_back("-ldylib1.10.5.o");
2093d6eaacbb9eb56763d38a3815fc509b92ed98a585Andrew Sapperstein    } else {
2094d6eaacbb9eb56763d38a3815fc509b92ed98a585Andrew Sapperstein      if (Args.hasArg(options::OPT_bundle)) {
2095d6eaacbb9eb56763d38a3815fc509b92ed98a585Andrew Sapperstein        if (!Args.hasArg(options::OPT_static)) {
2096d6eaacbb9eb56763d38a3815fc509b92ed98a585Andrew Sapperstein          // Derived from darwin_bundle1 spec.
2097d6eaacbb9eb56763d38a3815fc509b92ed98a585Andrew Sapperstein          if (getDarwinToolChain().isMacosxVersionLT(MacosxVersionMin, 10, 6))
2098d6eaacbb9eb56763d38a3815fc509b92ed98a585Andrew Sapperstein            CmdArgs.push_back("-lbundle1.o");
2099d6eaacbb9eb56763d38a3815fc509b92ed98a585Andrew Sapperstein        }
2100d6eaacbb9eb56763d38a3815fc509b92ed98a585Andrew Sapperstein      } else {
2101d6eaacbb9eb56763d38a3815fc509b92ed98a585Andrew Sapperstein        if (Args.hasArg(options::OPT_pg)) {
2102d6eaacbb9eb56763d38a3815fc509b92ed98a585Andrew Sapperstein          if (Args.hasArg(options::OPT_static) ||
2103d6eaacbb9eb56763d38a3815fc509b92ed98a585Andrew Sapperstein              Args.hasArg(options::OPT_object) ||
21046ba612efffba42bec102ac58a1540496158f747eAndrew Sapperstein              Args.hasArg(options::OPT_preload)) {
21056ba612efffba42bec102ac58a1540496158f747eAndrew Sapperstein            CmdArgs.push_back("-lgcrt0.o");
2106d6eaacbb9eb56763d38a3815fc509b92ed98a585Andrew Sapperstein          } else {
2107d6eaacbb9eb56763d38a3815fc509b92ed98a585Andrew Sapperstein            CmdArgs.push_back("-lgcrt1.o");
2108d6eaacbb9eb56763d38a3815fc509b92ed98a585Andrew Sapperstein
2109d6eaacbb9eb56763d38a3815fc509b92ed98a585Andrew Sapperstein            // darwin_crt2 spec is empty.
2110d6eaacbb9eb56763d38a3815fc509b92ed98a585Andrew Sapperstein          }
2111d6eaacbb9eb56763d38a3815fc509b92ed98a585Andrew Sapperstein        } else {
2112d6eaacbb9eb56763d38a3815fc509b92ed98a585Andrew Sapperstein          if (Args.hasArg(options::OPT_static) ||
2113d6eaacbb9eb56763d38a3815fc509b92ed98a585Andrew Sapperstein              Args.hasArg(options::OPT_object) ||
2114d6eaacbb9eb56763d38a3815fc509b92ed98a585Andrew Sapperstein              Args.hasArg(options::OPT_preload)) {
2115d6eaacbb9eb56763d38a3815fc509b92ed98a585Andrew Sapperstein            CmdArgs.push_back("-lcrt0.o");
2116d6eaacbb9eb56763d38a3815fc509b92ed98a585Andrew Sapperstein          } else {
2117d6eaacbb9eb56763d38a3815fc509b92ed98a585Andrew Sapperstein            // Derived from darwin_crt1 spec.
2118d6eaacbb9eb56763d38a3815fc509b92ed98a585Andrew Sapperstein            if (getDarwinToolChain().isIPhoneOS()) {
2119d6eaacbb9eb56763d38a3815fc509b92ed98a585Andrew Sapperstein              CmdArgs.push_back("-lcrt1.o");
2120d6eaacbb9eb56763d38a3815fc509b92ed98a585Andrew Sapperstein            } else if (getDarwinToolChain().isMacosxVersionLT(MacosxVersionMin,
2121d6eaacbb9eb56763d38a3815fc509b92ed98a585Andrew Sapperstein                                                              10, 5))
2122d6eaacbb9eb56763d38a3815fc509b92ed98a585Andrew Sapperstein              CmdArgs.push_back("-lcrt1.o");
2123d6eaacbb9eb56763d38a3815fc509b92ed98a585Andrew Sapperstein            else if (getDarwinToolChain().isMacosxVersionLT(MacosxVersionMin,
2124d6eaacbb9eb56763d38a3815fc509b92ed98a585Andrew Sapperstein                                                            10, 6))
21256ba612efffba42bec102ac58a1540496158f747eAndrew Sapperstein              CmdArgs.push_back("-lcrt1.10.5.o");
21266ba612efffba42bec102ac58a1540496158f747eAndrew Sapperstein            else
2127d6eaacbb9eb56763d38a3815fc509b92ed98a585Andrew Sapperstein              CmdArgs.push_back("-lcrt1.10.6.o");
2128d6eaacbb9eb56763d38a3815fc509b92ed98a585Andrew Sapperstein
2129d6eaacbb9eb56763d38a3815fc509b92ed98a585Andrew Sapperstein            // darwin_crt2 spec is empty.
2130d6eaacbb9eb56763d38a3815fc509b92ed98a585Andrew Sapperstein          }
2131d6eaacbb9eb56763d38a3815fc509b92ed98a585Andrew Sapperstein        }
2132d6eaacbb9eb56763d38a3815fc509b92ed98a585Andrew Sapperstein      }
2133d6eaacbb9eb56763d38a3815fc509b92ed98a585Andrew Sapperstein    }
2134d6eaacbb9eb56763d38a3815fc509b92ed98a585Andrew Sapperstein
2135d6eaacbb9eb56763d38a3815fc509b92ed98a585Andrew Sapperstein    if (Args.hasArg(options::OPT_shared_libgcc) &&
2136d6eaacbb9eb56763d38a3815fc509b92ed98a585Andrew Sapperstein        !Args.hasArg(options::OPT_miphoneos_version_min_EQ) &&
2137d6eaacbb9eb56763d38a3815fc509b92ed98a585Andrew Sapperstein        getDarwinToolChain().isMacosxVersionLT(MacosxVersionMin, 10, 5)) {
2138d6eaacbb9eb56763d38a3815fc509b92ed98a585Andrew Sapperstein      const char *Str =
2139d6eaacbb9eb56763d38a3815fc509b92ed98a585Andrew Sapperstein        Args.MakeArgString(getToolChain().GetFilePath(C, "crt3.o"));
2140d6eaacbb9eb56763d38a3815fc509b92ed98a585Andrew Sapperstein      CmdArgs.push_back(Str);
2141d6eaacbb9eb56763d38a3815fc509b92ed98a585Andrew Sapperstein    }
2142d6eaacbb9eb56763d38a3815fc509b92ed98a585Andrew Sapperstein  }
2143d6eaacbb9eb56763d38a3815fc509b92ed98a585Andrew Sapperstein
2144d6eaacbb9eb56763d38a3815fc509b92ed98a585Andrew Sapperstein  Args.AddAllArgs(CmdArgs, options::OPT_L);
2145d6eaacbb9eb56763d38a3815fc509b92ed98a585Andrew Sapperstein
21466ba612efffba42bec102ac58a1540496158f747eAndrew Sapperstein  if (Args.hasArg(options::OPT_fopenmp))
21476ba612efffba42bec102ac58a1540496158f747eAndrew Sapperstein    // This is more complicated in gcc...
2148d6eaacbb9eb56763d38a3815fc509b92ed98a585Andrew Sapperstein    CmdArgs.push_back("-lgomp");
2149d6eaacbb9eb56763d38a3815fc509b92ed98a585Andrew Sapperstein
2150d6eaacbb9eb56763d38a3815fc509b92ed98a585Andrew Sapperstein  getDarwinToolChain().AddLinkSearchPathArgs(Args, CmdArgs);
2151d6eaacbb9eb56763d38a3815fc509b92ed98a585Andrew Sapperstein
2152d6eaacbb9eb56763d38a3815fc509b92ed98a585Andrew Sapperstein  for (InputInfoList::const_iterator
2153d6eaacbb9eb56763d38a3815fc509b92ed98a585Andrew Sapperstein         it = Inputs.begin(), ie = Inputs.end(); it != ie; ++it) {
2154d6eaacbb9eb56763d38a3815fc509b92ed98a585Andrew Sapperstein    const InputInfo &II = *it;
2155d6eaacbb9eb56763d38a3815fc509b92ed98a585Andrew Sapperstein    if (II.isFilename())
2156d6eaacbb9eb56763d38a3815fc509b92ed98a585Andrew Sapperstein      CmdArgs.push_back(II.getFilename());
2157d6eaacbb9eb56763d38a3815fc509b92ed98a585Andrew Sapperstein    else
2158d6eaacbb9eb56763d38a3815fc509b92ed98a585Andrew Sapperstein      II.getInputArg().renderAsInput(Args, CmdArgs);
2159d6eaacbb9eb56763d38a3815fc509b92ed98a585Andrew Sapperstein  }
2160d6eaacbb9eb56763d38a3815fc509b92ed98a585Andrew Sapperstein
2161d6eaacbb9eb56763d38a3815fc509b92ed98a585Andrew Sapperstein  if (LinkingOutput) {
2162d6eaacbb9eb56763d38a3815fc509b92ed98a585Andrew Sapperstein    CmdArgs.push_back("-arch_multiple");
2163d6eaacbb9eb56763d38a3815fc509b92ed98a585Andrew Sapperstein    CmdArgs.push_back("-final_output");
2164d6eaacbb9eb56763d38a3815fc509b92ed98a585Andrew Sapperstein    CmdArgs.push_back(LinkingOutput);
2165d6eaacbb9eb56763d38a3815fc509b92ed98a585Andrew Sapperstein  }
2166d6eaacbb9eb56763d38a3815fc509b92ed98a585Andrew Sapperstein
21676ba612efffba42bec102ac58a1540496158f747eAndrew Sapperstein  if (Args.hasArg(options::OPT_fprofile_arcs) ||
21686ba612efffba42bec102ac58a1540496158f747eAndrew Sapperstein      Args.hasArg(options::OPT_fprofile_generate) ||
2169d6eaacbb9eb56763d38a3815fc509b92ed98a585Andrew Sapperstein      Args.hasArg(options::OPT_fcreate_profile) ||
2170d6eaacbb9eb56763d38a3815fc509b92ed98a585Andrew Sapperstein      Args.hasArg(options::OPT_coverage))
2171d6eaacbb9eb56763d38a3815fc509b92ed98a585Andrew Sapperstein    CmdArgs.push_back("-lgcov");
2172d6eaacbb9eb56763d38a3815fc509b92ed98a585Andrew Sapperstein
2173d6eaacbb9eb56763d38a3815fc509b92ed98a585Andrew Sapperstein  if (Args.hasArg(options::OPT_fnested_functions))
2174d6eaacbb9eb56763d38a3815fc509b92ed98a585Andrew Sapperstein    CmdArgs.push_back("-allow_stack_execute");
2175d6eaacbb9eb56763d38a3815fc509b92ed98a585Andrew Sapperstein
2176d6eaacbb9eb56763d38a3815fc509b92ed98a585Andrew Sapperstein  if (!Args.hasArg(options::OPT_nostdlib) &&
2177d6eaacbb9eb56763d38a3815fc509b92ed98a585Andrew Sapperstein      !Args.hasArg(options::OPT_nodefaultlibs)) {
2178d6eaacbb9eb56763d38a3815fc509b92ed98a585Andrew Sapperstein    // FIXME: g++ is more complicated here, it tries to put -lstdc++
2179d6eaacbb9eb56763d38a3815fc509b92ed98a585Andrew Sapperstein    // before -lm, for example.
2180d6eaacbb9eb56763d38a3815fc509b92ed98a585Andrew Sapperstein    if (getToolChain().getHost().getDriver().CCCIsCXX)
2181d6eaacbb9eb56763d38a3815fc509b92ed98a585Andrew Sapperstein      CmdArgs.push_back("-lstdc++");
2182d6eaacbb9eb56763d38a3815fc509b92ed98a585Andrew Sapperstein
2183d6eaacbb9eb56763d38a3815fc509b92ed98a585Andrew Sapperstein    // link_ssp spec is empty.
2184d6eaacbb9eb56763d38a3815fc509b92ed98a585Andrew Sapperstein
2185d6eaacbb9eb56763d38a3815fc509b92ed98a585Andrew Sapperstein    // Let the tool chain choose which runtime library to link.
2186d6eaacbb9eb56763d38a3815fc509b92ed98a585Andrew Sapperstein    getDarwinToolChain().AddLinkRuntimeLibArgs(Args, CmdArgs);
2187d6eaacbb9eb56763d38a3815fc509b92ed98a585Andrew Sapperstein  }
21886ba612efffba42bec102ac58a1540496158f747eAndrew Sapperstein
21896ba612efffba42bec102ac58a1540496158f747eAndrew Sapperstein  if (!Args.hasArg(options::OPT_A) &&
2190d6eaacbb9eb56763d38a3815fc509b92ed98a585Andrew Sapperstein      !Args.hasArg(options::OPT_nostdlib) &&
2191d6eaacbb9eb56763d38a3815fc509b92ed98a585Andrew Sapperstein      !Args.hasArg(options::OPT_nostartfiles)) {
2192d6eaacbb9eb56763d38a3815fc509b92ed98a585Andrew Sapperstein    // endfile_spec is empty.
2193d6eaacbb9eb56763d38a3815fc509b92ed98a585Andrew Sapperstein  }
2194d6eaacbb9eb56763d38a3815fc509b92ed98a585Andrew Sapperstein
2195d6eaacbb9eb56763d38a3815fc509b92ed98a585Andrew Sapperstein  Args.AddAllArgs(CmdArgs, options::OPT_T_Group);
2196d6eaacbb9eb56763d38a3815fc509b92ed98a585Andrew Sapperstein  Args.AddAllArgs(CmdArgs, options::OPT_F);
2197d6eaacbb9eb56763d38a3815fc509b92ed98a585Andrew Sapperstein
2198d6eaacbb9eb56763d38a3815fc509b92ed98a585Andrew Sapperstein  const char *Exec =
2199d6eaacbb9eb56763d38a3815fc509b92ed98a585Andrew Sapperstein    Args.MakeArgString(getToolChain().GetProgramPath(C, "ld"));
2200d6eaacbb9eb56763d38a3815fc509b92ed98a585Andrew Sapperstein  Dest.addCommand(new Command(JA, *this, Exec, CmdArgs));
2201d6eaacbb9eb56763d38a3815fc509b92ed98a585Andrew Sapperstein
2202d6eaacbb9eb56763d38a3815fc509b92ed98a585Andrew Sapperstein  // Find the first non-empty base input (we want to ignore linker
2203d6eaacbb9eb56763d38a3815fc509b92ed98a585Andrew Sapperstein  // inputs).
2204d6eaacbb9eb56763d38a3815fc509b92ed98a585Andrew Sapperstein  const char *BaseInput = "";
2205d6eaacbb9eb56763d38a3815fc509b92ed98a585Andrew Sapperstein  for (unsigned i = 0, e = Inputs.size(); i != e; ++i) {
2206d6eaacbb9eb56763d38a3815fc509b92ed98a585Andrew Sapperstein    if (Inputs[i].getBaseInput()[0] != '\0') {
2207d6eaacbb9eb56763d38a3815fc509b92ed98a585Andrew Sapperstein      BaseInput = Inputs[i].getBaseInput();
2208d6eaacbb9eb56763d38a3815fc509b92ed98a585Andrew Sapperstein      break;
22096ba612efffba42bec102ac58a1540496158f747eAndrew Sapperstein    }
22106ba612efffba42bec102ac58a1540496158f747eAndrew Sapperstein  }
2211d6eaacbb9eb56763d38a3815fc509b92ed98a585Andrew Sapperstein
2212d6eaacbb9eb56763d38a3815fc509b92ed98a585Andrew Sapperstein  // Run dsymutil if we are making an executable in a single step.
2213d6eaacbb9eb56763d38a3815fc509b92ed98a585Andrew Sapperstein  //
2214d6eaacbb9eb56763d38a3815fc509b92ed98a585Andrew Sapperstein  // FIXME: Currently we don't want to do this when we are part of a
2215d6eaacbb9eb56763d38a3815fc509b92ed98a585Andrew Sapperstein  // universal build step, as this would end up creating stray temp
2216d6eaacbb9eb56763d38a3815fc509b92ed98a585Andrew Sapperstein  // files.
2217d6eaacbb9eb56763d38a3815fc509b92ed98a585Andrew Sapperstein  if (!LinkingOutput &&
2218d6eaacbb9eb56763d38a3815fc509b92ed98a585Andrew Sapperstein      Args.getLastArg(options::OPT_g_Group) &&
2219d6eaacbb9eb56763d38a3815fc509b92ed98a585Andrew Sapperstein      !Args.getLastArg(options::OPT_gstabs) &&
2220d6eaacbb9eb56763d38a3815fc509b92ed98a585Andrew Sapperstein      !Args.getLastArg(options::OPT_g0)) {
2221d6eaacbb9eb56763d38a3815fc509b92ed98a585Andrew Sapperstein    // FIXME: This is gross, but matches gcc. The test only considers
2222d6eaacbb9eb56763d38a3815fc509b92ed98a585Andrew Sapperstein    // the suffix (not the -x type), and then only of the first
2223d6eaacbb9eb56763d38a3815fc509b92ed98a585Andrew Sapperstein    // source input. Awesome.
2224d6eaacbb9eb56763d38a3815fc509b92ed98a585Andrew Sapperstein    const char *Suffix = strrchr(BaseInput, '.');
2225d6eaacbb9eb56763d38a3815fc509b92ed98a585Andrew Sapperstein    if (Suffix && isSourceSuffix(Suffix + 1)) {
2226d6eaacbb9eb56763d38a3815fc509b92ed98a585Andrew Sapperstein      const char *Exec =
2227d6eaacbb9eb56763d38a3815fc509b92ed98a585Andrew Sapperstein        Args.MakeArgString(getToolChain().GetProgramPath(C, "dsymutil"));
2228d6eaacbb9eb56763d38a3815fc509b92ed98a585Andrew Sapperstein      ArgStringList CmdArgs;
2229d6eaacbb9eb56763d38a3815fc509b92ed98a585Andrew Sapperstein      CmdArgs.push_back(Output.getFilename());
22306ba612efffba42bec102ac58a1540496158f747eAndrew Sapperstein      C.getJobs().addCommand(new Command(JA, *this, Exec, CmdArgs));
22316ba612efffba42bec102ac58a1540496158f747eAndrew Sapperstein    }
2232d6eaacbb9eb56763d38a3815fc509b92ed98a585Andrew Sapperstein  }
2233d6eaacbb9eb56763d38a3815fc509b92ed98a585Andrew Sapperstein}
2234d6eaacbb9eb56763d38a3815fc509b92ed98a585Andrew Sapperstein
2235d6eaacbb9eb56763d38a3815fc509b92ed98a585Andrew Sappersteinvoid darwin::Lipo::ConstructJob(Compilation &C, const JobAction &JA,
2236d6eaacbb9eb56763d38a3815fc509b92ed98a585Andrew Sapperstein                                Job &Dest, const InputInfo &Output,
2237d6eaacbb9eb56763d38a3815fc509b92ed98a585Andrew Sapperstein                                const InputInfoList &Inputs,
2238d6eaacbb9eb56763d38a3815fc509b92ed98a585Andrew Sapperstein                                const ArgList &Args,
2239d6eaacbb9eb56763d38a3815fc509b92ed98a585Andrew Sapperstein                                const char *LinkingOutput) const {
2240d6eaacbb9eb56763d38a3815fc509b92ed98a585Andrew Sapperstein  ArgStringList CmdArgs;
2241d6eaacbb9eb56763d38a3815fc509b92ed98a585Andrew Sapperstein
2242d6eaacbb9eb56763d38a3815fc509b92ed98a585Andrew Sapperstein  CmdArgs.push_back("-create");
2243d6eaacbb9eb56763d38a3815fc509b92ed98a585Andrew Sapperstein  assert(Output.isFilename() && "Unexpected lipo output.");
2244d6eaacbb9eb56763d38a3815fc509b92ed98a585Andrew Sapperstein
2245d6eaacbb9eb56763d38a3815fc509b92ed98a585Andrew Sapperstein  CmdArgs.push_back("-output");
2246d6eaacbb9eb56763d38a3815fc509b92ed98a585Andrew Sapperstein  CmdArgs.push_back(Output.getFilename());
2247d6eaacbb9eb56763d38a3815fc509b92ed98a585Andrew Sapperstein
2248d6eaacbb9eb56763d38a3815fc509b92ed98a585Andrew Sapperstein  for (InputInfoList::const_iterator
2249d6eaacbb9eb56763d38a3815fc509b92ed98a585Andrew Sapperstein         it = Inputs.begin(), ie = Inputs.end(); it != ie; ++it) {
2250d6eaacbb9eb56763d38a3815fc509b92ed98a585Andrew Sapperstein    const InputInfo &II = *it;
22516ba612efffba42bec102ac58a1540496158f747eAndrew Sapperstein    assert(II.isFilename() && "Unexpected lipo input.");
22526ba612efffba42bec102ac58a1540496158f747eAndrew Sapperstein    CmdArgs.push_back(II.getFilename());
2253d6eaacbb9eb56763d38a3815fc509b92ed98a585Andrew Sapperstein  }
2254d6eaacbb9eb56763d38a3815fc509b92ed98a585Andrew Sapperstein  const char *Exec =
2255d6eaacbb9eb56763d38a3815fc509b92ed98a585Andrew Sapperstein    Args.MakeArgString(getToolChain().GetProgramPath(C, "lipo"));
2256d6eaacbb9eb56763d38a3815fc509b92ed98a585Andrew Sapperstein  Dest.addCommand(new Command(JA, *this, Exec, CmdArgs));
2257d6eaacbb9eb56763d38a3815fc509b92ed98a585Andrew Sapperstein}
2258d6eaacbb9eb56763d38a3815fc509b92ed98a585Andrew Sapperstein
2259d6eaacbb9eb56763d38a3815fc509b92ed98a585Andrew Sappersteinvoid auroraux::Assemble::ConstructJob(Compilation &C, const JobAction &JA,
2260d6eaacbb9eb56763d38a3815fc509b92ed98a585Andrew Sapperstein                                      Job &Dest, const InputInfo &Output,
2261d6eaacbb9eb56763d38a3815fc509b92ed98a585Andrew Sapperstein                                      const InputInfoList &Inputs,
2262d6eaacbb9eb56763d38a3815fc509b92ed98a585Andrew Sapperstein                                      const ArgList &Args,
2263d6eaacbb9eb56763d38a3815fc509b92ed98a585Andrew Sapperstein                                      const char *LinkingOutput) const {
2264d6eaacbb9eb56763d38a3815fc509b92ed98a585Andrew Sapperstein  ArgStringList CmdArgs;
2265d6eaacbb9eb56763d38a3815fc509b92ed98a585Andrew Sapperstein
2266d6eaacbb9eb56763d38a3815fc509b92ed98a585Andrew Sapperstein  Args.AddAllArgValues(CmdArgs, options::OPT_Wa_COMMA,
2267d6eaacbb9eb56763d38a3815fc509b92ed98a585Andrew Sapperstein                       options::OPT_Xassembler);
2268d6eaacbb9eb56763d38a3815fc509b92ed98a585Andrew Sapperstein
2269d6eaacbb9eb56763d38a3815fc509b92ed98a585Andrew Sapperstein  CmdArgs.push_back("-o");
2270d6eaacbb9eb56763d38a3815fc509b92ed98a585Andrew Sapperstein  if (Output.isPipe())
2271d6eaacbb9eb56763d38a3815fc509b92ed98a585Andrew Sapperstein    CmdArgs.push_back("-");
22726ba612efffba42bec102ac58a1540496158f747eAndrew Sapperstein  else
22736ba612efffba42bec102ac58a1540496158f747eAndrew Sapperstein    CmdArgs.push_back(Output.getFilename());
2274d6eaacbb9eb56763d38a3815fc509b92ed98a585Andrew Sapperstein
2275d6eaacbb9eb56763d38a3815fc509b92ed98a585Andrew Sapperstein  for (InputInfoList::const_iterator
2276d6eaacbb9eb56763d38a3815fc509b92ed98a585Andrew Sapperstein         it = Inputs.begin(), ie = Inputs.end(); it != ie; ++it) {
2277d6eaacbb9eb56763d38a3815fc509b92ed98a585Andrew Sapperstein    const InputInfo &II = *it;
2278d6eaacbb9eb56763d38a3815fc509b92ed98a585Andrew Sapperstein    if (II.isPipe())
2279d6eaacbb9eb56763d38a3815fc509b92ed98a585Andrew Sapperstein      CmdArgs.push_back("-");
2280d6eaacbb9eb56763d38a3815fc509b92ed98a585Andrew Sapperstein    else
2281d6eaacbb9eb56763d38a3815fc509b92ed98a585Andrew Sapperstein      CmdArgs.push_back(II.getFilename());
2282d6eaacbb9eb56763d38a3815fc509b92ed98a585Andrew Sapperstein  }
2283d6eaacbb9eb56763d38a3815fc509b92ed98a585Andrew Sapperstein
2284d6eaacbb9eb56763d38a3815fc509b92ed98a585Andrew Sapperstein  const char *Exec =
2285d6eaacbb9eb56763d38a3815fc509b92ed98a585Andrew Sapperstein    Args.MakeArgString(getToolChain().GetProgramPath(C, "gas"));
2286d6eaacbb9eb56763d38a3815fc509b92ed98a585Andrew Sapperstein  Dest.addCommand(new Command(JA, *this, Exec, CmdArgs));
2287d6eaacbb9eb56763d38a3815fc509b92ed98a585Andrew Sapperstein}
2288d6eaacbb9eb56763d38a3815fc509b92ed98a585Andrew Sapperstein
2289d6eaacbb9eb56763d38a3815fc509b92ed98a585Andrew Sappersteinvoid auroraux::Link::ConstructJob(Compilation &C, const JobAction &JA,
2290d6eaacbb9eb56763d38a3815fc509b92ed98a585Andrew Sapperstein                                  Job &Dest, const InputInfo &Output,
2291d6eaacbb9eb56763d38a3815fc509b92ed98a585Andrew Sapperstein                                  const InputInfoList &Inputs,
2292d6eaacbb9eb56763d38a3815fc509b92ed98a585Andrew Sapperstein                                  const ArgList &Args,
22936ba612efffba42bec102ac58a1540496158f747eAndrew Sapperstein                                  const char *LinkingOutput) const {
22946ba612efffba42bec102ac58a1540496158f747eAndrew Sapperstein  const Driver &D = getToolChain().getHost().getDriver();
2295d6eaacbb9eb56763d38a3815fc509b92ed98a585Andrew Sapperstein  ArgStringList CmdArgs;
2296d6eaacbb9eb56763d38a3815fc509b92ed98a585Andrew Sapperstein
2297d6eaacbb9eb56763d38a3815fc509b92ed98a585Andrew Sapperstein  if ((!Args.hasArg(options::OPT_nostdlib)) &&
2298d6eaacbb9eb56763d38a3815fc509b92ed98a585Andrew Sapperstein      (!Args.hasArg(options::OPT_shared))) {
2299d6eaacbb9eb56763d38a3815fc509b92ed98a585Andrew Sapperstein    CmdArgs.push_back("-e");
2300d6eaacbb9eb56763d38a3815fc509b92ed98a585Andrew Sapperstein    CmdArgs.push_back("_start");
2301d6eaacbb9eb56763d38a3815fc509b92ed98a585Andrew Sapperstein  }
2302d6eaacbb9eb56763d38a3815fc509b92ed98a585Andrew Sapperstein
2303d6eaacbb9eb56763d38a3815fc509b92ed98a585Andrew Sapperstein  if (Args.hasArg(options::OPT_static)) {
2304d6eaacbb9eb56763d38a3815fc509b92ed98a585Andrew Sapperstein    CmdArgs.push_back("-Bstatic");
2305d6eaacbb9eb56763d38a3815fc509b92ed98a585Andrew Sapperstein    CmdArgs.push_back("-dn");
2306d6eaacbb9eb56763d38a3815fc509b92ed98a585Andrew Sapperstein  } else {
2307d6eaacbb9eb56763d38a3815fc509b92ed98a585Andrew Sapperstein//    CmdArgs.push_back("--eh-frame-hdr");
2308d6eaacbb9eb56763d38a3815fc509b92ed98a585Andrew Sapperstein    CmdArgs.push_back("-Bdynamic");
2309d6eaacbb9eb56763d38a3815fc509b92ed98a585Andrew Sapperstein    if (Args.hasArg(options::OPT_shared)) {
2310d6eaacbb9eb56763d38a3815fc509b92ed98a585Andrew Sapperstein      CmdArgs.push_back("-shared");
2311d6eaacbb9eb56763d38a3815fc509b92ed98a585Andrew Sapperstein    } else {
2312d6eaacbb9eb56763d38a3815fc509b92ed98a585Andrew Sapperstein      CmdArgs.push_back("--dynamic-linker");
2313d6eaacbb9eb56763d38a3815fc509b92ed98a585Andrew Sapperstein      CmdArgs.push_back("/lib/ld.so.1"); // 64Bit Path /lib/amd64/ld.so.1
23146ba612efffba42bec102ac58a1540496158f747eAndrew Sapperstein    }
23156ba612efffba42bec102ac58a1540496158f747eAndrew Sapperstein  }
2316d6eaacbb9eb56763d38a3815fc509b92ed98a585Andrew Sapperstein
2317d6eaacbb9eb56763d38a3815fc509b92ed98a585Andrew Sapperstein  if (Output.isPipe()) {
2318d6eaacbb9eb56763d38a3815fc509b92ed98a585Andrew Sapperstein    CmdArgs.push_back("-o");
2319d6eaacbb9eb56763d38a3815fc509b92ed98a585Andrew Sapperstein    CmdArgs.push_back("-");
2320d6eaacbb9eb56763d38a3815fc509b92ed98a585Andrew Sapperstein  } else if (Output.isFilename()) {
2321d6eaacbb9eb56763d38a3815fc509b92ed98a585Andrew Sapperstein    CmdArgs.push_back("-o");
2322d6eaacbb9eb56763d38a3815fc509b92ed98a585Andrew Sapperstein    CmdArgs.push_back(Output.getFilename());
2323d6eaacbb9eb56763d38a3815fc509b92ed98a585Andrew Sapperstein  } else {
2324d6eaacbb9eb56763d38a3815fc509b92ed98a585Andrew Sapperstein    assert(Output.isNothing() && "Invalid output.");
2325d6eaacbb9eb56763d38a3815fc509b92ed98a585Andrew Sapperstein  }
2326d6eaacbb9eb56763d38a3815fc509b92ed98a585Andrew Sapperstein
2327d6eaacbb9eb56763d38a3815fc509b92ed98a585Andrew Sapperstein  if (!Args.hasArg(options::OPT_nostdlib) &&
2328d6eaacbb9eb56763d38a3815fc509b92ed98a585Andrew Sapperstein      !Args.hasArg(options::OPT_nostartfiles)) {
2329d6eaacbb9eb56763d38a3815fc509b92ed98a585Andrew Sapperstein    if (!Args.hasArg(options::OPT_shared)) {
2330d6eaacbb9eb56763d38a3815fc509b92ed98a585Andrew Sapperstein      CmdArgs.push_back(Args.MakeArgString(getToolChain().GetFilePath(C, "crt1.o")));
2331d6eaacbb9eb56763d38a3815fc509b92ed98a585Andrew Sapperstein      CmdArgs.push_back(Args.MakeArgString(getToolChain().GetFilePath(C, "crti.o")));
2332d6eaacbb9eb56763d38a3815fc509b92ed98a585Andrew Sapperstein      CmdArgs.push_back(Args.MakeArgString(getToolChain().GetFilePath(C, "crtbegin.o")));
2333d6eaacbb9eb56763d38a3815fc509b92ed98a585Andrew Sapperstein    } else {
2334d6eaacbb9eb56763d38a3815fc509b92ed98a585Andrew Sapperstein      CmdArgs.push_back(Args.MakeArgString(getToolChain().GetFilePath(C, "crti.o")));
23356ba612efffba42bec102ac58a1540496158f747eAndrew Sapperstein    }
23366ba612efffba42bec102ac58a1540496158f747eAndrew Sapperstein    CmdArgs.push_back(Args.MakeArgString(getToolChain().GetFilePath(C, "crtn.o")));
2337d6eaacbb9eb56763d38a3815fc509b92ed98a585Andrew Sapperstein  }
2338d6eaacbb9eb56763d38a3815fc509b92ed98a585Andrew Sapperstein
2339d6eaacbb9eb56763d38a3815fc509b92ed98a585Andrew Sapperstein  CmdArgs.push_back(Args.MakeArgString("-L/opt/gcc4/lib/gcc/"
2340d6eaacbb9eb56763d38a3815fc509b92ed98a585Andrew Sapperstein                                       + getToolChain().getTripleString()
2341d6eaacbb9eb56763d38a3815fc509b92ed98a585Andrew Sapperstein                                       + "/4.2.4"));
2342d6eaacbb9eb56763d38a3815fc509b92ed98a585Andrew Sapperstein
2343d6eaacbb9eb56763d38a3815fc509b92ed98a585Andrew Sapperstein  Args.AddAllArgs(CmdArgs, options::OPT_L);
2344d6eaacbb9eb56763d38a3815fc509b92ed98a585Andrew Sapperstein  Args.AddAllArgs(CmdArgs, options::OPT_T_Group);
2345d6eaacbb9eb56763d38a3815fc509b92ed98a585Andrew Sapperstein  Args.AddAllArgs(CmdArgs, options::OPT_e);
2346d6eaacbb9eb56763d38a3815fc509b92ed98a585Andrew Sapperstein
2347d6eaacbb9eb56763d38a3815fc509b92ed98a585Andrew Sapperstein  for (InputInfoList::const_iterator
2348d6eaacbb9eb56763d38a3815fc509b92ed98a585Andrew Sapperstein         it = Inputs.begin(), ie = Inputs.end(); it != ie; ++it) {
2349d6eaacbb9eb56763d38a3815fc509b92ed98a585Andrew Sapperstein    const InputInfo &II = *it;
2350d6eaacbb9eb56763d38a3815fc509b92ed98a585Andrew Sapperstein
2351d6eaacbb9eb56763d38a3815fc509b92ed98a585Andrew Sapperstein    // Don't try to pass LLVM inputs to a generic gcc.
2352d6eaacbb9eb56763d38a3815fc509b92ed98a585Andrew Sapperstein    if (II.getType() == types::TY_LLVMBC)
2353d6eaacbb9eb56763d38a3815fc509b92ed98a585Andrew Sapperstein      D.Diag(clang::diag::err_drv_no_linker_llvm_support)
2354d6eaacbb9eb56763d38a3815fc509b92ed98a585Andrew Sapperstein        << getToolChain().getTripleString();
2355d6eaacbb9eb56763d38a3815fc509b92ed98a585Andrew Sapperstein
23566ba612efffba42bec102ac58a1540496158f747eAndrew Sapperstein    if (II.isPipe())
23576ba612efffba42bec102ac58a1540496158f747eAndrew Sapperstein      CmdArgs.push_back("-");
2358d6eaacbb9eb56763d38a3815fc509b92ed98a585Andrew Sapperstein    else if (II.isFilename())
2359d6eaacbb9eb56763d38a3815fc509b92ed98a585Andrew Sapperstein      CmdArgs.push_back(II.getFilename());
2360d6eaacbb9eb56763d38a3815fc509b92ed98a585Andrew Sapperstein    else
2361d6eaacbb9eb56763d38a3815fc509b92ed98a585Andrew Sapperstein      II.getInputArg().renderAsInput(Args, CmdArgs);
2362d6eaacbb9eb56763d38a3815fc509b92ed98a585Andrew Sapperstein  }
2363d6eaacbb9eb56763d38a3815fc509b92ed98a585Andrew Sapperstein
2364d6eaacbb9eb56763d38a3815fc509b92ed98a585Andrew Sapperstein  if (!Args.hasArg(options::OPT_nostdlib) &&
2365d6eaacbb9eb56763d38a3815fc509b92ed98a585Andrew Sapperstein      !Args.hasArg(options::OPT_nodefaultlibs)) {
2366d6eaacbb9eb56763d38a3815fc509b92ed98a585Andrew Sapperstein    // FIXME: For some reason GCC passes -lgcc before adding
2367d6eaacbb9eb56763d38a3815fc509b92ed98a585Andrew Sapperstein    // the default system libraries. Just mimic this for now.
2368d6eaacbb9eb56763d38a3815fc509b92ed98a585Andrew Sapperstein    CmdArgs.push_back("-lgcc");
2369d6eaacbb9eb56763d38a3815fc509b92ed98a585Andrew Sapperstein
2370d6eaacbb9eb56763d38a3815fc509b92ed98a585Andrew Sapperstein    if (Args.hasArg(options::OPT_pthread))
2371d6eaacbb9eb56763d38a3815fc509b92ed98a585Andrew Sapperstein      CmdArgs.push_back("-pthread");
2372d6eaacbb9eb56763d38a3815fc509b92ed98a585Andrew Sapperstein    if (!Args.hasArg(options::OPT_shared))
2373d6eaacbb9eb56763d38a3815fc509b92ed98a585Andrew Sapperstein      CmdArgs.push_back("-lc");
2374d6eaacbb9eb56763d38a3815fc509b92ed98a585Andrew Sapperstein    CmdArgs.push_back("-lgcc");
2375d6eaacbb9eb56763d38a3815fc509b92ed98a585Andrew Sapperstein  }
2376d6eaacbb9eb56763d38a3815fc509b92ed98a585Andrew Sapperstein
23776ba612efffba42bec102ac58a1540496158f747eAndrew Sapperstein  if (!Args.hasArg(options::OPT_nostdlib) &&
23786ba612efffba42bec102ac58a1540496158f747eAndrew Sapperstein      !Args.hasArg(options::OPT_nostartfiles)) {
2379d6eaacbb9eb56763d38a3815fc509b92ed98a585Andrew Sapperstein    if (!Args.hasArg(options::OPT_shared))
2380d6eaacbb9eb56763d38a3815fc509b92ed98a585Andrew Sapperstein      CmdArgs.push_back(Args.MakeArgString(getToolChain().GetFilePath(C, "crtend.o")));
2381d6eaacbb9eb56763d38a3815fc509b92ed98a585Andrew Sapperstein//    else
2382d6eaacbb9eb56763d38a3815fc509b92ed98a585Andrew Sapperstein//      CmdArgs.push_back(Args.MakeArgString(getToolChain().GetFilePath(C, "crtendS.o")));
2383d6eaacbb9eb56763d38a3815fc509b92ed98a585Andrew Sapperstein  }
2384d6eaacbb9eb56763d38a3815fc509b92ed98a585Andrew Sapperstein
2385d6eaacbb9eb56763d38a3815fc509b92ed98a585Andrew Sapperstein  const char *Exec =
2386d6eaacbb9eb56763d38a3815fc509b92ed98a585Andrew Sapperstein    Args.MakeArgString(getToolChain().GetProgramPath(C, "ld"));
2387d6eaacbb9eb56763d38a3815fc509b92ed98a585Andrew Sapperstein  Dest.addCommand(new Command(JA, *this, Exec, CmdArgs));
2388d6eaacbb9eb56763d38a3815fc509b92ed98a585Andrew Sapperstein}
2389d6eaacbb9eb56763d38a3815fc509b92ed98a585Andrew Sapperstein
2390d6eaacbb9eb56763d38a3815fc509b92ed98a585Andrew Sappersteinvoid openbsd::Assemble::ConstructJob(Compilation &C, const JobAction &JA,
2391d6eaacbb9eb56763d38a3815fc509b92ed98a585Andrew Sapperstein                                     Job &Dest, const InputInfo &Output,
2392d6eaacbb9eb56763d38a3815fc509b92ed98a585Andrew Sapperstein                                     const InputInfoList &Inputs,
2393d6eaacbb9eb56763d38a3815fc509b92ed98a585Andrew Sapperstein                                     const ArgList &Args,
2394d6eaacbb9eb56763d38a3815fc509b92ed98a585Andrew Sapperstein                                     const char *LinkingOutput) const {
2395d6eaacbb9eb56763d38a3815fc509b92ed98a585Andrew Sapperstein  ArgStringList CmdArgs;
2396d6eaacbb9eb56763d38a3815fc509b92ed98a585Andrew Sapperstein
2397d6eaacbb9eb56763d38a3815fc509b92ed98a585Andrew Sapperstein  Args.AddAllArgValues(CmdArgs, options::OPT_Wa_COMMA,
23986ba612efffba42bec102ac58a1540496158f747eAndrew Sapperstein                       options::OPT_Xassembler);
23996ba612efffba42bec102ac58a1540496158f747eAndrew Sapperstein
2400d6eaacbb9eb56763d38a3815fc509b92ed98a585Andrew Sapperstein  CmdArgs.push_back("-o");
2401d6eaacbb9eb56763d38a3815fc509b92ed98a585Andrew Sapperstein  if (Output.isPipe())
2402d6eaacbb9eb56763d38a3815fc509b92ed98a585Andrew Sapperstein    CmdArgs.push_back("-");
2403d6eaacbb9eb56763d38a3815fc509b92ed98a585Andrew Sapperstein  else
2404d6eaacbb9eb56763d38a3815fc509b92ed98a585Andrew Sapperstein    CmdArgs.push_back(Output.getFilename());
2405d6eaacbb9eb56763d38a3815fc509b92ed98a585Andrew Sapperstein
2406d6eaacbb9eb56763d38a3815fc509b92ed98a585Andrew Sapperstein  for (InputInfoList::const_iterator
2407d6eaacbb9eb56763d38a3815fc509b92ed98a585Andrew Sapperstein         it = Inputs.begin(), ie = Inputs.end(); it != ie; ++it) {
2408d6eaacbb9eb56763d38a3815fc509b92ed98a585Andrew Sapperstein    const InputInfo &II = *it;
2409d6eaacbb9eb56763d38a3815fc509b92ed98a585Andrew Sapperstein    if (II.isPipe())
2410d6eaacbb9eb56763d38a3815fc509b92ed98a585Andrew Sapperstein      CmdArgs.push_back("-");
2411d6eaacbb9eb56763d38a3815fc509b92ed98a585Andrew Sapperstein    else
2412d6eaacbb9eb56763d38a3815fc509b92ed98a585Andrew Sapperstein      CmdArgs.push_back(II.getFilename());
2413d6eaacbb9eb56763d38a3815fc509b92ed98a585Andrew Sapperstein  }
2414d6eaacbb9eb56763d38a3815fc509b92ed98a585Andrew Sapperstein
2415d6eaacbb9eb56763d38a3815fc509b92ed98a585Andrew Sapperstein  const char *Exec =
2416d6eaacbb9eb56763d38a3815fc509b92ed98a585Andrew Sapperstein    Args.MakeArgString(getToolChain().GetProgramPath(C, "as"));
2417d6eaacbb9eb56763d38a3815fc509b92ed98a585Andrew Sapperstein  Dest.addCommand(new Command(JA, *this, Exec, CmdArgs));
2418d6eaacbb9eb56763d38a3815fc509b92ed98a585Andrew Sapperstein}
24196ba612efffba42bec102ac58a1540496158f747eAndrew Sapperstein
24206ba612efffba42bec102ac58a1540496158f747eAndrew Sappersteinvoid openbsd::Link::ConstructJob(Compilation &C, const JobAction &JA,
2421d6eaacbb9eb56763d38a3815fc509b92ed98a585Andrew Sapperstein                                 Job &Dest, const InputInfo &Output,
2422d6eaacbb9eb56763d38a3815fc509b92ed98a585Andrew Sapperstein                                 const InputInfoList &Inputs,
2423d6eaacbb9eb56763d38a3815fc509b92ed98a585Andrew Sapperstein                                 const ArgList &Args,
2424d6eaacbb9eb56763d38a3815fc509b92ed98a585Andrew Sapperstein                                 const char *LinkingOutput) const {
2425d6eaacbb9eb56763d38a3815fc509b92ed98a585Andrew Sapperstein  const Driver &D = getToolChain().getHost().getDriver();
2426d6eaacbb9eb56763d38a3815fc509b92ed98a585Andrew Sapperstein  ArgStringList CmdArgs;
2427d6eaacbb9eb56763d38a3815fc509b92ed98a585Andrew Sapperstein
2428d6eaacbb9eb56763d38a3815fc509b92ed98a585Andrew Sapperstein  if ((!Args.hasArg(options::OPT_nostdlib)) &&
2429d6eaacbb9eb56763d38a3815fc509b92ed98a585Andrew Sapperstein      (!Args.hasArg(options::OPT_shared))) {
2430d6eaacbb9eb56763d38a3815fc509b92ed98a585Andrew Sapperstein    CmdArgs.push_back("-e");
2431d6eaacbb9eb56763d38a3815fc509b92ed98a585Andrew Sapperstein    CmdArgs.push_back("__start");
2432d6eaacbb9eb56763d38a3815fc509b92ed98a585Andrew Sapperstein  }
2433d6eaacbb9eb56763d38a3815fc509b92ed98a585Andrew Sapperstein
2434d6eaacbb9eb56763d38a3815fc509b92ed98a585Andrew Sapperstein  if (Args.hasArg(options::OPT_static)) {
2435d6eaacbb9eb56763d38a3815fc509b92ed98a585Andrew Sapperstein    CmdArgs.push_back("-Bstatic");
2436d6eaacbb9eb56763d38a3815fc509b92ed98a585Andrew Sapperstein  } else {
2437d6eaacbb9eb56763d38a3815fc509b92ed98a585Andrew Sapperstein    CmdArgs.push_back("--eh-frame-hdr");
2438d6eaacbb9eb56763d38a3815fc509b92ed98a585Andrew Sapperstein    CmdArgs.push_back("-Bdynamic");
2439d6eaacbb9eb56763d38a3815fc509b92ed98a585Andrew Sapperstein    if (Args.hasArg(options::OPT_shared)) {
24406ba612efffba42bec102ac58a1540496158f747eAndrew Sapperstein      CmdArgs.push_back("-shared");
24416ba612efffba42bec102ac58a1540496158f747eAndrew Sapperstein    } else {
2442d6eaacbb9eb56763d38a3815fc509b92ed98a585Andrew Sapperstein      CmdArgs.push_back("-dynamic-linker");
2443d6eaacbb9eb56763d38a3815fc509b92ed98a585Andrew Sapperstein      CmdArgs.push_back("/usr/libexec/ld.so");
2444d6eaacbb9eb56763d38a3815fc509b92ed98a585Andrew Sapperstein    }
2445d6eaacbb9eb56763d38a3815fc509b92ed98a585Andrew Sapperstein  }
2446d6eaacbb9eb56763d38a3815fc509b92ed98a585Andrew Sapperstein
2447d6eaacbb9eb56763d38a3815fc509b92ed98a585Andrew Sapperstein  if (Output.isPipe()) {
2448d6eaacbb9eb56763d38a3815fc509b92ed98a585Andrew Sapperstein    CmdArgs.push_back("-o");
2449d6eaacbb9eb56763d38a3815fc509b92ed98a585Andrew Sapperstein    CmdArgs.push_back("-");
2450d6eaacbb9eb56763d38a3815fc509b92ed98a585Andrew Sapperstein  } else if (Output.isFilename()) {
2451d6eaacbb9eb56763d38a3815fc509b92ed98a585Andrew Sapperstein    CmdArgs.push_back("-o");
2452d6eaacbb9eb56763d38a3815fc509b92ed98a585Andrew Sapperstein    CmdArgs.push_back(Output.getFilename());
2453d6eaacbb9eb56763d38a3815fc509b92ed98a585Andrew Sapperstein  } else {
2454d6eaacbb9eb56763d38a3815fc509b92ed98a585Andrew Sapperstein    assert(Output.isNothing() && "Invalid output.");
2455d6eaacbb9eb56763d38a3815fc509b92ed98a585Andrew Sapperstein  }
2456d6eaacbb9eb56763d38a3815fc509b92ed98a585Andrew Sapperstein
2457d6eaacbb9eb56763d38a3815fc509b92ed98a585Andrew Sapperstein  if (!Args.hasArg(options::OPT_nostdlib) &&
2458d6eaacbb9eb56763d38a3815fc509b92ed98a585Andrew Sapperstein      !Args.hasArg(options::OPT_nostartfiles)) {
2459d6eaacbb9eb56763d38a3815fc509b92ed98a585Andrew Sapperstein    if (!Args.hasArg(options::OPT_shared)) {
2460d6eaacbb9eb56763d38a3815fc509b92ed98a585Andrew Sapperstein      CmdArgs.push_back(Args.MakeArgString(getToolChain().GetFilePath(C, "crt0.o")));
24616ba612efffba42bec102ac58a1540496158f747eAndrew Sapperstein      CmdArgs.push_back(Args.MakeArgString(getToolChain().GetFilePath(C, "crtbegin.o")));
24626ba612efffba42bec102ac58a1540496158f747eAndrew Sapperstein    } else {
2463d6eaacbb9eb56763d38a3815fc509b92ed98a585Andrew Sapperstein      CmdArgs.push_back(Args.MakeArgString(getToolChain().GetFilePath(C, "crtbeginS.o")));
2464d6eaacbb9eb56763d38a3815fc509b92ed98a585Andrew Sapperstein    }
2465d6eaacbb9eb56763d38a3815fc509b92ed98a585Andrew Sapperstein  }
2466d6eaacbb9eb56763d38a3815fc509b92ed98a585Andrew Sapperstein
2467d6eaacbb9eb56763d38a3815fc509b92ed98a585Andrew Sapperstein  std::string Triple = getToolChain().getTripleString();
2468d6eaacbb9eb56763d38a3815fc509b92ed98a585Andrew Sapperstein  if (Triple.substr(0, 6) == "x86_64")
2469d6eaacbb9eb56763d38a3815fc509b92ed98a585Andrew Sapperstein    Triple.replace(0, 6, "amd64");
2470d6eaacbb9eb56763d38a3815fc509b92ed98a585Andrew Sapperstein  CmdArgs.push_back(Args.MakeArgString("-L/usr/lib/gcc-lib/" + Triple +
2471d6eaacbb9eb56763d38a3815fc509b92ed98a585Andrew Sapperstein                                       "/3.3.5"));
2472d6eaacbb9eb56763d38a3815fc509b92ed98a585Andrew Sapperstein
2473d6eaacbb9eb56763d38a3815fc509b92ed98a585Andrew Sapperstein  Args.AddAllArgs(CmdArgs, options::OPT_L);
2474d6eaacbb9eb56763d38a3815fc509b92ed98a585Andrew Sapperstein  Args.AddAllArgs(CmdArgs, options::OPT_T_Group);
2475d6eaacbb9eb56763d38a3815fc509b92ed98a585Andrew Sapperstein  Args.AddAllArgs(CmdArgs, options::OPT_e);
2476d6eaacbb9eb56763d38a3815fc509b92ed98a585Andrew Sapperstein
2477d6eaacbb9eb56763d38a3815fc509b92ed98a585Andrew Sapperstein  for (InputInfoList::const_iterator
2478d6eaacbb9eb56763d38a3815fc509b92ed98a585Andrew Sapperstein         it = Inputs.begin(), ie = Inputs.end(); it != ie; ++it) {
2479d6eaacbb9eb56763d38a3815fc509b92ed98a585Andrew Sapperstein    const InputInfo &II = *it;
2480d6eaacbb9eb56763d38a3815fc509b92ed98a585Andrew Sapperstein
2481d6eaacbb9eb56763d38a3815fc509b92ed98a585Andrew Sapperstein    // Don't try to pass LLVM inputs to a generic gcc.
24826ba612efffba42bec102ac58a1540496158f747eAndrew Sapperstein    if (II.getType() == types::TY_LLVMBC)
24836ba612efffba42bec102ac58a1540496158f747eAndrew Sapperstein      D.Diag(clang::diag::err_drv_no_linker_llvm_support)
2484d6eaacbb9eb56763d38a3815fc509b92ed98a585Andrew Sapperstein        << getToolChain().getTripleString();
2485d6eaacbb9eb56763d38a3815fc509b92ed98a585Andrew Sapperstein
2486d6eaacbb9eb56763d38a3815fc509b92ed98a585Andrew Sapperstein    if (II.isPipe())
2487d6eaacbb9eb56763d38a3815fc509b92ed98a585Andrew Sapperstein      CmdArgs.push_back("-");
2488d6eaacbb9eb56763d38a3815fc509b92ed98a585Andrew Sapperstein    else if (II.isFilename())
2489d6eaacbb9eb56763d38a3815fc509b92ed98a585Andrew Sapperstein      CmdArgs.push_back(II.getFilename());
2490d6eaacbb9eb56763d38a3815fc509b92ed98a585Andrew Sapperstein    else
2491d6eaacbb9eb56763d38a3815fc509b92ed98a585Andrew Sapperstein      II.getInputArg().renderAsInput(Args, CmdArgs);
2492d6eaacbb9eb56763d38a3815fc509b92ed98a585Andrew Sapperstein  }
2493d6eaacbb9eb56763d38a3815fc509b92ed98a585Andrew Sapperstein
2494d6eaacbb9eb56763d38a3815fc509b92ed98a585Andrew Sapperstein  if (!Args.hasArg(options::OPT_nostdlib) &&
2495d6eaacbb9eb56763d38a3815fc509b92ed98a585Andrew Sapperstein      !Args.hasArg(options::OPT_nodefaultlibs)) {
2496d6eaacbb9eb56763d38a3815fc509b92ed98a585Andrew Sapperstein    // FIXME: For some reason GCC passes -lgcc before adding
2497d6eaacbb9eb56763d38a3815fc509b92ed98a585Andrew Sapperstein    // the default system libraries. Just mimic this for now.
2498d6eaacbb9eb56763d38a3815fc509b92ed98a585Andrew Sapperstein    CmdArgs.push_back("-lgcc");
2499d6eaacbb9eb56763d38a3815fc509b92ed98a585Andrew Sapperstein
2500d6eaacbb9eb56763d38a3815fc509b92ed98a585Andrew Sapperstein    if (Args.hasArg(options::OPT_pthread))
2501d6eaacbb9eb56763d38a3815fc509b92ed98a585Andrew Sapperstein      CmdArgs.push_back("-pthread");
2502d6eaacbb9eb56763d38a3815fc509b92ed98a585Andrew Sapperstein    if (!Args.hasArg(options::OPT_shared))
25036ba612efffba42bec102ac58a1540496158f747eAndrew Sapperstein      CmdArgs.push_back("-lc");
25046ba612efffba42bec102ac58a1540496158f747eAndrew Sapperstein    CmdArgs.push_back("-lgcc");
2505d6eaacbb9eb56763d38a3815fc509b92ed98a585Andrew Sapperstein  }
2506d6eaacbb9eb56763d38a3815fc509b92ed98a585Andrew Sapperstein
2507d6eaacbb9eb56763d38a3815fc509b92ed98a585Andrew Sapperstein  if (!Args.hasArg(options::OPT_nostdlib) &&
2508d6eaacbb9eb56763d38a3815fc509b92ed98a585Andrew Sapperstein      !Args.hasArg(options::OPT_nostartfiles)) {
2509d6eaacbb9eb56763d38a3815fc509b92ed98a585Andrew Sapperstein    if (!Args.hasArg(options::OPT_shared))
2510d6eaacbb9eb56763d38a3815fc509b92ed98a585Andrew Sapperstein      CmdArgs.push_back(Args.MakeArgString(getToolChain().GetFilePath(C, "crtend.o")));
2511d6eaacbb9eb56763d38a3815fc509b92ed98a585Andrew Sapperstein    else
2512d6eaacbb9eb56763d38a3815fc509b92ed98a585Andrew Sapperstein      CmdArgs.push_back(Args.MakeArgString(getToolChain().GetFilePath(C, "crtendS.o")));
2513d6eaacbb9eb56763d38a3815fc509b92ed98a585Andrew Sapperstein  }
2514d6eaacbb9eb56763d38a3815fc509b92ed98a585Andrew Sapperstein
2515d6eaacbb9eb56763d38a3815fc509b92ed98a585Andrew Sapperstein  const char *Exec =
2516d6eaacbb9eb56763d38a3815fc509b92ed98a585Andrew Sapperstein    Args.MakeArgString(getToolChain().GetProgramPath(C, "ld"));
2517d6eaacbb9eb56763d38a3815fc509b92ed98a585Andrew Sapperstein  Dest.addCommand(new Command(JA, *this, Exec, CmdArgs));
2518d6eaacbb9eb56763d38a3815fc509b92ed98a585Andrew Sapperstein}
2519d6eaacbb9eb56763d38a3815fc509b92ed98a585Andrew Sapperstein
2520d6eaacbb9eb56763d38a3815fc509b92ed98a585Andrew Sappersteinvoid freebsd::Assemble::ConstructJob(Compilation &C, const JobAction &JA,
2521d6eaacbb9eb56763d38a3815fc509b92ed98a585Andrew Sapperstein                                     Job &Dest, const InputInfo &Output,
2522d6eaacbb9eb56763d38a3815fc509b92ed98a585Andrew Sapperstein                                     const InputInfoList &Inputs,
2523d6eaacbb9eb56763d38a3815fc509b92ed98a585Andrew Sapperstein                                     const ArgList &Args,
25246ba612efffba42bec102ac58a1540496158f747eAndrew Sapperstein                                     const char *LinkingOutput) const {
25256ba612efffba42bec102ac58a1540496158f747eAndrew Sapperstein  ArgStringList CmdArgs;
2526d6eaacbb9eb56763d38a3815fc509b92ed98a585Andrew Sapperstein
2527d6eaacbb9eb56763d38a3815fc509b92ed98a585Andrew Sapperstein  // When building 32-bit code on FreeBSD/amd64, we have to explicitly
2528d6eaacbb9eb56763d38a3815fc509b92ed98a585Andrew Sapperstein  // instruct as in the base system to assemble 32-bit code.
2529d6eaacbb9eb56763d38a3815fc509b92ed98a585Andrew Sapperstein  if (getToolChain().getArchName() == "i386")
2530d6eaacbb9eb56763d38a3815fc509b92ed98a585Andrew Sapperstein    CmdArgs.push_back("--32");
2531d6eaacbb9eb56763d38a3815fc509b92ed98a585Andrew Sapperstein
2532d6eaacbb9eb56763d38a3815fc509b92ed98a585Andrew Sapperstein  Args.AddAllArgValues(CmdArgs, options::OPT_Wa_COMMA,
2533d6eaacbb9eb56763d38a3815fc509b92ed98a585Andrew Sapperstein                       options::OPT_Xassembler);
2534d6eaacbb9eb56763d38a3815fc509b92ed98a585Andrew Sapperstein
2535d6eaacbb9eb56763d38a3815fc509b92ed98a585Andrew Sapperstein  CmdArgs.push_back("-o");
2536d6eaacbb9eb56763d38a3815fc509b92ed98a585Andrew Sapperstein  if (Output.isPipe())
2537d6eaacbb9eb56763d38a3815fc509b92ed98a585Andrew Sapperstein    CmdArgs.push_back("-");
2538d6eaacbb9eb56763d38a3815fc509b92ed98a585Andrew Sapperstein  else
2539d6eaacbb9eb56763d38a3815fc509b92ed98a585Andrew Sapperstein    CmdArgs.push_back(Output.getFilename());
2540d6eaacbb9eb56763d38a3815fc509b92ed98a585Andrew Sapperstein
2541d6eaacbb9eb56763d38a3815fc509b92ed98a585Andrew Sapperstein  for (InputInfoList::const_iterator
2542d6eaacbb9eb56763d38a3815fc509b92ed98a585Andrew Sapperstein         it = Inputs.begin(), ie = Inputs.end(); it != ie; ++it) {
2543d6eaacbb9eb56763d38a3815fc509b92ed98a585Andrew Sapperstein    const InputInfo &II = *it;
2544d6eaacbb9eb56763d38a3815fc509b92ed98a585Andrew Sapperstein    if (II.isPipe())
25456ba612efffba42bec102ac58a1540496158f747eAndrew Sapperstein      CmdArgs.push_back("-");
25466ba612efffba42bec102ac58a1540496158f747eAndrew Sapperstein    else
2547d6eaacbb9eb56763d38a3815fc509b92ed98a585Andrew Sapperstein      CmdArgs.push_back(II.getFilename());
2548d6eaacbb9eb56763d38a3815fc509b92ed98a585Andrew Sapperstein  }
2549d6eaacbb9eb56763d38a3815fc509b92ed98a585Andrew Sapperstein
2550d6eaacbb9eb56763d38a3815fc509b92ed98a585Andrew Sapperstein  const char *Exec =
2551d6eaacbb9eb56763d38a3815fc509b92ed98a585Andrew Sapperstein    Args.MakeArgString(getToolChain().GetProgramPath(C, "as"));
2552d6eaacbb9eb56763d38a3815fc509b92ed98a585Andrew Sapperstein  Dest.addCommand(new Command(JA, *this, Exec, CmdArgs));
2553d6eaacbb9eb56763d38a3815fc509b92ed98a585Andrew Sapperstein}
2554d6eaacbb9eb56763d38a3815fc509b92ed98a585Andrew Sapperstein
2555d6eaacbb9eb56763d38a3815fc509b92ed98a585Andrew Sappersteinvoid freebsd::Link::ConstructJob(Compilation &C, const JobAction &JA,
2556d6eaacbb9eb56763d38a3815fc509b92ed98a585Andrew Sapperstein                                 Job &Dest, const InputInfo &Output,
2557d6eaacbb9eb56763d38a3815fc509b92ed98a585Andrew Sapperstein                                 const InputInfoList &Inputs,
2558d6eaacbb9eb56763d38a3815fc509b92ed98a585Andrew Sapperstein                                 const ArgList &Args,
2559d6eaacbb9eb56763d38a3815fc509b92ed98a585Andrew Sapperstein                                 const char *LinkingOutput) const {
2560d6eaacbb9eb56763d38a3815fc509b92ed98a585Andrew Sapperstein  const Driver &D = getToolChain().getHost().getDriver();
2561d6eaacbb9eb56763d38a3815fc509b92ed98a585Andrew Sapperstein  ArgStringList CmdArgs;
2562d6eaacbb9eb56763d38a3815fc509b92ed98a585Andrew Sapperstein
2563d6eaacbb9eb56763d38a3815fc509b92ed98a585Andrew Sapperstein  if (Args.hasArg(options::OPT_static)) {
2564d6eaacbb9eb56763d38a3815fc509b92ed98a585Andrew Sapperstein    CmdArgs.push_back("-Bstatic");
2565d6eaacbb9eb56763d38a3815fc509b92ed98a585Andrew Sapperstein  } else {
25666ba612efffba42bec102ac58a1540496158f747eAndrew Sapperstein    CmdArgs.push_back("--eh-frame-hdr");
25676ba612efffba42bec102ac58a1540496158f747eAndrew Sapperstein    if (Args.hasArg(options::OPT_shared)) {
2568d6eaacbb9eb56763d38a3815fc509b92ed98a585Andrew Sapperstein      CmdArgs.push_back("-Bshareable");
2569d6eaacbb9eb56763d38a3815fc509b92ed98a585Andrew Sapperstein    } else {
2570d6eaacbb9eb56763d38a3815fc509b92ed98a585Andrew Sapperstein      CmdArgs.push_back("-dynamic-linker");
2571d6eaacbb9eb56763d38a3815fc509b92ed98a585Andrew Sapperstein      CmdArgs.push_back("/libexec/ld-elf.so.1");
2572d6eaacbb9eb56763d38a3815fc509b92ed98a585Andrew Sapperstein    }
2573d6eaacbb9eb56763d38a3815fc509b92ed98a585Andrew Sapperstein  }
2574d6eaacbb9eb56763d38a3815fc509b92ed98a585Andrew Sapperstein
2575d6eaacbb9eb56763d38a3815fc509b92ed98a585Andrew Sapperstein  // When building 32-bit code on FreeBSD/amd64, we have to explicitly
2576d6eaacbb9eb56763d38a3815fc509b92ed98a585Andrew Sapperstein  // instruct ld in the base system to link 32-bit code.
2577d6eaacbb9eb56763d38a3815fc509b92ed98a585Andrew Sapperstein  if (getToolChain().getArchName() == "i386") {
2578d6eaacbb9eb56763d38a3815fc509b92ed98a585Andrew Sapperstein    CmdArgs.push_back("-m");
2579d6eaacbb9eb56763d38a3815fc509b92ed98a585Andrew Sapperstein    CmdArgs.push_back("elf_i386_fbsd");
2580d6eaacbb9eb56763d38a3815fc509b92ed98a585Andrew Sapperstein  }
2581d6eaacbb9eb56763d38a3815fc509b92ed98a585Andrew Sapperstein
2582d6eaacbb9eb56763d38a3815fc509b92ed98a585Andrew Sapperstein  if (Output.isPipe()) {
2583d6eaacbb9eb56763d38a3815fc509b92ed98a585Andrew Sapperstein    CmdArgs.push_back("-o");
2584d6eaacbb9eb56763d38a3815fc509b92ed98a585Andrew Sapperstein    CmdArgs.push_back("-");
2585d6eaacbb9eb56763d38a3815fc509b92ed98a585Andrew Sapperstein  } else if (Output.isFilename()) {
2586d6eaacbb9eb56763d38a3815fc509b92ed98a585Andrew Sapperstein    CmdArgs.push_back("-o");
25876ba612efffba42bec102ac58a1540496158f747eAndrew Sapperstein    CmdArgs.push_back(Output.getFilename());
25886ba612efffba42bec102ac58a1540496158f747eAndrew Sapperstein  } else {
2589d6eaacbb9eb56763d38a3815fc509b92ed98a585Andrew Sapperstein    assert(Output.isNothing() && "Invalid output.");
2590d6eaacbb9eb56763d38a3815fc509b92ed98a585Andrew Sapperstein  }
2591d6eaacbb9eb56763d38a3815fc509b92ed98a585Andrew Sapperstein
2592d6eaacbb9eb56763d38a3815fc509b92ed98a585Andrew Sapperstein  if (!Args.hasArg(options::OPT_nostdlib) &&
2593d6eaacbb9eb56763d38a3815fc509b92ed98a585Andrew Sapperstein      !Args.hasArg(options::OPT_nostartfiles)) {
2594d6eaacbb9eb56763d38a3815fc509b92ed98a585Andrew Sapperstein    if (!Args.hasArg(options::OPT_shared)) {
2595d6eaacbb9eb56763d38a3815fc509b92ed98a585Andrew Sapperstein      CmdArgs.push_back(Args.MakeArgString(getToolChain().GetFilePath(C, "crt1.o")));
2596d6eaacbb9eb56763d38a3815fc509b92ed98a585Andrew Sapperstein      CmdArgs.push_back(Args.MakeArgString(getToolChain().GetFilePath(C, "crti.o")));
2597d6eaacbb9eb56763d38a3815fc509b92ed98a585Andrew Sapperstein      CmdArgs.push_back(Args.MakeArgString(getToolChain().GetFilePath(C, "crtbegin.o")));
2598d6eaacbb9eb56763d38a3815fc509b92ed98a585Andrew Sapperstein    } else {
2599d6eaacbb9eb56763d38a3815fc509b92ed98a585Andrew Sapperstein      CmdArgs.push_back(Args.MakeArgString(getToolChain().GetFilePath(C, "crti.o")));
2600d6eaacbb9eb56763d38a3815fc509b92ed98a585Andrew Sapperstein      CmdArgs.push_back(Args.MakeArgString(getToolChain().GetFilePath(C, "crtbeginS.o")));
2601d6eaacbb9eb56763d38a3815fc509b92ed98a585Andrew Sapperstein    }
2602d6eaacbb9eb56763d38a3815fc509b92ed98a585Andrew Sapperstein  }
2603d6eaacbb9eb56763d38a3815fc509b92ed98a585Andrew Sapperstein
2604d6eaacbb9eb56763d38a3815fc509b92ed98a585Andrew Sapperstein  Args.AddAllArgs(CmdArgs, options::OPT_L);
2605d6eaacbb9eb56763d38a3815fc509b92ed98a585Andrew Sapperstein  Args.AddAllArgs(CmdArgs, options::OPT_T_Group);
2606d6eaacbb9eb56763d38a3815fc509b92ed98a585Andrew Sapperstein  Args.AddAllArgs(CmdArgs, options::OPT_e);
2607d6eaacbb9eb56763d38a3815fc509b92ed98a585Andrew Sapperstein
26086ba612efffba42bec102ac58a1540496158f747eAndrew Sapperstein  for (InputInfoList::const_iterator
26096ba612efffba42bec102ac58a1540496158f747eAndrew Sapperstein         it = Inputs.begin(), ie = Inputs.end(); it != ie; ++it) {
2610d6eaacbb9eb56763d38a3815fc509b92ed98a585Andrew Sapperstein    const InputInfo &II = *it;
2611d6eaacbb9eb56763d38a3815fc509b92ed98a585Andrew Sapperstein
2612d6eaacbb9eb56763d38a3815fc509b92ed98a585Andrew Sapperstein    // Don't try to pass LLVM inputs to a generic gcc.
2613d6eaacbb9eb56763d38a3815fc509b92ed98a585Andrew Sapperstein    if (II.getType() == types::TY_LLVMBC)
2614d6eaacbb9eb56763d38a3815fc509b92ed98a585Andrew Sapperstein      D.Diag(clang::diag::err_drv_no_linker_llvm_support)
2615d6eaacbb9eb56763d38a3815fc509b92ed98a585Andrew Sapperstein        << getToolChain().getTripleString();
2616d6eaacbb9eb56763d38a3815fc509b92ed98a585Andrew Sapperstein
2617d6eaacbb9eb56763d38a3815fc509b92ed98a585Andrew Sapperstein    if (II.isPipe())
2618d6eaacbb9eb56763d38a3815fc509b92ed98a585Andrew Sapperstein      CmdArgs.push_back("-");
2619d6eaacbb9eb56763d38a3815fc509b92ed98a585Andrew Sapperstein    else if (II.isFilename())
2620d6eaacbb9eb56763d38a3815fc509b92ed98a585Andrew Sapperstein      CmdArgs.push_back(II.getFilename());
2621d6eaacbb9eb56763d38a3815fc509b92ed98a585Andrew Sapperstein    else
2622d6eaacbb9eb56763d38a3815fc509b92ed98a585Andrew Sapperstein      II.getInputArg().renderAsInput(Args, CmdArgs);
2623d6eaacbb9eb56763d38a3815fc509b92ed98a585Andrew Sapperstein  }
2624d6eaacbb9eb56763d38a3815fc509b92ed98a585Andrew Sapperstein
2625d6eaacbb9eb56763d38a3815fc509b92ed98a585Andrew Sapperstein  if (!Args.hasArg(options::OPT_nostdlib) &&
2626d6eaacbb9eb56763d38a3815fc509b92ed98a585Andrew Sapperstein      !Args.hasArg(options::OPT_nodefaultlibs)) {
2627d6eaacbb9eb56763d38a3815fc509b92ed98a585Andrew Sapperstein    // FIXME: For some reason GCC passes -lgcc and -lgcc_s before adding
2628d6eaacbb9eb56763d38a3815fc509b92ed98a585Andrew Sapperstein    // the default system libraries. Just mimic this for now.
26296ba612efffba42bec102ac58a1540496158f747eAndrew Sapperstein    CmdArgs.push_back("-lgcc");
26306ba612efffba42bec102ac58a1540496158f747eAndrew Sapperstein    if (D.CCCIsCXX)
2631d6eaacbb9eb56763d38a3815fc509b92ed98a585Andrew Sapperstein      CmdArgs.push_back("-lstdc++");
2632d6eaacbb9eb56763d38a3815fc509b92ed98a585Andrew Sapperstein    if (Args.hasArg(options::OPT_static)) {
2633d6eaacbb9eb56763d38a3815fc509b92ed98a585Andrew Sapperstein      CmdArgs.push_back("-lgcc_eh");
2634d6eaacbb9eb56763d38a3815fc509b92ed98a585Andrew Sapperstein    } else {
2635d6eaacbb9eb56763d38a3815fc509b92ed98a585Andrew Sapperstein      CmdArgs.push_back("--as-needed");
2636d6eaacbb9eb56763d38a3815fc509b92ed98a585Andrew Sapperstein      CmdArgs.push_back("-lgcc_s");
2637d6eaacbb9eb56763d38a3815fc509b92ed98a585Andrew Sapperstein      CmdArgs.push_back("--no-as-needed");
2638d6eaacbb9eb56763d38a3815fc509b92ed98a585Andrew Sapperstein    }
2639d6eaacbb9eb56763d38a3815fc509b92ed98a585Andrew Sapperstein
2640d6eaacbb9eb56763d38a3815fc509b92ed98a585Andrew Sapperstein    if (Args.hasArg(options::OPT_pthread))
2641d6eaacbb9eb56763d38a3815fc509b92ed98a585Andrew Sapperstein      CmdArgs.push_back("-lpthread");
2642d6eaacbb9eb56763d38a3815fc509b92ed98a585Andrew Sapperstein    CmdArgs.push_back("-lc");
2643d6eaacbb9eb56763d38a3815fc509b92ed98a585Andrew Sapperstein
2644d6eaacbb9eb56763d38a3815fc509b92ed98a585Andrew Sapperstein    CmdArgs.push_back("-lgcc");
2645d6eaacbb9eb56763d38a3815fc509b92ed98a585Andrew Sapperstein    if (Args.hasArg(options::OPT_static)) {
2646d6eaacbb9eb56763d38a3815fc509b92ed98a585Andrew Sapperstein      CmdArgs.push_back("-lgcc_eh");
2647d6eaacbb9eb56763d38a3815fc509b92ed98a585Andrew Sapperstein    } else {
2648d6eaacbb9eb56763d38a3815fc509b92ed98a585Andrew Sapperstein      CmdArgs.push_back("--as-needed");
2649d6eaacbb9eb56763d38a3815fc509b92ed98a585Andrew Sapperstein      CmdArgs.push_back("-lgcc_s");
26506ba612efffba42bec102ac58a1540496158f747eAndrew Sapperstein      CmdArgs.push_back("--no-as-needed");
26516ba612efffba42bec102ac58a1540496158f747eAndrew Sapperstein    }
2652d6eaacbb9eb56763d38a3815fc509b92ed98a585Andrew Sapperstein  }
2653d6eaacbb9eb56763d38a3815fc509b92ed98a585Andrew Sapperstein
2654d6eaacbb9eb56763d38a3815fc509b92ed98a585Andrew Sapperstein  if (!Args.hasArg(options::OPT_nostdlib) &&
2655d6eaacbb9eb56763d38a3815fc509b92ed98a585Andrew Sapperstein      !Args.hasArg(options::OPT_nostartfiles)) {
2656d6eaacbb9eb56763d38a3815fc509b92ed98a585Andrew Sapperstein    if (!Args.hasArg(options::OPT_shared))
2657d6eaacbb9eb56763d38a3815fc509b92ed98a585Andrew Sapperstein      CmdArgs.push_back(Args.MakeArgString(getToolChain().GetFilePath(C, "crtend.o")));
2658d6eaacbb9eb56763d38a3815fc509b92ed98a585Andrew Sapperstein    else
2659d6eaacbb9eb56763d38a3815fc509b92ed98a585Andrew Sapperstein      CmdArgs.push_back(Args.MakeArgString(getToolChain().GetFilePath(C, "crtendS.o")));
2660d6eaacbb9eb56763d38a3815fc509b92ed98a585Andrew Sapperstein    CmdArgs.push_back(Args.MakeArgString(getToolChain().GetFilePath(C, "crtn.o")));
2661d6eaacbb9eb56763d38a3815fc509b92ed98a585Andrew Sapperstein  }
2662d6eaacbb9eb56763d38a3815fc509b92ed98a585Andrew Sapperstein
2663d6eaacbb9eb56763d38a3815fc509b92ed98a585Andrew Sapperstein  const char *Exec =
2664d6eaacbb9eb56763d38a3815fc509b92ed98a585Andrew Sapperstein    Args.MakeArgString(getToolChain().GetProgramPath(C, "ld"));
2665d6eaacbb9eb56763d38a3815fc509b92ed98a585Andrew Sapperstein  Dest.addCommand(new Command(JA, *this, Exec, CmdArgs));
2666d6eaacbb9eb56763d38a3815fc509b92ed98a585Andrew Sapperstein}
2667d6eaacbb9eb56763d38a3815fc509b92ed98a585Andrew Sapperstein
2668d6eaacbb9eb56763d38a3815fc509b92ed98a585Andrew Sapperstein/// DragonFly Tools
2669d6eaacbb9eb56763d38a3815fc509b92ed98a585Andrew Sapperstein
2670d6eaacbb9eb56763d38a3815fc509b92ed98a585Andrew Sapperstein// For now, DragonFly Assemble does just about the same as for
26716ba612efffba42bec102ac58a1540496158f747eAndrew Sapperstein// FreeBSD, but this may change soon.
26726ba612efffba42bec102ac58a1540496158f747eAndrew Sappersteinvoid dragonfly::Assemble::ConstructJob(Compilation &C, const JobAction &JA,
2673d6eaacbb9eb56763d38a3815fc509b92ed98a585Andrew Sapperstein                                       Job &Dest, const InputInfo &Output,
2674d6eaacbb9eb56763d38a3815fc509b92ed98a585Andrew Sapperstein                                       const InputInfoList &Inputs,
2675d6eaacbb9eb56763d38a3815fc509b92ed98a585Andrew Sapperstein                                       const ArgList &Args,
2676d6eaacbb9eb56763d38a3815fc509b92ed98a585Andrew Sapperstein                                       const char *LinkingOutput) const {
2677d6eaacbb9eb56763d38a3815fc509b92ed98a585Andrew Sapperstein  ArgStringList CmdArgs;
2678d6eaacbb9eb56763d38a3815fc509b92ed98a585Andrew Sapperstein
2679d6eaacbb9eb56763d38a3815fc509b92ed98a585Andrew Sapperstein  // When building 32-bit code on DragonFly/pc64, we have to explicitly
2680d6eaacbb9eb56763d38a3815fc509b92ed98a585Andrew Sapperstein  // instruct as in the base system to assemble 32-bit code.
2681d6eaacbb9eb56763d38a3815fc509b92ed98a585Andrew Sapperstein  if (getToolChain().getArchName() == "i386")
2682d6eaacbb9eb56763d38a3815fc509b92ed98a585Andrew Sapperstein    CmdArgs.push_back("--32");
2683d6eaacbb9eb56763d38a3815fc509b92ed98a585Andrew Sapperstein
2684d6eaacbb9eb56763d38a3815fc509b92ed98a585Andrew Sapperstein  Args.AddAllArgValues(CmdArgs, options::OPT_Wa_COMMA,
2685d6eaacbb9eb56763d38a3815fc509b92ed98a585Andrew Sapperstein                       options::OPT_Xassembler);
2686d6eaacbb9eb56763d38a3815fc509b92ed98a585Andrew Sapperstein
2687d6eaacbb9eb56763d38a3815fc509b92ed98a585Andrew Sapperstein  CmdArgs.push_back("-o");
2688d6eaacbb9eb56763d38a3815fc509b92ed98a585Andrew Sapperstein  if (Output.isPipe())
2689d6eaacbb9eb56763d38a3815fc509b92ed98a585Andrew Sapperstein    CmdArgs.push_back("-");
2690d6eaacbb9eb56763d38a3815fc509b92ed98a585Andrew Sapperstein  else
2691d6eaacbb9eb56763d38a3815fc509b92ed98a585Andrew Sapperstein    CmdArgs.push_back(Output.getFilename());
26926ba612efffba42bec102ac58a1540496158f747eAndrew Sapperstein
26936ba612efffba42bec102ac58a1540496158f747eAndrew Sapperstein  for (InputInfoList::const_iterator
2694d6eaacbb9eb56763d38a3815fc509b92ed98a585Andrew Sapperstein         it = Inputs.begin(), ie = Inputs.end(); it != ie; ++it) {
2695d6eaacbb9eb56763d38a3815fc509b92ed98a585Andrew Sapperstein    const InputInfo &II = *it;
2696d6eaacbb9eb56763d38a3815fc509b92ed98a585Andrew Sapperstein    if (II.isPipe())
2697d6eaacbb9eb56763d38a3815fc509b92ed98a585Andrew Sapperstein      CmdArgs.push_back("-");
2698d6eaacbb9eb56763d38a3815fc509b92ed98a585Andrew Sapperstein    else
2699d6eaacbb9eb56763d38a3815fc509b92ed98a585Andrew Sapperstein      CmdArgs.push_back(II.getFilename());
2700d6eaacbb9eb56763d38a3815fc509b92ed98a585Andrew Sapperstein  }
2701d6eaacbb9eb56763d38a3815fc509b92ed98a585Andrew Sapperstein
2702d6eaacbb9eb56763d38a3815fc509b92ed98a585Andrew Sapperstein  const char *Exec =
2703d6eaacbb9eb56763d38a3815fc509b92ed98a585Andrew Sapperstein    Args.MakeArgString(getToolChain().GetProgramPath(C, "as"));
2704d6eaacbb9eb56763d38a3815fc509b92ed98a585Andrew Sapperstein  Dest.addCommand(new Command(JA, *this, Exec, CmdArgs));
2705d6eaacbb9eb56763d38a3815fc509b92ed98a585Andrew Sapperstein}
2706d6eaacbb9eb56763d38a3815fc509b92ed98a585Andrew Sapperstein
2707d6eaacbb9eb56763d38a3815fc509b92ed98a585Andrew Sappersteinvoid dragonfly::Link::ConstructJob(Compilation &C, const JobAction &JA,
2708d6eaacbb9eb56763d38a3815fc509b92ed98a585Andrew Sapperstein                                 Job &Dest, const InputInfo &Output,
2709d6eaacbb9eb56763d38a3815fc509b92ed98a585Andrew Sapperstein                                 const InputInfoList &Inputs,
2710d6eaacbb9eb56763d38a3815fc509b92ed98a585Andrew Sapperstein                                 const ArgList &Args,
2711d6eaacbb9eb56763d38a3815fc509b92ed98a585Andrew Sapperstein                                 const char *LinkingOutput) const {
2712d6eaacbb9eb56763d38a3815fc509b92ed98a585Andrew Sapperstein  const Driver &D = getToolChain().getHost().getDriver();
27136ba612efffba42bec102ac58a1540496158f747eAndrew Sapperstein  ArgStringList CmdArgs;
27146ba612efffba42bec102ac58a1540496158f747eAndrew Sapperstein
2715d6eaacbb9eb56763d38a3815fc509b92ed98a585Andrew Sapperstein  if (Args.hasArg(options::OPT_static)) {
2716d6eaacbb9eb56763d38a3815fc509b92ed98a585Andrew Sapperstein    CmdArgs.push_back("-Bstatic");
2717d6eaacbb9eb56763d38a3815fc509b92ed98a585Andrew Sapperstein  } else {
2718d6eaacbb9eb56763d38a3815fc509b92ed98a585Andrew Sapperstein    if (Args.hasArg(options::OPT_shared))
2719d6eaacbb9eb56763d38a3815fc509b92ed98a585Andrew Sapperstein      CmdArgs.push_back("-Bshareable");
2720d6eaacbb9eb56763d38a3815fc509b92ed98a585Andrew Sapperstein    else {
2721d6eaacbb9eb56763d38a3815fc509b92ed98a585Andrew Sapperstein      CmdArgs.push_back("-dynamic-linker");
2722d6eaacbb9eb56763d38a3815fc509b92ed98a585Andrew Sapperstein      CmdArgs.push_back("/usr/libexec/ld-elf.so.2");
2723d6eaacbb9eb56763d38a3815fc509b92ed98a585Andrew Sapperstein    }
2724d6eaacbb9eb56763d38a3815fc509b92ed98a585Andrew Sapperstein  }
2725d6eaacbb9eb56763d38a3815fc509b92ed98a585Andrew Sapperstein
2726d6eaacbb9eb56763d38a3815fc509b92ed98a585Andrew Sapperstein  // When building 32-bit code on DragonFly/pc64, we have to explicitly
2727d6eaacbb9eb56763d38a3815fc509b92ed98a585Andrew Sapperstein  // instruct ld in the base system to link 32-bit code.
2728d6eaacbb9eb56763d38a3815fc509b92ed98a585Andrew Sapperstein  if (getToolChain().getArchName() == "i386") {
2729d6eaacbb9eb56763d38a3815fc509b92ed98a585Andrew Sapperstein    CmdArgs.push_back("-m");
2730d6eaacbb9eb56763d38a3815fc509b92ed98a585Andrew Sapperstein    CmdArgs.push_back("elf_i386");
2731d6eaacbb9eb56763d38a3815fc509b92ed98a585Andrew Sapperstein  }
2732d6eaacbb9eb56763d38a3815fc509b92ed98a585Andrew Sapperstein
2733d6eaacbb9eb56763d38a3815fc509b92ed98a585Andrew Sapperstein  if (Output.isPipe()) {
27346ba612efffba42bec102ac58a1540496158f747eAndrew Sapperstein    CmdArgs.push_back("-o");
27356ba612efffba42bec102ac58a1540496158f747eAndrew Sapperstein    CmdArgs.push_back("-");
2736d6eaacbb9eb56763d38a3815fc509b92ed98a585Andrew Sapperstein  } else if (Output.isFilename()) {
2737d6eaacbb9eb56763d38a3815fc509b92ed98a585Andrew Sapperstein    CmdArgs.push_back("-o");
2738d6eaacbb9eb56763d38a3815fc509b92ed98a585Andrew Sapperstein    CmdArgs.push_back(Output.getFilename());
2739d6eaacbb9eb56763d38a3815fc509b92ed98a585Andrew Sapperstein  } else {
2740d6eaacbb9eb56763d38a3815fc509b92ed98a585Andrew Sapperstein    assert(Output.isNothing() && "Invalid output.");
2741d6eaacbb9eb56763d38a3815fc509b92ed98a585Andrew Sapperstein  }
2742d6eaacbb9eb56763d38a3815fc509b92ed98a585Andrew Sapperstein
2743d6eaacbb9eb56763d38a3815fc509b92ed98a585Andrew Sapperstein  if (!Args.hasArg(options::OPT_nostdlib) &&
2744d6eaacbb9eb56763d38a3815fc509b92ed98a585Andrew Sapperstein      !Args.hasArg(options::OPT_nostartfiles)) {
2745d6eaacbb9eb56763d38a3815fc509b92ed98a585Andrew Sapperstein    if (!Args.hasArg(options::OPT_shared)) {
2746d6eaacbb9eb56763d38a3815fc509b92ed98a585Andrew Sapperstein      CmdArgs.push_back(Args.MakeArgString(getToolChain().GetFilePath(C, "crt1.o")));
2747d6eaacbb9eb56763d38a3815fc509b92ed98a585Andrew Sapperstein      CmdArgs.push_back(Args.MakeArgString(getToolChain().GetFilePath(C, "crti.o")));
2748d6eaacbb9eb56763d38a3815fc509b92ed98a585Andrew Sapperstein      CmdArgs.push_back(Args.MakeArgString(getToolChain().GetFilePath(C, "crtbegin.o")));
2749d6eaacbb9eb56763d38a3815fc509b92ed98a585Andrew Sapperstein    } else {
2750d6eaacbb9eb56763d38a3815fc509b92ed98a585Andrew Sapperstein      CmdArgs.push_back(Args.MakeArgString(getToolChain().GetFilePath(C, "crti.o")));
2751d6eaacbb9eb56763d38a3815fc509b92ed98a585Andrew Sapperstein      CmdArgs.push_back(Args.MakeArgString(getToolChain().GetFilePath(C, "crtbeginS.o")));
2752d6eaacbb9eb56763d38a3815fc509b92ed98a585Andrew Sapperstein    }
2753d6eaacbb9eb56763d38a3815fc509b92ed98a585Andrew Sapperstein  }
2754d6eaacbb9eb56763d38a3815fc509b92ed98a585Andrew Sapperstein
27556ba612efffba42bec102ac58a1540496158f747eAndrew Sapperstein  Args.AddAllArgs(CmdArgs, options::OPT_L);
27566ba612efffba42bec102ac58a1540496158f747eAndrew Sapperstein  Args.AddAllArgs(CmdArgs, options::OPT_T_Group);
2757d6eaacbb9eb56763d38a3815fc509b92ed98a585Andrew Sapperstein  Args.AddAllArgs(CmdArgs, options::OPT_e);
2758d6eaacbb9eb56763d38a3815fc509b92ed98a585Andrew Sapperstein
2759d6eaacbb9eb56763d38a3815fc509b92ed98a585Andrew Sapperstein  for (InputInfoList::const_iterator
2760d6eaacbb9eb56763d38a3815fc509b92ed98a585Andrew Sapperstein         it = Inputs.begin(), ie = Inputs.end(); it != ie; ++it) {
2761d6eaacbb9eb56763d38a3815fc509b92ed98a585Andrew Sapperstein    const InputInfo &II = *it;
2762d6eaacbb9eb56763d38a3815fc509b92ed98a585Andrew Sapperstein
2763d6eaacbb9eb56763d38a3815fc509b92ed98a585Andrew Sapperstein    // Don't try to pass LLVM inputs to a generic gcc.
2764d6eaacbb9eb56763d38a3815fc509b92ed98a585Andrew Sapperstein    if (II.getType() == types::TY_LLVMBC)
2765d6eaacbb9eb56763d38a3815fc509b92ed98a585Andrew Sapperstein      D.Diag(clang::diag::err_drv_no_linker_llvm_support)
2766d6eaacbb9eb56763d38a3815fc509b92ed98a585Andrew Sapperstein        << getToolChain().getTripleString();
2767d6eaacbb9eb56763d38a3815fc509b92ed98a585Andrew Sapperstein
2768d6eaacbb9eb56763d38a3815fc509b92ed98a585Andrew Sapperstein    if (II.isPipe())
2769d6eaacbb9eb56763d38a3815fc509b92ed98a585Andrew Sapperstein      CmdArgs.push_back("-");
2770d6eaacbb9eb56763d38a3815fc509b92ed98a585Andrew Sapperstein    else if (II.isFilename())
2771d6eaacbb9eb56763d38a3815fc509b92ed98a585Andrew Sapperstein      CmdArgs.push_back(II.getFilename());
2772d6eaacbb9eb56763d38a3815fc509b92ed98a585Andrew Sapperstein    else
2773d6eaacbb9eb56763d38a3815fc509b92ed98a585Andrew Sapperstein      II.getInputArg().renderAsInput(Args, CmdArgs);
2774d6eaacbb9eb56763d38a3815fc509b92ed98a585Andrew Sapperstein  }
2775d6eaacbb9eb56763d38a3815fc509b92ed98a585Andrew Sapperstein
27766ba612efffba42bec102ac58a1540496158f747eAndrew Sapperstein  if (!Args.hasArg(options::OPT_nostdlib) &&
27776ba612efffba42bec102ac58a1540496158f747eAndrew Sapperstein      !Args.hasArg(options::OPT_nodefaultlibs)) {
2778d6eaacbb9eb56763d38a3815fc509b92ed98a585Andrew Sapperstein    // FIXME: GCC passes on -lgcc, -lgcc_pic and a whole lot of
2779d6eaacbb9eb56763d38a3815fc509b92ed98a585Andrew Sapperstein    //         rpaths
2780d6eaacbb9eb56763d38a3815fc509b92ed98a585Andrew Sapperstein    CmdArgs.push_back("-L/usr/lib/gcc41");
2781d6eaacbb9eb56763d38a3815fc509b92ed98a585Andrew Sapperstein
2782d6eaacbb9eb56763d38a3815fc509b92ed98a585Andrew Sapperstein    if (!Args.hasArg(options::OPT_static)) {
2783d6eaacbb9eb56763d38a3815fc509b92ed98a585Andrew Sapperstein      CmdArgs.push_back("-rpath");
2784d6eaacbb9eb56763d38a3815fc509b92ed98a585Andrew Sapperstein      CmdArgs.push_back("/usr/lib/gcc41");
2785d6eaacbb9eb56763d38a3815fc509b92ed98a585Andrew Sapperstein
2786d6eaacbb9eb56763d38a3815fc509b92ed98a585Andrew Sapperstein      CmdArgs.push_back("-rpath-link");
2787d6eaacbb9eb56763d38a3815fc509b92ed98a585Andrew Sapperstein      CmdArgs.push_back("/usr/lib/gcc41");
2788d6eaacbb9eb56763d38a3815fc509b92ed98a585Andrew Sapperstein
2789d6eaacbb9eb56763d38a3815fc509b92ed98a585Andrew Sapperstein      CmdArgs.push_back("-rpath");
2790d6eaacbb9eb56763d38a3815fc509b92ed98a585Andrew Sapperstein      CmdArgs.push_back("/usr/lib");
2791d6eaacbb9eb56763d38a3815fc509b92ed98a585Andrew Sapperstein
2792d6eaacbb9eb56763d38a3815fc509b92ed98a585Andrew Sapperstein      CmdArgs.push_back("-rpath-link");
2793d6eaacbb9eb56763d38a3815fc509b92ed98a585Andrew Sapperstein      CmdArgs.push_back("/usr/lib");
2794d6eaacbb9eb56763d38a3815fc509b92ed98a585Andrew Sapperstein    }
2795d6eaacbb9eb56763d38a3815fc509b92ed98a585Andrew Sapperstein
27966ba612efffba42bec102ac58a1540496158f747eAndrew Sapperstein    if (Args.hasArg(options::OPT_shared)) {
27976ba612efffba42bec102ac58a1540496158f747eAndrew Sapperstein      CmdArgs.push_back("-lgcc_pic");
2798d6eaacbb9eb56763d38a3815fc509b92ed98a585Andrew Sapperstein    } else {
2799d6eaacbb9eb56763d38a3815fc509b92ed98a585Andrew Sapperstein      CmdArgs.push_back("-lgcc");
2800d6eaacbb9eb56763d38a3815fc509b92ed98a585Andrew Sapperstein    }
2801d6eaacbb9eb56763d38a3815fc509b92ed98a585Andrew Sapperstein
2802d6eaacbb9eb56763d38a3815fc509b92ed98a585Andrew Sapperstein
2803d6eaacbb9eb56763d38a3815fc509b92ed98a585Andrew Sapperstein    if (Args.hasArg(options::OPT_pthread))
2804d6eaacbb9eb56763d38a3815fc509b92ed98a585Andrew Sapperstein      CmdArgs.push_back("-lpthread");
2805d6eaacbb9eb56763d38a3815fc509b92ed98a585Andrew Sapperstein
2806d6eaacbb9eb56763d38a3815fc509b92ed98a585Andrew Sapperstein    if (!Args.hasArg(options::OPT_nolibc)) {
2807d6eaacbb9eb56763d38a3815fc509b92ed98a585Andrew Sapperstein      CmdArgs.push_back("-lc");
2808d6eaacbb9eb56763d38a3815fc509b92ed98a585Andrew Sapperstein    }
2809d6eaacbb9eb56763d38a3815fc509b92ed98a585Andrew Sapperstein
2810d6eaacbb9eb56763d38a3815fc509b92ed98a585Andrew Sapperstein    if (Args.hasArg(options::OPT_shared)) {
2811d6eaacbb9eb56763d38a3815fc509b92ed98a585Andrew Sapperstein      CmdArgs.push_back("-lgcc_pic");
2812d6eaacbb9eb56763d38a3815fc509b92ed98a585Andrew Sapperstein    } else {
2813d6eaacbb9eb56763d38a3815fc509b92ed98a585Andrew Sapperstein      CmdArgs.push_back("-lgcc");
2814d6eaacbb9eb56763d38a3815fc509b92ed98a585Andrew Sapperstein    }
2815d6eaacbb9eb56763d38a3815fc509b92ed98a585Andrew Sapperstein  }
28166ba612efffba42bec102ac58a1540496158f747eAndrew Sapperstein
28176ba612efffba42bec102ac58a1540496158f747eAndrew Sapperstein  if (!Args.hasArg(options::OPT_nostdlib) &&
2818d6eaacbb9eb56763d38a3815fc509b92ed98a585Andrew Sapperstein      !Args.hasArg(options::OPT_nostartfiles)) {
2819d6eaacbb9eb56763d38a3815fc509b92ed98a585Andrew Sapperstein    if (!Args.hasArg(options::OPT_shared))
2820d6eaacbb9eb56763d38a3815fc509b92ed98a585Andrew Sapperstein      CmdArgs.push_back(Args.MakeArgString(getToolChain().GetFilePath(C, "crtend.o")));
2821d6eaacbb9eb56763d38a3815fc509b92ed98a585Andrew Sapperstein    else
2822d6eaacbb9eb56763d38a3815fc509b92ed98a585Andrew Sapperstein      CmdArgs.push_back(Args.MakeArgString(getToolChain().GetFilePath(C, "crtendS.o")));
2823d6eaacbb9eb56763d38a3815fc509b92ed98a585Andrew Sapperstein    CmdArgs.push_back(Args.MakeArgString(getToolChain().GetFilePath(C, "crtn.o")));
2824d6eaacbb9eb56763d38a3815fc509b92ed98a585Andrew Sapperstein  }
2825d6eaacbb9eb56763d38a3815fc509b92ed98a585Andrew Sapperstein
2826d6eaacbb9eb56763d38a3815fc509b92ed98a585Andrew Sapperstein  const char *Exec =
2827d6eaacbb9eb56763d38a3815fc509b92ed98a585Andrew Sapperstein    Args.MakeArgString(getToolChain().GetProgramPath(C, "ld"));
2828d6eaacbb9eb56763d38a3815fc509b92ed98a585Andrew Sapperstein  Dest.addCommand(new Command(JA, *this, Exec, CmdArgs));
2829d6eaacbb9eb56763d38a3815fc509b92ed98a585Andrew Sapperstein}
2830d6eaacbb9eb56763d38a3815fc509b92ed98a585Andrew Sapperstein