Tools.cpp revision b9f3a777e503851964c9542a0261e45eece59747
147ac7d27c44bd64a7d0fc03d4babc196cf2b8230Daniel Dunbar//===--- Tools.cpp - Tools Implementations ------------------------------*-===//
247ac7d27c44bd64a7d0fc03d4babc196cf2b8230Daniel Dunbar//
347ac7d27c44bd64a7d0fc03d4babc196cf2b8230Daniel Dunbar//                     The LLVM Compiler Infrastructure
447ac7d27c44bd64a7d0fc03d4babc196cf2b8230Daniel Dunbar//
547ac7d27c44bd64a7d0fc03d4babc196cf2b8230Daniel Dunbar// This file is distributed under the University of Illinois Open Source
647ac7d27c44bd64a7d0fc03d4babc196cf2b8230Daniel Dunbar// License. See LICENSE.TXT for details.
747ac7d27c44bd64a7d0fc03d4babc196cf2b8230Daniel Dunbar//
847ac7d27c44bd64a7d0fc03d4babc196cf2b8230Daniel Dunbar//===----------------------------------------------------------------------===//
947ac7d27c44bd64a7d0fc03d4babc196cf2b8230Daniel Dunbar
1047ac7d27c44bd64a7d0fc03d4babc196cf2b8230Daniel Dunbar#include "Tools.h"
1147ac7d27c44bd64a7d0fc03d4babc196cf2b8230Daniel Dunbar
121d46033f760ba5fd266ce59fe391fac473f04f52Daniel Dunbar#include "clang/Driver/Action.h"
13871adcf4e41285e3f4c3b62eaa1b2e05b60b92daDaniel Dunbar#include "clang/Driver/Arg.h"
14b488c1dac8e53206f07103d794a62a3f5012c0f4Daniel Dunbar#include "clang/Driver/ArgList.h"
151d46033f760ba5fd266ce59fe391fac473f04f52Daniel Dunbar#include "clang/Driver/Driver.h" // FIXME: Remove?
161d46033f760ba5fd266ce59fe391fac473f04f52Daniel Dunbar#include "clang/Driver/DriverDiagnostic.h" // FIXME: Remove?
17871adcf4e41285e3f4c3b62eaa1b2e05b60b92daDaniel Dunbar#include "clang/Driver/Compilation.h"
18871adcf4e41285e3f4c3b62eaa1b2e05b60b92daDaniel Dunbar#include "clang/Driver/Job.h"
19b488c1dac8e53206f07103d794a62a3f5012c0f4Daniel Dunbar#include "clang/Driver/HostInfo.h"
20b488c1dac8e53206f07103d794a62a3f5012c0f4Daniel Dunbar#include "clang/Driver/Option.h"
21b488c1dac8e53206f07103d794a62a3f5012c0f4Daniel Dunbar#include "clang/Driver/ToolChain.h"
22871adcf4e41285e3f4c3b62eaa1b2e05b60b92daDaniel Dunbar#include "clang/Driver/Util.h"
23871adcf4e41285e3f4c3b62eaa1b2e05b60b92daDaniel Dunbar
24871adcf4e41285e3f4c3b62eaa1b2e05b60b92daDaniel Dunbar#include "llvm/ADT/SmallVector.h"
2502633b541b04ad5ffc1c70f4c2feeeb13e607057Daniel Dunbar#include "llvm/Support/Format.h"
2602633b541b04ad5ffc1c70f4c2feeeb13e607057Daniel Dunbar#include "llvm/Support/raw_ostream.h"
27871adcf4e41285e3f4c3b62eaa1b2e05b60b92daDaniel Dunbar
28871adcf4e41285e3f4c3b62eaa1b2e05b60b92daDaniel Dunbar#include "InputInfo.h"
2902633b541b04ad5ffc1c70f4c2feeeb13e607057Daniel Dunbar#include "ToolChains.h"
30871adcf4e41285e3f4c3b62eaa1b2e05b60b92daDaniel Dunbar
3147ac7d27c44bd64a7d0fc03d4babc196cf2b8230Daniel Dunbarusing namespace clang::driver;
3247ac7d27c44bd64a7d0fc03d4babc196cf2b8230Daniel Dunbarusing namespace clang::driver::tools;
3347ac7d27c44bd64a7d0fc03d4babc196cf2b8230Daniel Dunbar
3447ac7d27c44bd64a7d0fc03d4babc196cf2b8230Daniel Dunbarvoid Clang::ConstructJob(Compilation &C, const JobAction &JA,
35871adcf4e41285e3f4c3b62eaa1b2e05b60b92daDaniel Dunbar                         Job &Dest,
36871adcf4e41285e3f4c3b62eaa1b2e05b60b92daDaniel Dunbar                         const InputInfo &Output,
3762cf601812e03dd9bc5df42b8ef06a0cdedc38bfDaniel Dunbar                         const InputInfoList &Inputs,
381d46033f760ba5fd266ce59fe391fac473f04f52Daniel Dunbar                         const ArgList &Args,
3947ac7d27c44bd64a7d0fc03d4babc196cf2b8230Daniel Dunbar                         const char *LinkingOutput) const {
40b488c1dac8e53206f07103d794a62a3f5012c0f4Daniel Dunbar  ArgStringList CmdArgs;
41b488c1dac8e53206f07103d794a62a3f5012c0f4Daniel Dunbar
421d46033f760ba5fd266ce59fe391fac473f04f52Daniel Dunbar  if (isa<AnalyzeJobAction>(JA)) {
431d46033f760ba5fd266ce59fe391fac473f04f52Daniel Dunbar    assert(JA.getType() == types::TY_Plist && "Invalid output type.");
441d46033f760ba5fd266ce59fe391fac473f04f52Daniel Dunbar    CmdArgs.push_back("-analyze");
451d46033f760ba5fd266ce59fe391fac473f04f52Daniel Dunbar  } else if (isa<PreprocessJobAction>(JA)) {
461d46033f760ba5fd266ce59fe391fac473f04f52Daniel Dunbar    CmdArgs.push_back("-E");
471d46033f760ba5fd266ce59fe391fac473f04f52Daniel Dunbar  } else if (isa<PrecompileJobAction>(JA)) {
481d46033f760ba5fd266ce59fe391fac473f04f52Daniel Dunbar    // No special option needed, driven by -x.
491d46033f760ba5fd266ce59fe391fac473f04f52Daniel Dunbar    //
501d46033f760ba5fd266ce59fe391fac473f04f52Daniel Dunbar    // FIXME: Don't drive this by -x, that is gross.
511d46033f760ba5fd266ce59fe391fac473f04f52Daniel Dunbar  } else {
521d46033f760ba5fd266ce59fe391fac473f04f52Daniel Dunbar    assert(isa<CompileJobAction>(JA) && "Invalid action for clang tool.");
531d46033f760ba5fd266ce59fe391fac473f04f52Daniel Dunbar
541d46033f760ba5fd266ce59fe391fac473f04f52Daniel Dunbar    if (JA.getType() == types::TY_Nothing) {
551d46033f760ba5fd266ce59fe391fac473f04f52Daniel Dunbar      CmdArgs.push_back("-fsyntax-only");
561d46033f760ba5fd266ce59fe391fac473f04f52Daniel Dunbar    } else if (JA.getType() == types::TY_LLVMAsm) {
571d46033f760ba5fd266ce59fe391fac473f04f52Daniel Dunbar      CmdArgs.push_back("-emit-llvm");
581d46033f760ba5fd266ce59fe391fac473f04f52Daniel Dunbar    } else if (JA.getType() == types::TY_LLVMBC) {
591d46033f760ba5fd266ce59fe391fac473f04f52Daniel Dunbar      CmdArgs.push_back("-emit-llvm-bc");
601d46033f760ba5fd266ce59fe391fac473f04f52Daniel Dunbar    } else if (JA.getType() == types::TY_PP_Asm) {
611d46033f760ba5fd266ce59fe391fac473f04f52Daniel Dunbar      CmdArgs.push_back("-S");
621d46033f760ba5fd266ce59fe391fac473f04f52Daniel Dunbar    }
631d46033f760ba5fd266ce59fe391fac473f04f52Daniel Dunbar  }
641d46033f760ba5fd266ce59fe391fac473f04f52Daniel Dunbar
651d46033f760ba5fd266ce59fe391fac473f04f52Daniel Dunbar  // The make clang go fast button.
661d46033f760ba5fd266ce59fe391fac473f04f52Daniel Dunbar  CmdArgs.push_back("-disable-free");
671d46033f760ba5fd266ce59fe391fac473f04f52Daniel Dunbar
681d46033f760ba5fd266ce59fe391fac473f04f52Daniel Dunbar  if (isa<AnalyzeJobAction>(JA)) {
691d46033f760ba5fd266ce59fe391fac473f04f52Daniel Dunbar    // Add default argument set.
701d46033f760ba5fd266ce59fe391fac473f04f52Daniel Dunbar    //
711d46033f760ba5fd266ce59fe391fac473f04f52Daniel Dunbar    // FIXME: Move into clang?
721d46033f760ba5fd266ce59fe391fac473f04f52Daniel Dunbar    CmdArgs.push_back("-warn-dead-stores");
731d46033f760ba5fd266ce59fe391fac473f04f52Daniel Dunbar    CmdArgs.push_back("-checker-cfref");
749b646dac1c05fbfbfb4db0cb88ea28e74fbe7b9aTed Kremenek    CmdArgs.push_back("-analyzer-eagerly-assume");
751d46033f760ba5fd266ce59fe391fac473f04f52Daniel Dunbar    CmdArgs.push_back("-warn-objc-methodsigs");
761d46033f760ba5fd266ce59fe391fac473f04f52Daniel Dunbar    // Do not enable the missing -dealloc check.
771d46033f760ba5fd266ce59fe391fac473f04f52Daniel Dunbar    // '-warn-objc-missing-dealloc',
781d46033f760ba5fd266ce59fe391fac473f04f52Daniel Dunbar    CmdArgs.push_back("-warn-objc-unused-ivars");
791d46033f760ba5fd266ce59fe391fac473f04f52Daniel Dunbar
801d46033f760ba5fd266ce59fe391fac473f04f52Daniel Dunbar    CmdArgs.push_back("-analyzer-output=plist");
811d46033f760ba5fd266ce59fe391fac473f04f52Daniel Dunbar
821d46033f760ba5fd266ce59fe391fac473f04f52Daniel Dunbar    // Add -Xanalyzer arguments when running as analyzer.
831d46033f760ba5fd266ce59fe391fac473f04f52Daniel Dunbar    Args.AddAllArgValues(CmdArgs, options::OPT_Xanalyzer);
841d46033f760ba5fd266ce59fe391fac473f04f52Daniel Dunbar  } else {
851d46033f760ba5fd266ce59fe391fac473f04f52Daniel Dunbar    // Perform argument translation for LLVM backend. This
861d46033f760ba5fd266ce59fe391fac473f04f52Daniel Dunbar    // takes some care in reconciling with llvm-gcc. The
871d46033f760ba5fd266ce59fe391fac473f04f52Daniel Dunbar    // issue is that llvm-gcc translates these options based on
881d46033f760ba5fd266ce59fe391fac473f04f52Daniel Dunbar    // the values in cc1, whereas we are processing based on
891d46033f760ba5fd266ce59fe391fac473f04f52Daniel Dunbar    // the driver arguments.
901d46033f760ba5fd266ce59fe391fac473f04f52Daniel Dunbar    //
911d46033f760ba5fd266ce59fe391fac473f04f52Daniel Dunbar    // FIXME: This is currently broken for -f flags when -fno
921d46033f760ba5fd266ce59fe391fac473f04f52Daniel Dunbar    // variants are present.
931d46033f760ba5fd266ce59fe391fac473f04f52Daniel Dunbar
941d46033f760ba5fd266ce59fe391fac473f04f52Daniel Dunbar    // This comes from the default translation the driver + cc1
951d46033f760ba5fd266ce59fe391fac473f04f52Daniel Dunbar    // would do to enable flag_pic.
961d46033f760ba5fd266ce59fe391fac473f04f52Daniel Dunbar    //
971d46033f760ba5fd266ce59fe391fac473f04f52Daniel Dunbar    // FIXME: Centralize this code.
981d46033f760ba5fd266ce59fe391fac473f04f52Daniel Dunbar    bool PICEnabled = (Args.hasArg(options::OPT_fPIC) ||
991d46033f760ba5fd266ce59fe391fac473f04f52Daniel Dunbar                       Args.hasArg(options::OPT_fpic) ||
1001d46033f760ba5fd266ce59fe391fac473f04f52Daniel Dunbar                       Args.hasArg(options::OPT_fPIE) ||
1011d46033f760ba5fd266ce59fe391fac473f04f52Daniel Dunbar                       Args.hasArg(options::OPT_fpie));
1021d46033f760ba5fd266ce59fe391fac473f04f52Daniel Dunbar    bool PICDisabled = (Args.hasArg(options::OPT_mkernel) ||
1031d46033f760ba5fd266ce59fe391fac473f04f52Daniel Dunbar                        Args.hasArg(options::OPT_static));
1041d46033f760ba5fd266ce59fe391fac473f04f52Daniel Dunbar    const char *Model = getToolChain().GetForcedPicModel();
1051d46033f760ba5fd266ce59fe391fac473f04f52Daniel Dunbar    if (!Model) {
1061d46033f760ba5fd266ce59fe391fac473f04f52Daniel Dunbar      if (Args.hasArg(options::OPT_mdynamic_no_pic))
1071d46033f760ba5fd266ce59fe391fac473f04f52Daniel Dunbar        Model = "dynamic-no-pic";
1081d46033f760ba5fd266ce59fe391fac473f04f52Daniel Dunbar      else if (PICDisabled)
1091d46033f760ba5fd266ce59fe391fac473f04f52Daniel Dunbar        Model = "static";
1101d46033f760ba5fd266ce59fe391fac473f04f52Daniel Dunbar      else if (PICEnabled)
1111d46033f760ba5fd266ce59fe391fac473f04f52Daniel Dunbar        Model = "pic";
1121d46033f760ba5fd266ce59fe391fac473f04f52Daniel Dunbar      else
1131d46033f760ba5fd266ce59fe391fac473f04f52Daniel Dunbar        Model = getToolChain().GetDefaultRelocationModel();
1141d46033f760ba5fd266ce59fe391fac473f04f52Daniel Dunbar    }
1151d46033f760ba5fd266ce59fe391fac473f04f52Daniel Dunbar    CmdArgs.push_back("--relocation-model");
1161d46033f760ba5fd266ce59fe391fac473f04f52Daniel Dunbar    CmdArgs.push_back(Model);
1171d46033f760ba5fd266ce59fe391fac473f04f52Daniel Dunbar
1181d46033f760ba5fd266ce59fe391fac473f04f52Daniel Dunbar    if (Args.hasArg(options::OPT_ftime_report))
1191d46033f760ba5fd266ce59fe391fac473f04f52Daniel Dunbar      CmdArgs.push_back("--time-passes");
1201d46033f760ba5fd266ce59fe391fac473f04f52Daniel Dunbar    // FIXME: Set --enable-unsafe-fp-math.
1211d46033f760ba5fd266ce59fe391fac473f04f52Daniel Dunbar    if (!Args.hasArg(options::OPT_fomit_frame_pointer))
1221d46033f760ba5fd266ce59fe391fac473f04f52Daniel Dunbar      CmdArgs.push_back("--disable-fp-elim");
1231d46033f760ba5fd266ce59fe391fac473f04f52Daniel Dunbar    if (!Args.hasFlag(options::OPT_fzero_initialized_in_bss,
1241d46033f760ba5fd266ce59fe391fac473f04f52Daniel Dunbar                      options::OPT_fno_zero_initialized_in_bss,
1251d46033f760ba5fd266ce59fe391fac473f04f52Daniel Dunbar                      true))
1261d46033f760ba5fd266ce59fe391fac473f04f52Daniel Dunbar      CmdArgs.push_back("--nozero-initialized-in-bss");
127b3fd500a1c486e9fb82d82e28828ead025462aebDaniel Dunbar    if (Args.hasArg(options::OPT_dA) || Args.hasArg(options::OPT_fverbose_asm))
1281d46033f760ba5fd266ce59fe391fac473f04f52Daniel Dunbar      CmdArgs.push_back("--asm-verbose");
1291d46033f760ba5fd266ce59fe391fac473f04f52Daniel Dunbar    if (Args.hasArg(options::OPT_fdebug_pass_structure))
1301d46033f760ba5fd266ce59fe391fac473f04f52Daniel Dunbar      CmdArgs.push_back("--debug-pass=Structure");
1311d46033f760ba5fd266ce59fe391fac473f04f52Daniel Dunbar    if (Args.hasArg(options::OPT_fdebug_pass_arguments))
1321d46033f760ba5fd266ce59fe391fac473f04f52Daniel Dunbar      CmdArgs.push_back("--debug-pass=Arguments");
1331d46033f760ba5fd266ce59fe391fac473f04f52Daniel Dunbar    // FIXME: set --inline-threshhold=50 if (optimize_size || optimize
1341d46033f760ba5fd266ce59fe391fac473f04f52Daniel Dunbar    // < 3)
1351d46033f760ba5fd266ce59fe391fac473f04f52Daniel Dunbar    if (Args.hasFlag(options::OPT_funwind_tables,
1361d46033f760ba5fd266ce59fe391fac473f04f52Daniel Dunbar                      options::OPT_fno_unwind_tables,
1371d46033f760ba5fd266ce59fe391fac473f04f52Daniel Dunbar                      getToolChain().IsUnwindTablesDefault()))
1381d46033f760ba5fd266ce59fe391fac473f04f52Daniel Dunbar      CmdArgs.push_back("--unwind-tables=1");
1391d46033f760ba5fd266ce59fe391fac473f04f52Daniel Dunbar    else
1401d46033f760ba5fd266ce59fe391fac473f04f52Daniel Dunbar      CmdArgs.push_back("--unwind-tables=0");
1411d46033f760ba5fd266ce59fe391fac473f04f52Daniel Dunbar    if (!Args.hasFlag(options::OPT_mred_zone,
1421d46033f760ba5fd266ce59fe391fac473f04f52Daniel Dunbar                       options::OPT_mno_red_zone,
1431d46033f760ba5fd266ce59fe391fac473f04f52Daniel Dunbar                       true))
1441d46033f760ba5fd266ce59fe391fac473f04f52Daniel Dunbar      CmdArgs.push_back("--disable-red-zone");
1451d46033f760ba5fd266ce59fe391fac473f04f52Daniel Dunbar    if (Args.hasFlag(options::OPT_msoft_float,
1461d46033f760ba5fd266ce59fe391fac473f04f52Daniel Dunbar                      options::OPT_mno_soft_float,
1471d46033f760ba5fd266ce59fe391fac473f04f52Daniel Dunbar                      false))
1481d46033f760ba5fd266ce59fe391fac473f04f52Daniel Dunbar      CmdArgs.push_back("--soft-float");
1491d46033f760ba5fd266ce59fe391fac473f04f52Daniel Dunbar
1501d46033f760ba5fd266ce59fe391fac473f04f52Daniel Dunbar    // FIXME: Need target hooks.
1511d46033f760ba5fd266ce59fe391fac473f04f52Daniel Dunbar    if (memcmp(getToolChain().getPlatform().c_str(), "darwin", 6) == 0) {
1521d46033f760ba5fd266ce59fe391fac473f04f52Daniel Dunbar      if (getToolChain().getArchName() == "x86_64")
1531d46033f760ba5fd266ce59fe391fac473f04f52Daniel Dunbar        CmdArgs.push_back("--mcpu=core2");
1541d46033f760ba5fd266ce59fe391fac473f04f52Daniel Dunbar      else if (getToolChain().getArchName() == "i386")
1551d46033f760ba5fd266ce59fe391fac473f04f52Daniel Dunbar        CmdArgs.push_back("--mcpu=yonah");
1561d46033f760ba5fd266ce59fe391fac473f04f52Daniel Dunbar    }
1571d46033f760ba5fd266ce59fe391fac473f04f52Daniel Dunbar
1581d46033f760ba5fd266ce59fe391fac473f04f52Daniel Dunbar    // FIXME: Ignores ordering. Also, we need to find a realistic
1591d46033f760ba5fd266ce59fe391fac473f04f52Daniel Dunbar    // solution for this.
1601d46033f760ba5fd266ce59fe391fac473f04f52Daniel Dunbar    static const struct {
1611d46033f760ba5fd266ce59fe391fac473f04f52Daniel Dunbar      options::ID Pos, Neg;
1621d46033f760ba5fd266ce59fe391fac473f04f52Daniel Dunbar      const char *Name;
1631d46033f760ba5fd266ce59fe391fac473f04f52Daniel Dunbar    } FeatureOptions[] = {
1641d46033f760ba5fd266ce59fe391fac473f04f52Daniel Dunbar      { options::OPT_mmmx, options::OPT_mno_mmx, "mmx" },
1651d46033f760ba5fd266ce59fe391fac473f04f52Daniel Dunbar      { options::OPT_msse, options::OPT_mno_sse, "sse" },
1661d46033f760ba5fd266ce59fe391fac473f04f52Daniel Dunbar      { options::OPT_msse2, options::OPT_mno_sse2, "sse2" },
1671d46033f760ba5fd266ce59fe391fac473f04f52Daniel Dunbar      { options::OPT_msse3, options::OPT_mno_sse3, "sse3" },
1681d46033f760ba5fd266ce59fe391fac473f04f52Daniel Dunbar      { options::OPT_mssse3, options::OPT_mno_ssse3, "ssse3" },
1691d46033f760ba5fd266ce59fe391fac473f04f52Daniel Dunbar      { options::OPT_msse41, options::OPT_mno_sse41, "sse41" },
1701d46033f760ba5fd266ce59fe391fac473f04f52Daniel Dunbar      { options::OPT_msse42, options::OPT_mno_sse42, "sse42" },
1711d46033f760ba5fd266ce59fe391fac473f04f52Daniel Dunbar      { options::OPT_msse4a, options::OPT_mno_sse4a, "sse4a" },
1721d46033f760ba5fd266ce59fe391fac473f04f52Daniel Dunbar      { options::OPT_m3dnow, options::OPT_mno_3dnow, "3dnow" },
1731d46033f760ba5fd266ce59fe391fac473f04f52Daniel Dunbar      { options::OPT_m3dnowa, options::OPT_mno_3dnowa, "3dnowa" }
1741d46033f760ba5fd266ce59fe391fac473f04f52Daniel Dunbar    };
1751d46033f760ba5fd266ce59fe391fac473f04f52Daniel Dunbar    const unsigned NumFeatureOptions =
1761d46033f760ba5fd266ce59fe391fac473f04f52Daniel Dunbar      sizeof(FeatureOptions)/sizeof(FeatureOptions[0]);
1771d46033f760ba5fd266ce59fe391fac473f04f52Daniel Dunbar
1781d46033f760ba5fd266ce59fe391fac473f04f52Daniel Dunbar    // FIXME: Avoid std::string
1791d46033f760ba5fd266ce59fe391fac473f04f52Daniel Dunbar    std::string Attrs;
1801d46033f760ba5fd266ce59fe391fac473f04f52Daniel Dunbar    for (unsigned i=0; i < NumFeatureOptions; ++i) {
1811d46033f760ba5fd266ce59fe391fac473f04f52Daniel Dunbar      if (Args.hasArg(FeatureOptions[i].Pos)) {
18255b3b5f5c6c92f5dbb10dfe96a7de07a2b364338Daniel Dunbar        if (!Attrs.empty())
18355b3b5f5c6c92f5dbb10dfe96a7de07a2b364338Daniel Dunbar          Attrs += ',';
1841d46033f760ba5fd266ce59fe391fac473f04f52Daniel Dunbar        Attrs += '+';
1851d46033f760ba5fd266ce59fe391fac473f04f52Daniel Dunbar        Attrs += FeatureOptions[i].Name;
1861d46033f760ba5fd266ce59fe391fac473f04f52Daniel Dunbar      } else if (Args.hasArg(FeatureOptions[i].Neg)) {
18755b3b5f5c6c92f5dbb10dfe96a7de07a2b364338Daniel Dunbar        if (!Attrs.empty())
18855b3b5f5c6c92f5dbb10dfe96a7de07a2b364338Daniel Dunbar          Attrs += ',';
1891d46033f760ba5fd266ce59fe391fac473f04f52Daniel Dunbar        Attrs += '-';
1901d46033f760ba5fd266ce59fe391fac473f04f52Daniel Dunbar        Attrs += FeatureOptions[i].Name;
1911d46033f760ba5fd266ce59fe391fac473f04f52Daniel Dunbar      }
1921d46033f760ba5fd266ce59fe391fac473f04f52Daniel Dunbar    }
1931d46033f760ba5fd266ce59fe391fac473f04f52Daniel Dunbar    if (!Attrs.empty()) {
1941d46033f760ba5fd266ce59fe391fac473f04f52Daniel Dunbar      CmdArgs.push_back("--mattr");
1951d46033f760ba5fd266ce59fe391fac473f04f52Daniel Dunbar      CmdArgs.push_back(Args.MakeArgString(Attrs.c_str()));
1961d46033f760ba5fd266ce59fe391fac473f04f52Daniel Dunbar    }
1971d46033f760ba5fd266ce59fe391fac473f04f52Daniel Dunbar
1981d46033f760ba5fd266ce59fe391fac473f04f52Daniel Dunbar    if (Args.hasFlag(options::OPT_fmath_errno,
1991d46033f760ba5fd266ce59fe391fac473f04f52Daniel Dunbar                      options::OPT_fno_math_errno,
2001d46033f760ba5fd266ce59fe391fac473f04f52Daniel Dunbar                      getToolChain().IsMathErrnoDefault()))
2011d46033f760ba5fd266ce59fe391fac473f04f52Daniel Dunbar      CmdArgs.push_back("--fmath-errno=1");
2021d46033f760ba5fd266ce59fe391fac473f04f52Daniel Dunbar    else
2031d46033f760ba5fd266ce59fe391fac473f04f52Daniel Dunbar      CmdArgs.push_back("--fmath-errno=0");
2041d46033f760ba5fd266ce59fe391fac473f04f52Daniel Dunbar
2051d46033f760ba5fd266ce59fe391fac473f04f52Daniel Dunbar    if (Arg *A = Args.getLastArg(options::OPT_flimited_precision_EQ)) {
2061d46033f760ba5fd266ce59fe391fac473f04f52Daniel Dunbar      CmdArgs.push_back("--limit-float-precision");
2071d46033f760ba5fd266ce59fe391fac473f04f52Daniel Dunbar      CmdArgs.push_back(A->getValue(Args));
2081d46033f760ba5fd266ce59fe391fac473f04f52Daniel Dunbar    }
2091d46033f760ba5fd266ce59fe391fac473f04f52Daniel Dunbar
2101d46033f760ba5fd266ce59fe391fac473f04f52Daniel Dunbar    // FIXME: Add --stack-protector-buffer-size=<xxx> on
2111d46033f760ba5fd266ce59fe391fac473f04f52Daniel Dunbar    // -fstack-protect.
2121d46033f760ba5fd266ce59fe391fac473f04f52Daniel Dunbar
2131d46033f760ba5fd266ce59fe391fac473f04f52Daniel Dunbar    Args.AddLastArg(CmdArgs, options::OPT_MD);
214546654a62eedb123b1b6d727ede29fd6cfb55087Daniel Dunbar    Args.AddLastArg(CmdArgs, options::OPT_MMD);
2151d46033f760ba5fd266ce59fe391fac473f04f52Daniel Dunbar    Args.AddAllArgs(CmdArgs, options::OPT_MF);
2161d46033f760ba5fd266ce59fe391fac473f04f52Daniel Dunbar    Args.AddLastArg(CmdArgs, options::OPT_MP);
2171d46033f760ba5fd266ce59fe391fac473f04f52Daniel Dunbar    Args.AddAllArgs(CmdArgs, options::OPT_MT);
2181d46033f760ba5fd266ce59fe391fac473f04f52Daniel Dunbar
2191d46033f760ba5fd266ce59fe391fac473f04f52Daniel Dunbar    Arg *Unsupported = Args.getLastArg(options::OPT_M);
2201d46033f760ba5fd266ce59fe391fac473f04f52Daniel Dunbar    if (!Unsupported)
2211d46033f760ba5fd266ce59fe391fac473f04f52Daniel Dunbar      Unsupported = Args.getLastArg(options::OPT_MM);
2221d46033f760ba5fd266ce59fe391fac473f04f52Daniel Dunbar    if (!Unsupported)
2231d46033f760ba5fd266ce59fe391fac473f04f52Daniel Dunbar      Unsupported = Args.getLastArg(options::OPT_MG);
2241d46033f760ba5fd266ce59fe391fac473f04f52Daniel Dunbar    if (!Unsupported)
2251d46033f760ba5fd266ce59fe391fac473f04f52Daniel Dunbar      Unsupported = Args.getLastArg(options::OPT_MQ);
2261d46033f760ba5fd266ce59fe391fac473f04f52Daniel Dunbar    if (Unsupported) {
2271d46033f760ba5fd266ce59fe391fac473f04f52Daniel Dunbar      const Driver &D = getToolChain().getHost().getDriver();
2281d46033f760ba5fd266ce59fe391fac473f04f52Daniel Dunbar      D.Diag(clang::diag::err_drv_unsupported_opt)
2291d46033f760ba5fd266ce59fe391fac473f04f52Daniel Dunbar        << Unsupported->getOption().getName();
2301d46033f760ba5fd266ce59fe391fac473f04f52Daniel Dunbar    }
2311d46033f760ba5fd266ce59fe391fac473f04f52Daniel Dunbar  }
2321d46033f760ba5fd266ce59fe391fac473f04f52Daniel Dunbar
2331d46033f760ba5fd266ce59fe391fac473f04f52Daniel Dunbar  Args.AddAllArgs(CmdArgs, options::OPT_v);
2341d46033f760ba5fd266ce59fe391fac473f04f52Daniel Dunbar  Args.AddAllArgs(CmdArgs, options::OPT_D, options::OPT_U);
2351d46033f760ba5fd266ce59fe391fac473f04f52Daniel Dunbar  Args.AddAllArgs(CmdArgs, options::OPT_I_Group, options::OPT_F);
2361d46033f760ba5fd266ce59fe391fac473f04f52Daniel Dunbar  Args.AddLastArg(CmdArgs, options::OPT_P);
2371d46033f760ba5fd266ce59fe391fac473f04f52Daniel Dunbar  Args.AddAllArgs(CmdArgs, options::OPT_mmacosx_version_min_EQ);
2381d46033f760ba5fd266ce59fe391fac473f04f52Daniel Dunbar
2391d46033f760ba5fd266ce59fe391fac473f04f52Daniel Dunbar  // Special case debug options to only pass -g to clang. This is
2401d46033f760ba5fd266ce59fe391fac473f04f52Daniel Dunbar  // wrong.
2411d46033f760ba5fd266ce59fe391fac473f04f52Daniel Dunbar  if (Args.hasArg(options::OPT_g_Group))
2421d46033f760ba5fd266ce59fe391fac473f04f52Daniel Dunbar    CmdArgs.push_back("-g");
2431d46033f760ba5fd266ce59fe391fac473f04f52Daniel Dunbar
2441d46033f760ba5fd266ce59fe391fac473f04f52Daniel Dunbar  Args.AddLastArg(CmdArgs, options::OPT_nostdinc);
2451d46033f760ba5fd266ce59fe391fac473f04f52Daniel Dunbar
2461d46033f760ba5fd266ce59fe391fac473f04f52Daniel Dunbar  // FIXME: Clang isn't going to accept just anything here.
247049853d74ea052ed904de7e18ae51d6953177822Daniel Dunbar  // FIXME: Use iterator.
2481d46033f760ba5fd266ce59fe391fac473f04f52Daniel Dunbar
249049853d74ea052ed904de7e18ae51d6953177822Daniel Dunbar  // Add -i* options, and automatically translate to -include-pth for
250049853d74ea052ed904de7e18ae51d6953177822Daniel Dunbar  // transparent PCH support. It's wonky, but we include looking for
251049853d74ea052ed904de7e18ae51d6953177822Daniel Dunbar  // .gch so we can support seamless replacement into a build system
252049853d74ea052ed904de7e18ae51d6953177822Daniel Dunbar  // already set up to be generating .gch files.
2531d46033f760ba5fd266ce59fe391fac473f04f52Daniel Dunbar  for (ArgList::const_iterator
2541d46033f760ba5fd266ce59fe391fac473f04f52Daniel Dunbar         it = Args.begin(), ie = Args.end(); it != ie; ++it) {
2551d46033f760ba5fd266ce59fe391fac473f04f52Daniel Dunbar    const Arg *A = *it;
256049853d74ea052ed904de7e18ae51d6953177822Daniel Dunbar    if (!A->getOption().matches(options::OPT_i_Group))
257049853d74ea052ed904de7e18ae51d6953177822Daniel Dunbar      continue;
258049853d74ea052ed904de7e18ae51d6953177822Daniel Dunbar
2591d46033f760ba5fd266ce59fe391fac473f04f52Daniel Dunbar    if (A->getOption().matches(options::OPT_include)) {
260049853d74ea052ed904de7e18ae51d6953177822Daniel Dunbar      bool FoundPTH = false;
2611d46033f760ba5fd266ce59fe391fac473f04f52Daniel Dunbar      llvm::sys::Path P(A->getValue(Args));
2621d46033f760ba5fd266ce59fe391fac473f04f52Daniel Dunbar      P.appendSuffix("pth");
2631d46033f760ba5fd266ce59fe391fac473f04f52Daniel Dunbar      if (P.exists()) {
264049853d74ea052ed904de7e18ae51d6953177822Daniel Dunbar        FoundPTH = true;
2651d46033f760ba5fd266ce59fe391fac473f04f52Daniel Dunbar      } else {
2661d46033f760ba5fd266ce59fe391fac473f04f52Daniel Dunbar        P.eraseSuffix();
2671d46033f760ba5fd266ce59fe391fac473f04f52Daniel Dunbar        P.appendSuffix("gch");
268049853d74ea052ed904de7e18ae51d6953177822Daniel Dunbar        if (P.exists())
269049853d74ea052ed904de7e18ae51d6953177822Daniel Dunbar          FoundPTH = true;
270049853d74ea052ed904de7e18ae51d6953177822Daniel Dunbar      }
271049853d74ea052ed904de7e18ae51d6953177822Daniel Dunbar
272049853d74ea052ed904de7e18ae51d6953177822Daniel Dunbar      if (FoundPTH) {
273049853d74ea052ed904de7e18ae51d6953177822Daniel Dunbar        A->claim();
274049853d74ea052ed904de7e18ae51d6953177822Daniel Dunbar        CmdArgs.push_back("-include-pth");
275049853d74ea052ed904de7e18ae51d6953177822Daniel Dunbar        CmdArgs.push_back(Args.MakeArgString(P.c_str()));
276049853d74ea052ed904de7e18ae51d6953177822Daniel Dunbar        continue;
2771d46033f760ba5fd266ce59fe391fac473f04f52Daniel Dunbar      }
2781d46033f760ba5fd266ce59fe391fac473f04f52Daniel Dunbar    }
279049853d74ea052ed904de7e18ae51d6953177822Daniel Dunbar
280049853d74ea052ed904de7e18ae51d6953177822Daniel Dunbar    // Not translated, render as usual.
281049853d74ea052ed904de7e18ae51d6953177822Daniel Dunbar    A->claim();
282049853d74ea052ed904de7e18ae51d6953177822Daniel Dunbar    A->render(Args, CmdArgs);
2831d46033f760ba5fd266ce59fe391fac473f04f52Daniel Dunbar  }
2841d46033f760ba5fd266ce59fe391fac473f04f52Daniel Dunbar
285337a6271b98c4c183f7eaad1563a75260b4f2871Daniel Dunbar  // Manually translate -O to -O1 and -O4 to -O3; let clang reject
286337a6271b98c4c183f7eaad1563a75260b4f2871Daniel Dunbar  // others.
287337a6271b98c4c183f7eaad1563a75260b4f2871Daniel Dunbar  if (Arg *A = Args.getLastArg(options::OPT_O_Group)) {
288337a6271b98c4c183f7eaad1563a75260b4f2871Daniel Dunbar    if (A->getOption().getId() == options::OPT_O4)
289337a6271b98c4c183f7eaad1563a75260b4f2871Daniel Dunbar      CmdArgs.push_back("-O3");
290337a6271b98c4c183f7eaad1563a75260b4f2871Daniel Dunbar    else if (A->getValue(Args)[0] == '\0')
2911d46033f760ba5fd266ce59fe391fac473f04f52Daniel Dunbar      CmdArgs.push_back("-O1");
2921d46033f760ba5fd266ce59fe391fac473f04f52Daniel Dunbar    else
2935697aa0d75c87bafec78984048d558f8d12ca1b3Daniel Dunbar      A->render(Args, CmdArgs);
2941d46033f760ba5fd266ce59fe391fac473f04f52Daniel Dunbar  }
2951d46033f760ba5fd266ce59fe391fac473f04f52Daniel Dunbar
296ff7488dc9a766f94daf54d81b03ab9160d0bfd88Daniel Dunbar  Args.AddAllArgs(CmdArgs, options::OPT_clang_W_Group,
297ff7488dc9a766f94daf54d81b03ab9160d0bfd88Daniel Dunbar                  options::OPT_pedantic_Group);
2981d46033f760ba5fd266ce59fe391fac473f04f52Daniel Dunbar  Args.AddLastArg(CmdArgs, options::OPT_w);
2991d46033f760ba5fd266ce59fe391fac473f04f52Daniel Dunbar  Args.AddAllArgs(CmdArgs, options::OPT_std_EQ, options::OPT_ansi,
3001d46033f760ba5fd266ce59fe391fac473f04f52Daniel Dunbar                  options::OPT_trigraphs);
3011d46033f760ba5fd266ce59fe391fac473f04f52Daniel Dunbar
3021d46033f760ba5fd266ce59fe391fac473f04f52Daniel Dunbar  if (Arg *A = Args.getLastArg(options::OPT_ftemplate_depth_)) {
3031d46033f760ba5fd266ce59fe391fac473f04f52Daniel Dunbar    CmdArgs.push_back("-ftemplate-depth");
3041d46033f760ba5fd266ce59fe391fac473f04f52Daniel Dunbar    CmdArgs.push_back(A->getValue(Args));
305b488c1dac8e53206f07103d794a62a3f5012c0f4Daniel Dunbar  }
306b488c1dac8e53206f07103d794a62a3f5012c0f4Daniel Dunbar
3071d46033f760ba5fd266ce59fe391fac473f04f52Daniel Dunbar  Args.AddAllArgs(CmdArgs, options::OPT_clang_f_Group);
3081d46033f760ba5fd266ce59fe391fac473f04f52Daniel Dunbar
309b9f3a777e503851964c9542a0261e45eece59747Daniel Dunbar  // If tool chain translates fpascal-strings, we want to back
310b9f3a777e503851964c9542a0261e45eece59747Daniel Dunbar  // translate here.
311b9f3a777e503851964c9542a0261e45eece59747Daniel Dunbar  // FIXME: This is gross; that translation should be pulled from the
312b9f3a777e503851964c9542a0261e45eece59747Daniel Dunbar  // tool chain.
313b9f3a777e503851964c9542a0261e45eece59747Daniel Dunbar  if (Arg *A = Args.getLastArg(options::OPT_mpascal_strings,
314b9f3a777e503851964c9542a0261e45eece59747Daniel Dunbar                               options::OPT_mno_pascal_strings)) {
315b9f3a777e503851964c9542a0261e45eece59747Daniel Dunbar    if (A->getOption().matches(options::OPT_mpascal_strings))
316b9f3a777e503851964c9542a0261e45eece59747Daniel Dunbar      CmdArgs.push_back("-fpascal-strings");
317b9f3a777e503851964c9542a0261e45eece59747Daniel Dunbar    else
318b9f3a777e503851964c9542a0261e45eece59747Daniel Dunbar      CmdArgs.push_back("-fno-pascal-strings");
319b9f3a777e503851964c9542a0261e45eece59747Daniel Dunbar  }
320b9f3a777e503851964c9542a0261e45eece59747Daniel Dunbar
3211d46033f760ba5fd266ce59fe391fac473f04f52Daniel Dunbar  Args.AddLastArg(CmdArgs, options::OPT_dM);
3221d46033f760ba5fd266ce59fe391fac473f04f52Daniel Dunbar
3231d46033f760ba5fd266ce59fe391fac473f04f52Daniel Dunbar  Args.AddAllArgValues(CmdArgs, options::OPT_Xclang);
3241d46033f760ba5fd266ce59fe391fac473f04f52Daniel Dunbar
3251d46033f760ba5fd266ce59fe391fac473f04f52Daniel Dunbar  // FIXME: Always pass the full triple once we aren't concerned with
3261d46033f760ba5fd266ce59fe391fac473f04f52Daniel Dunbar  // ccc compat.
3271d46033f760ba5fd266ce59fe391fac473f04f52Daniel Dunbar  CmdArgs.push_back("-arch");
3281d46033f760ba5fd266ce59fe391fac473f04f52Daniel Dunbar  CmdArgs.push_back(getToolChain().getArchName().c_str());
3291d46033f760ba5fd266ce59fe391fac473f04f52Daniel Dunbar
330b488c1dac8e53206f07103d794a62a3f5012c0f4Daniel Dunbar  if (Output.isPipe()) {
331b488c1dac8e53206f07103d794a62a3f5012c0f4Daniel Dunbar    CmdArgs.push_back("-o");
332b488c1dac8e53206f07103d794a62a3f5012c0f4Daniel Dunbar    CmdArgs.push_back("-");
333115a79277edababaf1b26e3654044ae983197679Daniel Dunbar  } else if (Output.isFilename()) {
334b488c1dac8e53206f07103d794a62a3f5012c0f4Daniel Dunbar    CmdArgs.push_back("-o");
335115a79277edababaf1b26e3654044ae983197679Daniel Dunbar    CmdArgs.push_back(Output.getFilename());
336115a79277edababaf1b26e3654044ae983197679Daniel Dunbar  } else {
337115a79277edababaf1b26e3654044ae983197679Daniel Dunbar    assert(Output.isNothing() && "Invalid output.");
338b488c1dac8e53206f07103d794a62a3f5012c0f4Daniel Dunbar  }
339b488c1dac8e53206f07103d794a62a3f5012c0f4Daniel Dunbar
3401d46033f760ba5fd266ce59fe391fac473f04f52Daniel Dunbar  for (InputInfoList::const_iterator
3411d46033f760ba5fd266ce59fe391fac473f04f52Daniel Dunbar         it = Inputs.begin(), ie = Inputs.end(); it != ie; ++it) {
3421d46033f760ba5fd266ce59fe391fac473f04f52Daniel Dunbar    const InputInfo &II = *it;
3431d46033f760ba5fd266ce59fe391fac473f04f52Daniel Dunbar    CmdArgs.push_back("-x");
3441d46033f760ba5fd266ce59fe391fac473f04f52Daniel Dunbar    CmdArgs.push_back(types::getTypeName(II.getType()));
3451d46033f760ba5fd266ce59fe391fac473f04f52Daniel Dunbar    if (II.isPipe())
3461d46033f760ba5fd266ce59fe391fac473f04f52Daniel Dunbar      CmdArgs.push_back("-");
347115a79277edababaf1b26e3654044ae983197679Daniel Dunbar    else if (II.isFilename())
348115a79277edababaf1b26e3654044ae983197679Daniel Dunbar      CmdArgs.push_back(II.getFilename());
3491d46033f760ba5fd266ce59fe391fac473f04f52Daniel Dunbar    else
350115a79277edababaf1b26e3654044ae983197679Daniel Dunbar      II.getInputArg().renderAsInput(Args, CmdArgs);
3511d46033f760ba5fd266ce59fe391fac473f04f52Daniel Dunbar  }
3521d46033f760ba5fd266ce59fe391fac473f04f52Daniel Dunbar
3531d46033f760ba5fd266ce59fe391fac473f04f52Daniel Dunbar  const char *Exec =
354d7d5f0223bd30dfd618762349c6209dd1d5ea3e6Daniel Dunbar    Args.MakeArgString(getToolChain().GetProgramPath(C, "clang-cc").c_str());
3551d46033f760ba5fd266ce59fe391fac473f04f52Daniel Dunbar  Dest.addCommand(new Command(Exec, CmdArgs));
356a880db0b0fc028abf754c290d921d809eec0518aDaniel Dunbar
357a880db0b0fc028abf754c290d921d809eec0518aDaniel Dunbar  // Claim some arguments which clang doesn't support, but we don't
358a880db0b0fc028abf754c290d921d809eec0518aDaniel Dunbar  // care to warn the user about.
359a880db0b0fc028abf754c290d921d809eec0518aDaniel Dunbar
360a880db0b0fc028abf754c290d921d809eec0518aDaniel Dunbar  // FIXME: Use iterator.
361a880db0b0fc028abf754c290d921d809eec0518aDaniel Dunbar  for (ArgList::const_iterator
362a880db0b0fc028abf754c290d921d809eec0518aDaniel Dunbar         it = Args.begin(), ie = Args.end(); it != ie; ++it) {
363a880db0b0fc028abf754c290d921d809eec0518aDaniel Dunbar    const Arg *A = *it;
364a880db0b0fc028abf754c290d921d809eec0518aDaniel Dunbar    if (A->getOption().matches(options::OPT_clang_ignored_W_Group) ||
365a880db0b0fc028abf754c290d921d809eec0518aDaniel Dunbar        A->getOption().matches(options::OPT_clang_ignored_f_Group))
366a880db0b0fc028abf754c290d921d809eec0518aDaniel Dunbar      A->claim();
367a880db0b0fc028abf754c290d921d809eec0518aDaniel Dunbar  }
36847ac7d27c44bd64a7d0fc03d4babc196cf2b8230Daniel Dunbar}
36947ac7d27c44bd64a7d0fc03d4babc196cf2b8230Daniel Dunbar
370b488c1dac8e53206f07103d794a62a3f5012c0f4Daniel Dunbarvoid gcc::Common::ConstructJob(Compilation &C, const JobAction &JA,
371b488c1dac8e53206f07103d794a62a3f5012c0f4Daniel Dunbar                               Job &Dest,
372b488c1dac8e53206f07103d794a62a3f5012c0f4Daniel Dunbar                               const InputInfo &Output,
373b488c1dac8e53206f07103d794a62a3f5012c0f4Daniel Dunbar                               const InputInfoList &Inputs,
3741d46033f760ba5fd266ce59fe391fac473f04f52Daniel Dunbar                               const ArgList &Args,
375b488c1dac8e53206f07103d794a62a3f5012c0f4Daniel Dunbar                               const char *LinkingOutput) const {
376b488c1dac8e53206f07103d794a62a3f5012c0f4Daniel Dunbar  ArgStringList CmdArgs;
377b488c1dac8e53206f07103d794a62a3f5012c0f4Daniel Dunbar
378b488c1dac8e53206f07103d794a62a3f5012c0f4Daniel Dunbar  for (ArgList::const_iterator
3791d46033f760ba5fd266ce59fe391fac473f04f52Daniel Dunbar         it = Args.begin(), ie = Args.end(); it != ie; ++it) {
380b488c1dac8e53206f07103d794a62a3f5012c0f4Daniel Dunbar    Arg *A = *it;
3817587719c40ebf02bf11e5e66c30bd20e98edebc2Daniel Dunbar    if (A->getOption().hasForwardToGCC()) {
3827587719c40ebf02bf11e5e66c30bd20e98edebc2Daniel Dunbar      // It is unfortunate that we have to claim here, as this means
3837587719c40ebf02bf11e5e66c30bd20e98edebc2Daniel Dunbar      // we will basically never report anything interesting for
3847587719c40ebf02bf11e5e66c30bd20e98edebc2Daniel Dunbar      // platforms using a generic gcc.
3857587719c40ebf02bf11e5e66c30bd20e98edebc2Daniel Dunbar      A->claim();
3861d46033f760ba5fd266ce59fe391fac473f04f52Daniel Dunbar      A->render(Args, CmdArgs);
3877587719c40ebf02bf11e5e66c30bd20e98edebc2Daniel Dunbar    }
388b488c1dac8e53206f07103d794a62a3f5012c0f4Daniel Dunbar  }
389b488c1dac8e53206f07103d794a62a3f5012c0f4Daniel Dunbar
390b488c1dac8e53206f07103d794a62a3f5012c0f4Daniel Dunbar  RenderExtraToolArgs(CmdArgs);
391b488c1dac8e53206f07103d794a62a3f5012c0f4Daniel Dunbar
392b488c1dac8e53206f07103d794a62a3f5012c0f4Daniel Dunbar  // If using a driver driver, force the arch.
393b488c1dac8e53206f07103d794a62a3f5012c0f4Daniel Dunbar  if (getToolChain().getHost().useDriverDriver()) {
394b488c1dac8e53206f07103d794a62a3f5012c0f4Daniel Dunbar    CmdArgs.push_back("-arch");
395b488c1dac8e53206f07103d794a62a3f5012c0f4Daniel Dunbar    CmdArgs.push_back(getToolChain().getArchName().c_str());
396b488c1dac8e53206f07103d794a62a3f5012c0f4Daniel Dunbar  }
397b488c1dac8e53206f07103d794a62a3f5012c0f4Daniel Dunbar
398b488c1dac8e53206f07103d794a62a3f5012c0f4Daniel Dunbar  if (Output.isPipe()) {
399b488c1dac8e53206f07103d794a62a3f5012c0f4Daniel Dunbar    CmdArgs.push_back("-o");
400b488c1dac8e53206f07103d794a62a3f5012c0f4Daniel Dunbar    CmdArgs.push_back("-");
401115a79277edababaf1b26e3654044ae983197679Daniel Dunbar  } else if (Output.isFilename()) {
402b488c1dac8e53206f07103d794a62a3f5012c0f4Daniel Dunbar    CmdArgs.push_back("-o");
403115a79277edababaf1b26e3654044ae983197679Daniel Dunbar    CmdArgs.push_back(Output.getFilename());
404115a79277edababaf1b26e3654044ae983197679Daniel Dunbar  } else {
405115a79277edababaf1b26e3654044ae983197679Daniel Dunbar    assert(Output.isNothing() && "Unexpected output");
406b488c1dac8e53206f07103d794a62a3f5012c0f4Daniel Dunbar    CmdArgs.push_back("-fsyntax-only");
407115a79277edababaf1b26e3654044ae983197679Daniel Dunbar  }
408b488c1dac8e53206f07103d794a62a3f5012c0f4Daniel Dunbar
409b488c1dac8e53206f07103d794a62a3f5012c0f4Daniel Dunbar
410b488c1dac8e53206f07103d794a62a3f5012c0f4Daniel Dunbar  // Only pass -x if gcc will understand it; otherwise hope gcc
411b488c1dac8e53206f07103d794a62a3f5012c0f4Daniel Dunbar  // understands the suffix correctly. The main use case this would go
412b488c1dac8e53206f07103d794a62a3f5012c0f4Daniel Dunbar  // wrong in is for linker inputs if they happened to have an odd
413b488c1dac8e53206f07103d794a62a3f5012c0f4Daniel Dunbar  // suffix; really the only way to get this to happen is a command
414b488c1dac8e53206f07103d794a62a3f5012c0f4Daniel Dunbar  // like '-x foobar a.c' which will treat a.c like a linker input.
415b488c1dac8e53206f07103d794a62a3f5012c0f4Daniel Dunbar  //
416b488c1dac8e53206f07103d794a62a3f5012c0f4Daniel Dunbar  // FIXME: For the linker case specifically, can we safely convert
417b488c1dac8e53206f07103d794a62a3f5012c0f4Daniel Dunbar  // inputs into '-Wl,' options?
418b488c1dac8e53206f07103d794a62a3f5012c0f4Daniel Dunbar  for (InputInfoList::const_iterator
419b488c1dac8e53206f07103d794a62a3f5012c0f4Daniel Dunbar         it = Inputs.begin(), ie = Inputs.end(); it != ie; ++it) {
420b488c1dac8e53206f07103d794a62a3f5012c0f4Daniel Dunbar    const InputInfo &II = *it;
421b488c1dac8e53206f07103d794a62a3f5012c0f4Daniel Dunbar    if (types::canTypeBeUserSpecified(II.getType())) {
422b488c1dac8e53206f07103d794a62a3f5012c0f4Daniel Dunbar      CmdArgs.push_back("-x");
423b488c1dac8e53206f07103d794a62a3f5012c0f4Daniel Dunbar      CmdArgs.push_back(types::getTypeName(II.getType()));
424b488c1dac8e53206f07103d794a62a3f5012c0f4Daniel Dunbar    }
425b488c1dac8e53206f07103d794a62a3f5012c0f4Daniel Dunbar
426b488c1dac8e53206f07103d794a62a3f5012c0f4Daniel Dunbar    if (II.isPipe())
427b488c1dac8e53206f07103d794a62a3f5012c0f4Daniel Dunbar      CmdArgs.push_back("-");
428115a79277edababaf1b26e3654044ae983197679Daniel Dunbar    else if (II.isFilename())
429115a79277edababaf1b26e3654044ae983197679Daniel Dunbar      CmdArgs.push_back(II.getFilename());
430b488c1dac8e53206f07103d794a62a3f5012c0f4Daniel Dunbar    else
431115a79277edababaf1b26e3654044ae983197679Daniel Dunbar      // Don't render as input, we need gcc to do the translations.
432115a79277edababaf1b26e3654044ae983197679Daniel Dunbar      II.getInputArg().render(Args, CmdArgs);
433b488c1dac8e53206f07103d794a62a3f5012c0f4Daniel Dunbar  }
434b488c1dac8e53206f07103d794a62a3f5012c0f4Daniel Dunbar
435632f50edc08c76ebc643a0d4871bae33a55d7b4eDaniel Dunbar  const char *Exec =
436632f50edc08c76ebc643a0d4871bae33a55d7b4eDaniel Dunbar    Args.MakeArgString(getToolChain().GetProgramPath(C, "gcc").c_str());
437632f50edc08c76ebc643a0d4871bae33a55d7b4eDaniel Dunbar  Dest.addCommand(new Command(Exec, CmdArgs));
43847ac7d27c44bd64a7d0fc03d4babc196cf2b8230Daniel Dunbar}
43947ac7d27c44bd64a7d0fc03d4babc196cf2b8230Daniel Dunbar
440b488c1dac8e53206f07103d794a62a3f5012c0f4Daniel Dunbarvoid gcc::Preprocess::RenderExtraToolArgs(ArgStringList &CmdArgs) const {
441b488c1dac8e53206f07103d794a62a3f5012c0f4Daniel Dunbar  CmdArgs.push_back("-E");
44247ac7d27c44bd64a7d0fc03d4babc196cf2b8230Daniel Dunbar}
44347ac7d27c44bd64a7d0fc03d4babc196cf2b8230Daniel Dunbar
444b488c1dac8e53206f07103d794a62a3f5012c0f4Daniel Dunbarvoid gcc::Precompile::RenderExtraToolArgs(ArgStringList &CmdArgs) const {
445b488c1dac8e53206f07103d794a62a3f5012c0f4Daniel Dunbar  // The type is good enough.
44647ac7d27c44bd64a7d0fc03d4babc196cf2b8230Daniel Dunbar}
44747ac7d27c44bd64a7d0fc03d4babc196cf2b8230Daniel Dunbar
448b488c1dac8e53206f07103d794a62a3f5012c0f4Daniel Dunbarvoid gcc::Compile::RenderExtraToolArgs(ArgStringList &CmdArgs) const {
449b488c1dac8e53206f07103d794a62a3f5012c0f4Daniel Dunbar  CmdArgs.push_back("-S");
45047ac7d27c44bd64a7d0fc03d4babc196cf2b8230Daniel Dunbar}
45147ac7d27c44bd64a7d0fc03d4babc196cf2b8230Daniel Dunbar
452b488c1dac8e53206f07103d794a62a3f5012c0f4Daniel Dunbarvoid gcc::Assemble::RenderExtraToolArgs(ArgStringList &CmdArgs) const {
453b488c1dac8e53206f07103d794a62a3f5012c0f4Daniel Dunbar  CmdArgs.push_back("-c");
454b488c1dac8e53206f07103d794a62a3f5012c0f4Daniel Dunbar}
45547ac7d27c44bd64a7d0fc03d4babc196cf2b8230Daniel Dunbar
456b488c1dac8e53206f07103d794a62a3f5012c0f4Daniel Dunbarvoid gcc::Link::RenderExtraToolArgs(ArgStringList &CmdArgs) const {
457b488c1dac8e53206f07103d794a62a3f5012c0f4Daniel Dunbar  // The types are (hopefully) good enough.
45847ac7d27c44bd64a7d0fc03d4babc196cf2b8230Daniel Dunbar}
459b488c1dac8e53206f07103d794a62a3f5012c0f4Daniel Dunbar
4608cac5f7e1ce63dd77ee0fb4ef68f9fa804f41ea6Daniel Dunbarvoid darwin::Assemble::ConstructJob(Compilation &C, const JobAction &JA,
4618cac5f7e1ce63dd77ee0fb4ef68f9fa804f41ea6Daniel Dunbar                                    Job &Dest, const InputInfo &Output,
4628cac5f7e1ce63dd77ee0fb4ef68f9fa804f41ea6Daniel Dunbar                                    const InputInfoList &Inputs,
4638cac5f7e1ce63dd77ee0fb4ef68f9fa804f41ea6Daniel Dunbar                                    const ArgList &Args,
4648cac5f7e1ce63dd77ee0fb4ef68f9fa804f41ea6Daniel Dunbar                                    const char *LinkingOutput) const {
4658cac5f7e1ce63dd77ee0fb4ef68f9fa804f41ea6Daniel Dunbar  ArgStringList CmdArgs;
4668cac5f7e1ce63dd77ee0fb4ef68f9fa804f41ea6Daniel Dunbar
4678cac5f7e1ce63dd77ee0fb4ef68f9fa804f41ea6Daniel Dunbar  assert(Inputs.size() == 1 && "Unexpected number of inputs.");
4688cac5f7e1ce63dd77ee0fb4ef68f9fa804f41ea6Daniel Dunbar  const InputInfo &Input = Inputs[0];
4698cac5f7e1ce63dd77ee0fb4ef68f9fa804f41ea6Daniel Dunbar
4708cac5f7e1ce63dd77ee0fb4ef68f9fa804f41ea6Daniel Dunbar  // Bit of a hack, this is only used for original inputs.
4718cac5f7e1ce63dd77ee0fb4ef68f9fa804f41ea6Daniel Dunbar  if (Input.isFilename() &&
4728cac5f7e1ce63dd77ee0fb4ef68f9fa804f41ea6Daniel Dunbar      strcmp(Input.getFilename(), Input.getBaseInput()) == 0 &&
4738cac5f7e1ce63dd77ee0fb4ef68f9fa804f41ea6Daniel Dunbar      Args.hasArg(options::OPT_g_Group))
4748cac5f7e1ce63dd77ee0fb4ef68f9fa804f41ea6Daniel Dunbar    CmdArgs.push_back("--gstabs");
4758cac5f7e1ce63dd77ee0fb4ef68f9fa804f41ea6Daniel Dunbar
4768cac5f7e1ce63dd77ee0fb4ef68f9fa804f41ea6Daniel Dunbar  // Derived from asm spec.
4778cac5f7e1ce63dd77ee0fb4ef68f9fa804f41ea6Daniel Dunbar  CmdArgs.push_back("-arch");
4788cac5f7e1ce63dd77ee0fb4ef68f9fa804f41ea6Daniel Dunbar  CmdArgs.push_back(getToolChain().getArchName().c_str());
4798cac5f7e1ce63dd77ee0fb4ef68f9fa804f41ea6Daniel Dunbar
4808cac5f7e1ce63dd77ee0fb4ef68f9fa804f41ea6Daniel Dunbar  CmdArgs.push_back("-force_cpusubtype_ALL");
4818cac5f7e1ce63dd77ee0fb4ef68f9fa804f41ea6Daniel Dunbar  if ((Args.hasArg(options::OPT_mkernel) ||
4828cac5f7e1ce63dd77ee0fb4ef68f9fa804f41ea6Daniel Dunbar       Args.hasArg(options::OPT_static) ||
4838cac5f7e1ce63dd77ee0fb4ef68f9fa804f41ea6Daniel Dunbar       Args.hasArg(options::OPT_fapple_kext)) &&
4848cac5f7e1ce63dd77ee0fb4ef68f9fa804f41ea6Daniel Dunbar      !Args.hasArg(options::OPT_dynamic))
4858cac5f7e1ce63dd77ee0fb4ef68f9fa804f41ea6Daniel Dunbar      CmdArgs.push_back("-static");
4868cac5f7e1ce63dd77ee0fb4ef68f9fa804f41ea6Daniel Dunbar
4878cac5f7e1ce63dd77ee0fb4ef68f9fa804f41ea6Daniel Dunbar  Args.AddAllArgValues(CmdArgs, options::OPT_Wa_COMMA,
4888cac5f7e1ce63dd77ee0fb4ef68f9fa804f41ea6Daniel Dunbar                       options::OPT_Xassembler);
4898cac5f7e1ce63dd77ee0fb4ef68f9fa804f41ea6Daniel Dunbar
4908cac5f7e1ce63dd77ee0fb4ef68f9fa804f41ea6Daniel Dunbar  assert(Output.isFilename() && "Unexpected lipo output.");
4918cac5f7e1ce63dd77ee0fb4ef68f9fa804f41ea6Daniel Dunbar  CmdArgs.push_back("-o");
4928cac5f7e1ce63dd77ee0fb4ef68f9fa804f41ea6Daniel Dunbar  CmdArgs.push_back(Output.getFilename());
4938cac5f7e1ce63dd77ee0fb4ef68f9fa804f41ea6Daniel Dunbar
4948cac5f7e1ce63dd77ee0fb4ef68f9fa804f41ea6Daniel Dunbar  if (Input.isPipe()) {
4958cac5f7e1ce63dd77ee0fb4ef68f9fa804f41ea6Daniel Dunbar    CmdArgs.push_back("-");
4968cac5f7e1ce63dd77ee0fb4ef68f9fa804f41ea6Daniel Dunbar  } else {
4978cac5f7e1ce63dd77ee0fb4ef68f9fa804f41ea6Daniel Dunbar    assert(Input.isFilename() && "Invalid input.");
4988cac5f7e1ce63dd77ee0fb4ef68f9fa804f41ea6Daniel Dunbar    CmdArgs.push_back(Input.getFilename());
4998cac5f7e1ce63dd77ee0fb4ef68f9fa804f41ea6Daniel Dunbar  }
5008cac5f7e1ce63dd77ee0fb4ef68f9fa804f41ea6Daniel Dunbar
5018cac5f7e1ce63dd77ee0fb4ef68f9fa804f41ea6Daniel Dunbar  // asm_final spec is empty.
5028cac5f7e1ce63dd77ee0fb4ef68f9fa804f41ea6Daniel Dunbar
5038cac5f7e1ce63dd77ee0fb4ef68f9fa804f41ea6Daniel Dunbar  const char *Exec =
5048cac5f7e1ce63dd77ee0fb4ef68f9fa804f41ea6Daniel Dunbar    Args.MakeArgString(getToolChain().GetProgramPath(C, "as").c_str());
5058cac5f7e1ce63dd77ee0fb4ef68f9fa804f41ea6Daniel Dunbar  Dest.addCommand(new Command(Exec, CmdArgs));
5068cac5f7e1ce63dd77ee0fb4ef68f9fa804f41ea6Daniel Dunbar}
507ff7488dc9a766f94daf54d81b03ab9160d0bfd88Daniel Dunbar
50802633b541b04ad5ffc1c70f4c2feeeb13e607057Daniel Dunbarstatic const char *MakeFormattedString(const ArgList &Args,
50902633b541b04ad5ffc1c70f4c2feeeb13e607057Daniel Dunbar                                       const llvm::format_object_base &Fmt) {
51002633b541b04ad5ffc1c70f4c2feeeb13e607057Daniel Dunbar  std::string Str;
51102633b541b04ad5ffc1c70f4c2feeeb13e607057Daniel Dunbar  llvm::raw_string_ostream(Str) << Fmt;
51202633b541b04ad5ffc1c70f4c2feeeb13e607057Daniel Dunbar  return Args.MakeArgString(Str.c_str());
51302633b541b04ad5ffc1c70f4c2feeeb13e607057Daniel Dunbar}
51402633b541b04ad5ffc1c70f4c2feeeb13e607057Daniel Dunbar
51502633b541b04ad5ffc1c70f4c2feeeb13e607057Daniel Dunbar/// Helper routine for seeing if we should use dsymutil; this is a
51602633b541b04ad5ffc1c70f4c2feeeb13e607057Daniel Dunbar/// gcc compatible hack, we should remove it and use the input
51702633b541b04ad5ffc1c70f4c2feeeb13e607057Daniel Dunbar/// type information.
51802633b541b04ad5ffc1c70f4c2feeeb13e607057Daniel Dunbarstatic bool isSourceSuffix(const char *Str) {
51902633b541b04ad5ffc1c70f4c2feeeb13e607057Daniel Dunbar  // match: 'C', 'CPP', 'c', 'cc', 'cp', 'c++', 'cpp', 'cxx', 'm',
52002633b541b04ad5ffc1c70f4c2feeeb13e607057Daniel Dunbar  // 'mm'.
52102633b541b04ad5ffc1c70f4c2feeeb13e607057Daniel Dunbar  switch (strlen(Str)) {
52202633b541b04ad5ffc1c70f4c2feeeb13e607057Daniel Dunbar  default:
52302633b541b04ad5ffc1c70f4c2feeeb13e607057Daniel Dunbar    return false;
52402633b541b04ad5ffc1c70f4c2feeeb13e607057Daniel Dunbar  case 1:
52502633b541b04ad5ffc1c70f4c2feeeb13e607057Daniel Dunbar    return (memcmp(Str, "C", 1) == 0 ||
52602633b541b04ad5ffc1c70f4c2feeeb13e607057Daniel Dunbar            memcmp(Str, "c", 1) == 0 ||
52702633b541b04ad5ffc1c70f4c2feeeb13e607057Daniel Dunbar            memcmp(Str, "m", 1) == 0);
52802633b541b04ad5ffc1c70f4c2feeeb13e607057Daniel Dunbar  case 2:
52902633b541b04ad5ffc1c70f4c2feeeb13e607057Daniel Dunbar    return (memcmp(Str, "cc", 2) == 0 ||
53002633b541b04ad5ffc1c70f4c2feeeb13e607057Daniel Dunbar            memcmp(Str, "cp", 2) == 0 ||
53102633b541b04ad5ffc1c70f4c2feeeb13e607057Daniel Dunbar            memcmp(Str, "mm", 2) == 0);
53202633b541b04ad5ffc1c70f4c2feeeb13e607057Daniel Dunbar  case 3:
53302633b541b04ad5ffc1c70f4c2feeeb13e607057Daniel Dunbar    return (memcmp(Str, "CPP", 3) == 0 ||
53402633b541b04ad5ffc1c70f4c2feeeb13e607057Daniel Dunbar            memcmp(Str, "c++", 3) == 0 ||
53502633b541b04ad5ffc1c70f4c2feeeb13e607057Daniel Dunbar            memcmp(Str, "cpp", 3) == 0 ||
53602633b541b04ad5ffc1c70f4c2feeeb13e607057Daniel Dunbar            memcmp(Str, "cxx", 3) == 0);
53702633b541b04ad5ffc1c70f4c2feeeb13e607057Daniel Dunbar  }
53802633b541b04ad5ffc1c70f4c2feeeb13e607057Daniel Dunbar}
53902633b541b04ad5ffc1c70f4c2feeeb13e607057Daniel Dunbar
54002633b541b04ad5ffc1c70f4c2feeeb13e607057Daniel Dunbarstatic bool isMacosxVersionLT(unsigned (&A)[3], unsigned (&B)[3]) {
54102633b541b04ad5ffc1c70f4c2feeeb13e607057Daniel Dunbar  for (unsigned i=0; i < 3; ++i) {
54202633b541b04ad5ffc1c70f4c2feeeb13e607057Daniel Dunbar    if (A[i] > B[i]) return false;
54302633b541b04ad5ffc1c70f4c2feeeb13e607057Daniel Dunbar    if (A[i] < B[i]) return true;
54402633b541b04ad5ffc1c70f4c2feeeb13e607057Daniel Dunbar  }
54502633b541b04ad5ffc1c70f4c2feeeb13e607057Daniel Dunbar  return false;
54602633b541b04ad5ffc1c70f4c2feeeb13e607057Daniel Dunbar}
54702633b541b04ad5ffc1c70f4c2feeeb13e607057Daniel Dunbar
54802633b541b04ad5ffc1c70f4c2feeeb13e607057Daniel Dunbarstatic bool isMacosxVersionLT(unsigned (&A)[3],
54902633b541b04ad5ffc1c70f4c2feeeb13e607057Daniel Dunbar                              unsigned V0, unsigned V1=0, unsigned V2=0) {
55002633b541b04ad5ffc1c70f4c2feeeb13e607057Daniel Dunbar  unsigned B[3] = { V0, V1, V2 };
55102633b541b04ad5ffc1c70f4c2feeeb13e607057Daniel Dunbar  return isMacosxVersionLT(A, B);
55202633b541b04ad5ffc1c70f4c2feeeb13e607057Daniel Dunbar}
55302633b541b04ad5ffc1c70f4c2feeeb13e607057Daniel Dunbar
55402633b541b04ad5ffc1c70f4c2feeeb13e607057Daniel Dunbarstatic bool isMacosxVersionGTE(unsigned(&A)[3],
55502633b541b04ad5ffc1c70f4c2feeeb13e607057Daniel Dunbar                              unsigned V0, unsigned V1=0, unsigned V2=0) {
55602633b541b04ad5ffc1c70f4c2feeeb13e607057Daniel Dunbar  return !isMacosxVersionLT(A, V0, V1, V2);
55702633b541b04ad5ffc1c70f4c2feeeb13e607057Daniel Dunbar}
55802633b541b04ad5ffc1c70f4c2feeeb13e607057Daniel Dunbar
55902633b541b04ad5ffc1c70f4c2feeeb13e607057Daniel Dunbarconst toolchains::Darwin_X86 &darwin::Link::getDarwinToolChain() const {
56002633b541b04ad5ffc1c70f4c2feeeb13e607057Daniel Dunbar  return reinterpret_cast<const toolchains::Darwin_X86&>(getToolChain());
56102633b541b04ad5ffc1c70f4c2feeeb13e607057Daniel Dunbar}
56202633b541b04ad5ffc1c70f4c2feeeb13e607057Daniel Dunbar
56302633b541b04ad5ffc1c70f4c2feeeb13e607057Daniel Dunbarvoid darwin::Link::AddDarwinArch(const ArgList &Args,
56402633b541b04ad5ffc1c70f4c2feeeb13e607057Daniel Dunbar                                 ArgStringList &CmdArgs) const {
56502633b541b04ad5ffc1c70f4c2feeeb13e607057Daniel Dunbar  // Derived from darwin_arch spec.
56602633b541b04ad5ffc1c70f4c2feeeb13e607057Daniel Dunbar  CmdArgs.push_back("-arch");
56702633b541b04ad5ffc1c70f4c2feeeb13e607057Daniel Dunbar  CmdArgs.push_back(getToolChain().getArchName().c_str());
56802633b541b04ad5ffc1c70f4c2feeeb13e607057Daniel Dunbar}
56902633b541b04ad5ffc1c70f4c2feeeb13e607057Daniel Dunbar
57002633b541b04ad5ffc1c70f4c2feeeb13e607057Daniel Dunbarvoid darwin::Link::AddDarwinSubArch(const ArgList &Args,
57102633b541b04ad5ffc1c70f4c2feeeb13e607057Daniel Dunbar                                    ArgStringList &CmdArgs) const {
57202633b541b04ad5ffc1c70f4c2feeeb13e607057Daniel Dunbar  // Derived from darwin_subarch spec, not sure what the distinction
57302633b541b04ad5ffc1c70f4c2feeeb13e607057Daniel Dunbar  // exists for but at least for this chain it is the same.
57402633b541b04ad5ffc1c70f4c2feeeb13e607057Daniel Dunbar  AddDarwinArch(Args, CmdArgs);
57502633b541b04ad5ffc1c70f4c2feeeb13e607057Daniel Dunbar}
57602633b541b04ad5ffc1c70f4c2feeeb13e607057Daniel Dunbar
57702633b541b04ad5ffc1c70f4c2feeeb13e607057Daniel Dunbarvoid darwin::Link::AddLinkArgs(const ArgList &Args,
57802633b541b04ad5ffc1c70f4c2feeeb13e607057Daniel Dunbar                               ArgStringList &CmdArgs) const {
57902633b541b04ad5ffc1c70f4c2feeeb13e607057Daniel Dunbar  const Driver &D = getToolChain().getHost().getDriver();
58002633b541b04ad5ffc1c70f4c2feeeb13e607057Daniel Dunbar
58102633b541b04ad5ffc1c70f4c2feeeb13e607057Daniel Dunbar  // Derived from the "link" spec.
58202633b541b04ad5ffc1c70f4c2feeeb13e607057Daniel Dunbar  Args.AddAllArgs(CmdArgs, options::OPT_static);
58302633b541b04ad5ffc1c70f4c2feeeb13e607057Daniel Dunbar  if (!Args.hasArg(options::OPT_static))
58402633b541b04ad5ffc1c70f4c2feeeb13e607057Daniel Dunbar    CmdArgs.push_back("-dynamic");
58502633b541b04ad5ffc1c70f4c2feeeb13e607057Daniel Dunbar  if (Args.hasArg(options::OPT_fgnu_runtime)) {
58602633b541b04ad5ffc1c70f4c2feeeb13e607057Daniel Dunbar    // FIXME: gcc replaces -lobjc in forward args with -lobjc-gnu
58702633b541b04ad5ffc1c70f4c2feeeb13e607057Daniel Dunbar    // here. How do we wish to handle such things?
58802633b541b04ad5ffc1c70f4c2feeeb13e607057Daniel Dunbar  }
58902633b541b04ad5ffc1c70f4c2feeeb13e607057Daniel Dunbar
59002633b541b04ad5ffc1c70f4c2feeeb13e607057Daniel Dunbar  if (!Args.hasArg(options::OPT_dynamiclib)) {
59102633b541b04ad5ffc1c70f4c2feeeb13e607057Daniel Dunbar    if (Args.hasArg(options::OPT_force__cpusubtype__ALL)) {
59202633b541b04ad5ffc1c70f4c2feeeb13e607057Daniel Dunbar      AddDarwinArch(Args, CmdArgs);
59302633b541b04ad5ffc1c70f4c2feeeb13e607057Daniel Dunbar      CmdArgs.push_back("-force_cpusubtype_ALL");
59402633b541b04ad5ffc1c70f4c2feeeb13e607057Daniel Dunbar    } else
59502633b541b04ad5ffc1c70f4c2feeeb13e607057Daniel Dunbar      AddDarwinSubArch(Args, CmdArgs);
59602633b541b04ad5ffc1c70f4c2feeeb13e607057Daniel Dunbar
59702633b541b04ad5ffc1c70f4c2feeeb13e607057Daniel Dunbar    Args.AddLastArg(CmdArgs, options::OPT_bundle);
59802633b541b04ad5ffc1c70f4c2feeeb13e607057Daniel Dunbar    Args.AddAllArgs(CmdArgs, options::OPT_bundle__loader);
59902633b541b04ad5ffc1c70f4c2feeeb13e607057Daniel Dunbar    Args.AddAllArgs(CmdArgs, options::OPT_client__name);
60002633b541b04ad5ffc1c70f4c2feeeb13e607057Daniel Dunbar
60102633b541b04ad5ffc1c70f4c2feeeb13e607057Daniel Dunbar    Arg *A;
60202633b541b04ad5ffc1c70f4c2feeeb13e607057Daniel Dunbar    if ((A = Args.getLastArg(options::OPT_compatibility__version)) ||
60302633b541b04ad5ffc1c70f4c2feeeb13e607057Daniel Dunbar        (A = Args.getLastArg(options::OPT_current__version)) ||
60402633b541b04ad5ffc1c70f4c2feeeb13e607057Daniel Dunbar        (A = Args.getLastArg(options::OPT_install__name)))
60502633b541b04ad5ffc1c70f4c2feeeb13e607057Daniel Dunbar      D.Diag(clang::diag::err_drv_argument_only_allowed_with)
60602633b541b04ad5ffc1c70f4c2feeeb13e607057Daniel Dunbar        << A->getAsString(Args) << "-dynamiclib";
60702633b541b04ad5ffc1c70f4c2feeeb13e607057Daniel Dunbar
60802633b541b04ad5ffc1c70f4c2feeeb13e607057Daniel Dunbar    Args.AddLastArg(CmdArgs, options::OPT_force__flat__namespace);
60902633b541b04ad5ffc1c70f4c2feeeb13e607057Daniel Dunbar    Args.AddLastArg(CmdArgs, options::OPT_keep__private__externs);
61002633b541b04ad5ffc1c70f4c2feeeb13e607057Daniel Dunbar    Args.AddLastArg(CmdArgs, options::OPT_private__bundle);
61102633b541b04ad5ffc1c70f4c2feeeb13e607057Daniel Dunbar  } else {
61202633b541b04ad5ffc1c70f4c2feeeb13e607057Daniel Dunbar    CmdArgs.push_back("-dylib");
61302633b541b04ad5ffc1c70f4c2feeeb13e607057Daniel Dunbar
61402633b541b04ad5ffc1c70f4c2feeeb13e607057Daniel Dunbar    Arg *A;
61502633b541b04ad5ffc1c70f4c2feeeb13e607057Daniel Dunbar    if ((A = Args.getLastArg(options::OPT_bundle)) ||
61602633b541b04ad5ffc1c70f4c2feeeb13e607057Daniel Dunbar        (A = Args.getLastArg(options::OPT_bundle__loader)) ||
61702633b541b04ad5ffc1c70f4c2feeeb13e607057Daniel Dunbar        (A = Args.getLastArg(options::OPT_client__name)) ||
61802633b541b04ad5ffc1c70f4c2feeeb13e607057Daniel Dunbar        (A = Args.getLastArg(options::OPT_force__flat__namespace)) ||
61902633b541b04ad5ffc1c70f4c2feeeb13e607057Daniel Dunbar        (A = Args.getLastArg(options::OPT_keep__private__externs)) ||
62002633b541b04ad5ffc1c70f4c2feeeb13e607057Daniel Dunbar        (A = Args.getLastArg(options::OPT_private__bundle)))
62102633b541b04ad5ffc1c70f4c2feeeb13e607057Daniel Dunbar      D.Diag(clang::diag::err_drv_argument_not_allowed_with)
62202633b541b04ad5ffc1c70f4c2feeeb13e607057Daniel Dunbar        << A->getAsString(Args) << "-dynamiclib";
62302633b541b04ad5ffc1c70f4c2feeeb13e607057Daniel Dunbar
62402633b541b04ad5ffc1c70f4c2feeeb13e607057Daniel Dunbar    Args.AddAllArgsTranslated(CmdArgs, options::OPT_compatibility__version,
62502633b541b04ad5ffc1c70f4c2feeeb13e607057Daniel Dunbar                              "-dylib_compatibility_version");
62602633b541b04ad5ffc1c70f4c2feeeb13e607057Daniel Dunbar    Args.AddAllArgsTranslated(CmdArgs, options::OPT_current__version,
62702633b541b04ad5ffc1c70f4c2feeeb13e607057Daniel Dunbar                              "-dylib_current_version");
62802633b541b04ad5ffc1c70f4c2feeeb13e607057Daniel Dunbar
62902633b541b04ad5ffc1c70f4c2feeeb13e607057Daniel Dunbar    if (Args.hasArg(options::OPT_force__cpusubtype__ALL)) {
63002633b541b04ad5ffc1c70f4c2feeeb13e607057Daniel Dunbar      AddDarwinArch(Args, CmdArgs);
63102633b541b04ad5ffc1c70f4c2feeeb13e607057Daniel Dunbar          // NOTE: We don't add -force_cpusubtype_ALL on this path. Ok.
63202633b541b04ad5ffc1c70f4c2feeeb13e607057Daniel Dunbar    } else
63302633b541b04ad5ffc1c70f4c2feeeb13e607057Daniel Dunbar      AddDarwinSubArch(Args, CmdArgs);
63402633b541b04ad5ffc1c70f4c2feeeb13e607057Daniel Dunbar
63502633b541b04ad5ffc1c70f4c2feeeb13e607057Daniel Dunbar    Args.AddAllArgsTranslated(CmdArgs, options::OPT_install__name,
63602633b541b04ad5ffc1c70f4c2feeeb13e607057Daniel Dunbar                              "-dylib_install_name");
63702633b541b04ad5ffc1c70f4c2feeeb13e607057Daniel Dunbar  }
63802633b541b04ad5ffc1c70f4c2feeeb13e607057Daniel Dunbar
63902633b541b04ad5ffc1c70f4c2feeeb13e607057Daniel Dunbar  Args.AddLastArg(CmdArgs, options::OPT_all__load);
64002633b541b04ad5ffc1c70f4c2feeeb13e607057Daniel Dunbar  Args.AddAllArgs(CmdArgs, options::OPT_allowable__client);
64102633b541b04ad5ffc1c70f4c2feeeb13e607057Daniel Dunbar  Args.AddLastArg(CmdArgs, options::OPT_bind__at__load);
64202633b541b04ad5ffc1c70f4c2feeeb13e607057Daniel Dunbar  Args.AddLastArg(CmdArgs, options::OPT_dead__strip);
64302633b541b04ad5ffc1c70f4c2feeeb13e607057Daniel Dunbar  Args.AddLastArg(CmdArgs, options::OPT_no__dead__strip__inits__and__terms);
64402633b541b04ad5ffc1c70f4c2feeeb13e607057Daniel Dunbar  Args.AddAllArgs(CmdArgs, options::OPT_dylib__file);
64502633b541b04ad5ffc1c70f4c2feeeb13e607057Daniel Dunbar  Args.AddLastArg(CmdArgs, options::OPT_dynamic);
64602633b541b04ad5ffc1c70f4c2feeeb13e607057Daniel Dunbar  Args.AddAllArgs(CmdArgs, options::OPT_exported__symbols__list);
64702633b541b04ad5ffc1c70f4c2feeeb13e607057Daniel Dunbar  Args.AddLastArg(CmdArgs, options::OPT_flat__namespace);
64802633b541b04ad5ffc1c70f4c2feeeb13e607057Daniel Dunbar  Args.AddAllArgs(CmdArgs, options::OPT_headerpad__max__install__names);
64902633b541b04ad5ffc1c70f4c2feeeb13e607057Daniel Dunbar  Args.AddAllArgs(CmdArgs, options::OPT_image__base);
65002633b541b04ad5ffc1c70f4c2feeeb13e607057Daniel Dunbar  Args.AddAllArgs(CmdArgs, options::OPT_init);
65102633b541b04ad5ffc1c70f4c2feeeb13e607057Daniel Dunbar
65202633b541b04ad5ffc1c70f4c2feeeb13e607057Daniel Dunbar  if (!Args.hasArg(options::OPT_mmacosx_version_min_EQ)) {
65302633b541b04ad5ffc1c70f4c2feeeb13e607057Daniel Dunbar    if (!Args.hasArg(options::OPT_miphoneos_version_min_EQ)) {
65402633b541b04ad5ffc1c70f4c2feeeb13e607057Daniel Dunbar        // FIXME: I don't understand what is going on here. This is
65502633b541b04ad5ffc1c70f4c2feeeb13e607057Daniel Dunbar        // supposed to come from darwin_ld_minversion, but gcc doesn't
65602633b541b04ad5ffc1c70f4c2feeeb13e607057Daniel Dunbar        // seem to be following that; it must be getting overridden
65702633b541b04ad5ffc1c70f4c2feeeb13e607057Daniel Dunbar        // somewhere.
65802633b541b04ad5ffc1c70f4c2feeeb13e607057Daniel Dunbar        CmdArgs.push_back("-macosx_version_min");
65902633b541b04ad5ffc1c70f4c2feeeb13e607057Daniel Dunbar        CmdArgs.push_back(getDarwinToolChain().getMacosxVersionStr());
66002633b541b04ad5ffc1c70f4c2feeeb13e607057Daniel Dunbar      }
66102633b541b04ad5ffc1c70f4c2feeeb13e607057Daniel Dunbar  } else {
66202633b541b04ad5ffc1c70f4c2feeeb13e607057Daniel Dunbar    // Adding all arguments doesn't make sense here but this is what
66302633b541b04ad5ffc1c70f4c2feeeb13e607057Daniel Dunbar    // gcc does.
66402633b541b04ad5ffc1c70f4c2feeeb13e607057Daniel Dunbar    Args.AddAllArgsTranslated(CmdArgs, options::OPT_mmacosx_version_min_EQ,
66502633b541b04ad5ffc1c70f4c2feeeb13e607057Daniel Dunbar                              "-macosx_version_min");
66602633b541b04ad5ffc1c70f4c2feeeb13e607057Daniel Dunbar  }
66702633b541b04ad5ffc1c70f4c2feeeb13e607057Daniel Dunbar
66802633b541b04ad5ffc1c70f4c2feeeb13e607057Daniel Dunbar  Args.AddAllArgsTranslated(CmdArgs, options::OPT_miphoneos_version_min_EQ,
66902633b541b04ad5ffc1c70f4c2feeeb13e607057Daniel Dunbar                            "-iphoneos_version_min");
67002633b541b04ad5ffc1c70f4c2feeeb13e607057Daniel Dunbar  Args.AddLastArg(CmdArgs, options::OPT_nomultidefs);
67102633b541b04ad5ffc1c70f4c2feeeb13e607057Daniel Dunbar  Args.AddLastArg(CmdArgs, options::OPT_multi__module);
67202633b541b04ad5ffc1c70f4c2feeeb13e607057Daniel Dunbar  Args.AddLastArg(CmdArgs, options::OPT_single__module);
67302633b541b04ad5ffc1c70f4c2feeeb13e607057Daniel Dunbar  Args.AddAllArgs(CmdArgs, options::OPT_multiply__defined);
67402633b541b04ad5ffc1c70f4c2feeeb13e607057Daniel Dunbar  Args.AddAllArgs(CmdArgs, options::OPT_multiply__defined__unused);
67502633b541b04ad5ffc1c70f4c2feeeb13e607057Daniel Dunbar
67602633b541b04ad5ffc1c70f4c2feeeb13e607057Daniel Dunbar  if (Args.hasArg(options::OPT_fpie))
67702633b541b04ad5ffc1c70f4c2feeeb13e607057Daniel Dunbar    CmdArgs.push_back("-pie");
67802633b541b04ad5ffc1c70f4c2feeeb13e607057Daniel Dunbar
67902633b541b04ad5ffc1c70f4c2feeeb13e607057Daniel Dunbar  Args.AddLastArg(CmdArgs, options::OPT_prebind);
68002633b541b04ad5ffc1c70f4c2feeeb13e607057Daniel Dunbar  Args.AddLastArg(CmdArgs, options::OPT_noprebind);
68102633b541b04ad5ffc1c70f4c2feeeb13e607057Daniel Dunbar  Args.AddLastArg(CmdArgs, options::OPT_nofixprebinding);
68202633b541b04ad5ffc1c70f4c2feeeb13e607057Daniel Dunbar  Args.AddLastArg(CmdArgs, options::OPT_prebind__all__twolevel__modules);
68302633b541b04ad5ffc1c70f4c2feeeb13e607057Daniel Dunbar  Args.AddLastArg(CmdArgs, options::OPT_read__only__relocs);
68402633b541b04ad5ffc1c70f4c2feeeb13e607057Daniel Dunbar  Args.AddAllArgs(CmdArgs, options::OPT_sectcreate);
68502633b541b04ad5ffc1c70f4c2feeeb13e607057Daniel Dunbar  Args.AddAllArgs(CmdArgs, options::OPT_sectorder);
68602633b541b04ad5ffc1c70f4c2feeeb13e607057Daniel Dunbar  Args.AddAllArgs(CmdArgs, options::OPT_seg1addr);
68702633b541b04ad5ffc1c70f4c2feeeb13e607057Daniel Dunbar  Args.AddAllArgs(CmdArgs, options::OPT_segprot);
68802633b541b04ad5ffc1c70f4c2feeeb13e607057Daniel Dunbar  Args.AddAllArgs(CmdArgs, options::OPT_segaddr);
68902633b541b04ad5ffc1c70f4c2feeeb13e607057Daniel Dunbar  Args.AddAllArgs(CmdArgs, options::OPT_segs__read__only__addr);
69002633b541b04ad5ffc1c70f4c2feeeb13e607057Daniel Dunbar  Args.AddAllArgs(CmdArgs, options::OPT_segs__read__write__addr);
69102633b541b04ad5ffc1c70f4c2feeeb13e607057Daniel Dunbar  Args.AddAllArgs(CmdArgs, options::OPT_seg__addr__table);
69202633b541b04ad5ffc1c70f4c2feeeb13e607057Daniel Dunbar  Args.AddAllArgs(CmdArgs, options::OPT_seg__addr__table__filename);
69302633b541b04ad5ffc1c70f4c2feeeb13e607057Daniel Dunbar  Args.AddAllArgs(CmdArgs, options::OPT_sub__library);
69402633b541b04ad5ffc1c70f4c2feeeb13e607057Daniel Dunbar  Args.AddAllArgs(CmdArgs, options::OPT_sub__umbrella);
69502633b541b04ad5ffc1c70f4c2feeeb13e607057Daniel Dunbar  Args.AddAllArgsTranslated(CmdArgs, options::OPT_isysroot, "-syslibroot");
69602633b541b04ad5ffc1c70f4c2feeeb13e607057Daniel Dunbar  Args.AddLastArg(CmdArgs, options::OPT_twolevel__namespace);
69702633b541b04ad5ffc1c70f4c2feeeb13e607057Daniel Dunbar  Args.AddLastArg(CmdArgs, options::OPT_twolevel__namespace__hints);
69802633b541b04ad5ffc1c70f4c2feeeb13e607057Daniel Dunbar  Args.AddAllArgs(CmdArgs, options::OPT_umbrella);
69902633b541b04ad5ffc1c70f4c2feeeb13e607057Daniel Dunbar  Args.AddAllArgs(CmdArgs, options::OPT_undefined);
70002633b541b04ad5ffc1c70f4c2feeeb13e607057Daniel Dunbar  Args.AddAllArgs(CmdArgs, options::OPT_unexported__symbols__list);
70102633b541b04ad5ffc1c70f4c2feeeb13e607057Daniel Dunbar  Args.AddAllArgs(CmdArgs, options::OPT_weak__reference__mismatches);
70202633b541b04ad5ffc1c70f4c2feeeb13e607057Daniel Dunbar
70302633b541b04ad5ffc1c70f4c2feeeb13e607057Daniel Dunbar  if (!Args.hasArg(options::OPT_weak__reference__mismatches)) {
70402633b541b04ad5ffc1c70f4c2feeeb13e607057Daniel Dunbar    CmdArgs.push_back("-weak_reference_mismatches");
70502633b541b04ad5ffc1c70f4c2feeeb13e607057Daniel Dunbar    CmdArgs.push_back("non-weak");
70602633b541b04ad5ffc1c70f4c2feeeb13e607057Daniel Dunbar  }
70702633b541b04ad5ffc1c70f4c2feeeb13e607057Daniel Dunbar
70802633b541b04ad5ffc1c70f4c2feeeb13e607057Daniel Dunbar  Args.AddLastArg(CmdArgs, options::OPT_X_Flag);
70902633b541b04ad5ffc1c70f4c2feeeb13e607057Daniel Dunbar  Args.AddAllArgs(CmdArgs, options::OPT_y);
71002633b541b04ad5ffc1c70f4c2feeeb13e607057Daniel Dunbar  Args.AddLastArg(CmdArgs, options::OPT_w);
71102633b541b04ad5ffc1c70f4c2feeeb13e607057Daniel Dunbar  Args.AddAllArgs(CmdArgs, options::OPT_pagezero__size);
71202633b541b04ad5ffc1c70f4c2feeeb13e607057Daniel Dunbar  Args.AddAllArgs(CmdArgs, options::OPT_segs__read__);
71302633b541b04ad5ffc1c70f4c2feeeb13e607057Daniel Dunbar  Args.AddLastArg(CmdArgs, options::OPT_seglinkedit);
71402633b541b04ad5ffc1c70f4c2feeeb13e607057Daniel Dunbar  Args.AddLastArg(CmdArgs, options::OPT_noseglinkedit);
71502633b541b04ad5ffc1c70f4c2feeeb13e607057Daniel Dunbar  Args.AddAllArgs(CmdArgs, options::OPT_sectalign);
71602633b541b04ad5ffc1c70f4c2feeeb13e607057Daniel Dunbar  Args.AddAllArgs(CmdArgs, options::OPT_sectobjectsymbols);
71702633b541b04ad5ffc1c70f4c2feeeb13e607057Daniel Dunbar  Args.AddAllArgs(CmdArgs, options::OPT_segcreate);
71802633b541b04ad5ffc1c70f4c2feeeb13e607057Daniel Dunbar  Args.AddLastArg(CmdArgs, options::OPT_whyload);
71902633b541b04ad5ffc1c70f4c2feeeb13e607057Daniel Dunbar  Args.AddLastArg(CmdArgs, options::OPT_whatsloaded);
72002633b541b04ad5ffc1c70f4c2feeeb13e607057Daniel Dunbar  Args.AddAllArgs(CmdArgs, options::OPT_dylinker__install__name);
72102633b541b04ad5ffc1c70f4c2feeeb13e607057Daniel Dunbar  Args.AddLastArg(CmdArgs, options::OPT_dylinker);
72202633b541b04ad5ffc1c70f4c2feeeb13e607057Daniel Dunbar  Args.AddLastArg(CmdArgs, options::OPT_Mach);
72302633b541b04ad5ffc1c70f4c2feeeb13e607057Daniel Dunbar}
72402633b541b04ad5ffc1c70f4c2feeeb13e607057Daniel Dunbar
72502633b541b04ad5ffc1c70f4c2feeeb13e607057Daniel Dunbarvoid darwin::Link::ConstructJob(Compilation &C, const JobAction &JA,
72602633b541b04ad5ffc1c70f4c2feeeb13e607057Daniel Dunbar                                Job &Dest, const InputInfo &Output,
72702633b541b04ad5ffc1c70f4c2feeeb13e607057Daniel Dunbar                                const InputInfoList &Inputs,
72802633b541b04ad5ffc1c70f4c2feeeb13e607057Daniel Dunbar                                const ArgList &Args,
72902633b541b04ad5ffc1c70f4c2feeeb13e607057Daniel Dunbar                                const char *LinkingOutput) const {
73002633b541b04ad5ffc1c70f4c2feeeb13e607057Daniel Dunbar  assert(Output.getType() == types::TY_Image && "Invalid linker output type.");
73102633b541b04ad5ffc1c70f4c2feeeb13e607057Daniel Dunbar  // The logic here is derived from gcc's behavior; most of which
73202633b541b04ad5ffc1c70f4c2feeeb13e607057Daniel Dunbar  // comes from specs (starting with link_command). Consult gcc for
73302633b541b04ad5ffc1c70f4c2feeeb13e607057Daniel Dunbar  // more information.
73402633b541b04ad5ffc1c70f4c2feeeb13e607057Daniel Dunbar
73502633b541b04ad5ffc1c70f4c2feeeb13e607057Daniel Dunbar  // FIXME: The spec references -fdump= which seems to have
73602633b541b04ad5ffc1c70f4c2feeeb13e607057Daniel Dunbar  // disappeared?
73702633b541b04ad5ffc1c70f4c2feeeb13e607057Daniel Dunbar
73802633b541b04ad5ffc1c70f4c2feeeb13e607057Daniel Dunbar  ArgStringList CmdArgs;
73902633b541b04ad5ffc1c70f4c2feeeb13e607057Daniel Dunbar
74002633b541b04ad5ffc1c70f4c2feeeb13e607057Daniel Dunbar  // I'm not sure why this particular decomposition exists in gcc, but
74102633b541b04ad5ffc1c70f4c2feeeb13e607057Daniel Dunbar  // we follow suite for ease of comparison.
74202633b541b04ad5ffc1c70f4c2feeeb13e607057Daniel Dunbar  AddLinkArgs(Args, CmdArgs);
74302633b541b04ad5ffc1c70f4c2feeeb13e607057Daniel Dunbar
74402633b541b04ad5ffc1c70f4c2feeeb13e607057Daniel Dunbar  // FIXME: gcc has %{x} in here. How could this ever happen?  Cruft?
74502633b541b04ad5ffc1c70f4c2feeeb13e607057Daniel Dunbar  Args.AddAllArgs(CmdArgs, options::OPT_d_Flag);
74602633b541b04ad5ffc1c70f4c2feeeb13e607057Daniel Dunbar  Args.AddAllArgs(CmdArgs, options::OPT_s);
74702633b541b04ad5ffc1c70f4c2feeeb13e607057Daniel Dunbar  Args.AddAllArgs(CmdArgs, options::OPT_t);
74802633b541b04ad5ffc1c70f4c2feeeb13e607057Daniel Dunbar  Args.AddAllArgs(CmdArgs, options::OPT_Z_Flag);
74902633b541b04ad5ffc1c70f4c2feeeb13e607057Daniel Dunbar  Args.AddAllArgs(CmdArgs, options::OPT_u_Group);
75002633b541b04ad5ffc1c70f4c2feeeb13e607057Daniel Dunbar  Args.AddAllArgs(CmdArgs, options::OPT_A);
75102633b541b04ad5ffc1c70f4c2feeeb13e607057Daniel Dunbar  Args.AddLastArg(CmdArgs, options::OPT_e);
75202633b541b04ad5ffc1c70f4c2feeeb13e607057Daniel Dunbar  Args.AddAllArgs(CmdArgs, options::OPT_m_Separate);
75302633b541b04ad5ffc1c70f4c2feeeb13e607057Daniel Dunbar  Args.AddAllArgs(CmdArgs, options::OPT_r);
75402633b541b04ad5ffc1c70f4c2feeeb13e607057Daniel Dunbar
75502633b541b04ad5ffc1c70f4c2feeeb13e607057Daniel Dunbar  // FIXME: This is just being pedantically bug compatible, gcc
75602633b541b04ad5ffc1c70f4c2feeeb13e607057Daniel Dunbar  // doesn't *mean* to forward this, it just does (yay for pattern
75702633b541b04ad5ffc1c70f4c2feeeb13e607057Daniel Dunbar  // matching). It doesn't work, of course.
75802633b541b04ad5ffc1c70f4c2feeeb13e607057Daniel Dunbar  Args.AddAllArgs(CmdArgs, options::OPT_object);
75902633b541b04ad5ffc1c70f4c2feeeb13e607057Daniel Dunbar
76002633b541b04ad5ffc1c70f4c2feeeb13e607057Daniel Dunbar  CmdArgs.push_back("-o");
76102633b541b04ad5ffc1c70f4c2feeeb13e607057Daniel Dunbar  CmdArgs.push_back(Output.getFilename());
76202633b541b04ad5ffc1c70f4c2feeeb13e607057Daniel Dunbar
76302633b541b04ad5ffc1c70f4c2feeeb13e607057Daniel Dunbar  unsigned MacosxVersion[3];
76402633b541b04ad5ffc1c70f4c2feeeb13e607057Daniel Dunbar  if (Arg *A = Args.getLastArg(options::OPT_mmacosx_version_min_EQ)) {
76502633b541b04ad5ffc1c70f4c2feeeb13e607057Daniel Dunbar    bool HadExtra;
76602633b541b04ad5ffc1c70f4c2feeeb13e607057Daniel Dunbar    if (!Driver::GetReleaseVersion(A->getValue(Args), MacosxVersion[0],
76702633b541b04ad5ffc1c70f4c2feeeb13e607057Daniel Dunbar                                   MacosxVersion[1], MacosxVersion[2],
76802633b541b04ad5ffc1c70f4c2feeeb13e607057Daniel Dunbar                                   HadExtra) ||
76902633b541b04ad5ffc1c70f4c2feeeb13e607057Daniel Dunbar        HadExtra) {
77002633b541b04ad5ffc1c70f4c2feeeb13e607057Daniel Dunbar      const Driver &D = getToolChain().getHost().getDriver();
77102633b541b04ad5ffc1c70f4c2feeeb13e607057Daniel Dunbar      D.Diag(clang::diag::err_drv_invalid_version_number)
77202633b541b04ad5ffc1c70f4c2feeeb13e607057Daniel Dunbar        << A->getAsString(Args);
77302633b541b04ad5ffc1c70f4c2feeeb13e607057Daniel Dunbar    }
77402633b541b04ad5ffc1c70f4c2feeeb13e607057Daniel Dunbar  } else {
77502633b541b04ad5ffc1c70f4c2feeeb13e607057Daniel Dunbar    getDarwinToolChain().getMacosxVersion(MacosxVersion);
77602633b541b04ad5ffc1c70f4c2feeeb13e607057Daniel Dunbar  }
77702633b541b04ad5ffc1c70f4c2feeeb13e607057Daniel Dunbar
77802633b541b04ad5ffc1c70f4c2feeeb13e607057Daniel Dunbar  if (!Args.hasArg(options::OPT_A) &&
77902633b541b04ad5ffc1c70f4c2feeeb13e607057Daniel Dunbar      !Args.hasArg(options::OPT_nostdlib) &&
78002633b541b04ad5ffc1c70f4c2feeeb13e607057Daniel Dunbar      !Args.hasArg(options::OPT_nostartfiles)) {
78102633b541b04ad5ffc1c70f4c2feeeb13e607057Daniel Dunbar    // Derived from startfile spec.
78202633b541b04ad5ffc1c70f4c2feeeb13e607057Daniel Dunbar    if (Args.hasArg(options::OPT_dynamiclib)) {
78302633b541b04ad5ffc1c70f4c2feeeb13e607057Daniel Dunbar        // Derived from darwin_dylib1 spec.
78402633b541b04ad5ffc1c70f4c2feeeb13e607057Daniel Dunbar      if (Args.hasArg(options::OPT_miphoneos_version_min_EQ) ||
78502633b541b04ad5ffc1c70f4c2feeeb13e607057Daniel Dunbar          isMacosxVersionLT(MacosxVersion, 10, 5))
78602633b541b04ad5ffc1c70f4c2feeeb13e607057Daniel Dunbar        CmdArgs.push_back("-ldylib1.o");
78702633b541b04ad5ffc1c70f4c2feeeb13e607057Daniel Dunbar      else
78802633b541b04ad5ffc1c70f4c2feeeb13e607057Daniel Dunbar        CmdArgs.push_back("-ldylib1.10.5.o");
78902633b541b04ad5ffc1c70f4c2feeeb13e607057Daniel Dunbar    } else {
79002633b541b04ad5ffc1c70f4c2feeeb13e607057Daniel Dunbar      if (Args.hasArg(options::OPT_bundle)) {
79102633b541b04ad5ffc1c70f4c2feeeb13e607057Daniel Dunbar        if (!Args.hasArg(options::OPT_static))
79202633b541b04ad5ffc1c70f4c2feeeb13e607057Daniel Dunbar          CmdArgs.push_back("-lbundle1.o");
79302633b541b04ad5ffc1c70f4c2feeeb13e607057Daniel Dunbar      } else {
79402633b541b04ad5ffc1c70f4c2feeeb13e607057Daniel Dunbar        if (Args.hasArg(options::OPT_pg)) {
79502633b541b04ad5ffc1c70f4c2feeeb13e607057Daniel Dunbar          if (Args.hasArg(options::OPT_static) ||
79602633b541b04ad5ffc1c70f4c2feeeb13e607057Daniel Dunbar              Args.hasArg(options::OPT_object) ||
79702633b541b04ad5ffc1c70f4c2feeeb13e607057Daniel Dunbar              Args.hasArg(options::OPT_preload)) {
79802633b541b04ad5ffc1c70f4c2feeeb13e607057Daniel Dunbar            CmdArgs.push_back("-lgcrt0.o");
79902633b541b04ad5ffc1c70f4c2feeeb13e607057Daniel Dunbar          } else {
80002633b541b04ad5ffc1c70f4c2feeeb13e607057Daniel Dunbar            CmdArgs.push_back("-lgcrt1.o");
80102633b541b04ad5ffc1c70f4c2feeeb13e607057Daniel Dunbar
80202633b541b04ad5ffc1c70f4c2feeeb13e607057Daniel Dunbar            // darwin_crt2 spec is empty.
80302633b541b04ad5ffc1c70f4c2feeeb13e607057Daniel Dunbar          }
80402633b541b04ad5ffc1c70f4c2feeeb13e607057Daniel Dunbar        } else {
80502633b541b04ad5ffc1c70f4c2feeeb13e607057Daniel Dunbar          if (Args.hasArg(options::OPT_static) ||
80602633b541b04ad5ffc1c70f4c2feeeb13e607057Daniel Dunbar              Args.hasArg(options::OPT_object) ||
80702633b541b04ad5ffc1c70f4c2feeeb13e607057Daniel Dunbar              Args.hasArg(options::OPT_preload)) {
80802633b541b04ad5ffc1c70f4c2feeeb13e607057Daniel Dunbar            CmdArgs.push_back("-lcrt0.o");
80902633b541b04ad5ffc1c70f4c2feeeb13e607057Daniel Dunbar          } else {
81002633b541b04ad5ffc1c70f4c2feeeb13e607057Daniel Dunbar            // Derived from darwin_crt1 spec.
81102633b541b04ad5ffc1c70f4c2feeeb13e607057Daniel Dunbar            if (Args.hasArg(options::OPT_miphoneos_version_min_EQ) ||
81202633b541b04ad5ffc1c70f4c2feeeb13e607057Daniel Dunbar                isMacosxVersionLT(MacosxVersion, 10, 5)) {
81302633b541b04ad5ffc1c70f4c2feeeb13e607057Daniel Dunbar              CmdArgs.push_back("-lcrt1.o");
81402633b541b04ad5ffc1c70f4c2feeeb13e607057Daniel Dunbar            } else {
81502633b541b04ad5ffc1c70f4c2feeeb13e607057Daniel Dunbar              CmdArgs.push_back("-lcrt1.10.5.o");
81602633b541b04ad5ffc1c70f4c2feeeb13e607057Daniel Dunbar
81702633b541b04ad5ffc1c70f4c2feeeb13e607057Daniel Dunbar              // darwin_crt2 spec is empty.
81802633b541b04ad5ffc1c70f4c2feeeb13e607057Daniel Dunbar            }
81902633b541b04ad5ffc1c70f4c2feeeb13e607057Daniel Dunbar          }
82002633b541b04ad5ffc1c70f4c2feeeb13e607057Daniel Dunbar        }
82102633b541b04ad5ffc1c70f4c2feeeb13e607057Daniel Dunbar      }
82202633b541b04ad5ffc1c70f4c2feeeb13e607057Daniel Dunbar    }
82302633b541b04ad5ffc1c70f4c2feeeb13e607057Daniel Dunbar
82402633b541b04ad5ffc1c70f4c2feeeb13e607057Daniel Dunbar    if (Args.hasArg(options::OPT_shared_libgcc) &&
82502633b541b04ad5ffc1c70f4c2feeeb13e607057Daniel Dunbar        !Args.hasArg(options::OPT_miphoneos_version_min_EQ) &&
82602633b541b04ad5ffc1c70f4c2feeeb13e607057Daniel Dunbar        isMacosxVersionLT(MacosxVersion, 10, 5)) {
82702633b541b04ad5ffc1c70f4c2feeeb13e607057Daniel Dunbar      const char *Str = getToolChain().GetFilePath(C, "crt3.o").c_str();
82802633b541b04ad5ffc1c70f4c2feeeb13e607057Daniel Dunbar      CmdArgs.push_back(Args.MakeArgString(Str));
82902633b541b04ad5ffc1c70f4c2feeeb13e607057Daniel Dunbar    }
83002633b541b04ad5ffc1c70f4c2feeeb13e607057Daniel Dunbar  }
83102633b541b04ad5ffc1c70f4c2feeeb13e607057Daniel Dunbar
83202633b541b04ad5ffc1c70f4c2feeeb13e607057Daniel Dunbar  Args.AddAllArgs(CmdArgs, options::OPT_L);
83302633b541b04ad5ffc1c70f4c2feeeb13e607057Daniel Dunbar
83402633b541b04ad5ffc1c70f4c2feeeb13e607057Daniel Dunbar  if (Args.hasArg(options::OPT_fopenmp))
83502633b541b04ad5ffc1c70f4c2feeeb13e607057Daniel Dunbar    // This is more complicated in gcc...
83602633b541b04ad5ffc1c70f4c2feeeb13e607057Daniel Dunbar    CmdArgs.push_back("-lgomp");
83702633b541b04ad5ffc1c70f4c2feeeb13e607057Daniel Dunbar
83802633b541b04ad5ffc1c70f4c2feeeb13e607057Daniel Dunbar  // FIXME: Derive these correctly.
83902633b541b04ad5ffc1c70f4c2feeeb13e607057Daniel Dunbar  const char *TCDir = getDarwinToolChain().getToolChainDir().c_str();
84002633b541b04ad5ffc1c70f4c2feeeb13e607057Daniel Dunbar  if (getToolChain().getArchName() == "x86_64") {
84102633b541b04ad5ffc1c70f4c2feeeb13e607057Daniel Dunbar    CmdArgs.push_back(MakeFormattedString(Args,
84202633b541b04ad5ffc1c70f4c2feeeb13e607057Daniel Dunbar                              llvm::format("-L/usr/lib/gcc/%s/x86_64", TCDir)));
84302633b541b04ad5ffc1c70f4c2feeeb13e607057Daniel Dunbar    // Intentionally duplicated for (temporary) gcc bug compatibility.
84402633b541b04ad5ffc1c70f4c2feeeb13e607057Daniel Dunbar    CmdArgs.push_back(MakeFormattedString(Args,
84502633b541b04ad5ffc1c70f4c2feeeb13e607057Daniel Dunbar                              llvm::format("-L/usr/lib/gcc/%s/x86_64", TCDir)));
84602633b541b04ad5ffc1c70f4c2feeeb13e607057Daniel Dunbar  }
84702633b541b04ad5ffc1c70f4c2feeeb13e607057Daniel Dunbar  CmdArgs.push_back(MakeFormattedString(Args,
84802633b541b04ad5ffc1c70f4c2feeeb13e607057Daniel Dunbar                                        llvm::format("-L/usr/lib/%s", TCDir)));
84902633b541b04ad5ffc1c70f4c2feeeb13e607057Daniel Dunbar  CmdArgs.push_back(MakeFormattedString(Args,
85002633b541b04ad5ffc1c70f4c2feeeb13e607057Daniel Dunbar                                     llvm::format("-L/usr/lib/gcc/%s", TCDir)));
85102633b541b04ad5ffc1c70f4c2feeeb13e607057Daniel Dunbar  // Intentionally duplicated for (temporary) gcc bug compatibility.
85202633b541b04ad5ffc1c70f4c2feeeb13e607057Daniel Dunbar  CmdArgs.push_back(MakeFormattedString(Args,
85302633b541b04ad5ffc1c70f4c2feeeb13e607057Daniel Dunbar                                     llvm::format("-L/usr/lib/gcc/%s", TCDir)));
85402633b541b04ad5ffc1c70f4c2feeeb13e607057Daniel Dunbar  CmdArgs.push_back(MakeFormattedString(Args,
85502633b541b04ad5ffc1c70f4c2feeeb13e607057Daniel Dunbar                  llvm::format("-L/usr/lib/gcc/%s/../../../%s", TCDir, TCDir)));
85602633b541b04ad5ffc1c70f4c2feeeb13e607057Daniel Dunbar  CmdArgs.push_back(MakeFormattedString(Args,
85702633b541b04ad5ffc1c70f4c2feeeb13e607057Daniel Dunbar                            llvm::format("-L/usr/lib/gcc/%s/../../..", TCDir)));
85802633b541b04ad5ffc1c70f4c2feeeb13e607057Daniel Dunbar
85902633b541b04ad5ffc1c70f4c2feeeb13e607057Daniel Dunbar  for (InputInfoList::const_iterator
86002633b541b04ad5ffc1c70f4c2feeeb13e607057Daniel Dunbar         it = Inputs.begin(), ie = Inputs.end(); it != ie; ++it) {
86102633b541b04ad5ffc1c70f4c2feeeb13e607057Daniel Dunbar    const InputInfo &II = *it;
86202633b541b04ad5ffc1c70f4c2feeeb13e607057Daniel Dunbar    if (II.isFilename())
86302633b541b04ad5ffc1c70f4c2feeeb13e607057Daniel Dunbar      CmdArgs.push_back(II.getFilename());
86402633b541b04ad5ffc1c70f4c2feeeb13e607057Daniel Dunbar    else
86502633b541b04ad5ffc1c70f4c2feeeb13e607057Daniel Dunbar      II.getInputArg().renderAsInput(Args, CmdArgs);
86602633b541b04ad5ffc1c70f4c2feeeb13e607057Daniel Dunbar  }
86702633b541b04ad5ffc1c70f4c2feeeb13e607057Daniel Dunbar
86802633b541b04ad5ffc1c70f4c2feeeb13e607057Daniel Dunbar  if (LinkingOutput) {
86902633b541b04ad5ffc1c70f4c2feeeb13e607057Daniel Dunbar    CmdArgs.push_back("-arch_multiple");
87002633b541b04ad5ffc1c70f4c2feeeb13e607057Daniel Dunbar    CmdArgs.push_back("-final_output");
87102633b541b04ad5ffc1c70f4c2feeeb13e607057Daniel Dunbar    CmdArgs.push_back(LinkingOutput);
87202633b541b04ad5ffc1c70f4c2feeeb13e607057Daniel Dunbar  }
87302633b541b04ad5ffc1c70f4c2feeeb13e607057Daniel Dunbar
87402633b541b04ad5ffc1c70f4c2feeeb13e607057Daniel Dunbar  if (Args.hasArg(options::OPT_fprofile_arcs) ||
87502633b541b04ad5ffc1c70f4c2feeeb13e607057Daniel Dunbar      Args.hasArg(options::OPT_fprofile_generate) ||
87602633b541b04ad5ffc1c70f4c2feeeb13e607057Daniel Dunbar      Args.hasArg(options::OPT_fcreate_profile) ||
87702633b541b04ad5ffc1c70f4c2feeeb13e607057Daniel Dunbar      Args.hasArg(options::OPT_coverage))
87802633b541b04ad5ffc1c70f4c2feeeb13e607057Daniel Dunbar    CmdArgs.push_back("-lgcov");
87902633b541b04ad5ffc1c70f4c2feeeb13e607057Daniel Dunbar
88002633b541b04ad5ffc1c70f4c2feeeb13e607057Daniel Dunbar  if (Args.hasArg(options::OPT_fnested_functions))
88102633b541b04ad5ffc1c70f4c2feeeb13e607057Daniel Dunbar    CmdArgs.push_back("-allow_stack_execute");
88202633b541b04ad5ffc1c70f4c2feeeb13e607057Daniel Dunbar
88302633b541b04ad5ffc1c70f4c2feeeb13e607057Daniel Dunbar  if (!Args.hasArg(options::OPT_nostdlib) &&
88402633b541b04ad5ffc1c70f4c2feeeb13e607057Daniel Dunbar      !Args.hasArg(options::OPT_nodefaultlibs)) {
88502633b541b04ad5ffc1c70f4c2feeeb13e607057Daniel Dunbar    // link_ssp spec is empty.
88602633b541b04ad5ffc1c70f4c2feeeb13e607057Daniel Dunbar
88702633b541b04ad5ffc1c70f4c2feeeb13e607057Daniel Dunbar    // Derived from libgcc spec.
88802633b541b04ad5ffc1c70f4c2feeeb13e607057Daniel Dunbar    if (Args.hasArg(options::OPT_static)) {
88902633b541b04ad5ffc1c70f4c2feeeb13e607057Daniel Dunbar      CmdArgs.push_back("-lgcc_static");
89002633b541b04ad5ffc1c70f4c2feeeb13e607057Daniel Dunbar    } else if (Args.hasArg(options::OPT_static_libgcc)) {
89102633b541b04ad5ffc1c70f4c2feeeb13e607057Daniel Dunbar      CmdArgs.push_back("-lgcc_eh");
89202633b541b04ad5ffc1c70f4c2feeeb13e607057Daniel Dunbar      CmdArgs.push_back("-lgcc");
89302633b541b04ad5ffc1c70f4c2feeeb13e607057Daniel Dunbar    } else if (Args.hasArg(options::OPT_miphoneos_version_min_EQ)) {
89402633b541b04ad5ffc1c70f4c2feeeb13e607057Daniel Dunbar      // Derived from darwin_iphoneos_libgcc spec.
89502633b541b04ad5ffc1c70f4c2feeeb13e607057Daniel Dunbar      CmdArgs.push_back("-lgcc_s.10.5");
89602633b541b04ad5ffc1c70f4c2feeeb13e607057Daniel Dunbar      CmdArgs.push_back("-lgcc");
89702633b541b04ad5ffc1c70f4c2feeeb13e607057Daniel Dunbar    } else if (Args.hasArg(options::OPT_shared_libgcc) ||
89802633b541b04ad5ffc1c70f4c2feeeb13e607057Daniel Dunbar               Args.hasArg(options::OPT_fexceptions) ||
89902633b541b04ad5ffc1c70f4c2feeeb13e607057Daniel Dunbar               Args.hasArg(options::OPT_fgnu_runtime)) {
90002633b541b04ad5ffc1c70f4c2feeeb13e607057Daniel Dunbar      if (isMacosxVersionLT(MacosxVersion, 10, 5))
90102633b541b04ad5ffc1c70f4c2feeeb13e607057Daniel Dunbar        CmdArgs.push_back("-lgcc_s.10.4");
90202633b541b04ad5ffc1c70f4c2feeeb13e607057Daniel Dunbar      else
90302633b541b04ad5ffc1c70f4c2feeeb13e607057Daniel Dunbar        CmdArgs.push_back("-lgcc_s.10.5");
90402633b541b04ad5ffc1c70f4c2feeeb13e607057Daniel Dunbar      CmdArgs.push_back("-lgcc");
90502633b541b04ad5ffc1c70f4c2feeeb13e607057Daniel Dunbar    } else {
90602633b541b04ad5ffc1c70f4c2feeeb13e607057Daniel Dunbar      if (isMacosxVersionLT(MacosxVersion, 10, 5) &&
90702633b541b04ad5ffc1c70f4c2feeeb13e607057Daniel Dunbar          isMacosxVersionGTE(MacosxVersion, 10, 3, 9))
90802633b541b04ad5ffc1c70f4c2feeeb13e607057Daniel Dunbar        CmdArgs.push_back("-lgcc_s.10.4");
90902633b541b04ad5ffc1c70f4c2feeeb13e607057Daniel Dunbar      if (isMacosxVersionGTE(MacosxVersion, 10, 5))
91002633b541b04ad5ffc1c70f4c2feeeb13e607057Daniel Dunbar        CmdArgs.push_back("-lgcc_s.10.5");
91102633b541b04ad5ffc1c70f4c2feeeb13e607057Daniel Dunbar      CmdArgs.push_back("-lgcc");
91202633b541b04ad5ffc1c70f4c2feeeb13e607057Daniel Dunbar    }
91302633b541b04ad5ffc1c70f4c2feeeb13e607057Daniel Dunbar
91402633b541b04ad5ffc1c70f4c2feeeb13e607057Daniel Dunbar    // Derived from lib spec.
91502633b541b04ad5ffc1c70f4c2feeeb13e607057Daniel Dunbar    if (!Args.hasArg(options::OPT_static))
91602633b541b04ad5ffc1c70f4c2feeeb13e607057Daniel Dunbar      CmdArgs.push_back("-lSystem");
91702633b541b04ad5ffc1c70f4c2feeeb13e607057Daniel Dunbar  }
91802633b541b04ad5ffc1c70f4c2feeeb13e607057Daniel Dunbar
91902633b541b04ad5ffc1c70f4c2feeeb13e607057Daniel Dunbar  if (!Args.hasArg(options::OPT_A) &&
92002633b541b04ad5ffc1c70f4c2feeeb13e607057Daniel Dunbar      !Args.hasArg(options::OPT_nostdlib) &&
92102633b541b04ad5ffc1c70f4c2feeeb13e607057Daniel Dunbar      !Args.hasArg(options::OPT_nostartfiles)) {
92202633b541b04ad5ffc1c70f4c2feeeb13e607057Daniel Dunbar    // endfile_spec is empty.
92302633b541b04ad5ffc1c70f4c2feeeb13e607057Daniel Dunbar  }
92402633b541b04ad5ffc1c70f4c2feeeb13e607057Daniel Dunbar
92502633b541b04ad5ffc1c70f4c2feeeb13e607057Daniel Dunbar  Args.AddAllArgs(CmdArgs, options::OPT_T_Group);
92602633b541b04ad5ffc1c70f4c2feeeb13e607057Daniel Dunbar  Args.AddAllArgs(CmdArgs, options::OPT_F);
92702633b541b04ad5ffc1c70f4c2feeeb13e607057Daniel Dunbar
92802633b541b04ad5ffc1c70f4c2feeeb13e607057Daniel Dunbar  const char *Exec =
92902633b541b04ad5ffc1c70f4c2feeeb13e607057Daniel Dunbar    Args.MakeArgString(getToolChain().GetProgramPath(C, "collect2").c_str());
93002633b541b04ad5ffc1c70f4c2feeeb13e607057Daniel Dunbar  Dest.addCommand(new Command(Exec, CmdArgs));
93102633b541b04ad5ffc1c70f4c2feeeb13e607057Daniel Dunbar
93202633b541b04ad5ffc1c70f4c2feeeb13e607057Daniel Dunbar  if (Args.getLastArg(options::OPT_g_Group) &&
93302633b541b04ad5ffc1c70f4c2feeeb13e607057Daniel Dunbar      !Args.getLastArg(options::OPT_gstabs) &&
93402633b541b04ad5ffc1c70f4c2feeeb13e607057Daniel Dunbar      !Args.getLastArg(options::OPT_g0)) {
93502633b541b04ad5ffc1c70f4c2feeeb13e607057Daniel Dunbar    // FIXME: This is gross, but matches gcc. The test only considers
93602633b541b04ad5ffc1c70f4c2feeeb13e607057Daniel Dunbar    // the suffix (not the -x type), and then only of the first
93702633b541b04ad5ffc1c70f4c2feeeb13e607057Daniel Dunbar    // input. Awesome.
93802633b541b04ad5ffc1c70f4c2feeeb13e607057Daniel Dunbar    const char *Suffix = strchr(Inputs[0].getBaseInput(), '.');
93902633b541b04ad5ffc1c70f4c2feeeb13e607057Daniel Dunbar    if (Suffix && isSourceSuffix(Suffix + 1)) {
94002633b541b04ad5ffc1c70f4c2feeeb13e607057Daniel Dunbar      const char *Exec =
94102633b541b04ad5ffc1c70f4c2feeeb13e607057Daniel Dunbar       Args.MakeArgString(getToolChain().GetProgramPath(C, "dsymutil").c_str());
94202633b541b04ad5ffc1c70f4c2feeeb13e607057Daniel Dunbar      ArgStringList CmdArgs;
94302633b541b04ad5ffc1c70f4c2feeeb13e607057Daniel Dunbar      CmdArgs.push_back(Output.getFilename());
94402633b541b04ad5ffc1c70f4c2feeeb13e607057Daniel Dunbar      C.getJobs().addCommand(new Command(Exec, CmdArgs));
94502633b541b04ad5ffc1c70f4c2feeeb13e607057Daniel Dunbar    }
94602633b541b04ad5ffc1c70f4c2feeeb13e607057Daniel Dunbar  }
94702633b541b04ad5ffc1c70f4c2feeeb13e607057Daniel Dunbar}
94802633b541b04ad5ffc1c70f4c2feeeb13e607057Daniel Dunbar
949ff7488dc9a766f94daf54d81b03ab9160d0bfd88Daniel Dunbarvoid darwin::Lipo::ConstructJob(Compilation &C, const JobAction &JA,
9508cac5f7e1ce63dd77ee0fb4ef68f9fa804f41ea6Daniel Dunbar                                Job &Dest, const InputInfo &Output,
951ff7488dc9a766f94daf54d81b03ab9160d0bfd88Daniel Dunbar                                const InputInfoList &Inputs,
952ff7488dc9a766f94daf54d81b03ab9160d0bfd88Daniel Dunbar                                const ArgList &Args,
953ff7488dc9a766f94daf54d81b03ab9160d0bfd88Daniel Dunbar                                const char *LinkingOutput) const {
954ff7488dc9a766f94daf54d81b03ab9160d0bfd88Daniel Dunbar  ArgStringList CmdArgs;
955ff7488dc9a766f94daf54d81b03ab9160d0bfd88Daniel Dunbar
956ff7488dc9a766f94daf54d81b03ab9160d0bfd88Daniel Dunbar  CmdArgs.push_back("-create");
957ff7488dc9a766f94daf54d81b03ab9160d0bfd88Daniel Dunbar  assert(Output.isFilename() && "Unexpected lipo output.");
958a428df828ea4cc6916ea90dcd9fbbc840776d207Daniel Dunbar
959a428df828ea4cc6916ea90dcd9fbbc840776d207Daniel Dunbar  CmdArgs.push_back("-output");
960ff7488dc9a766f94daf54d81b03ab9160d0bfd88Daniel Dunbar  CmdArgs.push_back(Output.getFilename());
961a428df828ea4cc6916ea90dcd9fbbc840776d207Daniel Dunbar
962ff7488dc9a766f94daf54d81b03ab9160d0bfd88Daniel Dunbar  for (InputInfoList::const_iterator
963ff7488dc9a766f94daf54d81b03ab9160d0bfd88Daniel Dunbar         it = Inputs.begin(), ie = Inputs.end(); it != ie; ++it) {
964ff7488dc9a766f94daf54d81b03ab9160d0bfd88Daniel Dunbar    const InputInfo &II = *it;
965ff7488dc9a766f94daf54d81b03ab9160d0bfd88Daniel Dunbar    assert(II.isFilename() && "Unexpected lipo input.");
966ff7488dc9a766f94daf54d81b03ab9160d0bfd88Daniel Dunbar    CmdArgs.push_back(II.getFilename());
967ff7488dc9a766f94daf54d81b03ab9160d0bfd88Daniel Dunbar  }
968ff7488dc9a766f94daf54d81b03ab9160d0bfd88Daniel Dunbar  const char *Exec =
969ff7488dc9a766f94daf54d81b03ab9160d0bfd88Daniel Dunbar    Args.MakeArgString(getToolChain().GetProgramPath(C, "lipo").c_str());
970ff7488dc9a766f94daf54d81b03ab9160d0bfd88Daniel Dunbar  Dest.addCommand(new Command(Exec, CmdArgs));
971ff7488dc9a766f94daf54d81b03ab9160d0bfd88Daniel Dunbar}
972