Tools.cpp revision 40f1265ebd42ece3e7f7917319b56012e8e2bce2
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
46040f1265ebd42ece3e7f7917319b56012e8e2bce2Daniel Dunbarconst char *darwin::CC1::getCC1Name(types::ID Type) const {
46140f1265ebd42ece3e7f7917319b56012e8e2bce2Daniel Dunbar  switch (Type) {
46240f1265ebd42ece3e7f7917319b56012e8e2bce2Daniel Dunbar  default:
46340f1265ebd42ece3e7f7917319b56012e8e2bce2Daniel Dunbar    assert(0 && "Unexpected type for Darwin CC1 tool.");
46440f1265ebd42ece3e7f7917319b56012e8e2bce2Daniel Dunbar  case types::TY_Asm:
46540f1265ebd42ece3e7f7917319b56012e8e2bce2Daniel Dunbar  case types::TY_C: case types::TY_CHeader:
46640f1265ebd42ece3e7f7917319b56012e8e2bce2Daniel Dunbar  case types::TY_PP_C: case types::TY_PP_CHeader:
46740f1265ebd42ece3e7f7917319b56012e8e2bce2Daniel Dunbar    return "cc1";
46840f1265ebd42ece3e7f7917319b56012e8e2bce2Daniel Dunbar  case types::TY_ObjC: case types::TY_ObjCHeader:
46940f1265ebd42ece3e7f7917319b56012e8e2bce2Daniel Dunbar  case types::TY_PP_ObjC: case types::TY_PP_ObjCHeader:
47040f1265ebd42ece3e7f7917319b56012e8e2bce2Daniel Dunbar    return "cc1obj";
47140f1265ebd42ece3e7f7917319b56012e8e2bce2Daniel Dunbar  case types::TY_CXX: case types::TY_CXXHeader:
47240f1265ebd42ece3e7f7917319b56012e8e2bce2Daniel Dunbar  case types::TY_PP_CXX: case types::TY_PP_CXXHeader:
47340f1265ebd42ece3e7f7917319b56012e8e2bce2Daniel Dunbar    return "cc1plus";
47440f1265ebd42ece3e7f7917319b56012e8e2bce2Daniel Dunbar  case types::TY_ObjCXX: case types::TY_ObjCXXHeader:
47540f1265ebd42ece3e7f7917319b56012e8e2bce2Daniel Dunbar  case types::TY_PP_ObjCXX: case types::TY_PP_ObjCXXHeader:
47640f1265ebd42ece3e7f7917319b56012e8e2bce2Daniel Dunbar    return "cc1objplus";
47740f1265ebd42ece3e7f7917319b56012e8e2bce2Daniel Dunbar  }
47840f1265ebd42ece3e7f7917319b56012e8e2bce2Daniel Dunbar}
47940f1265ebd42ece3e7f7917319b56012e8e2bce2Daniel Dunbar
48040f1265ebd42ece3e7f7917319b56012e8e2bce2Daniel Dunbarvoid darwin::Preprocess::ConstructJob(Compilation &C, const JobAction &JA,
48140f1265ebd42ece3e7f7917319b56012e8e2bce2Daniel Dunbar                                      Job &Dest, const InputInfo &Output,
48240f1265ebd42ece3e7f7917319b56012e8e2bce2Daniel Dunbar                                      const InputInfoList &Inputs,
48340f1265ebd42ece3e7f7917319b56012e8e2bce2Daniel Dunbar                                      const ArgList &Args,
48440f1265ebd42ece3e7f7917319b56012e8e2bce2Daniel Dunbar                                      const char *LinkingOutput) const {
48540f1265ebd42ece3e7f7917319b56012e8e2bce2Daniel Dunbar  ArgStringList CmdArgs;
48640f1265ebd42ece3e7f7917319b56012e8e2bce2Daniel Dunbar
48740f1265ebd42ece3e7f7917319b56012e8e2bce2Daniel Dunbar  assert(Inputs.size() == 1 && "Unexpected number of inputs!");
48840f1265ebd42ece3e7f7917319b56012e8e2bce2Daniel Dunbar
48940f1265ebd42ece3e7f7917319b56012e8e2bce2Daniel Dunbar  CmdArgs.push_back("-E");
49040f1265ebd42ece3e7f7917319b56012e8e2bce2Daniel Dunbar
49140f1265ebd42ece3e7f7917319b56012e8e2bce2Daniel Dunbar  if (Args.hasArg(options::OPT_traditional) ||
49240f1265ebd42ece3e7f7917319b56012e8e2bce2Daniel Dunbar      Args.hasArg(options::OPT_ftraditional) ||
49340f1265ebd42ece3e7f7917319b56012e8e2bce2Daniel Dunbar      Args.hasArg(options::OPT_traditional_cpp))
49440f1265ebd42ece3e7f7917319b56012e8e2bce2Daniel Dunbar    CmdArgs.push_back("-traditional-cpp");
49540f1265ebd42ece3e7f7917319b56012e8e2bce2Daniel Dunbar
49640f1265ebd42ece3e7f7917319b56012e8e2bce2Daniel Dunbar  ArgStringList OutputArgs;
49740f1265ebd42ece3e7f7917319b56012e8e2bce2Daniel Dunbar  if (Output.isFilename()) {
49840f1265ebd42ece3e7f7917319b56012e8e2bce2Daniel Dunbar    OutputArgs.push_back("-o");
49940f1265ebd42ece3e7f7917319b56012e8e2bce2Daniel Dunbar    OutputArgs.push_back(Output.getFilename());
50040f1265ebd42ece3e7f7917319b56012e8e2bce2Daniel Dunbar  } else {
50140f1265ebd42ece3e7f7917319b56012e8e2bce2Daniel Dunbar    assert(Output.isPipe() && "Unexpected CC1 output.");
50240f1265ebd42ece3e7f7917319b56012e8e2bce2Daniel Dunbar  }
50340f1265ebd42ece3e7f7917319b56012e8e2bce2Daniel Dunbar
50440f1265ebd42ece3e7f7917319b56012e8e2bce2Daniel Dunbar  AddCPPOptionsArgs(Args, CmdArgs, Inputs, OutputArgs);
50540f1265ebd42ece3e7f7917319b56012e8e2bce2Daniel Dunbar
50640f1265ebd42ece3e7f7917319b56012e8e2bce2Daniel Dunbar  Args.AddAllArgs(CmdArgs, options::OPT_d_Group);
50740f1265ebd42ece3e7f7917319b56012e8e2bce2Daniel Dunbar
50840f1265ebd42ece3e7f7917319b56012e8e2bce2Daniel Dunbar  const char *CC1Name = getCC1Name(Inputs[0].getType());
50940f1265ebd42ece3e7f7917319b56012e8e2bce2Daniel Dunbar  const char *Exec =
51040f1265ebd42ece3e7f7917319b56012e8e2bce2Daniel Dunbar    Args.MakeArgString(getToolChain().GetProgramPath(C, CC1Name).c_str());
51140f1265ebd42ece3e7f7917319b56012e8e2bce2Daniel Dunbar  Dest.addCommand(new Command(Exec, CmdArgs));
51240f1265ebd42ece3e7f7917319b56012e8e2bce2Daniel Dunbar}
51340f1265ebd42ece3e7f7917319b56012e8e2bce2Daniel Dunbar
51440f1265ebd42ece3e7f7917319b56012e8e2bce2Daniel Dunbarvoid darwin::Compile::ConstructJob(Compilation &C, const JobAction &JA,
51540f1265ebd42ece3e7f7917319b56012e8e2bce2Daniel Dunbar                                   Job &Dest, const InputInfo &Output,
51640f1265ebd42ece3e7f7917319b56012e8e2bce2Daniel Dunbar                                   const InputInfoList &Inputs,
51740f1265ebd42ece3e7f7917319b56012e8e2bce2Daniel Dunbar                                   const ArgList &Args,
51840f1265ebd42ece3e7f7917319b56012e8e2bce2Daniel Dunbar                                   const char *LinkingOutput) const {
51940f1265ebd42ece3e7f7917319b56012e8e2bce2Daniel Dunbar  const Driver &D = getToolChain().getHost().getDriver();
52040f1265ebd42ece3e7f7917319b56012e8e2bce2Daniel Dunbar  ArgStringList CmdArgs;
52140f1265ebd42ece3e7f7917319b56012e8e2bce2Daniel Dunbar
52240f1265ebd42ece3e7f7917319b56012e8e2bce2Daniel Dunbar  assert(Inputs.size() == 1 && "Unexpected number of inputs!");
52340f1265ebd42ece3e7f7917319b56012e8e2bce2Daniel Dunbar
52440f1265ebd42ece3e7f7917319b56012e8e2bce2Daniel Dunbar  types::ID InputType = Inputs[0].getType();
52540f1265ebd42ece3e7f7917319b56012e8e2bce2Daniel Dunbar  const Arg *A;
52640f1265ebd42ece3e7f7917319b56012e8e2bce2Daniel Dunbar  if ((A = Args.getLastArg(options::OPT_traditional)) ||
52740f1265ebd42ece3e7f7917319b56012e8e2bce2Daniel Dunbar      (A = Args.getLastArg(options::OPT_ftraditional)))
52840f1265ebd42ece3e7f7917319b56012e8e2bce2Daniel Dunbar    D.Diag(clang::diag::err_drv_argument_only_allowed_with)
52940f1265ebd42ece3e7f7917319b56012e8e2bce2Daniel Dunbar      << A->getAsString(Args) << "-E";
53040f1265ebd42ece3e7f7917319b56012e8e2bce2Daniel Dunbar
53140f1265ebd42ece3e7f7917319b56012e8e2bce2Daniel Dunbar  if (Output.getType() == types::TY_LLVMAsm)
53240f1265ebd42ece3e7f7917319b56012e8e2bce2Daniel Dunbar    CmdArgs.push_back("-emit-llvm");
53340f1265ebd42ece3e7f7917319b56012e8e2bce2Daniel Dunbar  else if (Output.getType() == types::TY_LLVMBC)
53440f1265ebd42ece3e7f7917319b56012e8e2bce2Daniel Dunbar    CmdArgs.push_back("-emit-llvm-bc");
53540f1265ebd42ece3e7f7917319b56012e8e2bce2Daniel Dunbar
53640f1265ebd42ece3e7f7917319b56012e8e2bce2Daniel Dunbar  ArgStringList OutputArgs;
53740f1265ebd42ece3e7f7917319b56012e8e2bce2Daniel Dunbar  if (Output.getType() != types::TY_PCH) {
53840f1265ebd42ece3e7f7917319b56012e8e2bce2Daniel Dunbar    OutputArgs.push_back("-o");
53940f1265ebd42ece3e7f7917319b56012e8e2bce2Daniel Dunbar    if (Output.isPipe())
54040f1265ebd42ece3e7f7917319b56012e8e2bce2Daniel Dunbar      OutputArgs.push_back("-");
54140f1265ebd42ece3e7f7917319b56012e8e2bce2Daniel Dunbar    else if (Output.isNothing())
54240f1265ebd42ece3e7f7917319b56012e8e2bce2Daniel Dunbar      OutputArgs.push_back("/dev/null");
54340f1265ebd42ece3e7f7917319b56012e8e2bce2Daniel Dunbar    else
54440f1265ebd42ece3e7f7917319b56012e8e2bce2Daniel Dunbar      OutputArgs.push_back(Output.getFilename());
54540f1265ebd42ece3e7f7917319b56012e8e2bce2Daniel Dunbar  }
54640f1265ebd42ece3e7f7917319b56012e8e2bce2Daniel Dunbar
54740f1265ebd42ece3e7f7917319b56012e8e2bce2Daniel Dunbar  // There is no need for this level of compatibility, but it makes
54840f1265ebd42ece3e7f7917319b56012e8e2bce2Daniel Dunbar  // diffing easier.
54940f1265ebd42ece3e7f7917319b56012e8e2bce2Daniel Dunbar  bool OutputArgsEarly = (Args.hasArg(options::OPT_fsyntax_only) ||
55040f1265ebd42ece3e7f7917319b56012e8e2bce2Daniel Dunbar                          Args.hasArg(options::OPT_S));
55140f1265ebd42ece3e7f7917319b56012e8e2bce2Daniel Dunbar
55240f1265ebd42ece3e7f7917319b56012e8e2bce2Daniel Dunbar  if (types::getPreprocessedType(InputType) != types::TY_INVALID) {
55340f1265ebd42ece3e7f7917319b56012e8e2bce2Daniel Dunbar    AddCPPUniqueOptionsArgs(Args, CmdArgs);
55440f1265ebd42ece3e7f7917319b56012e8e2bce2Daniel Dunbar    if (OutputArgsEarly) {
55540f1265ebd42ece3e7f7917319b56012e8e2bce2Daniel Dunbar      AddCC1OptionsArgs(Args, CmdArgs, Inputs, OutputArgs);
55640f1265ebd42ece3e7f7917319b56012e8e2bce2Daniel Dunbar    } else {
55740f1265ebd42ece3e7f7917319b56012e8e2bce2Daniel Dunbar      AddCC1OptionsArgs(Args, CmdArgs, Inputs, ArgStringList());
55840f1265ebd42ece3e7f7917319b56012e8e2bce2Daniel Dunbar      CmdArgs.append(OutputArgs.begin(), OutputArgs.end());
55940f1265ebd42ece3e7f7917319b56012e8e2bce2Daniel Dunbar    }
56040f1265ebd42ece3e7f7917319b56012e8e2bce2Daniel Dunbar  } else {
56140f1265ebd42ece3e7f7917319b56012e8e2bce2Daniel Dunbar    CmdArgs.push_back("-fpreprocessed");
56240f1265ebd42ece3e7f7917319b56012e8e2bce2Daniel Dunbar
56340f1265ebd42ece3e7f7917319b56012e8e2bce2Daniel Dunbar    // FIXME: There is a spec command to remove
56440f1265ebd42ece3e7f7917319b56012e8e2bce2Daniel Dunbar    // -fpredictive-compilation args here. Investigate.
56540f1265ebd42ece3e7f7917319b56012e8e2bce2Daniel Dunbar
56640f1265ebd42ece3e7f7917319b56012e8e2bce2Daniel Dunbar    for (InputInfoList::const_iterator
56740f1265ebd42ece3e7f7917319b56012e8e2bce2Daniel Dunbar           it = Inputs.begin(), ie = Inputs.end(); it != ie; ++it) {
56840f1265ebd42ece3e7f7917319b56012e8e2bce2Daniel Dunbar      const InputInfo &II = *it;
56940f1265ebd42ece3e7f7917319b56012e8e2bce2Daniel Dunbar
57040f1265ebd42ece3e7f7917319b56012e8e2bce2Daniel Dunbar      if (II.isPipe())
57140f1265ebd42ece3e7f7917319b56012e8e2bce2Daniel Dunbar        CmdArgs.push_back("-");
57240f1265ebd42ece3e7f7917319b56012e8e2bce2Daniel Dunbar      else
57340f1265ebd42ece3e7f7917319b56012e8e2bce2Daniel Dunbar        CmdArgs.push_back(II.getFilename());
57440f1265ebd42ece3e7f7917319b56012e8e2bce2Daniel Dunbar    }
57540f1265ebd42ece3e7f7917319b56012e8e2bce2Daniel Dunbar
57640f1265ebd42ece3e7f7917319b56012e8e2bce2Daniel Dunbar    if (OutputArgsEarly) {
57740f1265ebd42ece3e7f7917319b56012e8e2bce2Daniel Dunbar      AddCC1OptionsArgs(Args, CmdArgs, Inputs, OutputArgs);
57840f1265ebd42ece3e7f7917319b56012e8e2bce2Daniel Dunbar    } else {
57940f1265ebd42ece3e7f7917319b56012e8e2bce2Daniel Dunbar      AddCC1OptionsArgs(Args, CmdArgs, Inputs, ArgStringList());
58040f1265ebd42ece3e7f7917319b56012e8e2bce2Daniel Dunbar      CmdArgs.append(OutputArgs.begin(), OutputArgs.end());
58140f1265ebd42ece3e7f7917319b56012e8e2bce2Daniel Dunbar    }
58240f1265ebd42ece3e7f7917319b56012e8e2bce2Daniel Dunbar  }
58340f1265ebd42ece3e7f7917319b56012e8e2bce2Daniel Dunbar
58440f1265ebd42ece3e7f7917319b56012e8e2bce2Daniel Dunbar  if (Output.getType() == types::TY_PCH) {
58540f1265ebd42ece3e7f7917319b56012e8e2bce2Daniel Dunbar    assert(Output.isFilename() && "Invalid PCH output.");
58640f1265ebd42ece3e7f7917319b56012e8e2bce2Daniel Dunbar
58740f1265ebd42ece3e7f7917319b56012e8e2bce2Daniel Dunbar    CmdArgs.push_back("-o");
58840f1265ebd42ece3e7f7917319b56012e8e2bce2Daniel Dunbar    // NOTE: gcc uses a temp .s file for this, but there doesn't seem
58940f1265ebd42ece3e7f7917319b56012e8e2bce2Daniel Dunbar    // to be a good reason.
59040f1265ebd42ece3e7f7917319b56012e8e2bce2Daniel Dunbar    CmdArgs.push_back("/dev/null");
59140f1265ebd42ece3e7f7917319b56012e8e2bce2Daniel Dunbar
59240f1265ebd42ece3e7f7917319b56012e8e2bce2Daniel Dunbar    CmdArgs.push_back("--output-pch=");
59340f1265ebd42ece3e7f7917319b56012e8e2bce2Daniel Dunbar    CmdArgs.push_back(Output.getFilename());
59440f1265ebd42ece3e7f7917319b56012e8e2bce2Daniel Dunbar  }
59540f1265ebd42ece3e7f7917319b56012e8e2bce2Daniel Dunbar
59640f1265ebd42ece3e7f7917319b56012e8e2bce2Daniel Dunbar  const char *CC1Name = getCC1Name(Inputs[0].getType());
59740f1265ebd42ece3e7f7917319b56012e8e2bce2Daniel Dunbar  const char *Exec =
59840f1265ebd42ece3e7f7917319b56012e8e2bce2Daniel Dunbar    Args.MakeArgString(getToolChain().GetProgramPath(C, CC1Name).c_str());
59940f1265ebd42ece3e7f7917319b56012e8e2bce2Daniel Dunbar  Dest.addCommand(new Command(Exec, CmdArgs));
60040f1265ebd42ece3e7f7917319b56012e8e2bce2Daniel Dunbar}
60140f1265ebd42ece3e7f7917319b56012e8e2bce2Daniel Dunbar
6028cac5f7e1ce63dd77ee0fb4ef68f9fa804f41ea6Daniel Dunbarvoid darwin::Assemble::ConstructJob(Compilation &C, const JobAction &JA,
6038cac5f7e1ce63dd77ee0fb4ef68f9fa804f41ea6Daniel Dunbar                                    Job &Dest, const InputInfo &Output,
6048cac5f7e1ce63dd77ee0fb4ef68f9fa804f41ea6Daniel Dunbar                                    const InputInfoList &Inputs,
6058cac5f7e1ce63dd77ee0fb4ef68f9fa804f41ea6Daniel Dunbar                                    const ArgList &Args,
6068cac5f7e1ce63dd77ee0fb4ef68f9fa804f41ea6Daniel Dunbar                                    const char *LinkingOutput) const {
6078cac5f7e1ce63dd77ee0fb4ef68f9fa804f41ea6Daniel Dunbar  ArgStringList CmdArgs;
6088cac5f7e1ce63dd77ee0fb4ef68f9fa804f41ea6Daniel Dunbar
6098cac5f7e1ce63dd77ee0fb4ef68f9fa804f41ea6Daniel Dunbar  assert(Inputs.size() == 1 && "Unexpected number of inputs.");
6108cac5f7e1ce63dd77ee0fb4ef68f9fa804f41ea6Daniel Dunbar  const InputInfo &Input = Inputs[0];
6118cac5f7e1ce63dd77ee0fb4ef68f9fa804f41ea6Daniel Dunbar
6128cac5f7e1ce63dd77ee0fb4ef68f9fa804f41ea6Daniel Dunbar  // Bit of a hack, this is only used for original inputs.
6138cac5f7e1ce63dd77ee0fb4ef68f9fa804f41ea6Daniel Dunbar  if (Input.isFilename() &&
6148cac5f7e1ce63dd77ee0fb4ef68f9fa804f41ea6Daniel Dunbar      strcmp(Input.getFilename(), Input.getBaseInput()) == 0 &&
6158cac5f7e1ce63dd77ee0fb4ef68f9fa804f41ea6Daniel Dunbar      Args.hasArg(options::OPT_g_Group))
6168cac5f7e1ce63dd77ee0fb4ef68f9fa804f41ea6Daniel Dunbar    CmdArgs.push_back("--gstabs");
6178cac5f7e1ce63dd77ee0fb4ef68f9fa804f41ea6Daniel Dunbar
6188cac5f7e1ce63dd77ee0fb4ef68f9fa804f41ea6Daniel Dunbar  // Derived from asm spec.
6198cac5f7e1ce63dd77ee0fb4ef68f9fa804f41ea6Daniel Dunbar  CmdArgs.push_back("-arch");
6208cac5f7e1ce63dd77ee0fb4ef68f9fa804f41ea6Daniel Dunbar  CmdArgs.push_back(getToolChain().getArchName().c_str());
6218cac5f7e1ce63dd77ee0fb4ef68f9fa804f41ea6Daniel Dunbar
6228cac5f7e1ce63dd77ee0fb4ef68f9fa804f41ea6Daniel Dunbar  CmdArgs.push_back("-force_cpusubtype_ALL");
6238cac5f7e1ce63dd77ee0fb4ef68f9fa804f41ea6Daniel Dunbar  if ((Args.hasArg(options::OPT_mkernel) ||
6248cac5f7e1ce63dd77ee0fb4ef68f9fa804f41ea6Daniel Dunbar       Args.hasArg(options::OPT_static) ||
6258cac5f7e1ce63dd77ee0fb4ef68f9fa804f41ea6Daniel Dunbar       Args.hasArg(options::OPT_fapple_kext)) &&
6268cac5f7e1ce63dd77ee0fb4ef68f9fa804f41ea6Daniel Dunbar      !Args.hasArg(options::OPT_dynamic))
6278cac5f7e1ce63dd77ee0fb4ef68f9fa804f41ea6Daniel Dunbar      CmdArgs.push_back("-static");
6288cac5f7e1ce63dd77ee0fb4ef68f9fa804f41ea6Daniel Dunbar
6298cac5f7e1ce63dd77ee0fb4ef68f9fa804f41ea6Daniel Dunbar  Args.AddAllArgValues(CmdArgs, options::OPT_Wa_COMMA,
6308cac5f7e1ce63dd77ee0fb4ef68f9fa804f41ea6Daniel Dunbar                       options::OPT_Xassembler);
6318cac5f7e1ce63dd77ee0fb4ef68f9fa804f41ea6Daniel Dunbar
6328cac5f7e1ce63dd77ee0fb4ef68f9fa804f41ea6Daniel Dunbar  assert(Output.isFilename() && "Unexpected lipo output.");
6338cac5f7e1ce63dd77ee0fb4ef68f9fa804f41ea6Daniel Dunbar  CmdArgs.push_back("-o");
6348cac5f7e1ce63dd77ee0fb4ef68f9fa804f41ea6Daniel Dunbar  CmdArgs.push_back(Output.getFilename());
6358cac5f7e1ce63dd77ee0fb4ef68f9fa804f41ea6Daniel Dunbar
6368cac5f7e1ce63dd77ee0fb4ef68f9fa804f41ea6Daniel Dunbar  if (Input.isPipe()) {
6378cac5f7e1ce63dd77ee0fb4ef68f9fa804f41ea6Daniel Dunbar    CmdArgs.push_back("-");
6388cac5f7e1ce63dd77ee0fb4ef68f9fa804f41ea6Daniel Dunbar  } else {
6398cac5f7e1ce63dd77ee0fb4ef68f9fa804f41ea6Daniel Dunbar    assert(Input.isFilename() && "Invalid input.");
6408cac5f7e1ce63dd77ee0fb4ef68f9fa804f41ea6Daniel Dunbar    CmdArgs.push_back(Input.getFilename());
6418cac5f7e1ce63dd77ee0fb4ef68f9fa804f41ea6Daniel Dunbar  }
6428cac5f7e1ce63dd77ee0fb4ef68f9fa804f41ea6Daniel Dunbar
6438cac5f7e1ce63dd77ee0fb4ef68f9fa804f41ea6Daniel Dunbar  // asm_final spec is empty.
6448cac5f7e1ce63dd77ee0fb4ef68f9fa804f41ea6Daniel Dunbar
6458cac5f7e1ce63dd77ee0fb4ef68f9fa804f41ea6Daniel Dunbar  const char *Exec =
6468cac5f7e1ce63dd77ee0fb4ef68f9fa804f41ea6Daniel Dunbar    Args.MakeArgString(getToolChain().GetProgramPath(C, "as").c_str());
6478cac5f7e1ce63dd77ee0fb4ef68f9fa804f41ea6Daniel Dunbar  Dest.addCommand(new Command(Exec, CmdArgs));
6488cac5f7e1ce63dd77ee0fb4ef68f9fa804f41ea6Daniel Dunbar}
649ff7488dc9a766f94daf54d81b03ab9160d0bfd88Daniel Dunbar
65002633b541b04ad5ffc1c70f4c2feeeb13e607057Daniel Dunbarstatic const char *MakeFormattedString(const ArgList &Args,
65102633b541b04ad5ffc1c70f4c2feeeb13e607057Daniel Dunbar                                       const llvm::format_object_base &Fmt) {
65202633b541b04ad5ffc1c70f4c2feeeb13e607057Daniel Dunbar  std::string Str;
65302633b541b04ad5ffc1c70f4c2feeeb13e607057Daniel Dunbar  llvm::raw_string_ostream(Str) << Fmt;
65402633b541b04ad5ffc1c70f4c2feeeb13e607057Daniel Dunbar  return Args.MakeArgString(Str.c_str());
65502633b541b04ad5ffc1c70f4c2feeeb13e607057Daniel Dunbar}
65602633b541b04ad5ffc1c70f4c2feeeb13e607057Daniel Dunbar
65702633b541b04ad5ffc1c70f4c2feeeb13e607057Daniel Dunbar/// Helper routine for seeing if we should use dsymutil; this is a
65802633b541b04ad5ffc1c70f4c2feeeb13e607057Daniel Dunbar/// gcc compatible hack, we should remove it and use the input
65902633b541b04ad5ffc1c70f4c2feeeb13e607057Daniel Dunbar/// type information.
66002633b541b04ad5ffc1c70f4c2feeeb13e607057Daniel Dunbarstatic bool isSourceSuffix(const char *Str) {
66102633b541b04ad5ffc1c70f4c2feeeb13e607057Daniel Dunbar  // match: 'C', 'CPP', 'c', 'cc', 'cp', 'c++', 'cpp', 'cxx', 'm',
66202633b541b04ad5ffc1c70f4c2feeeb13e607057Daniel Dunbar  // 'mm'.
66302633b541b04ad5ffc1c70f4c2feeeb13e607057Daniel Dunbar  switch (strlen(Str)) {
66402633b541b04ad5ffc1c70f4c2feeeb13e607057Daniel Dunbar  default:
66502633b541b04ad5ffc1c70f4c2feeeb13e607057Daniel Dunbar    return false;
66602633b541b04ad5ffc1c70f4c2feeeb13e607057Daniel Dunbar  case 1:
66702633b541b04ad5ffc1c70f4c2feeeb13e607057Daniel Dunbar    return (memcmp(Str, "C", 1) == 0 ||
66802633b541b04ad5ffc1c70f4c2feeeb13e607057Daniel Dunbar            memcmp(Str, "c", 1) == 0 ||
66902633b541b04ad5ffc1c70f4c2feeeb13e607057Daniel Dunbar            memcmp(Str, "m", 1) == 0);
67002633b541b04ad5ffc1c70f4c2feeeb13e607057Daniel Dunbar  case 2:
67102633b541b04ad5ffc1c70f4c2feeeb13e607057Daniel Dunbar    return (memcmp(Str, "cc", 2) == 0 ||
67202633b541b04ad5ffc1c70f4c2feeeb13e607057Daniel Dunbar            memcmp(Str, "cp", 2) == 0 ||
67302633b541b04ad5ffc1c70f4c2feeeb13e607057Daniel Dunbar            memcmp(Str, "mm", 2) == 0);
67402633b541b04ad5ffc1c70f4c2feeeb13e607057Daniel Dunbar  case 3:
67502633b541b04ad5ffc1c70f4c2feeeb13e607057Daniel Dunbar    return (memcmp(Str, "CPP", 3) == 0 ||
67602633b541b04ad5ffc1c70f4c2feeeb13e607057Daniel Dunbar            memcmp(Str, "c++", 3) == 0 ||
67702633b541b04ad5ffc1c70f4c2feeeb13e607057Daniel Dunbar            memcmp(Str, "cpp", 3) == 0 ||
67802633b541b04ad5ffc1c70f4c2feeeb13e607057Daniel Dunbar            memcmp(Str, "cxx", 3) == 0);
67902633b541b04ad5ffc1c70f4c2feeeb13e607057Daniel Dunbar  }
68002633b541b04ad5ffc1c70f4c2feeeb13e607057Daniel Dunbar}
68102633b541b04ad5ffc1c70f4c2feeeb13e607057Daniel Dunbar
68202633b541b04ad5ffc1c70f4c2feeeb13e607057Daniel Dunbarstatic bool isMacosxVersionLT(unsigned (&A)[3], unsigned (&B)[3]) {
68302633b541b04ad5ffc1c70f4c2feeeb13e607057Daniel Dunbar  for (unsigned i=0; i < 3; ++i) {
68402633b541b04ad5ffc1c70f4c2feeeb13e607057Daniel Dunbar    if (A[i] > B[i]) return false;
68502633b541b04ad5ffc1c70f4c2feeeb13e607057Daniel Dunbar    if (A[i] < B[i]) return true;
68602633b541b04ad5ffc1c70f4c2feeeb13e607057Daniel Dunbar  }
68702633b541b04ad5ffc1c70f4c2feeeb13e607057Daniel Dunbar  return false;
68802633b541b04ad5ffc1c70f4c2feeeb13e607057Daniel Dunbar}
68902633b541b04ad5ffc1c70f4c2feeeb13e607057Daniel Dunbar
69002633b541b04ad5ffc1c70f4c2feeeb13e607057Daniel Dunbarstatic bool isMacosxVersionLT(unsigned (&A)[3],
69102633b541b04ad5ffc1c70f4c2feeeb13e607057Daniel Dunbar                              unsigned V0, unsigned V1=0, unsigned V2=0) {
69202633b541b04ad5ffc1c70f4c2feeeb13e607057Daniel Dunbar  unsigned B[3] = { V0, V1, V2 };
69302633b541b04ad5ffc1c70f4c2feeeb13e607057Daniel Dunbar  return isMacosxVersionLT(A, B);
69402633b541b04ad5ffc1c70f4c2feeeb13e607057Daniel Dunbar}
69502633b541b04ad5ffc1c70f4c2feeeb13e607057Daniel Dunbar
69602633b541b04ad5ffc1c70f4c2feeeb13e607057Daniel Dunbarstatic bool isMacosxVersionGTE(unsigned(&A)[3],
69702633b541b04ad5ffc1c70f4c2feeeb13e607057Daniel Dunbar                              unsigned V0, unsigned V1=0, unsigned V2=0) {
69802633b541b04ad5ffc1c70f4c2feeeb13e607057Daniel Dunbar  return !isMacosxVersionLT(A, V0, V1, V2);
69902633b541b04ad5ffc1c70f4c2feeeb13e607057Daniel Dunbar}
70002633b541b04ad5ffc1c70f4c2feeeb13e607057Daniel Dunbar
70102633b541b04ad5ffc1c70f4c2feeeb13e607057Daniel Dunbarconst toolchains::Darwin_X86 &darwin::Link::getDarwinToolChain() const {
70202633b541b04ad5ffc1c70f4c2feeeb13e607057Daniel Dunbar  return reinterpret_cast<const toolchains::Darwin_X86&>(getToolChain());
70302633b541b04ad5ffc1c70f4c2feeeb13e607057Daniel Dunbar}
70402633b541b04ad5ffc1c70f4c2feeeb13e607057Daniel Dunbar
70502633b541b04ad5ffc1c70f4c2feeeb13e607057Daniel Dunbarvoid darwin::Link::AddDarwinArch(const ArgList &Args,
70602633b541b04ad5ffc1c70f4c2feeeb13e607057Daniel Dunbar                                 ArgStringList &CmdArgs) const {
70702633b541b04ad5ffc1c70f4c2feeeb13e607057Daniel Dunbar  // Derived from darwin_arch spec.
70802633b541b04ad5ffc1c70f4c2feeeb13e607057Daniel Dunbar  CmdArgs.push_back("-arch");
70902633b541b04ad5ffc1c70f4c2feeeb13e607057Daniel Dunbar  CmdArgs.push_back(getToolChain().getArchName().c_str());
71002633b541b04ad5ffc1c70f4c2feeeb13e607057Daniel Dunbar}
71102633b541b04ad5ffc1c70f4c2feeeb13e607057Daniel Dunbar
71202633b541b04ad5ffc1c70f4c2feeeb13e607057Daniel Dunbarvoid darwin::Link::AddDarwinSubArch(const ArgList &Args,
71302633b541b04ad5ffc1c70f4c2feeeb13e607057Daniel Dunbar                                    ArgStringList &CmdArgs) const {
71402633b541b04ad5ffc1c70f4c2feeeb13e607057Daniel Dunbar  // Derived from darwin_subarch spec, not sure what the distinction
71502633b541b04ad5ffc1c70f4c2feeeb13e607057Daniel Dunbar  // exists for but at least for this chain it is the same.
71602633b541b04ad5ffc1c70f4c2feeeb13e607057Daniel Dunbar  AddDarwinArch(Args, CmdArgs);
71702633b541b04ad5ffc1c70f4c2feeeb13e607057Daniel Dunbar}
71802633b541b04ad5ffc1c70f4c2feeeb13e607057Daniel Dunbar
71902633b541b04ad5ffc1c70f4c2feeeb13e607057Daniel Dunbarvoid darwin::Link::AddLinkArgs(const ArgList &Args,
72002633b541b04ad5ffc1c70f4c2feeeb13e607057Daniel Dunbar                               ArgStringList &CmdArgs) const {
72102633b541b04ad5ffc1c70f4c2feeeb13e607057Daniel Dunbar  const Driver &D = getToolChain().getHost().getDriver();
72202633b541b04ad5ffc1c70f4c2feeeb13e607057Daniel Dunbar
72302633b541b04ad5ffc1c70f4c2feeeb13e607057Daniel Dunbar  // Derived from the "link" spec.
72402633b541b04ad5ffc1c70f4c2feeeb13e607057Daniel Dunbar  Args.AddAllArgs(CmdArgs, options::OPT_static);
72502633b541b04ad5ffc1c70f4c2feeeb13e607057Daniel Dunbar  if (!Args.hasArg(options::OPT_static))
72602633b541b04ad5ffc1c70f4c2feeeb13e607057Daniel Dunbar    CmdArgs.push_back("-dynamic");
72702633b541b04ad5ffc1c70f4c2feeeb13e607057Daniel Dunbar  if (Args.hasArg(options::OPT_fgnu_runtime)) {
72802633b541b04ad5ffc1c70f4c2feeeb13e607057Daniel Dunbar    // FIXME: gcc replaces -lobjc in forward args with -lobjc-gnu
72902633b541b04ad5ffc1c70f4c2feeeb13e607057Daniel Dunbar    // here. How do we wish to handle such things?
73002633b541b04ad5ffc1c70f4c2feeeb13e607057Daniel Dunbar  }
73102633b541b04ad5ffc1c70f4c2feeeb13e607057Daniel Dunbar
73202633b541b04ad5ffc1c70f4c2feeeb13e607057Daniel Dunbar  if (!Args.hasArg(options::OPT_dynamiclib)) {
73302633b541b04ad5ffc1c70f4c2feeeb13e607057Daniel Dunbar    if (Args.hasArg(options::OPT_force__cpusubtype__ALL)) {
73402633b541b04ad5ffc1c70f4c2feeeb13e607057Daniel Dunbar      AddDarwinArch(Args, CmdArgs);
73502633b541b04ad5ffc1c70f4c2feeeb13e607057Daniel Dunbar      CmdArgs.push_back("-force_cpusubtype_ALL");
73602633b541b04ad5ffc1c70f4c2feeeb13e607057Daniel Dunbar    } else
73702633b541b04ad5ffc1c70f4c2feeeb13e607057Daniel Dunbar      AddDarwinSubArch(Args, CmdArgs);
73802633b541b04ad5ffc1c70f4c2feeeb13e607057Daniel Dunbar
73902633b541b04ad5ffc1c70f4c2feeeb13e607057Daniel Dunbar    Args.AddLastArg(CmdArgs, options::OPT_bundle);
74002633b541b04ad5ffc1c70f4c2feeeb13e607057Daniel Dunbar    Args.AddAllArgs(CmdArgs, options::OPT_bundle__loader);
74102633b541b04ad5ffc1c70f4c2feeeb13e607057Daniel Dunbar    Args.AddAllArgs(CmdArgs, options::OPT_client__name);
74202633b541b04ad5ffc1c70f4c2feeeb13e607057Daniel Dunbar
74302633b541b04ad5ffc1c70f4c2feeeb13e607057Daniel Dunbar    Arg *A;
74402633b541b04ad5ffc1c70f4c2feeeb13e607057Daniel Dunbar    if ((A = Args.getLastArg(options::OPT_compatibility__version)) ||
74502633b541b04ad5ffc1c70f4c2feeeb13e607057Daniel Dunbar        (A = Args.getLastArg(options::OPT_current__version)) ||
74602633b541b04ad5ffc1c70f4c2feeeb13e607057Daniel Dunbar        (A = Args.getLastArg(options::OPT_install__name)))
74702633b541b04ad5ffc1c70f4c2feeeb13e607057Daniel Dunbar      D.Diag(clang::diag::err_drv_argument_only_allowed_with)
74802633b541b04ad5ffc1c70f4c2feeeb13e607057Daniel Dunbar        << A->getAsString(Args) << "-dynamiclib";
74902633b541b04ad5ffc1c70f4c2feeeb13e607057Daniel Dunbar
75002633b541b04ad5ffc1c70f4c2feeeb13e607057Daniel Dunbar    Args.AddLastArg(CmdArgs, options::OPT_force__flat__namespace);
75102633b541b04ad5ffc1c70f4c2feeeb13e607057Daniel Dunbar    Args.AddLastArg(CmdArgs, options::OPT_keep__private__externs);
75202633b541b04ad5ffc1c70f4c2feeeb13e607057Daniel Dunbar    Args.AddLastArg(CmdArgs, options::OPT_private__bundle);
75302633b541b04ad5ffc1c70f4c2feeeb13e607057Daniel Dunbar  } else {
75402633b541b04ad5ffc1c70f4c2feeeb13e607057Daniel Dunbar    CmdArgs.push_back("-dylib");
75502633b541b04ad5ffc1c70f4c2feeeb13e607057Daniel Dunbar
75602633b541b04ad5ffc1c70f4c2feeeb13e607057Daniel Dunbar    Arg *A;
75702633b541b04ad5ffc1c70f4c2feeeb13e607057Daniel Dunbar    if ((A = Args.getLastArg(options::OPT_bundle)) ||
75802633b541b04ad5ffc1c70f4c2feeeb13e607057Daniel Dunbar        (A = Args.getLastArg(options::OPT_bundle__loader)) ||
75902633b541b04ad5ffc1c70f4c2feeeb13e607057Daniel Dunbar        (A = Args.getLastArg(options::OPT_client__name)) ||
76002633b541b04ad5ffc1c70f4c2feeeb13e607057Daniel Dunbar        (A = Args.getLastArg(options::OPT_force__flat__namespace)) ||
76102633b541b04ad5ffc1c70f4c2feeeb13e607057Daniel Dunbar        (A = Args.getLastArg(options::OPT_keep__private__externs)) ||
76202633b541b04ad5ffc1c70f4c2feeeb13e607057Daniel Dunbar        (A = Args.getLastArg(options::OPT_private__bundle)))
76302633b541b04ad5ffc1c70f4c2feeeb13e607057Daniel Dunbar      D.Diag(clang::diag::err_drv_argument_not_allowed_with)
76402633b541b04ad5ffc1c70f4c2feeeb13e607057Daniel Dunbar        << A->getAsString(Args) << "-dynamiclib";
76502633b541b04ad5ffc1c70f4c2feeeb13e607057Daniel Dunbar
76602633b541b04ad5ffc1c70f4c2feeeb13e607057Daniel Dunbar    Args.AddAllArgsTranslated(CmdArgs, options::OPT_compatibility__version,
76702633b541b04ad5ffc1c70f4c2feeeb13e607057Daniel Dunbar                              "-dylib_compatibility_version");
76802633b541b04ad5ffc1c70f4c2feeeb13e607057Daniel Dunbar    Args.AddAllArgsTranslated(CmdArgs, options::OPT_current__version,
76902633b541b04ad5ffc1c70f4c2feeeb13e607057Daniel Dunbar                              "-dylib_current_version");
77002633b541b04ad5ffc1c70f4c2feeeb13e607057Daniel Dunbar
77102633b541b04ad5ffc1c70f4c2feeeb13e607057Daniel Dunbar    if (Args.hasArg(options::OPT_force__cpusubtype__ALL)) {
77202633b541b04ad5ffc1c70f4c2feeeb13e607057Daniel Dunbar      AddDarwinArch(Args, CmdArgs);
77302633b541b04ad5ffc1c70f4c2feeeb13e607057Daniel Dunbar          // NOTE: We don't add -force_cpusubtype_ALL on this path. Ok.
77402633b541b04ad5ffc1c70f4c2feeeb13e607057Daniel Dunbar    } else
77502633b541b04ad5ffc1c70f4c2feeeb13e607057Daniel Dunbar      AddDarwinSubArch(Args, CmdArgs);
77602633b541b04ad5ffc1c70f4c2feeeb13e607057Daniel Dunbar
77702633b541b04ad5ffc1c70f4c2feeeb13e607057Daniel Dunbar    Args.AddAllArgsTranslated(CmdArgs, options::OPT_install__name,
77802633b541b04ad5ffc1c70f4c2feeeb13e607057Daniel Dunbar                              "-dylib_install_name");
77902633b541b04ad5ffc1c70f4c2feeeb13e607057Daniel Dunbar  }
78002633b541b04ad5ffc1c70f4c2feeeb13e607057Daniel Dunbar
78102633b541b04ad5ffc1c70f4c2feeeb13e607057Daniel Dunbar  Args.AddLastArg(CmdArgs, options::OPT_all__load);
78202633b541b04ad5ffc1c70f4c2feeeb13e607057Daniel Dunbar  Args.AddAllArgs(CmdArgs, options::OPT_allowable__client);
78302633b541b04ad5ffc1c70f4c2feeeb13e607057Daniel Dunbar  Args.AddLastArg(CmdArgs, options::OPT_bind__at__load);
78402633b541b04ad5ffc1c70f4c2feeeb13e607057Daniel Dunbar  Args.AddLastArg(CmdArgs, options::OPT_dead__strip);
78502633b541b04ad5ffc1c70f4c2feeeb13e607057Daniel Dunbar  Args.AddLastArg(CmdArgs, options::OPT_no__dead__strip__inits__and__terms);
78602633b541b04ad5ffc1c70f4c2feeeb13e607057Daniel Dunbar  Args.AddAllArgs(CmdArgs, options::OPT_dylib__file);
78702633b541b04ad5ffc1c70f4c2feeeb13e607057Daniel Dunbar  Args.AddLastArg(CmdArgs, options::OPT_dynamic);
78802633b541b04ad5ffc1c70f4c2feeeb13e607057Daniel Dunbar  Args.AddAllArgs(CmdArgs, options::OPT_exported__symbols__list);
78902633b541b04ad5ffc1c70f4c2feeeb13e607057Daniel Dunbar  Args.AddLastArg(CmdArgs, options::OPT_flat__namespace);
79002633b541b04ad5ffc1c70f4c2feeeb13e607057Daniel Dunbar  Args.AddAllArgs(CmdArgs, options::OPT_headerpad__max__install__names);
79102633b541b04ad5ffc1c70f4c2feeeb13e607057Daniel Dunbar  Args.AddAllArgs(CmdArgs, options::OPT_image__base);
79202633b541b04ad5ffc1c70f4c2feeeb13e607057Daniel Dunbar  Args.AddAllArgs(CmdArgs, options::OPT_init);
79302633b541b04ad5ffc1c70f4c2feeeb13e607057Daniel Dunbar
79402633b541b04ad5ffc1c70f4c2feeeb13e607057Daniel Dunbar  if (!Args.hasArg(options::OPT_mmacosx_version_min_EQ)) {
79502633b541b04ad5ffc1c70f4c2feeeb13e607057Daniel Dunbar    if (!Args.hasArg(options::OPT_miphoneos_version_min_EQ)) {
79602633b541b04ad5ffc1c70f4c2feeeb13e607057Daniel Dunbar        // FIXME: I don't understand what is going on here. This is
79702633b541b04ad5ffc1c70f4c2feeeb13e607057Daniel Dunbar        // supposed to come from darwin_ld_minversion, but gcc doesn't
79802633b541b04ad5ffc1c70f4c2feeeb13e607057Daniel Dunbar        // seem to be following that; it must be getting overridden
79902633b541b04ad5ffc1c70f4c2feeeb13e607057Daniel Dunbar        // somewhere.
80002633b541b04ad5ffc1c70f4c2feeeb13e607057Daniel Dunbar        CmdArgs.push_back("-macosx_version_min");
80102633b541b04ad5ffc1c70f4c2feeeb13e607057Daniel Dunbar        CmdArgs.push_back(getDarwinToolChain().getMacosxVersionStr());
80202633b541b04ad5ffc1c70f4c2feeeb13e607057Daniel Dunbar      }
80302633b541b04ad5ffc1c70f4c2feeeb13e607057Daniel Dunbar  } else {
80402633b541b04ad5ffc1c70f4c2feeeb13e607057Daniel Dunbar    // Adding all arguments doesn't make sense here but this is what
80502633b541b04ad5ffc1c70f4c2feeeb13e607057Daniel Dunbar    // gcc does.
80602633b541b04ad5ffc1c70f4c2feeeb13e607057Daniel Dunbar    Args.AddAllArgsTranslated(CmdArgs, options::OPT_mmacosx_version_min_EQ,
80702633b541b04ad5ffc1c70f4c2feeeb13e607057Daniel Dunbar                              "-macosx_version_min");
80802633b541b04ad5ffc1c70f4c2feeeb13e607057Daniel Dunbar  }
80902633b541b04ad5ffc1c70f4c2feeeb13e607057Daniel Dunbar
81002633b541b04ad5ffc1c70f4c2feeeb13e607057Daniel Dunbar  Args.AddAllArgsTranslated(CmdArgs, options::OPT_miphoneos_version_min_EQ,
81102633b541b04ad5ffc1c70f4c2feeeb13e607057Daniel Dunbar                            "-iphoneos_version_min");
81202633b541b04ad5ffc1c70f4c2feeeb13e607057Daniel Dunbar  Args.AddLastArg(CmdArgs, options::OPT_nomultidefs);
81302633b541b04ad5ffc1c70f4c2feeeb13e607057Daniel Dunbar  Args.AddLastArg(CmdArgs, options::OPT_multi__module);
81402633b541b04ad5ffc1c70f4c2feeeb13e607057Daniel Dunbar  Args.AddLastArg(CmdArgs, options::OPT_single__module);
81502633b541b04ad5ffc1c70f4c2feeeb13e607057Daniel Dunbar  Args.AddAllArgs(CmdArgs, options::OPT_multiply__defined);
81602633b541b04ad5ffc1c70f4c2feeeb13e607057Daniel Dunbar  Args.AddAllArgs(CmdArgs, options::OPT_multiply__defined__unused);
81702633b541b04ad5ffc1c70f4c2feeeb13e607057Daniel Dunbar
81802633b541b04ad5ffc1c70f4c2feeeb13e607057Daniel Dunbar  if (Args.hasArg(options::OPT_fpie))
81902633b541b04ad5ffc1c70f4c2feeeb13e607057Daniel Dunbar    CmdArgs.push_back("-pie");
82002633b541b04ad5ffc1c70f4c2feeeb13e607057Daniel Dunbar
82102633b541b04ad5ffc1c70f4c2feeeb13e607057Daniel Dunbar  Args.AddLastArg(CmdArgs, options::OPT_prebind);
82202633b541b04ad5ffc1c70f4c2feeeb13e607057Daniel Dunbar  Args.AddLastArg(CmdArgs, options::OPT_noprebind);
82302633b541b04ad5ffc1c70f4c2feeeb13e607057Daniel Dunbar  Args.AddLastArg(CmdArgs, options::OPT_nofixprebinding);
82402633b541b04ad5ffc1c70f4c2feeeb13e607057Daniel Dunbar  Args.AddLastArg(CmdArgs, options::OPT_prebind__all__twolevel__modules);
82502633b541b04ad5ffc1c70f4c2feeeb13e607057Daniel Dunbar  Args.AddLastArg(CmdArgs, options::OPT_read__only__relocs);
82602633b541b04ad5ffc1c70f4c2feeeb13e607057Daniel Dunbar  Args.AddAllArgs(CmdArgs, options::OPT_sectcreate);
82702633b541b04ad5ffc1c70f4c2feeeb13e607057Daniel Dunbar  Args.AddAllArgs(CmdArgs, options::OPT_sectorder);
82802633b541b04ad5ffc1c70f4c2feeeb13e607057Daniel Dunbar  Args.AddAllArgs(CmdArgs, options::OPT_seg1addr);
82902633b541b04ad5ffc1c70f4c2feeeb13e607057Daniel Dunbar  Args.AddAllArgs(CmdArgs, options::OPT_segprot);
83002633b541b04ad5ffc1c70f4c2feeeb13e607057Daniel Dunbar  Args.AddAllArgs(CmdArgs, options::OPT_segaddr);
83102633b541b04ad5ffc1c70f4c2feeeb13e607057Daniel Dunbar  Args.AddAllArgs(CmdArgs, options::OPT_segs__read__only__addr);
83202633b541b04ad5ffc1c70f4c2feeeb13e607057Daniel Dunbar  Args.AddAllArgs(CmdArgs, options::OPT_segs__read__write__addr);
83302633b541b04ad5ffc1c70f4c2feeeb13e607057Daniel Dunbar  Args.AddAllArgs(CmdArgs, options::OPT_seg__addr__table);
83402633b541b04ad5ffc1c70f4c2feeeb13e607057Daniel Dunbar  Args.AddAllArgs(CmdArgs, options::OPT_seg__addr__table__filename);
83502633b541b04ad5ffc1c70f4c2feeeb13e607057Daniel Dunbar  Args.AddAllArgs(CmdArgs, options::OPT_sub__library);
83602633b541b04ad5ffc1c70f4c2feeeb13e607057Daniel Dunbar  Args.AddAllArgs(CmdArgs, options::OPT_sub__umbrella);
83702633b541b04ad5ffc1c70f4c2feeeb13e607057Daniel Dunbar  Args.AddAllArgsTranslated(CmdArgs, options::OPT_isysroot, "-syslibroot");
83802633b541b04ad5ffc1c70f4c2feeeb13e607057Daniel Dunbar  Args.AddLastArg(CmdArgs, options::OPT_twolevel__namespace);
83902633b541b04ad5ffc1c70f4c2feeeb13e607057Daniel Dunbar  Args.AddLastArg(CmdArgs, options::OPT_twolevel__namespace__hints);
84002633b541b04ad5ffc1c70f4c2feeeb13e607057Daniel Dunbar  Args.AddAllArgs(CmdArgs, options::OPT_umbrella);
84102633b541b04ad5ffc1c70f4c2feeeb13e607057Daniel Dunbar  Args.AddAllArgs(CmdArgs, options::OPT_undefined);
84202633b541b04ad5ffc1c70f4c2feeeb13e607057Daniel Dunbar  Args.AddAllArgs(CmdArgs, options::OPT_unexported__symbols__list);
84302633b541b04ad5ffc1c70f4c2feeeb13e607057Daniel Dunbar  Args.AddAllArgs(CmdArgs, options::OPT_weak__reference__mismatches);
84402633b541b04ad5ffc1c70f4c2feeeb13e607057Daniel Dunbar
84502633b541b04ad5ffc1c70f4c2feeeb13e607057Daniel Dunbar  if (!Args.hasArg(options::OPT_weak__reference__mismatches)) {
84602633b541b04ad5ffc1c70f4c2feeeb13e607057Daniel Dunbar    CmdArgs.push_back("-weak_reference_mismatches");
84702633b541b04ad5ffc1c70f4c2feeeb13e607057Daniel Dunbar    CmdArgs.push_back("non-weak");
84802633b541b04ad5ffc1c70f4c2feeeb13e607057Daniel Dunbar  }
84902633b541b04ad5ffc1c70f4c2feeeb13e607057Daniel Dunbar
85002633b541b04ad5ffc1c70f4c2feeeb13e607057Daniel Dunbar  Args.AddLastArg(CmdArgs, options::OPT_X_Flag);
85102633b541b04ad5ffc1c70f4c2feeeb13e607057Daniel Dunbar  Args.AddAllArgs(CmdArgs, options::OPT_y);
85202633b541b04ad5ffc1c70f4c2feeeb13e607057Daniel Dunbar  Args.AddLastArg(CmdArgs, options::OPT_w);
85302633b541b04ad5ffc1c70f4c2feeeb13e607057Daniel Dunbar  Args.AddAllArgs(CmdArgs, options::OPT_pagezero__size);
85402633b541b04ad5ffc1c70f4c2feeeb13e607057Daniel Dunbar  Args.AddAllArgs(CmdArgs, options::OPT_segs__read__);
85502633b541b04ad5ffc1c70f4c2feeeb13e607057Daniel Dunbar  Args.AddLastArg(CmdArgs, options::OPT_seglinkedit);
85602633b541b04ad5ffc1c70f4c2feeeb13e607057Daniel Dunbar  Args.AddLastArg(CmdArgs, options::OPT_noseglinkedit);
85702633b541b04ad5ffc1c70f4c2feeeb13e607057Daniel Dunbar  Args.AddAllArgs(CmdArgs, options::OPT_sectalign);
85802633b541b04ad5ffc1c70f4c2feeeb13e607057Daniel Dunbar  Args.AddAllArgs(CmdArgs, options::OPT_sectobjectsymbols);
85902633b541b04ad5ffc1c70f4c2feeeb13e607057Daniel Dunbar  Args.AddAllArgs(CmdArgs, options::OPT_segcreate);
86002633b541b04ad5ffc1c70f4c2feeeb13e607057Daniel Dunbar  Args.AddLastArg(CmdArgs, options::OPT_whyload);
86102633b541b04ad5ffc1c70f4c2feeeb13e607057Daniel Dunbar  Args.AddLastArg(CmdArgs, options::OPT_whatsloaded);
86202633b541b04ad5ffc1c70f4c2feeeb13e607057Daniel Dunbar  Args.AddAllArgs(CmdArgs, options::OPT_dylinker__install__name);
86302633b541b04ad5ffc1c70f4c2feeeb13e607057Daniel Dunbar  Args.AddLastArg(CmdArgs, options::OPT_dylinker);
86402633b541b04ad5ffc1c70f4c2feeeb13e607057Daniel Dunbar  Args.AddLastArg(CmdArgs, options::OPT_Mach);
86502633b541b04ad5ffc1c70f4c2feeeb13e607057Daniel Dunbar}
86602633b541b04ad5ffc1c70f4c2feeeb13e607057Daniel Dunbar
86702633b541b04ad5ffc1c70f4c2feeeb13e607057Daniel Dunbarvoid darwin::Link::ConstructJob(Compilation &C, const JobAction &JA,
86802633b541b04ad5ffc1c70f4c2feeeb13e607057Daniel Dunbar                                Job &Dest, const InputInfo &Output,
86902633b541b04ad5ffc1c70f4c2feeeb13e607057Daniel Dunbar                                const InputInfoList &Inputs,
87002633b541b04ad5ffc1c70f4c2feeeb13e607057Daniel Dunbar                                const ArgList &Args,
87102633b541b04ad5ffc1c70f4c2feeeb13e607057Daniel Dunbar                                const char *LinkingOutput) const {
87202633b541b04ad5ffc1c70f4c2feeeb13e607057Daniel Dunbar  assert(Output.getType() == types::TY_Image && "Invalid linker output type.");
87302633b541b04ad5ffc1c70f4c2feeeb13e607057Daniel Dunbar  // The logic here is derived from gcc's behavior; most of which
87402633b541b04ad5ffc1c70f4c2feeeb13e607057Daniel Dunbar  // comes from specs (starting with link_command). Consult gcc for
87502633b541b04ad5ffc1c70f4c2feeeb13e607057Daniel Dunbar  // more information.
87602633b541b04ad5ffc1c70f4c2feeeb13e607057Daniel Dunbar
87702633b541b04ad5ffc1c70f4c2feeeb13e607057Daniel Dunbar  // FIXME: The spec references -fdump= which seems to have
87802633b541b04ad5ffc1c70f4c2feeeb13e607057Daniel Dunbar  // disappeared?
87902633b541b04ad5ffc1c70f4c2feeeb13e607057Daniel Dunbar
88002633b541b04ad5ffc1c70f4c2feeeb13e607057Daniel Dunbar  ArgStringList CmdArgs;
88102633b541b04ad5ffc1c70f4c2feeeb13e607057Daniel Dunbar
88202633b541b04ad5ffc1c70f4c2feeeb13e607057Daniel Dunbar  // I'm not sure why this particular decomposition exists in gcc, but
88302633b541b04ad5ffc1c70f4c2feeeb13e607057Daniel Dunbar  // we follow suite for ease of comparison.
88402633b541b04ad5ffc1c70f4c2feeeb13e607057Daniel Dunbar  AddLinkArgs(Args, CmdArgs);
88502633b541b04ad5ffc1c70f4c2feeeb13e607057Daniel Dunbar
88602633b541b04ad5ffc1c70f4c2feeeb13e607057Daniel Dunbar  // FIXME: gcc has %{x} in here. How could this ever happen?  Cruft?
88702633b541b04ad5ffc1c70f4c2feeeb13e607057Daniel Dunbar  Args.AddAllArgs(CmdArgs, options::OPT_d_Flag);
88802633b541b04ad5ffc1c70f4c2feeeb13e607057Daniel Dunbar  Args.AddAllArgs(CmdArgs, options::OPT_s);
88902633b541b04ad5ffc1c70f4c2feeeb13e607057Daniel Dunbar  Args.AddAllArgs(CmdArgs, options::OPT_t);
89002633b541b04ad5ffc1c70f4c2feeeb13e607057Daniel Dunbar  Args.AddAllArgs(CmdArgs, options::OPT_Z_Flag);
89102633b541b04ad5ffc1c70f4c2feeeb13e607057Daniel Dunbar  Args.AddAllArgs(CmdArgs, options::OPT_u_Group);
89202633b541b04ad5ffc1c70f4c2feeeb13e607057Daniel Dunbar  Args.AddAllArgs(CmdArgs, options::OPT_A);
89302633b541b04ad5ffc1c70f4c2feeeb13e607057Daniel Dunbar  Args.AddLastArg(CmdArgs, options::OPT_e);
89402633b541b04ad5ffc1c70f4c2feeeb13e607057Daniel Dunbar  Args.AddAllArgs(CmdArgs, options::OPT_m_Separate);
89502633b541b04ad5ffc1c70f4c2feeeb13e607057Daniel Dunbar  Args.AddAllArgs(CmdArgs, options::OPT_r);
89602633b541b04ad5ffc1c70f4c2feeeb13e607057Daniel Dunbar
89702633b541b04ad5ffc1c70f4c2feeeb13e607057Daniel Dunbar  // FIXME: This is just being pedantically bug compatible, gcc
89802633b541b04ad5ffc1c70f4c2feeeb13e607057Daniel Dunbar  // doesn't *mean* to forward this, it just does (yay for pattern
89902633b541b04ad5ffc1c70f4c2feeeb13e607057Daniel Dunbar  // matching). It doesn't work, of course.
90002633b541b04ad5ffc1c70f4c2feeeb13e607057Daniel Dunbar  Args.AddAllArgs(CmdArgs, options::OPT_object);
90102633b541b04ad5ffc1c70f4c2feeeb13e607057Daniel Dunbar
90202633b541b04ad5ffc1c70f4c2feeeb13e607057Daniel Dunbar  CmdArgs.push_back("-o");
90302633b541b04ad5ffc1c70f4c2feeeb13e607057Daniel Dunbar  CmdArgs.push_back(Output.getFilename());
90402633b541b04ad5ffc1c70f4c2feeeb13e607057Daniel Dunbar
90502633b541b04ad5ffc1c70f4c2feeeb13e607057Daniel Dunbar  unsigned MacosxVersion[3];
90602633b541b04ad5ffc1c70f4c2feeeb13e607057Daniel Dunbar  if (Arg *A = Args.getLastArg(options::OPT_mmacosx_version_min_EQ)) {
90702633b541b04ad5ffc1c70f4c2feeeb13e607057Daniel Dunbar    bool HadExtra;
90802633b541b04ad5ffc1c70f4c2feeeb13e607057Daniel Dunbar    if (!Driver::GetReleaseVersion(A->getValue(Args), MacosxVersion[0],
90902633b541b04ad5ffc1c70f4c2feeeb13e607057Daniel Dunbar                                   MacosxVersion[1], MacosxVersion[2],
91002633b541b04ad5ffc1c70f4c2feeeb13e607057Daniel Dunbar                                   HadExtra) ||
91102633b541b04ad5ffc1c70f4c2feeeb13e607057Daniel Dunbar        HadExtra) {
91202633b541b04ad5ffc1c70f4c2feeeb13e607057Daniel Dunbar      const Driver &D = getToolChain().getHost().getDriver();
91302633b541b04ad5ffc1c70f4c2feeeb13e607057Daniel Dunbar      D.Diag(clang::diag::err_drv_invalid_version_number)
91402633b541b04ad5ffc1c70f4c2feeeb13e607057Daniel Dunbar        << A->getAsString(Args);
91502633b541b04ad5ffc1c70f4c2feeeb13e607057Daniel Dunbar    }
91602633b541b04ad5ffc1c70f4c2feeeb13e607057Daniel Dunbar  } else {
91702633b541b04ad5ffc1c70f4c2feeeb13e607057Daniel Dunbar    getDarwinToolChain().getMacosxVersion(MacosxVersion);
91802633b541b04ad5ffc1c70f4c2feeeb13e607057Daniel Dunbar  }
91902633b541b04ad5ffc1c70f4c2feeeb13e607057Daniel Dunbar
92002633b541b04ad5ffc1c70f4c2feeeb13e607057Daniel Dunbar  if (!Args.hasArg(options::OPT_A) &&
92102633b541b04ad5ffc1c70f4c2feeeb13e607057Daniel Dunbar      !Args.hasArg(options::OPT_nostdlib) &&
92202633b541b04ad5ffc1c70f4c2feeeb13e607057Daniel Dunbar      !Args.hasArg(options::OPT_nostartfiles)) {
92302633b541b04ad5ffc1c70f4c2feeeb13e607057Daniel Dunbar    // Derived from startfile spec.
92402633b541b04ad5ffc1c70f4c2feeeb13e607057Daniel Dunbar    if (Args.hasArg(options::OPT_dynamiclib)) {
92502633b541b04ad5ffc1c70f4c2feeeb13e607057Daniel Dunbar        // Derived from darwin_dylib1 spec.
92602633b541b04ad5ffc1c70f4c2feeeb13e607057Daniel Dunbar      if (Args.hasArg(options::OPT_miphoneos_version_min_EQ) ||
92702633b541b04ad5ffc1c70f4c2feeeb13e607057Daniel Dunbar          isMacosxVersionLT(MacosxVersion, 10, 5))
92802633b541b04ad5ffc1c70f4c2feeeb13e607057Daniel Dunbar        CmdArgs.push_back("-ldylib1.o");
92902633b541b04ad5ffc1c70f4c2feeeb13e607057Daniel Dunbar      else
93002633b541b04ad5ffc1c70f4c2feeeb13e607057Daniel Dunbar        CmdArgs.push_back("-ldylib1.10.5.o");
93102633b541b04ad5ffc1c70f4c2feeeb13e607057Daniel Dunbar    } else {
93202633b541b04ad5ffc1c70f4c2feeeb13e607057Daniel Dunbar      if (Args.hasArg(options::OPT_bundle)) {
93302633b541b04ad5ffc1c70f4c2feeeb13e607057Daniel Dunbar        if (!Args.hasArg(options::OPT_static))
93402633b541b04ad5ffc1c70f4c2feeeb13e607057Daniel Dunbar          CmdArgs.push_back("-lbundle1.o");
93502633b541b04ad5ffc1c70f4c2feeeb13e607057Daniel Dunbar      } else {
93602633b541b04ad5ffc1c70f4c2feeeb13e607057Daniel Dunbar        if (Args.hasArg(options::OPT_pg)) {
93702633b541b04ad5ffc1c70f4c2feeeb13e607057Daniel Dunbar          if (Args.hasArg(options::OPT_static) ||
93802633b541b04ad5ffc1c70f4c2feeeb13e607057Daniel Dunbar              Args.hasArg(options::OPT_object) ||
93902633b541b04ad5ffc1c70f4c2feeeb13e607057Daniel Dunbar              Args.hasArg(options::OPT_preload)) {
94002633b541b04ad5ffc1c70f4c2feeeb13e607057Daniel Dunbar            CmdArgs.push_back("-lgcrt0.o");
94102633b541b04ad5ffc1c70f4c2feeeb13e607057Daniel Dunbar          } else {
94202633b541b04ad5ffc1c70f4c2feeeb13e607057Daniel Dunbar            CmdArgs.push_back("-lgcrt1.o");
94302633b541b04ad5ffc1c70f4c2feeeb13e607057Daniel Dunbar
94402633b541b04ad5ffc1c70f4c2feeeb13e607057Daniel Dunbar            // darwin_crt2 spec is empty.
94502633b541b04ad5ffc1c70f4c2feeeb13e607057Daniel Dunbar          }
94602633b541b04ad5ffc1c70f4c2feeeb13e607057Daniel Dunbar        } else {
94702633b541b04ad5ffc1c70f4c2feeeb13e607057Daniel Dunbar          if (Args.hasArg(options::OPT_static) ||
94802633b541b04ad5ffc1c70f4c2feeeb13e607057Daniel Dunbar              Args.hasArg(options::OPT_object) ||
94902633b541b04ad5ffc1c70f4c2feeeb13e607057Daniel Dunbar              Args.hasArg(options::OPT_preload)) {
95002633b541b04ad5ffc1c70f4c2feeeb13e607057Daniel Dunbar            CmdArgs.push_back("-lcrt0.o");
95102633b541b04ad5ffc1c70f4c2feeeb13e607057Daniel Dunbar          } else {
95202633b541b04ad5ffc1c70f4c2feeeb13e607057Daniel Dunbar            // Derived from darwin_crt1 spec.
95302633b541b04ad5ffc1c70f4c2feeeb13e607057Daniel Dunbar            if (Args.hasArg(options::OPT_miphoneos_version_min_EQ) ||
95402633b541b04ad5ffc1c70f4c2feeeb13e607057Daniel Dunbar                isMacosxVersionLT(MacosxVersion, 10, 5)) {
95502633b541b04ad5ffc1c70f4c2feeeb13e607057Daniel Dunbar              CmdArgs.push_back("-lcrt1.o");
95602633b541b04ad5ffc1c70f4c2feeeb13e607057Daniel Dunbar            } else {
95702633b541b04ad5ffc1c70f4c2feeeb13e607057Daniel Dunbar              CmdArgs.push_back("-lcrt1.10.5.o");
95802633b541b04ad5ffc1c70f4c2feeeb13e607057Daniel Dunbar
95902633b541b04ad5ffc1c70f4c2feeeb13e607057Daniel Dunbar              // darwin_crt2 spec is empty.
96002633b541b04ad5ffc1c70f4c2feeeb13e607057Daniel Dunbar            }
96102633b541b04ad5ffc1c70f4c2feeeb13e607057Daniel Dunbar          }
96202633b541b04ad5ffc1c70f4c2feeeb13e607057Daniel Dunbar        }
96302633b541b04ad5ffc1c70f4c2feeeb13e607057Daniel Dunbar      }
96402633b541b04ad5ffc1c70f4c2feeeb13e607057Daniel Dunbar    }
96502633b541b04ad5ffc1c70f4c2feeeb13e607057Daniel Dunbar
96602633b541b04ad5ffc1c70f4c2feeeb13e607057Daniel Dunbar    if (Args.hasArg(options::OPT_shared_libgcc) &&
96702633b541b04ad5ffc1c70f4c2feeeb13e607057Daniel Dunbar        !Args.hasArg(options::OPT_miphoneos_version_min_EQ) &&
96802633b541b04ad5ffc1c70f4c2feeeb13e607057Daniel Dunbar        isMacosxVersionLT(MacosxVersion, 10, 5)) {
96902633b541b04ad5ffc1c70f4c2feeeb13e607057Daniel Dunbar      const char *Str = getToolChain().GetFilePath(C, "crt3.o").c_str();
97002633b541b04ad5ffc1c70f4c2feeeb13e607057Daniel Dunbar      CmdArgs.push_back(Args.MakeArgString(Str));
97102633b541b04ad5ffc1c70f4c2feeeb13e607057Daniel Dunbar    }
97202633b541b04ad5ffc1c70f4c2feeeb13e607057Daniel Dunbar  }
97302633b541b04ad5ffc1c70f4c2feeeb13e607057Daniel Dunbar
97402633b541b04ad5ffc1c70f4c2feeeb13e607057Daniel Dunbar  Args.AddAllArgs(CmdArgs, options::OPT_L);
97502633b541b04ad5ffc1c70f4c2feeeb13e607057Daniel Dunbar
97602633b541b04ad5ffc1c70f4c2feeeb13e607057Daniel Dunbar  if (Args.hasArg(options::OPT_fopenmp))
97702633b541b04ad5ffc1c70f4c2feeeb13e607057Daniel Dunbar    // This is more complicated in gcc...
97802633b541b04ad5ffc1c70f4c2feeeb13e607057Daniel Dunbar    CmdArgs.push_back("-lgomp");
97902633b541b04ad5ffc1c70f4c2feeeb13e607057Daniel Dunbar
98002633b541b04ad5ffc1c70f4c2feeeb13e607057Daniel Dunbar  // FIXME: Derive these correctly.
98102633b541b04ad5ffc1c70f4c2feeeb13e607057Daniel Dunbar  const char *TCDir = getDarwinToolChain().getToolChainDir().c_str();
98202633b541b04ad5ffc1c70f4c2feeeb13e607057Daniel Dunbar  if (getToolChain().getArchName() == "x86_64") {
98302633b541b04ad5ffc1c70f4c2feeeb13e607057Daniel Dunbar    CmdArgs.push_back(MakeFormattedString(Args,
98402633b541b04ad5ffc1c70f4c2feeeb13e607057Daniel Dunbar                              llvm::format("-L/usr/lib/gcc/%s/x86_64", TCDir)));
98502633b541b04ad5ffc1c70f4c2feeeb13e607057Daniel Dunbar    // Intentionally duplicated for (temporary) gcc bug compatibility.
98602633b541b04ad5ffc1c70f4c2feeeb13e607057Daniel Dunbar    CmdArgs.push_back(MakeFormattedString(Args,
98702633b541b04ad5ffc1c70f4c2feeeb13e607057Daniel Dunbar                              llvm::format("-L/usr/lib/gcc/%s/x86_64", TCDir)));
98802633b541b04ad5ffc1c70f4c2feeeb13e607057Daniel Dunbar  }
98902633b541b04ad5ffc1c70f4c2feeeb13e607057Daniel Dunbar  CmdArgs.push_back(MakeFormattedString(Args,
99002633b541b04ad5ffc1c70f4c2feeeb13e607057Daniel Dunbar                                        llvm::format("-L/usr/lib/%s", TCDir)));
99102633b541b04ad5ffc1c70f4c2feeeb13e607057Daniel Dunbar  CmdArgs.push_back(MakeFormattedString(Args,
99202633b541b04ad5ffc1c70f4c2feeeb13e607057Daniel Dunbar                                     llvm::format("-L/usr/lib/gcc/%s", TCDir)));
99302633b541b04ad5ffc1c70f4c2feeeb13e607057Daniel Dunbar  // Intentionally duplicated for (temporary) gcc bug compatibility.
99402633b541b04ad5ffc1c70f4c2feeeb13e607057Daniel Dunbar  CmdArgs.push_back(MakeFormattedString(Args,
99502633b541b04ad5ffc1c70f4c2feeeb13e607057Daniel Dunbar                                     llvm::format("-L/usr/lib/gcc/%s", TCDir)));
99602633b541b04ad5ffc1c70f4c2feeeb13e607057Daniel Dunbar  CmdArgs.push_back(MakeFormattedString(Args,
99702633b541b04ad5ffc1c70f4c2feeeb13e607057Daniel Dunbar                  llvm::format("-L/usr/lib/gcc/%s/../../../%s", TCDir, TCDir)));
99802633b541b04ad5ffc1c70f4c2feeeb13e607057Daniel Dunbar  CmdArgs.push_back(MakeFormattedString(Args,
99902633b541b04ad5ffc1c70f4c2feeeb13e607057Daniel Dunbar                            llvm::format("-L/usr/lib/gcc/%s/../../..", TCDir)));
100002633b541b04ad5ffc1c70f4c2feeeb13e607057Daniel Dunbar
100102633b541b04ad5ffc1c70f4c2feeeb13e607057Daniel Dunbar  for (InputInfoList::const_iterator
100202633b541b04ad5ffc1c70f4c2feeeb13e607057Daniel Dunbar         it = Inputs.begin(), ie = Inputs.end(); it != ie; ++it) {
100302633b541b04ad5ffc1c70f4c2feeeb13e607057Daniel Dunbar    const InputInfo &II = *it;
100402633b541b04ad5ffc1c70f4c2feeeb13e607057Daniel Dunbar    if (II.isFilename())
100502633b541b04ad5ffc1c70f4c2feeeb13e607057Daniel Dunbar      CmdArgs.push_back(II.getFilename());
100602633b541b04ad5ffc1c70f4c2feeeb13e607057Daniel Dunbar    else
100702633b541b04ad5ffc1c70f4c2feeeb13e607057Daniel Dunbar      II.getInputArg().renderAsInput(Args, CmdArgs);
100802633b541b04ad5ffc1c70f4c2feeeb13e607057Daniel Dunbar  }
100902633b541b04ad5ffc1c70f4c2feeeb13e607057Daniel Dunbar
101002633b541b04ad5ffc1c70f4c2feeeb13e607057Daniel Dunbar  if (LinkingOutput) {
101102633b541b04ad5ffc1c70f4c2feeeb13e607057Daniel Dunbar    CmdArgs.push_back("-arch_multiple");
101202633b541b04ad5ffc1c70f4c2feeeb13e607057Daniel Dunbar    CmdArgs.push_back("-final_output");
101302633b541b04ad5ffc1c70f4c2feeeb13e607057Daniel Dunbar    CmdArgs.push_back(LinkingOutput);
101402633b541b04ad5ffc1c70f4c2feeeb13e607057Daniel Dunbar  }
101502633b541b04ad5ffc1c70f4c2feeeb13e607057Daniel Dunbar
101602633b541b04ad5ffc1c70f4c2feeeb13e607057Daniel Dunbar  if (Args.hasArg(options::OPT_fprofile_arcs) ||
101702633b541b04ad5ffc1c70f4c2feeeb13e607057Daniel Dunbar      Args.hasArg(options::OPT_fprofile_generate) ||
101802633b541b04ad5ffc1c70f4c2feeeb13e607057Daniel Dunbar      Args.hasArg(options::OPT_fcreate_profile) ||
101902633b541b04ad5ffc1c70f4c2feeeb13e607057Daniel Dunbar      Args.hasArg(options::OPT_coverage))
102002633b541b04ad5ffc1c70f4c2feeeb13e607057Daniel Dunbar    CmdArgs.push_back("-lgcov");
102102633b541b04ad5ffc1c70f4c2feeeb13e607057Daniel Dunbar
102202633b541b04ad5ffc1c70f4c2feeeb13e607057Daniel Dunbar  if (Args.hasArg(options::OPT_fnested_functions))
102302633b541b04ad5ffc1c70f4c2feeeb13e607057Daniel Dunbar    CmdArgs.push_back("-allow_stack_execute");
102402633b541b04ad5ffc1c70f4c2feeeb13e607057Daniel Dunbar
102502633b541b04ad5ffc1c70f4c2feeeb13e607057Daniel Dunbar  if (!Args.hasArg(options::OPT_nostdlib) &&
102602633b541b04ad5ffc1c70f4c2feeeb13e607057Daniel Dunbar      !Args.hasArg(options::OPT_nodefaultlibs)) {
102702633b541b04ad5ffc1c70f4c2feeeb13e607057Daniel Dunbar    // link_ssp spec is empty.
102802633b541b04ad5ffc1c70f4c2feeeb13e607057Daniel Dunbar
102902633b541b04ad5ffc1c70f4c2feeeb13e607057Daniel Dunbar    // Derived from libgcc spec.
103002633b541b04ad5ffc1c70f4c2feeeb13e607057Daniel Dunbar    if (Args.hasArg(options::OPT_static)) {
103102633b541b04ad5ffc1c70f4c2feeeb13e607057Daniel Dunbar      CmdArgs.push_back("-lgcc_static");
103202633b541b04ad5ffc1c70f4c2feeeb13e607057Daniel Dunbar    } else if (Args.hasArg(options::OPT_static_libgcc)) {
103302633b541b04ad5ffc1c70f4c2feeeb13e607057Daniel Dunbar      CmdArgs.push_back("-lgcc_eh");
103402633b541b04ad5ffc1c70f4c2feeeb13e607057Daniel Dunbar      CmdArgs.push_back("-lgcc");
103502633b541b04ad5ffc1c70f4c2feeeb13e607057Daniel Dunbar    } else if (Args.hasArg(options::OPT_miphoneos_version_min_EQ)) {
103602633b541b04ad5ffc1c70f4c2feeeb13e607057Daniel Dunbar      // Derived from darwin_iphoneos_libgcc spec.
103702633b541b04ad5ffc1c70f4c2feeeb13e607057Daniel Dunbar      CmdArgs.push_back("-lgcc_s.10.5");
103802633b541b04ad5ffc1c70f4c2feeeb13e607057Daniel Dunbar      CmdArgs.push_back("-lgcc");
103902633b541b04ad5ffc1c70f4c2feeeb13e607057Daniel Dunbar    } else if (Args.hasArg(options::OPT_shared_libgcc) ||
104002633b541b04ad5ffc1c70f4c2feeeb13e607057Daniel Dunbar               Args.hasArg(options::OPT_fexceptions) ||
104102633b541b04ad5ffc1c70f4c2feeeb13e607057Daniel Dunbar               Args.hasArg(options::OPT_fgnu_runtime)) {
104202633b541b04ad5ffc1c70f4c2feeeb13e607057Daniel Dunbar      if (isMacosxVersionLT(MacosxVersion, 10, 5))
104302633b541b04ad5ffc1c70f4c2feeeb13e607057Daniel Dunbar        CmdArgs.push_back("-lgcc_s.10.4");
104402633b541b04ad5ffc1c70f4c2feeeb13e607057Daniel Dunbar      else
104502633b541b04ad5ffc1c70f4c2feeeb13e607057Daniel Dunbar        CmdArgs.push_back("-lgcc_s.10.5");
104602633b541b04ad5ffc1c70f4c2feeeb13e607057Daniel Dunbar      CmdArgs.push_back("-lgcc");
104702633b541b04ad5ffc1c70f4c2feeeb13e607057Daniel Dunbar    } else {
104802633b541b04ad5ffc1c70f4c2feeeb13e607057Daniel Dunbar      if (isMacosxVersionLT(MacosxVersion, 10, 5) &&
104902633b541b04ad5ffc1c70f4c2feeeb13e607057Daniel Dunbar          isMacosxVersionGTE(MacosxVersion, 10, 3, 9))
105002633b541b04ad5ffc1c70f4c2feeeb13e607057Daniel Dunbar        CmdArgs.push_back("-lgcc_s.10.4");
105102633b541b04ad5ffc1c70f4c2feeeb13e607057Daniel Dunbar      if (isMacosxVersionGTE(MacosxVersion, 10, 5))
105202633b541b04ad5ffc1c70f4c2feeeb13e607057Daniel Dunbar        CmdArgs.push_back("-lgcc_s.10.5");
105302633b541b04ad5ffc1c70f4c2feeeb13e607057Daniel Dunbar      CmdArgs.push_back("-lgcc");
105402633b541b04ad5ffc1c70f4c2feeeb13e607057Daniel Dunbar    }
105502633b541b04ad5ffc1c70f4c2feeeb13e607057Daniel Dunbar
105602633b541b04ad5ffc1c70f4c2feeeb13e607057Daniel Dunbar    // Derived from lib spec.
105702633b541b04ad5ffc1c70f4c2feeeb13e607057Daniel Dunbar    if (!Args.hasArg(options::OPT_static))
105802633b541b04ad5ffc1c70f4c2feeeb13e607057Daniel Dunbar      CmdArgs.push_back("-lSystem");
105902633b541b04ad5ffc1c70f4c2feeeb13e607057Daniel Dunbar  }
106002633b541b04ad5ffc1c70f4c2feeeb13e607057Daniel Dunbar
106102633b541b04ad5ffc1c70f4c2feeeb13e607057Daniel Dunbar  if (!Args.hasArg(options::OPT_A) &&
106202633b541b04ad5ffc1c70f4c2feeeb13e607057Daniel Dunbar      !Args.hasArg(options::OPT_nostdlib) &&
106302633b541b04ad5ffc1c70f4c2feeeb13e607057Daniel Dunbar      !Args.hasArg(options::OPT_nostartfiles)) {
106402633b541b04ad5ffc1c70f4c2feeeb13e607057Daniel Dunbar    // endfile_spec is empty.
106502633b541b04ad5ffc1c70f4c2feeeb13e607057Daniel Dunbar  }
106602633b541b04ad5ffc1c70f4c2feeeb13e607057Daniel Dunbar
106702633b541b04ad5ffc1c70f4c2feeeb13e607057Daniel Dunbar  Args.AddAllArgs(CmdArgs, options::OPT_T_Group);
106802633b541b04ad5ffc1c70f4c2feeeb13e607057Daniel Dunbar  Args.AddAllArgs(CmdArgs, options::OPT_F);
106902633b541b04ad5ffc1c70f4c2feeeb13e607057Daniel Dunbar
107002633b541b04ad5ffc1c70f4c2feeeb13e607057Daniel Dunbar  const char *Exec =
107102633b541b04ad5ffc1c70f4c2feeeb13e607057Daniel Dunbar    Args.MakeArgString(getToolChain().GetProgramPath(C, "collect2").c_str());
107202633b541b04ad5ffc1c70f4c2feeeb13e607057Daniel Dunbar  Dest.addCommand(new Command(Exec, CmdArgs));
107302633b541b04ad5ffc1c70f4c2feeeb13e607057Daniel Dunbar
107402633b541b04ad5ffc1c70f4c2feeeb13e607057Daniel Dunbar  if (Args.getLastArg(options::OPT_g_Group) &&
107502633b541b04ad5ffc1c70f4c2feeeb13e607057Daniel Dunbar      !Args.getLastArg(options::OPT_gstabs) &&
107602633b541b04ad5ffc1c70f4c2feeeb13e607057Daniel Dunbar      !Args.getLastArg(options::OPT_g0)) {
107702633b541b04ad5ffc1c70f4c2feeeb13e607057Daniel Dunbar    // FIXME: This is gross, but matches gcc. The test only considers
107802633b541b04ad5ffc1c70f4c2feeeb13e607057Daniel Dunbar    // the suffix (not the -x type), and then only of the first
107902633b541b04ad5ffc1c70f4c2feeeb13e607057Daniel Dunbar    // input. Awesome.
108002633b541b04ad5ffc1c70f4c2feeeb13e607057Daniel Dunbar    const char *Suffix = strchr(Inputs[0].getBaseInput(), '.');
108102633b541b04ad5ffc1c70f4c2feeeb13e607057Daniel Dunbar    if (Suffix && isSourceSuffix(Suffix + 1)) {
108202633b541b04ad5ffc1c70f4c2feeeb13e607057Daniel Dunbar      const char *Exec =
108302633b541b04ad5ffc1c70f4c2feeeb13e607057Daniel Dunbar       Args.MakeArgString(getToolChain().GetProgramPath(C, "dsymutil").c_str());
108402633b541b04ad5ffc1c70f4c2feeeb13e607057Daniel Dunbar      ArgStringList CmdArgs;
108502633b541b04ad5ffc1c70f4c2feeeb13e607057Daniel Dunbar      CmdArgs.push_back(Output.getFilename());
108602633b541b04ad5ffc1c70f4c2feeeb13e607057Daniel Dunbar      C.getJobs().addCommand(new Command(Exec, CmdArgs));
108702633b541b04ad5ffc1c70f4c2feeeb13e607057Daniel Dunbar    }
108802633b541b04ad5ffc1c70f4c2feeeb13e607057Daniel Dunbar  }
108902633b541b04ad5ffc1c70f4c2feeeb13e607057Daniel Dunbar}
109002633b541b04ad5ffc1c70f4c2feeeb13e607057Daniel Dunbar
1091ff7488dc9a766f94daf54d81b03ab9160d0bfd88Daniel Dunbarvoid darwin::Lipo::ConstructJob(Compilation &C, const JobAction &JA,
10928cac5f7e1ce63dd77ee0fb4ef68f9fa804f41ea6Daniel Dunbar                                Job &Dest, const InputInfo &Output,
1093ff7488dc9a766f94daf54d81b03ab9160d0bfd88Daniel Dunbar                                const InputInfoList &Inputs,
1094ff7488dc9a766f94daf54d81b03ab9160d0bfd88Daniel Dunbar                                const ArgList &Args,
1095ff7488dc9a766f94daf54d81b03ab9160d0bfd88Daniel Dunbar                                const char *LinkingOutput) const {
1096ff7488dc9a766f94daf54d81b03ab9160d0bfd88Daniel Dunbar  ArgStringList CmdArgs;
1097ff7488dc9a766f94daf54d81b03ab9160d0bfd88Daniel Dunbar
1098ff7488dc9a766f94daf54d81b03ab9160d0bfd88Daniel Dunbar  CmdArgs.push_back("-create");
1099ff7488dc9a766f94daf54d81b03ab9160d0bfd88Daniel Dunbar  assert(Output.isFilename() && "Unexpected lipo output.");
1100a428df828ea4cc6916ea90dcd9fbbc840776d207Daniel Dunbar
1101a428df828ea4cc6916ea90dcd9fbbc840776d207Daniel Dunbar  CmdArgs.push_back("-output");
1102ff7488dc9a766f94daf54d81b03ab9160d0bfd88Daniel Dunbar  CmdArgs.push_back(Output.getFilename());
1103a428df828ea4cc6916ea90dcd9fbbc840776d207Daniel Dunbar
1104ff7488dc9a766f94daf54d81b03ab9160d0bfd88Daniel Dunbar  for (InputInfoList::const_iterator
1105ff7488dc9a766f94daf54d81b03ab9160d0bfd88Daniel Dunbar         it = Inputs.begin(), ie = Inputs.end(); it != ie; ++it) {
1106ff7488dc9a766f94daf54d81b03ab9160d0bfd88Daniel Dunbar    const InputInfo &II = *it;
1107ff7488dc9a766f94daf54d81b03ab9160d0bfd88Daniel Dunbar    assert(II.isFilename() && "Unexpected lipo input.");
1108ff7488dc9a766f94daf54d81b03ab9160d0bfd88Daniel Dunbar    CmdArgs.push_back(II.getFilename());
1109ff7488dc9a766f94daf54d81b03ab9160d0bfd88Daniel Dunbar  }
1110ff7488dc9a766f94daf54d81b03ab9160d0bfd88Daniel Dunbar  const char *Exec =
1111ff7488dc9a766f94daf54d81b03ab9160d0bfd88Daniel Dunbar    Args.MakeArgString(getToolChain().GetProgramPath(C, "lipo").c_str());
1112ff7488dc9a766f94daf54d81b03ab9160d0bfd88Daniel Dunbar  Dest.addCommand(new Command(Exec, CmdArgs));
1113ff7488dc9a766f94daf54d81b03ab9160d0bfd88Daniel Dunbar}
1114