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