Tools.cpp revision 40f1265ebd42ece3e7f7917319b56012e8e2bce2
147ac7d27c44bd64a7d0fc03d4babc196cf2b8230Daniel Dunbar//===--- Tools.cpp - Tools Implementations ------------------------------*-===// 247ac7d27c44bd64a7d0fc03d4babc196cf2b8230Daniel Dunbar// 347ac7d27c44bd64a7d0fc03d4babc196cf2b8230Daniel Dunbar// The LLVM Compiler Infrastructure 447ac7d27c44bd64a7d0fc03d4babc196cf2b8230Daniel Dunbar// 547ac7d27c44bd64a7d0fc03d4babc196cf2b8230Daniel Dunbar// This file is distributed under the University of Illinois Open Source 647ac7d27c44bd64a7d0fc03d4babc196cf2b8230Daniel Dunbar// License. See LICENSE.TXT for details. 747ac7d27c44bd64a7d0fc03d4babc196cf2b8230Daniel Dunbar// 847ac7d27c44bd64a7d0fc03d4babc196cf2b8230Daniel Dunbar//===----------------------------------------------------------------------===// 947ac7d27c44bd64a7d0fc03d4babc196cf2b8230Daniel Dunbar 1047ac7d27c44bd64a7d0fc03d4babc196cf2b8230Daniel Dunbar#include "Tools.h" 1147ac7d27c44bd64a7d0fc03d4babc196cf2b8230Daniel Dunbar 121d46033f760ba5fd266ce59fe391fac473f04f52Daniel Dunbar#include "clang/Driver/Action.h" 13871adcf4e41285e3f4c3b62eaa1b2e05b60b92daDaniel Dunbar#include "clang/Driver/Arg.h" 14b488c1dac8e53206f07103d794a62a3f5012c0f4Daniel Dunbar#include "clang/Driver/ArgList.h" 151d46033f760ba5fd266ce59fe391fac473f04f52Daniel Dunbar#include "clang/Driver/Driver.h" // FIXME: Remove? 161d46033f760ba5fd266ce59fe391fac473f04f52Daniel Dunbar#include "clang/Driver/DriverDiagnostic.h" // FIXME: Remove? 17871adcf4e41285e3f4c3b62eaa1b2e05b60b92daDaniel Dunbar#include "clang/Driver/Compilation.h" 18871adcf4e41285e3f4c3b62eaa1b2e05b60b92daDaniel Dunbar#include "clang/Driver/Job.h" 19b488c1dac8e53206f07103d794a62a3f5012c0f4Daniel Dunbar#include "clang/Driver/HostInfo.h" 20b488c1dac8e53206f07103d794a62a3f5012c0f4Daniel Dunbar#include "clang/Driver/Option.h" 21b488c1dac8e53206f07103d794a62a3f5012c0f4Daniel Dunbar#include "clang/Driver/ToolChain.h" 22871adcf4e41285e3f4c3b62eaa1b2e05b60b92daDaniel Dunbar#include "clang/Driver/Util.h" 23871adcf4e41285e3f4c3b62eaa1b2e05b60b92daDaniel Dunbar 24871adcf4e41285e3f4c3b62eaa1b2e05b60b92daDaniel Dunbar#include "llvm/ADT/SmallVector.h" 2502633b541b04ad5ffc1c70f4c2feeeb13e607057Daniel Dunbar#include "llvm/Support/Format.h" 2602633b541b04ad5ffc1c70f4c2feeeb13e607057Daniel Dunbar#include "llvm/Support/raw_ostream.h" 27871adcf4e41285e3f4c3b62eaa1b2e05b60b92daDaniel Dunbar 28871adcf4e41285e3f4c3b62eaa1b2e05b60b92daDaniel Dunbar#include "InputInfo.h" 2902633b541b04ad5ffc1c70f4c2feeeb13e607057Daniel Dunbar#include "ToolChains.h" 30871adcf4e41285e3f4c3b62eaa1b2e05b60b92daDaniel Dunbar 3147ac7d27c44bd64a7d0fc03d4babc196cf2b8230Daniel Dunbarusing namespace clang::driver; 3247ac7d27c44bd64a7d0fc03d4babc196cf2b8230Daniel Dunbarusing namespace clang::driver::tools; 3347ac7d27c44bd64a7d0fc03d4babc196cf2b8230Daniel Dunbar 3447ac7d27c44bd64a7d0fc03d4babc196cf2b8230Daniel Dunbarvoid Clang::ConstructJob(Compilation &C, const JobAction &JA, 35871adcf4e41285e3f4c3b62eaa1b2e05b60b92daDaniel Dunbar Job &Dest, 36871adcf4e41285e3f4c3b62eaa1b2e05b60b92daDaniel Dunbar const InputInfo &Output, 3762cf601812e03dd9bc5df42b8ef06a0cdedc38bfDaniel Dunbar const InputInfoList &Inputs, 381d46033f760ba5fd266ce59fe391fac473f04f52Daniel Dunbar const ArgList &Args, 3947ac7d27c44bd64a7d0fc03d4babc196cf2b8230Daniel Dunbar const char *LinkingOutput) const { 40b488c1dac8e53206f07103d794a62a3f5012c0f4Daniel Dunbar ArgStringList CmdArgs; 41b488c1dac8e53206f07103d794a62a3f5012c0f4Daniel Dunbar 421d46033f760ba5fd266ce59fe391fac473f04f52Daniel Dunbar if (isa<AnalyzeJobAction>(JA)) { 431d46033f760ba5fd266ce59fe391fac473f04f52Daniel Dunbar assert(JA.getType() == types::TY_Plist && "Invalid output type."); 441d46033f760ba5fd266ce59fe391fac473f04f52Daniel Dunbar CmdArgs.push_back("-analyze"); 451d46033f760ba5fd266ce59fe391fac473f04f52Daniel Dunbar } else if (isa<PreprocessJobAction>(JA)) { 461d46033f760ba5fd266ce59fe391fac473f04f52Daniel Dunbar CmdArgs.push_back("-E"); 471d46033f760ba5fd266ce59fe391fac473f04f52Daniel Dunbar } else if (isa<PrecompileJobAction>(JA)) { 481d46033f760ba5fd266ce59fe391fac473f04f52Daniel Dunbar // No special option needed, driven by -x. 491d46033f760ba5fd266ce59fe391fac473f04f52Daniel Dunbar // 501d46033f760ba5fd266ce59fe391fac473f04f52Daniel Dunbar // FIXME: Don't drive this by -x, that is gross. 511d46033f760ba5fd266ce59fe391fac473f04f52Daniel Dunbar } else { 521d46033f760ba5fd266ce59fe391fac473f04f52Daniel Dunbar assert(isa<CompileJobAction>(JA) && "Invalid action for clang tool."); 531d46033f760ba5fd266ce59fe391fac473f04f52Daniel Dunbar 541d46033f760ba5fd266ce59fe391fac473f04f52Daniel Dunbar if (JA.getType() == types::TY_Nothing) { 551d46033f760ba5fd266ce59fe391fac473f04f52Daniel Dunbar CmdArgs.push_back("-fsyntax-only"); 561d46033f760ba5fd266ce59fe391fac473f04f52Daniel Dunbar } else if (JA.getType() == types::TY_LLVMAsm) { 571d46033f760ba5fd266ce59fe391fac473f04f52Daniel Dunbar CmdArgs.push_back("-emit-llvm"); 581d46033f760ba5fd266ce59fe391fac473f04f52Daniel Dunbar } else if (JA.getType() == types::TY_LLVMBC) { 591d46033f760ba5fd266ce59fe391fac473f04f52Daniel Dunbar CmdArgs.push_back("-emit-llvm-bc"); 601d46033f760ba5fd266ce59fe391fac473f04f52Daniel Dunbar } else if (JA.getType() == types::TY_PP_Asm) { 611d46033f760ba5fd266ce59fe391fac473f04f52Daniel Dunbar CmdArgs.push_back("-S"); 621d46033f760ba5fd266ce59fe391fac473f04f52Daniel Dunbar } 631d46033f760ba5fd266ce59fe391fac473f04f52Daniel Dunbar } 641d46033f760ba5fd266ce59fe391fac473f04f52Daniel Dunbar 651d46033f760ba5fd266ce59fe391fac473f04f52Daniel Dunbar // The make clang go fast button. 661d46033f760ba5fd266ce59fe391fac473f04f52Daniel Dunbar CmdArgs.push_back("-disable-free"); 671d46033f760ba5fd266ce59fe391fac473f04f52Daniel Dunbar 681d46033f760ba5fd266ce59fe391fac473f04f52Daniel Dunbar if (isa<AnalyzeJobAction>(JA)) { 691d46033f760ba5fd266ce59fe391fac473f04f52Daniel Dunbar // Add default argument set. 701d46033f760ba5fd266ce59fe391fac473f04f52Daniel Dunbar // 711d46033f760ba5fd266ce59fe391fac473f04f52Daniel Dunbar // FIXME: Move into clang? 721d46033f760ba5fd266ce59fe391fac473f04f52Daniel Dunbar CmdArgs.push_back("-warn-dead-stores"); 731d46033f760ba5fd266ce59fe391fac473f04f52Daniel Dunbar CmdArgs.push_back("-checker-cfref"); 749b646dac1c05fbfbfb4db0cb88ea28e74fbe7b9aTed Kremenek CmdArgs.push_back("-analyzer-eagerly-assume"); 751d46033f760ba5fd266ce59fe391fac473f04f52Daniel Dunbar CmdArgs.push_back("-warn-objc-methodsigs"); 761d46033f760ba5fd266ce59fe391fac473f04f52Daniel Dunbar // Do not enable the missing -dealloc check. 771d46033f760ba5fd266ce59fe391fac473f04f52Daniel Dunbar // '-warn-objc-missing-dealloc', 781d46033f760ba5fd266ce59fe391fac473f04f52Daniel Dunbar CmdArgs.push_back("-warn-objc-unused-ivars"); 791d46033f760ba5fd266ce59fe391fac473f04f52Daniel Dunbar 801d46033f760ba5fd266ce59fe391fac473f04f52Daniel Dunbar CmdArgs.push_back("-analyzer-output=plist"); 811d46033f760ba5fd266ce59fe391fac473f04f52Daniel Dunbar 821d46033f760ba5fd266ce59fe391fac473f04f52Daniel Dunbar // Add -Xanalyzer arguments when running as analyzer. 831d46033f760ba5fd266ce59fe391fac473f04f52Daniel Dunbar Args.AddAllArgValues(CmdArgs, options::OPT_Xanalyzer); 841d46033f760ba5fd266ce59fe391fac473f04f52Daniel Dunbar } else { 851d46033f760ba5fd266ce59fe391fac473f04f52Daniel Dunbar // Perform argument translation for LLVM backend. This 861d46033f760ba5fd266ce59fe391fac473f04f52Daniel Dunbar // takes some care in reconciling with llvm-gcc. The 871d46033f760ba5fd266ce59fe391fac473f04f52Daniel Dunbar // issue is that llvm-gcc translates these options based on 881d46033f760ba5fd266ce59fe391fac473f04f52Daniel Dunbar // the values in cc1, whereas we are processing based on 891d46033f760ba5fd266ce59fe391fac473f04f52Daniel Dunbar // the driver arguments. 901d46033f760ba5fd266ce59fe391fac473f04f52Daniel Dunbar // 911d46033f760ba5fd266ce59fe391fac473f04f52Daniel Dunbar // FIXME: This is currently broken for -f flags when -fno 921d46033f760ba5fd266ce59fe391fac473f04f52Daniel Dunbar // variants are present. 931d46033f760ba5fd266ce59fe391fac473f04f52Daniel Dunbar 941d46033f760ba5fd266ce59fe391fac473f04f52Daniel Dunbar // This comes from the default translation the driver + cc1 951d46033f760ba5fd266ce59fe391fac473f04f52Daniel Dunbar // would do to enable flag_pic. 961d46033f760ba5fd266ce59fe391fac473f04f52Daniel Dunbar // 971d46033f760ba5fd266ce59fe391fac473f04f52Daniel Dunbar // FIXME: Centralize this code. 981d46033f760ba5fd266ce59fe391fac473f04f52Daniel Dunbar bool PICEnabled = (Args.hasArg(options::OPT_fPIC) || 991d46033f760ba5fd266ce59fe391fac473f04f52Daniel Dunbar Args.hasArg(options::OPT_fpic) || 1001d46033f760ba5fd266ce59fe391fac473f04f52Daniel Dunbar Args.hasArg(options::OPT_fPIE) || 1011d46033f760ba5fd266ce59fe391fac473f04f52Daniel Dunbar Args.hasArg(options::OPT_fpie)); 1021d46033f760ba5fd266ce59fe391fac473f04f52Daniel Dunbar bool PICDisabled = (Args.hasArg(options::OPT_mkernel) || 1031d46033f760ba5fd266ce59fe391fac473f04f52Daniel Dunbar Args.hasArg(options::OPT_static)); 1041d46033f760ba5fd266ce59fe391fac473f04f52Daniel Dunbar const char *Model = getToolChain().GetForcedPicModel(); 1051d46033f760ba5fd266ce59fe391fac473f04f52Daniel Dunbar if (!Model) { 1061d46033f760ba5fd266ce59fe391fac473f04f52Daniel Dunbar if (Args.hasArg(options::OPT_mdynamic_no_pic)) 1071d46033f760ba5fd266ce59fe391fac473f04f52Daniel Dunbar Model = "dynamic-no-pic"; 1081d46033f760ba5fd266ce59fe391fac473f04f52Daniel Dunbar else if (PICDisabled) 1091d46033f760ba5fd266ce59fe391fac473f04f52Daniel Dunbar Model = "static"; 1101d46033f760ba5fd266ce59fe391fac473f04f52Daniel Dunbar else if (PICEnabled) 1111d46033f760ba5fd266ce59fe391fac473f04f52Daniel Dunbar Model = "pic"; 1121d46033f760ba5fd266ce59fe391fac473f04f52Daniel Dunbar else 1131d46033f760ba5fd266ce59fe391fac473f04f52Daniel Dunbar Model = getToolChain().GetDefaultRelocationModel(); 1141d46033f760ba5fd266ce59fe391fac473f04f52Daniel Dunbar } 1151d46033f760ba5fd266ce59fe391fac473f04f52Daniel Dunbar CmdArgs.push_back("--relocation-model"); 1161d46033f760ba5fd266ce59fe391fac473f04f52Daniel Dunbar CmdArgs.push_back(Model); 1171d46033f760ba5fd266ce59fe391fac473f04f52Daniel Dunbar 1181d46033f760ba5fd266ce59fe391fac473f04f52Daniel Dunbar if (Args.hasArg(options::OPT_ftime_report)) 1191d46033f760ba5fd266ce59fe391fac473f04f52Daniel Dunbar CmdArgs.push_back("--time-passes"); 1201d46033f760ba5fd266ce59fe391fac473f04f52Daniel Dunbar // FIXME: Set --enable-unsafe-fp-math. 1211d46033f760ba5fd266ce59fe391fac473f04f52Daniel Dunbar if (!Args.hasArg(options::OPT_fomit_frame_pointer)) 1221d46033f760ba5fd266ce59fe391fac473f04f52Daniel Dunbar CmdArgs.push_back("--disable-fp-elim"); 1231d46033f760ba5fd266ce59fe391fac473f04f52Daniel Dunbar if (!Args.hasFlag(options::OPT_fzero_initialized_in_bss, 1241d46033f760ba5fd266ce59fe391fac473f04f52Daniel Dunbar options::OPT_fno_zero_initialized_in_bss, 1251d46033f760ba5fd266ce59fe391fac473f04f52Daniel Dunbar true)) 1261d46033f760ba5fd266ce59fe391fac473f04f52Daniel Dunbar CmdArgs.push_back("--nozero-initialized-in-bss"); 127b3fd500a1c486e9fb82d82e28828ead025462aebDaniel Dunbar if (Args.hasArg(options::OPT_dA) || Args.hasArg(options::OPT_fverbose_asm)) 1281d46033f760ba5fd266ce59fe391fac473f04f52Daniel Dunbar CmdArgs.push_back("--asm-verbose"); 1291d46033f760ba5fd266ce59fe391fac473f04f52Daniel Dunbar if (Args.hasArg(options::OPT_fdebug_pass_structure)) 1301d46033f760ba5fd266ce59fe391fac473f04f52Daniel Dunbar CmdArgs.push_back("--debug-pass=Structure"); 1311d46033f760ba5fd266ce59fe391fac473f04f52Daniel Dunbar if (Args.hasArg(options::OPT_fdebug_pass_arguments)) 1321d46033f760ba5fd266ce59fe391fac473f04f52Daniel Dunbar CmdArgs.push_back("--debug-pass=Arguments"); 1331d46033f760ba5fd266ce59fe391fac473f04f52Daniel Dunbar // FIXME: set --inline-threshhold=50 if (optimize_size || optimize 1341d46033f760ba5fd266ce59fe391fac473f04f52Daniel Dunbar // < 3) 1351d46033f760ba5fd266ce59fe391fac473f04f52Daniel Dunbar if (Args.hasFlag(options::OPT_funwind_tables, 1361d46033f760ba5fd266ce59fe391fac473f04f52Daniel Dunbar options::OPT_fno_unwind_tables, 1371d46033f760ba5fd266ce59fe391fac473f04f52Daniel Dunbar getToolChain().IsUnwindTablesDefault())) 1381d46033f760ba5fd266ce59fe391fac473f04f52Daniel Dunbar CmdArgs.push_back("--unwind-tables=1"); 1391d46033f760ba5fd266ce59fe391fac473f04f52Daniel Dunbar else 1401d46033f760ba5fd266ce59fe391fac473f04f52Daniel Dunbar CmdArgs.push_back("--unwind-tables=0"); 1411d46033f760ba5fd266ce59fe391fac473f04f52Daniel Dunbar if (!Args.hasFlag(options::OPT_mred_zone, 1421d46033f760ba5fd266ce59fe391fac473f04f52Daniel Dunbar options::OPT_mno_red_zone, 1431d46033f760ba5fd266ce59fe391fac473f04f52Daniel Dunbar true)) 1441d46033f760ba5fd266ce59fe391fac473f04f52Daniel Dunbar CmdArgs.push_back("--disable-red-zone"); 1451d46033f760ba5fd266ce59fe391fac473f04f52Daniel Dunbar if (Args.hasFlag(options::OPT_msoft_float, 1461d46033f760ba5fd266ce59fe391fac473f04f52Daniel Dunbar options::OPT_mno_soft_float, 1471d46033f760ba5fd266ce59fe391fac473f04f52Daniel Dunbar false)) 1481d46033f760ba5fd266ce59fe391fac473f04f52Daniel Dunbar CmdArgs.push_back("--soft-float"); 1491d46033f760ba5fd266ce59fe391fac473f04f52Daniel Dunbar 1501d46033f760ba5fd266ce59fe391fac473f04f52Daniel Dunbar // FIXME: Need target hooks. 1511d46033f760ba5fd266ce59fe391fac473f04f52Daniel Dunbar if (memcmp(getToolChain().getPlatform().c_str(), "darwin", 6) == 0) { 1521d46033f760ba5fd266ce59fe391fac473f04f52Daniel Dunbar if (getToolChain().getArchName() == "x86_64") 1531d46033f760ba5fd266ce59fe391fac473f04f52Daniel Dunbar CmdArgs.push_back("--mcpu=core2"); 1541d46033f760ba5fd266ce59fe391fac473f04f52Daniel Dunbar else if (getToolChain().getArchName() == "i386") 1551d46033f760ba5fd266ce59fe391fac473f04f52Daniel Dunbar CmdArgs.push_back("--mcpu=yonah"); 1561d46033f760ba5fd266ce59fe391fac473f04f52Daniel Dunbar } 1571d46033f760ba5fd266ce59fe391fac473f04f52Daniel Dunbar 1581d46033f760ba5fd266ce59fe391fac473f04f52Daniel Dunbar // FIXME: Ignores ordering. Also, we need to find a realistic 1591d46033f760ba5fd266ce59fe391fac473f04f52Daniel Dunbar // solution for this. 1601d46033f760ba5fd266ce59fe391fac473f04f52Daniel Dunbar static const struct { 1611d46033f760ba5fd266ce59fe391fac473f04f52Daniel Dunbar options::ID Pos, Neg; 1621d46033f760ba5fd266ce59fe391fac473f04f52Daniel Dunbar const char *Name; 1631d46033f760ba5fd266ce59fe391fac473f04f52Daniel Dunbar } FeatureOptions[] = { 1641d46033f760ba5fd266ce59fe391fac473f04f52Daniel Dunbar { options::OPT_mmmx, options::OPT_mno_mmx, "mmx" }, 1651d46033f760ba5fd266ce59fe391fac473f04f52Daniel Dunbar { options::OPT_msse, options::OPT_mno_sse, "sse" }, 1661d46033f760ba5fd266ce59fe391fac473f04f52Daniel Dunbar { options::OPT_msse2, options::OPT_mno_sse2, "sse2" }, 1671d46033f760ba5fd266ce59fe391fac473f04f52Daniel Dunbar { options::OPT_msse3, options::OPT_mno_sse3, "sse3" }, 1681d46033f760ba5fd266ce59fe391fac473f04f52Daniel Dunbar { options::OPT_mssse3, options::OPT_mno_ssse3, "ssse3" }, 1691d46033f760ba5fd266ce59fe391fac473f04f52Daniel Dunbar { options::OPT_msse41, options::OPT_mno_sse41, "sse41" }, 1701d46033f760ba5fd266ce59fe391fac473f04f52Daniel Dunbar { options::OPT_msse42, options::OPT_mno_sse42, "sse42" }, 1711d46033f760ba5fd266ce59fe391fac473f04f52Daniel Dunbar { options::OPT_msse4a, options::OPT_mno_sse4a, "sse4a" }, 1721d46033f760ba5fd266ce59fe391fac473f04f52Daniel Dunbar { options::OPT_m3dnow, options::OPT_mno_3dnow, "3dnow" }, 1731d46033f760ba5fd266ce59fe391fac473f04f52Daniel Dunbar { options::OPT_m3dnowa, options::OPT_mno_3dnowa, "3dnowa" } 1741d46033f760ba5fd266ce59fe391fac473f04f52Daniel Dunbar }; 1751d46033f760ba5fd266ce59fe391fac473f04f52Daniel Dunbar const unsigned NumFeatureOptions = 1761d46033f760ba5fd266ce59fe391fac473f04f52Daniel Dunbar sizeof(FeatureOptions)/sizeof(FeatureOptions[0]); 1771d46033f760ba5fd266ce59fe391fac473f04f52Daniel Dunbar 1781d46033f760ba5fd266ce59fe391fac473f04f52Daniel Dunbar // FIXME: Avoid std::string 1791d46033f760ba5fd266ce59fe391fac473f04f52Daniel Dunbar std::string Attrs; 1801d46033f760ba5fd266ce59fe391fac473f04f52Daniel Dunbar for (unsigned i=0; i < NumFeatureOptions; ++i) { 1811d46033f760ba5fd266ce59fe391fac473f04f52Daniel Dunbar if (Args.hasArg(FeatureOptions[i].Pos)) { 18255b3b5f5c6c92f5dbb10dfe96a7de07a2b364338Daniel Dunbar if (!Attrs.empty()) 18355b3b5f5c6c92f5dbb10dfe96a7de07a2b364338Daniel Dunbar Attrs += ','; 1841d46033f760ba5fd266ce59fe391fac473f04f52Daniel Dunbar Attrs += '+'; 1851d46033f760ba5fd266ce59fe391fac473f04f52Daniel Dunbar Attrs += FeatureOptions[i].Name; 1861d46033f760ba5fd266ce59fe391fac473f04f52Daniel Dunbar } else if (Args.hasArg(FeatureOptions[i].Neg)) { 18755b3b5f5c6c92f5dbb10dfe96a7de07a2b364338Daniel Dunbar if (!Attrs.empty()) 18855b3b5f5c6c92f5dbb10dfe96a7de07a2b364338Daniel Dunbar Attrs += ','; 1891d46033f760ba5fd266ce59fe391fac473f04f52Daniel Dunbar Attrs += '-'; 1901d46033f760ba5fd266ce59fe391fac473f04f52Daniel Dunbar Attrs += FeatureOptions[i].Name; 1911d46033f760ba5fd266ce59fe391fac473f04f52Daniel Dunbar } 1921d46033f760ba5fd266ce59fe391fac473f04f52Daniel Dunbar } 1931d46033f760ba5fd266ce59fe391fac473f04f52Daniel Dunbar if (!Attrs.empty()) { 1941d46033f760ba5fd266ce59fe391fac473f04f52Daniel Dunbar CmdArgs.push_back("--mattr"); 1951d46033f760ba5fd266ce59fe391fac473f04f52Daniel Dunbar CmdArgs.push_back(Args.MakeArgString(Attrs.c_str())); 1961d46033f760ba5fd266ce59fe391fac473f04f52Daniel Dunbar } 1971d46033f760ba5fd266ce59fe391fac473f04f52Daniel Dunbar 1981d46033f760ba5fd266ce59fe391fac473f04f52Daniel Dunbar if (Args.hasFlag(options::OPT_fmath_errno, 1991d46033f760ba5fd266ce59fe391fac473f04f52Daniel Dunbar options::OPT_fno_math_errno, 2001d46033f760ba5fd266ce59fe391fac473f04f52Daniel Dunbar getToolChain().IsMathErrnoDefault())) 2011d46033f760ba5fd266ce59fe391fac473f04f52Daniel Dunbar CmdArgs.push_back("--fmath-errno=1"); 2021d46033f760ba5fd266ce59fe391fac473f04f52Daniel Dunbar else 2031d46033f760ba5fd266ce59fe391fac473f04f52Daniel Dunbar CmdArgs.push_back("--fmath-errno=0"); 2041d46033f760ba5fd266ce59fe391fac473f04f52Daniel Dunbar 2051d46033f760ba5fd266ce59fe391fac473f04f52Daniel Dunbar if (Arg *A = Args.getLastArg(options::OPT_flimited_precision_EQ)) { 2061d46033f760ba5fd266ce59fe391fac473f04f52Daniel Dunbar CmdArgs.push_back("--limit-float-precision"); 2071d46033f760ba5fd266ce59fe391fac473f04f52Daniel Dunbar CmdArgs.push_back(A->getValue(Args)); 2081d46033f760ba5fd266ce59fe391fac473f04f52Daniel Dunbar } 2091d46033f760ba5fd266ce59fe391fac473f04f52Daniel Dunbar 2101d46033f760ba5fd266ce59fe391fac473f04f52Daniel Dunbar // FIXME: Add --stack-protector-buffer-size=<xxx> on 2111d46033f760ba5fd266ce59fe391fac473f04f52Daniel Dunbar // -fstack-protect. 2121d46033f760ba5fd266ce59fe391fac473f04f52Daniel Dunbar 2131d46033f760ba5fd266ce59fe391fac473f04f52Daniel Dunbar Args.AddLastArg(CmdArgs, options::OPT_MD); 214546654a62eedb123b1b6d727ede29fd6cfb55087Daniel Dunbar Args.AddLastArg(CmdArgs, options::OPT_MMD); 2151d46033f760ba5fd266ce59fe391fac473f04f52Daniel Dunbar Args.AddAllArgs(CmdArgs, options::OPT_MF); 2161d46033f760ba5fd266ce59fe391fac473f04f52Daniel Dunbar Args.AddLastArg(CmdArgs, options::OPT_MP); 2171d46033f760ba5fd266ce59fe391fac473f04f52Daniel Dunbar Args.AddAllArgs(CmdArgs, options::OPT_MT); 2181d46033f760ba5fd266ce59fe391fac473f04f52Daniel Dunbar 2191d46033f760ba5fd266ce59fe391fac473f04f52Daniel Dunbar Arg *Unsupported = Args.getLastArg(options::OPT_M); 2201d46033f760ba5fd266ce59fe391fac473f04f52Daniel Dunbar if (!Unsupported) 2211d46033f760ba5fd266ce59fe391fac473f04f52Daniel Dunbar Unsupported = Args.getLastArg(options::OPT_MM); 2221d46033f760ba5fd266ce59fe391fac473f04f52Daniel Dunbar if (!Unsupported) 2231d46033f760ba5fd266ce59fe391fac473f04f52Daniel Dunbar Unsupported = Args.getLastArg(options::OPT_MG); 2241d46033f760ba5fd266ce59fe391fac473f04f52Daniel Dunbar if (!Unsupported) 2251d46033f760ba5fd266ce59fe391fac473f04f52Daniel Dunbar Unsupported = Args.getLastArg(options::OPT_MQ); 2261d46033f760ba5fd266ce59fe391fac473f04f52Daniel Dunbar if (Unsupported) { 2271d46033f760ba5fd266ce59fe391fac473f04f52Daniel Dunbar const Driver &D = getToolChain().getHost().getDriver(); 2281d46033f760ba5fd266ce59fe391fac473f04f52Daniel Dunbar D.Diag(clang::diag::err_drv_unsupported_opt) 2291d46033f760ba5fd266ce59fe391fac473f04f52Daniel Dunbar << Unsupported->getOption().getName(); 2301d46033f760ba5fd266ce59fe391fac473f04f52Daniel Dunbar } 2311d46033f760ba5fd266ce59fe391fac473f04f52Daniel Dunbar } 2321d46033f760ba5fd266ce59fe391fac473f04f52Daniel Dunbar 2331d46033f760ba5fd266ce59fe391fac473f04f52Daniel Dunbar Args.AddAllArgs(CmdArgs, options::OPT_v); 2341d46033f760ba5fd266ce59fe391fac473f04f52Daniel Dunbar Args.AddAllArgs(CmdArgs, options::OPT_D, options::OPT_U); 2351d46033f760ba5fd266ce59fe391fac473f04f52Daniel Dunbar Args.AddAllArgs(CmdArgs, options::OPT_I_Group, options::OPT_F); 2361d46033f760ba5fd266ce59fe391fac473f04f52Daniel Dunbar Args.AddLastArg(CmdArgs, options::OPT_P); 2371d46033f760ba5fd266ce59fe391fac473f04f52Daniel Dunbar Args.AddAllArgs(CmdArgs, options::OPT_mmacosx_version_min_EQ); 2381d46033f760ba5fd266ce59fe391fac473f04f52Daniel Dunbar 2391d46033f760ba5fd266ce59fe391fac473f04f52Daniel Dunbar // Special case debug options to only pass -g to clang. This is 2401d46033f760ba5fd266ce59fe391fac473f04f52Daniel Dunbar // wrong. 2411d46033f760ba5fd266ce59fe391fac473f04f52Daniel Dunbar if (Args.hasArg(options::OPT_g_Group)) 2421d46033f760ba5fd266ce59fe391fac473f04f52Daniel Dunbar CmdArgs.push_back("-g"); 2431d46033f760ba5fd266ce59fe391fac473f04f52Daniel Dunbar 2441d46033f760ba5fd266ce59fe391fac473f04f52Daniel Dunbar Args.AddLastArg(CmdArgs, options::OPT_nostdinc); 2451d46033f760ba5fd266ce59fe391fac473f04f52Daniel Dunbar 2461d46033f760ba5fd266ce59fe391fac473f04f52Daniel Dunbar // FIXME: Clang isn't going to accept just anything here. 247049853d74ea052ed904de7e18ae51d6953177822Daniel Dunbar // FIXME: Use iterator. 2481d46033f760ba5fd266ce59fe391fac473f04f52Daniel Dunbar 249049853d74ea052ed904de7e18ae51d6953177822Daniel Dunbar // Add -i* options, and automatically translate to -include-pth for 250049853d74ea052ed904de7e18ae51d6953177822Daniel Dunbar // transparent PCH support. It's wonky, but we include looking for 251049853d74ea052ed904de7e18ae51d6953177822Daniel Dunbar // .gch so we can support seamless replacement into a build system 252049853d74ea052ed904de7e18ae51d6953177822Daniel Dunbar // already set up to be generating .gch files. 2531d46033f760ba5fd266ce59fe391fac473f04f52Daniel Dunbar for (ArgList::const_iterator 2541d46033f760ba5fd266ce59fe391fac473f04f52Daniel Dunbar it = Args.begin(), ie = Args.end(); it != ie; ++it) { 2551d46033f760ba5fd266ce59fe391fac473f04f52Daniel Dunbar const Arg *A = *it; 256049853d74ea052ed904de7e18ae51d6953177822Daniel Dunbar if (!A->getOption().matches(options::OPT_i_Group)) 257049853d74ea052ed904de7e18ae51d6953177822Daniel Dunbar continue; 258049853d74ea052ed904de7e18ae51d6953177822Daniel Dunbar 2591d46033f760ba5fd266ce59fe391fac473f04f52Daniel Dunbar if (A->getOption().matches(options::OPT_include)) { 260049853d74ea052ed904de7e18ae51d6953177822Daniel Dunbar bool FoundPTH = false; 2611d46033f760ba5fd266ce59fe391fac473f04f52Daniel Dunbar llvm::sys::Path P(A->getValue(Args)); 2621d46033f760ba5fd266ce59fe391fac473f04f52Daniel Dunbar P.appendSuffix("pth"); 2631d46033f760ba5fd266ce59fe391fac473f04f52Daniel Dunbar if (P.exists()) { 264049853d74ea052ed904de7e18ae51d6953177822Daniel Dunbar FoundPTH = true; 2651d46033f760ba5fd266ce59fe391fac473f04f52Daniel Dunbar } else { 2661d46033f760ba5fd266ce59fe391fac473f04f52Daniel Dunbar P.eraseSuffix(); 2671d46033f760ba5fd266ce59fe391fac473f04f52Daniel Dunbar P.appendSuffix("gch"); 268049853d74ea052ed904de7e18ae51d6953177822Daniel Dunbar if (P.exists()) 269049853d74ea052ed904de7e18ae51d6953177822Daniel Dunbar FoundPTH = true; 270049853d74ea052ed904de7e18ae51d6953177822Daniel Dunbar } 271049853d74ea052ed904de7e18ae51d6953177822Daniel Dunbar 272049853d74ea052ed904de7e18ae51d6953177822Daniel Dunbar if (FoundPTH) { 273049853d74ea052ed904de7e18ae51d6953177822Daniel Dunbar A->claim(); 274049853d74ea052ed904de7e18ae51d6953177822Daniel Dunbar CmdArgs.push_back("-include-pth"); 275049853d74ea052ed904de7e18ae51d6953177822Daniel Dunbar CmdArgs.push_back(Args.MakeArgString(P.c_str())); 276049853d74ea052ed904de7e18ae51d6953177822Daniel Dunbar continue; 2771d46033f760ba5fd266ce59fe391fac473f04f52Daniel Dunbar } 2781d46033f760ba5fd266ce59fe391fac473f04f52Daniel Dunbar } 279049853d74ea052ed904de7e18ae51d6953177822Daniel Dunbar 280049853d74ea052ed904de7e18ae51d6953177822Daniel Dunbar // Not translated, render as usual. 281049853d74ea052ed904de7e18ae51d6953177822Daniel Dunbar A->claim(); 282049853d74ea052ed904de7e18ae51d6953177822Daniel Dunbar A->render(Args, CmdArgs); 2831d46033f760ba5fd266ce59fe391fac473f04f52Daniel Dunbar } 2841d46033f760ba5fd266ce59fe391fac473f04f52Daniel Dunbar 285337a6271b98c4c183f7eaad1563a75260b4f2871Daniel Dunbar // Manually translate -O to -O1 and -O4 to -O3; let clang reject 286337a6271b98c4c183f7eaad1563a75260b4f2871Daniel Dunbar // others. 287337a6271b98c4c183f7eaad1563a75260b4f2871Daniel Dunbar if (Arg *A = Args.getLastArg(options::OPT_O_Group)) { 288337a6271b98c4c183f7eaad1563a75260b4f2871Daniel Dunbar if (A->getOption().getId() == options::OPT_O4) 289337a6271b98c4c183f7eaad1563a75260b4f2871Daniel Dunbar CmdArgs.push_back("-O3"); 290337a6271b98c4c183f7eaad1563a75260b4f2871Daniel Dunbar else if (A->getValue(Args)[0] == '\0') 2911d46033f760ba5fd266ce59fe391fac473f04f52Daniel Dunbar CmdArgs.push_back("-O1"); 2921d46033f760ba5fd266ce59fe391fac473f04f52Daniel Dunbar else 2935697aa0d75c87bafec78984048d558f8d12ca1b3Daniel Dunbar A->render(Args, CmdArgs); 2941d46033f760ba5fd266ce59fe391fac473f04f52Daniel Dunbar } 2951d46033f760ba5fd266ce59fe391fac473f04f52Daniel Dunbar 296ff7488dc9a766f94daf54d81b03ab9160d0bfd88Daniel Dunbar Args.AddAllArgs(CmdArgs, options::OPT_clang_W_Group, 297ff7488dc9a766f94daf54d81b03ab9160d0bfd88Daniel Dunbar options::OPT_pedantic_Group); 2981d46033f760ba5fd266ce59fe391fac473f04f52Daniel Dunbar Args.AddLastArg(CmdArgs, options::OPT_w); 2991d46033f760ba5fd266ce59fe391fac473f04f52Daniel Dunbar Args.AddAllArgs(CmdArgs, options::OPT_std_EQ, options::OPT_ansi, 3001d46033f760ba5fd266ce59fe391fac473f04f52Daniel Dunbar options::OPT_trigraphs); 3011d46033f760ba5fd266ce59fe391fac473f04f52Daniel Dunbar 3021d46033f760ba5fd266ce59fe391fac473f04f52Daniel Dunbar if (Arg *A = Args.getLastArg(options::OPT_ftemplate_depth_)) { 3031d46033f760ba5fd266ce59fe391fac473f04f52Daniel Dunbar CmdArgs.push_back("-ftemplate-depth"); 3041d46033f760ba5fd266ce59fe391fac473f04f52Daniel Dunbar CmdArgs.push_back(A->getValue(Args)); 305b488c1dac8e53206f07103d794a62a3f5012c0f4Daniel Dunbar } 306b488c1dac8e53206f07103d794a62a3f5012c0f4Daniel Dunbar 3071d46033f760ba5fd266ce59fe391fac473f04f52Daniel Dunbar Args.AddAllArgs(CmdArgs, options::OPT_clang_f_Group); 3081d46033f760ba5fd266ce59fe391fac473f04f52Daniel Dunbar 309b9f3a777e503851964c9542a0261e45eece59747Daniel Dunbar // If tool chain translates fpascal-strings, we want to back 310b9f3a777e503851964c9542a0261e45eece59747Daniel Dunbar // translate here. 311b9f3a777e503851964c9542a0261e45eece59747Daniel Dunbar // FIXME: This is gross; that translation should be pulled from the 312b9f3a777e503851964c9542a0261e45eece59747Daniel Dunbar // tool chain. 313b9f3a777e503851964c9542a0261e45eece59747Daniel Dunbar if (Arg *A = Args.getLastArg(options::OPT_mpascal_strings, 314b9f3a777e503851964c9542a0261e45eece59747Daniel Dunbar options::OPT_mno_pascal_strings)) { 315b9f3a777e503851964c9542a0261e45eece59747Daniel Dunbar if (A->getOption().matches(options::OPT_mpascal_strings)) 316b9f3a777e503851964c9542a0261e45eece59747Daniel Dunbar CmdArgs.push_back("-fpascal-strings"); 317b9f3a777e503851964c9542a0261e45eece59747Daniel Dunbar else 318b9f3a777e503851964c9542a0261e45eece59747Daniel Dunbar CmdArgs.push_back("-fno-pascal-strings"); 319b9f3a777e503851964c9542a0261e45eece59747Daniel Dunbar } 320b9f3a777e503851964c9542a0261e45eece59747Daniel Dunbar 3211d46033f760ba5fd266ce59fe391fac473f04f52Daniel Dunbar Args.AddLastArg(CmdArgs, options::OPT_dM); 3221d46033f760ba5fd266ce59fe391fac473f04f52Daniel Dunbar 3231d46033f760ba5fd266ce59fe391fac473f04f52Daniel Dunbar Args.AddAllArgValues(CmdArgs, options::OPT_Xclang); 3241d46033f760ba5fd266ce59fe391fac473f04f52Daniel Dunbar 3251d46033f760ba5fd266ce59fe391fac473f04f52Daniel Dunbar // FIXME: Always pass the full triple once we aren't concerned with 3261d46033f760ba5fd266ce59fe391fac473f04f52Daniel Dunbar // ccc compat. 3271d46033f760ba5fd266ce59fe391fac473f04f52Daniel Dunbar CmdArgs.push_back("-arch"); 3281d46033f760ba5fd266ce59fe391fac473f04f52Daniel Dunbar CmdArgs.push_back(getToolChain().getArchName().c_str()); 3291d46033f760ba5fd266ce59fe391fac473f04f52Daniel Dunbar 330b488c1dac8e53206f07103d794a62a3f5012c0f4Daniel Dunbar if (Output.isPipe()) { 331b488c1dac8e53206f07103d794a62a3f5012c0f4Daniel Dunbar CmdArgs.push_back("-o"); 332b488c1dac8e53206f07103d794a62a3f5012c0f4Daniel Dunbar CmdArgs.push_back("-"); 333115a79277edababaf1b26e3654044ae983197679Daniel Dunbar } else if (Output.isFilename()) { 334b488c1dac8e53206f07103d794a62a3f5012c0f4Daniel Dunbar CmdArgs.push_back("-o"); 335115a79277edababaf1b26e3654044ae983197679Daniel Dunbar CmdArgs.push_back(Output.getFilename()); 336115a79277edababaf1b26e3654044ae983197679Daniel Dunbar } else { 337115a79277edababaf1b26e3654044ae983197679Daniel Dunbar assert(Output.isNothing() && "Invalid output."); 338b488c1dac8e53206f07103d794a62a3f5012c0f4Daniel Dunbar } 339b488c1dac8e53206f07103d794a62a3f5012c0f4Daniel Dunbar 3401d46033f760ba5fd266ce59fe391fac473f04f52Daniel Dunbar for (InputInfoList::const_iterator 3411d46033f760ba5fd266ce59fe391fac473f04f52Daniel Dunbar it = Inputs.begin(), ie = Inputs.end(); it != ie; ++it) { 3421d46033f760ba5fd266ce59fe391fac473f04f52Daniel Dunbar const InputInfo &II = *it; 3431d46033f760ba5fd266ce59fe391fac473f04f52Daniel Dunbar CmdArgs.push_back("-x"); 3441d46033f760ba5fd266ce59fe391fac473f04f52Daniel Dunbar CmdArgs.push_back(types::getTypeName(II.getType())); 3451d46033f760ba5fd266ce59fe391fac473f04f52Daniel Dunbar if (II.isPipe()) 3461d46033f760ba5fd266ce59fe391fac473f04f52Daniel Dunbar CmdArgs.push_back("-"); 347115a79277edababaf1b26e3654044ae983197679Daniel Dunbar else if (II.isFilename()) 348115a79277edababaf1b26e3654044ae983197679Daniel Dunbar CmdArgs.push_back(II.getFilename()); 3491d46033f760ba5fd266ce59fe391fac473f04f52Daniel Dunbar else 350115a79277edababaf1b26e3654044ae983197679Daniel Dunbar II.getInputArg().renderAsInput(Args, CmdArgs); 3511d46033f760ba5fd266ce59fe391fac473f04f52Daniel Dunbar } 3521d46033f760ba5fd266ce59fe391fac473f04f52Daniel Dunbar 3531d46033f760ba5fd266ce59fe391fac473f04f52Daniel Dunbar const char *Exec = 354d7d5f0223bd30dfd618762349c6209dd1d5ea3e6Daniel Dunbar Args.MakeArgString(getToolChain().GetProgramPath(C, "clang-cc").c_str()); 3551d46033f760ba5fd266ce59fe391fac473f04f52Daniel Dunbar Dest.addCommand(new Command(Exec, CmdArgs)); 356a880db0b0fc028abf754c290d921d809eec0518aDaniel Dunbar 357a880db0b0fc028abf754c290d921d809eec0518aDaniel Dunbar // Claim some arguments which clang doesn't support, but we don't 358a880db0b0fc028abf754c290d921d809eec0518aDaniel Dunbar // care to warn the user about. 359a880db0b0fc028abf754c290d921d809eec0518aDaniel Dunbar 360a880db0b0fc028abf754c290d921d809eec0518aDaniel Dunbar // FIXME: Use iterator. 361a880db0b0fc028abf754c290d921d809eec0518aDaniel Dunbar for (ArgList::const_iterator 362a880db0b0fc028abf754c290d921d809eec0518aDaniel Dunbar it = Args.begin(), ie = Args.end(); it != ie; ++it) { 363a880db0b0fc028abf754c290d921d809eec0518aDaniel Dunbar const Arg *A = *it; 364a880db0b0fc028abf754c290d921d809eec0518aDaniel Dunbar if (A->getOption().matches(options::OPT_clang_ignored_W_Group) || 365a880db0b0fc028abf754c290d921d809eec0518aDaniel Dunbar A->getOption().matches(options::OPT_clang_ignored_f_Group)) 366a880db0b0fc028abf754c290d921d809eec0518aDaniel Dunbar A->claim(); 367a880db0b0fc028abf754c290d921d809eec0518aDaniel Dunbar } 36847ac7d27c44bd64a7d0fc03d4babc196cf2b8230Daniel Dunbar} 36947ac7d27c44bd64a7d0fc03d4babc196cf2b8230Daniel Dunbar 370b488c1dac8e53206f07103d794a62a3f5012c0f4Daniel Dunbarvoid gcc::Common::ConstructJob(Compilation &C, const JobAction &JA, 371b488c1dac8e53206f07103d794a62a3f5012c0f4Daniel Dunbar Job &Dest, 372b488c1dac8e53206f07103d794a62a3f5012c0f4Daniel Dunbar const InputInfo &Output, 373b488c1dac8e53206f07103d794a62a3f5012c0f4Daniel Dunbar const InputInfoList &Inputs, 3741d46033f760ba5fd266ce59fe391fac473f04f52Daniel Dunbar const ArgList &Args, 375b488c1dac8e53206f07103d794a62a3f5012c0f4Daniel Dunbar const char *LinkingOutput) const { 376b488c1dac8e53206f07103d794a62a3f5012c0f4Daniel Dunbar ArgStringList CmdArgs; 377b488c1dac8e53206f07103d794a62a3f5012c0f4Daniel Dunbar 378b488c1dac8e53206f07103d794a62a3f5012c0f4Daniel Dunbar for (ArgList::const_iterator 3791d46033f760ba5fd266ce59fe391fac473f04f52Daniel Dunbar it = Args.begin(), ie = Args.end(); it != ie; ++it) { 380b488c1dac8e53206f07103d794a62a3f5012c0f4Daniel Dunbar Arg *A = *it; 3817587719c40ebf02bf11e5e66c30bd20e98edebc2Daniel Dunbar if (A->getOption().hasForwardToGCC()) { 3827587719c40ebf02bf11e5e66c30bd20e98edebc2Daniel Dunbar // It is unfortunate that we have to claim here, as this means 3837587719c40ebf02bf11e5e66c30bd20e98edebc2Daniel Dunbar // we will basically never report anything interesting for 3847587719c40ebf02bf11e5e66c30bd20e98edebc2Daniel Dunbar // platforms using a generic gcc. 3857587719c40ebf02bf11e5e66c30bd20e98edebc2Daniel Dunbar A->claim(); 3861d46033f760ba5fd266ce59fe391fac473f04f52Daniel Dunbar A->render(Args, CmdArgs); 3877587719c40ebf02bf11e5e66c30bd20e98edebc2Daniel Dunbar } 388b488c1dac8e53206f07103d794a62a3f5012c0f4Daniel Dunbar } 389b488c1dac8e53206f07103d794a62a3f5012c0f4Daniel Dunbar 390b488c1dac8e53206f07103d794a62a3f5012c0f4Daniel Dunbar RenderExtraToolArgs(CmdArgs); 391b488c1dac8e53206f07103d794a62a3f5012c0f4Daniel Dunbar 392b488c1dac8e53206f07103d794a62a3f5012c0f4Daniel Dunbar // If using a driver driver, force the arch. 393b488c1dac8e53206f07103d794a62a3f5012c0f4Daniel Dunbar if (getToolChain().getHost().useDriverDriver()) { 394b488c1dac8e53206f07103d794a62a3f5012c0f4Daniel Dunbar CmdArgs.push_back("-arch"); 395b488c1dac8e53206f07103d794a62a3f5012c0f4Daniel Dunbar CmdArgs.push_back(getToolChain().getArchName().c_str()); 396b488c1dac8e53206f07103d794a62a3f5012c0f4Daniel Dunbar } 397b488c1dac8e53206f07103d794a62a3f5012c0f4Daniel Dunbar 398b488c1dac8e53206f07103d794a62a3f5012c0f4Daniel Dunbar if (Output.isPipe()) { 399b488c1dac8e53206f07103d794a62a3f5012c0f4Daniel Dunbar CmdArgs.push_back("-o"); 400b488c1dac8e53206f07103d794a62a3f5012c0f4Daniel Dunbar CmdArgs.push_back("-"); 401115a79277edababaf1b26e3654044ae983197679Daniel Dunbar } else if (Output.isFilename()) { 402b488c1dac8e53206f07103d794a62a3f5012c0f4Daniel Dunbar CmdArgs.push_back("-o"); 403115a79277edababaf1b26e3654044ae983197679Daniel Dunbar CmdArgs.push_back(Output.getFilename()); 404115a79277edababaf1b26e3654044ae983197679Daniel Dunbar } else { 405115a79277edababaf1b26e3654044ae983197679Daniel Dunbar assert(Output.isNothing() && "Unexpected output"); 406b488c1dac8e53206f07103d794a62a3f5012c0f4Daniel Dunbar CmdArgs.push_back("-fsyntax-only"); 407115a79277edababaf1b26e3654044ae983197679Daniel Dunbar } 408b488c1dac8e53206f07103d794a62a3f5012c0f4Daniel Dunbar 409b488c1dac8e53206f07103d794a62a3f5012c0f4Daniel Dunbar 410b488c1dac8e53206f07103d794a62a3f5012c0f4Daniel Dunbar // Only pass -x if gcc will understand it; otherwise hope gcc 411b488c1dac8e53206f07103d794a62a3f5012c0f4Daniel Dunbar // understands the suffix correctly. The main use case this would go 412b488c1dac8e53206f07103d794a62a3f5012c0f4Daniel Dunbar // wrong in is for linker inputs if they happened to have an odd 413b488c1dac8e53206f07103d794a62a3f5012c0f4Daniel Dunbar // suffix; really the only way to get this to happen is a command 414b488c1dac8e53206f07103d794a62a3f5012c0f4Daniel Dunbar // like '-x foobar a.c' which will treat a.c like a linker input. 415b488c1dac8e53206f07103d794a62a3f5012c0f4Daniel Dunbar // 416b488c1dac8e53206f07103d794a62a3f5012c0f4Daniel Dunbar // FIXME: For the linker case specifically, can we safely convert 417b488c1dac8e53206f07103d794a62a3f5012c0f4Daniel Dunbar // inputs into '-Wl,' options? 418b488c1dac8e53206f07103d794a62a3f5012c0f4Daniel Dunbar for (InputInfoList::const_iterator 419b488c1dac8e53206f07103d794a62a3f5012c0f4Daniel Dunbar it = Inputs.begin(), ie = Inputs.end(); it != ie; ++it) { 420b488c1dac8e53206f07103d794a62a3f5012c0f4Daniel Dunbar const InputInfo &II = *it; 421b488c1dac8e53206f07103d794a62a3f5012c0f4Daniel Dunbar if (types::canTypeBeUserSpecified(II.getType())) { 422b488c1dac8e53206f07103d794a62a3f5012c0f4Daniel Dunbar CmdArgs.push_back("-x"); 423b488c1dac8e53206f07103d794a62a3f5012c0f4Daniel Dunbar CmdArgs.push_back(types::getTypeName(II.getType())); 424b488c1dac8e53206f07103d794a62a3f5012c0f4Daniel Dunbar } 425b488c1dac8e53206f07103d794a62a3f5012c0f4Daniel Dunbar 426b488c1dac8e53206f07103d794a62a3f5012c0f4Daniel Dunbar if (II.isPipe()) 427b488c1dac8e53206f07103d794a62a3f5012c0f4Daniel Dunbar CmdArgs.push_back("-"); 428115a79277edababaf1b26e3654044ae983197679Daniel Dunbar else if (II.isFilename()) 429115a79277edababaf1b26e3654044ae983197679Daniel Dunbar CmdArgs.push_back(II.getFilename()); 430b488c1dac8e53206f07103d794a62a3f5012c0f4Daniel Dunbar else 431115a79277edababaf1b26e3654044ae983197679Daniel Dunbar // Don't render as input, we need gcc to do the translations. 432115a79277edababaf1b26e3654044ae983197679Daniel Dunbar II.getInputArg().render(Args, CmdArgs); 433b488c1dac8e53206f07103d794a62a3f5012c0f4Daniel Dunbar } 434b488c1dac8e53206f07103d794a62a3f5012c0f4Daniel Dunbar 435632f50edc08c76ebc643a0d4871bae33a55d7b4eDaniel Dunbar const char *Exec = 436632f50edc08c76ebc643a0d4871bae33a55d7b4eDaniel Dunbar Args.MakeArgString(getToolChain().GetProgramPath(C, "gcc").c_str()); 437632f50edc08c76ebc643a0d4871bae33a55d7b4eDaniel Dunbar Dest.addCommand(new Command(Exec, CmdArgs)); 43847ac7d27c44bd64a7d0fc03d4babc196cf2b8230Daniel Dunbar} 43947ac7d27c44bd64a7d0fc03d4babc196cf2b8230Daniel Dunbar 440b488c1dac8e53206f07103d794a62a3f5012c0f4Daniel Dunbarvoid gcc::Preprocess::RenderExtraToolArgs(ArgStringList &CmdArgs) const { 441b488c1dac8e53206f07103d794a62a3f5012c0f4Daniel Dunbar CmdArgs.push_back("-E"); 44247ac7d27c44bd64a7d0fc03d4babc196cf2b8230Daniel Dunbar} 44347ac7d27c44bd64a7d0fc03d4babc196cf2b8230Daniel Dunbar 444b488c1dac8e53206f07103d794a62a3f5012c0f4Daniel Dunbarvoid gcc::Precompile::RenderExtraToolArgs(ArgStringList &CmdArgs) const { 445b488c1dac8e53206f07103d794a62a3f5012c0f4Daniel Dunbar // The type is good enough. 44647ac7d27c44bd64a7d0fc03d4babc196cf2b8230Daniel Dunbar} 44747ac7d27c44bd64a7d0fc03d4babc196cf2b8230Daniel Dunbar 448b488c1dac8e53206f07103d794a62a3f5012c0f4Daniel Dunbarvoid gcc::Compile::RenderExtraToolArgs(ArgStringList &CmdArgs) const { 449b488c1dac8e53206f07103d794a62a3f5012c0f4Daniel Dunbar CmdArgs.push_back("-S"); 45047ac7d27c44bd64a7d0fc03d4babc196cf2b8230Daniel Dunbar} 45147ac7d27c44bd64a7d0fc03d4babc196cf2b8230Daniel Dunbar 452b488c1dac8e53206f07103d794a62a3f5012c0f4Daniel Dunbarvoid gcc::Assemble::RenderExtraToolArgs(ArgStringList &CmdArgs) const { 453b488c1dac8e53206f07103d794a62a3f5012c0f4Daniel Dunbar CmdArgs.push_back("-c"); 454b488c1dac8e53206f07103d794a62a3f5012c0f4Daniel Dunbar} 45547ac7d27c44bd64a7d0fc03d4babc196cf2b8230Daniel Dunbar 456b488c1dac8e53206f07103d794a62a3f5012c0f4Daniel Dunbarvoid gcc::Link::RenderExtraToolArgs(ArgStringList &CmdArgs) const { 457b488c1dac8e53206f07103d794a62a3f5012c0f4Daniel Dunbar // The types are (hopefully) good enough. 45847ac7d27c44bd64a7d0fc03d4babc196cf2b8230Daniel Dunbar} 459b488c1dac8e53206f07103d794a62a3f5012c0f4Daniel Dunbar 46040f1265ebd42ece3e7f7917319b56012e8e2bce2Daniel Dunbarconst char *darwin::CC1::getCC1Name(types::ID Type) const { 46140f1265ebd42ece3e7f7917319b56012e8e2bce2Daniel Dunbar switch (Type) { 46240f1265ebd42ece3e7f7917319b56012e8e2bce2Daniel Dunbar default: 46340f1265ebd42ece3e7f7917319b56012e8e2bce2Daniel Dunbar assert(0 && "Unexpected type for Darwin CC1 tool."); 46440f1265ebd42ece3e7f7917319b56012e8e2bce2Daniel Dunbar case types::TY_Asm: 46540f1265ebd42ece3e7f7917319b56012e8e2bce2Daniel Dunbar case types::TY_C: case types::TY_CHeader: 46640f1265ebd42ece3e7f7917319b56012e8e2bce2Daniel Dunbar case types::TY_PP_C: case types::TY_PP_CHeader: 46740f1265ebd42ece3e7f7917319b56012e8e2bce2Daniel Dunbar return "cc1"; 46840f1265ebd42ece3e7f7917319b56012e8e2bce2Daniel Dunbar case types::TY_ObjC: case types::TY_ObjCHeader: 46940f1265ebd42ece3e7f7917319b56012e8e2bce2Daniel Dunbar case types::TY_PP_ObjC: case types::TY_PP_ObjCHeader: 47040f1265ebd42ece3e7f7917319b56012e8e2bce2Daniel Dunbar return "cc1obj"; 47140f1265ebd42ece3e7f7917319b56012e8e2bce2Daniel Dunbar case types::TY_CXX: case types::TY_CXXHeader: 47240f1265ebd42ece3e7f7917319b56012e8e2bce2Daniel Dunbar case types::TY_PP_CXX: case types::TY_PP_CXXHeader: 47340f1265ebd42ece3e7f7917319b56012e8e2bce2Daniel Dunbar return "cc1plus"; 47440f1265ebd42ece3e7f7917319b56012e8e2bce2Daniel Dunbar case types::TY_ObjCXX: case types::TY_ObjCXXHeader: 47540f1265ebd42ece3e7f7917319b56012e8e2bce2Daniel Dunbar case types::TY_PP_ObjCXX: case types::TY_PP_ObjCXXHeader: 47640f1265ebd42ece3e7f7917319b56012e8e2bce2Daniel Dunbar return "cc1objplus"; 47740f1265ebd42ece3e7f7917319b56012e8e2bce2Daniel Dunbar } 47840f1265ebd42ece3e7f7917319b56012e8e2bce2Daniel Dunbar} 47940f1265ebd42ece3e7f7917319b56012e8e2bce2Daniel Dunbar 48040f1265ebd42ece3e7f7917319b56012e8e2bce2Daniel Dunbarvoid darwin::Preprocess::ConstructJob(Compilation &C, const JobAction &JA, 48140f1265ebd42ece3e7f7917319b56012e8e2bce2Daniel Dunbar Job &Dest, const InputInfo &Output, 48240f1265ebd42ece3e7f7917319b56012e8e2bce2Daniel Dunbar const InputInfoList &Inputs, 48340f1265ebd42ece3e7f7917319b56012e8e2bce2Daniel Dunbar const ArgList &Args, 48440f1265ebd42ece3e7f7917319b56012e8e2bce2Daniel Dunbar const char *LinkingOutput) const { 48540f1265ebd42ece3e7f7917319b56012e8e2bce2Daniel Dunbar ArgStringList CmdArgs; 48640f1265ebd42ece3e7f7917319b56012e8e2bce2Daniel Dunbar 48740f1265ebd42ece3e7f7917319b56012e8e2bce2Daniel Dunbar assert(Inputs.size() == 1 && "Unexpected number of inputs!"); 48840f1265ebd42ece3e7f7917319b56012e8e2bce2Daniel Dunbar 48940f1265ebd42ece3e7f7917319b56012e8e2bce2Daniel Dunbar CmdArgs.push_back("-E"); 49040f1265ebd42ece3e7f7917319b56012e8e2bce2Daniel Dunbar 49140f1265ebd42ece3e7f7917319b56012e8e2bce2Daniel Dunbar if (Args.hasArg(options::OPT_traditional) || 49240f1265ebd42ece3e7f7917319b56012e8e2bce2Daniel Dunbar Args.hasArg(options::OPT_ftraditional) || 49340f1265ebd42ece3e7f7917319b56012e8e2bce2Daniel Dunbar Args.hasArg(options::OPT_traditional_cpp)) 49440f1265ebd42ece3e7f7917319b56012e8e2bce2Daniel Dunbar CmdArgs.push_back("-traditional-cpp"); 49540f1265ebd42ece3e7f7917319b56012e8e2bce2Daniel Dunbar 49640f1265ebd42ece3e7f7917319b56012e8e2bce2Daniel Dunbar ArgStringList OutputArgs; 49740f1265ebd42ece3e7f7917319b56012e8e2bce2Daniel Dunbar if (Output.isFilename()) { 49840f1265ebd42ece3e7f7917319b56012e8e2bce2Daniel Dunbar OutputArgs.push_back("-o"); 49940f1265ebd42ece3e7f7917319b56012e8e2bce2Daniel Dunbar OutputArgs.push_back(Output.getFilename()); 50040f1265ebd42ece3e7f7917319b56012e8e2bce2Daniel Dunbar } else { 50140f1265ebd42ece3e7f7917319b56012e8e2bce2Daniel Dunbar assert(Output.isPipe() && "Unexpected CC1 output."); 50240f1265ebd42ece3e7f7917319b56012e8e2bce2Daniel Dunbar } 50340f1265ebd42ece3e7f7917319b56012e8e2bce2Daniel Dunbar 50440f1265ebd42ece3e7f7917319b56012e8e2bce2Daniel Dunbar AddCPPOptionsArgs(Args, CmdArgs, Inputs, OutputArgs); 50540f1265ebd42ece3e7f7917319b56012e8e2bce2Daniel Dunbar 50640f1265ebd42ece3e7f7917319b56012e8e2bce2Daniel Dunbar Args.AddAllArgs(CmdArgs, options::OPT_d_Group); 50740f1265ebd42ece3e7f7917319b56012e8e2bce2Daniel Dunbar 50840f1265ebd42ece3e7f7917319b56012e8e2bce2Daniel Dunbar const char *CC1Name = getCC1Name(Inputs[0].getType()); 50940f1265ebd42ece3e7f7917319b56012e8e2bce2Daniel Dunbar const char *Exec = 51040f1265ebd42ece3e7f7917319b56012e8e2bce2Daniel Dunbar Args.MakeArgString(getToolChain().GetProgramPath(C, CC1Name).c_str()); 51140f1265ebd42ece3e7f7917319b56012e8e2bce2Daniel Dunbar Dest.addCommand(new Command(Exec, CmdArgs)); 51240f1265ebd42ece3e7f7917319b56012e8e2bce2Daniel Dunbar} 51340f1265ebd42ece3e7f7917319b56012e8e2bce2Daniel Dunbar 51440f1265ebd42ece3e7f7917319b56012e8e2bce2Daniel Dunbarvoid darwin::Compile::ConstructJob(Compilation &C, const JobAction &JA, 51540f1265ebd42ece3e7f7917319b56012e8e2bce2Daniel Dunbar Job &Dest, const InputInfo &Output, 51640f1265ebd42ece3e7f7917319b56012e8e2bce2Daniel Dunbar const InputInfoList &Inputs, 51740f1265ebd42ece3e7f7917319b56012e8e2bce2Daniel Dunbar const ArgList &Args, 51840f1265ebd42ece3e7f7917319b56012e8e2bce2Daniel Dunbar const char *LinkingOutput) const { 51940f1265ebd42ece3e7f7917319b56012e8e2bce2Daniel Dunbar const Driver &D = getToolChain().getHost().getDriver(); 52040f1265ebd42ece3e7f7917319b56012e8e2bce2Daniel Dunbar ArgStringList CmdArgs; 52140f1265ebd42ece3e7f7917319b56012e8e2bce2Daniel Dunbar 52240f1265ebd42ece3e7f7917319b56012e8e2bce2Daniel Dunbar assert(Inputs.size() == 1 && "Unexpected number of inputs!"); 52340f1265ebd42ece3e7f7917319b56012e8e2bce2Daniel Dunbar 52440f1265ebd42ece3e7f7917319b56012e8e2bce2Daniel Dunbar types::ID InputType = Inputs[0].getType(); 52540f1265ebd42ece3e7f7917319b56012e8e2bce2Daniel Dunbar const Arg *A; 52640f1265ebd42ece3e7f7917319b56012e8e2bce2Daniel Dunbar if ((A = Args.getLastArg(options::OPT_traditional)) || 52740f1265ebd42ece3e7f7917319b56012e8e2bce2Daniel Dunbar (A = Args.getLastArg(options::OPT_ftraditional))) 52840f1265ebd42ece3e7f7917319b56012e8e2bce2Daniel Dunbar D.Diag(clang::diag::err_drv_argument_only_allowed_with) 52940f1265ebd42ece3e7f7917319b56012e8e2bce2Daniel Dunbar << A->getAsString(Args) << "-E"; 53040f1265ebd42ece3e7f7917319b56012e8e2bce2Daniel Dunbar 53140f1265ebd42ece3e7f7917319b56012e8e2bce2Daniel Dunbar if (Output.getType() == types::TY_LLVMAsm) 53240f1265ebd42ece3e7f7917319b56012e8e2bce2Daniel Dunbar CmdArgs.push_back("-emit-llvm"); 53340f1265ebd42ece3e7f7917319b56012e8e2bce2Daniel Dunbar else if (Output.getType() == types::TY_LLVMBC) 53440f1265ebd42ece3e7f7917319b56012e8e2bce2Daniel Dunbar CmdArgs.push_back("-emit-llvm-bc"); 53540f1265ebd42ece3e7f7917319b56012e8e2bce2Daniel Dunbar 53640f1265ebd42ece3e7f7917319b56012e8e2bce2Daniel Dunbar ArgStringList OutputArgs; 53740f1265ebd42ece3e7f7917319b56012e8e2bce2Daniel Dunbar if (Output.getType() != types::TY_PCH) { 53840f1265ebd42ece3e7f7917319b56012e8e2bce2Daniel Dunbar OutputArgs.push_back("-o"); 53940f1265ebd42ece3e7f7917319b56012e8e2bce2Daniel Dunbar if (Output.isPipe()) 54040f1265ebd42ece3e7f7917319b56012e8e2bce2Daniel Dunbar OutputArgs.push_back("-"); 54140f1265ebd42ece3e7f7917319b56012e8e2bce2Daniel Dunbar else if (Output.isNothing()) 54240f1265ebd42ece3e7f7917319b56012e8e2bce2Daniel Dunbar OutputArgs.push_back("/dev/null"); 54340f1265ebd42ece3e7f7917319b56012e8e2bce2Daniel Dunbar else 54440f1265ebd42ece3e7f7917319b56012e8e2bce2Daniel Dunbar OutputArgs.push_back(Output.getFilename()); 54540f1265ebd42ece3e7f7917319b56012e8e2bce2Daniel Dunbar } 54640f1265ebd42ece3e7f7917319b56012e8e2bce2Daniel Dunbar 54740f1265ebd42ece3e7f7917319b56012e8e2bce2Daniel Dunbar // There is no need for this level of compatibility, but it makes 54840f1265ebd42ece3e7f7917319b56012e8e2bce2Daniel Dunbar // diffing easier. 54940f1265ebd42ece3e7f7917319b56012e8e2bce2Daniel Dunbar bool OutputArgsEarly = (Args.hasArg(options::OPT_fsyntax_only) || 55040f1265ebd42ece3e7f7917319b56012e8e2bce2Daniel Dunbar Args.hasArg(options::OPT_S)); 55140f1265ebd42ece3e7f7917319b56012e8e2bce2Daniel Dunbar 55240f1265ebd42ece3e7f7917319b56012e8e2bce2Daniel Dunbar if (types::getPreprocessedType(InputType) != types::TY_INVALID) { 55340f1265ebd42ece3e7f7917319b56012e8e2bce2Daniel Dunbar AddCPPUniqueOptionsArgs(Args, CmdArgs); 55440f1265ebd42ece3e7f7917319b56012e8e2bce2Daniel Dunbar if (OutputArgsEarly) { 55540f1265ebd42ece3e7f7917319b56012e8e2bce2Daniel Dunbar AddCC1OptionsArgs(Args, CmdArgs, Inputs, OutputArgs); 55640f1265ebd42ece3e7f7917319b56012e8e2bce2Daniel Dunbar } else { 55740f1265ebd42ece3e7f7917319b56012e8e2bce2Daniel Dunbar AddCC1OptionsArgs(Args, CmdArgs, Inputs, ArgStringList()); 55840f1265ebd42ece3e7f7917319b56012e8e2bce2Daniel Dunbar CmdArgs.append(OutputArgs.begin(), OutputArgs.end()); 55940f1265ebd42ece3e7f7917319b56012e8e2bce2Daniel Dunbar } 56040f1265ebd42ece3e7f7917319b56012e8e2bce2Daniel Dunbar } else { 56140f1265ebd42ece3e7f7917319b56012e8e2bce2Daniel Dunbar CmdArgs.push_back("-fpreprocessed"); 56240f1265ebd42ece3e7f7917319b56012e8e2bce2Daniel Dunbar 56340f1265ebd42ece3e7f7917319b56012e8e2bce2Daniel Dunbar // FIXME: There is a spec command to remove 56440f1265ebd42ece3e7f7917319b56012e8e2bce2Daniel Dunbar // -fpredictive-compilation args here. Investigate. 56540f1265ebd42ece3e7f7917319b56012e8e2bce2Daniel Dunbar 56640f1265ebd42ece3e7f7917319b56012e8e2bce2Daniel Dunbar for (InputInfoList::const_iterator 56740f1265ebd42ece3e7f7917319b56012e8e2bce2Daniel Dunbar it = Inputs.begin(), ie = Inputs.end(); it != ie; ++it) { 56840f1265ebd42ece3e7f7917319b56012e8e2bce2Daniel Dunbar const InputInfo &II = *it; 56940f1265ebd42ece3e7f7917319b56012e8e2bce2Daniel Dunbar 57040f1265ebd42ece3e7f7917319b56012e8e2bce2Daniel Dunbar if (II.isPipe()) 57140f1265ebd42ece3e7f7917319b56012e8e2bce2Daniel Dunbar CmdArgs.push_back("-"); 57240f1265ebd42ece3e7f7917319b56012e8e2bce2Daniel Dunbar else 57340f1265ebd42ece3e7f7917319b56012e8e2bce2Daniel Dunbar CmdArgs.push_back(II.getFilename()); 57440f1265ebd42ece3e7f7917319b56012e8e2bce2Daniel Dunbar } 57540f1265ebd42ece3e7f7917319b56012e8e2bce2Daniel Dunbar 57640f1265ebd42ece3e7f7917319b56012e8e2bce2Daniel Dunbar if (OutputArgsEarly) { 57740f1265ebd42ece3e7f7917319b56012e8e2bce2Daniel Dunbar AddCC1OptionsArgs(Args, CmdArgs, Inputs, OutputArgs); 57840f1265ebd42ece3e7f7917319b56012e8e2bce2Daniel Dunbar } else { 57940f1265ebd42ece3e7f7917319b56012e8e2bce2Daniel Dunbar AddCC1OptionsArgs(Args, CmdArgs, Inputs, ArgStringList()); 58040f1265ebd42ece3e7f7917319b56012e8e2bce2Daniel Dunbar CmdArgs.append(OutputArgs.begin(), OutputArgs.end()); 58140f1265ebd42ece3e7f7917319b56012e8e2bce2Daniel Dunbar } 58240f1265ebd42ece3e7f7917319b56012e8e2bce2Daniel Dunbar } 58340f1265ebd42ece3e7f7917319b56012e8e2bce2Daniel Dunbar 58440f1265ebd42ece3e7f7917319b56012e8e2bce2Daniel Dunbar if (Output.getType() == types::TY_PCH) { 58540f1265ebd42ece3e7f7917319b56012e8e2bce2Daniel Dunbar assert(Output.isFilename() && "Invalid PCH output."); 58640f1265ebd42ece3e7f7917319b56012e8e2bce2Daniel Dunbar 58740f1265ebd42ece3e7f7917319b56012e8e2bce2Daniel Dunbar CmdArgs.push_back("-o"); 58840f1265ebd42ece3e7f7917319b56012e8e2bce2Daniel Dunbar // NOTE: gcc uses a temp .s file for this, but there doesn't seem 58940f1265ebd42ece3e7f7917319b56012e8e2bce2Daniel Dunbar // to be a good reason. 59040f1265ebd42ece3e7f7917319b56012e8e2bce2Daniel Dunbar CmdArgs.push_back("/dev/null"); 59140f1265ebd42ece3e7f7917319b56012e8e2bce2Daniel Dunbar 59240f1265ebd42ece3e7f7917319b56012e8e2bce2Daniel Dunbar CmdArgs.push_back("--output-pch="); 59340f1265ebd42ece3e7f7917319b56012e8e2bce2Daniel Dunbar CmdArgs.push_back(Output.getFilename()); 59440f1265ebd42ece3e7f7917319b56012e8e2bce2Daniel Dunbar } 59540f1265ebd42ece3e7f7917319b56012e8e2bce2Daniel Dunbar 59640f1265ebd42ece3e7f7917319b56012e8e2bce2Daniel Dunbar const char *CC1Name = getCC1Name(Inputs[0].getType()); 59740f1265ebd42ece3e7f7917319b56012e8e2bce2Daniel Dunbar const char *Exec = 59840f1265ebd42ece3e7f7917319b56012e8e2bce2Daniel Dunbar Args.MakeArgString(getToolChain().GetProgramPath(C, CC1Name).c_str()); 59940f1265ebd42ece3e7f7917319b56012e8e2bce2Daniel Dunbar Dest.addCommand(new Command(Exec, CmdArgs)); 60040f1265ebd42ece3e7f7917319b56012e8e2bce2Daniel Dunbar} 60140f1265ebd42ece3e7f7917319b56012e8e2bce2Daniel Dunbar 6028cac5f7e1ce63dd77ee0fb4ef68f9fa804f41ea6Daniel Dunbarvoid darwin::Assemble::ConstructJob(Compilation &C, const JobAction &JA, 6038cac5f7e1ce63dd77ee0fb4ef68f9fa804f41ea6Daniel Dunbar Job &Dest, const InputInfo &Output, 6048cac5f7e1ce63dd77ee0fb4ef68f9fa804f41ea6Daniel Dunbar const InputInfoList &Inputs, 6058cac5f7e1ce63dd77ee0fb4ef68f9fa804f41ea6Daniel Dunbar const ArgList &Args, 6068cac5f7e1ce63dd77ee0fb4ef68f9fa804f41ea6Daniel Dunbar const char *LinkingOutput) const { 6078cac5f7e1ce63dd77ee0fb4ef68f9fa804f41ea6Daniel Dunbar ArgStringList CmdArgs; 6088cac5f7e1ce63dd77ee0fb4ef68f9fa804f41ea6Daniel Dunbar 6098cac5f7e1ce63dd77ee0fb4ef68f9fa804f41ea6Daniel Dunbar assert(Inputs.size() == 1 && "Unexpected number of inputs."); 6108cac5f7e1ce63dd77ee0fb4ef68f9fa804f41ea6Daniel Dunbar const InputInfo &Input = Inputs[0]; 6118cac5f7e1ce63dd77ee0fb4ef68f9fa804f41ea6Daniel Dunbar 6128cac5f7e1ce63dd77ee0fb4ef68f9fa804f41ea6Daniel Dunbar // Bit of a hack, this is only used for original inputs. 6138cac5f7e1ce63dd77ee0fb4ef68f9fa804f41ea6Daniel Dunbar if (Input.isFilename() && 6148cac5f7e1ce63dd77ee0fb4ef68f9fa804f41ea6Daniel Dunbar strcmp(Input.getFilename(), Input.getBaseInput()) == 0 && 6158cac5f7e1ce63dd77ee0fb4ef68f9fa804f41ea6Daniel Dunbar Args.hasArg(options::OPT_g_Group)) 6168cac5f7e1ce63dd77ee0fb4ef68f9fa804f41ea6Daniel Dunbar CmdArgs.push_back("--gstabs"); 6178cac5f7e1ce63dd77ee0fb4ef68f9fa804f41ea6Daniel Dunbar 6188cac5f7e1ce63dd77ee0fb4ef68f9fa804f41ea6Daniel Dunbar // Derived from asm spec. 6198cac5f7e1ce63dd77ee0fb4ef68f9fa804f41ea6Daniel Dunbar CmdArgs.push_back("-arch"); 6208cac5f7e1ce63dd77ee0fb4ef68f9fa804f41ea6Daniel Dunbar CmdArgs.push_back(getToolChain().getArchName().c_str()); 6218cac5f7e1ce63dd77ee0fb4ef68f9fa804f41ea6Daniel Dunbar 6228cac5f7e1ce63dd77ee0fb4ef68f9fa804f41ea6Daniel Dunbar CmdArgs.push_back("-force_cpusubtype_ALL"); 6238cac5f7e1ce63dd77ee0fb4ef68f9fa804f41ea6Daniel Dunbar if ((Args.hasArg(options::OPT_mkernel) || 6248cac5f7e1ce63dd77ee0fb4ef68f9fa804f41ea6Daniel Dunbar Args.hasArg(options::OPT_static) || 6258cac5f7e1ce63dd77ee0fb4ef68f9fa804f41ea6Daniel Dunbar Args.hasArg(options::OPT_fapple_kext)) && 6268cac5f7e1ce63dd77ee0fb4ef68f9fa804f41ea6Daniel Dunbar !Args.hasArg(options::OPT_dynamic)) 6278cac5f7e1ce63dd77ee0fb4ef68f9fa804f41ea6Daniel Dunbar CmdArgs.push_back("-static"); 6288cac5f7e1ce63dd77ee0fb4ef68f9fa804f41ea6Daniel Dunbar 6298cac5f7e1ce63dd77ee0fb4ef68f9fa804f41ea6Daniel Dunbar Args.AddAllArgValues(CmdArgs, options::OPT_Wa_COMMA, 6308cac5f7e1ce63dd77ee0fb4ef68f9fa804f41ea6Daniel Dunbar options::OPT_Xassembler); 6318cac5f7e1ce63dd77ee0fb4ef68f9fa804f41ea6Daniel Dunbar 6328cac5f7e1ce63dd77ee0fb4ef68f9fa804f41ea6Daniel Dunbar assert(Output.isFilename() && "Unexpected lipo output."); 6338cac5f7e1ce63dd77ee0fb4ef68f9fa804f41ea6Daniel Dunbar CmdArgs.push_back("-o"); 6348cac5f7e1ce63dd77ee0fb4ef68f9fa804f41ea6Daniel Dunbar CmdArgs.push_back(Output.getFilename()); 6358cac5f7e1ce63dd77ee0fb4ef68f9fa804f41ea6Daniel Dunbar 6368cac5f7e1ce63dd77ee0fb4ef68f9fa804f41ea6Daniel Dunbar if (Input.isPipe()) { 6378cac5f7e1ce63dd77ee0fb4ef68f9fa804f41ea6Daniel Dunbar CmdArgs.push_back("-"); 6388cac5f7e1ce63dd77ee0fb4ef68f9fa804f41ea6Daniel Dunbar } else { 6398cac5f7e1ce63dd77ee0fb4ef68f9fa804f41ea6Daniel Dunbar assert(Input.isFilename() && "Invalid input."); 6408cac5f7e1ce63dd77ee0fb4ef68f9fa804f41ea6Daniel Dunbar CmdArgs.push_back(Input.getFilename()); 6418cac5f7e1ce63dd77ee0fb4ef68f9fa804f41ea6Daniel Dunbar } 6428cac5f7e1ce63dd77ee0fb4ef68f9fa804f41ea6Daniel Dunbar 6438cac5f7e1ce63dd77ee0fb4ef68f9fa804f41ea6Daniel Dunbar // asm_final spec is empty. 6448cac5f7e1ce63dd77ee0fb4ef68f9fa804f41ea6Daniel Dunbar 6458cac5f7e1ce63dd77ee0fb4ef68f9fa804f41ea6Daniel Dunbar const char *Exec = 6468cac5f7e1ce63dd77ee0fb4ef68f9fa804f41ea6Daniel Dunbar Args.MakeArgString(getToolChain().GetProgramPath(C, "as").c_str()); 6478cac5f7e1ce63dd77ee0fb4ef68f9fa804f41ea6Daniel Dunbar Dest.addCommand(new Command(Exec, CmdArgs)); 6488cac5f7e1ce63dd77ee0fb4ef68f9fa804f41ea6Daniel Dunbar} 649ff7488dc9a766f94daf54d81b03ab9160d0bfd88Daniel Dunbar 65002633b541b04ad5ffc1c70f4c2feeeb13e607057Daniel Dunbarstatic const char *MakeFormattedString(const ArgList &Args, 65102633b541b04ad5ffc1c70f4c2feeeb13e607057Daniel Dunbar const llvm::format_object_base &Fmt) { 65202633b541b04ad5ffc1c70f4c2feeeb13e607057Daniel Dunbar std::string Str; 65302633b541b04ad5ffc1c70f4c2feeeb13e607057Daniel Dunbar llvm::raw_string_ostream(Str) << Fmt; 65402633b541b04ad5ffc1c70f4c2feeeb13e607057Daniel Dunbar return Args.MakeArgString(Str.c_str()); 65502633b541b04ad5ffc1c70f4c2feeeb13e607057Daniel Dunbar} 65602633b541b04ad5ffc1c70f4c2feeeb13e607057Daniel Dunbar 65702633b541b04ad5ffc1c70f4c2feeeb13e607057Daniel Dunbar/// Helper routine for seeing if we should use dsymutil; this is a 65802633b541b04ad5ffc1c70f4c2feeeb13e607057Daniel Dunbar/// gcc compatible hack, we should remove it and use the input 65902633b541b04ad5ffc1c70f4c2feeeb13e607057Daniel Dunbar/// type information. 66002633b541b04ad5ffc1c70f4c2feeeb13e607057Daniel Dunbarstatic bool isSourceSuffix(const char *Str) { 66102633b541b04ad5ffc1c70f4c2feeeb13e607057Daniel Dunbar // match: 'C', 'CPP', 'c', 'cc', 'cp', 'c++', 'cpp', 'cxx', 'm', 66202633b541b04ad5ffc1c70f4c2feeeb13e607057Daniel Dunbar // 'mm'. 66302633b541b04ad5ffc1c70f4c2feeeb13e607057Daniel Dunbar switch (strlen(Str)) { 66402633b541b04ad5ffc1c70f4c2feeeb13e607057Daniel Dunbar default: 66502633b541b04ad5ffc1c70f4c2feeeb13e607057Daniel Dunbar return false; 66602633b541b04ad5ffc1c70f4c2feeeb13e607057Daniel Dunbar case 1: 66702633b541b04ad5ffc1c70f4c2feeeb13e607057Daniel Dunbar return (memcmp(Str, "C", 1) == 0 || 66802633b541b04ad5ffc1c70f4c2feeeb13e607057Daniel Dunbar memcmp(Str, "c", 1) == 0 || 66902633b541b04ad5ffc1c70f4c2feeeb13e607057Daniel Dunbar memcmp(Str, "m", 1) == 0); 67002633b541b04ad5ffc1c70f4c2feeeb13e607057Daniel Dunbar case 2: 67102633b541b04ad5ffc1c70f4c2feeeb13e607057Daniel Dunbar return (memcmp(Str, "cc", 2) == 0 || 67202633b541b04ad5ffc1c70f4c2feeeb13e607057Daniel Dunbar memcmp(Str, "cp", 2) == 0 || 67302633b541b04ad5ffc1c70f4c2feeeb13e607057Daniel Dunbar memcmp(Str, "mm", 2) == 0); 67402633b541b04ad5ffc1c70f4c2feeeb13e607057Daniel Dunbar case 3: 67502633b541b04ad5ffc1c70f4c2feeeb13e607057Daniel Dunbar return (memcmp(Str, "CPP", 3) == 0 || 67602633b541b04ad5ffc1c70f4c2feeeb13e607057Daniel Dunbar memcmp(Str, "c++", 3) == 0 || 67702633b541b04ad5ffc1c70f4c2feeeb13e607057Daniel Dunbar memcmp(Str, "cpp", 3) == 0 || 67802633b541b04ad5ffc1c70f4c2feeeb13e607057Daniel Dunbar memcmp(Str, "cxx", 3) == 0); 67902633b541b04ad5ffc1c70f4c2feeeb13e607057Daniel Dunbar } 68002633b541b04ad5ffc1c70f4c2feeeb13e607057Daniel Dunbar} 68102633b541b04ad5ffc1c70f4c2feeeb13e607057Daniel Dunbar 68202633b541b04ad5ffc1c70f4c2feeeb13e607057Daniel Dunbarstatic bool isMacosxVersionLT(unsigned (&A)[3], unsigned (&B)[3]) { 68302633b541b04ad5ffc1c70f4c2feeeb13e607057Daniel Dunbar for (unsigned i=0; i < 3; ++i) { 68402633b541b04ad5ffc1c70f4c2feeeb13e607057Daniel Dunbar if (A[i] > B[i]) return false; 68502633b541b04ad5ffc1c70f4c2feeeb13e607057Daniel Dunbar if (A[i] < B[i]) return true; 68602633b541b04ad5ffc1c70f4c2feeeb13e607057Daniel Dunbar } 68702633b541b04ad5ffc1c70f4c2feeeb13e607057Daniel Dunbar return false; 68802633b541b04ad5ffc1c70f4c2feeeb13e607057Daniel Dunbar} 68902633b541b04ad5ffc1c70f4c2feeeb13e607057Daniel Dunbar 69002633b541b04ad5ffc1c70f4c2feeeb13e607057Daniel Dunbarstatic bool isMacosxVersionLT(unsigned (&A)[3], 69102633b541b04ad5ffc1c70f4c2feeeb13e607057Daniel Dunbar unsigned V0, unsigned V1=0, unsigned V2=0) { 69202633b541b04ad5ffc1c70f4c2feeeb13e607057Daniel Dunbar unsigned B[3] = { V0, V1, V2 }; 69302633b541b04ad5ffc1c70f4c2feeeb13e607057Daniel Dunbar return isMacosxVersionLT(A, B); 69402633b541b04ad5ffc1c70f4c2feeeb13e607057Daniel Dunbar} 69502633b541b04ad5ffc1c70f4c2feeeb13e607057Daniel Dunbar 69602633b541b04ad5ffc1c70f4c2feeeb13e607057Daniel Dunbarstatic bool isMacosxVersionGTE(unsigned(&A)[3], 69702633b541b04ad5ffc1c70f4c2feeeb13e607057Daniel Dunbar unsigned V0, unsigned V1=0, unsigned V2=0) { 69802633b541b04ad5ffc1c70f4c2feeeb13e607057Daniel Dunbar return !isMacosxVersionLT(A, V0, V1, V2); 69902633b541b04ad5ffc1c70f4c2feeeb13e607057Daniel Dunbar} 70002633b541b04ad5ffc1c70f4c2feeeb13e607057Daniel Dunbar 70102633b541b04ad5ffc1c70f4c2feeeb13e607057Daniel Dunbarconst toolchains::Darwin_X86 &darwin::Link::getDarwinToolChain() const { 70202633b541b04ad5ffc1c70f4c2feeeb13e607057Daniel Dunbar return reinterpret_cast<const toolchains::Darwin_X86&>(getToolChain()); 70302633b541b04ad5ffc1c70f4c2feeeb13e607057Daniel Dunbar} 70402633b541b04ad5ffc1c70f4c2feeeb13e607057Daniel Dunbar 70502633b541b04ad5ffc1c70f4c2feeeb13e607057Daniel Dunbarvoid darwin::Link::AddDarwinArch(const ArgList &Args, 70602633b541b04ad5ffc1c70f4c2feeeb13e607057Daniel Dunbar ArgStringList &CmdArgs) const { 70702633b541b04ad5ffc1c70f4c2feeeb13e607057Daniel Dunbar // Derived from darwin_arch spec. 70802633b541b04ad5ffc1c70f4c2feeeb13e607057Daniel Dunbar CmdArgs.push_back("-arch"); 70902633b541b04ad5ffc1c70f4c2feeeb13e607057Daniel Dunbar CmdArgs.push_back(getToolChain().getArchName().c_str()); 71002633b541b04ad5ffc1c70f4c2feeeb13e607057Daniel Dunbar} 71102633b541b04ad5ffc1c70f4c2feeeb13e607057Daniel Dunbar 71202633b541b04ad5ffc1c70f4c2feeeb13e607057Daniel Dunbarvoid darwin::Link::AddDarwinSubArch(const ArgList &Args, 71302633b541b04ad5ffc1c70f4c2feeeb13e607057Daniel Dunbar ArgStringList &CmdArgs) const { 71402633b541b04ad5ffc1c70f4c2feeeb13e607057Daniel Dunbar // Derived from darwin_subarch spec, not sure what the distinction 71502633b541b04ad5ffc1c70f4c2feeeb13e607057Daniel Dunbar // exists for but at least for this chain it is the same. 71602633b541b04ad5ffc1c70f4c2feeeb13e607057Daniel Dunbar AddDarwinArch(Args, CmdArgs); 71702633b541b04ad5ffc1c70f4c2feeeb13e607057Daniel Dunbar} 71802633b541b04ad5ffc1c70f4c2feeeb13e607057Daniel Dunbar 71902633b541b04ad5ffc1c70f4c2feeeb13e607057Daniel Dunbarvoid darwin::Link::AddLinkArgs(const ArgList &Args, 72002633b541b04ad5ffc1c70f4c2feeeb13e607057Daniel Dunbar ArgStringList &CmdArgs) const { 72102633b541b04ad5ffc1c70f4c2feeeb13e607057Daniel Dunbar const Driver &D = getToolChain().getHost().getDriver(); 72202633b541b04ad5ffc1c70f4c2feeeb13e607057Daniel Dunbar 72302633b541b04ad5ffc1c70f4c2feeeb13e607057Daniel Dunbar // Derived from the "link" spec. 72402633b541b04ad5ffc1c70f4c2feeeb13e607057Daniel Dunbar Args.AddAllArgs(CmdArgs, options::OPT_static); 72502633b541b04ad5ffc1c70f4c2feeeb13e607057Daniel Dunbar if (!Args.hasArg(options::OPT_static)) 72602633b541b04ad5ffc1c70f4c2feeeb13e607057Daniel Dunbar CmdArgs.push_back("-dynamic"); 72702633b541b04ad5ffc1c70f4c2feeeb13e607057Daniel Dunbar if (Args.hasArg(options::OPT_fgnu_runtime)) { 72802633b541b04ad5ffc1c70f4c2feeeb13e607057Daniel Dunbar // FIXME: gcc replaces -lobjc in forward args with -lobjc-gnu 72902633b541b04ad5ffc1c70f4c2feeeb13e607057Daniel Dunbar // here. How do we wish to handle such things? 73002633b541b04ad5ffc1c70f4c2feeeb13e607057Daniel Dunbar } 73102633b541b04ad5ffc1c70f4c2feeeb13e607057Daniel Dunbar 73202633b541b04ad5ffc1c70f4c2feeeb13e607057Daniel Dunbar if (!Args.hasArg(options::OPT_dynamiclib)) { 73302633b541b04ad5ffc1c70f4c2feeeb13e607057Daniel Dunbar if (Args.hasArg(options::OPT_force__cpusubtype__ALL)) { 73402633b541b04ad5ffc1c70f4c2feeeb13e607057Daniel Dunbar AddDarwinArch(Args, CmdArgs); 73502633b541b04ad5ffc1c70f4c2feeeb13e607057Daniel Dunbar CmdArgs.push_back("-force_cpusubtype_ALL"); 73602633b541b04ad5ffc1c70f4c2feeeb13e607057Daniel Dunbar } else 73702633b541b04ad5ffc1c70f4c2feeeb13e607057Daniel Dunbar AddDarwinSubArch(Args, CmdArgs); 73802633b541b04ad5ffc1c70f4c2feeeb13e607057Daniel Dunbar 73902633b541b04ad5ffc1c70f4c2feeeb13e607057Daniel Dunbar Args.AddLastArg(CmdArgs, options::OPT_bundle); 74002633b541b04ad5ffc1c70f4c2feeeb13e607057Daniel Dunbar Args.AddAllArgs(CmdArgs, options::OPT_bundle__loader); 74102633b541b04ad5ffc1c70f4c2feeeb13e607057Daniel Dunbar Args.AddAllArgs(CmdArgs, options::OPT_client__name); 74202633b541b04ad5ffc1c70f4c2feeeb13e607057Daniel Dunbar 74302633b541b04ad5ffc1c70f4c2feeeb13e607057Daniel Dunbar Arg *A; 74402633b541b04ad5ffc1c70f4c2feeeb13e607057Daniel Dunbar if ((A = Args.getLastArg(options::OPT_compatibility__version)) || 74502633b541b04ad5ffc1c70f4c2feeeb13e607057Daniel Dunbar (A = Args.getLastArg(options::OPT_current__version)) || 74602633b541b04ad5ffc1c70f4c2feeeb13e607057Daniel Dunbar (A = Args.getLastArg(options::OPT_install__name))) 74702633b541b04ad5ffc1c70f4c2feeeb13e607057Daniel Dunbar D.Diag(clang::diag::err_drv_argument_only_allowed_with) 74802633b541b04ad5ffc1c70f4c2feeeb13e607057Daniel Dunbar << A->getAsString(Args) << "-dynamiclib"; 74902633b541b04ad5ffc1c70f4c2feeeb13e607057Daniel Dunbar 75002633b541b04ad5ffc1c70f4c2feeeb13e607057Daniel Dunbar Args.AddLastArg(CmdArgs, options::OPT_force__flat__namespace); 75102633b541b04ad5ffc1c70f4c2feeeb13e607057Daniel Dunbar Args.AddLastArg(CmdArgs, options::OPT_keep__private__externs); 75202633b541b04ad5ffc1c70f4c2feeeb13e607057Daniel Dunbar Args.AddLastArg(CmdArgs, options::OPT_private__bundle); 75302633b541b04ad5ffc1c70f4c2feeeb13e607057Daniel Dunbar } else { 75402633b541b04ad5ffc1c70f4c2feeeb13e607057Daniel Dunbar CmdArgs.push_back("-dylib"); 75502633b541b04ad5ffc1c70f4c2feeeb13e607057Daniel Dunbar 75602633b541b04ad5ffc1c70f4c2feeeb13e607057Daniel Dunbar Arg *A; 75702633b541b04ad5ffc1c70f4c2feeeb13e607057Daniel Dunbar if ((A = Args.getLastArg(options::OPT_bundle)) || 75802633b541b04ad5ffc1c70f4c2feeeb13e607057Daniel Dunbar (A = Args.getLastArg(options::OPT_bundle__loader)) || 75902633b541b04ad5ffc1c70f4c2feeeb13e607057Daniel Dunbar (A = Args.getLastArg(options::OPT_client__name)) || 76002633b541b04ad5ffc1c70f4c2feeeb13e607057Daniel Dunbar (A = Args.getLastArg(options::OPT_force__flat__namespace)) || 76102633b541b04ad5ffc1c70f4c2feeeb13e607057Daniel Dunbar (A = Args.getLastArg(options::OPT_keep__private__externs)) || 76202633b541b04ad5ffc1c70f4c2feeeb13e607057Daniel Dunbar (A = Args.getLastArg(options::OPT_private__bundle))) 76302633b541b04ad5ffc1c70f4c2feeeb13e607057Daniel Dunbar D.Diag(clang::diag::err_drv_argument_not_allowed_with) 76402633b541b04ad5ffc1c70f4c2feeeb13e607057Daniel Dunbar << A->getAsString(Args) << "-dynamiclib"; 76502633b541b04ad5ffc1c70f4c2feeeb13e607057Daniel Dunbar 76602633b541b04ad5ffc1c70f4c2feeeb13e607057Daniel Dunbar Args.AddAllArgsTranslated(CmdArgs, options::OPT_compatibility__version, 76702633b541b04ad5ffc1c70f4c2feeeb13e607057Daniel Dunbar "-dylib_compatibility_version"); 76802633b541b04ad5ffc1c70f4c2feeeb13e607057Daniel Dunbar Args.AddAllArgsTranslated(CmdArgs, options::OPT_current__version, 76902633b541b04ad5ffc1c70f4c2feeeb13e607057Daniel Dunbar "-dylib_current_version"); 77002633b541b04ad5ffc1c70f4c2feeeb13e607057Daniel Dunbar 77102633b541b04ad5ffc1c70f4c2feeeb13e607057Daniel Dunbar if (Args.hasArg(options::OPT_force__cpusubtype__ALL)) { 77202633b541b04ad5ffc1c70f4c2feeeb13e607057Daniel Dunbar AddDarwinArch(Args, CmdArgs); 77302633b541b04ad5ffc1c70f4c2feeeb13e607057Daniel Dunbar // NOTE: We don't add -force_cpusubtype_ALL on this path. Ok. 77402633b541b04ad5ffc1c70f4c2feeeb13e607057Daniel Dunbar } else 77502633b541b04ad5ffc1c70f4c2feeeb13e607057Daniel Dunbar AddDarwinSubArch(Args, CmdArgs); 77602633b541b04ad5ffc1c70f4c2feeeb13e607057Daniel Dunbar 77702633b541b04ad5ffc1c70f4c2feeeb13e607057Daniel Dunbar Args.AddAllArgsTranslated(CmdArgs, options::OPT_install__name, 77802633b541b04ad5ffc1c70f4c2feeeb13e607057Daniel Dunbar "-dylib_install_name"); 77902633b541b04ad5ffc1c70f4c2feeeb13e607057Daniel Dunbar } 78002633b541b04ad5ffc1c70f4c2feeeb13e607057Daniel Dunbar 78102633b541b04ad5ffc1c70f4c2feeeb13e607057Daniel Dunbar Args.AddLastArg(CmdArgs, options::OPT_all__load); 78202633b541b04ad5ffc1c70f4c2feeeb13e607057Daniel Dunbar Args.AddAllArgs(CmdArgs, options::OPT_allowable__client); 78302633b541b04ad5ffc1c70f4c2feeeb13e607057Daniel Dunbar Args.AddLastArg(CmdArgs, options::OPT_bind__at__load); 78402633b541b04ad5ffc1c70f4c2feeeb13e607057Daniel Dunbar Args.AddLastArg(CmdArgs, options::OPT_dead__strip); 78502633b541b04ad5ffc1c70f4c2feeeb13e607057Daniel Dunbar Args.AddLastArg(CmdArgs, options::OPT_no__dead__strip__inits__and__terms); 78602633b541b04ad5ffc1c70f4c2feeeb13e607057Daniel Dunbar Args.AddAllArgs(CmdArgs, options::OPT_dylib__file); 78702633b541b04ad5ffc1c70f4c2feeeb13e607057Daniel Dunbar Args.AddLastArg(CmdArgs, options::OPT_dynamic); 78802633b541b04ad5ffc1c70f4c2feeeb13e607057Daniel Dunbar Args.AddAllArgs(CmdArgs, options::OPT_exported__symbols__list); 78902633b541b04ad5ffc1c70f4c2feeeb13e607057Daniel Dunbar Args.AddLastArg(CmdArgs, options::OPT_flat__namespace); 79002633b541b04ad5ffc1c70f4c2feeeb13e607057Daniel Dunbar Args.AddAllArgs(CmdArgs, options::OPT_headerpad__max__install__names); 79102633b541b04ad5ffc1c70f4c2feeeb13e607057Daniel Dunbar Args.AddAllArgs(CmdArgs, options::OPT_image__base); 79202633b541b04ad5ffc1c70f4c2feeeb13e607057Daniel Dunbar Args.AddAllArgs(CmdArgs, options::OPT_init); 79302633b541b04ad5ffc1c70f4c2feeeb13e607057Daniel Dunbar 79402633b541b04ad5ffc1c70f4c2feeeb13e607057Daniel Dunbar if (!Args.hasArg(options::OPT_mmacosx_version_min_EQ)) { 79502633b541b04ad5ffc1c70f4c2feeeb13e607057Daniel Dunbar if (!Args.hasArg(options::OPT_miphoneos_version_min_EQ)) { 79602633b541b04ad5ffc1c70f4c2feeeb13e607057Daniel Dunbar // FIXME: I don't understand what is going on here. This is 79702633b541b04ad5ffc1c70f4c2feeeb13e607057Daniel Dunbar // supposed to come from darwin_ld_minversion, but gcc doesn't 79802633b541b04ad5ffc1c70f4c2feeeb13e607057Daniel Dunbar // seem to be following that; it must be getting overridden 79902633b541b04ad5ffc1c70f4c2feeeb13e607057Daniel Dunbar // somewhere. 80002633b541b04ad5ffc1c70f4c2feeeb13e607057Daniel Dunbar CmdArgs.push_back("-macosx_version_min"); 80102633b541b04ad5ffc1c70f4c2feeeb13e607057Daniel Dunbar CmdArgs.push_back(getDarwinToolChain().getMacosxVersionStr()); 80202633b541b04ad5ffc1c70f4c2feeeb13e607057Daniel Dunbar } 80302633b541b04ad5ffc1c70f4c2feeeb13e607057Daniel Dunbar } else { 80402633b541b04ad5ffc1c70f4c2feeeb13e607057Daniel Dunbar // Adding all arguments doesn't make sense here but this is what 80502633b541b04ad5ffc1c70f4c2feeeb13e607057Daniel Dunbar // gcc does. 80602633b541b04ad5ffc1c70f4c2feeeb13e607057Daniel Dunbar Args.AddAllArgsTranslated(CmdArgs, options::OPT_mmacosx_version_min_EQ, 80702633b541b04ad5ffc1c70f4c2feeeb13e607057Daniel Dunbar "-macosx_version_min"); 80802633b541b04ad5ffc1c70f4c2feeeb13e607057Daniel Dunbar } 80902633b541b04ad5ffc1c70f4c2feeeb13e607057Daniel Dunbar 81002633b541b04ad5ffc1c70f4c2feeeb13e607057Daniel Dunbar Args.AddAllArgsTranslated(CmdArgs, options::OPT_miphoneos_version_min_EQ, 81102633b541b04ad5ffc1c70f4c2feeeb13e607057Daniel Dunbar "-iphoneos_version_min"); 81202633b541b04ad5ffc1c70f4c2feeeb13e607057Daniel Dunbar Args.AddLastArg(CmdArgs, options::OPT_nomultidefs); 81302633b541b04ad5ffc1c70f4c2feeeb13e607057Daniel Dunbar Args.AddLastArg(CmdArgs, options::OPT_multi__module); 81402633b541b04ad5ffc1c70f4c2feeeb13e607057Daniel Dunbar Args.AddLastArg(CmdArgs, options::OPT_single__module); 81502633b541b04ad5ffc1c70f4c2feeeb13e607057Daniel Dunbar Args.AddAllArgs(CmdArgs, options::OPT_multiply__defined); 81602633b541b04ad5ffc1c70f4c2feeeb13e607057Daniel Dunbar Args.AddAllArgs(CmdArgs, options::OPT_multiply__defined__unused); 81702633b541b04ad5ffc1c70f4c2feeeb13e607057Daniel Dunbar 81802633b541b04ad5ffc1c70f4c2feeeb13e607057Daniel Dunbar if (Args.hasArg(options::OPT_fpie)) 81902633b541b04ad5ffc1c70f4c2feeeb13e607057Daniel Dunbar CmdArgs.push_back("-pie"); 82002633b541b04ad5ffc1c70f4c2feeeb13e607057Daniel Dunbar 82102633b541b04ad5ffc1c70f4c2feeeb13e607057Daniel Dunbar Args.AddLastArg(CmdArgs, options::OPT_prebind); 82202633b541b04ad5ffc1c70f4c2feeeb13e607057Daniel Dunbar Args.AddLastArg(CmdArgs, options::OPT_noprebind); 82302633b541b04ad5ffc1c70f4c2feeeb13e607057Daniel Dunbar Args.AddLastArg(CmdArgs, options::OPT_nofixprebinding); 82402633b541b04ad5ffc1c70f4c2feeeb13e607057Daniel Dunbar Args.AddLastArg(CmdArgs, options::OPT_prebind__all__twolevel__modules); 82502633b541b04ad5ffc1c70f4c2feeeb13e607057Daniel Dunbar Args.AddLastArg(CmdArgs, options::OPT_read__only__relocs); 82602633b541b04ad5ffc1c70f4c2feeeb13e607057Daniel Dunbar Args.AddAllArgs(CmdArgs, options::OPT_sectcreate); 82702633b541b04ad5ffc1c70f4c2feeeb13e607057Daniel Dunbar Args.AddAllArgs(CmdArgs, options::OPT_sectorder); 82802633b541b04ad5ffc1c70f4c2feeeb13e607057Daniel Dunbar Args.AddAllArgs(CmdArgs, options::OPT_seg1addr); 82902633b541b04ad5ffc1c70f4c2feeeb13e607057Daniel Dunbar Args.AddAllArgs(CmdArgs, options::OPT_segprot); 83002633b541b04ad5ffc1c70f4c2feeeb13e607057Daniel Dunbar Args.AddAllArgs(CmdArgs, options::OPT_segaddr); 83102633b541b04ad5ffc1c70f4c2feeeb13e607057Daniel Dunbar Args.AddAllArgs(CmdArgs, options::OPT_segs__read__only__addr); 83202633b541b04ad5ffc1c70f4c2feeeb13e607057Daniel Dunbar Args.AddAllArgs(CmdArgs, options::OPT_segs__read__write__addr); 83302633b541b04ad5ffc1c70f4c2feeeb13e607057Daniel Dunbar Args.AddAllArgs(CmdArgs, options::OPT_seg__addr__table); 83402633b541b04ad5ffc1c70f4c2feeeb13e607057Daniel Dunbar Args.AddAllArgs(CmdArgs, options::OPT_seg__addr__table__filename); 83502633b541b04ad5ffc1c70f4c2feeeb13e607057Daniel Dunbar Args.AddAllArgs(CmdArgs, options::OPT_sub__library); 83602633b541b04ad5ffc1c70f4c2feeeb13e607057Daniel Dunbar Args.AddAllArgs(CmdArgs, options::OPT_sub__umbrella); 83702633b541b04ad5ffc1c70f4c2feeeb13e607057Daniel Dunbar Args.AddAllArgsTranslated(CmdArgs, options::OPT_isysroot, "-syslibroot"); 83802633b541b04ad5ffc1c70f4c2feeeb13e607057Daniel Dunbar Args.AddLastArg(CmdArgs, options::OPT_twolevel__namespace); 83902633b541b04ad5ffc1c70f4c2feeeb13e607057Daniel Dunbar Args.AddLastArg(CmdArgs, options::OPT_twolevel__namespace__hints); 84002633b541b04ad5ffc1c70f4c2feeeb13e607057Daniel Dunbar Args.AddAllArgs(CmdArgs, options::OPT_umbrella); 84102633b541b04ad5ffc1c70f4c2feeeb13e607057Daniel Dunbar Args.AddAllArgs(CmdArgs, options::OPT_undefined); 84202633b541b04ad5ffc1c70f4c2feeeb13e607057Daniel Dunbar Args.AddAllArgs(CmdArgs, options::OPT_unexported__symbols__list); 84302633b541b04ad5ffc1c70f4c2feeeb13e607057Daniel Dunbar Args.AddAllArgs(CmdArgs, options::OPT_weak__reference__mismatches); 84402633b541b04ad5ffc1c70f4c2feeeb13e607057Daniel Dunbar 84502633b541b04ad5ffc1c70f4c2feeeb13e607057Daniel Dunbar if (!Args.hasArg(options::OPT_weak__reference__mismatches)) { 84602633b541b04ad5ffc1c70f4c2feeeb13e607057Daniel Dunbar CmdArgs.push_back("-weak_reference_mismatches"); 84702633b541b04ad5ffc1c70f4c2feeeb13e607057Daniel Dunbar CmdArgs.push_back("non-weak"); 84802633b541b04ad5ffc1c70f4c2feeeb13e607057Daniel Dunbar } 84902633b541b04ad5ffc1c70f4c2feeeb13e607057Daniel Dunbar 85002633b541b04ad5ffc1c70f4c2feeeb13e607057Daniel Dunbar Args.AddLastArg(CmdArgs, options::OPT_X_Flag); 85102633b541b04ad5ffc1c70f4c2feeeb13e607057Daniel Dunbar Args.AddAllArgs(CmdArgs, options::OPT_y); 85202633b541b04ad5ffc1c70f4c2feeeb13e607057Daniel Dunbar Args.AddLastArg(CmdArgs, options::OPT_w); 85302633b541b04ad5ffc1c70f4c2feeeb13e607057Daniel Dunbar Args.AddAllArgs(CmdArgs, options::OPT_pagezero__size); 85402633b541b04ad5ffc1c70f4c2feeeb13e607057Daniel Dunbar Args.AddAllArgs(CmdArgs, options::OPT_segs__read__); 85502633b541b04ad5ffc1c70f4c2feeeb13e607057Daniel Dunbar Args.AddLastArg(CmdArgs, options::OPT_seglinkedit); 85602633b541b04ad5ffc1c70f4c2feeeb13e607057Daniel Dunbar Args.AddLastArg(CmdArgs, options::OPT_noseglinkedit); 85702633b541b04ad5ffc1c70f4c2feeeb13e607057Daniel Dunbar Args.AddAllArgs(CmdArgs, options::OPT_sectalign); 85802633b541b04ad5ffc1c70f4c2feeeb13e607057Daniel Dunbar Args.AddAllArgs(CmdArgs, options::OPT_sectobjectsymbols); 85902633b541b04ad5ffc1c70f4c2feeeb13e607057Daniel Dunbar Args.AddAllArgs(CmdArgs, options::OPT_segcreate); 86002633b541b04ad5ffc1c70f4c2feeeb13e607057Daniel Dunbar Args.AddLastArg(CmdArgs, options::OPT_whyload); 86102633b541b04ad5ffc1c70f4c2feeeb13e607057Daniel Dunbar Args.AddLastArg(CmdArgs, options::OPT_whatsloaded); 86202633b541b04ad5ffc1c70f4c2feeeb13e607057Daniel Dunbar Args.AddAllArgs(CmdArgs, options::OPT_dylinker__install__name); 86302633b541b04ad5ffc1c70f4c2feeeb13e607057Daniel Dunbar Args.AddLastArg(CmdArgs, options::OPT_dylinker); 86402633b541b04ad5ffc1c70f4c2feeeb13e607057Daniel Dunbar Args.AddLastArg(CmdArgs, options::OPT_Mach); 86502633b541b04ad5ffc1c70f4c2feeeb13e607057Daniel Dunbar} 86602633b541b04ad5ffc1c70f4c2feeeb13e607057Daniel Dunbar 86702633b541b04ad5ffc1c70f4c2feeeb13e607057Daniel Dunbarvoid darwin::Link::ConstructJob(Compilation &C, const JobAction &JA, 86802633b541b04ad5ffc1c70f4c2feeeb13e607057Daniel Dunbar Job &Dest, const InputInfo &Output, 86902633b541b04ad5ffc1c70f4c2feeeb13e607057Daniel Dunbar const InputInfoList &Inputs, 87002633b541b04ad5ffc1c70f4c2feeeb13e607057Daniel Dunbar const ArgList &Args, 87102633b541b04ad5ffc1c70f4c2feeeb13e607057Daniel Dunbar const char *LinkingOutput) const { 87202633b541b04ad5ffc1c70f4c2feeeb13e607057Daniel Dunbar assert(Output.getType() == types::TY_Image && "Invalid linker output type."); 87302633b541b04ad5ffc1c70f4c2feeeb13e607057Daniel Dunbar // The logic here is derived from gcc's behavior; most of which 87402633b541b04ad5ffc1c70f4c2feeeb13e607057Daniel Dunbar // comes from specs (starting with link_command). Consult gcc for 87502633b541b04ad5ffc1c70f4c2feeeb13e607057Daniel Dunbar // more information. 87602633b541b04ad5ffc1c70f4c2feeeb13e607057Daniel Dunbar 87702633b541b04ad5ffc1c70f4c2feeeb13e607057Daniel Dunbar // FIXME: The spec references -fdump= which seems to have 87802633b541b04ad5ffc1c70f4c2feeeb13e607057Daniel Dunbar // disappeared? 87902633b541b04ad5ffc1c70f4c2feeeb13e607057Daniel Dunbar 88002633b541b04ad5ffc1c70f4c2feeeb13e607057Daniel Dunbar ArgStringList CmdArgs; 88102633b541b04ad5ffc1c70f4c2feeeb13e607057Daniel Dunbar 88202633b541b04ad5ffc1c70f4c2feeeb13e607057Daniel Dunbar // I'm not sure why this particular decomposition exists in gcc, but 88302633b541b04ad5ffc1c70f4c2feeeb13e607057Daniel Dunbar // we follow suite for ease of comparison. 88402633b541b04ad5ffc1c70f4c2feeeb13e607057Daniel Dunbar AddLinkArgs(Args, CmdArgs); 88502633b541b04ad5ffc1c70f4c2feeeb13e607057Daniel Dunbar 88602633b541b04ad5ffc1c70f4c2feeeb13e607057Daniel Dunbar // FIXME: gcc has %{x} in here. How could this ever happen? Cruft? 88702633b541b04ad5ffc1c70f4c2feeeb13e607057Daniel Dunbar Args.AddAllArgs(CmdArgs, options::OPT_d_Flag); 88802633b541b04ad5ffc1c70f4c2feeeb13e607057Daniel Dunbar Args.AddAllArgs(CmdArgs, options::OPT_s); 88902633b541b04ad5ffc1c70f4c2feeeb13e607057Daniel Dunbar Args.AddAllArgs(CmdArgs, options::OPT_t); 89002633b541b04ad5ffc1c70f4c2feeeb13e607057Daniel Dunbar Args.AddAllArgs(CmdArgs, options::OPT_Z_Flag); 89102633b541b04ad5ffc1c70f4c2feeeb13e607057Daniel Dunbar Args.AddAllArgs(CmdArgs, options::OPT_u_Group); 89202633b541b04ad5ffc1c70f4c2feeeb13e607057Daniel Dunbar Args.AddAllArgs(CmdArgs, options::OPT_A); 89302633b541b04ad5ffc1c70f4c2feeeb13e607057Daniel Dunbar Args.AddLastArg(CmdArgs, options::OPT_e); 89402633b541b04ad5ffc1c70f4c2feeeb13e607057Daniel Dunbar Args.AddAllArgs(CmdArgs, options::OPT_m_Separate); 89502633b541b04ad5ffc1c70f4c2feeeb13e607057Daniel Dunbar Args.AddAllArgs(CmdArgs, options::OPT_r); 89602633b541b04ad5ffc1c70f4c2feeeb13e607057Daniel Dunbar 89702633b541b04ad5ffc1c70f4c2feeeb13e607057Daniel Dunbar // FIXME: This is just being pedantically bug compatible, gcc 89802633b541b04ad5ffc1c70f4c2feeeb13e607057Daniel Dunbar // doesn't *mean* to forward this, it just does (yay for pattern 89902633b541b04ad5ffc1c70f4c2feeeb13e607057Daniel Dunbar // matching). It doesn't work, of course. 90002633b541b04ad5ffc1c70f4c2feeeb13e607057Daniel Dunbar Args.AddAllArgs(CmdArgs, options::OPT_object); 90102633b541b04ad5ffc1c70f4c2feeeb13e607057Daniel Dunbar 90202633b541b04ad5ffc1c70f4c2feeeb13e607057Daniel Dunbar CmdArgs.push_back("-o"); 90302633b541b04ad5ffc1c70f4c2feeeb13e607057Daniel Dunbar CmdArgs.push_back(Output.getFilename()); 90402633b541b04ad5ffc1c70f4c2feeeb13e607057Daniel Dunbar 90502633b541b04ad5ffc1c70f4c2feeeb13e607057Daniel Dunbar unsigned MacosxVersion[3]; 90602633b541b04ad5ffc1c70f4c2feeeb13e607057Daniel Dunbar if (Arg *A = Args.getLastArg(options::OPT_mmacosx_version_min_EQ)) { 90702633b541b04ad5ffc1c70f4c2feeeb13e607057Daniel Dunbar bool HadExtra; 90802633b541b04ad5ffc1c70f4c2feeeb13e607057Daniel Dunbar if (!Driver::GetReleaseVersion(A->getValue(Args), MacosxVersion[0], 90902633b541b04ad5ffc1c70f4c2feeeb13e607057Daniel Dunbar MacosxVersion[1], MacosxVersion[2], 91002633b541b04ad5ffc1c70f4c2feeeb13e607057Daniel Dunbar HadExtra) || 91102633b541b04ad5ffc1c70f4c2feeeb13e607057Daniel Dunbar HadExtra) { 91202633b541b04ad5ffc1c70f4c2feeeb13e607057Daniel Dunbar const Driver &D = getToolChain().getHost().getDriver(); 91302633b541b04ad5ffc1c70f4c2feeeb13e607057Daniel Dunbar D.Diag(clang::diag::err_drv_invalid_version_number) 91402633b541b04ad5ffc1c70f4c2feeeb13e607057Daniel Dunbar << A->getAsString(Args); 91502633b541b04ad5ffc1c70f4c2feeeb13e607057Daniel Dunbar } 91602633b541b04ad5ffc1c70f4c2feeeb13e607057Daniel Dunbar } else { 91702633b541b04ad5ffc1c70f4c2feeeb13e607057Daniel Dunbar getDarwinToolChain().getMacosxVersion(MacosxVersion); 91802633b541b04ad5ffc1c70f4c2feeeb13e607057Daniel Dunbar } 91902633b541b04ad5ffc1c70f4c2feeeb13e607057Daniel Dunbar 92002633b541b04ad5ffc1c70f4c2feeeb13e607057Daniel Dunbar if (!Args.hasArg(options::OPT_A) && 92102633b541b04ad5ffc1c70f4c2feeeb13e607057Daniel Dunbar !Args.hasArg(options::OPT_nostdlib) && 92202633b541b04ad5ffc1c70f4c2feeeb13e607057Daniel Dunbar !Args.hasArg(options::OPT_nostartfiles)) { 92302633b541b04ad5ffc1c70f4c2feeeb13e607057Daniel Dunbar // Derived from startfile spec. 92402633b541b04ad5ffc1c70f4c2feeeb13e607057Daniel Dunbar if (Args.hasArg(options::OPT_dynamiclib)) { 92502633b541b04ad5ffc1c70f4c2feeeb13e607057Daniel Dunbar // Derived from darwin_dylib1 spec. 92602633b541b04ad5ffc1c70f4c2feeeb13e607057Daniel Dunbar if (Args.hasArg(options::OPT_miphoneos_version_min_EQ) || 92702633b541b04ad5ffc1c70f4c2feeeb13e607057Daniel Dunbar isMacosxVersionLT(MacosxVersion, 10, 5)) 92802633b541b04ad5ffc1c70f4c2feeeb13e607057Daniel Dunbar CmdArgs.push_back("-ldylib1.o"); 92902633b541b04ad5ffc1c70f4c2feeeb13e607057Daniel Dunbar else 93002633b541b04ad5ffc1c70f4c2feeeb13e607057Daniel Dunbar CmdArgs.push_back("-ldylib1.10.5.o"); 93102633b541b04ad5ffc1c70f4c2feeeb13e607057Daniel Dunbar } else { 93202633b541b04ad5ffc1c70f4c2feeeb13e607057Daniel Dunbar if (Args.hasArg(options::OPT_bundle)) { 93302633b541b04ad5ffc1c70f4c2feeeb13e607057Daniel Dunbar if (!Args.hasArg(options::OPT_static)) 93402633b541b04ad5ffc1c70f4c2feeeb13e607057Daniel Dunbar CmdArgs.push_back("-lbundle1.o"); 93502633b541b04ad5ffc1c70f4c2feeeb13e607057Daniel Dunbar } else { 93602633b541b04ad5ffc1c70f4c2feeeb13e607057Daniel Dunbar if (Args.hasArg(options::OPT_pg)) { 93702633b541b04ad5ffc1c70f4c2feeeb13e607057Daniel Dunbar if (Args.hasArg(options::OPT_static) || 93802633b541b04ad5ffc1c70f4c2feeeb13e607057Daniel Dunbar Args.hasArg(options::OPT_object) || 93902633b541b04ad5ffc1c70f4c2feeeb13e607057Daniel Dunbar Args.hasArg(options::OPT_preload)) { 94002633b541b04ad5ffc1c70f4c2feeeb13e607057Daniel Dunbar CmdArgs.push_back("-lgcrt0.o"); 94102633b541b04ad5ffc1c70f4c2feeeb13e607057Daniel Dunbar } else { 94202633b541b04ad5ffc1c70f4c2feeeb13e607057Daniel Dunbar CmdArgs.push_back("-lgcrt1.o"); 94302633b541b04ad5ffc1c70f4c2feeeb13e607057Daniel Dunbar 94402633b541b04ad5ffc1c70f4c2feeeb13e607057Daniel Dunbar // darwin_crt2 spec is empty. 94502633b541b04ad5ffc1c70f4c2feeeb13e607057Daniel Dunbar } 94602633b541b04ad5ffc1c70f4c2feeeb13e607057Daniel Dunbar } else { 94702633b541b04ad5ffc1c70f4c2feeeb13e607057Daniel Dunbar if (Args.hasArg(options::OPT_static) || 94802633b541b04ad5ffc1c70f4c2feeeb13e607057Daniel Dunbar Args.hasArg(options::OPT_object) || 94902633b541b04ad5ffc1c70f4c2feeeb13e607057Daniel Dunbar Args.hasArg(options::OPT_preload)) { 95002633b541b04ad5ffc1c70f4c2feeeb13e607057Daniel Dunbar CmdArgs.push_back("-lcrt0.o"); 95102633b541b04ad5ffc1c70f4c2feeeb13e607057Daniel Dunbar } else { 95202633b541b04ad5ffc1c70f4c2feeeb13e607057Daniel Dunbar // Derived from darwin_crt1 spec. 95302633b541b04ad5ffc1c70f4c2feeeb13e607057Daniel Dunbar if (Args.hasArg(options::OPT_miphoneos_version_min_EQ) || 95402633b541b04ad5ffc1c70f4c2feeeb13e607057Daniel Dunbar isMacosxVersionLT(MacosxVersion, 10, 5)) { 95502633b541b04ad5ffc1c70f4c2feeeb13e607057Daniel Dunbar CmdArgs.push_back("-lcrt1.o"); 95602633b541b04ad5ffc1c70f4c2feeeb13e607057Daniel Dunbar } else { 95702633b541b04ad5ffc1c70f4c2feeeb13e607057Daniel Dunbar CmdArgs.push_back("-lcrt1.10.5.o"); 95802633b541b04ad5ffc1c70f4c2feeeb13e607057Daniel Dunbar 95902633b541b04ad5ffc1c70f4c2feeeb13e607057Daniel Dunbar // darwin_crt2 spec is empty. 96002633b541b04ad5ffc1c70f4c2feeeb13e607057Daniel Dunbar } 96102633b541b04ad5ffc1c70f4c2feeeb13e607057Daniel Dunbar } 96202633b541b04ad5ffc1c70f4c2feeeb13e607057Daniel Dunbar } 96302633b541b04ad5ffc1c70f4c2feeeb13e607057Daniel Dunbar } 96402633b541b04ad5ffc1c70f4c2feeeb13e607057Daniel Dunbar } 96502633b541b04ad5ffc1c70f4c2feeeb13e607057Daniel Dunbar 96602633b541b04ad5ffc1c70f4c2feeeb13e607057Daniel Dunbar if (Args.hasArg(options::OPT_shared_libgcc) && 96702633b541b04ad5ffc1c70f4c2feeeb13e607057Daniel Dunbar !Args.hasArg(options::OPT_miphoneos_version_min_EQ) && 96802633b541b04ad5ffc1c70f4c2feeeb13e607057Daniel Dunbar isMacosxVersionLT(MacosxVersion, 10, 5)) { 96902633b541b04ad5ffc1c70f4c2feeeb13e607057Daniel Dunbar const char *Str = getToolChain().GetFilePath(C, "crt3.o").c_str(); 97002633b541b04ad5ffc1c70f4c2feeeb13e607057Daniel Dunbar CmdArgs.push_back(Args.MakeArgString(Str)); 97102633b541b04ad5ffc1c70f4c2feeeb13e607057Daniel Dunbar } 97202633b541b04ad5ffc1c70f4c2feeeb13e607057Daniel Dunbar } 97302633b541b04ad5ffc1c70f4c2feeeb13e607057Daniel Dunbar 97402633b541b04ad5ffc1c70f4c2feeeb13e607057Daniel Dunbar Args.AddAllArgs(CmdArgs, options::OPT_L); 97502633b541b04ad5ffc1c70f4c2feeeb13e607057Daniel Dunbar 97602633b541b04ad5ffc1c70f4c2feeeb13e607057Daniel Dunbar if (Args.hasArg(options::OPT_fopenmp)) 97702633b541b04ad5ffc1c70f4c2feeeb13e607057Daniel Dunbar // This is more complicated in gcc... 97802633b541b04ad5ffc1c70f4c2feeeb13e607057Daniel Dunbar CmdArgs.push_back("-lgomp"); 97902633b541b04ad5ffc1c70f4c2feeeb13e607057Daniel Dunbar 98002633b541b04ad5ffc1c70f4c2feeeb13e607057Daniel Dunbar // FIXME: Derive these correctly. 98102633b541b04ad5ffc1c70f4c2feeeb13e607057Daniel Dunbar const char *TCDir = getDarwinToolChain().getToolChainDir().c_str(); 98202633b541b04ad5ffc1c70f4c2feeeb13e607057Daniel Dunbar if (getToolChain().getArchName() == "x86_64") { 98302633b541b04ad5ffc1c70f4c2feeeb13e607057Daniel Dunbar CmdArgs.push_back(MakeFormattedString(Args, 98402633b541b04ad5ffc1c70f4c2feeeb13e607057Daniel Dunbar llvm::format("-L/usr/lib/gcc/%s/x86_64", TCDir))); 98502633b541b04ad5ffc1c70f4c2feeeb13e607057Daniel Dunbar // Intentionally duplicated for (temporary) gcc bug compatibility. 98602633b541b04ad5ffc1c70f4c2feeeb13e607057Daniel Dunbar CmdArgs.push_back(MakeFormattedString(Args, 98702633b541b04ad5ffc1c70f4c2feeeb13e607057Daniel Dunbar llvm::format("-L/usr/lib/gcc/%s/x86_64", TCDir))); 98802633b541b04ad5ffc1c70f4c2feeeb13e607057Daniel Dunbar } 98902633b541b04ad5ffc1c70f4c2feeeb13e607057Daniel Dunbar CmdArgs.push_back(MakeFormattedString(Args, 99002633b541b04ad5ffc1c70f4c2feeeb13e607057Daniel Dunbar llvm::format("-L/usr/lib/%s", TCDir))); 99102633b541b04ad5ffc1c70f4c2feeeb13e607057Daniel Dunbar CmdArgs.push_back(MakeFormattedString(Args, 99202633b541b04ad5ffc1c70f4c2feeeb13e607057Daniel Dunbar llvm::format("-L/usr/lib/gcc/%s", TCDir))); 99302633b541b04ad5ffc1c70f4c2feeeb13e607057Daniel Dunbar // Intentionally duplicated for (temporary) gcc bug compatibility. 99402633b541b04ad5ffc1c70f4c2feeeb13e607057Daniel Dunbar CmdArgs.push_back(MakeFormattedString(Args, 99502633b541b04ad5ffc1c70f4c2feeeb13e607057Daniel Dunbar llvm::format("-L/usr/lib/gcc/%s", TCDir))); 99602633b541b04ad5ffc1c70f4c2feeeb13e607057Daniel Dunbar CmdArgs.push_back(MakeFormattedString(Args, 99702633b541b04ad5ffc1c70f4c2feeeb13e607057Daniel Dunbar llvm::format("-L/usr/lib/gcc/%s/../../../%s", TCDir, TCDir))); 99802633b541b04ad5ffc1c70f4c2feeeb13e607057Daniel Dunbar CmdArgs.push_back(MakeFormattedString(Args, 99902633b541b04ad5ffc1c70f4c2feeeb13e607057Daniel Dunbar llvm::format("-L/usr/lib/gcc/%s/../../..", TCDir))); 100002633b541b04ad5ffc1c70f4c2feeeb13e607057Daniel Dunbar 100102633b541b04ad5ffc1c70f4c2feeeb13e607057Daniel Dunbar for (InputInfoList::const_iterator 100202633b541b04ad5ffc1c70f4c2feeeb13e607057Daniel Dunbar it = Inputs.begin(), ie = Inputs.end(); it != ie; ++it) { 100302633b541b04ad5ffc1c70f4c2feeeb13e607057Daniel Dunbar const InputInfo &II = *it; 100402633b541b04ad5ffc1c70f4c2feeeb13e607057Daniel Dunbar if (II.isFilename()) 100502633b541b04ad5ffc1c70f4c2feeeb13e607057Daniel Dunbar CmdArgs.push_back(II.getFilename()); 100602633b541b04ad5ffc1c70f4c2feeeb13e607057Daniel Dunbar else 100702633b541b04ad5ffc1c70f4c2feeeb13e607057Daniel Dunbar II.getInputArg().renderAsInput(Args, CmdArgs); 100802633b541b04ad5ffc1c70f4c2feeeb13e607057Daniel Dunbar } 100902633b541b04ad5ffc1c70f4c2feeeb13e607057Daniel Dunbar 101002633b541b04ad5ffc1c70f4c2feeeb13e607057Daniel Dunbar if (LinkingOutput) { 101102633b541b04ad5ffc1c70f4c2feeeb13e607057Daniel Dunbar CmdArgs.push_back("-arch_multiple"); 101202633b541b04ad5ffc1c70f4c2feeeb13e607057Daniel Dunbar CmdArgs.push_back("-final_output"); 101302633b541b04ad5ffc1c70f4c2feeeb13e607057Daniel Dunbar CmdArgs.push_back(LinkingOutput); 101402633b541b04ad5ffc1c70f4c2feeeb13e607057Daniel Dunbar } 101502633b541b04ad5ffc1c70f4c2feeeb13e607057Daniel Dunbar 101602633b541b04ad5ffc1c70f4c2feeeb13e607057Daniel Dunbar if (Args.hasArg(options::OPT_fprofile_arcs) || 101702633b541b04ad5ffc1c70f4c2feeeb13e607057Daniel Dunbar Args.hasArg(options::OPT_fprofile_generate) || 101802633b541b04ad5ffc1c70f4c2feeeb13e607057Daniel Dunbar Args.hasArg(options::OPT_fcreate_profile) || 101902633b541b04ad5ffc1c70f4c2feeeb13e607057Daniel Dunbar Args.hasArg(options::OPT_coverage)) 102002633b541b04ad5ffc1c70f4c2feeeb13e607057Daniel Dunbar CmdArgs.push_back("-lgcov"); 102102633b541b04ad5ffc1c70f4c2feeeb13e607057Daniel Dunbar 102202633b541b04ad5ffc1c70f4c2feeeb13e607057Daniel Dunbar if (Args.hasArg(options::OPT_fnested_functions)) 102302633b541b04ad5ffc1c70f4c2feeeb13e607057Daniel Dunbar CmdArgs.push_back("-allow_stack_execute"); 102402633b541b04ad5ffc1c70f4c2feeeb13e607057Daniel Dunbar 102502633b541b04ad5ffc1c70f4c2feeeb13e607057Daniel Dunbar if (!Args.hasArg(options::OPT_nostdlib) && 102602633b541b04ad5ffc1c70f4c2feeeb13e607057Daniel Dunbar !Args.hasArg(options::OPT_nodefaultlibs)) { 102702633b541b04ad5ffc1c70f4c2feeeb13e607057Daniel Dunbar // link_ssp spec is empty. 102802633b541b04ad5ffc1c70f4c2feeeb13e607057Daniel Dunbar 102902633b541b04ad5ffc1c70f4c2feeeb13e607057Daniel Dunbar // Derived from libgcc spec. 103002633b541b04ad5ffc1c70f4c2feeeb13e607057Daniel Dunbar if (Args.hasArg(options::OPT_static)) { 103102633b541b04ad5ffc1c70f4c2feeeb13e607057Daniel Dunbar CmdArgs.push_back("-lgcc_static"); 103202633b541b04ad5ffc1c70f4c2feeeb13e607057Daniel Dunbar } else if (Args.hasArg(options::OPT_static_libgcc)) { 103302633b541b04ad5ffc1c70f4c2feeeb13e607057Daniel Dunbar CmdArgs.push_back("-lgcc_eh"); 103402633b541b04ad5ffc1c70f4c2feeeb13e607057Daniel Dunbar CmdArgs.push_back("-lgcc"); 103502633b541b04ad5ffc1c70f4c2feeeb13e607057Daniel Dunbar } else if (Args.hasArg(options::OPT_miphoneos_version_min_EQ)) { 103602633b541b04ad5ffc1c70f4c2feeeb13e607057Daniel Dunbar // Derived from darwin_iphoneos_libgcc spec. 103702633b541b04ad5ffc1c70f4c2feeeb13e607057Daniel Dunbar CmdArgs.push_back("-lgcc_s.10.5"); 103802633b541b04ad5ffc1c70f4c2feeeb13e607057Daniel Dunbar CmdArgs.push_back("-lgcc"); 103902633b541b04ad5ffc1c70f4c2feeeb13e607057Daniel Dunbar } else if (Args.hasArg(options::OPT_shared_libgcc) || 104002633b541b04ad5ffc1c70f4c2feeeb13e607057Daniel Dunbar Args.hasArg(options::OPT_fexceptions) || 104102633b541b04ad5ffc1c70f4c2feeeb13e607057Daniel Dunbar Args.hasArg(options::OPT_fgnu_runtime)) { 104202633b541b04ad5ffc1c70f4c2feeeb13e607057Daniel Dunbar if (isMacosxVersionLT(MacosxVersion, 10, 5)) 104302633b541b04ad5ffc1c70f4c2feeeb13e607057Daniel Dunbar CmdArgs.push_back("-lgcc_s.10.4"); 104402633b541b04ad5ffc1c70f4c2feeeb13e607057Daniel Dunbar else 104502633b541b04ad5ffc1c70f4c2feeeb13e607057Daniel Dunbar CmdArgs.push_back("-lgcc_s.10.5"); 104602633b541b04ad5ffc1c70f4c2feeeb13e607057Daniel Dunbar CmdArgs.push_back("-lgcc"); 104702633b541b04ad5ffc1c70f4c2feeeb13e607057Daniel Dunbar } else { 104802633b541b04ad5ffc1c70f4c2feeeb13e607057Daniel Dunbar if (isMacosxVersionLT(MacosxVersion, 10, 5) && 104902633b541b04ad5ffc1c70f4c2feeeb13e607057Daniel Dunbar isMacosxVersionGTE(MacosxVersion, 10, 3, 9)) 105002633b541b04ad5ffc1c70f4c2feeeb13e607057Daniel Dunbar CmdArgs.push_back("-lgcc_s.10.4"); 105102633b541b04ad5ffc1c70f4c2feeeb13e607057Daniel Dunbar if (isMacosxVersionGTE(MacosxVersion, 10, 5)) 105202633b541b04ad5ffc1c70f4c2feeeb13e607057Daniel Dunbar CmdArgs.push_back("-lgcc_s.10.5"); 105302633b541b04ad5ffc1c70f4c2feeeb13e607057Daniel Dunbar CmdArgs.push_back("-lgcc"); 105402633b541b04ad5ffc1c70f4c2feeeb13e607057Daniel Dunbar } 105502633b541b04ad5ffc1c70f4c2feeeb13e607057Daniel Dunbar 105602633b541b04ad5ffc1c70f4c2feeeb13e607057Daniel Dunbar // Derived from lib spec. 105702633b541b04ad5ffc1c70f4c2feeeb13e607057Daniel Dunbar if (!Args.hasArg(options::OPT_static)) 105802633b541b04ad5ffc1c70f4c2feeeb13e607057Daniel Dunbar CmdArgs.push_back("-lSystem"); 105902633b541b04ad5ffc1c70f4c2feeeb13e607057Daniel Dunbar } 106002633b541b04ad5ffc1c70f4c2feeeb13e607057Daniel Dunbar 106102633b541b04ad5ffc1c70f4c2feeeb13e607057Daniel Dunbar if (!Args.hasArg(options::OPT_A) && 106202633b541b04ad5ffc1c70f4c2feeeb13e607057Daniel Dunbar !Args.hasArg(options::OPT_nostdlib) && 106302633b541b04ad5ffc1c70f4c2feeeb13e607057Daniel Dunbar !Args.hasArg(options::OPT_nostartfiles)) { 106402633b541b04ad5ffc1c70f4c2feeeb13e607057Daniel Dunbar // endfile_spec is empty. 106502633b541b04ad5ffc1c70f4c2feeeb13e607057Daniel Dunbar } 106602633b541b04ad5ffc1c70f4c2feeeb13e607057Daniel Dunbar 106702633b541b04ad5ffc1c70f4c2feeeb13e607057Daniel Dunbar Args.AddAllArgs(CmdArgs, options::OPT_T_Group); 106802633b541b04ad5ffc1c70f4c2feeeb13e607057Daniel Dunbar Args.AddAllArgs(CmdArgs, options::OPT_F); 106902633b541b04ad5ffc1c70f4c2feeeb13e607057Daniel Dunbar 107002633b541b04ad5ffc1c70f4c2feeeb13e607057Daniel Dunbar const char *Exec = 107102633b541b04ad5ffc1c70f4c2feeeb13e607057Daniel Dunbar Args.MakeArgString(getToolChain().GetProgramPath(C, "collect2").c_str()); 107202633b541b04ad5ffc1c70f4c2feeeb13e607057Daniel Dunbar Dest.addCommand(new Command(Exec, CmdArgs)); 107302633b541b04ad5ffc1c70f4c2feeeb13e607057Daniel Dunbar 107402633b541b04ad5ffc1c70f4c2feeeb13e607057Daniel Dunbar if (Args.getLastArg(options::OPT_g_Group) && 107502633b541b04ad5ffc1c70f4c2feeeb13e607057Daniel Dunbar !Args.getLastArg(options::OPT_gstabs) && 107602633b541b04ad5ffc1c70f4c2feeeb13e607057Daniel Dunbar !Args.getLastArg(options::OPT_g0)) { 107702633b541b04ad5ffc1c70f4c2feeeb13e607057Daniel Dunbar // FIXME: This is gross, but matches gcc. The test only considers 107802633b541b04ad5ffc1c70f4c2feeeb13e607057Daniel Dunbar // the suffix (not the -x type), and then only of the first 107902633b541b04ad5ffc1c70f4c2feeeb13e607057Daniel Dunbar // input. Awesome. 108002633b541b04ad5ffc1c70f4c2feeeb13e607057Daniel Dunbar const char *Suffix = strchr(Inputs[0].getBaseInput(), '.'); 108102633b541b04ad5ffc1c70f4c2feeeb13e607057Daniel Dunbar if (Suffix && isSourceSuffix(Suffix + 1)) { 108202633b541b04ad5ffc1c70f4c2feeeb13e607057Daniel Dunbar const char *Exec = 108302633b541b04ad5ffc1c70f4c2feeeb13e607057Daniel Dunbar Args.MakeArgString(getToolChain().GetProgramPath(C, "dsymutil").c_str()); 108402633b541b04ad5ffc1c70f4c2feeeb13e607057Daniel Dunbar ArgStringList CmdArgs; 108502633b541b04ad5ffc1c70f4c2feeeb13e607057Daniel Dunbar CmdArgs.push_back(Output.getFilename()); 108602633b541b04ad5ffc1c70f4c2feeeb13e607057Daniel Dunbar C.getJobs().addCommand(new Command(Exec, CmdArgs)); 108702633b541b04ad5ffc1c70f4c2feeeb13e607057Daniel Dunbar } 108802633b541b04ad5ffc1c70f4c2feeeb13e607057Daniel Dunbar } 108902633b541b04ad5ffc1c70f4c2feeeb13e607057Daniel Dunbar} 109002633b541b04ad5ffc1c70f4c2feeeb13e607057Daniel Dunbar 1091ff7488dc9a766f94daf54d81b03ab9160d0bfd88Daniel Dunbarvoid darwin::Lipo::ConstructJob(Compilation &C, const JobAction &JA, 10928cac5f7e1ce63dd77ee0fb4ef68f9fa804f41ea6Daniel Dunbar Job &Dest, const InputInfo &Output, 1093ff7488dc9a766f94daf54d81b03ab9160d0bfd88Daniel Dunbar const InputInfoList &Inputs, 1094ff7488dc9a766f94daf54d81b03ab9160d0bfd88Daniel Dunbar const ArgList &Args, 1095ff7488dc9a766f94daf54d81b03ab9160d0bfd88Daniel Dunbar const char *LinkingOutput) const { 1096ff7488dc9a766f94daf54d81b03ab9160d0bfd88Daniel Dunbar ArgStringList CmdArgs; 1097ff7488dc9a766f94daf54d81b03ab9160d0bfd88Daniel Dunbar 1098ff7488dc9a766f94daf54d81b03ab9160d0bfd88Daniel Dunbar CmdArgs.push_back("-create"); 1099ff7488dc9a766f94daf54d81b03ab9160d0bfd88Daniel Dunbar assert(Output.isFilename() && "Unexpected lipo output."); 1100a428df828ea4cc6916ea90dcd9fbbc840776d207Daniel Dunbar 1101a428df828ea4cc6916ea90dcd9fbbc840776d207Daniel Dunbar CmdArgs.push_back("-output"); 1102ff7488dc9a766f94daf54d81b03ab9160d0bfd88Daniel Dunbar CmdArgs.push_back(Output.getFilename()); 1103a428df828ea4cc6916ea90dcd9fbbc840776d207Daniel Dunbar 1104ff7488dc9a766f94daf54d81b03ab9160d0bfd88Daniel Dunbar for (InputInfoList::const_iterator 1105ff7488dc9a766f94daf54d81b03ab9160d0bfd88Daniel Dunbar it = Inputs.begin(), ie = Inputs.end(); it != ie; ++it) { 1106ff7488dc9a766f94daf54d81b03ab9160d0bfd88Daniel Dunbar const InputInfo &II = *it; 1107ff7488dc9a766f94daf54d81b03ab9160d0bfd88Daniel Dunbar assert(II.isFilename() && "Unexpected lipo input."); 1108ff7488dc9a766f94daf54d81b03ab9160d0bfd88Daniel Dunbar CmdArgs.push_back(II.getFilename()); 1109ff7488dc9a766f94daf54d81b03ab9160d0bfd88Daniel Dunbar } 1110ff7488dc9a766f94daf54d81b03ab9160d0bfd88Daniel Dunbar const char *Exec = 1111ff7488dc9a766f94daf54d81b03ab9160d0bfd88Daniel Dunbar Args.MakeArgString(getToolChain().GetProgramPath(C, "lipo").c_str()); 1112ff7488dc9a766f94daf54d81b03ab9160d0bfd88Daniel Dunbar Dest.addCommand(new Command(Exec, CmdArgs)); 1113ff7488dc9a766f94daf54d81b03ab9160d0bfd88Daniel Dunbar} 1114