Tools.cpp revision 78d8a089c8f124ba6f47bb37e2c4a36986f60e23
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
42077ba6a3ac3628afb0d3c460e81ce013bccbdbedDaniel Dunbar  assert(Inputs.size() == 1 && "Unable to handle multiple inputs.");
43077ba6a3ac3628afb0d3c460e81ce013bccbdbedDaniel Dunbar
44af07f936b698575f2c91f1c1134c116f1ef0deddDaniel Dunbar  CmdArgs.push_back("-triple");
45af07f936b698575f2c91f1c1134c116f1ef0deddDaniel Dunbar  const char *TripleStr =
46af07f936b698575f2c91f1c1134c116f1ef0deddDaniel Dunbar    Args.MakeArgString(getToolChain().getTripleString().c_str());
47af07f936b698575f2c91f1c1134c116f1ef0deddDaniel Dunbar  CmdArgs.push_back(TripleStr);
48af07f936b698575f2c91f1c1134c116f1ef0deddDaniel Dunbar
491d46033f760ba5fd266ce59fe391fac473f04f52Daniel Dunbar  if (isa<AnalyzeJobAction>(JA)) {
501d46033f760ba5fd266ce59fe391fac473f04f52Daniel Dunbar    assert(JA.getType() == types::TY_Plist && "Invalid output type.");
511d46033f760ba5fd266ce59fe391fac473f04f52Daniel Dunbar    CmdArgs.push_back("-analyze");
521d46033f760ba5fd266ce59fe391fac473f04f52Daniel Dunbar  } else if (isa<PreprocessJobAction>(JA)) {
53cd8e4c44dd068956e9181381be3ee2d49a0fac52Daniel Dunbar    if (Output.getType() == types::TY_Dependencies)
54cd8e4c44dd068956e9181381be3ee2d49a0fac52Daniel Dunbar      CmdArgs.push_back("-Eonly");
55cd8e4c44dd068956e9181381be3ee2d49a0fac52Daniel Dunbar    else
56cd8e4c44dd068956e9181381be3ee2d49a0fac52Daniel Dunbar      CmdArgs.push_back("-E");
571d46033f760ba5fd266ce59fe391fac473f04f52Daniel Dunbar  } else if (isa<PrecompileJobAction>(JA)) {
58bb71b392729b86858ee861b967006a03c07c41f2Daniel Dunbar    CmdArgs.push_back("-emit-pth");
591d46033f760ba5fd266ce59fe391fac473f04f52Daniel Dunbar  } else {
601d46033f760ba5fd266ce59fe391fac473f04f52Daniel Dunbar    assert(isa<CompileJobAction>(JA) && "Invalid action for clang tool.");
611d46033f760ba5fd266ce59fe391fac473f04f52Daniel Dunbar
621d46033f760ba5fd266ce59fe391fac473f04f52Daniel Dunbar    if (JA.getType() == types::TY_Nothing) {
631d46033f760ba5fd266ce59fe391fac473f04f52Daniel Dunbar      CmdArgs.push_back("-fsyntax-only");
641d46033f760ba5fd266ce59fe391fac473f04f52Daniel Dunbar    } else if (JA.getType() == types::TY_LLVMAsm) {
651d46033f760ba5fd266ce59fe391fac473f04f52Daniel Dunbar      CmdArgs.push_back("-emit-llvm");
661d46033f760ba5fd266ce59fe391fac473f04f52Daniel Dunbar    } else if (JA.getType() == types::TY_LLVMBC) {
671d46033f760ba5fd266ce59fe391fac473f04f52Daniel Dunbar      CmdArgs.push_back("-emit-llvm-bc");
681d46033f760ba5fd266ce59fe391fac473f04f52Daniel Dunbar    } else if (JA.getType() == types::TY_PP_Asm) {
691d46033f760ba5fd266ce59fe391fac473f04f52Daniel Dunbar      CmdArgs.push_back("-S");
701d46033f760ba5fd266ce59fe391fac473f04f52Daniel Dunbar    }
711d46033f760ba5fd266ce59fe391fac473f04f52Daniel Dunbar  }
721d46033f760ba5fd266ce59fe391fac473f04f52Daniel Dunbar
731d46033f760ba5fd266ce59fe391fac473f04f52Daniel Dunbar  // The make clang go fast button.
741d46033f760ba5fd266ce59fe391fac473f04f52Daniel Dunbar  CmdArgs.push_back("-disable-free");
751d46033f760ba5fd266ce59fe391fac473f04f52Daniel Dunbar
761d46033f760ba5fd266ce59fe391fac473f04f52Daniel Dunbar  if (isa<AnalyzeJobAction>(JA)) {
771d46033f760ba5fd266ce59fe391fac473f04f52Daniel Dunbar    // Add default argument set.
781d46033f760ba5fd266ce59fe391fac473f04f52Daniel Dunbar    //
791d46033f760ba5fd266ce59fe391fac473f04f52Daniel Dunbar    // FIXME: Move into clang?
801d46033f760ba5fd266ce59fe391fac473f04f52Daniel Dunbar    CmdArgs.push_back("-warn-dead-stores");
811d46033f760ba5fd266ce59fe391fac473f04f52Daniel Dunbar    CmdArgs.push_back("-checker-cfref");
829b646dac1c05fbfbfb4db0cb88ea28e74fbe7b9aTed Kremenek    CmdArgs.push_back("-analyzer-eagerly-assume");
831d46033f760ba5fd266ce59fe391fac473f04f52Daniel Dunbar    CmdArgs.push_back("-warn-objc-methodsigs");
841d46033f760ba5fd266ce59fe391fac473f04f52Daniel Dunbar    // Do not enable the missing -dealloc check.
851d46033f760ba5fd266ce59fe391fac473f04f52Daniel Dunbar    // '-warn-objc-missing-dealloc',
861d46033f760ba5fd266ce59fe391fac473f04f52Daniel Dunbar    CmdArgs.push_back("-warn-objc-unused-ivars");
871d46033f760ba5fd266ce59fe391fac473f04f52Daniel Dunbar
881d46033f760ba5fd266ce59fe391fac473f04f52Daniel Dunbar    CmdArgs.push_back("-analyzer-output=plist");
891d46033f760ba5fd266ce59fe391fac473f04f52Daniel Dunbar
901d46033f760ba5fd266ce59fe391fac473f04f52Daniel Dunbar    // Add -Xanalyzer arguments when running as analyzer.
911d46033f760ba5fd266ce59fe391fac473f04f52Daniel Dunbar    Args.AddAllArgValues(CmdArgs, options::OPT_Xanalyzer);
921d46033f760ba5fd266ce59fe391fac473f04f52Daniel Dunbar  } else {
931d46033f760ba5fd266ce59fe391fac473f04f52Daniel Dunbar    // Perform argument translation for LLVM backend. This
941d46033f760ba5fd266ce59fe391fac473f04f52Daniel Dunbar    // takes some care in reconciling with llvm-gcc. The
951d46033f760ba5fd266ce59fe391fac473f04f52Daniel Dunbar    // issue is that llvm-gcc translates these options based on
961d46033f760ba5fd266ce59fe391fac473f04f52Daniel Dunbar    // the values in cc1, whereas we are processing based on
971d46033f760ba5fd266ce59fe391fac473f04f52Daniel Dunbar    // the driver arguments.
981d46033f760ba5fd266ce59fe391fac473f04f52Daniel Dunbar    //
991d46033f760ba5fd266ce59fe391fac473f04f52Daniel Dunbar    // FIXME: This is currently broken for -f flags when -fno
1001d46033f760ba5fd266ce59fe391fac473f04f52Daniel Dunbar    // variants are present.
1011d46033f760ba5fd266ce59fe391fac473f04f52Daniel Dunbar
1021d46033f760ba5fd266ce59fe391fac473f04f52Daniel Dunbar    // This comes from the default translation the driver + cc1
1031d46033f760ba5fd266ce59fe391fac473f04f52Daniel Dunbar    // would do to enable flag_pic.
1041d46033f760ba5fd266ce59fe391fac473f04f52Daniel Dunbar    //
1051d46033f760ba5fd266ce59fe391fac473f04f52Daniel Dunbar    // FIXME: Centralize this code.
1061d46033f760ba5fd266ce59fe391fac473f04f52Daniel Dunbar    bool PICEnabled = (Args.hasArg(options::OPT_fPIC) ||
1071d46033f760ba5fd266ce59fe391fac473f04f52Daniel Dunbar                       Args.hasArg(options::OPT_fpic) ||
1081d46033f760ba5fd266ce59fe391fac473f04f52Daniel Dunbar                       Args.hasArg(options::OPT_fPIE) ||
1091d46033f760ba5fd266ce59fe391fac473f04f52Daniel Dunbar                       Args.hasArg(options::OPT_fpie));
1101d46033f760ba5fd266ce59fe391fac473f04f52Daniel Dunbar    bool PICDisabled = (Args.hasArg(options::OPT_mkernel) ||
1111d46033f760ba5fd266ce59fe391fac473f04f52Daniel Dunbar                        Args.hasArg(options::OPT_static));
1121d46033f760ba5fd266ce59fe391fac473f04f52Daniel Dunbar    const char *Model = getToolChain().GetForcedPicModel();
1131d46033f760ba5fd266ce59fe391fac473f04f52Daniel Dunbar    if (!Model) {
1141d46033f760ba5fd266ce59fe391fac473f04f52Daniel Dunbar      if (Args.hasArg(options::OPT_mdynamic_no_pic))
1151d46033f760ba5fd266ce59fe391fac473f04f52Daniel Dunbar        Model = "dynamic-no-pic";
1161d46033f760ba5fd266ce59fe391fac473f04f52Daniel Dunbar      else if (PICDisabled)
1171d46033f760ba5fd266ce59fe391fac473f04f52Daniel Dunbar        Model = "static";
1181d46033f760ba5fd266ce59fe391fac473f04f52Daniel Dunbar      else if (PICEnabled)
1191d46033f760ba5fd266ce59fe391fac473f04f52Daniel Dunbar        Model = "pic";
1201d46033f760ba5fd266ce59fe391fac473f04f52Daniel Dunbar      else
1211d46033f760ba5fd266ce59fe391fac473f04f52Daniel Dunbar        Model = getToolChain().GetDefaultRelocationModel();
1221d46033f760ba5fd266ce59fe391fac473f04f52Daniel Dunbar    }
1231d46033f760ba5fd266ce59fe391fac473f04f52Daniel Dunbar    CmdArgs.push_back("--relocation-model");
1241d46033f760ba5fd266ce59fe391fac473f04f52Daniel Dunbar    CmdArgs.push_back(Model);
1251d46033f760ba5fd266ce59fe391fac473f04f52Daniel Dunbar
1261d46033f760ba5fd266ce59fe391fac473f04f52Daniel Dunbar    if (Args.hasArg(options::OPT_ftime_report))
1271d46033f760ba5fd266ce59fe391fac473f04f52Daniel Dunbar      CmdArgs.push_back("--time-passes");
1281d46033f760ba5fd266ce59fe391fac473f04f52Daniel Dunbar    // FIXME: Set --enable-unsafe-fp-math.
1291d46033f760ba5fd266ce59fe391fac473f04f52Daniel Dunbar    if (!Args.hasArg(options::OPT_fomit_frame_pointer))
1301d46033f760ba5fd266ce59fe391fac473f04f52Daniel Dunbar      CmdArgs.push_back("--disable-fp-elim");
1311d46033f760ba5fd266ce59fe391fac473f04f52Daniel Dunbar    if (!Args.hasFlag(options::OPT_fzero_initialized_in_bss,
1321d46033f760ba5fd266ce59fe391fac473f04f52Daniel Dunbar                      options::OPT_fno_zero_initialized_in_bss,
1331d46033f760ba5fd266ce59fe391fac473f04f52Daniel Dunbar                      true))
1341d46033f760ba5fd266ce59fe391fac473f04f52Daniel Dunbar      CmdArgs.push_back("--nozero-initialized-in-bss");
135b3fd500a1c486e9fb82d82e28828ead025462aebDaniel Dunbar    if (Args.hasArg(options::OPT_dA) || Args.hasArg(options::OPT_fverbose_asm))
1361d46033f760ba5fd266ce59fe391fac473f04f52Daniel Dunbar      CmdArgs.push_back("--asm-verbose");
1371d46033f760ba5fd266ce59fe391fac473f04f52Daniel Dunbar    if (Args.hasArg(options::OPT_fdebug_pass_structure))
1381d46033f760ba5fd266ce59fe391fac473f04f52Daniel Dunbar      CmdArgs.push_back("--debug-pass=Structure");
1391d46033f760ba5fd266ce59fe391fac473f04f52Daniel Dunbar    if (Args.hasArg(options::OPT_fdebug_pass_arguments))
1401d46033f760ba5fd266ce59fe391fac473f04f52Daniel Dunbar      CmdArgs.push_back("--debug-pass=Arguments");
1411d46033f760ba5fd266ce59fe391fac473f04f52Daniel Dunbar    // FIXME: set --inline-threshhold=50 if (optimize_size || optimize
1421d46033f760ba5fd266ce59fe391fac473f04f52Daniel Dunbar    // < 3)
1431d46033f760ba5fd266ce59fe391fac473f04f52Daniel Dunbar    if (Args.hasFlag(options::OPT_funwind_tables,
1441d46033f760ba5fd266ce59fe391fac473f04f52Daniel Dunbar                      options::OPT_fno_unwind_tables,
1451d46033f760ba5fd266ce59fe391fac473f04f52Daniel Dunbar                      getToolChain().IsUnwindTablesDefault()))
1461d46033f760ba5fd266ce59fe391fac473f04f52Daniel Dunbar      CmdArgs.push_back("--unwind-tables=1");
1471d46033f760ba5fd266ce59fe391fac473f04f52Daniel Dunbar    else
1481d46033f760ba5fd266ce59fe391fac473f04f52Daniel Dunbar      CmdArgs.push_back("--unwind-tables=0");
1491d46033f760ba5fd266ce59fe391fac473f04f52Daniel Dunbar    if (!Args.hasFlag(options::OPT_mred_zone,
1501d46033f760ba5fd266ce59fe391fac473f04f52Daniel Dunbar                       options::OPT_mno_red_zone,
1511d46033f760ba5fd266ce59fe391fac473f04f52Daniel Dunbar                       true))
1521d46033f760ba5fd266ce59fe391fac473f04f52Daniel Dunbar      CmdArgs.push_back("--disable-red-zone");
1531d46033f760ba5fd266ce59fe391fac473f04f52Daniel Dunbar    if (Args.hasFlag(options::OPT_msoft_float,
1541d46033f760ba5fd266ce59fe391fac473f04f52Daniel Dunbar                      options::OPT_mno_soft_float,
1551d46033f760ba5fd266ce59fe391fac473f04f52Daniel Dunbar                      false))
1561d46033f760ba5fd266ce59fe391fac473f04f52Daniel Dunbar      CmdArgs.push_back("--soft-float");
1571d46033f760ba5fd266ce59fe391fac473f04f52Daniel Dunbar
1581d46033f760ba5fd266ce59fe391fac473f04f52Daniel Dunbar    // FIXME: Need target hooks.
1591d46033f760ba5fd266ce59fe391fac473f04f52Daniel Dunbar    if (memcmp(getToolChain().getPlatform().c_str(), "darwin", 6) == 0) {
1601d46033f760ba5fd266ce59fe391fac473f04f52Daniel Dunbar      if (getToolChain().getArchName() == "x86_64")
1611d46033f760ba5fd266ce59fe391fac473f04f52Daniel Dunbar        CmdArgs.push_back("--mcpu=core2");
1621d46033f760ba5fd266ce59fe391fac473f04f52Daniel Dunbar      else if (getToolChain().getArchName() == "i386")
1631d46033f760ba5fd266ce59fe391fac473f04f52Daniel Dunbar        CmdArgs.push_back("--mcpu=yonah");
1641d46033f760ba5fd266ce59fe391fac473f04f52Daniel Dunbar    }
1651d46033f760ba5fd266ce59fe391fac473f04f52Daniel Dunbar
1661d46033f760ba5fd266ce59fe391fac473f04f52Daniel Dunbar    // FIXME: Ignores ordering. Also, we need to find a realistic
1671d46033f760ba5fd266ce59fe391fac473f04f52Daniel Dunbar    // solution for this.
1681d46033f760ba5fd266ce59fe391fac473f04f52Daniel Dunbar    static const struct {
1691d46033f760ba5fd266ce59fe391fac473f04f52Daniel Dunbar      options::ID Pos, Neg;
1701d46033f760ba5fd266ce59fe391fac473f04f52Daniel Dunbar      const char *Name;
1711d46033f760ba5fd266ce59fe391fac473f04f52Daniel Dunbar    } FeatureOptions[] = {
1721d46033f760ba5fd266ce59fe391fac473f04f52Daniel Dunbar      { options::OPT_mmmx, options::OPT_mno_mmx, "mmx" },
1731d46033f760ba5fd266ce59fe391fac473f04f52Daniel Dunbar      { options::OPT_msse, options::OPT_mno_sse, "sse" },
1741d46033f760ba5fd266ce59fe391fac473f04f52Daniel Dunbar      { options::OPT_msse2, options::OPT_mno_sse2, "sse2" },
1751d46033f760ba5fd266ce59fe391fac473f04f52Daniel Dunbar      { options::OPT_msse3, options::OPT_mno_sse3, "sse3" },
1761d46033f760ba5fd266ce59fe391fac473f04f52Daniel Dunbar      { options::OPT_mssse3, options::OPT_mno_ssse3, "ssse3" },
1771d46033f760ba5fd266ce59fe391fac473f04f52Daniel Dunbar      { options::OPT_msse41, options::OPT_mno_sse41, "sse41" },
1781d46033f760ba5fd266ce59fe391fac473f04f52Daniel Dunbar      { options::OPT_msse42, options::OPT_mno_sse42, "sse42" },
1791d46033f760ba5fd266ce59fe391fac473f04f52Daniel Dunbar      { options::OPT_msse4a, options::OPT_mno_sse4a, "sse4a" },
1801d46033f760ba5fd266ce59fe391fac473f04f52Daniel Dunbar      { options::OPT_m3dnow, options::OPT_mno_3dnow, "3dnow" },
1811d46033f760ba5fd266ce59fe391fac473f04f52Daniel Dunbar      { options::OPT_m3dnowa, options::OPT_mno_3dnowa, "3dnowa" }
1821d46033f760ba5fd266ce59fe391fac473f04f52Daniel Dunbar    };
1831d46033f760ba5fd266ce59fe391fac473f04f52Daniel Dunbar    const unsigned NumFeatureOptions =
1841d46033f760ba5fd266ce59fe391fac473f04f52Daniel Dunbar      sizeof(FeatureOptions)/sizeof(FeatureOptions[0]);
1851d46033f760ba5fd266ce59fe391fac473f04f52Daniel Dunbar
1861d46033f760ba5fd266ce59fe391fac473f04f52Daniel Dunbar    // FIXME: Avoid std::string
1871d46033f760ba5fd266ce59fe391fac473f04f52Daniel Dunbar    std::string Attrs;
1881d46033f760ba5fd266ce59fe391fac473f04f52Daniel Dunbar    for (unsigned i=0; i < NumFeatureOptions; ++i) {
1891d46033f760ba5fd266ce59fe391fac473f04f52Daniel Dunbar      if (Args.hasArg(FeatureOptions[i].Pos)) {
19055b3b5f5c6c92f5dbb10dfe96a7de07a2b364338Daniel Dunbar        if (!Attrs.empty())
19155b3b5f5c6c92f5dbb10dfe96a7de07a2b364338Daniel Dunbar          Attrs += ',';
1921d46033f760ba5fd266ce59fe391fac473f04f52Daniel Dunbar        Attrs += '+';
1931d46033f760ba5fd266ce59fe391fac473f04f52Daniel Dunbar        Attrs += FeatureOptions[i].Name;
1941d46033f760ba5fd266ce59fe391fac473f04f52Daniel Dunbar      } else if (Args.hasArg(FeatureOptions[i].Neg)) {
19555b3b5f5c6c92f5dbb10dfe96a7de07a2b364338Daniel Dunbar        if (!Attrs.empty())
19655b3b5f5c6c92f5dbb10dfe96a7de07a2b364338Daniel Dunbar          Attrs += ',';
1971d46033f760ba5fd266ce59fe391fac473f04f52Daniel Dunbar        Attrs += '-';
1981d46033f760ba5fd266ce59fe391fac473f04f52Daniel Dunbar        Attrs += FeatureOptions[i].Name;
1991d46033f760ba5fd266ce59fe391fac473f04f52Daniel Dunbar      }
2001d46033f760ba5fd266ce59fe391fac473f04f52Daniel Dunbar    }
2011d46033f760ba5fd266ce59fe391fac473f04f52Daniel Dunbar    if (!Attrs.empty()) {
2021d46033f760ba5fd266ce59fe391fac473f04f52Daniel Dunbar      CmdArgs.push_back("--mattr");
2031d46033f760ba5fd266ce59fe391fac473f04f52Daniel Dunbar      CmdArgs.push_back(Args.MakeArgString(Attrs.c_str()));
2041d46033f760ba5fd266ce59fe391fac473f04f52Daniel Dunbar    }
2051d46033f760ba5fd266ce59fe391fac473f04f52Daniel Dunbar
2061d46033f760ba5fd266ce59fe391fac473f04f52Daniel Dunbar    if (Args.hasFlag(options::OPT_fmath_errno,
2071d46033f760ba5fd266ce59fe391fac473f04f52Daniel Dunbar                      options::OPT_fno_math_errno,
2081d46033f760ba5fd266ce59fe391fac473f04f52Daniel Dunbar                      getToolChain().IsMathErrnoDefault()))
2091d46033f760ba5fd266ce59fe391fac473f04f52Daniel Dunbar      CmdArgs.push_back("--fmath-errno=1");
2101d46033f760ba5fd266ce59fe391fac473f04f52Daniel Dunbar    else
2111d46033f760ba5fd266ce59fe391fac473f04f52Daniel Dunbar      CmdArgs.push_back("--fmath-errno=0");
2121d46033f760ba5fd266ce59fe391fac473f04f52Daniel Dunbar
2131d46033f760ba5fd266ce59fe391fac473f04f52Daniel Dunbar    if (Arg *A = Args.getLastArg(options::OPT_flimited_precision_EQ)) {
2141d46033f760ba5fd266ce59fe391fac473f04f52Daniel Dunbar      CmdArgs.push_back("--limit-float-precision");
2151d46033f760ba5fd266ce59fe391fac473f04f52Daniel Dunbar      CmdArgs.push_back(A->getValue(Args));
2161d46033f760ba5fd266ce59fe391fac473f04f52Daniel Dunbar    }
2171d46033f760ba5fd266ce59fe391fac473f04f52Daniel Dunbar
2181d46033f760ba5fd266ce59fe391fac473f04f52Daniel Dunbar    // FIXME: Add --stack-protector-buffer-size=<xxx> on
2191d46033f760ba5fd266ce59fe391fac473f04f52Daniel Dunbar    // -fstack-protect.
2201d46033f760ba5fd266ce59fe391fac473f04f52Daniel Dunbar
221a5a7bd0de7b6b80212095195a055a4a43f21d4b2Daniel Dunbar    // Handle dependency file generation.
222a5a7bd0de7b6b80212095195a055a4a43f21d4b2Daniel Dunbar    Arg *A;
223a5a7bd0de7b6b80212095195a055a4a43f21d4b2Daniel Dunbar    if ((A = Args.getLastArg(options::OPT_M)) ||
224a5a7bd0de7b6b80212095195a055a4a43f21d4b2Daniel Dunbar        (A = Args.getLastArg(options::OPT_MM)) ||
225a5a7bd0de7b6b80212095195a055a4a43f21d4b2Daniel Dunbar        (A = Args.getLastArg(options::OPT_MD)) ||
226a5a7bd0de7b6b80212095195a055a4a43f21d4b2Daniel Dunbar        (A = Args.getLastArg(options::OPT_MMD))) {
227a5a7bd0de7b6b80212095195a055a4a43f21d4b2Daniel Dunbar      // Determine the output location.
228a5a7bd0de7b6b80212095195a055a4a43f21d4b2Daniel Dunbar      const char *DepFile;
229cd8e4c44dd068956e9181381be3ee2d49a0fac52Daniel Dunbar      if (Output.getType() == types::TY_Dependencies) {
230cd8e4c44dd068956e9181381be3ee2d49a0fac52Daniel Dunbar        if (Output.isPipe())
231cd8e4c44dd068956e9181381be3ee2d49a0fac52Daniel Dunbar          DepFile = "-";
232cd8e4c44dd068956e9181381be3ee2d49a0fac52Daniel Dunbar        else
233cd8e4c44dd068956e9181381be3ee2d49a0fac52Daniel Dunbar          DepFile = Output.getFilename();
234cd8e4c44dd068956e9181381be3ee2d49a0fac52Daniel Dunbar      } else if (Arg *MF = Args.getLastArg(options::OPT_MF)) {
235a5a7bd0de7b6b80212095195a055a4a43f21d4b2Daniel Dunbar        DepFile = MF->getValue(Args);
236a5a7bd0de7b6b80212095195a055a4a43f21d4b2Daniel Dunbar      } else if (A->getOption().getId() == options::OPT_M ||
237a5a7bd0de7b6b80212095195a055a4a43f21d4b2Daniel Dunbar                 A->getOption().getId() == options::OPT_MM) {
238a5a7bd0de7b6b80212095195a055a4a43f21d4b2Daniel Dunbar        DepFile = "-";
239a5a7bd0de7b6b80212095195a055a4a43f21d4b2Daniel Dunbar      } else {
240a5a7bd0de7b6b80212095195a055a4a43f21d4b2Daniel Dunbar        DepFile = darwin::CC1::getDependencyFileName(Args, Inputs);
241a5a7bd0de7b6b80212095195a055a4a43f21d4b2Daniel Dunbar      }
242a5a7bd0de7b6b80212095195a055a4a43f21d4b2Daniel Dunbar      CmdArgs.push_back("-dependency-file");
243a5a7bd0de7b6b80212095195a055a4a43f21d4b2Daniel Dunbar      CmdArgs.push_back(DepFile);
244a5a7bd0de7b6b80212095195a055a4a43f21d4b2Daniel Dunbar
245a5a7bd0de7b6b80212095195a055a4a43f21d4b2Daniel Dunbar      // Add an -MT option if the user didn't specify their own.
246a5a7bd0de7b6b80212095195a055a4a43f21d4b2Daniel Dunbar      // FIXME: This should use -MQ, when we support it.
247a5a7bd0de7b6b80212095195a055a4a43f21d4b2Daniel Dunbar      if (!Args.hasArg(options::OPT_MT) && !Args.hasArg(options::OPT_MQ)) {
248a5a7bd0de7b6b80212095195a055a4a43f21d4b2Daniel Dunbar        const char *DepTarget;
249a5a7bd0de7b6b80212095195a055a4a43f21d4b2Daniel Dunbar
250cd8e4c44dd068956e9181381be3ee2d49a0fac52Daniel Dunbar        // If user provided -o, that is the dependency target, except
251cd8e4c44dd068956e9181381be3ee2d49a0fac52Daniel Dunbar        // when we are only generating a dependency file.
252cd8e4c44dd068956e9181381be3ee2d49a0fac52Daniel Dunbar        Arg *OutputOpt = Args.getLastArg(options::OPT_o);
253cd8e4c44dd068956e9181381be3ee2d49a0fac52Daniel Dunbar        if (OutputOpt && Output.getType() != types::TY_Dependencies) {
25446562b9122417bf6f70626f69bd79b8f5a4adac9Daniel Dunbar          DepTarget = OutputOpt->getValue(Args);
255a5a7bd0de7b6b80212095195a055a4a43f21d4b2Daniel Dunbar        } else {
256a5a7bd0de7b6b80212095195a055a4a43f21d4b2Daniel Dunbar          // Otherwise derive from the base input.
257a5a7bd0de7b6b80212095195a055a4a43f21d4b2Daniel Dunbar          //
258a5a7bd0de7b6b80212095195a055a4a43f21d4b2Daniel Dunbar          // FIXME: This should use the computed output file location.
259a5a7bd0de7b6b80212095195a055a4a43f21d4b2Daniel Dunbar          llvm::sys::Path P(Inputs[0].getBaseInput());
260a5a7bd0de7b6b80212095195a055a4a43f21d4b2Daniel Dunbar
261a5a7bd0de7b6b80212095195a055a4a43f21d4b2Daniel Dunbar          P.eraseSuffix();
262a5a7bd0de7b6b80212095195a055a4a43f21d4b2Daniel Dunbar          P.appendSuffix("o");
263a5a7bd0de7b6b80212095195a055a4a43f21d4b2Daniel Dunbar          DepTarget = Args.MakeArgString(P.getLast().c_str());
264a5a7bd0de7b6b80212095195a055a4a43f21d4b2Daniel Dunbar        }
265a5a7bd0de7b6b80212095195a055a4a43f21d4b2Daniel Dunbar
266a5a7bd0de7b6b80212095195a055a4a43f21d4b2Daniel Dunbar        CmdArgs.push_back("-MT");
267a5a7bd0de7b6b80212095195a055a4a43f21d4b2Daniel Dunbar        CmdArgs.push_back(DepTarget);
268a5a7bd0de7b6b80212095195a055a4a43f21d4b2Daniel Dunbar      }
269a5a7bd0de7b6b80212095195a055a4a43f21d4b2Daniel Dunbar
270a5a7bd0de7b6b80212095195a055a4a43f21d4b2Daniel Dunbar      if (A->getOption().getId() == options::OPT_M ||
271a5a7bd0de7b6b80212095195a055a4a43f21d4b2Daniel Dunbar          A->getOption().getId() == options::OPT_MD)
272a5a7bd0de7b6b80212095195a055a4a43f21d4b2Daniel Dunbar        CmdArgs.push_back("-sys-header-deps");
273a5a7bd0de7b6b80212095195a055a4a43f21d4b2Daniel Dunbar    }
274a5a7bd0de7b6b80212095195a055a4a43f21d4b2Daniel Dunbar
2751d46033f760ba5fd266ce59fe391fac473f04f52Daniel Dunbar    Args.AddLastArg(CmdArgs, options::OPT_MP);
2761d46033f760ba5fd266ce59fe391fac473f04f52Daniel Dunbar    Args.AddAllArgs(CmdArgs, options::OPT_MT);
2771d46033f760ba5fd266ce59fe391fac473f04f52Daniel Dunbar
278cd8e4c44dd068956e9181381be3ee2d49a0fac52Daniel Dunbar    Arg *Unsupported;
279cd8e4c44dd068956e9181381be3ee2d49a0fac52Daniel Dunbar    if ((Unsupported = Args.getLastArg(options::OPT_MG)) ||
280cd8e4c44dd068956e9181381be3ee2d49a0fac52Daniel Dunbar        (Unsupported = Args.getLastArg(options::OPT_MQ))) {
2811d46033f760ba5fd266ce59fe391fac473f04f52Daniel Dunbar      const Driver &D = getToolChain().getHost().getDriver();
2821d46033f760ba5fd266ce59fe391fac473f04f52Daniel Dunbar      D.Diag(clang::diag::err_drv_unsupported_opt)
2831d46033f760ba5fd266ce59fe391fac473f04f52Daniel Dunbar        << Unsupported->getOption().getName();
2841d46033f760ba5fd266ce59fe391fac473f04f52Daniel Dunbar    }
2851d46033f760ba5fd266ce59fe391fac473f04f52Daniel Dunbar  }
2861d46033f760ba5fd266ce59fe391fac473f04f52Daniel Dunbar
2871d46033f760ba5fd266ce59fe391fac473f04f52Daniel Dunbar  Args.AddAllArgs(CmdArgs, options::OPT_v);
2881d46033f760ba5fd266ce59fe391fac473f04f52Daniel Dunbar  Args.AddAllArgs(CmdArgs, options::OPT_D, options::OPT_U);
2891d46033f760ba5fd266ce59fe391fac473f04f52Daniel Dunbar  Args.AddAllArgs(CmdArgs, options::OPT_I_Group, options::OPT_F);
2901d46033f760ba5fd266ce59fe391fac473f04f52Daniel Dunbar  Args.AddLastArg(CmdArgs, options::OPT_P);
2911d46033f760ba5fd266ce59fe391fac473f04f52Daniel Dunbar  Args.AddAllArgs(CmdArgs, options::OPT_mmacosx_version_min_EQ);
2921d46033f760ba5fd266ce59fe391fac473f04f52Daniel Dunbar
2931d46033f760ba5fd266ce59fe391fac473f04f52Daniel Dunbar  // Special case debug options to only pass -g to clang. This is
2941d46033f760ba5fd266ce59fe391fac473f04f52Daniel Dunbar  // wrong.
2951d46033f760ba5fd266ce59fe391fac473f04f52Daniel Dunbar  if (Args.hasArg(options::OPT_g_Group))
2961d46033f760ba5fd266ce59fe391fac473f04f52Daniel Dunbar    CmdArgs.push_back("-g");
2971d46033f760ba5fd266ce59fe391fac473f04f52Daniel Dunbar
2981d46033f760ba5fd266ce59fe391fac473f04f52Daniel Dunbar  Args.AddLastArg(CmdArgs, options::OPT_nostdinc);
2991d46033f760ba5fd266ce59fe391fac473f04f52Daniel Dunbar
3001d46033f760ba5fd266ce59fe391fac473f04f52Daniel Dunbar  // FIXME: Clang isn't going to accept just anything here.
301049853d74ea052ed904de7e18ae51d6953177822Daniel Dunbar  // FIXME: Use iterator.
3021d46033f760ba5fd266ce59fe391fac473f04f52Daniel Dunbar
303049853d74ea052ed904de7e18ae51d6953177822Daniel Dunbar  // Add -i* options, and automatically translate to -include-pth for
304049853d74ea052ed904de7e18ae51d6953177822Daniel Dunbar  // transparent PCH support. It's wonky, but we include looking for
305049853d74ea052ed904de7e18ae51d6953177822Daniel Dunbar  // .gch so we can support seamless replacement into a build system
306049853d74ea052ed904de7e18ae51d6953177822Daniel Dunbar  // already set up to be generating .gch files.
3071d46033f760ba5fd266ce59fe391fac473f04f52Daniel Dunbar  for (ArgList::const_iterator
3081d46033f760ba5fd266ce59fe391fac473f04f52Daniel Dunbar         it = Args.begin(), ie = Args.end(); it != ie; ++it) {
3091d46033f760ba5fd266ce59fe391fac473f04f52Daniel Dunbar    const Arg *A = *it;
310049853d74ea052ed904de7e18ae51d6953177822Daniel Dunbar    if (!A->getOption().matches(options::OPT_i_Group))
311049853d74ea052ed904de7e18ae51d6953177822Daniel Dunbar      continue;
312049853d74ea052ed904de7e18ae51d6953177822Daniel Dunbar
3131d46033f760ba5fd266ce59fe391fac473f04f52Daniel Dunbar    if (A->getOption().matches(options::OPT_include)) {
314049853d74ea052ed904de7e18ae51d6953177822Daniel Dunbar      bool FoundPTH = false;
3151d46033f760ba5fd266ce59fe391fac473f04f52Daniel Dunbar      llvm::sys::Path P(A->getValue(Args));
3161d46033f760ba5fd266ce59fe391fac473f04f52Daniel Dunbar      P.appendSuffix("pth");
3171d46033f760ba5fd266ce59fe391fac473f04f52Daniel Dunbar      if (P.exists()) {
318049853d74ea052ed904de7e18ae51d6953177822Daniel Dunbar        FoundPTH = true;
3191d46033f760ba5fd266ce59fe391fac473f04f52Daniel Dunbar      } else {
3201d46033f760ba5fd266ce59fe391fac473f04f52Daniel Dunbar        P.eraseSuffix();
3211d46033f760ba5fd266ce59fe391fac473f04f52Daniel Dunbar        P.appendSuffix("gch");
322049853d74ea052ed904de7e18ae51d6953177822Daniel Dunbar        if (P.exists())
323049853d74ea052ed904de7e18ae51d6953177822Daniel Dunbar          FoundPTH = true;
324049853d74ea052ed904de7e18ae51d6953177822Daniel Dunbar      }
325049853d74ea052ed904de7e18ae51d6953177822Daniel Dunbar
326049853d74ea052ed904de7e18ae51d6953177822Daniel Dunbar      if (FoundPTH) {
327049853d74ea052ed904de7e18ae51d6953177822Daniel Dunbar        A->claim();
328049853d74ea052ed904de7e18ae51d6953177822Daniel Dunbar        CmdArgs.push_back("-include-pth");
329049853d74ea052ed904de7e18ae51d6953177822Daniel Dunbar        CmdArgs.push_back(Args.MakeArgString(P.c_str()));
330049853d74ea052ed904de7e18ae51d6953177822Daniel Dunbar        continue;
3311d46033f760ba5fd266ce59fe391fac473f04f52Daniel Dunbar      }
3321d46033f760ba5fd266ce59fe391fac473f04f52Daniel Dunbar    }
333049853d74ea052ed904de7e18ae51d6953177822Daniel Dunbar
334049853d74ea052ed904de7e18ae51d6953177822Daniel Dunbar    // Not translated, render as usual.
335049853d74ea052ed904de7e18ae51d6953177822Daniel Dunbar    A->claim();
336049853d74ea052ed904de7e18ae51d6953177822Daniel Dunbar    A->render(Args, CmdArgs);
3371d46033f760ba5fd266ce59fe391fac473f04f52Daniel Dunbar  }
3381d46033f760ba5fd266ce59fe391fac473f04f52Daniel Dunbar
339337a6271b98c4c183f7eaad1563a75260b4f2871Daniel Dunbar  // Manually translate -O to -O1 and -O4 to -O3; let clang reject
340337a6271b98c4c183f7eaad1563a75260b4f2871Daniel Dunbar  // others.
341337a6271b98c4c183f7eaad1563a75260b4f2871Daniel Dunbar  if (Arg *A = Args.getLastArg(options::OPT_O_Group)) {
342337a6271b98c4c183f7eaad1563a75260b4f2871Daniel Dunbar    if (A->getOption().getId() == options::OPT_O4)
343337a6271b98c4c183f7eaad1563a75260b4f2871Daniel Dunbar      CmdArgs.push_back("-O3");
344337a6271b98c4c183f7eaad1563a75260b4f2871Daniel Dunbar    else if (A->getValue(Args)[0] == '\0')
3451d46033f760ba5fd266ce59fe391fac473f04f52Daniel Dunbar      CmdArgs.push_back("-O1");
3461d46033f760ba5fd266ce59fe391fac473f04f52Daniel Dunbar    else
3475697aa0d75c87bafec78984048d558f8d12ca1b3Daniel Dunbar      A->render(Args, CmdArgs);
3481d46033f760ba5fd266ce59fe391fac473f04f52Daniel Dunbar  }
3491d46033f760ba5fd266ce59fe391fac473f04f52Daniel Dunbar
350ff7488dc9a766f94daf54d81b03ab9160d0bfd88Daniel Dunbar  Args.AddAllArgs(CmdArgs, options::OPT_clang_W_Group,
351ff7488dc9a766f94daf54d81b03ab9160d0bfd88Daniel Dunbar                  options::OPT_pedantic_Group);
3521d46033f760ba5fd266ce59fe391fac473f04f52Daniel Dunbar  Args.AddLastArg(CmdArgs, options::OPT_w);
3531d46033f760ba5fd266ce59fe391fac473f04f52Daniel Dunbar  Args.AddAllArgs(CmdArgs, options::OPT_std_EQ, options::OPT_ansi,
3541d46033f760ba5fd266ce59fe391fac473f04f52Daniel Dunbar                  options::OPT_trigraphs);
3551d46033f760ba5fd266ce59fe391fac473f04f52Daniel Dunbar
3561d46033f760ba5fd266ce59fe391fac473f04f52Daniel Dunbar  if (Arg *A = Args.getLastArg(options::OPT_ftemplate_depth_)) {
3571d46033f760ba5fd266ce59fe391fac473f04f52Daniel Dunbar    CmdArgs.push_back("-ftemplate-depth");
3581d46033f760ba5fd266ce59fe391fac473f04f52Daniel Dunbar    CmdArgs.push_back(A->getValue(Args));
359b488c1dac8e53206f07103d794a62a3f5012c0f4Daniel Dunbar  }
360b488c1dac8e53206f07103d794a62a3f5012c0f4Daniel Dunbar
3611d46033f760ba5fd266ce59fe391fac473f04f52Daniel Dunbar  Args.AddAllArgs(CmdArgs, options::OPT_clang_f_Group);
3621d46033f760ba5fd266ce59fe391fac473f04f52Daniel Dunbar
363b9f3a777e503851964c9542a0261e45eece59747Daniel Dunbar  // If tool chain translates fpascal-strings, we want to back
364b9f3a777e503851964c9542a0261e45eece59747Daniel Dunbar  // translate here.
365b9f3a777e503851964c9542a0261e45eece59747Daniel Dunbar  // FIXME: This is gross; that translation should be pulled from the
366b9f3a777e503851964c9542a0261e45eece59747Daniel Dunbar  // tool chain.
367b9f3a777e503851964c9542a0261e45eece59747Daniel Dunbar  if (Arg *A = Args.getLastArg(options::OPT_mpascal_strings,
368b9f3a777e503851964c9542a0261e45eece59747Daniel Dunbar                               options::OPT_mno_pascal_strings)) {
369b9f3a777e503851964c9542a0261e45eece59747Daniel Dunbar    if (A->getOption().matches(options::OPT_mpascal_strings))
370b9f3a777e503851964c9542a0261e45eece59747Daniel Dunbar      CmdArgs.push_back("-fpascal-strings");
371b9f3a777e503851964c9542a0261e45eece59747Daniel Dunbar    else
372b9f3a777e503851964c9542a0261e45eece59747Daniel Dunbar      CmdArgs.push_back("-fno-pascal-strings");
373b9f3a777e503851964c9542a0261e45eece59747Daniel Dunbar  }
374b9f3a777e503851964c9542a0261e45eece59747Daniel Dunbar
3751d46033f760ba5fd266ce59fe391fac473f04f52Daniel Dunbar  Args.AddLastArg(CmdArgs, options::OPT_dM);
3761d46033f760ba5fd266ce59fe391fac473f04f52Daniel Dunbar
377077ba6a3ac3628afb0d3c460e81ce013bccbdbedDaniel Dunbar  // Add -Wp, and -Xassembler if using the preprocessor.
378077ba6a3ac3628afb0d3c460e81ce013bccbdbedDaniel Dunbar
379077ba6a3ac3628afb0d3c460e81ce013bccbdbedDaniel Dunbar  // FIXME: There is a very unfortunate problem here, some troubled
380077ba6a3ac3628afb0d3c460e81ce013bccbdbedDaniel Dunbar  // souls abuse -Wp, to pass preprocessor options in gcc syntax. To
381077ba6a3ac3628afb0d3c460e81ce013bccbdbedDaniel Dunbar  // really support that we would have to parse and then translate
382077ba6a3ac3628afb0d3c460e81ce013bccbdbedDaniel Dunbar  // those options. :(
383077ba6a3ac3628afb0d3c460e81ce013bccbdbedDaniel Dunbar  if (types::getPreprocessedType(Inputs[0].getType()) != types::TY_INVALID)
384077ba6a3ac3628afb0d3c460e81ce013bccbdbedDaniel Dunbar    Args.AddAllArgValues(CmdArgs, options::OPT_Wp_COMMA,
385077ba6a3ac3628afb0d3c460e81ce013bccbdbedDaniel Dunbar                         options::OPT_Xpreprocessor);
386077ba6a3ac3628afb0d3c460e81ce013bccbdbedDaniel Dunbar
3871d46033f760ba5fd266ce59fe391fac473f04f52Daniel Dunbar  Args.AddAllArgValues(CmdArgs, options::OPT_Xclang);
3881d46033f760ba5fd266ce59fe391fac473f04f52Daniel Dunbar
389cd8e4c44dd068956e9181381be3ee2d49a0fac52Daniel Dunbar  if (Output.getType() == types::TY_Dependencies) {
390cd8e4c44dd068956e9181381be3ee2d49a0fac52Daniel Dunbar    // Handled with other dependency code.
391a5a7bd0de7b6b80212095195a055a4a43f21d4b2Daniel Dunbar  } else if (Output.isPipe()) {
392b488c1dac8e53206f07103d794a62a3f5012c0f4Daniel Dunbar    CmdArgs.push_back("-o");
393b488c1dac8e53206f07103d794a62a3f5012c0f4Daniel Dunbar    CmdArgs.push_back("-");
394115a79277edababaf1b26e3654044ae983197679Daniel Dunbar  } else if (Output.isFilename()) {
395b488c1dac8e53206f07103d794a62a3f5012c0f4Daniel Dunbar    CmdArgs.push_back("-o");
396115a79277edababaf1b26e3654044ae983197679Daniel Dunbar    CmdArgs.push_back(Output.getFilename());
397115a79277edababaf1b26e3654044ae983197679Daniel Dunbar  } else {
398115a79277edababaf1b26e3654044ae983197679Daniel Dunbar    assert(Output.isNothing() && "Invalid output.");
399b488c1dac8e53206f07103d794a62a3f5012c0f4Daniel Dunbar  }
400b488c1dac8e53206f07103d794a62a3f5012c0f4Daniel Dunbar
4011d46033f760ba5fd266ce59fe391fac473f04f52Daniel Dunbar  for (InputInfoList::const_iterator
4021d46033f760ba5fd266ce59fe391fac473f04f52Daniel Dunbar         it = Inputs.begin(), ie = Inputs.end(); it != ie; ++it) {
4031d46033f760ba5fd266ce59fe391fac473f04f52Daniel Dunbar    const InputInfo &II = *it;
4041d46033f760ba5fd266ce59fe391fac473f04f52Daniel Dunbar    CmdArgs.push_back("-x");
4051d46033f760ba5fd266ce59fe391fac473f04f52Daniel Dunbar    CmdArgs.push_back(types::getTypeName(II.getType()));
4061d46033f760ba5fd266ce59fe391fac473f04f52Daniel Dunbar    if (II.isPipe())
4071d46033f760ba5fd266ce59fe391fac473f04f52Daniel Dunbar      CmdArgs.push_back("-");
408115a79277edababaf1b26e3654044ae983197679Daniel Dunbar    else if (II.isFilename())
409115a79277edababaf1b26e3654044ae983197679Daniel Dunbar      CmdArgs.push_back(II.getFilename());
4101d46033f760ba5fd266ce59fe391fac473f04f52Daniel Dunbar    else
411115a79277edababaf1b26e3654044ae983197679Daniel Dunbar      II.getInputArg().renderAsInput(Args, CmdArgs);
4121d46033f760ba5fd266ce59fe391fac473f04f52Daniel Dunbar  }
4131d46033f760ba5fd266ce59fe391fac473f04f52Daniel Dunbar
4141d46033f760ba5fd266ce59fe391fac473f04f52Daniel Dunbar  const char *Exec =
415d7d5f0223bd30dfd618762349c6209dd1d5ea3e6Daniel Dunbar    Args.MakeArgString(getToolChain().GetProgramPath(C, "clang-cc").c_str());
4161d46033f760ba5fd266ce59fe391fac473f04f52Daniel Dunbar  Dest.addCommand(new Command(Exec, CmdArgs));
417a880db0b0fc028abf754c290d921d809eec0518aDaniel Dunbar
418a880db0b0fc028abf754c290d921d809eec0518aDaniel Dunbar  // Claim some arguments which clang doesn't support, but we don't
419a880db0b0fc028abf754c290d921d809eec0518aDaniel Dunbar  // care to warn the user about.
420a880db0b0fc028abf754c290d921d809eec0518aDaniel Dunbar
421a880db0b0fc028abf754c290d921d809eec0518aDaniel Dunbar  // FIXME: Use iterator.
422a880db0b0fc028abf754c290d921d809eec0518aDaniel Dunbar  for (ArgList::const_iterator
423a880db0b0fc028abf754c290d921d809eec0518aDaniel Dunbar         it = Args.begin(), ie = Args.end(); it != ie; ++it) {
424a880db0b0fc028abf754c290d921d809eec0518aDaniel Dunbar    const Arg *A = *it;
425a880db0b0fc028abf754c290d921d809eec0518aDaniel Dunbar    if (A->getOption().matches(options::OPT_clang_ignored_W_Group) ||
426a880db0b0fc028abf754c290d921d809eec0518aDaniel Dunbar        A->getOption().matches(options::OPT_clang_ignored_f_Group))
427a880db0b0fc028abf754c290d921d809eec0518aDaniel Dunbar      A->claim();
428a880db0b0fc028abf754c290d921d809eec0518aDaniel Dunbar  }
42947ac7d27c44bd64a7d0fc03d4babc196cf2b8230Daniel Dunbar}
43047ac7d27c44bd64a7d0fc03d4babc196cf2b8230Daniel Dunbar
431b488c1dac8e53206f07103d794a62a3f5012c0f4Daniel Dunbarvoid gcc::Common::ConstructJob(Compilation &C, const JobAction &JA,
432b488c1dac8e53206f07103d794a62a3f5012c0f4Daniel Dunbar                               Job &Dest,
433b488c1dac8e53206f07103d794a62a3f5012c0f4Daniel Dunbar                               const InputInfo &Output,
434b488c1dac8e53206f07103d794a62a3f5012c0f4Daniel Dunbar                               const InputInfoList &Inputs,
4351d46033f760ba5fd266ce59fe391fac473f04f52Daniel Dunbar                               const ArgList &Args,
436b488c1dac8e53206f07103d794a62a3f5012c0f4Daniel Dunbar                               const char *LinkingOutput) const {
437b488c1dac8e53206f07103d794a62a3f5012c0f4Daniel Dunbar  ArgStringList CmdArgs;
438b488c1dac8e53206f07103d794a62a3f5012c0f4Daniel Dunbar
439b488c1dac8e53206f07103d794a62a3f5012c0f4Daniel Dunbar  for (ArgList::const_iterator
4401d46033f760ba5fd266ce59fe391fac473f04f52Daniel Dunbar         it = Args.begin(), ie = Args.end(); it != ie; ++it) {
441b488c1dac8e53206f07103d794a62a3f5012c0f4Daniel Dunbar    Arg *A = *it;
4427587719c40ebf02bf11e5e66c30bd20e98edebc2Daniel Dunbar    if (A->getOption().hasForwardToGCC()) {
4437587719c40ebf02bf11e5e66c30bd20e98edebc2Daniel Dunbar      // It is unfortunate that we have to claim here, as this means
4447587719c40ebf02bf11e5e66c30bd20e98edebc2Daniel Dunbar      // we will basically never report anything interesting for
4457587719c40ebf02bf11e5e66c30bd20e98edebc2Daniel Dunbar      // platforms using a generic gcc.
4467587719c40ebf02bf11e5e66c30bd20e98edebc2Daniel Dunbar      A->claim();
4471d46033f760ba5fd266ce59fe391fac473f04f52Daniel Dunbar      A->render(Args, CmdArgs);
4487587719c40ebf02bf11e5e66c30bd20e98edebc2Daniel Dunbar    }
449b488c1dac8e53206f07103d794a62a3f5012c0f4Daniel Dunbar  }
450b488c1dac8e53206f07103d794a62a3f5012c0f4Daniel Dunbar
451b488c1dac8e53206f07103d794a62a3f5012c0f4Daniel Dunbar  RenderExtraToolArgs(CmdArgs);
452b488c1dac8e53206f07103d794a62a3f5012c0f4Daniel Dunbar
453b488c1dac8e53206f07103d794a62a3f5012c0f4Daniel Dunbar  // If using a driver driver, force the arch.
454b488c1dac8e53206f07103d794a62a3f5012c0f4Daniel Dunbar  if (getToolChain().getHost().useDriverDriver()) {
455b488c1dac8e53206f07103d794a62a3f5012c0f4Daniel Dunbar    CmdArgs.push_back("-arch");
456bf54a06f9b771c2a2730cc63eb89bce0522515b5Daniel Dunbar
457bf54a06f9b771c2a2730cc63eb89bce0522515b5Daniel Dunbar    // FIXME: Remove these special cases.
458bf54a06f9b771c2a2730cc63eb89bce0522515b5Daniel Dunbar    const char *Str = getToolChain().getArchName().c_str();
459bf54a06f9b771c2a2730cc63eb89bce0522515b5Daniel Dunbar    if (strcmp(Str, "powerpc") == 0)
460bf54a06f9b771c2a2730cc63eb89bce0522515b5Daniel Dunbar      Str = "ppc";
461bf54a06f9b771c2a2730cc63eb89bce0522515b5Daniel Dunbar    else if (strcmp(Str, "powerpc64") == 0)
462bf54a06f9b771c2a2730cc63eb89bce0522515b5Daniel Dunbar      Str = "ppc64";
463bf54a06f9b771c2a2730cc63eb89bce0522515b5Daniel Dunbar    CmdArgs.push_back(Str);
464b488c1dac8e53206f07103d794a62a3f5012c0f4Daniel Dunbar  }
465b488c1dac8e53206f07103d794a62a3f5012c0f4Daniel Dunbar
466b488c1dac8e53206f07103d794a62a3f5012c0f4Daniel Dunbar  if (Output.isPipe()) {
467b488c1dac8e53206f07103d794a62a3f5012c0f4Daniel Dunbar    CmdArgs.push_back("-o");
468b488c1dac8e53206f07103d794a62a3f5012c0f4Daniel Dunbar    CmdArgs.push_back("-");
469115a79277edababaf1b26e3654044ae983197679Daniel Dunbar  } else if (Output.isFilename()) {
470b488c1dac8e53206f07103d794a62a3f5012c0f4Daniel Dunbar    CmdArgs.push_back("-o");
471115a79277edababaf1b26e3654044ae983197679Daniel Dunbar    CmdArgs.push_back(Output.getFilename());
472115a79277edababaf1b26e3654044ae983197679Daniel Dunbar  } else {
473115a79277edababaf1b26e3654044ae983197679Daniel Dunbar    assert(Output.isNothing() && "Unexpected output");
474b488c1dac8e53206f07103d794a62a3f5012c0f4Daniel Dunbar    CmdArgs.push_back("-fsyntax-only");
475115a79277edababaf1b26e3654044ae983197679Daniel Dunbar  }
476b488c1dac8e53206f07103d794a62a3f5012c0f4Daniel Dunbar
477b488c1dac8e53206f07103d794a62a3f5012c0f4Daniel Dunbar
478b488c1dac8e53206f07103d794a62a3f5012c0f4Daniel Dunbar  // Only pass -x if gcc will understand it; otherwise hope gcc
479b488c1dac8e53206f07103d794a62a3f5012c0f4Daniel Dunbar  // understands the suffix correctly. The main use case this would go
480b488c1dac8e53206f07103d794a62a3f5012c0f4Daniel Dunbar  // wrong in is for linker inputs if they happened to have an odd
481b488c1dac8e53206f07103d794a62a3f5012c0f4Daniel Dunbar  // suffix; really the only way to get this to happen is a command
482b488c1dac8e53206f07103d794a62a3f5012c0f4Daniel Dunbar  // like '-x foobar a.c' which will treat a.c like a linker input.
483b488c1dac8e53206f07103d794a62a3f5012c0f4Daniel Dunbar  //
484b488c1dac8e53206f07103d794a62a3f5012c0f4Daniel Dunbar  // FIXME: For the linker case specifically, can we safely convert
485b488c1dac8e53206f07103d794a62a3f5012c0f4Daniel Dunbar  // inputs into '-Wl,' options?
486b488c1dac8e53206f07103d794a62a3f5012c0f4Daniel Dunbar  for (InputInfoList::const_iterator
487b488c1dac8e53206f07103d794a62a3f5012c0f4Daniel Dunbar         it = Inputs.begin(), ie = Inputs.end(); it != ie; ++it) {
488b488c1dac8e53206f07103d794a62a3f5012c0f4Daniel Dunbar    const InputInfo &II = *it;
489b488c1dac8e53206f07103d794a62a3f5012c0f4Daniel Dunbar    if (types::canTypeBeUserSpecified(II.getType())) {
490b488c1dac8e53206f07103d794a62a3f5012c0f4Daniel Dunbar      CmdArgs.push_back("-x");
491b488c1dac8e53206f07103d794a62a3f5012c0f4Daniel Dunbar      CmdArgs.push_back(types::getTypeName(II.getType()));
492b488c1dac8e53206f07103d794a62a3f5012c0f4Daniel Dunbar    }
493b488c1dac8e53206f07103d794a62a3f5012c0f4Daniel Dunbar
494b488c1dac8e53206f07103d794a62a3f5012c0f4Daniel Dunbar    if (II.isPipe())
495b488c1dac8e53206f07103d794a62a3f5012c0f4Daniel Dunbar      CmdArgs.push_back("-");
496115a79277edababaf1b26e3654044ae983197679Daniel Dunbar    else if (II.isFilename())
497115a79277edababaf1b26e3654044ae983197679Daniel Dunbar      CmdArgs.push_back(II.getFilename());
498b488c1dac8e53206f07103d794a62a3f5012c0f4Daniel Dunbar    else
499115a79277edababaf1b26e3654044ae983197679Daniel Dunbar      // Don't render as input, we need gcc to do the translations.
500115a79277edababaf1b26e3654044ae983197679Daniel Dunbar      II.getInputArg().render(Args, CmdArgs);
501b488c1dac8e53206f07103d794a62a3f5012c0f4Daniel Dunbar  }
502b488c1dac8e53206f07103d794a62a3f5012c0f4Daniel Dunbar
50378d8a089c8f124ba6f47bb37e2c4a36986f60e23Daniel Dunbar  const char *GCCName =
50478d8a089c8f124ba6f47bb37e2c4a36986f60e23Daniel Dunbar    getToolChain().getHost().getDriver().CCCGenericGCCName.c_str();
505632f50edc08c76ebc643a0d4871bae33a55d7b4eDaniel Dunbar  const char *Exec =
50678d8a089c8f124ba6f47bb37e2c4a36986f60e23Daniel Dunbar    Args.MakeArgString(getToolChain().GetProgramPath(C, GCCName).c_str());
507632f50edc08c76ebc643a0d4871bae33a55d7b4eDaniel Dunbar  Dest.addCommand(new Command(Exec, CmdArgs));
50847ac7d27c44bd64a7d0fc03d4babc196cf2b8230Daniel Dunbar}
50947ac7d27c44bd64a7d0fc03d4babc196cf2b8230Daniel Dunbar
510b488c1dac8e53206f07103d794a62a3f5012c0f4Daniel Dunbarvoid gcc::Preprocess::RenderExtraToolArgs(ArgStringList &CmdArgs) const {
511b488c1dac8e53206f07103d794a62a3f5012c0f4Daniel Dunbar  CmdArgs.push_back("-E");
51247ac7d27c44bd64a7d0fc03d4babc196cf2b8230Daniel Dunbar}
51347ac7d27c44bd64a7d0fc03d4babc196cf2b8230Daniel Dunbar
514b488c1dac8e53206f07103d794a62a3f5012c0f4Daniel Dunbarvoid gcc::Precompile::RenderExtraToolArgs(ArgStringList &CmdArgs) const {
515b488c1dac8e53206f07103d794a62a3f5012c0f4Daniel Dunbar  // The type is good enough.
51647ac7d27c44bd64a7d0fc03d4babc196cf2b8230Daniel Dunbar}
51747ac7d27c44bd64a7d0fc03d4babc196cf2b8230Daniel Dunbar
518b488c1dac8e53206f07103d794a62a3f5012c0f4Daniel Dunbarvoid gcc::Compile::RenderExtraToolArgs(ArgStringList &CmdArgs) const {
519b488c1dac8e53206f07103d794a62a3f5012c0f4Daniel Dunbar  CmdArgs.push_back("-S");
52047ac7d27c44bd64a7d0fc03d4babc196cf2b8230Daniel Dunbar}
52147ac7d27c44bd64a7d0fc03d4babc196cf2b8230Daniel Dunbar
522b488c1dac8e53206f07103d794a62a3f5012c0f4Daniel Dunbarvoid gcc::Assemble::RenderExtraToolArgs(ArgStringList &CmdArgs) const {
523b488c1dac8e53206f07103d794a62a3f5012c0f4Daniel Dunbar  CmdArgs.push_back("-c");
524b488c1dac8e53206f07103d794a62a3f5012c0f4Daniel Dunbar}
52547ac7d27c44bd64a7d0fc03d4babc196cf2b8230Daniel Dunbar
526b488c1dac8e53206f07103d794a62a3f5012c0f4Daniel Dunbarvoid gcc::Link::RenderExtraToolArgs(ArgStringList &CmdArgs) const {
527b488c1dac8e53206f07103d794a62a3f5012c0f4Daniel Dunbar  // The types are (hopefully) good enough.
52847ac7d27c44bd64a7d0fc03d4babc196cf2b8230Daniel Dunbar}
529b488c1dac8e53206f07103d794a62a3f5012c0f4Daniel Dunbar
53040f1265ebd42ece3e7f7917319b56012e8e2bce2Daniel Dunbarconst char *darwin::CC1::getCC1Name(types::ID Type) const {
53140f1265ebd42ece3e7f7917319b56012e8e2bce2Daniel Dunbar  switch (Type) {
53240f1265ebd42ece3e7f7917319b56012e8e2bce2Daniel Dunbar  default:
53340f1265ebd42ece3e7f7917319b56012e8e2bce2Daniel Dunbar    assert(0 && "Unexpected type for Darwin CC1 tool.");
53440f1265ebd42ece3e7f7917319b56012e8e2bce2Daniel Dunbar  case types::TY_Asm:
53540f1265ebd42ece3e7f7917319b56012e8e2bce2Daniel Dunbar  case types::TY_C: case types::TY_CHeader:
53640f1265ebd42ece3e7f7917319b56012e8e2bce2Daniel Dunbar  case types::TY_PP_C: case types::TY_PP_CHeader:
53740f1265ebd42ece3e7f7917319b56012e8e2bce2Daniel Dunbar    return "cc1";
53840f1265ebd42ece3e7f7917319b56012e8e2bce2Daniel Dunbar  case types::TY_ObjC: case types::TY_ObjCHeader:
53940f1265ebd42ece3e7f7917319b56012e8e2bce2Daniel Dunbar  case types::TY_PP_ObjC: case types::TY_PP_ObjCHeader:
54040f1265ebd42ece3e7f7917319b56012e8e2bce2Daniel Dunbar    return "cc1obj";
54140f1265ebd42ece3e7f7917319b56012e8e2bce2Daniel Dunbar  case types::TY_CXX: case types::TY_CXXHeader:
54240f1265ebd42ece3e7f7917319b56012e8e2bce2Daniel Dunbar  case types::TY_PP_CXX: case types::TY_PP_CXXHeader:
54340f1265ebd42ece3e7f7917319b56012e8e2bce2Daniel Dunbar    return "cc1plus";
54440f1265ebd42ece3e7f7917319b56012e8e2bce2Daniel Dunbar  case types::TY_ObjCXX: case types::TY_ObjCXXHeader:
54540f1265ebd42ece3e7f7917319b56012e8e2bce2Daniel Dunbar  case types::TY_PP_ObjCXX: case types::TY_PP_ObjCXXHeader:
54640f1265ebd42ece3e7f7917319b56012e8e2bce2Daniel Dunbar    return "cc1objplus";
54740f1265ebd42ece3e7f7917319b56012e8e2bce2Daniel Dunbar  }
54840f1265ebd42ece3e7f7917319b56012e8e2bce2Daniel Dunbar}
54940f1265ebd42ece3e7f7917319b56012e8e2bce2Daniel Dunbar
550a3ec60e0cf2a1916f479288998d31bd980b1a306Daniel Dunbarconst char *darwin::CC1::getBaseInputName(const ArgList &Args,
551a5a7bd0de7b6b80212095195a055a4a43f21d4b2Daniel Dunbar                                          const InputInfoList &Inputs) {
552a3ec60e0cf2a1916f479288998d31bd980b1a306Daniel Dunbar  llvm::sys::Path P(Inputs[0].getBaseInput());
553a3ec60e0cf2a1916f479288998d31bd980b1a306Daniel Dunbar  return Args.MakeArgString(P.getLast().c_str());
554a3ec60e0cf2a1916f479288998d31bd980b1a306Daniel Dunbar}
555a3ec60e0cf2a1916f479288998d31bd980b1a306Daniel Dunbar
556a3ec60e0cf2a1916f479288998d31bd980b1a306Daniel Dunbarconst char *darwin::CC1::getBaseInputStem(const ArgList &Args,
557a5a7bd0de7b6b80212095195a055a4a43f21d4b2Daniel Dunbar                                          const InputInfoList &Inputs) {
558a3ec60e0cf2a1916f479288998d31bd980b1a306Daniel Dunbar  const char *Str = getBaseInputName(Args, Inputs);
559a3ec60e0cf2a1916f479288998d31bd980b1a306Daniel Dunbar
560a3ec60e0cf2a1916f479288998d31bd980b1a306Daniel Dunbar  if (const char *End = strchr(Str, '.'))
561a3ec60e0cf2a1916f479288998d31bd980b1a306Daniel Dunbar    return Args.MakeArgString(std::string(Str, End).c_str());
562a3ec60e0cf2a1916f479288998d31bd980b1a306Daniel Dunbar
563a3ec60e0cf2a1916f479288998d31bd980b1a306Daniel Dunbar  return Str;
564a3ec60e0cf2a1916f479288998d31bd980b1a306Daniel Dunbar}
565a3ec60e0cf2a1916f479288998d31bd980b1a306Daniel Dunbar
566a3ec60e0cf2a1916f479288998d31bd980b1a306Daniel Dunbarconst char *
567a3ec60e0cf2a1916f479288998d31bd980b1a306Daniel Dunbardarwin::CC1::getDependencyFileName(const ArgList &Args,
568a5a7bd0de7b6b80212095195a055a4a43f21d4b2Daniel Dunbar                                   const InputInfoList &Inputs) {
569a3ec60e0cf2a1916f479288998d31bd980b1a306Daniel Dunbar  // FIXME: Think about this more.
570a3ec60e0cf2a1916f479288998d31bd980b1a306Daniel Dunbar  std::string Res;
571a3ec60e0cf2a1916f479288998d31bd980b1a306Daniel Dunbar
572a3ec60e0cf2a1916f479288998d31bd980b1a306Daniel Dunbar  if (Arg *OutputOpt = Args.getLastArg(options::OPT_o)) {
573a3ec60e0cf2a1916f479288998d31bd980b1a306Daniel Dunbar    std::string Str(OutputOpt->getValue(Args));
574a3ec60e0cf2a1916f479288998d31bd980b1a306Daniel Dunbar
575a3ec60e0cf2a1916f479288998d31bd980b1a306Daniel Dunbar    Res = Str.substr(0, Str.rfind('.'));
576a3ec60e0cf2a1916f479288998d31bd980b1a306Daniel Dunbar  } else
577a5a7bd0de7b6b80212095195a055a4a43f21d4b2Daniel Dunbar    Res = darwin::CC1::getBaseInputStem(Args, Inputs);
578a3ec60e0cf2a1916f479288998d31bd980b1a306Daniel Dunbar
579a3ec60e0cf2a1916f479288998d31bd980b1a306Daniel Dunbar  return Args.MakeArgString((Res + ".d").c_str());
580a3ec60e0cf2a1916f479288998d31bd980b1a306Daniel Dunbar}
581a3ec60e0cf2a1916f479288998d31bd980b1a306Daniel Dunbar
582a3ec60e0cf2a1916f479288998d31bd980b1a306Daniel Dunbarvoid darwin::CC1::AddCC1Args(const ArgList &Args,
583a3ec60e0cf2a1916f479288998d31bd980b1a306Daniel Dunbar                             ArgStringList &CmdArgs) const {
584a3ec60e0cf2a1916f479288998d31bd980b1a306Daniel Dunbar  // Derived from cc1 spec.
585a3ec60e0cf2a1916f479288998d31bd980b1a306Daniel Dunbar
586a3ec60e0cf2a1916f479288998d31bd980b1a306Daniel Dunbar  // FIXME: -fapple-kext seems to disable this too. Investigate.
587a3ec60e0cf2a1916f479288998d31bd980b1a306Daniel Dunbar  if (!Args.hasArg(options::OPT_mkernel) && !Args.hasArg(options::OPT_static) &&
588a3ec60e0cf2a1916f479288998d31bd980b1a306Daniel Dunbar      !Args.hasArg(options::OPT_mdynamic_no_pic))
589a3ec60e0cf2a1916f479288998d31bd980b1a306Daniel Dunbar    CmdArgs.push_back("-fPIC");
590a3ec60e0cf2a1916f479288998d31bd980b1a306Daniel Dunbar
591a3ec60e0cf2a1916f479288998d31bd980b1a306Daniel Dunbar  // gcc has some code here to deal with when no -mmacosx-version-min
592a3ec60e0cf2a1916f479288998d31bd980b1a306Daniel Dunbar  // and no -miphoneos-version-min is present, but this never happens
593a3ec60e0cf2a1916f479288998d31bd980b1a306Daniel Dunbar  // due to tool chain specific argument translation.
594a3ec60e0cf2a1916f479288998d31bd980b1a306Daniel Dunbar
595a3ec60e0cf2a1916f479288998d31bd980b1a306Daniel Dunbar  // FIXME: Remove mthumb
596a3ec60e0cf2a1916f479288998d31bd980b1a306Daniel Dunbar  // FIXME: Remove mno-thumb
597a3ec60e0cf2a1916f479288998d31bd980b1a306Daniel Dunbar  // FIXME: Remove faltivec
598a3ec60e0cf2a1916f479288998d31bd980b1a306Daniel Dunbar  // FIXME: Remove mno-fused-madd
599a3ec60e0cf2a1916f479288998d31bd980b1a306Daniel Dunbar  // FIXME: Remove mlong-branch
600a3ec60e0cf2a1916f479288998d31bd980b1a306Daniel Dunbar  // FIXME: Remove mlongcall
601a3ec60e0cf2a1916f479288998d31bd980b1a306Daniel Dunbar  // FIXME: Remove mcpu=G4
602a3ec60e0cf2a1916f479288998d31bd980b1a306Daniel Dunbar  // FIXME: Remove mcpu=G5
603a3ec60e0cf2a1916f479288998d31bd980b1a306Daniel Dunbar
604a3ec60e0cf2a1916f479288998d31bd980b1a306Daniel Dunbar  if (Args.hasArg(options::OPT_g_Flag) &&
605a3ec60e0cf2a1916f479288998d31bd980b1a306Daniel Dunbar      !Args.hasArg(options::OPT_fno_eliminate_unused_debug_symbols))
606a3ec60e0cf2a1916f479288998d31bd980b1a306Daniel Dunbar    CmdArgs.push_back("-feliminate-unused-debug-symbols");
607a3ec60e0cf2a1916f479288998d31bd980b1a306Daniel Dunbar}
608a3ec60e0cf2a1916f479288998d31bd980b1a306Daniel Dunbar
609a3ec60e0cf2a1916f479288998d31bd980b1a306Daniel Dunbarvoid darwin::CC1::AddCC1OptionsArgs(const ArgList &Args, ArgStringList &CmdArgs,
610a3ec60e0cf2a1916f479288998d31bd980b1a306Daniel Dunbar                                    const InputInfoList &Inputs,
611a3ec60e0cf2a1916f479288998d31bd980b1a306Daniel Dunbar                                    const ArgStringList &OutputArgs) const {
612a3ec60e0cf2a1916f479288998d31bd980b1a306Daniel Dunbar  const Driver &D = getToolChain().getHost().getDriver();
613a3ec60e0cf2a1916f479288998d31bd980b1a306Daniel Dunbar
614a3ec60e0cf2a1916f479288998d31bd980b1a306Daniel Dunbar  // Derived from cc1_options spec.
615a3ec60e0cf2a1916f479288998d31bd980b1a306Daniel Dunbar  if (Args.hasArg(options::OPT_fast) ||
616a3ec60e0cf2a1916f479288998d31bd980b1a306Daniel Dunbar      Args.hasArg(options::OPT_fastf) ||
617a3ec60e0cf2a1916f479288998d31bd980b1a306Daniel Dunbar      Args.hasArg(options::OPT_fastcp))
618a3ec60e0cf2a1916f479288998d31bd980b1a306Daniel Dunbar    CmdArgs.push_back("-O3");
619a3ec60e0cf2a1916f479288998d31bd980b1a306Daniel Dunbar
620a3ec60e0cf2a1916f479288998d31bd980b1a306Daniel Dunbar  if (Arg *A = Args.getLastArg(options::OPT_pg))
621a3ec60e0cf2a1916f479288998d31bd980b1a306Daniel Dunbar    if (Args.hasArg(options::OPT_fomit_frame_pointer))
622a3ec60e0cf2a1916f479288998d31bd980b1a306Daniel Dunbar      D.Diag(clang::diag::err_drv_argument_not_allowed_with)
623a3ec60e0cf2a1916f479288998d31bd980b1a306Daniel Dunbar        << A->getAsString(Args) << "-fomit-frame-pointer";
624a3ec60e0cf2a1916f479288998d31bd980b1a306Daniel Dunbar
625a3ec60e0cf2a1916f479288998d31bd980b1a306Daniel Dunbar  AddCC1Args(Args, CmdArgs);
626a3ec60e0cf2a1916f479288998d31bd980b1a306Daniel Dunbar
627a3ec60e0cf2a1916f479288998d31bd980b1a306Daniel Dunbar  if (!Args.hasArg(options::OPT_Q))
628a3ec60e0cf2a1916f479288998d31bd980b1a306Daniel Dunbar    CmdArgs.push_back("-quiet");
629a3ec60e0cf2a1916f479288998d31bd980b1a306Daniel Dunbar
630a3ec60e0cf2a1916f479288998d31bd980b1a306Daniel Dunbar  CmdArgs.push_back("-dumpbase");
631a5a7bd0de7b6b80212095195a055a4a43f21d4b2Daniel Dunbar  CmdArgs.push_back(darwin::CC1::getBaseInputName(Args, Inputs));
632a3ec60e0cf2a1916f479288998d31bd980b1a306Daniel Dunbar
633a3ec60e0cf2a1916f479288998d31bd980b1a306Daniel Dunbar  Args.AddAllArgs(CmdArgs, options::OPT_d_Group);
634a3ec60e0cf2a1916f479288998d31bd980b1a306Daniel Dunbar
635a3ec60e0cf2a1916f479288998d31bd980b1a306Daniel Dunbar  Args.AddAllArgs(CmdArgs, options::OPT_m_Group);
636a3ec60e0cf2a1916f479288998d31bd980b1a306Daniel Dunbar  Args.AddAllArgs(CmdArgs, options::OPT_a_Group);
637a3ec60e0cf2a1916f479288998d31bd980b1a306Daniel Dunbar
638a3ec60e0cf2a1916f479288998d31bd980b1a306Daniel Dunbar  // FIXME: The goal is to use the user provided -o if that is our
639a3ec60e0cf2a1916f479288998d31bd980b1a306Daniel Dunbar  // final output, otherwise to drive from the original input
640a3ec60e0cf2a1916f479288998d31bd980b1a306Daniel Dunbar  // name. Find a clean way to go about this.
641a3ec60e0cf2a1916f479288998d31bd980b1a306Daniel Dunbar  if ((Args.hasArg(options::OPT_c) || Args.hasArg(options::OPT_S)) &&
642a3ec60e0cf2a1916f479288998d31bd980b1a306Daniel Dunbar      Args.hasArg(options::OPT_o)) {
643a3ec60e0cf2a1916f479288998d31bd980b1a306Daniel Dunbar    Arg *OutputOpt = Args.getLastArg(options::OPT_o);
644a3ec60e0cf2a1916f479288998d31bd980b1a306Daniel Dunbar    CmdArgs.push_back("-auxbase-strip");
645a3ec60e0cf2a1916f479288998d31bd980b1a306Daniel Dunbar    CmdArgs.push_back(OutputOpt->getValue(Args));
646a3ec60e0cf2a1916f479288998d31bd980b1a306Daniel Dunbar  } else {
647a3ec60e0cf2a1916f479288998d31bd980b1a306Daniel Dunbar    CmdArgs.push_back("-auxbase");
648a5a7bd0de7b6b80212095195a055a4a43f21d4b2Daniel Dunbar    CmdArgs.push_back(darwin::CC1::getBaseInputStem(Args, Inputs));
649a3ec60e0cf2a1916f479288998d31bd980b1a306Daniel Dunbar  }
650a3ec60e0cf2a1916f479288998d31bd980b1a306Daniel Dunbar
651a3ec60e0cf2a1916f479288998d31bd980b1a306Daniel Dunbar  Args.AddAllArgs(CmdArgs, options::OPT_g_Group);
652a3ec60e0cf2a1916f479288998d31bd980b1a306Daniel Dunbar
653a3ec60e0cf2a1916f479288998d31bd980b1a306Daniel Dunbar  Args.AddAllArgs(CmdArgs, options::OPT_O);
654a3ec60e0cf2a1916f479288998d31bd980b1a306Daniel Dunbar  // FIXME: -Wall is getting some special treatment. Investigate.
655a3ec60e0cf2a1916f479288998d31bd980b1a306Daniel Dunbar  Args.AddAllArgs(CmdArgs, options::OPT_W_Group, options::OPT_pedantic_Group);
656a3ec60e0cf2a1916f479288998d31bd980b1a306Daniel Dunbar  Args.AddLastArg(CmdArgs, options::OPT_w);
657a3ec60e0cf2a1916f479288998d31bd980b1a306Daniel Dunbar  Args.AddAllArgs(CmdArgs, options::OPT_std_EQ, options::OPT_ansi,
658a3ec60e0cf2a1916f479288998d31bd980b1a306Daniel Dunbar                  options::OPT_trigraphs);
659a3ec60e0cf2a1916f479288998d31bd980b1a306Daniel Dunbar  if (Args.hasArg(options::OPT_v))
660a3ec60e0cf2a1916f479288998d31bd980b1a306Daniel Dunbar    CmdArgs.push_back("-version");
661a3ec60e0cf2a1916f479288998d31bd980b1a306Daniel Dunbar  if (Args.hasArg(options::OPT_pg))
662a3ec60e0cf2a1916f479288998d31bd980b1a306Daniel Dunbar    CmdArgs.push_back("-p");
663a3ec60e0cf2a1916f479288998d31bd980b1a306Daniel Dunbar  Args.AddLastArg(CmdArgs, options::OPT_p);
664a3ec60e0cf2a1916f479288998d31bd980b1a306Daniel Dunbar
665a3ec60e0cf2a1916f479288998d31bd980b1a306Daniel Dunbar  // The driver treats -fsyntax-only specially.
666a3ec60e0cf2a1916f479288998d31bd980b1a306Daniel Dunbar  Args.AddAllArgs(CmdArgs, options::OPT_f_Group, options::OPT_fsyntax_only);
667a3ec60e0cf2a1916f479288998d31bd980b1a306Daniel Dunbar
668a3ec60e0cf2a1916f479288998d31bd980b1a306Daniel Dunbar  Args.AddAllArgs(CmdArgs, options::OPT_undef);
669a3ec60e0cf2a1916f479288998d31bd980b1a306Daniel Dunbar  if (Args.hasArg(options::OPT_Qn))
670a3ec60e0cf2a1916f479288998d31bd980b1a306Daniel Dunbar    CmdArgs.push_back("-fno-ident");
671a3ec60e0cf2a1916f479288998d31bd980b1a306Daniel Dunbar
672a3ec60e0cf2a1916f479288998d31bd980b1a306Daniel Dunbar  // FIXME: This isn't correct.
673a3ec60e0cf2a1916f479288998d31bd980b1a306Daniel Dunbar  //Args.AddLastArg(CmdArgs, options::OPT__help)
674a3ec60e0cf2a1916f479288998d31bd980b1a306Daniel Dunbar  //Args.AddLastArg(CmdArgs, options::OPT__targetHelp)
675a3ec60e0cf2a1916f479288998d31bd980b1a306Daniel Dunbar
676a3ec60e0cf2a1916f479288998d31bd980b1a306Daniel Dunbar  CmdArgs.append(OutputArgs.begin(), OutputArgs.end());
677a3ec60e0cf2a1916f479288998d31bd980b1a306Daniel Dunbar
678a3ec60e0cf2a1916f479288998d31bd980b1a306Daniel Dunbar  // FIXME: Still don't get what is happening here. Investigate.
679a3ec60e0cf2a1916f479288998d31bd980b1a306Daniel Dunbar  Args.AddAllArgs(CmdArgs, options::OPT__param);
680a3ec60e0cf2a1916f479288998d31bd980b1a306Daniel Dunbar
681a3ec60e0cf2a1916f479288998d31bd980b1a306Daniel Dunbar  if (Args.hasArg(options::OPT_fmudflap) ||
682a3ec60e0cf2a1916f479288998d31bd980b1a306Daniel Dunbar      Args.hasArg(options::OPT_fmudflapth)) {
683a3ec60e0cf2a1916f479288998d31bd980b1a306Daniel Dunbar    CmdArgs.push_back("-fno-builtin");
684a3ec60e0cf2a1916f479288998d31bd980b1a306Daniel Dunbar    CmdArgs.push_back("-fno-merge-constants");
685a3ec60e0cf2a1916f479288998d31bd980b1a306Daniel Dunbar  }
686a3ec60e0cf2a1916f479288998d31bd980b1a306Daniel Dunbar
687a3ec60e0cf2a1916f479288998d31bd980b1a306Daniel Dunbar  if (Args.hasArg(options::OPT_coverage)) {
688a3ec60e0cf2a1916f479288998d31bd980b1a306Daniel Dunbar    CmdArgs.push_back("-fprofile-arcs");
689a3ec60e0cf2a1916f479288998d31bd980b1a306Daniel Dunbar    CmdArgs.push_back("-ftest-coverage");
690a3ec60e0cf2a1916f479288998d31bd980b1a306Daniel Dunbar  }
691a3ec60e0cf2a1916f479288998d31bd980b1a306Daniel Dunbar
692a3ec60e0cf2a1916f479288998d31bd980b1a306Daniel Dunbar  if (types::isCXX(Inputs[0].getType()))
693a3ec60e0cf2a1916f479288998d31bd980b1a306Daniel Dunbar    CmdArgs.push_back("-D__private_extern__=extern");
694a3ec60e0cf2a1916f479288998d31bd980b1a306Daniel Dunbar}
695a3ec60e0cf2a1916f479288998d31bd980b1a306Daniel Dunbar
696a3ec60e0cf2a1916f479288998d31bd980b1a306Daniel Dunbarvoid darwin::CC1::AddCPPOptionsArgs(const ArgList &Args, ArgStringList &CmdArgs,
697a3ec60e0cf2a1916f479288998d31bd980b1a306Daniel Dunbar                                    const InputInfoList &Inputs,
698a3ec60e0cf2a1916f479288998d31bd980b1a306Daniel Dunbar                                    const ArgStringList &OutputArgs) const {
699a3ec60e0cf2a1916f479288998d31bd980b1a306Daniel Dunbar  // Derived from cpp_options
700a3ec60e0cf2a1916f479288998d31bd980b1a306Daniel Dunbar  AddCPPUniqueOptionsArgs(Args, CmdArgs, Inputs);
701a3ec60e0cf2a1916f479288998d31bd980b1a306Daniel Dunbar
702a3ec60e0cf2a1916f479288998d31bd980b1a306Daniel Dunbar  CmdArgs.append(OutputArgs.begin(), OutputArgs.end());
703a3ec60e0cf2a1916f479288998d31bd980b1a306Daniel Dunbar
704a3ec60e0cf2a1916f479288998d31bd980b1a306Daniel Dunbar  AddCC1Args(Args, CmdArgs);
705a3ec60e0cf2a1916f479288998d31bd980b1a306Daniel Dunbar
706a3ec60e0cf2a1916f479288998d31bd980b1a306Daniel Dunbar  // NOTE: The code below has some commonality with cpp_options, but
707a3ec60e0cf2a1916f479288998d31bd980b1a306Daniel Dunbar  // in classic gcc style ends up sending things in different
708a3ec60e0cf2a1916f479288998d31bd980b1a306Daniel Dunbar  // orders. This may be a good merge candidate once we drop pedantic
709a3ec60e0cf2a1916f479288998d31bd980b1a306Daniel Dunbar  // compatibility.
710a3ec60e0cf2a1916f479288998d31bd980b1a306Daniel Dunbar
711a3ec60e0cf2a1916f479288998d31bd980b1a306Daniel Dunbar  Args.AddAllArgs(CmdArgs, options::OPT_m_Group);
712a3ec60e0cf2a1916f479288998d31bd980b1a306Daniel Dunbar  Args.AddAllArgs(CmdArgs, options::OPT_std_EQ, options::OPT_ansi,
713a3ec60e0cf2a1916f479288998d31bd980b1a306Daniel Dunbar                  options::OPT_trigraphs);
714a3ec60e0cf2a1916f479288998d31bd980b1a306Daniel Dunbar  Args.AddAllArgs(CmdArgs, options::OPT_W_Group, options::OPT_pedantic_Group);
715a3ec60e0cf2a1916f479288998d31bd980b1a306Daniel Dunbar  Args.AddLastArg(CmdArgs, options::OPT_w);
716a3ec60e0cf2a1916f479288998d31bd980b1a306Daniel Dunbar
717a3ec60e0cf2a1916f479288998d31bd980b1a306Daniel Dunbar  // The driver treats -fsyntax-only specially.
718a3ec60e0cf2a1916f479288998d31bd980b1a306Daniel Dunbar  Args.AddAllArgs(CmdArgs, options::OPT_f_Group, options::OPT_fsyntax_only);
719a3ec60e0cf2a1916f479288998d31bd980b1a306Daniel Dunbar
720a3ec60e0cf2a1916f479288998d31bd980b1a306Daniel Dunbar  if (Args.hasArg(options::OPT_g_Group) && !Args.hasArg(options::OPT_g0) &&
721a3ec60e0cf2a1916f479288998d31bd980b1a306Daniel Dunbar      !Args.hasArg(options::OPT_fno_working_directory))
722a3ec60e0cf2a1916f479288998d31bd980b1a306Daniel Dunbar    CmdArgs.push_back("-fworking-directory");
723a3ec60e0cf2a1916f479288998d31bd980b1a306Daniel Dunbar
724a3ec60e0cf2a1916f479288998d31bd980b1a306Daniel Dunbar  Args.AddAllArgs(CmdArgs, options::OPT_O);
725a3ec60e0cf2a1916f479288998d31bd980b1a306Daniel Dunbar  Args.AddAllArgs(CmdArgs, options::OPT_undef);
726a3ec60e0cf2a1916f479288998d31bd980b1a306Daniel Dunbar  if (Args.hasArg(options::OPT_save_temps))
727a3ec60e0cf2a1916f479288998d31bd980b1a306Daniel Dunbar    CmdArgs.push_back("-fpch-preprocess");
728a3ec60e0cf2a1916f479288998d31bd980b1a306Daniel Dunbar}
729a3ec60e0cf2a1916f479288998d31bd980b1a306Daniel Dunbar
730a3ec60e0cf2a1916f479288998d31bd980b1a306Daniel Dunbarvoid darwin::CC1::AddCPPUniqueOptionsArgs(const ArgList &Args,
731a3ec60e0cf2a1916f479288998d31bd980b1a306Daniel Dunbar                                          ArgStringList &CmdArgs,
732a3ec60e0cf2a1916f479288998d31bd980b1a306Daniel Dunbar                                          const InputInfoList &Inputs) const
733a3ec60e0cf2a1916f479288998d31bd980b1a306Daniel Dunbar{
734a3ec60e0cf2a1916f479288998d31bd980b1a306Daniel Dunbar  const Driver &D = getToolChain().getHost().getDriver();
735a3ec60e0cf2a1916f479288998d31bd980b1a306Daniel Dunbar
736a3ec60e0cf2a1916f479288998d31bd980b1a306Daniel Dunbar  // Derived from cpp_unique_options.
737a3ec60e0cf2a1916f479288998d31bd980b1a306Daniel Dunbar  Arg *A;
738a3ec60e0cf2a1916f479288998d31bd980b1a306Daniel Dunbar  if ((A = Args.getLastArg(options::OPT_C)) ||
739a3ec60e0cf2a1916f479288998d31bd980b1a306Daniel Dunbar      (A = Args.getLastArg(options::OPT_CC))) {
740a3ec60e0cf2a1916f479288998d31bd980b1a306Daniel Dunbar    if (!Args.hasArg(options::OPT_E))
741a3ec60e0cf2a1916f479288998d31bd980b1a306Daniel Dunbar      D.Diag(clang::diag::err_drv_argument_only_allowed_with)
742a3ec60e0cf2a1916f479288998d31bd980b1a306Daniel Dunbar        << A->getAsString(Args) << "-E";
743a3ec60e0cf2a1916f479288998d31bd980b1a306Daniel Dunbar  }
744a3ec60e0cf2a1916f479288998d31bd980b1a306Daniel Dunbar  if (!Args.hasArg(options::OPT_Q))
745a3ec60e0cf2a1916f479288998d31bd980b1a306Daniel Dunbar    CmdArgs.push_back("-quiet");
746a3ec60e0cf2a1916f479288998d31bd980b1a306Daniel Dunbar  Args.AddAllArgs(CmdArgs, options::OPT_nostdinc);
747a3ec60e0cf2a1916f479288998d31bd980b1a306Daniel Dunbar  Args.AddLastArg(CmdArgs, options::OPT_v);
748a3ec60e0cf2a1916f479288998d31bd980b1a306Daniel Dunbar  Args.AddAllArgs(CmdArgs, options::OPT_I_Group, options::OPT_F);
749a3ec60e0cf2a1916f479288998d31bd980b1a306Daniel Dunbar  Args.AddLastArg(CmdArgs, options::OPT_P);
750a3ec60e0cf2a1916f479288998d31bd980b1a306Daniel Dunbar
751a3ec60e0cf2a1916f479288998d31bd980b1a306Daniel Dunbar  // FIXME: Handle %I properly.
752a3ec60e0cf2a1916f479288998d31bd980b1a306Daniel Dunbar  if (getToolChain().getArchName() == "x86_64") {
753a3ec60e0cf2a1916f479288998d31bd980b1a306Daniel Dunbar    CmdArgs.push_back("-imultilib");
754a3ec60e0cf2a1916f479288998d31bd980b1a306Daniel Dunbar    CmdArgs.push_back("x86_64");
755a3ec60e0cf2a1916f479288998d31bd980b1a306Daniel Dunbar  }
756a3ec60e0cf2a1916f479288998d31bd980b1a306Daniel Dunbar
757a3ec60e0cf2a1916f479288998d31bd980b1a306Daniel Dunbar  if (Args.hasArg(options::OPT_MD)) {
758a3ec60e0cf2a1916f479288998d31bd980b1a306Daniel Dunbar    CmdArgs.push_back("-MD");
759a5a7bd0de7b6b80212095195a055a4a43f21d4b2Daniel Dunbar    CmdArgs.push_back(darwin::CC1::getDependencyFileName(Args, Inputs));
760a3ec60e0cf2a1916f479288998d31bd980b1a306Daniel Dunbar  }
761a3ec60e0cf2a1916f479288998d31bd980b1a306Daniel Dunbar
762a3ec60e0cf2a1916f479288998d31bd980b1a306Daniel Dunbar  if (Args.hasArg(options::OPT_MMD)) {
763a3ec60e0cf2a1916f479288998d31bd980b1a306Daniel Dunbar    CmdArgs.push_back("-MMD");
764a5a7bd0de7b6b80212095195a055a4a43f21d4b2Daniel Dunbar    CmdArgs.push_back(darwin::CC1::getDependencyFileName(Args, Inputs));
765a3ec60e0cf2a1916f479288998d31bd980b1a306Daniel Dunbar  }
766a3ec60e0cf2a1916f479288998d31bd980b1a306Daniel Dunbar
767a3ec60e0cf2a1916f479288998d31bd980b1a306Daniel Dunbar  Args.AddLastArg(CmdArgs, options::OPT_M);
768a3ec60e0cf2a1916f479288998d31bd980b1a306Daniel Dunbar  Args.AddLastArg(CmdArgs, options::OPT_MM);
769a3ec60e0cf2a1916f479288998d31bd980b1a306Daniel Dunbar  Args.AddAllArgs(CmdArgs, options::OPT_MF);
770a3ec60e0cf2a1916f479288998d31bd980b1a306Daniel Dunbar  Args.AddLastArg(CmdArgs, options::OPT_MG);
771a3ec60e0cf2a1916f479288998d31bd980b1a306Daniel Dunbar  Args.AddLastArg(CmdArgs, options::OPT_MP);
772a3ec60e0cf2a1916f479288998d31bd980b1a306Daniel Dunbar  Args.AddAllArgs(CmdArgs, options::OPT_MQ);
773a3ec60e0cf2a1916f479288998d31bd980b1a306Daniel Dunbar  Args.AddAllArgs(CmdArgs, options::OPT_MT);
774a3ec60e0cf2a1916f479288998d31bd980b1a306Daniel Dunbar  if (!Args.hasArg(options::OPT_M) && !Args.hasArg(options::OPT_MM) &&
775a3ec60e0cf2a1916f479288998d31bd980b1a306Daniel Dunbar      (Args.hasArg(options::OPT_MD) || Args.hasArg(options::OPT_MMD))) {
776a3ec60e0cf2a1916f479288998d31bd980b1a306Daniel Dunbar    if (Arg *OutputOpt = Args.getLastArg(options::OPT_o)) {
777a3ec60e0cf2a1916f479288998d31bd980b1a306Daniel Dunbar      CmdArgs.push_back("-MQ");
778a3ec60e0cf2a1916f479288998d31bd980b1a306Daniel Dunbar      CmdArgs.push_back(OutputOpt->getValue(Args));
779a3ec60e0cf2a1916f479288998d31bd980b1a306Daniel Dunbar    }
780a3ec60e0cf2a1916f479288998d31bd980b1a306Daniel Dunbar  }
781a3ec60e0cf2a1916f479288998d31bd980b1a306Daniel Dunbar
782a3ec60e0cf2a1916f479288998d31bd980b1a306Daniel Dunbar  Args.AddLastArg(CmdArgs, options::OPT_remap);
783a3ec60e0cf2a1916f479288998d31bd980b1a306Daniel Dunbar  if (Args.hasArg(options::OPT_g3))
784a3ec60e0cf2a1916f479288998d31bd980b1a306Daniel Dunbar    CmdArgs.push_back("-dD");
785a3ec60e0cf2a1916f479288998d31bd980b1a306Daniel Dunbar  Args.AddLastArg(CmdArgs, options::OPT_H);
786a3ec60e0cf2a1916f479288998d31bd980b1a306Daniel Dunbar
787a3ec60e0cf2a1916f479288998d31bd980b1a306Daniel Dunbar  AddCPPArgs(Args, CmdArgs);
788a3ec60e0cf2a1916f479288998d31bd980b1a306Daniel Dunbar
789a3ec60e0cf2a1916f479288998d31bd980b1a306Daniel Dunbar  Args.AddAllArgs(CmdArgs, options::OPT_D, options::OPT_U, options::OPT_A);
790a3ec60e0cf2a1916f479288998d31bd980b1a306Daniel Dunbar  Args.AddAllArgs(CmdArgs, options::OPT_i_Group);
791a3ec60e0cf2a1916f479288998d31bd980b1a306Daniel Dunbar
792a3ec60e0cf2a1916f479288998d31bd980b1a306Daniel Dunbar  for (InputInfoList::const_iterator
793a3ec60e0cf2a1916f479288998d31bd980b1a306Daniel Dunbar         it = Inputs.begin(), ie = Inputs.end(); it != ie; ++it) {
794a3ec60e0cf2a1916f479288998d31bd980b1a306Daniel Dunbar    const InputInfo &II = *it;
795a3ec60e0cf2a1916f479288998d31bd980b1a306Daniel Dunbar
796a3ec60e0cf2a1916f479288998d31bd980b1a306Daniel Dunbar    if (II.isPipe())
797a3ec60e0cf2a1916f479288998d31bd980b1a306Daniel Dunbar      CmdArgs.push_back("-");
798a3ec60e0cf2a1916f479288998d31bd980b1a306Daniel Dunbar    else
799a3ec60e0cf2a1916f479288998d31bd980b1a306Daniel Dunbar      CmdArgs.push_back(II.getFilename());
800a3ec60e0cf2a1916f479288998d31bd980b1a306Daniel Dunbar  }
801a3ec60e0cf2a1916f479288998d31bd980b1a306Daniel Dunbar
802a3ec60e0cf2a1916f479288998d31bd980b1a306Daniel Dunbar  Args.AddAllArgValues(CmdArgs, options::OPT_Wp_COMMA,
803a3ec60e0cf2a1916f479288998d31bd980b1a306Daniel Dunbar                       options::OPT_Xpreprocessor);
804a3ec60e0cf2a1916f479288998d31bd980b1a306Daniel Dunbar
805a3ec60e0cf2a1916f479288998d31bd980b1a306Daniel Dunbar  if (Args.hasArg(options::OPT_fmudflap)) {
806a3ec60e0cf2a1916f479288998d31bd980b1a306Daniel Dunbar    CmdArgs.push_back("-D_MUDFLAP");
807a3ec60e0cf2a1916f479288998d31bd980b1a306Daniel Dunbar    CmdArgs.push_back("-include");
808a3ec60e0cf2a1916f479288998d31bd980b1a306Daniel Dunbar    CmdArgs.push_back("mf-runtime.h");
809a3ec60e0cf2a1916f479288998d31bd980b1a306Daniel Dunbar  }
810a3ec60e0cf2a1916f479288998d31bd980b1a306Daniel Dunbar
811a3ec60e0cf2a1916f479288998d31bd980b1a306Daniel Dunbar  if (Args.hasArg(options::OPT_fmudflapth)) {
812a3ec60e0cf2a1916f479288998d31bd980b1a306Daniel Dunbar    CmdArgs.push_back("-D_MUDFLAP");
813a3ec60e0cf2a1916f479288998d31bd980b1a306Daniel Dunbar    CmdArgs.push_back("-D_MUDFLAPTH");
814a3ec60e0cf2a1916f479288998d31bd980b1a306Daniel Dunbar    CmdArgs.push_back("-include");
815a3ec60e0cf2a1916f479288998d31bd980b1a306Daniel Dunbar    CmdArgs.push_back("mf-runtime.h");
816a3ec60e0cf2a1916f479288998d31bd980b1a306Daniel Dunbar  }
817a3ec60e0cf2a1916f479288998d31bd980b1a306Daniel Dunbar}
818a3ec60e0cf2a1916f479288998d31bd980b1a306Daniel Dunbar
819a3ec60e0cf2a1916f479288998d31bd980b1a306Daniel Dunbarvoid darwin::CC1::AddCPPArgs(const ArgList &Args,
820a3ec60e0cf2a1916f479288998d31bd980b1a306Daniel Dunbar                             ArgStringList &CmdArgs) const {
821a3ec60e0cf2a1916f479288998d31bd980b1a306Daniel Dunbar  // Derived from cpp spec.
822a3ec60e0cf2a1916f479288998d31bd980b1a306Daniel Dunbar
823a3ec60e0cf2a1916f479288998d31bd980b1a306Daniel Dunbar  if (Args.hasArg(options::OPT_static)) {
824a3ec60e0cf2a1916f479288998d31bd980b1a306Daniel Dunbar    // The gcc spec is broken here, it refers to dynamic but
825a3ec60e0cf2a1916f479288998d31bd980b1a306Daniel Dunbar    // that has been translated. Start by being bug compatible.
826a3ec60e0cf2a1916f479288998d31bd980b1a306Daniel Dunbar
827a3ec60e0cf2a1916f479288998d31bd980b1a306Daniel Dunbar    // if (!Args.hasArg(arglist.parser.dynamicOption))
828a3ec60e0cf2a1916f479288998d31bd980b1a306Daniel Dunbar    CmdArgs.push_back("-D__STATIC__");
829a3ec60e0cf2a1916f479288998d31bd980b1a306Daniel Dunbar  } else
830a3ec60e0cf2a1916f479288998d31bd980b1a306Daniel Dunbar    CmdArgs.push_back("-D__DYNAMIC__");
831a3ec60e0cf2a1916f479288998d31bd980b1a306Daniel Dunbar
832a3ec60e0cf2a1916f479288998d31bd980b1a306Daniel Dunbar  if (Args.hasArg(options::OPT_pthread))
833a3ec60e0cf2a1916f479288998d31bd980b1a306Daniel Dunbar    CmdArgs.push_back("-D_REENTRANT");
834a3ec60e0cf2a1916f479288998d31bd980b1a306Daniel Dunbar}
835a3ec60e0cf2a1916f479288998d31bd980b1a306Daniel Dunbar
83640f1265ebd42ece3e7f7917319b56012e8e2bce2Daniel Dunbarvoid darwin::Preprocess::ConstructJob(Compilation &C, const JobAction &JA,
83740f1265ebd42ece3e7f7917319b56012e8e2bce2Daniel Dunbar                                      Job &Dest, const InputInfo &Output,
83840f1265ebd42ece3e7f7917319b56012e8e2bce2Daniel Dunbar                                      const InputInfoList &Inputs,
83940f1265ebd42ece3e7f7917319b56012e8e2bce2Daniel Dunbar                                      const ArgList &Args,
84040f1265ebd42ece3e7f7917319b56012e8e2bce2Daniel Dunbar                                      const char *LinkingOutput) const {
84140f1265ebd42ece3e7f7917319b56012e8e2bce2Daniel Dunbar  ArgStringList CmdArgs;
84240f1265ebd42ece3e7f7917319b56012e8e2bce2Daniel Dunbar
84340f1265ebd42ece3e7f7917319b56012e8e2bce2Daniel Dunbar  assert(Inputs.size() == 1 && "Unexpected number of inputs!");
84440f1265ebd42ece3e7f7917319b56012e8e2bce2Daniel Dunbar
84540f1265ebd42ece3e7f7917319b56012e8e2bce2Daniel Dunbar  CmdArgs.push_back("-E");
84640f1265ebd42ece3e7f7917319b56012e8e2bce2Daniel Dunbar
84740f1265ebd42ece3e7f7917319b56012e8e2bce2Daniel Dunbar  if (Args.hasArg(options::OPT_traditional) ||
84840f1265ebd42ece3e7f7917319b56012e8e2bce2Daniel Dunbar      Args.hasArg(options::OPT_ftraditional) ||
84940f1265ebd42ece3e7f7917319b56012e8e2bce2Daniel Dunbar      Args.hasArg(options::OPT_traditional_cpp))
85040f1265ebd42ece3e7f7917319b56012e8e2bce2Daniel Dunbar    CmdArgs.push_back("-traditional-cpp");
85140f1265ebd42ece3e7f7917319b56012e8e2bce2Daniel Dunbar
85240f1265ebd42ece3e7f7917319b56012e8e2bce2Daniel Dunbar  ArgStringList OutputArgs;
85340f1265ebd42ece3e7f7917319b56012e8e2bce2Daniel Dunbar  if (Output.isFilename()) {
85440f1265ebd42ece3e7f7917319b56012e8e2bce2Daniel Dunbar    OutputArgs.push_back("-o");
85540f1265ebd42ece3e7f7917319b56012e8e2bce2Daniel Dunbar    OutputArgs.push_back(Output.getFilename());
85640f1265ebd42ece3e7f7917319b56012e8e2bce2Daniel Dunbar  } else {
85740f1265ebd42ece3e7f7917319b56012e8e2bce2Daniel Dunbar    assert(Output.isPipe() && "Unexpected CC1 output.");
85840f1265ebd42ece3e7f7917319b56012e8e2bce2Daniel Dunbar  }
85940f1265ebd42ece3e7f7917319b56012e8e2bce2Daniel Dunbar
8609120f179fd2e354f067e4ef2c76dcf3fc4db8a16Daniel Dunbar  if (Args.hasArg(options::OPT_E)) {
8619120f179fd2e354f067e4ef2c76dcf3fc4db8a16Daniel Dunbar    AddCPPOptionsArgs(Args, CmdArgs, Inputs, OutputArgs);
8629120f179fd2e354f067e4ef2c76dcf3fc4db8a16Daniel Dunbar  } else {
8639120f179fd2e354f067e4ef2c76dcf3fc4db8a16Daniel Dunbar    AddCPPOptionsArgs(Args, CmdArgs, Inputs, ArgStringList());
8649120f179fd2e354f067e4ef2c76dcf3fc4db8a16Daniel Dunbar    CmdArgs.append(OutputArgs.begin(), OutputArgs.end());
8659120f179fd2e354f067e4ef2c76dcf3fc4db8a16Daniel Dunbar  }
86640f1265ebd42ece3e7f7917319b56012e8e2bce2Daniel Dunbar
86740f1265ebd42ece3e7f7917319b56012e8e2bce2Daniel Dunbar  const char *CC1Name = getCC1Name(Inputs[0].getType());
86840f1265ebd42ece3e7f7917319b56012e8e2bce2Daniel Dunbar  const char *Exec =
86940f1265ebd42ece3e7f7917319b56012e8e2bce2Daniel Dunbar    Args.MakeArgString(getToolChain().GetProgramPath(C, CC1Name).c_str());
87040f1265ebd42ece3e7f7917319b56012e8e2bce2Daniel Dunbar  Dest.addCommand(new Command(Exec, CmdArgs));
87140f1265ebd42ece3e7f7917319b56012e8e2bce2Daniel Dunbar}
87240f1265ebd42ece3e7f7917319b56012e8e2bce2Daniel Dunbar
87340f1265ebd42ece3e7f7917319b56012e8e2bce2Daniel Dunbarvoid darwin::Compile::ConstructJob(Compilation &C, const JobAction &JA,
87440f1265ebd42ece3e7f7917319b56012e8e2bce2Daniel Dunbar                                   Job &Dest, const InputInfo &Output,
87540f1265ebd42ece3e7f7917319b56012e8e2bce2Daniel Dunbar                                   const InputInfoList &Inputs,
87640f1265ebd42ece3e7f7917319b56012e8e2bce2Daniel Dunbar                                   const ArgList &Args,
87740f1265ebd42ece3e7f7917319b56012e8e2bce2Daniel Dunbar                                   const char *LinkingOutput) const {
87840f1265ebd42ece3e7f7917319b56012e8e2bce2Daniel Dunbar  const Driver &D = getToolChain().getHost().getDriver();
87940f1265ebd42ece3e7f7917319b56012e8e2bce2Daniel Dunbar  ArgStringList CmdArgs;
88040f1265ebd42ece3e7f7917319b56012e8e2bce2Daniel Dunbar
88140f1265ebd42ece3e7f7917319b56012e8e2bce2Daniel Dunbar  assert(Inputs.size() == 1 && "Unexpected number of inputs!");
88240f1265ebd42ece3e7f7917319b56012e8e2bce2Daniel Dunbar
88340f1265ebd42ece3e7f7917319b56012e8e2bce2Daniel Dunbar  types::ID InputType = Inputs[0].getType();
88440f1265ebd42ece3e7f7917319b56012e8e2bce2Daniel Dunbar  const Arg *A;
88540f1265ebd42ece3e7f7917319b56012e8e2bce2Daniel Dunbar  if ((A = Args.getLastArg(options::OPT_traditional)) ||
88640f1265ebd42ece3e7f7917319b56012e8e2bce2Daniel Dunbar      (A = Args.getLastArg(options::OPT_ftraditional)))
88740f1265ebd42ece3e7f7917319b56012e8e2bce2Daniel Dunbar    D.Diag(clang::diag::err_drv_argument_only_allowed_with)
88840f1265ebd42ece3e7f7917319b56012e8e2bce2Daniel Dunbar      << A->getAsString(Args) << "-E";
88940f1265ebd42ece3e7f7917319b56012e8e2bce2Daniel Dunbar
89040f1265ebd42ece3e7f7917319b56012e8e2bce2Daniel Dunbar  if (Output.getType() == types::TY_LLVMAsm)
89140f1265ebd42ece3e7f7917319b56012e8e2bce2Daniel Dunbar    CmdArgs.push_back("-emit-llvm");
89240f1265ebd42ece3e7f7917319b56012e8e2bce2Daniel Dunbar  else if (Output.getType() == types::TY_LLVMBC)
89340f1265ebd42ece3e7f7917319b56012e8e2bce2Daniel Dunbar    CmdArgs.push_back("-emit-llvm-bc");
89440f1265ebd42ece3e7f7917319b56012e8e2bce2Daniel Dunbar
89540f1265ebd42ece3e7f7917319b56012e8e2bce2Daniel Dunbar  ArgStringList OutputArgs;
89640f1265ebd42ece3e7f7917319b56012e8e2bce2Daniel Dunbar  if (Output.getType() != types::TY_PCH) {
89740f1265ebd42ece3e7f7917319b56012e8e2bce2Daniel Dunbar    OutputArgs.push_back("-o");
89840f1265ebd42ece3e7f7917319b56012e8e2bce2Daniel Dunbar    if (Output.isPipe())
89940f1265ebd42ece3e7f7917319b56012e8e2bce2Daniel Dunbar      OutputArgs.push_back("-");
90040f1265ebd42ece3e7f7917319b56012e8e2bce2Daniel Dunbar    else if (Output.isNothing())
90140f1265ebd42ece3e7f7917319b56012e8e2bce2Daniel Dunbar      OutputArgs.push_back("/dev/null");
90240f1265ebd42ece3e7f7917319b56012e8e2bce2Daniel Dunbar    else
90340f1265ebd42ece3e7f7917319b56012e8e2bce2Daniel Dunbar      OutputArgs.push_back(Output.getFilename());
90440f1265ebd42ece3e7f7917319b56012e8e2bce2Daniel Dunbar  }
90540f1265ebd42ece3e7f7917319b56012e8e2bce2Daniel Dunbar
90640f1265ebd42ece3e7f7917319b56012e8e2bce2Daniel Dunbar  // There is no need for this level of compatibility, but it makes
90740f1265ebd42ece3e7f7917319b56012e8e2bce2Daniel Dunbar  // diffing easier.
90840f1265ebd42ece3e7f7917319b56012e8e2bce2Daniel Dunbar  bool OutputArgsEarly = (Args.hasArg(options::OPT_fsyntax_only) ||
90940f1265ebd42ece3e7f7917319b56012e8e2bce2Daniel Dunbar                          Args.hasArg(options::OPT_S));
91040f1265ebd42ece3e7f7917319b56012e8e2bce2Daniel Dunbar
91140f1265ebd42ece3e7f7917319b56012e8e2bce2Daniel Dunbar  if (types::getPreprocessedType(InputType) != types::TY_INVALID) {
912a3ec60e0cf2a1916f479288998d31bd980b1a306Daniel Dunbar    AddCPPUniqueOptionsArgs(Args, CmdArgs, Inputs);
91340f1265ebd42ece3e7f7917319b56012e8e2bce2Daniel Dunbar    if (OutputArgsEarly) {
91440f1265ebd42ece3e7f7917319b56012e8e2bce2Daniel Dunbar      AddCC1OptionsArgs(Args, CmdArgs, Inputs, OutputArgs);
91540f1265ebd42ece3e7f7917319b56012e8e2bce2Daniel Dunbar    } else {
91640f1265ebd42ece3e7f7917319b56012e8e2bce2Daniel Dunbar      AddCC1OptionsArgs(Args, CmdArgs, Inputs, ArgStringList());
91740f1265ebd42ece3e7f7917319b56012e8e2bce2Daniel Dunbar      CmdArgs.append(OutputArgs.begin(), OutputArgs.end());
91840f1265ebd42ece3e7f7917319b56012e8e2bce2Daniel Dunbar    }
91940f1265ebd42ece3e7f7917319b56012e8e2bce2Daniel Dunbar  } else {
92040f1265ebd42ece3e7f7917319b56012e8e2bce2Daniel Dunbar    CmdArgs.push_back("-fpreprocessed");
92140f1265ebd42ece3e7f7917319b56012e8e2bce2Daniel Dunbar
92240f1265ebd42ece3e7f7917319b56012e8e2bce2Daniel Dunbar    // FIXME: There is a spec command to remove
92340f1265ebd42ece3e7f7917319b56012e8e2bce2Daniel Dunbar    // -fpredictive-compilation args here. Investigate.
92440f1265ebd42ece3e7f7917319b56012e8e2bce2Daniel Dunbar
92540f1265ebd42ece3e7f7917319b56012e8e2bce2Daniel Dunbar    for (InputInfoList::const_iterator
92640f1265ebd42ece3e7f7917319b56012e8e2bce2Daniel Dunbar           it = Inputs.begin(), ie = Inputs.end(); it != ie; ++it) {
92740f1265ebd42ece3e7f7917319b56012e8e2bce2Daniel Dunbar      const InputInfo &II = *it;
92840f1265ebd42ece3e7f7917319b56012e8e2bce2Daniel Dunbar
92940f1265ebd42ece3e7f7917319b56012e8e2bce2Daniel Dunbar      if (II.isPipe())
93040f1265ebd42ece3e7f7917319b56012e8e2bce2Daniel Dunbar        CmdArgs.push_back("-");
93140f1265ebd42ece3e7f7917319b56012e8e2bce2Daniel Dunbar      else
93240f1265ebd42ece3e7f7917319b56012e8e2bce2Daniel Dunbar        CmdArgs.push_back(II.getFilename());
93340f1265ebd42ece3e7f7917319b56012e8e2bce2Daniel Dunbar    }
93440f1265ebd42ece3e7f7917319b56012e8e2bce2Daniel Dunbar
93540f1265ebd42ece3e7f7917319b56012e8e2bce2Daniel Dunbar    if (OutputArgsEarly) {
93640f1265ebd42ece3e7f7917319b56012e8e2bce2Daniel Dunbar      AddCC1OptionsArgs(Args, CmdArgs, Inputs, OutputArgs);
93740f1265ebd42ece3e7f7917319b56012e8e2bce2Daniel Dunbar    } else {
93840f1265ebd42ece3e7f7917319b56012e8e2bce2Daniel Dunbar      AddCC1OptionsArgs(Args, CmdArgs, Inputs, ArgStringList());
93940f1265ebd42ece3e7f7917319b56012e8e2bce2Daniel Dunbar      CmdArgs.append(OutputArgs.begin(), OutputArgs.end());
94040f1265ebd42ece3e7f7917319b56012e8e2bce2Daniel Dunbar    }
94140f1265ebd42ece3e7f7917319b56012e8e2bce2Daniel Dunbar  }
94240f1265ebd42ece3e7f7917319b56012e8e2bce2Daniel Dunbar
94340f1265ebd42ece3e7f7917319b56012e8e2bce2Daniel Dunbar  if (Output.getType() == types::TY_PCH) {
94440f1265ebd42ece3e7f7917319b56012e8e2bce2Daniel Dunbar    assert(Output.isFilename() && "Invalid PCH output.");
94540f1265ebd42ece3e7f7917319b56012e8e2bce2Daniel Dunbar
94640f1265ebd42ece3e7f7917319b56012e8e2bce2Daniel Dunbar    CmdArgs.push_back("-o");
94740f1265ebd42ece3e7f7917319b56012e8e2bce2Daniel Dunbar    // NOTE: gcc uses a temp .s file for this, but there doesn't seem
94840f1265ebd42ece3e7f7917319b56012e8e2bce2Daniel Dunbar    // to be a good reason.
94940f1265ebd42ece3e7f7917319b56012e8e2bce2Daniel Dunbar    CmdArgs.push_back("/dev/null");
95040f1265ebd42ece3e7f7917319b56012e8e2bce2Daniel Dunbar
95140f1265ebd42ece3e7f7917319b56012e8e2bce2Daniel Dunbar    CmdArgs.push_back("--output-pch=");
95240f1265ebd42ece3e7f7917319b56012e8e2bce2Daniel Dunbar    CmdArgs.push_back(Output.getFilename());
95340f1265ebd42ece3e7f7917319b56012e8e2bce2Daniel Dunbar  }
95440f1265ebd42ece3e7f7917319b56012e8e2bce2Daniel Dunbar
95540f1265ebd42ece3e7f7917319b56012e8e2bce2Daniel Dunbar  const char *CC1Name = getCC1Name(Inputs[0].getType());
95640f1265ebd42ece3e7f7917319b56012e8e2bce2Daniel Dunbar  const char *Exec =
95740f1265ebd42ece3e7f7917319b56012e8e2bce2Daniel Dunbar    Args.MakeArgString(getToolChain().GetProgramPath(C, CC1Name).c_str());
95840f1265ebd42ece3e7f7917319b56012e8e2bce2Daniel Dunbar  Dest.addCommand(new Command(Exec, CmdArgs));
95940f1265ebd42ece3e7f7917319b56012e8e2bce2Daniel Dunbar}
96040f1265ebd42ece3e7f7917319b56012e8e2bce2Daniel Dunbar
9618cac5f7e1ce63dd77ee0fb4ef68f9fa804f41ea6Daniel Dunbarvoid darwin::Assemble::ConstructJob(Compilation &C, const JobAction &JA,
9628cac5f7e1ce63dd77ee0fb4ef68f9fa804f41ea6Daniel Dunbar                                    Job &Dest, const InputInfo &Output,
9638cac5f7e1ce63dd77ee0fb4ef68f9fa804f41ea6Daniel Dunbar                                    const InputInfoList &Inputs,
9648cac5f7e1ce63dd77ee0fb4ef68f9fa804f41ea6Daniel Dunbar                                    const ArgList &Args,
9658cac5f7e1ce63dd77ee0fb4ef68f9fa804f41ea6Daniel Dunbar                                    const char *LinkingOutput) const {
9668cac5f7e1ce63dd77ee0fb4ef68f9fa804f41ea6Daniel Dunbar  ArgStringList CmdArgs;
9678cac5f7e1ce63dd77ee0fb4ef68f9fa804f41ea6Daniel Dunbar
9688cac5f7e1ce63dd77ee0fb4ef68f9fa804f41ea6Daniel Dunbar  assert(Inputs.size() == 1 && "Unexpected number of inputs.");
9698cac5f7e1ce63dd77ee0fb4ef68f9fa804f41ea6Daniel Dunbar  const InputInfo &Input = Inputs[0];
9708cac5f7e1ce63dd77ee0fb4ef68f9fa804f41ea6Daniel Dunbar
9718cac5f7e1ce63dd77ee0fb4ef68f9fa804f41ea6Daniel Dunbar  // Bit of a hack, this is only used for original inputs.
9728e4fea6750dbac032c172f3279c63b7815b7423eDaniel Dunbar  //
9738e4fea6750dbac032c172f3279c63b7815b7423eDaniel Dunbar  // FIXME: This is broken for preprocessed .s inputs.
9748cac5f7e1ce63dd77ee0fb4ef68f9fa804f41ea6Daniel Dunbar  if (Input.isFilename() &&
9758e4fea6750dbac032c172f3279c63b7815b7423eDaniel Dunbar      strcmp(Input.getFilename(), Input.getBaseInput()) == 0) {
9768e4fea6750dbac032c172f3279c63b7815b7423eDaniel Dunbar    if (Args.hasArg(options::OPT_gstabs))
9778e4fea6750dbac032c172f3279c63b7815b7423eDaniel Dunbar      CmdArgs.push_back("--gstabs");
9788e4fea6750dbac032c172f3279c63b7815b7423eDaniel Dunbar    else if (Args.hasArg(options::OPT_g_Group))
9798e4fea6750dbac032c172f3279c63b7815b7423eDaniel Dunbar      CmdArgs.push_back("--gdwarf2");
9808e4fea6750dbac032c172f3279c63b7815b7423eDaniel Dunbar  }
9818cac5f7e1ce63dd77ee0fb4ef68f9fa804f41ea6Daniel Dunbar
9828cac5f7e1ce63dd77ee0fb4ef68f9fa804f41ea6Daniel Dunbar  // Derived from asm spec.
9838cac5f7e1ce63dd77ee0fb4ef68f9fa804f41ea6Daniel Dunbar  CmdArgs.push_back("-arch");
9848cac5f7e1ce63dd77ee0fb4ef68f9fa804f41ea6Daniel Dunbar  CmdArgs.push_back(getToolChain().getArchName().c_str());
9858cac5f7e1ce63dd77ee0fb4ef68f9fa804f41ea6Daniel Dunbar
9868cac5f7e1ce63dd77ee0fb4ef68f9fa804f41ea6Daniel Dunbar  CmdArgs.push_back("-force_cpusubtype_ALL");
9878cac5f7e1ce63dd77ee0fb4ef68f9fa804f41ea6Daniel Dunbar  if ((Args.hasArg(options::OPT_mkernel) ||
9888cac5f7e1ce63dd77ee0fb4ef68f9fa804f41ea6Daniel Dunbar       Args.hasArg(options::OPT_static) ||
9898cac5f7e1ce63dd77ee0fb4ef68f9fa804f41ea6Daniel Dunbar       Args.hasArg(options::OPT_fapple_kext)) &&
9908cac5f7e1ce63dd77ee0fb4ef68f9fa804f41ea6Daniel Dunbar      !Args.hasArg(options::OPT_dynamic))
9918cac5f7e1ce63dd77ee0fb4ef68f9fa804f41ea6Daniel Dunbar      CmdArgs.push_back("-static");
9928cac5f7e1ce63dd77ee0fb4ef68f9fa804f41ea6Daniel Dunbar
9938cac5f7e1ce63dd77ee0fb4ef68f9fa804f41ea6Daniel Dunbar  Args.AddAllArgValues(CmdArgs, options::OPT_Wa_COMMA,
9948cac5f7e1ce63dd77ee0fb4ef68f9fa804f41ea6Daniel Dunbar                       options::OPT_Xassembler);
9958cac5f7e1ce63dd77ee0fb4ef68f9fa804f41ea6Daniel Dunbar
9968cac5f7e1ce63dd77ee0fb4ef68f9fa804f41ea6Daniel Dunbar  assert(Output.isFilename() && "Unexpected lipo output.");
9978cac5f7e1ce63dd77ee0fb4ef68f9fa804f41ea6Daniel Dunbar  CmdArgs.push_back("-o");
9988cac5f7e1ce63dd77ee0fb4ef68f9fa804f41ea6Daniel Dunbar  CmdArgs.push_back(Output.getFilename());
9998cac5f7e1ce63dd77ee0fb4ef68f9fa804f41ea6Daniel Dunbar
10008cac5f7e1ce63dd77ee0fb4ef68f9fa804f41ea6Daniel Dunbar  if (Input.isPipe()) {
10018cac5f7e1ce63dd77ee0fb4ef68f9fa804f41ea6Daniel Dunbar    CmdArgs.push_back("-");
10028cac5f7e1ce63dd77ee0fb4ef68f9fa804f41ea6Daniel Dunbar  } else {
10038cac5f7e1ce63dd77ee0fb4ef68f9fa804f41ea6Daniel Dunbar    assert(Input.isFilename() && "Invalid input.");
10048cac5f7e1ce63dd77ee0fb4ef68f9fa804f41ea6Daniel Dunbar    CmdArgs.push_back(Input.getFilename());
10058cac5f7e1ce63dd77ee0fb4ef68f9fa804f41ea6Daniel Dunbar  }
10068cac5f7e1ce63dd77ee0fb4ef68f9fa804f41ea6Daniel Dunbar
10078cac5f7e1ce63dd77ee0fb4ef68f9fa804f41ea6Daniel Dunbar  // asm_final spec is empty.
10088cac5f7e1ce63dd77ee0fb4ef68f9fa804f41ea6Daniel Dunbar
10098cac5f7e1ce63dd77ee0fb4ef68f9fa804f41ea6Daniel Dunbar  const char *Exec =
10108cac5f7e1ce63dd77ee0fb4ef68f9fa804f41ea6Daniel Dunbar    Args.MakeArgString(getToolChain().GetProgramPath(C, "as").c_str());
10118cac5f7e1ce63dd77ee0fb4ef68f9fa804f41ea6Daniel Dunbar  Dest.addCommand(new Command(Exec, CmdArgs));
10128cac5f7e1ce63dd77ee0fb4ef68f9fa804f41ea6Daniel Dunbar}
1013ff7488dc9a766f94daf54d81b03ab9160d0bfd88Daniel Dunbar
101402633b541b04ad5ffc1c70f4c2feeeb13e607057Daniel Dunbarstatic const char *MakeFormattedString(const ArgList &Args,
101502633b541b04ad5ffc1c70f4c2feeeb13e607057Daniel Dunbar                                       const llvm::format_object_base &Fmt) {
101602633b541b04ad5ffc1c70f4c2feeeb13e607057Daniel Dunbar  std::string Str;
101702633b541b04ad5ffc1c70f4c2feeeb13e607057Daniel Dunbar  llvm::raw_string_ostream(Str) << Fmt;
101802633b541b04ad5ffc1c70f4c2feeeb13e607057Daniel Dunbar  return Args.MakeArgString(Str.c_str());
101902633b541b04ad5ffc1c70f4c2feeeb13e607057Daniel Dunbar}
102002633b541b04ad5ffc1c70f4c2feeeb13e607057Daniel Dunbar
102102633b541b04ad5ffc1c70f4c2feeeb13e607057Daniel Dunbar/// Helper routine for seeing if we should use dsymutil; this is a
102202633b541b04ad5ffc1c70f4c2feeeb13e607057Daniel Dunbar/// gcc compatible hack, we should remove it and use the input
102302633b541b04ad5ffc1c70f4c2feeeb13e607057Daniel Dunbar/// type information.
102402633b541b04ad5ffc1c70f4c2feeeb13e607057Daniel Dunbarstatic bool isSourceSuffix(const char *Str) {
102502633b541b04ad5ffc1c70f4c2feeeb13e607057Daniel Dunbar  // match: 'C', 'CPP', 'c', 'cc', 'cp', 'c++', 'cpp', 'cxx', 'm',
102602633b541b04ad5ffc1c70f4c2feeeb13e607057Daniel Dunbar  // 'mm'.
102702633b541b04ad5ffc1c70f4c2feeeb13e607057Daniel Dunbar  switch (strlen(Str)) {
102802633b541b04ad5ffc1c70f4c2feeeb13e607057Daniel Dunbar  default:
102902633b541b04ad5ffc1c70f4c2feeeb13e607057Daniel Dunbar    return false;
103002633b541b04ad5ffc1c70f4c2feeeb13e607057Daniel Dunbar  case 1:
103102633b541b04ad5ffc1c70f4c2feeeb13e607057Daniel Dunbar    return (memcmp(Str, "C", 1) == 0 ||
103202633b541b04ad5ffc1c70f4c2feeeb13e607057Daniel Dunbar            memcmp(Str, "c", 1) == 0 ||
103302633b541b04ad5ffc1c70f4c2feeeb13e607057Daniel Dunbar            memcmp(Str, "m", 1) == 0);
103402633b541b04ad5ffc1c70f4c2feeeb13e607057Daniel Dunbar  case 2:
103502633b541b04ad5ffc1c70f4c2feeeb13e607057Daniel Dunbar    return (memcmp(Str, "cc", 2) == 0 ||
103602633b541b04ad5ffc1c70f4c2feeeb13e607057Daniel Dunbar            memcmp(Str, "cp", 2) == 0 ||
103702633b541b04ad5ffc1c70f4c2feeeb13e607057Daniel Dunbar            memcmp(Str, "mm", 2) == 0);
103802633b541b04ad5ffc1c70f4c2feeeb13e607057Daniel Dunbar  case 3:
103902633b541b04ad5ffc1c70f4c2feeeb13e607057Daniel Dunbar    return (memcmp(Str, "CPP", 3) == 0 ||
104002633b541b04ad5ffc1c70f4c2feeeb13e607057Daniel Dunbar            memcmp(Str, "c++", 3) == 0 ||
104102633b541b04ad5ffc1c70f4c2feeeb13e607057Daniel Dunbar            memcmp(Str, "cpp", 3) == 0 ||
104202633b541b04ad5ffc1c70f4c2feeeb13e607057Daniel Dunbar            memcmp(Str, "cxx", 3) == 0);
104302633b541b04ad5ffc1c70f4c2feeeb13e607057Daniel Dunbar  }
104402633b541b04ad5ffc1c70f4c2feeeb13e607057Daniel Dunbar}
104502633b541b04ad5ffc1c70f4c2feeeb13e607057Daniel Dunbar
104602633b541b04ad5ffc1c70f4c2feeeb13e607057Daniel Dunbarstatic bool isMacosxVersionLT(unsigned (&A)[3], unsigned (&B)[3]) {
104702633b541b04ad5ffc1c70f4c2feeeb13e607057Daniel Dunbar  for (unsigned i=0; i < 3; ++i) {
104802633b541b04ad5ffc1c70f4c2feeeb13e607057Daniel Dunbar    if (A[i] > B[i]) return false;
104902633b541b04ad5ffc1c70f4c2feeeb13e607057Daniel Dunbar    if (A[i] < B[i]) return true;
105002633b541b04ad5ffc1c70f4c2feeeb13e607057Daniel Dunbar  }
105102633b541b04ad5ffc1c70f4c2feeeb13e607057Daniel Dunbar  return false;
105202633b541b04ad5ffc1c70f4c2feeeb13e607057Daniel Dunbar}
105302633b541b04ad5ffc1c70f4c2feeeb13e607057Daniel Dunbar
105402633b541b04ad5ffc1c70f4c2feeeb13e607057Daniel Dunbarstatic bool isMacosxVersionLT(unsigned (&A)[3],
105502633b541b04ad5ffc1c70f4c2feeeb13e607057Daniel Dunbar                              unsigned V0, unsigned V1=0, unsigned V2=0) {
105602633b541b04ad5ffc1c70f4c2feeeb13e607057Daniel Dunbar  unsigned B[3] = { V0, V1, V2 };
105702633b541b04ad5ffc1c70f4c2feeeb13e607057Daniel Dunbar  return isMacosxVersionLT(A, B);
105802633b541b04ad5ffc1c70f4c2feeeb13e607057Daniel Dunbar}
105902633b541b04ad5ffc1c70f4c2feeeb13e607057Daniel Dunbar
106002633b541b04ad5ffc1c70f4c2feeeb13e607057Daniel Dunbarconst toolchains::Darwin_X86 &darwin::Link::getDarwinToolChain() const {
106102633b541b04ad5ffc1c70f4c2feeeb13e607057Daniel Dunbar  return reinterpret_cast<const toolchains::Darwin_X86&>(getToolChain());
106202633b541b04ad5ffc1c70f4c2feeeb13e607057Daniel Dunbar}
106302633b541b04ad5ffc1c70f4c2feeeb13e607057Daniel Dunbar
106402633b541b04ad5ffc1c70f4c2feeeb13e607057Daniel Dunbarvoid darwin::Link::AddDarwinArch(const ArgList &Args,
106502633b541b04ad5ffc1c70f4c2feeeb13e607057Daniel Dunbar                                 ArgStringList &CmdArgs) const {
106602633b541b04ad5ffc1c70f4c2feeeb13e607057Daniel Dunbar  // Derived from darwin_arch spec.
106702633b541b04ad5ffc1c70f4c2feeeb13e607057Daniel Dunbar  CmdArgs.push_back("-arch");
106802633b541b04ad5ffc1c70f4c2feeeb13e607057Daniel Dunbar  CmdArgs.push_back(getToolChain().getArchName().c_str());
106902633b541b04ad5ffc1c70f4c2feeeb13e607057Daniel Dunbar}
107002633b541b04ad5ffc1c70f4c2feeeb13e607057Daniel Dunbar
107102633b541b04ad5ffc1c70f4c2feeeb13e607057Daniel Dunbarvoid darwin::Link::AddDarwinSubArch(const ArgList &Args,
107202633b541b04ad5ffc1c70f4c2feeeb13e607057Daniel Dunbar                                    ArgStringList &CmdArgs) const {
107302633b541b04ad5ffc1c70f4c2feeeb13e607057Daniel Dunbar  // Derived from darwin_subarch spec, not sure what the distinction
107402633b541b04ad5ffc1c70f4c2feeeb13e607057Daniel Dunbar  // exists for but at least for this chain it is the same.
107502633b541b04ad5ffc1c70f4c2feeeb13e607057Daniel Dunbar  AddDarwinArch(Args, CmdArgs);
107602633b541b04ad5ffc1c70f4c2feeeb13e607057Daniel Dunbar}
107702633b541b04ad5ffc1c70f4c2feeeb13e607057Daniel Dunbar
107802633b541b04ad5ffc1c70f4c2feeeb13e607057Daniel Dunbarvoid darwin::Link::AddLinkArgs(const ArgList &Args,
107902633b541b04ad5ffc1c70f4c2feeeb13e607057Daniel Dunbar                               ArgStringList &CmdArgs) const {
108002633b541b04ad5ffc1c70f4c2feeeb13e607057Daniel Dunbar  const Driver &D = getToolChain().getHost().getDriver();
108102633b541b04ad5ffc1c70f4c2feeeb13e607057Daniel Dunbar
108202633b541b04ad5ffc1c70f4c2feeeb13e607057Daniel Dunbar  // Derived from the "link" spec.
108302633b541b04ad5ffc1c70f4c2feeeb13e607057Daniel Dunbar  Args.AddAllArgs(CmdArgs, options::OPT_static);
108402633b541b04ad5ffc1c70f4c2feeeb13e607057Daniel Dunbar  if (!Args.hasArg(options::OPT_static))
108502633b541b04ad5ffc1c70f4c2feeeb13e607057Daniel Dunbar    CmdArgs.push_back("-dynamic");
108602633b541b04ad5ffc1c70f4c2feeeb13e607057Daniel Dunbar  if (Args.hasArg(options::OPT_fgnu_runtime)) {
108702633b541b04ad5ffc1c70f4c2feeeb13e607057Daniel Dunbar    // FIXME: gcc replaces -lobjc in forward args with -lobjc-gnu
108802633b541b04ad5ffc1c70f4c2feeeb13e607057Daniel Dunbar    // here. How do we wish to handle such things?
108902633b541b04ad5ffc1c70f4c2feeeb13e607057Daniel Dunbar  }
109002633b541b04ad5ffc1c70f4c2feeeb13e607057Daniel Dunbar
109102633b541b04ad5ffc1c70f4c2feeeb13e607057Daniel Dunbar  if (!Args.hasArg(options::OPT_dynamiclib)) {
109202633b541b04ad5ffc1c70f4c2feeeb13e607057Daniel Dunbar    if (Args.hasArg(options::OPT_force__cpusubtype__ALL)) {
109302633b541b04ad5ffc1c70f4c2feeeb13e607057Daniel Dunbar      AddDarwinArch(Args, CmdArgs);
109402633b541b04ad5ffc1c70f4c2feeeb13e607057Daniel Dunbar      CmdArgs.push_back("-force_cpusubtype_ALL");
109502633b541b04ad5ffc1c70f4c2feeeb13e607057Daniel Dunbar    } else
109602633b541b04ad5ffc1c70f4c2feeeb13e607057Daniel Dunbar      AddDarwinSubArch(Args, CmdArgs);
109702633b541b04ad5ffc1c70f4c2feeeb13e607057Daniel Dunbar
109802633b541b04ad5ffc1c70f4c2feeeb13e607057Daniel Dunbar    Args.AddLastArg(CmdArgs, options::OPT_bundle);
109902633b541b04ad5ffc1c70f4c2feeeb13e607057Daniel Dunbar    Args.AddAllArgs(CmdArgs, options::OPT_bundle__loader);
110002633b541b04ad5ffc1c70f4c2feeeb13e607057Daniel Dunbar    Args.AddAllArgs(CmdArgs, options::OPT_client__name);
110102633b541b04ad5ffc1c70f4c2feeeb13e607057Daniel Dunbar
110202633b541b04ad5ffc1c70f4c2feeeb13e607057Daniel Dunbar    Arg *A;
110302633b541b04ad5ffc1c70f4c2feeeb13e607057Daniel Dunbar    if ((A = Args.getLastArg(options::OPT_compatibility__version)) ||
110402633b541b04ad5ffc1c70f4c2feeeb13e607057Daniel Dunbar        (A = Args.getLastArg(options::OPT_current__version)) ||
110502633b541b04ad5ffc1c70f4c2feeeb13e607057Daniel Dunbar        (A = Args.getLastArg(options::OPT_install__name)))
110602633b541b04ad5ffc1c70f4c2feeeb13e607057Daniel Dunbar      D.Diag(clang::diag::err_drv_argument_only_allowed_with)
110702633b541b04ad5ffc1c70f4c2feeeb13e607057Daniel Dunbar        << A->getAsString(Args) << "-dynamiclib";
110802633b541b04ad5ffc1c70f4c2feeeb13e607057Daniel Dunbar
110902633b541b04ad5ffc1c70f4c2feeeb13e607057Daniel Dunbar    Args.AddLastArg(CmdArgs, options::OPT_force__flat__namespace);
111002633b541b04ad5ffc1c70f4c2feeeb13e607057Daniel Dunbar    Args.AddLastArg(CmdArgs, options::OPT_keep__private__externs);
111102633b541b04ad5ffc1c70f4c2feeeb13e607057Daniel Dunbar    Args.AddLastArg(CmdArgs, options::OPT_private__bundle);
111202633b541b04ad5ffc1c70f4c2feeeb13e607057Daniel Dunbar  } else {
111302633b541b04ad5ffc1c70f4c2feeeb13e607057Daniel Dunbar    CmdArgs.push_back("-dylib");
111402633b541b04ad5ffc1c70f4c2feeeb13e607057Daniel Dunbar
111502633b541b04ad5ffc1c70f4c2feeeb13e607057Daniel Dunbar    Arg *A;
111602633b541b04ad5ffc1c70f4c2feeeb13e607057Daniel Dunbar    if ((A = Args.getLastArg(options::OPT_bundle)) ||
111702633b541b04ad5ffc1c70f4c2feeeb13e607057Daniel Dunbar        (A = Args.getLastArg(options::OPT_bundle__loader)) ||
111802633b541b04ad5ffc1c70f4c2feeeb13e607057Daniel Dunbar        (A = Args.getLastArg(options::OPT_client__name)) ||
111902633b541b04ad5ffc1c70f4c2feeeb13e607057Daniel Dunbar        (A = Args.getLastArg(options::OPT_force__flat__namespace)) ||
112002633b541b04ad5ffc1c70f4c2feeeb13e607057Daniel Dunbar        (A = Args.getLastArg(options::OPT_keep__private__externs)) ||
112102633b541b04ad5ffc1c70f4c2feeeb13e607057Daniel Dunbar        (A = Args.getLastArg(options::OPT_private__bundle)))
112202633b541b04ad5ffc1c70f4c2feeeb13e607057Daniel Dunbar      D.Diag(clang::diag::err_drv_argument_not_allowed_with)
112302633b541b04ad5ffc1c70f4c2feeeb13e607057Daniel Dunbar        << A->getAsString(Args) << "-dynamiclib";
112402633b541b04ad5ffc1c70f4c2feeeb13e607057Daniel Dunbar
112502633b541b04ad5ffc1c70f4c2feeeb13e607057Daniel Dunbar    Args.AddAllArgsTranslated(CmdArgs, options::OPT_compatibility__version,
112602633b541b04ad5ffc1c70f4c2feeeb13e607057Daniel Dunbar                              "-dylib_compatibility_version");
112702633b541b04ad5ffc1c70f4c2feeeb13e607057Daniel Dunbar    Args.AddAllArgsTranslated(CmdArgs, options::OPT_current__version,
112802633b541b04ad5ffc1c70f4c2feeeb13e607057Daniel Dunbar                              "-dylib_current_version");
112902633b541b04ad5ffc1c70f4c2feeeb13e607057Daniel Dunbar
113002633b541b04ad5ffc1c70f4c2feeeb13e607057Daniel Dunbar    if (Args.hasArg(options::OPT_force__cpusubtype__ALL)) {
113102633b541b04ad5ffc1c70f4c2feeeb13e607057Daniel Dunbar      AddDarwinArch(Args, CmdArgs);
113202633b541b04ad5ffc1c70f4c2feeeb13e607057Daniel Dunbar          // NOTE: We don't add -force_cpusubtype_ALL on this path. Ok.
113302633b541b04ad5ffc1c70f4c2feeeb13e607057Daniel Dunbar    } else
113402633b541b04ad5ffc1c70f4c2feeeb13e607057Daniel Dunbar      AddDarwinSubArch(Args, CmdArgs);
113502633b541b04ad5ffc1c70f4c2feeeb13e607057Daniel Dunbar
113602633b541b04ad5ffc1c70f4c2feeeb13e607057Daniel Dunbar    Args.AddAllArgsTranslated(CmdArgs, options::OPT_install__name,
113702633b541b04ad5ffc1c70f4c2feeeb13e607057Daniel Dunbar                              "-dylib_install_name");
113802633b541b04ad5ffc1c70f4c2feeeb13e607057Daniel Dunbar  }
113902633b541b04ad5ffc1c70f4c2feeeb13e607057Daniel Dunbar
114002633b541b04ad5ffc1c70f4c2feeeb13e607057Daniel Dunbar  Args.AddLastArg(CmdArgs, options::OPT_all__load);
114102633b541b04ad5ffc1c70f4c2feeeb13e607057Daniel Dunbar  Args.AddAllArgs(CmdArgs, options::OPT_allowable__client);
114202633b541b04ad5ffc1c70f4c2feeeb13e607057Daniel Dunbar  Args.AddLastArg(CmdArgs, options::OPT_bind__at__load);
114302633b541b04ad5ffc1c70f4c2feeeb13e607057Daniel Dunbar  Args.AddLastArg(CmdArgs, options::OPT_dead__strip);
114402633b541b04ad5ffc1c70f4c2feeeb13e607057Daniel Dunbar  Args.AddLastArg(CmdArgs, options::OPT_no__dead__strip__inits__and__terms);
114502633b541b04ad5ffc1c70f4c2feeeb13e607057Daniel Dunbar  Args.AddAllArgs(CmdArgs, options::OPT_dylib__file);
114602633b541b04ad5ffc1c70f4c2feeeb13e607057Daniel Dunbar  Args.AddLastArg(CmdArgs, options::OPT_dynamic);
114702633b541b04ad5ffc1c70f4c2feeeb13e607057Daniel Dunbar  Args.AddAllArgs(CmdArgs, options::OPT_exported__symbols__list);
114802633b541b04ad5ffc1c70f4c2feeeb13e607057Daniel Dunbar  Args.AddLastArg(CmdArgs, options::OPT_flat__namespace);
114902633b541b04ad5ffc1c70f4c2feeeb13e607057Daniel Dunbar  Args.AddAllArgs(CmdArgs, options::OPT_headerpad__max__install__names);
115002633b541b04ad5ffc1c70f4c2feeeb13e607057Daniel Dunbar  Args.AddAllArgs(CmdArgs, options::OPT_image__base);
115102633b541b04ad5ffc1c70f4c2feeeb13e607057Daniel Dunbar  Args.AddAllArgs(CmdArgs, options::OPT_init);
115202633b541b04ad5ffc1c70f4c2feeeb13e607057Daniel Dunbar
115302633b541b04ad5ffc1c70f4c2feeeb13e607057Daniel Dunbar  if (!Args.hasArg(options::OPT_mmacosx_version_min_EQ)) {
115402633b541b04ad5ffc1c70f4c2feeeb13e607057Daniel Dunbar    if (!Args.hasArg(options::OPT_miphoneos_version_min_EQ)) {
115502633b541b04ad5ffc1c70f4c2feeeb13e607057Daniel Dunbar        // FIXME: I don't understand what is going on here. This is
115602633b541b04ad5ffc1c70f4c2feeeb13e607057Daniel Dunbar        // supposed to come from darwin_ld_minversion, but gcc doesn't
115702633b541b04ad5ffc1c70f4c2feeeb13e607057Daniel Dunbar        // seem to be following that; it must be getting overridden
115802633b541b04ad5ffc1c70f4c2feeeb13e607057Daniel Dunbar        // somewhere.
115902633b541b04ad5ffc1c70f4c2feeeb13e607057Daniel Dunbar        CmdArgs.push_back("-macosx_version_min");
116002633b541b04ad5ffc1c70f4c2feeeb13e607057Daniel Dunbar        CmdArgs.push_back(getDarwinToolChain().getMacosxVersionStr());
116102633b541b04ad5ffc1c70f4c2feeeb13e607057Daniel Dunbar      }
116202633b541b04ad5ffc1c70f4c2feeeb13e607057Daniel Dunbar  } else {
116302633b541b04ad5ffc1c70f4c2feeeb13e607057Daniel Dunbar    // Adding all arguments doesn't make sense here but this is what
116402633b541b04ad5ffc1c70f4c2feeeb13e607057Daniel Dunbar    // gcc does.
116502633b541b04ad5ffc1c70f4c2feeeb13e607057Daniel Dunbar    Args.AddAllArgsTranslated(CmdArgs, options::OPT_mmacosx_version_min_EQ,
116602633b541b04ad5ffc1c70f4c2feeeb13e607057Daniel Dunbar                              "-macosx_version_min");
116702633b541b04ad5ffc1c70f4c2feeeb13e607057Daniel Dunbar  }
116802633b541b04ad5ffc1c70f4c2feeeb13e607057Daniel Dunbar
116902633b541b04ad5ffc1c70f4c2feeeb13e607057Daniel Dunbar  Args.AddAllArgsTranslated(CmdArgs, options::OPT_miphoneos_version_min_EQ,
117002633b541b04ad5ffc1c70f4c2feeeb13e607057Daniel Dunbar                            "-iphoneos_version_min");
117102633b541b04ad5ffc1c70f4c2feeeb13e607057Daniel Dunbar  Args.AddLastArg(CmdArgs, options::OPT_nomultidefs);
117202633b541b04ad5ffc1c70f4c2feeeb13e607057Daniel Dunbar  Args.AddLastArg(CmdArgs, options::OPT_multi__module);
117302633b541b04ad5ffc1c70f4c2feeeb13e607057Daniel Dunbar  Args.AddLastArg(CmdArgs, options::OPT_single__module);
117402633b541b04ad5ffc1c70f4c2feeeb13e607057Daniel Dunbar  Args.AddAllArgs(CmdArgs, options::OPT_multiply__defined);
117502633b541b04ad5ffc1c70f4c2feeeb13e607057Daniel Dunbar  Args.AddAllArgs(CmdArgs, options::OPT_multiply__defined__unused);
117602633b541b04ad5ffc1c70f4c2feeeb13e607057Daniel Dunbar
117702633b541b04ad5ffc1c70f4c2feeeb13e607057Daniel Dunbar  if (Args.hasArg(options::OPT_fpie))
117802633b541b04ad5ffc1c70f4c2feeeb13e607057Daniel Dunbar    CmdArgs.push_back("-pie");
117902633b541b04ad5ffc1c70f4c2feeeb13e607057Daniel Dunbar
118002633b541b04ad5ffc1c70f4c2feeeb13e607057Daniel Dunbar  Args.AddLastArg(CmdArgs, options::OPT_prebind);
118102633b541b04ad5ffc1c70f4c2feeeb13e607057Daniel Dunbar  Args.AddLastArg(CmdArgs, options::OPT_noprebind);
118202633b541b04ad5ffc1c70f4c2feeeb13e607057Daniel Dunbar  Args.AddLastArg(CmdArgs, options::OPT_nofixprebinding);
118302633b541b04ad5ffc1c70f4c2feeeb13e607057Daniel Dunbar  Args.AddLastArg(CmdArgs, options::OPT_prebind__all__twolevel__modules);
118402633b541b04ad5ffc1c70f4c2feeeb13e607057Daniel Dunbar  Args.AddLastArg(CmdArgs, options::OPT_read__only__relocs);
118502633b541b04ad5ffc1c70f4c2feeeb13e607057Daniel Dunbar  Args.AddAllArgs(CmdArgs, options::OPT_sectcreate);
118602633b541b04ad5ffc1c70f4c2feeeb13e607057Daniel Dunbar  Args.AddAllArgs(CmdArgs, options::OPT_sectorder);
118702633b541b04ad5ffc1c70f4c2feeeb13e607057Daniel Dunbar  Args.AddAllArgs(CmdArgs, options::OPT_seg1addr);
118802633b541b04ad5ffc1c70f4c2feeeb13e607057Daniel Dunbar  Args.AddAllArgs(CmdArgs, options::OPT_segprot);
118902633b541b04ad5ffc1c70f4c2feeeb13e607057Daniel Dunbar  Args.AddAllArgs(CmdArgs, options::OPT_segaddr);
119002633b541b04ad5ffc1c70f4c2feeeb13e607057Daniel Dunbar  Args.AddAllArgs(CmdArgs, options::OPT_segs__read__only__addr);
119102633b541b04ad5ffc1c70f4c2feeeb13e607057Daniel Dunbar  Args.AddAllArgs(CmdArgs, options::OPT_segs__read__write__addr);
119202633b541b04ad5ffc1c70f4c2feeeb13e607057Daniel Dunbar  Args.AddAllArgs(CmdArgs, options::OPT_seg__addr__table);
119302633b541b04ad5ffc1c70f4c2feeeb13e607057Daniel Dunbar  Args.AddAllArgs(CmdArgs, options::OPT_seg__addr__table__filename);
119402633b541b04ad5ffc1c70f4c2feeeb13e607057Daniel Dunbar  Args.AddAllArgs(CmdArgs, options::OPT_sub__library);
119502633b541b04ad5ffc1c70f4c2feeeb13e607057Daniel Dunbar  Args.AddAllArgs(CmdArgs, options::OPT_sub__umbrella);
119602633b541b04ad5ffc1c70f4c2feeeb13e607057Daniel Dunbar  Args.AddAllArgsTranslated(CmdArgs, options::OPT_isysroot, "-syslibroot");
119702633b541b04ad5ffc1c70f4c2feeeb13e607057Daniel Dunbar  Args.AddLastArg(CmdArgs, options::OPT_twolevel__namespace);
119802633b541b04ad5ffc1c70f4c2feeeb13e607057Daniel Dunbar  Args.AddLastArg(CmdArgs, options::OPT_twolevel__namespace__hints);
119902633b541b04ad5ffc1c70f4c2feeeb13e607057Daniel Dunbar  Args.AddAllArgs(CmdArgs, options::OPT_umbrella);
120002633b541b04ad5ffc1c70f4c2feeeb13e607057Daniel Dunbar  Args.AddAllArgs(CmdArgs, options::OPT_undefined);
120102633b541b04ad5ffc1c70f4c2feeeb13e607057Daniel Dunbar  Args.AddAllArgs(CmdArgs, options::OPT_unexported__symbols__list);
120202633b541b04ad5ffc1c70f4c2feeeb13e607057Daniel Dunbar  Args.AddAllArgs(CmdArgs, options::OPT_weak__reference__mismatches);
120302633b541b04ad5ffc1c70f4c2feeeb13e607057Daniel Dunbar
120402633b541b04ad5ffc1c70f4c2feeeb13e607057Daniel Dunbar  if (!Args.hasArg(options::OPT_weak__reference__mismatches)) {
120502633b541b04ad5ffc1c70f4c2feeeb13e607057Daniel Dunbar    CmdArgs.push_back("-weak_reference_mismatches");
120602633b541b04ad5ffc1c70f4c2feeeb13e607057Daniel Dunbar    CmdArgs.push_back("non-weak");
120702633b541b04ad5ffc1c70f4c2feeeb13e607057Daniel Dunbar  }
120802633b541b04ad5ffc1c70f4c2feeeb13e607057Daniel Dunbar
120902633b541b04ad5ffc1c70f4c2feeeb13e607057Daniel Dunbar  Args.AddLastArg(CmdArgs, options::OPT_X_Flag);
121002633b541b04ad5ffc1c70f4c2feeeb13e607057Daniel Dunbar  Args.AddAllArgs(CmdArgs, options::OPT_y);
121102633b541b04ad5ffc1c70f4c2feeeb13e607057Daniel Dunbar  Args.AddLastArg(CmdArgs, options::OPT_w);
121202633b541b04ad5ffc1c70f4c2feeeb13e607057Daniel Dunbar  Args.AddAllArgs(CmdArgs, options::OPT_pagezero__size);
121302633b541b04ad5ffc1c70f4c2feeeb13e607057Daniel Dunbar  Args.AddAllArgs(CmdArgs, options::OPT_segs__read__);
121402633b541b04ad5ffc1c70f4c2feeeb13e607057Daniel Dunbar  Args.AddLastArg(CmdArgs, options::OPT_seglinkedit);
121502633b541b04ad5ffc1c70f4c2feeeb13e607057Daniel Dunbar  Args.AddLastArg(CmdArgs, options::OPT_noseglinkedit);
121602633b541b04ad5ffc1c70f4c2feeeb13e607057Daniel Dunbar  Args.AddAllArgs(CmdArgs, options::OPT_sectalign);
121702633b541b04ad5ffc1c70f4c2feeeb13e607057Daniel Dunbar  Args.AddAllArgs(CmdArgs, options::OPT_sectobjectsymbols);
121802633b541b04ad5ffc1c70f4c2feeeb13e607057Daniel Dunbar  Args.AddAllArgs(CmdArgs, options::OPT_segcreate);
121902633b541b04ad5ffc1c70f4c2feeeb13e607057Daniel Dunbar  Args.AddLastArg(CmdArgs, options::OPT_whyload);
122002633b541b04ad5ffc1c70f4c2feeeb13e607057Daniel Dunbar  Args.AddLastArg(CmdArgs, options::OPT_whatsloaded);
122102633b541b04ad5ffc1c70f4c2feeeb13e607057Daniel Dunbar  Args.AddAllArgs(CmdArgs, options::OPT_dylinker__install__name);
122202633b541b04ad5ffc1c70f4c2feeeb13e607057Daniel Dunbar  Args.AddLastArg(CmdArgs, options::OPT_dylinker);
122302633b541b04ad5ffc1c70f4c2feeeb13e607057Daniel Dunbar  Args.AddLastArg(CmdArgs, options::OPT_Mach);
122402633b541b04ad5ffc1c70f4c2feeeb13e607057Daniel Dunbar}
122502633b541b04ad5ffc1c70f4c2feeeb13e607057Daniel Dunbar
122602633b541b04ad5ffc1c70f4c2feeeb13e607057Daniel Dunbarvoid darwin::Link::ConstructJob(Compilation &C, const JobAction &JA,
122702633b541b04ad5ffc1c70f4c2feeeb13e607057Daniel Dunbar                                Job &Dest, const InputInfo &Output,
122802633b541b04ad5ffc1c70f4c2feeeb13e607057Daniel Dunbar                                const InputInfoList &Inputs,
122902633b541b04ad5ffc1c70f4c2feeeb13e607057Daniel Dunbar                                const ArgList &Args,
123002633b541b04ad5ffc1c70f4c2feeeb13e607057Daniel Dunbar                                const char *LinkingOutput) const {
123102633b541b04ad5ffc1c70f4c2feeeb13e607057Daniel Dunbar  assert(Output.getType() == types::TY_Image && "Invalid linker output type.");
123202633b541b04ad5ffc1c70f4c2feeeb13e607057Daniel Dunbar  // The logic here is derived from gcc's behavior; most of which
123302633b541b04ad5ffc1c70f4c2feeeb13e607057Daniel Dunbar  // comes from specs (starting with link_command). Consult gcc for
123402633b541b04ad5ffc1c70f4c2feeeb13e607057Daniel Dunbar  // more information.
123502633b541b04ad5ffc1c70f4c2feeeb13e607057Daniel Dunbar
123602633b541b04ad5ffc1c70f4c2feeeb13e607057Daniel Dunbar  // FIXME: The spec references -fdump= which seems to have
123702633b541b04ad5ffc1c70f4c2feeeb13e607057Daniel Dunbar  // disappeared?
123802633b541b04ad5ffc1c70f4c2feeeb13e607057Daniel Dunbar
123902633b541b04ad5ffc1c70f4c2feeeb13e607057Daniel Dunbar  ArgStringList CmdArgs;
124002633b541b04ad5ffc1c70f4c2feeeb13e607057Daniel Dunbar
124102633b541b04ad5ffc1c70f4c2feeeb13e607057Daniel Dunbar  // I'm not sure why this particular decomposition exists in gcc, but
124202633b541b04ad5ffc1c70f4c2feeeb13e607057Daniel Dunbar  // we follow suite for ease of comparison.
124302633b541b04ad5ffc1c70f4c2feeeb13e607057Daniel Dunbar  AddLinkArgs(Args, CmdArgs);
124402633b541b04ad5ffc1c70f4c2feeeb13e607057Daniel Dunbar
124502633b541b04ad5ffc1c70f4c2feeeb13e607057Daniel Dunbar  // FIXME: gcc has %{x} in here. How could this ever happen?  Cruft?
124602633b541b04ad5ffc1c70f4c2feeeb13e607057Daniel Dunbar  Args.AddAllArgs(CmdArgs, options::OPT_d_Flag);
124702633b541b04ad5ffc1c70f4c2feeeb13e607057Daniel Dunbar  Args.AddAllArgs(CmdArgs, options::OPT_s);
124802633b541b04ad5ffc1c70f4c2feeeb13e607057Daniel Dunbar  Args.AddAllArgs(CmdArgs, options::OPT_t);
124902633b541b04ad5ffc1c70f4c2feeeb13e607057Daniel Dunbar  Args.AddAllArgs(CmdArgs, options::OPT_Z_Flag);
125002633b541b04ad5ffc1c70f4c2feeeb13e607057Daniel Dunbar  Args.AddAllArgs(CmdArgs, options::OPT_u_Group);
125102633b541b04ad5ffc1c70f4c2feeeb13e607057Daniel Dunbar  Args.AddAllArgs(CmdArgs, options::OPT_A);
125202633b541b04ad5ffc1c70f4c2feeeb13e607057Daniel Dunbar  Args.AddLastArg(CmdArgs, options::OPT_e);
125302633b541b04ad5ffc1c70f4c2feeeb13e607057Daniel Dunbar  Args.AddAllArgs(CmdArgs, options::OPT_m_Separate);
125402633b541b04ad5ffc1c70f4c2feeeb13e607057Daniel Dunbar  Args.AddAllArgs(CmdArgs, options::OPT_r);
125502633b541b04ad5ffc1c70f4c2feeeb13e607057Daniel Dunbar
125602633b541b04ad5ffc1c70f4c2feeeb13e607057Daniel Dunbar  // FIXME: This is just being pedantically bug compatible, gcc
125702633b541b04ad5ffc1c70f4c2feeeb13e607057Daniel Dunbar  // doesn't *mean* to forward this, it just does (yay for pattern
125802633b541b04ad5ffc1c70f4c2feeeb13e607057Daniel Dunbar  // matching). It doesn't work, of course.
125902633b541b04ad5ffc1c70f4c2feeeb13e607057Daniel Dunbar  Args.AddAllArgs(CmdArgs, options::OPT_object);
126002633b541b04ad5ffc1c70f4c2feeeb13e607057Daniel Dunbar
126102633b541b04ad5ffc1c70f4c2feeeb13e607057Daniel Dunbar  CmdArgs.push_back("-o");
126202633b541b04ad5ffc1c70f4c2feeeb13e607057Daniel Dunbar  CmdArgs.push_back(Output.getFilename());
126302633b541b04ad5ffc1c70f4c2feeeb13e607057Daniel Dunbar
126402633b541b04ad5ffc1c70f4c2feeeb13e607057Daniel Dunbar  unsigned MacosxVersion[3];
126502633b541b04ad5ffc1c70f4c2feeeb13e607057Daniel Dunbar  if (Arg *A = Args.getLastArg(options::OPT_mmacosx_version_min_EQ)) {
126602633b541b04ad5ffc1c70f4c2feeeb13e607057Daniel Dunbar    bool HadExtra;
126702633b541b04ad5ffc1c70f4c2feeeb13e607057Daniel Dunbar    if (!Driver::GetReleaseVersion(A->getValue(Args), MacosxVersion[0],
126802633b541b04ad5ffc1c70f4c2feeeb13e607057Daniel Dunbar                                   MacosxVersion[1], MacosxVersion[2],
126902633b541b04ad5ffc1c70f4c2feeeb13e607057Daniel Dunbar                                   HadExtra) ||
127002633b541b04ad5ffc1c70f4c2feeeb13e607057Daniel Dunbar        HadExtra) {
127102633b541b04ad5ffc1c70f4c2feeeb13e607057Daniel Dunbar      const Driver &D = getToolChain().getHost().getDriver();
127202633b541b04ad5ffc1c70f4c2feeeb13e607057Daniel Dunbar      D.Diag(clang::diag::err_drv_invalid_version_number)
127302633b541b04ad5ffc1c70f4c2feeeb13e607057Daniel Dunbar        << A->getAsString(Args);
127402633b541b04ad5ffc1c70f4c2feeeb13e607057Daniel Dunbar    }
127502633b541b04ad5ffc1c70f4c2feeeb13e607057Daniel Dunbar  } else {
127602633b541b04ad5ffc1c70f4c2feeeb13e607057Daniel Dunbar    getDarwinToolChain().getMacosxVersion(MacosxVersion);
127702633b541b04ad5ffc1c70f4c2feeeb13e607057Daniel Dunbar  }
127802633b541b04ad5ffc1c70f4c2feeeb13e607057Daniel Dunbar
127902633b541b04ad5ffc1c70f4c2feeeb13e607057Daniel Dunbar  if (!Args.hasArg(options::OPT_A) &&
128002633b541b04ad5ffc1c70f4c2feeeb13e607057Daniel Dunbar      !Args.hasArg(options::OPT_nostdlib) &&
128102633b541b04ad5ffc1c70f4c2feeeb13e607057Daniel Dunbar      !Args.hasArg(options::OPT_nostartfiles)) {
128202633b541b04ad5ffc1c70f4c2feeeb13e607057Daniel Dunbar    // Derived from startfile spec.
128302633b541b04ad5ffc1c70f4c2feeeb13e607057Daniel Dunbar    if (Args.hasArg(options::OPT_dynamiclib)) {
128402633b541b04ad5ffc1c70f4c2feeeb13e607057Daniel Dunbar        // Derived from darwin_dylib1 spec.
12858a8d8afa3df40e9f122d2b826f1a825a66f6908dDaniel Dunbar      if (isMacosxVersionLT(MacosxVersion, 10, 5))
128602633b541b04ad5ffc1c70f4c2feeeb13e607057Daniel Dunbar        CmdArgs.push_back("-ldylib1.o");
12878a8d8afa3df40e9f122d2b826f1a825a66f6908dDaniel Dunbar      else if (isMacosxVersionLT(MacosxVersion, 10, 6))
128802633b541b04ad5ffc1c70f4c2feeeb13e607057Daniel Dunbar        CmdArgs.push_back("-ldylib1.10.5.o");
128902633b541b04ad5ffc1c70f4c2feeeb13e607057Daniel Dunbar    } else {
129002633b541b04ad5ffc1c70f4c2feeeb13e607057Daniel Dunbar      if (Args.hasArg(options::OPT_bundle)) {
12918a8d8afa3df40e9f122d2b826f1a825a66f6908dDaniel Dunbar        if (!Args.hasArg(options::OPT_static)) {
12928a8d8afa3df40e9f122d2b826f1a825a66f6908dDaniel Dunbar          // Derived from darwin_bundle1 spec.
12938a8d8afa3df40e9f122d2b826f1a825a66f6908dDaniel Dunbar          if (isMacosxVersionLT(MacosxVersion, 10, 6))
12948a8d8afa3df40e9f122d2b826f1a825a66f6908dDaniel Dunbar            CmdArgs.push_back("-lbundle1.o");
12958a8d8afa3df40e9f122d2b826f1a825a66f6908dDaniel Dunbar        }
129602633b541b04ad5ffc1c70f4c2feeeb13e607057Daniel Dunbar      } else {
129702633b541b04ad5ffc1c70f4c2feeeb13e607057Daniel Dunbar        if (Args.hasArg(options::OPT_pg)) {
129802633b541b04ad5ffc1c70f4c2feeeb13e607057Daniel Dunbar          if (Args.hasArg(options::OPT_static) ||
129902633b541b04ad5ffc1c70f4c2feeeb13e607057Daniel Dunbar              Args.hasArg(options::OPT_object) ||
130002633b541b04ad5ffc1c70f4c2feeeb13e607057Daniel Dunbar              Args.hasArg(options::OPT_preload)) {
130102633b541b04ad5ffc1c70f4c2feeeb13e607057Daniel Dunbar            CmdArgs.push_back("-lgcrt0.o");
130202633b541b04ad5ffc1c70f4c2feeeb13e607057Daniel Dunbar          } else {
130302633b541b04ad5ffc1c70f4c2feeeb13e607057Daniel Dunbar            CmdArgs.push_back("-lgcrt1.o");
130402633b541b04ad5ffc1c70f4c2feeeb13e607057Daniel Dunbar
130502633b541b04ad5ffc1c70f4c2feeeb13e607057Daniel Dunbar            // darwin_crt2 spec is empty.
130602633b541b04ad5ffc1c70f4c2feeeb13e607057Daniel Dunbar          }
130702633b541b04ad5ffc1c70f4c2feeeb13e607057Daniel Dunbar        } else {
130802633b541b04ad5ffc1c70f4c2feeeb13e607057Daniel Dunbar          if (Args.hasArg(options::OPT_static) ||
130902633b541b04ad5ffc1c70f4c2feeeb13e607057Daniel Dunbar              Args.hasArg(options::OPT_object) ||
131002633b541b04ad5ffc1c70f4c2feeeb13e607057Daniel Dunbar              Args.hasArg(options::OPT_preload)) {
131102633b541b04ad5ffc1c70f4c2feeeb13e607057Daniel Dunbar            CmdArgs.push_back("-lcrt0.o");
131202633b541b04ad5ffc1c70f4c2feeeb13e607057Daniel Dunbar          } else {
131302633b541b04ad5ffc1c70f4c2feeeb13e607057Daniel Dunbar            // Derived from darwin_crt1 spec.
13148a8d8afa3df40e9f122d2b826f1a825a66f6908dDaniel Dunbar            if (isMacosxVersionLT(MacosxVersion, 10, 5))
131502633b541b04ad5ffc1c70f4c2feeeb13e607057Daniel Dunbar              CmdArgs.push_back("-lcrt1.o");
13168a8d8afa3df40e9f122d2b826f1a825a66f6908dDaniel Dunbar            else if (isMacosxVersionLT(MacosxVersion, 10, 6))
131702633b541b04ad5ffc1c70f4c2feeeb13e607057Daniel Dunbar              CmdArgs.push_back("-lcrt1.10.5.o");
13188a8d8afa3df40e9f122d2b826f1a825a66f6908dDaniel Dunbar            else
13198a8d8afa3df40e9f122d2b826f1a825a66f6908dDaniel Dunbar              CmdArgs.push_back("-lcrt1.10.6.o");
13208a8d8afa3df40e9f122d2b826f1a825a66f6908dDaniel Dunbar
13218a8d8afa3df40e9f122d2b826f1a825a66f6908dDaniel Dunbar            // darwin_crt2 spec is empty.
132202633b541b04ad5ffc1c70f4c2feeeb13e607057Daniel Dunbar          }
132302633b541b04ad5ffc1c70f4c2feeeb13e607057Daniel Dunbar        }
132402633b541b04ad5ffc1c70f4c2feeeb13e607057Daniel Dunbar      }
132502633b541b04ad5ffc1c70f4c2feeeb13e607057Daniel Dunbar    }
132602633b541b04ad5ffc1c70f4c2feeeb13e607057Daniel Dunbar
132702633b541b04ad5ffc1c70f4c2feeeb13e607057Daniel Dunbar    if (Args.hasArg(options::OPT_shared_libgcc) &&
132802633b541b04ad5ffc1c70f4c2feeeb13e607057Daniel Dunbar        !Args.hasArg(options::OPT_miphoneos_version_min_EQ) &&
132902633b541b04ad5ffc1c70f4c2feeeb13e607057Daniel Dunbar        isMacosxVersionLT(MacosxVersion, 10, 5)) {
133002633b541b04ad5ffc1c70f4c2feeeb13e607057Daniel Dunbar      const char *Str = getToolChain().GetFilePath(C, "crt3.o").c_str();
133102633b541b04ad5ffc1c70f4c2feeeb13e607057Daniel Dunbar      CmdArgs.push_back(Args.MakeArgString(Str));
133202633b541b04ad5ffc1c70f4c2feeeb13e607057Daniel Dunbar    }
133302633b541b04ad5ffc1c70f4c2feeeb13e607057Daniel Dunbar  }
133402633b541b04ad5ffc1c70f4c2feeeb13e607057Daniel Dunbar
133502633b541b04ad5ffc1c70f4c2feeeb13e607057Daniel Dunbar  Args.AddAllArgs(CmdArgs, options::OPT_L);
133602633b541b04ad5ffc1c70f4c2feeeb13e607057Daniel Dunbar
133702633b541b04ad5ffc1c70f4c2feeeb13e607057Daniel Dunbar  if (Args.hasArg(options::OPT_fopenmp))
133802633b541b04ad5ffc1c70f4c2feeeb13e607057Daniel Dunbar    // This is more complicated in gcc...
133902633b541b04ad5ffc1c70f4c2feeeb13e607057Daniel Dunbar    CmdArgs.push_back("-lgomp");
134002633b541b04ad5ffc1c70f4c2feeeb13e607057Daniel Dunbar
134102633b541b04ad5ffc1c70f4c2feeeb13e607057Daniel Dunbar  // FIXME: Derive these correctly.
134202633b541b04ad5ffc1c70f4c2feeeb13e607057Daniel Dunbar  const char *TCDir = getDarwinToolChain().getToolChainDir().c_str();
134302633b541b04ad5ffc1c70f4c2feeeb13e607057Daniel Dunbar  if (getToolChain().getArchName() == "x86_64") {
134402633b541b04ad5ffc1c70f4c2feeeb13e607057Daniel Dunbar    CmdArgs.push_back(MakeFormattedString(Args,
134502633b541b04ad5ffc1c70f4c2feeeb13e607057Daniel Dunbar                              llvm::format("-L/usr/lib/gcc/%s/x86_64", TCDir)));
134602633b541b04ad5ffc1c70f4c2feeeb13e607057Daniel Dunbar    // Intentionally duplicated for (temporary) gcc bug compatibility.
134702633b541b04ad5ffc1c70f4c2feeeb13e607057Daniel Dunbar    CmdArgs.push_back(MakeFormattedString(Args,
134802633b541b04ad5ffc1c70f4c2feeeb13e607057Daniel Dunbar                              llvm::format("-L/usr/lib/gcc/%s/x86_64", TCDir)));
134902633b541b04ad5ffc1c70f4c2feeeb13e607057Daniel Dunbar  }
135002633b541b04ad5ffc1c70f4c2feeeb13e607057Daniel Dunbar  CmdArgs.push_back(MakeFormattedString(Args,
135102633b541b04ad5ffc1c70f4c2feeeb13e607057Daniel Dunbar                                        llvm::format("-L/usr/lib/%s", TCDir)));
135202633b541b04ad5ffc1c70f4c2feeeb13e607057Daniel Dunbar  CmdArgs.push_back(MakeFormattedString(Args,
135302633b541b04ad5ffc1c70f4c2feeeb13e607057Daniel Dunbar                                     llvm::format("-L/usr/lib/gcc/%s", TCDir)));
135402633b541b04ad5ffc1c70f4c2feeeb13e607057Daniel Dunbar  // Intentionally duplicated for (temporary) gcc bug compatibility.
135502633b541b04ad5ffc1c70f4c2feeeb13e607057Daniel Dunbar  CmdArgs.push_back(MakeFormattedString(Args,
135602633b541b04ad5ffc1c70f4c2feeeb13e607057Daniel Dunbar                                     llvm::format("-L/usr/lib/gcc/%s", TCDir)));
135702633b541b04ad5ffc1c70f4c2feeeb13e607057Daniel Dunbar  CmdArgs.push_back(MakeFormattedString(Args,
135802633b541b04ad5ffc1c70f4c2feeeb13e607057Daniel Dunbar                  llvm::format("-L/usr/lib/gcc/%s/../../../%s", TCDir, TCDir)));
135902633b541b04ad5ffc1c70f4c2feeeb13e607057Daniel Dunbar  CmdArgs.push_back(MakeFormattedString(Args,
136002633b541b04ad5ffc1c70f4c2feeeb13e607057Daniel Dunbar                            llvm::format("-L/usr/lib/gcc/%s/../../..", TCDir)));
136102633b541b04ad5ffc1c70f4c2feeeb13e607057Daniel Dunbar
136202633b541b04ad5ffc1c70f4c2feeeb13e607057Daniel Dunbar  for (InputInfoList::const_iterator
136302633b541b04ad5ffc1c70f4c2feeeb13e607057Daniel Dunbar         it = Inputs.begin(), ie = Inputs.end(); it != ie; ++it) {
136402633b541b04ad5ffc1c70f4c2feeeb13e607057Daniel Dunbar    const InputInfo &II = *it;
136502633b541b04ad5ffc1c70f4c2feeeb13e607057Daniel Dunbar    if (II.isFilename())
136602633b541b04ad5ffc1c70f4c2feeeb13e607057Daniel Dunbar      CmdArgs.push_back(II.getFilename());
136702633b541b04ad5ffc1c70f4c2feeeb13e607057Daniel Dunbar    else
136802633b541b04ad5ffc1c70f4c2feeeb13e607057Daniel Dunbar      II.getInputArg().renderAsInput(Args, CmdArgs);
136902633b541b04ad5ffc1c70f4c2feeeb13e607057Daniel Dunbar  }
137002633b541b04ad5ffc1c70f4c2feeeb13e607057Daniel Dunbar
137102633b541b04ad5ffc1c70f4c2feeeb13e607057Daniel Dunbar  if (LinkingOutput) {
137202633b541b04ad5ffc1c70f4c2feeeb13e607057Daniel Dunbar    CmdArgs.push_back("-arch_multiple");
137302633b541b04ad5ffc1c70f4c2feeeb13e607057Daniel Dunbar    CmdArgs.push_back("-final_output");
137402633b541b04ad5ffc1c70f4c2feeeb13e607057Daniel Dunbar    CmdArgs.push_back(LinkingOutput);
137502633b541b04ad5ffc1c70f4c2feeeb13e607057Daniel Dunbar  }
137602633b541b04ad5ffc1c70f4c2feeeb13e607057Daniel Dunbar
137702633b541b04ad5ffc1c70f4c2feeeb13e607057Daniel Dunbar  if (Args.hasArg(options::OPT_fprofile_arcs) ||
137802633b541b04ad5ffc1c70f4c2feeeb13e607057Daniel Dunbar      Args.hasArg(options::OPT_fprofile_generate) ||
137902633b541b04ad5ffc1c70f4c2feeeb13e607057Daniel Dunbar      Args.hasArg(options::OPT_fcreate_profile) ||
138002633b541b04ad5ffc1c70f4c2feeeb13e607057Daniel Dunbar      Args.hasArg(options::OPT_coverage))
138102633b541b04ad5ffc1c70f4c2feeeb13e607057Daniel Dunbar    CmdArgs.push_back("-lgcov");
138202633b541b04ad5ffc1c70f4c2feeeb13e607057Daniel Dunbar
138302633b541b04ad5ffc1c70f4c2feeeb13e607057Daniel Dunbar  if (Args.hasArg(options::OPT_fnested_functions))
138402633b541b04ad5ffc1c70f4c2feeeb13e607057Daniel Dunbar    CmdArgs.push_back("-allow_stack_execute");
138502633b541b04ad5ffc1c70f4c2feeeb13e607057Daniel Dunbar
138602633b541b04ad5ffc1c70f4c2feeeb13e607057Daniel Dunbar  if (!Args.hasArg(options::OPT_nostdlib) &&
138702633b541b04ad5ffc1c70f4c2feeeb13e607057Daniel Dunbar      !Args.hasArg(options::OPT_nodefaultlibs)) {
138802633b541b04ad5ffc1c70f4c2feeeb13e607057Daniel Dunbar    // link_ssp spec is empty.
138902633b541b04ad5ffc1c70f4c2feeeb13e607057Daniel Dunbar
13908a8d8afa3df40e9f122d2b826f1a825a66f6908dDaniel Dunbar    // Derived from libgcc and lib specs but refactored.
139102633b541b04ad5ffc1c70f4c2feeeb13e607057Daniel Dunbar    if (Args.hasArg(options::OPT_static)) {
139202633b541b04ad5ffc1c70f4c2feeeb13e607057Daniel Dunbar      CmdArgs.push_back("-lgcc_static");
139302633b541b04ad5ffc1c70f4c2feeeb13e607057Daniel Dunbar    } else {
13948a8d8afa3df40e9f122d2b826f1a825a66f6908dDaniel Dunbar      if (Args.hasArg(options::OPT_static_libgcc)) {
13958a8d8afa3df40e9f122d2b826f1a825a66f6908dDaniel Dunbar        CmdArgs.push_back("-lgcc_eh");
13968a8d8afa3df40e9f122d2b826f1a825a66f6908dDaniel Dunbar      } else if (Args.hasArg(options::OPT_miphoneos_version_min_EQ)) {
13978a8d8afa3df40e9f122d2b826f1a825a66f6908dDaniel Dunbar        // Derived from darwin_iphoneos_libgcc spec.
139802633b541b04ad5ffc1c70f4c2feeeb13e607057Daniel Dunbar        CmdArgs.push_back("-lgcc_s.10.5");
13998a8d8afa3df40e9f122d2b826f1a825a66f6908dDaniel Dunbar      } else if (Args.hasArg(options::OPT_shared_libgcc) ||
14008a8d8afa3df40e9f122d2b826f1a825a66f6908dDaniel Dunbar                 Args.hasArg(options::OPT_fexceptions) ||
14018a8d8afa3df40e9f122d2b826f1a825a66f6908dDaniel Dunbar                 Args.hasArg(options::OPT_fgnu_runtime)) {
14028a8d8afa3df40e9f122d2b826f1a825a66f6908dDaniel Dunbar        // FIXME: This is probably broken on 10.3?
14038a8d8afa3df40e9f122d2b826f1a825a66f6908dDaniel Dunbar        if (isMacosxVersionLT(MacosxVersion, 10, 5))
14048a8d8afa3df40e9f122d2b826f1a825a66f6908dDaniel Dunbar          CmdArgs.push_back("-lgcc_s.10.4");
14058a8d8afa3df40e9f122d2b826f1a825a66f6908dDaniel Dunbar        else if (isMacosxVersionLT(MacosxVersion, 10, 6))
14068a8d8afa3df40e9f122d2b826f1a825a66f6908dDaniel Dunbar          CmdArgs.push_back("-lgcc_s.10.5");
14078a8d8afa3df40e9f122d2b826f1a825a66f6908dDaniel Dunbar      } else {
14088a8d8afa3df40e9f122d2b826f1a825a66f6908dDaniel Dunbar        if (isMacosxVersionLT(MacosxVersion, 10, 3, 9))
14098a8d8afa3df40e9f122d2b826f1a825a66f6908dDaniel Dunbar          ; // Do nothing.
14108a8d8afa3df40e9f122d2b826f1a825a66f6908dDaniel Dunbar        else if (isMacosxVersionLT(MacosxVersion, 10, 5))
14118a8d8afa3df40e9f122d2b826f1a825a66f6908dDaniel Dunbar          CmdArgs.push_back("-lgcc_s.10.4");
14128a8d8afa3df40e9f122d2b826f1a825a66f6908dDaniel Dunbar        else if (isMacosxVersionLT(MacosxVersion, 10, 6))
14138a8d8afa3df40e9f122d2b826f1a825a66f6908dDaniel Dunbar          CmdArgs.push_back("-lgcc_s.10.5");
14148a8d8afa3df40e9f122d2b826f1a825a66f6908dDaniel Dunbar      }
141502633b541b04ad5ffc1c70f4c2feeeb13e607057Daniel Dunbar
14168a8d8afa3df40e9f122d2b826f1a825a66f6908dDaniel Dunbar      if (isMacosxVersionLT(MacosxVersion, 10, 6)) {
14178a8d8afa3df40e9f122d2b826f1a825a66f6908dDaniel Dunbar        CmdArgs.push_back("-lgcc");
14188a8d8afa3df40e9f122d2b826f1a825a66f6908dDaniel Dunbar        CmdArgs.push_back("-lSystem");
14198a8d8afa3df40e9f122d2b826f1a825a66f6908dDaniel Dunbar      } else {
14208a8d8afa3df40e9f122d2b826f1a825a66f6908dDaniel Dunbar        CmdArgs.push_back("-lSystem");
14218a8d8afa3df40e9f122d2b826f1a825a66f6908dDaniel Dunbar        CmdArgs.push_back("-lgcc");
14228a8d8afa3df40e9f122d2b826f1a825a66f6908dDaniel Dunbar      }
14238a8d8afa3df40e9f122d2b826f1a825a66f6908dDaniel Dunbar    }
142402633b541b04ad5ffc1c70f4c2feeeb13e607057Daniel Dunbar  }
142502633b541b04ad5ffc1c70f4c2feeeb13e607057Daniel Dunbar
142602633b541b04ad5ffc1c70f4c2feeeb13e607057Daniel Dunbar  if (!Args.hasArg(options::OPT_A) &&
142702633b541b04ad5ffc1c70f4c2feeeb13e607057Daniel Dunbar      !Args.hasArg(options::OPT_nostdlib) &&
142802633b541b04ad5ffc1c70f4c2feeeb13e607057Daniel Dunbar      !Args.hasArg(options::OPT_nostartfiles)) {
142902633b541b04ad5ffc1c70f4c2feeeb13e607057Daniel Dunbar    // endfile_spec is empty.
143002633b541b04ad5ffc1c70f4c2feeeb13e607057Daniel Dunbar  }
143102633b541b04ad5ffc1c70f4c2feeeb13e607057Daniel Dunbar
143202633b541b04ad5ffc1c70f4c2feeeb13e607057Daniel Dunbar  Args.AddAllArgs(CmdArgs, options::OPT_T_Group);
143302633b541b04ad5ffc1c70f4c2feeeb13e607057Daniel Dunbar  Args.AddAllArgs(CmdArgs, options::OPT_F);
143402633b541b04ad5ffc1c70f4c2feeeb13e607057Daniel Dunbar
143502633b541b04ad5ffc1c70f4c2feeeb13e607057Daniel Dunbar  const char *Exec =
143602633b541b04ad5ffc1c70f4c2feeeb13e607057Daniel Dunbar    Args.MakeArgString(getToolChain().GetProgramPath(C, "collect2").c_str());
143702633b541b04ad5ffc1c70f4c2feeeb13e607057Daniel Dunbar  Dest.addCommand(new Command(Exec, CmdArgs));
143802633b541b04ad5ffc1c70f4c2feeeb13e607057Daniel Dunbar
143902633b541b04ad5ffc1c70f4c2feeeb13e607057Daniel Dunbar  if (Args.getLastArg(options::OPT_g_Group) &&
144002633b541b04ad5ffc1c70f4c2feeeb13e607057Daniel Dunbar      !Args.getLastArg(options::OPT_gstabs) &&
144102633b541b04ad5ffc1c70f4c2feeeb13e607057Daniel Dunbar      !Args.getLastArg(options::OPT_g0)) {
144202633b541b04ad5ffc1c70f4c2feeeb13e607057Daniel Dunbar    // FIXME: This is gross, but matches gcc. The test only considers
144302633b541b04ad5ffc1c70f4c2feeeb13e607057Daniel Dunbar    // the suffix (not the -x type), and then only of the first
144402633b541b04ad5ffc1c70f4c2feeeb13e607057Daniel Dunbar    // input. Awesome.
144502633b541b04ad5ffc1c70f4c2feeeb13e607057Daniel Dunbar    const char *Suffix = strchr(Inputs[0].getBaseInput(), '.');
144602633b541b04ad5ffc1c70f4c2feeeb13e607057Daniel Dunbar    if (Suffix && isSourceSuffix(Suffix + 1)) {
144702633b541b04ad5ffc1c70f4c2feeeb13e607057Daniel Dunbar      const char *Exec =
144802633b541b04ad5ffc1c70f4c2feeeb13e607057Daniel Dunbar       Args.MakeArgString(getToolChain().GetProgramPath(C, "dsymutil").c_str());
144902633b541b04ad5ffc1c70f4c2feeeb13e607057Daniel Dunbar      ArgStringList CmdArgs;
145002633b541b04ad5ffc1c70f4c2feeeb13e607057Daniel Dunbar      CmdArgs.push_back(Output.getFilename());
145102633b541b04ad5ffc1c70f4c2feeeb13e607057Daniel Dunbar      C.getJobs().addCommand(new Command(Exec, CmdArgs));
145202633b541b04ad5ffc1c70f4c2feeeb13e607057Daniel Dunbar    }
145302633b541b04ad5ffc1c70f4c2feeeb13e607057Daniel Dunbar  }
145402633b541b04ad5ffc1c70f4c2feeeb13e607057Daniel Dunbar}
145502633b541b04ad5ffc1c70f4c2feeeb13e607057Daniel Dunbar
1456ff7488dc9a766f94daf54d81b03ab9160d0bfd88Daniel Dunbarvoid darwin::Lipo::ConstructJob(Compilation &C, const JobAction &JA,
14578cac5f7e1ce63dd77ee0fb4ef68f9fa804f41ea6Daniel Dunbar                                Job &Dest, const InputInfo &Output,
1458ff7488dc9a766f94daf54d81b03ab9160d0bfd88Daniel Dunbar                                const InputInfoList &Inputs,
1459ff7488dc9a766f94daf54d81b03ab9160d0bfd88Daniel Dunbar                                const ArgList &Args,
1460ff7488dc9a766f94daf54d81b03ab9160d0bfd88Daniel Dunbar                                const char *LinkingOutput) const {
1461ff7488dc9a766f94daf54d81b03ab9160d0bfd88Daniel Dunbar  ArgStringList CmdArgs;
1462ff7488dc9a766f94daf54d81b03ab9160d0bfd88Daniel Dunbar
1463ff7488dc9a766f94daf54d81b03ab9160d0bfd88Daniel Dunbar  CmdArgs.push_back("-create");
1464ff7488dc9a766f94daf54d81b03ab9160d0bfd88Daniel Dunbar  assert(Output.isFilename() && "Unexpected lipo output.");
1465a428df828ea4cc6916ea90dcd9fbbc840776d207Daniel Dunbar
1466a428df828ea4cc6916ea90dcd9fbbc840776d207Daniel Dunbar  CmdArgs.push_back("-output");
1467ff7488dc9a766f94daf54d81b03ab9160d0bfd88Daniel Dunbar  CmdArgs.push_back(Output.getFilename());
1468a428df828ea4cc6916ea90dcd9fbbc840776d207Daniel Dunbar
1469ff7488dc9a766f94daf54d81b03ab9160d0bfd88Daniel Dunbar  for (InputInfoList::const_iterator
1470ff7488dc9a766f94daf54d81b03ab9160d0bfd88Daniel Dunbar         it = Inputs.begin(), ie = Inputs.end(); it != ie; ++it) {
1471ff7488dc9a766f94daf54d81b03ab9160d0bfd88Daniel Dunbar    const InputInfo &II = *it;
1472ff7488dc9a766f94daf54d81b03ab9160d0bfd88Daniel Dunbar    assert(II.isFilename() && "Unexpected lipo input.");
1473ff7488dc9a766f94daf54d81b03ab9160d0bfd88Daniel Dunbar    CmdArgs.push_back(II.getFilename());
1474ff7488dc9a766f94daf54d81b03ab9160d0bfd88Daniel Dunbar  }
1475ff7488dc9a766f94daf54d81b03ab9160d0bfd88Daniel Dunbar  const char *Exec =
1476ff7488dc9a766f94daf54d81b03ab9160d0bfd88Daniel Dunbar    Args.MakeArgString(getToolChain().GetProgramPath(C, "lipo").c_str());
1477ff7488dc9a766f94daf54d81b03ab9160d0bfd88Daniel Dunbar  Dest.addCommand(new Command(Exec, CmdArgs));
1478ff7488dc9a766f94daf54d81b03ab9160d0bfd88Daniel Dunbar}
147968a31d406c6dc4382c700d1199b062de2aa7e1daDaniel Dunbar
148068a31d406c6dc4382c700d1199b062de2aa7e1daDaniel Dunbarvoid freebsd::Assemble::ConstructJob(Compilation &C, const JobAction &JA,
148168a31d406c6dc4382c700d1199b062de2aa7e1daDaniel Dunbar                                    Job &Dest, const InputInfo &Output,
148268a31d406c6dc4382c700d1199b062de2aa7e1daDaniel Dunbar                                    const InputInfoList &Inputs,
148368a31d406c6dc4382c700d1199b062de2aa7e1daDaniel Dunbar                                    const ArgList &Args,
148468a31d406c6dc4382c700d1199b062de2aa7e1daDaniel Dunbar                                    const char *LinkingOutput) const
148568a31d406c6dc4382c700d1199b062de2aa7e1daDaniel Dunbar{
148668a31d406c6dc4382c700d1199b062de2aa7e1daDaniel Dunbar  ArgStringList CmdArgs;
148768a31d406c6dc4382c700d1199b062de2aa7e1daDaniel Dunbar
1488008f54a54299eaafdaa940e2bdeaf55935ecd95aDaniel Dunbar  // When building 32-bit code on FreeBSD/amd64, we have to explicitly
1489008f54a54299eaafdaa940e2bdeaf55935ecd95aDaniel Dunbar  // instruct as in the base system to assemble 32-bit code.
1490008f54a54299eaafdaa940e2bdeaf55935ecd95aDaniel Dunbar  if (getToolChain().getArchName() == "i386")
149168a31d406c6dc4382c700d1199b062de2aa7e1daDaniel Dunbar    CmdArgs.push_back("--32");
149268a31d406c6dc4382c700d1199b062de2aa7e1daDaniel Dunbar
149368a31d406c6dc4382c700d1199b062de2aa7e1daDaniel Dunbar  Args.AddAllArgValues(CmdArgs, options::OPT_Wa_COMMA,
149468a31d406c6dc4382c700d1199b062de2aa7e1daDaniel Dunbar                       options::OPT_Xassembler);
149568a31d406c6dc4382c700d1199b062de2aa7e1daDaniel Dunbar
149668a31d406c6dc4382c700d1199b062de2aa7e1daDaniel Dunbar  CmdArgs.push_back("-o");
149768a31d406c6dc4382c700d1199b062de2aa7e1daDaniel Dunbar  if (Output.isPipe())
149868a31d406c6dc4382c700d1199b062de2aa7e1daDaniel Dunbar    CmdArgs.push_back("-");
149968a31d406c6dc4382c700d1199b062de2aa7e1daDaniel Dunbar  else
150068a31d406c6dc4382c700d1199b062de2aa7e1daDaniel Dunbar    CmdArgs.push_back(Output.getFilename());
150168a31d406c6dc4382c700d1199b062de2aa7e1daDaniel Dunbar
150268a31d406c6dc4382c700d1199b062de2aa7e1daDaniel Dunbar  for (InputInfoList::const_iterator
150368a31d406c6dc4382c700d1199b062de2aa7e1daDaniel Dunbar         it = Inputs.begin(), ie = Inputs.end(); it != ie; ++it) {
150468a31d406c6dc4382c700d1199b062de2aa7e1daDaniel Dunbar    const InputInfo &II = *it;
150568a31d406c6dc4382c700d1199b062de2aa7e1daDaniel Dunbar    if (II.isPipe())
150668a31d406c6dc4382c700d1199b062de2aa7e1daDaniel Dunbar      CmdArgs.push_back("-");
150768a31d406c6dc4382c700d1199b062de2aa7e1daDaniel Dunbar    else
150868a31d406c6dc4382c700d1199b062de2aa7e1daDaniel Dunbar      CmdArgs.push_back(II.getFilename());
150968a31d406c6dc4382c700d1199b062de2aa7e1daDaniel Dunbar  }
151068a31d406c6dc4382c700d1199b062de2aa7e1daDaniel Dunbar
151168a31d406c6dc4382c700d1199b062de2aa7e1daDaniel Dunbar  const char *Exec =
151268a31d406c6dc4382c700d1199b062de2aa7e1daDaniel Dunbar    Args.MakeArgString(getToolChain().GetProgramPath(C, "as").c_str());
151368a31d406c6dc4382c700d1199b062de2aa7e1daDaniel Dunbar  Dest.addCommand(new Command(Exec, CmdArgs));
151468a31d406c6dc4382c700d1199b062de2aa7e1daDaniel Dunbar}
1515008f54a54299eaafdaa940e2bdeaf55935ecd95aDaniel Dunbar
1516008f54a54299eaafdaa940e2bdeaf55935ecd95aDaniel Dunbarvoid freebsd::Link::ConstructJob(Compilation &C, const JobAction &JA,
1517008f54a54299eaafdaa940e2bdeaf55935ecd95aDaniel Dunbar                                 Job &Dest, const InputInfo &Output,
1518008f54a54299eaafdaa940e2bdeaf55935ecd95aDaniel Dunbar                                 const InputInfoList &Inputs,
1519008f54a54299eaafdaa940e2bdeaf55935ecd95aDaniel Dunbar                                 const ArgList &Args,
1520008f54a54299eaafdaa940e2bdeaf55935ecd95aDaniel Dunbar                                 const char *LinkingOutput) const
1521008f54a54299eaafdaa940e2bdeaf55935ecd95aDaniel Dunbar{
1522008f54a54299eaafdaa940e2bdeaf55935ecd95aDaniel Dunbar  ArgStringList CmdArgs;
1523008f54a54299eaafdaa940e2bdeaf55935ecd95aDaniel Dunbar
1524008f54a54299eaafdaa940e2bdeaf55935ecd95aDaniel Dunbar  if (Args.hasArg(options::OPT_static)) {
1525008f54a54299eaafdaa940e2bdeaf55935ecd95aDaniel Dunbar    CmdArgs.push_back("-Bstatic");
1526008f54a54299eaafdaa940e2bdeaf55935ecd95aDaniel Dunbar  } else {
1527008f54a54299eaafdaa940e2bdeaf55935ecd95aDaniel Dunbar    CmdArgs.push_back("--eh-frame-hdr");
1528008f54a54299eaafdaa940e2bdeaf55935ecd95aDaniel Dunbar    if (Args.hasArg(options::OPT_shared)) {
1529008f54a54299eaafdaa940e2bdeaf55935ecd95aDaniel Dunbar      CmdArgs.push_back("-Bshareable");
1530008f54a54299eaafdaa940e2bdeaf55935ecd95aDaniel Dunbar    } else {
1531008f54a54299eaafdaa940e2bdeaf55935ecd95aDaniel Dunbar      CmdArgs.push_back("-dynamic-linker");
1532008f54a54299eaafdaa940e2bdeaf55935ecd95aDaniel Dunbar      CmdArgs.push_back("/libexec/ld-elf.so.1");
1533008f54a54299eaafdaa940e2bdeaf55935ecd95aDaniel Dunbar    }
1534008f54a54299eaafdaa940e2bdeaf55935ecd95aDaniel Dunbar  }
1535008f54a54299eaafdaa940e2bdeaf55935ecd95aDaniel Dunbar
1536008f54a54299eaafdaa940e2bdeaf55935ecd95aDaniel Dunbar  // When building 32-bit code on FreeBSD/amd64, we have to explicitly
1537008f54a54299eaafdaa940e2bdeaf55935ecd95aDaniel Dunbar  // instruct ld in the base system to link 32-bit code.
1538008f54a54299eaafdaa940e2bdeaf55935ecd95aDaniel Dunbar  if (getToolChain().getArchName() == "i386") {
1539008f54a54299eaafdaa940e2bdeaf55935ecd95aDaniel Dunbar    CmdArgs.push_back("-m");
1540008f54a54299eaafdaa940e2bdeaf55935ecd95aDaniel Dunbar    CmdArgs.push_back("elf_i386_fbsd");
1541008f54a54299eaafdaa940e2bdeaf55935ecd95aDaniel Dunbar  }
1542008f54a54299eaafdaa940e2bdeaf55935ecd95aDaniel Dunbar
1543008f54a54299eaafdaa940e2bdeaf55935ecd95aDaniel Dunbar  if (Output.isPipe()) {
1544008f54a54299eaafdaa940e2bdeaf55935ecd95aDaniel Dunbar    CmdArgs.push_back("-o");
1545008f54a54299eaafdaa940e2bdeaf55935ecd95aDaniel Dunbar    CmdArgs.push_back("-");
1546008f54a54299eaafdaa940e2bdeaf55935ecd95aDaniel Dunbar  } else if (Output.isFilename()) {
1547008f54a54299eaafdaa940e2bdeaf55935ecd95aDaniel Dunbar    CmdArgs.push_back("-o");
1548008f54a54299eaafdaa940e2bdeaf55935ecd95aDaniel Dunbar    CmdArgs.push_back(Output.getFilename());
1549008f54a54299eaafdaa940e2bdeaf55935ecd95aDaniel Dunbar  } else {
1550008f54a54299eaafdaa940e2bdeaf55935ecd95aDaniel Dunbar    assert(Output.isNothing() && "Invalid output.");
1551008f54a54299eaafdaa940e2bdeaf55935ecd95aDaniel Dunbar  }
1552008f54a54299eaafdaa940e2bdeaf55935ecd95aDaniel Dunbar
1553008f54a54299eaafdaa940e2bdeaf55935ecd95aDaniel Dunbar  if (!Args.hasArg(options::OPT_nostdlib) &&
1554008f54a54299eaafdaa940e2bdeaf55935ecd95aDaniel Dunbar      !Args.hasArg(options::OPT_nostartfiles)) {
1555008f54a54299eaafdaa940e2bdeaf55935ecd95aDaniel Dunbar    if (!Args.hasArg(options::OPT_shared)) {
1556008f54a54299eaafdaa940e2bdeaf55935ecd95aDaniel Dunbar      CmdArgs.push_back(Args.MakeArgString(getToolChain().GetFilePath(C, "crt1.o").c_str()));
1557008f54a54299eaafdaa940e2bdeaf55935ecd95aDaniel Dunbar      CmdArgs.push_back(Args.MakeArgString(getToolChain().GetFilePath(C, "crti.o").c_str()));
1558008f54a54299eaafdaa940e2bdeaf55935ecd95aDaniel Dunbar      CmdArgs.push_back(Args.MakeArgString(getToolChain().GetFilePath(C, "crtbegin.o").c_str()));
1559008f54a54299eaafdaa940e2bdeaf55935ecd95aDaniel Dunbar    } else {
1560008f54a54299eaafdaa940e2bdeaf55935ecd95aDaniel Dunbar      CmdArgs.push_back(Args.MakeArgString(getToolChain().GetFilePath(C, "crti.o").c_str()));
1561008f54a54299eaafdaa940e2bdeaf55935ecd95aDaniel Dunbar      CmdArgs.push_back(Args.MakeArgString(getToolChain().GetFilePath(C, "crtbeginS.o").c_str()));
1562008f54a54299eaafdaa940e2bdeaf55935ecd95aDaniel Dunbar    }
1563008f54a54299eaafdaa940e2bdeaf55935ecd95aDaniel Dunbar  }
1564008f54a54299eaafdaa940e2bdeaf55935ecd95aDaniel Dunbar
1565008f54a54299eaafdaa940e2bdeaf55935ecd95aDaniel Dunbar  Args.AddAllArgs(CmdArgs, options::OPT_L);
1566008f54a54299eaafdaa940e2bdeaf55935ecd95aDaniel Dunbar  Args.AddAllArgs(CmdArgs, options::OPT_T_Group);
1567008f54a54299eaafdaa940e2bdeaf55935ecd95aDaniel Dunbar  Args.AddAllArgs(CmdArgs, options::OPT_e);
1568008f54a54299eaafdaa940e2bdeaf55935ecd95aDaniel Dunbar
1569008f54a54299eaafdaa940e2bdeaf55935ecd95aDaniel Dunbar  for (InputInfoList::const_iterator
1570008f54a54299eaafdaa940e2bdeaf55935ecd95aDaniel Dunbar       it = Inputs.begin(), ie = Inputs.end(); it != ie; ++it) {
1571008f54a54299eaafdaa940e2bdeaf55935ecd95aDaniel Dunbar    const InputInfo &II = *it;
1572008f54a54299eaafdaa940e2bdeaf55935ecd95aDaniel Dunbar    if (II.isPipe())
1573008f54a54299eaafdaa940e2bdeaf55935ecd95aDaniel Dunbar      CmdArgs.push_back("-");
1574008f54a54299eaafdaa940e2bdeaf55935ecd95aDaniel Dunbar    else if (II.isFilename())
1575008f54a54299eaafdaa940e2bdeaf55935ecd95aDaniel Dunbar      CmdArgs.push_back(II.getFilename());
1576008f54a54299eaafdaa940e2bdeaf55935ecd95aDaniel Dunbar    else
1577008f54a54299eaafdaa940e2bdeaf55935ecd95aDaniel Dunbar      II.getInputArg().renderAsInput(Args, CmdArgs);
1578008f54a54299eaafdaa940e2bdeaf55935ecd95aDaniel Dunbar  }
1579008f54a54299eaafdaa940e2bdeaf55935ecd95aDaniel Dunbar
1580008f54a54299eaafdaa940e2bdeaf55935ecd95aDaniel Dunbar  if (!Args.hasArg(options::OPT_nostdlib) &&
1581008f54a54299eaafdaa940e2bdeaf55935ecd95aDaniel Dunbar      !Args.hasArg(options::OPT_nodefaultlibs)) {
1582008f54a54299eaafdaa940e2bdeaf55935ecd95aDaniel Dunbar    // FIXME: For some reason GCC passes -lgcc and -lgcc_s before adding
1583008f54a54299eaafdaa940e2bdeaf55935ecd95aDaniel Dunbar    // the default system libraries. Just mimic this for now.
1584008f54a54299eaafdaa940e2bdeaf55935ecd95aDaniel Dunbar    CmdArgs.push_back("-lgcc");
1585008f54a54299eaafdaa940e2bdeaf55935ecd95aDaniel Dunbar    if (Args.hasArg(options::OPT_static)) {
1586008f54a54299eaafdaa940e2bdeaf55935ecd95aDaniel Dunbar      CmdArgs.push_back("-lgcc_eh");
1587008f54a54299eaafdaa940e2bdeaf55935ecd95aDaniel Dunbar    } else {
1588008f54a54299eaafdaa940e2bdeaf55935ecd95aDaniel Dunbar      CmdArgs.push_back("--as-needed");
1589008f54a54299eaafdaa940e2bdeaf55935ecd95aDaniel Dunbar      CmdArgs.push_back("-lgcc_s");
1590008f54a54299eaafdaa940e2bdeaf55935ecd95aDaniel Dunbar      CmdArgs.push_back("--no-as-needed");
1591008f54a54299eaafdaa940e2bdeaf55935ecd95aDaniel Dunbar    }
1592008f54a54299eaafdaa940e2bdeaf55935ecd95aDaniel Dunbar
1593008f54a54299eaafdaa940e2bdeaf55935ecd95aDaniel Dunbar    if (Args.hasArg(options::OPT_pthread))
1594008f54a54299eaafdaa940e2bdeaf55935ecd95aDaniel Dunbar      CmdArgs.push_back("-lpthread");
1595008f54a54299eaafdaa940e2bdeaf55935ecd95aDaniel Dunbar    CmdArgs.push_back("-lc");
1596008f54a54299eaafdaa940e2bdeaf55935ecd95aDaniel Dunbar
1597008f54a54299eaafdaa940e2bdeaf55935ecd95aDaniel Dunbar    CmdArgs.push_back("-lgcc");
1598008f54a54299eaafdaa940e2bdeaf55935ecd95aDaniel Dunbar    if (Args.hasArg(options::OPT_static)) {
1599008f54a54299eaafdaa940e2bdeaf55935ecd95aDaniel Dunbar      CmdArgs.push_back("-lgcc_eh");
1600008f54a54299eaafdaa940e2bdeaf55935ecd95aDaniel Dunbar    } else {
1601008f54a54299eaafdaa940e2bdeaf55935ecd95aDaniel Dunbar      CmdArgs.push_back("--as-needed");
1602008f54a54299eaafdaa940e2bdeaf55935ecd95aDaniel Dunbar      CmdArgs.push_back("-lgcc_s");
1603008f54a54299eaafdaa940e2bdeaf55935ecd95aDaniel Dunbar      CmdArgs.push_back("--no-as-needed");
1604008f54a54299eaafdaa940e2bdeaf55935ecd95aDaniel Dunbar    }
1605008f54a54299eaafdaa940e2bdeaf55935ecd95aDaniel Dunbar  }
1606008f54a54299eaafdaa940e2bdeaf55935ecd95aDaniel Dunbar
1607008f54a54299eaafdaa940e2bdeaf55935ecd95aDaniel Dunbar  if (!Args.hasArg(options::OPT_nostdlib) &&
1608008f54a54299eaafdaa940e2bdeaf55935ecd95aDaniel Dunbar      !Args.hasArg(options::OPT_nostartfiles)) {
1609008f54a54299eaafdaa940e2bdeaf55935ecd95aDaniel Dunbar    if (!Args.hasArg(options::OPT_shared))
1610008f54a54299eaafdaa940e2bdeaf55935ecd95aDaniel Dunbar      CmdArgs.push_back(Args.MakeArgString(getToolChain().GetFilePath(C, "crtend.o").c_str()));
1611008f54a54299eaafdaa940e2bdeaf55935ecd95aDaniel Dunbar    else
1612008f54a54299eaafdaa940e2bdeaf55935ecd95aDaniel Dunbar      CmdArgs.push_back(Args.MakeArgString(getToolChain().GetFilePath(C, "crtendS.o").c_str()));
1613008f54a54299eaafdaa940e2bdeaf55935ecd95aDaniel Dunbar    CmdArgs.push_back(Args.MakeArgString(getToolChain().GetFilePath(C, "crtn.o").c_str()));
1614008f54a54299eaafdaa940e2bdeaf55935ecd95aDaniel Dunbar  }
1615008f54a54299eaafdaa940e2bdeaf55935ecd95aDaniel Dunbar
1616008f54a54299eaafdaa940e2bdeaf55935ecd95aDaniel Dunbar  const char *Exec =
1617008f54a54299eaafdaa940e2bdeaf55935ecd95aDaniel Dunbar    Args.MakeArgString(getToolChain().GetProgramPath(C, "ld").c_str());
1618008f54a54299eaafdaa940e2bdeaf55935ecd95aDaniel Dunbar  Dest.addCommand(new Command(Exec, CmdArgs));
1619008f54a54299eaafdaa940e2bdeaf55935ecd95aDaniel Dunbar}
1620