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