Tools.cpp revision f7efb0e7478da45bc7f2d24dbeb08406d2399591
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" 199f084a3166b684573ba49df28fc5792bc37d92e1John McCall#include "clang/Driver/ObjCRuntime.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" 33f85e193739c953358c865005855253af4f68a497John McCall#include "llvm/Support/ErrorHandling.h" 34871adcf4e41285e3f4c3b62eaa1b2e05b60b92daDaniel Dunbar 35871adcf4e41285e3f4c3b62eaa1b2e05b60b92daDaniel Dunbar#include "InputInfo.h" 3602633b541b04ad5ffc1c70f4c2feeeb13e607057Daniel Dunbar#include "ToolChains.h" 37871adcf4e41285e3f4c3b62eaa1b2e05b60b92daDaniel Dunbar 3847ac7d27c44bd64a7d0fc03d4babc196cf2b8230Daniel Dunbarusing namespace clang::driver; 3947ac7d27c44bd64a7d0fc03d4babc196cf2b8230Daniel Dunbarusing namespace clang::driver::tools; 405f9e272e632e951b1efe824cd16acb4d96077930Chris Lattnerusing namespace clang; 4147ac7d27c44bd64a7d0fc03d4babc196cf2b8230Daniel Dunbar 4288a3d6cf5ebab81614f89ba48a8d89023270637aDaniel Dunbar/// CheckPreprocessingOptions - Perform some validation of preprocessing 4388a3d6cf5ebab81614f89ba48a8d89023270637aDaniel Dunbar/// arguments that is shared with gcc. 4488a3d6cf5ebab81614f89ba48a8d89023270637aDaniel Dunbarstatic void CheckPreprocessingOptions(const Driver &D, const ArgList &Args) { 4588a3d6cf5ebab81614f89ba48a8d89023270637aDaniel Dunbar if (Arg *A = Args.getLastArg(options::OPT_C, options::OPT_CC)) 469ade4ae4fb7ed1fcbd63835d9f8f53052f0657a2Joerg Sonnenberger if (!Args.hasArg(options::OPT_E) && !D.CCCIsCPP) 475f9e272e632e951b1efe824cd16acb4d96077930Chris Lattner D.Diag(diag::err_drv_argument_only_allowed_with) 4888a3d6cf5ebab81614f89ba48a8d89023270637aDaniel Dunbar << A->getAsString(Args) << "-E"; 4988a3d6cf5ebab81614f89ba48a8d89023270637aDaniel Dunbar} 5088a3d6cf5ebab81614f89ba48a8d89023270637aDaniel Dunbar 51e2fd66418eca3d70cf6b62087d745d0c5181db69Daniel Dunbar/// CheckCodeGenerationOptions - Perform some validation of code generation 52e2fd66418eca3d70cf6b62087d745d0c5181db69Daniel Dunbar/// arguments that is shared with gcc. 53e2fd66418eca3d70cf6b62087d745d0c5181db69Daniel Dunbarstatic void CheckCodeGenerationOptions(const Driver &D, const ArgList &Args) { 54e2fd66418eca3d70cf6b62087d745d0c5181db69Daniel Dunbar // In gcc, only ARM checks this, but it seems reasonable to check universally. 55e2fd66418eca3d70cf6b62087d745d0c5181db69Daniel Dunbar if (Args.hasArg(options::OPT_static)) 56e2fd66418eca3d70cf6b62087d745d0c5181db69Daniel Dunbar if (const Arg *A = Args.getLastArg(options::OPT_dynamic, 57e2fd66418eca3d70cf6b62087d745d0c5181db69Daniel Dunbar options::OPT_mdynamic_no_pic)) 585f9e272e632e951b1efe824cd16acb4d96077930Chris Lattner D.Diag(diag::err_drv_argument_not_allowed_with) 59e2fd66418eca3d70cf6b62087d745d0c5181db69Daniel Dunbar << A->getAsString(Args) << "-static"; 60e2fd66418eca3d70cf6b62087d745d0c5181db69Daniel Dunbar} 61e2fd66418eca3d70cf6b62087d745d0c5181db69Daniel Dunbar 623edbeb78fe5ea7fffea7a94575478cde19e830e0Chris Lattner// Quote target names for inclusion in GNU Make dependency files. 633edbeb78fe5ea7fffea7a94575478cde19e830e0Chris Lattner// Only the characters '$', '#', ' ', '\t' are quoted. 645f9e272e632e951b1efe824cd16acb4d96077930Chris Lattnerstatic void QuoteTarget(StringRef Target, 655f9e272e632e951b1efe824cd16acb4d96077930Chris Lattner SmallVectorImpl<char> &Res) { 663edbeb78fe5ea7fffea7a94575478cde19e830e0Chris Lattner for (unsigned i = 0, e = Target.size(); i != e; ++i) { 673edbeb78fe5ea7fffea7a94575478cde19e830e0Chris Lattner switch (Target[i]) { 683edbeb78fe5ea7fffea7a94575478cde19e830e0Chris Lattner case ' ': 693edbeb78fe5ea7fffea7a94575478cde19e830e0Chris Lattner case '\t': 703edbeb78fe5ea7fffea7a94575478cde19e830e0Chris Lattner // Escape the preceding backslashes 713edbeb78fe5ea7fffea7a94575478cde19e830e0Chris Lattner for (int j = i - 1; j >= 0 && Target[j] == '\\'; --j) 723edbeb78fe5ea7fffea7a94575478cde19e830e0Chris Lattner Res.push_back('\\'); 733edbeb78fe5ea7fffea7a94575478cde19e830e0Chris Lattner 743edbeb78fe5ea7fffea7a94575478cde19e830e0Chris Lattner // Escape the space/tab 753edbeb78fe5ea7fffea7a94575478cde19e830e0Chris Lattner Res.push_back('\\'); 763edbeb78fe5ea7fffea7a94575478cde19e830e0Chris Lattner break; 773edbeb78fe5ea7fffea7a94575478cde19e830e0Chris Lattner case '$': 783edbeb78fe5ea7fffea7a94575478cde19e830e0Chris Lattner Res.push_back('$'); 793edbeb78fe5ea7fffea7a94575478cde19e830e0Chris Lattner break; 803edbeb78fe5ea7fffea7a94575478cde19e830e0Chris Lattner case '#': 813edbeb78fe5ea7fffea7a94575478cde19e830e0Chris Lattner Res.push_back('\\'); 823edbeb78fe5ea7fffea7a94575478cde19e830e0Chris Lattner break; 833edbeb78fe5ea7fffea7a94575478cde19e830e0Chris Lattner default: 843edbeb78fe5ea7fffea7a94575478cde19e830e0Chris Lattner break; 853edbeb78fe5ea7fffea7a94575478cde19e830e0Chris Lattner } 863edbeb78fe5ea7fffea7a94575478cde19e830e0Chris Lattner 873edbeb78fe5ea7fffea7a94575478cde19e830e0Chris Lattner Res.push_back(Target[i]); 883edbeb78fe5ea7fffea7a94575478cde19e830e0Chris Lattner } 893edbeb78fe5ea7fffea7a94575478cde19e830e0Chris Lattner} 903edbeb78fe5ea7fffea7a94575478cde19e830e0Chris Lattner 913d7171582b026e043916fc5d65a7d7aada547206Bill Wendlingstatic void addDirectoryList(const ArgList &Args, 92bdb8f3ce95e3e5c43497292fd05764faa6ad46b1Bill Wendling ArgStringList &CmdArgs, 93bdb8f3ce95e3e5c43497292fd05764faa6ad46b1Bill Wendling const char *ArgName, 943d7171582b026e043916fc5d65a7d7aada547206Bill Wendling const char *EnvVar) { 953d7171582b026e043916fc5d65a7d7aada547206Bill Wendling const char *DirList = ::getenv(EnvVar); 96bdb8f3ce95e3e5c43497292fd05764faa6ad46b1Bill Wendling if (!DirList) 97bdb8f3ce95e3e5c43497292fd05764faa6ad46b1Bill Wendling return; // Nothing to do. 98bdb8f3ce95e3e5c43497292fd05764faa6ad46b1Bill Wendling 99bdb8f3ce95e3e5c43497292fd05764faa6ad46b1Bill Wendling StringRef Dirs(DirList); 100bdb8f3ce95e3e5c43497292fd05764faa6ad46b1Bill Wendling if (Dirs.empty()) // Empty string should not add '.'. 101bdb8f3ce95e3e5c43497292fd05764faa6ad46b1Bill Wendling return; 102bdb8f3ce95e3e5c43497292fd05764faa6ad46b1Bill Wendling 103bdb8f3ce95e3e5c43497292fd05764faa6ad46b1Bill Wendling StringRef::size_type Delim; 104bdb8f3ce95e3e5c43497292fd05764faa6ad46b1Bill Wendling while ((Delim = Dirs.find(llvm::sys::PathSeparator)) != StringRef::npos) { 105bdb8f3ce95e3e5c43497292fd05764faa6ad46b1Bill Wendling if (Delim == 0) { // Leading colon. 106bdb8f3ce95e3e5c43497292fd05764faa6ad46b1Bill Wendling CmdArgs.push_back(ArgName); 107bdb8f3ce95e3e5c43497292fd05764faa6ad46b1Bill Wendling CmdArgs.push_back("."); 108bdb8f3ce95e3e5c43497292fd05764faa6ad46b1Bill Wendling } else { 109bdb8f3ce95e3e5c43497292fd05764faa6ad46b1Bill Wendling CmdArgs.push_back(ArgName); 11009c5c39590caa92aa7ce660607a070ea275f5ad7Nico Weber CmdArgs.push_back(Args.MakeArgString(Dirs.substr(0, Delim))); 111bdb8f3ce95e3e5c43497292fd05764faa6ad46b1Bill Wendling } 11209c5c39590caa92aa7ce660607a070ea275f5ad7Nico Weber Dirs = Dirs.substr(Delim + 1); 113bdb8f3ce95e3e5c43497292fd05764faa6ad46b1Bill Wendling } 114bdb8f3ce95e3e5c43497292fd05764faa6ad46b1Bill Wendling 115bdb8f3ce95e3e5c43497292fd05764faa6ad46b1Bill Wendling if (Dirs.empty()) { // Trailing colon. 116bdb8f3ce95e3e5c43497292fd05764faa6ad46b1Bill Wendling CmdArgs.push_back(ArgName); 117bdb8f3ce95e3e5c43497292fd05764faa6ad46b1Bill Wendling CmdArgs.push_back("."); 118bdb8f3ce95e3e5c43497292fd05764faa6ad46b1Bill Wendling } else { // Add the last path. 119bdb8f3ce95e3e5c43497292fd05764faa6ad46b1Bill Wendling CmdArgs.push_back(ArgName); 120bdb8f3ce95e3e5c43497292fd05764faa6ad46b1Bill Wendling CmdArgs.push_back(Args.MakeArgString(Dirs)); 121bdb8f3ce95e3e5c43497292fd05764faa6ad46b1Bill Wendling } 122bdb8f3ce95e3e5c43497292fd05764faa6ad46b1Bill Wendling} 123bdb8f3ce95e3e5c43497292fd05764faa6ad46b1Bill Wendling 1242008feead855f08500fb01ff43ef5eebee05d1e5Daniel Dunbarstatic void AddLinkerInputs(const ToolChain &TC, 1252008feead855f08500fb01ff43ef5eebee05d1e5Daniel Dunbar const InputInfoList &Inputs, const ArgList &Args, 1262008feead855f08500fb01ff43ef5eebee05d1e5Daniel Dunbar ArgStringList &CmdArgs) { 1272008feead855f08500fb01ff43ef5eebee05d1e5Daniel Dunbar const Driver &D = TC.getDriver(); 1282008feead855f08500fb01ff43ef5eebee05d1e5Daniel Dunbar 1298ac38d7b5d88d12f454a7cda1275bf429813151dDaniel Dunbar // Add extra linker input arguments which are not treated as inputs 1308ac38d7b5d88d12f454a7cda1275bf429813151dDaniel Dunbar // (constructed via -Xarch_). 1318ac38d7b5d88d12f454a7cda1275bf429813151dDaniel Dunbar Args.AddAllArgValues(CmdArgs, options::OPT_Zlinker_input); 1328ac38d7b5d88d12f454a7cda1275bf429813151dDaniel Dunbar 1332008feead855f08500fb01ff43ef5eebee05d1e5Daniel Dunbar for (InputInfoList::const_iterator 1342008feead855f08500fb01ff43ef5eebee05d1e5Daniel Dunbar it = Inputs.begin(), ie = Inputs.end(); it != ie; ++it) { 1352008feead855f08500fb01ff43ef5eebee05d1e5Daniel Dunbar const InputInfo &II = *it; 1362008feead855f08500fb01ff43ef5eebee05d1e5Daniel Dunbar 1372008feead855f08500fb01ff43ef5eebee05d1e5Daniel Dunbar if (!TC.HasNativeLLVMSupport()) { 1382008feead855f08500fb01ff43ef5eebee05d1e5Daniel Dunbar // Don't try to pass LLVM inputs unless we have native support. 1392008feead855f08500fb01ff43ef5eebee05d1e5Daniel Dunbar if (II.getType() == types::TY_LLVM_IR || 1402008feead855f08500fb01ff43ef5eebee05d1e5Daniel Dunbar II.getType() == types::TY_LTO_IR || 1412008feead855f08500fb01ff43ef5eebee05d1e5Daniel Dunbar II.getType() == types::TY_LLVM_BC || 1422008feead855f08500fb01ff43ef5eebee05d1e5Daniel Dunbar II.getType() == types::TY_LTO_BC) 1435f9e272e632e951b1efe824cd16acb4d96077930Chris Lattner D.Diag(diag::err_drv_no_linker_llvm_support) 1442008feead855f08500fb01ff43ef5eebee05d1e5Daniel Dunbar << TC.getTripleString(); 1452008feead855f08500fb01ff43ef5eebee05d1e5Daniel Dunbar } 1462008feead855f08500fb01ff43ef5eebee05d1e5Daniel Dunbar 147e5a37f48388c7e4cc081f44d13a4910bfa56cd35Daniel Dunbar // Add filenames immediately. 148e5a37f48388c7e4cc081f44d13a4910bfa56cd35Daniel Dunbar if (II.isFilename()) { 1492008feead855f08500fb01ff43ef5eebee05d1e5Daniel Dunbar CmdArgs.push_back(II.getFilename()); 150e5a37f48388c7e4cc081f44d13a4910bfa56cd35Daniel Dunbar continue; 151e5a37f48388c7e4cc081f44d13a4910bfa56cd35Daniel Dunbar } 152e5a37f48388c7e4cc081f44d13a4910bfa56cd35Daniel Dunbar 153e5a37f48388c7e4cc081f44d13a4910bfa56cd35Daniel Dunbar // Otherwise, this is a linker input argument. 154e5a37f48388c7e4cc081f44d13a4910bfa56cd35Daniel Dunbar const Arg &A = II.getInputArg(); 155e5a37f48388c7e4cc081f44d13a4910bfa56cd35Daniel Dunbar 156e5a37f48388c7e4cc081f44d13a4910bfa56cd35Daniel Dunbar // Handle reserved library options. 157e5a37f48388c7e4cc081f44d13a4910bfa56cd35Daniel Dunbar if (A.getOption().matches(options::OPT_Z_reserved_lib_stdcxx)) { 158132e35d2f87895d20e7ea146c8c00404b80221a1Daniel Dunbar TC.AddCXXStdlibLibArgs(Args, CmdArgs); 1597433fedce98a58341d0f30c2e12e8d53f3bba575Shantonu Sen } else if (A.getOption().matches(options::OPT_Z_reserved_lib_cckext)) { 1607433fedce98a58341d0f30c2e12e8d53f3bba575Shantonu Sen TC.AddCCKextLibArgs(Args, CmdArgs); 161e5a37f48388c7e4cc081f44d13a4910bfa56cd35Daniel Dunbar } else 162e5a37f48388c7e4cc081f44d13a4910bfa56cd35Daniel Dunbar A.renderAsInput(Args, CmdArgs); 1632008feead855f08500fb01ff43ef5eebee05d1e5Daniel Dunbar } 164bdb8f3ce95e3e5c43497292fd05764faa6ad46b1Bill Wendling 165bdb8f3ce95e3e5c43497292fd05764faa6ad46b1Bill Wendling // LIBRARY_PATH - included following the user specified library paths. 1663d7171582b026e043916fc5d65a7d7aada547206Bill Wendling addDirectoryList(Args, CmdArgs, "-L", "LIBRARY_PATH"); 1672008feead855f08500fb01ff43ef5eebee05d1e5Daniel Dunbar} 1682008feead855f08500fb01ff43ef5eebee05d1e5Daniel Dunbar 169f85e193739c953358c865005855253af4f68a497John McCall/// \brief Determine whether Objective-C automated reference counting is 170f85e193739c953358c865005855253af4f68a497John McCall/// enabled. 171f85e193739c953358c865005855253af4f68a497John McCallstatic bool isObjCAutoRefCount(const ArgList &Args) { 172f85e193739c953358c865005855253af4f68a497John McCall return Args.hasFlag(options::OPT_fobjc_arc, options::OPT_fno_objc_arc, false); 173f85e193739c953358c865005855253af4f68a497John McCall} 174f85e193739c953358c865005855253af4f68a497John McCall 175ebcb57a8d298862c65043e88b2429591ab3c58d3Ted Kremenek/// \brief Determine whether we are linking the ObjC runtime. 176ebcb57a8d298862c65043e88b2429591ab3c58d3Ted Kremenekstatic bool isObjCRuntimeLinked(const ArgList &Args) { 177ebcb57a8d298862c65043e88b2429591ab3c58d3Ted Kremenek if (isObjCAutoRefCount(Args)) 178ebcb57a8d298862c65043e88b2429591ab3c58d3Ted Kremenek return true; 179ebcb57a8d298862c65043e88b2429591ab3c58d3Ted Kremenek return Args.hasArg(options::OPT_fobjc_link_runtime); 180ebcb57a8d298862c65043e88b2429591ab3c58d3Ted Kremenek} 181ebcb57a8d298862c65043e88b2429591ab3c58d3Ted Kremenek 182db3f24ac0dafad175e9daef1b8733600194f56e0Rafael Espindolastatic void addProfileRT(const ToolChain &TC, const ArgList &Args, 1833f4be6fb8872942f567166ab8d99c89885f26103Bill Wendling ArgStringList &CmdArgs, 1843f4be6fb8872942f567166ab8d99c89885f26103Bill Wendling llvm::Triple Triple) { 1853f4be6fb8872942f567166ab8d99c89885f26103Bill Wendling if (!(Args.hasArg(options::OPT_fprofile_arcs) || 1863f4be6fb8872942f567166ab8d99c89885f26103Bill Wendling Args.hasArg(options::OPT_fprofile_generate) || 1873f4be6fb8872942f567166ab8d99c89885f26103Bill Wendling Args.hasArg(options::OPT_fcreate_profile) || 1883f4be6fb8872942f567166ab8d99c89885f26103Bill Wendling Args.hasArg(options::OPT_coverage))) 1893f4be6fb8872942f567166ab8d99c89885f26103Bill Wendling return; 1903f4be6fb8872942f567166ab8d99c89885f26103Bill Wendling 1913f4be6fb8872942f567166ab8d99c89885f26103Bill Wendling // GCC links libgcov.a by adding -L<inst>/gcc/lib/gcc/<triple>/<ver> -lgcov to 1923f4be6fb8872942f567166ab8d99c89885f26103Bill Wendling // the link line. We cannot do the same thing because unlike gcov there is a 1933f4be6fb8872942f567166ab8d99c89885f26103Bill Wendling // libprofile_rt.so. We used to use the -l:libprofile_rt.a syntax, but that is 1943f4be6fb8872942f567166ab8d99c89885f26103Bill Wendling // not supported by old linkers. 195f2db04c49429a6d53069b813d42999fa36ddd9a4Benjamin Kramer std::string ProfileRT = 196f2db04c49429a6d53069b813d42999fa36ddd9a4Benjamin Kramer std::string(TC.getDriver().Dir) + "/../lib/libprofile_rt.a"; 1973f4be6fb8872942f567166ab8d99c89885f26103Bill Wendling 1983f4be6fb8872942f567166ab8d99c89885f26103Bill Wendling CmdArgs.push_back(Args.MakeArgString(ProfileRT)); 199db3f24ac0dafad175e9daef1b8733600194f56e0Rafael Espindola} 200db3f24ac0dafad175e9daef1b8733600194f56e0Rafael Espindola 20154db68bf0e389b8aabe1a434f825a81a9c1f7db8Peter Collingbournevoid Clang::AddPreprocessingOptions(Compilation &C, 20254db68bf0e389b8aabe1a434f825a81a9c1f7db8Peter Collingbourne const Driver &D, 203df91ef3d6c55692a0236f67b6c6b134a3bf84098Douglas Gregor const ArgList &Args, 204c21c485b4fb58ef5d55cf3e523263dd824a2ace4Daniel Dunbar ArgStringList &CmdArgs, 205c21c485b4fb58ef5d55cf3e523263dd824a2ace4Daniel Dunbar const InputInfo &Output, 206c21c485b4fb58ef5d55cf3e523263dd824a2ace4Daniel Dunbar const InputInfoList &Inputs) const { 207c21c485b4fb58ef5d55cf3e523263dd824a2ace4Daniel Dunbar Arg *A; 2083a183d3d46426d8719031553131b8928f50aa606Daniel Dunbar 20988a3d6cf5ebab81614f89ba48a8d89023270637aDaniel Dunbar CheckPreprocessingOptions(D, Args); 21088a3d6cf5ebab81614f89ba48a8d89023270637aDaniel Dunbar 21188a3d6cf5ebab81614f89ba48a8d89023270637aDaniel Dunbar Args.AddLastArg(CmdArgs, options::OPT_C); 21288a3d6cf5ebab81614f89ba48a8d89023270637aDaniel Dunbar Args.AddLastArg(CmdArgs, options::OPT_CC); 2133a183d3d46426d8719031553131b8928f50aa606Daniel Dunbar 2143a183d3d46426d8719031553131b8928f50aa606Daniel Dunbar // Handle dependency file generation. 2159eb93b07ea913e7ad0bcd15bd3e3662e2760c323Daniel Dunbar if ((A = Args.getLastArg(options::OPT_M, options::OPT_MM)) || 216c21c485b4fb58ef5d55cf3e523263dd824a2ace4Daniel Dunbar (A = Args.getLastArg(options::OPT_MD)) || 217c21c485b4fb58ef5d55cf3e523263dd824a2ace4Daniel Dunbar (A = Args.getLastArg(options::OPT_MMD))) { 218c21c485b4fb58ef5d55cf3e523263dd824a2ace4Daniel Dunbar // Determine the output location. 219c21c485b4fb58ef5d55cf3e523263dd824a2ace4Daniel Dunbar const char *DepFile; 220c21c485b4fb58ef5d55cf3e523263dd824a2ace4Daniel Dunbar if (Output.getType() == types::TY_Dependencies) { 2217c1e46533cae07216e2a67d5636a5afb44253155Daniel Dunbar DepFile = Output.getFilename(); 222c21c485b4fb58ef5d55cf3e523263dd824a2ace4Daniel Dunbar } else if (Arg *MF = Args.getLastArg(options::OPT_MF)) { 223c21c485b4fb58ef5d55cf3e523263dd824a2ace4Daniel Dunbar DepFile = MF->getValue(Args); 2245d4d9807a65291cbe6ab88d4a4f74cb7fff01bdePeter Collingbourne C.addFailureResultFile(DepFile); 225b827a0541b5fd095fcdb7ad0c3df93ca158c619aDaniel Dunbar } else if (A->getOption().matches(options::OPT_M) || 226b827a0541b5fd095fcdb7ad0c3df93ca158c619aDaniel Dunbar A->getOption().matches(options::OPT_MM)) { 227c21c485b4fb58ef5d55cf3e523263dd824a2ace4Daniel Dunbar DepFile = "-"; 228c21c485b4fb58ef5d55cf3e523263dd824a2ace4Daniel Dunbar } else { 229c21c485b4fb58ef5d55cf3e523263dd824a2ace4Daniel Dunbar DepFile = darwin::CC1::getDependencyFileName(Args, Inputs); 2305d4d9807a65291cbe6ab88d4a4f74cb7fff01bdePeter Collingbourne C.addFailureResultFile(DepFile); 231c21c485b4fb58ef5d55cf3e523263dd824a2ace4Daniel Dunbar } 232c21c485b4fb58ef5d55cf3e523263dd824a2ace4Daniel Dunbar CmdArgs.push_back("-dependency-file"); 233c21c485b4fb58ef5d55cf3e523263dd824a2ace4Daniel Dunbar CmdArgs.push_back(DepFile); 234c21c485b4fb58ef5d55cf3e523263dd824a2ace4Daniel Dunbar 2353edbeb78fe5ea7fffea7a94575478cde19e830e0Chris Lattner // Add a default target if one wasn't specified. 236c21c485b4fb58ef5d55cf3e523263dd824a2ace4Daniel Dunbar if (!Args.hasArg(options::OPT_MT) && !Args.hasArg(options::OPT_MQ)) { 237c21c485b4fb58ef5d55cf3e523263dd824a2ace4Daniel Dunbar const char *DepTarget; 238c21c485b4fb58ef5d55cf3e523263dd824a2ace4Daniel Dunbar 239c21c485b4fb58ef5d55cf3e523263dd824a2ace4Daniel Dunbar // If user provided -o, that is the dependency target, except 240c21c485b4fb58ef5d55cf3e523263dd824a2ace4Daniel Dunbar // when we are only generating a dependency file. 241c21c485b4fb58ef5d55cf3e523263dd824a2ace4Daniel Dunbar Arg *OutputOpt = Args.getLastArg(options::OPT_o); 242c21c485b4fb58ef5d55cf3e523263dd824a2ace4Daniel Dunbar if (OutputOpt && Output.getType() != types::TY_Dependencies) { 243c21c485b4fb58ef5d55cf3e523263dd824a2ace4Daniel Dunbar DepTarget = OutputOpt->getValue(Args); 244c21c485b4fb58ef5d55cf3e523263dd824a2ace4Daniel Dunbar } else { 245c21c485b4fb58ef5d55cf3e523263dd824a2ace4Daniel Dunbar // Otherwise derive from the base input. 246c21c485b4fb58ef5d55cf3e523263dd824a2ace4Daniel Dunbar // 247c21c485b4fb58ef5d55cf3e523263dd824a2ace4Daniel Dunbar // FIXME: This should use the computed output file location. 248f7ccbad5d9949e7ddd1cbef43d482553b811e026Dylan Noblesmith SmallString<128> P(Inputs[0].getBaseInput()); 249472ccff00cdbcd095c3ba933b9e3f202719f118fMichael J. Spencer llvm::sys::path::replace_extension(P, "o"); 250472ccff00cdbcd095c3ba933b9e3f202719f118fMichael J. Spencer DepTarget = Args.MakeArgString(llvm::sys::path::filename(P)); 251c21c485b4fb58ef5d55cf3e523263dd824a2ace4Daniel Dunbar } 252c21c485b4fb58ef5d55cf3e523263dd824a2ace4Daniel Dunbar 253c21c485b4fb58ef5d55cf3e523263dd824a2ace4Daniel Dunbar CmdArgs.push_back("-MT"); 254f7ccbad5d9949e7ddd1cbef43d482553b811e026Dylan Noblesmith SmallString<128> Quoted; 2553edbeb78fe5ea7fffea7a94575478cde19e830e0Chris Lattner QuoteTarget(DepTarget, Quoted); 2563edbeb78fe5ea7fffea7a94575478cde19e830e0Chris Lattner CmdArgs.push_back(Args.MakeArgString(Quoted)); 257c21c485b4fb58ef5d55cf3e523263dd824a2ace4Daniel Dunbar } 258c21c485b4fb58ef5d55cf3e523263dd824a2ace4Daniel Dunbar 259b827a0541b5fd095fcdb7ad0c3df93ca158c619aDaniel Dunbar if (A->getOption().matches(options::OPT_M) || 260b827a0541b5fd095fcdb7ad0c3df93ca158c619aDaniel Dunbar A->getOption().matches(options::OPT_MD)) 261c21c485b4fb58ef5d55cf3e523263dd824a2ace4Daniel Dunbar CmdArgs.push_back("-sys-header-deps"); 262c21c485b4fb58ef5d55cf3e523263dd824a2ace4Daniel Dunbar } 263c21c485b4fb58ef5d55cf3e523263dd824a2ace4Daniel Dunbar 264bb52786da8d055568eef6e5694288c1258bc8c2aPeter Collingbourne if (Args.hasArg(options::OPT_MG)) { 265bb52786da8d055568eef6e5694288c1258bc8c2aPeter Collingbourne if (!A || A->getOption().matches(options::OPT_MD) || 266bb52786da8d055568eef6e5694288c1258bc8c2aPeter Collingbourne A->getOption().matches(options::OPT_MMD)) 2675f9e272e632e951b1efe824cd16acb4d96077930Chris Lattner D.Diag(diag::err_drv_mg_requires_m_or_mm); 268bb52786da8d055568eef6e5694288c1258bc8c2aPeter Collingbourne CmdArgs.push_back("-MG"); 269bb52786da8d055568eef6e5694288c1258bc8c2aPeter Collingbourne } 270bb52786da8d055568eef6e5694288c1258bc8c2aPeter Collingbourne 271c21c485b4fb58ef5d55cf3e523263dd824a2ace4Daniel Dunbar Args.AddLastArg(CmdArgs, options::OPT_MP); 2723edbeb78fe5ea7fffea7a94575478cde19e830e0Chris Lattner 2733edbeb78fe5ea7fffea7a94575478cde19e830e0Chris Lattner // Convert all -MQ <target> args to -MT <quoted target> 2743edbeb78fe5ea7fffea7a94575478cde19e830e0Chris Lattner for (arg_iterator it = Args.filtered_begin(options::OPT_MT, 2753edbeb78fe5ea7fffea7a94575478cde19e830e0Chris Lattner options::OPT_MQ), 2763edbeb78fe5ea7fffea7a94575478cde19e830e0Chris Lattner ie = Args.filtered_end(); it != ie; ++it) { 2777e4953e5c60409007545288f14b430bd23d68570Daniel Dunbar const Arg *A = *it; 2787e4953e5c60409007545288f14b430bd23d68570Daniel Dunbar A->claim(); 2793edbeb78fe5ea7fffea7a94575478cde19e830e0Chris Lattner 2807e4953e5c60409007545288f14b430bd23d68570Daniel Dunbar if (A->getOption().matches(options::OPT_MQ)) { 2813edbeb78fe5ea7fffea7a94575478cde19e830e0Chris Lattner CmdArgs.push_back("-MT"); 282f7ccbad5d9949e7ddd1cbef43d482553b811e026Dylan Noblesmith SmallString<128> Quoted; 2837e4953e5c60409007545288f14b430bd23d68570Daniel Dunbar QuoteTarget(A->getValue(Args), Quoted); 2843edbeb78fe5ea7fffea7a94575478cde19e830e0Chris Lattner CmdArgs.push_back(Args.MakeArgString(Quoted)); 2853edbeb78fe5ea7fffea7a94575478cde19e830e0Chris Lattner 2863edbeb78fe5ea7fffea7a94575478cde19e830e0Chris Lattner // -MT flag - no change 2873edbeb78fe5ea7fffea7a94575478cde19e830e0Chris Lattner } else { 2887e4953e5c60409007545288f14b430bd23d68570Daniel Dunbar A->render(Args, CmdArgs); 2893edbeb78fe5ea7fffea7a94575478cde19e830e0Chris Lattner } 2903edbeb78fe5ea7fffea7a94575478cde19e830e0Chris Lattner } 291c21c485b4fb58ef5d55cf3e523263dd824a2ace4Daniel Dunbar 292df91ef3d6c55692a0236f67b6c6b134a3bf84098Douglas Gregor // Add -i* options, and automatically translate to 293df91ef3d6c55692a0236f67b6c6b134a3bf84098Douglas Gregor // -include-pch/-include-pth for transparent PCH support. It's 294df91ef3d6c55692a0236f67b6c6b134a3bf84098Douglas Gregor // wonky, but we include looking for .gch so we can support seamless 295df91ef3d6c55692a0236f67b6c6b134a3bf84098Douglas Gregor // replacement into a build system already set up to be generating 296df91ef3d6c55692a0236f67b6c6b134a3bf84098Douglas Gregor // .gch files. 297990142a23e41392ef7c0f14db4c0fcac67311cdfArgyrios Kyrtzidis bool RenderedImplicitInclude = false; 298cdd9686b890ebdc10039ae256ef4c9dfb5ebacb7Daniel Dunbar for (arg_iterator it = Args.filtered_begin(options::OPT_clang_i_Group), 299cdd9686b890ebdc10039ae256ef4c9dfb5ebacb7Daniel Dunbar ie = Args.filtered_end(); it != ie; ++it) { 300cdd9686b890ebdc10039ae256ef4c9dfb5ebacb7Daniel Dunbar const Arg *A = it; 301c21c485b4fb58ef5d55cf3e523263dd824a2ace4Daniel Dunbar 302c21c485b4fb58ef5d55cf3e523263dd824a2ace4Daniel Dunbar if (A->getOption().matches(options::OPT_include)) { 303990142a23e41392ef7c0f14db4c0fcac67311cdfArgyrios Kyrtzidis bool IsFirstImplicitInclude = !RenderedImplicitInclude; 304990142a23e41392ef7c0f14db4c0fcac67311cdfArgyrios Kyrtzidis RenderedImplicitInclude = true; 305990142a23e41392ef7c0f14db4c0fcac67311cdfArgyrios Kyrtzidis 306e5c35377020d6c38d16434c9f373a5fa9bb4f2ebArgyrios Kyrtzidis // Use PCH if the user requested it. 3070ebd9321ba380471010341f24c874f46f56e7581Daniel Dunbar bool UsePCH = D.CCCUsePCH; 3080ebd9321ba380471010341f24c874f46f56e7581Daniel Dunbar 309c21c485b4fb58ef5d55cf3e523263dd824a2ace4Daniel Dunbar bool FoundPTH = false; 310df91ef3d6c55692a0236f67b6c6b134a3bf84098Douglas Gregor bool FoundPCH = false; 311c21c485b4fb58ef5d55cf3e523263dd824a2ace4Daniel Dunbar llvm::sys::Path P(A->getValue(Args)); 31232bef4edba854303800b3b01cb49a282e5da4f69Michael J. Spencer bool Exists; 3130ebd9321ba380471010341f24c874f46f56e7581Daniel Dunbar if (UsePCH) { 314df91ef3d6c55692a0236f67b6c6b134a3bf84098Douglas Gregor P.appendSuffix("pch"); 31532bef4edba854303800b3b01cb49a282e5da4f69Michael J. Spencer if (!llvm::sys::fs::exists(P.str(), Exists) && Exists) 316df91ef3d6c55692a0236f67b6c6b134a3bf84098Douglas Gregor FoundPCH = true; 3171eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump else 318df91ef3d6c55692a0236f67b6c6b134a3bf84098Douglas Gregor P.eraseSuffix(); 319df91ef3d6c55692a0236f67b6c6b134a3bf84098Douglas Gregor } 320df91ef3d6c55692a0236f67b6c6b134a3bf84098Douglas Gregor 321df91ef3d6c55692a0236f67b6c6b134a3bf84098Douglas Gregor if (!FoundPCH) { 322df91ef3d6c55692a0236f67b6c6b134a3bf84098Douglas Gregor P.appendSuffix("pth"); 32332bef4edba854303800b3b01cb49a282e5da4f69Michael J. Spencer if (!llvm::sys::fs::exists(P.str(), Exists) && Exists) 324c21c485b4fb58ef5d55cf3e523263dd824a2ace4Daniel Dunbar FoundPTH = true; 325df91ef3d6c55692a0236f67b6c6b134a3bf84098Douglas Gregor else 326df91ef3d6c55692a0236f67b6c6b134a3bf84098Douglas Gregor P.eraseSuffix(); 3271eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump } 3281eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump 329df91ef3d6c55692a0236f67b6c6b134a3bf84098Douglas Gregor if (!FoundPCH && !FoundPTH) { 330df91ef3d6c55692a0236f67b6c6b134a3bf84098Douglas Gregor P.appendSuffix("gch"); 33132bef4edba854303800b3b01cb49a282e5da4f69Michael J. Spencer if (!llvm::sys::fs::exists(P.str(), Exists) && Exists) { 3320ebd9321ba380471010341f24c874f46f56e7581Daniel Dunbar FoundPCH = UsePCH; 3330ebd9321ba380471010341f24c874f46f56e7581Daniel Dunbar FoundPTH = !UsePCH; 334df91ef3d6c55692a0236f67b6c6b134a3bf84098Douglas Gregor } 3351eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump else 336df91ef3d6c55692a0236f67b6c6b134a3bf84098Douglas Gregor P.eraseSuffix(); 337c21c485b4fb58ef5d55cf3e523263dd824a2ace4Daniel Dunbar } 338c21c485b4fb58ef5d55cf3e523263dd824a2ace4Daniel Dunbar 339df91ef3d6c55692a0236f67b6c6b134a3bf84098Douglas Gregor if (FoundPCH || FoundPTH) { 340990142a23e41392ef7c0f14db4c0fcac67311cdfArgyrios Kyrtzidis if (IsFirstImplicitInclude) { 341990142a23e41392ef7c0f14db4c0fcac67311cdfArgyrios Kyrtzidis A->claim(); 342990142a23e41392ef7c0f14db4c0fcac67311cdfArgyrios Kyrtzidis if (UsePCH) 343990142a23e41392ef7c0f14db4c0fcac67311cdfArgyrios Kyrtzidis CmdArgs.push_back("-include-pch"); 344990142a23e41392ef7c0f14db4c0fcac67311cdfArgyrios Kyrtzidis else 345990142a23e41392ef7c0f14db4c0fcac67311cdfArgyrios Kyrtzidis CmdArgs.push_back("-include-pth"); 346990142a23e41392ef7c0f14db4c0fcac67311cdfArgyrios Kyrtzidis CmdArgs.push_back(Args.MakeArgString(P.str())); 347990142a23e41392ef7c0f14db4c0fcac67311cdfArgyrios Kyrtzidis continue; 348990142a23e41392ef7c0f14db4c0fcac67311cdfArgyrios Kyrtzidis } else { 349990142a23e41392ef7c0f14db4c0fcac67311cdfArgyrios Kyrtzidis // Ignore the PCH if not first on command line and emit warning. 3505f9e272e632e951b1efe824cd16acb4d96077930Chris Lattner D.Diag(diag::warn_drv_pch_not_first_include) 351990142a23e41392ef7c0f14db4c0fcac67311cdfArgyrios Kyrtzidis << P.str() << A->getAsString(Args); 352990142a23e41392ef7c0f14db4c0fcac67311cdfArgyrios Kyrtzidis } 353c21c485b4fb58ef5d55cf3e523263dd824a2ace4Daniel Dunbar } 354c21c485b4fb58ef5d55cf3e523263dd824a2ace4Daniel Dunbar } 355c21c485b4fb58ef5d55cf3e523263dd824a2ace4Daniel Dunbar 356c21c485b4fb58ef5d55cf3e523263dd824a2ace4Daniel Dunbar // Not translated, render as usual. 357c21c485b4fb58ef5d55cf3e523263dd824a2ace4Daniel Dunbar A->claim(); 358c21c485b4fb58ef5d55cf3e523263dd824a2ace4Daniel Dunbar A->render(Args, CmdArgs); 359c21c485b4fb58ef5d55cf3e523263dd824a2ace4Daniel Dunbar } 360c21c485b4fb58ef5d55cf3e523263dd824a2ace4Daniel Dunbar 361c21c485b4fb58ef5d55cf3e523263dd824a2ace4Daniel Dunbar Args.AddAllArgs(CmdArgs, options::OPT_D, options::OPT_U); 36265e02fa80e1c185f18e5f81cefc30d75383a7301Douglas Gregor Args.AddAllArgs(CmdArgs, options::OPT_I_Group, options::OPT_F, 36365e02fa80e1c185f18e5f81cefc30d75383a7301Douglas Gregor options::OPT_index_header_map); 364c21c485b4fb58ef5d55cf3e523263dd824a2ace4Daniel Dunbar 365c21c485b4fb58ef5d55cf3e523263dd824a2ace4Daniel Dunbar // Add -Wp, and -Xassembler if using the preprocessor. 366c21c485b4fb58ef5d55cf3e523263dd824a2ace4Daniel Dunbar 367c21c485b4fb58ef5d55cf3e523263dd824a2ace4Daniel Dunbar // FIXME: There is a very unfortunate problem here, some troubled 368c21c485b4fb58ef5d55cf3e523263dd824a2ace4Daniel Dunbar // souls abuse -Wp, to pass preprocessor options in gcc syntax. To 369c21c485b4fb58ef5d55cf3e523263dd824a2ace4Daniel Dunbar // really support that we would have to parse and then translate 370c21c485b4fb58ef5d55cf3e523263dd824a2ace4Daniel Dunbar // those options. :( 371c21c485b4fb58ef5d55cf3e523263dd824a2ace4Daniel Dunbar Args.AddAllArgValues(CmdArgs, options::OPT_Wp_COMMA, 372c21c485b4fb58ef5d55cf3e523263dd824a2ace4Daniel Dunbar options::OPT_Xpreprocessor); 373607d7f6d8f21066cc48bbe2c51e6ca412a00943fDaniel Dunbar 374607d7f6d8f21066cc48bbe2c51e6ca412a00943fDaniel Dunbar // -I- is a deprecated GCC feature, reject it. 375607d7f6d8f21066cc48bbe2c51e6ca412a00943fDaniel Dunbar if (Arg *A = Args.getLastArg(options::OPT_I_)) 3765f9e272e632e951b1efe824cd16acb4d96077930Chris Lattner D.Diag(diag::err_drv_I_dash_not_supported) << A->getAsString(Args); 377feee58ce268765742e41c473c8648607fd4831a7Chandler Carruth 378feee58ce268765742e41c473c8648607fd4831a7Chandler Carruth // If we have a --sysroot, and don't have an explicit -isysroot flag, add an 379feee58ce268765742e41c473c8648607fd4831a7Chandler Carruth // -isysroot to the CC1 invocation. 3804762a2da74875d2ae94e0d77d38ed964816cce36Sebastian Pop StringRef sysroot = C.getSysRoot(); 3814762a2da74875d2ae94e0d77d38ed964816cce36Sebastian Pop if (sysroot != "") { 382feee58ce268765742e41c473c8648607fd4831a7Chandler Carruth if (!Args.hasArg(options::OPT_isysroot)) { 383feee58ce268765742e41c473c8648607fd4831a7Chandler Carruth CmdArgs.push_back("-isysroot"); 3844762a2da74875d2ae94e0d77d38ed964816cce36Sebastian Pop CmdArgs.push_back(C.getArgs().MakeArgString(sysroot)); 385feee58ce268765742e41c473c8648607fd4831a7Chandler Carruth } 386feee58ce268765742e41c473c8648607fd4831a7Chandler Carruth } 3878ee51ef211bfed9ce04bc93835e19aee014f2faeDouglas Gregor 3888ee51ef211bfed9ce04bc93835e19aee014f2faeDouglas Gregor // If a module path was provided, pass it along. Otherwise, use a temporary 3898ee51ef211bfed9ce04bc93835e19aee014f2faeDouglas Gregor // directory. 3908ee51ef211bfed9ce04bc93835e19aee014f2faeDouglas Gregor if (Arg *A = Args.getLastArg(options::OPT_fmodule_cache_path)) { 3918ee51ef211bfed9ce04bc93835e19aee014f2faeDouglas Gregor A->claim(); 3928ee51ef211bfed9ce04bc93835e19aee014f2faeDouglas Gregor A->render(Args, CmdArgs); 3938ee51ef211bfed9ce04bc93835e19aee014f2faeDouglas Gregor } else { 394f7ccbad5d9949e7ddd1cbef43d482553b811e026Dylan Noblesmith SmallString<128> DefaultModuleCache; 3958ee51ef211bfed9ce04bc93835e19aee014f2faeDouglas Gregor llvm::sys::path::system_temp_directory(/*erasedOnReboot=*/false, 3968ee51ef211bfed9ce04bc93835e19aee014f2faeDouglas Gregor DefaultModuleCache); 3978ee51ef211bfed9ce04bc93835e19aee014f2faeDouglas Gregor llvm::sys::path::append(DefaultModuleCache, "clang-module-cache"); 3988ee51ef211bfed9ce04bc93835e19aee014f2faeDouglas Gregor CmdArgs.push_back("-fmodule-cache-path"); 3998ee51ef211bfed9ce04bc93835e19aee014f2faeDouglas Gregor CmdArgs.push_back(Args.MakeArgString(DefaultModuleCache)); 4008ee51ef211bfed9ce04bc93835e19aee014f2faeDouglas Gregor } 401fba18aa8f2cd1994dc65e8cb9f4be201c560dc0bDouglas Gregor 40247adebef0df6dce752fe9a45e9190e8005b5d07cBenjamin Kramer // Parse additional include paths from environment variables. 403b5870e77a9a872e2a84e904a332bb60bbe207da9Chandler Carruth // FIXME: We should probably sink the logic for handling these from the 404b5870e77a9a872e2a84e904a332bb60bbe207da9Chandler Carruth // frontend into the driver. It will allow deleting 4 otherwise unused flags. 40547adebef0df6dce752fe9a45e9190e8005b5d07cBenjamin Kramer // CPATH - included following the user specified includes (but prior to 40647adebef0df6dce752fe9a45e9190e8005b5d07cBenjamin Kramer // builtin and standard includes). 4073d7171582b026e043916fc5d65a7d7aada547206Bill Wendling addDirectoryList(Args, CmdArgs, "-I", "CPATH"); 40847adebef0df6dce752fe9a45e9190e8005b5d07cBenjamin Kramer // C_INCLUDE_PATH - system includes enabled when compiling C. 4093d7171582b026e043916fc5d65a7d7aada547206Bill Wendling addDirectoryList(Args, CmdArgs, "-c-isystem", "C_INCLUDE_PATH"); 41047adebef0df6dce752fe9a45e9190e8005b5d07cBenjamin Kramer // CPLUS_INCLUDE_PATH - system includes enabled when compiling C++. 4113d7171582b026e043916fc5d65a7d7aada547206Bill Wendling addDirectoryList(Args, CmdArgs, "-cxx-isystem", "CPLUS_INCLUDE_PATH"); 41247adebef0df6dce752fe9a45e9190e8005b5d07cBenjamin Kramer // OBJC_INCLUDE_PATH - system includes enabled when compiling ObjC. 4133d7171582b026e043916fc5d65a7d7aada547206Bill Wendling addDirectoryList(Args, CmdArgs, "-objc-isystem", "OBJC_INCLUDE_PATH"); 41447adebef0df6dce752fe9a45e9190e8005b5d07cBenjamin Kramer // OBJCPLUS_INCLUDE_PATH - system includes enabled when compiling ObjC++. 4153d7171582b026e043916fc5d65a7d7aada547206Bill Wendling addDirectoryList(Args, CmdArgs, "-objcxx-isystem", "OBJCPLUS_INCLUDE_PATH"); 41688491fc6dfc7ebbd856d57a9acb49fb83077d6c8Chandler Carruth 41788491fc6dfc7ebbd856d57a9acb49fb83077d6c8Chandler Carruth // Add C++ include arguments, if needed. 418a461442ed99883d2760833592f65e1e95a4889bbChandler Carruth if (types::isCXX(Inputs[0].getType())) 4197ffa0325bd61f656697f99434334d425c39af309Chandler Carruth getToolChain().AddClangCXXStdlibIncludeArgs(Args, CmdArgs); 4207d7e9f963a4977e36efb90fd9c369f33ced1a95aChandler Carruth 4217d7e9f963a4977e36efb90fd9c369f33ced1a95aChandler Carruth // Add system include arguments. 4227d7e9f963a4977e36efb90fd9c369f33ced1a95aChandler Carruth getToolChain().AddClangSystemIncludeArgs(Args, CmdArgs); 423c21c485b4fb58ef5d55cf3e523263dd824a2ace4Daniel Dunbar} 424c21c485b4fb58ef5d55cf3e523263dd824a2ace4Daniel Dunbar 425fc8f0e14ad142ed811e90fbd9a30e419e301c717Chris Lattner/// getARMTargetCPU - Get the (LLVM) name of the ARM cpu we are targeting. 426728a512753d85a6ccaae34e81385c8665c2de0e1Daniel Dunbar// 427728a512753d85a6ccaae34e81385c8665c2de0e1Daniel Dunbar// FIXME: tblgen this. 428bcd6df662471e0ac2d3d85fdba09b1295c2fc468Rafael Espindolastatic const char *getARMTargetCPU(const ArgList &Args, 429bcd6df662471e0ac2d3d85fdba09b1295c2fc468Rafael Espindola const llvm::Triple &Triple) { 430728a512753d85a6ccaae34e81385c8665c2de0e1Daniel Dunbar // FIXME: Warn on inconsistent use of -mcpu and -march. 431b163ef7e7a5d904ef0962a7c38c460be083c4d63Daniel Dunbar 432b163ef7e7a5d904ef0962a7c38c460be083c4d63Daniel Dunbar // If we have -mcpu=, use that. 433b163ef7e7a5d904ef0962a7c38c460be083c4d63Daniel Dunbar if (Arg *A = Args.getLastArg(options::OPT_mcpu_EQ)) 434b163ef7e7a5d904ef0962a7c38c460be083c4d63Daniel Dunbar return A->getValue(Args); 435b163ef7e7a5d904ef0962a7c38c460be083c4d63Daniel Dunbar 4365f9e272e632e951b1efe824cd16acb4d96077930Chris Lattner StringRef MArch; 437b163ef7e7a5d904ef0962a7c38c460be083c4d63Daniel Dunbar if (Arg *A = Args.getLastArg(options::OPT_march_EQ)) { 438bcd6df662471e0ac2d3d85fdba09b1295c2fc468Rafael Espindola // Otherwise, if we have -march= choose the base CPU for that arch. 439bcd6df662471e0ac2d3d85fdba09b1295c2fc468Rafael Espindola MArch = A->getValue(Args); 440bcd6df662471e0ac2d3d85fdba09b1295c2fc468Rafael Espindola } else { 441bcd6df662471e0ac2d3d85fdba09b1295c2fc468Rafael Espindola // Otherwise, use the Arch from the triple. 442bcd6df662471e0ac2d3d85fdba09b1295c2fc468Rafael Espindola MArch = Triple.getArchName(); 443b163ef7e7a5d904ef0962a7c38c460be083c4d63Daniel Dunbar } 444b163ef7e7a5d904ef0962a7c38c460be083c4d63Daniel Dunbar 445ae1aee6683d486d1c92e51b2a5da6ba75f633308Chad Rosier return llvm::StringSwitch<const char *>(MArch) 446ae1aee6683d486d1c92e51b2a5da6ba75f633308Chad Rosier .Cases("armv2", "armv2a","arm2") 447ae1aee6683d486d1c92e51b2a5da6ba75f633308Chad Rosier .Case("armv3", "arm6") 448ae1aee6683d486d1c92e51b2a5da6ba75f633308Chad Rosier .Case("armv3m", "arm7m") 449ae1aee6683d486d1c92e51b2a5da6ba75f633308Chad Rosier .Cases("armv4", "armv4t", "arm7tdmi") 450ae1aee6683d486d1c92e51b2a5da6ba75f633308Chad Rosier .Cases("armv5", "armv5t", "arm10tdmi") 4514add84f83f4505304ab3f94ebfa6bbc0be60058dEvgeniy Stepanov .Cases("armv5e", "armv5te", "arm1022e") 452ae1aee6683d486d1c92e51b2a5da6ba75f633308Chad Rosier .Case("armv5tej", "arm926ej-s") 453ae1aee6683d486d1c92e51b2a5da6ba75f633308Chad Rosier .Cases("armv6", "armv6k", "arm1136jf-s") 454ae1aee6683d486d1c92e51b2a5da6ba75f633308Chad Rosier .Case("armv6j", "arm1136j-s") 455ae1aee6683d486d1c92e51b2a5da6ba75f633308Chad Rosier .Cases("armv6z", "armv6zk", "arm1176jzf-s") 456ae1aee6683d486d1c92e51b2a5da6ba75f633308Chad Rosier .Case("armv6t2", "arm1156t2-s") 457ae1aee6683d486d1c92e51b2a5da6ba75f633308Chad Rosier .Cases("armv7", "armv7a", "armv7-a", "cortex-a8") 458ae1aee6683d486d1c92e51b2a5da6ba75f633308Chad Rosier .Cases("armv7r", "armv7-r", "cortex-r4") 459ae1aee6683d486d1c92e51b2a5da6ba75f633308Chad Rosier .Cases("armv7m", "armv7-m", "cortex-m3") 460ae1aee6683d486d1c92e51b2a5da6ba75f633308Chad Rosier .Case("ep9312", "ep9312") 461ae1aee6683d486d1c92e51b2a5da6ba75f633308Chad Rosier .Case("iwmmxt", "iwmmxt") 462ae1aee6683d486d1c92e51b2a5da6ba75f633308Chad Rosier .Case("xscale", "xscale") 463ae1aee6683d486d1c92e51b2a5da6ba75f633308Chad Rosier .Cases("armv6m", "armv6-m", "cortex-m0") 464ae1aee6683d486d1c92e51b2a5da6ba75f633308Chad Rosier // If all else failed, return the most base CPU LLVM supports. 465ae1aee6683d486d1c92e51b2a5da6ba75f633308Chad Rosier .Default("arm7tdmi"); 466b163ef7e7a5d904ef0962a7c38c460be083c4d63Daniel Dunbar} 467b163ef7e7a5d904ef0962a7c38c460be083c4d63Daniel Dunbar 4681d65e4be6f22f7e4b4974efbaef92fa3454f1ec8Daniel Dunbar/// getLLVMArchSuffixForARM - Get the LLVM arch name to use for a particular 469728a512753d85a6ccaae34e81385c8665c2de0e1Daniel Dunbar/// CPU. 470728a512753d85a6ccaae34e81385c8665c2de0e1Daniel Dunbar// 471728a512753d85a6ccaae34e81385c8665c2de0e1Daniel Dunbar// FIXME: This is redundant with -mcpu, why does LLVM use this. 472728a512753d85a6ccaae34e81385c8665c2de0e1Daniel Dunbar// FIXME: tblgen this, or kill it! 4735f9e272e632e951b1efe824cd16acb4d96077930Chris Lattnerstatic const char *getLLVMArchSuffixForARM(StringRef CPU) { 474ae1aee6683d486d1c92e51b2a5da6ba75f633308Chad Rosier return llvm::StringSwitch<const char *>(CPU) 475ae1aee6683d486d1c92e51b2a5da6ba75f633308Chad Rosier .Cases("arm7tdmi", "arm7tdmi-s", "arm710t", "v4t") 476ae1aee6683d486d1c92e51b2a5da6ba75f633308Chad Rosier .Cases("arm720t", "arm9", "arm9tdmi", "v4t") 477ae1aee6683d486d1c92e51b2a5da6ba75f633308Chad Rosier .Cases("arm920", "arm920t", "arm922t", "v4t") 478ae1aee6683d486d1c92e51b2a5da6ba75f633308Chad Rosier .Cases("arm940t", "ep9312","v4t") 479ae1aee6683d486d1c92e51b2a5da6ba75f633308Chad Rosier .Cases("arm10tdmi", "arm1020t", "v5") 480ae1aee6683d486d1c92e51b2a5da6ba75f633308Chad Rosier .Cases("arm9e", "arm926ej-s", "arm946e-s", "v5e") 481ae1aee6683d486d1c92e51b2a5da6ba75f633308Chad Rosier .Cases("arm966e-s", "arm968e-s", "arm10e", "v5e") 482ae1aee6683d486d1c92e51b2a5da6ba75f633308Chad Rosier .Cases("arm1020e", "arm1022e", "xscale", "iwmmxt", "v5e") 483ae1aee6683d486d1c92e51b2a5da6ba75f633308Chad Rosier .Cases("arm1136j-s", "arm1136jf-s", "arm1176jz-s", "v6") 484ae1aee6683d486d1c92e51b2a5da6ba75f633308Chad Rosier .Cases("arm1176jzf-s", "mpcorenovfp", "mpcore", "v6") 485ae1aee6683d486d1c92e51b2a5da6ba75f633308Chad Rosier .Cases("arm1156t2-s", "arm1156t2f-s", "v6t2") 486ae1aee6683d486d1c92e51b2a5da6ba75f633308Chad Rosier .Cases("cortex-a8", "cortex-a9", "v7") 48757f6d1946b1026eb4d0bbc1904b2833b254d4caaBob Wilson .Case("cortex-m3", "v7m") 4886903313102c4e1ca598305850cc209b62711b1b6Jim Grosbach .Case("cortex-m4", "v7m") 48957f6d1946b1026eb4d0bbc1904b2833b254d4caaBob Wilson .Case("cortex-m0", "v6m") 490ae1aee6683d486d1c92e51b2a5da6ba75f633308Chad Rosier .Default(""); 491728a512753d85a6ccaae34e81385c8665c2de0e1Daniel Dunbar} 492728a512753d85a6ccaae34e81385c8665c2de0e1Daniel Dunbar 4931f95e6567faab67f4363d650f73121359c4bdbabDaniel Dunbar// FIXME: Move to target hook. 4941f95e6567faab67f4363d650f73121359c4bdbabDaniel Dunbarstatic bool isSignedCharDefault(const llvm::Triple &Triple) { 4951f95e6567faab67f4363d650f73121359c4bdbabDaniel Dunbar switch (Triple.getArch()) { 4961f95e6567faab67f4363d650f73121359c4bdbabDaniel Dunbar default: 4971f95e6567faab67f4363d650f73121359c4bdbabDaniel Dunbar return true; 4981f95e6567faab67f4363d650f73121359c4bdbabDaniel Dunbar 4995b4e7b11e745329d8a55fd56504450dede1b2100Jim Grosbach case llvm::Triple::arm: 5001f95e6567faab67f4363d650f73121359c4bdbabDaniel Dunbar case llvm::Triple::ppc: 5011f95e6567faab67f4363d650f73121359c4bdbabDaniel Dunbar case llvm::Triple::ppc64: 502905c45f15a25598620d19160c139c6b785aeea89Bob Wilson if (Triple.isOSDarwin()) 5031f95e6567faab67f4363d650f73121359c4bdbabDaniel Dunbar return true; 5041f95e6567faab67f4363d650f73121359c4bdbabDaniel Dunbar return false; 5051f95e6567faab67f4363d650f73121359c4bdbabDaniel Dunbar } 5061f95e6567faab67f4363d650f73121359c4bdbabDaniel Dunbar} 5071f95e6567faab67f4363d650f73121359c4bdbabDaniel Dunbar 508993172757762436d22b2dfc74e7cca1bade1a7bfChad Rosier// Handle -mfpu=. 509993172757762436d22b2dfc74e7cca1bade1a7bfChad Rosier// 510993172757762436d22b2dfc74e7cca1bade1a7bfChad Rosier// FIXME: Centralize feature selection, defaulting shouldn't be also in the 511993172757762436d22b2dfc74e7cca1bade1a7bfChad Rosier// frontend target. 512993172757762436d22b2dfc74e7cca1bade1a7bfChad Rosierstatic void addFPUArgs(const Driver &D, const Arg *A, const ArgList &Args, 513993172757762436d22b2dfc74e7cca1bade1a7bfChad Rosier ArgStringList &CmdArgs) { 514993172757762436d22b2dfc74e7cca1bade1a7bfChad Rosier StringRef FPU = A->getValue(Args); 515993172757762436d22b2dfc74e7cca1bade1a7bfChad Rosier 516993172757762436d22b2dfc74e7cca1bade1a7bfChad Rosier // Set the target features based on the FPU. 517993172757762436d22b2dfc74e7cca1bade1a7bfChad Rosier if (FPU == "fpa" || FPU == "fpe2" || FPU == "fpe3" || FPU == "maverick") { 518993172757762436d22b2dfc74e7cca1bade1a7bfChad Rosier // Disable any default FPU support. 519993172757762436d22b2dfc74e7cca1bade1a7bfChad Rosier CmdArgs.push_back("-target-feature"); 520993172757762436d22b2dfc74e7cca1bade1a7bfChad Rosier CmdArgs.push_back("-vfp2"); 521993172757762436d22b2dfc74e7cca1bade1a7bfChad Rosier CmdArgs.push_back("-target-feature"); 522993172757762436d22b2dfc74e7cca1bade1a7bfChad Rosier CmdArgs.push_back("-vfp3"); 523993172757762436d22b2dfc74e7cca1bade1a7bfChad Rosier CmdArgs.push_back("-target-feature"); 524993172757762436d22b2dfc74e7cca1bade1a7bfChad Rosier CmdArgs.push_back("-neon"); 525993172757762436d22b2dfc74e7cca1bade1a7bfChad Rosier } else if (FPU == "vfp3-d16" || FPU == "vfpv3-d16") { 526993172757762436d22b2dfc74e7cca1bade1a7bfChad Rosier CmdArgs.push_back("-target-feature"); 527993172757762436d22b2dfc74e7cca1bade1a7bfChad Rosier CmdArgs.push_back("+vfp3"); 528993172757762436d22b2dfc74e7cca1bade1a7bfChad Rosier CmdArgs.push_back("-target-feature"); 529993172757762436d22b2dfc74e7cca1bade1a7bfChad Rosier CmdArgs.push_back("+d16"); 530993172757762436d22b2dfc74e7cca1bade1a7bfChad Rosier CmdArgs.push_back("-target-feature"); 531993172757762436d22b2dfc74e7cca1bade1a7bfChad Rosier CmdArgs.push_back("-neon"); 532993172757762436d22b2dfc74e7cca1bade1a7bfChad Rosier } else if (FPU == "vfp") { 533993172757762436d22b2dfc74e7cca1bade1a7bfChad Rosier CmdArgs.push_back("-target-feature"); 534993172757762436d22b2dfc74e7cca1bade1a7bfChad Rosier CmdArgs.push_back("+vfp2"); 535993172757762436d22b2dfc74e7cca1bade1a7bfChad Rosier CmdArgs.push_back("-target-feature"); 536993172757762436d22b2dfc74e7cca1bade1a7bfChad Rosier CmdArgs.push_back("-neon"); 537993172757762436d22b2dfc74e7cca1bade1a7bfChad Rosier } else if (FPU == "vfp3" || FPU == "vfpv3") { 538993172757762436d22b2dfc74e7cca1bade1a7bfChad Rosier CmdArgs.push_back("-target-feature"); 539993172757762436d22b2dfc74e7cca1bade1a7bfChad Rosier CmdArgs.push_back("+vfp3"); 540993172757762436d22b2dfc74e7cca1bade1a7bfChad Rosier CmdArgs.push_back("-target-feature"); 541993172757762436d22b2dfc74e7cca1bade1a7bfChad Rosier CmdArgs.push_back("-neon"); 542993172757762436d22b2dfc74e7cca1bade1a7bfChad Rosier } else if (FPU == "neon") { 543993172757762436d22b2dfc74e7cca1bade1a7bfChad Rosier CmdArgs.push_back("-target-feature"); 544993172757762436d22b2dfc74e7cca1bade1a7bfChad Rosier CmdArgs.push_back("+neon"); 545993172757762436d22b2dfc74e7cca1bade1a7bfChad Rosier } else 546993172757762436d22b2dfc74e7cca1bade1a7bfChad Rosier D.Diag(diag::err_drv_clang_unsupported) << A->getAsString(Args); 547993172757762436d22b2dfc74e7cca1bade1a7bfChad Rosier} 548993172757762436d22b2dfc74e7cca1bade1a7bfChad Rosier 5497a938fa66be42710b034a79106de337a275fd265Chad Rosier// Handle -mfpmath=. 5507a938fa66be42710b034a79106de337a275fd265Chad Rosierstatic void addFPMathArgs(const Driver &D, const Arg *A, const ArgList &Args, 55130fe6baf95662ea82a794a8fe3b76998713c183dChad Rosier ArgStringList &CmdArgs, StringRef CPU) { 5527a938fa66be42710b034a79106de337a275fd265Chad Rosier StringRef FPMath = A->getValue(Args); 5537a938fa66be42710b034a79106de337a275fd265Chad Rosier 5547a938fa66be42710b034a79106de337a275fd265Chad Rosier // Set the target features based on the FPMath. 5557a938fa66be42710b034a79106de337a275fd265Chad Rosier if (FPMath == "neon") { 5567a938fa66be42710b034a79106de337a275fd265Chad Rosier CmdArgs.push_back("-target-feature"); 5577a938fa66be42710b034a79106de337a275fd265Chad Rosier CmdArgs.push_back("+neonfp"); 55830fe6baf95662ea82a794a8fe3b76998713c183dChad Rosier 55930fe6baf95662ea82a794a8fe3b76998713c183dChad Rosier if (CPU != "cortex-a8" && CPU != "cortex-a9" && CPU != "cortex-a9-mp") 56030fe6baf95662ea82a794a8fe3b76998713c183dChad Rosier D.Diag(diag::err_drv_invalid_feature) << "-mfpmath=neon" << CPU; 56130fe6baf95662ea82a794a8fe3b76998713c183dChad Rosier 5627a938fa66be42710b034a79106de337a275fd265Chad Rosier } else if (FPMath == "vfp" || FPMath == "vfp2" || FPMath == "vfp3" || 5637a938fa66be42710b034a79106de337a275fd265Chad Rosier FPMath == "vfp4") { 5647a938fa66be42710b034a79106de337a275fd265Chad Rosier CmdArgs.push_back("-target-feature"); 5657a938fa66be42710b034a79106de337a275fd265Chad Rosier CmdArgs.push_back("-neonfp"); 56630fe6baf95662ea82a794a8fe3b76998713c183dChad Rosier 56730fe6baf95662ea82a794a8fe3b76998713c183dChad Rosier // FIXME: Add warnings when disabling a feature not present for a given CPU. 5687a938fa66be42710b034a79106de337a275fd265Chad Rosier } else 5697a938fa66be42710b034a79106de337a275fd265Chad Rosier D.Diag(diag::err_drv_clang_unsupported) << A->getAsString(Args); 5707a938fa66be42710b034a79106de337a275fd265Chad Rosier} 5717a938fa66be42710b034a79106de337a275fd265Chad Rosier 572e2571793ba6fc13e5525b8d7224812f99842a1a4Anton Korobeynikov// Select the float ABI as determined by -msoft-float, -mhard-float, and 573e2571793ba6fc13e5525b8d7224812f99842a1a4Anton Korobeynikov// -mfloat-abi=. 574e2571793ba6fc13e5525b8d7224812f99842a1a4Anton Korobeynikovstatic StringRef getARMFloatABI(const Driver &D, 575e2571793ba6fc13e5525b8d7224812f99842a1a4Anton Korobeynikov const ArgList &Args, 576e2571793ba6fc13e5525b8d7224812f99842a1a4Anton Korobeynikov const llvm::Triple &Triple) { 5775f9e272e632e951b1efe824cd16acb4d96077930Chris Lattner StringRef FloatABI; 578cbd1933f83e2332b2d7add10459f80cc4e7eb7bfDaniel Dunbar if (Arg *A = Args.getLastArg(options::OPT_msoft_float, 579cbd1933f83e2332b2d7add10459f80cc4e7eb7bfDaniel Dunbar options::OPT_mhard_float, 580cbd1933f83e2332b2d7add10459f80cc4e7eb7bfDaniel Dunbar options::OPT_mfloat_abi_EQ)) { 581cbd1933f83e2332b2d7add10459f80cc4e7eb7bfDaniel Dunbar if (A->getOption().matches(options::OPT_msoft_float)) 582cbd1933f83e2332b2d7add10459f80cc4e7eb7bfDaniel Dunbar FloatABI = "soft"; 583cbd1933f83e2332b2d7add10459f80cc4e7eb7bfDaniel Dunbar else if (A->getOption().matches(options::OPT_mhard_float)) 584cbd1933f83e2332b2d7add10459f80cc4e7eb7bfDaniel Dunbar FloatABI = "hard"; 585cbd1933f83e2332b2d7add10459f80cc4e7eb7bfDaniel Dunbar else { 586cbd1933f83e2332b2d7add10459f80cc4e7eb7bfDaniel Dunbar FloatABI = A->getValue(Args); 587cbd1933f83e2332b2d7add10459f80cc4e7eb7bfDaniel Dunbar if (FloatABI != "soft" && FloatABI != "softfp" && FloatABI != "hard") { 5885f9e272e632e951b1efe824cd16acb4d96077930Chris Lattner D.Diag(diag::err_drv_invalid_mfloat_abi) 589cbd1933f83e2332b2d7add10459f80cc4e7eb7bfDaniel Dunbar << A->getAsString(Args); 590cbd1933f83e2332b2d7add10459f80cc4e7eb7bfDaniel Dunbar FloatABI = "soft"; 591cbd1933f83e2332b2d7add10459f80cc4e7eb7bfDaniel Dunbar } 592cbd1933f83e2332b2d7add10459f80cc4e7eb7bfDaniel Dunbar } 593cbd1933f83e2332b2d7add10459f80cc4e7eb7bfDaniel Dunbar } 594cbd1933f83e2332b2d7add10459f80cc4e7eb7bfDaniel Dunbar 595cbd1933f83e2332b2d7add10459f80cc4e7eb7bfDaniel Dunbar // If unspecified, choose the default based on the platform. 596cbd1933f83e2332b2d7add10459f80cc4e7eb7bfDaniel Dunbar if (FloatABI.empty()) { 597bcd6df662471e0ac2d3d85fdba09b1295c2fc468Rafael Espindola switch (Triple.getOS()) { 598905c45f15a25598620d19160c139c6b785aeea89Bob Wilson case llvm::Triple::Darwin: 599905c45f15a25598620d19160c139c6b785aeea89Bob Wilson case llvm::Triple::MacOSX: 600905c45f15a25598620d19160c139c6b785aeea89Bob Wilson case llvm::Triple::IOS: { 601cbd1933f83e2332b2d7add10459f80cc4e7eb7bfDaniel Dunbar // Darwin defaults to "softfp" for v6 and v7. 602cbd1933f83e2332b2d7add10459f80cc4e7eb7bfDaniel Dunbar // 603cbd1933f83e2332b2d7add10459f80cc4e7eb7bfDaniel Dunbar // FIXME: Factor out an ARM class so we can cache the arch somewhere. 6045f9e272e632e951b1efe824cd16acb4d96077930Chris Lattner StringRef ArchName = 605bcd6df662471e0ac2d3d85fdba09b1295c2fc468Rafael Espindola getLLVMArchSuffixForARM(getARMTargetCPU(Args, Triple)); 606cbd1933f83e2332b2d7add10459f80cc4e7eb7bfDaniel Dunbar if (ArchName.startswith("v6") || ArchName.startswith("v7")) 607cbd1933f83e2332b2d7add10459f80cc4e7eb7bfDaniel Dunbar FloatABI = "softfp"; 608cbd1933f83e2332b2d7add10459f80cc4e7eb7bfDaniel Dunbar else 609cbd1933f83e2332b2d7add10459f80cc4e7eb7bfDaniel Dunbar FloatABI = "soft"; 610cbd1933f83e2332b2d7add10459f80cc4e7eb7bfDaniel Dunbar break; 611cbd1933f83e2332b2d7add10459f80cc4e7eb7bfDaniel Dunbar } 612cbd1933f83e2332b2d7add10459f80cc4e7eb7bfDaniel Dunbar 6137e9cebfe1246bb9051a364474b6570eb40dbac4bRafael Espindola case llvm::Triple::Linux: { 6144ce83eba01c582fa4cbed25f74aaa2c5bf7d4fdeBob Wilson if (Triple.getEnvironment() == llvm::Triple::GNUEABI) { 6157e9cebfe1246bb9051a364474b6570eb40dbac4bRafael Espindola FloatABI = "softfp"; 6167e9cebfe1246bb9051a364474b6570eb40dbac4bRafael Espindola break; 6177e9cebfe1246bb9051a364474b6570eb40dbac4bRafael Espindola } 6187e9cebfe1246bb9051a364474b6570eb40dbac4bRafael Espindola } 6197e9cebfe1246bb9051a364474b6570eb40dbac4bRafael Espindola // fall through 6207e9cebfe1246bb9051a364474b6570eb40dbac4bRafael Espindola 621cbd1933f83e2332b2d7add10459f80cc4e7eb7bfDaniel Dunbar default: 622fc2bd7c3efed6756a030d58a5f6ae31947e7d451Bob Wilson switch(Triple.getEnvironment()) { 623fc2bd7c3efed6756a030d58a5f6ae31947e7d451Bob Wilson case llvm::Triple::GNUEABI: 624fc2bd7c3efed6756a030d58a5f6ae31947e7d451Bob Wilson FloatABI = "softfp"; 625fc2bd7c3efed6756a030d58a5f6ae31947e7d451Bob Wilson break; 626fc2bd7c3efed6756a030d58a5f6ae31947e7d451Bob Wilson case llvm::Triple::EABI: 627fc2bd7c3efed6756a030d58a5f6ae31947e7d451Bob Wilson // EABI is always AAPCS, and if it was not marked 'hard', it's softfp 628fc2bd7c3efed6756a030d58a5f6ae31947e7d451Bob Wilson FloatABI = "softfp"; 629fc2bd7c3efed6756a030d58a5f6ae31947e7d451Bob Wilson break; 630b43550bf1bd944a16cdae9703cb1c2049b04e6bdChandler Carruth case llvm::Triple::ANDROIDEABI: { 631b43550bf1bd944a16cdae9703cb1c2049b04e6bdChandler Carruth StringRef ArchName = 632b43550bf1bd944a16cdae9703cb1c2049b04e6bdChandler Carruth getLLVMArchSuffixForARM(getARMTargetCPU(Args, Triple)); 633b43550bf1bd944a16cdae9703cb1c2049b04e6bdChandler Carruth if (ArchName.startswith("v7")) 634b43550bf1bd944a16cdae9703cb1c2049b04e6bdChandler Carruth FloatABI = "softfp"; 635b43550bf1bd944a16cdae9703cb1c2049b04e6bdChandler Carruth else 636b43550bf1bd944a16cdae9703cb1c2049b04e6bdChandler Carruth FloatABI = "soft"; 637b43550bf1bd944a16cdae9703cb1c2049b04e6bdChandler Carruth break; 638b43550bf1bd944a16cdae9703cb1c2049b04e6bdChandler Carruth } 639fc2bd7c3efed6756a030d58a5f6ae31947e7d451Bob Wilson default: 640fc2bd7c3efed6756a030d58a5f6ae31947e7d451Bob Wilson // Assume "soft", but warn the user we are guessing. 641fc2bd7c3efed6756a030d58a5f6ae31947e7d451Bob Wilson FloatABI = "soft"; 6425f9e272e632e951b1efe824cd16acb4d96077930Chris Lattner D.Diag(diag::warn_drv_assuming_mfloat_abi_is) << "soft"; 643fc2bd7c3efed6756a030d58a5f6ae31947e7d451Bob Wilson break; 644fc2bd7c3efed6756a030d58a5f6ae31947e7d451Bob Wilson } 645cbd1933f83e2332b2d7add10459f80cc4e7eb7bfDaniel Dunbar } 646cbd1933f83e2332b2d7add10459f80cc4e7eb7bfDaniel Dunbar } 647cbd1933f83e2332b2d7add10459f80cc4e7eb7bfDaniel Dunbar 648e2571793ba6fc13e5525b8d7224812f99842a1a4Anton Korobeynikov return FloatABI; 649e2571793ba6fc13e5525b8d7224812f99842a1a4Anton Korobeynikov} 650e2571793ba6fc13e5525b8d7224812f99842a1a4Anton Korobeynikov 651e2571793ba6fc13e5525b8d7224812f99842a1a4Anton Korobeynikov 652e2571793ba6fc13e5525b8d7224812f99842a1a4Anton Korobeynikovvoid Clang::AddARMTargetArgs(const ArgList &Args, 653e2571793ba6fc13e5525b8d7224812f99842a1a4Anton Korobeynikov ArgStringList &CmdArgs, 654e2571793ba6fc13e5525b8d7224812f99842a1a4Anton Korobeynikov bool KernelOrKext) const { 655e2571793ba6fc13e5525b8d7224812f99842a1a4Anton Korobeynikov const Driver &D = getToolChain().getDriver(); 656e2571793ba6fc13e5525b8d7224812f99842a1a4Anton Korobeynikov llvm::Triple Triple = getToolChain().getTriple(); 657e2571793ba6fc13e5525b8d7224812f99842a1a4Anton Korobeynikov 658e2571793ba6fc13e5525b8d7224812f99842a1a4Anton Korobeynikov // Select the ABI to use. 659e2571793ba6fc13e5525b8d7224812f99842a1a4Anton Korobeynikov // 660e2571793ba6fc13e5525b8d7224812f99842a1a4Anton Korobeynikov // FIXME: Support -meabi. 661e2571793ba6fc13e5525b8d7224812f99842a1a4Anton Korobeynikov const char *ABIName = 0; 662e2571793ba6fc13e5525b8d7224812f99842a1a4Anton Korobeynikov if (Arg *A = Args.getLastArg(options::OPT_mabi_EQ)) { 663e2571793ba6fc13e5525b8d7224812f99842a1a4Anton Korobeynikov ABIName = A->getValue(Args); 664e2571793ba6fc13e5525b8d7224812f99842a1a4Anton Korobeynikov } else { 665e2571793ba6fc13e5525b8d7224812f99842a1a4Anton Korobeynikov // Select the default based on the platform. 666e2571793ba6fc13e5525b8d7224812f99842a1a4Anton Korobeynikov switch(Triple.getEnvironment()) { 667e2571793ba6fc13e5525b8d7224812f99842a1a4Anton Korobeynikov case llvm::Triple::ANDROIDEABI: 668e2571793ba6fc13e5525b8d7224812f99842a1a4Anton Korobeynikov case llvm::Triple::GNUEABI: 669e2571793ba6fc13e5525b8d7224812f99842a1a4Anton Korobeynikov ABIName = "aapcs-linux"; 670e2571793ba6fc13e5525b8d7224812f99842a1a4Anton Korobeynikov break; 671e2571793ba6fc13e5525b8d7224812f99842a1a4Anton Korobeynikov case llvm::Triple::EABI: 672e2571793ba6fc13e5525b8d7224812f99842a1a4Anton Korobeynikov ABIName = "aapcs"; 673e2571793ba6fc13e5525b8d7224812f99842a1a4Anton Korobeynikov break; 674e2571793ba6fc13e5525b8d7224812f99842a1a4Anton Korobeynikov default: 675e2571793ba6fc13e5525b8d7224812f99842a1a4Anton Korobeynikov ABIName = "apcs-gnu"; 676e2571793ba6fc13e5525b8d7224812f99842a1a4Anton Korobeynikov } 677e2571793ba6fc13e5525b8d7224812f99842a1a4Anton Korobeynikov } 678e2571793ba6fc13e5525b8d7224812f99842a1a4Anton Korobeynikov CmdArgs.push_back("-target-abi"); 679e2571793ba6fc13e5525b8d7224812f99842a1a4Anton Korobeynikov CmdArgs.push_back(ABIName); 680e2571793ba6fc13e5525b8d7224812f99842a1a4Anton Korobeynikov 681e2571793ba6fc13e5525b8d7224812f99842a1a4Anton Korobeynikov // Set the CPU based on -march= and -mcpu=. 682e2571793ba6fc13e5525b8d7224812f99842a1a4Anton Korobeynikov CmdArgs.push_back("-target-cpu"); 683e2571793ba6fc13e5525b8d7224812f99842a1a4Anton Korobeynikov CmdArgs.push_back(getARMTargetCPU(Args, Triple)); 684e2571793ba6fc13e5525b8d7224812f99842a1a4Anton Korobeynikov 685e2571793ba6fc13e5525b8d7224812f99842a1a4Anton Korobeynikov // Determine floating point ABI from the options & target defaults. 686e2571793ba6fc13e5525b8d7224812f99842a1a4Anton Korobeynikov StringRef FloatABI = getARMFloatABI(D, Args, Triple); 687cbd1933f83e2332b2d7add10459f80cc4e7eb7bfDaniel Dunbar if (FloatABI == "soft") { 688cbd1933f83e2332b2d7add10459f80cc4e7eb7bfDaniel Dunbar // Floating point operations and argument passing are soft. 689cbd1933f83e2332b2d7add10459f80cc4e7eb7bfDaniel Dunbar // 690cbd1933f83e2332b2d7add10459f80cc4e7eb7bfDaniel Dunbar // FIXME: This changes CPP defines, we need -target-soft-float. 6913b315264d1a6fa303e20fe0caec306ccafc090deDaniel Dunbar CmdArgs.push_back("-msoft-float"); 69287667aafe68c366be57f5afb60428237593da0edDaniel Dunbar CmdArgs.push_back("-mfloat-abi"); 69387667aafe68c366be57f5afb60428237593da0edDaniel Dunbar CmdArgs.push_back("soft"); 694cbd1933f83e2332b2d7add10459f80cc4e7eb7bfDaniel Dunbar } else if (FloatABI == "softfp") { 695cbd1933f83e2332b2d7add10459f80cc4e7eb7bfDaniel Dunbar // Floating point operations are hard, but argument passing is soft. 69687667aafe68c366be57f5afb60428237593da0edDaniel Dunbar CmdArgs.push_back("-mfloat-abi"); 69787667aafe68c366be57f5afb60428237593da0edDaniel Dunbar CmdArgs.push_back("soft"); 698cbd1933f83e2332b2d7add10459f80cc4e7eb7bfDaniel Dunbar } else { 699cbd1933f83e2332b2d7add10459f80cc4e7eb7bfDaniel Dunbar // Floating point operations and argument passing are hard. 700cbd1933f83e2332b2d7add10459f80cc4e7eb7bfDaniel Dunbar assert(FloatABI == "hard" && "Invalid float abi!"); 70187667aafe68c366be57f5afb60428237593da0edDaniel Dunbar CmdArgs.push_back("-mfloat-abi"); 70287667aafe68c366be57f5afb60428237593da0edDaniel Dunbar CmdArgs.push_back("hard"); 703cbd1933f83e2332b2d7add10459f80cc4e7eb7bfDaniel Dunbar } 70497f52ac45369f6925b548404e61d511034c874ecDaniel Dunbar 70597f52ac45369f6925b548404e61d511034c874ecDaniel Dunbar // Set appropriate target features for floating point mode. 70697f52ac45369f6925b548404e61d511034c874ecDaniel Dunbar // 70797f52ac45369f6925b548404e61d511034c874ecDaniel Dunbar // FIXME: Note, this is a hack, the LLVM backend doesn't actually use these 70897f52ac45369f6925b548404e61d511034c874ecDaniel Dunbar // yet (it uses the -mfloat-abi and -msoft-float options above), and it is 70997f52ac45369f6925b548404e61d511034c874ecDaniel Dunbar // stripped out by the ARM target. 71097f52ac45369f6925b548404e61d511034c874ecDaniel Dunbar 71197f52ac45369f6925b548404e61d511034c874ecDaniel Dunbar // Use software floating point operations? 71297f52ac45369f6925b548404e61d511034c874ecDaniel Dunbar if (FloatABI == "soft") { 71397f52ac45369f6925b548404e61d511034c874ecDaniel Dunbar CmdArgs.push_back("-target-feature"); 71497f52ac45369f6925b548404e61d511034c874ecDaniel Dunbar CmdArgs.push_back("+soft-float"); 71597f52ac45369f6925b548404e61d511034c874ecDaniel Dunbar } 71697f52ac45369f6925b548404e61d511034c874ecDaniel Dunbar 71797f52ac45369f6925b548404e61d511034c874ecDaniel Dunbar // Use software floating point argument passing? 71897f52ac45369f6925b548404e61d511034c874ecDaniel Dunbar if (FloatABI != "hard") { 71997f52ac45369f6925b548404e61d511034c874ecDaniel Dunbar CmdArgs.push_back("-target-feature"); 72097f52ac45369f6925b548404e61d511034c874ecDaniel Dunbar CmdArgs.push_back("+soft-float-abi"); 72197f52ac45369f6925b548404e61d511034c874ecDaniel Dunbar } 722a91320b8af7143f7af4c0665ffa62a3b244c0bd9Daniel Dunbar 723a91320b8af7143f7af4c0665ffa62a3b244c0bd9Daniel Dunbar // Honor -mfpu=. 724993172757762436d22b2dfc74e7cca1bade1a7bfChad Rosier if (const Arg *A = Args.getLastArg(options::OPT_mfpu_EQ)) 725f80f2a5098218211704bc4e66a8c2f46a8fa1d25Chad Rosier addFPUArgs(D, A, Args, CmdArgs); 7267187fac0f19f75c62f575c9f15f0ed68b7d97810Daniel Dunbar 7277a938fa66be42710b034a79106de337a275fd265Chad Rosier // Honor -mfpmath=. 7287a938fa66be42710b034a79106de337a275fd265Chad Rosier if (const Arg *A = Args.getLastArg(options::OPT_mfpmath_EQ)) 72930fe6baf95662ea82a794a8fe3b76998713c183dChad Rosier addFPMathArgs(D, A, Args, CmdArgs, getARMTargetCPU(Args, Triple)); 7307a938fa66be42710b034a79106de337a275fd265Chad Rosier 7317187fac0f19f75c62f575c9f15f0ed68b7d97810Daniel Dunbar // Setting -msoft-float effectively disables NEON because of the GCC 7327187fac0f19f75c62f575c9f15f0ed68b7d97810Daniel Dunbar // implementation, although the same isn't true of VFP or VFP3. 7337187fac0f19f75c62f575c9f15f0ed68b7d97810Daniel Dunbar if (FloatABI == "soft") { 734fa41d6975058ceb1b8a24564f6dcec72f89f62e8Daniel Dunbar CmdArgs.push_back("-target-feature"); 735fa41d6975058ceb1b8a24564f6dcec72f89f62e8Daniel Dunbar CmdArgs.push_back("-neon"); 736fa41d6975058ceb1b8a24564f6dcec72f89f62e8Daniel Dunbar } 737fa41d6975058ceb1b8a24564f6dcec72f89f62e8Daniel Dunbar 738fa41d6975058ceb1b8a24564f6dcec72f89f62e8Daniel Dunbar // Kernel code has more strict alignment requirements. 739fa41d6975058ceb1b8a24564f6dcec72f89f62e8Daniel Dunbar if (KernelOrKext) { 7403c66d30d513106bb794990c5e4ba36a31ac19f15Daniel Dunbar CmdArgs.push_back("-backend-option"); 741fa41d6975058ceb1b8a24564f6dcec72f89f62e8Daniel Dunbar CmdArgs.push_back("-arm-long-calls"); 742fa41d6975058ceb1b8a24564f6dcec72f89f62e8Daniel Dunbar 7433c66d30d513106bb794990c5e4ba36a31ac19f15Daniel Dunbar CmdArgs.push_back("-backend-option"); 744fa41d6975058ceb1b8a24564f6dcec72f89f62e8Daniel Dunbar CmdArgs.push_back("-arm-strict-align"); 745b5fbb8931466eeab70a30a27a8d5f385472305a1Daniel Dunbar 746b5fbb8931466eeab70a30a27a8d5f385472305a1Daniel Dunbar // The kext linker doesn't know how to deal with movw/movt. 747b5fbb8931466eeab70a30a27a8d5f385472305a1Daniel Dunbar CmdArgs.push_back("-backend-option"); 748b5fbb8931466eeab70a30a27a8d5f385472305a1Daniel Dunbar CmdArgs.push_back("-arm-darwin-use-movt=0"); 7497187fac0f19f75c62f575c9f15f0ed68b7d97810Daniel Dunbar } 7501b9060553221720152e12981109549e0a1d8e3a1Chad Rosier 7511b9060553221720152e12981109549e0a1d8e3a1Chad Rosier // Setting -mno-global-merge disables the codegen global merge pass. Setting 7521b9060553221720152e12981109549e0a1d8e3a1Chad Rosier // -mglobal-merge has no effect as the pass is enabled by default. 7531b9060553221720152e12981109549e0a1d8e3a1Chad Rosier if (Arg *A = Args.getLastArg(options::OPT_mglobal_merge, 7541b9060553221720152e12981109549e0a1d8e3a1Chad Rosier options::OPT_mno_global_merge)) { 7551b9060553221720152e12981109549e0a1d8e3a1Chad Rosier if (A->getOption().matches(options::OPT_mno_global_merge)) 7561b9060553221720152e12981109549e0a1d8e3a1Chad Rosier CmdArgs.push_back("-mno-global-merge"); 7571b9060553221720152e12981109549e0a1d8e3a1Chad Rosier } 758b163ef7e7a5d904ef0962a7c38c460be083c4d63Daniel Dunbar} 759b163ef7e7a5d904ef0962a7c38c460be083c4d63Daniel Dunbar 7609f36062866e6e4bbbfd3efce85fcfb1ce62df97fAkira Hatanaka// Get default architecture. 7619f36062866e6e4bbbfd3efce85fcfb1ce62df97fAkira Hatanakastatic const char* getMipsArchFromCPU(StringRef CPUName) { 762592d26eafab66ba6288c09b66068c67ab2764c35Akira Hatanaka if (CPUName == "mips32" || CPUName == "mips32r2") 7639f36062866e6e4bbbfd3efce85fcfb1ce62df97fAkira Hatanaka return "mips"; 7649f36062866e6e4bbbfd3efce85fcfb1ce62df97fAkira Hatanaka 765592d26eafab66ba6288c09b66068c67ab2764c35Akira Hatanaka assert((CPUName == "mips64" || CPUName == "mips64r2") && 7669f36062866e6e4bbbfd3efce85fcfb1ce62df97fAkira Hatanaka "Unexpected cpu name."); 7679f36062866e6e4bbbfd3efce85fcfb1ce62df97fAkira Hatanaka 7689f36062866e6e4bbbfd3efce85fcfb1ce62df97fAkira Hatanaka return "mips64"; 7699f36062866e6e4bbbfd3efce85fcfb1ce62df97fAkira Hatanaka} 7709f36062866e6e4bbbfd3efce85fcfb1ce62df97fAkira Hatanaka 771c85900f4d6aec17ef29140bfc97977463ac75cb2Akira Hatanaka// Check that ArchName is a known Mips architecture name. 772c85900f4d6aec17ef29140bfc97977463ac75cb2Akira Hatanakastatic bool checkMipsArchName(StringRef ArchName) { 773c85900f4d6aec17ef29140bfc97977463ac75cb2Akira Hatanaka return ArchName == "mips" || 774c85900f4d6aec17ef29140bfc97977463ac75cb2Akira Hatanaka ArchName == "mipsel" || 775c85900f4d6aec17ef29140bfc97977463ac75cb2Akira Hatanaka ArchName == "mips64" || 776c85900f4d6aec17ef29140bfc97977463ac75cb2Akira Hatanaka ArchName == "mips64el"; 777c85900f4d6aec17ef29140bfc97977463ac75cb2Akira Hatanaka} 778c85900f4d6aec17ef29140bfc97977463ac75cb2Akira Hatanaka 7799f36062866e6e4bbbfd3efce85fcfb1ce62df97fAkira Hatanaka// Get default target cpu. 780c85900f4d6aec17ef29140bfc97977463ac75cb2Akira Hatanakastatic const char* getMipsCPUFromArch(StringRef ArchName) { 7819f36062866e6e4bbbfd3efce85fcfb1ce62df97fAkira Hatanaka if (ArchName == "mips" || ArchName == "mipsel") 782592d26eafab66ba6288c09b66068c67ab2764c35Akira Hatanaka return "mips32"; 7839f36062866e6e4bbbfd3efce85fcfb1ce62df97fAkira Hatanaka 784c85900f4d6aec17ef29140bfc97977463ac75cb2Akira Hatanaka assert((ArchName == "mips64" || ArchName == "mips64el") && 785c85900f4d6aec17ef29140bfc97977463ac75cb2Akira Hatanaka "Unexpected arch name."); 786c85900f4d6aec17ef29140bfc97977463ac75cb2Akira Hatanaka 787c85900f4d6aec17ef29140bfc97977463ac75cb2Akira Hatanaka return "mips64"; 7889f36062866e6e4bbbfd3efce85fcfb1ce62df97fAkira Hatanaka} 7899f36062866e6e4bbbfd3efce85fcfb1ce62df97fAkira Hatanaka 7909f36062866e6e4bbbfd3efce85fcfb1ce62df97fAkira Hatanaka// Get default ABI. 7919f36062866e6e4bbbfd3efce85fcfb1ce62df97fAkira Hatanakastatic const char* getMipsABIFromArch(StringRef ArchName) { 7929f36062866e6e4bbbfd3efce85fcfb1ce62df97fAkira Hatanaka if (ArchName == "mips" || ArchName == "mipsel") 7939f36062866e6e4bbbfd3efce85fcfb1ce62df97fAkira Hatanaka return "o32"; 7949f36062866e6e4bbbfd3efce85fcfb1ce62df97fAkira Hatanaka 7959f36062866e6e4bbbfd3efce85fcfb1ce62df97fAkira Hatanaka assert((ArchName == "mips64" || ArchName == "mips64el") && 7969f36062866e6e4bbbfd3efce85fcfb1ce62df97fAkira Hatanaka "Unexpected arch name."); 7979f36062866e6e4bbbfd3efce85fcfb1ce62df97fAkira Hatanaka return "n64"; 7989f36062866e6e4bbbfd3efce85fcfb1ce62df97fAkira Hatanaka} 7999f36062866e6e4bbbfd3efce85fcfb1ce62df97fAkira Hatanaka 800a2768be144256f9eb721bef8b751e56e0b64fa0bSimon Atanasyan// Get CPU and ABI names. They are not independent 801a2768be144256f9eb721bef8b751e56e0b64fa0bSimon Atanasyan// so we have to calculate them together. 802a2768be144256f9eb721bef8b751e56e0b64fa0bSimon Atanasyanstatic void getMipsCPUAndABI(const ArgList &Args, 803a2768be144256f9eb721bef8b751e56e0b64fa0bSimon Atanasyan const ToolChain &TC, 804a2768be144256f9eb721bef8b751e56e0b64fa0bSimon Atanasyan StringRef &CPUName, 805a2768be144256f9eb721bef8b751e56e0b64fa0bSimon Atanasyan StringRef &ABIName) { 8069f36062866e6e4bbbfd3efce85fcfb1ce62df97fAkira Hatanaka StringRef ArchName; 8079f36062866e6e4bbbfd3efce85fcfb1ce62df97fAkira Hatanaka 808a2768be144256f9eb721bef8b751e56e0b64fa0bSimon Atanasyan // Select target cpu and architecture. 8099f36062866e6e4bbbfd3efce85fcfb1ce62df97fAkira Hatanaka if (Arg *A = Args.getLastArg(options::OPT_mcpu_EQ)) { 8109f36062866e6e4bbbfd3efce85fcfb1ce62df97fAkira Hatanaka CPUName = A->getValue(Args); 8119f36062866e6e4bbbfd3efce85fcfb1ce62df97fAkira Hatanaka ArchName = getMipsArchFromCPU(CPUName); 8129f36062866e6e4bbbfd3efce85fcfb1ce62df97fAkira Hatanaka } 8139f36062866e6e4bbbfd3efce85fcfb1ce62df97fAkira Hatanaka else { 814a2768be144256f9eb721bef8b751e56e0b64fa0bSimon Atanasyan ArchName = Args.MakeArgString(TC.getArchName()); 815c85900f4d6aec17ef29140bfc97977463ac75cb2Akira Hatanaka if (!checkMipsArchName(ArchName)) 816a2768be144256f9eb721bef8b751e56e0b64fa0bSimon Atanasyan TC.getDriver().Diag(diag::err_drv_invalid_arch_name) << ArchName; 817c85900f4d6aec17ef29140bfc97977463ac75cb2Akira Hatanaka else 818c85900f4d6aec17ef29140bfc97977463ac75cb2Akira Hatanaka CPUName = getMipsCPUFromArch(ArchName); 8199f36062866e6e4bbbfd3efce85fcfb1ce62df97fAkira Hatanaka } 8209f36062866e6e4bbbfd3efce85fcfb1ce62df97fAkira Hatanaka 821ed734737d5af31906e30e537d4a41c760ddcfc59Eric Christopher // Select the ABI to use. 8229f36062866e6e4bbbfd3efce85fcfb1ce62df97fAkira Hatanaka if (Arg *A = Args.getLastArg(options::OPT_mabi_EQ)) 823ed734737d5af31906e30e537d4a41c760ddcfc59Eric Christopher ABIName = A->getValue(Args); 8249f36062866e6e4bbbfd3efce85fcfb1ce62df97fAkira Hatanaka else 8259f36062866e6e4bbbfd3efce85fcfb1ce62df97fAkira Hatanaka ABIName = getMipsABIFromArch(ArchName); 826a2768be144256f9eb721bef8b751e56e0b64fa0bSimon Atanasyan} 827a2768be144256f9eb721bef8b751e56e0b64fa0bSimon Atanasyan 828a2768be144256f9eb721bef8b751e56e0b64fa0bSimon Atanasyanvoid Clang::AddMIPSTargetArgs(const ArgList &Args, 829a2768be144256f9eb721bef8b751e56e0b64fa0bSimon Atanasyan ArgStringList &CmdArgs) const { 830a2768be144256f9eb721bef8b751e56e0b64fa0bSimon Atanasyan const Driver &D = getToolChain().getDriver(); 831a2768be144256f9eb721bef8b751e56e0b64fa0bSimon Atanasyan StringRef CPUName; 832a2768be144256f9eb721bef8b751e56e0b64fa0bSimon Atanasyan StringRef ABIName; 833a2768be144256f9eb721bef8b751e56e0b64fa0bSimon Atanasyan getMipsCPUAndABI(Args, getToolChain(), CPUName, ABIName); 834a2768be144256f9eb721bef8b751e56e0b64fa0bSimon Atanasyan 835a2768be144256f9eb721bef8b751e56e0b64fa0bSimon Atanasyan CmdArgs.push_back("-target-cpu"); 836a2768be144256f9eb721bef8b751e56e0b64fa0bSimon Atanasyan CmdArgs.push_back(CPUName.data()); 837ed734737d5af31906e30e537d4a41c760ddcfc59Eric Christopher 838ed734737d5af31906e30e537d4a41c760ddcfc59Eric Christopher CmdArgs.push_back("-target-abi"); 839a2768be144256f9eb721bef8b751e56e0b64fa0bSimon Atanasyan CmdArgs.push_back(ABIName.data()); 840ed734737d5af31906e30e537d4a41c760ddcfc59Eric Christopher 841ad8d8a31b010ceac4cad2553f16fc1a77c4b2e5eAkira Hatanaka // Select the float ABI as determined by -msoft-float, -mhard-float, 842ad8d8a31b010ceac4cad2553f16fc1a77c4b2e5eAkira Hatanaka // and -mfloat-abi=. 8435f9e272e632e951b1efe824cd16acb4d96077930Chris Lattner StringRef FloatABI; 844ed734737d5af31906e30e537d4a41c760ddcfc59Eric Christopher if (Arg *A = Args.getLastArg(options::OPT_msoft_float, 845ad8d8a31b010ceac4cad2553f16fc1a77c4b2e5eAkira Hatanaka options::OPT_mhard_float, 846ad8d8a31b010ceac4cad2553f16fc1a77c4b2e5eAkira Hatanaka options::OPT_mfloat_abi_EQ)) { 847ed734737d5af31906e30e537d4a41c760ddcfc59Eric Christopher if (A->getOption().matches(options::OPT_msoft_float)) 848ed734737d5af31906e30e537d4a41c760ddcfc59Eric Christopher FloatABI = "soft"; 849ed734737d5af31906e30e537d4a41c760ddcfc59Eric Christopher else if (A->getOption().matches(options::OPT_mhard_float)) 850ed734737d5af31906e30e537d4a41c760ddcfc59Eric Christopher FloatABI = "hard"; 851ad8d8a31b010ceac4cad2553f16fc1a77c4b2e5eAkira Hatanaka else { 852ad8d8a31b010ceac4cad2553f16fc1a77c4b2e5eAkira Hatanaka FloatABI = A->getValue(Args); 853ad8d8a31b010ceac4cad2553f16fc1a77c4b2e5eAkira Hatanaka if (FloatABI != "soft" && FloatABI != "single" && FloatABI != "hard") { 854ad8d8a31b010ceac4cad2553f16fc1a77c4b2e5eAkira Hatanaka D.Diag(diag::err_drv_invalid_mfloat_abi) 855ad8d8a31b010ceac4cad2553f16fc1a77c4b2e5eAkira Hatanaka << A->getAsString(Args); 856ad8d8a31b010ceac4cad2553f16fc1a77c4b2e5eAkira Hatanaka FloatABI = "hard"; 857ad8d8a31b010ceac4cad2553f16fc1a77c4b2e5eAkira Hatanaka } 858ad8d8a31b010ceac4cad2553f16fc1a77c4b2e5eAkira Hatanaka } 859ed734737d5af31906e30e537d4a41c760ddcfc59Eric Christopher } 860ed734737d5af31906e30e537d4a41c760ddcfc59Eric Christopher 861ed734737d5af31906e30e537d4a41c760ddcfc59Eric Christopher // If unspecified, choose the default based on the platform. 862ed734737d5af31906e30e537d4a41c760ddcfc59Eric Christopher if (FloatABI.empty()) { 863ad8d8a31b010ceac4cad2553f16fc1a77c4b2e5eAkira Hatanaka // Assume "hard", because it's a default value used by gcc. 864ad8d8a31b010ceac4cad2553f16fc1a77c4b2e5eAkira Hatanaka // When we start to recognize specific target MIPS processors, 865ad8d8a31b010ceac4cad2553f16fc1a77c4b2e5eAkira Hatanaka // we will be able to select the default more correctly. 866ad8d8a31b010ceac4cad2553f16fc1a77c4b2e5eAkira Hatanaka FloatABI = "hard"; 867ed734737d5af31906e30e537d4a41c760ddcfc59Eric Christopher } 868ed734737d5af31906e30e537d4a41c760ddcfc59Eric Christopher 869ed734737d5af31906e30e537d4a41c760ddcfc59Eric Christopher if (FloatABI == "soft") { 870ed734737d5af31906e30e537d4a41c760ddcfc59Eric Christopher // Floating point operations and argument passing are soft. 871ed734737d5af31906e30e537d4a41c760ddcfc59Eric Christopher CmdArgs.push_back("-msoft-float"); 872ad8d8a31b010ceac4cad2553f16fc1a77c4b2e5eAkira Hatanaka CmdArgs.push_back("-mfloat-abi"); 873ad8d8a31b010ceac4cad2553f16fc1a77c4b2e5eAkira Hatanaka CmdArgs.push_back("soft"); 874ad8d8a31b010ceac4cad2553f16fc1a77c4b2e5eAkira Hatanaka 875ad8d8a31b010ceac4cad2553f16fc1a77c4b2e5eAkira Hatanaka // FIXME: Note, this is a hack. We need to pass the selected float 876ad8d8a31b010ceac4cad2553f16fc1a77c4b2e5eAkira Hatanaka // mode to the MipsTargetInfoBase to define appropriate macros there. 877ad8d8a31b010ceac4cad2553f16fc1a77c4b2e5eAkira Hatanaka // Now it is the only method. 878ad8d8a31b010ceac4cad2553f16fc1a77c4b2e5eAkira Hatanaka CmdArgs.push_back("-target-feature"); 879ad8d8a31b010ceac4cad2553f16fc1a77c4b2e5eAkira Hatanaka CmdArgs.push_back("+soft-float"); 880ad8d8a31b010ceac4cad2553f16fc1a77c4b2e5eAkira Hatanaka } 881ad8d8a31b010ceac4cad2553f16fc1a77c4b2e5eAkira Hatanaka else if (FloatABI == "single") { 882ad8d8a31b010ceac4cad2553f16fc1a77c4b2e5eAkira Hatanaka // Restrict the use of hardware floating-point 883ad8d8a31b010ceac4cad2553f16fc1a77c4b2e5eAkira Hatanaka // instructions to 32-bit operations. 884ad8d8a31b010ceac4cad2553f16fc1a77c4b2e5eAkira Hatanaka CmdArgs.push_back("-target-feature"); 885ad8d8a31b010ceac4cad2553f16fc1a77c4b2e5eAkira Hatanaka CmdArgs.push_back("+single-float"); 886ad8d8a31b010ceac4cad2553f16fc1a77c4b2e5eAkira Hatanaka } 887ad8d8a31b010ceac4cad2553f16fc1a77c4b2e5eAkira Hatanaka else { 888ad8d8a31b010ceac4cad2553f16fc1a77c4b2e5eAkira Hatanaka // Floating point operations and argument passing are hard. 889ed734737d5af31906e30e537d4a41c760ddcfc59Eric Christopher assert(FloatABI == "hard" && "Invalid float abi!"); 890ad8d8a31b010ceac4cad2553f16fc1a77c4b2e5eAkira Hatanaka CmdArgs.push_back("-mfloat-abi"); 891ad8d8a31b010ceac4cad2553f16fc1a77c4b2e5eAkira Hatanaka CmdArgs.push_back("hard"); 892ed734737d5af31906e30e537d4a41c760ddcfc59Eric Christopher } 893ed734737d5af31906e30e537d4a41c760ddcfc59Eric Christopher} 894ed734737d5af31906e30e537d4a41c760ddcfc59Eric Christopher 8959284d215022457ba867080a713f08f026d89ea17Bruno Cardoso Lopesvoid Clang::AddSparcTargetArgs(const ArgList &Args, 8969284d215022457ba867080a713f08f026d89ea17Bruno Cardoso Lopes ArgStringList &CmdArgs) const { 8979284d215022457ba867080a713f08f026d89ea17Bruno Cardoso Lopes const Driver &D = getToolChain().getDriver(); 8989284d215022457ba867080a713f08f026d89ea17Bruno Cardoso Lopes 8999284d215022457ba867080a713f08f026d89ea17Bruno Cardoso Lopes if (const Arg *A = Args.getLastArg(options::OPT_march_EQ)) { 9009284d215022457ba867080a713f08f026d89ea17Bruno Cardoso Lopes CmdArgs.push_back("-target-cpu"); 901a11d3098624dd9c136c713ff8a513150ce88580eBenjamin Kramer CmdArgs.push_back(A->getValue(Args)); 9029284d215022457ba867080a713f08f026d89ea17Bruno Cardoso Lopes } 9039284d215022457ba867080a713f08f026d89ea17Bruno Cardoso Lopes 9049284d215022457ba867080a713f08f026d89ea17Bruno Cardoso Lopes // Select the float ABI as determined by -msoft-float, -mhard-float, and 9055f9e272e632e951b1efe824cd16acb4d96077930Chris Lattner StringRef FloatABI; 9069284d215022457ba867080a713f08f026d89ea17Bruno Cardoso Lopes if (Arg *A = Args.getLastArg(options::OPT_msoft_float, 9079284d215022457ba867080a713f08f026d89ea17Bruno Cardoso Lopes options::OPT_mhard_float)) { 9089284d215022457ba867080a713f08f026d89ea17Bruno Cardoso Lopes if (A->getOption().matches(options::OPT_msoft_float)) 9099284d215022457ba867080a713f08f026d89ea17Bruno Cardoso Lopes FloatABI = "soft"; 9109284d215022457ba867080a713f08f026d89ea17Bruno Cardoso Lopes else if (A->getOption().matches(options::OPT_mhard_float)) 9119284d215022457ba867080a713f08f026d89ea17Bruno Cardoso Lopes FloatABI = "hard"; 9129284d215022457ba867080a713f08f026d89ea17Bruno Cardoso Lopes } 9139284d215022457ba867080a713f08f026d89ea17Bruno Cardoso Lopes 9149284d215022457ba867080a713f08f026d89ea17Bruno Cardoso Lopes // If unspecified, choose the default based on the platform. 9159284d215022457ba867080a713f08f026d89ea17Bruno Cardoso Lopes if (FloatABI.empty()) { 9169284d215022457ba867080a713f08f026d89ea17Bruno Cardoso Lopes switch (getToolChain().getTriple().getOS()) { 9179284d215022457ba867080a713f08f026d89ea17Bruno Cardoso Lopes default: 9189284d215022457ba867080a713f08f026d89ea17Bruno Cardoso Lopes // Assume "soft", but warn the user we are guessing. 9199284d215022457ba867080a713f08f026d89ea17Bruno Cardoso Lopes FloatABI = "soft"; 9205f9e272e632e951b1efe824cd16acb4d96077930Chris Lattner D.Diag(diag::warn_drv_assuming_mfloat_abi_is) << "soft"; 9219284d215022457ba867080a713f08f026d89ea17Bruno Cardoso Lopes break; 9229284d215022457ba867080a713f08f026d89ea17Bruno Cardoso Lopes } 9239284d215022457ba867080a713f08f026d89ea17Bruno Cardoso Lopes } 9249284d215022457ba867080a713f08f026d89ea17Bruno Cardoso Lopes 9259284d215022457ba867080a713f08f026d89ea17Bruno Cardoso Lopes if (FloatABI == "soft") { 9269284d215022457ba867080a713f08f026d89ea17Bruno Cardoso Lopes // Floating point operations and argument passing are soft. 9279284d215022457ba867080a713f08f026d89ea17Bruno Cardoso Lopes // 9289284d215022457ba867080a713f08f026d89ea17Bruno Cardoso Lopes // FIXME: This changes CPP defines, we need -target-soft-float. 9299284d215022457ba867080a713f08f026d89ea17Bruno Cardoso Lopes CmdArgs.push_back("-msoft-float"); 9309284d215022457ba867080a713f08f026d89ea17Bruno Cardoso Lopes CmdArgs.push_back("-target-feature"); 9319284d215022457ba867080a713f08f026d89ea17Bruno Cardoso Lopes CmdArgs.push_back("+soft-float"); 9329284d215022457ba867080a713f08f026d89ea17Bruno Cardoso Lopes } else { 9339284d215022457ba867080a713f08f026d89ea17Bruno Cardoso Lopes assert(FloatABI == "hard" && "Invalid float abi!"); 9349284d215022457ba867080a713f08f026d89ea17Bruno Cardoso Lopes CmdArgs.push_back("-mhard-float"); 9359284d215022457ba867080a713f08f026d89ea17Bruno Cardoso Lopes } 9369284d215022457ba867080a713f08f026d89ea17Bruno Cardoso Lopes} 9379284d215022457ba867080a713f08f026d89ea17Bruno Cardoso Lopes 9386acda16e9c194dcbd0dea64341e182bdb65d0f41Daniel Dunbarvoid Clang::AddX86TargetArgs(const ArgList &Args, 9396acda16e9c194dcbd0dea64341e182bdb65d0f41Daniel Dunbar ArgStringList &CmdArgs) const { 940e6ad3f9fceef0ecc422ff26754ea069a5fd18c69Daniel Dunbar if (!Args.hasFlag(options::OPT_mred_zone, 941e6ad3f9fceef0ecc422ff26754ea069a5fd18c69Daniel Dunbar options::OPT_mno_red_zone, 942e6ad3f9fceef0ecc422ff26754ea069a5fd18c69Daniel Dunbar true) || 943e6ad3f9fceef0ecc422ff26754ea069a5fd18c69Daniel Dunbar Args.hasArg(options::OPT_mkernel) || 944e6ad3f9fceef0ecc422ff26754ea069a5fd18c69Daniel Dunbar Args.hasArg(options::OPT_fapple_kext)) 94566861e09d590994a8b941eaa328e4d8f33adec9eDaniel Dunbar CmdArgs.push_back("-disable-red-zone"); 946e6ad3f9fceef0ecc422ff26754ea069a5fd18c69Daniel Dunbar 947e6ad3f9fceef0ecc422ff26754ea069a5fd18c69Daniel Dunbar if (Args.hasFlag(options::OPT_msoft_float, 948e6ad3f9fceef0ecc422ff26754ea069a5fd18c69Daniel Dunbar options::OPT_mno_soft_float, 949e6ad3f9fceef0ecc422ff26754ea069a5fd18c69Daniel Dunbar false)) 95066861e09d590994a8b941eaa328e4d8f33adec9eDaniel Dunbar CmdArgs.push_back("-no-implicit-float"); 951e6ad3f9fceef0ecc422ff26754ea069a5fd18c69Daniel Dunbar 952f86feddbd5b13d2c144132e35d608fa630784dbbDaniel Dunbar const char *CPUName = 0; 9536acda16e9c194dcbd0dea64341e182bdb65d0f41Daniel Dunbar if (const Arg *A = Args.getLastArg(options::OPT_march_EQ)) { 9545f9e272e632e951b1efe824cd16acb4d96077930Chris Lattner if (StringRef(A->getValue(Args)) == "native") { 955f86feddbd5b13d2c144132e35d608fa630784dbbDaniel Dunbar // FIXME: Reject attempts to use -march=native unless the target matches 956f86feddbd5b13d2c144132e35d608fa630784dbbDaniel Dunbar // the host. 957f86feddbd5b13d2c144132e35d608fa630784dbbDaniel Dunbar // 958f86feddbd5b13d2c144132e35d608fa630784dbbDaniel Dunbar // FIXME: We should also incorporate the detected target features for use 959f86feddbd5b13d2c144132e35d608fa630784dbbDaniel Dunbar // with -native. 960f86feddbd5b13d2c144132e35d608fa630784dbbDaniel Dunbar std::string CPU = llvm::sys::getHostCPUName(); 961e0cc309536817cc5701c5a26119c8eeb7080057cBob Wilson if (!CPU.empty() && CPU != "generic") 962f86feddbd5b13d2c144132e35d608fa630784dbbDaniel Dunbar CPUName = Args.MakeArgString(CPU); 963f86feddbd5b13d2c144132e35d608fa630784dbbDaniel Dunbar } else 964f86feddbd5b13d2c144132e35d608fa630784dbbDaniel Dunbar CPUName = A->getValue(Args); 965f86feddbd5b13d2c144132e35d608fa630784dbbDaniel Dunbar } 9666acda16e9c194dcbd0dea64341e182bdb65d0f41Daniel Dunbar 967f86feddbd5b13d2c144132e35d608fa630784dbbDaniel Dunbar // Select the default CPU if none was given (or detection failed). 968f86feddbd5b13d2c144132e35d608fa630784dbbDaniel Dunbar if (!CPUName) { 9696acda16e9c194dcbd0dea64341e182bdb65d0f41Daniel Dunbar // FIXME: Need target hooks. 970905c45f15a25598620d19160c139c6b785aeea89Bob Wilson if (getToolChain().getTriple().isOSDarwin()) { 971951733d6ce270679db19e144782d76d9866eb166Daniel Dunbar if (getToolChain().getArch() == llvm::Triple::x86_64) 972f86feddbd5b13d2c144132e35d608fa630784dbbDaniel Dunbar CPUName = "core2"; 973951733d6ce270679db19e144782d76d9866eb166Daniel Dunbar else if (getToolChain().getArch() == llvm::Triple::x86) 974f86feddbd5b13d2c144132e35d608fa630784dbbDaniel Dunbar CPUName = "yonah"; 97586ed3a326342fa2a8c9d9b5d1d7280c9bad2b007Chris Lattner } else if (getToolChain().getOS().startswith("haiku")) { 976951733d6ce270679db19e144782d76d9866eb166Daniel Dunbar if (getToolChain().getArch() == llvm::Triple::x86_64) 97786ed3a326342fa2a8c9d9b5d1d7280c9bad2b007Chris Lattner CPUName = "x86-64"; 978951733d6ce270679db19e144782d76d9866eb166Daniel Dunbar else if (getToolChain().getArch() == llvm::Triple::x86) 97986ed3a326342fa2a8c9d9b5d1d7280c9bad2b007Chris Lattner CPUName = "i586"; 98095c0457054518102af6250e718a13a5b2ee5dbeaDaniel Dunbar } else if (getToolChain().getOS().startswith("openbsd")) { 981951733d6ce270679db19e144782d76d9866eb166Daniel Dunbar if (getToolChain().getArch() == llvm::Triple::x86_64) 98295c0457054518102af6250e718a13a5b2ee5dbeaDaniel Dunbar CPUName = "x86-64"; 983951733d6ce270679db19e144782d76d9866eb166Daniel Dunbar else if (getToolChain().getArch() == llvm::Triple::x86) 98495c0457054518102af6250e718a13a5b2ee5dbeaDaniel Dunbar CPUName = "i486"; 985451f8caf37fb6691936f9003833e857e1d1dc987Roman Divacky } else if (getToolChain().getOS().startswith("freebsd")) { 986951733d6ce270679db19e144782d76d9866eb166Daniel Dunbar if (getToolChain().getArch() == llvm::Triple::x86_64) 987451f8caf37fb6691936f9003833e857e1d1dc987Roman Divacky CPUName = "x86-64"; 988951733d6ce270679db19e144782d76d9866eb166Daniel Dunbar else if (getToolChain().getArch() == llvm::Triple::x86) 989451f8caf37fb6691936f9003833e857e1d1dc987Roman Divacky CPUName = "i486"; 9908e50a96b387dca7525caa8a6add31420dd82a2cdBenjamin Kramer } else if (getToolChain().getOS().startswith("netbsd")) { 991951733d6ce270679db19e144782d76d9866eb166Daniel Dunbar if (getToolChain().getArch() == llvm::Triple::x86_64) 9928e50a96b387dca7525caa8a6add31420dd82a2cdBenjamin Kramer CPUName = "x86-64"; 993951733d6ce270679db19e144782d76d9866eb166Daniel Dunbar else if (getToolChain().getArch() == llvm::Triple::x86) 9948e50a96b387dca7525caa8a6add31420dd82a2cdBenjamin Kramer CPUName = "i486"; 9956acda16e9c194dcbd0dea64341e182bdb65d0f41Daniel Dunbar } else { 996951733d6ce270679db19e144782d76d9866eb166Daniel Dunbar if (getToolChain().getArch() == llvm::Triple::x86_64) 997f86feddbd5b13d2c144132e35d608fa630784dbbDaniel Dunbar CPUName = "x86-64"; 998951733d6ce270679db19e144782d76d9866eb166Daniel Dunbar else if (getToolChain().getArch() == llvm::Triple::x86) 999f86feddbd5b13d2c144132e35d608fa630784dbbDaniel Dunbar CPUName = "pentium4"; 10006acda16e9c194dcbd0dea64341e182bdb65d0f41Daniel Dunbar } 10016acda16e9c194dcbd0dea64341e182bdb65d0f41Daniel Dunbar } 10026acda16e9c194dcbd0dea64341e182bdb65d0f41Daniel Dunbar 1003f86feddbd5b13d2c144132e35d608fa630784dbbDaniel Dunbar if (CPUName) { 100438b48afd338d494099697d2611e1f45e558e469eDaniel Dunbar CmdArgs.push_back("-target-cpu"); 1005f86feddbd5b13d2c144132e35d608fa630784dbbDaniel Dunbar CmdArgs.push_back(CPUName); 1006f86feddbd5b13d2c144132e35d608fa630784dbbDaniel Dunbar } 1007f86feddbd5b13d2c144132e35d608fa630784dbbDaniel Dunbar 1008d18eecac712bfbf63372cb78940d662ce9017840Eli Friedman // The required algorithm here is slightly strange: the options are applied 1009d18eecac712bfbf63372cb78940d662ce9017840Eli Friedman // in order (so -mno-sse -msse2 disables SSE3), but any option that gets 1010d18eecac712bfbf63372cb78940d662ce9017840Eli Friedman // directly overridden later is ignored (so "-mno-sse -msse2 -mno-sse2 -msse" 1011d18eecac712bfbf63372cb78940d662ce9017840Eli Friedman // is equivalent to "-mno-sse2 -msse"). The -cc1 handling deals with the 1012d18eecac712bfbf63372cb78940d662ce9017840Eli Friedman // former correctly, but not the latter; handle directly-overridden 1013d18eecac712bfbf63372cb78940d662ce9017840Eli Friedman // attributes here. 1014d18eecac712bfbf63372cb78940d662ce9017840Eli Friedman llvm::StringMap<unsigned> PrevFeature; 1015d18eecac712bfbf63372cb78940d662ce9017840Eli Friedman std::vector<const char*> Features; 1016cdd9686b890ebdc10039ae256ef4c9dfb5ebacb7Daniel Dunbar for (arg_iterator it = Args.filtered_begin(options::OPT_m_x86_Features_Group), 1017cdd9686b890ebdc10039ae256ef4c9dfb5ebacb7Daniel Dunbar ie = Args.filtered_end(); it != ie; ++it) { 10185f9e272e632e951b1efe824cd16acb4d96077930Chris Lattner StringRef Name = (*it)->getOption().getName(); 10197e4953e5c60409007545288f14b430bd23d68570Daniel Dunbar (*it)->claim(); 10206acda16e9c194dcbd0dea64341e182bdb65d0f41Daniel Dunbar 1021cdd9686b890ebdc10039ae256ef4c9dfb5ebacb7Daniel Dunbar // Skip over "-m". 1022cdd9686b890ebdc10039ae256ef4c9dfb5ebacb7Daniel Dunbar assert(Name.startswith("-m") && "Invalid feature name."); 1023cdd9686b890ebdc10039ae256ef4c9dfb5ebacb7Daniel Dunbar Name = Name.substr(2); 10246acda16e9c194dcbd0dea64341e182bdb65d0f41Daniel Dunbar 1025cdd9686b890ebdc10039ae256ef4c9dfb5ebacb7Daniel Dunbar bool IsNegative = Name.startswith("no-"); 1026cdd9686b890ebdc10039ae256ef4c9dfb5ebacb7Daniel Dunbar if (IsNegative) 1027cdd9686b890ebdc10039ae256ef4c9dfb5ebacb7Daniel Dunbar Name = Name.substr(3); 10286acda16e9c194dcbd0dea64341e182bdb65d0f41Daniel Dunbar 1029d18eecac712bfbf63372cb78940d662ce9017840Eli Friedman unsigned& Prev = PrevFeature[Name]; 1030d18eecac712bfbf63372cb78940d662ce9017840Eli Friedman if (Prev) 1031d18eecac712bfbf63372cb78940d662ce9017840Eli Friedman Features[Prev - 1] = 0; 1032d18eecac712bfbf63372cb78940d662ce9017840Eli Friedman Prev = Features.size() + 1; 1033d18eecac712bfbf63372cb78940d662ce9017840Eli Friedman Features.push_back(Args.MakeArgString((IsNegative ? "-" : "+") + Name)); 1034d18eecac712bfbf63372cb78940d662ce9017840Eli Friedman } 1035d18eecac712bfbf63372cb78940d662ce9017840Eli Friedman for (unsigned i = 0; i < Features.size(); i++) { 1036d18eecac712bfbf63372cb78940d662ce9017840Eli Friedman if (Features[i]) { 1037d18eecac712bfbf63372cb78940d662ce9017840Eli Friedman CmdArgs.push_back("-target-feature"); 1038d18eecac712bfbf63372cb78940d662ce9017840Eli Friedman CmdArgs.push_back(Features[i]); 1039d18eecac712bfbf63372cb78940d662ce9017840Eli Friedman } 10406acda16e9c194dcbd0dea64341e182bdb65d0f41Daniel Dunbar } 10416acda16e9c194dcbd0dea64341e182bdb65d0f41Daniel Dunbar} 10426acda16e9c194dcbd0dea64341e182bdb65d0f41Daniel Dunbar 10439631939f82c0eaa6fb3936a0ce58a41adfbc9011Tony Linthicumstatic Arg* getLastHexagonArchArg (const ArgList &Args) 10449631939f82c0eaa6fb3936a0ce58a41adfbc9011Tony Linthicum{ 10459631939f82c0eaa6fb3936a0ce58a41adfbc9011Tony Linthicum Arg * A = NULL; 10469631939f82c0eaa6fb3936a0ce58a41adfbc9011Tony Linthicum 104743115d4904431917ef6852ee089a8520b9940ba5Sebastian Pop for (ArgList::const_iterator it = Args.begin(), ie = Args.end(); 104843115d4904431917ef6852ee089a8520b9940ba5Sebastian Pop it != ie; ++it) { 104943115d4904431917ef6852ee089a8520b9940ba5Sebastian Pop if ((*it)->getOption().matches(options::OPT_march_EQ) || 10509631939f82c0eaa6fb3936a0ce58a41adfbc9011Tony Linthicum (*it)->getOption().matches(options::OPT_mcpu_EQ)) { 10519631939f82c0eaa6fb3936a0ce58a41adfbc9011Tony Linthicum A = *it; 10529631939f82c0eaa6fb3936a0ce58a41adfbc9011Tony Linthicum A->claim(); 10539631939f82c0eaa6fb3936a0ce58a41adfbc9011Tony Linthicum } 105443115d4904431917ef6852ee089a8520b9940ba5Sebastian Pop else if ((*it)->getOption().matches(options::OPT_m_Joined)){ 105543115d4904431917ef6852ee089a8520b9940ba5Sebastian Pop StringRef Value = (*it)->getValue(Args,0); 105643115d4904431917ef6852ee089a8520b9940ba5Sebastian Pop if (Value.startswith("v")) { 105743115d4904431917ef6852ee089a8520b9940ba5Sebastian Pop A = *it; 105843115d4904431917ef6852ee089a8520b9940ba5Sebastian Pop A->claim(); 105943115d4904431917ef6852ee089a8520b9940ba5Sebastian Pop } 106043115d4904431917ef6852ee089a8520b9940ba5Sebastian Pop } 10619631939f82c0eaa6fb3936a0ce58a41adfbc9011Tony Linthicum } 10629631939f82c0eaa6fb3936a0ce58a41adfbc9011Tony Linthicum return A; 10639631939f82c0eaa6fb3936a0ce58a41adfbc9011Tony Linthicum} 10649631939f82c0eaa6fb3936a0ce58a41adfbc9011Tony Linthicum 106543115d4904431917ef6852ee089a8520b9940ba5Sebastian Popstatic StringRef getHexagonTargetCPU(const ArgList &Args) 10669631939f82c0eaa6fb3936a0ce58a41adfbc9011Tony Linthicum{ 10679631939f82c0eaa6fb3936a0ce58a41adfbc9011Tony Linthicum Arg *A; 10689631939f82c0eaa6fb3936a0ce58a41adfbc9011Tony Linthicum llvm::StringRef WhichHexagon; 10699631939f82c0eaa6fb3936a0ce58a41adfbc9011Tony Linthicum 107043115d4904431917ef6852ee089a8520b9940ba5Sebastian Pop // Select the default CPU (v4) if none was given or detection failed. 10719631939f82c0eaa6fb3936a0ce58a41adfbc9011Tony Linthicum if ((A = getLastHexagonArchArg (Args))) { 107243115d4904431917ef6852ee089a8520b9940ba5Sebastian Pop WhichHexagon = A->getValue(Args); 107343115d4904431917ef6852ee089a8520b9940ba5Sebastian Pop if (WhichHexagon == "") 107443115d4904431917ef6852ee089a8520b9940ba5Sebastian Pop return "v4"; 107543115d4904431917ef6852ee089a8520b9940ba5Sebastian Pop else 107643115d4904431917ef6852ee089a8520b9940ba5Sebastian Pop return WhichHexagon; 10779631939f82c0eaa6fb3936a0ce58a41adfbc9011Tony Linthicum } 107843115d4904431917ef6852ee089a8520b9940ba5Sebastian Pop else 107943115d4904431917ef6852ee089a8520b9940ba5Sebastian Pop return "v4"; 10809631939f82c0eaa6fb3936a0ce58a41adfbc9011Tony Linthicum} 10819631939f82c0eaa6fb3936a0ce58a41adfbc9011Tony Linthicum 10829631939f82c0eaa6fb3936a0ce58a41adfbc9011Tony Linthicumvoid Clang::AddHexagonTargetArgs(const ArgList &Args, 10839631939f82c0eaa6fb3936a0ce58a41adfbc9011Tony Linthicum ArgStringList &CmdArgs) const { 10849631939f82c0eaa6fb3936a0ce58a41adfbc9011Tony Linthicum llvm::Triple Triple = getToolChain().getTriple(); 10859631939f82c0eaa6fb3936a0ce58a41adfbc9011Tony Linthicum 10869631939f82c0eaa6fb3936a0ce58a41adfbc9011Tony Linthicum CmdArgs.push_back("-target-cpu"); 108743115d4904431917ef6852ee089a8520b9940ba5Sebastian Pop CmdArgs.push_back(Args.MakeArgString("hexagon" + getHexagonTargetCPU(Args))); 10889631939f82c0eaa6fb3936a0ce58a41adfbc9011Tony Linthicum CmdArgs.push_back("-fno-signed-char"); 10899631939f82c0eaa6fb3936a0ce58a41adfbc9011Tony Linthicum CmdArgs.push_back("-nobuiltininc"); 10909631939f82c0eaa6fb3936a0ce58a41adfbc9011Tony Linthicum 10915f9688b7c7fdeafdf530056d49f82d2ec6ca457fSirish Pande if (Args.hasArg(options::OPT_mqdsp6_compat)) 10929631939f82c0eaa6fb3936a0ce58a41adfbc9011Tony Linthicum CmdArgs.push_back("-mqdsp6-compat"); 10939631939f82c0eaa6fb3936a0ce58a41adfbc9011Tony Linthicum 10949631939f82c0eaa6fb3936a0ce58a41adfbc9011Tony Linthicum if (Arg *A = Args.getLastArg(options::OPT_G, 10959631939f82c0eaa6fb3936a0ce58a41adfbc9011Tony Linthicum options::OPT_msmall_data_threshold_EQ)) { 10969631939f82c0eaa6fb3936a0ce58a41adfbc9011Tony Linthicum std::string SmallDataThreshold="-small-data-threshold="; 10979631939f82c0eaa6fb3936a0ce58a41adfbc9011Tony Linthicum SmallDataThreshold += A->getValue(Args); 10989631939f82c0eaa6fb3936a0ce58a41adfbc9011Tony Linthicum CmdArgs.push_back ("-mllvm"); 10999631939f82c0eaa6fb3936a0ce58a41adfbc9011Tony Linthicum CmdArgs.push_back(Args.MakeArgString(SmallDataThreshold)); 11009631939f82c0eaa6fb3936a0ce58a41adfbc9011Tony Linthicum A->claim(); 11019631939f82c0eaa6fb3936a0ce58a41adfbc9011Tony Linthicum } 11029631939f82c0eaa6fb3936a0ce58a41adfbc9011Tony Linthicum 11035f9688b7c7fdeafdf530056d49f82d2ec6ca457fSirish Pande if (!Args.hasArg(options::OPT_fno_short_enums)) 11045f9688b7c7fdeafdf530056d49f82d2ec6ca457fSirish Pande CmdArgs.push_back("-fshort-enums"); 11055f9688b7c7fdeafdf530056d49f82d2ec6ca457fSirish Pande if (Args.getLastArg(options::OPT_mieee_rnd_near)) { 11065f9688b7c7fdeafdf530056d49f82d2ec6ca457fSirish Pande CmdArgs.push_back ("-mllvm"); 11075f9688b7c7fdeafdf530056d49f82d2ec6ca457fSirish Pande CmdArgs.push_back ("-enable-hexagon-ieee-rnd-near"); 11085f9688b7c7fdeafdf530056d49f82d2ec6ca457fSirish Pande } 11099631939f82c0eaa6fb3936a0ce58a41adfbc9011Tony Linthicum CmdArgs.push_back ("-mllvm"); 11109631939f82c0eaa6fb3936a0ce58a41adfbc9011Tony Linthicum CmdArgs.push_back ("-machine-sink-split=0"); 11119631939f82c0eaa6fb3936a0ce58a41adfbc9011Tony Linthicum} 11129631939f82c0eaa6fb3936a0ce58a41adfbc9011Tony Linthicum 111388b7cf00fcb582728c642da3927c59468efaf926Eric Christopherstatic bool 1114d71315c5511bd1204732216964faa6254dc4b2b6John McCallshouldUseExceptionTablesForObjCExceptions(unsigned objcABIVersion, 1115525544de0835d5ee7497f4897e255727b162e0aaAnders Carlsson const llvm::Triple &Triple) { 1116525544de0835d5ee7497f4897e255727b162e0aaAnders Carlsson // We use the zero-cost exception tables for Objective-C if the non-fragile 1117525544de0835d5ee7497f4897e255727b162e0aaAnders Carlsson // ABI is enabled or when compiling for x86_64 and ARM on Snow Leopard and 1118525544de0835d5ee7497f4897e255727b162e0aaAnders Carlsson // later. 1119525544de0835d5ee7497f4897e255727b162e0aaAnders Carlsson 1120d71315c5511bd1204732216964faa6254dc4b2b6John McCall if (objcABIVersion >= 2) 1121525544de0835d5ee7497f4897e255727b162e0aaAnders Carlsson return true; 1122525544de0835d5ee7497f4897e255727b162e0aaAnders Carlsson 1123905c45f15a25598620d19160c139c6b785aeea89Bob Wilson if (!Triple.isOSDarwin()) 1124525544de0835d5ee7497f4897e255727b162e0aaAnders Carlsson return false; 1125525544de0835d5ee7497f4897e255727b162e0aaAnders Carlsson 1126aa7333c860ac651c75da495217e0d6a9c10c0bb0Eric Christopher return (!Triple.isMacOSXVersionLT(10,5) && 1127525544de0835d5ee7497f4897e255727b162e0aaAnders Carlsson (Triple.getArch() == llvm::Triple::x86_64 || 112888b7cf00fcb582728c642da3927c59468efaf926Eric Christopher Triple.getArch() == llvm::Triple::arm)); 1129525544de0835d5ee7497f4897e255727b162e0aaAnders Carlsson} 1130525544de0835d5ee7497f4897e255727b162e0aaAnders Carlsson 113115348aeb81285c75b2e92b5bf8d2db3445d147c2Anders Carlsson/// addExceptionArgs - Adds exception related arguments to the driver command 113215348aeb81285c75b2e92b5bf8d2db3445d147c2Anders Carlsson/// arguments. There's a master flag, -fexceptions and also language specific 113315348aeb81285c75b2e92b5bf8d2db3445d147c2Anders Carlsson/// flags to enable/disable C++ and Objective-C exceptions. 113415348aeb81285c75b2e92b5bf8d2db3445d147c2Anders Carlsson/// This makes it possible to for example disable C++ exceptions but enable 113515348aeb81285c75b2e92b5bf8d2db3445d147c2Anders Carlsson/// Objective-C exceptions. 113615348aeb81285c75b2e92b5bf8d2db3445d147c2Anders Carlssonstatic void addExceptionArgs(const ArgList &Args, types::ID InputType, 113715348aeb81285c75b2e92b5bf8d2db3445d147c2Anders Carlsson const llvm::Triple &Triple, 113815b77319d0ce4332275992b2f191898a1df50efeFariborz Jahanian bool KernelOrKext, 1139d71315c5511bd1204732216964faa6254dc4b2b6John McCall unsigned objcABIVersion, 114015348aeb81285c75b2e92b5bf8d2db3445d147c2Anders Carlsson ArgStringList &CmdArgs) { 1141afc4baa37c2f38fadf05b15456b10a0994d51b0bChad Rosier if (KernelOrKext) { 1142afc4baa37c2f38fadf05b15456b10a0994d51b0bChad Rosier // -mkernel and -fapple-kext imply no exceptions, so claim exception related 1143afc4baa37c2f38fadf05b15456b10a0994d51b0bChad Rosier // arguments now to avoid warnings about unused arguments. 1144afc4baa37c2f38fadf05b15456b10a0994d51b0bChad Rosier Args.ClaimAllArgs(options::OPT_fexceptions); 1145afc4baa37c2f38fadf05b15456b10a0994d51b0bChad Rosier Args.ClaimAllArgs(options::OPT_fno_exceptions); 1146afc4baa37c2f38fadf05b15456b10a0994d51b0bChad Rosier Args.ClaimAllArgs(options::OPT_fobjc_exceptions); 1147afc4baa37c2f38fadf05b15456b10a0994d51b0bChad Rosier Args.ClaimAllArgs(options::OPT_fno_objc_exceptions); 1148afc4baa37c2f38fadf05b15456b10a0994d51b0bChad Rosier Args.ClaimAllArgs(options::OPT_fcxx_exceptions); 1149afc4baa37c2f38fadf05b15456b10a0994d51b0bChad Rosier Args.ClaimAllArgs(options::OPT_fno_cxx_exceptions); 115015348aeb81285c75b2e92b5bf8d2db3445d147c2Anders Carlsson return; 1151afc4baa37c2f38fadf05b15456b10a0994d51b0bChad Rosier } 115215348aeb81285c75b2e92b5bf8d2db3445d147c2Anders Carlsson 115315348aeb81285c75b2e92b5bf8d2db3445d147c2Anders Carlsson // Exceptions are enabled by default. 115415348aeb81285c75b2e92b5bf8d2db3445d147c2Anders Carlsson bool ExceptionsEnabled = true; 115515348aeb81285c75b2e92b5bf8d2db3445d147c2Anders Carlsson 115615348aeb81285c75b2e92b5bf8d2db3445d147c2Anders Carlsson // This keeps track of whether exceptions were explicitly turned on or off. 115715348aeb81285c75b2e92b5bf8d2db3445d147c2Anders Carlsson bool DidHaveExplicitExceptionFlag = false; 115815348aeb81285c75b2e92b5bf8d2db3445d147c2Anders Carlsson 1159f759df06d997050559fd925758bcd2cdef24db05Rafael Espindola if (Arg *A = Args.getLastArg(options::OPT_fexceptions, 1160f759df06d997050559fd925758bcd2cdef24db05Rafael Espindola options::OPT_fno_exceptions)) { 1161f759df06d997050559fd925758bcd2cdef24db05Rafael Espindola if (A->getOption().matches(options::OPT_fexceptions)) 116215348aeb81285c75b2e92b5bf8d2db3445d147c2Anders Carlsson ExceptionsEnabled = true; 116388b7cf00fcb582728c642da3927c59468efaf926Eric Christopher else 116415348aeb81285c75b2e92b5bf8d2db3445d147c2Anders Carlsson ExceptionsEnabled = false; 116515348aeb81285c75b2e92b5bf8d2db3445d147c2Anders Carlsson 116615348aeb81285c75b2e92b5bf8d2db3445d147c2Anders Carlsson DidHaveExplicitExceptionFlag = true; 1167f759df06d997050559fd925758bcd2cdef24db05Rafael Espindola } 11681a2cd4fd5d384faf171a39dea7136ca4672ac35eDaniel Dunbar 116915348aeb81285c75b2e92b5bf8d2db3445d147c2Anders Carlsson bool ShouldUseExceptionTables = false; 117015348aeb81285c75b2e92b5bf8d2db3445d147c2Anders Carlsson 117115348aeb81285c75b2e92b5bf8d2db3445d147c2Anders Carlsson // Exception tables and cleanups can be enabled with -fexceptions even if the 117215348aeb81285c75b2e92b5bf8d2db3445d147c2Anders Carlsson // language itself doesn't support exceptions. 117315348aeb81285c75b2e92b5bf8d2db3445d147c2Anders Carlsson if (ExceptionsEnabled && DidHaveExplicitExceptionFlag) 117415348aeb81285c75b2e92b5bf8d2db3445d147c2Anders Carlsson ShouldUseExceptionTables = true; 117515348aeb81285c75b2e92b5bf8d2db3445d147c2Anders Carlsson 1176d47ea693706f7b0ffa68e879b73a71609a337786Daniel Dunbar // Obj-C exceptions are enabled by default, regardless of -fexceptions. This 1177d47ea693706f7b0ffa68e879b73a71609a337786Daniel Dunbar // is not necessarily sensible, but follows GCC. 1178d47ea693706f7b0ffa68e879b73a71609a337786Daniel Dunbar if (types::isObjC(InputType) && 117988b7cf00fcb582728c642da3927c59468efaf926Eric Christopher Args.hasFlag(options::OPT_fobjc_exceptions, 1180d47ea693706f7b0ffa68e879b73a71609a337786Daniel Dunbar options::OPT_fno_objc_exceptions, 1181d47ea693706f7b0ffa68e879b73a71609a337786Daniel Dunbar true)) { 1182d47ea693706f7b0ffa68e879b73a71609a337786Daniel Dunbar CmdArgs.push_back("-fobjc-exceptions"); 1183d47ea693706f7b0ffa68e879b73a71609a337786Daniel Dunbar 118488b7cf00fcb582728c642da3927c59468efaf926Eric Christopher ShouldUseExceptionTables |= 1185d71315c5511bd1204732216964faa6254dc4b2b6John McCall shouldUseExceptionTablesForObjCExceptions(objcABIVersion, Triple); 118615348aeb81285c75b2e92b5bf8d2db3445d147c2Anders Carlsson } 118785caf03ee49c4de87ee9624a9b725ef5d20ee624Fariborz Jahanian 118815348aeb81285c75b2e92b5bf8d2db3445d147c2Anders Carlsson if (types::isCXX(InputType)) { 118915348aeb81285c75b2e92b5bf8d2db3445d147c2Anders Carlsson bool CXXExceptionsEnabled = ExceptionsEnabled; 11901a2cd4fd5d384faf171a39dea7136ca4672ac35eDaniel Dunbar 119188b7cf00fcb582728c642da3927c59468efaf926Eric Christopher if (Arg *A = Args.getLastArg(options::OPT_fcxx_exceptions, 119288b7cf00fcb582728c642da3927c59468efaf926Eric Christopher options::OPT_fno_cxx_exceptions, 119315348aeb81285c75b2e92b5bf8d2db3445d147c2Anders Carlsson options::OPT_fexceptions, 119415348aeb81285c75b2e92b5bf8d2db3445d147c2Anders Carlsson options::OPT_fno_exceptions)) { 119515348aeb81285c75b2e92b5bf8d2db3445d147c2Anders Carlsson if (A->getOption().matches(options::OPT_fcxx_exceptions)) 119615348aeb81285c75b2e92b5bf8d2db3445d147c2Anders Carlsson CXXExceptionsEnabled = true; 119743f220f6d74e01f2606e429810484177903a28e6Chandler Carruth else if (A->getOption().matches(options::OPT_fno_cxx_exceptions)) 119815348aeb81285c75b2e92b5bf8d2db3445d147c2Anders Carlsson CXXExceptionsEnabled = false; 119915348aeb81285c75b2e92b5bf8d2db3445d147c2Anders Carlsson } 120015348aeb81285c75b2e92b5bf8d2db3445d147c2Anders Carlsson 120115348aeb81285c75b2e92b5bf8d2db3445d147c2Anders Carlsson if (CXXExceptionsEnabled) { 120215348aeb81285c75b2e92b5bf8d2db3445d147c2Anders Carlsson CmdArgs.push_back("-fcxx-exceptions"); 120315348aeb81285c75b2e92b5bf8d2db3445d147c2Anders Carlsson 120415348aeb81285c75b2e92b5bf8d2db3445d147c2Anders Carlsson ShouldUseExceptionTables = true; 120515348aeb81285c75b2e92b5bf8d2db3445d147c2Anders Carlsson } 120615348aeb81285c75b2e92b5bf8d2db3445d147c2Anders Carlsson } 120715348aeb81285c75b2e92b5bf8d2db3445d147c2Anders Carlsson 120815348aeb81285c75b2e92b5bf8d2db3445d147c2Anders Carlsson if (ShouldUseExceptionTables) 120915348aeb81285c75b2e92b5bf8d2db3445d147c2Anders Carlsson CmdArgs.push_back("-fexceptions"); 1210f759df06d997050559fd925758bcd2cdef24db05Rafael Espindola} 1211f759df06d997050559fd925758bcd2cdef24db05Rafael Espindola 121261b1efe2d0b459a98962fd9b4c097ad8bb9bfdecRafael Espindolastatic bool ShouldDisableCFI(const ArgList &Args, 121361b1efe2d0b459a98962fd9b4c097ad8bb9bfdecRafael Espindola const ToolChain &TC) { 1214701ec8d11039fd0c571312253e6b15f22f29c592Rafael Espindola bool Default = true; 1215905c45f15a25598620d19160c139c6b785aeea89Bob Wilson if (TC.getTriple().isOSDarwin()) { 121697f6abb4470a82be4a8c6f1603e7bb303f9079b5Rafael Espindola // The native darwin assembler doesn't support cfi directives, so 1217cb773921b1e8e7cf2a5dba25bd596d4f258a9daaRafael Espindola // we disable them if we think the .s file will be passed to it. 1218701ec8d11039fd0c571312253e6b15f22f29c592Rafael Espindola Default = Args.hasFlag(options::OPT_integrated_as, 1219701ec8d11039fd0c571312253e6b15f22f29c592Rafael Espindola options::OPT_no_integrated_as, 1220701ec8d11039fd0c571312253e6b15f22f29c592Rafael Espindola TC.IsIntegratedAssemblerDefault()); 122197f6abb4470a82be4a8c6f1603e7bb303f9079b5Rafael Espindola } 1222701ec8d11039fd0c571312253e6b15f22f29c592Rafael Espindola return !Args.hasFlag(options::OPT_fdwarf2_cfi_asm, 1223701ec8d11039fd0c571312253e6b15f22f29c592Rafael Espindola options::OPT_fno_dwarf2_cfi_asm, 1224701ec8d11039fd0c571312253e6b15f22f29c592Rafael Espindola Default); 122561b1efe2d0b459a98962fd9b4c097ad8bb9bfdecRafael Espindola} 122661b1efe2d0b459a98962fd9b4c097ad8bb9bfdecRafael Espindola 1227ea523d73a6de06f828952a02f5ff86e4cc631695Nick Lewyckystatic bool ShouldDisableDwarfDirectory(const ArgList &Args, 1228ea523d73a6de06f828952a02f5ff86e4cc631695Nick Lewycky const ToolChain &TC) { 1229ea523d73a6de06f828952a02f5ff86e4cc631695Nick Lewycky bool IsIADefault = TC.IsIntegratedAssemblerDefault(); 1230ea523d73a6de06f828952a02f5ff86e4cc631695Nick Lewycky bool UseIntegratedAs = Args.hasFlag(options::OPT_integrated_as, 1231ea523d73a6de06f828952a02f5ff86e4cc631695Nick Lewycky options::OPT_no_integrated_as, 1232ea523d73a6de06f828952a02f5ff86e4cc631695Nick Lewycky IsIADefault); 1233ea523d73a6de06f828952a02f5ff86e4cc631695Nick Lewycky bool UseDwarfDirectory = Args.hasFlag(options::OPT_fdwarf_directory_asm, 1234ea523d73a6de06f828952a02f5ff86e4cc631695Nick Lewycky options::OPT_fno_dwarf_directory_asm, 1235ea523d73a6de06f828952a02f5ff86e4cc631695Nick Lewycky UseIntegratedAs); 1236ea523d73a6de06f828952a02f5ff86e4cc631695Nick Lewycky return !UseDwarfDirectory; 1237ea523d73a6de06f828952a02f5ff86e4cc631695Nick Lewycky} 1238ea523d73a6de06f828952a02f5ff86e4cc631695Nick Lewycky 1239359cf927cf4980099a04b3f3cf040b81d181fe3dJoerg Sonnenberger/// \brief Check whether the given input tree contains any compilation actions. 1240359cf927cf4980099a04b3f3cf040b81d181fe3dJoerg Sonnenbergerstatic bool ContainsCompileAction(const Action *A) { 12415f9e272e632e951b1efe824cd16acb4d96077930Chris Lattner if (isa<CompileJobAction>(A)) 1242359cf927cf4980099a04b3f3cf040b81d181fe3dJoerg Sonnenberger return true; 1243359cf927cf4980099a04b3f3cf040b81d181fe3dJoerg Sonnenberger 1244359cf927cf4980099a04b3f3cf040b81d181fe3dJoerg Sonnenberger for (Action::const_iterator it = A->begin(), ie = A->end(); it != ie; ++it) 1245359cf927cf4980099a04b3f3cf040b81d181fe3dJoerg Sonnenberger if (ContainsCompileAction(*it)) 1246359cf927cf4980099a04b3f3cf040b81d181fe3dJoerg Sonnenberger return true; 1247359cf927cf4980099a04b3f3cf040b81d181fe3dJoerg Sonnenberger 1248359cf927cf4980099a04b3f3cf040b81d181fe3dJoerg Sonnenberger return false; 1249359cf927cf4980099a04b3f3cf040b81d181fe3dJoerg Sonnenberger} 1250359cf927cf4980099a04b3f3cf040b81d181fe3dJoerg Sonnenberger 1251359cf927cf4980099a04b3f3cf040b81d181fe3dJoerg Sonnenberger/// \brief Check if -relax-all should be passed to the internal assembler. 1252359cf927cf4980099a04b3f3cf040b81d181fe3dJoerg Sonnenberger/// This is done by default when compiling non-assembler source with -O0. 1253359cf927cf4980099a04b3f3cf040b81d181fe3dJoerg Sonnenbergerstatic bool UseRelaxAll(Compilation &C, const ArgList &Args) { 1254359cf927cf4980099a04b3f3cf040b81d181fe3dJoerg Sonnenberger bool RelaxDefault = true; 1255359cf927cf4980099a04b3f3cf040b81d181fe3dJoerg Sonnenberger 1256359cf927cf4980099a04b3f3cf040b81d181fe3dJoerg Sonnenberger if (Arg *A = Args.getLastArg(options::OPT_O_Group)) 1257359cf927cf4980099a04b3f3cf040b81d181fe3dJoerg Sonnenberger RelaxDefault = A->getOption().matches(options::OPT_O0); 1258359cf927cf4980099a04b3f3cf040b81d181fe3dJoerg Sonnenberger 1259359cf927cf4980099a04b3f3cf040b81d181fe3dJoerg Sonnenberger if (RelaxDefault) { 1260359cf927cf4980099a04b3f3cf040b81d181fe3dJoerg Sonnenberger RelaxDefault = false; 1261359cf927cf4980099a04b3f3cf040b81d181fe3dJoerg Sonnenberger for (ActionList::const_iterator it = C.getActions().begin(), 1262359cf927cf4980099a04b3f3cf040b81d181fe3dJoerg Sonnenberger ie = C.getActions().end(); it != ie; ++it) { 1263359cf927cf4980099a04b3f3cf040b81d181fe3dJoerg Sonnenberger if (ContainsCompileAction(*it)) { 1264359cf927cf4980099a04b3f3cf040b81d181fe3dJoerg Sonnenberger RelaxDefault = true; 1265359cf927cf4980099a04b3f3cf040b81d181fe3dJoerg Sonnenberger break; 1266359cf927cf4980099a04b3f3cf040b81d181fe3dJoerg Sonnenberger } 1267359cf927cf4980099a04b3f3cf040b81d181fe3dJoerg Sonnenberger } 1268359cf927cf4980099a04b3f3cf040b81d181fe3dJoerg Sonnenberger } 1269359cf927cf4980099a04b3f3cf040b81d181fe3dJoerg Sonnenberger 1270359cf927cf4980099a04b3f3cf040b81d181fe3dJoerg Sonnenberger return Args.hasFlag(options::OPT_mrelax_all, options::OPT_mno_relax_all, 1271359cf927cf4980099a04b3f3cf040b81d181fe3dJoerg Sonnenberger RelaxDefault); 1272359cf927cf4980099a04b3f3cf040b81d181fe3dJoerg Sonnenberger} 1273359cf927cf4980099a04b3f3cf040b81d181fe3dJoerg Sonnenberger 1274dff466c0791465f929a1d8cd551d4c84b360ba32Kostya Serebryany/// If AddressSanitizer is enabled, add appropriate linker flags (Linux). 1275dff466c0791465f929a1d8cd551d4c84b360ba32Kostya Serebryany/// This needs to be called before we add the C run-time (malloc, etc). 1276dff466c0791465f929a1d8cd551d4c84b360ba32Kostya Serebryanystatic void addAsanRTLinux(const ToolChain &TC, const ArgList &Args, 12777b5f1013c5b7f541dc1fae7fc43189377874eabbKostya Serebryany ArgStringList &CmdArgs) { 1278a6ddc02921d47d0a1dc9ffe4d31438f250751e05Evgeniy Stepanov if (!Args.hasFlag(options::OPT_faddress_sanitizer, 1279dff466c0791465f929a1d8cd551d4c84b360ba32Kostya Serebryany options::OPT_fno_address_sanitizer, false)) 1280dff466c0791465f929a1d8cd551d4c84b360ba32Kostya Serebryany return; 1281a6ddc02921d47d0a1dc9ffe4d31438f250751e05Evgeniy Stepanov if(TC.getTriple().getEnvironment() == llvm::Triple::ANDROIDEABI) { 1282a6ddc02921d47d0a1dc9ffe4d31438f250751e05Evgeniy Stepanov if (!Args.hasArg(options::OPT_shared)) { 1283a6ddc02921d47d0a1dc9ffe4d31438f250751e05Evgeniy Stepanov // For an executable, we add a .preinit_array stub. 1284a6ddc02921d47d0a1dc9ffe4d31438f250751e05Evgeniy Stepanov CmdArgs.push_back("-u"); 1285a6ddc02921d47d0a1dc9ffe4d31438f250751e05Evgeniy Stepanov CmdArgs.push_back("__asan_preinit"); 1286a6ddc02921d47d0a1dc9ffe4d31438f250751e05Evgeniy Stepanov CmdArgs.push_back("-lasan"); 1287a6ddc02921d47d0a1dc9ffe4d31438f250751e05Evgeniy Stepanov } 12888cd0d25df91d7172bfd0ed6013f89ad0083ce301Daniel Dunbar 1289a6ddc02921d47d0a1dc9ffe4d31438f250751e05Evgeniy Stepanov CmdArgs.push_back("-lasan_preload"); 1290a6ddc02921d47d0a1dc9ffe4d31438f250751e05Evgeniy Stepanov CmdArgs.push_back("-ldl"); 1291a6ddc02921d47d0a1dc9ffe4d31438f250751e05Evgeniy Stepanov } else { 1292a6ddc02921d47d0a1dc9ffe4d31438f250751e05Evgeniy Stepanov if (!Args.hasArg(options::OPT_shared)) { 1293a6ddc02921d47d0a1dc9ffe4d31438f250751e05Evgeniy Stepanov // LibAsan is "libclang_rt.asan-<ArchName>.a" in the Linux library 1294a6ddc02921d47d0a1dc9ffe4d31438f250751e05Evgeniy Stepanov // resource directory. 1295a6ddc02921d47d0a1dc9ffe4d31438f250751e05Evgeniy Stepanov SmallString<128> LibAsan(TC.getDriver().ResourceDir); 1296a6ddc02921d47d0a1dc9ffe4d31438f250751e05Evgeniy Stepanov llvm::sys::path::append(LibAsan, "lib", "linux", 1297a6ddc02921d47d0a1dc9ffe4d31438f250751e05Evgeniy Stepanov (Twine("libclang_rt.asan-") + 1298a6ddc02921d47d0a1dc9ffe4d31438f250751e05Evgeniy Stepanov TC.getArchName() + ".a")); 1299a6ddc02921d47d0a1dc9ffe4d31438f250751e05Evgeniy Stepanov CmdArgs.push_back(Args.MakeArgString(LibAsan)); 1300a6ddc02921d47d0a1dc9ffe4d31438f250751e05Evgeniy Stepanov CmdArgs.push_back("-lpthread"); 1301a6ddc02921d47d0a1dc9ffe4d31438f250751e05Evgeniy Stepanov CmdArgs.push_back("-ldl"); 1302a6ddc02921d47d0a1dc9ffe4d31438f250751e05Evgeniy Stepanov CmdArgs.push_back("-export-dynamic"); 1303a6ddc02921d47d0a1dc9ffe4d31438f250751e05Evgeniy Stepanov } 1304a6ddc02921d47d0a1dc9ffe4d31438f250751e05Evgeniy Stepanov } 1305dff466c0791465f929a1d8cd551d4c84b360ba32Kostya Serebryany} 1306dff466c0791465f929a1d8cd551d4c84b360ba32Kostya Serebryany 1307f7efb0e7478da45bc7f2d24dbeb08406d2399591Kostya Serebryany/// If ThreadSanitizer is enabled, add appropriate linker flags (Linux). 1308f7efb0e7478da45bc7f2d24dbeb08406d2399591Kostya Serebryany/// This needs to be called before we add the C run-time (malloc, etc). 1309f7efb0e7478da45bc7f2d24dbeb08406d2399591Kostya Serebryanystatic void addTsanRTLinux(const ToolChain &TC, const ArgList &Args, 1310f7efb0e7478da45bc7f2d24dbeb08406d2399591Kostya Serebryany ArgStringList &CmdArgs) { 1311f7efb0e7478da45bc7f2d24dbeb08406d2399591Kostya Serebryany if (!Args.hasFlag(options::OPT_fthread_sanitizer, 1312f7efb0e7478da45bc7f2d24dbeb08406d2399591Kostya Serebryany options::OPT_fno_thread_sanitizer, false)) 1313f7efb0e7478da45bc7f2d24dbeb08406d2399591Kostya Serebryany return; 1314f7efb0e7478da45bc7f2d24dbeb08406d2399591Kostya Serebryany if (!Args.hasArg(options::OPT_shared)) { 1315f7efb0e7478da45bc7f2d24dbeb08406d2399591Kostya Serebryany // LibTsan is "libclang_rt.tsan-<ArchName>.a" in the Linux library 1316f7efb0e7478da45bc7f2d24dbeb08406d2399591Kostya Serebryany // resource directory. 1317f7efb0e7478da45bc7f2d24dbeb08406d2399591Kostya Serebryany SmallString<128> LibTsan(TC.getDriver().ResourceDir); 1318f7efb0e7478da45bc7f2d24dbeb08406d2399591Kostya Serebryany llvm::sys::path::append(LibTsan, "lib", "linux", 1319f7efb0e7478da45bc7f2d24dbeb08406d2399591Kostya Serebryany (Twine("libclang_rt.tsan-") + 1320f7efb0e7478da45bc7f2d24dbeb08406d2399591Kostya Serebryany TC.getArchName() + ".a")); 1321f7efb0e7478da45bc7f2d24dbeb08406d2399591Kostya Serebryany CmdArgs.push_back(Args.MakeArgString(LibTsan)); 1322f7efb0e7478da45bc7f2d24dbeb08406d2399591Kostya Serebryany CmdArgs.push_back("-lpthread"); 1323f7efb0e7478da45bc7f2d24dbeb08406d2399591Kostya Serebryany CmdArgs.push_back("-ldl"); 1324f7efb0e7478da45bc7f2d24dbeb08406d2399591Kostya Serebryany CmdArgs.push_back("-export-dynamic"); 1325f7efb0e7478da45bc7f2d24dbeb08406d2399591Kostya Serebryany } 1326f7efb0e7478da45bc7f2d24dbeb08406d2399591Kostya Serebryany} 1327f7efb0e7478da45bc7f2d24dbeb08406d2399591Kostya Serebryany 13286af27ec69560f7e4b0dac4a0b4341cd6062f6852Rafael Espindolastatic bool shouldUseFramePointer(const ArgList &Args, 13296af27ec69560f7e4b0dac4a0b4341cd6062f6852Rafael Espindola const llvm::Triple &Triple) { 13306af27ec69560f7e4b0dac4a0b4341cd6062f6852Rafael Espindola if (Arg *A = Args.getLastArg(options::OPT_fno_omit_frame_pointer, 13316af27ec69560f7e4b0dac4a0b4341cd6062f6852Rafael Espindola options::OPT_fomit_frame_pointer)) 13326af27ec69560f7e4b0dac4a0b4341cd6062f6852Rafael Espindola return A->getOption().matches(options::OPT_fno_omit_frame_pointer); 13336af27ec69560f7e4b0dac4a0b4341cd6062f6852Rafael Espindola 1334a2a178989b2f6623b6a8ccf73dc0ccd98ee5bdf9Rafael Espindola // Don't use a frame pointer on linux x86 and x86_64 if optimizing. 13356af27ec69560f7e4b0dac4a0b4341cd6062f6852Rafael Espindola if ((Triple.getArch() == llvm::Triple::x86_64 || 13366af27ec69560f7e4b0dac4a0b4341cd6062f6852Rafael Espindola Triple.getArch() == llvm::Triple::x86) && 13376af27ec69560f7e4b0dac4a0b4341cd6062f6852Rafael Espindola Triple.getOS() == llvm::Triple::Linux) { 13386af27ec69560f7e4b0dac4a0b4341cd6062f6852Rafael Espindola if (Arg *A = Args.getLastArg(options::OPT_O_Group)) 13396af27ec69560f7e4b0dac4a0b4341cd6062f6852Rafael Espindola if (!A->getOption().matches(options::OPT_O0)) 13406af27ec69560f7e4b0dac4a0b4341cd6062f6852Rafael Espindola return false; 13416af27ec69560f7e4b0dac4a0b4341cd6062f6852Rafael Espindola } 13426af27ec69560f7e4b0dac4a0b4341cd6062f6852Rafael Espindola 13436af27ec69560f7e4b0dac4a0b4341cd6062f6852Rafael Espindola return true; 13446af27ec69560f7e4b0dac4a0b4341cd6062f6852Rafael Espindola} 13456af27ec69560f7e4b0dac4a0b4341cd6062f6852Rafael Espindola 134647ac7d27c44bd64a7d0fc03d4babc196cf2b8230Daniel Dunbarvoid Clang::ConstructJob(Compilation &C, const JobAction &JA, 1347871adcf4e41285e3f4c3b62eaa1b2e05b60b92daDaniel Dunbar const InputInfo &Output, 134862cf601812e03dd9bc5df42b8ef06a0cdedc38bfDaniel Dunbar const InputInfoList &Inputs, 13491d46033f760ba5fd266ce59fe391fac473f04f52Daniel Dunbar const ArgList &Args, 135047ac7d27c44bd64a7d0fc03d4babc196cf2b8230Daniel Dunbar const char *LinkingOutput) const { 13510a80ba74ffa3d3df55abfbc4474d7470c7c923e3Daniel Dunbar bool KernelOrKext = Args.hasArg(options::OPT_mkernel, 13520a80ba74ffa3d3df55abfbc4474d7470c7c923e3Daniel Dunbar options::OPT_fapple_kext); 1353ee788e70fcd0adf76103b17c78ac658d4ea30c9bDaniel Dunbar const Driver &D = getToolChain().getDriver(); 1354b488c1dac8e53206f07103d794a62a3f5012c0f4Daniel Dunbar ArgStringList CmdArgs; 1355b488c1dac8e53206f07103d794a62a3f5012c0f4Daniel Dunbar 1356077ba6a3ac3628afb0d3c460e81ce013bccbdbedDaniel Dunbar assert(Inputs.size() == 1 && "Unable to handle multiple inputs."); 1357077ba6a3ac3628afb0d3c460e81ce013bccbdbedDaniel Dunbar 13588ff5b28d6efcffe2251e77634c7edf83a4763344Daniel Dunbar // Invoke ourselves in -cc1 mode. 13598ff5b28d6efcffe2251e77634c7edf83a4763344Daniel Dunbar // 13608ff5b28d6efcffe2251e77634c7edf83a4763344Daniel Dunbar // FIXME: Implement custom jobs for internal actions. 13618ff5b28d6efcffe2251e77634c7edf83a4763344Daniel Dunbar CmdArgs.push_back("-cc1"); 13628ff5b28d6efcffe2251e77634c7edf83a4763344Daniel Dunbar 1363dd4fe00f03d8749b283948ea86aa1e4a53ed21abDaniel Dunbar // Add the "effective" target triple. 1364af07f936b698575f2c91f1c1134c116f1ef0deddDaniel Dunbar CmdArgs.push_back("-triple"); 136500577ada44c889fbe311d61c51a8da89e65c7c9aDaniel Dunbar std::string TripleStr = getToolChain().ComputeEffectiveClangTriple(Args); 1366dd4fe00f03d8749b283948ea86aa1e4a53ed21abDaniel Dunbar CmdArgs.push_back(Args.MakeArgString(TripleStr)); 1367728a512753d85a6ccaae34e81385c8665c2de0e1Daniel Dunbar 1368dd4fe00f03d8749b283948ea86aa1e4a53ed21abDaniel Dunbar // Select the appropriate action. 13695314e448631f166c89e908cc1ab45dc7eda916baDaniel Dunbar bool IsRewriter = false; 1370e982cc0ea3e9255b8aacf8f0bff559e9b1cfd72eFariborz Jahanian bool IsModernRewriter = false; 1371e982cc0ea3e9255b8aacf8f0bff559e9b1cfd72eFariborz Jahanian 13721d46033f760ba5fd266ce59fe391fac473f04f52Daniel Dunbar if (isa<AnalyzeJobAction>(JA)) { 13731d46033f760ba5fd266ce59fe391fac473f04f52Daniel Dunbar assert(JA.getType() == types::TY_Plist && "Invalid output type."); 13741d46033f760ba5fd266ce59fe391fac473f04f52Daniel Dunbar CmdArgs.push_back("-analyze"); 137530660a898545416f0fea2d717f16f75640001e38Ted Kremenek } else if (isa<MigrateJobAction>(JA)) { 137630660a898545416f0fea2d717f16f75640001e38Ted Kremenek CmdArgs.push_back("-migrate"); 13771d46033f760ba5fd266ce59fe391fac473f04f52Daniel Dunbar } else if (isa<PreprocessJobAction>(JA)) { 1378cd8e4c44dd068956e9181381be3ee2d49a0fac52Daniel Dunbar if (Output.getType() == types::TY_Dependencies) 1379cd8e4c44dd068956e9181381be3ee2d49a0fac52Daniel Dunbar CmdArgs.push_back("-Eonly"); 1380cd8e4c44dd068956e9181381be3ee2d49a0fac52Daniel Dunbar else 1381cd8e4c44dd068956e9181381be3ee2d49a0fac52Daniel Dunbar CmdArgs.push_back("-E"); 13828767cbc475ed96397b6f08617814eeb9cab121bdDaniel Dunbar } else if (isa<AssembleJobAction>(JA)) { 13838767cbc475ed96397b6f08617814eeb9cab121bdDaniel Dunbar CmdArgs.push_back("-emit-obj"); 13849929800b8dfced61e9c97dc8d6e71e144ebf8accDaniel Dunbar 1385359cf927cf4980099a04b3f3cf040b81d181fe3dJoerg Sonnenberger if (UseRelaxAll(C, Args)) 13869929800b8dfced61e9c97dc8d6e71e144ebf8accDaniel Dunbar CmdArgs.push_back("-mrelax-all"); 1387ca0e0545c216afaacba6da6c82a270dc2efc4e3fDaniel Dunbar 1388fcec10bded7b9b9268af5232fa17617db0df68edDaniel Dunbar // When using an integrated assembler, translate -Wa, and -Xassembler 1389fcec10bded7b9b9268af5232fa17617db0df68edDaniel Dunbar // options. 1390fcec10bded7b9b9268af5232fa17617db0df68edDaniel Dunbar for (arg_iterator it = Args.filtered_begin(options::OPT_Wa_COMMA, 1391fcec10bded7b9b9268af5232fa17617db0df68edDaniel Dunbar options::OPT_Xassembler), 1392fcec10bded7b9b9268af5232fa17617db0df68edDaniel Dunbar ie = Args.filtered_end(); it != ie; ++it) { 1393fcec10bded7b9b9268af5232fa17617db0df68edDaniel Dunbar const Arg *A = *it; 1394fcec10bded7b9b9268af5232fa17617db0df68edDaniel Dunbar A->claim(); 1395fcec10bded7b9b9268af5232fa17617db0df68edDaniel Dunbar 1396fcec10bded7b9b9268af5232fa17617db0df68edDaniel Dunbar for (unsigned i = 0, e = A->getNumValues(); i != e; ++i) { 13975f9e272e632e951b1efe824cd16acb4d96077930Chris Lattner StringRef Value = A->getValue(Args, i); 1398fcec10bded7b9b9268af5232fa17617db0df68edDaniel Dunbar 1399fcec10bded7b9b9268af5232fa17617db0df68edDaniel Dunbar if (Value == "-force_cpusubtype_ALL") { 1400fcec10bded7b9b9268af5232fa17617db0df68edDaniel Dunbar // Do nothing, this is the default and we don't support anything else. 1401b14eed0ed44ed3af881219dab7dc6464cad5303bDaniel Dunbar } else if (Value == "-L") { 1402969323239f16589329d091a2b8ef200fcfe7c9e9Daniel Dunbar CmdArgs.push_back("-msave-temp-labels"); 140346a49391efab20d7a2a1c18f22edb3d76b465252Joerg Sonnenberger } else if (Value == "--fatal-warnings") { 1404d793350dee89688f1cc939096dc60c3bc15c20feJoerg Sonnenberger CmdArgs.push_back("-mllvm"); 1405d793350dee89688f1cc939096dc60c3bc15c20feJoerg Sonnenberger CmdArgs.push_back("-fatal-assembler-warnings"); 1406c3b9014c7236a15cf467662264b243a22c420312Nick Lewycky } else if (Value == "--noexecstack") { 1407c3b9014c7236a15cf467662264b243a22c420312Nick Lewycky CmdArgs.push_back("-mnoexecstack"); 1408fcec10bded7b9b9268af5232fa17617db0df68edDaniel Dunbar } else { 14095f9e272e632e951b1efe824cd16acb4d96077930Chris Lattner D.Diag(diag::err_drv_unsupported_option_argument) 1410fcec10bded7b9b9268af5232fa17617db0df68edDaniel Dunbar << A->getOption().getName() << Value; 1411fcec10bded7b9b9268af5232fa17617db0df68edDaniel Dunbar } 1412fcec10bded7b9b9268af5232fa17617db0df68edDaniel Dunbar } 1413fcec10bded7b9b9268af5232fa17617db0df68edDaniel Dunbar } 1414d02bba8e2abceebd91c162ee4479623791f455b5Daniel Dunbar 1415d02bba8e2abceebd91c162ee4479623791f455b5Daniel Dunbar // Also ignore explicit -force_cpusubtype_ALL option. 1416d02bba8e2abceebd91c162ee4479623791f455b5Daniel Dunbar (void) Args.hasArg(options::OPT_force__cpusubtype__ALL); 14171d46033f760ba5fd266ce59fe391fac473f04f52Daniel Dunbar } else if (isa<PrecompileJobAction>(JA)) { 1418e5c35377020d6c38d16434c9f373a5fa9bb4f2ebArgyrios Kyrtzidis // Use PCH if the user requested it. 14190ebd9321ba380471010341f24c874f46f56e7581Daniel Dunbar bool UsePCH = D.CCCUsePCH; 14200ebd9321ba380471010341f24c874f46f56e7581Daniel Dunbar 14210ebd9321ba380471010341f24c874f46f56e7581Daniel Dunbar if (UsePCH) 1422df91ef3d6c55692a0236f67b6c6b134a3bf84098Douglas Gregor CmdArgs.push_back("-emit-pch"); 1423df91ef3d6c55692a0236f67b6c6b134a3bf84098Douglas Gregor else 1424df91ef3d6c55692a0236f67b6c6b134a3bf84098Douglas Gregor CmdArgs.push_back("-emit-pth"); 14251d46033f760ba5fd266ce59fe391fac473f04f52Daniel Dunbar } else { 14261d46033f760ba5fd266ce59fe391fac473f04f52Daniel Dunbar assert(isa<CompileJobAction>(JA) && "Invalid action for clang tool."); 1427c21c485b4fb58ef5d55cf3e523263dd824a2ace4Daniel Dunbar 14281d46033f760ba5fd266ce59fe391fac473f04f52Daniel Dunbar if (JA.getType() == types::TY_Nothing) { 14291d46033f760ba5fd266ce59fe391fac473f04f52Daniel Dunbar CmdArgs.push_back("-fsyntax-only"); 14306c6424bc0d3b5f080a97b5f6ef4a8d70c38e38f5Daniel Dunbar } else if (JA.getType() == types::TY_LLVM_IR || 14316c6424bc0d3b5f080a97b5f6ef4a8d70c38e38f5Daniel Dunbar JA.getType() == types::TY_LTO_IR) { 14321d46033f760ba5fd266ce59fe391fac473f04f52Daniel Dunbar CmdArgs.push_back("-emit-llvm"); 14336c6424bc0d3b5f080a97b5f6ef4a8d70c38e38f5Daniel Dunbar } else if (JA.getType() == types::TY_LLVM_BC || 14346c6424bc0d3b5f080a97b5f6ef4a8d70c38e38f5Daniel Dunbar JA.getType() == types::TY_LTO_BC) { 14351d46033f760ba5fd266ce59fe391fac473f04f52Daniel Dunbar CmdArgs.push_back("-emit-llvm-bc"); 14361d46033f760ba5fd266ce59fe391fac473f04f52Daniel Dunbar } else if (JA.getType() == types::TY_PP_Asm) { 1437e3b8d07e02861d245612b02b5f5a2c1f34b2a394Daniel Dunbar CmdArgs.push_back("-S"); 14385915fbf310e171c4cd3c2af05e9de360c0fa988aDaniel Dunbar } else if (JA.getType() == types::TY_AST) { 14395915fbf310e171c4cd3c2af05e9de360c0fa988aDaniel Dunbar CmdArgs.push_back("-emit-pch"); 144064952508c2b0c8bffb45c8b410f0af3d2457f59bDaniel Dunbar } else if (JA.getType() == types::TY_RewrittenObjC) { 144164952508c2b0c8bffb45c8b410f0af3d2457f59bDaniel Dunbar CmdArgs.push_back("-rewrite-objc"); 1442e982cc0ea3e9255b8aacf8f0bff559e9b1cfd72eFariborz Jahanian IsModernRewriter = true; 1443582b395ea4d5dfe353e2132a470d39efe2f84a54Fariborz Jahanian } else if (JA.getType() == types::TY_RewrittenLegacyObjC) { 1444582b395ea4d5dfe353e2132a470d39efe2f84a54Fariborz Jahanian CmdArgs.push_back("-rewrite-objc"); 14455314e448631f166c89e908cc1ab45dc7eda916baDaniel Dunbar IsRewriter = true; 144664952508c2b0c8bffb45c8b410f0af3d2457f59bDaniel Dunbar } else { 144764952508c2b0c8bffb45c8b410f0af3d2457f59bDaniel Dunbar assert(JA.getType() == types::TY_PP_Asm && 144864952508c2b0c8bffb45c8b410f0af3d2457f59bDaniel Dunbar "Unexpected output type!"); 14491d46033f760ba5fd266ce59fe391fac473f04f52Daniel Dunbar } 14501d46033f760ba5fd266ce59fe391fac473f04f52Daniel Dunbar } 14511d46033f760ba5fd266ce59fe391fac473f04f52Daniel Dunbar 14521d46033f760ba5fd266ce59fe391fac473f04f52Daniel Dunbar // The make clang go fast button. 14531d46033f760ba5fd266ce59fe391fac473f04f52Daniel Dunbar CmdArgs.push_back("-disable-free"); 14541d46033f760ba5fd266ce59fe391fac473f04f52Daniel Dunbar 1455b689afb75049012a431d483432114ad5e75d4a92John McCall // Disable the verification pass in -asserts builds. 1456b689afb75049012a431d483432114ad5e75d4a92John McCall#ifdef NDEBUG 1457b689afb75049012a431d483432114ad5e75d4a92John McCall CmdArgs.push_back("-disable-llvm-verifier"); 1458b689afb75049012a431d483432114ad5e75d4a92John McCall#endif 1459b689afb75049012a431d483432114ad5e75d4a92John McCall 1460c9abc043af88f90d177a5bd147f627b78ca49fdeDaniel Dunbar // Set the main file name, so that debug info works even with 1461c9abc043af88f90d177a5bd147f627b78ca49fdeDaniel Dunbar // -save-temps. 1462c9abc043af88f90d177a5bd147f627b78ca49fdeDaniel Dunbar CmdArgs.push_back("-main-file-name"); 1463c9abc043af88f90d177a5bd147f627b78ca49fdeDaniel Dunbar CmdArgs.push_back(darwin::CC1::getBaseInputName(Args, Inputs)); 1464c9abc043af88f90d177a5bd147f627b78ca49fdeDaniel Dunbar 14653bbc75302fd43cf13d868b46c94ff8794b302e43Daniel Dunbar // Some flags which affect the language (via preprocessor 14663bbc75302fd43cf13d868b46c94ff8794b302e43Daniel Dunbar // defines). See darwin::CC1::AddCPPArgs. 14673bbc75302fd43cf13d868b46c94ff8794b302e43Daniel Dunbar if (Args.hasArg(options::OPT_static)) 14683bbc75302fd43cf13d868b46c94ff8794b302e43Daniel Dunbar CmdArgs.push_back("-static-define"); 14693bbc75302fd43cf13d868b46c94ff8794b302e43Daniel Dunbar 14701d46033f760ba5fd266ce59fe391fac473f04f52Daniel Dunbar if (isa<AnalyzeJobAction>(JA)) { 1471b8bb3e797c5687715c6d9d960ee573e4d0e62230Ted Kremenek // Enable region store model by default. 1472b8bb3e797c5687715c6d9d960ee573e4d0e62230Ted Kremenek CmdArgs.push_back("-analyzer-store=region"); 1473b8bb3e797c5687715c6d9d960ee573e4d0e62230Ted Kremenek 1474b40d06dec23b53bbc1157a9adae7f887be31aa3bTed Kremenek // Treat blocks as analysis entry points. 1475b40d06dec23b53bbc1157a9adae7f887be31aa3bTed Kremenek CmdArgs.push_back("-analyzer-opt-analyze-nested-blocks"); 1476b40d06dec23b53bbc1157a9adae7f887be31aa3bTed Kremenek 14775188507b9a1b09ec95c14ffadf0e832f2b47aa8aTed Kremenek CmdArgs.push_back("-analyzer-eagerly-assume"); 14785188507b9a1b09ec95c14ffadf0e832f2b47aa8aTed Kremenek 147966253352131e3e7a22b3bfd0e180607aa2bfb988Anna Zaks CmdArgs.push_back("-analyzer-ipa=inlining"); 1480278f1f8d9557babb22b966379dd89039f3f8a440Anna Zaks 14811d46033f760ba5fd266ce59fe391fac473f04f52Daniel Dunbar // Add default argument set. 1482d8fc0f2e7751cf31cec5c2f3cc6a0b447e9debb3Daniel Dunbar if (!Args.hasArg(options::OPT__analyzer_no_default_checks)) { 1483027a6abdd6cedc0b8203da72eed6d15c796dce9dArgyrios Kyrtzidis CmdArgs.push_back("-analyzer-checker=core"); 14845188507b9a1b09ec95c14ffadf0e832f2b47aa8aTed Kremenek 1485027a6abdd6cedc0b8203da72eed6d15c796dce9dArgyrios Kyrtzidis if (getToolChain().getTriple().getOS() != llvm::Triple::Win32) 1486027a6abdd6cedc0b8203da72eed6d15c796dce9dArgyrios Kyrtzidis CmdArgs.push_back("-analyzer-checker=unix"); 1487027a6abdd6cedc0b8203da72eed6d15c796dce9dArgyrios Kyrtzidis 14885188507b9a1b09ec95c14ffadf0e832f2b47aa8aTed Kremenek if (getToolChain().getTriple().getVendor() == llvm::Triple::Apple) 14895188507b9a1b09ec95c14ffadf0e832f2b47aa8aTed Kremenek CmdArgs.push_back("-analyzer-checker=osx"); 1490a8180e5a8795b4b80587662167dfc13646a494a1Ted Kremenek 1491a8180e5a8795b4b80587662167dfc13646a494a1Ted Kremenek CmdArgs.push_back("-analyzer-checker=deadcode"); 14928dc0506df167a426df324f47d8367bd824f26e7fTed Kremenek 14938dc0506df167a426df324f47d8367bd824f26e7fTed Kremenek // Enable the following experimental checkers for testing. 14948dc0506df167a426df324f47d8367bd824f26e7fTed Kremenek CmdArgs.push_back("-analyzer-checker=security.insecureAPI.UncheckedReturn"); 14958dc0506df167a426df324f47d8367bd824f26e7fTed Kremenek CmdArgs.push_back("-analyzer-checker=security.insecureAPI.getpw"); 14968dc0506df167a426df324f47d8367bd824f26e7fTed Kremenek CmdArgs.push_back("-analyzer-checker=security.insecureAPI.gets"); 14978dc0506df167a426df324f47d8367bd824f26e7fTed Kremenek CmdArgs.push_back("-analyzer-checker=security.insecureAPI.mktemp"); 14988dc0506df167a426df324f47d8367bd824f26e7fTed Kremenek CmdArgs.push_back("-analyzer-checker=security.insecureAPI.mkstemp"); 14998dc0506df167a426df324f47d8367bd824f26e7fTed Kremenek CmdArgs.push_back("-analyzer-checker=security.insecureAPI.vfork"); 1500d8fc0f2e7751cf31cec5c2f3cc6a0b447e9debb3Daniel Dunbar } 1501d8fc0f2e7751cf31cec5c2f3cc6a0b447e9debb3Daniel Dunbar 1502d8fc0f2e7751cf31cec5c2f3cc6a0b447e9debb3Daniel Dunbar // Set the output format. The default is plist, for (lame) historical 1503d8fc0f2e7751cf31cec5c2f3cc6a0b447e9debb3Daniel Dunbar // reasons. 1504d8fc0f2e7751cf31cec5c2f3cc6a0b447e9debb3Daniel Dunbar CmdArgs.push_back("-analyzer-output"); 1505d8fc0f2e7751cf31cec5c2f3cc6a0b447e9debb3Daniel Dunbar if (Arg *A = Args.getLastArg(options::OPT__analyzer_output)) 1506d8fc0f2e7751cf31cec5c2f3cc6a0b447e9debb3Daniel Dunbar CmdArgs.push_back(A->getValue(Args)); 1507d8fc0f2e7751cf31cec5c2f3cc6a0b447e9debb3Daniel Dunbar else 1508d8fc0f2e7751cf31cec5c2f3cc6a0b447e9debb3Daniel Dunbar CmdArgs.push_back("plist"); 15091d46033f760ba5fd266ce59fe391fac473f04f52Daniel Dunbar 15100647a7b9ad844565b8a4b5e1a5de882dd64efabfTed Kremenek // Disable the presentation of standard compiler warnings when 15110647a7b9ad844565b8a4b5e1a5de882dd64efabfTed Kremenek // using --analyze. We only want to show static analyzer diagnostics 15120647a7b9ad844565b8a4b5e1a5de882dd64efabfTed Kremenek // or frontend errors. 15130647a7b9ad844565b8a4b5e1a5de882dd64efabfTed Kremenek CmdArgs.push_back("-w"); 15140647a7b9ad844565b8a4b5e1a5de882dd64efabfTed Kremenek 15151d46033f760ba5fd266ce59fe391fac473f04f52Daniel Dunbar // Add -Xanalyzer arguments when running as analyzer. 15161d46033f760ba5fd266ce59fe391fac473f04f52Daniel Dunbar Args.AddAllArgValues(CmdArgs, options::OPT_Xanalyzer); 15171eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump } 15181eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump 1519e2fd66418eca3d70cf6b62087d745d0c5181db69Daniel Dunbar CheckCodeGenerationOptions(D, Args); 1520e2fd66418eca3d70cf6b62087d745d0c5181db69Daniel Dunbar 1521bc85be85779a47bae728bbe6a2cd2e3732b1333dDaniel Dunbar // Perform argument translation for LLVM backend. This 1522bc85be85779a47bae728bbe6a2cd2e3732b1333dDaniel Dunbar // takes some care in reconciling with llvm-gcc. The 1523bc85be85779a47bae728bbe6a2cd2e3732b1333dDaniel Dunbar // issue is that llvm-gcc translates these options based on 1524bc85be85779a47bae728bbe6a2cd2e3732b1333dDaniel Dunbar // the values in cc1, whereas we are processing based on 1525bc85be85779a47bae728bbe6a2cd2e3732b1333dDaniel Dunbar // the driver arguments. 15269fd0b1f845a61e71dd8099f596532d34c519630aDaniel Dunbar 1527bc85be85779a47bae728bbe6a2cd2e3732b1333dDaniel Dunbar // This comes from the default translation the driver + cc1 1528bc85be85779a47bae728bbe6a2cd2e3732b1333dDaniel Dunbar // would do to enable flag_pic. 1529bc85be85779a47bae728bbe6a2cd2e3732b1333dDaniel Dunbar // 1530bc85be85779a47bae728bbe6a2cd2e3732b1333dDaniel Dunbar // FIXME: Centralize this code. 15315e219cf7f896873c1c1e64b9e87a7dade99debbaChandler Carruth Arg *LastPICArg = 0; 15325e219cf7f896873c1c1e64b9e87a7dade99debbaChandler Carruth for (ArgList::const_iterator I = Args.begin(), E = Args.end(); I != E; ++I) { 15335e219cf7f896873c1c1e64b9e87a7dade99debbaChandler Carruth if ((*I)->getOption().matches(options::OPT_fPIC) || 15345e219cf7f896873c1c1e64b9e87a7dade99debbaChandler Carruth (*I)->getOption().matches(options::OPT_fno_PIC) || 15355e219cf7f896873c1c1e64b9e87a7dade99debbaChandler Carruth (*I)->getOption().matches(options::OPT_fpic) || 15365e219cf7f896873c1c1e64b9e87a7dade99debbaChandler Carruth (*I)->getOption().matches(options::OPT_fno_pic) || 15375e219cf7f896873c1c1e64b9e87a7dade99debbaChandler Carruth (*I)->getOption().matches(options::OPT_fPIE) || 15385e219cf7f896873c1c1e64b9e87a7dade99debbaChandler Carruth (*I)->getOption().matches(options::OPT_fno_PIE) || 15395e219cf7f896873c1c1e64b9e87a7dade99debbaChandler Carruth (*I)->getOption().matches(options::OPT_fpie) || 15405e219cf7f896873c1c1e64b9e87a7dade99debbaChandler Carruth (*I)->getOption().matches(options::OPT_fno_pie)) { 15415e219cf7f896873c1c1e64b9e87a7dade99debbaChandler Carruth LastPICArg = *I; 15425e219cf7f896873c1c1e64b9e87a7dade99debbaChandler Carruth (*I)->claim(); 15435e219cf7f896873c1c1e64b9e87a7dade99debbaChandler Carruth } 15445e219cf7f896873c1c1e64b9e87a7dade99debbaChandler Carruth } 15455e219cf7f896873c1c1e64b9e87a7dade99debbaChandler Carruth bool PICDisabled = false; 15465e219cf7f896873c1c1e64b9e87a7dade99debbaChandler Carruth bool PICEnabled = false; 15475e219cf7f896873c1c1e64b9e87a7dade99debbaChandler Carruth bool PICForPIE = false; 15485e219cf7f896873c1c1e64b9e87a7dade99debbaChandler Carruth if (LastPICArg) { 15495e219cf7f896873c1c1e64b9e87a7dade99debbaChandler Carruth PICForPIE = (LastPICArg->getOption().matches(options::OPT_fPIE) || 15505e219cf7f896873c1c1e64b9e87a7dade99debbaChandler Carruth LastPICArg->getOption().matches(options::OPT_fpie)); 15515e219cf7f896873c1c1e64b9e87a7dade99debbaChandler Carruth PICEnabled = (PICForPIE || 15525e219cf7f896873c1c1e64b9e87a7dade99debbaChandler Carruth LastPICArg->getOption().matches(options::OPT_fPIC) || 15535e219cf7f896873c1c1e64b9e87a7dade99debbaChandler Carruth LastPICArg->getOption().matches(options::OPT_fpic)); 15545e219cf7f896873c1c1e64b9e87a7dade99debbaChandler Carruth PICDisabled = !PICEnabled; 15555e219cf7f896873c1c1e64b9e87a7dade99debbaChandler Carruth } 15565e219cf7f896873c1c1e64b9e87a7dade99debbaChandler Carruth // Note that these flags are trump-cards. Regardless of the order w.r.t. the 15575e219cf7f896873c1c1e64b9e87a7dade99debbaChandler Carruth // PIC or PIE options above, if these show up, PIC is disabled. 15585e219cf7f896873c1c1e64b9e87a7dade99debbaChandler Carruth if (Args.hasArg(options::OPT_mkernel)) 15595e219cf7f896873c1c1e64b9e87a7dade99debbaChandler Carruth PICDisabled = true; 15605e219cf7f896873c1c1e64b9e87a7dade99debbaChandler Carruth if (Args.hasArg(options::OPT_static)) 15615e219cf7f896873c1c1e64b9e87a7dade99debbaChandler Carruth PICDisabled = true; 15625e219cf7f896873c1c1e64b9e87a7dade99debbaChandler Carruth bool DynamicNoPIC = Args.hasArg(options::OPT_mdynamic_no_pic); 15635e219cf7f896873c1c1e64b9e87a7dade99debbaChandler Carruth 15645e219cf7f896873c1c1e64b9e87a7dade99debbaChandler Carruth // Select the relocation model. 1565bc85be85779a47bae728bbe6a2cd2e3732b1333dDaniel Dunbar const char *Model = getToolChain().GetForcedPicModel(); 1566bc85be85779a47bae728bbe6a2cd2e3732b1333dDaniel Dunbar if (!Model) { 15675e219cf7f896873c1c1e64b9e87a7dade99debbaChandler Carruth if (DynamicNoPIC) 1568bc85be85779a47bae728bbe6a2cd2e3732b1333dDaniel Dunbar Model = "dynamic-no-pic"; 1569bc85be85779a47bae728bbe6a2cd2e3732b1333dDaniel Dunbar else if (PICDisabled) 1570bc85be85779a47bae728bbe6a2cd2e3732b1333dDaniel Dunbar Model = "static"; 1571bc85be85779a47bae728bbe6a2cd2e3732b1333dDaniel Dunbar else if (PICEnabled) 1572bc85be85779a47bae728bbe6a2cd2e3732b1333dDaniel Dunbar Model = "pic"; 15731d46033f760ba5fd266ce59fe391fac473f04f52Daniel Dunbar else 1574bc85be85779a47bae728bbe6a2cd2e3732b1333dDaniel Dunbar Model = getToolChain().GetDefaultRelocationModel(); 1575bc85be85779a47bae728bbe6a2cd2e3732b1333dDaniel Dunbar } 15765e219cf7f896873c1c1e64b9e87a7dade99debbaChandler Carruth StringRef ModelStr = Model ? Model : ""; 15775e219cf7f896873c1c1e64b9e87a7dade99debbaChandler Carruth if (Model && ModelStr != "pic") { 1578f219e7c1529fac29e34483667f740b452e5ef9ccDaniel Dunbar CmdArgs.push_back("-mrelocation-model"); 1579f219e7c1529fac29e34483667f740b452e5ef9ccDaniel Dunbar CmdArgs.push_back(Model); 1580f219e7c1529fac29e34483667f740b452e5ef9ccDaniel Dunbar } 15811d46033f760ba5fd266ce59fe391fac473f04f52Daniel Dunbar 15825e219cf7f896873c1c1e64b9e87a7dade99debbaChandler Carruth // Infer the __PIC__ and __PIE__ values. 15835e219cf7f896873c1c1e64b9e87a7dade99debbaChandler Carruth if (ModelStr == "pic" && PICForPIE) { 15845e219cf7f896873c1c1e64b9e87a7dade99debbaChandler Carruth CmdArgs.push_back("-pie-level"); 15855e219cf7f896873c1c1e64b9e87a7dade99debbaChandler Carruth CmdArgs.push_back((LastPICArg && 15865e219cf7f896873c1c1e64b9e87a7dade99debbaChandler Carruth LastPICArg->getOption().matches(options::OPT_fPIE)) ? 15875e219cf7f896873c1c1e64b9e87a7dade99debbaChandler Carruth "2" : "1"); 15885e219cf7f896873c1c1e64b9e87a7dade99debbaChandler Carruth } else if (ModelStr == "pic" || ModelStr == "dynamic-no-pic") { 15897674352cf3e8f699914a2f739f1ae8c8c3480813Daniel Dunbar CmdArgs.push_back("-pic-level"); 15905e219cf7f896873c1c1e64b9e87a7dade99debbaChandler Carruth CmdArgs.push_back(((ModelStr != "dynamic-no-pic" && LastPICArg && 15915e219cf7f896873c1c1e64b9e87a7dade99debbaChandler Carruth LastPICArg->getOption().matches(options::OPT_fPIC)) || 15925e219cf7f896873c1c1e64b9e87a7dade99debbaChandler Carruth getToolChain().getTriple().isOSDarwin()) ? "2" : "1"); 1593bc85be85779a47bae728bbe6a2cd2e3732b1333dDaniel Dunbar } 15945e219cf7f896873c1c1e64b9e87a7dade99debbaChandler Carruth 1595f219e7c1529fac29e34483667f740b452e5ef9ccDaniel Dunbar if (!Args.hasFlag(options::OPT_fmerge_all_constants, 1596f219e7c1529fac29e34483667f740b452e5ef9ccDaniel Dunbar options::OPT_fno_merge_all_constants)) 1597f44a1a04a36453527de2285c402fbe9453184121Chris Lattner CmdArgs.push_back("-fno-merge-all-constants"); 1598f219e7c1529fac29e34483667f740b452e5ef9ccDaniel Dunbar 1599f219e7c1529fac29e34483667f740b452e5ef9ccDaniel Dunbar // LLVM Code Generator Options. 16001d46033f760ba5fd266ce59fe391fac473f04f52Daniel Dunbar 160117d3fea677753e6e3e82ffe2cbdeccbf5f2e7497Daniel Dunbar if (Arg *A = Args.getLastArg(options::OPT_mregparm_EQ)) { 160217d3fea677753e6e3e82ffe2cbdeccbf5f2e7497Daniel Dunbar CmdArgs.push_back("-mregparm"); 160317d3fea677753e6e3e82ffe2cbdeccbf5f2e7497Daniel Dunbar CmdArgs.push_back(A->getValue(Args)); 160417d3fea677753e6e3e82ffe2cbdeccbf5f2e7497Daniel Dunbar } 160517d3fea677753e6e3e82ffe2cbdeccbf5f2e7497Daniel Dunbar 1606cfe9af250f466e7e38becea4428990448ae07737Roman Divacky if (Args.hasFlag(options::OPT_mrtd, options::OPT_mno_rtd, false)) 1607cfe9af250f466e7e38becea4428990448ae07737Roman Divacky CmdArgs.push_back("-mrtd"); 1608cfe9af250f466e7e38becea4428990448ae07737Roman Divacky 16096af27ec69560f7e4b0dac4a0b4341cd6062f6852Rafael Espindola if (shouldUseFramePointer(Args, getToolChain().getTriple())) 1610f219e7c1529fac29e34483667f740b452e5ef9ccDaniel Dunbar CmdArgs.push_back("-mdisable-fp-elim"); 1611bc85be85779a47bae728bbe6a2cd2e3732b1333dDaniel Dunbar if (!Args.hasFlag(options::OPT_fzero_initialized_in_bss, 1612f219e7c1529fac29e34483667f740b452e5ef9ccDaniel Dunbar options::OPT_fno_zero_initialized_in_bss)) 1613f219e7c1529fac29e34483667f740b452e5ef9ccDaniel Dunbar CmdArgs.push_back("-mno-zero-initialized-in-bss"); 1614398c610b16728b4398214367dd0effd9d2e61340Daniel Dunbar if (!Args.hasFlag(options::OPT_fstrict_aliasing, 1615398c610b16728b4398214367dd0effd9d2e61340Daniel Dunbar options::OPT_fno_strict_aliasing, 1616398c610b16728b4398214367dd0effd9d2e61340Daniel Dunbar getToolChain().IsStrictAliasingDefault())) 16174d5625e15bb215c2241c022df8dc7b04438970c6Dan Gohman CmdArgs.push_back("-relaxed-aliasing"); 161882fe6aea407a5a09a6131452ce622087ba83880dChandler Carruth if (Args.hasFlag(options::OPT_fstrict_enums, options::OPT_fno_strict_enums, 161982fe6aea407a5a09a6131452ce622087ba83880dChandler Carruth false)) 162082fe6aea407a5a09a6131452ce622087ba83880dChandler Carruth CmdArgs.push_back("-fstrict-enums"); 16211db772bd68502e0dabbd8efeb7f7c64a4ab2e37aNick Lewycky if (!Args.hasFlag(options::OPT_foptimize_sibling_calls, 16221db772bd68502e0dabbd8efeb7f7c64a4ab2e37aNick Lewycky options::OPT_fno_optimize_sibling_calls)) 16231db772bd68502e0dabbd8efeb7f7c64a4ab2e37aNick Lewycky CmdArgs.push_back("-mdisable-tail-calls"); 16241b71848c5238747ede9650b7907172f8a7e088a5Daniel Dunbar 1625abf07a7fb669dcb74040eef948d61dfe3c59ff17Chandler Carruth // Handle various floating point optimization flags, mapping them to the 1626abf07a7fb669dcb74040eef948d61dfe3c59ff17Chandler Carruth // appropriate LLVM code generation flags. The pattern for all of these is to 1627abf07a7fb669dcb74040eef948d61dfe3c59ff17Chandler Carruth // default off the codegen optimizations, and if any flag enables them and no 1628abf07a7fb669dcb74040eef948d61dfe3c59ff17Chandler Carruth // flag disables them after the flag enabling them, enable the codegen 1629abf07a7fb669dcb74040eef948d61dfe3c59ff17Chandler Carruth // optimization. This is complicated by several "umbrella" flags. 1630abf07a7fb669dcb74040eef948d61dfe3c59ff17Chandler Carruth if (Arg *A = Args.getLastArg(options::OPT_ffast_math, 1631abf07a7fb669dcb74040eef948d61dfe3c59ff17Chandler Carruth options::OPT_ffinite_math_only, 1632abf07a7fb669dcb74040eef948d61dfe3c59ff17Chandler Carruth options::OPT_fno_finite_math_only, 1633abf07a7fb669dcb74040eef948d61dfe3c59ff17Chandler Carruth options::OPT_fhonor_infinities, 1634abf07a7fb669dcb74040eef948d61dfe3c59ff17Chandler Carruth options::OPT_fno_honor_infinities)) 1635abf07a7fb669dcb74040eef948d61dfe3c59ff17Chandler Carruth if (A->getOption().getID() != options::OPT_fno_finite_math_only && 1636abf07a7fb669dcb74040eef948d61dfe3c59ff17Chandler Carruth A->getOption().getID() != options::OPT_fhonor_infinities) 1637abf07a7fb669dcb74040eef948d61dfe3c59ff17Chandler Carruth CmdArgs.push_back("-menable-no-infs"); 1638abf07a7fb669dcb74040eef948d61dfe3c59ff17Chandler Carruth if (Arg *A = Args.getLastArg(options::OPT_ffast_math, 1639abf07a7fb669dcb74040eef948d61dfe3c59ff17Chandler Carruth options::OPT_ffinite_math_only, 1640abf07a7fb669dcb74040eef948d61dfe3c59ff17Chandler Carruth options::OPT_fno_finite_math_only, 1641abf07a7fb669dcb74040eef948d61dfe3c59ff17Chandler Carruth options::OPT_fhonor_nans, 1642abf07a7fb669dcb74040eef948d61dfe3c59ff17Chandler Carruth options::OPT_fno_honor_nans)) 1643abf07a7fb669dcb74040eef948d61dfe3c59ff17Chandler Carruth if (A->getOption().getID() != options::OPT_fno_finite_math_only && 1644abf07a7fb669dcb74040eef948d61dfe3c59ff17Chandler Carruth A->getOption().getID() != options::OPT_fhonor_nans) 1645abf07a7fb669dcb74040eef948d61dfe3c59ff17Chandler Carruth CmdArgs.push_back("-menable-no-nans"); 1646abf07a7fb669dcb74040eef948d61dfe3c59ff17Chandler Carruth 1647769aa2d46fa5dc0bee5285c95a80ad8749cb79cfBenjamin Kramer // -fmath-errno is the default on some platforms, e.g. BSD-derived OSes. 1648769aa2d46fa5dc0bee5285c95a80ad8749cb79cfBenjamin Kramer bool MathErrno = getToolChain().IsMathErrnoDefault(); 1649abf07a7fb669dcb74040eef948d61dfe3c59ff17Chandler Carruth if (Arg *A = Args.getLastArg(options::OPT_ffast_math, 1650abf07a7fb669dcb74040eef948d61dfe3c59ff17Chandler Carruth options::OPT_fmath_errno, 16514f50c50e783461ea1ec47dd6fe9be10aafcd76adChandler Carruth options::OPT_fno_math_errno)) 16524f50c50e783461ea1ec47dd6fe9be10aafcd76adChandler Carruth MathErrno = A->getOption().getID() == options::OPT_fmath_errno; 16534f50c50e783461ea1ec47dd6fe9be10aafcd76adChandler Carruth if (MathErrno) 16544f50c50e783461ea1ec47dd6fe9be10aafcd76adChandler Carruth CmdArgs.push_back("-fmath-errno"); 1655abf07a7fb669dcb74040eef948d61dfe3c59ff17Chandler Carruth 1656abf07a7fb669dcb74040eef948d61dfe3c59ff17Chandler Carruth // There are several flags which require disabling very specific 1657abf07a7fb669dcb74040eef948d61dfe3c59ff17Chandler Carruth // optimizations. Any of these being disabled forces us to turn off the 1658abf07a7fb669dcb74040eef948d61dfe3c59ff17Chandler Carruth // entire set of LLVM optimizations, so collect them through all the flag 1659abf07a7fb669dcb74040eef948d61dfe3c59ff17Chandler Carruth // madness. 1660abf07a7fb669dcb74040eef948d61dfe3c59ff17Chandler Carruth bool AssociativeMath = false; 1661abf07a7fb669dcb74040eef948d61dfe3c59ff17Chandler Carruth if (Arg *A = Args.getLastArg(options::OPT_ffast_math, 1662abf07a7fb669dcb74040eef948d61dfe3c59ff17Chandler Carruth options::OPT_funsafe_math_optimizations, 1663abf07a7fb669dcb74040eef948d61dfe3c59ff17Chandler Carruth options::OPT_fno_unsafe_math_optimizations, 1664abf07a7fb669dcb74040eef948d61dfe3c59ff17Chandler Carruth options::OPT_fassociative_math, 1665abf07a7fb669dcb74040eef948d61dfe3c59ff17Chandler Carruth options::OPT_fno_associative_math)) 1666abf07a7fb669dcb74040eef948d61dfe3c59ff17Chandler Carruth if (A->getOption().getID() != options::OPT_fno_unsafe_math_optimizations && 1667abf07a7fb669dcb74040eef948d61dfe3c59ff17Chandler Carruth A->getOption().getID() != options::OPT_fno_associative_math) 1668abf07a7fb669dcb74040eef948d61dfe3c59ff17Chandler Carruth AssociativeMath = true; 1669abf07a7fb669dcb74040eef948d61dfe3c59ff17Chandler Carruth bool ReciprocalMath = false; 1670abf07a7fb669dcb74040eef948d61dfe3c59ff17Chandler Carruth if (Arg *A = Args.getLastArg(options::OPT_ffast_math, 1671abf07a7fb669dcb74040eef948d61dfe3c59ff17Chandler Carruth options::OPT_funsafe_math_optimizations, 1672abf07a7fb669dcb74040eef948d61dfe3c59ff17Chandler Carruth options::OPT_fno_unsafe_math_optimizations, 1673abf07a7fb669dcb74040eef948d61dfe3c59ff17Chandler Carruth options::OPT_freciprocal_math, 1674abf07a7fb669dcb74040eef948d61dfe3c59ff17Chandler Carruth options::OPT_fno_reciprocal_math)) 1675abf07a7fb669dcb74040eef948d61dfe3c59ff17Chandler Carruth if (A->getOption().getID() != options::OPT_fno_unsafe_math_optimizations && 1676abf07a7fb669dcb74040eef948d61dfe3c59ff17Chandler Carruth A->getOption().getID() != options::OPT_fno_reciprocal_math) 1677abf07a7fb669dcb74040eef948d61dfe3c59ff17Chandler Carruth ReciprocalMath = true; 1678abf07a7fb669dcb74040eef948d61dfe3c59ff17Chandler Carruth bool SignedZeros = true; 1679abf07a7fb669dcb74040eef948d61dfe3c59ff17Chandler Carruth if (Arg *A = Args.getLastArg(options::OPT_ffast_math, 1680abf07a7fb669dcb74040eef948d61dfe3c59ff17Chandler Carruth options::OPT_funsafe_math_optimizations, 1681abf07a7fb669dcb74040eef948d61dfe3c59ff17Chandler Carruth options::OPT_fno_unsafe_math_optimizations, 1682abf07a7fb669dcb74040eef948d61dfe3c59ff17Chandler Carruth options::OPT_fsigned_zeros, 1683abf07a7fb669dcb74040eef948d61dfe3c59ff17Chandler Carruth options::OPT_fno_signed_zeros)) 1684abf07a7fb669dcb74040eef948d61dfe3c59ff17Chandler Carruth if (A->getOption().getID() != options::OPT_fno_unsafe_math_optimizations && 1685abf07a7fb669dcb74040eef948d61dfe3c59ff17Chandler Carruth A->getOption().getID() != options::OPT_fsigned_zeros) 1686abf07a7fb669dcb74040eef948d61dfe3c59ff17Chandler Carruth SignedZeros = false; 1687abf07a7fb669dcb74040eef948d61dfe3c59ff17Chandler Carruth bool TrappingMath = true; 1688abf07a7fb669dcb74040eef948d61dfe3c59ff17Chandler Carruth if (Arg *A = Args.getLastArg(options::OPT_ffast_math, 1689abf07a7fb669dcb74040eef948d61dfe3c59ff17Chandler Carruth options::OPT_funsafe_math_optimizations, 1690abf07a7fb669dcb74040eef948d61dfe3c59ff17Chandler Carruth options::OPT_fno_unsafe_math_optimizations, 1691abf07a7fb669dcb74040eef948d61dfe3c59ff17Chandler Carruth options::OPT_ftrapping_math, 1692abf07a7fb669dcb74040eef948d61dfe3c59ff17Chandler Carruth options::OPT_fno_trapping_math)) 1693abf07a7fb669dcb74040eef948d61dfe3c59ff17Chandler Carruth if (A->getOption().getID() != options::OPT_fno_unsafe_math_optimizations && 1694abf07a7fb669dcb74040eef948d61dfe3c59ff17Chandler Carruth A->getOption().getID() != options::OPT_ftrapping_math) 1695abf07a7fb669dcb74040eef948d61dfe3c59ff17Chandler Carruth TrappingMath = false; 1696abf07a7fb669dcb74040eef948d61dfe3c59ff17Chandler Carruth if (!MathErrno && AssociativeMath && ReciprocalMath && !SignedZeros && 1697abf07a7fb669dcb74040eef948d61dfe3c59ff17Chandler Carruth !TrappingMath) 1698abf07a7fb669dcb74040eef948d61dfe3c59ff17Chandler Carruth CmdArgs.push_back("-menable-unsafe-fp-math"); 1699abf07a7fb669dcb74040eef948d61dfe3c59ff17Chandler Carruth 1700abf07a7fb669dcb74040eef948d61dfe3c59ff17Chandler Carruth // We separately look for the '-ffast-math' flag, and if we find it, tell the 1701abf07a7fb669dcb74040eef948d61dfe3c59ff17Chandler Carruth // frontend to provide the appropriate preprocessor macros. This is distinct 1702abf07a7fb669dcb74040eef948d61dfe3c59ff17Chandler Carruth // from enabling any optimizations as it induces a language change which must 1703abf07a7fb669dcb74040eef948d61dfe3c59ff17Chandler Carruth // survive serialization and deserialization, etc. 1704abf07a7fb669dcb74040eef948d61dfe3c59ff17Chandler Carruth if (Args.hasArg(options::OPT_ffast_math)) 1705abf07a7fb669dcb74040eef948d61dfe3c59ff17Chandler Carruth CmdArgs.push_back("-ffast-math"); 1706abf07a7fb669dcb74040eef948d61dfe3c59ff17Chandler Carruth 17071b71848c5238747ede9650b7907172f8a7e088a5Daniel Dunbar // Decide whether to use verbose asm. Verbose assembly is the default on 17081b71848c5238747ede9650b7907172f8a7e088a5Daniel Dunbar // toolchains which have the integrated assembler on by default. 17091b71848c5238747ede9650b7907172f8a7e088a5Daniel Dunbar bool IsVerboseAsmDefault = getToolChain().IsIntegratedAssemblerDefault(); 17101b71848c5238747ede9650b7907172f8a7e088a5Daniel Dunbar if (Args.hasFlag(options::OPT_fverbose_asm, options::OPT_fno_verbose_asm, 171120249a1af2e462dcafdd6a350f1c7967b264ff25Michael J. Spencer IsVerboseAsmDefault) || 17121b71848c5238747ede9650b7907172f8a7e088a5Daniel Dunbar Args.hasArg(options::OPT_dA)) 1713f219e7c1529fac29e34483667f740b452e5ef9ccDaniel Dunbar CmdArgs.push_back("-masm-verbose"); 17141b71848c5238747ede9650b7907172f8a7e088a5Daniel Dunbar 1715f219e7c1529fac29e34483667f740b452e5ef9ccDaniel Dunbar if (Args.hasArg(options::OPT_fdebug_pass_structure)) { 1716f219e7c1529fac29e34483667f740b452e5ef9ccDaniel Dunbar CmdArgs.push_back("-mdebug-pass"); 1717f219e7c1529fac29e34483667f740b452e5ef9ccDaniel Dunbar CmdArgs.push_back("Structure"); 1718f219e7c1529fac29e34483667f740b452e5ef9ccDaniel Dunbar } 1719f219e7c1529fac29e34483667f740b452e5ef9ccDaniel Dunbar if (Args.hasArg(options::OPT_fdebug_pass_arguments)) { 1720f219e7c1529fac29e34483667f740b452e5ef9ccDaniel Dunbar CmdArgs.push_back("-mdebug-pass"); 1721f219e7c1529fac29e34483667f740b452e5ef9ccDaniel Dunbar CmdArgs.push_back("Arguments"); 1722f219e7c1529fac29e34483667f740b452e5ef9ccDaniel Dunbar } 17236bea73b3305a03479589e2642fbdcf6c096851aaDaniel Dunbar 1724d0c2ec44e093011256b6a0f57d455f36dffdea70John McCall // Enable -mconstructor-aliases except on darwin, where we have to 1725d0c2ec44e093011256b6a0f57d455f36dffdea70John McCall // work around a linker bug; see <rdar://problem/7651567>. 1726905c45f15a25598620d19160c139c6b785aeea89Bob Wilson if (!getToolChain().getTriple().isOSDarwin()) 1727d0c2ec44e093011256b6a0f57d455f36dffdea70John McCall CmdArgs.push_back("-mconstructor-aliases"); 1728125b4cb35536e45201f8f2cb19ee620e3ad67c49NAKAMURA Takumi 172932096695c76033a6b0b1747c439f7378a11e8312John McCall // Darwin's kernel doesn't support guard variables; just die if we 173032096695c76033a6b0b1747c439f7378a11e8312John McCall // try to use them. 1731905c45f15a25598620d19160c139c6b785aeea89Bob Wilson if (KernelOrKext && getToolChain().getTriple().isOSDarwin()) 173232096695c76033a6b0b1747c439f7378a11e8312John McCall CmdArgs.push_back("-fforbid-guard-variables"); 173332096695c76033a6b0b1747c439f7378a11e8312John McCall 17346f75550e40a9177db9979fc130ce3ece026b137dDouglas Gregor if (Args.hasArg(options::OPT_mms_bitfields)) { 17356f75550e40a9177db9979fc130ce3ece026b137dDouglas Gregor CmdArgs.push_back("-mms-bitfields"); 17366f75550e40a9177db9979fc130ce3ece026b137dDouglas Gregor } 1737d0c2ec44e093011256b6a0f57d455f36dffdea70John McCall 17386bea73b3305a03479589e2642fbdcf6c096851aaDaniel Dunbar // This is a coarse approximation of what llvm-gcc actually does, both 17396bea73b3305a03479589e2642fbdcf6c096851aaDaniel Dunbar // -fasynchronous-unwind-tables and -fnon-call-exceptions interact in more 17406bea73b3305a03479589e2642fbdcf6c096851aaDaniel Dunbar // complicated ways. 17416bea73b3305a03479589e2642fbdcf6c096851aaDaniel Dunbar bool AsynchronousUnwindTables = 17426bea73b3305a03479589e2642fbdcf6c096851aaDaniel Dunbar Args.hasFlag(options::OPT_fasynchronous_unwind_tables, 17436bea73b3305a03479589e2642fbdcf6c096851aaDaniel Dunbar options::OPT_fno_asynchronous_unwind_tables, 17446bea73b3305a03479589e2642fbdcf6c096851aaDaniel Dunbar getToolChain().IsUnwindTablesDefault() && 17450a80ba74ffa3d3df55abfbc4474d7470c7c923e3Daniel Dunbar !KernelOrKext); 17466bea73b3305a03479589e2642fbdcf6c096851aaDaniel Dunbar if (Args.hasFlag(options::OPT_funwind_tables, options::OPT_fno_unwind_tables, 17476bea73b3305a03479589e2642fbdcf6c096851aaDaniel Dunbar AsynchronousUnwindTables)) 1748f219e7c1529fac29e34483667f740b452e5ef9ccDaniel Dunbar CmdArgs.push_back("-munwind-tables"); 1749f219e7c1529fac29e34483667f740b452e5ef9ccDaniel Dunbar 1750f219e7c1529fac29e34483667f740b452e5ef9ccDaniel Dunbar if (Arg *A = Args.getLastArg(options::OPT_flimited_precision_EQ)) { 1751f219e7c1529fac29e34483667f740b452e5ef9ccDaniel Dunbar CmdArgs.push_back("-mlimit-float-precision"); 1752f219e7c1529fac29e34483667f740b452e5ef9ccDaniel Dunbar CmdArgs.push_back(A->getValue(Args)); 1753f219e7c1529fac29e34483667f740b452e5ef9ccDaniel Dunbar } 1754bc85be85779a47bae728bbe6a2cd2e3732b1333dDaniel Dunbar 1755868bd0aa9281929ef50d2e9a8c82a036906f53f5Daniel Dunbar // FIXME: Handle -mtune=. 1756868bd0aa9281929ef50d2e9a8c82a036906f53f5Daniel Dunbar (void) Args.hasArg(options::OPT_mtune_EQ); 1757bc85be85779a47bae728bbe6a2cd2e3732b1333dDaniel Dunbar 17588e9ef0d87dad25f02e5abc6facf528778236115aBenjamin Kramer if (Arg *A = Args.getLastArg(options::OPT_mcmodel_EQ)) { 1759f219e7c1529fac29e34483667f740b452e5ef9ccDaniel Dunbar CmdArgs.push_back("-mcode-model"); 17608e9ef0d87dad25f02e5abc6facf528778236115aBenjamin Kramer CmdArgs.push_back(A->getValue(Args)); 17618e9ef0d87dad25f02e5abc6facf528778236115aBenjamin Kramer } 17628e9ef0d87dad25f02e5abc6facf528778236115aBenjamin Kramer 17636acda16e9c194dcbd0dea64341e182bdb65d0f41Daniel Dunbar // Add target specific cpu and features flags. 17646acda16e9c194dcbd0dea64341e182bdb65d0f41Daniel Dunbar switch(getToolChain().getTriple().getArch()) { 17656acda16e9c194dcbd0dea64341e182bdb65d0f41Daniel Dunbar default: 17666acda16e9c194dcbd0dea64341e182bdb65d0f41Daniel Dunbar break; 1767868bd0aa9281929ef50d2e9a8c82a036906f53f5Daniel Dunbar 1768b163ef7e7a5d904ef0962a7c38c460be083c4d63Daniel Dunbar case llvm::Triple::arm: 1769b163ef7e7a5d904ef0962a7c38c460be083c4d63Daniel Dunbar case llvm::Triple::thumb: 1770fa41d6975058ceb1b8a24564f6dcec72f89f62e8Daniel Dunbar AddARMTargetArgs(Args, CmdArgs, KernelOrKext); 1771b163ef7e7a5d904ef0962a7c38c460be083c4d63Daniel Dunbar break; 1772b163ef7e7a5d904ef0962a7c38c460be083c4d63Daniel Dunbar 1773ed734737d5af31906e30e537d4a41c760ddcfc59Eric Christopher case llvm::Triple::mips: 1774ed734737d5af31906e30e537d4a41c760ddcfc59Eric Christopher case llvm::Triple::mipsel: 17757ec0258505a11e7e8229d2c96507be6bbc40d7c1Akira Hatanaka case llvm::Triple::mips64: 17767ec0258505a11e7e8229d2c96507be6bbc40d7c1Akira Hatanaka case llvm::Triple::mips64el: 1777ed734737d5af31906e30e537d4a41c760ddcfc59Eric Christopher AddMIPSTargetArgs(Args, CmdArgs); 17789284d215022457ba867080a713f08f026d89ea17Bruno Cardoso Lopes break; 17799284d215022457ba867080a713f08f026d89ea17Bruno Cardoso Lopes 17809284d215022457ba867080a713f08f026d89ea17Bruno Cardoso Lopes case llvm::Triple::sparc: 17819284d215022457ba867080a713f08f026d89ea17Bruno Cardoso Lopes AddSparcTargetArgs(Args, CmdArgs); 1782ed734737d5af31906e30e537d4a41c760ddcfc59Eric Christopher break; 1783ed734737d5af31906e30e537d4a41c760ddcfc59Eric Christopher 17846acda16e9c194dcbd0dea64341e182bdb65d0f41Daniel Dunbar case llvm::Triple::x86: 17856acda16e9c194dcbd0dea64341e182bdb65d0f41Daniel Dunbar case llvm::Triple::x86_64: 17866acda16e9c194dcbd0dea64341e182bdb65d0f41Daniel Dunbar AddX86TargetArgs(Args, CmdArgs); 17876acda16e9c194dcbd0dea64341e182bdb65d0f41Daniel Dunbar break; 17889631939f82c0eaa6fb3936a0ce58a41adfbc9011Tony Linthicum 17899631939f82c0eaa6fb3936a0ce58a41adfbc9011Tony Linthicum case llvm::Triple::hexagon: 17909631939f82c0eaa6fb3936a0ce58a41adfbc9011Tony Linthicum AddHexagonTargetArgs(Args, CmdArgs); 17919631939f82c0eaa6fb3936a0ce58a41adfbc9011Tony Linthicum break; 1792bc85be85779a47bae728bbe6a2cd2e3732b1333dDaniel Dunbar } 1793c21c485b4fb58ef5d55cf3e523263dd824a2ace4Daniel Dunbar 17949631939f82c0eaa6fb3936a0ce58a41adfbc9011Tony Linthicum 17959631939f82c0eaa6fb3936a0ce58a41adfbc9011Tony Linthicum 1796c176bc6be6f1407e7c6bd062f05a8636ea9a08e3Daniel Dunbar // Pass the linker version in use. 1797c176bc6be6f1407e7c6bd062f05a8636ea9a08e3Daniel Dunbar if (Arg *A = Args.getLastArg(options::OPT_mlinker_version_EQ)) { 1798c176bc6be6f1407e7c6bd062f05a8636ea9a08e3Daniel Dunbar CmdArgs.push_back("-target-linker-version"); 1799c176bc6be6f1407e7c6bd062f05a8636ea9a08e3Daniel Dunbar CmdArgs.push_back(A->getValue(Args)); 1800c176bc6be6f1407e7c6bd062f05a8636ea9a08e3Daniel Dunbar } 1801c176bc6be6f1407e7c6bd062f05a8636ea9a08e3Daniel Dunbar 1802b2d11cc3abd5ddf421a9bd36c6ec558038748a83Nick Lewycky // -mno-omit-leaf-frame-pointer is the default on Darwin. 18031ad6648cce57bd187f1853f58fef26cd9bf4934fDaniel Dunbar if (Args.hasFlag(options::OPT_momit_leaf_frame_pointer, 1804b2d11cc3abd5ddf421a9bd36c6ec558038748a83Nick Lewycky options::OPT_mno_omit_leaf_frame_pointer, 1805905c45f15a25598620d19160c139c6b785aeea89Bob Wilson !getToolChain().getTriple().isOSDarwin())) 18061ad6648cce57bd187f1853f58fef26cd9bf4934fDaniel Dunbar CmdArgs.push_back("-momit-leaf-frame-pointer"); 18071ad6648cce57bd187f1853f58fef26cd9bf4934fDaniel Dunbar 1808b30575c22f249c0697df0cd2aa872d14d4fa9c57Daniel Dunbar // Explicitly error on some things we know we don't support and can't just 1809b30575c22f249c0697df0cd2aa872d14d4fa9c57Daniel Dunbar // ignore. 1810b30575c22f249c0697df0cd2aa872d14d4fa9c57Daniel Dunbar types::ID InputType = Inputs[0].getType(); 1811e94db4771856659c12e1f269141cbbc4e55b1c47Daniel Dunbar if (!Args.hasArg(options::OPT_fallow_unsupported)) { 1812e94db4771856659c12e1f269141cbbc4e55b1c47Daniel Dunbar Arg *Unsupported; 1813e94db4771856659c12e1f269141cbbc4e55b1c47Daniel Dunbar if (types::isCXX(InputType) && 1814905c45f15a25598620d19160c139c6b785aeea89Bob Wilson getToolChain().getTriple().isOSDarwin() && 1815e94db4771856659c12e1f269141cbbc4e55b1c47Daniel Dunbar getToolChain().getTriple().getArch() == llvm::Triple::x86) { 1816a544aeece3e16296bdbbc9ee32053fac9616f85bBob Wilson if ((Unsupported = Args.getLastArg(options::OPT_fapple_kext)) || 1817a544aeece3e16296bdbbc9ee32053fac9616f85bBob Wilson (Unsupported = Args.getLastArg(options::OPT_mkernel))) 18185f9e272e632e951b1efe824cd16acb4d96077930Chris Lattner D.Diag(diag::err_drv_clang_unsupported_opt_cxx_darwin_i386) 1819e94db4771856659c12e1f269141cbbc4e55b1c47Daniel Dunbar << Unsupported->getOption().getName(); 1820e94db4771856659c12e1f269141cbbc4e55b1c47Daniel Dunbar } 1821b30575c22f249c0697df0cd2aa872d14d4fa9c57Daniel Dunbar } 1822b30575c22f249c0697df0cd2aa872d14d4fa9c57Daniel Dunbar 18231d46033f760ba5fd266ce59fe391fac473f04f52Daniel Dunbar Args.AddAllArgs(CmdArgs, options::OPT_v); 1824f7c16d903f11814e2d6780e2a2e189b7a7afc4edDaniel Dunbar Args.AddLastArg(CmdArgs, options::OPT_H); 18252b81910618f63e4ce2373c926a26e76b4b91373fChad Rosier if (D.CCPrintHeaders && !D.CCGenDiagnostics) { 1826322c29fefe7fa33f03273136eb5f8b7f5b4df7c0Daniel Dunbar CmdArgs.push_back("-header-include-file"); 1827322c29fefe7fa33f03273136eb5f8b7f5b4df7c0Daniel Dunbar CmdArgs.push_back(D.CCPrintHeadersFilename ? 1828322c29fefe7fa33f03273136eb5f8b7f5b4df7c0Daniel Dunbar D.CCPrintHeadersFilename : "-"); 1829322c29fefe7fa33f03273136eb5f8b7f5b4df7c0Daniel Dunbar } 18301d46033f760ba5fd266ce59fe391fac473f04f52Daniel Dunbar Args.AddLastArg(CmdArgs, options::OPT_P); 18311eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump Args.AddLastArg(CmdArgs, options::OPT_print_ivar_layout); 18321d46033f760ba5fd266ce59fe391fac473f04f52Daniel Dunbar 18332b81910618f63e4ce2373c926a26e76b4b91373fChad Rosier if (D.CCLogDiagnostics && !D.CCGenDiagnostics) { 1834c8a22b091677c02003880166e5d5767ca8d74b70Daniel Dunbar CmdArgs.push_back("-diagnostic-log-file"); 1835c8a22b091677c02003880166e5d5767ca8d74b70Daniel Dunbar CmdArgs.push_back(D.CCLogDiagnosticsFilename ? 1836c8a22b091677c02003880166e5d5767ca8d74b70Daniel Dunbar D.CCLogDiagnosticsFilename : "-"); 1837c8a22b091677c02003880166e5d5767ca8d74b70Daniel Dunbar } 1838c8a22b091677c02003880166e5d5767ca8d74b70Daniel Dunbar 18391d46033f760ba5fd266ce59fe391fac473f04f52Daniel Dunbar // Special case debug options to only pass -g to clang. This is 18401d46033f760ba5fd266ce59fe391fac473f04f52Daniel Dunbar // wrong. 184118f36d9eac8b425e8cfed389bbbf02c030f26be7Rafael Espindola Args.ClaimAllArgs(options::OPT_g_Group); 18426b3d5a65cb486f46604d12a16831e8a228ee610fDaniel Dunbar if (Arg *A = Args.getLastArg(options::OPT_g_Group)) 18432875bda1505bce995f745002affb20862765ed04Chad Rosier if (!A->getOption().matches(options::OPT_g0)) { 1844cf6ba2eeaeabb03541ee98859805800c39759a47Chad Rosier CmdArgs.push_back("-g"); 18452875bda1505bce995f745002affb20862765ed04Chad Rosier } 1846fd00eecad6fa5400cf37269d84361a0551d0e6d3Alexey Samsonov if (Args.hasArg(options::OPT_gline_tables_only)) 1847fd00eecad6fa5400cf37269d84361a0551d0e6d3Alexey Samsonov CmdArgs.push_back("-gline-tables-only"); 18481d46033f760ba5fd266ce59fe391fac473f04f52Daniel Dunbar 18499cf933a67e54bea5475c5027fee2c1cf7365ee05Rafael Espindola Args.AddAllArgs(CmdArgs, options::OPT_ffunction_sections); 18509cf933a67e54bea5475c5027fee2c1cf7365ee05Rafael Espindola Args.AddAllArgs(CmdArgs, options::OPT_fdata_sections); 18519cf933a67e54bea5475c5027fee2c1cf7365ee05Rafael Espindola 18527255a2d997b15beae82e627052fdb1b2474495c2Chris Lattner Args.AddAllArgs(CmdArgs, options::OPT_finstrument_functions); 18537255a2d997b15beae82e627052fdb1b2474495c2Chris Lattner 1854e8ba8d78a258ec992d3521eebdae8324db777b14Nick Lewycky if (Args.hasArg(options::OPT_ftest_coverage) || 1855e8ba8d78a258ec992d3521eebdae8324db777b14Nick Lewycky Args.hasArg(options::OPT_coverage)) 1856e8ba8d78a258ec992d3521eebdae8324db777b14Nick Lewycky CmdArgs.push_back("-femit-coverage-notes"); 1857e8ba8d78a258ec992d3521eebdae8324db777b14Nick Lewycky if (Args.hasArg(options::OPT_fprofile_arcs) || 1858e8ba8d78a258ec992d3521eebdae8324db777b14Nick Lewycky Args.hasArg(options::OPT_coverage)) 1859e8ba8d78a258ec992d3521eebdae8324db777b14Nick Lewycky CmdArgs.push_back("-femit-coverage-data"); 1860e8ba8d78a258ec992d3521eebdae8324db777b14Nick Lewycky 18615ea4f44e34449a78d6b38aa47c14b527839d7aacNick Lewycky if (C.getArgs().hasArg(options::OPT_c) || 18625ea4f44e34449a78d6b38aa47c14b527839d7aacNick Lewycky C.getArgs().hasArg(options::OPT_S)) { 18635ea4f44e34449a78d6b38aa47c14b527839d7aacNick Lewycky if (Output.isFilename()) { 18643dc05418538c719fea48b906bfa4febe5296e126Nick Lewycky CmdArgs.push_back("-coverage-file"); 18653dc05418538c719fea48b906bfa4febe5296e126Nick Lewycky CmdArgs.push_back(Args.MakeArgString(Output.getFilename())); 18665ea4f44e34449a78d6b38aa47c14b527839d7aacNick Lewycky } 18675ea4f44e34449a78d6b38aa47c14b527839d7aacNick Lewycky } 18685ea4f44e34449a78d6b38aa47c14b527839d7aacNick Lewycky 1869a268fc0f2229eb132ebc8501b140093aeb5516bfDaniel Dunbar // Pass options for controlling the default header search paths. 1870a268fc0f2229eb132ebc8501b140093aeb5516bfDaniel Dunbar if (Args.hasArg(options::OPT_nostdinc)) { 1871a268fc0f2229eb132ebc8501b140093aeb5516bfDaniel Dunbar CmdArgs.push_back("-nostdsysteminc"); 1872a268fc0f2229eb132ebc8501b140093aeb5516bfDaniel Dunbar CmdArgs.push_back("-nobuiltininc"); 1873a268fc0f2229eb132ebc8501b140093aeb5516bfDaniel Dunbar } else { 187492d6d404833468120f9a86fb360691ac60585551Daniel Dunbar if (Args.hasArg(options::OPT_nostdlibinc)) 187592d6d404833468120f9a86fb360691ac60585551Daniel Dunbar CmdArgs.push_back("-nostdsysteminc"); 1876a268fc0f2229eb132ebc8501b140093aeb5516bfDaniel Dunbar Args.AddLastArg(CmdArgs, options::OPT_nostdincxx); 1877a268fc0f2229eb132ebc8501b140093aeb5516bfDaniel Dunbar Args.AddLastArg(CmdArgs, options::OPT_nobuiltininc); 1878a268fc0f2229eb132ebc8501b140093aeb5516bfDaniel Dunbar } 18791d46033f760ba5fd266ce59fe391fac473f04f52Daniel Dunbar 18805f12232ef39e3d6c36d6600a73ebbe3c4a79f514Daniel Dunbar // Pass the path to compiler resource files. 18815f12232ef39e3d6c36d6600a73ebbe3c4a79f514Daniel Dunbar CmdArgs.push_back("-resource-dir"); 1882225c41706dc0f3682236e351820d339e14390e00Daniel Dunbar CmdArgs.push_back(D.ResourceDir.c_str()); 18832ac9fc2ad64e16127df8c60caeea2edfe9a400a2Daniel Dunbar 1884389db16c63eec6ecfa9b235155252d8da766e94eArgyrios Kyrtzidis Args.AddLastArg(CmdArgs, options::OPT_working_directory); 1885389db16c63eec6ecfa9b235155252d8da766e94eArgyrios Kyrtzidis 188630660a898545416f0fea2d717f16f75640001e38Ted Kremenek bool ARCMTEnabled = false; 18878f0e8d22960d56f8390f4971e2c0f2f0a0884602John McCall if (!Args.hasArg(options::OPT_fno_objc_arc)) { 188872ac120023abb73f3ff9386e193fed55fa9a96e2Argyrios Kyrtzidis if (const Arg *A = Args.getLastArg(options::OPT_ccc_arcmt_check, 188969325d5b7cfecf1b3128745efc33612aedf1b8b4Argyrios Kyrtzidis options::OPT_ccc_arcmt_modify, 189069325d5b7cfecf1b3128745efc33612aedf1b8b4Argyrios Kyrtzidis options::OPT_ccc_arcmt_migrate)) { 189130660a898545416f0fea2d717f16f75640001e38Ted Kremenek ARCMTEnabled = true; 18928f0e8d22960d56f8390f4971e2c0f2f0a0884602John McCall switch (A->getOption().getID()) { 18938f0e8d22960d56f8390f4971e2c0f2f0a0884602John McCall default: 18948f0e8d22960d56f8390f4971e2c0f2f0a0884602John McCall llvm_unreachable("missed a case"); 189572ac120023abb73f3ff9386e193fed55fa9a96e2Argyrios Kyrtzidis case options::OPT_ccc_arcmt_check: 18968f0e8d22960d56f8390f4971e2c0f2f0a0884602John McCall CmdArgs.push_back("-arcmt-check"); 18978f0e8d22960d56f8390f4971e2c0f2f0a0884602John McCall break; 189872ac120023abb73f3ff9386e193fed55fa9a96e2Argyrios Kyrtzidis case options::OPT_ccc_arcmt_modify: 18998f0e8d22960d56f8390f4971e2c0f2f0a0884602John McCall CmdArgs.push_back("-arcmt-modify"); 19008f0e8d22960d56f8390f4971e2c0f2f0a0884602John McCall break; 190169325d5b7cfecf1b3128745efc33612aedf1b8b4Argyrios Kyrtzidis case options::OPT_ccc_arcmt_migrate: 190269325d5b7cfecf1b3128745efc33612aedf1b8b4Argyrios Kyrtzidis CmdArgs.push_back("-arcmt-migrate"); 190330660a898545416f0fea2d717f16f75640001e38Ted Kremenek CmdArgs.push_back("-mt-migrate-directory"); 190469325d5b7cfecf1b3128745efc33612aedf1b8b4Argyrios Kyrtzidis CmdArgs.push_back(A->getValue(Args)); 19057ee2049278b98d42709380054eb83f4952af1200Argyrios Kyrtzidis 19067ee2049278b98d42709380054eb83f4952af1200Argyrios Kyrtzidis Args.AddLastArg(CmdArgs, options::OPT_arcmt_migrate_report_output); 19077ee2049278b98d42709380054eb83f4952af1200Argyrios Kyrtzidis Args.AddLastArg(CmdArgs, options::OPT_arcmt_migrate_emit_arc_errors); 190869325d5b7cfecf1b3128745efc33612aedf1b8b4Argyrios Kyrtzidis break; 19098f0e8d22960d56f8390f4971e2c0f2f0a0884602John McCall } 19108f0e8d22960d56f8390f4971e2c0f2f0a0884602John McCall } 19118f0e8d22960d56f8390f4971e2c0f2f0a0884602John McCall } 191288b7cf00fcb582728c642da3927c59468efaf926Eric Christopher 191330660a898545416f0fea2d717f16f75640001e38Ted Kremenek if (const Arg *A = Args.getLastArg(options::OPT_ccc_objcmt_migrate)) { 191430660a898545416f0fea2d717f16f75640001e38Ted Kremenek if (ARCMTEnabled) { 191530660a898545416f0fea2d717f16f75640001e38Ted Kremenek D.Diag(diag::err_drv_argument_not_allowed_with) 191630660a898545416f0fea2d717f16f75640001e38Ted Kremenek << A->getAsString(Args) << "-ccc-arcmt-migrate"; 191730660a898545416f0fea2d717f16f75640001e38Ted Kremenek } 191830660a898545416f0fea2d717f16f75640001e38Ted Kremenek CmdArgs.push_back("-mt-migrate-directory"); 191930660a898545416f0fea2d717f16f75640001e38Ted Kremenek CmdArgs.push_back(A->getValue(Args)); 192030660a898545416f0fea2d717f16f75640001e38Ted Kremenek 192130660a898545416f0fea2d717f16f75640001e38Ted Kremenek if (!Args.hasArg(options::OPT_objcmt_migrate_literals, 192230660a898545416f0fea2d717f16f75640001e38Ted Kremenek options::OPT_objcmt_migrate_subscripting)) { 192330660a898545416f0fea2d717f16f75640001e38Ted Kremenek // None specified, means enable them all. 192430660a898545416f0fea2d717f16f75640001e38Ted Kremenek CmdArgs.push_back("-objcmt-migrate-literals"); 192530660a898545416f0fea2d717f16f75640001e38Ted Kremenek CmdArgs.push_back("-objcmt-migrate-subscripting"); 192630660a898545416f0fea2d717f16f75640001e38Ted Kremenek } else { 192730660a898545416f0fea2d717f16f75640001e38Ted Kremenek Args.AddLastArg(CmdArgs, options::OPT_objcmt_migrate_literals); 192830660a898545416f0fea2d717f16f75640001e38Ted Kremenek Args.AddLastArg(CmdArgs, options::OPT_objcmt_migrate_subscripting); 192930660a898545416f0fea2d717f16f75640001e38Ted Kremenek } 193030660a898545416f0fea2d717f16f75640001e38Ted Kremenek } 193130660a898545416f0fea2d717f16f75640001e38Ted Kremenek 1932c21c485b4fb58ef5d55cf3e523263dd824a2ace4Daniel Dunbar // Add preprocessing options like -I, -D, etc. if we are using the 1933c21c485b4fb58ef5d55cf3e523263dd824a2ace4Daniel Dunbar // preprocessor. 1934c21c485b4fb58ef5d55cf3e523263dd824a2ace4Daniel Dunbar // 1935c21c485b4fb58ef5d55cf3e523263dd824a2ace4Daniel Dunbar // FIXME: Support -fpreprocessed 1936c21c485b4fb58ef5d55cf3e523263dd824a2ace4Daniel Dunbar if (types::getPreprocessedType(InputType) != types::TY_INVALID) 193754db68bf0e389b8aabe1a434f825a81a9c1f7db8Peter Collingbourne AddPreprocessingOptions(C, D, Args, CmdArgs, Output, Inputs); 19381d46033f760ba5fd266ce59fe391fac473f04f52Daniel Dunbar 193919d9d2ebbed9164e3f3a20fa065a26585c990a2eRafael Espindola // Don't warn about "clang -c -DPIC -fPIC test.i" because libtool.m4 assumes 194019d9d2ebbed9164e3f3a20fa065a26585c990a2eRafael Espindola // that "The compiler can only warn and ignore the option if not recognized". 194119d9d2ebbed9164e3f3a20fa065a26585c990a2eRafael Espindola // When building with ccache, it will pass -D options to clang even on 194219d9d2ebbed9164e3f3a20fa065a26585c990a2eRafael Espindola // preprocessed inputs and configure concludes that -fPIC is not supported. 194319d9d2ebbed9164e3f3a20fa065a26585c990a2eRafael Espindola Args.ClaimAllArgs(options::OPT_D); 194419d9d2ebbed9164e3f3a20fa065a26585c990a2eRafael Espindola 194520f0eacf1682e4594da9d318b5b13ed4f6d6e7e5Daniel Dunbar // Manually translate -O to -O2 and -O4 to -O3; let clang reject 1946337a6271b98c4c183f7eaad1563a75260b4f2871Daniel Dunbar // others. 1947337a6271b98c4c183f7eaad1563a75260b4f2871Daniel Dunbar if (Arg *A = Args.getLastArg(options::OPT_O_Group)) { 1948b827a0541b5fd095fcdb7ad0c3df93ca158c619aDaniel Dunbar if (A->getOption().matches(options::OPT_O4)) 1949337a6271b98c4c183f7eaad1563a75260b4f2871Daniel Dunbar CmdArgs.push_back("-O3"); 1950473916c038f75fa3b0c51a0bc7afc5b082e5c22fDaniel Dunbar else if (A->getOption().matches(options::OPT_O) && 1951473916c038f75fa3b0c51a0bc7afc5b082e5c22fDaniel Dunbar A->getValue(Args)[0] == '\0') 195220f0eacf1682e4594da9d318b5b13ed4f6d6e7e5Daniel Dunbar CmdArgs.push_back("-O2"); 19531d46033f760ba5fd266ce59fe391fac473f04f52Daniel Dunbar else 19545697aa0d75c87bafec78984048d558f8d12ca1b3Daniel Dunbar A->render(Args, CmdArgs); 19551d46033f760ba5fd266ce59fe391fac473f04f52Daniel Dunbar } 19561d46033f760ba5fd266ce59fe391fac473f04f52Daniel Dunbar 19576e8371eb97a08f724be22ae6042d1e9eacbe4c48Daniel Dunbar Args.AddAllArgs(CmdArgs, options::OPT_W_Group); 19586e8371eb97a08f724be22ae6042d1e9eacbe4c48Daniel Dunbar Args.AddLastArg(CmdArgs, options::OPT_pedantic); 19596e8371eb97a08f724be22ae6042d1e9eacbe4c48Daniel Dunbar Args.AddLastArg(CmdArgs, options::OPT_pedantic_errors); 19601d46033f760ba5fd266ce59fe391fac473f04f52Daniel Dunbar Args.AddLastArg(CmdArgs, options::OPT_w); 1961d573d26e1abcce24c31ece3d6f7af158db569e4cDaniel Dunbar 1962d573d26e1abcce24c31ece3d6f7af158db569e4cDaniel Dunbar // Handle -{std, ansi, trigraphs} -- take the last of -{std, ansi} 1963d573d26e1abcce24c31ece3d6f7af158db569e4cDaniel Dunbar // (-ansi is equivalent to -std=c89). 1964d573d26e1abcce24c31ece3d6f7af158db569e4cDaniel Dunbar // 1965d573d26e1abcce24c31ece3d6f7af158db569e4cDaniel Dunbar // If a std is supplied, only add -trigraphs if it follows the 1966d573d26e1abcce24c31ece3d6f7af158db569e4cDaniel Dunbar // option. 1967d573d26e1abcce24c31ece3d6f7af158db569e4cDaniel Dunbar if (Arg *Std = Args.getLastArg(options::OPT_std_EQ, options::OPT_ansi)) { 1968d573d26e1abcce24c31ece3d6f7af158db569e4cDaniel Dunbar if (Std->getOption().matches(options::OPT_ansi)) 1969528365d3189d27f3a90a4012baaa8b2814e0a231Nuno Lopes if (types::isCXX(InputType)) 1970294691eb1caf551083acd7b08630ef21c3fd760dDaniel Dunbar CmdArgs.push_back("-std=c++98"); 1971528365d3189d27f3a90a4012baaa8b2814e0a231Nuno Lopes else 1972294691eb1caf551083acd7b08630ef21c3fd760dDaniel Dunbar CmdArgs.push_back("-std=c89"); 1973d573d26e1abcce24c31ece3d6f7af158db569e4cDaniel Dunbar else 1974d573d26e1abcce24c31ece3d6f7af158db569e4cDaniel Dunbar Std->render(Args, CmdArgs); 1975d573d26e1abcce24c31ece3d6f7af158db569e4cDaniel Dunbar 19760e10031ba5d0f9b3e5bc5570f39382d288779ab8Daniel Dunbar if (Arg *A = Args.getLastArg(options::OPT_std_EQ, options::OPT_ansi, 19770e10031ba5d0f9b3e5bc5570f39382d288779ab8Daniel Dunbar options::OPT_trigraphs)) 19780e10031ba5d0f9b3e5bc5570f39382d288779ab8Daniel Dunbar if (A != Std) 1979d573d26e1abcce24c31ece3d6f7af158db569e4cDaniel Dunbar A->render(Args, CmdArgs); 1980a3ff202ee4fb21728e930d5d029ba4925129912cDaniel Dunbar } else { 1981a3ff202ee4fb21728e930d5d029ba4925129912cDaniel Dunbar // Honor -std-default. 19824a5290e773e70ec2c3b4353a3a4aa7d1a3e3cd66Daniel Dunbar // 19834a5290e773e70ec2c3b4353a3a4aa7d1a3e3cd66Daniel Dunbar // FIXME: Clang doesn't correctly handle -std= when the input language 19844a5290e773e70ec2c3b4353a3a4aa7d1a3e3cd66Daniel Dunbar // doesn't match. For the time being just ignore this for C++ inputs; 19854a5290e773e70ec2c3b4353a3a4aa7d1a3e3cd66Daniel Dunbar // eventually we want to do all the standard defaulting here instead of 19864a5290e773e70ec2c3b4353a3a4aa7d1a3e3cd66Daniel Dunbar // splitting it between the driver and clang -cc1. 19874a5290e773e70ec2c3b4353a3a4aa7d1a3e3cd66Daniel Dunbar if (!types::isCXX(InputType)) 19884a5290e773e70ec2c3b4353a3a4aa7d1a3e3cd66Daniel Dunbar Args.AddAllArgsTranslated(CmdArgs, options::OPT_std_default_EQ, 19894a5290e773e70ec2c3b4353a3a4aa7d1a3e3cd66Daniel Dunbar "-std=", /*Joined=*/true); 1990d573d26e1abcce24c31ece3d6f7af158db569e4cDaniel Dunbar Args.AddLastArg(CmdArgs, options::OPT_trigraphs); 1991a3ff202ee4fb21728e930d5d029ba4925129912cDaniel Dunbar } 1992c21c485b4fb58ef5d55cf3e523263dd824a2ace4Daniel Dunbar 199350465d1d2f5f6dd3d8e18e2cf7bad4691e5ca6a8Chandler Carruth // Map the bizarre '-Wwrite-strings' flag to a more sensible 199450465d1d2f5f6dd3d8e18e2cf7bad4691e5ca6a8Chandler Carruth // '-fconst-strings'; this better indicates its actual behavior. 199550465d1d2f5f6dd3d8e18e2cf7bad4691e5ca6a8Chandler Carruth if (Args.hasFlag(options::OPT_Wwrite_strings, options::OPT_Wno_write_strings, 199650465d1d2f5f6dd3d8e18e2cf7bad4691e5ca6a8Chandler Carruth false)) { 199750465d1d2f5f6dd3d8e18e2cf7bad4691e5ca6a8Chandler Carruth // For perfect compatibility with GCC, we do this even in the presence of 199850465d1d2f5f6dd3d8e18e2cf7bad4691e5ca6a8Chandler Carruth // '-w'. This flag names something other than a warning for GCC. 199950465d1d2f5f6dd3d8e18e2cf7bad4691e5ca6a8Chandler Carruth CmdArgs.push_back("-fconst-strings"); 200050465d1d2f5f6dd3d8e18e2cf7bad4691e5ca6a8Chandler Carruth } 200150465d1d2f5f6dd3d8e18e2cf7bad4691e5ca6a8Chandler Carruth 20021cfe3c305c0d5393fd94167808b8f5d96cd65227Chandler Carruth // GCC provides a macro definition '__DEPRECATED' when -Wdeprecated is active 2003f8c247d247f9f7ab2bf4965677e6d056711c99d5Chandler Carruth // during C++ compilation, which it is by default. GCC keeps this define even 2004f8c247d247f9f7ab2bf4965677e6d056711c99d5Chandler Carruth // in the presence of '-w', match this behavior bug-for-bug. 2005f8c247d247f9f7ab2bf4965677e6d056711c99d5Chandler Carruth if (types::isCXX(InputType) && 2006f8c247d247f9f7ab2bf4965677e6d056711c99d5Chandler Carruth Args.hasFlag(options::OPT_Wdeprecated, options::OPT_Wno_deprecated, 2007f8c247d247f9f7ab2bf4965677e6d056711c99d5Chandler Carruth true)) { 2008f8c247d247f9f7ab2bf4965677e6d056711c99d5Chandler Carruth CmdArgs.push_back("-fdeprecated-macro"); 20091cfe3c305c0d5393fd94167808b8f5d96cd65227Chandler Carruth } 20101cfe3c305c0d5393fd94167808b8f5d96cd65227Chandler Carruth 2011c304ba341a7daa88da42faf8f86310b764dd7b6aChandler Carruth // Translate GCC's misnamer '-fasm' arguments to '-fgnu-keywords'. 2012c304ba341a7daa88da42faf8f86310b764dd7b6aChandler Carruth if (Arg *Asm = Args.getLastArg(options::OPT_fasm, options::OPT_fno_asm)) { 2013c304ba341a7daa88da42faf8f86310b764dd7b6aChandler Carruth if (Asm->getOption().matches(options::OPT_fasm)) 2014c304ba341a7daa88da42faf8f86310b764dd7b6aChandler Carruth CmdArgs.push_back("-fgnu-keywords"); 2015c304ba341a7daa88da42faf8f86310b764dd7b6aChandler Carruth else 2016c304ba341a7daa88da42faf8f86310b764dd7b6aChandler Carruth CmdArgs.push_back("-fno-gnu-keywords"); 2017c304ba341a7daa88da42faf8f86310b764dd7b6aChandler Carruth } 2018c304ba341a7daa88da42faf8f86310b764dd7b6aChandler Carruth 201961b1efe2d0b459a98962fd9b4c097ad8bb9bfdecRafael Espindola if (ShouldDisableCFI(Args, getToolChain())) 202061b1efe2d0b459a98962fd9b4c097ad8bb9bfdecRafael Espindola CmdArgs.push_back("-fno-dwarf2-cfi-asm"); 2021f24a151d645abc89f94aa58ad59f3131502041b1Rafael Espindola 2022ea523d73a6de06f828952a02f5ff86e4cc631695Nick Lewycky if (ShouldDisableDwarfDirectory(Args, getToolChain())) 2023ea523d73a6de06f828952a02f5ff86e4cc631695Nick Lewycky CmdArgs.push_back("-fno-dwarf-directory-asm"); 2024ea523d73a6de06f828952a02f5ff86e4cc631695Nick Lewycky 20257c4fd9121f5885096fd3258d20a984e3f08f8603Nick Lewycky if (const char *pwd = ::getenv("PWD")) { 20267c4fd9121f5885096fd3258d20a984e3f08f8603Nick Lewycky // GCC also verifies that stat(pwd) and stat(".") have the same inode 20277c4fd9121f5885096fd3258d20a984e3f08f8603Nick Lewycky // number. Not doing those because stats are slow, but we could. 2028813a40750f7e8cd1e09a8aa1091283224a6adf21NAKAMURA Takumi if (llvm::sys::path::is_absolute(pwd)) { 20297c4fd9121f5885096fd3258d20a984e3f08f8603Nick Lewycky std::string CompDir = pwd; 20307c4fd9121f5885096fd3258d20a984e3f08f8603Nick Lewycky CmdArgs.push_back("-fdebug-compilation-dir"); 20317c4fd9121f5885096fd3258d20a984e3f08f8603Nick Lewycky CmdArgs.push_back(Args.MakeArgString(CompDir)); 20327c4fd9121f5885096fd3258d20a984e3f08f8603Nick Lewycky } 20337c4fd9121f5885096fd3258d20a984e3f08f8603Nick Lewycky } 20347c4fd9121f5885096fd3258d20a984e3f08f8603Nick Lewycky 2035c18c42345636e2866fed75c7e434fb659d747672Richard Smith if (Arg *A = Args.getLastArg(options::OPT_ftemplate_depth_, 2036c18c42345636e2866fed75c7e434fb659d747672Richard Smith options::OPT_ftemplate_depth_EQ)) { 20371d46033f760ba5fd266ce59fe391fac473f04f52Daniel Dunbar CmdArgs.push_back("-ftemplate-depth"); 20381d46033f760ba5fd266ce59fe391fac473f04f52Daniel Dunbar CmdArgs.push_back(A->getValue(Args)); 2039b488c1dac8e53206f07103d794a62a3f5012c0f4Daniel Dunbar } 2040b488c1dac8e53206f07103d794a62a3f5012c0f4Daniel Dunbar 2041c18c42345636e2866fed75c7e434fb659d747672Richard Smith if (Arg *A = Args.getLastArg(options::OPT_fconstexpr_depth_EQ)) { 2042c18c42345636e2866fed75c7e434fb659d747672Richard Smith CmdArgs.push_back("-fconstexpr-depth"); 2043c18c42345636e2866fed75c7e434fb659d747672Richard Smith CmdArgs.push_back(A->getValue(Args)); 2044c18c42345636e2866fed75c7e434fb659d747672Richard Smith } 2045c18c42345636e2866fed75c7e434fb659d747672Richard Smith 20461380a147d4578b619c215b23aa79ce17036d3c46Argyrios Kyrtzidis if (Arg *A = Args.getLastArg(options::OPT_Wlarge_by_value_copy_EQ, 20471380a147d4578b619c215b23aa79ce17036d3c46Argyrios Kyrtzidis options::OPT_Wlarge_by_value_copy_def)) { 20482e4fd6d9a1c8ba9c400324d230cfc49050550deaJean-Daniel Dupas if (A->getNumValues()) { 20492e4fd6d9a1c8ba9c400324d230cfc49050550deaJean-Daniel Dupas StringRef bytes = A->getValue(Args); 20502e4fd6d9a1c8ba9c400324d230cfc49050550deaJean-Daniel Dupas CmdArgs.push_back(Args.MakeArgString("-Wlarge-by-value-copy=" + bytes)); 20512e4fd6d9a1c8ba9c400324d230cfc49050550deaJean-Daniel Dupas } else 20522e4fd6d9a1c8ba9c400324d230cfc49050550deaJean-Daniel Dupas CmdArgs.push_back("-Wlarge-by-value-copy=64"); // default value 20533532fdd1db8ff6f353f2a5b215cebe3e0e2ff3c2Argyrios Kyrtzidis } 20543532fdd1db8ff6f353f2a5b215cebe3e0e2ff3c2Argyrios Kyrtzidis 2055b3198a841e7f356f171f1e11faff014b2deb1eb8Nuno Lopes if (Arg *A = Args.getLastArg(options::OPT_fbounds_checking, 2056b3198a841e7f356f171f1e11faff014b2deb1eb8Nuno Lopes options::OPT_fbounds_checking_EQ)) { 2057b3198a841e7f356f171f1e11faff014b2deb1eb8Nuno Lopes if (A->getNumValues()) { 2058b3198a841e7f356f171f1e11faff014b2deb1eb8Nuno Lopes StringRef val = A->getValue(Args); 2059b3198a841e7f356f171f1e11faff014b2deb1eb8Nuno Lopes CmdArgs.push_back(Args.MakeArgString("-fbounds-checking=" + val)); 2060b3198a841e7f356f171f1e11faff014b2deb1eb8Nuno Lopes } else 2061b3198a841e7f356f171f1e11faff014b2deb1eb8Nuno Lopes CmdArgs.push_back("-fbounds-checking=1"); 2062b3198a841e7f356f171f1e11faff014b2deb1eb8Nuno Lopes } 2063b3198a841e7f356f171f1e11faff014b2deb1eb8Nuno Lopes 2064e4bdae78c69d2a09ee96619cc5ccf81441674412Daniel Dunbar if (Args.hasArg(options::OPT__relocatable_pch)) 206566861e09d590994a8b941eaa328e4d8f33adec9eDaniel Dunbar CmdArgs.push_back("-relocatable-pch"); 20661eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump 2067294691eb1caf551083acd7b08630ef21c3fd760dDaniel Dunbar if (Arg *A = Args.getLastArg(options::OPT_fconstant_string_class_EQ)) { 2068294691eb1caf551083acd7b08630ef21c3fd760dDaniel Dunbar CmdArgs.push_back("-fconstant-string-class"); 2069294691eb1caf551083acd7b08630ef21c3fd760dDaniel Dunbar CmdArgs.push_back(A->getValue(Args)); 2070294691eb1caf551083acd7b08630ef21c3fd760dDaniel Dunbar } 20718a5a9aaddb627c0884c2ed8db55cc29fdb601195David Chisnall 2072124fca533d9fef2e3f6359283909bd342b5f5f26Chris Lattner if (Arg *A = Args.getLastArg(options::OPT_ftabstop_EQ)) { 2073124fca533d9fef2e3f6359283909bd342b5f5f26Chris Lattner CmdArgs.push_back("-ftabstop"); 2074124fca533d9fef2e3f6359283909bd342b5f5f26Chris Lattner CmdArgs.push_back(A->getValue(Args)); 2075124fca533d9fef2e3f6359283909bd342b5f5f26Chris Lattner } 2076124fca533d9fef2e3f6359283909bd342b5f5f26Chris Lattner 20770f0c963f9b7ac6f0176c34d405d48fcb005dfab6Chris Lattner CmdArgs.push_back("-ferror-limit"); 20780f0c963f9b7ac6f0176c34d405d48fcb005dfab6Chris Lattner if (Arg *A = Args.getLastArg(options::OPT_ferror_limit_EQ)) 20790f0c963f9b7ac6f0176c34d405d48fcb005dfab6Chris Lattner CmdArgs.push_back(A->getValue(Args)); 20800f0c963f9b7ac6f0176c34d405d48fcb005dfab6Chris Lattner else 20810f0c963f9b7ac6f0176c34d405d48fcb005dfab6Chris Lattner CmdArgs.push_back("19"); 2082575cf3791216c33770ba950430493cdd43099f8fDouglas Gregor 2083c40f73c6e715044d327409564bf3656254101d46Chandler Carruth if (Arg *A = Args.getLastArg(options::OPT_fmacro_backtrace_limit_EQ)) { 2084c40f73c6e715044d327409564bf3656254101d46Chandler Carruth CmdArgs.push_back("-fmacro-backtrace-limit"); 20856c1cb9916e9988dcdd65b9266dbe24afd173427aDouglas Gregor CmdArgs.push_back(A->getValue(Args)); 2086c40f73c6e715044d327409564bf3656254101d46Chandler Carruth } 2087c40f73c6e715044d327409564bf3656254101d46Chandler Carruth 2088c40f73c6e715044d327409564bf3656254101d46Chandler Carruth if (Arg *A = Args.getLastArg(options::OPT_ftemplate_backtrace_limit_EQ)) { 2089c40f73c6e715044d327409564bf3656254101d46Chandler Carruth CmdArgs.push_back("-ftemplate-backtrace-limit"); 2090575cf3791216c33770ba950430493cdd43099f8fDouglas Gregor CmdArgs.push_back(A->getValue(Args)); 2091c40f73c6e715044d327409564bf3656254101d46Chandler Carruth } 2092c40f73c6e715044d327409564bf3656254101d46Chandler Carruth 209308d6e032a2a0a8656d12b3b7b93942987bb12eb7Richard Smith if (Arg *A = Args.getLastArg(options::OPT_fconstexpr_backtrace_limit_EQ)) { 209408d6e032a2a0a8656d12b3b7b93942987bb12eb7Richard Smith CmdArgs.push_back("-fconstexpr-backtrace-limit"); 209508d6e032a2a0a8656d12b3b7b93942987bb12eb7Richard Smith CmdArgs.push_back(A->getValue(Args)); 209608d6e032a2a0a8656d12b3b7b93942987bb12eb7Richard Smith } 209708d6e032a2a0a8656d12b3b7b93942987bb12eb7Richard Smith 209855efe142a84b2aab6d0186c20a311c347a65f794Daniel Dunbar // Pass -fmessage-length=. 2099a28690e5b0e423a6287ebe3a5565fd1896d7ebffDaniel Dunbar CmdArgs.push_back("-fmessage-length"); 210055efe142a84b2aab6d0186c20a311c347a65f794Daniel Dunbar if (Arg *A = Args.getLastArg(options::OPT_fmessage_length_EQ)) { 2101a28690e5b0e423a6287ebe3a5565fd1896d7ebffDaniel Dunbar CmdArgs.push_back(A->getValue(Args)); 210255efe142a84b2aab6d0186c20a311c347a65f794Daniel Dunbar } else { 210355efe142a84b2aab6d0186c20a311c347a65f794Daniel Dunbar // If -fmessage-length=N was not specified, determine whether this is a 210455efe142a84b2aab6d0186c20a311c347a65f794Daniel Dunbar // terminal and, if so, implicitly define -fmessage-length appropriately. 210555efe142a84b2aab6d0186c20a311c347a65f794Daniel Dunbar unsigned N = llvm::sys::Process::StandardErrColumns(); 21065f9e272e632e951b1efe824cd16acb4d96077930Chris Lattner CmdArgs.push_back(Args.MakeArgString(Twine(N))); 210755efe142a84b2aab6d0186c20a311c347a65f794Daniel Dunbar } 210855efe142a84b2aab6d0186c20a311c347a65f794Daniel Dunbar 2109ba8d86172c8d9e2476c6fd2415731639223174c5Daniel Dunbar if (const Arg *A = Args.getLastArg(options::OPT_fvisibility_EQ)) { 2110ba8d86172c8d9e2476c6fd2415731639223174c5Daniel Dunbar CmdArgs.push_back("-fvisibility"); 2111ba8d86172c8d9e2476c6fd2415731639223174c5Daniel Dunbar CmdArgs.push_back(A->getValue(Args)); 2112ba8d86172c8d9e2476c6fd2415731639223174c5Daniel Dunbar } 2113ba8d86172c8d9e2476c6fd2415731639223174c5Daniel Dunbar 21147cf84d66965a7706004d8590b5af5fe54b85f525Douglas Gregor Args.AddLastArg(CmdArgs, options::OPT_fvisibility_inlines_hidden); 211520249a1af2e462dcafdd6a350f1c7967b264ff25Michael J. Spencer 21160a80ba74ffa3d3df55abfbc4474d7470c7c923e3Daniel Dunbar // -fhosted is default. 2117afc4baa37c2f38fadf05b15456b10a0994d51b0bChad Rosier if (Args.hasFlag(options::OPT_ffreestanding, options::OPT_fhosted, false) || 2118afc4baa37c2f38fadf05b15456b10a0994d51b0bChad Rosier KernelOrKext) 21190a80ba74ffa3d3df55abfbc4474d7470c7c923e3Daniel Dunbar CmdArgs.push_back("-ffreestanding"); 21200a80ba74ffa3d3df55abfbc4474d7470c7c923e3Daniel Dunbar 2121ba8d86172c8d9e2476c6fd2415731639223174c5Daniel Dunbar // Forward -f (flag) options which we can pass directly. 21229c276ae0f24d4cee8f7954069d4b8eae45d0447dMike Stump Args.AddLastArg(CmdArgs, options::OPT_fcatch_undefined_behavior); 21233aaf082689d3235937a2e56a60f90fc1b3aebfb2Daniel Dunbar Args.AddLastArg(CmdArgs, options::OPT_femit_all_decls); 21243aaf082689d3235937a2e56a60f90fc1b3aebfb2Daniel Dunbar Args.AddLastArg(CmdArgs, options::OPT_fheinous_gnu_extensions); 2125c69e1cf04323f2e786d40e8a5ba84e77ee1c6827Devang Patel Args.AddLastArg(CmdArgs, options::OPT_flimit_debug_info); 2126033be8bd33e0f84db8158771e13528e071563b73Devang Patel Args.AddLastArg(CmdArgs, options::OPT_fno_limit_debug_info); 2127e88c4513157cc551ed8080b1e3b3b875a9a570e1Eric Christopher Args.AddLastArg(CmdArgs, options::OPT_fno_operator_names); 212817ba267cae596d5eb35fa0963ebcf73571572940Anton Yartsev Args.AddLastArg(CmdArgs, options::OPT_faltivec); 21294574c3d75edb0a496d36246b760094f3acf1ba27Chad Rosier 21304574c3d75edb0a496d36246b760094f3acf1ba27Chad Rosier // Report and error for -faltivec on anything other then PowerPC. 21314574c3d75edb0a496d36246b760094f3acf1ba27Chad Rosier if (const Arg *A = Args.getLastArg(options::OPT_faltivec)) 21324574c3d75edb0a496d36246b760094f3acf1ba27Chad Rosier if (!(getToolChain().getTriple().getArch() == llvm::Triple::ppc || 21334574c3d75edb0a496d36246b760094f3acf1ba27Chad Rosier getToolChain().getTriple().getArch() == llvm::Triple::ppc64)) 21344574c3d75edb0a496d36246b760094f3acf1ba27Chad Rosier D.Diag(diag::err_drv_argument_only_allowed_with) 21354574c3d75edb0a496d36246b760094f3acf1ba27Chad Rosier << A->getAsString(Args) << "ppc/ppc64"; 21364574c3d75edb0a496d36246b760094f3acf1ba27Chad Rosier 2137bbe8e3eff56ac1d79f3668d706536e3cebe28c18Daniel Dunbar if (getToolChain().SupportsProfiling()) 2138bbe8e3eff56ac1d79f3668d706536e3cebe28c18Daniel Dunbar Args.AddLastArg(CmdArgs, options::OPT_pg); 21398c6fa84b2e4a30317b7b214a7657cb593d67773bDaniel Dunbar 21401b4eca67e073f0beefb9924cbe6c65427869f1faKostya Serebryany if (Args.hasFlag(options::OPT_faddress_sanitizer, 21411b4eca67e073f0beefb9924cbe6c65427869f1faKostya Serebryany options::OPT_fno_address_sanitizer, false)) 21421b4eca67e073f0beefb9924cbe6c65427869f1faKostya Serebryany CmdArgs.push_back("-faddress-sanitizer"); 21431b4eca67e073f0beefb9924cbe6c65427869f1faKostya Serebryany 21443c93122d31924d6d4a6265f36a0c98a164002da6Kostya Serebryany if (Args.hasFlag(options::OPT_fthread_sanitizer, 21453c93122d31924d6d4a6265f36a0c98a164002da6Kostya Serebryany options::OPT_fno_thread_sanitizer, false)) 21463c93122d31924d6d4a6265f36a0c98a164002da6Kostya Serebryany CmdArgs.push_back("-fthread-sanitizer"); 21473c93122d31924d6d4a6265f36a0c98a164002da6Kostya Serebryany 21488c6fa84b2e4a30317b7b214a7657cb593d67773bDaniel Dunbar // -flax-vector-conversions is default. 21498c6fa84b2e4a30317b7b214a7657cb593d67773bDaniel Dunbar if (!Args.hasFlag(options::OPT_flax_vector_conversions, 21508c6fa84b2e4a30317b7b214a7657cb593d67773bDaniel Dunbar options::OPT_fno_lax_vector_conversions)) 21518c6fa84b2e4a30317b7b214a7657cb593d67773bDaniel Dunbar CmdArgs.push_back("-fno-lax-vector-conversions"); 21528c6fa84b2e4a30317b7b214a7657cb593d67773bDaniel Dunbar 2153b466d01e464b21832c23eeed90112bc5c26c0236Fariborz Jahanian if (Args.getLastArg(options::OPT_fapple_kext)) 2154b466d01e464b21832c23eeed90112bc5c26c0236Fariborz Jahanian CmdArgs.push_back("-fapple-kext"); 2155b466d01e464b21832c23eeed90112bc5c26c0236Fariborz Jahanian 215634e65770ad6142b033d6cec4f476ed20fb248bf3Fariborz Jahanian Args.AddLastArg(CmdArgs, options::OPT_fobjc_sender_dependent_dispatch); 2157182e09240a33c6f1d303deecabec6e0e9c9d109dChris Lattner Args.AddLastArg(CmdArgs, options::OPT_fdiagnostics_print_source_range_info); 21584786c15f4977c7cee98fde3ebdee213dba23848bDouglas Gregor Args.AddLastArg(CmdArgs, options::OPT_fdiagnostics_parseable_fixits); 21593aaf082689d3235937a2e56a60f90fc1b3aebfb2Daniel Dunbar Args.AddLastArg(CmdArgs, options::OPT_ftime_report); 21603aaf082689d3235937a2e56a60f90fc1b3aebfb2Daniel Dunbar Args.AddLastArg(CmdArgs, options::OPT_ftrapv); 21617f18e67e1b577a50402e8b43508ab2311a5c45b5David Chisnall 21627f18e67e1b577a50402e8b43508ab2311a5c45b5David Chisnall if (Arg *A = Args.getLastArg(options::OPT_ftrapv_handler_EQ)) { 21637f18e67e1b577a50402e8b43508ab2311a5c45b5David Chisnall CmdArgs.push_back("-ftrapv-handler"); 21647f18e67e1b577a50402e8b43508ab2311a5c45b5David Chisnall CmdArgs.push_back(A->getValue(Args)); 21657f18e67e1b577a50402e8b43508ab2311a5c45b5David Chisnall } 21667f18e67e1b577a50402e8b43508ab2311a5c45b5David Chisnall 216771fd6cc843719cab528a5df0899ad3d15cb9297fBob Wilson Args.AddLastArg(CmdArgs, options::OPT_ftrap_function_EQ); 216849af1f3cedc55726e4a3dd343eb4a8e24eab8439Evan Cheng 21695adb5a84bfb4f2e5f1ea28fdfc6ee1cd9b622c60Chandler Carruth // -fno-strict-overflow implies -fwrapv if it isn't disabled, but 21705adb5a84bfb4f2e5f1ea28fdfc6ee1cd9b622c60Chandler Carruth // -fstrict-overflow won't turn off an explicitly enabled -fwrapv. 21715adb5a84bfb4f2e5f1ea28fdfc6ee1cd9b622c60Chandler Carruth if (Arg *A = Args.getLastArg(options::OPT_fwrapv, 21725adb5a84bfb4f2e5f1ea28fdfc6ee1cd9b622c60Chandler Carruth options::OPT_fno_wrapv)) { 21735adb5a84bfb4f2e5f1ea28fdfc6ee1cd9b622c60Chandler Carruth if (A->getOption().matches(options::OPT_fwrapv)) 21745adb5a84bfb4f2e5f1ea28fdfc6ee1cd9b622c60Chandler Carruth CmdArgs.push_back("-fwrapv"); 21755adb5a84bfb4f2e5f1ea28fdfc6ee1cd9b622c60Chandler Carruth } else if (Arg *A = Args.getLastArg(options::OPT_fstrict_overflow, 21765adb5a84bfb4f2e5f1ea28fdfc6ee1cd9b622c60Chandler Carruth options::OPT_fno_strict_overflow)) { 21775adb5a84bfb4f2e5f1ea28fdfc6ee1cd9b622c60Chandler Carruth if (A->getOption().matches(options::OPT_fno_strict_overflow)) 21785adb5a84bfb4f2e5f1ea28fdfc6ee1cd9b622c60Chandler Carruth CmdArgs.push_back("-fwrapv"); 21795adb5a84bfb4f2e5f1ea28fdfc6ee1cd9b622c60Chandler Carruth } 21803aaf082689d3235937a2e56a60f90fc1b3aebfb2Daniel Dunbar Args.AddLastArg(CmdArgs, options::OPT_fwritable_strings); 2181f84d409903dd4107c8cef5a08fcfce6e5c21d4deEric Christopher Args.AddLastArg(CmdArgs, options::OPT_funroll_loops); 21821d46033f760ba5fd266ce59fe391fac473f04f52Daniel Dunbar 21835345c391c65d1780a0d7b0102b7f735cc3f82732Daniel Dunbar Args.AddLastArg(CmdArgs, options::OPT_pthread); 21845345c391c65d1780a0d7b0102b7f735cc3f82732Daniel Dunbar 21859e5cc6b703b2d0013f13800c2ffbeb3cf85fcfadDaniel Dunbar // -stack-protector=0 is default. 21869e5cc6b703b2d0013f13800c2ffbeb3cf85fcfadDaniel Dunbar unsigned StackProtectorLevel = 0; 218745483f7a1b3e57b4603b141bee80596b2d4dd443Bill Wendling if (Arg *A = Args.getLastArg(options::OPT_fno_stack_protector, 218845483f7a1b3e57b4603b141bee80596b2d4dd443Bill Wendling options::OPT_fstack_protector_all, 218945483f7a1b3e57b4603b141bee80596b2d4dd443Bill Wendling options::OPT_fstack_protector)) { 21909e5cc6b703b2d0013f13800c2ffbeb3cf85fcfadDaniel Dunbar if (A->getOption().matches(options::OPT_fstack_protector)) 21919e5cc6b703b2d0013f13800c2ffbeb3cf85fcfadDaniel Dunbar StackProtectorLevel = 1; 21929e5cc6b703b2d0013f13800c2ffbeb3cf85fcfadDaniel Dunbar else if (A->getOption().matches(options::OPT_fstack_protector_all)) 21939e5cc6b703b2d0013f13800c2ffbeb3cf85fcfadDaniel Dunbar StackProtectorLevel = 2; 21942fef11164cbe804f7b808c07757c6f900c08d765Nico Weber } else { 21952fef11164cbe804f7b808c07757c6f900c08d765Nico Weber StackProtectorLevel = 21962fef11164cbe804f7b808c07757c6f900c08d765Nico Weber getToolChain().GetDefaultStackProtectorLevel(KernelOrKext); 21972fef11164cbe804f7b808c07757c6f900c08d765Nico Weber } 21989e5cc6b703b2d0013f13800c2ffbeb3cf85fcfadDaniel Dunbar if (StackProtectorLevel) { 21999e5cc6b703b2d0013f13800c2ffbeb3cf85fcfadDaniel Dunbar CmdArgs.push_back("-stack-protector"); 22005f9e272e632e951b1efe824cd16acb4d96077930Chris Lattner CmdArgs.push_back(Args.MakeArgString(Twine(StackProtectorLevel))); 220145483f7a1b3e57b4603b141bee80596b2d4dd443Bill Wendling } 220245483f7a1b3e57b4603b141bee80596b2d4dd443Bill Wendling 22034e785c908ae01519d3592eae2828e2cc94fb02ebNick Lewycky // Translate -mstackrealign 22044e785c908ae01519d3592eae2828e2cc94fb02ebNick Lewycky if (Args.hasFlag(options::OPT_mstackrealign, options::OPT_mno_stackrealign, 22054e785c908ae01519d3592eae2828e2cc94fb02ebNick Lewycky false)) { 22064e785c908ae01519d3592eae2828e2cc94fb02ebNick Lewycky CmdArgs.push_back("-backend-option"); 22074e785c908ae01519d3592eae2828e2cc94fb02ebNick Lewycky CmdArgs.push_back("-force-align-stack"); 22084e785c908ae01519d3592eae2828e2cc94fb02ebNick Lewycky } 22094e785c908ae01519d3592eae2828e2cc94fb02ebNick Lewycky if (!Args.hasFlag(options::OPT_mno_stackrealign, options::OPT_mstackrealign, 22104e785c908ae01519d3592eae2828e2cc94fb02ebNick Lewycky false)) { 22114e785c908ae01519d3592eae2828e2cc94fb02ebNick Lewycky CmdArgs.push_back(Args.MakeArgString("-mstackrealign")); 22124e785c908ae01519d3592eae2828e2cc94fb02ebNick Lewycky } 22134e785c908ae01519d3592eae2828e2cc94fb02ebNick Lewycky 2214e9d11dbfe1f3286c5f8a2f2fc8ac759f63890655Joerg Sonnenberger if (Args.hasArg(options::OPT_mstack_alignment)) { 2215e9d11dbfe1f3286c5f8a2f2fc8ac759f63890655Joerg Sonnenberger StringRef alignment = Args.getLastArgValue(options::OPT_mstack_alignment); 2216e9d11dbfe1f3286c5f8a2f2fc8ac759f63890655Joerg Sonnenberger CmdArgs.push_back(Args.MakeArgString("-mstack-alignment=" + alignment)); 22171a584022c86bd0778cf7ad1fbea08c78869cf216Eric Christopher } 221888b7cf00fcb582728c642da3927c59468efaf926Eric Christopher 221948d1ef782c8c88066b5febf60f8f456064d7d3f0Daniel Dunbar // Forward -f options with positive and negative forms; we translate 222048d1ef782c8c88066b5febf60f8f456064d7d3f0Daniel Dunbar // these by hand. 222148d1ef782c8c88066b5febf60f8f456064d7d3f0Daniel Dunbar 2222b466d01e464b21832c23eeed90112bc5c26c0236Fariborz Jahanian if (Args.hasArg(options::OPT_mkernel)) { 22232843c1900b6da763885f47d0999e923e7c67fd65Daniel Dunbar if (!Args.hasArg(options::OPT_fapple_kext) && types::isCXX(InputType)) 2224b466d01e464b21832c23eeed90112bc5c26c0236Fariborz Jahanian CmdArgs.push_back("-fapple-kext"); 2225b466d01e464b21832c23eeed90112bc5c26c0236Fariborz Jahanian if (!Args.hasArg(options::OPT_fbuiltin)) 2226b466d01e464b21832c23eeed90112bc5c26c0236Fariborz Jahanian CmdArgs.push_back("-fno-builtin"); 22273d26550ba88d2c15292b3f290d6eadec83749e95Chad Rosier Args.ClaimAllArgs(options::OPT_fno_builtin); 2228b466d01e464b21832c23eeed90112bc5c26c0236Fariborz Jahanian } 22299e5cc6b703b2d0013f13800c2ffbeb3cf85fcfadDaniel Dunbar // -fbuiltin is default. 2230b466d01e464b21832c23eeed90112bc5c26c0236Fariborz Jahanian else if (!Args.hasFlag(options::OPT_fbuiltin, options::OPT_fno_builtin)) 223153e8484581ca358c3a2ccd8ea39c136c6e85d606Daniel Dunbar CmdArgs.push_back("-fno-builtin"); 223248d1ef782c8c88066b5febf60f8f456064d7d3f0Daniel Dunbar 2233fc2844846e91398205fddc71196fe9dda04e105fNuno Lopes if (!Args.hasFlag(options::OPT_fassume_sane_operator_new, 2234fc2844846e91398205fddc71196fe9dda04e105fNuno Lopes options::OPT_fno_assume_sane_operator_new)) 2235fc2844846e91398205fddc71196fe9dda04e105fNuno Lopes CmdArgs.push_back("-fno-assume-sane-operator-new"); 2236fc2844846e91398205fddc71196fe9dda04e105fNuno Lopes 22379e5cc6b703b2d0013f13800c2ffbeb3cf85fcfadDaniel Dunbar // -fblocks=0 is default. 22389e5cc6b703b2d0013f13800c2ffbeb3cf85fcfadDaniel Dunbar if (Args.hasFlag(options::OPT_fblocks, options::OPT_fno_blocks, 2239e6533ffc680e84cd193b4ea0d81548e251cb1f2fDavid Chisnall getToolChain().IsBlocksDefault()) || 2240e6533ffc680e84cd193b4ea0d81548e251cb1f2fDavid Chisnall (Args.hasArg(options::OPT_fgnu_runtime) && 2241e6533ffc680e84cd193b4ea0d81548e251cb1f2fDavid Chisnall Args.hasArg(options::OPT_fobjc_nonfragile_abi) && 2242e6533ffc680e84cd193b4ea0d81548e251cb1f2fDavid Chisnall !Args.hasArg(options::OPT_fno_blocks))) { 22439e5cc6b703b2d0013f13800c2ffbeb3cf85fcfadDaniel Dunbar CmdArgs.push_back("-fblocks"); 224413db5cfc4e5f03eb70efe0d227b53b8280f16161John McCall 224513db5cfc4e5f03eb70efe0d227b53b8280f16161John McCall if (!Args.hasArg(options::OPT_fgnu_runtime) && 224613db5cfc4e5f03eb70efe0d227b53b8280f16161John McCall !getToolChain().hasBlocksRuntime()) 224713db5cfc4e5f03eb70efe0d227b53b8280f16161John McCall CmdArgs.push_back("-fblocks-runtime-optional"); 22485e530af5d51572a0ed5dbe50da54bd333840c63dDavid Chisnall } 224948d1ef782c8c88066b5febf60f8f456064d7d3f0Daniel Dunbar 225064554ba9fc5f251108fd7d10a9c218e7bf985941Douglas Gregor // -fmodules enables modules (off by default). However, for C++/Objective-C++, 225164554ba9fc5f251108fd7d10a9c218e7bf985941Douglas Gregor // users must also pass -fcxx-modules. The latter flag will disappear once the 225264554ba9fc5f251108fd7d10a9c218e7bf985941Douglas Gregor // modules implementation is solid for C++/Objective-C++ programs as well. 225364554ba9fc5f251108fd7d10a9c218e7bf985941Douglas Gregor if (Args.hasFlag(options::OPT_fmodules, options::OPT_fno_modules, false)) { 225464554ba9fc5f251108fd7d10a9c218e7bf985941Douglas Gregor bool AllowedInCXX = Args.hasFlag(options::OPT_fcxx_modules, 225564554ba9fc5f251108fd7d10a9c218e7bf985941Douglas Gregor options::OPT_fno_cxx_modules, 225664554ba9fc5f251108fd7d10a9c218e7bf985941Douglas Gregor false); 225764554ba9fc5f251108fd7d10a9c218e7bf985941Douglas Gregor if (AllowedInCXX || !types::isCXX(InputType)) 225864554ba9fc5f251108fd7d10a9c218e7bf985941Douglas Gregor CmdArgs.push_back("-fmodules"); 225964554ba9fc5f251108fd7d10a9c218e7bf985941Douglas Gregor } 22607025d2cc327ec75353454586df2987afce5e5789Douglas Gregor 226132579cf507d088e776b67327c5d6bc46e1f217ccJohn McCall // -faccess-control is default. 22627002f4c03c2d0544f4e8bea8d3a5636519081e35John McCall if (Args.hasFlag(options::OPT_fno_access_control, 22637002f4c03c2d0544f4e8bea8d3a5636519081e35John McCall options::OPT_faccess_control, 226432579cf507d088e776b67327c5d6bc46e1f217ccJohn McCall false)) 22657002f4c03c2d0544f4e8bea8d3a5636519081e35John McCall CmdArgs.push_back("-fno-access-control"); 22663ddd6e026a173e9519e84e27f8d6aed5473b8b4eJohn McCall 2267a4c2475961184a4bad6f6f087eeb1038bb784cadAnders Carlsson // -felide-constructors is the default. 2268a4c2475961184a4bad6f6f087eeb1038bb784cadAnders Carlsson if (Args.hasFlag(options::OPT_fno_elide_constructors, 2269a4c2475961184a4bad6f6f087eeb1038bb784cadAnders Carlsson options::OPT_felide_constructors, 2270a4c2475961184a4bad6f6f087eeb1038bb784cadAnders Carlsson false)) 2271a4c2475961184a4bad6f6f087eeb1038bb784cadAnders Carlsson CmdArgs.push_back("-fno-elide-constructors"); 2272a4c2475961184a4bad6f6f087eeb1038bb784cadAnders Carlsson 22730be42c44f0199c5023b542d6a6d2e66eb594f27dDaniel Dunbar // -frtti is default. 2274afc4baa37c2f38fadf05b15456b10a0994d51b0bChad Rosier if (!Args.hasFlag(options::OPT_frtti, options::OPT_fno_rtti) || 2275afc4baa37c2f38fadf05b15456b10a0994d51b0bChad Rosier KernelOrKext) 227653e8484581ca358c3a2ccd8ea39c136c6e85d606Daniel Dunbar CmdArgs.push_back("-fno-rtti"); 2277738f8c278da5950d0d4607de2debe0bdfad64185Mike Stump 22789631939f82c0eaa6fb3936a0ce58a41adfbc9011Tony Linthicum // -fshort-enums=0 is default for all architectures except Hexagon. 22799a2b9d794bdf349b517ff799170f4409f45d147cArgyrios Kyrtzidis if (Args.hasFlag(options::OPT_fshort_enums, 22809631939f82c0eaa6fb3936a0ce58a41adfbc9011Tony Linthicum options::OPT_fno_short_enums, 22819631939f82c0eaa6fb3936a0ce58a41adfbc9011Tony Linthicum getToolChain().getTriple().getArch() == 22829631939f82c0eaa6fb3936a0ce58a41adfbc9011Tony Linthicum llvm::Triple::hexagon)) 22839a2b9d794bdf349b517ff799170f4409f45d147cArgyrios Kyrtzidis CmdArgs.push_back("-fshort-enums"); 22849a2b9d794bdf349b517ff799170f4409f45d147cArgyrios Kyrtzidis 22851f95e6567faab67f4363d650f73121359c4bdbabDaniel Dunbar // -fsigned-char is default. 22866d2eb4d07d40795131f28d719ef9146a2be500f6Daniel Dunbar if (!Args.hasFlag(options::OPT_fsigned_char, options::OPT_funsigned_char, 22871f95e6567faab67f4363d650f73121359c4bdbabDaniel Dunbar isSignedCharDefault(getToolChain().getTriple()))) 22887674352cf3e8f699914a2f739f1ae8c8c3480813Daniel Dunbar CmdArgs.push_back("-fno-signed-char"); 22895a77973d9bc2c9cdbdb7860dcf3ac795abe258ecEli Friedman 2290a508b7de6c5246ab04ed69d0ab4e9977ec1fb4d4Anders Carlsson // -fthreadsafe-static is default. 229120249a1af2e462dcafdd6a350f1c7967b264ff25Michael J. Spencer if (!Args.hasFlag(options::OPT_fthreadsafe_statics, 2292a508b7de6c5246ab04ed69d0ab4e9977ec1fb4d4Anders Carlsson options::OPT_fno_threadsafe_statics)) 2293a508b7de6c5246ab04ed69d0ab4e9977ec1fb4d4Anders Carlsson CmdArgs.push_back("-fno-threadsafe-statics"); 2294a508b7de6c5246ab04ed69d0ab4e9977ec1fb4d4Anders Carlsson 2295efb0fa9e11f75af51744a6159530ef7cc8efa24aDaniel Dunbar // -fuse-cxa-atexit is default. 2296afc4baa37c2f38fadf05b15456b10a0994d51b0bChad Rosier if (!Args.hasFlag(options::OPT_fuse_cxa_atexit, 2297afc4baa37c2f38fadf05b15456b10a0994d51b0bChad Rosier options::OPT_fno_use_cxa_atexit, 2298afc4baa37c2f38fadf05b15456b10a0994d51b0bChad Rosier getToolChain().getTriple().getOS() != llvm::Triple::Cygwin && 22999631939f82c0eaa6fb3936a0ce58a41adfbc9011Tony Linthicum getToolChain().getTriple().getOS() != llvm::Triple::MinGW32 && 2300afc4baa37c2f38fadf05b15456b10a0994d51b0bChad Rosier getToolChain().getTriple().getArch() != llvm::Triple::hexagon) || 2301afc4baa37c2f38fadf05b15456b10a0994d51b0bChad Rosier KernelOrKext) 2302efb0fa9e11f75af51744a6159530ef7cc8efa24aDaniel Dunbar CmdArgs.push_back("-fno-use-cxa-atexit"); 2303efb0fa9e11f75af51744a6159530ef7cc8efa24aDaniel Dunbar 23040be42c44f0199c5023b542d6a6d2e66eb594f27dDaniel Dunbar // -fms-extensions=0 is default. 23056d2eb4d07d40795131f28d719ef9146a2be500f6Daniel Dunbar if (Args.hasFlag(options::OPT_fms_extensions, options::OPT_fno_ms_extensions, 23060be42c44f0199c5023b542d6a6d2e66eb594f27dDaniel Dunbar getToolChain().getTriple().getOS() == llvm::Triple::Win32)) 23070be42c44f0199c5023b542d6a6d2e66eb594f27dDaniel Dunbar CmdArgs.push_back("-fms-extensions"); 23080be42c44f0199c5023b542d6a6d2e66eb594f27dDaniel Dunbar 2309ae55608a29d61737b7c5390e2d1bb30ab8d5febbFrancois Pichet // -fms-compatibility=0 is default. 2310ba97b6ea0e8933ab801b0d06bba133836627794aDouglas Gregor if (Args.hasFlag(options::OPT_fms_compatibility, 2311ba97b6ea0e8933ab801b0d06bba133836627794aDouglas Gregor options::OPT_fno_ms_compatibility, 2312ba97b6ea0e8933ab801b0d06bba133836627794aDouglas Gregor (getToolChain().getTriple().getOS() == llvm::Triple::Win32 && 2313ba97b6ea0e8933ab801b0d06bba133836627794aDouglas Gregor Args.hasFlag(options::OPT_fms_extensions, 2314ba97b6ea0e8933ab801b0d06bba133836627794aDouglas Gregor options::OPT_fno_ms_extensions, 2315ba97b6ea0e8933ab801b0d06bba133836627794aDouglas Gregor true)))) 2316ae55608a29d61737b7c5390e2d1bb30ab8d5febbFrancois Pichet CmdArgs.push_back("-fms-compatibility"); 2317ae55608a29d61737b7c5390e2d1bb30ab8d5febbFrancois Pichet 2318dae4ac4fe56ec60fc93b3e3c9f51e79e682084b9Michael J. Spencer // -fmsc-version=1300 is default. 2319dae4ac4fe56ec60fc93b3e3c9f51e79e682084b9Michael J. Spencer if (Args.hasFlag(options::OPT_fms_extensions, options::OPT_fno_ms_extensions, 2320dae4ac4fe56ec60fc93b3e3c9f51e79e682084b9Michael J. Spencer getToolChain().getTriple().getOS() == llvm::Triple::Win32) || 2321dae4ac4fe56ec60fc93b3e3c9f51e79e682084b9Michael J. Spencer Args.hasArg(options::OPT_fmsc_version)) { 23225f9e272e632e951b1efe824cd16acb4d96077930Chris Lattner StringRef msc_ver = Args.getLastArgValue(options::OPT_fmsc_version); 2323dae4ac4fe56ec60fc93b3e3c9f51e79e682084b9Michael J. Spencer if (msc_ver.empty()) 2324dae4ac4fe56ec60fc93b3e3c9f51e79e682084b9Michael J. Spencer CmdArgs.push_back("-fmsc-version=1300"); 2325dae4ac4fe56ec60fc93b3e3c9f51e79e682084b9Michael J. Spencer else 2326dae4ac4fe56ec60fc93b3e3c9f51e79e682084b9Michael J. Spencer CmdArgs.push_back(Args.MakeArgString("-fmsc-version=" + msc_ver)); 2327dae4ac4fe56ec60fc93b3e3c9f51e79e682084b9Michael J. Spencer } 2328dae4ac4fe56ec60fc93b3e3c9f51e79e682084b9Michael J. Spencer 2329dae4ac4fe56ec60fc93b3e3c9f51e79e682084b9Michael J. Spencer 2330400b607546a8dbfcee3b690f3d0a2fee0ea6480bDawn Perchik // -fborland-extensions=0 is default. 2331400b607546a8dbfcee3b690f3d0a2fee0ea6480bDawn Perchik if (Args.hasFlag(options::OPT_fborland_extensions, 2332400b607546a8dbfcee3b690f3d0a2fee0ea6480bDawn Perchik options::OPT_fno_borland_extensions, false)) 2333400b607546a8dbfcee3b690f3d0a2fee0ea6480bDawn Perchik CmdArgs.push_back("-fborland-extensions"); 2334400b607546a8dbfcee3b690f3d0a2fee0ea6480bDawn Perchik 23358efcc0184a6dfe1ea799d3a6b9c1312ef1fac11dFrancois Pichet // -fno-delayed-template-parsing is default, except for Windows where MSVC STL 23368efcc0184a6dfe1ea799d3a6b9c1312ef1fac11dFrancois Pichet // needs it. 23378387e2a41eef6fa17fb140a18c29b6eee9dd2b8aFrancois Pichet if (Args.hasFlag(options::OPT_fdelayed_template_parsing, 23388387e2a41eef6fa17fb140a18c29b6eee9dd2b8aFrancois Pichet options::OPT_fno_delayed_template_parsing, 23398efcc0184a6dfe1ea799d3a6b9c1312ef1fac11dFrancois Pichet getToolChain().getTriple().getOS() == llvm::Triple::Win32)) 2340805bc1f6fb9b7bc85222d0211761a8c624f2dd75Francois Pichet CmdArgs.push_back("-fdelayed-template-parsing"); 23418387e2a41eef6fa17fb140a18c29b6eee9dd2b8aFrancois Pichet 2342eb5d7b752651283de5abfcc2f91df7227582a08dChandler Carruth // -fgnu-keywords default varies depending on language; only pass if 2343eb5d7b752651283de5abfcc2f91df7227582a08dChandler Carruth // specified. 2344eb5d7b752651283de5abfcc2f91df7227582a08dChandler Carruth if (Arg *A = Args.getLastArg(options::OPT_fgnu_keywords, 234540788d909ad52fc732fe0769d0ef22e5edad5e47Daniel Dunbar options::OPT_fno_gnu_keywords)) 234640788d909ad52fc732fe0769d0ef22e5edad5e47Daniel Dunbar A->render(Args, CmdArgs); 2347eb5d7b752651283de5abfcc2f91df7227582a08dChandler Carruth 234801ba8545fb6bae2a370606b4f40f0d17eb0a8c6cRafael Espindola if (Args.hasFlag(options::OPT_fgnu89_inline, 234901ba8545fb6bae2a370606b4f40f0d17eb0a8c6cRafael Espindola options::OPT_fno_gnu89_inline, 235001ba8545fb6bae2a370606b4f40f0d17eb0a8c6cRafael Espindola false)) 2351fb3f4aad0436a9c40e9130598162150890c405b5Rafael Espindola CmdArgs.push_back("-fgnu89-inline"); 2352fb3f4aad0436a9c40e9130598162150890c405b5Rafael Espindola 2353fc055f943d154c9b7463f43a3b59e093723362c9Chad Rosier if (Args.hasArg(options::OPT_fno_inline)) 2354fc055f943d154c9b7463f43a3b59e093723362c9Chad Rosier CmdArgs.push_back("-fno-inline"); 2355fc055f943d154c9b7463f43a3b59e093723362c9Chad Rosier 2356634a4b1b045b13e7ddfa57934cf2b85d4348f77fChad Rosier if (Args.hasArg(options::OPT_fno_inline_functions)) 2357634a4b1b045b13e7ddfa57934cf2b85d4348f77fChad Rosier CmdArgs.push_back("-fno-inline-functions"); 2358250008b4678b19ef80866702e300bb4e53d9ff2dChad Rosier 23599e5cc6b703b2d0013f13800c2ffbeb3cf85fcfadDaniel Dunbar // -fobjc-nonfragile-abi=0 is default. 23609f084a3166b684573ba49df28fc5792bc37d92e1John McCall ObjCRuntime objCRuntime; 2361d71315c5511bd1204732216964faa6254dc4b2b6John McCall unsigned objcABIVersion = 0; 23623c3ccd283f8c35dbb200a76eacfa17f7861e03bbDavid Chisnall bool NeXTRuntimeIsDefault 2363e982cc0ea3e9255b8aacf8f0bff559e9b1cfd72eFariborz Jahanian = (IsRewriter || IsModernRewriter || 2364e982cc0ea3e9255b8aacf8f0bff559e9b1cfd72eFariborz Jahanian getToolChain().getTriple().isOSDarwin()); 23653c3ccd283f8c35dbb200a76eacfa17f7861e03bbDavid Chisnall if (Args.hasFlag(options::OPT_fnext_runtime, options::OPT_fgnu_runtime, 23663c3ccd283f8c35dbb200a76eacfa17f7861e03bbDavid Chisnall NeXTRuntimeIsDefault)) { 23673c3ccd283f8c35dbb200a76eacfa17f7861e03bbDavid Chisnall objCRuntime.setKind(ObjCRuntime::NeXT); 23683c3ccd283f8c35dbb200a76eacfa17f7861e03bbDavid Chisnall } else { 23693c3ccd283f8c35dbb200a76eacfa17f7861e03bbDavid Chisnall CmdArgs.push_back("-fgnu-runtime"); 23703c3ccd283f8c35dbb200a76eacfa17f7861e03bbDavid Chisnall objCRuntime.setKind(ObjCRuntime::GNU); 23713c3ccd283f8c35dbb200a76eacfa17f7861e03bbDavid Chisnall } 23723c3ccd283f8c35dbb200a76eacfa17f7861e03bbDavid Chisnall getToolChain().configureObjCRuntime(objCRuntime); 23733c3ccd283f8c35dbb200a76eacfa17f7861e03bbDavid Chisnall if (objCRuntime.HasARC) 23743c3ccd283f8c35dbb200a76eacfa17f7861e03bbDavid Chisnall CmdArgs.push_back("-fobjc-runtime-has-arc"); 23753c3ccd283f8c35dbb200a76eacfa17f7861e03bbDavid Chisnall if (objCRuntime.HasWeak) 23763c3ccd283f8c35dbb200a76eacfa17f7861e03bbDavid Chisnall CmdArgs.push_back("-fobjc-runtime-has-weak"); 23773c3ccd283f8c35dbb200a76eacfa17f7861e03bbDavid Chisnall if (objCRuntime.HasTerminate) 23783c3ccd283f8c35dbb200a76eacfa17f7861e03bbDavid Chisnall CmdArgs.push_back("-fobjc-runtime-has-terminate"); 23793c3ccd283f8c35dbb200a76eacfa17f7861e03bbDavid Chisnall 23803c3ccd283f8c35dbb200a76eacfa17f7861e03bbDavid Chisnall // Compute the Objective-C ABI "version" to use. Version numbers are 23813c3ccd283f8c35dbb200a76eacfa17f7861e03bbDavid Chisnall // slightly confusing for historical reasons: 23823c3ccd283f8c35dbb200a76eacfa17f7861e03bbDavid Chisnall // 1 - Traditional "fragile" ABI 23833c3ccd283f8c35dbb200a76eacfa17f7861e03bbDavid Chisnall // 2 - Non-fragile ABI, version 1 23843c3ccd283f8c35dbb200a76eacfa17f7861e03bbDavid Chisnall // 3 - Non-fragile ABI, version 2 23853c3ccd283f8c35dbb200a76eacfa17f7861e03bbDavid Chisnall objcABIVersion = 1; 23863c3ccd283f8c35dbb200a76eacfa17f7861e03bbDavid Chisnall // If -fobjc-abi-version= is present, use that to set the version. 23873c3ccd283f8c35dbb200a76eacfa17f7861e03bbDavid Chisnall if (Arg *A = Args.getLastArg(options::OPT_fobjc_abi_version_EQ)) { 23883c3ccd283f8c35dbb200a76eacfa17f7861e03bbDavid Chisnall if (StringRef(A->getValue(Args)) == "1") 23893c3ccd283f8c35dbb200a76eacfa17f7861e03bbDavid Chisnall objcABIVersion = 1; 23903c3ccd283f8c35dbb200a76eacfa17f7861e03bbDavid Chisnall else if (StringRef(A->getValue(Args)) == "2") 23913c3ccd283f8c35dbb200a76eacfa17f7861e03bbDavid Chisnall objcABIVersion = 2; 23923c3ccd283f8c35dbb200a76eacfa17f7861e03bbDavid Chisnall else if (StringRef(A->getValue(Args)) == "3") 23933c3ccd283f8c35dbb200a76eacfa17f7861e03bbDavid Chisnall objcABIVersion = 3; 23943c3ccd283f8c35dbb200a76eacfa17f7861e03bbDavid Chisnall else 23953c3ccd283f8c35dbb200a76eacfa17f7861e03bbDavid Chisnall D.Diag(diag::err_drv_clang_unsupported) << A->getAsString(Args); 23963c3ccd283f8c35dbb200a76eacfa17f7861e03bbDavid Chisnall } else { 23973c3ccd283f8c35dbb200a76eacfa17f7861e03bbDavid Chisnall // Otherwise, determine if we are using the non-fragile ABI. 2398e982cc0ea3e9255b8aacf8f0bff559e9b1cfd72eFariborz Jahanian bool NonFragileABIIsDefault = 2399e982cc0ea3e9255b8aacf8f0bff559e9b1cfd72eFariborz Jahanian (IsModernRewriter || 2400e982cc0ea3e9255b8aacf8f0bff559e9b1cfd72eFariborz Jahanian (!IsRewriter && getToolChain().IsObjCNonFragileABIDefault())); 24013c3ccd283f8c35dbb200a76eacfa17f7861e03bbDavid Chisnall if (Args.hasFlag(options::OPT_fobjc_nonfragile_abi, 24023c3ccd283f8c35dbb200a76eacfa17f7861e03bbDavid Chisnall options::OPT_fno_objc_nonfragile_abi, 2403d596c4d3f8931f4d479e965bf46d0e7edad85570Douglas Gregor NonFragileABIIsDefault)) { 24043c3ccd283f8c35dbb200a76eacfa17f7861e03bbDavid Chisnall // Determine the non-fragile ABI version to use. 2405de17ba7af23bd3693add73af127600b568cb210bDaniel Dunbar#ifdef DISABLE_DEFAULT_NONFRAGILEABI_TWO 24063c3ccd283f8c35dbb200a76eacfa17f7861e03bbDavid Chisnall unsigned NonFragileABIVersion = 1; 2407de17ba7af23bd3693add73af127600b568cb210bDaniel Dunbar#else 24083c3ccd283f8c35dbb200a76eacfa17f7861e03bbDavid Chisnall unsigned NonFragileABIVersion = 2; 2409de17ba7af23bd3693add73af127600b568cb210bDaniel Dunbar#endif 2410dea63134a51d463cf32f3eec3c359d9215359d69Daniel Dunbar 24113c3ccd283f8c35dbb200a76eacfa17f7861e03bbDavid Chisnall if (Arg *A = Args.getLastArg( 24123c3ccd283f8c35dbb200a76eacfa17f7861e03bbDavid Chisnall options::OPT_fobjc_nonfragile_abi_version_EQ)) { 24133c3ccd283f8c35dbb200a76eacfa17f7861e03bbDavid Chisnall if (StringRef(A->getValue(Args)) == "1") 24143c3ccd283f8c35dbb200a76eacfa17f7861e03bbDavid Chisnall NonFragileABIVersion = 1; 24153c3ccd283f8c35dbb200a76eacfa17f7861e03bbDavid Chisnall else if (StringRef(A->getValue(Args)) == "2") 24163c3ccd283f8c35dbb200a76eacfa17f7861e03bbDavid Chisnall NonFragileABIVersion = 2; 24173c3ccd283f8c35dbb200a76eacfa17f7861e03bbDavid Chisnall else 24183c3ccd283f8c35dbb200a76eacfa17f7861e03bbDavid Chisnall D.Diag(diag::err_drv_clang_unsupported) 24193c3ccd283f8c35dbb200a76eacfa17f7861e03bbDavid Chisnall << A->getAsString(Args); 2420dea63134a51d463cf32f3eec3c359d9215359d69Daniel Dunbar } 24213c3ccd283f8c35dbb200a76eacfa17f7861e03bbDavid Chisnall 24223c3ccd283f8c35dbb200a76eacfa17f7861e03bbDavid Chisnall objcABIVersion = 1 + NonFragileABIVersion; 24233c3ccd283f8c35dbb200a76eacfa17f7861e03bbDavid Chisnall } else { 24243c3ccd283f8c35dbb200a76eacfa17f7861e03bbDavid Chisnall objcABIVersion = 1; 24255e2a8ac6599f0c68b14afb2f328ac98b264f770aDaniel Dunbar } 24263c3ccd283f8c35dbb200a76eacfa17f7861e03bbDavid Chisnall } 242720249a1af2e462dcafdd6a350f1c7967b264ff25Michael J. Spencer 2428d1e40d5389a4382cbebc97d54792f41ee0414af4John McCall if (objcABIVersion == 1) { 2429d1e40d5389a4382cbebc97d54792f41ee0414af4John McCall CmdArgs.push_back("-fobjc-fragile-abi"); 2430d1e40d5389a4382cbebc97d54792f41ee0414af4John McCall } else { 24313c3ccd283f8c35dbb200a76eacfa17f7861e03bbDavid Chisnall // -fobjc-dispatch-method is only relevant with the nonfragile-abi, and 24323c3ccd283f8c35dbb200a76eacfa17f7861e03bbDavid Chisnall // legacy is the default. 24333c3ccd283f8c35dbb200a76eacfa17f7861e03bbDavid Chisnall if (!Args.hasFlag(options::OPT_fobjc_legacy_dispatch, 24343c3ccd283f8c35dbb200a76eacfa17f7861e03bbDavid Chisnall options::OPT_fno_objc_legacy_dispatch, 24353c3ccd283f8c35dbb200a76eacfa17f7861e03bbDavid Chisnall getToolChain().IsObjCLegacyDispatchDefault())) { 24363c3ccd283f8c35dbb200a76eacfa17f7861e03bbDavid Chisnall if (getToolChain().UseObjCMixedDispatch()) 24373c3ccd283f8c35dbb200a76eacfa17f7861e03bbDavid Chisnall CmdArgs.push_back("-fobjc-dispatch-method=mixed"); 24383c3ccd283f8c35dbb200a76eacfa17f7861e03bbDavid Chisnall else 24393c3ccd283f8c35dbb200a76eacfa17f7861e03bbDavid Chisnall CmdArgs.push_back("-fobjc-dispatch-method=non-legacy"); 2440984eb8611d9ee46fc6351dee43609f2deed99f3cDaniel Dunbar } 24413c3ccd283f8c35dbb200a76eacfa17f7861e03bbDavid Chisnall } 2442125b4cb35536e45201f8f2cb19ee620e3ad67c49NAKAMURA Takumi 2443df423545a19275559b675bb4f20b6fbe738f0a11Nico Weber // -fobjc-default-synthesize-properties=1 is default. This only has an effect 2444df423545a19275559b675bb4f20b6fbe738f0a11Nico Weber // if the nonfragile objc abi is used. 2445e51fe0972a781e79abae550786ebed7d1da54252Fariborz Jahanian if (getToolChain().IsObjCDefaultSynthPropertiesDefault()) { 24463c3ccd283f8c35dbb200a76eacfa17f7861e03bbDavid Chisnall CmdArgs.push_back("-fobjc-default-synthesize-properties"); 24479e5cc6b703b2d0013f13800c2ffbeb3cf85fcfadDaniel Dunbar } 24489e5cc6b703b2d0013f13800c2ffbeb3cf85fcfadDaniel Dunbar 24499f084a3166b684573ba49df28fc5792bc37d92e1John McCall // Allow -fno-objc-arr to trump -fobjc-arr/-fobjc-arc. 24509f084a3166b684573ba49df28fc5792bc37d92e1John McCall // NOTE: This logic is duplicated in ToolChains.cpp. 24519f084a3166b684573ba49df28fc5792bc37d92e1John McCall bool ARC = isObjCAutoRefCount(Args); 24529f084a3166b684573ba49df28fc5792bc37d92e1John McCall if (ARC) { 24535840dd9a09c458ef894e7d47caab1d90dc4c1112Argyrios Kyrtzidis if (!getToolChain().SupportsObjCARC()) 24545840dd9a09c458ef894e7d47caab1d90dc4c1112Argyrios Kyrtzidis D.Diag(diag::err_arc_unsupported); 24555840dd9a09c458ef894e7d47caab1d90dc4c1112Argyrios Kyrtzidis 24569f084a3166b684573ba49df28fc5792bc37d92e1John McCall CmdArgs.push_back("-fobjc-arc"); 24579f084a3166b684573ba49df28fc5792bc37d92e1John McCall 24587ffa0325bd61f656697f99434334d425c39af309Chandler Carruth // FIXME: It seems like this entire block, and several around it should be 24597ffa0325bd61f656697f99434334d425c39af309Chandler Carruth // wrapped in isObjC, but for now we just use it here as this is where it 24607ffa0325bd61f656697f99434334d425c39af309Chandler Carruth // was being used previously. 24617ffa0325bd61f656697f99434334d425c39af309Chandler Carruth if (types::isCXX(InputType) && types::isObjC(InputType)) { 24627ffa0325bd61f656697f99434334d425c39af309Chandler Carruth if (getToolChain().GetCXXStdlibType(Args) == ToolChain::CST_Libcxx) 24637ffa0325bd61f656697f99434334d425c39af309Chandler Carruth CmdArgs.push_back("-fobjc-arc-cxxlib=libc++"); 24647ffa0325bd61f656697f99434334d425c39af309Chandler Carruth else 24657ffa0325bd61f656697f99434334d425c39af309Chandler Carruth CmdArgs.push_back("-fobjc-arc-cxxlib=libstdc++"); 24667ffa0325bd61f656697f99434334d425c39af309Chandler Carruth } 24677ffa0325bd61f656697f99434334d425c39af309Chandler Carruth 24689f084a3166b684573ba49df28fc5792bc37d92e1John McCall // Allow the user to enable full exceptions code emission. 24699f084a3166b684573ba49df28fc5792bc37d92e1John McCall // We define off for Objective-CC, on for Objective-C++. 24709f084a3166b684573ba49df28fc5792bc37d92e1John McCall if (Args.hasFlag(options::OPT_fobjc_arc_exceptions, 24719f084a3166b684573ba49df28fc5792bc37d92e1John McCall options::OPT_fno_objc_arc_exceptions, 24729f084a3166b684573ba49df28fc5792bc37d92e1John McCall /*default*/ types::isCXX(InputType))) 24739f084a3166b684573ba49df28fc5792bc37d92e1John McCall CmdArgs.push_back("-fobjc-arc-exceptions"); 24749f084a3166b684573ba49df28fc5792bc37d92e1John McCall } 24759f084a3166b684573ba49df28fc5792bc37d92e1John McCall 24769f084a3166b684573ba49df28fc5792bc37d92e1John McCall // -fobjc-infer-related-result-type is the default, except in the Objective-C 24779f084a3166b684573ba49df28fc5792bc37d92e1John McCall // rewriter. 2478e982cc0ea3e9255b8aacf8f0bff559e9b1cfd72eFariborz Jahanian if (IsRewriter || IsModernRewriter) 24799f084a3166b684573ba49df28fc5792bc37d92e1John McCall CmdArgs.push_back("-fno-objc-infer-related-result-type"); 248088b7cf00fcb582728c642da3927c59468efaf926Eric Christopher 24819f084a3166b684573ba49df28fc5792bc37d92e1John McCall // Handle -fobjc-gc and -fobjc-gc-only. They are exclusive, and -fobjc-gc-only 24829f084a3166b684573ba49df28fc5792bc37d92e1John McCall // takes precedence. 24839f084a3166b684573ba49df28fc5792bc37d92e1John McCall const Arg *GCArg = Args.getLastArg(options::OPT_fobjc_gc_only); 24849f084a3166b684573ba49df28fc5792bc37d92e1John McCall if (!GCArg) 24859f084a3166b684573ba49df28fc5792bc37d92e1John McCall GCArg = Args.getLastArg(options::OPT_fobjc_gc); 24869f084a3166b684573ba49df28fc5792bc37d92e1John McCall if (GCArg) { 24879f084a3166b684573ba49df28fc5792bc37d92e1John McCall if (ARC) { 24885f9e272e632e951b1efe824cd16acb4d96077930Chris Lattner D.Diag(diag::err_drv_objc_gc_arr) 24899f084a3166b684573ba49df28fc5792bc37d92e1John McCall << GCArg->getAsString(Args); 24909f084a3166b684573ba49df28fc5792bc37d92e1John McCall } else if (getToolChain().SupportsObjCGC()) { 24919f084a3166b684573ba49df28fc5792bc37d92e1John McCall GCArg->render(Args, CmdArgs); 24929f084a3166b684573ba49df28fc5792bc37d92e1John McCall } else { 24939f084a3166b684573ba49df28fc5792bc37d92e1John McCall // FIXME: We should move this to a hard error. 24945f9e272e632e951b1efe824cd16acb4d96077930Chris Lattner D.Diag(diag::warn_drv_objc_gc_unsupported) 24959f084a3166b684573ba49df28fc5792bc37d92e1John McCall << GCArg->getAsString(Args); 24969f084a3166b684573ba49df28fc5792bc37d92e1John McCall } 24979f084a3166b684573ba49df28fc5792bc37d92e1John McCall } 24989f084a3166b684573ba49df28fc5792bc37d92e1John McCall 2499d71315c5511bd1204732216964faa6254dc4b2b6John McCall // Add exception args. 2500d71315c5511bd1204732216964faa6254dc4b2b6John McCall addExceptionArgs(Args, InputType, getToolChain().getTriple(), 250115b77319d0ce4332275992b2f191898a1df50efeFariborz Jahanian KernelOrKext, objcABIVersion, CmdArgs); 2502d71315c5511bd1204732216964faa6254dc4b2b6John McCall 2503d71315c5511bd1204732216964faa6254dc4b2b6John McCall if (getToolChain().UseSjLjExceptions()) 2504d71315c5511bd1204732216964faa6254dc4b2b6John McCall CmdArgs.push_back("-fsjlj-exceptions"); 2505d71315c5511bd1204732216964faa6254dc4b2b6John McCall 2506d71315c5511bd1204732216964faa6254dc4b2b6John McCall // C++ "sane" operator new. 2507984eb8611d9ee46fc6351dee43609f2deed99f3cDaniel Dunbar if (!Args.hasFlag(options::OPT_fassume_sane_operator_new, 2508984eb8611d9ee46fc6351dee43609f2deed99f3cDaniel Dunbar options::OPT_fno_assume_sane_operator_new)) 2509984eb8611d9ee46fc6351dee43609f2deed99f3cDaniel Dunbar CmdArgs.push_back("-fno-assume-sane-operator-new"); 2510984eb8611d9ee46fc6351dee43609f2deed99f3cDaniel Dunbar 2511f35f14d474632142280ec1526d16e87706ce6625Daniel Dunbar // -fconstant-cfstrings is default, and may be subject to argument translation 2512f35f14d474632142280ec1526d16e87706ce6625Daniel Dunbar // on Darwin. 2513f35f14d474632142280ec1526d16e87706ce6625Daniel Dunbar if (!Args.hasFlag(options::OPT_fconstant_cfstrings, 2514f35f14d474632142280ec1526d16e87706ce6625Daniel Dunbar options::OPT_fno_constant_cfstrings) || 2515f35f14d474632142280ec1526d16e87706ce6625Daniel Dunbar !Args.hasFlag(options::OPT_mconstant_cfstrings, 2516f35f14d474632142280ec1526d16e87706ce6625Daniel Dunbar options::OPT_mno_constant_cfstrings)) 2517f35f14d474632142280ec1526d16e87706ce6625Daniel Dunbar CmdArgs.push_back("-fno-constant-cfstrings"); 2518f35f14d474632142280ec1526d16e87706ce6625Daniel Dunbar 2519a6fda124bf380479529d6a80b84b62cacd3cb707John Thompson // -fshort-wchar default varies depending on platform; only 2520a6fda124bf380479529d6a80b84b62cacd3cb707John Thompson // pass if specified. 25211744a3504af13343f4bc0e566f6d7349fc6e3f04Daniel Dunbar if (Arg *A = Args.getLastArg(options::OPT_fshort_wchar)) 25221744a3504af13343f4bc0e566f6d7349fc6e3f04Daniel Dunbar A->render(Args, CmdArgs); 2523a6fda124bf380479529d6a80b84b62cacd3cb707John Thompson 2524ee848a73e5f8ffe7511af8652ba811c020d1c7a0Daniel Dunbar // -fno-pascal-strings is default, only pass non-default. If the tool chain 2525ee848a73e5f8ffe7511af8652ba811c020d1c7a0Daniel Dunbar // happened to translate to -mpascal-strings, we want to back translate here. 252682d00688525c876bf47bce414dedae9c343e67f5Daniel Dunbar // 252782d00688525c876bf47bce414dedae9c343e67f5Daniel Dunbar // FIXME: This is gross; that translation should be pulled from the 252882d00688525c876bf47bce414dedae9c343e67f5Daniel Dunbar // tool chain. 2529c21c485b4fb58ef5d55cf3e523263dd824a2ace4Daniel Dunbar if (Args.hasFlag(options::OPT_fpascal_strings, 253082d00688525c876bf47bce414dedae9c343e67f5Daniel Dunbar options::OPT_fno_pascal_strings, 253182d00688525c876bf47bce414dedae9c343e67f5Daniel Dunbar false) || 253282d00688525c876bf47bce414dedae9c343e67f5Daniel Dunbar Args.hasFlag(options::OPT_mpascal_strings, 253382d00688525c876bf47bce414dedae9c343e67f5Daniel Dunbar options::OPT_mno_pascal_strings, 253482d00688525c876bf47bce414dedae9c343e67f5Daniel Dunbar false)) 253548d1ef782c8c88066b5febf60f8f456064d7d3f0Daniel Dunbar CmdArgs.push_back("-fpascal-strings"); 2536125b4cb35536e45201f8f2cb19ee620e3ad67c49NAKAMURA Takumi 253788934e85f81abdc4fb5202325252be3bcab5ebf0Daniel Dunbar // Honor -fpack-struct= and -fpack-struct, if given. Note that 253888934e85f81abdc4fb5202325252be3bcab5ebf0Daniel Dunbar // -fno-pack-struct doesn't apply to -fpack-struct=. 253988934e85f81abdc4fb5202325252be3bcab5ebf0Daniel Dunbar if (Arg *A = Args.getLastArg(options::OPT_fpack_struct_EQ)) { 25408049c44d972fc7266b4369e8960875c118c067e0James Molloy std::string PackStructStr = "-fpack-struct="; 25418049c44d972fc7266b4369e8960875c118c067e0James Molloy PackStructStr += A->getValue(Args); 25428049c44d972fc7266b4369e8960875c118c067e0James Molloy CmdArgs.push_back(Args.MakeArgString(PackStructStr)); 254388934e85f81abdc4fb5202325252be3bcab5ebf0Daniel Dunbar } else if (Args.hasFlag(options::OPT_fpack_struct, 254488934e85f81abdc4fb5202325252be3bcab5ebf0Daniel Dunbar options::OPT_fno_pack_struct, false)) { 25458049c44d972fc7266b4369e8960875c118c067e0James Molloy CmdArgs.push_back("-fpack-struct=1"); 254688934e85f81abdc4fb5202325252be3bcab5ebf0Daniel Dunbar } 254788934e85f81abdc4fb5202325252be3bcab5ebf0Daniel Dunbar 2548b466d01e464b21832c23eeed90112bc5c26c0236Fariborz Jahanian if (Args.hasArg(options::OPT_mkernel) || 2549b466d01e464b21832c23eeed90112bc5c26c0236Fariborz Jahanian Args.hasArg(options::OPT_fapple_kext)) { 2550b466d01e464b21832c23eeed90112bc5c26c0236Fariborz Jahanian if (!Args.hasArg(options::OPT_fcommon)) 2551b466d01e464b21832c23eeed90112bc5c26c0236Fariborz Jahanian CmdArgs.push_back("-fno-common"); 2552ec09b3e0c5d96a1b7a3e797cdff2875eca1e9907Chad Rosier Args.ClaimAllArgs(options::OPT_fno_common); 2553b466d01e464b21832c23eeed90112bc5c26c0236Fariborz Jahanian } 255488934e85f81abdc4fb5202325252be3bcab5ebf0Daniel Dunbar 255548d1ef782c8c88066b5febf60f8f456064d7d3f0Daniel Dunbar // -fcommon is default, only pass non-default. 2556b466d01e464b21832c23eeed90112bc5c26c0236Fariborz Jahanian else if (!Args.hasFlag(options::OPT_fcommon, options::OPT_fno_common)) 255748d1ef782c8c88066b5febf60f8f456064d7d3f0Daniel Dunbar CmdArgs.push_back("-fno-common"); 255848d1ef782c8c88066b5febf60f8f456064d7d3f0Daniel Dunbar 255970d3c92820f590b10553da9c96eda24e4325ba34Daniel Dunbar // -fsigned-bitfields is default, and clang doesn't yet support 256006205ca78ca2fd4384b237f120ec66614df0d9fcDaniel Dunbar // -funsigned-bitfields. 25611eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump if (!Args.hasFlag(options::OPT_fsigned_bitfields, 256270d3c92820f590b10553da9c96eda24e4325ba34Daniel Dunbar options::OPT_funsigned_bitfields)) 25635f9e272e632e951b1efe824cd16acb4d96077930Chris Lattner D.Diag(diag::warn_drv_clang_unsupported) 256470d3c92820f590b10553da9c96eda24e4325ba34Daniel Dunbar << Args.getLastArg(options::OPT_funsigned_bitfields)->getAsString(Args); 256570d3c92820f590b10553da9c96eda24e4325ba34Daniel Dunbar 256606205ca78ca2fd4384b237f120ec66614df0d9fcDaniel Dunbar // -fsigned-bitfields is default, and clang doesn't support -fno-for-scope. 256706205ca78ca2fd4384b237f120ec66614df0d9fcDaniel Dunbar if (!Args.hasFlag(options::OPT_ffor_scope, 256806205ca78ca2fd4384b237f120ec66614df0d9fcDaniel Dunbar options::OPT_fno_for_scope)) 25695f9e272e632e951b1efe824cd16acb4d96077930Chris Lattner D.Diag(diag::err_drv_clang_unsupported) 257006205ca78ca2fd4384b237f120ec66614df0d9fcDaniel Dunbar << Args.getLastArg(options::OPT_fno_for_scope)->getAsString(Args); 257106205ca78ca2fd4384b237f120ec66614df0d9fcDaniel Dunbar 25720ea22fdfda0558393950cef5db50d050e3eb1e60Jeffrey Yasskin // -fcaret-diagnostics is default. 25730ea22fdfda0558393950cef5db50d050e3eb1e60Jeffrey Yasskin if (!Args.hasFlag(options::OPT_fcaret_diagnostics, 25740ea22fdfda0558393950cef5db50d050e3eb1e60Jeffrey Yasskin options::OPT_fno_caret_diagnostics, true)) 25750ea22fdfda0558393950cef5db50d050e3eb1e60Jeffrey Yasskin CmdArgs.push_back("-fno-caret-diagnostics"); 25760ea22fdfda0558393950cef5db50d050e3eb1e60Jeffrey Yasskin 257749138fc59eeac2aacd3b7e04c2642180d5baefd7Daniel Dunbar // -fdiagnostics-fixit-info is default, only pass non-default. 25781eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump if (!Args.hasFlag(options::OPT_fdiagnostics_fixit_info, 257949138fc59eeac2aacd3b7e04c2642180d5baefd7Daniel Dunbar options::OPT_fno_diagnostics_fixit_info)) 258049138fc59eeac2aacd3b7e04c2642180d5baefd7Daniel Dunbar CmdArgs.push_back("-fno-diagnostics-fixit-info"); 258188b7cf00fcb582728c642da3927c59468efaf926Eric Christopher 25829e820ee054fefe5422b4db3f681e567a8976747eDaniel Dunbar // Enable -fdiagnostics-show-option by default. 25831eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump if (Args.hasFlag(options::OPT_fdiagnostics_show_option, 25849e820ee054fefe5422b4db3f681e567a8976747eDaniel Dunbar options::OPT_fno_diagnostics_show_option)) 25859e820ee054fefe5422b4db3f681e567a8976747eDaniel Dunbar CmdArgs.push_back("-fdiagnostics-show-option"); 2586838be483dcf10ea3f2acd85f2cd65adc310011f9Daniel Dunbar 25876fbe8398ba1680ffc5daa7395850ff8765b7905bChris Lattner if (const Arg *A = 25886fbe8398ba1680ffc5daa7395850ff8765b7905bChris Lattner Args.getLastArg(options::OPT_fdiagnostics_show_category_EQ)) { 25896fbe8398ba1680ffc5daa7395850ff8765b7905bChris Lattner CmdArgs.push_back("-fdiagnostics-show-category"); 25906fbe8398ba1680ffc5daa7395850ff8765b7905bChris Lattner CmdArgs.push_back(A->getValue(Args)); 25916fbe8398ba1680ffc5daa7395850ff8765b7905bChris Lattner } 2592ca0e0545c216afaacba6da6c82a270dc2efc4e3fDaniel Dunbar 2593c9471b0ff1815ed0149dbfcad0f385ed8648eeb0Douglas Gregor if (const Arg *A = 2594c9471b0ff1815ed0149dbfcad0f385ed8648eeb0Douglas Gregor Args.getLastArg(options::OPT_fdiagnostics_format_EQ)) { 2595c9471b0ff1815ed0149dbfcad0f385ed8648eeb0Douglas Gregor CmdArgs.push_back("-fdiagnostics-format"); 2596c9471b0ff1815ed0149dbfcad0f385ed8648eeb0Douglas Gregor CmdArgs.push_back(A->getValue(Args)); 2597c9471b0ff1815ed0149dbfcad0f385ed8648eeb0Douglas Gregor } 2598c9471b0ff1815ed0149dbfcad0f385ed8648eeb0Douglas Gregor 2599abaca7a8be8e79cc01354676e3bcb26575640311Chandler Carruth if (Arg *A = Args.getLastArg( 2600abaca7a8be8e79cc01354676e3bcb26575640311Chandler Carruth options::OPT_fdiagnostics_show_note_include_stack, 2601abaca7a8be8e79cc01354676e3bcb26575640311Chandler Carruth options::OPT_fno_diagnostics_show_note_include_stack)) { 2602abaca7a8be8e79cc01354676e3bcb26575640311Chandler Carruth if (A->getOption().matches( 2603abaca7a8be8e79cc01354676e3bcb26575640311Chandler Carruth options::OPT_fdiagnostics_show_note_include_stack)) 2604abaca7a8be8e79cc01354676e3bcb26575640311Chandler Carruth CmdArgs.push_back("-fdiagnostics-show-note-include-stack"); 2605abaca7a8be8e79cc01354676e3bcb26575640311Chandler Carruth else 2606abaca7a8be8e79cc01354676e3bcb26575640311Chandler Carruth CmdArgs.push_back("-fno-diagnostics-show-note-include-stack"); 2607abaca7a8be8e79cc01354676e3bcb26575640311Chandler Carruth } 2608abaca7a8be8e79cc01354676e3bcb26575640311Chandler Carruth 2609838be483dcf10ea3f2acd85f2cd65adc310011f9Daniel Dunbar // Color diagnostics are the default, unless the terminal doesn't support 2610838be483dcf10ea3f2acd85f2cd65adc310011f9Daniel Dunbar // them. 2611838be483dcf10ea3f2acd85f2cd65adc310011f9Daniel Dunbar if (Args.hasFlag(options::OPT_fcolor_diagnostics, 2612f765d76407d82e629337bba4ca6c26bdfc8bc9a6Argyrios Kyrtzidis options::OPT_fno_color_diagnostics, 2613f765d76407d82e629337bba4ca6c26bdfc8bc9a6Argyrios Kyrtzidis llvm::sys::Process::StandardErrHasColors())) 2614838be483dcf10ea3f2acd85f2cd65adc310011f9Daniel Dunbar CmdArgs.push_back("-fcolor-diagnostics"); 2615838be483dcf10ea3f2acd85f2cd65adc310011f9Daniel Dunbar 261675eb1d64784946a37fc0b27596e2d92b6cf7033bDaniel Dunbar if (!Args.hasFlag(options::OPT_fshow_source_location, 261775eb1d64784946a37fc0b27596e2d92b6cf7033bDaniel Dunbar options::OPT_fno_show_source_location)) 261875eb1d64784946a37fc0b27596e2d92b6cf7033bDaniel Dunbar CmdArgs.push_back("-fno-show-source-location"); 26199e820ee054fefe5422b4db3f681e567a8976747eDaniel Dunbar 2620c9471b0ff1815ed0149dbfcad0f385ed8648eeb0Douglas Gregor if (!Args.hasFlag(options::OPT_fshow_column, 2621c9471b0ff1815ed0149dbfcad0f385ed8648eeb0Douglas Gregor options::OPT_fno_show_column, 2622c9471b0ff1815ed0149dbfcad0f385ed8648eeb0Douglas Gregor true)) 2623c9471b0ff1815ed0149dbfcad0f385ed8648eeb0Douglas Gregor CmdArgs.push_back("-fno-show-column"); 2624c9471b0ff1815ed0149dbfcad0f385ed8648eeb0Douglas Gregor 2625a0068fc64351db9c47916566e3b85ab733cd8d6dDouglas Gregor if (!Args.hasFlag(options::OPT_fspell_checking, 2626a0068fc64351db9c47916566e3b85ab733cd8d6dDouglas Gregor options::OPT_fno_spell_checking)) 2627a0068fc64351db9c47916566e3b85ab733cd8d6dDouglas Gregor CmdArgs.push_back("-fno-spell-checking"); 2628ca0e0545c216afaacba6da6c82a270dc2efc4e3fDaniel Dunbar 262925b26ebdebe46bb4576247e0c64d1c11410a8e9dDaniel Dunbar 2630168943947a42d6819dce56b420dc5aef4d0831ceDaniel Dunbar // Silently ignore -fasm-blocks for now. 2631168943947a42d6819dce56b420dc5aef4d0831ceDaniel Dunbar (void) Args.hasFlag(options::OPT_fasm_blocks, options::OPT_fno_asm_blocks, 2632168943947a42d6819dce56b420dc5aef4d0831ceDaniel Dunbar false); 263325b26ebdebe46bb4576247e0c64d1c11410a8e9dDaniel Dunbar 26345edbdcc62098e305cd55654814dcf783a3f3c477Jeffrey Yasskin if (Arg *A = Args.getLastArg(options::OPT_fshow_overloads_EQ)) 26355edbdcc62098e305cd55654814dcf783a3f3c477Jeffrey Yasskin A->render(Args, CmdArgs); 26365edbdcc62098e305cd55654814dcf783a3f3c477Jeffrey Yasskin 26377695fba30221613b7cf31276456217c41bb90960Daniel Dunbar // -fdollars-in-identifiers default varies depending on platform and 26387695fba30221613b7cf31276456217c41bb90960Daniel Dunbar // language; only pass if specified. 26391eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump if (Arg *A = Args.getLastArg(options::OPT_fdollars_in_identifiers, 26407695fba30221613b7cf31276456217c41bb90960Daniel Dunbar options::OPT_fno_dollars_in_identifiers)) { 26417695fba30221613b7cf31276456217c41bb90960Daniel Dunbar if (A->getOption().matches(options::OPT_fdollars_in_identifiers)) 26428663b180085e9bc7a0a87c80cc3f722efef99e79Daniel Dunbar CmdArgs.push_back("-fdollars-in-identifiers"); 26437695fba30221613b7cf31276456217c41bb90960Daniel Dunbar else 26448663b180085e9bc7a0a87c80cc3f722efef99e79Daniel Dunbar CmdArgs.push_back("-fno-dollars-in-identifiers"); 26457695fba30221613b7cf31276456217c41bb90960Daniel Dunbar } 26467695fba30221613b7cf31276456217c41bb90960Daniel Dunbar 2647e027a4b2399e9b0acfe0f77220c66bbe369067eeDaniel Dunbar // -funit-at-a-time is default, and we don't support -fno-unit-at-a-time for 2648e027a4b2399e9b0acfe0f77220c66bbe369067eeDaniel Dunbar // practical purposes. 26491eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump if (Arg *A = Args.getLastArg(options::OPT_funit_at_a_time, 2650e027a4b2399e9b0acfe0f77220c66bbe369067eeDaniel Dunbar options::OPT_fno_unit_at_a_time)) { 2651e027a4b2399e9b0acfe0f77220c66bbe369067eeDaniel Dunbar if (A->getOption().matches(options::OPT_fno_unit_at_a_time)) 26525f9e272e632e951b1efe824cd16acb4d96077930Chris Lattner D.Diag(diag::warn_drv_clang_unsupported) << A->getAsString(Args); 2653e027a4b2399e9b0acfe0f77220c66bbe369067eeDaniel Dunbar } 2654ceb5c5b7f67a30fae305d1d19b478b623e4fbcedEli Friedman 265519bda3ad8b5d37e505214e82fab1d0a0bf00f0fdEli Friedman if (Args.hasFlag(options::OPT_fapple_pragma_pack, 265619bda3ad8b5d37e505214e82fab1d0a0bf00f0fdEli Friedman options::OPT_fno_apple_pragma_pack, false)) 265719bda3ad8b5d37e505214e82fab1d0a0bf00f0fdEli Friedman CmdArgs.push_back("-fapple-pragma-pack"); 265819bda3ad8b5d37e505214e82fab1d0a0bf00f0fdEli Friedman 26592ba91575905a54f712a7f64304e56002e4882499Daniel Dunbar // Default to -fno-builtin-str{cat,cpy} on Darwin for ARM. 2660f84a4a469d8a45c76cb941595582a0fd3b9b15d3Daniel Dunbar // 26618ff5b28d6efcffe2251e77634c7edf83a4763344Daniel Dunbar // FIXME: This is disabled until clang -cc1 supports -fno-builtin-foo. PR4941. 2662f84a4a469d8a45c76cb941595582a0fd3b9b15d3Daniel Dunbar#if 0 2663905c45f15a25598620d19160c139c6b785aeea89Bob Wilson if (getToolChain().getTriple().isOSDarwin() && 26642ba91575905a54f712a7f64304e56002e4882499Daniel Dunbar (getToolChain().getTriple().getArch() == llvm::Triple::arm || 26652ba91575905a54f712a7f64304e56002e4882499Daniel Dunbar getToolChain().getTriple().getArch() == llvm::Triple::thumb)) { 26662ba91575905a54f712a7f64304e56002e4882499Daniel Dunbar if (!Args.hasArg(options::OPT_fbuiltin_strcat)) 26672ba91575905a54f712a7f64304e56002e4882499Daniel Dunbar CmdArgs.push_back("-fno-builtin-strcat"); 26682ba91575905a54f712a7f64304e56002e4882499Daniel Dunbar if (!Args.hasArg(options::OPT_fbuiltin_strcpy)) 26692ba91575905a54f712a7f64304e56002e4882499Daniel Dunbar CmdArgs.push_back("-fno-builtin-strcpy"); 26702ba91575905a54f712a7f64304e56002e4882499Daniel Dunbar } 2671f84a4a469d8a45c76cb941595582a0fd3b9b15d3Daniel Dunbar#endif 26722ba91575905a54f712a7f64304e56002e4882499Daniel Dunbar 2673d98750f065fd8d6278df72f6218e3d59b2df2aa9Daniel Dunbar // Only allow -traditional or -traditional-cpp outside in preprocessing modes. 26741eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump if (Arg *A = Args.getLastArg(options::OPT_traditional, 2675d98750f065fd8d6278df72f6218e3d59b2df2aa9Daniel Dunbar options::OPT_traditional_cpp)) { 2676d98750f065fd8d6278df72f6218e3d59b2df2aa9Daniel Dunbar if (isa<PreprocessJobAction>(JA)) 2677d98750f065fd8d6278df72f6218e3d59b2df2aa9Daniel Dunbar CmdArgs.push_back("-traditional-cpp"); 267888b7cf00fcb582728c642da3927c59468efaf926Eric Christopher else 26795f9e272e632e951b1efe824cd16acb4d96077930Chris Lattner D.Diag(diag::err_drv_clang_unsupported) << A->getAsString(Args); 2680d98750f065fd8d6278df72f6218e3d59b2df2aa9Daniel Dunbar } 2681ceb5c5b7f67a30fae305d1d19b478b623e4fbcedEli Friedman 26821d46033f760ba5fd266ce59fe391fac473f04f52Daniel Dunbar Args.AddLastArg(CmdArgs, options::OPT_dM); 2683d82df3ad430397d7f9ef511e7c5157f997c41f53Chris Lattner Args.AddLastArg(CmdArgs, options::OPT_dD); 268436f6e30d5c21a693abf2612ef086e83e9696f0e0Ted Kremenek 268536f6e30d5c21a693abf2612ef086e83e9696f0e0Ted Kremenek // Handle serialized diagnostics. 268636f6e30d5c21a693abf2612ef086e83e9696f0e0Ted Kremenek if (Arg *A = Args.getLastArg(options::OPT__serialize_diags)) { 268736f6e30d5c21a693abf2612ef086e83e9696f0e0Ted Kremenek CmdArgs.push_back("-serialize-diagnostic-file"); 268836f6e30d5c21a693abf2612ef086e83e9696f0e0Ted Kremenek CmdArgs.push_back(Args.MakeArgString(A->getValue(Args))); 268936f6e30d5c21a693abf2612ef086e83e9696f0e0Ted Kremenek } 26901d46033f760ba5fd266ce59fe391fac473f04f52Daniel Dunbar 26913f87fb08dd502309960646db01099fb4c1be9a7cDaniel Dunbar // Forward -Xclang arguments to -cc1, and -mllvm arguments to the LLVM option 26923f87fb08dd502309960646db01099fb4c1be9a7cDaniel Dunbar // parser. 26931d46033f760ba5fd266ce59fe391fac473f04f52Daniel Dunbar Args.AddAllArgValues(CmdArgs, options::OPT_Xclang); 26943f87fb08dd502309960646db01099fb4c1be9a7cDaniel Dunbar for (arg_iterator it = Args.filtered_begin(options::OPT_mllvm), 26953f87fb08dd502309960646db01099fb4c1be9a7cDaniel Dunbar ie = Args.filtered_end(); it != ie; ++it) { 26967e4953e5c60409007545288f14b430bd23d68570Daniel Dunbar (*it)->claim(); 2697fb36d21960a3bd422665a961eac6ca269cd6445bDaniel Dunbar 26983f87fb08dd502309960646db01099fb4c1be9a7cDaniel Dunbar // We translate this by hand to the -cc1 argument, since nightly test uses 26993f87fb08dd502309960646db01099fb4c1be9a7cDaniel Dunbar // it and developers have been trained to spell it with -mllvm. 27005f9e272e632e951b1efe824cd16acb4d96077930Chris Lattner if (StringRef((*it)->getValue(Args, 0)) == "-disable-llvm-optzns") 27013f87fb08dd502309960646db01099fb4c1be9a7cDaniel Dunbar CmdArgs.push_back("-disable-llvm-optzns"); 27023f87fb08dd502309960646db01099fb4c1be9a7cDaniel Dunbar else 27037e4953e5c60409007545288f14b430bd23d68570Daniel Dunbar (*it)->render(Args, CmdArgs); 27043f87fb08dd502309960646db01099fb4c1be9a7cDaniel Dunbar } 27051d46033f760ba5fd266ce59fe391fac473f04f52Daniel Dunbar 2706cd8e4c44dd068956e9181381be3ee2d49a0fac52Daniel Dunbar if (Output.getType() == types::TY_Dependencies) { 2707cd8e4c44dd068956e9181381be3ee2d49a0fac52Daniel Dunbar // Handled with other dependency code. 2708115a79277edababaf1b26e3654044ae983197679Daniel Dunbar } else if (Output.isFilename()) { 2709b488c1dac8e53206f07103d794a62a3f5012c0f4Daniel Dunbar CmdArgs.push_back("-o"); 2710115a79277edababaf1b26e3654044ae983197679Daniel Dunbar CmdArgs.push_back(Output.getFilename()); 2711115a79277edababaf1b26e3654044ae983197679Daniel Dunbar } else { 2712115a79277edababaf1b26e3654044ae983197679Daniel Dunbar assert(Output.isNothing() && "Invalid output."); 2713b488c1dac8e53206f07103d794a62a3f5012c0f4Daniel Dunbar } 2714b488c1dac8e53206f07103d794a62a3f5012c0f4Daniel Dunbar 27151d46033f760ba5fd266ce59fe391fac473f04f52Daniel Dunbar for (InputInfoList::const_iterator 27161d46033f760ba5fd266ce59fe391fac473f04f52Daniel Dunbar it = Inputs.begin(), ie = Inputs.end(); it != ie; ++it) { 27171d46033f760ba5fd266ce59fe391fac473f04f52Daniel Dunbar const InputInfo &II = *it; 27181d46033f760ba5fd266ce59fe391fac473f04f52Daniel Dunbar CmdArgs.push_back("-x"); 27191d46033f760ba5fd266ce59fe391fac473f04f52Daniel Dunbar CmdArgs.push_back(types::getTypeName(II.getType())); 27207c1e46533cae07216e2a67d5636a5afb44253155Daniel Dunbar if (II.isFilename()) 2721115a79277edababaf1b26e3654044ae983197679Daniel Dunbar CmdArgs.push_back(II.getFilename()); 27221d46033f760ba5fd266ce59fe391fac473f04f52Daniel Dunbar else 2723115a79277edababaf1b26e3654044ae983197679Daniel Dunbar II.getInputArg().renderAsInput(Args, CmdArgs); 27241d46033f760ba5fd266ce59fe391fac473f04f52Daniel Dunbar } 2725c21c485b4fb58ef5d55cf3e523263dd824a2ace4Daniel Dunbar 2726e6113de52df132b89c3a5a6141f17d37e83322aeChris Lattner Args.AddAllArgs(CmdArgs, options::OPT_undef); 2727e6113de52df132b89c3a5a6141f17d37e83322aeChris Lattner 2728a001c1ce5fcb669624a5b8e50d0a629d673da901Daniel Dunbar const char *Exec = getToolChain().getDriver().getClangProgramPath(); 2729f2d8b9f967a1ab53ee9fdbcc3ac0a4ee0a83a26eDaniel Dunbar 2730f2d8b9f967a1ab53ee9fdbcc3ac0a4ee0a83a26eDaniel Dunbar // Optionally embed the -cc1 level arguments into the debug info, for build 2731f2d8b9f967a1ab53ee9fdbcc3ac0a4ee0a83a26eDaniel Dunbar // analysis. 2732f2d8b9f967a1ab53ee9fdbcc3ac0a4ee0a83a26eDaniel Dunbar if (getToolChain().UseDwarfDebugFlags()) { 27336e90047520c8b4d6daa110bdbdaf15041016bd7cDaniel Dunbar ArgStringList OriginalArgs; 27346e90047520c8b4d6daa110bdbdaf15041016bd7cDaniel Dunbar for (ArgList::const_iterator it = Args.begin(), 27356e90047520c8b4d6daa110bdbdaf15041016bd7cDaniel Dunbar ie = Args.end(); it != ie; ++it) 27366e90047520c8b4d6daa110bdbdaf15041016bd7cDaniel Dunbar (*it)->render(Args, OriginalArgs); 2737ca0e0545c216afaacba6da6c82a270dc2efc4e3fDaniel Dunbar 2738f7ccbad5d9949e7ddd1cbef43d482553b811e026Dylan Noblesmith SmallString<256> Flags; 2739f2d8b9f967a1ab53ee9fdbcc3ac0a4ee0a83a26eDaniel Dunbar Flags += Exec; 27406e90047520c8b4d6daa110bdbdaf15041016bd7cDaniel Dunbar for (unsigned i = 0, e = OriginalArgs.size(); i != e; ++i) { 2741f2d8b9f967a1ab53ee9fdbcc3ac0a4ee0a83a26eDaniel Dunbar Flags += " "; 27426e90047520c8b4d6daa110bdbdaf15041016bd7cDaniel Dunbar Flags += OriginalArgs[i]; 2743f2d8b9f967a1ab53ee9fdbcc3ac0a4ee0a83a26eDaniel Dunbar } 2744f2d8b9f967a1ab53ee9fdbcc3ac0a4ee0a83a26eDaniel Dunbar CmdArgs.push_back("-dwarf-debug-flags"); 2745f2d8b9f967a1ab53ee9fdbcc3ac0a4ee0a83a26eDaniel Dunbar CmdArgs.push_back(Args.MakeArgString(Flags.str())); 2746f2d8b9f967a1ab53ee9fdbcc3ac0a4ee0a83a26eDaniel Dunbar } 2747f2d8b9f967a1ab53ee9fdbcc3ac0a4ee0a83a26eDaniel Dunbar 27482fe238ed293bd4bc27af9beb9fa151fad2146fa8Daniel Dunbar C.addCommand(new Command(JA, *this, Exec, CmdArgs)); 2749a880db0b0fc028abf754c290d921d809eec0518aDaniel Dunbar 2750be4c8705e499b55548467eb7adaa23cbc6edfef9Roman Divacky if (Arg *A = Args.getLastArg(options::OPT_pg)) 2751be4c8705e499b55548467eb7adaa23cbc6edfef9Roman Divacky if (Args.hasArg(options::OPT_fomit_frame_pointer)) 27525f9e272e632e951b1efe824cd16acb4d96077930Chris Lattner D.Diag(diag::err_drv_argument_not_allowed_with) 2753be4c8705e499b55548467eb7adaa23cbc6edfef9Roman Divacky << "-fomit-frame-pointer" << A->getAsString(Args); 275420249a1af2e462dcafdd6a350f1c7967b264ff25Michael J. Spencer 275568fb469aeb19144403e703b825854d08353c8eeaDaniel Dunbar // Claim some arguments which clang supports automatically. 275668fb469aeb19144403e703b825854d08353c8eeaDaniel Dunbar 2757f4046866e20fe3279b0daa2f48d9e83263dfdbfeDaniel Dunbar // -fpch-preprocess is used with gcc to add a special marker in the output to 2758f4046866e20fe3279b0daa2f48d9e83263dfdbfeDaniel Dunbar // include the PCH file. Clang's PTH solution is completely transparent, so we 2759f4046866e20fe3279b0daa2f48d9e83263dfdbfeDaniel Dunbar // do not need to deal with it at all. 276068fb469aeb19144403e703b825854d08353c8eeaDaniel Dunbar Args.ClaimAllArgs(options::OPT_fpch_preprocess); 2761c21c485b4fb58ef5d55cf3e523263dd824a2ace4Daniel Dunbar 2762a880db0b0fc028abf754c290d921d809eec0518aDaniel Dunbar // Claim some arguments which clang doesn't support, but we don't 2763a880db0b0fc028abf754c290d921d809eec0518aDaniel Dunbar // care to warn the user about. 2764cdd9686b890ebdc10039ae256ef4c9dfb5ebacb7Daniel Dunbar Args.ClaimAllArgs(options::OPT_clang_ignored_f_Group); 2765cdd9686b890ebdc10039ae256ef4c9dfb5ebacb7Daniel Dunbar Args.ClaimAllArgs(options::OPT_clang_ignored_m_Group); 2766035ff0c6746a2689667c83d4c02a47d5a7b71e82Rafael Espindola 27679c094fbcfaba49fc1aeca119c0e12bec59779692Rafael Espindola // Disable warnings for clang -E -use-gold-plugin -emit-llvm foo.c 2768035ff0c6746a2689667c83d4c02a47d5a7b71e82Rafael Espindola Args.ClaimAllArgs(options::OPT_use_gold_plugin); 27699c094fbcfaba49fc1aeca119c0e12bec59779692Rafael Espindola Args.ClaimAllArgs(options::OPT_emit_llvm); 277047ac7d27c44bd64a7d0fc03d4babc196cf2b8230Daniel Dunbar} 277147ac7d27c44bd64a7d0fc03d4babc196cf2b8230Daniel Dunbar 2772fc30829694e62040c14f329f5491724fe7476241Jim Grosbachvoid ClangAs::AddARMTargetArgs(const ArgList &Args, 2773fc30829694e62040c14f329f5491724fe7476241Jim Grosbach ArgStringList &CmdArgs) const { 2774fc30829694e62040c14f329f5491724fe7476241Jim Grosbach const Driver &D = getToolChain().getDriver(); 2775fc30829694e62040c14f329f5491724fe7476241Jim Grosbach llvm::Triple Triple = getToolChain().getTriple(); 2776fc30829694e62040c14f329f5491724fe7476241Jim Grosbach 2777fc30829694e62040c14f329f5491724fe7476241Jim Grosbach // Set the CPU based on -march= and -mcpu=. 2778fc30829694e62040c14f329f5491724fe7476241Jim Grosbach CmdArgs.push_back("-target-cpu"); 2779fc30829694e62040c14f329f5491724fe7476241Jim Grosbach CmdArgs.push_back(getARMTargetCPU(Args, Triple)); 2780fc30829694e62040c14f329f5491724fe7476241Jim Grosbach 2781fc30829694e62040c14f329f5491724fe7476241Jim Grosbach // Honor -mfpu=. 2782993172757762436d22b2dfc74e7cca1bade1a7bfChad Rosier if (const Arg *A = Args.getLastArg(options::OPT_mfpu_EQ)) 2783f80f2a5098218211704bc4e66a8c2f46a8fa1d25Chad Rosier addFPUArgs(D, A, Args, CmdArgs); 27847a938fa66be42710b034a79106de337a275fd265Chad Rosier 27857a938fa66be42710b034a79106de337a275fd265Chad Rosier // Honor -mfpmath=. 27867a938fa66be42710b034a79106de337a275fd265Chad Rosier if (const Arg *A = Args.getLastArg(options::OPT_mfpmath_EQ)) 278730fe6baf95662ea82a794a8fe3b76998713c183dChad Rosier addFPMathArgs(D, A, Args, CmdArgs, getARMTargetCPU(Args, Triple)); 2788fc30829694e62040c14f329f5491724fe7476241Jim Grosbach} 2789fc30829694e62040c14f329f5491724fe7476241Jim Grosbach 279020a9aa50f9a7d4b03f97bc67e96da1d605c309a2Daniel Dunbarvoid ClangAs::ConstructJob(Compilation &C, const JobAction &JA, 279120a9aa50f9a7d4b03f97bc67e96da1d605c309a2Daniel Dunbar const InputInfo &Output, 279220a9aa50f9a7d4b03f97bc67e96da1d605c309a2Daniel Dunbar const InputInfoList &Inputs, 279320a9aa50f9a7d4b03f97bc67e96da1d605c309a2Daniel Dunbar const ArgList &Args, 279420a9aa50f9a7d4b03f97bc67e96da1d605c309a2Daniel Dunbar const char *LinkingOutput) const { 279520a9aa50f9a7d4b03f97bc67e96da1d605c309a2Daniel Dunbar ArgStringList CmdArgs; 279620a9aa50f9a7d4b03f97bc67e96da1d605c309a2Daniel Dunbar 279720a9aa50f9a7d4b03f97bc67e96da1d605c309a2Daniel Dunbar assert(Inputs.size() == 1 && "Unexpected number of inputs."); 279820a9aa50f9a7d4b03f97bc67e96da1d605c309a2Daniel Dunbar const InputInfo &Input = Inputs[0]; 279920a9aa50f9a7d4b03f97bc67e96da1d605c309a2Daniel Dunbar 2800dbe80d9933e1fb0c26bd339e1f1f2f2d76dcac0aRafael Espindola // Don't warn about "clang -w -c foo.s" 2801dbe80d9933e1fb0c26bd339e1f1f2f2d76dcac0aRafael Espindola Args.ClaimAllArgs(options::OPT_w); 28029c094fbcfaba49fc1aeca119c0e12bec59779692Rafael Espindola // and "clang -emit-llvm -c foo.s" 28039c094fbcfaba49fc1aeca119c0e12bec59779692Rafael Espindola Args.ClaimAllArgs(options::OPT_emit_llvm); 28049c094fbcfaba49fc1aeca119c0e12bec59779692Rafael Espindola // and "clang -use-gold-plugin -c foo.s" 28059c094fbcfaba49fc1aeca119c0e12bec59779692Rafael Espindola Args.ClaimAllArgs(options::OPT_use_gold_plugin); 2806dbe80d9933e1fb0c26bd339e1f1f2f2d76dcac0aRafael Espindola 280720a9aa50f9a7d4b03f97bc67e96da1d605c309a2Daniel Dunbar // Invoke ourselves in -cc1as mode. 280820a9aa50f9a7d4b03f97bc67e96da1d605c309a2Daniel Dunbar // 280920a9aa50f9a7d4b03f97bc67e96da1d605c309a2Daniel Dunbar // FIXME: Implement custom jobs for internal actions. 281020a9aa50f9a7d4b03f97bc67e96da1d605c309a2Daniel Dunbar CmdArgs.push_back("-cc1as"); 281120a9aa50f9a7d4b03f97bc67e96da1d605c309a2Daniel Dunbar 281220a9aa50f9a7d4b03f97bc67e96da1d605c309a2Daniel Dunbar // Add the "effective" target triple. 281320a9aa50f9a7d4b03f97bc67e96da1d605c309a2Daniel Dunbar CmdArgs.push_back("-triple"); 281461ab80a8b35e6fe9363e8ef1b3d27209b0e89349Chad Rosier std::string TripleStr = 281561ab80a8b35e6fe9363e8ef1b3d27209b0e89349Chad Rosier getToolChain().ComputeEffectiveClangTriple(Args, Input.getType()); 281620a9aa50f9a7d4b03f97bc67e96da1d605c309a2Daniel Dunbar CmdArgs.push_back(Args.MakeArgString(TripleStr)); 281720a9aa50f9a7d4b03f97bc67e96da1d605c309a2Daniel Dunbar 281820a9aa50f9a7d4b03f97bc67e96da1d605c309a2Daniel Dunbar // Set the output mode, we currently only expect to be used as a real 281920a9aa50f9a7d4b03f97bc67e96da1d605c309a2Daniel Dunbar // assembler. 282020a9aa50f9a7d4b03f97bc67e96da1d605c309a2Daniel Dunbar CmdArgs.push_back("-filetype"); 282120a9aa50f9a7d4b03f97bc67e96da1d605c309a2Daniel Dunbar CmdArgs.push_back("obj"); 282220a9aa50f9a7d4b03f97bc67e96da1d605c309a2Daniel Dunbar 2823359cf927cf4980099a04b3f3cf040b81d181fe3dJoerg Sonnenberger if (UseRelaxAll(C, Args)) 2824469d40ef5a95d0eaddfd541616ad4cd26668e856Daniel Dunbar CmdArgs.push_back("-relax-all"); 28259929800b8dfced61e9c97dc8d6e71e144ebf8accDaniel Dunbar 2826fc30829694e62040c14f329f5491724fe7476241Jim Grosbach // Add target specific cpu and features flags. 2827fc30829694e62040c14f329f5491724fe7476241Jim Grosbach switch(getToolChain().getTriple().getArch()) { 2828fc30829694e62040c14f329f5491724fe7476241Jim Grosbach default: 2829fc30829694e62040c14f329f5491724fe7476241Jim Grosbach break; 2830fc30829694e62040c14f329f5491724fe7476241Jim Grosbach 2831fc30829694e62040c14f329f5491724fe7476241Jim Grosbach case llvm::Triple::arm: 2832fc30829694e62040c14f329f5491724fe7476241Jim Grosbach case llvm::Triple::thumb: 2833fc30829694e62040c14f329f5491724fe7476241Jim Grosbach AddARMTargetArgs(Args, CmdArgs); 2834fc30829694e62040c14f329f5491724fe7476241Jim Grosbach break; 2835fc30829694e62040c14f329f5491724fe7476241Jim Grosbach } 2836fc30829694e62040c14f329f5491724fe7476241Jim Grosbach 28377f6f8c8ab29db9221ed40ab7d5317df29848cc52Daniel Dunbar // Ignore explicit -force_cpusubtype_ALL option. 28387f6f8c8ab29db9221ed40ab7d5317df29848cc52Daniel Dunbar (void) Args.hasArg(options::OPT_force__cpusubtype__ALL); 283920a9aa50f9a7d4b03f97bc67e96da1d605c309a2Daniel Dunbar 28408f0a403945b60a8a8a56a7721bb66f6b84ec129bEric Christopher // Determine the original source input. 28418f0a403945b60a8a8a56a7721bb66f6b84ec129bEric Christopher const Action *SourceAction = &JA; 28428f0a403945b60a8a8a56a7721bb66f6b84ec129bEric Christopher while (SourceAction->getKind() != Action::InputClass) { 28438f0a403945b60a8a8a56a7721bb66f6b84ec129bEric Christopher assert(!SourceAction->getInputs().empty() && "unexpected root action!"); 28448f0a403945b60a8a8a56a7721bb66f6b84ec129bEric Christopher SourceAction = SourceAction->getInputs()[0]; 28458f0a403945b60a8a8a56a7721bb66f6b84ec129bEric Christopher } 28468f0a403945b60a8a8a56a7721bb66f6b84ec129bEric Christopher 28478f0a403945b60a8a8a56a7721bb66f6b84ec129bEric Christopher // Forward -g, assuming we are dealing with an actual assembly file. 28488f0a403945b60a8a8a56a7721bb66f6b84ec129bEric Christopher if (SourceAction->getType() == types::TY_Asm || 28498f0a403945b60a8a8a56a7721bb66f6b84ec129bEric Christopher SourceAction->getType() == types::TY_PP_Asm) { 28508f0a403945b60a8a8a56a7721bb66f6b84ec129bEric Christopher Args.ClaimAllArgs(options::OPT_g_Group); 28518f0a403945b60a8a8a56a7721bb66f6b84ec129bEric Christopher if (Arg *A = Args.getLastArg(options::OPT_g_Group)) 28528f0a403945b60a8a8a56a7721bb66f6b84ec129bEric Christopher if (!A->getOption().matches(options::OPT_g0)) 28538f0a403945b60a8a8a56a7721bb66f6b84ec129bEric Christopher CmdArgs.push_back("-g"); 28548f0a403945b60a8a8a56a7721bb66f6b84ec129bEric Christopher } 2855567003e572eed69cf1e8a04601076c8803355c7aKevin Enderby 2856567003e572eed69cf1e8a04601076c8803355c7aKevin Enderby // Optionally embed the -cc1as level arguments into the debug info, for build 2857567003e572eed69cf1e8a04601076c8803355c7aKevin Enderby // analysis. 2858567003e572eed69cf1e8a04601076c8803355c7aKevin Enderby if (getToolChain().UseDwarfDebugFlags()) { 2859567003e572eed69cf1e8a04601076c8803355c7aKevin Enderby ArgStringList OriginalArgs; 2860567003e572eed69cf1e8a04601076c8803355c7aKevin Enderby for (ArgList::const_iterator it = Args.begin(), 2861567003e572eed69cf1e8a04601076c8803355c7aKevin Enderby ie = Args.end(); it != ie; ++it) 2862567003e572eed69cf1e8a04601076c8803355c7aKevin Enderby (*it)->render(Args, OriginalArgs); 2863567003e572eed69cf1e8a04601076c8803355c7aKevin Enderby 2864f7ccbad5d9949e7ddd1cbef43d482553b811e026Dylan Noblesmith SmallString<256> Flags; 2865567003e572eed69cf1e8a04601076c8803355c7aKevin Enderby const char *Exec = getToolChain().getDriver().getClangProgramPath(); 2866567003e572eed69cf1e8a04601076c8803355c7aKevin Enderby Flags += Exec; 2867567003e572eed69cf1e8a04601076c8803355c7aKevin Enderby for (unsigned i = 0, e = OriginalArgs.size(); i != e; ++i) { 2868567003e572eed69cf1e8a04601076c8803355c7aKevin Enderby Flags += " "; 2869567003e572eed69cf1e8a04601076c8803355c7aKevin Enderby Flags += OriginalArgs[i]; 2870567003e572eed69cf1e8a04601076c8803355c7aKevin Enderby } 2871567003e572eed69cf1e8a04601076c8803355c7aKevin Enderby CmdArgs.push_back("-dwarf-debug-flags"); 2872567003e572eed69cf1e8a04601076c8803355c7aKevin Enderby CmdArgs.push_back(Args.MakeArgString(Flags.str())); 2873567003e572eed69cf1e8a04601076c8803355c7aKevin Enderby } 287420a9aa50f9a7d4b03f97bc67e96da1d605c309a2Daniel Dunbar 287520a9aa50f9a7d4b03f97bc67e96da1d605c309a2Daniel Dunbar // FIXME: Add -static support, once we have it. 287620a9aa50f9a7d4b03f97bc67e96da1d605c309a2Daniel Dunbar 287720a9aa50f9a7d4b03f97bc67e96da1d605c309a2Daniel Dunbar Args.AddAllArgValues(CmdArgs, options::OPT_Wa_COMMA, 287820a9aa50f9a7d4b03f97bc67e96da1d605c309a2Daniel Dunbar options::OPT_Xassembler); 28793df2325a0fd4b868b804aa1708beb3634402c22dDaniel Dunbar Args.AddAllArgs(CmdArgs, options::OPT_mllvm); 288020a9aa50f9a7d4b03f97bc67e96da1d605c309a2Daniel Dunbar 288120a9aa50f9a7d4b03f97bc67e96da1d605c309a2Daniel Dunbar assert(Output.isFilename() && "Unexpected lipo output."); 288220a9aa50f9a7d4b03f97bc67e96da1d605c309a2Daniel Dunbar CmdArgs.push_back("-o"); 288320a9aa50f9a7d4b03f97bc67e96da1d605c309a2Daniel Dunbar CmdArgs.push_back(Output.getFilename()); 288420a9aa50f9a7d4b03f97bc67e96da1d605c309a2Daniel Dunbar 28857c1e46533cae07216e2a67d5636a5afb44253155Daniel Dunbar assert(Input.isFilename() && "Invalid input."); 28867c1e46533cae07216e2a67d5636a5afb44253155Daniel Dunbar CmdArgs.push_back(Input.getFilename()); 288720a9aa50f9a7d4b03f97bc67e96da1d605c309a2Daniel Dunbar 2888a001c1ce5fcb669624a5b8e50d0a629d673da901Daniel Dunbar const char *Exec = getToolChain().getDriver().getClangProgramPath(); 28892fe238ed293bd4bc27af9beb9fa151fad2146fa8Daniel Dunbar C.addCommand(new Command(JA, *this, Exec, CmdArgs)); 289020a9aa50f9a7d4b03f97bc67e96da1d605c309a2Daniel Dunbar} 289120a9aa50f9a7d4b03f97bc67e96da1d605c309a2Daniel Dunbar 2892b488c1dac8e53206f07103d794a62a3f5012c0f4Daniel Dunbarvoid gcc::Common::ConstructJob(Compilation &C, const JobAction &JA, 2893b488c1dac8e53206f07103d794a62a3f5012c0f4Daniel Dunbar const InputInfo &Output, 2894b488c1dac8e53206f07103d794a62a3f5012c0f4Daniel Dunbar const InputInfoList &Inputs, 28951d46033f760ba5fd266ce59fe391fac473f04f52Daniel Dunbar const ArgList &Args, 2896b488c1dac8e53206f07103d794a62a3f5012c0f4Daniel Dunbar const char *LinkingOutput) const { 2897ee788e70fcd0adf76103b17c78ac658d4ea30c9bDaniel Dunbar const Driver &D = getToolChain().getDriver(); 2898b488c1dac8e53206f07103d794a62a3f5012c0f4Daniel Dunbar ArgStringList CmdArgs; 2899b488c1dac8e53206f07103d794a62a3f5012c0f4Daniel Dunbar 2900c21c485b4fb58ef5d55cf3e523263dd824a2ace4Daniel Dunbar for (ArgList::const_iterator 29011d46033f760ba5fd266ce59fe391fac473f04f52Daniel Dunbar it = Args.begin(), ie = Args.end(); it != ie; ++it) { 2902b488c1dac8e53206f07103d794a62a3f5012c0f4Daniel Dunbar Arg *A = *it; 29037587719c40ebf02bf11e5e66c30bd20e98edebc2Daniel Dunbar if (A->getOption().hasForwardToGCC()) { 29042dffe2d9d631fefd79d4999f6ffe7ac0d70882b1Daniel Dunbar // Don't forward any -g arguments to assembly steps. 29052dffe2d9d631fefd79d4999f6ffe7ac0d70882b1Daniel Dunbar if (isa<AssembleJobAction>(JA) && 29062dffe2d9d631fefd79d4999f6ffe7ac0d70882b1Daniel Dunbar A->getOption().matches(options::OPT_g_Group)) 29072dffe2d9d631fefd79d4999f6ffe7ac0d70882b1Daniel Dunbar continue; 29082dffe2d9d631fefd79d4999f6ffe7ac0d70882b1Daniel Dunbar 29097587719c40ebf02bf11e5e66c30bd20e98edebc2Daniel Dunbar // It is unfortunate that we have to claim here, as this means 29107587719c40ebf02bf11e5e66c30bd20e98edebc2Daniel Dunbar // we will basically never report anything interesting for 29116ecc7a993f939c5255c36c7c0d965fb9c1543f2aDaniel Dunbar // platforms using a generic gcc, even if we are just using gcc 29126ecc7a993f939c5255c36c7c0d965fb9c1543f2aDaniel Dunbar // to get to the assembler. 29137587719c40ebf02bf11e5e66c30bd20e98edebc2Daniel Dunbar A->claim(); 29141d46033f760ba5fd266ce59fe391fac473f04f52Daniel Dunbar A->render(Args, CmdArgs); 29157587719c40ebf02bf11e5e66c30bd20e98edebc2Daniel Dunbar } 2916b488c1dac8e53206f07103d794a62a3f5012c0f4Daniel Dunbar } 2917c21c485b4fb58ef5d55cf3e523263dd824a2ace4Daniel Dunbar 291882b51cce8cea6b6bb6175c406c2ab425c91d9dc8Daniel Dunbar RenderExtraToolArgs(JA, CmdArgs); 2919b488c1dac8e53206f07103d794a62a3f5012c0f4Daniel Dunbar 2920b488c1dac8e53206f07103d794a62a3f5012c0f4Daniel Dunbar // If using a driver driver, force the arch. 29217cfe31a713d8fcfc2a1328e8fbd8efdeb0aec51bDaniel Dunbar const std::string &Arch = getToolChain().getArchName(); 2922905c45f15a25598620d19160c139c6b785aeea89Bob Wilson if (getToolChain().getTriple().isOSDarwin()) { 2923b488c1dac8e53206f07103d794a62a3f5012c0f4Daniel Dunbar CmdArgs.push_back("-arch"); 2924bf54a06f9b771c2a2730cc63eb89bce0522515b5Daniel Dunbar 2925bf54a06f9b771c2a2730cc63eb89bce0522515b5Daniel Dunbar // FIXME: Remove these special cases. 29267cfe31a713d8fcfc2a1328e8fbd8efdeb0aec51bDaniel Dunbar if (Arch == "powerpc") 29277cfe31a713d8fcfc2a1328e8fbd8efdeb0aec51bDaniel Dunbar CmdArgs.push_back("ppc"); 29287cfe31a713d8fcfc2a1328e8fbd8efdeb0aec51bDaniel Dunbar else if (Arch == "powerpc64") 29297cfe31a713d8fcfc2a1328e8fbd8efdeb0aec51bDaniel Dunbar CmdArgs.push_back("ppc64"); 29307cfe31a713d8fcfc2a1328e8fbd8efdeb0aec51bDaniel Dunbar else 2931881376467c46c5c6cc16fa6790271c2c22e1d4f1Daniel Dunbar CmdArgs.push_back(Args.MakeArgString(Arch)); 2932b488c1dac8e53206f07103d794a62a3f5012c0f4Daniel Dunbar } 2933b488c1dac8e53206f07103d794a62a3f5012c0f4Daniel Dunbar 29346ecc7a993f939c5255c36c7c0d965fb9c1543f2aDaniel Dunbar // Try to force gcc to match the tool chain we want, if we recognize 29356ecc7a993f939c5255c36c7c0d965fb9c1543f2aDaniel Dunbar // the arch. 29367cfe31a713d8fcfc2a1328e8fbd8efdeb0aec51bDaniel Dunbar // 29377cfe31a713d8fcfc2a1328e8fbd8efdeb0aec51bDaniel Dunbar // FIXME: The triple class should directly provide the information we want 29387cfe31a713d8fcfc2a1328e8fbd8efdeb0aec51bDaniel Dunbar // here. 29397cfe31a713d8fcfc2a1328e8fbd8efdeb0aec51bDaniel Dunbar if (Arch == "i386" || Arch == "powerpc") 29406ecc7a993f939c5255c36c7c0d965fb9c1543f2aDaniel Dunbar CmdArgs.push_back("-m32"); 29417cfe31a713d8fcfc2a1328e8fbd8efdeb0aec51bDaniel Dunbar else if (Arch == "x86_64" || Arch == "powerpc64") 29426ecc7a993f939c5255c36c7c0d965fb9c1543f2aDaniel Dunbar CmdArgs.push_back("-m64"); 29436ecc7a993f939c5255c36c7c0d965fb9c1543f2aDaniel Dunbar 29447c1e46533cae07216e2a67d5636a5afb44253155Daniel Dunbar if (Output.isFilename()) { 2945b488c1dac8e53206f07103d794a62a3f5012c0f4Daniel Dunbar CmdArgs.push_back("-o"); 2946115a79277edababaf1b26e3654044ae983197679Daniel Dunbar CmdArgs.push_back(Output.getFilename()); 2947115a79277edababaf1b26e3654044ae983197679Daniel Dunbar } else { 2948115a79277edababaf1b26e3654044ae983197679Daniel Dunbar assert(Output.isNothing() && "Unexpected output"); 2949b488c1dac8e53206f07103d794a62a3f5012c0f4Daniel Dunbar CmdArgs.push_back("-fsyntax-only"); 2950115a79277edababaf1b26e3654044ae983197679Daniel Dunbar } 2951b488c1dac8e53206f07103d794a62a3f5012c0f4Daniel Dunbar 29529631939f82c0eaa6fb3936a0ce58a41adfbc9011Tony Linthicum Args.AddAllArgValues(CmdArgs, options::OPT_Wa_COMMA, 29539631939f82c0eaa6fb3936a0ce58a41adfbc9011Tony Linthicum options::OPT_Xassembler); 2954b488c1dac8e53206f07103d794a62a3f5012c0f4Daniel Dunbar 2955b488c1dac8e53206f07103d794a62a3f5012c0f4Daniel Dunbar // Only pass -x if gcc will understand it; otherwise hope gcc 2956b488c1dac8e53206f07103d794a62a3f5012c0f4Daniel Dunbar // understands the suffix correctly. The main use case this would go 2957b488c1dac8e53206f07103d794a62a3f5012c0f4Daniel Dunbar // wrong in is for linker inputs if they happened to have an odd 2958b488c1dac8e53206f07103d794a62a3f5012c0f4Daniel Dunbar // suffix; really the only way to get this to happen is a command 2959b488c1dac8e53206f07103d794a62a3f5012c0f4Daniel Dunbar // like '-x foobar a.c' which will treat a.c like a linker input. 2960b488c1dac8e53206f07103d794a62a3f5012c0f4Daniel Dunbar // 2961b488c1dac8e53206f07103d794a62a3f5012c0f4Daniel Dunbar // FIXME: For the linker case specifically, can we safely convert 2962b488c1dac8e53206f07103d794a62a3f5012c0f4Daniel Dunbar // inputs into '-Wl,' options? 2963b488c1dac8e53206f07103d794a62a3f5012c0f4Daniel Dunbar for (InputInfoList::const_iterator 2964b488c1dac8e53206f07103d794a62a3f5012c0f4Daniel Dunbar it = Inputs.begin(), ie = Inputs.end(); it != ie; ++it) { 2965b488c1dac8e53206f07103d794a62a3f5012c0f4Daniel Dunbar const InputInfo &II = *it; 2966a8304f67291b0182fb64f3afc621615288dd1d31Daniel Dunbar 29675915fbf310e171c4cd3c2af05e9de360c0fa988aDaniel Dunbar // Don't try to pass LLVM or AST inputs to a generic gcc. 29686c6424bc0d3b5f080a97b5f6ef4a8d70c38e38f5Daniel Dunbar if (II.getType() == types::TY_LLVM_IR || II.getType() == types::TY_LTO_IR || 29696c6424bc0d3b5f080a97b5f6ef4a8d70c38e38f5Daniel Dunbar II.getType() == types::TY_LLVM_BC || II.getType() == types::TY_LTO_BC) 29705f9e272e632e951b1efe824cd16acb4d96077930Chris Lattner D.Diag(diag::err_drv_no_linker_llvm_support) 2971881376467c46c5c6cc16fa6790271c2c22e1d4f1Daniel Dunbar << getToolChain().getTripleString(); 29725915fbf310e171c4cd3c2af05e9de360c0fa988aDaniel Dunbar else if (II.getType() == types::TY_AST) 29735f9e272e632e951b1efe824cd16acb4d96077930Chris Lattner D.Diag(diag::err_drv_no_ast_support) 2974881376467c46c5c6cc16fa6790271c2c22e1d4f1Daniel Dunbar << getToolChain().getTripleString(); 2975a8304f67291b0182fb64f3afc621615288dd1d31Daniel Dunbar 2976b488c1dac8e53206f07103d794a62a3f5012c0f4Daniel Dunbar if (types::canTypeBeUserSpecified(II.getType())) { 2977b488c1dac8e53206f07103d794a62a3f5012c0f4Daniel Dunbar CmdArgs.push_back("-x"); 2978b488c1dac8e53206f07103d794a62a3f5012c0f4Daniel Dunbar CmdArgs.push_back(types::getTypeName(II.getType())); 2979b488c1dac8e53206f07103d794a62a3f5012c0f4Daniel Dunbar } 2980b488c1dac8e53206f07103d794a62a3f5012c0f4Daniel Dunbar 29817c1e46533cae07216e2a67d5636a5afb44253155Daniel Dunbar if (II.isFilename()) 2982115a79277edababaf1b26e3654044ae983197679Daniel Dunbar CmdArgs.push_back(II.getFilename()); 298348f9994bdd9f7f1853782109595b1f80f50afcfaDaniel Dunbar else { 298448f9994bdd9f7f1853782109595b1f80f50afcfaDaniel Dunbar const Arg &A = II.getInputArg(); 298548f9994bdd9f7f1853782109595b1f80f50afcfaDaniel Dunbar 298648f9994bdd9f7f1853782109595b1f80f50afcfaDaniel Dunbar // Reverse translate some rewritten options. 298748f9994bdd9f7f1853782109595b1f80f50afcfaDaniel Dunbar if (A.getOption().matches(options::OPT_Z_reserved_lib_stdcxx)) { 298848f9994bdd9f7f1853782109595b1f80f50afcfaDaniel Dunbar CmdArgs.push_back("-lstdc++"); 298948f9994bdd9f7f1853782109595b1f80f50afcfaDaniel Dunbar continue; 299048f9994bdd9f7f1853782109595b1f80f50afcfaDaniel Dunbar } 299148f9994bdd9f7f1853782109595b1f80f50afcfaDaniel Dunbar 2992115a79277edababaf1b26e3654044ae983197679Daniel Dunbar // Don't render as input, we need gcc to do the translations. 299348f9994bdd9f7f1853782109595b1f80f50afcfaDaniel Dunbar A.render(Args, CmdArgs); 299448f9994bdd9f7f1853782109595b1f80f50afcfaDaniel Dunbar } 2995b488c1dac8e53206f07103d794a62a3f5012c0f4Daniel Dunbar } 2996b488c1dac8e53206f07103d794a62a3f5012c0f4Daniel Dunbar 2997b8a3e8139b9fe513500c89bbcd9133415654a689Dylan Noblesmith const std::string customGCCName = D.getCCCGenericGCCName(); 2998b8a3e8139b9fe513500c89bbcd9133415654a689Dylan Noblesmith const char *GCCName; 2999b8a3e8139b9fe513500c89bbcd9133415654a689Dylan Noblesmith if (!customGCCName.empty()) 3000b8a3e8139b9fe513500c89bbcd9133415654a689Dylan Noblesmith GCCName = customGCCName.c_str(); 3001b8a3e8139b9fe513500c89bbcd9133415654a689Dylan Noblesmith else if (D.CCCIsCXX) { 3002b8a3e8139b9fe513500c89bbcd9133415654a689Dylan Noblesmith GCCName = "g++"; 3003b8a3e8139b9fe513500c89bbcd9133415654a689Dylan Noblesmith } else 3004b8a3e8139b9fe513500c89bbcd9133415654a689Dylan Noblesmith GCCName = "gcc"; 3005b8a3e8139b9fe513500c89bbcd9133415654a689Dylan Noblesmith 3006c21c485b4fb58ef5d55cf3e523263dd824a2ace4Daniel Dunbar const char *Exec = 30074a7e88978cf646ad10d654020cb00b3877069210Daniel Dunbar Args.MakeArgString(getToolChain().GetProgramPath(GCCName)); 30082fe238ed293bd4bc27af9beb9fa151fad2146fa8Daniel Dunbar C.addCommand(new Command(JA, *this, Exec, CmdArgs)); 300947ac7d27c44bd64a7d0fc03d4babc196cf2b8230Daniel Dunbar} 301047ac7d27c44bd64a7d0fc03d4babc196cf2b8230Daniel Dunbar 301182b51cce8cea6b6bb6175c406c2ab425c91d9dc8Daniel Dunbarvoid gcc::Preprocess::RenderExtraToolArgs(const JobAction &JA, 301282b51cce8cea6b6bb6175c406c2ab425c91d9dc8Daniel Dunbar ArgStringList &CmdArgs) const { 3013b488c1dac8e53206f07103d794a62a3f5012c0f4Daniel Dunbar CmdArgs.push_back("-E"); 301447ac7d27c44bd64a7d0fc03d4babc196cf2b8230Daniel Dunbar} 301547ac7d27c44bd64a7d0fc03d4babc196cf2b8230Daniel Dunbar 301682b51cce8cea6b6bb6175c406c2ab425c91d9dc8Daniel Dunbarvoid gcc::Precompile::RenderExtraToolArgs(const JobAction &JA, 301782b51cce8cea6b6bb6175c406c2ab425c91d9dc8Daniel Dunbar ArgStringList &CmdArgs) const { 3018b488c1dac8e53206f07103d794a62a3f5012c0f4Daniel Dunbar // The type is good enough. 301947ac7d27c44bd64a7d0fc03d4babc196cf2b8230Daniel Dunbar} 302047ac7d27c44bd64a7d0fc03d4babc196cf2b8230Daniel Dunbar 302182b51cce8cea6b6bb6175c406c2ab425c91d9dc8Daniel Dunbarvoid gcc::Compile::RenderExtraToolArgs(const JobAction &JA, 302282b51cce8cea6b6bb6175c406c2ab425c91d9dc8Daniel Dunbar ArgStringList &CmdArgs) const { 302364952508c2b0c8bffb45c8b410f0af3d2457f59bDaniel Dunbar const Driver &D = getToolChain().getDriver(); 302464952508c2b0c8bffb45c8b410f0af3d2457f59bDaniel Dunbar 302582b51cce8cea6b6bb6175c406c2ab425c91d9dc8Daniel Dunbar // If -flto, etc. are present then make sure not to force assembly output. 30266c6424bc0d3b5f080a97b5f6ef4a8d70c38e38f5Daniel Dunbar if (JA.getType() == types::TY_LLVM_IR || JA.getType() == types::TY_LTO_IR || 30276c6424bc0d3b5f080a97b5f6ef4a8d70c38e38f5Daniel Dunbar JA.getType() == types::TY_LLVM_BC || JA.getType() == types::TY_LTO_BC) 302882b51cce8cea6b6bb6175c406c2ab425c91d9dc8Daniel Dunbar CmdArgs.push_back("-c"); 302964952508c2b0c8bffb45c8b410f0af3d2457f59bDaniel Dunbar else { 303064952508c2b0c8bffb45c8b410f0af3d2457f59bDaniel Dunbar if (JA.getType() != types::TY_PP_Asm) 30315f9e272e632e951b1efe824cd16acb4d96077930Chris Lattner D.Diag(diag::err_drv_invalid_gcc_output_type) 303264952508c2b0c8bffb45c8b410f0af3d2457f59bDaniel Dunbar << getTypeName(JA.getType()); 303320249a1af2e462dcafdd6a350f1c7967b264ff25Michael J. Spencer 303482b51cce8cea6b6bb6175c406c2ab425c91d9dc8Daniel Dunbar CmdArgs.push_back("-S"); 303564952508c2b0c8bffb45c8b410f0af3d2457f59bDaniel Dunbar } 303647ac7d27c44bd64a7d0fc03d4babc196cf2b8230Daniel Dunbar} 303747ac7d27c44bd64a7d0fc03d4babc196cf2b8230Daniel Dunbar 303882b51cce8cea6b6bb6175c406c2ab425c91d9dc8Daniel Dunbarvoid gcc::Assemble::RenderExtraToolArgs(const JobAction &JA, 303982b51cce8cea6b6bb6175c406c2ab425c91d9dc8Daniel Dunbar ArgStringList &CmdArgs) const { 3040b488c1dac8e53206f07103d794a62a3f5012c0f4Daniel Dunbar CmdArgs.push_back("-c"); 3041b488c1dac8e53206f07103d794a62a3f5012c0f4Daniel Dunbar} 304247ac7d27c44bd64a7d0fc03d4babc196cf2b8230Daniel Dunbar 304382b51cce8cea6b6bb6175c406c2ab425c91d9dc8Daniel Dunbarvoid gcc::Link::RenderExtraToolArgs(const JobAction &JA, 304482b51cce8cea6b6bb6175c406c2ab425c91d9dc8Daniel Dunbar ArgStringList &CmdArgs) const { 3045b488c1dac8e53206f07103d794a62a3f5012c0f4Daniel Dunbar // The types are (hopefully) good enough. 304647ac7d27c44bd64a7d0fc03d4babc196cf2b8230Daniel Dunbar} 3047b488c1dac8e53206f07103d794a62a3f5012c0f4Daniel Dunbar 30489631939f82c0eaa6fb3936a0ce58a41adfbc9011Tony Linthicum// Hexagon tools start. 30499631939f82c0eaa6fb3936a0ce58a41adfbc9011Tony Linthicumvoid hexagon::Assemble::RenderExtraToolArgs(const JobAction &JA, 30509631939f82c0eaa6fb3936a0ce58a41adfbc9011Tony Linthicum ArgStringList &CmdArgs) const { 30519631939f82c0eaa6fb3936a0ce58a41adfbc9011Tony Linthicum 30529631939f82c0eaa6fb3936a0ce58a41adfbc9011Tony Linthicum} 30539631939f82c0eaa6fb3936a0ce58a41adfbc9011Tony Linthicumvoid hexagon::Assemble::ConstructJob(Compilation &C, const JobAction &JA, 30549631939f82c0eaa6fb3936a0ce58a41adfbc9011Tony Linthicum const InputInfo &Output, 30559631939f82c0eaa6fb3936a0ce58a41adfbc9011Tony Linthicum const InputInfoList &Inputs, 30569631939f82c0eaa6fb3936a0ce58a41adfbc9011Tony Linthicum const ArgList &Args, 30579631939f82c0eaa6fb3936a0ce58a41adfbc9011Tony Linthicum const char *LinkingOutput) const { 30589631939f82c0eaa6fb3936a0ce58a41adfbc9011Tony Linthicum 30599631939f82c0eaa6fb3936a0ce58a41adfbc9011Tony Linthicum const Driver &D = getToolChain().getDriver(); 30609631939f82c0eaa6fb3936a0ce58a41adfbc9011Tony Linthicum ArgStringList CmdArgs; 30619631939f82c0eaa6fb3936a0ce58a41adfbc9011Tony Linthicum 30629631939f82c0eaa6fb3936a0ce58a41adfbc9011Tony Linthicum std::string MarchString = "-march="; 30639631939f82c0eaa6fb3936a0ce58a41adfbc9011Tony Linthicum MarchString += getHexagonTargetCPU(Args); 30649631939f82c0eaa6fb3936a0ce58a41adfbc9011Tony Linthicum CmdArgs.push_back(Args.MakeArgString(MarchString)); 30659631939f82c0eaa6fb3936a0ce58a41adfbc9011Tony Linthicum 30669631939f82c0eaa6fb3936a0ce58a41adfbc9011Tony Linthicum RenderExtraToolArgs(JA, CmdArgs); 30679631939f82c0eaa6fb3936a0ce58a41adfbc9011Tony Linthicum 30689631939f82c0eaa6fb3936a0ce58a41adfbc9011Tony Linthicum if (Output.isFilename()) { 30699631939f82c0eaa6fb3936a0ce58a41adfbc9011Tony Linthicum CmdArgs.push_back("-o"); 30709631939f82c0eaa6fb3936a0ce58a41adfbc9011Tony Linthicum CmdArgs.push_back(Output.getFilename()); 30719631939f82c0eaa6fb3936a0ce58a41adfbc9011Tony Linthicum } else { 30729631939f82c0eaa6fb3936a0ce58a41adfbc9011Tony Linthicum assert(Output.isNothing() && "Unexpected output"); 30739631939f82c0eaa6fb3936a0ce58a41adfbc9011Tony Linthicum CmdArgs.push_back("-fsyntax-only"); 30749631939f82c0eaa6fb3936a0ce58a41adfbc9011Tony Linthicum } 30759631939f82c0eaa6fb3936a0ce58a41adfbc9011Tony Linthicum 30769631939f82c0eaa6fb3936a0ce58a41adfbc9011Tony Linthicum 30779631939f82c0eaa6fb3936a0ce58a41adfbc9011Tony Linthicum // Only pass -x if gcc will understand it; otherwise hope gcc 30789631939f82c0eaa6fb3936a0ce58a41adfbc9011Tony Linthicum // understands the suffix correctly. The main use case this would go 30799631939f82c0eaa6fb3936a0ce58a41adfbc9011Tony Linthicum // wrong in is for linker inputs if they happened to have an odd 30809631939f82c0eaa6fb3936a0ce58a41adfbc9011Tony Linthicum // suffix; really the only way to get this to happen is a command 30819631939f82c0eaa6fb3936a0ce58a41adfbc9011Tony Linthicum // like '-x foobar a.c' which will treat a.c like a linker input. 30829631939f82c0eaa6fb3936a0ce58a41adfbc9011Tony Linthicum // 30839631939f82c0eaa6fb3936a0ce58a41adfbc9011Tony Linthicum // FIXME: For the linker case specifically, can we safely convert 30849631939f82c0eaa6fb3936a0ce58a41adfbc9011Tony Linthicum // inputs into '-Wl,' options? 30859631939f82c0eaa6fb3936a0ce58a41adfbc9011Tony Linthicum for (InputInfoList::const_iterator 30869631939f82c0eaa6fb3936a0ce58a41adfbc9011Tony Linthicum it = Inputs.begin(), ie = Inputs.end(); it != ie; ++it) { 30879631939f82c0eaa6fb3936a0ce58a41adfbc9011Tony Linthicum const InputInfo &II = *it; 30889631939f82c0eaa6fb3936a0ce58a41adfbc9011Tony Linthicum 30899631939f82c0eaa6fb3936a0ce58a41adfbc9011Tony Linthicum // Don't try to pass LLVM or AST inputs to a generic gcc. 30909631939f82c0eaa6fb3936a0ce58a41adfbc9011Tony Linthicum if (II.getType() == types::TY_LLVM_IR || II.getType() == types::TY_LTO_IR || 30919631939f82c0eaa6fb3936a0ce58a41adfbc9011Tony Linthicum II.getType() == types::TY_LLVM_BC || II.getType() == types::TY_LTO_BC) 30929631939f82c0eaa6fb3936a0ce58a41adfbc9011Tony Linthicum D.Diag(clang::diag::err_drv_no_linker_llvm_support) 30939631939f82c0eaa6fb3936a0ce58a41adfbc9011Tony Linthicum << getToolChain().getTripleString(); 30949631939f82c0eaa6fb3936a0ce58a41adfbc9011Tony Linthicum else if (II.getType() == types::TY_AST) 30959631939f82c0eaa6fb3936a0ce58a41adfbc9011Tony Linthicum D.Diag(clang::diag::err_drv_no_ast_support) 30969631939f82c0eaa6fb3936a0ce58a41adfbc9011Tony Linthicum << getToolChain().getTripleString(); 30979631939f82c0eaa6fb3936a0ce58a41adfbc9011Tony Linthicum 30989631939f82c0eaa6fb3936a0ce58a41adfbc9011Tony Linthicum if (II.isFilename()) 30999631939f82c0eaa6fb3936a0ce58a41adfbc9011Tony Linthicum CmdArgs.push_back(II.getFilename()); 31009631939f82c0eaa6fb3936a0ce58a41adfbc9011Tony Linthicum else 31019631939f82c0eaa6fb3936a0ce58a41adfbc9011Tony Linthicum // Don't render as input, we need gcc to do the translations. FIXME: Pranav: What is this ? 31029631939f82c0eaa6fb3936a0ce58a41adfbc9011Tony Linthicum II.getInputArg().render(Args, CmdArgs); 31039631939f82c0eaa6fb3936a0ce58a41adfbc9011Tony Linthicum } 31049631939f82c0eaa6fb3936a0ce58a41adfbc9011Tony Linthicum 31059631939f82c0eaa6fb3936a0ce58a41adfbc9011Tony Linthicum const char *GCCName = "hexagon-as"; 31069631939f82c0eaa6fb3936a0ce58a41adfbc9011Tony Linthicum const char *Exec = 31079631939f82c0eaa6fb3936a0ce58a41adfbc9011Tony Linthicum Args.MakeArgString(getToolChain().GetProgramPath(GCCName)); 31089631939f82c0eaa6fb3936a0ce58a41adfbc9011Tony Linthicum C.addCommand(new Command(JA, *this, Exec, CmdArgs)); 31099631939f82c0eaa6fb3936a0ce58a41adfbc9011Tony Linthicum 31109631939f82c0eaa6fb3936a0ce58a41adfbc9011Tony Linthicum} 31119631939f82c0eaa6fb3936a0ce58a41adfbc9011Tony Linthicumvoid hexagon::Link::RenderExtraToolArgs(const JobAction &JA, 31129631939f82c0eaa6fb3936a0ce58a41adfbc9011Tony Linthicum ArgStringList &CmdArgs) const { 31139631939f82c0eaa6fb3936a0ce58a41adfbc9011Tony Linthicum // The types are (hopefully) good enough. 31149631939f82c0eaa6fb3936a0ce58a41adfbc9011Tony Linthicum} 31159631939f82c0eaa6fb3936a0ce58a41adfbc9011Tony Linthicum 31169631939f82c0eaa6fb3936a0ce58a41adfbc9011Tony Linthicumvoid hexagon::Link::ConstructJob(Compilation &C, const JobAction &JA, 31179631939f82c0eaa6fb3936a0ce58a41adfbc9011Tony Linthicum const InputInfo &Output, 31189631939f82c0eaa6fb3936a0ce58a41adfbc9011Tony Linthicum const InputInfoList &Inputs, 31199631939f82c0eaa6fb3936a0ce58a41adfbc9011Tony Linthicum const ArgList &Args, 31209631939f82c0eaa6fb3936a0ce58a41adfbc9011Tony Linthicum const char *LinkingOutput) const { 31219631939f82c0eaa6fb3936a0ce58a41adfbc9011Tony Linthicum 31229631939f82c0eaa6fb3936a0ce58a41adfbc9011Tony Linthicum const Driver &D = getToolChain().getDriver(); 31239631939f82c0eaa6fb3936a0ce58a41adfbc9011Tony Linthicum ArgStringList CmdArgs; 31249631939f82c0eaa6fb3936a0ce58a41adfbc9011Tony Linthicum 31259631939f82c0eaa6fb3936a0ce58a41adfbc9011Tony Linthicum for (ArgList::const_iterator 31269631939f82c0eaa6fb3936a0ce58a41adfbc9011Tony Linthicum it = Args.begin(), ie = Args.end(); it != ie; ++it) { 31279631939f82c0eaa6fb3936a0ce58a41adfbc9011Tony Linthicum Arg *A = *it; 31289631939f82c0eaa6fb3936a0ce58a41adfbc9011Tony Linthicum if (A->getOption().hasForwardToGCC()) { 31299631939f82c0eaa6fb3936a0ce58a41adfbc9011Tony Linthicum // Don't forward any -g arguments to assembly steps. 31309631939f82c0eaa6fb3936a0ce58a41adfbc9011Tony Linthicum if (isa<AssembleJobAction>(JA) && 31319631939f82c0eaa6fb3936a0ce58a41adfbc9011Tony Linthicum A->getOption().matches(options::OPT_g_Group)) 31329631939f82c0eaa6fb3936a0ce58a41adfbc9011Tony Linthicum continue; 31339631939f82c0eaa6fb3936a0ce58a41adfbc9011Tony Linthicum 31349631939f82c0eaa6fb3936a0ce58a41adfbc9011Tony Linthicum // It is unfortunate that we have to claim here, as this means 31359631939f82c0eaa6fb3936a0ce58a41adfbc9011Tony Linthicum // we will basically never report anything interesting for 31369631939f82c0eaa6fb3936a0ce58a41adfbc9011Tony Linthicum // platforms using a generic gcc, even if we are just using gcc 31379631939f82c0eaa6fb3936a0ce58a41adfbc9011Tony Linthicum // to get to the assembler. 31389631939f82c0eaa6fb3936a0ce58a41adfbc9011Tony Linthicum A->claim(); 31399631939f82c0eaa6fb3936a0ce58a41adfbc9011Tony Linthicum A->render(Args, CmdArgs); 31409631939f82c0eaa6fb3936a0ce58a41adfbc9011Tony Linthicum } 31419631939f82c0eaa6fb3936a0ce58a41adfbc9011Tony Linthicum } 31429631939f82c0eaa6fb3936a0ce58a41adfbc9011Tony Linthicum 31439631939f82c0eaa6fb3936a0ce58a41adfbc9011Tony Linthicum RenderExtraToolArgs(JA, CmdArgs); 31449631939f82c0eaa6fb3936a0ce58a41adfbc9011Tony Linthicum 31459631939f82c0eaa6fb3936a0ce58a41adfbc9011Tony Linthicum // Add Arch Information 31469631939f82c0eaa6fb3936a0ce58a41adfbc9011Tony Linthicum Arg *A; 314743115d4904431917ef6852ee089a8520b9940ba5Sebastian Pop if ((A = getLastHexagonArchArg(Args))) { 314843115d4904431917ef6852ee089a8520b9940ba5Sebastian Pop if (A->getOption().matches(options::OPT_m_Joined)) 314943115d4904431917ef6852ee089a8520b9940ba5Sebastian Pop A->render(Args, CmdArgs); 31509631939f82c0eaa6fb3936a0ce58a41adfbc9011Tony Linthicum else 315143115d4904431917ef6852ee089a8520b9940ba5Sebastian Pop CmdArgs.push_back (Args.MakeArgString("-m" + getHexagonTargetCPU(Args))); 31529631939f82c0eaa6fb3936a0ce58a41adfbc9011Tony Linthicum } 315343115d4904431917ef6852ee089a8520b9940ba5Sebastian Pop else { 315443115d4904431917ef6852ee089a8520b9940ba5Sebastian Pop CmdArgs.push_back (Args.MakeArgString("-m" + getHexagonTargetCPU(Args))); 315543115d4904431917ef6852ee089a8520b9940ba5Sebastian Pop } 315643115d4904431917ef6852ee089a8520b9940ba5Sebastian Pop 31579631939f82c0eaa6fb3936a0ce58a41adfbc9011Tony Linthicum CmdArgs.push_back("-mqdsp6-compat"); 31589631939f82c0eaa6fb3936a0ce58a41adfbc9011Tony Linthicum 31599631939f82c0eaa6fb3936a0ce58a41adfbc9011Tony Linthicum const char *GCCName; 31609631939f82c0eaa6fb3936a0ce58a41adfbc9011Tony Linthicum if (C.getDriver().CCCIsCXX) 31619631939f82c0eaa6fb3936a0ce58a41adfbc9011Tony Linthicum GCCName = "hexagon-g++"; 31629631939f82c0eaa6fb3936a0ce58a41adfbc9011Tony Linthicum else 31639631939f82c0eaa6fb3936a0ce58a41adfbc9011Tony Linthicum GCCName = "hexagon-gcc"; 31649631939f82c0eaa6fb3936a0ce58a41adfbc9011Tony Linthicum const char *Exec = 31659631939f82c0eaa6fb3936a0ce58a41adfbc9011Tony Linthicum Args.MakeArgString(getToolChain().GetProgramPath(GCCName)); 31669631939f82c0eaa6fb3936a0ce58a41adfbc9011Tony Linthicum 31679631939f82c0eaa6fb3936a0ce58a41adfbc9011Tony Linthicum if (Output.isFilename()) { 31689631939f82c0eaa6fb3936a0ce58a41adfbc9011Tony Linthicum CmdArgs.push_back("-o"); 31699631939f82c0eaa6fb3936a0ce58a41adfbc9011Tony Linthicum CmdArgs.push_back(Output.getFilename()); 31709631939f82c0eaa6fb3936a0ce58a41adfbc9011Tony Linthicum } 31719631939f82c0eaa6fb3936a0ce58a41adfbc9011Tony Linthicum 31729631939f82c0eaa6fb3936a0ce58a41adfbc9011Tony Linthicum for (InputInfoList::const_iterator 31739631939f82c0eaa6fb3936a0ce58a41adfbc9011Tony Linthicum it = Inputs.begin(), ie = Inputs.end(); it != ie; ++it) { 31749631939f82c0eaa6fb3936a0ce58a41adfbc9011Tony Linthicum const InputInfo &II = *it; 31759631939f82c0eaa6fb3936a0ce58a41adfbc9011Tony Linthicum 31769631939f82c0eaa6fb3936a0ce58a41adfbc9011Tony Linthicum // Don't try to pass LLVM or AST inputs to a generic gcc. 31779631939f82c0eaa6fb3936a0ce58a41adfbc9011Tony Linthicum if (II.getType() == types::TY_LLVM_IR || II.getType() == types::TY_LTO_IR || 31789631939f82c0eaa6fb3936a0ce58a41adfbc9011Tony Linthicum II.getType() == types::TY_LLVM_BC || II.getType() == types::TY_LTO_BC) 31799631939f82c0eaa6fb3936a0ce58a41adfbc9011Tony Linthicum D.Diag(clang::diag::err_drv_no_linker_llvm_support) 31809631939f82c0eaa6fb3936a0ce58a41adfbc9011Tony Linthicum << getToolChain().getTripleString(); 31819631939f82c0eaa6fb3936a0ce58a41adfbc9011Tony Linthicum else if (II.getType() == types::TY_AST) 31829631939f82c0eaa6fb3936a0ce58a41adfbc9011Tony Linthicum D.Diag(clang::diag::err_drv_no_ast_support) 31839631939f82c0eaa6fb3936a0ce58a41adfbc9011Tony Linthicum << getToolChain().getTripleString(); 31849631939f82c0eaa6fb3936a0ce58a41adfbc9011Tony Linthicum 31859631939f82c0eaa6fb3936a0ce58a41adfbc9011Tony Linthicum if (II.isFilename()) 31869631939f82c0eaa6fb3936a0ce58a41adfbc9011Tony Linthicum CmdArgs.push_back(II.getFilename()); 31879631939f82c0eaa6fb3936a0ce58a41adfbc9011Tony Linthicum else 31889631939f82c0eaa6fb3936a0ce58a41adfbc9011Tony Linthicum // Don't render as input, we need gcc to do the translations. FIXME: Pranav: What is this ? 31899631939f82c0eaa6fb3936a0ce58a41adfbc9011Tony Linthicum II.getInputArg().render(Args, CmdArgs); 31909631939f82c0eaa6fb3936a0ce58a41adfbc9011Tony Linthicum } 31919631939f82c0eaa6fb3936a0ce58a41adfbc9011Tony Linthicum C.addCommand(new Command(JA, *this, Exec, CmdArgs)); 31929631939f82c0eaa6fb3936a0ce58a41adfbc9011Tony Linthicum 31939631939f82c0eaa6fb3936a0ce58a41adfbc9011Tony Linthicum} 31949631939f82c0eaa6fb3936a0ce58a41adfbc9011Tony Linthicum// Hexagon tools end. 31959631939f82c0eaa6fb3936a0ce58a41adfbc9011Tony Linthicum 31969631939f82c0eaa6fb3936a0ce58a41adfbc9011Tony Linthicum 319740f1265ebd42ece3e7f7917319b56012e8e2bce2Daniel Dunbarconst char *darwin::CC1::getCC1Name(types::ID Type) const { 319840f1265ebd42ece3e7f7917319b56012e8e2bce2Daniel Dunbar switch (Type) { 319940f1265ebd42ece3e7f7917319b56012e8e2bce2Daniel Dunbar default: 3200b219cfc4d75f0a03630b7c4509ef791b7e97b2c8David Blaikie llvm_unreachable("Unexpected type for Darwin CC1 tool."); 320140f1265ebd42ece3e7f7917319b56012e8e2bce2Daniel Dunbar case types::TY_Asm: 320240f1265ebd42ece3e7f7917319b56012e8e2bce2Daniel Dunbar case types::TY_C: case types::TY_CHeader: 320340f1265ebd42ece3e7f7917319b56012e8e2bce2Daniel Dunbar case types::TY_PP_C: case types::TY_PP_CHeader: 320440f1265ebd42ece3e7f7917319b56012e8e2bce2Daniel Dunbar return "cc1"; 320540f1265ebd42ece3e7f7917319b56012e8e2bce2Daniel Dunbar case types::TY_ObjC: case types::TY_ObjCHeader: 3206cc52a0688f46cd04dd6b4670b304cbe82e3018c0Nico Weber case types::TY_PP_ObjC: case types::TY_PP_ObjC_Alias: 3207cc52a0688f46cd04dd6b4670b304cbe82e3018c0Nico Weber case types::TY_PP_ObjCHeader: 320840f1265ebd42ece3e7f7917319b56012e8e2bce2Daniel Dunbar return "cc1obj"; 320940f1265ebd42ece3e7f7917319b56012e8e2bce2Daniel Dunbar case types::TY_CXX: case types::TY_CXXHeader: 321040f1265ebd42ece3e7f7917319b56012e8e2bce2Daniel Dunbar case types::TY_PP_CXX: case types::TY_PP_CXXHeader: 321140f1265ebd42ece3e7f7917319b56012e8e2bce2Daniel Dunbar return "cc1plus"; 321240f1265ebd42ece3e7f7917319b56012e8e2bce2Daniel Dunbar case types::TY_ObjCXX: case types::TY_ObjCXXHeader: 3213cc52a0688f46cd04dd6b4670b304cbe82e3018c0Nico Weber case types::TY_PP_ObjCXX: case types::TY_PP_ObjCXX_Alias: 3214cc52a0688f46cd04dd6b4670b304cbe82e3018c0Nico Weber case types::TY_PP_ObjCXXHeader: 321540f1265ebd42ece3e7f7917319b56012e8e2bce2Daniel Dunbar return "cc1objplus"; 321640f1265ebd42ece3e7f7917319b56012e8e2bce2Daniel Dunbar } 321740f1265ebd42ece3e7f7917319b56012e8e2bce2Daniel Dunbar} 321840f1265ebd42ece3e7f7917319b56012e8e2bce2Daniel Dunbar 321999ba9e3bd70671f3441fb974895f226a83ce0e66David Blaikievoid darwin::CC1::anchor() {} 322099ba9e3bd70671f3441fb974895f226a83ce0e66David Blaikie 3221c21c485b4fb58ef5d55cf3e523263dd824a2ace4Daniel Dunbarconst char *darwin::CC1::getBaseInputName(const ArgList &Args, 3222a5a7bd0de7b6b80212095195a055a4a43f21d4b2Daniel Dunbar const InputInfoList &Inputs) { 3223472ccff00cdbcd095c3ba933b9e3f202719f118fMichael J. Spencer return Args.MakeArgString( 3224472ccff00cdbcd095c3ba933b9e3f202719f118fMichael J. Spencer llvm::sys::path::filename(Inputs[0].getBaseInput())); 3225a3ec60e0cf2a1916f479288998d31bd980b1a306Daniel Dunbar} 3226a3ec60e0cf2a1916f479288998d31bd980b1a306Daniel Dunbar 3227c21c485b4fb58ef5d55cf3e523263dd824a2ace4Daniel Dunbarconst char *darwin::CC1::getBaseInputStem(const ArgList &Args, 3228a5a7bd0de7b6b80212095195a055a4a43f21d4b2Daniel Dunbar const InputInfoList &Inputs) { 3229a3ec60e0cf2a1916f479288998d31bd980b1a306Daniel Dunbar const char *Str = getBaseInputName(Args, Inputs); 3230a3ec60e0cf2a1916f479288998d31bd980b1a306Daniel Dunbar 3231657ca6683d754c903026221a3aa3aa9cedb7556fChris Lattner if (const char *End = strrchr(Str, '.')) 3232881376467c46c5c6cc16fa6790271c2c22e1d4f1Daniel Dunbar return Args.MakeArgString(std::string(Str, End)); 3233a3ec60e0cf2a1916f479288998d31bd980b1a306Daniel Dunbar 3234a3ec60e0cf2a1916f479288998d31bd980b1a306Daniel Dunbar return Str; 3235a3ec60e0cf2a1916f479288998d31bd980b1a306Daniel Dunbar} 3236a3ec60e0cf2a1916f479288998d31bd980b1a306Daniel Dunbar 3237a3ec60e0cf2a1916f479288998d31bd980b1a306Daniel Dunbarconst char * 3238c21c485b4fb58ef5d55cf3e523263dd824a2ace4Daniel Dunbardarwin::CC1::getDependencyFileName(const ArgList &Args, 3239a5a7bd0de7b6b80212095195a055a4a43f21d4b2Daniel Dunbar const InputInfoList &Inputs) { 3240a3ec60e0cf2a1916f479288998d31bd980b1a306Daniel Dunbar // FIXME: Think about this more. 3241a3ec60e0cf2a1916f479288998d31bd980b1a306Daniel Dunbar std::string Res; 3242a3ec60e0cf2a1916f479288998d31bd980b1a306Daniel Dunbar 3243a3ec60e0cf2a1916f479288998d31bd980b1a306Daniel Dunbar if (Arg *OutputOpt = Args.getLastArg(options::OPT_o)) { 3244a3ec60e0cf2a1916f479288998d31bd980b1a306Daniel Dunbar std::string Str(OutputOpt->getValue(Args)); 3245a3ec60e0cf2a1916f479288998d31bd980b1a306Daniel Dunbar Res = Str.substr(0, Str.rfind('.')); 32463060178ad9df29789505c1e6debcfc80a3a13587Chad Rosier } else { 3247a5a7bd0de7b6b80212095195a055a4a43f21d4b2Daniel Dunbar Res = darwin::CC1::getBaseInputStem(Args, Inputs); 32483060178ad9df29789505c1e6debcfc80a3a13587Chad Rosier } 3249881376467c46c5c6cc16fa6790271c2c22e1d4f1Daniel Dunbar return Args.MakeArgString(Res + ".d"); 3250a3ec60e0cf2a1916f479288998d31bd980b1a306Daniel Dunbar} 3251a3ec60e0cf2a1916f479288998d31bd980b1a306Daniel Dunbar 3252285f9a284704c07cd50e4597408d5f93518cd7c3Chad Rosiervoid darwin::CC1::RemoveCC1UnsupportedArgs(ArgStringList &CmdArgs) const { 325388b7cf00fcb582728c642da3927c59468efaf926Eric Christopher for (ArgStringList::iterator it = CmdArgs.begin(), ie = CmdArgs.end(); 3254285f9a284704c07cd50e4597408d5f93518cd7c3Chad Rosier it != ie;) { 32558722a5d48340659c98c79af820b9088a64ef0303Chad Rosier 32568722a5d48340659c98c79af820b9088a64ef0303Chad Rosier StringRef Option = *it; 3257807179763b87a24de26b3c89e7ae9e898bab420cChad Rosier bool RemoveOption = false; 325804225c1409d1cc9fe0aca758ab0b6f1d213ce267Chad Rosier 32592872c8d5465623c1207b17873f228f5d96038d5eBob Wilson // Erase both -fmodule-cache-path and its argument. 32602872c8d5465623c1207b17873f228f5d96038d5eBob Wilson if (Option.equals("-fmodule-cache-path") && it+2 != ie) { 32612872c8d5465623c1207b17873f228f5d96038d5eBob Wilson it = CmdArgs.erase(it, it+2); 3262807179763b87a24de26b3c89e7ae9e898bab420cChad Rosier ie = CmdArgs.end(); 326304225c1409d1cc9fe0aca758ab0b6f1d213ce267Chad Rosier continue; 326404225c1409d1cc9fe0aca758ab0b6f1d213ce267Chad Rosier } 326504225c1409d1cc9fe0aca758ab0b6f1d213ce267Chad Rosier 32662872c8d5465623c1207b17873f228f5d96038d5eBob Wilson // Remove unsupported -f options. 32672872c8d5465623c1207b17873f228f5d96038d5eBob Wilson if (Option.startswith("-f")) { 32682872c8d5465623c1207b17873f228f5d96038d5eBob Wilson // Remove -f/-fno- to reduce the number of cases. 32692872c8d5465623c1207b17873f228f5d96038d5eBob Wilson if (Option.startswith("-fno-")) 32702872c8d5465623c1207b17873f228f5d96038d5eBob Wilson Option = Option.substr(5); 32712872c8d5465623c1207b17873f228f5d96038d5eBob Wilson else 32722872c8d5465623c1207b17873f228f5d96038d5eBob Wilson Option = Option.substr(2); 32732872c8d5465623c1207b17873f228f5d96038d5eBob Wilson RemoveOption = llvm::StringSwitch<bool>(Option) 32742872c8d5465623c1207b17873f228f5d96038d5eBob Wilson .Case("altivec", true) 32752872c8d5465623c1207b17873f228f5d96038d5eBob Wilson .Case("modules", true) 32762872c8d5465623c1207b17873f228f5d96038d5eBob Wilson .Case("diagnostics-show-note-include-stack", true) 32772872c8d5465623c1207b17873f228f5d96038d5eBob Wilson .Default(false); 32782872c8d5465623c1207b17873f228f5d96038d5eBob Wilson } 32792872c8d5465623c1207b17873f228f5d96038d5eBob Wilson 3280807179763b87a24de26b3c89e7ae9e898bab420cChad Rosier // Handle machine specific options. 3281807179763b87a24de26b3c89e7ae9e898bab420cChad Rosier if (Option.startswith("-m")) { 3282807179763b87a24de26b3c89e7ae9e898bab420cChad Rosier RemoveOption = llvm::StringSwitch<bool>(Option) 3283807179763b87a24de26b3c89e7ae9e898bab420cChad Rosier .Case("-mthumb", true) 3284807179763b87a24de26b3c89e7ae9e898bab420cChad Rosier .Case("-mno-thumb", true) 3285807179763b87a24de26b3c89e7ae9e898bab420cChad Rosier .Case("-mno-fused-madd", true) 3286807179763b87a24de26b3c89e7ae9e898bab420cChad Rosier .Case("-mlong-branch", true) 3287807179763b87a24de26b3c89e7ae9e898bab420cChad Rosier .Case("-mlongcall", true) 3288807179763b87a24de26b3c89e7ae9e898bab420cChad Rosier .Case("-mcpu=G4", true) 3289807179763b87a24de26b3c89e7ae9e898bab420cChad Rosier .Case("-mcpu=G5", true) 3290807179763b87a24de26b3c89e7ae9e898bab420cChad Rosier .Default(false); 3291807179763b87a24de26b3c89e7ae9e898bab420cChad Rosier } 3292807179763b87a24de26b3c89e7ae9e898bab420cChad Rosier 3293807179763b87a24de26b3c89e7ae9e898bab420cChad Rosier // Handle warning options. 3294807179763b87a24de26b3c89e7ae9e898bab420cChad Rosier if (Option.startswith("-W")) { 3295807179763b87a24de26b3c89e7ae9e898bab420cChad Rosier // Remove -W/-Wno- to reduce the number of cases. 3296807179763b87a24de26b3c89e7ae9e898bab420cChad Rosier if (Option.startswith("-Wno-")) 3297807179763b87a24de26b3c89e7ae9e898bab420cChad Rosier Option = Option.substr(5); 3298807179763b87a24de26b3c89e7ae9e898bab420cChad Rosier else 3299807179763b87a24de26b3c89e7ae9e898bab420cChad Rosier Option = Option.substr(2); 3300807179763b87a24de26b3c89e7ae9e898bab420cChad Rosier 3301807179763b87a24de26b3c89e7ae9e898bab420cChad Rosier RemoveOption = llvm::StringSwitch<bool>(Option) 3302807179763b87a24de26b3c89e7ae9e898bab420cChad Rosier .Case("address-of-temporary", true) 3303807179763b87a24de26b3c89e7ae9e898bab420cChad Rosier .Case("ambiguous-member-template", true) 3304807179763b87a24de26b3c89e7ae9e898bab420cChad Rosier .Case("analyzer-incompatible-plugin", true) 3305807179763b87a24de26b3c89e7ae9e898bab420cChad Rosier .Case("array-bounds", true) 3306807179763b87a24de26b3c89e7ae9e898bab420cChad Rosier .Case("array-bounds-pointer-arithmetic", true) 3307807179763b87a24de26b3c89e7ae9e898bab420cChad Rosier .Case("bind-to-temporary-copy", true) 3308807179763b87a24de26b3c89e7ae9e898bab420cChad Rosier .Case("bitwise-op-parentheses", true) 3309807179763b87a24de26b3c89e7ae9e898bab420cChad Rosier .Case("bool-conversions", true) 3310807179763b87a24de26b3c89e7ae9e898bab420cChad Rosier .Case("builtin-macro-redefined", true) 3311807179763b87a24de26b3c89e7ae9e898bab420cChad Rosier .Case("c++-hex-floats", true) 3312807179763b87a24de26b3c89e7ae9e898bab420cChad Rosier .Case("c++0x-compat", true) 3313807179763b87a24de26b3c89e7ae9e898bab420cChad Rosier .Case("c++0x-extensions", true) 3314807179763b87a24de26b3c89e7ae9e898bab420cChad Rosier .Case("c++0x-narrowing", true) 3315575fdda948e07c1afc6fcdced9e5cf0b7905a54eRichard Smith .Case("c++11-compat", true) 3316575fdda948e07c1afc6fcdced9e5cf0b7905a54eRichard Smith .Case("c++11-extensions", true) 3317575fdda948e07c1afc6fcdced9e5cf0b7905a54eRichard Smith .Case("c++11-narrowing", true) 3318807179763b87a24de26b3c89e7ae9e898bab420cChad Rosier .Case("conditional-uninitialized", true) 3319807179763b87a24de26b3c89e7ae9e898bab420cChad Rosier .Case("constant-conversion", true) 332095187bdd5c955c8edf3527eae41f1e4f80377f27David Blaikie .Case("conversion-null", true) 3321807179763b87a24de26b3c89e7ae9e898bab420cChad Rosier .Case("CFString-literal", true) 3322807179763b87a24de26b3c89e7ae9e898bab420cChad Rosier .Case("constant-logical-operand", true) 3323807179763b87a24de26b3c89e7ae9e898bab420cChad Rosier .Case("custom-atomic-properties", true) 3324807179763b87a24de26b3c89e7ae9e898bab420cChad Rosier .Case("default-arg-special-member", true) 3325807179763b87a24de26b3c89e7ae9e898bab420cChad Rosier .Case("delegating-ctor-cycles", true) 3326807179763b87a24de26b3c89e7ae9e898bab420cChad Rosier .Case("delete-non-virtual-dtor", true) 3327807179763b87a24de26b3c89e7ae9e898bab420cChad Rosier .Case("deprecated-implementations", true) 3328807179763b87a24de26b3c89e7ae9e898bab420cChad Rosier .Case("deprecated-writable-strings", true) 3329807179763b87a24de26b3c89e7ae9e898bab420cChad Rosier .Case("distributed-object-modifiers", true) 3330807179763b87a24de26b3c89e7ae9e898bab420cChad Rosier .Case("duplicate-method-arg", true) 3331807179763b87a24de26b3c89e7ae9e898bab420cChad Rosier .Case("dynamic-class-memaccess", true) 3332807179763b87a24de26b3c89e7ae9e898bab420cChad Rosier .Case("enum-compare", true) 3333807179763b87a24de26b3c89e7ae9e898bab420cChad Rosier .Case("exit-time-destructors", true) 3334807179763b87a24de26b3c89e7ae9e898bab420cChad Rosier .Case("gnu", true) 3335807179763b87a24de26b3c89e7ae9e898bab420cChad Rosier .Case("gnu-designator", true) 3336807179763b87a24de26b3c89e7ae9e898bab420cChad Rosier .Case("header-hygiene", true) 3337807179763b87a24de26b3c89e7ae9e898bab420cChad Rosier .Case("idiomatic-parentheses", true) 3338807179763b87a24de26b3c89e7ae9e898bab420cChad Rosier .Case("ignored-qualifiers", true) 3339807179763b87a24de26b3c89e7ae9e898bab420cChad Rosier .Case("implicit-atomic-properties", true) 3340807179763b87a24de26b3c89e7ae9e898bab420cChad Rosier .Case("incompatible-pointer-types", true) 3341807179763b87a24de26b3c89e7ae9e898bab420cChad Rosier .Case("incomplete-implementation", true) 3342807179763b87a24de26b3c89e7ae9e898bab420cChad Rosier .Case("initializer-overrides", true) 3343807179763b87a24de26b3c89e7ae9e898bab420cChad Rosier .Case("invalid-noreturn", true) 3344807179763b87a24de26b3c89e7ae9e898bab420cChad Rosier .Case("invalid-token-paste", true) 334508f35a79f7506d6ac0349764aa4d6021a1e1c6e2Ivan Krasin .Case("language-extension-token", true) 3346807179763b87a24de26b3c89e7ae9e898bab420cChad Rosier .Case("literal-conversion", true) 3347807179763b87a24de26b3c89e7ae9e898bab420cChad Rosier .Case("literal-range", true) 3348807179763b87a24de26b3c89e7ae9e898bab420cChad Rosier .Case("local-type-template-args", true) 3349807179763b87a24de26b3c89e7ae9e898bab420cChad Rosier .Case("logical-op-parentheses", true) 3350807179763b87a24de26b3c89e7ae9e898bab420cChad Rosier .Case("method-signatures", true) 3351807179763b87a24de26b3c89e7ae9e898bab420cChad Rosier .Case("microsoft", true) 3352807179763b87a24de26b3c89e7ae9e898bab420cChad Rosier .Case("mismatched-tags", true) 3353807179763b87a24de26b3c89e7ae9e898bab420cChad Rosier .Case("missing-method-return-type", true) 3354807179763b87a24de26b3c89e7ae9e898bab420cChad Rosier .Case("non-pod-varargs", true) 3355807179763b87a24de26b3c89e7ae9e898bab420cChad Rosier .Case("nonfragile-abi2", true) 3356807179763b87a24de26b3c89e7ae9e898bab420cChad Rosier .Case("null-arithmetic", true) 3357807179763b87a24de26b3c89e7ae9e898bab420cChad Rosier .Case("null-dereference", true) 3358807179763b87a24de26b3c89e7ae9e898bab420cChad Rosier .Case("out-of-line-declaration", true) 3359807179763b87a24de26b3c89e7ae9e898bab420cChad Rosier .Case("overriding-method-mismatch", true) 3360807179763b87a24de26b3c89e7ae9e898bab420cChad Rosier .Case("readonly-setter-attrs", true) 3361807179763b87a24de26b3c89e7ae9e898bab420cChad Rosier .Case("return-stack-address", true) 3362807179763b87a24de26b3c89e7ae9e898bab420cChad Rosier .Case("self-assign", true) 3363807179763b87a24de26b3c89e7ae9e898bab420cChad Rosier .Case("semicolon-before-method-body", true) 3364807179763b87a24de26b3c89e7ae9e898bab420cChad Rosier .Case("sentinel", true) 3365807179763b87a24de26b3c89e7ae9e898bab420cChad Rosier .Case("shift-overflow", true) 3366807179763b87a24de26b3c89e7ae9e898bab420cChad Rosier .Case("shift-sign-overflow", true) 3367807179763b87a24de26b3c89e7ae9e898bab420cChad Rosier .Case("sign-conversion", true) 3368807179763b87a24de26b3c89e7ae9e898bab420cChad Rosier .Case("sizeof-array-argument", true) 3369807179763b87a24de26b3c89e7ae9e898bab420cChad Rosier .Case("sizeof-pointer-memaccess", true) 3370807179763b87a24de26b3c89e7ae9e898bab420cChad Rosier .Case("string-compare", true) 3371807179763b87a24de26b3c89e7ae9e898bab420cChad Rosier .Case("super-class-method-mismatch", true) 3372807179763b87a24de26b3c89e7ae9e898bab420cChad Rosier .Case("tautological-compare", true) 3373807179763b87a24de26b3c89e7ae9e898bab420cChad Rosier .Case("typedef-redefinition", true) 3374807179763b87a24de26b3c89e7ae9e898bab420cChad Rosier .Case("typename-missing", true) 3375807179763b87a24de26b3c89e7ae9e898bab420cChad Rosier .Case("undefined-reinterpret-cast", true) 3376807179763b87a24de26b3c89e7ae9e898bab420cChad Rosier .Case("unknown-warning-option", true) 3377807179763b87a24de26b3c89e7ae9e898bab420cChad Rosier .Case("unnamed-type-template-args", true) 3378807179763b87a24de26b3c89e7ae9e898bab420cChad Rosier .Case("unneeded-internal-declaration", true) 3379807179763b87a24de26b3c89e7ae9e898bab420cChad Rosier .Case("unneeded-member-function", true) 3380807179763b87a24de26b3c89e7ae9e898bab420cChad Rosier .Case("unused-comparison", true) 3381807179763b87a24de26b3c89e7ae9e898bab420cChad Rosier .Case("unused-exception-parameter", true) 3382807179763b87a24de26b3c89e7ae9e898bab420cChad Rosier .Case("unused-member-function", true) 3383807179763b87a24de26b3c89e7ae9e898bab420cChad Rosier .Case("unused-result", true) 3384807179763b87a24de26b3c89e7ae9e898bab420cChad Rosier .Case("vector-conversions", true) 3385807179763b87a24de26b3c89e7ae9e898bab420cChad Rosier .Case("vla", true) 3386807179763b87a24de26b3c89e7ae9e898bab420cChad Rosier .Case("used-but-marked-unused", true) 3387807179763b87a24de26b3c89e7ae9e898bab420cChad Rosier .Case("weak-vtables", true) 3388807179763b87a24de26b3c89e7ae9e898bab420cChad Rosier .Default(false); 3389807179763b87a24de26b3c89e7ae9e898bab420cChad Rosier } // if (Option.startswith("-W")) 339004225c1409d1cc9fe0aca758ab0b6f1d213ce267Chad Rosier if (RemoveOption) { 3391285f9a284704c07cd50e4597408d5f93518cd7c3Chad Rosier it = CmdArgs.erase(it); 3392cc0de8c08128023544dd0c9c7ee67b105fed2985Chad Rosier ie = CmdArgs.end(); 33933060178ad9df29789505c1e6debcfc80a3a13587Chad Rosier } else { 3394285f9a284704c07cd50e4597408d5f93518cd7c3Chad Rosier ++it; 33953060178ad9df29789505c1e6debcfc80a3a13587Chad Rosier } 3396285f9a284704c07cd50e4597408d5f93518cd7c3Chad Rosier } 3397285f9a284704c07cd50e4597408d5f93518cd7c3Chad Rosier} 3398285f9a284704c07cd50e4597408d5f93518cd7c3Chad Rosier 3399c21c485b4fb58ef5d55cf3e523263dd824a2ace4Daniel Dunbarvoid darwin::CC1::AddCC1Args(const ArgList &Args, 3400a3ec60e0cf2a1916f479288998d31bd980b1a306Daniel Dunbar ArgStringList &CmdArgs) const { 3401ee788e70fcd0adf76103b17c78ac658d4ea30c9bDaniel Dunbar const Driver &D = getToolChain().getDriver(); 3402e2fd66418eca3d70cf6b62087d745d0c5181db69Daniel Dunbar 3403e2fd66418eca3d70cf6b62087d745d0c5181db69Daniel Dunbar CheckCodeGenerationOptions(D, Args); 3404e2fd66418eca3d70cf6b62087d745d0c5181db69Daniel Dunbar 3405a3ec60e0cf2a1916f479288998d31bd980b1a306Daniel Dunbar // Derived from cc1 spec. 3406a3ec60e0cf2a1916f479288998d31bd980b1a306Daniel Dunbar if (!Args.hasArg(options::OPT_mkernel) && !Args.hasArg(options::OPT_static) && 3407a3ec60e0cf2a1916f479288998d31bd980b1a306Daniel Dunbar !Args.hasArg(options::OPT_mdynamic_no_pic)) 3408a3ec60e0cf2a1916f479288998d31bd980b1a306Daniel Dunbar CmdArgs.push_back("-fPIC"); 3409a3ec60e0cf2a1916f479288998d31bd980b1a306Daniel Dunbar 34102ba91575905a54f712a7f64304e56002e4882499Daniel Dunbar if (getToolChain().getTriple().getArch() == llvm::Triple::arm || 34112ba91575905a54f712a7f64304e56002e4882499Daniel Dunbar getToolChain().getTriple().getArch() == llvm::Triple::thumb) { 34122ba91575905a54f712a7f64304e56002e4882499Daniel Dunbar if (!Args.hasArg(options::OPT_fbuiltin_strcat)) 34132ba91575905a54f712a7f64304e56002e4882499Daniel Dunbar CmdArgs.push_back("-fno-builtin-strcat"); 34142ba91575905a54f712a7f64304e56002e4882499Daniel Dunbar if (!Args.hasArg(options::OPT_fbuiltin_strcpy)) 34152ba91575905a54f712a7f64304e56002e4882499Daniel Dunbar CmdArgs.push_back("-fno-builtin-strcpy"); 34162ba91575905a54f712a7f64304e56002e4882499Daniel Dunbar } 34172ba91575905a54f712a7f64304e56002e4882499Daniel Dunbar 3418a3ec60e0cf2a1916f479288998d31bd980b1a306Daniel Dunbar if (Args.hasArg(options::OPT_g_Flag) && 3419a3ec60e0cf2a1916f479288998d31bd980b1a306Daniel Dunbar !Args.hasArg(options::OPT_fno_eliminate_unused_debug_symbols)) 3420a3ec60e0cf2a1916f479288998d31bd980b1a306Daniel Dunbar CmdArgs.push_back("-feliminate-unused-debug-symbols"); 3421a3ec60e0cf2a1916f479288998d31bd980b1a306Daniel Dunbar} 3422a3ec60e0cf2a1916f479288998d31bd980b1a306Daniel Dunbar 3423a3ec60e0cf2a1916f479288998d31bd980b1a306Daniel Dunbarvoid darwin::CC1::AddCC1OptionsArgs(const ArgList &Args, ArgStringList &CmdArgs, 3424a3ec60e0cf2a1916f479288998d31bd980b1a306Daniel Dunbar const InputInfoList &Inputs, 3425a3ec60e0cf2a1916f479288998d31bd980b1a306Daniel Dunbar const ArgStringList &OutputArgs) const { 3426ee788e70fcd0adf76103b17c78ac658d4ea30c9bDaniel Dunbar const Driver &D = getToolChain().getDriver(); 3427a3ec60e0cf2a1916f479288998d31bd980b1a306Daniel Dunbar 3428a3ec60e0cf2a1916f479288998d31bd980b1a306Daniel Dunbar // Derived from cc1_options spec. 3429a3ec60e0cf2a1916f479288998d31bd980b1a306Daniel Dunbar if (Args.hasArg(options::OPT_fast) || 3430a3ec60e0cf2a1916f479288998d31bd980b1a306Daniel Dunbar Args.hasArg(options::OPT_fastf) || 3431a3ec60e0cf2a1916f479288998d31bd980b1a306Daniel Dunbar Args.hasArg(options::OPT_fastcp)) 3432a3ec60e0cf2a1916f479288998d31bd980b1a306Daniel Dunbar CmdArgs.push_back("-O3"); 3433c21c485b4fb58ef5d55cf3e523263dd824a2ace4Daniel Dunbar 3434a3ec60e0cf2a1916f479288998d31bd980b1a306Daniel Dunbar if (Arg *A = Args.getLastArg(options::OPT_pg)) 3435a3ec60e0cf2a1916f479288998d31bd980b1a306Daniel Dunbar if (Args.hasArg(options::OPT_fomit_frame_pointer)) 34365f9e272e632e951b1efe824cd16acb4d96077930Chris Lattner D.Diag(diag::err_drv_argument_not_allowed_with) 3437a3ec60e0cf2a1916f479288998d31bd980b1a306Daniel Dunbar << A->getAsString(Args) << "-fomit-frame-pointer"; 3438a3ec60e0cf2a1916f479288998d31bd980b1a306Daniel Dunbar 3439a3ec60e0cf2a1916f479288998d31bd980b1a306Daniel Dunbar AddCC1Args(Args, CmdArgs); 3440a3ec60e0cf2a1916f479288998d31bd980b1a306Daniel Dunbar 3441a3ec60e0cf2a1916f479288998d31bd980b1a306Daniel Dunbar if (!Args.hasArg(options::OPT_Q)) 3442a3ec60e0cf2a1916f479288998d31bd980b1a306Daniel Dunbar CmdArgs.push_back("-quiet"); 3443a3ec60e0cf2a1916f479288998d31bd980b1a306Daniel Dunbar 3444a3ec60e0cf2a1916f479288998d31bd980b1a306Daniel Dunbar CmdArgs.push_back("-dumpbase"); 3445a5a7bd0de7b6b80212095195a055a4a43f21d4b2Daniel Dunbar CmdArgs.push_back(darwin::CC1::getBaseInputName(Args, Inputs)); 3446a3ec60e0cf2a1916f479288998d31bd980b1a306Daniel Dunbar 3447a3ec60e0cf2a1916f479288998d31bd980b1a306Daniel Dunbar Args.AddAllArgs(CmdArgs, options::OPT_d_Group); 3448a3ec60e0cf2a1916f479288998d31bd980b1a306Daniel Dunbar 3449a3ec60e0cf2a1916f479288998d31bd980b1a306Daniel Dunbar Args.AddAllArgs(CmdArgs, options::OPT_m_Group); 3450a3ec60e0cf2a1916f479288998d31bd980b1a306Daniel Dunbar Args.AddAllArgs(CmdArgs, options::OPT_a_Group); 3451a3ec60e0cf2a1916f479288998d31bd980b1a306Daniel Dunbar 3452a3ec60e0cf2a1916f479288998d31bd980b1a306Daniel Dunbar // FIXME: The goal is to use the user provided -o if that is our 3453a3ec60e0cf2a1916f479288998d31bd980b1a306Daniel Dunbar // final output, otherwise to drive from the original input 3454a3ec60e0cf2a1916f479288998d31bd980b1a306Daniel Dunbar // name. Find a clean way to go about this. 3455a3ec60e0cf2a1916f479288998d31bd980b1a306Daniel Dunbar if ((Args.hasArg(options::OPT_c) || Args.hasArg(options::OPT_S)) && 3456a3ec60e0cf2a1916f479288998d31bd980b1a306Daniel Dunbar Args.hasArg(options::OPT_o)) { 3457a3ec60e0cf2a1916f479288998d31bd980b1a306Daniel Dunbar Arg *OutputOpt = Args.getLastArg(options::OPT_o); 3458a3ec60e0cf2a1916f479288998d31bd980b1a306Daniel Dunbar CmdArgs.push_back("-auxbase-strip"); 3459a3ec60e0cf2a1916f479288998d31bd980b1a306Daniel Dunbar CmdArgs.push_back(OutputOpt->getValue(Args)); 3460a3ec60e0cf2a1916f479288998d31bd980b1a306Daniel Dunbar } else { 3461a3ec60e0cf2a1916f479288998d31bd980b1a306Daniel Dunbar CmdArgs.push_back("-auxbase"); 3462a5a7bd0de7b6b80212095195a055a4a43f21d4b2Daniel Dunbar CmdArgs.push_back(darwin::CC1::getBaseInputStem(Args, Inputs)); 3463a3ec60e0cf2a1916f479288998d31bd980b1a306Daniel Dunbar } 3464a3ec60e0cf2a1916f479288998d31bd980b1a306Daniel Dunbar 3465a3ec60e0cf2a1916f479288998d31bd980b1a306Daniel Dunbar Args.AddAllArgs(CmdArgs, options::OPT_g_Group); 3466a3ec60e0cf2a1916f479288998d31bd980b1a306Daniel Dunbar 3467a3ec60e0cf2a1916f479288998d31bd980b1a306Daniel Dunbar Args.AddAllArgs(CmdArgs, options::OPT_O); 3468a3ec60e0cf2a1916f479288998d31bd980b1a306Daniel Dunbar // FIXME: -Wall is getting some special treatment. Investigate. 3469a3ec60e0cf2a1916f479288998d31bd980b1a306Daniel Dunbar Args.AddAllArgs(CmdArgs, options::OPT_W_Group, options::OPT_pedantic_Group); 3470a3ec60e0cf2a1916f479288998d31bd980b1a306Daniel Dunbar Args.AddLastArg(CmdArgs, options::OPT_w); 3471c21c485b4fb58ef5d55cf3e523263dd824a2ace4Daniel Dunbar Args.AddAllArgs(CmdArgs, options::OPT_std_EQ, options::OPT_ansi, 3472a3ec60e0cf2a1916f479288998d31bd980b1a306Daniel Dunbar options::OPT_trigraphs); 3473a3ff202ee4fb21728e930d5d029ba4925129912cDaniel Dunbar if (!Args.getLastArg(options::OPT_std_EQ, options::OPT_ansi)) { 3474a3ff202ee4fb21728e930d5d029ba4925129912cDaniel Dunbar // Honor -std-default. 3475a3ff202ee4fb21728e930d5d029ba4925129912cDaniel Dunbar Args.AddAllArgsTranslated(CmdArgs, options::OPT_std_default_EQ, 3476a3ff202ee4fb21728e930d5d029ba4925129912cDaniel Dunbar "-std=", /*Joined=*/true); 3477a3ff202ee4fb21728e930d5d029ba4925129912cDaniel Dunbar } 3478a3ff202ee4fb21728e930d5d029ba4925129912cDaniel Dunbar 3479a3ec60e0cf2a1916f479288998d31bd980b1a306Daniel Dunbar if (Args.hasArg(options::OPT_v)) 3480a3ec60e0cf2a1916f479288998d31bd980b1a306Daniel Dunbar CmdArgs.push_back("-version"); 3481bbe8e3eff56ac1d79f3668d706536e3cebe28c18Daniel Dunbar if (Args.hasArg(options::OPT_pg) && 3482bbe8e3eff56ac1d79f3668d706536e3cebe28c18Daniel Dunbar getToolChain().SupportsProfiling()) 3483a3ec60e0cf2a1916f479288998d31bd980b1a306Daniel Dunbar CmdArgs.push_back("-p"); 3484a3ec60e0cf2a1916f479288998d31bd980b1a306Daniel Dunbar Args.AddLastArg(CmdArgs, options::OPT_p); 3485c21c485b4fb58ef5d55cf3e523263dd824a2ace4Daniel Dunbar 3486a3ec60e0cf2a1916f479288998d31bd980b1a306Daniel Dunbar // The driver treats -fsyntax-only specially. 34872ba91575905a54f712a7f64304e56002e4882499Daniel Dunbar if (getToolChain().getTriple().getArch() == llvm::Triple::arm || 34882ba91575905a54f712a7f64304e56002e4882499Daniel Dunbar getToolChain().getTriple().getArch() == llvm::Triple::thumb) { 34892ba91575905a54f712a7f64304e56002e4882499Daniel Dunbar // Removes -fbuiltin-str{cat,cpy}; these aren't recognized by cc1 but are 34902ba91575905a54f712a7f64304e56002e4882499Daniel Dunbar // used to inhibit the default -fno-builtin-str{cat,cpy}. 34912ba91575905a54f712a7f64304e56002e4882499Daniel Dunbar // 34922ba91575905a54f712a7f64304e56002e4882499Daniel Dunbar // FIXME: Should we grow a better way to deal with "removing" args? 3493cdd9686b890ebdc10039ae256ef4c9dfb5ebacb7Daniel Dunbar for (arg_iterator it = Args.filtered_begin(options::OPT_f_Group, 3494cdd9686b890ebdc10039ae256ef4c9dfb5ebacb7Daniel Dunbar options::OPT_fsyntax_only), 3495cdd9686b890ebdc10039ae256ef4c9dfb5ebacb7Daniel Dunbar ie = Args.filtered_end(); it != ie; ++it) { 34967e4953e5c60409007545288f14b430bd23d68570Daniel Dunbar if (!(*it)->getOption().matches(options::OPT_fbuiltin_strcat) && 34977e4953e5c60409007545288f14b430bd23d68570Daniel Dunbar !(*it)->getOption().matches(options::OPT_fbuiltin_strcpy)) { 34987e4953e5c60409007545288f14b430bd23d68570Daniel Dunbar (*it)->claim(); 34997e4953e5c60409007545288f14b430bd23d68570Daniel Dunbar (*it)->render(Args, CmdArgs); 35002ba91575905a54f712a7f64304e56002e4882499Daniel Dunbar } 35012ba91575905a54f712a7f64304e56002e4882499Daniel Dunbar } 35022ba91575905a54f712a7f64304e56002e4882499Daniel Dunbar } else 35032ba91575905a54f712a7f64304e56002e4882499Daniel Dunbar Args.AddAllArgs(CmdArgs, options::OPT_f_Group, options::OPT_fsyntax_only); 3504c21c485b4fb58ef5d55cf3e523263dd824a2ace4Daniel Dunbar 3505089f872fedb175f7569f24f1dba362ffbc403528Daniel Dunbar // Claim Clang only -f options, they aren't worth warning about. 3506089f872fedb175f7569f24f1dba362ffbc403528Daniel Dunbar Args.ClaimAllArgs(options::OPT_f_clang_Group); 3507089f872fedb175f7569f24f1dba362ffbc403528Daniel Dunbar 3508a3ec60e0cf2a1916f479288998d31bd980b1a306Daniel Dunbar Args.AddAllArgs(CmdArgs, options::OPT_undef); 3509a3ec60e0cf2a1916f479288998d31bd980b1a306Daniel Dunbar if (Args.hasArg(options::OPT_Qn)) 3510a3ec60e0cf2a1916f479288998d31bd980b1a306Daniel Dunbar CmdArgs.push_back("-fno-ident"); 3511c21c485b4fb58ef5d55cf3e523263dd824a2ace4Daniel Dunbar 3512a3ec60e0cf2a1916f479288998d31bd980b1a306Daniel Dunbar // FIXME: This isn't correct. 3513a3ec60e0cf2a1916f479288998d31bd980b1a306Daniel Dunbar //Args.AddLastArg(CmdArgs, options::OPT__help) 3514a3ec60e0cf2a1916f479288998d31bd980b1a306Daniel Dunbar //Args.AddLastArg(CmdArgs, options::OPT__targetHelp) 3515a3ec60e0cf2a1916f479288998d31bd980b1a306Daniel Dunbar 3516a3ec60e0cf2a1916f479288998d31bd980b1a306Daniel Dunbar CmdArgs.append(OutputArgs.begin(), OutputArgs.end()); 3517a3ec60e0cf2a1916f479288998d31bd980b1a306Daniel Dunbar 3518a3ec60e0cf2a1916f479288998d31bd980b1a306Daniel Dunbar // FIXME: Still don't get what is happening here. Investigate. 3519a3ec60e0cf2a1916f479288998d31bd980b1a306Daniel Dunbar Args.AddAllArgs(CmdArgs, options::OPT__param); 3520a3ec60e0cf2a1916f479288998d31bd980b1a306Daniel Dunbar 3521a3ec60e0cf2a1916f479288998d31bd980b1a306Daniel Dunbar if (Args.hasArg(options::OPT_fmudflap) || 3522a3ec60e0cf2a1916f479288998d31bd980b1a306Daniel Dunbar Args.hasArg(options::OPT_fmudflapth)) { 3523a3ec60e0cf2a1916f479288998d31bd980b1a306Daniel Dunbar CmdArgs.push_back("-fno-builtin"); 3524a3ec60e0cf2a1916f479288998d31bd980b1a306Daniel Dunbar CmdArgs.push_back("-fno-merge-constants"); 3525a3ec60e0cf2a1916f479288998d31bd980b1a306Daniel Dunbar } 3526c21c485b4fb58ef5d55cf3e523263dd824a2ace4Daniel Dunbar 3527a3ec60e0cf2a1916f479288998d31bd980b1a306Daniel Dunbar if (Args.hasArg(options::OPT_coverage)) { 3528a3ec60e0cf2a1916f479288998d31bd980b1a306Daniel Dunbar CmdArgs.push_back("-fprofile-arcs"); 3529a3ec60e0cf2a1916f479288998d31bd980b1a306Daniel Dunbar CmdArgs.push_back("-ftest-coverage"); 3530a3ec60e0cf2a1916f479288998d31bd980b1a306Daniel Dunbar } 3531a3ec60e0cf2a1916f479288998d31bd980b1a306Daniel Dunbar 3532a3ec60e0cf2a1916f479288998d31bd980b1a306Daniel Dunbar if (types::isCXX(Inputs[0].getType())) 3533a3ec60e0cf2a1916f479288998d31bd980b1a306Daniel Dunbar CmdArgs.push_back("-D__private_extern__=extern"); 3534a3ec60e0cf2a1916f479288998d31bd980b1a306Daniel Dunbar} 3535a3ec60e0cf2a1916f479288998d31bd980b1a306Daniel Dunbar 3536a3ec60e0cf2a1916f479288998d31bd980b1a306Daniel Dunbarvoid darwin::CC1::AddCPPOptionsArgs(const ArgList &Args, ArgStringList &CmdArgs, 3537a3ec60e0cf2a1916f479288998d31bd980b1a306Daniel Dunbar const InputInfoList &Inputs, 3538a3ec60e0cf2a1916f479288998d31bd980b1a306Daniel Dunbar const ArgStringList &OutputArgs) const { 3539a3ec60e0cf2a1916f479288998d31bd980b1a306Daniel Dunbar // Derived from cpp_options 3540a3ec60e0cf2a1916f479288998d31bd980b1a306Daniel Dunbar AddCPPUniqueOptionsArgs(Args, CmdArgs, Inputs); 3541c21c485b4fb58ef5d55cf3e523263dd824a2ace4Daniel Dunbar 3542a3ec60e0cf2a1916f479288998d31bd980b1a306Daniel Dunbar CmdArgs.append(OutputArgs.begin(), OutputArgs.end()); 3543a3ec60e0cf2a1916f479288998d31bd980b1a306Daniel Dunbar 3544a3ec60e0cf2a1916f479288998d31bd980b1a306Daniel Dunbar AddCC1Args(Args, CmdArgs); 3545a3ec60e0cf2a1916f479288998d31bd980b1a306Daniel Dunbar 3546a3ec60e0cf2a1916f479288998d31bd980b1a306Daniel Dunbar // NOTE: The code below has some commonality with cpp_options, but 3547a3ec60e0cf2a1916f479288998d31bd980b1a306Daniel Dunbar // in classic gcc style ends up sending things in different 3548a3ec60e0cf2a1916f479288998d31bd980b1a306Daniel Dunbar // orders. This may be a good merge candidate once we drop pedantic 3549a3ec60e0cf2a1916f479288998d31bd980b1a306Daniel Dunbar // compatibility. 3550a3ec60e0cf2a1916f479288998d31bd980b1a306Daniel Dunbar 3551a3ec60e0cf2a1916f479288998d31bd980b1a306Daniel Dunbar Args.AddAllArgs(CmdArgs, options::OPT_m_Group); 3552c21c485b4fb58ef5d55cf3e523263dd824a2ace4Daniel Dunbar Args.AddAllArgs(CmdArgs, options::OPT_std_EQ, options::OPT_ansi, 3553a3ec60e0cf2a1916f479288998d31bd980b1a306Daniel Dunbar options::OPT_trigraphs); 3554a3ff202ee4fb21728e930d5d029ba4925129912cDaniel Dunbar if (!Args.getLastArg(options::OPT_std_EQ, options::OPT_ansi)) { 3555a3ff202ee4fb21728e930d5d029ba4925129912cDaniel Dunbar // Honor -std-default. 3556a3ff202ee4fb21728e930d5d029ba4925129912cDaniel Dunbar Args.AddAllArgsTranslated(CmdArgs, options::OPT_std_default_EQ, 3557a3ff202ee4fb21728e930d5d029ba4925129912cDaniel Dunbar "-std=", /*Joined=*/true); 3558a3ff202ee4fb21728e930d5d029ba4925129912cDaniel Dunbar } 3559a3ec60e0cf2a1916f479288998d31bd980b1a306Daniel Dunbar Args.AddAllArgs(CmdArgs, options::OPT_W_Group, options::OPT_pedantic_Group); 3560a3ec60e0cf2a1916f479288998d31bd980b1a306Daniel Dunbar Args.AddLastArg(CmdArgs, options::OPT_w); 3561c21c485b4fb58ef5d55cf3e523263dd824a2ace4Daniel Dunbar 3562a3ec60e0cf2a1916f479288998d31bd980b1a306Daniel Dunbar // The driver treats -fsyntax-only specially. 3563a3ec60e0cf2a1916f479288998d31bd980b1a306Daniel Dunbar Args.AddAllArgs(CmdArgs, options::OPT_f_Group, options::OPT_fsyntax_only); 3564a3ec60e0cf2a1916f479288998d31bd980b1a306Daniel Dunbar 3565089f872fedb175f7569f24f1dba362ffbc403528Daniel Dunbar // Claim Clang only -f options, they aren't worth warning about. 3566089f872fedb175f7569f24f1dba362ffbc403528Daniel Dunbar Args.ClaimAllArgs(options::OPT_f_clang_Group); 3567089f872fedb175f7569f24f1dba362ffbc403528Daniel Dunbar 3568a3ec60e0cf2a1916f479288998d31bd980b1a306Daniel Dunbar if (Args.hasArg(options::OPT_g_Group) && !Args.hasArg(options::OPT_g0) && 3569a3ec60e0cf2a1916f479288998d31bd980b1a306Daniel Dunbar !Args.hasArg(options::OPT_fno_working_directory)) 3570a3ec60e0cf2a1916f479288998d31bd980b1a306Daniel Dunbar CmdArgs.push_back("-fworking-directory"); 3571a3ec60e0cf2a1916f479288998d31bd980b1a306Daniel Dunbar 3572a3ec60e0cf2a1916f479288998d31bd980b1a306Daniel Dunbar Args.AddAllArgs(CmdArgs, options::OPT_O); 3573a3ec60e0cf2a1916f479288998d31bd980b1a306Daniel Dunbar Args.AddAllArgs(CmdArgs, options::OPT_undef); 3574a3ec60e0cf2a1916f479288998d31bd980b1a306Daniel Dunbar if (Args.hasArg(options::OPT_save_temps)) 3575a3ec60e0cf2a1916f479288998d31bd980b1a306Daniel Dunbar CmdArgs.push_back("-fpch-preprocess"); 3576a3ec60e0cf2a1916f479288998d31bd980b1a306Daniel Dunbar} 3577a3ec60e0cf2a1916f479288998d31bd980b1a306Daniel Dunbar 3578c21c485b4fb58ef5d55cf3e523263dd824a2ace4Daniel Dunbarvoid darwin::CC1::AddCPPUniqueOptionsArgs(const ArgList &Args, 3579a3ec60e0cf2a1916f479288998d31bd980b1a306Daniel Dunbar ArgStringList &CmdArgs, 35801eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump const InputInfoList &Inputs) const { 3581ee788e70fcd0adf76103b17c78ac658d4ea30c9bDaniel Dunbar const Driver &D = getToolChain().getDriver(); 3582a3ec60e0cf2a1916f479288998d31bd980b1a306Daniel Dunbar 358388a3d6cf5ebab81614f89ba48a8d89023270637aDaniel Dunbar CheckPreprocessingOptions(D, Args); 358488a3d6cf5ebab81614f89ba48a8d89023270637aDaniel Dunbar 3585a3ec60e0cf2a1916f479288998d31bd980b1a306Daniel Dunbar // Derived from cpp_unique_options. 358688a3d6cf5ebab81614f89ba48a8d89023270637aDaniel Dunbar // -{C,CC} only with -E is checked in CheckPreprocessingOptions(). 358788a3d6cf5ebab81614f89ba48a8d89023270637aDaniel Dunbar Args.AddLastArg(CmdArgs, options::OPT_C); 358888a3d6cf5ebab81614f89ba48a8d89023270637aDaniel Dunbar Args.AddLastArg(CmdArgs, options::OPT_CC); 3589a3ec60e0cf2a1916f479288998d31bd980b1a306Daniel Dunbar if (!Args.hasArg(options::OPT_Q)) 3590a3ec60e0cf2a1916f479288998d31bd980b1a306Daniel Dunbar CmdArgs.push_back("-quiet"); 3591a3ec60e0cf2a1916f479288998d31bd980b1a306Daniel Dunbar Args.AddAllArgs(CmdArgs, options::OPT_nostdinc); 35924c2bcad7b843c10fd4a2ffd43da40bfefb4dc8baDouglas Gregor Args.AddAllArgs(CmdArgs, options::OPT_nostdincxx); 3593a3ec60e0cf2a1916f479288998d31bd980b1a306Daniel Dunbar Args.AddLastArg(CmdArgs, options::OPT_v); 3594a3ec60e0cf2a1916f479288998d31bd980b1a306Daniel Dunbar Args.AddAllArgs(CmdArgs, options::OPT_I_Group, options::OPT_F); 3595a3ec60e0cf2a1916f479288998d31bd980b1a306Daniel Dunbar Args.AddLastArg(CmdArgs, options::OPT_P); 3596a3ec60e0cf2a1916f479288998d31bd980b1a306Daniel Dunbar 3597a3ec60e0cf2a1916f479288998d31bd980b1a306Daniel Dunbar // FIXME: Handle %I properly. 3598a3ec60e0cf2a1916f479288998d31bd980b1a306Daniel Dunbar if (getToolChain().getArchName() == "x86_64") { 3599a3ec60e0cf2a1916f479288998d31bd980b1a306Daniel Dunbar CmdArgs.push_back("-imultilib"); 3600a3ec60e0cf2a1916f479288998d31bd980b1a306Daniel Dunbar CmdArgs.push_back("x86_64"); 3601a3ec60e0cf2a1916f479288998d31bd980b1a306Daniel Dunbar } 3602a3ec60e0cf2a1916f479288998d31bd980b1a306Daniel Dunbar 3603a3ec60e0cf2a1916f479288998d31bd980b1a306Daniel Dunbar if (Args.hasArg(options::OPT_MD)) { 3604a3ec60e0cf2a1916f479288998d31bd980b1a306Daniel Dunbar CmdArgs.push_back("-MD"); 3605a5a7bd0de7b6b80212095195a055a4a43f21d4b2Daniel Dunbar CmdArgs.push_back(darwin::CC1::getDependencyFileName(Args, Inputs)); 3606a3ec60e0cf2a1916f479288998d31bd980b1a306Daniel Dunbar } 3607a3ec60e0cf2a1916f479288998d31bd980b1a306Daniel Dunbar 3608a3ec60e0cf2a1916f479288998d31bd980b1a306Daniel Dunbar if (Args.hasArg(options::OPT_MMD)) { 3609a3ec60e0cf2a1916f479288998d31bd980b1a306Daniel Dunbar CmdArgs.push_back("-MMD"); 3610a5a7bd0de7b6b80212095195a055a4a43f21d4b2Daniel Dunbar CmdArgs.push_back(darwin::CC1::getDependencyFileName(Args, Inputs)); 3611a3ec60e0cf2a1916f479288998d31bd980b1a306Daniel Dunbar } 3612a3ec60e0cf2a1916f479288998d31bd980b1a306Daniel Dunbar 3613a3ec60e0cf2a1916f479288998d31bd980b1a306Daniel Dunbar Args.AddLastArg(CmdArgs, options::OPT_M); 3614a3ec60e0cf2a1916f479288998d31bd980b1a306Daniel Dunbar Args.AddLastArg(CmdArgs, options::OPT_MM); 3615a3ec60e0cf2a1916f479288998d31bd980b1a306Daniel Dunbar Args.AddAllArgs(CmdArgs, options::OPT_MF); 3616a3ec60e0cf2a1916f479288998d31bd980b1a306Daniel Dunbar Args.AddLastArg(CmdArgs, options::OPT_MG); 3617a3ec60e0cf2a1916f479288998d31bd980b1a306Daniel Dunbar Args.AddLastArg(CmdArgs, options::OPT_MP); 3618a3ec60e0cf2a1916f479288998d31bd980b1a306Daniel Dunbar Args.AddAllArgs(CmdArgs, options::OPT_MQ); 3619a3ec60e0cf2a1916f479288998d31bd980b1a306Daniel Dunbar Args.AddAllArgs(CmdArgs, options::OPT_MT); 3620a3ec60e0cf2a1916f479288998d31bd980b1a306Daniel Dunbar if (!Args.hasArg(options::OPT_M) && !Args.hasArg(options::OPT_MM) && 3621a3ec60e0cf2a1916f479288998d31bd980b1a306Daniel Dunbar (Args.hasArg(options::OPT_MD) || Args.hasArg(options::OPT_MMD))) { 3622a3ec60e0cf2a1916f479288998d31bd980b1a306Daniel Dunbar if (Arg *OutputOpt = Args.getLastArg(options::OPT_o)) { 3623a3ec60e0cf2a1916f479288998d31bd980b1a306Daniel Dunbar CmdArgs.push_back("-MQ"); 3624a3ec60e0cf2a1916f479288998d31bd980b1a306Daniel Dunbar CmdArgs.push_back(OutputOpt->getValue(Args)); 3625a3ec60e0cf2a1916f479288998d31bd980b1a306Daniel Dunbar } 3626a3ec60e0cf2a1916f479288998d31bd980b1a306Daniel Dunbar } 3627a3ec60e0cf2a1916f479288998d31bd980b1a306Daniel Dunbar 3628a3ec60e0cf2a1916f479288998d31bd980b1a306Daniel Dunbar Args.AddLastArg(CmdArgs, options::OPT_remap); 3629a3ec60e0cf2a1916f479288998d31bd980b1a306Daniel Dunbar if (Args.hasArg(options::OPT_g3)) 3630a3ec60e0cf2a1916f479288998d31bd980b1a306Daniel Dunbar CmdArgs.push_back("-dD"); 3631a3ec60e0cf2a1916f479288998d31bd980b1a306Daniel Dunbar Args.AddLastArg(CmdArgs, options::OPT_H); 3632a3ec60e0cf2a1916f479288998d31bd980b1a306Daniel Dunbar 3633a3ec60e0cf2a1916f479288998d31bd980b1a306Daniel Dunbar AddCPPArgs(Args, CmdArgs); 3634a3ec60e0cf2a1916f479288998d31bd980b1a306Daniel Dunbar 3635a3ec60e0cf2a1916f479288998d31bd980b1a306Daniel Dunbar Args.AddAllArgs(CmdArgs, options::OPT_D, options::OPT_U, options::OPT_A); 3636a3ec60e0cf2a1916f479288998d31bd980b1a306Daniel Dunbar Args.AddAllArgs(CmdArgs, options::OPT_i_Group); 3637a3ec60e0cf2a1916f479288998d31bd980b1a306Daniel Dunbar 3638a3ec60e0cf2a1916f479288998d31bd980b1a306Daniel Dunbar for (InputInfoList::const_iterator 3639a3ec60e0cf2a1916f479288998d31bd980b1a306Daniel Dunbar it = Inputs.begin(), ie = Inputs.end(); it != ie; ++it) { 3640a3ec60e0cf2a1916f479288998d31bd980b1a306Daniel Dunbar const InputInfo &II = *it; 3641c21c485b4fb58ef5d55cf3e523263dd824a2ace4Daniel Dunbar 36427c1e46533cae07216e2a67d5636a5afb44253155Daniel Dunbar CmdArgs.push_back(II.getFilename()); 3643a3ec60e0cf2a1916f479288998d31bd980b1a306Daniel Dunbar } 3644a3ec60e0cf2a1916f479288998d31bd980b1a306Daniel Dunbar 3645a3ec60e0cf2a1916f479288998d31bd980b1a306Daniel Dunbar Args.AddAllArgValues(CmdArgs, options::OPT_Wp_COMMA, 3646a3ec60e0cf2a1916f479288998d31bd980b1a306Daniel Dunbar options::OPT_Xpreprocessor); 3647a3ec60e0cf2a1916f479288998d31bd980b1a306Daniel Dunbar 3648a3ec60e0cf2a1916f479288998d31bd980b1a306Daniel Dunbar if (Args.hasArg(options::OPT_fmudflap)) { 3649a3ec60e0cf2a1916f479288998d31bd980b1a306Daniel Dunbar CmdArgs.push_back("-D_MUDFLAP"); 3650a3ec60e0cf2a1916f479288998d31bd980b1a306Daniel Dunbar CmdArgs.push_back("-include"); 3651a3ec60e0cf2a1916f479288998d31bd980b1a306Daniel Dunbar CmdArgs.push_back("mf-runtime.h"); 3652a3ec60e0cf2a1916f479288998d31bd980b1a306Daniel Dunbar } 3653a3ec60e0cf2a1916f479288998d31bd980b1a306Daniel Dunbar 3654a3ec60e0cf2a1916f479288998d31bd980b1a306Daniel Dunbar if (Args.hasArg(options::OPT_fmudflapth)) { 3655a3ec60e0cf2a1916f479288998d31bd980b1a306Daniel Dunbar CmdArgs.push_back("-D_MUDFLAP"); 3656a3ec60e0cf2a1916f479288998d31bd980b1a306Daniel Dunbar CmdArgs.push_back("-D_MUDFLAPTH"); 3657a3ec60e0cf2a1916f479288998d31bd980b1a306Daniel Dunbar CmdArgs.push_back("-include"); 3658a3ec60e0cf2a1916f479288998d31bd980b1a306Daniel Dunbar CmdArgs.push_back("mf-runtime.h"); 3659a3ec60e0cf2a1916f479288998d31bd980b1a306Daniel Dunbar } 3660a3ec60e0cf2a1916f479288998d31bd980b1a306Daniel Dunbar} 3661a3ec60e0cf2a1916f479288998d31bd980b1a306Daniel Dunbar 3662c21c485b4fb58ef5d55cf3e523263dd824a2ace4Daniel Dunbarvoid darwin::CC1::AddCPPArgs(const ArgList &Args, 3663a3ec60e0cf2a1916f479288998d31bd980b1a306Daniel Dunbar ArgStringList &CmdArgs) const { 3664a3ec60e0cf2a1916f479288998d31bd980b1a306Daniel Dunbar // Derived from cpp spec. 3665a3ec60e0cf2a1916f479288998d31bd980b1a306Daniel Dunbar 3666a3ec60e0cf2a1916f479288998d31bd980b1a306Daniel Dunbar if (Args.hasArg(options::OPT_static)) { 3667a3ec60e0cf2a1916f479288998d31bd980b1a306Daniel Dunbar // The gcc spec is broken here, it refers to dynamic but 3668a3ec60e0cf2a1916f479288998d31bd980b1a306Daniel Dunbar // that has been translated. Start by being bug compatible. 3669c21c485b4fb58ef5d55cf3e523263dd824a2ace4Daniel Dunbar 3670a3ec60e0cf2a1916f479288998d31bd980b1a306Daniel Dunbar // if (!Args.hasArg(arglist.parser.dynamicOption)) 3671a3ec60e0cf2a1916f479288998d31bd980b1a306Daniel Dunbar CmdArgs.push_back("-D__STATIC__"); 3672a3ec60e0cf2a1916f479288998d31bd980b1a306Daniel Dunbar } else 3673a3ec60e0cf2a1916f479288998d31bd980b1a306Daniel Dunbar CmdArgs.push_back("-D__DYNAMIC__"); 3674a3ec60e0cf2a1916f479288998d31bd980b1a306Daniel Dunbar 3675a3ec60e0cf2a1916f479288998d31bd980b1a306Daniel Dunbar if (Args.hasArg(options::OPT_pthread)) 3676a3ec60e0cf2a1916f479288998d31bd980b1a306Daniel Dunbar CmdArgs.push_back("-D_REENTRANT"); 3677a3ec60e0cf2a1916f479288998d31bd980b1a306Daniel Dunbar} 3678a3ec60e0cf2a1916f479288998d31bd980b1a306Daniel Dunbar 367940f1265ebd42ece3e7f7917319b56012e8e2bce2Daniel Dunbarvoid darwin::Preprocess::ConstructJob(Compilation &C, const JobAction &JA, 36802fe238ed293bd4bc27af9beb9fa151fad2146fa8Daniel Dunbar const InputInfo &Output, 3681c21c485b4fb58ef5d55cf3e523263dd824a2ace4Daniel Dunbar const InputInfoList &Inputs, 3682c21c485b4fb58ef5d55cf3e523263dd824a2ace4Daniel Dunbar const ArgList &Args, 368340f1265ebd42ece3e7f7917319b56012e8e2bce2Daniel Dunbar const char *LinkingOutput) const { 368440f1265ebd42ece3e7f7917319b56012e8e2bce2Daniel Dunbar ArgStringList CmdArgs; 368540f1265ebd42ece3e7f7917319b56012e8e2bce2Daniel Dunbar 368640f1265ebd42ece3e7f7917319b56012e8e2bce2Daniel Dunbar assert(Inputs.size() == 1 && "Unexpected number of inputs!"); 368740f1265ebd42ece3e7f7917319b56012e8e2bce2Daniel Dunbar 368840f1265ebd42ece3e7f7917319b56012e8e2bce2Daniel Dunbar CmdArgs.push_back("-E"); 368940f1265ebd42ece3e7f7917319b56012e8e2bce2Daniel Dunbar 369040f1265ebd42ece3e7f7917319b56012e8e2bce2Daniel Dunbar if (Args.hasArg(options::OPT_traditional) || 369140f1265ebd42ece3e7f7917319b56012e8e2bce2Daniel Dunbar Args.hasArg(options::OPT_traditional_cpp)) 369240f1265ebd42ece3e7f7917319b56012e8e2bce2Daniel Dunbar CmdArgs.push_back("-traditional-cpp"); 3693c21c485b4fb58ef5d55cf3e523263dd824a2ace4Daniel Dunbar 369440f1265ebd42ece3e7f7917319b56012e8e2bce2Daniel Dunbar ArgStringList OutputArgs; 36957c1e46533cae07216e2a67d5636a5afb44253155Daniel Dunbar assert(Output.isFilename() && "Unexpected CC1 output."); 36967c1e46533cae07216e2a67d5636a5afb44253155Daniel Dunbar OutputArgs.push_back("-o"); 36977c1e46533cae07216e2a67d5636a5afb44253155Daniel Dunbar OutputArgs.push_back(Output.getFilename()); 369840f1265ebd42ece3e7f7917319b56012e8e2bce2Daniel Dunbar 36999ade4ae4fb7ed1fcbd63835d9f8f53052f0657a2Joerg Sonnenberger if (Args.hasArg(options::OPT_E) || getToolChain().getDriver().CCCIsCPP) { 37009120f179fd2e354f067e4ef2c76dcf3fc4db8a16Daniel Dunbar AddCPPOptionsArgs(Args, CmdArgs, Inputs, OutputArgs); 37019120f179fd2e354f067e4ef2c76dcf3fc4db8a16Daniel Dunbar } else { 37029120f179fd2e354f067e4ef2c76dcf3fc4db8a16Daniel Dunbar AddCPPOptionsArgs(Args, CmdArgs, Inputs, ArgStringList()); 37039120f179fd2e354f067e4ef2c76dcf3fc4db8a16Daniel Dunbar CmdArgs.append(OutputArgs.begin(), OutputArgs.end()); 37049120f179fd2e354f067e4ef2c76dcf3fc4db8a16Daniel Dunbar } 3705c21c485b4fb58ef5d55cf3e523263dd824a2ace4Daniel Dunbar 37068a2073a85670a13b0bcc1726bc7f80d458f8245bDaniel Dunbar Args.AddAllArgs(CmdArgs, options::OPT_d_Group); 37078a2073a85670a13b0bcc1726bc7f80d458f8245bDaniel Dunbar 37084fe4d73bce7aba5446dcbfa36ee8782c6d496710Chad Rosier RemoveCC1UnsupportedArgs(CmdArgs); 37094fe4d73bce7aba5446dcbfa36ee8782c6d496710Chad Rosier 371040f1265ebd42ece3e7f7917319b56012e8e2bce2Daniel Dunbar const char *CC1Name = getCC1Name(Inputs[0].getType()); 3711c21c485b4fb58ef5d55cf3e523263dd824a2ace4Daniel Dunbar const char *Exec = 37124a7e88978cf646ad10d654020cb00b3877069210Daniel Dunbar Args.MakeArgString(getToolChain().GetProgramPath(CC1Name)); 37132fe238ed293bd4bc27af9beb9fa151fad2146fa8Daniel Dunbar C.addCommand(new Command(JA, *this, Exec, CmdArgs)); 371440f1265ebd42ece3e7f7917319b56012e8e2bce2Daniel Dunbar} 371540f1265ebd42ece3e7f7917319b56012e8e2bce2Daniel Dunbar 371640f1265ebd42ece3e7f7917319b56012e8e2bce2Daniel Dunbarvoid darwin::Compile::ConstructJob(Compilation &C, const JobAction &JA, 37172fe238ed293bd4bc27af9beb9fa151fad2146fa8Daniel Dunbar const InputInfo &Output, 3718c21c485b4fb58ef5d55cf3e523263dd824a2ace4Daniel Dunbar const InputInfoList &Inputs, 3719c21c485b4fb58ef5d55cf3e523263dd824a2ace4Daniel Dunbar const ArgList &Args, 372040f1265ebd42ece3e7f7917319b56012e8e2bce2Daniel Dunbar const char *LinkingOutput) const { 3721ee788e70fcd0adf76103b17c78ac658d4ea30c9bDaniel Dunbar const Driver &D = getToolChain().getDriver(); 372240f1265ebd42ece3e7f7917319b56012e8e2bce2Daniel Dunbar ArgStringList CmdArgs; 372340f1265ebd42ece3e7f7917319b56012e8e2bce2Daniel Dunbar 372440f1265ebd42ece3e7f7917319b56012e8e2bce2Daniel Dunbar assert(Inputs.size() == 1 && "Unexpected number of inputs!"); 372540f1265ebd42ece3e7f7917319b56012e8e2bce2Daniel Dunbar 3726651f3d44dbae18c74c5f475d7a601d65b07b45c4Bob Wilson // Silence warning about unused --serialize-diagnostics 3727651f3d44dbae18c74c5f475d7a601d65b07b45c4Bob Wilson Args.ClaimAllArgs(options::OPT__serialize_diags); 3728651f3d44dbae18c74c5f475d7a601d65b07b45c4Bob Wilson 372940f1265ebd42ece3e7f7917319b56012e8e2bce2Daniel Dunbar types::ID InputType = Inputs[0].getType(); 3730d624a5b43a970bd3102d7075baeea89b8ca336a4David Blaikie if (const Arg *A = Args.getLastArg(options::OPT_traditional)) 37315f9e272e632e951b1efe824cd16acb4d96077930Chris Lattner D.Diag(diag::err_drv_argument_only_allowed_with) 373240f1265ebd42ece3e7f7917319b56012e8e2bce2Daniel Dunbar << A->getAsString(Args) << "-E"; 373340f1265ebd42ece3e7f7917319b56012e8e2bce2Daniel Dunbar 37346c6424bc0d3b5f080a97b5f6ef4a8d70c38e38f5Daniel Dunbar if (JA.getType() == types::TY_LLVM_IR || 37356c6424bc0d3b5f080a97b5f6ef4a8d70c38e38f5Daniel Dunbar JA.getType() == types::TY_LTO_IR) 373640f1265ebd42ece3e7f7917319b56012e8e2bce2Daniel Dunbar CmdArgs.push_back("-emit-llvm"); 37376c6424bc0d3b5f080a97b5f6ef4a8d70c38e38f5Daniel Dunbar else if (JA.getType() == types::TY_LLVM_BC || 37386c6424bc0d3b5f080a97b5f6ef4a8d70c38e38f5Daniel Dunbar JA.getType() == types::TY_LTO_BC) 373940f1265ebd42ece3e7f7917319b56012e8e2bce2Daniel Dunbar CmdArgs.push_back("-emit-llvm-bc"); 37405915fbf310e171c4cd3c2af05e9de360c0fa988aDaniel Dunbar else if (Output.getType() == types::TY_AST) 37415f9e272e632e951b1efe824cd16acb4d96077930Chris Lattner D.Diag(diag::err_drv_no_ast_support) 3742881376467c46c5c6cc16fa6790271c2c22e1d4f1Daniel Dunbar << getToolChain().getTripleString(); 3743ae24a88655c461e751d0984cc21dda6e17882356Daniel Dunbar else if (JA.getType() != types::TY_PP_Asm && 3744ae24a88655c461e751d0984cc21dda6e17882356Daniel Dunbar JA.getType() != types::TY_PCH) 37455f9e272e632e951b1efe824cd16acb4d96077930Chris Lattner D.Diag(diag::err_drv_invalid_gcc_output_type) 374664952508c2b0c8bffb45c8b410f0af3d2457f59bDaniel Dunbar << getTypeName(JA.getType()); 374740f1265ebd42ece3e7f7917319b56012e8e2bce2Daniel Dunbar 374840f1265ebd42ece3e7f7917319b56012e8e2bce2Daniel Dunbar ArgStringList OutputArgs; 374940f1265ebd42ece3e7f7917319b56012e8e2bce2Daniel Dunbar if (Output.getType() != types::TY_PCH) { 375040f1265ebd42ece3e7f7917319b56012e8e2bce2Daniel Dunbar OutputArgs.push_back("-o"); 37517c1e46533cae07216e2a67d5636a5afb44253155Daniel Dunbar if (Output.isNothing()) 375240f1265ebd42ece3e7f7917319b56012e8e2bce2Daniel Dunbar OutputArgs.push_back("/dev/null"); 375340f1265ebd42ece3e7f7917319b56012e8e2bce2Daniel Dunbar else 375440f1265ebd42ece3e7f7917319b56012e8e2bce2Daniel Dunbar OutputArgs.push_back(Output.getFilename()); 375540f1265ebd42ece3e7f7917319b56012e8e2bce2Daniel Dunbar } 375640f1265ebd42ece3e7f7917319b56012e8e2bce2Daniel Dunbar 375740f1265ebd42ece3e7f7917319b56012e8e2bce2Daniel Dunbar // There is no need for this level of compatibility, but it makes 375840f1265ebd42ece3e7f7917319b56012e8e2bce2Daniel Dunbar // diffing easier. 375940f1265ebd42ece3e7f7917319b56012e8e2bce2Daniel Dunbar bool OutputArgsEarly = (Args.hasArg(options::OPT_fsyntax_only) || 376040f1265ebd42ece3e7f7917319b56012e8e2bce2Daniel Dunbar Args.hasArg(options::OPT_S)); 376140f1265ebd42ece3e7f7917319b56012e8e2bce2Daniel Dunbar 376240f1265ebd42ece3e7f7917319b56012e8e2bce2Daniel Dunbar if (types::getPreprocessedType(InputType) != types::TY_INVALID) { 3763a3ec60e0cf2a1916f479288998d31bd980b1a306Daniel Dunbar AddCPPUniqueOptionsArgs(Args, CmdArgs, Inputs); 376440f1265ebd42ece3e7f7917319b56012e8e2bce2Daniel Dunbar if (OutputArgsEarly) { 376540f1265ebd42ece3e7f7917319b56012e8e2bce2Daniel Dunbar AddCC1OptionsArgs(Args, CmdArgs, Inputs, OutputArgs); 376640f1265ebd42ece3e7f7917319b56012e8e2bce2Daniel Dunbar } else { 376740f1265ebd42ece3e7f7917319b56012e8e2bce2Daniel Dunbar AddCC1OptionsArgs(Args, CmdArgs, Inputs, ArgStringList()); 376840f1265ebd42ece3e7f7917319b56012e8e2bce2Daniel Dunbar CmdArgs.append(OutputArgs.begin(), OutputArgs.end()); 376940f1265ebd42ece3e7f7917319b56012e8e2bce2Daniel Dunbar } 377040f1265ebd42ece3e7f7917319b56012e8e2bce2Daniel Dunbar } else { 377140f1265ebd42ece3e7f7917319b56012e8e2bce2Daniel Dunbar CmdArgs.push_back("-fpreprocessed"); 3772c21c485b4fb58ef5d55cf3e523263dd824a2ace4Daniel Dunbar 377340f1265ebd42ece3e7f7917319b56012e8e2bce2Daniel Dunbar for (InputInfoList::const_iterator 377440f1265ebd42ece3e7f7917319b56012e8e2bce2Daniel Dunbar it = Inputs.begin(), ie = Inputs.end(); it != ie; ++it) { 377540f1265ebd42ece3e7f7917319b56012e8e2bce2Daniel Dunbar const InputInfo &II = *it; 377640f1265ebd42ece3e7f7917319b56012e8e2bce2Daniel Dunbar 37775915fbf310e171c4cd3c2af05e9de360c0fa988aDaniel Dunbar // Reject AST inputs. 37785915fbf310e171c4cd3c2af05e9de360c0fa988aDaniel Dunbar if (II.getType() == types::TY_AST) { 37795f9e272e632e951b1efe824cd16acb4d96077930Chris Lattner D.Diag(diag::err_drv_no_ast_support) 3780881376467c46c5c6cc16fa6790271c2c22e1d4f1Daniel Dunbar << getToolChain().getTripleString(); 37815915fbf310e171c4cd3c2af05e9de360c0fa988aDaniel Dunbar return; 37825915fbf310e171c4cd3c2af05e9de360c0fa988aDaniel Dunbar } 37835915fbf310e171c4cd3c2af05e9de360c0fa988aDaniel Dunbar 37847c1e46533cae07216e2a67d5636a5afb44253155Daniel Dunbar CmdArgs.push_back(II.getFilename()); 378540f1265ebd42ece3e7f7917319b56012e8e2bce2Daniel Dunbar } 378640f1265ebd42ece3e7f7917319b56012e8e2bce2Daniel Dunbar 378740f1265ebd42ece3e7f7917319b56012e8e2bce2Daniel Dunbar if (OutputArgsEarly) { 378840f1265ebd42ece3e7f7917319b56012e8e2bce2Daniel Dunbar AddCC1OptionsArgs(Args, CmdArgs, Inputs, OutputArgs); 378940f1265ebd42ece3e7f7917319b56012e8e2bce2Daniel Dunbar } else { 379040f1265ebd42ece3e7f7917319b56012e8e2bce2Daniel Dunbar AddCC1OptionsArgs(Args, CmdArgs, Inputs, ArgStringList()); 379140f1265ebd42ece3e7f7917319b56012e8e2bce2Daniel Dunbar CmdArgs.append(OutputArgs.begin(), OutputArgs.end()); 379240f1265ebd42ece3e7f7917319b56012e8e2bce2Daniel Dunbar } 379340f1265ebd42ece3e7f7917319b56012e8e2bce2Daniel Dunbar } 3794c21c485b4fb58ef5d55cf3e523263dd824a2ace4Daniel Dunbar 379540f1265ebd42ece3e7f7917319b56012e8e2bce2Daniel Dunbar if (Output.getType() == types::TY_PCH) { 379640f1265ebd42ece3e7f7917319b56012e8e2bce2Daniel Dunbar assert(Output.isFilename() && "Invalid PCH output."); 379740f1265ebd42ece3e7f7917319b56012e8e2bce2Daniel Dunbar 379840f1265ebd42ece3e7f7917319b56012e8e2bce2Daniel Dunbar CmdArgs.push_back("-o"); 379940f1265ebd42ece3e7f7917319b56012e8e2bce2Daniel Dunbar // NOTE: gcc uses a temp .s file for this, but there doesn't seem 380040f1265ebd42ece3e7f7917319b56012e8e2bce2Daniel Dunbar // to be a good reason. 38018c221b84caff1f10ef4aad5c6ff77d36633f607cChad Rosier const char *TmpPath = C.getArgs().MakeArgString( 3802fe87fc73c0091a8d6ba04b7e3b5f144d4a0517a3Chad Rosier D.GetTemporaryPath("cc", "s")); 38038c221b84caff1f10ef4aad5c6ff77d36633f607cChad Rosier C.addTempFile(TmpPath); 38048c221b84caff1f10ef4aad5c6ff77d36633f607cChad Rosier CmdArgs.push_back(TmpPath); 3805c21c485b4fb58ef5d55cf3e523263dd824a2ace4Daniel Dunbar 380688b7cf00fcb582728c642da3927c59468efaf926Eric Christopher // If we're emitting a pch file with the last 4 characters of ".pth" 380788b7cf00fcb582728c642da3927c59468efaf926Eric Christopher // and falling back to llvm-gcc we want to use ".gch" instead. 380888b7cf00fcb582728c642da3927c59468efaf926Eric Christopher std::string OutputFile(Output.getFilename()); 380988b7cf00fcb582728c642da3927c59468efaf926Eric Christopher size_t loc = OutputFile.rfind(".pth"); 381088b7cf00fcb582728c642da3927c59468efaf926Eric Christopher if (loc != std::string::npos) 381188b7cf00fcb582728c642da3927c59468efaf926Eric Christopher OutputFile.replace(loc, 4, ".gch"); 381288b7cf00fcb582728c642da3927c59468efaf926Eric Christopher const char *Tmp = C.getArgs().MakeArgString("--output-pch="+OutputFile); 381388b7cf00fcb582728c642da3927c59468efaf926Eric Christopher CmdArgs.push_back(Tmp); 3814c21c485b4fb58ef5d55cf3e523263dd824a2ace4Daniel Dunbar } 381540f1265ebd42ece3e7f7917319b56012e8e2bce2Daniel Dunbar 3816285f9a284704c07cd50e4597408d5f93518cd7c3Chad Rosier RemoveCC1UnsupportedArgs(CmdArgs); 3817285f9a284704c07cd50e4597408d5f93518cd7c3Chad Rosier 381840f1265ebd42ece3e7f7917319b56012e8e2bce2Daniel Dunbar const char *CC1Name = getCC1Name(Inputs[0].getType()); 3819c21c485b4fb58ef5d55cf3e523263dd824a2ace4Daniel Dunbar const char *Exec = 38204a7e88978cf646ad10d654020cb00b3877069210Daniel Dunbar Args.MakeArgString(getToolChain().GetProgramPath(CC1Name)); 38212fe238ed293bd4bc27af9beb9fa151fad2146fa8Daniel Dunbar C.addCommand(new Command(JA, *this, Exec, CmdArgs)); 382240f1265ebd42ece3e7f7917319b56012e8e2bce2Daniel Dunbar} 382340f1265ebd42ece3e7f7917319b56012e8e2bce2Daniel Dunbar 38248cac5f7e1ce63dd77ee0fb4ef68f9fa804f41ea6Daniel Dunbarvoid darwin::Assemble::ConstructJob(Compilation &C, const JobAction &JA, 38252fe238ed293bd4bc27af9beb9fa151fad2146fa8Daniel Dunbar const InputInfo &Output, 3826c21c485b4fb58ef5d55cf3e523263dd824a2ace4Daniel Dunbar const InputInfoList &Inputs, 3827c21c485b4fb58ef5d55cf3e523263dd824a2ace4Daniel Dunbar const ArgList &Args, 38288cac5f7e1ce63dd77ee0fb4ef68f9fa804f41ea6Daniel Dunbar const char *LinkingOutput) const { 38298cac5f7e1ce63dd77ee0fb4ef68f9fa804f41ea6Daniel Dunbar ArgStringList CmdArgs; 38308cac5f7e1ce63dd77ee0fb4ef68f9fa804f41ea6Daniel Dunbar 38318cac5f7e1ce63dd77ee0fb4ef68f9fa804f41ea6Daniel Dunbar assert(Inputs.size() == 1 && "Unexpected number of inputs."); 38328cac5f7e1ce63dd77ee0fb4ef68f9fa804f41ea6Daniel Dunbar const InputInfo &Input = Inputs[0]; 38338cac5f7e1ce63dd77ee0fb4ef68f9fa804f41ea6Daniel Dunbar 383434bac1f7b1ad8018b0d456f38744891c4bf56f63Daniel Dunbar // Determine the original source input. 383534bac1f7b1ad8018b0d456f38744891c4bf56f63Daniel Dunbar const Action *SourceAction = &JA; 383634bac1f7b1ad8018b0d456f38744891c4bf56f63Daniel Dunbar while (SourceAction->getKind() != Action::InputClass) { 383734bac1f7b1ad8018b0d456f38744891c4bf56f63Daniel Dunbar assert(!SourceAction->getInputs().empty() && "unexpected root action!"); 383834bac1f7b1ad8018b0d456f38744891c4bf56f63Daniel Dunbar SourceAction = SourceAction->getInputs()[0]; 383934bac1f7b1ad8018b0d456f38744891c4bf56f63Daniel Dunbar } 384034bac1f7b1ad8018b0d456f38744891c4bf56f63Daniel Dunbar 384134bac1f7b1ad8018b0d456f38744891c4bf56f63Daniel Dunbar // Forward -g, assuming we are dealing with an actual assembly file. 384288b7cf00fcb582728c642da3927c59468efaf926Eric Christopher if (SourceAction->getType() == types::TY_Asm || 384334bac1f7b1ad8018b0d456f38744891c4bf56f63Daniel Dunbar SourceAction->getType() == types::TY_PP_Asm) { 38448e4fea6750dbac032c172f3279c63b7815b7423eDaniel Dunbar if (Args.hasArg(options::OPT_gstabs)) 38458e4fea6750dbac032c172f3279c63b7815b7423eDaniel Dunbar CmdArgs.push_back("--gstabs"); 38468e4fea6750dbac032c172f3279c63b7815b7423eDaniel Dunbar else if (Args.hasArg(options::OPT_g_Group)) 3847591ff15d4a7ae25ea7ac3f00f04f203d3ccec0b7Bob Wilson CmdArgs.push_back("-g"); 38488e4fea6750dbac032c172f3279c63b7815b7423eDaniel Dunbar } 3849c21c485b4fb58ef5d55cf3e523263dd824a2ace4Daniel Dunbar 38508cac5f7e1ce63dd77ee0fb4ef68f9fa804f41ea6Daniel Dunbar // Derived from asm spec. 3851cc6f803f98fa6ba9a9c366400210448516d01b3cDaniel Dunbar AddDarwinArch(Args, CmdArgs); 3852cc6f803f98fa6ba9a9c366400210448516d01b3cDaniel Dunbar 3853f5438e3462f37d7c58f847b594b4b3ab84085d67Daniel Dunbar // Use -force_cpusubtype_ALL on x86 by default. 3854f5438e3462f37d7c58f847b594b4b3ab84085d67Daniel Dunbar if (getToolChain().getTriple().getArch() == llvm::Triple::x86 || 3855f5438e3462f37d7c58f847b594b4b3ab84085d67Daniel Dunbar getToolChain().getTriple().getArch() == llvm::Triple::x86_64 || 3856cc6f803f98fa6ba9a9c366400210448516d01b3cDaniel Dunbar Args.hasArg(options::OPT_force__cpusubtype__ALL)) 3857cc6f803f98fa6ba9a9c366400210448516d01b3cDaniel Dunbar CmdArgs.push_back("-force_cpusubtype_ALL"); 38588cac5f7e1ce63dd77ee0fb4ef68f9fa804f41ea6Daniel Dunbar 38590e2679d29be70186fc1197a1484948ed239922baDaniel Dunbar if (getToolChain().getTriple().getArch() != llvm::Triple::x86_64 && 38600e2679d29be70186fc1197a1484948ed239922baDaniel Dunbar (Args.hasArg(options::OPT_mkernel) || 38618cac5f7e1ce63dd77ee0fb4ef68f9fa804f41ea6Daniel Dunbar Args.hasArg(options::OPT_static) || 38620e2679d29be70186fc1197a1484948ed239922baDaniel Dunbar Args.hasArg(options::OPT_fapple_kext))) 3863c21c485b4fb58ef5d55cf3e523263dd824a2ace4Daniel Dunbar CmdArgs.push_back("-static"); 3864c21c485b4fb58ef5d55cf3e523263dd824a2ace4Daniel Dunbar 38658cac5f7e1ce63dd77ee0fb4ef68f9fa804f41ea6Daniel Dunbar Args.AddAllArgValues(CmdArgs, options::OPT_Wa_COMMA, 38668cac5f7e1ce63dd77ee0fb4ef68f9fa804f41ea6Daniel Dunbar options::OPT_Xassembler); 38678cac5f7e1ce63dd77ee0fb4ef68f9fa804f41ea6Daniel Dunbar 38688cac5f7e1ce63dd77ee0fb4ef68f9fa804f41ea6Daniel Dunbar assert(Output.isFilename() && "Unexpected lipo output."); 38698cac5f7e1ce63dd77ee0fb4ef68f9fa804f41ea6Daniel Dunbar CmdArgs.push_back("-o"); 38708cac5f7e1ce63dd77ee0fb4ef68f9fa804f41ea6Daniel Dunbar CmdArgs.push_back(Output.getFilename()); 38718cac5f7e1ce63dd77ee0fb4ef68f9fa804f41ea6Daniel Dunbar 38727c1e46533cae07216e2a67d5636a5afb44253155Daniel Dunbar assert(Input.isFilename() && "Invalid input."); 38737c1e46533cae07216e2a67d5636a5afb44253155Daniel Dunbar CmdArgs.push_back(Input.getFilename()); 38748cac5f7e1ce63dd77ee0fb4ef68f9fa804f41ea6Daniel Dunbar 38758cac5f7e1ce63dd77ee0fb4ef68f9fa804f41ea6Daniel Dunbar // asm_final spec is empty. 38768cac5f7e1ce63dd77ee0fb4ef68f9fa804f41ea6Daniel Dunbar 3877c21c485b4fb58ef5d55cf3e523263dd824a2ace4Daniel Dunbar const char *Exec = 38784a7e88978cf646ad10d654020cb00b3877069210Daniel Dunbar Args.MakeArgString(getToolChain().GetProgramPath("as")); 38792fe238ed293bd4bc27af9beb9fa151fad2146fa8Daniel Dunbar C.addCommand(new Command(JA, *this, Exec, CmdArgs)); 38808cac5f7e1ce63dd77ee0fb4ef68f9fa804f41ea6Daniel Dunbar} 3881ff7488dc9a766f94daf54d81b03ab9160d0bfd88Daniel Dunbar 388299ba9e3bd70671f3441fb974895f226a83ce0e66David Blaikievoid darwin::DarwinTool::anchor() {} 388399ba9e3bd70671f3441fb974895f226a83ce0e66David Blaikie 3884fbefe6bd6f62a3361813498dc672ab0d6c0d4fd1Daniel Dunbarvoid darwin::DarwinTool::AddDarwinArch(const ArgList &Args, 3885fbefe6bd6f62a3361813498dc672ab0d6c0d4fd1Daniel Dunbar ArgStringList &CmdArgs) const { 38865f9e272e632e951b1efe824cd16acb4d96077930Chris Lattner StringRef ArchName = getDarwinToolChain().getDarwinArchName(Args); 3887eeff406730f50afd973f005a8d501a19af4785e5Daniel Dunbar 388802633b541b04ad5ffc1c70f4c2feeeb13e607057Daniel Dunbar // Derived from darwin_arch spec. 388902633b541b04ad5ffc1c70f4c2feeeb13e607057Daniel Dunbar CmdArgs.push_back("-arch"); 3890eeff406730f50afd973f005a8d501a19af4785e5Daniel Dunbar CmdArgs.push_back(Args.MakeArgString(ArchName)); 389178dbd580a02759bbc408dbefb6754afa71b2c24cDaniel Dunbar 3892eeff406730f50afd973f005a8d501a19af4785e5Daniel Dunbar // FIXME: Is this needed anymore? 3893eeff406730f50afd973f005a8d501a19af4785e5Daniel Dunbar if (ArchName == "arm") 389478dbd580a02759bbc408dbefb6754afa71b2c24cDaniel Dunbar CmdArgs.push_back("-force_cpusubtype_ALL"); 389502633b541b04ad5ffc1c70f4c2feeeb13e607057Daniel Dunbar} 389602633b541b04ad5ffc1c70f4c2feeeb13e607057Daniel Dunbar 3897748de8eda222f087434d8bd703176b316a061341Daniel Dunbarvoid darwin::Link::AddLinkArgs(Compilation &C, 3898748de8eda222f087434d8bd703176b316a061341Daniel Dunbar const ArgList &Args, 389902633b541b04ad5ffc1c70f4c2feeeb13e607057Daniel Dunbar ArgStringList &CmdArgs) const { 3900ee788e70fcd0adf76103b17c78ac658d4ea30c9bDaniel Dunbar const Driver &D = getToolChain().getDriver(); 3901ce911f5fd76375948d18e6528fe7a7314c6e1ac9Daniel Dunbar const toolchains::Darwin &DarwinTC = getDarwinToolChain(); 390202633b541b04ad5ffc1c70f4c2feeeb13e607057Daniel Dunbar 3903b18dc5b8376f42f7b4802bf1279e95eeb813fa06Daniel Dunbar unsigned Version[3] = { 0, 0, 0 }; 3904b18dc5b8376f42f7b4802bf1279e95eeb813fa06Daniel Dunbar if (Arg *A = Args.getLastArg(options::OPT_mlinker_version_EQ)) { 3905b18dc5b8376f42f7b4802bf1279e95eeb813fa06Daniel Dunbar bool HadExtra; 3906b18dc5b8376f42f7b4802bf1279e95eeb813fa06Daniel Dunbar if (!Driver::GetReleaseVersion(A->getValue(Args), Version[0], 3907b18dc5b8376f42f7b4802bf1279e95eeb813fa06Daniel Dunbar Version[1], Version[2], HadExtra) || 3908b18dc5b8376f42f7b4802bf1279e95eeb813fa06Daniel Dunbar HadExtra) 39095f9e272e632e951b1efe824cd16acb4d96077930Chris Lattner D.Diag(diag::err_drv_invalid_version_number) 3910b18dc5b8376f42f7b4802bf1279e95eeb813fa06Daniel Dunbar << A->getAsString(Args); 3911b18dc5b8376f42f7b4802bf1279e95eeb813fa06Daniel Dunbar } 3912b18dc5b8376f42f7b4802bf1279e95eeb813fa06Daniel Dunbar 3913b18dc5b8376f42f7b4802bf1279e95eeb813fa06Daniel Dunbar // Newer linkers support -demangle, pass it if supported and not disabled by 3914b18dc5b8376f42f7b4802bf1279e95eeb813fa06Daniel Dunbar // the user. 3915d2d2088c569a15c8ad75e70f995ff5a879f4fc49Daniel Dunbar if (Version[0] >= 100 && !Args.hasArg(options::OPT_Z_Xlinker__no_demangle)) { 3916bcf1da8ff6ab007a23a8d1be8e950d92cee4241eDaniel Dunbar // Don't pass -demangle to ld_classic. 3917bcf1da8ff6ab007a23a8d1be8e950d92cee4241eDaniel Dunbar // 3918bcf1da8ff6ab007a23a8d1be8e950d92cee4241eDaniel Dunbar // FIXME: This is a temporary workaround, ld should be handling this. 3919bcf1da8ff6ab007a23a8d1be8e950d92cee4241eDaniel Dunbar bool UsesLdClassic = (getToolChain().getArch() == llvm::Triple::x86 && 3920bcf1da8ff6ab007a23a8d1be8e950d92cee4241eDaniel Dunbar Args.hasArg(options::OPT_static)); 39219ced7049caf7c9543badb302f3bb43a6bc264705Daniel Dunbar if (getToolChain().getArch() == llvm::Triple::x86) { 39229ced7049caf7c9543badb302f3bb43a6bc264705Daniel Dunbar for (arg_iterator it = Args.filtered_begin(options::OPT_Xlinker, 39239ced7049caf7c9543badb302f3bb43a6bc264705Daniel Dunbar options::OPT_Wl_COMMA), 39249ced7049caf7c9543badb302f3bb43a6bc264705Daniel Dunbar ie = Args.filtered_end(); it != ie; ++it) { 39259ced7049caf7c9543badb302f3bb43a6bc264705Daniel Dunbar const Arg *A = *it; 39269ced7049caf7c9543badb302f3bb43a6bc264705Daniel Dunbar for (unsigned i = 0, e = A->getNumValues(); i != e; ++i) 39275f9e272e632e951b1efe824cd16acb4d96077930Chris Lattner if (StringRef(A->getValue(Args, i)) == "-kext") 39289ced7049caf7c9543badb302f3bb43a6bc264705Daniel Dunbar UsesLdClassic = true; 39299ced7049caf7c9543badb302f3bb43a6bc264705Daniel Dunbar } 39309ced7049caf7c9543badb302f3bb43a6bc264705Daniel Dunbar } 3931bcf1da8ff6ab007a23a8d1be8e950d92cee4241eDaniel Dunbar if (!UsesLdClassic) 3932bcf1da8ff6ab007a23a8d1be8e950d92cee4241eDaniel Dunbar CmdArgs.push_back("-demangle"); 3933b18dc5b8376f42f7b4802bf1279e95eeb813fa06Daniel Dunbar } 3934b18dc5b8376f42f7b4802bf1279e95eeb813fa06Daniel Dunbar 39355bfa656e132560e616310b455d65604a49e33e35Daniel Dunbar // If we are using LTO, then automatically create a temporary file path for 39365bfa656e132560e616310b455d65604a49e33e35Daniel Dunbar // the linker to use, so that it's lifetime will extend past a possible 39375bfa656e132560e616310b455d65604a49e33e35Daniel Dunbar // dsymutil step. 3938a68e1c398a0ab9c24e82090fbb26c755dbc62c3cDaniel Dunbar if (Version[0] >= 116 && D.IsUsingLTO(Args)) { 39395bfa656e132560e616310b455d65604a49e33e35Daniel Dunbar const char *TmpPath = C.getArgs().MakeArgString( 3940fe87fc73c0091a8d6ba04b7e3b5f144d4a0517a3Chad Rosier D.GetTemporaryPath("cc", types::getTypeTempSuffix(types::TY_Object))); 39415bfa656e132560e616310b455d65604a49e33e35Daniel Dunbar C.addTempFile(TmpPath); 39425bfa656e132560e616310b455d65604a49e33e35Daniel Dunbar CmdArgs.push_back("-object_path_lto"); 39435bfa656e132560e616310b455d65604a49e33e35Daniel Dunbar CmdArgs.push_back(TmpPath); 39445bfa656e132560e616310b455d65604a49e33e35Daniel Dunbar } 39455bfa656e132560e616310b455d65604a49e33e35Daniel Dunbar 394602633b541b04ad5ffc1c70f4c2feeeb13e607057Daniel Dunbar // Derived from the "link" spec. 394702633b541b04ad5ffc1c70f4c2feeeb13e607057Daniel Dunbar Args.AddAllArgs(CmdArgs, options::OPT_static); 394802633b541b04ad5ffc1c70f4c2feeeb13e607057Daniel Dunbar if (!Args.hasArg(options::OPT_static)) 394902633b541b04ad5ffc1c70f4c2feeeb13e607057Daniel Dunbar CmdArgs.push_back("-dynamic"); 395002633b541b04ad5ffc1c70f4c2feeeb13e607057Daniel Dunbar if (Args.hasArg(options::OPT_fgnu_runtime)) { 395102633b541b04ad5ffc1c70f4c2feeeb13e607057Daniel Dunbar // FIXME: gcc replaces -lobjc in forward args with -lobjc-gnu 395202633b541b04ad5ffc1c70f4c2feeeb13e607057Daniel Dunbar // here. How do we wish to handle such things? 395302633b541b04ad5ffc1c70f4c2feeeb13e607057Daniel Dunbar } 3954c21c485b4fb58ef5d55cf3e523263dd824a2ace4Daniel Dunbar 395502633b541b04ad5ffc1c70f4c2feeeb13e607057Daniel Dunbar if (!Args.hasArg(options::OPT_dynamiclib)) { 3956a6d38494d18e260958e73bfe5e2b3f1dc4160459Daniel Dunbar AddDarwinArch(Args, CmdArgs); 3957a6d38494d18e260958e73bfe5e2b3f1dc4160459Daniel Dunbar // FIXME: Why do this only on this path? 39588917dd4457affb8750c81f08cbc21902a36cff26Daniel Dunbar Args.AddLastArg(CmdArgs, options::OPT_force__cpusubtype__ALL); 395902633b541b04ad5ffc1c70f4c2feeeb13e607057Daniel Dunbar 396002633b541b04ad5ffc1c70f4c2feeeb13e607057Daniel Dunbar Args.AddLastArg(CmdArgs, options::OPT_bundle); 396102633b541b04ad5ffc1c70f4c2feeeb13e607057Daniel Dunbar Args.AddAllArgs(CmdArgs, options::OPT_bundle__loader); 396202633b541b04ad5ffc1c70f4c2feeeb13e607057Daniel Dunbar Args.AddAllArgs(CmdArgs, options::OPT_client__name); 396302633b541b04ad5ffc1c70f4c2feeeb13e607057Daniel Dunbar 396402633b541b04ad5ffc1c70f4c2feeeb13e607057Daniel Dunbar Arg *A; 396502633b541b04ad5ffc1c70f4c2feeeb13e607057Daniel Dunbar if ((A = Args.getLastArg(options::OPT_compatibility__version)) || 396602633b541b04ad5ffc1c70f4c2feeeb13e607057Daniel Dunbar (A = Args.getLastArg(options::OPT_current__version)) || 396702633b541b04ad5ffc1c70f4c2feeeb13e607057Daniel Dunbar (A = Args.getLastArg(options::OPT_install__name))) 39685f9e272e632e951b1efe824cd16acb4d96077930Chris Lattner D.Diag(diag::err_drv_argument_only_allowed_with) 396902633b541b04ad5ffc1c70f4c2feeeb13e607057Daniel Dunbar << A->getAsString(Args) << "-dynamiclib"; 397002633b541b04ad5ffc1c70f4c2feeeb13e607057Daniel Dunbar 397102633b541b04ad5ffc1c70f4c2feeeb13e607057Daniel Dunbar Args.AddLastArg(CmdArgs, options::OPT_force__flat__namespace); 397202633b541b04ad5ffc1c70f4c2feeeb13e607057Daniel Dunbar Args.AddLastArg(CmdArgs, options::OPT_keep__private__externs); 397302633b541b04ad5ffc1c70f4c2feeeb13e607057Daniel Dunbar Args.AddLastArg(CmdArgs, options::OPT_private__bundle); 397402633b541b04ad5ffc1c70f4c2feeeb13e607057Daniel Dunbar } else { 397502633b541b04ad5ffc1c70f4c2feeeb13e607057Daniel Dunbar CmdArgs.push_back("-dylib"); 397602633b541b04ad5ffc1c70f4c2feeeb13e607057Daniel Dunbar 397702633b541b04ad5ffc1c70f4c2feeeb13e607057Daniel Dunbar Arg *A; 397802633b541b04ad5ffc1c70f4c2feeeb13e607057Daniel Dunbar if ((A = Args.getLastArg(options::OPT_bundle)) || 397902633b541b04ad5ffc1c70f4c2feeeb13e607057Daniel Dunbar (A = Args.getLastArg(options::OPT_bundle__loader)) || 398002633b541b04ad5ffc1c70f4c2feeeb13e607057Daniel Dunbar (A = Args.getLastArg(options::OPT_client__name)) || 398102633b541b04ad5ffc1c70f4c2feeeb13e607057Daniel Dunbar (A = Args.getLastArg(options::OPT_force__flat__namespace)) || 398202633b541b04ad5ffc1c70f4c2feeeb13e607057Daniel Dunbar (A = Args.getLastArg(options::OPT_keep__private__externs)) || 398302633b541b04ad5ffc1c70f4c2feeeb13e607057Daniel Dunbar (A = Args.getLastArg(options::OPT_private__bundle))) 39845f9e272e632e951b1efe824cd16acb4d96077930Chris Lattner D.Diag(diag::err_drv_argument_not_allowed_with) 398502633b541b04ad5ffc1c70f4c2feeeb13e607057Daniel Dunbar << A->getAsString(Args) << "-dynamiclib"; 3986c21c485b4fb58ef5d55cf3e523263dd824a2ace4Daniel Dunbar 398702633b541b04ad5ffc1c70f4c2feeeb13e607057Daniel Dunbar Args.AddAllArgsTranslated(CmdArgs, options::OPT_compatibility__version, 398802633b541b04ad5ffc1c70f4c2feeeb13e607057Daniel Dunbar "-dylib_compatibility_version"); 398902633b541b04ad5ffc1c70f4c2feeeb13e607057Daniel Dunbar Args.AddAllArgsTranslated(CmdArgs, options::OPT_current__version, 399002633b541b04ad5ffc1c70f4c2feeeb13e607057Daniel Dunbar "-dylib_current_version"); 399102633b541b04ad5ffc1c70f4c2feeeb13e607057Daniel Dunbar 3992a6d38494d18e260958e73bfe5e2b3f1dc4160459Daniel Dunbar AddDarwinArch(Args, CmdArgs); 399302633b541b04ad5ffc1c70f4c2feeeb13e607057Daniel Dunbar 399402633b541b04ad5ffc1c70f4c2feeeb13e607057Daniel Dunbar Args.AddAllArgsTranslated(CmdArgs, options::OPT_install__name, 399502633b541b04ad5ffc1c70f4c2feeeb13e607057Daniel Dunbar "-dylib_install_name"); 399602633b541b04ad5ffc1c70f4c2feeeb13e607057Daniel Dunbar } 399702633b541b04ad5ffc1c70f4c2feeeb13e607057Daniel Dunbar 399802633b541b04ad5ffc1c70f4c2feeeb13e607057Daniel Dunbar Args.AddLastArg(CmdArgs, options::OPT_all__load); 399902633b541b04ad5ffc1c70f4c2feeeb13e607057Daniel Dunbar Args.AddAllArgs(CmdArgs, options::OPT_allowable__client); 400002633b541b04ad5ffc1c70f4c2feeeb13e607057Daniel Dunbar Args.AddLastArg(CmdArgs, options::OPT_bind__at__load); 4001ce911f5fd76375948d18e6528fe7a7314c6e1ac9Daniel Dunbar if (DarwinTC.isTargetIPhoneOS()) 4002d82f8fa53771b454885c546f0fd452a4980b3a3eDaniel Dunbar Args.AddLastArg(CmdArgs, options::OPT_arch__errors__fatal); 400302633b541b04ad5ffc1c70f4c2feeeb13e607057Daniel Dunbar Args.AddLastArg(CmdArgs, options::OPT_dead__strip); 400402633b541b04ad5ffc1c70f4c2feeeb13e607057Daniel Dunbar Args.AddLastArg(CmdArgs, options::OPT_no__dead__strip__inits__and__terms); 400502633b541b04ad5ffc1c70f4c2feeeb13e607057Daniel Dunbar Args.AddAllArgs(CmdArgs, options::OPT_dylib__file); 400602633b541b04ad5ffc1c70f4c2feeeb13e607057Daniel Dunbar Args.AddLastArg(CmdArgs, options::OPT_dynamic); 400702633b541b04ad5ffc1c70f4c2feeeb13e607057Daniel Dunbar Args.AddAllArgs(CmdArgs, options::OPT_exported__symbols__list); 400802633b541b04ad5ffc1c70f4c2feeeb13e607057Daniel Dunbar Args.AddLastArg(CmdArgs, options::OPT_flat__namespace); 400999ca47b21f6b32ea8a92b0c8e0bea18170f86b9eDaniel Dunbar Args.AddAllArgs(CmdArgs, options::OPT_force__load); 401002633b541b04ad5ffc1c70f4c2feeeb13e607057Daniel Dunbar Args.AddAllArgs(CmdArgs, options::OPT_headerpad__max__install__names); 401102633b541b04ad5ffc1c70f4c2feeeb13e607057Daniel Dunbar Args.AddAllArgs(CmdArgs, options::OPT_image__base); 401202633b541b04ad5ffc1c70f4c2feeeb13e607057Daniel Dunbar Args.AddAllArgs(CmdArgs, options::OPT_init); 401302633b541b04ad5ffc1c70f4c2feeeb13e607057Daniel Dunbar 4014ce911f5fd76375948d18e6528fe7a7314c6e1ac9Daniel Dunbar // Add the deployment target. 401509c9a5635f10a7dfa3373ef0941597c16b048362Benjamin Kramer VersionTuple TargetVersion = DarwinTC.getTargetVersion(); 4016b7f5ef73aee479b2fa54c30cfebed665be8fccb9Daniel Dunbar 4017b7f5ef73aee479b2fa54c30cfebed665be8fccb9Daniel Dunbar // If we had an explicit -mios-simulator-version-min argument, honor that, 4018b7f5ef73aee479b2fa54c30cfebed665be8fccb9Daniel Dunbar // otherwise use the traditional deployment targets. We can't just check the 4019b7f5ef73aee479b2fa54c30cfebed665be8fccb9Daniel Dunbar // is-sim attribute because existing code follows this path, and the linker 4020b7f5ef73aee479b2fa54c30cfebed665be8fccb9Daniel Dunbar // may not handle the argument. 4021b7f5ef73aee479b2fa54c30cfebed665be8fccb9Daniel Dunbar // 4022b7f5ef73aee479b2fa54c30cfebed665be8fccb9Daniel Dunbar // FIXME: We may be able to remove this, once we can verify no one depends on 4023b7f5ef73aee479b2fa54c30cfebed665be8fccb9Daniel Dunbar // it. 4024b7f5ef73aee479b2fa54c30cfebed665be8fccb9Daniel Dunbar if (Args.hasArg(options::OPT_mios_simulator_version_min_EQ)) 4025b7f5ef73aee479b2fa54c30cfebed665be8fccb9Daniel Dunbar CmdArgs.push_back("-ios_simulator_version_min"); 4026b7f5ef73aee479b2fa54c30cfebed665be8fccb9Daniel Dunbar else if (DarwinTC.isTargetIPhoneOS()) 4027b7f5ef73aee479b2fa54c30cfebed665be8fccb9Daniel Dunbar CmdArgs.push_back("-iphoneos_version_min"); 4028b7f5ef73aee479b2fa54c30cfebed665be8fccb9Daniel Dunbar else 4029b7f5ef73aee479b2fa54c30cfebed665be8fccb9Daniel Dunbar CmdArgs.push_back("-macosx_version_min"); 403009c9a5635f10a7dfa3373ef0941597c16b048362Benjamin Kramer CmdArgs.push_back(Args.MakeArgString(TargetVersion.getAsString())); 4031ce911f5fd76375948d18e6528fe7a7314c6e1ac9Daniel Dunbar 403202633b541b04ad5ffc1c70f4c2feeeb13e607057Daniel Dunbar Args.AddLastArg(CmdArgs, options::OPT_nomultidefs); 403302633b541b04ad5ffc1c70f4c2feeeb13e607057Daniel Dunbar Args.AddLastArg(CmdArgs, options::OPT_multi__module); 403402633b541b04ad5ffc1c70f4c2feeeb13e607057Daniel Dunbar Args.AddLastArg(CmdArgs, options::OPT_single__module); 403502633b541b04ad5ffc1c70f4c2feeeb13e607057Daniel Dunbar Args.AddAllArgs(CmdArgs, options::OPT_multiply__defined); 403602633b541b04ad5ffc1c70f4c2feeeb13e607057Daniel Dunbar Args.AddAllArgs(CmdArgs, options::OPT_multiply__defined__unused); 4037c21c485b4fb58ef5d55cf3e523263dd824a2ace4Daniel Dunbar 403847e879dfa735f81472a51b1bd69cc4eb9159db39Daniel Dunbar if (const Arg *A = Args.getLastArg(options::OPT_fpie, options::OPT_fPIE, 403947e879dfa735f81472a51b1bd69cc4eb9159db39Daniel Dunbar options::OPT_fno_pie, 404047e879dfa735f81472a51b1bd69cc4eb9159db39Daniel Dunbar options::OPT_fno_PIE)) { 404147e879dfa735f81472a51b1bd69cc4eb9159db39Daniel Dunbar if (A->getOption().matches(options::OPT_fpie) || 404247e879dfa735f81472a51b1bd69cc4eb9159db39Daniel Dunbar A->getOption().matches(options::OPT_fPIE)) 404347e879dfa735f81472a51b1bd69cc4eb9159db39Daniel Dunbar CmdArgs.push_back("-pie"); 404447e879dfa735f81472a51b1bd69cc4eb9159db39Daniel Dunbar else 404547e879dfa735f81472a51b1bd69cc4eb9159db39Daniel Dunbar CmdArgs.push_back("-no_pie"); 404647e879dfa735f81472a51b1bd69cc4eb9159db39Daniel Dunbar } 404702633b541b04ad5ffc1c70f4c2feeeb13e607057Daniel Dunbar 404802633b541b04ad5ffc1c70f4c2feeeb13e607057Daniel Dunbar Args.AddLastArg(CmdArgs, options::OPT_prebind); 404902633b541b04ad5ffc1c70f4c2feeeb13e607057Daniel Dunbar Args.AddLastArg(CmdArgs, options::OPT_noprebind); 405002633b541b04ad5ffc1c70f4c2feeeb13e607057Daniel Dunbar Args.AddLastArg(CmdArgs, options::OPT_nofixprebinding); 405102633b541b04ad5ffc1c70f4c2feeeb13e607057Daniel Dunbar Args.AddLastArg(CmdArgs, options::OPT_prebind__all__twolevel__modules); 405202633b541b04ad5ffc1c70f4c2feeeb13e607057Daniel Dunbar Args.AddLastArg(CmdArgs, options::OPT_read__only__relocs); 405302633b541b04ad5ffc1c70f4c2feeeb13e607057Daniel Dunbar Args.AddAllArgs(CmdArgs, options::OPT_sectcreate); 405402633b541b04ad5ffc1c70f4c2feeeb13e607057Daniel Dunbar Args.AddAllArgs(CmdArgs, options::OPT_sectorder); 405502633b541b04ad5ffc1c70f4c2feeeb13e607057Daniel Dunbar Args.AddAllArgs(CmdArgs, options::OPT_seg1addr); 405602633b541b04ad5ffc1c70f4c2feeeb13e607057Daniel Dunbar Args.AddAllArgs(CmdArgs, options::OPT_segprot); 405702633b541b04ad5ffc1c70f4c2feeeb13e607057Daniel Dunbar Args.AddAllArgs(CmdArgs, options::OPT_segaddr); 405802633b541b04ad5ffc1c70f4c2feeeb13e607057Daniel Dunbar Args.AddAllArgs(CmdArgs, options::OPT_segs__read__only__addr); 405902633b541b04ad5ffc1c70f4c2feeeb13e607057Daniel Dunbar Args.AddAllArgs(CmdArgs, options::OPT_segs__read__write__addr); 406002633b541b04ad5ffc1c70f4c2feeeb13e607057Daniel Dunbar Args.AddAllArgs(CmdArgs, options::OPT_seg__addr__table); 406102633b541b04ad5ffc1c70f4c2feeeb13e607057Daniel Dunbar Args.AddAllArgs(CmdArgs, options::OPT_seg__addr__table__filename); 406202633b541b04ad5ffc1c70f4c2feeeb13e607057Daniel Dunbar Args.AddAllArgs(CmdArgs, options::OPT_sub__library); 406302633b541b04ad5ffc1c70f4c2feeeb13e607057Daniel Dunbar Args.AddAllArgs(CmdArgs, options::OPT_sub__umbrella); 4064d82f8fa53771b454885c546f0fd452a4980b3a3eDaniel Dunbar 4065cc95719054ef9949c88d21c6c8d349dac8b4fd36Daniel Dunbar // Give --sysroot= preference, over the Apple specific behavior to also use 4066cc95719054ef9949c88d21c6c8d349dac8b4fd36Daniel Dunbar // --isysroot as the syslibroot. 40674762a2da74875d2ae94e0d77d38ed964816cce36Sebastian Pop StringRef sysroot = C.getSysRoot(); 40684762a2da74875d2ae94e0d77d38ed964816cce36Sebastian Pop if (sysroot != "") { 4069cc95719054ef9949c88d21c6c8d349dac8b4fd36Daniel Dunbar CmdArgs.push_back("-syslibroot"); 40704762a2da74875d2ae94e0d77d38ed964816cce36Sebastian Pop CmdArgs.push_back(C.getArgs().MakeArgString(sysroot)); 4071cc95719054ef9949c88d21c6c8d349dac8b4fd36Daniel Dunbar } else if (const Arg *A = Args.getLastArg(options::OPT_isysroot)) { 4072cc95719054ef9949c88d21c6c8d349dac8b4fd36Daniel Dunbar CmdArgs.push_back("-syslibroot"); 4073cc95719054ef9949c88d21c6c8d349dac8b4fd36Daniel Dunbar CmdArgs.push_back(A->getValue(Args)); 4074d82f8fa53771b454885c546f0fd452a4980b3a3eDaniel Dunbar } 4075d82f8fa53771b454885c546f0fd452a4980b3a3eDaniel Dunbar 407602633b541b04ad5ffc1c70f4c2feeeb13e607057Daniel Dunbar Args.AddLastArg(CmdArgs, options::OPT_twolevel__namespace); 407702633b541b04ad5ffc1c70f4c2feeeb13e607057Daniel Dunbar Args.AddLastArg(CmdArgs, options::OPT_twolevel__namespace__hints); 407802633b541b04ad5ffc1c70f4c2feeeb13e607057Daniel Dunbar Args.AddAllArgs(CmdArgs, options::OPT_umbrella); 407902633b541b04ad5ffc1c70f4c2feeeb13e607057Daniel Dunbar Args.AddAllArgs(CmdArgs, options::OPT_undefined); 408002633b541b04ad5ffc1c70f4c2feeeb13e607057Daniel Dunbar Args.AddAllArgs(CmdArgs, options::OPT_unexported__symbols__list); 4081d82f8fa53771b454885c546f0fd452a4980b3a3eDaniel Dunbar Args.AddAllArgs(CmdArgs, options::OPT_weak__reference__mismatches); 408202633b541b04ad5ffc1c70f4c2feeeb13e607057Daniel Dunbar Args.AddLastArg(CmdArgs, options::OPT_X_Flag); 408302633b541b04ad5ffc1c70f4c2feeeb13e607057Daniel Dunbar Args.AddAllArgs(CmdArgs, options::OPT_y); 408402633b541b04ad5ffc1c70f4c2feeeb13e607057Daniel Dunbar Args.AddLastArg(CmdArgs, options::OPT_w); 408502633b541b04ad5ffc1c70f4c2feeeb13e607057Daniel Dunbar Args.AddAllArgs(CmdArgs, options::OPT_pagezero__size); 408602633b541b04ad5ffc1c70f4c2feeeb13e607057Daniel Dunbar Args.AddAllArgs(CmdArgs, options::OPT_segs__read__); 408702633b541b04ad5ffc1c70f4c2feeeb13e607057Daniel Dunbar Args.AddLastArg(CmdArgs, options::OPT_seglinkedit); 408802633b541b04ad5ffc1c70f4c2feeeb13e607057Daniel Dunbar Args.AddLastArg(CmdArgs, options::OPT_noseglinkedit); 408902633b541b04ad5ffc1c70f4c2feeeb13e607057Daniel Dunbar Args.AddAllArgs(CmdArgs, options::OPT_sectalign); 409002633b541b04ad5ffc1c70f4c2feeeb13e607057Daniel Dunbar Args.AddAllArgs(CmdArgs, options::OPT_sectobjectsymbols); 409102633b541b04ad5ffc1c70f4c2feeeb13e607057Daniel Dunbar Args.AddAllArgs(CmdArgs, options::OPT_segcreate); 409202633b541b04ad5ffc1c70f4c2feeeb13e607057Daniel Dunbar Args.AddLastArg(CmdArgs, options::OPT_whyload); 409302633b541b04ad5ffc1c70f4c2feeeb13e607057Daniel Dunbar Args.AddLastArg(CmdArgs, options::OPT_whatsloaded); 409402633b541b04ad5ffc1c70f4c2feeeb13e607057Daniel Dunbar Args.AddAllArgs(CmdArgs, options::OPT_dylinker__install__name); 409502633b541b04ad5ffc1c70f4c2feeeb13e607057Daniel Dunbar Args.AddLastArg(CmdArgs, options::OPT_dylinker); 409602633b541b04ad5ffc1c70f4c2feeeb13e607057Daniel Dunbar Args.AddLastArg(CmdArgs, options::OPT_Mach); 409702633b541b04ad5ffc1c70f4c2feeeb13e607057Daniel Dunbar} 409802633b541b04ad5ffc1c70f4c2feeeb13e607057Daniel Dunbar 409902633b541b04ad5ffc1c70f4c2feeeb13e607057Daniel Dunbarvoid darwin::Link::ConstructJob(Compilation &C, const JobAction &JA, 41002fe238ed293bd4bc27af9beb9fa151fad2146fa8Daniel Dunbar const InputInfo &Output, 4101c21c485b4fb58ef5d55cf3e523263dd824a2ace4Daniel Dunbar const InputInfoList &Inputs, 4102c21c485b4fb58ef5d55cf3e523263dd824a2ace4Daniel Dunbar const ArgList &Args, 410302633b541b04ad5ffc1c70f4c2feeeb13e607057Daniel Dunbar const char *LinkingOutput) const { 410402633b541b04ad5ffc1c70f4c2feeeb13e607057Daniel Dunbar assert(Output.getType() == types::TY_Image && "Invalid linker output type."); 4105e0be8b1729d8978de433d229c065830b95d0ae68Daniel Dunbar 410602633b541b04ad5ffc1c70f4c2feeeb13e607057Daniel Dunbar // The logic here is derived from gcc's behavior; most of which 410702633b541b04ad5ffc1c70f4c2feeeb13e607057Daniel Dunbar // comes from specs (starting with link_command). Consult gcc for 410802633b541b04ad5ffc1c70f4c2feeeb13e607057Daniel Dunbar // more information. 410902633b541b04ad5ffc1c70f4c2feeeb13e607057Daniel Dunbar ArgStringList CmdArgs; 411002633b541b04ad5ffc1c70f4c2feeeb13e607057Daniel Dunbar 4111228971738f80de6f02aee0d6f8018f5209cf7c9cArgyrios Kyrtzidis /// Hack(tm) to ignore linking errors when we are doing ARC migration. 4112228971738f80de6f02aee0d6f8018f5209cf7c9cArgyrios Kyrtzidis if (Args.hasArg(options::OPT_ccc_arcmt_check, 4113228971738f80de6f02aee0d6f8018f5209cf7c9cArgyrios Kyrtzidis options::OPT_ccc_arcmt_migrate)) { 4114228971738f80de6f02aee0d6f8018f5209cf7c9cArgyrios Kyrtzidis for (ArgList::const_iterator I = Args.begin(), E = Args.end(); I != E; ++I) 4115228971738f80de6f02aee0d6f8018f5209cf7c9cArgyrios Kyrtzidis (*I)->claim(); 4116228971738f80de6f02aee0d6f8018f5209cf7c9cArgyrios Kyrtzidis const char *Exec = 4117228971738f80de6f02aee0d6f8018f5209cf7c9cArgyrios Kyrtzidis Args.MakeArgString(getToolChain().GetProgramPath("touch")); 4118228971738f80de6f02aee0d6f8018f5209cf7c9cArgyrios Kyrtzidis CmdArgs.push_back(Output.getFilename()); 4119228971738f80de6f02aee0d6f8018f5209cf7c9cArgyrios Kyrtzidis C.addCommand(new Command(JA, *this, Exec, CmdArgs)); 4120228971738f80de6f02aee0d6f8018f5209cf7c9cArgyrios Kyrtzidis return; 4121228971738f80de6f02aee0d6f8018f5209cf7c9cArgyrios Kyrtzidis } 4122228971738f80de6f02aee0d6f8018f5209cf7c9cArgyrios Kyrtzidis 412302633b541b04ad5ffc1c70f4c2feeeb13e607057Daniel Dunbar // I'm not sure why this particular decomposition exists in gcc, but 412402633b541b04ad5ffc1c70f4c2feeeb13e607057Daniel Dunbar // we follow suite for ease of comparison. 4125748de8eda222f087434d8bd703176b316a061341Daniel Dunbar AddLinkArgs(C, Args, CmdArgs); 412602633b541b04ad5ffc1c70f4c2feeeb13e607057Daniel Dunbar 412702633b541b04ad5ffc1c70f4c2feeeb13e607057Daniel Dunbar Args.AddAllArgs(CmdArgs, options::OPT_d_Flag); 412802633b541b04ad5ffc1c70f4c2feeeb13e607057Daniel Dunbar Args.AddAllArgs(CmdArgs, options::OPT_s); 412902633b541b04ad5ffc1c70f4c2feeeb13e607057Daniel Dunbar Args.AddAllArgs(CmdArgs, options::OPT_t); 413002633b541b04ad5ffc1c70f4c2feeeb13e607057Daniel Dunbar Args.AddAllArgs(CmdArgs, options::OPT_Z_Flag); 413102633b541b04ad5ffc1c70f4c2feeeb13e607057Daniel Dunbar Args.AddAllArgs(CmdArgs, options::OPT_u_Group); 413202633b541b04ad5ffc1c70f4c2feeeb13e607057Daniel Dunbar Args.AddAllArgs(CmdArgs, options::OPT_A); 413302633b541b04ad5ffc1c70f4c2feeeb13e607057Daniel Dunbar Args.AddLastArg(CmdArgs, options::OPT_e); 413402633b541b04ad5ffc1c70f4c2feeeb13e607057Daniel Dunbar Args.AddAllArgs(CmdArgs, options::OPT_m_Separate); 413502633b541b04ad5ffc1c70f4c2feeeb13e607057Daniel Dunbar Args.AddAllArgs(CmdArgs, options::OPT_r); 413602633b541b04ad5ffc1c70f4c2feeeb13e607057Daniel Dunbar 4137270073c1e44d073e9732204fc099f280b368fab5Daniel Dunbar // Forward -ObjC when either -ObjC or -ObjC++ is used, to force loading 4138270073c1e44d073e9732204fc099f280b368fab5Daniel Dunbar // members of static archive libraries which implement Objective-C classes or 4139270073c1e44d073e9732204fc099f280b368fab5Daniel Dunbar // categories. 4140270073c1e44d073e9732204fc099f280b368fab5Daniel Dunbar if (Args.hasArg(options::OPT_ObjC) || Args.hasArg(options::OPT_ObjCXX)) 4141270073c1e44d073e9732204fc099f280b368fab5Daniel Dunbar CmdArgs.push_back("-ObjC"); 414220249a1af2e462dcafdd6a350f1c7967b264ff25Michael J. Spencer 414302633b541b04ad5ffc1c70f4c2feeeb13e607057Daniel Dunbar CmdArgs.push_back("-o"); 414402633b541b04ad5ffc1c70f4c2feeeb13e607057Daniel Dunbar CmdArgs.push_back(Output.getFilename()); 414502633b541b04ad5ffc1c70f4c2feeeb13e607057Daniel Dunbar 414602633b541b04ad5ffc1c70f4c2feeeb13e607057Daniel Dunbar if (!Args.hasArg(options::OPT_A) && 414702633b541b04ad5ffc1c70f4c2feeeb13e607057Daniel Dunbar !Args.hasArg(options::OPT_nostdlib) && 414802633b541b04ad5ffc1c70f4c2feeeb13e607057Daniel Dunbar !Args.hasArg(options::OPT_nostartfiles)) { 414902633b541b04ad5ffc1c70f4c2feeeb13e607057Daniel Dunbar // Derived from startfile spec. 415002633b541b04ad5ffc1c70f4c2feeeb13e607057Daniel Dunbar if (Args.hasArg(options::OPT_dynamiclib)) { 4151c21c485b4fb58ef5d55cf3e523263dd824a2ace4Daniel Dunbar // Derived from darwin_dylib1 spec. 41521051fc0ba0fb924d6d4a88a2113460a40a542614Daniel Dunbar if (getDarwinToolChain().isTargetIOSSimulator()) { 41531051fc0ba0fb924d6d4a88a2113460a40a542614Daniel Dunbar // The simulator doesn't have a versioned crt1 file. 41541051fc0ba0fb924d6d4a88a2113460a40a542614Daniel Dunbar CmdArgs.push_back("-ldylib1.o"); 41551051fc0ba0fb924d6d4a88a2113460a40a542614Daniel Dunbar } else if (getDarwinToolChain().isTargetIPhoneOS()) { 4156cacb0f007001f7463d44ebd5dde7bfaecf876a71Daniel Dunbar if (getDarwinToolChain().isIPhoneOSVersionLT(3, 1)) 4157cacb0f007001f7463d44ebd5dde7bfaecf876a71Daniel Dunbar CmdArgs.push_back("-ldylib1.o"); 4158cacb0f007001f7463d44ebd5dde7bfaecf876a71Daniel Dunbar } else { 4159ce3fdf233353b10f20d74dceda3d77a82285de17Daniel Dunbar if (getDarwinToolChain().isMacosxVersionLT(10, 5)) 4160cacb0f007001f7463d44ebd5dde7bfaecf876a71Daniel Dunbar CmdArgs.push_back("-ldylib1.o"); 4161ce3fdf233353b10f20d74dceda3d77a82285de17Daniel Dunbar else if (getDarwinToolChain().isMacosxVersionLT(10, 6)) 4162cacb0f007001f7463d44ebd5dde7bfaecf876a71Daniel Dunbar CmdArgs.push_back("-ldylib1.10.5.o"); 4163cacb0f007001f7463d44ebd5dde7bfaecf876a71Daniel Dunbar } 416402633b541b04ad5ffc1c70f4c2feeeb13e607057Daniel Dunbar } else { 416502633b541b04ad5ffc1c70f4c2feeeb13e607057Daniel Dunbar if (Args.hasArg(options::OPT_bundle)) { 41668a8d8afa3df40e9f122d2b826f1a825a66f6908dDaniel Dunbar if (!Args.hasArg(options::OPT_static)) { 41678a8d8afa3df40e9f122d2b826f1a825a66f6908dDaniel Dunbar // Derived from darwin_bundle1 spec. 41681051fc0ba0fb924d6d4a88a2113460a40a542614Daniel Dunbar if (getDarwinToolChain().isTargetIOSSimulator()) { 41691051fc0ba0fb924d6d4a88a2113460a40a542614Daniel Dunbar // The simulator doesn't have a versioned crt1 file. 41701051fc0ba0fb924d6d4a88a2113460a40a542614Daniel Dunbar CmdArgs.push_back("-lbundle1.o"); 41711051fc0ba0fb924d6d4a88a2113460a40a542614Daniel Dunbar } else if (getDarwinToolChain().isTargetIPhoneOS()) { 4172cacb0f007001f7463d44ebd5dde7bfaecf876a71Daniel Dunbar if (getDarwinToolChain().isIPhoneOSVersionLT(3, 1)) 4173cacb0f007001f7463d44ebd5dde7bfaecf876a71Daniel Dunbar CmdArgs.push_back("-lbundle1.o"); 4174cacb0f007001f7463d44ebd5dde7bfaecf876a71Daniel Dunbar } else { 4175ce3fdf233353b10f20d74dceda3d77a82285de17Daniel Dunbar if (getDarwinToolChain().isMacosxVersionLT(10, 6)) 4176cacb0f007001f7463d44ebd5dde7bfaecf876a71Daniel Dunbar CmdArgs.push_back("-lbundle1.o"); 4177cacb0f007001f7463d44ebd5dde7bfaecf876a71Daniel Dunbar } 41788a8d8afa3df40e9f122d2b826f1a825a66f6908dDaniel Dunbar } 417902633b541b04ad5ffc1c70f4c2feeeb13e607057Daniel Dunbar } else { 4180bbe8e3eff56ac1d79f3668d706536e3cebe28c18Daniel Dunbar if (Args.hasArg(options::OPT_pg) && 4181bbe8e3eff56ac1d79f3668d706536e3cebe28c18Daniel Dunbar getToolChain().SupportsProfiling()) { 418202633b541b04ad5ffc1c70f4c2feeeb13e607057Daniel Dunbar if (Args.hasArg(options::OPT_static) || 418302633b541b04ad5ffc1c70f4c2feeeb13e607057Daniel Dunbar Args.hasArg(options::OPT_object) || 418402633b541b04ad5ffc1c70f4c2feeeb13e607057Daniel Dunbar Args.hasArg(options::OPT_preload)) { 418502633b541b04ad5ffc1c70f4c2feeeb13e607057Daniel Dunbar CmdArgs.push_back("-lgcrt0.o"); 418602633b541b04ad5ffc1c70f4c2feeeb13e607057Daniel Dunbar } else { 418702633b541b04ad5ffc1c70f4c2feeeb13e607057Daniel Dunbar CmdArgs.push_back("-lgcrt1.o"); 4188c21c485b4fb58ef5d55cf3e523263dd824a2ace4Daniel Dunbar 418902633b541b04ad5ffc1c70f4c2feeeb13e607057Daniel Dunbar // darwin_crt2 spec is empty. 4190c21c485b4fb58ef5d55cf3e523263dd824a2ace4Daniel Dunbar } 419102633b541b04ad5ffc1c70f4c2feeeb13e607057Daniel Dunbar } else { 419202633b541b04ad5ffc1c70f4c2feeeb13e607057Daniel Dunbar if (Args.hasArg(options::OPT_static) || 419302633b541b04ad5ffc1c70f4c2feeeb13e607057Daniel Dunbar Args.hasArg(options::OPT_object) || 419402633b541b04ad5ffc1c70f4c2feeeb13e607057Daniel Dunbar Args.hasArg(options::OPT_preload)) { 419502633b541b04ad5ffc1c70f4c2feeeb13e607057Daniel Dunbar CmdArgs.push_back("-lcrt0.o"); 419602633b541b04ad5ffc1c70f4c2feeeb13e607057Daniel Dunbar } else { 419702633b541b04ad5ffc1c70f4c2feeeb13e607057Daniel Dunbar // Derived from darwin_crt1 spec. 41984035580e3475db9013f335ce2b8a49dd1988a79aDaniel Dunbar if (getDarwinToolChain().isTargetIOSSimulator()) { 41994035580e3475db9013f335ce2b8a49dd1988a79aDaniel Dunbar // The simulator doesn't have a versioned crt1 file. 42004035580e3475db9013f335ce2b8a49dd1988a79aDaniel Dunbar CmdArgs.push_back("-lcrt1.o"); 42014035580e3475db9013f335ce2b8a49dd1988a79aDaniel Dunbar } else if (getDarwinToolChain().isTargetIPhoneOS()) { 4202cacb0f007001f7463d44ebd5dde7bfaecf876a71Daniel Dunbar if (getDarwinToolChain().isIPhoneOSVersionLT(3, 1)) 4203cacb0f007001f7463d44ebd5dde7bfaecf876a71Daniel Dunbar CmdArgs.push_back("-lcrt1.o"); 4204cacb0f007001f7463d44ebd5dde7bfaecf876a71Daniel Dunbar else 4205cacb0f007001f7463d44ebd5dde7bfaecf876a71Daniel Dunbar CmdArgs.push_back("-lcrt1.3.1.o"); 4206ce3fdf233353b10f20d74dceda3d77a82285de17Daniel Dunbar } else { 4207ce3fdf233353b10f20d74dceda3d77a82285de17Daniel Dunbar if (getDarwinToolChain().isMacosxVersionLT(10, 5)) 4208ce3fdf233353b10f20d74dceda3d77a82285de17Daniel Dunbar CmdArgs.push_back("-lcrt1.o"); 4209ce3fdf233353b10f20d74dceda3d77a82285de17Daniel Dunbar else if (getDarwinToolChain().isMacosxVersionLT(10, 6)) 4210ce3fdf233353b10f20d74dceda3d77a82285de17Daniel Dunbar CmdArgs.push_back("-lcrt1.10.5.o"); 4211ebcb57a8d298862c65043e88b2429591ab3c58d3Ted Kremenek else if (getDarwinToolChain().isMacosxVersionLT(10, 8)) 4212ce3fdf233353b10f20d74dceda3d77a82285de17Daniel Dunbar CmdArgs.push_back("-lcrt1.10.6.o"); 4213c21c485b4fb58ef5d55cf3e523263dd824a2ace4Daniel Dunbar 4214ce3fdf233353b10f20d74dceda3d77a82285de17Daniel Dunbar // darwin_crt2 spec is empty. 4215ce3fdf233353b10f20d74dceda3d77a82285de17Daniel Dunbar } 421602633b541b04ad5ffc1c70f4c2feeeb13e607057Daniel Dunbar } 421702633b541b04ad5ffc1c70f4c2feeeb13e607057Daniel Dunbar } 421802633b541b04ad5ffc1c70f4c2feeeb13e607057Daniel Dunbar } 421902633b541b04ad5ffc1c70f4c2feeeb13e607057Daniel Dunbar } 422002633b541b04ad5ffc1c70f4c2feeeb13e607057Daniel Dunbar 4221ce3fdf233353b10f20d74dceda3d77a82285de17Daniel Dunbar if (!getDarwinToolChain().isTargetIPhoneOS() && 4222ce3fdf233353b10f20d74dceda3d77a82285de17Daniel Dunbar Args.hasArg(options::OPT_shared_libgcc) && 4223ce3fdf233353b10f20d74dceda3d77a82285de17Daniel Dunbar getDarwinToolChain().isMacosxVersionLT(10, 5)) { 4224881376467c46c5c6cc16fa6790271c2c22e1d4f1Daniel Dunbar const char *Str = 42254a7e88978cf646ad10d654020cb00b3877069210Daniel Dunbar Args.MakeArgString(getToolChain().GetFilePath("crt3.o")); 4226881376467c46c5c6cc16fa6790271c2c22e1d4f1Daniel Dunbar CmdArgs.push_back(Str); 422702633b541b04ad5ffc1c70f4c2feeeb13e607057Daniel Dunbar } 422802633b541b04ad5ffc1c70f4c2feeeb13e607057Daniel Dunbar } 422902633b541b04ad5ffc1c70f4c2feeeb13e607057Daniel Dunbar 423002633b541b04ad5ffc1c70f4c2feeeb13e607057Daniel Dunbar Args.AddAllArgs(CmdArgs, options::OPT_L); 4231c21c485b4fb58ef5d55cf3e523263dd824a2ace4Daniel Dunbar 42327b5f1013c5b7f541dc1fae7fc43189377874eabbKostya Serebryany // If we're building a dynamic lib with -faddress-sanitizer, unresolved 42337b5f1013c5b7f541dc1fae7fc43189377874eabbKostya Serebryany // symbols may appear. Mark all of them as dynamic_lookup. 42347b5f1013c5b7f541dc1fae7fc43189377874eabbKostya Serebryany // Linking executables is handled in lib/Driver/ToolChains.cpp. 42357b5f1013c5b7f541dc1fae7fc43189377874eabbKostya Serebryany if (Args.hasFlag(options::OPT_faddress_sanitizer, 42367b5f1013c5b7f541dc1fae7fc43189377874eabbKostya Serebryany options::OPT_fno_address_sanitizer, false)) { 42377b5f1013c5b7f541dc1fae7fc43189377874eabbKostya Serebryany if (Args.hasArg(options::OPT_dynamiclib) || 42387b5f1013c5b7f541dc1fae7fc43189377874eabbKostya Serebryany Args.hasArg(options::OPT_bundle)) { 42397b5f1013c5b7f541dc1fae7fc43189377874eabbKostya Serebryany CmdArgs.push_back("-undefined"); 42407b5f1013c5b7f541dc1fae7fc43189377874eabbKostya Serebryany CmdArgs.push_back("dynamic_lookup"); 42417b5f1013c5b7f541dc1fae7fc43189377874eabbKostya Serebryany } 42427b5f1013c5b7f541dc1fae7fc43189377874eabbKostya Serebryany } 42437b5f1013c5b7f541dc1fae7fc43189377874eabbKostya Serebryany 424402633b541b04ad5ffc1c70f4c2feeeb13e607057Daniel Dunbar if (Args.hasArg(options::OPT_fopenmp)) 424502633b541b04ad5ffc1c70f4c2feeeb13e607057Daniel Dunbar // This is more complicated in gcc... 424602633b541b04ad5ffc1c70f4c2feeeb13e607057Daniel Dunbar CmdArgs.push_back("-lgomp"); 424702633b541b04ad5ffc1c70f4c2feeeb13e607057Daniel Dunbar 424804e326b3d0ae1a84643b7366ce0ea5137e06ed69Douglas Gregor AddLinkerInputs(getToolChain(), Inputs, Args, CmdArgs); 424904e326b3d0ae1a84643b7366ce0ea5137e06ed69Douglas Gregor 425063d9f3cddee40a3f3e5579e9004b31ec8663b5d9Bob Wilson if (isObjCRuntimeLinked(Args) && 425163d9f3cddee40a3f3e5579e9004b31ec8663b5d9Bob Wilson !Args.hasArg(options::OPT_nostdlib) && 425263d9f3cddee40a3f3e5579e9004b31ec8663b5d9Bob Wilson !Args.hasArg(options::OPT_nodefaultlibs)) { 4253ebcb57a8d298862c65043e88b2429591ab3c58d3Ted Kremenek // Avoid linking compatibility stubs on i386 mac. 4254ebcb57a8d298862c65043e88b2429591ab3c58d3Ted Kremenek if (!getDarwinToolChain().isTargetMacOS() || 4255ebcb57a8d298862c65043e88b2429591ab3c58d3Ted Kremenek getDarwinToolChain().getArchName() != "i386") { 4256ebcb57a8d298862c65043e88b2429591ab3c58d3Ted Kremenek // If we don't have ARC or subscripting runtime support, link in the 4257ebcb57a8d298862c65043e88b2429591ab3c58d3Ted Kremenek // runtime stubs. We have to do this *before* adding any of the normal 4258ebcb57a8d298862c65043e88b2429591ab3c58d3Ted Kremenek // linker inputs so that its initializer gets run first. 4259ebcb57a8d298862c65043e88b2429591ab3c58d3Ted Kremenek ObjCRuntime runtime; 4260ebcb57a8d298862c65043e88b2429591ab3c58d3Ted Kremenek getDarwinToolChain().configureObjCRuntime(runtime); 4261ebcb57a8d298862c65043e88b2429591ab3c58d3Ted Kremenek // We use arclite library for both ARC and subscripting support. 4262ebcb57a8d298862c65043e88b2429591ab3c58d3Ted Kremenek if ((!runtime.HasARC && isObjCAutoRefCount(Args)) || 4263ebcb57a8d298862c65043e88b2429591ab3c58d3Ted Kremenek !runtime.HasSubscripting) 4264ebcb57a8d298862c65043e88b2429591ab3c58d3Ted Kremenek getDarwinToolChain().AddLinkARCArgs(Args, CmdArgs); 4265ebcb57a8d298862c65043e88b2429591ab3c58d3Ted Kremenek } 42660b1c7156844f1e0e37766a64879b1d1d77fc5385Bob Wilson CmdArgs.push_back("-framework"); 42670b1c7156844f1e0e37766a64879b1d1d77fc5385Bob Wilson CmdArgs.push_back("Foundation"); 4268ebcb57a8d298862c65043e88b2429591ab3c58d3Ted Kremenek // Link libobj. 4269ebcb57a8d298862c65043e88b2429591ab3c58d3Ted Kremenek CmdArgs.push_back("-lobjc"); 42709f084a3166b684573ba49df28fc5792bc37d92e1John McCall } 4271c21c485b4fb58ef5d55cf3e523263dd824a2ace4Daniel Dunbar 427202633b541b04ad5ffc1c70f4c2feeeb13e607057Daniel Dunbar if (LinkingOutput) { 427302633b541b04ad5ffc1c70f4c2feeeb13e607057Daniel Dunbar CmdArgs.push_back("-arch_multiple"); 427402633b541b04ad5ffc1c70f4c2feeeb13e607057Daniel Dunbar CmdArgs.push_back("-final_output"); 427502633b541b04ad5ffc1c70f4c2feeeb13e607057Daniel Dunbar CmdArgs.push_back(LinkingOutput); 427602633b541b04ad5ffc1c70f4c2feeeb13e607057Daniel Dunbar } 427702633b541b04ad5ffc1c70f4c2feeeb13e607057Daniel Dunbar 427802633b541b04ad5ffc1c70f4c2feeeb13e607057Daniel Dunbar if (Args.hasArg(options::OPT_fnested_functions)) 427902633b541b04ad5ffc1c70f4c2feeeb13e607057Daniel Dunbar CmdArgs.push_back("-allow_stack_execute"); 4280c21c485b4fb58ef5d55cf3e523263dd824a2ace4Daniel Dunbar 428102633b541b04ad5ffc1c70f4c2feeeb13e607057Daniel Dunbar if (!Args.hasArg(options::OPT_nostdlib) && 428202633b541b04ad5ffc1c70f4c2feeeb13e607057Daniel Dunbar !Args.hasArg(options::OPT_nodefaultlibs)) { 4283ee788e70fcd0adf76103b17c78ac658d4ea30c9bDaniel Dunbar if (getToolChain().getDriver().CCCIsCXX) 4284132e35d2f87895d20e7ea146c8c00404b80221a1Daniel Dunbar getToolChain().AddCXXStdlibLibArgs(Args, CmdArgs); 4285edfa02b85b186e9ea9e0c841539a77ed32ee9148Daniel Dunbar 428602633b541b04ad5ffc1c70f4c2feeeb13e607057Daniel Dunbar // link_ssp spec is empty. 428702633b541b04ad5ffc1c70f4c2feeeb13e607057Daniel Dunbar 42886cd4154b9088fa18ae05d11c0f3140fafd76c734Daniel Dunbar // Let the tool chain choose which runtime library to link. 42896cd4154b9088fa18ae05d11c0f3140fafd76c734Daniel Dunbar getDarwinToolChain().AddLinkRuntimeLibArgs(Args, CmdArgs); 429002633b541b04ad5ffc1c70f4c2feeeb13e607057Daniel Dunbar } 429102633b541b04ad5ffc1c70f4c2feeeb13e607057Daniel Dunbar 429202633b541b04ad5ffc1c70f4c2feeeb13e607057Daniel Dunbar if (!Args.hasArg(options::OPT_A) && 429302633b541b04ad5ffc1c70f4c2feeeb13e607057Daniel Dunbar !Args.hasArg(options::OPT_nostdlib) && 429402633b541b04ad5ffc1c70f4c2feeeb13e607057Daniel Dunbar !Args.hasArg(options::OPT_nostartfiles)) { 429502633b541b04ad5ffc1c70f4c2feeeb13e607057Daniel Dunbar // endfile_spec is empty. 429602633b541b04ad5ffc1c70f4c2feeeb13e607057Daniel Dunbar } 429702633b541b04ad5ffc1c70f4c2feeeb13e607057Daniel Dunbar 429802633b541b04ad5ffc1c70f4c2feeeb13e607057Daniel Dunbar Args.AddAllArgs(CmdArgs, options::OPT_T_Group); 429902633b541b04ad5ffc1c70f4c2feeeb13e607057Daniel Dunbar Args.AddAllArgs(CmdArgs, options::OPT_F); 430002633b541b04ad5ffc1c70f4c2feeeb13e607057Daniel Dunbar 4301c21c485b4fb58ef5d55cf3e523263dd824a2ace4Daniel Dunbar const char *Exec = 43024a7e88978cf646ad10d654020cb00b3877069210Daniel Dunbar Args.MakeArgString(getToolChain().GetProgramPath("ld")); 43032fe238ed293bd4bc27af9beb9fa151fad2146fa8Daniel Dunbar C.addCommand(new Command(JA, *this, Exec, CmdArgs)); 430402633b541b04ad5ffc1c70f4c2feeeb13e607057Daniel Dunbar} 430502633b541b04ad5ffc1c70f4c2feeeb13e607057Daniel Dunbar 4306ff7488dc9a766f94daf54d81b03ab9160d0bfd88Daniel Dunbarvoid darwin::Lipo::ConstructJob(Compilation &C, const JobAction &JA, 43072fe238ed293bd4bc27af9beb9fa151fad2146fa8Daniel Dunbar const InputInfo &Output, 4308c21c485b4fb58ef5d55cf3e523263dd824a2ace4Daniel Dunbar const InputInfoList &Inputs, 4309c21c485b4fb58ef5d55cf3e523263dd824a2ace4Daniel Dunbar const ArgList &Args, 4310ff7488dc9a766f94daf54d81b03ab9160d0bfd88Daniel Dunbar const char *LinkingOutput) const { 4311ff7488dc9a766f94daf54d81b03ab9160d0bfd88Daniel Dunbar ArgStringList CmdArgs; 4312ff7488dc9a766f94daf54d81b03ab9160d0bfd88Daniel Dunbar 4313ff7488dc9a766f94daf54d81b03ab9160d0bfd88Daniel Dunbar CmdArgs.push_back("-create"); 4314ff7488dc9a766f94daf54d81b03ab9160d0bfd88Daniel Dunbar assert(Output.isFilename() && "Unexpected lipo output."); 4315a428df828ea4cc6916ea90dcd9fbbc840776d207Daniel Dunbar 4316a428df828ea4cc6916ea90dcd9fbbc840776d207Daniel Dunbar CmdArgs.push_back("-output"); 4317ff7488dc9a766f94daf54d81b03ab9160d0bfd88Daniel Dunbar CmdArgs.push_back(Output.getFilename()); 4318a428df828ea4cc6916ea90dcd9fbbc840776d207Daniel Dunbar 4319ff7488dc9a766f94daf54d81b03ab9160d0bfd88Daniel Dunbar for (InputInfoList::const_iterator 4320ff7488dc9a766f94daf54d81b03ab9160d0bfd88Daniel Dunbar it = Inputs.begin(), ie = Inputs.end(); it != ie; ++it) { 4321ff7488dc9a766f94daf54d81b03ab9160d0bfd88Daniel Dunbar const InputInfo &II = *it; 4322ff7488dc9a766f94daf54d81b03ab9160d0bfd88Daniel Dunbar assert(II.isFilename() && "Unexpected lipo input."); 4323ff7488dc9a766f94daf54d81b03ab9160d0bfd88Daniel Dunbar CmdArgs.push_back(II.getFilename()); 4324ff7488dc9a766f94daf54d81b03ab9160d0bfd88Daniel Dunbar } 4325c21c485b4fb58ef5d55cf3e523263dd824a2ace4Daniel Dunbar const char *Exec = 43264a7e88978cf646ad10d654020cb00b3877069210Daniel Dunbar Args.MakeArgString(getToolChain().GetProgramPath("lipo")); 43272fe238ed293bd4bc27af9beb9fa151fad2146fa8Daniel Dunbar C.addCommand(new Command(JA, *this, Exec, CmdArgs)); 4328ff7488dc9a766f94daf54d81b03ab9160d0bfd88Daniel Dunbar} 432968a31d406c6dc4382c700d1199b062de2aa7e1daDaniel Dunbar 43306e0f25483b1a801cd1155ea89c2b725feab16332Daniel Dunbarvoid darwin::Dsymutil::ConstructJob(Compilation &C, const JobAction &JA, 43312fe238ed293bd4bc27af9beb9fa151fad2146fa8Daniel Dunbar const InputInfo &Output, 43326e0f25483b1a801cd1155ea89c2b725feab16332Daniel Dunbar const InputInfoList &Inputs, 43336e0f25483b1a801cd1155ea89c2b725feab16332Daniel Dunbar const ArgList &Args, 43346e0f25483b1a801cd1155ea89c2b725feab16332Daniel Dunbar const char *LinkingOutput) const { 43356e0f25483b1a801cd1155ea89c2b725feab16332Daniel Dunbar ArgStringList CmdArgs; 43366e0f25483b1a801cd1155ea89c2b725feab16332Daniel Dunbar 433703e92303e6e9d366ff35388b982eea7f7db33e62Daniel Dunbar CmdArgs.push_back("-o"); 433803e92303e6e9d366ff35388b982eea7f7db33e62Daniel Dunbar CmdArgs.push_back(Output.getFilename()); 433903e92303e6e9d366ff35388b982eea7f7db33e62Daniel Dunbar 43406e0f25483b1a801cd1155ea89c2b725feab16332Daniel Dunbar assert(Inputs.size() == 1 && "Unable to handle multiple inputs."); 43416e0f25483b1a801cd1155ea89c2b725feab16332Daniel Dunbar const InputInfo &Input = Inputs[0]; 43426e0f25483b1a801cd1155ea89c2b725feab16332Daniel Dunbar assert(Input.isFilename() && "Unexpected dsymutil input."); 43436e0f25483b1a801cd1155ea89c2b725feab16332Daniel Dunbar CmdArgs.push_back(Input.getFilename()); 43446e0f25483b1a801cd1155ea89c2b725feab16332Daniel Dunbar 43456e0f25483b1a801cd1155ea89c2b725feab16332Daniel Dunbar const char *Exec = 43464a7e88978cf646ad10d654020cb00b3877069210Daniel Dunbar Args.MakeArgString(getToolChain().GetProgramPath("dsymutil")); 43472fe238ed293bd4bc27af9beb9fa151fad2146fa8Daniel Dunbar C.addCommand(new Command(JA, *this, Exec, CmdArgs)); 43486e0f25483b1a801cd1155ea89c2b725feab16332Daniel Dunbar} 43496e0f25483b1a801cd1155ea89c2b725feab16332Daniel Dunbar 4350f857186fd1995b34185d063a29b11ad4f948519fEric Christophervoid darwin::VerifyDebug::ConstructJob(Compilation &C, const JobAction &JA, 4351f857186fd1995b34185d063a29b11ad4f948519fEric Christopher const InputInfo &Output, 4352f857186fd1995b34185d063a29b11ad4f948519fEric Christopher const InputInfoList &Inputs, 4353f857186fd1995b34185d063a29b11ad4f948519fEric Christopher const ArgList &Args, 4354f857186fd1995b34185d063a29b11ad4f948519fEric Christopher const char *LinkingOutput) const { 4355f857186fd1995b34185d063a29b11ad4f948519fEric Christopher ArgStringList CmdArgs; 4356f857186fd1995b34185d063a29b11ad4f948519fEric Christopher CmdArgs.push_back("--verify"); 43571c79dc4086a5fc754689ace567cb7418ed022fccEric Christopher CmdArgs.push_back("--debug-info"); 43581c79dc4086a5fc754689ace567cb7418ed022fccEric Christopher CmdArgs.push_back("--eh-frame"); 4359b822f72c708e235a135fcaf9eb1dba8c20c6a680Eric Christopher CmdArgs.push_back("--quiet"); 4360f857186fd1995b34185d063a29b11ad4f948519fEric Christopher 4361f857186fd1995b34185d063a29b11ad4f948519fEric Christopher assert(Inputs.size() == 1 && "Unable to handle multiple inputs."); 4362f857186fd1995b34185d063a29b11ad4f948519fEric Christopher const InputInfo &Input = Inputs[0]; 4363f857186fd1995b34185d063a29b11ad4f948519fEric Christopher assert(Input.isFilename() && "Unexpected verify input"); 4364f857186fd1995b34185d063a29b11ad4f948519fEric Christopher 4365f857186fd1995b34185d063a29b11ad4f948519fEric Christopher // Grabbing the output of the earlier dsymutil run. 4366f857186fd1995b34185d063a29b11ad4f948519fEric Christopher CmdArgs.push_back(Input.getFilename()); 4367f857186fd1995b34185d063a29b11ad4f948519fEric Christopher 4368f857186fd1995b34185d063a29b11ad4f948519fEric Christopher const char *Exec = 4369f857186fd1995b34185d063a29b11ad4f948519fEric Christopher Args.MakeArgString(getToolChain().GetProgramPath("dwarfdump")); 4370f857186fd1995b34185d063a29b11ad4f948519fEric Christopher C.addCommand(new Command(JA, *this, Exec, CmdArgs)); 4371f857186fd1995b34185d063a29b11ad4f948519fEric Christopher} 4372f857186fd1995b34185d063a29b11ad4f948519fEric Christopher 437331c4690047f5f362ecf886f1586844b1aef0c4d2David Chisnallvoid solaris::Assemble::ConstructJob(Compilation &C, const JobAction &JA, 437431c4690047f5f362ecf886f1586844b1aef0c4d2David Chisnall const InputInfo &Output, 437531c4690047f5f362ecf886f1586844b1aef0c4d2David Chisnall const InputInfoList &Inputs, 437631c4690047f5f362ecf886f1586844b1aef0c4d2David Chisnall const ArgList &Args, 437731c4690047f5f362ecf886f1586844b1aef0c4d2David Chisnall const char *LinkingOutput) const { 437831c4690047f5f362ecf886f1586844b1aef0c4d2David Chisnall ArgStringList CmdArgs; 437931c4690047f5f362ecf886f1586844b1aef0c4d2David Chisnall 438031c4690047f5f362ecf886f1586844b1aef0c4d2David Chisnall Args.AddAllArgValues(CmdArgs, options::OPT_Wa_COMMA, 438131c4690047f5f362ecf886f1586844b1aef0c4d2David Chisnall options::OPT_Xassembler); 438231c4690047f5f362ecf886f1586844b1aef0c4d2David Chisnall 438331c4690047f5f362ecf886f1586844b1aef0c4d2David Chisnall CmdArgs.push_back("-o"); 438431c4690047f5f362ecf886f1586844b1aef0c4d2David Chisnall CmdArgs.push_back(Output.getFilename()); 438531c4690047f5f362ecf886f1586844b1aef0c4d2David Chisnall 438631c4690047f5f362ecf886f1586844b1aef0c4d2David Chisnall for (InputInfoList::const_iterator 438731c4690047f5f362ecf886f1586844b1aef0c4d2David Chisnall it = Inputs.begin(), ie = Inputs.end(); it != ie; ++it) { 438831c4690047f5f362ecf886f1586844b1aef0c4d2David Chisnall const InputInfo &II = *it; 438931c4690047f5f362ecf886f1586844b1aef0c4d2David Chisnall CmdArgs.push_back(II.getFilename()); 439031c4690047f5f362ecf886f1586844b1aef0c4d2David Chisnall } 439131c4690047f5f362ecf886f1586844b1aef0c4d2David Chisnall 439231c4690047f5f362ecf886f1586844b1aef0c4d2David Chisnall const char *Exec = 439331c4690047f5f362ecf886f1586844b1aef0c4d2David Chisnall Args.MakeArgString(getToolChain().GetProgramPath("as")); 439431c4690047f5f362ecf886f1586844b1aef0c4d2David Chisnall C.addCommand(new Command(JA, *this, Exec, CmdArgs)); 439531c4690047f5f362ecf886f1586844b1aef0c4d2David Chisnall} 439631c4690047f5f362ecf886f1586844b1aef0c4d2David Chisnall 439731c4690047f5f362ecf886f1586844b1aef0c4d2David Chisnall 439831c4690047f5f362ecf886f1586844b1aef0c4d2David Chisnallvoid solaris::Link::ConstructJob(Compilation &C, const JobAction &JA, 439931c4690047f5f362ecf886f1586844b1aef0c4d2David Chisnall const InputInfo &Output, 440031c4690047f5f362ecf886f1586844b1aef0c4d2David Chisnall const InputInfoList &Inputs, 440131c4690047f5f362ecf886f1586844b1aef0c4d2David Chisnall const ArgList &Args, 440231c4690047f5f362ecf886f1586844b1aef0c4d2David Chisnall const char *LinkingOutput) const { 440331c4690047f5f362ecf886f1586844b1aef0c4d2David Chisnall // FIXME: Find a real GCC, don't hard-code versions here 440431c4690047f5f362ecf886f1586844b1aef0c4d2David Chisnall std::string GCCLibPath = "/usr/gcc/4.5/lib/gcc/"; 440531c4690047f5f362ecf886f1586844b1aef0c4d2David Chisnall const llvm::Triple &T = getToolChain().getTriple(); 440631c4690047f5f362ecf886f1586844b1aef0c4d2David Chisnall std::string LibPath = "/usr/lib/"; 440731c4690047f5f362ecf886f1586844b1aef0c4d2David Chisnall llvm::Triple::ArchType Arch = T.getArch(); 440831c4690047f5f362ecf886f1586844b1aef0c4d2David Chisnall switch (Arch) { 440931c4690047f5f362ecf886f1586844b1aef0c4d2David Chisnall case llvm::Triple::x86: 441031c4690047f5f362ecf886f1586844b1aef0c4d2David Chisnall GCCLibPath += ("i386-" + T.getVendorName() + "-" + 441131c4690047f5f362ecf886f1586844b1aef0c4d2David Chisnall T.getOSName()).str() + "/4.5.2/"; 441231c4690047f5f362ecf886f1586844b1aef0c4d2David Chisnall break; 441331c4690047f5f362ecf886f1586844b1aef0c4d2David Chisnall case llvm::Triple::x86_64: 441431c4690047f5f362ecf886f1586844b1aef0c4d2David Chisnall GCCLibPath += ("i386-" + T.getVendorName() + "-" + 441531c4690047f5f362ecf886f1586844b1aef0c4d2David Chisnall T.getOSName()).str(); 441631c4690047f5f362ecf886f1586844b1aef0c4d2David Chisnall GCCLibPath += "/4.5.2/amd64/"; 441731c4690047f5f362ecf886f1586844b1aef0c4d2David Chisnall LibPath += "amd64/"; 441831c4690047f5f362ecf886f1586844b1aef0c4d2David Chisnall break; 441931c4690047f5f362ecf886f1586844b1aef0c4d2David Chisnall default: 442031c4690047f5f362ecf886f1586844b1aef0c4d2David Chisnall assert(0 && "Unsupported architecture"); 442131c4690047f5f362ecf886f1586844b1aef0c4d2David Chisnall } 442231c4690047f5f362ecf886f1586844b1aef0c4d2David Chisnall 442331c4690047f5f362ecf886f1586844b1aef0c4d2David Chisnall ArgStringList CmdArgs; 442431c4690047f5f362ecf886f1586844b1aef0c4d2David Chisnall 442541d476d307973cefddeee5661b0573a2cf1b0f24David Chisnall // Demangle C++ names in errors 442641d476d307973cefddeee5661b0573a2cf1b0f24David Chisnall CmdArgs.push_back("-C"); 442741d476d307973cefddeee5661b0573a2cf1b0f24David Chisnall 442831c4690047f5f362ecf886f1586844b1aef0c4d2David Chisnall if ((!Args.hasArg(options::OPT_nostdlib)) && 442931c4690047f5f362ecf886f1586844b1aef0c4d2David Chisnall (!Args.hasArg(options::OPT_shared))) { 443031c4690047f5f362ecf886f1586844b1aef0c4d2David Chisnall CmdArgs.push_back("-e"); 443131c4690047f5f362ecf886f1586844b1aef0c4d2David Chisnall CmdArgs.push_back("_start"); 443231c4690047f5f362ecf886f1586844b1aef0c4d2David Chisnall } 443331c4690047f5f362ecf886f1586844b1aef0c4d2David Chisnall 443431c4690047f5f362ecf886f1586844b1aef0c4d2David Chisnall if (Args.hasArg(options::OPT_static)) { 443531c4690047f5f362ecf886f1586844b1aef0c4d2David Chisnall CmdArgs.push_back("-Bstatic"); 443631c4690047f5f362ecf886f1586844b1aef0c4d2David Chisnall CmdArgs.push_back("-dn"); 443731c4690047f5f362ecf886f1586844b1aef0c4d2David Chisnall } else { 443831c4690047f5f362ecf886f1586844b1aef0c4d2David Chisnall CmdArgs.push_back("-Bdynamic"); 443931c4690047f5f362ecf886f1586844b1aef0c4d2David Chisnall if (Args.hasArg(options::OPT_shared)) { 444031c4690047f5f362ecf886f1586844b1aef0c4d2David Chisnall CmdArgs.push_back("-shared"); 444131c4690047f5f362ecf886f1586844b1aef0c4d2David Chisnall } else { 444231c4690047f5f362ecf886f1586844b1aef0c4d2David Chisnall CmdArgs.push_back("--dynamic-linker"); 444331c4690047f5f362ecf886f1586844b1aef0c4d2David Chisnall CmdArgs.push_back(Args.MakeArgString(LibPath + "ld.so.1")); 444431c4690047f5f362ecf886f1586844b1aef0c4d2David Chisnall } 444531c4690047f5f362ecf886f1586844b1aef0c4d2David Chisnall } 444631c4690047f5f362ecf886f1586844b1aef0c4d2David Chisnall 444731c4690047f5f362ecf886f1586844b1aef0c4d2David Chisnall if (Output.isFilename()) { 444831c4690047f5f362ecf886f1586844b1aef0c4d2David Chisnall CmdArgs.push_back("-o"); 444931c4690047f5f362ecf886f1586844b1aef0c4d2David Chisnall CmdArgs.push_back(Output.getFilename()); 445031c4690047f5f362ecf886f1586844b1aef0c4d2David Chisnall } else { 445131c4690047f5f362ecf886f1586844b1aef0c4d2David Chisnall assert(Output.isNothing() && "Invalid output."); 445231c4690047f5f362ecf886f1586844b1aef0c4d2David Chisnall } 445331c4690047f5f362ecf886f1586844b1aef0c4d2David Chisnall 445431c4690047f5f362ecf886f1586844b1aef0c4d2David Chisnall if (!Args.hasArg(options::OPT_nostdlib) && 445531c4690047f5f362ecf886f1586844b1aef0c4d2David Chisnall !Args.hasArg(options::OPT_nostartfiles)) { 445631c4690047f5f362ecf886f1586844b1aef0c4d2David Chisnall if (!Args.hasArg(options::OPT_shared)) { 445731c4690047f5f362ecf886f1586844b1aef0c4d2David Chisnall CmdArgs.push_back(Args.MakeArgString(LibPath + "crt1.o")); 445831c4690047f5f362ecf886f1586844b1aef0c4d2David Chisnall CmdArgs.push_back(Args.MakeArgString(LibPath + "crti.o")); 4459165329c1d134d000904d6e08b1d166bf34e05517David Chisnall CmdArgs.push_back(Args.MakeArgString(LibPath + "values-Xa.o")); 446031c4690047f5f362ecf886f1586844b1aef0c4d2David Chisnall CmdArgs.push_back(Args.MakeArgString(GCCLibPath + "crtbegin.o")); 446131c4690047f5f362ecf886f1586844b1aef0c4d2David Chisnall } else { 446231c4690047f5f362ecf886f1586844b1aef0c4d2David Chisnall CmdArgs.push_back(Args.MakeArgString(LibPath + "crti.o")); 4463165329c1d134d000904d6e08b1d166bf34e05517David Chisnall CmdArgs.push_back(Args.MakeArgString(LibPath + "values-Xa.o")); 4464165329c1d134d000904d6e08b1d166bf34e05517David Chisnall CmdArgs.push_back(Args.MakeArgString(GCCLibPath + "crtbegin.o")); 446531c4690047f5f362ecf886f1586844b1aef0c4d2David Chisnall } 4466e6dd683d99b14ff8cd886cd81e6588cd1883ca52David Chisnall if (getToolChain().getDriver().CCCIsCXX) 4467e6dd683d99b14ff8cd886cd81e6588cd1883ca52David Chisnall CmdArgs.push_back(Args.MakeArgString(LibPath + "cxa_finalize.o")); 446831c4690047f5f362ecf886f1586844b1aef0c4d2David Chisnall } 446931c4690047f5f362ecf886f1586844b1aef0c4d2David Chisnall 447031c4690047f5f362ecf886f1586844b1aef0c4d2David Chisnall CmdArgs.push_back(Args.MakeArgString("-L" + GCCLibPath)); 447131c4690047f5f362ecf886f1586844b1aef0c4d2David Chisnall 447231c4690047f5f362ecf886f1586844b1aef0c4d2David Chisnall Args.AddAllArgs(CmdArgs, options::OPT_L); 447331c4690047f5f362ecf886f1586844b1aef0c4d2David Chisnall Args.AddAllArgs(CmdArgs, options::OPT_T_Group); 447431c4690047f5f362ecf886f1586844b1aef0c4d2David Chisnall Args.AddAllArgs(CmdArgs, options::OPT_e); 4475165329c1d134d000904d6e08b1d166bf34e05517David Chisnall Args.AddAllArgs(CmdArgs, options::OPT_r); 447631c4690047f5f362ecf886f1586844b1aef0c4d2David Chisnall 447731c4690047f5f362ecf886f1586844b1aef0c4d2David Chisnall AddLinkerInputs(getToolChain(), Inputs, Args, CmdArgs); 447831c4690047f5f362ecf886f1586844b1aef0c4d2David Chisnall 447931c4690047f5f362ecf886f1586844b1aef0c4d2David Chisnall if (!Args.hasArg(options::OPT_nostdlib) && 448031c4690047f5f362ecf886f1586844b1aef0c4d2David Chisnall !Args.hasArg(options::OPT_nodefaultlibs)) { 4481e58e6f9114e61f0e490b5dc1c4f20b23a30f12dcDavid Chisnall if (getToolChain().getDriver().CCCIsCXX) 4482e58e6f9114e61f0e490b5dc1c4f20b23a30f12dcDavid Chisnall getToolChain().AddCXXStdlibLibArgs(Args, CmdArgs); 4483b622959527c07cc6b68739eac1412f75f0ca77faDavid Chisnall CmdArgs.push_back("-lgcc_s"); 4484165329c1d134d000904d6e08b1d166bf34e05517David Chisnall if (!Args.hasArg(options::OPT_shared)) { 4485165329c1d134d000904d6e08b1d166bf34e05517David Chisnall CmdArgs.push_back("-lgcc"); 448631c4690047f5f362ecf886f1586844b1aef0c4d2David Chisnall CmdArgs.push_back("-lc"); 44877dbefe1b1ffbe1d69cc94d07368065976baa49a1David Chisnall CmdArgs.push_back("-lm"); 4488165329c1d134d000904d6e08b1d166bf34e05517David Chisnall } 448931c4690047f5f362ecf886f1586844b1aef0c4d2David Chisnall } 449031c4690047f5f362ecf886f1586844b1aef0c4d2David Chisnall 449131c4690047f5f362ecf886f1586844b1aef0c4d2David Chisnall if (!Args.hasArg(options::OPT_nostdlib) && 449231c4690047f5f362ecf886f1586844b1aef0c4d2David Chisnall !Args.hasArg(options::OPT_nostartfiles)) { 4493165329c1d134d000904d6e08b1d166bf34e05517David Chisnall CmdArgs.push_back(Args.MakeArgString(GCCLibPath + "crtend.o")); 449431c4690047f5f362ecf886f1586844b1aef0c4d2David Chisnall } 4495d1ac03ebac3ab5a8456b955e3f8634f786843f9aDavid Chisnall CmdArgs.push_back(Args.MakeArgString(LibPath + "crtn.o")); 449631c4690047f5f362ecf886f1586844b1aef0c4d2David Chisnall 449731c4690047f5f362ecf886f1586844b1aef0c4d2David Chisnall addProfileRT(getToolChain(), Args, CmdArgs, getToolChain().getTriple()); 449831c4690047f5f362ecf886f1586844b1aef0c4d2David Chisnall 449931c4690047f5f362ecf886f1586844b1aef0c4d2David Chisnall const char *Exec = 450031c4690047f5f362ecf886f1586844b1aef0c4d2David Chisnall Args.MakeArgString(getToolChain().GetProgramPath("ld")); 450131c4690047f5f362ecf886f1586844b1aef0c4d2David Chisnall C.addCommand(new Command(JA, *this, Exec, CmdArgs)); 450231c4690047f5f362ecf886f1586844b1aef0c4d2David Chisnall} 450331c4690047f5f362ecf886f1586844b1aef0c4d2David Chisnall 4504e7925a075f110ab21afeae084670a155dea568e3Edward O'Callaghanvoid auroraux::Assemble::ConstructJob(Compilation &C, const JobAction &JA, 45052fe238ed293bd4bc27af9beb9fa151fad2146fa8Daniel Dunbar const InputInfo &Output, 4506294691eb1caf551083acd7b08630ef21c3fd760dDaniel Dunbar const InputInfoList &Inputs, 4507294691eb1caf551083acd7b08630ef21c3fd760dDaniel Dunbar const ArgList &Args, 4508294691eb1caf551083acd7b08630ef21c3fd760dDaniel Dunbar const char *LinkingOutput) const { 4509e7925a075f110ab21afeae084670a155dea568e3Edward O'Callaghan ArgStringList CmdArgs; 4510e7925a075f110ab21afeae084670a155dea568e3Edward O'Callaghan 4511e7925a075f110ab21afeae084670a155dea568e3Edward O'Callaghan Args.AddAllArgValues(CmdArgs, options::OPT_Wa_COMMA, 4512e7925a075f110ab21afeae084670a155dea568e3Edward O'Callaghan options::OPT_Xassembler); 4513e7925a075f110ab21afeae084670a155dea568e3Edward O'Callaghan 4514e7925a075f110ab21afeae084670a155dea568e3Edward O'Callaghan CmdArgs.push_back("-o"); 45157c1e46533cae07216e2a67d5636a5afb44253155Daniel Dunbar CmdArgs.push_back(Output.getFilename()); 4516e7925a075f110ab21afeae084670a155dea568e3Edward O'Callaghan 4517e7925a075f110ab21afeae084670a155dea568e3Edward O'Callaghan for (InputInfoList::const_iterator 4518e7925a075f110ab21afeae084670a155dea568e3Edward O'Callaghan it = Inputs.begin(), ie = Inputs.end(); it != ie; ++it) { 4519e7925a075f110ab21afeae084670a155dea568e3Edward O'Callaghan const InputInfo &II = *it; 45207c1e46533cae07216e2a67d5636a5afb44253155Daniel Dunbar CmdArgs.push_back(II.getFilename()); 4521e7925a075f110ab21afeae084670a155dea568e3Edward O'Callaghan } 4522e7925a075f110ab21afeae084670a155dea568e3Edward O'Callaghan 4523e7925a075f110ab21afeae084670a155dea568e3Edward O'Callaghan const char *Exec = 45244a7e88978cf646ad10d654020cb00b3877069210Daniel Dunbar Args.MakeArgString(getToolChain().GetProgramPath("gas")); 45252fe238ed293bd4bc27af9beb9fa151fad2146fa8Daniel Dunbar C.addCommand(new Command(JA, *this, Exec, CmdArgs)); 4526e7925a075f110ab21afeae084670a155dea568e3Edward O'Callaghan} 4527e7925a075f110ab21afeae084670a155dea568e3Edward O'Callaghan 4528e7925a075f110ab21afeae084670a155dea568e3Edward O'Callaghanvoid auroraux::Link::ConstructJob(Compilation &C, const JobAction &JA, 45292fe238ed293bd4bc27af9beb9fa151fad2146fa8Daniel Dunbar const InputInfo &Output, 4530294691eb1caf551083acd7b08630ef21c3fd760dDaniel Dunbar const InputInfoList &Inputs, 4531294691eb1caf551083acd7b08630ef21c3fd760dDaniel Dunbar const ArgList &Args, 4532294691eb1caf551083acd7b08630ef21c3fd760dDaniel Dunbar const char *LinkingOutput) const { 4533e7925a075f110ab21afeae084670a155dea568e3Edward O'Callaghan ArgStringList CmdArgs; 4534e7925a075f110ab21afeae084670a155dea568e3Edward O'Callaghan 4535e7925a075f110ab21afeae084670a155dea568e3Edward O'Callaghan if ((!Args.hasArg(options::OPT_nostdlib)) && 4536294691eb1caf551083acd7b08630ef21c3fd760dDaniel Dunbar (!Args.hasArg(options::OPT_shared))) { 4537e7925a075f110ab21afeae084670a155dea568e3Edward O'Callaghan CmdArgs.push_back("-e"); 45387adf94906e23eae295a006659c55eab9ffcf8b37Edward O'Callaghan CmdArgs.push_back("_start"); 4539e7925a075f110ab21afeae084670a155dea568e3Edward O'Callaghan } 4540e7925a075f110ab21afeae084670a155dea568e3Edward O'Callaghan 4541e7925a075f110ab21afeae084670a155dea568e3Edward O'Callaghan if (Args.hasArg(options::OPT_static)) { 4542e7925a075f110ab21afeae084670a155dea568e3Edward O'Callaghan CmdArgs.push_back("-Bstatic"); 45437adf94906e23eae295a006659c55eab9ffcf8b37Edward O'Callaghan CmdArgs.push_back("-dn"); 4544e7925a075f110ab21afeae084670a155dea568e3Edward O'Callaghan } else { 45457adf94906e23eae295a006659c55eab9ffcf8b37Edward O'Callaghan// CmdArgs.push_back("--eh-frame-hdr"); 4546e7925a075f110ab21afeae084670a155dea568e3Edward O'Callaghan CmdArgs.push_back("-Bdynamic"); 4547e7925a075f110ab21afeae084670a155dea568e3Edward O'Callaghan if (Args.hasArg(options::OPT_shared)) { 4548e7925a075f110ab21afeae084670a155dea568e3Edward O'Callaghan CmdArgs.push_back("-shared"); 4549e7925a075f110ab21afeae084670a155dea568e3Edward O'Callaghan } else { 45503cecc19f606ba1000da885b8ff4c089abad224ddEdward O'Callaghan CmdArgs.push_back("--dynamic-linker"); 4551e7925a075f110ab21afeae084670a155dea568e3Edward O'Callaghan CmdArgs.push_back("/lib/ld.so.1"); // 64Bit Path /lib/amd64/ld.so.1 4552e7925a075f110ab21afeae084670a155dea568e3Edward O'Callaghan } 4553e7925a075f110ab21afeae084670a155dea568e3Edward O'Callaghan } 4554e7925a075f110ab21afeae084670a155dea568e3Edward O'Callaghan 45557c1e46533cae07216e2a67d5636a5afb44253155Daniel Dunbar if (Output.isFilename()) { 4556e7925a075f110ab21afeae084670a155dea568e3Edward O'Callaghan CmdArgs.push_back("-o"); 4557e7925a075f110ab21afeae084670a155dea568e3Edward O'Callaghan CmdArgs.push_back(Output.getFilename()); 4558e7925a075f110ab21afeae084670a155dea568e3Edward O'Callaghan } else { 4559e7925a075f110ab21afeae084670a155dea568e3Edward O'Callaghan assert(Output.isNothing() && "Invalid output."); 4560e7925a075f110ab21afeae084670a155dea568e3Edward O'Callaghan } 4561e7925a075f110ab21afeae084670a155dea568e3Edward O'Callaghan 4562e7925a075f110ab21afeae084670a155dea568e3Edward O'Callaghan if (!Args.hasArg(options::OPT_nostdlib) && 4563e7925a075f110ab21afeae084670a155dea568e3Edward O'Callaghan !Args.hasArg(options::OPT_nostartfiles)) { 4564e7925a075f110ab21afeae084670a155dea568e3Edward O'Callaghan if (!Args.hasArg(options::OPT_shared)) { 456538e317d6dce161b249508686cc67eb7176958762Chris Lattner CmdArgs.push_back(Args.MakeArgString( 45664a7e88978cf646ad10d654020cb00b3877069210Daniel Dunbar getToolChain().GetFilePath("crt1.o"))); 456738e317d6dce161b249508686cc67eb7176958762Chris Lattner CmdArgs.push_back(Args.MakeArgString( 45684a7e88978cf646ad10d654020cb00b3877069210Daniel Dunbar getToolChain().GetFilePath("crti.o"))); 456938e317d6dce161b249508686cc67eb7176958762Chris Lattner CmdArgs.push_back(Args.MakeArgString( 45704a7e88978cf646ad10d654020cb00b3877069210Daniel Dunbar getToolChain().GetFilePath("crtbegin.o"))); 4571e7925a075f110ab21afeae084670a155dea568e3Edward O'Callaghan } else { 457238e317d6dce161b249508686cc67eb7176958762Chris Lattner CmdArgs.push_back(Args.MakeArgString( 45734a7e88978cf646ad10d654020cb00b3877069210Daniel Dunbar getToolChain().GetFilePath("crti.o"))); 4574e7925a075f110ab21afeae084670a155dea568e3Edward O'Callaghan } 457538e317d6dce161b249508686cc67eb7176958762Chris Lattner CmdArgs.push_back(Args.MakeArgString( 45764a7e88978cf646ad10d654020cb00b3877069210Daniel Dunbar getToolChain().GetFilePath("crtn.o"))); 4577e7925a075f110ab21afeae084670a155dea568e3Edward O'Callaghan } 4578e7925a075f110ab21afeae084670a155dea568e3Edward O'Callaghan 4579294691eb1caf551083acd7b08630ef21c3fd760dDaniel Dunbar CmdArgs.push_back(Args.MakeArgString("-L/opt/gcc4/lib/gcc/" 4580294691eb1caf551083acd7b08630ef21c3fd760dDaniel Dunbar + getToolChain().getTripleString() 4581f7fb31f4751c9c5ac3d9f93c19ec05a74dd9546fDaniel Dunbar + "/4.2.4")); 4582e7925a075f110ab21afeae084670a155dea568e3Edward O'Callaghan 4583e7925a075f110ab21afeae084670a155dea568e3Edward O'Callaghan Args.AddAllArgs(CmdArgs, options::OPT_L); 4584e7925a075f110ab21afeae084670a155dea568e3Edward O'Callaghan Args.AddAllArgs(CmdArgs, options::OPT_T_Group); 4585e7925a075f110ab21afeae084670a155dea568e3Edward O'Callaghan Args.AddAllArgs(CmdArgs, options::OPT_e); 4586e7925a075f110ab21afeae084670a155dea568e3Edward O'Callaghan 45872008feead855f08500fb01ff43ef5eebee05d1e5Daniel Dunbar AddLinkerInputs(getToolChain(), Inputs, Args, CmdArgs); 4588e7925a075f110ab21afeae084670a155dea568e3Edward O'Callaghan 4589e7925a075f110ab21afeae084670a155dea568e3Edward O'Callaghan if (!Args.hasArg(options::OPT_nostdlib) && 4590e7925a075f110ab21afeae084670a155dea568e3Edward O'Callaghan !Args.hasArg(options::OPT_nodefaultlibs)) { 4591e7925a075f110ab21afeae084670a155dea568e3Edward O'Callaghan // FIXME: For some reason GCC passes -lgcc before adding 4592e7925a075f110ab21afeae084670a155dea568e3Edward O'Callaghan // the default system libraries. Just mimic this for now. 4593e7925a075f110ab21afeae084670a155dea568e3Edward O'Callaghan CmdArgs.push_back("-lgcc"); 4594e7925a075f110ab21afeae084670a155dea568e3Edward O'Callaghan 4595e7925a075f110ab21afeae084670a155dea568e3Edward O'Callaghan if (Args.hasArg(options::OPT_pthread)) 4596e7925a075f110ab21afeae084670a155dea568e3Edward O'Callaghan CmdArgs.push_back("-pthread"); 4597e7925a075f110ab21afeae084670a155dea568e3Edward O'Callaghan if (!Args.hasArg(options::OPT_shared)) 4598e7925a075f110ab21afeae084670a155dea568e3Edward O'Callaghan CmdArgs.push_back("-lc"); 4599e7925a075f110ab21afeae084670a155dea568e3Edward O'Callaghan CmdArgs.push_back("-lgcc"); 4600e7925a075f110ab21afeae084670a155dea568e3Edward O'Callaghan } 4601e7925a075f110ab21afeae084670a155dea568e3Edward O'Callaghan 4602e7925a075f110ab21afeae084670a155dea568e3Edward O'Callaghan if (!Args.hasArg(options::OPT_nostdlib) && 4603e7925a075f110ab21afeae084670a155dea568e3Edward O'Callaghan !Args.hasArg(options::OPT_nostartfiles)) { 4604e7925a075f110ab21afeae084670a155dea568e3Edward O'Callaghan if (!Args.hasArg(options::OPT_shared)) 460538e317d6dce161b249508686cc67eb7176958762Chris Lattner CmdArgs.push_back(Args.MakeArgString( 46064a7e88978cf646ad10d654020cb00b3877069210Daniel Dunbar getToolChain().GetFilePath("crtend.o"))); 4607e7925a075f110ab21afeae084670a155dea568e3Edward O'Callaghan } 4608e7925a075f110ab21afeae084670a155dea568e3Edward O'Callaghan 46093f4be6fb8872942f567166ab8d99c89885f26103Bill Wendling addProfileRT(getToolChain(), Args, CmdArgs, getToolChain().getTriple()); 46102e95a6d7d0b5aed39747875d7474c27824f7319fNick Lewycky 4611e7925a075f110ab21afeae084670a155dea568e3Edward O'Callaghan const char *Exec = 46124a7e88978cf646ad10d654020cb00b3877069210Daniel Dunbar Args.MakeArgString(getToolChain().GetProgramPath("ld")); 46132fe238ed293bd4bc27af9beb9fa151fad2146fa8Daniel Dunbar C.addCommand(new Command(JA, *this, Exec, CmdArgs)); 4614e7925a075f110ab21afeae084670a155dea568e3Edward O'Callaghan} 4615e7925a075f110ab21afeae084670a155dea568e3Edward O'Callaghan 4616f7b8eec37c8c8012fa525c71fb29a58c9f29beefDaniel Dunbarvoid openbsd::Assemble::ConstructJob(Compilation &C, const JobAction &JA, 46172fe238ed293bd4bc27af9beb9fa151fad2146fa8Daniel Dunbar const InputInfo &Output, 4618f7b8eec37c8c8012fa525c71fb29a58c9f29beefDaniel Dunbar const InputInfoList &Inputs, 4619f7b8eec37c8c8012fa525c71fb29a58c9f29beefDaniel Dunbar const ArgList &Args, 46201eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump const char *LinkingOutput) const { 4621f7b8eec37c8c8012fa525c71fb29a58c9f29beefDaniel Dunbar ArgStringList CmdArgs; 4622f7b8eec37c8c8012fa525c71fb29a58c9f29beefDaniel Dunbar 4623f7b8eec37c8c8012fa525c71fb29a58c9f29beefDaniel Dunbar Args.AddAllArgValues(CmdArgs, options::OPT_Wa_COMMA, 4624f7b8eec37c8c8012fa525c71fb29a58c9f29beefDaniel Dunbar options::OPT_Xassembler); 4625f7b8eec37c8c8012fa525c71fb29a58c9f29beefDaniel Dunbar 4626f7b8eec37c8c8012fa525c71fb29a58c9f29beefDaniel Dunbar CmdArgs.push_back("-o"); 46277c1e46533cae07216e2a67d5636a5afb44253155Daniel Dunbar CmdArgs.push_back(Output.getFilename()); 4628f7b8eec37c8c8012fa525c71fb29a58c9f29beefDaniel Dunbar 4629f7b8eec37c8c8012fa525c71fb29a58c9f29beefDaniel Dunbar for (InputInfoList::const_iterator 4630f7b8eec37c8c8012fa525c71fb29a58c9f29beefDaniel Dunbar it = Inputs.begin(), ie = Inputs.end(); it != ie; ++it) { 4631f7b8eec37c8c8012fa525c71fb29a58c9f29beefDaniel Dunbar const InputInfo &II = *it; 46327c1e46533cae07216e2a67d5636a5afb44253155Daniel Dunbar CmdArgs.push_back(II.getFilename()); 4633f7b8eec37c8c8012fa525c71fb29a58c9f29beefDaniel Dunbar } 4634f7b8eec37c8c8012fa525c71fb29a58c9f29beefDaniel Dunbar 4635f7b8eec37c8c8012fa525c71fb29a58c9f29beefDaniel Dunbar const char *Exec = 46364a7e88978cf646ad10d654020cb00b3877069210Daniel Dunbar Args.MakeArgString(getToolChain().GetProgramPath("as")); 46372fe238ed293bd4bc27af9beb9fa151fad2146fa8Daniel Dunbar C.addCommand(new Command(JA, *this, Exec, CmdArgs)); 4638f7b8eec37c8c8012fa525c71fb29a58c9f29beefDaniel Dunbar} 4639f7b8eec37c8c8012fa525c71fb29a58c9f29beefDaniel Dunbar 4640f7b8eec37c8c8012fa525c71fb29a58c9f29beefDaniel Dunbarvoid openbsd::Link::ConstructJob(Compilation &C, const JobAction &JA, 46412fe238ed293bd4bc27af9beb9fa151fad2146fa8Daniel Dunbar const InputInfo &Output, 4642f7b8eec37c8c8012fa525c71fb29a58c9f29beefDaniel Dunbar const InputInfoList &Inputs, 4643f7b8eec37c8c8012fa525c71fb29a58c9f29beefDaniel Dunbar const ArgList &Args, 4644f7b8eec37c8c8012fa525c71fb29a58c9f29beefDaniel Dunbar const char *LinkingOutput) const { 4645ee788e70fcd0adf76103b17c78ac658d4ea30c9bDaniel Dunbar const Driver &D = getToolChain().getDriver(); 4646f7b8eec37c8c8012fa525c71fb29a58c9f29beefDaniel Dunbar ArgStringList CmdArgs; 4647f7b8eec37c8c8012fa525c71fb29a58c9f29beefDaniel Dunbar 46482bbcf669742b6b27748414e22f8042236fceef65Daniel Dunbar if ((!Args.hasArg(options::OPT_nostdlib)) && 4649294691eb1caf551083acd7b08630ef21c3fd760dDaniel Dunbar (!Args.hasArg(options::OPT_shared))) { 46502bbcf669742b6b27748414e22f8042236fceef65Daniel Dunbar CmdArgs.push_back("-e"); 46512bbcf669742b6b27748414e22f8042236fceef65Daniel Dunbar CmdArgs.push_back("__start"); 46522bbcf669742b6b27748414e22f8042236fceef65Daniel Dunbar } 46532bbcf669742b6b27748414e22f8042236fceef65Daniel Dunbar 4654f7b8eec37c8c8012fa525c71fb29a58c9f29beefDaniel Dunbar if (Args.hasArg(options::OPT_static)) { 4655f7b8eec37c8c8012fa525c71fb29a58c9f29beefDaniel Dunbar CmdArgs.push_back("-Bstatic"); 4656f7b8eec37c8c8012fa525c71fb29a58c9f29beefDaniel Dunbar } else { 465765ba55da577b23b24513b815031fc870d1d27971Rafael Espindola if (Args.hasArg(options::OPT_rdynamic)) 465865ba55da577b23b24513b815031fc870d1d27971Rafael Espindola CmdArgs.push_back("-export-dynamic"); 4659f7b8eec37c8c8012fa525c71fb29a58c9f29beefDaniel Dunbar CmdArgs.push_back("--eh-frame-hdr"); 46602bbcf669742b6b27748414e22f8042236fceef65Daniel Dunbar CmdArgs.push_back("-Bdynamic"); 4661f7b8eec37c8c8012fa525c71fb29a58c9f29beefDaniel Dunbar if (Args.hasArg(options::OPT_shared)) { 46622bbcf669742b6b27748414e22f8042236fceef65Daniel Dunbar CmdArgs.push_back("-shared"); 4663f7b8eec37c8c8012fa525c71fb29a58c9f29beefDaniel Dunbar } else { 4664f7b8eec37c8c8012fa525c71fb29a58c9f29beefDaniel Dunbar CmdArgs.push_back("-dynamic-linker"); 4665f7b8eec37c8c8012fa525c71fb29a58c9f29beefDaniel Dunbar CmdArgs.push_back("/usr/libexec/ld.so"); 4666f7b8eec37c8c8012fa525c71fb29a58c9f29beefDaniel Dunbar } 4667f7b8eec37c8c8012fa525c71fb29a58c9f29beefDaniel Dunbar } 4668f7b8eec37c8c8012fa525c71fb29a58c9f29beefDaniel Dunbar 46697c1e46533cae07216e2a67d5636a5afb44253155Daniel Dunbar if (Output.isFilename()) { 4670f7b8eec37c8c8012fa525c71fb29a58c9f29beefDaniel Dunbar CmdArgs.push_back("-o"); 4671f7b8eec37c8c8012fa525c71fb29a58c9f29beefDaniel Dunbar CmdArgs.push_back(Output.getFilename()); 4672f7b8eec37c8c8012fa525c71fb29a58c9f29beefDaniel Dunbar } else { 4673f7b8eec37c8c8012fa525c71fb29a58c9f29beefDaniel Dunbar assert(Output.isNothing() && "Invalid output."); 4674f7b8eec37c8c8012fa525c71fb29a58c9f29beefDaniel Dunbar } 4675f7b8eec37c8c8012fa525c71fb29a58c9f29beefDaniel Dunbar 4676f7b8eec37c8c8012fa525c71fb29a58c9f29beefDaniel Dunbar if (!Args.hasArg(options::OPT_nostdlib) && 4677f7b8eec37c8c8012fa525c71fb29a58c9f29beefDaniel Dunbar !Args.hasArg(options::OPT_nostartfiles)) { 4678f7b8eec37c8c8012fa525c71fb29a58c9f29beefDaniel Dunbar if (!Args.hasArg(options::OPT_shared)) { 467962d829abaf61d70483a5a584059440a549a306bfEli Friedman if (Args.hasArg(options::OPT_pg)) 468062d829abaf61d70483a5a584059440a549a306bfEli Friedman CmdArgs.push_back(Args.MakeArgString( 468162d829abaf61d70483a5a584059440a549a306bfEli Friedman getToolChain().GetFilePath("gcrt0.o"))); 468262d829abaf61d70483a5a584059440a549a306bfEli Friedman else 468362d829abaf61d70483a5a584059440a549a306bfEli Friedman CmdArgs.push_back(Args.MakeArgString( 468462d829abaf61d70483a5a584059440a549a306bfEli Friedman getToolChain().GetFilePath("crt0.o"))); 468538e317d6dce161b249508686cc67eb7176958762Chris Lattner CmdArgs.push_back(Args.MakeArgString( 46864a7e88978cf646ad10d654020cb00b3877069210Daniel Dunbar getToolChain().GetFilePath("crtbegin.o"))); 4687f7b8eec37c8c8012fa525c71fb29a58c9f29beefDaniel Dunbar } else { 468838e317d6dce161b249508686cc67eb7176958762Chris Lattner CmdArgs.push_back(Args.MakeArgString( 46894a7e88978cf646ad10d654020cb00b3877069210Daniel Dunbar getToolChain().GetFilePath("crtbeginS.o"))); 4690f7b8eec37c8c8012fa525c71fb29a58c9f29beefDaniel Dunbar } 4691f7b8eec37c8c8012fa525c71fb29a58c9f29beefDaniel Dunbar } 4692f7b8eec37c8c8012fa525c71fb29a58c9f29beefDaniel Dunbar 4693e7e18200e614a5e619602a088544c85ac8305a1fEdward O'Callaghan std::string Triple = getToolChain().getTripleString(); 4694e7e18200e614a5e619602a088544c85ac8305a1fEdward O'Callaghan if (Triple.substr(0, 6) == "x86_64") 4695294691eb1caf551083acd7b08630ef21c3fd760dDaniel Dunbar Triple.replace(0, 6, "amd64"); 4696f7fb31f4751c9c5ac3d9f93c19ec05a74dd9546fDaniel Dunbar CmdArgs.push_back(Args.MakeArgString("-L/usr/lib/gcc-lib/" + Triple + 469795c0457054518102af6250e718a13a5b2ee5dbeaDaniel Dunbar "/4.2.1")); 46982bbcf669742b6b27748414e22f8042236fceef65Daniel Dunbar 4699f7b8eec37c8c8012fa525c71fb29a58c9f29beefDaniel Dunbar Args.AddAllArgs(CmdArgs, options::OPT_L); 4700f7b8eec37c8c8012fa525c71fb29a58c9f29beefDaniel Dunbar Args.AddAllArgs(CmdArgs, options::OPT_T_Group); 4701f7b8eec37c8c8012fa525c71fb29a58c9f29beefDaniel Dunbar Args.AddAllArgs(CmdArgs, options::OPT_e); 4702f7b8eec37c8c8012fa525c71fb29a58c9f29beefDaniel Dunbar 47032008feead855f08500fb01ff43ef5eebee05d1e5Daniel Dunbar AddLinkerInputs(getToolChain(), Inputs, Args, CmdArgs); 4704f7b8eec37c8c8012fa525c71fb29a58c9f29beefDaniel Dunbar 4705f7b8eec37c8c8012fa525c71fb29a58c9f29beefDaniel Dunbar if (!Args.hasArg(options::OPT_nostdlib) && 4706f7b8eec37c8c8012fa525c71fb29a58c9f29beefDaniel Dunbar !Args.hasArg(options::OPT_nodefaultlibs)) { 470795c0457054518102af6250e718a13a5b2ee5dbeaDaniel Dunbar if (D.CCCIsCXX) { 4708132e35d2f87895d20e7ea146c8c00404b80221a1Daniel Dunbar getToolChain().AddCXXStdlibLibArgs(Args, CmdArgs); 470962d829abaf61d70483a5a584059440a549a306bfEli Friedman if (Args.hasArg(options::OPT_pg)) 471062d829abaf61d70483a5a584059440a549a306bfEli Friedman CmdArgs.push_back("-lm_p"); 471162d829abaf61d70483a5a584059440a549a306bfEli Friedman else 471262d829abaf61d70483a5a584059440a549a306bfEli Friedman CmdArgs.push_back("-lm"); 471395c0457054518102af6250e718a13a5b2ee5dbeaDaniel Dunbar } 471495c0457054518102af6250e718a13a5b2ee5dbeaDaniel Dunbar 47152bbcf669742b6b27748414e22f8042236fceef65Daniel Dunbar // FIXME: For some reason GCC passes -lgcc before adding 47162bbcf669742b6b27748414e22f8042236fceef65Daniel Dunbar // the default system libraries. Just mimic this for now. 47172bbcf669742b6b27748414e22f8042236fceef65Daniel Dunbar CmdArgs.push_back("-lgcc"); 4718f7b8eec37c8c8012fa525c71fb29a58c9f29beefDaniel Dunbar 4719f7b8eec37c8c8012fa525c71fb29a58c9f29beefDaniel Dunbar if (Args.hasArg(options::OPT_pthread)) 4720a2e40219e0a8f609a6c4cfc213223f02a3cef3c9Chris Lattner CmdArgs.push_back("-lpthread"); 4721657849c60378b045a9e904f35ece8fd84425a20aChandler Carruth if (!Args.hasArg(options::OPT_shared)) { 472262d829abaf61d70483a5a584059440a549a306bfEli Friedman if (Args.hasArg(options::OPT_pg)) 472362d829abaf61d70483a5a584059440a549a306bfEli Friedman CmdArgs.push_back("-lc_p"); 472462d829abaf61d70483a5a584059440a549a306bfEli Friedman else 472562d829abaf61d70483a5a584059440a549a306bfEli Friedman CmdArgs.push_back("-lc"); 4726657849c60378b045a9e904f35ece8fd84425a20aChandler Carruth } 47272bbcf669742b6b27748414e22f8042236fceef65Daniel Dunbar CmdArgs.push_back("-lgcc"); 4728f7b8eec37c8c8012fa525c71fb29a58c9f29beefDaniel Dunbar } 4729f7b8eec37c8c8012fa525c71fb29a58c9f29beefDaniel Dunbar 4730f7b8eec37c8c8012fa525c71fb29a58c9f29beefDaniel Dunbar if (!Args.hasArg(options::OPT_nostdlib) && 4731f7b8eec37c8c8012fa525c71fb29a58c9f29beefDaniel Dunbar !Args.hasArg(options::OPT_nostartfiles)) { 4732f7b8eec37c8c8012fa525c71fb29a58c9f29beefDaniel Dunbar if (!Args.hasArg(options::OPT_shared)) 473338e317d6dce161b249508686cc67eb7176958762Chris Lattner CmdArgs.push_back(Args.MakeArgString( 47344a7e88978cf646ad10d654020cb00b3877069210Daniel Dunbar getToolChain().GetFilePath("crtend.o"))); 4735f7b8eec37c8c8012fa525c71fb29a58c9f29beefDaniel Dunbar else 473638e317d6dce161b249508686cc67eb7176958762Chris Lattner CmdArgs.push_back(Args.MakeArgString( 47374a7e88978cf646ad10d654020cb00b3877069210Daniel Dunbar getToolChain().GetFilePath("crtendS.o"))); 4738f7b8eec37c8c8012fa525c71fb29a58c9f29beefDaniel Dunbar } 4739f7b8eec37c8c8012fa525c71fb29a58c9f29beefDaniel Dunbar 4740f7b8eec37c8c8012fa525c71fb29a58c9f29beefDaniel Dunbar const char *Exec = 47414a7e88978cf646ad10d654020cb00b3877069210Daniel Dunbar Args.MakeArgString(getToolChain().GetProgramPath("ld")); 47422fe238ed293bd4bc27af9beb9fa151fad2146fa8Daniel Dunbar C.addCommand(new Command(JA, *this, Exec, CmdArgs)); 4743f7b8eec37c8c8012fa525c71fb29a58c9f29beefDaniel Dunbar} 4744c66a5a30a27e7b9cfab46ac8be918e3ea5b0c5a5Ed Schouten 474568a31d406c6dc4382c700d1199b062de2aa7e1daDaniel Dunbarvoid freebsd::Assemble::ConstructJob(Compilation &C, const JobAction &JA, 47462fe238ed293bd4bc27af9beb9fa151fad2146fa8Daniel Dunbar const InputInfo &Output, 4747c21c485b4fb58ef5d55cf3e523263dd824a2ace4Daniel Dunbar const InputInfoList &Inputs, 4748c21c485b4fb58ef5d55cf3e523263dd824a2ace4Daniel Dunbar const ArgList &Args, 47491eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump const char *LinkingOutput) const { 475068a31d406c6dc4382c700d1199b062de2aa7e1daDaniel Dunbar ArgStringList CmdArgs; 475168a31d406c6dc4382c700d1199b062de2aa7e1daDaniel Dunbar 4752008f54a54299eaafdaa940e2bdeaf55935ecd95aDaniel Dunbar // When building 32-bit code on FreeBSD/amd64, we have to explicitly 4753008f54a54299eaafdaa940e2bdeaf55935ecd95aDaniel Dunbar // instruct as in the base system to assemble 32-bit code. 4754008f54a54299eaafdaa940e2bdeaf55935ecd95aDaniel Dunbar if (getToolChain().getArchName() == "i386") 475568a31d406c6dc4382c700d1199b062de2aa7e1daDaniel Dunbar CmdArgs.push_back("--32"); 475668a31d406c6dc4382c700d1199b062de2aa7e1daDaniel Dunbar 47573393cef18e887723aaa2395d33550ab35551af1dRoman Divacky if (getToolChain().getArchName() == "powerpc") 47583393cef18e887723aaa2395d33550ab35551af1dRoman Divacky CmdArgs.push_back("-a32"); 475920249a1af2e462dcafdd6a350f1c7967b264ff25Michael J. Spencer 4760ed734737d5af31906e30e537d4a41c760ddcfc59Eric Christopher // Set byte order explicitly 4761ed734737d5af31906e30e537d4a41c760ddcfc59Eric Christopher if (getToolChain().getArchName() == "mips") 4762ed734737d5af31906e30e537d4a41c760ddcfc59Eric Christopher CmdArgs.push_back("-EB"); 4763ed734737d5af31906e30e537d4a41c760ddcfc59Eric Christopher else if (getToolChain().getArchName() == "mipsel") 4764ed734737d5af31906e30e537d4a41c760ddcfc59Eric Christopher CmdArgs.push_back("-EL"); 4765ed734737d5af31906e30e537d4a41c760ddcfc59Eric Christopher 476668a31d406c6dc4382c700d1199b062de2aa7e1daDaniel Dunbar Args.AddAllArgValues(CmdArgs, options::OPT_Wa_COMMA, 476768a31d406c6dc4382c700d1199b062de2aa7e1daDaniel Dunbar options::OPT_Xassembler); 476868a31d406c6dc4382c700d1199b062de2aa7e1daDaniel Dunbar 476968a31d406c6dc4382c700d1199b062de2aa7e1daDaniel Dunbar CmdArgs.push_back("-o"); 47707c1e46533cae07216e2a67d5636a5afb44253155Daniel Dunbar CmdArgs.push_back(Output.getFilename()); 477168a31d406c6dc4382c700d1199b062de2aa7e1daDaniel Dunbar 477268a31d406c6dc4382c700d1199b062de2aa7e1daDaniel Dunbar for (InputInfoList::const_iterator 477368a31d406c6dc4382c700d1199b062de2aa7e1daDaniel Dunbar it = Inputs.begin(), ie = Inputs.end(); it != ie; ++it) { 477468a31d406c6dc4382c700d1199b062de2aa7e1daDaniel Dunbar const InputInfo &II = *it; 47757c1e46533cae07216e2a67d5636a5afb44253155Daniel Dunbar CmdArgs.push_back(II.getFilename()); 477668a31d406c6dc4382c700d1199b062de2aa7e1daDaniel Dunbar } 477768a31d406c6dc4382c700d1199b062de2aa7e1daDaniel Dunbar 4778c21c485b4fb58ef5d55cf3e523263dd824a2ace4Daniel Dunbar const char *Exec = 47794a7e88978cf646ad10d654020cb00b3877069210Daniel Dunbar Args.MakeArgString(getToolChain().GetProgramPath("as")); 47802fe238ed293bd4bc27af9beb9fa151fad2146fa8Daniel Dunbar C.addCommand(new Command(JA, *this, Exec, CmdArgs)); 478168a31d406c6dc4382c700d1199b062de2aa7e1daDaniel Dunbar} 4782008f54a54299eaafdaa940e2bdeaf55935ecd95aDaniel Dunbar 4783008f54a54299eaafdaa940e2bdeaf55935ecd95aDaniel Dunbarvoid freebsd::Link::ConstructJob(Compilation &C, const JobAction &JA, 47842fe238ed293bd4bc27af9beb9fa151fad2146fa8Daniel Dunbar const InputInfo &Output, 4785c21c485b4fb58ef5d55cf3e523263dd824a2ace4Daniel Dunbar const InputInfoList &Inputs, 4786c21c485b4fb58ef5d55cf3e523263dd824a2ace4Daniel Dunbar const ArgList &Args, 4787a8304f67291b0182fb64f3afc621615288dd1d31Daniel Dunbar const char *LinkingOutput) const { 4788ee788e70fcd0adf76103b17c78ac658d4ea30c9bDaniel Dunbar const Driver &D = getToolChain().getDriver(); 4789008f54a54299eaafdaa940e2bdeaf55935ecd95aDaniel Dunbar ArgStringList CmdArgs; 4790008f54a54299eaafdaa940e2bdeaf55935ecd95aDaniel Dunbar 47918ab2bdcc4f397e100c684ede8e8ca6e226e1380aJoerg Sonnenberger if (!D.SysRoot.empty()) 47928ab2bdcc4f397e100c684ede8e8ca6e226e1380aJoerg Sonnenberger CmdArgs.push_back(Args.MakeArgString("--sysroot=" + D.SysRoot)); 47938ab2bdcc4f397e100c684ede8e8ca6e226e1380aJoerg Sonnenberger 4794008f54a54299eaafdaa940e2bdeaf55935ecd95aDaniel Dunbar if (Args.hasArg(options::OPT_static)) { 4795008f54a54299eaafdaa940e2bdeaf55935ecd95aDaniel Dunbar CmdArgs.push_back("-Bstatic"); 4796008f54a54299eaafdaa940e2bdeaf55935ecd95aDaniel Dunbar } else { 479765ba55da577b23b24513b815031fc870d1d27971Rafael Espindola if (Args.hasArg(options::OPT_rdynamic)) 479865ba55da577b23b24513b815031fc870d1d27971Rafael Espindola CmdArgs.push_back("-export-dynamic"); 4799008f54a54299eaafdaa940e2bdeaf55935ecd95aDaniel Dunbar CmdArgs.push_back("--eh-frame-hdr"); 4800008f54a54299eaafdaa940e2bdeaf55935ecd95aDaniel Dunbar if (Args.hasArg(options::OPT_shared)) { 4801008f54a54299eaafdaa940e2bdeaf55935ecd95aDaniel Dunbar CmdArgs.push_back("-Bshareable"); 4802008f54a54299eaafdaa940e2bdeaf55935ecd95aDaniel Dunbar } else { 4803008f54a54299eaafdaa940e2bdeaf55935ecd95aDaniel Dunbar CmdArgs.push_back("-dynamic-linker"); 4804008f54a54299eaafdaa940e2bdeaf55935ecd95aDaniel Dunbar CmdArgs.push_back("/libexec/ld-elf.so.1"); 4805008f54a54299eaafdaa940e2bdeaf55935ecd95aDaniel Dunbar } 4806008f54a54299eaafdaa940e2bdeaf55935ecd95aDaniel Dunbar } 4807008f54a54299eaafdaa940e2bdeaf55935ecd95aDaniel Dunbar 4808008f54a54299eaafdaa940e2bdeaf55935ecd95aDaniel Dunbar // When building 32-bit code on FreeBSD/amd64, we have to explicitly 4809008f54a54299eaafdaa940e2bdeaf55935ecd95aDaniel Dunbar // instruct ld in the base system to link 32-bit code. 4810008f54a54299eaafdaa940e2bdeaf55935ecd95aDaniel Dunbar if (getToolChain().getArchName() == "i386") { 4811008f54a54299eaafdaa940e2bdeaf55935ecd95aDaniel Dunbar CmdArgs.push_back("-m"); 4812008f54a54299eaafdaa940e2bdeaf55935ecd95aDaniel Dunbar CmdArgs.push_back("elf_i386_fbsd"); 4813008f54a54299eaafdaa940e2bdeaf55935ecd95aDaniel Dunbar } 4814008f54a54299eaafdaa940e2bdeaf55935ecd95aDaniel Dunbar 4815000a6552adc6372576d65170dfb5969fd03cc521Roman Divacky if (getToolChain().getArchName() == "powerpc") { 4816000a6552adc6372576d65170dfb5969fd03cc521Roman Divacky CmdArgs.push_back("-m"); 48171052c1dc52447643dac5484d3a22ab836c781f47Roman Divacky CmdArgs.push_back("elf32ppc_fbsd"); 4818000a6552adc6372576d65170dfb5969fd03cc521Roman Divacky } 4819000a6552adc6372576d65170dfb5969fd03cc521Roman Divacky 48207c1e46533cae07216e2a67d5636a5afb44253155Daniel Dunbar if (Output.isFilename()) { 4821008f54a54299eaafdaa940e2bdeaf55935ecd95aDaniel Dunbar CmdArgs.push_back("-o"); 4822008f54a54299eaafdaa940e2bdeaf55935ecd95aDaniel Dunbar CmdArgs.push_back(Output.getFilename()); 4823008f54a54299eaafdaa940e2bdeaf55935ecd95aDaniel Dunbar } else { 4824008f54a54299eaafdaa940e2bdeaf55935ecd95aDaniel Dunbar assert(Output.isNothing() && "Invalid output."); 4825008f54a54299eaafdaa940e2bdeaf55935ecd95aDaniel Dunbar } 4826008f54a54299eaafdaa940e2bdeaf55935ecd95aDaniel Dunbar 4827008f54a54299eaafdaa940e2bdeaf55935ecd95aDaniel Dunbar if (!Args.hasArg(options::OPT_nostdlib) && 4828008f54a54299eaafdaa940e2bdeaf55935ecd95aDaniel Dunbar !Args.hasArg(options::OPT_nostartfiles)) { 4829008f54a54299eaafdaa940e2bdeaf55935ecd95aDaniel Dunbar if (!Args.hasArg(options::OPT_shared)) { 4830c16bb76f25ada63864aa89827a9906c1579d2ad3Roman Divacky if (Args.hasArg(options::OPT_pg)) 4831c16bb76f25ada63864aa89827a9906c1579d2ad3Roman Divacky CmdArgs.push_back(Args.MakeArgString( 4832c16bb76f25ada63864aa89827a9906c1579d2ad3Roman Divacky getToolChain().GetFilePath("gcrt1.o"))); 48338642f21ca7b5963293a5424de7fe158305ae5229Roman Divacky else { 48348642f21ca7b5963293a5424de7fe158305ae5229Roman Divacky const char *crt = Args.hasArg(options::OPT_pie) ? "Scrt1.o" : "crt1.o"; 4835c16bb76f25ada63864aa89827a9906c1579d2ad3Roman Divacky CmdArgs.push_back(Args.MakeArgString( 48368642f21ca7b5963293a5424de7fe158305ae5229Roman Divacky getToolChain().GetFilePath(crt))); 48378642f21ca7b5963293a5424de7fe158305ae5229Roman Divacky } 483838e317d6dce161b249508686cc67eb7176958762Chris Lattner CmdArgs.push_back(Args.MakeArgString( 48394a7e88978cf646ad10d654020cb00b3877069210Daniel Dunbar getToolChain().GetFilePath("crti.o"))); 484038e317d6dce161b249508686cc67eb7176958762Chris Lattner CmdArgs.push_back(Args.MakeArgString( 48414a7e88978cf646ad10d654020cb00b3877069210Daniel Dunbar getToolChain().GetFilePath("crtbegin.o"))); 4842008f54a54299eaafdaa940e2bdeaf55935ecd95aDaniel Dunbar } else { 484338e317d6dce161b249508686cc67eb7176958762Chris Lattner CmdArgs.push_back(Args.MakeArgString( 48444a7e88978cf646ad10d654020cb00b3877069210Daniel Dunbar getToolChain().GetFilePath("crti.o"))); 484538e317d6dce161b249508686cc67eb7176958762Chris Lattner CmdArgs.push_back(Args.MakeArgString( 48464a7e88978cf646ad10d654020cb00b3877069210Daniel Dunbar getToolChain().GetFilePath("crtbeginS.o"))); 4847008f54a54299eaafdaa940e2bdeaf55935ecd95aDaniel Dunbar } 4848008f54a54299eaafdaa940e2bdeaf55935ecd95aDaniel Dunbar } 4849008f54a54299eaafdaa940e2bdeaf55935ecd95aDaniel Dunbar 4850008f54a54299eaafdaa940e2bdeaf55935ecd95aDaniel Dunbar Args.AddAllArgs(CmdArgs, options::OPT_L); 485158e5ac9d41d8186bea92e892d572e2eea28d3f9cRoman Divacky const ToolChain::path_list Paths = getToolChain().getFilePaths(); 485258e5ac9d41d8186bea92e892d572e2eea28d3f9cRoman Divacky for (ToolChain::path_list::const_iterator i = Paths.begin(), e = Paths.end(); 485358e5ac9d41d8186bea92e892d572e2eea28d3f9cRoman Divacky i != e; ++i) 48545f9e272e632e951b1efe824cd16acb4d96077930Chris Lattner CmdArgs.push_back(Args.MakeArgString(StringRef("-L") + *i)); 4855008f54a54299eaafdaa940e2bdeaf55935ecd95aDaniel Dunbar Args.AddAllArgs(CmdArgs, options::OPT_T_Group); 4856008f54a54299eaafdaa940e2bdeaf55935ecd95aDaniel Dunbar Args.AddAllArgs(CmdArgs, options::OPT_e); 4857c736377543edcfbb00a4150fae79b4d9d9f66849David Chisnall Args.AddAllArgs(CmdArgs, options::OPT_s); 4858c736377543edcfbb00a4150fae79b4d9d9f66849David Chisnall Args.AddAllArgs(CmdArgs, options::OPT_t); 4859c736377543edcfbb00a4150fae79b4d9d9f66849David Chisnall Args.AddAllArgs(CmdArgs, options::OPT_Z_Flag); 4860c736377543edcfbb00a4150fae79b4d9d9f66849David Chisnall Args.AddAllArgs(CmdArgs, options::OPT_r); 4861008f54a54299eaafdaa940e2bdeaf55935ecd95aDaniel Dunbar 48622008feead855f08500fb01ff43ef5eebee05d1e5Daniel Dunbar AddLinkerInputs(getToolChain(), Inputs, Args, CmdArgs); 48638e50a96b387dca7525caa8a6add31420dd82a2cdBenjamin Kramer 48648e50a96b387dca7525caa8a6add31420dd82a2cdBenjamin Kramer if (!Args.hasArg(options::OPT_nostdlib) && 48658e50a96b387dca7525caa8a6add31420dd82a2cdBenjamin Kramer !Args.hasArg(options::OPT_nodefaultlibs)) { 48668e50a96b387dca7525caa8a6add31420dd82a2cdBenjamin Kramer if (D.CCCIsCXX) { 48678e50a96b387dca7525caa8a6add31420dd82a2cdBenjamin Kramer getToolChain().AddCXXStdlibLibArgs(Args, CmdArgs); 4868c16bb76f25ada63864aa89827a9906c1579d2ad3Roman Divacky if (Args.hasArg(options::OPT_pg)) 4869c16bb76f25ada63864aa89827a9906c1579d2ad3Roman Divacky CmdArgs.push_back("-lm_p"); 4870c16bb76f25ada63864aa89827a9906c1579d2ad3Roman Divacky else 4871c16bb76f25ada63864aa89827a9906c1579d2ad3Roman Divacky CmdArgs.push_back("-lm"); 48728e50a96b387dca7525caa8a6add31420dd82a2cdBenjamin Kramer } 48738e50a96b387dca7525caa8a6add31420dd82a2cdBenjamin Kramer // FIXME: For some reason GCC passes -lgcc and -lgcc_s before adding 48748e50a96b387dca7525caa8a6add31420dd82a2cdBenjamin Kramer // the default system libraries. Just mimic this for now. 4875c16bb76f25ada63864aa89827a9906c1579d2ad3Roman Divacky if (Args.hasArg(options::OPT_pg)) 4876c16bb76f25ada63864aa89827a9906c1579d2ad3Roman Divacky CmdArgs.push_back("-lgcc_p"); 4877c16bb76f25ada63864aa89827a9906c1579d2ad3Roman Divacky else 4878c16bb76f25ada63864aa89827a9906c1579d2ad3Roman Divacky CmdArgs.push_back("-lgcc"); 48798e50a96b387dca7525caa8a6add31420dd82a2cdBenjamin Kramer if (Args.hasArg(options::OPT_static)) { 48808e50a96b387dca7525caa8a6add31420dd82a2cdBenjamin Kramer CmdArgs.push_back("-lgcc_eh"); 4881c16bb76f25ada63864aa89827a9906c1579d2ad3Roman Divacky } else if (Args.hasArg(options::OPT_pg)) { 4882c16bb76f25ada63864aa89827a9906c1579d2ad3Roman Divacky CmdArgs.push_back("-lgcc_eh_p"); 48838e50a96b387dca7525caa8a6add31420dd82a2cdBenjamin Kramer } else { 48848e50a96b387dca7525caa8a6add31420dd82a2cdBenjamin Kramer CmdArgs.push_back("--as-needed"); 48858e50a96b387dca7525caa8a6add31420dd82a2cdBenjamin Kramer CmdArgs.push_back("-lgcc_s"); 48868e50a96b387dca7525caa8a6add31420dd82a2cdBenjamin Kramer CmdArgs.push_back("--no-as-needed"); 48878e50a96b387dca7525caa8a6add31420dd82a2cdBenjamin Kramer } 48888e50a96b387dca7525caa8a6add31420dd82a2cdBenjamin Kramer 4889242302673bdcf35b49579a30fed9dc068a4e10f2Matt Beaumont-Gay if (Args.hasArg(options::OPT_pthread)) { 4890c16bb76f25ada63864aa89827a9906c1579d2ad3Roman Divacky if (Args.hasArg(options::OPT_pg)) 4891c16bb76f25ada63864aa89827a9906c1579d2ad3Roman Divacky CmdArgs.push_back("-lpthread_p"); 4892c16bb76f25ada63864aa89827a9906c1579d2ad3Roman Divacky else 4893c16bb76f25ada63864aa89827a9906c1579d2ad3Roman Divacky CmdArgs.push_back("-lpthread"); 4894242302673bdcf35b49579a30fed9dc068a4e10f2Matt Beaumont-Gay } 4895c16bb76f25ada63864aa89827a9906c1579d2ad3Roman Divacky 4896c16bb76f25ada63864aa89827a9906c1579d2ad3Roman Divacky if (Args.hasArg(options::OPT_pg)) { 4897c16bb76f25ada63864aa89827a9906c1579d2ad3Roman Divacky if (Args.hasArg(options::OPT_shared)) 4898c16bb76f25ada63864aa89827a9906c1579d2ad3Roman Divacky CmdArgs.push_back("-lc"); 4899c16bb76f25ada63864aa89827a9906c1579d2ad3Roman Divacky else 4900c16bb76f25ada63864aa89827a9906c1579d2ad3Roman Divacky CmdArgs.push_back("-lc_p"); 4901c16bb76f25ada63864aa89827a9906c1579d2ad3Roman Divacky CmdArgs.push_back("-lgcc_p"); 4902c16bb76f25ada63864aa89827a9906c1579d2ad3Roman Divacky } else { 4903c16bb76f25ada63864aa89827a9906c1579d2ad3Roman Divacky CmdArgs.push_back("-lc"); 4904c16bb76f25ada63864aa89827a9906c1579d2ad3Roman Divacky CmdArgs.push_back("-lgcc"); 4905c16bb76f25ada63864aa89827a9906c1579d2ad3Roman Divacky } 49068e50a96b387dca7525caa8a6add31420dd82a2cdBenjamin Kramer 49078e50a96b387dca7525caa8a6add31420dd82a2cdBenjamin Kramer if (Args.hasArg(options::OPT_static)) { 49088e50a96b387dca7525caa8a6add31420dd82a2cdBenjamin Kramer CmdArgs.push_back("-lgcc_eh"); 4909c16bb76f25ada63864aa89827a9906c1579d2ad3Roman Divacky } else if (Args.hasArg(options::OPT_pg)) { 4910c16bb76f25ada63864aa89827a9906c1579d2ad3Roman Divacky CmdArgs.push_back("-lgcc_eh_p"); 49118e50a96b387dca7525caa8a6add31420dd82a2cdBenjamin Kramer } else { 49128e50a96b387dca7525caa8a6add31420dd82a2cdBenjamin Kramer CmdArgs.push_back("--as-needed"); 49138e50a96b387dca7525caa8a6add31420dd82a2cdBenjamin Kramer CmdArgs.push_back("-lgcc_s"); 49148e50a96b387dca7525caa8a6add31420dd82a2cdBenjamin Kramer CmdArgs.push_back("--no-as-needed"); 49158e50a96b387dca7525caa8a6add31420dd82a2cdBenjamin Kramer } 49168e50a96b387dca7525caa8a6add31420dd82a2cdBenjamin Kramer } 49178e50a96b387dca7525caa8a6add31420dd82a2cdBenjamin Kramer 49188e50a96b387dca7525caa8a6add31420dd82a2cdBenjamin Kramer if (!Args.hasArg(options::OPT_nostdlib) && 49198e50a96b387dca7525caa8a6add31420dd82a2cdBenjamin Kramer !Args.hasArg(options::OPT_nostartfiles)) { 49208e50a96b387dca7525caa8a6add31420dd82a2cdBenjamin Kramer if (!Args.hasArg(options::OPT_shared)) 49218e50a96b387dca7525caa8a6add31420dd82a2cdBenjamin Kramer CmdArgs.push_back(Args.MakeArgString(getToolChain().GetFilePath( 49228e50a96b387dca7525caa8a6add31420dd82a2cdBenjamin Kramer "crtend.o"))); 49238e50a96b387dca7525caa8a6add31420dd82a2cdBenjamin Kramer else 49248e50a96b387dca7525caa8a6add31420dd82a2cdBenjamin Kramer CmdArgs.push_back(Args.MakeArgString(getToolChain().GetFilePath( 49258e50a96b387dca7525caa8a6add31420dd82a2cdBenjamin Kramer "crtendS.o"))); 49268e50a96b387dca7525caa8a6add31420dd82a2cdBenjamin Kramer CmdArgs.push_back(Args.MakeArgString(getToolChain().GetFilePath( 49278e50a96b387dca7525caa8a6add31420dd82a2cdBenjamin Kramer "crtn.o"))); 49288e50a96b387dca7525caa8a6add31420dd82a2cdBenjamin Kramer } 49298e50a96b387dca7525caa8a6add31420dd82a2cdBenjamin Kramer 49303f4be6fb8872942f567166ab8d99c89885f26103Bill Wendling addProfileRT(getToolChain(), Args, CmdArgs, getToolChain().getTriple()); 49312e95a6d7d0b5aed39747875d7474c27824f7319fNick Lewycky 49328e50a96b387dca7525caa8a6add31420dd82a2cdBenjamin Kramer const char *Exec = 49338e50a96b387dca7525caa8a6add31420dd82a2cdBenjamin Kramer Args.MakeArgString(getToolChain().GetProgramPath("ld")); 49348e50a96b387dca7525caa8a6add31420dd82a2cdBenjamin Kramer C.addCommand(new Command(JA, *this, Exec, CmdArgs)); 49358e50a96b387dca7525caa8a6add31420dd82a2cdBenjamin Kramer} 49368e50a96b387dca7525caa8a6add31420dd82a2cdBenjamin Kramer 49378e50a96b387dca7525caa8a6add31420dd82a2cdBenjamin Kramervoid netbsd::Assemble::ConstructJob(Compilation &C, const JobAction &JA, 49388e50a96b387dca7525caa8a6add31420dd82a2cdBenjamin Kramer const InputInfo &Output, 49398e50a96b387dca7525caa8a6add31420dd82a2cdBenjamin Kramer const InputInfoList &Inputs, 49408e50a96b387dca7525caa8a6add31420dd82a2cdBenjamin Kramer const ArgList &Args, 49418e50a96b387dca7525caa8a6add31420dd82a2cdBenjamin Kramer const char *LinkingOutput) const { 49428e50a96b387dca7525caa8a6add31420dd82a2cdBenjamin Kramer ArgStringList CmdArgs; 49438e50a96b387dca7525caa8a6add31420dd82a2cdBenjamin Kramer 49448e50a96b387dca7525caa8a6add31420dd82a2cdBenjamin Kramer // When building 32-bit code on NetBSD/amd64, we have to explicitly 49458e50a96b387dca7525caa8a6add31420dd82a2cdBenjamin Kramer // instruct as in the base system to assemble 32-bit code. 49461bd91374498ac78e72545f08f4daa6491f9c9d14Joerg Sonnenberger if (getToolChain().getArch() == llvm::Triple::x86) 49478e50a96b387dca7525caa8a6add31420dd82a2cdBenjamin Kramer CmdArgs.push_back("--32"); 49488e50a96b387dca7525caa8a6add31420dd82a2cdBenjamin Kramer 49498e50a96b387dca7525caa8a6add31420dd82a2cdBenjamin Kramer // Set byte order explicitly 49508e50a96b387dca7525caa8a6add31420dd82a2cdBenjamin Kramer if (getToolChain().getArchName() == "mips") 49518e50a96b387dca7525caa8a6add31420dd82a2cdBenjamin Kramer CmdArgs.push_back("-EB"); 49528e50a96b387dca7525caa8a6add31420dd82a2cdBenjamin Kramer else if (getToolChain().getArchName() == "mipsel") 49538e50a96b387dca7525caa8a6add31420dd82a2cdBenjamin Kramer CmdArgs.push_back("-EL"); 49548e50a96b387dca7525caa8a6add31420dd82a2cdBenjamin Kramer 49558e50a96b387dca7525caa8a6add31420dd82a2cdBenjamin Kramer Args.AddAllArgValues(CmdArgs, options::OPT_Wa_COMMA, 49568e50a96b387dca7525caa8a6add31420dd82a2cdBenjamin Kramer options::OPT_Xassembler); 49578e50a96b387dca7525caa8a6add31420dd82a2cdBenjamin Kramer 49588e50a96b387dca7525caa8a6add31420dd82a2cdBenjamin Kramer CmdArgs.push_back("-o"); 49598e50a96b387dca7525caa8a6add31420dd82a2cdBenjamin Kramer CmdArgs.push_back(Output.getFilename()); 49608e50a96b387dca7525caa8a6add31420dd82a2cdBenjamin Kramer 49618e50a96b387dca7525caa8a6add31420dd82a2cdBenjamin Kramer for (InputInfoList::const_iterator 49628e50a96b387dca7525caa8a6add31420dd82a2cdBenjamin Kramer it = Inputs.begin(), ie = Inputs.end(); it != ie; ++it) { 49638e50a96b387dca7525caa8a6add31420dd82a2cdBenjamin Kramer const InputInfo &II = *it; 49648e50a96b387dca7525caa8a6add31420dd82a2cdBenjamin Kramer CmdArgs.push_back(II.getFilename()); 49658e50a96b387dca7525caa8a6add31420dd82a2cdBenjamin Kramer } 49668e50a96b387dca7525caa8a6add31420dd82a2cdBenjamin Kramer 49675adcec16cb8d9e7bebf310b6c07249dfd852346bDavid Chisnall const char *Exec = Args.MakeArgString((getToolChain().GetProgramPath("as"))); 49688e50a96b387dca7525caa8a6add31420dd82a2cdBenjamin Kramer C.addCommand(new Command(JA, *this, Exec, CmdArgs)); 49698e50a96b387dca7525caa8a6add31420dd82a2cdBenjamin Kramer} 49708e50a96b387dca7525caa8a6add31420dd82a2cdBenjamin Kramer 49718e50a96b387dca7525caa8a6add31420dd82a2cdBenjamin Kramervoid netbsd::Link::ConstructJob(Compilation &C, const JobAction &JA, 49728e50a96b387dca7525caa8a6add31420dd82a2cdBenjamin Kramer const InputInfo &Output, 49738e50a96b387dca7525caa8a6add31420dd82a2cdBenjamin Kramer const InputInfoList &Inputs, 49748e50a96b387dca7525caa8a6add31420dd82a2cdBenjamin Kramer const ArgList &Args, 49758e50a96b387dca7525caa8a6add31420dd82a2cdBenjamin Kramer const char *LinkingOutput) const { 49768e50a96b387dca7525caa8a6add31420dd82a2cdBenjamin Kramer const Driver &D = getToolChain().getDriver(); 49778e50a96b387dca7525caa8a6add31420dd82a2cdBenjamin Kramer ArgStringList CmdArgs; 49788e50a96b387dca7525caa8a6add31420dd82a2cdBenjamin Kramer 49798ab2bdcc4f397e100c684ede8e8ca6e226e1380aJoerg Sonnenberger if (!D.SysRoot.empty()) 49808ab2bdcc4f397e100c684ede8e8ca6e226e1380aJoerg Sonnenberger CmdArgs.push_back(Args.MakeArgString("--sysroot=" + D.SysRoot)); 49818ab2bdcc4f397e100c684ede8e8ca6e226e1380aJoerg Sonnenberger 49828e50a96b387dca7525caa8a6add31420dd82a2cdBenjamin Kramer if (Args.hasArg(options::OPT_static)) { 49838e50a96b387dca7525caa8a6add31420dd82a2cdBenjamin Kramer CmdArgs.push_back("-Bstatic"); 49848e50a96b387dca7525caa8a6add31420dd82a2cdBenjamin Kramer } else { 49858e50a96b387dca7525caa8a6add31420dd82a2cdBenjamin Kramer if (Args.hasArg(options::OPT_rdynamic)) 49868e50a96b387dca7525caa8a6add31420dd82a2cdBenjamin Kramer CmdArgs.push_back("-export-dynamic"); 49878e50a96b387dca7525caa8a6add31420dd82a2cdBenjamin Kramer CmdArgs.push_back("--eh-frame-hdr"); 49888e50a96b387dca7525caa8a6add31420dd82a2cdBenjamin Kramer if (Args.hasArg(options::OPT_shared)) { 49898e50a96b387dca7525caa8a6add31420dd82a2cdBenjamin Kramer CmdArgs.push_back("-Bshareable"); 49908e50a96b387dca7525caa8a6add31420dd82a2cdBenjamin Kramer } else { 49918e50a96b387dca7525caa8a6add31420dd82a2cdBenjamin Kramer CmdArgs.push_back("-dynamic-linker"); 49928e50a96b387dca7525caa8a6add31420dd82a2cdBenjamin Kramer CmdArgs.push_back("/libexec/ld.elf_so"); 49938e50a96b387dca7525caa8a6add31420dd82a2cdBenjamin Kramer } 49948e50a96b387dca7525caa8a6add31420dd82a2cdBenjamin Kramer } 49958e50a96b387dca7525caa8a6add31420dd82a2cdBenjamin Kramer 49968e50a96b387dca7525caa8a6add31420dd82a2cdBenjamin Kramer // When building 32-bit code on NetBSD/amd64, we have to explicitly 49978e50a96b387dca7525caa8a6add31420dd82a2cdBenjamin Kramer // instruct ld in the base system to link 32-bit code. 49981bd91374498ac78e72545f08f4daa6491f9c9d14Joerg Sonnenberger if (getToolChain().getArch() == llvm::Triple::x86) { 49998e50a96b387dca7525caa8a6add31420dd82a2cdBenjamin Kramer CmdArgs.push_back("-m"); 50008e50a96b387dca7525caa8a6add31420dd82a2cdBenjamin Kramer CmdArgs.push_back("elf_i386"); 50018e50a96b387dca7525caa8a6add31420dd82a2cdBenjamin Kramer } 50028e50a96b387dca7525caa8a6add31420dd82a2cdBenjamin Kramer 50038e50a96b387dca7525caa8a6add31420dd82a2cdBenjamin Kramer if (Output.isFilename()) { 50048e50a96b387dca7525caa8a6add31420dd82a2cdBenjamin Kramer CmdArgs.push_back("-o"); 50058e50a96b387dca7525caa8a6add31420dd82a2cdBenjamin Kramer CmdArgs.push_back(Output.getFilename()); 50068e50a96b387dca7525caa8a6add31420dd82a2cdBenjamin Kramer } else { 50078e50a96b387dca7525caa8a6add31420dd82a2cdBenjamin Kramer assert(Output.isNothing() && "Invalid output."); 50088e50a96b387dca7525caa8a6add31420dd82a2cdBenjamin Kramer } 50098e50a96b387dca7525caa8a6add31420dd82a2cdBenjamin Kramer 50108e50a96b387dca7525caa8a6add31420dd82a2cdBenjamin Kramer if (!Args.hasArg(options::OPT_nostdlib) && 50118e50a96b387dca7525caa8a6add31420dd82a2cdBenjamin Kramer !Args.hasArg(options::OPT_nostartfiles)) { 50128e50a96b387dca7525caa8a6add31420dd82a2cdBenjamin Kramer if (!Args.hasArg(options::OPT_shared)) { 50138e50a96b387dca7525caa8a6add31420dd82a2cdBenjamin Kramer CmdArgs.push_back(Args.MakeArgString( 50148e50a96b387dca7525caa8a6add31420dd82a2cdBenjamin Kramer getToolChain().GetFilePath("crt0.o"))); 50158e50a96b387dca7525caa8a6add31420dd82a2cdBenjamin Kramer CmdArgs.push_back(Args.MakeArgString( 50168e50a96b387dca7525caa8a6add31420dd82a2cdBenjamin Kramer getToolChain().GetFilePath("crti.o"))); 50178e50a96b387dca7525caa8a6add31420dd82a2cdBenjamin Kramer CmdArgs.push_back(Args.MakeArgString( 50188e50a96b387dca7525caa8a6add31420dd82a2cdBenjamin Kramer getToolChain().GetFilePath("crtbegin.o"))); 50198e50a96b387dca7525caa8a6add31420dd82a2cdBenjamin Kramer } else { 50208e50a96b387dca7525caa8a6add31420dd82a2cdBenjamin Kramer CmdArgs.push_back(Args.MakeArgString( 50218e50a96b387dca7525caa8a6add31420dd82a2cdBenjamin Kramer getToolChain().GetFilePath("crti.o"))); 50228e50a96b387dca7525caa8a6add31420dd82a2cdBenjamin Kramer CmdArgs.push_back(Args.MakeArgString( 50238e50a96b387dca7525caa8a6add31420dd82a2cdBenjamin Kramer getToolChain().GetFilePath("crtbeginS.o"))); 50248e50a96b387dca7525caa8a6add31420dd82a2cdBenjamin Kramer } 50258e50a96b387dca7525caa8a6add31420dd82a2cdBenjamin Kramer } 50268e50a96b387dca7525caa8a6add31420dd82a2cdBenjamin Kramer 50278e50a96b387dca7525caa8a6add31420dd82a2cdBenjamin Kramer Args.AddAllArgs(CmdArgs, options::OPT_L); 50288e50a96b387dca7525caa8a6add31420dd82a2cdBenjamin Kramer Args.AddAllArgs(CmdArgs, options::OPT_T_Group); 50298e50a96b387dca7525caa8a6add31420dd82a2cdBenjamin Kramer Args.AddAllArgs(CmdArgs, options::OPT_e); 50308e50a96b387dca7525caa8a6add31420dd82a2cdBenjamin Kramer Args.AddAllArgs(CmdArgs, options::OPT_s); 50318e50a96b387dca7525caa8a6add31420dd82a2cdBenjamin Kramer Args.AddAllArgs(CmdArgs, options::OPT_t); 50328e50a96b387dca7525caa8a6add31420dd82a2cdBenjamin Kramer Args.AddAllArgs(CmdArgs, options::OPT_Z_Flag); 50338e50a96b387dca7525caa8a6add31420dd82a2cdBenjamin Kramer Args.AddAllArgs(CmdArgs, options::OPT_r); 50348e50a96b387dca7525caa8a6add31420dd82a2cdBenjamin Kramer 50358e50a96b387dca7525caa8a6add31420dd82a2cdBenjamin Kramer AddLinkerInputs(getToolChain(), Inputs, Args, CmdArgs); 5036008f54a54299eaafdaa940e2bdeaf55935ecd95aDaniel Dunbar 5037008f54a54299eaafdaa940e2bdeaf55935ecd95aDaniel Dunbar if (!Args.hasArg(options::OPT_nostdlib) && 5038008f54a54299eaafdaa940e2bdeaf55935ecd95aDaniel Dunbar !Args.hasArg(options::OPT_nodefaultlibs)) { 50392002263e10aa369c89008d37cada2908203fd822Daniel Dunbar if (D.CCCIsCXX) { 5040132e35d2f87895d20e7ea146c8c00404b80221a1Daniel Dunbar getToolChain().AddCXXStdlibLibArgs(Args, CmdArgs); 50412002263e10aa369c89008d37cada2908203fd822Daniel Dunbar CmdArgs.push_back("-lm"); 50422002263e10aa369c89008d37cada2908203fd822Daniel Dunbar } 5043008f54a54299eaafdaa940e2bdeaf55935ecd95aDaniel Dunbar // FIXME: For some reason GCC passes -lgcc and -lgcc_s before adding 5044008f54a54299eaafdaa940e2bdeaf55935ecd95aDaniel Dunbar // the default system libraries. Just mimic this for now. 5045008f54a54299eaafdaa940e2bdeaf55935ecd95aDaniel Dunbar if (Args.hasArg(options::OPT_static)) { 5046008f54a54299eaafdaa940e2bdeaf55935ecd95aDaniel Dunbar CmdArgs.push_back("-lgcc_eh"); 5047008f54a54299eaafdaa940e2bdeaf55935ecd95aDaniel Dunbar } else { 5048008f54a54299eaafdaa940e2bdeaf55935ecd95aDaniel Dunbar CmdArgs.push_back("--as-needed"); 5049008f54a54299eaafdaa940e2bdeaf55935ecd95aDaniel Dunbar CmdArgs.push_back("-lgcc_s"); 5050008f54a54299eaafdaa940e2bdeaf55935ecd95aDaniel Dunbar CmdArgs.push_back("--no-as-needed"); 5051008f54a54299eaafdaa940e2bdeaf55935ecd95aDaniel Dunbar } 5052db6393f259b8e634302e27d538ca4760f4221d91Joerg Sonnenberger CmdArgs.push_back("-lgcc"); 5053008f54a54299eaafdaa940e2bdeaf55935ecd95aDaniel Dunbar 5054008f54a54299eaafdaa940e2bdeaf55935ecd95aDaniel Dunbar if (Args.hasArg(options::OPT_pthread)) 5055008f54a54299eaafdaa940e2bdeaf55935ecd95aDaniel Dunbar CmdArgs.push_back("-lpthread"); 5056008f54a54299eaafdaa940e2bdeaf55935ecd95aDaniel Dunbar CmdArgs.push_back("-lc"); 5057008f54a54299eaafdaa940e2bdeaf55935ecd95aDaniel Dunbar 5058008f54a54299eaafdaa940e2bdeaf55935ecd95aDaniel Dunbar CmdArgs.push_back("-lgcc"); 5059008f54a54299eaafdaa940e2bdeaf55935ecd95aDaniel Dunbar if (Args.hasArg(options::OPT_static)) { 5060008f54a54299eaafdaa940e2bdeaf55935ecd95aDaniel Dunbar CmdArgs.push_back("-lgcc_eh"); 5061008f54a54299eaafdaa940e2bdeaf55935ecd95aDaniel Dunbar } else { 5062008f54a54299eaafdaa940e2bdeaf55935ecd95aDaniel Dunbar CmdArgs.push_back("--as-needed"); 5063008f54a54299eaafdaa940e2bdeaf55935ecd95aDaniel Dunbar CmdArgs.push_back("-lgcc_s"); 5064008f54a54299eaafdaa940e2bdeaf55935ecd95aDaniel Dunbar CmdArgs.push_back("--no-as-needed"); 5065008f54a54299eaafdaa940e2bdeaf55935ecd95aDaniel Dunbar } 5066008f54a54299eaafdaa940e2bdeaf55935ecd95aDaniel Dunbar } 5067008f54a54299eaafdaa940e2bdeaf55935ecd95aDaniel Dunbar 5068008f54a54299eaafdaa940e2bdeaf55935ecd95aDaniel Dunbar if (!Args.hasArg(options::OPT_nostdlib) && 5069008f54a54299eaafdaa940e2bdeaf55935ecd95aDaniel Dunbar !Args.hasArg(options::OPT_nostartfiles)) { 5070008f54a54299eaafdaa940e2bdeaf55935ecd95aDaniel Dunbar if (!Args.hasArg(options::OPT_shared)) 50714a7e88978cf646ad10d654020cb00b3877069210Daniel Dunbar CmdArgs.push_back(Args.MakeArgString(getToolChain().GetFilePath( 507238e317d6dce161b249508686cc67eb7176958762Chris Lattner "crtend.o"))); 5073008f54a54299eaafdaa940e2bdeaf55935ecd95aDaniel Dunbar else 50744a7e88978cf646ad10d654020cb00b3877069210Daniel Dunbar CmdArgs.push_back(Args.MakeArgString(getToolChain().GetFilePath( 507538e317d6dce161b249508686cc67eb7176958762Chris Lattner "crtendS.o"))); 50764a7e88978cf646ad10d654020cb00b3877069210Daniel Dunbar CmdArgs.push_back(Args.MakeArgString(getToolChain().GetFilePath( 507738e317d6dce161b249508686cc67eb7176958762Chris Lattner "crtn.o"))); 5078008f54a54299eaafdaa940e2bdeaf55935ecd95aDaniel Dunbar } 5079008f54a54299eaafdaa940e2bdeaf55935ecd95aDaniel Dunbar 50803f4be6fb8872942f567166ab8d99c89885f26103Bill Wendling addProfileRT(getToolChain(), Args, CmdArgs, getToolChain().getTriple()); 50812e95a6d7d0b5aed39747875d7474c27824f7319fNick Lewycky 50825adcec16cb8d9e7bebf310b6c07249dfd852346bDavid Chisnall const char *Exec = Args.MakeArgString(getToolChain().GetProgramPath("ld")); 50832fe238ed293bd4bc27af9beb9fa151fad2146fa8Daniel Dunbar C.addCommand(new Command(JA, *this, Exec, CmdArgs)); 5084008f54a54299eaafdaa940e2bdeaf55935ecd95aDaniel Dunbar} 508511e1b40d759a643086f590f6ffbd9d68360bad46Daniel Dunbar 5086ba30bbe4e36a30a274da809a11a42f9cdc168e92Rafael Espindolavoid linuxtools::Assemble::ConstructJob(Compilation &C, const JobAction &JA, 5087ba30bbe4e36a30a274da809a11a42f9cdc168e92Rafael Espindola const InputInfo &Output, 5088ba30bbe4e36a30a274da809a11a42f9cdc168e92Rafael Espindola const InputInfoList &Inputs, 5089ba30bbe4e36a30a274da809a11a42f9cdc168e92Rafael Espindola const ArgList &Args, 5090ba30bbe4e36a30a274da809a11a42f9cdc168e92Rafael Espindola const char *LinkingOutput) const { 5091ba30bbe4e36a30a274da809a11a42f9cdc168e92Rafael Espindola ArgStringList CmdArgs; 5092ba30bbe4e36a30a274da809a11a42f9cdc168e92Rafael Espindola 5093ba30bbe4e36a30a274da809a11a42f9cdc168e92Rafael Espindola // Add --32/--64 to make sure we get the format we want. 5094ba30bbe4e36a30a274da809a11a42f9cdc168e92Rafael Espindola // This is incomplete 5095ba30bbe4e36a30a274da809a11a42f9cdc168e92Rafael Espindola if (getToolChain().getArch() == llvm::Triple::x86) { 5096ba30bbe4e36a30a274da809a11a42f9cdc168e92Rafael Espindola CmdArgs.push_back("--32"); 5097ba30bbe4e36a30a274da809a11a42f9cdc168e92Rafael Espindola } else if (getToolChain().getArch() == llvm::Triple::x86_64) { 5098ba30bbe4e36a30a274da809a11a42f9cdc168e92Rafael Espindola CmdArgs.push_back("--64"); 50997972c88f674475037fa11fea718565e5bcdd61a6Eli Friedman } else if (getToolChain().getArch() == llvm::Triple::ppc) { 51007972c88f674475037fa11fea718565e5bcdd61a6Eli Friedman CmdArgs.push_back("-a32"); 51017972c88f674475037fa11fea718565e5bcdd61a6Eli Friedman CmdArgs.push_back("-mppc"); 51027972c88f674475037fa11fea718565e5bcdd61a6Eli Friedman CmdArgs.push_back("-many"); 51037972c88f674475037fa11fea718565e5bcdd61a6Eli Friedman } else if (getToolChain().getArch() == llvm::Triple::ppc64) { 51047972c88f674475037fa11fea718565e5bcdd61a6Eli Friedman CmdArgs.push_back("-a64"); 51057972c88f674475037fa11fea718565e5bcdd61a6Eli Friedman CmdArgs.push_back("-mppc64"); 51067972c88f674475037fa11fea718565e5bcdd61a6Eli Friedman CmdArgs.push_back("-many"); 5107ba30bbe4e36a30a274da809a11a42f9cdc168e92Rafael Espindola } else if (getToolChain().getArch() == llvm::Triple::arm) { 51085f9e272e632e951b1efe824cd16acb4d96077930Chris Lattner StringRef MArch = getToolChain().getArchName(); 5109ba30bbe4e36a30a274da809a11a42f9cdc168e92Rafael Espindola if (MArch == "armv7" || MArch == "armv7a" || MArch == "armv7-a") 5110ba30bbe4e36a30a274da809a11a42f9cdc168e92Rafael Espindola CmdArgs.push_back("-mfpu=neon"); 5111700c508fd469a971480c36d54ae12fe9011f27c0Evgeniy Stepanov 5112700c508fd469a971480c36d54ae12fe9011f27c0Evgeniy Stepanov StringRef ARMFloatABI = getARMFloatABI(getToolChain().getDriver(), Args, 5113700c508fd469a971480c36d54ae12fe9011f27c0Evgeniy Stepanov getToolChain().getTriple()); 5114700c508fd469a971480c36d54ae12fe9011f27c0Evgeniy Stepanov CmdArgs.push_back(Args.MakeArgString("-mfloat-abi=" + ARMFloatABI)); 5115eca187e9f20886f20bb0ea78b4f4b87a18a96b8cEvgeniy Stepanov 5116eca187e9f20886f20bb0ea78b4f4b87a18a96b8cEvgeniy Stepanov Args.AddLastArg(CmdArgs, options::OPT_march_EQ); 5117eca187e9f20886f20bb0ea78b4f4b87a18a96b8cEvgeniy Stepanov Args.AddLastArg(CmdArgs, options::OPT_mcpu_EQ); 5118eca187e9f20886f20bb0ea78b4f4b87a18a96b8cEvgeniy Stepanov Args.AddLastArg(CmdArgs, options::OPT_mfpu_EQ); 5119c85900f4d6aec17ef29140bfc97977463ac75cb2Akira Hatanaka } else if (getToolChain().getArch() == llvm::Triple::mips || 5120c85900f4d6aec17ef29140bfc97977463ac75cb2Akira Hatanaka getToolChain().getArch() == llvm::Triple::mipsel || 5121c85900f4d6aec17ef29140bfc97977463ac75cb2Akira Hatanaka getToolChain().getArch() == llvm::Triple::mips64 || 5122c85900f4d6aec17ef29140bfc97977463ac75cb2Akira Hatanaka getToolChain().getArch() == llvm::Triple::mips64el) { 5123073a780f7cb863cd382d1c966ef11d05c6fad075Simon Atanasyan StringRef CPUName; 5124073a780f7cb863cd382d1c966ef11d05c6fad075Simon Atanasyan StringRef ABIName; 5125073a780f7cb863cd382d1c966ef11d05c6fad075Simon Atanasyan getMipsCPUAndABI(Args, getToolChain(), CPUName, ABIName); 5126c85900f4d6aec17ef29140bfc97977463ac75cb2Akira Hatanaka 5127073a780f7cb863cd382d1c966ef11d05c6fad075Simon Atanasyan CmdArgs.push_back("-march"); 5128073a780f7cb863cd382d1c966ef11d05c6fad075Simon Atanasyan CmdArgs.push_back(CPUName.data()); 5129073a780f7cb863cd382d1c966ef11d05c6fad075Simon Atanasyan 5130073a780f7cb863cd382d1c966ef11d05c6fad075Simon Atanasyan // Convert ABI name to the GNU tools acceptable variant. 5131073a780f7cb863cd382d1c966ef11d05c6fad075Simon Atanasyan if (ABIName == "o32") 5132073a780f7cb863cd382d1c966ef11d05c6fad075Simon Atanasyan ABIName = "32"; 5133073a780f7cb863cd382d1c966ef11d05c6fad075Simon Atanasyan else if (ABIName == "n64") 5134073a780f7cb863cd382d1c966ef11d05c6fad075Simon Atanasyan ABIName = "64"; 5135073a780f7cb863cd382d1c966ef11d05c6fad075Simon Atanasyan 5136073a780f7cb863cd382d1c966ef11d05c6fad075Simon Atanasyan CmdArgs.push_back("-mabi"); 5137073a780f7cb863cd382d1c966ef11d05c6fad075Simon Atanasyan CmdArgs.push_back(ABIName.data()); 51385f0a1c12dacadd5a061ea5b57d51cf6798ae22a1Simon Atanasyan 51395f0a1c12dacadd5a061ea5b57d51cf6798ae22a1Simon Atanasyan if (getToolChain().getArch() == llvm::Triple::mips || 51405f0a1c12dacadd5a061ea5b57d51cf6798ae22a1Simon Atanasyan getToolChain().getArch() == llvm::Triple::mips64) 51415f0a1c12dacadd5a061ea5b57d51cf6798ae22a1Simon Atanasyan CmdArgs.push_back("-EB"); 51425f0a1c12dacadd5a061ea5b57d51cf6798ae22a1Simon Atanasyan else 51435f0a1c12dacadd5a061ea5b57d51cf6798ae22a1Simon Atanasyan CmdArgs.push_back("-EL"); 5144ba30bbe4e36a30a274da809a11a42f9cdc168e92Rafael Espindola } 5145ba30bbe4e36a30a274da809a11a42f9cdc168e92Rafael Espindola 5146ba30bbe4e36a30a274da809a11a42f9cdc168e92Rafael Espindola Args.AddAllArgValues(CmdArgs, options::OPT_Wa_COMMA, 5147ba30bbe4e36a30a274da809a11a42f9cdc168e92Rafael Espindola options::OPT_Xassembler); 5148ba30bbe4e36a30a274da809a11a42f9cdc168e92Rafael Espindola 5149ba30bbe4e36a30a274da809a11a42f9cdc168e92Rafael Espindola CmdArgs.push_back("-o"); 5150ba30bbe4e36a30a274da809a11a42f9cdc168e92Rafael Espindola CmdArgs.push_back(Output.getFilename()); 5151ba30bbe4e36a30a274da809a11a42f9cdc168e92Rafael Espindola 5152ba30bbe4e36a30a274da809a11a42f9cdc168e92Rafael Espindola for (InputInfoList::const_iterator 5153ba30bbe4e36a30a274da809a11a42f9cdc168e92Rafael Espindola it = Inputs.begin(), ie = Inputs.end(); it != ie; ++it) { 5154ba30bbe4e36a30a274da809a11a42f9cdc168e92Rafael Espindola const InputInfo &II = *it; 5155ba30bbe4e36a30a274da809a11a42f9cdc168e92Rafael Espindola CmdArgs.push_back(II.getFilename()); 5156ba30bbe4e36a30a274da809a11a42f9cdc168e92Rafael Espindola } 5157ba30bbe4e36a30a274da809a11a42f9cdc168e92Rafael Espindola 5158ba30bbe4e36a30a274da809a11a42f9cdc168e92Rafael Espindola const char *Exec = 5159ba30bbe4e36a30a274da809a11a42f9cdc168e92Rafael Espindola Args.MakeArgString(getToolChain().GetProgramPath("as")); 5160ba30bbe4e36a30a274da809a11a42f9cdc168e92Rafael Espindola C.addCommand(new Command(JA, *this, Exec, CmdArgs)); 5161ba30bbe4e36a30a274da809a11a42f9cdc168e92Rafael Espindola} 5162ba30bbe4e36a30a274da809a11a42f9cdc168e92Rafael Espindola 5163a6ddc02921d47d0a1dc9ffe4d31438f250751e05Evgeniy Stepanovstatic void AddLibgcc(llvm::Triple Triple, const Driver &D, 5164a6ddc02921d47d0a1dc9ffe4d31438f250751e05Evgeniy Stepanov ArgStringList &CmdArgs, const ArgList &Args) { 5165a6ddc02921d47d0a1dc9ffe4d31438f250751e05Evgeniy Stepanov bool isAndroid = Triple.getEnvironment() == llvm::Triple::ANDROIDEABI; 5166a6ddc02921d47d0a1dc9ffe4d31438f250751e05Evgeniy Stepanov bool StaticLibgcc = isAndroid || Args.hasArg(options::OPT_static) || 5167abf3ac7131ba8eab1a2ec99397a776fb0c75ff55Rafael Espindola Args.hasArg(options::OPT_static_libgcc); 5168abf3ac7131ba8eab1a2ec99397a776fb0c75ff55Rafael Espindola if (!D.CCCIsCXX) 5169abf3ac7131ba8eab1a2ec99397a776fb0c75ff55Rafael Espindola CmdArgs.push_back("-lgcc"); 5170abf3ac7131ba8eab1a2ec99397a776fb0c75ff55Rafael Espindola 5171abf3ac7131ba8eab1a2ec99397a776fb0c75ff55Rafael Espindola if (StaticLibgcc) { 5172abf3ac7131ba8eab1a2ec99397a776fb0c75ff55Rafael Espindola if (D.CCCIsCXX) 5173abf3ac7131ba8eab1a2ec99397a776fb0c75ff55Rafael Espindola CmdArgs.push_back("-lgcc"); 5174abf3ac7131ba8eab1a2ec99397a776fb0c75ff55Rafael Espindola } else { 5175abf3ac7131ba8eab1a2ec99397a776fb0c75ff55Rafael Espindola if (!D.CCCIsCXX) 5176abf3ac7131ba8eab1a2ec99397a776fb0c75ff55Rafael Espindola CmdArgs.push_back("--as-needed"); 5177abf3ac7131ba8eab1a2ec99397a776fb0c75ff55Rafael Espindola CmdArgs.push_back("-lgcc_s"); 5178abf3ac7131ba8eab1a2ec99397a776fb0c75ff55Rafael Espindola if (!D.CCCIsCXX) 5179abf3ac7131ba8eab1a2ec99397a776fb0c75ff55Rafael Espindola CmdArgs.push_back("--no-as-needed"); 5180abf3ac7131ba8eab1a2ec99397a776fb0c75ff55Rafael Espindola } 5181abf3ac7131ba8eab1a2ec99397a776fb0c75ff55Rafael Espindola 5182a6ddc02921d47d0a1dc9ffe4d31438f250751e05Evgeniy Stepanov if (StaticLibgcc && !isAndroid) 5183abf3ac7131ba8eab1a2ec99397a776fb0c75ff55Rafael Espindola CmdArgs.push_back("-lgcc_eh"); 5184abf3ac7131ba8eab1a2ec99397a776fb0c75ff55Rafael Espindola else if (!Args.hasArg(options::OPT_shared) && D.CCCIsCXX) 5185abf3ac7131ba8eab1a2ec99397a776fb0c75ff55Rafael Espindola CmdArgs.push_back("-lgcc"); 5186abf3ac7131ba8eab1a2ec99397a776fb0c75ff55Rafael Espindola} 5187abf3ac7131ba8eab1a2ec99397a776fb0c75ff55Rafael Espindola 5188c1da981bba867681004004b2d54ec2fdf3c08913Rafael Espindolavoid linuxtools::Link::ConstructJob(Compilation &C, const JobAction &JA, 5189c1da981bba867681004004b2d54ec2fdf3c08913Rafael Espindola const InputInfo &Output, 5190c1da981bba867681004004b2d54ec2fdf3c08913Rafael Espindola const InputInfoList &Inputs, 5191c1da981bba867681004004b2d54ec2fdf3c08913Rafael Espindola const ArgList &Args, 5192c1da981bba867681004004b2d54ec2fdf3c08913Rafael Espindola const char *LinkingOutput) const { 5193c1da981bba867681004004b2d54ec2fdf3c08913Rafael Espindola const toolchains::Linux& ToolChain = 5194c1da981bba867681004004b2d54ec2fdf3c08913Rafael Espindola static_cast<const toolchains::Linux&>(getToolChain()); 5195c1da981bba867681004004b2d54ec2fdf3c08913Rafael Espindola const Driver &D = ToolChain.getDriver(); 5196a6ddc02921d47d0a1dc9ffe4d31438f250751e05Evgeniy Stepanov const bool isAndroid = ToolChain.getTriple().getEnvironment() == 5197a6ddc02921d47d0a1dc9ffe4d31438f250751e05Evgeniy Stepanov llvm::Triple::ANDROIDEABI; 5198a6ddc02921d47d0a1dc9ffe4d31438f250751e05Evgeniy Stepanov 5199c1da981bba867681004004b2d54ec2fdf3c08913Rafael Espindola ArgStringList CmdArgs; 5200c1da981bba867681004004b2d54ec2fdf3c08913Rafael Espindola 520126f14c309e8de2db8c144342808cca2e869c1777Rafael Espindola // Silence warning for "clang -g foo.o -o foo" 520226f14c309e8de2db8c144342808cca2e869c1777Rafael Espindola Args.ClaimAllArgs(options::OPT_g_Group); 52039c094fbcfaba49fc1aeca119c0e12bec59779692Rafael Espindola // and "clang -emit-llvm foo.o -o foo" 52049c094fbcfaba49fc1aeca119c0e12bec59779692Rafael Espindola Args.ClaimAllArgs(options::OPT_emit_llvm); 52057f6458b7e265d1870f3bd5be2b49bc4d368446b3Rafael Espindola // and for "clang -g foo.o -o foo". Other warning options are already 52067f6458b7e265d1870f3bd5be2b49bc4d368446b3Rafael Espindola // handled somewhere else. 52077f6458b7e265d1870f3bd5be2b49bc4d368446b3Rafael Espindola Args.ClaimAllArgs(options::OPT_w); 520826f14c309e8de2db8c144342808cca2e869c1777Rafael Espindola 52098ab2bdcc4f397e100c684ede8e8ca6e226e1380aJoerg Sonnenberger if (!D.SysRoot.empty()) 52108ab2bdcc4f397e100c684ede8e8ca6e226e1380aJoerg Sonnenberger CmdArgs.push_back(Args.MakeArgString("--sysroot=" + D.SysRoot)); 5211c1da981bba867681004004b2d54ec2fdf3c08913Rafael Espindola 5212fdda17179047ff0b5e28cc777dc89ebc42f083cfRafael Espindola if (Args.hasArg(options::OPT_pie)) 5213fdda17179047ff0b5e28cc777dc89ebc42f083cfRafael Espindola CmdArgs.push_back("-pie"); 5214fdda17179047ff0b5e28cc777dc89ebc42f083cfRafael Espindola 5215dc1b76ddfc687c713a55cc9e3e054e9a0de1aa74Rafael Espindola if (Args.hasArg(options::OPT_rdynamic)) 5216dc1b76ddfc687c713a55cc9e3e054e9a0de1aa74Rafael Espindola CmdArgs.push_back("-export-dynamic"); 5217dc1b76ddfc687c713a55cc9e3e054e9a0de1aa74Rafael Espindola 5218e0e6d3b5cf61dfefad3c0393f4786d2cf3d9c272Rafael Espindola if (Args.hasArg(options::OPT_s)) 5219e0e6d3b5cf61dfefad3c0393f4786d2cf3d9c272Rafael Espindola CmdArgs.push_back("-s"); 5220e0e6d3b5cf61dfefad3c0393f4786d2cf3d9c272Rafael Espindola 5221c1da981bba867681004004b2d54ec2fdf3c08913Rafael Espindola for (std::vector<std::string>::const_iterator i = ToolChain.ExtraOpts.begin(), 5222c1da981bba867681004004b2d54ec2fdf3c08913Rafael Espindola e = ToolChain.ExtraOpts.end(); 5223c1da981bba867681004004b2d54ec2fdf3c08913Rafael Espindola i != e; ++i) 5224c1da981bba867681004004b2d54ec2fdf3c08913Rafael Espindola CmdArgs.push_back(i->c_str()); 5225c1da981bba867681004004b2d54ec2fdf3c08913Rafael Espindola 5226c1da981bba867681004004b2d54ec2fdf3c08913Rafael Espindola if (!Args.hasArg(options::OPT_static)) { 5227c1da981bba867681004004b2d54ec2fdf3c08913Rafael Espindola CmdArgs.push_back("--eh-frame-hdr"); 5228c1da981bba867681004004b2d54ec2fdf3c08913Rafael Espindola } 5229c1da981bba867681004004b2d54ec2fdf3c08913Rafael Espindola 5230c1da981bba867681004004b2d54ec2fdf3c08913Rafael Espindola CmdArgs.push_back("-m"); 5231c1da981bba867681004004b2d54ec2fdf3c08913Rafael Espindola if (ToolChain.getArch() == llvm::Triple::x86) 5232c1da981bba867681004004b2d54ec2fdf3c08913Rafael Espindola CmdArgs.push_back("elf_i386"); 523388b7cf00fcb582728c642da3927c59468efaf926Eric Christopher else if (ToolChain.getArch() == llvm::Triple::arm 5234f0594d8b64cf32c55dde7a49ba849e864446c92bDouglas Gregor || ToolChain.getArch() == llvm::Triple::thumb) 5235c1da981bba867681004004b2d54ec2fdf3c08913Rafael Espindola CmdArgs.push_back("armelf_linux_eabi"); 523643ac2978291bf1471e2c916a88c7f1c1e170dc19Ted Kremenek else if (ToolChain.getArch() == llvm::Triple::ppc) 523743ac2978291bf1471e2c916a88c7f1c1e170dc19Ted Kremenek CmdArgs.push_back("elf32ppclinux"); 523843ac2978291bf1471e2c916a88c7f1c1e170dc19Ted Kremenek else if (ToolChain.getArch() == llvm::Triple::ppc64) 523943ac2978291bf1471e2c916a88c7f1c1e170dc19Ted Kremenek CmdArgs.push_back("elf64ppc"); 52405bea4f6860543017be326e3fbe702edb2678d898Eli Friedman else if (ToolChain.getArch() == llvm::Triple::mips) 52415bea4f6860543017be326e3fbe702edb2678d898Eli Friedman CmdArgs.push_back("elf32btsmip"); 52425bea4f6860543017be326e3fbe702edb2678d898Eli Friedman else if (ToolChain.getArch() == llvm::Triple::mipsel) 52435bea4f6860543017be326e3fbe702edb2678d898Eli Friedman CmdArgs.push_back("elf32ltsmip"); 52445bea4f6860543017be326e3fbe702edb2678d898Eli Friedman else if (ToolChain.getArch() == llvm::Triple::mips64) 52455bea4f6860543017be326e3fbe702edb2678d898Eli Friedman CmdArgs.push_back("elf64btsmip"); 52465bea4f6860543017be326e3fbe702edb2678d898Eli Friedman else if (ToolChain.getArch() == llvm::Triple::mips64el) 52475bea4f6860543017be326e3fbe702edb2678d898Eli Friedman CmdArgs.push_back("elf64ltsmip"); 5248c1da981bba867681004004b2d54ec2fdf3c08913Rafael Espindola else 5249c1da981bba867681004004b2d54ec2fdf3c08913Rafael Espindola CmdArgs.push_back("elf_x86_64"); 5250c1da981bba867681004004b2d54ec2fdf3c08913Rafael Espindola 5251c1da981bba867681004004b2d54ec2fdf3c08913Rafael Espindola if (Args.hasArg(options::OPT_static)) { 5252f0594d8b64cf32c55dde7a49ba849e864446c92bDouglas Gregor if (ToolChain.getArch() == llvm::Triple::arm 5253f0594d8b64cf32c55dde7a49ba849e864446c92bDouglas Gregor || ToolChain.getArch() == llvm::Triple::thumb) 5254c1da981bba867681004004b2d54ec2fdf3c08913Rafael Espindola CmdArgs.push_back("-Bstatic"); 5255c1da981bba867681004004b2d54ec2fdf3c08913Rafael Espindola else 5256c1da981bba867681004004b2d54ec2fdf3c08913Rafael Espindola CmdArgs.push_back("-static"); 5257c1da981bba867681004004b2d54ec2fdf3c08913Rafael Espindola } else if (Args.hasArg(options::OPT_shared)) { 5258c1da981bba867681004004b2d54ec2fdf3c08913Rafael Espindola CmdArgs.push_back("-shared"); 5259a6ddc02921d47d0a1dc9ffe4d31438f250751e05Evgeniy Stepanov if ((ToolChain.getArch() == llvm::Triple::arm 5260a6ddc02921d47d0a1dc9ffe4d31438f250751e05Evgeniy Stepanov || ToolChain.getArch() == llvm::Triple::thumb) && isAndroid) { 5261a6ddc02921d47d0a1dc9ffe4d31438f250751e05Evgeniy Stepanov CmdArgs.push_back("-Bsymbolic"); 5262a6ddc02921d47d0a1dc9ffe4d31438f250751e05Evgeniy Stepanov } 5263c1da981bba867681004004b2d54ec2fdf3c08913Rafael Espindola } 5264c1da981bba867681004004b2d54ec2fdf3c08913Rafael Espindola 5265c1da981bba867681004004b2d54ec2fdf3c08913Rafael Espindola if (ToolChain.getArch() == llvm::Triple::arm || 5266f0594d8b64cf32c55dde7a49ba849e864446c92bDouglas Gregor ToolChain.getArch() == llvm::Triple::thumb || 5267c1da981bba867681004004b2d54ec2fdf3c08913Rafael Espindola (!Args.hasArg(options::OPT_static) && 5268c1da981bba867681004004b2d54ec2fdf3c08913Rafael Espindola !Args.hasArg(options::OPT_shared))) { 5269c1da981bba867681004004b2d54ec2fdf3c08913Rafael Espindola CmdArgs.push_back("-dynamic-linker"); 5270a6ddc02921d47d0a1dc9ffe4d31438f250751e05Evgeniy Stepanov if (isAndroid) 5271a6ddc02921d47d0a1dc9ffe4d31438f250751e05Evgeniy Stepanov CmdArgs.push_back("/system/bin/linker"); 5272a6ddc02921d47d0a1dc9ffe4d31438f250751e05Evgeniy Stepanov else if (ToolChain.getArch() == llvm::Triple::x86) 5273c1da981bba867681004004b2d54ec2fdf3c08913Rafael Espindola CmdArgs.push_back("/lib/ld-linux.so.2"); 5274f0594d8b64cf32c55dde7a49ba849e864446c92bDouglas Gregor else if (ToolChain.getArch() == llvm::Triple::arm || 5275f0594d8b64cf32c55dde7a49ba849e864446c92bDouglas Gregor ToolChain.getArch() == llvm::Triple::thumb) 5276c1da981bba867681004004b2d54ec2fdf3c08913Rafael Espindola CmdArgs.push_back("/lib/ld-linux.so.3"); 52775bea4f6860543017be326e3fbe702edb2678d898Eli Friedman else if (ToolChain.getArch() == llvm::Triple::mips || 52785bea4f6860543017be326e3fbe702edb2678d898Eli Friedman ToolChain.getArch() == llvm::Triple::mipsel) 52795bea4f6860543017be326e3fbe702edb2678d898Eli Friedman CmdArgs.push_back("/lib/ld.so.1"); 52808491cb245f7fccfb049f860444467130f68189d3Simon Atanasyan else if (ToolChain.getArch() == llvm::Triple::mips64 || 52818491cb245f7fccfb049f860444467130f68189d3Simon Atanasyan ToolChain.getArch() == llvm::Triple::mips64el) 52828491cb245f7fccfb049f860444467130f68189d3Simon Atanasyan CmdArgs.push_back("/lib64/ld.so.1"); 528343ac2978291bf1471e2c916a88c7f1c1e170dc19Ted Kremenek else if (ToolChain.getArch() == llvm::Triple::ppc) 528409f43ed8a1be67360fde9b335eac60bac8db8e19Chris Lattner CmdArgs.push_back("/lib/ld.so.1"); 528543ac2978291bf1471e2c916a88c7f1c1e170dc19Ted Kremenek else if (ToolChain.getArch() == llvm::Triple::ppc64) 528609f43ed8a1be67360fde9b335eac60bac8db8e19Chris Lattner CmdArgs.push_back("/lib64/ld64.so.1"); 5287c1da981bba867681004004b2d54ec2fdf3c08913Rafael Espindola else 5288c1da981bba867681004004b2d54ec2fdf3c08913Rafael Espindola CmdArgs.push_back("/lib64/ld-linux-x86-64.so.2"); 5289c1da981bba867681004004b2d54ec2fdf3c08913Rafael Espindola } 5290c1da981bba867681004004b2d54ec2fdf3c08913Rafael Espindola 5291c1da981bba867681004004b2d54ec2fdf3c08913Rafael Espindola CmdArgs.push_back("-o"); 5292c1da981bba867681004004b2d54ec2fdf3c08913Rafael Espindola CmdArgs.push_back(Output.getFilename()); 5293c1da981bba867681004004b2d54ec2fdf3c08913Rafael Espindola 529449c64fdcf354c7998b8b301402fb6140c24df36aRafael Espindola if (!Args.hasArg(options::OPT_nostdlib) && 529549c64fdcf354c7998b8b301402fb6140c24df36aRafael Espindola !Args.hasArg(options::OPT_nostartfiles)) { 5296a6ddc02921d47d0a1dc9ffe4d31438f250751e05Evgeniy Stepanov if (!isAndroid) { 5297a6ddc02921d47d0a1dc9ffe4d31438f250751e05Evgeniy Stepanov const char *crt1 = NULL; 5298a6ddc02921d47d0a1dc9ffe4d31438f250751e05Evgeniy Stepanov if (!Args.hasArg(options::OPT_shared)){ 5299a6ddc02921d47d0a1dc9ffe4d31438f250751e05Evgeniy Stepanov if (Args.hasArg(options::OPT_pie)) 5300a6ddc02921d47d0a1dc9ffe4d31438f250751e05Evgeniy Stepanov crt1 = "Scrt1.o"; 5301a6ddc02921d47d0a1dc9ffe4d31438f250751e05Evgeniy Stepanov else 5302a6ddc02921d47d0a1dc9ffe4d31438f250751e05Evgeniy Stepanov crt1 = "crt1.o"; 5303a6ddc02921d47d0a1dc9ffe4d31438f250751e05Evgeniy Stepanov } 5304a6ddc02921d47d0a1dc9ffe4d31438f250751e05Evgeniy Stepanov if (crt1) 5305a6ddc02921d47d0a1dc9ffe4d31438f250751e05Evgeniy Stepanov CmdArgs.push_back(Args.MakeArgString(ToolChain.GetFilePath(crt1))); 5306c1da981bba867681004004b2d54ec2fdf3c08913Rafael Espindola 5307a6ddc02921d47d0a1dc9ffe4d31438f250751e05Evgeniy Stepanov CmdArgs.push_back(Args.MakeArgString(ToolChain.GetFilePath("crti.o"))); 5308a6ddc02921d47d0a1dc9ffe4d31438f250751e05Evgeniy Stepanov } 5309c1da981bba867681004004b2d54ec2fdf3c08913Rafael Espindola 531089414b384a0004c698244cc675f49d0669bb3463Rafael Espindola const char *crtbegin; 531189414b384a0004c698244cc675f49d0669bb3463Rafael Espindola if (Args.hasArg(options::OPT_static)) 5312a6ddc02921d47d0a1dc9ffe4d31438f250751e05Evgeniy Stepanov crtbegin = isAndroid ? "crtbegin_static.o" : "crtbeginT.o"; 5313fdda17179047ff0b5e28cc777dc89ebc42f083cfRafael Espindola else if (Args.hasArg(options::OPT_shared) || Args.hasArg(options::OPT_pie)) 5314a6ddc02921d47d0a1dc9ffe4d31438f250751e05Evgeniy Stepanov crtbegin = isAndroid ? "crtbegin_so.o" : "crtbeginS.o"; 531589414b384a0004c698244cc675f49d0669bb3463Rafael Espindola else 5316a6ddc02921d47d0a1dc9ffe4d31438f250751e05Evgeniy Stepanov crtbegin = isAndroid ? "crtbegin_dynamic.o" : "crtbegin.o"; 531789414b384a0004c698244cc675f49d0669bb3463Rafael Espindola CmdArgs.push_back(Args.MakeArgString(ToolChain.GetFilePath(crtbegin))); 531889414b384a0004c698244cc675f49d0669bb3463Rafael Espindola } 5319c1da981bba867681004004b2d54ec2fdf3c08913Rafael Espindola 5320c1da981bba867681004004b2d54ec2fdf3c08913Rafael Espindola Args.AddAllArgs(CmdArgs, options::OPT_L); 5321c1da981bba867681004004b2d54ec2fdf3c08913Rafael Espindola 5322c1da981bba867681004004b2d54ec2fdf3c08913Rafael Espindola const ToolChain::path_list Paths = ToolChain.getFilePaths(); 5323c1da981bba867681004004b2d54ec2fdf3c08913Rafael Espindola 532458e5ac9d41d8186bea92e892d572e2eea28d3f9cRoman Divacky for (ToolChain::path_list::const_iterator i = Paths.begin(), e = Paths.end(); 532558e5ac9d41d8186bea92e892d572e2eea28d3f9cRoman Divacky i != e; ++i) 53265f9e272e632e951b1efe824cd16acb4d96077930Chris Lattner CmdArgs.push_back(Args.MakeArgString(StringRef("-L") + *i)); 5327c1da981bba867681004004b2d54ec2fdf3c08913Rafael Espindola 5328c5151543236bd213b8595a079cf9b1d26de4eeb1Rafael Espindola // Tell the linker to load the plugin. This has to come before AddLinkerInputs 5329c5151543236bd213b8595a079cf9b1d26de4eeb1Rafael Espindola // as gold requires -plugin to come before any -plugin-opt that -Wl might 5330c5151543236bd213b8595a079cf9b1d26de4eeb1Rafael Espindola // forward. 5331c5151543236bd213b8595a079cf9b1d26de4eeb1Rafael Espindola if (D.IsUsingLTO(Args) || Args.hasArg(options::OPT_use_gold_plugin)) { 5332c5151543236bd213b8595a079cf9b1d26de4eeb1Rafael Espindola CmdArgs.push_back("-plugin"); 5333c5151543236bd213b8595a079cf9b1d26de4eeb1Rafael Espindola std::string Plugin = ToolChain.getDriver().Dir + "/../lib/LLVMgold.so"; 5334c5151543236bd213b8595a079cf9b1d26de4eeb1Rafael Espindola CmdArgs.push_back(Args.MakeArgString(Plugin)); 5335c5151543236bd213b8595a079cf9b1d26de4eeb1Rafael Espindola } 5336c5151543236bd213b8595a079cf9b1d26de4eeb1Rafael Espindola 5337c1da981bba867681004004b2d54ec2fdf3c08913Rafael Espindola AddLinkerInputs(ToolChain, Inputs, Args, CmdArgs); 5338c1da981bba867681004004b2d54ec2fdf3c08913Rafael Espindola 53392ba542c741c39691940f5d1de0bc88c22f46c430Chandler Carruth if (D.CCCIsCXX && 53402ba542c741c39691940f5d1de0bc88c22f46c430Chandler Carruth !Args.hasArg(options::OPT_nostdlib) && 53412ba542c741c39691940f5d1de0bc88c22f46c430Chandler Carruth !Args.hasArg(options::OPT_nodefaultlibs)) { 534219706f8e702c04d19bc1ace504cbb9df008b6daaRafael Espindola bool OnlyLibstdcxxStatic = Args.hasArg(options::OPT_static_libstdcxx) && 534319706f8e702c04d19bc1ace504cbb9df008b6daaRafael Espindola !Args.hasArg(options::OPT_static); 534419706f8e702c04d19bc1ace504cbb9df008b6daaRafael Espindola if (OnlyLibstdcxxStatic) 534519706f8e702c04d19bc1ace504cbb9df008b6daaRafael Espindola CmdArgs.push_back("-Bstatic"); 5346c1da981bba867681004004b2d54ec2fdf3c08913Rafael Espindola ToolChain.AddCXXStdlibLibArgs(Args, CmdArgs); 534719706f8e702c04d19bc1ace504cbb9df008b6daaRafael Espindola if (OnlyLibstdcxxStatic) 534819706f8e702c04d19bc1ace504cbb9df008b6daaRafael Espindola CmdArgs.push_back("-Bdynamic"); 5349c1da981bba867681004004b2d54ec2fdf3c08913Rafael Espindola CmdArgs.push_back("-lm"); 5350c1da981bba867681004004b2d54ec2fdf3c08913Rafael Espindola } 5351c1da981bba867681004004b2d54ec2fdf3c08913Rafael Espindola 5352dff466c0791465f929a1d8cd551d4c84b360ba32Kostya Serebryany // Call this before we add the C run-time. 5353dff466c0791465f929a1d8cd551d4c84b360ba32Kostya Serebryany addAsanRTLinux(getToolChain(), Args, CmdArgs); 5354f7efb0e7478da45bc7f2d24dbeb08406d2399591Kostya Serebryany addTsanRTLinux(getToolChain(), Args, CmdArgs); 5355dff466c0791465f929a1d8cd551d4c84b360ba32Kostya Serebryany 535689414b384a0004c698244cc675f49d0669bb3463Rafael Espindola if (!Args.hasArg(options::OPT_nostdlib)) { 53572ba542c741c39691940f5d1de0bc88c22f46c430Chandler Carruth if (!Args.hasArg(options::OPT_nodefaultlibs)) { 53582ba542c741c39691940f5d1de0bc88c22f46c430Chandler Carruth if (Args.hasArg(options::OPT_static)) 53592ba542c741c39691940f5d1de0bc88c22f46c430Chandler Carruth CmdArgs.push_back("--start-group"); 5360e0e6d3b5cf61dfefad3c0393f4786d2cf3d9c272Rafael Espindola 53612ba542c741c39691940f5d1de0bc88c22f46c430Chandler Carruth AddLibgcc(ToolChain.getTriple(), D, CmdArgs, Args); 5362c1da981bba867681004004b2d54ec2fdf3c08913Rafael Espindola 53632ba542c741c39691940f5d1de0bc88c22f46c430Chandler Carruth if (Args.hasArg(options::OPT_pthread) || 53642ba542c741c39691940f5d1de0bc88c22f46c430Chandler Carruth Args.hasArg(options::OPT_pthreads)) 53652ba542c741c39691940f5d1de0bc88c22f46c430Chandler Carruth CmdArgs.push_back("-lpthread"); 5366c1da981bba867681004004b2d54ec2fdf3c08913Rafael Espindola 53672ba542c741c39691940f5d1de0bc88c22f46c430Chandler Carruth CmdArgs.push_back("-lc"); 5368c1da981bba867681004004b2d54ec2fdf3c08913Rafael Espindola 53692ba542c741c39691940f5d1de0bc88c22f46c430Chandler Carruth if (Args.hasArg(options::OPT_static)) 53702ba542c741c39691940f5d1de0bc88c22f46c430Chandler Carruth CmdArgs.push_back("--end-group"); 53712ba542c741c39691940f5d1de0bc88c22f46c430Chandler Carruth else 53722ba542c741c39691940f5d1de0bc88c22f46c430Chandler Carruth AddLibgcc(ToolChain.getTriple(), D, CmdArgs, Args); 53732ba542c741c39691940f5d1de0bc88c22f46c430Chandler Carruth } 5374fdda17179047ff0b5e28cc777dc89ebc42f083cfRafael Espindola 537549c64fdcf354c7998b8b301402fb6140c24df36aRafael Espindola if (!Args.hasArg(options::OPT_nostartfiles)) { 537649c64fdcf354c7998b8b301402fb6140c24df36aRafael Espindola const char *crtend; 537749c64fdcf354c7998b8b301402fb6140c24df36aRafael Espindola if (Args.hasArg(options::OPT_shared) || Args.hasArg(options::OPT_pie)) 5378a6ddc02921d47d0a1dc9ffe4d31438f250751e05Evgeniy Stepanov crtend = isAndroid ? "crtend_so.o" : "crtendS.o"; 537949c64fdcf354c7998b8b301402fb6140c24df36aRafael Espindola else 5380a6ddc02921d47d0a1dc9ffe4d31438f250751e05Evgeniy Stepanov crtend = isAndroid ? "crtend_android.o" : "crtend.o"; 538189414b384a0004c698244cc675f49d0669bb3463Rafael Espindola 538249c64fdcf354c7998b8b301402fb6140c24df36aRafael Espindola CmdArgs.push_back(Args.MakeArgString(ToolChain.GetFilePath(crtend))); 5383a6ddc02921d47d0a1dc9ffe4d31438f250751e05Evgeniy Stepanov if (!isAndroid) 5384a6ddc02921d47d0a1dc9ffe4d31438f250751e05Evgeniy Stepanov CmdArgs.push_back(Args.MakeArgString(ToolChain.GetFilePath("crtn.o"))); 538549c64fdcf354c7998b8b301402fb6140c24df36aRafael Espindola } 538689414b384a0004c698244cc675f49d0669bb3463Rafael Espindola } 5387c1da981bba867681004004b2d54ec2fdf3c08913Rafael Espindola 53883f4be6fb8872942f567166ab8d99c89885f26103Bill Wendling addProfileRT(getToolChain(), Args, CmdArgs, getToolChain().getTriple()); 53892e95a6d7d0b5aed39747875d7474c27824f7319fNick Lewycky 5390c1da981bba867681004004b2d54ec2fdf3c08913Rafael Espindola C.addCommand(new Command(JA, *this, ToolChain.Linker.c_str(), CmdArgs)); 5391c1da981bba867681004004b2d54ec2fdf3c08913Rafael Espindola} 5392ba30bbe4e36a30a274da809a11a42f9cdc168e92Rafael Espindola 539338e317d6dce161b249508686cc67eb7176958762Chris Lattnervoid minix::Assemble::ConstructJob(Compilation &C, const JobAction &JA, 53942fe238ed293bd4bc27af9beb9fa151fad2146fa8Daniel Dunbar const InputInfo &Output, 53952fe238ed293bd4bc27af9beb9fa151fad2146fa8Daniel Dunbar const InputInfoList &Inputs, 53962fe238ed293bd4bc27af9beb9fa151fad2146fa8Daniel Dunbar const ArgList &Args, 53972fe238ed293bd4bc27af9beb9fa151fad2146fa8Daniel Dunbar const char *LinkingOutput) const { 539838e317d6dce161b249508686cc67eb7176958762Chris Lattner ArgStringList CmdArgs; 539938e317d6dce161b249508686cc67eb7176958762Chris Lattner 540038e317d6dce161b249508686cc67eb7176958762Chris Lattner Args.AddAllArgValues(CmdArgs, options::OPT_Wa_COMMA, 540138e317d6dce161b249508686cc67eb7176958762Chris Lattner options::OPT_Xassembler); 540238e317d6dce161b249508686cc67eb7176958762Chris Lattner 540338e317d6dce161b249508686cc67eb7176958762Chris Lattner CmdArgs.push_back("-o"); 54047c1e46533cae07216e2a67d5636a5afb44253155Daniel Dunbar CmdArgs.push_back(Output.getFilename()); 540538e317d6dce161b249508686cc67eb7176958762Chris Lattner 540638e317d6dce161b249508686cc67eb7176958762Chris Lattner for (InputInfoList::const_iterator 540738e317d6dce161b249508686cc67eb7176958762Chris Lattner it = Inputs.begin(), ie = Inputs.end(); it != ie; ++it) { 540838e317d6dce161b249508686cc67eb7176958762Chris Lattner const InputInfo &II = *it; 54097c1e46533cae07216e2a67d5636a5afb44253155Daniel Dunbar CmdArgs.push_back(II.getFilename()); 541038e317d6dce161b249508686cc67eb7176958762Chris Lattner } 541138e317d6dce161b249508686cc67eb7176958762Chris Lattner 541238e317d6dce161b249508686cc67eb7176958762Chris Lattner const char *Exec = 54136d402dc963aa32194f3604af4463b113858291aeEli Friedman Args.MakeArgString(getToolChain().GetProgramPath("as")); 54142fe238ed293bd4bc27af9beb9fa151fad2146fa8Daniel Dunbar C.addCommand(new Command(JA, *this, Exec, CmdArgs)); 541538e317d6dce161b249508686cc67eb7176958762Chris Lattner} 541638e317d6dce161b249508686cc67eb7176958762Chris Lattner 541738e317d6dce161b249508686cc67eb7176958762Chris Lattnervoid minix::Link::ConstructJob(Compilation &C, const JobAction &JA, 54182fe238ed293bd4bc27af9beb9fa151fad2146fa8Daniel Dunbar const InputInfo &Output, 54192fe238ed293bd4bc27af9beb9fa151fad2146fa8Daniel Dunbar const InputInfoList &Inputs, 54202fe238ed293bd4bc27af9beb9fa151fad2146fa8Daniel Dunbar const ArgList &Args, 54212fe238ed293bd4bc27af9beb9fa151fad2146fa8Daniel Dunbar const char *LinkingOutput) const { 542238e317d6dce161b249508686cc67eb7176958762Chris Lattner const Driver &D = getToolChain().getDriver(); 542338e317d6dce161b249508686cc67eb7176958762Chris Lattner ArgStringList CmdArgs; 542438e317d6dce161b249508686cc67eb7176958762Chris Lattner 54257c1e46533cae07216e2a67d5636a5afb44253155Daniel Dunbar if (Output.isFilename()) { 542638e317d6dce161b249508686cc67eb7176958762Chris Lattner CmdArgs.push_back("-o"); 542738e317d6dce161b249508686cc67eb7176958762Chris Lattner CmdArgs.push_back(Output.getFilename()); 542838e317d6dce161b249508686cc67eb7176958762Chris Lattner } else { 542938e317d6dce161b249508686cc67eb7176958762Chris Lattner assert(Output.isNothing() && "Invalid output."); 543038e317d6dce161b249508686cc67eb7176958762Chris Lattner } 543138e317d6dce161b249508686cc67eb7176958762Chris Lattner 543238e317d6dce161b249508686cc67eb7176958762Chris Lattner if (!Args.hasArg(options::OPT_nostdlib) && 54336d402dc963aa32194f3604af4463b113858291aeEli Friedman !Args.hasArg(options::OPT_nostartfiles)) { 54346d402dc963aa32194f3604af4463b113858291aeEli Friedman CmdArgs.push_back(Args.MakeArgString(getToolChain().GetFilePath("crt1.o"))); 54356d402dc963aa32194f3604af4463b113858291aeEli Friedman CmdArgs.push_back(Args.MakeArgString(getToolChain().GetFilePath("crti.o"))); 54366d402dc963aa32194f3604af4463b113858291aeEli Friedman CmdArgs.push_back(Args.MakeArgString(getToolChain().GetFilePath("crtbegin.o"))); 54376d402dc963aa32194f3604af4463b113858291aeEli Friedman CmdArgs.push_back(Args.MakeArgString(getToolChain().GetFilePath("crtn.o"))); 54386d402dc963aa32194f3604af4463b113858291aeEli Friedman } 543938e317d6dce161b249508686cc67eb7176958762Chris Lattner 544038e317d6dce161b249508686cc67eb7176958762Chris Lattner Args.AddAllArgs(CmdArgs, options::OPT_L); 544138e317d6dce161b249508686cc67eb7176958762Chris Lattner Args.AddAllArgs(CmdArgs, options::OPT_T_Group); 544238e317d6dce161b249508686cc67eb7176958762Chris Lattner Args.AddAllArgs(CmdArgs, options::OPT_e); 544338e317d6dce161b249508686cc67eb7176958762Chris Lattner 54442008feead855f08500fb01ff43ef5eebee05d1e5Daniel Dunbar AddLinkerInputs(getToolChain(), Inputs, Args, CmdArgs); 544538e317d6dce161b249508686cc67eb7176958762Chris Lattner 54466d402dc963aa32194f3604af4463b113858291aeEli Friedman addProfileRT(getToolChain(), Args, CmdArgs, getToolChain().getTriple()); 54476d402dc963aa32194f3604af4463b113858291aeEli Friedman 544838e317d6dce161b249508686cc67eb7176958762Chris Lattner if (!Args.hasArg(options::OPT_nostdlib) && 544938e317d6dce161b249508686cc67eb7176958762Chris Lattner !Args.hasArg(options::OPT_nodefaultlibs)) { 545038e317d6dce161b249508686cc67eb7176958762Chris Lattner if (D.CCCIsCXX) { 5451132e35d2f87895d20e7ea146c8c00404b80221a1Daniel Dunbar getToolChain().AddCXXStdlibLibArgs(Args, CmdArgs); 545238e317d6dce161b249508686cc67eb7176958762Chris Lattner CmdArgs.push_back("-lm"); 545338e317d6dce161b249508686cc67eb7176958762Chris Lattner } 545438e317d6dce161b249508686cc67eb7176958762Chris Lattner } 545538e317d6dce161b249508686cc67eb7176958762Chris Lattner 545638e317d6dce161b249508686cc67eb7176958762Chris Lattner if (!Args.hasArg(options::OPT_nostdlib) && 545738e317d6dce161b249508686cc67eb7176958762Chris Lattner !Args.hasArg(options::OPT_nostartfiles)) { 54586d402dc963aa32194f3604af4463b113858291aeEli Friedman if (Args.hasArg(options::OPT_pthread)) 54596d402dc963aa32194f3604af4463b113858291aeEli Friedman CmdArgs.push_back("-lpthread"); 54606d402dc963aa32194f3604af4463b113858291aeEli Friedman CmdArgs.push_back("-lc"); 54616d402dc963aa32194f3604af4463b113858291aeEli Friedman CmdArgs.push_back("-lCompilerRT-Generic"); 54626d402dc963aa32194f3604af4463b113858291aeEli Friedman CmdArgs.push_back("-L/usr/pkg/compiler-rt/lib"); 54636d402dc963aa32194f3604af4463b113858291aeEli Friedman CmdArgs.push_back( 54646d402dc963aa32194f3604af4463b113858291aeEli Friedman Args.MakeArgString(getToolChain().GetFilePath("crtend.o"))); 546538e317d6dce161b249508686cc67eb7176958762Chris Lattner } 546638e317d6dce161b249508686cc67eb7176958762Chris Lattner 54676d402dc963aa32194f3604af4463b113858291aeEli Friedman const char *Exec = Args.MakeArgString(getToolChain().GetProgramPath("ld")); 54682fe238ed293bd4bc27af9beb9fa151fad2146fa8Daniel Dunbar C.addCommand(new Command(JA, *this, Exec, CmdArgs)); 546938e317d6dce161b249508686cc67eb7176958762Chris Lattner} 547038e317d6dce161b249508686cc67eb7176958762Chris Lattner 547111e1b40d759a643086f590f6ffbd9d68360bad46Daniel Dunbar/// DragonFly Tools 547211e1b40d759a643086f590f6ffbd9d68360bad46Daniel Dunbar 547311e1b40d759a643086f590f6ffbd9d68360bad46Daniel Dunbar// For now, DragonFly Assemble does just about the same as for 547411e1b40d759a643086f590f6ffbd9d68360bad46Daniel Dunbar// FreeBSD, but this may change soon. 547511e1b40d759a643086f590f6ffbd9d68360bad46Daniel Dunbarvoid dragonfly::Assemble::ConstructJob(Compilation &C, const JobAction &JA, 54762fe238ed293bd4bc27af9beb9fa151fad2146fa8Daniel Dunbar const InputInfo &Output, 5477294691eb1caf551083acd7b08630ef21c3fd760dDaniel Dunbar const InputInfoList &Inputs, 5478294691eb1caf551083acd7b08630ef21c3fd760dDaniel Dunbar const ArgList &Args, 5479294691eb1caf551083acd7b08630ef21c3fd760dDaniel Dunbar const char *LinkingOutput) const { 548011e1b40d759a643086f590f6ffbd9d68360bad46Daniel Dunbar ArgStringList CmdArgs; 548111e1b40d759a643086f590f6ffbd9d68360bad46Daniel Dunbar 548211e1b40d759a643086f590f6ffbd9d68360bad46Daniel Dunbar // When building 32-bit code on DragonFly/pc64, we have to explicitly 548311e1b40d759a643086f590f6ffbd9d68360bad46Daniel Dunbar // instruct as in the base system to assemble 32-bit code. 548411e1b40d759a643086f590f6ffbd9d68360bad46Daniel Dunbar if (getToolChain().getArchName() == "i386") 548511e1b40d759a643086f590f6ffbd9d68360bad46Daniel Dunbar CmdArgs.push_back("--32"); 548611e1b40d759a643086f590f6ffbd9d68360bad46Daniel Dunbar 548711e1b40d759a643086f590f6ffbd9d68360bad46Daniel Dunbar Args.AddAllArgValues(CmdArgs, options::OPT_Wa_COMMA, 548811e1b40d759a643086f590f6ffbd9d68360bad46Daniel Dunbar options::OPT_Xassembler); 548911e1b40d759a643086f590f6ffbd9d68360bad46Daniel Dunbar 549011e1b40d759a643086f590f6ffbd9d68360bad46Daniel Dunbar CmdArgs.push_back("-o"); 54917c1e46533cae07216e2a67d5636a5afb44253155Daniel Dunbar CmdArgs.push_back(Output.getFilename()); 549211e1b40d759a643086f590f6ffbd9d68360bad46Daniel Dunbar 549311e1b40d759a643086f590f6ffbd9d68360bad46Daniel Dunbar for (InputInfoList::const_iterator 549411e1b40d759a643086f590f6ffbd9d68360bad46Daniel Dunbar it = Inputs.begin(), ie = Inputs.end(); it != ie; ++it) { 549511e1b40d759a643086f590f6ffbd9d68360bad46Daniel Dunbar const InputInfo &II = *it; 54967c1e46533cae07216e2a67d5636a5afb44253155Daniel Dunbar CmdArgs.push_back(II.getFilename()); 549711e1b40d759a643086f590f6ffbd9d68360bad46Daniel Dunbar } 549811e1b40d759a643086f590f6ffbd9d68360bad46Daniel Dunbar 549911e1b40d759a643086f590f6ffbd9d68360bad46Daniel Dunbar const char *Exec = 55004a7e88978cf646ad10d654020cb00b3877069210Daniel Dunbar Args.MakeArgString(getToolChain().GetProgramPath("as")); 55012fe238ed293bd4bc27af9beb9fa151fad2146fa8Daniel Dunbar C.addCommand(new Command(JA, *this, Exec, CmdArgs)); 550211e1b40d759a643086f590f6ffbd9d68360bad46Daniel Dunbar} 550311e1b40d759a643086f590f6ffbd9d68360bad46Daniel Dunbar 550411e1b40d759a643086f590f6ffbd9d68360bad46Daniel Dunbarvoid dragonfly::Link::ConstructJob(Compilation &C, const JobAction &JA, 55052fe238ed293bd4bc27af9beb9fa151fad2146fa8Daniel Dunbar const InputInfo &Output, 55062fe238ed293bd4bc27af9beb9fa151fad2146fa8Daniel Dunbar const InputInfoList &Inputs, 55072fe238ed293bd4bc27af9beb9fa151fad2146fa8Daniel Dunbar const ArgList &Args, 55082fe238ed293bd4bc27af9beb9fa151fad2146fa8Daniel Dunbar const char *LinkingOutput) const { 5509ee788e70fcd0adf76103b17c78ac658d4ea30c9bDaniel Dunbar const Driver &D = getToolChain().getDriver(); 551011e1b40d759a643086f590f6ffbd9d68360bad46Daniel Dunbar ArgStringList CmdArgs; 551111e1b40d759a643086f590f6ffbd9d68360bad46Daniel Dunbar 55128ab2bdcc4f397e100c684ede8e8ca6e226e1380aJoerg Sonnenberger if (!D.SysRoot.empty()) 55138ab2bdcc4f397e100c684ede8e8ca6e226e1380aJoerg Sonnenberger CmdArgs.push_back(Args.MakeArgString("--sysroot=" + D.SysRoot)); 55148ab2bdcc4f397e100c684ede8e8ca6e226e1380aJoerg Sonnenberger 551511e1b40d759a643086f590f6ffbd9d68360bad46Daniel Dunbar if (Args.hasArg(options::OPT_static)) { 551611e1b40d759a643086f590f6ffbd9d68360bad46Daniel Dunbar CmdArgs.push_back("-Bstatic"); 551711e1b40d759a643086f590f6ffbd9d68360bad46Daniel Dunbar } else { 551811e1b40d759a643086f590f6ffbd9d68360bad46Daniel Dunbar if (Args.hasArg(options::OPT_shared)) 551911e1b40d759a643086f590f6ffbd9d68360bad46Daniel Dunbar CmdArgs.push_back("-Bshareable"); 552011e1b40d759a643086f590f6ffbd9d68360bad46Daniel Dunbar else { 552111e1b40d759a643086f590f6ffbd9d68360bad46Daniel Dunbar CmdArgs.push_back("-dynamic-linker"); 552211e1b40d759a643086f590f6ffbd9d68360bad46Daniel Dunbar CmdArgs.push_back("/usr/libexec/ld-elf.so.2"); 552311e1b40d759a643086f590f6ffbd9d68360bad46Daniel Dunbar } 552411e1b40d759a643086f590f6ffbd9d68360bad46Daniel Dunbar } 552511e1b40d759a643086f590f6ffbd9d68360bad46Daniel Dunbar 552611e1b40d759a643086f590f6ffbd9d68360bad46Daniel Dunbar // When building 32-bit code on DragonFly/pc64, we have to explicitly 552711e1b40d759a643086f590f6ffbd9d68360bad46Daniel Dunbar // instruct ld in the base system to link 32-bit code. 552811e1b40d759a643086f590f6ffbd9d68360bad46Daniel Dunbar if (getToolChain().getArchName() == "i386") { 552911e1b40d759a643086f590f6ffbd9d68360bad46Daniel Dunbar CmdArgs.push_back("-m"); 553011e1b40d759a643086f590f6ffbd9d68360bad46Daniel Dunbar CmdArgs.push_back("elf_i386"); 553111e1b40d759a643086f590f6ffbd9d68360bad46Daniel Dunbar } 553211e1b40d759a643086f590f6ffbd9d68360bad46Daniel Dunbar 55337c1e46533cae07216e2a67d5636a5afb44253155Daniel Dunbar if (Output.isFilename()) { 553411e1b40d759a643086f590f6ffbd9d68360bad46Daniel Dunbar CmdArgs.push_back("-o"); 553511e1b40d759a643086f590f6ffbd9d68360bad46Daniel Dunbar CmdArgs.push_back(Output.getFilename()); 553611e1b40d759a643086f590f6ffbd9d68360bad46Daniel Dunbar } else { 553711e1b40d759a643086f590f6ffbd9d68360bad46Daniel Dunbar assert(Output.isNothing() && "Invalid output."); 553811e1b40d759a643086f590f6ffbd9d68360bad46Daniel Dunbar } 553911e1b40d759a643086f590f6ffbd9d68360bad46Daniel Dunbar 554011e1b40d759a643086f590f6ffbd9d68360bad46Daniel Dunbar if (!Args.hasArg(options::OPT_nostdlib) && 554111e1b40d759a643086f590f6ffbd9d68360bad46Daniel Dunbar !Args.hasArg(options::OPT_nostartfiles)) { 554211e1b40d759a643086f590f6ffbd9d68360bad46Daniel Dunbar if (!Args.hasArg(options::OPT_shared)) { 554338e317d6dce161b249508686cc67eb7176958762Chris Lattner CmdArgs.push_back( 55444a7e88978cf646ad10d654020cb00b3877069210Daniel Dunbar Args.MakeArgString(getToolChain().GetFilePath("crt1.o"))); 554538e317d6dce161b249508686cc67eb7176958762Chris Lattner CmdArgs.push_back( 55464a7e88978cf646ad10d654020cb00b3877069210Daniel Dunbar Args.MakeArgString(getToolChain().GetFilePath("crti.o"))); 554738e317d6dce161b249508686cc67eb7176958762Chris Lattner CmdArgs.push_back( 55484a7e88978cf646ad10d654020cb00b3877069210Daniel Dunbar Args.MakeArgString(getToolChain().GetFilePath("crtbegin.o"))); 554911e1b40d759a643086f590f6ffbd9d68360bad46Daniel Dunbar } else { 555038e317d6dce161b249508686cc67eb7176958762Chris Lattner CmdArgs.push_back( 55514a7e88978cf646ad10d654020cb00b3877069210Daniel Dunbar Args.MakeArgString(getToolChain().GetFilePath("crti.o"))); 555238e317d6dce161b249508686cc67eb7176958762Chris Lattner CmdArgs.push_back( 55534a7e88978cf646ad10d654020cb00b3877069210Daniel Dunbar Args.MakeArgString(getToolChain().GetFilePath("crtbeginS.o"))); 555411e1b40d759a643086f590f6ffbd9d68360bad46Daniel Dunbar } 555511e1b40d759a643086f590f6ffbd9d68360bad46Daniel Dunbar } 555611e1b40d759a643086f590f6ffbd9d68360bad46Daniel Dunbar 555711e1b40d759a643086f590f6ffbd9d68360bad46Daniel Dunbar Args.AddAllArgs(CmdArgs, options::OPT_L); 555811e1b40d759a643086f590f6ffbd9d68360bad46Daniel Dunbar Args.AddAllArgs(CmdArgs, options::OPT_T_Group); 555911e1b40d759a643086f590f6ffbd9d68360bad46Daniel Dunbar Args.AddAllArgs(CmdArgs, options::OPT_e); 556011e1b40d759a643086f590f6ffbd9d68360bad46Daniel Dunbar 55612008feead855f08500fb01ff43ef5eebee05d1e5Daniel Dunbar AddLinkerInputs(getToolChain(), Inputs, Args, CmdArgs); 556211e1b40d759a643086f590f6ffbd9d68360bad46Daniel Dunbar 556311e1b40d759a643086f590f6ffbd9d68360bad46Daniel Dunbar if (!Args.hasArg(options::OPT_nostdlib) && 556411e1b40d759a643086f590f6ffbd9d68360bad46Daniel Dunbar !Args.hasArg(options::OPT_nodefaultlibs)) { 556511e1b40d759a643086f590f6ffbd9d68360bad46Daniel Dunbar // FIXME: GCC passes on -lgcc, -lgcc_pic and a whole lot of 556611e1b40d759a643086f590f6ffbd9d68360bad46Daniel Dunbar // rpaths 556711e1b40d759a643086f590f6ffbd9d68360bad46Daniel Dunbar CmdArgs.push_back("-L/usr/lib/gcc41"); 556811e1b40d759a643086f590f6ffbd9d68360bad46Daniel Dunbar 556911e1b40d759a643086f590f6ffbd9d68360bad46Daniel Dunbar if (!Args.hasArg(options::OPT_static)) { 557011e1b40d759a643086f590f6ffbd9d68360bad46Daniel Dunbar CmdArgs.push_back("-rpath"); 557111e1b40d759a643086f590f6ffbd9d68360bad46Daniel Dunbar CmdArgs.push_back("/usr/lib/gcc41"); 557211e1b40d759a643086f590f6ffbd9d68360bad46Daniel Dunbar 557311e1b40d759a643086f590f6ffbd9d68360bad46Daniel Dunbar CmdArgs.push_back("-rpath-link"); 557411e1b40d759a643086f590f6ffbd9d68360bad46Daniel Dunbar CmdArgs.push_back("/usr/lib/gcc41"); 557511e1b40d759a643086f590f6ffbd9d68360bad46Daniel Dunbar 557611e1b40d759a643086f590f6ffbd9d68360bad46Daniel Dunbar CmdArgs.push_back("-rpath"); 557711e1b40d759a643086f590f6ffbd9d68360bad46Daniel Dunbar CmdArgs.push_back("/usr/lib"); 557811e1b40d759a643086f590f6ffbd9d68360bad46Daniel Dunbar 557911e1b40d759a643086f590f6ffbd9d68360bad46Daniel Dunbar CmdArgs.push_back("-rpath-link"); 558011e1b40d759a643086f590f6ffbd9d68360bad46Daniel Dunbar CmdArgs.push_back("/usr/lib"); 558111e1b40d759a643086f590f6ffbd9d68360bad46Daniel Dunbar } 558211e1b40d759a643086f590f6ffbd9d68360bad46Daniel Dunbar 5583405861d4ae824795f506d03cd7578f011cbf5b87Rafael Espindola if (D.CCCIsCXX) { 5584132e35d2f87895d20e7ea146c8c00404b80221a1Daniel Dunbar getToolChain().AddCXXStdlibLibArgs(Args, CmdArgs); 5585405861d4ae824795f506d03cd7578f011cbf5b87Rafael Espindola CmdArgs.push_back("-lm"); 5586405861d4ae824795f506d03cd7578f011cbf5b87Rafael Espindola } 5587405861d4ae824795f506d03cd7578f011cbf5b87Rafael Espindola 558811e1b40d759a643086f590f6ffbd9d68360bad46Daniel Dunbar if (Args.hasArg(options::OPT_shared)) { 558911e1b40d759a643086f590f6ffbd9d68360bad46Daniel Dunbar CmdArgs.push_back("-lgcc_pic"); 559011e1b40d759a643086f590f6ffbd9d68360bad46Daniel Dunbar } else { 559111e1b40d759a643086f590f6ffbd9d68360bad46Daniel Dunbar CmdArgs.push_back("-lgcc"); 559211e1b40d759a643086f590f6ffbd9d68360bad46Daniel Dunbar } 559311e1b40d759a643086f590f6ffbd9d68360bad46Daniel Dunbar 559411e1b40d759a643086f590f6ffbd9d68360bad46Daniel Dunbar 559511e1b40d759a643086f590f6ffbd9d68360bad46Daniel Dunbar if (Args.hasArg(options::OPT_pthread)) 55964d63f8bc2686d5d7580324407854f2ca7c128832Mike Stump CmdArgs.push_back("-lpthread"); 559711e1b40d759a643086f590f6ffbd9d68360bad46Daniel Dunbar 559811e1b40d759a643086f590f6ffbd9d68360bad46Daniel Dunbar if (!Args.hasArg(options::OPT_nolibc)) { 559911e1b40d759a643086f590f6ffbd9d68360bad46Daniel Dunbar CmdArgs.push_back("-lc"); 560011e1b40d759a643086f590f6ffbd9d68360bad46Daniel Dunbar } 560111e1b40d759a643086f590f6ffbd9d68360bad46Daniel Dunbar 560211e1b40d759a643086f590f6ffbd9d68360bad46Daniel Dunbar if (Args.hasArg(options::OPT_shared)) { 560311e1b40d759a643086f590f6ffbd9d68360bad46Daniel Dunbar CmdArgs.push_back("-lgcc_pic"); 560411e1b40d759a643086f590f6ffbd9d68360bad46Daniel Dunbar } else { 560511e1b40d759a643086f590f6ffbd9d68360bad46Daniel Dunbar CmdArgs.push_back("-lgcc"); 560611e1b40d759a643086f590f6ffbd9d68360bad46Daniel Dunbar } 560711e1b40d759a643086f590f6ffbd9d68360bad46Daniel Dunbar } 560811e1b40d759a643086f590f6ffbd9d68360bad46Daniel Dunbar 560911e1b40d759a643086f590f6ffbd9d68360bad46Daniel Dunbar if (!Args.hasArg(options::OPT_nostdlib) && 561011e1b40d759a643086f590f6ffbd9d68360bad46Daniel Dunbar !Args.hasArg(options::OPT_nostartfiles)) { 561111e1b40d759a643086f590f6ffbd9d68360bad46Daniel Dunbar if (!Args.hasArg(options::OPT_shared)) 561238e317d6dce161b249508686cc67eb7176958762Chris Lattner CmdArgs.push_back(Args.MakeArgString( 56134a7e88978cf646ad10d654020cb00b3877069210Daniel Dunbar getToolChain().GetFilePath("crtend.o"))); 561411e1b40d759a643086f590f6ffbd9d68360bad46Daniel Dunbar else 561538e317d6dce161b249508686cc67eb7176958762Chris Lattner CmdArgs.push_back(Args.MakeArgString( 56164a7e88978cf646ad10d654020cb00b3877069210Daniel Dunbar getToolChain().GetFilePath("crtendS.o"))); 561738e317d6dce161b249508686cc67eb7176958762Chris Lattner CmdArgs.push_back(Args.MakeArgString( 56184a7e88978cf646ad10d654020cb00b3877069210Daniel Dunbar getToolChain().GetFilePath("crtn.o"))); 561911e1b40d759a643086f590f6ffbd9d68360bad46Daniel Dunbar } 562011e1b40d759a643086f590f6ffbd9d68360bad46Daniel Dunbar 56213f4be6fb8872942f567166ab8d99c89885f26103Bill Wendling addProfileRT(getToolChain(), Args, CmdArgs, getToolChain().getTriple()); 56222e95a6d7d0b5aed39747875d7474c27824f7319fNick Lewycky 562311e1b40d759a643086f590f6ffbd9d68360bad46Daniel Dunbar const char *Exec = 56244a7e88978cf646ad10d654020cb00b3877069210Daniel Dunbar Args.MakeArgString(getToolChain().GetProgramPath("ld")); 56252fe238ed293bd4bc27af9beb9fa151fad2146fa8Daniel Dunbar C.addCommand(new Command(JA, *this, Exec, CmdArgs)); 562611e1b40d759a643086f590f6ffbd9d68360bad46Daniel Dunbar} 5627ff58e3610f4e12094def69eb2d6dcb4330378d8fMichael J. Spencer 5628ff58e3610f4e12094def69eb2d6dcb4330378d8fMichael J. Spencervoid visualstudio::Link::ConstructJob(Compilation &C, const JobAction &JA, 5629ff58e3610f4e12094def69eb2d6dcb4330378d8fMichael J. Spencer const InputInfo &Output, 5630ff58e3610f4e12094def69eb2d6dcb4330378d8fMichael J. Spencer const InputInfoList &Inputs, 5631ff58e3610f4e12094def69eb2d6dcb4330378d8fMichael J. Spencer const ArgList &Args, 5632ff58e3610f4e12094def69eb2d6dcb4330378d8fMichael J. Spencer const char *LinkingOutput) const { 5633ff58e3610f4e12094def69eb2d6dcb4330378d8fMichael J. Spencer ArgStringList CmdArgs; 5634ff58e3610f4e12094def69eb2d6dcb4330378d8fMichael J. Spencer 5635ff58e3610f4e12094def69eb2d6dcb4330378d8fMichael J. Spencer if (Output.isFilename()) { 5636e5a37f48388c7e4cc081f44d13a4910bfa56cd35Daniel Dunbar CmdArgs.push_back(Args.MakeArgString(std::string("-out:") + 5637e5a37f48388c7e4cc081f44d13a4910bfa56cd35Daniel Dunbar Output.getFilename())); 5638ff58e3610f4e12094def69eb2d6dcb4330378d8fMichael J. Spencer } else { 5639ff58e3610f4e12094def69eb2d6dcb4330378d8fMichael J. Spencer assert(Output.isNothing() && "Invalid output."); 5640ff58e3610f4e12094def69eb2d6dcb4330378d8fMichael J. Spencer } 5641ff58e3610f4e12094def69eb2d6dcb4330378d8fMichael J. Spencer 5642ff58e3610f4e12094def69eb2d6dcb4330378d8fMichael J. Spencer if (!Args.hasArg(options::OPT_nostdlib) && 5643ff58e3610f4e12094def69eb2d6dcb4330378d8fMichael J. Spencer !Args.hasArg(options::OPT_nostartfiles)) { 5644ff58e3610f4e12094def69eb2d6dcb4330378d8fMichael J. Spencer CmdArgs.push_back("-defaultlib:libcmt"); 5645ff58e3610f4e12094def69eb2d6dcb4330378d8fMichael J. Spencer } 5646ff58e3610f4e12094def69eb2d6dcb4330378d8fMichael J. Spencer 5647ff58e3610f4e12094def69eb2d6dcb4330378d8fMichael J. Spencer CmdArgs.push_back("-nologo"); 5648ff58e3610f4e12094def69eb2d6dcb4330378d8fMichael J. Spencer 56492008feead855f08500fb01ff43ef5eebee05d1e5Daniel Dunbar AddLinkerInputs(getToolChain(), Inputs, Args, CmdArgs); 5650ff58e3610f4e12094def69eb2d6dcb4330378d8fMichael J. Spencer 5651ff58e3610f4e12094def69eb2d6dcb4330378d8fMichael J. Spencer const char *Exec = 56522008feead855f08500fb01ff43ef5eebee05d1e5Daniel Dunbar Args.MakeArgString(getToolChain().GetProgramPath("link.exe")); 5653ff58e3610f4e12094def69eb2d6dcb4330378d8fMichael J. Spencer C.addCommand(new Command(JA, *this, Exec, CmdArgs)); 5654ff58e3610f4e12094def69eb2d6dcb4330378d8fMichael J. Spencer} 5655