Tools.cpp revision 035ff0c6746a2689667c83d4c02a47d5a7b71e82
1e3365aa452673f7ea3244bb6638551f13ab7570dNick Lewycky//===--- 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" 15ee848a73e5f8ffe7511af8652ba811c020d1c7a0Daniel Dunbar#include "clang/Driver/Driver.h" 16ee848a73e5f8ffe7511af8652ba811c020d1c7a0Daniel Dunbar#include "clang/Driver/DriverDiagnostic.h" 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" 21265e9ef9f3ef30a97790e6e7bbc3c17d97981ca7Daniel Dunbar#include "clang/Driver/Options.h" 22b488c1dac8e53206f07103d794a62a3f5012c0f4Daniel Dunbar#include "clang/Driver/ToolChain.h" 23871adcf4e41285e3f4c3b62eaa1b2e05b60b92daDaniel Dunbar#include "clang/Driver/Util.h" 24871adcf4e41285e3f4c3b62eaa1b2e05b60b92daDaniel Dunbar 25881376467c46c5c6cc16fa6790271c2c22e1d4f1Daniel Dunbar#include "llvm/ADT/SmallString.h" 2655d3f7ae512875a1d6402943c3a619633feb2a18Douglas Gregor#include "llvm/ADT/StringSwitch.h" 275b750fe6189a41937ff2b080a983c95ea273769fDaniel Dunbar#include "llvm/ADT/Twine.h" 2832bef4edba854303800b3b01cb49a282e5da4f69Michael J. Spencer#include "llvm/Support/FileSystem.h" 2902633b541b04ad5ffc1c70f4c2feeeb13e607057Daniel Dunbar#include "llvm/Support/Format.h" 3002633b541b04ad5ffc1c70f4c2feeeb13e607057Daniel Dunbar#include "llvm/Support/raw_ostream.h" 3103013fa9a0bf1ef4b907f5fec006c8f4000fdd21Michael J. Spencer#include "llvm/Support/Host.h" 3203013fa9a0bf1ef4b907f5fec006c8f4000fdd21Michael J. Spencer#include "llvm/Support/Process.h" 33871adcf4e41285e3f4c3b62eaa1b2e05b60b92daDaniel Dunbar 34871adcf4e41285e3f4c3b62eaa1b2e05b60b92daDaniel Dunbar#include "InputInfo.h" 3502633b541b04ad5ffc1c70f4c2feeeb13e607057Daniel Dunbar#include "ToolChains.h" 36871adcf4e41285e3f4c3b62eaa1b2e05b60b92daDaniel Dunbar 3747ac7d27c44bd64a7d0fc03d4babc196cf2b8230Daniel Dunbarusing namespace clang::driver; 3847ac7d27c44bd64a7d0fc03d4babc196cf2b8230Daniel Dunbarusing namespace clang::driver::tools; 3947ac7d27c44bd64a7d0fc03d4babc196cf2b8230Daniel Dunbar 4088a3d6cf5ebab81614f89ba48a8d89023270637aDaniel Dunbar/// CheckPreprocessingOptions - Perform some validation of preprocessing 4188a3d6cf5ebab81614f89ba48a8d89023270637aDaniel Dunbar/// arguments that is shared with gcc. 4288a3d6cf5ebab81614f89ba48a8d89023270637aDaniel Dunbarstatic void CheckPreprocessingOptions(const Driver &D, const ArgList &Args) { 4388a3d6cf5ebab81614f89ba48a8d89023270637aDaniel Dunbar if (Arg *A = Args.getLastArg(options::OPT_C, options::OPT_CC)) 4488a3d6cf5ebab81614f89ba48a8d89023270637aDaniel Dunbar if (!Args.hasArg(options::OPT_E)) 4588a3d6cf5ebab81614f89ba48a8d89023270637aDaniel Dunbar D.Diag(clang::diag::err_drv_argument_only_allowed_with) 4688a3d6cf5ebab81614f89ba48a8d89023270637aDaniel Dunbar << A->getAsString(Args) << "-E"; 4788a3d6cf5ebab81614f89ba48a8d89023270637aDaniel Dunbar} 4888a3d6cf5ebab81614f89ba48a8d89023270637aDaniel Dunbar 49e2fd66418eca3d70cf6b62087d745d0c5181db69Daniel Dunbar/// CheckCodeGenerationOptions - Perform some validation of code generation 50e2fd66418eca3d70cf6b62087d745d0c5181db69Daniel Dunbar/// arguments that is shared with gcc. 51e2fd66418eca3d70cf6b62087d745d0c5181db69Daniel Dunbarstatic void CheckCodeGenerationOptions(const Driver &D, const ArgList &Args) { 52e2fd66418eca3d70cf6b62087d745d0c5181db69Daniel Dunbar // In gcc, only ARM checks this, but it seems reasonable to check universally. 53e2fd66418eca3d70cf6b62087d745d0c5181db69Daniel Dunbar if (Args.hasArg(options::OPT_static)) 54e2fd66418eca3d70cf6b62087d745d0c5181db69Daniel Dunbar if (const Arg *A = Args.getLastArg(options::OPT_dynamic, 55e2fd66418eca3d70cf6b62087d745d0c5181db69Daniel Dunbar options::OPT_mdynamic_no_pic)) 56e2fd66418eca3d70cf6b62087d745d0c5181db69Daniel Dunbar D.Diag(clang::diag::err_drv_argument_not_allowed_with) 57e2fd66418eca3d70cf6b62087d745d0c5181db69Daniel Dunbar << A->getAsString(Args) << "-static"; 58e2fd66418eca3d70cf6b62087d745d0c5181db69Daniel Dunbar} 59e2fd66418eca3d70cf6b62087d745d0c5181db69Daniel Dunbar 603edbeb78fe5ea7fffea7a94575478cde19e830e0Chris Lattner// Quote target names for inclusion in GNU Make dependency files. 613edbeb78fe5ea7fffea7a94575478cde19e830e0Chris Lattner// Only the characters '$', '#', ' ', '\t' are quoted. 623edbeb78fe5ea7fffea7a94575478cde19e830e0Chris Lattnerstatic void QuoteTarget(llvm::StringRef Target, 633edbeb78fe5ea7fffea7a94575478cde19e830e0Chris Lattner llvm::SmallVectorImpl<char> &Res) { 643edbeb78fe5ea7fffea7a94575478cde19e830e0Chris Lattner for (unsigned i = 0, e = Target.size(); i != e; ++i) { 653edbeb78fe5ea7fffea7a94575478cde19e830e0Chris Lattner switch (Target[i]) { 663edbeb78fe5ea7fffea7a94575478cde19e830e0Chris Lattner case ' ': 673edbeb78fe5ea7fffea7a94575478cde19e830e0Chris Lattner case '\t': 683edbeb78fe5ea7fffea7a94575478cde19e830e0Chris Lattner // Escape the preceding backslashes 693edbeb78fe5ea7fffea7a94575478cde19e830e0Chris Lattner for (int j = i - 1; j >= 0 && Target[j] == '\\'; --j) 703edbeb78fe5ea7fffea7a94575478cde19e830e0Chris Lattner Res.push_back('\\'); 713edbeb78fe5ea7fffea7a94575478cde19e830e0Chris Lattner 723edbeb78fe5ea7fffea7a94575478cde19e830e0Chris Lattner // Escape the space/tab 733edbeb78fe5ea7fffea7a94575478cde19e830e0Chris Lattner Res.push_back('\\'); 743edbeb78fe5ea7fffea7a94575478cde19e830e0Chris Lattner break; 753edbeb78fe5ea7fffea7a94575478cde19e830e0Chris Lattner case '$': 763edbeb78fe5ea7fffea7a94575478cde19e830e0Chris Lattner Res.push_back('$'); 773edbeb78fe5ea7fffea7a94575478cde19e830e0Chris Lattner break; 783edbeb78fe5ea7fffea7a94575478cde19e830e0Chris Lattner case '#': 793edbeb78fe5ea7fffea7a94575478cde19e830e0Chris Lattner Res.push_back('\\'); 803edbeb78fe5ea7fffea7a94575478cde19e830e0Chris Lattner break; 813edbeb78fe5ea7fffea7a94575478cde19e830e0Chris Lattner default: 823edbeb78fe5ea7fffea7a94575478cde19e830e0Chris Lattner break; 833edbeb78fe5ea7fffea7a94575478cde19e830e0Chris Lattner } 843edbeb78fe5ea7fffea7a94575478cde19e830e0Chris Lattner 853edbeb78fe5ea7fffea7a94575478cde19e830e0Chris Lattner Res.push_back(Target[i]); 863edbeb78fe5ea7fffea7a94575478cde19e830e0Chris Lattner } 873edbeb78fe5ea7fffea7a94575478cde19e830e0Chris Lattner} 883edbeb78fe5ea7fffea7a94575478cde19e830e0Chris Lattner 892008feead855f08500fb01ff43ef5eebee05d1e5Daniel Dunbarstatic void AddLinkerInputs(const ToolChain &TC, 902008feead855f08500fb01ff43ef5eebee05d1e5Daniel Dunbar const InputInfoList &Inputs, const ArgList &Args, 912008feead855f08500fb01ff43ef5eebee05d1e5Daniel Dunbar ArgStringList &CmdArgs) { 922008feead855f08500fb01ff43ef5eebee05d1e5Daniel Dunbar const Driver &D = TC.getDriver(); 932008feead855f08500fb01ff43ef5eebee05d1e5Daniel Dunbar 948ac38d7b5d88d12f454a7cda1275bf429813151dDaniel Dunbar // Add extra linker input arguments which are not treated as inputs 958ac38d7b5d88d12f454a7cda1275bf429813151dDaniel Dunbar // (constructed via -Xarch_). 968ac38d7b5d88d12f454a7cda1275bf429813151dDaniel Dunbar Args.AddAllArgValues(CmdArgs, options::OPT_Zlinker_input); 978ac38d7b5d88d12f454a7cda1275bf429813151dDaniel Dunbar 982008feead855f08500fb01ff43ef5eebee05d1e5Daniel Dunbar for (InputInfoList::const_iterator 992008feead855f08500fb01ff43ef5eebee05d1e5Daniel Dunbar it = Inputs.begin(), ie = Inputs.end(); it != ie; ++it) { 1002008feead855f08500fb01ff43ef5eebee05d1e5Daniel Dunbar const InputInfo &II = *it; 1012008feead855f08500fb01ff43ef5eebee05d1e5Daniel Dunbar 1022008feead855f08500fb01ff43ef5eebee05d1e5Daniel Dunbar if (!TC.HasNativeLLVMSupport()) { 1032008feead855f08500fb01ff43ef5eebee05d1e5Daniel Dunbar // Don't try to pass LLVM inputs unless we have native support. 1042008feead855f08500fb01ff43ef5eebee05d1e5Daniel Dunbar if (II.getType() == types::TY_LLVM_IR || 1052008feead855f08500fb01ff43ef5eebee05d1e5Daniel Dunbar II.getType() == types::TY_LTO_IR || 1062008feead855f08500fb01ff43ef5eebee05d1e5Daniel Dunbar II.getType() == types::TY_LLVM_BC || 1072008feead855f08500fb01ff43ef5eebee05d1e5Daniel Dunbar II.getType() == types::TY_LTO_BC) 1082008feead855f08500fb01ff43ef5eebee05d1e5Daniel Dunbar D.Diag(clang::diag::err_drv_no_linker_llvm_support) 1092008feead855f08500fb01ff43ef5eebee05d1e5Daniel Dunbar << TC.getTripleString(); 1102008feead855f08500fb01ff43ef5eebee05d1e5Daniel Dunbar } 1112008feead855f08500fb01ff43ef5eebee05d1e5Daniel Dunbar 112e5a37f48388c7e4cc081f44d13a4910bfa56cd35Daniel Dunbar // Add filenames immediately. 113e5a37f48388c7e4cc081f44d13a4910bfa56cd35Daniel Dunbar if (II.isFilename()) { 1142008feead855f08500fb01ff43ef5eebee05d1e5Daniel Dunbar CmdArgs.push_back(II.getFilename()); 115e5a37f48388c7e4cc081f44d13a4910bfa56cd35Daniel Dunbar continue; 116e5a37f48388c7e4cc081f44d13a4910bfa56cd35Daniel Dunbar } 117e5a37f48388c7e4cc081f44d13a4910bfa56cd35Daniel Dunbar 118e5a37f48388c7e4cc081f44d13a4910bfa56cd35Daniel Dunbar // Otherwise, this is a linker input argument. 119e5a37f48388c7e4cc081f44d13a4910bfa56cd35Daniel Dunbar const Arg &A = II.getInputArg(); 120e5a37f48388c7e4cc081f44d13a4910bfa56cd35Daniel Dunbar 121e5a37f48388c7e4cc081f44d13a4910bfa56cd35Daniel Dunbar // Handle reserved library options. 122e5a37f48388c7e4cc081f44d13a4910bfa56cd35Daniel Dunbar if (A.getOption().matches(options::OPT_Z_reserved_lib_stdcxx)) { 123132e35d2f87895d20e7ea146c8c00404b80221a1Daniel Dunbar TC.AddCXXStdlibLibArgs(Args, CmdArgs); 1247433fedce98a58341d0f30c2e12e8d53f3bba575Shantonu Sen } else if (A.getOption().matches(options::OPT_Z_reserved_lib_cckext)) { 1257433fedce98a58341d0f30c2e12e8d53f3bba575Shantonu Sen TC.AddCCKextLibArgs(Args, CmdArgs); 126e5a37f48388c7e4cc081f44d13a4910bfa56cd35Daniel Dunbar } else 127e5a37f48388c7e4cc081f44d13a4910bfa56cd35Daniel Dunbar A.renderAsInput(Args, CmdArgs); 1282008feead855f08500fb01ff43ef5eebee05d1e5Daniel Dunbar } 1292008feead855f08500fb01ff43ef5eebee05d1e5Daniel Dunbar} 1302008feead855f08500fb01ff43ef5eebee05d1e5Daniel Dunbar 1311eb4433ac451dc16f4133a88af2d002ac26c58efMike Stumpvoid Clang::AddPreprocessingOptions(const Driver &D, 132df91ef3d6c55692a0236f67b6c6b134a3bf84098Douglas Gregor const ArgList &Args, 133c21c485b4fb58ef5d55cf3e523263dd824a2ace4Daniel Dunbar ArgStringList &CmdArgs, 134c21c485b4fb58ef5d55cf3e523263dd824a2ace4Daniel Dunbar const InputInfo &Output, 135c21c485b4fb58ef5d55cf3e523263dd824a2ace4Daniel Dunbar const InputInfoList &Inputs) const { 136c21c485b4fb58ef5d55cf3e523263dd824a2ace4Daniel Dunbar Arg *A; 1373a183d3d46426d8719031553131b8928f50aa606Daniel Dunbar 13888a3d6cf5ebab81614f89ba48a8d89023270637aDaniel Dunbar CheckPreprocessingOptions(D, Args); 13988a3d6cf5ebab81614f89ba48a8d89023270637aDaniel Dunbar 14088a3d6cf5ebab81614f89ba48a8d89023270637aDaniel Dunbar Args.AddLastArg(CmdArgs, options::OPT_C); 14188a3d6cf5ebab81614f89ba48a8d89023270637aDaniel Dunbar Args.AddLastArg(CmdArgs, options::OPT_CC); 1423a183d3d46426d8719031553131b8928f50aa606Daniel Dunbar 1433a183d3d46426d8719031553131b8928f50aa606Daniel Dunbar // Handle dependency file generation. 1449eb93b07ea913e7ad0bcd15bd3e3662e2760c323Daniel Dunbar if ((A = Args.getLastArg(options::OPT_M, options::OPT_MM)) || 145c21c485b4fb58ef5d55cf3e523263dd824a2ace4Daniel Dunbar (A = Args.getLastArg(options::OPT_MD)) || 146c21c485b4fb58ef5d55cf3e523263dd824a2ace4Daniel Dunbar (A = Args.getLastArg(options::OPT_MMD))) { 147c21c485b4fb58ef5d55cf3e523263dd824a2ace4Daniel Dunbar // Determine the output location. 148c21c485b4fb58ef5d55cf3e523263dd824a2ace4Daniel Dunbar const char *DepFile; 149c21c485b4fb58ef5d55cf3e523263dd824a2ace4Daniel Dunbar if (Output.getType() == types::TY_Dependencies) { 1507c1e46533cae07216e2a67d5636a5afb44253155Daniel Dunbar DepFile = Output.getFilename(); 151c21c485b4fb58ef5d55cf3e523263dd824a2ace4Daniel Dunbar } else if (Arg *MF = Args.getLastArg(options::OPT_MF)) { 152c21c485b4fb58ef5d55cf3e523263dd824a2ace4Daniel Dunbar DepFile = MF->getValue(Args); 153b827a0541b5fd095fcdb7ad0c3df93ca158c619aDaniel Dunbar } else if (A->getOption().matches(options::OPT_M) || 154b827a0541b5fd095fcdb7ad0c3df93ca158c619aDaniel Dunbar A->getOption().matches(options::OPT_MM)) { 155c21c485b4fb58ef5d55cf3e523263dd824a2ace4Daniel Dunbar DepFile = "-"; 156c21c485b4fb58ef5d55cf3e523263dd824a2ace4Daniel Dunbar } else { 157c21c485b4fb58ef5d55cf3e523263dd824a2ace4Daniel Dunbar DepFile = darwin::CC1::getDependencyFileName(Args, Inputs); 158c21c485b4fb58ef5d55cf3e523263dd824a2ace4Daniel Dunbar } 159c21c485b4fb58ef5d55cf3e523263dd824a2ace4Daniel Dunbar CmdArgs.push_back("-dependency-file"); 160c21c485b4fb58ef5d55cf3e523263dd824a2ace4Daniel Dunbar CmdArgs.push_back(DepFile); 161c21c485b4fb58ef5d55cf3e523263dd824a2ace4Daniel Dunbar 1623edbeb78fe5ea7fffea7a94575478cde19e830e0Chris Lattner // Add a default target if one wasn't specified. 163c21c485b4fb58ef5d55cf3e523263dd824a2ace4Daniel Dunbar if (!Args.hasArg(options::OPT_MT) && !Args.hasArg(options::OPT_MQ)) { 164c21c485b4fb58ef5d55cf3e523263dd824a2ace4Daniel Dunbar const char *DepTarget; 165c21c485b4fb58ef5d55cf3e523263dd824a2ace4Daniel Dunbar 166c21c485b4fb58ef5d55cf3e523263dd824a2ace4Daniel Dunbar // If user provided -o, that is the dependency target, except 167c21c485b4fb58ef5d55cf3e523263dd824a2ace4Daniel Dunbar // when we are only generating a dependency file. 168c21c485b4fb58ef5d55cf3e523263dd824a2ace4Daniel Dunbar Arg *OutputOpt = Args.getLastArg(options::OPT_o); 169c21c485b4fb58ef5d55cf3e523263dd824a2ace4Daniel Dunbar if (OutputOpt && Output.getType() != types::TY_Dependencies) { 170c21c485b4fb58ef5d55cf3e523263dd824a2ace4Daniel Dunbar DepTarget = OutputOpt->getValue(Args); 171c21c485b4fb58ef5d55cf3e523263dd824a2ace4Daniel Dunbar } else { 172c21c485b4fb58ef5d55cf3e523263dd824a2ace4Daniel Dunbar // Otherwise derive from the base input. 173c21c485b4fb58ef5d55cf3e523263dd824a2ace4Daniel Dunbar // 174c21c485b4fb58ef5d55cf3e523263dd824a2ace4Daniel Dunbar // FIXME: This should use the computed output file location. 175472ccff00cdbcd095c3ba933b9e3f202719f118fMichael J. Spencer llvm::SmallString<128> P(Inputs[0].getBaseInput()); 176472ccff00cdbcd095c3ba933b9e3f202719f118fMichael J. Spencer llvm::sys::path::replace_extension(P, "o"); 177472ccff00cdbcd095c3ba933b9e3f202719f118fMichael J. Spencer DepTarget = Args.MakeArgString(llvm::sys::path::filename(P)); 178c21c485b4fb58ef5d55cf3e523263dd824a2ace4Daniel Dunbar } 179c21c485b4fb58ef5d55cf3e523263dd824a2ace4Daniel Dunbar 180c21c485b4fb58ef5d55cf3e523263dd824a2ace4Daniel Dunbar CmdArgs.push_back("-MT"); 1813edbeb78fe5ea7fffea7a94575478cde19e830e0Chris Lattner llvm::SmallString<128> Quoted; 1823edbeb78fe5ea7fffea7a94575478cde19e830e0Chris Lattner QuoteTarget(DepTarget, Quoted); 1833edbeb78fe5ea7fffea7a94575478cde19e830e0Chris Lattner CmdArgs.push_back(Args.MakeArgString(Quoted)); 184c21c485b4fb58ef5d55cf3e523263dd824a2ace4Daniel Dunbar } 185c21c485b4fb58ef5d55cf3e523263dd824a2ace4Daniel Dunbar 186b827a0541b5fd095fcdb7ad0c3df93ca158c619aDaniel Dunbar if (A->getOption().matches(options::OPT_M) || 187b827a0541b5fd095fcdb7ad0c3df93ca158c619aDaniel Dunbar A->getOption().matches(options::OPT_MD)) 188c21c485b4fb58ef5d55cf3e523263dd824a2ace4Daniel Dunbar CmdArgs.push_back("-sys-header-deps"); 189c21c485b4fb58ef5d55cf3e523263dd824a2ace4Daniel Dunbar } 190c21c485b4fb58ef5d55cf3e523263dd824a2ace4Daniel Dunbar 191c21c485b4fb58ef5d55cf3e523263dd824a2ace4Daniel Dunbar Args.AddLastArg(CmdArgs, options::OPT_MP); 1923edbeb78fe5ea7fffea7a94575478cde19e830e0Chris Lattner 1933edbeb78fe5ea7fffea7a94575478cde19e830e0Chris Lattner // Convert all -MQ <target> args to -MT <quoted target> 1943edbeb78fe5ea7fffea7a94575478cde19e830e0Chris Lattner for (arg_iterator it = Args.filtered_begin(options::OPT_MT, 1953edbeb78fe5ea7fffea7a94575478cde19e830e0Chris Lattner options::OPT_MQ), 1963edbeb78fe5ea7fffea7a94575478cde19e830e0Chris Lattner ie = Args.filtered_end(); it != ie; ++it) { 1977e4953e5c60409007545288f14b430bd23d68570Daniel Dunbar const Arg *A = *it; 1987e4953e5c60409007545288f14b430bd23d68570Daniel Dunbar A->claim(); 1993edbeb78fe5ea7fffea7a94575478cde19e830e0Chris Lattner 2007e4953e5c60409007545288f14b430bd23d68570Daniel Dunbar if (A->getOption().matches(options::OPT_MQ)) { 2013edbeb78fe5ea7fffea7a94575478cde19e830e0Chris Lattner CmdArgs.push_back("-MT"); 2023edbeb78fe5ea7fffea7a94575478cde19e830e0Chris Lattner llvm::SmallString<128> Quoted; 2037e4953e5c60409007545288f14b430bd23d68570Daniel Dunbar QuoteTarget(A->getValue(Args), Quoted); 2043edbeb78fe5ea7fffea7a94575478cde19e830e0Chris Lattner CmdArgs.push_back(Args.MakeArgString(Quoted)); 2053edbeb78fe5ea7fffea7a94575478cde19e830e0Chris Lattner 2063edbeb78fe5ea7fffea7a94575478cde19e830e0Chris Lattner // -MT flag - no change 2073edbeb78fe5ea7fffea7a94575478cde19e830e0Chris Lattner } else { 2087e4953e5c60409007545288f14b430bd23d68570Daniel Dunbar A->render(Args, CmdArgs); 2093edbeb78fe5ea7fffea7a94575478cde19e830e0Chris Lattner } 2103edbeb78fe5ea7fffea7a94575478cde19e830e0Chris Lattner } 211c21c485b4fb58ef5d55cf3e523263dd824a2ace4Daniel Dunbar 212df91ef3d6c55692a0236f67b6c6b134a3bf84098Douglas Gregor // Add -i* options, and automatically translate to 213df91ef3d6c55692a0236f67b6c6b134a3bf84098Douglas Gregor // -include-pch/-include-pth for transparent PCH support. It's 214df91ef3d6c55692a0236f67b6c6b134a3bf84098Douglas Gregor // wonky, but we include looking for .gch so we can support seamless 215df91ef3d6c55692a0236f67b6c6b134a3bf84098Douglas Gregor // replacement into a build system already set up to be generating 216df91ef3d6c55692a0236f67b6c6b134a3bf84098Douglas Gregor // .gch files. 217990142a23e41392ef7c0f14db4c0fcac67311cdfArgyrios Kyrtzidis bool RenderedImplicitInclude = false; 218cdd9686b890ebdc10039ae256ef4c9dfb5ebacb7Daniel Dunbar for (arg_iterator it = Args.filtered_begin(options::OPT_clang_i_Group), 219cdd9686b890ebdc10039ae256ef4c9dfb5ebacb7Daniel Dunbar ie = Args.filtered_end(); it != ie; ++it) { 220cdd9686b890ebdc10039ae256ef4c9dfb5ebacb7Daniel Dunbar const Arg *A = it; 221c21c485b4fb58ef5d55cf3e523263dd824a2ace4Daniel Dunbar 222c21c485b4fb58ef5d55cf3e523263dd824a2ace4Daniel Dunbar if (A->getOption().matches(options::OPT_include)) { 223990142a23e41392ef7c0f14db4c0fcac67311cdfArgyrios Kyrtzidis bool IsFirstImplicitInclude = !RenderedImplicitInclude; 224990142a23e41392ef7c0f14db4c0fcac67311cdfArgyrios Kyrtzidis RenderedImplicitInclude = true; 225990142a23e41392ef7c0f14db4c0fcac67311cdfArgyrios Kyrtzidis 226e5c35377020d6c38d16434c9f373a5fa9bb4f2ebArgyrios Kyrtzidis // Use PCH if the user requested it. 2270ebd9321ba380471010341f24c874f46f56e7581Daniel Dunbar bool UsePCH = D.CCCUsePCH; 2280ebd9321ba380471010341f24c874f46f56e7581Daniel Dunbar 229c21c485b4fb58ef5d55cf3e523263dd824a2ace4Daniel Dunbar bool FoundPTH = false; 230df91ef3d6c55692a0236f67b6c6b134a3bf84098Douglas Gregor bool FoundPCH = false; 231c21c485b4fb58ef5d55cf3e523263dd824a2ace4Daniel Dunbar llvm::sys::Path P(A->getValue(Args)); 23232bef4edba854303800b3b01cb49a282e5da4f69Michael J. Spencer bool Exists; 2330ebd9321ba380471010341f24c874f46f56e7581Daniel Dunbar if (UsePCH) { 234df91ef3d6c55692a0236f67b6c6b134a3bf84098Douglas Gregor P.appendSuffix("pch"); 23532bef4edba854303800b3b01cb49a282e5da4f69Michael J. Spencer if (!llvm::sys::fs::exists(P.str(), Exists) && Exists) 236df91ef3d6c55692a0236f67b6c6b134a3bf84098Douglas Gregor FoundPCH = true; 2371eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump else 238df91ef3d6c55692a0236f67b6c6b134a3bf84098Douglas Gregor P.eraseSuffix(); 239df91ef3d6c55692a0236f67b6c6b134a3bf84098Douglas Gregor } 240df91ef3d6c55692a0236f67b6c6b134a3bf84098Douglas Gregor 241df91ef3d6c55692a0236f67b6c6b134a3bf84098Douglas Gregor if (!FoundPCH) { 242df91ef3d6c55692a0236f67b6c6b134a3bf84098Douglas Gregor P.appendSuffix("pth"); 24332bef4edba854303800b3b01cb49a282e5da4f69Michael J. Spencer if (!llvm::sys::fs::exists(P.str(), Exists) && Exists) 244c21c485b4fb58ef5d55cf3e523263dd824a2ace4Daniel Dunbar FoundPTH = true; 245df91ef3d6c55692a0236f67b6c6b134a3bf84098Douglas Gregor else 246df91ef3d6c55692a0236f67b6c6b134a3bf84098Douglas Gregor P.eraseSuffix(); 2471eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump } 2481eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump 249df91ef3d6c55692a0236f67b6c6b134a3bf84098Douglas Gregor if (!FoundPCH && !FoundPTH) { 250df91ef3d6c55692a0236f67b6c6b134a3bf84098Douglas Gregor P.appendSuffix("gch"); 25132bef4edba854303800b3b01cb49a282e5da4f69Michael J. Spencer if (!llvm::sys::fs::exists(P.str(), Exists) && Exists) { 2520ebd9321ba380471010341f24c874f46f56e7581Daniel Dunbar FoundPCH = UsePCH; 2530ebd9321ba380471010341f24c874f46f56e7581Daniel Dunbar FoundPTH = !UsePCH; 254df91ef3d6c55692a0236f67b6c6b134a3bf84098Douglas Gregor } 2551eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump else 256df91ef3d6c55692a0236f67b6c6b134a3bf84098Douglas Gregor P.eraseSuffix(); 257c21c485b4fb58ef5d55cf3e523263dd824a2ace4Daniel Dunbar } 258c21c485b4fb58ef5d55cf3e523263dd824a2ace4Daniel Dunbar 259df91ef3d6c55692a0236f67b6c6b134a3bf84098Douglas Gregor if (FoundPCH || FoundPTH) { 260990142a23e41392ef7c0f14db4c0fcac67311cdfArgyrios Kyrtzidis if (IsFirstImplicitInclude) { 261990142a23e41392ef7c0f14db4c0fcac67311cdfArgyrios Kyrtzidis A->claim(); 262990142a23e41392ef7c0f14db4c0fcac67311cdfArgyrios Kyrtzidis if (UsePCH) 263990142a23e41392ef7c0f14db4c0fcac67311cdfArgyrios Kyrtzidis CmdArgs.push_back("-include-pch"); 264990142a23e41392ef7c0f14db4c0fcac67311cdfArgyrios Kyrtzidis else 265990142a23e41392ef7c0f14db4c0fcac67311cdfArgyrios Kyrtzidis CmdArgs.push_back("-include-pth"); 266990142a23e41392ef7c0f14db4c0fcac67311cdfArgyrios Kyrtzidis CmdArgs.push_back(Args.MakeArgString(P.str())); 267990142a23e41392ef7c0f14db4c0fcac67311cdfArgyrios Kyrtzidis continue; 268990142a23e41392ef7c0f14db4c0fcac67311cdfArgyrios Kyrtzidis } else { 269990142a23e41392ef7c0f14db4c0fcac67311cdfArgyrios Kyrtzidis // Ignore the PCH if not first on command line and emit warning. 270990142a23e41392ef7c0f14db4c0fcac67311cdfArgyrios Kyrtzidis D.Diag(clang::diag::warn_drv_pch_not_first_include) 271990142a23e41392ef7c0f14db4c0fcac67311cdfArgyrios Kyrtzidis << P.str() << A->getAsString(Args); 272990142a23e41392ef7c0f14db4c0fcac67311cdfArgyrios Kyrtzidis } 273c21c485b4fb58ef5d55cf3e523263dd824a2ace4Daniel Dunbar } 274c21c485b4fb58ef5d55cf3e523263dd824a2ace4Daniel Dunbar } 275c21c485b4fb58ef5d55cf3e523263dd824a2ace4Daniel Dunbar 276c21c485b4fb58ef5d55cf3e523263dd824a2ace4Daniel Dunbar // Not translated, render as usual. 277c21c485b4fb58ef5d55cf3e523263dd824a2ace4Daniel Dunbar A->claim(); 278c21c485b4fb58ef5d55cf3e523263dd824a2ace4Daniel Dunbar A->render(Args, CmdArgs); 279c21c485b4fb58ef5d55cf3e523263dd824a2ace4Daniel Dunbar } 280c21c485b4fb58ef5d55cf3e523263dd824a2ace4Daniel Dunbar 281c21c485b4fb58ef5d55cf3e523263dd824a2ace4Daniel Dunbar Args.AddAllArgs(CmdArgs, options::OPT_D, options::OPT_U); 282c21c485b4fb58ef5d55cf3e523263dd824a2ace4Daniel Dunbar Args.AddAllArgs(CmdArgs, options::OPT_I_Group, options::OPT_F); 283c21c485b4fb58ef5d55cf3e523263dd824a2ace4Daniel Dunbar 284641b98b7b52e0067beaf3978f2a8721e5d16c111Daniel Dunbar // Add C++ include arguments, if needed. 285641b98b7b52e0067beaf3978f2a8721e5d16c111Daniel Dunbar types::ID InputType = Inputs[0].getType(); 286641b98b7b52e0067beaf3978f2a8721e5d16c111Daniel Dunbar if (types::isCXX(InputType)) 287641b98b7b52e0067beaf3978f2a8721e5d16c111Daniel Dunbar getToolChain().AddClangCXXStdlibIncludeArgs(Args, CmdArgs); 288641b98b7b52e0067beaf3978f2a8721e5d16c111Daniel Dunbar 289c21c485b4fb58ef5d55cf3e523263dd824a2ace4Daniel Dunbar // Add -Wp, and -Xassembler if using the preprocessor. 290c21c485b4fb58ef5d55cf3e523263dd824a2ace4Daniel Dunbar 291c21c485b4fb58ef5d55cf3e523263dd824a2ace4Daniel Dunbar // FIXME: There is a very unfortunate problem here, some troubled 292c21c485b4fb58ef5d55cf3e523263dd824a2ace4Daniel Dunbar // souls abuse -Wp, to pass preprocessor options in gcc syntax. To 293c21c485b4fb58ef5d55cf3e523263dd824a2ace4Daniel Dunbar // really support that we would have to parse and then translate 294c21c485b4fb58ef5d55cf3e523263dd824a2ace4Daniel Dunbar // those options. :( 295c21c485b4fb58ef5d55cf3e523263dd824a2ace4Daniel Dunbar Args.AddAllArgValues(CmdArgs, options::OPT_Wp_COMMA, 296c21c485b4fb58ef5d55cf3e523263dd824a2ace4Daniel Dunbar options::OPT_Xpreprocessor); 297607d7f6d8f21066cc48bbe2c51e6ca412a00943fDaniel Dunbar 298607d7f6d8f21066cc48bbe2c51e6ca412a00943fDaniel Dunbar // -I- is a deprecated GCC feature, reject it. 299607d7f6d8f21066cc48bbe2c51e6ca412a00943fDaniel Dunbar if (Arg *A = Args.getLastArg(options::OPT_I_)) 300607d7f6d8f21066cc48bbe2c51e6ca412a00943fDaniel Dunbar D.Diag(clang::diag::err_drv_I_dash_not_supported) << A->getAsString(Args); 301feee58ce268765742e41c473c8648607fd4831a7Chandler Carruth 302feee58ce268765742e41c473c8648607fd4831a7Chandler Carruth // If we have a --sysroot, and don't have an explicit -isysroot flag, add an 303feee58ce268765742e41c473c8648607fd4831a7Chandler Carruth // -isysroot to the CC1 invocation. 304feee58ce268765742e41c473c8648607fd4831a7Chandler Carruth if (Arg *A = Args.getLastArg(options::OPT__sysroot_EQ)) { 305feee58ce268765742e41c473c8648607fd4831a7Chandler Carruth if (!Args.hasArg(options::OPT_isysroot)) { 306feee58ce268765742e41c473c8648607fd4831a7Chandler Carruth CmdArgs.push_back("-isysroot"); 307feee58ce268765742e41c473c8648607fd4831a7Chandler Carruth CmdArgs.push_back(A->getValue(Args)); 308feee58ce268765742e41c473c8648607fd4831a7Chandler Carruth } 309feee58ce268765742e41c473c8648607fd4831a7Chandler Carruth } 310c21c485b4fb58ef5d55cf3e523263dd824a2ace4Daniel Dunbar} 311c21c485b4fb58ef5d55cf3e523263dd824a2ace4Daniel Dunbar 312728a512753d85a6ccaae34e81385c8665c2de0e1Daniel Dunbar/// getARMTargetCPU - Get the (LLVM) name of the ARM cpu we are targetting. 313728a512753d85a6ccaae34e81385c8665c2de0e1Daniel Dunbar// 314728a512753d85a6ccaae34e81385c8665c2de0e1Daniel Dunbar// FIXME: tblgen this. 315bcd6df662471e0ac2d3d85fdba09b1295c2fc468Rafael Espindolastatic const char *getARMTargetCPU(const ArgList &Args, 316bcd6df662471e0ac2d3d85fdba09b1295c2fc468Rafael Espindola const llvm::Triple &Triple) { 317728a512753d85a6ccaae34e81385c8665c2de0e1Daniel Dunbar // FIXME: Warn on inconsistent use of -mcpu and -march. 318b163ef7e7a5d904ef0962a7c38c460be083c4d63Daniel Dunbar 319b163ef7e7a5d904ef0962a7c38c460be083c4d63Daniel Dunbar // If we have -mcpu=, use that. 320b163ef7e7a5d904ef0962a7c38c460be083c4d63Daniel Dunbar if (Arg *A = Args.getLastArg(options::OPT_mcpu_EQ)) 321b163ef7e7a5d904ef0962a7c38c460be083c4d63Daniel Dunbar return A->getValue(Args); 322b163ef7e7a5d904ef0962a7c38c460be083c4d63Daniel Dunbar 323bcd6df662471e0ac2d3d85fdba09b1295c2fc468Rafael Espindola llvm::StringRef MArch; 324b163ef7e7a5d904ef0962a7c38c460be083c4d63Daniel Dunbar if (Arg *A = Args.getLastArg(options::OPT_march_EQ)) { 325bcd6df662471e0ac2d3d85fdba09b1295c2fc468Rafael Espindola // Otherwise, if we have -march= choose the base CPU for that arch. 326bcd6df662471e0ac2d3d85fdba09b1295c2fc468Rafael Espindola MArch = A->getValue(Args); 327bcd6df662471e0ac2d3d85fdba09b1295c2fc468Rafael Espindola } else { 328bcd6df662471e0ac2d3d85fdba09b1295c2fc468Rafael Espindola // Otherwise, use the Arch from the triple. 329bcd6df662471e0ac2d3d85fdba09b1295c2fc468Rafael Espindola MArch = Triple.getArchName(); 330b163ef7e7a5d904ef0962a7c38c460be083c4d63Daniel Dunbar } 331b163ef7e7a5d904ef0962a7c38c460be083c4d63Daniel Dunbar 332bcd6df662471e0ac2d3d85fdba09b1295c2fc468Rafael Espindola if (MArch == "armv2" || MArch == "armv2a") 333bcd6df662471e0ac2d3d85fdba09b1295c2fc468Rafael Espindola return "arm2"; 334bcd6df662471e0ac2d3d85fdba09b1295c2fc468Rafael Espindola if (MArch == "armv3") 335bcd6df662471e0ac2d3d85fdba09b1295c2fc468Rafael Espindola return "arm6"; 336bcd6df662471e0ac2d3d85fdba09b1295c2fc468Rafael Espindola if (MArch == "armv3m") 337bcd6df662471e0ac2d3d85fdba09b1295c2fc468Rafael Espindola return "arm7m"; 338bcd6df662471e0ac2d3d85fdba09b1295c2fc468Rafael Espindola if (MArch == "armv4" || MArch == "armv4t") 339bcd6df662471e0ac2d3d85fdba09b1295c2fc468Rafael Espindola return "arm7tdmi"; 340bcd6df662471e0ac2d3d85fdba09b1295c2fc468Rafael Espindola if (MArch == "armv5" || MArch == "armv5t") 341bcd6df662471e0ac2d3d85fdba09b1295c2fc468Rafael Espindola return "arm10tdmi"; 342bcd6df662471e0ac2d3d85fdba09b1295c2fc468Rafael Espindola if (MArch == "armv5e" || MArch == "armv5te") 343bcd6df662471e0ac2d3d85fdba09b1295c2fc468Rafael Espindola return "arm1026ejs"; 344bcd6df662471e0ac2d3d85fdba09b1295c2fc468Rafael Espindola if (MArch == "armv5tej") 345bcd6df662471e0ac2d3d85fdba09b1295c2fc468Rafael Espindola return "arm926ej-s"; 346bcd6df662471e0ac2d3d85fdba09b1295c2fc468Rafael Espindola if (MArch == "armv6" || MArch == "armv6k") 347bcd6df662471e0ac2d3d85fdba09b1295c2fc468Rafael Espindola return "arm1136jf-s"; 348bcd6df662471e0ac2d3d85fdba09b1295c2fc468Rafael Espindola if (MArch == "armv6j") 349bcd6df662471e0ac2d3d85fdba09b1295c2fc468Rafael Espindola return "arm1136j-s"; 350bcd6df662471e0ac2d3d85fdba09b1295c2fc468Rafael Espindola if (MArch == "armv6z" || MArch == "armv6zk") 351bcd6df662471e0ac2d3d85fdba09b1295c2fc468Rafael Espindola return "arm1176jzf-s"; 352bcd6df662471e0ac2d3d85fdba09b1295c2fc468Rafael Espindola if (MArch == "armv6t2") 353bcd6df662471e0ac2d3d85fdba09b1295c2fc468Rafael Espindola return "arm1156t2-s"; 354bcd6df662471e0ac2d3d85fdba09b1295c2fc468Rafael Espindola if (MArch == "armv7" || MArch == "armv7a" || MArch == "armv7-a") 355bcd6df662471e0ac2d3d85fdba09b1295c2fc468Rafael Espindola return "cortex-a8"; 356bcd6df662471e0ac2d3d85fdba09b1295c2fc468Rafael Espindola if (MArch == "armv7r" || MArch == "armv7-r") 357bcd6df662471e0ac2d3d85fdba09b1295c2fc468Rafael Espindola return "cortex-r4"; 358bcd6df662471e0ac2d3d85fdba09b1295c2fc468Rafael Espindola if (MArch == "armv7m" || MArch == "armv7-m") 359bcd6df662471e0ac2d3d85fdba09b1295c2fc468Rafael Espindola return "cortex-m3"; 360bcd6df662471e0ac2d3d85fdba09b1295c2fc468Rafael Espindola if (MArch == "ep9312") 361bcd6df662471e0ac2d3d85fdba09b1295c2fc468Rafael Espindola return "ep9312"; 362bcd6df662471e0ac2d3d85fdba09b1295c2fc468Rafael Espindola if (MArch == "iwmmxt") 363bcd6df662471e0ac2d3d85fdba09b1295c2fc468Rafael Espindola return "iwmmxt"; 364bcd6df662471e0ac2d3d85fdba09b1295c2fc468Rafael Espindola if (MArch == "xscale") 365bcd6df662471e0ac2d3d85fdba09b1295c2fc468Rafael Espindola return "xscale"; 366bcd6df662471e0ac2d3d85fdba09b1295c2fc468Rafael Espindola 367bcd6df662471e0ac2d3d85fdba09b1295c2fc468Rafael Espindola // If all else failed, return the most base CPU LLVM supports. 368b163ef7e7a5d904ef0962a7c38c460be083c4d63Daniel Dunbar return "arm7tdmi"; 369b163ef7e7a5d904ef0962a7c38c460be083c4d63Daniel Dunbar} 370b163ef7e7a5d904ef0962a7c38c460be083c4d63Daniel Dunbar 3711d65e4be6f22f7e4b4974efbaef92fa3454f1ec8Daniel Dunbar/// getLLVMArchSuffixForARM - Get the LLVM arch name to use for a particular 372728a512753d85a6ccaae34e81385c8665c2de0e1Daniel Dunbar/// CPU. 373728a512753d85a6ccaae34e81385c8665c2de0e1Daniel Dunbar// 374728a512753d85a6ccaae34e81385c8665c2de0e1Daniel Dunbar// FIXME: This is redundant with -mcpu, why does LLVM use this. 375728a512753d85a6ccaae34e81385c8665c2de0e1Daniel Dunbar// FIXME: tblgen this, or kill it! 3761d65e4be6f22f7e4b4974efbaef92fa3454f1ec8Daniel Dunbarstatic const char *getLLVMArchSuffixForARM(llvm::StringRef CPU) { 377728a512753d85a6ccaae34e81385c8665c2de0e1Daniel Dunbar if (CPU == "arm7tdmi" || CPU == "arm7tdmi-s" || CPU == "arm710t" || 378728a512753d85a6ccaae34e81385c8665c2de0e1Daniel Dunbar CPU == "arm720t" || CPU == "arm9" || CPU == "arm9tdmi" || 379728a512753d85a6ccaae34e81385c8665c2de0e1Daniel Dunbar CPU == "arm920" || CPU == "arm920t" || CPU == "arm922t" || 380728a512753d85a6ccaae34e81385c8665c2de0e1Daniel Dunbar CPU == "arm940t" || CPU == "ep9312") 3811d65e4be6f22f7e4b4974efbaef92fa3454f1ec8Daniel Dunbar return "v4t"; 382728a512753d85a6ccaae34e81385c8665c2de0e1Daniel Dunbar 383728a512753d85a6ccaae34e81385c8665c2de0e1Daniel Dunbar if (CPU == "arm10tdmi" || CPU == "arm1020t") 3841d65e4be6f22f7e4b4974efbaef92fa3454f1ec8Daniel Dunbar return "v5"; 385728a512753d85a6ccaae34e81385c8665c2de0e1Daniel Dunbar 386728a512753d85a6ccaae34e81385c8665c2de0e1Daniel Dunbar if (CPU == "arm9e" || CPU == "arm926ej-s" || CPU == "arm946e-s" || 387728a512753d85a6ccaae34e81385c8665c2de0e1Daniel Dunbar CPU == "arm966e-s" || CPU == "arm968e-s" || CPU == "arm10e" || 388728a512753d85a6ccaae34e81385c8665c2de0e1Daniel Dunbar CPU == "arm1020e" || CPU == "arm1022e" || CPU == "xscale" || 389728a512753d85a6ccaae34e81385c8665c2de0e1Daniel Dunbar CPU == "iwmmxt") 3901d65e4be6f22f7e4b4974efbaef92fa3454f1ec8Daniel Dunbar return "v5e"; 391728a512753d85a6ccaae34e81385c8665c2de0e1Daniel Dunbar 392728a512753d85a6ccaae34e81385c8665c2de0e1Daniel Dunbar if (CPU == "arm1136j-s" || CPU == "arm1136jf-s" || CPU == "arm1176jz-s" || 393728a512753d85a6ccaae34e81385c8665c2de0e1Daniel Dunbar CPU == "arm1176jzf-s" || CPU == "mpcorenovfp" || CPU == "mpcore") 3941d65e4be6f22f7e4b4974efbaef92fa3454f1ec8Daniel Dunbar return "v6"; 395728a512753d85a6ccaae34e81385c8665c2de0e1Daniel Dunbar 396728a512753d85a6ccaae34e81385c8665c2de0e1Daniel Dunbar if (CPU == "arm1156t2-s" || CPU == "arm1156t2f-s") 3971d65e4be6f22f7e4b4974efbaef92fa3454f1ec8Daniel Dunbar return "v6t2"; 398728a512753d85a6ccaae34e81385c8665c2de0e1Daniel Dunbar 399728a512753d85a6ccaae34e81385c8665c2de0e1Daniel Dunbar if (CPU == "cortex-a8" || CPU == "cortex-a9") 4001d65e4be6f22f7e4b4974efbaef92fa3454f1ec8Daniel Dunbar return "v7"; 401728a512753d85a6ccaae34e81385c8665c2de0e1Daniel Dunbar 4021d65e4be6f22f7e4b4974efbaef92fa3454f1ec8Daniel Dunbar return ""; 403728a512753d85a6ccaae34e81385c8665c2de0e1Daniel Dunbar} 404728a512753d85a6ccaae34e81385c8665c2de0e1Daniel Dunbar 4051f95e6567faab67f4363d650f73121359c4bdbabDaniel Dunbar// FIXME: Move to target hook. 4061f95e6567faab67f4363d650f73121359c4bdbabDaniel Dunbarstatic bool isSignedCharDefault(const llvm::Triple &Triple) { 4071f95e6567faab67f4363d650f73121359c4bdbabDaniel Dunbar switch (Triple.getArch()) { 4081f95e6567faab67f4363d650f73121359c4bdbabDaniel Dunbar default: 4091f95e6567faab67f4363d650f73121359c4bdbabDaniel Dunbar return true; 4101f95e6567faab67f4363d650f73121359c4bdbabDaniel Dunbar 4111f95e6567faab67f4363d650f73121359c4bdbabDaniel Dunbar case llvm::Triple::ppc: 4121f95e6567faab67f4363d650f73121359c4bdbabDaniel Dunbar case llvm::Triple::ppc64: 4131f95e6567faab67f4363d650f73121359c4bdbabDaniel Dunbar if (Triple.getOS() == llvm::Triple::Darwin) 4141f95e6567faab67f4363d650f73121359c4bdbabDaniel Dunbar return true; 4151f95e6567faab67f4363d650f73121359c4bdbabDaniel Dunbar return false; 4161f95e6567faab67f4363d650f73121359c4bdbabDaniel Dunbar 4171f95e6567faab67f4363d650f73121359c4bdbabDaniel Dunbar case llvm::Triple::systemz: 4181f95e6567faab67f4363d650f73121359c4bdbabDaniel Dunbar return false; 4191f95e6567faab67f4363d650f73121359c4bdbabDaniel Dunbar } 4201f95e6567faab67f4363d650f73121359c4bdbabDaniel Dunbar} 4211f95e6567faab67f4363d650f73121359c4bdbabDaniel Dunbar 422b163ef7e7a5d904ef0962a7c38c460be083c4d63Daniel Dunbarvoid Clang::AddARMTargetArgs(const ArgList &Args, 423b163ef7e7a5d904ef0962a7c38c460be083c4d63Daniel Dunbar ArgStringList &CmdArgs) const { 424ee788e70fcd0adf76103b17c78ac658d4ea30c9bDaniel Dunbar const Driver &D = getToolChain().getDriver(); 425bcd6df662471e0ac2d3d85fdba09b1295c2fc468Rafael Espindola llvm::Triple Triple = getToolChain().getTriple(); 426cbd1933f83e2332b2d7add10459f80cc4e7eb7bfDaniel Dunbar 4272030d8f46b4226fa99e59389e3ca856a79c27e9aDaniel Dunbar // Select the ABI to use. 4282030d8f46b4226fa99e59389e3ca856a79c27e9aDaniel Dunbar // 4292030d8f46b4226fa99e59389e3ca856a79c27e9aDaniel Dunbar // FIXME: Support -meabi. 4302030d8f46b4226fa99e59389e3ca856a79c27e9aDaniel Dunbar const char *ABIName = 0; 4312030d8f46b4226fa99e59389e3ca856a79c27e9aDaniel Dunbar if (Arg *A = Args.getLastArg(options::OPT_mabi_EQ)) { 4322030d8f46b4226fa99e59389e3ca856a79c27e9aDaniel Dunbar ABIName = A->getValue(Args); 4332030d8f46b4226fa99e59389e3ca856a79c27e9aDaniel Dunbar } else { 4342030d8f46b4226fa99e59389e3ca856a79c27e9aDaniel Dunbar // Select the default based on the platform. 435fc2bd7c3efed6756a030d58a5f6ae31947e7d451Bob Wilson switch(Triple.getEnvironment()) { 436fc2bd7c3efed6756a030d58a5f6ae31947e7d451Bob Wilson case llvm::Triple::GNUEABI: 4371ed1a594e9befc91ebf00d81b41a2fdfab862657Rafael Espindola ABIName = "aapcs-linux"; 438fc2bd7c3efed6756a030d58a5f6ae31947e7d451Bob Wilson break; 439fc2bd7c3efed6756a030d58a5f6ae31947e7d451Bob Wilson case llvm::Triple::EABI: 4402030d8f46b4226fa99e59389e3ca856a79c27e9aDaniel Dunbar ABIName = "aapcs"; 441fc2bd7c3efed6756a030d58a5f6ae31947e7d451Bob Wilson break; 442fc2bd7c3efed6756a030d58a5f6ae31947e7d451Bob Wilson default: 4432030d8f46b4226fa99e59389e3ca856a79c27e9aDaniel Dunbar ABIName = "apcs-gnu"; 444fc2bd7c3efed6756a030d58a5f6ae31947e7d451Bob Wilson } 4452030d8f46b4226fa99e59389e3ca856a79c27e9aDaniel Dunbar } 4462030d8f46b4226fa99e59389e3ca856a79c27e9aDaniel Dunbar CmdArgs.push_back("-target-abi"); 4472030d8f46b4226fa99e59389e3ca856a79c27e9aDaniel Dunbar CmdArgs.push_back(ABIName); 4482030d8f46b4226fa99e59389e3ca856a79c27e9aDaniel Dunbar 449b163ef7e7a5d904ef0962a7c38c460be083c4d63Daniel Dunbar // Set the CPU based on -march= and -mcpu=. 45038b48afd338d494099697d2611e1f45e558e469eDaniel Dunbar CmdArgs.push_back("-target-cpu"); 451bcd6df662471e0ac2d3d85fdba09b1295c2fc468Rafael Espindola CmdArgs.push_back(getARMTargetCPU(Args, Triple)); 452b163ef7e7a5d904ef0962a7c38c460be083c4d63Daniel Dunbar 453cbd1933f83e2332b2d7add10459f80cc4e7eb7bfDaniel Dunbar // Select the float ABI as determined by -msoft-float, -mhard-float, and 454cbd1933f83e2332b2d7add10459f80cc4e7eb7bfDaniel Dunbar // -mfloat-abi=. 455cbd1933f83e2332b2d7add10459f80cc4e7eb7bfDaniel Dunbar llvm::StringRef FloatABI; 456cbd1933f83e2332b2d7add10459f80cc4e7eb7bfDaniel Dunbar if (Arg *A = Args.getLastArg(options::OPT_msoft_float, 457cbd1933f83e2332b2d7add10459f80cc4e7eb7bfDaniel Dunbar options::OPT_mhard_float, 458cbd1933f83e2332b2d7add10459f80cc4e7eb7bfDaniel Dunbar options::OPT_mfloat_abi_EQ)) { 459cbd1933f83e2332b2d7add10459f80cc4e7eb7bfDaniel Dunbar if (A->getOption().matches(options::OPT_msoft_float)) 460cbd1933f83e2332b2d7add10459f80cc4e7eb7bfDaniel Dunbar FloatABI = "soft"; 461cbd1933f83e2332b2d7add10459f80cc4e7eb7bfDaniel Dunbar else if (A->getOption().matches(options::OPT_mhard_float)) 462cbd1933f83e2332b2d7add10459f80cc4e7eb7bfDaniel Dunbar FloatABI = "hard"; 463cbd1933f83e2332b2d7add10459f80cc4e7eb7bfDaniel Dunbar else { 464cbd1933f83e2332b2d7add10459f80cc4e7eb7bfDaniel Dunbar FloatABI = A->getValue(Args); 465cbd1933f83e2332b2d7add10459f80cc4e7eb7bfDaniel Dunbar if (FloatABI != "soft" && FloatABI != "softfp" && FloatABI != "hard") { 466cbd1933f83e2332b2d7add10459f80cc4e7eb7bfDaniel Dunbar D.Diag(clang::diag::err_drv_invalid_mfloat_abi) 467cbd1933f83e2332b2d7add10459f80cc4e7eb7bfDaniel Dunbar << A->getAsString(Args); 468cbd1933f83e2332b2d7add10459f80cc4e7eb7bfDaniel Dunbar FloatABI = "soft"; 469cbd1933f83e2332b2d7add10459f80cc4e7eb7bfDaniel Dunbar } 470cbd1933f83e2332b2d7add10459f80cc4e7eb7bfDaniel Dunbar } 471cbd1933f83e2332b2d7add10459f80cc4e7eb7bfDaniel Dunbar } 472cbd1933f83e2332b2d7add10459f80cc4e7eb7bfDaniel Dunbar 473cbd1933f83e2332b2d7add10459f80cc4e7eb7bfDaniel Dunbar // If unspecified, choose the default based on the platform. 474cbd1933f83e2332b2d7add10459f80cc4e7eb7bfDaniel Dunbar if (FloatABI.empty()) { 475bcd6df662471e0ac2d3d85fdba09b1295c2fc468Rafael Espindola const llvm::Triple &Triple = getToolChain().getTriple(); 476bcd6df662471e0ac2d3d85fdba09b1295c2fc468Rafael Espindola switch (Triple.getOS()) { 477cbd1933f83e2332b2d7add10459f80cc4e7eb7bfDaniel Dunbar case llvm::Triple::Darwin: { 478cbd1933f83e2332b2d7add10459f80cc4e7eb7bfDaniel Dunbar // Darwin defaults to "softfp" for v6 and v7. 479cbd1933f83e2332b2d7add10459f80cc4e7eb7bfDaniel Dunbar // 480cbd1933f83e2332b2d7add10459f80cc4e7eb7bfDaniel Dunbar // FIXME: Factor out an ARM class so we can cache the arch somewhere. 481bcd6df662471e0ac2d3d85fdba09b1295c2fc468Rafael Espindola llvm::StringRef ArchName = 482bcd6df662471e0ac2d3d85fdba09b1295c2fc468Rafael Espindola getLLVMArchSuffixForARM(getARMTargetCPU(Args, Triple)); 483cbd1933f83e2332b2d7add10459f80cc4e7eb7bfDaniel Dunbar if (ArchName.startswith("v6") || ArchName.startswith("v7")) 484cbd1933f83e2332b2d7add10459f80cc4e7eb7bfDaniel Dunbar FloatABI = "softfp"; 485cbd1933f83e2332b2d7add10459f80cc4e7eb7bfDaniel Dunbar else 486cbd1933f83e2332b2d7add10459f80cc4e7eb7bfDaniel Dunbar FloatABI = "soft"; 487cbd1933f83e2332b2d7add10459f80cc4e7eb7bfDaniel Dunbar break; 488cbd1933f83e2332b2d7add10459f80cc4e7eb7bfDaniel Dunbar } 489cbd1933f83e2332b2d7add10459f80cc4e7eb7bfDaniel Dunbar 4907e9cebfe1246bb9051a364474b6570eb40dbac4bRafael Espindola case llvm::Triple::Linux: { 491fc2bd7c3efed6756a030d58a5f6ae31947e7d451Bob Wilson if (getToolChain().getTriple().getEnvironment() == llvm::Triple::GNUEABI) { 4927e9cebfe1246bb9051a364474b6570eb40dbac4bRafael Espindola FloatABI = "softfp"; 4937e9cebfe1246bb9051a364474b6570eb40dbac4bRafael Espindola break; 4947e9cebfe1246bb9051a364474b6570eb40dbac4bRafael Espindola } 4957e9cebfe1246bb9051a364474b6570eb40dbac4bRafael Espindola } 4967e9cebfe1246bb9051a364474b6570eb40dbac4bRafael Espindola // fall through 4977e9cebfe1246bb9051a364474b6570eb40dbac4bRafael Espindola 498cbd1933f83e2332b2d7add10459f80cc4e7eb7bfDaniel Dunbar default: 499fc2bd7c3efed6756a030d58a5f6ae31947e7d451Bob Wilson switch(Triple.getEnvironment()) { 500fc2bd7c3efed6756a030d58a5f6ae31947e7d451Bob Wilson case llvm::Triple::GNUEABI: 501fc2bd7c3efed6756a030d58a5f6ae31947e7d451Bob Wilson FloatABI = "softfp"; 502fc2bd7c3efed6756a030d58a5f6ae31947e7d451Bob Wilson break; 503fc2bd7c3efed6756a030d58a5f6ae31947e7d451Bob Wilson case llvm::Triple::EABI: 504fc2bd7c3efed6756a030d58a5f6ae31947e7d451Bob Wilson // EABI is always AAPCS, and if it was not marked 'hard', it's softfp 505fc2bd7c3efed6756a030d58a5f6ae31947e7d451Bob Wilson FloatABI = "softfp"; 506fc2bd7c3efed6756a030d58a5f6ae31947e7d451Bob Wilson break; 507fc2bd7c3efed6756a030d58a5f6ae31947e7d451Bob Wilson default: 508fc2bd7c3efed6756a030d58a5f6ae31947e7d451Bob Wilson // Assume "soft", but warn the user we are guessing. 509fc2bd7c3efed6756a030d58a5f6ae31947e7d451Bob Wilson FloatABI = "soft"; 510fc2bd7c3efed6756a030d58a5f6ae31947e7d451Bob Wilson D.Diag(clang::diag::warn_drv_assuming_mfloat_abi_is) << "soft"; 511fc2bd7c3efed6756a030d58a5f6ae31947e7d451Bob Wilson break; 512fc2bd7c3efed6756a030d58a5f6ae31947e7d451Bob Wilson } 513cbd1933f83e2332b2d7add10459f80cc4e7eb7bfDaniel Dunbar } 514cbd1933f83e2332b2d7add10459f80cc4e7eb7bfDaniel Dunbar } 515cbd1933f83e2332b2d7add10459f80cc4e7eb7bfDaniel Dunbar 516cbd1933f83e2332b2d7add10459f80cc4e7eb7bfDaniel Dunbar if (FloatABI == "soft") { 517cbd1933f83e2332b2d7add10459f80cc4e7eb7bfDaniel Dunbar // Floating point operations and argument passing are soft. 518cbd1933f83e2332b2d7add10459f80cc4e7eb7bfDaniel Dunbar // 519cbd1933f83e2332b2d7add10459f80cc4e7eb7bfDaniel Dunbar // FIXME: This changes CPP defines, we need -target-soft-float. 5203b315264d1a6fa303e20fe0caec306ccafc090deDaniel Dunbar CmdArgs.push_back("-msoft-float"); 52187667aafe68c366be57f5afb60428237593da0edDaniel Dunbar CmdArgs.push_back("-mfloat-abi"); 52287667aafe68c366be57f5afb60428237593da0edDaniel Dunbar CmdArgs.push_back("soft"); 523cbd1933f83e2332b2d7add10459f80cc4e7eb7bfDaniel Dunbar } else if (FloatABI == "softfp") { 524cbd1933f83e2332b2d7add10459f80cc4e7eb7bfDaniel Dunbar // Floating point operations are hard, but argument passing is soft. 52587667aafe68c366be57f5afb60428237593da0edDaniel Dunbar CmdArgs.push_back("-mfloat-abi"); 52687667aafe68c366be57f5afb60428237593da0edDaniel Dunbar CmdArgs.push_back("soft"); 527cbd1933f83e2332b2d7add10459f80cc4e7eb7bfDaniel Dunbar } else { 528cbd1933f83e2332b2d7add10459f80cc4e7eb7bfDaniel Dunbar // Floating point operations and argument passing are hard. 529cbd1933f83e2332b2d7add10459f80cc4e7eb7bfDaniel Dunbar assert(FloatABI == "hard" && "Invalid float abi!"); 53087667aafe68c366be57f5afb60428237593da0edDaniel Dunbar CmdArgs.push_back("-mfloat-abi"); 53187667aafe68c366be57f5afb60428237593da0edDaniel Dunbar CmdArgs.push_back("hard"); 532cbd1933f83e2332b2d7add10459f80cc4e7eb7bfDaniel Dunbar } 53397f52ac45369f6925b548404e61d511034c874ecDaniel Dunbar 53497f52ac45369f6925b548404e61d511034c874ecDaniel Dunbar // Set appropriate target features for floating point mode. 53597f52ac45369f6925b548404e61d511034c874ecDaniel Dunbar // 53697f52ac45369f6925b548404e61d511034c874ecDaniel Dunbar // FIXME: Note, this is a hack, the LLVM backend doesn't actually use these 53797f52ac45369f6925b548404e61d511034c874ecDaniel Dunbar // yet (it uses the -mfloat-abi and -msoft-float options above), and it is 53897f52ac45369f6925b548404e61d511034c874ecDaniel Dunbar // stripped out by the ARM target. 53997f52ac45369f6925b548404e61d511034c874ecDaniel Dunbar 54097f52ac45369f6925b548404e61d511034c874ecDaniel Dunbar // Use software floating point operations? 54197f52ac45369f6925b548404e61d511034c874ecDaniel Dunbar if (FloatABI == "soft") { 54297f52ac45369f6925b548404e61d511034c874ecDaniel Dunbar CmdArgs.push_back("-target-feature"); 54397f52ac45369f6925b548404e61d511034c874ecDaniel Dunbar CmdArgs.push_back("+soft-float"); 54497f52ac45369f6925b548404e61d511034c874ecDaniel Dunbar } 54597f52ac45369f6925b548404e61d511034c874ecDaniel Dunbar 54697f52ac45369f6925b548404e61d511034c874ecDaniel Dunbar // Use software floating point argument passing? 54797f52ac45369f6925b548404e61d511034c874ecDaniel Dunbar if (FloatABI != "hard") { 54897f52ac45369f6925b548404e61d511034c874ecDaniel Dunbar CmdArgs.push_back("-target-feature"); 54997f52ac45369f6925b548404e61d511034c874ecDaniel Dunbar CmdArgs.push_back("+soft-float-abi"); 55097f52ac45369f6925b548404e61d511034c874ecDaniel Dunbar } 551a91320b8af7143f7af4c0665ffa62a3b244c0bd9Daniel Dunbar 552a91320b8af7143f7af4c0665ffa62a3b244c0bd9Daniel Dunbar // Honor -mfpu=. 553a91320b8af7143f7af4c0665ffa62a3b244c0bd9Daniel Dunbar // 554a91320b8af7143f7af4c0665ffa62a3b244c0bd9Daniel Dunbar // FIXME: Centralize feature selection, defaulting shouldn't be also in the 555a91320b8af7143f7af4c0665ffa62a3b244c0bd9Daniel Dunbar // frontend target. 556a91320b8af7143f7af4c0665ffa62a3b244c0bd9Daniel Dunbar if (const Arg *A = Args.getLastArg(options::OPT_mfpu_EQ)) { 557a91320b8af7143f7af4c0665ffa62a3b244c0bd9Daniel Dunbar llvm::StringRef FPU = A->getValue(Args); 558a91320b8af7143f7af4c0665ffa62a3b244c0bd9Daniel Dunbar 559a91320b8af7143f7af4c0665ffa62a3b244c0bd9Daniel Dunbar // Set the target features based on the FPU. 560a91320b8af7143f7af4c0665ffa62a3b244c0bd9Daniel Dunbar if (FPU == "fpa" || FPU == "fpe2" || FPU == "fpe3" || FPU == "maverick") { 561a91320b8af7143f7af4c0665ffa62a3b244c0bd9Daniel Dunbar // Disable any default FPU support. 562a91320b8af7143f7af4c0665ffa62a3b244c0bd9Daniel Dunbar CmdArgs.push_back("-target-feature"); 563a91320b8af7143f7af4c0665ffa62a3b244c0bd9Daniel Dunbar CmdArgs.push_back("-vfp2"); 564a91320b8af7143f7af4c0665ffa62a3b244c0bd9Daniel Dunbar CmdArgs.push_back("-target-feature"); 565a91320b8af7143f7af4c0665ffa62a3b244c0bd9Daniel Dunbar CmdArgs.push_back("-vfp3"); 566a91320b8af7143f7af4c0665ffa62a3b244c0bd9Daniel Dunbar CmdArgs.push_back("-target-feature"); 567a91320b8af7143f7af4c0665ffa62a3b244c0bd9Daniel Dunbar CmdArgs.push_back("-neon"); 568a91320b8af7143f7af4c0665ffa62a3b244c0bd9Daniel Dunbar } else if (FPU == "vfp") { 569a91320b8af7143f7af4c0665ffa62a3b244c0bd9Daniel Dunbar CmdArgs.push_back("-target-feature"); 570a91320b8af7143f7af4c0665ffa62a3b244c0bd9Daniel Dunbar CmdArgs.push_back("+vfp2"); 571a91320b8af7143f7af4c0665ffa62a3b244c0bd9Daniel Dunbar } else if (FPU == "vfp3") { 572a91320b8af7143f7af4c0665ffa62a3b244c0bd9Daniel Dunbar CmdArgs.push_back("-target-feature"); 573a91320b8af7143f7af4c0665ffa62a3b244c0bd9Daniel Dunbar CmdArgs.push_back("+vfp3"); 574a91320b8af7143f7af4c0665ffa62a3b244c0bd9Daniel Dunbar } else if (FPU == "neon") { 575a91320b8af7143f7af4c0665ffa62a3b244c0bd9Daniel Dunbar CmdArgs.push_back("-target-feature"); 576a91320b8af7143f7af4c0665ffa62a3b244c0bd9Daniel Dunbar CmdArgs.push_back("+neon"); 577a91320b8af7143f7af4c0665ffa62a3b244c0bd9Daniel Dunbar } else 578a91320b8af7143f7af4c0665ffa62a3b244c0bd9Daniel Dunbar D.Diag(clang::diag::err_drv_clang_unsupported) << A->getAsString(Args); 579a91320b8af7143f7af4c0665ffa62a3b244c0bd9Daniel Dunbar } 580b163ef7e7a5d904ef0962a7c38c460be083c4d63Daniel Dunbar} 581b163ef7e7a5d904ef0962a7c38c460be083c4d63Daniel Dunbar 582ed734737d5af31906e30e537d4a41c760ddcfc59Eric Christophervoid Clang::AddMIPSTargetArgs(const ArgList &Args, 583ed734737d5af31906e30e537d4a41c760ddcfc59Eric Christopher ArgStringList &CmdArgs) const { 584ed734737d5af31906e30e537d4a41c760ddcfc59Eric Christopher const Driver &D = getToolChain().getDriver(); 585ed734737d5af31906e30e537d4a41c760ddcfc59Eric Christopher 586ed734737d5af31906e30e537d4a41c760ddcfc59Eric Christopher // Select the ABI to use. 587ed734737d5af31906e30e537d4a41c760ddcfc59Eric Christopher const char *ABIName = 0; 588ed734737d5af31906e30e537d4a41c760ddcfc59Eric Christopher if (Arg *A = Args.getLastArg(options::OPT_mabi_EQ)) { 589ed734737d5af31906e30e537d4a41c760ddcfc59Eric Christopher ABIName = A->getValue(Args); 590ed734737d5af31906e30e537d4a41c760ddcfc59Eric Christopher } else { 591ed734737d5af31906e30e537d4a41c760ddcfc59Eric Christopher ABIName = "o32"; 592ed734737d5af31906e30e537d4a41c760ddcfc59Eric Christopher } 593ed734737d5af31906e30e537d4a41c760ddcfc59Eric Christopher 594ed734737d5af31906e30e537d4a41c760ddcfc59Eric Christopher CmdArgs.push_back("-target-abi"); 595ed734737d5af31906e30e537d4a41c760ddcfc59Eric Christopher CmdArgs.push_back(ABIName); 596ed734737d5af31906e30e537d4a41c760ddcfc59Eric Christopher 597ed734737d5af31906e30e537d4a41c760ddcfc59Eric Christopher if (const Arg *A = Args.getLastArg(options::OPT_march_EQ)) { 598ed734737d5af31906e30e537d4a41c760ddcfc59Eric Christopher llvm::StringRef MArch = A->getValue(Args); 599ed734737d5af31906e30e537d4a41c760ddcfc59Eric Christopher CmdArgs.push_back("-target-cpu"); 600ed734737d5af31906e30e537d4a41c760ddcfc59Eric Christopher 601ed734737d5af31906e30e537d4a41c760ddcfc59Eric Christopher if ((MArch == "r2000") || (MArch == "r3000")) 602ed734737d5af31906e30e537d4a41c760ddcfc59Eric Christopher CmdArgs.push_back("mips1"); 603ed734737d5af31906e30e537d4a41c760ddcfc59Eric Christopher else if (MArch == "r6000") 604ed734737d5af31906e30e537d4a41c760ddcfc59Eric Christopher CmdArgs.push_back("mips2"); 605ed734737d5af31906e30e537d4a41c760ddcfc59Eric Christopher else 606ed734737d5af31906e30e537d4a41c760ddcfc59Eric Christopher CmdArgs.push_back(MArch.str().c_str()); 607ed734737d5af31906e30e537d4a41c760ddcfc59Eric Christopher } 608ed734737d5af31906e30e537d4a41c760ddcfc59Eric Christopher 609ed734737d5af31906e30e537d4a41c760ddcfc59Eric Christopher // Select the float ABI as determined by -msoft-float, -mhard-float, and 610ed734737d5af31906e30e537d4a41c760ddcfc59Eric Christopher llvm::StringRef FloatABI; 611ed734737d5af31906e30e537d4a41c760ddcfc59Eric Christopher if (Arg *A = Args.getLastArg(options::OPT_msoft_float, 612ed734737d5af31906e30e537d4a41c760ddcfc59Eric Christopher options::OPT_mhard_float)) { 613ed734737d5af31906e30e537d4a41c760ddcfc59Eric Christopher if (A->getOption().matches(options::OPT_msoft_float)) 614ed734737d5af31906e30e537d4a41c760ddcfc59Eric Christopher FloatABI = "soft"; 615ed734737d5af31906e30e537d4a41c760ddcfc59Eric Christopher else if (A->getOption().matches(options::OPT_mhard_float)) 616ed734737d5af31906e30e537d4a41c760ddcfc59Eric Christopher FloatABI = "hard"; 617ed734737d5af31906e30e537d4a41c760ddcfc59Eric Christopher } 618ed734737d5af31906e30e537d4a41c760ddcfc59Eric Christopher 619ed734737d5af31906e30e537d4a41c760ddcfc59Eric Christopher // If unspecified, choose the default based on the platform. 620ed734737d5af31906e30e537d4a41c760ddcfc59Eric Christopher if (FloatABI.empty()) { 62171c972acd4a2cb5e369e35471dbb719185913cdcBenjamin Kramer // Assume "soft", but warn the user we are guessing. 62271c972acd4a2cb5e369e35471dbb719185913cdcBenjamin Kramer FloatABI = "soft"; 62371c972acd4a2cb5e369e35471dbb719185913cdcBenjamin Kramer D.Diag(clang::diag::warn_drv_assuming_mfloat_abi_is) << "soft"; 624ed734737d5af31906e30e537d4a41c760ddcfc59Eric Christopher } 625ed734737d5af31906e30e537d4a41c760ddcfc59Eric Christopher 626ed734737d5af31906e30e537d4a41c760ddcfc59Eric Christopher if (FloatABI == "soft") { 627ed734737d5af31906e30e537d4a41c760ddcfc59Eric Christopher // Floating point operations and argument passing are soft. 628ed734737d5af31906e30e537d4a41c760ddcfc59Eric Christopher // 629ed734737d5af31906e30e537d4a41c760ddcfc59Eric Christopher // FIXME: This changes CPP defines, we need -target-soft-float. 630ed734737d5af31906e30e537d4a41c760ddcfc59Eric Christopher CmdArgs.push_back("-msoft-float"); 631ed734737d5af31906e30e537d4a41c760ddcfc59Eric Christopher } else { 632ed734737d5af31906e30e537d4a41c760ddcfc59Eric Christopher assert(FloatABI == "hard" && "Invalid float abi!"); 633ed734737d5af31906e30e537d4a41c760ddcfc59Eric Christopher CmdArgs.push_back("-mhard-float"); 634ed734737d5af31906e30e537d4a41c760ddcfc59Eric Christopher } 635ed734737d5af31906e30e537d4a41c760ddcfc59Eric Christopher} 636ed734737d5af31906e30e537d4a41c760ddcfc59Eric Christopher 6379284d215022457ba867080a713f08f026d89ea17Bruno Cardoso Lopesvoid Clang::AddSparcTargetArgs(const ArgList &Args, 6389284d215022457ba867080a713f08f026d89ea17Bruno Cardoso Lopes ArgStringList &CmdArgs) const { 6399284d215022457ba867080a713f08f026d89ea17Bruno Cardoso Lopes const Driver &D = getToolChain().getDriver(); 6409284d215022457ba867080a713f08f026d89ea17Bruno Cardoso Lopes 6419284d215022457ba867080a713f08f026d89ea17Bruno Cardoso Lopes if (const Arg *A = Args.getLastArg(options::OPT_march_EQ)) { 6429284d215022457ba867080a713f08f026d89ea17Bruno Cardoso Lopes llvm::StringRef MArch = A->getValue(Args); 6439284d215022457ba867080a713f08f026d89ea17Bruno Cardoso Lopes CmdArgs.push_back("-target-cpu"); 6449284d215022457ba867080a713f08f026d89ea17Bruno Cardoso Lopes CmdArgs.push_back(MArch.str().c_str()); 6459284d215022457ba867080a713f08f026d89ea17Bruno Cardoso Lopes } 6469284d215022457ba867080a713f08f026d89ea17Bruno Cardoso Lopes 6479284d215022457ba867080a713f08f026d89ea17Bruno Cardoso Lopes // Select the float ABI as determined by -msoft-float, -mhard-float, and 6489284d215022457ba867080a713f08f026d89ea17Bruno Cardoso Lopes llvm::StringRef FloatABI; 6499284d215022457ba867080a713f08f026d89ea17Bruno Cardoso Lopes if (Arg *A = Args.getLastArg(options::OPT_msoft_float, 6509284d215022457ba867080a713f08f026d89ea17Bruno Cardoso Lopes options::OPT_mhard_float)) { 6519284d215022457ba867080a713f08f026d89ea17Bruno Cardoso Lopes if (A->getOption().matches(options::OPT_msoft_float)) 6529284d215022457ba867080a713f08f026d89ea17Bruno Cardoso Lopes FloatABI = "soft"; 6539284d215022457ba867080a713f08f026d89ea17Bruno Cardoso Lopes else if (A->getOption().matches(options::OPT_mhard_float)) 6549284d215022457ba867080a713f08f026d89ea17Bruno Cardoso Lopes FloatABI = "hard"; 6559284d215022457ba867080a713f08f026d89ea17Bruno Cardoso Lopes } 6569284d215022457ba867080a713f08f026d89ea17Bruno Cardoso Lopes 6579284d215022457ba867080a713f08f026d89ea17Bruno Cardoso Lopes // If unspecified, choose the default based on the platform. 6589284d215022457ba867080a713f08f026d89ea17Bruno Cardoso Lopes if (FloatABI.empty()) { 6599284d215022457ba867080a713f08f026d89ea17Bruno Cardoso Lopes switch (getToolChain().getTriple().getOS()) { 6609284d215022457ba867080a713f08f026d89ea17Bruno Cardoso Lopes default: 6619284d215022457ba867080a713f08f026d89ea17Bruno Cardoso Lopes // Assume "soft", but warn the user we are guessing. 6629284d215022457ba867080a713f08f026d89ea17Bruno Cardoso Lopes FloatABI = "soft"; 6639284d215022457ba867080a713f08f026d89ea17Bruno Cardoso Lopes D.Diag(clang::diag::warn_drv_assuming_mfloat_abi_is) << "soft"; 6649284d215022457ba867080a713f08f026d89ea17Bruno Cardoso Lopes break; 6659284d215022457ba867080a713f08f026d89ea17Bruno Cardoso Lopes } 6669284d215022457ba867080a713f08f026d89ea17Bruno Cardoso Lopes } 6679284d215022457ba867080a713f08f026d89ea17Bruno Cardoso Lopes 6689284d215022457ba867080a713f08f026d89ea17Bruno Cardoso Lopes if (FloatABI == "soft") { 6699284d215022457ba867080a713f08f026d89ea17Bruno Cardoso Lopes // Floating point operations and argument passing are soft. 6709284d215022457ba867080a713f08f026d89ea17Bruno Cardoso Lopes // 6719284d215022457ba867080a713f08f026d89ea17Bruno Cardoso Lopes // FIXME: This changes CPP defines, we need -target-soft-float. 6729284d215022457ba867080a713f08f026d89ea17Bruno Cardoso Lopes CmdArgs.push_back("-msoft-float"); 6739284d215022457ba867080a713f08f026d89ea17Bruno Cardoso Lopes CmdArgs.push_back("soft"); 6749284d215022457ba867080a713f08f026d89ea17Bruno Cardoso Lopes CmdArgs.push_back("-target-feature"); 6759284d215022457ba867080a713f08f026d89ea17Bruno Cardoso Lopes CmdArgs.push_back("+soft-float"); 6769284d215022457ba867080a713f08f026d89ea17Bruno Cardoso Lopes } else { 6779284d215022457ba867080a713f08f026d89ea17Bruno Cardoso Lopes assert(FloatABI == "hard" && "Invalid float abi!"); 6789284d215022457ba867080a713f08f026d89ea17Bruno Cardoso Lopes CmdArgs.push_back("-mhard-float"); 6799284d215022457ba867080a713f08f026d89ea17Bruno Cardoso Lopes } 6809284d215022457ba867080a713f08f026d89ea17Bruno Cardoso Lopes} 6819284d215022457ba867080a713f08f026d89ea17Bruno Cardoso Lopes 6826acda16e9c194dcbd0dea64341e182bdb65d0f41Daniel Dunbarvoid Clang::AddX86TargetArgs(const ArgList &Args, 6836acda16e9c194dcbd0dea64341e182bdb65d0f41Daniel Dunbar ArgStringList &CmdArgs) const { 684e6ad3f9fceef0ecc422ff26754ea069a5fd18c69Daniel Dunbar if (!Args.hasFlag(options::OPT_mred_zone, 685e6ad3f9fceef0ecc422ff26754ea069a5fd18c69Daniel Dunbar options::OPT_mno_red_zone, 686e6ad3f9fceef0ecc422ff26754ea069a5fd18c69Daniel Dunbar true) || 687e6ad3f9fceef0ecc422ff26754ea069a5fd18c69Daniel Dunbar Args.hasArg(options::OPT_mkernel) || 688e6ad3f9fceef0ecc422ff26754ea069a5fd18c69Daniel Dunbar Args.hasArg(options::OPT_fapple_kext)) 68966861e09d590994a8b941eaa328e4d8f33adec9eDaniel Dunbar CmdArgs.push_back("-disable-red-zone"); 690e6ad3f9fceef0ecc422ff26754ea069a5fd18c69Daniel Dunbar 691e6ad3f9fceef0ecc422ff26754ea069a5fd18c69Daniel Dunbar if (Args.hasFlag(options::OPT_msoft_float, 692e6ad3f9fceef0ecc422ff26754ea069a5fd18c69Daniel Dunbar options::OPT_mno_soft_float, 693e6ad3f9fceef0ecc422ff26754ea069a5fd18c69Daniel Dunbar false)) 69466861e09d590994a8b941eaa328e4d8f33adec9eDaniel Dunbar CmdArgs.push_back("-no-implicit-float"); 695e6ad3f9fceef0ecc422ff26754ea069a5fd18c69Daniel Dunbar 696f86feddbd5b13d2c144132e35d608fa630784dbbDaniel Dunbar const char *CPUName = 0; 6976acda16e9c194dcbd0dea64341e182bdb65d0f41Daniel Dunbar if (const Arg *A = Args.getLastArg(options::OPT_march_EQ)) { 698f86feddbd5b13d2c144132e35d608fa630784dbbDaniel Dunbar if (llvm::StringRef(A->getValue(Args)) == "native") { 699f86feddbd5b13d2c144132e35d608fa630784dbbDaniel Dunbar // FIXME: Reject attempts to use -march=native unless the target matches 700f86feddbd5b13d2c144132e35d608fa630784dbbDaniel Dunbar // the host. 701f86feddbd5b13d2c144132e35d608fa630784dbbDaniel Dunbar // 702f86feddbd5b13d2c144132e35d608fa630784dbbDaniel Dunbar // FIXME: We should also incorporate the detected target features for use 703f86feddbd5b13d2c144132e35d608fa630784dbbDaniel Dunbar // with -native. 704f86feddbd5b13d2c144132e35d608fa630784dbbDaniel Dunbar std::string CPU = llvm::sys::getHostCPUName(); 705f86feddbd5b13d2c144132e35d608fa630784dbbDaniel Dunbar if (!CPU.empty()) 706f86feddbd5b13d2c144132e35d608fa630784dbbDaniel Dunbar CPUName = Args.MakeArgString(CPU); 707f86feddbd5b13d2c144132e35d608fa630784dbbDaniel Dunbar } else 708f86feddbd5b13d2c144132e35d608fa630784dbbDaniel Dunbar CPUName = A->getValue(Args); 709f86feddbd5b13d2c144132e35d608fa630784dbbDaniel Dunbar } 7106acda16e9c194dcbd0dea64341e182bdb65d0f41Daniel Dunbar 711f86feddbd5b13d2c144132e35d608fa630784dbbDaniel Dunbar // Select the default CPU if none was given (or detection failed). 712f86feddbd5b13d2c144132e35d608fa630784dbbDaniel Dunbar if (!CPUName) { 7136acda16e9c194dcbd0dea64341e182bdb65d0f41Daniel Dunbar // FIXME: Need target hooks. 714f22d1fd96d6056a2f271b0f7353b31f47547127bBenjamin Kramer if (getToolChain().getOS().startswith("darwin")) { 7156acda16e9c194dcbd0dea64341e182bdb65d0f41Daniel Dunbar if (getToolChain().getArchName() == "x86_64") 716f86feddbd5b13d2c144132e35d608fa630784dbbDaniel Dunbar CPUName = "core2"; 7176acda16e9c194dcbd0dea64341e182bdb65d0f41Daniel Dunbar else if (getToolChain().getArchName() == "i386") 718f86feddbd5b13d2c144132e35d608fa630784dbbDaniel Dunbar CPUName = "yonah"; 71986ed3a326342fa2a8c9d9b5d1d7280c9bad2b007Chris Lattner } else if (getToolChain().getOS().startswith("haiku")) { 72086ed3a326342fa2a8c9d9b5d1d7280c9bad2b007Chris Lattner if (getToolChain().getArchName() == "x86_64") 72186ed3a326342fa2a8c9d9b5d1d7280c9bad2b007Chris Lattner CPUName = "x86-64"; 72286ed3a326342fa2a8c9d9b5d1d7280c9bad2b007Chris Lattner else if (getToolChain().getArchName() == "i386") 72386ed3a326342fa2a8c9d9b5d1d7280c9bad2b007Chris Lattner CPUName = "i586"; 72495c0457054518102af6250e718a13a5b2ee5dbeaDaniel Dunbar } else if (getToolChain().getOS().startswith("openbsd")) { 72595c0457054518102af6250e718a13a5b2ee5dbeaDaniel Dunbar if (getToolChain().getArchName() == "x86_64") 72695c0457054518102af6250e718a13a5b2ee5dbeaDaniel Dunbar CPUName = "x86-64"; 72795c0457054518102af6250e718a13a5b2ee5dbeaDaniel Dunbar else if (getToolChain().getArchName() == "i386") 72895c0457054518102af6250e718a13a5b2ee5dbeaDaniel Dunbar CPUName = "i486"; 7298e50a96b387dca7525caa8a6add31420dd82a2cdBenjamin Kramer } else if (getToolChain().getOS().startswith("netbsd")) { 7308e50a96b387dca7525caa8a6add31420dd82a2cdBenjamin Kramer if (getToolChain().getArchName() == "x86_64") 7318e50a96b387dca7525caa8a6add31420dd82a2cdBenjamin Kramer CPUName = "x86-64"; 7328e50a96b387dca7525caa8a6add31420dd82a2cdBenjamin Kramer else if (getToolChain().getArchName() == "i386") 7338e50a96b387dca7525caa8a6add31420dd82a2cdBenjamin Kramer CPUName = "i486"; 7346acda16e9c194dcbd0dea64341e182bdb65d0f41Daniel Dunbar } else { 7356acda16e9c194dcbd0dea64341e182bdb65d0f41Daniel Dunbar if (getToolChain().getArchName() == "x86_64") 736f86feddbd5b13d2c144132e35d608fa630784dbbDaniel Dunbar CPUName = "x86-64"; 7376acda16e9c194dcbd0dea64341e182bdb65d0f41Daniel Dunbar else if (getToolChain().getArchName() == "i386") 738f86feddbd5b13d2c144132e35d608fa630784dbbDaniel Dunbar CPUName = "pentium4"; 7396acda16e9c194dcbd0dea64341e182bdb65d0f41Daniel Dunbar } 7406acda16e9c194dcbd0dea64341e182bdb65d0f41Daniel Dunbar } 7416acda16e9c194dcbd0dea64341e182bdb65d0f41Daniel Dunbar 742f86feddbd5b13d2c144132e35d608fa630784dbbDaniel Dunbar if (CPUName) { 74338b48afd338d494099697d2611e1f45e558e469eDaniel Dunbar CmdArgs.push_back("-target-cpu"); 744f86feddbd5b13d2c144132e35d608fa630784dbbDaniel Dunbar CmdArgs.push_back(CPUName); 745f86feddbd5b13d2c144132e35d608fa630784dbbDaniel Dunbar } 746f86feddbd5b13d2c144132e35d608fa630784dbbDaniel Dunbar 747cdd9686b890ebdc10039ae256ef4c9dfb5ebacb7Daniel Dunbar for (arg_iterator it = Args.filtered_begin(options::OPT_m_x86_Features_Group), 748cdd9686b890ebdc10039ae256ef4c9dfb5ebacb7Daniel Dunbar ie = Args.filtered_end(); it != ie; ++it) { 7497e4953e5c60409007545288f14b430bd23d68570Daniel Dunbar llvm::StringRef Name = (*it)->getOption().getName(); 7507e4953e5c60409007545288f14b430bd23d68570Daniel Dunbar (*it)->claim(); 7516acda16e9c194dcbd0dea64341e182bdb65d0f41Daniel Dunbar 752cdd9686b890ebdc10039ae256ef4c9dfb5ebacb7Daniel Dunbar // Skip over "-m". 753cdd9686b890ebdc10039ae256ef4c9dfb5ebacb7Daniel Dunbar assert(Name.startswith("-m") && "Invalid feature name."); 754cdd9686b890ebdc10039ae256ef4c9dfb5ebacb7Daniel Dunbar Name = Name.substr(2); 7556acda16e9c194dcbd0dea64341e182bdb65d0f41Daniel Dunbar 756cdd9686b890ebdc10039ae256ef4c9dfb5ebacb7Daniel Dunbar bool IsNegative = Name.startswith("no-"); 757cdd9686b890ebdc10039ae256ef4c9dfb5ebacb7Daniel Dunbar if (IsNegative) 758cdd9686b890ebdc10039ae256ef4c9dfb5ebacb7Daniel Dunbar Name = Name.substr(3); 7596acda16e9c194dcbd0dea64341e182bdb65d0f41Daniel Dunbar 760cdd9686b890ebdc10039ae256ef4c9dfb5ebacb7Daniel Dunbar CmdArgs.push_back("-target-feature"); 761cdd9686b890ebdc10039ae256ef4c9dfb5ebacb7Daniel Dunbar CmdArgs.push_back(Args.MakeArgString((IsNegative ? "-" : "+") + Name)); 7626acda16e9c194dcbd0dea64341e182bdb65d0f41Daniel Dunbar } 7636acda16e9c194dcbd0dea64341e182bdb65d0f41Daniel Dunbar} 7646acda16e9c194dcbd0dea64341e182bdb65d0f41Daniel Dunbar 765525544de0835d5ee7497f4897e255727b162e0aaAnders Carlssonstatic bool 766525544de0835d5ee7497f4897e255727b162e0aaAnders CarlssonshouldUseExceptionTablesForObjCExceptions(const ArgList &Args, 767525544de0835d5ee7497f4897e255727b162e0aaAnders Carlsson const llvm::Triple &Triple) { 768525544de0835d5ee7497f4897e255727b162e0aaAnders Carlsson // We use the zero-cost exception tables for Objective-C if the non-fragile 769525544de0835d5ee7497f4897e255727b162e0aaAnders Carlsson // ABI is enabled or when compiling for x86_64 and ARM on Snow Leopard and 770525544de0835d5ee7497f4897e255727b162e0aaAnders Carlsson // later. 771525544de0835d5ee7497f4897e255727b162e0aaAnders Carlsson 772525544de0835d5ee7497f4897e255727b162e0aaAnders Carlsson if (Args.hasArg(options::OPT_fobjc_nonfragile_abi)) 773525544de0835d5ee7497f4897e255727b162e0aaAnders Carlsson return true; 774525544de0835d5ee7497f4897e255727b162e0aaAnders Carlsson 775525544de0835d5ee7497f4897e255727b162e0aaAnders Carlsson if (Triple.getOS() != llvm::Triple::Darwin) 776525544de0835d5ee7497f4897e255727b162e0aaAnders Carlsson return false; 777525544de0835d5ee7497f4897e255727b162e0aaAnders Carlsson 778525544de0835d5ee7497f4897e255727b162e0aaAnders Carlsson return (Triple.getDarwinMajorNumber() >= 9 && 779525544de0835d5ee7497f4897e255727b162e0aaAnders Carlsson (Triple.getArch() == llvm::Triple::x86_64 || 780525544de0835d5ee7497f4897e255727b162e0aaAnders Carlsson Triple.getArch() == llvm::Triple::arm)); 781525544de0835d5ee7497f4897e255727b162e0aaAnders Carlsson} 782525544de0835d5ee7497f4897e255727b162e0aaAnders Carlsson 78315348aeb81285c75b2e92b5bf8d2db3445d147c2Anders Carlsson/// addExceptionArgs - Adds exception related arguments to the driver command 78415348aeb81285c75b2e92b5bf8d2db3445d147c2Anders Carlsson/// arguments. There's a master flag, -fexceptions and also language specific 78515348aeb81285c75b2e92b5bf8d2db3445d147c2Anders Carlsson/// flags to enable/disable C++ and Objective-C exceptions. 78615348aeb81285c75b2e92b5bf8d2db3445d147c2Anders Carlsson/// This makes it possible to for example disable C++ exceptions but enable 78715348aeb81285c75b2e92b5bf8d2db3445d147c2Anders Carlsson/// Objective-C exceptions. 78815348aeb81285c75b2e92b5bf8d2db3445d147c2Anders Carlssonstatic void addExceptionArgs(const ArgList &Args, types::ID InputType, 78915348aeb81285c75b2e92b5bf8d2db3445d147c2Anders Carlsson const llvm::Triple &Triple, 79015348aeb81285c75b2e92b5bf8d2db3445d147c2Anders Carlsson bool KernelOrKext, bool IsRewriter, 79115348aeb81285c75b2e92b5bf8d2db3445d147c2Anders Carlsson ArgStringList &CmdArgs) { 79215348aeb81285c75b2e92b5bf8d2db3445d147c2Anders Carlsson if (KernelOrKext) 79315348aeb81285c75b2e92b5bf8d2db3445d147c2Anders Carlsson return; 79415348aeb81285c75b2e92b5bf8d2db3445d147c2Anders Carlsson 79515348aeb81285c75b2e92b5bf8d2db3445d147c2Anders Carlsson // Exceptions are enabled by default. 79615348aeb81285c75b2e92b5bf8d2db3445d147c2Anders Carlsson bool ExceptionsEnabled = true; 79715348aeb81285c75b2e92b5bf8d2db3445d147c2Anders Carlsson 79815348aeb81285c75b2e92b5bf8d2db3445d147c2Anders Carlsson // This keeps track of whether exceptions were explicitly turned on or off. 79915348aeb81285c75b2e92b5bf8d2db3445d147c2Anders Carlsson bool DidHaveExplicitExceptionFlag = false; 80015348aeb81285c75b2e92b5bf8d2db3445d147c2Anders Carlsson 801f759df06d997050559fd925758bcd2cdef24db05Rafael Espindola if (Arg *A = Args.getLastArg(options::OPT_fexceptions, 802f759df06d997050559fd925758bcd2cdef24db05Rafael Espindola options::OPT_fno_exceptions)) { 803f759df06d997050559fd925758bcd2cdef24db05Rafael Espindola if (A->getOption().matches(options::OPT_fexceptions)) 80415348aeb81285c75b2e92b5bf8d2db3445d147c2Anders Carlsson ExceptionsEnabled = true; 80515348aeb81285c75b2e92b5bf8d2db3445d147c2Anders Carlsson else 80615348aeb81285c75b2e92b5bf8d2db3445d147c2Anders Carlsson ExceptionsEnabled = false; 80715348aeb81285c75b2e92b5bf8d2db3445d147c2Anders Carlsson 80815348aeb81285c75b2e92b5bf8d2db3445d147c2Anders Carlsson DidHaveExplicitExceptionFlag = true; 809f759df06d997050559fd925758bcd2cdef24db05Rafael Espindola } 8101a2cd4fd5d384faf171a39dea7136ca4672ac35eDaniel Dunbar 81115348aeb81285c75b2e92b5bf8d2db3445d147c2Anders Carlsson bool ShouldUseExceptionTables = false; 81215348aeb81285c75b2e92b5bf8d2db3445d147c2Anders Carlsson 81315348aeb81285c75b2e92b5bf8d2db3445d147c2Anders Carlsson // Exception tables and cleanups can be enabled with -fexceptions even if the 81415348aeb81285c75b2e92b5bf8d2db3445d147c2Anders Carlsson // language itself doesn't support exceptions. 81515348aeb81285c75b2e92b5bf8d2db3445d147c2Anders Carlsson if (ExceptionsEnabled && DidHaveExplicitExceptionFlag) 81615348aeb81285c75b2e92b5bf8d2db3445d147c2Anders Carlsson ShouldUseExceptionTables = true; 81715348aeb81285c75b2e92b5bf8d2db3445d147c2Anders Carlsson 81815348aeb81285c75b2e92b5bf8d2db3445d147c2Anders Carlsson if (types::isObjC(InputType)) { 81915348aeb81285c75b2e92b5bf8d2db3445d147c2Anders Carlsson bool ObjCExceptionsEnabled = ExceptionsEnabled; 82015348aeb81285c75b2e92b5bf8d2db3445d147c2Anders Carlsson 82115348aeb81285c75b2e92b5bf8d2db3445d147c2Anders Carlsson if (Arg *A = Args.getLastArg(options::OPT_fobjc_exceptions, 82215348aeb81285c75b2e92b5bf8d2db3445d147c2Anders Carlsson options::OPT_fno_objc_exceptions, 82315348aeb81285c75b2e92b5bf8d2db3445d147c2Anders Carlsson options::OPT_fexceptions, 82415348aeb81285c75b2e92b5bf8d2db3445d147c2Anders Carlsson options::OPT_fno_exceptions)) { 82515348aeb81285c75b2e92b5bf8d2db3445d147c2Anders Carlsson if (A->getOption().matches(options::OPT_fobjc_exceptions)) 82615348aeb81285c75b2e92b5bf8d2db3445d147c2Anders Carlsson ObjCExceptionsEnabled = true; 82715348aeb81285c75b2e92b5bf8d2db3445d147c2Anders Carlsson else if (A->getOption().matches(options::OPT_fno_objc_exceptions)) 82815348aeb81285c75b2e92b5bf8d2db3445d147c2Anders Carlsson ObjCExceptionsEnabled = false; 82915348aeb81285c75b2e92b5bf8d2db3445d147c2Anders Carlsson } 83015348aeb81285c75b2e92b5bf8d2db3445d147c2Anders Carlsson 83115348aeb81285c75b2e92b5bf8d2db3445d147c2Anders Carlsson if (ObjCExceptionsEnabled) { 83215348aeb81285c75b2e92b5bf8d2db3445d147c2Anders Carlsson CmdArgs.push_back("-fobjc-exceptions"); 83315348aeb81285c75b2e92b5bf8d2db3445d147c2Anders Carlsson 83415348aeb81285c75b2e92b5bf8d2db3445d147c2Anders Carlsson ShouldUseExceptionTables |= 83515348aeb81285c75b2e92b5bf8d2db3445d147c2Anders Carlsson shouldUseExceptionTablesForObjCExceptions(Args, Triple); 83615348aeb81285c75b2e92b5bf8d2db3445d147c2Anders Carlsson } 83715348aeb81285c75b2e92b5bf8d2db3445d147c2Anders Carlsson } 83885caf03ee49c4de87ee9624a9b725ef5d20ee624Fariborz Jahanian 83915348aeb81285c75b2e92b5bf8d2db3445d147c2Anders Carlsson if (types::isCXX(InputType)) { 84015348aeb81285c75b2e92b5bf8d2db3445d147c2Anders Carlsson bool CXXExceptionsEnabled = ExceptionsEnabled; 8411a2cd4fd5d384faf171a39dea7136ca4672ac35eDaniel Dunbar 84215348aeb81285c75b2e92b5bf8d2db3445d147c2Anders Carlsson if (Arg *A = Args.getLastArg(options::OPT_fcxx_exceptions, 84315348aeb81285c75b2e92b5bf8d2db3445d147c2Anders Carlsson options::OPT_fno_cxx_exceptions, 84415348aeb81285c75b2e92b5bf8d2db3445d147c2Anders Carlsson options::OPT_fexceptions, 84515348aeb81285c75b2e92b5bf8d2db3445d147c2Anders Carlsson options::OPT_fno_exceptions)) { 84615348aeb81285c75b2e92b5bf8d2db3445d147c2Anders Carlsson if (A->getOption().matches(options::OPT_fcxx_exceptions)) 84715348aeb81285c75b2e92b5bf8d2db3445d147c2Anders Carlsson CXXExceptionsEnabled = true; 84843f220f6d74e01f2606e429810484177903a28e6Chandler Carruth else if (A->getOption().matches(options::OPT_fno_cxx_exceptions)) 84915348aeb81285c75b2e92b5bf8d2db3445d147c2Anders Carlsson CXXExceptionsEnabled = false; 85015348aeb81285c75b2e92b5bf8d2db3445d147c2Anders Carlsson } 85115348aeb81285c75b2e92b5bf8d2db3445d147c2Anders Carlsson 85215348aeb81285c75b2e92b5bf8d2db3445d147c2Anders Carlsson if (CXXExceptionsEnabled) { 85315348aeb81285c75b2e92b5bf8d2db3445d147c2Anders Carlsson CmdArgs.push_back("-fcxx-exceptions"); 85415348aeb81285c75b2e92b5bf8d2db3445d147c2Anders Carlsson 85515348aeb81285c75b2e92b5bf8d2db3445d147c2Anders Carlsson ShouldUseExceptionTables = true; 85615348aeb81285c75b2e92b5bf8d2db3445d147c2Anders Carlsson } 85715348aeb81285c75b2e92b5bf8d2db3445d147c2Anders Carlsson } 85815348aeb81285c75b2e92b5bf8d2db3445d147c2Anders Carlsson 85915348aeb81285c75b2e92b5bf8d2db3445d147c2Anders Carlsson if (ShouldUseExceptionTables) 86015348aeb81285c75b2e92b5bf8d2db3445d147c2Anders Carlsson CmdArgs.push_back("-fexceptions"); 861f759df06d997050559fd925758bcd2cdef24db05Rafael Espindola} 862f759df06d997050559fd925758bcd2cdef24db05Rafael Espindola 86347ac7d27c44bd64a7d0fc03d4babc196cf2b8230Daniel Dunbarvoid Clang::ConstructJob(Compilation &C, const JobAction &JA, 864871adcf4e41285e3f4c3b62eaa1b2e05b60b92daDaniel Dunbar const InputInfo &Output, 86562cf601812e03dd9bc5df42b8ef06a0cdedc38bfDaniel Dunbar const InputInfoList &Inputs, 8661d46033f760ba5fd266ce59fe391fac473f04f52Daniel Dunbar const ArgList &Args, 86747ac7d27c44bd64a7d0fc03d4babc196cf2b8230Daniel Dunbar const char *LinkingOutput) const { 8680a80ba74ffa3d3df55abfbc4474d7470c7c923e3Daniel Dunbar bool KernelOrKext = Args.hasArg(options::OPT_mkernel, 8690a80ba74ffa3d3df55abfbc4474d7470c7c923e3Daniel Dunbar options::OPT_fapple_kext); 870ee788e70fcd0adf76103b17c78ac658d4ea30c9bDaniel Dunbar const Driver &D = getToolChain().getDriver(); 871b488c1dac8e53206f07103d794a62a3f5012c0f4Daniel Dunbar ArgStringList CmdArgs; 872b488c1dac8e53206f07103d794a62a3f5012c0f4Daniel Dunbar 873077ba6a3ac3628afb0d3c460e81ce013bccbdbedDaniel Dunbar assert(Inputs.size() == 1 && "Unable to handle multiple inputs."); 874077ba6a3ac3628afb0d3c460e81ce013bccbdbedDaniel Dunbar 8758ff5b28d6efcffe2251e77634c7edf83a4763344Daniel Dunbar // Invoke ourselves in -cc1 mode. 8768ff5b28d6efcffe2251e77634c7edf83a4763344Daniel Dunbar // 8778ff5b28d6efcffe2251e77634c7edf83a4763344Daniel Dunbar // FIXME: Implement custom jobs for internal actions. 8788ff5b28d6efcffe2251e77634c7edf83a4763344Daniel Dunbar CmdArgs.push_back("-cc1"); 8798ff5b28d6efcffe2251e77634c7edf83a4763344Daniel Dunbar 880dd4fe00f03d8749b283948ea86aa1e4a53ed21abDaniel Dunbar // Add the "effective" target triple. 881af07f936b698575f2c91f1c1134c116f1ef0deddDaniel Dunbar CmdArgs.push_back("-triple"); 88200577ada44c889fbe311d61c51a8da89e65c7c9aDaniel Dunbar std::string TripleStr = getToolChain().ComputeEffectiveClangTriple(Args); 883dd4fe00f03d8749b283948ea86aa1e4a53ed21abDaniel Dunbar CmdArgs.push_back(Args.MakeArgString(TripleStr)); 884728a512753d85a6ccaae34e81385c8665c2de0e1Daniel Dunbar 885dd4fe00f03d8749b283948ea86aa1e4a53ed21abDaniel Dunbar // Select the appropriate action. 8865314e448631f166c89e908cc1ab45dc7eda916baDaniel Dunbar bool IsRewriter = false; 8871d46033f760ba5fd266ce59fe391fac473f04f52Daniel Dunbar if (isa<AnalyzeJobAction>(JA)) { 8881d46033f760ba5fd266ce59fe391fac473f04f52Daniel Dunbar assert(JA.getType() == types::TY_Plist && "Invalid output type."); 8891d46033f760ba5fd266ce59fe391fac473f04f52Daniel Dunbar CmdArgs.push_back("-analyze"); 8901d46033f760ba5fd266ce59fe391fac473f04f52Daniel Dunbar } else if (isa<PreprocessJobAction>(JA)) { 891cd8e4c44dd068956e9181381be3ee2d49a0fac52Daniel Dunbar if (Output.getType() == types::TY_Dependencies) 892cd8e4c44dd068956e9181381be3ee2d49a0fac52Daniel Dunbar CmdArgs.push_back("-Eonly"); 893cd8e4c44dd068956e9181381be3ee2d49a0fac52Daniel Dunbar else 894cd8e4c44dd068956e9181381be3ee2d49a0fac52Daniel Dunbar CmdArgs.push_back("-E"); 8958767cbc475ed96397b6f08617814eeb9cab121bdDaniel Dunbar } else if (isa<AssembleJobAction>(JA)) { 8968767cbc475ed96397b6f08617814eeb9cab121bdDaniel Dunbar CmdArgs.push_back("-emit-obj"); 8979929800b8dfced61e9c97dc8d6e71e144ebf8accDaniel Dunbar 8989929800b8dfced61e9c97dc8d6e71e144ebf8accDaniel Dunbar // At -O0, we use -mrelax-all by default. 8999929800b8dfced61e9c97dc8d6e71e144ebf8accDaniel Dunbar bool IsOpt = false; 9009929800b8dfced61e9c97dc8d6e71e144ebf8accDaniel Dunbar if (Arg *A = Args.getLastArg(options::OPT_O_Group)) 9019929800b8dfced61e9c97dc8d6e71e144ebf8accDaniel Dunbar IsOpt = !A->getOption().matches(options::OPT_O0); 9029929800b8dfced61e9c97dc8d6e71e144ebf8accDaniel Dunbar if (Args.hasFlag(options::OPT_mrelax_all, 9039929800b8dfced61e9c97dc8d6e71e144ebf8accDaniel Dunbar options::OPT_mno_relax_all, 9049929800b8dfced61e9c97dc8d6e71e144ebf8accDaniel Dunbar !IsOpt)) 9059929800b8dfced61e9c97dc8d6e71e144ebf8accDaniel Dunbar CmdArgs.push_back("-mrelax-all"); 906ca0e0545c216afaacba6da6c82a270dc2efc4e3fDaniel Dunbar 907fcec10bded7b9b9268af5232fa17617db0df68edDaniel Dunbar // When using an integrated assembler, translate -Wa, and -Xassembler 908fcec10bded7b9b9268af5232fa17617db0df68edDaniel Dunbar // options. 909fcec10bded7b9b9268af5232fa17617db0df68edDaniel Dunbar for (arg_iterator it = Args.filtered_begin(options::OPT_Wa_COMMA, 910fcec10bded7b9b9268af5232fa17617db0df68edDaniel Dunbar options::OPT_Xassembler), 911fcec10bded7b9b9268af5232fa17617db0df68edDaniel Dunbar ie = Args.filtered_end(); it != ie; ++it) { 912fcec10bded7b9b9268af5232fa17617db0df68edDaniel Dunbar const Arg *A = *it; 913fcec10bded7b9b9268af5232fa17617db0df68edDaniel Dunbar A->claim(); 914fcec10bded7b9b9268af5232fa17617db0df68edDaniel Dunbar 915fcec10bded7b9b9268af5232fa17617db0df68edDaniel Dunbar for (unsigned i = 0, e = A->getNumValues(); i != e; ++i) { 916fcec10bded7b9b9268af5232fa17617db0df68edDaniel Dunbar llvm::StringRef Value = A->getValue(Args, i); 917fcec10bded7b9b9268af5232fa17617db0df68edDaniel Dunbar 918fcec10bded7b9b9268af5232fa17617db0df68edDaniel Dunbar if (Value == "-force_cpusubtype_ALL") { 919fcec10bded7b9b9268af5232fa17617db0df68edDaniel Dunbar // Do nothing, this is the default and we don't support anything else. 920b14eed0ed44ed3af881219dab7dc6464cad5303bDaniel Dunbar } else if (Value == "-L") { 921b14eed0ed44ed3af881219dab7dc6464cad5303bDaniel Dunbar // We don't support -L yet, but it isn't important enough to error 922b14eed0ed44ed3af881219dab7dc6464cad5303bDaniel Dunbar // on. No one should really be using it for a semantic change. 923b14eed0ed44ed3af881219dab7dc6464cad5303bDaniel Dunbar D.Diag(clang::diag::warn_drv_unsupported_option_argument) 924b14eed0ed44ed3af881219dab7dc6464cad5303bDaniel Dunbar << A->getOption().getName() << Value; 925fcec10bded7b9b9268af5232fa17617db0df68edDaniel Dunbar } else { 926fcec10bded7b9b9268af5232fa17617db0df68edDaniel Dunbar D.Diag(clang::diag::err_drv_unsupported_option_argument) 927fcec10bded7b9b9268af5232fa17617db0df68edDaniel Dunbar << A->getOption().getName() << Value; 928fcec10bded7b9b9268af5232fa17617db0df68edDaniel Dunbar } 929fcec10bded7b9b9268af5232fa17617db0df68edDaniel Dunbar } 930fcec10bded7b9b9268af5232fa17617db0df68edDaniel Dunbar } 931d02bba8e2abceebd91c162ee4479623791f455b5Daniel Dunbar 932d02bba8e2abceebd91c162ee4479623791f455b5Daniel Dunbar // Also ignore explicit -force_cpusubtype_ALL option. 933d02bba8e2abceebd91c162ee4479623791f455b5Daniel Dunbar (void) Args.hasArg(options::OPT_force__cpusubtype__ALL); 9341d46033f760ba5fd266ce59fe391fac473f04f52Daniel Dunbar } else if (isa<PrecompileJobAction>(JA)) { 935e5c35377020d6c38d16434c9f373a5fa9bb4f2ebArgyrios Kyrtzidis // Use PCH if the user requested it. 9360ebd9321ba380471010341f24c874f46f56e7581Daniel Dunbar bool UsePCH = D.CCCUsePCH; 9370ebd9321ba380471010341f24c874f46f56e7581Daniel Dunbar 9380ebd9321ba380471010341f24c874f46f56e7581Daniel Dunbar if (UsePCH) 939df91ef3d6c55692a0236f67b6c6b134a3bf84098Douglas Gregor CmdArgs.push_back("-emit-pch"); 940df91ef3d6c55692a0236f67b6c6b134a3bf84098Douglas Gregor else 941df91ef3d6c55692a0236f67b6c6b134a3bf84098Douglas Gregor CmdArgs.push_back("-emit-pth"); 9421d46033f760ba5fd266ce59fe391fac473f04f52Daniel Dunbar } else { 9431d46033f760ba5fd266ce59fe391fac473f04f52Daniel Dunbar assert(isa<CompileJobAction>(JA) && "Invalid action for clang tool."); 944c21c485b4fb58ef5d55cf3e523263dd824a2ace4Daniel Dunbar 9451d46033f760ba5fd266ce59fe391fac473f04f52Daniel Dunbar if (JA.getType() == types::TY_Nothing) { 9461d46033f760ba5fd266ce59fe391fac473f04f52Daniel Dunbar CmdArgs.push_back("-fsyntax-only"); 9476c6424bc0d3b5f080a97b5f6ef4a8d70c38e38f5Daniel Dunbar } else if (JA.getType() == types::TY_LLVM_IR || 9486c6424bc0d3b5f080a97b5f6ef4a8d70c38e38f5Daniel Dunbar JA.getType() == types::TY_LTO_IR) { 9491d46033f760ba5fd266ce59fe391fac473f04f52Daniel Dunbar CmdArgs.push_back("-emit-llvm"); 9506c6424bc0d3b5f080a97b5f6ef4a8d70c38e38f5Daniel Dunbar } else if (JA.getType() == types::TY_LLVM_BC || 9516c6424bc0d3b5f080a97b5f6ef4a8d70c38e38f5Daniel Dunbar JA.getType() == types::TY_LTO_BC) { 9521d46033f760ba5fd266ce59fe391fac473f04f52Daniel Dunbar CmdArgs.push_back("-emit-llvm-bc"); 9531d46033f760ba5fd266ce59fe391fac473f04f52Daniel Dunbar } else if (JA.getType() == types::TY_PP_Asm) { 954e3b8d07e02861d245612b02b5f5a2c1f34b2a394Daniel Dunbar CmdArgs.push_back("-S"); 9555915fbf310e171c4cd3c2af05e9de360c0fa988aDaniel Dunbar } else if (JA.getType() == types::TY_AST) { 9565915fbf310e171c4cd3c2af05e9de360c0fa988aDaniel Dunbar CmdArgs.push_back("-emit-pch"); 95764952508c2b0c8bffb45c8b410f0af3d2457f59bDaniel Dunbar } else if (JA.getType() == types::TY_RewrittenObjC) { 95864952508c2b0c8bffb45c8b410f0af3d2457f59bDaniel Dunbar CmdArgs.push_back("-rewrite-objc"); 9595314e448631f166c89e908cc1ab45dc7eda916baDaniel Dunbar IsRewriter = true; 96064952508c2b0c8bffb45c8b410f0af3d2457f59bDaniel Dunbar } else { 96164952508c2b0c8bffb45c8b410f0af3d2457f59bDaniel Dunbar assert(JA.getType() == types::TY_PP_Asm && 96264952508c2b0c8bffb45c8b410f0af3d2457f59bDaniel Dunbar "Unexpected output type!"); 9631d46033f760ba5fd266ce59fe391fac473f04f52Daniel Dunbar } 9641d46033f760ba5fd266ce59fe391fac473f04f52Daniel Dunbar } 9651d46033f760ba5fd266ce59fe391fac473f04f52Daniel Dunbar 9661d46033f760ba5fd266ce59fe391fac473f04f52Daniel Dunbar // The make clang go fast button. 9671d46033f760ba5fd266ce59fe391fac473f04f52Daniel Dunbar CmdArgs.push_back("-disable-free"); 9681d46033f760ba5fd266ce59fe391fac473f04f52Daniel Dunbar 969b689afb75049012a431d483432114ad5e75d4a92John McCall // Disable the verification pass in -asserts builds. 970b689afb75049012a431d483432114ad5e75d4a92John McCall#ifdef NDEBUG 971b689afb75049012a431d483432114ad5e75d4a92John McCall CmdArgs.push_back("-disable-llvm-verifier"); 972b689afb75049012a431d483432114ad5e75d4a92John McCall#endif 973b689afb75049012a431d483432114ad5e75d4a92John McCall 974c9abc043af88f90d177a5bd147f627b78ca49fdeDaniel Dunbar // Set the main file name, so that debug info works even with 975c9abc043af88f90d177a5bd147f627b78ca49fdeDaniel Dunbar // -save-temps. 976c9abc043af88f90d177a5bd147f627b78ca49fdeDaniel Dunbar CmdArgs.push_back("-main-file-name"); 977c9abc043af88f90d177a5bd147f627b78ca49fdeDaniel Dunbar CmdArgs.push_back(darwin::CC1::getBaseInputName(Args, Inputs)); 978c9abc043af88f90d177a5bd147f627b78ca49fdeDaniel Dunbar 9793bbc75302fd43cf13d868b46c94ff8794b302e43Daniel Dunbar // Some flags which affect the language (via preprocessor 9803bbc75302fd43cf13d868b46c94ff8794b302e43Daniel Dunbar // defines). See darwin::CC1::AddCPPArgs. 9813bbc75302fd43cf13d868b46c94ff8794b302e43Daniel Dunbar if (Args.hasArg(options::OPT_static)) 9823bbc75302fd43cf13d868b46c94ff8794b302e43Daniel Dunbar CmdArgs.push_back("-static-define"); 9833bbc75302fd43cf13d868b46c94ff8794b302e43Daniel Dunbar 9841d46033f760ba5fd266ce59fe391fac473f04f52Daniel Dunbar if (isa<AnalyzeJobAction>(JA)) { 985b8bb3e797c5687715c6d9d960ee573e4d0e62230Ted Kremenek // Enable region store model by default. 986b8bb3e797c5687715c6d9d960ee573e4d0e62230Ted Kremenek CmdArgs.push_back("-analyzer-store=region"); 987b8bb3e797c5687715c6d9d960ee573e4d0e62230Ted Kremenek 988b40d06dec23b53bbc1157a9adae7f887be31aa3bTed Kremenek // Treat blocks as analysis entry points. 989b40d06dec23b53bbc1157a9adae7f887be31aa3bTed Kremenek CmdArgs.push_back("-analyzer-opt-analyze-nested-blocks"); 990b40d06dec23b53bbc1157a9adae7f887be31aa3bTed Kremenek 9911d46033f760ba5fd266ce59fe391fac473f04f52Daniel Dunbar // Add default argument set. 992d8fc0f2e7751cf31cec5c2f3cc6a0b447e9debb3Daniel Dunbar if (!Args.hasArg(options::OPT__analyzer_no_default_checks)) { 993f0335171b4908939bac410f865fc09ceb06ac632Ted Kremenek types::ID InputType = Inputs[0].getType(); 994f0335171b4908939bac410f865fc09ceb06ac632Ted Kremenek 995f0335171b4908939bac410f865fc09ceb06ac632Ted Kremenek // Checks to perform for all language types. 996027a6abdd6cedc0b8203da72eed6d15c796dce9dArgyrios Kyrtzidis 997027a6abdd6cedc0b8203da72eed6d15c796dce9dArgyrios Kyrtzidis CmdArgs.push_back("-analyzer-checker=core"); 998027a6abdd6cedc0b8203da72eed6d15c796dce9dArgyrios Kyrtzidis if (getToolChain().getTriple().getOS() != llvm::Triple::Win32) 999027a6abdd6cedc0b8203da72eed6d15c796dce9dArgyrios Kyrtzidis CmdArgs.push_back("-analyzer-checker=unix"); 1000027a6abdd6cedc0b8203da72eed6d15c796dce9dArgyrios Kyrtzidis if (getToolChain().getTriple().getVendor() == llvm::Triple::Apple) 1001027a6abdd6cedc0b8203da72eed6d15c796dce9dArgyrios Kyrtzidis CmdArgs.push_back("-analyzer-checker=macosx"); 1002027a6abdd6cedc0b8203da72eed6d15c796dce9dArgyrios Kyrtzidis 1003a676d501a001657892c483bd4d651650e168f337Argyrios Kyrtzidis CmdArgs.push_back("-analyzer-checker=DeadStores"); 1004a676d501a001657892c483bd4d651650e168f337Argyrios Kyrtzidis 1005f0335171b4908939bac410f865fc09ceb06ac632Ted Kremenek // Checks to perform for Objective-C/Objective-C++. 1006f0335171b4908939bac410f865fc09ceb06ac632Ted Kremenek if (types::isObjC(InputType)) { 100743dee220252ef0b42c5f8a3bb1eca97f84f2565fArgyrios Kyrtzidis // Enable all checkers in 'cocoa' package. 100843dee220252ef0b42c5f8a3bb1eca97f84f2565fArgyrios Kyrtzidis CmdArgs.push_back("-analyzer-checker=cocoa"); 1009f0335171b4908939bac410f865fc09ceb06ac632Ted Kremenek } 1010f0335171b4908939bac410f865fc09ceb06ac632Ted Kremenek 10118899ab01d43ca7359cd852e58c5c3182cd0979c5Argyrios Kyrtzidis CmdArgs.push_back("-analyzer-eagerly-assume"); 1012d8fc0f2e7751cf31cec5c2f3cc6a0b447e9debb3Daniel Dunbar } 1013d8fc0f2e7751cf31cec5c2f3cc6a0b447e9debb3Daniel Dunbar 1014d8fc0f2e7751cf31cec5c2f3cc6a0b447e9debb3Daniel Dunbar // Set the output format. The default is plist, for (lame) historical 1015d8fc0f2e7751cf31cec5c2f3cc6a0b447e9debb3Daniel Dunbar // reasons. 1016d8fc0f2e7751cf31cec5c2f3cc6a0b447e9debb3Daniel Dunbar CmdArgs.push_back("-analyzer-output"); 1017d8fc0f2e7751cf31cec5c2f3cc6a0b447e9debb3Daniel Dunbar if (Arg *A = Args.getLastArg(options::OPT__analyzer_output)) 1018d8fc0f2e7751cf31cec5c2f3cc6a0b447e9debb3Daniel Dunbar CmdArgs.push_back(A->getValue(Args)); 1019d8fc0f2e7751cf31cec5c2f3cc6a0b447e9debb3Daniel Dunbar else 1020d8fc0f2e7751cf31cec5c2f3cc6a0b447e9debb3Daniel Dunbar CmdArgs.push_back("plist"); 10211d46033f760ba5fd266ce59fe391fac473f04f52Daniel Dunbar 10220647a7b9ad844565b8a4b5e1a5de882dd64efabfTed Kremenek // Disable the presentation of standard compiler warnings when 10230647a7b9ad844565b8a4b5e1a5de882dd64efabfTed Kremenek // using --analyze. We only want to show static analyzer diagnostics 10240647a7b9ad844565b8a4b5e1a5de882dd64efabfTed Kremenek // or frontend errors. 10250647a7b9ad844565b8a4b5e1a5de882dd64efabfTed Kremenek CmdArgs.push_back("-w"); 10260647a7b9ad844565b8a4b5e1a5de882dd64efabfTed Kremenek 10271d46033f760ba5fd266ce59fe391fac473f04f52Daniel Dunbar // Add -Xanalyzer arguments when running as analyzer. 10281d46033f760ba5fd266ce59fe391fac473f04f52Daniel Dunbar Args.AddAllArgValues(CmdArgs, options::OPT_Xanalyzer); 10291eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump } 10301eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump 1031e2fd66418eca3d70cf6b62087d745d0c5181db69Daniel Dunbar CheckCodeGenerationOptions(D, Args); 1032e2fd66418eca3d70cf6b62087d745d0c5181db69Daniel Dunbar 1033bc85be85779a47bae728bbe6a2cd2e3732b1333dDaniel Dunbar // Perform argument translation for LLVM backend. This 1034bc85be85779a47bae728bbe6a2cd2e3732b1333dDaniel Dunbar // takes some care in reconciling with llvm-gcc. The 1035bc85be85779a47bae728bbe6a2cd2e3732b1333dDaniel Dunbar // issue is that llvm-gcc translates these options based on 1036bc85be85779a47bae728bbe6a2cd2e3732b1333dDaniel Dunbar // the values in cc1, whereas we are processing based on 1037bc85be85779a47bae728bbe6a2cd2e3732b1333dDaniel Dunbar // the driver arguments. 10389fd0b1f845a61e71dd8099f596532d34c519630aDaniel Dunbar 1039bc85be85779a47bae728bbe6a2cd2e3732b1333dDaniel Dunbar // This comes from the default translation the driver + cc1 1040bc85be85779a47bae728bbe6a2cd2e3732b1333dDaniel Dunbar // would do to enable flag_pic. 1041bc85be85779a47bae728bbe6a2cd2e3732b1333dDaniel Dunbar // 1042bc85be85779a47bae728bbe6a2cd2e3732b1333dDaniel Dunbar // FIXME: Centralize this code. 1043bc85be85779a47bae728bbe6a2cd2e3732b1333dDaniel Dunbar bool PICEnabled = (Args.hasArg(options::OPT_fPIC) || 1044bc85be85779a47bae728bbe6a2cd2e3732b1333dDaniel Dunbar Args.hasArg(options::OPT_fpic) || 1045bc85be85779a47bae728bbe6a2cd2e3732b1333dDaniel Dunbar Args.hasArg(options::OPT_fPIE) || 1046bc85be85779a47bae728bbe6a2cd2e3732b1333dDaniel Dunbar Args.hasArg(options::OPT_fpie)); 1047bc85be85779a47bae728bbe6a2cd2e3732b1333dDaniel Dunbar bool PICDisabled = (Args.hasArg(options::OPT_mkernel) || 1048bc85be85779a47bae728bbe6a2cd2e3732b1333dDaniel Dunbar Args.hasArg(options::OPT_static)); 1049bc85be85779a47bae728bbe6a2cd2e3732b1333dDaniel Dunbar const char *Model = getToolChain().GetForcedPicModel(); 1050bc85be85779a47bae728bbe6a2cd2e3732b1333dDaniel Dunbar if (!Model) { 1051bc85be85779a47bae728bbe6a2cd2e3732b1333dDaniel Dunbar if (Args.hasArg(options::OPT_mdynamic_no_pic)) 1052bc85be85779a47bae728bbe6a2cd2e3732b1333dDaniel Dunbar Model = "dynamic-no-pic"; 1053bc85be85779a47bae728bbe6a2cd2e3732b1333dDaniel Dunbar else if (PICDisabled) 1054bc85be85779a47bae728bbe6a2cd2e3732b1333dDaniel Dunbar Model = "static"; 1055bc85be85779a47bae728bbe6a2cd2e3732b1333dDaniel Dunbar else if (PICEnabled) 1056bc85be85779a47bae728bbe6a2cd2e3732b1333dDaniel Dunbar Model = "pic"; 10571d46033f760ba5fd266ce59fe391fac473f04f52Daniel Dunbar else 1058bc85be85779a47bae728bbe6a2cd2e3732b1333dDaniel Dunbar Model = getToolChain().GetDefaultRelocationModel(); 1059bc85be85779a47bae728bbe6a2cd2e3732b1333dDaniel Dunbar } 1060f219e7c1529fac29e34483667f740b452e5ef9ccDaniel Dunbar if (llvm::StringRef(Model) != "pic") { 1061f219e7c1529fac29e34483667f740b452e5ef9ccDaniel Dunbar CmdArgs.push_back("-mrelocation-model"); 1062f219e7c1529fac29e34483667f740b452e5ef9ccDaniel Dunbar CmdArgs.push_back(Model); 1063f219e7c1529fac29e34483667f740b452e5ef9ccDaniel Dunbar } 10641d46033f760ba5fd266ce59fe391fac473f04f52Daniel Dunbar 1065bc85be85779a47bae728bbe6a2cd2e3732b1333dDaniel Dunbar // Infer the __PIC__ value. 1066bc85be85779a47bae728bbe6a2cd2e3732b1333dDaniel Dunbar // 1067bc85be85779a47bae728bbe6a2cd2e3732b1333dDaniel Dunbar // FIXME: This isn't quite right on Darwin, which always sets 1068bc85be85779a47bae728bbe6a2cd2e3732b1333dDaniel Dunbar // __PIC__=2. 1069bc85be85779a47bae728bbe6a2cd2e3732b1333dDaniel Dunbar if (strcmp(Model, "pic") == 0 || strcmp(Model, "dynamic-no-pic") == 0) { 10707674352cf3e8f699914a2f739f1ae8c8c3480813Daniel Dunbar CmdArgs.push_back("-pic-level"); 10717674352cf3e8f699914a2f739f1ae8c8c3480813Daniel Dunbar CmdArgs.push_back(Args.hasArg(options::OPT_fPIC) ? "2" : "1"); 1072bc85be85779a47bae728bbe6a2cd2e3732b1333dDaniel Dunbar } 1073f219e7c1529fac29e34483667f740b452e5ef9ccDaniel Dunbar if (!Args.hasFlag(options::OPT_fmerge_all_constants, 1074f219e7c1529fac29e34483667f740b452e5ef9ccDaniel Dunbar options::OPT_fno_merge_all_constants)) 1075f219e7c1529fac29e34483667f740b452e5ef9ccDaniel Dunbar CmdArgs.push_back("-no-merge-all-constants"); 1076f219e7c1529fac29e34483667f740b452e5ef9ccDaniel Dunbar 1077f219e7c1529fac29e34483667f740b452e5ef9ccDaniel Dunbar // LLVM Code Generator Options. 10781d46033f760ba5fd266ce59fe391fac473f04f52Daniel Dunbar 107917d3fea677753e6e3e82ffe2cbdeccbf5f2e7497Daniel Dunbar if (Arg *A = Args.getLastArg(options::OPT_mregparm_EQ)) { 108017d3fea677753e6e3e82ffe2cbdeccbf5f2e7497Daniel Dunbar CmdArgs.push_back("-mregparm"); 108117d3fea677753e6e3e82ffe2cbdeccbf5f2e7497Daniel Dunbar CmdArgs.push_back(A->getValue(Args)); 108217d3fea677753e6e3e82ffe2cbdeccbf5f2e7497Daniel Dunbar } 108317d3fea677753e6e3e82ffe2cbdeccbf5f2e7497Daniel Dunbar 1084bc85be85779a47bae728bbe6a2cd2e3732b1333dDaniel Dunbar // FIXME: Set --enable-unsafe-fp-math. 108521656ddae8e81df04f142386337cb95a9e0f0971Benjamin Kramer if (Args.hasFlag(options::OPT_fno_omit_frame_pointer, 108621656ddae8e81df04f142386337cb95a9e0f0971Benjamin Kramer options::OPT_fomit_frame_pointer)) 1087f219e7c1529fac29e34483667f740b452e5ef9ccDaniel Dunbar CmdArgs.push_back("-mdisable-fp-elim"); 1088bc85be85779a47bae728bbe6a2cd2e3732b1333dDaniel Dunbar if (!Args.hasFlag(options::OPT_fzero_initialized_in_bss, 1089f219e7c1529fac29e34483667f740b452e5ef9ccDaniel Dunbar options::OPT_fno_zero_initialized_in_bss)) 1090f219e7c1529fac29e34483667f740b452e5ef9ccDaniel Dunbar CmdArgs.push_back("-mno-zero-initialized-in-bss"); 1091398c610b16728b4398214367dd0effd9d2e61340Daniel Dunbar if (!Args.hasFlag(options::OPT_fstrict_aliasing, 1092398c610b16728b4398214367dd0effd9d2e61340Daniel Dunbar options::OPT_fno_strict_aliasing, 1093398c610b16728b4398214367dd0effd9d2e61340Daniel Dunbar getToolChain().IsStrictAliasingDefault())) 10944d5625e15bb215c2241c022df8dc7b04438970c6Dan Gohman CmdArgs.push_back("-relaxed-aliasing"); 10951b71848c5238747ede9650b7907172f8a7e088a5Daniel Dunbar 10961b71848c5238747ede9650b7907172f8a7e088a5Daniel Dunbar // Decide whether to use verbose asm. Verbose assembly is the default on 10971b71848c5238747ede9650b7907172f8a7e088a5Daniel Dunbar // toolchains which have the integrated assembler on by default. 10981b71848c5238747ede9650b7907172f8a7e088a5Daniel Dunbar bool IsVerboseAsmDefault = getToolChain().IsIntegratedAssemblerDefault(); 10991b71848c5238747ede9650b7907172f8a7e088a5Daniel Dunbar if (Args.hasFlag(options::OPT_fverbose_asm, options::OPT_fno_verbose_asm, 110020249a1af2e462dcafdd6a350f1c7967b264ff25Michael J. Spencer IsVerboseAsmDefault) || 11011b71848c5238747ede9650b7907172f8a7e088a5Daniel Dunbar Args.hasArg(options::OPT_dA)) 1102f219e7c1529fac29e34483667f740b452e5ef9ccDaniel Dunbar CmdArgs.push_back("-masm-verbose"); 11031b71848c5238747ede9650b7907172f8a7e088a5Daniel Dunbar 1104f219e7c1529fac29e34483667f740b452e5ef9ccDaniel Dunbar if (Args.hasArg(options::OPT_fdebug_pass_structure)) { 1105f219e7c1529fac29e34483667f740b452e5ef9ccDaniel Dunbar CmdArgs.push_back("-mdebug-pass"); 1106f219e7c1529fac29e34483667f740b452e5ef9ccDaniel Dunbar CmdArgs.push_back("Structure"); 1107f219e7c1529fac29e34483667f740b452e5ef9ccDaniel Dunbar } 1108f219e7c1529fac29e34483667f740b452e5ef9ccDaniel Dunbar if (Args.hasArg(options::OPT_fdebug_pass_arguments)) { 1109f219e7c1529fac29e34483667f740b452e5ef9ccDaniel Dunbar CmdArgs.push_back("-mdebug-pass"); 1110f219e7c1529fac29e34483667f740b452e5ef9ccDaniel Dunbar CmdArgs.push_back("Arguments"); 1111f219e7c1529fac29e34483667f740b452e5ef9ccDaniel Dunbar } 11126bea73b3305a03479589e2642fbdcf6c096851aaDaniel Dunbar 1113d0c2ec44e093011256b6a0f57d455f36dffdea70John McCall // Enable -mconstructor-aliases except on darwin, where we have to 1114d0c2ec44e093011256b6a0f57d455f36dffdea70John McCall // work around a linker bug; see <rdar://problem/7651567>. 1115d0c2ec44e093011256b6a0f57d455f36dffdea70John McCall if (getToolChain().getTriple().getOS() != llvm::Triple::Darwin) 1116d0c2ec44e093011256b6a0f57d455f36dffdea70John McCall CmdArgs.push_back("-mconstructor-aliases"); 1117125b4cb35536e45201f8f2cb19ee620e3ad67c49NAKAMURA Takumi 11186f75550e40a9177db9979fc130ce3ece026b137dDouglas Gregor if (Args.hasArg(options::OPT_mms_bitfields)) { 11196f75550e40a9177db9979fc130ce3ece026b137dDouglas Gregor CmdArgs.push_back("-mms-bitfields"); 11206f75550e40a9177db9979fc130ce3ece026b137dDouglas Gregor } 1121d0c2ec44e093011256b6a0f57d455f36dffdea70John McCall 11226bea73b3305a03479589e2642fbdcf6c096851aaDaniel Dunbar // This is a coarse approximation of what llvm-gcc actually does, both 11236bea73b3305a03479589e2642fbdcf6c096851aaDaniel Dunbar // -fasynchronous-unwind-tables and -fnon-call-exceptions interact in more 11246bea73b3305a03479589e2642fbdcf6c096851aaDaniel Dunbar // complicated ways. 11256bea73b3305a03479589e2642fbdcf6c096851aaDaniel Dunbar bool AsynchronousUnwindTables = 11266bea73b3305a03479589e2642fbdcf6c096851aaDaniel Dunbar Args.hasFlag(options::OPT_fasynchronous_unwind_tables, 11276bea73b3305a03479589e2642fbdcf6c096851aaDaniel Dunbar options::OPT_fno_asynchronous_unwind_tables, 11286bea73b3305a03479589e2642fbdcf6c096851aaDaniel Dunbar getToolChain().IsUnwindTablesDefault() && 11290a80ba74ffa3d3df55abfbc4474d7470c7c923e3Daniel Dunbar !KernelOrKext); 11306bea73b3305a03479589e2642fbdcf6c096851aaDaniel Dunbar if (Args.hasFlag(options::OPT_funwind_tables, options::OPT_fno_unwind_tables, 11316bea73b3305a03479589e2642fbdcf6c096851aaDaniel Dunbar AsynchronousUnwindTables)) 1132f219e7c1529fac29e34483667f740b452e5ef9ccDaniel Dunbar CmdArgs.push_back("-munwind-tables"); 1133f219e7c1529fac29e34483667f740b452e5ef9ccDaniel Dunbar 1134f219e7c1529fac29e34483667f740b452e5ef9ccDaniel Dunbar if (Arg *A = Args.getLastArg(options::OPT_flimited_precision_EQ)) { 1135f219e7c1529fac29e34483667f740b452e5ef9ccDaniel Dunbar CmdArgs.push_back("-mlimit-float-precision"); 1136f219e7c1529fac29e34483667f740b452e5ef9ccDaniel Dunbar CmdArgs.push_back(A->getValue(Args)); 1137f219e7c1529fac29e34483667f740b452e5ef9ccDaniel Dunbar } 1138bc85be85779a47bae728bbe6a2cd2e3732b1333dDaniel Dunbar 1139868bd0aa9281929ef50d2e9a8c82a036906f53f5Daniel Dunbar // FIXME: Handle -mtune=. 1140868bd0aa9281929ef50d2e9a8c82a036906f53f5Daniel Dunbar (void) Args.hasArg(options::OPT_mtune_EQ); 1141bc85be85779a47bae728bbe6a2cd2e3732b1333dDaniel Dunbar 11428e9ef0d87dad25f02e5abc6facf528778236115aBenjamin Kramer if (Arg *A = Args.getLastArg(options::OPT_mcmodel_EQ)) { 1143f219e7c1529fac29e34483667f740b452e5ef9ccDaniel Dunbar CmdArgs.push_back("-mcode-model"); 11448e9ef0d87dad25f02e5abc6facf528778236115aBenjamin Kramer CmdArgs.push_back(A->getValue(Args)); 11458e9ef0d87dad25f02e5abc6facf528778236115aBenjamin Kramer } 11468e9ef0d87dad25f02e5abc6facf528778236115aBenjamin Kramer 11476acda16e9c194dcbd0dea64341e182bdb65d0f41Daniel Dunbar // Add target specific cpu and features flags. 11486acda16e9c194dcbd0dea64341e182bdb65d0f41Daniel Dunbar switch(getToolChain().getTriple().getArch()) { 11496acda16e9c194dcbd0dea64341e182bdb65d0f41Daniel Dunbar default: 11506acda16e9c194dcbd0dea64341e182bdb65d0f41Daniel Dunbar break; 1151868bd0aa9281929ef50d2e9a8c82a036906f53f5Daniel Dunbar 1152b163ef7e7a5d904ef0962a7c38c460be083c4d63Daniel Dunbar case llvm::Triple::arm: 1153b163ef7e7a5d904ef0962a7c38c460be083c4d63Daniel Dunbar case llvm::Triple::thumb: 1154b163ef7e7a5d904ef0962a7c38c460be083c4d63Daniel Dunbar AddARMTargetArgs(Args, CmdArgs); 1155b163ef7e7a5d904ef0962a7c38c460be083c4d63Daniel Dunbar break; 1156b163ef7e7a5d904ef0962a7c38c460be083c4d63Daniel Dunbar 1157ed734737d5af31906e30e537d4a41c760ddcfc59Eric Christopher case llvm::Triple::mips: 1158ed734737d5af31906e30e537d4a41c760ddcfc59Eric Christopher case llvm::Triple::mipsel: 1159ed734737d5af31906e30e537d4a41c760ddcfc59Eric Christopher AddMIPSTargetArgs(Args, CmdArgs); 11609284d215022457ba867080a713f08f026d89ea17Bruno Cardoso Lopes break; 11619284d215022457ba867080a713f08f026d89ea17Bruno Cardoso Lopes 11629284d215022457ba867080a713f08f026d89ea17Bruno Cardoso Lopes case llvm::Triple::sparc: 11639284d215022457ba867080a713f08f026d89ea17Bruno Cardoso Lopes AddSparcTargetArgs(Args, CmdArgs); 1164ed734737d5af31906e30e537d4a41c760ddcfc59Eric Christopher break; 1165ed734737d5af31906e30e537d4a41c760ddcfc59Eric Christopher 11666acda16e9c194dcbd0dea64341e182bdb65d0f41Daniel Dunbar case llvm::Triple::x86: 11676acda16e9c194dcbd0dea64341e182bdb65d0f41Daniel Dunbar case llvm::Triple::x86_64: 11686acda16e9c194dcbd0dea64341e182bdb65d0f41Daniel Dunbar AddX86TargetArgs(Args, CmdArgs); 11696acda16e9c194dcbd0dea64341e182bdb65d0f41Daniel Dunbar break; 1170bc85be85779a47bae728bbe6a2cd2e3732b1333dDaniel Dunbar } 1171c21c485b4fb58ef5d55cf3e523263dd824a2ace4Daniel Dunbar 1172c176bc6be6f1407e7c6bd062f05a8636ea9a08e3Daniel Dunbar // Pass the linker version in use. 1173c176bc6be6f1407e7c6bd062f05a8636ea9a08e3Daniel Dunbar if (Arg *A = Args.getLastArg(options::OPT_mlinker_version_EQ)) { 1174c176bc6be6f1407e7c6bd062f05a8636ea9a08e3Daniel Dunbar CmdArgs.push_back("-target-linker-version"); 1175c176bc6be6f1407e7c6bd062f05a8636ea9a08e3Daniel Dunbar CmdArgs.push_back(A->getValue(Args)); 1176c176bc6be6f1407e7c6bd062f05a8636ea9a08e3Daniel Dunbar } 1177c176bc6be6f1407e7c6bd062f05a8636ea9a08e3Daniel Dunbar 1178b2d11cc3abd5ddf421a9bd36c6ec558038748a83Nick Lewycky // -mno-omit-leaf-frame-pointer is the default on Darwin. 11791ad6648cce57bd187f1853f58fef26cd9bf4934fDaniel Dunbar if (Args.hasFlag(options::OPT_momit_leaf_frame_pointer, 1180b2d11cc3abd5ddf421a9bd36c6ec558038748a83Nick Lewycky options::OPT_mno_omit_leaf_frame_pointer, 1181b2d11cc3abd5ddf421a9bd36c6ec558038748a83Nick Lewycky getToolChain().getTriple().getOS() != llvm::Triple::Darwin)) 11821ad6648cce57bd187f1853f58fef26cd9bf4934fDaniel Dunbar CmdArgs.push_back("-momit-leaf-frame-pointer"); 11831ad6648cce57bd187f1853f58fef26cd9bf4934fDaniel Dunbar 1184c31176d5ebbcd407aa512bbd5f717e35da629e7dDan Gohman // -fno-math-errno is default. 1185c31176d5ebbcd407aa512bbd5f717e35da629e7dDan Gohman if (Args.hasFlag(options::OPT_fmath_errno, 1186bc85be85779a47bae728bbe6a2cd2e3732b1333dDaniel Dunbar options::OPT_fno_math_errno, 1187c31176d5ebbcd407aa512bbd5f717e35da629e7dDan Gohman false)) 1188c31176d5ebbcd407aa512bbd5f717e35da629e7dDan Gohman CmdArgs.push_back("-fmath-errno"); 11891d46033f760ba5fd266ce59fe391fac473f04f52Daniel Dunbar 1190b30575c22f249c0697df0cd2aa872d14d4fa9c57Daniel Dunbar // Explicitly error on some things we know we don't support and can't just 1191b30575c22f249c0697df0cd2aa872d14d4fa9c57Daniel Dunbar // ignore. 1192b30575c22f249c0697df0cd2aa872d14d4fa9c57Daniel Dunbar types::ID InputType = Inputs[0].getType(); 1193e94db4771856659c12e1f269141cbbc4e55b1c47Daniel Dunbar if (!Args.hasArg(options::OPT_fallow_unsupported)) { 1194e94db4771856659c12e1f269141cbbc4e55b1c47Daniel Dunbar Arg *Unsupported; 1195e94db4771856659c12e1f269141cbbc4e55b1c47Daniel Dunbar if ((Unsupported = Args.getLastArg(options::OPT_MG)) || 11969a2b9d794bdf349b517ff799170f4409f45d147cArgyrios Kyrtzidis (Unsupported = Args.getLastArg(options::OPT_iframework))) 1197e94db4771856659c12e1f269141cbbc4e55b1c47Daniel Dunbar D.Diag(clang::diag::err_drv_clang_unsupported) 1198b30575c22f249c0697df0cd2aa872d14d4fa9c57Daniel Dunbar << Unsupported->getOption().getName(); 1199e94db4771856659c12e1f269141cbbc4e55b1c47Daniel Dunbar 1200e94db4771856659c12e1f269141cbbc4e55b1c47Daniel Dunbar if (types::isCXX(InputType) && 1201e94db4771856659c12e1f269141cbbc4e55b1c47Daniel Dunbar getToolChain().getTriple().getOS() == llvm::Triple::Darwin && 1202e94db4771856659c12e1f269141cbbc4e55b1c47Daniel Dunbar getToolChain().getTriple().getArch() == llvm::Triple::x86) { 1203e94db4771856659c12e1f269141cbbc4e55b1c47Daniel Dunbar if ((Unsupported = Args.getLastArg(options::OPT_fapple_kext))) 1204e94db4771856659c12e1f269141cbbc4e55b1c47Daniel Dunbar D.Diag(clang::diag::err_drv_clang_unsupported_opt_cxx_darwin_i386) 1205e94db4771856659c12e1f269141cbbc4e55b1c47Daniel Dunbar << Unsupported->getOption().getName(); 1206e94db4771856659c12e1f269141cbbc4e55b1c47Daniel Dunbar } 1207b30575c22f249c0697df0cd2aa872d14d4fa9c57Daniel Dunbar } 1208b30575c22f249c0697df0cd2aa872d14d4fa9c57Daniel Dunbar 12091d46033f760ba5fd266ce59fe391fac473f04f52Daniel Dunbar Args.AddAllArgs(CmdArgs, options::OPT_v); 1210f7c16d903f11814e2d6780e2a2e189b7a7afc4edDaniel Dunbar Args.AddLastArg(CmdArgs, options::OPT_H); 1211322c29fefe7fa33f03273136eb5f8b7f5b4df7c0Daniel Dunbar if (D.CCPrintHeaders) { 1212322c29fefe7fa33f03273136eb5f8b7f5b4df7c0Daniel Dunbar CmdArgs.push_back("-header-include-file"); 1213322c29fefe7fa33f03273136eb5f8b7f5b4df7c0Daniel Dunbar CmdArgs.push_back(D.CCPrintHeadersFilename ? 1214322c29fefe7fa33f03273136eb5f8b7f5b4df7c0Daniel Dunbar D.CCPrintHeadersFilename : "-"); 1215322c29fefe7fa33f03273136eb5f8b7f5b4df7c0Daniel Dunbar } 12161d46033f760ba5fd266ce59fe391fac473f04f52Daniel Dunbar Args.AddLastArg(CmdArgs, options::OPT_P); 12171eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump Args.AddLastArg(CmdArgs, options::OPT_print_ivar_layout); 12181d46033f760ba5fd266ce59fe391fac473f04f52Daniel Dunbar 12191d46033f760ba5fd266ce59fe391fac473f04f52Daniel Dunbar // Special case debug options to only pass -g to clang. This is 12201d46033f760ba5fd266ce59fe391fac473f04f52Daniel Dunbar // wrong. 122118f36d9eac8b425e8cfed389bbbf02c030f26be7Rafael Espindola Args.ClaimAllArgs(options::OPT_g_Group); 12226b3d5a65cb486f46604d12a16831e8a228ee610fDaniel Dunbar if (Arg *A = Args.getLastArg(options::OPT_g_Group)) 12236b3d5a65cb486f46604d12a16831e8a228ee610fDaniel Dunbar if (!A->getOption().matches(options::OPT_g0)) 12246b3d5a65cb486f46604d12a16831e8a228ee610fDaniel Dunbar CmdArgs.push_back("-g"); 12251d46033f760ba5fd266ce59fe391fac473f04f52Daniel Dunbar 12269cf933a67e54bea5475c5027fee2c1cf7365ee05Rafael Espindola Args.AddAllArgs(CmdArgs, options::OPT_ffunction_sections); 12279cf933a67e54bea5475c5027fee2c1cf7365ee05Rafael Espindola Args.AddAllArgs(CmdArgs, options::OPT_fdata_sections); 12289cf933a67e54bea5475c5027fee2c1cf7365ee05Rafael Espindola 12297255a2d997b15beae82e627052fdb1b2474495c2Chris Lattner Args.AddAllArgs(CmdArgs, options::OPT_finstrument_functions); 12307255a2d997b15beae82e627052fdb1b2474495c2Chris Lattner 12311d46033f760ba5fd266ce59fe391fac473f04f52Daniel Dunbar Args.AddLastArg(CmdArgs, options::OPT_nostdinc); 12324c2bcad7b843c10fd4a2ffd43da40bfefb4dc8baDouglas Gregor Args.AddLastArg(CmdArgs, options::OPT_nostdincxx); 12338d737cc78cb28f39179d6c7ca00eb5d3cf563129Rafael Espindola Args.AddLastArg(CmdArgs, options::OPT_nobuiltininc); 12341d46033f760ba5fd266ce59fe391fac473f04f52Daniel Dunbar 12355f12232ef39e3d6c36d6600a73ebbe3c4a79f514Daniel Dunbar // Pass the path to compiler resource files. 12365f12232ef39e3d6c36d6600a73ebbe3c4a79f514Daniel Dunbar CmdArgs.push_back("-resource-dir"); 1237225c41706dc0f3682236e351820d339e14390e00Daniel Dunbar CmdArgs.push_back(D.ResourceDir.c_str()); 12382ac9fc2ad64e16127df8c60caeea2edfe9a400a2Daniel Dunbar 1239389db16c63eec6ecfa9b235155252d8da766e94eArgyrios Kyrtzidis Args.AddLastArg(CmdArgs, options::OPT_working_directory); 1240389db16c63eec6ecfa9b235155252d8da766e94eArgyrios Kyrtzidis 1241c21c485b4fb58ef5d55cf3e523263dd824a2ace4Daniel Dunbar // Add preprocessing options like -I, -D, etc. if we are using the 1242c21c485b4fb58ef5d55cf3e523263dd824a2ace4Daniel Dunbar // preprocessor. 1243c21c485b4fb58ef5d55cf3e523263dd824a2ace4Daniel Dunbar // 1244c21c485b4fb58ef5d55cf3e523263dd824a2ace4Daniel Dunbar // FIXME: Support -fpreprocessed 1245c21c485b4fb58ef5d55cf3e523263dd824a2ace4Daniel Dunbar if (types::getPreprocessedType(InputType) != types::TY_INVALID) 1246df91ef3d6c55692a0236f67b6c6b134a3bf84098Douglas Gregor AddPreprocessingOptions(D, Args, CmdArgs, Output, Inputs); 12471d46033f760ba5fd266ce59fe391fac473f04f52Daniel Dunbar 124820f0eacf1682e4594da9d318b5b13ed4f6d6e7e5Daniel Dunbar // Manually translate -O to -O2 and -O4 to -O3; let clang reject 1249337a6271b98c4c183f7eaad1563a75260b4f2871Daniel Dunbar // others. 1250337a6271b98c4c183f7eaad1563a75260b4f2871Daniel Dunbar if (Arg *A = Args.getLastArg(options::OPT_O_Group)) { 1251b827a0541b5fd095fcdb7ad0c3df93ca158c619aDaniel Dunbar if (A->getOption().matches(options::OPT_O4)) 1252337a6271b98c4c183f7eaad1563a75260b4f2871Daniel Dunbar CmdArgs.push_back("-O3"); 1253473916c038f75fa3b0c51a0bc7afc5b082e5c22fDaniel Dunbar else if (A->getOption().matches(options::OPT_O) && 1254473916c038f75fa3b0c51a0bc7afc5b082e5c22fDaniel Dunbar A->getValue(Args)[0] == '\0') 125520f0eacf1682e4594da9d318b5b13ed4f6d6e7e5Daniel Dunbar CmdArgs.push_back("-O2"); 12565e3bc947e305b307c6bd8e5d49b5b06e2fe6bbf4Daniel Dunbar else if (A->getOption().matches(options::OPT_O) && 12575e3bc947e305b307c6bd8e5d49b5b06e2fe6bbf4Daniel Dunbar A->getValue(Args)[0] == 'z' && 12585e3bc947e305b307c6bd8e5d49b5b06e2fe6bbf4Daniel Dunbar A->getValue(Args)[1] == '\0') 12595e3bc947e305b307c6bd8e5d49b5b06e2fe6bbf4Daniel Dunbar CmdArgs.push_back("-Os"); 12601d46033f760ba5fd266ce59fe391fac473f04f52Daniel Dunbar else 12615697aa0d75c87bafec78984048d558f8d12ca1b3Daniel Dunbar A->render(Args, CmdArgs); 12621d46033f760ba5fd266ce59fe391fac473f04f52Daniel Dunbar } 12631d46033f760ba5fd266ce59fe391fac473f04f52Daniel Dunbar 12646e8371eb97a08f724be22ae6042d1e9eacbe4c48Daniel Dunbar Args.AddAllArgs(CmdArgs, options::OPT_W_Group); 12656e8371eb97a08f724be22ae6042d1e9eacbe4c48Daniel Dunbar Args.AddLastArg(CmdArgs, options::OPT_pedantic); 12666e8371eb97a08f724be22ae6042d1e9eacbe4c48Daniel Dunbar Args.AddLastArg(CmdArgs, options::OPT_pedantic_errors); 12671d46033f760ba5fd266ce59fe391fac473f04f52Daniel Dunbar Args.AddLastArg(CmdArgs, options::OPT_w); 1268d573d26e1abcce24c31ece3d6f7af158db569e4cDaniel Dunbar 1269d573d26e1abcce24c31ece3d6f7af158db569e4cDaniel Dunbar // Handle -{std, ansi, trigraphs} -- take the last of -{std, ansi} 1270d573d26e1abcce24c31ece3d6f7af158db569e4cDaniel Dunbar // (-ansi is equivalent to -std=c89). 1271d573d26e1abcce24c31ece3d6f7af158db569e4cDaniel Dunbar // 1272d573d26e1abcce24c31ece3d6f7af158db569e4cDaniel Dunbar // If a std is supplied, only add -trigraphs if it follows the 1273d573d26e1abcce24c31ece3d6f7af158db569e4cDaniel Dunbar // option. 1274d573d26e1abcce24c31ece3d6f7af158db569e4cDaniel Dunbar if (Arg *Std = Args.getLastArg(options::OPT_std_EQ, options::OPT_ansi)) { 1275d573d26e1abcce24c31ece3d6f7af158db569e4cDaniel Dunbar if (Std->getOption().matches(options::OPT_ansi)) 1276528365d3189d27f3a90a4012baaa8b2814e0a231Nuno Lopes if (types::isCXX(InputType)) 1277294691eb1caf551083acd7b08630ef21c3fd760dDaniel Dunbar CmdArgs.push_back("-std=c++98"); 1278528365d3189d27f3a90a4012baaa8b2814e0a231Nuno Lopes else 1279294691eb1caf551083acd7b08630ef21c3fd760dDaniel Dunbar CmdArgs.push_back("-std=c89"); 1280d573d26e1abcce24c31ece3d6f7af158db569e4cDaniel Dunbar else 1281d573d26e1abcce24c31ece3d6f7af158db569e4cDaniel Dunbar Std->render(Args, CmdArgs); 1282d573d26e1abcce24c31ece3d6f7af158db569e4cDaniel Dunbar 12830e10031ba5d0f9b3e5bc5570f39382d288779ab8Daniel Dunbar if (Arg *A = Args.getLastArg(options::OPT_std_EQ, options::OPT_ansi, 12840e10031ba5d0f9b3e5bc5570f39382d288779ab8Daniel Dunbar options::OPT_trigraphs)) 12850e10031ba5d0f9b3e5bc5570f39382d288779ab8Daniel Dunbar if (A != Std) 1286d573d26e1abcce24c31ece3d6f7af158db569e4cDaniel Dunbar A->render(Args, CmdArgs); 1287a3ff202ee4fb21728e930d5d029ba4925129912cDaniel Dunbar } else { 1288a3ff202ee4fb21728e930d5d029ba4925129912cDaniel Dunbar // Honor -std-default. 12894a5290e773e70ec2c3b4353a3a4aa7d1a3e3cd66Daniel Dunbar // 12904a5290e773e70ec2c3b4353a3a4aa7d1a3e3cd66Daniel Dunbar // FIXME: Clang doesn't correctly handle -std= when the input language 12914a5290e773e70ec2c3b4353a3a4aa7d1a3e3cd66Daniel Dunbar // doesn't match. For the time being just ignore this for C++ inputs; 12924a5290e773e70ec2c3b4353a3a4aa7d1a3e3cd66Daniel Dunbar // eventually we want to do all the standard defaulting here instead of 12934a5290e773e70ec2c3b4353a3a4aa7d1a3e3cd66Daniel Dunbar // splitting it between the driver and clang -cc1. 12944a5290e773e70ec2c3b4353a3a4aa7d1a3e3cd66Daniel Dunbar if (!types::isCXX(InputType)) 12954a5290e773e70ec2c3b4353a3a4aa7d1a3e3cd66Daniel Dunbar Args.AddAllArgsTranslated(CmdArgs, options::OPT_std_default_EQ, 12964a5290e773e70ec2c3b4353a3a4aa7d1a3e3cd66Daniel Dunbar "-std=", /*Joined=*/true); 1297d573d26e1abcce24c31ece3d6f7af158db569e4cDaniel Dunbar Args.AddLastArg(CmdArgs, options::OPT_trigraphs); 1298a3ff202ee4fb21728e930d5d029ba4925129912cDaniel Dunbar } 1299c21c485b4fb58ef5d55cf3e523263dd824a2ace4Daniel Dunbar 1300c304ba341a7daa88da42faf8f86310b764dd7b6aChandler Carruth // Translate GCC's misnamer '-fasm' arguments to '-fgnu-keywords'. 1301c304ba341a7daa88da42faf8f86310b764dd7b6aChandler Carruth if (Arg *Asm = Args.getLastArg(options::OPT_fasm, options::OPT_fno_asm)) { 1302c304ba341a7daa88da42faf8f86310b764dd7b6aChandler Carruth if (Asm->getOption().matches(options::OPT_fasm)) 1303c304ba341a7daa88da42faf8f86310b764dd7b6aChandler Carruth CmdArgs.push_back("-fgnu-keywords"); 1304c304ba341a7daa88da42faf8f86310b764dd7b6aChandler Carruth else 1305c304ba341a7daa88da42faf8f86310b764dd7b6aChandler Carruth CmdArgs.push_back("-fno-gnu-keywords"); 1306c304ba341a7daa88da42faf8f86310b764dd7b6aChandler Carruth } 1307c304ba341a7daa88da42faf8f86310b764dd7b6aChandler Carruth 13081d46033f760ba5fd266ce59fe391fac473f04f52Daniel Dunbar if (Arg *A = Args.getLastArg(options::OPT_ftemplate_depth_)) { 13091d46033f760ba5fd266ce59fe391fac473f04f52Daniel Dunbar CmdArgs.push_back("-ftemplate-depth"); 13101d46033f760ba5fd266ce59fe391fac473f04f52Daniel Dunbar CmdArgs.push_back(A->getValue(Args)); 1311b488c1dac8e53206f07103d794a62a3f5012c0f4Daniel Dunbar } 1312b488c1dac8e53206f07103d794a62a3f5012c0f4Daniel Dunbar 13131380a147d4578b619c215b23aa79ce17036d3c46Argyrios Kyrtzidis if (Arg *A = Args.getLastArg(options::OPT_Wlarge_by_value_copy_EQ, 13141380a147d4578b619c215b23aa79ce17036d3c46Argyrios Kyrtzidis options::OPT_Wlarge_by_value_copy_def)) { 13151380a147d4578b619c215b23aa79ce17036d3c46Argyrios Kyrtzidis CmdArgs.push_back("-Wlarge-by-value-copy"); 13163532fdd1db8ff6f353f2a5b215cebe3e0e2ff3c2Argyrios Kyrtzidis if (A->getNumValues()) 13173532fdd1db8ff6f353f2a5b215cebe3e0e2ff3c2Argyrios Kyrtzidis CmdArgs.push_back(A->getValue(Args)); 13183532fdd1db8ff6f353f2a5b215cebe3e0e2ff3c2Argyrios Kyrtzidis else 13191380a147d4578b619c215b23aa79ce17036d3c46Argyrios Kyrtzidis CmdArgs.push_back("64"); // default value for -Wlarge-by-value-copy. 13203532fdd1db8ff6f353f2a5b215cebe3e0e2ff3c2Argyrios Kyrtzidis } 13213532fdd1db8ff6f353f2a5b215cebe3e0e2ff3c2Argyrios Kyrtzidis 1322e4bdae78c69d2a09ee96619cc5ccf81441674412Daniel Dunbar if (Args.hasArg(options::OPT__relocatable_pch)) 132366861e09d590994a8b941eaa328e4d8f33adec9eDaniel Dunbar CmdArgs.push_back("-relocatable-pch"); 13241eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump 1325294691eb1caf551083acd7b08630ef21c3fd760dDaniel Dunbar if (Arg *A = Args.getLastArg(options::OPT_fconstant_string_class_EQ)) { 1326294691eb1caf551083acd7b08630ef21c3fd760dDaniel Dunbar CmdArgs.push_back("-fconstant-string-class"); 1327294691eb1caf551083acd7b08630ef21c3fd760dDaniel Dunbar CmdArgs.push_back(A->getValue(Args)); 1328294691eb1caf551083acd7b08630ef21c3fd760dDaniel Dunbar } 13298a5a9aaddb627c0884c2ed8db55cc29fdb601195David Chisnall 1330124fca533d9fef2e3f6359283909bd342b5f5f26Chris Lattner if (Arg *A = Args.getLastArg(options::OPT_ftabstop_EQ)) { 1331124fca533d9fef2e3f6359283909bd342b5f5f26Chris Lattner CmdArgs.push_back("-ftabstop"); 1332124fca533d9fef2e3f6359283909bd342b5f5f26Chris Lattner CmdArgs.push_back(A->getValue(Args)); 1333124fca533d9fef2e3f6359283909bd342b5f5f26Chris Lattner } 1334124fca533d9fef2e3f6359283909bd342b5f5f26Chris Lattner 13350f0c963f9b7ac6f0176c34d405d48fcb005dfab6Chris Lattner CmdArgs.push_back("-ferror-limit"); 13360f0c963f9b7ac6f0176c34d405d48fcb005dfab6Chris Lattner if (Arg *A = Args.getLastArg(options::OPT_ferror_limit_EQ)) 13370f0c963f9b7ac6f0176c34d405d48fcb005dfab6Chris Lattner CmdArgs.push_back(A->getValue(Args)); 13380f0c963f9b7ac6f0176c34d405d48fcb005dfab6Chris Lattner else 13390f0c963f9b7ac6f0176c34d405d48fcb005dfab6Chris Lattner CmdArgs.push_back("19"); 1340575cf3791216c33770ba950430493cdd43099f8fDouglas Gregor 1341c40f73c6e715044d327409564bf3656254101d46Chandler Carruth if (Arg *A = Args.getLastArg(options::OPT_fmacro_backtrace_limit_EQ)) { 1342c40f73c6e715044d327409564bf3656254101d46Chandler Carruth CmdArgs.push_back("-fmacro-backtrace-limit"); 13436c1cb9916e9988dcdd65b9266dbe24afd173427aDouglas Gregor CmdArgs.push_back(A->getValue(Args)); 1344c40f73c6e715044d327409564bf3656254101d46Chandler Carruth } 1345c40f73c6e715044d327409564bf3656254101d46Chandler Carruth 1346c40f73c6e715044d327409564bf3656254101d46Chandler Carruth if (Arg *A = Args.getLastArg(options::OPT_ftemplate_backtrace_limit_EQ)) { 1347c40f73c6e715044d327409564bf3656254101d46Chandler Carruth CmdArgs.push_back("-ftemplate-backtrace-limit"); 1348575cf3791216c33770ba950430493cdd43099f8fDouglas Gregor CmdArgs.push_back(A->getValue(Args)); 1349c40f73c6e715044d327409564bf3656254101d46Chandler Carruth } 1350c40f73c6e715044d327409564bf3656254101d46Chandler Carruth 135155efe142a84b2aab6d0186c20a311c347a65f794Daniel Dunbar // Pass -fmessage-length=. 1352a28690e5b0e423a6287ebe3a5565fd1896d7ebffDaniel Dunbar CmdArgs.push_back("-fmessage-length"); 135355efe142a84b2aab6d0186c20a311c347a65f794Daniel Dunbar if (Arg *A = Args.getLastArg(options::OPT_fmessage_length_EQ)) { 1354a28690e5b0e423a6287ebe3a5565fd1896d7ebffDaniel Dunbar CmdArgs.push_back(A->getValue(Args)); 135555efe142a84b2aab6d0186c20a311c347a65f794Daniel Dunbar } else { 135655efe142a84b2aab6d0186c20a311c347a65f794Daniel Dunbar // If -fmessage-length=N was not specified, determine whether this is a 135755efe142a84b2aab6d0186c20a311c347a65f794Daniel Dunbar // terminal and, if so, implicitly define -fmessage-length appropriately. 135855efe142a84b2aab6d0186c20a311c347a65f794Daniel Dunbar unsigned N = llvm::sys::Process::StandardErrColumns(); 135955efe142a84b2aab6d0186c20a311c347a65f794Daniel Dunbar CmdArgs.push_back(Args.MakeArgString(llvm::Twine(N))); 136055efe142a84b2aab6d0186c20a311c347a65f794Daniel Dunbar } 136155efe142a84b2aab6d0186c20a311c347a65f794Daniel Dunbar 1362ba8d86172c8d9e2476c6fd2415731639223174c5Daniel Dunbar if (const Arg *A = Args.getLastArg(options::OPT_fvisibility_EQ)) { 1363ba8d86172c8d9e2476c6fd2415731639223174c5Daniel Dunbar CmdArgs.push_back("-fvisibility"); 1364ba8d86172c8d9e2476c6fd2415731639223174c5Daniel Dunbar CmdArgs.push_back(A->getValue(Args)); 1365ba8d86172c8d9e2476c6fd2415731639223174c5Daniel Dunbar } 1366ba8d86172c8d9e2476c6fd2415731639223174c5Daniel Dunbar 13677cf84d66965a7706004d8590b5af5fe54b85f525Douglas Gregor Args.AddLastArg(CmdArgs, options::OPT_fvisibility_inlines_hidden); 136820249a1af2e462dcafdd6a350f1c7967b264ff25Michael J. Spencer 13690a80ba74ffa3d3df55abfbc4474d7470c7c923e3Daniel Dunbar // -fhosted is default. 13700a80ba74ffa3d3df55abfbc4474d7470c7c923e3Daniel Dunbar if (KernelOrKext || Args.hasFlag(options::OPT_ffreestanding, 13710a80ba74ffa3d3df55abfbc4474d7470c7c923e3Daniel Dunbar options::OPT_fhosted, 13720a80ba74ffa3d3df55abfbc4474d7470c7c923e3Daniel Dunbar false)) 13730a80ba74ffa3d3df55abfbc4474d7470c7c923e3Daniel Dunbar CmdArgs.push_back("-ffreestanding"); 13740a80ba74ffa3d3df55abfbc4474d7470c7c923e3Daniel Dunbar 1375ba8d86172c8d9e2476c6fd2415731639223174c5Daniel Dunbar // Forward -f (flag) options which we can pass directly. 13769c276ae0f24d4cee8f7954069d4b8eae45d0447dMike Stump Args.AddLastArg(CmdArgs, options::OPT_fcatch_undefined_behavior); 13773aaf082689d3235937a2e56a60f90fc1b3aebfb2Daniel Dunbar Args.AddLastArg(CmdArgs, options::OPT_femit_all_decls); 13783aaf082689d3235937a2e56a60f90fc1b3aebfb2Daniel Dunbar Args.AddLastArg(CmdArgs, options::OPT_fheinous_gnu_extensions); 1379c69e1cf04323f2e786d40e8a5ba84e77ee1c6827Devang Patel Args.AddLastArg(CmdArgs, options::OPT_flimit_debug_info); 1380be4c8705e499b55548467eb7adaa23cbc6edfef9Roman Divacky Args.AddLastArg(CmdArgs, options::OPT_pg); 13818c6fa84b2e4a30317b7b214a7657cb593d67773bDaniel Dunbar 13828c6fa84b2e4a30317b7b214a7657cb593d67773bDaniel Dunbar // -flax-vector-conversions is default. 13838c6fa84b2e4a30317b7b214a7657cb593d67773bDaniel Dunbar if (!Args.hasFlag(options::OPT_flax_vector_conversions, 13848c6fa84b2e4a30317b7b214a7657cb593d67773bDaniel Dunbar options::OPT_fno_lax_vector_conversions)) 13858c6fa84b2e4a30317b7b214a7657cb593d67773bDaniel Dunbar CmdArgs.push_back("-fno-lax-vector-conversions"); 13868c6fa84b2e4a30317b7b214a7657cb593d67773bDaniel Dunbar 138743a9b3263cb0bcb050cc75c15b3e6a8951e6b97aDaniel Dunbar // Handle -fobjc-gc and -fobjc-gc-only. They are exclusive, and -fobjc-gc-only 138843a9b3263cb0bcb050cc75c15b3e6a8951e6b97aDaniel Dunbar // takes precedence. 138943a9b3263cb0bcb050cc75c15b3e6a8951e6b97aDaniel Dunbar const Arg *GCArg = Args.getLastArg(options::OPT_fobjc_gc_only); 139043a9b3263cb0bcb050cc75c15b3e6a8951e6b97aDaniel Dunbar if (!GCArg) 139143a9b3263cb0bcb050cc75c15b3e6a8951e6b97aDaniel Dunbar GCArg = Args.getLastArg(options::OPT_fobjc_gc); 139243a9b3263cb0bcb050cc75c15b3e6a8951e6b97aDaniel Dunbar if (GCArg) { 139343a9b3263cb0bcb050cc75c15b3e6a8951e6b97aDaniel Dunbar if (getToolChain().SupportsObjCGC()) { 139443a9b3263cb0bcb050cc75c15b3e6a8951e6b97aDaniel Dunbar GCArg->render(Args, CmdArgs); 139543a9b3263cb0bcb050cc75c15b3e6a8951e6b97aDaniel Dunbar } else { 139643a9b3263cb0bcb050cc75c15b3e6a8951e6b97aDaniel Dunbar // FIXME: We should move this to a hard error. 139743a9b3263cb0bcb050cc75c15b3e6a8951e6b97aDaniel Dunbar D.Diag(clang::diag::warn_drv_objc_gc_unsupported) 139843a9b3263cb0bcb050cc75c15b3e6a8951e6b97aDaniel Dunbar << GCArg->getAsString(Args); 139943a9b3263cb0bcb050cc75c15b3e6a8951e6b97aDaniel Dunbar } 140043a9b3263cb0bcb050cc75c15b3e6a8951e6b97aDaniel Dunbar } 140143a9b3263cb0bcb050cc75c15b3e6a8951e6b97aDaniel Dunbar 1402b466d01e464b21832c23eeed90112bc5c26c0236Fariborz Jahanian if (Args.getLastArg(options::OPT_fapple_kext)) 1403b466d01e464b21832c23eeed90112bc5c26c0236Fariborz Jahanian CmdArgs.push_back("-fapple-kext"); 1404b466d01e464b21832c23eeed90112bc5c26c0236Fariborz Jahanian 14053aaf082689d3235937a2e56a60f90fc1b3aebfb2Daniel Dunbar Args.AddLastArg(CmdArgs, options::OPT_fno_show_column); 140634e65770ad6142b033d6cec4f476ed20fb248bf3Fariborz Jahanian Args.AddLastArg(CmdArgs, options::OPT_fobjc_sender_dependent_dispatch); 1407182e09240a33c6f1d303deecabec6e0e9c9d109dChris Lattner Args.AddLastArg(CmdArgs, options::OPT_fdiagnostics_print_source_range_info); 14084786c15f4977c7cee98fde3ebdee213dba23848bDouglas Gregor Args.AddLastArg(CmdArgs, options::OPT_fdiagnostics_parseable_fixits); 14093aaf082689d3235937a2e56a60f90fc1b3aebfb2Daniel Dunbar Args.AddLastArg(CmdArgs, options::OPT_ftime_report); 14103aaf082689d3235937a2e56a60f90fc1b3aebfb2Daniel Dunbar Args.AddLastArg(CmdArgs, options::OPT_ftrapv); 14117f18e67e1b577a50402e8b43508ab2311a5c45b5David Chisnall 14127f18e67e1b577a50402e8b43508ab2311a5c45b5David Chisnall if (Arg *A = Args.getLastArg(options::OPT_ftrapv_handler_EQ)) { 14137f18e67e1b577a50402e8b43508ab2311a5c45b5David Chisnall CmdArgs.push_back("-ftrapv-handler"); 14147f18e67e1b577a50402e8b43508ab2311a5c45b5David Chisnall CmdArgs.push_back(A->getValue(Args)); 14157f18e67e1b577a50402e8b43508ab2311a5c45b5David Chisnall } 14167f18e67e1b577a50402e8b43508ab2311a5c45b5David Chisnall 1417a4d71455f0d418e16cc0c5c5aa55a3bad3494aeeChris Lattner Args.AddLastArg(CmdArgs, options::OPT_fwrapv); 14183aaf082689d3235937a2e56a60f90fc1b3aebfb2Daniel Dunbar Args.AddLastArg(CmdArgs, options::OPT_fwritable_strings); 1419f84d409903dd4107c8cef5a08fcfce6e5c21d4deEric Christopher Args.AddLastArg(CmdArgs, options::OPT_funroll_loops); 14201d46033f760ba5fd266ce59fe391fac473f04f52Daniel Dunbar 14215345c391c65d1780a0d7b0102b7f735cc3f82732Daniel Dunbar Args.AddLastArg(CmdArgs, options::OPT_pthread); 14225345c391c65d1780a0d7b0102b7f735cc3f82732Daniel Dunbar 14239e5cc6b703b2d0013f13800c2ffbeb3cf85fcfadDaniel Dunbar // -stack-protector=0 is default. 14249e5cc6b703b2d0013f13800c2ffbeb3cf85fcfadDaniel Dunbar unsigned StackProtectorLevel = 0; 142545483f7a1b3e57b4603b141bee80596b2d4dd443Bill Wendling if (Arg *A = Args.getLastArg(options::OPT_fno_stack_protector, 142645483f7a1b3e57b4603b141bee80596b2d4dd443Bill Wendling options::OPT_fstack_protector_all, 142745483f7a1b3e57b4603b141bee80596b2d4dd443Bill Wendling options::OPT_fstack_protector)) { 14289e5cc6b703b2d0013f13800c2ffbeb3cf85fcfadDaniel Dunbar if (A->getOption().matches(options::OPT_fstack_protector)) 14299e5cc6b703b2d0013f13800c2ffbeb3cf85fcfadDaniel Dunbar StackProtectorLevel = 1; 14309e5cc6b703b2d0013f13800c2ffbeb3cf85fcfadDaniel Dunbar else if (A->getOption().matches(options::OPT_fstack_protector_all)) 14319e5cc6b703b2d0013f13800c2ffbeb3cf85fcfadDaniel Dunbar StackProtectorLevel = 2; 14329e5cc6b703b2d0013f13800c2ffbeb3cf85fcfadDaniel Dunbar } else 14339e5cc6b703b2d0013f13800c2ffbeb3cf85fcfadDaniel Dunbar StackProtectorLevel = getToolChain().GetDefaultStackProtectorLevel(); 14349e5cc6b703b2d0013f13800c2ffbeb3cf85fcfadDaniel Dunbar if (StackProtectorLevel) { 14359e5cc6b703b2d0013f13800c2ffbeb3cf85fcfadDaniel Dunbar CmdArgs.push_back("-stack-protector"); 14369e5cc6b703b2d0013f13800c2ffbeb3cf85fcfadDaniel Dunbar CmdArgs.push_back(Args.MakeArgString(llvm::Twine(StackProtectorLevel))); 143745483f7a1b3e57b4603b141bee80596b2d4dd443Bill Wendling } 143845483f7a1b3e57b4603b141bee80596b2d4dd443Bill Wendling 143948d1ef782c8c88066b5febf60f8f456064d7d3f0Daniel Dunbar // Forward -f options with positive and negative forms; we translate 144048d1ef782c8c88066b5febf60f8f456064d7d3f0Daniel Dunbar // these by hand. 144148d1ef782c8c88066b5febf60f8f456064d7d3f0Daniel Dunbar 1442b466d01e464b21832c23eeed90112bc5c26c0236Fariborz Jahanian if (Args.hasArg(options::OPT_mkernel)) { 14432843c1900b6da763885f47d0999e923e7c67fd65Daniel Dunbar if (!Args.hasArg(options::OPT_fapple_kext) && types::isCXX(InputType)) 1444b466d01e464b21832c23eeed90112bc5c26c0236Fariborz Jahanian CmdArgs.push_back("-fapple-kext"); 1445b466d01e464b21832c23eeed90112bc5c26c0236Fariborz Jahanian if (!Args.hasArg(options::OPT_fbuiltin)) 1446b466d01e464b21832c23eeed90112bc5c26c0236Fariborz Jahanian CmdArgs.push_back("-fno-builtin"); 1447b466d01e464b21832c23eeed90112bc5c26c0236Fariborz Jahanian } 14489e5cc6b703b2d0013f13800c2ffbeb3cf85fcfadDaniel Dunbar // -fbuiltin is default. 1449b466d01e464b21832c23eeed90112bc5c26c0236Fariborz Jahanian else if (!Args.hasFlag(options::OPT_fbuiltin, options::OPT_fno_builtin)) 145053e8484581ca358c3a2ccd8ea39c136c6e85d606Daniel Dunbar CmdArgs.push_back("-fno-builtin"); 145148d1ef782c8c88066b5febf60f8f456064d7d3f0Daniel Dunbar 1452fc2844846e91398205fddc71196fe9dda04e105fNuno Lopes if (!Args.hasFlag(options::OPT_fassume_sane_operator_new, 1453fc2844846e91398205fddc71196fe9dda04e105fNuno Lopes options::OPT_fno_assume_sane_operator_new)) 1454fc2844846e91398205fddc71196fe9dda04e105fNuno Lopes CmdArgs.push_back("-fno-assume-sane-operator-new"); 1455fc2844846e91398205fddc71196fe9dda04e105fNuno Lopes 14569e5cc6b703b2d0013f13800c2ffbeb3cf85fcfadDaniel Dunbar // -fblocks=0 is default. 14579e5cc6b703b2d0013f13800c2ffbeb3cf85fcfadDaniel Dunbar if (Args.hasFlag(options::OPT_fblocks, options::OPT_fno_blocks, 1458e6533ffc680e84cd193b4ea0d81548e251cb1f2fDavid Chisnall getToolChain().IsBlocksDefault()) || 1459e6533ffc680e84cd193b4ea0d81548e251cb1f2fDavid Chisnall (Args.hasArg(options::OPT_fgnu_runtime) && 1460e6533ffc680e84cd193b4ea0d81548e251cb1f2fDavid Chisnall Args.hasArg(options::OPT_fobjc_nonfragile_abi) && 1461e6533ffc680e84cd193b4ea0d81548e251cb1f2fDavid Chisnall !Args.hasArg(options::OPT_fno_blocks))) { 14629e5cc6b703b2d0013f13800c2ffbeb3cf85fcfadDaniel Dunbar CmdArgs.push_back("-fblocks"); 14635e530af5d51572a0ed5dbe50da54bd333840c63dDavid Chisnall } 146448d1ef782c8c88066b5febf60f8f456064d7d3f0Daniel Dunbar 146532579cf507d088e776b67327c5d6bc46e1f217ccJohn McCall // -faccess-control is default. 14667002f4c03c2d0544f4e8bea8d3a5636519081e35John McCall if (Args.hasFlag(options::OPT_fno_access_control, 14677002f4c03c2d0544f4e8bea8d3a5636519081e35John McCall options::OPT_faccess_control, 146832579cf507d088e776b67327c5d6bc46e1f217ccJohn McCall false)) 14697002f4c03c2d0544f4e8bea8d3a5636519081e35John McCall CmdArgs.push_back("-fno-access-control"); 14703ddd6e026a173e9519e84e27f8d6aed5473b8b4eJohn McCall 1471a4c2475961184a4bad6f6f087eeb1038bb784cadAnders Carlsson // -felide-constructors is the default. 1472a4c2475961184a4bad6f6f087eeb1038bb784cadAnders Carlsson if (Args.hasFlag(options::OPT_fno_elide_constructors, 1473a4c2475961184a4bad6f6f087eeb1038bb784cadAnders Carlsson options::OPT_felide_constructors, 1474a4c2475961184a4bad6f6f087eeb1038bb784cadAnders Carlsson false)) 1475a4c2475961184a4bad6f6f087eeb1038bb784cadAnders Carlsson CmdArgs.push_back("-fno-elide-constructors"); 1476a4c2475961184a4bad6f6f087eeb1038bb784cadAnders Carlsson 147715348aeb81285c75b2e92b5bf8d2db3445d147c2Anders Carlsson // Add exception args. 147815348aeb81285c75b2e92b5bf8d2db3445d147c2Anders Carlsson addExceptionArgs(Args, InputType, getToolChain().getTriple(), 147915348aeb81285c75b2e92b5bf8d2db3445d147c2Anders Carlsson KernelOrKext, IsRewriter, CmdArgs); 1480738f8c278da5950d0d4607de2debe0bdfad64185Mike Stump 1481b2987d159a88ab0ee2e40c884eb4d77b42ab89b6Daniel Dunbar if (getToolChain().UseSjLjExceptions()) 1482b2987d159a88ab0ee2e40c884eb4d77b42ab89b6Daniel Dunbar CmdArgs.push_back("-fsjlj-exceptions"); 1483b2987d159a88ab0ee2e40c884eb4d77b42ab89b6Daniel Dunbar 14840be42c44f0199c5023b542d6a6d2e66eb594f27dDaniel Dunbar // -frtti is default. 14850a80ba74ffa3d3df55abfbc4474d7470c7c923e3Daniel Dunbar if (KernelOrKext || 14860a80ba74ffa3d3df55abfbc4474d7470c7c923e3Daniel Dunbar !Args.hasFlag(options::OPT_frtti, options::OPT_fno_rtti)) 148753e8484581ca358c3a2ccd8ea39c136c6e85d606Daniel Dunbar CmdArgs.push_back("-fno-rtti"); 1488738f8c278da5950d0d4607de2debe0bdfad64185Mike Stump 14899a2b9d794bdf349b517ff799170f4409f45d147cArgyrios Kyrtzidis // -fshort-enums=0 is default. 14909a2b9d794bdf349b517ff799170f4409f45d147cArgyrios Kyrtzidis // FIXME: Are there targers where -fshort-enums is on by default ? 14919a2b9d794bdf349b517ff799170f4409f45d147cArgyrios Kyrtzidis if (Args.hasFlag(options::OPT_fshort_enums, 14929a2b9d794bdf349b517ff799170f4409f45d147cArgyrios Kyrtzidis options::OPT_fno_short_enums, false)) 14939a2b9d794bdf349b517ff799170f4409f45d147cArgyrios Kyrtzidis CmdArgs.push_back("-fshort-enums"); 14949a2b9d794bdf349b517ff799170f4409f45d147cArgyrios Kyrtzidis 14951f95e6567faab67f4363d650f73121359c4bdbabDaniel Dunbar // -fsigned-char is default. 14966d2eb4d07d40795131f28d719ef9146a2be500f6Daniel Dunbar if (!Args.hasFlag(options::OPT_fsigned_char, options::OPT_funsigned_char, 14971f95e6567faab67f4363d650f73121359c4bdbabDaniel Dunbar isSignedCharDefault(getToolChain().getTriple()))) 14987674352cf3e8f699914a2f739f1ae8c8c3480813Daniel Dunbar CmdArgs.push_back("-fno-signed-char"); 14995a77973d9bc2c9cdbdb7860dcf3ac795abe258ecEli Friedman 1500a508b7de6c5246ab04ed69d0ab4e9977ec1fb4d4Anders Carlsson // -fthreadsafe-static is default. 150120249a1af2e462dcafdd6a350f1c7967b264ff25Michael J. Spencer if (!Args.hasFlag(options::OPT_fthreadsafe_statics, 1502a508b7de6c5246ab04ed69d0ab4e9977ec1fb4d4Anders Carlsson options::OPT_fno_threadsafe_statics)) 1503a508b7de6c5246ab04ed69d0ab4e9977ec1fb4d4Anders Carlsson CmdArgs.push_back("-fno-threadsafe-statics"); 1504a508b7de6c5246ab04ed69d0ab4e9977ec1fb4d4Anders Carlsson 1505efb0fa9e11f75af51744a6159530ef7cc8efa24aDaniel Dunbar // -fuse-cxa-atexit is default. 1506d0a57d53223eccb482757c5aab436e8bd5a9c794Anton Korobeynikov if (KernelOrKext || 1507d0a57d53223eccb482757c5aab436e8bd5a9c794Anton Korobeynikov !Args.hasFlag(options::OPT_fuse_cxa_atexit, options::OPT_fno_use_cxa_atexit, 1508cd7a30b12c6780d790f4c7924aff05caee05670dNAKAMURA Takumi getToolChain().getTriple().getOS() != llvm::Triple::Cygwin && 15090aa205765aec0aa5eed672f8e3cade543372edcdNAKAMURA Takumi getToolChain().getTriple().getOS() != llvm::Triple::MinGW32)) 1510efb0fa9e11f75af51744a6159530ef7cc8efa24aDaniel Dunbar CmdArgs.push_back("-fno-use-cxa-atexit"); 1511efb0fa9e11f75af51744a6159530ef7cc8efa24aDaniel Dunbar 15120be42c44f0199c5023b542d6a6d2e66eb594f27dDaniel Dunbar // -fms-extensions=0 is default. 15136d2eb4d07d40795131f28d719ef9146a2be500f6Daniel Dunbar if (Args.hasFlag(options::OPT_fms_extensions, options::OPT_fno_ms_extensions, 15140be42c44f0199c5023b542d6a6d2e66eb594f27dDaniel Dunbar getToolChain().getTriple().getOS() == llvm::Triple::Win32)) 15150be42c44f0199c5023b542d6a6d2e66eb594f27dDaniel Dunbar CmdArgs.push_back("-fms-extensions"); 15160be42c44f0199c5023b542d6a6d2e66eb594f27dDaniel Dunbar 1517dae4ac4fe56ec60fc93b3e3c9f51e79e682084b9Michael J. Spencer // -fmsc-version=1300 is default. 1518dae4ac4fe56ec60fc93b3e3c9f51e79e682084b9Michael J. Spencer if (Args.hasFlag(options::OPT_fms_extensions, options::OPT_fno_ms_extensions, 1519dae4ac4fe56ec60fc93b3e3c9f51e79e682084b9Michael J. Spencer getToolChain().getTriple().getOS() == llvm::Triple::Win32) || 1520dae4ac4fe56ec60fc93b3e3c9f51e79e682084b9Michael J. Spencer Args.hasArg(options::OPT_fmsc_version)) { 1521dae4ac4fe56ec60fc93b3e3c9f51e79e682084b9Michael J. Spencer llvm::StringRef msc_ver = Args.getLastArgValue(options::OPT_fmsc_version); 1522dae4ac4fe56ec60fc93b3e3c9f51e79e682084b9Michael J. Spencer if (msc_ver.empty()) 1523dae4ac4fe56ec60fc93b3e3c9f51e79e682084b9Michael J. Spencer CmdArgs.push_back("-fmsc-version=1300"); 1524dae4ac4fe56ec60fc93b3e3c9f51e79e682084b9Michael J. Spencer else 1525dae4ac4fe56ec60fc93b3e3c9f51e79e682084b9Michael J. Spencer CmdArgs.push_back(Args.MakeArgString("-fmsc-version=" + msc_ver)); 1526dae4ac4fe56ec60fc93b3e3c9f51e79e682084b9Michael J. Spencer } 1527dae4ac4fe56ec60fc93b3e3c9f51e79e682084b9Michael J. Spencer 1528dae4ac4fe56ec60fc93b3e3c9f51e79e682084b9Michael J. Spencer 1529400b607546a8dbfcee3b690f3d0a2fee0ea6480bDawn Perchik // -fborland-extensions=0 is default. 1530400b607546a8dbfcee3b690f3d0a2fee0ea6480bDawn Perchik if (Args.hasFlag(options::OPT_fborland_extensions, 1531400b607546a8dbfcee3b690f3d0a2fee0ea6480bDawn Perchik options::OPT_fno_borland_extensions, false)) 1532400b607546a8dbfcee3b690f3d0a2fee0ea6480bDawn Perchik CmdArgs.push_back("-fborland-extensions"); 1533400b607546a8dbfcee3b690f3d0a2fee0ea6480bDawn Perchik 1534eb5d7b752651283de5abfcc2f91df7227582a08dChandler Carruth // -fgnu-keywords default varies depending on language; only pass if 1535eb5d7b752651283de5abfcc2f91df7227582a08dChandler Carruth // specified. 1536eb5d7b752651283de5abfcc2f91df7227582a08dChandler Carruth if (Arg *A = Args.getLastArg(options::OPT_fgnu_keywords, 153740788d909ad52fc732fe0769d0ef22e5edad5e47Daniel Dunbar options::OPT_fno_gnu_keywords)) 153840788d909ad52fc732fe0769d0ef22e5edad5e47Daniel Dunbar A->render(Args, CmdArgs); 1539eb5d7b752651283de5abfcc2f91df7227582a08dChandler Carruth 15405314e448631f166c89e908cc1ab45dc7eda916baDaniel Dunbar // -fnext-runtime defaults to on Darwin and when rewriting Objective-C, and is 15415314e448631f166c89e908cc1ab45dc7eda916baDaniel Dunbar // -the -cc1 default. 154220249a1af2e462dcafdd6a350f1c7967b264ff25Michael J. Spencer bool NeXTRuntimeIsDefault = 15435314e448631f166c89e908cc1ab45dc7eda916baDaniel Dunbar IsRewriter || getToolChain().getTriple().getOS() == llvm::Triple::Darwin; 15446d2eb4d07d40795131f28d719ef9146a2be500f6Daniel Dunbar if (!Args.hasFlag(options::OPT_fnext_runtime, options::OPT_fgnu_runtime, 15455314e448631f166c89e908cc1ab45dc7eda916baDaniel Dunbar NeXTRuntimeIsDefault)) 1546c5a97ec19408c3dca4b6a6385f11d8c783b94d0bDaniel Dunbar CmdArgs.push_back("-fgnu-runtime"); 1547c5a97ec19408c3dca4b6a6385f11d8c783b94d0bDaniel Dunbar 15489e5cc6b703b2d0013f13800c2ffbeb3cf85fcfadDaniel Dunbar // -fobjc-nonfragile-abi=0 is default. 15499e5cc6b703b2d0013f13800c2ffbeb3cf85fcfadDaniel Dunbar if (types::isObjC(InputType)) { 1550dea63134a51d463cf32f3eec3c359d9215359d69Daniel Dunbar // Compute the Objective-C ABI "version" to use. Version numbers are 1551dea63134a51d463cf32f3eec3c359d9215359d69Daniel Dunbar // slightly confusing for historical reasons: 1552dea63134a51d463cf32f3eec3c359d9215359d69Daniel Dunbar // 1 - Traditional "fragile" ABI 1553dea63134a51d463cf32f3eec3c359d9215359d69Daniel Dunbar // 2 - Non-fragile ABI, version 1 1554dea63134a51d463cf32f3eec3c359d9215359d69Daniel Dunbar // 3 - Non-fragile ABI, version 2 15555e2a8ac6599f0c68b14afb2f328ac98b264f770aDaniel Dunbar unsigned Version = 1; 1556dea63134a51d463cf32f3eec3c359d9215359d69Daniel Dunbar // If -fobjc-abi-version= is present, use that to set the version. 15575e2a8ac6599f0c68b14afb2f328ac98b264f770aDaniel Dunbar if (Arg *A = Args.getLastArg(options::OPT_fobjc_abi_version_EQ)) { 15585e2a8ac6599f0c68b14afb2f328ac98b264f770aDaniel Dunbar if (llvm::StringRef(A->getValue(Args)) == "1") 15595e2a8ac6599f0c68b14afb2f328ac98b264f770aDaniel Dunbar Version = 1; 15605e2a8ac6599f0c68b14afb2f328ac98b264f770aDaniel Dunbar else if (llvm::StringRef(A->getValue(Args)) == "2") 15615e2a8ac6599f0c68b14afb2f328ac98b264f770aDaniel Dunbar Version = 2; 15625f81d8aa26ad4de6568772c4768b272af96c18beFariborz Jahanian else if (llvm::StringRef(A->getValue(Args)) == "3") 15635f81d8aa26ad4de6568772c4768b272af96c18beFariborz Jahanian Version = 3; 15645e2a8ac6599f0c68b14afb2f328ac98b264f770aDaniel Dunbar else 15655e2a8ac6599f0c68b14afb2f328ac98b264f770aDaniel Dunbar D.Diag(clang::diag::err_drv_clang_unsupported) << A->getAsString(Args); 1566dea63134a51d463cf32f3eec3c359d9215359d69Daniel Dunbar } else { 1567dea63134a51d463cf32f3eec3c359d9215359d69Daniel Dunbar // Otherwise, determine if we are using the non-fragile ABI. 1568dea63134a51d463cf32f3eec3c359d9215359d69Daniel Dunbar if (Args.hasFlag(options::OPT_fobjc_nonfragile_abi, 1569dea63134a51d463cf32f3eec3c359d9215359d69Daniel Dunbar options::OPT_fno_objc_nonfragile_abi, 1570dea63134a51d463cf32f3eec3c359d9215359d69Daniel Dunbar getToolChain().IsObjCNonFragileABIDefault())) { 1571dea63134a51d463cf32f3eec3c359d9215359d69Daniel Dunbar // Determine the non-fragile ABI version to use. 1572de17ba7af23bd3693add73af127600b568cb210bDaniel Dunbar#ifdef DISABLE_DEFAULT_NONFRAGILEABI_TWO 1573de17ba7af23bd3693add73af127600b568cb210bDaniel Dunbar unsigned NonFragileABIVersion = 1; 1574de17ba7af23bd3693add73af127600b568cb210bDaniel Dunbar#else 1575dea63134a51d463cf32f3eec3c359d9215359d69Daniel Dunbar unsigned NonFragileABIVersion = 2; 1576de17ba7af23bd3693add73af127600b568cb210bDaniel Dunbar#endif 1577dea63134a51d463cf32f3eec3c359d9215359d69Daniel Dunbar 1578dea63134a51d463cf32f3eec3c359d9215359d69Daniel Dunbar if (Arg *A = Args.getLastArg( 1579dea63134a51d463cf32f3eec3c359d9215359d69Daniel Dunbar options::OPT_fobjc_nonfragile_abi_version_EQ)) { 1580dea63134a51d463cf32f3eec3c359d9215359d69Daniel Dunbar if (llvm::StringRef(A->getValue(Args)) == "1") 1581dea63134a51d463cf32f3eec3c359d9215359d69Daniel Dunbar NonFragileABIVersion = 1; 1582dea63134a51d463cf32f3eec3c359d9215359d69Daniel Dunbar else if (llvm::StringRef(A->getValue(Args)) == "2") 1583dea63134a51d463cf32f3eec3c359d9215359d69Daniel Dunbar NonFragileABIVersion = 2; 1584dea63134a51d463cf32f3eec3c359d9215359d69Daniel Dunbar else 1585dea63134a51d463cf32f3eec3c359d9215359d69Daniel Dunbar D.Diag(clang::diag::err_drv_clang_unsupported) 1586dea63134a51d463cf32f3eec3c359d9215359d69Daniel Dunbar << A->getAsString(Args); 1587dea63134a51d463cf32f3eec3c359d9215359d69Daniel Dunbar } 1588dea63134a51d463cf32f3eec3c359d9215359d69Daniel Dunbar 1589dea63134a51d463cf32f3eec3c359d9215359d69Daniel Dunbar Version = 1 + NonFragileABIVersion; 1590dea63134a51d463cf32f3eec3c359d9215359d69Daniel Dunbar } else { 1591dea63134a51d463cf32f3eec3c359d9215359d69Daniel Dunbar Version = 1; 1592dea63134a51d463cf32f3eec3c359d9215359d69Daniel Dunbar } 15935e2a8ac6599f0c68b14afb2f328ac98b264f770aDaniel Dunbar } 159420249a1af2e462dcafdd6a350f1c7967b264ff25Michael J. Spencer 15955f81d8aa26ad4de6568772c4768b272af96c18beFariborz Jahanian if (Version == 2 || Version == 3) { 1596112c3307aaa9ae9ee6ff5c2b4f6a53b1ea3c6f19Fariborz Jahanian CmdArgs.push_back("-fobjc-nonfragile-abi"); 1597f643b9b338b797a824447207d7eab5f1187f4f34Daniel Dunbar 1598f643b9b338b797a824447207d7eab5f1187f4f34Daniel Dunbar // -fobjc-dispatch-method is only relevant with the nonfragile-abi, and 1599f643b9b338b797a824447207d7eab5f1187f4f34Daniel Dunbar // legacy is the default. 1600f643b9b338b797a824447207d7eab5f1187f4f34Daniel Dunbar if (!Args.hasFlag(options::OPT_fobjc_legacy_dispatch, 1601f643b9b338b797a824447207d7eab5f1187f4f34Daniel Dunbar options::OPT_fno_objc_legacy_dispatch, 1602f643b9b338b797a824447207d7eab5f1187f4f34Daniel Dunbar getToolChain().IsObjCLegacyDispatchDefault())) { 1603f643b9b338b797a824447207d7eab5f1187f4f34Daniel Dunbar if (getToolChain().UseObjCMixedDispatch()) 1604f643b9b338b797a824447207d7eab5f1187f4f34Daniel Dunbar CmdArgs.push_back("-fobjc-dispatch-method=mixed"); 1605f643b9b338b797a824447207d7eab5f1187f4f34Daniel Dunbar else 1606f643b9b338b797a824447207d7eab5f1187f4f34Daniel Dunbar CmdArgs.push_back("-fobjc-dispatch-method=non-legacy"); 1607f643b9b338b797a824447207d7eab5f1187f4f34Daniel Dunbar } 1608984eb8611d9ee46fc6351dee43609f2deed99f3cDaniel Dunbar } 1609125b4cb35536e45201f8f2cb19ee620e3ad67c49NAKAMURA Takumi 1610c32647d111e516593b9ba242cad7b8ff4016c155Ted Kremenek // -fobjc-default-synthesize-properties=0 is default. 1611c32647d111e516593b9ba242cad7b8ff4016c155Ted Kremenek if (Args.hasFlag(options::OPT_fobjc_default_synthesize_properties, 1612c32647d111e516593b9ba242cad7b8ff4016c155Ted Kremenek options::OPT_fno_objc_default_synthesize_properties, 1613c32647d111e516593b9ba242cad7b8ff4016c155Ted Kremenek getToolChain().IsObjCDefaultSynthPropertiesDefault())) { 1614c32647d111e516593b9ba242cad7b8ff4016c155Ted Kremenek CmdArgs.push_back("-fobjc-default-synthesize-properties"); 1615c32647d111e516593b9ba242cad7b8ff4016c155Ted Kremenek } 16169e5cc6b703b2d0013f13800c2ffbeb3cf85fcfadDaniel Dunbar } 16179e5cc6b703b2d0013f13800c2ffbeb3cf85fcfadDaniel Dunbar 1618984eb8611d9ee46fc6351dee43609f2deed99f3cDaniel Dunbar if (!Args.hasFlag(options::OPT_fassume_sane_operator_new, 1619984eb8611d9ee46fc6351dee43609f2deed99f3cDaniel Dunbar options::OPT_fno_assume_sane_operator_new)) 1620984eb8611d9ee46fc6351dee43609f2deed99f3cDaniel Dunbar CmdArgs.push_back("-fno-assume-sane-operator-new"); 1621984eb8611d9ee46fc6351dee43609f2deed99f3cDaniel Dunbar 1622f35f14d474632142280ec1526d16e87706ce6625Daniel Dunbar // -fconstant-cfstrings is default, and may be subject to argument translation 1623f35f14d474632142280ec1526d16e87706ce6625Daniel Dunbar // on Darwin. 1624f35f14d474632142280ec1526d16e87706ce6625Daniel Dunbar if (!Args.hasFlag(options::OPT_fconstant_cfstrings, 1625f35f14d474632142280ec1526d16e87706ce6625Daniel Dunbar options::OPT_fno_constant_cfstrings) || 1626f35f14d474632142280ec1526d16e87706ce6625Daniel Dunbar !Args.hasFlag(options::OPT_mconstant_cfstrings, 1627f35f14d474632142280ec1526d16e87706ce6625Daniel Dunbar options::OPT_mno_constant_cfstrings)) 1628f35f14d474632142280ec1526d16e87706ce6625Daniel Dunbar CmdArgs.push_back("-fno-constant-cfstrings"); 1629f35f14d474632142280ec1526d16e87706ce6625Daniel Dunbar 1630a6fda124bf380479529d6a80b84b62cacd3cb707John Thompson // -fshort-wchar default varies depending on platform; only 1631a6fda124bf380479529d6a80b84b62cacd3cb707John Thompson // pass if specified. 16321744a3504af13343f4bc0e566f6d7349fc6e3f04Daniel Dunbar if (Arg *A = Args.getLastArg(options::OPT_fshort_wchar)) 16331744a3504af13343f4bc0e566f6d7349fc6e3f04Daniel Dunbar A->render(Args, CmdArgs); 1634a6fda124bf380479529d6a80b84b62cacd3cb707John Thompson 1635ee848a73e5f8ffe7511af8652ba811c020d1c7a0Daniel Dunbar // -fno-pascal-strings is default, only pass non-default. If the tool chain 1636ee848a73e5f8ffe7511af8652ba811c020d1c7a0Daniel Dunbar // happened to translate to -mpascal-strings, we want to back translate here. 163782d00688525c876bf47bce414dedae9c343e67f5Daniel Dunbar // 163882d00688525c876bf47bce414dedae9c343e67f5Daniel Dunbar // FIXME: This is gross; that translation should be pulled from the 163982d00688525c876bf47bce414dedae9c343e67f5Daniel Dunbar // tool chain. 1640c21c485b4fb58ef5d55cf3e523263dd824a2ace4Daniel Dunbar if (Args.hasFlag(options::OPT_fpascal_strings, 164182d00688525c876bf47bce414dedae9c343e67f5Daniel Dunbar options::OPT_fno_pascal_strings, 164282d00688525c876bf47bce414dedae9c343e67f5Daniel Dunbar false) || 164382d00688525c876bf47bce414dedae9c343e67f5Daniel Dunbar Args.hasFlag(options::OPT_mpascal_strings, 164482d00688525c876bf47bce414dedae9c343e67f5Daniel Dunbar options::OPT_mno_pascal_strings, 164582d00688525c876bf47bce414dedae9c343e67f5Daniel Dunbar false)) 164648d1ef782c8c88066b5febf60f8f456064d7d3f0Daniel Dunbar CmdArgs.push_back("-fpascal-strings"); 1647125b4cb35536e45201f8f2cb19ee620e3ad67c49NAKAMURA Takumi 1648b466d01e464b21832c23eeed90112bc5c26c0236Fariborz Jahanian if (Args.hasArg(options::OPT_mkernel) || 1649b466d01e464b21832c23eeed90112bc5c26c0236Fariborz Jahanian Args.hasArg(options::OPT_fapple_kext)) { 1650b466d01e464b21832c23eeed90112bc5c26c0236Fariborz Jahanian if (!Args.hasArg(options::OPT_fcommon)) 1651b466d01e464b21832c23eeed90112bc5c26c0236Fariborz Jahanian CmdArgs.push_back("-fno-common"); 1652b466d01e464b21832c23eeed90112bc5c26c0236Fariborz Jahanian } 165348d1ef782c8c88066b5febf60f8f456064d7d3f0Daniel Dunbar // -fcommon is default, only pass non-default. 1654b466d01e464b21832c23eeed90112bc5c26c0236Fariborz Jahanian else if (!Args.hasFlag(options::OPT_fcommon, options::OPT_fno_common)) 165548d1ef782c8c88066b5febf60f8f456064d7d3f0Daniel Dunbar CmdArgs.push_back("-fno-common"); 165648d1ef782c8c88066b5febf60f8f456064d7d3f0Daniel Dunbar 165770d3c92820f590b10553da9c96eda24e4325ba34Daniel Dunbar // -fsigned-bitfields is default, and clang doesn't yet support 165806205ca78ca2fd4384b237f120ec66614df0d9fcDaniel Dunbar // -funsigned-bitfields. 16591eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump if (!Args.hasFlag(options::OPT_fsigned_bitfields, 166070d3c92820f590b10553da9c96eda24e4325ba34Daniel Dunbar options::OPT_funsigned_bitfields)) 166170d3c92820f590b10553da9c96eda24e4325ba34Daniel Dunbar D.Diag(clang::diag::warn_drv_clang_unsupported) 166270d3c92820f590b10553da9c96eda24e4325ba34Daniel Dunbar << Args.getLastArg(options::OPT_funsigned_bitfields)->getAsString(Args); 166370d3c92820f590b10553da9c96eda24e4325ba34Daniel Dunbar 166406205ca78ca2fd4384b237f120ec66614df0d9fcDaniel Dunbar // -fsigned-bitfields is default, and clang doesn't support -fno-for-scope. 166506205ca78ca2fd4384b237f120ec66614df0d9fcDaniel Dunbar if (!Args.hasFlag(options::OPT_ffor_scope, 166606205ca78ca2fd4384b237f120ec66614df0d9fcDaniel Dunbar options::OPT_fno_for_scope)) 166706205ca78ca2fd4384b237f120ec66614df0d9fcDaniel Dunbar D.Diag(clang::diag::err_drv_clang_unsupported) 166806205ca78ca2fd4384b237f120ec66614df0d9fcDaniel Dunbar << Args.getLastArg(options::OPT_fno_for_scope)->getAsString(Args); 166906205ca78ca2fd4384b237f120ec66614df0d9fcDaniel Dunbar 16700ea22fdfda0558393950cef5db50d050e3eb1e60Jeffrey Yasskin // -fcaret-diagnostics is default. 16710ea22fdfda0558393950cef5db50d050e3eb1e60Jeffrey Yasskin if (!Args.hasFlag(options::OPT_fcaret_diagnostics, 16720ea22fdfda0558393950cef5db50d050e3eb1e60Jeffrey Yasskin options::OPT_fno_caret_diagnostics, true)) 16730ea22fdfda0558393950cef5db50d050e3eb1e60Jeffrey Yasskin CmdArgs.push_back("-fno-caret-diagnostics"); 16740ea22fdfda0558393950cef5db50d050e3eb1e60Jeffrey Yasskin 167549138fc59eeac2aacd3b7e04c2642180d5baefd7Daniel Dunbar // -fdiagnostics-fixit-info is default, only pass non-default. 16761eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump if (!Args.hasFlag(options::OPT_fdiagnostics_fixit_info, 167749138fc59eeac2aacd3b7e04c2642180d5baefd7Daniel Dunbar options::OPT_fno_diagnostics_fixit_info)) 167849138fc59eeac2aacd3b7e04c2642180d5baefd7Daniel Dunbar CmdArgs.push_back("-fno-diagnostics-fixit-info"); 167949138fc59eeac2aacd3b7e04c2642180d5baefd7Daniel Dunbar 16809e820ee054fefe5422b4db3f681e567a8976747eDaniel Dunbar // Enable -fdiagnostics-show-option by default. 16811eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump if (Args.hasFlag(options::OPT_fdiagnostics_show_option, 16829e820ee054fefe5422b4db3f681e567a8976747eDaniel Dunbar options::OPT_fno_diagnostics_show_option)) 16839e820ee054fefe5422b4db3f681e567a8976747eDaniel Dunbar CmdArgs.push_back("-fdiagnostics-show-option"); 1684838be483dcf10ea3f2acd85f2cd65adc310011f9Daniel Dunbar 16856fbe8398ba1680ffc5daa7395850ff8765b7905bChris Lattner if (const Arg *A = 16866fbe8398ba1680ffc5daa7395850ff8765b7905bChris Lattner Args.getLastArg(options::OPT_fdiagnostics_show_category_EQ)) { 16876fbe8398ba1680ffc5daa7395850ff8765b7905bChris Lattner CmdArgs.push_back("-fdiagnostics-show-category"); 16886fbe8398ba1680ffc5daa7395850ff8765b7905bChris Lattner CmdArgs.push_back(A->getValue(Args)); 16896fbe8398ba1680ffc5daa7395850ff8765b7905bChris Lattner } 1690ca0e0545c216afaacba6da6c82a270dc2efc4e3fDaniel Dunbar 1691838be483dcf10ea3f2acd85f2cd65adc310011f9Daniel Dunbar // Color diagnostics are the default, unless the terminal doesn't support 1692838be483dcf10ea3f2acd85f2cd65adc310011f9Daniel Dunbar // them. 1693838be483dcf10ea3f2acd85f2cd65adc310011f9Daniel Dunbar if (Args.hasFlag(options::OPT_fcolor_diagnostics, 1694f765d76407d82e629337bba4ca6c26bdfc8bc9a6Argyrios Kyrtzidis options::OPT_fno_color_diagnostics, 1695f765d76407d82e629337bba4ca6c26bdfc8bc9a6Argyrios Kyrtzidis llvm::sys::Process::StandardErrHasColors())) 1696838be483dcf10ea3f2acd85f2cd65adc310011f9Daniel Dunbar CmdArgs.push_back("-fcolor-diagnostics"); 1697838be483dcf10ea3f2acd85f2cd65adc310011f9Daniel Dunbar 169875eb1d64784946a37fc0b27596e2d92b6cf7033bDaniel Dunbar if (!Args.hasFlag(options::OPT_fshow_source_location, 169975eb1d64784946a37fc0b27596e2d92b6cf7033bDaniel Dunbar options::OPT_fno_show_source_location)) 170075eb1d64784946a37fc0b27596e2d92b6cf7033bDaniel Dunbar CmdArgs.push_back("-fno-show-source-location"); 17019e820ee054fefe5422b4db3f681e567a8976747eDaniel Dunbar 1702a0068fc64351db9c47916566e3b85ab733cd8d6dDouglas Gregor if (!Args.hasFlag(options::OPT_fspell_checking, 1703a0068fc64351db9c47916566e3b85ab733cd8d6dDouglas Gregor options::OPT_fno_spell_checking)) 1704a0068fc64351db9c47916566e3b85ab733cd8d6dDouglas Gregor CmdArgs.push_back("-fno-spell-checking"); 1705ca0e0545c216afaacba6da6c82a270dc2efc4e3fDaniel Dunbar 170625b26ebdebe46bb4576247e0c64d1c11410a8e9dDaniel Dunbar 1707168943947a42d6819dce56b420dc5aef4d0831ceDaniel Dunbar // Silently ignore -fasm-blocks for now. 1708168943947a42d6819dce56b420dc5aef4d0831ceDaniel Dunbar (void) Args.hasFlag(options::OPT_fasm_blocks, options::OPT_fno_asm_blocks, 1709168943947a42d6819dce56b420dc5aef4d0831ceDaniel Dunbar false); 171025b26ebdebe46bb4576247e0c64d1c11410a8e9dDaniel Dunbar 17115edbdcc62098e305cd55654814dcf783a3f3c477Jeffrey Yasskin if (Arg *A = Args.getLastArg(options::OPT_fshow_overloads_EQ)) 17125edbdcc62098e305cd55654814dcf783a3f3c477Jeffrey Yasskin A->render(Args, CmdArgs); 17135edbdcc62098e305cd55654814dcf783a3f3c477Jeffrey Yasskin 17147695fba30221613b7cf31276456217c41bb90960Daniel Dunbar // -fdollars-in-identifiers default varies depending on platform and 17157695fba30221613b7cf31276456217c41bb90960Daniel Dunbar // language; only pass if specified. 17161eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump if (Arg *A = Args.getLastArg(options::OPT_fdollars_in_identifiers, 17177695fba30221613b7cf31276456217c41bb90960Daniel Dunbar options::OPT_fno_dollars_in_identifiers)) { 17187695fba30221613b7cf31276456217c41bb90960Daniel Dunbar if (A->getOption().matches(options::OPT_fdollars_in_identifiers)) 17198663b180085e9bc7a0a87c80cc3f722efef99e79Daniel Dunbar CmdArgs.push_back("-fdollars-in-identifiers"); 17207695fba30221613b7cf31276456217c41bb90960Daniel Dunbar else 17218663b180085e9bc7a0a87c80cc3f722efef99e79Daniel Dunbar CmdArgs.push_back("-fno-dollars-in-identifiers"); 17227695fba30221613b7cf31276456217c41bb90960Daniel Dunbar } 17237695fba30221613b7cf31276456217c41bb90960Daniel Dunbar 1724e027a4b2399e9b0acfe0f77220c66bbe369067eeDaniel Dunbar // -funit-at-a-time is default, and we don't support -fno-unit-at-a-time for 1725e027a4b2399e9b0acfe0f77220c66bbe369067eeDaniel Dunbar // practical purposes. 17261eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump if (Arg *A = Args.getLastArg(options::OPT_funit_at_a_time, 1727e027a4b2399e9b0acfe0f77220c66bbe369067eeDaniel Dunbar options::OPT_fno_unit_at_a_time)) { 1728e027a4b2399e9b0acfe0f77220c66bbe369067eeDaniel Dunbar if (A->getOption().matches(options::OPT_fno_unit_at_a_time)) 1729c37691068db5ceb19c014ddd3e02afa9875f8181Edward O'Callaghan D.Diag(clang::diag::warn_drv_clang_unsupported) << A->getAsString(Args); 1730e027a4b2399e9b0acfe0f77220c66bbe369067eeDaniel Dunbar } 1731ceb5c5b7f67a30fae305d1d19b478b623e4fbcedEli Friedman 17322ba91575905a54f712a7f64304e56002e4882499Daniel Dunbar // Default to -fno-builtin-str{cat,cpy} on Darwin for ARM. 1733f84a4a469d8a45c76cb941595582a0fd3b9b15d3Daniel Dunbar // 17348ff5b28d6efcffe2251e77634c7edf83a4763344Daniel Dunbar // FIXME: This is disabled until clang -cc1 supports -fno-builtin-foo. PR4941. 1735f84a4a469d8a45c76cb941595582a0fd3b9b15d3Daniel Dunbar#if 0 17362ba91575905a54f712a7f64304e56002e4882499Daniel Dunbar if (getToolChain().getTriple().getOS() == llvm::Triple::Darwin && 17372ba91575905a54f712a7f64304e56002e4882499Daniel Dunbar (getToolChain().getTriple().getArch() == llvm::Triple::arm || 17382ba91575905a54f712a7f64304e56002e4882499Daniel Dunbar getToolChain().getTriple().getArch() == llvm::Triple::thumb)) { 17392ba91575905a54f712a7f64304e56002e4882499Daniel Dunbar if (!Args.hasArg(options::OPT_fbuiltin_strcat)) 17402ba91575905a54f712a7f64304e56002e4882499Daniel Dunbar CmdArgs.push_back("-fno-builtin-strcat"); 17412ba91575905a54f712a7f64304e56002e4882499Daniel Dunbar if (!Args.hasArg(options::OPT_fbuiltin_strcpy)) 17422ba91575905a54f712a7f64304e56002e4882499Daniel Dunbar CmdArgs.push_back("-fno-builtin-strcpy"); 17432ba91575905a54f712a7f64304e56002e4882499Daniel Dunbar } 1744f84a4a469d8a45c76cb941595582a0fd3b9b15d3Daniel Dunbar#endif 17452ba91575905a54f712a7f64304e56002e4882499Daniel Dunbar 17461eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump if (Arg *A = Args.getLastArg(options::OPT_traditional, 1747ceb5c5b7f67a30fae305d1d19b478b623e4fbcedEli Friedman options::OPT_traditional_cpp)) 1748ceb5c5b7f67a30fae305d1d19b478b623e4fbcedEli Friedman D.Diag(clang::diag::err_drv_clang_unsupported) << A->getAsString(Args); 1749ceb5c5b7f67a30fae305d1d19b478b623e4fbcedEli Friedman 17501d46033f760ba5fd266ce59fe391fac473f04f52Daniel Dunbar Args.AddLastArg(CmdArgs, options::OPT_dM); 1751d82df3ad430397d7f9ef511e7c5157f997c41f53Chris Lattner Args.AddLastArg(CmdArgs, options::OPT_dD); 17521d46033f760ba5fd266ce59fe391fac473f04f52Daniel Dunbar 17533f87fb08dd502309960646db01099fb4c1be9a7cDaniel Dunbar // Forward -Xclang arguments to -cc1, and -mllvm arguments to the LLVM option 17543f87fb08dd502309960646db01099fb4c1be9a7cDaniel Dunbar // parser. 17551d46033f760ba5fd266ce59fe391fac473f04f52Daniel Dunbar Args.AddAllArgValues(CmdArgs, options::OPT_Xclang); 17563f87fb08dd502309960646db01099fb4c1be9a7cDaniel Dunbar for (arg_iterator it = Args.filtered_begin(options::OPT_mllvm), 17573f87fb08dd502309960646db01099fb4c1be9a7cDaniel Dunbar ie = Args.filtered_end(); it != ie; ++it) { 17587e4953e5c60409007545288f14b430bd23d68570Daniel Dunbar (*it)->claim(); 1759fb36d21960a3bd422665a961eac6ca269cd6445bDaniel Dunbar 17603f87fb08dd502309960646db01099fb4c1be9a7cDaniel Dunbar // We translate this by hand to the -cc1 argument, since nightly test uses 17613f87fb08dd502309960646db01099fb4c1be9a7cDaniel Dunbar // it and developers have been trained to spell it with -mllvm. 17627e4953e5c60409007545288f14b430bd23d68570Daniel Dunbar if (llvm::StringRef((*it)->getValue(Args, 0)) == "-disable-llvm-optzns") 17633f87fb08dd502309960646db01099fb4c1be9a7cDaniel Dunbar CmdArgs.push_back("-disable-llvm-optzns"); 17643f87fb08dd502309960646db01099fb4c1be9a7cDaniel Dunbar else 17657e4953e5c60409007545288f14b430bd23d68570Daniel Dunbar (*it)->render(Args, CmdArgs); 17663f87fb08dd502309960646db01099fb4c1be9a7cDaniel Dunbar } 17671d46033f760ba5fd266ce59fe391fac473f04f52Daniel Dunbar 1768cd8e4c44dd068956e9181381be3ee2d49a0fac52Daniel Dunbar if (Output.getType() == types::TY_Dependencies) { 1769cd8e4c44dd068956e9181381be3ee2d49a0fac52Daniel Dunbar // Handled with other dependency code. 1770115a79277edababaf1b26e3654044ae983197679Daniel Dunbar } else if (Output.isFilename()) { 1771b488c1dac8e53206f07103d794a62a3f5012c0f4Daniel Dunbar CmdArgs.push_back("-o"); 1772115a79277edababaf1b26e3654044ae983197679Daniel Dunbar CmdArgs.push_back(Output.getFilename()); 1773115a79277edababaf1b26e3654044ae983197679Daniel Dunbar } else { 1774115a79277edababaf1b26e3654044ae983197679Daniel Dunbar assert(Output.isNothing() && "Invalid output."); 1775b488c1dac8e53206f07103d794a62a3f5012c0f4Daniel Dunbar } 1776b488c1dac8e53206f07103d794a62a3f5012c0f4Daniel Dunbar 17771d46033f760ba5fd266ce59fe391fac473f04f52Daniel Dunbar for (InputInfoList::const_iterator 17781d46033f760ba5fd266ce59fe391fac473f04f52Daniel Dunbar it = Inputs.begin(), ie = Inputs.end(); it != ie; ++it) { 17791d46033f760ba5fd266ce59fe391fac473f04f52Daniel Dunbar const InputInfo &II = *it; 17801d46033f760ba5fd266ce59fe391fac473f04f52Daniel Dunbar CmdArgs.push_back("-x"); 17811d46033f760ba5fd266ce59fe391fac473f04f52Daniel Dunbar CmdArgs.push_back(types::getTypeName(II.getType())); 17827c1e46533cae07216e2a67d5636a5afb44253155Daniel Dunbar if (II.isFilename()) 1783115a79277edababaf1b26e3654044ae983197679Daniel Dunbar CmdArgs.push_back(II.getFilename()); 17841d46033f760ba5fd266ce59fe391fac473f04f52Daniel Dunbar else 1785115a79277edababaf1b26e3654044ae983197679Daniel Dunbar II.getInputArg().renderAsInput(Args, CmdArgs); 17861d46033f760ba5fd266ce59fe391fac473f04f52Daniel Dunbar } 1787c21c485b4fb58ef5d55cf3e523263dd824a2ace4Daniel Dunbar 1788e6113de52df132b89c3a5a6141f17d37e83322aeChris Lattner Args.AddAllArgs(CmdArgs, options::OPT_undef); 1789e6113de52df132b89c3a5a6141f17d37e83322aeChris Lattner 1790a001c1ce5fcb669624a5b8e50d0a629d673da901Daniel Dunbar const char *Exec = getToolChain().getDriver().getClangProgramPath(); 1791f2d8b9f967a1ab53ee9fdbcc3ac0a4ee0a83a26eDaniel Dunbar 1792f2d8b9f967a1ab53ee9fdbcc3ac0a4ee0a83a26eDaniel Dunbar // Optionally embed the -cc1 level arguments into the debug info, for build 1793f2d8b9f967a1ab53ee9fdbcc3ac0a4ee0a83a26eDaniel Dunbar // analysis. 1794f2d8b9f967a1ab53ee9fdbcc3ac0a4ee0a83a26eDaniel Dunbar if (getToolChain().UseDwarfDebugFlags()) { 17956e90047520c8b4d6daa110bdbdaf15041016bd7cDaniel Dunbar ArgStringList OriginalArgs; 17966e90047520c8b4d6daa110bdbdaf15041016bd7cDaniel Dunbar for (ArgList::const_iterator it = Args.begin(), 17976e90047520c8b4d6daa110bdbdaf15041016bd7cDaniel Dunbar ie = Args.end(); it != ie; ++it) 17986e90047520c8b4d6daa110bdbdaf15041016bd7cDaniel Dunbar (*it)->render(Args, OriginalArgs); 1799ca0e0545c216afaacba6da6c82a270dc2efc4e3fDaniel Dunbar 1800f2d8b9f967a1ab53ee9fdbcc3ac0a4ee0a83a26eDaniel Dunbar llvm::SmallString<256> Flags; 1801f2d8b9f967a1ab53ee9fdbcc3ac0a4ee0a83a26eDaniel Dunbar Flags += Exec; 18026e90047520c8b4d6daa110bdbdaf15041016bd7cDaniel Dunbar for (unsigned i = 0, e = OriginalArgs.size(); i != e; ++i) { 1803f2d8b9f967a1ab53ee9fdbcc3ac0a4ee0a83a26eDaniel Dunbar Flags += " "; 18046e90047520c8b4d6daa110bdbdaf15041016bd7cDaniel Dunbar Flags += OriginalArgs[i]; 1805f2d8b9f967a1ab53ee9fdbcc3ac0a4ee0a83a26eDaniel Dunbar } 1806f2d8b9f967a1ab53ee9fdbcc3ac0a4ee0a83a26eDaniel Dunbar CmdArgs.push_back("-dwarf-debug-flags"); 1807f2d8b9f967a1ab53ee9fdbcc3ac0a4ee0a83a26eDaniel Dunbar CmdArgs.push_back(Args.MakeArgString(Flags.str())); 1808f2d8b9f967a1ab53ee9fdbcc3ac0a4ee0a83a26eDaniel Dunbar } 1809f2d8b9f967a1ab53ee9fdbcc3ac0a4ee0a83a26eDaniel Dunbar 18102fe238ed293bd4bc27af9beb9fa151fad2146fa8Daniel Dunbar C.addCommand(new Command(JA, *this, Exec, CmdArgs)); 1811a880db0b0fc028abf754c290d921d809eec0518aDaniel Dunbar 1812be4c8705e499b55548467eb7adaa23cbc6edfef9Roman Divacky if (Arg *A = Args.getLastArg(options::OPT_pg)) 1813be4c8705e499b55548467eb7adaa23cbc6edfef9Roman Divacky if (Args.hasArg(options::OPT_fomit_frame_pointer)) 1814be4c8705e499b55548467eb7adaa23cbc6edfef9Roman Divacky D.Diag(clang::diag::err_drv_argument_not_allowed_with) 1815be4c8705e499b55548467eb7adaa23cbc6edfef9Roman Divacky << "-fomit-frame-pointer" << A->getAsString(Args); 181620249a1af2e462dcafdd6a350f1c7967b264ff25Michael J. Spencer 181768fb469aeb19144403e703b825854d08353c8eeaDaniel Dunbar // Claim some arguments which clang supports automatically. 181868fb469aeb19144403e703b825854d08353c8eeaDaniel Dunbar 1819f4046866e20fe3279b0daa2f48d9e83263dfdbfeDaniel Dunbar // -fpch-preprocess is used with gcc to add a special marker in the output to 1820f4046866e20fe3279b0daa2f48d9e83263dfdbfeDaniel Dunbar // include the PCH file. Clang's PTH solution is completely transparent, so we 1821f4046866e20fe3279b0daa2f48d9e83263dfdbfeDaniel Dunbar // do not need to deal with it at all. 182268fb469aeb19144403e703b825854d08353c8eeaDaniel Dunbar Args.ClaimAllArgs(options::OPT_fpch_preprocess); 1823c21c485b4fb58ef5d55cf3e523263dd824a2ace4Daniel Dunbar 1824a880db0b0fc028abf754c290d921d809eec0518aDaniel Dunbar // Claim some arguments which clang doesn't support, but we don't 1825a880db0b0fc028abf754c290d921d809eec0518aDaniel Dunbar // care to warn the user about. 1826cdd9686b890ebdc10039ae256ef4c9dfb5ebacb7Daniel Dunbar Args.ClaimAllArgs(options::OPT_clang_ignored_f_Group); 1827cdd9686b890ebdc10039ae256ef4c9dfb5ebacb7Daniel Dunbar Args.ClaimAllArgs(options::OPT_clang_ignored_m_Group); 1828035ff0c6746a2689667c83d4c02a47d5a7b71e82Rafael Espindola 1829035ff0c6746a2689667c83d4c02a47d5a7b71e82Rafael Espindola Args.ClaimAllArgs(options::OPT_use_gold_plugin); 183047ac7d27c44bd64a7d0fc03d4babc196cf2b8230Daniel Dunbar} 183147ac7d27c44bd64a7d0fc03d4babc196cf2b8230Daniel Dunbar 183220a9aa50f9a7d4b03f97bc67e96da1d605c309a2Daniel Dunbarvoid ClangAs::ConstructJob(Compilation &C, const JobAction &JA, 183320a9aa50f9a7d4b03f97bc67e96da1d605c309a2Daniel Dunbar const InputInfo &Output, 183420a9aa50f9a7d4b03f97bc67e96da1d605c309a2Daniel Dunbar const InputInfoList &Inputs, 183520a9aa50f9a7d4b03f97bc67e96da1d605c309a2Daniel Dunbar const ArgList &Args, 183620a9aa50f9a7d4b03f97bc67e96da1d605c309a2Daniel Dunbar const char *LinkingOutput) const { 183720a9aa50f9a7d4b03f97bc67e96da1d605c309a2Daniel Dunbar ArgStringList CmdArgs; 183820a9aa50f9a7d4b03f97bc67e96da1d605c309a2Daniel Dunbar 183920a9aa50f9a7d4b03f97bc67e96da1d605c309a2Daniel Dunbar assert(Inputs.size() == 1 && "Unexpected number of inputs."); 184020a9aa50f9a7d4b03f97bc67e96da1d605c309a2Daniel Dunbar const InputInfo &Input = Inputs[0]; 184120a9aa50f9a7d4b03f97bc67e96da1d605c309a2Daniel Dunbar 1842dbe80d9933e1fb0c26bd339e1f1f2f2d76dcac0aRafael Espindola // Don't warn about "clang -w -c foo.s" 1843dbe80d9933e1fb0c26bd339e1f1f2f2d76dcac0aRafael Espindola Args.ClaimAllArgs(options::OPT_w); 1844dbe80d9933e1fb0c26bd339e1f1f2f2d76dcac0aRafael Espindola 184520a9aa50f9a7d4b03f97bc67e96da1d605c309a2Daniel Dunbar // Invoke ourselves in -cc1as mode. 184620a9aa50f9a7d4b03f97bc67e96da1d605c309a2Daniel Dunbar // 184720a9aa50f9a7d4b03f97bc67e96da1d605c309a2Daniel Dunbar // FIXME: Implement custom jobs for internal actions. 184820a9aa50f9a7d4b03f97bc67e96da1d605c309a2Daniel Dunbar CmdArgs.push_back("-cc1as"); 184920a9aa50f9a7d4b03f97bc67e96da1d605c309a2Daniel Dunbar 185020a9aa50f9a7d4b03f97bc67e96da1d605c309a2Daniel Dunbar // Add the "effective" target triple. 185120a9aa50f9a7d4b03f97bc67e96da1d605c309a2Daniel Dunbar CmdArgs.push_back("-triple"); 185200577ada44c889fbe311d61c51a8da89e65c7c9aDaniel Dunbar std::string TripleStr = getToolChain().ComputeEffectiveClangTriple(Args); 185320a9aa50f9a7d4b03f97bc67e96da1d605c309a2Daniel Dunbar CmdArgs.push_back(Args.MakeArgString(TripleStr)); 185420a9aa50f9a7d4b03f97bc67e96da1d605c309a2Daniel Dunbar 185520a9aa50f9a7d4b03f97bc67e96da1d605c309a2Daniel Dunbar // Set the output mode, we currently only expect to be used as a real 185620a9aa50f9a7d4b03f97bc67e96da1d605c309a2Daniel Dunbar // assembler. 185720a9aa50f9a7d4b03f97bc67e96da1d605c309a2Daniel Dunbar CmdArgs.push_back("-filetype"); 185820a9aa50f9a7d4b03f97bc67e96da1d605c309a2Daniel Dunbar CmdArgs.push_back("obj"); 185920a9aa50f9a7d4b03f97bc67e96da1d605c309a2Daniel Dunbar 18609929800b8dfced61e9c97dc8d6e71e144ebf8accDaniel Dunbar // At -O0, we use -mrelax-all by default. 18619929800b8dfced61e9c97dc8d6e71e144ebf8accDaniel Dunbar bool IsOpt = false; 18629929800b8dfced61e9c97dc8d6e71e144ebf8accDaniel Dunbar if (Arg *A = Args.getLastArg(options::OPT_O_Group)) 18639929800b8dfced61e9c97dc8d6e71e144ebf8accDaniel Dunbar IsOpt = !A->getOption().matches(options::OPT_O0); 18649929800b8dfced61e9c97dc8d6e71e144ebf8accDaniel Dunbar if (Args.hasFlag(options::OPT_mrelax_all, 18659929800b8dfced61e9c97dc8d6e71e144ebf8accDaniel Dunbar options::OPT_mno_relax_all, 18669929800b8dfced61e9c97dc8d6e71e144ebf8accDaniel Dunbar !IsOpt)) 1867469d40ef5a95d0eaddfd541616ad4cd26668e856Daniel Dunbar CmdArgs.push_back("-relax-all"); 18689929800b8dfced61e9c97dc8d6e71e144ebf8accDaniel Dunbar 186920a9aa50f9a7d4b03f97bc67e96da1d605c309a2Daniel Dunbar // FIXME: Add -force_cpusubtype_ALL support, once we have it. 187020a9aa50f9a7d4b03f97bc67e96da1d605c309a2Daniel Dunbar 187120a9aa50f9a7d4b03f97bc67e96da1d605c309a2Daniel Dunbar // FIXME: Add -g support, once we have it. 187220a9aa50f9a7d4b03f97bc67e96da1d605c309a2Daniel Dunbar 187320a9aa50f9a7d4b03f97bc67e96da1d605c309a2Daniel Dunbar // FIXME: Add -static support, once we have it. 187420a9aa50f9a7d4b03f97bc67e96da1d605c309a2Daniel Dunbar 187520a9aa50f9a7d4b03f97bc67e96da1d605c309a2Daniel Dunbar Args.AddAllArgValues(CmdArgs, options::OPT_Wa_COMMA, 187620a9aa50f9a7d4b03f97bc67e96da1d605c309a2Daniel Dunbar options::OPT_Xassembler); 187720a9aa50f9a7d4b03f97bc67e96da1d605c309a2Daniel Dunbar 187820a9aa50f9a7d4b03f97bc67e96da1d605c309a2Daniel Dunbar assert(Output.isFilename() && "Unexpected lipo output."); 187920a9aa50f9a7d4b03f97bc67e96da1d605c309a2Daniel Dunbar CmdArgs.push_back("-o"); 188020a9aa50f9a7d4b03f97bc67e96da1d605c309a2Daniel Dunbar CmdArgs.push_back(Output.getFilename()); 188120a9aa50f9a7d4b03f97bc67e96da1d605c309a2Daniel Dunbar 18827c1e46533cae07216e2a67d5636a5afb44253155Daniel Dunbar assert(Input.isFilename() && "Invalid input."); 18837c1e46533cae07216e2a67d5636a5afb44253155Daniel Dunbar CmdArgs.push_back(Input.getFilename()); 188420a9aa50f9a7d4b03f97bc67e96da1d605c309a2Daniel Dunbar 1885a001c1ce5fcb669624a5b8e50d0a629d673da901Daniel Dunbar const char *Exec = getToolChain().getDriver().getClangProgramPath(); 18862fe238ed293bd4bc27af9beb9fa151fad2146fa8Daniel Dunbar C.addCommand(new Command(JA, *this, Exec, CmdArgs)); 188720a9aa50f9a7d4b03f97bc67e96da1d605c309a2Daniel Dunbar} 188820a9aa50f9a7d4b03f97bc67e96da1d605c309a2Daniel Dunbar 1889b488c1dac8e53206f07103d794a62a3f5012c0f4Daniel Dunbarvoid gcc::Common::ConstructJob(Compilation &C, const JobAction &JA, 1890b488c1dac8e53206f07103d794a62a3f5012c0f4Daniel Dunbar const InputInfo &Output, 1891b488c1dac8e53206f07103d794a62a3f5012c0f4Daniel Dunbar const InputInfoList &Inputs, 18921d46033f760ba5fd266ce59fe391fac473f04f52Daniel Dunbar const ArgList &Args, 1893b488c1dac8e53206f07103d794a62a3f5012c0f4Daniel Dunbar const char *LinkingOutput) const { 1894ee788e70fcd0adf76103b17c78ac658d4ea30c9bDaniel Dunbar const Driver &D = getToolChain().getDriver(); 1895b488c1dac8e53206f07103d794a62a3f5012c0f4Daniel Dunbar ArgStringList CmdArgs; 1896b488c1dac8e53206f07103d794a62a3f5012c0f4Daniel Dunbar 1897c21c485b4fb58ef5d55cf3e523263dd824a2ace4Daniel Dunbar for (ArgList::const_iterator 18981d46033f760ba5fd266ce59fe391fac473f04f52Daniel Dunbar it = Args.begin(), ie = Args.end(); it != ie; ++it) { 1899b488c1dac8e53206f07103d794a62a3f5012c0f4Daniel Dunbar Arg *A = *it; 19007587719c40ebf02bf11e5e66c30bd20e98edebc2Daniel Dunbar if (A->getOption().hasForwardToGCC()) { 19012dffe2d9d631fefd79d4999f6ffe7ac0d70882b1Daniel Dunbar // Don't forward any -g arguments to assembly steps. 19022dffe2d9d631fefd79d4999f6ffe7ac0d70882b1Daniel Dunbar if (isa<AssembleJobAction>(JA) && 19032dffe2d9d631fefd79d4999f6ffe7ac0d70882b1Daniel Dunbar A->getOption().matches(options::OPT_g_Group)) 19042dffe2d9d631fefd79d4999f6ffe7ac0d70882b1Daniel Dunbar continue; 19052dffe2d9d631fefd79d4999f6ffe7ac0d70882b1Daniel Dunbar 19067587719c40ebf02bf11e5e66c30bd20e98edebc2Daniel Dunbar // It is unfortunate that we have to claim here, as this means 19077587719c40ebf02bf11e5e66c30bd20e98edebc2Daniel Dunbar // we will basically never report anything interesting for 19086ecc7a993f939c5255c36c7c0d965fb9c1543f2aDaniel Dunbar // platforms using a generic gcc, even if we are just using gcc 19096ecc7a993f939c5255c36c7c0d965fb9c1543f2aDaniel Dunbar // to get to the assembler. 19107587719c40ebf02bf11e5e66c30bd20e98edebc2Daniel Dunbar A->claim(); 19111d46033f760ba5fd266ce59fe391fac473f04f52Daniel Dunbar A->render(Args, CmdArgs); 19127587719c40ebf02bf11e5e66c30bd20e98edebc2Daniel Dunbar } 1913b488c1dac8e53206f07103d794a62a3f5012c0f4Daniel Dunbar } 1914c21c485b4fb58ef5d55cf3e523263dd824a2ace4Daniel Dunbar 191582b51cce8cea6b6bb6175c406c2ab425c91d9dc8Daniel Dunbar RenderExtraToolArgs(JA, CmdArgs); 1916b488c1dac8e53206f07103d794a62a3f5012c0f4Daniel Dunbar 1917b488c1dac8e53206f07103d794a62a3f5012c0f4Daniel Dunbar // If using a driver driver, force the arch. 19187cfe31a713d8fcfc2a1328e8fbd8efdeb0aec51bDaniel Dunbar const std::string &Arch = getToolChain().getArchName(); 19191bda434673d3c51a2ba6b412f100ccfcf3e7083fDaniel Dunbar if (getToolChain().getTriple().getOS() == llvm::Triple::Darwin) { 1920b488c1dac8e53206f07103d794a62a3f5012c0f4Daniel Dunbar CmdArgs.push_back("-arch"); 1921bf54a06f9b771c2a2730cc63eb89bce0522515b5Daniel Dunbar 1922bf54a06f9b771c2a2730cc63eb89bce0522515b5Daniel Dunbar // FIXME: Remove these special cases. 19237cfe31a713d8fcfc2a1328e8fbd8efdeb0aec51bDaniel Dunbar if (Arch == "powerpc") 19247cfe31a713d8fcfc2a1328e8fbd8efdeb0aec51bDaniel Dunbar CmdArgs.push_back("ppc"); 19257cfe31a713d8fcfc2a1328e8fbd8efdeb0aec51bDaniel Dunbar else if (Arch == "powerpc64") 19267cfe31a713d8fcfc2a1328e8fbd8efdeb0aec51bDaniel Dunbar CmdArgs.push_back("ppc64"); 19277cfe31a713d8fcfc2a1328e8fbd8efdeb0aec51bDaniel Dunbar else 1928881376467c46c5c6cc16fa6790271c2c22e1d4f1Daniel Dunbar CmdArgs.push_back(Args.MakeArgString(Arch)); 1929b488c1dac8e53206f07103d794a62a3f5012c0f4Daniel Dunbar } 1930b488c1dac8e53206f07103d794a62a3f5012c0f4Daniel Dunbar 19316ecc7a993f939c5255c36c7c0d965fb9c1543f2aDaniel Dunbar // Try to force gcc to match the tool chain we want, if we recognize 19326ecc7a993f939c5255c36c7c0d965fb9c1543f2aDaniel Dunbar // the arch. 19337cfe31a713d8fcfc2a1328e8fbd8efdeb0aec51bDaniel Dunbar // 19347cfe31a713d8fcfc2a1328e8fbd8efdeb0aec51bDaniel Dunbar // FIXME: The triple class should directly provide the information we want 19357cfe31a713d8fcfc2a1328e8fbd8efdeb0aec51bDaniel Dunbar // here. 19367cfe31a713d8fcfc2a1328e8fbd8efdeb0aec51bDaniel Dunbar if (Arch == "i386" || Arch == "powerpc") 19376ecc7a993f939c5255c36c7c0d965fb9c1543f2aDaniel Dunbar CmdArgs.push_back("-m32"); 19387cfe31a713d8fcfc2a1328e8fbd8efdeb0aec51bDaniel Dunbar else if (Arch == "x86_64" || Arch == "powerpc64") 19396ecc7a993f939c5255c36c7c0d965fb9c1543f2aDaniel Dunbar CmdArgs.push_back("-m64"); 19406ecc7a993f939c5255c36c7c0d965fb9c1543f2aDaniel Dunbar 19417c1e46533cae07216e2a67d5636a5afb44253155Daniel Dunbar if (Output.isFilename()) { 1942b488c1dac8e53206f07103d794a62a3f5012c0f4Daniel Dunbar CmdArgs.push_back("-o"); 1943115a79277edababaf1b26e3654044ae983197679Daniel Dunbar CmdArgs.push_back(Output.getFilename()); 1944115a79277edababaf1b26e3654044ae983197679Daniel Dunbar } else { 1945115a79277edababaf1b26e3654044ae983197679Daniel Dunbar assert(Output.isNothing() && "Unexpected output"); 1946b488c1dac8e53206f07103d794a62a3f5012c0f4Daniel Dunbar CmdArgs.push_back("-fsyntax-only"); 1947115a79277edababaf1b26e3654044ae983197679Daniel Dunbar } 1948b488c1dac8e53206f07103d794a62a3f5012c0f4Daniel Dunbar 1949b488c1dac8e53206f07103d794a62a3f5012c0f4Daniel Dunbar 1950b488c1dac8e53206f07103d794a62a3f5012c0f4Daniel Dunbar // Only pass -x if gcc will understand it; otherwise hope gcc 1951b488c1dac8e53206f07103d794a62a3f5012c0f4Daniel Dunbar // understands the suffix correctly. The main use case this would go 1952b488c1dac8e53206f07103d794a62a3f5012c0f4Daniel Dunbar // wrong in is for linker inputs if they happened to have an odd 1953b488c1dac8e53206f07103d794a62a3f5012c0f4Daniel Dunbar // suffix; really the only way to get this to happen is a command 1954b488c1dac8e53206f07103d794a62a3f5012c0f4Daniel Dunbar // like '-x foobar a.c' which will treat a.c like a linker input. 1955b488c1dac8e53206f07103d794a62a3f5012c0f4Daniel Dunbar // 1956b488c1dac8e53206f07103d794a62a3f5012c0f4Daniel Dunbar // FIXME: For the linker case specifically, can we safely convert 1957b488c1dac8e53206f07103d794a62a3f5012c0f4Daniel Dunbar // inputs into '-Wl,' options? 1958b488c1dac8e53206f07103d794a62a3f5012c0f4Daniel Dunbar for (InputInfoList::const_iterator 1959b488c1dac8e53206f07103d794a62a3f5012c0f4Daniel Dunbar it = Inputs.begin(), ie = Inputs.end(); it != ie; ++it) { 1960b488c1dac8e53206f07103d794a62a3f5012c0f4Daniel Dunbar const InputInfo &II = *it; 1961a8304f67291b0182fb64f3afc621615288dd1d31Daniel Dunbar 19625915fbf310e171c4cd3c2af05e9de360c0fa988aDaniel Dunbar // Don't try to pass LLVM or AST inputs to a generic gcc. 19636c6424bc0d3b5f080a97b5f6ef4a8d70c38e38f5Daniel Dunbar if (II.getType() == types::TY_LLVM_IR || II.getType() == types::TY_LTO_IR || 19646c6424bc0d3b5f080a97b5f6ef4a8d70c38e38f5Daniel Dunbar II.getType() == types::TY_LLVM_BC || II.getType() == types::TY_LTO_BC) 1965a8304f67291b0182fb64f3afc621615288dd1d31Daniel Dunbar D.Diag(clang::diag::err_drv_no_linker_llvm_support) 1966881376467c46c5c6cc16fa6790271c2c22e1d4f1Daniel Dunbar << getToolChain().getTripleString(); 19675915fbf310e171c4cd3c2af05e9de360c0fa988aDaniel Dunbar else if (II.getType() == types::TY_AST) 19685915fbf310e171c4cd3c2af05e9de360c0fa988aDaniel Dunbar D.Diag(clang::diag::err_drv_no_ast_support) 1969881376467c46c5c6cc16fa6790271c2c22e1d4f1Daniel Dunbar << getToolChain().getTripleString(); 1970a8304f67291b0182fb64f3afc621615288dd1d31Daniel Dunbar 1971b488c1dac8e53206f07103d794a62a3f5012c0f4Daniel Dunbar if (types::canTypeBeUserSpecified(II.getType())) { 1972b488c1dac8e53206f07103d794a62a3f5012c0f4Daniel Dunbar CmdArgs.push_back("-x"); 1973b488c1dac8e53206f07103d794a62a3f5012c0f4Daniel Dunbar CmdArgs.push_back(types::getTypeName(II.getType())); 1974b488c1dac8e53206f07103d794a62a3f5012c0f4Daniel Dunbar } 1975b488c1dac8e53206f07103d794a62a3f5012c0f4Daniel Dunbar 19767c1e46533cae07216e2a67d5636a5afb44253155Daniel Dunbar if (II.isFilename()) 1977115a79277edababaf1b26e3654044ae983197679Daniel Dunbar CmdArgs.push_back(II.getFilename()); 197848f9994bdd9f7f1853782109595b1f80f50afcfaDaniel Dunbar else { 197948f9994bdd9f7f1853782109595b1f80f50afcfaDaniel Dunbar const Arg &A = II.getInputArg(); 198048f9994bdd9f7f1853782109595b1f80f50afcfaDaniel Dunbar 198148f9994bdd9f7f1853782109595b1f80f50afcfaDaniel Dunbar // Reverse translate some rewritten options. 198248f9994bdd9f7f1853782109595b1f80f50afcfaDaniel Dunbar if (A.getOption().matches(options::OPT_Z_reserved_lib_stdcxx)) { 198348f9994bdd9f7f1853782109595b1f80f50afcfaDaniel Dunbar CmdArgs.push_back("-lstdc++"); 198448f9994bdd9f7f1853782109595b1f80f50afcfaDaniel Dunbar continue; 198548f9994bdd9f7f1853782109595b1f80f50afcfaDaniel Dunbar } 198648f9994bdd9f7f1853782109595b1f80f50afcfaDaniel Dunbar 1987115a79277edababaf1b26e3654044ae983197679Daniel Dunbar // Don't render as input, we need gcc to do the translations. 198848f9994bdd9f7f1853782109595b1f80f50afcfaDaniel Dunbar A.render(Args, CmdArgs); 198948f9994bdd9f7f1853782109595b1f80f50afcfaDaniel Dunbar } 1990b488c1dac8e53206f07103d794a62a3f5012c0f4Daniel Dunbar } 1991b488c1dac8e53206f07103d794a62a3f5012c0f4Daniel Dunbar 199279e9e9dd533de9609ef141449bf50e705fa68fd0Rafael Espindola const char *GCCName = getToolChain().getDriver().getCCCGenericGCCName().c_str(); 1993c21c485b4fb58ef5d55cf3e523263dd824a2ace4Daniel Dunbar const char *Exec = 19944a7e88978cf646ad10d654020cb00b3877069210Daniel Dunbar Args.MakeArgString(getToolChain().GetProgramPath(GCCName)); 19952fe238ed293bd4bc27af9beb9fa151fad2146fa8Daniel Dunbar C.addCommand(new Command(JA, *this, Exec, CmdArgs)); 199647ac7d27c44bd64a7d0fc03d4babc196cf2b8230Daniel Dunbar} 199747ac7d27c44bd64a7d0fc03d4babc196cf2b8230Daniel Dunbar 199882b51cce8cea6b6bb6175c406c2ab425c91d9dc8Daniel Dunbarvoid gcc::Preprocess::RenderExtraToolArgs(const JobAction &JA, 199982b51cce8cea6b6bb6175c406c2ab425c91d9dc8Daniel Dunbar ArgStringList &CmdArgs) const { 2000b488c1dac8e53206f07103d794a62a3f5012c0f4Daniel Dunbar CmdArgs.push_back("-E"); 200147ac7d27c44bd64a7d0fc03d4babc196cf2b8230Daniel Dunbar} 200247ac7d27c44bd64a7d0fc03d4babc196cf2b8230Daniel Dunbar 200382b51cce8cea6b6bb6175c406c2ab425c91d9dc8Daniel Dunbarvoid gcc::Precompile::RenderExtraToolArgs(const JobAction &JA, 200482b51cce8cea6b6bb6175c406c2ab425c91d9dc8Daniel Dunbar ArgStringList &CmdArgs) const { 2005b488c1dac8e53206f07103d794a62a3f5012c0f4Daniel Dunbar // The type is good enough. 200647ac7d27c44bd64a7d0fc03d4babc196cf2b8230Daniel Dunbar} 200747ac7d27c44bd64a7d0fc03d4babc196cf2b8230Daniel Dunbar 200882b51cce8cea6b6bb6175c406c2ab425c91d9dc8Daniel Dunbarvoid gcc::Compile::RenderExtraToolArgs(const JobAction &JA, 200982b51cce8cea6b6bb6175c406c2ab425c91d9dc8Daniel Dunbar ArgStringList &CmdArgs) const { 201064952508c2b0c8bffb45c8b410f0af3d2457f59bDaniel Dunbar const Driver &D = getToolChain().getDriver(); 201164952508c2b0c8bffb45c8b410f0af3d2457f59bDaniel Dunbar 201282b51cce8cea6b6bb6175c406c2ab425c91d9dc8Daniel Dunbar // If -flto, etc. are present then make sure not to force assembly output. 20136c6424bc0d3b5f080a97b5f6ef4a8d70c38e38f5Daniel Dunbar if (JA.getType() == types::TY_LLVM_IR || JA.getType() == types::TY_LTO_IR || 20146c6424bc0d3b5f080a97b5f6ef4a8d70c38e38f5Daniel Dunbar JA.getType() == types::TY_LLVM_BC || JA.getType() == types::TY_LTO_BC) 201582b51cce8cea6b6bb6175c406c2ab425c91d9dc8Daniel Dunbar CmdArgs.push_back("-c"); 201664952508c2b0c8bffb45c8b410f0af3d2457f59bDaniel Dunbar else { 201764952508c2b0c8bffb45c8b410f0af3d2457f59bDaniel Dunbar if (JA.getType() != types::TY_PP_Asm) 201864952508c2b0c8bffb45c8b410f0af3d2457f59bDaniel Dunbar D.Diag(clang::diag::err_drv_invalid_gcc_output_type) 201964952508c2b0c8bffb45c8b410f0af3d2457f59bDaniel Dunbar << getTypeName(JA.getType()); 202020249a1af2e462dcafdd6a350f1c7967b264ff25Michael J. Spencer 202182b51cce8cea6b6bb6175c406c2ab425c91d9dc8Daniel Dunbar CmdArgs.push_back("-S"); 202264952508c2b0c8bffb45c8b410f0af3d2457f59bDaniel Dunbar } 202347ac7d27c44bd64a7d0fc03d4babc196cf2b8230Daniel Dunbar} 202447ac7d27c44bd64a7d0fc03d4babc196cf2b8230Daniel Dunbar 202582b51cce8cea6b6bb6175c406c2ab425c91d9dc8Daniel Dunbarvoid gcc::Assemble::RenderExtraToolArgs(const JobAction &JA, 202682b51cce8cea6b6bb6175c406c2ab425c91d9dc8Daniel Dunbar ArgStringList &CmdArgs) const { 2027b488c1dac8e53206f07103d794a62a3f5012c0f4Daniel Dunbar CmdArgs.push_back("-c"); 2028b488c1dac8e53206f07103d794a62a3f5012c0f4Daniel Dunbar} 202947ac7d27c44bd64a7d0fc03d4babc196cf2b8230Daniel Dunbar 203082b51cce8cea6b6bb6175c406c2ab425c91d9dc8Daniel Dunbarvoid gcc::Link::RenderExtraToolArgs(const JobAction &JA, 203182b51cce8cea6b6bb6175c406c2ab425c91d9dc8Daniel Dunbar ArgStringList &CmdArgs) const { 2032b488c1dac8e53206f07103d794a62a3f5012c0f4Daniel Dunbar // The types are (hopefully) good enough. 203347ac7d27c44bd64a7d0fc03d4babc196cf2b8230Daniel Dunbar} 2034b488c1dac8e53206f07103d794a62a3f5012c0f4Daniel Dunbar 203540f1265ebd42ece3e7f7917319b56012e8e2bce2Daniel Dunbarconst char *darwin::CC1::getCC1Name(types::ID Type) const { 203640f1265ebd42ece3e7f7917319b56012e8e2bce2Daniel Dunbar switch (Type) { 203740f1265ebd42ece3e7f7917319b56012e8e2bce2Daniel Dunbar default: 203840f1265ebd42ece3e7f7917319b56012e8e2bce2Daniel Dunbar assert(0 && "Unexpected type for Darwin CC1 tool."); 203940f1265ebd42ece3e7f7917319b56012e8e2bce2Daniel Dunbar case types::TY_Asm: 204040f1265ebd42ece3e7f7917319b56012e8e2bce2Daniel Dunbar case types::TY_C: case types::TY_CHeader: 204140f1265ebd42ece3e7f7917319b56012e8e2bce2Daniel Dunbar case types::TY_PP_C: case types::TY_PP_CHeader: 204240f1265ebd42ece3e7f7917319b56012e8e2bce2Daniel Dunbar return "cc1"; 204340f1265ebd42ece3e7f7917319b56012e8e2bce2Daniel Dunbar case types::TY_ObjC: case types::TY_ObjCHeader: 204440f1265ebd42ece3e7f7917319b56012e8e2bce2Daniel Dunbar case types::TY_PP_ObjC: case types::TY_PP_ObjCHeader: 204540f1265ebd42ece3e7f7917319b56012e8e2bce2Daniel Dunbar return "cc1obj"; 204640f1265ebd42ece3e7f7917319b56012e8e2bce2Daniel Dunbar case types::TY_CXX: case types::TY_CXXHeader: 204740f1265ebd42ece3e7f7917319b56012e8e2bce2Daniel Dunbar case types::TY_PP_CXX: case types::TY_PP_CXXHeader: 204840f1265ebd42ece3e7f7917319b56012e8e2bce2Daniel Dunbar return "cc1plus"; 204940f1265ebd42ece3e7f7917319b56012e8e2bce2Daniel Dunbar case types::TY_ObjCXX: case types::TY_ObjCXXHeader: 205040f1265ebd42ece3e7f7917319b56012e8e2bce2Daniel Dunbar case types::TY_PP_ObjCXX: case types::TY_PP_ObjCXXHeader: 205140f1265ebd42ece3e7f7917319b56012e8e2bce2Daniel Dunbar return "cc1objplus"; 205240f1265ebd42ece3e7f7917319b56012e8e2bce2Daniel Dunbar } 205340f1265ebd42ece3e7f7917319b56012e8e2bce2Daniel Dunbar} 205440f1265ebd42ece3e7f7917319b56012e8e2bce2Daniel Dunbar 2055c21c485b4fb58ef5d55cf3e523263dd824a2ace4Daniel Dunbarconst char *darwin::CC1::getBaseInputName(const ArgList &Args, 2056a5a7bd0de7b6b80212095195a055a4a43f21d4b2Daniel Dunbar const InputInfoList &Inputs) { 2057472ccff00cdbcd095c3ba933b9e3f202719f118fMichael J. Spencer return Args.MakeArgString( 2058472ccff00cdbcd095c3ba933b9e3f202719f118fMichael J. Spencer llvm::sys::path::filename(Inputs[0].getBaseInput())); 2059a3ec60e0cf2a1916f479288998d31bd980b1a306Daniel Dunbar} 2060a3ec60e0cf2a1916f479288998d31bd980b1a306Daniel Dunbar 2061c21c485b4fb58ef5d55cf3e523263dd824a2ace4Daniel Dunbarconst char *darwin::CC1::getBaseInputStem(const ArgList &Args, 2062a5a7bd0de7b6b80212095195a055a4a43f21d4b2Daniel Dunbar const InputInfoList &Inputs) { 2063a3ec60e0cf2a1916f479288998d31bd980b1a306Daniel Dunbar const char *Str = getBaseInputName(Args, Inputs); 2064a3ec60e0cf2a1916f479288998d31bd980b1a306Daniel Dunbar 2065657ca6683d754c903026221a3aa3aa9cedb7556fChris Lattner if (const char *End = strrchr(Str, '.')) 2066881376467c46c5c6cc16fa6790271c2c22e1d4f1Daniel Dunbar return Args.MakeArgString(std::string(Str, End)); 2067a3ec60e0cf2a1916f479288998d31bd980b1a306Daniel Dunbar 2068a3ec60e0cf2a1916f479288998d31bd980b1a306Daniel Dunbar return Str; 2069a3ec60e0cf2a1916f479288998d31bd980b1a306Daniel Dunbar} 2070a3ec60e0cf2a1916f479288998d31bd980b1a306Daniel Dunbar 2071a3ec60e0cf2a1916f479288998d31bd980b1a306Daniel Dunbarconst char * 2072c21c485b4fb58ef5d55cf3e523263dd824a2ace4Daniel Dunbardarwin::CC1::getDependencyFileName(const ArgList &Args, 2073a5a7bd0de7b6b80212095195a055a4a43f21d4b2Daniel Dunbar const InputInfoList &Inputs) { 2074a3ec60e0cf2a1916f479288998d31bd980b1a306Daniel Dunbar // FIXME: Think about this more. 2075a3ec60e0cf2a1916f479288998d31bd980b1a306Daniel Dunbar std::string Res; 2076a3ec60e0cf2a1916f479288998d31bd980b1a306Daniel Dunbar 2077a3ec60e0cf2a1916f479288998d31bd980b1a306Daniel Dunbar if (Arg *OutputOpt = Args.getLastArg(options::OPT_o)) { 2078a3ec60e0cf2a1916f479288998d31bd980b1a306Daniel Dunbar std::string Str(OutputOpt->getValue(Args)); 2079c21c485b4fb58ef5d55cf3e523263dd824a2ace4Daniel Dunbar 2080a3ec60e0cf2a1916f479288998d31bd980b1a306Daniel Dunbar Res = Str.substr(0, Str.rfind('.')); 2081a3ec60e0cf2a1916f479288998d31bd980b1a306Daniel Dunbar } else 2082a5a7bd0de7b6b80212095195a055a4a43f21d4b2Daniel Dunbar Res = darwin::CC1::getBaseInputStem(Args, Inputs); 2083a3ec60e0cf2a1916f479288998d31bd980b1a306Daniel Dunbar 2084881376467c46c5c6cc16fa6790271c2c22e1d4f1Daniel Dunbar return Args.MakeArgString(Res + ".d"); 2085a3ec60e0cf2a1916f479288998d31bd980b1a306Daniel Dunbar} 2086a3ec60e0cf2a1916f479288998d31bd980b1a306Daniel Dunbar 2087c21c485b4fb58ef5d55cf3e523263dd824a2ace4Daniel Dunbarvoid darwin::CC1::AddCC1Args(const ArgList &Args, 2088a3ec60e0cf2a1916f479288998d31bd980b1a306Daniel Dunbar ArgStringList &CmdArgs) const { 2089ee788e70fcd0adf76103b17c78ac658d4ea30c9bDaniel Dunbar const Driver &D = getToolChain().getDriver(); 2090e2fd66418eca3d70cf6b62087d745d0c5181db69Daniel Dunbar 2091e2fd66418eca3d70cf6b62087d745d0c5181db69Daniel Dunbar CheckCodeGenerationOptions(D, Args); 2092e2fd66418eca3d70cf6b62087d745d0c5181db69Daniel Dunbar 2093a3ec60e0cf2a1916f479288998d31bd980b1a306Daniel Dunbar // Derived from cc1 spec. 2094a3ec60e0cf2a1916f479288998d31bd980b1a306Daniel Dunbar if (!Args.hasArg(options::OPT_mkernel) && !Args.hasArg(options::OPT_static) && 2095a3ec60e0cf2a1916f479288998d31bd980b1a306Daniel Dunbar !Args.hasArg(options::OPT_mdynamic_no_pic)) 2096a3ec60e0cf2a1916f479288998d31bd980b1a306Daniel Dunbar CmdArgs.push_back("-fPIC"); 2097a3ec60e0cf2a1916f479288998d31bd980b1a306Daniel Dunbar 20982ba91575905a54f712a7f64304e56002e4882499Daniel Dunbar if (getToolChain().getTriple().getArch() == llvm::Triple::arm || 20992ba91575905a54f712a7f64304e56002e4882499Daniel Dunbar getToolChain().getTriple().getArch() == llvm::Triple::thumb) { 21002ba91575905a54f712a7f64304e56002e4882499Daniel Dunbar if (!Args.hasArg(options::OPT_fbuiltin_strcat)) 21012ba91575905a54f712a7f64304e56002e4882499Daniel Dunbar CmdArgs.push_back("-fno-builtin-strcat"); 21022ba91575905a54f712a7f64304e56002e4882499Daniel Dunbar if (!Args.hasArg(options::OPT_fbuiltin_strcpy)) 21032ba91575905a54f712a7f64304e56002e4882499Daniel Dunbar CmdArgs.push_back("-fno-builtin-strcpy"); 21042ba91575905a54f712a7f64304e56002e4882499Daniel Dunbar } 21052ba91575905a54f712a7f64304e56002e4882499Daniel Dunbar 2106a3ec60e0cf2a1916f479288998d31bd980b1a306Daniel Dunbar // gcc has some code here to deal with when no -mmacosx-version-min 2107a3ec60e0cf2a1916f479288998d31bd980b1a306Daniel Dunbar // and no -miphoneos-version-min is present, but this never happens 2108a3ec60e0cf2a1916f479288998d31bd980b1a306Daniel Dunbar // due to tool chain specific argument translation. 2109a3ec60e0cf2a1916f479288998d31bd980b1a306Daniel Dunbar 2110a3ec60e0cf2a1916f479288998d31bd980b1a306Daniel Dunbar if (Args.hasArg(options::OPT_g_Flag) && 2111a3ec60e0cf2a1916f479288998d31bd980b1a306Daniel Dunbar !Args.hasArg(options::OPT_fno_eliminate_unused_debug_symbols)) 2112a3ec60e0cf2a1916f479288998d31bd980b1a306Daniel Dunbar CmdArgs.push_back("-feliminate-unused-debug-symbols"); 2113a3ec60e0cf2a1916f479288998d31bd980b1a306Daniel Dunbar} 2114a3ec60e0cf2a1916f479288998d31bd980b1a306Daniel Dunbar 2115a3ec60e0cf2a1916f479288998d31bd980b1a306Daniel Dunbarvoid darwin::CC1::AddCC1OptionsArgs(const ArgList &Args, ArgStringList &CmdArgs, 2116a3ec60e0cf2a1916f479288998d31bd980b1a306Daniel Dunbar const InputInfoList &Inputs, 2117a3ec60e0cf2a1916f479288998d31bd980b1a306Daniel Dunbar const ArgStringList &OutputArgs) const { 2118ee788e70fcd0adf76103b17c78ac658d4ea30c9bDaniel Dunbar const Driver &D = getToolChain().getDriver(); 2119a3ec60e0cf2a1916f479288998d31bd980b1a306Daniel Dunbar 2120a3ec60e0cf2a1916f479288998d31bd980b1a306Daniel Dunbar // Derived from cc1_options spec. 2121a3ec60e0cf2a1916f479288998d31bd980b1a306Daniel Dunbar if (Args.hasArg(options::OPT_fast) || 2122a3ec60e0cf2a1916f479288998d31bd980b1a306Daniel Dunbar Args.hasArg(options::OPT_fastf) || 2123a3ec60e0cf2a1916f479288998d31bd980b1a306Daniel Dunbar Args.hasArg(options::OPT_fastcp)) 2124a3ec60e0cf2a1916f479288998d31bd980b1a306Daniel Dunbar CmdArgs.push_back("-O3"); 2125c21c485b4fb58ef5d55cf3e523263dd824a2ace4Daniel Dunbar 2126a3ec60e0cf2a1916f479288998d31bd980b1a306Daniel Dunbar if (Arg *A = Args.getLastArg(options::OPT_pg)) 2127a3ec60e0cf2a1916f479288998d31bd980b1a306Daniel Dunbar if (Args.hasArg(options::OPT_fomit_frame_pointer)) 2128a3ec60e0cf2a1916f479288998d31bd980b1a306Daniel Dunbar D.Diag(clang::diag::err_drv_argument_not_allowed_with) 2129a3ec60e0cf2a1916f479288998d31bd980b1a306Daniel Dunbar << A->getAsString(Args) << "-fomit-frame-pointer"; 2130a3ec60e0cf2a1916f479288998d31bd980b1a306Daniel Dunbar 2131a3ec60e0cf2a1916f479288998d31bd980b1a306Daniel Dunbar AddCC1Args(Args, CmdArgs); 2132a3ec60e0cf2a1916f479288998d31bd980b1a306Daniel Dunbar 2133a3ec60e0cf2a1916f479288998d31bd980b1a306Daniel Dunbar if (!Args.hasArg(options::OPT_Q)) 2134a3ec60e0cf2a1916f479288998d31bd980b1a306Daniel Dunbar CmdArgs.push_back("-quiet"); 2135a3ec60e0cf2a1916f479288998d31bd980b1a306Daniel Dunbar 2136a3ec60e0cf2a1916f479288998d31bd980b1a306Daniel Dunbar CmdArgs.push_back("-dumpbase"); 2137a5a7bd0de7b6b80212095195a055a4a43f21d4b2Daniel Dunbar CmdArgs.push_back(darwin::CC1::getBaseInputName(Args, Inputs)); 2138a3ec60e0cf2a1916f479288998d31bd980b1a306Daniel Dunbar 2139a3ec60e0cf2a1916f479288998d31bd980b1a306Daniel Dunbar Args.AddAllArgs(CmdArgs, options::OPT_d_Group); 2140a3ec60e0cf2a1916f479288998d31bd980b1a306Daniel Dunbar 2141a3ec60e0cf2a1916f479288998d31bd980b1a306Daniel Dunbar Args.AddAllArgs(CmdArgs, options::OPT_m_Group); 2142a3ec60e0cf2a1916f479288998d31bd980b1a306Daniel Dunbar Args.AddAllArgs(CmdArgs, options::OPT_a_Group); 2143a3ec60e0cf2a1916f479288998d31bd980b1a306Daniel Dunbar 2144a3ec60e0cf2a1916f479288998d31bd980b1a306Daniel Dunbar // FIXME: The goal is to use the user provided -o if that is our 2145a3ec60e0cf2a1916f479288998d31bd980b1a306Daniel Dunbar // final output, otherwise to drive from the original input 2146a3ec60e0cf2a1916f479288998d31bd980b1a306Daniel Dunbar // name. Find a clean way to go about this. 2147a3ec60e0cf2a1916f479288998d31bd980b1a306Daniel Dunbar if ((Args.hasArg(options::OPT_c) || Args.hasArg(options::OPT_S)) && 2148a3ec60e0cf2a1916f479288998d31bd980b1a306Daniel Dunbar Args.hasArg(options::OPT_o)) { 2149a3ec60e0cf2a1916f479288998d31bd980b1a306Daniel Dunbar Arg *OutputOpt = Args.getLastArg(options::OPT_o); 2150a3ec60e0cf2a1916f479288998d31bd980b1a306Daniel Dunbar CmdArgs.push_back("-auxbase-strip"); 2151a3ec60e0cf2a1916f479288998d31bd980b1a306Daniel Dunbar CmdArgs.push_back(OutputOpt->getValue(Args)); 2152a3ec60e0cf2a1916f479288998d31bd980b1a306Daniel Dunbar } else { 2153a3ec60e0cf2a1916f479288998d31bd980b1a306Daniel Dunbar CmdArgs.push_back("-auxbase"); 2154a5a7bd0de7b6b80212095195a055a4a43f21d4b2Daniel Dunbar CmdArgs.push_back(darwin::CC1::getBaseInputStem(Args, Inputs)); 2155a3ec60e0cf2a1916f479288998d31bd980b1a306Daniel Dunbar } 2156a3ec60e0cf2a1916f479288998d31bd980b1a306Daniel Dunbar 2157a3ec60e0cf2a1916f479288998d31bd980b1a306Daniel Dunbar Args.AddAllArgs(CmdArgs, options::OPT_g_Group); 2158a3ec60e0cf2a1916f479288998d31bd980b1a306Daniel Dunbar 2159a3ec60e0cf2a1916f479288998d31bd980b1a306Daniel Dunbar Args.AddAllArgs(CmdArgs, options::OPT_O); 2160a3ec60e0cf2a1916f479288998d31bd980b1a306Daniel Dunbar // FIXME: -Wall is getting some special treatment. Investigate. 2161a3ec60e0cf2a1916f479288998d31bd980b1a306Daniel Dunbar Args.AddAllArgs(CmdArgs, options::OPT_W_Group, options::OPT_pedantic_Group); 2162a3ec60e0cf2a1916f479288998d31bd980b1a306Daniel Dunbar Args.AddLastArg(CmdArgs, options::OPT_w); 2163c21c485b4fb58ef5d55cf3e523263dd824a2ace4Daniel Dunbar Args.AddAllArgs(CmdArgs, options::OPT_std_EQ, options::OPT_ansi, 2164a3ec60e0cf2a1916f479288998d31bd980b1a306Daniel Dunbar options::OPT_trigraphs); 2165a3ff202ee4fb21728e930d5d029ba4925129912cDaniel Dunbar if (!Args.getLastArg(options::OPT_std_EQ, options::OPT_ansi)) { 2166a3ff202ee4fb21728e930d5d029ba4925129912cDaniel Dunbar // Honor -std-default. 2167a3ff202ee4fb21728e930d5d029ba4925129912cDaniel Dunbar Args.AddAllArgsTranslated(CmdArgs, options::OPT_std_default_EQ, 2168a3ff202ee4fb21728e930d5d029ba4925129912cDaniel Dunbar "-std=", /*Joined=*/true); 2169a3ff202ee4fb21728e930d5d029ba4925129912cDaniel Dunbar } 2170a3ff202ee4fb21728e930d5d029ba4925129912cDaniel Dunbar 2171a3ec60e0cf2a1916f479288998d31bd980b1a306Daniel Dunbar if (Args.hasArg(options::OPT_v)) 2172a3ec60e0cf2a1916f479288998d31bd980b1a306Daniel Dunbar CmdArgs.push_back("-version"); 2173a3ec60e0cf2a1916f479288998d31bd980b1a306Daniel Dunbar if (Args.hasArg(options::OPT_pg)) 2174a3ec60e0cf2a1916f479288998d31bd980b1a306Daniel Dunbar CmdArgs.push_back("-p"); 2175a3ec60e0cf2a1916f479288998d31bd980b1a306Daniel Dunbar Args.AddLastArg(CmdArgs, options::OPT_p); 2176c21c485b4fb58ef5d55cf3e523263dd824a2ace4Daniel Dunbar 2177a3ec60e0cf2a1916f479288998d31bd980b1a306Daniel Dunbar // The driver treats -fsyntax-only specially. 21782ba91575905a54f712a7f64304e56002e4882499Daniel Dunbar if (getToolChain().getTriple().getArch() == llvm::Triple::arm || 21792ba91575905a54f712a7f64304e56002e4882499Daniel Dunbar getToolChain().getTriple().getArch() == llvm::Triple::thumb) { 21802ba91575905a54f712a7f64304e56002e4882499Daniel Dunbar // Removes -fbuiltin-str{cat,cpy}; these aren't recognized by cc1 but are 21812ba91575905a54f712a7f64304e56002e4882499Daniel Dunbar // used to inhibit the default -fno-builtin-str{cat,cpy}. 21822ba91575905a54f712a7f64304e56002e4882499Daniel Dunbar // 21832ba91575905a54f712a7f64304e56002e4882499Daniel Dunbar // FIXME: Should we grow a better way to deal with "removing" args? 2184cdd9686b890ebdc10039ae256ef4c9dfb5ebacb7Daniel Dunbar for (arg_iterator it = Args.filtered_begin(options::OPT_f_Group, 2185cdd9686b890ebdc10039ae256ef4c9dfb5ebacb7Daniel Dunbar options::OPT_fsyntax_only), 2186cdd9686b890ebdc10039ae256ef4c9dfb5ebacb7Daniel Dunbar ie = Args.filtered_end(); it != ie; ++it) { 21877e4953e5c60409007545288f14b430bd23d68570Daniel Dunbar if (!(*it)->getOption().matches(options::OPT_fbuiltin_strcat) && 21887e4953e5c60409007545288f14b430bd23d68570Daniel Dunbar !(*it)->getOption().matches(options::OPT_fbuiltin_strcpy)) { 21897e4953e5c60409007545288f14b430bd23d68570Daniel Dunbar (*it)->claim(); 21907e4953e5c60409007545288f14b430bd23d68570Daniel Dunbar (*it)->render(Args, CmdArgs); 21912ba91575905a54f712a7f64304e56002e4882499Daniel Dunbar } 21922ba91575905a54f712a7f64304e56002e4882499Daniel Dunbar } 21932ba91575905a54f712a7f64304e56002e4882499Daniel Dunbar } else 21942ba91575905a54f712a7f64304e56002e4882499Daniel Dunbar Args.AddAllArgs(CmdArgs, options::OPT_f_Group, options::OPT_fsyntax_only); 2195c21c485b4fb58ef5d55cf3e523263dd824a2ace4Daniel Dunbar 2196a3ec60e0cf2a1916f479288998d31bd980b1a306Daniel Dunbar Args.AddAllArgs(CmdArgs, options::OPT_undef); 2197a3ec60e0cf2a1916f479288998d31bd980b1a306Daniel Dunbar if (Args.hasArg(options::OPT_Qn)) 2198a3ec60e0cf2a1916f479288998d31bd980b1a306Daniel Dunbar CmdArgs.push_back("-fno-ident"); 2199c21c485b4fb58ef5d55cf3e523263dd824a2ace4Daniel Dunbar 2200a3ec60e0cf2a1916f479288998d31bd980b1a306Daniel Dunbar // FIXME: This isn't correct. 2201a3ec60e0cf2a1916f479288998d31bd980b1a306Daniel Dunbar //Args.AddLastArg(CmdArgs, options::OPT__help) 2202a3ec60e0cf2a1916f479288998d31bd980b1a306Daniel Dunbar //Args.AddLastArg(CmdArgs, options::OPT__targetHelp) 2203a3ec60e0cf2a1916f479288998d31bd980b1a306Daniel Dunbar 2204a3ec60e0cf2a1916f479288998d31bd980b1a306Daniel Dunbar CmdArgs.append(OutputArgs.begin(), OutputArgs.end()); 2205a3ec60e0cf2a1916f479288998d31bd980b1a306Daniel Dunbar 2206a3ec60e0cf2a1916f479288998d31bd980b1a306Daniel Dunbar // FIXME: Still don't get what is happening here. Investigate. 2207a3ec60e0cf2a1916f479288998d31bd980b1a306Daniel Dunbar Args.AddAllArgs(CmdArgs, options::OPT__param); 2208a3ec60e0cf2a1916f479288998d31bd980b1a306Daniel Dunbar 2209a3ec60e0cf2a1916f479288998d31bd980b1a306Daniel Dunbar if (Args.hasArg(options::OPT_fmudflap) || 2210a3ec60e0cf2a1916f479288998d31bd980b1a306Daniel Dunbar Args.hasArg(options::OPT_fmudflapth)) { 2211a3ec60e0cf2a1916f479288998d31bd980b1a306Daniel Dunbar CmdArgs.push_back("-fno-builtin"); 2212a3ec60e0cf2a1916f479288998d31bd980b1a306Daniel Dunbar CmdArgs.push_back("-fno-merge-constants"); 2213a3ec60e0cf2a1916f479288998d31bd980b1a306Daniel Dunbar } 2214c21c485b4fb58ef5d55cf3e523263dd824a2ace4Daniel Dunbar 2215a3ec60e0cf2a1916f479288998d31bd980b1a306Daniel Dunbar if (Args.hasArg(options::OPT_coverage)) { 2216a3ec60e0cf2a1916f479288998d31bd980b1a306Daniel Dunbar CmdArgs.push_back("-fprofile-arcs"); 2217a3ec60e0cf2a1916f479288998d31bd980b1a306Daniel Dunbar CmdArgs.push_back("-ftest-coverage"); 2218a3ec60e0cf2a1916f479288998d31bd980b1a306Daniel Dunbar } 2219a3ec60e0cf2a1916f479288998d31bd980b1a306Daniel Dunbar 2220a3ec60e0cf2a1916f479288998d31bd980b1a306Daniel Dunbar if (types::isCXX(Inputs[0].getType())) 2221a3ec60e0cf2a1916f479288998d31bd980b1a306Daniel Dunbar CmdArgs.push_back("-D__private_extern__=extern"); 2222a3ec60e0cf2a1916f479288998d31bd980b1a306Daniel Dunbar} 2223a3ec60e0cf2a1916f479288998d31bd980b1a306Daniel Dunbar 2224a3ec60e0cf2a1916f479288998d31bd980b1a306Daniel Dunbarvoid darwin::CC1::AddCPPOptionsArgs(const ArgList &Args, ArgStringList &CmdArgs, 2225a3ec60e0cf2a1916f479288998d31bd980b1a306Daniel Dunbar const InputInfoList &Inputs, 2226a3ec60e0cf2a1916f479288998d31bd980b1a306Daniel Dunbar const ArgStringList &OutputArgs) const { 2227a3ec60e0cf2a1916f479288998d31bd980b1a306Daniel Dunbar // Derived from cpp_options 2228a3ec60e0cf2a1916f479288998d31bd980b1a306Daniel Dunbar AddCPPUniqueOptionsArgs(Args, CmdArgs, Inputs); 2229c21c485b4fb58ef5d55cf3e523263dd824a2ace4Daniel Dunbar 2230a3ec60e0cf2a1916f479288998d31bd980b1a306Daniel Dunbar CmdArgs.append(OutputArgs.begin(), OutputArgs.end()); 2231a3ec60e0cf2a1916f479288998d31bd980b1a306Daniel Dunbar 2232a3ec60e0cf2a1916f479288998d31bd980b1a306Daniel Dunbar AddCC1Args(Args, CmdArgs); 2233a3ec60e0cf2a1916f479288998d31bd980b1a306Daniel Dunbar 2234a3ec60e0cf2a1916f479288998d31bd980b1a306Daniel Dunbar // NOTE: The code below has some commonality with cpp_options, but 2235a3ec60e0cf2a1916f479288998d31bd980b1a306Daniel Dunbar // in classic gcc style ends up sending things in different 2236a3ec60e0cf2a1916f479288998d31bd980b1a306Daniel Dunbar // orders. This may be a good merge candidate once we drop pedantic 2237a3ec60e0cf2a1916f479288998d31bd980b1a306Daniel Dunbar // compatibility. 2238a3ec60e0cf2a1916f479288998d31bd980b1a306Daniel Dunbar 2239a3ec60e0cf2a1916f479288998d31bd980b1a306Daniel Dunbar Args.AddAllArgs(CmdArgs, options::OPT_m_Group); 2240c21c485b4fb58ef5d55cf3e523263dd824a2ace4Daniel Dunbar Args.AddAllArgs(CmdArgs, options::OPT_std_EQ, options::OPT_ansi, 2241a3ec60e0cf2a1916f479288998d31bd980b1a306Daniel Dunbar options::OPT_trigraphs); 2242a3ff202ee4fb21728e930d5d029ba4925129912cDaniel Dunbar if (!Args.getLastArg(options::OPT_std_EQ, options::OPT_ansi)) { 2243a3ff202ee4fb21728e930d5d029ba4925129912cDaniel Dunbar // Honor -std-default. 2244a3ff202ee4fb21728e930d5d029ba4925129912cDaniel Dunbar Args.AddAllArgsTranslated(CmdArgs, options::OPT_std_default_EQ, 2245a3ff202ee4fb21728e930d5d029ba4925129912cDaniel Dunbar "-std=", /*Joined=*/true); 2246a3ff202ee4fb21728e930d5d029ba4925129912cDaniel Dunbar } 2247a3ec60e0cf2a1916f479288998d31bd980b1a306Daniel Dunbar Args.AddAllArgs(CmdArgs, options::OPT_W_Group, options::OPT_pedantic_Group); 2248a3ec60e0cf2a1916f479288998d31bd980b1a306Daniel Dunbar Args.AddLastArg(CmdArgs, options::OPT_w); 2249c21c485b4fb58ef5d55cf3e523263dd824a2ace4Daniel Dunbar 2250a3ec60e0cf2a1916f479288998d31bd980b1a306Daniel Dunbar // The driver treats -fsyntax-only specially. 2251a3ec60e0cf2a1916f479288998d31bd980b1a306Daniel Dunbar Args.AddAllArgs(CmdArgs, options::OPT_f_Group, options::OPT_fsyntax_only); 2252a3ec60e0cf2a1916f479288998d31bd980b1a306Daniel Dunbar 2253a3ec60e0cf2a1916f479288998d31bd980b1a306Daniel Dunbar if (Args.hasArg(options::OPT_g_Group) && !Args.hasArg(options::OPT_g0) && 2254a3ec60e0cf2a1916f479288998d31bd980b1a306Daniel Dunbar !Args.hasArg(options::OPT_fno_working_directory)) 2255a3ec60e0cf2a1916f479288998d31bd980b1a306Daniel Dunbar CmdArgs.push_back("-fworking-directory"); 2256a3ec60e0cf2a1916f479288998d31bd980b1a306Daniel Dunbar 2257a3ec60e0cf2a1916f479288998d31bd980b1a306Daniel Dunbar Args.AddAllArgs(CmdArgs, options::OPT_O); 2258a3ec60e0cf2a1916f479288998d31bd980b1a306Daniel Dunbar Args.AddAllArgs(CmdArgs, options::OPT_undef); 2259a3ec60e0cf2a1916f479288998d31bd980b1a306Daniel Dunbar if (Args.hasArg(options::OPT_save_temps)) 2260a3ec60e0cf2a1916f479288998d31bd980b1a306Daniel Dunbar CmdArgs.push_back("-fpch-preprocess"); 2261a3ec60e0cf2a1916f479288998d31bd980b1a306Daniel Dunbar} 2262a3ec60e0cf2a1916f479288998d31bd980b1a306Daniel Dunbar 2263c21c485b4fb58ef5d55cf3e523263dd824a2ace4Daniel Dunbarvoid darwin::CC1::AddCPPUniqueOptionsArgs(const ArgList &Args, 2264a3ec60e0cf2a1916f479288998d31bd980b1a306Daniel Dunbar ArgStringList &CmdArgs, 22651eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump const InputInfoList &Inputs) const { 2266ee788e70fcd0adf76103b17c78ac658d4ea30c9bDaniel Dunbar const Driver &D = getToolChain().getDriver(); 2267a3ec60e0cf2a1916f479288998d31bd980b1a306Daniel Dunbar 226888a3d6cf5ebab81614f89ba48a8d89023270637aDaniel Dunbar CheckPreprocessingOptions(D, Args); 226988a3d6cf5ebab81614f89ba48a8d89023270637aDaniel Dunbar 2270a3ec60e0cf2a1916f479288998d31bd980b1a306Daniel Dunbar // Derived from cpp_unique_options. 227188a3d6cf5ebab81614f89ba48a8d89023270637aDaniel Dunbar // -{C,CC} only with -E is checked in CheckPreprocessingOptions(). 227288a3d6cf5ebab81614f89ba48a8d89023270637aDaniel Dunbar Args.AddLastArg(CmdArgs, options::OPT_C); 227388a3d6cf5ebab81614f89ba48a8d89023270637aDaniel Dunbar Args.AddLastArg(CmdArgs, options::OPT_CC); 2274a3ec60e0cf2a1916f479288998d31bd980b1a306Daniel Dunbar if (!Args.hasArg(options::OPT_Q)) 2275a3ec60e0cf2a1916f479288998d31bd980b1a306Daniel Dunbar CmdArgs.push_back("-quiet"); 2276a3ec60e0cf2a1916f479288998d31bd980b1a306Daniel Dunbar Args.AddAllArgs(CmdArgs, options::OPT_nostdinc); 22774c2bcad7b843c10fd4a2ffd43da40bfefb4dc8baDouglas Gregor Args.AddAllArgs(CmdArgs, options::OPT_nostdincxx); 2278a3ec60e0cf2a1916f479288998d31bd980b1a306Daniel Dunbar Args.AddLastArg(CmdArgs, options::OPT_v); 2279a3ec60e0cf2a1916f479288998d31bd980b1a306Daniel Dunbar Args.AddAllArgs(CmdArgs, options::OPT_I_Group, options::OPT_F); 2280a3ec60e0cf2a1916f479288998d31bd980b1a306Daniel Dunbar Args.AddLastArg(CmdArgs, options::OPT_P); 2281a3ec60e0cf2a1916f479288998d31bd980b1a306Daniel Dunbar 2282a3ec60e0cf2a1916f479288998d31bd980b1a306Daniel Dunbar // FIXME: Handle %I properly. 2283a3ec60e0cf2a1916f479288998d31bd980b1a306Daniel Dunbar if (getToolChain().getArchName() == "x86_64") { 2284a3ec60e0cf2a1916f479288998d31bd980b1a306Daniel Dunbar CmdArgs.push_back("-imultilib"); 2285a3ec60e0cf2a1916f479288998d31bd980b1a306Daniel Dunbar CmdArgs.push_back("x86_64"); 2286a3ec60e0cf2a1916f479288998d31bd980b1a306Daniel Dunbar } 2287a3ec60e0cf2a1916f479288998d31bd980b1a306Daniel Dunbar 2288a3ec60e0cf2a1916f479288998d31bd980b1a306Daniel Dunbar if (Args.hasArg(options::OPT_MD)) { 2289a3ec60e0cf2a1916f479288998d31bd980b1a306Daniel Dunbar CmdArgs.push_back("-MD"); 2290a5a7bd0de7b6b80212095195a055a4a43f21d4b2Daniel Dunbar CmdArgs.push_back(darwin::CC1::getDependencyFileName(Args, Inputs)); 2291a3ec60e0cf2a1916f479288998d31bd980b1a306Daniel Dunbar } 2292a3ec60e0cf2a1916f479288998d31bd980b1a306Daniel Dunbar 2293a3ec60e0cf2a1916f479288998d31bd980b1a306Daniel Dunbar if (Args.hasArg(options::OPT_MMD)) { 2294a3ec60e0cf2a1916f479288998d31bd980b1a306Daniel Dunbar CmdArgs.push_back("-MMD"); 2295a5a7bd0de7b6b80212095195a055a4a43f21d4b2Daniel Dunbar CmdArgs.push_back(darwin::CC1::getDependencyFileName(Args, Inputs)); 2296a3ec60e0cf2a1916f479288998d31bd980b1a306Daniel Dunbar } 2297a3ec60e0cf2a1916f479288998d31bd980b1a306Daniel Dunbar 2298a3ec60e0cf2a1916f479288998d31bd980b1a306Daniel Dunbar Args.AddLastArg(CmdArgs, options::OPT_M); 2299a3ec60e0cf2a1916f479288998d31bd980b1a306Daniel Dunbar Args.AddLastArg(CmdArgs, options::OPT_MM); 2300a3ec60e0cf2a1916f479288998d31bd980b1a306Daniel Dunbar Args.AddAllArgs(CmdArgs, options::OPT_MF); 2301a3ec60e0cf2a1916f479288998d31bd980b1a306Daniel Dunbar Args.AddLastArg(CmdArgs, options::OPT_MG); 2302a3ec60e0cf2a1916f479288998d31bd980b1a306Daniel Dunbar Args.AddLastArg(CmdArgs, options::OPT_MP); 2303a3ec60e0cf2a1916f479288998d31bd980b1a306Daniel Dunbar Args.AddAllArgs(CmdArgs, options::OPT_MQ); 2304a3ec60e0cf2a1916f479288998d31bd980b1a306Daniel Dunbar Args.AddAllArgs(CmdArgs, options::OPT_MT); 2305a3ec60e0cf2a1916f479288998d31bd980b1a306Daniel Dunbar if (!Args.hasArg(options::OPT_M) && !Args.hasArg(options::OPT_MM) && 2306a3ec60e0cf2a1916f479288998d31bd980b1a306Daniel Dunbar (Args.hasArg(options::OPT_MD) || Args.hasArg(options::OPT_MMD))) { 2307a3ec60e0cf2a1916f479288998d31bd980b1a306Daniel Dunbar if (Arg *OutputOpt = Args.getLastArg(options::OPT_o)) { 2308a3ec60e0cf2a1916f479288998d31bd980b1a306Daniel Dunbar CmdArgs.push_back("-MQ"); 2309a3ec60e0cf2a1916f479288998d31bd980b1a306Daniel Dunbar CmdArgs.push_back(OutputOpt->getValue(Args)); 2310a3ec60e0cf2a1916f479288998d31bd980b1a306Daniel Dunbar } 2311a3ec60e0cf2a1916f479288998d31bd980b1a306Daniel Dunbar } 2312a3ec60e0cf2a1916f479288998d31bd980b1a306Daniel Dunbar 2313a3ec60e0cf2a1916f479288998d31bd980b1a306Daniel Dunbar Args.AddLastArg(CmdArgs, options::OPT_remap); 2314a3ec60e0cf2a1916f479288998d31bd980b1a306Daniel Dunbar if (Args.hasArg(options::OPT_g3)) 2315a3ec60e0cf2a1916f479288998d31bd980b1a306Daniel Dunbar CmdArgs.push_back("-dD"); 2316a3ec60e0cf2a1916f479288998d31bd980b1a306Daniel Dunbar Args.AddLastArg(CmdArgs, options::OPT_H); 2317a3ec60e0cf2a1916f479288998d31bd980b1a306Daniel Dunbar 2318a3ec60e0cf2a1916f479288998d31bd980b1a306Daniel Dunbar AddCPPArgs(Args, CmdArgs); 2319a3ec60e0cf2a1916f479288998d31bd980b1a306Daniel Dunbar 2320a3ec60e0cf2a1916f479288998d31bd980b1a306Daniel Dunbar Args.AddAllArgs(CmdArgs, options::OPT_D, options::OPT_U, options::OPT_A); 2321a3ec60e0cf2a1916f479288998d31bd980b1a306Daniel Dunbar Args.AddAllArgs(CmdArgs, options::OPT_i_Group); 2322a3ec60e0cf2a1916f479288998d31bd980b1a306Daniel Dunbar 2323a3ec60e0cf2a1916f479288998d31bd980b1a306Daniel Dunbar for (InputInfoList::const_iterator 2324a3ec60e0cf2a1916f479288998d31bd980b1a306Daniel Dunbar it = Inputs.begin(), ie = Inputs.end(); it != ie; ++it) { 2325a3ec60e0cf2a1916f479288998d31bd980b1a306Daniel Dunbar const InputInfo &II = *it; 2326c21c485b4fb58ef5d55cf3e523263dd824a2ace4Daniel Dunbar 23277c1e46533cae07216e2a67d5636a5afb44253155Daniel Dunbar CmdArgs.push_back(II.getFilename()); 2328a3ec60e0cf2a1916f479288998d31bd980b1a306Daniel Dunbar } 2329a3ec60e0cf2a1916f479288998d31bd980b1a306Daniel Dunbar 2330a3ec60e0cf2a1916f479288998d31bd980b1a306Daniel Dunbar Args.AddAllArgValues(CmdArgs, options::OPT_Wp_COMMA, 2331a3ec60e0cf2a1916f479288998d31bd980b1a306Daniel Dunbar options::OPT_Xpreprocessor); 2332a3ec60e0cf2a1916f479288998d31bd980b1a306Daniel Dunbar 2333a3ec60e0cf2a1916f479288998d31bd980b1a306Daniel Dunbar if (Args.hasArg(options::OPT_fmudflap)) { 2334a3ec60e0cf2a1916f479288998d31bd980b1a306Daniel Dunbar CmdArgs.push_back("-D_MUDFLAP"); 2335a3ec60e0cf2a1916f479288998d31bd980b1a306Daniel Dunbar CmdArgs.push_back("-include"); 2336a3ec60e0cf2a1916f479288998d31bd980b1a306Daniel Dunbar CmdArgs.push_back("mf-runtime.h"); 2337a3ec60e0cf2a1916f479288998d31bd980b1a306Daniel Dunbar } 2338a3ec60e0cf2a1916f479288998d31bd980b1a306Daniel Dunbar 2339a3ec60e0cf2a1916f479288998d31bd980b1a306Daniel Dunbar if (Args.hasArg(options::OPT_fmudflapth)) { 2340a3ec60e0cf2a1916f479288998d31bd980b1a306Daniel Dunbar CmdArgs.push_back("-D_MUDFLAP"); 2341a3ec60e0cf2a1916f479288998d31bd980b1a306Daniel Dunbar CmdArgs.push_back("-D_MUDFLAPTH"); 2342a3ec60e0cf2a1916f479288998d31bd980b1a306Daniel Dunbar CmdArgs.push_back("-include"); 2343a3ec60e0cf2a1916f479288998d31bd980b1a306Daniel Dunbar CmdArgs.push_back("mf-runtime.h"); 2344a3ec60e0cf2a1916f479288998d31bd980b1a306Daniel Dunbar } 2345a3ec60e0cf2a1916f479288998d31bd980b1a306Daniel Dunbar} 2346a3ec60e0cf2a1916f479288998d31bd980b1a306Daniel Dunbar 2347c21c485b4fb58ef5d55cf3e523263dd824a2ace4Daniel Dunbarvoid darwin::CC1::AddCPPArgs(const ArgList &Args, 2348a3ec60e0cf2a1916f479288998d31bd980b1a306Daniel Dunbar ArgStringList &CmdArgs) const { 2349a3ec60e0cf2a1916f479288998d31bd980b1a306Daniel Dunbar // Derived from cpp spec. 2350a3ec60e0cf2a1916f479288998d31bd980b1a306Daniel Dunbar 2351a3ec60e0cf2a1916f479288998d31bd980b1a306Daniel Dunbar if (Args.hasArg(options::OPT_static)) { 2352a3ec60e0cf2a1916f479288998d31bd980b1a306Daniel Dunbar // The gcc spec is broken here, it refers to dynamic but 2353a3ec60e0cf2a1916f479288998d31bd980b1a306Daniel Dunbar // that has been translated. Start by being bug compatible. 2354c21c485b4fb58ef5d55cf3e523263dd824a2ace4Daniel Dunbar 2355a3ec60e0cf2a1916f479288998d31bd980b1a306Daniel Dunbar // if (!Args.hasArg(arglist.parser.dynamicOption)) 2356a3ec60e0cf2a1916f479288998d31bd980b1a306Daniel Dunbar CmdArgs.push_back("-D__STATIC__"); 2357a3ec60e0cf2a1916f479288998d31bd980b1a306Daniel Dunbar } else 2358a3ec60e0cf2a1916f479288998d31bd980b1a306Daniel Dunbar CmdArgs.push_back("-D__DYNAMIC__"); 2359a3ec60e0cf2a1916f479288998d31bd980b1a306Daniel Dunbar 2360a3ec60e0cf2a1916f479288998d31bd980b1a306Daniel Dunbar if (Args.hasArg(options::OPT_pthread)) 2361a3ec60e0cf2a1916f479288998d31bd980b1a306Daniel Dunbar CmdArgs.push_back("-D_REENTRANT"); 2362a3ec60e0cf2a1916f479288998d31bd980b1a306Daniel Dunbar} 2363a3ec60e0cf2a1916f479288998d31bd980b1a306Daniel Dunbar 236440f1265ebd42ece3e7f7917319b56012e8e2bce2Daniel Dunbarvoid darwin::Preprocess::ConstructJob(Compilation &C, const JobAction &JA, 23652fe238ed293bd4bc27af9beb9fa151fad2146fa8Daniel Dunbar const InputInfo &Output, 2366c21c485b4fb58ef5d55cf3e523263dd824a2ace4Daniel Dunbar const InputInfoList &Inputs, 2367c21c485b4fb58ef5d55cf3e523263dd824a2ace4Daniel Dunbar const ArgList &Args, 236840f1265ebd42ece3e7f7917319b56012e8e2bce2Daniel Dunbar const char *LinkingOutput) const { 236940f1265ebd42ece3e7f7917319b56012e8e2bce2Daniel Dunbar ArgStringList CmdArgs; 237040f1265ebd42ece3e7f7917319b56012e8e2bce2Daniel Dunbar 237140f1265ebd42ece3e7f7917319b56012e8e2bce2Daniel Dunbar assert(Inputs.size() == 1 && "Unexpected number of inputs!"); 237240f1265ebd42ece3e7f7917319b56012e8e2bce2Daniel Dunbar 237340f1265ebd42ece3e7f7917319b56012e8e2bce2Daniel Dunbar CmdArgs.push_back("-E"); 237440f1265ebd42ece3e7f7917319b56012e8e2bce2Daniel Dunbar 237540f1265ebd42ece3e7f7917319b56012e8e2bce2Daniel Dunbar if (Args.hasArg(options::OPT_traditional) || 237640f1265ebd42ece3e7f7917319b56012e8e2bce2Daniel Dunbar Args.hasArg(options::OPT_traditional_cpp)) 237740f1265ebd42ece3e7f7917319b56012e8e2bce2Daniel Dunbar CmdArgs.push_back("-traditional-cpp"); 2378c21c485b4fb58ef5d55cf3e523263dd824a2ace4Daniel Dunbar 237940f1265ebd42ece3e7f7917319b56012e8e2bce2Daniel Dunbar ArgStringList OutputArgs; 23807c1e46533cae07216e2a67d5636a5afb44253155Daniel Dunbar assert(Output.isFilename() && "Unexpected CC1 output."); 23817c1e46533cae07216e2a67d5636a5afb44253155Daniel Dunbar OutputArgs.push_back("-o"); 23827c1e46533cae07216e2a67d5636a5afb44253155Daniel Dunbar OutputArgs.push_back(Output.getFilename()); 238340f1265ebd42ece3e7f7917319b56012e8e2bce2Daniel Dunbar 23849120f179fd2e354f067e4ef2c76dcf3fc4db8a16Daniel Dunbar if (Args.hasArg(options::OPT_E)) { 23859120f179fd2e354f067e4ef2c76dcf3fc4db8a16Daniel Dunbar AddCPPOptionsArgs(Args, CmdArgs, Inputs, OutputArgs); 23869120f179fd2e354f067e4ef2c76dcf3fc4db8a16Daniel Dunbar } else { 23879120f179fd2e354f067e4ef2c76dcf3fc4db8a16Daniel Dunbar AddCPPOptionsArgs(Args, CmdArgs, Inputs, ArgStringList()); 23889120f179fd2e354f067e4ef2c76dcf3fc4db8a16Daniel Dunbar CmdArgs.append(OutputArgs.begin(), OutputArgs.end()); 23899120f179fd2e354f067e4ef2c76dcf3fc4db8a16Daniel Dunbar } 2390c21c485b4fb58ef5d55cf3e523263dd824a2ace4Daniel Dunbar 23918a2073a85670a13b0bcc1726bc7f80d458f8245bDaniel Dunbar Args.AddAllArgs(CmdArgs, options::OPT_d_Group); 23928a2073a85670a13b0bcc1726bc7f80d458f8245bDaniel Dunbar 239340f1265ebd42ece3e7f7917319b56012e8e2bce2Daniel Dunbar const char *CC1Name = getCC1Name(Inputs[0].getType()); 2394c21c485b4fb58ef5d55cf3e523263dd824a2ace4Daniel Dunbar const char *Exec = 23954a7e88978cf646ad10d654020cb00b3877069210Daniel Dunbar Args.MakeArgString(getToolChain().GetProgramPath(CC1Name)); 23962fe238ed293bd4bc27af9beb9fa151fad2146fa8Daniel Dunbar C.addCommand(new Command(JA, *this, Exec, CmdArgs)); 239740f1265ebd42ece3e7f7917319b56012e8e2bce2Daniel Dunbar} 239840f1265ebd42ece3e7f7917319b56012e8e2bce2Daniel Dunbar 239940f1265ebd42ece3e7f7917319b56012e8e2bce2Daniel Dunbarvoid darwin::Compile::ConstructJob(Compilation &C, const JobAction &JA, 24002fe238ed293bd4bc27af9beb9fa151fad2146fa8Daniel Dunbar const InputInfo &Output, 2401c21c485b4fb58ef5d55cf3e523263dd824a2ace4Daniel Dunbar const InputInfoList &Inputs, 2402c21c485b4fb58ef5d55cf3e523263dd824a2ace4Daniel Dunbar const ArgList &Args, 240340f1265ebd42ece3e7f7917319b56012e8e2bce2Daniel Dunbar const char *LinkingOutput) const { 2404ee788e70fcd0adf76103b17c78ac658d4ea30c9bDaniel Dunbar const Driver &D = getToolChain().getDriver(); 240540f1265ebd42ece3e7f7917319b56012e8e2bce2Daniel Dunbar ArgStringList CmdArgs; 240640f1265ebd42ece3e7f7917319b56012e8e2bce2Daniel Dunbar 240740f1265ebd42ece3e7f7917319b56012e8e2bce2Daniel Dunbar assert(Inputs.size() == 1 && "Unexpected number of inputs!"); 240840f1265ebd42ece3e7f7917319b56012e8e2bce2Daniel Dunbar 240940f1265ebd42ece3e7f7917319b56012e8e2bce2Daniel Dunbar types::ID InputType = Inputs[0].getType(); 241040f1265ebd42ece3e7f7917319b56012e8e2bce2Daniel Dunbar const Arg *A; 2411ceb5c5b7f67a30fae305d1d19b478b623e4fbcedEli Friedman if ((A = Args.getLastArg(options::OPT_traditional))) 241240f1265ebd42ece3e7f7917319b56012e8e2bce2Daniel Dunbar D.Diag(clang::diag::err_drv_argument_only_allowed_with) 241340f1265ebd42ece3e7f7917319b56012e8e2bce2Daniel Dunbar << A->getAsString(Args) << "-E"; 241440f1265ebd42ece3e7f7917319b56012e8e2bce2Daniel Dunbar 24156c6424bc0d3b5f080a97b5f6ef4a8d70c38e38f5Daniel Dunbar if (JA.getType() == types::TY_LLVM_IR || 24166c6424bc0d3b5f080a97b5f6ef4a8d70c38e38f5Daniel Dunbar JA.getType() == types::TY_LTO_IR) 241740f1265ebd42ece3e7f7917319b56012e8e2bce2Daniel Dunbar CmdArgs.push_back("-emit-llvm"); 24186c6424bc0d3b5f080a97b5f6ef4a8d70c38e38f5Daniel Dunbar else if (JA.getType() == types::TY_LLVM_BC || 24196c6424bc0d3b5f080a97b5f6ef4a8d70c38e38f5Daniel Dunbar JA.getType() == types::TY_LTO_BC) 242040f1265ebd42ece3e7f7917319b56012e8e2bce2Daniel Dunbar CmdArgs.push_back("-emit-llvm-bc"); 24215915fbf310e171c4cd3c2af05e9de360c0fa988aDaniel Dunbar else if (Output.getType() == types::TY_AST) 24225915fbf310e171c4cd3c2af05e9de360c0fa988aDaniel Dunbar D.Diag(clang::diag::err_drv_no_ast_support) 2423881376467c46c5c6cc16fa6790271c2c22e1d4f1Daniel Dunbar << getToolChain().getTripleString(); 2424ae24a88655c461e751d0984cc21dda6e17882356Daniel Dunbar else if (JA.getType() != types::TY_PP_Asm && 2425ae24a88655c461e751d0984cc21dda6e17882356Daniel Dunbar JA.getType() != types::TY_PCH) 242664952508c2b0c8bffb45c8b410f0af3d2457f59bDaniel Dunbar D.Diag(clang::diag::err_drv_invalid_gcc_output_type) 242764952508c2b0c8bffb45c8b410f0af3d2457f59bDaniel Dunbar << getTypeName(JA.getType()); 242840f1265ebd42ece3e7f7917319b56012e8e2bce2Daniel Dunbar 242940f1265ebd42ece3e7f7917319b56012e8e2bce2Daniel Dunbar ArgStringList OutputArgs; 243040f1265ebd42ece3e7f7917319b56012e8e2bce2Daniel Dunbar if (Output.getType() != types::TY_PCH) { 243140f1265ebd42ece3e7f7917319b56012e8e2bce2Daniel Dunbar OutputArgs.push_back("-o"); 24327c1e46533cae07216e2a67d5636a5afb44253155Daniel Dunbar if (Output.isNothing()) 243340f1265ebd42ece3e7f7917319b56012e8e2bce2Daniel Dunbar OutputArgs.push_back("/dev/null"); 243440f1265ebd42ece3e7f7917319b56012e8e2bce2Daniel Dunbar else 243540f1265ebd42ece3e7f7917319b56012e8e2bce2Daniel Dunbar OutputArgs.push_back(Output.getFilename()); 243640f1265ebd42ece3e7f7917319b56012e8e2bce2Daniel Dunbar } 243740f1265ebd42ece3e7f7917319b56012e8e2bce2Daniel Dunbar 243840f1265ebd42ece3e7f7917319b56012e8e2bce2Daniel Dunbar // There is no need for this level of compatibility, but it makes 243940f1265ebd42ece3e7f7917319b56012e8e2bce2Daniel Dunbar // diffing easier. 244040f1265ebd42ece3e7f7917319b56012e8e2bce2Daniel Dunbar bool OutputArgsEarly = (Args.hasArg(options::OPT_fsyntax_only) || 244140f1265ebd42ece3e7f7917319b56012e8e2bce2Daniel Dunbar Args.hasArg(options::OPT_S)); 244240f1265ebd42ece3e7f7917319b56012e8e2bce2Daniel Dunbar 244340f1265ebd42ece3e7f7917319b56012e8e2bce2Daniel Dunbar if (types::getPreprocessedType(InputType) != types::TY_INVALID) { 2444a3ec60e0cf2a1916f479288998d31bd980b1a306Daniel Dunbar AddCPPUniqueOptionsArgs(Args, CmdArgs, Inputs); 244540f1265ebd42ece3e7f7917319b56012e8e2bce2Daniel Dunbar if (OutputArgsEarly) { 244640f1265ebd42ece3e7f7917319b56012e8e2bce2Daniel Dunbar AddCC1OptionsArgs(Args, CmdArgs, Inputs, OutputArgs); 244740f1265ebd42ece3e7f7917319b56012e8e2bce2Daniel Dunbar } else { 244840f1265ebd42ece3e7f7917319b56012e8e2bce2Daniel Dunbar AddCC1OptionsArgs(Args, CmdArgs, Inputs, ArgStringList()); 244940f1265ebd42ece3e7f7917319b56012e8e2bce2Daniel Dunbar CmdArgs.append(OutputArgs.begin(), OutputArgs.end()); 245040f1265ebd42ece3e7f7917319b56012e8e2bce2Daniel Dunbar } 245140f1265ebd42ece3e7f7917319b56012e8e2bce2Daniel Dunbar } else { 245240f1265ebd42ece3e7f7917319b56012e8e2bce2Daniel Dunbar CmdArgs.push_back("-fpreprocessed"); 2453c21c485b4fb58ef5d55cf3e523263dd824a2ace4Daniel Dunbar 245440f1265ebd42ece3e7f7917319b56012e8e2bce2Daniel Dunbar for (InputInfoList::const_iterator 245540f1265ebd42ece3e7f7917319b56012e8e2bce2Daniel Dunbar it = Inputs.begin(), ie = Inputs.end(); it != ie; ++it) { 245640f1265ebd42ece3e7f7917319b56012e8e2bce2Daniel Dunbar const InputInfo &II = *it; 245740f1265ebd42ece3e7f7917319b56012e8e2bce2Daniel Dunbar 24585915fbf310e171c4cd3c2af05e9de360c0fa988aDaniel Dunbar // Reject AST inputs. 24595915fbf310e171c4cd3c2af05e9de360c0fa988aDaniel Dunbar if (II.getType() == types::TY_AST) { 24605915fbf310e171c4cd3c2af05e9de360c0fa988aDaniel Dunbar D.Diag(clang::diag::err_drv_no_ast_support) 2461881376467c46c5c6cc16fa6790271c2c22e1d4f1Daniel Dunbar << getToolChain().getTripleString(); 24625915fbf310e171c4cd3c2af05e9de360c0fa988aDaniel Dunbar return; 24635915fbf310e171c4cd3c2af05e9de360c0fa988aDaniel Dunbar } 24645915fbf310e171c4cd3c2af05e9de360c0fa988aDaniel Dunbar 24657c1e46533cae07216e2a67d5636a5afb44253155Daniel Dunbar CmdArgs.push_back(II.getFilename()); 246640f1265ebd42ece3e7f7917319b56012e8e2bce2Daniel Dunbar } 246740f1265ebd42ece3e7f7917319b56012e8e2bce2Daniel Dunbar 246840f1265ebd42ece3e7f7917319b56012e8e2bce2Daniel Dunbar if (OutputArgsEarly) { 246940f1265ebd42ece3e7f7917319b56012e8e2bce2Daniel Dunbar AddCC1OptionsArgs(Args, CmdArgs, Inputs, OutputArgs); 247040f1265ebd42ece3e7f7917319b56012e8e2bce2Daniel Dunbar } else { 247140f1265ebd42ece3e7f7917319b56012e8e2bce2Daniel Dunbar AddCC1OptionsArgs(Args, CmdArgs, Inputs, ArgStringList()); 247240f1265ebd42ece3e7f7917319b56012e8e2bce2Daniel Dunbar CmdArgs.append(OutputArgs.begin(), OutputArgs.end()); 247340f1265ebd42ece3e7f7917319b56012e8e2bce2Daniel Dunbar } 247440f1265ebd42ece3e7f7917319b56012e8e2bce2Daniel Dunbar } 2475c21c485b4fb58ef5d55cf3e523263dd824a2ace4Daniel Dunbar 247640f1265ebd42ece3e7f7917319b56012e8e2bce2Daniel Dunbar if (Output.getType() == types::TY_PCH) { 247740f1265ebd42ece3e7f7917319b56012e8e2bce2Daniel Dunbar assert(Output.isFilename() && "Invalid PCH output."); 247840f1265ebd42ece3e7f7917319b56012e8e2bce2Daniel Dunbar 247940f1265ebd42ece3e7f7917319b56012e8e2bce2Daniel Dunbar CmdArgs.push_back("-o"); 248040f1265ebd42ece3e7f7917319b56012e8e2bce2Daniel Dunbar // NOTE: gcc uses a temp .s file for this, but there doesn't seem 248140f1265ebd42ece3e7f7917319b56012e8e2bce2Daniel Dunbar // to be a good reason. 248240f1265ebd42ece3e7f7917319b56012e8e2bce2Daniel Dunbar CmdArgs.push_back("/dev/null"); 2483c21c485b4fb58ef5d55cf3e523263dd824a2ace4Daniel Dunbar 2484e6c9ae147835fb450a90800bd378420c0e5ffb35Daniel Dunbar CmdArgs.push_back("--output-pch="); 248540f1265ebd42ece3e7f7917319b56012e8e2bce2Daniel Dunbar CmdArgs.push_back(Output.getFilename()); 2486c21c485b4fb58ef5d55cf3e523263dd824a2ace4Daniel Dunbar } 248740f1265ebd42ece3e7f7917319b56012e8e2bce2Daniel Dunbar 248840f1265ebd42ece3e7f7917319b56012e8e2bce2Daniel Dunbar const char *CC1Name = getCC1Name(Inputs[0].getType()); 2489c21c485b4fb58ef5d55cf3e523263dd824a2ace4Daniel Dunbar const char *Exec = 24904a7e88978cf646ad10d654020cb00b3877069210Daniel Dunbar Args.MakeArgString(getToolChain().GetProgramPath(CC1Name)); 24912fe238ed293bd4bc27af9beb9fa151fad2146fa8Daniel Dunbar C.addCommand(new Command(JA, *this, Exec, CmdArgs)); 249240f1265ebd42ece3e7f7917319b56012e8e2bce2Daniel Dunbar} 249340f1265ebd42ece3e7f7917319b56012e8e2bce2Daniel Dunbar 24948cac5f7e1ce63dd77ee0fb4ef68f9fa804f41ea6Daniel Dunbarvoid darwin::Assemble::ConstructJob(Compilation &C, const JobAction &JA, 24952fe238ed293bd4bc27af9beb9fa151fad2146fa8Daniel Dunbar const InputInfo &Output, 2496c21c485b4fb58ef5d55cf3e523263dd824a2ace4Daniel Dunbar const InputInfoList &Inputs, 2497c21c485b4fb58ef5d55cf3e523263dd824a2ace4Daniel Dunbar const ArgList &Args, 24988cac5f7e1ce63dd77ee0fb4ef68f9fa804f41ea6Daniel Dunbar const char *LinkingOutput) const { 24998cac5f7e1ce63dd77ee0fb4ef68f9fa804f41ea6Daniel Dunbar ArgStringList CmdArgs; 25008cac5f7e1ce63dd77ee0fb4ef68f9fa804f41ea6Daniel Dunbar 25018cac5f7e1ce63dd77ee0fb4ef68f9fa804f41ea6Daniel Dunbar assert(Inputs.size() == 1 && "Unexpected number of inputs."); 25028cac5f7e1ce63dd77ee0fb4ef68f9fa804f41ea6Daniel Dunbar const InputInfo &Input = Inputs[0]; 25038cac5f7e1ce63dd77ee0fb4ef68f9fa804f41ea6Daniel Dunbar 25048cac5f7e1ce63dd77ee0fb4ef68f9fa804f41ea6Daniel Dunbar // Bit of a hack, this is only used for original inputs. 2505c21c485b4fb58ef5d55cf3e523263dd824a2ace4Daniel Dunbar // 25068e4fea6750dbac032c172f3279c63b7815b7423eDaniel Dunbar // FIXME: This is broken for preprocessed .s inputs. 25078cac5f7e1ce63dd77ee0fb4ef68f9fa804f41ea6Daniel Dunbar if (Input.isFilename() && 25088e4fea6750dbac032c172f3279c63b7815b7423eDaniel Dunbar strcmp(Input.getFilename(), Input.getBaseInput()) == 0) { 25098e4fea6750dbac032c172f3279c63b7815b7423eDaniel Dunbar if (Args.hasArg(options::OPT_gstabs)) 25108e4fea6750dbac032c172f3279c63b7815b7423eDaniel Dunbar CmdArgs.push_back("--gstabs"); 25118e4fea6750dbac032c172f3279c63b7815b7423eDaniel Dunbar else if (Args.hasArg(options::OPT_g_Group)) 25128e4fea6750dbac032c172f3279c63b7815b7423eDaniel Dunbar CmdArgs.push_back("--gdwarf2"); 25138e4fea6750dbac032c172f3279c63b7815b7423eDaniel Dunbar } 2514c21c485b4fb58ef5d55cf3e523263dd824a2ace4Daniel Dunbar 25158cac5f7e1ce63dd77ee0fb4ef68f9fa804f41ea6Daniel Dunbar // Derived from asm spec. 2516cc6f803f98fa6ba9a9c366400210448516d01b3cDaniel Dunbar AddDarwinArch(Args, CmdArgs); 2517cc6f803f98fa6ba9a9c366400210448516d01b3cDaniel Dunbar 2518f5438e3462f37d7c58f847b594b4b3ab84085d67Daniel Dunbar // Use -force_cpusubtype_ALL on x86 by default. 2519f5438e3462f37d7c58f847b594b4b3ab84085d67Daniel Dunbar if (getToolChain().getTriple().getArch() == llvm::Triple::x86 || 2520f5438e3462f37d7c58f847b594b4b3ab84085d67Daniel Dunbar getToolChain().getTriple().getArch() == llvm::Triple::x86_64 || 2521cc6f803f98fa6ba9a9c366400210448516d01b3cDaniel Dunbar Args.hasArg(options::OPT_force__cpusubtype__ALL)) 2522cc6f803f98fa6ba9a9c366400210448516d01b3cDaniel Dunbar CmdArgs.push_back("-force_cpusubtype_ALL"); 25238cac5f7e1ce63dd77ee0fb4ef68f9fa804f41ea6Daniel Dunbar 25240e2679d29be70186fc1197a1484948ed239922baDaniel Dunbar if (getToolChain().getTriple().getArch() != llvm::Triple::x86_64 && 25250e2679d29be70186fc1197a1484948ed239922baDaniel Dunbar (Args.hasArg(options::OPT_mkernel) || 25268cac5f7e1ce63dd77ee0fb4ef68f9fa804f41ea6Daniel Dunbar Args.hasArg(options::OPT_static) || 25270e2679d29be70186fc1197a1484948ed239922baDaniel Dunbar Args.hasArg(options::OPT_fapple_kext))) 2528c21c485b4fb58ef5d55cf3e523263dd824a2ace4Daniel Dunbar CmdArgs.push_back("-static"); 2529c21c485b4fb58ef5d55cf3e523263dd824a2ace4Daniel Dunbar 25308cac5f7e1ce63dd77ee0fb4ef68f9fa804f41ea6Daniel Dunbar Args.AddAllArgValues(CmdArgs, options::OPT_Wa_COMMA, 25318cac5f7e1ce63dd77ee0fb4ef68f9fa804f41ea6Daniel Dunbar options::OPT_Xassembler); 25328cac5f7e1ce63dd77ee0fb4ef68f9fa804f41ea6Daniel Dunbar 25338cac5f7e1ce63dd77ee0fb4ef68f9fa804f41ea6Daniel Dunbar assert(Output.isFilename() && "Unexpected lipo output."); 25348cac5f7e1ce63dd77ee0fb4ef68f9fa804f41ea6Daniel Dunbar CmdArgs.push_back("-o"); 25358cac5f7e1ce63dd77ee0fb4ef68f9fa804f41ea6Daniel Dunbar CmdArgs.push_back(Output.getFilename()); 25368cac5f7e1ce63dd77ee0fb4ef68f9fa804f41ea6Daniel Dunbar 25377c1e46533cae07216e2a67d5636a5afb44253155Daniel Dunbar assert(Input.isFilename() && "Invalid input."); 25387c1e46533cae07216e2a67d5636a5afb44253155Daniel Dunbar CmdArgs.push_back(Input.getFilename()); 25398cac5f7e1ce63dd77ee0fb4ef68f9fa804f41ea6Daniel Dunbar 25408cac5f7e1ce63dd77ee0fb4ef68f9fa804f41ea6Daniel Dunbar // asm_final spec is empty. 25418cac5f7e1ce63dd77ee0fb4ef68f9fa804f41ea6Daniel Dunbar 2542c21c485b4fb58ef5d55cf3e523263dd824a2ace4Daniel Dunbar const char *Exec = 25434a7e88978cf646ad10d654020cb00b3877069210Daniel Dunbar Args.MakeArgString(getToolChain().GetProgramPath("as")); 25442fe238ed293bd4bc27af9beb9fa151fad2146fa8Daniel Dunbar C.addCommand(new Command(JA, *this, Exec, CmdArgs)); 25458cac5f7e1ce63dd77ee0fb4ef68f9fa804f41ea6Daniel Dunbar} 2546ff7488dc9a766f94daf54d81b03ab9160d0bfd88Daniel Dunbar 2547fbefe6bd6f62a3361813498dc672ab0d6c0d4fd1Daniel Dunbarvoid darwin::DarwinTool::AddDarwinArch(const ArgList &Args, 2548fbefe6bd6f62a3361813498dc672ab0d6c0d4fd1Daniel Dunbar ArgStringList &CmdArgs) const { 2549eeff406730f50afd973f005a8d501a19af4785e5Daniel Dunbar llvm::StringRef ArchName = getDarwinToolChain().getDarwinArchName(Args); 2550eeff406730f50afd973f005a8d501a19af4785e5Daniel Dunbar 255102633b541b04ad5ffc1c70f4c2feeeb13e607057Daniel Dunbar // Derived from darwin_arch spec. 255202633b541b04ad5ffc1c70f4c2feeeb13e607057Daniel Dunbar CmdArgs.push_back("-arch"); 2553eeff406730f50afd973f005a8d501a19af4785e5Daniel Dunbar CmdArgs.push_back(Args.MakeArgString(ArchName)); 255478dbd580a02759bbc408dbefb6754afa71b2c24cDaniel Dunbar 2555eeff406730f50afd973f005a8d501a19af4785e5Daniel Dunbar // FIXME: Is this needed anymore? 2556eeff406730f50afd973f005a8d501a19af4785e5Daniel Dunbar if (ArchName == "arm") 255778dbd580a02759bbc408dbefb6754afa71b2c24cDaniel Dunbar CmdArgs.push_back("-force_cpusubtype_ALL"); 255802633b541b04ad5ffc1c70f4c2feeeb13e607057Daniel Dunbar} 255902633b541b04ad5ffc1c70f4c2feeeb13e607057Daniel Dunbar 2560748de8eda222f087434d8bd703176b316a061341Daniel Dunbarvoid darwin::Link::AddLinkArgs(Compilation &C, 2561748de8eda222f087434d8bd703176b316a061341Daniel Dunbar const ArgList &Args, 256202633b541b04ad5ffc1c70f4c2feeeb13e607057Daniel Dunbar ArgStringList &CmdArgs) const { 2563ee788e70fcd0adf76103b17c78ac658d4ea30c9bDaniel Dunbar const Driver &D = getToolChain().getDriver(); 256402633b541b04ad5ffc1c70f4c2feeeb13e607057Daniel Dunbar 2565b18dc5b8376f42f7b4802bf1279e95eeb813fa06Daniel Dunbar unsigned Version[3] = { 0, 0, 0 }; 2566b18dc5b8376f42f7b4802bf1279e95eeb813fa06Daniel Dunbar if (Arg *A = Args.getLastArg(options::OPT_mlinker_version_EQ)) { 2567b18dc5b8376f42f7b4802bf1279e95eeb813fa06Daniel Dunbar bool HadExtra; 2568b18dc5b8376f42f7b4802bf1279e95eeb813fa06Daniel Dunbar if (!Driver::GetReleaseVersion(A->getValue(Args), Version[0], 2569b18dc5b8376f42f7b4802bf1279e95eeb813fa06Daniel Dunbar Version[1], Version[2], HadExtra) || 2570b18dc5b8376f42f7b4802bf1279e95eeb813fa06Daniel Dunbar HadExtra) 2571b18dc5b8376f42f7b4802bf1279e95eeb813fa06Daniel Dunbar D.Diag(clang::diag::err_drv_invalid_version_number) 2572b18dc5b8376f42f7b4802bf1279e95eeb813fa06Daniel Dunbar << A->getAsString(Args); 2573b18dc5b8376f42f7b4802bf1279e95eeb813fa06Daniel Dunbar } 2574b18dc5b8376f42f7b4802bf1279e95eeb813fa06Daniel Dunbar 2575b18dc5b8376f42f7b4802bf1279e95eeb813fa06Daniel Dunbar // Newer linkers support -demangle, pass it if supported and not disabled by 2576b18dc5b8376f42f7b4802bf1279e95eeb813fa06Daniel Dunbar // the user. 2577a30d6cdc3a32af8bd06d5a1a218a32840cd70a00Daniel Dunbar // 2578a30d6cdc3a32af8bd06d5a1a218a32840cd70a00Daniel Dunbar // FIXME: We temporarily avoid passing -demangle to any iOS linker, because 2579a30d6cdc3a32af8bd06d5a1a218a32840cd70a00Daniel Dunbar // unfortunately we can't be guaranteed that the linker version used there 2580a30d6cdc3a32af8bd06d5a1a218a32840cd70a00Daniel Dunbar // will match the linker version detected at configure time. We need the 2581a30d6cdc3a32af8bd06d5a1a218a32840cd70a00Daniel Dunbar // universal driver. 2582a30d6cdc3a32af8bd06d5a1a218a32840cd70a00Daniel Dunbar if (Version[0] >= 100 && !Args.hasArg(options::OPT_Z_Xlinker__no_demangle) && 2583a30d6cdc3a32af8bd06d5a1a218a32840cd70a00Daniel Dunbar !getDarwinToolChain().isTargetIPhoneOS()) { 2584bcf1da8ff6ab007a23a8d1be8e950d92cee4241eDaniel Dunbar // Don't pass -demangle to ld_classic. 2585bcf1da8ff6ab007a23a8d1be8e950d92cee4241eDaniel Dunbar // 2586bcf1da8ff6ab007a23a8d1be8e950d92cee4241eDaniel Dunbar // FIXME: This is a temporary workaround, ld should be handling this. 2587bcf1da8ff6ab007a23a8d1be8e950d92cee4241eDaniel Dunbar bool UsesLdClassic = (getToolChain().getArch() == llvm::Triple::x86 && 2588bcf1da8ff6ab007a23a8d1be8e950d92cee4241eDaniel Dunbar Args.hasArg(options::OPT_static)); 25899ced7049caf7c9543badb302f3bb43a6bc264705Daniel Dunbar if (getToolChain().getArch() == llvm::Triple::x86) { 25909ced7049caf7c9543badb302f3bb43a6bc264705Daniel Dunbar for (arg_iterator it = Args.filtered_begin(options::OPT_Xlinker, 25919ced7049caf7c9543badb302f3bb43a6bc264705Daniel Dunbar options::OPT_Wl_COMMA), 25929ced7049caf7c9543badb302f3bb43a6bc264705Daniel Dunbar ie = Args.filtered_end(); it != ie; ++it) { 25939ced7049caf7c9543badb302f3bb43a6bc264705Daniel Dunbar const Arg *A = *it; 25949ced7049caf7c9543badb302f3bb43a6bc264705Daniel Dunbar for (unsigned i = 0, e = A->getNumValues(); i != e; ++i) 25959ced7049caf7c9543badb302f3bb43a6bc264705Daniel Dunbar if (llvm::StringRef(A->getValue(Args, i)) == "-kext") 25969ced7049caf7c9543badb302f3bb43a6bc264705Daniel Dunbar UsesLdClassic = true; 25979ced7049caf7c9543badb302f3bb43a6bc264705Daniel Dunbar } 25989ced7049caf7c9543badb302f3bb43a6bc264705Daniel Dunbar } 2599bcf1da8ff6ab007a23a8d1be8e950d92cee4241eDaniel Dunbar if (!UsesLdClassic) 2600bcf1da8ff6ab007a23a8d1be8e950d92cee4241eDaniel Dunbar CmdArgs.push_back("-demangle"); 2601b18dc5b8376f42f7b4802bf1279e95eeb813fa06Daniel Dunbar } 2602b18dc5b8376f42f7b4802bf1279e95eeb813fa06Daniel Dunbar 260302633b541b04ad5ffc1c70f4c2feeeb13e607057Daniel Dunbar // Derived from the "link" spec. 260402633b541b04ad5ffc1c70f4c2feeeb13e607057Daniel Dunbar Args.AddAllArgs(CmdArgs, options::OPT_static); 260502633b541b04ad5ffc1c70f4c2feeeb13e607057Daniel Dunbar if (!Args.hasArg(options::OPT_static)) 260602633b541b04ad5ffc1c70f4c2feeeb13e607057Daniel Dunbar CmdArgs.push_back("-dynamic"); 260702633b541b04ad5ffc1c70f4c2feeeb13e607057Daniel Dunbar if (Args.hasArg(options::OPT_fgnu_runtime)) { 260802633b541b04ad5ffc1c70f4c2feeeb13e607057Daniel Dunbar // FIXME: gcc replaces -lobjc in forward args with -lobjc-gnu 260902633b541b04ad5ffc1c70f4c2feeeb13e607057Daniel Dunbar // here. How do we wish to handle such things? 261002633b541b04ad5ffc1c70f4c2feeeb13e607057Daniel Dunbar } 2611c21c485b4fb58ef5d55cf3e523263dd824a2ace4Daniel Dunbar 261202633b541b04ad5ffc1c70f4c2feeeb13e607057Daniel Dunbar if (!Args.hasArg(options::OPT_dynamiclib)) { 2613a6d38494d18e260958e73bfe5e2b3f1dc4160459Daniel Dunbar AddDarwinArch(Args, CmdArgs); 2614a6d38494d18e260958e73bfe5e2b3f1dc4160459Daniel Dunbar // FIXME: Why do this only on this path? 26158917dd4457affb8750c81f08cbc21902a36cff26Daniel Dunbar Args.AddLastArg(CmdArgs, options::OPT_force__cpusubtype__ALL); 261602633b541b04ad5ffc1c70f4c2feeeb13e607057Daniel Dunbar 261702633b541b04ad5ffc1c70f4c2feeeb13e607057Daniel Dunbar Args.AddLastArg(CmdArgs, options::OPT_bundle); 261802633b541b04ad5ffc1c70f4c2feeeb13e607057Daniel Dunbar Args.AddAllArgs(CmdArgs, options::OPT_bundle__loader); 261902633b541b04ad5ffc1c70f4c2feeeb13e607057Daniel Dunbar Args.AddAllArgs(CmdArgs, options::OPT_client__name); 262002633b541b04ad5ffc1c70f4c2feeeb13e607057Daniel Dunbar 262102633b541b04ad5ffc1c70f4c2feeeb13e607057Daniel Dunbar Arg *A; 262202633b541b04ad5ffc1c70f4c2feeeb13e607057Daniel Dunbar if ((A = Args.getLastArg(options::OPT_compatibility__version)) || 262302633b541b04ad5ffc1c70f4c2feeeb13e607057Daniel Dunbar (A = Args.getLastArg(options::OPT_current__version)) || 262402633b541b04ad5ffc1c70f4c2feeeb13e607057Daniel Dunbar (A = Args.getLastArg(options::OPT_install__name))) 262502633b541b04ad5ffc1c70f4c2feeeb13e607057Daniel Dunbar D.Diag(clang::diag::err_drv_argument_only_allowed_with) 262602633b541b04ad5ffc1c70f4c2feeeb13e607057Daniel Dunbar << A->getAsString(Args) << "-dynamiclib"; 262702633b541b04ad5ffc1c70f4c2feeeb13e607057Daniel Dunbar 262802633b541b04ad5ffc1c70f4c2feeeb13e607057Daniel Dunbar Args.AddLastArg(CmdArgs, options::OPT_force__flat__namespace); 262902633b541b04ad5ffc1c70f4c2feeeb13e607057Daniel Dunbar Args.AddLastArg(CmdArgs, options::OPT_keep__private__externs); 263002633b541b04ad5ffc1c70f4c2feeeb13e607057Daniel Dunbar Args.AddLastArg(CmdArgs, options::OPT_private__bundle); 263102633b541b04ad5ffc1c70f4c2feeeb13e607057Daniel Dunbar } else { 263202633b541b04ad5ffc1c70f4c2feeeb13e607057Daniel Dunbar CmdArgs.push_back("-dylib"); 263302633b541b04ad5ffc1c70f4c2feeeb13e607057Daniel Dunbar 263402633b541b04ad5ffc1c70f4c2feeeb13e607057Daniel Dunbar Arg *A; 263502633b541b04ad5ffc1c70f4c2feeeb13e607057Daniel Dunbar if ((A = Args.getLastArg(options::OPT_bundle)) || 263602633b541b04ad5ffc1c70f4c2feeeb13e607057Daniel Dunbar (A = Args.getLastArg(options::OPT_bundle__loader)) || 263702633b541b04ad5ffc1c70f4c2feeeb13e607057Daniel Dunbar (A = Args.getLastArg(options::OPT_client__name)) || 263802633b541b04ad5ffc1c70f4c2feeeb13e607057Daniel Dunbar (A = Args.getLastArg(options::OPT_force__flat__namespace)) || 263902633b541b04ad5ffc1c70f4c2feeeb13e607057Daniel Dunbar (A = Args.getLastArg(options::OPT_keep__private__externs)) || 264002633b541b04ad5ffc1c70f4c2feeeb13e607057Daniel Dunbar (A = Args.getLastArg(options::OPT_private__bundle))) 264102633b541b04ad5ffc1c70f4c2feeeb13e607057Daniel Dunbar D.Diag(clang::diag::err_drv_argument_not_allowed_with) 264202633b541b04ad5ffc1c70f4c2feeeb13e607057Daniel Dunbar << A->getAsString(Args) << "-dynamiclib"; 2643c21c485b4fb58ef5d55cf3e523263dd824a2ace4Daniel Dunbar 264402633b541b04ad5ffc1c70f4c2feeeb13e607057Daniel Dunbar Args.AddAllArgsTranslated(CmdArgs, options::OPT_compatibility__version, 264502633b541b04ad5ffc1c70f4c2feeeb13e607057Daniel Dunbar "-dylib_compatibility_version"); 264602633b541b04ad5ffc1c70f4c2feeeb13e607057Daniel Dunbar Args.AddAllArgsTranslated(CmdArgs, options::OPT_current__version, 264702633b541b04ad5ffc1c70f4c2feeeb13e607057Daniel Dunbar "-dylib_current_version"); 264802633b541b04ad5ffc1c70f4c2feeeb13e607057Daniel Dunbar 2649a6d38494d18e260958e73bfe5e2b3f1dc4160459Daniel Dunbar AddDarwinArch(Args, CmdArgs); 265002633b541b04ad5ffc1c70f4c2feeeb13e607057Daniel Dunbar 265102633b541b04ad5ffc1c70f4c2feeeb13e607057Daniel Dunbar Args.AddAllArgsTranslated(CmdArgs, options::OPT_install__name, 265202633b541b04ad5ffc1c70f4c2feeeb13e607057Daniel Dunbar "-dylib_install_name"); 265302633b541b04ad5ffc1c70f4c2feeeb13e607057Daniel Dunbar } 265402633b541b04ad5ffc1c70f4c2feeeb13e607057Daniel Dunbar 265502633b541b04ad5ffc1c70f4c2feeeb13e607057Daniel Dunbar Args.AddLastArg(CmdArgs, options::OPT_all__load); 265602633b541b04ad5ffc1c70f4c2feeeb13e607057Daniel Dunbar Args.AddAllArgs(CmdArgs, options::OPT_allowable__client); 265702633b541b04ad5ffc1c70f4c2feeeb13e607057Daniel Dunbar Args.AddLastArg(CmdArgs, options::OPT_bind__at__load); 2658251ca6c9fb2bb398d9bf9fe7399c27bed7074b5cDaniel Dunbar if (getDarwinToolChain().isTargetIPhoneOS()) 2659d82f8fa53771b454885c546f0fd452a4980b3a3eDaniel Dunbar Args.AddLastArg(CmdArgs, options::OPT_arch__errors__fatal); 266002633b541b04ad5ffc1c70f4c2feeeb13e607057Daniel Dunbar Args.AddLastArg(CmdArgs, options::OPT_dead__strip); 266102633b541b04ad5ffc1c70f4c2feeeb13e607057Daniel Dunbar Args.AddLastArg(CmdArgs, options::OPT_no__dead__strip__inits__and__terms); 266202633b541b04ad5ffc1c70f4c2feeeb13e607057Daniel Dunbar Args.AddAllArgs(CmdArgs, options::OPT_dylib__file); 266302633b541b04ad5ffc1c70f4c2feeeb13e607057Daniel Dunbar Args.AddLastArg(CmdArgs, options::OPT_dynamic); 266402633b541b04ad5ffc1c70f4c2feeeb13e607057Daniel Dunbar Args.AddAllArgs(CmdArgs, options::OPT_exported__symbols__list); 266502633b541b04ad5ffc1c70f4c2feeeb13e607057Daniel Dunbar Args.AddLastArg(CmdArgs, options::OPT_flat__namespace); 266602633b541b04ad5ffc1c70f4c2feeeb13e607057Daniel Dunbar Args.AddAllArgs(CmdArgs, options::OPT_headerpad__max__install__names); 266702633b541b04ad5ffc1c70f4c2feeeb13e607057Daniel Dunbar Args.AddAllArgs(CmdArgs, options::OPT_image__base); 266802633b541b04ad5ffc1c70f4c2feeeb13e607057Daniel Dunbar Args.AddAllArgs(CmdArgs, options::OPT_init); 266902633b541b04ad5ffc1c70f4c2feeeb13e607057Daniel Dunbar 2670314cba02728c451c783b38bf6c00f220afb193c8Daniel Dunbar // Adding all arguments doesn't make sense here but this is what gcc does. One 2671314cba02728c451c783b38bf6c00f220afb193c8Daniel Dunbar // of this should always be present thanks to argument translation. 2672314cba02728c451c783b38bf6c00f220afb193c8Daniel Dunbar assert((Args.hasArg(options::OPT_mmacosx_version_min_EQ) || 2673314cba02728c451c783b38bf6c00f220afb193c8Daniel Dunbar Args.hasArg(options::OPT_miphoneos_version_min_EQ)) && 2674314cba02728c451c783b38bf6c00f220afb193c8Daniel Dunbar "Missing version argument (lost in translation)?"); 267530392de4681602f1aabc61b0184b1de53bc172f0Daniel Dunbar Args.AddAllArgsTranslated(CmdArgs, options::OPT_mmacosx_version_min_EQ, 2676294691eb1caf551083acd7b08630ef21c3fd760dDaniel Dunbar "-macosx_version_min"); 267702633b541b04ad5ffc1c70f4c2feeeb13e607057Daniel Dunbar Args.AddAllArgsTranslated(CmdArgs, options::OPT_miphoneos_version_min_EQ, 267802633b541b04ad5ffc1c70f4c2feeeb13e607057Daniel Dunbar "-iphoneos_version_min"); 267902633b541b04ad5ffc1c70f4c2feeeb13e607057Daniel Dunbar Args.AddLastArg(CmdArgs, options::OPT_nomultidefs); 268002633b541b04ad5ffc1c70f4c2feeeb13e607057Daniel Dunbar Args.AddLastArg(CmdArgs, options::OPT_multi__module); 268102633b541b04ad5ffc1c70f4c2feeeb13e607057Daniel Dunbar Args.AddLastArg(CmdArgs, options::OPT_single__module); 268202633b541b04ad5ffc1c70f4c2feeeb13e607057Daniel Dunbar Args.AddAllArgs(CmdArgs, options::OPT_multiply__defined); 268302633b541b04ad5ffc1c70f4c2feeeb13e607057Daniel Dunbar Args.AddAllArgs(CmdArgs, options::OPT_multiply__defined__unused); 2684c21c485b4fb58ef5d55cf3e523263dd824a2ace4Daniel Dunbar 268547e879dfa735f81472a51b1bd69cc4eb9159db39Daniel Dunbar if (const Arg *A = Args.getLastArg(options::OPT_fpie, options::OPT_fPIE, 268647e879dfa735f81472a51b1bd69cc4eb9159db39Daniel Dunbar options::OPT_fno_pie, 268747e879dfa735f81472a51b1bd69cc4eb9159db39Daniel Dunbar options::OPT_fno_PIE)) { 268847e879dfa735f81472a51b1bd69cc4eb9159db39Daniel Dunbar if (A->getOption().matches(options::OPT_fpie) || 268947e879dfa735f81472a51b1bd69cc4eb9159db39Daniel Dunbar A->getOption().matches(options::OPT_fPIE)) 269047e879dfa735f81472a51b1bd69cc4eb9159db39Daniel Dunbar CmdArgs.push_back("-pie"); 269147e879dfa735f81472a51b1bd69cc4eb9159db39Daniel Dunbar else 269247e879dfa735f81472a51b1bd69cc4eb9159db39Daniel Dunbar CmdArgs.push_back("-no_pie"); 269347e879dfa735f81472a51b1bd69cc4eb9159db39Daniel Dunbar } 269402633b541b04ad5ffc1c70f4c2feeeb13e607057Daniel Dunbar 269502633b541b04ad5ffc1c70f4c2feeeb13e607057Daniel Dunbar Args.AddLastArg(CmdArgs, options::OPT_prebind); 269602633b541b04ad5ffc1c70f4c2feeeb13e607057Daniel Dunbar Args.AddLastArg(CmdArgs, options::OPT_noprebind); 269702633b541b04ad5ffc1c70f4c2feeeb13e607057Daniel Dunbar Args.AddLastArg(CmdArgs, options::OPT_nofixprebinding); 269802633b541b04ad5ffc1c70f4c2feeeb13e607057Daniel Dunbar Args.AddLastArg(CmdArgs, options::OPT_prebind__all__twolevel__modules); 269902633b541b04ad5ffc1c70f4c2feeeb13e607057Daniel Dunbar Args.AddLastArg(CmdArgs, options::OPT_read__only__relocs); 270002633b541b04ad5ffc1c70f4c2feeeb13e607057Daniel Dunbar Args.AddAllArgs(CmdArgs, options::OPT_sectcreate); 270102633b541b04ad5ffc1c70f4c2feeeb13e607057Daniel Dunbar Args.AddAllArgs(CmdArgs, options::OPT_sectorder); 270202633b541b04ad5ffc1c70f4c2feeeb13e607057Daniel Dunbar Args.AddAllArgs(CmdArgs, options::OPT_seg1addr); 270302633b541b04ad5ffc1c70f4c2feeeb13e607057Daniel Dunbar Args.AddAllArgs(CmdArgs, options::OPT_segprot); 270402633b541b04ad5ffc1c70f4c2feeeb13e607057Daniel Dunbar Args.AddAllArgs(CmdArgs, options::OPT_segaddr); 270502633b541b04ad5ffc1c70f4c2feeeb13e607057Daniel Dunbar Args.AddAllArgs(CmdArgs, options::OPT_segs__read__only__addr); 270602633b541b04ad5ffc1c70f4c2feeeb13e607057Daniel Dunbar Args.AddAllArgs(CmdArgs, options::OPT_segs__read__write__addr); 270702633b541b04ad5ffc1c70f4c2feeeb13e607057Daniel Dunbar Args.AddAllArgs(CmdArgs, options::OPT_seg__addr__table); 270802633b541b04ad5ffc1c70f4c2feeeb13e607057Daniel Dunbar Args.AddAllArgs(CmdArgs, options::OPT_seg__addr__table__filename); 270902633b541b04ad5ffc1c70f4c2feeeb13e607057Daniel Dunbar Args.AddAllArgs(CmdArgs, options::OPT_sub__library); 271002633b541b04ad5ffc1c70f4c2feeeb13e607057Daniel Dunbar Args.AddAllArgs(CmdArgs, options::OPT_sub__umbrella); 2711d82f8fa53771b454885c546f0fd452a4980b3a3eDaniel Dunbar 271202633b541b04ad5ffc1c70f4c2feeeb13e607057Daniel Dunbar Args.AddAllArgsTranslated(CmdArgs, options::OPT_isysroot, "-syslibroot"); 2713251ca6c9fb2bb398d9bf9fe7399c27bed7074b5cDaniel Dunbar if (getDarwinToolChain().isTargetIPhoneOS()) { 2714d82f8fa53771b454885c546f0fd452a4980b3a3eDaniel Dunbar if (!Args.hasArg(options::OPT_isysroot)) { 2715d82f8fa53771b454885c546f0fd452a4980b3a3eDaniel Dunbar CmdArgs.push_back("-syslibroot"); 2716d82f8fa53771b454885c546f0fd452a4980b3a3eDaniel Dunbar CmdArgs.push_back("/Developer/SDKs/Extra"); 2717d82f8fa53771b454885c546f0fd452a4980b3a3eDaniel Dunbar } 2718d82f8fa53771b454885c546f0fd452a4980b3a3eDaniel Dunbar } 2719d82f8fa53771b454885c546f0fd452a4980b3a3eDaniel Dunbar 272002633b541b04ad5ffc1c70f4c2feeeb13e607057Daniel Dunbar Args.AddLastArg(CmdArgs, options::OPT_twolevel__namespace); 272102633b541b04ad5ffc1c70f4c2feeeb13e607057Daniel Dunbar Args.AddLastArg(CmdArgs, options::OPT_twolevel__namespace__hints); 272202633b541b04ad5ffc1c70f4c2feeeb13e607057Daniel Dunbar Args.AddAllArgs(CmdArgs, options::OPT_umbrella); 272302633b541b04ad5ffc1c70f4c2feeeb13e607057Daniel Dunbar Args.AddAllArgs(CmdArgs, options::OPT_undefined); 272402633b541b04ad5ffc1c70f4c2feeeb13e607057Daniel Dunbar Args.AddAllArgs(CmdArgs, options::OPT_unexported__symbols__list); 2725d82f8fa53771b454885c546f0fd452a4980b3a3eDaniel Dunbar Args.AddAllArgs(CmdArgs, options::OPT_weak__reference__mismatches); 272602633b541b04ad5ffc1c70f4c2feeeb13e607057Daniel Dunbar Args.AddLastArg(CmdArgs, options::OPT_X_Flag); 272702633b541b04ad5ffc1c70f4c2feeeb13e607057Daniel Dunbar Args.AddAllArgs(CmdArgs, options::OPT_y); 272802633b541b04ad5ffc1c70f4c2feeeb13e607057Daniel Dunbar Args.AddLastArg(CmdArgs, options::OPT_w); 272902633b541b04ad5ffc1c70f4c2feeeb13e607057Daniel Dunbar Args.AddAllArgs(CmdArgs, options::OPT_pagezero__size); 273002633b541b04ad5ffc1c70f4c2feeeb13e607057Daniel Dunbar Args.AddAllArgs(CmdArgs, options::OPT_segs__read__); 273102633b541b04ad5ffc1c70f4c2feeeb13e607057Daniel Dunbar Args.AddLastArg(CmdArgs, options::OPT_seglinkedit); 273202633b541b04ad5ffc1c70f4c2feeeb13e607057Daniel Dunbar Args.AddLastArg(CmdArgs, options::OPT_noseglinkedit); 273302633b541b04ad5ffc1c70f4c2feeeb13e607057Daniel Dunbar Args.AddAllArgs(CmdArgs, options::OPT_sectalign); 273402633b541b04ad5ffc1c70f4c2feeeb13e607057Daniel Dunbar Args.AddAllArgs(CmdArgs, options::OPT_sectobjectsymbols); 273502633b541b04ad5ffc1c70f4c2feeeb13e607057Daniel Dunbar Args.AddAllArgs(CmdArgs, options::OPT_segcreate); 273602633b541b04ad5ffc1c70f4c2feeeb13e607057Daniel Dunbar Args.AddLastArg(CmdArgs, options::OPT_whyload); 273702633b541b04ad5ffc1c70f4c2feeeb13e607057Daniel Dunbar Args.AddLastArg(CmdArgs, options::OPT_whatsloaded); 273802633b541b04ad5ffc1c70f4c2feeeb13e607057Daniel Dunbar Args.AddAllArgs(CmdArgs, options::OPT_dylinker__install__name); 273902633b541b04ad5ffc1c70f4c2feeeb13e607057Daniel Dunbar Args.AddLastArg(CmdArgs, options::OPT_dylinker); 274002633b541b04ad5ffc1c70f4c2feeeb13e607057Daniel Dunbar Args.AddLastArg(CmdArgs, options::OPT_Mach); 274102633b541b04ad5ffc1c70f4c2feeeb13e607057Daniel Dunbar} 274202633b541b04ad5ffc1c70f4c2feeeb13e607057Daniel Dunbar 274302633b541b04ad5ffc1c70f4c2feeeb13e607057Daniel Dunbarvoid darwin::Link::ConstructJob(Compilation &C, const JobAction &JA, 27442fe238ed293bd4bc27af9beb9fa151fad2146fa8Daniel Dunbar const InputInfo &Output, 2745c21c485b4fb58ef5d55cf3e523263dd824a2ace4Daniel Dunbar const InputInfoList &Inputs, 2746c21c485b4fb58ef5d55cf3e523263dd824a2ace4Daniel Dunbar const ArgList &Args, 274702633b541b04ad5ffc1c70f4c2feeeb13e607057Daniel Dunbar const char *LinkingOutput) const { 274802633b541b04ad5ffc1c70f4c2feeeb13e607057Daniel Dunbar assert(Output.getType() == types::TY_Image && "Invalid linker output type."); 2749e0be8b1729d8978de433d229c065830b95d0ae68Daniel Dunbar 275002633b541b04ad5ffc1c70f4c2feeeb13e607057Daniel Dunbar // The logic here is derived from gcc's behavior; most of which 275102633b541b04ad5ffc1c70f4c2feeeb13e607057Daniel Dunbar // comes from specs (starting with link_command). Consult gcc for 275202633b541b04ad5ffc1c70f4c2feeeb13e607057Daniel Dunbar // more information. 275302633b541b04ad5ffc1c70f4c2feeeb13e607057Daniel Dunbar ArgStringList CmdArgs; 275402633b541b04ad5ffc1c70f4c2feeeb13e607057Daniel Dunbar 275502633b541b04ad5ffc1c70f4c2feeeb13e607057Daniel Dunbar // I'm not sure why this particular decomposition exists in gcc, but 275602633b541b04ad5ffc1c70f4c2feeeb13e607057Daniel Dunbar // we follow suite for ease of comparison. 2757748de8eda222f087434d8bd703176b316a061341Daniel Dunbar AddLinkArgs(C, Args, CmdArgs); 275802633b541b04ad5ffc1c70f4c2feeeb13e607057Daniel Dunbar 275902633b541b04ad5ffc1c70f4c2feeeb13e607057Daniel Dunbar Args.AddAllArgs(CmdArgs, options::OPT_d_Flag); 276002633b541b04ad5ffc1c70f4c2feeeb13e607057Daniel Dunbar Args.AddAllArgs(CmdArgs, options::OPT_s); 276102633b541b04ad5ffc1c70f4c2feeeb13e607057Daniel Dunbar Args.AddAllArgs(CmdArgs, options::OPT_t); 276202633b541b04ad5ffc1c70f4c2feeeb13e607057Daniel Dunbar Args.AddAllArgs(CmdArgs, options::OPT_Z_Flag); 276302633b541b04ad5ffc1c70f4c2feeeb13e607057Daniel Dunbar Args.AddAllArgs(CmdArgs, options::OPT_u_Group); 276402633b541b04ad5ffc1c70f4c2feeeb13e607057Daniel Dunbar Args.AddAllArgs(CmdArgs, options::OPT_A); 276502633b541b04ad5ffc1c70f4c2feeeb13e607057Daniel Dunbar Args.AddLastArg(CmdArgs, options::OPT_e); 276602633b541b04ad5ffc1c70f4c2feeeb13e607057Daniel Dunbar Args.AddAllArgs(CmdArgs, options::OPT_m_Separate); 276702633b541b04ad5ffc1c70f4c2feeeb13e607057Daniel Dunbar Args.AddAllArgs(CmdArgs, options::OPT_r); 276802633b541b04ad5ffc1c70f4c2feeeb13e607057Daniel Dunbar 2769270073c1e44d073e9732204fc099f280b368fab5Daniel Dunbar // Forward -ObjC when either -ObjC or -ObjC++ is used, to force loading 2770270073c1e44d073e9732204fc099f280b368fab5Daniel Dunbar // members of static archive libraries which implement Objective-C classes or 2771270073c1e44d073e9732204fc099f280b368fab5Daniel Dunbar // categories. 2772270073c1e44d073e9732204fc099f280b368fab5Daniel Dunbar if (Args.hasArg(options::OPT_ObjC) || Args.hasArg(options::OPT_ObjCXX)) 2773270073c1e44d073e9732204fc099f280b368fab5Daniel Dunbar CmdArgs.push_back("-ObjC"); 277420249a1af2e462dcafdd6a350f1c7967b264ff25Michael J. Spencer 277502633b541b04ad5ffc1c70f4c2feeeb13e607057Daniel Dunbar CmdArgs.push_back("-o"); 277602633b541b04ad5ffc1c70f4c2feeeb13e607057Daniel Dunbar CmdArgs.push_back(Output.getFilename()); 277702633b541b04ad5ffc1c70f4c2feeeb13e607057Daniel Dunbar 277802633b541b04ad5ffc1c70f4c2feeeb13e607057Daniel Dunbar if (!Args.hasArg(options::OPT_A) && 277902633b541b04ad5ffc1c70f4c2feeeb13e607057Daniel Dunbar !Args.hasArg(options::OPT_nostdlib) && 278002633b541b04ad5ffc1c70f4c2feeeb13e607057Daniel Dunbar !Args.hasArg(options::OPT_nostartfiles)) { 278102633b541b04ad5ffc1c70f4c2feeeb13e607057Daniel Dunbar // Derived from startfile spec. 278202633b541b04ad5ffc1c70f4c2feeeb13e607057Daniel Dunbar if (Args.hasArg(options::OPT_dynamiclib)) { 2783c21c485b4fb58ef5d55cf3e523263dd824a2ace4Daniel Dunbar // Derived from darwin_dylib1 spec. 2784cacb0f007001f7463d44ebd5dde7bfaecf876a71Daniel Dunbar if (getDarwinToolChain().isTargetIPhoneOS()) { 2785cacb0f007001f7463d44ebd5dde7bfaecf876a71Daniel Dunbar if (getDarwinToolChain().isIPhoneOSVersionLT(3, 1)) 2786cacb0f007001f7463d44ebd5dde7bfaecf876a71Daniel Dunbar CmdArgs.push_back("-ldylib1.o"); 2787cacb0f007001f7463d44ebd5dde7bfaecf876a71Daniel Dunbar } else { 2788ce3fdf233353b10f20d74dceda3d77a82285de17Daniel Dunbar if (getDarwinToolChain().isMacosxVersionLT(10, 5)) 2789cacb0f007001f7463d44ebd5dde7bfaecf876a71Daniel Dunbar CmdArgs.push_back("-ldylib1.o"); 2790ce3fdf233353b10f20d74dceda3d77a82285de17Daniel Dunbar else if (getDarwinToolChain().isMacosxVersionLT(10, 6)) 2791cacb0f007001f7463d44ebd5dde7bfaecf876a71Daniel Dunbar CmdArgs.push_back("-ldylib1.10.5.o"); 2792cacb0f007001f7463d44ebd5dde7bfaecf876a71Daniel Dunbar } 279302633b541b04ad5ffc1c70f4c2feeeb13e607057Daniel Dunbar } else { 279402633b541b04ad5ffc1c70f4c2feeeb13e607057Daniel Dunbar if (Args.hasArg(options::OPT_bundle)) { 27958a8d8afa3df40e9f122d2b826f1a825a66f6908dDaniel Dunbar if (!Args.hasArg(options::OPT_static)) { 27968a8d8afa3df40e9f122d2b826f1a825a66f6908dDaniel Dunbar // Derived from darwin_bundle1 spec. 2797cacb0f007001f7463d44ebd5dde7bfaecf876a71Daniel Dunbar if (getDarwinToolChain().isTargetIPhoneOS()) { 2798cacb0f007001f7463d44ebd5dde7bfaecf876a71Daniel Dunbar if (getDarwinToolChain().isIPhoneOSVersionLT(3, 1)) 2799cacb0f007001f7463d44ebd5dde7bfaecf876a71Daniel Dunbar CmdArgs.push_back("-lbundle1.o"); 2800cacb0f007001f7463d44ebd5dde7bfaecf876a71Daniel Dunbar } else { 2801ce3fdf233353b10f20d74dceda3d77a82285de17Daniel Dunbar if (getDarwinToolChain().isMacosxVersionLT(10, 6)) 2802cacb0f007001f7463d44ebd5dde7bfaecf876a71Daniel Dunbar CmdArgs.push_back("-lbundle1.o"); 2803cacb0f007001f7463d44ebd5dde7bfaecf876a71Daniel Dunbar } 28048a8d8afa3df40e9f122d2b826f1a825a66f6908dDaniel Dunbar } 280502633b541b04ad5ffc1c70f4c2feeeb13e607057Daniel Dunbar } else { 280602633b541b04ad5ffc1c70f4c2feeeb13e607057Daniel Dunbar if (Args.hasArg(options::OPT_pg)) { 280702633b541b04ad5ffc1c70f4c2feeeb13e607057Daniel Dunbar if (Args.hasArg(options::OPT_static) || 280802633b541b04ad5ffc1c70f4c2feeeb13e607057Daniel Dunbar Args.hasArg(options::OPT_object) || 280902633b541b04ad5ffc1c70f4c2feeeb13e607057Daniel Dunbar Args.hasArg(options::OPT_preload)) { 281002633b541b04ad5ffc1c70f4c2feeeb13e607057Daniel Dunbar CmdArgs.push_back("-lgcrt0.o"); 281102633b541b04ad5ffc1c70f4c2feeeb13e607057Daniel Dunbar } else { 281202633b541b04ad5ffc1c70f4c2feeeb13e607057Daniel Dunbar CmdArgs.push_back("-lgcrt1.o"); 2813c21c485b4fb58ef5d55cf3e523263dd824a2ace4Daniel Dunbar 281402633b541b04ad5ffc1c70f4c2feeeb13e607057Daniel Dunbar // darwin_crt2 spec is empty. 2815c21c485b4fb58ef5d55cf3e523263dd824a2ace4Daniel Dunbar } 281602633b541b04ad5ffc1c70f4c2feeeb13e607057Daniel Dunbar } else { 281702633b541b04ad5ffc1c70f4c2feeeb13e607057Daniel Dunbar if (Args.hasArg(options::OPT_static) || 281802633b541b04ad5ffc1c70f4c2feeeb13e607057Daniel Dunbar Args.hasArg(options::OPT_object) || 281902633b541b04ad5ffc1c70f4c2feeeb13e607057Daniel Dunbar Args.hasArg(options::OPT_preload)) { 282002633b541b04ad5ffc1c70f4c2feeeb13e607057Daniel Dunbar CmdArgs.push_back("-lcrt0.o"); 282102633b541b04ad5ffc1c70f4c2feeeb13e607057Daniel Dunbar } else { 282202633b541b04ad5ffc1c70f4c2feeeb13e607057Daniel Dunbar // Derived from darwin_crt1 spec. 2823251ca6c9fb2bb398d9bf9fe7399c27bed7074b5cDaniel Dunbar if (getDarwinToolChain().isTargetIPhoneOS()) { 2824cacb0f007001f7463d44ebd5dde7bfaecf876a71Daniel Dunbar if (getDarwinToolChain().isIPhoneOSVersionLT(3, 1)) 2825cacb0f007001f7463d44ebd5dde7bfaecf876a71Daniel Dunbar CmdArgs.push_back("-lcrt1.o"); 2826cacb0f007001f7463d44ebd5dde7bfaecf876a71Daniel Dunbar else 2827cacb0f007001f7463d44ebd5dde7bfaecf876a71Daniel Dunbar CmdArgs.push_back("-lcrt1.3.1.o"); 2828ce3fdf233353b10f20d74dceda3d77a82285de17Daniel Dunbar } else { 2829ce3fdf233353b10f20d74dceda3d77a82285de17Daniel Dunbar if (getDarwinToolChain().isMacosxVersionLT(10, 5)) 2830ce3fdf233353b10f20d74dceda3d77a82285de17Daniel Dunbar CmdArgs.push_back("-lcrt1.o"); 2831ce3fdf233353b10f20d74dceda3d77a82285de17Daniel Dunbar else if (getDarwinToolChain().isMacosxVersionLT(10, 6)) 2832ce3fdf233353b10f20d74dceda3d77a82285de17Daniel Dunbar CmdArgs.push_back("-lcrt1.10.5.o"); 2833ce3fdf233353b10f20d74dceda3d77a82285de17Daniel Dunbar else 2834ce3fdf233353b10f20d74dceda3d77a82285de17Daniel Dunbar CmdArgs.push_back("-lcrt1.10.6.o"); 2835c21c485b4fb58ef5d55cf3e523263dd824a2ace4Daniel Dunbar 2836ce3fdf233353b10f20d74dceda3d77a82285de17Daniel Dunbar // darwin_crt2 spec is empty. 2837ce3fdf233353b10f20d74dceda3d77a82285de17Daniel Dunbar } 283802633b541b04ad5ffc1c70f4c2feeeb13e607057Daniel Dunbar } 283902633b541b04ad5ffc1c70f4c2feeeb13e607057Daniel Dunbar } 284002633b541b04ad5ffc1c70f4c2feeeb13e607057Daniel Dunbar } 284102633b541b04ad5ffc1c70f4c2feeeb13e607057Daniel Dunbar } 284202633b541b04ad5ffc1c70f4c2feeeb13e607057Daniel Dunbar 2843ce3fdf233353b10f20d74dceda3d77a82285de17Daniel Dunbar if (!getDarwinToolChain().isTargetIPhoneOS() && 2844ce3fdf233353b10f20d74dceda3d77a82285de17Daniel Dunbar Args.hasArg(options::OPT_shared_libgcc) && 2845ce3fdf233353b10f20d74dceda3d77a82285de17Daniel Dunbar getDarwinToolChain().isMacosxVersionLT(10, 5)) { 2846881376467c46c5c6cc16fa6790271c2c22e1d4f1Daniel Dunbar const char *Str = 28474a7e88978cf646ad10d654020cb00b3877069210Daniel Dunbar Args.MakeArgString(getToolChain().GetFilePath("crt3.o")); 2848881376467c46c5c6cc16fa6790271c2c22e1d4f1Daniel Dunbar CmdArgs.push_back(Str); 284902633b541b04ad5ffc1c70f4c2feeeb13e607057Daniel Dunbar } 285002633b541b04ad5ffc1c70f4c2feeeb13e607057Daniel Dunbar } 285102633b541b04ad5ffc1c70f4c2feeeb13e607057Daniel Dunbar 285202633b541b04ad5ffc1c70f4c2feeeb13e607057Daniel Dunbar Args.AddAllArgs(CmdArgs, options::OPT_L); 2853c21c485b4fb58ef5d55cf3e523263dd824a2ace4Daniel Dunbar 285402633b541b04ad5ffc1c70f4c2feeeb13e607057Daniel Dunbar if (Args.hasArg(options::OPT_fopenmp)) 285502633b541b04ad5ffc1c70f4c2feeeb13e607057Daniel Dunbar // This is more complicated in gcc... 285602633b541b04ad5ffc1c70f4c2feeeb13e607057Daniel Dunbar CmdArgs.push_back("-lgomp"); 285702633b541b04ad5ffc1c70f4c2feeeb13e607057Daniel Dunbar 28586b200b2b698b6ac9e310f2225c69c85d28ae4fb0Daniel Dunbar getDarwinToolChain().AddLinkSearchPathArgs(Args, CmdArgs); 2859c21c485b4fb58ef5d55cf3e523263dd824a2ace4Daniel Dunbar 28602008feead855f08500fb01ff43ef5eebee05d1e5Daniel Dunbar AddLinkerInputs(getToolChain(), Inputs, Args, CmdArgs); 286102633b541b04ad5ffc1c70f4c2feeeb13e607057Daniel Dunbar 286202633b541b04ad5ffc1c70f4c2feeeb13e607057Daniel Dunbar if (LinkingOutput) { 286302633b541b04ad5ffc1c70f4c2feeeb13e607057Daniel Dunbar CmdArgs.push_back("-arch_multiple"); 286402633b541b04ad5ffc1c70f4c2feeeb13e607057Daniel Dunbar CmdArgs.push_back("-final_output"); 286502633b541b04ad5ffc1c70f4c2feeeb13e607057Daniel Dunbar CmdArgs.push_back(LinkingOutput); 286602633b541b04ad5ffc1c70f4c2feeeb13e607057Daniel Dunbar } 286702633b541b04ad5ffc1c70f4c2feeeb13e607057Daniel Dunbar 286802633b541b04ad5ffc1c70f4c2feeeb13e607057Daniel Dunbar if (Args.hasArg(options::OPT_fprofile_arcs) || 286902633b541b04ad5ffc1c70f4c2feeeb13e607057Daniel Dunbar Args.hasArg(options::OPT_fprofile_generate) || 287002633b541b04ad5ffc1c70f4c2feeeb13e607057Daniel Dunbar Args.hasArg(options::OPT_fcreate_profile) || 287102633b541b04ad5ffc1c70f4c2feeeb13e607057Daniel Dunbar Args.hasArg(options::OPT_coverage)) 287202633b541b04ad5ffc1c70f4c2feeeb13e607057Daniel Dunbar CmdArgs.push_back("-lgcov"); 2873c21c485b4fb58ef5d55cf3e523263dd824a2ace4Daniel Dunbar 287402633b541b04ad5ffc1c70f4c2feeeb13e607057Daniel Dunbar if (Args.hasArg(options::OPT_fnested_functions)) 287502633b541b04ad5ffc1c70f4c2feeeb13e607057Daniel Dunbar CmdArgs.push_back("-allow_stack_execute"); 2876c21c485b4fb58ef5d55cf3e523263dd824a2ace4Daniel Dunbar 287702633b541b04ad5ffc1c70f4c2feeeb13e607057Daniel Dunbar if (!Args.hasArg(options::OPT_nostdlib) && 287802633b541b04ad5ffc1c70f4c2feeeb13e607057Daniel Dunbar !Args.hasArg(options::OPT_nodefaultlibs)) { 2879ee788e70fcd0adf76103b17c78ac658d4ea30c9bDaniel Dunbar if (getToolChain().getDriver().CCCIsCXX) 2880132e35d2f87895d20e7ea146c8c00404b80221a1Daniel Dunbar getToolChain().AddCXXStdlibLibArgs(Args, CmdArgs); 2881edfa02b85b186e9ea9e0c841539a77ed32ee9148Daniel Dunbar 288202633b541b04ad5ffc1c70f4c2feeeb13e607057Daniel Dunbar // link_ssp spec is empty. 288302633b541b04ad5ffc1c70f4c2feeeb13e607057Daniel Dunbar 28846cd4154b9088fa18ae05d11c0f3140fafd76c734Daniel Dunbar // Let the tool chain choose which runtime library to link. 28856cd4154b9088fa18ae05d11c0f3140fafd76c734Daniel Dunbar getDarwinToolChain().AddLinkRuntimeLibArgs(Args, CmdArgs); 288602633b541b04ad5ffc1c70f4c2feeeb13e607057Daniel Dunbar } 288702633b541b04ad5ffc1c70f4c2feeeb13e607057Daniel Dunbar 288802633b541b04ad5ffc1c70f4c2feeeb13e607057Daniel Dunbar if (!Args.hasArg(options::OPT_A) && 288902633b541b04ad5ffc1c70f4c2feeeb13e607057Daniel Dunbar !Args.hasArg(options::OPT_nostdlib) && 289002633b541b04ad5ffc1c70f4c2feeeb13e607057Daniel Dunbar !Args.hasArg(options::OPT_nostartfiles)) { 289102633b541b04ad5ffc1c70f4c2feeeb13e607057Daniel Dunbar // endfile_spec is empty. 289202633b541b04ad5ffc1c70f4c2feeeb13e607057Daniel Dunbar } 289302633b541b04ad5ffc1c70f4c2feeeb13e607057Daniel Dunbar 289402633b541b04ad5ffc1c70f4c2feeeb13e607057Daniel Dunbar Args.AddAllArgs(CmdArgs, options::OPT_T_Group); 289502633b541b04ad5ffc1c70f4c2feeeb13e607057Daniel Dunbar Args.AddAllArgs(CmdArgs, options::OPT_F); 289602633b541b04ad5ffc1c70f4c2feeeb13e607057Daniel Dunbar 2897c21c485b4fb58ef5d55cf3e523263dd824a2ace4Daniel Dunbar const char *Exec = 28984a7e88978cf646ad10d654020cb00b3877069210Daniel Dunbar Args.MakeArgString(getToolChain().GetProgramPath("ld")); 28992fe238ed293bd4bc27af9beb9fa151fad2146fa8Daniel Dunbar C.addCommand(new Command(JA, *this, Exec, CmdArgs)); 290002633b541b04ad5ffc1c70f4c2feeeb13e607057Daniel Dunbar} 290102633b541b04ad5ffc1c70f4c2feeeb13e607057Daniel Dunbar 2902ff7488dc9a766f94daf54d81b03ab9160d0bfd88Daniel Dunbarvoid darwin::Lipo::ConstructJob(Compilation &C, const JobAction &JA, 29032fe238ed293bd4bc27af9beb9fa151fad2146fa8Daniel Dunbar const InputInfo &Output, 2904c21c485b4fb58ef5d55cf3e523263dd824a2ace4Daniel Dunbar const InputInfoList &Inputs, 2905c21c485b4fb58ef5d55cf3e523263dd824a2ace4Daniel Dunbar const ArgList &Args, 2906ff7488dc9a766f94daf54d81b03ab9160d0bfd88Daniel Dunbar const char *LinkingOutput) const { 2907ff7488dc9a766f94daf54d81b03ab9160d0bfd88Daniel Dunbar ArgStringList CmdArgs; 2908ff7488dc9a766f94daf54d81b03ab9160d0bfd88Daniel Dunbar 2909ff7488dc9a766f94daf54d81b03ab9160d0bfd88Daniel Dunbar CmdArgs.push_back("-create"); 2910ff7488dc9a766f94daf54d81b03ab9160d0bfd88Daniel Dunbar assert(Output.isFilename() && "Unexpected lipo output."); 2911a428df828ea4cc6916ea90dcd9fbbc840776d207Daniel Dunbar 2912a428df828ea4cc6916ea90dcd9fbbc840776d207Daniel Dunbar CmdArgs.push_back("-output"); 2913ff7488dc9a766f94daf54d81b03ab9160d0bfd88Daniel Dunbar CmdArgs.push_back(Output.getFilename()); 2914a428df828ea4cc6916ea90dcd9fbbc840776d207Daniel Dunbar 2915ff7488dc9a766f94daf54d81b03ab9160d0bfd88Daniel Dunbar for (InputInfoList::const_iterator 2916ff7488dc9a766f94daf54d81b03ab9160d0bfd88Daniel Dunbar it = Inputs.begin(), ie = Inputs.end(); it != ie; ++it) { 2917ff7488dc9a766f94daf54d81b03ab9160d0bfd88Daniel Dunbar const InputInfo &II = *it; 2918ff7488dc9a766f94daf54d81b03ab9160d0bfd88Daniel Dunbar assert(II.isFilename() && "Unexpected lipo input."); 2919ff7488dc9a766f94daf54d81b03ab9160d0bfd88Daniel Dunbar CmdArgs.push_back(II.getFilename()); 2920ff7488dc9a766f94daf54d81b03ab9160d0bfd88Daniel Dunbar } 2921c21c485b4fb58ef5d55cf3e523263dd824a2ace4Daniel Dunbar const char *Exec = 29224a7e88978cf646ad10d654020cb00b3877069210Daniel Dunbar Args.MakeArgString(getToolChain().GetProgramPath("lipo")); 29232fe238ed293bd4bc27af9beb9fa151fad2146fa8Daniel Dunbar C.addCommand(new Command(JA, *this, Exec, CmdArgs)); 2924ff7488dc9a766f94daf54d81b03ab9160d0bfd88Daniel Dunbar} 292568a31d406c6dc4382c700d1199b062de2aa7e1daDaniel Dunbar 29266e0f25483b1a801cd1155ea89c2b725feab16332Daniel Dunbarvoid darwin::Dsymutil::ConstructJob(Compilation &C, const JobAction &JA, 29272fe238ed293bd4bc27af9beb9fa151fad2146fa8Daniel Dunbar const InputInfo &Output, 29286e0f25483b1a801cd1155ea89c2b725feab16332Daniel Dunbar const InputInfoList &Inputs, 29296e0f25483b1a801cd1155ea89c2b725feab16332Daniel Dunbar const ArgList &Args, 29306e0f25483b1a801cd1155ea89c2b725feab16332Daniel Dunbar const char *LinkingOutput) const { 29316e0f25483b1a801cd1155ea89c2b725feab16332Daniel Dunbar ArgStringList CmdArgs; 29326e0f25483b1a801cd1155ea89c2b725feab16332Daniel Dunbar 29336e0f25483b1a801cd1155ea89c2b725feab16332Daniel Dunbar assert(Inputs.size() == 1 && "Unable to handle multiple inputs."); 29346e0f25483b1a801cd1155ea89c2b725feab16332Daniel Dunbar const InputInfo &Input = Inputs[0]; 29356e0f25483b1a801cd1155ea89c2b725feab16332Daniel Dunbar assert(Input.isFilename() && "Unexpected dsymutil input."); 29366e0f25483b1a801cd1155ea89c2b725feab16332Daniel Dunbar CmdArgs.push_back(Input.getFilename()); 29376e0f25483b1a801cd1155ea89c2b725feab16332Daniel Dunbar 29386e0f25483b1a801cd1155ea89c2b725feab16332Daniel Dunbar CmdArgs.push_back("-o"); 29396e0f25483b1a801cd1155ea89c2b725feab16332Daniel Dunbar CmdArgs.push_back(Output.getFilename()); 29406e0f25483b1a801cd1155ea89c2b725feab16332Daniel Dunbar 29416e0f25483b1a801cd1155ea89c2b725feab16332Daniel Dunbar const char *Exec = 29424a7e88978cf646ad10d654020cb00b3877069210Daniel Dunbar Args.MakeArgString(getToolChain().GetProgramPath("dsymutil")); 29432fe238ed293bd4bc27af9beb9fa151fad2146fa8Daniel Dunbar C.addCommand(new Command(JA, *this, Exec, CmdArgs)); 29446e0f25483b1a801cd1155ea89c2b725feab16332Daniel Dunbar} 29456e0f25483b1a801cd1155ea89c2b725feab16332Daniel Dunbar 2946e7925a075f110ab21afeae084670a155dea568e3Edward O'Callaghanvoid auroraux::Assemble::ConstructJob(Compilation &C, const JobAction &JA, 29472fe238ed293bd4bc27af9beb9fa151fad2146fa8Daniel Dunbar const InputInfo &Output, 2948294691eb1caf551083acd7b08630ef21c3fd760dDaniel Dunbar const InputInfoList &Inputs, 2949294691eb1caf551083acd7b08630ef21c3fd760dDaniel Dunbar const ArgList &Args, 2950294691eb1caf551083acd7b08630ef21c3fd760dDaniel Dunbar const char *LinkingOutput) const { 2951e7925a075f110ab21afeae084670a155dea568e3Edward O'Callaghan ArgStringList CmdArgs; 2952e7925a075f110ab21afeae084670a155dea568e3Edward O'Callaghan 2953e7925a075f110ab21afeae084670a155dea568e3Edward O'Callaghan Args.AddAllArgValues(CmdArgs, options::OPT_Wa_COMMA, 2954e7925a075f110ab21afeae084670a155dea568e3Edward O'Callaghan options::OPT_Xassembler); 2955e7925a075f110ab21afeae084670a155dea568e3Edward O'Callaghan 2956e7925a075f110ab21afeae084670a155dea568e3Edward O'Callaghan CmdArgs.push_back("-o"); 29577c1e46533cae07216e2a67d5636a5afb44253155Daniel Dunbar CmdArgs.push_back(Output.getFilename()); 2958e7925a075f110ab21afeae084670a155dea568e3Edward O'Callaghan 2959e7925a075f110ab21afeae084670a155dea568e3Edward O'Callaghan for (InputInfoList::const_iterator 2960e7925a075f110ab21afeae084670a155dea568e3Edward O'Callaghan it = Inputs.begin(), ie = Inputs.end(); it != ie; ++it) { 2961e7925a075f110ab21afeae084670a155dea568e3Edward O'Callaghan const InputInfo &II = *it; 29627c1e46533cae07216e2a67d5636a5afb44253155Daniel Dunbar CmdArgs.push_back(II.getFilename()); 2963e7925a075f110ab21afeae084670a155dea568e3Edward O'Callaghan } 2964e7925a075f110ab21afeae084670a155dea568e3Edward O'Callaghan 2965e7925a075f110ab21afeae084670a155dea568e3Edward O'Callaghan const char *Exec = 29664a7e88978cf646ad10d654020cb00b3877069210Daniel Dunbar Args.MakeArgString(getToolChain().GetProgramPath("gas")); 29672fe238ed293bd4bc27af9beb9fa151fad2146fa8Daniel Dunbar C.addCommand(new Command(JA, *this, Exec, CmdArgs)); 2968e7925a075f110ab21afeae084670a155dea568e3Edward O'Callaghan} 2969e7925a075f110ab21afeae084670a155dea568e3Edward O'Callaghan 2970e7925a075f110ab21afeae084670a155dea568e3Edward O'Callaghanvoid auroraux::Link::ConstructJob(Compilation &C, const JobAction &JA, 29712fe238ed293bd4bc27af9beb9fa151fad2146fa8Daniel Dunbar const InputInfo &Output, 2972294691eb1caf551083acd7b08630ef21c3fd760dDaniel Dunbar const InputInfoList &Inputs, 2973294691eb1caf551083acd7b08630ef21c3fd760dDaniel Dunbar const ArgList &Args, 2974294691eb1caf551083acd7b08630ef21c3fd760dDaniel Dunbar const char *LinkingOutput) const { 2975e7925a075f110ab21afeae084670a155dea568e3Edward O'Callaghan ArgStringList CmdArgs; 2976e7925a075f110ab21afeae084670a155dea568e3Edward O'Callaghan 2977e7925a075f110ab21afeae084670a155dea568e3Edward O'Callaghan if ((!Args.hasArg(options::OPT_nostdlib)) && 2978294691eb1caf551083acd7b08630ef21c3fd760dDaniel Dunbar (!Args.hasArg(options::OPT_shared))) { 2979e7925a075f110ab21afeae084670a155dea568e3Edward O'Callaghan CmdArgs.push_back("-e"); 29807adf94906e23eae295a006659c55eab9ffcf8b37Edward O'Callaghan CmdArgs.push_back("_start"); 2981e7925a075f110ab21afeae084670a155dea568e3Edward O'Callaghan } 2982e7925a075f110ab21afeae084670a155dea568e3Edward O'Callaghan 2983e7925a075f110ab21afeae084670a155dea568e3Edward O'Callaghan if (Args.hasArg(options::OPT_static)) { 2984e7925a075f110ab21afeae084670a155dea568e3Edward O'Callaghan CmdArgs.push_back("-Bstatic"); 29857adf94906e23eae295a006659c55eab9ffcf8b37Edward O'Callaghan CmdArgs.push_back("-dn"); 2986e7925a075f110ab21afeae084670a155dea568e3Edward O'Callaghan } else { 29877adf94906e23eae295a006659c55eab9ffcf8b37Edward O'Callaghan// CmdArgs.push_back("--eh-frame-hdr"); 2988e7925a075f110ab21afeae084670a155dea568e3Edward O'Callaghan CmdArgs.push_back("-Bdynamic"); 2989e7925a075f110ab21afeae084670a155dea568e3Edward O'Callaghan if (Args.hasArg(options::OPT_shared)) { 2990e7925a075f110ab21afeae084670a155dea568e3Edward O'Callaghan CmdArgs.push_back("-shared"); 2991e7925a075f110ab21afeae084670a155dea568e3Edward O'Callaghan } else { 29923cecc19f606ba1000da885b8ff4c089abad224ddEdward O'Callaghan CmdArgs.push_back("--dynamic-linker"); 2993e7925a075f110ab21afeae084670a155dea568e3Edward O'Callaghan CmdArgs.push_back("/lib/ld.so.1"); // 64Bit Path /lib/amd64/ld.so.1 2994e7925a075f110ab21afeae084670a155dea568e3Edward O'Callaghan } 2995e7925a075f110ab21afeae084670a155dea568e3Edward O'Callaghan } 2996e7925a075f110ab21afeae084670a155dea568e3Edward O'Callaghan 29977c1e46533cae07216e2a67d5636a5afb44253155Daniel Dunbar if (Output.isFilename()) { 2998e7925a075f110ab21afeae084670a155dea568e3Edward O'Callaghan CmdArgs.push_back("-o"); 2999e7925a075f110ab21afeae084670a155dea568e3Edward O'Callaghan CmdArgs.push_back(Output.getFilename()); 3000e7925a075f110ab21afeae084670a155dea568e3Edward O'Callaghan } else { 3001e7925a075f110ab21afeae084670a155dea568e3Edward O'Callaghan assert(Output.isNothing() && "Invalid output."); 3002e7925a075f110ab21afeae084670a155dea568e3Edward O'Callaghan } 3003e7925a075f110ab21afeae084670a155dea568e3Edward O'Callaghan 3004e7925a075f110ab21afeae084670a155dea568e3Edward O'Callaghan if (!Args.hasArg(options::OPT_nostdlib) && 3005e7925a075f110ab21afeae084670a155dea568e3Edward O'Callaghan !Args.hasArg(options::OPT_nostartfiles)) { 3006e7925a075f110ab21afeae084670a155dea568e3Edward O'Callaghan if (!Args.hasArg(options::OPT_shared)) { 300738e317d6dce161b249508686cc67eb7176958762Chris Lattner CmdArgs.push_back(Args.MakeArgString( 30084a7e88978cf646ad10d654020cb00b3877069210Daniel Dunbar getToolChain().GetFilePath("crt1.o"))); 300938e317d6dce161b249508686cc67eb7176958762Chris Lattner CmdArgs.push_back(Args.MakeArgString( 30104a7e88978cf646ad10d654020cb00b3877069210Daniel Dunbar getToolChain().GetFilePath("crti.o"))); 301138e317d6dce161b249508686cc67eb7176958762Chris Lattner CmdArgs.push_back(Args.MakeArgString( 30124a7e88978cf646ad10d654020cb00b3877069210Daniel Dunbar getToolChain().GetFilePath("crtbegin.o"))); 3013e7925a075f110ab21afeae084670a155dea568e3Edward O'Callaghan } else { 301438e317d6dce161b249508686cc67eb7176958762Chris Lattner CmdArgs.push_back(Args.MakeArgString( 30154a7e88978cf646ad10d654020cb00b3877069210Daniel Dunbar getToolChain().GetFilePath("crti.o"))); 3016e7925a075f110ab21afeae084670a155dea568e3Edward O'Callaghan } 301738e317d6dce161b249508686cc67eb7176958762Chris Lattner CmdArgs.push_back(Args.MakeArgString( 30184a7e88978cf646ad10d654020cb00b3877069210Daniel Dunbar getToolChain().GetFilePath("crtn.o"))); 3019e7925a075f110ab21afeae084670a155dea568e3Edward O'Callaghan } 3020e7925a075f110ab21afeae084670a155dea568e3Edward O'Callaghan 3021294691eb1caf551083acd7b08630ef21c3fd760dDaniel Dunbar CmdArgs.push_back(Args.MakeArgString("-L/opt/gcc4/lib/gcc/" 3022294691eb1caf551083acd7b08630ef21c3fd760dDaniel Dunbar + getToolChain().getTripleString() 3023f7fb31f4751c9c5ac3d9f93c19ec05a74dd9546fDaniel Dunbar + "/4.2.4")); 3024e7925a075f110ab21afeae084670a155dea568e3Edward O'Callaghan 3025e7925a075f110ab21afeae084670a155dea568e3Edward O'Callaghan Args.AddAllArgs(CmdArgs, options::OPT_L); 3026e7925a075f110ab21afeae084670a155dea568e3Edward O'Callaghan Args.AddAllArgs(CmdArgs, options::OPT_T_Group); 3027e7925a075f110ab21afeae084670a155dea568e3Edward O'Callaghan Args.AddAllArgs(CmdArgs, options::OPT_e); 3028e7925a075f110ab21afeae084670a155dea568e3Edward O'Callaghan 30292008feead855f08500fb01ff43ef5eebee05d1e5Daniel Dunbar AddLinkerInputs(getToolChain(), Inputs, Args, CmdArgs); 3030e7925a075f110ab21afeae084670a155dea568e3Edward O'Callaghan 3031e7925a075f110ab21afeae084670a155dea568e3Edward O'Callaghan if (!Args.hasArg(options::OPT_nostdlib) && 3032e7925a075f110ab21afeae084670a155dea568e3Edward O'Callaghan !Args.hasArg(options::OPT_nodefaultlibs)) { 3033e7925a075f110ab21afeae084670a155dea568e3Edward O'Callaghan // FIXME: For some reason GCC passes -lgcc before adding 3034e7925a075f110ab21afeae084670a155dea568e3Edward O'Callaghan // the default system libraries. Just mimic this for now. 3035e7925a075f110ab21afeae084670a155dea568e3Edward O'Callaghan CmdArgs.push_back("-lgcc"); 3036e7925a075f110ab21afeae084670a155dea568e3Edward O'Callaghan 3037e7925a075f110ab21afeae084670a155dea568e3Edward O'Callaghan if (Args.hasArg(options::OPT_pthread)) 3038e7925a075f110ab21afeae084670a155dea568e3Edward O'Callaghan CmdArgs.push_back("-pthread"); 3039e7925a075f110ab21afeae084670a155dea568e3Edward O'Callaghan if (!Args.hasArg(options::OPT_shared)) 3040e7925a075f110ab21afeae084670a155dea568e3Edward O'Callaghan CmdArgs.push_back("-lc"); 3041e7925a075f110ab21afeae084670a155dea568e3Edward O'Callaghan CmdArgs.push_back("-lgcc"); 3042e7925a075f110ab21afeae084670a155dea568e3Edward O'Callaghan } 3043e7925a075f110ab21afeae084670a155dea568e3Edward O'Callaghan 3044e7925a075f110ab21afeae084670a155dea568e3Edward O'Callaghan if (!Args.hasArg(options::OPT_nostdlib) && 3045e7925a075f110ab21afeae084670a155dea568e3Edward O'Callaghan !Args.hasArg(options::OPT_nostartfiles)) { 3046e7925a075f110ab21afeae084670a155dea568e3Edward O'Callaghan if (!Args.hasArg(options::OPT_shared)) 304738e317d6dce161b249508686cc67eb7176958762Chris Lattner CmdArgs.push_back(Args.MakeArgString( 30484a7e88978cf646ad10d654020cb00b3877069210Daniel Dunbar getToolChain().GetFilePath("crtend.o"))); 3049e7925a075f110ab21afeae084670a155dea568e3Edward O'Callaghan } 3050e7925a075f110ab21afeae084670a155dea568e3Edward O'Callaghan 3051e7925a075f110ab21afeae084670a155dea568e3Edward O'Callaghan const char *Exec = 30524a7e88978cf646ad10d654020cb00b3877069210Daniel Dunbar Args.MakeArgString(getToolChain().GetProgramPath("ld")); 30532fe238ed293bd4bc27af9beb9fa151fad2146fa8Daniel Dunbar C.addCommand(new Command(JA, *this, Exec, CmdArgs)); 3054e7925a075f110ab21afeae084670a155dea568e3Edward O'Callaghan} 3055e7925a075f110ab21afeae084670a155dea568e3Edward O'Callaghan 3056f7b8eec37c8c8012fa525c71fb29a58c9f29beefDaniel Dunbarvoid openbsd::Assemble::ConstructJob(Compilation &C, const JobAction &JA, 30572fe238ed293bd4bc27af9beb9fa151fad2146fa8Daniel Dunbar const InputInfo &Output, 3058f7b8eec37c8c8012fa525c71fb29a58c9f29beefDaniel Dunbar const InputInfoList &Inputs, 3059f7b8eec37c8c8012fa525c71fb29a58c9f29beefDaniel Dunbar const ArgList &Args, 30601eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump const char *LinkingOutput) const { 3061f7b8eec37c8c8012fa525c71fb29a58c9f29beefDaniel Dunbar ArgStringList CmdArgs; 3062f7b8eec37c8c8012fa525c71fb29a58c9f29beefDaniel Dunbar 3063f7b8eec37c8c8012fa525c71fb29a58c9f29beefDaniel Dunbar Args.AddAllArgValues(CmdArgs, options::OPT_Wa_COMMA, 3064f7b8eec37c8c8012fa525c71fb29a58c9f29beefDaniel Dunbar options::OPT_Xassembler); 3065f7b8eec37c8c8012fa525c71fb29a58c9f29beefDaniel Dunbar 3066f7b8eec37c8c8012fa525c71fb29a58c9f29beefDaniel Dunbar CmdArgs.push_back("-o"); 30677c1e46533cae07216e2a67d5636a5afb44253155Daniel Dunbar CmdArgs.push_back(Output.getFilename()); 3068f7b8eec37c8c8012fa525c71fb29a58c9f29beefDaniel Dunbar 3069f7b8eec37c8c8012fa525c71fb29a58c9f29beefDaniel Dunbar for (InputInfoList::const_iterator 3070f7b8eec37c8c8012fa525c71fb29a58c9f29beefDaniel Dunbar it = Inputs.begin(), ie = Inputs.end(); it != ie; ++it) { 3071f7b8eec37c8c8012fa525c71fb29a58c9f29beefDaniel Dunbar const InputInfo &II = *it; 30727c1e46533cae07216e2a67d5636a5afb44253155Daniel Dunbar CmdArgs.push_back(II.getFilename()); 3073f7b8eec37c8c8012fa525c71fb29a58c9f29beefDaniel Dunbar } 3074f7b8eec37c8c8012fa525c71fb29a58c9f29beefDaniel Dunbar 3075f7b8eec37c8c8012fa525c71fb29a58c9f29beefDaniel Dunbar const char *Exec = 30764a7e88978cf646ad10d654020cb00b3877069210Daniel Dunbar Args.MakeArgString(getToolChain().GetProgramPath("as")); 30772fe238ed293bd4bc27af9beb9fa151fad2146fa8Daniel Dunbar C.addCommand(new Command(JA, *this, Exec, CmdArgs)); 3078f7b8eec37c8c8012fa525c71fb29a58c9f29beefDaniel Dunbar} 3079f7b8eec37c8c8012fa525c71fb29a58c9f29beefDaniel Dunbar 3080f7b8eec37c8c8012fa525c71fb29a58c9f29beefDaniel Dunbarvoid openbsd::Link::ConstructJob(Compilation &C, const JobAction &JA, 30812fe238ed293bd4bc27af9beb9fa151fad2146fa8Daniel Dunbar const InputInfo &Output, 3082f7b8eec37c8c8012fa525c71fb29a58c9f29beefDaniel Dunbar const InputInfoList &Inputs, 3083f7b8eec37c8c8012fa525c71fb29a58c9f29beefDaniel Dunbar const ArgList &Args, 3084f7b8eec37c8c8012fa525c71fb29a58c9f29beefDaniel Dunbar const char *LinkingOutput) const { 3085ee788e70fcd0adf76103b17c78ac658d4ea30c9bDaniel Dunbar const Driver &D = getToolChain().getDriver(); 3086f7b8eec37c8c8012fa525c71fb29a58c9f29beefDaniel Dunbar ArgStringList CmdArgs; 3087f7b8eec37c8c8012fa525c71fb29a58c9f29beefDaniel Dunbar 30882bbcf669742b6b27748414e22f8042236fceef65Daniel Dunbar if ((!Args.hasArg(options::OPT_nostdlib)) && 3089294691eb1caf551083acd7b08630ef21c3fd760dDaniel Dunbar (!Args.hasArg(options::OPT_shared))) { 30902bbcf669742b6b27748414e22f8042236fceef65Daniel Dunbar CmdArgs.push_back("-e"); 30912bbcf669742b6b27748414e22f8042236fceef65Daniel Dunbar CmdArgs.push_back("__start"); 30922bbcf669742b6b27748414e22f8042236fceef65Daniel Dunbar } 30932bbcf669742b6b27748414e22f8042236fceef65Daniel Dunbar 3094f7b8eec37c8c8012fa525c71fb29a58c9f29beefDaniel Dunbar if (Args.hasArg(options::OPT_static)) { 3095f7b8eec37c8c8012fa525c71fb29a58c9f29beefDaniel Dunbar CmdArgs.push_back("-Bstatic"); 3096f7b8eec37c8c8012fa525c71fb29a58c9f29beefDaniel Dunbar } else { 309765ba55da577b23b24513b815031fc870d1d27971Rafael Espindola if (Args.hasArg(options::OPT_rdynamic)) 309865ba55da577b23b24513b815031fc870d1d27971Rafael Espindola CmdArgs.push_back("-export-dynamic"); 3099f7b8eec37c8c8012fa525c71fb29a58c9f29beefDaniel Dunbar CmdArgs.push_back("--eh-frame-hdr"); 31002bbcf669742b6b27748414e22f8042236fceef65Daniel Dunbar CmdArgs.push_back("-Bdynamic"); 3101f7b8eec37c8c8012fa525c71fb29a58c9f29beefDaniel Dunbar if (Args.hasArg(options::OPT_shared)) { 31022bbcf669742b6b27748414e22f8042236fceef65Daniel Dunbar CmdArgs.push_back("-shared"); 3103f7b8eec37c8c8012fa525c71fb29a58c9f29beefDaniel Dunbar } else { 3104f7b8eec37c8c8012fa525c71fb29a58c9f29beefDaniel Dunbar CmdArgs.push_back("-dynamic-linker"); 3105f7b8eec37c8c8012fa525c71fb29a58c9f29beefDaniel Dunbar CmdArgs.push_back("/usr/libexec/ld.so"); 3106f7b8eec37c8c8012fa525c71fb29a58c9f29beefDaniel Dunbar } 3107f7b8eec37c8c8012fa525c71fb29a58c9f29beefDaniel Dunbar } 3108f7b8eec37c8c8012fa525c71fb29a58c9f29beefDaniel Dunbar 31097c1e46533cae07216e2a67d5636a5afb44253155Daniel Dunbar if (Output.isFilename()) { 3110f7b8eec37c8c8012fa525c71fb29a58c9f29beefDaniel Dunbar CmdArgs.push_back("-o"); 3111f7b8eec37c8c8012fa525c71fb29a58c9f29beefDaniel Dunbar CmdArgs.push_back(Output.getFilename()); 3112f7b8eec37c8c8012fa525c71fb29a58c9f29beefDaniel Dunbar } else { 3113f7b8eec37c8c8012fa525c71fb29a58c9f29beefDaniel Dunbar assert(Output.isNothing() && "Invalid output."); 3114f7b8eec37c8c8012fa525c71fb29a58c9f29beefDaniel Dunbar } 3115f7b8eec37c8c8012fa525c71fb29a58c9f29beefDaniel Dunbar 3116f7b8eec37c8c8012fa525c71fb29a58c9f29beefDaniel Dunbar if (!Args.hasArg(options::OPT_nostdlib) && 3117f7b8eec37c8c8012fa525c71fb29a58c9f29beefDaniel Dunbar !Args.hasArg(options::OPT_nostartfiles)) { 3118f7b8eec37c8c8012fa525c71fb29a58c9f29beefDaniel Dunbar if (!Args.hasArg(options::OPT_shared)) { 311938e317d6dce161b249508686cc67eb7176958762Chris Lattner CmdArgs.push_back(Args.MakeArgString( 31204a7e88978cf646ad10d654020cb00b3877069210Daniel Dunbar getToolChain().GetFilePath("crt0.o"))); 312138e317d6dce161b249508686cc67eb7176958762Chris Lattner CmdArgs.push_back(Args.MakeArgString( 31224a7e88978cf646ad10d654020cb00b3877069210Daniel Dunbar getToolChain().GetFilePath("crtbegin.o"))); 3123f7b8eec37c8c8012fa525c71fb29a58c9f29beefDaniel Dunbar } else { 312438e317d6dce161b249508686cc67eb7176958762Chris Lattner CmdArgs.push_back(Args.MakeArgString( 31254a7e88978cf646ad10d654020cb00b3877069210Daniel Dunbar getToolChain().GetFilePath("crtbeginS.o"))); 3126f7b8eec37c8c8012fa525c71fb29a58c9f29beefDaniel Dunbar } 3127f7b8eec37c8c8012fa525c71fb29a58c9f29beefDaniel Dunbar } 3128f7b8eec37c8c8012fa525c71fb29a58c9f29beefDaniel Dunbar 3129e7e18200e614a5e619602a088544c85ac8305a1fEdward O'Callaghan std::string Triple = getToolChain().getTripleString(); 3130e7e18200e614a5e619602a088544c85ac8305a1fEdward O'Callaghan if (Triple.substr(0, 6) == "x86_64") 3131294691eb1caf551083acd7b08630ef21c3fd760dDaniel Dunbar Triple.replace(0, 6, "amd64"); 3132f7fb31f4751c9c5ac3d9f93c19ec05a74dd9546fDaniel Dunbar CmdArgs.push_back(Args.MakeArgString("-L/usr/lib/gcc-lib/" + Triple + 313395c0457054518102af6250e718a13a5b2ee5dbeaDaniel Dunbar "/4.2.1")); 31342bbcf669742b6b27748414e22f8042236fceef65Daniel Dunbar 3135f7b8eec37c8c8012fa525c71fb29a58c9f29beefDaniel Dunbar Args.AddAllArgs(CmdArgs, options::OPT_L); 3136f7b8eec37c8c8012fa525c71fb29a58c9f29beefDaniel Dunbar Args.AddAllArgs(CmdArgs, options::OPT_T_Group); 3137f7b8eec37c8c8012fa525c71fb29a58c9f29beefDaniel Dunbar Args.AddAllArgs(CmdArgs, options::OPT_e); 3138f7b8eec37c8c8012fa525c71fb29a58c9f29beefDaniel Dunbar 31392008feead855f08500fb01ff43ef5eebee05d1e5Daniel Dunbar AddLinkerInputs(getToolChain(), Inputs, Args, CmdArgs); 3140f7b8eec37c8c8012fa525c71fb29a58c9f29beefDaniel Dunbar 3141f7b8eec37c8c8012fa525c71fb29a58c9f29beefDaniel Dunbar if (!Args.hasArg(options::OPT_nostdlib) && 3142f7b8eec37c8c8012fa525c71fb29a58c9f29beefDaniel Dunbar !Args.hasArg(options::OPT_nodefaultlibs)) { 314395c0457054518102af6250e718a13a5b2ee5dbeaDaniel Dunbar if (D.CCCIsCXX) { 3144132e35d2f87895d20e7ea146c8c00404b80221a1Daniel Dunbar getToolChain().AddCXXStdlibLibArgs(Args, CmdArgs); 314595c0457054518102af6250e718a13a5b2ee5dbeaDaniel Dunbar CmdArgs.push_back("-lm"); 314695c0457054518102af6250e718a13a5b2ee5dbeaDaniel Dunbar } 314795c0457054518102af6250e718a13a5b2ee5dbeaDaniel Dunbar 31482bbcf669742b6b27748414e22f8042236fceef65Daniel Dunbar // FIXME: For some reason GCC passes -lgcc before adding 31492bbcf669742b6b27748414e22f8042236fceef65Daniel Dunbar // the default system libraries. Just mimic this for now. 31502bbcf669742b6b27748414e22f8042236fceef65Daniel Dunbar CmdArgs.push_back("-lgcc"); 3151f7b8eec37c8c8012fa525c71fb29a58c9f29beefDaniel Dunbar 3152f7b8eec37c8c8012fa525c71fb29a58c9f29beefDaniel Dunbar if (Args.hasArg(options::OPT_pthread)) 3153a2e40219e0a8f609a6c4cfc213223f02a3cef3c9Chris Lattner CmdArgs.push_back("-lpthread"); 31542bbcf669742b6b27748414e22f8042236fceef65Daniel Dunbar if (!Args.hasArg(options::OPT_shared)) 31552bbcf669742b6b27748414e22f8042236fceef65Daniel Dunbar CmdArgs.push_back("-lc"); 31562bbcf669742b6b27748414e22f8042236fceef65Daniel Dunbar CmdArgs.push_back("-lgcc"); 3157f7b8eec37c8c8012fa525c71fb29a58c9f29beefDaniel Dunbar } 3158f7b8eec37c8c8012fa525c71fb29a58c9f29beefDaniel Dunbar 3159f7b8eec37c8c8012fa525c71fb29a58c9f29beefDaniel Dunbar if (!Args.hasArg(options::OPT_nostdlib) && 3160f7b8eec37c8c8012fa525c71fb29a58c9f29beefDaniel Dunbar !Args.hasArg(options::OPT_nostartfiles)) { 3161f7b8eec37c8c8012fa525c71fb29a58c9f29beefDaniel Dunbar if (!Args.hasArg(options::OPT_shared)) 316238e317d6dce161b249508686cc67eb7176958762Chris Lattner CmdArgs.push_back(Args.MakeArgString( 31634a7e88978cf646ad10d654020cb00b3877069210Daniel Dunbar getToolChain().GetFilePath("crtend.o"))); 3164f7b8eec37c8c8012fa525c71fb29a58c9f29beefDaniel Dunbar else 316538e317d6dce161b249508686cc67eb7176958762Chris Lattner CmdArgs.push_back(Args.MakeArgString( 31664a7e88978cf646ad10d654020cb00b3877069210Daniel Dunbar getToolChain().GetFilePath("crtendS.o"))); 3167f7b8eec37c8c8012fa525c71fb29a58c9f29beefDaniel Dunbar } 3168f7b8eec37c8c8012fa525c71fb29a58c9f29beefDaniel Dunbar 3169f7b8eec37c8c8012fa525c71fb29a58c9f29beefDaniel Dunbar const char *Exec = 31704a7e88978cf646ad10d654020cb00b3877069210Daniel Dunbar Args.MakeArgString(getToolChain().GetProgramPath("ld")); 31712fe238ed293bd4bc27af9beb9fa151fad2146fa8Daniel Dunbar C.addCommand(new Command(JA, *this, Exec, CmdArgs)); 3172f7b8eec37c8c8012fa525c71fb29a58c9f29beefDaniel Dunbar} 3173c66a5a30a27e7b9cfab46ac8be918e3ea5b0c5a5Ed Schouten 317468a31d406c6dc4382c700d1199b062de2aa7e1daDaniel Dunbarvoid freebsd::Assemble::ConstructJob(Compilation &C, const JobAction &JA, 31752fe238ed293bd4bc27af9beb9fa151fad2146fa8Daniel Dunbar const InputInfo &Output, 3176c21c485b4fb58ef5d55cf3e523263dd824a2ace4Daniel Dunbar const InputInfoList &Inputs, 3177c21c485b4fb58ef5d55cf3e523263dd824a2ace4Daniel Dunbar const ArgList &Args, 31781eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump const char *LinkingOutput) const { 317968a31d406c6dc4382c700d1199b062de2aa7e1daDaniel Dunbar ArgStringList CmdArgs; 318068a31d406c6dc4382c700d1199b062de2aa7e1daDaniel Dunbar 3181008f54a54299eaafdaa940e2bdeaf55935ecd95aDaniel Dunbar // When building 32-bit code on FreeBSD/amd64, we have to explicitly 3182008f54a54299eaafdaa940e2bdeaf55935ecd95aDaniel Dunbar // instruct as in the base system to assemble 32-bit code. 3183008f54a54299eaafdaa940e2bdeaf55935ecd95aDaniel Dunbar if (getToolChain().getArchName() == "i386") 318468a31d406c6dc4382c700d1199b062de2aa7e1daDaniel Dunbar CmdArgs.push_back("--32"); 318568a31d406c6dc4382c700d1199b062de2aa7e1daDaniel Dunbar 318620249a1af2e462dcafdd6a350f1c7967b264ff25Michael J. Spencer 3187ed734737d5af31906e30e537d4a41c760ddcfc59Eric Christopher // Set byte order explicitly 3188ed734737d5af31906e30e537d4a41c760ddcfc59Eric Christopher if (getToolChain().getArchName() == "mips") 3189ed734737d5af31906e30e537d4a41c760ddcfc59Eric Christopher CmdArgs.push_back("-EB"); 3190ed734737d5af31906e30e537d4a41c760ddcfc59Eric Christopher else if (getToolChain().getArchName() == "mipsel") 3191ed734737d5af31906e30e537d4a41c760ddcfc59Eric Christopher CmdArgs.push_back("-EL"); 3192ed734737d5af31906e30e537d4a41c760ddcfc59Eric Christopher 319368a31d406c6dc4382c700d1199b062de2aa7e1daDaniel Dunbar Args.AddAllArgValues(CmdArgs, options::OPT_Wa_COMMA, 319468a31d406c6dc4382c700d1199b062de2aa7e1daDaniel Dunbar options::OPT_Xassembler); 319568a31d406c6dc4382c700d1199b062de2aa7e1daDaniel Dunbar 319668a31d406c6dc4382c700d1199b062de2aa7e1daDaniel Dunbar CmdArgs.push_back("-o"); 31977c1e46533cae07216e2a67d5636a5afb44253155Daniel Dunbar CmdArgs.push_back(Output.getFilename()); 319868a31d406c6dc4382c700d1199b062de2aa7e1daDaniel Dunbar 319968a31d406c6dc4382c700d1199b062de2aa7e1daDaniel Dunbar for (InputInfoList::const_iterator 320068a31d406c6dc4382c700d1199b062de2aa7e1daDaniel Dunbar it = Inputs.begin(), ie = Inputs.end(); it != ie; ++it) { 320168a31d406c6dc4382c700d1199b062de2aa7e1daDaniel Dunbar const InputInfo &II = *it; 32027c1e46533cae07216e2a67d5636a5afb44253155Daniel Dunbar CmdArgs.push_back(II.getFilename()); 320368a31d406c6dc4382c700d1199b062de2aa7e1daDaniel Dunbar } 320468a31d406c6dc4382c700d1199b062de2aa7e1daDaniel Dunbar 3205c21c485b4fb58ef5d55cf3e523263dd824a2ace4Daniel Dunbar const char *Exec = 32064a7e88978cf646ad10d654020cb00b3877069210Daniel Dunbar Args.MakeArgString(getToolChain().GetProgramPath("as")); 32072fe238ed293bd4bc27af9beb9fa151fad2146fa8Daniel Dunbar C.addCommand(new Command(JA, *this, Exec, CmdArgs)); 320868a31d406c6dc4382c700d1199b062de2aa7e1daDaniel Dunbar} 3209008f54a54299eaafdaa940e2bdeaf55935ecd95aDaniel Dunbar 3210008f54a54299eaafdaa940e2bdeaf55935ecd95aDaniel Dunbarvoid freebsd::Link::ConstructJob(Compilation &C, const JobAction &JA, 32112fe238ed293bd4bc27af9beb9fa151fad2146fa8Daniel Dunbar const InputInfo &Output, 3212c21c485b4fb58ef5d55cf3e523263dd824a2ace4Daniel Dunbar const InputInfoList &Inputs, 3213c21c485b4fb58ef5d55cf3e523263dd824a2ace4Daniel Dunbar const ArgList &Args, 3214a8304f67291b0182fb64f3afc621615288dd1d31Daniel Dunbar const char *LinkingOutput) const { 3215ee788e70fcd0adf76103b17c78ac658d4ea30c9bDaniel Dunbar const Driver &D = getToolChain().getDriver(); 3216008f54a54299eaafdaa940e2bdeaf55935ecd95aDaniel Dunbar ArgStringList CmdArgs; 3217008f54a54299eaafdaa940e2bdeaf55935ecd95aDaniel Dunbar 3218008f54a54299eaafdaa940e2bdeaf55935ecd95aDaniel Dunbar if (Args.hasArg(options::OPT_static)) { 3219008f54a54299eaafdaa940e2bdeaf55935ecd95aDaniel Dunbar CmdArgs.push_back("-Bstatic"); 3220008f54a54299eaafdaa940e2bdeaf55935ecd95aDaniel Dunbar } else { 322165ba55da577b23b24513b815031fc870d1d27971Rafael Espindola if (Args.hasArg(options::OPT_rdynamic)) 322265ba55da577b23b24513b815031fc870d1d27971Rafael Espindola CmdArgs.push_back("-export-dynamic"); 3223008f54a54299eaafdaa940e2bdeaf55935ecd95aDaniel Dunbar CmdArgs.push_back("--eh-frame-hdr"); 3224008f54a54299eaafdaa940e2bdeaf55935ecd95aDaniel Dunbar if (Args.hasArg(options::OPT_shared)) { 3225008f54a54299eaafdaa940e2bdeaf55935ecd95aDaniel Dunbar CmdArgs.push_back("-Bshareable"); 3226008f54a54299eaafdaa940e2bdeaf55935ecd95aDaniel Dunbar } else { 3227008f54a54299eaafdaa940e2bdeaf55935ecd95aDaniel Dunbar CmdArgs.push_back("-dynamic-linker"); 3228008f54a54299eaafdaa940e2bdeaf55935ecd95aDaniel Dunbar CmdArgs.push_back("/libexec/ld-elf.so.1"); 3229008f54a54299eaafdaa940e2bdeaf55935ecd95aDaniel Dunbar } 3230008f54a54299eaafdaa940e2bdeaf55935ecd95aDaniel Dunbar } 3231008f54a54299eaafdaa940e2bdeaf55935ecd95aDaniel Dunbar 3232008f54a54299eaafdaa940e2bdeaf55935ecd95aDaniel Dunbar // When building 32-bit code on FreeBSD/amd64, we have to explicitly 3233008f54a54299eaafdaa940e2bdeaf55935ecd95aDaniel Dunbar // instruct ld in the base system to link 32-bit code. 3234008f54a54299eaafdaa940e2bdeaf55935ecd95aDaniel Dunbar if (getToolChain().getArchName() == "i386") { 3235008f54a54299eaafdaa940e2bdeaf55935ecd95aDaniel Dunbar CmdArgs.push_back("-m"); 3236008f54a54299eaafdaa940e2bdeaf55935ecd95aDaniel Dunbar CmdArgs.push_back("elf_i386_fbsd"); 3237008f54a54299eaafdaa940e2bdeaf55935ecd95aDaniel Dunbar } 3238008f54a54299eaafdaa940e2bdeaf55935ecd95aDaniel Dunbar 32397c1e46533cae07216e2a67d5636a5afb44253155Daniel Dunbar if (Output.isFilename()) { 3240008f54a54299eaafdaa940e2bdeaf55935ecd95aDaniel Dunbar CmdArgs.push_back("-o"); 3241008f54a54299eaafdaa940e2bdeaf55935ecd95aDaniel Dunbar CmdArgs.push_back(Output.getFilename()); 3242008f54a54299eaafdaa940e2bdeaf55935ecd95aDaniel Dunbar } else { 3243008f54a54299eaafdaa940e2bdeaf55935ecd95aDaniel Dunbar assert(Output.isNothing() && "Invalid output."); 3244008f54a54299eaafdaa940e2bdeaf55935ecd95aDaniel Dunbar } 3245008f54a54299eaafdaa940e2bdeaf55935ecd95aDaniel Dunbar 3246008f54a54299eaafdaa940e2bdeaf55935ecd95aDaniel Dunbar if (!Args.hasArg(options::OPT_nostdlib) && 3247008f54a54299eaafdaa940e2bdeaf55935ecd95aDaniel Dunbar !Args.hasArg(options::OPT_nostartfiles)) { 3248008f54a54299eaafdaa940e2bdeaf55935ecd95aDaniel Dunbar if (!Args.hasArg(options::OPT_shared)) { 3249c16bb76f25ada63864aa89827a9906c1579d2ad3Roman Divacky if (Args.hasArg(options::OPT_pg)) 3250c16bb76f25ada63864aa89827a9906c1579d2ad3Roman Divacky CmdArgs.push_back(Args.MakeArgString( 3251c16bb76f25ada63864aa89827a9906c1579d2ad3Roman Divacky getToolChain().GetFilePath("gcrt1.o"))); 3252c16bb76f25ada63864aa89827a9906c1579d2ad3Roman Divacky else 3253c16bb76f25ada63864aa89827a9906c1579d2ad3Roman Divacky CmdArgs.push_back(Args.MakeArgString( 3254c16bb76f25ada63864aa89827a9906c1579d2ad3Roman Divacky getToolChain().GetFilePath("crt1.o"))); 325538e317d6dce161b249508686cc67eb7176958762Chris Lattner CmdArgs.push_back(Args.MakeArgString( 32564a7e88978cf646ad10d654020cb00b3877069210Daniel Dunbar getToolChain().GetFilePath("crti.o"))); 325738e317d6dce161b249508686cc67eb7176958762Chris Lattner CmdArgs.push_back(Args.MakeArgString( 32584a7e88978cf646ad10d654020cb00b3877069210Daniel Dunbar getToolChain().GetFilePath("crtbegin.o"))); 3259008f54a54299eaafdaa940e2bdeaf55935ecd95aDaniel Dunbar } else { 326038e317d6dce161b249508686cc67eb7176958762Chris Lattner CmdArgs.push_back(Args.MakeArgString( 32614a7e88978cf646ad10d654020cb00b3877069210Daniel Dunbar getToolChain().GetFilePath("crti.o"))); 326238e317d6dce161b249508686cc67eb7176958762Chris Lattner CmdArgs.push_back(Args.MakeArgString( 32634a7e88978cf646ad10d654020cb00b3877069210Daniel Dunbar getToolChain().GetFilePath("crtbeginS.o"))); 3264008f54a54299eaafdaa940e2bdeaf55935ecd95aDaniel Dunbar } 3265008f54a54299eaafdaa940e2bdeaf55935ecd95aDaniel Dunbar } 3266008f54a54299eaafdaa940e2bdeaf55935ecd95aDaniel Dunbar 3267008f54a54299eaafdaa940e2bdeaf55935ecd95aDaniel Dunbar Args.AddAllArgs(CmdArgs, options::OPT_L); 326880f0ab78f60379589c815b41de5d149c9479ca98Roman Divacky CmdArgs.push_back("-L/usr/lib"); 3269008f54a54299eaafdaa940e2bdeaf55935ecd95aDaniel Dunbar Args.AddAllArgs(CmdArgs, options::OPT_T_Group); 3270008f54a54299eaafdaa940e2bdeaf55935ecd95aDaniel Dunbar Args.AddAllArgs(CmdArgs, options::OPT_e); 3271c736377543edcfbb00a4150fae79b4d9d9f66849David Chisnall Args.AddAllArgs(CmdArgs, options::OPT_s); 3272c736377543edcfbb00a4150fae79b4d9d9f66849David Chisnall Args.AddAllArgs(CmdArgs, options::OPT_t); 3273c736377543edcfbb00a4150fae79b4d9d9f66849David Chisnall Args.AddAllArgs(CmdArgs, options::OPT_Z_Flag); 3274c736377543edcfbb00a4150fae79b4d9d9f66849David Chisnall Args.AddAllArgs(CmdArgs, options::OPT_r); 3275008f54a54299eaafdaa940e2bdeaf55935ecd95aDaniel Dunbar 32762008feead855f08500fb01ff43ef5eebee05d1e5Daniel Dunbar AddLinkerInputs(getToolChain(), Inputs, Args, CmdArgs); 32778e50a96b387dca7525caa8a6add31420dd82a2cdBenjamin Kramer 32788e50a96b387dca7525caa8a6add31420dd82a2cdBenjamin Kramer if (!Args.hasArg(options::OPT_nostdlib) && 32798e50a96b387dca7525caa8a6add31420dd82a2cdBenjamin Kramer !Args.hasArg(options::OPT_nodefaultlibs)) { 32808e50a96b387dca7525caa8a6add31420dd82a2cdBenjamin Kramer if (D.CCCIsCXX) { 32818e50a96b387dca7525caa8a6add31420dd82a2cdBenjamin Kramer getToolChain().AddCXXStdlibLibArgs(Args, CmdArgs); 3282c16bb76f25ada63864aa89827a9906c1579d2ad3Roman Divacky if (Args.hasArg(options::OPT_pg)) 3283c16bb76f25ada63864aa89827a9906c1579d2ad3Roman Divacky CmdArgs.push_back("-lm_p"); 3284c16bb76f25ada63864aa89827a9906c1579d2ad3Roman Divacky else 3285c16bb76f25ada63864aa89827a9906c1579d2ad3Roman Divacky CmdArgs.push_back("-lm"); 32868e50a96b387dca7525caa8a6add31420dd82a2cdBenjamin Kramer } 32878e50a96b387dca7525caa8a6add31420dd82a2cdBenjamin Kramer // FIXME: For some reason GCC passes -lgcc and -lgcc_s before adding 32888e50a96b387dca7525caa8a6add31420dd82a2cdBenjamin Kramer // the default system libraries. Just mimic this for now. 3289c16bb76f25ada63864aa89827a9906c1579d2ad3Roman Divacky if (Args.hasArg(options::OPT_pg)) 3290c16bb76f25ada63864aa89827a9906c1579d2ad3Roman Divacky CmdArgs.push_back("-lgcc_p"); 3291c16bb76f25ada63864aa89827a9906c1579d2ad3Roman Divacky else 3292c16bb76f25ada63864aa89827a9906c1579d2ad3Roman Divacky CmdArgs.push_back("-lgcc"); 32938e50a96b387dca7525caa8a6add31420dd82a2cdBenjamin Kramer if (Args.hasArg(options::OPT_static)) { 32948e50a96b387dca7525caa8a6add31420dd82a2cdBenjamin Kramer CmdArgs.push_back("-lgcc_eh"); 3295c16bb76f25ada63864aa89827a9906c1579d2ad3Roman Divacky } else if (Args.hasArg(options::OPT_pg)) { 3296c16bb76f25ada63864aa89827a9906c1579d2ad3Roman Divacky CmdArgs.push_back("-lgcc_eh_p"); 32978e50a96b387dca7525caa8a6add31420dd82a2cdBenjamin Kramer } else { 32988e50a96b387dca7525caa8a6add31420dd82a2cdBenjamin Kramer CmdArgs.push_back("--as-needed"); 32998e50a96b387dca7525caa8a6add31420dd82a2cdBenjamin Kramer CmdArgs.push_back("-lgcc_s"); 33008e50a96b387dca7525caa8a6add31420dd82a2cdBenjamin Kramer CmdArgs.push_back("--no-as-needed"); 33018e50a96b387dca7525caa8a6add31420dd82a2cdBenjamin Kramer } 33028e50a96b387dca7525caa8a6add31420dd82a2cdBenjamin Kramer 3303242302673bdcf35b49579a30fed9dc068a4e10f2Matt Beaumont-Gay if (Args.hasArg(options::OPT_pthread)) { 3304c16bb76f25ada63864aa89827a9906c1579d2ad3Roman Divacky if (Args.hasArg(options::OPT_pg)) 3305c16bb76f25ada63864aa89827a9906c1579d2ad3Roman Divacky CmdArgs.push_back("-lpthread_p"); 3306c16bb76f25ada63864aa89827a9906c1579d2ad3Roman Divacky else 3307c16bb76f25ada63864aa89827a9906c1579d2ad3Roman Divacky CmdArgs.push_back("-lpthread"); 3308242302673bdcf35b49579a30fed9dc068a4e10f2Matt Beaumont-Gay } 3309c16bb76f25ada63864aa89827a9906c1579d2ad3Roman Divacky 3310c16bb76f25ada63864aa89827a9906c1579d2ad3Roman Divacky if (Args.hasArg(options::OPT_pg)) { 3311c16bb76f25ada63864aa89827a9906c1579d2ad3Roman Divacky if (Args.hasArg(options::OPT_shared)) 3312c16bb76f25ada63864aa89827a9906c1579d2ad3Roman Divacky CmdArgs.push_back("-lc"); 3313c16bb76f25ada63864aa89827a9906c1579d2ad3Roman Divacky else 3314c16bb76f25ada63864aa89827a9906c1579d2ad3Roman Divacky CmdArgs.push_back("-lc_p"); 3315c16bb76f25ada63864aa89827a9906c1579d2ad3Roman Divacky CmdArgs.push_back("-lgcc_p"); 3316c16bb76f25ada63864aa89827a9906c1579d2ad3Roman Divacky } else { 3317c16bb76f25ada63864aa89827a9906c1579d2ad3Roman Divacky CmdArgs.push_back("-lc"); 3318c16bb76f25ada63864aa89827a9906c1579d2ad3Roman Divacky CmdArgs.push_back("-lgcc"); 3319c16bb76f25ada63864aa89827a9906c1579d2ad3Roman Divacky } 33208e50a96b387dca7525caa8a6add31420dd82a2cdBenjamin Kramer 33218e50a96b387dca7525caa8a6add31420dd82a2cdBenjamin Kramer if (Args.hasArg(options::OPT_static)) { 33228e50a96b387dca7525caa8a6add31420dd82a2cdBenjamin Kramer CmdArgs.push_back("-lgcc_eh"); 3323c16bb76f25ada63864aa89827a9906c1579d2ad3Roman Divacky } else if (Args.hasArg(options::OPT_pg)) { 3324c16bb76f25ada63864aa89827a9906c1579d2ad3Roman Divacky CmdArgs.push_back("-lgcc_eh_p"); 33258e50a96b387dca7525caa8a6add31420dd82a2cdBenjamin Kramer } else { 33268e50a96b387dca7525caa8a6add31420dd82a2cdBenjamin Kramer CmdArgs.push_back("--as-needed"); 33278e50a96b387dca7525caa8a6add31420dd82a2cdBenjamin Kramer CmdArgs.push_back("-lgcc_s"); 33288e50a96b387dca7525caa8a6add31420dd82a2cdBenjamin Kramer CmdArgs.push_back("--no-as-needed"); 33298e50a96b387dca7525caa8a6add31420dd82a2cdBenjamin Kramer } 33308e50a96b387dca7525caa8a6add31420dd82a2cdBenjamin Kramer } 33318e50a96b387dca7525caa8a6add31420dd82a2cdBenjamin Kramer 33328e50a96b387dca7525caa8a6add31420dd82a2cdBenjamin Kramer if (!Args.hasArg(options::OPT_nostdlib) && 33338e50a96b387dca7525caa8a6add31420dd82a2cdBenjamin Kramer !Args.hasArg(options::OPT_nostartfiles)) { 33348e50a96b387dca7525caa8a6add31420dd82a2cdBenjamin Kramer if (!Args.hasArg(options::OPT_shared)) 33358e50a96b387dca7525caa8a6add31420dd82a2cdBenjamin Kramer CmdArgs.push_back(Args.MakeArgString(getToolChain().GetFilePath( 33368e50a96b387dca7525caa8a6add31420dd82a2cdBenjamin Kramer "crtend.o"))); 33378e50a96b387dca7525caa8a6add31420dd82a2cdBenjamin Kramer else 33388e50a96b387dca7525caa8a6add31420dd82a2cdBenjamin Kramer CmdArgs.push_back(Args.MakeArgString(getToolChain().GetFilePath( 33398e50a96b387dca7525caa8a6add31420dd82a2cdBenjamin Kramer "crtendS.o"))); 33408e50a96b387dca7525caa8a6add31420dd82a2cdBenjamin Kramer CmdArgs.push_back(Args.MakeArgString(getToolChain().GetFilePath( 33418e50a96b387dca7525caa8a6add31420dd82a2cdBenjamin Kramer "crtn.o"))); 33428e50a96b387dca7525caa8a6add31420dd82a2cdBenjamin Kramer } 33438e50a96b387dca7525caa8a6add31420dd82a2cdBenjamin Kramer 33448e50a96b387dca7525caa8a6add31420dd82a2cdBenjamin Kramer const char *Exec = 33458e50a96b387dca7525caa8a6add31420dd82a2cdBenjamin Kramer Args.MakeArgString(getToolChain().GetProgramPath("ld")); 33468e50a96b387dca7525caa8a6add31420dd82a2cdBenjamin Kramer C.addCommand(new Command(JA, *this, Exec, CmdArgs)); 33478e50a96b387dca7525caa8a6add31420dd82a2cdBenjamin Kramer} 33488e50a96b387dca7525caa8a6add31420dd82a2cdBenjamin Kramer 33498e50a96b387dca7525caa8a6add31420dd82a2cdBenjamin Kramervoid netbsd::Assemble::ConstructJob(Compilation &C, const JobAction &JA, 33508e50a96b387dca7525caa8a6add31420dd82a2cdBenjamin Kramer const InputInfo &Output, 33518e50a96b387dca7525caa8a6add31420dd82a2cdBenjamin Kramer const InputInfoList &Inputs, 33528e50a96b387dca7525caa8a6add31420dd82a2cdBenjamin Kramer const ArgList &Args, 33538e50a96b387dca7525caa8a6add31420dd82a2cdBenjamin Kramer const char *LinkingOutput) const { 33548e50a96b387dca7525caa8a6add31420dd82a2cdBenjamin Kramer ArgStringList CmdArgs; 33558e50a96b387dca7525caa8a6add31420dd82a2cdBenjamin Kramer 33568e50a96b387dca7525caa8a6add31420dd82a2cdBenjamin Kramer // When building 32-bit code on NetBSD/amd64, we have to explicitly 33578e50a96b387dca7525caa8a6add31420dd82a2cdBenjamin Kramer // instruct as in the base system to assemble 32-bit code. 33588e50a96b387dca7525caa8a6add31420dd82a2cdBenjamin Kramer if (getToolChain().getArchName() == "i386") 33598e50a96b387dca7525caa8a6add31420dd82a2cdBenjamin Kramer CmdArgs.push_back("--32"); 33608e50a96b387dca7525caa8a6add31420dd82a2cdBenjamin Kramer 33618e50a96b387dca7525caa8a6add31420dd82a2cdBenjamin Kramer 33628e50a96b387dca7525caa8a6add31420dd82a2cdBenjamin Kramer // Set byte order explicitly 33638e50a96b387dca7525caa8a6add31420dd82a2cdBenjamin Kramer if (getToolChain().getArchName() == "mips") 33648e50a96b387dca7525caa8a6add31420dd82a2cdBenjamin Kramer CmdArgs.push_back("-EB"); 33658e50a96b387dca7525caa8a6add31420dd82a2cdBenjamin Kramer else if (getToolChain().getArchName() == "mipsel") 33668e50a96b387dca7525caa8a6add31420dd82a2cdBenjamin Kramer CmdArgs.push_back("-EL"); 33678e50a96b387dca7525caa8a6add31420dd82a2cdBenjamin Kramer 33688e50a96b387dca7525caa8a6add31420dd82a2cdBenjamin Kramer Args.AddAllArgValues(CmdArgs, options::OPT_Wa_COMMA, 33698e50a96b387dca7525caa8a6add31420dd82a2cdBenjamin Kramer options::OPT_Xassembler); 33708e50a96b387dca7525caa8a6add31420dd82a2cdBenjamin Kramer 33718e50a96b387dca7525caa8a6add31420dd82a2cdBenjamin Kramer CmdArgs.push_back("-o"); 33728e50a96b387dca7525caa8a6add31420dd82a2cdBenjamin Kramer CmdArgs.push_back(Output.getFilename()); 33738e50a96b387dca7525caa8a6add31420dd82a2cdBenjamin Kramer 33748e50a96b387dca7525caa8a6add31420dd82a2cdBenjamin Kramer for (InputInfoList::const_iterator 33758e50a96b387dca7525caa8a6add31420dd82a2cdBenjamin Kramer it = Inputs.begin(), ie = Inputs.end(); it != ie; ++it) { 33768e50a96b387dca7525caa8a6add31420dd82a2cdBenjamin Kramer const InputInfo &II = *it; 33778e50a96b387dca7525caa8a6add31420dd82a2cdBenjamin Kramer CmdArgs.push_back(II.getFilename()); 33788e50a96b387dca7525caa8a6add31420dd82a2cdBenjamin Kramer } 33798e50a96b387dca7525caa8a6add31420dd82a2cdBenjamin Kramer 33808e50a96b387dca7525caa8a6add31420dd82a2cdBenjamin Kramer const char *Exec = 33818e50a96b387dca7525caa8a6add31420dd82a2cdBenjamin Kramer Args.MakeArgString(getToolChain().GetProgramPath("as")); 33828e50a96b387dca7525caa8a6add31420dd82a2cdBenjamin Kramer C.addCommand(new Command(JA, *this, Exec, CmdArgs)); 33838e50a96b387dca7525caa8a6add31420dd82a2cdBenjamin Kramer} 33848e50a96b387dca7525caa8a6add31420dd82a2cdBenjamin Kramer 33858e50a96b387dca7525caa8a6add31420dd82a2cdBenjamin Kramervoid netbsd::Link::ConstructJob(Compilation &C, const JobAction &JA, 33868e50a96b387dca7525caa8a6add31420dd82a2cdBenjamin Kramer const InputInfo &Output, 33878e50a96b387dca7525caa8a6add31420dd82a2cdBenjamin Kramer const InputInfoList &Inputs, 33888e50a96b387dca7525caa8a6add31420dd82a2cdBenjamin Kramer const ArgList &Args, 33898e50a96b387dca7525caa8a6add31420dd82a2cdBenjamin Kramer const char *LinkingOutput) const { 33908e50a96b387dca7525caa8a6add31420dd82a2cdBenjamin Kramer const Driver &D = getToolChain().getDriver(); 33918e50a96b387dca7525caa8a6add31420dd82a2cdBenjamin Kramer ArgStringList CmdArgs; 33928e50a96b387dca7525caa8a6add31420dd82a2cdBenjamin Kramer 33938e50a96b387dca7525caa8a6add31420dd82a2cdBenjamin Kramer if (Args.hasArg(options::OPT_static)) { 33948e50a96b387dca7525caa8a6add31420dd82a2cdBenjamin Kramer CmdArgs.push_back("-Bstatic"); 33958e50a96b387dca7525caa8a6add31420dd82a2cdBenjamin Kramer } else { 33968e50a96b387dca7525caa8a6add31420dd82a2cdBenjamin Kramer if (Args.hasArg(options::OPT_rdynamic)) 33978e50a96b387dca7525caa8a6add31420dd82a2cdBenjamin Kramer CmdArgs.push_back("-export-dynamic"); 33988e50a96b387dca7525caa8a6add31420dd82a2cdBenjamin Kramer CmdArgs.push_back("--eh-frame-hdr"); 33998e50a96b387dca7525caa8a6add31420dd82a2cdBenjamin Kramer if (Args.hasArg(options::OPT_shared)) { 34008e50a96b387dca7525caa8a6add31420dd82a2cdBenjamin Kramer CmdArgs.push_back("-Bshareable"); 34018e50a96b387dca7525caa8a6add31420dd82a2cdBenjamin Kramer } else { 34028e50a96b387dca7525caa8a6add31420dd82a2cdBenjamin Kramer CmdArgs.push_back("-dynamic-linker"); 34038e50a96b387dca7525caa8a6add31420dd82a2cdBenjamin Kramer CmdArgs.push_back("/libexec/ld.elf_so"); 34048e50a96b387dca7525caa8a6add31420dd82a2cdBenjamin Kramer } 34058e50a96b387dca7525caa8a6add31420dd82a2cdBenjamin Kramer } 34068e50a96b387dca7525caa8a6add31420dd82a2cdBenjamin Kramer 34078e50a96b387dca7525caa8a6add31420dd82a2cdBenjamin Kramer // When building 32-bit code on NetBSD/amd64, we have to explicitly 34088e50a96b387dca7525caa8a6add31420dd82a2cdBenjamin Kramer // instruct ld in the base system to link 32-bit code. 34098e50a96b387dca7525caa8a6add31420dd82a2cdBenjamin Kramer if (getToolChain().getArchName() == "i386") { 34108e50a96b387dca7525caa8a6add31420dd82a2cdBenjamin Kramer CmdArgs.push_back("-m"); 34118e50a96b387dca7525caa8a6add31420dd82a2cdBenjamin Kramer CmdArgs.push_back("elf_i386"); 34128e50a96b387dca7525caa8a6add31420dd82a2cdBenjamin Kramer } 34138e50a96b387dca7525caa8a6add31420dd82a2cdBenjamin Kramer 34148e50a96b387dca7525caa8a6add31420dd82a2cdBenjamin Kramer if (Output.isFilename()) { 34158e50a96b387dca7525caa8a6add31420dd82a2cdBenjamin Kramer CmdArgs.push_back("-o"); 34168e50a96b387dca7525caa8a6add31420dd82a2cdBenjamin Kramer CmdArgs.push_back(Output.getFilename()); 34178e50a96b387dca7525caa8a6add31420dd82a2cdBenjamin Kramer } else { 34188e50a96b387dca7525caa8a6add31420dd82a2cdBenjamin Kramer assert(Output.isNothing() && "Invalid output."); 34198e50a96b387dca7525caa8a6add31420dd82a2cdBenjamin Kramer } 34208e50a96b387dca7525caa8a6add31420dd82a2cdBenjamin Kramer 34218e50a96b387dca7525caa8a6add31420dd82a2cdBenjamin Kramer if (!Args.hasArg(options::OPT_nostdlib) && 34228e50a96b387dca7525caa8a6add31420dd82a2cdBenjamin Kramer !Args.hasArg(options::OPT_nostartfiles)) { 34238e50a96b387dca7525caa8a6add31420dd82a2cdBenjamin Kramer if (!Args.hasArg(options::OPT_shared)) { 34248e50a96b387dca7525caa8a6add31420dd82a2cdBenjamin Kramer CmdArgs.push_back(Args.MakeArgString( 34258e50a96b387dca7525caa8a6add31420dd82a2cdBenjamin Kramer getToolChain().GetFilePath("crt0.o"))); 34268e50a96b387dca7525caa8a6add31420dd82a2cdBenjamin Kramer CmdArgs.push_back(Args.MakeArgString( 34278e50a96b387dca7525caa8a6add31420dd82a2cdBenjamin Kramer getToolChain().GetFilePath("crti.o"))); 34288e50a96b387dca7525caa8a6add31420dd82a2cdBenjamin Kramer CmdArgs.push_back(Args.MakeArgString( 34298e50a96b387dca7525caa8a6add31420dd82a2cdBenjamin Kramer getToolChain().GetFilePath("crtbegin.o"))); 34308e50a96b387dca7525caa8a6add31420dd82a2cdBenjamin Kramer } else { 34318e50a96b387dca7525caa8a6add31420dd82a2cdBenjamin Kramer CmdArgs.push_back(Args.MakeArgString( 34328e50a96b387dca7525caa8a6add31420dd82a2cdBenjamin Kramer getToolChain().GetFilePath("crti.o"))); 34338e50a96b387dca7525caa8a6add31420dd82a2cdBenjamin Kramer CmdArgs.push_back(Args.MakeArgString( 34348e50a96b387dca7525caa8a6add31420dd82a2cdBenjamin Kramer getToolChain().GetFilePath("crtbeginS.o"))); 34358e50a96b387dca7525caa8a6add31420dd82a2cdBenjamin Kramer } 34368e50a96b387dca7525caa8a6add31420dd82a2cdBenjamin Kramer } 34378e50a96b387dca7525caa8a6add31420dd82a2cdBenjamin Kramer 34388e50a96b387dca7525caa8a6add31420dd82a2cdBenjamin Kramer Args.AddAllArgs(CmdArgs, options::OPT_L); 34398e50a96b387dca7525caa8a6add31420dd82a2cdBenjamin Kramer Args.AddAllArgs(CmdArgs, options::OPT_T_Group); 34408e50a96b387dca7525caa8a6add31420dd82a2cdBenjamin Kramer Args.AddAllArgs(CmdArgs, options::OPT_e); 34418e50a96b387dca7525caa8a6add31420dd82a2cdBenjamin Kramer Args.AddAllArgs(CmdArgs, options::OPT_s); 34428e50a96b387dca7525caa8a6add31420dd82a2cdBenjamin Kramer Args.AddAllArgs(CmdArgs, options::OPT_t); 34438e50a96b387dca7525caa8a6add31420dd82a2cdBenjamin Kramer Args.AddAllArgs(CmdArgs, options::OPT_Z_Flag); 34448e50a96b387dca7525caa8a6add31420dd82a2cdBenjamin Kramer Args.AddAllArgs(CmdArgs, options::OPT_r); 34458e50a96b387dca7525caa8a6add31420dd82a2cdBenjamin Kramer 34468e50a96b387dca7525caa8a6add31420dd82a2cdBenjamin Kramer AddLinkerInputs(getToolChain(), Inputs, Args, CmdArgs); 3447008f54a54299eaafdaa940e2bdeaf55935ecd95aDaniel Dunbar 3448008f54a54299eaafdaa940e2bdeaf55935ecd95aDaniel Dunbar if (!Args.hasArg(options::OPT_nostdlib) && 3449008f54a54299eaafdaa940e2bdeaf55935ecd95aDaniel Dunbar !Args.hasArg(options::OPT_nodefaultlibs)) { 34502002263e10aa369c89008d37cada2908203fd822Daniel Dunbar if (D.CCCIsCXX) { 3451132e35d2f87895d20e7ea146c8c00404b80221a1Daniel Dunbar getToolChain().AddCXXStdlibLibArgs(Args, CmdArgs); 34522002263e10aa369c89008d37cada2908203fd822Daniel Dunbar CmdArgs.push_back("-lm"); 34532002263e10aa369c89008d37cada2908203fd822Daniel Dunbar } 3454008f54a54299eaafdaa940e2bdeaf55935ecd95aDaniel Dunbar // FIXME: For some reason GCC passes -lgcc and -lgcc_s before adding 3455008f54a54299eaafdaa940e2bdeaf55935ecd95aDaniel Dunbar // the default system libraries. Just mimic this for now. 3456008f54a54299eaafdaa940e2bdeaf55935ecd95aDaniel Dunbar CmdArgs.push_back("-lgcc"); 3457008f54a54299eaafdaa940e2bdeaf55935ecd95aDaniel Dunbar if (Args.hasArg(options::OPT_static)) { 3458008f54a54299eaafdaa940e2bdeaf55935ecd95aDaniel Dunbar CmdArgs.push_back("-lgcc_eh"); 3459008f54a54299eaafdaa940e2bdeaf55935ecd95aDaniel Dunbar } else { 3460008f54a54299eaafdaa940e2bdeaf55935ecd95aDaniel Dunbar CmdArgs.push_back("--as-needed"); 3461008f54a54299eaafdaa940e2bdeaf55935ecd95aDaniel Dunbar CmdArgs.push_back("-lgcc_s"); 3462008f54a54299eaafdaa940e2bdeaf55935ecd95aDaniel Dunbar CmdArgs.push_back("--no-as-needed"); 3463008f54a54299eaafdaa940e2bdeaf55935ecd95aDaniel Dunbar } 3464008f54a54299eaafdaa940e2bdeaf55935ecd95aDaniel Dunbar 3465008f54a54299eaafdaa940e2bdeaf55935ecd95aDaniel Dunbar if (Args.hasArg(options::OPT_pthread)) 3466008f54a54299eaafdaa940e2bdeaf55935ecd95aDaniel Dunbar CmdArgs.push_back("-lpthread"); 3467008f54a54299eaafdaa940e2bdeaf55935ecd95aDaniel Dunbar CmdArgs.push_back("-lc"); 3468008f54a54299eaafdaa940e2bdeaf55935ecd95aDaniel Dunbar 3469008f54a54299eaafdaa940e2bdeaf55935ecd95aDaniel Dunbar CmdArgs.push_back("-lgcc"); 3470008f54a54299eaafdaa940e2bdeaf55935ecd95aDaniel Dunbar if (Args.hasArg(options::OPT_static)) { 3471008f54a54299eaafdaa940e2bdeaf55935ecd95aDaniel Dunbar CmdArgs.push_back("-lgcc_eh"); 3472008f54a54299eaafdaa940e2bdeaf55935ecd95aDaniel Dunbar } else { 3473008f54a54299eaafdaa940e2bdeaf55935ecd95aDaniel Dunbar CmdArgs.push_back("--as-needed"); 3474008f54a54299eaafdaa940e2bdeaf55935ecd95aDaniel Dunbar CmdArgs.push_back("-lgcc_s"); 3475008f54a54299eaafdaa940e2bdeaf55935ecd95aDaniel Dunbar CmdArgs.push_back("--no-as-needed"); 3476008f54a54299eaafdaa940e2bdeaf55935ecd95aDaniel Dunbar } 3477008f54a54299eaafdaa940e2bdeaf55935ecd95aDaniel Dunbar } 3478008f54a54299eaafdaa940e2bdeaf55935ecd95aDaniel Dunbar 3479008f54a54299eaafdaa940e2bdeaf55935ecd95aDaniel Dunbar if (!Args.hasArg(options::OPT_nostdlib) && 3480008f54a54299eaafdaa940e2bdeaf55935ecd95aDaniel Dunbar !Args.hasArg(options::OPT_nostartfiles)) { 3481008f54a54299eaafdaa940e2bdeaf55935ecd95aDaniel Dunbar if (!Args.hasArg(options::OPT_shared)) 34824a7e88978cf646ad10d654020cb00b3877069210Daniel Dunbar CmdArgs.push_back(Args.MakeArgString(getToolChain().GetFilePath( 348338e317d6dce161b249508686cc67eb7176958762Chris Lattner "crtend.o"))); 3484008f54a54299eaafdaa940e2bdeaf55935ecd95aDaniel Dunbar else 34854a7e88978cf646ad10d654020cb00b3877069210Daniel Dunbar CmdArgs.push_back(Args.MakeArgString(getToolChain().GetFilePath( 348638e317d6dce161b249508686cc67eb7176958762Chris Lattner "crtendS.o"))); 34874a7e88978cf646ad10d654020cb00b3877069210Daniel Dunbar CmdArgs.push_back(Args.MakeArgString(getToolChain().GetFilePath( 348838e317d6dce161b249508686cc67eb7176958762Chris Lattner "crtn.o"))); 3489008f54a54299eaafdaa940e2bdeaf55935ecd95aDaniel Dunbar } 3490008f54a54299eaafdaa940e2bdeaf55935ecd95aDaniel Dunbar 3491c21c485b4fb58ef5d55cf3e523263dd824a2ace4Daniel Dunbar const char *Exec = 34924a7e88978cf646ad10d654020cb00b3877069210Daniel Dunbar Args.MakeArgString(getToolChain().GetProgramPath("ld")); 34932fe238ed293bd4bc27af9beb9fa151fad2146fa8Daniel Dunbar C.addCommand(new Command(JA, *this, Exec, CmdArgs)); 3494008f54a54299eaafdaa940e2bdeaf55935ecd95aDaniel Dunbar} 349511e1b40d759a643086f590f6ffbd9d68360bad46Daniel Dunbar 3496ba30bbe4e36a30a274da809a11a42f9cdc168e92Rafael Espindolavoid linuxtools::Assemble::ConstructJob(Compilation &C, const JobAction &JA, 3497ba30bbe4e36a30a274da809a11a42f9cdc168e92Rafael Espindola const InputInfo &Output, 3498ba30bbe4e36a30a274da809a11a42f9cdc168e92Rafael Espindola const InputInfoList &Inputs, 3499ba30bbe4e36a30a274da809a11a42f9cdc168e92Rafael Espindola const ArgList &Args, 3500ba30bbe4e36a30a274da809a11a42f9cdc168e92Rafael Espindola const char *LinkingOutput) const { 3501ba30bbe4e36a30a274da809a11a42f9cdc168e92Rafael Espindola ArgStringList CmdArgs; 3502ba30bbe4e36a30a274da809a11a42f9cdc168e92Rafael Espindola 3503ba30bbe4e36a30a274da809a11a42f9cdc168e92Rafael Espindola // Add --32/--64 to make sure we get the format we want. 3504ba30bbe4e36a30a274da809a11a42f9cdc168e92Rafael Espindola // This is incomplete 3505ba30bbe4e36a30a274da809a11a42f9cdc168e92Rafael Espindola if (getToolChain().getArch() == llvm::Triple::x86) { 3506ba30bbe4e36a30a274da809a11a42f9cdc168e92Rafael Espindola CmdArgs.push_back("--32"); 3507ba30bbe4e36a30a274da809a11a42f9cdc168e92Rafael Espindola } else if (getToolChain().getArch() == llvm::Triple::x86_64) { 3508ba30bbe4e36a30a274da809a11a42f9cdc168e92Rafael Espindola CmdArgs.push_back("--64"); 3509ba30bbe4e36a30a274da809a11a42f9cdc168e92Rafael Espindola } else if (getToolChain().getArch() == llvm::Triple::arm) { 3510ba30bbe4e36a30a274da809a11a42f9cdc168e92Rafael Espindola llvm::StringRef MArch = getToolChain().getArchName(); 3511ba30bbe4e36a30a274da809a11a42f9cdc168e92Rafael Espindola if (MArch == "armv7" || MArch == "armv7a" || MArch == "armv7-a") 3512ba30bbe4e36a30a274da809a11a42f9cdc168e92Rafael Espindola CmdArgs.push_back("-mfpu=neon"); 3513ba30bbe4e36a30a274da809a11a42f9cdc168e92Rafael Espindola } 3514ba30bbe4e36a30a274da809a11a42f9cdc168e92Rafael Espindola 3515ba30bbe4e36a30a274da809a11a42f9cdc168e92Rafael Espindola Args.AddAllArgValues(CmdArgs, options::OPT_Wa_COMMA, 3516ba30bbe4e36a30a274da809a11a42f9cdc168e92Rafael Espindola options::OPT_Xassembler); 3517ba30bbe4e36a30a274da809a11a42f9cdc168e92Rafael Espindola 3518ba30bbe4e36a30a274da809a11a42f9cdc168e92Rafael Espindola CmdArgs.push_back("-o"); 3519ba30bbe4e36a30a274da809a11a42f9cdc168e92Rafael Espindola CmdArgs.push_back(Output.getFilename()); 3520ba30bbe4e36a30a274da809a11a42f9cdc168e92Rafael Espindola 3521ba30bbe4e36a30a274da809a11a42f9cdc168e92Rafael Espindola for (InputInfoList::const_iterator 3522ba30bbe4e36a30a274da809a11a42f9cdc168e92Rafael Espindola it = Inputs.begin(), ie = Inputs.end(); it != ie; ++it) { 3523ba30bbe4e36a30a274da809a11a42f9cdc168e92Rafael Espindola const InputInfo &II = *it; 3524ba30bbe4e36a30a274da809a11a42f9cdc168e92Rafael Espindola CmdArgs.push_back(II.getFilename()); 3525ba30bbe4e36a30a274da809a11a42f9cdc168e92Rafael Espindola } 3526ba30bbe4e36a30a274da809a11a42f9cdc168e92Rafael Espindola 3527ba30bbe4e36a30a274da809a11a42f9cdc168e92Rafael Espindola const char *Exec = 3528ba30bbe4e36a30a274da809a11a42f9cdc168e92Rafael Espindola Args.MakeArgString(getToolChain().GetProgramPath("as")); 3529ba30bbe4e36a30a274da809a11a42f9cdc168e92Rafael Espindola C.addCommand(new Command(JA, *this, Exec, CmdArgs)); 3530ba30bbe4e36a30a274da809a11a42f9cdc168e92Rafael Espindola} 3531ba30bbe4e36a30a274da809a11a42f9cdc168e92Rafael Espindola 3532c1da981bba867681004004b2d54ec2fdf3c08913Rafael Espindolavoid linuxtools::Link::ConstructJob(Compilation &C, const JobAction &JA, 3533c1da981bba867681004004b2d54ec2fdf3c08913Rafael Espindola const InputInfo &Output, 3534c1da981bba867681004004b2d54ec2fdf3c08913Rafael Espindola const InputInfoList &Inputs, 3535c1da981bba867681004004b2d54ec2fdf3c08913Rafael Espindola const ArgList &Args, 3536c1da981bba867681004004b2d54ec2fdf3c08913Rafael Espindola const char *LinkingOutput) const { 3537c1da981bba867681004004b2d54ec2fdf3c08913Rafael Espindola const toolchains::Linux& ToolChain = 3538c1da981bba867681004004b2d54ec2fdf3c08913Rafael Espindola static_cast<const toolchains::Linux&>(getToolChain()); 3539c1da981bba867681004004b2d54ec2fdf3c08913Rafael Espindola const Driver &D = ToolChain.getDriver(); 3540c1da981bba867681004004b2d54ec2fdf3c08913Rafael Espindola ArgStringList CmdArgs; 3541c1da981bba867681004004b2d54ec2fdf3c08913Rafael Espindola 354226f14c309e8de2db8c144342808cca2e869c1777Rafael Espindola // Silence warning for "clang -g foo.o -o foo" 354326f14c309e8de2db8c144342808cca2e869c1777Rafael Espindola Args.ClaimAllArgs(options::OPT_g_Group); 35447f6458b7e265d1870f3bd5be2b49bc4d368446b3Rafael Espindola // and for "clang -g foo.o -o foo". Other warning options are already 35457f6458b7e265d1870f3bd5be2b49bc4d368446b3Rafael Espindola // handled somewhere else. 35467f6458b7e265d1870f3bd5be2b49bc4d368446b3Rafael Espindola Args.ClaimAllArgs(options::OPT_w); 354726f14c309e8de2db8c144342808cca2e869c1777Rafael Espindola 3548c1da981bba867681004004b2d54ec2fdf3c08913Rafael Espindola if (Arg *A = Args.getLastArg(options::OPT__sysroot_EQ)) { 3549c1da981bba867681004004b2d54ec2fdf3c08913Rafael Espindola CmdArgs.push_back("--sysroot"); 3550c1da981bba867681004004b2d54ec2fdf3c08913Rafael Espindola CmdArgs.push_back(A->getValue(Args)); 3551c1da981bba867681004004b2d54ec2fdf3c08913Rafael Espindola } 3552c1da981bba867681004004b2d54ec2fdf3c08913Rafael Espindola 3553fdda17179047ff0b5e28cc777dc89ebc42f083cfRafael Espindola if (Args.hasArg(options::OPT_pie)) 3554fdda17179047ff0b5e28cc777dc89ebc42f083cfRafael Espindola CmdArgs.push_back("-pie"); 3555fdda17179047ff0b5e28cc777dc89ebc42f083cfRafael Espindola 3556dc1b76ddfc687c713a55cc9e3e054e9a0de1aa74Rafael Espindola if (Args.hasArg(options::OPT_rdynamic)) 3557dc1b76ddfc687c713a55cc9e3e054e9a0de1aa74Rafael Espindola CmdArgs.push_back("-export-dynamic"); 3558dc1b76ddfc687c713a55cc9e3e054e9a0de1aa74Rafael Espindola 3559e0e6d3b5cf61dfefad3c0393f4786d2cf3d9c272Rafael Espindola if (Args.hasArg(options::OPT_s)) 3560e0e6d3b5cf61dfefad3c0393f4786d2cf3d9c272Rafael Espindola CmdArgs.push_back("-s"); 3561e0e6d3b5cf61dfefad3c0393f4786d2cf3d9c272Rafael Espindola 3562c1da981bba867681004004b2d54ec2fdf3c08913Rafael Espindola for (std::vector<std::string>::const_iterator i = ToolChain.ExtraOpts.begin(), 3563c1da981bba867681004004b2d54ec2fdf3c08913Rafael Espindola e = ToolChain.ExtraOpts.end(); 3564c1da981bba867681004004b2d54ec2fdf3c08913Rafael Espindola i != e; ++i) 3565c1da981bba867681004004b2d54ec2fdf3c08913Rafael Espindola CmdArgs.push_back(i->c_str()); 3566c1da981bba867681004004b2d54ec2fdf3c08913Rafael Espindola 3567c1da981bba867681004004b2d54ec2fdf3c08913Rafael Espindola if (!Args.hasArg(options::OPT_static)) { 3568c1da981bba867681004004b2d54ec2fdf3c08913Rafael Espindola CmdArgs.push_back("--eh-frame-hdr"); 3569c1da981bba867681004004b2d54ec2fdf3c08913Rafael Espindola } 3570c1da981bba867681004004b2d54ec2fdf3c08913Rafael Espindola 3571c1da981bba867681004004b2d54ec2fdf3c08913Rafael Espindola CmdArgs.push_back("-m"); 3572c1da981bba867681004004b2d54ec2fdf3c08913Rafael Espindola if (ToolChain.getArch() == llvm::Triple::x86) 3573c1da981bba867681004004b2d54ec2fdf3c08913Rafael Espindola CmdArgs.push_back("elf_i386"); 3574c1da981bba867681004004b2d54ec2fdf3c08913Rafael Espindola else if (ToolChain.getArch() == llvm::Triple::arm) 3575c1da981bba867681004004b2d54ec2fdf3c08913Rafael Espindola CmdArgs.push_back("armelf_linux_eabi"); 3576c1da981bba867681004004b2d54ec2fdf3c08913Rafael Espindola else 3577c1da981bba867681004004b2d54ec2fdf3c08913Rafael Espindola CmdArgs.push_back("elf_x86_64"); 3578c1da981bba867681004004b2d54ec2fdf3c08913Rafael Espindola 3579c1da981bba867681004004b2d54ec2fdf3c08913Rafael Espindola if (Args.hasArg(options::OPT_static)) { 3580c1da981bba867681004004b2d54ec2fdf3c08913Rafael Espindola if (ToolChain.getArch() == llvm::Triple::arm) 3581c1da981bba867681004004b2d54ec2fdf3c08913Rafael Espindola CmdArgs.push_back("-Bstatic"); 3582c1da981bba867681004004b2d54ec2fdf3c08913Rafael Espindola else 3583c1da981bba867681004004b2d54ec2fdf3c08913Rafael Espindola CmdArgs.push_back("-static"); 3584c1da981bba867681004004b2d54ec2fdf3c08913Rafael Espindola } else if (Args.hasArg(options::OPT_shared)) { 3585c1da981bba867681004004b2d54ec2fdf3c08913Rafael Espindola CmdArgs.push_back("-shared"); 3586c1da981bba867681004004b2d54ec2fdf3c08913Rafael Espindola } 3587c1da981bba867681004004b2d54ec2fdf3c08913Rafael Espindola 3588c1da981bba867681004004b2d54ec2fdf3c08913Rafael Espindola if (ToolChain.getArch() == llvm::Triple::arm || 3589c1da981bba867681004004b2d54ec2fdf3c08913Rafael Espindola (!Args.hasArg(options::OPT_static) && 3590c1da981bba867681004004b2d54ec2fdf3c08913Rafael Espindola !Args.hasArg(options::OPT_shared))) { 3591c1da981bba867681004004b2d54ec2fdf3c08913Rafael Espindola CmdArgs.push_back("-dynamic-linker"); 3592c1da981bba867681004004b2d54ec2fdf3c08913Rafael Espindola if (ToolChain.getArch() == llvm::Triple::x86) 3593c1da981bba867681004004b2d54ec2fdf3c08913Rafael Espindola CmdArgs.push_back("/lib/ld-linux.so.2"); 3594c1da981bba867681004004b2d54ec2fdf3c08913Rafael Espindola else if (ToolChain.getArch() == llvm::Triple::arm) 3595c1da981bba867681004004b2d54ec2fdf3c08913Rafael Espindola CmdArgs.push_back("/lib/ld-linux.so.3"); 3596c1da981bba867681004004b2d54ec2fdf3c08913Rafael Espindola else 3597c1da981bba867681004004b2d54ec2fdf3c08913Rafael Espindola CmdArgs.push_back("/lib64/ld-linux-x86-64.so.2"); 3598c1da981bba867681004004b2d54ec2fdf3c08913Rafael Espindola } 3599c1da981bba867681004004b2d54ec2fdf3c08913Rafael Espindola 3600c1da981bba867681004004b2d54ec2fdf3c08913Rafael Espindola CmdArgs.push_back("-o"); 3601c1da981bba867681004004b2d54ec2fdf3c08913Rafael Espindola CmdArgs.push_back(Output.getFilename()); 3602c1da981bba867681004004b2d54ec2fdf3c08913Rafael Espindola 360349c64fdcf354c7998b8b301402fb6140c24df36aRafael Espindola if (!Args.hasArg(options::OPT_nostdlib) && 360449c64fdcf354c7998b8b301402fb6140c24df36aRafael Espindola !Args.hasArg(options::OPT_nostartfiles)) { 3605fdda17179047ff0b5e28cc777dc89ebc42f083cfRafael Espindola const char *crt1 = NULL; 3606fdda17179047ff0b5e28cc777dc89ebc42f083cfRafael Espindola if (!Args.hasArg(options::OPT_shared)){ 3607fdda17179047ff0b5e28cc777dc89ebc42f083cfRafael Espindola if (Args.hasArg(options::OPT_pie)) 3608fdda17179047ff0b5e28cc777dc89ebc42f083cfRafael Espindola crt1 = "Scrt1.o"; 3609fdda17179047ff0b5e28cc777dc89ebc42f083cfRafael Espindola else 3610fdda17179047ff0b5e28cc777dc89ebc42f083cfRafael Espindola crt1 = "crt1.o"; 3611fdda17179047ff0b5e28cc777dc89ebc42f083cfRafael Espindola } 3612fdda17179047ff0b5e28cc777dc89ebc42f083cfRafael Espindola if (crt1) 3613fdda17179047ff0b5e28cc777dc89ebc42f083cfRafael Espindola CmdArgs.push_back(Args.MakeArgString(ToolChain.GetFilePath(crt1))); 3614c1da981bba867681004004b2d54ec2fdf3c08913Rafael Espindola 361589414b384a0004c698244cc675f49d0669bb3463Rafael Espindola CmdArgs.push_back(Args.MakeArgString(ToolChain.GetFilePath("crti.o"))); 3616c1da981bba867681004004b2d54ec2fdf3c08913Rafael Espindola 361789414b384a0004c698244cc675f49d0669bb3463Rafael Espindola const char *crtbegin; 361889414b384a0004c698244cc675f49d0669bb3463Rafael Espindola if (Args.hasArg(options::OPT_static)) 361989414b384a0004c698244cc675f49d0669bb3463Rafael Espindola crtbegin = "crtbeginT.o"; 3620fdda17179047ff0b5e28cc777dc89ebc42f083cfRafael Espindola else if (Args.hasArg(options::OPT_shared) || Args.hasArg(options::OPT_pie)) 362189414b384a0004c698244cc675f49d0669bb3463Rafael Espindola crtbegin = "crtbeginS.o"; 362289414b384a0004c698244cc675f49d0669bb3463Rafael Espindola else 362389414b384a0004c698244cc675f49d0669bb3463Rafael Espindola crtbegin = "crtbegin.o"; 362489414b384a0004c698244cc675f49d0669bb3463Rafael Espindola CmdArgs.push_back(Args.MakeArgString(ToolChain.GetFilePath(crtbegin))); 362589414b384a0004c698244cc675f49d0669bb3463Rafael Espindola } 3626c1da981bba867681004004b2d54ec2fdf3c08913Rafael Espindola 3627c1da981bba867681004004b2d54ec2fdf3c08913Rafael Espindola Args.AddAllArgs(CmdArgs, options::OPT_L); 3628c1da981bba867681004004b2d54ec2fdf3c08913Rafael Espindola 3629c1da981bba867681004004b2d54ec2fdf3c08913Rafael Espindola const ToolChain::path_list Paths = ToolChain.getFilePaths(); 3630c1da981bba867681004004b2d54ec2fdf3c08913Rafael Espindola 3631c1da981bba867681004004b2d54ec2fdf3c08913Rafael Espindola for (ToolChain::path_list::const_iterator i = Paths.begin(), 3632c1da981bba867681004004b2d54ec2fdf3c08913Rafael Espindola e = Paths.end(); 3633c1da981bba867681004004b2d54ec2fdf3c08913Rafael Espindola i != e; ++i) { 3634c1da981bba867681004004b2d54ec2fdf3c08913Rafael Espindola const std::string &s = *i; 3635c1da981bba867681004004b2d54ec2fdf3c08913Rafael Espindola CmdArgs.push_back(Args.MakeArgString(std::string("-L") + s)); 3636c1da981bba867681004004b2d54ec2fdf3c08913Rafael Espindola } 3637c1da981bba867681004004b2d54ec2fdf3c08913Rafael Espindola 3638c1da981bba867681004004b2d54ec2fdf3c08913Rafael Espindola AddLinkerInputs(ToolChain, Inputs, Args, CmdArgs); 3639c1da981bba867681004004b2d54ec2fdf3c08913Rafael Espindola 364089414b384a0004c698244cc675f49d0669bb3463Rafael Espindola if (D.CCCIsCXX && !Args.hasArg(options::OPT_nostdlib)) { 3641c1da981bba867681004004b2d54ec2fdf3c08913Rafael Espindola ToolChain.AddCXXStdlibLibArgs(Args, CmdArgs); 3642c1da981bba867681004004b2d54ec2fdf3c08913Rafael Espindola CmdArgs.push_back("-lm"); 3643c1da981bba867681004004b2d54ec2fdf3c08913Rafael Espindola } 3644c1da981bba867681004004b2d54ec2fdf3c08913Rafael Espindola 3645c1da981bba867681004004b2d54ec2fdf3c08913Rafael Espindola if (Args.hasArg(options::OPT_static)) 3646c1da981bba867681004004b2d54ec2fdf3c08913Rafael Espindola CmdArgs.push_back("--start-group"); 3647c1da981bba867681004004b2d54ec2fdf3c08913Rafael Espindola 364889414b384a0004c698244cc675f49d0669bb3463Rafael Espindola if (!Args.hasArg(options::OPT_nostdlib)) { 3649c1da981bba867681004004b2d54ec2fdf3c08913Rafael Espindola if (!D.CCCIsCXX) 365089414b384a0004c698244cc675f49d0669bb3463Rafael Espindola CmdArgs.push_back("-lgcc"); 3651c1da981bba867681004004b2d54ec2fdf3c08913Rafael Espindola 365289414b384a0004c698244cc675f49d0669bb3463Rafael Espindola if (Args.hasArg(options::OPT_static)) { 365389414b384a0004c698244cc675f49d0669bb3463Rafael Espindola if (D.CCCIsCXX) 365489414b384a0004c698244cc675f49d0669bb3463Rafael Espindola CmdArgs.push_back("-lgcc"); 365589414b384a0004c698244cc675f49d0669bb3463Rafael Espindola } else { 365689414b384a0004c698244cc675f49d0669bb3463Rafael Espindola if (!D.CCCIsCXX) 365789414b384a0004c698244cc675f49d0669bb3463Rafael Espindola CmdArgs.push_back("--as-needed"); 365889414b384a0004c698244cc675f49d0669bb3463Rafael Espindola CmdArgs.push_back("-lgcc_s"); 365989414b384a0004c698244cc675f49d0669bb3463Rafael Espindola if (!D.CCCIsCXX) 366089414b384a0004c698244cc675f49d0669bb3463Rafael Espindola CmdArgs.push_back("--no-as-needed"); 366189414b384a0004c698244cc675f49d0669bb3463Rafael Espindola } 3662c1da981bba867681004004b2d54ec2fdf3c08913Rafael Espindola 366389414b384a0004c698244cc675f49d0669bb3463Rafael Espindola if (Args.hasArg(options::OPT_static)) 366489414b384a0004c698244cc675f49d0669bb3463Rafael Espindola CmdArgs.push_back("-lgcc_eh"); 366589414b384a0004c698244cc675f49d0669bb3463Rafael Espindola else if (!Args.hasArg(options::OPT_shared) && D.CCCIsCXX) 366689414b384a0004c698244cc675f49d0669bb3463Rafael Espindola CmdArgs.push_back("-lgcc"); 3667e0e6d3b5cf61dfefad3c0393f4786d2cf3d9c272Rafael Espindola 366889414b384a0004c698244cc675f49d0669bb3463Rafael Espindola if (Args.hasArg(options::OPT_pthread) || 366989414b384a0004c698244cc675f49d0669bb3463Rafael Espindola Args.hasArg(options::OPT_pthreads)) 367089414b384a0004c698244cc675f49d0669bb3463Rafael Espindola CmdArgs.push_back("-lpthread"); 3671c1da981bba867681004004b2d54ec2fdf3c08913Rafael Espindola 367289414b384a0004c698244cc675f49d0669bb3463Rafael Espindola CmdArgs.push_back("-lc"); 3673c1da981bba867681004004b2d54ec2fdf3c08913Rafael Espindola 367489414b384a0004c698244cc675f49d0669bb3463Rafael Espindola if (Args.hasArg(options::OPT_static)) 367589414b384a0004c698244cc675f49d0669bb3463Rafael Espindola CmdArgs.push_back("--end-group"); 367689414b384a0004c698244cc675f49d0669bb3463Rafael Espindola else { 367789414b384a0004c698244cc675f49d0669bb3463Rafael Espindola if (!D.CCCIsCXX) 367889414b384a0004c698244cc675f49d0669bb3463Rafael Espindola CmdArgs.push_back("-lgcc"); 3679c1da981bba867681004004b2d54ec2fdf3c08913Rafael Espindola 368089414b384a0004c698244cc675f49d0669bb3463Rafael Espindola if (!D.CCCIsCXX) 368189414b384a0004c698244cc675f49d0669bb3463Rafael Espindola CmdArgs.push_back("--as-needed"); 368289414b384a0004c698244cc675f49d0669bb3463Rafael Espindola CmdArgs.push_back("-lgcc_s"); 368389414b384a0004c698244cc675f49d0669bb3463Rafael Espindola if (!D.CCCIsCXX) 368489414b384a0004c698244cc675f49d0669bb3463Rafael Espindola CmdArgs.push_back("--no-as-needed"); 3685c1da981bba867681004004b2d54ec2fdf3c08913Rafael Espindola 368689414b384a0004c698244cc675f49d0669bb3463Rafael Espindola if (!Args.hasArg(options::OPT_shared) && D.CCCIsCXX) 368789414b384a0004c698244cc675f49d0669bb3463Rafael Espindola CmdArgs.push_back("-lgcc"); 368889414b384a0004c698244cc675f49d0669bb3463Rafael Espindola } 3689c1da981bba867681004004b2d54ec2fdf3c08913Rafael Espindola 3690fdda17179047ff0b5e28cc777dc89ebc42f083cfRafael Espindola 369149c64fdcf354c7998b8b301402fb6140c24df36aRafael Espindola if (!Args.hasArg(options::OPT_nostartfiles)) { 369249c64fdcf354c7998b8b301402fb6140c24df36aRafael Espindola const char *crtend; 369349c64fdcf354c7998b8b301402fb6140c24df36aRafael Espindola if (Args.hasArg(options::OPT_shared) || Args.hasArg(options::OPT_pie)) 369449c64fdcf354c7998b8b301402fb6140c24df36aRafael Espindola crtend = "crtendS.o"; 369549c64fdcf354c7998b8b301402fb6140c24df36aRafael Espindola else 369649c64fdcf354c7998b8b301402fb6140c24df36aRafael Espindola crtend = "crtend.o"; 369789414b384a0004c698244cc675f49d0669bb3463Rafael Espindola 369849c64fdcf354c7998b8b301402fb6140c24df36aRafael Espindola CmdArgs.push_back(Args.MakeArgString(ToolChain.GetFilePath(crtend))); 369949c64fdcf354c7998b8b301402fb6140c24df36aRafael Espindola CmdArgs.push_back(Args.MakeArgString(ToolChain.GetFilePath("crtn.o"))); 370049c64fdcf354c7998b8b301402fb6140c24df36aRafael Espindola } 370189414b384a0004c698244cc675f49d0669bb3463Rafael Espindola } 3702c1da981bba867681004004b2d54ec2fdf3c08913Rafael Espindola 3703c1da981bba867681004004b2d54ec2fdf3c08913Rafael Espindola if (Args.hasArg(options::OPT_use_gold_plugin)) { 3704c1da981bba867681004004b2d54ec2fdf3c08913Rafael Espindola CmdArgs.push_back("-plugin"); 3705c1da981bba867681004004b2d54ec2fdf3c08913Rafael Espindola std::string Plugin = ToolChain.getDriver().Dir + "/../lib/LLVMgold.so"; 3706c1da981bba867681004004b2d54ec2fdf3c08913Rafael Espindola CmdArgs.push_back(Args.MakeArgString(Plugin)); 3707c1da981bba867681004004b2d54ec2fdf3c08913Rafael Espindola } 3708c1da981bba867681004004b2d54ec2fdf3c08913Rafael Espindola 3709c1da981bba867681004004b2d54ec2fdf3c08913Rafael Espindola C.addCommand(new Command(JA, *this, ToolChain.Linker.c_str(), CmdArgs)); 3710c1da981bba867681004004b2d54ec2fdf3c08913Rafael Espindola} 3711ba30bbe4e36a30a274da809a11a42f9cdc168e92Rafael Espindola 371238e317d6dce161b249508686cc67eb7176958762Chris Lattnervoid minix::Assemble::ConstructJob(Compilation &C, const JobAction &JA, 37132fe238ed293bd4bc27af9beb9fa151fad2146fa8Daniel Dunbar const InputInfo &Output, 37142fe238ed293bd4bc27af9beb9fa151fad2146fa8Daniel Dunbar const InputInfoList &Inputs, 37152fe238ed293bd4bc27af9beb9fa151fad2146fa8Daniel Dunbar const ArgList &Args, 37162fe238ed293bd4bc27af9beb9fa151fad2146fa8Daniel Dunbar const char *LinkingOutput) const { 371738e317d6dce161b249508686cc67eb7176958762Chris Lattner ArgStringList CmdArgs; 371838e317d6dce161b249508686cc67eb7176958762Chris Lattner 371938e317d6dce161b249508686cc67eb7176958762Chris Lattner Args.AddAllArgValues(CmdArgs, options::OPT_Wa_COMMA, 372038e317d6dce161b249508686cc67eb7176958762Chris Lattner options::OPT_Xassembler); 372138e317d6dce161b249508686cc67eb7176958762Chris Lattner 372238e317d6dce161b249508686cc67eb7176958762Chris Lattner CmdArgs.push_back("-o"); 37237c1e46533cae07216e2a67d5636a5afb44253155Daniel Dunbar CmdArgs.push_back(Output.getFilename()); 372438e317d6dce161b249508686cc67eb7176958762Chris Lattner 372538e317d6dce161b249508686cc67eb7176958762Chris Lattner for (InputInfoList::const_iterator 372638e317d6dce161b249508686cc67eb7176958762Chris Lattner it = Inputs.begin(), ie = Inputs.end(); it != ie; ++it) { 372738e317d6dce161b249508686cc67eb7176958762Chris Lattner const InputInfo &II = *it; 37287c1e46533cae07216e2a67d5636a5afb44253155Daniel Dunbar CmdArgs.push_back(II.getFilename()); 372938e317d6dce161b249508686cc67eb7176958762Chris Lattner } 373038e317d6dce161b249508686cc67eb7176958762Chris Lattner 373138e317d6dce161b249508686cc67eb7176958762Chris Lattner const char *Exec = 37324a7e88978cf646ad10d654020cb00b3877069210Daniel Dunbar Args.MakeArgString(getToolChain().GetProgramPath("gas")); 37332fe238ed293bd4bc27af9beb9fa151fad2146fa8Daniel Dunbar C.addCommand(new Command(JA, *this, Exec, CmdArgs)); 373438e317d6dce161b249508686cc67eb7176958762Chris Lattner} 373538e317d6dce161b249508686cc67eb7176958762Chris Lattner 373638e317d6dce161b249508686cc67eb7176958762Chris Lattnervoid minix::Link::ConstructJob(Compilation &C, const JobAction &JA, 37372fe238ed293bd4bc27af9beb9fa151fad2146fa8Daniel Dunbar const InputInfo &Output, 37382fe238ed293bd4bc27af9beb9fa151fad2146fa8Daniel Dunbar const InputInfoList &Inputs, 37392fe238ed293bd4bc27af9beb9fa151fad2146fa8Daniel Dunbar const ArgList &Args, 37402fe238ed293bd4bc27af9beb9fa151fad2146fa8Daniel Dunbar const char *LinkingOutput) const { 374138e317d6dce161b249508686cc67eb7176958762Chris Lattner const Driver &D = getToolChain().getDriver(); 374238e317d6dce161b249508686cc67eb7176958762Chris Lattner ArgStringList CmdArgs; 374338e317d6dce161b249508686cc67eb7176958762Chris Lattner 37447c1e46533cae07216e2a67d5636a5afb44253155Daniel Dunbar if (Output.isFilename()) { 374538e317d6dce161b249508686cc67eb7176958762Chris Lattner CmdArgs.push_back("-o"); 374638e317d6dce161b249508686cc67eb7176958762Chris Lattner CmdArgs.push_back(Output.getFilename()); 374738e317d6dce161b249508686cc67eb7176958762Chris Lattner } else { 374838e317d6dce161b249508686cc67eb7176958762Chris Lattner assert(Output.isNothing() && "Invalid output."); 374938e317d6dce161b249508686cc67eb7176958762Chris Lattner } 375038e317d6dce161b249508686cc67eb7176958762Chris Lattner 375138e317d6dce161b249508686cc67eb7176958762Chris Lattner if (!Args.hasArg(options::OPT_nostdlib) && 375238e317d6dce161b249508686cc67eb7176958762Chris Lattner !Args.hasArg(options::OPT_nostartfiles)) 37534a7e88978cf646ad10d654020cb00b3877069210Daniel Dunbar CmdArgs.push_back(Args.MakeArgString(getToolChain().GetFilePath( 375438e317d6dce161b249508686cc67eb7176958762Chris Lattner "/usr/gnu/lib/crtso.o"))); 375538e317d6dce161b249508686cc67eb7176958762Chris Lattner 375638e317d6dce161b249508686cc67eb7176958762Chris Lattner Args.AddAllArgs(CmdArgs, options::OPT_L); 375738e317d6dce161b249508686cc67eb7176958762Chris Lattner Args.AddAllArgs(CmdArgs, options::OPT_T_Group); 375838e317d6dce161b249508686cc67eb7176958762Chris Lattner Args.AddAllArgs(CmdArgs, options::OPT_e); 375938e317d6dce161b249508686cc67eb7176958762Chris Lattner 37602008feead855f08500fb01ff43ef5eebee05d1e5Daniel Dunbar AddLinkerInputs(getToolChain(), Inputs, Args, CmdArgs); 376138e317d6dce161b249508686cc67eb7176958762Chris Lattner 376238e317d6dce161b249508686cc67eb7176958762Chris Lattner if (!Args.hasArg(options::OPT_nostdlib) && 376338e317d6dce161b249508686cc67eb7176958762Chris Lattner !Args.hasArg(options::OPT_nodefaultlibs)) { 376438e317d6dce161b249508686cc67eb7176958762Chris Lattner if (D.CCCIsCXX) { 3765132e35d2f87895d20e7ea146c8c00404b80221a1Daniel Dunbar getToolChain().AddCXXStdlibLibArgs(Args, CmdArgs); 376638e317d6dce161b249508686cc67eb7176958762Chris Lattner CmdArgs.push_back("-lm"); 376738e317d6dce161b249508686cc67eb7176958762Chris Lattner } 376838e317d6dce161b249508686cc67eb7176958762Chris Lattner 376938e317d6dce161b249508686cc67eb7176958762Chris Lattner if (Args.hasArg(options::OPT_pthread)) 377038e317d6dce161b249508686cc67eb7176958762Chris Lattner CmdArgs.push_back("-lpthread"); 377138e317d6dce161b249508686cc67eb7176958762Chris Lattner CmdArgs.push_back("-lc"); 377238e317d6dce161b249508686cc67eb7176958762Chris Lattner CmdArgs.push_back("-lgcc"); 377338e317d6dce161b249508686cc67eb7176958762Chris Lattner CmdArgs.push_back("-L/usr/gnu/lib"); 377438e317d6dce161b249508686cc67eb7176958762Chris Lattner // FIXME: fill in the correct search path for the final 377538e317d6dce161b249508686cc67eb7176958762Chris Lattner // support libraries. 377638e317d6dce161b249508686cc67eb7176958762Chris Lattner CmdArgs.push_back("-L/usr/gnu/lib/gcc/i686-pc-minix/4.4.3"); 377738e317d6dce161b249508686cc67eb7176958762Chris Lattner } 377838e317d6dce161b249508686cc67eb7176958762Chris Lattner 377938e317d6dce161b249508686cc67eb7176958762Chris Lattner if (!Args.hasArg(options::OPT_nostdlib) && 378038e317d6dce161b249508686cc67eb7176958762Chris Lattner !Args.hasArg(options::OPT_nostartfiles)) { 37814a7e88978cf646ad10d654020cb00b3877069210Daniel Dunbar CmdArgs.push_back(Args.MakeArgString(getToolChain().GetFilePath( 378238e317d6dce161b249508686cc67eb7176958762Chris Lattner "/usr/gnu/lib/libend.a"))); 378338e317d6dce161b249508686cc67eb7176958762Chris Lattner } 378438e317d6dce161b249508686cc67eb7176958762Chris Lattner 378538e317d6dce161b249508686cc67eb7176958762Chris Lattner const char *Exec = 37864a7e88978cf646ad10d654020cb00b3877069210Daniel Dunbar Args.MakeArgString(getToolChain().GetProgramPath("/usr/gnu/bin/gld")); 37872fe238ed293bd4bc27af9beb9fa151fad2146fa8Daniel Dunbar C.addCommand(new Command(JA, *this, Exec, CmdArgs)); 378838e317d6dce161b249508686cc67eb7176958762Chris Lattner} 378938e317d6dce161b249508686cc67eb7176958762Chris Lattner 379011e1b40d759a643086f590f6ffbd9d68360bad46Daniel Dunbar/// DragonFly Tools 379111e1b40d759a643086f590f6ffbd9d68360bad46Daniel Dunbar 379211e1b40d759a643086f590f6ffbd9d68360bad46Daniel Dunbar// For now, DragonFly Assemble does just about the same as for 379311e1b40d759a643086f590f6ffbd9d68360bad46Daniel Dunbar// FreeBSD, but this may change soon. 379411e1b40d759a643086f590f6ffbd9d68360bad46Daniel Dunbarvoid dragonfly::Assemble::ConstructJob(Compilation &C, const JobAction &JA, 37952fe238ed293bd4bc27af9beb9fa151fad2146fa8Daniel Dunbar const InputInfo &Output, 3796294691eb1caf551083acd7b08630ef21c3fd760dDaniel Dunbar const InputInfoList &Inputs, 3797294691eb1caf551083acd7b08630ef21c3fd760dDaniel Dunbar const ArgList &Args, 3798294691eb1caf551083acd7b08630ef21c3fd760dDaniel Dunbar const char *LinkingOutput) const { 379911e1b40d759a643086f590f6ffbd9d68360bad46Daniel Dunbar ArgStringList CmdArgs; 380011e1b40d759a643086f590f6ffbd9d68360bad46Daniel Dunbar 380111e1b40d759a643086f590f6ffbd9d68360bad46Daniel Dunbar // When building 32-bit code on DragonFly/pc64, we have to explicitly 380211e1b40d759a643086f590f6ffbd9d68360bad46Daniel Dunbar // instruct as in the base system to assemble 32-bit code. 380311e1b40d759a643086f590f6ffbd9d68360bad46Daniel Dunbar if (getToolChain().getArchName() == "i386") 380411e1b40d759a643086f590f6ffbd9d68360bad46Daniel Dunbar CmdArgs.push_back("--32"); 380511e1b40d759a643086f590f6ffbd9d68360bad46Daniel Dunbar 380611e1b40d759a643086f590f6ffbd9d68360bad46Daniel Dunbar Args.AddAllArgValues(CmdArgs, options::OPT_Wa_COMMA, 380711e1b40d759a643086f590f6ffbd9d68360bad46Daniel Dunbar options::OPT_Xassembler); 380811e1b40d759a643086f590f6ffbd9d68360bad46Daniel Dunbar 380911e1b40d759a643086f590f6ffbd9d68360bad46Daniel Dunbar CmdArgs.push_back("-o"); 38107c1e46533cae07216e2a67d5636a5afb44253155Daniel Dunbar CmdArgs.push_back(Output.getFilename()); 381111e1b40d759a643086f590f6ffbd9d68360bad46Daniel Dunbar 381211e1b40d759a643086f590f6ffbd9d68360bad46Daniel Dunbar for (InputInfoList::const_iterator 381311e1b40d759a643086f590f6ffbd9d68360bad46Daniel Dunbar it = Inputs.begin(), ie = Inputs.end(); it != ie; ++it) { 381411e1b40d759a643086f590f6ffbd9d68360bad46Daniel Dunbar const InputInfo &II = *it; 38157c1e46533cae07216e2a67d5636a5afb44253155Daniel Dunbar CmdArgs.push_back(II.getFilename()); 381611e1b40d759a643086f590f6ffbd9d68360bad46Daniel Dunbar } 381711e1b40d759a643086f590f6ffbd9d68360bad46Daniel Dunbar 381811e1b40d759a643086f590f6ffbd9d68360bad46Daniel Dunbar const char *Exec = 38194a7e88978cf646ad10d654020cb00b3877069210Daniel Dunbar Args.MakeArgString(getToolChain().GetProgramPath("as")); 38202fe238ed293bd4bc27af9beb9fa151fad2146fa8Daniel Dunbar C.addCommand(new Command(JA, *this, Exec, CmdArgs)); 382111e1b40d759a643086f590f6ffbd9d68360bad46Daniel Dunbar} 382211e1b40d759a643086f590f6ffbd9d68360bad46Daniel Dunbar 382311e1b40d759a643086f590f6ffbd9d68360bad46Daniel Dunbarvoid dragonfly::Link::ConstructJob(Compilation &C, const JobAction &JA, 38242fe238ed293bd4bc27af9beb9fa151fad2146fa8Daniel Dunbar const InputInfo &Output, 38252fe238ed293bd4bc27af9beb9fa151fad2146fa8Daniel Dunbar const InputInfoList &Inputs, 38262fe238ed293bd4bc27af9beb9fa151fad2146fa8Daniel Dunbar const ArgList &Args, 38272fe238ed293bd4bc27af9beb9fa151fad2146fa8Daniel Dunbar const char *LinkingOutput) const { 3828ee788e70fcd0adf76103b17c78ac658d4ea30c9bDaniel Dunbar const Driver &D = getToolChain().getDriver(); 382911e1b40d759a643086f590f6ffbd9d68360bad46Daniel Dunbar ArgStringList CmdArgs; 383011e1b40d759a643086f590f6ffbd9d68360bad46Daniel Dunbar 383111e1b40d759a643086f590f6ffbd9d68360bad46Daniel Dunbar if (Args.hasArg(options::OPT_static)) { 383211e1b40d759a643086f590f6ffbd9d68360bad46Daniel Dunbar CmdArgs.push_back("-Bstatic"); 383311e1b40d759a643086f590f6ffbd9d68360bad46Daniel Dunbar } else { 383411e1b40d759a643086f590f6ffbd9d68360bad46Daniel Dunbar if (Args.hasArg(options::OPT_shared)) 383511e1b40d759a643086f590f6ffbd9d68360bad46Daniel Dunbar CmdArgs.push_back("-Bshareable"); 383611e1b40d759a643086f590f6ffbd9d68360bad46Daniel Dunbar else { 383711e1b40d759a643086f590f6ffbd9d68360bad46Daniel Dunbar CmdArgs.push_back("-dynamic-linker"); 383811e1b40d759a643086f590f6ffbd9d68360bad46Daniel Dunbar CmdArgs.push_back("/usr/libexec/ld-elf.so.2"); 383911e1b40d759a643086f590f6ffbd9d68360bad46Daniel Dunbar } 384011e1b40d759a643086f590f6ffbd9d68360bad46Daniel Dunbar } 384111e1b40d759a643086f590f6ffbd9d68360bad46Daniel Dunbar 384211e1b40d759a643086f590f6ffbd9d68360bad46Daniel Dunbar // When building 32-bit code on DragonFly/pc64, we have to explicitly 384311e1b40d759a643086f590f6ffbd9d68360bad46Daniel Dunbar // instruct ld in the base system to link 32-bit code. 384411e1b40d759a643086f590f6ffbd9d68360bad46Daniel Dunbar if (getToolChain().getArchName() == "i386") { 384511e1b40d759a643086f590f6ffbd9d68360bad46Daniel Dunbar CmdArgs.push_back("-m"); 384611e1b40d759a643086f590f6ffbd9d68360bad46Daniel Dunbar CmdArgs.push_back("elf_i386"); 384711e1b40d759a643086f590f6ffbd9d68360bad46Daniel Dunbar } 384811e1b40d759a643086f590f6ffbd9d68360bad46Daniel Dunbar 38497c1e46533cae07216e2a67d5636a5afb44253155Daniel Dunbar if (Output.isFilename()) { 385011e1b40d759a643086f590f6ffbd9d68360bad46Daniel Dunbar CmdArgs.push_back("-o"); 385111e1b40d759a643086f590f6ffbd9d68360bad46Daniel Dunbar CmdArgs.push_back(Output.getFilename()); 385211e1b40d759a643086f590f6ffbd9d68360bad46Daniel Dunbar } else { 385311e1b40d759a643086f590f6ffbd9d68360bad46Daniel Dunbar assert(Output.isNothing() && "Invalid output."); 385411e1b40d759a643086f590f6ffbd9d68360bad46Daniel Dunbar } 385511e1b40d759a643086f590f6ffbd9d68360bad46Daniel Dunbar 385611e1b40d759a643086f590f6ffbd9d68360bad46Daniel Dunbar if (!Args.hasArg(options::OPT_nostdlib) && 385711e1b40d759a643086f590f6ffbd9d68360bad46Daniel Dunbar !Args.hasArg(options::OPT_nostartfiles)) { 385811e1b40d759a643086f590f6ffbd9d68360bad46Daniel Dunbar if (!Args.hasArg(options::OPT_shared)) { 385938e317d6dce161b249508686cc67eb7176958762Chris Lattner CmdArgs.push_back( 38604a7e88978cf646ad10d654020cb00b3877069210Daniel Dunbar Args.MakeArgString(getToolChain().GetFilePath("crt1.o"))); 386138e317d6dce161b249508686cc67eb7176958762Chris Lattner CmdArgs.push_back( 38624a7e88978cf646ad10d654020cb00b3877069210Daniel Dunbar Args.MakeArgString(getToolChain().GetFilePath("crti.o"))); 386338e317d6dce161b249508686cc67eb7176958762Chris Lattner CmdArgs.push_back( 38644a7e88978cf646ad10d654020cb00b3877069210Daniel Dunbar Args.MakeArgString(getToolChain().GetFilePath("crtbegin.o"))); 386511e1b40d759a643086f590f6ffbd9d68360bad46Daniel Dunbar } else { 386638e317d6dce161b249508686cc67eb7176958762Chris Lattner CmdArgs.push_back( 38674a7e88978cf646ad10d654020cb00b3877069210Daniel Dunbar Args.MakeArgString(getToolChain().GetFilePath("crti.o"))); 386838e317d6dce161b249508686cc67eb7176958762Chris Lattner CmdArgs.push_back( 38694a7e88978cf646ad10d654020cb00b3877069210Daniel Dunbar Args.MakeArgString(getToolChain().GetFilePath("crtbeginS.o"))); 387011e1b40d759a643086f590f6ffbd9d68360bad46Daniel Dunbar } 387111e1b40d759a643086f590f6ffbd9d68360bad46Daniel Dunbar } 387211e1b40d759a643086f590f6ffbd9d68360bad46Daniel Dunbar 387311e1b40d759a643086f590f6ffbd9d68360bad46Daniel Dunbar Args.AddAllArgs(CmdArgs, options::OPT_L); 387411e1b40d759a643086f590f6ffbd9d68360bad46Daniel Dunbar Args.AddAllArgs(CmdArgs, options::OPT_T_Group); 387511e1b40d759a643086f590f6ffbd9d68360bad46Daniel Dunbar Args.AddAllArgs(CmdArgs, options::OPT_e); 387611e1b40d759a643086f590f6ffbd9d68360bad46Daniel Dunbar 38772008feead855f08500fb01ff43ef5eebee05d1e5Daniel Dunbar AddLinkerInputs(getToolChain(), Inputs, Args, CmdArgs); 387811e1b40d759a643086f590f6ffbd9d68360bad46Daniel Dunbar 387911e1b40d759a643086f590f6ffbd9d68360bad46Daniel Dunbar if (!Args.hasArg(options::OPT_nostdlib) && 388011e1b40d759a643086f590f6ffbd9d68360bad46Daniel Dunbar !Args.hasArg(options::OPT_nodefaultlibs)) { 388111e1b40d759a643086f590f6ffbd9d68360bad46Daniel Dunbar // FIXME: GCC passes on -lgcc, -lgcc_pic and a whole lot of 388211e1b40d759a643086f590f6ffbd9d68360bad46Daniel Dunbar // rpaths 388311e1b40d759a643086f590f6ffbd9d68360bad46Daniel Dunbar CmdArgs.push_back("-L/usr/lib/gcc41"); 388411e1b40d759a643086f590f6ffbd9d68360bad46Daniel Dunbar 388511e1b40d759a643086f590f6ffbd9d68360bad46Daniel Dunbar if (!Args.hasArg(options::OPT_static)) { 388611e1b40d759a643086f590f6ffbd9d68360bad46Daniel Dunbar CmdArgs.push_back("-rpath"); 388711e1b40d759a643086f590f6ffbd9d68360bad46Daniel Dunbar CmdArgs.push_back("/usr/lib/gcc41"); 388811e1b40d759a643086f590f6ffbd9d68360bad46Daniel Dunbar 388911e1b40d759a643086f590f6ffbd9d68360bad46Daniel Dunbar CmdArgs.push_back("-rpath-link"); 389011e1b40d759a643086f590f6ffbd9d68360bad46Daniel Dunbar CmdArgs.push_back("/usr/lib/gcc41"); 389111e1b40d759a643086f590f6ffbd9d68360bad46Daniel Dunbar 389211e1b40d759a643086f590f6ffbd9d68360bad46Daniel Dunbar CmdArgs.push_back("-rpath"); 389311e1b40d759a643086f590f6ffbd9d68360bad46Daniel Dunbar CmdArgs.push_back("/usr/lib"); 389411e1b40d759a643086f590f6ffbd9d68360bad46Daniel Dunbar 389511e1b40d759a643086f590f6ffbd9d68360bad46Daniel Dunbar CmdArgs.push_back("-rpath-link"); 389611e1b40d759a643086f590f6ffbd9d68360bad46Daniel Dunbar CmdArgs.push_back("/usr/lib"); 389711e1b40d759a643086f590f6ffbd9d68360bad46Daniel Dunbar } 389811e1b40d759a643086f590f6ffbd9d68360bad46Daniel Dunbar 3899405861d4ae824795f506d03cd7578f011cbf5b87Rafael Espindola if (D.CCCIsCXX) { 3900132e35d2f87895d20e7ea146c8c00404b80221a1Daniel Dunbar getToolChain().AddCXXStdlibLibArgs(Args, CmdArgs); 3901405861d4ae824795f506d03cd7578f011cbf5b87Rafael Espindola CmdArgs.push_back("-lm"); 3902405861d4ae824795f506d03cd7578f011cbf5b87Rafael Espindola } 3903405861d4ae824795f506d03cd7578f011cbf5b87Rafael Espindola 390411e1b40d759a643086f590f6ffbd9d68360bad46Daniel Dunbar if (Args.hasArg(options::OPT_shared)) { 390511e1b40d759a643086f590f6ffbd9d68360bad46Daniel Dunbar CmdArgs.push_back("-lgcc_pic"); 390611e1b40d759a643086f590f6ffbd9d68360bad46Daniel Dunbar } else { 390711e1b40d759a643086f590f6ffbd9d68360bad46Daniel Dunbar CmdArgs.push_back("-lgcc"); 390811e1b40d759a643086f590f6ffbd9d68360bad46Daniel Dunbar } 390911e1b40d759a643086f590f6ffbd9d68360bad46Daniel Dunbar 391011e1b40d759a643086f590f6ffbd9d68360bad46Daniel Dunbar 391111e1b40d759a643086f590f6ffbd9d68360bad46Daniel Dunbar if (Args.hasArg(options::OPT_pthread)) 39124d63f8bc2686d5d7580324407854f2ca7c128832Mike Stump CmdArgs.push_back("-lpthread"); 391311e1b40d759a643086f590f6ffbd9d68360bad46Daniel Dunbar 391411e1b40d759a643086f590f6ffbd9d68360bad46Daniel Dunbar if (!Args.hasArg(options::OPT_nolibc)) { 391511e1b40d759a643086f590f6ffbd9d68360bad46Daniel Dunbar CmdArgs.push_back("-lc"); 391611e1b40d759a643086f590f6ffbd9d68360bad46Daniel Dunbar } 391711e1b40d759a643086f590f6ffbd9d68360bad46Daniel Dunbar 391811e1b40d759a643086f590f6ffbd9d68360bad46Daniel Dunbar if (Args.hasArg(options::OPT_shared)) { 391911e1b40d759a643086f590f6ffbd9d68360bad46Daniel Dunbar CmdArgs.push_back("-lgcc_pic"); 392011e1b40d759a643086f590f6ffbd9d68360bad46Daniel Dunbar } else { 392111e1b40d759a643086f590f6ffbd9d68360bad46Daniel Dunbar CmdArgs.push_back("-lgcc"); 392211e1b40d759a643086f590f6ffbd9d68360bad46Daniel Dunbar } 392311e1b40d759a643086f590f6ffbd9d68360bad46Daniel Dunbar } 392411e1b40d759a643086f590f6ffbd9d68360bad46Daniel Dunbar 392511e1b40d759a643086f590f6ffbd9d68360bad46Daniel Dunbar if (!Args.hasArg(options::OPT_nostdlib) && 392611e1b40d759a643086f590f6ffbd9d68360bad46Daniel Dunbar !Args.hasArg(options::OPT_nostartfiles)) { 392711e1b40d759a643086f590f6ffbd9d68360bad46Daniel Dunbar if (!Args.hasArg(options::OPT_shared)) 392838e317d6dce161b249508686cc67eb7176958762Chris Lattner CmdArgs.push_back(Args.MakeArgString( 39294a7e88978cf646ad10d654020cb00b3877069210Daniel Dunbar getToolChain().GetFilePath("crtend.o"))); 393011e1b40d759a643086f590f6ffbd9d68360bad46Daniel Dunbar else 393138e317d6dce161b249508686cc67eb7176958762Chris Lattner CmdArgs.push_back(Args.MakeArgString( 39324a7e88978cf646ad10d654020cb00b3877069210Daniel Dunbar getToolChain().GetFilePath("crtendS.o"))); 393338e317d6dce161b249508686cc67eb7176958762Chris Lattner CmdArgs.push_back(Args.MakeArgString( 39344a7e88978cf646ad10d654020cb00b3877069210Daniel Dunbar getToolChain().GetFilePath("crtn.o"))); 393511e1b40d759a643086f590f6ffbd9d68360bad46Daniel Dunbar } 393611e1b40d759a643086f590f6ffbd9d68360bad46Daniel Dunbar 393711e1b40d759a643086f590f6ffbd9d68360bad46Daniel Dunbar const char *Exec = 39384a7e88978cf646ad10d654020cb00b3877069210Daniel Dunbar Args.MakeArgString(getToolChain().GetProgramPath("ld")); 39392fe238ed293bd4bc27af9beb9fa151fad2146fa8Daniel Dunbar C.addCommand(new Command(JA, *this, Exec, CmdArgs)); 394011e1b40d759a643086f590f6ffbd9d68360bad46Daniel Dunbar} 3941ff58e3610f4e12094def69eb2d6dcb4330378d8fMichael J. Spencer 3942ff58e3610f4e12094def69eb2d6dcb4330378d8fMichael J. Spencervoid visualstudio::Link::ConstructJob(Compilation &C, const JobAction &JA, 3943ff58e3610f4e12094def69eb2d6dcb4330378d8fMichael J. Spencer const InputInfo &Output, 3944ff58e3610f4e12094def69eb2d6dcb4330378d8fMichael J. Spencer const InputInfoList &Inputs, 3945ff58e3610f4e12094def69eb2d6dcb4330378d8fMichael J. Spencer const ArgList &Args, 3946ff58e3610f4e12094def69eb2d6dcb4330378d8fMichael J. Spencer const char *LinkingOutput) const { 3947ff58e3610f4e12094def69eb2d6dcb4330378d8fMichael J. Spencer ArgStringList CmdArgs; 3948ff58e3610f4e12094def69eb2d6dcb4330378d8fMichael J. Spencer 3949ff58e3610f4e12094def69eb2d6dcb4330378d8fMichael J. Spencer if (Output.isFilename()) { 3950e5a37f48388c7e4cc081f44d13a4910bfa56cd35Daniel Dunbar CmdArgs.push_back(Args.MakeArgString(std::string("-out:") + 3951e5a37f48388c7e4cc081f44d13a4910bfa56cd35Daniel Dunbar Output.getFilename())); 3952ff58e3610f4e12094def69eb2d6dcb4330378d8fMichael J. Spencer } else { 3953ff58e3610f4e12094def69eb2d6dcb4330378d8fMichael J. Spencer assert(Output.isNothing() && "Invalid output."); 3954ff58e3610f4e12094def69eb2d6dcb4330378d8fMichael J. Spencer } 3955ff58e3610f4e12094def69eb2d6dcb4330378d8fMichael J. Spencer 3956ff58e3610f4e12094def69eb2d6dcb4330378d8fMichael J. Spencer if (!Args.hasArg(options::OPT_nostdlib) && 3957ff58e3610f4e12094def69eb2d6dcb4330378d8fMichael J. Spencer !Args.hasArg(options::OPT_nostartfiles)) { 3958ff58e3610f4e12094def69eb2d6dcb4330378d8fMichael J. Spencer CmdArgs.push_back("-defaultlib:libcmt"); 3959ff58e3610f4e12094def69eb2d6dcb4330378d8fMichael J. Spencer } 3960ff58e3610f4e12094def69eb2d6dcb4330378d8fMichael J. Spencer 3961ff58e3610f4e12094def69eb2d6dcb4330378d8fMichael J. Spencer CmdArgs.push_back("-nologo"); 3962ff58e3610f4e12094def69eb2d6dcb4330378d8fMichael J. Spencer 39632008feead855f08500fb01ff43ef5eebee05d1e5Daniel Dunbar AddLinkerInputs(getToolChain(), Inputs, Args, CmdArgs); 3964ff58e3610f4e12094def69eb2d6dcb4330378d8fMichael J. Spencer 3965ff58e3610f4e12094def69eb2d6dcb4330378d8fMichael J. Spencer const char *Exec = 39662008feead855f08500fb01ff43ef5eebee05d1e5Daniel Dunbar Args.MakeArgString(getToolChain().GetProgramPath("link.exe")); 3967ff58e3610f4e12094def69eb2d6dcb4330378d8fMichael J. Spencer C.addCommand(new Command(JA, *this, Exec, CmdArgs)); 3968ff58e3610f4e12094def69eb2d6dcb4330378d8fMichael J. Spencer} 3969