Tools.cpp revision cd9902bfb79c5c67559360514951714bdafac36e
147ac7d27c44bd64a7d0fc03d4babc196cf2b8230Daniel Dunbar//===--- Tools.cpp - Tools Implementations ------------------------------*-===//
247ac7d27c44bd64a7d0fc03d4babc196cf2b8230Daniel Dunbar//
347ac7d27c44bd64a7d0fc03d4babc196cf2b8230Daniel Dunbar//                     The LLVM Compiler Infrastructure
447ac7d27c44bd64a7d0fc03d4babc196cf2b8230Daniel Dunbar//
547ac7d27c44bd64a7d0fc03d4babc196cf2b8230Daniel Dunbar// This file is distributed under the University of Illinois Open Source
647ac7d27c44bd64a7d0fc03d4babc196cf2b8230Daniel Dunbar// License. See LICENSE.TXT for details.
747ac7d27c44bd64a7d0fc03d4babc196cf2b8230Daniel Dunbar//
847ac7d27c44bd64a7d0fc03d4babc196cf2b8230Daniel Dunbar//===----------------------------------------------------------------------===//
947ac7d27c44bd64a7d0fc03d4babc196cf2b8230Daniel Dunbar
1047ac7d27c44bd64a7d0fc03d4babc196cf2b8230Daniel Dunbar#include "Tools.h"
1147ac7d27c44bd64a7d0fc03d4babc196cf2b8230Daniel Dunbar
121d46033f760ba5fd266ce59fe391fac473f04f52Daniel Dunbar#include "clang/Driver/Action.h"
13871adcf4e41285e3f4c3b62eaa1b2e05b60b92daDaniel Dunbar#include "clang/Driver/Arg.h"
14b488c1dac8e53206f07103d794a62a3f5012c0f4Daniel Dunbar#include "clang/Driver/ArgList.h"
15ee848a73e5f8ffe7511af8652ba811c020d1c7a0Daniel Dunbar#include "clang/Driver/Driver.h"
16ee848a73e5f8ffe7511af8652ba811c020d1c7a0Daniel Dunbar#include "clang/Driver/DriverDiagnostic.h"
17871adcf4e41285e3f4c3b62eaa1b2e05b60b92daDaniel Dunbar#include "clang/Driver/Compilation.h"
18871adcf4e41285e3f4c3b62eaa1b2e05b60b92daDaniel Dunbar#include "clang/Driver/Job.h"
19b488c1dac8e53206f07103d794a62a3f5012c0f4Daniel Dunbar#include "clang/Driver/HostInfo.h"
20b488c1dac8e53206f07103d794a62a3f5012c0f4Daniel Dunbar#include "clang/Driver/Option.h"
21265e9ef9f3ef30a97790e6e7bbc3c17d97981ca7Daniel Dunbar#include "clang/Driver/Options.h"
22b488c1dac8e53206f07103d794a62a3f5012c0f4Daniel Dunbar#include "clang/Driver/ToolChain.h"
23871adcf4e41285e3f4c3b62eaa1b2e05b60b92daDaniel Dunbar#include "clang/Driver/Util.h"
24871adcf4e41285e3f4c3b62eaa1b2e05b60b92daDaniel Dunbar
25881376467c46c5c6cc16fa6790271c2c22e1d4f1Daniel Dunbar#include "llvm/ADT/SmallString.h"
2655d3f7ae512875a1d6402943c3a619633feb2a18Douglas Gregor#include "llvm/ADT/StringSwitch.h"
275b750fe6189a41937ff2b080a983c95ea273769fDaniel Dunbar#include "llvm/ADT/Twine.h"
2802633b541b04ad5ffc1c70f4c2feeeb13e607057Daniel Dunbar#include "llvm/Support/Format.h"
2902633b541b04ad5ffc1c70f4c2feeeb13e607057Daniel Dunbar#include "llvm/Support/raw_ostream.h"
30f86feddbd5b13d2c144132e35d608fa630784dbbDaniel Dunbar#include "llvm/System/Host.h"
3155efe142a84b2aab6d0186c20a311c347a65f794Daniel Dunbar#include "llvm/System/Process.h"
32871adcf4e41285e3f4c3b62eaa1b2e05b60b92daDaniel Dunbar
33871adcf4e41285e3f4c3b62eaa1b2e05b60b92daDaniel Dunbar#include "InputInfo.h"
3402633b541b04ad5ffc1c70f4c2feeeb13e607057Daniel Dunbar#include "ToolChains.h"
35871adcf4e41285e3f4c3b62eaa1b2e05b60b92daDaniel Dunbar
3647ac7d27c44bd64a7d0fc03d4babc196cf2b8230Daniel Dunbarusing namespace clang::driver;
3747ac7d27c44bd64a7d0fc03d4babc196cf2b8230Daniel Dunbarusing namespace clang::driver::tools;
3847ac7d27c44bd64a7d0fc03d4babc196cf2b8230Daniel Dunbar
3988a3d6cf5ebab81614f89ba48a8d89023270637aDaniel Dunbar/// CheckPreprocessingOptions - Perform some validation of preprocessing
4088a3d6cf5ebab81614f89ba48a8d89023270637aDaniel Dunbar/// arguments that is shared with gcc.
4188a3d6cf5ebab81614f89ba48a8d89023270637aDaniel Dunbarstatic void CheckPreprocessingOptions(const Driver &D, const ArgList &Args) {
4288a3d6cf5ebab81614f89ba48a8d89023270637aDaniel Dunbar  if (Arg *A = Args.getLastArg(options::OPT_C, options::OPT_CC))
4388a3d6cf5ebab81614f89ba48a8d89023270637aDaniel Dunbar    if (!Args.hasArg(options::OPT_E))
4488a3d6cf5ebab81614f89ba48a8d89023270637aDaniel Dunbar      D.Diag(clang::diag::err_drv_argument_only_allowed_with)
4588a3d6cf5ebab81614f89ba48a8d89023270637aDaniel Dunbar        << A->getAsString(Args) << "-E";
4688a3d6cf5ebab81614f89ba48a8d89023270637aDaniel Dunbar}
4788a3d6cf5ebab81614f89ba48a8d89023270637aDaniel Dunbar
48e2fd66418eca3d70cf6b62087d745d0c5181db69Daniel Dunbar/// CheckCodeGenerationOptions - Perform some validation of code generation
49e2fd66418eca3d70cf6b62087d745d0c5181db69Daniel Dunbar/// arguments that is shared with gcc.
50e2fd66418eca3d70cf6b62087d745d0c5181db69Daniel Dunbarstatic void CheckCodeGenerationOptions(const Driver &D, const ArgList &Args) {
51e2fd66418eca3d70cf6b62087d745d0c5181db69Daniel Dunbar  // In gcc, only ARM checks this, but it seems reasonable to check universally.
52e2fd66418eca3d70cf6b62087d745d0c5181db69Daniel Dunbar  if (Args.hasArg(options::OPT_static))
53e2fd66418eca3d70cf6b62087d745d0c5181db69Daniel Dunbar    if (const Arg *A = Args.getLastArg(options::OPT_dynamic,
54e2fd66418eca3d70cf6b62087d745d0c5181db69Daniel Dunbar                                       options::OPT_mdynamic_no_pic))
55e2fd66418eca3d70cf6b62087d745d0c5181db69Daniel Dunbar      D.Diag(clang::diag::err_drv_argument_not_allowed_with)
56e2fd66418eca3d70cf6b62087d745d0c5181db69Daniel Dunbar        << A->getAsString(Args) << "-static";
57e2fd66418eca3d70cf6b62087d745d0c5181db69Daniel Dunbar}
58e2fd66418eca3d70cf6b62087d745d0c5181db69Daniel Dunbar
591eb4433ac451dc16f4133a88af2d002ac26c58efMike Stumpvoid Clang::AddPreprocessingOptions(const Driver &D,
60df91ef3d6c55692a0236f67b6c6b134a3bf84098Douglas Gregor                                    const ArgList &Args,
61c21c485b4fb58ef5d55cf3e523263dd824a2ace4Daniel Dunbar                                    ArgStringList &CmdArgs,
62c21c485b4fb58ef5d55cf3e523263dd824a2ace4Daniel Dunbar                                    const InputInfo &Output,
63c21c485b4fb58ef5d55cf3e523263dd824a2ace4Daniel Dunbar                                    const InputInfoList &Inputs) const {
64c21c485b4fb58ef5d55cf3e523263dd824a2ace4Daniel Dunbar  Arg *A;
653a183d3d46426d8719031553131b8928f50aa606Daniel Dunbar
6688a3d6cf5ebab81614f89ba48a8d89023270637aDaniel Dunbar  CheckPreprocessingOptions(D, Args);
6788a3d6cf5ebab81614f89ba48a8d89023270637aDaniel Dunbar
6888a3d6cf5ebab81614f89ba48a8d89023270637aDaniel Dunbar  Args.AddLastArg(CmdArgs, options::OPT_C);
6988a3d6cf5ebab81614f89ba48a8d89023270637aDaniel Dunbar  Args.AddLastArg(CmdArgs, options::OPT_CC);
703a183d3d46426d8719031553131b8928f50aa606Daniel Dunbar
713a183d3d46426d8719031553131b8928f50aa606Daniel Dunbar  // Handle dependency file generation.
72c21c485b4fb58ef5d55cf3e523263dd824a2ace4Daniel Dunbar  if ((A = Args.getLastArg(options::OPT_M)) ||
73c21c485b4fb58ef5d55cf3e523263dd824a2ace4Daniel Dunbar      (A = Args.getLastArg(options::OPT_MM)) ||
74c21c485b4fb58ef5d55cf3e523263dd824a2ace4Daniel Dunbar      (A = Args.getLastArg(options::OPT_MD)) ||
75c21c485b4fb58ef5d55cf3e523263dd824a2ace4Daniel Dunbar      (A = Args.getLastArg(options::OPT_MMD))) {
76c21c485b4fb58ef5d55cf3e523263dd824a2ace4Daniel Dunbar    // Determine the output location.
77c21c485b4fb58ef5d55cf3e523263dd824a2ace4Daniel Dunbar    const char *DepFile;
78c21c485b4fb58ef5d55cf3e523263dd824a2ace4Daniel Dunbar    if (Output.getType() == types::TY_Dependencies) {
79c21c485b4fb58ef5d55cf3e523263dd824a2ace4Daniel Dunbar      if (Output.isPipe())
80c21c485b4fb58ef5d55cf3e523263dd824a2ace4Daniel Dunbar        DepFile = "-";
81c21c485b4fb58ef5d55cf3e523263dd824a2ace4Daniel Dunbar      else
82c21c485b4fb58ef5d55cf3e523263dd824a2ace4Daniel Dunbar        DepFile = Output.getFilename();
83c21c485b4fb58ef5d55cf3e523263dd824a2ace4Daniel Dunbar    } else if (Arg *MF = Args.getLastArg(options::OPT_MF)) {
84c21c485b4fb58ef5d55cf3e523263dd824a2ace4Daniel Dunbar      DepFile = MF->getValue(Args);
85b827a0541b5fd095fcdb7ad0c3df93ca158c619aDaniel Dunbar    } else if (A->getOption().matches(options::OPT_M) ||
86b827a0541b5fd095fcdb7ad0c3df93ca158c619aDaniel Dunbar               A->getOption().matches(options::OPT_MM)) {
87c21c485b4fb58ef5d55cf3e523263dd824a2ace4Daniel Dunbar      DepFile = "-";
88c21c485b4fb58ef5d55cf3e523263dd824a2ace4Daniel Dunbar    } else {
89c21c485b4fb58ef5d55cf3e523263dd824a2ace4Daniel Dunbar      DepFile = darwin::CC1::getDependencyFileName(Args, Inputs);
90c21c485b4fb58ef5d55cf3e523263dd824a2ace4Daniel Dunbar    }
91c21c485b4fb58ef5d55cf3e523263dd824a2ace4Daniel Dunbar    CmdArgs.push_back("-dependency-file");
92c21c485b4fb58ef5d55cf3e523263dd824a2ace4Daniel Dunbar    CmdArgs.push_back(DepFile);
93c21c485b4fb58ef5d55cf3e523263dd824a2ace4Daniel Dunbar
94c21c485b4fb58ef5d55cf3e523263dd824a2ace4Daniel Dunbar    // Add an -MT option if the user didn't specify their own.
95e0be8b1729d8978de433d229c065830b95d0ae68Daniel Dunbar    //
96c21c485b4fb58ef5d55cf3e523263dd824a2ace4Daniel Dunbar    // FIXME: This should use -MQ, when we support it.
97c21c485b4fb58ef5d55cf3e523263dd824a2ace4Daniel Dunbar    if (!Args.hasArg(options::OPT_MT) && !Args.hasArg(options::OPT_MQ)) {
98c21c485b4fb58ef5d55cf3e523263dd824a2ace4Daniel Dunbar      const char *DepTarget;
99c21c485b4fb58ef5d55cf3e523263dd824a2ace4Daniel Dunbar
100c21c485b4fb58ef5d55cf3e523263dd824a2ace4Daniel Dunbar      // If user provided -o, that is the dependency target, except
101c21c485b4fb58ef5d55cf3e523263dd824a2ace4Daniel Dunbar      // when we are only generating a dependency file.
102c21c485b4fb58ef5d55cf3e523263dd824a2ace4Daniel Dunbar      Arg *OutputOpt = Args.getLastArg(options::OPT_o);
103c21c485b4fb58ef5d55cf3e523263dd824a2ace4Daniel Dunbar      if (OutputOpt && Output.getType() != types::TY_Dependencies) {
104c21c485b4fb58ef5d55cf3e523263dd824a2ace4Daniel Dunbar        DepTarget = OutputOpt->getValue(Args);
105c21c485b4fb58ef5d55cf3e523263dd824a2ace4Daniel Dunbar      } else {
106c21c485b4fb58ef5d55cf3e523263dd824a2ace4Daniel Dunbar        // Otherwise derive from the base input.
107c21c485b4fb58ef5d55cf3e523263dd824a2ace4Daniel Dunbar        //
108c21c485b4fb58ef5d55cf3e523263dd824a2ace4Daniel Dunbar        // FIXME: This should use the computed output file location.
109c21c485b4fb58ef5d55cf3e523263dd824a2ace4Daniel Dunbar        llvm::sys::Path P(Inputs[0].getBaseInput());
110c21c485b4fb58ef5d55cf3e523263dd824a2ace4Daniel Dunbar
111c21c485b4fb58ef5d55cf3e523263dd824a2ace4Daniel Dunbar        P.eraseSuffix();
112c21c485b4fb58ef5d55cf3e523263dd824a2ace4Daniel Dunbar        P.appendSuffix("o");
113881376467c46c5c6cc16fa6790271c2c22e1d4f1Daniel Dunbar        DepTarget = Args.MakeArgString(P.getLast());
114c21c485b4fb58ef5d55cf3e523263dd824a2ace4Daniel Dunbar      }
115c21c485b4fb58ef5d55cf3e523263dd824a2ace4Daniel Dunbar
116c21c485b4fb58ef5d55cf3e523263dd824a2ace4Daniel Dunbar      CmdArgs.push_back("-MT");
117c21c485b4fb58ef5d55cf3e523263dd824a2ace4Daniel Dunbar      CmdArgs.push_back(DepTarget);
118c21c485b4fb58ef5d55cf3e523263dd824a2ace4Daniel Dunbar    }
119c21c485b4fb58ef5d55cf3e523263dd824a2ace4Daniel Dunbar
120b827a0541b5fd095fcdb7ad0c3df93ca158c619aDaniel Dunbar    if (A->getOption().matches(options::OPT_M) ||
121b827a0541b5fd095fcdb7ad0c3df93ca158c619aDaniel Dunbar        A->getOption().matches(options::OPT_MD))
122c21c485b4fb58ef5d55cf3e523263dd824a2ace4Daniel Dunbar      CmdArgs.push_back("-sys-header-deps");
123c21c485b4fb58ef5d55cf3e523263dd824a2ace4Daniel Dunbar  }
124c21c485b4fb58ef5d55cf3e523263dd824a2ace4Daniel Dunbar
125c21c485b4fb58ef5d55cf3e523263dd824a2ace4Daniel Dunbar  Args.AddLastArg(CmdArgs, options::OPT_MP);
126c21c485b4fb58ef5d55cf3e523263dd824a2ace4Daniel Dunbar  Args.AddAllArgs(CmdArgs, options::OPT_MT);
127c21c485b4fb58ef5d55cf3e523263dd824a2ace4Daniel Dunbar
128df91ef3d6c55692a0236f67b6c6b134a3bf84098Douglas Gregor  // Add -i* options, and automatically translate to
129df91ef3d6c55692a0236f67b6c6b134a3bf84098Douglas Gregor  // -include-pch/-include-pth for transparent PCH support. It's
130df91ef3d6c55692a0236f67b6c6b134a3bf84098Douglas Gregor  // wonky, but we include looking for .gch so we can support seamless
131df91ef3d6c55692a0236f67b6c6b134a3bf84098Douglas Gregor  // replacement into a build system already set up to be generating
132df91ef3d6c55692a0236f67b6c6b134a3bf84098Douglas Gregor  // .gch files.
133cdd9686b890ebdc10039ae256ef4c9dfb5ebacb7Daniel Dunbar  for (arg_iterator it = Args.filtered_begin(options::OPT_clang_i_Group),
134cdd9686b890ebdc10039ae256ef4c9dfb5ebacb7Daniel Dunbar         ie = Args.filtered_end(); it != ie; ++it) {
135cdd9686b890ebdc10039ae256ef4c9dfb5ebacb7Daniel Dunbar    const Arg *A = it;
136c21c485b4fb58ef5d55cf3e523263dd824a2ace4Daniel Dunbar
137c21c485b4fb58ef5d55cf3e523263dd824a2ace4Daniel Dunbar    if (A->getOption().matches(options::OPT_include)) {
1380ebd9321ba380471010341f24c874f46f56e7581Daniel Dunbar      // Use PCH if the user requested it, except for C++ (for now).
1390ebd9321ba380471010341f24c874f46f56e7581Daniel Dunbar      bool UsePCH = D.CCCUsePCH;
1400ebd9321ba380471010341f24c874f46f56e7581Daniel Dunbar      if (types::isCXX(Inputs[0].getType()))
1410ebd9321ba380471010341f24c874f46f56e7581Daniel Dunbar        UsePCH = false;
1420ebd9321ba380471010341f24c874f46f56e7581Daniel Dunbar
143c21c485b4fb58ef5d55cf3e523263dd824a2ace4Daniel Dunbar      bool FoundPTH = false;
144df91ef3d6c55692a0236f67b6c6b134a3bf84098Douglas Gregor      bool FoundPCH = false;
145c21c485b4fb58ef5d55cf3e523263dd824a2ace4Daniel Dunbar      llvm::sys::Path P(A->getValue(Args));
1460ebd9321ba380471010341f24c874f46f56e7581Daniel Dunbar      if (UsePCH) {
147df91ef3d6c55692a0236f67b6c6b134a3bf84098Douglas Gregor        P.appendSuffix("pch");
148c21c485b4fb58ef5d55cf3e523263dd824a2ace4Daniel Dunbar        if (P.exists())
149df91ef3d6c55692a0236f67b6c6b134a3bf84098Douglas Gregor          FoundPCH = true;
1501eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump        else
151df91ef3d6c55692a0236f67b6c6b134a3bf84098Douglas Gregor          P.eraseSuffix();
152df91ef3d6c55692a0236f67b6c6b134a3bf84098Douglas Gregor      }
153df91ef3d6c55692a0236f67b6c6b134a3bf84098Douglas Gregor
154df91ef3d6c55692a0236f67b6c6b134a3bf84098Douglas Gregor      if (!FoundPCH) {
155df91ef3d6c55692a0236f67b6c6b134a3bf84098Douglas Gregor        P.appendSuffix("pth");
1561eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump        if (P.exists())
157c21c485b4fb58ef5d55cf3e523263dd824a2ace4Daniel Dunbar          FoundPTH = true;
158df91ef3d6c55692a0236f67b6c6b134a3bf84098Douglas Gregor        else
159df91ef3d6c55692a0236f67b6c6b134a3bf84098Douglas Gregor          P.eraseSuffix();
1601eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump      }
1611eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump
162df91ef3d6c55692a0236f67b6c6b134a3bf84098Douglas Gregor      if (!FoundPCH && !FoundPTH) {
163df91ef3d6c55692a0236f67b6c6b134a3bf84098Douglas Gregor        P.appendSuffix("gch");
164df91ef3d6c55692a0236f67b6c6b134a3bf84098Douglas Gregor        if (P.exists()) {
1650ebd9321ba380471010341f24c874f46f56e7581Daniel Dunbar          FoundPCH = UsePCH;
1660ebd9321ba380471010341f24c874f46f56e7581Daniel Dunbar          FoundPTH = !UsePCH;
167df91ef3d6c55692a0236f67b6c6b134a3bf84098Douglas Gregor        }
1681eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump        else
169df91ef3d6c55692a0236f67b6c6b134a3bf84098Douglas Gregor          P.eraseSuffix();
170c21c485b4fb58ef5d55cf3e523263dd824a2ace4Daniel Dunbar      }
171c21c485b4fb58ef5d55cf3e523263dd824a2ace4Daniel Dunbar
172df91ef3d6c55692a0236f67b6c6b134a3bf84098Douglas Gregor      if (FoundPCH || FoundPTH) {
173c21c485b4fb58ef5d55cf3e523263dd824a2ace4Daniel Dunbar        A->claim();
1740ebd9321ba380471010341f24c874f46f56e7581Daniel Dunbar        if (UsePCH)
175df91ef3d6c55692a0236f67b6c6b134a3bf84098Douglas Gregor          CmdArgs.push_back("-include-pch");
176df91ef3d6c55692a0236f67b6c6b134a3bf84098Douglas Gregor        else
177df91ef3d6c55692a0236f67b6c6b134a3bf84098Douglas Gregor          CmdArgs.push_back("-include-pth");
178881376467c46c5c6cc16fa6790271c2c22e1d4f1Daniel Dunbar        CmdArgs.push_back(Args.MakeArgString(P.str()));
179c21c485b4fb58ef5d55cf3e523263dd824a2ace4Daniel Dunbar        continue;
180c21c485b4fb58ef5d55cf3e523263dd824a2ace4Daniel Dunbar      }
181c21c485b4fb58ef5d55cf3e523263dd824a2ace4Daniel Dunbar    }
182c21c485b4fb58ef5d55cf3e523263dd824a2ace4Daniel Dunbar
183c21c485b4fb58ef5d55cf3e523263dd824a2ace4Daniel Dunbar    // Not translated, render as usual.
184c21c485b4fb58ef5d55cf3e523263dd824a2ace4Daniel Dunbar    A->claim();
185c21c485b4fb58ef5d55cf3e523263dd824a2ace4Daniel Dunbar    A->render(Args, CmdArgs);
186c21c485b4fb58ef5d55cf3e523263dd824a2ace4Daniel Dunbar  }
187c21c485b4fb58ef5d55cf3e523263dd824a2ace4Daniel Dunbar
188c21c485b4fb58ef5d55cf3e523263dd824a2ace4Daniel Dunbar  Args.AddAllArgs(CmdArgs, options::OPT_D, options::OPT_U);
189c21c485b4fb58ef5d55cf3e523263dd824a2ace4Daniel Dunbar  Args.AddAllArgs(CmdArgs, options::OPT_I_Group, options::OPT_F);
190c21c485b4fb58ef5d55cf3e523263dd824a2ace4Daniel Dunbar
191c21c485b4fb58ef5d55cf3e523263dd824a2ace4Daniel Dunbar  // Add -Wp, and -Xassembler if using the preprocessor.
192c21c485b4fb58ef5d55cf3e523263dd824a2ace4Daniel Dunbar
193c21c485b4fb58ef5d55cf3e523263dd824a2ace4Daniel Dunbar  // FIXME: There is a very unfortunate problem here, some troubled
194c21c485b4fb58ef5d55cf3e523263dd824a2ace4Daniel Dunbar  // souls abuse -Wp, to pass preprocessor options in gcc syntax. To
195c21c485b4fb58ef5d55cf3e523263dd824a2ace4Daniel Dunbar  // really support that we would have to parse and then translate
196c21c485b4fb58ef5d55cf3e523263dd824a2ace4Daniel Dunbar  // those options. :(
197c21c485b4fb58ef5d55cf3e523263dd824a2ace4Daniel Dunbar  Args.AddAllArgValues(CmdArgs, options::OPT_Wp_COMMA,
198c21c485b4fb58ef5d55cf3e523263dd824a2ace4Daniel Dunbar                       options::OPT_Xpreprocessor);
199607d7f6d8f21066cc48bbe2c51e6ca412a00943fDaniel Dunbar
200607d7f6d8f21066cc48bbe2c51e6ca412a00943fDaniel Dunbar  // -I- is a deprecated GCC feature, reject it.
201607d7f6d8f21066cc48bbe2c51e6ca412a00943fDaniel Dunbar  if (Arg *A = Args.getLastArg(options::OPT_I_))
202607d7f6d8f21066cc48bbe2c51e6ca412a00943fDaniel Dunbar    D.Diag(clang::diag::err_drv_I_dash_not_supported) << A->getAsString(Args);
203c21c485b4fb58ef5d55cf3e523263dd824a2ace4Daniel Dunbar}
204c21c485b4fb58ef5d55cf3e523263dd824a2ace4Daniel Dunbar
205728a512753d85a6ccaae34e81385c8665c2de0e1Daniel Dunbar/// getARMTargetCPU - Get the (LLVM) name of the ARM cpu we are targetting.
206728a512753d85a6ccaae34e81385c8665c2de0e1Daniel Dunbar//
207728a512753d85a6ccaae34e81385c8665c2de0e1Daniel Dunbar// FIXME: tblgen this.
208a31100e62f83933432df9092a04e48f9e5561a14Daniel Dunbarstatic const char *getARMTargetCPU(const ArgList &Args) {
209728a512753d85a6ccaae34e81385c8665c2de0e1Daniel Dunbar  // FIXME: Warn on inconsistent use of -mcpu and -march.
210b163ef7e7a5d904ef0962a7c38c460be083c4d63Daniel Dunbar
211b163ef7e7a5d904ef0962a7c38c460be083c4d63Daniel Dunbar  // If we have -mcpu=, use that.
212b163ef7e7a5d904ef0962a7c38c460be083c4d63Daniel Dunbar  if (Arg *A = Args.getLastArg(options::OPT_mcpu_EQ))
213b163ef7e7a5d904ef0962a7c38c460be083c4d63Daniel Dunbar    return A->getValue(Args);
214b163ef7e7a5d904ef0962a7c38c460be083c4d63Daniel Dunbar
215b163ef7e7a5d904ef0962a7c38c460be083c4d63Daniel Dunbar  // Otherwise, if we have -march= choose the base CPU for that arch.
216b163ef7e7a5d904ef0962a7c38c460be083c4d63Daniel Dunbar  if (Arg *A = Args.getLastArg(options::OPT_march_EQ)) {
217b163ef7e7a5d904ef0962a7c38c460be083c4d63Daniel Dunbar    llvm::StringRef MArch = A->getValue(Args);
218b163ef7e7a5d904ef0962a7c38c460be083c4d63Daniel Dunbar
219b163ef7e7a5d904ef0962a7c38c460be083c4d63Daniel Dunbar    if (MArch == "armv2" || MArch == "armv2a")
220b163ef7e7a5d904ef0962a7c38c460be083c4d63Daniel Dunbar      return "arm2";
221b163ef7e7a5d904ef0962a7c38c460be083c4d63Daniel Dunbar    if (MArch == "armv3")
222b163ef7e7a5d904ef0962a7c38c460be083c4d63Daniel Dunbar      return "arm6";
223b163ef7e7a5d904ef0962a7c38c460be083c4d63Daniel Dunbar    if (MArch == "armv3m")
224b163ef7e7a5d904ef0962a7c38c460be083c4d63Daniel Dunbar      return "arm7m";
225b163ef7e7a5d904ef0962a7c38c460be083c4d63Daniel Dunbar    if (MArch == "armv4" || MArch == "armv4t")
226b163ef7e7a5d904ef0962a7c38c460be083c4d63Daniel Dunbar      return "arm7tdmi";
227b163ef7e7a5d904ef0962a7c38c460be083c4d63Daniel Dunbar    if (MArch == "armv5" || MArch == "armv5t")
228b163ef7e7a5d904ef0962a7c38c460be083c4d63Daniel Dunbar      return "arm10tdmi";
229b163ef7e7a5d904ef0962a7c38c460be083c4d63Daniel Dunbar    if (MArch == "armv5e" || MArch == "armv5te")
230b163ef7e7a5d904ef0962a7c38c460be083c4d63Daniel Dunbar      return "arm1026ejs";
231b163ef7e7a5d904ef0962a7c38c460be083c4d63Daniel Dunbar    if (MArch == "armv5tej")
23297f52ac45369f6925b548404e61d511034c874ecDaniel Dunbar      return "arm926ej-s";
233b163ef7e7a5d904ef0962a7c38c460be083c4d63Daniel Dunbar    if (MArch == "armv6" || MArch == "armv6k")
234b163ef7e7a5d904ef0962a7c38c460be083c4d63Daniel Dunbar      return "arm1136jf-s";
235b163ef7e7a5d904ef0962a7c38c460be083c4d63Daniel Dunbar    if (MArch == "armv6j")
236b163ef7e7a5d904ef0962a7c38c460be083c4d63Daniel Dunbar      return "arm1136j-s";
237b163ef7e7a5d904ef0962a7c38c460be083c4d63Daniel Dunbar    if (MArch == "armv6z" || MArch == "armv6zk")
238b163ef7e7a5d904ef0962a7c38c460be083c4d63Daniel Dunbar      return "arm1176jzf-s";
239b163ef7e7a5d904ef0962a7c38c460be083c4d63Daniel Dunbar    if (MArch == "armv6t2")
240b163ef7e7a5d904ef0962a7c38c460be083c4d63Daniel Dunbar      return "arm1156t2-s";
241b163ef7e7a5d904ef0962a7c38c460be083c4d63Daniel Dunbar    if (MArch == "armv7" || MArch == "armv7a" || MArch == "armv7-a")
242b163ef7e7a5d904ef0962a7c38c460be083c4d63Daniel Dunbar      return "cortex-a8";
243b163ef7e7a5d904ef0962a7c38c460be083c4d63Daniel Dunbar    if (MArch == "armv7r" || MArch == "armv7-r")
244b163ef7e7a5d904ef0962a7c38c460be083c4d63Daniel Dunbar      return "cortex-r4";
245b163ef7e7a5d904ef0962a7c38c460be083c4d63Daniel Dunbar    if (MArch == "armv7m" || MArch == "armv7-m")
246b163ef7e7a5d904ef0962a7c38c460be083c4d63Daniel Dunbar      return "cortex-m3";
247b163ef7e7a5d904ef0962a7c38c460be083c4d63Daniel Dunbar    if (MArch == "ep9312")
248b163ef7e7a5d904ef0962a7c38c460be083c4d63Daniel Dunbar      return "ep9312";
249b163ef7e7a5d904ef0962a7c38c460be083c4d63Daniel Dunbar    if (MArch == "iwmmxt")
250b163ef7e7a5d904ef0962a7c38c460be083c4d63Daniel Dunbar      return "iwmmxt";
251b163ef7e7a5d904ef0962a7c38c460be083c4d63Daniel Dunbar    if (MArch == "xscale")
252b163ef7e7a5d904ef0962a7c38c460be083c4d63Daniel Dunbar      return "xscale";
253b163ef7e7a5d904ef0962a7c38c460be083c4d63Daniel Dunbar  }
254b163ef7e7a5d904ef0962a7c38c460be083c4d63Daniel Dunbar
255b163ef7e7a5d904ef0962a7c38c460be083c4d63Daniel Dunbar  // Otherwise return the most base CPU LLVM supports.
256b163ef7e7a5d904ef0962a7c38c460be083c4d63Daniel Dunbar  return "arm7tdmi";
257b163ef7e7a5d904ef0962a7c38c460be083c4d63Daniel Dunbar}
258b163ef7e7a5d904ef0962a7c38c460be083c4d63Daniel Dunbar
2591d65e4be6f22f7e4b4974efbaef92fa3454f1ec8Daniel Dunbar/// getLLVMArchSuffixForARM - Get the LLVM arch name to use for a particular
260728a512753d85a6ccaae34e81385c8665c2de0e1Daniel Dunbar/// CPU.
261728a512753d85a6ccaae34e81385c8665c2de0e1Daniel Dunbar//
262728a512753d85a6ccaae34e81385c8665c2de0e1Daniel Dunbar// FIXME: This is redundant with -mcpu, why does LLVM use this.
263728a512753d85a6ccaae34e81385c8665c2de0e1Daniel Dunbar// FIXME: tblgen this, or kill it!
2641d65e4be6f22f7e4b4974efbaef92fa3454f1ec8Daniel Dunbarstatic const char *getLLVMArchSuffixForARM(llvm::StringRef CPU) {
265728a512753d85a6ccaae34e81385c8665c2de0e1Daniel Dunbar  if (CPU == "arm7tdmi" || CPU == "arm7tdmi-s" || CPU == "arm710t" ||
266728a512753d85a6ccaae34e81385c8665c2de0e1Daniel Dunbar      CPU == "arm720t" || CPU == "arm9" || CPU == "arm9tdmi" ||
267728a512753d85a6ccaae34e81385c8665c2de0e1Daniel Dunbar      CPU == "arm920" || CPU == "arm920t" || CPU == "arm922t" ||
268728a512753d85a6ccaae34e81385c8665c2de0e1Daniel Dunbar      CPU == "arm940t" || CPU == "ep9312")
2691d65e4be6f22f7e4b4974efbaef92fa3454f1ec8Daniel Dunbar    return "v4t";
270728a512753d85a6ccaae34e81385c8665c2de0e1Daniel Dunbar
271728a512753d85a6ccaae34e81385c8665c2de0e1Daniel Dunbar  if (CPU == "arm10tdmi" || CPU == "arm1020t")
2721d65e4be6f22f7e4b4974efbaef92fa3454f1ec8Daniel Dunbar    return "v5";
273728a512753d85a6ccaae34e81385c8665c2de0e1Daniel Dunbar
274728a512753d85a6ccaae34e81385c8665c2de0e1Daniel Dunbar  if (CPU == "arm9e" || CPU == "arm926ej-s" || CPU == "arm946e-s" ||
275728a512753d85a6ccaae34e81385c8665c2de0e1Daniel Dunbar      CPU == "arm966e-s" || CPU == "arm968e-s" || CPU == "arm10e" ||
276728a512753d85a6ccaae34e81385c8665c2de0e1Daniel Dunbar      CPU == "arm1020e" || CPU == "arm1022e" || CPU == "xscale" ||
277728a512753d85a6ccaae34e81385c8665c2de0e1Daniel Dunbar      CPU == "iwmmxt")
2781d65e4be6f22f7e4b4974efbaef92fa3454f1ec8Daniel Dunbar    return "v5e";
279728a512753d85a6ccaae34e81385c8665c2de0e1Daniel Dunbar
280728a512753d85a6ccaae34e81385c8665c2de0e1Daniel Dunbar  if (CPU == "arm1136j-s" || CPU == "arm1136jf-s" || CPU == "arm1176jz-s" ||
281728a512753d85a6ccaae34e81385c8665c2de0e1Daniel Dunbar      CPU == "arm1176jzf-s" || CPU == "mpcorenovfp" || CPU == "mpcore")
2821d65e4be6f22f7e4b4974efbaef92fa3454f1ec8Daniel Dunbar    return "v6";
283728a512753d85a6ccaae34e81385c8665c2de0e1Daniel Dunbar
284728a512753d85a6ccaae34e81385c8665c2de0e1Daniel Dunbar  if (CPU == "arm1156t2-s" || CPU == "arm1156t2f-s")
2851d65e4be6f22f7e4b4974efbaef92fa3454f1ec8Daniel Dunbar    return "v6t2";
286728a512753d85a6ccaae34e81385c8665c2de0e1Daniel Dunbar
287728a512753d85a6ccaae34e81385c8665c2de0e1Daniel Dunbar  if (CPU == "cortex-a8" || CPU == "cortex-a9")
2881d65e4be6f22f7e4b4974efbaef92fa3454f1ec8Daniel Dunbar    return "v7";
289728a512753d85a6ccaae34e81385c8665c2de0e1Daniel Dunbar
2901d65e4be6f22f7e4b4974efbaef92fa3454f1ec8Daniel Dunbar  return "";
291728a512753d85a6ccaae34e81385c8665c2de0e1Daniel Dunbar}
292728a512753d85a6ccaae34e81385c8665c2de0e1Daniel Dunbar
293728a512753d85a6ccaae34e81385c8665c2de0e1Daniel Dunbar/// getLLVMTriple - Get the LLVM triple to use for a particular toolchain, which
294728a512753d85a6ccaae34e81385c8665c2de0e1Daniel Dunbar/// may depend on command line arguments.
295728a512753d85a6ccaae34e81385c8665c2de0e1Daniel Dunbarstatic std::string getLLVMTriple(const ToolChain &TC, const ArgList &Args) {
296728a512753d85a6ccaae34e81385c8665c2de0e1Daniel Dunbar  switch (TC.getTriple().getArch()) {
297728a512753d85a6ccaae34e81385c8665c2de0e1Daniel Dunbar  default:
298728a512753d85a6ccaae34e81385c8665c2de0e1Daniel Dunbar    return TC.getTripleString();
299728a512753d85a6ccaae34e81385c8665c2de0e1Daniel Dunbar
300728a512753d85a6ccaae34e81385c8665c2de0e1Daniel Dunbar  case llvm::Triple::arm:
301728a512753d85a6ccaae34e81385c8665c2de0e1Daniel Dunbar  case llvm::Triple::thumb: {
302f4aa4f61de7d364364dc94bbf83ff71448a11327Daniel Dunbar    // FIXME: Factor into subclasses.
303728a512753d85a6ccaae34e81385c8665c2de0e1Daniel Dunbar    llvm::Triple Triple = TC.getTriple();
304f4aa4f61de7d364364dc94bbf83ff71448a11327Daniel Dunbar
305f4aa4f61de7d364364dc94bbf83ff71448a11327Daniel Dunbar    // Thumb2 is the default for V7 on Darwin.
306f4aa4f61de7d364364dc94bbf83ff71448a11327Daniel Dunbar    //
307f4aa4f61de7d364364dc94bbf83ff71448a11327Daniel Dunbar    // FIXME: Thumb should just be another -target-feaure, not in the triple.
308f4aa4f61de7d364364dc94bbf83ff71448a11327Daniel Dunbar    llvm::StringRef Suffix = getLLVMArchSuffixForARM(getARMTargetCPU(Args));
309f4aa4f61de7d364364dc94bbf83ff71448a11327Daniel Dunbar    bool ThumbDefault =
310f4aa4f61de7d364364dc94bbf83ff71448a11327Daniel Dunbar      (Suffix == "v7" && TC.getTriple().getOS() == llvm::Triple::Darwin);
3111d65e4be6f22f7e4b4974efbaef92fa3454f1ec8Daniel Dunbar    std::string ArchName = "arm";
312f4aa4f61de7d364364dc94bbf83ff71448a11327Daniel Dunbar    if (Args.hasFlag(options::OPT_mthumb, options::OPT_mno_thumb, ThumbDefault))
313f4aa4f61de7d364364dc94bbf83ff71448a11327Daniel Dunbar      ArchName = "thumb";
314f4aa4f61de7d364364dc94bbf83ff71448a11327Daniel Dunbar    Triple.setArchName(ArchName + Suffix.str());
315f4aa4f61de7d364364dc94bbf83ff71448a11327Daniel Dunbar
316728a512753d85a6ccaae34e81385c8665c2de0e1Daniel Dunbar    return Triple.getTriple();
317728a512753d85a6ccaae34e81385c8665c2de0e1Daniel Dunbar  }
318728a512753d85a6ccaae34e81385c8665c2de0e1Daniel Dunbar  }
319728a512753d85a6ccaae34e81385c8665c2de0e1Daniel Dunbar}
320728a512753d85a6ccaae34e81385c8665c2de0e1Daniel Dunbar
3211f95e6567faab67f4363d650f73121359c4bdbabDaniel Dunbar// FIXME: Move to target hook.
3221f95e6567faab67f4363d650f73121359c4bdbabDaniel Dunbarstatic bool isSignedCharDefault(const llvm::Triple &Triple) {
3231f95e6567faab67f4363d650f73121359c4bdbabDaniel Dunbar  switch (Triple.getArch()) {
3241f95e6567faab67f4363d650f73121359c4bdbabDaniel Dunbar  default:
3251f95e6567faab67f4363d650f73121359c4bdbabDaniel Dunbar    return true;
3261f95e6567faab67f4363d650f73121359c4bdbabDaniel Dunbar
3271f95e6567faab67f4363d650f73121359c4bdbabDaniel Dunbar  case llvm::Triple::ppc:
3281f95e6567faab67f4363d650f73121359c4bdbabDaniel Dunbar  case llvm::Triple::ppc64:
3291f95e6567faab67f4363d650f73121359c4bdbabDaniel Dunbar    if (Triple.getOS() == llvm::Triple::Darwin)
3301f95e6567faab67f4363d650f73121359c4bdbabDaniel Dunbar      return true;
3311f95e6567faab67f4363d650f73121359c4bdbabDaniel Dunbar    return false;
3321f95e6567faab67f4363d650f73121359c4bdbabDaniel Dunbar
3331f95e6567faab67f4363d650f73121359c4bdbabDaniel Dunbar  case llvm::Triple::systemz:
3341f95e6567faab67f4363d650f73121359c4bdbabDaniel Dunbar    return false;
3351f95e6567faab67f4363d650f73121359c4bdbabDaniel Dunbar  }
3361f95e6567faab67f4363d650f73121359c4bdbabDaniel Dunbar}
3371f95e6567faab67f4363d650f73121359c4bdbabDaniel Dunbar
338b163ef7e7a5d904ef0962a7c38c460be083c4d63Daniel Dunbarvoid Clang::AddARMTargetArgs(const ArgList &Args,
339b163ef7e7a5d904ef0962a7c38c460be083c4d63Daniel Dunbar                             ArgStringList &CmdArgs) const {
340ee788e70fcd0adf76103b17c78ac658d4ea30c9bDaniel Dunbar  const Driver &D = getToolChain().getDriver();
341cbd1933f83e2332b2d7add10459f80cc4e7eb7bfDaniel Dunbar
3422030d8f46b4226fa99e59389e3ca856a79c27e9aDaniel Dunbar  // Select the ABI to use.
3432030d8f46b4226fa99e59389e3ca856a79c27e9aDaniel Dunbar  //
3442030d8f46b4226fa99e59389e3ca856a79c27e9aDaniel Dunbar  // FIXME: Support -meabi.
3452030d8f46b4226fa99e59389e3ca856a79c27e9aDaniel Dunbar  const char *ABIName = 0;
3462030d8f46b4226fa99e59389e3ca856a79c27e9aDaniel Dunbar  if (Arg *A = Args.getLastArg(options::OPT_mabi_EQ)) {
3472030d8f46b4226fa99e59389e3ca856a79c27e9aDaniel Dunbar    ABIName = A->getValue(Args);
3482030d8f46b4226fa99e59389e3ca856a79c27e9aDaniel Dunbar  } else {
3492030d8f46b4226fa99e59389e3ca856a79c27e9aDaniel Dunbar    // Select the default based on the platform.
3502030d8f46b4226fa99e59389e3ca856a79c27e9aDaniel Dunbar    switch (getToolChain().getTriple().getOS()) {
3512030d8f46b4226fa99e59389e3ca856a79c27e9aDaniel Dunbar      // FIXME: Is this right for non-Darwin and non-Linux?
3522030d8f46b4226fa99e59389e3ca856a79c27e9aDaniel Dunbar    default:
3532030d8f46b4226fa99e59389e3ca856a79c27e9aDaniel Dunbar      ABIName = "aapcs";
3542030d8f46b4226fa99e59389e3ca856a79c27e9aDaniel Dunbar      break;
3552030d8f46b4226fa99e59389e3ca856a79c27e9aDaniel Dunbar
3562030d8f46b4226fa99e59389e3ca856a79c27e9aDaniel Dunbar    case llvm::Triple::Darwin:
3572030d8f46b4226fa99e59389e3ca856a79c27e9aDaniel Dunbar      ABIName = "apcs-gnu";
3582030d8f46b4226fa99e59389e3ca856a79c27e9aDaniel Dunbar      break;
3592030d8f46b4226fa99e59389e3ca856a79c27e9aDaniel Dunbar
3602030d8f46b4226fa99e59389e3ca856a79c27e9aDaniel Dunbar    case llvm::Triple::Linux:
3612030d8f46b4226fa99e59389e3ca856a79c27e9aDaniel Dunbar      ABIName = "aapcs-linux";
3622030d8f46b4226fa99e59389e3ca856a79c27e9aDaniel Dunbar      break;
3632030d8f46b4226fa99e59389e3ca856a79c27e9aDaniel Dunbar    }
3642030d8f46b4226fa99e59389e3ca856a79c27e9aDaniel Dunbar  }
3652030d8f46b4226fa99e59389e3ca856a79c27e9aDaniel Dunbar  CmdArgs.push_back("-target-abi");
3662030d8f46b4226fa99e59389e3ca856a79c27e9aDaniel Dunbar  CmdArgs.push_back(ABIName);
3672030d8f46b4226fa99e59389e3ca856a79c27e9aDaniel Dunbar
368b163ef7e7a5d904ef0962a7c38c460be083c4d63Daniel Dunbar  // Set the CPU based on -march= and -mcpu=.
36938b48afd338d494099697d2611e1f45e558e469eDaniel Dunbar  CmdArgs.push_back("-target-cpu");
370a31100e62f83933432df9092a04e48f9e5561a14Daniel Dunbar  CmdArgs.push_back(getARMTargetCPU(Args));
371b163ef7e7a5d904ef0962a7c38c460be083c4d63Daniel Dunbar
372cbd1933f83e2332b2d7add10459f80cc4e7eb7bfDaniel Dunbar  // Select the float ABI as determined by -msoft-float, -mhard-float, and
373cbd1933f83e2332b2d7add10459f80cc4e7eb7bfDaniel Dunbar  // -mfloat-abi=.
374cbd1933f83e2332b2d7add10459f80cc4e7eb7bfDaniel Dunbar  llvm::StringRef FloatABI;
375cbd1933f83e2332b2d7add10459f80cc4e7eb7bfDaniel Dunbar  if (Arg *A = Args.getLastArg(options::OPT_msoft_float,
376cbd1933f83e2332b2d7add10459f80cc4e7eb7bfDaniel Dunbar                               options::OPT_mhard_float,
377cbd1933f83e2332b2d7add10459f80cc4e7eb7bfDaniel Dunbar                               options::OPT_mfloat_abi_EQ)) {
378cbd1933f83e2332b2d7add10459f80cc4e7eb7bfDaniel Dunbar    if (A->getOption().matches(options::OPT_msoft_float))
379cbd1933f83e2332b2d7add10459f80cc4e7eb7bfDaniel Dunbar      FloatABI = "soft";
380cbd1933f83e2332b2d7add10459f80cc4e7eb7bfDaniel Dunbar    else if (A->getOption().matches(options::OPT_mhard_float))
381cbd1933f83e2332b2d7add10459f80cc4e7eb7bfDaniel Dunbar      FloatABI = "hard";
382cbd1933f83e2332b2d7add10459f80cc4e7eb7bfDaniel Dunbar    else {
383cbd1933f83e2332b2d7add10459f80cc4e7eb7bfDaniel Dunbar      FloatABI = A->getValue(Args);
384cbd1933f83e2332b2d7add10459f80cc4e7eb7bfDaniel Dunbar      if (FloatABI != "soft" && FloatABI != "softfp" && FloatABI != "hard") {
385cbd1933f83e2332b2d7add10459f80cc4e7eb7bfDaniel Dunbar        D.Diag(clang::diag::err_drv_invalid_mfloat_abi)
386cbd1933f83e2332b2d7add10459f80cc4e7eb7bfDaniel Dunbar          << A->getAsString(Args);
387cbd1933f83e2332b2d7add10459f80cc4e7eb7bfDaniel Dunbar        FloatABI = "soft";
388cbd1933f83e2332b2d7add10459f80cc4e7eb7bfDaniel Dunbar      }
389cbd1933f83e2332b2d7add10459f80cc4e7eb7bfDaniel Dunbar    }
390cbd1933f83e2332b2d7add10459f80cc4e7eb7bfDaniel Dunbar  }
391cbd1933f83e2332b2d7add10459f80cc4e7eb7bfDaniel Dunbar
392cbd1933f83e2332b2d7add10459f80cc4e7eb7bfDaniel Dunbar  // If unspecified, choose the default based on the platform.
393cbd1933f83e2332b2d7add10459f80cc4e7eb7bfDaniel Dunbar  if (FloatABI.empty()) {
394cbd1933f83e2332b2d7add10459f80cc4e7eb7bfDaniel Dunbar    // FIXME: This is wrong for non-Darwin, we don't have a mechanism yet for
395cbd1933f83e2332b2d7add10459f80cc4e7eb7bfDaniel Dunbar    // distinguishing things like linux-eabi vs linux-elf.
396cbd1933f83e2332b2d7add10459f80cc4e7eb7bfDaniel Dunbar    switch (getToolChain().getTriple().getOS()) {
397cbd1933f83e2332b2d7add10459f80cc4e7eb7bfDaniel Dunbar    case llvm::Triple::Darwin: {
398cbd1933f83e2332b2d7add10459f80cc4e7eb7bfDaniel Dunbar      // Darwin defaults to "softfp" for v6 and v7.
399cbd1933f83e2332b2d7add10459f80cc4e7eb7bfDaniel Dunbar      //
400cbd1933f83e2332b2d7add10459f80cc4e7eb7bfDaniel Dunbar      // FIXME: Factor out an ARM class so we can cache the arch somewhere.
401cbd1933f83e2332b2d7add10459f80cc4e7eb7bfDaniel Dunbar      llvm::StringRef ArchName = getLLVMArchSuffixForARM(getARMTargetCPU(Args));
402cbd1933f83e2332b2d7add10459f80cc4e7eb7bfDaniel Dunbar      if (ArchName.startswith("v6") || ArchName.startswith("v7"))
403cbd1933f83e2332b2d7add10459f80cc4e7eb7bfDaniel Dunbar        FloatABI = "softfp";
404cbd1933f83e2332b2d7add10459f80cc4e7eb7bfDaniel Dunbar      else
405cbd1933f83e2332b2d7add10459f80cc4e7eb7bfDaniel Dunbar        FloatABI = "soft";
406cbd1933f83e2332b2d7add10459f80cc4e7eb7bfDaniel Dunbar      break;
407cbd1933f83e2332b2d7add10459f80cc4e7eb7bfDaniel Dunbar    }
408cbd1933f83e2332b2d7add10459f80cc4e7eb7bfDaniel Dunbar
409cbd1933f83e2332b2d7add10459f80cc4e7eb7bfDaniel Dunbar    default:
410cbd1933f83e2332b2d7add10459f80cc4e7eb7bfDaniel Dunbar      // Assume "soft", but warn the user we are guessing.
411cbd1933f83e2332b2d7add10459f80cc4e7eb7bfDaniel Dunbar      FloatABI = "soft";
412cbd1933f83e2332b2d7add10459f80cc4e7eb7bfDaniel Dunbar      D.Diag(clang::diag::warn_drv_assuming_mfloat_abi_is) << "soft";
413cbd1933f83e2332b2d7add10459f80cc4e7eb7bfDaniel Dunbar      break;
414cbd1933f83e2332b2d7add10459f80cc4e7eb7bfDaniel Dunbar    }
415cbd1933f83e2332b2d7add10459f80cc4e7eb7bfDaniel Dunbar  }
416cbd1933f83e2332b2d7add10459f80cc4e7eb7bfDaniel Dunbar
417cbd1933f83e2332b2d7add10459f80cc4e7eb7bfDaniel Dunbar  if (FloatABI == "soft") {
418cbd1933f83e2332b2d7add10459f80cc4e7eb7bfDaniel Dunbar    // Floating point operations and argument passing are soft.
419cbd1933f83e2332b2d7add10459f80cc4e7eb7bfDaniel Dunbar    //
420cbd1933f83e2332b2d7add10459f80cc4e7eb7bfDaniel Dunbar    // FIXME: This changes CPP defines, we need -target-soft-float.
4213b315264d1a6fa303e20fe0caec306ccafc090deDaniel Dunbar    CmdArgs.push_back("-msoft-float");
42287667aafe68c366be57f5afb60428237593da0edDaniel Dunbar    CmdArgs.push_back("-mfloat-abi");
42387667aafe68c366be57f5afb60428237593da0edDaniel Dunbar    CmdArgs.push_back("soft");
424cbd1933f83e2332b2d7add10459f80cc4e7eb7bfDaniel Dunbar  } else if (FloatABI == "softfp") {
425cbd1933f83e2332b2d7add10459f80cc4e7eb7bfDaniel Dunbar    // Floating point operations are hard, but argument passing is soft.
42687667aafe68c366be57f5afb60428237593da0edDaniel Dunbar    CmdArgs.push_back("-mfloat-abi");
42787667aafe68c366be57f5afb60428237593da0edDaniel Dunbar    CmdArgs.push_back("soft");
428cbd1933f83e2332b2d7add10459f80cc4e7eb7bfDaniel Dunbar  } else {
429cbd1933f83e2332b2d7add10459f80cc4e7eb7bfDaniel Dunbar    // Floating point operations and argument passing are hard.
430cbd1933f83e2332b2d7add10459f80cc4e7eb7bfDaniel Dunbar    assert(FloatABI == "hard" && "Invalid float abi!");
43187667aafe68c366be57f5afb60428237593da0edDaniel Dunbar    CmdArgs.push_back("-mfloat-abi");
43287667aafe68c366be57f5afb60428237593da0edDaniel Dunbar    CmdArgs.push_back("hard");
433cbd1933f83e2332b2d7add10459f80cc4e7eb7bfDaniel Dunbar  }
43497f52ac45369f6925b548404e61d511034c874ecDaniel Dunbar
43597f52ac45369f6925b548404e61d511034c874ecDaniel Dunbar  // Set appropriate target features for floating point mode.
43697f52ac45369f6925b548404e61d511034c874ecDaniel Dunbar  //
43797f52ac45369f6925b548404e61d511034c874ecDaniel Dunbar  // FIXME: Note, this is a hack, the LLVM backend doesn't actually use these
43897f52ac45369f6925b548404e61d511034c874ecDaniel Dunbar  // yet (it uses the -mfloat-abi and -msoft-float options above), and it is
43997f52ac45369f6925b548404e61d511034c874ecDaniel Dunbar  // stripped out by the ARM target.
44097f52ac45369f6925b548404e61d511034c874ecDaniel Dunbar
44197f52ac45369f6925b548404e61d511034c874ecDaniel Dunbar  // Use software floating point operations?
44297f52ac45369f6925b548404e61d511034c874ecDaniel Dunbar  if (FloatABI == "soft") {
44397f52ac45369f6925b548404e61d511034c874ecDaniel Dunbar    CmdArgs.push_back("-target-feature");
44497f52ac45369f6925b548404e61d511034c874ecDaniel Dunbar    CmdArgs.push_back("+soft-float");
44597f52ac45369f6925b548404e61d511034c874ecDaniel Dunbar  }
44697f52ac45369f6925b548404e61d511034c874ecDaniel Dunbar
44797f52ac45369f6925b548404e61d511034c874ecDaniel Dunbar  // Use software floating point argument passing?
44897f52ac45369f6925b548404e61d511034c874ecDaniel Dunbar  if (FloatABI != "hard") {
44997f52ac45369f6925b548404e61d511034c874ecDaniel Dunbar    CmdArgs.push_back("-target-feature");
45097f52ac45369f6925b548404e61d511034c874ecDaniel Dunbar    CmdArgs.push_back("+soft-float-abi");
45197f52ac45369f6925b548404e61d511034c874ecDaniel Dunbar  }
452a91320b8af7143f7af4c0665ffa62a3b244c0bd9Daniel Dunbar
453a91320b8af7143f7af4c0665ffa62a3b244c0bd9Daniel Dunbar  // Honor -mfpu=.
454a91320b8af7143f7af4c0665ffa62a3b244c0bd9Daniel Dunbar  //
455a91320b8af7143f7af4c0665ffa62a3b244c0bd9Daniel Dunbar  // FIXME: Centralize feature selection, defaulting shouldn't be also in the
456a91320b8af7143f7af4c0665ffa62a3b244c0bd9Daniel Dunbar  // frontend target.
457a91320b8af7143f7af4c0665ffa62a3b244c0bd9Daniel Dunbar  if (const Arg *A = Args.getLastArg(options::OPT_mfpu_EQ)) {
458a91320b8af7143f7af4c0665ffa62a3b244c0bd9Daniel Dunbar    llvm::StringRef FPU = A->getValue(Args);
459a91320b8af7143f7af4c0665ffa62a3b244c0bd9Daniel Dunbar
460a91320b8af7143f7af4c0665ffa62a3b244c0bd9Daniel Dunbar    // Set the target features based on the FPU.
461a91320b8af7143f7af4c0665ffa62a3b244c0bd9Daniel Dunbar    if (FPU == "fpa" || FPU == "fpe2" || FPU == "fpe3" || FPU == "maverick") {
462a91320b8af7143f7af4c0665ffa62a3b244c0bd9Daniel Dunbar      // Disable any default FPU support.
463a91320b8af7143f7af4c0665ffa62a3b244c0bd9Daniel Dunbar      CmdArgs.push_back("-target-feature");
464a91320b8af7143f7af4c0665ffa62a3b244c0bd9Daniel Dunbar      CmdArgs.push_back("-vfp2");
465a91320b8af7143f7af4c0665ffa62a3b244c0bd9Daniel Dunbar      CmdArgs.push_back("-target-feature");
466a91320b8af7143f7af4c0665ffa62a3b244c0bd9Daniel Dunbar      CmdArgs.push_back("-vfp3");
467a91320b8af7143f7af4c0665ffa62a3b244c0bd9Daniel Dunbar      CmdArgs.push_back("-target-feature");
468a91320b8af7143f7af4c0665ffa62a3b244c0bd9Daniel Dunbar      CmdArgs.push_back("-neon");
469a91320b8af7143f7af4c0665ffa62a3b244c0bd9Daniel Dunbar    } else if (FPU == "vfp") {
470a91320b8af7143f7af4c0665ffa62a3b244c0bd9Daniel Dunbar      CmdArgs.push_back("-target-feature");
471a91320b8af7143f7af4c0665ffa62a3b244c0bd9Daniel Dunbar      CmdArgs.push_back("+vfp2");
472a91320b8af7143f7af4c0665ffa62a3b244c0bd9Daniel Dunbar    } else if (FPU == "vfp3") {
473a91320b8af7143f7af4c0665ffa62a3b244c0bd9Daniel Dunbar      CmdArgs.push_back("-target-feature");
474a91320b8af7143f7af4c0665ffa62a3b244c0bd9Daniel Dunbar      CmdArgs.push_back("+vfp3");
475a91320b8af7143f7af4c0665ffa62a3b244c0bd9Daniel Dunbar    } else if (FPU == "neon") {
476a91320b8af7143f7af4c0665ffa62a3b244c0bd9Daniel Dunbar      CmdArgs.push_back("-target-feature");
477a91320b8af7143f7af4c0665ffa62a3b244c0bd9Daniel Dunbar      CmdArgs.push_back("+neon");
478a91320b8af7143f7af4c0665ffa62a3b244c0bd9Daniel Dunbar    } else
479a91320b8af7143f7af4c0665ffa62a3b244c0bd9Daniel Dunbar      D.Diag(clang::diag::err_drv_clang_unsupported) << A->getAsString(Args);
480a91320b8af7143f7af4c0665ffa62a3b244c0bd9Daniel Dunbar  }
481b163ef7e7a5d904ef0962a7c38c460be083c4d63Daniel Dunbar}
482b163ef7e7a5d904ef0962a7c38c460be083c4d63Daniel Dunbar
4836acda16e9c194dcbd0dea64341e182bdb65d0f41Daniel Dunbarvoid Clang::AddX86TargetArgs(const ArgList &Args,
4846acda16e9c194dcbd0dea64341e182bdb65d0f41Daniel Dunbar                             ArgStringList &CmdArgs) const {
485e6ad3f9fceef0ecc422ff26754ea069a5fd18c69Daniel Dunbar  if (!Args.hasFlag(options::OPT_mred_zone,
486e6ad3f9fceef0ecc422ff26754ea069a5fd18c69Daniel Dunbar                    options::OPT_mno_red_zone,
487e6ad3f9fceef0ecc422ff26754ea069a5fd18c69Daniel Dunbar                    true) ||
488e6ad3f9fceef0ecc422ff26754ea069a5fd18c69Daniel Dunbar      Args.hasArg(options::OPT_mkernel) ||
489e6ad3f9fceef0ecc422ff26754ea069a5fd18c69Daniel Dunbar      Args.hasArg(options::OPT_fapple_kext))
49066861e09d590994a8b941eaa328e4d8f33adec9eDaniel Dunbar    CmdArgs.push_back("-disable-red-zone");
491e6ad3f9fceef0ecc422ff26754ea069a5fd18c69Daniel Dunbar
492e6ad3f9fceef0ecc422ff26754ea069a5fd18c69Daniel Dunbar  if (Args.hasFlag(options::OPT_msoft_float,
493e6ad3f9fceef0ecc422ff26754ea069a5fd18c69Daniel Dunbar                   options::OPT_mno_soft_float,
494e6ad3f9fceef0ecc422ff26754ea069a5fd18c69Daniel Dunbar                   false))
49566861e09d590994a8b941eaa328e4d8f33adec9eDaniel Dunbar    CmdArgs.push_back("-no-implicit-float");
496e6ad3f9fceef0ecc422ff26754ea069a5fd18c69Daniel Dunbar
497f86feddbd5b13d2c144132e35d608fa630784dbbDaniel Dunbar  const char *CPUName = 0;
4986acda16e9c194dcbd0dea64341e182bdb65d0f41Daniel Dunbar  if (const Arg *A = Args.getLastArg(options::OPT_march_EQ)) {
499f86feddbd5b13d2c144132e35d608fa630784dbbDaniel Dunbar    if (llvm::StringRef(A->getValue(Args)) == "native") {
500f86feddbd5b13d2c144132e35d608fa630784dbbDaniel Dunbar      // FIXME: Reject attempts to use -march=native unless the target matches
501f86feddbd5b13d2c144132e35d608fa630784dbbDaniel Dunbar      // the host.
502f86feddbd5b13d2c144132e35d608fa630784dbbDaniel Dunbar      //
503f86feddbd5b13d2c144132e35d608fa630784dbbDaniel Dunbar      // FIXME: We should also incorporate the detected target features for use
504f86feddbd5b13d2c144132e35d608fa630784dbbDaniel Dunbar      // with -native.
505f86feddbd5b13d2c144132e35d608fa630784dbbDaniel Dunbar      std::string CPU = llvm::sys::getHostCPUName();
506f86feddbd5b13d2c144132e35d608fa630784dbbDaniel Dunbar      if (!CPU.empty())
507f86feddbd5b13d2c144132e35d608fa630784dbbDaniel Dunbar        CPUName = Args.MakeArgString(CPU);
508f86feddbd5b13d2c144132e35d608fa630784dbbDaniel Dunbar    } else
509f86feddbd5b13d2c144132e35d608fa630784dbbDaniel Dunbar      CPUName = A->getValue(Args);
510f86feddbd5b13d2c144132e35d608fa630784dbbDaniel Dunbar  }
5116acda16e9c194dcbd0dea64341e182bdb65d0f41Daniel Dunbar
512f86feddbd5b13d2c144132e35d608fa630784dbbDaniel Dunbar  // Select the default CPU if none was given (or detection failed).
513f86feddbd5b13d2c144132e35d608fa630784dbbDaniel Dunbar  if (!CPUName) {
5146acda16e9c194dcbd0dea64341e182bdb65d0f41Daniel Dunbar    // FIXME: Need target hooks.
515f22d1fd96d6056a2f271b0f7353b31f47547127bBenjamin Kramer    if (getToolChain().getOS().startswith("darwin")) {
5166acda16e9c194dcbd0dea64341e182bdb65d0f41Daniel Dunbar      if (getToolChain().getArchName() == "x86_64")
517f86feddbd5b13d2c144132e35d608fa630784dbbDaniel Dunbar        CPUName = "core2";
5186acda16e9c194dcbd0dea64341e182bdb65d0f41Daniel Dunbar      else if (getToolChain().getArchName() == "i386")
519f86feddbd5b13d2c144132e35d608fa630784dbbDaniel Dunbar        CPUName = "yonah";
5206acda16e9c194dcbd0dea64341e182bdb65d0f41Daniel Dunbar    } else {
5216acda16e9c194dcbd0dea64341e182bdb65d0f41Daniel Dunbar      if (getToolChain().getArchName() == "x86_64")
522f86feddbd5b13d2c144132e35d608fa630784dbbDaniel Dunbar        CPUName = "x86-64";
5236acda16e9c194dcbd0dea64341e182bdb65d0f41Daniel Dunbar      else if (getToolChain().getArchName() == "i386")
524f86feddbd5b13d2c144132e35d608fa630784dbbDaniel Dunbar        CPUName = "pentium4";
5256acda16e9c194dcbd0dea64341e182bdb65d0f41Daniel Dunbar    }
5266acda16e9c194dcbd0dea64341e182bdb65d0f41Daniel Dunbar  }
5276acda16e9c194dcbd0dea64341e182bdb65d0f41Daniel Dunbar
528f86feddbd5b13d2c144132e35d608fa630784dbbDaniel Dunbar  if (CPUName) {
52938b48afd338d494099697d2611e1f45e558e469eDaniel Dunbar    CmdArgs.push_back("-target-cpu");
530f86feddbd5b13d2c144132e35d608fa630784dbbDaniel Dunbar    CmdArgs.push_back(CPUName);
531f86feddbd5b13d2c144132e35d608fa630784dbbDaniel Dunbar  }
532f86feddbd5b13d2c144132e35d608fa630784dbbDaniel Dunbar
533cdd9686b890ebdc10039ae256ef4c9dfb5ebacb7Daniel Dunbar  for (arg_iterator it = Args.filtered_begin(options::OPT_m_x86_Features_Group),
534cdd9686b890ebdc10039ae256ef4c9dfb5ebacb7Daniel Dunbar         ie = Args.filtered_end(); it != ie; ++it) {
535cdd9686b890ebdc10039ae256ef4c9dfb5ebacb7Daniel Dunbar    llvm::StringRef Name = it->getOption().getName();
536cdd9686b890ebdc10039ae256ef4c9dfb5ebacb7Daniel Dunbar    it->claim();
5376acda16e9c194dcbd0dea64341e182bdb65d0f41Daniel Dunbar
538cdd9686b890ebdc10039ae256ef4c9dfb5ebacb7Daniel Dunbar    // Skip over "-m".
539cdd9686b890ebdc10039ae256ef4c9dfb5ebacb7Daniel Dunbar    assert(Name.startswith("-m") && "Invalid feature name.");
540cdd9686b890ebdc10039ae256ef4c9dfb5ebacb7Daniel Dunbar    Name = Name.substr(2);
5416acda16e9c194dcbd0dea64341e182bdb65d0f41Daniel Dunbar
542cdd9686b890ebdc10039ae256ef4c9dfb5ebacb7Daniel Dunbar    bool IsNegative = Name.startswith("no-");
543cdd9686b890ebdc10039ae256ef4c9dfb5ebacb7Daniel Dunbar    if (IsNegative)
544cdd9686b890ebdc10039ae256ef4c9dfb5ebacb7Daniel Dunbar      Name = Name.substr(3);
5456acda16e9c194dcbd0dea64341e182bdb65d0f41Daniel Dunbar
546cdd9686b890ebdc10039ae256ef4c9dfb5ebacb7Daniel Dunbar    CmdArgs.push_back("-target-feature");
547cdd9686b890ebdc10039ae256ef4c9dfb5ebacb7Daniel Dunbar    CmdArgs.push_back(Args.MakeArgString((IsNegative ? "-" : "+") + Name));
5486acda16e9c194dcbd0dea64341e182bdb65d0f41Daniel Dunbar  }
5496acda16e9c194dcbd0dea64341e182bdb65d0f41Daniel Dunbar}
5506acda16e9c194dcbd0dea64341e182bdb65d0f41Daniel Dunbar
55185caf03ee49c4de87ee9624a9b725ef5d20ee624Fariborz Jahanianstatic bool needsExceptions(const ArgList &Args,  types::ID InputType,
55285caf03ee49c4de87ee9624a9b725ef5d20ee624Fariborz Jahanian                            const llvm::Triple &Triple) {
553f759df06d997050559fd925758bcd2cdef24db05Rafael Espindola  if (Arg *A = Args.getLastArg(options::OPT_fexceptions,
554f759df06d997050559fd925758bcd2cdef24db05Rafael Espindola                               options::OPT_fno_exceptions)) {
555f759df06d997050559fd925758bcd2cdef24db05Rafael Espindola    if (A->getOption().matches(options::OPT_fexceptions))
556f759df06d997050559fd925758bcd2cdef24db05Rafael Espindola      return true;
557f759df06d997050559fd925758bcd2cdef24db05Rafael Espindola    else
558f759df06d997050559fd925758bcd2cdef24db05Rafael Espindola      return false;
559f759df06d997050559fd925758bcd2cdef24db05Rafael Espindola  }
560f759df06d997050559fd925758bcd2cdef24db05Rafael Espindola  switch (InputType) {
561f759df06d997050559fd925758bcd2cdef24db05Rafael Espindola  case types::TY_CXX: case types::TY_CXXHeader:
562f759df06d997050559fd925758bcd2cdef24db05Rafael Espindola  case types::TY_PP_CXX: case types::TY_PP_CXXHeader:
563f759df06d997050559fd925758bcd2cdef24db05Rafael Espindola  case types::TY_ObjCXX: case types::TY_ObjCXXHeader:
564f759df06d997050559fd925758bcd2cdef24db05Rafael Espindola  case types::TY_PP_ObjCXX: case types::TY_PP_ObjCXXHeader:
565f759df06d997050559fd925758bcd2cdef24db05Rafael Espindola    return true;
56685caf03ee49c4de87ee9624a9b725ef5d20ee624Fariborz Jahanian
567f759df06d997050559fd925758bcd2cdef24db05Rafael Espindola  case types::TY_ObjC: case types::TY_ObjCHeader:
568f759df06d997050559fd925758bcd2cdef24db05Rafael Espindola  case types::TY_PP_ObjC: case types::TY_PP_ObjCHeader:
569f759df06d997050559fd925758bcd2cdef24db05Rafael Espindola    if (Args.hasArg(options::OPT_fobjc_nonfragile_abi))
570f759df06d997050559fd925758bcd2cdef24db05Rafael Espindola      return true;
57185caf03ee49c4de87ee9624a9b725ef5d20ee624Fariborz Jahanian    if (Triple.getOS() != llvm::Triple::Darwin)
572f759df06d997050559fd925758bcd2cdef24db05Rafael Espindola      return false;
57385caf03ee49c4de87ee9624a9b725ef5d20ee624Fariborz Jahanian    return (Triple.getDarwinMajorNumber() >= 9 &&
57485caf03ee49c4de87ee9624a9b725ef5d20ee624Fariborz Jahanian            Triple.getArch() == llvm::Triple::x86_64);
57585caf03ee49c4de87ee9624a9b725ef5d20ee624Fariborz Jahanian
576f759df06d997050559fd925758bcd2cdef24db05Rafael Espindola  default:
577f759df06d997050559fd925758bcd2cdef24db05Rafael Espindola    return false;
578f759df06d997050559fd925758bcd2cdef24db05Rafael Espindola  }
579f759df06d997050559fd925758bcd2cdef24db05Rafael Espindola}
580f759df06d997050559fd925758bcd2cdef24db05Rafael Espindola
581dd4fe00f03d8749b283948ea86aa1e4a53ed21abDaniel Dunbar/// getEffectiveClangTriple - Get the "effective" target triple, which is the
582dd4fe00f03d8749b283948ea86aa1e4a53ed21abDaniel Dunbar/// triple for the target but with the OS version potentially modified for
583dd4fe00f03d8749b283948ea86aa1e4a53ed21abDaniel Dunbar/// Darwin's -mmacosx-version-min.
584dd4fe00f03d8749b283948ea86aa1e4a53ed21abDaniel Dunbarstatic std::string getEffectiveClangTriple(const Driver &D,
585dd4fe00f03d8749b283948ea86aa1e4a53ed21abDaniel Dunbar                                           const ToolChain &TC,
586dd4fe00f03d8749b283948ea86aa1e4a53ed21abDaniel Dunbar                                           const ArgList &Args) {
587dd4fe00f03d8749b283948ea86aa1e4a53ed21abDaniel Dunbar  llvm::Triple Triple(getLLVMTriple(TC, Args));
588dd4fe00f03d8749b283948ea86aa1e4a53ed21abDaniel Dunbar
589408fceda7a518ac25975fb6299c856bfaa753939Daniel Dunbar  // Handle -mmacosx-version-min and -miphoneos-version-min.
590dd4fe00f03d8749b283948ea86aa1e4a53ed21abDaniel Dunbar  if (Triple.getOS() != llvm::Triple::Darwin) {
591dd4fe00f03d8749b283948ea86aa1e4a53ed21abDaniel Dunbar    // Diagnose use of -mmacosx-version-min and -miphoneos-version-min on
592dd4fe00f03d8749b283948ea86aa1e4a53ed21abDaniel Dunbar    // non-Darwin.
593408fceda7a518ac25975fb6299c856bfaa753939Daniel Dunbar    if (Arg *A = Args.getLastArg(options::OPT_mmacosx_version_min_EQ,
594408fceda7a518ac25975fb6299c856bfaa753939Daniel Dunbar                                 options::OPT_miphoneos_version_min_EQ))
595408fceda7a518ac25975fb6299c856bfaa753939Daniel Dunbar      D.Diag(clang::diag::err_drv_clang_unsupported) << A->getAsString(Args);
59621ae3196c9677a79523d294f9a62a4788ba40694Daniel Dunbar  } else {
597408fceda7a518ac25975fb6299c856bfaa753939Daniel Dunbar    const toolchains::Darwin &DarwinTC(
598408fceda7a518ac25975fb6299c856bfaa753939Daniel Dunbar      reinterpret_cast<const toolchains::Darwin&>(TC));
599408fceda7a518ac25975fb6299c856bfaa753939Daniel Dunbar    unsigned Version[3];
600408fceda7a518ac25975fb6299c856bfaa753939Daniel Dunbar    DarwinTC.getTargetVersion(Version);
60121ae3196c9677a79523d294f9a62a4788ba40694Daniel Dunbar
60221ae3196c9677a79523d294f9a62a4788ba40694Daniel Dunbar    // Mangle the target version into the OS triple component.  For historical
60321ae3196c9677a79523d294f9a62a4788ba40694Daniel Dunbar    // reasons that make little sense, the version passed here is the "darwin"
60421ae3196c9677a79523d294f9a62a4788ba40694Daniel Dunbar    // version, which drops the 10 and offsets by 4. See inverse code when
60521ae3196c9677a79523d294f9a62a4788ba40694Daniel Dunbar    // setting the OS version preprocessor define.
606408fceda7a518ac25975fb6299c856bfaa753939Daniel Dunbar    if (!DarwinTC.isTargetIPhoneOS()) {
607408fceda7a518ac25975fb6299c856bfaa753939Daniel Dunbar      Version[0] = Version[1] + 4;
608408fceda7a518ac25975fb6299c856bfaa753939Daniel Dunbar      Version[1] = Version[2];
609408fceda7a518ac25975fb6299c856bfaa753939Daniel Dunbar      Version[2] = 0;
610408fceda7a518ac25975fb6299c856bfaa753939Daniel Dunbar    } else {
611408fceda7a518ac25975fb6299c856bfaa753939Daniel Dunbar      // Use the environment to communicate that we are targetting iPhoneOS.
612408fceda7a518ac25975fb6299c856bfaa753939Daniel Dunbar      Triple.setEnvironmentName("iphoneos");
61321ae3196c9677a79523d294f9a62a4788ba40694Daniel Dunbar    }
614dd4fe00f03d8749b283948ea86aa1e4a53ed21abDaniel Dunbar
615dd4fe00f03d8749b283948ea86aa1e4a53ed21abDaniel Dunbar    llvm::SmallString<16> Str;
616408fceda7a518ac25975fb6299c856bfaa753939Daniel Dunbar    llvm::raw_svector_ostream(Str) << "darwin" << Version[0]
617408fceda7a518ac25975fb6299c856bfaa753939Daniel Dunbar                                   << "." << Version[1] << "." << Version[2];
618dd4fe00f03d8749b283948ea86aa1e4a53ed21abDaniel Dunbar    Triple.setOSName(Str.str());
619dd4fe00f03d8749b283948ea86aa1e4a53ed21abDaniel Dunbar  }
620dd4fe00f03d8749b283948ea86aa1e4a53ed21abDaniel Dunbar
621dd4fe00f03d8749b283948ea86aa1e4a53ed21abDaniel Dunbar  return Triple.getTriple();
622dd4fe00f03d8749b283948ea86aa1e4a53ed21abDaniel Dunbar}
623dd4fe00f03d8749b283948ea86aa1e4a53ed21abDaniel Dunbar
62447ac7d27c44bd64a7d0fc03d4babc196cf2b8230Daniel Dunbarvoid Clang::ConstructJob(Compilation &C, const JobAction &JA,
625871adcf4e41285e3f4c3b62eaa1b2e05b60b92daDaniel Dunbar                         Job &Dest,
626871adcf4e41285e3f4c3b62eaa1b2e05b60b92daDaniel Dunbar                         const InputInfo &Output,
62762cf601812e03dd9bc5df42b8ef06a0cdedc38bfDaniel Dunbar                         const InputInfoList &Inputs,
6281d46033f760ba5fd266ce59fe391fac473f04f52Daniel Dunbar                         const ArgList &Args,
62947ac7d27c44bd64a7d0fc03d4babc196cf2b8230Daniel Dunbar                         const char *LinkingOutput) const {
630ee788e70fcd0adf76103b17c78ac658d4ea30c9bDaniel Dunbar  const Driver &D = getToolChain().getDriver();
631b488c1dac8e53206f07103d794a62a3f5012c0f4Daniel Dunbar  ArgStringList CmdArgs;
632b488c1dac8e53206f07103d794a62a3f5012c0f4Daniel Dunbar
633077ba6a3ac3628afb0d3c460e81ce013bccbdbedDaniel Dunbar  assert(Inputs.size() == 1 && "Unable to handle multiple inputs.");
634077ba6a3ac3628afb0d3c460e81ce013bccbdbedDaniel Dunbar
6358ff5b28d6efcffe2251e77634c7edf83a4763344Daniel Dunbar  // Invoke ourselves in -cc1 mode.
6368ff5b28d6efcffe2251e77634c7edf83a4763344Daniel Dunbar  //
6378ff5b28d6efcffe2251e77634c7edf83a4763344Daniel Dunbar  // FIXME: Implement custom jobs for internal actions.
6388ff5b28d6efcffe2251e77634c7edf83a4763344Daniel Dunbar  CmdArgs.push_back("-cc1");
6398ff5b28d6efcffe2251e77634c7edf83a4763344Daniel Dunbar
640dd4fe00f03d8749b283948ea86aa1e4a53ed21abDaniel Dunbar  // Add the "effective" target triple.
641af07f936b698575f2c91f1c1134c116f1ef0deddDaniel Dunbar  CmdArgs.push_back("-triple");
642dd4fe00f03d8749b283948ea86aa1e4a53ed21abDaniel Dunbar  std::string TripleStr = getEffectiveClangTriple(D, getToolChain(), Args);
643dd4fe00f03d8749b283948ea86aa1e4a53ed21abDaniel Dunbar  CmdArgs.push_back(Args.MakeArgString(TripleStr));
644728a512753d85a6ccaae34e81385c8665c2de0e1Daniel Dunbar
645dd4fe00f03d8749b283948ea86aa1e4a53ed21abDaniel Dunbar  // Select the appropriate action.
6461d46033f760ba5fd266ce59fe391fac473f04f52Daniel Dunbar  if (isa<AnalyzeJobAction>(JA)) {
6471d46033f760ba5fd266ce59fe391fac473f04f52Daniel Dunbar    assert(JA.getType() == types::TY_Plist && "Invalid output type.");
6481d46033f760ba5fd266ce59fe391fac473f04f52Daniel Dunbar    CmdArgs.push_back("-analyze");
6491d46033f760ba5fd266ce59fe391fac473f04f52Daniel Dunbar  } else if (isa<PreprocessJobAction>(JA)) {
650cd8e4c44dd068956e9181381be3ee2d49a0fac52Daniel Dunbar    if (Output.getType() == types::TY_Dependencies)
651cd8e4c44dd068956e9181381be3ee2d49a0fac52Daniel Dunbar      CmdArgs.push_back("-Eonly");
652cd8e4c44dd068956e9181381be3ee2d49a0fac52Daniel Dunbar    else
653cd8e4c44dd068956e9181381be3ee2d49a0fac52Daniel Dunbar      CmdArgs.push_back("-E");
6548767cbc475ed96397b6f08617814eeb9cab121bdDaniel Dunbar  } else if (isa<AssembleJobAction>(JA)) {
6558767cbc475ed96397b6f08617814eeb9cab121bdDaniel Dunbar    CmdArgs.push_back("-emit-obj");
6561d46033f760ba5fd266ce59fe391fac473f04f52Daniel Dunbar  } else if (isa<PrecompileJobAction>(JA)) {
6570ebd9321ba380471010341f24c874f46f56e7581Daniel Dunbar    // Use PCH if the user requested it, except for C++ (for now).
6580ebd9321ba380471010341f24c874f46f56e7581Daniel Dunbar    bool UsePCH = D.CCCUsePCH;
6590ebd9321ba380471010341f24c874f46f56e7581Daniel Dunbar    if (types::isCXX(Inputs[0].getType()))
6600ebd9321ba380471010341f24c874f46f56e7581Daniel Dunbar      UsePCH = false;
6610ebd9321ba380471010341f24c874f46f56e7581Daniel Dunbar
6620ebd9321ba380471010341f24c874f46f56e7581Daniel Dunbar    if (UsePCH)
663df91ef3d6c55692a0236f67b6c6b134a3bf84098Douglas Gregor      CmdArgs.push_back("-emit-pch");
664df91ef3d6c55692a0236f67b6c6b134a3bf84098Douglas Gregor    else
665df91ef3d6c55692a0236f67b6c6b134a3bf84098Douglas Gregor      CmdArgs.push_back("-emit-pth");
6661d46033f760ba5fd266ce59fe391fac473f04f52Daniel Dunbar  } else {
6671d46033f760ba5fd266ce59fe391fac473f04f52Daniel Dunbar    assert(isa<CompileJobAction>(JA) && "Invalid action for clang tool.");
668c21c485b4fb58ef5d55cf3e523263dd824a2ace4Daniel Dunbar
6691d46033f760ba5fd266ce59fe391fac473f04f52Daniel Dunbar    if (JA.getType() == types::TY_Nothing) {
6701d46033f760ba5fd266ce59fe391fac473f04f52Daniel Dunbar      CmdArgs.push_back("-fsyntax-only");
6711d46033f760ba5fd266ce59fe391fac473f04f52Daniel Dunbar    } else if (JA.getType() == types::TY_LLVMAsm) {
6721d46033f760ba5fd266ce59fe391fac473f04f52Daniel Dunbar      CmdArgs.push_back("-emit-llvm");
6731d46033f760ba5fd266ce59fe391fac473f04f52Daniel Dunbar    } else if (JA.getType() == types::TY_LLVMBC) {
6741d46033f760ba5fd266ce59fe391fac473f04f52Daniel Dunbar      CmdArgs.push_back("-emit-llvm-bc");
6751d46033f760ba5fd266ce59fe391fac473f04f52Daniel Dunbar    } else if (JA.getType() == types::TY_PP_Asm) {
676e3b8d07e02861d245612b02b5f5a2c1f34b2a394Daniel Dunbar      CmdArgs.push_back("-S");
6775915fbf310e171c4cd3c2af05e9de360c0fa988aDaniel Dunbar    } else if (JA.getType() == types::TY_AST) {
6785915fbf310e171c4cd3c2af05e9de360c0fa988aDaniel Dunbar      CmdArgs.push_back("-emit-pch");
6791d46033f760ba5fd266ce59fe391fac473f04f52Daniel Dunbar    }
6801d46033f760ba5fd266ce59fe391fac473f04f52Daniel Dunbar  }
6811d46033f760ba5fd266ce59fe391fac473f04f52Daniel Dunbar
6821d46033f760ba5fd266ce59fe391fac473f04f52Daniel Dunbar  // The make clang go fast button.
6831d46033f760ba5fd266ce59fe391fac473f04f52Daniel Dunbar  CmdArgs.push_back("-disable-free");
6841d46033f760ba5fd266ce59fe391fac473f04f52Daniel Dunbar
685c9abc043af88f90d177a5bd147f627b78ca49fdeDaniel Dunbar  // Set the main file name, so that debug info works even with
686c9abc043af88f90d177a5bd147f627b78ca49fdeDaniel Dunbar  // -save-temps.
687c9abc043af88f90d177a5bd147f627b78ca49fdeDaniel Dunbar  CmdArgs.push_back("-main-file-name");
688c9abc043af88f90d177a5bd147f627b78ca49fdeDaniel Dunbar  CmdArgs.push_back(darwin::CC1::getBaseInputName(Args, Inputs));
689c9abc043af88f90d177a5bd147f627b78ca49fdeDaniel Dunbar
6903bbc75302fd43cf13d868b46c94ff8794b302e43Daniel Dunbar  // Some flags which affect the language (via preprocessor
6913bbc75302fd43cf13d868b46c94ff8794b302e43Daniel Dunbar  // defines). See darwin::CC1::AddCPPArgs.
6923bbc75302fd43cf13d868b46c94ff8794b302e43Daniel Dunbar  if (Args.hasArg(options::OPT_static))
6933bbc75302fd43cf13d868b46c94ff8794b302e43Daniel Dunbar    CmdArgs.push_back("-static-define");
6943bbc75302fd43cf13d868b46c94ff8794b302e43Daniel Dunbar
6951d46033f760ba5fd266ce59fe391fac473f04f52Daniel Dunbar  if (isa<AnalyzeJobAction>(JA)) {
696b8bb3e797c5687715c6d9d960ee573e4d0e62230Ted Kremenek    // Enable region store model by default.
697b8bb3e797c5687715c6d9d960ee573e4d0e62230Ted Kremenek    CmdArgs.push_back("-analyzer-store=region");
698b8bb3e797c5687715c6d9d960ee573e4d0e62230Ted Kremenek
699b40d06dec23b53bbc1157a9adae7f887be31aa3bTed Kremenek    // Treat blocks as analysis entry points.
700b40d06dec23b53bbc1157a9adae7f887be31aa3bTed Kremenek    CmdArgs.push_back("-analyzer-opt-analyze-nested-blocks");
701b40d06dec23b53bbc1157a9adae7f887be31aa3bTed Kremenek
7021d46033f760ba5fd266ce59fe391fac473f04f52Daniel Dunbar    // Add default argument set.
703d8fc0f2e7751cf31cec5c2f3cc6a0b447e9debb3Daniel Dunbar    if (!Args.hasArg(options::OPT__analyzer_no_default_checks)) {
704cd9902bfb79c5c67559360514951714bdafac36eTed Kremenek      CmdArgs.push_back("-analyzer-check-dead-stores");
705fb3f893bc58071e548c97a3d667c8ab9b0c38cfbTed Kremenek      CmdArgs.push_back("-analyzer-check-security-syntactic");
706d8fc0f2e7751cf31cec5c2f3cc6a0b447e9debb3Daniel Dunbar      CmdArgs.push_back("-checker-cfref");
707d8fc0f2e7751cf31cec5c2f3cc6a0b447e9debb3Daniel Dunbar      CmdArgs.push_back("-analyzer-eagerly-assume");
708d8fc0f2e7751cf31cec5c2f3cc6a0b447e9debb3Daniel Dunbar      CmdArgs.push_back("-warn-objc-methodsigs");
709d8fc0f2e7751cf31cec5c2f3cc6a0b447e9debb3Daniel Dunbar      // Do not enable the missing -dealloc check.
710d8fc0f2e7751cf31cec5c2f3cc6a0b447e9debb3Daniel Dunbar      // '-warn-objc-missing-dealloc',
711d8fc0f2e7751cf31cec5c2f3cc6a0b447e9debb3Daniel Dunbar      CmdArgs.push_back("-warn-objc-unused-ivars");
712d8fc0f2e7751cf31cec5c2f3cc6a0b447e9debb3Daniel Dunbar    }
713d8fc0f2e7751cf31cec5c2f3cc6a0b447e9debb3Daniel Dunbar
714d8fc0f2e7751cf31cec5c2f3cc6a0b447e9debb3Daniel Dunbar    // Set the output format. The default is plist, for (lame) historical
715d8fc0f2e7751cf31cec5c2f3cc6a0b447e9debb3Daniel Dunbar    // reasons.
716d8fc0f2e7751cf31cec5c2f3cc6a0b447e9debb3Daniel Dunbar    CmdArgs.push_back("-analyzer-output");
717d8fc0f2e7751cf31cec5c2f3cc6a0b447e9debb3Daniel Dunbar    if (Arg *A = Args.getLastArg(options::OPT__analyzer_output))
718d8fc0f2e7751cf31cec5c2f3cc6a0b447e9debb3Daniel Dunbar      CmdArgs.push_back(A->getValue(Args));
719d8fc0f2e7751cf31cec5c2f3cc6a0b447e9debb3Daniel Dunbar    else
720d8fc0f2e7751cf31cec5c2f3cc6a0b447e9debb3Daniel Dunbar      CmdArgs.push_back("plist");
7211d46033f760ba5fd266ce59fe391fac473f04f52Daniel Dunbar
7221d46033f760ba5fd266ce59fe391fac473f04f52Daniel Dunbar    // Add -Xanalyzer arguments when running as analyzer.
7231d46033f760ba5fd266ce59fe391fac473f04f52Daniel Dunbar    Args.AddAllArgValues(CmdArgs, options::OPT_Xanalyzer);
7241eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump  }
7251eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump
726e2fd66418eca3d70cf6b62087d745d0c5181db69Daniel Dunbar  CheckCodeGenerationOptions(D, Args);
727e2fd66418eca3d70cf6b62087d745d0c5181db69Daniel Dunbar
728bc85be85779a47bae728bbe6a2cd2e3732b1333dDaniel Dunbar  // Perform argument translation for LLVM backend. This
729bc85be85779a47bae728bbe6a2cd2e3732b1333dDaniel Dunbar  // takes some care in reconciling with llvm-gcc. The
730bc85be85779a47bae728bbe6a2cd2e3732b1333dDaniel Dunbar  // issue is that llvm-gcc translates these options based on
731bc85be85779a47bae728bbe6a2cd2e3732b1333dDaniel Dunbar  // the values in cc1, whereas we are processing based on
732bc85be85779a47bae728bbe6a2cd2e3732b1333dDaniel Dunbar  // the driver arguments.
7339fd0b1f845a61e71dd8099f596532d34c519630aDaniel Dunbar
734bc85be85779a47bae728bbe6a2cd2e3732b1333dDaniel Dunbar  // This comes from the default translation the driver + cc1
735bc85be85779a47bae728bbe6a2cd2e3732b1333dDaniel Dunbar  // would do to enable flag_pic.
736bc85be85779a47bae728bbe6a2cd2e3732b1333dDaniel Dunbar  //
737bc85be85779a47bae728bbe6a2cd2e3732b1333dDaniel Dunbar  // FIXME: Centralize this code.
738bc85be85779a47bae728bbe6a2cd2e3732b1333dDaniel Dunbar  bool PICEnabled = (Args.hasArg(options::OPT_fPIC) ||
739bc85be85779a47bae728bbe6a2cd2e3732b1333dDaniel Dunbar                     Args.hasArg(options::OPT_fpic) ||
740bc85be85779a47bae728bbe6a2cd2e3732b1333dDaniel Dunbar                     Args.hasArg(options::OPT_fPIE) ||
741bc85be85779a47bae728bbe6a2cd2e3732b1333dDaniel Dunbar                     Args.hasArg(options::OPT_fpie));
742bc85be85779a47bae728bbe6a2cd2e3732b1333dDaniel Dunbar  bool PICDisabled = (Args.hasArg(options::OPT_mkernel) ||
743bc85be85779a47bae728bbe6a2cd2e3732b1333dDaniel Dunbar                      Args.hasArg(options::OPT_static));
744bc85be85779a47bae728bbe6a2cd2e3732b1333dDaniel Dunbar  const char *Model = getToolChain().GetForcedPicModel();
745bc85be85779a47bae728bbe6a2cd2e3732b1333dDaniel Dunbar  if (!Model) {
746bc85be85779a47bae728bbe6a2cd2e3732b1333dDaniel Dunbar    if (Args.hasArg(options::OPT_mdynamic_no_pic))
747bc85be85779a47bae728bbe6a2cd2e3732b1333dDaniel Dunbar      Model = "dynamic-no-pic";
748bc85be85779a47bae728bbe6a2cd2e3732b1333dDaniel Dunbar    else if (PICDisabled)
749bc85be85779a47bae728bbe6a2cd2e3732b1333dDaniel Dunbar      Model = "static";
750bc85be85779a47bae728bbe6a2cd2e3732b1333dDaniel Dunbar    else if (PICEnabled)
751bc85be85779a47bae728bbe6a2cd2e3732b1333dDaniel Dunbar      Model = "pic";
7521d46033f760ba5fd266ce59fe391fac473f04f52Daniel Dunbar    else
753bc85be85779a47bae728bbe6a2cd2e3732b1333dDaniel Dunbar      Model = getToolChain().GetDefaultRelocationModel();
754bc85be85779a47bae728bbe6a2cd2e3732b1333dDaniel Dunbar  }
755f219e7c1529fac29e34483667f740b452e5ef9ccDaniel Dunbar  if (llvm::StringRef(Model) != "pic") {
756f219e7c1529fac29e34483667f740b452e5ef9ccDaniel Dunbar    CmdArgs.push_back("-mrelocation-model");
757f219e7c1529fac29e34483667f740b452e5ef9ccDaniel Dunbar    CmdArgs.push_back(Model);
758f219e7c1529fac29e34483667f740b452e5ef9ccDaniel Dunbar  }
7591d46033f760ba5fd266ce59fe391fac473f04f52Daniel Dunbar
760bc85be85779a47bae728bbe6a2cd2e3732b1333dDaniel Dunbar  // Infer the __PIC__ value.
761bc85be85779a47bae728bbe6a2cd2e3732b1333dDaniel Dunbar  //
762bc85be85779a47bae728bbe6a2cd2e3732b1333dDaniel Dunbar  // FIXME:  This isn't quite right on Darwin, which always sets
763bc85be85779a47bae728bbe6a2cd2e3732b1333dDaniel Dunbar  // __PIC__=2.
764bc85be85779a47bae728bbe6a2cd2e3732b1333dDaniel Dunbar  if (strcmp(Model, "pic") == 0 || strcmp(Model, "dynamic-no-pic") == 0) {
7657674352cf3e8f699914a2f739f1ae8c8c3480813Daniel Dunbar    CmdArgs.push_back("-pic-level");
7667674352cf3e8f699914a2f739f1ae8c8c3480813Daniel Dunbar    CmdArgs.push_back(Args.hasArg(options::OPT_fPIC) ? "2" : "1");
767bc85be85779a47bae728bbe6a2cd2e3732b1333dDaniel Dunbar  }
768f219e7c1529fac29e34483667f740b452e5ef9ccDaniel Dunbar  if (!Args.hasFlag(options::OPT_fmerge_all_constants,
769f219e7c1529fac29e34483667f740b452e5ef9ccDaniel Dunbar                    options::OPT_fno_merge_all_constants))
770f219e7c1529fac29e34483667f740b452e5ef9ccDaniel Dunbar    CmdArgs.push_back("-no-merge-all-constants");
771f219e7c1529fac29e34483667f740b452e5ef9ccDaniel Dunbar
772f219e7c1529fac29e34483667f740b452e5ef9ccDaniel Dunbar  // LLVM Code Generator Options.
7731d46033f760ba5fd266ce59fe391fac473f04f52Daniel Dunbar
774bc85be85779a47bae728bbe6a2cd2e3732b1333dDaniel Dunbar  // FIXME: Set --enable-unsafe-fp-math.
77521656ddae8e81df04f142386337cb95a9e0f0971Benjamin Kramer  if (Args.hasFlag(options::OPT_fno_omit_frame_pointer,
77621656ddae8e81df04f142386337cb95a9e0f0971Benjamin Kramer                   options::OPT_fomit_frame_pointer))
777f219e7c1529fac29e34483667f740b452e5ef9ccDaniel Dunbar    CmdArgs.push_back("-mdisable-fp-elim");
778bc85be85779a47bae728bbe6a2cd2e3732b1333dDaniel Dunbar  if (!Args.hasFlag(options::OPT_fzero_initialized_in_bss,
779f219e7c1529fac29e34483667f740b452e5ef9ccDaniel Dunbar                    options::OPT_fno_zero_initialized_in_bss))
780f219e7c1529fac29e34483667f740b452e5ef9ccDaniel Dunbar    CmdArgs.push_back("-mno-zero-initialized-in-bss");
781bc85be85779a47bae728bbe6a2cd2e3732b1333dDaniel Dunbar  if (Args.hasArg(options::OPT_dA) || Args.hasArg(options::OPT_fverbose_asm))
782f219e7c1529fac29e34483667f740b452e5ef9ccDaniel Dunbar    CmdArgs.push_back("-masm-verbose");
783f219e7c1529fac29e34483667f740b452e5ef9ccDaniel Dunbar  if (Args.hasArg(options::OPT_fdebug_pass_structure)) {
784f219e7c1529fac29e34483667f740b452e5ef9ccDaniel Dunbar    CmdArgs.push_back("-mdebug-pass");
785f219e7c1529fac29e34483667f740b452e5ef9ccDaniel Dunbar    CmdArgs.push_back("Structure");
786f219e7c1529fac29e34483667f740b452e5ef9ccDaniel Dunbar  }
787f219e7c1529fac29e34483667f740b452e5ef9ccDaniel Dunbar  if (Args.hasArg(options::OPT_fdebug_pass_arguments)) {
788f219e7c1529fac29e34483667f740b452e5ef9ccDaniel Dunbar    CmdArgs.push_back("-mdebug-pass");
789f219e7c1529fac29e34483667f740b452e5ef9ccDaniel Dunbar    CmdArgs.push_back("Arguments");
790f219e7c1529fac29e34483667f740b452e5ef9ccDaniel Dunbar  }
7916bea73b3305a03479589e2642fbdcf6c096851aaDaniel Dunbar
7926bea73b3305a03479589e2642fbdcf6c096851aaDaniel Dunbar  // This is a coarse approximation of what llvm-gcc actually does, both
7936bea73b3305a03479589e2642fbdcf6c096851aaDaniel Dunbar  // -fasynchronous-unwind-tables and -fnon-call-exceptions interact in more
7946bea73b3305a03479589e2642fbdcf6c096851aaDaniel Dunbar  // complicated ways.
7956bea73b3305a03479589e2642fbdcf6c096851aaDaniel Dunbar  bool AsynchronousUnwindTables =
7966bea73b3305a03479589e2642fbdcf6c096851aaDaniel Dunbar    Args.hasFlag(options::OPT_fasynchronous_unwind_tables,
7976bea73b3305a03479589e2642fbdcf6c096851aaDaniel Dunbar                 options::OPT_fno_asynchronous_unwind_tables,
7986bea73b3305a03479589e2642fbdcf6c096851aaDaniel Dunbar                 getToolChain().IsUnwindTablesDefault() &&
7996bea73b3305a03479589e2642fbdcf6c096851aaDaniel Dunbar                 !Args.hasArg(options::OPT_mkernel));
8006bea73b3305a03479589e2642fbdcf6c096851aaDaniel Dunbar  if (Args.hasFlag(options::OPT_funwind_tables, options::OPT_fno_unwind_tables,
8016bea73b3305a03479589e2642fbdcf6c096851aaDaniel Dunbar                   AsynchronousUnwindTables))
802f219e7c1529fac29e34483667f740b452e5ef9ccDaniel Dunbar    CmdArgs.push_back("-munwind-tables");
803f219e7c1529fac29e34483667f740b452e5ef9ccDaniel Dunbar
804f219e7c1529fac29e34483667f740b452e5ef9ccDaniel Dunbar  if (Arg *A = Args.getLastArg(options::OPT_flimited_precision_EQ)) {
805f219e7c1529fac29e34483667f740b452e5ef9ccDaniel Dunbar    CmdArgs.push_back("-mlimit-float-precision");
806f219e7c1529fac29e34483667f740b452e5ef9ccDaniel Dunbar    CmdArgs.push_back(A->getValue(Args));
807f219e7c1529fac29e34483667f740b452e5ef9ccDaniel Dunbar  }
808bc85be85779a47bae728bbe6a2cd2e3732b1333dDaniel Dunbar
809868bd0aa9281929ef50d2e9a8c82a036906f53f5Daniel Dunbar  // FIXME: Handle -mtune=.
810868bd0aa9281929ef50d2e9a8c82a036906f53f5Daniel Dunbar  (void) Args.hasArg(options::OPT_mtune_EQ);
811bc85be85779a47bae728bbe6a2cd2e3732b1333dDaniel Dunbar
8128e9ef0d87dad25f02e5abc6facf528778236115aBenjamin Kramer  if (Arg *A = Args.getLastArg(options::OPT_mcmodel_EQ)) {
813f219e7c1529fac29e34483667f740b452e5ef9ccDaniel Dunbar    CmdArgs.push_back("-mcode-model");
8148e9ef0d87dad25f02e5abc6facf528778236115aBenjamin Kramer    CmdArgs.push_back(A->getValue(Args));
8158e9ef0d87dad25f02e5abc6facf528778236115aBenjamin Kramer  }
8168e9ef0d87dad25f02e5abc6facf528778236115aBenjamin Kramer
8176acda16e9c194dcbd0dea64341e182bdb65d0f41Daniel Dunbar  // Add target specific cpu and features flags.
8186acda16e9c194dcbd0dea64341e182bdb65d0f41Daniel Dunbar  switch(getToolChain().getTriple().getArch()) {
8196acda16e9c194dcbd0dea64341e182bdb65d0f41Daniel Dunbar  default:
8206acda16e9c194dcbd0dea64341e182bdb65d0f41Daniel Dunbar    break;
821868bd0aa9281929ef50d2e9a8c82a036906f53f5Daniel Dunbar
822b163ef7e7a5d904ef0962a7c38c460be083c4d63Daniel Dunbar  case llvm::Triple::arm:
823b163ef7e7a5d904ef0962a7c38c460be083c4d63Daniel Dunbar  case llvm::Triple::thumb:
824b163ef7e7a5d904ef0962a7c38c460be083c4d63Daniel Dunbar    AddARMTargetArgs(Args, CmdArgs);
825b163ef7e7a5d904ef0962a7c38c460be083c4d63Daniel Dunbar    break;
826b163ef7e7a5d904ef0962a7c38c460be083c4d63Daniel Dunbar
8276acda16e9c194dcbd0dea64341e182bdb65d0f41Daniel Dunbar  case llvm::Triple::x86:
8286acda16e9c194dcbd0dea64341e182bdb65d0f41Daniel Dunbar  case llvm::Triple::x86_64:
8296acda16e9c194dcbd0dea64341e182bdb65d0f41Daniel Dunbar    AddX86TargetArgs(Args, CmdArgs);
8306acda16e9c194dcbd0dea64341e182bdb65d0f41Daniel Dunbar    break;
831bc85be85779a47bae728bbe6a2cd2e3732b1333dDaniel Dunbar  }
832c21c485b4fb58ef5d55cf3e523263dd824a2ace4Daniel Dunbar
833c31176d5ebbcd407aa512bbd5f717e35da629e7dDan Gohman  // -fno-math-errno is default.
834c31176d5ebbcd407aa512bbd5f717e35da629e7dDan Gohman  if (Args.hasFlag(options::OPT_fmath_errno,
835bc85be85779a47bae728bbe6a2cd2e3732b1333dDaniel Dunbar                   options::OPT_fno_math_errno,
836c31176d5ebbcd407aa512bbd5f717e35da629e7dDan Gohman                   false))
837c31176d5ebbcd407aa512bbd5f717e35da629e7dDan Gohman    CmdArgs.push_back("-fmath-errno");
8381d46033f760ba5fd266ce59fe391fac473f04f52Daniel Dunbar
839bc85be85779a47bae728bbe6a2cd2e3732b1333dDaniel Dunbar  Arg *Unsupported;
840bc85be85779a47bae728bbe6a2cd2e3732b1333dDaniel Dunbar  if ((Unsupported = Args.getLastArg(options::OPT_MG)) ||
84195a0da7b263777e6f97e5a08b6eb893681a234baDaniel Dunbar      (Unsupported = Args.getLastArg(options::OPT_MQ)) ||
8426feaf57b46f0856127c84b03f3aee5fb51d0262bTed Kremenek      (Unsupported = Args.getLastArg(options::OPT_iframework)) ||
8436feaf57b46f0856127c84b03f3aee5fb51d0262bTed Kremenek      (Unsupported = Args.getLastArg(options::OPT_fshort_enums)))
844e027a4b2399e9b0acfe0f77220c66bbe369067eeDaniel Dunbar    D.Diag(clang::diag::err_drv_clang_unsupported)
845bc85be85779a47bae728bbe6a2cd2e3732b1333dDaniel Dunbar      << Unsupported->getOption().getName();
846bc85be85779a47bae728bbe6a2cd2e3732b1333dDaniel Dunbar
8471d46033f760ba5fd266ce59fe391fac473f04f52Daniel Dunbar  Args.AddAllArgs(CmdArgs, options::OPT_v);
8481d46033f760ba5fd266ce59fe391fac473f04f52Daniel Dunbar  Args.AddLastArg(CmdArgs, options::OPT_P);
8491eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump  Args.AddLastArg(CmdArgs, options::OPT_print_ivar_layout);
8501d46033f760ba5fd266ce59fe391fac473f04f52Daniel Dunbar
8511d46033f760ba5fd266ce59fe391fac473f04f52Daniel Dunbar  // Special case debug options to only pass -g to clang. This is
8521d46033f760ba5fd266ce59fe391fac473f04f52Daniel Dunbar  // wrong.
8531d46033f760ba5fd266ce59fe391fac473f04f52Daniel Dunbar  if (Args.hasArg(options::OPT_g_Group))
8541d46033f760ba5fd266ce59fe391fac473f04f52Daniel Dunbar    CmdArgs.push_back("-g");
8551d46033f760ba5fd266ce59fe391fac473f04f52Daniel Dunbar
8561d46033f760ba5fd266ce59fe391fac473f04f52Daniel Dunbar  Args.AddLastArg(CmdArgs, options::OPT_nostdinc);
8578d737cc78cb28f39179d6c7ca00eb5d3cf563129Rafael Espindola  Args.AddLastArg(CmdArgs, options::OPT_nobuiltininc);
8581d46033f760ba5fd266ce59fe391fac473f04f52Daniel Dunbar
8595f12232ef39e3d6c36d6600a73ebbe3c4a79f514Daniel Dunbar  // Pass the path to compiler resource files.
8605f12232ef39e3d6c36d6600a73ebbe3c4a79f514Daniel Dunbar  CmdArgs.push_back("-resource-dir");
861225c41706dc0f3682236e351820d339e14390e00Daniel Dunbar  CmdArgs.push_back(D.ResourceDir.c_str());
8622ac9fc2ad64e16127df8c60caeea2edfe9a400a2Daniel Dunbar
863c21c485b4fb58ef5d55cf3e523263dd824a2ace4Daniel Dunbar  // Add preprocessing options like -I, -D, etc. if we are using the
864c21c485b4fb58ef5d55cf3e523263dd824a2ace4Daniel Dunbar  // preprocessor.
865c21c485b4fb58ef5d55cf3e523263dd824a2ace4Daniel Dunbar  //
866c21c485b4fb58ef5d55cf3e523263dd824a2ace4Daniel Dunbar  // FIXME: Support -fpreprocessed
867c21c485b4fb58ef5d55cf3e523263dd824a2ace4Daniel Dunbar  types::ID InputType = Inputs[0].getType();
868c21c485b4fb58ef5d55cf3e523263dd824a2ace4Daniel Dunbar  if (types::getPreprocessedType(InputType) != types::TY_INVALID)
869df91ef3d6c55692a0236f67b6c6b134a3bf84098Douglas Gregor    AddPreprocessingOptions(D, Args, CmdArgs, Output, Inputs);
8701d46033f760ba5fd266ce59fe391fac473f04f52Daniel Dunbar
87120f0eacf1682e4594da9d318b5b13ed4f6d6e7e5Daniel Dunbar  // Manually translate -O to -O2 and -O4 to -O3; let clang reject
872337a6271b98c4c183f7eaad1563a75260b4f2871Daniel Dunbar  // others.
873337a6271b98c4c183f7eaad1563a75260b4f2871Daniel Dunbar  if (Arg *A = Args.getLastArg(options::OPT_O_Group)) {
874b827a0541b5fd095fcdb7ad0c3df93ca158c619aDaniel Dunbar    if (A->getOption().matches(options::OPT_O4))
875337a6271b98c4c183f7eaad1563a75260b4f2871Daniel Dunbar      CmdArgs.push_back("-O3");
876337a6271b98c4c183f7eaad1563a75260b4f2871Daniel Dunbar    else if (A->getValue(Args)[0] == '\0')
87720f0eacf1682e4594da9d318b5b13ed4f6d6e7e5Daniel Dunbar      CmdArgs.push_back("-O2");
8781d46033f760ba5fd266ce59fe391fac473f04f52Daniel Dunbar    else
8795697aa0d75c87bafec78984048d558f8d12ca1b3Daniel Dunbar      A->render(Args, CmdArgs);
8801d46033f760ba5fd266ce59fe391fac473f04f52Daniel Dunbar  }
8811d46033f760ba5fd266ce59fe391fac473f04f52Daniel Dunbar
8826e8371eb97a08f724be22ae6042d1e9eacbe4c48Daniel Dunbar  Args.AddAllArgs(CmdArgs, options::OPT_W_Group);
8836e8371eb97a08f724be22ae6042d1e9eacbe4c48Daniel Dunbar  Args.AddLastArg(CmdArgs, options::OPT_pedantic);
8846e8371eb97a08f724be22ae6042d1e9eacbe4c48Daniel Dunbar  Args.AddLastArg(CmdArgs, options::OPT_pedantic_errors);
8851d46033f760ba5fd266ce59fe391fac473f04f52Daniel Dunbar  Args.AddLastArg(CmdArgs, options::OPT_w);
886d573d26e1abcce24c31ece3d6f7af158db569e4cDaniel Dunbar
887d573d26e1abcce24c31ece3d6f7af158db569e4cDaniel Dunbar  // Handle -{std, ansi, trigraphs} -- take the last of -{std, ansi}
888d573d26e1abcce24c31ece3d6f7af158db569e4cDaniel Dunbar  // (-ansi is equivalent to -std=c89).
889d573d26e1abcce24c31ece3d6f7af158db569e4cDaniel Dunbar  //
890d573d26e1abcce24c31ece3d6f7af158db569e4cDaniel Dunbar  // If a std is supplied, only add -trigraphs if it follows the
891d573d26e1abcce24c31ece3d6f7af158db569e4cDaniel Dunbar  // option.
892d573d26e1abcce24c31ece3d6f7af158db569e4cDaniel Dunbar  if (Arg *Std = Args.getLastArg(options::OPT_std_EQ, options::OPT_ansi)) {
893d573d26e1abcce24c31ece3d6f7af158db569e4cDaniel Dunbar    if (Std->getOption().matches(options::OPT_ansi))
894528365d3189d27f3a90a4012baaa8b2814e0a231Nuno Lopes      if (types::isCXX(InputType))
895294691eb1caf551083acd7b08630ef21c3fd760dDaniel Dunbar        CmdArgs.push_back("-std=c++98");
896528365d3189d27f3a90a4012baaa8b2814e0a231Nuno Lopes      else
897294691eb1caf551083acd7b08630ef21c3fd760dDaniel Dunbar        CmdArgs.push_back("-std=c89");
898d573d26e1abcce24c31ece3d6f7af158db569e4cDaniel Dunbar    else
899d573d26e1abcce24c31ece3d6f7af158db569e4cDaniel Dunbar      Std->render(Args, CmdArgs);
900d573d26e1abcce24c31ece3d6f7af158db569e4cDaniel Dunbar
901d573d26e1abcce24c31ece3d6f7af158db569e4cDaniel Dunbar    if (Arg *A = Args.getLastArg(options::OPT_trigraphs))
902d573d26e1abcce24c31ece3d6f7af158db569e4cDaniel Dunbar      if (A->getIndex() > Std->getIndex())
903d573d26e1abcce24c31ece3d6f7af158db569e4cDaniel Dunbar        A->render(Args, CmdArgs);
904a3ff202ee4fb21728e930d5d029ba4925129912cDaniel Dunbar  } else {
905a3ff202ee4fb21728e930d5d029ba4925129912cDaniel Dunbar    // Honor -std-default.
9064a5290e773e70ec2c3b4353a3a4aa7d1a3e3cd66Daniel Dunbar    //
9074a5290e773e70ec2c3b4353a3a4aa7d1a3e3cd66Daniel Dunbar    // FIXME: Clang doesn't correctly handle -std= when the input language
9084a5290e773e70ec2c3b4353a3a4aa7d1a3e3cd66Daniel Dunbar    // doesn't match. For the time being just ignore this for C++ inputs;
9094a5290e773e70ec2c3b4353a3a4aa7d1a3e3cd66Daniel Dunbar    // eventually we want to do all the standard defaulting here instead of
9104a5290e773e70ec2c3b4353a3a4aa7d1a3e3cd66Daniel Dunbar    // splitting it between the driver and clang -cc1.
9114a5290e773e70ec2c3b4353a3a4aa7d1a3e3cd66Daniel Dunbar    if (!types::isCXX(InputType))
9124a5290e773e70ec2c3b4353a3a4aa7d1a3e3cd66Daniel Dunbar        Args.AddAllArgsTranslated(CmdArgs, options::OPT_std_default_EQ,
9134a5290e773e70ec2c3b4353a3a4aa7d1a3e3cd66Daniel Dunbar                                  "-std=", /*Joined=*/true);
914d573d26e1abcce24c31ece3d6f7af158db569e4cDaniel Dunbar    Args.AddLastArg(CmdArgs, options::OPT_trigraphs);
915a3ff202ee4fb21728e930d5d029ba4925129912cDaniel Dunbar  }
916c21c485b4fb58ef5d55cf3e523263dd824a2ace4Daniel Dunbar
9171d46033f760ba5fd266ce59fe391fac473f04f52Daniel Dunbar  if (Arg *A = Args.getLastArg(options::OPT_ftemplate_depth_)) {
9181d46033f760ba5fd266ce59fe391fac473f04f52Daniel Dunbar    CmdArgs.push_back("-ftemplate-depth");
9191d46033f760ba5fd266ce59fe391fac473f04f52Daniel Dunbar    CmdArgs.push_back(A->getValue(Args));
920b488c1dac8e53206f07103d794a62a3f5012c0f4Daniel Dunbar  }
921b488c1dac8e53206f07103d794a62a3f5012c0f4Daniel Dunbar
922e4bdae78c69d2a09ee96619cc5ccf81441674412Daniel Dunbar  if (Args.hasArg(options::OPT__relocatable_pch))
92366861e09d590994a8b941eaa328e4d8f33adec9eDaniel Dunbar    CmdArgs.push_back("-relocatable-pch");
9241eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump
925294691eb1caf551083acd7b08630ef21c3fd760dDaniel Dunbar  if (Arg *A = Args.getLastArg(options::OPT_fconstant_string_class_EQ)) {
926294691eb1caf551083acd7b08630ef21c3fd760dDaniel Dunbar    CmdArgs.push_back("-fconstant-string-class");
927294691eb1caf551083acd7b08630ef21c3fd760dDaniel Dunbar    CmdArgs.push_back(A->getValue(Args));
928294691eb1caf551083acd7b08630ef21c3fd760dDaniel Dunbar  }
9298a5a9aaddb627c0884c2ed8db55cc29fdb601195David Chisnall
930124fca533d9fef2e3f6359283909bd342b5f5f26Chris Lattner  if (Arg *A = Args.getLastArg(options::OPT_ftabstop_EQ)) {
931124fca533d9fef2e3f6359283909bd342b5f5f26Chris Lattner    CmdArgs.push_back("-ftabstop");
932124fca533d9fef2e3f6359283909bd342b5f5f26Chris Lattner    CmdArgs.push_back(A->getValue(Args));
933124fca533d9fef2e3f6359283909bd342b5f5f26Chris Lattner  }
934124fca533d9fef2e3f6359283909bd342b5f5f26Chris Lattner
93555efe142a84b2aab6d0186c20a311c347a65f794Daniel Dunbar  // Pass -fmessage-length=.
936a28690e5b0e423a6287ebe3a5565fd1896d7ebffDaniel Dunbar  CmdArgs.push_back("-fmessage-length");
93755efe142a84b2aab6d0186c20a311c347a65f794Daniel Dunbar  if (Arg *A = Args.getLastArg(options::OPT_fmessage_length_EQ)) {
938a28690e5b0e423a6287ebe3a5565fd1896d7ebffDaniel Dunbar    CmdArgs.push_back(A->getValue(Args));
93955efe142a84b2aab6d0186c20a311c347a65f794Daniel Dunbar  } else {
94055efe142a84b2aab6d0186c20a311c347a65f794Daniel Dunbar    // If -fmessage-length=N was not specified, determine whether this is a
94155efe142a84b2aab6d0186c20a311c347a65f794Daniel Dunbar    // terminal and, if so, implicitly define -fmessage-length appropriately.
94255efe142a84b2aab6d0186c20a311c347a65f794Daniel Dunbar    unsigned N = llvm::sys::Process::StandardErrColumns();
94355efe142a84b2aab6d0186c20a311c347a65f794Daniel Dunbar    CmdArgs.push_back(Args.MakeArgString(llvm::Twine(N)));
94455efe142a84b2aab6d0186c20a311c347a65f794Daniel Dunbar  }
94555efe142a84b2aab6d0186c20a311c347a65f794Daniel Dunbar
946ba8d86172c8d9e2476c6fd2415731639223174c5Daniel Dunbar  if (const Arg *A = Args.getLastArg(options::OPT_fvisibility_EQ)) {
947ba8d86172c8d9e2476c6fd2415731639223174c5Daniel Dunbar    CmdArgs.push_back("-fvisibility");
948ba8d86172c8d9e2476c6fd2415731639223174c5Daniel Dunbar    CmdArgs.push_back(A->getValue(Args));
949ba8d86172c8d9e2476c6fd2415731639223174c5Daniel Dunbar  }
950ba8d86172c8d9e2476c6fd2415731639223174c5Daniel Dunbar
951ba8d86172c8d9e2476c6fd2415731639223174c5Daniel Dunbar  // Forward -f (flag) options which we can pass directly.
9529c276ae0f24d4cee8f7954069d4b8eae45d0447dMike Stump  Args.AddLastArg(CmdArgs, options::OPT_fcatch_undefined_behavior);
9533aaf082689d3235937a2e56a60f90fc1b3aebfb2Daniel Dunbar  Args.AddLastArg(CmdArgs, options::OPT_femit_all_decls);
9543aaf082689d3235937a2e56a60f90fc1b3aebfb2Daniel Dunbar  Args.AddLastArg(CmdArgs, options::OPT_ffreestanding);
9553aaf082689d3235937a2e56a60f90fc1b3aebfb2Daniel Dunbar  Args.AddLastArg(CmdArgs, options::OPT_fheinous_gnu_extensions);
9563aaf082689d3235937a2e56a60f90fc1b3aebfb2Daniel Dunbar  Args.AddLastArg(CmdArgs, options::OPT_flax_vector_conversions);
9573aaf082689d3235937a2e56a60f90fc1b3aebfb2Daniel Dunbar  Args.AddLastArg(CmdArgs, options::OPT_fno_caret_diagnostics);
9583aaf082689d3235937a2e56a60f90fc1b3aebfb2Daniel Dunbar  Args.AddLastArg(CmdArgs, options::OPT_fno_show_column);
9593aaf082689d3235937a2e56a60f90fc1b3aebfb2Daniel Dunbar  Args.AddLastArg(CmdArgs, options::OPT_fobjc_gc_only);
9603aaf082689d3235937a2e56a60f90fc1b3aebfb2Daniel Dunbar  Args.AddLastArg(CmdArgs, options::OPT_fobjc_gc);
96134e65770ad6142b033d6cec4f476ed20fb248bf3Fariborz Jahanian  Args.AddLastArg(CmdArgs, options::OPT_fobjc_sender_dependent_dispatch);
962182e09240a33c6f1d303deecabec6e0e9c9d109dChris Lattner  Args.AddLastArg(CmdArgs, options::OPT_fdiagnostics_print_source_range_info);
9633aaf082689d3235937a2e56a60f90fc1b3aebfb2Daniel Dunbar  Args.AddLastArg(CmdArgs, options::OPT_ftime_report);
9643aaf082689d3235937a2e56a60f90fc1b3aebfb2Daniel Dunbar  Args.AddLastArg(CmdArgs, options::OPT_ftrapv);
9653aaf082689d3235937a2e56a60f90fc1b3aebfb2Daniel Dunbar  Args.AddLastArg(CmdArgs, options::OPT_fwritable_strings);
9661d46033f760ba5fd266ce59fe391fac473f04f52Daniel Dunbar
9675345c391c65d1780a0d7b0102b7f735cc3f82732Daniel Dunbar  Args.AddLastArg(CmdArgs, options::OPT_pthread);
9685345c391c65d1780a0d7b0102b7f735cc3f82732Daniel Dunbar
9699e5cc6b703b2d0013f13800c2ffbeb3cf85fcfadDaniel Dunbar  // -stack-protector=0 is default.
9709e5cc6b703b2d0013f13800c2ffbeb3cf85fcfadDaniel Dunbar  unsigned StackProtectorLevel = 0;
97145483f7a1b3e57b4603b141bee80596b2d4dd443Bill Wendling  if (Arg *A = Args.getLastArg(options::OPT_fno_stack_protector,
97245483f7a1b3e57b4603b141bee80596b2d4dd443Bill Wendling                               options::OPT_fstack_protector_all,
97345483f7a1b3e57b4603b141bee80596b2d4dd443Bill Wendling                               options::OPT_fstack_protector)) {
9749e5cc6b703b2d0013f13800c2ffbeb3cf85fcfadDaniel Dunbar    if (A->getOption().matches(options::OPT_fstack_protector))
9759e5cc6b703b2d0013f13800c2ffbeb3cf85fcfadDaniel Dunbar      StackProtectorLevel = 1;
9769e5cc6b703b2d0013f13800c2ffbeb3cf85fcfadDaniel Dunbar    else if (A->getOption().matches(options::OPT_fstack_protector_all))
9779e5cc6b703b2d0013f13800c2ffbeb3cf85fcfadDaniel Dunbar      StackProtectorLevel = 2;
9789e5cc6b703b2d0013f13800c2ffbeb3cf85fcfadDaniel Dunbar  } else
9799e5cc6b703b2d0013f13800c2ffbeb3cf85fcfadDaniel Dunbar    StackProtectorLevel = getToolChain().GetDefaultStackProtectorLevel();
9809e5cc6b703b2d0013f13800c2ffbeb3cf85fcfadDaniel Dunbar  if (StackProtectorLevel) {
9819e5cc6b703b2d0013f13800c2ffbeb3cf85fcfadDaniel Dunbar    CmdArgs.push_back("-stack-protector");
9829e5cc6b703b2d0013f13800c2ffbeb3cf85fcfadDaniel Dunbar    CmdArgs.push_back(Args.MakeArgString(llvm::Twine(StackProtectorLevel)));
98345483f7a1b3e57b4603b141bee80596b2d4dd443Bill Wendling  }
98445483f7a1b3e57b4603b141bee80596b2d4dd443Bill Wendling
98548d1ef782c8c88066b5febf60f8f456064d7d3f0Daniel Dunbar  // Forward -f options with positive and negative forms; we translate
98648d1ef782c8c88066b5febf60f8f456064d7d3f0Daniel Dunbar  // these by hand.
98748d1ef782c8c88066b5febf60f8f456064d7d3f0Daniel Dunbar
9889e5cc6b703b2d0013f13800c2ffbeb3cf85fcfadDaniel Dunbar  // -fbuiltin is default.
98948d1ef782c8c88066b5febf60f8f456064d7d3f0Daniel Dunbar  if (!Args.hasFlag(options::OPT_fbuiltin, options::OPT_fno_builtin))
99053e8484581ca358c3a2ccd8ea39c136c6e85d606Daniel Dunbar    CmdArgs.push_back("-fno-builtin");
99148d1ef782c8c88066b5febf60f8f456064d7d3f0Daniel Dunbar
992fc2844846e91398205fddc71196fe9dda04e105fNuno Lopes  if (!Args.hasFlag(options::OPT_fassume_sane_operator_new,
993fc2844846e91398205fddc71196fe9dda04e105fNuno Lopes                    options::OPT_fno_assume_sane_operator_new))
994fc2844846e91398205fddc71196fe9dda04e105fNuno Lopes    CmdArgs.push_back("-fno-assume-sane-operator-new");
995fc2844846e91398205fddc71196fe9dda04e105fNuno Lopes
9969e5cc6b703b2d0013f13800c2ffbeb3cf85fcfadDaniel Dunbar  // -fblocks=0 is default.
9979e5cc6b703b2d0013f13800c2ffbeb3cf85fcfadDaniel Dunbar  if (Args.hasFlag(options::OPT_fblocks, options::OPT_fno_blocks,
9985e530af5d51572a0ed5dbe50da54bd333840c63dDavid Chisnall                   getToolChain().IsBlocksDefault())) {
9995e530af5d51572a0ed5dbe50da54bd333840c63dDavid Chisnall    Args.AddLastArg(CmdArgs, options::OPT_fblock_introspection);
10009e5cc6b703b2d0013f13800c2ffbeb3cf85fcfadDaniel Dunbar    CmdArgs.push_back("-fblocks");
10015e530af5d51572a0ed5dbe50da54bd333840c63dDavid Chisnall  }
100248d1ef782c8c88066b5febf60f8f456064d7d3f0Daniel Dunbar
10036d2eb4d07d40795131f28d719ef9146a2be500f6Daniel Dunbar  // -fexceptions=0 is default.
100485caf03ee49c4de87ee9624a9b725ef5d20ee624Fariborz Jahanian  if (needsExceptions(Args, InputType, getToolChain().getTriple()))
1005f759df06d997050559fd925758bcd2cdef24db05Rafael Espindola    CmdArgs.push_back("-fexceptions");
1006738f8c278da5950d0d4607de2debe0bdfad64185Mike Stump
10070be42c44f0199c5023b542d6a6d2e66eb594f27dDaniel Dunbar  // -frtti is default.
1008738f8c278da5950d0d4607de2debe0bdfad64185Mike Stump  if (!Args.hasFlag(options::OPT_frtti, options::OPT_fno_rtti))
100953e8484581ca358c3a2ccd8ea39c136c6e85d606Daniel Dunbar    CmdArgs.push_back("-fno-rtti");
1010738f8c278da5950d0d4607de2debe0bdfad64185Mike Stump
10111f95e6567faab67f4363d650f73121359c4bdbabDaniel Dunbar  // -fsigned-char is default.
10126d2eb4d07d40795131f28d719ef9146a2be500f6Daniel Dunbar  if (!Args.hasFlag(options::OPT_fsigned_char, options::OPT_funsigned_char,
10131f95e6567faab67f4363d650f73121359c4bdbabDaniel Dunbar                    isSignedCharDefault(getToolChain().getTriple())))
10147674352cf3e8f699914a2f739f1ae8c8c3480813Daniel Dunbar    CmdArgs.push_back("-fno-signed-char");
10155a77973d9bc2c9cdbdb7860dcf3ac795abe258ecEli Friedman
10160be42c44f0199c5023b542d6a6d2e66eb594f27dDaniel Dunbar  // -fms-extensions=0 is default.
10176d2eb4d07d40795131f28d719ef9146a2be500f6Daniel Dunbar  if (Args.hasFlag(options::OPT_fms_extensions, options::OPT_fno_ms_extensions,
10180be42c44f0199c5023b542d6a6d2e66eb594f27dDaniel Dunbar                   getToolChain().getTriple().getOS() == llvm::Triple::Win32))
10190be42c44f0199c5023b542d6a6d2e66eb594f27dDaniel Dunbar    CmdArgs.push_back("-fms-extensions");
10200be42c44f0199c5023b542d6a6d2e66eb594f27dDaniel Dunbar
1021c5a97ec19408c3dca4b6a6385f11d8c783b94d0bDaniel Dunbar  // -fnext-runtime is default.
10226d2eb4d07d40795131f28d719ef9146a2be500f6Daniel Dunbar  if (!Args.hasFlag(options::OPT_fnext_runtime, options::OPT_fgnu_runtime,
1023c5a97ec19408c3dca4b6a6385f11d8c783b94d0bDaniel Dunbar                    getToolChain().getTriple().getOS() == llvm::Triple::Darwin))
1024c5a97ec19408c3dca4b6a6385f11d8c783b94d0bDaniel Dunbar    CmdArgs.push_back("-fgnu-runtime");
1025c5a97ec19408c3dca4b6a6385f11d8c783b94d0bDaniel Dunbar
10269e5cc6b703b2d0013f13800c2ffbeb3cf85fcfadDaniel Dunbar  // -fobjc-nonfragile-abi=0 is default.
10279e5cc6b703b2d0013f13800c2ffbeb3cf85fcfadDaniel Dunbar  if (types::isObjC(InputType)) {
10289e5cc6b703b2d0013f13800c2ffbeb3cf85fcfadDaniel Dunbar    if (Args.hasArg(options::OPT_fobjc_nonfragile_abi) ||
1029984eb8611d9ee46fc6351dee43609f2deed99f3cDaniel Dunbar        getToolChain().IsObjCNonFragileABIDefault()) {
10309e5cc6b703b2d0013f13800c2ffbeb3cf85fcfadDaniel Dunbar      CmdArgs.push_back("-fobjc-nonfragile-abi");
1031984eb8611d9ee46fc6351dee43609f2deed99f3cDaniel Dunbar
1032984eb8611d9ee46fc6351dee43609f2deed99f3cDaniel Dunbar      // -fobjc-legacy-dispatch is only relevant with the nonfragile-abi, and
1033984eb8611d9ee46fc6351dee43609f2deed99f3cDaniel Dunbar      // defaults to off.
1034984eb8611d9ee46fc6351dee43609f2deed99f3cDaniel Dunbar      if (Args.hasFlag(options::OPT_fobjc_legacy_dispatch,
1035984eb8611d9ee46fc6351dee43609f2deed99f3cDaniel Dunbar                       options::OPT_fno_objc_legacy_dispatch,
1036609508ce95732e7e7010f79c5207613eced7c9cbDaniel Dunbar                       getToolChain().IsObjCLegacyDispatchDefault()))
1037984eb8611d9ee46fc6351dee43609f2deed99f3cDaniel Dunbar        CmdArgs.push_back("-fobjc-legacy-dispatch");
1038984eb8611d9ee46fc6351dee43609f2deed99f3cDaniel Dunbar    }
10399e5cc6b703b2d0013f13800c2ffbeb3cf85fcfadDaniel Dunbar  }
10409e5cc6b703b2d0013f13800c2ffbeb3cf85fcfadDaniel Dunbar
1041984eb8611d9ee46fc6351dee43609f2deed99f3cDaniel Dunbar  if (!Args.hasFlag(options::OPT_fassume_sane_operator_new,
1042984eb8611d9ee46fc6351dee43609f2deed99f3cDaniel Dunbar                    options::OPT_fno_assume_sane_operator_new))
1043984eb8611d9ee46fc6351dee43609f2deed99f3cDaniel Dunbar    CmdArgs.push_back("-fno-assume-sane-operator-new");
1044984eb8611d9ee46fc6351dee43609f2deed99f3cDaniel Dunbar
1045a6fda124bf380479529d6a80b84b62cacd3cb707John Thompson  // -fshort-wchar default varies depending on platform; only
1046a6fda124bf380479529d6a80b84b62cacd3cb707John Thompson  // pass if specified.
1047a6fda124bf380479529d6a80b84b62cacd3cb707John Thompson  if (Arg *A = Args.getLastArg(options::OPT_fshort_wchar)) {
1048a6fda124bf380479529d6a80b84b62cacd3cb707John Thompson    if (A->getOption().matches(options::OPT_fshort_wchar))
1049a6fda124bf380479529d6a80b84b62cacd3cb707John Thompson      CmdArgs.push_back("-fshort-wchar");
1050a6fda124bf380479529d6a80b84b62cacd3cb707John Thompson  }
1051a6fda124bf380479529d6a80b84b62cacd3cb707John Thompson
1052ee848a73e5f8ffe7511af8652ba811c020d1c7a0Daniel Dunbar  // -fno-pascal-strings is default, only pass non-default. If the tool chain
1053ee848a73e5f8ffe7511af8652ba811c020d1c7a0Daniel Dunbar  // happened to translate to -mpascal-strings, we want to back translate here.
105482d00688525c876bf47bce414dedae9c343e67f5Daniel Dunbar  //
105582d00688525c876bf47bce414dedae9c343e67f5Daniel Dunbar  // FIXME: This is gross; that translation should be pulled from the
105682d00688525c876bf47bce414dedae9c343e67f5Daniel Dunbar  // tool chain.
1057c21c485b4fb58ef5d55cf3e523263dd824a2ace4Daniel Dunbar  if (Args.hasFlag(options::OPT_fpascal_strings,
105882d00688525c876bf47bce414dedae9c343e67f5Daniel Dunbar                   options::OPT_fno_pascal_strings,
105982d00688525c876bf47bce414dedae9c343e67f5Daniel Dunbar                   false) ||
106082d00688525c876bf47bce414dedae9c343e67f5Daniel Dunbar      Args.hasFlag(options::OPT_mpascal_strings,
106182d00688525c876bf47bce414dedae9c343e67f5Daniel Dunbar                   options::OPT_mno_pascal_strings,
106282d00688525c876bf47bce414dedae9c343e67f5Daniel Dunbar                   false))
106348d1ef782c8c88066b5febf60f8f456064d7d3f0Daniel Dunbar    CmdArgs.push_back("-fpascal-strings");
106448d1ef782c8c88066b5febf60f8f456064d7d3f0Daniel Dunbar
106548d1ef782c8c88066b5febf60f8f456064d7d3f0Daniel Dunbar  // -fcommon is default, only pass non-default.
106648d1ef782c8c88066b5febf60f8f456064d7d3f0Daniel Dunbar  if (!Args.hasFlag(options::OPT_fcommon, options::OPT_fno_common))
106748d1ef782c8c88066b5febf60f8f456064d7d3f0Daniel Dunbar    CmdArgs.push_back("-fno-common");
106848d1ef782c8c88066b5febf60f8f456064d7d3f0Daniel Dunbar
106970d3c92820f590b10553da9c96eda24e4325ba34Daniel Dunbar  // -fsigned-bitfields is default, and clang doesn't yet support
107070d3c92820f590b10553da9c96eda24e4325ba34Daniel Dunbar  // --funsigned-bitfields.
10711eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump  if (!Args.hasFlag(options::OPT_fsigned_bitfields,
107270d3c92820f590b10553da9c96eda24e4325ba34Daniel Dunbar                    options::OPT_funsigned_bitfields))
107370d3c92820f590b10553da9c96eda24e4325ba34Daniel Dunbar    D.Diag(clang::diag::warn_drv_clang_unsupported)
107470d3c92820f590b10553da9c96eda24e4325ba34Daniel Dunbar      << Args.getLastArg(options::OPT_funsigned_bitfields)->getAsString(Args);
107570d3c92820f590b10553da9c96eda24e4325ba34Daniel Dunbar
107649138fc59eeac2aacd3b7e04c2642180d5baefd7Daniel Dunbar  // -fdiagnostics-fixit-info is default, only pass non-default.
10771eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump  if (!Args.hasFlag(options::OPT_fdiagnostics_fixit_info,
107849138fc59eeac2aacd3b7e04c2642180d5baefd7Daniel Dunbar                    options::OPT_fno_diagnostics_fixit_info))
107949138fc59eeac2aacd3b7e04c2642180d5baefd7Daniel Dunbar    CmdArgs.push_back("-fno-diagnostics-fixit-info");
108049138fc59eeac2aacd3b7e04c2642180d5baefd7Daniel Dunbar
108174f20838caa266f829bf5ae43997f8ebfca54a9aDaniel Dunbar  Args.AddLastArg(CmdArgs, options::OPT_fdiagnostics_binary);
1082d93256e55673a17d18543397ec462416acb13792Douglas Gregor
10839e820ee054fefe5422b4db3f681e567a8976747eDaniel Dunbar  // Enable -fdiagnostics-show-option by default.
10841eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump  if (Args.hasFlag(options::OPT_fdiagnostics_show_option,
10859e820ee054fefe5422b4db3f681e567a8976747eDaniel Dunbar                   options::OPT_fno_diagnostics_show_option))
10869e820ee054fefe5422b4db3f681e567a8976747eDaniel Dunbar    CmdArgs.push_back("-fdiagnostics-show-option");
1087838be483dcf10ea3f2acd85f2cd65adc310011f9Daniel Dunbar
1088838be483dcf10ea3f2acd85f2cd65adc310011f9Daniel Dunbar  // Color diagnostics are the default, unless the terminal doesn't support
1089838be483dcf10ea3f2acd85f2cd65adc310011f9Daniel Dunbar  // them.
1090838be483dcf10ea3f2acd85f2cd65adc310011f9Daniel Dunbar  if (Args.hasFlag(options::OPT_fcolor_diagnostics,
1091838be483dcf10ea3f2acd85f2cd65adc310011f9Daniel Dunbar                   options::OPT_fno_color_diagnostics) &&
1092838be483dcf10ea3f2acd85f2cd65adc310011f9Daniel Dunbar      llvm::sys::Process::StandardErrHasColors())
1093838be483dcf10ea3f2acd85f2cd65adc310011f9Daniel Dunbar    CmdArgs.push_back("-fcolor-diagnostics");
1094838be483dcf10ea3f2acd85f2cd65adc310011f9Daniel Dunbar
109575eb1d64784946a37fc0b27596e2d92b6cf7033bDaniel Dunbar  if (!Args.hasFlag(options::OPT_fshow_source_location,
109675eb1d64784946a37fc0b27596e2d92b6cf7033bDaniel Dunbar                    options::OPT_fno_show_source_location))
109775eb1d64784946a37fc0b27596e2d92b6cf7033bDaniel Dunbar    CmdArgs.push_back("-fno-show-source-location");
10989e820ee054fefe5422b4db3f681e567a8976747eDaniel Dunbar
10997695fba30221613b7cf31276456217c41bb90960Daniel Dunbar  // -fdollars-in-identifiers default varies depending on platform and
11007695fba30221613b7cf31276456217c41bb90960Daniel Dunbar  // language; only pass if specified.
11011eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump  if (Arg *A = Args.getLastArg(options::OPT_fdollars_in_identifiers,
11027695fba30221613b7cf31276456217c41bb90960Daniel Dunbar                               options::OPT_fno_dollars_in_identifiers)) {
11037695fba30221613b7cf31276456217c41bb90960Daniel Dunbar    if (A->getOption().matches(options::OPT_fdollars_in_identifiers))
11048663b180085e9bc7a0a87c80cc3f722efef99e79Daniel Dunbar      CmdArgs.push_back("-fdollars-in-identifiers");
11057695fba30221613b7cf31276456217c41bb90960Daniel Dunbar    else
11068663b180085e9bc7a0a87c80cc3f722efef99e79Daniel Dunbar      CmdArgs.push_back("-fno-dollars-in-identifiers");
11077695fba30221613b7cf31276456217c41bb90960Daniel Dunbar  }
11087695fba30221613b7cf31276456217c41bb90960Daniel Dunbar
1109e027a4b2399e9b0acfe0f77220c66bbe369067eeDaniel Dunbar  // -funit-at-a-time is default, and we don't support -fno-unit-at-a-time for
1110e027a4b2399e9b0acfe0f77220c66bbe369067eeDaniel Dunbar  // practical purposes.
11111eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump  if (Arg *A = Args.getLastArg(options::OPT_funit_at_a_time,
1112e027a4b2399e9b0acfe0f77220c66bbe369067eeDaniel Dunbar                               options::OPT_fno_unit_at_a_time)) {
1113e027a4b2399e9b0acfe0f77220c66bbe369067eeDaniel Dunbar    if (A->getOption().matches(options::OPT_fno_unit_at_a_time))
1114c37691068db5ceb19c014ddd3e02afa9875f8181Edward O'Callaghan      D.Diag(clang::diag::warn_drv_clang_unsupported) << A->getAsString(Args);
1115e027a4b2399e9b0acfe0f77220c66bbe369067eeDaniel Dunbar  }
1116ceb5c5b7f67a30fae305d1d19b478b623e4fbcedEli Friedman
11172ba91575905a54f712a7f64304e56002e4882499Daniel Dunbar  // Default to -fno-builtin-str{cat,cpy} on Darwin for ARM.
1118f84a4a469d8a45c76cb941595582a0fd3b9b15d3Daniel Dunbar  //
11198ff5b28d6efcffe2251e77634c7edf83a4763344Daniel Dunbar  // FIXME: This is disabled until clang -cc1 supports -fno-builtin-foo. PR4941.
1120f84a4a469d8a45c76cb941595582a0fd3b9b15d3Daniel Dunbar#if 0
11212ba91575905a54f712a7f64304e56002e4882499Daniel Dunbar  if (getToolChain().getTriple().getOS() == llvm::Triple::Darwin &&
11222ba91575905a54f712a7f64304e56002e4882499Daniel Dunbar      (getToolChain().getTriple().getArch() == llvm::Triple::arm ||
11232ba91575905a54f712a7f64304e56002e4882499Daniel Dunbar       getToolChain().getTriple().getArch() == llvm::Triple::thumb)) {
11242ba91575905a54f712a7f64304e56002e4882499Daniel Dunbar    if (!Args.hasArg(options::OPT_fbuiltin_strcat))
11252ba91575905a54f712a7f64304e56002e4882499Daniel Dunbar      CmdArgs.push_back("-fno-builtin-strcat");
11262ba91575905a54f712a7f64304e56002e4882499Daniel Dunbar    if (!Args.hasArg(options::OPT_fbuiltin_strcpy))
11272ba91575905a54f712a7f64304e56002e4882499Daniel Dunbar      CmdArgs.push_back("-fno-builtin-strcpy");
11282ba91575905a54f712a7f64304e56002e4882499Daniel Dunbar  }
1129f84a4a469d8a45c76cb941595582a0fd3b9b15d3Daniel Dunbar#endif
11302ba91575905a54f712a7f64304e56002e4882499Daniel Dunbar
11311eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump  if (Arg *A = Args.getLastArg(options::OPT_traditional,
1132ceb5c5b7f67a30fae305d1d19b478b623e4fbcedEli Friedman                               options::OPT_traditional_cpp))
1133ceb5c5b7f67a30fae305d1d19b478b623e4fbcedEli Friedman    D.Diag(clang::diag::err_drv_clang_unsupported) << A->getAsString(Args);
1134ceb5c5b7f67a30fae305d1d19b478b623e4fbcedEli Friedman
11351d46033f760ba5fd266ce59fe391fac473f04f52Daniel Dunbar  Args.AddLastArg(CmdArgs, options::OPT_dM);
1136d82df3ad430397d7f9ef511e7c5157f997c41f53Chris Lattner  Args.AddLastArg(CmdArgs, options::OPT_dD);
11371d46033f760ba5fd266ce59fe391fac473f04f52Daniel Dunbar
11381d46033f760ba5fd266ce59fe391fac473f04f52Daniel Dunbar  Args.AddAllArgValues(CmdArgs, options::OPT_Xclang);
1139e5280286573d4fe1220cdd66e147b572a05536a8Daniel Dunbar  Args.AddAllArgValues(CmdArgs, options::OPT_mllvm);
11401d46033f760ba5fd266ce59fe391fac473f04f52Daniel Dunbar
1141cd8e4c44dd068956e9181381be3ee2d49a0fac52Daniel Dunbar  if (Output.getType() == types::TY_Dependencies) {
1142cd8e4c44dd068956e9181381be3ee2d49a0fac52Daniel Dunbar    // Handled with other dependency code.
1143a5a7bd0de7b6b80212095195a055a4a43f21d4b2Daniel Dunbar  } else if (Output.isPipe()) {
1144b488c1dac8e53206f07103d794a62a3f5012c0f4Daniel Dunbar    CmdArgs.push_back("-o");
1145b488c1dac8e53206f07103d794a62a3f5012c0f4Daniel Dunbar    CmdArgs.push_back("-");
1146115a79277edababaf1b26e3654044ae983197679Daniel Dunbar  } else if (Output.isFilename()) {
1147b488c1dac8e53206f07103d794a62a3f5012c0f4Daniel Dunbar    CmdArgs.push_back("-o");
1148115a79277edababaf1b26e3654044ae983197679Daniel Dunbar    CmdArgs.push_back(Output.getFilename());
1149115a79277edababaf1b26e3654044ae983197679Daniel Dunbar  } else {
1150115a79277edababaf1b26e3654044ae983197679Daniel Dunbar    assert(Output.isNothing() && "Invalid output.");
1151b488c1dac8e53206f07103d794a62a3f5012c0f4Daniel Dunbar  }
1152b488c1dac8e53206f07103d794a62a3f5012c0f4Daniel Dunbar
11531d46033f760ba5fd266ce59fe391fac473f04f52Daniel Dunbar  for (InputInfoList::const_iterator
11541d46033f760ba5fd266ce59fe391fac473f04f52Daniel Dunbar         it = Inputs.begin(), ie = Inputs.end(); it != ie; ++it) {
11551d46033f760ba5fd266ce59fe391fac473f04f52Daniel Dunbar    const InputInfo &II = *it;
11561d46033f760ba5fd266ce59fe391fac473f04f52Daniel Dunbar    CmdArgs.push_back("-x");
11571d46033f760ba5fd266ce59fe391fac473f04f52Daniel Dunbar    CmdArgs.push_back(types::getTypeName(II.getType()));
11581d46033f760ba5fd266ce59fe391fac473f04f52Daniel Dunbar    if (II.isPipe())
11591d46033f760ba5fd266ce59fe391fac473f04f52Daniel Dunbar      CmdArgs.push_back("-");
1160115a79277edababaf1b26e3654044ae983197679Daniel Dunbar    else if (II.isFilename())
1161115a79277edababaf1b26e3654044ae983197679Daniel Dunbar      CmdArgs.push_back(II.getFilename());
11621d46033f760ba5fd266ce59fe391fac473f04f52Daniel Dunbar    else
1163115a79277edababaf1b26e3654044ae983197679Daniel Dunbar      II.getInputArg().renderAsInput(Args, CmdArgs);
11641d46033f760ba5fd266ce59fe391fac473f04f52Daniel Dunbar  }
1165c21c485b4fb58ef5d55cf3e523263dd824a2ace4Daniel Dunbar
1166e6113de52df132b89c3a5a6141f17d37e83322aeChris Lattner  Args.AddAllArgs(CmdArgs, options::OPT_undef);
1167e6113de52df132b89c3a5a6141f17d37e83322aeChris Lattner
1168c21c485b4fb58ef5d55cf3e523263dd824a2ace4Daniel Dunbar  const char *Exec =
11698ff5b28d6efcffe2251e77634c7edf83a4763344Daniel Dunbar    Args.MakeArgString(getToolChain().GetProgramPath(C, "clang"));
1170f2d8b9f967a1ab53ee9fdbcc3ac0a4ee0a83a26eDaniel Dunbar
1171f2d8b9f967a1ab53ee9fdbcc3ac0a4ee0a83a26eDaniel Dunbar  // Optionally embed the -cc1 level arguments into the debug info, for build
1172f2d8b9f967a1ab53ee9fdbcc3ac0a4ee0a83a26eDaniel Dunbar  // analysis.
1173f2d8b9f967a1ab53ee9fdbcc3ac0a4ee0a83a26eDaniel Dunbar  if (getToolChain().UseDwarfDebugFlags()) {
1174f2d8b9f967a1ab53ee9fdbcc3ac0a4ee0a83a26eDaniel Dunbar    llvm::SmallString<256> Flags;
1175f2d8b9f967a1ab53ee9fdbcc3ac0a4ee0a83a26eDaniel Dunbar    Flags += Exec;
1176f2d8b9f967a1ab53ee9fdbcc3ac0a4ee0a83a26eDaniel Dunbar    for (unsigned i = 0, e = CmdArgs.size(); i != e; ++i) {
1177f2d8b9f967a1ab53ee9fdbcc3ac0a4ee0a83a26eDaniel Dunbar      Flags += " ";
1178f2d8b9f967a1ab53ee9fdbcc3ac0a4ee0a83a26eDaniel Dunbar      Flags += CmdArgs[i];
1179f2d8b9f967a1ab53ee9fdbcc3ac0a4ee0a83a26eDaniel Dunbar    }
1180f2d8b9f967a1ab53ee9fdbcc3ac0a4ee0a83a26eDaniel Dunbar    CmdArgs.push_back("-dwarf-debug-flags");
1181f2d8b9f967a1ab53ee9fdbcc3ac0a4ee0a83a26eDaniel Dunbar    CmdArgs.push_back(Args.MakeArgString(Flags.str()));
1182f2d8b9f967a1ab53ee9fdbcc3ac0a4ee0a83a26eDaniel Dunbar  }
1183f2d8b9f967a1ab53ee9fdbcc3ac0a4ee0a83a26eDaniel Dunbar
1184daab7b1016f0a82fefa4f7be6e63c57c06b19ffcDaniel Dunbar  Dest.addCommand(new Command(JA, *this, Exec, CmdArgs));
1185a880db0b0fc028abf754c290d921d809eec0518aDaniel Dunbar
11865c1aaafbd6dd25a99ca1960e1c3c98aeefe9d728Daniel Dunbar  // Explicitly warn that these options are unsupported, even though
11875c1aaafbd6dd25a99ca1960e1c3c98aeefe9d728Daniel Dunbar  // we are allowing compilation to continue.
1188cdd9686b890ebdc10039ae256ef4c9dfb5ebacb7Daniel Dunbar  for (arg_iterator it = Args.filtered_begin(options::OPT_pg),
1189cdd9686b890ebdc10039ae256ef4c9dfb5ebacb7Daniel Dunbar         ie = Args.filtered_end(); it != ie; ++it) {
1190cdd9686b890ebdc10039ae256ef4c9dfb5ebacb7Daniel Dunbar    it->claim();
1191cdd9686b890ebdc10039ae256ef4c9dfb5ebacb7Daniel Dunbar    D.Diag(clang::diag::warn_drv_clang_unsupported) << it->getAsString(Args);
11925c1aaafbd6dd25a99ca1960e1c3c98aeefe9d728Daniel Dunbar  }
11935c1aaafbd6dd25a99ca1960e1c3c98aeefe9d728Daniel Dunbar
119468fb469aeb19144403e703b825854d08353c8eeaDaniel Dunbar  // Claim some arguments which clang supports automatically.
119568fb469aeb19144403e703b825854d08353c8eeaDaniel Dunbar
119668fb469aeb19144403e703b825854d08353c8eeaDaniel Dunbar  // -fpch-preprocess is used with gcc to add a special marker in the
119768fb469aeb19144403e703b825854d08353c8eeaDaniel Dunbar  // -output to include the PCH file. Clang's PTH solution is
119868fb469aeb19144403e703b825854d08353c8eeaDaniel Dunbar  // -completely transparent, so we do not need to deal with it at
119968fb469aeb19144403e703b825854d08353c8eeaDaniel Dunbar  // -all.
120068fb469aeb19144403e703b825854d08353c8eeaDaniel Dunbar  Args.ClaimAllArgs(options::OPT_fpch_preprocess);
1201c21c485b4fb58ef5d55cf3e523263dd824a2ace4Daniel Dunbar
1202a880db0b0fc028abf754c290d921d809eec0518aDaniel Dunbar  // Claim some arguments which clang doesn't support, but we don't
1203a880db0b0fc028abf754c290d921d809eec0518aDaniel Dunbar  // care to warn the user about.
1204cdd9686b890ebdc10039ae256ef4c9dfb5ebacb7Daniel Dunbar  Args.ClaimAllArgs(options::OPT_clang_ignored_f_Group);
1205cdd9686b890ebdc10039ae256ef4c9dfb5ebacb7Daniel Dunbar  Args.ClaimAllArgs(options::OPT_clang_ignored_m_Group);
120647ac7d27c44bd64a7d0fc03d4babc196cf2b8230Daniel Dunbar}
120747ac7d27c44bd64a7d0fc03d4babc196cf2b8230Daniel Dunbar
1208b488c1dac8e53206f07103d794a62a3f5012c0f4Daniel Dunbarvoid gcc::Common::ConstructJob(Compilation &C, const JobAction &JA,
1209b488c1dac8e53206f07103d794a62a3f5012c0f4Daniel Dunbar                               Job &Dest,
1210b488c1dac8e53206f07103d794a62a3f5012c0f4Daniel Dunbar                               const InputInfo &Output,
1211b488c1dac8e53206f07103d794a62a3f5012c0f4Daniel Dunbar                               const InputInfoList &Inputs,
12121d46033f760ba5fd266ce59fe391fac473f04f52Daniel Dunbar                               const ArgList &Args,
1213b488c1dac8e53206f07103d794a62a3f5012c0f4Daniel Dunbar                               const char *LinkingOutput) const {
1214ee788e70fcd0adf76103b17c78ac658d4ea30c9bDaniel Dunbar  const Driver &D = getToolChain().getDriver();
1215b488c1dac8e53206f07103d794a62a3f5012c0f4Daniel Dunbar  ArgStringList CmdArgs;
1216b488c1dac8e53206f07103d794a62a3f5012c0f4Daniel Dunbar
1217c21c485b4fb58ef5d55cf3e523263dd824a2ace4Daniel Dunbar  for (ArgList::const_iterator
12181d46033f760ba5fd266ce59fe391fac473f04f52Daniel Dunbar         it = Args.begin(), ie = Args.end(); it != ie; ++it) {
1219b488c1dac8e53206f07103d794a62a3f5012c0f4Daniel Dunbar    Arg *A = *it;
12207587719c40ebf02bf11e5e66c30bd20e98edebc2Daniel Dunbar    if (A->getOption().hasForwardToGCC()) {
12217587719c40ebf02bf11e5e66c30bd20e98edebc2Daniel Dunbar      // It is unfortunate that we have to claim here, as this means
12227587719c40ebf02bf11e5e66c30bd20e98edebc2Daniel Dunbar      // we will basically never report anything interesting for
12236ecc7a993f939c5255c36c7c0d965fb9c1543f2aDaniel Dunbar      // platforms using a generic gcc, even if we are just using gcc
12246ecc7a993f939c5255c36c7c0d965fb9c1543f2aDaniel Dunbar      // to get to the assembler.
12257587719c40ebf02bf11e5e66c30bd20e98edebc2Daniel Dunbar      A->claim();
12261d46033f760ba5fd266ce59fe391fac473f04f52Daniel Dunbar      A->render(Args, CmdArgs);
12277587719c40ebf02bf11e5e66c30bd20e98edebc2Daniel Dunbar    }
1228b488c1dac8e53206f07103d794a62a3f5012c0f4Daniel Dunbar  }
1229c21c485b4fb58ef5d55cf3e523263dd824a2ace4Daniel Dunbar
123082b51cce8cea6b6bb6175c406c2ab425c91d9dc8Daniel Dunbar  RenderExtraToolArgs(JA, CmdArgs);
1231b488c1dac8e53206f07103d794a62a3f5012c0f4Daniel Dunbar
1232b488c1dac8e53206f07103d794a62a3f5012c0f4Daniel Dunbar  // If using a driver driver, force the arch.
12337cfe31a713d8fcfc2a1328e8fbd8efdeb0aec51bDaniel Dunbar  const std::string &Arch = getToolChain().getArchName();
12341bda434673d3c51a2ba6b412f100ccfcf3e7083fDaniel Dunbar  if (getToolChain().getTriple().getOS() == llvm::Triple::Darwin) {
1235b488c1dac8e53206f07103d794a62a3f5012c0f4Daniel Dunbar    CmdArgs.push_back("-arch");
1236bf54a06f9b771c2a2730cc63eb89bce0522515b5Daniel Dunbar
1237bf54a06f9b771c2a2730cc63eb89bce0522515b5Daniel Dunbar    // FIXME: Remove these special cases.
12387cfe31a713d8fcfc2a1328e8fbd8efdeb0aec51bDaniel Dunbar    if (Arch == "powerpc")
12397cfe31a713d8fcfc2a1328e8fbd8efdeb0aec51bDaniel Dunbar      CmdArgs.push_back("ppc");
12407cfe31a713d8fcfc2a1328e8fbd8efdeb0aec51bDaniel Dunbar    else if (Arch == "powerpc64")
12417cfe31a713d8fcfc2a1328e8fbd8efdeb0aec51bDaniel Dunbar      CmdArgs.push_back("ppc64");
12427cfe31a713d8fcfc2a1328e8fbd8efdeb0aec51bDaniel Dunbar    else
1243881376467c46c5c6cc16fa6790271c2c22e1d4f1Daniel Dunbar      CmdArgs.push_back(Args.MakeArgString(Arch));
1244b488c1dac8e53206f07103d794a62a3f5012c0f4Daniel Dunbar  }
1245b488c1dac8e53206f07103d794a62a3f5012c0f4Daniel Dunbar
12466ecc7a993f939c5255c36c7c0d965fb9c1543f2aDaniel Dunbar  // Try to force gcc to match the tool chain we want, if we recognize
12476ecc7a993f939c5255c36c7c0d965fb9c1543f2aDaniel Dunbar  // the arch.
12487cfe31a713d8fcfc2a1328e8fbd8efdeb0aec51bDaniel Dunbar  //
12497cfe31a713d8fcfc2a1328e8fbd8efdeb0aec51bDaniel Dunbar  // FIXME: The triple class should directly provide the information we want
12507cfe31a713d8fcfc2a1328e8fbd8efdeb0aec51bDaniel Dunbar  // here.
12517cfe31a713d8fcfc2a1328e8fbd8efdeb0aec51bDaniel Dunbar  if (Arch == "i386" || Arch == "powerpc")
12526ecc7a993f939c5255c36c7c0d965fb9c1543f2aDaniel Dunbar    CmdArgs.push_back("-m32");
12537cfe31a713d8fcfc2a1328e8fbd8efdeb0aec51bDaniel Dunbar  else if (Arch == "x86_64" || Arch == "powerpc64")
12546ecc7a993f939c5255c36c7c0d965fb9c1543f2aDaniel Dunbar    CmdArgs.push_back("-m64");
12556ecc7a993f939c5255c36c7c0d965fb9c1543f2aDaniel Dunbar
1256b488c1dac8e53206f07103d794a62a3f5012c0f4Daniel Dunbar  if (Output.isPipe()) {
1257b488c1dac8e53206f07103d794a62a3f5012c0f4Daniel Dunbar    CmdArgs.push_back("-o");
1258b488c1dac8e53206f07103d794a62a3f5012c0f4Daniel Dunbar    CmdArgs.push_back("-");
1259115a79277edababaf1b26e3654044ae983197679Daniel Dunbar  } else if (Output.isFilename()) {
1260b488c1dac8e53206f07103d794a62a3f5012c0f4Daniel Dunbar    CmdArgs.push_back("-o");
1261115a79277edababaf1b26e3654044ae983197679Daniel Dunbar    CmdArgs.push_back(Output.getFilename());
1262115a79277edababaf1b26e3654044ae983197679Daniel Dunbar  } else {
1263115a79277edababaf1b26e3654044ae983197679Daniel Dunbar    assert(Output.isNothing() && "Unexpected output");
1264b488c1dac8e53206f07103d794a62a3f5012c0f4Daniel Dunbar    CmdArgs.push_back("-fsyntax-only");
1265115a79277edababaf1b26e3654044ae983197679Daniel Dunbar  }
1266b488c1dac8e53206f07103d794a62a3f5012c0f4Daniel Dunbar
1267b488c1dac8e53206f07103d794a62a3f5012c0f4Daniel Dunbar
1268b488c1dac8e53206f07103d794a62a3f5012c0f4Daniel Dunbar  // Only pass -x if gcc will understand it; otherwise hope gcc
1269b488c1dac8e53206f07103d794a62a3f5012c0f4Daniel Dunbar  // understands the suffix correctly. The main use case this would go
1270b488c1dac8e53206f07103d794a62a3f5012c0f4Daniel Dunbar  // wrong in is for linker inputs if they happened to have an odd
1271b488c1dac8e53206f07103d794a62a3f5012c0f4Daniel Dunbar  // suffix; really the only way to get this to happen is a command
1272b488c1dac8e53206f07103d794a62a3f5012c0f4Daniel Dunbar  // like '-x foobar a.c' which will treat a.c like a linker input.
1273b488c1dac8e53206f07103d794a62a3f5012c0f4Daniel Dunbar  //
1274b488c1dac8e53206f07103d794a62a3f5012c0f4Daniel Dunbar  // FIXME: For the linker case specifically, can we safely convert
1275b488c1dac8e53206f07103d794a62a3f5012c0f4Daniel Dunbar  // inputs into '-Wl,' options?
1276b488c1dac8e53206f07103d794a62a3f5012c0f4Daniel Dunbar  for (InputInfoList::const_iterator
1277b488c1dac8e53206f07103d794a62a3f5012c0f4Daniel Dunbar         it = Inputs.begin(), ie = Inputs.end(); it != ie; ++it) {
1278b488c1dac8e53206f07103d794a62a3f5012c0f4Daniel Dunbar    const InputInfo &II = *it;
1279a8304f67291b0182fb64f3afc621615288dd1d31Daniel Dunbar
12805915fbf310e171c4cd3c2af05e9de360c0fa988aDaniel Dunbar    // Don't try to pass LLVM or AST inputs to a generic gcc.
1281a8304f67291b0182fb64f3afc621615288dd1d31Daniel Dunbar    if (II.getType() == types::TY_LLVMBC)
1282a8304f67291b0182fb64f3afc621615288dd1d31Daniel Dunbar      D.Diag(clang::diag::err_drv_no_linker_llvm_support)
1283881376467c46c5c6cc16fa6790271c2c22e1d4f1Daniel Dunbar        << getToolChain().getTripleString();
12845915fbf310e171c4cd3c2af05e9de360c0fa988aDaniel Dunbar    else if (II.getType() == types::TY_AST)
12855915fbf310e171c4cd3c2af05e9de360c0fa988aDaniel Dunbar      D.Diag(clang::diag::err_drv_no_ast_support)
1286881376467c46c5c6cc16fa6790271c2c22e1d4f1Daniel Dunbar        << getToolChain().getTripleString();
1287a8304f67291b0182fb64f3afc621615288dd1d31Daniel Dunbar
1288b488c1dac8e53206f07103d794a62a3f5012c0f4Daniel Dunbar    if (types::canTypeBeUserSpecified(II.getType())) {
1289b488c1dac8e53206f07103d794a62a3f5012c0f4Daniel Dunbar      CmdArgs.push_back("-x");
1290b488c1dac8e53206f07103d794a62a3f5012c0f4Daniel Dunbar      CmdArgs.push_back(types::getTypeName(II.getType()));
1291b488c1dac8e53206f07103d794a62a3f5012c0f4Daniel Dunbar    }
1292b488c1dac8e53206f07103d794a62a3f5012c0f4Daniel Dunbar
1293b488c1dac8e53206f07103d794a62a3f5012c0f4Daniel Dunbar    if (II.isPipe())
1294b488c1dac8e53206f07103d794a62a3f5012c0f4Daniel Dunbar      CmdArgs.push_back("-");
1295115a79277edababaf1b26e3654044ae983197679Daniel Dunbar    else if (II.isFilename())
1296115a79277edababaf1b26e3654044ae983197679Daniel Dunbar      CmdArgs.push_back(II.getFilename());
1297b488c1dac8e53206f07103d794a62a3f5012c0f4Daniel Dunbar    else
1298115a79277edababaf1b26e3654044ae983197679Daniel Dunbar      // Don't render as input, we need gcc to do the translations.
1299115a79277edababaf1b26e3654044ae983197679Daniel Dunbar      II.getInputArg().render(Args, CmdArgs);
1300b488c1dac8e53206f07103d794a62a3f5012c0f4Daniel Dunbar  }
1301b488c1dac8e53206f07103d794a62a3f5012c0f4Daniel Dunbar
1302ee788e70fcd0adf76103b17c78ac658d4ea30c9bDaniel Dunbar  const char *GCCName = getToolChain().getDriver().CCCGenericGCCName.c_str();
1303c21c485b4fb58ef5d55cf3e523263dd824a2ace4Daniel Dunbar  const char *Exec =
13045ed34f4c58b6ad4e21038d713c1fae31a6146ff5Daniel Dunbar    Args.MakeArgString(getToolChain().GetProgramPath(C, GCCName));
1305daab7b1016f0a82fefa4f7be6e63c57c06b19ffcDaniel Dunbar  Dest.addCommand(new Command(JA, *this, Exec, CmdArgs));
130647ac7d27c44bd64a7d0fc03d4babc196cf2b8230Daniel Dunbar}
130747ac7d27c44bd64a7d0fc03d4babc196cf2b8230Daniel Dunbar
130882b51cce8cea6b6bb6175c406c2ab425c91d9dc8Daniel Dunbarvoid gcc::Preprocess::RenderExtraToolArgs(const JobAction &JA,
130982b51cce8cea6b6bb6175c406c2ab425c91d9dc8Daniel Dunbar                                          ArgStringList &CmdArgs) const {
1310b488c1dac8e53206f07103d794a62a3f5012c0f4Daniel Dunbar  CmdArgs.push_back("-E");
131147ac7d27c44bd64a7d0fc03d4babc196cf2b8230Daniel Dunbar}
131247ac7d27c44bd64a7d0fc03d4babc196cf2b8230Daniel Dunbar
131382b51cce8cea6b6bb6175c406c2ab425c91d9dc8Daniel Dunbarvoid gcc::Precompile::RenderExtraToolArgs(const JobAction &JA,
131482b51cce8cea6b6bb6175c406c2ab425c91d9dc8Daniel Dunbar                                          ArgStringList &CmdArgs) const {
1315b488c1dac8e53206f07103d794a62a3f5012c0f4Daniel Dunbar  // The type is good enough.
131647ac7d27c44bd64a7d0fc03d4babc196cf2b8230Daniel Dunbar}
131747ac7d27c44bd64a7d0fc03d4babc196cf2b8230Daniel Dunbar
131882b51cce8cea6b6bb6175c406c2ab425c91d9dc8Daniel Dunbarvoid gcc::Compile::RenderExtraToolArgs(const JobAction &JA,
131982b51cce8cea6b6bb6175c406c2ab425c91d9dc8Daniel Dunbar                                       ArgStringList &CmdArgs) const {
132082b51cce8cea6b6bb6175c406c2ab425c91d9dc8Daniel Dunbar  // If -flto, etc. are present then make sure not to force assembly output.
132182b51cce8cea6b6bb6175c406c2ab425c91d9dc8Daniel Dunbar  if (JA.getType() == types::TY_LLVMBC)
132282b51cce8cea6b6bb6175c406c2ab425c91d9dc8Daniel Dunbar    CmdArgs.push_back("-c");
132382b51cce8cea6b6bb6175c406c2ab425c91d9dc8Daniel Dunbar  else
132482b51cce8cea6b6bb6175c406c2ab425c91d9dc8Daniel Dunbar    CmdArgs.push_back("-S");
132547ac7d27c44bd64a7d0fc03d4babc196cf2b8230Daniel Dunbar}
132647ac7d27c44bd64a7d0fc03d4babc196cf2b8230Daniel Dunbar
132782b51cce8cea6b6bb6175c406c2ab425c91d9dc8Daniel Dunbarvoid gcc::Assemble::RenderExtraToolArgs(const JobAction &JA,
132882b51cce8cea6b6bb6175c406c2ab425c91d9dc8Daniel Dunbar                                        ArgStringList &CmdArgs) const {
1329b488c1dac8e53206f07103d794a62a3f5012c0f4Daniel Dunbar  CmdArgs.push_back("-c");
1330b488c1dac8e53206f07103d794a62a3f5012c0f4Daniel Dunbar}
133147ac7d27c44bd64a7d0fc03d4babc196cf2b8230Daniel Dunbar
133282b51cce8cea6b6bb6175c406c2ab425c91d9dc8Daniel Dunbarvoid gcc::Link::RenderExtraToolArgs(const JobAction &JA,
133382b51cce8cea6b6bb6175c406c2ab425c91d9dc8Daniel Dunbar                                    ArgStringList &CmdArgs) const {
1334b488c1dac8e53206f07103d794a62a3f5012c0f4Daniel Dunbar  // The types are (hopefully) good enough.
133547ac7d27c44bd64a7d0fc03d4babc196cf2b8230Daniel Dunbar}
1336b488c1dac8e53206f07103d794a62a3f5012c0f4Daniel Dunbar
133740f1265ebd42ece3e7f7917319b56012e8e2bce2Daniel Dunbarconst char *darwin::CC1::getCC1Name(types::ID Type) const {
133840f1265ebd42ece3e7f7917319b56012e8e2bce2Daniel Dunbar  switch (Type) {
133940f1265ebd42ece3e7f7917319b56012e8e2bce2Daniel Dunbar  default:
134040f1265ebd42ece3e7f7917319b56012e8e2bce2Daniel Dunbar    assert(0 && "Unexpected type for Darwin CC1 tool.");
134140f1265ebd42ece3e7f7917319b56012e8e2bce2Daniel Dunbar  case types::TY_Asm:
134240f1265ebd42ece3e7f7917319b56012e8e2bce2Daniel Dunbar  case types::TY_C: case types::TY_CHeader:
134340f1265ebd42ece3e7f7917319b56012e8e2bce2Daniel Dunbar  case types::TY_PP_C: case types::TY_PP_CHeader:
134440f1265ebd42ece3e7f7917319b56012e8e2bce2Daniel Dunbar    return "cc1";
134540f1265ebd42ece3e7f7917319b56012e8e2bce2Daniel Dunbar  case types::TY_ObjC: case types::TY_ObjCHeader:
134640f1265ebd42ece3e7f7917319b56012e8e2bce2Daniel Dunbar  case types::TY_PP_ObjC: case types::TY_PP_ObjCHeader:
134740f1265ebd42ece3e7f7917319b56012e8e2bce2Daniel Dunbar    return "cc1obj";
134840f1265ebd42ece3e7f7917319b56012e8e2bce2Daniel Dunbar  case types::TY_CXX: case types::TY_CXXHeader:
134940f1265ebd42ece3e7f7917319b56012e8e2bce2Daniel Dunbar  case types::TY_PP_CXX: case types::TY_PP_CXXHeader:
135040f1265ebd42ece3e7f7917319b56012e8e2bce2Daniel Dunbar    return "cc1plus";
135140f1265ebd42ece3e7f7917319b56012e8e2bce2Daniel Dunbar  case types::TY_ObjCXX: case types::TY_ObjCXXHeader:
135240f1265ebd42ece3e7f7917319b56012e8e2bce2Daniel Dunbar  case types::TY_PP_ObjCXX: case types::TY_PP_ObjCXXHeader:
135340f1265ebd42ece3e7f7917319b56012e8e2bce2Daniel Dunbar    return "cc1objplus";
135440f1265ebd42ece3e7f7917319b56012e8e2bce2Daniel Dunbar  }
135540f1265ebd42ece3e7f7917319b56012e8e2bce2Daniel Dunbar}
135640f1265ebd42ece3e7f7917319b56012e8e2bce2Daniel Dunbar
1357c21c485b4fb58ef5d55cf3e523263dd824a2ace4Daniel Dunbarconst char *darwin::CC1::getBaseInputName(const ArgList &Args,
1358a5a7bd0de7b6b80212095195a055a4a43f21d4b2Daniel Dunbar                                          const InputInfoList &Inputs) {
1359a3ec60e0cf2a1916f479288998d31bd980b1a306Daniel Dunbar  llvm::sys::Path P(Inputs[0].getBaseInput());
1360881376467c46c5c6cc16fa6790271c2c22e1d4f1Daniel Dunbar  return Args.MakeArgString(P.getLast());
1361a3ec60e0cf2a1916f479288998d31bd980b1a306Daniel Dunbar}
1362a3ec60e0cf2a1916f479288998d31bd980b1a306Daniel Dunbar
1363c21c485b4fb58ef5d55cf3e523263dd824a2ace4Daniel Dunbarconst char *darwin::CC1::getBaseInputStem(const ArgList &Args,
1364a5a7bd0de7b6b80212095195a055a4a43f21d4b2Daniel Dunbar                                          const InputInfoList &Inputs) {
1365a3ec60e0cf2a1916f479288998d31bd980b1a306Daniel Dunbar  const char *Str = getBaseInputName(Args, Inputs);
1366a3ec60e0cf2a1916f479288998d31bd980b1a306Daniel Dunbar
1367a3ec60e0cf2a1916f479288998d31bd980b1a306Daniel Dunbar  if (const char *End = strchr(Str, '.'))
1368881376467c46c5c6cc16fa6790271c2c22e1d4f1Daniel Dunbar    return Args.MakeArgString(std::string(Str, End));
1369a3ec60e0cf2a1916f479288998d31bd980b1a306Daniel Dunbar
1370a3ec60e0cf2a1916f479288998d31bd980b1a306Daniel Dunbar  return Str;
1371a3ec60e0cf2a1916f479288998d31bd980b1a306Daniel Dunbar}
1372a3ec60e0cf2a1916f479288998d31bd980b1a306Daniel Dunbar
1373a3ec60e0cf2a1916f479288998d31bd980b1a306Daniel Dunbarconst char *
1374c21c485b4fb58ef5d55cf3e523263dd824a2ace4Daniel Dunbardarwin::CC1::getDependencyFileName(const ArgList &Args,
1375a5a7bd0de7b6b80212095195a055a4a43f21d4b2Daniel Dunbar                                   const InputInfoList &Inputs) {
1376a3ec60e0cf2a1916f479288998d31bd980b1a306Daniel Dunbar  // FIXME: Think about this more.
1377a3ec60e0cf2a1916f479288998d31bd980b1a306Daniel Dunbar  std::string Res;
1378a3ec60e0cf2a1916f479288998d31bd980b1a306Daniel Dunbar
1379a3ec60e0cf2a1916f479288998d31bd980b1a306Daniel Dunbar  if (Arg *OutputOpt = Args.getLastArg(options::OPT_o)) {
1380a3ec60e0cf2a1916f479288998d31bd980b1a306Daniel Dunbar    std::string Str(OutputOpt->getValue(Args));
1381c21c485b4fb58ef5d55cf3e523263dd824a2ace4Daniel Dunbar
1382a3ec60e0cf2a1916f479288998d31bd980b1a306Daniel Dunbar    Res = Str.substr(0, Str.rfind('.'));
1383a3ec60e0cf2a1916f479288998d31bd980b1a306Daniel Dunbar  } else
1384a5a7bd0de7b6b80212095195a055a4a43f21d4b2Daniel Dunbar    Res = darwin::CC1::getBaseInputStem(Args, Inputs);
1385a3ec60e0cf2a1916f479288998d31bd980b1a306Daniel Dunbar
1386881376467c46c5c6cc16fa6790271c2c22e1d4f1Daniel Dunbar  return Args.MakeArgString(Res + ".d");
1387a3ec60e0cf2a1916f479288998d31bd980b1a306Daniel Dunbar}
1388a3ec60e0cf2a1916f479288998d31bd980b1a306Daniel Dunbar
1389c21c485b4fb58ef5d55cf3e523263dd824a2ace4Daniel Dunbarvoid darwin::CC1::AddCC1Args(const ArgList &Args,
1390a3ec60e0cf2a1916f479288998d31bd980b1a306Daniel Dunbar                             ArgStringList &CmdArgs) const {
1391ee788e70fcd0adf76103b17c78ac658d4ea30c9bDaniel Dunbar  const Driver &D = getToolChain().getDriver();
1392e2fd66418eca3d70cf6b62087d745d0c5181db69Daniel Dunbar
1393e2fd66418eca3d70cf6b62087d745d0c5181db69Daniel Dunbar  CheckCodeGenerationOptions(D, Args);
1394e2fd66418eca3d70cf6b62087d745d0c5181db69Daniel Dunbar
1395a3ec60e0cf2a1916f479288998d31bd980b1a306Daniel Dunbar  // Derived from cc1 spec.
1396a3ec60e0cf2a1916f479288998d31bd980b1a306Daniel Dunbar  if (!Args.hasArg(options::OPT_mkernel) && !Args.hasArg(options::OPT_static) &&
1397a3ec60e0cf2a1916f479288998d31bd980b1a306Daniel Dunbar      !Args.hasArg(options::OPT_mdynamic_no_pic))
1398a3ec60e0cf2a1916f479288998d31bd980b1a306Daniel Dunbar    CmdArgs.push_back("-fPIC");
1399a3ec60e0cf2a1916f479288998d31bd980b1a306Daniel Dunbar
14002ba91575905a54f712a7f64304e56002e4882499Daniel Dunbar  if (getToolChain().getTriple().getArch() == llvm::Triple::arm ||
14012ba91575905a54f712a7f64304e56002e4882499Daniel Dunbar      getToolChain().getTriple().getArch() == llvm::Triple::thumb) {
14022ba91575905a54f712a7f64304e56002e4882499Daniel Dunbar    if (!Args.hasArg(options::OPT_fbuiltin_strcat))
14032ba91575905a54f712a7f64304e56002e4882499Daniel Dunbar      CmdArgs.push_back("-fno-builtin-strcat");
14042ba91575905a54f712a7f64304e56002e4882499Daniel Dunbar    if (!Args.hasArg(options::OPT_fbuiltin_strcpy))
14052ba91575905a54f712a7f64304e56002e4882499Daniel Dunbar      CmdArgs.push_back("-fno-builtin-strcpy");
14062ba91575905a54f712a7f64304e56002e4882499Daniel Dunbar  }
14072ba91575905a54f712a7f64304e56002e4882499Daniel Dunbar
1408a3ec60e0cf2a1916f479288998d31bd980b1a306Daniel Dunbar  // gcc has some code here to deal with when no -mmacosx-version-min
1409a3ec60e0cf2a1916f479288998d31bd980b1a306Daniel Dunbar  // and no -miphoneos-version-min is present, but this never happens
1410a3ec60e0cf2a1916f479288998d31bd980b1a306Daniel Dunbar  // due to tool chain specific argument translation.
1411a3ec60e0cf2a1916f479288998d31bd980b1a306Daniel Dunbar
1412a3ec60e0cf2a1916f479288998d31bd980b1a306Daniel Dunbar  if (Args.hasArg(options::OPT_g_Flag) &&
1413a3ec60e0cf2a1916f479288998d31bd980b1a306Daniel Dunbar      !Args.hasArg(options::OPT_fno_eliminate_unused_debug_symbols))
1414a3ec60e0cf2a1916f479288998d31bd980b1a306Daniel Dunbar    CmdArgs.push_back("-feliminate-unused-debug-symbols");
1415a3ec60e0cf2a1916f479288998d31bd980b1a306Daniel Dunbar}
1416a3ec60e0cf2a1916f479288998d31bd980b1a306Daniel Dunbar
1417a3ec60e0cf2a1916f479288998d31bd980b1a306Daniel Dunbarvoid darwin::CC1::AddCC1OptionsArgs(const ArgList &Args, ArgStringList &CmdArgs,
1418a3ec60e0cf2a1916f479288998d31bd980b1a306Daniel Dunbar                                    const InputInfoList &Inputs,
1419a3ec60e0cf2a1916f479288998d31bd980b1a306Daniel Dunbar                                    const ArgStringList &OutputArgs) const {
1420ee788e70fcd0adf76103b17c78ac658d4ea30c9bDaniel Dunbar  const Driver &D = getToolChain().getDriver();
1421a3ec60e0cf2a1916f479288998d31bd980b1a306Daniel Dunbar
1422a3ec60e0cf2a1916f479288998d31bd980b1a306Daniel Dunbar  // Derived from cc1_options spec.
1423a3ec60e0cf2a1916f479288998d31bd980b1a306Daniel Dunbar  if (Args.hasArg(options::OPT_fast) ||
1424a3ec60e0cf2a1916f479288998d31bd980b1a306Daniel Dunbar      Args.hasArg(options::OPT_fastf) ||
1425a3ec60e0cf2a1916f479288998d31bd980b1a306Daniel Dunbar      Args.hasArg(options::OPT_fastcp))
1426a3ec60e0cf2a1916f479288998d31bd980b1a306Daniel Dunbar    CmdArgs.push_back("-O3");
1427c21c485b4fb58ef5d55cf3e523263dd824a2ace4Daniel Dunbar
1428a3ec60e0cf2a1916f479288998d31bd980b1a306Daniel Dunbar  if (Arg *A = Args.getLastArg(options::OPT_pg))
1429a3ec60e0cf2a1916f479288998d31bd980b1a306Daniel Dunbar    if (Args.hasArg(options::OPT_fomit_frame_pointer))
1430a3ec60e0cf2a1916f479288998d31bd980b1a306Daniel Dunbar      D.Diag(clang::diag::err_drv_argument_not_allowed_with)
1431a3ec60e0cf2a1916f479288998d31bd980b1a306Daniel Dunbar        << A->getAsString(Args) << "-fomit-frame-pointer";
1432a3ec60e0cf2a1916f479288998d31bd980b1a306Daniel Dunbar
1433a3ec60e0cf2a1916f479288998d31bd980b1a306Daniel Dunbar  AddCC1Args(Args, CmdArgs);
1434a3ec60e0cf2a1916f479288998d31bd980b1a306Daniel Dunbar
1435a3ec60e0cf2a1916f479288998d31bd980b1a306Daniel Dunbar  if (!Args.hasArg(options::OPT_Q))
1436a3ec60e0cf2a1916f479288998d31bd980b1a306Daniel Dunbar    CmdArgs.push_back("-quiet");
1437a3ec60e0cf2a1916f479288998d31bd980b1a306Daniel Dunbar
1438a3ec60e0cf2a1916f479288998d31bd980b1a306Daniel Dunbar  CmdArgs.push_back("-dumpbase");
1439a5a7bd0de7b6b80212095195a055a4a43f21d4b2Daniel Dunbar  CmdArgs.push_back(darwin::CC1::getBaseInputName(Args, Inputs));
1440a3ec60e0cf2a1916f479288998d31bd980b1a306Daniel Dunbar
1441a3ec60e0cf2a1916f479288998d31bd980b1a306Daniel Dunbar  Args.AddAllArgs(CmdArgs, options::OPT_d_Group);
1442a3ec60e0cf2a1916f479288998d31bd980b1a306Daniel Dunbar
1443a3ec60e0cf2a1916f479288998d31bd980b1a306Daniel Dunbar  Args.AddAllArgs(CmdArgs, options::OPT_m_Group);
1444a3ec60e0cf2a1916f479288998d31bd980b1a306Daniel Dunbar  Args.AddAllArgs(CmdArgs, options::OPT_a_Group);
1445a3ec60e0cf2a1916f479288998d31bd980b1a306Daniel Dunbar
1446a3ec60e0cf2a1916f479288998d31bd980b1a306Daniel Dunbar  // FIXME: The goal is to use the user provided -o if that is our
1447a3ec60e0cf2a1916f479288998d31bd980b1a306Daniel Dunbar  // final output, otherwise to drive from the original input
1448a3ec60e0cf2a1916f479288998d31bd980b1a306Daniel Dunbar  // name. Find a clean way to go about this.
1449a3ec60e0cf2a1916f479288998d31bd980b1a306Daniel Dunbar  if ((Args.hasArg(options::OPT_c) || Args.hasArg(options::OPT_S)) &&
1450a3ec60e0cf2a1916f479288998d31bd980b1a306Daniel Dunbar      Args.hasArg(options::OPT_o)) {
1451a3ec60e0cf2a1916f479288998d31bd980b1a306Daniel Dunbar    Arg *OutputOpt = Args.getLastArg(options::OPT_o);
1452a3ec60e0cf2a1916f479288998d31bd980b1a306Daniel Dunbar    CmdArgs.push_back("-auxbase-strip");
1453a3ec60e0cf2a1916f479288998d31bd980b1a306Daniel Dunbar    CmdArgs.push_back(OutputOpt->getValue(Args));
1454a3ec60e0cf2a1916f479288998d31bd980b1a306Daniel Dunbar  } else {
1455a3ec60e0cf2a1916f479288998d31bd980b1a306Daniel Dunbar    CmdArgs.push_back("-auxbase");
1456a5a7bd0de7b6b80212095195a055a4a43f21d4b2Daniel Dunbar    CmdArgs.push_back(darwin::CC1::getBaseInputStem(Args, Inputs));
1457a3ec60e0cf2a1916f479288998d31bd980b1a306Daniel Dunbar  }
1458a3ec60e0cf2a1916f479288998d31bd980b1a306Daniel Dunbar
1459a3ec60e0cf2a1916f479288998d31bd980b1a306Daniel Dunbar  Args.AddAllArgs(CmdArgs, options::OPT_g_Group);
1460a3ec60e0cf2a1916f479288998d31bd980b1a306Daniel Dunbar
1461a3ec60e0cf2a1916f479288998d31bd980b1a306Daniel Dunbar  Args.AddAllArgs(CmdArgs, options::OPT_O);
1462a3ec60e0cf2a1916f479288998d31bd980b1a306Daniel Dunbar  // FIXME: -Wall is getting some special treatment. Investigate.
1463a3ec60e0cf2a1916f479288998d31bd980b1a306Daniel Dunbar  Args.AddAllArgs(CmdArgs, options::OPT_W_Group, options::OPT_pedantic_Group);
1464a3ec60e0cf2a1916f479288998d31bd980b1a306Daniel Dunbar  Args.AddLastArg(CmdArgs, options::OPT_w);
1465c21c485b4fb58ef5d55cf3e523263dd824a2ace4Daniel Dunbar  Args.AddAllArgs(CmdArgs, options::OPT_std_EQ, options::OPT_ansi,
1466a3ec60e0cf2a1916f479288998d31bd980b1a306Daniel Dunbar                  options::OPT_trigraphs);
1467a3ff202ee4fb21728e930d5d029ba4925129912cDaniel Dunbar  if (!Args.getLastArg(options::OPT_std_EQ, options::OPT_ansi)) {
1468a3ff202ee4fb21728e930d5d029ba4925129912cDaniel Dunbar    // Honor -std-default.
1469a3ff202ee4fb21728e930d5d029ba4925129912cDaniel Dunbar    Args.AddAllArgsTranslated(CmdArgs, options::OPT_std_default_EQ,
1470a3ff202ee4fb21728e930d5d029ba4925129912cDaniel Dunbar                              "-std=", /*Joined=*/true);
1471a3ff202ee4fb21728e930d5d029ba4925129912cDaniel Dunbar  }
1472a3ff202ee4fb21728e930d5d029ba4925129912cDaniel Dunbar
1473a3ec60e0cf2a1916f479288998d31bd980b1a306Daniel Dunbar  if (Args.hasArg(options::OPT_v))
1474a3ec60e0cf2a1916f479288998d31bd980b1a306Daniel Dunbar    CmdArgs.push_back("-version");
1475a3ec60e0cf2a1916f479288998d31bd980b1a306Daniel Dunbar  if (Args.hasArg(options::OPT_pg))
1476a3ec60e0cf2a1916f479288998d31bd980b1a306Daniel Dunbar    CmdArgs.push_back("-p");
1477a3ec60e0cf2a1916f479288998d31bd980b1a306Daniel Dunbar  Args.AddLastArg(CmdArgs, options::OPT_p);
1478c21c485b4fb58ef5d55cf3e523263dd824a2ace4Daniel Dunbar
1479a3ec60e0cf2a1916f479288998d31bd980b1a306Daniel Dunbar  // The driver treats -fsyntax-only specially.
14802ba91575905a54f712a7f64304e56002e4882499Daniel Dunbar  if (getToolChain().getTriple().getArch() == llvm::Triple::arm ||
14812ba91575905a54f712a7f64304e56002e4882499Daniel Dunbar      getToolChain().getTriple().getArch() == llvm::Triple::thumb) {
14822ba91575905a54f712a7f64304e56002e4882499Daniel Dunbar    // Removes -fbuiltin-str{cat,cpy}; these aren't recognized by cc1 but are
14832ba91575905a54f712a7f64304e56002e4882499Daniel Dunbar    // used to inhibit the default -fno-builtin-str{cat,cpy}.
14842ba91575905a54f712a7f64304e56002e4882499Daniel Dunbar    //
14852ba91575905a54f712a7f64304e56002e4882499Daniel Dunbar    // FIXME: Should we grow a better way to deal with "removing" args?
1486cdd9686b890ebdc10039ae256ef4c9dfb5ebacb7Daniel Dunbar    for (arg_iterator it = Args.filtered_begin(options::OPT_f_Group,
1487cdd9686b890ebdc10039ae256ef4c9dfb5ebacb7Daniel Dunbar                                               options::OPT_fsyntax_only),
1488cdd9686b890ebdc10039ae256ef4c9dfb5ebacb7Daniel Dunbar           ie = Args.filtered_end(); it != ie; ++it) {
1489cdd9686b890ebdc10039ae256ef4c9dfb5ebacb7Daniel Dunbar      if (!it->getOption().matches(options::OPT_fbuiltin_strcat) &&
1490cdd9686b890ebdc10039ae256ef4c9dfb5ebacb7Daniel Dunbar          !it->getOption().matches(options::OPT_fbuiltin_strcpy)) {
1491cdd9686b890ebdc10039ae256ef4c9dfb5ebacb7Daniel Dunbar        it->claim();
1492cdd9686b890ebdc10039ae256ef4c9dfb5ebacb7Daniel Dunbar        it->render(Args, CmdArgs);
14932ba91575905a54f712a7f64304e56002e4882499Daniel Dunbar      }
14942ba91575905a54f712a7f64304e56002e4882499Daniel Dunbar    }
14952ba91575905a54f712a7f64304e56002e4882499Daniel Dunbar  } else
14962ba91575905a54f712a7f64304e56002e4882499Daniel Dunbar    Args.AddAllArgs(CmdArgs, options::OPT_f_Group, options::OPT_fsyntax_only);
1497c21c485b4fb58ef5d55cf3e523263dd824a2ace4Daniel Dunbar
1498a3ec60e0cf2a1916f479288998d31bd980b1a306Daniel Dunbar  Args.AddAllArgs(CmdArgs, options::OPT_undef);
1499a3ec60e0cf2a1916f479288998d31bd980b1a306Daniel Dunbar  if (Args.hasArg(options::OPT_Qn))
1500a3ec60e0cf2a1916f479288998d31bd980b1a306Daniel Dunbar    CmdArgs.push_back("-fno-ident");
1501c21c485b4fb58ef5d55cf3e523263dd824a2ace4Daniel Dunbar
1502a3ec60e0cf2a1916f479288998d31bd980b1a306Daniel Dunbar  // FIXME: This isn't correct.
1503a3ec60e0cf2a1916f479288998d31bd980b1a306Daniel Dunbar  //Args.AddLastArg(CmdArgs, options::OPT__help)
1504a3ec60e0cf2a1916f479288998d31bd980b1a306Daniel Dunbar  //Args.AddLastArg(CmdArgs, options::OPT__targetHelp)
1505a3ec60e0cf2a1916f479288998d31bd980b1a306Daniel Dunbar
1506a3ec60e0cf2a1916f479288998d31bd980b1a306Daniel Dunbar  CmdArgs.append(OutputArgs.begin(), OutputArgs.end());
1507a3ec60e0cf2a1916f479288998d31bd980b1a306Daniel Dunbar
1508a3ec60e0cf2a1916f479288998d31bd980b1a306Daniel Dunbar  // FIXME: Still don't get what is happening here. Investigate.
1509a3ec60e0cf2a1916f479288998d31bd980b1a306Daniel Dunbar  Args.AddAllArgs(CmdArgs, options::OPT__param);
1510a3ec60e0cf2a1916f479288998d31bd980b1a306Daniel Dunbar
1511a3ec60e0cf2a1916f479288998d31bd980b1a306Daniel Dunbar  if (Args.hasArg(options::OPT_fmudflap) ||
1512a3ec60e0cf2a1916f479288998d31bd980b1a306Daniel Dunbar      Args.hasArg(options::OPT_fmudflapth)) {
1513a3ec60e0cf2a1916f479288998d31bd980b1a306Daniel Dunbar    CmdArgs.push_back("-fno-builtin");
1514a3ec60e0cf2a1916f479288998d31bd980b1a306Daniel Dunbar    CmdArgs.push_back("-fno-merge-constants");
1515a3ec60e0cf2a1916f479288998d31bd980b1a306Daniel Dunbar  }
1516c21c485b4fb58ef5d55cf3e523263dd824a2ace4Daniel Dunbar
1517a3ec60e0cf2a1916f479288998d31bd980b1a306Daniel Dunbar  if (Args.hasArg(options::OPT_coverage)) {
1518a3ec60e0cf2a1916f479288998d31bd980b1a306Daniel Dunbar    CmdArgs.push_back("-fprofile-arcs");
1519a3ec60e0cf2a1916f479288998d31bd980b1a306Daniel Dunbar    CmdArgs.push_back("-ftest-coverage");
1520a3ec60e0cf2a1916f479288998d31bd980b1a306Daniel Dunbar  }
1521a3ec60e0cf2a1916f479288998d31bd980b1a306Daniel Dunbar
1522a3ec60e0cf2a1916f479288998d31bd980b1a306Daniel Dunbar  if (types::isCXX(Inputs[0].getType()))
1523a3ec60e0cf2a1916f479288998d31bd980b1a306Daniel Dunbar    CmdArgs.push_back("-D__private_extern__=extern");
1524a3ec60e0cf2a1916f479288998d31bd980b1a306Daniel Dunbar}
1525a3ec60e0cf2a1916f479288998d31bd980b1a306Daniel Dunbar
1526a3ec60e0cf2a1916f479288998d31bd980b1a306Daniel Dunbarvoid darwin::CC1::AddCPPOptionsArgs(const ArgList &Args, ArgStringList &CmdArgs,
1527a3ec60e0cf2a1916f479288998d31bd980b1a306Daniel Dunbar                                    const InputInfoList &Inputs,
1528a3ec60e0cf2a1916f479288998d31bd980b1a306Daniel Dunbar                                    const ArgStringList &OutputArgs) const {
1529a3ec60e0cf2a1916f479288998d31bd980b1a306Daniel Dunbar  // Derived from cpp_options
1530a3ec60e0cf2a1916f479288998d31bd980b1a306Daniel Dunbar  AddCPPUniqueOptionsArgs(Args, CmdArgs, Inputs);
1531c21c485b4fb58ef5d55cf3e523263dd824a2ace4Daniel Dunbar
1532a3ec60e0cf2a1916f479288998d31bd980b1a306Daniel Dunbar  CmdArgs.append(OutputArgs.begin(), OutputArgs.end());
1533a3ec60e0cf2a1916f479288998d31bd980b1a306Daniel Dunbar
1534a3ec60e0cf2a1916f479288998d31bd980b1a306Daniel Dunbar  AddCC1Args(Args, CmdArgs);
1535a3ec60e0cf2a1916f479288998d31bd980b1a306Daniel Dunbar
1536a3ec60e0cf2a1916f479288998d31bd980b1a306Daniel Dunbar  // NOTE: The code below has some commonality with cpp_options, but
1537a3ec60e0cf2a1916f479288998d31bd980b1a306Daniel Dunbar  // in classic gcc style ends up sending things in different
1538a3ec60e0cf2a1916f479288998d31bd980b1a306Daniel Dunbar  // orders. This may be a good merge candidate once we drop pedantic
1539a3ec60e0cf2a1916f479288998d31bd980b1a306Daniel Dunbar  // compatibility.
1540a3ec60e0cf2a1916f479288998d31bd980b1a306Daniel Dunbar
1541a3ec60e0cf2a1916f479288998d31bd980b1a306Daniel Dunbar  Args.AddAllArgs(CmdArgs, options::OPT_m_Group);
1542c21c485b4fb58ef5d55cf3e523263dd824a2ace4Daniel Dunbar  Args.AddAllArgs(CmdArgs, options::OPT_std_EQ, options::OPT_ansi,
1543a3ec60e0cf2a1916f479288998d31bd980b1a306Daniel Dunbar                  options::OPT_trigraphs);
1544a3ff202ee4fb21728e930d5d029ba4925129912cDaniel Dunbar  if (!Args.getLastArg(options::OPT_std_EQ, options::OPT_ansi)) {
1545a3ff202ee4fb21728e930d5d029ba4925129912cDaniel Dunbar    // Honor -std-default.
1546a3ff202ee4fb21728e930d5d029ba4925129912cDaniel Dunbar    Args.AddAllArgsTranslated(CmdArgs, options::OPT_std_default_EQ,
1547a3ff202ee4fb21728e930d5d029ba4925129912cDaniel Dunbar                              "-std=", /*Joined=*/true);
1548a3ff202ee4fb21728e930d5d029ba4925129912cDaniel Dunbar  }
1549a3ec60e0cf2a1916f479288998d31bd980b1a306Daniel Dunbar  Args.AddAllArgs(CmdArgs, options::OPT_W_Group, options::OPT_pedantic_Group);
1550a3ec60e0cf2a1916f479288998d31bd980b1a306Daniel Dunbar  Args.AddLastArg(CmdArgs, options::OPT_w);
1551c21c485b4fb58ef5d55cf3e523263dd824a2ace4Daniel Dunbar
1552a3ec60e0cf2a1916f479288998d31bd980b1a306Daniel Dunbar  // The driver treats -fsyntax-only specially.
1553a3ec60e0cf2a1916f479288998d31bd980b1a306Daniel Dunbar  Args.AddAllArgs(CmdArgs, options::OPT_f_Group, options::OPT_fsyntax_only);
1554a3ec60e0cf2a1916f479288998d31bd980b1a306Daniel Dunbar
1555a3ec60e0cf2a1916f479288998d31bd980b1a306Daniel Dunbar  if (Args.hasArg(options::OPT_g_Group) && !Args.hasArg(options::OPT_g0) &&
1556a3ec60e0cf2a1916f479288998d31bd980b1a306Daniel Dunbar      !Args.hasArg(options::OPT_fno_working_directory))
1557a3ec60e0cf2a1916f479288998d31bd980b1a306Daniel Dunbar    CmdArgs.push_back("-fworking-directory");
1558a3ec60e0cf2a1916f479288998d31bd980b1a306Daniel Dunbar
1559a3ec60e0cf2a1916f479288998d31bd980b1a306Daniel Dunbar  Args.AddAllArgs(CmdArgs, options::OPT_O);
1560a3ec60e0cf2a1916f479288998d31bd980b1a306Daniel Dunbar  Args.AddAllArgs(CmdArgs, options::OPT_undef);
1561a3ec60e0cf2a1916f479288998d31bd980b1a306Daniel Dunbar  if (Args.hasArg(options::OPT_save_temps))
1562a3ec60e0cf2a1916f479288998d31bd980b1a306Daniel Dunbar    CmdArgs.push_back("-fpch-preprocess");
1563a3ec60e0cf2a1916f479288998d31bd980b1a306Daniel Dunbar}
1564a3ec60e0cf2a1916f479288998d31bd980b1a306Daniel Dunbar
1565c21c485b4fb58ef5d55cf3e523263dd824a2ace4Daniel Dunbarvoid darwin::CC1::AddCPPUniqueOptionsArgs(const ArgList &Args,
1566a3ec60e0cf2a1916f479288998d31bd980b1a306Daniel Dunbar                                          ArgStringList &CmdArgs,
15671eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump                                          const InputInfoList &Inputs) const {
1568ee788e70fcd0adf76103b17c78ac658d4ea30c9bDaniel Dunbar  const Driver &D = getToolChain().getDriver();
1569a3ec60e0cf2a1916f479288998d31bd980b1a306Daniel Dunbar
157088a3d6cf5ebab81614f89ba48a8d89023270637aDaniel Dunbar  CheckPreprocessingOptions(D, Args);
157188a3d6cf5ebab81614f89ba48a8d89023270637aDaniel Dunbar
1572a3ec60e0cf2a1916f479288998d31bd980b1a306Daniel Dunbar  // Derived from cpp_unique_options.
157388a3d6cf5ebab81614f89ba48a8d89023270637aDaniel Dunbar  // -{C,CC} only with -E is checked in CheckPreprocessingOptions().
157488a3d6cf5ebab81614f89ba48a8d89023270637aDaniel Dunbar  Args.AddLastArg(CmdArgs, options::OPT_C);
157588a3d6cf5ebab81614f89ba48a8d89023270637aDaniel Dunbar  Args.AddLastArg(CmdArgs, options::OPT_CC);
1576a3ec60e0cf2a1916f479288998d31bd980b1a306Daniel Dunbar  if (!Args.hasArg(options::OPT_Q))
1577a3ec60e0cf2a1916f479288998d31bd980b1a306Daniel Dunbar    CmdArgs.push_back("-quiet");
1578a3ec60e0cf2a1916f479288998d31bd980b1a306Daniel Dunbar  Args.AddAllArgs(CmdArgs, options::OPT_nostdinc);
1579a3ec60e0cf2a1916f479288998d31bd980b1a306Daniel Dunbar  Args.AddLastArg(CmdArgs, options::OPT_v);
1580a3ec60e0cf2a1916f479288998d31bd980b1a306Daniel Dunbar  Args.AddAllArgs(CmdArgs, options::OPT_I_Group, options::OPT_F);
1581a3ec60e0cf2a1916f479288998d31bd980b1a306Daniel Dunbar  Args.AddLastArg(CmdArgs, options::OPT_P);
1582a3ec60e0cf2a1916f479288998d31bd980b1a306Daniel Dunbar
1583a3ec60e0cf2a1916f479288998d31bd980b1a306Daniel Dunbar  // FIXME: Handle %I properly.
1584a3ec60e0cf2a1916f479288998d31bd980b1a306Daniel Dunbar  if (getToolChain().getArchName() == "x86_64") {
1585a3ec60e0cf2a1916f479288998d31bd980b1a306Daniel Dunbar    CmdArgs.push_back("-imultilib");
1586a3ec60e0cf2a1916f479288998d31bd980b1a306Daniel Dunbar    CmdArgs.push_back("x86_64");
1587a3ec60e0cf2a1916f479288998d31bd980b1a306Daniel Dunbar  }
1588a3ec60e0cf2a1916f479288998d31bd980b1a306Daniel Dunbar
1589a3ec60e0cf2a1916f479288998d31bd980b1a306Daniel Dunbar  if (Args.hasArg(options::OPT_MD)) {
1590a3ec60e0cf2a1916f479288998d31bd980b1a306Daniel Dunbar    CmdArgs.push_back("-MD");
1591a5a7bd0de7b6b80212095195a055a4a43f21d4b2Daniel Dunbar    CmdArgs.push_back(darwin::CC1::getDependencyFileName(Args, Inputs));
1592a3ec60e0cf2a1916f479288998d31bd980b1a306Daniel Dunbar  }
1593a3ec60e0cf2a1916f479288998d31bd980b1a306Daniel Dunbar
1594a3ec60e0cf2a1916f479288998d31bd980b1a306Daniel Dunbar  if (Args.hasArg(options::OPT_MMD)) {
1595a3ec60e0cf2a1916f479288998d31bd980b1a306Daniel Dunbar    CmdArgs.push_back("-MMD");
1596a5a7bd0de7b6b80212095195a055a4a43f21d4b2Daniel Dunbar    CmdArgs.push_back(darwin::CC1::getDependencyFileName(Args, Inputs));
1597a3ec60e0cf2a1916f479288998d31bd980b1a306Daniel Dunbar  }
1598a3ec60e0cf2a1916f479288998d31bd980b1a306Daniel Dunbar
1599a3ec60e0cf2a1916f479288998d31bd980b1a306Daniel Dunbar  Args.AddLastArg(CmdArgs, options::OPT_M);
1600a3ec60e0cf2a1916f479288998d31bd980b1a306Daniel Dunbar  Args.AddLastArg(CmdArgs, options::OPT_MM);
1601a3ec60e0cf2a1916f479288998d31bd980b1a306Daniel Dunbar  Args.AddAllArgs(CmdArgs, options::OPT_MF);
1602a3ec60e0cf2a1916f479288998d31bd980b1a306Daniel Dunbar  Args.AddLastArg(CmdArgs, options::OPT_MG);
1603a3ec60e0cf2a1916f479288998d31bd980b1a306Daniel Dunbar  Args.AddLastArg(CmdArgs, options::OPT_MP);
1604a3ec60e0cf2a1916f479288998d31bd980b1a306Daniel Dunbar  Args.AddAllArgs(CmdArgs, options::OPT_MQ);
1605a3ec60e0cf2a1916f479288998d31bd980b1a306Daniel Dunbar  Args.AddAllArgs(CmdArgs, options::OPT_MT);
1606a3ec60e0cf2a1916f479288998d31bd980b1a306Daniel Dunbar  if (!Args.hasArg(options::OPT_M) && !Args.hasArg(options::OPT_MM) &&
1607a3ec60e0cf2a1916f479288998d31bd980b1a306Daniel Dunbar      (Args.hasArg(options::OPT_MD) || Args.hasArg(options::OPT_MMD))) {
1608a3ec60e0cf2a1916f479288998d31bd980b1a306Daniel Dunbar    if (Arg *OutputOpt = Args.getLastArg(options::OPT_o)) {
1609a3ec60e0cf2a1916f479288998d31bd980b1a306Daniel Dunbar      CmdArgs.push_back("-MQ");
1610a3ec60e0cf2a1916f479288998d31bd980b1a306Daniel Dunbar      CmdArgs.push_back(OutputOpt->getValue(Args));
1611a3ec60e0cf2a1916f479288998d31bd980b1a306Daniel Dunbar    }
1612a3ec60e0cf2a1916f479288998d31bd980b1a306Daniel Dunbar  }
1613a3ec60e0cf2a1916f479288998d31bd980b1a306Daniel Dunbar
1614a3ec60e0cf2a1916f479288998d31bd980b1a306Daniel Dunbar  Args.AddLastArg(CmdArgs, options::OPT_remap);
1615a3ec60e0cf2a1916f479288998d31bd980b1a306Daniel Dunbar  if (Args.hasArg(options::OPT_g3))
1616a3ec60e0cf2a1916f479288998d31bd980b1a306Daniel Dunbar    CmdArgs.push_back("-dD");
1617a3ec60e0cf2a1916f479288998d31bd980b1a306Daniel Dunbar  Args.AddLastArg(CmdArgs, options::OPT_H);
1618a3ec60e0cf2a1916f479288998d31bd980b1a306Daniel Dunbar
1619a3ec60e0cf2a1916f479288998d31bd980b1a306Daniel Dunbar  AddCPPArgs(Args, CmdArgs);
1620a3ec60e0cf2a1916f479288998d31bd980b1a306Daniel Dunbar
1621a3ec60e0cf2a1916f479288998d31bd980b1a306Daniel Dunbar  Args.AddAllArgs(CmdArgs, options::OPT_D, options::OPT_U, options::OPT_A);
1622a3ec60e0cf2a1916f479288998d31bd980b1a306Daniel Dunbar  Args.AddAllArgs(CmdArgs, options::OPT_i_Group);
1623a3ec60e0cf2a1916f479288998d31bd980b1a306Daniel Dunbar
1624a3ec60e0cf2a1916f479288998d31bd980b1a306Daniel Dunbar  for (InputInfoList::const_iterator
1625a3ec60e0cf2a1916f479288998d31bd980b1a306Daniel Dunbar         it = Inputs.begin(), ie = Inputs.end(); it != ie; ++it) {
1626a3ec60e0cf2a1916f479288998d31bd980b1a306Daniel Dunbar    const InputInfo &II = *it;
1627c21c485b4fb58ef5d55cf3e523263dd824a2ace4Daniel Dunbar
1628a3ec60e0cf2a1916f479288998d31bd980b1a306Daniel Dunbar    if (II.isPipe())
1629a3ec60e0cf2a1916f479288998d31bd980b1a306Daniel Dunbar      CmdArgs.push_back("-");
1630a3ec60e0cf2a1916f479288998d31bd980b1a306Daniel Dunbar    else
1631a3ec60e0cf2a1916f479288998d31bd980b1a306Daniel Dunbar      CmdArgs.push_back(II.getFilename());
1632a3ec60e0cf2a1916f479288998d31bd980b1a306Daniel Dunbar  }
1633a3ec60e0cf2a1916f479288998d31bd980b1a306Daniel Dunbar
1634a3ec60e0cf2a1916f479288998d31bd980b1a306Daniel Dunbar  Args.AddAllArgValues(CmdArgs, options::OPT_Wp_COMMA,
1635a3ec60e0cf2a1916f479288998d31bd980b1a306Daniel Dunbar                       options::OPT_Xpreprocessor);
1636a3ec60e0cf2a1916f479288998d31bd980b1a306Daniel Dunbar
1637a3ec60e0cf2a1916f479288998d31bd980b1a306Daniel Dunbar  if (Args.hasArg(options::OPT_fmudflap)) {
1638a3ec60e0cf2a1916f479288998d31bd980b1a306Daniel Dunbar    CmdArgs.push_back("-D_MUDFLAP");
1639a3ec60e0cf2a1916f479288998d31bd980b1a306Daniel Dunbar    CmdArgs.push_back("-include");
1640a3ec60e0cf2a1916f479288998d31bd980b1a306Daniel Dunbar    CmdArgs.push_back("mf-runtime.h");
1641a3ec60e0cf2a1916f479288998d31bd980b1a306Daniel Dunbar  }
1642a3ec60e0cf2a1916f479288998d31bd980b1a306Daniel Dunbar
1643a3ec60e0cf2a1916f479288998d31bd980b1a306Daniel Dunbar  if (Args.hasArg(options::OPT_fmudflapth)) {
1644a3ec60e0cf2a1916f479288998d31bd980b1a306Daniel Dunbar    CmdArgs.push_back("-D_MUDFLAP");
1645a3ec60e0cf2a1916f479288998d31bd980b1a306Daniel Dunbar    CmdArgs.push_back("-D_MUDFLAPTH");
1646a3ec60e0cf2a1916f479288998d31bd980b1a306Daniel Dunbar    CmdArgs.push_back("-include");
1647a3ec60e0cf2a1916f479288998d31bd980b1a306Daniel Dunbar    CmdArgs.push_back("mf-runtime.h");
1648a3ec60e0cf2a1916f479288998d31bd980b1a306Daniel Dunbar  }
1649a3ec60e0cf2a1916f479288998d31bd980b1a306Daniel Dunbar}
1650a3ec60e0cf2a1916f479288998d31bd980b1a306Daniel Dunbar
1651c21c485b4fb58ef5d55cf3e523263dd824a2ace4Daniel Dunbarvoid darwin::CC1::AddCPPArgs(const ArgList &Args,
1652a3ec60e0cf2a1916f479288998d31bd980b1a306Daniel Dunbar                             ArgStringList &CmdArgs) const {
1653a3ec60e0cf2a1916f479288998d31bd980b1a306Daniel Dunbar  // Derived from cpp spec.
1654a3ec60e0cf2a1916f479288998d31bd980b1a306Daniel Dunbar
1655a3ec60e0cf2a1916f479288998d31bd980b1a306Daniel Dunbar  if (Args.hasArg(options::OPT_static)) {
1656a3ec60e0cf2a1916f479288998d31bd980b1a306Daniel Dunbar    // The gcc spec is broken here, it refers to dynamic but
1657a3ec60e0cf2a1916f479288998d31bd980b1a306Daniel Dunbar    // that has been translated. Start by being bug compatible.
1658c21c485b4fb58ef5d55cf3e523263dd824a2ace4Daniel Dunbar
1659a3ec60e0cf2a1916f479288998d31bd980b1a306Daniel Dunbar    // if (!Args.hasArg(arglist.parser.dynamicOption))
1660a3ec60e0cf2a1916f479288998d31bd980b1a306Daniel Dunbar    CmdArgs.push_back("-D__STATIC__");
1661a3ec60e0cf2a1916f479288998d31bd980b1a306Daniel Dunbar  } else
1662a3ec60e0cf2a1916f479288998d31bd980b1a306Daniel Dunbar    CmdArgs.push_back("-D__DYNAMIC__");
1663a3ec60e0cf2a1916f479288998d31bd980b1a306Daniel Dunbar
1664a3ec60e0cf2a1916f479288998d31bd980b1a306Daniel Dunbar  if (Args.hasArg(options::OPT_pthread))
1665a3ec60e0cf2a1916f479288998d31bd980b1a306Daniel Dunbar    CmdArgs.push_back("-D_REENTRANT");
1666a3ec60e0cf2a1916f479288998d31bd980b1a306Daniel Dunbar}
1667a3ec60e0cf2a1916f479288998d31bd980b1a306Daniel Dunbar
166840f1265ebd42ece3e7f7917319b56012e8e2bce2Daniel Dunbarvoid darwin::Preprocess::ConstructJob(Compilation &C, const JobAction &JA,
1669c21c485b4fb58ef5d55cf3e523263dd824a2ace4Daniel Dunbar                                      Job &Dest, const InputInfo &Output,
1670c21c485b4fb58ef5d55cf3e523263dd824a2ace4Daniel Dunbar                                      const InputInfoList &Inputs,
1671c21c485b4fb58ef5d55cf3e523263dd824a2ace4Daniel Dunbar                                      const ArgList &Args,
167240f1265ebd42ece3e7f7917319b56012e8e2bce2Daniel Dunbar                                      const char *LinkingOutput) const {
167340f1265ebd42ece3e7f7917319b56012e8e2bce2Daniel Dunbar  ArgStringList CmdArgs;
167440f1265ebd42ece3e7f7917319b56012e8e2bce2Daniel Dunbar
167540f1265ebd42ece3e7f7917319b56012e8e2bce2Daniel Dunbar  assert(Inputs.size() == 1 && "Unexpected number of inputs!");
167640f1265ebd42ece3e7f7917319b56012e8e2bce2Daniel Dunbar
167740f1265ebd42ece3e7f7917319b56012e8e2bce2Daniel Dunbar  CmdArgs.push_back("-E");
167840f1265ebd42ece3e7f7917319b56012e8e2bce2Daniel Dunbar
167940f1265ebd42ece3e7f7917319b56012e8e2bce2Daniel Dunbar  if (Args.hasArg(options::OPT_traditional) ||
168040f1265ebd42ece3e7f7917319b56012e8e2bce2Daniel Dunbar      Args.hasArg(options::OPT_traditional_cpp))
168140f1265ebd42ece3e7f7917319b56012e8e2bce2Daniel Dunbar    CmdArgs.push_back("-traditional-cpp");
1682c21c485b4fb58ef5d55cf3e523263dd824a2ace4Daniel Dunbar
168340f1265ebd42ece3e7f7917319b56012e8e2bce2Daniel Dunbar  ArgStringList OutputArgs;
168440f1265ebd42ece3e7f7917319b56012e8e2bce2Daniel Dunbar  if (Output.isFilename()) {
168540f1265ebd42ece3e7f7917319b56012e8e2bce2Daniel Dunbar    OutputArgs.push_back("-o");
168640f1265ebd42ece3e7f7917319b56012e8e2bce2Daniel Dunbar    OutputArgs.push_back(Output.getFilename());
168740f1265ebd42ece3e7f7917319b56012e8e2bce2Daniel Dunbar  } else {
168840f1265ebd42ece3e7f7917319b56012e8e2bce2Daniel Dunbar    assert(Output.isPipe() && "Unexpected CC1 output.");
168940f1265ebd42ece3e7f7917319b56012e8e2bce2Daniel Dunbar  }
169040f1265ebd42ece3e7f7917319b56012e8e2bce2Daniel Dunbar
16919120f179fd2e354f067e4ef2c76dcf3fc4db8a16Daniel Dunbar  if (Args.hasArg(options::OPT_E)) {
16929120f179fd2e354f067e4ef2c76dcf3fc4db8a16Daniel Dunbar    AddCPPOptionsArgs(Args, CmdArgs, Inputs, OutputArgs);
16939120f179fd2e354f067e4ef2c76dcf3fc4db8a16Daniel Dunbar  } else {
16949120f179fd2e354f067e4ef2c76dcf3fc4db8a16Daniel Dunbar    AddCPPOptionsArgs(Args, CmdArgs, Inputs, ArgStringList());
16959120f179fd2e354f067e4ef2c76dcf3fc4db8a16Daniel Dunbar    CmdArgs.append(OutputArgs.begin(), OutputArgs.end());
16969120f179fd2e354f067e4ef2c76dcf3fc4db8a16Daniel Dunbar  }
1697c21c485b4fb58ef5d55cf3e523263dd824a2ace4Daniel Dunbar
16988a2073a85670a13b0bcc1726bc7f80d458f8245bDaniel Dunbar  Args.AddAllArgs(CmdArgs, options::OPT_d_Group);
16998a2073a85670a13b0bcc1726bc7f80d458f8245bDaniel Dunbar
170040f1265ebd42ece3e7f7917319b56012e8e2bce2Daniel Dunbar  const char *CC1Name = getCC1Name(Inputs[0].getType());
1701c21c485b4fb58ef5d55cf3e523263dd824a2ace4Daniel Dunbar  const char *Exec =
17025ed34f4c58b6ad4e21038d713c1fae31a6146ff5Daniel Dunbar    Args.MakeArgString(getToolChain().GetProgramPath(C, CC1Name));
1703daab7b1016f0a82fefa4f7be6e63c57c06b19ffcDaniel Dunbar  Dest.addCommand(new Command(JA, *this, Exec, CmdArgs));
170440f1265ebd42ece3e7f7917319b56012e8e2bce2Daniel Dunbar}
170540f1265ebd42ece3e7f7917319b56012e8e2bce2Daniel Dunbar
170640f1265ebd42ece3e7f7917319b56012e8e2bce2Daniel Dunbarvoid darwin::Compile::ConstructJob(Compilation &C, const JobAction &JA,
1707c21c485b4fb58ef5d55cf3e523263dd824a2ace4Daniel Dunbar                                   Job &Dest, const InputInfo &Output,
1708c21c485b4fb58ef5d55cf3e523263dd824a2ace4Daniel Dunbar                                   const InputInfoList &Inputs,
1709c21c485b4fb58ef5d55cf3e523263dd824a2ace4Daniel Dunbar                                   const ArgList &Args,
171040f1265ebd42ece3e7f7917319b56012e8e2bce2Daniel Dunbar                                   const char *LinkingOutput) const {
1711ee788e70fcd0adf76103b17c78ac658d4ea30c9bDaniel Dunbar  const Driver &D = getToolChain().getDriver();
171240f1265ebd42ece3e7f7917319b56012e8e2bce2Daniel Dunbar  ArgStringList CmdArgs;
171340f1265ebd42ece3e7f7917319b56012e8e2bce2Daniel Dunbar
171440f1265ebd42ece3e7f7917319b56012e8e2bce2Daniel Dunbar  assert(Inputs.size() == 1 && "Unexpected number of inputs!");
171540f1265ebd42ece3e7f7917319b56012e8e2bce2Daniel Dunbar
171640f1265ebd42ece3e7f7917319b56012e8e2bce2Daniel Dunbar  types::ID InputType = Inputs[0].getType();
171740f1265ebd42ece3e7f7917319b56012e8e2bce2Daniel Dunbar  const Arg *A;
1718ceb5c5b7f67a30fae305d1d19b478b623e4fbcedEli Friedman  if ((A = Args.getLastArg(options::OPT_traditional)))
171940f1265ebd42ece3e7f7917319b56012e8e2bce2Daniel Dunbar    D.Diag(clang::diag::err_drv_argument_only_allowed_with)
172040f1265ebd42ece3e7f7917319b56012e8e2bce2Daniel Dunbar      << A->getAsString(Args) << "-E";
172140f1265ebd42ece3e7f7917319b56012e8e2bce2Daniel Dunbar
172240f1265ebd42ece3e7f7917319b56012e8e2bce2Daniel Dunbar  if (Output.getType() == types::TY_LLVMAsm)
172340f1265ebd42ece3e7f7917319b56012e8e2bce2Daniel Dunbar    CmdArgs.push_back("-emit-llvm");
172440f1265ebd42ece3e7f7917319b56012e8e2bce2Daniel Dunbar  else if (Output.getType() == types::TY_LLVMBC)
172540f1265ebd42ece3e7f7917319b56012e8e2bce2Daniel Dunbar    CmdArgs.push_back("-emit-llvm-bc");
17265915fbf310e171c4cd3c2af05e9de360c0fa988aDaniel Dunbar  else if (Output.getType() == types::TY_AST)
17275915fbf310e171c4cd3c2af05e9de360c0fa988aDaniel Dunbar    D.Diag(clang::diag::err_drv_no_ast_support)
1728881376467c46c5c6cc16fa6790271c2c22e1d4f1Daniel Dunbar      << getToolChain().getTripleString();
172940f1265ebd42ece3e7f7917319b56012e8e2bce2Daniel Dunbar
173040f1265ebd42ece3e7f7917319b56012e8e2bce2Daniel Dunbar  ArgStringList OutputArgs;
173140f1265ebd42ece3e7f7917319b56012e8e2bce2Daniel Dunbar  if (Output.getType() != types::TY_PCH) {
173240f1265ebd42ece3e7f7917319b56012e8e2bce2Daniel Dunbar    OutputArgs.push_back("-o");
173340f1265ebd42ece3e7f7917319b56012e8e2bce2Daniel Dunbar    if (Output.isPipe())
173440f1265ebd42ece3e7f7917319b56012e8e2bce2Daniel Dunbar      OutputArgs.push_back("-");
173540f1265ebd42ece3e7f7917319b56012e8e2bce2Daniel Dunbar    else if (Output.isNothing())
173640f1265ebd42ece3e7f7917319b56012e8e2bce2Daniel Dunbar      OutputArgs.push_back("/dev/null");
173740f1265ebd42ece3e7f7917319b56012e8e2bce2Daniel Dunbar    else
173840f1265ebd42ece3e7f7917319b56012e8e2bce2Daniel Dunbar      OutputArgs.push_back(Output.getFilename());
173940f1265ebd42ece3e7f7917319b56012e8e2bce2Daniel Dunbar  }
174040f1265ebd42ece3e7f7917319b56012e8e2bce2Daniel Dunbar
174140f1265ebd42ece3e7f7917319b56012e8e2bce2Daniel Dunbar  // There is no need for this level of compatibility, but it makes
174240f1265ebd42ece3e7f7917319b56012e8e2bce2Daniel Dunbar  // diffing easier.
174340f1265ebd42ece3e7f7917319b56012e8e2bce2Daniel Dunbar  bool OutputArgsEarly = (Args.hasArg(options::OPT_fsyntax_only) ||
174440f1265ebd42ece3e7f7917319b56012e8e2bce2Daniel Dunbar                          Args.hasArg(options::OPT_S));
174540f1265ebd42ece3e7f7917319b56012e8e2bce2Daniel Dunbar
174640f1265ebd42ece3e7f7917319b56012e8e2bce2Daniel Dunbar  if (types::getPreprocessedType(InputType) != types::TY_INVALID) {
1747a3ec60e0cf2a1916f479288998d31bd980b1a306Daniel Dunbar    AddCPPUniqueOptionsArgs(Args, CmdArgs, Inputs);
174840f1265ebd42ece3e7f7917319b56012e8e2bce2Daniel Dunbar    if (OutputArgsEarly) {
174940f1265ebd42ece3e7f7917319b56012e8e2bce2Daniel Dunbar      AddCC1OptionsArgs(Args, CmdArgs, Inputs, OutputArgs);
175040f1265ebd42ece3e7f7917319b56012e8e2bce2Daniel Dunbar    } else {
175140f1265ebd42ece3e7f7917319b56012e8e2bce2Daniel Dunbar      AddCC1OptionsArgs(Args, CmdArgs, Inputs, ArgStringList());
175240f1265ebd42ece3e7f7917319b56012e8e2bce2Daniel Dunbar      CmdArgs.append(OutputArgs.begin(), OutputArgs.end());
175340f1265ebd42ece3e7f7917319b56012e8e2bce2Daniel Dunbar    }
175440f1265ebd42ece3e7f7917319b56012e8e2bce2Daniel Dunbar  } else {
175540f1265ebd42ece3e7f7917319b56012e8e2bce2Daniel Dunbar    CmdArgs.push_back("-fpreprocessed");
1756c21c485b4fb58ef5d55cf3e523263dd824a2ace4Daniel Dunbar
175740f1265ebd42ece3e7f7917319b56012e8e2bce2Daniel Dunbar    for (InputInfoList::const_iterator
175840f1265ebd42ece3e7f7917319b56012e8e2bce2Daniel Dunbar           it = Inputs.begin(), ie = Inputs.end(); it != ie; ++it) {
175940f1265ebd42ece3e7f7917319b56012e8e2bce2Daniel Dunbar      const InputInfo &II = *it;
176040f1265ebd42ece3e7f7917319b56012e8e2bce2Daniel Dunbar
17615915fbf310e171c4cd3c2af05e9de360c0fa988aDaniel Dunbar      // Reject AST inputs.
17625915fbf310e171c4cd3c2af05e9de360c0fa988aDaniel Dunbar      if (II.getType() == types::TY_AST) {
17635915fbf310e171c4cd3c2af05e9de360c0fa988aDaniel Dunbar        D.Diag(clang::diag::err_drv_no_ast_support)
1764881376467c46c5c6cc16fa6790271c2c22e1d4f1Daniel Dunbar          << getToolChain().getTripleString();
17655915fbf310e171c4cd3c2af05e9de360c0fa988aDaniel Dunbar        return;
17665915fbf310e171c4cd3c2af05e9de360c0fa988aDaniel Dunbar      }
17675915fbf310e171c4cd3c2af05e9de360c0fa988aDaniel Dunbar
176840f1265ebd42ece3e7f7917319b56012e8e2bce2Daniel Dunbar      if (II.isPipe())
176940f1265ebd42ece3e7f7917319b56012e8e2bce2Daniel Dunbar        CmdArgs.push_back("-");
177040f1265ebd42ece3e7f7917319b56012e8e2bce2Daniel Dunbar      else
177140f1265ebd42ece3e7f7917319b56012e8e2bce2Daniel Dunbar        CmdArgs.push_back(II.getFilename());
177240f1265ebd42ece3e7f7917319b56012e8e2bce2Daniel Dunbar    }
177340f1265ebd42ece3e7f7917319b56012e8e2bce2Daniel Dunbar
177440f1265ebd42ece3e7f7917319b56012e8e2bce2Daniel Dunbar    if (OutputArgsEarly) {
177540f1265ebd42ece3e7f7917319b56012e8e2bce2Daniel Dunbar      AddCC1OptionsArgs(Args, CmdArgs, Inputs, OutputArgs);
177640f1265ebd42ece3e7f7917319b56012e8e2bce2Daniel Dunbar    } else {
177740f1265ebd42ece3e7f7917319b56012e8e2bce2Daniel Dunbar      AddCC1OptionsArgs(Args, CmdArgs, Inputs, ArgStringList());
177840f1265ebd42ece3e7f7917319b56012e8e2bce2Daniel Dunbar      CmdArgs.append(OutputArgs.begin(), OutputArgs.end());
177940f1265ebd42ece3e7f7917319b56012e8e2bce2Daniel Dunbar    }
178040f1265ebd42ece3e7f7917319b56012e8e2bce2Daniel Dunbar  }
1781c21c485b4fb58ef5d55cf3e523263dd824a2ace4Daniel Dunbar
178240f1265ebd42ece3e7f7917319b56012e8e2bce2Daniel Dunbar  if (Output.getType() == types::TY_PCH) {
178340f1265ebd42ece3e7f7917319b56012e8e2bce2Daniel Dunbar    assert(Output.isFilename() && "Invalid PCH output.");
178440f1265ebd42ece3e7f7917319b56012e8e2bce2Daniel Dunbar
178540f1265ebd42ece3e7f7917319b56012e8e2bce2Daniel Dunbar    CmdArgs.push_back("-o");
178640f1265ebd42ece3e7f7917319b56012e8e2bce2Daniel Dunbar    // NOTE: gcc uses a temp .s file for this, but there doesn't seem
178740f1265ebd42ece3e7f7917319b56012e8e2bce2Daniel Dunbar    // to be a good reason.
178840f1265ebd42ece3e7f7917319b56012e8e2bce2Daniel Dunbar    CmdArgs.push_back("/dev/null");
1789c21c485b4fb58ef5d55cf3e523263dd824a2ace4Daniel Dunbar
1790e6c9ae147835fb450a90800bd378420c0e5ffb35Daniel Dunbar    CmdArgs.push_back("--output-pch=");
179140f1265ebd42ece3e7f7917319b56012e8e2bce2Daniel Dunbar    CmdArgs.push_back(Output.getFilename());
1792c21c485b4fb58ef5d55cf3e523263dd824a2ace4Daniel Dunbar  }
179340f1265ebd42ece3e7f7917319b56012e8e2bce2Daniel Dunbar
179440f1265ebd42ece3e7f7917319b56012e8e2bce2Daniel Dunbar  const char *CC1Name = getCC1Name(Inputs[0].getType());
1795c21c485b4fb58ef5d55cf3e523263dd824a2ace4Daniel Dunbar  const char *Exec =
17965ed34f4c58b6ad4e21038d713c1fae31a6146ff5Daniel Dunbar    Args.MakeArgString(getToolChain().GetProgramPath(C, CC1Name));
1797daab7b1016f0a82fefa4f7be6e63c57c06b19ffcDaniel Dunbar  Dest.addCommand(new Command(JA, *this, Exec, CmdArgs));
179840f1265ebd42ece3e7f7917319b56012e8e2bce2Daniel Dunbar}
179940f1265ebd42ece3e7f7917319b56012e8e2bce2Daniel Dunbar
18008cac5f7e1ce63dd77ee0fb4ef68f9fa804f41ea6Daniel Dunbarvoid darwin::Assemble::ConstructJob(Compilation &C, const JobAction &JA,
1801c21c485b4fb58ef5d55cf3e523263dd824a2ace4Daniel Dunbar                                    Job &Dest, const InputInfo &Output,
1802c21c485b4fb58ef5d55cf3e523263dd824a2ace4Daniel Dunbar                                    const InputInfoList &Inputs,
1803c21c485b4fb58ef5d55cf3e523263dd824a2ace4Daniel Dunbar                                    const ArgList &Args,
18048cac5f7e1ce63dd77ee0fb4ef68f9fa804f41ea6Daniel Dunbar                                    const char *LinkingOutput) const {
18058cac5f7e1ce63dd77ee0fb4ef68f9fa804f41ea6Daniel Dunbar  ArgStringList CmdArgs;
18068cac5f7e1ce63dd77ee0fb4ef68f9fa804f41ea6Daniel Dunbar
18078cac5f7e1ce63dd77ee0fb4ef68f9fa804f41ea6Daniel Dunbar  assert(Inputs.size() == 1 && "Unexpected number of inputs.");
18088cac5f7e1ce63dd77ee0fb4ef68f9fa804f41ea6Daniel Dunbar  const InputInfo &Input = Inputs[0];
18098cac5f7e1ce63dd77ee0fb4ef68f9fa804f41ea6Daniel Dunbar
18108cac5f7e1ce63dd77ee0fb4ef68f9fa804f41ea6Daniel Dunbar  // Bit of a hack, this is only used for original inputs.
1811c21c485b4fb58ef5d55cf3e523263dd824a2ace4Daniel Dunbar  //
18128e4fea6750dbac032c172f3279c63b7815b7423eDaniel Dunbar  // FIXME: This is broken for preprocessed .s inputs.
18138cac5f7e1ce63dd77ee0fb4ef68f9fa804f41ea6Daniel Dunbar  if (Input.isFilename() &&
18148e4fea6750dbac032c172f3279c63b7815b7423eDaniel Dunbar      strcmp(Input.getFilename(), Input.getBaseInput()) == 0) {
18158e4fea6750dbac032c172f3279c63b7815b7423eDaniel Dunbar    if (Args.hasArg(options::OPT_gstabs))
18168e4fea6750dbac032c172f3279c63b7815b7423eDaniel Dunbar      CmdArgs.push_back("--gstabs");
18178e4fea6750dbac032c172f3279c63b7815b7423eDaniel Dunbar    else if (Args.hasArg(options::OPT_g_Group))
18188e4fea6750dbac032c172f3279c63b7815b7423eDaniel Dunbar      CmdArgs.push_back("--gdwarf2");
18198e4fea6750dbac032c172f3279c63b7815b7423eDaniel Dunbar  }
1820c21c485b4fb58ef5d55cf3e523263dd824a2ace4Daniel Dunbar
18218cac5f7e1ce63dd77ee0fb4ef68f9fa804f41ea6Daniel Dunbar  // Derived from asm spec.
1822cc6f803f98fa6ba9a9c366400210448516d01b3cDaniel Dunbar  AddDarwinArch(Args, CmdArgs);
1823cc6f803f98fa6ba9a9c366400210448516d01b3cDaniel Dunbar
1824251ca6c9fb2bb398d9bf9fe7399c27bed7074b5cDaniel Dunbar  if (!getDarwinToolChain().isTargetIPhoneOS() ||
1825cc6f803f98fa6ba9a9c366400210448516d01b3cDaniel Dunbar      Args.hasArg(options::OPT_force__cpusubtype__ALL))
1826cc6f803f98fa6ba9a9c366400210448516d01b3cDaniel Dunbar    CmdArgs.push_back("-force_cpusubtype_ALL");
18278cac5f7e1ce63dd77ee0fb4ef68f9fa804f41ea6Daniel Dunbar
18280e2679d29be70186fc1197a1484948ed239922baDaniel Dunbar  if (getToolChain().getTriple().getArch() != llvm::Triple::x86_64 &&
18290e2679d29be70186fc1197a1484948ed239922baDaniel Dunbar      (Args.hasArg(options::OPT_mkernel) ||
18308cac5f7e1ce63dd77ee0fb4ef68f9fa804f41ea6Daniel Dunbar       Args.hasArg(options::OPT_static) ||
18310e2679d29be70186fc1197a1484948ed239922baDaniel Dunbar       Args.hasArg(options::OPT_fapple_kext)))
1832c21c485b4fb58ef5d55cf3e523263dd824a2ace4Daniel Dunbar    CmdArgs.push_back("-static");
1833c21c485b4fb58ef5d55cf3e523263dd824a2ace4Daniel Dunbar
18348cac5f7e1ce63dd77ee0fb4ef68f9fa804f41ea6Daniel Dunbar  Args.AddAllArgValues(CmdArgs, options::OPT_Wa_COMMA,
18358cac5f7e1ce63dd77ee0fb4ef68f9fa804f41ea6Daniel Dunbar                       options::OPT_Xassembler);
18368cac5f7e1ce63dd77ee0fb4ef68f9fa804f41ea6Daniel Dunbar
18378cac5f7e1ce63dd77ee0fb4ef68f9fa804f41ea6Daniel Dunbar  assert(Output.isFilename() && "Unexpected lipo output.");
18388cac5f7e1ce63dd77ee0fb4ef68f9fa804f41ea6Daniel Dunbar  CmdArgs.push_back("-o");
18398cac5f7e1ce63dd77ee0fb4ef68f9fa804f41ea6Daniel Dunbar  CmdArgs.push_back(Output.getFilename());
18408cac5f7e1ce63dd77ee0fb4ef68f9fa804f41ea6Daniel Dunbar
18418cac5f7e1ce63dd77ee0fb4ef68f9fa804f41ea6Daniel Dunbar  if (Input.isPipe()) {
18428cac5f7e1ce63dd77ee0fb4ef68f9fa804f41ea6Daniel Dunbar    CmdArgs.push_back("-");
18438cac5f7e1ce63dd77ee0fb4ef68f9fa804f41ea6Daniel Dunbar  } else {
18448cac5f7e1ce63dd77ee0fb4ef68f9fa804f41ea6Daniel Dunbar    assert(Input.isFilename() && "Invalid input.");
18458cac5f7e1ce63dd77ee0fb4ef68f9fa804f41ea6Daniel Dunbar    CmdArgs.push_back(Input.getFilename());
18468cac5f7e1ce63dd77ee0fb4ef68f9fa804f41ea6Daniel Dunbar  }
18478cac5f7e1ce63dd77ee0fb4ef68f9fa804f41ea6Daniel Dunbar
18488cac5f7e1ce63dd77ee0fb4ef68f9fa804f41ea6Daniel Dunbar  // asm_final spec is empty.
18498cac5f7e1ce63dd77ee0fb4ef68f9fa804f41ea6Daniel Dunbar
1850c21c485b4fb58ef5d55cf3e523263dd824a2ace4Daniel Dunbar  const char *Exec =
18515ed34f4c58b6ad4e21038d713c1fae31a6146ff5Daniel Dunbar    Args.MakeArgString(getToolChain().GetProgramPath(C, "as"));
1852daab7b1016f0a82fefa4f7be6e63c57c06b19ffcDaniel Dunbar  Dest.addCommand(new Command(JA, *this, Exec, CmdArgs));
18538cac5f7e1ce63dd77ee0fb4ef68f9fa804f41ea6Daniel Dunbar}
1854ff7488dc9a766f94daf54d81b03ab9160d0bfd88Daniel Dunbar
185502633b541b04ad5ffc1c70f4c2feeeb13e607057Daniel Dunbar/// Helper routine for seeing if we should use dsymutil; this is a
185602633b541b04ad5ffc1c70f4c2feeeb13e607057Daniel Dunbar/// gcc compatible hack, we should remove it and use the input
185702633b541b04ad5ffc1c70f4c2feeeb13e607057Daniel Dunbar/// type information.
185802633b541b04ad5ffc1c70f4c2feeeb13e607057Daniel Dunbarstatic bool isSourceSuffix(const char *Str) {
185902633b541b04ad5ffc1c70f4c2feeeb13e607057Daniel Dunbar  // match: 'C', 'CPP', 'c', 'cc', 'cp', 'c++', 'cpp', 'cxx', 'm',
186002633b541b04ad5ffc1c70f4c2feeeb13e607057Daniel Dunbar  // 'mm'.
186155d3f7ae512875a1d6402943c3a619633feb2a18Douglas Gregor  return llvm::StringSwitch<bool>(Str)
186255d3f7ae512875a1d6402943c3a619633feb2a18Douglas Gregor           .Case("C", true)
186355d3f7ae512875a1d6402943c3a619633feb2a18Douglas Gregor           .Case("c", true)
186455d3f7ae512875a1d6402943c3a619633feb2a18Douglas Gregor           .Case("m", true)
186555d3f7ae512875a1d6402943c3a619633feb2a18Douglas Gregor           .Case("cc", true)
186655d3f7ae512875a1d6402943c3a619633feb2a18Douglas Gregor           .Case("cp", true)
186755d3f7ae512875a1d6402943c3a619633feb2a18Douglas Gregor           .Case("mm", true)
186855d3f7ae512875a1d6402943c3a619633feb2a18Douglas Gregor           .Case("CPP", true)
186955d3f7ae512875a1d6402943c3a619633feb2a18Douglas Gregor           .Case("c++", true)
187055d3f7ae512875a1d6402943c3a619633feb2a18Douglas Gregor           .Case("cpp", true)
187155d3f7ae512875a1d6402943c3a619633feb2a18Douglas Gregor           .Case("cxx", true)
187255d3f7ae512875a1d6402943c3a619633feb2a18Douglas Gregor           .Default(false);
187302633b541b04ad5ffc1c70f4c2feeeb13e607057Daniel Dunbar}
187402633b541b04ad5ffc1c70f4c2feeeb13e607057Daniel Dunbar
1875fbefe6bd6f62a3361813498dc672ab0d6c0d4fd1Daniel Dunbarvoid darwin::DarwinTool::AddDarwinArch(const ArgList &Args,
1876fbefe6bd6f62a3361813498dc672ab0d6c0d4fd1Daniel Dunbar                                       ArgStringList &CmdArgs) const {
1877eeff406730f50afd973f005a8d501a19af4785e5Daniel Dunbar  llvm::StringRef ArchName = getDarwinToolChain().getDarwinArchName(Args);
1878eeff406730f50afd973f005a8d501a19af4785e5Daniel Dunbar
187902633b541b04ad5ffc1c70f4c2feeeb13e607057Daniel Dunbar  // Derived from darwin_arch spec.
188002633b541b04ad5ffc1c70f4c2feeeb13e607057Daniel Dunbar  CmdArgs.push_back("-arch");
1881eeff406730f50afd973f005a8d501a19af4785e5Daniel Dunbar  CmdArgs.push_back(Args.MakeArgString(ArchName));
188278dbd580a02759bbc408dbefb6754afa71b2c24cDaniel Dunbar
1883eeff406730f50afd973f005a8d501a19af4785e5Daniel Dunbar  // FIXME: Is this needed anymore?
1884eeff406730f50afd973f005a8d501a19af4785e5Daniel Dunbar  if (ArchName == "arm")
188578dbd580a02759bbc408dbefb6754afa71b2c24cDaniel Dunbar    CmdArgs.push_back("-force_cpusubtype_ALL");
188602633b541b04ad5ffc1c70f4c2feeeb13e607057Daniel Dunbar}
188702633b541b04ad5ffc1c70f4c2feeeb13e607057Daniel Dunbar
1888c21c485b4fb58ef5d55cf3e523263dd824a2ace4Daniel Dunbarvoid darwin::Link::AddLinkArgs(const ArgList &Args,
188902633b541b04ad5ffc1c70f4c2feeeb13e607057Daniel Dunbar                               ArgStringList &CmdArgs) const {
1890ee788e70fcd0adf76103b17c78ac658d4ea30c9bDaniel Dunbar  const Driver &D = getToolChain().getDriver();
189102633b541b04ad5ffc1c70f4c2feeeb13e607057Daniel Dunbar
189202633b541b04ad5ffc1c70f4c2feeeb13e607057Daniel Dunbar  // Derived from the "link" spec.
189302633b541b04ad5ffc1c70f4c2feeeb13e607057Daniel Dunbar  Args.AddAllArgs(CmdArgs, options::OPT_static);
189402633b541b04ad5ffc1c70f4c2feeeb13e607057Daniel Dunbar  if (!Args.hasArg(options::OPT_static))
189502633b541b04ad5ffc1c70f4c2feeeb13e607057Daniel Dunbar    CmdArgs.push_back("-dynamic");
189602633b541b04ad5ffc1c70f4c2feeeb13e607057Daniel Dunbar  if (Args.hasArg(options::OPT_fgnu_runtime)) {
189702633b541b04ad5ffc1c70f4c2feeeb13e607057Daniel Dunbar    // FIXME: gcc replaces -lobjc in forward args with -lobjc-gnu
189802633b541b04ad5ffc1c70f4c2feeeb13e607057Daniel Dunbar    // here. How do we wish to handle such things?
189902633b541b04ad5ffc1c70f4c2feeeb13e607057Daniel Dunbar  }
1900c21c485b4fb58ef5d55cf3e523263dd824a2ace4Daniel Dunbar
190102633b541b04ad5ffc1c70f4c2feeeb13e607057Daniel Dunbar  if (!Args.hasArg(options::OPT_dynamiclib)) {
1902a6d38494d18e260958e73bfe5e2b3f1dc4160459Daniel Dunbar    AddDarwinArch(Args, CmdArgs);
1903a6d38494d18e260958e73bfe5e2b3f1dc4160459Daniel Dunbar    // FIXME: Why do this only on this path?
19048917dd4457affb8750c81f08cbc21902a36cff26Daniel Dunbar    Args.AddLastArg(CmdArgs, options::OPT_force__cpusubtype__ALL);
190502633b541b04ad5ffc1c70f4c2feeeb13e607057Daniel Dunbar
190602633b541b04ad5ffc1c70f4c2feeeb13e607057Daniel Dunbar    Args.AddLastArg(CmdArgs, options::OPT_bundle);
190702633b541b04ad5ffc1c70f4c2feeeb13e607057Daniel Dunbar    Args.AddAllArgs(CmdArgs, options::OPT_bundle__loader);
190802633b541b04ad5ffc1c70f4c2feeeb13e607057Daniel Dunbar    Args.AddAllArgs(CmdArgs, options::OPT_client__name);
190902633b541b04ad5ffc1c70f4c2feeeb13e607057Daniel Dunbar
191002633b541b04ad5ffc1c70f4c2feeeb13e607057Daniel Dunbar    Arg *A;
191102633b541b04ad5ffc1c70f4c2feeeb13e607057Daniel Dunbar    if ((A = Args.getLastArg(options::OPT_compatibility__version)) ||
191202633b541b04ad5ffc1c70f4c2feeeb13e607057Daniel Dunbar        (A = Args.getLastArg(options::OPT_current__version)) ||
191302633b541b04ad5ffc1c70f4c2feeeb13e607057Daniel Dunbar        (A = Args.getLastArg(options::OPT_install__name)))
191402633b541b04ad5ffc1c70f4c2feeeb13e607057Daniel Dunbar      D.Diag(clang::diag::err_drv_argument_only_allowed_with)
191502633b541b04ad5ffc1c70f4c2feeeb13e607057Daniel Dunbar        << A->getAsString(Args) << "-dynamiclib";
191602633b541b04ad5ffc1c70f4c2feeeb13e607057Daniel Dunbar
191702633b541b04ad5ffc1c70f4c2feeeb13e607057Daniel Dunbar    Args.AddLastArg(CmdArgs, options::OPT_force__flat__namespace);
191802633b541b04ad5ffc1c70f4c2feeeb13e607057Daniel Dunbar    Args.AddLastArg(CmdArgs, options::OPT_keep__private__externs);
191902633b541b04ad5ffc1c70f4c2feeeb13e607057Daniel Dunbar    Args.AddLastArg(CmdArgs, options::OPT_private__bundle);
192002633b541b04ad5ffc1c70f4c2feeeb13e607057Daniel Dunbar  } else {
192102633b541b04ad5ffc1c70f4c2feeeb13e607057Daniel Dunbar    CmdArgs.push_back("-dylib");
192202633b541b04ad5ffc1c70f4c2feeeb13e607057Daniel Dunbar
192302633b541b04ad5ffc1c70f4c2feeeb13e607057Daniel Dunbar    Arg *A;
192402633b541b04ad5ffc1c70f4c2feeeb13e607057Daniel Dunbar    if ((A = Args.getLastArg(options::OPT_bundle)) ||
192502633b541b04ad5ffc1c70f4c2feeeb13e607057Daniel Dunbar        (A = Args.getLastArg(options::OPT_bundle__loader)) ||
192602633b541b04ad5ffc1c70f4c2feeeb13e607057Daniel Dunbar        (A = Args.getLastArg(options::OPT_client__name)) ||
192702633b541b04ad5ffc1c70f4c2feeeb13e607057Daniel Dunbar        (A = Args.getLastArg(options::OPT_force__flat__namespace)) ||
192802633b541b04ad5ffc1c70f4c2feeeb13e607057Daniel Dunbar        (A = Args.getLastArg(options::OPT_keep__private__externs)) ||
192902633b541b04ad5ffc1c70f4c2feeeb13e607057Daniel Dunbar        (A = Args.getLastArg(options::OPT_private__bundle)))
193002633b541b04ad5ffc1c70f4c2feeeb13e607057Daniel Dunbar      D.Diag(clang::diag::err_drv_argument_not_allowed_with)
193102633b541b04ad5ffc1c70f4c2feeeb13e607057Daniel Dunbar        << A->getAsString(Args) << "-dynamiclib";
1932c21c485b4fb58ef5d55cf3e523263dd824a2ace4Daniel Dunbar
193302633b541b04ad5ffc1c70f4c2feeeb13e607057Daniel Dunbar    Args.AddAllArgsTranslated(CmdArgs, options::OPT_compatibility__version,
193402633b541b04ad5ffc1c70f4c2feeeb13e607057Daniel Dunbar                              "-dylib_compatibility_version");
193502633b541b04ad5ffc1c70f4c2feeeb13e607057Daniel Dunbar    Args.AddAllArgsTranslated(CmdArgs, options::OPT_current__version,
193602633b541b04ad5ffc1c70f4c2feeeb13e607057Daniel Dunbar                              "-dylib_current_version");
193702633b541b04ad5ffc1c70f4c2feeeb13e607057Daniel Dunbar
1938a6d38494d18e260958e73bfe5e2b3f1dc4160459Daniel Dunbar    AddDarwinArch(Args, CmdArgs);
193902633b541b04ad5ffc1c70f4c2feeeb13e607057Daniel Dunbar
194002633b541b04ad5ffc1c70f4c2feeeb13e607057Daniel Dunbar    Args.AddAllArgsTranslated(CmdArgs, options::OPT_install__name,
194102633b541b04ad5ffc1c70f4c2feeeb13e607057Daniel Dunbar                              "-dylib_install_name");
194202633b541b04ad5ffc1c70f4c2feeeb13e607057Daniel Dunbar  }
194302633b541b04ad5ffc1c70f4c2feeeb13e607057Daniel Dunbar
194402633b541b04ad5ffc1c70f4c2feeeb13e607057Daniel Dunbar  Args.AddLastArg(CmdArgs, options::OPT_all__load);
194502633b541b04ad5ffc1c70f4c2feeeb13e607057Daniel Dunbar  Args.AddAllArgs(CmdArgs, options::OPT_allowable__client);
194602633b541b04ad5ffc1c70f4c2feeeb13e607057Daniel Dunbar  Args.AddLastArg(CmdArgs, options::OPT_bind__at__load);
1947251ca6c9fb2bb398d9bf9fe7399c27bed7074b5cDaniel Dunbar  if (getDarwinToolChain().isTargetIPhoneOS())
1948d82f8fa53771b454885c546f0fd452a4980b3a3eDaniel Dunbar    Args.AddLastArg(CmdArgs, options::OPT_arch__errors__fatal);
194902633b541b04ad5ffc1c70f4c2feeeb13e607057Daniel Dunbar  Args.AddLastArg(CmdArgs, options::OPT_dead__strip);
195002633b541b04ad5ffc1c70f4c2feeeb13e607057Daniel Dunbar  Args.AddLastArg(CmdArgs, options::OPT_no__dead__strip__inits__and__terms);
195102633b541b04ad5ffc1c70f4c2feeeb13e607057Daniel Dunbar  Args.AddAllArgs(CmdArgs, options::OPT_dylib__file);
195202633b541b04ad5ffc1c70f4c2feeeb13e607057Daniel Dunbar  Args.AddLastArg(CmdArgs, options::OPT_dynamic);
195302633b541b04ad5ffc1c70f4c2feeeb13e607057Daniel Dunbar  Args.AddAllArgs(CmdArgs, options::OPT_exported__symbols__list);
195402633b541b04ad5ffc1c70f4c2feeeb13e607057Daniel Dunbar  Args.AddLastArg(CmdArgs, options::OPT_flat__namespace);
195502633b541b04ad5ffc1c70f4c2feeeb13e607057Daniel Dunbar  Args.AddAllArgs(CmdArgs, options::OPT_headerpad__max__install__names);
195602633b541b04ad5ffc1c70f4c2feeeb13e607057Daniel Dunbar  Args.AddAllArgs(CmdArgs, options::OPT_image__base);
195702633b541b04ad5ffc1c70f4c2feeeb13e607057Daniel Dunbar  Args.AddAllArgs(CmdArgs, options::OPT_init);
195802633b541b04ad5ffc1c70f4c2feeeb13e607057Daniel Dunbar
1959314cba02728c451c783b38bf6c00f220afb193c8Daniel Dunbar  // Adding all arguments doesn't make sense here but this is what gcc does. One
1960314cba02728c451c783b38bf6c00f220afb193c8Daniel Dunbar  // of this should always be present thanks to argument translation.
1961314cba02728c451c783b38bf6c00f220afb193c8Daniel Dunbar  assert((Args.hasArg(options::OPT_mmacosx_version_min_EQ) ||
1962314cba02728c451c783b38bf6c00f220afb193c8Daniel Dunbar          Args.hasArg(options::OPT_miphoneos_version_min_EQ)) &&
1963314cba02728c451c783b38bf6c00f220afb193c8Daniel Dunbar         "Missing version argument (lost in translation)?");
196430392de4681602f1aabc61b0184b1de53bc172f0Daniel Dunbar  Args.AddAllArgsTranslated(CmdArgs, options::OPT_mmacosx_version_min_EQ,
1965294691eb1caf551083acd7b08630ef21c3fd760dDaniel Dunbar                            "-macosx_version_min");
196602633b541b04ad5ffc1c70f4c2feeeb13e607057Daniel Dunbar  Args.AddAllArgsTranslated(CmdArgs, options::OPT_miphoneos_version_min_EQ,
196702633b541b04ad5ffc1c70f4c2feeeb13e607057Daniel Dunbar                            "-iphoneos_version_min");
196802633b541b04ad5ffc1c70f4c2feeeb13e607057Daniel Dunbar  Args.AddLastArg(CmdArgs, options::OPT_nomultidefs);
196902633b541b04ad5ffc1c70f4c2feeeb13e607057Daniel Dunbar  Args.AddLastArg(CmdArgs, options::OPT_multi__module);
197002633b541b04ad5ffc1c70f4c2feeeb13e607057Daniel Dunbar  Args.AddLastArg(CmdArgs, options::OPT_single__module);
197102633b541b04ad5ffc1c70f4c2feeeb13e607057Daniel Dunbar  Args.AddAllArgs(CmdArgs, options::OPT_multiply__defined);
197202633b541b04ad5ffc1c70f4c2feeeb13e607057Daniel Dunbar  Args.AddAllArgs(CmdArgs, options::OPT_multiply__defined__unused);
1973c21c485b4fb58ef5d55cf3e523263dd824a2ace4Daniel Dunbar
197402633b541b04ad5ffc1c70f4c2feeeb13e607057Daniel Dunbar  if (Args.hasArg(options::OPT_fpie))
197502633b541b04ad5ffc1c70f4c2feeeb13e607057Daniel Dunbar    CmdArgs.push_back("-pie");
197602633b541b04ad5ffc1c70f4c2feeeb13e607057Daniel Dunbar
197702633b541b04ad5ffc1c70f4c2feeeb13e607057Daniel Dunbar  Args.AddLastArg(CmdArgs, options::OPT_prebind);
197802633b541b04ad5ffc1c70f4c2feeeb13e607057Daniel Dunbar  Args.AddLastArg(CmdArgs, options::OPT_noprebind);
197902633b541b04ad5ffc1c70f4c2feeeb13e607057Daniel Dunbar  Args.AddLastArg(CmdArgs, options::OPT_nofixprebinding);
198002633b541b04ad5ffc1c70f4c2feeeb13e607057Daniel Dunbar  Args.AddLastArg(CmdArgs, options::OPT_prebind__all__twolevel__modules);
198102633b541b04ad5ffc1c70f4c2feeeb13e607057Daniel Dunbar  Args.AddLastArg(CmdArgs, options::OPT_read__only__relocs);
198202633b541b04ad5ffc1c70f4c2feeeb13e607057Daniel Dunbar  Args.AddAllArgs(CmdArgs, options::OPT_sectcreate);
198302633b541b04ad5ffc1c70f4c2feeeb13e607057Daniel Dunbar  Args.AddAllArgs(CmdArgs, options::OPT_sectorder);
198402633b541b04ad5ffc1c70f4c2feeeb13e607057Daniel Dunbar  Args.AddAllArgs(CmdArgs, options::OPT_seg1addr);
198502633b541b04ad5ffc1c70f4c2feeeb13e607057Daniel Dunbar  Args.AddAllArgs(CmdArgs, options::OPT_segprot);
198602633b541b04ad5ffc1c70f4c2feeeb13e607057Daniel Dunbar  Args.AddAllArgs(CmdArgs, options::OPT_segaddr);
198702633b541b04ad5ffc1c70f4c2feeeb13e607057Daniel Dunbar  Args.AddAllArgs(CmdArgs, options::OPT_segs__read__only__addr);
198802633b541b04ad5ffc1c70f4c2feeeb13e607057Daniel Dunbar  Args.AddAllArgs(CmdArgs, options::OPT_segs__read__write__addr);
198902633b541b04ad5ffc1c70f4c2feeeb13e607057Daniel Dunbar  Args.AddAllArgs(CmdArgs, options::OPT_seg__addr__table);
199002633b541b04ad5ffc1c70f4c2feeeb13e607057Daniel Dunbar  Args.AddAllArgs(CmdArgs, options::OPT_seg__addr__table__filename);
199102633b541b04ad5ffc1c70f4c2feeeb13e607057Daniel Dunbar  Args.AddAllArgs(CmdArgs, options::OPT_sub__library);
199202633b541b04ad5ffc1c70f4c2feeeb13e607057Daniel Dunbar  Args.AddAllArgs(CmdArgs, options::OPT_sub__umbrella);
1993d82f8fa53771b454885c546f0fd452a4980b3a3eDaniel Dunbar
199402633b541b04ad5ffc1c70f4c2feeeb13e607057Daniel Dunbar  Args.AddAllArgsTranslated(CmdArgs, options::OPT_isysroot, "-syslibroot");
1995251ca6c9fb2bb398d9bf9fe7399c27bed7074b5cDaniel Dunbar  if (getDarwinToolChain().isTargetIPhoneOS()) {
1996d82f8fa53771b454885c546f0fd452a4980b3a3eDaniel Dunbar    if (!Args.hasArg(options::OPT_isysroot)) {
1997d82f8fa53771b454885c546f0fd452a4980b3a3eDaniel Dunbar      CmdArgs.push_back("-syslibroot");
1998d82f8fa53771b454885c546f0fd452a4980b3a3eDaniel Dunbar      CmdArgs.push_back("/Developer/SDKs/Extra");
1999d82f8fa53771b454885c546f0fd452a4980b3a3eDaniel Dunbar    }
2000d82f8fa53771b454885c546f0fd452a4980b3a3eDaniel Dunbar  }
2001d82f8fa53771b454885c546f0fd452a4980b3a3eDaniel Dunbar
200202633b541b04ad5ffc1c70f4c2feeeb13e607057Daniel Dunbar  Args.AddLastArg(CmdArgs, options::OPT_twolevel__namespace);
200302633b541b04ad5ffc1c70f4c2feeeb13e607057Daniel Dunbar  Args.AddLastArg(CmdArgs, options::OPT_twolevel__namespace__hints);
200402633b541b04ad5ffc1c70f4c2feeeb13e607057Daniel Dunbar  Args.AddAllArgs(CmdArgs, options::OPT_umbrella);
200502633b541b04ad5ffc1c70f4c2feeeb13e607057Daniel Dunbar  Args.AddAllArgs(CmdArgs, options::OPT_undefined);
200602633b541b04ad5ffc1c70f4c2feeeb13e607057Daniel Dunbar  Args.AddAllArgs(CmdArgs, options::OPT_unexported__symbols__list);
2007d82f8fa53771b454885c546f0fd452a4980b3a3eDaniel Dunbar  Args.AddAllArgs(CmdArgs, options::OPT_weak__reference__mismatches);
200802633b541b04ad5ffc1c70f4c2feeeb13e607057Daniel Dunbar  Args.AddLastArg(CmdArgs, options::OPT_X_Flag);
200902633b541b04ad5ffc1c70f4c2feeeb13e607057Daniel Dunbar  Args.AddAllArgs(CmdArgs, options::OPT_y);
201002633b541b04ad5ffc1c70f4c2feeeb13e607057Daniel Dunbar  Args.AddLastArg(CmdArgs, options::OPT_w);
201102633b541b04ad5ffc1c70f4c2feeeb13e607057Daniel Dunbar  Args.AddAllArgs(CmdArgs, options::OPT_pagezero__size);
201202633b541b04ad5ffc1c70f4c2feeeb13e607057Daniel Dunbar  Args.AddAllArgs(CmdArgs, options::OPT_segs__read__);
201302633b541b04ad5ffc1c70f4c2feeeb13e607057Daniel Dunbar  Args.AddLastArg(CmdArgs, options::OPT_seglinkedit);
201402633b541b04ad5ffc1c70f4c2feeeb13e607057Daniel Dunbar  Args.AddLastArg(CmdArgs, options::OPT_noseglinkedit);
201502633b541b04ad5ffc1c70f4c2feeeb13e607057Daniel Dunbar  Args.AddAllArgs(CmdArgs, options::OPT_sectalign);
201602633b541b04ad5ffc1c70f4c2feeeb13e607057Daniel Dunbar  Args.AddAllArgs(CmdArgs, options::OPT_sectobjectsymbols);
201702633b541b04ad5ffc1c70f4c2feeeb13e607057Daniel Dunbar  Args.AddAllArgs(CmdArgs, options::OPT_segcreate);
201802633b541b04ad5ffc1c70f4c2feeeb13e607057Daniel Dunbar  Args.AddLastArg(CmdArgs, options::OPT_whyload);
201902633b541b04ad5ffc1c70f4c2feeeb13e607057Daniel Dunbar  Args.AddLastArg(CmdArgs, options::OPT_whatsloaded);
202002633b541b04ad5ffc1c70f4c2feeeb13e607057Daniel Dunbar  Args.AddAllArgs(CmdArgs, options::OPT_dylinker__install__name);
202102633b541b04ad5ffc1c70f4c2feeeb13e607057Daniel Dunbar  Args.AddLastArg(CmdArgs, options::OPT_dylinker);
202202633b541b04ad5ffc1c70f4c2feeeb13e607057Daniel Dunbar  Args.AddLastArg(CmdArgs, options::OPT_Mach);
202302633b541b04ad5ffc1c70f4c2feeeb13e607057Daniel Dunbar}
202402633b541b04ad5ffc1c70f4c2feeeb13e607057Daniel Dunbar
202502633b541b04ad5ffc1c70f4c2feeeb13e607057Daniel Dunbarvoid darwin::Link::ConstructJob(Compilation &C, const JobAction &JA,
2026c21c485b4fb58ef5d55cf3e523263dd824a2ace4Daniel Dunbar                                Job &Dest, const InputInfo &Output,
2027c21c485b4fb58ef5d55cf3e523263dd824a2ace4Daniel Dunbar                                const InputInfoList &Inputs,
2028c21c485b4fb58ef5d55cf3e523263dd824a2ace4Daniel Dunbar                                const ArgList &Args,
202902633b541b04ad5ffc1c70f4c2feeeb13e607057Daniel Dunbar                                const char *LinkingOutput) const {
203002633b541b04ad5ffc1c70f4c2feeeb13e607057Daniel Dunbar  assert(Output.getType() == types::TY_Image && "Invalid linker output type.");
2031e0be8b1729d8978de433d229c065830b95d0ae68Daniel Dunbar
203202633b541b04ad5ffc1c70f4c2feeeb13e607057Daniel Dunbar  // The logic here is derived from gcc's behavior; most of which
203302633b541b04ad5ffc1c70f4c2feeeb13e607057Daniel Dunbar  // comes from specs (starting with link_command). Consult gcc for
203402633b541b04ad5ffc1c70f4c2feeeb13e607057Daniel Dunbar  // more information.
203502633b541b04ad5ffc1c70f4c2feeeb13e607057Daniel Dunbar  ArgStringList CmdArgs;
203602633b541b04ad5ffc1c70f4c2feeeb13e607057Daniel Dunbar
203702633b541b04ad5ffc1c70f4c2feeeb13e607057Daniel Dunbar  // I'm not sure why this particular decomposition exists in gcc, but
203802633b541b04ad5ffc1c70f4c2feeeb13e607057Daniel Dunbar  // we follow suite for ease of comparison.
203902633b541b04ad5ffc1c70f4c2feeeb13e607057Daniel Dunbar  AddLinkArgs(Args, CmdArgs);
204002633b541b04ad5ffc1c70f4c2feeeb13e607057Daniel Dunbar
204102633b541b04ad5ffc1c70f4c2feeeb13e607057Daniel Dunbar  Args.AddAllArgs(CmdArgs, options::OPT_d_Flag);
204202633b541b04ad5ffc1c70f4c2feeeb13e607057Daniel Dunbar  Args.AddAllArgs(CmdArgs, options::OPT_s);
204302633b541b04ad5ffc1c70f4c2feeeb13e607057Daniel Dunbar  Args.AddAllArgs(CmdArgs, options::OPT_t);
204402633b541b04ad5ffc1c70f4c2feeeb13e607057Daniel Dunbar  Args.AddAllArgs(CmdArgs, options::OPT_Z_Flag);
204502633b541b04ad5ffc1c70f4c2feeeb13e607057Daniel Dunbar  Args.AddAllArgs(CmdArgs, options::OPT_u_Group);
204602633b541b04ad5ffc1c70f4c2feeeb13e607057Daniel Dunbar  Args.AddAllArgs(CmdArgs, options::OPT_A);
204702633b541b04ad5ffc1c70f4c2feeeb13e607057Daniel Dunbar  Args.AddLastArg(CmdArgs, options::OPT_e);
204802633b541b04ad5ffc1c70f4c2feeeb13e607057Daniel Dunbar  Args.AddAllArgs(CmdArgs, options::OPT_m_Separate);
204902633b541b04ad5ffc1c70f4c2feeeb13e607057Daniel Dunbar  Args.AddAllArgs(CmdArgs, options::OPT_r);
205002633b541b04ad5ffc1c70f4c2feeeb13e607057Daniel Dunbar
205102633b541b04ad5ffc1c70f4c2feeeb13e607057Daniel Dunbar  CmdArgs.push_back("-o");
205202633b541b04ad5ffc1c70f4c2feeeb13e607057Daniel Dunbar  CmdArgs.push_back(Output.getFilename());
205302633b541b04ad5ffc1c70f4c2feeeb13e607057Daniel Dunbar
205402633b541b04ad5ffc1c70f4c2feeeb13e607057Daniel Dunbar  if (!Args.hasArg(options::OPT_A) &&
205502633b541b04ad5ffc1c70f4c2feeeb13e607057Daniel Dunbar      !Args.hasArg(options::OPT_nostdlib) &&
205602633b541b04ad5ffc1c70f4c2feeeb13e607057Daniel Dunbar      !Args.hasArg(options::OPT_nostartfiles)) {
205702633b541b04ad5ffc1c70f4c2feeeb13e607057Daniel Dunbar    // Derived from startfile spec.
205802633b541b04ad5ffc1c70f4c2feeeb13e607057Daniel Dunbar    if (Args.hasArg(options::OPT_dynamiclib)) {
2059c21c485b4fb58ef5d55cf3e523263dd824a2ace4Daniel Dunbar      // Derived from darwin_dylib1 spec.
2060cacb0f007001f7463d44ebd5dde7bfaecf876a71Daniel Dunbar      if (getDarwinToolChain().isTargetIPhoneOS()) {
2061cacb0f007001f7463d44ebd5dde7bfaecf876a71Daniel Dunbar        if (getDarwinToolChain().isIPhoneOSVersionLT(3, 1))
2062cacb0f007001f7463d44ebd5dde7bfaecf876a71Daniel Dunbar          CmdArgs.push_back("-ldylib1.o");
2063cacb0f007001f7463d44ebd5dde7bfaecf876a71Daniel Dunbar      } else {
2064ce3fdf233353b10f20d74dceda3d77a82285de17Daniel Dunbar        if (getDarwinToolChain().isMacosxVersionLT(10, 5))
2065cacb0f007001f7463d44ebd5dde7bfaecf876a71Daniel Dunbar          CmdArgs.push_back("-ldylib1.o");
2066ce3fdf233353b10f20d74dceda3d77a82285de17Daniel Dunbar        else if (getDarwinToolChain().isMacosxVersionLT(10, 6))
2067cacb0f007001f7463d44ebd5dde7bfaecf876a71Daniel Dunbar          CmdArgs.push_back("-ldylib1.10.5.o");
2068cacb0f007001f7463d44ebd5dde7bfaecf876a71Daniel Dunbar      }
206902633b541b04ad5ffc1c70f4c2feeeb13e607057Daniel Dunbar    } else {
207002633b541b04ad5ffc1c70f4c2feeeb13e607057Daniel Dunbar      if (Args.hasArg(options::OPT_bundle)) {
20718a8d8afa3df40e9f122d2b826f1a825a66f6908dDaniel Dunbar        if (!Args.hasArg(options::OPT_static)) {
20728a8d8afa3df40e9f122d2b826f1a825a66f6908dDaniel Dunbar          // Derived from darwin_bundle1 spec.
2073cacb0f007001f7463d44ebd5dde7bfaecf876a71Daniel Dunbar          if (getDarwinToolChain().isTargetIPhoneOS()) {
2074cacb0f007001f7463d44ebd5dde7bfaecf876a71Daniel Dunbar            if (getDarwinToolChain().isIPhoneOSVersionLT(3, 1))
2075cacb0f007001f7463d44ebd5dde7bfaecf876a71Daniel Dunbar              CmdArgs.push_back("-lbundle1.o");
2076cacb0f007001f7463d44ebd5dde7bfaecf876a71Daniel Dunbar          } else {
2077ce3fdf233353b10f20d74dceda3d77a82285de17Daniel Dunbar            if (getDarwinToolChain().isMacosxVersionLT(10, 6))
2078cacb0f007001f7463d44ebd5dde7bfaecf876a71Daniel Dunbar              CmdArgs.push_back("-lbundle1.o");
2079cacb0f007001f7463d44ebd5dde7bfaecf876a71Daniel Dunbar          }
20808a8d8afa3df40e9f122d2b826f1a825a66f6908dDaniel Dunbar        }
208102633b541b04ad5ffc1c70f4c2feeeb13e607057Daniel Dunbar      } else {
208202633b541b04ad5ffc1c70f4c2feeeb13e607057Daniel Dunbar        if (Args.hasArg(options::OPT_pg)) {
208302633b541b04ad5ffc1c70f4c2feeeb13e607057Daniel Dunbar          if (Args.hasArg(options::OPT_static) ||
208402633b541b04ad5ffc1c70f4c2feeeb13e607057Daniel Dunbar              Args.hasArg(options::OPT_object) ||
208502633b541b04ad5ffc1c70f4c2feeeb13e607057Daniel Dunbar              Args.hasArg(options::OPT_preload)) {
208602633b541b04ad5ffc1c70f4c2feeeb13e607057Daniel Dunbar            CmdArgs.push_back("-lgcrt0.o");
208702633b541b04ad5ffc1c70f4c2feeeb13e607057Daniel Dunbar          } else {
208802633b541b04ad5ffc1c70f4c2feeeb13e607057Daniel Dunbar            CmdArgs.push_back("-lgcrt1.o");
2089c21c485b4fb58ef5d55cf3e523263dd824a2ace4Daniel Dunbar
209002633b541b04ad5ffc1c70f4c2feeeb13e607057Daniel Dunbar            // darwin_crt2 spec is empty.
2091c21c485b4fb58ef5d55cf3e523263dd824a2ace4Daniel Dunbar          }
209202633b541b04ad5ffc1c70f4c2feeeb13e607057Daniel Dunbar        } else {
209302633b541b04ad5ffc1c70f4c2feeeb13e607057Daniel Dunbar          if (Args.hasArg(options::OPT_static) ||
209402633b541b04ad5ffc1c70f4c2feeeb13e607057Daniel Dunbar              Args.hasArg(options::OPT_object) ||
209502633b541b04ad5ffc1c70f4c2feeeb13e607057Daniel Dunbar              Args.hasArg(options::OPT_preload)) {
209602633b541b04ad5ffc1c70f4c2feeeb13e607057Daniel Dunbar            CmdArgs.push_back("-lcrt0.o");
209702633b541b04ad5ffc1c70f4c2feeeb13e607057Daniel Dunbar          } else {
209802633b541b04ad5ffc1c70f4c2feeeb13e607057Daniel Dunbar            // Derived from darwin_crt1 spec.
2099251ca6c9fb2bb398d9bf9fe7399c27bed7074b5cDaniel Dunbar            if (getDarwinToolChain().isTargetIPhoneOS()) {
2100cacb0f007001f7463d44ebd5dde7bfaecf876a71Daniel Dunbar              if (getDarwinToolChain().isIPhoneOSVersionLT(3, 1))
2101cacb0f007001f7463d44ebd5dde7bfaecf876a71Daniel Dunbar                CmdArgs.push_back("-lcrt1.o");
2102cacb0f007001f7463d44ebd5dde7bfaecf876a71Daniel Dunbar              else
2103cacb0f007001f7463d44ebd5dde7bfaecf876a71Daniel Dunbar                CmdArgs.push_back("-lcrt1.3.1.o");
2104ce3fdf233353b10f20d74dceda3d77a82285de17Daniel Dunbar            } else {
2105ce3fdf233353b10f20d74dceda3d77a82285de17Daniel Dunbar              if (getDarwinToolChain().isMacosxVersionLT(10, 5))
2106ce3fdf233353b10f20d74dceda3d77a82285de17Daniel Dunbar                CmdArgs.push_back("-lcrt1.o");
2107ce3fdf233353b10f20d74dceda3d77a82285de17Daniel Dunbar              else if (getDarwinToolChain().isMacosxVersionLT(10, 6))
2108ce3fdf233353b10f20d74dceda3d77a82285de17Daniel Dunbar                CmdArgs.push_back("-lcrt1.10.5.o");
2109ce3fdf233353b10f20d74dceda3d77a82285de17Daniel Dunbar              else
2110ce3fdf233353b10f20d74dceda3d77a82285de17Daniel Dunbar                CmdArgs.push_back("-lcrt1.10.6.o");
2111c21c485b4fb58ef5d55cf3e523263dd824a2ace4Daniel Dunbar
2112ce3fdf233353b10f20d74dceda3d77a82285de17Daniel Dunbar              // darwin_crt2 spec is empty.
2113ce3fdf233353b10f20d74dceda3d77a82285de17Daniel Dunbar            }
211402633b541b04ad5ffc1c70f4c2feeeb13e607057Daniel Dunbar          }
211502633b541b04ad5ffc1c70f4c2feeeb13e607057Daniel Dunbar        }
211602633b541b04ad5ffc1c70f4c2feeeb13e607057Daniel Dunbar      }
211702633b541b04ad5ffc1c70f4c2feeeb13e607057Daniel Dunbar    }
211802633b541b04ad5ffc1c70f4c2feeeb13e607057Daniel Dunbar
2119ce3fdf233353b10f20d74dceda3d77a82285de17Daniel Dunbar    if (!getDarwinToolChain().isTargetIPhoneOS() &&
2120ce3fdf233353b10f20d74dceda3d77a82285de17Daniel Dunbar        Args.hasArg(options::OPT_shared_libgcc) &&
2121ce3fdf233353b10f20d74dceda3d77a82285de17Daniel Dunbar        getDarwinToolChain().isMacosxVersionLT(10, 5)) {
2122881376467c46c5c6cc16fa6790271c2c22e1d4f1Daniel Dunbar      const char *Str =
21235ed34f4c58b6ad4e21038d713c1fae31a6146ff5Daniel Dunbar        Args.MakeArgString(getToolChain().GetFilePath(C, "crt3.o"));
2124881376467c46c5c6cc16fa6790271c2c22e1d4f1Daniel Dunbar      CmdArgs.push_back(Str);
212502633b541b04ad5ffc1c70f4c2feeeb13e607057Daniel Dunbar    }
212602633b541b04ad5ffc1c70f4c2feeeb13e607057Daniel Dunbar  }
212702633b541b04ad5ffc1c70f4c2feeeb13e607057Daniel Dunbar
212802633b541b04ad5ffc1c70f4c2feeeb13e607057Daniel Dunbar  Args.AddAllArgs(CmdArgs, options::OPT_L);
2129c21c485b4fb58ef5d55cf3e523263dd824a2ace4Daniel Dunbar
213002633b541b04ad5ffc1c70f4c2feeeb13e607057Daniel Dunbar  if (Args.hasArg(options::OPT_fopenmp))
213102633b541b04ad5ffc1c70f4c2feeeb13e607057Daniel Dunbar    // This is more complicated in gcc...
213202633b541b04ad5ffc1c70f4c2feeeb13e607057Daniel Dunbar    CmdArgs.push_back("-lgomp");
213302633b541b04ad5ffc1c70f4c2feeeb13e607057Daniel Dunbar
21346b200b2b698b6ac9e310f2225c69c85d28ae4fb0Daniel Dunbar  getDarwinToolChain().AddLinkSearchPathArgs(Args, CmdArgs);
2135c21c485b4fb58ef5d55cf3e523263dd824a2ace4Daniel Dunbar
213602633b541b04ad5ffc1c70f4c2feeeb13e607057Daniel Dunbar  for (InputInfoList::const_iterator
213702633b541b04ad5ffc1c70f4c2feeeb13e607057Daniel Dunbar         it = Inputs.begin(), ie = Inputs.end(); it != ie; ++it) {
213802633b541b04ad5ffc1c70f4c2feeeb13e607057Daniel Dunbar    const InputInfo &II = *it;
213902633b541b04ad5ffc1c70f4c2feeeb13e607057Daniel Dunbar    if (II.isFilename())
214002633b541b04ad5ffc1c70f4c2feeeb13e607057Daniel Dunbar      CmdArgs.push_back(II.getFilename());
2141c21c485b4fb58ef5d55cf3e523263dd824a2ace4Daniel Dunbar    else
214202633b541b04ad5ffc1c70f4c2feeeb13e607057Daniel Dunbar      II.getInputArg().renderAsInput(Args, CmdArgs);
214302633b541b04ad5ffc1c70f4c2feeeb13e607057Daniel Dunbar  }
214402633b541b04ad5ffc1c70f4c2feeeb13e607057Daniel Dunbar
214502633b541b04ad5ffc1c70f4c2feeeb13e607057Daniel Dunbar  if (LinkingOutput) {
214602633b541b04ad5ffc1c70f4c2feeeb13e607057Daniel Dunbar    CmdArgs.push_back("-arch_multiple");
214702633b541b04ad5ffc1c70f4c2feeeb13e607057Daniel Dunbar    CmdArgs.push_back("-final_output");
214802633b541b04ad5ffc1c70f4c2feeeb13e607057Daniel Dunbar    CmdArgs.push_back(LinkingOutput);
214902633b541b04ad5ffc1c70f4c2feeeb13e607057Daniel Dunbar  }
215002633b541b04ad5ffc1c70f4c2feeeb13e607057Daniel Dunbar
215102633b541b04ad5ffc1c70f4c2feeeb13e607057Daniel Dunbar  if (Args.hasArg(options::OPT_fprofile_arcs) ||
215202633b541b04ad5ffc1c70f4c2feeeb13e607057Daniel Dunbar      Args.hasArg(options::OPT_fprofile_generate) ||
215302633b541b04ad5ffc1c70f4c2feeeb13e607057Daniel Dunbar      Args.hasArg(options::OPT_fcreate_profile) ||
215402633b541b04ad5ffc1c70f4c2feeeb13e607057Daniel Dunbar      Args.hasArg(options::OPT_coverage))
215502633b541b04ad5ffc1c70f4c2feeeb13e607057Daniel Dunbar    CmdArgs.push_back("-lgcov");
2156c21c485b4fb58ef5d55cf3e523263dd824a2ace4Daniel Dunbar
215702633b541b04ad5ffc1c70f4c2feeeb13e607057Daniel Dunbar  if (Args.hasArg(options::OPT_fnested_functions))
215802633b541b04ad5ffc1c70f4c2feeeb13e607057Daniel Dunbar    CmdArgs.push_back("-allow_stack_execute");
2159c21c485b4fb58ef5d55cf3e523263dd824a2ace4Daniel Dunbar
216002633b541b04ad5ffc1c70f4c2feeeb13e607057Daniel Dunbar  if (!Args.hasArg(options::OPT_nostdlib) &&
216102633b541b04ad5ffc1c70f4c2feeeb13e607057Daniel Dunbar      !Args.hasArg(options::OPT_nodefaultlibs)) {
2162edfa02b85b186e9ea9e0c841539a77ed32ee9148Daniel Dunbar    // FIXME: g++ is more complicated here, it tries to put -lstdc++
2163edfa02b85b186e9ea9e0c841539a77ed32ee9148Daniel Dunbar    // before -lm, for example.
2164ee788e70fcd0adf76103b17c78ac658d4ea30c9bDaniel Dunbar    if (getToolChain().getDriver().CCCIsCXX)
2165edfa02b85b186e9ea9e0c841539a77ed32ee9148Daniel Dunbar      CmdArgs.push_back("-lstdc++");
2166edfa02b85b186e9ea9e0c841539a77ed32ee9148Daniel Dunbar
216702633b541b04ad5ffc1c70f4c2feeeb13e607057Daniel Dunbar    // link_ssp spec is empty.
216802633b541b04ad5ffc1c70f4c2feeeb13e607057Daniel Dunbar
21696cd4154b9088fa18ae05d11c0f3140fafd76c734Daniel Dunbar    // Let the tool chain choose which runtime library to link.
21706cd4154b9088fa18ae05d11c0f3140fafd76c734Daniel Dunbar    getDarwinToolChain().AddLinkRuntimeLibArgs(Args, CmdArgs);
217102633b541b04ad5ffc1c70f4c2feeeb13e607057Daniel Dunbar  }
217202633b541b04ad5ffc1c70f4c2feeeb13e607057Daniel Dunbar
217302633b541b04ad5ffc1c70f4c2feeeb13e607057Daniel Dunbar  if (!Args.hasArg(options::OPT_A) &&
217402633b541b04ad5ffc1c70f4c2feeeb13e607057Daniel Dunbar      !Args.hasArg(options::OPT_nostdlib) &&
217502633b541b04ad5ffc1c70f4c2feeeb13e607057Daniel Dunbar      !Args.hasArg(options::OPT_nostartfiles)) {
217602633b541b04ad5ffc1c70f4c2feeeb13e607057Daniel Dunbar    // endfile_spec is empty.
217702633b541b04ad5ffc1c70f4c2feeeb13e607057Daniel Dunbar  }
217802633b541b04ad5ffc1c70f4c2feeeb13e607057Daniel Dunbar
217902633b541b04ad5ffc1c70f4c2feeeb13e607057Daniel Dunbar  Args.AddAllArgs(CmdArgs, options::OPT_T_Group);
218002633b541b04ad5ffc1c70f4c2feeeb13e607057Daniel Dunbar  Args.AddAllArgs(CmdArgs, options::OPT_F);
218102633b541b04ad5ffc1c70f4c2feeeb13e607057Daniel Dunbar
2182c21c485b4fb58ef5d55cf3e523263dd824a2ace4Daniel Dunbar  const char *Exec =
21835ed34f4c58b6ad4e21038d713c1fae31a6146ff5Daniel Dunbar    Args.MakeArgString(getToolChain().GetProgramPath(C, "ld"));
2184daab7b1016f0a82fefa4f7be6e63c57c06b19ffcDaniel Dunbar  Dest.addCommand(new Command(JA, *this, Exec, CmdArgs));
218502633b541b04ad5ffc1c70f4c2feeeb13e607057Daniel Dunbar
21860b46e1b5389615a8d6641f4d7bf5415d29acfef3Daniel Dunbar  // Find the first non-empty base input (we want to ignore linker
21870b46e1b5389615a8d6641f4d7bf5415d29acfef3Daniel Dunbar  // inputs).
21880b46e1b5389615a8d6641f4d7bf5415d29acfef3Daniel Dunbar  const char *BaseInput = "";
21890b46e1b5389615a8d6641f4d7bf5415d29acfef3Daniel Dunbar  for (unsigned i = 0, e = Inputs.size(); i != e; ++i) {
21900b46e1b5389615a8d6641f4d7bf5415d29acfef3Daniel Dunbar    if (Inputs[i].getBaseInput()[0] != '\0') {
21910b46e1b5389615a8d6641f4d7bf5415d29acfef3Daniel Dunbar      BaseInput = Inputs[i].getBaseInput();
21920b46e1b5389615a8d6641f4d7bf5415d29acfef3Daniel Dunbar      break;
21930b46e1b5389615a8d6641f4d7bf5415d29acfef3Daniel Dunbar    }
21940b46e1b5389615a8d6641f4d7bf5415d29acfef3Daniel Dunbar  }
2195c21c485b4fb58ef5d55cf3e523263dd824a2ace4Daniel Dunbar
21963ed294522653323e4867a2eba03acc98a99e5479Daniel Dunbar  // Run dsymutil if we are making an executable in a single step.
21973ed294522653323e4867a2eba03acc98a99e5479Daniel Dunbar  //
21983ed294522653323e4867a2eba03acc98a99e5479Daniel Dunbar  // FIXME: Currently we don't want to do this when we are part of a
21993ed294522653323e4867a2eba03acc98a99e5479Daniel Dunbar  // universal build step, as this would end up creating stray temp
22003ed294522653323e4867a2eba03acc98a99e5479Daniel Dunbar  // files.
22013ed294522653323e4867a2eba03acc98a99e5479Daniel Dunbar  if (!LinkingOutput &&
22023ed294522653323e4867a2eba03acc98a99e5479Daniel Dunbar      Args.getLastArg(options::OPT_g_Group) &&
220302633b541b04ad5ffc1c70f4c2feeeb13e607057Daniel Dunbar      !Args.getLastArg(options::OPT_gstabs) &&
220402633b541b04ad5ffc1c70f4c2feeeb13e607057Daniel Dunbar      !Args.getLastArg(options::OPT_g0)) {
220502633b541b04ad5ffc1c70f4c2feeeb13e607057Daniel Dunbar    // FIXME: This is gross, but matches gcc. The test only considers
220602633b541b04ad5ffc1c70f4c2feeeb13e607057Daniel Dunbar    // the suffix (not the -x type), and then only of the first
22070b46e1b5389615a8d6641f4d7bf5415d29acfef3Daniel Dunbar    // source input. Awesome.
22080b46e1b5389615a8d6641f4d7bf5415d29acfef3Daniel Dunbar    const char *Suffix = strrchr(BaseInput, '.');
220902633b541b04ad5ffc1c70f4c2feeeb13e607057Daniel Dunbar    if (Suffix && isSourceSuffix(Suffix + 1)) {
2210c21c485b4fb58ef5d55cf3e523263dd824a2ace4Daniel Dunbar      const char *Exec =
22115ed34f4c58b6ad4e21038d713c1fae31a6146ff5Daniel Dunbar        Args.MakeArgString(getToolChain().GetProgramPath(C, "dsymutil"));
221202633b541b04ad5ffc1c70f4c2feeeb13e607057Daniel Dunbar      ArgStringList CmdArgs;
221302633b541b04ad5ffc1c70f4c2feeeb13e607057Daniel Dunbar      CmdArgs.push_back(Output.getFilename());
2214daab7b1016f0a82fefa4f7be6e63c57c06b19ffcDaniel Dunbar      C.getJobs().addCommand(new Command(JA, *this, Exec, CmdArgs));
221502633b541b04ad5ffc1c70f4c2feeeb13e607057Daniel Dunbar    }
221602633b541b04ad5ffc1c70f4c2feeeb13e607057Daniel Dunbar  }
221702633b541b04ad5ffc1c70f4c2feeeb13e607057Daniel Dunbar}
221802633b541b04ad5ffc1c70f4c2feeeb13e607057Daniel Dunbar
2219ff7488dc9a766f94daf54d81b03ab9160d0bfd88Daniel Dunbarvoid darwin::Lipo::ConstructJob(Compilation &C, const JobAction &JA,
2220c21c485b4fb58ef5d55cf3e523263dd824a2ace4Daniel Dunbar                                Job &Dest, const InputInfo &Output,
2221c21c485b4fb58ef5d55cf3e523263dd824a2ace4Daniel Dunbar                                const InputInfoList &Inputs,
2222c21c485b4fb58ef5d55cf3e523263dd824a2ace4Daniel Dunbar                                const ArgList &Args,
2223ff7488dc9a766f94daf54d81b03ab9160d0bfd88Daniel Dunbar                                const char *LinkingOutput) const {
2224ff7488dc9a766f94daf54d81b03ab9160d0bfd88Daniel Dunbar  ArgStringList CmdArgs;
2225ff7488dc9a766f94daf54d81b03ab9160d0bfd88Daniel Dunbar
2226ff7488dc9a766f94daf54d81b03ab9160d0bfd88Daniel Dunbar  CmdArgs.push_back("-create");
2227ff7488dc9a766f94daf54d81b03ab9160d0bfd88Daniel Dunbar  assert(Output.isFilename() && "Unexpected lipo output.");
2228a428df828ea4cc6916ea90dcd9fbbc840776d207Daniel Dunbar
2229a428df828ea4cc6916ea90dcd9fbbc840776d207Daniel Dunbar  CmdArgs.push_back("-output");
2230ff7488dc9a766f94daf54d81b03ab9160d0bfd88Daniel Dunbar  CmdArgs.push_back(Output.getFilename());
2231a428df828ea4cc6916ea90dcd9fbbc840776d207Daniel Dunbar
2232ff7488dc9a766f94daf54d81b03ab9160d0bfd88Daniel Dunbar  for (InputInfoList::const_iterator
2233ff7488dc9a766f94daf54d81b03ab9160d0bfd88Daniel Dunbar         it = Inputs.begin(), ie = Inputs.end(); it != ie; ++it) {
2234ff7488dc9a766f94daf54d81b03ab9160d0bfd88Daniel Dunbar    const InputInfo &II = *it;
2235ff7488dc9a766f94daf54d81b03ab9160d0bfd88Daniel Dunbar    assert(II.isFilename() && "Unexpected lipo input.");
2236ff7488dc9a766f94daf54d81b03ab9160d0bfd88Daniel Dunbar    CmdArgs.push_back(II.getFilename());
2237ff7488dc9a766f94daf54d81b03ab9160d0bfd88Daniel Dunbar  }
2238c21c485b4fb58ef5d55cf3e523263dd824a2ace4Daniel Dunbar  const char *Exec =
22395ed34f4c58b6ad4e21038d713c1fae31a6146ff5Daniel Dunbar    Args.MakeArgString(getToolChain().GetProgramPath(C, "lipo"));
2240daab7b1016f0a82fefa4f7be6e63c57c06b19ffcDaniel Dunbar  Dest.addCommand(new Command(JA, *this, Exec, CmdArgs));
2241ff7488dc9a766f94daf54d81b03ab9160d0bfd88Daniel Dunbar}
224268a31d406c6dc4382c700d1199b062de2aa7e1daDaniel Dunbar
2243e7925a075f110ab21afeae084670a155dea568e3Edward O'Callaghanvoid auroraux::Assemble::ConstructJob(Compilation &C, const JobAction &JA,
2244294691eb1caf551083acd7b08630ef21c3fd760dDaniel Dunbar                                      Job &Dest, const InputInfo &Output,
2245294691eb1caf551083acd7b08630ef21c3fd760dDaniel Dunbar                                      const InputInfoList &Inputs,
2246294691eb1caf551083acd7b08630ef21c3fd760dDaniel Dunbar                                      const ArgList &Args,
2247294691eb1caf551083acd7b08630ef21c3fd760dDaniel Dunbar                                      const char *LinkingOutput) const {
2248e7925a075f110ab21afeae084670a155dea568e3Edward O'Callaghan  ArgStringList CmdArgs;
2249e7925a075f110ab21afeae084670a155dea568e3Edward O'Callaghan
2250e7925a075f110ab21afeae084670a155dea568e3Edward O'Callaghan  Args.AddAllArgValues(CmdArgs, options::OPT_Wa_COMMA,
2251e7925a075f110ab21afeae084670a155dea568e3Edward O'Callaghan                       options::OPT_Xassembler);
2252e7925a075f110ab21afeae084670a155dea568e3Edward O'Callaghan
2253e7925a075f110ab21afeae084670a155dea568e3Edward O'Callaghan  CmdArgs.push_back("-o");
2254e7925a075f110ab21afeae084670a155dea568e3Edward O'Callaghan  if (Output.isPipe())
2255e7925a075f110ab21afeae084670a155dea568e3Edward O'Callaghan    CmdArgs.push_back("-");
2256e7925a075f110ab21afeae084670a155dea568e3Edward O'Callaghan  else
2257e7925a075f110ab21afeae084670a155dea568e3Edward O'Callaghan    CmdArgs.push_back(Output.getFilename());
2258e7925a075f110ab21afeae084670a155dea568e3Edward O'Callaghan
2259e7925a075f110ab21afeae084670a155dea568e3Edward O'Callaghan  for (InputInfoList::const_iterator
2260e7925a075f110ab21afeae084670a155dea568e3Edward O'Callaghan         it = Inputs.begin(), ie = Inputs.end(); it != ie; ++it) {
2261e7925a075f110ab21afeae084670a155dea568e3Edward O'Callaghan    const InputInfo &II = *it;
2262e7925a075f110ab21afeae084670a155dea568e3Edward O'Callaghan    if (II.isPipe())
2263e7925a075f110ab21afeae084670a155dea568e3Edward O'Callaghan      CmdArgs.push_back("-");
2264e7925a075f110ab21afeae084670a155dea568e3Edward O'Callaghan    else
2265e7925a075f110ab21afeae084670a155dea568e3Edward O'Callaghan      CmdArgs.push_back(II.getFilename());
2266e7925a075f110ab21afeae084670a155dea568e3Edward O'Callaghan  }
2267e7925a075f110ab21afeae084670a155dea568e3Edward O'Callaghan
2268e7925a075f110ab21afeae084670a155dea568e3Edward O'Callaghan  const char *Exec =
2269ff430e6d68d1bea07046adafa28a52b314eeaa88Edward O'Callaghan    Args.MakeArgString(getToolChain().GetProgramPath(C, "gas"));
2270daab7b1016f0a82fefa4f7be6e63c57c06b19ffcDaniel Dunbar  Dest.addCommand(new Command(JA, *this, Exec, CmdArgs));
2271e7925a075f110ab21afeae084670a155dea568e3Edward O'Callaghan}
2272e7925a075f110ab21afeae084670a155dea568e3Edward O'Callaghan
2273e7925a075f110ab21afeae084670a155dea568e3Edward O'Callaghanvoid auroraux::Link::ConstructJob(Compilation &C, const JobAction &JA,
2274294691eb1caf551083acd7b08630ef21c3fd760dDaniel Dunbar                                  Job &Dest, const InputInfo &Output,
2275294691eb1caf551083acd7b08630ef21c3fd760dDaniel Dunbar                                  const InputInfoList &Inputs,
2276294691eb1caf551083acd7b08630ef21c3fd760dDaniel Dunbar                                  const ArgList &Args,
2277294691eb1caf551083acd7b08630ef21c3fd760dDaniel Dunbar                                  const char *LinkingOutput) const {
2278ee788e70fcd0adf76103b17c78ac658d4ea30c9bDaniel Dunbar  const Driver &D = getToolChain().getDriver();
2279e7925a075f110ab21afeae084670a155dea568e3Edward O'Callaghan  ArgStringList CmdArgs;
2280e7925a075f110ab21afeae084670a155dea568e3Edward O'Callaghan
2281e7925a075f110ab21afeae084670a155dea568e3Edward O'Callaghan  if ((!Args.hasArg(options::OPT_nostdlib)) &&
2282294691eb1caf551083acd7b08630ef21c3fd760dDaniel Dunbar      (!Args.hasArg(options::OPT_shared))) {
2283e7925a075f110ab21afeae084670a155dea568e3Edward O'Callaghan    CmdArgs.push_back("-e");
22847adf94906e23eae295a006659c55eab9ffcf8b37Edward O'Callaghan    CmdArgs.push_back("_start");
2285e7925a075f110ab21afeae084670a155dea568e3Edward O'Callaghan  }
2286e7925a075f110ab21afeae084670a155dea568e3Edward O'Callaghan
2287e7925a075f110ab21afeae084670a155dea568e3Edward O'Callaghan  if (Args.hasArg(options::OPT_static)) {
2288e7925a075f110ab21afeae084670a155dea568e3Edward O'Callaghan    CmdArgs.push_back("-Bstatic");
22897adf94906e23eae295a006659c55eab9ffcf8b37Edward O'Callaghan    CmdArgs.push_back("-dn");
2290e7925a075f110ab21afeae084670a155dea568e3Edward O'Callaghan  } else {
22917adf94906e23eae295a006659c55eab9ffcf8b37Edward O'Callaghan//    CmdArgs.push_back("--eh-frame-hdr");
2292e7925a075f110ab21afeae084670a155dea568e3Edward O'Callaghan    CmdArgs.push_back("-Bdynamic");
2293e7925a075f110ab21afeae084670a155dea568e3Edward O'Callaghan    if (Args.hasArg(options::OPT_shared)) {
2294e7925a075f110ab21afeae084670a155dea568e3Edward O'Callaghan      CmdArgs.push_back("-shared");
2295e7925a075f110ab21afeae084670a155dea568e3Edward O'Callaghan    } else {
22963cecc19f606ba1000da885b8ff4c089abad224ddEdward O'Callaghan      CmdArgs.push_back("--dynamic-linker");
2297e7925a075f110ab21afeae084670a155dea568e3Edward O'Callaghan      CmdArgs.push_back("/lib/ld.so.1"); // 64Bit Path /lib/amd64/ld.so.1
2298e7925a075f110ab21afeae084670a155dea568e3Edward O'Callaghan    }
2299e7925a075f110ab21afeae084670a155dea568e3Edward O'Callaghan  }
2300e7925a075f110ab21afeae084670a155dea568e3Edward O'Callaghan
2301e7925a075f110ab21afeae084670a155dea568e3Edward O'Callaghan  if (Output.isPipe()) {
2302e7925a075f110ab21afeae084670a155dea568e3Edward O'Callaghan    CmdArgs.push_back("-o");
2303e7925a075f110ab21afeae084670a155dea568e3Edward O'Callaghan    CmdArgs.push_back("-");
2304e7925a075f110ab21afeae084670a155dea568e3Edward O'Callaghan  } else if (Output.isFilename()) {
2305e7925a075f110ab21afeae084670a155dea568e3Edward O'Callaghan    CmdArgs.push_back("-o");
2306e7925a075f110ab21afeae084670a155dea568e3Edward O'Callaghan    CmdArgs.push_back(Output.getFilename());
2307e7925a075f110ab21afeae084670a155dea568e3Edward O'Callaghan  } else {
2308e7925a075f110ab21afeae084670a155dea568e3Edward O'Callaghan    assert(Output.isNothing() && "Invalid output.");
2309e7925a075f110ab21afeae084670a155dea568e3Edward O'Callaghan  }
2310e7925a075f110ab21afeae084670a155dea568e3Edward O'Callaghan
2311e7925a075f110ab21afeae084670a155dea568e3Edward O'Callaghan  if (!Args.hasArg(options::OPT_nostdlib) &&
2312e7925a075f110ab21afeae084670a155dea568e3Edward O'Callaghan      !Args.hasArg(options::OPT_nostartfiles)) {
2313e7925a075f110ab21afeae084670a155dea568e3Edward O'Callaghan    if (!Args.hasArg(options::OPT_shared)) {
23147adf94906e23eae295a006659c55eab9ffcf8b37Edward O'Callaghan      CmdArgs.push_back(Args.MakeArgString(getToolChain().GetFilePath(C, "crt1.o")));
23157adf94906e23eae295a006659c55eab9ffcf8b37Edward O'Callaghan      CmdArgs.push_back(Args.MakeArgString(getToolChain().GetFilePath(C, "crti.o")));
23165ed34f4c58b6ad4e21038d713c1fae31a6146ff5Daniel Dunbar      CmdArgs.push_back(Args.MakeArgString(getToolChain().GetFilePath(C, "crtbegin.o")));
2317e7925a075f110ab21afeae084670a155dea568e3Edward O'Callaghan    } else {
23187adf94906e23eae295a006659c55eab9ffcf8b37Edward O'Callaghan      CmdArgs.push_back(Args.MakeArgString(getToolChain().GetFilePath(C, "crti.o")));
2319e7925a075f110ab21afeae084670a155dea568e3Edward O'Callaghan    }
23207adf94906e23eae295a006659c55eab9ffcf8b37Edward O'Callaghan    CmdArgs.push_back(Args.MakeArgString(getToolChain().GetFilePath(C, "crtn.o")));
2321e7925a075f110ab21afeae084670a155dea568e3Edward O'Callaghan  }
2322e7925a075f110ab21afeae084670a155dea568e3Edward O'Callaghan
2323294691eb1caf551083acd7b08630ef21c3fd760dDaniel Dunbar  CmdArgs.push_back(Args.MakeArgString("-L/opt/gcc4/lib/gcc/"
2324294691eb1caf551083acd7b08630ef21c3fd760dDaniel Dunbar                                       + getToolChain().getTripleString()
2325f7fb31f4751c9c5ac3d9f93c19ec05a74dd9546fDaniel Dunbar                                       + "/4.2.4"));
2326e7925a075f110ab21afeae084670a155dea568e3Edward O'Callaghan
2327e7925a075f110ab21afeae084670a155dea568e3Edward O'Callaghan  Args.AddAllArgs(CmdArgs, options::OPT_L);
2328e7925a075f110ab21afeae084670a155dea568e3Edward O'Callaghan  Args.AddAllArgs(CmdArgs, options::OPT_T_Group);
2329e7925a075f110ab21afeae084670a155dea568e3Edward O'Callaghan  Args.AddAllArgs(CmdArgs, options::OPT_e);
2330e7925a075f110ab21afeae084670a155dea568e3Edward O'Callaghan
2331e7925a075f110ab21afeae084670a155dea568e3Edward O'Callaghan  for (InputInfoList::const_iterator
2332e7925a075f110ab21afeae084670a155dea568e3Edward O'Callaghan         it = Inputs.begin(), ie = Inputs.end(); it != ie; ++it) {
2333e7925a075f110ab21afeae084670a155dea568e3Edward O'Callaghan    const InputInfo &II = *it;
2334e7925a075f110ab21afeae084670a155dea568e3Edward O'Callaghan
2335e7925a075f110ab21afeae084670a155dea568e3Edward O'Callaghan    // Don't try to pass LLVM inputs to a generic gcc.
2336e7925a075f110ab21afeae084670a155dea568e3Edward O'Callaghan    if (II.getType() == types::TY_LLVMBC)
2337e7925a075f110ab21afeae084670a155dea568e3Edward O'Callaghan      D.Diag(clang::diag::err_drv_no_linker_llvm_support)
2338881376467c46c5c6cc16fa6790271c2c22e1d4f1Daniel Dunbar        << getToolChain().getTripleString();
2339e7925a075f110ab21afeae084670a155dea568e3Edward O'Callaghan
2340e7925a075f110ab21afeae084670a155dea568e3Edward O'Callaghan    if (II.isPipe())
2341e7925a075f110ab21afeae084670a155dea568e3Edward O'Callaghan      CmdArgs.push_back("-");
2342e7925a075f110ab21afeae084670a155dea568e3Edward O'Callaghan    else if (II.isFilename())
2343e7925a075f110ab21afeae084670a155dea568e3Edward O'Callaghan      CmdArgs.push_back(II.getFilename());
2344e7925a075f110ab21afeae084670a155dea568e3Edward O'Callaghan    else
2345e7925a075f110ab21afeae084670a155dea568e3Edward O'Callaghan      II.getInputArg().renderAsInput(Args, CmdArgs);
2346e7925a075f110ab21afeae084670a155dea568e3Edward O'Callaghan  }
2347e7925a075f110ab21afeae084670a155dea568e3Edward O'Callaghan
2348e7925a075f110ab21afeae084670a155dea568e3Edward O'Callaghan  if (!Args.hasArg(options::OPT_nostdlib) &&
2349e7925a075f110ab21afeae084670a155dea568e3Edward O'Callaghan      !Args.hasArg(options::OPT_nodefaultlibs)) {
2350e7925a075f110ab21afeae084670a155dea568e3Edward O'Callaghan    // FIXME: For some reason GCC passes -lgcc before adding
2351e7925a075f110ab21afeae084670a155dea568e3Edward O'Callaghan    // the default system libraries. Just mimic this for now.
2352e7925a075f110ab21afeae084670a155dea568e3Edward O'Callaghan    CmdArgs.push_back("-lgcc");
2353e7925a075f110ab21afeae084670a155dea568e3Edward O'Callaghan
2354e7925a075f110ab21afeae084670a155dea568e3Edward O'Callaghan    if (Args.hasArg(options::OPT_pthread))
2355e7925a075f110ab21afeae084670a155dea568e3Edward O'Callaghan      CmdArgs.push_back("-pthread");
2356e7925a075f110ab21afeae084670a155dea568e3Edward O'Callaghan    if (!Args.hasArg(options::OPT_shared))
2357e7925a075f110ab21afeae084670a155dea568e3Edward O'Callaghan      CmdArgs.push_back("-lc");
2358e7925a075f110ab21afeae084670a155dea568e3Edward O'Callaghan    CmdArgs.push_back("-lgcc");
2359e7925a075f110ab21afeae084670a155dea568e3Edward O'Callaghan  }
2360e7925a075f110ab21afeae084670a155dea568e3Edward O'Callaghan
2361e7925a075f110ab21afeae084670a155dea568e3Edward O'Callaghan  if (!Args.hasArg(options::OPT_nostdlib) &&
2362e7925a075f110ab21afeae084670a155dea568e3Edward O'Callaghan      !Args.hasArg(options::OPT_nostartfiles)) {
2363e7925a075f110ab21afeae084670a155dea568e3Edward O'Callaghan    if (!Args.hasArg(options::OPT_shared))
23645ed34f4c58b6ad4e21038d713c1fae31a6146ff5Daniel Dunbar      CmdArgs.push_back(Args.MakeArgString(getToolChain().GetFilePath(C, "crtend.o")));
23657adf94906e23eae295a006659c55eab9ffcf8b37Edward O'Callaghan//    else
23667adf94906e23eae295a006659c55eab9ffcf8b37Edward O'Callaghan//      CmdArgs.push_back(Args.MakeArgString(getToolChain().GetFilePath(C, "crtendS.o")));
2367e7925a075f110ab21afeae084670a155dea568e3Edward O'Callaghan  }
2368e7925a075f110ab21afeae084670a155dea568e3Edward O'Callaghan
2369e7925a075f110ab21afeae084670a155dea568e3Edward O'Callaghan  const char *Exec =
23705ed34f4c58b6ad4e21038d713c1fae31a6146ff5Daniel Dunbar    Args.MakeArgString(getToolChain().GetProgramPath(C, "ld"));
2371daab7b1016f0a82fefa4f7be6e63c57c06b19ffcDaniel Dunbar  Dest.addCommand(new Command(JA, *this, Exec, CmdArgs));
2372e7925a075f110ab21afeae084670a155dea568e3Edward O'Callaghan}
2373e7925a075f110ab21afeae084670a155dea568e3Edward O'Callaghan
2374f7b8eec37c8c8012fa525c71fb29a58c9f29beefDaniel Dunbarvoid openbsd::Assemble::ConstructJob(Compilation &C, const JobAction &JA,
2375f7b8eec37c8c8012fa525c71fb29a58c9f29beefDaniel Dunbar                                     Job &Dest, const InputInfo &Output,
2376f7b8eec37c8c8012fa525c71fb29a58c9f29beefDaniel Dunbar                                     const InputInfoList &Inputs,
2377f7b8eec37c8c8012fa525c71fb29a58c9f29beefDaniel Dunbar                                     const ArgList &Args,
23781eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump                                     const char *LinkingOutput) const {
2379f7b8eec37c8c8012fa525c71fb29a58c9f29beefDaniel Dunbar  ArgStringList CmdArgs;
2380f7b8eec37c8c8012fa525c71fb29a58c9f29beefDaniel Dunbar
2381f7b8eec37c8c8012fa525c71fb29a58c9f29beefDaniel Dunbar  Args.AddAllArgValues(CmdArgs, options::OPT_Wa_COMMA,
2382f7b8eec37c8c8012fa525c71fb29a58c9f29beefDaniel Dunbar                       options::OPT_Xassembler);
2383f7b8eec37c8c8012fa525c71fb29a58c9f29beefDaniel Dunbar
2384f7b8eec37c8c8012fa525c71fb29a58c9f29beefDaniel Dunbar  CmdArgs.push_back("-o");
2385f7b8eec37c8c8012fa525c71fb29a58c9f29beefDaniel Dunbar  if (Output.isPipe())
2386f7b8eec37c8c8012fa525c71fb29a58c9f29beefDaniel Dunbar    CmdArgs.push_back("-");
2387f7b8eec37c8c8012fa525c71fb29a58c9f29beefDaniel Dunbar  else
2388f7b8eec37c8c8012fa525c71fb29a58c9f29beefDaniel Dunbar    CmdArgs.push_back(Output.getFilename());
2389f7b8eec37c8c8012fa525c71fb29a58c9f29beefDaniel Dunbar
2390f7b8eec37c8c8012fa525c71fb29a58c9f29beefDaniel Dunbar  for (InputInfoList::const_iterator
2391f7b8eec37c8c8012fa525c71fb29a58c9f29beefDaniel Dunbar         it = Inputs.begin(), ie = Inputs.end(); it != ie; ++it) {
2392f7b8eec37c8c8012fa525c71fb29a58c9f29beefDaniel Dunbar    const InputInfo &II = *it;
2393f7b8eec37c8c8012fa525c71fb29a58c9f29beefDaniel Dunbar    if (II.isPipe())
2394f7b8eec37c8c8012fa525c71fb29a58c9f29beefDaniel Dunbar      CmdArgs.push_back("-");
2395f7b8eec37c8c8012fa525c71fb29a58c9f29beefDaniel Dunbar    else
2396f7b8eec37c8c8012fa525c71fb29a58c9f29beefDaniel Dunbar      CmdArgs.push_back(II.getFilename());
2397f7b8eec37c8c8012fa525c71fb29a58c9f29beefDaniel Dunbar  }
2398f7b8eec37c8c8012fa525c71fb29a58c9f29beefDaniel Dunbar
2399f7b8eec37c8c8012fa525c71fb29a58c9f29beefDaniel Dunbar  const char *Exec =
24005ed34f4c58b6ad4e21038d713c1fae31a6146ff5Daniel Dunbar    Args.MakeArgString(getToolChain().GetProgramPath(C, "as"));
2401daab7b1016f0a82fefa4f7be6e63c57c06b19ffcDaniel Dunbar  Dest.addCommand(new Command(JA, *this, Exec, CmdArgs));
2402f7b8eec37c8c8012fa525c71fb29a58c9f29beefDaniel Dunbar}
2403f7b8eec37c8c8012fa525c71fb29a58c9f29beefDaniel Dunbar
2404f7b8eec37c8c8012fa525c71fb29a58c9f29beefDaniel Dunbarvoid openbsd::Link::ConstructJob(Compilation &C, const JobAction &JA,
2405f7b8eec37c8c8012fa525c71fb29a58c9f29beefDaniel Dunbar                                 Job &Dest, const InputInfo &Output,
2406f7b8eec37c8c8012fa525c71fb29a58c9f29beefDaniel Dunbar                                 const InputInfoList &Inputs,
2407f7b8eec37c8c8012fa525c71fb29a58c9f29beefDaniel Dunbar                                 const ArgList &Args,
2408f7b8eec37c8c8012fa525c71fb29a58c9f29beefDaniel Dunbar                                 const char *LinkingOutput) const {
2409ee788e70fcd0adf76103b17c78ac658d4ea30c9bDaniel Dunbar  const Driver &D = getToolChain().getDriver();
2410f7b8eec37c8c8012fa525c71fb29a58c9f29beefDaniel Dunbar  ArgStringList CmdArgs;
2411f7b8eec37c8c8012fa525c71fb29a58c9f29beefDaniel Dunbar
24122bbcf669742b6b27748414e22f8042236fceef65Daniel Dunbar  if ((!Args.hasArg(options::OPT_nostdlib)) &&
2413294691eb1caf551083acd7b08630ef21c3fd760dDaniel Dunbar      (!Args.hasArg(options::OPT_shared))) {
24142bbcf669742b6b27748414e22f8042236fceef65Daniel Dunbar    CmdArgs.push_back("-e");
24152bbcf669742b6b27748414e22f8042236fceef65Daniel Dunbar    CmdArgs.push_back("__start");
24162bbcf669742b6b27748414e22f8042236fceef65Daniel Dunbar  }
24172bbcf669742b6b27748414e22f8042236fceef65Daniel Dunbar
2418f7b8eec37c8c8012fa525c71fb29a58c9f29beefDaniel Dunbar  if (Args.hasArg(options::OPT_static)) {
2419f7b8eec37c8c8012fa525c71fb29a58c9f29beefDaniel Dunbar    CmdArgs.push_back("-Bstatic");
2420f7b8eec37c8c8012fa525c71fb29a58c9f29beefDaniel Dunbar  } else {
2421f7b8eec37c8c8012fa525c71fb29a58c9f29beefDaniel Dunbar    CmdArgs.push_back("--eh-frame-hdr");
24222bbcf669742b6b27748414e22f8042236fceef65Daniel Dunbar    CmdArgs.push_back("-Bdynamic");
2423f7b8eec37c8c8012fa525c71fb29a58c9f29beefDaniel Dunbar    if (Args.hasArg(options::OPT_shared)) {
24242bbcf669742b6b27748414e22f8042236fceef65Daniel Dunbar      CmdArgs.push_back("-shared");
2425f7b8eec37c8c8012fa525c71fb29a58c9f29beefDaniel Dunbar    } else {
2426f7b8eec37c8c8012fa525c71fb29a58c9f29beefDaniel Dunbar      CmdArgs.push_back("-dynamic-linker");
2427f7b8eec37c8c8012fa525c71fb29a58c9f29beefDaniel Dunbar      CmdArgs.push_back("/usr/libexec/ld.so");
2428f7b8eec37c8c8012fa525c71fb29a58c9f29beefDaniel Dunbar    }
2429f7b8eec37c8c8012fa525c71fb29a58c9f29beefDaniel Dunbar  }
2430f7b8eec37c8c8012fa525c71fb29a58c9f29beefDaniel Dunbar
2431f7b8eec37c8c8012fa525c71fb29a58c9f29beefDaniel Dunbar  if (Output.isPipe()) {
2432f7b8eec37c8c8012fa525c71fb29a58c9f29beefDaniel Dunbar    CmdArgs.push_back("-o");
2433f7b8eec37c8c8012fa525c71fb29a58c9f29beefDaniel Dunbar    CmdArgs.push_back("-");
2434f7b8eec37c8c8012fa525c71fb29a58c9f29beefDaniel Dunbar  } else if (Output.isFilename()) {
2435f7b8eec37c8c8012fa525c71fb29a58c9f29beefDaniel Dunbar    CmdArgs.push_back("-o");
2436f7b8eec37c8c8012fa525c71fb29a58c9f29beefDaniel Dunbar    CmdArgs.push_back(Output.getFilename());
2437f7b8eec37c8c8012fa525c71fb29a58c9f29beefDaniel Dunbar  } else {
2438f7b8eec37c8c8012fa525c71fb29a58c9f29beefDaniel Dunbar    assert(Output.isNothing() && "Invalid output.");
2439f7b8eec37c8c8012fa525c71fb29a58c9f29beefDaniel Dunbar  }
2440f7b8eec37c8c8012fa525c71fb29a58c9f29beefDaniel Dunbar
2441f7b8eec37c8c8012fa525c71fb29a58c9f29beefDaniel Dunbar  if (!Args.hasArg(options::OPT_nostdlib) &&
2442f7b8eec37c8c8012fa525c71fb29a58c9f29beefDaniel Dunbar      !Args.hasArg(options::OPT_nostartfiles)) {
2443f7b8eec37c8c8012fa525c71fb29a58c9f29beefDaniel Dunbar    if (!Args.hasArg(options::OPT_shared)) {
24445ed34f4c58b6ad4e21038d713c1fae31a6146ff5Daniel Dunbar      CmdArgs.push_back(Args.MakeArgString(getToolChain().GetFilePath(C, "crt0.o")));
24455ed34f4c58b6ad4e21038d713c1fae31a6146ff5Daniel Dunbar      CmdArgs.push_back(Args.MakeArgString(getToolChain().GetFilePath(C, "crtbegin.o")));
2446f7b8eec37c8c8012fa525c71fb29a58c9f29beefDaniel Dunbar    } else {
24475ed34f4c58b6ad4e21038d713c1fae31a6146ff5Daniel Dunbar      CmdArgs.push_back(Args.MakeArgString(getToolChain().GetFilePath(C, "crtbeginS.o")));
2448f7b8eec37c8c8012fa525c71fb29a58c9f29beefDaniel Dunbar    }
2449f7b8eec37c8c8012fa525c71fb29a58c9f29beefDaniel Dunbar  }
2450f7b8eec37c8c8012fa525c71fb29a58c9f29beefDaniel Dunbar
2451e7e18200e614a5e619602a088544c85ac8305a1fEdward O'Callaghan  std::string Triple = getToolChain().getTripleString();
2452e7e18200e614a5e619602a088544c85ac8305a1fEdward O'Callaghan  if (Triple.substr(0, 6) == "x86_64")
2453294691eb1caf551083acd7b08630ef21c3fd760dDaniel Dunbar    Triple.replace(0, 6, "amd64");
2454f7fb31f4751c9c5ac3d9f93c19ec05a74dd9546fDaniel Dunbar  CmdArgs.push_back(Args.MakeArgString("-L/usr/lib/gcc-lib/" + Triple +
2455f7fb31f4751c9c5ac3d9f93c19ec05a74dd9546fDaniel Dunbar                                       "/3.3.5"));
24562bbcf669742b6b27748414e22f8042236fceef65Daniel Dunbar
2457f7b8eec37c8c8012fa525c71fb29a58c9f29beefDaniel Dunbar  Args.AddAllArgs(CmdArgs, options::OPT_L);
2458f7b8eec37c8c8012fa525c71fb29a58c9f29beefDaniel Dunbar  Args.AddAllArgs(CmdArgs, options::OPT_T_Group);
2459f7b8eec37c8c8012fa525c71fb29a58c9f29beefDaniel Dunbar  Args.AddAllArgs(CmdArgs, options::OPT_e);
2460f7b8eec37c8c8012fa525c71fb29a58c9f29beefDaniel Dunbar
2461f7b8eec37c8c8012fa525c71fb29a58c9f29beefDaniel Dunbar  for (InputInfoList::const_iterator
2462f7b8eec37c8c8012fa525c71fb29a58c9f29beefDaniel Dunbar         it = Inputs.begin(), ie = Inputs.end(); it != ie; ++it) {
2463f7b8eec37c8c8012fa525c71fb29a58c9f29beefDaniel Dunbar    const InputInfo &II = *it;
2464f7b8eec37c8c8012fa525c71fb29a58c9f29beefDaniel Dunbar
2465f7b8eec37c8c8012fa525c71fb29a58c9f29beefDaniel Dunbar    // Don't try to pass LLVM inputs to a generic gcc.
2466f7b8eec37c8c8012fa525c71fb29a58c9f29beefDaniel Dunbar    if (II.getType() == types::TY_LLVMBC)
2467f7b8eec37c8c8012fa525c71fb29a58c9f29beefDaniel Dunbar      D.Diag(clang::diag::err_drv_no_linker_llvm_support)
2468881376467c46c5c6cc16fa6790271c2c22e1d4f1Daniel Dunbar        << getToolChain().getTripleString();
2469f7b8eec37c8c8012fa525c71fb29a58c9f29beefDaniel Dunbar
2470f7b8eec37c8c8012fa525c71fb29a58c9f29beefDaniel Dunbar    if (II.isPipe())
2471f7b8eec37c8c8012fa525c71fb29a58c9f29beefDaniel Dunbar      CmdArgs.push_back("-");
2472f7b8eec37c8c8012fa525c71fb29a58c9f29beefDaniel Dunbar    else if (II.isFilename())
2473f7b8eec37c8c8012fa525c71fb29a58c9f29beefDaniel Dunbar      CmdArgs.push_back(II.getFilename());
2474f7b8eec37c8c8012fa525c71fb29a58c9f29beefDaniel Dunbar    else
2475f7b8eec37c8c8012fa525c71fb29a58c9f29beefDaniel Dunbar      II.getInputArg().renderAsInput(Args, CmdArgs);
2476f7b8eec37c8c8012fa525c71fb29a58c9f29beefDaniel Dunbar  }
2477f7b8eec37c8c8012fa525c71fb29a58c9f29beefDaniel Dunbar
2478f7b8eec37c8c8012fa525c71fb29a58c9f29beefDaniel Dunbar  if (!Args.hasArg(options::OPT_nostdlib) &&
2479f7b8eec37c8c8012fa525c71fb29a58c9f29beefDaniel Dunbar      !Args.hasArg(options::OPT_nodefaultlibs)) {
24802bbcf669742b6b27748414e22f8042236fceef65Daniel Dunbar    // FIXME: For some reason GCC passes -lgcc before adding
24812bbcf669742b6b27748414e22f8042236fceef65Daniel Dunbar    // the default system libraries. Just mimic this for now.
24822bbcf669742b6b27748414e22f8042236fceef65Daniel Dunbar    CmdArgs.push_back("-lgcc");
2483f7b8eec37c8c8012fa525c71fb29a58c9f29beefDaniel Dunbar
2484f7b8eec37c8c8012fa525c71fb29a58c9f29beefDaniel Dunbar    if (Args.hasArg(options::OPT_pthread))
2485f7b8eec37c8c8012fa525c71fb29a58c9f29beefDaniel Dunbar      CmdArgs.push_back("-pthread");
24862bbcf669742b6b27748414e22f8042236fceef65Daniel Dunbar    if (!Args.hasArg(options::OPT_shared))
24872bbcf669742b6b27748414e22f8042236fceef65Daniel Dunbar      CmdArgs.push_back("-lc");
24882bbcf669742b6b27748414e22f8042236fceef65Daniel Dunbar    CmdArgs.push_back("-lgcc");
2489f7b8eec37c8c8012fa525c71fb29a58c9f29beefDaniel Dunbar  }
2490f7b8eec37c8c8012fa525c71fb29a58c9f29beefDaniel Dunbar
2491f7b8eec37c8c8012fa525c71fb29a58c9f29beefDaniel Dunbar  if (!Args.hasArg(options::OPT_nostdlib) &&
2492f7b8eec37c8c8012fa525c71fb29a58c9f29beefDaniel Dunbar      !Args.hasArg(options::OPT_nostartfiles)) {
2493f7b8eec37c8c8012fa525c71fb29a58c9f29beefDaniel Dunbar    if (!Args.hasArg(options::OPT_shared))
24945ed34f4c58b6ad4e21038d713c1fae31a6146ff5Daniel Dunbar      CmdArgs.push_back(Args.MakeArgString(getToolChain().GetFilePath(C, "crtend.o")));
2495f7b8eec37c8c8012fa525c71fb29a58c9f29beefDaniel Dunbar    else
24965ed34f4c58b6ad4e21038d713c1fae31a6146ff5Daniel Dunbar      CmdArgs.push_back(Args.MakeArgString(getToolChain().GetFilePath(C, "crtendS.o")));
2497f7b8eec37c8c8012fa525c71fb29a58c9f29beefDaniel Dunbar  }
2498f7b8eec37c8c8012fa525c71fb29a58c9f29beefDaniel Dunbar
2499f7b8eec37c8c8012fa525c71fb29a58c9f29beefDaniel Dunbar  const char *Exec =
25005ed34f4c58b6ad4e21038d713c1fae31a6146ff5Daniel Dunbar    Args.MakeArgString(getToolChain().GetProgramPath(C, "ld"));
2501daab7b1016f0a82fefa4f7be6e63c57c06b19ffcDaniel Dunbar  Dest.addCommand(new Command(JA, *this, Exec, CmdArgs));
2502f7b8eec37c8c8012fa525c71fb29a58c9f29beefDaniel Dunbar}
2503c66a5a30a27e7b9cfab46ac8be918e3ea5b0c5a5Ed Schouten
250468a31d406c6dc4382c700d1199b062de2aa7e1daDaniel Dunbarvoid freebsd::Assemble::ConstructJob(Compilation &C, const JobAction &JA,
2505c21c485b4fb58ef5d55cf3e523263dd824a2ace4Daniel Dunbar                                     Job &Dest, const InputInfo &Output,
2506c21c485b4fb58ef5d55cf3e523263dd824a2ace4Daniel Dunbar                                     const InputInfoList &Inputs,
2507c21c485b4fb58ef5d55cf3e523263dd824a2ace4Daniel Dunbar                                     const ArgList &Args,
25081eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump                                     const char *LinkingOutput) const {
250968a31d406c6dc4382c700d1199b062de2aa7e1daDaniel Dunbar  ArgStringList CmdArgs;
251068a31d406c6dc4382c700d1199b062de2aa7e1daDaniel Dunbar
2511008f54a54299eaafdaa940e2bdeaf55935ecd95aDaniel Dunbar  // When building 32-bit code on FreeBSD/amd64, we have to explicitly
2512008f54a54299eaafdaa940e2bdeaf55935ecd95aDaniel Dunbar  // instruct as in the base system to assemble 32-bit code.
2513008f54a54299eaafdaa940e2bdeaf55935ecd95aDaniel Dunbar  if (getToolChain().getArchName() == "i386")
251468a31d406c6dc4382c700d1199b062de2aa7e1daDaniel Dunbar    CmdArgs.push_back("--32");
251568a31d406c6dc4382c700d1199b062de2aa7e1daDaniel Dunbar
251668a31d406c6dc4382c700d1199b062de2aa7e1daDaniel Dunbar  Args.AddAllArgValues(CmdArgs, options::OPT_Wa_COMMA,
251768a31d406c6dc4382c700d1199b062de2aa7e1daDaniel Dunbar                       options::OPT_Xassembler);
251868a31d406c6dc4382c700d1199b062de2aa7e1daDaniel Dunbar
251968a31d406c6dc4382c700d1199b062de2aa7e1daDaniel Dunbar  CmdArgs.push_back("-o");
252068a31d406c6dc4382c700d1199b062de2aa7e1daDaniel Dunbar  if (Output.isPipe())
252168a31d406c6dc4382c700d1199b062de2aa7e1daDaniel Dunbar    CmdArgs.push_back("-");
252268a31d406c6dc4382c700d1199b062de2aa7e1daDaniel Dunbar  else
252368a31d406c6dc4382c700d1199b062de2aa7e1daDaniel Dunbar    CmdArgs.push_back(Output.getFilename());
252468a31d406c6dc4382c700d1199b062de2aa7e1daDaniel Dunbar
252568a31d406c6dc4382c700d1199b062de2aa7e1daDaniel Dunbar  for (InputInfoList::const_iterator
252668a31d406c6dc4382c700d1199b062de2aa7e1daDaniel Dunbar         it = Inputs.begin(), ie = Inputs.end(); it != ie; ++it) {
252768a31d406c6dc4382c700d1199b062de2aa7e1daDaniel Dunbar    const InputInfo &II = *it;
252868a31d406c6dc4382c700d1199b062de2aa7e1daDaniel Dunbar    if (II.isPipe())
252968a31d406c6dc4382c700d1199b062de2aa7e1daDaniel Dunbar      CmdArgs.push_back("-");
253068a31d406c6dc4382c700d1199b062de2aa7e1daDaniel Dunbar    else
253168a31d406c6dc4382c700d1199b062de2aa7e1daDaniel Dunbar      CmdArgs.push_back(II.getFilename());
253268a31d406c6dc4382c700d1199b062de2aa7e1daDaniel Dunbar  }
253368a31d406c6dc4382c700d1199b062de2aa7e1daDaniel Dunbar
2534c21c485b4fb58ef5d55cf3e523263dd824a2ace4Daniel Dunbar  const char *Exec =
25355ed34f4c58b6ad4e21038d713c1fae31a6146ff5Daniel Dunbar    Args.MakeArgString(getToolChain().GetProgramPath(C, "as"));
2536daab7b1016f0a82fefa4f7be6e63c57c06b19ffcDaniel Dunbar  Dest.addCommand(new Command(JA, *this, Exec, CmdArgs));
253768a31d406c6dc4382c700d1199b062de2aa7e1daDaniel Dunbar}
2538008f54a54299eaafdaa940e2bdeaf55935ecd95aDaniel Dunbar
2539008f54a54299eaafdaa940e2bdeaf55935ecd95aDaniel Dunbarvoid freebsd::Link::ConstructJob(Compilation &C, const JobAction &JA,
2540c21c485b4fb58ef5d55cf3e523263dd824a2ace4Daniel Dunbar                                 Job &Dest, const InputInfo &Output,
2541c21c485b4fb58ef5d55cf3e523263dd824a2ace4Daniel Dunbar                                 const InputInfoList &Inputs,
2542c21c485b4fb58ef5d55cf3e523263dd824a2ace4Daniel Dunbar                                 const ArgList &Args,
2543a8304f67291b0182fb64f3afc621615288dd1d31Daniel Dunbar                                 const char *LinkingOutput) const {
2544ee788e70fcd0adf76103b17c78ac658d4ea30c9bDaniel Dunbar  const Driver &D = getToolChain().getDriver();
2545008f54a54299eaafdaa940e2bdeaf55935ecd95aDaniel Dunbar  ArgStringList CmdArgs;
2546008f54a54299eaafdaa940e2bdeaf55935ecd95aDaniel Dunbar
2547008f54a54299eaafdaa940e2bdeaf55935ecd95aDaniel Dunbar  if (Args.hasArg(options::OPT_static)) {
2548008f54a54299eaafdaa940e2bdeaf55935ecd95aDaniel Dunbar    CmdArgs.push_back("-Bstatic");
2549008f54a54299eaafdaa940e2bdeaf55935ecd95aDaniel Dunbar  } else {
2550008f54a54299eaafdaa940e2bdeaf55935ecd95aDaniel Dunbar    CmdArgs.push_back("--eh-frame-hdr");
2551008f54a54299eaafdaa940e2bdeaf55935ecd95aDaniel Dunbar    if (Args.hasArg(options::OPT_shared)) {
2552008f54a54299eaafdaa940e2bdeaf55935ecd95aDaniel Dunbar      CmdArgs.push_back("-Bshareable");
2553008f54a54299eaafdaa940e2bdeaf55935ecd95aDaniel Dunbar    } else {
2554008f54a54299eaafdaa940e2bdeaf55935ecd95aDaniel Dunbar      CmdArgs.push_back("-dynamic-linker");
2555008f54a54299eaafdaa940e2bdeaf55935ecd95aDaniel Dunbar      CmdArgs.push_back("/libexec/ld-elf.so.1");
2556008f54a54299eaafdaa940e2bdeaf55935ecd95aDaniel Dunbar    }
2557008f54a54299eaafdaa940e2bdeaf55935ecd95aDaniel Dunbar  }
2558008f54a54299eaafdaa940e2bdeaf55935ecd95aDaniel Dunbar
2559008f54a54299eaafdaa940e2bdeaf55935ecd95aDaniel Dunbar  // When building 32-bit code on FreeBSD/amd64, we have to explicitly
2560008f54a54299eaafdaa940e2bdeaf55935ecd95aDaniel Dunbar  // instruct ld in the base system to link 32-bit code.
2561008f54a54299eaafdaa940e2bdeaf55935ecd95aDaniel Dunbar  if (getToolChain().getArchName() == "i386") {
2562008f54a54299eaafdaa940e2bdeaf55935ecd95aDaniel Dunbar    CmdArgs.push_back("-m");
2563008f54a54299eaafdaa940e2bdeaf55935ecd95aDaniel Dunbar    CmdArgs.push_back("elf_i386_fbsd");
2564008f54a54299eaafdaa940e2bdeaf55935ecd95aDaniel Dunbar  }
2565008f54a54299eaafdaa940e2bdeaf55935ecd95aDaniel Dunbar
2566008f54a54299eaafdaa940e2bdeaf55935ecd95aDaniel Dunbar  if (Output.isPipe()) {
2567008f54a54299eaafdaa940e2bdeaf55935ecd95aDaniel Dunbar    CmdArgs.push_back("-o");
2568008f54a54299eaafdaa940e2bdeaf55935ecd95aDaniel Dunbar    CmdArgs.push_back("-");
2569008f54a54299eaafdaa940e2bdeaf55935ecd95aDaniel Dunbar  } else if (Output.isFilename()) {
2570008f54a54299eaafdaa940e2bdeaf55935ecd95aDaniel Dunbar    CmdArgs.push_back("-o");
2571008f54a54299eaafdaa940e2bdeaf55935ecd95aDaniel Dunbar    CmdArgs.push_back(Output.getFilename());
2572008f54a54299eaafdaa940e2bdeaf55935ecd95aDaniel Dunbar  } else {
2573008f54a54299eaafdaa940e2bdeaf55935ecd95aDaniel Dunbar    assert(Output.isNothing() && "Invalid output.");
2574008f54a54299eaafdaa940e2bdeaf55935ecd95aDaniel Dunbar  }
2575008f54a54299eaafdaa940e2bdeaf55935ecd95aDaniel Dunbar
2576008f54a54299eaafdaa940e2bdeaf55935ecd95aDaniel Dunbar  if (!Args.hasArg(options::OPT_nostdlib) &&
2577008f54a54299eaafdaa940e2bdeaf55935ecd95aDaniel Dunbar      !Args.hasArg(options::OPT_nostartfiles)) {
2578008f54a54299eaafdaa940e2bdeaf55935ecd95aDaniel Dunbar    if (!Args.hasArg(options::OPT_shared)) {
25795ed34f4c58b6ad4e21038d713c1fae31a6146ff5Daniel Dunbar      CmdArgs.push_back(Args.MakeArgString(getToolChain().GetFilePath(C, "crt1.o")));
25805ed34f4c58b6ad4e21038d713c1fae31a6146ff5Daniel Dunbar      CmdArgs.push_back(Args.MakeArgString(getToolChain().GetFilePath(C, "crti.o")));
25815ed34f4c58b6ad4e21038d713c1fae31a6146ff5Daniel Dunbar      CmdArgs.push_back(Args.MakeArgString(getToolChain().GetFilePath(C, "crtbegin.o")));
2582008f54a54299eaafdaa940e2bdeaf55935ecd95aDaniel Dunbar    } else {
25835ed34f4c58b6ad4e21038d713c1fae31a6146ff5Daniel Dunbar      CmdArgs.push_back(Args.MakeArgString(getToolChain().GetFilePath(C, "crti.o")));
25845ed34f4c58b6ad4e21038d713c1fae31a6146ff5Daniel Dunbar      CmdArgs.push_back(Args.MakeArgString(getToolChain().GetFilePath(C, "crtbeginS.o")));
2585008f54a54299eaafdaa940e2bdeaf55935ecd95aDaniel Dunbar    }
2586008f54a54299eaafdaa940e2bdeaf55935ecd95aDaniel Dunbar  }
2587008f54a54299eaafdaa940e2bdeaf55935ecd95aDaniel Dunbar
2588008f54a54299eaafdaa940e2bdeaf55935ecd95aDaniel Dunbar  Args.AddAllArgs(CmdArgs, options::OPT_L);
2589008f54a54299eaafdaa940e2bdeaf55935ecd95aDaniel Dunbar  Args.AddAllArgs(CmdArgs, options::OPT_T_Group);
2590008f54a54299eaafdaa940e2bdeaf55935ecd95aDaniel Dunbar  Args.AddAllArgs(CmdArgs, options::OPT_e);
2591008f54a54299eaafdaa940e2bdeaf55935ecd95aDaniel Dunbar
2592008f54a54299eaafdaa940e2bdeaf55935ecd95aDaniel Dunbar  for (InputInfoList::const_iterator
2593c21c485b4fb58ef5d55cf3e523263dd824a2ace4Daniel Dunbar         it = Inputs.begin(), ie = Inputs.end(); it != ie; ++it) {
2594008f54a54299eaafdaa940e2bdeaf55935ecd95aDaniel Dunbar    const InputInfo &II = *it;
2595a8304f67291b0182fb64f3afc621615288dd1d31Daniel Dunbar
2596a8304f67291b0182fb64f3afc621615288dd1d31Daniel Dunbar    // Don't try to pass LLVM inputs to a generic gcc.
2597a8304f67291b0182fb64f3afc621615288dd1d31Daniel Dunbar    if (II.getType() == types::TY_LLVMBC)
2598a8304f67291b0182fb64f3afc621615288dd1d31Daniel Dunbar      D.Diag(clang::diag::err_drv_no_linker_llvm_support)
2599881376467c46c5c6cc16fa6790271c2c22e1d4f1Daniel Dunbar        << getToolChain().getTripleString();
2600a8304f67291b0182fb64f3afc621615288dd1d31Daniel Dunbar
2601008f54a54299eaafdaa940e2bdeaf55935ecd95aDaniel Dunbar    if (II.isPipe())
2602008f54a54299eaafdaa940e2bdeaf55935ecd95aDaniel Dunbar      CmdArgs.push_back("-");
2603008f54a54299eaafdaa940e2bdeaf55935ecd95aDaniel Dunbar    else if (II.isFilename())
2604008f54a54299eaafdaa940e2bdeaf55935ecd95aDaniel Dunbar      CmdArgs.push_back(II.getFilename());
2605008f54a54299eaafdaa940e2bdeaf55935ecd95aDaniel Dunbar    else
2606008f54a54299eaafdaa940e2bdeaf55935ecd95aDaniel Dunbar      II.getInputArg().renderAsInput(Args, CmdArgs);
2607008f54a54299eaafdaa940e2bdeaf55935ecd95aDaniel Dunbar  }
2608008f54a54299eaafdaa940e2bdeaf55935ecd95aDaniel Dunbar
2609008f54a54299eaafdaa940e2bdeaf55935ecd95aDaniel Dunbar  if (!Args.hasArg(options::OPT_nostdlib) &&
2610008f54a54299eaafdaa940e2bdeaf55935ecd95aDaniel Dunbar      !Args.hasArg(options::OPT_nodefaultlibs)) {
2611008f54a54299eaafdaa940e2bdeaf55935ecd95aDaniel Dunbar    // FIXME: For some reason GCC passes -lgcc and -lgcc_s before adding
2612008f54a54299eaafdaa940e2bdeaf55935ecd95aDaniel Dunbar    // the default system libraries. Just mimic this for now.
2613008f54a54299eaafdaa940e2bdeaf55935ecd95aDaniel Dunbar    CmdArgs.push_back("-lgcc");
261469203e108b097695c421561c8f1b45b498f5e5d4Edward O'Callaghan    if (D.CCCIsCXX)
261569203e108b097695c421561c8f1b45b498f5e5d4Edward O'Callaghan      CmdArgs.push_back("-lstdc++");
2616008f54a54299eaafdaa940e2bdeaf55935ecd95aDaniel Dunbar    if (Args.hasArg(options::OPT_static)) {
2617008f54a54299eaafdaa940e2bdeaf55935ecd95aDaniel Dunbar      CmdArgs.push_back("-lgcc_eh");
2618008f54a54299eaafdaa940e2bdeaf55935ecd95aDaniel Dunbar    } else {
2619008f54a54299eaafdaa940e2bdeaf55935ecd95aDaniel Dunbar      CmdArgs.push_back("--as-needed");
2620008f54a54299eaafdaa940e2bdeaf55935ecd95aDaniel Dunbar      CmdArgs.push_back("-lgcc_s");
2621008f54a54299eaafdaa940e2bdeaf55935ecd95aDaniel Dunbar      CmdArgs.push_back("--no-as-needed");
2622008f54a54299eaafdaa940e2bdeaf55935ecd95aDaniel Dunbar    }
2623008f54a54299eaafdaa940e2bdeaf55935ecd95aDaniel Dunbar
2624008f54a54299eaafdaa940e2bdeaf55935ecd95aDaniel Dunbar    if (Args.hasArg(options::OPT_pthread))
2625008f54a54299eaafdaa940e2bdeaf55935ecd95aDaniel Dunbar      CmdArgs.push_back("-lpthread");
2626008f54a54299eaafdaa940e2bdeaf55935ecd95aDaniel Dunbar    CmdArgs.push_back("-lc");
2627008f54a54299eaafdaa940e2bdeaf55935ecd95aDaniel Dunbar
2628008f54a54299eaafdaa940e2bdeaf55935ecd95aDaniel Dunbar    CmdArgs.push_back("-lgcc");
2629008f54a54299eaafdaa940e2bdeaf55935ecd95aDaniel Dunbar    if (Args.hasArg(options::OPT_static)) {
2630008f54a54299eaafdaa940e2bdeaf55935ecd95aDaniel Dunbar      CmdArgs.push_back("-lgcc_eh");
2631008f54a54299eaafdaa940e2bdeaf55935ecd95aDaniel Dunbar    } else {
2632008f54a54299eaafdaa940e2bdeaf55935ecd95aDaniel Dunbar      CmdArgs.push_back("--as-needed");
2633008f54a54299eaafdaa940e2bdeaf55935ecd95aDaniel Dunbar      CmdArgs.push_back("-lgcc_s");
2634008f54a54299eaafdaa940e2bdeaf55935ecd95aDaniel Dunbar      CmdArgs.push_back("--no-as-needed");
2635008f54a54299eaafdaa940e2bdeaf55935ecd95aDaniel Dunbar    }
2636008f54a54299eaafdaa940e2bdeaf55935ecd95aDaniel Dunbar  }
2637008f54a54299eaafdaa940e2bdeaf55935ecd95aDaniel Dunbar
2638008f54a54299eaafdaa940e2bdeaf55935ecd95aDaniel Dunbar  if (!Args.hasArg(options::OPT_nostdlib) &&
2639008f54a54299eaafdaa940e2bdeaf55935ecd95aDaniel Dunbar      !Args.hasArg(options::OPT_nostartfiles)) {
2640008f54a54299eaafdaa940e2bdeaf55935ecd95aDaniel Dunbar    if (!Args.hasArg(options::OPT_shared))
26415ed34f4c58b6ad4e21038d713c1fae31a6146ff5Daniel Dunbar      CmdArgs.push_back(Args.MakeArgString(getToolChain().GetFilePath(C, "crtend.o")));
2642008f54a54299eaafdaa940e2bdeaf55935ecd95aDaniel Dunbar    else
26435ed34f4c58b6ad4e21038d713c1fae31a6146ff5Daniel Dunbar      CmdArgs.push_back(Args.MakeArgString(getToolChain().GetFilePath(C, "crtendS.o")));
26445ed34f4c58b6ad4e21038d713c1fae31a6146ff5Daniel Dunbar    CmdArgs.push_back(Args.MakeArgString(getToolChain().GetFilePath(C, "crtn.o")));
2645008f54a54299eaafdaa940e2bdeaf55935ecd95aDaniel Dunbar  }
2646008f54a54299eaafdaa940e2bdeaf55935ecd95aDaniel Dunbar
2647c21c485b4fb58ef5d55cf3e523263dd824a2ace4Daniel Dunbar  const char *Exec =
26485ed34f4c58b6ad4e21038d713c1fae31a6146ff5Daniel Dunbar    Args.MakeArgString(getToolChain().GetProgramPath(C, "ld"));
2649daab7b1016f0a82fefa4f7be6e63c57c06b19ffcDaniel Dunbar  Dest.addCommand(new Command(JA, *this, Exec, CmdArgs));
2650008f54a54299eaafdaa940e2bdeaf55935ecd95aDaniel Dunbar}
265111e1b40d759a643086f590f6ffbd9d68360bad46Daniel Dunbar
265211e1b40d759a643086f590f6ffbd9d68360bad46Daniel Dunbar/// DragonFly Tools
265311e1b40d759a643086f590f6ffbd9d68360bad46Daniel Dunbar
265411e1b40d759a643086f590f6ffbd9d68360bad46Daniel Dunbar// For now, DragonFly Assemble does just about the same as for
265511e1b40d759a643086f590f6ffbd9d68360bad46Daniel Dunbar// FreeBSD, but this may change soon.
265611e1b40d759a643086f590f6ffbd9d68360bad46Daniel Dunbarvoid dragonfly::Assemble::ConstructJob(Compilation &C, const JobAction &JA,
2657294691eb1caf551083acd7b08630ef21c3fd760dDaniel Dunbar                                       Job &Dest, const InputInfo &Output,
2658294691eb1caf551083acd7b08630ef21c3fd760dDaniel Dunbar                                       const InputInfoList &Inputs,
2659294691eb1caf551083acd7b08630ef21c3fd760dDaniel Dunbar                                       const ArgList &Args,
2660294691eb1caf551083acd7b08630ef21c3fd760dDaniel Dunbar                                       const char *LinkingOutput) const {
266111e1b40d759a643086f590f6ffbd9d68360bad46Daniel Dunbar  ArgStringList CmdArgs;
266211e1b40d759a643086f590f6ffbd9d68360bad46Daniel Dunbar
266311e1b40d759a643086f590f6ffbd9d68360bad46Daniel Dunbar  // When building 32-bit code on DragonFly/pc64, we have to explicitly
266411e1b40d759a643086f590f6ffbd9d68360bad46Daniel Dunbar  // instruct as in the base system to assemble 32-bit code.
266511e1b40d759a643086f590f6ffbd9d68360bad46Daniel Dunbar  if (getToolChain().getArchName() == "i386")
266611e1b40d759a643086f590f6ffbd9d68360bad46Daniel Dunbar    CmdArgs.push_back("--32");
266711e1b40d759a643086f590f6ffbd9d68360bad46Daniel Dunbar
266811e1b40d759a643086f590f6ffbd9d68360bad46Daniel Dunbar  Args.AddAllArgValues(CmdArgs, options::OPT_Wa_COMMA,
266911e1b40d759a643086f590f6ffbd9d68360bad46Daniel Dunbar                       options::OPT_Xassembler);
267011e1b40d759a643086f590f6ffbd9d68360bad46Daniel Dunbar
267111e1b40d759a643086f590f6ffbd9d68360bad46Daniel Dunbar  CmdArgs.push_back("-o");
267211e1b40d759a643086f590f6ffbd9d68360bad46Daniel Dunbar  if (Output.isPipe())
267311e1b40d759a643086f590f6ffbd9d68360bad46Daniel Dunbar    CmdArgs.push_back("-");
267411e1b40d759a643086f590f6ffbd9d68360bad46Daniel Dunbar  else
267511e1b40d759a643086f590f6ffbd9d68360bad46Daniel Dunbar    CmdArgs.push_back(Output.getFilename());
267611e1b40d759a643086f590f6ffbd9d68360bad46Daniel Dunbar
267711e1b40d759a643086f590f6ffbd9d68360bad46Daniel Dunbar  for (InputInfoList::const_iterator
267811e1b40d759a643086f590f6ffbd9d68360bad46Daniel Dunbar         it = Inputs.begin(), ie = Inputs.end(); it != ie; ++it) {
267911e1b40d759a643086f590f6ffbd9d68360bad46Daniel Dunbar    const InputInfo &II = *it;
268011e1b40d759a643086f590f6ffbd9d68360bad46Daniel Dunbar    if (II.isPipe())
268111e1b40d759a643086f590f6ffbd9d68360bad46Daniel Dunbar      CmdArgs.push_back("-");
268211e1b40d759a643086f590f6ffbd9d68360bad46Daniel Dunbar    else
268311e1b40d759a643086f590f6ffbd9d68360bad46Daniel Dunbar      CmdArgs.push_back(II.getFilename());
268411e1b40d759a643086f590f6ffbd9d68360bad46Daniel Dunbar  }
268511e1b40d759a643086f590f6ffbd9d68360bad46Daniel Dunbar
268611e1b40d759a643086f590f6ffbd9d68360bad46Daniel Dunbar  const char *Exec =
26875ed34f4c58b6ad4e21038d713c1fae31a6146ff5Daniel Dunbar    Args.MakeArgString(getToolChain().GetProgramPath(C, "as"));
2688daab7b1016f0a82fefa4f7be6e63c57c06b19ffcDaniel Dunbar  Dest.addCommand(new Command(JA, *this, Exec, CmdArgs));
268911e1b40d759a643086f590f6ffbd9d68360bad46Daniel Dunbar}
269011e1b40d759a643086f590f6ffbd9d68360bad46Daniel Dunbar
269111e1b40d759a643086f590f6ffbd9d68360bad46Daniel Dunbarvoid dragonfly::Link::ConstructJob(Compilation &C, const JobAction &JA,
269211e1b40d759a643086f590f6ffbd9d68360bad46Daniel Dunbar                                 Job &Dest, const InputInfo &Output,
269311e1b40d759a643086f590f6ffbd9d68360bad46Daniel Dunbar                                 const InputInfoList &Inputs,
269411e1b40d759a643086f590f6ffbd9d68360bad46Daniel Dunbar                                 const ArgList &Args,
269511e1b40d759a643086f590f6ffbd9d68360bad46Daniel Dunbar                                 const char *LinkingOutput) const {
2696ee788e70fcd0adf76103b17c78ac658d4ea30c9bDaniel Dunbar  const Driver &D = getToolChain().getDriver();
269711e1b40d759a643086f590f6ffbd9d68360bad46Daniel Dunbar  ArgStringList CmdArgs;
269811e1b40d759a643086f590f6ffbd9d68360bad46Daniel Dunbar
269911e1b40d759a643086f590f6ffbd9d68360bad46Daniel Dunbar  if (Args.hasArg(options::OPT_static)) {
270011e1b40d759a643086f590f6ffbd9d68360bad46Daniel Dunbar    CmdArgs.push_back("-Bstatic");
270111e1b40d759a643086f590f6ffbd9d68360bad46Daniel Dunbar  } else {
270211e1b40d759a643086f590f6ffbd9d68360bad46Daniel Dunbar    if (Args.hasArg(options::OPT_shared))
270311e1b40d759a643086f590f6ffbd9d68360bad46Daniel Dunbar      CmdArgs.push_back("-Bshareable");
270411e1b40d759a643086f590f6ffbd9d68360bad46Daniel Dunbar    else {
270511e1b40d759a643086f590f6ffbd9d68360bad46Daniel Dunbar      CmdArgs.push_back("-dynamic-linker");
270611e1b40d759a643086f590f6ffbd9d68360bad46Daniel Dunbar      CmdArgs.push_back("/usr/libexec/ld-elf.so.2");
270711e1b40d759a643086f590f6ffbd9d68360bad46Daniel Dunbar    }
270811e1b40d759a643086f590f6ffbd9d68360bad46Daniel Dunbar  }
270911e1b40d759a643086f590f6ffbd9d68360bad46Daniel Dunbar
271011e1b40d759a643086f590f6ffbd9d68360bad46Daniel Dunbar  // When building 32-bit code on DragonFly/pc64, we have to explicitly
271111e1b40d759a643086f590f6ffbd9d68360bad46Daniel Dunbar  // instruct ld in the base system to link 32-bit code.
271211e1b40d759a643086f590f6ffbd9d68360bad46Daniel Dunbar  if (getToolChain().getArchName() == "i386") {
271311e1b40d759a643086f590f6ffbd9d68360bad46Daniel Dunbar    CmdArgs.push_back("-m");
271411e1b40d759a643086f590f6ffbd9d68360bad46Daniel Dunbar    CmdArgs.push_back("elf_i386");
271511e1b40d759a643086f590f6ffbd9d68360bad46Daniel Dunbar  }
271611e1b40d759a643086f590f6ffbd9d68360bad46Daniel Dunbar
271711e1b40d759a643086f590f6ffbd9d68360bad46Daniel Dunbar  if (Output.isPipe()) {
271811e1b40d759a643086f590f6ffbd9d68360bad46Daniel Dunbar    CmdArgs.push_back("-o");
271911e1b40d759a643086f590f6ffbd9d68360bad46Daniel Dunbar    CmdArgs.push_back("-");
272011e1b40d759a643086f590f6ffbd9d68360bad46Daniel Dunbar  } else if (Output.isFilename()) {
272111e1b40d759a643086f590f6ffbd9d68360bad46Daniel Dunbar    CmdArgs.push_back("-o");
272211e1b40d759a643086f590f6ffbd9d68360bad46Daniel Dunbar    CmdArgs.push_back(Output.getFilename());
272311e1b40d759a643086f590f6ffbd9d68360bad46Daniel Dunbar  } else {
272411e1b40d759a643086f590f6ffbd9d68360bad46Daniel Dunbar    assert(Output.isNothing() && "Invalid output.");
272511e1b40d759a643086f590f6ffbd9d68360bad46Daniel Dunbar  }
272611e1b40d759a643086f590f6ffbd9d68360bad46Daniel Dunbar
272711e1b40d759a643086f590f6ffbd9d68360bad46Daniel Dunbar  if (!Args.hasArg(options::OPT_nostdlib) &&
272811e1b40d759a643086f590f6ffbd9d68360bad46Daniel Dunbar      !Args.hasArg(options::OPT_nostartfiles)) {
272911e1b40d759a643086f590f6ffbd9d68360bad46Daniel Dunbar    if (!Args.hasArg(options::OPT_shared)) {
27305ed34f4c58b6ad4e21038d713c1fae31a6146ff5Daniel Dunbar      CmdArgs.push_back(Args.MakeArgString(getToolChain().GetFilePath(C, "crt1.o")));
27315ed34f4c58b6ad4e21038d713c1fae31a6146ff5Daniel Dunbar      CmdArgs.push_back(Args.MakeArgString(getToolChain().GetFilePath(C, "crti.o")));
27325ed34f4c58b6ad4e21038d713c1fae31a6146ff5Daniel Dunbar      CmdArgs.push_back(Args.MakeArgString(getToolChain().GetFilePath(C, "crtbegin.o")));
273311e1b40d759a643086f590f6ffbd9d68360bad46Daniel Dunbar    } else {
27345ed34f4c58b6ad4e21038d713c1fae31a6146ff5Daniel Dunbar      CmdArgs.push_back(Args.MakeArgString(getToolChain().GetFilePath(C, "crti.o")));
27355ed34f4c58b6ad4e21038d713c1fae31a6146ff5Daniel Dunbar      CmdArgs.push_back(Args.MakeArgString(getToolChain().GetFilePath(C, "crtbeginS.o")));
273611e1b40d759a643086f590f6ffbd9d68360bad46Daniel Dunbar    }
273711e1b40d759a643086f590f6ffbd9d68360bad46Daniel Dunbar  }
273811e1b40d759a643086f590f6ffbd9d68360bad46Daniel Dunbar
273911e1b40d759a643086f590f6ffbd9d68360bad46Daniel Dunbar  Args.AddAllArgs(CmdArgs, options::OPT_L);
274011e1b40d759a643086f590f6ffbd9d68360bad46Daniel Dunbar  Args.AddAllArgs(CmdArgs, options::OPT_T_Group);
274111e1b40d759a643086f590f6ffbd9d68360bad46Daniel Dunbar  Args.AddAllArgs(CmdArgs, options::OPT_e);
274211e1b40d759a643086f590f6ffbd9d68360bad46Daniel Dunbar
274311e1b40d759a643086f590f6ffbd9d68360bad46Daniel Dunbar  for (InputInfoList::const_iterator
274411e1b40d759a643086f590f6ffbd9d68360bad46Daniel Dunbar         it = Inputs.begin(), ie = Inputs.end(); it != ie; ++it) {
274511e1b40d759a643086f590f6ffbd9d68360bad46Daniel Dunbar    const InputInfo &II = *it;
2746a8304f67291b0182fb64f3afc621615288dd1d31Daniel Dunbar
2747a8304f67291b0182fb64f3afc621615288dd1d31Daniel Dunbar    // Don't try to pass LLVM inputs to a generic gcc.
2748a8304f67291b0182fb64f3afc621615288dd1d31Daniel Dunbar    if (II.getType() == types::TY_LLVMBC)
2749a8304f67291b0182fb64f3afc621615288dd1d31Daniel Dunbar      D.Diag(clang::diag::err_drv_no_linker_llvm_support)
2750881376467c46c5c6cc16fa6790271c2c22e1d4f1Daniel Dunbar        << getToolChain().getTripleString();
2751a8304f67291b0182fb64f3afc621615288dd1d31Daniel Dunbar
275211e1b40d759a643086f590f6ffbd9d68360bad46Daniel Dunbar    if (II.isPipe())
275311e1b40d759a643086f590f6ffbd9d68360bad46Daniel Dunbar      CmdArgs.push_back("-");
275411e1b40d759a643086f590f6ffbd9d68360bad46Daniel Dunbar    else if (II.isFilename())
275511e1b40d759a643086f590f6ffbd9d68360bad46Daniel Dunbar      CmdArgs.push_back(II.getFilename());
275611e1b40d759a643086f590f6ffbd9d68360bad46Daniel Dunbar    else
275711e1b40d759a643086f590f6ffbd9d68360bad46Daniel Dunbar      II.getInputArg().renderAsInput(Args, CmdArgs);
275811e1b40d759a643086f590f6ffbd9d68360bad46Daniel Dunbar  }
275911e1b40d759a643086f590f6ffbd9d68360bad46Daniel Dunbar
276011e1b40d759a643086f590f6ffbd9d68360bad46Daniel Dunbar  if (!Args.hasArg(options::OPT_nostdlib) &&
276111e1b40d759a643086f590f6ffbd9d68360bad46Daniel Dunbar      !Args.hasArg(options::OPT_nodefaultlibs)) {
276211e1b40d759a643086f590f6ffbd9d68360bad46Daniel Dunbar    // FIXME: GCC passes on -lgcc, -lgcc_pic and a whole lot of
276311e1b40d759a643086f590f6ffbd9d68360bad46Daniel Dunbar    //         rpaths
276411e1b40d759a643086f590f6ffbd9d68360bad46Daniel Dunbar    CmdArgs.push_back("-L/usr/lib/gcc41");
276511e1b40d759a643086f590f6ffbd9d68360bad46Daniel Dunbar
276611e1b40d759a643086f590f6ffbd9d68360bad46Daniel Dunbar    if (!Args.hasArg(options::OPT_static)) {
276711e1b40d759a643086f590f6ffbd9d68360bad46Daniel Dunbar      CmdArgs.push_back("-rpath");
276811e1b40d759a643086f590f6ffbd9d68360bad46Daniel Dunbar      CmdArgs.push_back("/usr/lib/gcc41");
276911e1b40d759a643086f590f6ffbd9d68360bad46Daniel Dunbar
277011e1b40d759a643086f590f6ffbd9d68360bad46Daniel Dunbar      CmdArgs.push_back("-rpath-link");
277111e1b40d759a643086f590f6ffbd9d68360bad46Daniel Dunbar      CmdArgs.push_back("/usr/lib/gcc41");
277211e1b40d759a643086f590f6ffbd9d68360bad46Daniel Dunbar
277311e1b40d759a643086f590f6ffbd9d68360bad46Daniel Dunbar      CmdArgs.push_back("-rpath");
277411e1b40d759a643086f590f6ffbd9d68360bad46Daniel Dunbar      CmdArgs.push_back("/usr/lib");
277511e1b40d759a643086f590f6ffbd9d68360bad46Daniel Dunbar
277611e1b40d759a643086f590f6ffbd9d68360bad46Daniel Dunbar      CmdArgs.push_back("-rpath-link");
277711e1b40d759a643086f590f6ffbd9d68360bad46Daniel Dunbar      CmdArgs.push_back("/usr/lib");
277811e1b40d759a643086f590f6ffbd9d68360bad46Daniel Dunbar    }
277911e1b40d759a643086f590f6ffbd9d68360bad46Daniel Dunbar
278011e1b40d759a643086f590f6ffbd9d68360bad46Daniel Dunbar    if (Args.hasArg(options::OPT_shared)) {
278111e1b40d759a643086f590f6ffbd9d68360bad46Daniel Dunbar      CmdArgs.push_back("-lgcc_pic");
278211e1b40d759a643086f590f6ffbd9d68360bad46Daniel Dunbar    } else {
278311e1b40d759a643086f590f6ffbd9d68360bad46Daniel Dunbar      CmdArgs.push_back("-lgcc");
278411e1b40d759a643086f590f6ffbd9d68360bad46Daniel Dunbar    }
278511e1b40d759a643086f590f6ffbd9d68360bad46Daniel Dunbar
278611e1b40d759a643086f590f6ffbd9d68360bad46Daniel Dunbar
278711e1b40d759a643086f590f6ffbd9d68360bad46Daniel Dunbar    if (Args.hasArg(options::OPT_pthread))
27884d63f8bc2686d5d7580324407854f2ca7c128832Mike Stump      CmdArgs.push_back("-lpthread");
278911e1b40d759a643086f590f6ffbd9d68360bad46Daniel Dunbar
279011e1b40d759a643086f590f6ffbd9d68360bad46Daniel Dunbar    if (!Args.hasArg(options::OPT_nolibc)) {
279111e1b40d759a643086f590f6ffbd9d68360bad46Daniel Dunbar      CmdArgs.push_back("-lc");
279211e1b40d759a643086f590f6ffbd9d68360bad46Daniel Dunbar    }
279311e1b40d759a643086f590f6ffbd9d68360bad46Daniel Dunbar
279411e1b40d759a643086f590f6ffbd9d68360bad46Daniel Dunbar    if (Args.hasArg(options::OPT_shared)) {
279511e1b40d759a643086f590f6ffbd9d68360bad46Daniel Dunbar      CmdArgs.push_back("-lgcc_pic");
279611e1b40d759a643086f590f6ffbd9d68360bad46Daniel Dunbar    } else {
279711e1b40d759a643086f590f6ffbd9d68360bad46Daniel Dunbar      CmdArgs.push_back("-lgcc");
279811e1b40d759a643086f590f6ffbd9d68360bad46Daniel Dunbar    }
279911e1b40d759a643086f590f6ffbd9d68360bad46Daniel Dunbar  }
280011e1b40d759a643086f590f6ffbd9d68360bad46Daniel Dunbar
280111e1b40d759a643086f590f6ffbd9d68360bad46Daniel Dunbar  if (!Args.hasArg(options::OPT_nostdlib) &&
280211e1b40d759a643086f590f6ffbd9d68360bad46Daniel Dunbar      !Args.hasArg(options::OPT_nostartfiles)) {
280311e1b40d759a643086f590f6ffbd9d68360bad46Daniel Dunbar    if (!Args.hasArg(options::OPT_shared))
28045ed34f4c58b6ad4e21038d713c1fae31a6146ff5Daniel Dunbar      CmdArgs.push_back(Args.MakeArgString(getToolChain().GetFilePath(C, "crtend.o")));
280511e1b40d759a643086f590f6ffbd9d68360bad46Daniel Dunbar    else
28065ed34f4c58b6ad4e21038d713c1fae31a6146ff5Daniel Dunbar      CmdArgs.push_back(Args.MakeArgString(getToolChain().GetFilePath(C, "crtendS.o")));
28075ed34f4c58b6ad4e21038d713c1fae31a6146ff5Daniel Dunbar    CmdArgs.push_back(Args.MakeArgString(getToolChain().GetFilePath(C, "crtn.o")));
280811e1b40d759a643086f590f6ffbd9d68360bad46Daniel Dunbar  }
280911e1b40d759a643086f590f6ffbd9d68360bad46Daniel Dunbar
281011e1b40d759a643086f590f6ffbd9d68360bad46Daniel Dunbar  const char *Exec =
28115ed34f4c58b6ad4e21038d713c1fae31a6146ff5Daniel Dunbar    Args.MakeArgString(getToolChain().GetProgramPath(C, "ld"));
2812daab7b1016f0a82fefa4f7be6e63c57c06b19ffcDaniel Dunbar  Dest.addCommand(new Command(JA, *this, Exec, CmdArgs));
281311e1b40d759a643086f590f6ffbd9d68360bad46Daniel Dunbar}
2814