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" 1155fc873017f10f6f566b182b70f6fc22aefa3464Chandler Carruth#include "InputInfo.h" 1255fc873017f10f6f566b182b70f6fc22aefa3464Chandler Carruth#include "SanitizerArgs.h" 1355fc873017f10f6f566b182b70f6fc22aefa3464Chandler Carruth#include "ToolChains.h" 1455fc873017f10f6f566b182b70f6fc22aefa3464Chandler Carruth#include "clang/Basic/ObjCRuntime.h" 150234179282d59e6dfccc8b2da72a9a71bf5b6ac3Kevin Enderby#include "clang/Basic/Version.h" 161d46033f760ba5fd266ce59fe391fac473f04f52Daniel Dunbar#include "clang/Driver/Action.h" 17871adcf4e41285e3f4c3b62eaa1b2e05b60b92daDaniel Dunbar#include "clang/Driver/Arg.h" 18b488c1dac8e53206f07103d794a62a3f5012c0f4Daniel Dunbar#include "clang/Driver/ArgList.h" 1955fc873017f10f6f566b182b70f6fc22aefa3464Chandler Carruth#include "clang/Driver/Compilation.h" 20ee848a73e5f8ffe7511af8652ba811c020d1c7a0Daniel Dunbar#include "clang/Driver/Driver.h" 21ee848a73e5f8ffe7511af8652ba811c020d1c7a0Daniel Dunbar#include "clang/Driver/DriverDiagnostic.h" 22871adcf4e41285e3f4c3b62eaa1b2e05b60b92daDaniel Dunbar#include "clang/Driver/Job.h" 23b488c1dac8e53206f07103d794a62a3f5012c0f4Daniel Dunbar#include "clang/Driver/Option.h" 24265e9ef9f3ef30a97790e6e7bbc3c17d97981ca7Daniel Dunbar#include "clang/Driver/Options.h" 25b488c1dac8e53206f07103d794a62a3f5012c0f4Daniel Dunbar#include "clang/Driver/ToolChain.h" 26871adcf4e41285e3f4c3b62eaa1b2e05b60b92daDaniel Dunbar#include "clang/Driver/Util.h" 27881376467c46c5c6cc16fa6790271c2c22e1d4f1Daniel Dunbar#include "llvm/ADT/SmallString.h" 2855d3f7ae512875a1d6402943c3a619633feb2a18Douglas Gregor#include "llvm/ADT/StringSwitch.h" 295b750fe6189a41937ff2b080a983c95ea273769fDaniel Dunbar#include "llvm/ADT/Twine.h" 3055fc873017f10f6f566b182b70f6fc22aefa3464Chandler Carruth#include "llvm/Support/ErrorHandling.h" 3132bef4edba854303800b3b01cb49a282e5da4f69Michael J. Spencer#include "llvm/Support/FileSystem.h" 3202633b541b04ad5ffc1c70f4c2feeeb13e607057Daniel Dunbar#include "llvm/Support/Format.h" 3303013fa9a0bf1ef4b907f5fec006c8f4000fdd21Michael J. Spencer#include "llvm/Support/Host.h" 3403013fa9a0bf1ef4b907f5fec006c8f4000fdd21Michael J. Spencer#include "llvm/Support/Process.h" 3555fc873017f10f6f566b182b70f6fc22aefa3464Chandler Carruth#include "llvm/Support/raw_ostream.h" 36871adcf4e41285e3f4c3b62eaa1b2e05b60b92daDaniel Dunbar 3747ac7d27c44bd64a7d0fc03d4babc196cf2b8230Daniel Dunbarusing namespace clang::driver; 3847ac7d27c44bd64a7d0fc03d4babc196cf2b8230Daniel Dunbarusing namespace clang::driver::tools; 395f9e272e632e951b1efe824cd16acb4d96077930Chris Lattnerusing namespace clang; 4047ac7d27c44bd64a7d0fc03d4babc196cf2b8230Daniel Dunbar 4188a3d6cf5ebab81614f89ba48a8d89023270637aDaniel Dunbar/// CheckPreprocessingOptions - Perform some validation of preprocessing 4288a3d6cf5ebab81614f89ba48a8d89023270637aDaniel Dunbar/// arguments that is shared with gcc. 4388a3d6cf5ebab81614f89ba48a8d89023270637aDaniel Dunbarstatic void CheckPreprocessingOptions(const Driver &D, const ArgList &Args) { 4488a3d6cf5ebab81614f89ba48a8d89023270637aDaniel Dunbar if (Arg *A = Args.getLastArg(options::OPT_C, options::OPT_CC)) 459ade4ae4fb7ed1fcbd63835d9f8f53052f0657a2Joerg Sonnenberger if (!Args.hasArg(options::OPT_E) && !D.CCCIsCPP) 465f9e272e632e951b1efe824cd16acb4d96077930Chris Lattner D.Diag(diag::err_drv_argument_only_allowed_with) 4788a3d6cf5ebab81614f89ba48a8d89023270637aDaniel Dunbar << A->getAsString(Args) << "-E"; 4888a3d6cf5ebab81614f89ba48a8d89023270637aDaniel Dunbar} 4988a3d6cf5ebab81614f89ba48a8d89023270637aDaniel Dunbar 50e2fd66418eca3d70cf6b62087d745d0c5181db69Daniel Dunbar/// CheckCodeGenerationOptions - Perform some validation of code generation 51e2fd66418eca3d70cf6b62087d745d0c5181db69Daniel Dunbar/// arguments that is shared with gcc. 52e2fd66418eca3d70cf6b62087d745d0c5181db69Daniel Dunbarstatic void CheckCodeGenerationOptions(const Driver &D, const ArgList &Args) { 53e2fd66418eca3d70cf6b62087d745d0c5181db69Daniel Dunbar // In gcc, only ARM checks this, but it seems reasonable to check universally. 54e2fd66418eca3d70cf6b62087d745d0c5181db69Daniel Dunbar if (Args.hasArg(options::OPT_static)) 55e2fd66418eca3d70cf6b62087d745d0c5181db69Daniel Dunbar if (const Arg *A = Args.getLastArg(options::OPT_dynamic, 56e2fd66418eca3d70cf6b62087d745d0c5181db69Daniel Dunbar options::OPT_mdynamic_no_pic)) 575f9e272e632e951b1efe824cd16acb4d96077930Chris Lattner D.Diag(diag::err_drv_argument_not_allowed_with) 58e2fd66418eca3d70cf6b62087d745d0c5181db69Daniel Dunbar << A->getAsString(Args) << "-static"; 59e2fd66418eca3d70cf6b62087d745d0c5181db69Daniel Dunbar} 60e2fd66418eca3d70cf6b62087d745d0c5181db69Daniel Dunbar 613edbeb78fe5ea7fffea7a94575478cde19e830e0Chris Lattner// Quote target names for inclusion in GNU Make dependency files. 623edbeb78fe5ea7fffea7a94575478cde19e830e0Chris Lattner// Only the characters '$', '#', ' ', '\t' are quoted. 635f9e272e632e951b1efe824cd16acb4d96077930Chris Lattnerstatic void QuoteTarget(StringRef Target, 645f9e272e632e951b1efe824cd16acb4d96077930Chris Lattner SmallVectorImpl<char> &Res) { 653edbeb78fe5ea7fffea7a94575478cde19e830e0Chris Lattner for (unsigned i = 0, e = Target.size(); i != e; ++i) { 663edbeb78fe5ea7fffea7a94575478cde19e830e0Chris Lattner switch (Target[i]) { 673edbeb78fe5ea7fffea7a94575478cde19e830e0Chris Lattner case ' ': 683edbeb78fe5ea7fffea7a94575478cde19e830e0Chris Lattner case '\t': 693edbeb78fe5ea7fffea7a94575478cde19e830e0Chris Lattner // Escape the preceding backslashes 703edbeb78fe5ea7fffea7a94575478cde19e830e0Chris Lattner for (int j = i - 1; j >= 0 && Target[j] == '\\'; --j) 713edbeb78fe5ea7fffea7a94575478cde19e830e0Chris Lattner Res.push_back('\\'); 723edbeb78fe5ea7fffea7a94575478cde19e830e0Chris Lattner 733edbeb78fe5ea7fffea7a94575478cde19e830e0Chris Lattner // Escape the space/tab 743edbeb78fe5ea7fffea7a94575478cde19e830e0Chris Lattner Res.push_back('\\'); 753edbeb78fe5ea7fffea7a94575478cde19e830e0Chris Lattner break; 763edbeb78fe5ea7fffea7a94575478cde19e830e0Chris Lattner case '$': 773edbeb78fe5ea7fffea7a94575478cde19e830e0Chris Lattner Res.push_back('$'); 783edbeb78fe5ea7fffea7a94575478cde19e830e0Chris Lattner break; 793edbeb78fe5ea7fffea7a94575478cde19e830e0Chris Lattner case '#': 803edbeb78fe5ea7fffea7a94575478cde19e830e0Chris Lattner Res.push_back('\\'); 813edbeb78fe5ea7fffea7a94575478cde19e830e0Chris Lattner break; 823edbeb78fe5ea7fffea7a94575478cde19e830e0Chris Lattner default: 833edbeb78fe5ea7fffea7a94575478cde19e830e0Chris Lattner break; 843edbeb78fe5ea7fffea7a94575478cde19e830e0Chris Lattner } 853edbeb78fe5ea7fffea7a94575478cde19e830e0Chris Lattner 863edbeb78fe5ea7fffea7a94575478cde19e830e0Chris Lattner Res.push_back(Target[i]); 873edbeb78fe5ea7fffea7a94575478cde19e830e0Chris Lattner } 883edbeb78fe5ea7fffea7a94575478cde19e830e0Chris Lattner} 893edbeb78fe5ea7fffea7a94575478cde19e830e0Chris Lattner 903d7171582b026e043916fc5d65a7d7aada547206Bill Wendlingstatic void addDirectoryList(const ArgList &Args, 91bdb8f3ce95e3e5c43497292fd05764faa6ad46b1Bill Wendling ArgStringList &CmdArgs, 92bdb8f3ce95e3e5c43497292fd05764faa6ad46b1Bill Wendling const char *ArgName, 933d7171582b026e043916fc5d65a7d7aada547206Bill Wendling const char *EnvVar) { 943d7171582b026e043916fc5d65a7d7aada547206Bill Wendling const char *DirList = ::getenv(EnvVar); 9589aa2ce6d6de2b9200171bd3ecc97fe917f73d62Chad Rosier bool CombinedArg = false; 9689aa2ce6d6de2b9200171bd3ecc97fe917f73d62Chad Rosier 97bdb8f3ce95e3e5c43497292fd05764faa6ad46b1Bill Wendling if (!DirList) 98bdb8f3ce95e3e5c43497292fd05764faa6ad46b1Bill Wendling return; // Nothing to do. 99bdb8f3ce95e3e5c43497292fd05764faa6ad46b1Bill Wendling 10089aa2ce6d6de2b9200171bd3ecc97fe917f73d62Chad Rosier StringRef Name(ArgName); 10189aa2ce6d6de2b9200171bd3ecc97fe917f73d62Chad Rosier if (Name.equals("-I") || Name.equals("-L")) 10289aa2ce6d6de2b9200171bd3ecc97fe917f73d62Chad Rosier CombinedArg = true; 10389aa2ce6d6de2b9200171bd3ecc97fe917f73d62Chad Rosier 104bdb8f3ce95e3e5c43497292fd05764faa6ad46b1Bill Wendling StringRef Dirs(DirList); 105bdb8f3ce95e3e5c43497292fd05764faa6ad46b1Bill Wendling if (Dirs.empty()) // Empty string should not add '.'. 106bdb8f3ce95e3e5c43497292fd05764faa6ad46b1Bill Wendling return; 107bdb8f3ce95e3e5c43497292fd05764faa6ad46b1Bill Wendling 108bdb8f3ce95e3e5c43497292fd05764faa6ad46b1Bill Wendling StringRef::size_type Delim; 109bdb8f3ce95e3e5c43497292fd05764faa6ad46b1Bill Wendling while ((Delim = Dirs.find(llvm::sys::PathSeparator)) != StringRef::npos) { 110bdb8f3ce95e3e5c43497292fd05764faa6ad46b1Bill Wendling if (Delim == 0) { // Leading colon. 11189aa2ce6d6de2b9200171bd3ecc97fe917f73d62Chad Rosier if (CombinedArg) { 11289aa2ce6d6de2b9200171bd3ecc97fe917f73d62Chad Rosier CmdArgs.push_back(Args.MakeArgString(std::string(ArgName) + ".")); 11389aa2ce6d6de2b9200171bd3ecc97fe917f73d62Chad Rosier } else { 11489aa2ce6d6de2b9200171bd3ecc97fe917f73d62Chad Rosier CmdArgs.push_back(ArgName); 11589aa2ce6d6de2b9200171bd3ecc97fe917f73d62Chad Rosier CmdArgs.push_back("."); 11689aa2ce6d6de2b9200171bd3ecc97fe917f73d62Chad Rosier } 117bdb8f3ce95e3e5c43497292fd05764faa6ad46b1Bill Wendling } else { 11889aa2ce6d6de2b9200171bd3ecc97fe917f73d62Chad Rosier if (CombinedArg) { 11989aa2ce6d6de2b9200171bd3ecc97fe917f73d62Chad Rosier CmdArgs.push_back(Args.MakeArgString(std::string(ArgName) + Dirs.substr(0, Delim))); 12089aa2ce6d6de2b9200171bd3ecc97fe917f73d62Chad Rosier } else { 12189aa2ce6d6de2b9200171bd3ecc97fe917f73d62Chad Rosier CmdArgs.push_back(ArgName); 12289aa2ce6d6de2b9200171bd3ecc97fe917f73d62Chad Rosier CmdArgs.push_back(Args.MakeArgString(Dirs.substr(0, Delim))); 12389aa2ce6d6de2b9200171bd3ecc97fe917f73d62Chad Rosier } 124bdb8f3ce95e3e5c43497292fd05764faa6ad46b1Bill Wendling } 12509c5c39590caa92aa7ce660607a070ea275f5ad7Nico Weber Dirs = Dirs.substr(Delim + 1); 126bdb8f3ce95e3e5c43497292fd05764faa6ad46b1Bill Wendling } 127bdb8f3ce95e3e5c43497292fd05764faa6ad46b1Bill Wendling 128bdb8f3ce95e3e5c43497292fd05764faa6ad46b1Bill Wendling if (Dirs.empty()) { // Trailing colon. 12989aa2ce6d6de2b9200171bd3ecc97fe917f73d62Chad Rosier if (CombinedArg) { 13089aa2ce6d6de2b9200171bd3ecc97fe917f73d62Chad Rosier CmdArgs.push_back(Args.MakeArgString(std::string(ArgName) + ".")); 13189aa2ce6d6de2b9200171bd3ecc97fe917f73d62Chad Rosier } else { 13289aa2ce6d6de2b9200171bd3ecc97fe917f73d62Chad Rosier CmdArgs.push_back(ArgName); 13389aa2ce6d6de2b9200171bd3ecc97fe917f73d62Chad Rosier CmdArgs.push_back("."); 13489aa2ce6d6de2b9200171bd3ecc97fe917f73d62Chad Rosier } 135bdb8f3ce95e3e5c43497292fd05764faa6ad46b1Bill Wendling } else { // Add the last path. 13689aa2ce6d6de2b9200171bd3ecc97fe917f73d62Chad Rosier if (CombinedArg) { 13789aa2ce6d6de2b9200171bd3ecc97fe917f73d62Chad Rosier CmdArgs.push_back(Args.MakeArgString(std::string(ArgName) + Dirs)); 13889aa2ce6d6de2b9200171bd3ecc97fe917f73d62Chad Rosier } else { 13989aa2ce6d6de2b9200171bd3ecc97fe917f73d62Chad Rosier CmdArgs.push_back(ArgName); 14089aa2ce6d6de2b9200171bd3ecc97fe917f73d62Chad Rosier CmdArgs.push_back(Args.MakeArgString(Dirs)); 14189aa2ce6d6de2b9200171bd3ecc97fe917f73d62Chad Rosier } 142bdb8f3ce95e3e5c43497292fd05764faa6ad46b1Bill Wendling } 143bdb8f3ce95e3e5c43497292fd05764faa6ad46b1Bill Wendling} 144bdb8f3ce95e3e5c43497292fd05764faa6ad46b1Bill Wendling 1452008feead855f08500fb01ff43ef5eebee05d1e5Daniel Dunbarstatic void AddLinkerInputs(const ToolChain &TC, 1462008feead855f08500fb01ff43ef5eebee05d1e5Daniel Dunbar const InputInfoList &Inputs, const ArgList &Args, 1472008feead855f08500fb01ff43ef5eebee05d1e5Daniel Dunbar ArgStringList &CmdArgs) { 1482008feead855f08500fb01ff43ef5eebee05d1e5Daniel Dunbar const Driver &D = TC.getDriver(); 1492008feead855f08500fb01ff43ef5eebee05d1e5Daniel Dunbar 1508ac38d7b5d88d12f454a7cda1275bf429813151dDaniel Dunbar // Add extra linker input arguments which are not treated as inputs 1518ac38d7b5d88d12f454a7cda1275bf429813151dDaniel Dunbar // (constructed via -Xarch_). 1528ac38d7b5d88d12f454a7cda1275bf429813151dDaniel Dunbar Args.AddAllArgValues(CmdArgs, options::OPT_Zlinker_input); 1538ac38d7b5d88d12f454a7cda1275bf429813151dDaniel Dunbar 1542008feead855f08500fb01ff43ef5eebee05d1e5Daniel Dunbar for (InputInfoList::const_iterator 1552008feead855f08500fb01ff43ef5eebee05d1e5Daniel Dunbar it = Inputs.begin(), ie = Inputs.end(); it != ie; ++it) { 1562008feead855f08500fb01ff43ef5eebee05d1e5Daniel Dunbar const InputInfo &II = *it; 1572008feead855f08500fb01ff43ef5eebee05d1e5Daniel Dunbar 1582008feead855f08500fb01ff43ef5eebee05d1e5Daniel Dunbar if (!TC.HasNativeLLVMSupport()) { 1592008feead855f08500fb01ff43ef5eebee05d1e5Daniel Dunbar // Don't try to pass LLVM inputs unless we have native support. 1602008feead855f08500fb01ff43ef5eebee05d1e5Daniel Dunbar if (II.getType() == types::TY_LLVM_IR || 1612008feead855f08500fb01ff43ef5eebee05d1e5Daniel Dunbar II.getType() == types::TY_LTO_IR || 1622008feead855f08500fb01ff43ef5eebee05d1e5Daniel Dunbar II.getType() == types::TY_LLVM_BC || 1632008feead855f08500fb01ff43ef5eebee05d1e5Daniel Dunbar II.getType() == types::TY_LTO_BC) 1645f9e272e632e951b1efe824cd16acb4d96077930Chris Lattner D.Diag(diag::err_drv_no_linker_llvm_support) 1652008feead855f08500fb01ff43ef5eebee05d1e5Daniel Dunbar << TC.getTripleString(); 1662008feead855f08500fb01ff43ef5eebee05d1e5Daniel Dunbar } 1672008feead855f08500fb01ff43ef5eebee05d1e5Daniel Dunbar 168e5a37f48388c7e4cc081f44d13a4910bfa56cd35Daniel Dunbar // Add filenames immediately. 169e5a37f48388c7e4cc081f44d13a4910bfa56cd35Daniel Dunbar if (II.isFilename()) { 1702008feead855f08500fb01ff43ef5eebee05d1e5Daniel Dunbar CmdArgs.push_back(II.getFilename()); 171e5a37f48388c7e4cc081f44d13a4910bfa56cd35Daniel Dunbar continue; 172e5a37f48388c7e4cc081f44d13a4910bfa56cd35Daniel Dunbar } 173e5a37f48388c7e4cc081f44d13a4910bfa56cd35Daniel Dunbar 174e5a37f48388c7e4cc081f44d13a4910bfa56cd35Daniel Dunbar // Otherwise, this is a linker input argument. 175e5a37f48388c7e4cc081f44d13a4910bfa56cd35Daniel Dunbar const Arg &A = II.getInputArg(); 176e5a37f48388c7e4cc081f44d13a4910bfa56cd35Daniel Dunbar 177e5a37f48388c7e4cc081f44d13a4910bfa56cd35Daniel Dunbar // Handle reserved library options. 178e5a37f48388c7e4cc081f44d13a4910bfa56cd35Daniel Dunbar if (A.getOption().matches(options::OPT_Z_reserved_lib_stdcxx)) { 179132e35d2f87895d20e7ea146c8c00404b80221a1Daniel Dunbar TC.AddCXXStdlibLibArgs(Args, CmdArgs); 1807433fedce98a58341d0f30c2e12e8d53f3bba575Shantonu Sen } else if (A.getOption().matches(options::OPT_Z_reserved_lib_cckext)) { 1817433fedce98a58341d0f30c2e12e8d53f3bba575Shantonu Sen TC.AddCCKextLibArgs(Args, CmdArgs); 182e5a37f48388c7e4cc081f44d13a4910bfa56cd35Daniel Dunbar } else 183e5a37f48388c7e4cc081f44d13a4910bfa56cd35Daniel Dunbar A.renderAsInput(Args, CmdArgs); 1842008feead855f08500fb01ff43ef5eebee05d1e5Daniel Dunbar } 185bdb8f3ce95e3e5c43497292fd05764faa6ad46b1Bill Wendling 186bdb8f3ce95e3e5c43497292fd05764faa6ad46b1Bill Wendling // LIBRARY_PATH - included following the user specified library paths. 1873d7171582b026e043916fc5d65a7d7aada547206Bill Wendling addDirectoryList(Args, CmdArgs, "-L", "LIBRARY_PATH"); 1882008feead855f08500fb01ff43ef5eebee05d1e5Daniel Dunbar} 1892008feead855f08500fb01ff43ef5eebee05d1e5Daniel Dunbar 190f85e193739c953358c865005855253af4f68a497John McCall/// \brief Determine whether Objective-C automated reference counting is 191f85e193739c953358c865005855253af4f68a497John McCall/// enabled. 192f85e193739c953358c865005855253af4f68a497John McCallstatic bool isObjCAutoRefCount(const ArgList &Args) { 193f85e193739c953358c865005855253af4f68a497John McCall return Args.hasFlag(options::OPT_fobjc_arc, options::OPT_fno_objc_arc, false); 194f85e193739c953358c865005855253af4f68a497John McCall} 195f85e193739c953358c865005855253af4f68a497John McCall 196ebcb57a8d298862c65043e88b2429591ab3c58d3Ted Kremenek/// \brief Determine whether we are linking the ObjC runtime. 197ebcb57a8d298862c65043e88b2429591ab3c58d3Ted Kremenekstatic bool isObjCRuntimeLinked(const ArgList &Args) { 198a7635f115ed4fdc5f7982989d67743105dd530cfBob Wilson if (isObjCAutoRefCount(Args)) { 199a7635f115ed4fdc5f7982989d67743105dd530cfBob Wilson Args.ClaimAllArgs(options::OPT_fobjc_link_runtime); 200ebcb57a8d298862c65043e88b2429591ab3c58d3Ted Kremenek return true; 201a7635f115ed4fdc5f7982989d67743105dd530cfBob Wilson } 202ebcb57a8d298862c65043e88b2429591ab3c58d3Ted Kremenek return Args.hasArg(options::OPT_fobjc_link_runtime); 203ebcb57a8d298862c65043e88b2429591ab3c58d3Ted Kremenek} 204ebcb57a8d298862c65043e88b2429591ab3c58d3Ted Kremenek 205db3f24ac0dafad175e9daef1b8733600194f56e0Rafael Espindolastatic void addProfileRT(const ToolChain &TC, const ArgList &Args, 2063f4be6fb8872942f567166ab8d99c89885f26103Bill Wendling ArgStringList &CmdArgs, 2073f4be6fb8872942f567166ab8d99c89885f26103Bill Wendling llvm::Triple Triple) { 2083f4be6fb8872942f567166ab8d99c89885f26103Bill Wendling if (!(Args.hasArg(options::OPT_fprofile_arcs) || 2093f4be6fb8872942f567166ab8d99c89885f26103Bill Wendling Args.hasArg(options::OPT_fprofile_generate) || 2103f4be6fb8872942f567166ab8d99c89885f26103Bill Wendling Args.hasArg(options::OPT_fcreate_profile) || 2113f4be6fb8872942f567166ab8d99c89885f26103Bill Wendling Args.hasArg(options::OPT_coverage))) 2123f4be6fb8872942f567166ab8d99c89885f26103Bill Wendling return; 2133f4be6fb8872942f567166ab8d99c89885f26103Bill Wendling 2143f4be6fb8872942f567166ab8d99c89885f26103Bill Wendling // GCC links libgcov.a by adding -L<inst>/gcc/lib/gcc/<triple>/<ver> -lgcov to 2153f4be6fb8872942f567166ab8d99c89885f26103Bill Wendling // the link line. We cannot do the same thing because unlike gcov there is a 2163f4be6fb8872942f567166ab8d99c89885f26103Bill Wendling // libprofile_rt.so. We used to use the -l:libprofile_rt.a syntax, but that is 2173f4be6fb8872942f567166ab8d99c89885f26103Bill Wendling // not supported by old linkers. 218f2db04c49429a6d53069b813d42999fa36ddd9a4Benjamin Kramer std::string ProfileRT = 219f2db04c49429a6d53069b813d42999fa36ddd9a4Benjamin Kramer std::string(TC.getDriver().Dir) + "/../lib/libprofile_rt.a"; 2203f4be6fb8872942f567166ab8d99c89885f26103Bill Wendling 2213f4be6fb8872942f567166ab8d99c89885f26103Bill Wendling CmdArgs.push_back(Args.MakeArgString(ProfileRT)); 222db3f24ac0dafad175e9daef1b8733600194f56e0Rafael Espindola} 223db3f24ac0dafad175e9daef1b8733600194f56e0Rafael Espindola 22491e06dab9335ed6b4474a74353549c708cf3d936Michael J. Spencerstatic bool forwardToGCC(const Option &O) { 22591e06dab9335ed6b4474a74353549c708cf3d936Michael J. Spencer return !O.hasFlag(options::NoForward) && 22691e06dab9335ed6b4474a74353549c708cf3d936Michael J. Spencer !O.hasFlag(options::DriverOption) && 22791e06dab9335ed6b4474a74353549c708cf3d936Michael J. Spencer !O.hasFlag(options::LinkerInput); 22891e06dab9335ed6b4474a74353549c708cf3d936Michael J. Spencer} 22991e06dab9335ed6b4474a74353549c708cf3d936Michael J. Spencer 23054db68bf0e389b8aabe1a434f825a81a9c1f7db8Peter Collingbournevoid Clang::AddPreprocessingOptions(Compilation &C, 2319d718635fa805674aaba5d938f3dc6b35b8632baChad Rosier const JobAction &JA, 23254db68bf0e389b8aabe1a434f825a81a9c1f7db8Peter Collingbourne const Driver &D, 233df91ef3d6c55692a0236f67b6c6b134a3bf84098Douglas Gregor const ArgList &Args, 234c21c485b4fb58ef5d55cf3e523263dd824a2ace4Daniel Dunbar ArgStringList &CmdArgs, 235c21c485b4fb58ef5d55cf3e523263dd824a2ace4Daniel Dunbar const InputInfo &Output, 236c21c485b4fb58ef5d55cf3e523263dd824a2ace4Daniel Dunbar const InputInfoList &Inputs) const { 237c21c485b4fb58ef5d55cf3e523263dd824a2ace4Daniel Dunbar Arg *A; 2383a183d3d46426d8719031553131b8928f50aa606Daniel Dunbar 23988a3d6cf5ebab81614f89ba48a8d89023270637aDaniel Dunbar CheckPreprocessingOptions(D, Args); 24088a3d6cf5ebab81614f89ba48a8d89023270637aDaniel Dunbar 24188a3d6cf5ebab81614f89ba48a8d89023270637aDaniel Dunbar Args.AddLastArg(CmdArgs, options::OPT_C); 24288a3d6cf5ebab81614f89ba48a8d89023270637aDaniel Dunbar Args.AddLastArg(CmdArgs, options::OPT_CC); 2433a183d3d46426d8719031553131b8928f50aa606Daniel Dunbar 2443a183d3d46426d8719031553131b8928f50aa606Daniel Dunbar // Handle dependency file generation. 2459eb93b07ea913e7ad0bcd15bd3e3662e2760c323Daniel Dunbar if ((A = Args.getLastArg(options::OPT_M, options::OPT_MM)) || 246c21c485b4fb58ef5d55cf3e523263dd824a2ace4Daniel Dunbar (A = Args.getLastArg(options::OPT_MD)) || 247c21c485b4fb58ef5d55cf3e523263dd824a2ace4Daniel Dunbar (A = Args.getLastArg(options::OPT_MMD))) { 248c21c485b4fb58ef5d55cf3e523263dd824a2ace4Daniel Dunbar // Determine the output location. 249c21c485b4fb58ef5d55cf3e523263dd824a2ace4Daniel Dunbar const char *DepFile; 25099c720828a2fcaf368c6a0f2502189d10dbd5c53Benjamin Kramer if (Arg *MF = Args.getLastArg(options::OPT_MF)) { 2511d489cf4a04ad0ad8ac2696e4eed0995f3a67288Richard Smith DepFile = MF->getValue(); 2529d718635fa805674aaba5d938f3dc6b35b8632baChad Rosier C.addFailureResultFile(DepFile, &JA); 25399c720828a2fcaf368c6a0f2502189d10dbd5c53Benjamin Kramer } else if (Output.getType() == types::TY_Dependencies) { 25499c720828a2fcaf368c6a0f2502189d10dbd5c53Benjamin Kramer DepFile = Output.getFilename(); 255b827a0541b5fd095fcdb7ad0c3df93ca158c619aDaniel Dunbar } else if (A->getOption().matches(options::OPT_M) || 256b827a0541b5fd095fcdb7ad0c3df93ca158c619aDaniel Dunbar A->getOption().matches(options::OPT_MM)) { 257c21c485b4fb58ef5d55cf3e523263dd824a2ace4Daniel Dunbar DepFile = "-"; 258c21c485b4fb58ef5d55cf3e523263dd824a2ace4Daniel Dunbar } else { 25966b8a6671bb5df540dd7200a5286f7ed7a72c1ccBob Wilson DepFile = getDependencyFileName(Args, Inputs); 2609d718635fa805674aaba5d938f3dc6b35b8632baChad Rosier C.addFailureResultFile(DepFile, &JA); 261c21c485b4fb58ef5d55cf3e523263dd824a2ace4Daniel Dunbar } 262c21c485b4fb58ef5d55cf3e523263dd824a2ace4Daniel Dunbar CmdArgs.push_back("-dependency-file"); 263c21c485b4fb58ef5d55cf3e523263dd824a2ace4Daniel Dunbar CmdArgs.push_back(DepFile); 264c21c485b4fb58ef5d55cf3e523263dd824a2ace4Daniel Dunbar 2653edbeb78fe5ea7fffea7a94575478cde19e830e0Chris Lattner // Add a default target if one wasn't specified. 266c21c485b4fb58ef5d55cf3e523263dd824a2ace4Daniel Dunbar if (!Args.hasArg(options::OPT_MT) && !Args.hasArg(options::OPT_MQ)) { 267c21c485b4fb58ef5d55cf3e523263dd824a2ace4Daniel Dunbar const char *DepTarget; 268c21c485b4fb58ef5d55cf3e523263dd824a2ace4Daniel Dunbar 269c21c485b4fb58ef5d55cf3e523263dd824a2ace4Daniel Dunbar // If user provided -o, that is the dependency target, except 270c21c485b4fb58ef5d55cf3e523263dd824a2ace4Daniel Dunbar // when we are only generating a dependency file. 271c21c485b4fb58ef5d55cf3e523263dd824a2ace4Daniel Dunbar Arg *OutputOpt = Args.getLastArg(options::OPT_o); 272c21c485b4fb58ef5d55cf3e523263dd824a2ace4Daniel Dunbar if (OutputOpt && Output.getType() != types::TY_Dependencies) { 2731d489cf4a04ad0ad8ac2696e4eed0995f3a67288Richard Smith DepTarget = OutputOpt->getValue(); 274c21c485b4fb58ef5d55cf3e523263dd824a2ace4Daniel Dunbar } else { 275c21c485b4fb58ef5d55cf3e523263dd824a2ace4Daniel Dunbar // Otherwise derive from the base input. 276c21c485b4fb58ef5d55cf3e523263dd824a2ace4Daniel Dunbar // 277c21c485b4fb58ef5d55cf3e523263dd824a2ace4Daniel Dunbar // FIXME: This should use the computed output file location. 278f7ccbad5d9949e7ddd1cbef43d482553b811e026Dylan Noblesmith SmallString<128> P(Inputs[0].getBaseInput()); 279472ccff00cdbcd095c3ba933b9e3f202719f118fMichael J. Spencer llvm::sys::path::replace_extension(P, "o"); 280472ccff00cdbcd095c3ba933b9e3f202719f118fMichael J. Spencer DepTarget = Args.MakeArgString(llvm::sys::path::filename(P)); 281c21c485b4fb58ef5d55cf3e523263dd824a2ace4Daniel Dunbar } 282c21c485b4fb58ef5d55cf3e523263dd824a2ace4Daniel Dunbar 283c21c485b4fb58ef5d55cf3e523263dd824a2ace4Daniel Dunbar CmdArgs.push_back("-MT"); 284f7ccbad5d9949e7ddd1cbef43d482553b811e026Dylan Noblesmith SmallString<128> Quoted; 2853edbeb78fe5ea7fffea7a94575478cde19e830e0Chris Lattner QuoteTarget(DepTarget, Quoted); 2863edbeb78fe5ea7fffea7a94575478cde19e830e0Chris Lattner CmdArgs.push_back(Args.MakeArgString(Quoted)); 287c21c485b4fb58ef5d55cf3e523263dd824a2ace4Daniel Dunbar } 288c21c485b4fb58ef5d55cf3e523263dd824a2ace4Daniel Dunbar 289b827a0541b5fd095fcdb7ad0c3df93ca158c619aDaniel Dunbar if (A->getOption().matches(options::OPT_M) || 290b827a0541b5fd095fcdb7ad0c3df93ca158c619aDaniel Dunbar A->getOption().matches(options::OPT_MD)) 291c21c485b4fb58ef5d55cf3e523263dd824a2ace4Daniel Dunbar CmdArgs.push_back("-sys-header-deps"); 292c21c485b4fb58ef5d55cf3e523263dd824a2ace4Daniel Dunbar } 293c21c485b4fb58ef5d55cf3e523263dd824a2ace4Daniel Dunbar 294bb52786da8d055568eef6e5694288c1258bc8c2aPeter Collingbourne if (Args.hasArg(options::OPT_MG)) { 295bb52786da8d055568eef6e5694288c1258bc8c2aPeter Collingbourne if (!A || A->getOption().matches(options::OPT_MD) || 296bb52786da8d055568eef6e5694288c1258bc8c2aPeter Collingbourne A->getOption().matches(options::OPT_MMD)) 2975f9e272e632e951b1efe824cd16acb4d96077930Chris Lattner D.Diag(diag::err_drv_mg_requires_m_or_mm); 298bb52786da8d055568eef6e5694288c1258bc8c2aPeter Collingbourne CmdArgs.push_back("-MG"); 299bb52786da8d055568eef6e5694288c1258bc8c2aPeter Collingbourne } 300bb52786da8d055568eef6e5694288c1258bc8c2aPeter Collingbourne 301c21c485b4fb58ef5d55cf3e523263dd824a2ace4Daniel Dunbar Args.AddLastArg(CmdArgs, options::OPT_MP); 3023edbeb78fe5ea7fffea7a94575478cde19e830e0Chris Lattner 3033edbeb78fe5ea7fffea7a94575478cde19e830e0Chris Lattner // Convert all -MQ <target> args to -MT <quoted target> 3043edbeb78fe5ea7fffea7a94575478cde19e830e0Chris Lattner for (arg_iterator it = Args.filtered_begin(options::OPT_MT, 3053edbeb78fe5ea7fffea7a94575478cde19e830e0Chris Lattner options::OPT_MQ), 3063edbeb78fe5ea7fffea7a94575478cde19e830e0Chris Lattner ie = Args.filtered_end(); it != ie; ++it) { 3077e4953e5c60409007545288f14b430bd23d68570Daniel Dunbar const Arg *A = *it; 3087e4953e5c60409007545288f14b430bd23d68570Daniel Dunbar A->claim(); 3093edbeb78fe5ea7fffea7a94575478cde19e830e0Chris Lattner 3107e4953e5c60409007545288f14b430bd23d68570Daniel Dunbar if (A->getOption().matches(options::OPT_MQ)) { 3113edbeb78fe5ea7fffea7a94575478cde19e830e0Chris Lattner CmdArgs.push_back("-MT"); 312f7ccbad5d9949e7ddd1cbef43d482553b811e026Dylan Noblesmith SmallString<128> Quoted; 3131d489cf4a04ad0ad8ac2696e4eed0995f3a67288Richard Smith QuoteTarget(A->getValue(), Quoted); 3143edbeb78fe5ea7fffea7a94575478cde19e830e0Chris Lattner CmdArgs.push_back(Args.MakeArgString(Quoted)); 3153edbeb78fe5ea7fffea7a94575478cde19e830e0Chris Lattner 3163edbeb78fe5ea7fffea7a94575478cde19e830e0Chris Lattner // -MT flag - no change 3173edbeb78fe5ea7fffea7a94575478cde19e830e0Chris Lattner } else { 3187e4953e5c60409007545288f14b430bd23d68570Daniel Dunbar A->render(Args, CmdArgs); 3193edbeb78fe5ea7fffea7a94575478cde19e830e0Chris Lattner } 3203edbeb78fe5ea7fffea7a94575478cde19e830e0Chris Lattner } 321c21c485b4fb58ef5d55cf3e523263dd824a2ace4Daniel Dunbar 322df91ef3d6c55692a0236f67b6c6b134a3bf84098Douglas Gregor // Add -i* options, and automatically translate to 323df91ef3d6c55692a0236f67b6c6b134a3bf84098Douglas Gregor // -include-pch/-include-pth for transparent PCH support. It's 324df91ef3d6c55692a0236f67b6c6b134a3bf84098Douglas Gregor // wonky, but we include looking for .gch so we can support seamless 325df91ef3d6c55692a0236f67b6c6b134a3bf84098Douglas Gregor // replacement into a build system already set up to be generating 326df91ef3d6c55692a0236f67b6c6b134a3bf84098Douglas Gregor // .gch files. 327990142a23e41392ef7c0f14db4c0fcac67311cdfArgyrios Kyrtzidis bool RenderedImplicitInclude = false; 328cdd9686b890ebdc10039ae256ef4c9dfb5ebacb7Daniel Dunbar for (arg_iterator it = Args.filtered_begin(options::OPT_clang_i_Group), 329cdd9686b890ebdc10039ae256ef4c9dfb5ebacb7Daniel Dunbar ie = Args.filtered_end(); it != ie; ++it) { 330cdd9686b890ebdc10039ae256ef4c9dfb5ebacb7Daniel Dunbar const Arg *A = it; 331c21c485b4fb58ef5d55cf3e523263dd824a2ace4Daniel Dunbar 332c21c485b4fb58ef5d55cf3e523263dd824a2ace4Daniel Dunbar if (A->getOption().matches(options::OPT_include)) { 333990142a23e41392ef7c0f14db4c0fcac67311cdfArgyrios Kyrtzidis bool IsFirstImplicitInclude = !RenderedImplicitInclude; 334990142a23e41392ef7c0f14db4c0fcac67311cdfArgyrios Kyrtzidis RenderedImplicitInclude = true; 335990142a23e41392ef7c0f14db4c0fcac67311cdfArgyrios Kyrtzidis 336e5c35377020d6c38d16434c9f373a5fa9bb4f2ebArgyrios Kyrtzidis // Use PCH if the user requested it. 3370ebd9321ba380471010341f24c874f46f56e7581Daniel Dunbar bool UsePCH = D.CCCUsePCH; 3380ebd9321ba380471010341f24c874f46f56e7581Daniel Dunbar 339c21c485b4fb58ef5d55cf3e523263dd824a2ace4Daniel Dunbar bool FoundPTH = false; 340df91ef3d6c55692a0236f67b6c6b134a3bf84098Douglas Gregor bool FoundPCH = false; 3411d489cf4a04ad0ad8ac2696e4eed0995f3a67288Richard Smith llvm::sys::Path P(A->getValue()); 34232bef4edba854303800b3b01cb49a282e5da4f69Michael J. Spencer bool Exists; 3430ebd9321ba380471010341f24c874f46f56e7581Daniel Dunbar if (UsePCH) { 344df91ef3d6c55692a0236f67b6c6b134a3bf84098Douglas Gregor P.appendSuffix("pch"); 34532bef4edba854303800b3b01cb49a282e5da4f69Michael J. Spencer if (!llvm::sys::fs::exists(P.str(), Exists) && Exists) 346df91ef3d6c55692a0236f67b6c6b134a3bf84098Douglas Gregor FoundPCH = true; 3471eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump else 348df91ef3d6c55692a0236f67b6c6b134a3bf84098Douglas Gregor P.eraseSuffix(); 349df91ef3d6c55692a0236f67b6c6b134a3bf84098Douglas Gregor } 350df91ef3d6c55692a0236f67b6c6b134a3bf84098Douglas Gregor 351df91ef3d6c55692a0236f67b6c6b134a3bf84098Douglas Gregor if (!FoundPCH) { 352df91ef3d6c55692a0236f67b6c6b134a3bf84098Douglas Gregor P.appendSuffix("pth"); 35332bef4edba854303800b3b01cb49a282e5da4f69Michael J. Spencer if (!llvm::sys::fs::exists(P.str(), Exists) && Exists) 354c21c485b4fb58ef5d55cf3e523263dd824a2ace4Daniel Dunbar FoundPTH = true; 355df91ef3d6c55692a0236f67b6c6b134a3bf84098Douglas Gregor else 356df91ef3d6c55692a0236f67b6c6b134a3bf84098Douglas Gregor P.eraseSuffix(); 3571eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump } 3581eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump 359df91ef3d6c55692a0236f67b6c6b134a3bf84098Douglas Gregor if (!FoundPCH && !FoundPTH) { 360df91ef3d6c55692a0236f67b6c6b134a3bf84098Douglas Gregor P.appendSuffix("gch"); 36132bef4edba854303800b3b01cb49a282e5da4f69Michael J. Spencer if (!llvm::sys::fs::exists(P.str(), Exists) && Exists) { 3620ebd9321ba380471010341f24c874f46f56e7581Daniel Dunbar FoundPCH = UsePCH; 3630ebd9321ba380471010341f24c874f46f56e7581Daniel Dunbar FoundPTH = !UsePCH; 364df91ef3d6c55692a0236f67b6c6b134a3bf84098Douglas Gregor } 3651eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump else 366df91ef3d6c55692a0236f67b6c6b134a3bf84098Douglas Gregor P.eraseSuffix(); 367c21c485b4fb58ef5d55cf3e523263dd824a2ace4Daniel Dunbar } 368c21c485b4fb58ef5d55cf3e523263dd824a2ace4Daniel Dunbar 369df91ef3d6c55692a0236f67b6c6b134a3bf84098Douglas Gregor if (FoundPCH || FoundPTH) { 370990142a23e41392ef7c0f14db4c0fcac67311cdfArgyrios Kyrtzidis if (IsFirstImplicitInclude) { 371990142a23e41392ef7c0f14db4c0fcac67311cdfArgyrios Kyrtzidis A->claim(); 372990142a23e41392ef7c0f14db4c0fcac67311cdfArgyrios Kyrtzidis if (UsePCH) 373990142a23e41392ef7c0f14db4c0fcac67311cdfArgyrios Kyrtzidis CmdArgs.push_back("-include-pch"); 374990142a23e41392ef7c0f14db4c0fcac67311cdfArgyrios Kyrtzidis else 375990142a23e41392ef7c0f14db4c0fcac67311cdfArgyrios Kyrtzidis CmdArgs.push_back("-include-pth"); 376990142a23e41392ef7c0f14db4c0fcac67311cdfArgyrios Kyrtzidis CmdArgs.push_back(Args.MakeArgString(P.str())); 377990142a23e41392ef7c0f14db4c0fcac67311cdfArgyrios Kyrtzidis continue; 378990142a23e41392ef7c0f14db4c0fcac67311cdfArgyrios Kyrtzidis } else { 379990142a23e41392ef7c0f14db4c0fcac67311cdfArgyrios Kyrtzidis // Ignore the PCH if not first on command line and emit warning. 3805f9e272e632e951b1efe824cd16acb4d96077930Chris Lattner D.Diag(diag::warn_drv_pch_not_first_include) 381990142a23e41392ef7c0f14db4c0fcac67311cdfArgyrios Kyrtzidis << P.str() << A->getAsString(Args); 382990142a23e41392ef7c0f14db4c0fcac67311cdfArgyrios Kyrtzidis } 383c21c485b4fb58ef5d55cf3e523263dd824a2ace4Daniel Dunbar } 384c21c485b4fb58ef5d55cf3e523263dd824a2ace4Daniel Dunbar } 385c21c485b4fb58ef5d55cf3e523263dd824a2ace4Daniel Dunbar 386c21c485b4fb58ef5d55cf3e523263dd824a2ace4Daniel Dunbar // Not translated, render as usual. 387c21c485b4fb58ef5d55cf3e523263dd824a2ace4Daniel Dunbar A->claim(); 388c21c485b4fb58ef5d55cf3e523263dd824a2ace4Daniel Dunbar A->render(Args, CmdArgs); 389c21c485b4fb58ef5d55cf3e523263dd824a2ace4Daniel Dunbar } 390c21c485b4fb58ef5d55cf3e523263dd824a2ace4Daniel Dunbar 391c21c485b4fb58ef5d55cf3e523263dd824a2ace4Daniel Dunbar Args.AddAllArgs(CmdArgs, options::OPT_D, options::OPT_U); 39265e02fa80e1c185f18e5f81cefc30d75383a7301Douglas Gregor Args.AddAllArgs(CmdArgs, options::OPT_I_Group, options::OPT_F, 39365e02fa80e1c185f18e5f81cefc30d75383a7301Douglas Gregor options::OPT_index_header_map); 394c21c485b4fb58ef5d55cf3e523263dd824a2ace4Daniel Dunbar 395c21c485b4fb58ef5d55cf3e523263dd824a2ace4Daniel Dunbar // Add -Wp, and -Xassembler if using the preprocessor. 396c21c485b4fb58ef5d55cf3e523263dd824a2ace4Daniel Dunbar 397c21c485b4fb58ef5d55cf3e523263dd824a2ace4Daniel Dunbar // FIXME: There is a very unfortunate problem here, some troubled 398c21c485b4fb58ef5d55cf3e523263dd824a2ace4Daniel Dunbar // souls abuse -Wp, to pass preprocessor options in gcc syntax. To 399c21c485b4fb58ef5d55cf3e523263dd824a2ace4Daniel Dunbar // really support that we would have to parse and then translate 400c21c485b4fb58ef5d55cf3e523263dd824a2ace4Daniel Dunbar // those options. :( 401c21c485b4fb58ef5d55cf3e523263dd824a2ace4Daniel Dunbar Args.AddAllArgValues(CmdArgs, options::OPT_Wp_COMMA, 402c21c485b4fb58ef5d55cf3e523263dd824a2ace4Daniel Dunbar options::OPT_Xpreprocessor); 403607d7f6d8f21066cc48bbe2c51e6ca412a00943fDaniel Dunbar 404607d7f6d8f21066cc48bbe2c51e6ca412a00943fDaniel Dunbar // -I- is a deprecated GCC feature, reject it. 405607d7f6d8f21066cc48bbe2c51e6ca412a00943fDaniel Dunbar if (Arg *A = Args.getLastArg(options::OPT_I_)) 4065f9e272e632e951b1efe824cd16acb4d96077930Chris Lattner D.Diag(diag::err_drv_I_dash_not_supported) << A->getAsString(Args); 407feee58ce268765742e41c473c8648607fd4831a7Chandler Carruth 408feee58ce268765742e41c473c8648607fd4831a7Chandler Carruth // If we have a --sysroot, and don't have an explicit -isysroot flag, add an 409feee58ce268765742e41c473c8648607fd4831a7Chandler Carruth // -isysroot to the CC1 invocation. 4104762a2da74875d2ae94e0d77d38ed964816cce36Sebastian Pop StringRef sysroot = C.getSysRoot(); 4114762a2da74875d2ae94e0d77d38ed964816cce36Sebastian Pop if (sysroot != "") { 412feee58ce268765742e41c473c8648607fd4831a7Chandler Carruth if (!Args.hasArg(options::OPT_isysroot)) { 413feee58ce268765742e41c473c8648607fd4831a7Chandler Carruth CmdArgs.push_back("-isysroot"); 4144762a2da74875d2ae94e0d77d38ed964816cce36Sebastian Pop CmdArgs.push_back(C.getArgs().MakeArgString(sysroot)); 415feee58ce268765742e41c473c8648607fd4831a7Chandler Carruth } 416feee58ce268765742e41c473c8648607fd4831a7Chandler Carruth } 4172a06085281d1b6aee628f85e8676eec04542cbc9Douglas Gregor 41847adebef0df6dce752fe9a45e9190e8005b5d07cBenjamin Kramer // Parse additional include paths from environment variables. 419b5870e77a9a872e2a84e904a332bb60bbe207da9Chandler Carruth // FIXME: We should probably sink the logic for handling these from the 420b5870e77a9a872e2a84e904a332bb60bbe207da9Chandler Carruth // frontend into the driver. It will allow deleting 4 otherwise unused flags. 42147adebef0df6dce752fe9a45e9190e8005b5d07cBenjamin Kramer // CPATH - included following the user specified includes (but prior to 42247adebef0df6dce752fe9a45e9190e8005b5d07cBenjamin Kramer // builtin and standard includes). 4233d7171582b026e043916fc5d65a7d7aada547206Bill Wendling addDirectoryList(Args, CmdArgs, "-I", "CPATH"); 42447adebef0df6dce752fe9a45e9190e8005b5d07cBenjamin Kramer // C_INCLUDE_PATH - system includes enabled when compiling C. 4253d7171582b026e043916fc5d65a7d7aada547206Bill Wendling addDirectoryList(Args, CmdArgs, "-c-isystem", "C_INCLUDE_PATH"); 42647adebef0df6dce752fe9a45e9190e8005b5d07cBenjamin Kramer // CPLUS_INCLUDE_PATH - system includes enabled when compiling C++. 4273d7171582b026e043916fc5d65a7d7aada547206Bill Wendling addDirectoryList(Args, CmdArgs, "-cxx-isystem", "CPLUS_INCLUDE_PATH"); 42847adebef0df6dce752fe9a45e9190e8005b5d07cBenjamin Kramer // OBJC_INCLUDE_PATH - system includes enabled when compiling ObjC. 4293d7171582b026e043916fc5d65a7d7aada547206Bill Wendling addDirectoryList(Args, CmdArgs, "-objc-isystem", "OBJC_INCLUDE_PATH"); 43047adebef0df6dce752fe9a45e9190e8005b5d07cBenjamin Kramer // OBJCPLUS_INCLUDE_PATH - system includes enabled when compiling ObjC++. 4313d7171582b026e043916fc5d65a7d7aada547206Bill Wendling addDirectoryList(Args, CmdArgs, "-objcxx-isystem", "OBJCPLUS_INCLUDE_PATH"); 43288491fc6dfc7ebbd856d57a9acb49fb83077d6c8Chandler Carruth 43388491fc6dfc7ebbd856d57a9acb49fb83077d6c8Chandler Carruth // Add C++ include arguments, if needed. 434a461442ed99883d2760833592f65e1e95a4889bbChandler Carruth if (types::isCXX(Inputs[0].getType())) 4357ffa0325bd61f656697f99434334d425c39af309Chandler Carruth getToolChain().AddClangCXXStdlibIncludeArgs(Args, CmdArgs); 4367d7e9f963a4977e36efb90fd9c369f33ced1a95aChandler Carruth 4377d7e9f963a4977e36efb90fd9c369f33ced1a95aChandler Carruth // Add system include arguments. 4387d7e9f963a4977e36efb90fd9c369f33ced1a95aChandler Carruth getToolChain().AddClangSystemIncludeArgs(Args, CmdArgs); 439c21c485b4fb58ef5d55cf3e523263dd824a2ace4Daniel Dunbar} 440c21c485b4fb58ef5d55cf3e523263dd824a2ace4Daniel Dunbar 44192c4fd5c17a5fd433cca7ddecb0ad4a104baa59cBenjamin Kramer/// getLLVMArchSuffixForARM - Get the LLVM arch name to use for a particular 44292c4fd5c17a5fd433cca7ddecb0ad4a104baa59cBenjamin Kramer/// CPU. 44392c4fd5c17a5fd433cca7ddecb0ad4a104baa59cBenjamin Kramer// 44492c4fd5c17a5fd433cca7ddecb0ad4a104baa59cBenjamin Kramer// FIXME: This is redundant with -mcpu, why does LLVM use this. 44592c4fd5c17a5fd433cca7ddecb0ad4a104baa59cBenjamin Kramer// FIXME: tblgen this, or kill it! 44692c4fd5c17a5fd433cca7ddecb0ad4a104baa59cBenjamin Kramerstatic const char *getLLVMArchSuffixForARM(StringRef CPU) { 44792c4fd5c17a5fd433cca7ddecb0ad4a104baa59cBenjamin Kramer return llvm::StringSwitch<const char *>(CPU) 44892c4fd5c17a5fd433cca7ddecb0ad4a104baa59cBenjamin Kramer .Cases("arm7tdmi", "arm7tdmi-s", "arm710t", "v4t") 44992c4fd5c17a5fd433cca7ddecb0ad4a104baa59cBenjamin Kramer .Cases("arm720t", "arm9", "arm9tdmi", "v4t") 45092c4fd5c17a5fd433cca7ddecb0ad4a104baa59cBenjamin Kramer .Cases("arm920", "arm920t", "arm922t", "v4t") 45192c4fd5c17a5fd433cca7ddecb0ad4a104baa59cBenjamin Kramer .Cases("arm940t", "ep9312","v4t") 45292c4fd5c17a5fd433cca7ddecb0ad4a104baa59cBenjamin Kramer .Cases("arm10tdmi", "arm1020t", "v5") 45392c4fd5c17a5fd433cca7ddecb0ad4a104baa59cBenjamin Kramer .Cases("arm9e", "arm926ej-s", "arm946e-s", "v5e") 45492c4fd5c17a5fd433cca7ddecb0ad4a104baa59cBenjamin Kramer .Cases("arm966e-s", "arm968e-s", "arm10e", "v5e") 45592c4fd5c17a5fd433cca7ddecb0ad4a104baa59cBenjamin Kramer .Cases("arm1020e", "arm1022e", "xscale", "iwmmxt", "v5e") 45692c4fd5c17a5fd433cca7ddecb0ad4a104baa59cBenjamin Kramer .Cases("arm1136j-s", "arm1136jf-s", "arm1176jz-s", "v6") 45792c4fd5c17a5fd433cca7ddecb0ad4a104baa59cBenjamin Kramer .Cases("arm1176jzf-s", "mpcorenovfp", "mpcore", "v6") 45892c4fd5c17a5fd433cca7ddecb0ad4a104baa59cBenjamin Kramer .Cases("arm1156t2-s", "arm1156t2f-s", "v6t2") 459fc55345144f636f7687fd37649f0302914981fffBob Wilson .Cases("cortex-a5", "cortex-a7", "cortex-a8", "v7") 460fc55345144f636f7687fd37649f0302914981fffBob Wilson .Cases("cortex-a9", "cortex-a15", "v7") 461ab13751d76be4473e9317d3885cb351b79f18492Quentin Colombet .Case("cortex-r5", "v7r") 46292c4fd5c17a5fd433cca7ddecb0ad4a104baa59cBenjamin Kramer .Case("cortex-m0", "v6m") 4632503ebd2cf9b4d28319551debaacff8b38765698Bob Wilson .Case("cortex-m3", "v7m") 4642503ebd2cf9b4d28319551debaacff8b38765698Bob Wilson .Case("cortex-m4", "v7em") 465336bfa3fb496228a8ab4070def5b4297e5f88358Bob Wilson .Case("cortex-a9-mp", "v7f") 466336bfa3fb496228a8ab4070def5b4297e5f88358Bob Wilson .Case("swift", "v7s") 46792c4fd5c17a5fd433cca7ddecb0ad4a104baa59cBenjamin Kramer .Default(""); 46892c4fd5c17a5fd433cca7ddecb0ad4a104baa59cBenjamin Kramer} 46992c4fd5c17a5fd433cca7ddecb0ad4a104baa59cBenjamin Kramer 470fc8f0e14ad142ed811e90fbd9a30e419e301c717Chris Lattner/// getARMTargetCPU - Get the (LLVM) name of the ARM cpu we are targeting. 471728a512753d85a6ccaae34e81385c8665c2de0e1Daniel Dunbar// 472728a512753d85a6ccaae34e81385c8665c2de0e1Daniel Dunbar// FIXME: tblgen this. 47392c4fd5c17a5fd433cca7ddecb0ad4a104baa59cBenjamin Kramerstatic std::string getARMTargetCPU(const ArgList &Args, 474bcd6df662471e0ac2d3d85fdba09b1295c2fc468Rafael Espindola const llvm::Triple &Triple) { 475728a512753d85a6ccaae34e81385c8665c2de0e1Daniel Dunbar // FIXME: Warn on inconsistent use of -mcpu and -march. 476b163ef7e7a5d904ef0962a7c38c460be083c4d63Daniel Dunbar 477b163ef7e7a5d904ef0962a7c38c460be083c4d63Daniel Dunbar // If we have -mcpu=, use that. 47892c4fd5c17a5fd433cca7ddecb0ad4a104baa59cBenjamin Kramer if (Arg *A = Args.getLastArg(options::OPT_mcpu_EQ)) { 4791d489cf4a04ad0ad8ac2696e4eed0995f3a67288Richard Smith StringRef MCPU = A->getValue(); 48092c4fd5c17a5fd433cca7ddecb0ad4a104baa59cBenjamin Kramer // Handle -mcpu=native. 48192c4fd5c17a5fd433cca7ddecb0ad4a104baa59cBenjamin Kramer if (MCPU == "native") 48292c4fd5c17a5fd433cca7ddecb0ad4a104baa59cBenjamin Kramer return llvm::sys::getHostCPUName(); 48392c4fd5c17a5fd433cca7ddecb0ad4a104baa59cBenjamin Kramer else 48492c4fd5c17a5fd433cca7ddecb0ad4a104baa59cBenjamin Kramer return MCPU; 48592c4fd5c17a5fd433cca7ddecb0ad4a104baa59cBenjamin Kramer } 486b163ef7e7a5d904ef0962a7c38c460be083c4d63Daniel Dunbar 4875f9e272e632e951b1efe824cd16acb4d96077930Chris Lattner StringRef MArch; 488b163ef7e7a5d904ef0962a7c38c460be083c4d63Daniel Dunbar if (Arg *A = Args.getLastArg(options::OPT_march_EQ)) { 489bcd6df662471e0ac2d3d85fdba09b1295c2fc468Rafael Espindola // Otherwise, if we have -march= choose the base CPU for that arch. 4901d489cf4a04ad0ad8ac2696e4eed0995f3a67288Richard Smith MArch = A->getValue(); 491bcd6df662471e0ac2d3d85fdba09b1295c2fc468Rafael Espindola } else { 492bcd6df662471e0ac2d3d85fdba09b1295c2fc468Rafael Espindola // Otherwise, use the Arch from the triple. 493bcd6df662471e0ac2d3d85fdba09b1295c2fc468Rafael Espindola MArch = Triple.getArchName(); 494b163ef7e7a5d904ef0962a7c38c460be083c4d63Daniel Dunbar } 495b163ef7e7a5d904ef0962a7c38c460be083c4d63Daniel Dunbar 49692c4fd5c17a5fd433cca7ddecb0ad4a104baa59cBenjamin Kramer // Handle -march=native. 49792c4fd5c17a5fd433cca7ddecb0ad4a104baa59cBenjamin Kramer std::string NativeMArch; 49892c4fd5c17a5fd433cca7ddecb0ad4a104baa59cBenjamin Kramer if (MArch == "native") { 49992c4fd5c17a5fd433cca7ddecb0ad4a104baa59cBenjamin Kramer std::string CPU = llvm::sys::getHostCPUName(); 50092c4fd5c17a5fd433cca7ddecb0ad4a104baa59cBenjamin Kramer if (CPU != "generic") { 50192c4fd5c17a5fd433cca7ddecb0ad4a104baa59cBenjamin Kramer // Translate the native cpu into the architecture. The switch below will 50292c4fd5c17a5fd433cca7ddecb0ad4a104baa59cBenjamin Kramer // then chose the minimum cpu for that arch. 50392c4fd5c17a5fd433cca7ddecb0ad4a104baa59cBenjamin Kramer NativeMArch = std::string("arm") + getLLVMArchSuffixForARM(CPU); 50492c4fd5c17a5fd433cca7ddecb0ad4a104baa59cBenjamin Kramer MArch = NativeMArch; 50592c4fd5c17a5fd433cca7ddecb0ad4a104baa59cBenjamin Kramer } 50692c4fd5c17a5fd433cca7ddecb0ad4a104baa59cBenjamin Kramer } 50792c4fd5c17a5fd433cca7ddecb0ad4a104baa59cBenjamin Kramer 508ae1aee6683d486d1c92e51b2a5da6ba75f633308Chad Rosier return llvm::StringSwitch<const char *>(MArch) 509ae1aee6683d486d1c92e51b2a5da6ba75f633308Chad Rosier .Cases("armv2", "armv2a","arm2") 510ae1aee6683d486d1c92e51b2a5da6ba75f633308Chad Rosier .Case("armv3", "arm6") 511ae1aee6683d486d1c92e51b2a5da6ba75f633308Chad Rosier .Case("armv3m", "arm7m") 512ae1aee6683d486d1c92e51b2a5da6ba75f633308Chad Rosier .Cases("armv4", "armv4t", "arm7tdmi") 513ae1aee6683d486d1c92e51b2a5da6ba75f633308Chad Rosier .Cases("armv5", "armv5t", "arm10tdmi") 5144add84f83f4505304ab3f94ebfa6bbc0be60058dEvgeniy Stepanov .Cases("armv5e", "armv5te", "arm1022e") 515ae1aee6683d486d1c92e51b2a5da6ba75f633308Chad Rosier .Case("armv5tej", "arm926ej-s") 516ae1aee6683d486d1c92e51b2a5da6ba75f633308Chad Rosier .Cases("armv6", "armv6k", "arm1136jf-s") 517ae1aee6683d486d1c92e51b2a5da6ba75f633308Chad Rosier .Case("armv6j", "arm1136j-s") 518ae1aee6683d486d1c92e51b2a5da6ba75f633308Chad Rosier .Cases("armv6z", "armv6zk", "arm1176jzf-s") 519ae1aee6683d486d1c92e51b2a5da6ba75f633308Chad Rosier .Case("armv6t2", "arm1156t2-s") 5202503ebd2cf9b4d28319551debaacff8b38765698Bob Wilson .Cases("armv6m", "armv6-m", "cortex-m0") 521ae1aee6683d486d1c92e51b2a5da6ba75f633308Chad Rosier .Cases("armv7", "armv7a", "armv7-a", "cortex-a8") 5222503ebd2cf9b4d28319551debaacff8b38765698Bob Wilson .Cases("armv7em", "armv7e-m", "cortex-m4") 523336bfa3fb496228a8ab4070def5b4297e5f88358Bob Wilson .Cases("armv7f", "armv7-f", "cortex-a9-mp") 524336bfa3fb496228a8ab4070def5b4297e5f88358Bob Wilson .Cases("armv7s", "armv7-s", "swift") 525ae1aee6683d486d1c92e51b2a5da6ba75f633308Chad Rosier .Cases("armv7r", "armv7-r", "cortex-r4") 526ae1aee6683d486d1c92e51b2a5da6ba75f633308Chad Rosier .Cases("armv7m", "armv7-m", "cortex-m3") 527ae1aee6683d486d1c92e51b2a5da6ba75f633308Chad Rosier .Case("ep9312", "ep9312") 528ae1aee6683d486d1c92e51b2a5da6ba75f633308Chad Rosier .Case("iwmmxt", "iwmmxt") 529ae1aee6683d486d1c92e51b2a5da6ba75f633308Chad Rosier .Case("xscale", "xscale") 530ae1aee6683d486d1c92e51b2a5da6ba75f633308Chad Rosier // If all else failed, return the most base CPU LLVM supports. 531ae1aee6683d486d1c92e51b2a5da6ba75f633308Chad Rosier .Default("arm7tdmi"); 532b163ef7e7a5d904ef0962a7c38c460be083c4d63Daniel Dunbar} 533b163ef7e7a5d904ef0962a7c38c460be083c4d63Daniel Dunbar 5341f95e6567faab67f4363d650f73121359c4bdbabDaniel Dunbar// FIXME: Move to target hook. 5351f95e6567faab67f4363d650f73121359c4bdbabDaniel Dunbarstatic bool isSignedCharDefault(const llvm::Triple &Triple) { 5361f95e6567faab67f4363d650f73121359c4bdbabDaniel Dunbar switch (Triple.getArch()) { 5371f95e6567faab67f4363d650f73121359c4bdbabDaniel Dunbar default: 5381f95e6567faab67f4363d650f73121359c4bdbabDaniel Dunbar return true; 5391f95e6567faab67f4363d650f73121359c4bdbabDaniel Dunbar 540c264e16a42b3f6c36521857a29ea0949d9781c22Tim Northover case llvm::Triple::aarch64: 5415b4e7b11e745329d8a55fd56504450dede1b2100Jim Grosbach case llvm::Triple::arm: 5421f95e6567faab67f4363d650f73121359c4bdbabDaniel Dunbar case llvm::Triple::ppc: 5431f95e6567faab67f4363d650f73121359c4bdbabDaniel Dunbar case llvm::Triple::ppc64: 544905c45f15a25598620d19160c139c6b785aeea89Bob Wilson if (Triple.isOSDarwin()) 5451f95e6567faab67f4363d650f73121359c4bdbabDaniel Dunbar return true; 5461f95e6567faab67f4363d650f73121359c4bdbabDaniel Dunbar return false; 5471f95e6567faab67f4363d650f73121359c4bdbabDaniel Dunbar } 5481f95e6567faab67f4363d650f73121359c4bdbabDaniel Dunbar} 5491f95e6567faab67f4363d650f73121359c4bdbabDaniel Dunbar 550993172757762436d22b2dfc74e7cca1bade1a7bfChad Rosier// Handle -mfpu=. 551993172757762436d22b2dfc74e7cca1bade1a7bfChad Rosier// 552993172757762436d22b2dfc74e7cca1bade1a7bfChad Rosier// FIXME: Centralize feature selection, defaulting shouldn't be also in the 553993172757762436d22b2dfc74e7cca1bade1a7bfChad Rosier// frontend target. 554993172757762436d22b2dfc74e7cca1bade1a7bfChad Rosierstatic void addFPUArgs(const Driver &D, const Arg *A, const ArgList &Args, 555993172757762436d22b2dfc74e7cca1bade1a7bfChad Rosier ArgStringList &CmdArgs) { 5561d489cf4a04ad0ad8ac2696e4eed0995f3a67288Richard Smith StringRef FPU = A->getValue(); 557993172757762436d22b2dfc74e7cca1bade1a7bfChad Rosier 558993172757762436d22b2dfc74e7cca1bade1a7bfChad Rosier // Set the target features based on the FPU. 559993172757762436d22b2dfc74e7cca1bade1a7bfChad Rosier if (FPU == "fpa" || FPU == "fpe2" || FPU == "fpe3" || FPU == "maverick") { 560993172757762436d22b2dfc74e7cca1bade1a7bfChad Rosier // Disable any default FPU support. 561993172757762436d22b2dfc74e7cca1bade1a7bfChad Rosier CmdArgs.push_back("-target-feature"); 562993172757762436d22b2dfc74e7cca1bade1a7bfChad Rosier CmdArgs.push_back("-vfp2"); 563993172757762436d22b2dfc74e7cca1bade1a7bfChad Rosier CmdArgs.push_back("-target-feature"); 564993172757762436d22b2dfc74e7cca1bade1a7bfChad Rosier CmdArgs.push_back("-vfp3"); 565993172757762436d22b2dfc74e7cca1bade1a7bfChad Rosier CmdArgs.push_back("-target-feature"); 566993172757762436d22b2dfc74e7cca1bade1a7bfChad Rosier CmdArgs.push_back("-neon"); 567993172757762436d22b2dfc74e7cca1bade1a7bfChad Rosier } else if (FPU == "vfp3-d16" || FPU == "vfpv3-d16") { 568993172757762436d22b2dfc74e7cca1bade1a7bfChad Rosier CmdArgs.push_back("-target-feature"); 569993172757762436d22b2dfc74e7cca1bade1a7bfChad Rosier CmdArgs.push_back("+vfp3"); 570993172757762436d22b2dfc74e7cca1bade1a7bfChad Rosier CmdArgs.push_back("-target-feature"); 571993172757762436d22b2dfc74e7cca1bade1a7bfChad Rosier CmdArgs.push_back("+d16"); 572993172757762436d22b2dfc74e7cca1bade1a7bfChad Rosier CmdArgs.push_back("-target-feature"); 573993172757762436d22b2dfc74e7cca1bade1a7bfChad Rosier CmdArgs.push_back("-neon"); 574993172757762436d22b2dfc74e7cca1bade1a7bfChad Rosier } else if (FPU == "vfp") { 575993172757762436d22b2dfc74e7cca1bade1a7bfChad Rosier CmdArgs.push_back("-target-feature"); 576993172757762436d22b2dfc74e7cca1bade1a7bfChad Rosier CmdArgs.push_back("+vfp2"); 577993172757762436d22b2dfc74e7cca1bade1a7bfChad Rosier CmdArgs.push_back("-target-feature"); 578993172757762436d22b2dfc74e7cca1bade1a7bfChad Rosier CmdArgs.push_back("-neon"); 579993172757762436d22b2dfc74e7cca1bade1a7bfChad Rosier } else if (FPU == "vfp3" || FPU == "vfpv3") { 580993172757762436d22b2dfc74e7cca1bade1a7bfChad Rosier CmdArgs.push_back("-target-feature"); 581993172757762436d22b2dfc74e7cca1bade1a7bfChad Rosier CmdArgs.push_back("+vfp3"); 582993172757762436d22b2dfc74e7cca1bade1a7bfChad Rosier CmdArgs.push_back("-target-feature"); 583993172757762436d22b2dfc74e7cca1bade1a7bfChad Rosier CmdArgs.push_back("-neon"); 584993172757762436d22b2dfc74e7cca1bade1a7bfChad Rosier } else if (FPU == "neon") { 585993172757762436d22b2dfc74e7cca1bade1a7bfChad Rosier CmdArgs.push_back("-target-feature"); 586993172757762436d22b2dfc74e7cca1bade1a7bfChad Rosier CmdArgs.push_back("+neon"); 587993172757762436d22b2dfc74e7cca1bade1a7bfChad Rosier } else 588993172757762436d22b2dfc74e7cca1bade1a7bfChad Rosier D.Diag(diag::err_drv_clang_unsupported) << A->getAsString(Args); 589993172757762436d22b2dfc74e7cca1bade1a7bfChad Rosier} 590993172757762436d22b2dfc74e7cca1bade1a7bfChad Rosier 5917a938fa66be42710b034a79106de337a275fd265Chad Rosier// Handle -mfpmath=. 5927a938fa66be42710b034a79106de337a275fd265Chad Rosierstatic void addFPMathArgs(const Driver &D, const Arg *A, const ArgList &Args, 59330fe6baf95662ea82a794a8fe3b76998713c183dChad Rosier ArgStringList &CmdArgs, StringRef CPU) { 5941d489cf4a04ad0ad8ac2696e4eed0995f3a67288Richard Smith StringRef FPMath = A->getValue(); 5957a938fa66be42710b034a79106de337a275fd265Chad Rosier 5967a938fa66be42710b034a79106de337a275fd265Chad Rosier // Set the target features based on the FPMath. 5977a938fa66be42710b034a79106de337a275fd265Chad Rosier if (FPMath == "neon") { 5987a938fa66be42710b034a79106de337a275fd265Chad Rosier CmdArgs.push_back("-target-feature"); 5997a938fa66be42710b034a79106de337a275fd265Chad Rosier CmdArgs.push_back("+neonfp"); 60030fe6baf95662ea82a794a8fe3b76998713c183dChad Rosier 601fc55345144f636f7687fd37649f0302914981fffBob Wilson if (CPU != "cortex-a5" && CPU != "cortex-a7" && 602fc55345144f636f7687fd37649f0302914981fffBob Wilson CPU != "cortex-a8" && CPU != "cortex-a9" && 603fc55345144f636f7687fd37649f0302914981fffBob Wilson CPU != "cortex-a9-mp" && CPU != "cortex-a15") 60430fe6baf95662ea82a794a8fe3b76998713c183dChad Rosier D.Diag(diag::err_drv_invalid_feature) << "-mfpmath=neon" << CPU; 60530fe6baf95662ea82a794a8fe3b76998713c183dChad Rosier 6067a938fa66be42710b034a79106de337a275fd265Chad Rosier } else if (FPMath == "vfp" || FPMath == "vfp2" || FPMath == "vfp3" || 6077a938fa66be42710b034a79106de337a275fd265Chad Rosier FPMath == "vfp4") { 6087a938fa66be42710b034a79106de337a275fd265Chad Rosier CmdArgs.push_back("-target-feature"); 6097a938fa66be42710b034a79106de337a275fd265Chad Rosier CmdArgs.push_back("-neonfp"); 61030fe6baf95662ea82a794a8fe3b76998713c183dChad Rosier 61130fe6baf95662ea82a794a8fe3b76998713c183dChad Rosier // FIXME: Add warnings when disabling a feature not present for a given CPU. 6127a938fa66be42710b034a79106de337a275fd265Chad Rosier } else 6137a938fa66be42710b034a79106de337a275fd265Chad Rosier D.Diag(diag::err_drv_clang_unsupported) << A->getAsString(Args); 6147a938fa66be42710b034a79106de337a275fd265Chad Rosier} 6157a938fa66be42710b034a79106de337a275fd265Chad Rosier 616e2571793ba6fc13e5525b8d7224812f99842a1a4Anton Korobeynikov// Select the float ABI as determined by -msoft-float, -mhard-float, and 617e2571793ba6fc13e5525b8d7224812f99842a1a4Anton Korobeynikov// -mfloat-abi=. 618e2571793ba6fc13e5525b8d7224812f99842a1a4Anton Korobeynikovstatic StringRef getARMFloatABI(const Driver &D, 619e2571793ba6fc13e5525b8d7224812f99842a1a4Anton Korobeynikov const ArgList &Args, 620e2571793ba6fc13e5525b8d7224812f99842a1a4Anton Korobeynikov const llvm::Triple &Triple) { 6215f9e272e632e951b1efe824cd16acb4d96077930Chris Lattner StringRef FloatABI; 622cbd1933f83e2332b2d7add10459f80cc4e7eb7bfDaniel Dunbar if (Arg *A = Args.getLastArg(options::OPT_msoft_float, 623cbd1933f83e2332b2d7add10459f80cc4e7eb7bfDaniel Dunbar options::OPT_mhard_float, 624cbd1933f83e2332b2d7add10459f80cc4e7eb7bfDaniel Dunbar options::OPT_mfloat_abi_EQ)) { 625cbd1933f83e2332b2d7add10459f80cc4e7eb7bfDaniel Dunbar if (A->getOption().matches(options::OPT_msoft_float)) 626cbd1933f83e2332b2d7add10459f80cc4e7eb7bfDaniel Dunbar FloatABI = "soft"; 627cbd1933f83e2332b2d7add10459f80cc4e7eb7bfDaniel Dunbar else if (A->getOption().matches(options::OPT_mhard_float)) 628cbd1933f83e2332b2d7add10459f80cc4e7eb7bfDaniel Dunbar FloatABI = "hard"; 629cbd1933f83e2332b2d7add10459f80cc4e7eb7bfDaniel Dunbar else { 6301d489cf4a04ad0ad8ac2696e4eed0995f3a67288Richard Smith FloatABI = A->getValue(); 631cbd1933f83e2332b2d7add10459f80cc4e7eb7bfDaniel Dunbar if (FloatABI != "soft" && FloatABI != "softfp" && FloatABI != "hard") { 6325f9e272e632e951b1efe824cd16acb4d96077930Chris Lattner D.Diag(diag::err_drv_invalid_mfloat_abi) 633cbd1933f83e2332b2d7add10459f80cc4e7eb7bfDaniel Dunbar << A->getAsString(Args); 634cbd1933f83e2332b2d7add10459f80cc4e7eb7bfDaniel Dunbar FloatABI = "soft"; 635cbd1933f83e2332b2d7add10459f80cc4e7eb7bfDaniel Dunbar } 636cbd1933f83e2332b2d7add10459f80cc4e7eb7bfDaniel Dunbar } 637cbd1933f83e2332b2d7add10459f80cc4e7eb7bfDaniel Dunbar } 638cbd1933f83e2332b2d7add10459f80cc4e7eb7bfDaniel Dunbar 639cbd1933f83e2332b2d7add10459f80cc4e7eb7bfDaniel Dunbar // If unspecified, choose the default based on the platform. 640cbd1933f83e2332b2d7add10459f80cc4e7eb7bfDaniel Dunbar if (FloatABI.empty()) { 641bcd6df662471e0ac2d3d85fdba09b1295c2fc468Rafael Espindola switch (Triple.getOS()) { 642905c45f15a25598620d19160c139c6b785aeea89Bob Wilson case llvm::Triple::Darwin: 643905c45f15a25598620d19160c139c6b785aeea89Bob Wilson case llvm::Triple::MacOSX: 644905c45f15a25598620d19160c139c6b785aeea89Bob Wilson case llvm::Triple::IOS: { 645cbd1933f83e2332b2d7add10459f80cc4e7eb7bfDaniel Dunbar // Darwin defaults to "softfp" for v6 and v7. 646cbd1933f83e2332b2d7add10459f80cc4e7eb7bfDaniel Dunbar // 647cbd1933f83e2332b2d7add10459f80cc4e7eb7bfDaniel Dunbar // FIXME: Factor out an ARM class so we can cache the arch somewhere. 64892c4fd5c17a5fd433cca7ddecb0ad4a104baa59cBenjamin Kramer std::string ArchName = 649bcd6df662471e0ac2d3d85fdba09b1295c2fc468Rafael Espindola getLLVMArchSuffixForARM(getARMTargetCPU(Args, Triple)); 65092c4fd5c17a5fd433cca7ddecb0ad4a104baa59cBenjamin Kramer if (StringRef(ArchName).startswith("v6") || 65192c4fd5c17a5fd433cca7ddecb0ad4a104baa59cBenjamin Kramer StringRef(ArchName).startswith("v7")) 652cbd1933f83e2332b2d7add10459f80cc4e7eb7bfDaniel Dunbar FloatABI = "softfp"; 653cbd1933f83e2332b2d7add10459f80cc4e7eb7bfDaniel Dunbar else 654cbd1933f83e2332b2d7add10459f80cc4e7eb7bfDaniel Dunbar FloatABI = "soft"; 655cbd1933f83e2332b2d7add10459f80cc4e7eb7bfDaniel Dunbar break; 656cbd1933f83e2332b2d7add10459f80cc4e7eb7bfDaniel Dunbar } 657cbd1933f83e2332b2d7add10459f80cc4e7eb7bfDaniel Dunbar 65827fa2364b05ab26138c2ecf0eac1937b7fc6c037Rafael Espindola case llvm::Triple::FreeBSD: 65927fa2364b05ab26138c2ecf0eac1937b7fc6c037Rafael Espindola // FreeBSD defaults to soft float 66027fa2364b05ab26138c2ecf0eac1937b7fc6c037Rafael Espindola FloatABI = "soft"; 66127fa2364b05ab26138c2ecf0eac1937b7fc6c037Rafael Espindola break; 66227fa2364b05ab26138c2ecf0eac1937b7fc6c037Rafael Espindola 663cbd1933f83e2332b2d7add10459f80cc4e7eb7bfDaniel Dunbar default: 664fc2bd7c3efed6756a030d58a5f6ae31947e7d451Bob Wilson switch(Triple.getEnvironment()) { 665ff104a12d61d34af67f12a7a966847c821d7afa8Jiangning Liu case llvm::Triple::GNUEABIHF: 666ff104a12d61d34af67f12a7a966847c821d7afa8Jiangning Liu FloatABI = "hard"; 667ff104a12d61d34af67f12a7a966847c821d7afa8Jiangning Liu break; 668fc2bd7c3efed6756a030d58a5f6ae31947e7d451Bob Wilson case llvm::Triple::GNUEABI: 669fc2bd7c3efed6756a030d58a5f6ae31947e7d451Bob Wilson FloatABI = "softfp"; 670fc2bd7c3efed6756a030d58a5f6ae31947e7d451Bob Wilson break; 671fc2bd7c3efed6756a030d58a5f6ae31947e7d451Bob Wilson case llvm::Triple::EABI: 672fc2bd7c3efed6756a030d58a5f6ae31947e7d451Bob Wilson // EABI is always AAPCS, and if it was not marked 'hard', it's softfp 673fc2bd7c3efed6756a030d58a5f6ae31947e7d451Bob Wilson FloatABI = "softfp"; 674fc2bd7c3efed6756a030d58a5f6ae31947e7d451Bob Wilson break; 67594a7142f74bb4a9daa53c22087b19d4568073109Logan Chien case llvm::Triple::Android: { 67692c4fd5c17a5fd433cca7ddecb0ad4a104baa59cBenjamin Kramer std::string ArchName = 677b43550bf1bd944a16cdae9703cb1c2049b04e6bdChandler Carruth getLLVMArchSuffixForARM(getARMTargetCPU(Args, Triple)); 67892c4fd5c17a5fd433cca7ddecb0ad4a104baa59cBenjamin Kramer if (StringRef(ArchName).startswith("v7")) 679b43550bf1bd944a16cdae9703cb1c2049b04e6bdChandler Carruth FloatABI = "softfp"; 680b43550bf1bd944a16cdae9703cb1c2049b04e6bdChandler Carruth else 681b43550bf1bd944a16cdae9703cb1c2049b04e6bdChandler Carruth FloatABI = "soft"; 682b43550bf1bd944a16cdae9703cb1c2049b04e6bdChandler Carruth break; 683b43550bf1bd944a16cdae9703cb1c2049b04e6bdChandler Carruth } 684fc2bd7c3efed6756a030d58a5f6ae31947e7d451Bob Wilson default: 685fc2bd7c3efed6756a030d58a5f6ae31947e7d451Bob Wilson // Assume "soft", but warn the user we are guessing. 686fc2bd7c3efed6756a030d58a5f6ae31947e7d451Bob Wilson FloatABI = "soft"; 6875f9e272e632e951b1efe824cd16acb4d96077930Chris Lattner D.Diag(diag::warn_drv_assuming_mfloat_abi_is) << "soft"; 688fc2bd7c3efed6756a030d58a5f6ae31947e7d451Bob Wilson break; 689fc2bd7c3efed6756a030d58a5f6ae31947e7d451Bob Wilson } 690cbd1933f83e2332b2d7add10459f80cc4e7eb7bfDaniel Dunbar } 691cbd1933f83e2332b2d7add10459f80cc4e7eb7bfDaniel Dunbar } 692cbd1933f83e2332b2d7add10459f80cc4e7eb7bfDaniel Dunbar 693e2571793ba6fc13e5525b8d7224812f99842a1a4Anton Korobeynikov return FloatABI; 694e2571793ba6fc13e5525b8d7224812f99842a1a4Anton Korobeynikov} 695e2571793ba6fc13e5525b8d7224812f99842a1a4Anton Korobeynikov 696e2571793ba6fc13e5525b8d7224812f99842a1a4Anton Korobeynikov 697e2571793ba6fc13e5525b8d7224812f99842a1a4Anton Korobeynikovvoid Clang::AddARMTargetArgs(const ArgList &Args, 698e2571793ba6fc13e5525b8d7224812f99842a1a4Anton Korobeynikov ArgStringList &CmdArgs, 699e2571793ba6fc13e5525b8d7224812f99842a1a4Anton Korobeynikov bool KernelOrKext) const { 700e2571793ba6fc13e5525b8d7224812f99842a1a4Anton Korobeynikov const Driver &D = getToolChain().getDriver(); 7017a0c064770355a4918df69f95de8dea6338a59a2Daniel Dunbar // Get the effective triple, which takes into account the deployment target. 7027a0c064770355a4918df69f95de8dea6338a59a2Daniel Dunbar std::string TripleStr = getToolChain().ComputeEffectiveClangTriple(Args); 7037a0c064770355a4918df69f95de8dea6338a59a2Daniel Dunbar llvm::Triple Triple(TripleStr); 7042e4e110a727a0d379a8fbd0cc2afba1ff3801091Daniel Dunbar std::string CPUName = getARMTargetCPU(Args, Triple); 705e2571793ba6fc13e5525b8d7224812f99842a1a4Anton Korobeynikov 706e2571793ba6fc13e5525b8d7224812f99842a1a4Anton Korobeynikov // Select the ABI to use. 707e2571793ba6fc13e5525b8d7224812f99842a1a4Anton Korobeynikov // 708e2571793ba6fc13e5525b8d7224812f99842a1a4Anton Korobeynikov // FIXME: Support -meabi. 709e2571793ba6fc13e5525b8d7224812f99842a1a4Anton Korobeynikov const char *ABIName = 0; 710e2571793ba6fc13e5525b8d7224812f99842a1a4Anton Korobeynikov if (Arg *A = Args.getLastArg(options::OPT_mabi_EQ)) { 7111d489cf4a04ad0ad8ac2696e4eed0995f3a67288Richard Smith ABIName = A->getValue(); 7122e4e110a727a0d379a8fbd0cc2afba1ff3801091Daniel Dunbar } else if (Triple.isOSDarwin()) { 7132e4e110a727a0d379a8fbd0cc2afba1ff3801091Daniel Dunbar // The backend is hardwired to assume AAPCS for M-class processors, ensure 7142e4e110a727a0d379a8fbd0cc2afba1ff3801091Daniel Dunbar // the frontend matches that. 7152e4e110a727a0d379a8fbd0cc2afba1ff3801091Daniel Dunbar if (StringRef(CPUName).startswith("cortex-m")) { 7162e4e110a727a0d379a8fbd0cc2afba1ff3801091Daniel Dunbar ABIName = "aapcs"; 7172e4e110a727a0d379a8fbd0cc2afba1ff3801091Daniel Dunbar } else { 7182e4e110a727a0d379a8fbd0cc2afba1ff3801091Daniel Dunbar ABIName = "apcs-gnu"; 7192e4e110a727a0d379a8fbd0cc2afba1ff3801091Daniel Dunbar } 720e2571793ba6fc13e5525b8d7224812f99842a1a4Anton Korobeynikov } else { 721e2571793ba6fc13e5525b8d7224812f99842a1a4Anton Korobeynikov // Select the default based on the platform. 722e2571793ba6fc13e5525b8d7224812f99842a1a4Anton Korobeynikov switch(Triple.getEnvironment()) { 72394a7142f74bb4a9daa53c22087b19d4568073109Logan Chien case llvm::Triple::Android: 724e2571793ba6fc13e5525b8d7224812f99842a1a4Anton Korobeynikov case llvm::Triple::GNUEABI: 725ff104a12d61d34af67f12a7a966847c821d7afa8Jiangning Liu case llvm::Triple::GNUEABIHF: 726e2571793ba6fc13e5525b8d7224812f99842a1a4Anton Korobeynikov ABIName = "aapcs-linux"; 727e2571793ba6fc13e5525b8d7224812f99842a1a4Anton Korobeynikov break; 728e2571793ba6fc13e5525b8d7224812f99842a1a4Anton Korobeynikov case llvm::Triple::EABI: 729e2571793ba6fc13e5525b8d7224812f99842a1a4Anton Korobeynikov ABIName = "aapcs"; 730e2571793ba6fc13e5525b8d7224812f99842a1a4Anton Korobeynikov break; 731e2571793ba6fc13e5525b8d7224812f99842a1a4Anton Korobeynikov default: 732e2571793ba6fc13e5525b8d7224812f99842a1a4Anton Korobeynikov ABIName = "apcs-gnu"; 733e2571793ba6fc13e5525b8d7224812f99842a1a4Anton Korobeynikov } 734e2571793ba6fc13e5525b8d7224812f99842a1a4Anton Korobeynikov } 735e2571793ba6fc13e5525b8d7224812f99842a1a4Anton Korobeynikov CmdArgs.push_back("-target-abi"); 736e2571793ba6fc13e5525b8d7224812f99842a1a4Anton Korobeynikov CmdArgs.push_back(ABIName); 737e2571793ba6fc13e5525b8d7224812f99842a1a4Anton Korobeynikov 738e2571793ba6fc13e5525b8d7224812f99842a1a4Anton Korobeynikov // Set the CPU based on -march= and -mcpu=. 739e2571793ba6fc13e5525b8d7224812f99842a1a4Anton Korobeynikov CmdArgs.push_back("-target-cpu"); 7402e4e110a727a0d379a8fbd0cc2afba1ff3801091Daniel Dunbar CmdArgs.push_back(Args.MakeArgString(CPUName)); 741e2571793ba6fc13e5525b8d7224812f99842a1a4Anton Korobeynikov 742e2571793ba6fc13e5525b8d7224812f99842a1a4Anton Korobeynikov // Determine floating point ABI from the options & target defaults. 743e2571793ba6fc13e5525b8d7224812f99842a1a4Anton Korobeynikov StringRef FloatABI = getARMFloatABI(D, Args, Triple); 744cbd1933f83e2332b2d7add10459f80cc4e7eb7bfDaniel Dunbar if (FloatABI == "soft") { 745cbd1933f83e2332b2d7add10459f80cc4e7eb7bfDaniel Dunbar // Floating point operations and argument passing are soft. 746cbd1933f83e2332b2d7add10459f80cc4e7eb7bfDaniel Dunbar // 747cbd1933f83e2332b2d7add10459f80cc4e7eb7bfDaniel Dunbar // FIXME: This changes CPP defines, we need -target-soft-float. 7483b315264d1a6fa303e20fe0caec306ccafc090deDaniel Dunbar CmdArgs.push_back("-msoft-float"); 74987667aafe68c366be57f5afb60428237593da0edDaniel Dunbar CmdArgs.push_back("-mfloat-abi"); 75087667aafe68c366be57f5afb60428237593da0edDaniel Dunbar CmdArgs.push_back("soft"); 751cbd1933f83e2332b2d7add10459f80cc4e7eb7bfDaniel Dunbar } else if (FloatABI == "softfp") { 752cbd1933f83e2332b2d7add10459f80cc4e7eb7bfDaniel Dunbar // Floating point operations are hard, but argument passing is soft. 75387667aafe68c366be57f5afb60428237593da0edDaniel Dunbar CmdArgs.push_back("-mfloat-abi"); 75487667aafe68c366be57f5afb60428237593da0edDaniel Dunbar CmdArgs.push_back("soft"); 755cbd1933f83e2332b2d7add10459f80cc4e7eb7bfDaniel Dunbar } else { 756cbd1933f83e2332b2d7add10459f80cc4e7eb7bfDaniel Dunbar // Floating point operations and argument passing are hard. 757cbd1933f83e2332b2d7add10459f80cc4e7eb7bfDaniel Dunbar assert(FloatABI == "hard" && "Invalid float abi!"); 75887667aafe68c366be57f5afb60428237593da0edDaniel Dunbar CmdArgs.push_back("-mfloat-abi"); 75987667aafe68c366be57f5afb60428237593da0edDaniel Dunbar CmdArgs.push_back("hard"); 760cbd1933f83e2332b2d7add10459f80cc4e7eb7bfDaniel Dunbar } 76197f52ac45369f6925b548404e61d511034c874ecDaniel Dunbar 76297f52ac45369f6925b548404e61d511034c874ecDaniel Dunbar // Set appropriate target features for floating point mode. 76397f52ac45369f6925b548404e61d511034c874ecDaniel Dunbar // 76497f52ac45369f6925b548404e61d511034c874ecDaniel Dunbar // FIXME: Note, this is a hack, the LLVM backend doesn't actually use these 76597f52ac45369f6925b548404e61d511034c874ecDaniel Dunbar // yet (it uses the -mfloat-abi and -msoft-float options above), and it is 76697f52ac45369f6925b548404e61d511034c874ecDaniel Dunbar // stripped out by the ARM target. 76797f52ac45369f6925b548404e61d511034c874ecDaniel Dunbar 76897f52ac45369f6925b548404e61d511034c874ecDaniel Dunbar // Use software floating point operations? 76997f52ac45369f6925b548404e61d511034c874ecDaniel Dunbar if (FloatABI == "soft") { 77097f52ac45369f6925b548404e61d511034c874ecDaniel Dunbar CmdArgs.push_back("-target-feature"); 77197f52ac45369f6925b548404e61d511034c874ecDaniel Dunbar CmdArgs.push_back("+soft-float"); 77297f52ac45369f6925b548404e61d511034c874ecDaniel Dunbar } 77397f52ac45369f6925b548404e61d511034c874ecDaniel Dunbar 77497f52ac45369f6925b548404e61d511034c874ecDaniel Dunbar // Use software floating point argument passing? 77597f52ac45369f6925b548404e61d511034c874ecDaniel Dunbar if (FloatABI != "hard") { 77697f52ac45369f6925b548404e61d511034c874ecDaniel Dunbar CmdArgs.push_back("-target-feature"); 77797f52ac45369f6925b548404e61d511034c874ecDaniel Dunbar CmdArgs.push_back("+soft-float-abi"); 77897f52ac45369f6925b548404e61d511034c874ecDaniel Dunbar } 779a91320b8af7143f7af4c0665ffa62a3b244c0bd9Daniel Dunbar 780a91320b8af7143f7af4c0665ffa62a3b244c0bd9Daniel Dunbar // Honor -mfpu=. 781993172757762436d22b2dfc74e7cca1bade1a7bfChad Rosier if (const Arg *A = Args.getLastArg(options::OPT_mfpu_EQ)) 782f80f2a5098218211704bc4e66a8c2f46a8fa1d25Chad Rosier addFPUArgs(D, A, Args, CmdArgs); 7837187fac0f19f75c62f575c9f15f0ed68b7d97810Daniel Dunbar 7847a938fa66be42710b034a79106de337a275fd265Chad Rosier // Honor -mfpmath=. 7857a938fa66be42710b034a79106de337a275fd265Chad Rosier if (const Arg *A = Args.getLastArg(options::OPT_mfpmath_EQ)) 78630fe6baf95662ea82a794a8fe3b76998713c183dChad Rosier addFPMathArgs(D, A, Args, CmdArgs, getARMTargetCPU(Args, Triple)); 7877a938fa66be42710b034a79106de337a275fd265Chad Rosier 7887187fac0f19f75c62f575c9f15f0ed68b7d97810Daniel Dunbar // Setting -msoft-float effectively disables NEON because of the GCC 7897187fac0f19f75c62f575c9f15f0ed68b7d97810Daniel Dunbar // implementation, although the same isn't true of VFP or VFP3. 7907187fac0f19f75c62f575c9f15f0ed68b7d97810Daniel Dunbar if (FloatABI == "soft") { 791fa41d6975058ceb1b8a24564f6dcec72f89f62e8Daniel Dunbar CmdArgs.push_back("-target-feature"); 792fa41d6975058ceb1b8a24564f6dcec72f89f62e8Daniel Dunbar CmdArgs.push_back("-neon"); 793fa41d6975058ceb1b8a24564f6dcec72f89f62e8Daniel Dunbar } 794fa41d6975058ceb1b8a24564f6dcec72f89f62e8Daniel Dunbar 795fa41d6975058ceb1b8a24564f6dcec72f89f62e8Daniel Dunbar // Kernel code has more strict alignment requirements. 796fa41d6975058ceb1b8a24564f6dcec72f89f62e8Daniel Dunbar if (KernelOrKext) { 7977a0c064770355a4918df69f95de8dea6338a59a2Daniel Dunbar if (Triple.getOS() != llvm::Triple::IOS || Triple.isOSVersionLT(6)) { 7987a0c064770355a4918df69f95de8dea6338a59a2Daniel Dunbar CmdArgs.push_back("-backend-option"); 7997a0c064770355a4918df69f95de8dea6338a59a2Daniel Dunbar CmdArgs.push_back("-arm-long-calls"); 8007a0c064770355a4918df69f95de8dea6338a59a2Daniel Dunbar } 801fa41d6975058ceb1b8a24564f6dcec72f89f62e8Daniel Dunbar 8023c66d30d513106bb794990c5e4ba36a31ac19f15Daniel Dunbar CmdArgs.push_back("-backend-option"); 803fa41d6975058ceb1b8a24564f6dcec72f89f62e8Daniel Dunbar CmdArgs.push_back("-arm-strict-align"); 804b5fbb8931466eeab70a30a27a8d5f385472305a1Daniel Dunbar 805b5fbb8931466eeab70a30a27a8d5f385472305a1Daniel Dunbar // The kext linker doesn't know how to deal with movw/movt. 806b5fbb8931466eeab70a30a27a8d5f385472305a1Daniel Dunbar CmdArgs.push_back("-backend-option"); 807b5fbb8931466eeab70a30a27a8d5f385472305a1Daniel Dunbar CmdArgs.push_back("-arm-darwin-use-movt=0"); 8087187fac0f19f75c62f575c9f15f0ed68b7d97810Daniel Dunbar } 8091b9060553221720152e12981109549e0a1d8e3a1Chad Rosier 8101b9060553221720152e12981109549e0a1d8e3a1Chad Rosier // Setting -mno-global-merge disables the codegen global merge pass. Setting 8111b9060553221720152e12981109549e0a1d8e3a1Chad Rosier // -mglobal-merge has no effect as the pass is enabled by default. 8121b9060553221720152e12981109549e0a1d8e3a1Chad Rosier if (Arg *A = Args.getLastArg(options::OPT_mglobal_merge, 8131b9060553221720152e12981109549e0a1d8e3a1Chad Rosier options::OPT_mno_global_merge)) { 8141b9060553221720152e12981109549e0a1d8e3a1Chad Rosier if (A->getOption().matches(options::OPT_mno_global_merge)) 8151b9060553221720152e12981109549e0a1d8e3a1Chad Rosier CmdArgs.push_back("-mno-global-merge"); 8161b9060553221720152e12981109549e0a1d8e3a1Chad Rosier } 817ee9ad5ce4840b3c95024948c89d00945ffdda9bbChad Rosier 818005af27c607536038864ff36d480b5ecd066a267Chad Rosier if (Args.hasArg(options::OPT_mno_implicit_float)) 819ee9ad5ce4840b3c95024948c89d00945ffdda9bbChad Rosier CmdArgs.push_back("-no-implicit-float"); 820b163ef7e7a5d904ef0962a7c38c460be083c4d63Daniel Dunbar} 821b163ef7e7a5d904ef0962a7c38c460be083c4d63Daniel Dunbar 8228e1c598310d5cd75700cf800cb333b985ce05420Simon Atanasyan// Translate MIPS CPU name alias option to CPU name. 8238e1c598310d5cd75700cf800cb333b985ce05420Simon Atanasyanstatic StringRef getMipsCPUFromAlias(const Arg &A) { 8248e1c598310d5cd75700cf800cb333b985ce05420Simon Atanasyan if (A.getOption().matches(options::OPT_mips32)) 8258e1c598310d5cd75700cf800cb333b985ce05420Simon Atanasyan return "mips32"; 8268e1c598310d5cd75700cf800cb333b985ce05420Simon Atanasyan if (A.getOption().matches(options::OPT_mips32r2)) 8278e1c598310d5cd75700cf800cb333b985ce05420Simon Atanasyan return "mips32r2"; 8288e1c598310d5cd75700cf800cb333b985ce05420Simon Atanasyan if (A.getOption().matches(options::OPT_mips64)) 8298e1c598310d5cd75700cf800cb333b985ce05420Simon Atanasyan return "mips64"; 8308e1c598310d5cd75700cf800cb333b985ce05420Simon Atanasyan if (A.getOption().matches(options::OPT_mips64r2)) 8318e1c598310d5cd75700cf800cb333b985ce05420Simon Atanasyan return "mips64r2"; 8328e1c598310d5cd75700cf800cb333b985ce05420Simon Atanasyan llvm_unreachable("Unexpected option"); 8338e1c598310d5cd75700cf800cb333b985ce05420Simon Atanasyan return ""; 8348e1c598310d5cd75700cf800cb333b985ce05420Simon Atanasyan} 8358e1c598310d5cd75700cf800cb333b985ce05420Simon Atanasyan 836a2768be144256f9eb721bef8b751e56e0b64fa0bSimon Atanasyan// Get CPU and ABI names. They are not independent 837a2768be144256f9eb721bef8b751e56e0b64fa0bSimon Atanasyan// so we have to calculate them together. 838a2768be144256f9eb721bef8b751e56e0b64fa0bSimon Atanasyanstatic void getMipsCPUAndABI(const ArgList &Args, 839a2768be144256f9eb721bef8b751e56e0b64fa0bSimon Atanasyan const ToolChain &TC, 840a2768be144256f9eb721bef8b751e56e0b64fa0bSimon Atanasyan StringRef &CPUName, 841a2768be144256f9eb721bef8b751e56e0b64fa0bSimon Atanasyan StringRef &ABIName) { 84289d83ff23414240555f895d3dad736bd30f5af4eSimon Atanasyan const char *DefMips32CPU = "mips32"; 84389d83ff23414240555f895d3dad736bd30f5af4eSimon Atanasyan const char *DefMips64CPU = "mips64"; 8449f36062866e6e4bbbfd3efce85fcfb1ce62df97fAkira Hatanaka 84589d83ff23414240555f895d3dad736bd30f5af4eSimon Atanasyan if (Arg *A = Args.getLastArg(options::OPT_march_EQ, 8468e1c598310d5cd75700cf800cb333b985ce05420Simon Atanasyan options::OPT_mcpu_EQ, 8478e1c598310d5cd75700cf800cb333b985ce05420Simon Atanasyan options::OPT_mips_CPUs_Group)) { 8488e1c598310d5cd75700cf800cb333b985ce05420Simon Atanasyan if (A->getOption().matches(options::OPT_mips_CPUs_Group)) 8498e1c598310d5cd75700cf800cb333b985ce05420Simon Atanasyan CPUName = getMipsCPUFromAlias(*A); 8508e1c598310d5cd75700cf800cb333b985ce05420Simon Atanasyan else 8511d489cf4a04ad0ad8ac2696e4eed0995f3a67288Richard Smith CPUName = A->getValue(); 8528e1c598310d5cd75700cf800cb333b985ce05420Simon Atanasyan } 85389d83ff23414240555f895d3dad736bd30f5af4eSimon Atanasyan 8549f36062866e6e4bbbfd3efce85fcfb1ce62df97fAkira Hatanaka if (Arg *A = Args.getLastArg(options::OPT_mabi_EQ)) 8551d489cf4a04ad0ad8ac2696e4eed0995f3a67288Richard Smith ABIName = A->getValue(); 85689d83ff23414240555f895d3dad736bd30f5af4eSimon Atanasyan 85789d83ff23414240555f895d3dad736bd30f5af4eSimon Atanasyan // Setup default CPU and ABI names. 85889d83ff23414240555f895d3dad736bd30f5af4eSimon Atanasyan if (CPUName.empty() && ABIName.empty()) { 85989d83ff23414240555f895d3dad736bd30f5af4eSimon Atanasyan switch (TC.getTriple().getArch()) { 86089d83ff23414240555f895d3dad736bd30f5af4eSimon Atanasyan default: 86189d83ff23414240555f895d3dad736bd30f5af4eSimon Atanasyan llvm_unreachable("Unexpected triple arch name"); 86289d83ff23414240555f895d3dad736bd30f5af4eSimon Atanasyan case llvm::Triple::mips: 86389d83ff23414240555f895d3dad736bd30f5af4eSimon Atanasyan case llvm::Triple::mipsel: 86489d83ff23414240555f895d3dad736bd30f5af4eSimon Atanasyan CPUName = DefMips32CPU; 86589d83ff23414240555f895d3dad736bd30f5af4eSimon Atanasyan break; 86689d83ff23414240555f895d3dad736bd30f5af4eSimon Atanasyan case llvm::Triple::mips64: 86789d83ff23414240555f895d3dad736bd30f5af4eSimon Atanasyan case llvm::Triple::mips64el: 86889d83ff23414240555f895d3dad736bd30f5af4eSimon Atanasyan CPUName = DefMips64CPU; 86989d83ff23414240555f895d3dad736bd30f5af4eSimon Atanasyan break; 87089d83ff23414240555f895d3dad736bd30f5af4eSimon Atanasyan } 87189d83ff23414240555f895d3dad736bd30f5af4eSimon Atanasyan } 87289d83ff23414240555f895d3dad736bd30f5af4eSimon Atanasyan 87389d83ff23414240555f895d3dad736bd30f5af4eSimon Atanasyan if (!ABIName.empty()) { 87489d83ff23414240555f895d3dad736bd30f5af4eSimon Atanasyan // Deduce CPU name from ABI name. 87589d83ff23414240555f895d3dad736bd30f5af4eSimon Atanasyan CPUName = llvm::StringSwitch<const char *>(ABIName) 876e9616a4972a4c2fdc28128c057f21d7a79516c86Simon Atanasyan .Cases("32", "o32", "eabi", DefMips32CPU) 877e9616a4972a4c2fdc28128c057f21d7a79516c86Simon Atanasyan .Cases("n32", "n64", "64", DefMips64CPU) 87889d83ff23414240555f895d3dad736bd30f5af4eSimon Atanasyan .Default(""); 87989d83ff23414240555f895d3dad736bd30f5af4eSimon Atanasyan } 88089d83ff23414240555f895d3dad736bd30f5af4eSimon Atanasyan else if (!CPUName.empty()) { 88189d83ff23414240555f895d3dad736bd30f5af4eSimon Atanasyan // Deduce ABI name from CPU name. 88289d83ff23414240555f895d3dad736bd30f5af4eSimon Atanasyan ABIName = llvm::StringSwitch<const char *>(CPUName) 88389d83ff23414240555f895d3dad736bd30f5af4eSimon Atanasyan .Cases("mips32", "mips32r2", "o32") 88489d83ff23414240555f895d3dad736bd30f5af4eSimon Atanasyan .Cases("mips64", "mips64r2", "n64") 88589d83ff23414240555f895d3dad736bd30f5af4eSimon Atanasyan .Default(""); 88689d83ff23414240555f895d3dad736bd30f5af4eSimon Atanasyan } 88789d83ff23414240555f895d3dad736bd30f5af4eSimon Atanasyan 88889d83ff23414240555f895d3dad736bd30f5af4eSimon Atanasyan // FIXME: Warn on inconsistent cpu and abi usage. 889a2768be144256f9eb721bef8b751e56e0b64fa0bSimon Atanasyan} 890a2768be144256f9eb721bef8b751e56e0b64fa0bSimon Atanasyan 891e9616a4972a4c2fdc28128c057f21d7a79516c86Simon Atanasyan// Convert ABI name to the GNU tools acceptable variant. 892e9616a4972a4c2fdc28128c057f21d7a79516c86Simon Atanasyanstatic StringRef getGnuCompatibleMipsABIName(StringRef ABI) { 893e9616a4972a4c2fdc28128c057f21d7a79516c86Simon Atanasyan return llvm::StringSwitch<llvm::StringRef>(ABI) 894e9616a4972a4c2fdc28128c057f21d7a79516c86Simon Atanasyan .Case("o32", "32") 895e9616a4972a4c2fdc28128c057f21d7a79516c86Simon Atanasyan .Case("n64", "64") 896e9616a4972a4c2fdc28128c057f21d7a79516c86Simon Atanasyan .Default(ABI); 897e9616a4972a4c2fdc28128c057f21d7a79516c86Simon Atanasyan} 898e9616a4972a4c2fdc28128c057f21d7a79516c86Simon Atanasyan 8995e62779634ba002d7112a66efc8e075de9b8a3f1Simon Atanasyan// Select the MIPS float ABI as determined by -msoft-float, -mhard-float, 9005e62779634ba002d7112a66efc8e075de9b8a3f1Simon Atanasyan// and -mfloat-abi=. 9015e62779634ba002d7112a66efc8e075de9b8a3f1Simon Atanasyanstatic StringRef getMipsFloatABI(const Driver &D, const ArgList &Args) { 902ad8d8a31b010ceac4cad2553f16fc1a77c4b2e5eAkira Hatanaka // Select the float ABI as determined by -msoft-float, -mhard-float, 903ad8d8a31b010ceac4cad2553f16fc1a77c4b2e5eAkira Hatanaka // and -mfloat-abi=. 9045f9e272e632e951b1efe824cd16acb4d96077930Chris Lattner StringRef FloatABI; 905ed734737d5af31906e30e537d4a41c760ddcfc59Eric Christopher if (Arg *A = Args.getLastArg(options::OPT_msoft_float, 906ad8d8a31b010ceac4cad2553f16fc1a77c4b2e5eAkira Hatanaka options::OPT_mhard_float, 907ad8d8a31b010ceac4cad2553f16fc1a77c4b2e5eAkira Hatanaka options::OPT_mfloat_abi_EQ)) { 908ed734737d5af31906e30e537d4a41c760ddcfc59Eric Christopher if (A->getOption().matches(options::OPT_msoft_float)) 909ed734737d5af31906e30e537d4a41c760ddcfc59Eric Christopher FloatABI = "soft"; 910ed734737d5af31906e30e537d4a41c760ddcfc59Eric Christopher else if (A->getOption().matches(options::OPT_mhard_float)) 911ed734737d5af31906e30e537d4a41c760ddcfc59Eric Christopher FloatABI = "hard"; 912ad8d8a31b010ceac4cad2553f16fc1a77c4b2e5eAkira Hatanaka else { 9131d489cf4a04ad0ad8ac2696e4eed0995f3a67288Richard Smith FloatABI = A->getValue(); 914ad8d8a31b010ceac4cad2553f16fc1a77c4b2e5eAkira Hatanaka if (FloatABI != "soft" && FloatABI != "single" && FloatABI != "hard") { 9155e62779634ba002d7112a66efc8e075de9b8a3f1Simon Atanasyan D.Diag(diag::err_drv_invalid_mfloat_abi) << A->getAsString(Args); 916ad8d8a31b010ceac4cad2553f16fc1a77c4b2e5eAkira Hatanaka FloatABI = "hard"; 917ad8d8a31b010ceac4cad2553f16fc1a77c4b2e5eAkira Hatanaka } 918ad8d8a31b010ceac4cad2553f16fc1a77c4b2e5eAkira Hatanaka } 919ed734737d5af31906e30e537d4a41c760ddcfc59Eric Christopher } 920ed734737d5af31906e30e537d4a41c760ddcfc59Eric Christopher 921ed734737d5af31906e30e537d4a41c760ddcfc59Eric Christopher // If unspecified, choose the default based on the platform. 922ed734737d5af31906e30e537d4a41c760ddcfc59Eric Christopher if (FloatABI.empty()) { 923ad8d8a31b010ceac4cad2553f16fc1a77c4b2e5eAkira Hatanaka // Assume "hard", because it's a default value used by gcc. 924ad8d8a31b010ceac4cad2553f16fc1a77c4b2e5eAkira Hatanaka // When we start to recognize specific target MIPS processors, 925ad8d8a31b010ceac4cad2553f16fc1a77c4b2e5eAkira Hatanaka // we will be able to select the default more correctly. 926ad8d8a31b010ceac4cad2553f16fc1a77c4b2e5eAkira Hatanaka FloatABI = "hard"; 927ed734737d5af31906e30e537d4a41c760ddcfc59Eric Christopher } 928ed734737d5af31906e30e537d4a41c760ddcfc59Eric Christopher 9295e62779634ba002d7112a66efc8e075de9b8a3f1Simon Atanasyan return FloatABI; 9305e62779634ba002d7112a66efc8e075de9b8a3f1Simon Atanasyan} 9315e62779634ba002d7112a66efc8e075de9b8a3f1Simon Atanasyan 932dc536f55c0c85df7644592c69434b7b191d73dc8Simon Atanasyanstatic void AddTargetFeature(const ArgList &Args, 933dc536f55c0c85df7644592c69434b7b191d73dc8Simon Atanasyan ArgStringList &CmdArgs, 934dc536f55c0c85df7644592c69434b7b191d73dc8Simon Atanasyan OptSpecifier OnOpt, 935dc536f55c0c85df7644592c69434b7b191d73dc8Simon Atanasyan OptSpecifier OffOpt, 936dc536f55c0c85df7644592c69434b7b191d73dc8Simon Atanasyan StringRef FeatureName) { 937dc536f55c0c85df7644592c69434b7b191d73dc8Simon Atanasyan if (Arg *A = Args.getLastArg(OnOpt, OffOpt)) { 938dc536f55c0c85df7644592c69434b7b191d73dc8Simon Atanasyan CmdArgs.push_back("-target-feature"); 939dc536f55c0c85df7644592c69434b7b191d73dc8Simon Atanasyan if (A->getOption().matches(OnOpt)) 940dc536f55c0c85df7644592c69434b7b191d73dc8Simon Atanasyan CmdArgs.push_back(Args.MakeArgString("+" + FeatureName)); 941dc536f55c0c85df7644592c69434b7b191d73dc8Simon Atanasyan else 942dc536f55c0c85df7644592c69434b7b191d73dc8Simon Atanasyan CmdArgs.push_back(Args.MakeArgString("-" + FeatureName)); 943dc536f55c0c85df7644592c69434b7b191d73dc8Simon Atanasyan } 944dc536f55c0c85df7644592c69434b7b191d73dc8Simon Atanasyan} 945dc536f55c0c85df7644592c69434b7b191d73dc8Simon Atanasyan 9465e62779634ba002d7112a66efc8e075de9b8a3f1Simon Atanasyanvoid Clang::AddMIPSTargetArgs(const ArgList &Args, 9475e62779634ba002d7112a66efc8e075de9b8a3f1Simon Atanasyan ArgStringList &CmdArgs) const { 9485e62779634ba002d7112a66efc8e075de9b8a3f1Simon Atanasyan const Driver &D = getToolChain().getDriver(); 9495e62779634ba002d7112a66efc8e075de9b8a3f1Simon Atanasyan StringRef CPUName; 9505e62779634ba002d7112a66efc8e075de9b8a3f1Simon Atanasyan StringRef ABIName; 9515e62779634ba002d7112a66efc8e075de9b8a3f1Simon Atanasyan getMipsCPUAndABI(Args, getToolChain(), CPUName, ABIName); 9525e62779634ba002d7112a66efc8e075de9b8a3f1Simon Atanasyan 9535e62779634ba002d7112a66efc8e075de9b8a3f1Simon Atanasyan CmdArgs.push_back("-target-cpu"); 9545e62779634ba002d7112a66efc8e075de9b8a3f1Simon Atanasyan CmdArgs.push_back(CPUName.data()); 9555e62779634ba002d7112a66efc8e075de9b8a3f1Simon Atanasyan 9565e62779634ba002d7112a66efc8e075de9b8a3f1Simon Atanasyan CmdArgs.push_back("-target-abi"); 9575e62779634ba002d7112a66efc8e075de9b8a3f1Simon Atanasyan CmdArgs.push_back(ABIName.data()); 9585e62779634ba002d7112a66efc8e075de9b8a3f1Simon Atanasyan 9595e62779634ba002d7112a66efc8e075de9b8a3f1Simon Atanasyan StringRef FloatABI = getMipsFloatABI(D, Args); 9605e62779634ba002d7112a66efc8e075de9b8a3f1Simon Atanasyan 961e1d792f0ee02b5beb4b8e94506b3a0c353df43ddSimon Atanasyan bool IsMips16 = Args.getLastArg(options::OPT_mips16) != NULL; 962e1d792f0ee02b5beb4b8e94506b3a0c353df43ddSimon Atanasyan 963e1d792f0ee02b5beb4b8e94506b3a0c353df43ddSimon Atanasyan if (FloatABI == "soft" || (FloatABI == "hard" && IsMips16)) { 964ed734737d5af31906e30e537d4a41c760ddcfc59Eric Christopher // Floating point operations and argument passing are soft. 965ed734737d5af31906e30e537d4a41c760ddcfc59Eric Christopher CmdArgs.push_back("-msoft-float"); 966ad8d8a31b010ceac4cad2553f16fc1a77c4b2e5eAkira Hatanaka CmdArgs.push_back("-mfloat-abi"); 967ad8d8a31b010ceac4cad2553f16fc1a77c4b2e5eAkira Hatanaka CmdArgs.push_back("soft"); 968ad8d8a31b010ceac4cad2553f16fc1a77c4b2e5eAkira Hatanaka 969ad8d8a31b010ceac4cad2553f16fc1a77c4b2e5eAkira Hatanaka // FIXME: Note, this is a hack. We need to pass the selected float 970ad8d8a31b010ceac4cad2553f16fc1a77c4b2e5eAkira Hatanaka // mode to the MipsTargetInfoBase to define appropriate macros there. 971ad8d8a31b010ceac4cad2553f16fc1a77c4b2e5eAkira Hatanaka // Now it is the only method. 972ad8d8a31b010ceac4cad2553f16fc1a77c4b2e5eAkira Hatanaka CmdArgs.push_back("-target-feature"); 973ad8d8a31b010ceac4cad2553f16fc1a77c4b2e5eAkira Hatanaka CmdArgs.push_back("+soft-float"); 974e1d792f0ee02b5beb4b8e94506b3a0c353df43ddSimon Atanasyan 975e1d792f0ee02b5beb4b8e94506b3a0c353df43ddSimon Atanasyan if (FloatABI == "hard" && IsMips16) { 976e1d792f0ee02b5beb4b8e94506b3a0c353df43ddSimon Atanasyan CmdArgs.push_back("-mllvm"); 977e1d792f0ee02b5beb4b8e94506b3a0c353df43ddSimon Atanasyan CmdArgs.push_back("-mips16-hard-float"); 978e1d792f0ee02b5beb4b8e94506b3a0c353df43ddSimon Atanasyan } 979ad8d8a31b010ceac4cad2553f16fc1a77c4b2e5eAkira Hatanaka } 980ad8d8a31b010ceac4cad2553f16fc1a77c4b2e5eAkira Hatanaka else if (FloatABI == "single") { 981ad8d8a31b010ceac4cad2553f16fc1a77c4b2e5eAkira Hatanaka // Restrict the use of hardware floating-point 982ad8d8a31b010ceac4cad2553f16fc1a77c4b2e5eAkira Hatanaka // instructions to 32-bit operations. 983ad8d8a31b010ceac4cad2553f16fc1a77c4b2e5eAkira Hatanaka CmdArgs.push_back("-target-feature"); 984ad8d8a31b010ceac4cad2553f16fc1a77c4b2e5eAkira Hatanaka CmdArgs.push_back("+single-float"); 985ad8d8a31b010ceac4cad2553f16fc1a77c4b2e5eAkira Hatanaka } 986ad8d8a31b010ceac4cad2553f16fc1a77c4b2e5eAkira Hatanaka else { 987ad8d8a31b010ceac4cad2553f16fc1a77c4b2e5eAkira Hatanaka // Floating point operations and argument passing are hard. 988ed734737d5af31906e30e537d4a41c760ddcfc59Eric Christopher assert(FloatABI == "hard" && "Invalid float abi!"); 989ad8d8a31b010ceac4cad2553f16fc1a77c4b2e5eAkira Hatanaka CmdArgs.push_back("-mfloat-abi"); 990ad8d8a31b010ceac4cad2553f16fc1a77c4b2e5eAkira Hatanaka CmdArgs.push_back("hard"); 991ed734737d5af31906e30e537d4a41c760ddcfc59Eric Christopher } 9920b273efa37a38deab77dadf72540c9c07c63f8cfSimon Atanasyan 993dc536f55c0c85df7644592c69434b7b191d73dc8Simon Atanasyan AddTargetFeature(Args, CmdArgs, 994dc536f55c0c85df7644592c69434b7b191d73dc8Simon Atanasyan options::OPT_mips16, options::OPT_mno_mips16, 995dc536f55c0c85df7644592c69434b7b191d73dc8Simon Atanasyan "mips16"); 996d797a85866fd5ce62850dd145396b451364032a3Simon Atanasyan AddTargetFeature(Args, CmdArgs, 997d797a85866fd5ce62850dd145396b451364032a3Simon Atanasyan options::OPT_mdsp, options::OPT_mno_dsp, 998d797a85866fd5ce62850dd145396b451364032a3Simon Atanasyan "dsp"); 999d797a85866fd5ce62850dd145396b451364032a3Simon Atanasyan AddTargetFeature(Args, CmdArgs, 1000d797a85866fd5ce62850dd145396b451364032a3Simon Atanasyan options::OPT_mdspr2, options::OPT_mno_dspr2, 1001d797a85866fd5ce62850dd145396b451364032a3Simon Atanasyan "dspr2"); 10029804b761a9743c8248864e94018e4dc26577d471Simon Atanasyan 1003bda07ace55e40bd1a620051156fa9b13ad3936aaSimon Atanasyan if (Arg *A = Args.getLastArg(options::OPT_mxgot, options::OPT_mno_xgot)) { 1004bda07ace55e40bd1a620051156fa9b13ad3936aaSimon Atanasyan if (A->getOption().matches(options::OPT_mxgot)) { 1005bda07ace55e40bd1a620051156fa9b13ad3936aaSimon Atanasyan CmdArgs.push_back("-mllvm"); 1006bda07ace55e40bd1a620051156fa9b13ad3936aaSimon Atanasyan CmdArgs.push_back("-mxgot"); 1007bda07ace55e40bd1a620051156fa9b13ad3936aaSimon Atanasyan } 1008bda07ace55e40bd1a620051156fa9b13ad3936aaSimon Atanasyan } 1009bda07ace55e40bd1a620051156fa9b13ad3936aaSimon Atanasyan 10109804b761a9743c8248864e94018e4dc26577d471Simon Atanasyan if (Arg *A = Args.getLastArg(options::OPT_G)) { 10111d489cf4a04ad0ad8ac2696e4eed0995f3a67288Richard Smith StringRef v = A->getValue(); 10129804b761a9743c8248864e94018e4dc26577d471Simon Atanasyan CmdArgs.push_back("-mllvm"); 10139804b761a9743c8248864e94018e4dc26577d471Simon Atanasyan CmdArgs.push_back(Args.MakeArgString("-mips-ssection-threshold=" + v)); 10149804b761a9743c8248864e94018e4dc26577d471Simon Atanasyan A->claim(); 10159804b761a9743c8248864e94018e4dc26577d471Simon Atanasyan } 1016ed734737d5af31906e30e537d4a41c760ddcfc59Eric Christopher} 1017ed734737d5af31906e30e537d4a41c760ddcfc59Eric Christopher 101802a84277864e5476b12c0ec687ed09f0b2922471Hal Finkel/// getPPCTargetCPU - Get the (LLVM) name of the PowerPC cpu we are targeting. 101902a84277864e5476b12c0ec687ed09f0b2922471Hal Finkelstatic std::string getPPCTargetCPU(const ArgList &Args) { 102002a84277864e5476b12c0ec687ed09f0b2922471Hal Finkel if (Arg *A = Args.getLastArg(options::OPT_mcpu_EQ)) { 10211d489cf4a04ad0ad8ac2696e4eed0995f3a67288Richard Smith StringRef CPUName = A->getValue(); 102202a84277864e5476b12c0ec687ed09f0b2922471Hal Finkel 102302a84277864e5476b12c0ec687ed09f0b2922471Hal Finkel if (CPUName == "native") { 102402a84277864e5476b12c0ec687ed09f0b2922471Hal Finkel std::string CPU = llvm::sys::getHostCPUName(); 102502a84277864e5476b12c0ec687ed09f0b2922471Hal Finkel if (!CPU.empty() && CPU != "generic") 102602a84277864e5476b12c0ec687ed09f0b2922471Hal Finkel return CPU; 102702a84277864e5476b12c0ec687ed09f0b2922471Hal Finkel else 102802a84277864e5476b12c0ec687ed09f0b2922471Hal Finkel return ""; 102902a84277864e5476b12c0ec687ed09f0b2922471Hal Finkel } 103002a84277864e5476b12c0ec687ed09f0b2922471Hal Finkel 103102a84277864e5476b12c0ec687ed09f0b2922471Hal Finkel return llvm::StringSwitch<const char *>(CPUName) 103202a84277864e5476b12c0ec687ed09f0b2922471Hal Finkel .Case("common", "generic") 103302a84277864e5476b12c0ec687ed09f0b2922471Hal Finkel .Case("440", "440") 103402a84277864e5476b12c0ec687ed09f0b2922471Hal Finkel .Case("440fp", "440") 103502a84277864e5476b12c0ec687ed09f0b2922471Hal Finkel .Case("450", "450") 103602a84277864e5476b12c0ec687ed09f0b2922471Hal Finkel .Case("601", "601") 103702a84277864e5476b12c0ec687ed09f0b2922471Hal Finkel .Case("602", "602") 103802a84277864e5476b12c0ec687ed09f0b2922471Hal Finkel .Case("603", "603") 103902a84277864e5476b12c0ec687ed09f0b2922471Hal Finkel .Case("603e", "603e") 104002a84277864e5476b12c0ec687ed09f0b2922471Hal Finkel .Case("603ev", "603ev") 104102a84277864e5476b12c0ec687ed09f0b2922471Hal Finkel .Case("604", "604") 104202a84277864e5476b12c0ec687ed09f0b2922471Hal Finkel .Case("604e", "604e") 104302a84277864e5476b12c0ec687ed09f0b2922471Hal Finkel .Case("620", "620") 10442821e180094459cbdef37e7d7c12bb406d5b82baBill Schmidt .Case("630", "pwr3") 104502a84277864e5476b12c0ec687ed09f0b2922471Hal Finkel .Case("G3", "g3") 104602a84277864e5476b12c0ec687ed09f0b2922471Hal Finkel .Case("7400", "7400") 104702a84277864e5476b12c0ec687ed09f0b2922471Hal Finkel .Case("G4", "g4") 104802a84277864e5476b12c0ec687ed09f0b2922471Hal Finkel .Case("7450", "7450") 104902a84277864e5476b12c0ec687ed09f0b2922471Hal Finkel .Case("G4+", "g4+") 105002a84277864e5476b12c0ec687ed09f0b2922471Hal Finkel .Case("750", "750") 105102a84277864e5476b12c0ec687ed09f0b2922471Hal Finkel .Case("970", "970") 105202a84277864e5476b12c0ec687ed09f0b2922471Hal Finkel .Case("G5", "g5") 105302a84277864e5476b12c0ec687ed09f0b2922471Hal Finkel .Case("a2", "a2") 10545ccd3d0214b9d765a1bb41872da27d3c5530ab2bHal Finkel .Case("a2q", "a2q") 10557de32964026e4c5ff32cbca484ffb24e73393d87Hal Finkel .Case("e500mc", "e500mc") 10567de32964026e4c5ff32cbca484ffb24e73393d87Hal Finkel .Case("e5500", "e5500") 10572821e180094459cbdef37e7d7c12bb406d5b82baBill Schmidt .Case("power3", "pwr3") 10582821e180094459cbdef37e7d7c12bb406d5b82baBill Schmidt .Case("power4", "pwr4") 10592821e180094459cbdef37e7d7c12bb406d5b82baBill Schmidt .Case("power5", "pwr5") 10602821e180094459cbdef37e7d7c12bb406d5b82baBill Schmidt .Case("power5x", "pwr5x") 106102a84277864e5476b12c0ec687ed09f0b2922471Hal Finkel .Case("power6", "pwr6") 10622821e180094459cbdef37e7d7c12bb406d5b82baBill Schmidt .Case("power6x", "pwr6x") 106302a84277864e5476b12c0ec687ed09f0b2922471Hal Finkel .Case("power7", "pwr7") 10642821e180094459cbdef37e7d7c12bb406d5b82baBill Schmidt .Case("pwr3", "pwr3") 10652821e180094459cbdef37e7d7c12bb406d5b82baBill Schmidt .Case("pwr4", "pwr4") 10662821e180094459cbdef37e7d7c12bb406d5b82baBill Schmidt .Case("pwr5", "pwr5") 10672821e180094459cbdef37e7d7c12bb406d5b82baBill Schmidt .Case("pwr5x", "pwr5x") 10682821e180094459cbdef37e7d7c12bb406d5b82baBill Schmidt .Case("pwr6", "pwr6") 10692821e180094459cbdef37e7d7c12bb406d5b82baBill Schmidt .Case("pwr6x", "pwr6x") 10702821e180094459cbdef37e7d7c12bb406d5b82baBill Schmidt .Case("pwr7", "pwr7") 107102a84277864e5476b12c0ec687ed09f0b2922471Hal Finkel .Case("powerpc", "ppc") 107202a84277864e5476b12c0ec687ed09f0b2922471Hal Finkel .Case("powerpc64", "ppc64") 107302a84277864e5476b12c0ec687ed09f0b2922471Hal Finkel .Default(""); 107402a84277864e5476b12c0ec687ed09f0b2922471Hal Finkel } 107502a84277864e5476b12c0ec687ed09f0b2922471Hal Finkel 107602a84277864e5476b12c0ec687ed09f0b2922471Hal Finkel return ""; 107702a84277864e5476b12c0ec687ed09f0b2922471Hal Finkel} 107802a84277864e5476b12c0ec687ed09f0b2922471Hal Finkel 107902a84277864e5476b12c0ec687ed09f0b2922471Hal Finkelvoid Clang::AddPPCTargetArgs(const ArgList &Args, 108002a84277864e5476b12c0ec687ed09f0b2922471Hal Finkel ArgStringList &CmdArgs) const { 108102a84277864e5476b12c0ec687ed09f0b2922471Hal Finkel std::string TargetCPUName = getPPCTargetCPU(Args); 108202a84277864e5476b12c0ec687ed09f0b2922471Hal Finkel 108302a84277864e5476b12c0ec687ed09f0b2922471Hal Finkel // LLVM may default to generating code for the native CPU, 108402a84277864e5476b12c0ec687ed09f0b2922471Hal Finkel // but, like gcc, we default to a more generic option for 108502a84277864e5476b12c0ec687ed09f0b2922471Hal Finkel // each architecture. (except on Darwin) 108602a84277864e5476b12c0ec687ed09f0b2922471Hal Finkel llvm::Triple Triple = getToolChain().getTriple(); 108702a84277864e5476b12c0ec687ed09f0b2922471Hal Finkel if (TargetCPUName.empty() && !Triple.isOSDarwin()) { 108802a84277864e5476b12c0ec687ed09f0b2922471Hal Finkel if (Triple.getArch() == llvm::Triple::ppc64) 108902a84277864e5476b12c0ec687ed09f0b2922471Hal Finkel TargetCPUName = "ppc64"; 109002a84277864e5476b12c0ec687ed09f0b2922471Hal Finkel else 109102a84277864e5476b12c0ec687ed09f0b2922471Hal Finkel TargetCPUName = "ppc"; 109202a84277864e5476b12c0ec687ed09f0b2922471Hal Finkel } 109302a84277864e5476b12c0ec687ed09f0b2922471Hal Finkel 109402a84277864e5476b12c0ec687ed09f0b2922471Hal Finkel if (!TargetCPUName.empty()) { 109502a84277864e5476b12c0ec687ed09f0b2922471Hal Finkel CmdArgs.push_back("-target-cpu"); 109602a84277864e5476b12c0ec687ed09f0b2922471Hal Finkel CmdArgs.push_back(Args.MakeArgString(TargetCPUName.c_str())); 109702a84277864e5476b12c0ec687ed09f0b2922471Hal Finkel } 1098199402b9e081dedc28e19ab6e727470b34f2f64dBill Schmidt 1099199402b9e081dedc28e19ab6e727470b34f2f64dBill Schmidt // Allow override of the Altivec feature. 1100199402b9e081dedc28e19ab6e727470b34f2f64dBill Schmidt if (Args.hasFlag(options::OPT_fno_altivec, options::OPT_faltivec, false)) { 1101199402b9e081dedc28e19ab6e727470b34f2f64dBill Schmidt CmdArgs.push_back("-target-feature"); 1102199402b9e081dedc28e19ab6e727470b34f2f64dBill Schmidt CmdArgs.push_back("-altivec"); 1103199402b9e081dedc28e19ab6e727470b34f2f64dBill Schmidt } 11043c6aaeb26202b41173dd9ea982833fe975147d80Hal Finkel 11053c6aaeb26202b41173dd9ea982833fe975147d80Hal Finkel if (Args.hasFlag(options::OPT_mno_qpx, options::OPT_mqpx, false)) { 11063c6aaeb26202b41173dd9ea982833fe975147d80Hal Finkel CmdArgs.push_back("-target-feature"); 11073c6aaeb26202b41173dd9ea982833fe975147d80Hal Finkel CmdArgs.push_back("-qpx"); 11083c6aaeb26202b41173dd9ea982833fe975147d80Hal Finkel } 110902a84277864e5476b12c0ec687ed09f0b2922471Hal Finkel} 111002a84277864e5476b12c0ec687ed09f0b2922471Hal Finkel 11119284d215022457ba867080a713f08f026d89ea17Bruno Cardoso Lopesvoid Clang::AddSparcTargetArgs(const ArgList &Args, 11129284d215022457ba867080a713f08f026d89ea17Bruno Cardoso Lopes ArgStringList &CmdArgs) const { 11139284d215022457ba867080a713f08f026d89ea17Bruno Cardoso Lopes const Driver &D = getToolChain().getDriver(); 11149284d215022457ba867080a713f08f026d89ea17Bruno Cardoso Lopes 11159284d215022457ba867080a713f08f026d89ea17Bruno Cardoso Lopes if (const Arg *A = Args.getLastArg(options::OPT_march_EQ)) { 11169284d215022457ba867080a713f08f026d89ea17Bruno Cardoso Lopes CmdArgs.push_back("-target-cpu"); 11171d489cf4a04ad0ad8ac2696e4eed0995f3a67288Richard Smith CmdArgs.push_back(A->getValue()); 11189284d215022457ba867080a713f08f026d89ea17Bruno Cardoso Lopes } 11199284d215022457ba867080a713f08f026d89ea17Bruno Cardoso Lopes 11209284d215022457ba867080a713f08f026d89ea17Bruno Cardoso Lopes // Select the float ABI as determined by -msoft-float, -mhard-float, and 11215f9e272e632e951b1efe824cd16acb4d96077930Chris Lattner StringRef FloatABI; 11229284d215022457ba867080a713f08f026d89ea17Bruno Cardoso Lopes if (Arg *A = Args.getLastArg(options::OPT_msoft_float, 11239284d215022457ba867080a713f08f026d89ea17Bruno Cardoso Lopes options::OPT_mhard_float)) { 11249284d215022457ba867080a713f08f026d89ea17Bruno Cardoso Lopes if (A->getOption().matches(options::OPT_msoft_float)) 11259284d215022457ba867080a713f08f026d89ea17Bruno Cardoso Lopes FloatABI = "soft"; 11269284d215022457ba867080a713f08f026d89ea17Bruno Cardoso Lopes else if (A->getOption().matches(options::OPT_mhard_float)) 11279284d215022457ba867080a713f08f026d89ea17Bruno Cardoso Lopes FloatABI = "hard"; 11289284d215022457ba867080a713f08f026d89ea17Bruno Cardoso Lopes } 11299284d215022457ba867080a713f08f026d89ea17Bruno Cardoso Lopes 11309284d215022457ba867080a713f08f026d89ea17Bruno Cardoso Lopes // If unspecified, choose the default based on the platform. 11319284d215022457ba867080a713f08f026d89ea17Bruno Cardoso Lopes if (FloatABI.empty()) { 11329284d215022457ba867080a713f08f026d89ea17Bruno Cardoso Lopes switch (getToolChain().getTriple().getOS()) { 11339284d215022457ba867080a713f08f026d89ea17Bruno Cardoso Lopes default: 11349284d215022457ba867080a713f08f026d89ea17Bruno Cardoso Lopes // Assume "soft", but warn the user we are guessing. 11359284d215022457ba867080a713f08f026d89ea17Bruno Cardoso Lopes FloatABI = "soft"; 11365f9e272e632e951b1efe824cd16acb4d96077930Chris Lattner D.Diag(diag::warn_drv_assuming_mfloat_abi_is) << "soft"; 11379284d215022457ba867080a713f08f026d89ea17Bruno Cardoso Lopes break; 11389284d215022457ba867080a713f08f026d89ea17Bruno Cardoso Lopes } 11399284d215022457ba867080a713f08f026d89ea17Bruno Cardoso Lopes } 11409284d215022457ba867080a713f08f026d89ea17Bruno Cardoso Lopes 11419284d215022457ba867080a713f08f026d89ea17Bruno Cardoso Lopes if (FloatABI == "soft") { 11429284d215022457ba867080a713f08f026d89ea17Bruno Cardoso Lopes // Floating point operations and argument passing are soft. 11439284d215022457ba867080a713f08f026d89ea17Bruno Cardoso Lopes // 11449284d215022457ba867080a713f08f026d89ea17Bruno Cardoso Lopes // FIXME: This changes CPP defines, we need -target-soft-float. 11459284d215022457ba867080a713f08f026d89ea17Bruno Cardoso Lopes CmdArgs.push_back("-msoft-float"); 11469284d215022457ba867080a713f08f026d89ea17Bruno Cardoso Lopes CmdArgs.push_back("-target-feature"); 11479284d215022457ba867080a713f08f026d89ea17Bruno Cardoso Lopes CmdArgs.push_back("+soft-float"); 11489284d215022457ba867080a713f08f026d89ea17Bruno Cardoso Lopes } else { 11499284d215022457ba867080a713f08f026d89ea17Bruno Cardoso Lopes assert(FloatABI == "hard" && "Invalid float abi!"); 11509284d215022457ba867080a713f08f026d89ea17Bruno Cardoso Lopes CmdArgs.push_back("-mhard-float"); 11519284d215022457ba867080a713f08f026d89ea17Bruno Cardoso Lopes } 11529284d215022457ba867080a713f08f026d89ea17Bruno Cardoso Lopes} 11539284d215022457ba867080a713f08f026d89ea17Bruno Cardoso Lopes 1154700d4e44793697288dd827c272ad363945f590a9Chandler Carruthstatic const char *getX86TargetCPU(const ArgList &Args, 1155700d4e44793697288dd827c272ad363945f590a9Chandler Carruth const llvm::Triple &Triple) { 1156700d4e44793697288dd827c272ad363945f590a9Chandler Carruth if (const Arg *A = Args.getLastArg(options::OPT_march_EQ)) { 1157700d4e44793697288dd827c272ad363945f590a9Chandler Carruth if (StringRef(A->getValue()) != "native") 1158700d4e44793697288dd827c272ad363945f590a9Chandler Carruth return A->getValue(); 1159700d4e44793697288dd827c272ad363945f590a9Chandler Carruth 1160700d4e44793697288dd827c272ad363945f590a9Chandler Carruth // FIXME: Reject attempts to use -march=native unless the target matches 1161700d4e44793697288dd827c272ad363945f590a9Chandler Carruth // the host. 1162700d4e44793697288dd827c272ad363945f590a9Chandler Carruth // 1163700d4e44793697288dd827c272ad363945f590a9Chandler Carruth // FIXME: We should also incorporate the detected target features for use 1164700d4e44793697288dd827c272ad363945f590a9Chandler Carruth // with -native. 1165700d4e44793697288dd827c272ad363945f590a9Chandler Carruth std::string CPU = llvm::sys::getHostCPUName(); 1166700d4e44793697288dd827c272ad363945f590a9Chandler Carruth if (!CPU.empty() && CPU != "generic") 1167700d4e44793697288dd827c272ad363945f590a9Chandler Carruth return Args.MakeArgString(CPU); 1168700d4e44793697288dd827c272ad363945f590a9Chandler Carruth } 1169700d4e44793697288dd827c272ad363945f590a9Chandler Carruth 1170700d4e44793697288dd827c272ad363945f590a9Chandler Carruth // Select the default CPU if none was given (or detection failed). 1171700d4e44793697288dd827c272ad363945f590a9Chandler Carruth 1172700d4e44793697288dd827c272ad363945f590a9Chandler Carruth if (Triple.getArch() != llvm::Triple::x86_64 && 1173700d4e44793697288dd827c272ad363945f590a9Chandler Carruth Triple.getArch() != llvm::Triple::x86) 1174700d4e44793697288dd827c272ad363945f590a9Chandler Carruth return 0; // This routine is only handling x86 targets. 1175700d4e44793697288dd827c272ad363945f590a9Chandler Carruth 1176700d4e44793697288dd827c272ad363945f590a9Chandler Carruth bool Is64Bit = Triple.getArch() == llvm::Triple::x86_64; 1177700d4e44793697288dd827c272ad363945f590a9Chandler Carruth 1178700d4e44793697288dd827c272ad363945f590a9Chandler Carruth // FIXME: Need target hooks. 1179700d4e44793697288dd827c272ad363945f590a9Chandler Carruth if (Triple.isOSDarwin()) 1180700d4e44793697288dd827c272ad363945f590a9Chandler Carruth return Is64Bit ? "core2" : "yonah"; 1181700d4e44793697288dd827c272ad363945f590a9Chandler Carruth 1182700d4e44793697288dd827c272ad363945f590a9Chandler Carruth // Everything else goes to x86-64 in 64-bit mode. 1183700d4e44793697288dd827c272ad363945f590a9Chandler Carruth if (Is64Bit) 1184700d4e44793697288dd827c272ad363945f590a9Chandler Carruth return "x86-64"; 1185700d4e44793697288dd827c272ad363945f590a9Chandler Carruth 1186700d4e44793697288dd827c272ad363945f590a9Chandler Carruth if (Triple.getOSName().startswith("haiku")) 1187700d4e44793697288dd827c272ad363945f590a9Chandler Carruth return "i586"; 1188700d4e44793697288dd827c272ad363945f590a9Chandler Carruth if (Triple.getOSName().startswith("openbsd")) 1189700d4e44793697288dd827c272ad363945f590a9Chandler Carruth return "i486"; 1190700d4e44793697288dd827c272ad363945f590a9Chandler Carruth if (Triple.getOSName().startswith("bitrig")) 1191700d4e44793697288dd827c272ad363945f590a9Chandler Carruth return "i686"; 1192700d4e44793697288dd827c272ad363945f590a9Chandler Carruth if (Triple.getOSName().startswith("freebsd")) 1193700d4e44793697288dd827c272ad363945f590a9Chandler Carruth return "i486"; 1194700d4e44793697288dd827c272ad363945f590a9Chandler Carruth if (Triple.getOSName().startswith("netbsd")) 1195700d4e44793697288dd827c272ad363945f590a9Chandler Carruth return "i486"; 1196700d4e44793697288dd827c272ad363945f590a9Chandler Carruth // All x86 devices running Android have core2 as their common 1197700d4e44793697288dd827c272ad363945f590a9Chandler Carruth // denominator. This makes a better choice than pentium4. 1198700d4e44793697288dd827c272ad363945f590a9Chandler Carruth if (Triple.getEnvironment() == llvm::Triple::Android) 1199700d4e44793697288dd827c272ad363945f590a9Chandler Carruth return "core2"; 1200700d4e44793697288dd827c272ad363945f590a9Chandler Carruth 1201700d4e44793697288dd827c272ad363945f590a9Chandler Carruth // Fallback to p4. 1202700d4e44793697288dd827c272ad363945f590a9Chandler Carruth return "pentium4"; 1203700d4e44793697288dd827c272ad363945f590a9Chandler Carruth} 1204700d4e44793697288dd827c272ad363945f590a9Chandler Carruth 12056acda16e9c194dcbd0dea64341e182bdb65d0f41Daniel Dunbarvoid Clang::AddX86TargetArgs(const ArgList &Args, 12066acda16e9c194dcbd0dea64341e182bdb65d0f41Daniel Dunbar ArgStringList &CmdArgs) const { 1207e6ad3f9fceef0ecc422ff26754ea069a5fd18c69Daniel Dunbar if (!Args.hasFlag(options::OPT_mred_zone, 1208e6ad3f9fceef0ecc422ff26754ea069a5fd18c69Daniel Dunbar options::OPT_mno_red_zone, 1209e6ad3f9fceef0ecc422ff26754ea069a5fd18c69Daniel Dunbar true) || 1210e6ad3f9fceef0ecc422ff26754ea069a5fd18c69Daniel Dunbar Args.hasArg(options::OPT_mkernel) || 1211e6ad3f9fceef0ecc422ff26754ea069a5fd18c69Daniel Dunbar Args.hasArg(options::OPT_fapple_kext)) 121266861e09d590994a8b941eaa328e4d8f33adec9eDaniel Dunbar CmdArgs.push_back("-disable-red-zone"); 1213e6ad3f9fceef0ecc422ff26754ea069a5fd18c69Daniel Dunbar 1214f0c5456d7d6a9f74281011297d86cb3b1fa53cc1Bob Wilson // Default to avoid implicit floating-point for kernel/kext code, but allow 1215f0c5456d7d6a9f74281011297d86cb3b1fa53cc1Bob Wilson // that to be overridden with -mno-soft-float. 1216f0c5456d7d6a9f74281011297d86cb3b1fa53cc1Bob Wilson bool NoImplicitFloat = (Args.hasArg(options::OPT_mkernel) || 1217f0c5456d7d6a9f74281011297d86cb3b1fa53cc1Bob Wilson Args.hasArg(options::OPT_fapple_kext)); 1218f0c5456d7d6a9f74281011297d86cb3b1fa53cc1Bob Wilson if (Arg *A = Args.getLastArg(options::OPT_msoft_float, 1219f0c5456d7d6a9f74281011297d86cb3b1fa53cc1Bob Wilson options::OPT_mno_soft_float, 1220f0c5456d7d6a9f74281011297d86cb3b1fa53cc1Bob Wilson options::OPT_mno_implicit_float)) { 1221f0c5456d7d6a9f74281011297d86cb3b1fa53cc1Bob Wilson const Option &O = A->getOption(); 1222f0c5456d7d6a9f74281011297d86cb3b1fa53cc1Bob Wilson NoImplicitFloat = (O.matches(options::OPT_mno_implicit_float) || 1223f0c5456d7d6a9f74281011297d86cb3b1fa53cc1Bob Wilson O.matches(options::OPT_msoft_float)); 1224f0c5456d7d6a9f74281011297d86cb3b1fa53cc1Bob Wilson } 1225f0c5456d7d6a9f74281011297d86cb3b1fa53cc1Bob Wilson if (NoImplicitFloat) 122666861e09d590994a8b941eaa328e4d8f33adec9eDaniel Dunbar CmdArgs.push_back("-no-implicit-float"); 1227e6ad3f9fceef0ecc422ff26754ea069a5fd18c69Daniel Dunbar 1228700d4e44793697288dd827c272ad363945f590a9Chandler Carruth if (const char *CPUName = getX86TargetCPU(Args, getToolChain().getTriple())) { 122938b48afd338d494099697d2611e1f45e558e469eDaniel Dunbar CmdArgs.push_back("-target-cpu"); 1230f86feddbd5b13d2c144132e35d608fa630784dbbDaniel Dunbar CmdArgs.push_back(CPUName); 1231f86feddbd5b13d2c144132e35d608fa630784dbbDaniel Dunbar } 1232f86feddbd5b13d2c144132e35d608fa630784dbbDaniel Dunbar 1233d18eecac712bfbf63372cb78940d662ce9017840Eli Friedman // The required algorithm here is slightly strange: the options are applied 1234d18eecac712bfbf63372cb78940d662ce9017840Eli Friedman // in order (so -mno-sse -msse2 disables SSE3), but any option that gets 1235d18eecac712bfbf63372cb78940d662ce9017840Eli Friedman // directly overridden later is ignored (so "-mno-sse -msse2 -mno-sse2 -msse" 1236d18eecac712bfbf63372cb78940d662ce9017840Eli Friedman // is equivalent to "-mno-sse2 -msse"). The -cc1 handling deals with the 1237d18eecac712bfbf63372cb78940d662ce9017840Eli Friedman // former correctly, but not the latter; handle directly-overridden 1238d18eecac712bfbf63372cb78940d662ce9017840Eli Friedman // attributes here. 1239d18eecac712bfbf63372cb78940d662ce9017840Eli Friedman llvm::StringMap<unsigned> PrevFeature; 1240d18eecac712bfbf63372cb78940d662ce9017840Eli Friedman std::vector<const char*> Features; 1241cdd9686b890ebdc10039ae256ef4c9dfb5ebacb7Daniel Dunbar for (arg_iterator it = Args.filtered_begin(options::OPT_m_x86_Features_Group), 1242cdd9686b890ebdc10039ae256ef4c9dfb5ebacb7Daniel Dunbar ie = Args.filtered_end(); it != ie; ++it) { 12435f9e272e632e951b1efe824cd16acb4d96077930Chris Lattner StringRef Name = (*it)->getOption().getName(); 12447e4953e5c60409007545288f14b430bd23d68570Daniel Dunbar (*it)->claim(); 12456acda16e9c194dcbd0dea64341e182bdb65d0f41Daniel Dunbar 1246cdd9686b890ebdc10039ae256ef4c9dfb5ebacb7Daniel Dunbar // Skip over "-m". 1247c635710bcbb9598acd5a14647ba7ca28bee89a68Michael J. Spencer assert(Name.startswith("m") && "Invalid feature name."); 1248c635710bcbb9598acd5a14647ba7ca28bee89a68Michael J. Spencer Name = Name.substr(1); 12496acda16e9c194dcbd0dea64341e182bdb65d0f41Daniel Dunbar 1250cdd9686b890ebdc10039ae256ef4c9dfb5ebacb7Daniel Dunbar bool IsNegative = Name.startswith("no-"); 1251cdd9686b890ebdc10039ae256ef4c9dfb5ebacb7Daniel Dunbar if (IsNegative) 1252cdd9686b890ebdc10039ae256ef4c9dfb5ebacb7Daniel Dunbar Name = Name.substr(3); 12536acda16e9c194dcbd0dea64341e182bdb65d0f41Daniel Dunbar 1254d18eecac712bfbf63372cb78940d662ce9017840Eli Friedman unsigned& Prev = PrevFeature[Name]; 1255d18eecac712bfbf63372cb78940d662ce9017840Eli Friedman if (Prev) 1256d18eecac712bfbf63372cb78940d662ce9017840Eli Friedman Features[Prev - 1] = 0; 1257d18eecac712bfbf63372cb78940d662ce9017840Eli Friedman Prev = Features.size() + 1; 1258d18eecac712bfbf63372cb78940d662ce9017840Eli Friedman Features.push_back(Args.MakeArgString((IsNegative ? "-" : "+") + Name)); 1259d18eecac712bfbf63372cb78940d662ce9017840Eli Friedman } 1260d18eecac712bfbf63372cb78940d662ce9017840Eli Friedman for (unsigned i = 0; i < Features.size(); i++) { 1261d18eecac712bfbf63372cb78940d662ce9017840Eli Friedman if (Features[i]) { 1262d18eecac712bfbf63372cb78940d662ce9017840Eli Friedman CmdArgs.push_back("-target-feature"); 1263d18eecac712bfbf63372cb78940d662ce9017840Eli Friedman CmdArgs.push_back(Features[i]); 1264d18eecac712bfbf63372cb78940d662ce9017840Eli Friedman } 12656acda16e9c194dcbd0dea64341e182bdb65d0f41Daniel Dunbar } 12666acda16e9c194dcbd0dea64341e182bdb65d0f41Daniel Dunbar} 12676acda16e9c194dcbd0dea64341e182bdb65d0f41Daniel Dunbar 126833c95f1178999ea06837769f90be8d7b8d57bb4dMatthew Curtisstatic inline bool HasPICArg(const ArgList &Args) { 126933c95f1178999ea06837769f90be8d7b8d57bb4dMatthew Curtis return Args.hasArg(options::OPT_fPIC) 127033c95f1178999ea06837769f90be8d7b8d57bb4dMatthew Curtis || Args.hasArg(options::OPT_fpic); 127133c95f1178999ea06837769f90be8d7b8d57bb4dMatthew Curtis} 127233c95f1178999ea06837769f90be8d7b8d57bb4dMatthew Curtis 127333c95f1178999ea06837769f90be8d7b8d57bb4dMatthew Curtisstatic Arg *GetLastSmallDataThresholdArg(const ArgList &Args) { 127433c95f1178999ea06837769f90be8d7b8d57bb4dMatthew Curtis return Args.getLastArg(options::OPT_G, 127533c95f1178999ea06837769f90be8d7b8d57bb4dMatthew Curtis options::OPT_G_EQ, 127633c95f1178999ea06837769f90be8d7b8d57bb4dMatthew Curtis options::OPT_msmall_data_threshold_EQ); 127733c95f1178999ea06837769f90be8d7b8d57bb4dMatthew Curtis} 127833c95f1178999ea06837769f90be8d7b8d57bb4dMatthew Curtis 127933c95f1178999ea06837769f90be8d7b8d57bb4dMatthew Curtisstatic std::string GetHexagonSmallDataThresholdValue(const ArgList &Args) { 128033c95f1178999ea06837769f90be8d7b8d57bb4dMatthew Curtis std::string value; 128133c95f1178999ea06837769f90be8d7b8d57bb4dMatthew Curtis if (HasPICArg(Args)) 128233c95f1178999ea06837769f90be8d7b8d57bb4dMatthew Curtis value = "0"; 128333c95f1178999ea06837769f90be8d7b8d57bb4dMatthew Curtis else if (Arg *A = GetLastSmallDataThresholdArg(Args)) { 128433c95f1178999ea06837769f90be8d7b8d57bb4dMatthew Curtis value = A->getValue(); 128533c95f1178999ea06837769f90be8d7b8d57bb4dMatthew Curtis A->claim(); 128633c95f1178999ea06837769f90be8d7b8d57bb4dMatthew Curtis } 128733c95f1178999ea06837769f90be8d7b8d57bb4dMatthew Curtis return value; 128833c95f1178999ea06837769f90be8d7b8d57bb4dMatthew Curtis} 128933c95f1178999ea06837769f90be8d7b8d57bb4dMatthew Curtis 12909631939f82c0eaa6fb3936a0ce58a41adfbc9011Tony Linthicumvoid Clang::AddHexagonTargetArgs(const ArgList &Args, 12919631939f82c0eaa6fb3936a0ce58a41adfbc9011Tony Linthicum ArgStringList &CmdArgs) const { 12929631939f82c0eaa6fb3936a0ce58a41adfbc9011Tony Linthicum llvm::Triple Triple = getToolChain().getTriple(); 12939631939f82c0eaa6fb3936a0ce58a41adfbc9011Tony Linthicum 12949631939f82c0eaa6fb3936a0ce58a41adfbc9011Tony Linthicum CmdArgs.push_back("-target-cpu"); 12956781415fa6d98aed548e84a70f1cd3ec31bba7d3Matthew Curtis CmdArgs.push_back(Args.MakeArgString( 12966781415fa6d98aed548e84a70f1cd3ec31bba7d3Matthew Curtis "hexagon" 12976781415fa6d98aed548e84a70f1cd3ec31bba7d3Matthew Curtis + toolchains::Hexagon_TC::GetTargetCPU(Args))); 12989631939f82c0eaa6fb3936a0ce58a41adfbc9011Tony Linthicum CmdArgs.push_back("-fno-signed-char"); 12991dbaef5fe123c588ed6c995dd0a0b79c285433aeMatthew Curtis CmdArgs.push_back("-mqdsp6-compat"); 13001dbaef5fe123c588ed6c995dd0a0b79c285433aeMatthew Curtis CmdArgs.push_back("-Wreturn-type"); 13019631939f82c0eaa6fb3936a0ce58a41adfbc9011Tony Linthicum 130233c95f1178999ea06837769f90be8d7b8d57bb4dMatthew Curtis std::string SmallDataThreshold = GetHexagonSmallDataThresholdValue(Args); 130333c95f1178999ea06837769f90be8d7b8d57bb4dMatthew Curtis if (!SmallDataThreshold.empty()) { 13049631939f82c0eaa6fb3936a0ce58a41adfbc9011Tony Linthicum CmdArgs.push_back ("-mllvm"); 130533c95f1178999ea06837769f90be8d7b8d57bb4dMatthew Curtis CmdArgs.push_back(Args.MakeArgString( 130633c95f1178999ea06837769f90be8d7b8d57bb4dMatthew Curtis "-hexagon-small-data-threshold=" + SmallDataThreshold)); 13079631939f82c0eaa6fb3936a0ce58a41adfbc9011Tony Linthicum } 13089631939f82c0eaa6fb3936a0ce58a41adfbc9011Tony Linthicum 13095f9688b7c7fdeafdf530056d49f82d2ec6ca457fSirish Pande if (!Args.hasArg(options::OPT_fno_short_enums)) 13105f9688b7c7fdeafdf530056d49f82d2ec6ca457fSirish Pande CmdArgs.push_back("-fshort-enums"); 13115f9688b7c7fdeafdf530056d49f82d2ec6ca457fSirish Pande if (Args.getLastArg(options::OPT_mieee_rnd_near)) { 13125f9688b7c7fdeafdf530056d49f82d2ec6ca457fSirish Pande CmdArgs.push_back ("-mllvm"); 13135f9688b7c7fdeafdf530056d49f82d2ec6ca457fSirish Pande CmdArgs.push_back ("-enable-hexagon-ieee-rnd-near"); 13145f9688b7c7fdeafdf530056d49f82d2ec6ca457fSirish Pande } 13159631939f82c0eaa6fb3936a0ce58a41adfbc9011Tony Linthicum CmdArgs.push_back ("-mllvm"); 13169631939f82c0eaa6fb3936a0ce58a41adfbc9011Tony Linthicum CmdArgs.push_back ("-machine-sink-split=0"); 13179631939f82c0eaa6fb3936a0ce58a41adfbc9011Tony Linthicum} 13189631939f82c0eaa6fb3936a0ce58a41adfbc9011Tony Linthicum 131988b7cf00fcb582728c642da3927c59468efaf926Eric Christopherstatic bool 1320260611a32535c851237926bfcf78869b13c07d5bJohn McCallshouldUseExceptionTablesForObjCExceptions(const ObjCRuntime &runtime, 1321525544de0835d5ee7497f4897e255727b162e0aaAnders Carlsson const llvm::Triple &Triple) { 1322525544de0835d5ee7497f4897e255727b162e0aaAnders Carlsson // We use the zero-cost exception tables for Objective-C if the non-fragile 1323525544de0835d5ee7497f4897e255727b162e0aaAnders Carlsson // ABI is enabled or when compiling for x86_64 and ARM on Snow Leopard and 1324525544de0835d5ee7497f4897e255727b162e0aaAnders Carlsson // later. 1325260611a32535c851237926bfcf78869b13c07d5bJohn McCall if (runtime.isNonFragile()) 1326525544de0835d5ee7497f4897e255727b162e0aaAnders Carlsson return true; 1327525544de0835d5ee7497f4897e255727b162e0aaAnders Carlsson 1328905c45f15a25598620d19160c139c6b785aeea89Bob Wilson if (!Triple.isOSDarwin()) 1329525544de0835d5ee7497f4897e255727b162e0aaAnders Carlsson return false; 1330525544de0835d5ee7497f4897e255727b162e0aaAnders Carlsson 1331aa7333c860ac651c75da495217e0d6a9c10c0bb0Eric Christopher return (!Triple.isMacOSXVersionLT(10,5) && 1332525544de0835d5ee7497f4897e255727b162e0aaAnders Carlsson (Triple.getArch() == llvm::Triple::x86_64 || 133388b7cf00fcb582728c642da3927c59468efaf926Eric Christopher Triple.getArch() == llvm::Triple::arm)); 1334525544de0835d5ee7497f4897e255727b162e0aaAnders Carlsson} 1335525544de0835d5ee7497f4897e255727b162e0aaAnders Carlsson 133615348aeb81285c75b2e92b5bf8d2db3445d147c2Anders Carlsson/// addExceptionArgs - Adds exception related arguments to the driver command 133715348aeb81285c75b2e92b5bf8d2db3445d147c2Anders Carlsson/// arguments. There's a master flag, -fexceptions and also language specific 133815348aeb81285c75b2e92b5bf8d2db3445d147c2Anders Carlsson/// flags to enable/disable C++ and Objective-C exceptions. 133915348aeb81285c75b2e92b5bf8d2db3445d147c2Anders Carlsson/// This makes it possible to for example disable C++ exceptions but enable 134015348aeb81285c75b2e92b5bf8d2db3445d147c2Anders Carlsson/// Objective-C exceptions. 134115348aeb81285c75b2e92b5bf8d2db3445d147c2Anders Carlssonstatic void addExceptionArgs(const ArgList &Args, types::ID InputType, 134215348aeb81285c75b2e92b5bf8d2db3445d147c2Anders Carlsson const llvm::Triple &Triple, 134315b77319d0ce4332275992b2f191898a1df50efeFariborz Jahanian bool KernelOrKext, 1344260611a32535c851237926bfcf78869b13c07d5bJohn McCall const ObjCRuntime &objcRuntime, 134515348aeb81285c75b2e92b5bf8d2db3445d147c2Anders Carlsson ArgStringList &CmdArgs) { 1346afc4baa37c2f38fadf05b15456b10a0994d51b0bChad Rosier if (KernelOrKext) { 1347afc4baa37c2f38fadf05b15456b10a0994d51b0bChad Rosier // -mkernel and -fapple-kext imply no exceptions, so claim exception related 1348afc4baa37c2f38fadf05b15456b10a0994d51b0bChad Rosier // arguments now to avoid warnings about unused arguments. 1349afc4baa37c2f38fadf05b15456b10a0994d51b0bChad Rosier Args.ClaimAllArgs(options::OPT_fexceptions); 1350afc4baa37c2f38fadf05b15456b10a0994d51b0bChad Rosier Args.ClaimAllArgs(options::OPT_fno_exceptions); 1351afc4baa37c2f38fadf05b15456b10a0994d51b0bChad Rosier Args.ClaimAllArgs(options::OPT_fobjc_exceptions); 1352afc4baa37c2f38fadf05b15456b10a0994d51b0bChad Rosier Args.ClaimAllArgs(options::OPT_fno_objc_exceptions); 1353afc4baa37c2f38fadf05b15456b10a0994d51b0bChad Rosier Args.ClaimAllArgs(options::OPT_fcxx_exceptions); 1354afc4baa37c2f38fadf05b15456b10a0994d51b0bChad Rosier Args.ClaimAllArgs(options::OPT_fno_cxx_exceptions); 135515348aeb81285c75b2e92b5bf8d2db3445d147c2Anders Carlsson return; 1356afc4baa37c2f38fadf05b15456b10a0994d51b0bChad Rosier } 135715348aeb81285c75b2e92b5bf8d2db3445d147c2Anders Carlsson 135815348aeb81285c75b2e92b5bf8d2db3445d147c2Anders Carlsson // Exceptions are enabled by default. 135915348aeb81285c75b2e92b5bf8d2db3445d147c2Anders Carlsson bool ExceptionsEnabled = true; 136015348aeb81285c75b2e92b5bf8d2db3445d147c2Anders Carlsson 136115348aeb81285c75b2e92b5bf8d2db3445d147c2Anders Carlsson // This keeps track of whether exceptions were explicitly turned on or off. 136215348aeb81285c75b2e92b5bf8d2db3445d147c2Anders Carlsson bool DidHaveExplicitExceptionFlag = false; 136315348aeb81285c75b2e92b5bf8d2db3445d147c2Anders Carlsson 1364f759df06d997050559fd925758bcd2cdef24db05Rafael Espindola if (Arg *A = Args.getLastArg(options::OPT_fexceptions, 1365f759df06d997050559fd925758bcd2cdef24db05Rafael Espindola options::OPT_fno_exceptions)) { 1366f759df06d997050559fd925758bcd2cdef24db05Rafael Espindola if (A->getOption().matches(options::OPT_fexceptions)) 136715348aeb81285c75b2e92b5bf8d2db3445d147c2Anders Carlsson ExceptionsEnabled = true; 136888b7cf00fcb582728c642da3927c59468efaf926Eric Christopher else 136915348aeb81285c75b2e92b5bf8d2db3445d147c2Anders Carlsson ExceptionsEnabled = false; 137015348aeb81285c75b2e92b5bf8d2db3445d147c2Anders Carlsson 137115348aeb81285c75b2e92b5bf8d2db3445d147c2Anders Carlsson DidHaveExplicitExceptionFlag = true; 1372f759df06d997050559fd925758bcd2cdef24db05Rafael Espindola } 13731a2cd4fd5d384faf171a39dea7136ca4672ac35eDaniel Dunbar 137415348aeb81285c75b2e92b5bf8d2db3445d147c2Anders Carlsson bool ShouldUseExceptionTables = false; 137515348aeb81285c75b2e92b5bf8d2db3445d147c2Anders Carlsson 137615348aeb81285c75b2e92b5bf8d2db3445d147c2Anders Carlsson // Exception tables and cleanups can be enabled with -fexceptions even if the 137715348aeb81285c75b2e92b5bf8d2db3445d147c2Anders Carlsson // language itself doesn't support exceptions. 137815348aeb81285c75b2e92b5bf8d2db3445d147c2Anders Carlsson if (ExceptionsEnabled && DidHaveExplicitExceptionFlag) 137915348aeb81285c75b2e92b5bf8d2db3445d147c2Anders Carlsson ShouldUseExceptionTables = true; 138015348aeb81285c75b2e92b5bf8d2db3445d147c2Anders Carlsson 1381d47ea693706f7b0ffa68e879b73a71609a337786Daniel Dunbar // Obj-C exceptions are enabled by default, regardless of -fexceptions. This 1382d47ea693706f7b0ffa68e879b73a71609a337786Daniel Dunbar // is not necessarily sensible, but follows GCC. 1383d47ea693706f7b0ffa68e879b73a71609a337786Daniel Dunbar if (types::isObjC(InputType) && 138488b7cf00fcb582728c642da3927c59468efaf926Eric Christopher Args.hasFlag(options::OPT_fobjc_exceptions, 1385d47ea693706f7b0ffa68e879b73a71609a337786Daniel Dunbar options::OPT_fno_objc_exceptions, 1386d47ea693706f7b0ffa68e879b73a71609a337786Daniel Dunbar true)) { 1387d47ea693706f7b0ffa68e879b73a71609a337786Daniel Dunbar CmdArgs.push_back("-fobjc-exceptions"); 1388d47ea693706f7b0ffa68e879b73a71609a337786Daniel Dunbar 138988b7cf00fcb582728c642da3927c59468efaf926Eric Christopher ShouldUseExceptionTables |= 1390260611a32535c851237926bfcf78869b13c07d5bJohn McCall shouldUseExceptionTablesForObjCExceptions(objcRuntime, Triple); 139115348aeb81285c75b2e92b5bf8d2db3445d147c2Anders Carlsson } 139285caf03ee49c4de87ee9624a9b725ef5d20ee624Fariborz Jahanian 139315348aeb81285c75b2e92b5bf8d2db3445d147c2Anders Carlsson if (types::isCXX(InputType)) { 139415348aeb81285c75b2e92b5bf8d2db3445d147c2Anders Carlsson bool CXXExceptionsEnabled = ExceptionsEnabled; 13951a2cd4fd5d384faf171a39dea7136ca4672ac35eDaniel Dunbar 139688b7cf00fcb582728c642da3927c59468efaf926Eric Christopher if (Arg *A = Args.getLastArg(options::OPT_fcxx_exceptions, 139788b7cf00fcb582728c642da3927c59468efaf926Eric Christopher options::OPT_fno_cxx_exceptions, 139815348aeb81285c75b2e92b5bf8d2db3445d147c2Anders Carlsson options::OPT_fexceptions, 139915348aeb81285c75b2e92b5bf8d2db3445d147c2Anders Carlsson options::OPT_fno_exceptions)) { 140015348aeb81285c75b2e92b5bf8d2db3445d147c2Anders Carlsson if (A->getOption().matches(options::OPT_fcxx_exceptions)) 140115348aeb81285c75b2e92b5bf8d2db3445d147c2Anders Carlsson CXXExceptionsEnabled = true; 140243f220f6d74e01f2606e429810484177903a28e6Chandler Carruth else if (A->getOption().matches(options::OPT_fno_cxx_exceptions)) 140315348aeb81285c75b2e92b5bf8d2db3445d147c2Anders Carlsson CXXExceptionsEnabled = false; 140415348aeb81285c75b2e92b5bf8d2db3445d147c2Anders Carlsson } 140515348aeb81285c75b2e92b5bf8d2db3445d147c2Anders Carlsson 140615348aeb81285c75b2e92b5bf8d2db3445d147c2Anders Carlsson if (CXXExceptionsEnabled) { 140715348aeb81285c75b2e92b5bf8d2db3445d147c2Anders Carlsson CmdArgs.push_back("-fcxx-exceptions"); 140815348aeb81285c75b2e92b5bf8d2db3445d147c2Anders Carlsson 140915348aeb81285c75b2e92b5bf8d2db3445d147c2Anders Carlsson ShouldUseExceptionTables = true; 141015348aeb81285c75b2e92b5bf8d2db3445d147c2Anders Carlsson } 141115348aeb81285c75b2e92b5bf8d2db3445d147c2Anders Carlsson } 141215348aeb81285c75b2e92b5bf8d2db3445d147c2Anders Carlsson 141315348aeb81285c75b2e92b5bf8d2db3445d147c2Anders Carlsson if (ShouldUseExceptionTables) 141415348aeb81285c75b2e92b5bf8d2db3445d147c2Anders Carlsson CmdArgs.push_back("-fexceptions"); 1415f759df06d997050559fd925758bcd2cdef24db05Rafael Espindola} 1416f759df06d997050559fd925758bcd2cdef24db05Rafael Espindola 141761b1efe2d0b459a98962fd9b4c097ad8bb9bfdecRafael Espindolastatic bool ShouldDisableCFI(const ArgList &Args, 141861b1efe2d0b459a98962fd9b4c097ad8bb9bfdecRafael Espindola const ToolChain &TC) { 1419701ec8d11039fd0c571312253e6b15f22f29c592Rafael Espindola bool Default = true; 1420905c45f15a25598620d19160c139c6b785aeea89Bob Wilson if (TC.getTriple().isOSDarwin()) { 142197f6abb4470a82be4a8c6f1603e7bb303f9079b5Rafael Espindola // The native darwin assembler doesn't support cfi directives, so 1422cb773921b1e8e7cf2a5dba25bd596d4f258a9daaRafael Espindola // we disable them if we think the .s file will be passed to it. 1423af370e6e051e505016637e23418354db625dc796Rafael Espindola Default = TC.useIntegratedAs(); 142497f6abb4470a82be4a8c6f1603e7bb303f9079b5Rafael Espindola } 1425701ec8d11039fd0c571312253e6b15f22f29c592Rafael Espindola return !Args.hasFlag(options::OPT_fdwarf2_cfi_asm, 142627e2b983beb8b5a29869639637327725623069a8Eric Christopher options::OPT_fno_dwarf2_cfi_asm, 142727e2b983beb8b5a29869639637327725623069a8Eric Christopher Default); 142861b1efe2d0b459a98962fd9b4c097ad8bb9bfdecRafael Espindola} 142961b1efe2d0b459a98962fd9b4c097ad8bb9bfdecRafael Espindola 1430c06fcdfacc33ad4f8920bbdf43a0e45bc5e8ac4bTed Kremenekstatic bool ShouldDisableDwarfDirectory(const ArgList &Args, 1431c06fcdfacc33ad4f8920bbdf43a0e45bc5e8ac4bTed Kremenek const ToolChain &TC) { 1432ea523d73a6de06f828952a02f5ff86e4cc631695Nick Lewycky bool UseDwarfDirectory = Args.hasFlag(options::OPT_fdwarf_directory_asm, 1433ea523d73a6de06f828952a02f5ff86e4cc631695Nick Lewycky options::OPT_fno_dwarf_directory_asm, 1434af370e6e051e505016637e23418354db625dc796Rafael Espindola TC.useIntegratedAs()); 1435ea523d73a6de06f828952a02f5ff86e4cc631695Nick Lewycky return !UseDwarfDirectory; 1436ea523d73a6de06f828952a02f5ff86e4cc631695Nick Lewycky} 1437ea523d73a6de06f828952a02f5ff86e4cc631695Nick Lewycky 1438359cf927cf4980099a04b3f3cf040b81d181fe3dJoerg Sonnenberger/// \brief Check whether the given input tree contains any compilation actions. 1439359cf927cf4980099a04b3f3cf040b81d181fe3dJoerg Sonnenbergerstatic bool ContainsCompileAction(const Action *A) { 14405f9e272e632e951b1efe824cd16acb4d96077930Chris Lattner if (isa<CompileJobAction>(A)) 1441359cf927cf4980099a04b3f3cf040b81d181fe3dJoerg Sonnenberger return true; 1442359cf927cf4980099a04b3f3cf040b81d181fe3dJoerg Sonnenberger 1443359cf927cf4980099a04b3f3cf040b81d181fe3dJoerg Sonnenberger for (Action::const_iterator it = A->begin(), ie = A->end(); it != ie; ++it) 1444359cf927cf4980099a04b3f3cf040b81d181fe3dJoerg Sonnenberger if (ContainsCompileAction(*it)) 1445359cf927cf4980099a04b3f3cf040b81d181fe3dJoerg Sonnenberger return true; 1446359cf927cf4980099a04b3f3cf040b81d181fe3dJoerg Sonnenberger 1447359cf927cf4980099a04b3f3cf040b81d181fe3dJoerg Sonnenberger return false; 1448359cf927cf4980099a04b3f3cf040b81d181fe3dJoerg Sonnenberger} 1449359cf927cf4980099a04b3f3cf040b81d181fe3dJoerg Sonnenberger 1450359cf927cf4980099a04b3f3cf040b81d181fe3dJoerg Sonnenberger/// \brief Check if -relax-all should be passed to the internal assembler. 1451359cf927cf4980099a04b3f3cf040b81d181fe3dJoerg Sonnenberger/// This is done by default when compiling non-assembler source with -O0. 1452359cf927cf4980099a04b3f3cf040b81d181fe3dJoerg Sonnenbergerstatic bool UseRelaxAll(Compilation &C, const ArgList &Args) { 1453359cf927cf4980099a04b3f3cf040b81d181fe3dJoerg Sonnenberger bool RelaxDefault = true; 1454359cf927cf4980099a04b3f3cf040b81d181fe3dJoerg Sonnenberger 1455359cf927cf4980099a04b3f3cf040b81d181fe3dJoerg Sonnenberger if (Arg *A = Args.getLastArg(options::OPT_O_Group)) 1456359cf927cf4980099a04b3f3cf040b81d181fe3dJoerg Sonnenberger RelaxDefault = A->getOption().matches(options::OPT_O0); 1457359cf927cf4980099a04b3f3cf040b81d181fe3dJoerg Sonnenberger 1458359cf927cf4980099a04b3f3cf040b81d181fe3dJoerg Sonnenberger if (RelaxDefault) { 1459359cf927cf4980099a04b3f3cf040b81d181fe3dJoerg Sonnenberger RelaxDefault = false; 1460359cf927cf4980099a04b3f3cf040b81d181fe3dJoerg Sonnenberger for (ActionList::const_iterator it = C.getActions().begin(), 1461359cf927cf4980099a04b3f3cf040b81d181fe3dJoerg Sonnenberger ie = C.getActions().end(); it != ie; ++it) { 1462359cf927cf4980099a04b3f3cf040b81d181fe3dJoerg Sonnenberger if (ContainsCompileAction(*it)) { 1463359cf927cf4980099a04b3f3cf040b81d181fe3dJoerg Sonnenberger RelaxDefault = true; 1464359cf927cf4980099a04b3f3cf040b81d181fe3dJoerg Sonnenberger break; 1465359cf927cf4980099a04b3f3cf040b81d181fe3dJoerg Sonnenberger } 1466359cf927cf4980099a04b3f3cf040b81d181fe3dJoerg Sonnenberger } 1467359cf927cf4980099a04b3f3cf040b81d181fe3dJoerg Sonnenberger } 1468359cf927cf4980099a04b3f3cf040b81d181fe3dJoerg Sonnenberger 1469359cf927cf4980099a04b3f3cf040b81d181fe3dJoerg Sonnenberger return Args.hasFlag(options::OPT_mrelax_all, options::OPT_mno_relax_all, 1470359cf927cf4980099a04b3f3cf040b81d181fe3dJoerg Sonnenberger RelaxDefault); 1471359cf927cf4980099a04b3f3cf040b81d181fe3dJoerg Sonnenberger} 1472359cf927cf4980099a04b3f3cf040b81d181fe3dJoerg Sonnenberger 1473a40548c36d91189506cb61fc66ab915fb91906e3Alexey SamsonovSanitizerArgs::SanitizerArgs(const Driver &D, const ArgList &Args) 14744bdc60434c79126b75aee2bb391275f3bb746364Alexey Samsonov : Kind(0), BlacklistFile(""), MsanTrackOrigins(false), 14754bdc60434c79126b75aee2bb391275f3bb746364Alexey Samsonov AsanZeroBaseShadow(false) { 14763e335c118140c40b264a26b13e44af368514cb87Alexey Samsonov unsigned AllKinds = 0; // All kinds of sanitizers that were turned on 14773e335c118140c40b264a26b13e44af368514cb87Alexey Samsonov // at least once (possibly, disabled further). 14787ac415b489dd3b22b0335af60d874143c9fdf63aAlexey Samsonov unsigned AllRemovedKinds = 0; // All kinds of sanitizers that were explicitly 14797ac415b489dd3b22b0335af60d874143c9fdf63aAlexey Samsonov // removed at least once. 1480c4dabadb51475e76b606024f144e7cf93b0bad00Richard Smith for (ArgList::const_iterator I = Args.begin(), E = Args.end(); I != E; ++I) { 14813325b1617fce0c8c399b3010f8a65420e623d6f7Alexey Samsonov unsigned Add, Remove; 14823325b1617fce0c8c399b3010f8a65420e623d6f7Alexey Samsonov if (!parse(D, Args, *I, Add, Remove, true)) 1483c4dabadb51475e76b606024f144e7cf93b0bad00Richard Smith continue; 1484c4dabadb51475e76b606024f144e7cf93b0bad00Richard Smith (*I)->claim(); 1485bb1071c0568db9bd7934e869a53d671632eb9291Alexey Samsonov Kind |= Add; 1486bb1071c0568db9bd7934e869a53d671632eb9291Alexey Samsonov Kind &= ~Remove; 14873e335c118140c40b264a26b13e44af368514cb87Alexey Samsonov AllKinds |= Add; 14887ac415b489dd3b22b0335af60d874143c9fdf63aAlexey Samsonov AllRemovedKinds |= Remove; 14897ac415b489dd3b22b0335af60d874143c9fdf63aAlexey Samsonov } 14907ac415b489dd3b22b0335af60d874143c9fdf63aAlexey Samsonov // Assume -fsanitize=address implies -fsanitize=init-order, if the latter is 14917ac415b489dd3b22b0335af60d874143c9fdf63aAlexey Samsonov // not disabled explicitly. 14927ac415b489dd3b22b0335af60d874143c9fdf63aAlexey Samsonov if ((Kind & Address) != 0 && (AllRemovedKinds & InitOrder) == 0) { 14937ac415b489dd3b22b0335af60d874143c9fdf63aAlexey Samsonov Kind |= InitOrder; 1494c4dabadb51475e76b606024f144e7cf93b0bad00Richard Smith } 1495c4dabadb51475e76b606024f144e7cf93b0bad00Richard Smith 149678d85b1c5830a881c0a20a1b3fea99ee73149590Chad Rosier UbsanTrapOnError = 149778d85b1c5830a881c0a20a1b3fea99ee73149590Chad Rosier Args.hasArg(options::OPT_fcatch_undefined_behavior) || 149878d85b1c5830a881c0a20a1b3fea99ee73149590Chad Rosier Args.hasFlag(options::OPT_fsanitize_undefined_trap_on_error, 149978d85b1c5830a881c0a20a1b3fea99ee73149590Chad Rosier options::OPT_fno_sanitize_undefined_trap_on_error, false); 150078d85b1c5830a881c0a20a1b3fea99ee73149590Chad Rosier 150178d85b1c5830a881c0a20a1b3fea99ee73149590Chad Rosier if (Args.hasArg(options::OPT_fcatch_undefined_behavior) && 150278d85b1c5830a881c0a20a1b3fea99ee73149590Chad Rosier !Args.hasFlag(options::OPT_fsanitize_undefined_trap_on_error, 150378d85b1c5830a881c0a20a1b3fea99ee73149590Chad Rosier options::OPT_fno_sanitize_undefined_trap_on_error, true)) { 150478d85b1c5830a881c0a20a1b3fea99ee73149590Chad Rosier D.Diag(diag::err_drv_argument_not_allowed_with) 150578d85b1c5830a881c0a20a1b3fea99ee73149590Chad Rosier << "-fcatch-undefined-behavior" 150678d85b1c5830a881c0a20a1b3fea99ee73149590Chad Rosier << "-fno-sanitize-undefined-trap-on-error"; 150778d85b1c5830a881c0a20a1b3fea99ee73149590Chad Rosier } 150878d85b1c5830a881c0a20a1b3fea99ee73149590Chad Rosier 150978d85b1c5830a881c0a20a1b3fea99ee73149590Chad Rosier // Warn about undefined sanitizer options that require runtime support. 151078d85b1c5830a881c0a20a1b3fea99ee73149590Chad Rosier if (UbsanTrapOnError && notAllowedWithTrap()) { 151178d85b1c5830a881c0a20a1b3fea99ee73149590Chad Rosier if (Args.hasArg(options::OPT_fcatch_undefined_behavior)) 151278d85b1c5830a881c0a20a1b3fea99ee73149590Chad Rosier D.Diag(diag::err_drv_argument_not_allowed_with) 151378d85b1c5830a881c0a20a1b3fea99ee73149590Chad Rosier << lastArgumentForKind(D, Args, NotAllowedWithTrap) 151478d85b1c5830a881c0a20a1b3fea99ee73149590Chad Rosier << "-fcatch-undefined-behavior"; 151578d85b1c5830a881c0a20a1b3fea99ee73149590Chad Rosier else if (Args.hasFlag(options::OPT_fsanitize_undefined_trap_on_error, 151678d85b1c5830a881c0a20a1b3fea99ee73149590Chad Rosier options::OPT_fno_sanitize_undefined_trap_on_error, 151778d85b1c5830a881c0a20a1b3fea99ee73149590Chad Rosier false)) 151878d85b1c5830a881c0a20a1b3fea99ee73149590Chad Rosier D.Diag(diag::err_drv_argument_not_allowed_with) 151978d85b1c5830a881c0a20a1b3fea99ee73149590Chad Rosier << lastArgumentForKind(D, Args, NotAllowedWithTrap) 152078d85b1c5830a881c0a20a1b3fea99ee73149590Chad Rosier << "-fsanitize-undefined-trap-on-error"; 152178d85b1c5830a881c0a20a1b3fea99ee73149590Chad Rosier } 152278d85b1c5830a881c0a20a1b3fea99ee73149590Chad Rosier 1523c4dabadb51475e76b606024f144e7cf93b0bad00Richard Smith // Only one runtime library can be used at once. 1524bb1071c0568db9bd7934e869a53d671632eb9291Alexey Samsonov bool NeedsAsan = needsAsanRt(); 1525bb1071c0568db9bd7934e869a53d671632eb9291Alexey Samsonov bool NeedsTsan = needsTsanRt(); 152699469f732efbd6600dfd0a70e0a36116a717dd06Evgeniy Stepanov bool NeedsMsan = needsMsanRt(); 1527056503786410c0e72b1389918719a37e9342817bRichard Smith if (NeedsAsan && NeedsTsan) 1528c4dabadb51475e76b606024f144e7cf93b0bad00Richard Smith D.Diag(diag::err_drv_argument_not_allowed_with) 1529056503786410c0e72b1389918719a37e9342817bRichard Smith << lastArgumentForKind(D, Args, NeedsAsanRt) 1530056503786410c0e72b1389918719a37e9342817bRichard Smith << lastArgumentForKind(D, Args, NeedsTsanRt); 153199469f732efbd6600dfd0a70e0a36116a717dd06Evgeniy Stepanov if (NeedsAsan && NeedsMsan) 153299469f732efbd6600dfd0a70e0a36116a717dd06Evgeniy Stepanov D.Diag(diag::err_drv_argument_not_allowed_with) 153399469f732efbd6600dfd0a70e0a36116a717dd06Evgeniy Stepanov << lastArgumentForKind(D, Args, NeedsAsanRt) 153499469f732efbd6600dfd0a70e0a36116a717dd06Evgeniy Stepanov << lastArgumentForKind(D, Args, NeedsMsanRt); 153599469f732efbd6600dfd0a70e0a36116a717dd06Evgeniy Stepanov if (NeedsTsan && NeedsMsan) 153699469f732efbd6600dfd0a70e0a36116a717dd06Evgeniy Stepanov D.Diag(diag::err_drv_argument_not_allowed_with) 153799469f732efbd6600dfd0a70e0a36116a717dd06Evgeniy Stepanov << lastArgumentForKind(D, Args, NeedsTsanRt) 153899469f732efbd6600dfd0a70e0a36116a717dd06Evgeniy Stepanov << lastArgumentForKind(D, Args, NeedsMsanRt); 15394d1a6e41e1eaeaf5a4672c802519f15c8fb91e91Alexey Samsonov 15404d1a6e41e1eaeaf5a4672c802519f15c8fb91e91Alexey Samsonov // If -fsanitize contains extra features of ASan, it should also 15413e335c118140c40b264a26b13e44af368514cb87Alexey Samsonov // explicitly contain -fsanitize=address (probably, turned off later in the 15423e335c118140c40b264a26b13e44af368514cb87Alexey Samsonov // command line). 15433e335c118140c40b264a26b13e44af368514cb87Alexey Samsonov if ((Kind & AddressFull) != 0 && (AllKinds & Address) == 0) 15443e335c118140c40b264a26b13e44af368514cb87Alexey Samsonov D.Diag(diag::warn_drv_unused_sanitizer) 15453e335c118140c40b264a26b13e44af368514cb87Alexey Samsonov << lastArgumentForKind(D, Args, AddressFull) 15463e335c118140c40b264a26b13e44af368514cb87Alexey Samsonov << "-fsanitize=address"; 154791ecfa6af51836d3ccc90beddab1193b0c060739Alexey Samsonov 154891ecfa6af51836d3ccc90beddab1193b0c060739Alexey Samsonov // Parse -f(no-)sanitize-blacklist options. 154991ecfa6af51836d3ccc90beddab1193b0c060739Alexey Samsonov if (Arg *BLArg = Args.getLastArg(options::OPT_fsanitize_blacklist, 155091ecfa6af51836d3ccc90beddab1193b0c060739Alexey Samsonov options::OPT_fno_sanitize_blacklist)) { 155191ecfa6af51836d3ccc90beddab1193b0c060739Alexey Samsonov if (BLArg->getOption().matches(options::OPT_fsanitize_blacklist)) { 155291ecfa6af51836d3ccc90beddab1193b0c060739Alexey Samsonov std::string BLPath = BLArg->getValue(); 155391ecfa6af51836d3ccc90beddab1193b0c060739Alexey Samsonov bool BLExists = false; 155491ecfa6af51836d3ccc90beddab1193b0c060739Alexey Samsonov if (!llvm::sys::fs::exists(BLPath, BLExists) && BLExists) 155591ecfa6af51836d3ccc90beddab1193b0c060739Alexey Samsonov BlacklistFile = BLPath; 155691ecfa6af51836d3ccc90beddab1193b0c060739Alexey Samsonov else 155791ecfa6af51836d3ccc90beddab1193b0c060739Alexey Samsonov D.Diag(diag::err_drv_no_such_file) << BLPath; 155891ecfa6af51836d3ccc90beddab1193b0c060739Alexey Samsonov } 155924697b0a7297f530822dac42e36feb77738c1885Alexey Samsonov } else { 156024697b0a7297f530822dac42e36feb77738c1885Alexey Samsonov // If no -fsanitize-blacklist option is specified, try to look up for 156124697b0a7297f530822dac42e36feb77738c1885Alexey Samsonov // blacklist in the resource directory. 156224697b0a7297f530822dac42e36feb77738c1885Alexey Samsonov std::string BLPath; 156324697b0a7297f530822dac42e36feb77738c1885Alexey Samsonov bool BLExists = false; 156424697b0a7297f530822dac42e36feb77738c1885Alexey Samsonov if (getDefaultBlacklistForKind(D, Kind, BLPath) && 156524697b0a7297f530822dac42e36feb77738c1885Alexey Samsonov !llvm::sys::fs::exists(BLPath, BLExists) && BLExists) 156624697b0a7297f530822dac42e36feb77738c1885Alexey Samsonov BlacklistFile = BLPath; 156791ecfa6af51836d3ccc90beddab1193b0c060739Alexey Samsonov } 156834ef11be9d09ebf916ab02a521e37be6e9e102d3Evgeniy Stepanov 156934ef11be9d09ebf916ab02a521e37be6e9e102d3Evgeniy Stepanov // Parse -f(no-)sanitize-memory-track-origins options. 15704bdc60434c79126b75aee2bb391275f3bb746364Alexey Samsonov if (NeedsMsan) 157134ef11be9d09ebf916ab02a521e37be6e9e102d3Evgeniy Stepanov MsanTrackOrigins = 157234ef11be9d09ebf916ab02a521e37be6e9e102d3Evgeniy Stepanov Args.hasFlag(options::OPT_fsanitize_memory_track_origins, 157334ef11be9d09ebf916ab02a521e37be6e9e102d3Evgeniy Stepanov options::OPT_fno_sanitize_memory_track_origins, 157434ef11be9d09ebf916ab02a521e37be6e9e102d3Evgeniy Stepanov /* Default */false); 15754bdc60434c79126b75aee2bb391275f3bb746364Alexey Samsonov 15764bdc60434c79126b75aee2bb391275f3bb746364Alexey Samsonov // Parse -f(no-)sanitize-address-zero-base-shadow options. 15774bdc60434c79126b75aee2bb391275f3bb746364Alexey Samsonov if (NeedsAsan) 15784bdc60434c79126b75aee2bb391275f3bb746364Alexey Samsonov AsanZeroBaseShadow = 15794bdc60434c79126b75aee2bb391275f3bb746364Alexey Samsonov Args.hasFlag(options::OPT_fsanitize_address_zero_base_shadow, 15804bdc60434c79126b75aee2bb391275f3bb746364Alexey Samsonov options::OPT_fno_sanitize_address_zero_base_shadow, 15814bdc60434c79126b75aee2bb391275f3bb746364Alexey Samsonov /* Default */false); 1582c4dabadb51475e76b606024f144e7cf93b0bad00Richard Smith} 1583c4dabadb51475e76b606024f144e7cf93b0bad00Richard Smith 15848614304c0d728d43ef16691708281273101b00afAlexey Samsonovstatic void addSanitizerRTLinkFlagsLinux( 15858614304c0d728d43ef16691708281273101b00afAlexey Samsonov const ToolChain &TC, const ArgList &Args, ArgStringList &CmdArgs, 15868614304c0d728d43ef16691708281273101b00afAlexey Samsonov const StringRef Sanitizer, bool BeforeLibStdCXX) { 15878614304c0d728d43ef16691708281273101b00afAlexey Samsonov // Sanitizer runtime is located in the Linux library directory and 15888614304c0d728d43ef16691708281273101b00afAlexey Samsonov // has name "libclang_rt.<Sanitizer>-<ArchName>.a". 15898614304c0d728d43ef16691708281273101b00afAlexey Samsonov SmallString<128> LibSanitizer(TC.getDriver().ResourceDir); 15908614304c0d728d43ef16691708281273101b00afAlexey Samsonov llvm::sys::path::append( 15918614304c0d728d43ef16691708281273101b00afAlexey Samsonov LibSanitizer, "lib", "linux", 15928614304c0d728d43ef16691708281273101b00afAlexey Samsonov (Twine("libclang_rt.") + Sanitizer + "-" + TC.getArchName() + ".a")); 15938614304c0d728d43ef16691708281273101b00afAlexey Samsonov // Sanitizer runtime may need to come before -lstdc++ (or -lc++, libstdc++.a, 15948614304c0d728d43ef16691708281273101b00afAlexey Samsonov // etc.) so that the linker picks custom versions of the global 'operator 15958614304c0d728d43ef16691708281273101b00afAlexey Samsonov // new' and 'operator delete' symbols. We take the extreme (but simple) 15968614304c0d728d43ef16691708281273101b00afAlexey Samsonov // strategy of inserting it at the front of the link command. It also 15978614304c0d728d43ef16691708281273101b00afAlexey Samsonov // needs to be forced to end up in the executable, so wrap it in 15988614304c0d728d43ef16691708281273101b00afAlexey Samsonov // whole-archive. 15998614304c0d728d43ef16691708281273101b00afAlexey Samsonov if (BeforeLibStdCXX) { 16008614304c0d728d43ef16691708281273101b00afAlexey Samsonov SmallVector<const char *, 3> PrefixArgs; 16018614304c0d728d43ef16691708281273101b00afAlexey Samsonov PrefixArgs.push_back("-whole-archive"); 16028614304c0d728d43ef16691708281273101b00afAlexey Samsonov PrefixArgs.push_back(Args.MakeArgString(LibSanitizer)); 16038614304c0d728d43ef16691708281273101b00afAlexey Samsonov PrefixArgs.push_back("-no-whole-archive"); 16048614304c0d728d43ef16691708281273101b00afAlexey Samsonov CmdArgs.insert(CmdArgs.begin(), PrefixArgs.begin(), PrefixArgs.end()); 16058614304c0d728d43ef16691708281273101b00afAlexey Samsonov } else { 16068614304c0d728d43ef16691708281273101b00afAlexey Samsonov CmdArgs.push_back(Args.MakeArgString(LibSanitizer)); 16078614304c0d728d43ef16691708281273101b00afAlexey Samsonov } 16088614304c0d728d43ef16691708281273101b00afAlexey Samsonov CmdArgs.push_back("-lpthread"); 16098614304c0d728d43ef16691708281273101b00afAlexey Samsonov CmdArgs.push_back("-ldl"); 16108614304c0d728d43ef16691708281273101b00afAlexey Samsonov CmdArgs.push_back("-export-dynamic"); 16118614304c0d728d43ef16691708281273101b00afAlexey Samsonov} 16128614304c0d728d43ef16691708281273101b00afAlexey Samsonov 1613dff466c0791465f929a1d8cd551d4c84b360ba32Kostya Serebryany/// If AddressSanitizer is enabled, add appropriate linker flags (Linux). 1614dff466c0791465f929a1d8cd551d4c84b360ba32Kostya Serebryany/// This needs to be called before we add the C run-time (malloc, etc). 1615dff466c0791465f929a1d8cd551d4c84b360ba32Kostya Serebryanystatic void addAsanRTLinux(const ToolChain &TC, const ArgList &Args, 16167b5f1013c5b7f541dc1fae7fc43189377874eabbKostya Serebryany ArgStringList &CmdArgs) { 161794a7142f74bb4a9daa53c22087b19d4568073109Logan Chien if(TC.getTriple().getEnvironment() == llvm::Triple::Android) { 1618a6ddc02921d47d0a1dc9ffe4d31438f250751e05Evgeniy Stepanov if (!Args.hasArg(options::OPT_shared)) { 1619837386287f1527c3a1e7ac2ea330c714519ae33aEvgeniy Stepanov if (!Args.hasArg(options::OPT_pie)) 1620837386287f1527c3a1e7ac2ea330c714519ae33aEvgeniy Stepanov TC.getDriver().Diag(diag::err_drv_asan_android_requires_pie); 1621a6ddc02921d47d0a1dc9ffe4d31438f250751e05Evgeniy Stepanov } 16228cd0d25df91d7172bfd0ed6013f89ad0083ce301Daniel Dunbar 16238ba7541f12b39aeef4cdb104566dd0503321f48fEvgeniy Stepanov SmallString<128> LibAsan(TC.getDriver().ResourceDir); 16248ba7541f12b39aeef4cdb104566dd0503321f48fEvgeniy Stepanov llvm::sys::path::append(LibAsan, "lib", "linux", 16258ba7541f12b39aeef4cdb104566dd0503321f48fEvgeniy Stepanov (Twine("libclang_rt.asan-") + 16268ba7541f12b39aeef4cdb104566dd0503321f48fEvgeniy Stepanov TC.getArchName() + "-android.so")); 162745b27380a24dcd6a39faa888b5d31192801c43f4Matt Beaumont-Gay CmdArgs.insert(CmdArgs.begin(), Args.MakeArgString(LibAsan)); 1628a6ddc02921d47d0a1dc9ffe4d31438f250751e05Evgeniy Stepanov } else { 1629a6ddc02921d47d0a1dc9ffe4d31438f250751e05Evgeniy Stepanov if (!Args.hasArg(options::OPT_shared)) { 16304bdc60434c79126b75aee2bb391275f3bb746364Alexey Samsonov bool ZeroBaseShadow = Args.hasFlag( 16314bdc60434c79126b75aee2bb391275f3bb746364Alexey Samsonov options::OPT_fsanitize_address_zero_base_shadow, 16324bdc60434c79126b75aee2bb391275f3bb746364Alexey Samsonov options::OPT_fno_sanitize_address_zero_base_shadow, false); 16334bdc60434c79126b75aee2bb391275f3bb746364Alexey Samsonov if (ZeroBaseShadow && !Args.hasArg(options::OPT_pie)) { 16344bdc60434c79126b75aee2bb391275f3bb746364Alexey Samsonov TC.getDriver().Diag(diag::err_drv_argument_only_allowed_with) << 16354bdc60434c79126b75aee2bb391275f3bb746364Alexey Samsonov "-fsanitize-address-zero-base-shadow" << "-pie"; 16364bdc60434c79126b75aee2bb391275f3bb746364Alexey Samsonov } 16378614304c0d728d43ef16691708281273101b00afAlexey Samsonov addSanitizerRTLinkFlagsLinux(TC, Args, CmdArgs, "asan", true); 1638a6ddc02921d47d0a1dc9ffe4d31438f250751e05Evgeniy Stepanov } 1639a6ddc02921d47d0a1dc9ffe4d31438f250751e05Evgeniy Stepanov } 1640dff466c0791465f929a1d8cd551d4c84b360ba32Kostya Serebryany} 1641dff466c0791465f929a1d8cd551d4c84b360ba32Kostya Serebryany 1642f7efb0e7478da45bc7f2d24dbeb08406d2399591Kostya Serebryany/// If ThreadSanitizer is enabled, add appropriate linker flags (Linux). 1643f7efb0e7478da45bc7f2d24dbeb08406d2399591Kostya Serebryany/// This needs to be called before we add the C run-time (malloc, etc). 1644f7efb0e7478da45bc7f2d24dbeb08406d2399591Kostya Serebryanystatic void addTsanRTLinux(const ToolChain &TC, const ArgList &Args, 1645f7efb0e7478da45bc7f2d24dbeb08406d2399591Kostya Serebryany ArgStringList &CmdArgs) { 1646f7efb0e7478da45bc7f2d24dbeb08406d2399591Kostya Serebryany if (!Args.hasArg(options::OPT_shared)) { 164709ccf39c13cfca102deea2986f45cb908bc232fdEvgeniy Stepanov if (!Args.hasArg(options::OPT_pie)) 164899469f732efbd6600dfd0a70e0a36116a717dd06Evgeniy Stepanov TC.getDriver().Diag(diag::err_drv_argument_only_allowed_with) << 164999469f732efbd6600dfd0a70e0a36116a717dd06Evgeniy Stepanov "-fsanitize=thread" << "-pie"; 16508614304c0d728d43ef16691708281273101b00afAlexey Samsonov addSanitizerRTLinkFlagsLinux(TC, Args, CmdArgs, "tsan", true); 1651f7efb0e7478da45bc7f2d24dbeb08406d2399591Kostya Serebryany } 1652f7efb0e7478da45bc7f2d24dbeb08406d2399591Kostya Serebryany} 1653f7efb0e7478da45bc7f2d24dbeb08406d2399591Kostya Serebryany 165409ccf39c13cfca102deea2986f45cb908bc232fdEvgeniy Stepanov/// If MemorySanitizer is enabled, add appropriate linker flags (Linux). 165509ccf39c13cfca102deea2986f45cb908bc232fdEvgeniy Stepanov/// This needs to be called before we add the C run-time (malloc, etc). 165609ccf39c13cfca102deea2986f45cb908bc232fdEvgeniy Stepanovstatic void addMsanRTLinux(const ToolChain &TC, const ArgList &Args, 165709ccf39c13cfca102deea2986f45cb908bc232fdEvgeniy Stepanov ArgStringList &CmdArgs) { 165809ccf39c13cfca102deea2986f45cb908bc232fdEvgeniy Stepanov if (!Args.hasArg(options::OPT_shared)) { 165909ccf39c13cfca102deea2986f45cb908bc232fdEvgeniy Stepanov if (!Args.hasArg(options::OPT_pie)) 166099469f732efbd6600dfd0a70e0a36116a717dd06Evgeniy Stepanov TC.getDriver().Diag(diag::err_drv_argument_only_allowed_with) << 166199469f732efbd6600dfd0a70e0a36116a717dd06Evgeniy Stepanov "-fsanitize=memory" << "-pie"; 16628614304c0d728d43ef16691708281273101b00afAlexey Samsonov addSanitizerRTLinkFlagsLinux(TC, Args, CmdArgs, "msan", true); 166309ccf39c13cfca102deea2986f45cb908bc232fdEvgeniy Stepanov } 166409ccf39c13cfca102deea2986f45cb908bc232fdEvgeniy Stepanov} 166509ccf39c13cfca102deea2986f45cb908bc232fdEvgeniy Stepanov 16664def70d3040e73707c738f7c366737a986135edfRichard Smith/// If UndefinedBehaviorSanitizer is enabled, add appropriate linker flags 16674def70d3040e73707c738f7c366737a986135edfRichard Smith/// (Linux). 16684def70d3040e73707c738f7c366737a986135edfRichard Smithstatic void addUbsanRTLinux(const ToolChain &TC, const ArgList &Args, 16694def70d3040e73707c738f7c366737a986135edfRichard Smith ArgStringList &CmdArgs) { 16708614304c0d728d43ef16691708281273101b00afAlexey Samsonov addSanitizerRTLinkFlagsLinux(TC, Args, CmdArgs, "ubsan", false); 16714def70d3040e73707c738f7c366737a986135edfRichard Smith} 16724def70d3040e73707c738f7c366737a986135edfRichard Smith 16736af27ec69560f7e4b0dac4a0b4341cd6062f6852Rafael Espindolastatic bool shouldUseFramePointer(const ArgList &Args, 16746af27ec69560f7e4b0dac4a0b4341cd6062f6852Rafael Espindola const llvm::Triple &Triple) { 16756af27ec69560f7e4b0dac4a0b4341cd6062f6852Rafael Espindola if (Arg *A = Args.getLastArg(options::OPT_fno_omit_frame_pointer, 16766af27ec69560f7e4b0dac4a0b4341cd6062f6852Rafael Espindola options::OPT_fomit_frame_pointer)) 16776af27ec69560f7e4b0dac4a0b4341cd6062f6852Rafael Espindola return A->getOption().matches(options::OPT_fno_omit_frame_pointer); 16786af27ec69560f7e4b0dac4a0b4341cd6062f6852Rafael Espindola 1679a2a178989b2f6623b6a8ccf73dc0ccd98ee5bdf9Rafael Espindola // Don't use a frame pointer on linux x86 and x86_64 if optimizing. 16806af27ec69560f7e4b0dac4a0b4341cd6062f6852Rafael Espindola if ((Triple.getArch() == llvm::Triple::x86_64 || 16816af27ec69560f7e4b0dac4a0b4341cd6062f6852Rafael Espindola Triple.getArch() == llvm::Triple::x86) && 16826af27ec69560f7e4b0dac4a0b4341cd6062f6852Rafael Espindola Triple.getOS() == llvm::Triple::Linux) { 16836af27ec69560f7e4b0dac4a0b4341cd6062f6852Rafael Espindola if (Arg *A = Args.getLastArg(options::OPT_O_Group)) 16846af27ec69560f7e4b0dac4a0b4341cd6062f6852Rafael Espindola if (!A->getOption().matches(options::OPT_O0)) 16856af27ec69560f7e4b0dac4a0b4341cd6062f6852Rafael Espindola return false; 16866af27ec69560f7e4b0dac4a0b4341cd6062f6852Rafael Espindola } 16876af27ec69560f7e4b0dac4a0b4341cd6062f6852Rafael Espindola 16886af27ec69560f7e4b0dac4a0b4341cd6062f6852Rafael Espindola return true; 16896af27ec69560f7e4b0dac4a0b4341cd6062f6852Rafael Espindola} 16906af27ec69560f7e4b0dac4a0b4341cd6062f6852Rafael Espindola 1691d566df67bed6381f6e859bbd21fd43ff89277cc0Chandler Carruth/// If the PWD environment variable is set, add a CC1 option to specify the 1692d566df67bed6381f6e859bbd21fd43ff89277cc0Chandler Carruth/// debug compilation directory. 1693d566df67bed6381f6e859bbd21fd43ff89277cc0Chandler Carruthstatic void addDebugCompDirArg(const ArgList &Args, ArgStringList &CmdArgs) { 1694d566df67bed6381f6e859bbd21fd43ff89277cc0Chandler Carruth if (const char *pwd = ::getenv("PWD")) { 1695d566df67bed6381f6e859bbd21fd43ff89277cc0Chandler Carruth // GCC also verifies that stat(pwd) and stat(".") have the same inode 1696d566df67bed6381f6e859bbd21fd43ff89277cc0Chandler Carruth // number. Not doing those because stats are slow, but we could. 1697d566df67bed6381f6e859bbd21fd43ff89277cc0Chandler Carruth if (llvm::sys::path::is_absolute(pwd)) { 1698d566df67bed6381f6e859bbd21fd43ff89277cc0Chandler Carruth std::string CompDir = pwd; 1699d566df67bed6381f6e859bbd21fd43ff89277cc0Chandler Carruth CmdArgs.push_back("-fdebug-compilation-dir"); 1700d566df67bed6381f6e859bbd21fd43ff89277cc0Chandler Carruth CmdArgs.push_back(Args.MakeArgString(CompDir)); 1701d566df67bed6381f6e859bbd21fd43ff89277cc0Chandler Carruth } 1702d566df67bed6381f6e859bbd21fd43ff89277cc0Chandler Carruth } 1703d566df67bed6381f6e859bbd21fd43ff89277cc0Chandler Carruth} 1704d566df67bed6381f6e859bbd21fd43ff89277cc0Chandler Carruth 170580190399f5a062db72127869978699af65951b73Eric Christopherstatic const char *SplitDebugName(const ArgList &Args, 170680190399f5a062db72127869978699af65951b73Eric Christopher const InputInfoList &Inputs) { 170780190399f5a062db72127869978699af65951b73Eric Christopher Arg *FinalOutput = Args.getLastArg(options::OPT_o); 170880190399f5a062db72127869978699af65951b73Eric Christopher if (FinalOutput && Args.hasArg(options::OPT_c)) { 170980190399f5a062db72127869978699af65951b73Eric Christopher SmallString<128> T(FinalOutput->getValue()); 171080190399f5a062db72127869978699af65951b73Eric Christopher llvm::sys::path::replace_extension(T, "dwo"); 171180190399f5a062db72127869978699af65951b73Eric Christopher return Args.MakeArgString(T); 171280190399f5a062db72127869978699af65951b73Eric Christopher } else { 171380190399f5a062db72127869978699af65951b73Eric Christopher // Use the compilation dir. 171480190399f5a062db72127869978699af65951b73Eric Christopher SmallString<128> T(Args.getLastArgValue(options::OPT_fdebug_compilation_dir)); 171580190399f5a062db72127869978699af65951b73Eric Christopher SmallString<128> F(llvm::sys::path::stem(Inputs[0].getBaseInput())); 171680190399f5a062db72127869978699af65951b73Eric Christopher llvm::sys::path::replace_extension(F, "dwo"); 171780190399f5a062db72127869978699af65951b73Eric Christopher T += F; 171880190399f5a062db72127869978699af65951b73Eric Christopher return Args.MakeArgString(F); 171980190399f5a062db72127869978699af65951b73Eric Christopher } 172080190399f5a062db72127869978699af65951b73Eric Christopher} 172180190399f5a062db72127869978699af65951b73Eric Christopher 172280190399f5a062db72127869978699af65951b73Eric Christopherstatic void SplitDebugInfo(const ToolChain &TC, Compilation &C, 172380190399f5a062db72127869978699af65951b73Eric Christopher const Tool &T, const JobAction &JA, 172480190399f5a062db72127869978699af65951b73Eric Christopher const ArgList &Args, const InputInfo &Output, 172580190399f5a062db72127869978699af65951b73Eric Christopher const char *OutFile) { 172659320e770f90a59c74f2be10f198e3c390195628Eric Christopher ArgStringList ExtractArgs; 172759320e770f90a59c74f2be10f198e3c390195628Eric Christopher ExtractArgs.push_back("--extract-dwo"); 172859320e770f90a59c74f2be10f198e3c390195628Eric Christopher 172959320e770f90a59c74f2be10f198e3c390195628Eric Christopher ArgStringList StripArgs; 173059320e770f90a59c74f2be10f198e3c390195628Eric Christopher StripArgs.push_back("--strip-dwo"); 173159320e770f90a59c74f2be10f198e3c390195628Eric Christopher 173259320e770f90a59c74f2be10f198e3c390195628Eric Christopher // Grabbing the output of the earlier compile step. 173359320e770f90a59c74f2be10f198e3c390195628Eric Christopher StripArgs.push_back(Output.getFilename()); 173459320e770f90a59c74f2be10f198e3c390195628Eric Christopher ExtractArgs.push_back(Output.getFilename()); 173559320e770f90a59c74f2be10f198e3c390195628Eric Christopher ExtractArgs.push_back(OutFile); 173659320e770f90a59c74f2be10f198e3c390195628Eric Christopher 173759320e770f90a59c74f2be10f198e3c390195628Eric Christopher const char *Exec = 173880190399f5a062db72127869978699af65951b73Eric Christopher Args.MakeArgString(TC.GetProgramPath("objcopy")); 173959320e770f90a59c74f2be10f198e3c390195628Eric Christopher 174059320e770f90a59c74f2be10f198e3c390195628Eric Christopher // First extract the dwo sections. 174180190399f5a062db72127869978699af65951b73Eric Christopher C.addCommand(new Command(JA, T, Exec, ExtractArgs)); 174259320e770f90a59c74f2be10f198e3c390195628Eric Christopher 174359320e770f90a59c74f2be10f198e3c390195628Eric Christopher // Then remove them from the original .o file. 174480190399f5a062db72127869978699af65951b73Eric Christopher C.addCommand(new Command(JA, T, Exec, StripArgs)); 174559320e770f90a59c74f2be10f198e3c390195628Eric Christopher} 174659320e770f90a59c74f2be10f198e3c390195628Eric Christopher 174747ac7d27c44bd64a7d0fc03d4babc196cf2b8230Daniel Dunbarvoid Clang::ConstructJob(Compilation &C, const JobAction &JA, 1748871adcf4e41285e3f4c3b62eaa1b2e05b60b92daDaniel Dunbar const InputInfo &Output, 174962cf601812e03dd9bc5df42b8ef06a0cdedc38bfDaniel Dunbar const InputInfoList &Inputs, 17501d46033f760ba5fd266ce59fe391fac473f04f52Daniel Dunbar const ArgList &Args, 175147ac7d27c44bd64a7d0fc03d4babc196cf2b8230Daniel Dunbar const char *LinkingOutput) const { 17520a80ba74ffa3d3df55abfbc4474d7470c7c923e3Daniel Dunbar bool KernelOrKext = Args.hasArg(options::OPT_mkernel, 17530a80ba74ffa3d3df55abfbc4474d7470c7c923e3Daniel Dunbar options::OPT_fapple_kext); 1754ee788e70fcd0adf76103b17c78ac658d4ea30c9bDaniel Dunbar const Driver &D = getToolChain().getDriver(); 1755b488c1dac8e53206f07103d794a62a3f5012c0f4Daniel Dunbar ArgStringList CmdArgs; 1756b488c1dac8e53206f07103d794a62a3f5012c0f4Daniel Dunbar 1757077ba6a3ac3628afb0d3c460e81ce013bccbdbedDaniel Dunbar assert(Inputs.size() == 1 && "Unable to handle multiple inputs."); 1758077ba6a3ac3628afb0d3c460e81ce013bccbdbedDaniel Dunbar 17598ff5b28d6efcffe2251e77634c7edf83a4763344Daniel Dunbar // Invoke ourselves in -cc1 mode. 17608ff5b28d6efcffe2251e77634c7edf83a4763344Daniel Dunbar // 17618ff5b28d6efcffe2251e77634c7edf83a4763344Daniel Dunbar // FIXME: Implement custom jobs for internal actions. 17628ff5b28d6efcffe2251e77634c7edf83a4763344Daniel Dunbar CmdArgs.push_back("-cc1"); 17638ff5b28d6efcffe2251e77634c7edf83a4763344Daniel Dunbar 1764dd4fe00f03d8749b283948ea86aa1e4a53ed21abDaniel Dunbar // Add the "effective" target triple. 1765af07f936b698575f2c91f1c1134c116f1ef0deddDaniel Dunbar CmdArgs.push_back("-triple"); 176600577ada44c889fbe311d61c51a8da89e65c7c9aDaniel Dunbar std::string TripleStr = getToolChain().ComputeEffectiveClangTriple(Args); 1767dd4fe00f03d8749b283948ea86aa1e4a53ed21abDaniel Dunbar CmdArgs.push_back(Args.MakeArgString(TripleStr)); 1768728a512753d85a6ccaae34e81385c8665c2de0e1Daniel Dunbar 1769dd4fe00f03d8749b283948ea86aa1e4a53ed21abDaniel Dunbar // Select the appropriate action. 1770260611a32535c851237926bfcf78869b13c07d5bJohn McCall RewriteKind rewriteKind = RK_None; 1771e982cc0ea3e9255b8aacf8f0bff559e9b1cfd72eFariborz Jahanian 17721d46033f760ba5fd266ce59fe391fac473f04f52Daniel Dunbar if (isa<AnalyzeJobAction>(JA)) { 17731d46033f760ba5fd266ce59fe391fac473f04f52Daniel Dunbar assert(JA.getType() == types::TY_Plist && "Invalid output type."); 17741d46033f760ba5fd266ce59fe391fac473f04f52Daniel Dunbar CmdArgs.push_back("-analyze"); 177530660a898545416f0fea2d717f16f75640001e38Ted Kremenek } else if (isa<MigrateJobAction>(JA)) { 177630660a898545416f0fea2d717f16f75640001e38Ted Kremenek CmdArgs.push_back("-migrate"); 17771d46033f760ba5fd266ce59fe391fac473f04f52Daniel Dunbar } else if (isa<PreprocessJobAction>(JA)) { 1778cd8e4c44dd068956e9181381be3ee2d49a0fac52Daniel Dunbar if (Output.getType() == types::TY_Dependencies) 1779cd8e4c44dd068956e9181381be3ee2d49a0fac52Daniel Dunbar CmdArgs.push_back("-Eonly"); 178051be73daa9df0b9eab157318a9274ebe3e46c627Fariborz Jahanian else { 1781cd8e4c44dd068956e9181381be3ee2d49a0fac52Daniel Dunbar CmdArgs.push_back("-E"); 178251be73daa9df0b9eab157318a9274ebe3e46c627Fariborz Jahanian if (Args.hasArg(options::OPT_rewrite_objc) && 178351be73daa9df0b9eab157318a9274ebe3e46c627Fariborz Jahanian !Args.hasArg(options::OPT_g_Group)) 178451be73daa9df0b9eab157318a9274ebe3e46c627Fariborz Jahanian CmdArgs.push_back("-P"); 178551be73daa9df0b9eab157318a9274ebe3e46c627Fariborz Jahanian } 17868767cbc475ed96397b6f08617814eeb9cab121bdDaniel Dunbar } else if (isa<AssembleJobAction>(JA)) { 17878767cbc475ed96397b6f08617814eeb9cab121bdDaniel Dunbar CmdArgs.push_back("-emit-obj"); 17889929800b8dfced61e9c97dc8d6e71e144ebf8accDaniel Dunbar 1789359cf927cf4980099a04b3f3cf040b81d181fe3dJoerg Sonnenberger if (UseRelaxAll(C, Args)) 17909929800b8dfced61e9c97dc8d6e71e144ebf8accDaniel Dunbar CmdArgs.push_back("-mrelax-all"); 1791ca0e0545c216afaacba6da6c82a270dc2efc4e3fDaniel Dunbar 1792fcec10bded7b9b9268af5232fa17617db0df68edDaniel Dunbar // When using an integrated assembler, translate -Wa, and -Xassembler 1793fcec10bded7b9b9268af5232fa17617db0df68edDaniel Dunbar // options. 1794fcec10bded7b9b9268af5232fa17617db0df68edDaniel Dunbar for (arg_iterator it = Args.filtered_begin(options::OPT_Wa_COMMA, 1795fcec10bded7b9b9268af5232fa17617db0df68edDaniel Dunbar options::OPT_Xassembler), 1796fcec10bded7b9b9268af5232fa17617db0df68edDaniel Dunbar ie = Args.filtered_end(); it != ie; ++it) { 1797fcec10bded7b9b9268af5232fa17617db0df68edDaniel Dunbar const Arg *A = *it; 1798fcec10bded7b9b9268af5232fa17617db0df68edDaniel Dunbar A->claim(); 1799fcec10bded7b9b9268af5232fa17617db0df68edDaniel Dunbar 1800fcec10bded7b9b9268af5232fa17617db0df68edDaniel Dunbar for (unsigned i = 0, e = A->getNumValues(); i != e; ++i) { 18011d489cf4a04ad0ad8ac2696e4eed0995f3a67288Richard Smith StringRef Value = A->getValue(i); 1802fcec10bded7b9b9268af5232fa17617db0df68edDaniel Dunbar 1803fcec10bded7b9b9268af5232fa17617db0df68edDaniel Dunbar if (Value == "-force_cpusubtype_ALL") { 1804fcec10bded7b9b9268af5232fa17617db0df68edDaniel Dunbar // Do nothing, this is the default and we don't support anything else. 1805b14eed0ed44ed3af881219dab7dc6464cad5303bDaniel Dunbar } else if (Value == "-L") { 1806969323239f16589329d091a2b8ef200fcfe7c9e9Daniel Dunbar CmdArgs.push_back("-msave-temp-labels"); 180746a49391efab20d7a2a1c18f22edb3d76b465252Joerg Sonnenberger } else if (Value == "--fatal-warnings") { 1808d793350dee89688f1cc939096dc60c3bc15c20feJoerg Sonnenberger CmdArgs.push_back("-mllvm"); 1809d793350dee89688f1cc939096dc60c3bc15c20feJoerg Sonnenberger CmdArgs.push_back("-fatal-assembler-warnings"); 1810c3b9014c7236a15cf467662264b243a22c420312Nick Lewycky } else if (Value == "--noexecstack") { 1811c3b9014c7236a15cf467662264b243a22c420312Nick Lewycky CmdArgs.push_back("-mnoexecstack"); 1812fcec10bded7b9b9268af5232fa17617db0df68edDaniel Dunbar } else { 18135f9e272e632e951b1efe824cd16acb4d96077930Chris Lattner D.Diag(diag::err_drv_unsupported_option_argument) 1814fcec10bded7b9b9268af5232fa17617db0df68edDaniel Dunbar << A->getOption().getName() << Value; 1815fcec10bded7b9b9268af5232fa17617db0df68edDaniel Dunbar } 1816fcec10bded7b9b9268af5232fa17617db0df68edDaniel Dunbar } 1817fcec10bded7b9b9268af5232fa17617db0df68edDaniel Dunbar } 1818d02bba8e2abceebd91c162ee4479623791f455b5Daniel Dunbar 1819d02bba8e2abceebd91c162ee4479623791f455b5Daniel Dunbar // Also ignore explicit -force_cpusubtype_ALL option. 1820d02bba8e2abceebd91c162ee4479623791f455b5Daniel Dunbar (void) Args.hasArg(options::OPT_force__cpusubtype__ALL); 18211d46033f760ba5fd266ce59fe391fac473f04f52Daniel Dunbar } else if (isa<PrecompileJobAction>(JA)) { 1822e5c35377020d6c38d16434c9f373a5fa9bb4f2ebArgyrios Kyrtzidis // Use PCH if the user requested it. 18230ebd9321ba380471010341f24c874f46f56e7581Daniel Dunbar bool UsePCH = D.CCCUsePCH; 18240ebd9321ba380471010341f24c874f46f56e7581Daniel Dunbar 1825761322b3bdea727de087dcdf355fee689f5b8358Aaron Ballman if (JA.getType() == types::TY_Nothing) 1826761322b3bdea727de087dcdf355fee689f5b8358Aaron Ballman CmdArgs.push_back("-fsyntax-only"); 1827761322b3bdea727de087dcdf355fee689f5b8358Aaron Ballman else if (UsePCH) 1828df91ef3d6c55692a0236f67b6c6b134a3bf84098Douglas Gregor CmdArgs.push_back("-emit-pch"); 1829df91ef3d6c55692a0236f67b6c6b134a3bf84098Douglas Gregor else 1830df91ef3d6c55692a0236f67b6c6b134a3bf84098Douglas Gregor CmdArgs.push_back("-emit-pth"); 18311d46033f760ba5fd266ce59fe391fac473f04f52Daniel Dunbar } else { 18321d46033f760ba5fd266ce59fe391fac473f04f52Daniel Dunbar assert(isa<CompileJobAction>(JA) && "Invalid action for clang tool."); 1833c21c485b4fb58ef5d55cf3e523263dd824a2ace4Daniel Dunbar 18341d46033f760ba5fd266ce59fe391fac473f04f52Daniel Dunbar if (JA.getType() == types::TY_Nothing) { 18351d46033f760ba5fd266ce59fe391fac473f04f52Daniel Dunbar CmdArgs.push_back("-fsyntax-only"); 18366c6424bc0d3b5f080a97b5f6ef4a8d70c38e38f5Daniel Dunbar } else if (JA.getType() == types::TY_LLVM_IR || 18376c6424bc0d3b5f080a97b5f6ef4a8d70c38e38f5Daniel Dunbar JA.getType() == types::TY_LTO_IR) { 18381d46033f760ba5fd266ce59fe391fac473f04f52Daniel Dunbar CmdArgs.push_back("-emit-llvm"); 18396c6424bc0d3b5f080a97b5f6ef4a8d70c38e38f5Daniel Dunbar } else if (JA.getType() == types::TY_LLVM_BC || 18406c6424bc0d3b5f080a97b5f6ef4a8d70c38e38f5Daniel Dunbar JA.getType() == types::TY_LTO_BC) { 18411d46033f760ba5fd266ce59fe391fac473f04f52Daniel Dunbar CmdArgs.push_back("-emit-llvm-bc"); 18421d46033f760ba5fd266ce59fe391fac473f04f52Daniel Dunbar } else if (JA.getType() == types::TY_PP_Asm) { 1843e3b8d07e02861d245612b02b5f5a2c1f34b2a394Daniel Dunbar CmdArgs.push_back("-S"); 18445915fbf310e171c4cd3c2af05e9de360c0fa988aDaniel Dunbar } else if (JA.getType() == types::TY_AST) { 18455915fbf310e171c4cd3c2af05e9de360c0fa988aDaniel Dunbar CmdArgs.push_back("-emit-pch"); 184664952508c2b0c8bffb45c8b410f0af3d2457f59bDaniel Dunbar } else if (JA.getType() == types::TY_RewrittenObjC) { 184764952508c2b0c8bffb45c8b410f0af3d2457f59bDaniel Dunbar CmdArgs.push_back("-rewrite-objc"); 1848260611a32535c851237926bfcf78869b13c07d5bJohn McCall rewriteKind = RK_NonFragile; 1849582b395ea4d5dfe353e2132a470d39efe2f84a54Fariborz Jahanian } else if (JA.getType() == types::TY_RewrittenLegacyObjC) { 1850582b395ea4d5dfe353e2132a470d39efe2f84a54Fariborz Jahanian CmdArgs.push_back("-rewrite-objc"); 1851260611a32535c851237926bfcf78869b13c07d5bJohn McCall rewriteKind = RK_Fragile; 185264952508c2b0c8bffb45c8b410f0af3d2457f59bDaniel Dunbar } else { 185364952508c2b0c8bffb45c8b410f0af3d2457f59bDaniel Dunbar assert(JA.getType() == types::TY_PP_Asm && 185464952508c2b0c8bffb45c8b410f0af3d2457f59bDaniel Dunbar "Unexpected output type!"); 18551d46033f760ba5fd266ce59fe391fac473f04f52Daniel Dunbar } 18561d46033f760ba5fd266ce59fe391fac473f04f52Daniel Dunbar } 18571d46033f760ba5fd266ce59fe391fac473f04f52Daniel Dunbar 18581d46033f760ba5fd266ce59fe391fac473f04f52Daniel Dunbar // The make clang go fast button. 18591d46033f760ba5fd266ce59fe391fac473f04f52Daniel Dunbar CmdArgs.push_back("-disable-free"); 18601d46033f760ba5fd266ce59fe391fac473f04f52Daniel Dunbar 1861b689afb75049012a431d483432114ad5e75d4a92John McCall // Disable the verification pass in -asserts builds. 1862b689afb75049012a431d483432114ad5e75d4a92John McCall#ifdef NDEBUG 1863b689afb75049012a431d483432114ad5e75d4a92John McCall CmdArgs.push_back("-disable-llvm-verifier"); 1864b689afb75049012a431d483432114ad5e75d4a92John McCall#endif 1865b689afb75049012a431d483432114ad5e75d4a92John McCall 1866c9abc043af88f90d177a5bd147f627b78ca49fdeDaniel Dunbar // Set the main file name, so that debug info works even with 1867c9abc043af88f90d177a5bd147f627b78ca49fdeDaniel Dunbar // -save-temps. 1868c9abc043af88f90d177a5bd147f627b78ca49fdeDaniel Dunbar CmdArgs.push_back("-main-file-name"); 186966b8a6671bb5df540dd7200a5286f7ed7a72c1ccBob Wilson CmdArgs.push_back(getBaseInputName(Args, Inputs)); 1870c9abc043af88f90d177a5bd147f627b78ca49fdeDaniel Dunbar 18713bbc75302fd43cf13d868b46c94ff8794b302e43Daniel Dunbar // Some flags which affect the language (via preprocessor 187266b8a6671bb5df540dd7200a5286f7ed7a72c1ccBob Wilson // defines). 18733bbc75302fd43cf13d868b46c94ff8794b302e43Daniel Dunbar if (Args.hasArg(options::OPT_static)) 18743bbc75302fd43cf13d868b46c94ff8794b302e43Daniel Dunbar CmdArgs.push_back("-static-define"); 18753bbc75302fd43cf13d868b46c94ff8794b302e43Daniel Dunbar 18761d46033f760ba5fd266ce59fe391fac473f04f52Daniel Dunbar if (isa<AnalyzeJobAction>(JA)) { 1877b8bb3e797c5687715c6d9d960ee573e4d0e62230Ted Kremenek // Enable region store model by default. 1878b8bb3e797c5687715c6d9d960ee573e4d0e62230Ted Kremenek CmdArgs.push_back("-analyzer-store=region"); 1879b8bb3e797c5687715c6d9d960ee573e4d0e62230Ted Kremenek 1880b40d06dec23b53bbc1157a9adae7f887be31aa3bTed Kremenek // Treat blocks as analysis entry points. 1881b40d06dec23b53bbc1157a9adae7f887be31aa3bTed Kremenek CmdArgs.push_back("-analyzer-opt-analyze-nested-blocks"); 1882b40d06dec23b53bbc1157a9adae7f887be31aa3bTed Kremenek 18835188507b9a1b09ec95c14ffadf0e832f2b47aa8aTed Kremenek CmdArgs.push_back("-analyzer-eagerly-assume"); 18845188507b9a1b09ec95c14ffadf0e832f2b47aa8aTed Kremenek 18851d46033f760ba5fd266ce59fe391fac473f04f52Daniel Dunbar // Add default argument set. 1886d8fc0f2e7751cf31cec5c2f3cc6a0b447e9debb3Daniel Dunbar if (!Args.hasArg(options::OPT__analyzer_no_default_checks)) { 1887027a6abdd6cedc0b8203da72eed6d15c796dce9dArgyrios Kyrtzidis CmdArgs.push_back("-analyzer-checker=core"); 18885188507b9a1b09ec95c14ffadf0e832f2b47aa8aTed Kremenek 1889027a6abdd6cedc0b8203da72eed6d15c796dce9dArgyrios Kyrtzidis if (getToolChain().getTriple().getOS() != llvm::Triple::Win32) 1890027a6abdd6cedc0b8203da72eed6d15c796dce9dArgyrios Kyrtzidis CmdArgs.push_back("-analyzer-checker=unix"); 1891027a6abdd6cedc0b8203da72eed6d15c796dce9dArgyrios Kyrtzidis 18925188507b9a1b09ec95c14ffadf0e832f2b47aa8aTed Kremenek if (getToolChain().getTriple().getVendor() == llvm::Triple::Apple) 18935188507b9a1b09ec95c14ffadf0e832f2b47aa8aTed Kremenek CmdArgs.push_back("-analyzer-checker=osx"); 1894a8180e5a8795b4b80587662167dfc13646a494a1Ted Kremenek 1895a8180e5a8795b4b80587662167dfc13646a494a1Ted Kremenek CmdArgs.push_back("-analyzer-checker=deadcode"); 18968dc0506df167a426df324f47d8367bd824f26e7fTed Kremenek 18978dc0506df167a426df324f47d8367bd824f26e7fTed Kremenek // Enable the following experimental checkers for testing. 18988dc0506df167a426df324f47d8367bd824f26e7fTed Kremenek CmdArgs.push_back("-analyzer-checker=security.insecureAPI.UncheckedReturn"); 18998dc0506df167a426df324f47d8367bd824f26e7fTed Kremenek CmdArgs.push_back("-analyzer-checker=security.insecureAPI.getpw"); 19008dc0506df167a426df324f47d8367bd824f26e7fTed Kremenek CmdArgs.push_back("-analyzer-checker=security.insecureAPI.gets"); 19018dc0506df167a426df324f47d8367bd824f26e7fTed Kremenek CmdArgs.push_back("-analyzer-checker=security.insecureAPI.mktemp"); 19028dc0506df167a426df324f47d8367bd824f26e7fTed Kremenek CmdArgs.push_back("-analyzer-checker=security.insecureAPI.mkstemp"); 19038dc0506df167a426df324f47d8367bd824f26e7fTed Kremenek CmdArgs.push_back("-analyzer-checker=security.insecureAPI.vfork"); 1904d8fc0f2e7751cf31cec5c2f3cc6a0b447e9debb3Daniel Dunbar } 1905d8fc0f2e7751cf31cec5c2f3cc6a0b447e9debb3Daniel Dunbar 1906d8fc0f2e7751cf31cec5c2f3cc6a0b447e9debb3Daniel Dunbar // Set the output format. The default is plist, for (lame) historical 1907d8fc0f2e7751cf31cec5c2f3cc6a0b447e9debb3Daniel Dunbar // reasons. 1908d8fc0f2e7751cf31cec5c2f3cc6a0b447e9debb3Daniel Dunbar CmdArgs.push_back("-analyzer-output"); 1909d8fc0f2e7751cf31cec5c2f3cc6a0b447e9debb3Daniel Dunbar if (Arg *A = Args.getLastArg(options::OPT__analyzer_output)) 19101d489cf4a04ad0ad8ac2696e4eed0995f3a67288Richard Smith CmdArgs.push_back(A->getValue()); 1911d8fc0f2e7751cf31cec5c2f3cc6a0b447e9debb3Daniel Dunbar else 1912d8fc0f2e7751cf31cec5c2f3cc6a0b447e9debb3Daniel Dunbar CmdArgs.push_back("plist"); 19131d46033f760ba5fd266ce59fe391fac473f04f52Daniel Dunbar 19140647a7b9ad844565b8a4b5e1a5de882dd64efabfTed Kremenek // Disable the presentation of standard compiler warnings when 19150647a7b9ad844565b8a4b5e1a5de882dd64efabfTed Kremenek // using --analyze. We only want to show static analyzer diagnostics 19160647a7b9ad844565b8a4b5e1a5de882dd64efabfTed Kremenek // or frontend errors. 19170647a7b9ad844565b8a4b5e1a5de882dd64efabfTed Kremenek CmdArgs.push_back("-w"); 19180647a7b9ad844565b8a4b5e1a5de882dd64efabfTed Kremenek 19191d46033f760ba5fd266ce59fe391fac473f04f52Daniel Dunbar // Add -Xanalyzer arguments when running as analyzer. 19201d46033f760ba5fd266ce59fe391fac473f04f52Daniel Dunbar Args.AddAllArgValues(CmdArgs, options::OPT_Xanalyzer); 19211eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump } 19221eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump 1923e2fd66418eca3d70cf6b62087d745d0c5181db69Daniel Dunbar CheckCodeGenerationOptions(D, Args); 1924e2fd66418eca3d70cf6b62087d745d0c5181db69Daniel Dunbar 19257ce816a77dc79f71950e9e96185e3523ee08994bChandler Carruth // For the PIC and PIE flag options, this logic is different from the legacy 19267ce816a77dc79f71950e9e96185e3523ee08994bChandler Carruth // logic in very old versions of GCC, as that logic was just a bug no one had 19277ce816a77dc79f71950e9e96185e3523ee08994bChandler Carruth // ever fixed. This logic is both more rational and consistent with GCC's new 19287ce816a77dc79f71950e9e96185e3523ee08994bChandler Carruth // logic now that the bugs are fixed. The last argument relating to either 19297ce816a77dc79f71950e9e96185e3523ee08994bChandler Carruth // PIC or PIE wins, and no other argument is used. If the last argument is 19307ce816a77dc79f71950e9e96185e3523ee08994bChandler Carruth // any flavor of the '-fno-...' arguments, both PIC and PIE are disabled. Any 19317ce816a77dc79f71950e9e96185e3523ee08994bChandler Carruth // PIE option implicitly enables PIC at the same level. 19327ce816a77dc79f71950e9e96185e3523ee08994bChandler Carruth bool PIE = false; 19337ce816a77dc79f71950e9e96185e3523ee08994bChandler Carruth bool PIC = getToolChain().isPICDefault(); 19347ce816a77dc79f71950e9e96185e3523ee08994bChandler Carruth bool IsPICLevelTwo = PIC; 19357ce816a77dc79f71950e9e96185e3523ee08994bChandler Carruth if (Arg *A = Args.getLastArg(options::OPT_fPIC, options::OPT_fno_PIC, 19367ce816a77dc79f71950e9e96185e3523ee08994bChandler Carruth options::OPT_fpic, options::OPT_fno_pic, 19377ce816a77dc79f71950e9e96185e3523ee08994bChandler Carruth options::OPT_fPIE, options::OPT_fno_PIE, 19387ce816a77dc79f71950e9e96185e3523ee08994bChandler Carruth options::OPT_fpie, options::OPT_fno_pie)) { 19397ce816a77dc79f71950e9e96185e3523ee08994bChandler Carruth Option O = A->getOption(); 19407ce816a77dc79f71950e9e96185e3523ee08994bChandler Carruth if (O.matches(options::OPT_fPIC) || O.matches(options::OPT_fpic) || 19417ce816a77dc79f71950e9e96185e3523ee08994bChandler Carruth O.matches(options::OPT_fPIE) || O.matches(options::OPT_fpie)) { 19427ce816a77dc79f71950e9e96185e3523ee08994bChandler Carruth PIE = O.matches(options::OPT_fPIE) || O.matches(options::OPT_fpie); 19437ce816a77dc79f71950e9e96185e3523ee08994bChandler Carruth PIC = PIE || O.matches(options::OPT_fPIC) || O.matches(options::OPT_fpic); 19447ce816a77dc79f71950e9e96185e3523ee08994bChandler Carruth IsPICLevelTwo = O.matches(options::OPT_fPIE) || 19457ce816a77dc79f71950e9e96185e3523ee08994bChandler Carruth O.matches(options::OPT_fPIC); 19467ce816a77dc79f71950e9e96185e3523ee08994bChandler Carruth } else { 19477ce816a77dc79f71950e9e96185e3523ee08994bChandler Carruth PIE = PIC = false; 19487ce816a77dc79f71950e9e96185e3523ee08994bChandler Carruth } 19495e219cf7f896873c1c1e64b9e87a7dade99debbaChandler Carruth } 19507ce816a77dc79f71950e9e96185e3523ee08994bChandler Carruth // Check whether the tool chain trumps the PIC-ness decision. If the PIC-ness 19517ce816a77dc79f71950e9e96185e3523ee08994bChandler Carruth // is forced, then neither PIC nor PIE flags will have no effect. 19527ce816a77dc79f71950e9e96185e3523ee08994bChandler Carruth if (getToolChain().isPICDefaultForced()) { 19537ce816a77dc79f71950e9e96185e3523ee08994bChandler Carruth PIE = false; 19547ce816a77dc79f71950e9e96185e3523ee08994bChandler Carruth PIC = getToolChain().isPICDefault(); 19557ce816a77dc79f71950e9e96185e3523ee08994bChandler Carruth IsPICLevelTwo = PIC; 19567ce816a77dc79f71950e9e96185e3523ee08994bChandler Carruth } 19577ce816a77dc79f71950e9e96185e3523ee08994bChandler Carruth 19587ce816a77dc79f71950e9e96185e3523ee08994bChandler Carruth // Inroduce a Darwin-specific hack. If the default is PIC but the flags 19597ce816a77dc79f71950e9e96185e3523ee08994bChandler Carruth // specified while enabling PIC enabled level 1 PIC, just force it back to 19607ce816a77dc79f71950e9e96185e3523ee08994bChandler Carruth // level 2 PIC instead. This matches the behavior of Darwin GCC (based on my 19617ce816a77dc79f71950e9e96185e3523ee08994bChandler Carruth // informal testing). 19627ce816a77dc79f71950e9e96185e3523ee08994bChandler Carruth if (PIC && getToolChain().getTriple().isOSDarwin()) 19637ce816a77dc79f71950e9e96185e3523ee08994bChandler Carruth IsPICLevelTwo |= getToolChain().isPICDefault(); 19647ce816a77dc79f71950e9e96185e3523ee08994bChandler Carruth 19655e219cf7f896873c1c1e64b9e87a7dade99debbaChandler Carruth // Note that these flags are trump-cards. Regardless of the order w.r.t. the 19665e219cf7f896873c1c1e64b9e87a7dade99debbaChandler Carruth // PIC or PIE options above, if these show up, PIC is disabled. 19677a0c064770355a4918df69f95de8dea6338a59a2Daniel Dunbar llvm::Triple Triple(TripleStr); 19686c7db8967c383d859eab6d541db816adbeb837a9Eric Christopher if (KernelOrKext && 19697a0c064770355a4918df69f95de8dea6338a59a2Daniel Dunbar (Triple.getOS() != llvm::Triple::IOS || 19707a0c064770355a4918df69f95de8dea6338a59a2Daniel Dunbar Triple.isOSVersionLT(6))) 19717ce816a77dc79f71950e9e96185e3523ee08994bChandler Carruth PIC = PIE = false; 19725e219cf7f896873c1c1e64b9e87a7dade99debbaChandler Carruth if (Args.hasArg(options::OPT_static)) 19737ce816a77dc79f71950e9e96185e3523ee08994bChandler Carruth PIC = PIE = false; 19747ce816a77dc79f71950e9e96185e3523ee08994bChandler Carruth 19757ce816a77dc79f71950e9e96185e3523ee08994bChandler Carruth if (Arg *A = Args.getLastArg(options::OPT_mdynamic_no_pic)) { 19767ce816a77dc79f71950e9e96185e3523ee08994bChandler Carruth // This is a very special mode. It trumps the other modes, almost no one 19777ce816a77dc79f71950e9e96185e3523ee08994bChandler Carruth // uses it, and it isn't even valid on any OS but Darwin. 19787ce816a77dc79f71950e9e96185e3523ee08994bChandler Carruth if (!getToolChain().getTriple().isOSDarwin()) 19797ce816a77dc79f71950e9e96185e3523ee08994bChandler Carruth D.Diag(diag::err_drv_unsupported_opt_for_target) 19807ce816a77dc79f71950e9e96185e3523ee08994bChandler Carruth << A->getSpelling() << getToolChain().getTriple().str(); 19817ce816a77dc79f71950e9e96185e3523ee08994bChandler Carruth 19827ce816a77dc79f71950e9e96185e3523ee08994bChandler Carruth // FIXME: Warn when this flag trumps some other PIC or PIE flag. 19837ce816a77dc79f71950e9e96185e3523ee08994bChandler Carruth 1984f219e7c1529fac29e34483667f740b452e5ef9ccDaniel Dunbar CmdArgs.push_back("-mrelocation-model"); 19857ce816a77dc79f71950e9e96185e3523ee08994bChandler Carruth CmdArgs.push_back("dynamic-no-pic"); 19867ce816a77dc79f71950e9e96185e3523ee08994bChandler Carruth 19877ce816a77dc79f71950e9e96185e3523ee08994bChandler Carruth // Only a forced PIC mode can cause the actual compile to have PIC defines 19887ce816a77dc79f71950e9e96185e3523ee08994bChandler Carruth // etc., no flags are sufficient. This behavior was selected to closely 19897ce816a77dc79f71950e9e96185e3523ee08994bChandler Carruth // match that of llvm-gcc and Apple GCC before that. 19907ce816a77dc79f71950e9e96185e3523ee08994bChandler Carruth if (getToolChain().isPICDefault() && getToolChain().isPICDefaultForced()) { 19917ce816a77dc79f71950e9e96185e3523ee08994bChandler Carruth CmdArgs.push_back("-pic-level"); 19927ce816a77dc79f71950e9e96185e3523ee08994bChandler Carruth CmdArgs.push_back("2"); 19937ce816a77dc79f71950e9e96185e3523ee08994bChandler Carruth } 19947ce816a77dc79f71950e9e96185e3523ee08994bChandler Carruth } else { 19957ce816a77dc79f71950e9e96185e3523ee08994bChandler Carruth // Currently, LLVM only knows about PIC vs. static; the PIE differences are 19967ce816a77dc79f71950e9e96185e3523ee08994bChandler Carruth // handled in Clang's IRGen by the -pie-level flag. 19977ce816a77dc79f71950e9e96185e3523ee08994bChandler Carruth CmdArgs.push_back("-mrelocation-model"); 19987ce816a77dc79f71950e9e96185e3523ee08994bChandler Carruth CmdArgs.push_back(PIC ? "pic" : "static"); 19997ce816a77dc79f71950e9e96185e3523ee08994bChandler Carruth 20007ce816a77dc79f71950e9e96185e3523ee08994bChandler Carruth if (PIC) { 20017ce816a77dc79f71950e9e96185e3523ee08994bChandler Carruth CmdArgs.push_back("-pic-level"); 20027ce816a77dc79f71950e9e96185e3523ee08994bChandler Carruth CmdArgs.push_back(IsPICLevelTwo ? "2" : "1"); 20037ce816a77dc79f71950e9e96185e3523ee08994bChandler Carruth if (PIE) { 20047ce816a77dc79f71950e9e96185e3523ee08994bChandler Carruth CmdArgs.push_back("-pie-level"); 20057ce816a77dc79f71950e9e96185e3523ee08994bChandler Carruth CmdArgs.push_back(IsPICLevelTwo ? "2" : "1"); 20067ce816a77dc79f71950e9e96185e3523ee08994bChandler Carruth } 20077ce816a77dc79f71950e9e96185e3523ee08994bChandler Carruth } 2008bc85be85779a47bae728bbe6a2cd2e3732b1333dDaniel Dunbar } 20095e219cf7f896873c1c1e64b9e87a7dade99debbaChandler Carruth 2010f219e7c1529fac29e34483667f740b452e5ef9ccDaniel Dunbar if (!Args.hasFlag(options::OPT_fmerge_all_constants, 2011f219e7c1529fac29e34483667f740b452e5ef9ccDaniel Dunbar options::OPT_fno_merge_all_constants)) 2012f44a1a04a36453527de2285c402fbe9453184121Chris Lattner CmdArgs.push_back("-fno-merge-all-constants"); 2013f219e7c1529fac29e34483667f740b452e5ef9ccDaniel Dunbar 2014f219e7c1529fac29e34483667f740b452e5ef9ccDaniel Dunbar // LLVM Code Generator Options. 20151d46033f760ba5fd266ce59fe391fac473f04f52Daniel Dunbar 201617d3fea677753e6e3e82ffe2cbdeccbf5f2e7497Daniel Dunbar if (Arg *A = Args.getLastArg(options::OPT_mregparm_EQ)) { 201717d3fea677753e6e3e82ffe2cbdeccbf5f2e7497Daniel Dunbar CmdArgs.push_back("-mregparm"); 20181d489cf4a04ad0ad8ac2696e4eed0995f3a67288Richard Smith CmdArgs.push_back(A->getValue()); 201917d3fea677753e6e3e82ffe2cbdeccbf5f2e7497Daniel Dunbar } 202017d3fea677753e6e3e82ffe2cbdeccbf5f2e7497Daniel Dunbar 2021cfe9af250f466e7e38becea4428990448ae07737Roman Divacky if (Args.hasFlag(options::OPT_mrtd, options::OPT_mno_rtd, false)) 2022cfe9af250f466e7e38becea4428990448ae07737Roman Divacky CmdArgs.push_back("-mrtd"); 2023cfe9af250f466e7e38becea4428990448ae07737Roman Divacky 20246af27ec69560f7e4b0dac4a0b4341cd6062f6852Rafael Espindola if (shouldUseFramePointer(Args, getToolChain().getTriple())) 2025f219e7c1529fac29e34483667f740b452e5ef9ccDaniel Dunbar CmdArgs.push_back("-mdisable-fp-elim"); 2026bc85be85779a47bae728bbe6a2cd2e3732b1333dDaniel Dunbar if (!Args.hasFlag(options::OPT_fzero_initialized_in_bss, 2027f219e7c1529fac29e34483667f740b452e5ef9ccDaniel Dunbar options::OPT_fno_zero_initialized_in_bss)) 2028f219e7c1529fac29e34483667f740b452e5ef9ccDaniel Dunbar CmdArgs.push_back("-mno-zero-initialized-in-bss"); 2029398c610b16728b4398214367dd0effd9d2e61340Daniel Dunbar if (!Args.hasFlag(options::OPT_fstrict_aliasing, 2030398c610b16728b4398214367dd0effd9d2e61340Daniel Dunbar options::OPT_fno_strict_aliasing, 2031398c610b16728b4398214367dd0effd9d2e61340Daniel Dunbar getToolChain().IsStrictAliasingDefault())) 20324d5625e15bb215c2241c022df8dc7b04438970c6Dan Gohman CmdArgs.push_back("-relaxed-aliasing"); 203382fe6aea407a5a09a6131452ce622087ba83880dChandler Carruth if (Args.hasFlag(options::OPT_fstrict_enums, options::OPT_fno_strict_enums, 203482fe6aea407a5a09a6131452ce622087ba83880dChandler Carruth false)) 203582fe6aea407a5a09a6131452ce622087ba83880dChandler Carruth CmdArgs.push_back("-fstrict-enums"); 20361db772bd68502e0dabbd8efeb7f7c64a4ab2e37aNick Lewycky if (!Args.hasFlag(options::OPT_foptimize_sibling_calls, 20371db772bd68502e0dabbd8efeb7f7c64a4ab2e37aNick Lewycky options::OPT_fno_optimize_sibling_calls)) 20381db772bd68502e0dabbd8efeb7f7c64a4ab2e37aNick Lewycky CmdArgs.push_back("-mdisable-tail-calls"); 20391b71848c5238747ede9650b7907172f8a7e088a5Daniel Dunbar 2040abf07a7fb669dcb74040eef948d61dfe3c59ff17Chandler Carruth // Handle various floating point optimization flags, mapping them to the 2041abf07a7fb669dcb74040eef948d61dfe3c59ff17Chandler Carruth // appropriate LLVM code generation flags. The pattern for all of these is to 2042abf07a7fb669dcb74040eef948d61dfe3c59ff17Chandler Carruth // default off the codegen optimizations, and if any flag enables them and no 2043abf07a7fb669dcb74040eef948d61dfe3c59ff17Chandler Carruth // flag disables them after the flag enabling them, enable the codegen 2044abf07a7fb669dcb74040eef948d61dfe3c59ff17Chandler Carruth // optimization. This is complicated by several "umbrella" flags. 2045abf07a7fb669dcb74040eef948d61dfe3c59ff17Chandler Carruth if (Arg *A = Args.getLastArg(options::OPT_ffast_math, 204680ecf5e66738a7058da58489ca55200212f3d42cChad Rosier options::OPT_fno_fast_math, 2047abf07a7fb669dcb74040eef948d61dfe3c59ff17Chandler Carruth options::OPT_ffinite_math_only, 2048abf07a7fb669dcb74040eef948d61dfe3c59ff17Chandler Carruth options::OPT_fno_finite_math_only, 2049abf07a7fb669dcb74040eef948d61dfe3c59ff17Chandler Carruth options::OPT_fhonor_infinities, 2050abf07a7fb669dcb74040eef948d61dfe3c59ff17Chandler Carruth options::OPT_fno_honor_infinities)) 205180ecf5e66738a7058da58489ca55200212f3d42cChad Rosier if (A->getOption().getID() != options::OPT_fno_fast_math && 205280ecf5e66738a7058da58489ca55200212f3d42cChad Rosier A->getOption().getID() != options::OPT_fno_finite_math_only && 2053abf07a7fb669dcb74040eef948d61dfe3c59ff17Chandler Carruth A->getOption().getID() != options::OPT_fhonor_infinities) 2054abf07a7fb669dcb74040eef948d61dfe3c59ff17Chandler Carruth CmdArgs.push_back("-menable-no-infs"); 2055abf07a7fb669dcb74040eef948d61dfe3c59ff17Chandler Carruth if (Arg *A = Args.getLastArg(options::OPT_ffast_math, 205680ecf5e66738a7058da58489ca55200212f3d42cChad Rosier options::OPT_fno_fast_math, 2057abf07a7fb669dcb74040eef948d61dfe3c59ff17Chandler Carruth options::OPT_ffinite_math_only, 2058abf07a7fb669dcb74040eef948d61dfe3c59ff17Chandler Carruth options::OPT_fno_finite_math_only, 2059abf07a7fb669dcb74040eef948d61dfe3c59ff17Chandler Carruth options::OPT_fhonor_nans, 2060abf07a7fb669dcb74040eef948d61dfe3c59ff17Chandler Carruth options::OPT_fno_honor_nans)) 206180ecf5e66738a7058da58489ca55200212f3d42cChad Rosier if (A->getOption().getID() != options::OPT_fno_fast_math && 206280ecf5e66738a7058da58489ca55200212f3d42cChad Rosier A->getOption().getID() != options::OPT_fno_finite_math_only && 2063abf07a7fb669dcb74040eef948d61dfe3c59ff17Chandler Carruth A->getOption().getID() != options::OPT_fhonor_nans) 2064abf07a7fb669dcb74040eef948d61dfe3c59ff17Chandler Carruth CmdArgs.push_back("-menable-no-nans"); 2065abf07a7fb669dcb74040eef948d61dfe3c59ff17Chandler Carruth 2066769aa2d46fa5dc0bee5285c95a80ad8749cb79cfBenjamin Kramer // -fmath-errno is the default on some platforms, e.g. BSD-derived OSes. 2067769aa2d46fa5dc0bee5285c95a80ad8749cb79cfBenjamin Kramer bool MathErrno = getToolChain().IsMathErrnoDefault(); 2068abf07a7fb669dcb74040eef948d61dfe3c59ff17Chandler Carruth if (Arg *A = Args.getLastArg(options::OPT_ffast_math, 206980ecf5e66738a7058da58489ca55200212f3d42cChad Rosier options::OPT_fno_fast_math, 2070abf07a7fb669dcb74040eef948d61dfe3c59ff17Chandler Carruth options::OPT_fmath_errno, 20714f50c50e783461ea1ec47dd6fe9be10aafcd76adChandler Carruth options::OPT_fno_math_errno)) 20724f50c50e783461ea1ec47dd6fe9be10aafcd76adChandler Carruth MathErrno = A->getOption().getID() == options::OPT_fmath_errno; 20734f50c50e783461ea1ec47dd6fe9be10aafcd76adChandler Carruth if (MathErrno) 20744f50c50e783461ea1ec47dd6fe9be10aafcd76adChandler Carruth CmdArgs.push_back("-fmath-errno"); 2075abf07a7fb669dcb74040eef948d61dfe3c59ff17Chandler Carruth 2076abf07a7fb669dcb74040eef948d61dfe3c59ff17Chandler Carruth // There are several flags which require disabling very specific 2077abf07a7fb669dcb74040eef948d61dfe3c59ff17Chandler Carruth // optimizations. Any of these being disabled forces us to turn off the 2078abf07a7fb669dcb74040eef948d61dfe3c59ff17Chandler Carruth // entire set of LLVM optimizations, so collect them through all the flag 2079abf07a7fb669dcb74040eef948d61dfe3c59ff17Chandler Carruth // madness. 2080abf07a7fb669dcb74040eef948d61dfe3c59ff17Chandler Carruth bool AssociativeMath = false; 2081abf07a7fb669dcb74040eef948d61dfe3c59ff17Chandler Carruth if (Arg *A = Args.getLastArg(options::OPT_ffast_math, 208280ecf5e66738a7058da58489ca55200212f3d42cChad Rosier options::OPT_fno_fast_math, 2083abf07a7fb669dcb74040eef948d61dfe3c59ff17Chandler Carruth options::OPT_funsafe_math_optimizations, 2084abf07a7fb669dcb74040eef948d61dfe3c59ff17Chandler Carruth options::OPT_fno_unsafe_math_optimizations, 2085abf07a7fb669dcb74040eef948d61dfe3c59ff17Chandler Carruth options::OPT_fassociative_math, 2086abf07a7fb669dcb74040eef948d61dfe3c59ff17Chandler Carruth options::OPT_fno_associative_math)) 208780ecf5e66738a7058da58489ca55200212f3d42cChad Rosier if (A->getOption().getID() != options::OPT_fno_fast_math && 208880ecf5e66738a7058da58489ca55200212f3d42cChad Rosier A->getOption().getID() != options::OPT_fno_unsafe_math_optimizations && 2089abf07a7fb669dcb74040eef948d61dfe3c59ff17Chandler Carruth A->getOption().getID() != options::OPT_fno_associative_math) 2090abf07a7fb669dcb74040eef948d61dfe3c59ff17Chandler Carruth AssociativeMath = true; 2091abf07a7fb669dcb74040eef948d61dfe3c59ff17Chandler Carruth bool ReciprocalMath = false; 2092abf07a7fb669dcb74040eef948d61dfe3c59ff17Chandler Carruth if (Arg *A = Args.getLastArg(options::OPT_ffast_math, 209380ecf5e66738a7058da58489ca55200212f3d42cChad Rosier options::OPT_fno_fast_math, 2094abf07a7fb669dcb74040eef948d61dfe3c59ff17Chandler Carruth options::OPT_funsafe_math_optimizations, 2095abf07a7fb669dcb74040eef948d61dfe3c59ff17Chandler Carruth options::OPT_fno_unsafe_math_optimizations, 2096abf07a7fb669dcb74040eef948d61dfe3c59ff17Chandler Carruth options::OPT_freciprocal_math, 2097abf07a7fb669dcb74040eef948d61dfe3c59ff17Chandler Carruth options::OPT_fno_reciprocal_math)) 209880ecf5e66738a7058da58489ca55200212f3d42cChad Rosier if (A->getOption().getID() != options::OPT_fno_fast_math && 209980ecf5e66738a7058da58489ca55200212f3d42cChad Rosier A->getOption().getID() != options::OPT_fno_unsafe_math_optimizations && 2100abf07a7fb669dcb74040eef948d61dfe3c59ff17Chandler Carruth A->getOption().getID() != options::OPT_fno_reciprocal_math) 2101abf07a7fb669dcb74040eef948d61dfe3c59ff17Chandler Carruth ReciprocalMath = true; 2102abf07a7fb669dcb74040eef948d61dfe3c59ff17Chandler Carruth bool SignedZeros = true; 2103abf07a7fb669dcb74040eef948d61dfe3c59ff17Chandler Carruth if (Arg *A = Args.getLastArg(options::OPT_ffast_math, 210480ecf5e66738a7058da58489ca55200212f3d42cChad Rosier options::OPT_fno_fast_math, 2105abf07a7fb669dcb74040eef948d61dfe3c59ff17Chandler Carruth options::OPT_funsafe_math_optimizations, 2106abf07a7fb669dcb74040eef948d61dfe3c59ff17Chandler Carruth options::OPT_fno_unsafe_math_optimizations, 2107abf07a7fb669dcb74040eef948d61dfe3c59ff17Chandler Carruth options::OPT_fsigned_zeros, 2108abf07a7fb669dcb74040eef948d61dfe3c59ff17Chandler Carruth options::OPT_fno_signed_zeros)) 210980ecf5e66738a7058da58489ca55200212f3d42cChad Rosier if (A->getOption().getID() != options::OPT_fno_fast_math && 211080ecf5e66738a7058da58489ca55200212f3d42cChad Rosier A->getOption().getID() != options::OPT_fno_unsafe_math_optimizations && 2111abf07a7fb669dcb74040eef948d61dfe3c59ff17Chandler Carruth A->getOption().getID() != options::OPT_fsigned_zeros) 2112abf07a7fb669dcb74040eef948d61dfe3c59ff17Chandler Carruth SignedZeros = false; 2113abf07a7fb669dcb74040eef948d61dfe3c59ff17Chandler Carruth bool TrappingMath = true; 2114abf07a7fb669dcb74040eef948d61dfe3c59ff17Chandler Carruth if (Arg *A = Args.getLastArg(options::OPT_ffast_math, 211580ecf5e66738a7058da58489ca55200212f3d42cChad Rosier options::OPT_fno_fast_math, 2116abf07a7fb669dcb74040eef948d61dfe3c59ff17Chandler Carruth options::OPT_funsafe_math_optimizations, 2117abf07a7fb669dcb74040eef948d61dfe3c59ff17Chandler Carruth options::OPT_fno_unsafe_math_optimizations, 2118abf07a7fb669dcb74040eef948d61dfe3c59ff17Chandler Carruth options::OPT_ftrapping_math, 2119abf07a7fb669dcb74040eef948d61dfe3c59ff17Chandler Carruth options::OPT_fno_trapping_math)) 212080ecf5e66738a7058da58489ca55200212f3d42cChad Rosier if (A->getOption().getID() != options::OPT_fno_fast_math && 212180ecf5e66738a7058da58489ca55200212f3d42cChad Rosier A->getOption().getID() != options::OPT_fno_unsafe_math_optimizations && 2122abf07a7fb669dcb74040eef948d61dfe3c59ff17Chandler Carruth A->getOption().getID() != options::OPT_ftrapping_math) 2123abf07a7fb669dcb74040eef948d61dfe3c59ff17Chandler Carruth TrappingMath = false; 2124abf07a7fb669dcb74040eef948d61dfe3c59ff17Chandler Carruth if (!MathErrno && AssociativeMath && ReciprocalMath && !SignedZeros && 2125abf07a7fb669dcb74040eef948d61dfe3c59ff17Chandler Carruth !TrappingMath) 2126abf07a7fb669dcb74040eef948d61dfe3c59ff17Chandler Carruth CmdArgs.push_back("-menable-unsafe-fp-math"); 2127abf07a7fb669dcb74040eef948d61dfe3c59ff17Chandler Carruth 2128c9686716d2ceb5518178dca98670ec34c472a1beLang Hames 2129c9686716d2ceb5518178dca98670ec34c472a1beLang Hames // Validate and pass through -fp-contract option. 2130c9686716d2ceb5518178dca98670ec34c472a1beLang Hames if (Arg *A = Args.getLastArg(options::OPT_ffast_math, 213180ecf5e66738a7058da58489ca55200212f3d42cChad Rosier options::OPT_fno_fast_math, 2132c9686716d2ceb5518178dca98670ec34c472a1beLang Hames options::OPT_ffp_contract)) { 2133c9686716d2ceb5518178dca98670ec34c472a1beLang Hames if (A->getOption().getID() == options::OPT_ffp_contract) { 21341d489cf4a04ad0ad8ac2696e4eed0995f3a67288Richard Smith StringRef Val = A->getValue(); 2135c9686716d2ceb5518178dca98670ec34c472a1beLang Hames if (Val == "fast" || Val == "on" || Val == "off") { 2136c9686716d2ceb5518178dca98670ec34c472a1beLang Hames CmdArgs.push_back(Args.MakeArgString("-ffp-contract=" + Val)); 2137c9686716d2ceb5518178dca98670ec34c472a1beLang Hames } else { 2138c9686716d2ceb5518178dca98670ec34c472a1beLang Hames D.Diag(diag::err_drv_unsupported_option_argument) 2139c9686716d2ceb5518178dca98670ec34c472a1beLang Hames << A->getOption().getName() << Val; 2140c9686716d2ceb5518178dca98670ec34c472a1beLang Hames } 214180ecf5e66738a7058da58489ca55200212f3d42cChad Rosier } else if (A->getOption().getID() == options::OPT_ffast_math) { 2142c9686716d2ceb5518178dca98670ec34c472a1beLang Hames // If fast-math is set then set the fp-contract mode to fast. 2143c9686716d2ceb5518178dca98670ec34c472a1beLang Hames CmdArgs.push_back(Args.MakeArgString("-ffp-contract=fast")); 2144c9686716d2ceb5518178dca98670ec34c472a1beLang Hames } 2145c9686716d2ceb5518178dca98670ec34c472a1beLang Hames } 2146c9686716d2ceb5518178dca98670ec34c472a1beLang Hames 2147455e72e7625a8f87c2c302d8d82baee5c111e094Bob Wilson // We separately look for the '-ffast-math' and '-ffinite-math-only' flags, 2148455e72e7625a8f87c2c302d8d82baee5c111e094Bob Wilson // and if we find them, tell the frontend to provide the appropriate 2149455e72e7625a8f87c2c302d8d82baee5c111e094Bob Wilson // preprocessor macros. This is distinct from enabling any optimizations as 2150455e72e7625a8f87c2c302d8d82baee5c111e094Bob Wilson // these options induce language changes which must survive serialization 2151455e72e7625a8f87c2c302d8d82baee5c111e094Bob Wilson // and deserialization, etc. 215280ecf5e66738a7058da58489ca55200212f3d42cChad Rosier if (Arg *A = Args.getLastArg(options::OPT_ffast_math, options::OPT_fno_fast_math)) 215380ecf5e66738a7058da58489ca55200212f3d42cChad Rosier if (A->getOption().matches(options::OPT_ffast_math)) 215480ecf5e66738a7058da58489ca55200212f3d42cChad Rosier CmdArgs.push_back("-ffast-math"); 215580ecf5e66738a7058da58489ca55200212f3d42cChad Rosier if (Arg *A = Args.getLastArg(options::OPT_ffinite_math_only, options::OPT_fno_fast_math)) 215680ecf5e66738a7058da58489ca55200212f3d42cChad Rosier if (A->getOption().matches(options::OPT_ffinite_math_only)) 215780ecf5e66738a7058da58489ca55200212f3d42cChad Rosier CmdArgs.push_back("-ffinite-math-only"); 2158abf07a7fb669dcb74040eef948d61dfe3c59ff17Chandler Carruth 21591b71848c5238747ede9650b7907172f8a7e088a5Daniel Dunbar // Decide whether to use verbose asm. Verbose assembly is the default on 21601b71848c5238747ede9650b7907172f8a7e088a5Daniel Dunbar // toolchains which have the integrated assembler on by default. 21611b71848c5238747ede9650b7907172f8a7e088a5Daniel Dunbar bool IsVerboseAsmDefault = getToolChain().IsIntegratedAssemblerDefault(); 21621b71848c5238747ede9650b7907172f8a7e088a5Daniel Dunbar if (Args.hasFlag(options::OPT_fverbose_asm, options::OPT_fno_verbose_asm, 216320249a1af2e462dcafdd6a350f1c7967b264ff25Michael J. Spencer IsVerboseAsmDefault) || 21641b71848c5238747ede9650b7907172f8a7e088a5Daniel Dunbar Args.hasArg(options::OPT_dA)) 2165f219e7c1529fac29e34483667f740b452e5ef9ccDaniel Dunbar CmdArgs.push_back("-masm-verbose"); 21661b71848c5238747ede9650b7907172f8a7e088a5Daniel Dunbar 2167f219e7c1529fac29e34483667f740b452e5ef9ccDaniel Dunbar if (Args.hasArg(options::OPT_fdebug_pass_structure)) { 2168f219e7c1529fac29e34483667f740b452e5ef9ccDaniel Dunbar CmdArgs.push_back("-mdebug-pass"); 2169f219e7c1529fac29e34483667f740b452e5ef9ccDaniel Dunbar CmdArgs.push_back("Structure"); 2170f219e7c1529fac29e34483667f740b452e5ef9ccDaniel Dunbar } 2171f219e7c1529fac29e34483667f740b452e5ef9ccDaniel Dunbar if (Args.hasArg(options::OPT_fdebug_pass_arguments)) { 2172f219e7c1529fac29e34483667f740b452e5ef9ccDaniel Dunbar CmdArgs.push_back("-mdebug-pass"); 2173f219e7c1529fac29e34483667f740b452e5ef9ccDaniel Dunbar CmdArgs.push_back("Arguments"); 2174f219e7c1529fac29e34483667f740b452e5ef9ccDaniel Dunbar } 21756bea73b3305a03479589e2642fbdcf6c096851aaDaniel Dunbar 2176d0c2ec44e093011256b6a0f57d455f36dffdea70John McCall // Enable -mconstructor-aliases except on darwin, where we have to 2177d0c2ec44e093011256b6a0f57d455f36dffdea70John McCall // work around a linker bug; see <rdar://problem/7651567>. 2178905c45f15a25598620d19160c139c6b785aeea89Bob Wilson if (!getToolChain().getTriple().isOSDarwin()) 2179d0c2ec44e093011256b6a0f57d455f36dffdea70John McCall CmdArgs.push_back("-mconstructor-aliases"); 2180125b4cb35536e45201f8f2cb19ee620e3ad67c49NAKAMURA Takumi 218132096695c76033a6b0b1747c439f7378a11e8312John McCall // Darwin's kernel doesn't support guard variables; just die if we 218232096695c76033a6b0b1747c439f7378a11e8312John McCall // try to use them. 2183905c45f15a25598620d19160c139c6b785aeea89Bob Wilson if (KernelOrKext && getToolChain().getTriple().isOSDarwin()) 218432096695c76033a6b0b1747c439f7378a11e8312John McCall CmdArgs.push_back("-fforbid-guard-variables"); 218532096695c76033a6b0b1747c439f7378a11e8312John McCall 21866f75550e40a9177db9979fc130ce3ece026b137dDouglas Gregor if (Args.hasArg(options::OPT_mms_bitfields)) { 21876f75550e40a9177db9979fc130ce3ece026b137dDouglas Gregor CmdArgs.push_back("-mms-bitfields"); 21886f75550e40a9177db9979fc130ce3ece026b137dDouglas Gregor } 2189d0c2ec44e093011256b6a0f57d455f36dffdea70John McCall 21906bea73b3305a03479589e2642fbdcf6c096851aaDaniel Dunbar // This is a coarse approximation of what llvm-gcc actually does, both 21916bea73b3305a03479589e2642fbdcf6c096851aaDaniel Dunbar // -fasynchronous-unwind-tables and -fnon-call-exceptions interact in more 21926bea73b3305a03479589e2642fbdcf6c096851aaDaniel Dunbar // complicated ways. 21936bea73b3305a03479589e2642fbdcf6c096851aaDaniel Dunbar bool AsynchronousUnwindTables = 21946bea73b3305a03479589e2642fbdcf6c096851aaDaniel Dunbar Args.hasFlag(options::OPT_fasynchronous_unwind_tables, 21956bea73b3305a03479589e2642fbdcf6c096851aaDaniel Dunbar options::OPT_fno_asynchronous_unwind_tables, 21966bea73b3305a03479589e2642fbdcf6c096851aaDaniel Dunbar getToolChain().IsUnwindTablesDefault() && 21970a80ba74ffa3d3df55abfbc4474d7470c7c923e3Daniel Dunbar !KernelOrKext); 21986bea73b3305a03479589e2642fbdcf6c096851aaDaniel Dunbar if (Args.hasFlag(options::OPT_funwind_tables, options::OPT_fno_unwind_tables, 21996bea73b3305a03479589e2642fbdcf6c096851aaDaniel Dunbar AsynchronousUnwindTables)) 2200f219e7c1529fac29e34483667f740b452e5ef9ccDaniel Dunbar CmdArgs.push_back("-munwind-tables"); 2201f219e7c1529fac29e34483667f740b452e5ef9ccDaniel Dunbar 2202a6b2581f9595fb803fe7e2ef1d9f25e75b26d2fbChandler Carruth getToolChain().addClangTargetOptions(Args, CmdArgs); 22038af669f2f1d92436fe6dc43144bb084a620e7516Rafael Espindola 2204f219e7c1529fac29e34483667f740b452e5ef9ccDaniel Dunbar if (Arg *A = Args.getLastArg(options::OPT_flimited_precision_EQ)) { 2205f219e7c1529fac29e34483667f740b452e5ef9ccDaniel Dunbar CmdArgs.push_back("-mlimit-float-precision"); 22061d489cf4a04ad0ad8ac2696e4eed0995f3a67288Richard Smith CmdArgs.push_back(A->getValue()); 2207f219e7c1529fac29e34483667f740b452e5ef9ccDaniel Dunbar } 2208bc85be85779a47bae728bbe6a2cd2e3732b1333dDaniel Dunbar 2209868bd0aa9281929ef50d2e9a8c82a036906f53f5Daniel Dunbar // FIXME: Handle -mtune=. 2210868bd0aa9281929ef50d2e9a8c82a036906f53f5Daniel Dunbar (void) Args.hasArg(options::OPT_mtune_EQ); 2211bc85be85779a47bae728bbe6a2cd2e3732b1333dDaniel Dunbar 22128e9ef0d87dad25f02e5abc6facf528778236115aBenjamin Kramer if (Arg *A = Args.getLastArg(options::OPT_mcmodel_EQ)) { 2213f219e7c1529fac29e34483667f740b452e5ef9ccDaniel Dunbar CmdArgs.push_back("-mcode-model"); 22141d489cf4a04ad0ad8ac2696e4eed0995f3a67288Richard Smith CmdArgs.push_back(A->getValue()); 22158e9ef0d87dad25f02e5abc6facf528778236115aBenjamin Kramer } 22168e9ef0d87dad25f02e5abc6facf528778236115aBenjamin Kramer 22176acda16e9c194dcbd0dea64341e182bdb65d0f41Daniel Dunbar // Add target specific cpu and features flags. 22186acda16e9c194dcbd0dea64341e182bdb65d0f41Daniel Dunbar switch(getToolChain().getTriple().getArch()) { 22196acda16e9c194dcbd0dea64341e182bdb65d0f41Daniel Dunbar default: 22206acda16e9c194dcbd0dea64341e182bdb65d0f41Daniel Dunbar break; 2221868bd0aa9281929ef50d2e9a8c82a036906f53f5Daniel Dunbar 2222b163ef7e7a5d904ef0962a7c38c460be083c4d63Daniel Dunbar case llvm::Triple::arm: 2223b163ef7e7a5d904ef0962a7c38c460be083c4d63Daniel Dunbar case llvm::Triple::thumb: 2224fa41d6975058ceb1b8a24564f6dcec72f89f62e8Daniel Dunbar AddARMTargetArgs(Args, CmdArgs, KernelOrKext); 2225b163ef7e7a5d904ef0962a7c38c460be083c4d63Daniel Dunbar break; 2226b163ef7e7a5d904ef0962a7c38c460be083c4d63Daniel Dunbar 2227ed734737d5af31906e30e537d4a41c760ddcfc59Eric Christopher case llvm::Triple::mips: 2228ed734737d5af31906e30e537d4a41c760ddcfc59Eric Christopher case llvm::Triple::mipsel: 22297ec0258505a11e7e8229d2c96507be6bbc40d7c1Akira Hatanaka case llvm::Triple::mips64: 22307ec0258505a11e7e8229d2c96507be6bbc40d7c1Akira Hatanaka case llvm::Triple::mips64el: 2231ed734737d5af31906e30e537d4a41c760ddcfc59Eric Christopher AddMIPSTargetArgs(Args, CmdArgs); 22329284d215022457ba867080a713f08f026d89ea17Bruno Cardoso Lopes break; 22339284d215022457ba867080a713f08f026d89ea17Bruno Cardoso Lopes 223402a84277864e5476b12c0ec687ed09f0b2922471Hal Finkel case llvm::Triple::ppc: 223502a84277864e5476b12c0ec687ed09f0b2922471Hal Finkel case llvm::Triple::ppc64: 223602a84277864e5476b12c0ec687ed09f0b2922471Hal Finkel AddPPCTargetArgs(Args, CmdArgs); 223702a84277864e5476b12c0ec687ed09f0b2922471Hal Finkel break; 223802a84277864e5476b12c0ec687ed09f0b2922471Hal Finkel 22399284d215022457ba867080a713f08f026d89ea17Bruno Cardoso Lopes case llvm::Triple::sparc: 22409284d215022457ba867080a713f08f026d89ea17Bruno Cardoso Lopes AddSparcTargetArgs(Args, CmdArgs); 2241ed734737d5af31906e30e537d4a41c760ddcfc59Eric Christopher break; 2242ed734737d5af31906e30e537d4a41c760ddcfc59Eric Christopher 22436acda16e9c194dcbd0dea64341e182bdb65d0f41Daniel Dunbar case llvm::Triple::x86: 22446acda16e9c194dcbd0dea64341e182bdb65d0f41Daniel Dunbar case llvm::Triple::x86_64: 22456acda16e9c194dcbd0dea64341e182bdb65d0f41Daniel Dunbar AddX86TargetArgs(Args, CmdArgs); 22466acda16e9c194dcbd0dea64341e182bdb65d0f41Daniel Dunbar break; 22479631939f82c0eaa6fb3936a0ce58a41adfbc9011Tony Linthicum 22489631939f82c0eaa6fb3936a0ce58a41adfbc9011Tony Linthicum case llvm::Triple::hexagon: 22499631939f82c0eaa6fb3936a0ce58a41adfbc9011Tony Linthicum AddHexagonTargetArgs(Args, CmdArgs); 22509631939f82c0eaa6fb3936a0ce58a41adfbc9011Tony Linthicum break; 2251bc85be85779a47bae728bbe6a2cd2e3732b1333dDaniel Dunbar } 2252c21c485b4fb58ef5d55cf3e523263dd824a2ace4Daniel Dunbar 22539631939f82c0eaa6fb3936a0ce58a41adfbc9011Tony Linthicum 22549631939f82c0eaa6fb3936a0ce58a41adfbc9011Tony Linthicum 2255c176bc6be6f1407e7c6bd062f05a8636ea9a08e3Daniel Dunbar // Pass the linker version in use. 2256c176bc6be6f1407e7c6bd062f05a8636ea9a08e3Daniel Dunbar if (Arg *A = Args.getLastArg(options::OPT_mlinker_version_EQ)) { 2257c176bc6be6f1407e7c6bd062f05a8636ea9a08e3Daniel Dunbar CmdArgs.push_back("-target-linker-version"); 22581d489cf4a04ad0ad8ac2696e4eed0995f3a67288Richard Smith CmdArgs.push_back(A->getValue()); 2259c176bc6be6f1407e7c6bd062f05a8636ea9a08e3Daniel Dunbar } 2260c176bc6be6f1407e7c6bd062f05a8636ea9a08e3Daniel Dunbar 2261b2d11cc3abd5ddf421a9bd36c6ec558038748a83Nick Lewycky // -mno-omit-leaf-frame-pointer is the default on Darwin. 22621ad6648cce57bd187f1853f58fef26cd9bf4934fDaniel Dunbar if (Args.hasFlag(options::OPT_momit_leaf_frame_pointer, 2263b2d11cc3abd5ddf421a9bd36c6ec558038748a83Nick Lewycky options::OPT_mno_omit_leaf_frame_pointer, 2264905c45f15a25598620d19160c139c6b785aeea89Bob Wilson !getToolChain().getTriple().isOSDarwin())) 22651ad6648cce57bd187f1853f58fef26cd9bf4934fDaniel Dunbar CmdArgs.push_back("-momit-leaf-frame-pointer"); 22661ad6648cce57bd187f1853f58fef26cd9bf4934fDaniel Dunbar 2267b30575c22f249c0697df0cd2aa872d14d4fa9c57Daniel Dunbar // Explicitly error on some things we know we don't support and can't just 2268b30575c22f249c0697df0cd2aa872d14d4fa9c57Daniel Dunbar // ignore. 2269b30575c22f249c0697df0cd2aa872d14d4fa9c57Daniel Dunbar types::ID InputType = Inputs[0].getType(); 2270e94db4771856659c12e1f269141cbbc4e55b1c47Daniel Dunbar if (!Args.hasArg(options::OPT_fallow_unsupported)) { 2271e94db4771856659c12e1f269141cbbc4e55b1c47Daniel Dunbar Arg *Unsupported; 2272e94db4771856659c12e1f269141cbbc4e55b1c47Daniel Dunbar if (types::isCXX(InputType) && 2273905c45f15a25598620d19160c139c6b785aeea89Bob Wilson getToolChain().getTriple().isOSDarwin() && 2274e94db4771856659c12e1f269141cbbc4e55b1c47Daniel Dunbar getToolChain().getTriple().getArch() == llvm::Triple::x86) { 2275a544aeece3e16296bdbbc9ee32053fac9616f85bBob Wilson if ((Unsupported = Args.getLastArg(options::OPT_fapple_kext)) || 2276a544aeece3e16296bdbbc9ee32053fac9616f85bBob Wilson (Unsupported = Args.getLastArg(options::OPT_mkernel))) 22775f9e272e632e951b1efe824cd16acb4d96077930Chris Lattner D.Diag(diag::err_drv_clang_unsupported_opt_cxx_darwin_i386) 2278e94db4771856659c12e1f269141cbbc4e55b1c47Daniel Dunbar << Unsupported->getOption().getName(); 2279e94db4771856659c12e1f269141cbbc4e55b1c47Daniel Dunbar } 2280b30575c22f249c0697df0cd2aa872d14d4fa9c57Daniel Dunbar } 2281b30575c22f249c0697df0cd2aa872d14d4fa9c57Daniel Dunbar 22821d46033f760ba5fd266ce59fe391fac473f04f52Daniel Dunbar Args.AddAllArgs(CmdArgs, options::OPT_v); 2283f7c16d903f11814e2d6780e2a2e189b7a7afc4edDaniel Dunbar Args.AddLastArg(CmdArgs, options::OPT_H); 22842b81910618f63e4ce2373c926a26e76b4b91373fChad Rosier if (D.CCPrintHeaders && !D.CCGenDiagnostics) { 2285322c29fefe7fa33f03273136eb5f8b7f5b4df7c0Daniel Dunbar CmdArgs.push_back("-header-include-file"); 2286322c29fefe7fa33f03273136eb5f8b7f5b4df7c0Daniel Dunbar CmdArgs.push_back(D.CCPrintHeadersFilename ? 2287322c29fefe7fa33f03273136eb5f8b7f5b4df7c0Daniel Dunbar D.CCPrintHeadersFilename : "-"); 2288322c29fefe7fa33f03273136eb5f8b7f5b4df7c0Daniel Dunbar } 22891d46033f760ba5fd266ce59fe391fac473f04f52Daniel Dunbar Args.AddLastArg(CmdArgs, options::OPT_P); 22901eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump Args.AddLastArg(CmdArgs, options::OPT_print_ivar_layout); 22911d46033f760ba5fd266ce59fe391fac473f04f52Daniel Dunbar 22922b81910618f63e4ce2373c926a26e76b4b91373fChad Rosier if (D.CCLogDiagnostics && !D.CCGenDiagnostics) { 2293c8a22b091677c02003880166e5d5767ca8d74b70Daniel Dunbar CmdArgs.push_back("-diagnostic-log-file"); 2294c8a22b091677c02003880166e5d5767ca8d74b70Daniel Dunbar CmdArgs.push_back(D.CCLogDiagnosticsFilename ? 2295c8a22b091677c02003880166e5d5767ca8d74b70Daniel Dunbar D.CCLogDiagnosticsFilename : "-"); 2296c8a22b091677c02003880166e5d5767ca8d74b70Daniel Dunbar } 2297c8a22b091677c02003880166e5d5767ca8d74b70Daniel Dunbar 2298c706c8e440abf61910c042380e19c67932998395Eric Christopher // Use the last option from "-g" group. "-gline-tables-only" 2299c706c8e440abf61910c042380e19c67932998395Eric Christopher // is preserved, all other debug options are substituted with "-g". 230018f36d9eac8b425e8cfed389bbbf02c030f26be7Rafael Espindola Args.ClaimAllArgs(options::OPT_g_Group); 2301a9cd83b1ddfa7d05e2887f59532e59e626b03ef6Alexey Samsonov if (Arg *A = Args.getLastArg(options::OPT_g_Group)) { 2302c706c8e440abf61910c042380e19c67932998395Eric Christopher if (A->getOption().matches(options::OPT_gline_tables_only)) 2303a9cd83b1ddfa7d05e2887f59532e59e626b03ef6Alexey Samsonov CmdArgs.push_back("-gline-tables-only"); 2304c706c8e440abf61910c042380e19c67932998395Eric Christopher else if (!A->getOption().matches(options::OPT_g0) && 2305c706c8e440abf61910c042380e19c67932998395Eric Christopher !A->getOption().matches(options::OPT_ggdb0)) 2306cf6ba2eeaeabb03541ee98859805800c39759a47Chad Rosier CmdArgs.push_back("-g"); 2307a9cd83b1ddfa7d05e2887f59532e59e626b03ef6Alexey Samsonov } 23081d46033f760ba5fd266ce59fe391fac473f04f52Daniel Dunbar 23097f3260764a3614e22dcf24d71c1155f14a9b4e6eAlexey Samsonov // We ignore flags -gstrict-dwarf and -grecord-gcc-switches for now. 23107f3260764a3614e22dcf24d71c1155f14a9b4e6eAlexey Samsonov Args.ClaimAllArgs(options::OPT_g_flags_Group); 2311da3301eec823fe770bfa49a1cb19649506caa698Eric Christopher if (Args.hasArg(options::OPT_gcolumn_info)) 2312da3301eec823fe770bfa49a1cb19649506caa698Eric Christopher CmdArgs.push_back("-dwarf-column-info"); 23137f3260764a3614e22dcf24d71c1155f14a9b4e6eAlexey Samsonov 2314c706c8e440abf61910c042380e19c67932998395Eric Christopher // -gsplit-dwarf should turn on -g and enable the backend dwarf 2315c706c8e440abf61910c042380e19c67932998395Eric Christopher // splitting and extraction. 2316f870e12f2324f48248793035ab0edb35d66e2299Eric Christopher // FIXME: Currently only works on Linux. 2317f870e12f2324f48248793035ab0edb35d66e2299Eric Christopher if (getToolChain().getTriple().getOS() == llvm::Triple::Linux && 2318f870e12f2324f48248793035ab0edb35d66e2299Eric Christopher Args.hasArg(options::OPT_gsplit_dwarf)) { 2319c706c8e440abf61910c042380e19c67932998395Eric Christopher CmdArgs.push_back("-g"); 2320c706c8e440abf61910c042380e19c67932998395Eric Christopher CmdArgs.push_back("-backend-option"); 2321c706c8e440abf61910c042380e19c67932998395Eric Christopher CmdArgs.push_back("-split-dwarf=Enable"); 2322c706c8e440abf61910c042380e19c67932998395Eric Christopher } 2323c706c8e440abf61910c042380e19c67932998395Eric Christopher 23249cf933a67e54bea5475c5027fee2c1cf7365ee05Rafael Espindola Args.AddAllArgs(CmdArgs, options::OPT_ffunction_sections); 23259cf933a67e54bea5475c5027fee2c1cf7365ee05Rafael Espindola Args.AddAllArgs(CmdArgs, options::OPT_fdata_sections); 23269cf933a67e54bea5475c5027fee2c1cf7365ee05Rafael Espindola 23277255a2d997b15beae82e627052fdb1b2474495c2Chris Lattner Args.AddAllArgs(CmdArgs, options::OPT_finstrument_functions); 23287255a2d997b15beae82e627052fdb1b2474495c2Chris Lattner 2329e8ba8d78a258ec992d3521eebdae8324db777b14Nick Lewycky if (Args.hasArg(options::OPT_ftest_coverage) || 2330e8ba8d78a258ec992d3521eebdae8324db777b14Nick Lewycky Args.hasArg(options::OPT_coverage)) 2331e8ba8d78a258ec992d3521eebdae8324db777b14Nick Lewycky CmdArgs.push_back("-femit-coverage-notes"); 2332e8ba8d78a258ec992d3521eebdae8324db777b14Nick Lewycky if (Args.hasArg(options::OPT_fprofile_arcs) || 2333e8ba8d78a258ec992d3521eebdae8324db777b14Nick Lewycky Args.hasArg(options::OPT_coverage)) 2334e8ba8d78a258ec992d3521eebdae8324db777b14Nick Lewycky CmdArgs.push_back("-femit-coverage-data"); 2335e8ba8d78a258ec992d3521eebdae8324db777b14Nick Lewycky 23365ea4f44e34449a78d6b38aa47c14b527839d7aacNick Lewycky if (C.getArgs().hasArg(options::OPT_c) || 23375ea4f44e34449a78d6b38aa47c14b527839d7aacNick Lewycky C.getArgs().hasArg(options::OPT_S)) { 23385ea4f44e34449a78d6b38aa47c14b527839d7aacNick Lewycky if (Output.isFilename()) { 23393dc05418538c719fea48b906bfa4febe5296e126Nick Lewycky CmdArgs.push_back("-coverage-file"); 2340025b3d4f528ce54242f414057cc45a65e39098dbEric Christopher SmallString<128> CoverageFilename(Output.getFilename()); 23410f815f1f91e5cf0726fd8296445038fec3bed80bNick Lewycky if (llvm::sys::path::is_relative(CoverageFilename.str())) { 23420f815f1f91e5cf0726fd8296445038fec3bed80bNick Lewycky if (const char *pwd = ::getenv("PWD")) { 23430f815f1f91e5cf0726fd8296445038fec3bed80bNick Lewycky if (llvm::sys::path::is_absolute(pwd)) { 23440f815f1f91e5cf0726fd8296445038fec3bed80bNick Lewycky SmallString<128> Pwd(pwd); 23450f815f1f91e5cf0726fd8296445038fec3bed80bNick Lewycky llvm::sys::path::append(Pwd, CoverageFilename.str()); 23460f815f1f91e5cf0726fd8296445038fec3bed80bNick Lewycky CoverageFilename.swap(Pwd); 23470f815f1f91e5cf0726fd8296445038fec3bed80bNick Lewycky } 23480f815f1f91e5cf0726fd8296445038fec3bed80bNick Lewycky } 23490f815f1f91e5cf0726fd8296445038fec3bed80bNick Lewycky } 2350025b3d4f528ce54242f414057cc45a65e39098dbEric Christopher CmdArgs.push_back(Args.MakeArgString(CoverageFilename)); 23515ea4f44e34449a78d6b38aa47c14b527839d7aacNick Lewycky } 23525ea4f44e34449a78d6b38aa47c14b527839d7aacNick Lewycky } 23535ea4f44e34449a78d6b38aa47c14b527839d7aacNick Lewycky 2354a268fc0f2229eb132ebc8501b140093aeb5516bfDaniel Dunbar // Pass options for controlling the default header search paths. 2355a268fc0f2229eb132ebc8501b140093aeb5516bfDaniel Dunbar if (Args.hasArg(options::OPT_nostdinc)) { 2356a268fc0f2229eb132ebc8501b140093aeb5516bfDaniel Dunbar CmdArgs.push_back("-nostdsysteminc"); 2357a268fc0f2229eb132ebc8501b140093aeb5516bfDaniel Dunbar CmdArgs.push_back("-nobuiltininc"); 2358a268fc0f2229eb132ebc8501b140093aeb5516bfDaniel Dunbar } else { 235992d6d404833468120f9a86fb360691ac60585551Daniel Dunbar if (Args.hasArg(options::OPT_nostdlibinc)) 236092d6d404833468120f9a86fb360691ac60585551Daniel Dunbar CmdArgs.push_back("-nostdsysteminc"); 2361a268fc0f2229eb132ebc8501b140093aeb5516bfDaniel Dunbar Args.AddLastArg(CmdArgs, options::OPT_nostdincxx); 2362a268fc0f2229eb132ebc8501b140093aeb5516bfDaniel Dunbar Args.AddLastArg(CmdArgs, options::OPT_nobuiltininc); 2363a268fc0f2229eb132ebc8501b140093aeb5516bfDaniel Dunbar } 23641d46033f760ba5fd266ce59fe391fac473f04f52Daniel Dunbar 23655f12232ef39e3d6c36d6600a73ebbe3c4a79f514Daniel Dunbar // Pass the path to compiler resource files. 23665f12232ef39e3d6c36d6600a73ebbe3c4a79f514Daniel Dunbar CmdArgs.push_back("-resource-dir"); 2367225c41706dc0f3682236e351820d339e14390e00Daniel Dunbar CmdArgs.push_back(D.ResourceDir.c_str()); 23682ac9fc2ad64e16127df8c60caeea2edfe9a400a2Daniel Dunbar 2369389db16c63eec6ecfa9b235155252d8da766e94eArgyrios Kyrtzidis Args.AddLastArg(CmdArgs, options::OPT_working_directory); 2370389db16c63eec6ecfa9b235155252d8da766e94eArgyrios Kyrtzidis 237130660a898545416f0fea2d717f16f75640001e38Ted Kremenek bool ARCMTEnabled = false; 23728f0e8d22960d56f8390f4971e2c0f2f0a0884602John McCall if (!Args.hasArg(options::OPT_fno_objc_arc)) { 237372ac120023abb73f3ff9386e193fed55fa9a96e2Argyrios Kyrtzidis if (const Arg *A = Args.getLastArg(options::OPT_ccc_arcmt_check, 237469325d5b7cfecf1b3128745efc33612aedf1b8b4Argyrios Kyrtzidis options::OPT_ccc_arcmt_modify, 237569325d5b7cfecf1b3128745efc33612aedf1b8b4Argyrios Kyrtzidis options::OPT_ccc_arcmt_migrate)) { 237630660a898545416f0fea2d717f16f75640001e38Ted Kremenek ARCMTEnabled = true; 23778f0e8d22960d56f8390f4971e2c0f2f0a0884602John McCall switch (A->getOption().getID()) { 23788f0e8d22960d56f8390f4971e2c0f2f0a0884602John McCall default: 23798f0e8d22960d56f8390f4971e2c0f2f0a0884602John McCall llvm_unreachable("missed a case"); 238072ac120023abb73f3ff9386e193fed55fa9a96e2Argyrios Kyrtzidis case options::OPT_ccc_arcmt_check: 23818f0e8d22960d56f8390f4971e2c0f2f0a0884602John McCall CmdArgs.push_back("-arcmt-check"); 23828f0e8d22960d56f8390f4971e2c0f2f0a0884602John McCall break; 238372ac120023abb73f3ff9386e193fed55fa9a96e2Argyrios Kyrtzidis case options::OPT_ccc_arcmt_modify: 23848f0e8d22960d56f8390f4971e2c0f2f0a0884602John McCall CmdArgs.push_back("-arcmt-modify"); 23858f0e8d22960d56f8390f4971e2c0f2f0a0884602John McCall break; 238669325d5b7cfecf1b3128745efc33612aedf1b8b4Argyrios Kyrtzidis case options::OPT_ccc_arcmt_migrate: 238769325d5b7cfecf1b3128745efc33612aedf1b8b4Argyrios Kyrtzidis CmdArgs.push_back("-arcmt-migrate"); 238830660a898545416f0fea2d717f16f75640001e38Ted Kremenek CmdArgs.push_back("-mt-migrate-directory"); 23891d489cf4a04ad0ad8ac2696e4eed0995f3a67288Richard Smith CmdArgs.push_back(A->getValue()); 23907ee2049278b98d42709380054eb83f4952af1200Argyrios Kyrtzidis 23917ee2049278b98d42709380054eb83f4952af1200Argyrios Kyrtzidis Args.AddLastArg(CmdArgs, options::OPT_arcmt_migrate_report_output); 23927ee2049278b98d42709380054eb83f4952af1200Argyrios Kyrtzidis Args.AddLastArg(CmdArgs, options::OPT_arcmt_migrate_emit_arc_errors); 239369325d5b7cfecf1b3128745efc33612aedf1b8b4Argyrios Kyrtzidis break; 23948f0e8d22960d56f8390f4971e2c0f2f0a0884602John McCall } 23958f0e8d22960d56f8390f4971e2c0f2f0a0884602John McCall } 23968f0e8d22960d56f8390f4971e2c0f2f0a0884602John McCall } 239788b7cf00fcb582728c642da3927c59468efaf926Eric Christopher 239830660a898545416f0fea2d717f16f75640001e38Ted Kremenek if (const Arg *A = Args.getLastArg(options::OPT_ccc_objcmt_migrate)) { 239930660a898545416f0fea2d717f16f75640001e38Ted Kremenek if (ARCMTEnabled) { 240030660a898545416f0fea2d717f16f75640001e38Ted Kremenek D.Diag(diag::err_drv_argument_not_allowed_with) 240130660a898545416f0fea2d717f16f75640001e38Ted Kremenek << A->getAsString(Args) << "-ccc-arcmt-migrate"; 240230660a898545416f0fea2d717f16f75640001e38Ted Kremenek } 240330660a898545416f0fea2d717f16f75640001e38Ted Kremenek CmdArgs.push_back("-mt-migrate-directory"); 24041d489cf4a04ad0ad8ac2696e4eed0995f3a67288Richard Smith CmdArgs.push_back(A->getValue()); 240530660a898545416f0fea2d717f16f75640001e38Ted Kremenek 240630660a898545416f0fea2d717f16f75640001e38Ted Kremenek if (!Args.hasArg(options::OPT_objcmt_migrate_literals, 240730660a898545416f0fea2d717f16f75640001e38Ted Kremenek options::OPT_objcmt_migrate_subscripting)) { 240830660a898545416f0fea2d717f16f75640001e38Ted Kremenek // None specified, means enable them all. 240930660a898545416f0fea2d717f16f75640001e38Ted Kremenek CmdArgs.push_back("-objcmt-migrate-literals"); 241030660a898545416f0fea2d717f16f75640001e38Ted Kremenek CmdArgs.push_back("-objcmt-migrate-subscripting"); 241130660a898545416f0fea2d717f16f75640001e38Ted Kremenek } else { 241230660a898545416f0fea2d717f16f75640001e38Ted Kremenek Args.AddLastArg(CmdArgs, options::OPT_objcmt_migrate_literals); 241330660a898545416f0fea2d717f16f75640001e38Ted Kremenek Args.AddLastArg(CmdArgs, options::OPT_objcmt_migrate_subscripting); 241430660a898545416f0fea2d717f16f75640001e38Ted Kremenek } 241530660a898545416f0fea2d717f16f75640001e38Ted Kremenek } 241630660a898545416f0fea2d717f16f75640001e38Ted Kremenek 2417c21c485b4fb58ef5d55cf3e523263dd824a2ace4Daniel Dunbar // Add preprocessing options like -I, -D, etc. if we are using the 2418c21c485b4fb58ef5d55cf3e523263dd824a2ace4Daniel Dunbar // preprocessor. 2419c21c485b4fb58ef5d55cf3e523263dd824a2ace4Daniel Dunbar // 2420c21c485b4fb58ef5d55cf3e523263dd824a2ace4Daniel Dunbar // FIXME: Support -fpreprocessed 2421c21c485b4fb58ef5d55cf3e523263dd824a2ace4Daniel Dunbar if (types::getPreprocessedType(InputType) != types::TY_INVALID) 24229d718635fa805674aaba5d938f3dc6b35b8632baChad Rosier AddPreprocessingOptions(C, JA, D, Args, CmdArgs, Output, Inputs); 24231d46033f760ba5fd266ce59fe391fac473f04f52Daniel Dunbar 242419d9d2ebbed9164e3f3a20fa065a26585c990a2eRafael Espindola // Don't warn about "clang -c -DPIC -fPIC test.i" because libtool.m4 assumes 242519d9d2ebbed9164e3f3a20fa065a26585c990a2eRafael Espindola // that "The compiler can only warn and ignore the option if not recognized". 242619d9d2ebbed9164e3f3a20fa065a26585c990a2eRafael Espindola // When building with ccache, it will pass -D options to clang even on 242719d9d2ebbed9164e3f3a20fa065a26585c990a2eRafael Espindola // preprocessed inputs and configure concludes that -fPIC is not supported. 242819d9d2ebbed9164e3f3a20fa065a26585c990a2eRafael Espindola Args.ClaimAllArgs(options::OPT_D); 242919d9d2ebbed9164e3f3a20fa065a26585c990a2eRafael Espindola 243020f0eacf1682e4594da9d318b5b13ed4f6d6e7e5Daniel Dunbar // Manually translate -O to -O2 and -O4 to -O3; let clang reject 2431337a6271b98c4c183f7eaad1563a75260b4f2871Daniel Dunbar // others. 2432337a6271b98c4c183f7eaad1563a75260b4f2871Daniel Dunbar if (Arg *A = Args.getLastArg(options::OPT_O_Group)) { 2433b827a0541b5fd095fcdb7ad0c3df93ca158c619aDaniel Dunbar if (A->getOption().matches(options::OPT_O4)) 2434337a6271b98c4c183f7eaad1563a75260b4f2871Daniel Dunbar CmdArgs.push_back("-O3"); 2435473916c038f75fa3b0c51a0bc7afc5b082e5c22fDaniel Dunbar else if (A->getOption().matches(options::OPT_O) && 24361d489cf4a04ad0ad8ac2696e4eed0995f3a67288Richard Smith A->getValue()[0] == '\0') 243720f0eacf1682e4594da9d318b5b13ed4f6d6e7e5Daniel Dunbar CmdArgs.push_back("-O2"); 24381d46033f760ba5fd266ce59fe391fac473f04f52Daniel Dunbar else 24395697aa0d75c87bafec78984048d558f8d12ca1b3Daniel Dunbar A->render(Args, CmdArgs); 24401d46033f760ba5fd266ce59fe391fac473f04f52Daniel Dunbar } 24411d46033f760ba5fd266ce59fe391fac473f04f52Daniel Dunbar 2442b2c0887457ef509c1a93bcddf9ad8f5e87d9945eChad Rosier // Don't warn about unused -flto. This can happen when we're preprocessing or 2443b2c0887457ef509c1a93bcddf9ad8f5e87d9945eChad Rosier // precompiling. 2444b2c0887457ef509c1a93bcddf9ad8f5e87d9945eChad Rosier Args.ClaimAllArgs(options::OPT_flto); 2445b2c0887457ef509c1a93bcddf9ad8f5e87d9945eChad Rosier 24466e8371eb97a08f724be22ae6042d1e9eacbe4c48Daniel Dunbar Args.AddAllArgs(CmdArgs, options::OPT_W_Group); 2447e8cf7d143446c45568bb7c9a6fbd8f32ca6ae93eTed Kremenek if (Args.hasFlag(options::OPT_pedantic, options::OPT_no_pedantic, false)) 2448e8cf7d143446c45568bb7c9a6fbd8f32ca6ae93eTed Kremenek CmdArgs.push_back("-pedantic"); 24496e8371eb97a08f724be22ae6042d1e9eacbe4c48Daniel Dunbar Args.AddLastArg(CmdArgs, options::OPT_pedantic_errors); 24501d46033f760ba5fd266ce59fe391fac473f04f52Daniel Dunbar Args.AddLastArg(CmdArgs, options::OPT_w); 2451d573d26e1abcce24c31ece3d6f7af158db569e4cDaniel Dunbar 2452d573d26e1abcce24c31ece3d6f7af158db569e4cDaniel Dunbar // Handle -{std, ansi, trigraphs} -- take the last of -{std, ansi} 2453d573d26e1abcce24c31ece3d6f7af158db569e4cDaniel Dunbar // (-ansi is equivalent to -std=c89). 2454d573d26e1abcce24c31ece3d6f7af158db569e4cDaniel Dunbar // 2455d573d26e1abcce24c31ece3d6f7af158db569e4cDaniel Dunbar // If a std is supplied, only add -trigraphs if it follows the 2456d573d26e1abcce24c31ece3d6f7af158db569e4cDaniel Dunbar // option. 2457d573d26e1abcce24c31ece3d6f7af158db569e4cDaniel Dunbar if (Arg *Std = Args.getLastArg(options::OPT_std_EQ, options::OPT_ansi)) { 2458d573d26e1abcce24c31ece3d6f7af158db569e4cDaniel Dunbar if (Std->getOption().matches(options::OPT_ansi)) 2459528365d3189d27f3a90a4012baaa8b2814e0a231Nuno Lopes if (types::isCXX(InputType)) 2460294691eb1caf551083acd7b08630ef21c3fd760dDaniel Dunbar CmdArgs.push_back("-std=c++98"); 2461528365d3189d27f3a90a4012baaa8b2814e0a231Nuno Lopes else 2462294691eb1caf551083acd7b08630ef21c3fd760dDaniel Dunbar CmdArgs.push_back("-std=c89"); 2463d573d26e1abcce24c31ece3d6f7af158db569e4cDaniel Dunbar else 2464d573d26e1abcce24c31ece3d6f7af158db569e4cDaniel Dunbar Std->render(Args, CmdArgs); 2465d573d26e1abcce24c31ece3d6f7af158db569e4cDaniel Dunbar 24660e10031ba5d0f9b3e5bc5570f39382d288779ab8Daniel Dunbar if (Arg *A = Args.getLastArg(options::OPT_std_EQ, options::OPT_ansi, 24670e10031ba5d0f9b3e5bc5570f39382d288779ab8Daniel Dunbar options::OPT_trigraphs)) 24680e10031ba5d0f9b3e5bc5570f39382d288779ab8Daniel Dunbar if (A != Std) 2469d573d26e1abcce24c31ece3d6f7af158db569e4cDaniel Dunbar A->render(Args, CmdArgs); 2470a3ff202ee4fb21728e930d5d029ba4925129912cDaniel Dunbar } else { 2471a3ff202ee4fb21728e930d5d029ba4925129912cDaniel Dunbar // Honor -std-default. 24724a5290e773e70ec2c3b4353a3a4aa7d1a3e3cd66Daniel Dunbar // 24734a5290e773e70ec2c3b4353a3a4aa7d1a3e3cd66Daniel Dunbar // FIXME: Clang doesn't correctly handle -std= when the input language 24744a5290e773e70ec2c3b4353a3a4aa7d1a3e3cd66Daniel Dunbar // doesn't match. For the time being just ignore this for C++ inputs; 24754a5290e773e70ec2c3b4353a3a4aa7d1a3e3cd66Daniel Dunbar // eventually we want to do all the standard defaulting here instead of 24764a5290e773e70ec2c3b4353a3a4aa7d1a3e3cd66Daniel Dunbar // splitting it between the driver and clang -cc1. 24774a5290e773e70ec2c3b4353a3a4aa7d1a3e3cd66Daniel Dunbar if (!types::isCXX(InputType)) 247850f88b99c60c2ed31b339cd8bd484766cc9e916bNico Weber Args.AddAllArgsTranslated(CmdArgs, options::OPT_std_default_EQ, 247950f88b99c60c2ed31b339cd8bd484766cc9e916bNico Weber "-std=", /*Joined=*/true); 248050f88b99c60c2ed31b339cd8bd484766cc9e916bNico Weber else if (getToolChain().getTriple().getOS() == llvm::Triple::Win32) 248150f88b99c60c2ed31b339cd8bd484766cc9e916bNico Weber CmdArgs.push_back("-std=c++11"); 248250f88b99c60c2ed31b339cd8bd484766cc9e916bNico Weber 2483d573d26e1abcce24c31ece3d6f7af158db569e4cDaniel Dunbar Args.AddLastArg(CmdArgs, options::OPT_trigraphs); 2484a3ff202ee4fb21728e930d5d029ba4925129912cDaniel Dunbar } 2485c21c485b4fb58ef5d55cf3e523263dd824a2ace4Daniel Dunbar 248650465d1d2f5f6dd3d8e18e2cf7bad4691e5ca6a8Chandler Carruth // Map the bizarre '-Wwrite-strings' flag to a more sensible 248750465d1d2f5f6dd3d8e18e2cf7bad4691e5ca6a8Chandler Carruth // '-fconst-strings'; this better indicates its actual behavior. 248850465d1d2f5f6dd3d8e18e2cf7bad4691e5ca6a8Chandler Carruth if (Args.hasFlag(options::OPT_Wwrite_strings, options::OPT_Wno_write_strings, 248950465d1d2f5f6dd3d8e18e2cf7bad4691e5ca6a8Chandler Carruth false)) { 249050465d1d2f5f6dd3d8e18e2cf7bad4691e5ca6a8Chandler Carruth // For perfect compatibility with GCC, we do this even in the presence of 249150465d1d2f5f6dd3d8e18e2cf7bad4691e5ca6a8Chandler Carruth // '-w'. This flag names something other than a warning for GCC. 249250465d1d2f5f6dd3d8e18e2cf7bad4691e5ca6a8Chandler Carruth CmdArgs.push_back("-fconst-strings"); 249350465d1d2f5f6dd3d8e18e2cf7bad4691e5ca6a8Chandler Carruth } 249450465d1d2f5f6dd3d8e18e2cf7bad4691e5ca6a8Chandler Carruth 24951cfe3c305c0d5393fd94167808b8f5d96cd65227Chandler Carruth // GCC provides a macro definition '__DEPRECATED' when -Wdeprecated is active 2496f8c247d247f9f7ab2bf4965677e6d056711c99d5Chandler Carruth // during C++ compilation, which it is by default. GCC keeps this define even 2497f8c247d247f9f7ab2bf4965677e6d056711c99d5Chandler Carruth // in the presence of '-w', match this behavior bug-for-bug. 2498f8c247d247f9f7ab2bf4965677e6d056711c99d5Chandler Carruth if (types::isCXX(InputType) && 2499f8c247d247f9f7ab2bf4965677e6d056711c99d5Chandler Carruth Args.hasFlag(options::OPT_Wdeprecated, options::OPT_Wno_deprecated, 2500f8c247d247f9f7ab2bf4965677e6d056711c99d5Chandler Carruth true)) { 2501f8c247d247f9f7ab2bf4965677e6d056711c99d5Chandler Carruth CmdArgs.push_back("-fdeprecated-macro"); 25021cfe3c305c0d5393fd94167808b8f5d96cd65227Chandler Carruth } 25031cfe3c305c0d5393fd94167808b8f5d96cd65227Chandler Carruth 2504c304ba341a7daa88da42faf8f86310b764dd7b6aChandler Carruth // Translate GCC's misnamer '-fasm' arguments to '-fgnu-keywords'. 2505c304ba341a7daa88da42faf8f86310b764dd7b6aChandler Carruth if (Arg *Asm = Args.getLastArg(options::OPT_fasm, options::OPT_fno_asm)) { 2506c304ba341a7daa88da42faf8f86310b764dd7b6aChandler Carruth if (Asm->getOption().matches(options::OPT_fasm)) 2507c304ba341a7daa88da42faf8f86310b764dd7b6aChandler Carruth CmdArgs.push_back("-fgnu-keywords"); 2508c304ba341a7daa88da42faf8f86310b764dd7b6aChandler Carruth else 2509c304ba341a7daa88da42faf8f86310b764dd7b6aChandler Carruth CmdArgs.push_back("-fno-gnu-keywords"); 2510c304ba341a7daa88da42faf8f86310b764dd7b6aChandler Carruth } 2511c304ba341a7daa88da42faf8f86310b764dd7b6aChandler Carruth 251261b1efe2d0b459a98962fd9b4c097ad8bb9bfdecRafael Espindola if (ShouldDisableCFI(Args, getToolChain())) 251361b1efe2d0b459a98962fd9b4c097ad8bb9bfdecRafael Espindola CmdArgs.push_back("-fno-dwarf2-cfi-asm"); 2514f24a151d645abc89f94aa58ad59f3131502041b1Rafael Espindola 2515ea523d73a6de06f828952a02f5ff86e4cc631695Nick Lewycky if (ShouldDisableDwarfDirectory(Args, getToolChain())) 2516ea523d73a6de06f828952a02f5ff86e4cc631695Nick Lewycky CmdArgs.push_back("-fno-dwarf-directory-asm"); 2517ea523d73a6de06f828952a02f5ff86e4cc631695Nick Lewycky 2518d566df67bed6381f6e859bbd21fd43ff89277cc0Chandler Carruth // Add in -fdebug-compilation-dir if necessary. 2519d566df67bed6381f6e859bbd21fd43ff89277cc0Chandler Carruth addDebugCompDirArg(Args, CmdArgs); 25207c4fd9121f5885096fd3258d20a984e3f08f8603Nick Lewycky 2521c18c42345636e2866fed75c7e434fb659d747672Richard Smith if (Arg *A = Args.getLastArg(options::OPT_ftemplate_depth_, 2522c18c42345636e2866fed75c7e434fb659d747672Richard Smith options::OPT_ftemplate_depth_EQ)) { 25231d46033f760ba5fd266ce59fe391fac473f04f52Daniel Dunbar CmdArgs.push_back("-ftemplate-depth"); 25241d489cf4a04ad0ad8ac2696e4eed0995f3a67288Richard Smith CmdArgs.push_back(A->getValue()); 2525b488c1dac8e53206f07103d794a62a3f5012c0f4Daniel Dunbar } 2526b488c1dac8e53206f07103d794a62a3f5012c0f4Daniel Dunbar 2527c18c42345636e2866fed75c7e434fb659d747672Richard Smith if (Arg *A = Args.getLastArg(options::OPT_fconstexpr_depth_EQ)) { 2528c18c42345636e2866fed75c7e434fb659d747672Richard Smith CmdArgs.push_back("-fconstexpr-depth"); 25291d489cf4a04ad0ad8ac2696e4eed0995f3a67288Richard Smith CmdArgs.push_back(A->getValue()); 2530c18c42345636e2866fed75c7e434fb659d747672Richard Smith } 2531c18c42345636e2866fed75c7e434fb659d747672Richard Smith 25329e738cc9d4b4655c44dadeb22f3a314daf43b995Richard Smith if (Arg *A = Args.getLastArg(options::OPT_fbracket_depth_EQ)) { 25339e738cc9d4b4655c44dadeb22f3a314daf43b995Richard Smith CmdArgs.push_back("-fbracket-depth"); 25349e738cc9d4b4655c44dadeb22f3a314daf43b995Richard Smith CmdArgs.push_back(A->getValue()); 25359e738cc9d4b4655c44dadeb22f3a314daf43b995Richard Smith } 25369e738cc9d4b4655c44dadeb22f3a314daf43b995Richard Smith 25371380a147d4578b619c215b23aa79ce17036d3c46Argyrios Kyrtzidis if (Arg *A = Args.getLastArg(options::OPT_Wlarge_by_value_copy_EQ, 25381380a147d4578b619c215b23aa79ce17036d3c46Argyrios Kyrtzidis options::OPT_Wlarge_by_value_copy_def)) { 25392e4fd6d9a1c8ba9c400324d230cfc49050550deaJean-Daniel Dupas if (A->getNumValues()) { 25401d489cf4a04ad0ad8ac2696e4eed0995f3a67288Richard Smith StringRef bytes = A->getValue(); 25412e4fd6d9a1c8ba9c400324d230cfc49050550deaJean-Daniel Dupas CmdArgs.push_back(Args.MakeArgString("-Wlarge-by-value-copy=" + bytes)); 25422e4fd6d9a1c8ba9c400324d230cfc49050550deaJean-Daniel Dupas } else 25432e4fd6d9a1c8ba9c400324d230cfc49050550deaJean-Daniel Dupas CmdArgs.push_back("-Wlarge-by-value-copy=64"); // default value 25443532fdd1db8ff6f353f2a5b215cebe3e0e2ff3c2Argyrios Kyrtzidis } 25453532fdd1db8ff6f353f2a5b215cebe3e0e2ff3c2Argyrios Kyrtzidis 2546b3198a841e7f356f171f1e11faff014b2deb1eb8Nuno Lopes 2547c635710bcbb9598acd5a14647ba7ca28bee89a68Michael J. Spencer if (Args.hasArg(options::OPT_relocatable_pch)) 254866861e09d590994a8b941eaa328e4d8f33adec9eDaniel Dunbar CmdArgs.push_back("-relocatable-pch"); 25491eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump 2550294691eb1caf551083acd7b08630ef21c3fd760dDaniel Dunbar if (Arg *A = Args.getLastArg(options::OPT_fconstant_string_class_EQ)) { 2551294691eb1caf551083acd7b08630ef21c3fd760dDaniel Dunbar CmdArgs.push_back("-fconstant-string-class"); 25521d489cf4a04ad0ad8ac2696e4eed0995f3a67288Richard Smith CmdArgs.push_back(A->getValue()); 2553294691eb1caf551083acd7b08630ef21c3fd760dDaniel Dunbar } 25548a5a9aaddb627c0884c2ed8db55cc29fdb601195David Chisnall 2555124fca533d9fef2e3f6359283909bd342b5f5f26Chris Lattner if (Arg *A = Args.getLastArg(options::OPT_ftabstop_EQ)) { 2556124fca533d9fef2e3f6359283909bd342b5f5f26Chris Lattner CmdArgs.push_back("-ftabstop"); 25571d489cf4a04ad0ad8ac2696e4eed0995f3a67288Richard Smith CmdArgs.push_back(A->getValue()); 2558124fca533d9fef2e3f6359283909bd342b5f5f26Chris Lattner } 2559124fca533d9fef2e3f6359283909bd342b5f5f26Chris Lattner 25600f0c963f9b7ac6f0176c34d405d48fcb005dfab6Chris Lattner CmdArgs.push_back("-ferror-limit"); 25610f0c963f9b7ac6f0176c34d405d48fcb005dfab6Chris Lattner if (Arg *A = Args.getLastArg(options::OPT_ferror_limit_EQ)) 25621d489cf4a04ad0ad8ac2696e4eed0995f3a67288Richard Smith CmdArgs.push_back(A->getValue()); 25630f0c963f9b7ac6f0176c34d405d48fcb005dfab6Chris Lattner else 25640f0c963f9b7ac6f0176c34d405d48fcb005dfab6Chris Lattner CmdArgs.push_back("19"); 2565575cf3791216c33770ba950430493cdd43099f8fDouglas Gregor 2566c40f73c6e715044d327409564bf3656254101d46Chandler Carruth if (Arg *A = Args.getLastArg(options::OPT_fmacro_backtrace_limit_EQ)) { 2567c40f73c6e715044d327409564bf3656254101d46Chandler Carruth CmdArgs.push_back("-fmacro-backtrace-limit"); 25681d489cf4a04ad0ad8ac2696e4eed0995f3a67288Richard Smith CmdArgs.push_back(A->getValue()); 2569c40f73c6e715044d327409564bf3656254101d46Chandler Carruth } 2570c40f73c6e715044d327409564bf3656254101d46Chandler Carruth 2571c40f73c6e715044d327409564bf3656254101d46Chandler Carruth if (Arg *A = Args.getLastArg(options::OPT_ftemplate_backtrace_limit_EQ)) { 2572c40f73c6e715044d327409564bf3656254101d46Chandler Carruth CmdArgs.push_back("-ftemplate-backtrace-limit"); 25731d489cf4a04ad0ad8ac2696e4eed0995f3a67288Richard Smith CmdArgs.push_back(A->getValue()); 2574c40f73c6e715044d327409564bf3656254101d46Chandler Carruth } 2575c40f73c6e715044d327409564bf3656254101d46Chandler Carruth 257608d6e032a2a0a8656d12b3b7b93942987bb12eb7Richard Smith if (Arg *A = Args.getLastArg(options::OPT_fconstexpr_backtrace_limit_EQ)) { 257708d6e032a2a0a8656d12b3b7b93942987bb12eb7Richard Smith CmdArgs.push_back("-fconstexpr-backtrace-limit"); 25781d489cf4a04ad0ad8ac2696e4eed0995f3a67288Richard Smith CmdArgs.push_back(A->getValue()); 257908d6e032a2a0a8656d12b3b7b93942987bb12eb7Richard Smith } 258008d6e032a2a0a8656d12b3b7b93942987bb12eb7Richard Smith 258155efe142a84b2aab6d0186c20a311c347a65f794Daniel Dunbar // Pass -fmessage-length=. 2582a28690e5b0e423a6287ebe3a5565fd1896d7ebffDaniel Dunbar CmdArgs.push_back("-fmessage-length"); 258355efe142a84b2aab6d0186c20a311c347a65f794Daniel Dunbar if (Arg *A = Args.getLastArg(options::OPT_fmessage_length_EQ)) { 25841d489cf4a04ad0ad8ac2696e4eed0995f3a67288Richard Smith CmdArgs.push_back(A->getValue()); 258555efe142a84b2aab6d0186c20a311c347a65f794Daniel Dunbar } else { 258655efe142a84b2aab6d0186c20a311c347a65f794Daniel Dunbar // If -fmessage-length=N was not specified, determine whether this is a 258755efe142a84b2aab6d0186c20a311c347a65f794Daniel Dunbar // terminal and, if so, implicitly define -fmessage-length appropriately. 258855efe142a84b2aab6d0186c20a311c347a65f794Daniel Dunbar unsigned N = llvm::sys::Process::StandardErrColumns(); 25895f9e272e632e951b1efe824cd16acb4d96077930Chris Lattner CmdArgs.push_back(Args.MakeArgString(Twine(N))); 259055efe142a84b2aab6d0186c20a311c347a65f794Daniel Dunbar } 259155efe142a84b2aab6d0186c20a311c347a65f794Daniel Dunbar 2592a880b19aa6ef1dc95936f5de052be7a7d6ee6814John McCall // -fvisibility= and -fvisibility-ms-compat are of a piece. 2593a880b19aa6ef1dc95936f5de052be7a7d6ee6814John McCall if (const Arg *A = Args.getLastArg(options::OPT_fvisibility_EQ, 2594a880b19aa6ef1dc95936f5de052be7a7d6ee6814John McCall options::OPT_fvisibility_ms_compat)) { 2595a880b19aa6ef1dc95936f5de052be7a7d6ee6814John McCall if (A->getOption().matches(options::OPT_fvisibility_EQ)) { 2596a880b19aa6ef1dc95936f5de052be7a7d6ee6814John McCall CmdArgs.push_back("-fvisibility"); 2597a880b19aa6ef1dc95936f5de052be7a7d6ee6814John McCall CmdArgs.push_back(A->getValue()); 2598a880b19aa6ef1dc95936f5de052be7a7d6ee6814John McCall } else { 2599a880b19aa6ef1dc95936f5de052be7a7d6ee6814John McCall assert(A->getOption().matches(options::OPT_fvisibility_ms_compat)); 2600a880b19aa6ef1dc95936f5de052be7a7d6ee6814John McCall CmdArgs.push_back("-fvisibility"); 2601a880b19aa6ef1dc95936f5de052be7a7d6ee6814John McCall CmdArgs.push_back("hidden"); 2602a880b19aa6ef1dc95936f5de052be7a7d6ee6814John McCall CmdArgs.push_back("-ftype-visibility"); 2603a880b19aa6ef1dc95936f5de052be7a7d6ee6814John McCall CmdArgs.push_back("default"); 2604a880b19aa6ef1dc95936f5de052be7a7d6ee6814John McCall } 2605ba8d86172c8d9e2476c6fd2415731639223174c5Daniel Dunbar } 2606ba8d86172c8d9e2476c6fd2415731639223174c5Daniel Dunbar 26077cf84d66965a7706004d8590b5af5fe54b85f525Douglas Gregor Args.AddLastArg(CmdArgs, options::OPT_fvisibility_inlines_hidden); 260820249a1af2e462dcafdd6a350f1c7967b264ff25Michael J. Spencer 2609de981f3ff163bc9ec69e4c5e7316e94276412993Hans Wennborg Args.AddLastArg(CmdArgs, options::OPT_ftlsmodel_EQ); 2610de981f3ff163bc9ec69e4c5e7316e94276412993Hans Wennborg 26110a80ba74ffa3d3df55abfbc4474d7470c7c923e3Daniel Dunbar // -fhosted is default. 2612afc4baa37c2f38fadf05b15456b10a0994d51b0bChad Rosier if (Args.hasFlag(options::OPT_ffreestanding, options::OPT_fhosted, false) || 2613afc4baa37c2f38fadf05b15456b10a0994d51b0bChad Rosier KernelOrKext) 26140a80ba74ffa3d3df55abfbc4474d7470c7c923e3Daniel Dunbar CmdArgs.push_back("-ffreestanding"); 26150a80ba74ffa3d3df55abfbc4474d7470c7c923e3Daniel Dunbar 2616ba8d86172c8d9e2476c6fd2415731639223174c5Daniel Dunbar // Forward -f (flag) options which we can pass directly. 26173aaf082689d3235937a2e56a60f90fc1b3aebfb2Daniel Dunbar Args.AddLastArg(CmdArgs, options::OPT_femit_all_decls); 26183aaf082689d3235937a2e56a60f90fc1b3aebfb2Daniel Dunbar Args.AddLastArg(CmdArgs, options::OPT_fheinous_gnu_extensions); 2619c69e1cf04323f2e786d40e8a5ba84e77ee1c6827Devang Patel Args.AddLastArg(CmdArgs, options::OPT_flimit_debug_info); 2620033be8bd33e0f84db8158771e13528e071563b73Devang Patel Args.AddLastArg(CmdArgs, options::OPT_fno_limit_debug_info); 2621e88c4513157cc551ed8080b1e3b3b875a9a570e1Eric Christopher Args.AddLastArg(CmdArgs, options::OPT_fno_operator_names); 262217ba267cae596d5eb35fa0963ebcf73571572940Anton Yartsev Args.AddLastArg(CmdArgs, options::OPT_faltivec); 2623246b6aa6763de8c617d564ef33123a8f3293a80eRichard Trieu Args.AddLastArg(CmdArgs, options::OPT_fdiagnostics_show_template_tree); 2624246b6aa6763de8c617d564ef33123a8f3293a80eRichard Trieu Args.AddLastArg(CmdArgs, options::OPT_fno_elide_type); 26254574c3d75edb0a496d36246b760094f3acf1ba27Chad Rosier 2626bb1071c0568db9bd7934e869a53d671632eb9291Alexey Samsonov SanitizerArgs Sanitize(D, Args); 2627c4dabadb51475e76b606024f144e7cf93b0bad00Richard Smith Sanitize.addArgs(Args, CmdArgs); 2628c4dabadb51475e76b606024f144e7cf93b0bad00Richard Smith 26292d382d149b442b928fd3fb8edcc8d82ea9325872Will Dietz if (!Args.hasFlag(options::OPT_fsanitize_recover, 26302d382d149b442b928fd3fb8edcc8d82ea9325872Will Dietz options::OPT_fno_sanitize_recover, 26312d382d149b442b928fd3fb8edcc8d82ea9325872Will Dietz true)) 26322d382d149b442b928fd3fb8edcc8d82ea9325872Will Dietz CmdArgs.push_back("-fno-sanitize-recover"); 26332d382d149b442b928fd3fb8edcc8d82ea9325872Will Dietz 263478d85b1c5830a881c0a20a1b3fea99ee73149590Chad Rosier if (Args.hasArg(options::OPT_fcatch_undefined_behavior) || 263578d85b1c5830a881c0a20a1b3fea99ee73149590Chad Rosier Args.hasFlag(options::OPT_fsanitize_undefined_trap_on_error, 263678d85b1c5830a881c0a20a1b3fea99ee73149590Chad Rosier options::OPT_fno_sanitize_undefined_trap_on_error, false)) 263778d85b1c5830a881c0a20a1b3fea99ee73149590Chad Rosier CmdArgs.push_back("-fsanitize-undefined-trap-on-error"); 263878d85b1c5830a881c0a20a1b3fea99ee73149590Chad Rosier 263998654c938da09e045ff3c18324d26d52d36ee155Eric Christopher // Report an error for -faltivec on anything other than PowerPC. 26404574c3d75edb0a496d36246b760094f3acf1ba27Chad Rosier if (const Arg *A = Args.getLastArg(options::OPT_faltivec)) 26414574c3d75edb0a496d36246b760094f3acf1ba27Chad Rosier if (!(getToolChain().getTriple().getArch() == llvm::Triple::ppc || 26424574c3d75edb0a496d36246b760094f3acf1ba27Chad Rosier getToolChain().getTriple().getArch() == llvm::Triple::ppc64)) 26434574c3d75edb0a496d36246b760094f3acf1ba27Chad Rosier D.Diag(diag::err_drv_argument_only_allowed_with) 26444574c3d75edb0a496d36246b760094f3acf1ba27Chad Rosier << A->getAsString(Args) << "ppc/ppc64"; 26454574c3d75edb0a496d36246b760094f3acf1ba27Chad Rosier 2646bbe8e3eff56ac1d79f3668d706536e3cebe28c18Daniel Dunbar if (getToolChain().SupportsProfiling()) 2647bbe8e3eff56ac1d79f3668d706536e3cebe28c18Daniel Dunbar Args.AddLastArg(CmdArgs, options::OPT_pg); 26488c6fa84b2e4a30317b7b214a7657cb593d67773bDaniel Dunbar 26498c6fa84b2e4a30317b7b214a7657cb593d67773bDaniel Dunbar // -flax-vector-conversions is default. 26508c6fa84b2e4a30317b7b214a7657cb593d67773bDaniel Dunbar if (!Args.hasFlag(options::OPT_flax_vector_conversions, 26518c6fa84b2e4a30317b7b214a7657cb593d67773bDaniel Dunbar options::OPT_fno_lax_vector_conversions)) 26528c6fa84b2e4a30317b7b214a7657cb593d67773bDaniel Dunbar CmdArgs.push_back("-fno-lax-vector-conversions"); 26538c6fa84b2e4a30317b7b214a7657cb593d67773bDaniel Dunbar 2654b466d01e464b21832c23eeed90112bc5c26c0236Fariborz Jahanian if (Args.getLastArg(options::OPT_fapple_kext)) 2655b466d01e464b21832c23eeed90112bc5c26c0236Fariborz Jahanian CmdArgs.push_back("-fapple-kext"); 2656b466d01e464b21832c23eeed90112bc5c26c0236Fariborz Jahanian 2657940152f726353e08e3bdcef6f85bc8aa73173597David Blaikie if (Args.hasFlag(options::OPT_frewrite_includes, 2658940152f726353e08e3bdcef6f85bc8aa73173597David Blaikie options::OPT_fno_rewrite_includes, false)) 2659940152f726353e08e3bdcef6f85bc8aa73173597David Blaikie CmdArgs.push_back("-frewrite-includes"); 2660940152f726353e08e3bdcef6f85bc8aa73173597David Blaikie 266134e65770ad6142b033d6cec4f476ed20fb248bf3Fariborz Jahanian Args.AddLastArg(CmdArgs, options::OPT_fobjc_sender_dependent_dispatch); 2662182e09240a33c6f1d303deecabec6e0e9c9d109dChris Lattner Args.AddLastArg(CmdArgs, options::OPT_fdiagnostics_print_source_range_info); 26634786c15f4977c7cee98fde3ebdee213dba23848bDouglas Gregor Args.AddLastArg(CmdArgs, options::OPT_fdiagnostics_parseable_fixits); 26643aaf082689d3235937a2e56a60f90fc1b3aebfb2Daniel Dunbar Args.AddLastArg(CmdArgs, options::OPT_ftime_report); 26653aaf082689d3235937a2e56a60f90fc1b3aebfb2Daniel Dunbar Args.AddLastArg(CmdArgs, options::OPT_ftrapv); 26667f18e67e1b577a50402e8b43508ab2311a5c45b5David Chisnall 26677f18e67e1b577a50402e8b43508ab2311a5c45b5David Chisnall if (Arg *A = Args.getLastArg(options::OPT_ftrapv_handler_EQ)) { 26687f18e67e1b577a50402e8b43508ab2311a5c45b5David Chisnall CmdArgs.push_back("-ftrapv-handler"); 26691d489cf4a04ad0ad8ac2696e4eed0995f3a67288Richard Smith CmdArgs.push_back(A->getValue()); 26707f18e67e1b577a50402e8b43508ab2311a5c45b5David Chisnall } 26717f18e67e1b577a50402e8b43508ab2311a5c45b5David Chisnall 267271fd6cc843719cab528a5df0899ad3d15cb9297fBob Wilson Args.AddLastArg(CmdArgs, options::OPT_ftrap_function_EQ); 267349af1f3cedc55726e4a3dd343eb4a8e24eab8439Evan Cheng 26745adb5a84bfb4f2e5f1ea28fdfc6ee1cd9b622c60Chandler Carruth // -fno-strict-overflow implies -fwrapv if it isn't disabled, but 26755adb5a84bfb4f2e5f1ea28fdfc6ee1cd9b622c60Chandler Carruth // -fstrict-overflow won't turn off an explicitly enabled -fwrapv. 26765adb5a84bfb4f2e5f1ea28fdfc6ee1cd9b622c60Chandler Carruth if (Arg *A = Args.getLastArg(options::OPT_fwrapv, 26775adb5a84bfb4f2e5f1ea28fdfc6ee1cd9b622c60Chandler Carruth options::OPT_fno_wrapv)) { 26785adb5a84bfb4f2e5f1ea28fdfc6ee1cd9b622c60Chandler Carruth if (A->getOption().matches(options::OPT_fwrapv)) 26795adb5a84bfb4f2e5f1ea28fdfc6ee1cd9b622c60Chandler Carruth CmdArgs.push_back("-fwrapv"); 26805adb5a84bfb4f2e5f1ea28fdfc6ee1cd9b622c60Chandler Carruth } else if (Arg *A = Args.getLastArg(options::OPT_fstrict_overflow, 26815adb5a84bfb4f2e5f1ea28fdfc6ee1cd9b622c60Chandler Carruth options::OPT_fno_strict_overflow)) { 26825adb5a84bfb4f2e5f1ea28fdfc6ee1cd9b622c60Chandler Carruth if (A->getOption().matches(options::OPT_fno_strict_overflow)) 26835adb5a84bfb4f2e5f1ea28fdfc6ee1cd9b622c60Chandler Carruth CmdArgs.push_back("-fwrapv"); 26845adb5a84bfb4f2e5f1ea28fdfc6ee1cd9b622c60Chandler Carruth } 26853aaf082689d3235937a2e56a60f90fc1b3aebfb2Daniel Dunbar Args.AddLastArg(CmdArgs, options::OPT_fwritable_strings); 2686f84d409903dd4107c8cef5a08fcfce6e5c21d4deEric Christopher Args.AddLastArg(CmdArgs, options::OPT_funroll_loops); 26871d46033f760ba5fd266ce59fe391fac473f04f52Daniel Dunbar 26885345c391c65d1780a0d7b0102b7f735cc3f82732Daniel Dunbar Args.AddLastArg(CmdArgs, options::OPT_pthread); 26895345c391c65d1780a0d7b0102b7f735cc3f82732Daniel Dunbar 2690f3b52315e2ee52bdff9cba31b037c7e6b3adfadcMahesha S 26919e5cc6b703b2d0013f13800c2ffbeb3cf85fcfadDaniel Dunbar // -stack-protector=0 is default. 26929e5cc6b703b2d0013f13800c2ffbeb3cf85fcfadDaniel Dunbar unsigned StackProtectorLevel = 0; 269345483f7a1b3e57b4603b141bee80596b2d4dd443Bill Wendling if (Arg *A = Args.getLastArg(options::OPT_fno_stack_protector, 269445483f7a1b3e57b4603b141bee80596b2d4dd443Bill Wendling options::OPT_fstack_protector_all, 269545483f7a1b3e57b4603b141bee80596b2d4dd443Bill Wendling options::OPT_fstack_protector)) { 26969e5cc6b703b2d0013f13800c2ffbeb3cf85fcfadDaniel Dunbar if (A->getOption().matches(options::OPT_fstack_protector)) 26979e5cc6b703b2d0013f13800c2ffbeb3cf85fcfadDaniel Dunbar StackProtectorLevel = 1; 26989e5cc6b703b2d0013f13800c2ffbeb3cf85fcfadDaniel Dunbar else if (A->getOption().matches(options::OPT_fstack_protector_all)) 26999e5cc6b703b2d0013f13800c2ffbeb3cf85fcfadDaniel Dunbar StackProtectorLevel = 2; 27002fef11164cbe804f7b808c07757c6f900c08d765Nico Weber } else { 27012fef11164cbe804f7b808c07757c6f900c08d765Nico Weber StackProtectorLevel = 27022fef11164cbe804f7b808c07757c6f900c08d765Nico Weber getToolChain().GetDefaultStackProtectorLevel(KernelOrKext); 27032fef11164cbe804f7b808c07757c6f900c08d765Nico Weber } 27049e5cc6b703b2d0013f13800c2ffbeb3cf85fcfadDaniel Dunbar if (StackProtectorLevel) { 27059e5cc6b703b2d0013f13800c2ffbeb3cf85fcfadDaniel Dunbar CmdArgs.push_back("-stack-protector"); 27065f9e272e632e951b1efe824cd16acb4d96077930Chris Lattner CmdArgs.push_back(Args.MakeArgString(Twine(StackProtectorLevel))); 270753b43a78d575e9e8d0af7a3f4b0a744679d65994Joerg Sonnenberger } 2708a7afeb040416c0eaac19b92db914913a788044f5Chad Rosier 270953b43a78d575e9e8d0af7a3f4b0a744679d65994Joerg Sonnenberger // --param ssp-buffer-size= 271053b43a78d575e9e8d0af7a3f4b0a744679d65994Joerg Sonnenberger for (arg_iterator it = Args.filtered_begin(options::OPT__param), 271153b43a78d575e9e8d0af7a3f4b0a744679d65994Joerg Sonnenberger ie = Args.filtered_end(); it != ie; ++it) { 27121d489cf4a04ad0ad8ac2696e4eed0995f3a67288Richard Smith StringRef Str((*it)->getValue()); 271353b43a78d575e9e8d0af7a3f4b0a744679d65994Joerg Sonnenberger if (Str.startswith("ssp-buffer-size=")) { 271453b43a78d575e9e8d0af7a3f4b0a744679d65994Joerg Sonnenberger if (StackProtectorLevel) { 2715a7afeb040416c0eaac19b92db914913a788044f5Chad Rosier CmdArgs.push_back("-stack-protector-buffer-size"); 2716a7afeb040416c0eaac19b92db914913a788044f5Chad Rosier // FIXME: Verify the argument is a valid integer. 2717a7afeb040416c0eaac19b92db914913a788044f5Chad Rosier CmdArgs.push_back(Args.MakeArgString(Str.drop_front(16))); 2718a7afeb040416c0eaac19b92db914913a788044f5Chad Rosier } 271953b43a78d575e9e8d0af7a3f4b0a744679d65994Joerg Sonnenberger (*it)->claim(); 2720a7afeb040416c0eaac19b92db914913a788044f5Chad Rosier } 272145483f7a1b3e57b4603b141bee80596b2d4dd443Bill Wendling } 272245483f7a1b3e57b4603b141bee80596b2d4dd443Bill Wendling 27234e785c908ae01519d3592eae2828e2cc94fb02ebNick Lewycky // Translate -mstackrealign 27244e785c908ae01519d3592eae2828e2cc94fb02ebNick Lewycky if (Args.hasFlag(options::OPT_mstackrealign, options::OPT_mno_stackrealign, 27254e785c908ae01519d3592eae2828e2cc94fb02ebNick Lewycky false)) { 27264e785c908ae01519d3592eae2828e2cc94fb02ebNick Lewycky CmdArgs.push_back("-backend-option"); 27274e785c908ae01519d3592eae2828e2cc94fb02ebNick Lewycky CmdArgs.push_back("-force-align-stack"); 27284e785c908ae01519d3592eae2828e2cc94fb02ebNick Lewycky } 27294e785c908ae01519d3592eae2828e2cc94fb02ebNick Lewycky if (!Args.hasFlag(options::OPT_mno_stackrealign, options::OPT_mstackrealign, 27304e785c908ae01519d3592eae2828e2cc94fb02ebNick Lewycky false)) { 27314e785c908ae01519d3592eae2828e2cc94fb02ebNick Lewycky CmdArgs.push_back(Args.MakeArgString("-mstackrealign")); 27324e785c908ae01519d3592eae2828e2cc94fb02ebNick Lewycky } 27334e785c908ae01519d3592eae2828e2cc94fb02ebNick Lewycky 2734e9d11dbfe1f3286c5f8a2f2fc8ac759f63890655Joerg Sonnenberger if (Args.hasArg(options::OPT_mstack_alignment)) { 2735e9d11dbfe1f3286c5f8a2f2fc8ac759f63890655Joerg Sonnenberger StringRef alignment = Args.getLastArgValue(options::OPT_mstack_alignment); 2736e9d11dbfe1f3286c5f8a2f2fc8ac759f63890655Joerg Sonnenberger CmdArgs.push_back(Args.MakeArgString("-mstack-alignment=" + alignment)); 27371a584022c86bd0778cf7ad1fbea08c78869cf216Eric Christopher } 2738586a061ad96f750e2a5aefcf3e2ce9e5474cdd61Chad Rosier // -mkernel implies -mstrict-align; don't add the redundant option. 2739586a061ad96f750e2a5aefcf3e2ce9e5474cdd61Chad Rosier if (Args.hasArg(options::OPT_mstrict_align) && !KernelOrKext) { 2740485577dcac0b0877cfb5395b365490a0189c66f5Chad Rosier CmdArgs.push_back("-backend-option"); 2741485577dcac0b0877cfb5395b365490a0189c66f5Chad Rosier CmdArgs.push_back("-arm-strict-align"); 27427e293276281bd5bf8526c064d298082b08f0bd8bChad Rosier } 274388b7cf00fcb582728c642da3927c59468efaf926Eric Christopher 274448d1ef782c8c88066b5febf60f8f456064d7d3f0Daniel Dunbar // Forward -f options with positive and negative forms; we translate 274548d1ef782c8c88066b5febf60f8f456064d7d3f0Daniel Dunbar // these by hand. 274648d1ef782c8c88066b5febf60f8f456064d7d3f0Daniel Dunbar 2747b466d01e464b21832c23eeed90112bc5c26c0236Fariborz Jahanian if (Args.hasArg(options::OPT_mkernel)) { 27482843c1900b6da763885f47d0999e923e7c67fd65Daniel Dunbar if (!Args.hasArg(options::OPT_fapple_kext) && types::isCXX(InputType)) 2749b466d01e464b21832c23eeed90112bc5c26c0236Fariborz Jahanian CmdArgs.push_back("-fapple-kext"); 2750b466d01e464b21832c23eeed90112bc5c26c0236Fariborz Jahanian if (!Args.hasArg(options::OPT_fbuiltin)) 2751b466d01e464b21832c23eeed90112bc5c26c0236Fariborz Jahanian CmdArgs.push_back("-fno-builtin"); 27523d26550ba88d2c15292b3f290d6eadec83749e95Chad Rosier Args.ClaimAllArgs(options::OPT_fno_builtin); 2753b466d01e464b21832c23eeed90112bc5c26c0236Fariborz Jahanian } 27549e5cc6b703b2d0013f13800c2ffbeb3cf85fcfadDaniel Dunbar // -fbuiltin is default. 2755b466d01e464b21832c23eeed90112bc5c26c0236Fariborz Jahanian else if (!Args.hasFlag(options::OPT_fbuiltin, options::OPT_fno_builtin)) 275653e8484581ca358c3a2ccd8ea39c136c6e85d606Daniel Dunbar CmdArgs.push_back("-fno-builtin"); 275748d1ef782c8c88066b5febf60f8f456064d7d3f0Daniel Dunbar 2758fc2844846e91398205fddc71196fe9dda04e105fNuno Lopes if (!Args.hasFlag(options::OPT_fassume_sane_operator_new, 2759fc2844846e91398205fddc71196fe9dda04e105fNuno Lopes options::OPT_fno_assume_sane_operator_new)) 2760fc2844846e91398205fddc71196fe9dda04e105fNuno Lopes CmdArgs.push_back("-fno-assume-sane-operator-new"); 2761fc2844846e91398205fddc71196fe9dda04e105fNuno Lopes 27629e5cc6b703b2d0013f13800c2ffbeb3cf85fcfadDaniel Dunbar // -fblocks=0 is default. 27639e5cc6b703b2d0013f13800c2ffbeb3cf85fcfadDaniel Dunbar if (Args.hasFlag(options::OPT_fblocks, options::OPT_fno_blocks, 2764e6533ffc680e84cd193b4ea0d81548e251cb1f2fDavid Chisnall getToolChain().IsBlocksDefault()) || 2765e6533ffc680e84cd193b4ea0d81548e251cb1f2fDavid Chisnall (Args.hasArg(options::OPT_fgnu_runtime) && 2766e6533ffc680e84cd193b4ea0d81548e251cb1f2fDavid Chisnall Args.hasArg(options::OPT_fobjc_nonfragile_abi) && 2767e6533ffc680e84cd193b4ea0d81548e251cb1f2fDavid Chisnall !Args.hasArg(options::OPT_fno_blocks))) { 27689e5cc6b703b2d0013f13800c2ffbeb3cf85fcfadDaniel Dunbar CmdArgs.push_back("-fblocks"); 276913db5cfc4e5f03eb70efe0d227b53b8280f16161John McCall 277013db5cfc4e5f03eb70efe0d227b53b8280f16161John McCall if (!Args.hasArg(options::OPT_fgnu_runtime) && 277113db5cfc4e5f03eb70efe0d227b53b8280f16161John McCall !getToolChain().hasBlocksRuntime()) 277213db5cfc4e5f03eb70efe0d227b53b8280f16161John McCall CmdArgs.push_back("-fblocks-runtime-optional"); 27735e530af5d51572a0ed5dbe50da54bd333840c63dDavid Chisnall } 277448d1ef782c8c88066b5febf60f8f456064d7d3f0Daniel Dunbar 277564554ba9fc5f251108fd7d10a9c218e7bf985941Douglas Gregor // -fmodules enables modules (off by default). However, for C++/Objective-C++, 277664554ba9fc5f251108fd7d10a9c218e7bf985941Douglas Gregor // users must also pass -fcxx-modules. The latter flag will disappear once the 277764554ba9fc5f251108fd7d10a9c218e7bf985941Douglas Gregor // modules implementation is solid for C++/Objective-C++ programs as well. 2778f43b7214e812ddca74a6213608c69c960e067956Douglas Gregor bool HaveModules = false; 277964554ba9fc5f251108fd7d10a9c218e7bf985941Douglas Gregor if (Args.hasFlag(options::OPT_fmodules, options::OPT_fno_modules, false)) { 278064554ba9fc5f251108fd7d10a9c218e7bf985941Douglas Gregor bool AllowedInCXX = Args.hasFlag(options::OPT_fcxx_modules, 278164554ba9fc5f251108fd7d10a9c218e7bf985941Douglas Gregor options::OPT_fno_cxx_modules, 278264554ba9fc5f251108fd7d10a9c218e7bf985941Douglas Gregor false); 2783f43b7214e812ddca74a6213608c69c960e067956Douglas Gregor if (AllowedInCXX || !types::isCXX(InputType)) { 278464554ba9fc5f251108fd7d10a9c218e7bf985941Douglas Gregor CmdArgs.push_back("-fmodules"); 2785f43b7214e812ddca74a6213608c69c960e067956Douglas Gregor HaveModules = true; 2786f43b7214e812ddca74a6213608c69c960e067956Douglas Gregor } 2787f43b7214e812ddca74a6213608c69c960e067956Douglas Gregor } 2788f43b7214e812ddca74a6213608c69c960e067956Douglas Gregor 2789953a61f26bf79932b9699b09add4c388764de170Douglas Gregor // If a module path was provided, pass it along. Otherwise, use a temporary 2790953a61f26bf79932b9699b09add4c388764de170Douglas Gregor // directory. 2791953a61f26bf79932b9699b09add4c388764de170Douglas Gregor if (Arg *A = Args.getLastArg(options::OPT_fmodules_cache_path)) { 2792953a61f26bf79932b9699b09add4c388764de170Douglas Gregor A->claim(); 2793953a61f26bf79932b9699b09add4c388764de170Douglas Gregor if (HaveModules) { 2794953a61f26bf79932b9699b09add4c388764de170Douglas Gregor A->render(Args, CmdArgs); 2795953a61f26bf79932b9699b09add4c388764de170Douglas Gregor } 2796953a61f26bf79932b9699b09add4c388764de170Douglas Gregor } else if (HaveModules) { 2797953a61f26bf79932b9699b09add4c388764de170Douglas Gregor SmallString<128> DefaultModuleCache; 2798953a61f26bf79932b9699b09add4c388764de170Douglas Gregor llvm::sys::path::system_temp_directory(/*erasedOnReboot=*/false, 2799953a61f26bf79932b9699b09add4c388764de170Douglas Gregor DefaultModuleCache); 2800953a61f26bf79932b9699b09add4c388764de170Douglas Gregor llvm::sys::path::append(DefaultModuleCache, "clang-module-cache"); 2801250172a851a886c0763b5fd61c20bf21791c21e9Douglas Gregor const char Arg[] = "-fmodules-cache-path="; 2802250172a851a886c0763b5fd61c20bf21791c21e9Douglas Gregor DefaultModuleCache.insert(DefaultModuleCache.begin(), 2803250172a851a886c0763b5fd61c20bf21791c21e9Douglas Gregor Arg, Arg + strlen(Arg)); 2804953a61f26bf79932b9699b09add4c388764de170Douglas Gregor CmdArgs.push_back(Args.MakeArgString(DefaultModuleCache)); 2805953a61f26bf79932b9699b09add4c388764de170Douglas Gregor } 2806953a61f26bf79932b9699b09add4c388764de170Douglas Gregor 2807953a61f26bf79932b9699b09add4c388764de170Douglas Gregor // Pass through all -fmodules-ignore-macro arguments. 2808953a61f26bf79932b9699b09add4c388764de170Douglas Gregor Args.AddAllArgs(CmdArgs, options::OPT_fmodules_ignore_macro); 2809953a61f26bf79932b9699b09add4c388764de170Douglas Gregor 2810f43b7214e812ddca74a6213608c69c960e067956Douglas Gregor // -fmodules-autolink (on by default when modules is enabled) automatically 28114c1adcc50df4f825150833ad36ef15a0dc1d8b1cTed Kremenek // links against libraries for imported modules. This requires the 28124c1adcc50df4f825150833ad36ef15a0dc1d8b1cTed Kremenek // integrated assembler. 2813af370e6e051e505016637e23418354db625dc796Rafael Espindola if (HaveModules && getToolChain().useIntegratedAs() && 2814f43b7214e812ddca74a6213608c69c960e067956Douglas Gregor Args.hasFlag(options::OPT_fmodules_autolink, 2815f43b7214e812ddca74a6213608c69c960e067956Douglas Gregor options::OPT_fno_modules_autolink, 2816f43b7214e812ddca74a6213608c69c960e067956Douglas Gregor true)) { 2817f43b7214e812ddca74a6213608c69c960e067956Douglas Gregor CmdArgs.push_back("-fmodules-autolink"); 281864554ba9fc5f251108fd7d10a9c218e7bf985941Douglas Gregor } 28197025d2cc327ec75353454586df2987afce5e5789Douglas Gregor 282032579cf507d088e776b67327c5d6bc46e1f217ccJohn McCall // -faccess-control is default. 28217002f4c03c2d0544f4e8bea8d3a5636519081e35John McCall if (Args.hasFlag(options::OPT_fno_access_control, 28227002f4c03c2d0544f4e8bea8d3a5636519081e35John McCall options::OPT_faccess_control, 282332579cf507d088e776b67327c5d6bc46e1f217ccJohn McCall false)) 28247002f4c03c2d0544f4e8bea8d3a5636519081e35John McCall CmdArgs.push_back("-fno-access-control"); 28253ddd6e026a173e9519e84e27f8d6aed5473b8b4eJohn McCall 2826a4c2475961184a4bad6f6f087eeb1038bb784cadAnders Carlsson // -felide-constructors is the default. 2827a4c2475961184a4bad6f6f087eeb1038bb784cadAnders Carlsson if (Args.hasFlag(options::OPT_fno_elide_constructors, 2828a4c2475961184a4bad6f6f087eeb1038bb784cadAnders Carlsson options::OPT_felide_constructors, 2829a4c2475961184a4bad6f6f087eeb1038bb784cadAnders Carlsson false)) 2830a4c2475961184a4bad6f6f087eeb1038bb784cadAnders Carlsson CmdArgs.push_back("-fno-elide-constructors"); 2831a4c2475961184a4bad6f6f087eeb1038bb784cadAnders Carlsson 28320be42c44f0199c5023b542d6a6d2e66eb594f27dDaniel Dunbar // -frtti is default. 2833afc4baa37c2f38fadf05b15456b10a0994d51b0bChad Rosier if (!Args.hasFlag(options::OPT_frtti, options::OPT_fno_rtti) || 2834c4dabadb51475e76b606024f144e7cf93b0bad00Richard Smith KernelOrKext) { 283553e8484581ca358c3a2ccd8ea39c136c6e85d606Daniel Dunbar CmdArgs.push_back("-fno-rtti"); 2836738f8c278da5950d0d4607de2debe0bdfad64185Mike Stump 2837c4dabadb51475e76b606024f144e7cf93b0bad00Richard Smith // -fno-rtti cannot usefully be combined with -fsanitize=vptr. 2838bb1071c0568db9bd7934e869a53d671632eb9291Alexey Samsonov if (Sanitize.sanitizesVptr()) { 283903c60765c7607cbfb4e1e8593028824dab13ad54NAKAMURA Takumi std::string NoRttiArg = 2840c4dabadb51475e76b606024f144e7cf93b0bad00Richard Smith Args.getLastArg(options::OPT_mkernel, 2841c4dabadb51475e76b606024f144e7cf93b0bad00Richard Smith options::OPT_fapple_kext, 284204fd3820d04032df40ec073a901cade92869c765Richard Smith options::OPT_fno_rtti)->getAsString(Args); 2843c4dabadb51475e76b606024f144e7cf93b0bad00Richard Smith D.Diag(diag::err_drv_argument_not_allowed_with) 2844c4dabadb51475e76b606024f144e7cf93b0bad00Richard Smith << "-fsanitize=vptr" << NoRttiArg; 2845c4dabadb51475e76b606024f144e7cf93b0bad00Richard Smith } 2846c4dabadb51475e76b606024f144e7cf93b0bad00Richard Smith } 2847c4dabadb51475e76b606024f144e7cf93b0bad00Richard Smith 28489631939f82c0eaa6fb3936a0ce58a41adfbc9011Tony Linthicum // -fshort-enums=0 is default for all architectures except Hexagon. 28499a2b9d794bdf349b517ff799170f4409f45d147cArgyrios Kyrtzidis if (Args.hasFlag(options::OPT_fshort_enums, 28509631939f82c0eaa6fb3936a0ce58a41adfbc9011Tony Linthicum options::OPT_fno_short_enums, 28519631939f82c0eaa6fb3936a0ce58a41adfbc9011Tony Linthicum getToolChain().getTriple().getArch() == 28529631939f82c0eaa6fb3936a0ce58a41adfbc9011Tony Linthicum llvm::Triple::hexagon)) 28539a2b9d794bdf349b517ff799170f4409f45d147cArgyrios Kyrtzidis CmdArgs.push_back("-fshort-enums"); 28549a2b9d794bdf349b517ff799170f4409f45d147cArgyrios Kyrtzidis 28551f95e6567faab67f4363d650f73121359c4bdbabDaniel Dunbar // -fsigned-char is default. 28566d2eb4d07d40795131f28d719ef9146a2be500f6Daniel Dunbar if (!Args.hasFlag(options::OPT_fsigned_char, options::OPT_funsigned_char, 28571f95e6567faab67f4363d650f73121359c4bdbabDaniel Dunbar isSignedCharDefault(getToolChain().getTriple()))) 28587674352cf3e8f699914a2f739f1ae8c8c3480813Daniel Dunbar CmdArgs.push_back("-fno-signed-char"); 28595a77973d9bc2c9cdbdb7860dcf3ac795abe258ecEli Friedman 2860a508b7de6c5246ab04ed69d0ab4e9977ec1fb4d4Anders Carlsson // -fthreadsafe-static is default. 286120249a1af2e462dcafdd6a350f1c7967b264ff25Michael J. Spencer if (!Args.hasFlag(options::OPT_fthreadsafe_statics, 2862a508b7de6c5246ab04ed69d0ab4e9977ec1fb4d4Anders Carlsson options::OPT_fno_threadsafe_statics)) 2863a508b7de6c5246ab04ed69d0ab4e9977ec1fb4d4Anders Carlsson CmdArgs.push_back("-fno-threadsafe-statics"); 2864a508b7de6c5246ab04ed69d0ab4e9977ec1fb4d4Anders Carlsson 2865efb0fa9e11f75af51744a6159530ef7cc8efa24aDaniel Dunbar // -fuse-cxa-atexit is default. 2866afc4baa37c2f38fadf05b15456b10a0994d51b0bChad Rosier if (!Args.hasFlag(options::OPT_fuse_cxa_atexit, 2867afc4baa37c2f38fadf05b15456b10a0994d51b0bChad Rosier options::OPT_fno_use_cxa_atexit, 2868afc4baa37c2f38fadf05b15456b10a0994d51b0bChad Rosier getToolChain().getTriple().getOS() != llvm::Triple::Cygwin && 28699631939f82c0eaa6fb3936a0ce58a41adfbc9011Tony Linthicum getToolChain().getTriple().getOS() != llvm::Triple::MinGW32 && 2870afc4baa37c2f38fadf05b15456b10a0994d51b0bChad Rosier getToolChain().getTriple().getArch() != llvm::Triple::hexagon) || 2871afc4baa37c2f38fadf05b15456b10a0994d51b0bChad Rosier KernelOrKext) 2872efb0fa9e11f75af51744a6159530ef7cc8efa24aDaniel Dunbar CmdArgs.push_back("-fno-use-cxa-atexit"); 2873efb0fa9e11f75af51744a6159530ef7cc8efa24aDaniel Dunbar 28740be42c44f0199c5023b542d6a6d2e66eb594f27dDaniel Dunbar // -fms-extensions=0 is default. 28756d2eb4d07d40795131f28d719ef9146a2be500f6Daniel Dunbar if (Args.hasFlag(options::OPT_fms_extensions, options::OPT_fno_ms_extensions, 28760be42c44f0199c5023b542d6a6d2e66eb594f27dDaniel Dunbar getToolChain().getTriple().getOS() == llvm::Triple::Win32)) 28770be42c44f0199c5023b542d6a6d2e66eb594f27dDaniel Dunbar CmdArgs.push_back("-fms-extensions"); 28780be42c44f0199c5023b542d6a6d2e66eb594f27dDaniel Dunbar 2879ae55608a29d61737b7c5390e2d1bb30ab8d5febbFrancois Pichet // -fms-compatibility=0 is default. 2880ba97b6ea0e8933ab801b0d06bba133836627794aDouglas Gregor if (Args.hasFlag(options::OPT_fms_compatibility, 2881ba97b6ea0e8933ab801b0d06bba133836627794aDouglas Gregor options::OPT_fno_ms_compatibility, 2882ba97b6ea0e8933ab801b0d06bba133836627794aDouglas Gregor (getToolChain().getTriple().getOS() == llvm::Triple::Win32 && 2883ba97b6ea0e8933ab801b0d06bba133836627794aDouglas Gregor Args.hasFlag(options::OPT_fms_extensions, 2884ba97b6ea0e8933ab801b0d06bba133836627794aDouglas Gregor options::OPT_fno_ms_extensions, 2885ba97b6ea0e8933ab801b0d06bba133836627794aDouglas Gregor true)))) 2886ae55608a29d61737b7c5390e2d1bb30ab8d5febbFrancois Pichet CmdArgs.push_back("-fms-compatibility"); 2887ae55608a29d61737b7c5390e2d1bb30ab8d5febbFrancois Pichet 2888dae4ac4fe56ec60fc93b3e3c9f51e79e682084b9Michael J. Spencer // -fmsc-version=1300 is default. 2889dae4ac4fe56ec60fc93b3e3c9f51e79e682084b9Michael J. Spencer if (Args.hasFlag(options::OPT_fms_extensions, options::OPT_fno_ms_extensions, 2890dae4ac4fe56ec60fc93b3e3c9f51e79e682084b9Michael J. Spencer getToolChain().getTriple().getOS() == llvm::Triple::Win32) || 2891dae4ac4fe56ec60fc93b3e3c9f51e79e682084b9Michael J. Spencer Args.hasArg(options::OPT_fmsc_version)) { 28925f9e272e632e951b1efe824cd16acb4d96077930Chris Lattner StringRef msc_ver = Args.getLastArgValue(options::OPT_fmsc_version); 2893dae4ac4fe56ec60fc93b3e3c9f51e79e682084b9Michael J. Spencer if (msc_ver.empty()) 2894dae4ac4fe56ec60fc93b3e3c9f51e79e682084b9Michael J. Spencer CmdArgs.push_back("-fmsc-version=1300"); 2895dae4ac4fe56ec60fc93b3e3c9f51e79e682084b9Michael J. Spencer else 2896dae4ac4fe56ec60fc93b3e3c9f51e79e682084b9Michael J. Spencer CmdArgs.push_back(Args.MakeArgString("-fmsc-version=" + msc_ver)); 2897dae4ac4fe56ec60fc93b3e3c9f51e79e682084b9Michael J. Spencer } 2898dae4ac4fe56ec60fc93b3e3c9f51e79e682084b9Michael J. Spencer 2899dae4ac4fe56ec60fc93b3e3c9f51e79e682084b9Michael J. Spencer 2900cfc01e45dd2ea51017aea299431c119dbcd94e53Eric Christopher // -fno-borland-extensions is default. 2901400b607546a8dbfcee3b690f3d0a2fee0ea6480bDawn Perchik if (Args.hasFlag(options::OPT_fborland_extensions, 2902400b607546a8dbfcee3b690f3d0a2fee0ea6480bDawn Perchik options::OPT_fno_borland_extensions, false)) 2903400b607546a8dbfcee3b690f3d0a2fee0ea6480bDawn Perchik CmdArgs.push_back("-fborland-extensions"); 2904400b607546a8dbfcee3b690f3d0a2fee0ea6480bDawn Perchik 29058efcc0184a6dfe1ea799d3a6b9c1312ef1fac11dFrancois Pichet // -fno-delayed-template-parsing is default, except for Windows where MSVC STL 29068efcc0184a6dfe1ea799d3a6b9c1312ef1fac11dFrancois Pichet // needs it. 29078387e2a41eef6fa17fb140a18c29b6eee9dd2b8aFrancois Pichet if (Args.hasFlag(options::OPT_fdelayed_template_parsing, 29088387e2a41eef6fa17fb140a18c29b6eee9dd2b8aFrancois Pichet options::OPT_fno_delayed_template_parsing, 29098efcc0184a6dfe1ea799d3a6b9c1312ef1fac11dFrancois Pichet getToolChain().getTriple().getOS() == llvm::Triple::Win32)) 2910805bc1f6fb9b7bc85222d0211761a8c624f2dd75Francois Pichet CmdArgs.push_back("-fdelayed-template-parsing"); 29118387e2a41eef6fa17fb140a18c29b6eee9dd2b8aFrancois Pichet 2912eb5d7b752651283de5abfcc2f91df7227582a08dChandler Carruth // -fgnu-keywords default varies depending on language; only pass if 2913eb5d7b752651283de5abfcc2f91df7227582a08dChandler Carruth // specified. 2914eb5d7b752651283de5abfcc2f91df7227582a08dChandler Carruth if (Arg *A = Args.getLastArg(options::OPT_fgnu_keywords, 291540788d909ad52fc732fe0769d0ef22e5edad5e47Daniel Dunbar options::OPT_fno_gnu_keywords)) 291640788d909ad52fc732fe0769d0ef22e5edad5e47Daniel Dunbar A->render(Args, CmdArgs); 2917eb5d7b752651283de5abfcc2f91df7227582a08dChandler Carruth 291801ba8545fb6bae2a370606b4f40f0d17eb0a8c6cRafael Espindola if (Args.hasFlag(options::OPT_fgnu89_inline, 291901ba8545fb6bae2a370606b4f40f0d17eb0a8c6cRafael Espindola options::OPT_fno_gnu89_inline, 292001ba8545fb6bae2a370606b4f40f0d17eb0a8c6cRafael Espindola false)) 2921fb3f4aad0436a9c40e9130598162150890c405b5Rafael Espindola CmdArgs.push_back("-fgnu89-inline"); 2922fb3f4aad0436a9c40e9130598162150890c405b5Rafael Espindola 2923fc055f943d154c9b7463f43a3b59e093723362c9Chad Rosier if (Args.hasArg(options::OPT_fno_inline)) 2924fc055f943d154c9b7463f43a3b59e093723362c9Chad Rosier CmdArgs.push_back("-fno-inline"); 2925fc055f943d154c9b7463f43a3b59e093723362c9Chad Rosier 2926634a4b1b045b13e7ddfa57934cf2b85d4348f77fChad Rosier if (Args.hasArg(options::OPT_fno_inline_functions)) 2927634a4b1b045b13e7ddfa57934cf2b85d4348f77fChad Rosier CmdArgs.push_back("-fno-inline-functions"); 2928250008b4678b19ef80866702e300bb4e53d9ff2dChad Rosier 2929260611a32535c851237926bfcf78869b13c07d5bJohn McCall ObjCRuntime objcRuntime = AddObjCRuntimeArgs(Args, CmdArgs, rewriteKind); 293020249a1af2e462dcafdd6a350f1c7967b264ff25Michael J. Spencer 2931260611a32535c851237926bfcf78869b13c07d5bJohn McCall // -fobjc-dispatch-method is only relevant with the nonfragile-abi, and 2932260611a32535c851237926bfcf78869b13c07d5bJohn McCall // legacy is the default. 2933260611a32535c851237926bfcf78869b13c07d5bJohn McCall if (objcRuntime.isNonFragile()) { 29343c3ccd283f8c35dbb200a76eacfa17f7861e03bbDavid Chisnall if (!Args.hasFlag(options::OPT_fobjc_legacy_dispatch, 29353c3ccd283f8c35dbb200a76eacfa17f7861e03bbDavid Chisnall options::OPT_fno_objc_legacy_dispatch, 29362c7886ddec1e2cee68daee9866637d2e02f434efDavid Chisnall objcRuntime.isLegacyDispatchDefaultForArch( 29372c7886ddec1e2cee68daee9866637d2e02f434efDavid Chisnall getToolChain().getTriple().getArch()))) { 29383c3ccd283f8c35dbb200a76eacfa17f7861e03bbDavid Chisnall if (getToolChain().UseObjCMixedDispatch()) 29393c3ccd283f8c35dbb200a76eacfa17f7861e03bbDavid Chisnall CmdArgs.push_back("-fobjc-dispatch-method=mixed"); 29403c3ccd283f8c35dbb200a76eacfa17f7861e03bbDavid Chisnall else 29413c3ccd283f8c35dbb200a76eacfa17f7861e03bbDavid Chisnall CmdArgs.push_back("-fobjc-dispatch-method=non-legacy"); 2942984eb8611d9ee46fc6351dee43609f2deed99f3cDaniel Dunbar } 29433c3ccd283f8c35dbb200a76eacfa17f7861e03bbDavid Chisnall } 2944125b4cb35536e45201f8f2cb19ee620e3ad67c49NAKAMURA Takumi 2945df423545a19275559b675bb4f20b6fbe738f0a11Nico Weber // -fobjc-default-synthesize-properties=1 is default. This only has an effect 2946df423545a19275559b675bb4f20b6fbe738f0a11Nico Weber // if the nonfragile objc abi is used. 2947e51fe0972a781e79abae550786ebed7d1da54252Fariborz Jahanian if (getToolChain().IsObjCDefaultSynthPropertiesDefault()) { 29483c3ccd283f8c35dbb200a76eacfa17f7861e03bbDavid Chisnall CmdArgs.push_back("-fobjc-default-synthesize-properties"); 29499e5cc6b703b2d0013f13800c2ffbeb3cf85fcfadDaniel Dunbar } 29509e5cc6b703b2d0013f13800c2ffbeb3cf85fcfadDaniel Dunbar 29513d145f660a23d5bdabdd1ead83c51f3df1489b09Fariborz Jahanian // -fencode-extended-block-signature=1 is default. 29523d145f660a23d5bdabdd1ead83c51f3df1489b09Fariborz Jahanian if (getToolChain().IsEncodeExtendedBlockSignatureDefault()) { 29533d145f660a23d5bdabdd1ead83c51f3df1489b09Fariborz Jahanian CmdArgs.push_back("-fencode-extended-block-signature"); 29543d145f660a23d5bdabdd1ead83c51f3df1489b09Fariborz Jahanian } 29553d145f660a23d5bdabdd1ead83c51f3df1489b09Fariborz Jahanian 29569f084a3166b684573ba49df28fc5792bc37d92e1John McCall // Allow -fno-objc-arr to trump -fobjc-arr/-fobjc-arc. 29579f084a3166b684573ba49df28fc5792bc37d92e1John McCall // NOTE: This logic is duplicated in ToolChains.cpp. 29589f084a3166b684573ba49df28fc5792bc37d92e1John McCall bool ARC = isObjCAutoRefCount(Args); 29599f084a3166b684573ba49df28fc5792bc37d92e1John McCall if (ARC) { 29600a7dd788dbef975f35f273c7ab913f480f7edd60John McCall getToolChain().CheckObjCARC(); 29615840dd9a09c458ef894e7d47caab1d90dc4c1112Argyrios Kyrtzidis 29629f084a3166b684573ba49df28fc5792bc37d92e1John McCall CmdArgs.push_back("-fobjc-arc"); 29639f084a3166b684573ba49df28fc5792bc37d92e1John McCall 29647ffa0325bd61f656697f99434334d425c39af309Chandler Carruth // FIXME: It seems like this entire block, and several around it should be 29657ffa0325bd61f656697f99434334d425c39af309Chandler Carruth // wrapped in isObjC, but for now we just use it here as this is where it 29667ffa0325bd61f656697f99434334d425c39af309Chandler Carruth // was being used previously. 29677ffa0325bd61f656697f99434334d425c39af309Chandler Carruth if (types::isCXX(InputType) && types::isObjC(InputType)) { 29687ffa0325bd61f656697f99434334d425c39af309Chandler Carruth if (getToolChain().GetCXXStdlibType(Args) == ToolChain::CST_Libcxx) 29697ffa0325bd61f656697f99434334d425c39af309Chandler Carruth CmdArgs.push_back("-fobjc-arc-cxxlib=libc++"); 29707ffa0325bd61f656697f99434334d425c39af309Chandler Carruth else 29717ffa0325bd61f656697f99434334d425c39af309Chandler Carruth CmdArgs.push_back("-fobjc-arc-cxxlib=libstdc++"); 29727ffa0325bd61f656697f99434334d425c39af309Chandler Carruth } 29737ffa0325bd61f656697f99434334d425c39af309Chandler Carruth 29749f084a3166b684573ba49df28fc5792bc37d92e1John McCall // Allow the user to enable full exceptions code emission. 29759f084a3166b684573ba49df28fc5792bc37d92e1John McCall // We define off for Objective-CC, on for Objective-C++. 29769f084a3166b684573ba49df28fc5792bc37d92e1John McCall if (Args.hasFlag(options::OPT_fobjc_arc_exceptions, 29779f084a3166b684573ba49df28fc5792bc37d92e1John McCall options::OPT_fno_objc_arc_exceptions, 29789f084a3166b684573ba49df28fc5792bc37d92e1John McCall /*default*/ types::isCXX(InputType))) 29799f084a3166b684573ba49df28fc5792bc37d92e1John McCall CmdArgs.push_back("-fobjc-arc-exceptions"); 29809f084a3166b684573ba49df28fc5792bc37d92e1John McCall } 29819f084a3166b684573ba49df28fc5792bc37d92e1John McCall 29829f084a3166b684573ba49df28fc5792bc37d92e1John McCall // -fobjc-infer-related-result-type is the default, except in the Objective-C 29839f084a3166b684573ba49df28fc5792bc37d92e1John McCall // rewriter. 2984260611a32535c851237926bfcf78869b13c07d5bJohn McCall if (rewriteKind != RK_None) 29859f084a3166b684573ba49df28fc5792bc37d92e1John McCall CmdArgs.push_back("-fno-objc-infer-related-result-type"); 298688b7cf00fcb582728c642da3927c59468efaf926Eric Christopher 29879f084a3166b684573ba49df28fc5792bc37d92e1John McCall // Handle -fobjc-gc and -fobjc-gc-only. They are exclusive, and -fobjc-gc-only 29889f084a3166b684573ba49df28fc5792bc37d92e1John McCall // takes precedence. 29899f084a3166b684573ba49df28fc5792bc37d92e1John McCall const Arg *GCArg = Args.getLastArg(options::OPT_fobjc_gc_only); 29909f084a3166b684573ba49df28fc5792bc37d92e1John McCall if (!GCArg) 29919f084a3166b684573ba49df28fc5792bc37d92e1John McCall GCArg = Args.getLastArg(options::OPT_fobjc_gc); 29929f084a3166b684573ba49df28fc5792bc37d92e1John McCall if (GCArg) { 29939f084a3166b684573ba49df28fc5792bc37d92e1John McCall if (ARC) { 29945f9e272e632e951b1efe824cd16acb4d96077930Chris Lattner D.Diag(diag::err_drv_objc_gc_arr) 29959f084a3166b684573ba49df28fc5792bc37d92e1John McCall << GCArg->getAsString(Args); 29969f084a3166b684573ba49df28fc5792bc37d92e1John McCall } else if (getToolChain().SupportsObjCGC()) { 29979f084a3166b684573ba49df28fc5792bc37d92e1John McCall GCArg->render(Args, CmdArgs); 29989f084a3166b684573ba49df28fc5792bc37d92e1John McCall } else { 29999f084a3166b684573ba49df28fc5792bc37d92e1John McCall // FIXME: We should move this to a hard error. 30005f9e272e632e951b1efe824cd16acb4d96077930Chris Lattner D.Diag(diag::warn_drv_objc_gc_unsupported) 30019f084a3166b684573ba49df28fc5792bc37d92e1John McCall << GCArg->getAsString(Args); 30029f084a3166b684573ba49df28fc5792bc37d92e1John McCall } 30039f084a3166b684573ba49df28fc5792bc37d92e1John McCall } 30049f084a3166b684573ba49df28fc5792bc37d92e1John McCall 3005d71315c5511bd1204732216964faa6254dc4b2b6John McCall // Add exception args. 3006d71315c5511bd1204732216964faa6254dc4b2b6John McCall addExceptionArgs(Args, InputType, getToolChain().getTriple(), 3007260611a32535c851237926bfcf78869b13c07d5bJohn McCall KernelOrKext, objcRuntime, CmdArgs); 3008d71315c5511bd1204732216964faa6254dc4b2b6John McCall 3009d71315c5511bd1204732216964faa6254dc4b2b6John McCall if (getToolChain().UseSjLjExceptions()) 3010d71315c5511bd1204732216964faa6254dc4b2b6John McCall CmdArgs.push_back("-fsjlj-exceptions"); 3011d71315c5511bd1204732216964faa6254dc4b2b6John McCall 3012d71315c5511bd1204732216964faa6254dc4b2b6John McCall // C++ "sane" operator new. 3013984eb8611d9ee46fc6351dee43609f2deed99f3cDaniel Dunbar if (!Args.hasFlag(options::OPT_fassume_sane_operator_new, 3014984eb8611d9ee46fc6351dee43609f2deed99f3cDaniel Dunbar options::OPT_fno_assume_sane_operator_new)) 3015984eb8611d9ee46fc6351dee43609f2deed99f3cDaniel Dunbar CmdArgs.push_back("-fno-assume-sane-operator-new"); 3016984eb8611d9ee46fc6351dee43609f2deed99f3cDaniel Dunbar 3017f35f14d474632142280ec1526d16e87706ce6625Daniel Dunbar // -fconstant-cfstrings is default, and may be subject to argument translation 3018f35f14d474632142280ec1526d16e87706ce6625Daniel Dunbar // on Darwin. 3019f35f14d474632142280ec1526d16e87706ce6625Daniel Dunbar if (!Args.hasFlag(options::OPT_fconstant_cfstrings, 3020f35f14d474632142280ec1526d16e87706ce6625Daniel Dunbar options::OPT_fno_constant_cfstrings) || 3021f35f14d474632142280ec1526d16e87706ce6625Daniel Dunbar !Args.hasFlag(options::OPT_mconstant_cfstrings, 3022f35f14d474632142280ec1526d16e87706ce6625Daniel Dunbar options::OPT_mno_constant_cfstrings)) 3023f35f14d474632142280ec1526d16e87706ce6625Daniel Dunbar CmdArgs.push_back("-fno-constant-cfstrings"); 3024f35f14d474632142280ec1526d16e87706ce6625Daniel Dunbar 3025a6fda124bf380479529d6a80b84b62cacd3cb707John Thompson // -fshort-wchar default varies depending on platform; only 3026a6fda124bf380479529d6a80b84b62cacd3cb707John Thompson // pass if specified. 30271744a3504af13343f4bc0e566f6d7349fc6e3f04Daniel Dunbar if (Arg *A = Args.getLastArg(options::OPT_fshort_wchar)) 30281744a3504af13343f4bc0e566f6d7349fc6e3f04Daniel Dunbar A->render(Args, CmdArgs); 3029a6fda124bf380479529d6a80b84b62cacd3cb707John Thompson 3030ee848a73e5f8ffe7511af8652ba811c020d1c7a0Daniel Dunbar // -fno-pascal-strings is default, only pass non-default. If the tool chain 3031ee848a73e5f8ffe7511af8652ba811c020d1c7a0Daniel Dunbar // happened to translate to -mpascal-strings, we want to back translate here. 303282d00688525c876bf47bce414dedae9c343e67f5Daniel Dunbar // 303382d00688525c876bf47bce414dedae9c343e67f5Daniel Dunbar // FIXME: This is gross; that translation should be pulled from the 303482d00688525c876bf47bce414dedae9c343e67f5Daniel Dunbar // tool chain. 3035c21c485b4fb58ef5d55cf3e523263dd824a2ace4Daniel Dunbar if (Args.hasFlag(options::OPT_fpascal_strings, 303682d00688525c876bf47bce414dedae9c343e67f5Daniel Dunbar options::OPT_fno_pascal_strings, 303782d00688525c876bf47bce414dedae9c343e67f5Daniel Dunbar false) || 303882d00688525c876bf47bce414dedae9c343e67f5Daniel Dunbar Args.hasFlag(options::OPT_mpascal_strings, 303982d00688525c876bf47bce414dedae9c343e67f5Daniel Dunbar options::OPT_mno_pascal_strings, 304082d00688525c876bf47bce414dedae9c343e67f5Daniel Dunbar false)) 304148d1ef782c8c88066b5febf60f8f456064d7d3f0Daniel Dunbar CmdArgs.push_back("-fpascal-strings"); 3042125b4cb35536e45201f8f2cb19ee620e3ad67c49NAKAMURA Takumi 304388934e85f81abdc4fb5202325252be3bcab5ebf0Daniel Dunbar // Honor -fpack-struct= and -fpack-struct, if given. Note that 304488934e85f81abdc4fb5202325252be3bcab5ebf0Daniel Dunbar // -fno-pack-struct doesn't apply to -fpack-struct=. 304588934e85f81abdc4fb5202325252be3bcab5ebf0Daniel Dunbar if (Arg *A = Args.getLastArg(options::OPT_fpack_struct_EQ)) { 30468049c44d972fc7266b4369e8960875c118c067e0James Molloy std::string PackStructStr = "-fpack-struct="; 30471d489cf4a04ad0ad8ac2696e4eed0995f3a67288Richard Smith PackStructStr += A->getValue(); 30488049c44d972fc7266b4369e8960875c118c067e0James Molloy CmdArgs.push_back(Args.MakeArgString(PackStructStr)); 304988934e85f81abdc4fb5202325252be3bcab5ebf0Daniel Dunbar } else if (Args.hasFlag(options::OPT_fpack_struct, 305088934e85f81abdc4fb5202325252be3bcab5ebf0Daniel Dunbar options::OPT_fno_pack_struct, false)) { 30518049c44d972fc7266b4369e8960875c118c067e0James Molloy CmdArgs.push_back("-fpack-struct=1"); 305288934e85f81abdc4fb5202325252be3bcab5ebf0Daniel Dunbar } 305388934e85f81abdc4fb5202325252be3bcab5ebf0Daniel Dunbar 30546c7db8967c383d859eab6d541db816adbeb837a9Eric Christopher if (KernelOrKext) { 3055b466d01e464b21832c23eeed90112bc5c26c0236Fariborz Jahanian if (!Args.hasArg(options::OPT_fcommon)) 3056b466d01e464b21832c23eeed90112bc5c26c0236Fariborz Jahanian CmdArgs.push_back("-fno-common"); 3057ec09b3e0c5d96a1b7a3e797cdff2875eca1e9907Chad Rosier Args.ClaimAllArgs(options::OPT_fno_common); 3058b466d01e464b21832c23eeed90112bc5c26c0236Fariborz Jahanian } 305988934e85f81abdc4fb5202325252be3bcab5ebf0Daniel Dunbar 306048d1ef782c8c88066b5febf60f8f456064d7d3f0Daniel Dunbar // -fcommon is default, only pass non-default. 3061b466d01e464b21832c23eeed90112bc5c26c0236Fariborz Jahanian else if (!Args.hasFlag(options::OPT_fcommon, options::OPT_fno_common)) 306248d1ef782c8c88066b5febf60f8f456064d7d3f0Daniel Dunbar CmdArgs.push_back("-fno-common"); 306348d1ef782c8c88066b5febf60f8f456064d7d3f0Daniel Dunbar 306470d3c92820f590b10553da9c96eda24e4325ba34Daniel Dunbar // -fsigned-bitfields is default, and clang doesn't yet support 306506205ca78ca2fd4384b237f120ec66614df0d9fcDaniel Dunbar // -funsigned-bitfields. 30661eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump if (!Args.hasFlag(options::OPT_fsigned_bitfields, 306770d3c92820f590b10553da9c96eda24e4325ba34Daniel Dunbar options::OPT_funsigned_bitfields)) 30685f9e272e632e951b1efe824cd16acb4d96077930Chris Lattner D.Diag(diag::warn_drv_clang_unsupported) 306970d3c92820f590b10553da9c96eda24e4325ba34Daniel Dunbar << Args.getLastArg(options::OPT_funsigned_bitfields)->getAsString(Args); 307070d3c92820f590b10553da9c96eda24e4325ba34Daniel Dunbar 307106205ca78ca2fd4384b237f120ec66614df0d9fcDaniel Dunbar // -fsigned-bitfields is default, and clang doesn't support -fno-for-scope. 307206205ca78ca2fd4384b237f120ec66614df0d9fcDaniel Dunbar if (!Args.hasFlag(options::OPT_ffor_scope, 307306205ca78ca2fd4384b237f120ec66614df0d9fcDaniel Dunbar options::OPT_fno_for_scope)) 30745f9e272e632e951b1efe824cd16acb4d96077930Chris Lattner D.Diag(diag::err_drv_clang_unsupported) 307506205ca78ca2fd4384b237f120ec66614df0d9fcDaniel Dunbar << Args.getLastArg(options::OPT_fno_for_scope)->getAsString(Args); 307606205ca78ca2fd4384b237f120ec66614df0d9fcDaniel Dunbar 30770ea22fdfda0558393950cef5db50d050e3eb1e60Jeffrey Yasskin // -fcaret-diagnostics is default. 30780ea22fdfda0558393950cef5db50d050e3eb1e60Jeffrey Yasskin if (!Args.hasFlag(options::OPT_fcaret_diagnostics, 30790ea22fdfda0558393950cef5db50d050e3eb1e60Jeffrey Yasskin options::OPT_fno_caret_diagnostics, true)) 30800ea22fdfda0558393950cef5db50d050e3eb1e60Jeffrey Yasskin CmdArgs.push_back("-fno-caret-diagnostics"); 30810ea22fdfda0558393950cef5db50d050e3eb1e60Jeffrey Yasskin 308249138fc59eeac2aacd3b7e04c2642180d5baefd7Daniel Dunbar // -fdiagnostics-fixit-info is default, only pass non-default. 30831eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump if (!Args.hasFlag(options::OPT_fdiagnostics_fixit_info, 308449138fc59eeac2aacd3b7e04c2642180d5baefd7Daniel Dunbar options::OPT_fno_diagnostics_fixit_info)) 308549138fc59eeac2aacd3b7e04c2642180d5baefd7Daniel Dunbar CmdArgs.push_back("-fno-diagnostics-fixit-info"); 308688b7cf00fcb582728c642da3927c59468efaf926Eric Christopher 30879e820ee054fefe5422b4db3f681e567a8976747eDaniel Dunbar // Enable -fdiagnostics-show-option by default. 30881eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump if (Args.hasFlag(options::OPT_fdiagnostics_show_option, 30899e820ee054fefe5422b4db3f681e567a8976747eDaniel Dunbar options::OPT_fno_diagnostics_show_option)) 30909e820ee054fefe5422b4db3f681e567a8976747eDaniel Dunbar CmdArgs.push_back("-fdiagnostics-show-option"); 3091838be483dcf10ea3f2acd85f2cd65adc310011f9Daniel Dunbar 30926fbe8398ba1680ffc5daa7395850ff8765b7905bChris Lattner if (const Arg *A = 30936fbe8398ba1680ffc5daa7395850ff8765b7905bChris Lattner Args.getLastArg(options::OPT_fdiagnostics_show_category_EQ)) { 30946fbe8398ba1680ffc5daa7395850ff8765b7905bChris Lattner CmdArgs.push_back("-fdiagnostics-show-category"); 30951d489cf4a04ad0ad8ac2696e4eed0995f3a67288Richard Smith CmdArgs.push_back(A->getValue()); 30966fbe8398ba1680ffc5daa7395850ff8765b7905bChris Lattner } 3097ca0e0545c216afaacba6da6c82a270dc2efc4e3fDaniel Dunbar 3098c9471b0ff1815ed0149dbfcad0f385ed8648eeb0Douglas Gregor if (const Arg *A = 3099c9471b0ff1815ed0149dbfcad0f385ed8648eeb0Douglas Gregor Args.getLastArg(options::OPT_fdiagnostics_format_EQ)) { 3100c9471b0ff1815ed0149dbfcad0f385ed8648eeb0Douglas Gregor CmdArgs.push_back("-fdiagnostics-format"); 31011d489cf4a04ad0ad8ac2696e4eed0995f3a67288Richard Smith CmdArgs.push_back(A->getValue()); 3102c9471b0ff1815ed0149dbfcad0f385ed8648eeb0Douglas Gregor } 3103c9471b0ff1815ed0149dbfcad0f385ed8648eeb0Douglas Gregor 3104abaca7a8be8e79cc01354676e3bcb26575640311Chandler Carruth if (Arg *A = Args.getLastArg( 3105abaca7a8be8e79cc01354676e3bcb26575640311Chandler Carruth options::OPT_fdiagnostics_show_note_include_stack, 3106abaca7a8be8e79cc01354676e3bcb26575640311Chandler Carruth options::OPT_fno_diagnostics_show_note_include_stack)) { 3107abaca7a8be8e79cc01354676e3bcb26575640311Chandler Carruth if (A->getOption().matches( 3108abaca7a8be8e79cc01354676e3bcb26575640311Chandler Carruth options::OPT_fdiagnostics_show_note_include_stack)) 3109abaca7a8be8e79cc01354676e3bcb26575640311Chandler Carruth CmdArgs.push_back("-fdiagnostics-show-note-include-stack"); 3110abaca7a8be8e79cc01354676e3bcb26575640311Chandler Carruth else 3111abaca7a8be8e79cc01354676e3bcb26575640311Chandler Carruth CmdArgs.push_back("-fno-diagnostics-show-note-include-stack"); 3112abaca7a8be8e79cc01354676e3bcb26575640311Chandler Carruth } 3113abaca7a8be8e79cc01354676e3bcb26575640311Chandler Carruth 3114838be483dcf10ea3f2acd85f2cd65adc310011f9Daniel Dunbar // Color diagnostics are the default, unless the terminal doesn't support 3115838be483dcf10ea3f2acd85f2cd65adc310011f9Daniel Dunbar // them. 3116838be483dcf10ea3f2acd85f2cd65adc310011f9Daniel Dunbar if (Args.hasFlag(options::OPT_fcolor_diagnostics, 3117f765d76407d82e629337bba4ca6c26bdfc8bc9a6Argyrios Kyrtzidis options::OPT_fno_color_diagnostics, 3118f765d76407d82e629337bba4ca6c26bdfc8bc9a6Argyrios Kyrtzidis llvm::sys::Process::StandardErrHasColors())) 3119838be483dcf10ea3f2acd85f2cd65adc310011f9Daniel Dunbar CmdArgs.push_back("-fcolor-diagnostics"); 3120838be483dcf10ea3f2acd85f2cd65adc310011f9Daniel Dunbar 312175eb1d64784946a37fc0b27596e2d92b6cf7033bDaniel Dunbar if (!Args.hasFlag(options::OPT_fshow_source_location, 312275eb1d64784946a37fc0b27596e2d92b6cf7033bDaniel Dunbar options::OPT_fno_show_source_location)) 312375eb1d64784946a37fc0b27596e2d92b6cf7033bDaniel Dunbar CmdArgs.push_back("-fno-show-source-location"); 31249e820ee054fefe5422b4db3f681e567a8976747eDaniel Dunbar 3125c9471b0ff1815ed0149dbfcad0f385ed8648eeb0Douglas Gregor if (!Args.hasFlag(options::OPT_fshow_column, 3126c9471b0ff1815ed0149dbfcad0f385ed8648eeb0Douglas Gregor options::OPT_fno_show_column, 3127c9471b0ff1815ed0149dbfcad0f385ed8648eeb0Douglas Gregor true)) 3128c9471b0ff1815ed0149dbfcad0f385ed8648eeb0Douglas Gregor CmdArgs.push_back("-fno-show-column"); 3129c9471b0ff1815ed0149dbfcad0f385ed8648eeb0Douglas Gregor 3130a0068fc64351db9c47916566e3b85ab733cd8d6dDouglas Gregor if (!Args.hasFlag(options::OPT_fspell_checking, 3131a0068fc64351db9c47916566e3b85ab733cd8d6dDouglas Gregor options::OPT_fno_spell_checking)) 3132a0068fc64351db9c47916566e3b85ab733cd8d6dDouglas Gregor CmdArgs.push_back("-fno-spell-checking"); 3133ca0e0545c216afaacba6da6c82a270dc2efc4e3fDaniel Dunbar 313425b26ebdebe46bb4576247e0c64d1c11410a8e9dDaniel Dunbar 313515490fd42d7d8dca2f9b5b3a9dc074892ca1acd7Chad Rosier // -fno-asm-blocks is default. 313615490fd42d7d8dca2f9b5b3a9dc074892ca1acd7Chad Rosier if (Args.hasFlag(options::OPT_fasm_blocks, options::OPT_fno_asm_blocks, 313715490fd42d7d8dca2f9b5b3a9dc074892ca1acd7Chad Rosier false)) 313815490fd42d7d8dca2f9b5b3a9dc074892ca1acd7Chad Rosier CmdArgs.push_back("-fasm-blocks"); 313925b26ebdebe46bb4576247e0c64d1c11410a8e9dDaniel Dunbar 31400f6ef2879083d3c556b9b74d2df7a07dc0b227d5Nadav Rotem // -fvectorize is default. 3141c04d0934dfc78038ec1c073d9215750bd6a39c76Chad Rosier if (Args.hasFlag(options::OPT_fvectorize, 31420f6ef2879083d3c556b9b74d2df7a07dc0b227d5Nadav Rotem options::OPT_fno_vectorize, true)) { 3143c04d0934dfc78038ec1c073d9215750bd6a39c76Chad Rosier CmdArgs.push_back("-backend-option"); 3144c04d0934dfc78038ec1c073d9215750bd6a39c76Chad Rosier CmdArgs.push_back("-vectorize-loops"); 3145c04d0934dfc78038ec1c073d9215750bd6a39c76Chad Rosier } 3146c04d0934dfc78038ec1c073d9215750bd6a39c76Chad Rosier 3147443c999c967d555f6942834b0924c60226b3e6f2Hal Finkel // -fno-slp-vectorize is default. 3148443c999c967d555f6942834b0924c60226b3e6f2Hal Finkel if (Args.hasFlag(options::OPT_fslp_vectorize, 3149443c999c967d555f6942834b0924c60226b3e6f2Hal Finkel options::OPT_fno_slp_vectorize, false)) { 3150443c999c967d555f6942834b0924c60226b3e6f2Hal Finkel CmdArgs.push_back("-backend-option"); 3151443c999c967d555f6942834b0924c60226b3e6f2Hal Finkel CmdArgs.push_back("-vectorize"); 3152443c999c967d555f6942834b0924c60226b3e6f2Hal Finkel } 3153443c999c967d555f6942834b0924c60226b3e6f2Hal Finkel 31545edbdcc62098e305cd55654814dcf783a3f3c477Jeffrey Yasskin if (Arg *A = Args.getLastArg(options::OPT_fshow_overloads_EQ)) 31555edbdcc62098e305cd55654814dcf783a3f3c477Jeffrey Yasskin A->render(Args, CmdArgs); 31565edbdcc62098e305cd55654814dcf783a3f3c477Jeffrey Yasskin 31577695fba30221613b7cf31276456217c41bb90960Daniel Dunbar // -fdollars-in-identifiers default varies depending on platform and 31587695fba30221613b7cf31276456217c41bb90960Daniel Dunbar // language; only pass if specified. 31591eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump if (Arg *A = Args.getLastArg(options::OPT_fdollars_in_identifiers, 31607695fba30221613b7cf31276456217c41bb90960Daniel Dunbar options::OPT_fno_dollars_in_identifiers)) { 31617695fba30221613b7cf31276456217c41bb90960Daniel Dunbar if (A->getOption().matches(options::OPT_fdollars_in_identifiers)) 31628663b180085e9bc7a0a87c80cc3f722efef99e79Daniel Dunbar CmdArgs.push_back("-fdollars-in-identifiers"); 31637695fba30221613b7cf31276456217c41bb90960Daniel Dunbar else 31648663b180085e9bc7a0a87c80cc3f722efef99e79Daniel Dunbar CmdArgs.push_back("-fno-dollars-in-identifiers"); 31657695fba30221613b7cf31276456217c41bb90960Daniel Dunbar } 31667695fba30221613b7cf31276456217c41bb90960Daniel Dunbar 3167e027a4b2399e9b0acfe0f77220c66bbe369067eeDaniel Dunbar // -funit-at-a-time is default, and we don't support -fno-unit-at-a-time for 3168e027a4b2399e9b0acfe0f77220c66bbe369067eeDaniel Dunbar // practical purposes. 31691eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump if (Arg *A = Args.getLastArg(options::OPT_funit_at_a_time, 3170e027a4b2399e9b0acfe0f77220c66bbe369067eeDaniel Dunbar options::OPT_fno_unit_at_a_time)) { 3171e027a4b2399e9b0acfe0f77220c66bbe369067eeDaniel Dunbar if (A->getOption().matches(options::OPT_fno_unit_at_a_time)) 31725f9e272e632e951b1efe824cd16acb4d96077930Chris Lattner D.Diag(diag::warn_drv_clang_unsupported) << A->getAsString(Args); 3173e027a4b2399e9b0acfe0f77220c66bbe369067eeDaniel Dunbar } 3174ceb5c5b7f67a30fae305d1d19b478b623e4fbcedEli Friedman 317519bda3ad8b5d37e505214e82fab1d0a0bf00f0fdEli Friedman if (Args.hasFlag(options::OPT_fapple_pragma_pack, 317619bda3ad8b5d37e505214e82fab1d0a0bf00f0fdEli Friedman options::OPT_fno_apple_pragma_pack, false)) 317719bda3ad8b5d37e505214e82fab1d0a0bf00f0fdEli Friedman CmdArgs.push_back("-fapple-pragma-pack"); 317819bda3ad8b5d37e505214e82fab1d0a0bf00f0fdEli Friedman 31792ba91575905a54f712a7f64304e56002e4882499Daniel Dunbar // Default to -fno-builtin-str{cat,cpy} on Darwin for ARM. 3180f84a4a469d8a45c76cb941595582a0fd3b9b15d3Daniel Dunbar // 31818ff5b28d6efcffe2251e77634c7edf83a4763344Daniel Dunbar // FIXME: This is disabled until clang -cc1 supports -fno-builtin-foo. PR4941. 3182f84a4a469d8a45c76cb941595582a0fd3b9b15d3Daniel Dunbar#if 0 3183905c45f15a25598620d19160c139c6b785aeea89Bob Wilson if (getToolChain().getTriple().isOSDarwin() && 31842ba91575905a54f712a7f64304e56002e4882499Daniel Dunbar (getToolChain().getTriple().getArch() == llvm::Triple::arm || 31852ba91575905a54f712a7f64304e56002e4882499Daniel Dunbar getToolChain().getTriple().getArch() == llvm::Triple::thumb)) { 31862ba91575905a54f712a7f64304e56002e4882499Daniel Dunbar if (!Args.hasArg(options::OPT_fbuiltin_strcat)) 31872ba91575905a54f712a7f64304e56002e4882499Daniel Dunbar CmdArgs.push_back("-fno-builtin-strcat"); 31882ba91575905a54f712a7f64304e56002e4882499Daniel Dunbar if (!Args.hasArg(options::OPT_fbuiltin_strcpy)) 31892ba91575905a54f712a7f64304e56002e4882499Daniel Dunbar CmdArgs.push_back("-fno-builtin-strcpy"); 31902ba91575905a54f712a7f64304e56002e4882499Daniel Dunbar } 3191f84a4a469d8a45c76cb941595582a0fd3b9b15d3Daniel Dunbar#endif 31922ba91575905a54f712a7f64304e56002e4882499Daniel Dunbar 3193d98750f065fd8d6278df72f6218e3d59b2df2aa9Daniel Dunbar // Only allow -traditional or -traditional-cpp outside in preprocessing modes. 31941eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump if (Arg *A = Args.getLastArg(options::OPT_traditional, 3195d98750f065fd8d6278df72f6218e3d59b2df2aa9Daniel Dunbar options::OPT_traditional_cpp)) { 3196d98750f065fd8d6278df72f6218e3d59b2df2aa9Daniel Dunbar if (isa<PreprocessJobAction>(JA)) 3197d98750f065fd8d6278df72f6218e3d59b2df2aa9Daniel Dunbar CmdArgs.push_back("-traditional-cpp"); 319888b7cf00fcb582728c642da3927c59468efaf926Eric Christopher else 31995f9e272e632e951b1efe824cd16acb4d96077930Chris Lattner D.Diag(diag::err_drv_clang_unsupported) << A->getAsString(Args); 3200d98750f065fd8d6278df72f6218e3d59b2df2aa9Daniel Dunbar } 3201ceb5c5b7f67a30fae305d1d19b478b623e4fbcedEli Friedman 32021d46033f760ba5fd266ce59fe391fac473f04f52Daniel Dunbar Args.AddLastArg(CmdArgs, options::OPT_dM); 3203d82df3ad430397d7f9ef511e7c5157f997c41f53Chris Lattner Args.AddLastArg(CmdArgs, options::OPT_dD); 320436f6e30d5c21a693abf2612ef086e83e9696f0e0Ted Kremenek 320536f6e30d5c21a693abf2612ef086e83e9696f0e0Ted Kremenek // Handle serialized diagnostics. 320636f6e30d5c21a693abf2612ef086e83e9696f0e0Ted Kremenek if (Arg *A = Args.getLastArg(options::OPT__serialize_diags)) { 320736f6e30d5c21a693abf2612ef086e83e9696f0e0Ted Kremenek CmdArgs.push_back("-serialize-diagnostic-file"); 32081d489cf4a04ad0ad8ac2696e4eed0995f3a67288Richard Smith CmdArgs.push_back(Args.MakeArgString(A->getValue())); 320936f6e30d5c21a693abf2612ef086e83e9696f0e0Ted Kremenek } 32101d46033f760ba5fd266ce59fe391fac473f04f52Daniel Dunbar 3211127ff2ea6440c3da4b47f9c8b3b190254a97e7b5Ted Kremenek if (Args.hasArg(options::OPT_fretain_comments_from_system_headers)) 3212127ff2ea6440c3da4b47f9c8b3b190254a97e7b5Ted Kremenek CmdArgs.push_back("-fretain-comments-from-system-headers"); 3213127ff2ea6440c3da4b47f9c8b3b190254a97e7b5Ted Kremenek 32146ebf09130479bc7605aa09a3e6c4dc2ba3513495Dmitri Gribenko // Forward -fcomment-block-commands to -cc1. 32156ebf09130479bc7605aa09a3e6c4dc2ba3513495Dmitri Gribenko Args.AddAllArgs(CmdArgs, options::OPT_fcomment_block_commands); 32166ebf09130479bc7605aa09a3e6c4dc2ba3513495Dmitri Gribenko 32173f87fb08dd502309960646db01099fb4c1be9a7cDaniel Dunbar // Forward -Xclang arguments to -cc1, and -mllvm arguments to the LLVM option 32183f87fb08dd502309960646db01099fb4c1be9a7cDaniel Dunbar // parser. 32191d46033f760ba5fd266ce59fe391fac473f04f52Daniel Dunbar Args.AddAllArgValues(CmdArgs, options::OPT_Xclang); 32203f87fb08dd502309960646db01099fb4c1be9a7cDaniel Dunbar for (arg_iterator it = Args.filtered_begin(options::OPT_mllvm), 32213f87fb08dd502309960646db01099fb4c1be9a7cDaniel Dunbar ie = Args.filtered_end(); it != ie; ++it) { 32227e4953e5c60409007545288f14b430bd23d68570Daniel Dunbar (*it)->claim(); 3223fb36d21960a3bd422665a961eac6ca269cd6445bDaniel Dunbar 32243f87fb08dd502309960646db01099fb4c1be9a7cDaniel Dunbar // We translate this by hand to the -cc1 argument, since nightly test uses 32253f87fb08dd502309960646db01099fb4c1be9a7cDaniel Dunbar // it and developers have been trained to spell it with -mllvm. 32261d489cf4a04ad0ad8ac2696e4eed0995f3a67288Richard Smith if (StringRef((*it)->getValue(0)) == "-disable-llvm-optzns") 32273f87fb08dd502309960646db01099fb4c1be9a7cDaniel Dunbar CmdArgs.push_back("-disable-llvm-optzns"); 32283f87fb08dd502309960646db01099fb4c1be9a7cDaniel Dunbar else 32297e4953e5c60409007545288f14b430bd23d68570Daniel Dunbar (*it)->render(Args, CmdArgs); 32303f87fb08dd502309960646db01099fb4c1be9a7cDaniel Dunbar } 32311d46033f760ba5fd266ce59fe391fac473f04f52Daniel Dunbar 3232cd8e4c44dd068956e9181381be3ee2d49a0fac52Daniel Dunbar if (Output.getType() == types::TY_Dependencies) { 3233cd8e4c44dd068956e9181381be3ee2d49a0fac52Daniel Dunbar // Handled with other dependency code. 3234115a79277edababaf1b26e3654044ae983197679Daniel Dunbar } else if (Output.isFilename()) { 3235b488c1dac8e53206f07103d794a62a3f5012c0f4Daniel Dunbar CmdArgs.push_back("-o"); 3236115a79277edababaf1b26e3654044ae983197679Daniel Dunbar CmdArgs.push_back(Output.getFilename()); 3237115a79277edababaf1b26e3654044ae983197679Daniel Dunbar } else { 3238115a79277edababaf1b26e3654044ae983197679Daniel Dunbar assert(Output.isNothing() && "Invalid output."); 3239b488c1dac8e53206f07103d794a62a3f5012c0f4Daniel Dunbar } 3240b488c1dac8e53206f07103d794a62a3f5012c0f4Daniel Dunbar 32411d46033f760ba5fd266ce59fe391fac473f04f52Daniel Dunbar for (InputInfoList::const_iterator 32421d46033f760ba5fd266ce59fe391fac473f04f52Daniel Dunbar it = Inputs.begin(), ie = Inputs.end(); it != ie; ++it) { 32431d46033f760ba5fd266ce59fe391fac473f04f52Daniel Dunbar const InputInfo &II = *it; 32441d46033f760ba5fd266ce59fe391fac473f04f52Daniel Dunbar CmdArgs.push_back("-x"); 3245a5ee089fffc9c98d454694f80e7b541e97ca495eFariborz Jahanian if (Args.hasArg(options::OPT_rewrite_objc)) 3246a5ee089fffc9c98d454694f80e7b541e97ca495eFariborz Jahanian CmdArgs.push_back(types::getTypeName(types::TY_PP_ObjCXX)); 3247a5ee089fffc9c98d454694f80e7b541e97ca495eFariborz Jahanian else 3248a5ee089fffc9c98d454694f80e7b541e97ca495eFariborz Jahanian CmdArgs.push_back(types::getTypeName(II.getType())); 32497c1e46533cae07216e2a67d5636a5afb44253155Daniel Dunbar if (II.isFilename()) 3250115a79277edababaf1b26e3654044ae983197679Daniel Dunbar CmdArgs.push_back(II.getFilename()); 32511d46033f760ba5fd266ce59fe391fac473f04f52Daniel Dunbar else 3252115a79277edababaf1b26e3654044ae983197679Daniel Dunbar II.getInputArg().renderAsInput(Args, CmdArgs); 32531d46033f760ba5fd266ce59fe391fac473f04f52Daniel Dunbar } 3254c21c485b4fb58ef5d55cf3e523263dd824a2ace4Daniel Dunbar 3255e6113de52df132b89c3a5a6141f17d37e83322aeChris Lattner Args.AddAllArgs(CmdArgs, options::OPT_undef); 3256e6113de52df132b89c3a5a6141f17d37e83322aeChris Lattner 3257a001c1ce5fcb669624a5b8e50d0a629d673da901Daniel Dunbar const char *Exec = getToolChain().getDriver().getClangProgramPath(); 3258f2d8b9f967a1ab53ee9fdbcc3ac0a4ee0a83a26eDaniel Dunbar 3259f2d8b9f967a1ab53ee9fdbcc3ac0a4ee0a83a26eDaniel Dunbar // Optionally embed the -cc1 level arguments into the debug info, for build 3260f2d8b9f967a1ab53ee9fdbcc3ac0a4ee0a83a26eDaniel Dunbar // analysis. 3261f2d8b9f967a1ab53ee9fdbcc3ac0a4ee0a83a26eDaniel Dunbar if (getToolChain().UseDwarfDebugFlags()) { 32626e90047520c8b4d6daa110bdbdaf15041016bd7cDaniel Dunbar ArgStringList OriginalArgs; 32636e90047520c8b4d6daa110bdbdaf15041016bd7cDaniel Dunbar for (ArgList::const_iterator it = Args.begin(), 32646e90047520c8b4d6daa110bdbdaf15041016bd7cDaniel Dunbar ie = Args.end(); it != ie; ++it) 32656e90047520c8b4d6daa110bdbdaf15041016bd7cDaniel Dunbar (*it)->render(Args, OriginalArgs); 3266ca0e0545c216afaacba6da6c82a270dc2efc4e3fDaniel Dunbar 3267f7ccbad5d9949e7ddd1cbef43d482553b811e026Dylan Noblesmith SmallString<256> Flags; 3268f2d8b9f967a1ab53ee9fdbcc3ac0a4ee0a83a26eDaniel Dunbar Flags += Exec; 32696e90047520c8b4d6daa110bdbdaf15041016bd7cDaniel Dunbar for (unsigned i = 0, e = OriginalArgs.size(); i != e; ++i) { 3270f2d8b9f967a1ab53ee9fdbcc3ac0a4ee0a83a26eDaniel Dunbar Flags += " "; 32716e90047520c8b4d6daa110bdbdaf15041016bd7cDaniel Dunbar Flags += OriginalArgs[i]; 3272f2d8b9f967a1ab53ee9fdbcc3ac0a4ee0a83a26eDaniel Dunbar } 3273f2d8b9f967a1ab53ee9fdbcc3ac0a4ee0a83a26eDaniel Dunbar CmdArgs.push_back("-dwarf-debug-flags"); 3274f2d8b9f967a1ab53ee9fdbcc3ac0a4ee0a83a26eDaniel Dunbar CmdArgs.push_back(Args.MakeArgString(Flags.str())); 3275f2d8b9f967a1ab53ee9fdbcc3ac0a4ee0a83a26eDaniel Dunbar } 3276f2d8b9f967a1ab53ee9fdbcc3ac0a4ee0a83a26eDaniel Dunbar 327780190399f5a062db72127869978699af65951b73Eric Christopher // Add the split debug info name to the command lines here so we 327880190399f5a062db72127869978699af65951b73Eric Christopher // can propagate it to the backend. 327980190399f5a062db72127869978699af65951b73Eric Christopher bool SplitDwarf = Args.hasArg(options::OPT_gsplit_dwarf) && 328080190399f5a062db72127869978699af65951b73Eric Christopher (getToolChain().getTriple().getOS() == llvm::Triple::Linux) && 3281ff971d7973aaa00c286b788d30f6919c7b1f4de2Eric Christopher (isa<AssembleJobAction>(JA) || isa<CompileJobAction>(JA)); 328280190399f5a062db72127869978699af65951b73Eric Christopher const char *SplitDwarfOut; 328380190399f5a062db72127869978699af65951b73Eric Christopher if (SplitDwarf) { 328480190399f5a062db72127869978699af65951b73Eric Christopher CmdArgs.push_back("-split-dwarf-file"); 328580190399f5a062db72127869978699af65951b73Eric Christopher SplitDwarfOut = SplitDebugName(Args, Inputs); 328680190399f5a062db72127869978699af65951b73Eric Christopher CmdArgs.push_back(SplitDwarfOut); 328780190399f5a062db72127869978699af65951b73Eric Christopher } 328880190399f5a062db72127869978699af65951b73Eric Christopher 328980190399f5a062db72127869978699af65951b73Eric Christopher // Finally add the compile command to the compilation. 32902fe238ed293bd4bc27af9beb9fa151fad2146fa8Daniel Dunbar C.addCommand(new Command(JA, *this, Exec, CmdArgs)); 3291a880db0b0fc028abf754c290d921d809eec0518aDaniel Dunbar 3292ff971d7973aaa00c286b788d30f6919c7b1f4de2Eric Christopher // Handle the debug info splitting at object creation time if we're 3293ff971d7973aaa00c286b788d30f6919c7b1f4de2Eric Christopher // creating an object. 329459320e770f90a59c74f2be10f198e3c390195628Eric Christopher // TODO: Currently only works on linux with newer objcopy. 3295ff971d7973aaa00c286b788d30f6919c7b1f4de2Eric Christopher if (SplitDwarf && !isa<CompileJobAction>(JA)) 329680190399f5a062db72127869978699af65951b73Eric Christopher SplitDebugInfo(getToolChain(), C, *this, JA, Args, Output, SplitDwarfOut); 329759320e770f90a59c74f2be10f198e3c390195628Eric Christopher 3298be4c8705e499b55548467eb7adaa23cbc6edfef9Roman Divacky if (Arg *A = Args.getLastArg(options::OPT_pg)) 3299be4c8705e499b55548467eb7adaa23cbc6edfef9Roman Divacky if (Args.hasArg(options::OPT_fomit_frame_pointer)) 33005f9e272e632e951b1efe824cd16acb4d96077930Chris Lattner D.Diag(diag::err_drv_argument_not_allowed_with) 3301be4c8705e499b55548467eb7adaa23cbc6edfef9Roman Divacky << "-fomit-frame-pointer" << A->getAsString(Args); 330220249a1af2e462dcafdd6a350f1c7967b264ff25Michael J. Spencer 330368fb469aeb19144403e703b825854d08353c8eeaDaniel Dunbar // Claim some arguments which clang supports automatically. 330468fb469aeb19144403e703b825854d08353c8eeaDaniel Dunbar 3305f4046866e20fe3279b0daa2f48d9e83263dfdbfeDaniel Dunbar // -fpch-preprocess is used with gcc to add a special marker in the output to 3306f4046866e20fe3279b0daa2f48d9e83263dfdbfeDaniel Dunbar // include the PCH file. Clang's PTH solution is completely transparent, so we 3307f4046866e20fe3279b0daa2f48d9e83263dfdbfeDaniel Dunbar // do not need to deal with it at all. 330868fb469aeb19144403e703b825854d08353c8eeaDaniel Dunbar Args.ClaimAllArgs(options::OPT_fpch_preprocess); 3309c21c485b4fb58ef5d55cf3e523263dd824a2ace4Daniel Dunbar 3310a880db0b0fc028abf754c290d921d809eec0518aDaniel Dunbar // Claim some arguments which clang doesn't support, but we don't 3311a880db0b0fc028abf754c290d921d809eec0518aDaniel Dunbar // care to warn the user about. 3312cdd9686b890ebdc10039ae256ef4c9dfb5ebacb7Daniel Dunbar Args.ClaimAllArgs(options::OPT_clang_ignored_f_Group); 3313cdd9686b890ebdc10039ae256ef4c9dfb5ebacb7Daniel Dunbar Args.ClaimAllArgs(options::OPT_clang_ignored_m_Group); 3314035ff0c6746a2689667c83d4c02a47d5a7b71e82Rafael Espindola 33159c094fbcfaba49fc1aeca119c0e12bec59779692Rafael Espindola // Disable warnings for clang -E -use-gold-plugin -emit-llvm foo.c 3316035ff0c6746a2689667c83d4c02a47d5a7b71e82Rafael Espindola Args.ClaimAllArgs(options::OPT_use_gold_plugin); 33179c094fbcfaba49fc1aeca119c0e12bec59779692Rafael Espindola Args.ClaimAllArgs(options::OPT_emit_llvm); 331847ac7d27c44bd64a7d0fc03d4babc196cf2b8230Daniel Dunbar} 331947ac7d27c44bd64a7d0fc03d4babc196cf2b8230Daniel Dunbar 3320fc30829694e62040c14f329f5491724fe7476241Jim Grosbachvoid ClangAs::AddARMTargetArgs(const ArgList &Args, 3321fc30829694e62040c14f329f5491724fe7476241Jim Grosbach ArgStringList &CmdArgs) const { 3322fc30829694e62040c14f329f5491724fe7476241Jim Grosbach const Driver &D = getToolChain().getDriver(); 3323fc30829694e62040c14f329f5491724fe7476241Jim Grosbach llvm::Triple Triple = getToolChain().getTriple(); 3324fc30829694e62040c14f329f5491724fe7476241Jim Grosbach 3325fc30829694e62040c14f329f5491724fe7476241Jim Grosbach // Set the CPU based on -march= and -mcpu=. 3326fc30829694e62040c14f329f5491724fe7476241Jim Grosbach CmdArgs.push_back("-target-cpu"); 332792c4fd5c17a5fd433cca7ddecb0ad4a104baa59cBenjamin Kramer CmdArgs.push_back(Args.MakeArgString(getARMTargetCPU(Args, Triple))); 3328fc30829694e62040c14f329f5491724fe7476241Jim Grosbach 3329fc30829694e62040c14f329f5491724fe7476241Jim Grosbach // Honor -mfpu=. 3330993172757762436d22b2dfc74e7cca1bade1a7bfChad Rosier if (const Arg *A = Args.getLastArg(options::OPT_mfpu_EQ)) 3331f80f2a5098218211704bc4e66a8c2f46a8fa1d25Chad Rosier addFPUArgs(D, A, Args, CmdArgs); 33327a938fa66be42710b034a79106de337a275fd265Chad Rosier 33337a938fa66be42710b034a79106de337a275fd265Chad Rosier // Honor -mfpmath=. 33347a938fa66be42710b034a79106de337a275fd265Chad Rosier if (const Arg *A = Args.getLastArg(options::OPT_mfpmath_EQ)) 333530fe6baf95662ea82a794a8fe3b76998713c183dChad Rosier addFPMathArgs(D, A, Args, CmdArgs, getARMTargetCPU(Args, Triple)); 3336fc30829694e62040c14f329f5491724fe7476241Jim Grosbach} 3337fc30829694e62040c14f329f5491724fe7476241Jim Grosbach 3338efc5b6713e51726ced594bc566d3291ffbf22ae2Benjamin Kramervoid ClangAs::AddX86TargetArgs(const ArgList &Args, 3339efc5b6713e51726ced594bc566d3291ffbf22ae2Benjamin Kramer ArgStringList &CmdArgs) const { 3340efc5b6713e51726ced594bc566d3291ffbf22ae2Benjamin Kramer // Set the CPU based on -march=. 3341efc5b6713e51726ced594bc566d3291ffbf22ae2Benjamin Kramer if (const char *CPUName = getX86TargetCPU(Args, getToolChain().getTriple())) { 3342efc5b6713e51726ced594bc566d3291ffbf22ae2Benjamin Kramer CmdArgs.push_back("-target-cpu"); 3343efc5b6713e51726ced594bc566d3291ffbf22ae2Benjamin Kramer CmdArgs.push_back(CPUName); 3344efc5b6713e51726ced594bc566d3291ffbf22ae2Benjamin Kramer } 3345efc5b6713e51726ced594bc566d3291ffbf22ae2Benjamin Kramer} 3346efc5b6713e51726ced594bc566d3291ffbf22ae2Benjamin Kramer 3347260611a32535c851237926bfcf78869b13c07d5bJohn McCall/// Add options related to the Objective-C runtime/ABI. 3348260611a32535c851237926bfcf78869b13c07d5bJohn McCall/// 3349260611a32535c851237926bfcf78869b13c07d5bJohn McCall/// Returns true if the runtime is non-fragile. 3350260611a32535c851237926bfcf78869b13c07d5bJohn McCallObjCRuntime Clang::AddObjCRuntimeArgs(const ArgList &args, 3351260611a32535c851237926bfcf78869b13c07d5bJohn McCall ArgStringList &cmdArgs, 3352260611a32535c851237926bfcf78869b13c07d5bJohn McCall RewriteKind rewriteKind) const { 3353260611a32535c851237926bfcf78869b13c07d5bJohn McCall // Look for the controlling runtime option. 3354260611a32535c851237926bfcf78869b13c07d5bJohn McCall Arg *runtimeArg = args.getLastArg(options::OPT_fnext_runtime, 3355260611a32535c851237926bfcf78869b13c07d5bJohn McCall options::OPT_fgnu_runtime, 3356260611a32535c851237926bfcf78869b13c07d5bJohn McCall options::OPT_fobjc_runtime_EQ); 3357260611a32535c851237926bfcf78869b13c07d5bJohn McCall 3358260611a32535c851237926bfcf78869b13c07d5bJohn McCall // Just forward -fobjc-runtime= to the frontend. This supercedes 3359260611a32535c851237926bfcf78869b13c07d5bJohn McCall // options about fragility. 3360260611a32535c851237926bfcf78869b13c07d5bJohn McCall if (runtimeArg && 3361260611a32535c851237926bfcf78869b13c07d5bJohn McCall runtimeArg->getOption().matches(options::OPT_fobjc_runtime_EQ)) { 3362260611a32535c851237926bfcf78869b13c07d5bJohn McCall ObjCRuntime runtime; 33631d489cf4a04ad0ad8ac2696e4eed0995f3a67288Richard Smith StringRef value = runtimeArg->getValue(); 3364260611a32535c851237926bfcf78869b13c07d5bJohn McCall if (runtime.tryParse(value)) { 3365260611a32535c851237926bfcf78869b13c07d5bJohn McCall getToolChain().getDriver().Diag(diag::err_drv_unknown_objc_runtime) 3366260611a32535c851237926bfcf78869b13c07d5bJohn McCall << value; 3367260611a32535c851237926bfcf78869b13c07d5bJohn McCall } 3368260611a32535c851237926bfcf78869b13c07d5bJohn McCall 3369260611a32535c851237926bfcf78869b13c07d5bJohn McCall runtimeArg->render(args, cmdArgs); 3370260611a32535c851237926bfcf78869b13c07d5bJohn McCall return runtime; 3371260611a32535c851237926bfcf78869b13c07d5bJohn McCall } 3372260611a32535c851237926bfcf78869b13c07d5bJohn McCall 3373260611a32535c851237926bfcf78869b13c07d5bJohn McCall // Otherwise, we'll need the ABI "version". Version numbers are 3374260611a32535c851237926bfcf78869b13c07d5bJohn McCall // slightly confusing for historical reasons: 3375260611a32535c851237926bfcf78869b13c07d5bJohn McCall // 1 - Traditional "fragile" ABI 3376260611a32535c851237926bfcf78869b13c07d5bJohn McCall // 2 - Non-fragile ABI, version 1 3377260611a32535c851237926bfcf78869b13c07d5bJohn McCall // 3 - Non-fragile ABI, version 2 3378260611a32535c851237926bfcf78869b13c07d5bJohn McCall unsigned objcABIVersion = 1; 3379260611a32535c851237926bfcf78869b13c07d5bJohn McCall // If -fobjc-abi-version= is present, use that to set the version. 3380260611a32535c851237926bfcf78869b13c07d5bJohn McCall if (Arg *abiArg = args.getLastArg(options::OPT_fobjc_abi_version_EQ)) { 33811d489cf4a04ad0ad8ac2696e4eed0995f3a67288Richard Smith StringRef value = abiArg->getValue(); 3382260611a32535c851237926bfcf78869b13c07d5bJohn McCall if (value == "1") 3383260611a32535c851237926bfcf78869b13c07d5bJohn McCall objcABIVersion = 1; 3384260611a32535c851237926bfcf78869b13c07d5bJohn McCall else if (value == "2") 3385260611a32535c851237926bfcf78869b13c07d5bJohn McCall objcABIVersion = 2; 3386260611a32535c851237926bfcf78869b13c07d5bJohn McCall else if (value == "3") 3387260611a32535c851237926bfcf78869b13c07d5bJohn McCall objcABIVersion = 3; 3388260611a32535c851237926bfcf78869b13c07d5bJohn McCall else 3389260611a32535c851237926bfcf78869b13c07d5bJohn McCall getToolChain().getDriver().Diag(diag::err_drv_clang_unsupported) 3390260611a32535c851237926bfcf78869b13c07d5bJohn McCall << value; 3391260611a32535c851237926bfcf78869b13c07d5bJohn McCall } else { 3392260611a32535c851237926bfcf78869b13c07d5bJohn McCall // Otherwise, determine if we are using the non-fragile ABI. 3393260611a32535c851237926bfcf78869b13c07d5bJohn McCall bool nonFragileABIIsDefault = 3394260611a32535c851237926bfcf78869b13c07d5bJohn McCall (rewriteKind == RK_NonFragile || 3395260611a32535c851237926bfcf78869b13c07d5bJohn McCall (rewriteKind == RK_None && 3396260611a32535c851237926bfcf78869b13c07d5bJohn McCall getToolChain().IsObjCNonFragileABIDefault())); 3397260611a32535c851237926bfcf78869b13c07d5bJohn McCall if (args.hasFlag(options::OPT_fobjc_nonfragile_abi, 3398260611a32535c851237926bfcf78869b13c07d5bJohn McCall options::OPT_fno_objc_nonfragile_abi, 3399260611a32535c851237926bfcf78869b13c07d5bJohn McCall nonFragileABIIsDefault)) { 3400260611a32535c851237926bfcf78869b13c07d5bJohn McCall // Determine the non-fragile ABI version to use. 3401260611a32535c851237926bfcf78869b13c07d5bJohn McCall#ifdef DISABLE_DEFAULT_NONFRAGILEABI_TWO 3402260611a32535c851237926bfcf78869b13c07d5bJohn McCall unsigned nonFragileABIVersion = 1; 3403260611a32535c851237926bfcf78869b13c07d5bJohn McCall#else 3404260611a32535c851237926bfcf78869b13c07d5bJohn McCall unsigned nonFragileABIVersion = 2; 3405260611a32535c851237926bfcf78869b13c07d5bJohn McCall#endif 3406260611a32535c851237926bfcf78869b13c07d5bJohn McCall 3407260611a32535c851237926bfcf78869b13c07d5bJohn McCall if (Arg *abiArg = args.getLastArg( 3408260611a32535c851237926bfcf78869b13c07d5bJohn McCall options::OPT_fobjc_nonfragile_abi_version_EQ)) { 34091d489cf4a04ad0ad8ac2696e4eed0995f3a67288Richard Smith StringRef value = abiArg->getValue(); 3410260611a32535c851237926bfcf78869b13c07d5bJohn McCall if (value == "1") 3411260611a32535c851237926bfcf78869b13c07d5bJohn McCall nonFragileABIVersion = 1; 3412260611a32535c851237926bfcf78869b13c07d5bJohn McCall else if (value == "2") 3413260611a32535c851237926bfcf78869b13c07d5bJohn McCall nonFragileABIVersion = 2; 3414260611a32535c851237926bfcf78869b13c07d5bJohn McCall else 3415260611a32535c851237926bfcf78869b13c07d5bJohn McCall getToolChain().getDriver().Diag(diag::err_drv_clang_unsupported) 3416260611a32535c851237926bfcf78869b13c07d5bJohn McCall << value; 3417260611a32535c851237926bfcf78869b13c07d5bJohn McCall } 3418260611a32535c851237926bfcf78869b13c07d5bJohn McCall 3419260611a32535c851237926bfcf78869b13c07d5bJohn McCall objcABIVersion = 1 + nonFragileABIVersion; 3420260611a32535c851237926bfcf78869b13c07d5bJohn McCall } else { 3421260611a32535c851237926bfcf78869b13c07d5bJohn McCall objcABIVersion = 1; 3422260611a32535c851237926bfcf78869b13c07d5bJohn McCall } 3423260611a32535c851237926bfcf78869b13c07d5bJohn McCall } 3424260611a32535c851237926bfcf78869b13c07d5bJohn McCall 3425260611a32535c851237926bfcf78869b13c07d5bJohn McCall // We don't actually care about the ABI version other than whether 3426260611a32535c851237926bfcf78869b13c07d5bJohn McCall // it's non-fragile. 3427260611a32535c851237926bfcf78869b13c07d5bJohn McCall bool isNonFragile = objcABIVersion != 1; 3428260611a32535c851237926bfcf78869b13c07d5bJohn McCall 3429260611a32535c851237926bfcf78869b13c07d5bJohn McCall // If we have no runtime argument, ask the toolchain for its default runtime. 3430260611a32535c851237926bfcf78869b13c07d5bJohn McCall // However, the rewriter only really supports the Mac runtime, so assume that. 3431260611a32535c851237926bfcf78869b13c07d5bJohn McCall ObjCRuntime runtime; 3432260611a32535c851237926bfcf78869b13c07d5bJohn McCall if (!runtimeArg) { 3433260611a32535c851237926bfcf78869b13c07d5bJohn McCall switch (rewriteKind) { 3434260611a32535c851237926bfcf78869b13c07d5bJohn McCall case RK_None: 3435260611a32535c851237926bfcf78869b13c07d5bJohn McCall runtime = getToolChain().getDefaultObjCRuntime(isNonFragile); 3436260611a32535c851237926bfcf78869b13c07d5bJohn McCall break; 3437260611a32535c851237926bfcf78869b13c07d5bJohn McCall case RK_Fragile: 3438260611a32535c851237926bfcf78869b13c07d5bJohn McCall runtime = ObjCRuntime(ObjCRuntime::FragileMacOSX, VersionTuple()); 3439260611a32535c851237926bfcf78869b13c07d5bJohn McCall break; 3440260611a32535c851237926bfcf78869b13c07d5bJohn McCall case RK_NonFragile: 3441260611a32535c851237926bfcf78869b13c07d5bJohn McCall runtime = ObjCRuntime(ObjCRuntime::MacOSX, VersionTuple()); 3442260611a32535c851237926bfcf78869b13c07d5bJohn McCall break; 3443260611a32535c851237926bfcf78869b13c07d5bJohn McCall } 3444260611a32535c851237926bfcf78869b13c07d5bJohn McCall 3445260611a32535c851237926bfcf78869b13c07d5bJohn McCall // -fnext-runtime 3446260611a32535c851237926bfcf78869b13c07d5bJohn McCall } else if (runtimeArg->getOption().matches(options::OPT_fnext_runtime)) { 3447260611a32535c851237926bfcf78869b13c07d5bJohn McCall // On Darwin, make this use the default behavior for the toolchain. 3448260611a32535c851237926bfcf78869b13c07d5bJohn McCall if (getToolChain().getTriple().isOSDarwin()) { 3449260611a32535c851237926bfcf78869b13c07d5bJohn McCall runtime = getToolChain().getDefaultObjCRuntime(isNonFragile); 3450260611a32535c851237926bfcf78869b13c07d5bJohn McCall 3451260611a32535c851237926bfcf78869b13c07d5bJohn McCall // Otherwise, build for a generic macosx port. 3452260611a32535c851237926bfcf78869b13c07d5bJohn McCall } else { 3453260611a32535c851237926bfcf78869b13c07d5bJohn McCall runtime = ObjCRuntime(ObjCRuntime::MacOSX, VersionTuple()); 3454260611a32535c851237926bfcf78869b13c07d5bJohn McCall } 3455260611a32535c851237926bfcf78869b13c07d5bJohn McCall 3456260611a32535c851237926bfcf78869b13c07d5bJohn McCall // -fgnu-runtime 3457260611a32535c851237926bfcf78869b13c07d5bJohn McCall } else { 3458260611a32535c851237926bfcf78869b13c07d5bJohn McCall assert(runtimeArg->getOption().matches(options::OPT_fgnu_runtime)); 3459a422cd0ed4da8cb5a172498f29bb02065707c6ceDavid Chisnall // Legacy behaviour is to target the gnustep runtime if we are i 3460a422cd0ed4da8cb5a172498f29bb02065707c6ceDavid Chisnall // non-fragile mode or the GCC runtime in fragile mode. 3461a422cd0ed4da8cb5a172498f29bb02065707c6ceDavid Chisnall if (isNonFragile) 3462891dac73bdb090ff845982e4334f5b4c18353dbeDavid Chisnall runtime = ObjCRuntime(ObjCRuntime::GNUstep, VersionTuple(1,6)); 3463a422cd0ed4da8cb5a172498f29bb02065707c6ceDavid Chisnall else 3464a422cd0ed4da8cb5a172498f29bb02065707c6ceDavid Chisnall runtime = ObjCRuntime(ObjCRuntime::GCC, VersionTuple()); 3465260611a32535c851237926bfcf78869b13c07d5bJohn McCall } 3466260611a32535c851237926bfcf78869b13c07d5bJohn McCall 3467260611a32535c851237926bfcf78869b13c07d5bJohn McCall cmdArgs.push_back(args.MakeArgString( 3468260611a32535c851237926bfcf78869b13c07d5bJohn McCall "-fobjc-runtime=" + runtime.getAsString())); 3469260611a32535c851237926bfcf78869b13c07d5bJohn McCall return runtime; 3470260611a32535c851237926bfcf78869b13c07d5bJohn McCall} 3471260611a32535c851237926bfcf78869b13c07d5bJohn McCall 347220a9aa50f9a7d4b03f97bc67e96da1d605c309a2Daniel Dunbarvoid ClangAs::ConstructJob(Compilation &C, const JobAction &JA, 347320a9aa50f9a7d4b03f97bc67e96da1d605c309a2Daniel Dunbar const InputInfo &Output, 347420a9aa50f9a7d4b03f97bc67e96da1d605c309a2Daniel Dunbar const InputInfoList &Inputs, 347520a9aa50f9a7d4b03f97bc67e96da1d605c309a2Daniel Dunbar const ArgList &Args, 347620a9aa50f9a7d4b03f97bc67e96da1d605c309a2Daniel Dunbar const char *LinkingOutput) const { 347720a9aa50f9a7d4b03f97bc67e96da1d605c309a2Daniel Dunbar ArgStringList CmdArgs; 347820a9aa50f9a7d4b03f97bc67e96da1d605c309a2Daniel Dunbar 347920a9aa50f9a7d4b03f97bc67e96da1d605c309a2Daniel Dunbar assert(Inputs.size() == 1 && "Unexpected number of inputs."); 348020a9aa50f9a7d4b03f97bc67e96da1d605c309a2Daniel Dunbar const InputInfo &Input = Inputs[0]; 348120a9aa50f9a7d4b03f97bc67e96da1d605c309a2Daniel Dunbar 3482dbe80d9933e1fb0c26bd339e1f1f2f2d76dcac0aRafael Espindola // Don't warn about "clang -w -c foo.s" 3483dbe80d9933e1fb0c26bd339e1f1f2f2d76dcac0aRafael Espindola Args.ClaimAllArgs(options::OPT_w); 34849c094fbcfaba49fc1aeca119c0e12bec59779692Rafael Espindola // and "clang -emit-llvm -c foo.s" 34859c094fbcfaba49fc1aeca119c0e12bec59779692Rafael Espindola Args.ClaimAllArgs(options::OPT_emit_llvm); 34869c094fbcfaba49fc1aeca119c0e12bec59779692Rafael Espindola // and "clang -use-gold-plugin -c foo.s" 34879c094fbcfaba49fc1aeca119c0e12bec59779692Rafael Espindola Args.ClaimAllArgs(options::OPT_use_gold_plugin); 3488dbe80d9933e1fb0c26bd339e1f1f2f2d76dcac0aRafael Espindola 348920a9aa50f9a7d4b03f97bc67e96da1d605c309a2Daniel Dunbar // Invoke ourselves in -cc1as mode. 349020a9aa50f9a7d4b03f97bc67e96da1d605c309a2Daniel Dunbar // 349120a9aa50f9a7d4b03f97bc67e96da1d605c309a2Daniel Dunbar // FIXME: Implement custom jobs for internal actions. 349220a9aa50f9a7d4b03f97bc67e96da1d605c309a2Daniel Dunbar CmdArgs.push_back("-cc1as"); 349320a9aa50f9a7d4b03f97bc67e96da1d605c309a2Daniel Dunbar 349420a9aa50f9a7d4b03f97bc67e96da1d605c309a2Daniel Dunbar // Add the "effective" target triple. 349520a9aa50f9a7d4b03f97bc67e96da1d605c309a2Daniel Dunbar CmdArgs.push_back("-triple"); 349661ab80a8b35e6fe9363e8ef1b3d27209b0e89349Chad Rosier std::string TripleStr = 349761ab80a8b35e6fe9363e8ef1b3d27209b0e89349Chad Rosier getToolChain().ComputeEffectiveClangTriple(Args, Input.getType()); 349820a9aa50f9a7d4b03f97bc67e96da1d605c309a2Daniel Dunbar CmdArgs.push_back(Args.MakeArgString(TripleStr)); 349920a9aa50f9a7d4b03f97bc67e96da1d605c309a2Daniel Dunbar 350020a9aa50f9a7d4b03f97bc67e96da1d605c309a2Daniel Dunbar // Set the output mode, we currently only expect to be used as a real 350120a9aa50f9a7d4b03f97bc67e96da1d605c309a2Daniel Dunbar // assembler. 350220a9aa50f9a7d4b03f97bc67e96da1d605c309a2Daniel Dunbar CmdArgs.push_back("-filetype"); 350320a9aa50f9a7d4b03f97bc67e96da1d605c309a2Daniel Dunbar CmdArgs.push_back("obj"); 350420a9aa50f9a7d4b03f97bc67e96da1d605c309a2Daniel Dunbar 350527e2b983beb8b5a29869639637327725623069a8Eric Christopher // Set the main file name, so that debug info works even with 350627e2b983beb8b5a29869639637327725623069a8Eric Christopher // -save-temps or preprocessed assembly. 350727e2b983beb8b5a29869639637327725623069a8Eric Christopher CmdArgs.push_back("-main-file-name"); 350827e2b983beb8b5a29869639637327725623069a8Eric Christopher CmdArgs.push_back(Clang::getBaseInputName(Args, Inputs)); 350927e2b983beb8b5a29869639637327725623069a8Eric Christopher 3510359cf927cf4980099a04b3f3cf040b81d181fe3dJoerg Sonnenberger if (UseRelaxAll(C, Args)) 3511469d40ef5a95d0eaddfd541616ad4cd26668e856Daniel Dunbar CmdArgs.push_back("-relax-all"); 35129929800b8dfced61e9c97dc8d6e71e144ebf8accDaniel Dunbar 3513fc30829694e62040c14f329f5491724fe7476241Jim Grosbach // Add target specific cpu and features flags. 3514fc30829694e62040c14f329f5491724fe7476241Jim Grosbach switch(getToolChain().getTriple().getArch()) { 3515fc30829694e62040c14f329f5491724fe7476241Jim Grosbach default: 3516fc30829694e62040c14f329f5491724fe7476241Jim Grosbach break; 3517fc30829694e62040c14f329f5491724fe7476241Jim Grosbach 3518fc30829694e62040c14f329f5491724fe7476241Jim Grosbach case llvm::Triple::arm: 3519fc30829694e62040c14f329f5491724fe7476241Jim Grosbach case llvm::Triple::thumb: 3520fc30829694e62040c14f329f5491724fe7476241Jim Grosbach AddARMTargetArgs(Args, CmdArgs); 3521fc30829694e62040c14f329f5491724fe7476241Jim Grosbach break; 3522efc5b6713e51726ced594bc566d3291ffbf22ae2Benjamin Kramer 3523efc5b6713e51726ced594bc566d3291ffbf22ae2Benjamin Kramer case llvm::Triple::x86: 3524efc5b6713e51726ced594bc566d3291ffbf22ae2Benjamin Kramer case llvm::Triple::x86_64: 3525efc5b6713e51726ced594bc566d3291ffbf22ae2Benjamin Kramer AddX86TargetArgs(Args, CmdArgs); 3526efc5b6713e51726ced594bc566d3291ffbf22ae2Benjamin Kramer break; 3527fc30829694e62040c14f329f5491724fe7476241Jim Grosbach } 3528fc30829694e62040c14f329f5491724fe7476241Jim Grosbach 35297f6f8c8ab29db9221ed40ab7d5317df29848cc52Daniel Dunbar // Ignore explicit -force_cpusubtype_ALL option. 35307f6f8c8ab29db9221ed40ab7d5317df29848cc52Daniel Dunbar (void) Args.hasArg(options::OPT_force__cpusubtype__ALL); 353120a9aa50f9a7d4b03f97bc67e96da1d605c309a2Daniel Dunbar 35328f0a403945b60a8a8a56a7721bb66f6b84ec129bEric Christopher // Determine the original source input. 35338f0a403945b60a8a8a56a7721bb66f6b84ec129bEric Christopher const Action *SourceAction = &JA; 35348f0a403945b60a8a8a56a7721bb66f6b84ec129bEric Christopher while (SourceAction->getKind() != Action::InputClass) { 35358f0a403945b60a8a8a56a7721bb66f6b84ec129bEric Christopher assert(!SourceAction->getInputs().empty() && "unexpected root action!"); 35368f0a403945b60a8a8a56a7721bb66f6b84ec129bEric Christopher SourceAction = SourceAction->getInputs()[0]; 35378f0a403945b60a8a8a56a7721bb66f6b84ec129bEric Christopher } 35388f0a403945b60a8a8a56a7721bb66f6b84ec129bEric Christopher 3539d566df67bed6381f6e859bbd21fd43ff89277cc0Chandler Carruth // Forward -g and handle debug info related flags, assuming we are dealing 3540d566df67bed6381f6e859bbd21fd43ff89277cc0Chandler Carruth // with an actual assembly file. 35418f0a403945b60a8a8a56a7721bb66f6b84ec129bEric Christopher if (SourceAction->getType() == types::TY_Asm || 35428f0a403945b60a8a8a56a7721bb66f6b84ec129bEric Christopher SourceAction->getType() == types::TY_PP_Asm) { 35438f0a403945b60a8a8a56a7721bb66f6b84ec129bEric Christopher Args.ClaimAllArgs(options::OPT_g_Group); 35448f0a403945b60a8a8a56a7721bb66f6b84ec129bEric Christopher if (Arg *A = Args.getLastArg(options::OPT_g_Group)) 35458f0a403945b60a8a8a56a7721bb66f6b84ec129bEric Christopher if (!A->getOption().matches(options::OPT_g0)) 35468f0a403945b60a8a8a56a7721bb66f6b84ec129bEric Christopher CmdArgs.push_back("-g"); 3547d566df67bed6381f6e859bbd21fd43ff89277cc0Chandler Carruth 3548d566df67bed6381f6e859bbd21fd43ff89277cc0Chandler Carruth // Add the -fdebug-compilation-dir flag if needed. 3549d566df67bed6381f6e859bbd21fd43ff89277cc0Chandler Carruth addDebugCompDirArg(Args, CmdArgs); 35500234179282d59e6dfccc8b2da72a9a71bf5b6ac3Kevin Enderby 35510234179282d59e6dfccc8b2da72a9a71bf5b6ac3Kevin Enderby // Set the AT_producer to the clang version when using the integrated 35520234179282d59e6dfccc8b2da72a9a71bf5b6ac3Kevin Enderby // assembler on assembly source files. 35530234179282d59e6dfccc8b2da72a9a71bf5b6ac3Kevin Enderby CmdArgs.push_back("-dwarf-debug-producer"); 35540234179282d59e6dfccc8b2da72a9a71bf5b6ac3Kevin Enderby CmdArgs.push_back(Args.MakeArgString(getClangFullVersion())); 35558f0a403945b60a8a8a56a7721bb66f6b84ec129bEric Christopher } 3556567003e572eed69cf1e8a04601076c8803355c7aKevin Enderby 3557567003e572eed69cf1e8a04601076c8803355c7aKevin Enderby // Optionally embed the -cc1as level arguments into the debug info, for build 3558567003e572eed69cf1e8a04601076c8803355c7aKevin Enderby // analysis. 3559567003e572eed69cf1e8a04601076c8803355c7aKevin Enderby if (getToolChain().UseDwarfDebugFlags()) { 3560567003e572eed69cf1e8a04601076c8803355c7aKevin Enderby ArgStringList OriginalArgs; 3561567003e572eed69cf1e8a04601076c8803355c7aKevin Enderby for (ArgList::const_iterator it = Args.begin(), 3562567003e572eed69cf1e8a04601076c8803355c7aKevin Enderby ie = Args.end(); it != ie; ++it) 3563567003e572eed69cf1e8a04601076c8803355c7aKevin Enderby (*it)->render(Args, OriginalArgs); 3564567003e572eed69cf1e8a04601076c8803355c7aKevin Enderby 3565f7ccbad5d9949e7ddd1cbef43d482553b811e026Dylan Noblesmith SmallString<256> Flags; 3566567003e572eed69cf1e8a04601076c8803355c7aKevin Enderby const char *Exec = getToolChain().getDriver().getClangProgramPath(); 3567567003e572eed69cf1e8a04601076c8803355c7aKevin Enderby Flags += Exec; 3568567003e572eed69cf1e8a04601076c8803355c7aKevin Enderby for (unsigned i = 0, e = OriginalArgs.size(); i != e; ++i) { 3569567003e572eed69cf1e8a04601076c8803355c7aKevin Enderby Flags += " "; 3570567003e572eed69cf1e8a04601076c8803355c7aKevin Enderby Flags += OriginalArgs[i]; 3571567003e572eed69cf1e8a04601076c8803355c7aKevin Enderby } 3572567003e572eed69cf1e8a04601076c8803355c7aKevin Enderby CmdArgs.push_back("-dwarf-debug-flags"); 3573567003e572eed69cf1e8a04601076c8803355c7aKevin Enderby CmdArgs.push_back(Args.MakeArgString(Flags.str())); 3574567003e572eed69cf1e8a04601076c8803355c7aKevin Enderby } 357520a9aa50f9a7d4b03f97bc67e96da1d605c309a2Daniel Dunbar 357620a9aa50f9a7d4b03f97bc67e96da1d605c309a2Daniel Dunbar // FIXME: Add -static support, once we have it. 357720a9aa50f9a7d4b03f97bc67e96da1d605c309a2Daniel Dunbar 357820a9aa50f9a7d4b03f97bc67e96da1d605c309a2Daniel Dunbar Args.AddAllArgValues(CmdArgs, options::OPT_Wa_COMMA, 357920a9aa50f9a7d4b03f97bc67e96da1d605c309a2Daniel Dunbar options::OPT_Xassembler); 35803df2325a0fd4b868b804aa1708beb3634402c22dDaniel Dunbar Args.AddAllArgs(CmdArgs, options::OPT_mllvm); 358120a9aa50f9a7d4b03f97bc67e96da1d605c309a2Daniel Dunbar 358220a9aa50f9a7d4b03f97bc67e96da1d605c309a2Daniel Dunbar assert(Output.isFilename() && "Unexpected lipo output."); 358320a9aa50f9a7d4b03f97bc67e96da1d605c309a2Daniel Dunbar CmdArgs.push_back("-o"); 358420a9aa50f9a7d4b03f97bc67e96da1d605c309a2Daniel Dunbar CmdArgs.push_back(Output.getFilename()); 358520a9aa50f9a7d4b03f97bc67e96da1d605c309a2Daniel Dunbar 35867c1e46533cae07216e2a67d5636a5afb44253155Daniel Dunbar assert(Input.isFilename() && "Invalid input."); 35877c1e46533cae07216e2a67d5636a5afb44253155Daniel Dunbar CmdArgs.push_back(Input.getFilename()); 358820a9aa50f9a7d4b03f97bc67e96da1d605c309a2Daniel Dunbar 3589a001c1ce5fcb669624a5b8e50d0a629d673da901Daniel Dunbar const char *Exec = getToolChain().getDriver().getClangProgramPath(); 35902fe238ed293bd4bc27af9beb9fa151fad2146fa8Daniel Dunbar C.addCommand(new Command(JA, *this, Exec, CmdArgs)); 359120a9aa50f9a7d4b03f97bc67e96da1d605c309a2Daniel Dunbar} 359220a9aa50f9a7d4b03f97bc67e96da1d605c309a2Daniel Dunbar 3593b488c1dac8e53206f07103d794a62a3f5012c0f4Daniel Dunbarvoid gcc::Common::ConstructJob(Compilation &C, const JobAction &JA, 3594b488c1dac8e53206f07103d794a62a3f5012c0f4Daniel Dunbar const InputInfo &Output, 3595b488c1dac8e53206f07103d794a62a3f5012c0f4Daniel Dunbar const InputInfoList &Inputs, 35961d46033f760ba5fd266ce59fe391fac473f04f52Daniel Dunbar const ArgList &Args, 3597b488c1dac8e53206f07103d794a62a3f5012c0f4Daniel Dunbar const char *LinkingOutput) const { 3598ee788e70fcd0adf76103b17c78ac658d4ea30c9bDaniel Dunbar const Driver &D = getToolChain().getDriver(); 3599b488c1dac8e53206f07103d794a62a3f5012c0f4Daniel Dunbar ArgStringList CmdArgs; 3600b488c1dac8e53206f07103d794a62a3f5012c0f4Daniel Dunbar 3601c21c485b4fb58ef5d55cf3e523263dd824a2ace4Daniel Dunbar for (ArgList::const_iterator 36021d46033f760ba5fd266ce59fe391fac473f04f52Daniel Dunbar it = Args.begin(), ie = Args.end(); it != ie; ++it) { 3603b488c1dac8e53206f07103d794a62a3f5012c0f4Daniel Dunbar Arg *A = *it; 360491e06dab9335ed6b4474a74353549c708cf3d936Michael J. Spencer if (forwardToGCC(A->getOption())) { 36052dffe2d9d631fefd79d4999f6ffe7ac0d70882b1Daniel Dunbar // Don't forward any -g arguments to assembly steps. 36062dffe2d9d631fefd79d4999f6ffe7ac0d70882b1Daniel Dunbar if (isa<AssembleJobAction>(JA) && 36072dffe2d9d631fefd79d4999f6ffe7ac0d70882b1Daniel Dunbar A->getOption().matches(options::OPT_g_Group)) 36082dffe2d9d631fefd79d4999f6ffe7ac0d70882b1Daniel Dunbar continue; 36092dffe2d9d631fefd79d4999f6ffe7ac0d70882b1Daniel Dunbar 36107587719c40ebf02bf11e5e66c30bd20e98edebc2Daniel Dunbar // It is unfortunate that we have to claim here, as this means 36117587719c40ebf02bf11e5e66c30bd20e98edebc2Daniel Dunbar // we will basically never report anything interesting for 36126ecc7a993f939c5255c36c7c0d965fb9c1543f2aDaniel Dunbar // platforms using a generic gcc, even if we are just using gcc 36136ecc7a993f939c5255c36c7c0d965fb9c1543f2aDaniel Dunbar // to get to the assembler. 36147587719c40ebf02bf11e5e66c30bd20e98edebc2Daniel Dunbar A->claim(); 36151d46033f760ba5fd266ce59fe391fac473f04f52Daniel Dunbar A->render(Args, CmdArgs); 36167587719c40ebf02bf11e5e66c30bd20e98edebc2Daniel Dunbar } 3617b488c1dac8e53206f07103d794a62a3f5012c0f4Daniel Dunbar } 3618c21c485b4fb58ef5d55cf3e523263dd824a2ace4Daniel Dunbar 361982b51cce8cea6b6bb6175c406c2ab425c91d9dc8Daniel Dunbar RenderExtraToolArgs(JA, CmdArgs); 3620b488c1dac8e53206f07103d794a62a3f5012c0f4Daniel Dunbar 3621b488c1dac8e53206f07103d794a62a3f5012c0f4Daniel Dunbar // If using a driver driver, force the arch. 362264f7ad9328e877779ec63638f39de4e10d2ff276Rafael Espindola llvm::Triple::ArchType Arch = getToolChain().getArch(); 3623905c45f15a25598620d19160c139c6b785aeea89Bob Wilson if (getToolChain().getTriple().isOSDarwin()) { 3624b488c1dac8e53206f07103d794a62a3f5012c0f4Daniel Dunbar CmdArgs.push_back("-arch"); 3625bf54a06f9b771c2a2730cc63eb89bce0522515b5Daniel Dunbar 3626bf54a06f9b771c2a2730cc63eb89bce0522515b5Daniel Dunbar // FIXME: Remove these special cases. 362764f7ad9328e877779ec63638f39de4e10d2ff276Rafael Espindola if (Arch == llvm::Triple::ppc) 36287cfe31a713d8fcfc2a1328e8fbd8efdeb0aec51bDaniel Dunbar CmdArgs.push_back("ppc"); 362964f7ad9328e877779ec63638f39de4e10d2ff276Rafael Espindola else if (Arch == llvm::Triple::ppc64) 36307cfe31a713d8fcfc2a1328e8fbd8efdeb0aec51bDaniel Dunbar CmdArgs.push_back("ppc64"); 36317cfe31a713d8fcfc2a1328e8fbd8efdeb0aec51bDaniel Dunbar else 363264f7ad9328e877779ec63638f39de4e10d2ff276Rafael Espindola CmdArgs.push_back(Args.MakeArgString(getToolChain().getArchName())); 3633b488c1dac8e53206f07103d794a62a3f5012c0f4Daniel Dunbar } 3634b488c1dac8e53206f07103d794a62a3f5012c0f4Daniel Dunbar 36356ecc7a993f939c5255c36c7c0d965fb9c1543f2aDaniel Dunbar // Try to force gcc to match the tool chain we want, if we recognize 36366ecc7a993f939c5255c36c7c0d965fb9c1543f2aDaniel Dunbar // the arch. 36377cfe31a713d8fcfc2a1328e8fbd8efdeb0aec51bDaniel Dunbar // 36387cfe31a713d8fcfc2a1328e8fbd8efdeb0aec51bDaniel Dunbar // FIXME: The triple class should directly provide the information we want 36397cfe31a713d8fcfc2a1328e8fbd8efdeb0aec51bDaniel Dunbar // here. 364064f7ad9328e877779ec63638f39de4e10d2ff276Rafael Espindola if (Arch == llvm::Triple::x86 || Arch == llvm::Triple::ppc) 36416ecc7a993f939c5255c36c7c0d965fb9c1543f2aDaniel Dunbar CmdArgs.push_back("-m32"); 364264f7ad9328e877779ec63638f39de4e10d2ff276Rafael Espindola else if (Arch == llvm::Triple::x86_64 || Arch == llvm::Triple::x86_64) 36436ecc7a993f939c5255c36c7c0d965fb9c1543f2aDaniel Dunbar CmdArgs.push_back("-m64"); 36446ecc7a993f939c5255c36c7c0d965fb9c1543f2aDaniel Dunbar 36457c1e46533cae07216e2a67d5636a5afb44253155Daniel Dunbar if (Output.isFilename()) { 3646b488c1dac8e53206f07103d794a62a3f5012c0f4Daniel Dunbar CmdArgs.push_back("-o"); 3647115a79277edababaf1b26e3654044ae983197679Daniel Dunbar CmdArgs.push_back(Output.getFilename()); 3648115a79277edababaf1b26e3654044ae983197679Daniel Dunbar } else { 3649115a79277edababaf1b26e3654044ae983197679Daniel Dunbar assert(Output.isNothing() && "Unexpected output"); 3650b488c1dac8e53206f07103d794a62a3f5012c0f4Daniel Dunbar CmdArgs.push_back("-fsyntax-only"); 3651115a79277edababaf1b26e3654044ae983197679Daniel Dunbar } 3652b488c1dac8e53206f07103d794a62a3f5012c0f4Daniel Dunbar 36539631939f82c0eaa6fb3936a0ce58a41adfbc9011Tony Linthicum Args.AddAllArgValues(CmdArgs, options::OPT_Wa_COMMA, 36549631939f82c0eaa6fb3936a0ce58a41adfbc9011Tony Linthicum options::OPT_Xassembler); 3655b488c1dac8e53206f07103d794a62a3f5012c0f4Daniel Dunbar 3656b488c1dac8e53206f07103d794a62a3f5012c0f4Daniel Dunbar // Only pass -x if gcc will understand it; otherwise hope gcc 3657b488c1dac8e53206f07103d794a62a3f5012c0f4Daniel Dunbar // understands the suffix correctly. The main use case this would go 3658b488c1dac8e53206f07103d794a62a3f5012c0f4Daniel Dunbar // wrong in is for linker inputs if they happened to have an odd 3659b488c1dac8e53206f07103d794a62a3f5012c0f4Daniel Dunbar // suffix; really the only way to get this to happen is a command 3660b488c1dac8e53206f07103d794a62a3f5012c0f4Daniel Dunbar // like '-x foobar a.c' which will treat a.c like a linker input. 3661b488c1dac8e53206f07103d794a62a3f5012c0f4Daniel Dunbar // 3662b488c1dac8e53206f07103d794a62a3f5012c0f4Daniel Dunbar // FIXME: For the linker case specifically, can we safely convert 3663b488c1dac8e53206f07103d794a62a3f5012c0f4Daniel Dunbar // inputs into '-Wl,' options? 3664b488c1dac8e53206f07103d794a62a3f5012c0f4Daniel Dunbar for (InputInfoList::const_iterator 3665b488c1dac8e53206f07103d794a62a3f5012c0f4Daniel Dunbar it = Inputs.begin(), ie = Inputs.end(); it != ie; ++it) { 3666b488c1dac8e53206f07103d794a62a3f5012c0f4Daniel Dunbar const InputInfo &II = *it; 3667a8304f67291b0182fb64f3afc621615288dd1d31Daniel Dunbar 36685915fbf310e171c4cd3c2af05e9de360c0fa988aDaniel Dunbar // Don't try to pass LLVM or AST inputs to a generic gcc. 36696c6424bc0d3b5f080a97b5f6ef4a8d70c38e38f5Daniel Dunbar if (II.getType() == types::TY_LLVM_IR || II.getType() == types::TY_LTO_IR || 36706c6424bc0d3b5f080a97b5f6ef4a8d70c38e38f5Daniel Dunbar II.getType() == types::TY_LLVM_BC || II.getType() == types::TY_LTO_BC) 36715f9e272e632e951b1efe824cd16acb4d96077930Chris Lattner D.Diag(diag::err_drv_no_linker_llvm_support) 3672881376467c46c5c6cc16fa6790271c2c22e1d4f1Daniel Dunbar << getToolChain().getTripleString(); 36735915fbf310e171c4cd3c2af05e9de360c0fa988aDaniel Dunbar else if (II.getType() == types::TY_AST) 36745f9e272e632e951b1efe824cd16acb4d96077930Chris Lattner D.Diag(diag::err_drv_no_ast_support) 3675881376467c46c5c6cc16fa6790271c2c22e1d4f1Daniel Dunbar << getToolChain().getTripleString(); 3676a8304f67291b0182fb64f3afc621615288dd1d31Daniel Dunbar 3677b488c1dac8e53206f07103d794a62a3f5012c0f4Daniel Dunbar if (types::canTypeBeUserSpecified(II.getType())) { 3678b488c1dac8e53206f07103d794a62a3f5012c0f4Daniel Dunbar CmdArgs.push_back("-x"); 3679b488c1dac8e53206f07103d794a62a3f5012c0f4Daniel Dunbar CmdArgs.push_back(types::getTypeName(II.getType())); 3680b488c1dac8e53206f07103d794a62a3f5012c0f4Daniel Dunbar } 3681b488c1dac8e53206f07103d794a62a3f5012c0f4Daniel Dunbar 36827c1e46533cae07216e2a67d5636a5afb44253155Daniel Dunbar if (II.isFilename()) 3683115a79277edababaf1b26e3654044ae983197679Daniel Dunbar CmdArgs.push_back(II.getFilename()); 368448f9994bdd9f7f1853782109595b1f80f50afcfaDaniel Dunbar else { 368548f9994bdd9f7f1853782109595b1f80f50afcfaDaniel Dunbar const Arg &A = II.getInputArg(); 368648f9994bdd9f7f1853782109595b1f80f50afcfaDaniel Dunbar 368748f9994bdd9f7f1853782109595b1f80f50afcfaDaniel Dunbar // Reverse translate some rewritten options. 368848f9994bdd9f7f1853782109595b1f80f50afcfaDaniel Dunbar if (A.getOption().matches(options::OPT_Z_reserved_lib_stdcxx)) { 368948f9994bdd9f7f1853782109595b1f80f50afcfaDaniel Dunbar CmdArgs.push_back("-lstdc++"); 369048f9994bdd9f7f1853782109595b1f80f50afcfaDaniel Dunbar continue; 369148f9994bdd9f7f1853782109595b1f80f50afcfaDaniel Dunbar } 369248f9994bdd9f7f1853782109595b1f80f50afcfaDaniel Dunbar 3693115a79277edababaf1b26e3654044ae983197679Daniel Dunbar // Don't render as input, we need gcc to do the translations. 369448f9994bdd9f7f1853782109595b1f80f50afcfaDaniel Dunbar A.render(Args, CmdArgs); 369548f9994bdd9f7f1853782109595b1f80f50afcfaDaniel Dunbar } 3696b488c1dac8e53206f07103d794a62a3f5012c0f4Daniel Dunbar } 3697b488c1dac8e53206f07103d794a62a3f5012c0f4Daniel Dunbar 3698b8a3e8139b9fe513500c89bbcd9133415654a689Dylan Noblesmith const std::string customGCCName = D.getCCCGenericGCCName(); 3699b8a3e8139b9fe513500c89bbcd9133415654a689Dylan Noblesmith const char *GCCName; 3700b8a3e8139b9fe513500c89bbcd9133415654a689Dylan Noblesmith if (!customGCCName.empty()) 3701b8a3e8139b9fe513500c89bbcd9133415654a689Dylan Noblesmith GCCName = customGCCName.c_str(); 3702b8a3e8139b9fe513500c89bbcd9133415654a689Dylan Noblesmith else if (D.CCCIsCXX) { 3703b8a3e8139b9fe513500c89bbcd9133415654a689Dylan Noblesmith GCCName = "g++"; 3704b8a3e8139b9fe513500c89bbcd9133415654a689Dylan Noblesmith } else 3705b8a3e8139b9fe513500c89bbcd9133415654a689Dylan Noblesmith GCCName = "gcc"; 3706b8a3e8139b9fe513500c89bbcd9133415654a689Dylan Noblesmith 3707c21c485b4fb58ef5d55cf3e523263dd824a2ace4Daniel Dunbar const char *Exec = 37084a7e88978cf646ad10d654020cb00b3877069210Daniel Dunbar Args.MakeArgString(getToolChain().GetProgramPath(GCCName)); 37092fe238ed293bd4bc27af9beb9fa151fad2146fa8Daniel Dunbar C.addCommand(new Command(JA, *this, Exec, CmdArgs)); 371047ac7d27c44bd64a7d0fc03d4babc196cf2b8230Daniel Dunbar} 371147ac7d27c44bd64a7d0fc03d4babc196cf2b8230Daniel Dunbar 371282b51cce8cea6b6bb6175c406c2ab425c91d9dc8Daniel Dunbarvoid gcc::Preprocess::RenderExtraToolArgs(const JobAction &JA, 371382b51cce8cea6b6bb6175c406c2ab425c91d9dc8Daniel Dunbar ArgStringList &CmdArgs) const { 3714b488c1dac8e53206f07103d794a62a3f5012c0f4Daniel Dunbar CmdArgs.push_back("-E"); 371547ac7d27c44bd64a7d0fc03d4babc196cf2b8230Daniel Dunbar} 371647ac7d27c44bd64a7d0fc03d4babc196cf2b8230Daniel Dunbar 371782b51cce8cea6b6bb6175c406c2ab425c91d9dc8Daniel Dunbarvoid gcc::Precompile::RenderExtraToolArgs(const JobAction &JA, 371882b51cce8cea6b6bb6175c406c2ab425c91d9dc8Daniel Dunbar ArgStringList &CmdArgs) const { 3719b488c1dac8e53206f07103d794a62a3f5012c0f4Daniel Dunbar // The type is good enough. 372047ac7d27c44bd64a7d0fc03d4babc196cf2b8230Daniel Dunbar} 372147ac7d27c44bd64a7d0fc03d4babc196cf2b8230Daniel Dunbar 372282b51cce8cea6b6bb6175c406c2ab425c91d9dc8Daniel Dunbarvoid gcc::Compile::RenderExtraToolArgs(const JobAction &JA, 372382b51cce8cea6b6bb6175c406c2ab425c91d9dc8Daniel Dunbar ArgStringList &CmdArgs) const { 372464952508c2b0c8bffb45c8b410f0af3d2457f59bDaniel Dunbar const Driver &D = getToolChain().getDriver(); 372564952508c2b0c8bffb45c8b410f0af3d2457f59bDaniel Dunbar 372682b51cce8cea6b6bb6175c406c2ab425c91d9dc8Daniel Dunbar // If -flto, etc. are present then make sure not to force assembly output. 37276c6424bc0d3b5f080a97b5f6ef4a8d70c38e38f5Daniel Dunbar if (JA.getType() == types::TY_LLVM_IR || JA.getType() == types::TY_LTO_IR || 37286c6424bc0d3b5f080a97b5f6ef4a8d70c38e38f5Daniel Dunbar JA.getType() == types::TY_LLVM_BC || JA.getType() == types::TY_LTO_BC) 372982b51cce8cea6b6bb6175c406c2ab425c91d9dc8Daniel Dunbar CmdArgs.push_back("-c"); 373064952508c2b0c8bffb45c8b410f0af3d2457f59bDaniel Dunbar else { 373164952508c2b0c8bffb45c8b410f0af3d2457f59bDaniel Dunbar if (JA.getType() != types::TY_PP_Asm) 37325f9e272e632e951b1efe824cd16acb4d96077930Chris Lattner D.Diag(diag::err_drv_invalid_gcc_output_type) 373364952508c2b0c8bffb45c8b410f0af3d2457f59bDaniel Dunbar << getTypeName(JA.getType()); 373420249a1af2e462dcafdd6a350f1c7967b264ff25Michael J. Spencer 373582b51cce8cea6b6bb6175c406c2ab425c91d9dc8Daniel Dunbar CmdArgs.push_back("-S"); 373664952508c2b0c8bffb45c8b410f0af3d2457f59bDaniel Dunbar } 373747ac7d27c44bd64a7d0fc03d4babc196cf2b8230Daniel Dunbar} 373847ac7d27c44bd64a7d0fc03d4babc196cf2b8230Daniel Dunbar 373982b51cce8cea6b6bb6175c406c2ab425c91d9dc8Daniel Dunbarvoid gcc::Assemble::RenderExtraToolArgs(const JobAction &JA, 374082b51cce8cea6b6bb6175c406c2ab425c91d9dc8Daniel Dunbar ArgStringList &CmdArgs) const { 3741b488c1dac8e53206f07103d794a62a3f5012c0f4Daniel Dunbar CmdArgs.push_back("-c"); 3742b488c1dac8e53206f07103d794a62a3f5012c0f4Daniel Dunbar} 374347ac7d27c44bd64a7d0fc03d4babc196cf2b8230Daniel Dunbar 374482b51cce8cea6b6bb6175c406c2ab425c91d9dc8Daniel Dunbarvoid gcc::Link::RenderExtraToolArgs(const JobAction &JA, 374582b51cce8cea6b6bb6175c406c2ab425c91d9dc8Daniel Dunbar ArgStringList &CmdArgs) const { 3746b488c1dac8e53206f07103d794a62a3f5012c0f4Daniel Dunbar // The types are (hopefully) good enough. 374747ac7d27c44bd64a7d0fc03d4babc196cf2b8230Daniel Dunbar} 3748b488c1dac8e53206f07103d794a62a3f5012c0f4Daniel Dunbar 37499631939f82c0eaa6fb3936a0ce58a41adfbc9011Tony Linthicum// Hexagon tools start. 37509631939f82c0eaa6fb3936a0ce58a41adfbc9011Tony Linthicumvoid hexagon::Assemble::RenderExtraToolArgs(const JobAction &JA, 37519631939f82c0eaa6fb3936a0ce58a41adfbc9011Tony Linthicum ArgStringList &CmdArgs) const { 37529631939f82c0eaa6fb3936a0ce58a41adfbc9011Tony Linthicum 37539631939f82c0eaa6fb3936a0ce58a41adfbc9011Tony Linthicum} 37549631939f82c0eaa6fb3936a0ce58a41adfbc9011Tony Linthicumvoid hexagon::Assemble::ConstructJob(Compilation &C, const JobAction &JA, 37559631939f82c0eaa6fb3936a0ce58a41adfbc9011Tony Linthicum const InputInfo &Output, 37569631939f82c0eaa6fb3936a0ce58a41adfbc9011Tony Linthicum const InputInfoList &Inputs, 37579631939f82c0eaa6fb3936a0ce58a41adfbc9011Tony Linthicum const ArgList &Args, 37589631939f82c0eaa6fb3936a0ce58a41adfbc9011Tony Linthicum const char *LinkingOutput) const { 37599631939f82c0eaa6fb3936a0ce58a41adfbc9011Tony Linthicum 37609631939f82c0eaa6fb3936a0ce58a41adfbc9011Tony Linthicum const Driver &D = getToolChain().getDriver(); 37619631939f82c0eaa6fb3936a0ce58a41adfbc9011Tony Linthicum ArgStringList CmdArgs; 37629631939f82c0eaa6fb3936a0ce58a41adfbc9011Tony Linthicum 37639631939f82c0eaa6fb3936a0ce58a41adfbc9011Tony Linthicum std::string MarchString = "-march="; 37646781415fa6d98aed548e84a70f1cd3ec31bba7d3Matthew Curtis MarchString += toolchains::Hexagon_TC::GetTargetCPU(Args); 37659631939f82c0eaa6fb3936a0ce58a41adfbc9011Tony Linthicum CmdArgs.push_back(Args.MakeArgString(MarchString)); 37669631939f82c0eaa6fb3936a0ce58a41adfbc9011Tony Linthicum 37679631939f82c0eaa6fb3936a0ce58a41adfbc9011Tony Linthicum RenderExtraToolArgs(JA, CmdArgs); 37689631939f82c0eaa6fb3936a0ce58a41adfbc9011Tony Linthicum 37699631939f82c0eaa6fb3936a0ce58a41adfbc9011Tony Linthicum if (Output.isFilename()) { 37709631939f82c0eaa6fb3936a0ce58a41adfbc9011Tony Linthicum CmdArgs.push_back("-o"); 37719631939f82c0eaa6fb3936a0ce58a41adfbc9011Tony Linthicum CmdArgs.push_back(Output.getFilename()); 37729631939f82c0eaa6fb3936a0ce58a41adfbc9011Tony Linthicum } else { 37739631939f82c0eaa6fb3936a0ce58a41adfbc9011Tony Linthicum assert(Output.isNothing() && "Unexpected output"); 37749631939f82c0eaa6fb3936a0ce58a41adfbc9011Tony Linthicum CmdArgs.push_back("-fsyntax-only"); 37759631939f82c0eaa6fb3936a0ce58a41adfbc9011Tony Linthicum } 37769631939f82c0eaa6fb3936a0ce58a41adfbc9011Tony Linthicum 377733c95f1178999ea06837769f90be8d7b8d57bb4dMatthew Curtis std::string SmallDataThreshold = GetHexagonSmallDataThresholdValue(Args); 377833c95f1178999ea06837769f90be8d7b8d57bb4dMatthew Curtis if (!SmallDataThreshold.empty()) 377933c95f1178999ea06837769f90be8d7b8d57bb4dMatthew Curtis CmdArgs.push_back( 378033c95f1178999ea06837769f90be8d7b8d57bb4dMatthew Curtis Args.MakeArgString(std::string("-G") + SmallDataThreshold)); 37819631939f82c0eaa6fb3936a0ce58a41adfbc9011Tony Linthicum 37823d8d4223813506df2f1b71cbb2f4a175faf85e6aMatthew Curtis Args.AddAllArgs(CmdArgs, options::OPT_g_Group); 37833d8d4223813506df2f1b71cbb2f4a175faf85e6aMatthew Curtis Args.AddAllArgValues(CmdArgs, options::OPT_Wa_COMMA, 37843d8d4223813506df2f1b71cbb2f4a175faf85e6aMatthew Curtis options::OPT_Xassembler); 37853d8d4223813506df2f1b71cbb2f4a175faf85e6aMatthew Curtis 37869631939f82c0eaa6fb3936a0ce58a41adfbc9011Tony Linthicum // Only pass -x if gcc will understand it; otherwise hope gcc 37879631939f82c0eaa6fb3936a0ce58a41adfbc9011Tony Linthicum // understands the suffix correctly. The main use case this would go 37889631939f82c0eaa6fb3936a0ce58a41adfbc9011Tony Linthicum // wrong in is for linker inputs if they happened to have an odd 37899631939f82c0eaa6fb3936a0ce58a41adfbc9011Tony Linthicum // suffix; really the only way to get this to happen is a command 37909631939f82c0eaa6fb3936a0ce58a41adfbc9011Tony Linthicum // like '-x foobar a.c' which will treat a.c like a linker input. 37919631939f82c0eaa6fb3936a0ce58a41adfbc9011Tony Linthicum // 37929631939f82c0eaa6fb3936a0ce58a41adfbc9011Tony Linthicum // FIXME: For the linker case specifically, can we safely convert 37939631939f82c0eaa6fb3936a0ce58a41adfbc9011Tony Linthicum // inputs into '-Wl,' options? 37949631939f82c0eaa6fb3936a0ce58a41adfbc9011Tony Linthicum for (InputInfoList::const_iterator 37959631939f82c0eaa6fb3936a0ce58a41adfbc9011Tony Linthicum it = Inputs.begin(), ie = Inputs.end(); it != ie; ++it) { 37969631939f82c0eaa6fb3936a0ce58a41adfbc9011Tony Linthicum const InputInfo &II = *it; 37979631939f82c0eaa6fb3936a0ce58a41adfbc9011Tony Linthicum 37989631939f82c0eaa6fb3936a0ce58a41adfbc9011Tony Linthicum // Don't try to pass LLVM or AST inputs to a generic gcc. 37999631939f82c0eaa6fb3936a0ce58a41adfbc9011Tony Linthicum if (II.getType() == types::TY_LLVM_IR || II.getType() == types::TY_LTO_IR || 38009631939f82c0eaa6fb3936a0ce58a41adfbc9011Tony Linthicum II.getType() == types::TY_LLVM_BC || II.getType() == types::TY_LTO_BC) 38019631939f82c0eaa6fb3936a0ce58a41adfbc9011Tony Linthicum D.Diag(clang::diag::err_drv_no_linker_llvm_support) 38029631939f82c0eaa6fb3936a0ce58a41adfbc9011Tony Linthicum << getToolChain().getTripleString(); 38039631939f82c0eaa6fb3936a0ce58a41adfbc9011Tony Linthicum else if (II.getType() == types::TY_AST) 38049631939f82c0eaa6fb3936a0ce58a41adfbc9011Tony Linthicum D.Diag(clang::diag::err_drv_no_ast_support) 38059631939f82c0eaa6fb3936a0ce58a41adfbc9011Tony Linthicum << getToolChain().getTripleString(); 38069631939f82c0eaa6fb3936a0ce58a41adfbc9011Tony Linthicum 38079631939f82c0eaa6fb3936a0ce58a41adfbc9011Tony Linthicum if (II.isFilename()) 38089631939f82c0eaa6fb3936a0ce58a41adfbc9011Tony Linthicum CmdArgs.push_back(II.getFilename()); 38099631939f82c0eaa6fb3936a0ce58a41adfbc9011Tony Linthicum else 38109631939f82c0eaa6fb3936a0ce58a41adfbc9011Tony Linthicum // Don't render as input, we need gcc to do the translations. FIXME: Pranav: What is this ? 38119631939f82c0eaa6fb3936a0ce58a41adfbc9011Tony Linthicum II.getInputArg().render(Args, CmdArgs); 38129631939f82c0eaa6fb3936a0ce58a41adfbc9011Tony Linthicum } 38139631939f82c0eaa6fb3936a0ce58a41adfbc9011Tony Linthicum 38149631939f82c0eaa6fb3936a0ce58a41adfbc9011Tony Linthicum const char *GCCName = "hexagon-as"; 38159631939f82c0eaa6fb3936a0ce58a41adfbc9011Tony Linthicum const char *Exec = 38169631939f82c0eaa6fb3936a0ce58a41adfbc9011Tony Linthicum Args.MakeArgString(getToolChain().GetProgramPath(GCCName)); 38179631939f82c0eaa6fb3936a0ce58a41adfbc9011Tony Linthicum C.addCommand(new Command(JA, *this, Exec, CmdArgs)); 38189631939f82c0eaa6fb3936a0ce58a41adfbc9011Tony Linthicum 38199631939f82c0eaa6fb3936a0ce58a41adfbc9011Tony Linthicum} 38209631939f82c0eaa6fb3936a0ce58a41adfbc9011Tony Linthicumvoid hexagon::Link::RenderExtraToolArgs(const JobAction &JA, 38219631939f82c0eaa6fb3936a0ce58a41adfbc9011Tony Linthicum ArgStringList &CmdArgs) const { 38229631939f82c0eaa6fb3936a0ce58a41adfbc9011Tony Linthicum // The types are (hopefully) good enough. 38239631939f82c0eaa6fb3936a0ce58a41adfbc9011Tony Linthicum} 38249631939f82c0eaa6fb3936a0ce58a41adfbc9011Tony Linthicum 38259631939f82c0eaa6fb3936a0ce58a41adfbc9011Tony Linthicumvoid hexagon::Link::ConstructJob(Compilation &C, const JobAction &JA, 38269631939f82c0eaa6fb3936a0ce58a41adfbc9011Tony Linthicum const InputInfo &Output, 38279631939f82c0eaa6fb3936a0ce58a41adfbc9011Tony Linthicum const InputInfoList &Inputs, 38289631939f82c0eaa6fb3936a0ce58a41adfbc9011Tony Linthicum const ArgList &Args, 38299631939f82c0eaa6fb3936a0ce58a41adfbc9011Tony Linthicum const char *LinkingOutput) const { 38309631939f82c0eaa6fb3936a0ce58a41adfbc9011Tony Linthicum 38315fdf350e39c6e260602dbbd709101a9bb55e75f1Matthew Curtis const toolchains::Hexagon_TC& ToolChain = 38325fdf350e39c6e260602dbbd709101a9bb55e75f1Matthew Curtis static_cast<const toolchains::Hexagon_TC&>(getToolChain()); 38335fdf350e39c6e260602dbbd709101a9bb55e75f1Matthew Curtis const Driver &D = ToolChain.getDriver(); 38345fdf350e39c6e260602dbbd709101a9bb55e75f1Matthew Curtis 38359631939f82c0eaa6fb3936a0ce58a41adfbc9011Tony Linthicum ArgStringList CmdArgs; 38369631939f82c0eaa6fb3936a0ce58a41adfbc9011Tony Linthicum 38375fdf350e39c6e260602dbbd709101a9bb55e75f1Matthew Curtis //---------------------------------------------------------------------------- 38385fdf350e39c6e260602dbbd709101a9bb55e75f1Matthew Curtis // 38395fdf350e39c6e260602dbbd709101a9bb55e75f1Matthew Curtis //---------------------------------------------------------------------------- 38405fdf350e39c6e260602dbbd709101a9bb55e75f1Matthew Curtis bool hasStaticArg = Args.hasArg(options::OPT_static); 38415fdf350e39c6e260602dbbd709101a9bb55e75f1Matthew Curtis bool buildingLib = Args.hasArg(options::OPT_shared); 384233c95f1178999ea06837769f90be8d7b8d57bb4dMatthew Curtis bool buildPIE = Args.hasArg(options::OPT_pie); 38435fdf350e39c6e260602dbbd709101a9bb55e75f1Matthew Curtis bool incStdLib = !Args.hasArg(options::OPT_nostdlib); 38445fdf350e39c6e260602dbbd709101a9bb55e75f1Matthew Curtis bool incStartFiles = !Args.hasArg(options::OPT_nostartfiles); 38455fdf350e39c6e260602dbbd709101a9bb55e75f1Matthew Curtis bool incDefLibs = !Args.hasArg(options::OPT_nodefaultlibs); 38465fdf350e39c6e260602dbbd709101a9bb55e75f1Matthew Curtis bool useShared = buildingLib && !hasStaticArg; 38475fdf350e39c6e260602dbbd709101a9bb55e75f1Matthew Curtis 38485fdf350e39c6e260602dbbd709101a9bb55e75f1Matthew Curtis //---------------------------------------------------------------------------- 38495fdf350e39c6e260602dbbd709101a9bb55e75f1Matthew Curtis // Silence warnings for various options 38505fdf350e39c6e260602dbbd709101a9bb55e75f1Matthew Curtis //---------------------------------------------------------------------------- 38519631939f82c0eaa6fb3936a0ce58a41adfbc9011Tony Linthicum 38525fdf350e39c6e260602dbbd709101a9bb55e75f1Matthew Curtis Args.ClaimAllArgs(options::OPT_g_Group); 38535fdf350e39c6e260602dbbd709101a9bb55e75f1Matthew Curtis Args.ClaimAllArgs(options::OPT_emit_llvm); 38545fdf350e39c6e260602dbbd709101a9bb55e75f1Matthew Curtis Args.ClaimAllArgs(options::OPT_w); // Other warning options are already 38555fdf350e39c6e260602dbbd709101a9bb55e75f1Matthew Curtis // handled somewhere else. 38565fdf350e39c6e260602dbbd709101a9bb55e75f1Matthew Curtis Args.ClaimAllArgs(options::OPT_static_libgcc); 38579631939f82c0eaa6fb3936a0ce58a41adfbc9011Tony Linthicum 38585fdf350e39c6e260602dbbd709101a9bb55e75f1Matthew Curtis //---------------------------------------------------------------------------- 38595fdf350e39c6e260602dbbd709101a9bb55e75f1Matthew Curtis // 38605fdf350e39c6e260602dbbd709101a9bb55e75f1Matthew Curtis //---------------------------------------------------------------------------- 38615fdf350e39c6e260602dbbd709101a9bb55e75f1Matthew Curtis for (std::vector<std::string>::const_iterator i = ToolChain.ExtraOpts.begin(), 38625fdf350e39c6e260602dbbd709101a9bb55e75f1Matthew Curtis e = ToolChain.ExtraOpts.end(); 38635fdf350e39c6e260602dbbd709101a9bb55e75f1Matthew Curtis i != e; ++i) 38645fdf350e39c6e260602dbbd709101a9bb55e75f1Matthew Curtis CmdArgs.push_back(i->c_str()); 38659631939f82c0eaa6fb3936a0ce58a41adfbc9011Tony Linthicum 38666781415fa6d98aed548e84a70f1cd3ec31bba7d3Matthew Curtis std::string MarchString = toolchains::Hexagon_TC::GetTargetCPU(Args); 38676781415fa6d98aed548e84a70f1cd3ec31bba7d3Matthew Curtis CmdArgs.push_back(Args.MakeArgString("-m" + MarchString)); 386843115d4904431917ef6852ee089a8520b9940ba5Sebastian Pop 38695fdf350e39c6e260602dbbd709101a9bb55e75f1Matthew Curtis if (buildingLib) { 38705fdf350e39c6e260602dbbd709101a9bb55e75f1Matthew Curtis CmdArgs.push_back("-shared"); 38715fdf350e39c6e260602dbbd709101a9bb55e75f1Matthew Curtis CmdArgs.push_back("-call_shared"); // should be the default, but doing as 38725fdf350e39c6e260602dbbd709101a9bb55e75f1Matthew Curtis // hexagon-gcc does 38735fdf350e39c6e260602dbbd709101a9bb55e75f1Matthew Curtis } 38749631939f82c0eaa6fb3936a0ce58a41adfbc9011Tony Linthicum 38755fdf350e39c6e260602dbbd709101a9bb55e75f1Matthew Curtis if (hasStaticArg) 38765fdf350e39c6e260602dbbd709101a9bb55e75f1Matthew Curtis CmdArgs.push_back("-static"); 38779631939f82c0eaa6fb3936a0ce58a41adfbc9011Tony Linthicum 387833c95f1178999ea06837769f90be8d7b8d57bb4dMatthew Curtis if (buildPIE && !buildingLib) 387933c95f1178999ea06837769f90be8d7b8d57bb4dMatthew Curtis CmdArgs.push_back("-pie"); 388033c95f1178999ea06837769f90be8d7b8d57bb4dMatthew Curtis 388133c95f1178999ea06837769f90be8d7b8d57bb4dMatthew Curtis std::string SmallDataThreshold = GetHexagonSmallDataThresholdValue(Args); 388233c95f1178999ea06837769f90be8d7b8d57bb4dMatthew Curtis if (!SmallDataThreshold.empty()) { 388333c95f1178999ea06837769f90be8d7b8d57bb4dMatthew Curtis CmdArgs.push_back( 388433c95f1178999ea06837769f90be8d7b8d57bb4dMatthew Curtis Args.MakeArgString(std::string("-G") + SmallDataThreshold)); 388533c95f1178999ea06837769f90be8d7b8d57bb4dMatthew Curtis } 388633c95f1178999ea06837769f90be8d7b8d57bb4dMatthew Curtis 38875fdf350e39c6e260602dbbd709101a9bb55e75f1Matthew Curtis //---------------------------------------------------------------------------- 38885fdf350e39c6e260602dbbd709101a9bb55e75f1Matthew Curtis // 38895fdf350e39c6e260602dbbd709101a9bb55e75f1Matthew Curtis //---------------------------------------------------------------------------- 38905fdf350e39c6e260602dbbd709101a9bb55e75f1Matthew Curtis CmdArgs.push_back("-o"); 38915fdf350e39c6e260602dbbd709101a9bb55e75f1Matthew Curtis CmdArgs.push_back(Output.getFilename()); 38925fdf350e39c6e260602dbbd709101a9bb55e75f1Matthew Curtis 38935fdf350e39c6e260602dbbd709101a9bb55e75f1Matthew Curtis const std::string MarchSuffix = "/" + MarchString; 38945fdf350e39c6e260602dbbd709101a9bb55e75f1Matthew Curtis const std::string G0Suffix = "/G0"; 38955fdf350e39c6e260602dbbd709101a9bb55e75f1Matthew Curtis const std::string MarchG0Suffix = MarchSuffix + G0Suffix; 38965fdf350e39c6e260602dbbd709101a9bb55e75f1Matthew Curtis const std::string RootDir = toolchains::Hexagon_TC::GetGnuDir(D.InstalledDir) 38975fdf350e39c6e260602dbbd709101a9bb55e75f1Matthew Curtis + "/"; 38985fdf350e39c6e260602dbbd709101a9bb55e75f1Matthew Curtis const std::string StartFilesDir = RootDir 38995fdf350e39c6e260602dbbd709101a9bb55e75f1Matthew Curtis + "hexagon/lib" 39005fdf350e39c6e260602dbbd709101a9bb55e75f1Matthew Curtis + (buildingLib 39015fdf350e39c6e260602dbbd709101a9bb55e75f1Matthew Curtis ? MarchG0Suffix : MarchSuffix); 39025fdf350e39c6e260602dbbd709101a9bb55e75f1Matthew Curtis 39035fdf350e39c6e260602dbbd709101a9bb55e75f1Matthew Curtis //---------------------------------------------------------------------------- 39045fdf350e39c6e260602dbbd709101a9bb55e75f1Matthew Curtis // moslib 39055fdf350e39c6e260602dbbd709101a9bb55e75f1Matthew Curtis //---------------------------------------------------------------------------- 39065fdf350e39c6e260602dbbd709101a9bb55e75f1Matthew Curtis std::vector<std::string> oslibs; 39075fdf350e39c6e260602dbbd709101a9bb55e75f1Matthew Curtis bool hasStandalone= false; 39085fdf350e39c6e260602dbbd709101a9bb55e75f1Matthew Curtis 39095fdf350e39c6e260602dbbd709101a9bb55e75f1Matthew Curtis for (arg_iterator it = Args.filtered_begin(options::OPT_moslib_EQ), 39105fdf350e39c6e260602dbbd709101a9bb55e75f1Matthew Curtis ie = Args.filtered_end(); it != ie; ++it) { 39115fdf350e39c6e260602dbbd709101a9bb55e75f1Matthew Curtis (*it)->claim(); 39125fdf350e39c6e260602dbbd709101a9bb55e75f1Matthew Curtis oslibs.push_back((*it)->getValue()); 39135fdf350e39c6e260602dbbd709101a9bb55e75f1Matthew Curtis hasStandalone = hasStandalone || (oslibs.back() == "standalone"); 39145fdf350e39c6e260602dbbd709101a9bb55e75f1Matthew Curtis } 39155fdf350e39c6e260602dbbd709101a9bb55e75f1Matthew Curtis if (oslibs.empty()) { 39165fdf350e39c6e260602dbbd709101a9bb55e75f1Matthew Curtis oslibs.push_back("standalone"); 39175fdf350e39c6e260602dbbd709101a9bb55e75f1Matthew Curtis hasStandalone = true; 39189631939f82c0eaa6fb3936a0ce58a41adfbc9011Tony Linthicum } 39199631939f82c0eaa6fb3936a0ce58a41adfbc9011Tony Linthicum 39205fdf350e39c6e260602dbbd709101a9bb55e75f1Matthew Curtis //---------------------------------------------------------------------------- 39215fdf350e39c6e260602dbbd709101a9bb55e75f1Matthew Curtis // Start Files 39225fdf350e39c6e260602dbbd709101a9bb55e75f1Matthew Curtis //---------------------------------------------------------------------------- 39235fdf350e39c6e260602dbbd709101a9bb55e75f1Matthew Curtis if (incStdLib && incStartFiles) { 39249631939f82c0eaa6fb3936a0ce58a41adfbc9011Tony Linthicum 39255fdf350e39c6e260602dbbd709101a9bb55e75f1Matthew Curtis if (!buildingLib) { 39265fdf350e39c6e260602dbbd709101a9bb55e75f1Matthew Curtis if (hasStandalone) { 39275fdf350e39c6e260602dbbd709101a9bb55e75f1Matthew Curtis CmdArgs.push_back( 39285fdf350e39c6e260602dbbd709101a9bb55e75f1Matthew Curtis Args.MakeArgString(StartFilesDir + "/crt0_standalone.o")); 39295fdf350e39c6e260602dbbd709101a9bb55e75f1Matthew Curtis } 39305fdf350e39c6e260602dbbd709101a9bb55e75f1Matthew Curtis CmdArgs.push_back(Args.MakeArgString(StartFilesDir + "/crt0.o")); 39315fdf350e39c6e260602dbbd709101a9bb55e75f1Matthew Curtis } 39325fdf350e39c6e260602dbbd709101a9bb55e75f1Matthew Curtis std::string initObj = useShared ? "/initS.o" : "/init.o"; 39335fdf350e39c6e260602dbbd709101a9bb55e75f1Matthew Curtis CmdArgs.push_back(Args.MakeArgString(StartFilesDir + initObj)); 39345fdf350e39c6e260602dbbd709101a9bb55e75f1Matthew Curtis } 39355fdf350e39c6e260602dbbd709101a9bb55e75f1Matthew Curtis 39365fdf350e39c6e260602dbbd709101a9bb55e75f1Matthew Curtis //---------------------------------------------------------------------------- 39375fdf350e39c6e260602dbbd709101a9bb55e75f1Matthew Curtis // Library Search Paths 39385fdf350e39c6e260602dbbd709101a9bb55e75f1Matthew Curtis //---------------------------------------------------------------------------- 39395fdf350e39c6e260602dbbd709101a9bb55e75f1Matthew Curtis const ToolChain::path_list &LibPaths = ToolChain.getFilePaths(); 39405fdf350e39c6e260602dbbd709101a9bb55e75f1Matthew Curtis for (ToolChain::path_list::const_iterator 39415fdf350e39c6e260602dbbd709101a9bb55e75f1Matthew Curtis i = LibPaths.begin(), 39425fdf350e39c6e260602dbbd709101a9bb55e75f1Matthew Curtis e = LibPaths.end(); 39435fdf350e39c6e260602dbbd709101a9bb55e75f1Matthew Curtis i != e; 39445fdf350e39c6e260602dbbd709101a9bb55e75f1Matthew Curtis ++i) 39455fdf350e39c6e260602dbbd709101a9bb55e75f1Matthew Curtis CmdArgs.push_back(Args.MakeArgString(StringRef("-L") + *i)); 39465fdf350e39c6e260602dbbd709101a9bb55e75f1Matthew Curtis 39475fdf350e39c6e260602dbbd709101a9bb55e75f1Matthew Curtis //---------------------------------------------------------------------------- 39485fdf350e39c6e260602dbbd709101a9bb55e75f1Matthew Curtis // 39495fdf350e39c6e260602dbbd709101a9bb55e75f1Matthew Curtis //---------------------------------------------------------------------------- 39505fdf350e39c6e260602dbbd709101a9bb55e75f1Matthew Curtis Args.AddAllArgs(CmdArgs, options::OPT_T_Group); 39515fdf350e39c6e260602dbbd709101a9bb55e75f1Matthew Curtis Args.AddAllArgs(CmdArgs, options::OPT_e); 39525fdf350e39c6e260602dbbd709101a9bb55e75f1Matthew Curtis Args.AddAllArgs(CmdArgs, options::OPT_s); 39535fdf350e39c6e260602dbbd709101a9bb55e75f1Matthew Curtis Args.AddAllArgs(CmdArgs, options::OPT_t); 39545fdf350e39c6e260602dbbd709101a9bb55e75f1Matthew Curtis Args.AddAllArgs(CmdArgs, options::OPT_u_Group); 39555fdf350e39c6e260602dbbd709101a9bb55e75f1Matthew Curtis 39565fdf350e39c6e260602dbbd709101a9bb55e75f1Matthew Curtis AddLinkerInputs(ToolChain, Inputs, Args, CmdArgs); 39575fdf350e39c6e260602dbbd709101a9bb55e75f1Matthew Curtis 39585fdf350e39c6e260602dbbd709101a9bb55e75f1Matthew Curtis //---------------------------------------------------------------------------- 39595fdf350e39c6e260602dbbd709101a9bb55e75f1Matthew Curtis // Libraries 39605fdf350e39c6e260602dbbd709101a9bb55e75f1Matthew Curtis //---------------------------------------------------------------------------- 39615fdf350e39c6e260602dbbd709101a9bb55e75f1Matthew Curtis if (incStdLib && incDefLibs) { 39625fdf350e39c6e260602dbbd709101a9bb55e75f1Matthew Curtis if (D.CCCIsCXX) { 39635fdf350e39c6e260602dbbd709101a9bb55e75f1Matthew Curtis ToolChain.AddCXXStdlibLibArgs(Args, CmdArgs); 39645fdf350e39c6e260602dbbd709101a9bb55e75f1Matthew Curtis CmdArgs.push_back("-lm"); 39655fdf350e39c6e260602dbbd709101a9bb55e75f1Matthew Curtis } 39669631939f82c0eaa6fb3936a0ce58a41adfbc9011Tony Linthicum 39675fdf350e39c6e260602dbbd709101a9bb55e75f1Matthew Curtis CmdArgs.push_back("--start-group"); 39685fdf350e39c6e260602dbbd709101a9bb55e75f1Matthew Curtis 39695fdf350e39c6e260602dbbd709101a9bb55e75f1Matthew Curtis if (!buildingLib) { 39705fdf350e39c6e260602dbbd709101a9bb55e75f1Matthew Curtis for(std::vector<std::string>::iterator i = oslibs.begin(), 39715fdf350e39c6e260602dbbd709101a9bb55e75f1Matthew Curtis e = oslibs.end(); i != e; ++i) 39725fdf350e39c6e260602dbbd709101a9bb55e75f1Matthew Curtis CmdArgs.push_back(Args.MakeArgString("-l" + *i)); 39735fdf350e39c6e260602dbbd709101a9bb55e75f1Matthew Curtis CmdArgs.push_back("-lc"); 39745fdf350e39c6e260602dbbd709101a9bb55e75f1Matthew Curtis } 39755fdf350e39c6e260602dbbd709101a9bb55e75f1Matthew Curtis CmdArgs.push_back("-lgcc"); 39765fdf350e39c6e260602dbbd709101a9bb55e75f1Matthew Curtis 39775fdf350e39c6e260602dbbd709101a9bb55e75f1Matthew Curtis CmdArgs.push_back("--end-group"); 39785fdf350e39c6e260602dbbd709101a9bb55e75f1Matthew Curtis } 39795fdf350e39c6e260602dbbd709101a9bb55e75f1Matthew Curtis 39805fdf350e39c6e260602dbbd709101a9bb55e75f1Matthew Curtis //---------------------------------------------------------------------------- 39815fdf350e39c6e260602dbbd709101a9bb55e75f1Matthew Curtis // End files 39825fdf350e39c6e260602dbbd709101a9bb55e75f1Matthew Curtis //---------------------------------------------------------------------------- 39835fdf350e39c6e260602dbbd709101a9bb55e75f1Matthew Curtis if (incStdLib && incStartFiles) { 39845fdf350e39c6e260602dbbd709101a9bb55e75f1Matthew Curtis std::string finiObj = useShared ? "/finiS.o" : "/fini.o"; 39855fdf350e39c6e260602dbbd709101a9bb55e75f1Matthew Curtis CmdArgs.push_back(Args.MakeArgString(StartFilesDir + finiObj)); 39869631939f82c0eaa6fb3936a0ce58a41adfbc9011Tony Linthicum } 39879631939f82c0eaa6fb3936a0ce58a41adfbc9011Tony Linthicum 39885fdf350e39c6e260602dbbd709101a9bb55e75f1Matthew Curtis std::string Linker = ToolChain.GetProgramPath("hexagon-ld"); 39895fdf350e39c6e260602dbbd709101a9bb55e75f1Matthew Curtis C.addCommand( 39905fdf350e39c6e260602dbbd709101a9bb55e75f1Matthew Curtis new Command( 39915fdf350e39c6e260602dbbd709101a9bb55e75f1Matthew Curtis JA, *this, 39925fdf350e39c6e260602dbbd709101a9bb55e75f1Matthew Curtis Args.MakeArgString(Linker), CmdArgs)); 39939631939f82c0eaa6fb3936a0ce58a41adfbc9011Tony Linthicum} 39949631939f82c0eaa6fb3936a0ce58a41adfbc9011Tony Linthicum// Hexagon tools end. 39959631939f82c0eaa6fb3936a0ce58a41adfbc9011Tony Linthicum 3996cfed8283c3aeb03ddd837411467d19e250068d39Rafael Espindolallvm::Triple::ArchType darwin::getArchTypeForDarwinArchName(StringRef Str) { 3997cfed8283c3aeb03ddd837411467d19e250068d39Rafael Espindola // See arch(3) and llvm-gcc's driver-driver.c. We don't implement support for 3998cfed8283c3aeb03ddd837411467d19e250068d39Rafael Espindola // archs which Darwin doesn't use. 3999cfed8283c3aeb03ddd837411467d19e250068d39Rafael Espindola 4000cfed8283c3aeb03ddd837411467d19e250068d39Rafael Espindola // The matching this routine does is fairly pointless, since it is neither the 4001cfed8283c3aeb03ddd837411467d19e250068d39Rafael Espindola // complete architecture list, nor a reasonable subset. The problem is that 4002cfed8283c3aeb03ddd837411467d19e250068d39Rafael Espindola // historically the driver driver accepts this and also ties its -march= 4003cfed8283c3aeb03ddd837411467d19e250068d39Rafael Espindola // handling to the architecture name, so we need to be careful before removing 4004cfed8283c3aeb03ddd837411467d19e250068d39Rafael Espindola // support for it. 4005cfed8283c3aeb03ddd837411467d19e250068d39Rafael Espindola 4006cfed8283c3aeb03ddd837411467d19e250068d39Rafael Espindola // This code must be kept in sync with Clang's Darwin specific argument 4007cfed8283c3aeb03ddd837411467d19e250068d39Rafael Espindola // translation. 4008cfed8283c3aeb03ddd837411467d19e250068d39Rafael Espindola 4009cfed8283c3aeb03ddd837411467d19e250068d39Rafael Espindola return llvm::StringSwitch<llvm::Triple::ArchType>(Str) 4010cfed8283c3aeb03ddd837411467d19e250068d39Rafael Espindola .Cases("ppc", "ppc601", "ppc603", "ppc604", "ppc604e", llvm::Triple::ppc) 4011cfed8283c3aeb03ddd837411467d19e250068d39Rafael Espindola .Cases("ppc750", "ppc7400", "ppc7450", "ppc970", llvm::Triple::ppc) 4012cfed8283c3aeb03ddd837411467d19e250068d39Rafael Espindola .Case("ppc64", llvm::Triple::ppc64) 4013cfed8283c3aeb03ddd837411467d19e250068d39Rafael Espindola .Cases("i386", "i486", "i486SX", "i586", "i686", llvm::Triple::x86) 4014cfed8283c3aeb03ddd837411467d19e250068d39Rafael Espindola .Cases("pentium", "pentpro", "pentIIm3", "pentIIm5", "pentium4", 4015cfed8283c3aeb03ddd837411467d19e250068d39Rafael Espindola llvm::Triple::x86) 4016cfed8283c3aeb03ddd837411467d19e250068d39Rafael Espindola .Case("x86_64", llvm::Triple::x86_64) 4017cfed8283c3aeb03ddd837411467d19e250068d39Rafael Espindola // This is derived from the driver driver. 40182503ebd2cf9b4d28319551debaacff8b38765698Bob Wilson .Cases("arm", "armv4t", "armv5", "armv6", "armv6m", llvm::Triple::arm) 40192503ebd2cf9b4d28319551debaacff8b38765698Bob Wilson .Cases("armv7", "armv7em", "armv7f", "armv7k", "armv7m", llvm::Triple::arm) 40202503ebd2cf9b4d28319551debaacff8b38765698Bob Wilson .Cases("armv7s", "xscale", llvm::Triple::arm) 4021cfed8283c3aeb03ddd837411467d19e250068d39Rafael Espindola .Case("r600", llvm::Triple::r600) 4022cfed8283c3aeb03ddd837411467d19e250068d39Rafael Espindola .Case("nvptx", llvm::Triple::nvptx) 4023cfed8283c3aeb03ddd837411467d19e250068d39Rafael Espindola .Case("nvptx64", llvm::Triple::nvptx64) 4024cfed8283c3aeb03ddd837411467d19e250068d39Rafael Espindola .Case("amdil", llvm::Triple::amdil) 4025cfed8283c3aeb03ddd837411467d19e250068d39Rafael Espindola .Case("spir", llvm::Triple::spir) 4026cfed8283c3aeb03ddd837411467d19e250068d39Rafael Espindola .Default(llvm::Triple::UnknownArch); 4027cfed8283c3aeb03ddd837411467d19e250068d39Rafael Espindola} 40289631939f82c0eaa6fb3936a0ce58a41adfbc9011Tony Linthicum 402966b8a6671bb5df540dd7200a5286f7ed7a72c1ccBob Wilsonconst char *Clang::getBaseInputName(const ArgList &Args, 403066b8a6671bb5df540dd7200a5286f7ed7a72c1ccBob Wilson const InputInfoList &Inputs) { 4031472ccff00cdbcd095c3ba933b9e3f202719f118fMichael J. Spencer return Args.MakeArgString( 4032472ccff00cdbcd095c3ba933b9e3f202719f118fMichael J. Spencer llvm::sys::path::filename(Inputs[0].getBaseInput())); 4033a3ec60e0cf2a1916f479288998d31bd980b1a306Daniel Dunbar} 4034a3ec60e0cf2a1916f479288998d31bd980b1a306Daniel Dunbar 403566b8a6671bb5df540dd7200a5286f7ed7a72c1ccBob Wilsonconst char *Clang::getBaseInputStem(const ArgList &Args, 403666b8a6671bb5df540dd7200a5286f7ed7a72c1ccBob Wilson const InputInfoList &Inputs) { 4037a3ec60e0cf2a1916f479288998d31bd980b1a306Daniel Dunbar const char *Str = getBaseInputName(Args, Inputs); 4038a3ec60e0cf2a1916f479288998d31bd980b1a306Daniel Dunbar 4039657ca6683d754c903026221a3aa3aa9cedb7556fChris Lattner if (const char *End = strrchr(Str, '.')) 4040881376467c46c5c6cc16fa6790271c2c22e1d4f1Daniel Dunbar return Args.MakeArgString(std::string(Str, End)); 4041a3ec60e0cf2a1916f479288998d31bd980b1a306Daniel Dunbar 4042a3ec60e0cf2a1916f479288998d31bd980b1a306Daniel Dunbar return Str; 4043a3ec60e0cf2a1916f479288998d31bd980b1a306Daniel Dunbar} 4044a3ec60e0cf2a1916f479288998d31bd980b1a306Daniel Dunbar 404566b8a6671bb5df540dd7200a5286f7ed7a72c1ccBob Wilsonconst char *Clang::getDependencyFileName(const ArgList &Args, 404666b8a6671bb5df540dd7200a5286f7ed7a72c1ccBob Wilson const InputInfoList &Inputs) { 4047a3ec60e0cf2a1916f479288998d31bd980b1a306Daniel Dunbar // FIXME: Think about this more. 4048a3ec60e0cf2a1916f479288998d31bd980b1a306Daniel Dunbar std::string Res; 4049a3ec60e0cf2a1916f479288998d31bd980b1a306Daniel Dunbar 4050a3ec60e0cf2a1916f479288998d31bd980b1a306Daniel Dunbar if (Arg *OutputOpt = Args.getLastArg(options::OPT_o)) { 40511d489cf4a04ad0ad8ac2696e4eed0995f3a67288Richard Smith std::string Str(OutputOpt->getValue()); 4052a3ec60e0cf2a1916f479288998d31bd980b1a306Daniel Dunbar Res = Str.substr(0, Str.rfind('.')); 40533060178ad9df29789505c1e6debcfc80a3a13587Chad Rosier } else { 405466b8a6671bb5df540dd7200a5286f7ed7a72c1ccBob Wilson Res = getBaseInputStem(Args, Inputs); 40553060178ad9df29789505c1e6debcfc80a3a13587Chad Rosier } 4056881376467c46c5c6cc16fa6790271c2c22e1d4f1Daniel Dunbar return Args.MakeArgString(Res + ".d"); 4057a3ec60e0cf2a1916f479288998d31bd980b1a306Daniel Dunbar} 40585bab9ae87c41148ee2f92d312945c1e9303222e8Nick Lewycky 40598cac5f7e1ce63dd77ee0fb4ef68f9fa804f41ea6Daniel Dunbarvoid darwin::Assemble::ConstructJob(Compilation &C, const JobAction &JA, 40602fe238ed293bd4bc27af9beb9fa151fad2146fa8Daniel Dunbar const InputInfo &Output, 4061c21c485b4fb58ef5d55cf3e523263dd824a2ace4Daniel Dunbar const InputInfoList &Inputs, 4062c21c485b4fb58ef5d55cf3e523263dd824a2ace4Daniel Dunbar const ArgList &Args, 40638cac5f7e1ce63dd77ee0fb4ef68f9fa804f41ea6Daniel Dunbar const char *LinkingOutput) const { 40648cac5f7e1ce63dd77ee0fb4ef68f9fa804f41ea6Daniel Dunbar ArgStringList CmdArgs; 40658cac5f7e1ce63dd77ee0fb4ef68f9fa804f41ea6Daniel Dunbar 40668cac5f7e1ce63dd77ee0fb4ef68f9fa804f41ea6Daniel Dunbar assert(Inputs.size() == 1 && "Unexpected number of inputs."); 40678cac5f7e1ce63dd77ee0fb4ef68f9fa804f41ea6Daniel Dunbar const InputInfo &Input = Inputs[0]; 40688cac5f7e1ce63dd77ee0fb4ef68f9fa804f41ea6Daniel Dunbar 406934bac1f7b1ad8018b0d456f38744891c4bf56f63Daniel Dunbar // Determine the original source input. 407034bac1f7b1ad8018b0d456f38744891c4bf56f63Daniel Dunbar const Action *SourceAction = &JA; 407134bac1f7b1ad8018b0d456f38744891c4bf56f63Daniel Dunbar while (SourceAction->getKind() != Action::InputClass) { 407234bac1f7b1ad8018b0d456f38744891c4bf56f63Daniel Dunbar assert(!SourceAction->getInputs().empty() && "unexpected root action!"); 407334bac1f7b1ad8018b0d456f38744891c4bf56f63Daniel Dunbar SourceAction = SourceAction->getInputs()[0]; 407434bac1f7b1ad8018b0d456f38744891c4bf56f63Daniel Dunbar } 407534bac1f7b1ad8018b0d456f38744891c4bf56f63Daniel Dunbar 407634bac1f7b1ad8018b0d456f38744891c4bf56f63Daniel Dunbar // Forward -g, assuming we are dealing with an actual assembly file. 407788b7cf00fcb582728c642da3927c59468efaf926Eric Christopher if (SourceAction->getType() == types::TY_Asm || 407834bac1f7b1ad8018b0d456f38744891c4bf56f63Daniel Dunbar SourceAction->getType() == types::TY_PP_Asm) { 40798e4fea6750dbac032c172f3279c63b7815b7423eDaniel Dunbar if (Args.hasArg(options::OPT_gstabs)) 40808e4fea6750dbac032c172f3279c63b7815b7423eDaniel Dunbar CmdArgs.push_back("--gstabs"); 40818e4fea6750dbac032c172f3279c63b7815b7423eDaniel Dunbar else if (Args.hasArg(options::OPT_g_Group)) 4082591ff15d4a7ae25ea7ac3f00f04f203d3ccec0b7Bob Wilson CmdArgs.push_back("-g"); 40838e4fea6750dbac032c172f3279c63b7815b7423eDaniel Dunbar } 4084c21c485b4fb58ef5d55cf3e523263dd824a2ace4Daniel Dunbar 40858cac5f7e1ce63dd77ee0fb4ef68f9fa804f41ea6Daniel Dunbar // Derived from asm spec. 4086cc6f803f98fa6ba9a9c366400210448516d01b3cDaniel Dunbar AddDarwinArch(Args, CmdArgs); 4087cc6f803f98fa6ba9a9c366400210448516d01b3cDaniel Dunbar 4088f5438e3462f37d7c58f847b594b4b3ab84085d67Daniel Dunbar // Use -force_cpusubtype_ALL on x86 by default. 4089f5438e3462f37d7c58f847b594b4b3ab84085d67Daniel Dunbar if (getToolChain().getTriple().getArch() == llvm::Triple::x86 || 4090f5438e3462f37d7c58f847b594b4b3ab84085d67Daniel Dunbar getToolChain().getTriple().getArch() == llvm::Triple::x86_64 || 4091cc6f803f98fa6ba9a9c366400210448516d01b3cDaniel Dunbar Args.hasArg(options::OPT_force__cpusubtype__ALL)) 4092cc6f803f98fa6ba9a9c366400210448516d01b3cDaniel Dunbar CmdArgs.push_back("-force_cpusubtype_ALL"); 40938cac5f7e1ce63dd77ee0fb4ef68f9fa804f41ea6Daniel Dunbar 40940e2679d29be70186fc1197a1484948ed239922baDaniel Dunbar if (getToolChain().getTriple().getArch() != llvm::Triple::x86_64 && 40957a0c064770355a4918df69f95de8dea6338a59a2Daniel Dunbar (((Args.hasArg(options::OPT_mkernel) || 409659320e770f90a59c74f2be10f198e3c390195628Eric Christopher Args.hasArg(options::OPT_fapple_kext)) && 40977a0c064770355a4918df69f95de8dea6338a59a2Daniel Dunbar (!getDarwinToolChain().isTargetIPhoneOS() || 40987a0c064770355a4918df69f95de8dea6338a59a2Daniel Dunbar getDarwinToolChain().isIPhoneOSVersionLT(6, 0))) || 40997a0c064770355a4918df69f95de8dea6338a59a2Daniel Dunbar Args.hasArg(options::OPT_static))) 4100c21c485b4fb58ef5d55cf3e523263dd824a2ace4Daniel Dunbar CmdArgs.push_back("-static"); 4101c21c485b4fb58ef5d55cf3e523263dd824a2ace4Daniel Dunbar 41028cac5f7e1ce63dd77ee0fb4ef68f9fa804f41ea6Daniel Dunbar Args.AddAllArgValues(CmdArgs, options::OPT_Wa_COMMA, 41038cac5f7e1ce63dd77ee0fb4ef68f9fa804f41ea6Daniel Dunbar options::OPT_Xassembler); 41048cac5f7e1ce63dd77ee0fb4ef68f9fa804f41ea6Daniel Dunbar 41058cac5f7e1ce63dd77ee0fb4ef68f9fa804f41ea6Daniel Dunbar assert(Output.isFilename() && "Unexpected lipo output."); 41068cac5f7e1ce63dd77ee0fb4ef68f9fa804f41ea6Daniel Dunbar CmdArgs.push_back("-o"); 41078cac5f7e1ce63dd77ee0fb4ef68f9fa804f41ea6Daniel Dunbar CmdArgs.push_back(Output.getFilename()); 41088cac5f7e1ce63dd77ee0fb4ef68f9fa804f41ea6Daniel Dunbar 41097c1e46533cae07216e2a67d5636a5afb44253155Daniel Dunbar assert(Input.isFilename() && "Invalid input."); 41107c1e46533cae07216e2a67d5636a5afb44253155Daniel Dunbar CmdArgs.push_back(Input.getFilename()); 41118cac5f7e1ce63dd77ee0fb4ef68f9fa804f41ea6Daniel Dunbar 41128cac5f7e1ce63dd77ee0fb4ef68f9fa804f41ea6Daniel Dunbar // asm_final spec is empty. 41138cac5f7e1ce63dd77ee0fb4ef68f9fa804f41ea6Daniel Dunbar 4114c21c485b4fb58ef5d55cf3e523263dd824a2ace4Daniel Dunbar const char *Exec = 41154a7e88978cf646ad10d654020cb00b3877069210Daniel Dunbar Args.MakeArgString(getToolChain().GetProgramPath("as")); 41162fe238ed293bd4bc27af9beb9fa151fad2146fa8Daniel Dunbar C.addCommand(new Command(JA, *this, Exec, CmdArgs)); 41178cac5f7e1ce63dd77ee0fb4ef68f9fa804f41ea6Daniel Dunbar} 4118ff7488dc9a766f94daf54d81b03ab9160d0bfd88Daniel Dunbar 411999ba9e3bd70671f3441fb974895f226a83ce0e66David Blaikievoid darwin::DarwinTool::anchor() {} 412099ba9e3bd70671f3441fb974895f226a83ce0e66David Blaikie 4121fbefe6bd6f62a3361813498dc672ab0d6c0d4fd1Daniel Dunbarvoid darwin::DarwinTool::AddDarwinArch(const ArgList &Args, 4122fbefe6bd6f62a3361813498dc672ab0d6c0d4fd1Daniel Dunbar ArgStringList &CmdArgs) const { 41235f9e272e632e951b1efe824cd16acb4d96077930Chris Lattner StringRef ArchName = getDarwinToolChain().getDarwinArchName(Args); 4124eeff406730f50afd973f005a8d501a19af4785e5Daniel Dunbar 412502633b541b04ad5ffc1c70f4c2feeeb13e607057Daniel Dunbar // Derived from darwin_arch spec. 412602633b541b04ad5ffc1c70f4c2feeeb13e607057Daniel Dunbar CmdArgs.push_back("-arch"); 4127eeff406730f50afd973f005a8d501a19af4785e5Daniel Dunbar CmdArgs.push_back(Args.MakeArgString(ArchName)); 412878dbd580a02759bbc408dbefb6754afa71b2c24cDaniel Dunbar 4129eeff406730f50afd973f005a8d501a19af4785e5Daniel Dunbar // FIXME: Is this needed anymore? 4130eeff406730f50afd973f005a8d501a19af4785e5Daniel Dunbar if (ArchName == "arm") 413178dbd580a02759bbc408dbefb6754afa71b2c24cDaniel Dunbar CmdArgs.push_back("-force_cpusubtype_ALL"); 413202633b541b04ad5ffc1c70f4c2feeeb13e607057Daniel Dunbar} 413302633b541b04ad5ffc1c70f4c2feeeb13e607057Daniel Dunbar 41346acf8b4f9418be93a24b493c2f8a7d32c203002dBill Wendlingbool darwin::Link::NeedsTempPath(const InputInfoList &Inputs) const { 41356acf8b4f9418be93a24b493c2f8a7d32c203002dBill Wendling // We only need to generate a temp path for LTO if we aren't compiling object 41366acf8b4f9418be93a24b493c2f8a7d32c203002dBill Wendling // files. When compiling source files, we run 'dsymutil' after linking. We 41376acf8b4f9418be93a24b493c2f8a7d32c203002dBill Wendling // don't run 'dsymutil' when compiling object files. 41386acf8b4f9418be93a24b493c2f8a7d32c203002dBill Wendling for (InputInfoList::const_iterator 41396acf8b4f9418be93a24b493c2f8a7d32c203002dBill Wendling it = Inputs.begin(), ie = Inputs.end(); it != ie; ++it) 41406acf8b4f9418be93a24b493c2f8a7d32c203002dBill Wendling if (it->getType() != types::TY_Object) 41416acf8b4f9418be93a24b493c2f8a7d32c203002dBill Wendling return true; 41426acf8b4f9418be93a24b493c2f8a7d32c203002dBill Wendling 41436acf8b4f9418be93a24b493c2f8a7d32c203002dBill Wendling return false; 41446acf8b4f9418be93a24b493c2f8a7d32c203002dBill Wendling} 41456acf8b4f9418be93a24b493c2f8a7d32c203002dBill Wendling 4146748de8eda222f087434d8bd703176b316a061341Daniel Dunbarvoid darwin::Link::AddLinkArgs(Compilation &C, 4147748de8eda222f087434d8bd703176b316a061341Daniel Dunbar const ArgList &Args, 41486acf8b4f9418be93a24b493c2f8a7d32c203002dBill Wendling ArgStringList &CmdArgs, 41496acf8b4f9418be93a24b493c2f8a7d32c203002dBill Wendling const InputInfoList &Inputs) const { 4150ee788e70fcd0adf76103b17c78ac658d4ea30c9bDaniel Dunbar const Driver &D = getToolChain().getDriver(); 4151ce911f5fd76375948d18e6528fe7a7314c6e1ac9Daniel Dunbar const toolchains::Darwin &DarwinTC = getDarwinToolChain(); 415202633b541b04ad5ffc1c70f4c2feeeb13e607057Daniel Dunbar 4153b18dc5b8376f42f7b4802bf1279e95eeb813fa06Daniel Dunbar unsigned Version[3] = { 0, 0, 0 }; 4154b18dc5b8376f42f7b4802bf1279e95eeb813fa06Daniel Dunbar if (Arg *A = Args.getLastArg(options::OPT_mlinker_version_EQ)) { 4155b18dc5b8376f42f7b4802bf1279e95eeb813fa06Daniel Dunbar bool HadExtra; 41561d489cf4a04ad0ad8ac2696e4eed0995f3a67288Richard Smith if (!Driver::GetReleaseVersion(A->getValue(), Version[0], 4157b18dc5b8376f42f7b4802bf1279e95eeb813fa06Daniel Dunbar Version[1], Version[2], HadExtra) || 4158b18dc5b8376f42f7b4802bf1279e95eeb813fa06Daniel Dunbar HadExtra) 41595f9e272e632e951b1efe824cd16acb4d96077930Chris Lattner D.Diag(diag::err_drv_invalid_version_number) 4160b18dc5b8376f42f7b4802bf1279e95eeb813fa06Daniel Dunbar << A->getAsString(Args); 4161b18dc5b8376f42f7b4802bf1279e95eeb813fa06Daniel Dunbar } 4162b18dc5b8376f42f7b4802bf1279e95eeb813fa06Daniel Dunbar 4163b18dc5b8376f42f7b4802bf1279e95eeb813fa06Daniel Dunbar // Newer linkers support -demangle, pass it if supported and not disabled by 4164b18dc5b8376f42f7b4802bf1279e95eeb813fa06Daniel Dunbar // the user. 4165d2d2088c569a15c8ad75e70f995ff5a879f4fc49Daniel Dunbar if (Version[0] >= 100 && !Args.hasArg(options::OPT_Z_Xlinker__no_demangle)) { 4166bcf1da8ff6ab007a23a8d1be8e950d92cee4241eDaniel Dunbar // Don't pass -demangle to ld_classic. 4167bcf1da8ff6ab007a23a8d1be8e950d92cee4241eDaniel Dunbar // 4168bcf1da8ff6ab007a23a8d1be8e950d92cee4241eDaniel Dunbar // FIXME: This is a temporary workaround, ld should be handling this. 4169bcf1da8ff6ab007a23a8d1be8e950d92cee4241eDaniel Dunbar bool UsesLdClassic = (getToolChain().getArch() == llvm::Triple::x86 && 4170bcf1da8ff6ab007a23a8d1be8e950d92cee4241eDaniel Dunbar Args.hasArg(options::OPT_static)); 41719ced7049caf7c9543badb302f3bb43a6bc264705Daniel Dunbar if (getToolChain().getArch() == llvm::Triple::x86) { 41729ced7049caf7c9543badb302f3bb43a6bc264705Daniel Dunbar for (arg_iterator it = Args.filtered_begin(options::OPT_Xlinker, 41739ced7049caf7c9543badb302f3bb43a6bc264705Daniel Dunbar options::OPT_Wl_COMMA), 41749ced7049caf7c9543badb302f3bb43a6bc264705Daniel Dunbar ie = Args.filtered_end(); it != ie; ++it) { 41759ced7049caf7c9543badb302f3bb43a6bc264705Daniel Dunbar const Arg *A = *it; 41769ced7049caf7c9543badb302f3bb43a6bc264705Daniel Dunbar for (unsigned i = 0, e = A->getNumValues(); i != e; ++i) 41771d489cf4a04ad0ad8ac2696e4eed0995f3a67288Richard Smith if (StringRef(A->getValue(i)) == "-kext") 41789ced7049caf7c9543badb302f3bb43a6bc264705Daniel Dunbar UsesLdClassic = true; 41799ced7049caf7c9543badb302f3bb43a6bc264705Daniel Dunbar } 41809ced7049caf7c9543badb302f3bb43a6bc264705Daniel Dunbar } 4181bcf1da8ff6ab007a23a8d1be8e950d92cee4241eDaniel Dunbar if (!UsesLdClassic) 4182bcf1da8ff6ab007a23a8d1be8e950d92cee4241eDaniel Dunbar CmdArgs.push_back("-demangle"); 4183b18dc5b8376f42f7b4802bf1279e95eeb813fa06Daniel Dunbar } 4184b18dc5b8376f42f7b4802bf1279e95eeb813fa06Daniel Dunbar 4185c35f908d81c5fd62c6755766a422844fedd768ceBill Wendling // If we are using LTO, then automatically create a temporary file path for 4186c35f908d81c5fd62c6755766a422844fedd768ceBill Wendling // the linker to use, so that it's lifetime will extend past a possible 4187c35f908d81c5fd62c6755766a422844fedd768ceBill Wendling // dsymutil step. 4188c35f908d81c5fd62c6755766a422844fedd768ceBill Wendling if (Version[0] >= 116 && D.IsUsingLTO(Args) && NeedsTempPath(Inputs)) { 4189c35f908d81c5fd62c6755766a422844fedd768ceBill Wendling const char *TmpPath = C.getArgs().MakeArgString( 4190c35f908d81c5fd62c6755766a422844fedd768ceBill Wendling D.GetTemporaryPath("cc", types::getTypeTempSuffix(types::TY_Object))); 4191c35f908d81c5fd62c6755766a422844fedd768ceBill Wendling C.addTempFile(TmpPath); 4192c35f908d81c5fd62c6755766a422844fedd768ceBill Wendling CmdArgs.push_back("-object_path_lto"); 4193c35f908d81c5fd62c6755766a422844fedd768ceBill Wendling CmdArgs.push_back(TmpPath); 41945bfa656e132560e616310b455d65604a49e33e35Daniel Dunbar } 41955bfa656e132560e616310b455d65604a49e33e35Daniel Dunbar 419602633b541b04ad5ffc1c70f4c2feeeb13e607057Daniel Dunbar // Derived from the "link" spec. 419702633b541b04ad5ffc1c70f4c2feeeb13e607057Daniel Dunbar Args.AddAllArgs(CmdArgs, options::OPT_static); 419802633b541b04ad5ffc1c70f4c2feeeb13e607057Daniel Dunbar if (!Args.hasArg(options::OPT_static)) 419902633b541b04ad5ffc1c70f4c2feeeb13e607057Daniel Dunbar CmdArgs.push_back("-dynamic"); 420002633b541b04ad5ffc1c70f4c2feeeb13e607057Daniel Dunbar if (Args.hasArg(options::OPT_fgnu_runtime)) { 420102633b541b04ad5ffc1c70f4c2feeeb13e607057Daniel Dunbar // FIXME: gcc replaces -lobjc in forward args with -lobjc-gnu 420202633b541b04ad5ffc1c70f4c2feeeb13e607057Daniel Dunbar // here. How do we wish to handle such things? 420302633b541b04ad5ffc1c70f4c2feeeb13e607057Daniel Dunbar } 4204c21c485b4fb58ef5d55cf3e523263dd824a2ace4Daniel Dunbar 420502633b541b04ad5ffc1c70f4c2feeeb13e607057Daniel Dunbar if (!Args.hasArg(options::OPT_dynamiclib)) { 4206a6d38494d18e260958e73bfe5e2b3f1dc4160459Daniel Dunbar AddDarwinArch(Args, CmdArgs); 4207a6d38494d18e260958e73bfe5e2b3f1dc4160459Daniel Dunbar // FIXME: Why do this only on this path? 42088917dd4457affb8750c81f08cbc21902a36cff26Daniel Dunbar Args.AddLastArg(CmdArgs, options::OPT_force__cpusubtype__ALL); 420902633b541b04ad5ffc1c70f4c2feeeb13e607057Daniel Dunbar 421002633b541b04ad5ffc1c70f4c2feeeb13e607057Daniel Dunbar Args.AddLastArg(CmdArgs, options::OPT_bundle); 421102633b541b04ad5ffc1c70f4c2feeeb13e607057Daniel Dunbar Args.AddAllArgs(CmdArgs, options::OPT_bundle__loader); 421202633b541b04ad5ffc1c70f4c2feeeb13e607057Daniel Dunbar Args.AddAllArgs(CmdArgs, options::OPT_client__name); 421302633b541b04ad5ffc1c70f4c2feeeb13e607057Daniel Dunbar 421402633b541b04ad5ffc1c70f4c2feeeb13e607057Daniel Dunbar Arg *A; 421502633b541b04ad5ffc1c70f4c2feeeb13e607057Daniel Dunbar if ((A = Args.getLastArg(options::OPT_compatibility__version)) || 421602633b541b04ad5ffc1c70f4c2feeeb13e607057Daniel Dunbar (A = Args.getLastArg(options::OPT_current__version)) || 421702633b541b04ad5ffc1c70f4c2feeeb13e607057Daniel Dunbar (A = Args.getLastArg(options::OPT_install__name))) 42185f9e272e632e951b1efe824cd16acb4d96077930Chris Lattner D.Diag(diag::err_drv_argument_only_allowed_with) 421902633b541b04ad5ffc1c70f4c2feeeb13e607057Daniel Dunbar << A->getAsString(Args) << "-dynamiclib"; 422002633b541b04ad5ffc1c70f4c2feeeb13e607057Daniel Dunbar 422102633b541b04ad5ffc1c70f4c2feeeb13e607057Daniel Dunbar Args.AddLastArg(CmdArgs, options::OPT_force__flat__namespace); 422202633b541b04ad5ffc1c70f4c2feeeb13e607057Daniel Dunbar Args.AddLastArg(CmdArgs, options::OPT_keep__private__externs); 422302633b541b04ad5ffc1c70f4c2feeeb13e607057Daniel Dunbar Args.AddLastArg(CmdArgs, options::OPT_private__bundle); 422402633b541b04ad5ffc1c70f4c2feeeb13e607057Daniel Dunbar } else { 422502633b541b04ad5ffc1c70f4c2feeeb13e607057Daniel Dunbar CmdArgs.push_back("-dylib"); 422602633b541b04ad5ffc1c70f4c2feeeb13e607057Daniel Dunbar 422702633b541b04ad5ffc1c70f4c2feeeb13e607057Daniel Dunbar Arg *A; 422802633b541b04ad5ffc1c70f4c2feeeb13e607057Daniel Dunbar if ((A = Args.getLastArg(options::OPT_bundle)) || 422902633b541b04ad5ffc1c70f4c2feeeb13e607057Daniel Dunbar (A = Args.getLastArg(options::OPT_bundle__loader)) || 423002633b541b04ad5ffc1c70f4c2feeeb13e607057Daniel Dunbar (A = Args.getLastArg(options::OPT_client__name)) || 423102633b541b04ad5ffc1c70f4c2feeeb13e607057Daniel Dunbar (A = Args.getLastArg(options::OPT_force__flat__namespace)) || 423202633b541b04ad5ffc1c70f4c2feeeb13e607057Daniel Dunbar (A = Args.getLastArg(options::OPT_keep__private__externs)) || 423302633b541b04ad5ffc1c70f4c2feeeb13e607057Daniel Dunbar (A = Args.getLastArg(options::OPT_private__bundle))) 42345f9e272e632e951b1efe824cd16acb4d96077930Chris Lattner D.Diag(diag::err_drv_argument_not_allowed_with) 423502633b541b04ad5ffc1c70f4c2feeeb13e607057Daniel Dunbar << A->getAsString(Args) << "-dynamiclib"; 4236c21c485b4fb58ef5d55cf3e523263dd824a2ace4Daniel Dunbar 423702633b541b04ad5ffc1c70f4c2feeeb13e607057Daniel Dunbar Args.AddAllArgsTranslated(CmdArgs, options::OPT_compatibility__version, 423802633b541b04ad5ffc1c70f4c2feeeb13e607057Daniel Dunbar "-dylib_compatibility_version"); 423902633b541b04ad5ffc1c70f4c2feeeb13e607057Daniel Dunbar Args.AddAllArgsTranslated(CmdArgs, options::OPT_current__version, 424002633b541b04ad5ffc1c70f4c2feeeb13e607057Daniel Dunbar "-dylib_current_version"); 424102633b541b04ad5ffc1c70f4c2feeeb13e607057Daniel Dunbar 4242a6d38494d18e260958e73bfe5e2b3f1dc4160459Daniel Dunbar AddDarwinArch(Args, CmdArgs); 424302633b541b04ad5ffc1c70f4c2feeeb13e607057Daniel Dunbar 424402633b541b04ad5ffc1c70f4c2feeeb13e607057Daniel Dunbar Args.AddAllArgsTranslated(CmdArgs, options::OPT_install__name, 424502633b541b04ad5ffc1c70f4c2feeeb13e607057Daniel Dunbar "-dylib_install_name"); 424602633b541b04ad5ffc1c70f4c2feeeb13e607057Daniel Dunbar } 424702633b541b04ad5ffc1c70f4c2feeeb13e607057Daniel Dunbar 424802633b541b04ad5ffc1c70f4c2feeeb13e607057Daniel Dunbar Args.AddLastArg(CmdArgs, options::OPT_all__load); 424902633b541b04ad5ffc1c70f4c2feeeb13e607057Daniel Dunbar Args.AddAllArgs(CmdArgs, options::OPT_allowable__client); 425002633b541b04ad5ffc1c70f4c2feeeb13e607057Daniel Dunbar Args.AddLastArg(CmdArgs, options::OPT_bind__at__load); 4251ce911f5fd76375948d18e6528fe7a7314c6e1ac9Daniel Dunbar if (DarwinTC.isTargetIPhoneOS()) 4252d82f8fa53771b454885c546f0fd452a4980b3a3eDaniel Dunbar Args.AddLastArg(CmdArgs, options::OPT_arch__errors__fatal); 425302633b541b04ad5ffc1c70f4c2feeeb13e607057Daniel Dunbar Args.AddLastArg(CmdArgs, options::OPT_dead__strip); 425402633b541b04ad5ffc1c70f4c2feeeb13e607057Daniel Dunbar Args.AddLastArg(CmdArgs, options::OPT_no__dead__strip__inits__and__terms); 425502633b541b04ad5ffc1c70f4c2feeeb13e607057Daniel Dunbar Args.AddAllArgs(CmdArgs, options::OPT_dylib__file); 425602633b541b04ad5ffc1c70f4c2feeeb13e607057Daniel Dunbar Args.AddLastArg(CmdArgs, options::OPT_dynamic); 425702633b541b04ad5ffc1c70f4c2feeeb13e607057Daniel Dunbar Args.AddAllArgs(CmdArgs, options::OPT_exported__symbols__list); 425802633b541b04ad5ffc1c70f4c2feeeb13e607057Daniel Dunbar Args.AddLastArg(CmdArgs, options::OPT_flat__namespace); 425999ca47b21f6b32ea8a92b0c8e0bea18170f86b9eDaniel Dunbar Args.AddAllArgs(CmdArgs, options::OPT_force__load); 426002633b541b04ad5ffc1c70f4c2feeeb13e607057Daniel Dunbar Args.AddAllArgs(CmdArgs, options::OPT_headerpad__max__install__names); 426102633b541b04ad5ffc1c70f4c2feeeb13e607057Daniel Dunbar Args.AddAllArgs(CmdArgs, options::OPT_image__base); 426202633b541b04ad5ffc1c70f4c2feeeb13e607057Daniel Dunbar Args.AddAllArgs(CmdArgs, options::OPT_init); 426302633b541b04ad5ffc1c70f4c2feeeb13e607057Daniel Dunbar 4264ce911f5fd76375948d18e6528fe7a7314c6e1ac9Daniel Dunbar // Add the deployment target. 426509c9a5635f10a7dfa3373ef0941597c16b048362Benjamin Kramer VersionTuple TargetVersion = DarwinTC.getTargetVersion(); 4266b7f5ef73aee479b2fa54c30cfebed665be8fccb9Daniel Dunbar 4267b7f5ef73aee479b2fa54c30cfebed665be8fccb9Daniel Dunbar // If we had an explicit -mios-simulator-version-min argument, honor that, 4268b7f5ef73aee479b2fa54c30cfebed665be8fccb9Daniel Dunbar // otherwise use the traditional deployment targets. We can't just check the 4269b7f5ef73aee479b2fa54c30cfebed665be8fccb9Daniel Dunbar // is-sim attribute because existing code follows this path, and the linker 4270b7f5ef73aee479b2fa54c30cfebed665be8fccb9Daniel Dunbar // may not handle the argument. 4271b7f5ef73aee479b2fa54c30cfebed665be8fccb9Daniel Dunbar // 4272b7f5ef73aee479b2fa54c30cfebed665be8fccb9Daniel Dunbar // FIXME: We may be able to remove this, once we can verify no one depends on 4273b7f5ef73aee479b2fa54c30cfebed665be8fccb9Daniel Dunbar // it. 4274b7f5ef73aee479b2fa54c30cfebed665be8fccb9Daniel Dunbar if (Args.hasArg(options::OPT_mios_simulator_version_min_EQ)) 4275b7f5ef73aee479b2fa54c30cfebed665be8fccb9Daniel Dunbar CmdArgs.push_back("-ios_simulator_version_min"); 4276b7f5ef73aee479b2fa54c30cfebed665be8fccb9Daniel Dunbar else if (DarwinTC.isTargetIPhoneOS()) 4277b7f5ef73aee479b2fa54c30cfebed665be8fccb9Daniel Dunbar CmdArgs.push_back("-iphoneos_version_min"); 4278b7f5ef73aee479b2fa54c30cfebed665be8fccb9Daniel Dunbar else 4279b7f5ef73aee479b2fa54c30cfebed665be8fccb9Daniel Dunbar CmdArgs.push_back("-macosx_version_min"); 428009c9a5635f10a7dfa3373ef0941597c16b048362Benjamin Kramer CmdArgs.push_back(Args.MakeArgString(TargetVersion.getAsString())); 4281ce911f5fd76375948d18e6528fe7a7314c6e1ac9Daniel Dunbar 428202633b541b04ad5ffc1c70f4c2feeeb13e607057Daniel Dunbar Args.AddLastArg(CmdArgs, options::OPT_nomultidefs); 428302633b541b04ad5ffc1c70f4c2feeeb13e607057Daniel Dunbar Args.AddLastArg(CmdArgs, options::OPT_multi__module); 428402633b541b04ad5ffc1c70f4c2feeeb13e607057Daniel Dunbar Args.AddLastArg(CmdArgs, options::OPT_single__module); 428502633b541b04ad5ffc1c70f4c2feeeb13e607057Daniel Dunbar Args.AddAllArgs(CmdArgs, options::OPT_multiply__defined); 428602633b541b04ad5ffc1c70f4c2feeeb13e607057Daniel Dunbar Args.AddAllArgs(CmdArgs, options::OPT_multiply__defined__unused); 4287c21c485b4fb58ef5d55cf3e523263dd824a2ace4Daniel Dunbar 428847e879dfa735f81472a51b1bd69cc4eb9159db39Daniel Dunbar if (const Arg *A = Args.getLastArg(options::OPT_fpie, options::OPT_fPIE, 428947e879dfa735f81472a51b1bd69cc4eb9159db39Daniel Dunbar options::OPT_fno_pie, 429047e879dfa735f81472a51b1bd69cc4eb9159db39Daniel Dunbar options::OPT_fno_PIE)) { 429147e879dfa735f81472a51b1bd69cc4eb9159db39Daniel Dunbar if (A->getOption().matches(options::OPT_fpie) || 429247e879dfa735f81472a51b1bd69cc4eb9159db39Daniel Dunbar A->getOption().matches(options::OPT_fPIE)) 429347e879dfa735f81472a51b1bd69cc4eb9159db39Daniel Dunbar CmdArgs.push_back("-pie"); 429447e879dfa735f81472a51b1bd69cc4eb9159db39Daniel Dunbar else 429547e879dfa735f81472a51b1bd69cc4eb9159db39Daniel Dunbar CmdArgs.push_back("-no_pie"); 429647e879dfa735f81472a51b1bd69cc4eb9159db39Daniel Dunbar } 429702633b541b04ad5ffc1c70f4c2feeeb13e607057Daniel Dunbar 429802633b541b04ad5ffc1c70f4c2feeeb13e607057Daniel Dunbar Args.AddLastArg(CmdArgs, options::OPT_prebind); 429902633b541b04ad5ffc1c70f4c2feeeb13e607057Daniel Dunbar Args.AddLastArg(CmdArgs, options::OPT_noprebind); 430002633b541b04ad5ffc1c70f4c2feeeb13e607057Daniel Dunbar Args.AddLastArg(CmdArgs, options::OPT_nofixprebinding); 430102633b541b04ad5ffc1c70f4c2feeeb13e607057Daniel Dunbar Args.AddLastArg(CmdArgs, options::OPT_prebind__all__twolevel__modules); 430202633b541b04ad5ffc1c70f4c2feeeb13e607057Daniel Dunbar Args.AddLastArg(CmdArgs, options::OPT_read__only__relocs); 430302633b541b04ad5ffc1c70f4c2feeeb13e607057Daniel Dunbar Args.AddAllArgs(CmdArgs, options::OPT_sectcreate); 430402633b541b04ad5ffc1c70f4c2feeeb13e607057Daniel Dunbar Args.AddAllArgs(CmdArgs, options::OPT_sectorder); 430502633b541b04ad5ffc1c70f4c2feeeb13e607057Daniel Dunbar Args.AddAllArgs(CmdArgs, options::OPT_seg1addr); 430602633b541b04ad5ffc1c70f4c2feeeb13e607057Daniel Dunbar Args.AddAllArgs(CmdArgs, options::OPT_segprot); 430702633b541b04ad5ffc1c70f4c2feeeb13e607057Daniel Dunbar Args.AddAllArgs(CmdArgs, options::OPT_segaddr); 430802633b541b04ad5ffc1c70f4c2feeeb13e607057Daniel Dunbar Args.AddAllArgs(CmdArgs, options::OPT_segs__read__only__addr); 430902633b541b04ad5ffc1c70f4c2feeeb13e607057Daniel Dunbar Args.AddAllArgs(CmdArgs, options::OPT_segs__read__write__addr); 431002633b541b04ad5ffc1c70f4c2feeeb13e607057Daniel Dunbar Args.AddAllArgs(CmdArgs, options::OPT_seg__addr__table); 431102633b541b04ad5ffc1c70f4c2feeeb13e607057Daniel Dunbar Args.AddAllArgs(CmdArgs, options::OPT_seg__addr__table__filename); 431202633b541b04ad5ffc1c70f4c2feeeb13e607057Daniel Dunbar Args.AddAllArgs(CmdArgs, options::OPT_sub__library); 431302633b541b04ad5ffc1c70f4c2feeeb13e607057Daniel Dunbar Args.AddAllArgs(CmdArgs, options::OPT_sub__umbrella); 4314d82f8fa53771b454885c546f0fd452a4980b3a3eDaniel Dunbar 4315cc95719054ef9949c88d21c6c8d349dac8b4fd36Daniel Dunbar // Give --sysroot= preference, over the Apple specific behavior to also use 4316cc95719054ef9949c88d21c6c8d349dac8b4fd36Daniel Dunbar // --isysroot as the syslibroot. 43174762a2da74875d2ae94e0d77d38ed964816cce36Sebastian Pop StringRef sysroot = C.getSysRoot(); 43184762a2da74875d2ae94e0d77d38ed964816cce36Sebastian Pop if (sysroot != "") { 4319cc95719054ef9949c88d21c6c8d349dac8b4fd36Daniel Dunbar CmdArgs.push_back("-syslibroot"); 43204762a2da74875d2ae94e0d77d38ed964816cce36Sebastian Pop CmdArgs.push_back(C.getArgs().MakeArgString(sysroot)); 4321cc95719054ef9949c88d21c6c8d349dac8b4fd36Daniel Dunbar } else if (const Arg *A = Args.getLastArg(options::OPT_isysroot)) { 4322cc95719054ef9949c88d21c6c8d349dac8b4fd36Daniel Dunbar CmdArgs.push_back("-syslibroot"); 43231d489cf4a04ad0ad8ac2696e4eed0995f3a67288Richard Smith CmdArgs.push_back(A->getValue()); 4324d82f8fa53771b454885c546f0fd452a4980b3a3eDaniel Dunbar } 4325d82f8fa53771b454885c546f0fd452a4980b3a3eDaniel Dunbar 432602633b541b04ad5ffc1c70f4c2feeeb13e607057Daniel Dunbar Args.AddLastArg(CmdArgs, options::OPT_twolevel__namespace); 432702633b541b04ad5ffc1c70f4c2feeeb13e607057Daniel Dunbar Args.AddLastArg(CmdArgs, options::OPT_twolevel__namespace__hints); 432802633b541b04ad5ffc1c70f4c2feeeb13e607057Daniel Dunbar Args.AddAllArgs(CmdArgs, options::OPT_umbrella); 432902633b541b04ad5ffc1c70f4c2feeeb13e607057Daniel Dunbar Args.AddAllArgs(CmdArgs, options::OPT_undefined); 433002633b541b04ad5ffc1c70f4c2feeeb13e607057Daniel Dunbar Args.AddAllArgs(CmdArgs, options::OPT_unexported__symbols__list); 4331d82f8fa53771b454885c546f0fd452a4980b3a3eDaniel Dunbar Args.AddAllArgs(CmdArgs, options::OPT_weak__reference__mismatches); 433202633b541b04ad5ffc1c70f4c2feeeb13e607057Daniel Dunbar Args.AddLastArg(CmdArgs, options::OPT_X_Flag); 433302633b541b04ad5ffc1c70f4c2feeeb13e607057Daniel Dunbar Args.AddAllArgs(CmdArgs, options::OPT_y); 433402633b541b04ad5ffc1c70f4c2feeeb13e607057Daniel Dunbar Args.AddLastArg(CmdArgs, options::OPT_w); 433502633b541b04ad5ffc1c70f4c2feeeb13e607057Daniel Dunbar Args.AddAllArgs(CmdArgs, options::OPT_pagezero__size); 433602633b541b04ad5ffc1c70f4c2feeeb13e607057Daniel Dunbar Args.AddAllArgs(CmdArgs, options::OPT_segs__read__); 433702633b541b04ad5ffc1c70f4c2feeeb13e607057Daniel Dunbar Args.AddLastArg(CmdArgs, options::OPT_seglinkedit); 433802633b541b04ad5ffc1c70f4c2feeeb13e607057Daniel Dunbar Args.AddLastArg(CmdArgs, options::OPT_noseglinkedit); 433902633b541b04ad5ffc1c70f4c2feeeb13e607057Daniel Dunbar Args.AddAllArgs(CmdArgs, options::OPT_sectalign); 434002633b541b04ad5ffc1c70f4c2feeeb13e607057Daniel Dunbar Args.AddAllArgs(CmdArgs, options::OPT_sectobjectsymbols); 434102633b541b04ad5ffc1c70f4c2feeeb13e607057Daniel Dunbar Args.AddAllArgs(CmdArgs, options::OPT_segcreate); 434202633b541b04ad5ffc1c70f4c2feeeb13e607057Daniel Dunbar Args.AddLastArg(CmdArgs, options::OPT_whyload); 434302633b541b04ad5ffc1c70f4c2feeeb13e607057Daniel Dunbar Args.AddLastArg(CmdArgs, options::OPT_whatsloaded); 434402633b541b04ad5ffc1c70f4c2feeeb13e607057Daniel Dunbar Args.AddAllArgs(CmdArgs, options::OPT_dylinker__install__name); 434502633b541b04ad5ffc1c70f4c2feeeb13e607057Daniel Dunbar Args.AddLastArg(CmdArgs, options::OPT_dylinker); 434602633b541b04ad5ffc1c70f4c2feeeb13e607057Daniel Dunbar Args.AddLastArg(CmdArgs, options::OPT_Mach); 434702633b541b04ad5ffc1c70f4c2feeeb13e607057Daniel Dunbar} 434802633b541b04ad5ffc1c70f4c2feeeb13e607057Daniel Dunbar 434902633b541b04ad5ffc1c70f4c2feeeb13e607057Daniel Dunbarvoid darwin::Link::ConstructJob(Compilation &C, const JobAction &JA, 43502fe238ed293bd4bc27af9beb9fa151fad2146fa8Daniel Dunbar const InputInfo &Output, 4351c21c485b4fb58ef5d55cf3e523263dd824a2ace4Daniel Dunbar const InputInfoList &Inputs, 4352c21c485b4fb58ef5d55cf3e523263dd824a2ace4Daniel Dunbar const ArgList &Args, 435302633b541b04ad5ffc1c70f4c2feeeb13e607057Daniel Dunbar const char *LinkingOutput) const { 435402633b541b04ad5ffc1c70f4c2feeeb13e607057Daniel Dunbar assert(Output.getType() == types::TY_Image && "Invalid linker output type."); 4355e0be8b1729d8978de433d229c065830b95d0ae68Daniel Dunbar 435602633b541b04ad5ffc1c70f4c2feeeb13e607057Daniel Dunbar // The logic here is derived from gcc's behavior; most of which 435702633b541b04ad5ffc1c70f4c2feeeb13e607057Daniel Dunbar // comes from specs (starting with link_command). Consult gcc for 435802633b541b04ad5ffc1c70f4c2feeeb13e607057Daniel Dunbar // more information. 435902633b541b04ad5ffc1c70f4c2feeeb13e607057Daniel Dunbar ArgStringList CmdArgs; 436002633b541b04ad5ffc1c70f4c2feeeb13e607057Daniel Dunbar 4361228971738f80de6f02aee0d6f8018f5209cf7c9cArgyrios Kyrtzidis /// Hack(tm) to ignore linking errors when we are doing ARC migration. 4362228971738f80de6f02aee0d6f8018f5209cf7c9cArgyrios Kyrtzidis if (Args.hasArg(options::OPT_ccc_arcmt_check, 4363228971738f80de6f02aee0d6f8018f5209cf7c9cArgyrios Kyrtzidis options::OPT_ccc_arcmt_migrate)) { 4364228971738f80de6f02aee0d6f8018f5209cf7c9cArgyrios Kyrtzidis for (ArgList::const_iterator I = Args.begin(), E = Args.end(); I != E; ++I) 4365228971738f80de6f02aee0d6f8018f5209cf7c9cArgyrios Kyrtzidis (*I)->claim(); 4366228971738f80de6f02aee0d6f8018f5209cf7c9cArgyrios Kyrtzidis const char *Exec = 4367228971738f80de6f02aee0d6f8018f5209cf7c9cArgyrios Kyrtzidis Args.MakeArgString(getToolChain().GetProgramPath("touch")); 4368228971738f80de6f02aee0d6f8018f5209cf7c9cArgyrios Kyrtzidis CmdArgs.push_back(Output.getFilename()); 4369228971738f80de6f02aee0d6f8018f5209cf7c9cArgyrios Kyrtzidis C.addCommand(new Command(JA, *this, Exec, CmdArgs)); 4370228971738f80de6f02aee0d6f8018f5209cf7c9cArgyrios Kyrtzidis return; 4371228971738f80de6f02aee0d6f8018f5209cf7c9cArgyrios Kyrtzidis } 4372228971738f80de6f02aee0d6f8018f5209cf7c9cArgyrios Kyrtzidis 437302633b541b04ad5ffc1c70f4c2feeeb13e607057Daniel Dunbar // I'm not sure why this particular decomposition exists in gcc, but 437402633b541b04ad5ffc1c70f4c2feeeb13e607057Daniel Dunbar // we follow suite for ease of comparison. 43756acf8b4f9418be93a24b493c2f8a7d32c203002dBill Wendling AddLinkArgs(C, Args, CmdArgs, Inputs); 437602633b541b04ad5ffc1c70f4c2feeeb13e607057Daniel Dunbar 437702633b541b04ad5ffc1c70f4c2feeeb13e607057Daniel Dunbar Args.AddAllArgs(CmdArgs, options::OPT_d_Flag); 437802633b541b04ad5ffc1c70f4c2feeeb13e607057Daniel Dunbar Args.AddAllArgs(CmdArgs, options::OPT_s); 437902633b541b04ad5ffc1c70f4c2feeeb13e607057Daniel Dunbar Args.AddAllArgs(CmdArgs, options::OPT_t); 438002633b541b04ad5ffc1c70f4c2feeeb13e607057Daniel Dunbar Args.AddAllArgs(CmdArgs, options::OPT_Z_Flag); 438102633b541b04ad5ffc1c70f4c2feeeb13e607057Daniel Dunbar Args.AddAllArgs(CmdArgs, options::OPT_u_Group); 438202633b541b04ad5ffc1c70f4c2feeeb13e607057Daniel Dunbar Args.AddLastArg(CmdArgs, options::OPT_e); 438302633b541b04ad5ffc1c70f4c2feeeb13e607057Daniel Dunbar Args.AddAllArgs(CmdArgs, options::OPT_m_Separate); 438402633b541b04ad5ffc1c70f4c2feeeb13e607057Daniel Dunbar Args.AddAllArgs(CmdArgs, options::OPT_r); 438502633b541b04ad5ffc1c70f4c2feeeb13e607057Daniel Dunbar 4386270073c1e44d073e9732204fc099f280b368fab5Daniel Dunbar // Forward -ObjC when either -ObjC or -ObjC++ is used, to force loading 4387270073c1e44d073e9732204fc099f280b368fab5Daniel Dunbar // members of static archive libraries which implement Objective-C classes or 4388270073c1e44d073e9732204fc099f280b368fab5Daniel Dunbar // categories. 4389270073c1e44d073e9732204fc099f280b368fab5Daniel Dunbar if (Args.hasArg(options::OPT_ObjC) || Args.hasArg(options::OPT_ObjCXX)) 4390270073c1e44d073e9732204fc099f280b368fab5Daniel Dunbar CmdArgs.push_back("-ObjC"); 439120249a1af2e462dcafdd6a350f1c7967b264ff25Michael J. Spencer 4392d56f40341374ba5970283a15f27fb1999965967aBill Wendling if (Args.hasArg(options::OPT_rdynamic)) 4393d56f40341374ba5970283a15f27fb1999965967aBill Wendling CmdArgs.push_back("-export_dynamic"); 4394d56f40341374ba5970283a15f27fb1999965967aBill Wendling 439502633b541b04ad5ffc1c70f4c2feeeb13e607057Daniel Dunbar CmdArgs.push_back("-o"); 439602633b541b04ad5ffc1c70f4c2feeeb13e607057Daniel Dunbar CmdArgs.push_back(Output.getFilename()); 439702633b541b04ad5ffc1c70f4c2feeeb13e607057Daniel Dunbar 4398189373170330e3d551bdb28c9762d606f3bcb931Chad Rosier if (!Args.hasArg(options::OPT_nostdlib) && 439902633b541b04ad5ffc1c70f4c2feeeb13e607057Daniel Dunbar !Args.hasArg(options::OPT_nostartfiles)) { 440002633b541b04ad5ffc1c70f4c2feeeb13e607057Daniel Dunbar // Derived from startfile spec. 440102633b541b04ad5ffc1c70f4c2feeeb13e607057Daniel Dunbar if (Args.hasArg(options::OPT_dynamiclib)) { 4402c21c485b4fb58ef5d55cf3e523263dd824a2ace4Daniel Dunbar // Derived from darwin_dylib1 spec. 44031051fc0ba0fb924d6d4a88a2113460a40a542614Daniel Dunbar if (getDarwinToolChain().isTargetIOSSimulator()) { 44041051fc0ba0fb924d6d4a88a2113460a40a542614Daniel Dunbar // The simulator doesn't have a versioned crt1 file. 44051051fc0ba0fb924d6d4a88a2113460a40a542614Daniel Dunbar CmdArgs.push_back("-ldylib1.o"); 44061051fc0ba0fb924d6d4a88a2113460a40a542614Daniel Dunbar } else if (getDarwinToolChain().isTargetIPhoneOS()) { 4407cacb0f007001f7463d44ebd5dde7bfaecf876a71Daniel Dunbar if (getDarwinToolChain().isIPhoneOSVersionLT(3, 1)) 4408cacb0f007001f7463d44ebd5dde7bfaecf876a71Daniel Dunbar CmdArgs.push_back("-ldylib1.o"); 4409cacb0f007001f7463d44ebd5dde7bfaecf876a71Daniel Dunbar } else { 4410ce3fdf233353b10f20d74dceda3d77a82285de17Daniel Dunbar if (getDarwinToolChain().isMacosxVersionLT(10, 5)) 4411cacb0f007001f7463d44ebd5dde7bfaecf876a71Daniel Dunbar CmdArgs.push_back("-ldylib1.o"); 4412ce3fdf233353b10f20d74dceda3d77a82285de17Daniel Dunbar else if (getDarwinToolChain().isMacosxVersionLT(10, 6)) 4413cacb0f007001f7463d44ebd5dde7bfaecf876a71Daniel Dunbar CmdArgs.push_back("-ldylib1.10.5.o"); 4414cacb0f007001f7463d44ebd5dde7bfaecf876a71Daniel Dunbar } 441502633b541b04ad5ffc1c70f4c2feeeb13e607057Daniel Dunbar } else { 441602633b541b04ad5ffc1c70f4c2feeeb13e607057Daniel Dunbar if (Args.hasArg(options::OPT_bundle)) { 44178a8d8afa3df40e9f122d2b826f1a825a66f6908dDaniel Dunbar if (!Args.hasArg(options::OPT_static)) { 44188a8d8afa3df40e9f122d2b826f1a825a66f6908dDaniel Dunbar // Derived from darwin_bundle1 spec. 44191051fc0ba0fb924d6d4a88a2113460a40a542614Daniel Dunbar if (getDarwinToolChain().isTargetIOSSimulator()) { 44201051fc0ba0fb924d6d4a88a2113460a40a542614Daniel Dunbar // The simulator doesn't have a versioned crt1 file. 44211051fc0ba0fb924d6d4a88a2113460a40a542614Daniel Dunbar CmdArgs.push_back("-lbundle1.o"); 44221051fc0ba0fb924d6d4a88a2113460a40a542614Daniel Dunbar } else if (getDarwinToolChain().isTargetIPhoneOS()) { 4423cacb0f007001f7463d44ebd5dde7bfaecf876a71Daniel Dunbar if (getDarwinToolChain().isIPhoneOSVersionLT(3, 1)) 4424cacb0f007001f7463d44ebd5dde7bfaecf876a71Daniel Dunbar CmdArgs.push_back("-lbundle1.o"); 4425cacb0f007001f7463d44ebd5dde7bfaecf876a71Daniel Dunbar } else { 4426ce3fdf233353b10f20d74dceda3d77a82285de17Daniel Dunbar if (getDarwinToolChain().isMacosxVersionLT(10, 6)) 4427cacb0f007001f7463d44ebd5dde7bfaecf876a71Daniel Dunbar CmdArgs.push_back("-lbundle1.o"); 4428cacb0f007001f7463d44ebd5dde7bfaecf876a71Daniel Dunbar } 44298a8d8afa3df40e9f122d2b826f1a825a66f6908dDaniel Dunbar } 443002633b541b04ad5ffc1c70f4c2feeeb13e607057Daniel Dunbar } else { 4431bbe8e3eff56ac1d79f3668d706536e3cebe28c18Daniel Dunbar if (Args.hasArg(options::OPT_pg) && 4432bbe8e3eff56ac1d79f3668d706536e3cebe28c18Daniel Dunbar getToolChain().SupportsProfiling()) { 443302633b541b04ad5ffc1c70f4c2feeeb13e607057Daniel Dunbar if (Args.hasArg(options::OPT_static) || 443402633b541b04ad5ffc1c70f4c2feeeb13e607057Daniel Dunbar Args.hasArg(options::OPT_object) || 443502633b541b04ad5ffc1c70f4c2feeeb13e607057Daniel Dunbar Args.hasArg(options::OPT_preload)) { 443602633b541b04ad5ffc1c70f4c2feeeb13e607057Daniel Dunbar CmdArgs.push_back("-lgcrt0.o"); 443702633b541b04ad5ffc1c70f4c2feeeb13e607057Daniel Dunbar } else { 443802633b541b04ad5ffc1c70f4c2feeeb13e607057Daniel Dunbar CmdArgs.push_back("-lgcrt1.o"); 4439c21c485b4fb58ef5d55cf3e523263dd824a2ace4Daniel Dunbar 444002633b541b04ad5ffc1c70f4c2feeeb13e607057Daniel Dunbar // darwin_crt2 spec is empty. 4441c21c485b4fb58ef5d55cf3e523263dd824a2ace4Daniel Dunbar } 44424e6e791dc53654dd1e6258829d5c3a1e059b11c3Bob Wilson // By default on OS X 10.8 and later, we don't link with a crt1.o 44434e6e791dc53654dd1e6258829d5c3a1e059b11c3Bob Wilson // file and the linker knows to use _main as the entry point. But, 44444e6e791dc53654dd1e6258829d5c3a1e059b11c3Bob Wilson // when compiling with -pg, we need to link with the gcrt1.o file, 44454e6e791dc53654dd1e6258829d5c3a1e059b11c3Bob Wilson // so pass the -no_new_main option to tell the linker to use the 44464e6e791dc53654dd1e6258829d5c3a1e059b11c3Bob Wilson // "start" symbol as the entry point. 44471fc6e4fa79444b2a7be8a1150f646ffbde68b744Bob Wilson if (getDarwinToolChain().isTargetMacOS() && 44481fc6e4fa79444b2a7be8a1150f646ffbde68b744Bob Wilson !getDarwinToolChain().isMacosxVersionLT(10, 8)) 44491fc6e4fa79444b2a7be8a1150f646ffbde68b744Bob Wilson CmdArgs.push_back("-no_new_main"); 445002633b541b04ad5ffc1c70f4c2feeeb13e607057Daniel Dunbar } else { 445102633b541b04ad5ffc1c70f4c2feeeb13e607057Daniel Dunbar if (Args.hasArg(options::OPT_static) || 445202633b541b04ad5ffc1c70f4c2feeeb13e607057Daniel Dunbar Args.hasArg(options::OPT_object) || 445302633b541b04ad5ffc1c70f4c2feeeb13e607057Daniel Dunbar Args.hasArg(options::OPT_preload)) { 445402633b541b04ad5ffc1c70f4c2feeeb13e607057Daniel Dunbar CmdArgs.push_back("-lcrt0.o"); 445502633b541b04ad5ffc1c70f4c2feeeb13e607057Daniel Dunbar } else { 445602633b541b04ad5ffc1c70f4c2feeeb13e607057Daniel Dunbar // Derived from darwin_crt1 spec. 44574035580e3475db9013f335ce2b8a49dd1988a79aDaniel Dunbar if (getDarwinToolChain().isTargetIOSSimulator()) { 44584035580e3475db9013f335ce2b8a49dd1988a79aDaniel Dunbar // The simulator doesn't have a versioned crt1 file. 44594035580e3475db9013f335ce2b8a49dd1988a79aDaniel Dunbar CmdArgs.push_back("-lcrt1.o"); 44604035580e3475db9013f335ce2b8a49dd1988a79aDaniel Dunbar } else if (getDarwinToolChain().isTargetIPhoneOS()) { 4461cacb0f007001f7463d44ebd5dde7bfaecf876a71Daniel Dunbar if (getDarwinToolChain().isIPhoneOSVersionLT(3, 1)) 4462cacb0f007001f7463d44ebd5dde7bfaecf876a71Daniel Dunbar CmdArgs.push_back("-lcrt1.o"); 44637a0c064770355a4918df69f95de8dea6338a59a2Daniel Dunbar else if (getDarwinToolChain().isIPhoneOSVersionLT(6, 0)) 4464cacb0f007001f7463d44ebd5dde7bfaecf876a71Daniel Dunbar CmdArgs.push_back("-lcrt1.3.1.o"); 4465ce3fdf233353b10f20d74dceda3d77a82285de17Daniel Dunbar } else { 4466ce3fdf233353b10f20d74dceda3d77a82285de17Daniel Dunbar if (getDarwinToolChain().isMacosxVersionLT(10, 5)) 4467ce3fdf233353b10f20d74dceda3d77a82285de17Daniel Dunbar CmdArgs.push_back("-lcrt1.o"); 4468ce3fdf233353b10f20d74dceda3d77a82285de17Daniel Dunbar else if (getDarwinToolChain().isMacosxVersionLT(10, 6)) 4469ce3fdf233353b10f20d74dceda3d77a82285de17Daniel Dunbar CmdArgs.push_back("-lcrt1.10.5.o"); 4470ebcb57a8d298862c65043e88b2429591ab3c58d3Ted Kremenek else if (getDarwinToolChain().isMacosxVersionLT(10, 8)) 4471ce3fdf233353b10f20d74dceda3d77a82285de17Daniel Dunbar CmdArgs.push_back("-lcrt1.10.6.o"); 4472c21c485b4fb58ef5d55cf3e523263dd824a2ace4Daniel Dunbar 4473ce3fdf233353b10f20d74dceda3d77a82285de17Daniel Dunbar // darwin_crt2 spec is empty. 4474ce3fdf233353b10f20d74dceda3d77a82285de17Daniel Dunbar } 447502633b541b04ad5ffc1c70f4c2feeeb13e607057Daniel Dunbar } 447602633b541b04ad5ffc1c70f4c2feeeb13e607057Daniel Dunbar } 447702633b541b04ad5ffc1c70f4c2feeeb13e607057Daniel Dunbar } 447802633b541b04ad5ffc1c70f4c2feeeb13e607057Daniel Dunbar } 447902633b541b04ad5ffc1c70f4c2feeeb13e607057Daniel Dunbar 4480ce3fdf233353b10f20d74dceda3d77a82285de17Daniel Dunbar if (!getDarwinToolChain().isTargetIPhoneOS() && 4481ce3fdf233353b10f20d74dceda3d77a82285de17Daniel Dunbar Args.hasArg(options::OPT_shared_libgcc) && 4482ce3fdf233353b10f20d74dceda3d77a82285de17Daniel Dunbar getDarwinToolChain().isMacosxVersionLT(10, 5)) { 4483881376467c46c5c6cc16fa6790271c2c22e1d4f1Daniel Dunbar const char *Str = 44844a7e88978cf646ad10d654020cb00b3877069210Daniel Dunbar Args.MakeArgString(getToolChain().GetFilePath("crt3.o")); 4485881376467c46c5c6cc16fa6790271c2c22e1d4f1Daniel Dunbar CmdArgs.push_back(Str); 448602633b541b04ad5ffc1c70f4c2feeeb13e607057Daniel Dunbar } 448702633b541b04ad5ffc1c70f4c2feeeb13e607057Daniel Dunbar } 448802633b541b04ad5ffc1c70f4c2feeeb13e607057Daniel Dunbar 448902633b541b04ad5ffc1c70f4c2feeeb13e607057Daniel Dunbar Args.AddAllArgs(CmdArgs, options::OPT_L); 4490c21c485b4fb58ef5d55cf3e523263dd824a2ace4Daniel Dunbar 4491bb1071c0568db9bd7934e869a53d671632eb9291Alexey Samsonov SanitizerArgs Sanitize(getToolChain().getDriver(), Args); 44922cb3d300ecd36558bf2201debe28808d12a97be2Alexey Samsonov // If we're building a dynamic lib with -fsanitize=address, 44932cb3d300ecd36558bf2201debe28808d12a97be2Alexey Samsonov // unresolved symbols may appear. Mark all 449475fcb193aeeec5c4f10cc39df60a5ce7526b1b28Alexey Samsonov // of them as dynamic_lookup. Linking executables is handled in 449575fcb193aeeec5c4f10cc39df60a5ce7526b1b28Alexey Samsonov // lib/Driver/ToolChains.cpp. 44962cb3d300ecd36558bf2201debe28808d12a97be2Alexey Samsonov if (Sanitize.needsAsanRt()) { 44977b5f1013c5b7f541dc1fae7fc43189377874eabbKostya Serebryany if (Args.hasArg(options::OPT_dynamiclib) || 44987b5f1013c5b7f541dc1fae7fc43189377874eabbKostya Serebryany Args.hasArg(options::OPT_bundle)) { 44997b5f1013c5b7f541dc1fae7fc43189377874eabbKostya Serebryany CmdArgs.push_back("-undefined"); 45007b5f1013c5b7f541dc1fae7fc43189377874eabbKostya Serebryany CmdArgs.push_back("dynamic_lookup"); 45017b5f1013c5b7f541dc1fae7fc43189377874eabbKostya Serebryany } 45027b5f1013c5b7f541dc1fae7fc43189377874eabbKostya Serebryany } 45037b5f1013c5b7f541dc1fae7fc43189377874eabbKostya Serebryany 450402633b541b04ad5ffc1c70f4c2feeeb13e607057Daniel Dunbar if (Args.hasArg(options::OPT_fopenmp)) 450502633b541b04ad5ffc1c70f4c2feeeb13e607057Daniel Dunbar // This is more complicated in gcc... 450602633b541b04ad5ffc1c70f4c2feeeb13e607057Daniel Dunbar CmdArgs.push_back("-lgomp"); 450702633b541b04ad5ffc1c70f4c2feeeb13e607057Daniel Dunbar 450804e326b3d0ae1a84643b7366ce0ea5137e06ed69Douglas Gregor AddLinkerInputs(getToolChain(), Inputs, Args, CmdArgs); 450904e326b3d0ae1a84643b7366ce0ea5137e06ed69Douglas Gregor 451063d9f3cddee40a3f3e5579e9004b31ec8663b5d9Bob Wilson if (isObjCRuntimeLinked(Args) && 451163d9f3cddee40a3f3e5579e9004b31ec8663b5d9Bob Wilson !Args.hasArg(options::OPT_nostdlib) && 451263d9f3cddee40a3f3e5579e9004b31ec8663b5d9Bob Wilson !Args.hasArg(options::OPT_nodefaultlibs)) { 4513ebcb57a8d298862c65043e88b2429591ab3c58d3Ted Kremenek // Avoid linking compatibility stubs on i386 mac. 4514ebcb57a8d298862c65043e88b2429591ab3c58d3Ted Kremenek if (!getDarwinToolChain().isTargetMacOS() || 451564f7ad9328e877779ec63638f39de4e10d2ff276Rafael Espindola getDarwinToolChain().getArch() != llvm::Triple::x86) { 4516ebcb57a8d298862c65043e88b2429591ab3c58d3Ted Kremenek // If we don't have ARC or subscripting runtime support, link in the 4517ebcb57a8d298862c65043e88b2429591ab3c58d3Ted Kremenek // runtime stubs. We have to do this *before* adding any of the normal 4518ebcb57a8d298862c65043e88b2429591ab3c58d3Ted Kremenek // linker inputs so that its initializer gets run first. 4519260611a32535c851237926bfcf78869b13c07d5bJohn McCall ObjCRuntime runtime = 4520260611a32535c851237926bfcf78869b13c07d5bJohn McCall getDarwinToolChain().getDefaultObjCRuntime(/*nonfragile*/ true); 4521ebcb57a8d298862c65043e88b2429591ab3c58d3Ted Kremenek // We use arclite library for both ARC and subscripting support. 45220a7dd788dbef975f35f273c7ab913f480f7edd60John McCall if ((!runtime.hasNativeARC() && isObjCAutoRefCount(Args)) || 4523260611a32535c851237926bfcf78869b13c07d5bJohn McCall !runtime.hasSubscripting()) 4524ebcb57a8d298862c65043e88b2429591ab3c58d3Ted Kremenek getDarwinToolChain().AddLinkARCArgs(Args, CmdArgs); 4525ebcb57a8d298862c65043e88b2429591ab3c58d3Ted Kremenek } 45260b1c7156844f1e0e37766a64879b1d1d77fc5385Bob Wilson CmdArgs.push_back("-framework"); 45270b1c7156844f1e0e37766a64879b1d1d77fc5385Bob Wilson CmdArgs.push_back("Foundation"); 4528ebcb57a8d298862c65043e88b2429591ab3c58d3Ted Kremenek // Link libobj. 4529ebcb57a8d298862c65043e88b2429591ab3c58d3Ted Kremenek CmdArgs.push_back("-lobjc"); 45309f084a3166b684573ba49df28fc5792bc37d92e1John McCall } 4531c21c485b4fb58ef5d55cf3e523263dd824a2ace4Daniel Dunbar 453202633b541b04ad5ffc1c70f4c2feeeb13e607057Daniel Dunbar if (LinkingOutput) { 453302633b541b04ad5ffc1c70f4c2feeeb13e607057Daniel Dunbar CmdArgs.push_back("-arch_multiple"); 453402633b541b04ad5ffc1c70f4c2feeeb13e607057Daniel Dunbar CmdArgs.push_back("-final_output"); 453502633b541b04ad5ffc1c70f4c2feeeb13e607057Daniel Dunbar CmdArgs.push_back(LinkingOutput); 453602633b541b04ad5ffc1c70f4c2feeeb13e607057Daniel Dunbar } 453702633b541b04ad5ffc1c70f4c2feeeb13e607057Daniel Dunbar 453802633b541b04ad5ffc1c70f4c2feeeb13e607057Daniel Dunbar if (Args.hasArg(options::OPT_fnested_functions)) 453902633b541b04ad5ffc1c70f4c2feeeb13e607057Daniel Dunbar CmdArgs.push_back("-allow_stack_execute"); 4540c21c485b4fb58ef5d55cf3e523263dd824a2ace4Daniel Dunbar 454102633b541b04ad5ffc1c70f4c2feeeb13e607057Daniel Dunbar if (!Args.hasArg(options::OPT_nostdlib) && 454202633b541b04ad5ffc1c70f4c2feeeb13e607057Daniel Dunbar !Args.hasArg(options::OPT_nodefaultlibs)) { 4543ee788e70fcd0adf76103b17c78ac658d4ea30c9bDaniel Dunbar if (getToolChain().getDriver().CCCIsCXX) 4544132e35d2f87895d20e7ea146c8c00404b80221a1Daniel Dunbar getToolChain().AddCXXStdlibLibArgs(Args, CmdArgs); 4545edfa02b85b186e9ea9e0c841539a77ed32ee9148Daniel Dunbar 454602633b541b04ad5ffc1c70f4c2feeeb13e607057Daniel Dunbar // link_ssp spec is empty. 454702633b541b04ad5ffc1c70f4c2feeeb13e607057Daniel Dunbar 45486cd4154b9088fa18ae05d11c0f3140fafd76c734Daniel Dunbar // Let the tool chain choose which runtime library to link. 45496cd4154b9088fa18ae05d11c0f3140fafd76c734Daniel Dunbar getDarwinToolChain().AddLinkRuntimeLibArgs(Args, CmdArgs); 455002633b541b04ad5ffc1c70f4c2feeeb13e607057Daniel Dunbar } 455102633b541b04ad5ffc1c70f4c2feeeb13e607057Daniel Dunbar 4552189373170330e3d551bdb28c9762d606f3bcb931Chad Rosier if (!Args.hasArg(options::OPT_nostdlib) && 455302633b541b04ad5ffc1c70f4c2feeeb13e607057Daniel Dunbar !Args.hasArg(options::OPT_nostartfiles)) { 455402633b541b04ad5ffc1c70f4c2feeeb13e607057Daniel Dunbar // endfile_spec is empty. 455502633b541b04ad5ffc1c70f4c2feeeb13e607057Daniel Dunbar } 455602633b541b04ad5ffc1c70f4c2feeeb13e607057Daniel Dunbar 455702633b541b04ad5ffc1c70f4c2feeeb13e607057Daniel Dunbar Args.AddAllArgs(CmdArgs, options::OPT_T_Group); 455802633b541b04ad5ffc1c70f4c2feeeb13e607057Daniel Dunbar Args.AddAllArgs(CmdArgs, options::OPT_F); 455902633b541b04ad5ffc1c70f4c2feeeb13e607057Daniel Dunbar 4560c21c485b4fb58ef5d55cf3e523263dd824a2ace4Daniel Dunbar const char *Exec = 45614a7e88978cf646ad10d654020cb00b3877069210Daniel Dunbar Args.MakeArgString(getToolChain().GetProgramPath("ld")); 45622fe238ed293bd4bc27af9beb9fa151fad2146fa8Daniel Dunbar C.addCommand(new Command(JA, *this, Exec, CmdArgs)); 456302633b541b04ad5ffc1c70f4c2feeeb13e607057Daniel Dunbar} 456402633b541b04ad5ffc1c70f4c2feeeb13e607057Daniel Dunbar 4565ff7488dc9a766f94daf54d81b03ab9160d0bfd88Daniel Dunbarvoid darwin::Lipo::ConstructJob(Compilation &C, const JobAction &JA, 45662fe238ed293bd4bc27af9beb9fa151fad2146fa8Daniel Dunbar const InputInfo &Output, 4567c21c485b4fb58ef5d55cf3e523263dd824a2ace4Daniel Dunbar const InputInfoList &Inputs, 4568c21c485b4fb58ef5d55cf3e523263dd824a2ace4Daniel Dunbar const ArgList &Args, 4569ff7488dc9a766f94daf54d81b03ab9160d0bfd88Daniel Dunbar const char *LinkingOutput) const { 4570ff7488dc9a766f94daf54d81b03ab9160d0bfd88Daniel Dunbar ArgStringList CmdArgs; 4571ff7488dc9a766f94daf54d81b03ab9160d0bfd88Daniel Dunbar 4572ff7488dc9a766f94daf54d81b03ab9160d0bfd88Daniel Dunbar CmdArgs.push_back("-create"); 4573ff7488dc9a766f94daf54d81b03ab9160d0bfd88Daniel Dunbar assert(Output.isFilename() && "Unexpected lipo output."); 4574a428df828ea4cc6916ea90dcd9fbbc840776d207Daniel Dunbar 4575a428df828ea4cc6916ea90dcd9fbbc840776d207Daniel Dunbar CmdArgs.push_back("-output"); 4576ff7488dc9a766f94daf54d81b03ab9160d0bfd88Daniel Dunbar CmdArgs.push_back(Output.getFilename()); 4577a428df828ea4cc6916ea90dcd9fbbc840776d207Daniel Dunbar 4578ff7488dc9a766f94daf54d81b03ab9160d0bfd88Daniel Dunbar for (InputInfoList::const_iterator 4579ff7488dc9a766f94daf54d81b03ab9160d0bfd88Daniel Dunbar it = Inputs.begin(), ie = Inputs.end(); it != ie; ++it) { 4580ff7488dc9a766f94daf54d81b03ab9160d0bfd88Daniel Dunbar const InputInfo &II = *it; 4581ff7488dc9a766f94daf54d81b03ab9160d0bfd88Daniel Dunbar assert(II.isFilename() && "Unexpected lipo input."); 4582ff7488dc9a766f94daf54d81b03ab9160d0bfd88Daniel Dunbar CmdArgs.push_back(II.getFilename()); 4583ff7488dc9a766f94daf54d81b03ab9160d0bfd88Daniel Dunbar } 4584c21c485b4fb58ef5d55cf3e523263dd824a2ace4Daniel Dunbar const char *Exec = 45854a7e88978cf646ad10d654020cb00b3877069210Daniel Dunbar Args.MakeArgString(getToolChain().GetProgramPath("lipo")); 45862fe238ed293bd4bc27af9beb9fa151fad2146fa8Daniel Dunbar C.addCommand(new Command(JA, *this, Exec, CmdArgs)); 4587ff7488dc9a766f94daf54d81b03ab9160d0bfd88Daniel Dunbar} 458868a31d406c6dc4382c700d1199b062de2aa7e1daDaniel Dunbar 45896e0f25483b1a801cd1155ea89c2b725feab16332Daniel Dunbarvoid darwin::Dsymutil::ConstructJob(Compilation &C, const JobAction &JA, 45902fe238ed293bd4bc27af9beb9fa151fad2146fa8Daniel Dunbar const InputInfo &Output, 45916e0f25483b1a801cd1155ea89c2b725feab16332Daniel Dunbar const InputInfoList &Inputs, 45926e0f25483b1a801cd1155ea89c2b725feab16332Daniel Dunbar const ArgList &Args, 45936e0f25483b1a801cd1155ea89c2b725feab16332Daniel Dunbar const char *LinkingOutput) const { 45946e0f25483b1a801cd1155ea89c2b725feab16332Daniel Dunbar ArgStringList CmdArgs; 45956e0f25483b1a801cd1155ea89c2b725feab16332Daniel Dunbar 459603e92303e6e9d366ff35388b982eea7f7db33e62Daniel Dunbar CmdArgs.push_back("-o"); 459703e92303e6e9d366ff35388b982eea7f7db33e62Daniel Dunbar CmdArgs.push_back(Output.getFilename()); 459803e92303e6e9d366ff35388b982eea7f7db33e62Daniel Dunbar 45996e0f25483b1a801cd1155ea89c2b725feab16332Daniel Dunbar assert(Inputs.size() == 1 && "Unable to handle multiple inputs."); 46006e0f25483b1a801cd1155ea89c2b725feab16332Daniel Dunbar const InputInfo &Input = Inputs[0]; 46016e0f25483b1a801cd1155ea89c2b725feab16332Daniel Dunbar assert(Input.isFilename() && "Unexpected dsymutil input."); 46026e0f25483b1a801cd1155ea89c2b725feab16332Daniel Dunbar CmdArgs.push_back(Input.getFilename()); 46036e0f25483b1a801cd1155ea89c2b725feab16332Daniel Dunbar 46046e0f25483b1a801cd1155ea89c2b725feab16332Daniel Dunbar const char *Exec = 46054a7e88978cf646ad10d654020cb00b3877069210Daniel Dunbar Args.MakeArgString(getToolChain().GetProgramPath("dsymutil")); 46062fe238ed293bd4bc27af9beb9fa151fad2146fa8Daniel Dunbar C.addCommand(new Command(JA, *this, Exec, CmdArgs)); 46076e0f25483b1a801cd1155ea89c2b725feab16332Daniel Dunbar} 46086e0f25483b1a801cd1155ea89c2b725feab16332Daniel Dunbar 4609f857186fd1995b34185d063a29b11ad4f948519fEric Christophervoid darwin::VerifyDebug::ConstructJob(Compilation &C, const JobAction &JA, 461027e2b983beb8b5a29869639637327725623069a8Eric Christopher const InputInfo &Output, 461127e2b983beb8b5a29869639637327725623069a8Eric Christopher const InputInfoList &Inputs, 461227e2b983beb8b5a29869639637327725623069a8Eric Christopher const ArgList &Args, 461327e2b983beb8b5a29869639637327725623069a8Eric Christopher const char *LinkingOutput) const { 4614f857186fd1995b34185d063a29b11ad4f948519fEric Christopher ArgStringList CmdArgs; 4615f857186fd1995b34185d063a29b11ad4f948519fEric Christopher CmdArgs.push_back("--verify"); 46161c79dc4086a5fc754689ace567cb7418ed022fccEric Christopher CmdArgs.push_back("--debug-info"); 46171c79dc4086a5fc754689ace567cb7418ed022fccEric Christopher CmdArgs.push_back("--eh-frame"); 4618b822f72c708e235a135fcaf9eb1dba8c20c6a680Eric Christopher CmdArgs.push_back("--quiet"); 4619f857186fd1995b34185d063a29b11ad4f948519fEric Christopher 4620f857186fd1995b34185d063a29b11ad4f948519fEric Christopher assert(Inputs.size() == 1 && "Unable to handle multiple inputs."); 4621f857186fd1995b34185d063a29b11ad4f948519fEric Christopher const InputInfo &Input = Inputs[0]; 4622f857186fd1995b34185d063a29b11ad4f948519fEric Christopher assert(Input.isFilename() && "Unexpected verify input"); 4623f857186fd1995b34185d063a29b11ad4f948519fEric Christopher 4624f857186fd1995b34185d063a29b11ad4f948519fEric Christopher // Grabbing the output of the earlier dsymutil run. 4625f857186fd1995b34185d063a29b11ad4f948519fEric Christopher CmdArgs.push_back(Input.getFilename()); 4626f857186fd1995b34185d063a29b11ad4f948519fEric Christopher 4627f857186fd1995b34185d063a29b11ad4f948519fEric Christopher const char *Exec = 4628f857186fd1995b34185d063a29b11ad4f948519fEric Christopher Args.MakeArgString(getToolChain().GetProgramPath("dwarfdump")); 4629f857186fd1995b34185d063a29b11ad4f948519fEric Christopher C.addCommand(new Command(JA, *this, Exec, CmdArgs)); 4630f857186fd1995b34185d063a29b11ad4f948519fEric Christopher} 4631f857186fd1995b34185d063a29b11ad4f948519fEric Christopher 463231c4690047f5f362ecf886f1586844b1aef0c4d2David Chisnallvoid solaris::Assemble::ConstructJob(Compilation &C, const JobAction &JA, 463331c4690047f5f362ecf886f1586844b1aef0c4d2David Chisnall const InputInfo &Output, 463431c4690047f5f362ecf886f1586844b1aef0c4d2David Chisnall const InputInfoList &Inputs, 463531c4690047f5f362ecf886f1586844b1aef0c4d2David Chisnall const ArgList &Args, 463631c4690047f5f362ecf886f1586844b1aef0c4d2David Chisnall const char *LinkingOutput) const { 463731c4690047f5f362ecf886f1586844b1aef0c4d2David Chisnall ArgStringList CmdArgs; 463831c4690047f5f362ecf886f1586844b1aef0c4d2David Chisnall 463931c4690047f5f362ecf886f1586844b1aef0c4d2David Chisnall Args.AddAllArgValues(CmdArgs, options::OPT_Wa_COMMA, 464031c4690047f5f362ecf886f1586844b1aef0c4d2David Chisnall options::OPT_Xassembler); 464131c4690047f5f362ecf886f1586844b1aef0c4d2David Chisnall 464231c4690047f5f362ecf886f1586844b1aef0c4d2David Chisnall CmdArgs.push_back("-o"); 464331c4690047f5f362ecf886f1586844b1aef0c4d2David Chisnall CmdArgs.push_back(Output.getFilename()); 464431c4690047f5f362ecf886f1586844b1aef0c4d2David Chisnall 464531c4690047f5f362ecf886f1586844b1aef0c4d2David Chisnall for (InputInfoList::const_iterator 464631c4690047f5f362ecf886f1586844b1aef0c4d2David Chisnall it = Inputs.begin(), ie = Inputs.end(); it != ie; ++it) { 464731c4690047f5f362ecf886f1586844b1aef0c4d2David Chisnall const InputInfo &II = *it; 464831c4690047f5f362ecf886f1586844b1aef0c4d2David Chisnall CmdArgs.push_back(II.getFilename()); 464931c4690047f5f362ecf886f1586844b1aef0c4d2David Chisnall } 465031c4690047f5f362ecf886f1586844b1aef0c4d2David Chisnall 465131c4690047f5f362ecf886f1586844b1aef0c4d2David Chisnall const char *Exec = 465231c4690047f5f362ecf886f1586844b1aef0c4d2David Chisnall Args.MakeArgString(getToolChain().GetProgramPath("as")); 465331c4690047f5f362ecf886f1586844b1aef0c4d2David Chisnall C.addCommand(new Command(JA, *this, Exec, CmdArgs)); 465431c4690047f5f362ecf886f1586844b1aef0c4d2David Chisnall} 465531c4690047f5f362ecf886f1586844b1aef0c4d2David Chisnall 465631c4690047f5f362ecf886f1586844b1aef0c4d2David Chisnall 465731c4690047f5f362ecf886f1586844b1aef0c4d2David Chisnallvoid solaris::Link::ConstructJob(Compilation &C, const JobAction &JA, 465831c4690047f5f362ecf886f1586844b1aef0c4d2David Chisnall const InputInfo &Output, 465931c4690047f5f362ecf886f1586844b1aef0c4d2David Chisnall const InputInfoList &Inputs, 466031c4690047f5f362ecf886f1586844b1aef0c4d2David Chisnall const ArgList &Args, 466131c4690047f5f362ecf886f1586844b1aef0c4d2David Chisnall const char *LinkingOutput) const { 466231c4690047f5f362ecf886f1586844b1aef0c4d2David Chisnall // FIXME: Find a real GCC, don't hard-code versions here 466331c4690047f5f362ecf886f1586844b1aef0c4d2David Chisnall std::string GCCLibPath = "/usr/gcc/4.5/lib/gcc/"; 466431c4690047f5f362ecf886f1586844b1aef0c4d2David Chisnall const llvm::Triple &T = getToolChain().getTriple(); 466531c4690047f5f362ecf886f1586844b1aef0c4d2David Chisnall std::string LibPath = "/usr/lib/"; 466631c4690047f5f362ecf886f1586844b1aef0c4d2David Chisnall llvm::Triple::ArchType Arch = T.getArch(); 466731c4690047f5f362ecf886f1586844b1aef0c4d2David Chisnall switch (Arch) { 466831c4690047f5f362ecf886f1586844b1aef0c4d2David Chisnall case llvm::Triple::x86: 466931c4690047f5f362ecf886f1586844b1aef0c4d2David Chisnall GCCLibPath += ("i386-" + T.getVendorName() + "-" + 467031c4690047f5f362ecf886f1586844b1aef0c4d2David Chisnall T.getOSName()).str() + "/4.5.2/"; 467131c4690047f5f362ecf886f1586844b1aef0c4d2David Chisnall break; 467231c4690047f5f362ecf886f1586844b1aef0c4d2David Chisnall case llvm::Triple::x86_64: 467331c4690047f5f362ecf886f1586844b1aef0c4d2David Chisnall GCCLibPath += ("i386-" + T.getVendorName() + "-" + 467431c4690047f5f362ecf886f1586844b1aef0c4d2David Chisnall T.getOSName()).str(); 467531c4690047f5f362ecf886f1586844b1aef0c4d2David Chisnall GCCLibPath += "/4.5.2/amd64/"; 467631c4690047f5f362ecf886f1586844b1aef0c4d2David Chisnall LibPath += "amd64/"; 467731c4690047f5f362ecf886f1586844b1aef0c4d2David Chisnall break; 467831c4690047f5f362ecf886f1586844b1aef0c4d2David Chisnall default: 467931c4690047f5f362ecf886f1586844b1aef0c4d2David Chisnall assert(0 && "Unsupported architecture"); 468031c4690047f5f362ecf886f1586844b1aef0c4d2David Chisnall } 468131c4690047f5f362ecf886f1586844b1aef0c4d2David Chisnall 468231c4690047f5f362ecf886f1586844b1aef0c4d2David Chisnall ArgStringList CmdArgs; 468331c4690047f5f362ecf886f1586844b1aef0c4d2David Chisnall 468441d476d307973cefddeee5661b0573a2cf1b0f24David Chisnall // Demangle C++ names in errors 468541d476d307973cefddeee5661b0573a2cf1b0f24David Chisnall CmdArgs.push_back("-C"); 468641d476d307973cefddeee5661b0573a2cf1b0f24David Chisnall 468731c4690047f5f362ecf886f1586844b1aef0c4d2David Chisnall if ((!Args.hasArg(options::OPT_nostdlib)) && 468831c4690047f5f362ecf886f1586844b1aef0c4d2David Chisnall (!Args.hasArg(options::OPT_shared))) { 468931c4690047f5f362ecf886f1586844b1aef0c4d2David Chisnall CmdArgs.push_back("-e"); 469031c4690047f5f362ecf886f1586844b1aef0c4d2David Chisnall CmdArgs.push_back("_start"); 469131c4690047f5f362ecf886f1586844b1aef0c4d2David Chisnall } 469231c4690047f5f362ecf886f1586844b1aef0c4d2David Chisnall 469331c4690047f5f362ecf886f1586844b1aef0c4d2David Chisnall if (Args.hasArg(options::OPT_static)) { 469431c4690047f5f362ecf886f1586844b1aef0c4d2David Chisnall CmdArgs.push_back("-Bstatic"); 469531c4690047f5f362ecf886f1586844b1aef0c4d2David Chisnall CmdArgs.push_back("-dn"); 469631c4690047f5f362ecf886f1586844b1aef0c4d2David Chisnall } else { 469731c4690047f5f362ecf886f1586844b1aef0c4d2David Chisnall CmdArgs.push_back("-Bdynamic"); 469831c4690047f5f362ecf886f1586844b1aef0c4d2David Chisnall if (Args.hasArg(options::OPT_shared)) { 469931c4690047f5f362ecf886f1586844b1aef0c4d2David Chisnall CmdArgs.push_back("-shared"); 470031c4690047f5f362ecf886f1586844b1aef0c4d2David Chisnall } else { 470131c4690047f5f362ecf886f1586844b1aef0c4d2David Chisnall CmdArgs.push_back("--dynamic-linker"); 470231c4690047f5f362ecf886f1586844b1aef0c4d2David Chisnall CmdArgs.push_back(Args.MakeArgString(LibPath + "ld.so.1")); 470331c4690047f5f362ecf886f1586844b1aef0c4d2David Chisnall } 470431c4690047f5f362ecf886f1586844b1aef0c4d2David Chisnall } 470531c4690047f5f362ecf886f1586844b1aef0c4d2David Chisnall 470631c4690047f5f362ecf886f1586844b1aef0c4d2David Chisnall if (Output.isFilename()) { 470731c4690047f5f362ecf886f1586844b1aef0c4d2David Chisnall CmdArgs.push_back("-o"); 470831c4690047f5f362ecf886f1586844b1aef0c4d2David Chisnall CmdArgs.push_back(Output.getFilename()); 470931c4690047f5f362ecf886f1586844b1aef0c4d2David Chisnall } else { 471031c4690047f5f362ecf886f1586844b1aef0c4d2David Chisnall assert(Output.isNothing() && "Invalid output."); 471131c4690047f5f362ecf886f1586844b1aef0c4d2David Chisnall } 471231c4690047f5f362ecf886f1586844b1aef0c4d2David Chisnall 471331c4690047f5f362ecf886f1586844b1aef0c4d2David Chisnall if (!Args.hasArg(options::OPT_nostdlib) && 471431c4690047f5f362ecf886f1586844b1aef0c4d2David Chisnall !Args.hasArg(options::OPT_nostartfiles)) { 471531c4690047f5f362ecf886f1586844b1aef0c4d2David Chisnall if (!Args.hasArg(options::OPT_shared)) { 471631c4690047f5f362ecf886f1586844b1aef0c4d2David Chisnall CmdArgs.push_back(Args.MakeArgString(LibPath + "crt1.o")); 471731c4690047f5f362ecf886f1586844b1aef0c4d2David Chisnall CmdArgs.push_back(Args.MakeArgString(LibPath + "crti.o")); 4718165329c1d134d000904d6e08b1d166bf34e05517David Chisnall CmdArgs.push_back(Args.MakeArgString(LibPath + "values-Xa.o")); 471931c4690047f5f362ecf886f1586844b1aef0c4d2David Chisnall CmdArgs.push_back(Args.MakeArgString(GCCLibPath + "crtbegin.o")); 472031c4690047f5f362ecf886f1586844b1aef0c4d2David Chisnall } else { 472131c4690047f5f362ecf886f1586844b1aef0c4d2David Chisnall CmdArgs.push_back(Args.MakeArgString(LibPath + "crti.o")); 4722165329c1d134d000904d6e08b1d166bf34e05517David Chisnall CmdArgs.push_back(Args.MakeArgString(LibPath + "values-Xa.o")); 4723165329c1d134d000904d6e08b1d166bf34e05517David Chisnall CmdArgs.push_back(Args.MakeArgString(GCCLibPath + "crtbegin.o")); 472431c4690047f5f362ecf886f1586844b1aef0c4d2David Chisnall } 4725e6dd683d99b14ff8cd886cd81e6588cd1883ca52David Chisnall if (getToolChain().getDriver().CCCIsCXX) 4726e6dd683d99b14ff8cd886cd81e6588cd1883ca52David Chisnall CmdArgs.push_back(Args.MakeArgString(LibPath + "cxa_finalize.o")); 472731c4690047f5f362ecf886f1586844b1aef0c4d2David Chisnall } 472831c4690047f5f362ecf886f1586844b1aef0c4d2David Chisnall 472931c4690047f5f362ecf886f1586844b1aef0c4d2David Chisnall CmdArgs.push_back(Args.MakeArgString("-L" + GCCLibPath)); 473031c4690047f5f362ecf886f1586844b1aef0c4d2David Chisnall 473131c4690047f5f362ecf886f1586844b1aef0c4d2David Chisnall Args.AddAllArgs(CmdArgs, options::OPT_L); 473231c4690047f5f362ecf886f1586844b1aef0c4d2David Chisnall Args.AddAllArgs(CmdArgs, options::OPT_T_Group); 473331c4690047f5f362ecf886f1586844b1aef0c4d2David Chisnall Args.AddAllArgs(CmdArgs, options::OPT_e); 4734165329c1d134d000904d6e08b1d166bf34e05517David Chisnall Args.AddAllArgs(CmdArgs, options::OPT_r); 473531c4690047f5f362ecf886f1586844b1aef0c4d2David Chisnall 473631c4690047f5f362ecf886f1586844b1aef0c4d2David Chisnall AddLinkerInputs(getToolChain(), Inputs, Args, CmdArgs); 473731c4690047f5f362ecf886f1586844b1aef0c4d2David Chisnall 473831c4690047f5f362ecf886f1586844b1aef0c4d2David Chisnall if (!Args.hasArg(options::OPT_nostdlib) && 473931c4690047f5f362ecf886f1586844b1aef0c4d2David Chisnall !Args.hasArg(options::OPT_nodefaultlibs)) { 4740e58e6f9114e61f0e490b5dc1c4f20b23a30f12dcDavid Chisnall if (getToolChain().getDriver().CCCIsCXX) 4741e58e6f9114e61f0e490b5dc1c4f20b23a30f12dcDavid Chisnall getToolChain().AddCXXStdlibLibArgs(Args, CmdArgs); 4742b622959527c07cc6b68739eac1412f75f0ca77faDavid Chisnall CmdArgs.push_back("-lgcc_s"); 4743165329c1d134d000904d6e08b1d166bf34e05517David Chisnall if (!Args.hasArg(options::OPT_shared)) { 4744165329c1d134d000904d6e08b1d166bf34e05517David Chisnall CmdArgs.push_back("-lgcc"); 474531c4690047f5f362ecf886f1586844b1aef0c4d2David Chisnall CmdArgs.push_back("-lc"); 47467dbefe1b1ffbe1d69cc94d07368065976baa49a1David Chisnall CmdArgs.push_back("-lm"); 4747165329c1d134d000904d6e08b1d166bf34e05517David Chisnall } 474831c4690047f5f362ecf886f1586844b1aef0c4d2David Chisnall } 474931c4690047f5f362ecf886f1586844b1aef0c4d2David Chisnall 475031c4690047f5f362ecf886f1586844b1aef0c4d2David Chisnall if (!Args.hasArg(options::OPT_nostdlib) && 475131c4690047f5f362ecf886f1586844b1aef0c4d2David Chisnall !Args.hasArg(options::OPT_nostartfiles)) { 4752165329c1d134d000904d6e08b1d166bf34e05517David Chisnall CmdArgs.push_back(Args.MakeArgString(GCCLibPath + "crtend.o")); 475331c4690047f5f362ecf886f1586844b1aef0c4d2David Chisnall } 4754d1ac03ebac3ab5a8456b955e3f8634f786843f9aDavid Chisnall CmdArgs.push_back(Args.MakeArgString(LibPath + "crtn.o")); 475531c4690047f5f362ecf886f1586844b1aef0c4d2David Chisnall 475631c4690047f5f362ecf886f1586844b1aef0c4d2David Chisnall addProfileRT(getToolChain(), Args, CmdArgs, getToolChain().getTriple()); 475731c4690047f5f362ecf886f1586844b1aef0c4d2David Chisnall 475831c4690047f5f362ecf886f1586844b1aef0c4d2David Chisnall const char *Exec = 475931c4690047f5f362ecf886f1586844b1aef0c4d2David Chisnall Args.MakeArgString(getToolChain().GetProgramPath("ld")); 476031c4690047f5f362ecf886f1586844b1aef0c4d2David Chisnall C.addCommand(new Command(JA, *this, Exec, CmdArgs)); 476131c4690047f5f362ecf886f1586844b1aef0c4d2David Chisnall} 476231c4690047f5f362ecf886f1586844b1aef0c4d2David Chisnall 4763e7925a075f110ab21afeae084670a155dea568e3Edward O'Callaghanvoid auroraux::Assemble::ConstructJob(Compilation &C, const JobAction &JA, 47642fe238ed293bd4bc27af9beb9fa151fad2146fa8Daniel Dunbar const InputInfo &Output, 4765294691eb1caf551083acd7b08630ef21c3fd760dDaniel Dunbar const InputInfoList &Inputs, 4766294691eb1caf551083acd7b08630ef21c3fd760dDaniel Dunbar const ArgList &Args, 4767294691eb1caf551083acd7b08630ef21c3fd760dDaniel Dunbar const char *LinkingOutput) const { 4768e7925a075f110ab21afeae084670a155dea568e3Edward O'Callaghan ArgStringList CmdArgs; 4769e7925a075f110ab21afeae084670a155dea568e3Edward O'Callaghan 4770e7925a075f110ab21afeae084670a155dea568e3Edward O'Callaghan Args.AddAllArgValues(CmdArgs, options::OPT_Wa_COMMA, 4771e7925a075f110ab21afeae084670a155dea568e3Edward O'Callaghan options::OPT_Xassembler); 4772e7925a075f110ab21afeae084670a155dea568e3Edward O'Callaghan 4773e7925a075f110ab21afeae084670a155dea568e3Edward O'Callaghan CmdArgs.push_back("-o"); 47747c1e46533cae07216e2a67d5636a5afb44253155Daniel Dunbar CmdArgs.push_back(Output.getFilename()); 4775e7925a075f110ab21afeae084670a155dea568e3Edward O'Callaghan 4776e7925a075f110ab21afeae084670a155dea568e3Edward O'Callaghan for (InputInfoList::const_iterator 4777e7925a075f110ab21afeae084670a155dea568e3Edward O'Callaghan it = Inputs.begin(), ie = Inputs.end(); it != ie; ++it) { 4778e7925a075f110ab21afeae084670a155dea568e3Edward O'Callaghan const InputInfo &II = *it; 47797c1e46533cae07216e2a67d5636a5afb44253155Daniel Dunbar CmdArgs.push_back(II.getFilename()); 4780e7925a075f110ab21afeae084670a155dea568e3Edward O'Callaghan } 4781e7925a075f110ab21afeae084670a155dea568e3Edward O'Callaghan 4782e7925a075f110ab21afeae084670a155dea568e3Edward O'Callaghan const char *Exec = 47834a7e88978cf646ad10d654020cb00b3877069210Daniel Dunbar Args.MakeArgString(getToolChain().GetProgramPath("gas")); 47842fe238ed293bd4bc27af9beb9fa151fad2146fa8Daniel Dunbar C.addCommand(new Command(JA, *this, Exec, CmdArgs)); 4785e7925a075f110ab21afeae084670a155dea568e3Edward O'Callaghan} 4786e7925a075f110ab21afeae084670a155dea568e3Edward O'Callaghan 4787e7925a075f110ab21afeae084670a155dea568e3Edward O'Callaghanvoid auroraux::Link::ConstructJob(Compilation &C, const JobAction &JA, 47882fe238ed293bd4bc27af9beb9fa151fad2146fa8Daniel Dunbar const InputInfo &Output, 4789294691eb1caf551083acd7b08630ef21c3fd760dDaniel Dunbar const InputInfoList &Inputs, 4790294691eb1caf551083acd7b08630ef21c3fd760dDaniel Dunbar const ArgList &Args, 4791294691eb1caf551083acd7b08630ef21c3fd760dDaniel Dunbar const char *LinkingOutput) const { 4792e7925a075f110ab21afeae084670a155dea568e3Edward O'Callaghan ArgStringList CmdArgs; 4793e7925a075f110ab21afeae084670a155dea568e3Edward O'Callaghan 4794e7925a075f110ab21afeae084670a155dea568e3Edward O'Callaghan if ((!Args.hasArg(options::OPT_nostdlib)) && 4795294691eb1caf551083acd7b08630ef21c3fd760dDaniel Dunbar (!Args.hasArg(options::OPT_shared))) { 4796e7925a075f110ab21afeae084670a155dea568e3Edward O'Callaghan CmdArgs.push_back("-e"); 47977adf94906e23eae295a006659c55eab9ffcf8b37Edward O'Callaghan CmdArgs.push_back("_start"); 4798e7925a075f110ab21afeae084670a155dea568e3Edward O'Callaghan } 4799e7925a075f110ab21afeae084670a155dea568e3Edward O'Callaghan 4800e7925a075f110ab21afeae084670a155dea568e3Edward O'Callaghan if (Args.hasArg(options::OPT_static)) { 4801e7925a075f110ab21afeae084670a155dea568e3Edward O'Callaghan CmdArgs.push_back("-Bstatic"); 48027adf94906e23eae295a006659c55eab9ffcf8b37Edward O'Callaghan CmdArgs.push_back("-dn"); 4803e7925a075f110ab21afeae084670a155dea568e3Edward O'Callaghan } else { 48047adf94906e23eae295a006659c55eab9ffcf8b37Edward O'Callaghan// CmdArgs.push_back("--eh-frame-hdr"); 4805e7925a075f110ab21afeae084670a155dea568e3Edward O'Callaghan CmdArgs.push_back("-Bdynamic"); 4806e7925a075f110ab21afeae084670a155dea568e3Edward O'Callaghan if (Args.hasArg(options::OPT_shared)) { 4807e7925a075f110ab21afeae084670a155dea568e3Edward O'Callaghan CmdArgs.push_back("-shared"); 4808e7925a075f110ab21afeae084670a155dea568e3Edward O'Callaghan } else { 48093cecc19f606ba1000da885b8ff4c089abad224ddEdward O'Callaghan CmdArgs.push_back("--dynamic-linker"); 4810e7925a075f110ab21afeae084670a155dea568e3Edward O'Callaghan CmdArgs.push_back("/lib/ld.so.1"); // 64Bit Path /lib/amd64/ld.so.1 4811e7925a075f110ab21afeae084670a155dea568e3Edward O'Callaghan } 4812e7925a075f110ab21afeae084670a155dea568e3Edward O'Callaghan } 4813e7925a075f110ab21afeae084670a155dea568e3Edward O'Callaghan 48147c1e46533cae07216e2a67d5636a5afb44253155Daniel Dunbar if (Output.isFilename()) { 4815e7925a075f110ab21afeae084670a155dea568e3Edward O'Callaghan CmdArgs.push_back("-o"); 4816e7925a075f110ab21afeae084670a155dea568e3Edward O'Callaghan CmdArgs.push_back(Output.getFilename()); 4817e7925a075f110ab21afeae084670a155dea568e3Edward O'Callaghan } else { 4818e7925a075f110ab21afeae084670a155dea568e3Edward O'Callaghan assert(Output.isNothing() && "Invalid output."); 4819e7925a075f110ab21afeae084670a155dea568e3Edward O'Callaghan } 4820e7925a075f110ab21afeae084670a155dea568e3Edward O'Callaghan 4821e7925a075f110ab21afeae084670a155dea568e3Edward O'Callaghan if (!Args.hasArg(options::OPT_nostdlib) && 4822e7925a075f110ab21afeae084670a155dea568e3Edward O'Callaghan !Args.hasArg(options::OPT_nostartfiles)) { 4823e7925a075f110ab21afeae084670a155dea568e3Edward O'Callaghan if (!Args.hasArg(options::OPT_shared)) { 482438e317d6dce161b249508686cc67eb7176958762Chris Lattner CmdArgs.push_back(Args.MakeArgString( 48254a7e88978cf646ad10d654020cb00b3877069210Daniel Dunbar getToolChain().GetFilePath("crt1.o"))); 482638e317d6dce161b249508686cc67eb7176958762Chris Lattner CmdArgs.push_back(Args.MakeArgString( 48274a7e88978cf646ad10d654020cb00b3877069210Daniel Dunbar getToolChain().GetFilePath("crti.o"))); 482838e317d6dce161b249508686cc67eb7176958762Chris Lattner CmdArgs.push_back(Args.MakeArgString( 48294a7e88978cf646ad10d654020cb00b3877069210Daniel Dunbar getToolChain().GetFilePath("crtbegin.o"))); 4830e7925a075f110ab21afeae084670a155dea568e3Edward O'Callaghan } else { 483138e317d6dce161b249508686cc67eb7176958762Chris Lattner CmdArgs.push_back(Args.MakeArgString( 48324a7e88978cf646ad10d654020cb00b3877069210Daniel Dunbar getToolChain().GetFilePath("crti.o"))); 4833e7925a075f110ab21afeae084670a155dea568e3Edward O'Callaghan } 483438e317d6dce161b249508686cc67eb7176958762Chris Lattner CmdArgs.push_back(Args.MakeArgString( 48354a7e88978cf646ad10d654020cb00b3877069210Daniel Dunbar getToolChain().GetFilePath("crtn.o"))); 4836e7925a075f110ab21afeae084670a155dea568e3Edward O'Callaghan } 4837e7925a075f110ab21afeae084670a155dea568e3Edward O'Callaghan 4838294691eb1caf551083acd7b08630ef21c3fd760dDaniel Dunbar CmdArgs.push_back(Args.MakeArgString("-L/opt/gcc4/lib/gcc/" 4839294691eb1caf551083acd7b08630ef21c3fd760dDaniel Dunbar + getToolChain().getTripleString() 4840f7fb31f4751c9c5ac3d9f93c19ec05a74dd9546fDaniel Dunbar + "/4.2.4")); 4841e7925a075f110ab21afeae084670a155dea568e3Edward O'Callaghan 4842e7925a075f110ab21afeae084670a155dea568e3Edward O'Callaghan Args.AddAllArgs(CmdArgs, options::OPT_L); 4843e7925a075f110ab21afeae084670a155dea568e3Edward O'Callaghan Args.AddAllArgs(CmdArgs, options::OPT_T_Group); 4844e7925a075f110ab21afeae084670a155dea568e3Edward O'Callaghan Args.AddAllArgs(CmdArgs, options::OPT_e); 4845e7925a075f110ab21afeae084670a155dea568e3Edward O'Callaghan 48462008feead855f08500fb01ff43ef5eebee05d1e5Daniel Dunbar AddLinkerInputs(getToolChain(), Inputs, Args, CmdArgs); 4847e7925a075f110ab21afeae084670a155dea568e3Edward O'Callaghan 4848e7925a075f110ab21afeae084670a155dea568e3Edward O'Callaghan if (!Args.hasArg(options::OPT_nostdlib) && 4849e7925a075f110ab21afeae084670a155dea568e3Edward O'Callaghan !Args.hasArg(options::OPT_nodefaultlibs)) { 4850e7925a075f110ab21afeae084670a155dea568e3Edward O'Callaghan // FIXME: For some reason GCC passes -lgcc before adding 4851e7925a075f110ab21afeae084670a155dea568e3Edward O'Callaghan // the default system libraries. Just mimic this for now. 4852e7925a075f110ab21afeae084670a155dea568e3Edward O'Callaghan CmdArgs.push_back("-lgcc"); 4853e7925a075f110ab21afeae084670a155dea568e3Edward O'Callaghan 4854e7925a075f110ab21afeae084670a155dea568e3Edward O'Callaghan if (Args.hasArg(options::OPT_pthread)) 4855e7925a075f110ab21afeae084670a155dea568e3Edward O'Callaghan CmdArgs.push_back("-pthread"); 4856e7925a075f110ab21afeae084670a155dea568e3Edward O'Callaghan if (!Args.hasArg(options::OPT_shared)) 4857e7925a075f110ab21afeae084670a155dea568e3Edward O'Callaghan CmdArgs.push_back("-lc"); 4858e7925a075f110ab21afeae084670a155dea568e3Edward O'Callaghan CmdArgs.push_back("-lgcc"); 4859e7925a075f110ab21afeae084670a155dea568e3Edward O'Callaghan } 4860e7925a075f110ab21afeae084670a155dea568e3Edward O'Callaghan 4861e7925a075f110ab21afeae084670a155dea568e3Edward O'Callaghan if (!Args.hasArg(options::OPT_nostdlib) && 4862e7925a075f110ab21afeae084670a155dea568e3Edward O'Callaghan !Args.hasArg(options::OPT_nostartfiles)) { 4863e7925a075f110ab21afeae084670a155dea568e3Edward O'Callaghan if (!Args.hasArg(options::OPT_shared)) 486438e317d6dce161b249508686cc67eb7176958762Chris Lattner CmdArgs.push_back(Args.MakeArgString( 48654a7e88978cf646ad10d654020cb00b3877069210Daniel Dunbar getToolChain().GetFilePath("crtend.o"))); 4866e7925a075f110ab21afeae084670a155dea568e3Edward O'Callaghan } 4867e7925a075f110ab21afeae084670a155dea568e3Edward O'Callaghan 48683f4be6fb8872942f567166ab8d99c89885f26103Bill Wendling addProfileRT(getToolChain(), Args, CmdArgs, getToolChain().getTriple()); 48692e95a6d7d0b5aed39747875d7474c27824f7319fNick Lewycky 4870e7925a075f110ab21afeae084670a155dea568e3Edward O'Callaghan const char *Exec = 48714a7e88978cf646ad10d654020cb00b3877069210Daniel Dunbar Args.MakeArgString(getToolChain().GetProgramPath("ld")); 48722fe238ed293bd4bc27af9beb9fa151fad2146fa8Daniel Dunbar C.addCommand(new Command(JA, *this, Exec, CmdArgs)); 4873e7925a075f110ab21afeae084670a155dea568e3Edward O'Callaghan} 4874e7925a075f110ab21afeae084670a155dea568e3Edward O'Callaghan 4875f7b8eec37c8c8012fa525c71fb29a58c9f29beefDaniel Dunbarvoid openbsd::Assemble::ConstructJob(Compilation &C, const JobAction &JA, 48762fe238ed293bd4bc27af9beb9fa151fad2146fa8Daniel Dunbar const InputInfo &Output, 4877f7b8eec37c8c8012fa525c71fb29a58c9f29beefDaniel Dunbar const InputInfoList &Inputs, 4878f7b8eec37c8c8012fa525c71fb29a58c9f29beefDaniel Dunbar const ArgList &Args, 48791eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump const char *LinkingOutput) const { 4880f7b8eec37c8c8012fa525c71fb29a58c9f29beefDaniel Dunbar ArgStringList CmdArgs; 4881f7b8eec37c8c8012fa525c71fb29a58c9f29beefDaniel Dunbar 4882f7b8eec37c8c8012fa525c71fb29a58c9f29beefDaniel Dunbar Args.AddAllArgValues(CmdArgs, options::OPT_Wa_COMMA, 4883f7b8eec37c8c8012fa525c71fb29a58c9f29beefDaniel Dunbar options::OPT_Xassembler); 4884f7b8eec37c8c8012fa525c71fb29a58c9f29beefDaniel Dunbar 4885f7b8eec37c8c8012fa525c71fb29a58c9f29beefDaniel Dunbar CmdArgs.push_back("-o"); 48867c1e46533cae07216e2a67d5636a5afb44253155Daniel Dunbar CmdArgs.push_back(Output.getFilename()); 4887f7b8eec37c8c8012fa525c71fb29a58c9f29beefDaniel Dunbar 4888f7b8eec37c8c8012fa525c71fb29a58c9f29beefDaniel Dunbar for (InputInfoList::const_iterator 4889f7b8eec37c8c8012fa525c71fb29a58c9f29beefDaniel Dunbar it = Inputs.begin(), ie = Inputs.end(); it != ie; ++it) { 4890f7b8eec37c8c8012fa525c71fb29a58c9f29beefDaniel Dunbar const InputInfo &II = *it; 48917c1e46533cae07216e2a67d5636a5afb44253155Daniel Dunbar CmdArgs.push_back(II.getFilename()); 4892f7b8eec37c8c8012fa525c71fb29a58c9f29beefDaniel Dunbar } 4893f7b8eec37c8c8012fa525c71fb29a58c9f29beefDaniel Dunbar 4894f7b8eec37c8c8012fa525c71fb29a58c9f29beefDaniel Dunbar const char *Exec = 48954a7e88978cf646ad10d654020cb00b3877069210Daniel Dunbar Args.MakeArgString(getToolChain().GetProgramPath("as")); 48962fe238ed293bd4bc27af9beb9fa151fad2146fa8Daniel Dunbar C.addCommand(new Command(JA, *this, Exec, CmdArgs)); 4897f7b8eec37c8c8012fa525c71fb29a58c9f29beefDaniel Dunbar} 4898f7b8eec37c8c8012fa525c71fb29a58c9f29beefDaniel Dunbar 4899f7b8eec37c8c8012fa525c71fb29a58c9f29beefDaniel Dunbarvoid openbsd::Link::ConstructJob(Compilation &C, const JobAction &JA, 49002fe238ed293bd4bc27af9beb9fa151fad2146fa8Daniel Dunbar const InputInfo &Output, 4901f7b8eec37c8c8012fa525c71fb29a58c9f29beefDaniel Dunbar const InputInfoList &Inputs, 4902f7b8eec37c8c8012fa525c71fb29a58c9f29beefDaniel Dunbar const ArgList &Args, 4903f7b8eec37c8c8012fa525c71fb29a58c9f29beefDaniel Dunbar const char *LinkingOutput) const { 4904ee788e70fcd0adf76103b17c78ac658d4ea30c9bDaniel Dunbar const Driver &D = getToolChain().getDriver(); 4905f7b8eec37c8c8012fa525c71fb29a58c9f29beefDaniel Dunbar ArgStringList CmdArgs; 4906f7b8eec37c8c8012fa525c71fb29a58c9f29beefDaniel Dunbar 49076cc2a68c1ecb20054819a0b154ccfb7ff7498595Rafael Espindola // Silence warning for "clang -g foo.o -o foo" 49086cc2a68c1ecb20054819a0b154ccfb7ff7498595Rafael Espindola Args.ClaimAllArgs(options::OPT_g_Group); 49096cc2a68c1ecb20054819a0b154ccfb7ff7498595Rafael Espindola // and "clang -emit-llvm foo.o -o foo" 49106cc2a68c1ecb20054819a0b154ccfb7ff7498595Rafael Espindola Args.ClaimAllArgs(options::OPT_emit_llvm); 49116cc2a68c1ecb20054819a0b154ccfb7ff7498595Rafael Espindola // and for "clang -w foo.o -o foo". Other warning options are already 49126cc2a68c1ecb20054819a0b154ccfb7ff7498595Rafael Espindola // handled somewhere else. 49136cc2a68c1ecb20054819a0b154ccfb7ff7498595Rafael Espindola Args.ClaimAllArgs(options::OPT_w); 49146cc2a68c1ecb20054819a0b154ccfb7ff7498595Rafael Espindola 49152bbcf669742b6b27748414e22f8042236fceef65Daniel Dunbar if ((!Args.hasArg(options::OPT_nostdlib)) && 4916294691eb1caf551083acd7b08630ef21c3fd760dDaniel Dunbar (!Args.hasArg(options::OPT_shared))) { 49172bbcf669742b6b27748414e22f8042236fceef65Daniel Dunbar CmdArgs.push_back("-e"); 49182bbcf669742b6b27748414e22f8042236fceef65Daniel Dunbar CmdArgs.push_back("__start"); 49192bbcf669742b6b27748414e22f8042236fceef65Daniel Dunbar } 49202bbcf669742b6b27748414e22f8042236fceef65Daniel Dunbar 4921f7b8eec37c8c8012fa525c71fb29a58c9f29beefDaniel Dunbar if (Args.hasArg(options::OPT_static)) { 4922f7b8eec37c8c8012fa525c71fb29a58c9f29beefDaniel Dunbar CmdArgs.push_back("-Bstatic"); 4923f7b8eec37c8c8012fa525c71fb29a58c9f29beefDaniel Dunbar } else { 492465ba55da577b23b24513b815031fc870d1d27971Rafael Espindola if (Args.hasArg(options::OPT_rdynamic)) 492565ba55da577b23b24513b815031fc870d1d27971Rafael Espindola CmdArgs.push_back("-export-dynamic"); 4926f7b8eec37c8c8012fa525c71fb29a58c9f29beefDaniel Dunbar CmdArgs.push_back("--eh-frame-hdr"); 49272bbcf669742b6b27748414e22f8042236fceef65Daniel Dunbar CmdArgs.push_back("-Bdynamic"); 4928f7b8eec37c8c8012fa525c71fb29a58c9f29beefDaniel Dunbar if (Args.hasArg(options::OPT_shared)) { 49292bbcf669742b6b27748414e22f8042236fceef65Daniel Dunbar CmdArgs.push_back("-shared"); 4930f7b8eec37c8c8012fa525c71fb29a58c9f29beefDaniel Dunbar } else { 4931f7b8eec37c8c8012fa525c71fb29a58c9f29beefDaniel Dunbar CmdArgs.push_back("-dynamic-linker"); 4932f7b8eec37c8c8012fa525c71fb29a58c9f29beefDaniel Dunbar CmdArgs.push_back("/usr/libexec/ld.so"); 4933f7b8eec37c8c8012fa525c71fb29a58c9f29beefDaniel Dunbar } 4934f7b8eec37c8c8012fa525c71fb29a58c9f29beefDaniel Dunbar } 4935f7b8eec37c8c8012fa525c71fb29a58c9f29beefDaniel Dunbar 49367c1e46533cae07216e2a67d5636a5afb44253155Daniel Dunbar if (Output.isFilename()) { 4937f7b8eec37c8c8012fa525c71fb29a58c9f29beefDaniel Dunbar CmdArgs.push_back("-o"); 4938f7b8eec37c8c8012fa525c71fb29a58c9f29beefDaniel Dunbar CmdArgs.push_back(Output.getFilename()); 4939f7b8eec37c8c8012fa525c71fb29a58c9f29beefDaniel Dunbar } else { 4940f7b8eec37c8c8012fa525c71fb29a58c9f29beefDaniel Dunbar assert(Output.isNothing() && "Invalid output."); 4941f7b8eec37c8c8012fa525c71fb29a58c9f29beefDaniel Dunbar } 4942f7b8eec37c8c8012fa525c71fb29a58c9f29beefDaniel Dunbar 4943f7b8eec37c8c8012fa525c71fb29a58c9f29beefDaniel Dunbar if (!Args.hasArg(options::OPT_nostdlib) && 4944f7b8eec37c8c8012fa525c71fb29a58c9f29beefDaniel Dunbar !Args.hasArg(options::OPT_nostartfiles)) { 4945f7b8eec37c8c8012fa525c71fb29a58c9f29beefDaniel Dunbar if (!Args.hasArg(options::OPT_shared)) { 494662d829abaf61d70483a5a584059440a549a306bfEli Friedman if (Args.hasArg(options::OPT_pg)) 494762d829abaf61d70483a5a584059440a549a306bfEli Friedman CmdArgs.push_back(Args.MakeArgString( 494862d829abaf61d70483a5a584059440a549a306bfEli Friedman getToolChain().GetFilePath("gcrt0.o"))); 494962d829abaf61d70483a5a584059440a549a306bfEli Friedman else 495062d829abaf61d70483a5a584059440a549a306bfEli Friedman CmdArgs.push_back(Args.MakeArgString( 495162d829abaf61d70483a5a584059440a549a306bfEli Friedman getToolChain().GetFilePath("crt0.o"))); 495238e317d6dce161b249508686cc67eb7176958762Chris Lattner CmdArgs.push_back(Args.MakeArgString( 49534a7e88978cf646ad10d654020cb00b3877069210Daniel Dunbar getToolChain().GetFilePath("crtbegin.o"))); 4954f7b8eec37c8c8012fa525c71fb29a58c9f29beefDaniel Dunbar } else { 495538e317d6dce161b249508686cc67eb7176958762Chris Lattner CmdArgs.push_back(Args.MakeArgString( 49564a7e88978cf646ad10d654020cb00b3877069210Daniel Dunbar getToolChain().GetFilePath("crtbeginS.o"))); 4957f7b8eec37c8c8012fa525c71fb29a58c9f29beefDaniel Dunbar } 4958f7b8eec37c8c8012fa525c71fb29a58c9f29beefDaniel Dunbar } 4959f7b8eec37c8c8012fa525c71fb29a58c9f29beefDaniel Dunbar 4960e7e18200e614a5e619602a088544c85ac8305a1fEdward O'Callaghan std::string Triple = getToolChain().getTripleString(); 4961e7e18200e614a5e619602a088544c85ac8305a1fEdward O'Callaghan if (Triple.substr(0, 6) == "x86_64") 4962294691eb1caf551083acd7b08630ef21c3fd760dDaniel Dunbar Triple.replace(0, 6, "amd64"); 4963f7fb31f4751c9c5ac3d9f93c19ec05a74dd9546fDaniel Dunbar CmdArgs.push_back(Args.MakeArgString("-L/usr/lib/gcc-lib/" + Triple + 496495c0457054518102af6250e718a13a5b2ee5dbeaDaniel Dunbar "/4.2.1")); 49652bbcf669742b6b27748414e22f8042236fceef65Daniel Dunbar 4966f7b8eec37c8c8012fa525c71fb29a58c9f29beefDaniel Dunbar Args.AddAllArgs(CmdArgs, options::OPT_L); 4967f7b8eec37c8c8012fa525c71fb29a58c9f29beefDaniel Dunbar Args.AddAllArgs(CmdArgs, options::OPT_T_Group); 4968f7b8eec37c8c8012fa525c71fb29a58c9f29beefDaniel Dunbar Args.AddAllArgs(CmdArgs, options::OPT_e); 49696cc2a68c1ecb20054819a0b154ccfb7ff7498595Rafael Espindola Args.AddAllArgs(CmdArgs, options::OPT_s); 49706cc2a68c1ecb20054819a0b154ccfb7ff7498595Rafael Espindola Args.AddAllArgs(CmdArgs, options::OPT_t); 49716cc2a68c1ecb20054819a0b154ccfb7ff7498595Rafael Espindola Args.AddAllArgs(CmdArgs, options::OPT_Z_Flag); 49726cc2a68c1ecb20054819a0b154ccfb7ff7498595Rafael Espindola Args.AddAllArgs(CmdArgs, options::OPT_r); 4973f7b8eec37c8c8012fa525c71fb29a58c9f29beefDaniel Dunbar 49742008feead855f08500fb01ff43ef5eebee05d1e5Daniel Dunbar AddLinkerInputs(getToolChain(), Inputs, Args, CmdArgs); 4975f7b8eec37c8c8012fa525c71fb29a58c9f29beefDaniel Dunbar 4976f7b8eec37c8c8012fa525c71fb29a58c9f29beefDaniel Dunbar if (!Args.hasArg(options::OPT_nostdlib) && 4977f7b8eec37c8c8012fa525c71fb29a58c9f29beefDaniel Dunbar !Args.hasArg(options::OPT_nodefaultlibs)) { 497895c0457054518102af6250e718a13a5b2ee5dbeaDaniel Dunbar if (D.CCCIsCXX) { 4979132e35d2f87895d20e7ea146c8c00404b80221a1Daniel Dunbar getToolChain().AddCXXStdlibLibArgs(Args, CmdArgs); 498062d829abaf61d70483a5a584059440a549a306bfEli Friedman if (Args.hasArg(options::OPT_pg)) 498162d829abaf61d70483a5a584059440a549a306bfEli Friedman CmdArgs.push_back("-lm_p"); 498262d829abaf61d70483a5a584059440a549a306bfEli Friedman else 498362d829abaf61d70483a5a584059440a549a306bfEli Friedman CmdArgs.push_back("-lm"); 498495c0457054518102af6250e718a13a5b2ee5dbeaDaniel Dunbar } 498595c0457054518102af6250e718a13a5b2ee5dbeaDaniel Dunbar 49862bbcf669742b6b27748414e22f8042236fceef65Daniel Dunbar // FIXME: For some reason GCC passes -lgcc before adding 49872bbcf669742b6b27748414e22f8042236fceef65Daniel Dunbar // the default system libraries. Just mimic this for now. 49882bbcf669742b6b27748414e22f8042236fceef65Daniel Dunbar CmdArgs.push_back("-lgcc"); 4989f7b8eec37c8c8012fa525c71fb29a58c9f29beefDaniel Dunbar 4990dc6cc87ab68091a714526b391e2a1291d84d485eEric Christopher if (Args.hasArg(options::OPT_pthread)) { 4991dc6cc87ab68091a714526b391e2a1291d84d485eEric Christopher if (!Args.hasArg(options::OPT_shared) && 4992dc6cc87ab68091a714526b391e2a1291d84d485eEric Christopher Args.hasArg(options::OPT_pg)) 4993dc6cc87ab68091a714526b391e2a1291d84d485eEric Christopher CmdArgs.push_back("-lpthread_p"); 4994dc6cc87ab68091a714526b391e2a1291d84d485eEric Christopher else 4995dc6cc87ab68091a714526b391e2a1291d84d485eEric Christopher CmdArgs.push_back("-lpthread"); 4996dc6cc87ab68091a714526b391e2a1291d84d485eEric Christopher } 4997dc6cc87ab68091a714526b391e2a1291d84d485eEric Christopher 4998657849c60378b045a9e904f35ece8fd84425a20aChandler Carruth if (!Args.hasArg(options::OPT_shared)) { 4999dc6cc87ab68091a714526b391e2a1291d84d485eEric Christopher if (Args.hasArg(options::OPT_pg)) 500062d829abaf61d70483a5a584059440a549a306bfEli Friedman CmdArgs.push_back("-lc_p"); 500162d829abaf61d70483a5a584059440a549a306bfEli Friedman else 500262d829abaf61d70483a5a584059440a549a306bfEli Friedman CmdArgs.push_back("-lc"); 5003657849c60378b045a9e904f35ece8fd84425a20aChandler Carruth } 5004dc6cc87ab68091a714526b391e2a1291d84d485eEric Christopher 50052bbcf669742b6b27748414e22f8042236fceef65Daniel Dunbar CmdArgs.push_back("-lgcc"); 5006f7b8eec37c8c8012fa525c71fb29a58c9f29beefDaniel Dunbar } 5007f7b8eec37c8c8012fa525c71fb29a58c9f29beefDaniel Dunbar 5008f7b8eec37c8c8012fa525c71fb29a58c9f29beefDaniel Dunbar if (!Args.hasArg(options::OPT_nostdlib) && 5009f7b8eec37c8c8012fa525c71fb29a58c9f29beefDaniel Dunbar !Args.hasArg(options::OPT_nostartfiles)) { 5010f7b8eec37c8c8012fa525c71fb29a58c9f29beefDaniel Dunbar if (!Args.hasArg(options::OPT_shared)) 501138e317d6dce161b249508686cc67eb7176958762Chris Lattner CmdArgs.push_back(Args.MakeArgString( 50124a7e88978cf646ad10d654020cb00b3877069210Daniel Dunbar getToolChain().GetFilePath("crtend.o"))); 5013f7b8eec37c8c8012fa525c71fb29a58c9f29beefDaniel Dunbar else 501438e317d6dce161b249508686cc67eb7176958762Chris Lattner CmdArgs.push_back(Args.MakeArgString( 50154a7e88978cf646ad10d654020cb00b3877069210Daniel Dunbar getToolChain().GetFilePath("crtendS.o"))); 5016f7b8eec37c8c8012fa525c71fb29a58c9f29beefDaniel Dunbar } 5017f7b8eec37c8c8012fa525c71fb29a58c9f29beefDaniel Dunbar 5018f7b8eec37c8c8012fa525c71fb29a58c9f29beefDaniel Dunbar const char *Exec = 50194a7e88978cf646ad10d654020cb00b3877069210Daniel Dunbar Args.MakeArgString(getToolChain().GetProgramPath("ld")); 50202fe238ed293bd4bc27af9beb9fa151fad2146fa8Daniel Dunbar C.addCommand(new Command(JA, *this, Exec, CmdArgs)); 5021f7b8eec37c8c8012fa525c71fb29a58c9f29beefDaniel Dunbar} 5022c66a5a30a27e7b9cfab46ac8be918e3ea5b0c5a5Ed Schouten 502342f74f21ece01dc8573d5377859d327fbb23b26cEli Friedmanvoid bitrig::Assemble::ConstructJob(Compilation &C, const JobAction &JA, 502442f74f21ece01dc8573d5377859d327fbb23b26cEli Friedman const InputInfo &Output, 502542f74f21ece01dc8573d5377859d327fbb23b26cEli Friedman const InputInfoList &Inputs, 502642f74f21ece01dc8573d5377859d327fbb23b26cEli Friedman const ArgList &Args, 502742f74f21ece01dc8573d5377859d327fbb23b26cEli Friedman const char *LinkingOutput) const { 502842f74f21ece01dc8573d5377859d327fbb23b26cEli Friedman ArgStringList CmdArgs; 502942f74f21ece01dc8573d5377859d327fbb23b26cEli Friedman 503042f74f21ece01dc8573d5377859d327fbb23b26cEli Friedman Args.AddAllArgValues(CmdArgs, options::OPT_Wa_COMMA, 503142f74f21ece01dc8573d5377859d327fbb23b26cEli Friedman options::OPT_Xassembler); 503242f74f21ece01dc8573d5377859d327fbb23b26cEli Friedman 503342f74f21ece01dc8573d5377859d327fbb23b26cEli Friedman CmdArgs.push_back("-o"); 503442f74f21ece01dc8573d5377859d327fbb23b26cEli Friedman CmdArgs.push_back(Output.getFilename()); 503542f74f21ece01dc8573d5377859d327fbb23b26cEli Friedman 503642f74f21ece01dc8573d5377859d327fbb23b26cEli Friedman for (InputInfoList::const_iterator 503742f74f21ece01dc8573d5377859d327fbb23b26cEli Friedman it = Inputs.begin(), ie = Inputs.end(); it != ie; ++it) { 503842f74f21ece01dc8573d5377859d327fbb23b26cEli Friedman const InputInfo &II = *it; 503942f74f21ece01dc8573d5377859d327fbb23b26cEli Friedman CmdArgs.push_back(II.getFilename()); 504042f74f21ece01dc8573d5377859d327fbb23b26cEli Friedman } 504142f74f21ece01dc8573d5377859d327fbb23b26cEli Friedman 504242f74f21ece01dc8573d5377859d327fbb23b26cEli Friedman const char *Exec = 504342f74f21ece01dc8573d5377859d327fbb23b26cEli Friedman Args.MakeArgString(getToolChain().GetProgramPath("as")); 504442f74f21ece01dc8573d5377859d327fbb23b26cEli Friedman C.addCommand(new Command(JA, *this, Exec, CmdArgs)); 504542f74f21ece01dc8573d5377859d327fbb23b26cEli Friedman} 504642f74f21ece01dc8573d5377859d327fbb23b26cEli Friedman 504742f74f21ece01dc8573d5377859d327fbb23b26cEli Friedmanvoid bitrig::Link::ConstructJob(Compilation &C, const JobAction &JA, 504842f74f21ece01dc8573d5377859d327fbb23b26cEli Friedman const InputInfo &Output, 504942f74f21ece01dc8573d5377859d327fbb23b26cEli Friedman const InputInfoList &Inputs, 505042f74f21ece01dc8573d5377859d327fbb23b26cEli Friedman const ArgList &Args, 505142f74f21ece01dc8573d5377859d327fbb23b26cEli Friedman const char *LinkingOutput) const { 505242f74f21ece01dc8573d5377859d327fbb23b26cEli Friedman const Driver &D = getToolChain().getDriver(); 505342f74f21ece01dc8573d5377859d327fbb23b26cEli Friedman ArgStringList CmdArgs; 505442f74f21ece01dc8573d5377859d327fbb23b26cEli Friedman 505542f74f21ece01dc8573d5377859d327fbb23b26cEli Friedman if ((!Args.hasArg(options::OPT_nostdlib)) && 505642f74f21ece01dc8573d5377859d327fbb23b26cEli Friedman (!Args.hasArg(options::OPT_shared))) { 505742f74f21ece01dc8573d5377859d327fbb23b26cEli Friedman CmdArgs.push_back("-e"); 505842f74f21ece01dc8573d5377859d327fbb23b26cEli Friedman CmdArgs.push_back("__start"); 505942f74f21ece01dc8573d5377859d327fbb23b26cEli Friedman } 506042f74f21ece01dc8573d5377859d327fbb23b26cEli Friedman 506142f74f21ece01dc8573d5377859d327fbb23b26cEli Friedman if (Args.hasArg(options::OPT_static)) { 506242f74f21ece01dc8573d5377859d327fbb23b26cEli Friedman CmdArgs.push_back("-Bstatic"); 506342f74f21ece01dc8573d5377859d327fbb23b26cEli Friedman } else { 506442f74f21ece01dc8573d5377859d327fbb23b26cEli Friedman if (Args.hasArg(options::OPT_rdynamic)) 506542f74f21ece01dc8573d5377859d327fbb23b26cEli Friedman CmdArgs.push_back("-export-dynamic"); 506642f74f21ece01dc8573d5377859d327fbb23b26cEli Friedman CmdArgs.push_back("--eh-frame-hdr"); 506742f74f21ece01dc8573d5377859d327fbb23b26cEli Friedman CmdArgs.push_back("-Bdynamic"); 506842f74f21ece01dc8573d5377859d327fbb23b26cEli Friedman if (Args.hasArg(options::OPT_shared)) { 506942f74f21ece01dc8573d5377859d327fbb23b26cEli Friedman CmdArgs.push_back("-shared"); 507042f74f21ece01dc8573d5377859d327fbb23b26cEli Friedman } else { 507142f74f21ece01dc8573d5377859d327fbb23b26cEli Friedman CmdArgs.push_back("-dynamic-linker"); 507242f74f21ece01dc8573d5377859d327fbb23b26cEli Friedman CmdArgs.push_back("/usr/libexec/ld.so"); 507342f74f21ece01dc8573d5377859d327fbb23b26cEli Friedman } 507442f74f21ece01dc8573d5377859d327fbb23b26cEli Friedman } 507542f74f21ece01dc8573d5377859d327fbb23b26cEli Friedman 507642f74f21ece01dc8573d5377859d327fbb23b26cEli Friedman if (Output.isFilename()) { 507742f74f21ece01dc8573d5377859d327fbb23b26cEli Friedman CmdArgs.push_back("-o"); 507842f74f21ece01dc8573d5377859d327fbb23b26cEli Friedman CmdArgs.push_back(Output.getFilename()); 507942f74f21ece01dc8573d5377859d327fbb23b26cEli Friedman } else { 508042f74f21ece01dc8573d5377859d327fbb23b26cEli Friedman assert(Output.isNothing() && "Invalid output."); 508142f74f21ece01dc8573d5377859d327fbb23b26cEli Friedman } 508242f74f21ece01dc8573d5377859d327fbb23b26cEli Friedman 508342f74f21ece01dc8573d5377859d327fbb23b26cEli Friedman if (!Args.hasArg(options::OPT_nostdlib) && 508442f74f21ece01dc8573d5377859d327fbb23b26cEli Friedman !Args.hasArg(options::OPT_nostartfiles)) { 508542f74f21ece01dc8573d5377859d327fbb23b26cEli Friedman if (!Args.hasArg(options::OPT_shared)) { 508642f74f21ece01dc8573d5377859d327fbb23b26cEli Friedman if (Args.hasArg(options::OPT_pg)) 508742f74f21ece01dc8573d5377859d327fbb23b26cEli Friedman CmdArgs.push_back(Args.MakeArgString( 508842f74f21ece01dc8573d5377859d327fbb23b26cEli Friedman getToolChain().GetFilePath("gcrt0.o"))); 508942f74f21ece01dc8573d5377859d327fbb23b26cEli Friedman else 509042f74f21ece01dc8573d5377859d327fbb23b26cEli Friedman CmdArgs.push_back(Args.MakeArgString( 509142f74f21ece01dc8573d5377859d327fbb23b26cEli Friedman getToolChain().GetFilePath("crt0.o"))); 509242f74f21ece01dc8573d5377859d327fbb23b26cEli Friedman CmdArgs.push_back(Args.MakeArgString( 509342f74f21ece01dc8573d5377859d327fbb23b26cEli Friedman getToolChain().GetFilePath("crtbegin.o"))); 509442f74f21ece01dc8573d5377859d327fbb23b26cEli Friedman } else { 509542f74f21ece01dc8573d5377859d327fbb23b26cEli Friedman CmdArgs.push_back(Args.MakeArgString( 509642f74f21ece01dc8573d5377859d327fbb23b26cEli Friedman getToolChain().GetFilePath("crtbeginS.o"))); 509742f74f21ece01dc8573d5377859d327fbb23b26cEli Friedman } 509842f74f21ece01dc8573d5377859d327fbb23b26cEli Friedman } 509942f74f21ece01dc8573d5377859d327fbb23b26cEli Friedman 510042f74f21ece01dc8573d5377859d327fbb23b26cEli Friedman Args.AddAllArgs(CmdArgs, options::OPT_L); 510142f74f21ece01dc8573d5377859d327fbb23b26cEli Friedman Args.AddAllArgs(CmdArgs, options::OPT_T_Group); 510242f74f21ece01dc8573d5377859d327fbb23b26cEli Friedman Args.AddAllArgs(CmdArgs, options::OPT_e); 510342f74f21ece01dc8573d5377859d327fbb23b26cEli Friedman 510442f74f21ece01dc8573d5377859d327fbb23b26cEli Friedman AddLinkerInputs(getToolChain(), Inputs, Args, CmdArgs); 510542f74f21ece01dc8573d5377859d327fbb23b26cEli Friedman 510642f74f21ece01dc8573d5377859d327fbb23b26cEli Friedman if (!Args.hasArg(options::OPT_nostdlib) && 510742f74f21ece01dc8573d5377859d327fbb23b26cEli Friedman !Args.hasArg(options::OPT_nodefaultlibs)) { 510842f74f21ece01dc8573d5377859d327fbb23b26cEli Friedman if (D.CCCIsCXX) { 510942f74f21ece01dc8573d5377859d327fbb23b26cEli Friedman getToolChain().AddCXXStdlibLibArgs(Args, CmdArgs); 511042f74f21ece01dc8573d5377859d327fbb23b26cEli Friedman if (Args.hasArg(options::OPT_pg)) 511142f74f21ece01dc8573d5377859d327fbb23b26cEli Friedman CmdArgs.push_back("-lm_p"); 511242f74f21ece01dc8573d5377859d327fbb23b26cEli Friedman else 511342f74f21ece01dc8573d5377859d327fbb23b26cEli Friedman CmdArgs.push_back("-lm"); 511442f74f21ece01dc8573d5377859d327fbb23b26cEli Friedman } 511542f74f21ece01dc8573d5377859d327fbb23b26cEli Friedman 51163667bbe0f235a8b3fc2496acc8f3136dfb559cc9Rafael Espindola if (Args.hasArg(options::OPT_pthread)) { 51173667bbe0f235a8b3fc2496acc8f3136dfb559cc9Rafael Espindola if (!Args.hasArg(options::OPT_shared) && 51183667bbe0f235a8b3fc2496acc8f3136dfb559cc9Rafael Espindola Args.hasArg(options::OPT_pg)) 51193667bbe0f235a8b3fc2496acc8f3136dfb559cc9Rafael Espindola CmdArgs.push_back("-lpthread_p"); 51203667bbe0f235a8b3fc2496acc8f3136dfb559cc9Rafael Espindola else 51213667bbe0f235a8b3fc2496acc8f3136dfb559cc9Rafael Espindola CmdArgs.push_back("-lpthread"); 51223667bbe0f235a8b3fc2496acc8f3136dfb559cc9Rafael Espindola } 51233667bbe0f235a8b3fc2496acc8f3136dfb559cc9Rafael Espindola 512442f74f21ece01dc8573d5377859d327fbb23b26cEli Friedman if (!Args.hasArg(options::OPT_shared)) { 512542f74f21ece01dc8573d5377859d327fbb23b26cEli Friedman if (Args.hasArg(options::OPT_pg)) 512642f74f21ece01dc8573d5377859d327fbb23b26cEli Friedman CmdArgs.push_back("-lc_p"); 512742f74f21ece01dc8573d5377859d327fbb23b26cEli Friedman else 512842f74f21ece01dc8573d5377859d327fbb23b26cEli Friedman CmdArgs.push_back("-lc"); 512942f74f21ece01dc8573d5377859d327fbb23b26cEli Friedman } 513042f74f21ece01dc8573d5377859d327fbb23b26cEli Friedman 513142f74f21ece01dc8573d5377859d327fbb23b26cEli Friedman std::string myarch = "-lclang_rt."; 513242f74f21ece01dc8573d5377859d327fbb23b26cEli Friedman const llvm::Triple &T = getToolChain().getTriple(); 513342f74f21ece01dc8573d5377859d327fbb23b26cEli Friedman llvm::Triple::ArchType Arch = T.getArch(); 513442f74f21ece01dc8573d5377859d327fbb23b26cEli Friedman switch (Arch) { 513542f74f21ece01dc8573d5377859d327fbb23b26cEli Friedman case llvm::Triple::arm: 513642f74f21ece01dc8573d5377859d327fbb23b26cEli Friedman myarch += ("arm"); 513742f74f21ece01dc8573d5377859d327fbb23b26cEli Friedman break; 513842f74f21ece01dc8573d5377859d327fbb23b26cEli Friedman case llvm::Triple::x86: 513942f74f21ece01dc8573d5377859d327fbb23b26cEli Friedman myarch += ("i386"); 514042f74f21ece01dc8573d5377859d327fbb23b26cEli Friedman break; 514142f74f21ece01dc8573d5377859d327fbb23b26cEli Friedman case llvm::Triple::x86_64: 514242f74f21ece01dc8573d5377859d327fbb23b26cEli Friedman myarch += ("amd64"); 514342f74f21ece01dc8573d5377859d327fbb23b26cEli Friedman break; 514442f74f21ece01dc8573d5377859d327fbb23b26cEli Friedman default: 514542f74f21ece01dc8573d5377859d327fbb23b26cEli Friedman assert(0 && "Unsupported architecture"); 514642f74f21ece01dc8573d5377859d327fbb23b26cEli Friedman } 514742f74f21ece01dc8573d5377859d327fbb23b26cEli Friedman CmdArgs.push_back(Args.MakeArgString(myarch)); 514842f74f21ece01dc8573d5377859d327fbb23b26cEli Friedman } 514942f74f21ece01dc8573d5377859d327fbb23b26cEli Friedman 515042f74f21ece01dc8573d5377859d327fbb23b26cEli Friedman if (!Args.hasArg(options::OPT_nostdlib) && 515142f74f21ece01dc8573d5377859d327fbb23b26cEli Friedman !Args.hasArg(options::OPT_nostartfiles)) { 515242f74f21ece01dc8573d5377859d327fbb23b26cEli Friedman if (!Args.hasArg(options::OPT_shared)) 515342f74f21ece01dc8573d5377859d327fbb23b26cEli Friedman CmdArgs.push_back(Args.MakeArgString( 515442f74f21ece01dc8573d5377859d327fbb23b26cEli Friedman getToolChain().GetFilePath("crtend.o"))); 515542f74f21ece01dc8573d5377859d327fbb23b26cEli Friedman else 515642f74f21ece01dc8573d5377859d327fbb23b26cEli Friedman CmdArgs.push_back(Args.MakeArgString( 515742f74f21ece01dc8573d5377859d327fbb23b26cEli Friedman getToolChain().GetFilePath("crtendS.o"))); 515842f74f21ece01dc8573d5377859d327fbb23b26cEli Friedman } 5159c9c48dba2004b9d25e96d02e12b932a8826c6632Eli Friedman 5160c9c48dba2004b9d25e96d02e12b932a8826c6632Eli Friedman const char *Exec = 5161c9c48dba2004b9d25e96d02e12b932a8826c6632Eli Friedman Args.MakeArgString(getToolChain().GetProgramPath("ld")); 5162c9c48dba2004b9d25e96d02e12b932a8826c6632Eli Friedman C.addCommand(new Command(JA, *this, Exec, CmdArgs)); 516342f74f21ece01dc8573d5377859d327fbb23b26cEli Friedman} 516442f74f21ece01dc8573d5377859d327fbb23b26cEli Friedman 516568a31d406c6dc4382c700d1199b062de2aa7e1daDaniel Dunbarvoid freebsd::Assemble::ConstructJob(Compilation &C, const JobAction &JA, 51662fe238ed293bd4bc27af9beb9fa151fad2146fa8Daniel Dunbar const InputInfo &Output, 5167c21c485b4fb58ef5d55cf3e523263dd824a2ace4Daniel Dunbar const InputInfoList &Inputs, 5168c21c485b4fb58ef5d55cf3e523263dd824a2ace4Daniel Dunbar const ArgList &Args, 51691eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump const char *LinkingOutput) const { 517068a31d406c6dc4382c700d1199b062de2aa7e1daDaniel Dunbar ArgStringList CmdArgs; 517168a31d406c6dc4382c700d1199b062de2aa7e1daDaniel Dunbar 5172008f54a54299eaafdaa940e2bdeaf55935ecd95aDaniel Dunbar // When building 32-bit code on FreeBSD/amd64, we have to explicitly 5173008f54a54299eaafdaa940e2bdeaf55935ecd95aDaniel Dunbar // instruct as in the base system to assemble 32-bit code. 5174c55da4bc1d9bfd7ace9c2bd99f98bc4cf09cd27bEric Christopher if (getToolChain().getArch() == llvm::Triple::x86) 517568a31d406c6dc4382c700d1199b062de2aa7e1daDaniel Dunbar CmdArgs.push_back("--32"); 5176c55da4bc1d9bfd7ace9c2bd99f98bc4cf09cd27bEric Christopher else if (getToolChain().getArch() == llvm::Triple::ppc) 51773393cef18e887723aaa2395d33550ab35551af1dRoman Divacky CmdArgs.push_back("-a32"); 5178c55da4bc1d9bfd7ace9c2bd99f98bc4cf09cd27bEric Christopher else if (getToolChain().getArch() == llvm::Triple::mips || 5179c55da4bc1d9bfd7ace9c2bd99f98bc4cf09cd27bEric Christopher getToolChain().getArch() == llvm::Triple::mipsel || 5180c55da4bc1d9bfd7ace9c2bd99f98bc4cf09cd27bEric Christopher getToolChain().getArch() == llvm::Triple::mips64 || 5181c55da4bc1d9bfd7ace9c2bd99f98bc4cf09cd27bEric Christopher getToolChain().getArch() == llvm::Triple::mips64el) { 5182c55da4bc1d9bfd7ace9c2bd99f98bc4cf09cd27bEric Christopher StringRef CPUName; 5183c55da4bc1d9bfd7ace9c2bd99f98bc4cf09cd27bEric Christopher StringRef ABIName; 5184c55da4bc1d9bfd7ace9c2bd99f98bc4cf09cd27bEric Christopher getMipsCPUAndABI(Args, getToolChain(), CPUName, ABIName); 5185c55da4bc1d9bfd7ace9c2bd99f98bc4cf09cd27bEric Christopher 5186c55da4bc1d9bfd7ace9c2bd99f98bc4cf09cd27bEric Christopher CmdArgs.push_back("-march"); 5187c55da4bc1d9bfd7ace9c2bd99f98bc4cf09cd27bEric Christopher CmdArgs.push_back(CPUName.data()); 5188c55da4bc1d9bfd7ace9c2bd99f98bc4cf09cd27bEric Christopher 5189c55da4bc1d9bfd7ace9c2bd99f98bc4cf09cd27bEric Christopher CmdArgs.push_back("-mabi"); 5190e9616a4972a4c2fdc28128c057f21d7a79516c86Simon Atanasyan CmdArgs.push_back(getGnuCompatibleMipsABIName(ABIName).data()); 5191c55da4bc1d9bfd7ace9c2bd99f98bc4cf09cd27bEric Christopher 5192c55da4bc1d9bfd7ace9c2bd99f98bc4cf09cd27bEric Christopher if (getToolChain().getArch() == llvm::Triple::mips || 5193c55da4bc1d9bfd7ace9c2bd99f98bc4cf09cd27bEric Christopher getToolChain().getArch() == llvm::Triple::mips64) 5194c55da4bc1d9bfd7ace9c2bd99f98bc4cf09cd27bEric Christopher CmdArgs.push_back("-EB"); 5195c55da4bc1d9bfd7ace9c2bd99f98bc4cf09cd27bEric Christopher else 5196c55da4bc1d9bfd7ace9c2bd99f98bc4cf09cd27bEric Christopher CmdArgs.push_back("-EL"); 5197c55da4bc1d9bfd7ace9c2bd99f98bc4cf09cd27bEric Christopher 5198c55da4bc1d9bfd7ace9c2bd99f98bc4cf09cd27bEric Christopher Arg *LastPICArg = Args.getLastArg(options::OPT_fPIC, options::OPT_fno_PIC, 5199c55da4bc1d9bfd7ace9c2bd99f98bc4cf09cd27bEric Christopher options::OPT_fpic, options::OPT_fno_pic, 5200c55da4bc1d9bfd7ace9c2bd99f98bc4cf09cd27bEric Christopher options::OPT_fPIE, options::OPT_fno_PIE, 5201c55da4bc1d9bfd7ace9c2bd99f98bc4cf09cd27bEric Christopher options::OPT_fpie, options::OPT_fno_pie); 5202c55da4bc1d9bfd7ace9c2bd99f98bc4cf09cd27bEric Christopher if (LastPICArg && 5203c55da4bc1d9bfd7ace9c2bd99f98bc4cf09cd27bEric Christopher (LastPICArg->getOption().matches(options::OPT_fPIC) || 5204c55da4bc1d9bfd7ace9c2bd99f98bc4cf09cd27bEric Christopher LastPICArg->getOption().matches(options::OPT_fpic) || 5205c55da4bc1d9bfd7ace9c2bd99f98bc4cf09cd27bEric Christopher LastPICArg->getOption().matches(options::OPT_fPIE) || 5206c55da4bc1d9bfd7ace9c2bd99f98bc4cf09cd27bEric Christopher LastPICArg->getOption().matches(options::OPT_fpie))) { 5207c55da4bc1d9bfd7ace9c2bd99f98bc4cf09cd27bEric Christopher CmdArgs.push_back("-KPIC"); 5208c55da4bc1d9bfd7ace9c2bd99f98bc4cf09cd27bEric Christopher } 520927fa2364b05ab26138c2ecf0eac1937b7fc6c037Rafael Espindola } else if (getToolChain().getArch() == llvm::Triple::arm || 521027fa2364b05ab26138c2ecf0eac1937b7fc6c037Rafael Espindola getToolChain().getArch() == llvm::Triple::thumb) { 521127fa2364b05ab26138c2ecf0eac1937b7fc6c037Rafael Espindola CmdArgs.push_back("-mfpu=softvfp"); 521227fa2364b05ab26138c2ecf0eac1937b7fc6c037Rafael Espindola switch(getToolChain().getTriple().getEnvironment()) { 521327fa2364b05ab26138c2ecf0eac1937b7fc6c037Rafael Espindola case llvm::Triple::GNUEABI: 521427fa2364b05ab26138c2ecf0eac1937b7fc6c037Rafael Espindola case llvm::Triple::EABI: 5215b234e7484b8b678977e5c6a6088dee323c72d3abAnton Korobeynikov CmdArgs.push_back("-meabi=5"); 521627fa2364b05ab26138c2ecf0eac1937b7fc6c037Rafael Espindola break; 521727fa2364b05ab26138c2ecf0eac1937b7fc6c037Rafael Espindola 521827fa2364b05ab26138c2ecf0eac1937b7fc6c037Rafael Espindola default: 521927fa2364b05ab26138c2ecf0eac1937b7fc6c037Rafael Espindola CmdArgs.push_back("-matpcs"); 522027fa2364b05ab26138c2ecf0eac1937b7fc6c037Rafael Espindola } 5221c55da4bc1d9bfd7ace9c2bd99f98bc4cf09cd27bEric Christopher } 5222ed734737d5af31906e30e537d4a41c760ddcfc59Eric Christopher 522368a31d406c6dc4382c700d1199b062de2aa7e1daDaniel Dunbar Args.AddAllArgValues(CmdArgs, options::OPT_Wa_COMMA, 522468a31d406c6dc4382c700d1199b062de2aa7e1daDaniel Dunbar options::OPT_Xassembler); 522568a31d406c6dc4382c700d1199b062de2aa7e1daDaniel Dunbar 522668a31d406c6dc4382c700d1199b062de2aa7e1daDaniel Dunbar CmdArgs.push_back("-o"); 52277c1e46533cae07216e2a67d5636a5afb44253155Daniel Dunbar CmdArgs.push_back(Output.getFilename()); 522868a31d406c6dc4382c700d1199b062de2aa7e1daDaniel Dunbar 522968a31d406c6dc4382c700d1199b062de2aa7e1daDaniel Dunbar for (InputInfoList::const_iterator 523068a31d406c6dc4382c700d1199b062de2aa7e1daDaniel Dunbar it = Inputs.begin(), ie = Inputs.end(); it != ie; ++it) { 523168a31d406c6dc4382c700d1199b062de2aa7e1daDaniel Dunbar const InputInfo &II = *it; 52327c1e46533cae07216e2a67d5636a5afb44253155Daniel Dunbar CmdArgs.push_back(II.getFilename()); 523368a31d406c6dc4382c700d1199b062de2aa7e1daDaniel Dunbar } 523468a31d406c6dc4382c700d1199b062de2aa7e1daDaniel Dunbar 5235c21c485b4fb58ef5d55cf3e523263dd824a2ace4Daniel Dunbar const char *Exec = 52364a7e88978cf646ad10d654020cb00b3877069210Daniel Dunbar Args.MakeArgString(getToolChain().GetProgramPath("as")); 52372fe238ed293bd4bc27af9beb9fa151fad2146fa8Daniel Dunbar C.addCommand(new Command(JA, *this, Exec, CmdArgs)); 523868a31d406c6dc4382c700d1199b062de2aa7e1daDaniel Dunbar} 5239008f54a54299eaafdaa940e2bdeaf55935ecd95aDaniel Dunbar 5240008f54a54299eaafdaa940e2bdeaf55935ecd95aDaniel Dunbarvoid freebsd::Link::ConstructJob(Compilation &C, const JobAction &JA, 52412fe238ed293bd4bc27af9beb9fa151fad2146fa8Daniel Dunbar const InputInfo &Output, 5242c21c485b4fb58ef5d55cf3e523263dd824a2ace4Daniel Dunbar const InputInfoList &Inputs, 5243c21c485b4fb58ef5d55cf3e523263dd824a2ace4Daniel Dunbar const ArgList &Args, 5244a8304f67291b0182fb64f3afc621615288dd1d31Daniel Dunbar const char *LinkingOutput) const { 52459438016db2332aca8b53fd953da06128373cc5beRoman Divacky const toolchains::FreeBSD& ToolChain = 52469438016db2332aca8b53fd953da06128373cc5beRoman Divacky static_cast<const toolchains::FreeBSD&>(getToolChain()); 52479438016db2332aca8b53fd953da06128373cc5beRoman Divacky const Driver &D = ToolChain.getDriver(); 5248008f54a54299eaafdaa940e2bdeaf55935ecd95aDaniel Dunbar ArgStringList CmdArgs; 5249dfa210b1e1e403855557f68fe471212787b8540eDavid Chisnall 5250dfa210b1e1e403855557f68fe471212787b8540eDavid Chisnall // Silence warning for "clang -g foo.o -o foo" 5251dfa210b1e1e403855557f68fe471212787b8540eDavid Chisnall Args.ClaimAllArgs(options::OPT_g_Group); 5252dfa210b1e1e403855557f68fe471212787b8540eDavid Chisnall // and "clang -emit-llvm foo.o -o foo" 5253dfa210b1e1e403855557f68fe471212787b8540eDavid Chisnall Args.ClaimAllArgs(options::OPT_emit_llvm); 5254dfa210b1e1e403855557f68fe471212787b8540eDavid Chisnall // and for "clang -w foo.o -o foo". Other warning options are already 5255dfa210b1e1e403855557f68fe471212787b8540eDavid Chisnall // handled somewhere else. 5256dfa210b1e1e403855557f68fe471212787b8540eDavid Chisnall Args.ClaimAllArgs(options::OPT_w); 5257008f54a54299eaafdaa940e2bdeaf55935ecd95aDaniel Dunbar 52588ab2bdcc4f397e100c684ede8e8ca6e226e1380aJoerg Sonnenberger if (!D.SysRoot.empty()) 52598ab2bdcc4f397e100c684ede8e8ca6e226e1380aJoerg Sonnenberger CmdArgs.push_back(Args.MakeArgString("--sysroot=" + D.SysRoot)); 52608ab2bdcc4f397e100c684ede8e8ca6e226e1380aJoerg Sonnenberger 52619438016db2332aca8b53fd953da06128373cc5beRoman Divacky if (Args.hasArg(options::OPT_pie)) 52629438016db2332aca8b53fd953da06128373cc5beRoman Divacky CmdArgs.push_back("-pie"); 52639438016db2332aca8b53fd953da06128373cc5beRoman Divacky 5264008f54a54299eaafdaa940e2bdeaf55935ecd95aDaniel Dunbar if (Args.hasArg(options::OPT_static)) { 5265008f54a54299eaafdaa940e2bdeaf55935ecd95aDaniel Dunbar CmdArgs.push_back("-Bstatic"); 5266008f54a54299eaafdaa940e2bdeaf55935ecd95aDaniel Dunbar } else { 526765ba55da577b23b24513b815031fc870d1d27971Rafael Espindola if (Args.hasArg(options::OPT_rdynamic)) 526865ba55da577b23b24513b815031fc870d1d27971Rafael Espindola CmdArgs.push_back("-export-dynamic"); 5269008f54a54299eaafdaa940e2bdeaf55935ecd95aDaniel Dunbar CmdArgs.push_back("--eh-frame-hdr"); 5270008f54a54299eaafdaa940e2bdeaf55935ecd95aDaniel Dunbar if (Args.hasArg(options::OPT_shared)) { 5271008f54a54299eaafdaa940e2bdeaf55935ecd95aDaniel Dunbar CmdArgs.push_back("-Bshareable"); 5272008f54a54299eaafdaa940e2bdeaf55935ecd95aDaniel Dunbar } else { 5273008f54a54299eaafdaa940e2bdeaf55935ecd95aDaniel Dunbar CmdArgs.push_back("-dynamic-linker"); 5274008f54a54299eaafdaa940e2bdeaf55935ecd95aDaniel Dunbar CmdArgs.push_back("/libexec/ld-elf.so.1"); 5275008f54a54299eaafdaa940e2bdeaf55935ecd95aDaniel Dunbar } 52769438016db2332aca8b53fd953da06128373cc5beRoman Divacky if (ToolChain.getTriple().getOSMajorVersion() >= 9) { 52779438016db2332aca8b53fd953da06128373cc5beRoman Divacky llvm::Triple::ArchType Arch = ToolChain.getArch(); 5278dfa210b1e1e403855557f68fe471212787b8540eDavid Chisnall if (Arch == llvm::Triple::arm || Arch == llvm::Triple::sparc || 5279dfa210b1e1e403855557f68fe471212787b8540eDavid Chisnall Arch == llvm::Triple::x86 || Arch == llvm::Triple::x86_64) { 5280dfa210b1e1e403855557f68fe471212787b8540eDavid Chisnall CmdArgs.push_back("--hash-style=both"); 5281dfa210b1e1e403855557f68fe471212787b8540eDavid Chisnall } 5282dfa210b1e1e403855557f68fe471212787b8540eDavid Chisnall } 5283dfa210b1e1e403855557f68fe471212787b8540eDavid Chisnall CmdArgs.push_back("--enable-new-dtags"); 5284008f54a54299eaafdaa940e2bdeaf55935ecd95aDaniel Dunbar } 5285008f54a54299eaafdaa940e2bdeaf55935ecd95aDaniel Dunbar 5286008f54a54299eaafdaa940e2bdeaf55935ecd95aDaniel Dunbar // When building 32-bit code on FreeBSD/amd64, we have to explicitly 5287008f54a54299eaafdaa940e2bdeaf55935ecd95aDaniel Dunbar // instruct ld in the base system to link 32-bit code. 528864f7ad9328e877779ec63638f39de4e10d2ff276Rafael Espindola if (ToolChain.getArch() == llvm::Triple::x86) { 5289008f54a54299eaafdaa940e2bdeaf55935ecd95aDaniel Dunbar CmdArgs.push_back("-m"); 5290008f54a54299eaafdaa940e2bdeaf55935ecd95aDaniel Dunbar CmdArgs.push_back("elf_i386_fbsd"); 5291008f54a54299eaafdaa940e2bdeaf55935ecd95aDaniel Dunbar } 5292008f54a54299eaafdaa940e2bdeaf55935ecd95aDaniel Dunbar 529364f7ad9328e877779ec63638f39de4e10d2ff276Rafael Espindola if (ToolChain.getArch() == llvm::Triple::ppc) { 5294000a6552adc6372576d65170dfb5969fd03cc521Roman Divacky CmdArgs.push_back("-m"); 52951052c1dc52447643dac5484d3a22ab836c781f47Roman Divacky CmdArgs.push_back("elf32ppc_fbsd"); 5296000a6552adc6372576d65170dfb5969fd03cc521Roman Divacky } 5297000a6552adc6372576d65170dfb5969fd03cc521Roman Divacky 52987c1e46533cae07216e2a67d5636a5afb44253155Daniel Dunbar if (Output.isFilename()) { 5299008f54a54299eaafdaa940e2bdeaf55935ecd95aDaniel Dunbar CmdArgs.push_back("-o"); 5300008f54a54299eaafdaa940e2bdeaf55935ecd95aDaniel Dunbar CmdArgs.push_back(Output.getFilename()); 5301008f54a54299eaafdaa940e2bdeaf55935ecd95aDaniel Dunbar } else { 5302008f54a54299eaafdaa940e2bdeaf55935ecd95aDaniel Dunbar assert(Output.isNothing() && "Invalid output."); 5303008f54a54299eaafdaa940e2bdeaf55935ecd95aDaniel Dunbar } 5304008f54a54299eaafdaa940e2bdeaf55935ecd95aDaniel Dunbar 5305008f54a54299eaafdaa940e2bdeaf55935ecd95aDaniel Dunbar if (!Args.hasArg(options::OPT_nostdlib) && 5306008f54a54299eaafdaa940e2bdeaf55935ecd95aDaniel Dunbar !Args.hasArg(options::OPT_nostartfiles)) { 53079438016db2332aca8b53fd953da06128373cc5beRoman Divacky const char *crt1 = NULL; 5308008f54a54299eaafdaa940e2bdeaf55935ecd95aDaniel Dunbar if (!Args.hasArg(options::OPT_shared)) { 5309c16bb76f25ada63864aa89827a9906c1579d2ad3Roman Divacky if (Args.hasArg(options::OPT_pg)) 53109438016db2332aca8b53fd953da06128373cc5beRoman Divacky crt1 = "gcrt1.o"; 53119438016db2332aca8b53fd953da06128373cc5beRoman Divacky else if (Args.hasArg(options::OPT_pie)) 53129438016db2332aca8b53fd953da06128373cc5beRoman Divacky crt1 = "Scrt1.o"; 53139438016db2332aca8b53fd953da06128373cc5beRoman Divacky else 53149438016db2332aca8b53fd953da06128373cc5beRoman Divacky crt1 = "crt1.o"; 5315008f54a54299eaafdaa940e2bdeaf55935ecd95aDaniel Dunbar } 53169438016db2332aca8b53fd953da06128373cc5beRoman Divacky if (crt1) 53179438016db2332aca8b53fd953da06128373cc5beRoman Divacky CmdArgs.push_back(Args.MakeArgString(ToolChain.GetFilePath(crt1))); 53189438016db2332aca8b53fd953da06128373cc5beRoman Divacky 53199438016db2332aca8b53fd953da06128373cc5beRoman Divacky CmdArgs.push_back(Args.MakeArgString(ToolChain.GetFilePath("crti.o"))); 53209438016db2332aca8b53fd953da06128373cc5beRoman Divacky 53219438016db2332aca8b53fd953da06128373cc5beRoman Divacky const char *crtbegin = NULL; 53229438016db2332aca8b53fd953da06128373cc5beRoman Divacky if (Args.hasArg(options::OPT_static)) 53239438016db2332aca8b53fd953da06128373cc5beRoman Divacky crtbegin = "crtbeginT.o"; 53249438016db2332aca8b53fd953da06128373cc5beRoman Divacky else if (Args.hasArg(options::OPT_shared) || Args.hasArg(options::OPT_pie)) 53259438016db2332aca8b53fd953da06128373cc5beRoman Divacky crtbegin = "crtbeginS.o"; 53269438016db2332aca8b53fd953da06128373cc5beRoman Divacky else 53279438016db2332aca8b53fd953da06128373cc5beRoman Divacky crtbegin = "crtbegin.o"; 53289438016db2332aca8b53fd953da06128373cc5beRoman Divacky 53299438016db2332aca8b53fd953da06128373cc5beRoman Divacky CmdArgs.push_back(Args.MakeArgString(ToolChain.GetFilePath(crtbegin))); 5330008f54a54299eaafdaa940e2bdeaf55935ecd95aDaniel Dunbar } 5331008f54a54299eaafdaa940e2bdeaf55935ecd95aDaniel Dunbar 5332008f54a54299eaafdaa940e2bdeaf55935ecd95aDaniel Dunbar Args.AddAllArgs(CmdArgs, options::OPT_L); 53339438016db2332aca8b53fd953da06128373cc5beRoman Divacky const ToolChain::path_list Paths = ToolChain.getFilePaths(); 533458e5ac9d41d8186bea92e892d572e2eea28d3f9cRoman Divacky for (ToolChain::path_list::const_iterator i = Paths.begin(), e = Paths.end(); 533558e5ac9d41d8186bea92e892d572e2eea28d3f9cRoman Divacky i != e; ++i) 53365f9e272e632e951b1efe824cd16acb4d96077930Chris Lattner CmdArgs.push_back(Args.MakeArgString(StringRef("-L") + *i)); 5337008f54a54299eaafdaa940e2bdeaf55935ecd95aDaniel Dunbar Args.AddAllArgs(CmdArgs, options::OPT_T_Group); 5338008f54a54299eaafdaa940e2bdeaf55935ecd95aDaniel Dunbar Args.AddAllArgs(CmdArgs, options::OPT_e); 5339c736377543edcfbb00a4150fae79b4d9d9f66849David Chisnall Args.AddAllArgs(CmdArgs, options::OPT_s); 5340c736377543edcfbb00a4150fae79b4d9d9f66849David Chisnall Args.AddAllArgs(CmdArgs, options::OPT_t); 5341c736377543edcfbb00a4150fae79b4d9d9f66849David Chisnall Args.AddAllArgs(CmdArgs, options::OPT_Z_Flag); 5342c736377543edcfbb00a4150fae79b4d9d9f66849David Chisnall Args.AddAllArgs(CmdArgs, options::OPT_r); 5343008f54a54299eaafdaa940e2bdeaf55935ecd95aDaniel Dunbar 53449438016db2332aca8b53fd953da06128373cc5beRoman Divacky AddLinkerInputs(ToolChain, Inputs, Args, CmdArgs); 53458e50a96b387dca7525caa8a6add31420dd82a2cdBenjamin Kramer 53468e50a96b387dca7525caa8a6add31420dd82a2cdBenjamin Kramer if (!Args.hasArg(options::OPT_nostdlib) && 53478e50a96b387dca7525caa8a6add31420dd82a2cdBenjamin Kramer !Args.hasArg(options::OPT_nodefaultlibs)) { 53488e50a96b387dca7525caa8a6add31420dd82a2cdBenjamin Kramer if (D.CCCIsCXX) { 53499438016db2332aca8b53fd953da06128373cc5beRoman Divacky ToolChain.AddCXXStdlibLibArgs(Args, CmdArgs); 5350c16bb76f25ada63864aa89827a9906c1579d2ad3Roman Divacky if (Args.hasArg(options::OPT_pg)) 5351c16bb76f25ada63864aa89827a9906c1579d2ad3Roman Divacky CmdArgs.push_back("-lm_p"); 5352c16bb76f25ada63864aa89827a9906c1579d2ad3Roman Divacky else 5353c16bb76f25ada63864aa89827a9906c1579d2ad3Roman Divacky CmdArgs.push_back("-lm"); 53548e50a96b387dca7525caa8a6add31420dd82a2cdBenjamin Kramer } 53558e50a96b387dca7525caa8a6add31420dd82a2cdBenjamin Kramer // FIXME: For some reason GCC passes -lgcc and -lgcc_s before adding 53568e50a96b387dca7525caa8a6add31420dd82a2cdBenjamin Kramer // the default system libraries. Just mimic this for now. 5357c16bb76f25ada63864aa89827a9906c1579d2ad3Roman Divacky if (Args.hasArg(options::OPT_pg)) 5358c16bb76f25ada63864aa89827a9906c1579d2ad3Roman Divacky CmdArgs.push_back("-lgcc_p"); 5359c16bb76f25ada63864aa89827a9906c1579d2ad3Roman Divacky else 5360c16bb76f25ada63864aa89827a9906c1579d2ad3Roman Divacky CmdArgs.push_back("-lgcc"); 53618e50a96b387dca7525caa8a6add31420dd82a2cdBenjamin Kramer if (Args.hasArg(options::OPT_static)) { 53628e50a96b387dca7525caa8a6add31420dd82a2cdBenjamin Kramer CmdArgs.push_back("-lgcc_eh"); 5363c16bb76f25ada63864aa89827a9906c1579d2ad3Roman Divacky } else if (Args.hasArg(options::OPT_pg)) { 5364c16bb76f25ada63864aa89827a9906c1579d2ad3Roman Divacky CmdArgs.push_back("-lgcc_eh_p"); 53658e50a96b387dca7525caa8a6add31420dd82a2cdBenjamin Kramer } else { 53668e50a96b387dca7525caa8a6add31420dd82a2cdBenjamin Kramer CmdArgs.push_back("--as-needed"); 53678e50a96b387dca7525caa8a6add31420dd82a2cdBenjamin Kramer CmdArgs.push_back("-lgcc_s"); 53688e50a96b387dca7525caa8a6add31420dd82a2cdBenjamin Kramer CmdArgs.push_back("--no-as-needed"); 53698e50a96b387dca7525caa8a6add31420dd82a2cdBenjamin Kramer } 53708e50a96b387dca7525caa8a6add31420dd82a2cdBenjamin Kramer 5371242302673bdcf35b49579a30fed9dc068a4e10f2Matt Beaumont-Gay if (Args.hasArg(options::OPT_pthread)) { 5372c16bb76f25ada63864aa89827a9906c1579d2ad3Roman Divacky if (Args.hasArg(options::OPT_pg)) 5373c16bb76f25ada63864aa89827a9906c1579d2ad3Roman Divacky CmdArgs.push_back("-lpthread_p"); 5374c16bb76f25ada63864aa89827a9906c1579d2ad3Roman Divacky else 5375c16bb76f25ada63864aa89827a9906c1579d2ad3Roman Divacky CmdArgs.push_back("-lpthread"); 5376242302673bdcf35b49579a30fed9dc068a4e10f2Matt Beaumont-Gay } 5377c16bb76f25ada63864aa89827a9906c1579d2ad3Roman Divacky 5378c16bb76f25ada63864aa89827a9906c1579d2ad3Roman Divacky if (Args.hasArg(options::OPT_pg)) { 5379c16bb76f25ada63864aa89827a9906c1579d2ad3Roman Divacky if (Args.hasArg(options::OPT_shared)) 5380c16bb76f25ada63864aa89827a9906c1579d2ad3Roman Divacky CmdArgs.push_back("-lc"); 5381c16bb76f25ada63864aa89827a9906c1579d2ad3Roman Divacky else 5382c16bb76f25ada63864aa89827a9906c1579d2ad3Roman Divacky CmdArgs.push_back("-lc_p"); 5383c16bb76f25ada63864aa89827a9906c1579d2ad3Roman Divacky CmdArgs.push_back("-lgcc_p"); 5384c16bb76f25ada63864aa89827a9906c1579d2ad3Roman Divacky } else { 5385c16bb76f25ada63864aa89827a9906c1579d2ad3Roman Divacky CmdArgs.push_back("-lc"); 5386c16bb76f25ada63864aa89827a9906c1579d2ad3Roman Divacky CmdArgs.push_back("-lgcc"); 5387c16bb76f25ada63864aa89827a9906c1579d2ad3Roman Divacky } 53888e50a96b387dca7525caa8a6add31420dd82a2cdBenjamin Kramer 53898e50a96b387dca7525caa8a6add31420dd82a2cdBenjamin Kramer if (Args.hasArg(options::OPT_static)) { 53908e50a96b387dca7525caa8a6add31420dd82a2cdBenjamin Kramer CmdArgs.push_back("-lgcc_eh"); 5391c16bb76f25ada63864aa89827a9906c1579d2ad3Roman Divacky } else if (Args.hasArg(options::OPT_pg)) { 5392c16bb76f25ada63864aa89827a9906c1579d2ad3Roman Divacky CmdArgs.push_back("-lgcc_eh_p"); 53938e50a96b387dca7525caa8a6add31420dd82a2cdBenjamin Kramer } else { 53948e50a96b387dca7525caa8a6add31420dd82a2cdBenjamin Kramer CmdArgs.push_back("--as-needed"); 53958e50a96b387dca7525caa8a6add31420dd82a2cdBenjamin Kramer CmdArgs.push_back("-lgcc_s"); 53968e50a96b387dca7525caa8a6add31420dd82a2cdBenjamin Kramer CmdArgs.push_back("--no-as-needed"); 53978e50a96b387dca7525caa8a6add31420dd82a2cdBenjamin Kramer } 53988e50a96b387dca7525caa8a6add31420dd82a2cdBenjamin Kramer } 53998e50a96b387dca7525caa8a6add31420dd82a2cdBenjamin Kramer 54008e50a96b387dca7525caa8a6add31420dd82a2cdBenjamin Kramer if (!Args.hasArg(options::OPT_nostdlib) && 54018e50a96b387dca7525caa8a6add31420dd82a2cdBenjamin Kramer !Args.hasArg(options::OPT_nostartfiles)) { 5402f6513810c9e5bb75336b69e08cf99cc8ba97175fRoman Divacky if (Args.hasArg(options::OPT_shared) || Args.hasArg(options::OPT_pie)) 54039438016db2332aca8b53fd953da06128373cc5beRoman Divacky CmdArgs.push_back(Args.MakeArgString(ToolChain.GetFilePath("crtendS.o"))); 5404f6513810c9e5bb75336b69e08cf99cc8ba97175fRoman Divacky else 5405f6513810c9e5bb75336b69e08cf99cc8ba97175fRoman Divacky CmdArgs.push_back(Args.MakeArgString(ToolChain.GetFilePath("crtend.o"))); 54069438016db2332aca8b53fd953da06128373cc5beRoman Divacky CmdArgs.push_back(Args.MakeArgString(ToolChain.GetFilePath("crtn.o"))); 54078e50a96b387dca7525caa8a6add31420dd82a2cdBenjamin Kramer } 54088e50a96b387dca7525caa8a6add31420dd82a2cdBenjamin Kramer 54099438016db2332aca8b53fd953da06128373cc5beRoman Divacky addProfileRT(ToolChain, Args, CmdArgs, ToolChain.getTriple()); 54102e95a6d7d0b5aed39747875d7474c27824f7319fNick Lewycky 54118e50a96b387dca7525caa8a6add31420dd82a2cdBenjamin Kramer const char *Exec = 54129438016db2332aca8b53fd953da06128373cc5beRoman Divacky Args.MakeArgString(ToolChain.GetProgramPath("ld")); 54138e50a96b387dca7525caa8a6add31420dd82a2cdBenjamin Kramer C.addCommand(new Command(JA, *this, Exec, CmdArgs)); 54148e50a96b387dca7525caa8a6add31420dd82a2cdBenjamin Kramer} 54158e50a96b387dca7525caa8a6add31420dd82a2cdBenjamin Kramer 54168e50a96b387dca7525caa8a6add31420dd82a2cdBenjamin Kramervoid netbsd::Assemble::ConstructJob(Compilation &C, const JobAction &JA, 54178e50a96b387dca7525caa8a6add31420dd82a2cdBenjamin Kramer const InputInfo &Output, 54188e50a96b387dca7525caa8a6add31420dd82a2cdBenjamin Kramer const InputInfoList &Inputs, 54198e50a96b387dca7525caa8a6add31420dd82a2cdBenjamin Kramer const ArgList &Args, 54208e50a96b387dca7525caa8a6add31420dd82a2cdBenjamin Kramer const char *LinkingOutput) const { 54218e50a96b387dca7525caa8a6add31420dd82a2cdBenjamin Kramer ArgStringList CmdArgs; 54228e50a96b387dca7525caa8a6add31420dd82a2cdBenjamin Kramer 54238e50a96b387dca7525caa8a6add31420dd82a2cdBenjamin Kramer // When building 32-bit code on NetBSD/amd64, we have to explicitly 54248e50a96b387dca7525caa8a6add31420dd82a2cdBenjamin Kramer // instruct as in the base system to assemble 32-bit code. 54251bd91374498ac78e72545f08f4daa6491f9c9d14Joerg Sonnenberger if (getToolChain().getArch() == llvm::Triple::x86) 54268e50a96b387dca7525caa8a6add31420dd82a2cdBenjamin Kramer CmdArgs.push_back("--32"); 54278e50a96b387dca7525caa8a6add31420dd82a2cdBenjamin Kramer 54288e50a96b387dca7525caa8a6add31420dd82a2cdBenjamin Kramer // Set byte order explicitly 542964f7ad9328e877779ec63638f39de4e10d2ff276Rafael Espindola if (getToolChain().getArch() == llvm::Triple::mips) 54308e50a96b387dca7525caa8a6add31420dd82a2cdBenjamin Kramer CmdArgs.push_back("-EB"); 543164f7ad9328e877779ec63638f39de4e10d2ff276Rafael Espindola else if (getToolChain().getArch() == llvm::Triple::mipsel) 54328e50a96b387dca7525caa8a6add31420dd82a2cdBenjamin Kramer CmdArgs.push_back("-EL"); 54338e50a96b387dca7525caa8a6add31420dd82a2cdBenjamin Kramer 54348e50a96b387dca7525caa8a6add31420dd82a2cdBenjamin Kramer Args.AddAllArgValues(CmdArgs, options::OPT_Wa_COMMA, 54358e50a96b387dca7525caa8a6add31420dd82a2cdBenjamin Kramer options::OPT_Xassembler); 54368e50a96b387dca7525caa8a6add31420dd82a2cdBenjamin Kramer 54378e50a96b387dca7525caa8a6add31420dd82a2cdBenjamin Kramer CmdArgs.push_back("-o"); 54388e50a96b387dca7525caa8a6add31420dd82a2cdBenjamin Kramer CmdArgs.push_back(Output.getFilename()); 54398e50a96b387dca7525caa8a6add31420dd82a2cdBenjamin Kramer 54408e50a96b387dca7525caa8a6add31420dd82a2cdBenjamin Kramer for (InputInfoList::const_iterator 54418e50a96b387dca7525caa8a6add31420dd82a2cdBenjamin Kramer it = Inputs.begin(), ie = Inputs.end(); it != ie; ++it) { 54428e50a96b387dca7525caa8a6add31420dd82a2cdBenjamin Kramer const InputInfo &II = *it; 54438e50a96b387dca7525caa8a6add31420dd82a2cdBenjamin Kramer CmdArgs.push_back(II.getFilename()); 54448e50a96b387dca7525caa8a6add31420dd82a2cdBenjamin Kramer } 54458e50a96b387dca7525caa8a6add31420dd82a2cdBenjamin Kramer 54465adcec16cb8d9e7bebf310b6c07249dfd852346bDavid Chisnall const char *Exec = Args.MakeArgString((getToolChain().GetProgramPath("as"))); 54478e50a96b387dca7525caa8a6add31420dd82a2cdBenjamin Kramer C.addCommand(new Command(JA, *this, Exec, CmdArgs)); 54488e50a96b387dca7525caa8a6add31420dd82a2cdBenjamin Kramer} 54498e50a96b387dca7525caa8a6add31420dd82a2cdBenjamin Kramer 54508e50a96b387dca7525caa8a6add31420dd82a2cdBenjamin Kramervoid netbsd::Link::ConstructJob(Compilation &C, const JobAction &JA, 54518e50a96b387dca7525caa8a6add31420dd82a2cdBenjamin Kramer const InputInfo &Output, 54528e50a96b387dca7525caa8a6add31420dd82a2cdBenjamin Kramer const InputInfoList &Inputs, 54538e50a96b387dca7525caa8a6add31420dd82a2cdBenjamin Kramer const ArgList &Args, 54548e50a96b387dca7525caa8a6add31420dd82a2cdBenjamin Kramer const char *LinkingOutput) const { 54558e50a96b387dca7525caa8a6add31420dd82a2cdBenjamin Kramer const Driver &D = getToolChain().getDriver(); 54568e50a96b387dca7525caa8a6add31420dd82a2cdBenjamin Kramer ArgStringList CmdArgs; 54578e50a96b387dca7525caa8a6add31420dd82a2cdBenjamin Kramer 54588ab2bdcc4f397e100c684ede8e8ca6e226e1380aJoerg Sonnenberger if (!D.SysRoot.empty()) 54598ab2bdcc4f397e100c684ede8e8ca6e226e1380aJoerg Sonnenberger CmdArgs.push_back(Args.MakeArgString("--sysroot=" + D.SysRoot)); 54608ab2bdcc4f397e100c684ede8e8ca6e226e1380aJoerg Sonnenberger 54618e50a96b387dca7525caa8a6add31420dd82a2cdBenjamin Kramer if (Args.hasArg(options::OPT_static)) { 54628e50a96b387dca7525caa8a6add31420dd82a2cdBenjamin Kramer CmdArgs.push_back("-Bstatic"); 54638e50a96b387dca7525caa8a6add31420dd82a2cdBenjamin Kramer } else { 54648e50a96b387dca7525caa8a6add31420dd82a2cdBenjamin Kramer if (Args.hasArg(options::OPT_rdynamic)) 54658e50a96b387dca7525caa8a6add31420dd82a2cdBenjamin Kramer CmdArgs.push_back("-export-dynamic"); 54668e50a96b387dca7525caa8a6add31420dd82a2cdBenjamin Kramer CmdArgs.push_back("--eh-frame-hdr"); 54678e50a96b387dca7525caa8a6add31420dd82a2cdBenjamin Kramer if (Args.hasArg(options::OPT_shared)) { 54688e50a96b387dca7525caa8a6add31420dd82a2cdBenjamin Kramer CmdArgs.push_back("-Bshareable"); 54698e50a96b387dca7525caa8a6add31420dd82a2cdBenjamin Kramer } else { 54708e50a96b387dca7525caa8a6add31420dd82a2cdBenjamin Kramer CmdArgs.push_back("-dynamic-linker"); 54718e50a96b387dca7525caa8a6add31420dd82a2cdBenjamin Kramer CmdArgs.push_back("/libexec/ld.elf_so"); 54728e50a96b387dca7525caa8a6add31420dd82a2cdBenjamin Kramer } 54738e50a96b387dca7525caa8a6add31420dd82a2cdBenjamin Kramer } 54748e50a96b387dca7525caa8a6add31420dd82a2cdBenjamin Kramer 54758e50a96b387dca7525caa8a6add31420dd82a2cdBenjamin Kramer // When building 32-bit code on NetBSD/amd64, we have to explicitly 54768e50a96b387dca7525caa8a6add31420dd82a2cdBenjamin Kramer // instruct ld in the base system to link 32-bit code. 54771bd91374498ac78e72545f08f4daa6491f9c9d14Joerg Sonnenberger if (getToolChain().getArch() == llvm::Triple::x86) { 54788e50a96b387dca7525caa8a6add31420dd82a2cdBenjamin Kramer CmdArgs.push_back("-m"); 54798e50a96b387dca7525caa8a6add31420dd82a2cdBenjamin Kramer CmdArgs.push_back("elf_i386"); 54808e50a96b387dca7525caa8a6add31420dd82a2cdBenjamin Kramer } 54818e50a96b387dca7525caa8a6add31420dd82a2cdBenjamin Kramer 54828e50a96b387dca7525caa8a6add31420dd82a2cdBenjamin Kramer if (Output.isFilename()) { 54838e50a96b387dca7525caa8a6add31420dd82a2cdBenjamin Kramer CmdArgs.push_back("-o"); 54848e50a96b387dca7525caa8a6add31420dd82a2cdBenjamin Kramer CmdArgs.push_back(Output.getFilename()); 54858e50a96b387dca7525caa8a6add31420dd82a2cdBenjamin Kramer } else { 54868e50a96b387dca7525caa8a6add31420dd82a2cdBenjamin Kramer assert(Output.isNothing() && "Invalid output."); 54878e50a96b387dca7525caa8a6add31420dd82a2cdBenjamin Kramer } 54888e50a96b387dca7525caa8a6add31420dd82a2cdBenjamin Kramer 54898e50a96b387dca7525caa8a6add31420dd82a2cdBenjamin Kramer if (!Args.hasArg(options::OPT_nostdlib) && 54908e50a96b387dca7525caa8a6add31420dd82a2cdBenjamin Kramer !Args.hasArg(options::OPT_nostartfiles)) { 54918e50a96b387dca7525caa8a6add31420dd82a2cdBenjamin Kramer if (!Args.hasArg(options::OPT_shared)) { 54928e50a96b387dca7525caa8a6add31420dd82a2cdBenjamin Kramer CmdArgs.push_back(Args.MakeArgString( 54938e50a96b387dca7525caa8a6add31420dd82a2cdBenjamin Kramer getToolChain().GetFilePath("crt0.o"))); 54948e50a96b387dca7525caa8a6add31420dd82a2cdBenjamin Kramer CmdArgs.push_back(Args.MakeArgString( 54958e50a96b387dca7525caa8a6add31420dd82a2cdBenjamin Kramer getToolChain().GetFilePath("crti.o"))); 54968e50a96b387dca7525caa8a6add31420dd82a2cdBenjamin Kramer CmdArgs.push_back(Args.MakeArgString( 54978e50a96b387dca7525caa8a6add31420dd82a2cdBenjamin Kramer getToolChain().GetFilePath("crtbegin.o"))); 54988e50a96b387dca7525caa8a6add31420dd82a2cdBenjamin Kramer } else { 54998e50a96b387dca7525caa8a6add31420dd82a2cdBenjamin Kramer CmdArgs.push_back(Args.MakeArgString( 55008e50a96b387dca7525caa8a6add31420dd82a2cdBenjamin Kramer getToolChain().GetFilePath("crti.o"))); 55018e50a96b387dca7525caa8a6add31420dd82a2cdBenjamin Kramer CmdArgs.push_back(Args.MakeArgString( 55028e50a96b387dca7525caa8a6add31420dd82a2cdBenjamin Kramer getToolChain().GetFilePath("crtbeginS.o"))); 55038e50a96b387dca7525caa8a6add31420dd82a2cdBenjamin Kramer } 55048e50a96b387dca7525caa8a6add31420dd82a2cdBenjamin Kramer } 55058e50a96b387dca7525caa8a6add31420dd82a2cdBenjamin Kramer 55068e50a96b387dca7525caa8a6add31420dd82a2cdBenjamin Kramer Args.AddAllArgs(CmdArgs, options::OPT_L); 55078e50a96b387dca7525caa8a6add31420dd82a2cdBenjamin Kramer Args.AddAllArgs(CmdArgs, options::OPT_T_Group); 55088e50a96b387dca7525caa8a6add31420dd82a2cdBenjamin Kramer Args.AddAllArgs(CmdArgs, options::OPT_e); 55098e50a96b387dca7525caa8a6add31420dd82a2cdBenjamin Kramer Args.AddAllArgs(CmdArgs, options::OPT_s); 55108e50a96b387dca7525caa8a6add31420dd82a2cdBenjamin Kramer Args.AddAllArgs(CmdArgs, options::OPT_t); 55118e50a96b387dca7525caa8a6add31420dd82a2cdBenjamin Kramer Args.AddAllArgs(CmdArgs, options::OPT_Z_Flag); 55128e50a96b387dca7525caa8a6add31420dd82a2cdBenjamin Kramer Args.AddAllArgs(CmdArgs, options::OPT_r); 55138e50a96b387dca7525caa8a6add31420dd82a2cdBenjamin Kramer 55148e50a96b387dca7525caa8a6add31420dd82a2cdBenjamin Kramer AddLinkerInputs(getToolChain(), Inputs, Args, CmdArgs); 5515008f54a54299eaafdaa940e2bdeaf55935ecd95aDaniel Dunbar 5516008f54a54299eaafdaa940e2bdeaf55935ecd95aDaniel Dunbar if (!Args.hasArg(options::OPT_nostdlib) && 5517008f54a54299eaafdaa940e2bdeaf55935ecd95aDaniel Dunbar !Args.hasArg(options::OPT_nodefaultlibs)) { 55182002263e10aa369c89008d37cada2908203fd822Daniel Dunbar if (D.CCCIsCXX) { 5519132e35d2f87895d20e7ea146c8c00404b80221a1Daniel Dunbar getToolChain().AddCXXStdlibLibArgs(Args, CmdArgs); 55202002263e10aa369c89008d37cada2908203fd822Daniel Dunbar CmdArgs.push_back("-lm"); 55212002263e10aa369c89008d37cada2908203fd822Daniel Dunbar } 5522008f54a54299eaafdaa940e2bdeaf55935ecd95aDaniel Dunbar // FIXME: For some reason GCC passes -lgcc and -lgcc_s before adding 5523008f54a54299eaafdaa940e2bdeaf55935ecd95aDaniel Dunbar // the default system libraries. Just mimic this for now. 5524008f54a54299eaafdaa940e2bdeaf55935ecd95aDaniel Dunbar if (Args.hasArg(options::OPT_static)) { 5525008f54a54299eaafdaa940e2bdeaf55935ecd95aDaniel Dunbar CmdArgs.push_back("-lgcc_eh"); 5526008f54a54299eaafdaa940e2bdeaf55935ecd95aDaniel Dunbar } else { 5527008f54a54299eaafdaa940e2bdeaf55935ecd95aDaniel Dunbar CmdArgs.push_back("--as-needed"); 5528008f54a54299eaafdaa940e2bdeaf55935ecd95aDaniel Dunbar CmdArgs.push_back("-lgcc_s"); 5529008f54a54299eaafdaa940e2bdeaf55935ecd95aDaniel Dunbar CmdArgs.push_back("--no-as-needed"); 5530008f54a54299eaafdaa940e2bdeaf55935ecd95aDaniel Dunbar } 5531db6393f259b8e634302e27d538ca4760f4221d91Joerg Sonnenberger CmdArgs.push_back("-lgcc"); 5532008f54a54299eaafdaa940e2bdeaf55935ecd95aDaniel Dunbar 5533008f54a54299eaafdaa940e2bdeaf55935ecd95aDaniel Dunbar if (Args.hasArg(options::OPT_pthread)) 5534008f54a54299eaafdaa940e2bdeaf55935ecd95aDaniel Dunbar CmdArgs.push_back("-lpthread"); 5535008f54a54299eaafdaa940e2bdeaf55935ecd95aDaniel Dunbar CmdArgs.push_back("-lc"); 5536008f54a54299eaafdaa940e2bdeaf55935ecd95aDaniel Dunbar 5537008f54a54299eaafdaa940e2bdeaf55935ecd95aDaniel Dunbar CmdArgs.push_back("-lgcc"); 5538008f54a54299eaafdaa940e2bdeaf55935ecd95aDaniel Dunbar if (Args.hasArg(options::OPT_static)) { 5539008f54a54299eaafdaa940e2bdeaf55935ecd95aDaniel Dunbar CmdArgs.push_back("-lgcc_eh"); 5540008f54a54299eaafdaa940e2bdeaf55935ecd95aDaniel Dunbar } else { 5541008f54a54299eaafdaa940e2bdeaf55935ecd95aDaniel Dunbar CmdArgs.push_back("--as-needed"); 5542008f54a54299eaafdaa940e2bdeaf55935ecd95aDaniel Dunbar CmdArgs.push_back("-lgcc_s"); 5543008f54a54299eaafdaa940e2bdeaf55935ecd95aDaniel Dunbar CmdArgs.push_back("--no-as-needed"); 5544008f54a54299eaafdaa940e2bdeaf55935ecd95aDaniel Dunbar } 5545008f54a54299eaafdaa940e2bdeaf55935ecd95aDaniel Dunbar } 5546008f54a54299eaafdaa940e2bdeaf55935ecd95aDaniel Dunbar 5547008f54a54299eaafdaa940e2bdeaf55935ecd95aDaniel Dunbar if (!Args.hasArg(options::OPT_nostdlib) && 5548008f54a54299eaafdaa940e2bdeaf55935ecd95aDaniel Dunbar !Args.hasArg(options::OPT_nostartfiles)) { 5549008f54a54299eaafdaa940e2bdeaf55935ecd95aDaniel Dunbar if (!Args.hasArg(options::OPT_shared)) 55504a7e88978cf646ad10d654020cb00b3877069210Daniel Dunbar CmdArgs.push_back(Args.MakeArgString(getToolChain().GetFilePath( 555138e317d6dce161b249508686cc67eb7176958762Chris Lattner "crtend.o"))); 5552008f54a54299eaafdaa940e2bdeaf55935ecd95aDaniel Dunbar else 55534a7e88978cf646ad10d654020cb00b3877069210Daniel Dunbar CmdArgs.push_back(Args.MakeArgString(getToolChain().GetFilePath( 555438e317d6dce161b249508686cc67eb7176958762Chris Lattner "crtendS.o"))); 55554a7e88978cf646ad10d654020cb00b3877069210Daniel Dunbar CmdArgs.push_back(Args.MakeArgString(getToolChain().GetFilePath( 555638e317d6dce161b249508686cc67eb7176958762Chris Lattner "crtn.o"))); 5557008f54a54299eaafdaa940e2bdeaf55935ecd95aDaniel Dunbar } 5558008f54a54299eaafdaa940e2bdeaf55935ecd95aDaniel Dunbar 55593f4be6fb8872942f567166ab8d99c89885f26103Bill Wendling addProfileRT(getToolChain(), Args, CmdArgs, getToolChain().getTriple()); 55602e95a6d7d0b5aed39747875d7474c27824f7319fNick Lewycky 55615adcec16cb8d9e7bebf310b6c07249dfd852346bDavid Chisnall const char *Exec = Args.MakeArgString(getToolChain().GetProgramPath("ld")); 55622fe238ed293bd4bc27af9beb9fa151fad2146fa8Daniel Dunbar C.addCommand(new Command(JA, *this, Exec, CmdArgs)); 5563008f54a54299eaafdaa940e2bdeaf55935ecd95aDaniel Dunbar} 556411e1b40d759a643086f590f6ffbd9d68360bad46Daniel Dunbar 5565ba30bbe4e36a30a274da809a11a42f9cdc168e92Rafael Espindolavoid linuxtools::Assemble::ConstructJob(Compilation &C, const JobAction &JA, 5566ba30bbe4e36a30a274da809a11a42f9cdc168e92Rafael Espindola const InputInfo &Output, 5567ba30bbe4e36a30a274da809a11a42f9cdc168e92Rafael Espindola const InputInfoList &Inputs, 5568ba30bbe4e36a30a274da809a11a42f9cdc168e92Rafael Espindola const ArgList &Args, 5569ba30bbe4e36a30a274da809a11a42f9cdc168e92Rafael Espindola const char *LinkingOutput) const { 5570ba30bbe4e36a30a274da809a11a42f9cdc168e92Rafael Espindola ArgStringList CmdArgs; 5571ba30bbe4e36a30a274da809a11a42f9cdc168e92Rafael Espindola 5572ba30bbe4e36a30a274da809a11a42f9cdc168e92Rafael Espindola // Add --32/--64 to make sure we get the format we want. 5573ba30bbe4e36a30a274da809a11a42f9cdc168e92Rafael Espindola // This is incomplete 5574ba30bbe4e36a30a274da809a11a42f9cdc168e92Rafael Espindola if (getToolChain().getArch() == llvm::Triple::x86) { 5575ba30bbe4e36a30a274da809a11a42f9cdc168e92Rafael Espindola CmdArgs.push_back("--32"); 5576ba30bbe4e36a30a274da809a11a42f9cdc168e92Rafael Espindola } else if (getToolChain().getArch() == llvm::Triple::x86_64) { 5577ba30bbe4e36a30a274da809a11a42f9cdc168e92Rafael Espindola CmdArgs.push_back("--64"); 55787972c88f674475037fa11fea718565e5bcdd61a6Eli Friedman } else if (getToolChain().getArch() == llvm::Triple::ppc) { 55797972c88f674475037fa11fea718565e5bcdd61a6Eli Friedman CmdArgs.push_back("-a32"); 55807972c88f674475037fa11fea718565e5bcdd61a6Eli Friedman CmdArgs.push_back("-mppc"); 55817972c88f674475037fa11fea718565e5bcdd61a6Eli Friedman CmdArgs.push_back("-many"); 55827972c88f674475037fa11fea718565e5bcdd61a6Eli Friedman } else if (getToolChain().getArch() == llvm::Triple::ppc64) { 55837972c88f674475037fa11fea718565e5bcdd61a6Eli Friedman CmdArgs.push_back("-a64"); 55847972c88f674475037fa11fea718565e5bcdd61a6Eli Friedman CmdArgs.push_back("-mppc64"); 55857972c88f674475037fa11fea718565e5bcdd61a6Eli Friedman CmdArgs.push_back("-many"); 5586ba30bbe4e36a30a274da809a11a42f9cdc168e92Rafael Espindola } else if (getToolChain().getArch() == llvm::Triple::arm) { 55875f9e272e632e951b1efe824cd16acb4d96077930Chris Lattner StringRef MArch = getToolChain().getArchName(); 5588ba30bbe4e36a30a274da809a11a42f9cdc168e92Rafael Espindola if (MArch == "armv7" || MArch == "armv7a" || MArch == "armv7-a") 5589ba30bbe4e36a30a274da809a11a42f9cdc168e92Rafael Espindola CmdArgs.push_back("-mfpu=neon"); 5590700c508fd469a971480c36d54ae12fe9011f27c0Evgeniy Stepanov 5591700c508fd469a971480c36d54ae12fe9011f27c0Evgeniy Stepanov StringRef ARMFloatABI = getARMFloatABI(getToolChain().getDriver(), Args, 5592700c508fd469a971480c36d54ae12fe9011f27c0Evgeniy Stepanov getToolChain().getTriple()); 5593700c508fd469a971480c36d54ae12fe9011f27c0Evgeniy Stepanov CmdArgs.push_back(Args.MakeArgString("-mfloat-abi=" + ARMFloatABI)); 5594eca187e9f20886f20bb0ea78b4f4b87a18a96b8cEvgeniy Stepanov 5595eca187e9f20886f20bb0ea78b4f4b87a18a96b8cEvgeniy Stepanov Args.AddLastArg(CmdArgs, options::OPT_march_EQ); 5596eca187e9f20886f20bb0ea78b4f4b87a18a96b8cEvgeniy Stepanov Args.AddLastArg(CmdArgs, options::OPT_mcpu_EQ); 5597eca187e9f20886f20bb0ea78b4f4b87a18a96b8cEvgeniy Stepanov Args.AddLastArg(CmdArgs, options::OPT_mfpu_EQ); 5598c85900f4d6aec17ef29140bfc97977463ac75cb2Akira Hatanaka } else if (getToolChain().getArch() == llvm::Triple::mips || 5599c85900f4d6aec17ef29140bfc97977463ac75cb2Akira Hatanaka getToolChain().getArch() == llvm::Triple::mipsel || 5600c85900f4d6aec17ef29140bfc97977463ac75cb2Akira Hatanaka getToolChain().getArch() == llvm::Triple::mips64 || 5601c85900f4d6aec17ef29140bfc97977463ac75cb2Akira Hatanaka getToolChain().getArch() == llvm::Triple::mips64el) { 5602073a780f7cb863cd382d1c966ef11d05c6fad075Simon Atanasyan StringRef CPUName; 5603073a780f7cb863cd382d1c966ef11d05c6fad075Simon Atanasyan StringRef ABIName; 5604073a780f7cb863cd382d1c966ef11d05c6fad075Simon Atanasyan getMipsCPUAndABI(Args, getToolChain(), CPUName, ABIName); 5605c85900f4d6aec17ef29140bfc97977463ac75cb2Akira Hatanaka 5606073a780f7cb863cd382d1c966ef11d05c6fad075Simon Atanasyan CmdArgs.push_back("-march"); 5607073a780f7cb863cd382d1c966ef11d05c6fad075Simon Atanasyan CmdArgs.push_back(CPUName.data()); 5608073a780f7cb863cd382d1c966ef11d05c6fad075Simon Atanasyan 5609073a780f7cb863cd382d1c966ef11d05c6fad075Simon Atanasyan CmdArgs.push_back("-mabi"); 5610e9616a4972a4c2fdc28128c057f21d7a79516c86Simon Atanasyan CmdArgs.push_back(getGnuCompatibleMipsABIName(ABIName).data()); 56115f0a1c12dacadd5a061ea5b57d51cf6798ae22a1Simon Atanasyan 56125f0a1c12dacadd5a061ea5b57d51cf6798ae22a1Simon Atanasyan if (getToolChain().getArch() == llvm::Triple::mips || 56135f0a1c12dacadd5a061ea5b57d51cf6798ae22a1Simon Atanasyan getToolChain().getArch() == llvm::Triple::mips64) 56145f0a1c12dacadd5a061ea5b57d51cf6798ae22a1Simon Atanasyan CmdArgs.push_back("-EB"); 56155f0a1c12dacadd5a061ea5b57d51cf6798ae22a1Simon Atanasyan else 56165f0a1c12dacadd5a061ea5b57d51cf6798ae22a1Simon Atanasyan CmdArgs.push_back("-EL"); 56171f0646e064c2d853d64db8585f661cacdde75c43Simon Atanasyan 56181f0646e064c2d853d64db8585f661cacdde75c43Simon Atanasyan Arg *LastPICArg = Args.getLastArg(options::OPT_fPIC, options::OPT_fno_PIC, 56191f0646e064c2d853d64db8585f661cacdde75c43Simon Atanasyan options::OPT_fpic, options::OPT_fno_pic, 56201f0646e064c2d853d64db8585f661cacdde75c43Simon Atanasyan options::OPT_fPIE, options::OPT_fno_PIE, 56211f0646e064c2d853d64db8585f661cacdde75c43Simon Atanasyan options::OPT_fpie, options::OPT_fno_pie); 56221f0646e064c2d853d64db8585f661cacdde75c43Simon Atanasyan if (LastPICArg && 56231f0646e064c2d853d64db8585f661cacdde75c43Simon Atanasyan (LastPICArg->getOption().matches(options::OPT_fPIC) || 56241f0646e064c2d853d64db8585f661cacdde75c43Simon Atanasyan LastPICArg->getOption().matches(options::OPT_fpic) || 56251f0646e064c2d853d64db8585f661cacdde75c43Simon Atanasyan LastPICArg->getOption().matches(options::OPT_fPIE) || 56261f0646e064c2d853d64db8585f661cacdde75c43Simon Atanasyan LastPICArg->getOption().matches(options::OPT_fpie))) { 56271f0646e064c2d853d64db8585f661cacdde75c43Simon Atanasyan CmdArgs.push_back("-KPIC"); 56281f0646e064c2d853d64db8585f661cacdde75c43Simon Atanasyan } 5629ba30bbe4e36a30a274da809a11a42f9cdc168e92Rafael Espindola } 5630ba30bbe4e36a30a274da809a11a42f9cdc168e92Rafael Espindola 5631ba30bbe4e36a30a274da809a11a42f9cdc168e92Rafael Espindola Args.AddAllArgValues(CmdArgs, options::OPT_Wa_COMMA, 5632ba30bbe4e36a30a274da809a11a42f9cdc168e92Rafael Espindola options::OPT_Xassembler); 5633ba30bbe4e36a30a274da809a11a42f9cdc168e92Rafael Espindola 5634ba30bbe4e36a30a274da809a11a42f9cdc168e92Rafael Espindola CmdArgs.push_back("-o"); 5635ba30bbe4e36a30a274da809a11a42f9cdc168e92Rafael Espindola CmdArgs.push_back(Output.getFilename()); 5636ba30bbe4e36a30a274da809a11a42f9cdc168e92Rafael Espindola 5637ba30bbe4e36a30a274da809a11a42f9cdc168e92Rafael Espindola for (InputInfoList::const_iterator 5638ba30bbe4e36a30a274da809a11a42f9cdc168e92Rafael Espindola it = Inputs.begin(), ie = Inputs.end(); it != ie; ++it) { 5639ba30bbe4e36a30a274da809a11a42f9cdc168e92Rafael Espindola const InputInfo &II = *it; 5640ba30bbe4e36a30a274da809a11a42f9cdc168e92Rafael Espindola CmdArgs.push_back(II.getFilename()); 5641ba30bbe4e36a30a274da809a11a42f9cdc168e92Rafael Espindola } 5642ba30bbe4e36a30a274da809a11a42f9cdc168e92Rafael Espindola 5643ba30bbe4e36a30a274da809a11a42f9cdc168e92Rafael Espindola const char *Exec = 5644ba30bbe4e36a30a274da809a11a42f9cdc168e92Rafael Espindola Args.MakeArgString(getToolChain().GetProgramPath("as")); 5645ba30bbe4e36a30a274da809a11a42f9cdc168e92Rafael Espindola C.addCommand(new Command(JA, *this, Exec, CmdArgs)); 5646ba30bbe4e36a30a274da809a11a42f9cdc168e92Rafael Espindola} 5647ba30bbe4e36a30a274da809a11a42f9cdc168e92Rafael Espindola 5648a6ddc02921d47d0a1dc9ffe4d31438f250751e05Evgeniy Stepanovstatic void AddLibgcc(llvm::Triple Triple, const Driver &D, 5649a6ddc02921d47d0a1dc9ffe4d31438f250751e05Evgeniy Stepanov ArgStringList &CmdArgs, const ArgList &Args) { 565094a7142f74bb4a9daa53c22087b19d4568073109Logan Chien bool isAndroid = Triple.getEnvironment() == llvm::Triple::Android; 565168f94dbbd20cf41af733f2036c8688894489c3fdChandler Carruth bool StaticLibgcc = Args.hasArg(options::OPT_static_libgcc) || 565268f94dbbd20cf41af733f2036c8688894489c3fdChandler Carruth Args.hasArg(options::OPT_static); 5653abf3ac7131ba8eab1a2ec99397a776fb0c75ff55Rafael Espindola if (!D.CCCIsCXX) 5654abf3ac7131ba8eab1a2ec99397a776fb0c75ff55Rafael Espindola CmdArgs.push_back("-lgcc"); 5655abf3ac7131ba8eab1a2ec99397a776fb0c75ff55Rafael Espindola 5656529a73de04a108fe74503a19d9933dbb2b1a6cf0Logan Chien if (StaticLibgcc || isAndroid) { 5657abf3ac7131ba8eab1a2ec99397a776fb0c75ff55Rafael Espindola if (D.CCCIsCXX) 5658abf3ac7131ba8eab1a2ec99397a776fb0c75ff55Rafael Espindola CmdArgs.push_back("-lgcc"); 5659abf3ac7131ba8eab1a2ec99397a776fb0c75ff55Rafael Espindola } else { 5660abf3ac7131ba8eab1a2ec99397a776fb0c75ff55Rafael Espindola if (!D.CCCIsCXX) 5661abf3ac7131ba8eab1a2ec99397a776fb0c75ff55Rafael Espindola CmdArgs.push_back("--as-needed"); 5662abf3ac7131ba8eab1a2ec99397a776fb0c75ff55Rafael Espindola CmdArgs.push_back("-lgcc_s"); 5663abf3ac7131ba8eab1a2ec99397a776fb0c75ff55Rafael Espindola if (!D.CCCIsCXX) 5664abf3ac7131ba8eab1a2ec99397a776fb0c75ff55Rafael Espindola CmdArgs.push_back("--no-as-needed"); 5665abf3ac7131ba8eab1a2ec99397a776fb0c75ff55Rafael Espindola } 5666abf3ac7131ba8eab1a2ec99397a776fb0c75ff55Rafael Espindola 5667a6ddc02921d47d0a1dc9ffe4d31438f250751e05Evgeniy Stepanov if (StaticLibgcc && !isAndroid) 5668abf3ac7131ba8eab1a2ec99397a776fb0c75ff55Rafael Espindola CmdArgs.push_back("-lgcc_eh"); 5669abf3ac7131ba8eab1a2ec99397a776fb0c75ff55Rafael Espindola else if (!Args.hasArg(options::OPT_shared) && D.CCCIsCXX) 5670abf3ac7131ba8eab1a2ec99397a776fb0c75ff55Rafael Espindola CmdArgs.push_back("-lgcc"); 5671529a73de04a108fe74503a19d9933dbb2b1a6cf0Logan Chien 5672529a73de04a108fe74503a19d9933dbb2b1a6cf0Logan Chien // According to Android ABI, we have to link with libdl if we are 5673529a73de04a108fe74503a19d9933dbb2b1a6cf0Logan Chien // linking with non-static libgcc. 5674529a73de04a108fe74503a19d9933dbb2b1a6cf0Logan Chien // 5675529a73de04a108fe74503a19d9933dbb2b1a6cf0Logan Chien // NOTE: This fixes a link error on Android MIPS as well. The non-static 5676529a73de04a108fe74503a19d9933dbb2b1a6cf0Logan Chien // libgcc for MIPS relies on _Unwind_Find_FDE and dl_iterate_phdr from libdl. 5677529a73de04a108fe74503a19d9933dbb2b1a6cf0Logan Chien if (isAndroid && !StaticLibgcc) 5678529a73de04a108fe74503a19d9933dbb2b1a6cf0Logan Chien CmdArgs.push_back("-ldl"); 5679abf3ac7131ba8eab1a2ec99397a776fb0c75ff55Rafael Espindola} 5680abf3ac7131ba8eab1a2ec99397a776fb0c75ff55Rafael Espindola 5681f4bd32957c686891cbdb7e2124630f6686343a2aSimon Atanasyanstatic bool hasMipsN32ABIArg(const ArgList &Args) { 5682f4bd32957c686891cbdb7e2124630f6686343a2aSimon Atanasyan Arg *A = Args.getLastArg(options::OPT_mabi_EQ); 56831d489cf4a04ad0ad8ac2696e4eed0995f3a67288Richard Smith return A && (A->getValue() == StringRef("n32")); 5684f4bd32957c686891cbdb7e2124630f6686343a2aSimon Atanasyan} 5685f4bd32957c686891cbdb7e2124630f6686343a2aSimon Atanasyan 5686c1da981bba867681004004b2d54ec2fdf3c08913Rafael Espindolavoid linuxtools::Link::ConstructJob(Compilation &C, const JobAction &JA, 5687c1da981bba867681004004b2d54ec2fdf3c08913Rafael Espindola const InputInfo &Output, 5688c1da981bba867681004004b2d54ec2fdf3c08913Rafael Espindola const InputInfoList &Inputs, 5689c1da981bba867681004004b2d54ec2fdf3c08913Rafael Espindola const ArgList &Args, 5690c1da981bba867681004004b2d54ec2fdf3c08913Rafael Espindola const char *LinkingOutput) const { 5691c1da981bba867681004004b2d54ec2fdf3c08913Rafael Espindola const toolchains::Linux& ToolChain = 5692c1da981bba867681004004b2d54ec2fdf3c08913Rafael Espindola static_cast<const toolchains::Linux&>(getToolChain()); 5693c1da981bba867681004004b2d54ec2fdf3c08913Rafael Espindola const Driver &D = ToolChain.getDriver(); 5694715852c9ce1a0b6afe1928d8da4d51e138aed851Rafael Espindola const bool isAndroid = 5695715852c9ce1a0b6afe1928d8da4d51e138aed851Rafael Espindola ToolChain.getTriple().getEnvironment() == llvm::Triple::Android; 5696a6ddc02921d47d0a1dc9ffe4d31438f250751e05Evgeniy Stepanov 5697c1da981bba867681004004b2d54ec2fdf3c08913Rafael Espindola ArgStringList CmdArgs; 5698c1da981bba867681004004b2d54ec2fdf3c08913Rafael Espindola 569926f14c309e8de2db8c144342808cca2e869c1777Rafael Espindola // Silence warning for "clang -g foo.o -o foo" 570026f14c309e8de2db8c144342808cca2e869c1777Rafael Espindola Args.ClaimAllArgs(options::OPT_g_Group); 57019c094fbcfaba49fc1aeca119c0e12bec59779692Rafael Espindola // and "clang -emit-llvm foo.o -o foo" 57029c094fbcfaba49fc1aeca119c0e12bec59779692Rafael Espindola Args.ClaimAllArgs(options::OPT_emit_llvm); 5703dfa210b1e1e403855557f68fe471212787b8540eDavid Chisnall // and for "clang -w foo.o -o foo". Other warning options are already 57047f6458b7e265d1870f3bd5be2b49bc4d368446b3Rafael Espindola // handled somewhere else. 57057f6458b7e265d1870f3bd5be2b49bc4d368446b3Rafael Espindola Args.ClaimAllArgs(options::OPT_w); 570626f14c309e8de2db8c144342808cca2e869c1777Rafael Espindola 57078ab2bdcc4f397e100c684ede8e8ca6e226e1380aJoerg Sonnenberger if (!D.SysRoot.empty()) 57088ab2bdcc4f397e100c684ede8e8ca6e226e1380aJoerg Sonnenberger CmdArgs.push_back(Args.MakeArgString("--sysroot=" + D.SysRoot)); 5709c1da981bba867681004004b2d54ec2fdf3c08913Rafael Espindola 571017d481fb97b304a58e45a136e3f3e2a2a22b76c8Peter Collingbourne if (Args.hasArg(options::OPT_pie) && !Args.hasArg(options::OPT_shared)) 5711fdda17179047ff0b5e28cc777dc89ebc42f083cfRafael Espindola CmdArgs.push_back("-pie"); 5712fdda17179047ff0b5e28cc777dc89ebc42f083cfRafael Espindola 5713dc1b76ddfc687c713a55cc9e3e054e9a0de1aa74Rafael Espindola if (Args.hasArg(options::OPT_rdynamic)) 5714dc1b76ddfc687c713a55cc9e3e054e9a0de1aa74Rafael Espindola CmdArgs.push_back("-export-dynamic"); 5715dc1b76ddfc687c713a55cc9e3e054e9a0de1aa74Rafael Espindola 5716e0e6d3b5cf61dfefad3c0393f4786d2cf3d9c272Rafael Espindola if (Args.hasArg(options::OPT_s)) 5717e0e6d3b5cf61dfefad3c0393f4786d2cf3d9c272Rafael Espindola CmdArgs.push_back("-s"); 5718e0e6d3b5cf61dfefad3c0393f4786d2cf3d9c272Rafael Espindola 5719c1da981bba867681004004b2d54ec2fdf3c08913Rafael Espindola for (std::vector<std::string>::const_iterator i = ToolChain.ExtraOpts.begin(), 5720c1da981bba867681004004b2d54ec2fdf3c08913Rafael Espindola e = ToolChain.ExtraOpts.end(); 5721c1da981bba867681004004b2d54ec2fdf3c08913Rafael Espindola i != e; ++i) 5722c1da981bba867681004004b2d54ec2fdf3c08913Rafael Espindola CmdArgs.push_back(i->c_str()); 5723c1da981bba867681004004b2d54ec2fdf3c08913Rafael Espindola 5724c1da981bba867681004004b2d54ec2fdf3c08913Rafael Espindola if (!Args.hasArg(options::OPT_static)) { 5725c1da981bba867681004004b2d54ec2fdf3c08913Rafael Espindola CmdArgs.push_back("--eh-frame-hdr"); 5726c1da981bba867681004004b2d54ec2fdf3c08913Rafael Espindola } 5727c1da981bba867681004004b2d54ec2fdf3c08913Rafael Espindola 5728c1da981bba867681004004b2d54ec2fdf3c08913Rafael Espindola CmdArgs.push_back("-m"); 5729c1da981bba867681004004b2d54ec2fdf3c08913Rafael Espindola if (ToolChain.getArch() == llvm::Triple::x86) 5730c1da981bba867681004004b2d54ec2fdf3c08913Rafael Espindola CmdArgs.push_back("elf_i386"); 5731c264e16a42b3f6c36521857a29ea0949d9781c22Tim Northover else if (ToolChain.getArch() == llvm::Triple::aarch64) 5732c264e16a42b3f6c36521857a29ea0949d9781c22Tim Northover CmdArgs.push_back("aarch64linux"); 573388b7cf00fcb582728c642da3927c59468efaf926Eric Christopher else if (ToolChain.getArch() == llvm::Triple::arm 5734f0594d8b64cf32c55dde7a49ba849e864446c92bDouglas Gregor || ToolChain.getArch() == llvm::Triple::thumb) 5735c1da981bba867681004004b2d54ec2fdf3c08913Rafael Espindola CmdArgs.push_back("armelf_linux_eabi"); 573643ac2978291bf1471e2c916a88c7f1c1e170dc19Ted Kremenek else if (ToolChain.getArch() == llvm::Triple::ppc) 573743ac2978291bf1471e2c916a88c7f1c1e170dc19Ted Kremenek CmdArgs.push_back("elf32ppclinux"); 573843ac2978291bf1471e2c916a88c7f1c1e170dc19Ted Kremenek else if (ToolChain.getArch() == llvm::Triple::ppc64) 573943ac2978291bf1471e2c916a88c7f1c1e170dc19Ted Kremenek CmdArgs.push_back("elf64ppc"); 57405bea4f6860543017be326e3fbe702edb2678d898Eli Friedman else if (ToolChain.getArch() == llvm::Triple::mips) 57415bea4f6860543017be326e3fbe702edb2678d898Eli Friedman CmdArgs.push_back("elf32btsmip"); 57425bea4f6860543017be326e3fbe702edb2678d898Eli Friedman else if (ToolChain.getArch() == llvm::Triple::mipsel) 57435bea4f6860543017be326e3fbe702edb2678d898Eli Friedman CmdArgs.push_back("elf32ltsmip"); 5744f4bd32957c686891cbdb7e2124630f6686343a2aSimon Atanasyan else if (ToolChain.getArch() == llvm::Triple::mips64) { 5745f4bd32957c686891cbdb7e2124630f6686343a2aSimon Atanasyan if (hasMipsN32ABIArg(Args)) 5746f4bd32957c686891cbdb7e2124630f6686343a2aSimon Atanasyan CmdArgs.push_back("elf32btsmipn32"); 5747f4bd32957c686891cbdb7e2124630f6686343a2aSimon Atanasyan else 5748f4bd32957c686891cbdb7e2124630f6686343a2aSimon Atanasyan CmdArgs.push_back("elf64btsmip"); 5749f4bd32957c686891cbdb7e2124630f6686343a2aSimon Atanasyan } 5750f4bd32957c686891cbdb7e2124630f6686343a2aSimon Atanasyan else if (ToolChain.getArch() == llvm::Triple::mips64el) { 5751f4bd32957c686891cbdb7e2124630f6686343a2aSimon Atanasyan if (hasMipsN32ABIArg(Args)) 5752f4bd32957c686891cbdb7e2124630f6686343a2aSimon Atanasyan CmdArgs.push_back("elf32ltsmipn32"); 5753f4bd32957c686891cbdb7e2124630f6686343a2aSimon Atanasyan else 5754f4bd32957c686891cbdb7e2124630f6686343a2aSimon Atanasyan CmdArgs.push_back("elf64ltsmip"); 5755f4bd32957c686891cbdb7e2124630f6686343a2aSimon Atanasyan } 5756c1da981bba867681004004b2d54ec2fdf3c08913Rafael Espindola else 5757c1da981bba867681004004b2d54ec2fdf3c08913Rafael Espindola CmdArgs.push_back("elf_x86_64"); 5758c1da981bba867681004004b2d54ec2fdf3c08913Rafael Espindola 5759c1da981bba867681004004b2d54ec2fdf3c08913Rafael Espindola if (Args.hasArg(options::OPT_static)) { 5760f0594d8b64cf32c55dde7a49ba849e864446c92bDouglas Gregor if (ToolChain.getArch() == llvm::Triple::arm 5761f0594d8b64cf32c55dde7a49ba849e864446c92bDouglas Gregor || ToolChain.getArch() == llvm::Triple::thumb) 5762c1da981bba867681004004b2d54ec2fdf3c08913Rafael Espindola CmdArgs.push_back("-Bstatic"); 5763c1da981bba867681004004b2d54ec2fdf3c08913Rafael Espindola else 5764c1da981bba867681004004b2d54ec2fdf3c08913Rafael Espindola CmdArgs.push_back("-static"); 5765c1da981bba867681004004b2d54ec2fdf3c08913Rafael Espindola } else if (Args.hasArg(options::OPT_shared)) { 5766c1da981bba867681004004b2d54ec2fdf3c08913Rafael Espindola CmdArgs.push_back("-shared"); 5767715852c9ce1a0b6afe1928d8da4d51e138aed851Rafael Espindola if (isAndroid) { 5768a6ddc02921d47d0a1dc9ffe4d31438f250751e05Evgeniy Stepanov CmdArgs.push_back("-Bsymbolic"); 5769a6ddc02921d47d0a1dc9ffe4d31438f250751e05Evgeniy Stepanov } 5770c1da981bba867681004004b2d54ec2fdf3c08913Rafael Espindola } 5771c1da981bba867681004004b2d54ec2fdf3c08913Rafael Espindola 5772c1da981bba867681004004b2d54ec2fdf3c08913Rafael Espindola if (ToolChain.getArch() == llvm::Triple::arm || 5773f0594d8b64cf32c55dde7a49ba849e864446c92bDouglas Gregor ToolChain.getArch() == llvm::Triple::thumb || 5774c1da981bba867681004004b2d54ec2fdf3c08913Rafael Espindola (!Args.hasArg(options::OPT_static) && 5775c1da981bba867681004004b2d54ec2fdf3c08913Rafael Espindola !Args.hasArg(options::OPT_shared))) { 5776c1da981bba867681004004b2d54ec2fdf3c08913Rafael Espindola CmdArgs.push_back("-dynamic-linker"); 5777a6ddc02921d47d0a1dc9ffe4d31438f250751e05Evgeniy Stepanov if (isAndroid) 5778a6ddc02921d47d0a1dc9ffe4d31438f250751e05Evgeniy Stepanov CmdArgs.push_back("/system/bin/linker"); 5779a6ddc02921d47d0a1dc9ffe4d31438f250751e05Evgeniy Stepanov else if (ToolChain.getArch() == llvm::Triple::x86) 5780c1da981bba867681004004b2d54ec2fdf3c08913Rafael Espindola CmdArgs.push_back("/lib/ld-linux.so.2"); 5781c264e16a42b3f6c36521857a29ea0949d9781c22Tim Northover else if (ToolChain.getArch() == llvm::Triple::aarch64) 5782c264e16a42b3f6c36521857a29ea0949d9781c22Tim Northover CmdArgs.push_back("/lib/ld-linux-aarch64.so.1"); 5783f0594d8b64cf32c55dde7a49ba849e864446c92bDouglas Gregor else if (ToolChain.getArch() == llvm::Triple::arm || 57846cc9dc8403c4a8838f4f932e43402090cfe70d98Jiangning Liu ToolChain.getArch() == llvm::Triple::thumb) { 57856cc9dc8403c4a8838f4f932e43402090cfe70d98Jiangning Liu if (ToolChain.getTriple().getEnvironment() == llvm::Triple::GNUEABIHF) 57866cc9dc8403c4a8838f4f932e43402090cfe70d98Jiangning Liu CmdArgs.push_back("/lib/ld-linux-armhf.so.3"); 57876cc9dc8403c4a8838f4f932e43402090cfe70d98Jiangning Liu else 57886cc9dc8403c4a8838f4f932e43402090cfe70d98Jiangning Liu CmdArgs.push_back("/lib/ld-linux.so.3"); 57896cc9dc8403c4a8838f4f932e43402090cfe70d98Jiangning Liu } 57905bea4f6860543017be326e3fbe702edb2678d898Eli Friedman else if (ToolChain.getArch() == llvm::Triple::mips || 57915bea4f6860543017be326e3fbe702edb2678d898Eli Friedman ToolChain.getArch() == llvm::Triple::mipsel) 57925bea4f6860543017be326e3fbe702edb2678d898Eli Friedman CmdArgs.push_back("/lib/ld.so.1"); 57938491cb245f7fccfb049f860444467130f68189d3Simon Atanasyan else if (ToolChain.getArch() == llvm::Triple::mips64 || 5794f4bd32957c686891cbdb7e2124630f6686343a2aSimon Atanasyan ToolChain.getArch() == llvm::Triple::mips64el) { 5795f4bd32957c686891cbdb7e2124630f6686343a2aSimon Atanasyan if (hasMipsN32ABIArg(Args)) 5796f4bd32957c686891cbdb7e2124630f6686343a2aSimon Atanasyan CmdArgs.push_back("/lib32/ld.so.1"); 5797f4bd32957c686891cbdb7e2124630f6686343a2aSimon Atanasyan else 5798f4bd32957c686891cbdb7e2124630f6686343a2aSimon Atanasyan CmdArgs.push_back("/lib64/ld.so.1"); 5799f4bd32957c686891cbdb7e2124630f6686343a2aSimon Atanasyan } 580043ac2978291bf1471e2c916a88c7f1c1e170dc19Ted Kremenek else if (ToolChain.getArch() == llvm::Triple::ppc) 580109f43ed8a1be67360fde9b335eac60bac8db8e19Chris Lattner CmdArgs.push_back("/lib/ld.so.1"); 580243ac2978291bf1471e2c916a88c7f1c1e170dc19Ted Kremenek else if (ToolChain.getArch() == llvm::Triple::ppc64) 580309f43ed8a1be67360fde9b335eac60bac8db8e19Chris Lattner CmdArgs.push_back("/lib64/ld64.so.1"); 5804c1da981bba867681004004b2d54ec2fdf3c08913Rafael Espindola else 5805c1da981bba867681004004b2d54ec2fdf3c08913Rafael Espindola CmdArgs.push_back("/lib64/ld-linux-x86-64.so.2"); 5806c1da981bba867681004004b2d54ec2fdf3c08913Rafael Espindola } 5807c1da981bba867681004004b2d54ec2fdf3c08913Rafael Espindola 5808c1da981bba867681004004b2d54ec2fdf3c08913Rafael Espindola CmdArgs.push_back("-o"); 5809c1da981bba867681004004b2d54ec2fdf3c08913Rafael Espindola CmdArgs.push_back(Output.getFilename()); 5810c1da981bba867681004004b2d54ec2fdf3c08913Rafael Espindola 581149c64fdcf354c7998b8b301402fb6140c24df36aRafael Espindola if (!Args.hasArg(options::OPT_nostdlib) && 581249c64fdcf354c7998b8b301402fb6140c24df36aRafael Espindola !Args.hasArg(options::OPT_nostartfiles)) { 5813a6ddc02921d47d0a1dc9ffe4d31438f250751e05Evgeniy Stepanov if (!isAndroid) { 5814a6ddc02921d47d0a1dc9ffe4d31438f250751e05Evgeniy Stepanov const char *crt1 = NULL; 5815a6ddc02921d47d0a1dc9ffe4d31438f250751e05Evgeniy Stepanov if (!Args.hasArg(options::OPT_shared)){ 5816a6ddc02921d47d0a1dc9ffe4d31438f250751e05Evgeniy Stepanov if (Args.hasArg(options::OPT_pie)) 5817a6ddc02921d47d0a1dc9ffe4d31438f250751e05Evgeniy Stepanov crt1 = "Scrt1.o"; 5818a6ddc02921d47d0a1dc9ffe4d31438f250751e05Evgeniy Stepanov else 5819a6ddc02921d47d0a1dc9ffe4d31438f250751e05Evgeniy Stepanov crt1 = "crt1.o"; 5820a6ddc02921d47d0a1dc9ffe4d31438f250751e05Evgeniy Stepanov } 5821a6ddc02921d47d0a1dc9ffe4d31438f250751e05Evgeniy Stepanov if (crt1) 5822a6ddc02921d47d0a1dc9ffe4d31438f250751e05Evgeniy Stepanov CmdArgs.push_back(Args.MakeArgString(ToolChain.GetFilePath(crt1))); 5823c1da981bba867681004004b2d54ec2fdf3c08913Rafael Espindola 5824a6ddc02921d47d0a1dc9ffe4d31438f250751e05Evgeniy Stepanov CmdArgs.push_back(Args.MakeArgString(ToolChain.GetFilePath("crti.o"))); 5825a6ddc02921d47d0a1dc9ffe4d31438f250751e05Evgeniy Stepanov } 5826c1da981bba867681004004b2d54ec2fdf3c08913Rafael Espindola 582789414b384a0004c698244cc675f49d0669bb3463Rafael Espindola const char *crtbegin; 582889414b384a0004c698244cc675f49d0669bb3463Rafael Espindola if (Args.hasArg(options::OPT_static)) 5829a6ddc02921d47d0a1dc9ffe4d31438f250751e05Evgeniy Stepanov crtbegin = isAndroid ? "crtbegin_static.o" : "crtbeginT.o"; 5830a92983d236c88c942c283a1ee98003b2d5b56ea5Evgeniy Stepanov else if (Args.hasArg(options::OPT_shared)) 5831a6ddc02921d47d0a1dc9ffe4d31438f250751e05Evgeniy Stepanov crtbegin = isAndroid ? "crtbegin_so.o" : "crtbeginS.o"; 5832a92983d236c88c942c283a1ee98003b2d5b56ea5Evgeniy Stepanov else if (Args.hasArg(options::OPT_pie)) 5833a92983d236c88c942c283a1ee98003b2d5b56ea5Evgeniy Stepanov crtbegin = isAndroid ? "crtbegin_dynamic.o" : "crtbeginS.o"; 583489414b384a0004c698244cc675f49d0669bb3463Rafael Espindola else 5835a6ddc02921d47d0a1dc9ffe4d31438f250751e05Evgeniy Stepanov crtbegin = isAndroid ? "crtbegin_dynamic.o" : "crtbegin.o"; 583689414b384a0004c698244cc675f49d0669bb3463Rafael Espindola CmdArgs.push_back(Args.MakeArgString(ToolChain.GetFilePath(crtbegin))); 5837e20e508aecf413f84b0dc4928cbf4bb5ce6c5bdcBenjamin Kramer 5838e20e508aecf413f84b0dc4928cbf4bb5ce6c5bdcBenjamin Kramer // Add crtfastmath.o if available and fast math is enabled. 5839e20e508aecf413f84b0dc4928cbf4bb5ce6c5bdcBenjamin Kramer ToolChain.AddFastMathRuntimeIfAvailable(Args, CmdArgs); 584089414b384a0004c698244cc675f49d0669bb3463Rafael Espindola } 5841c1da981bba867681004004b2d54ec2fdf3c08913Rafael Espindola 5842c1da981bba867681004004b2d54ec2fdf3c08913Rafael Espindola Args.AddAllArgs(CmdArgs, options::OPT_L); 5843c1da981bba867681004004b2d54ec2fdf3c08913Rafael Espindola 5844c1da981bba867681004004b2d54ec2fdf3c08913Rafael Espindola const ToolChain::path_list Paths = ToolChain.getFilePaths(); 5845c1da981bba867681004004b2d54ec2fdf3c08913Rafael Espindola 584658e5ac9d41d8186bea92e892d572e2eea28d3f9cRoman Divacky for (ToolChain::path_list::const_iterator i = Paths.begin(), e = Paths.end(); 584758e5ac9d41d8186bea92e892d572e2eea28d3f9cRoman Divacky i != e; ++i) 58485f9e272e632e951b1efe824cd16acb4d96077930Chris Lattner CmdArgs.push_back(Args.MakeArgString(StringRef("-L") + *i)); 5849c1da981bba867681004004b2d54ec2fdf3c08913Rafael Espindola 5850c5151543236bd213b8595a079cf9b1d26de4eeb1Rafael Espindola // Tell the linker to load the plugin. This has to come before AddLinkerInputs 5851c5151543236bd213b8595a079cf9b1d26de4eeb1Rafael Espindola // as gold requires -plugin to come before any -plugin-opt that -Wl might 5852c5151543236bd213b8595a079cf9b1d26de4eeb1Rafael Espindola // forward. 5853c5151543236bd213b8595a079cf9b1d26de4eeb1Rafael Espindola if (D.IsUsingLTO(Args) || Args.hasArg(options::OPT_use_gold_plugin)) { 5854c5151543236bd213b8595a079cf9b1d26de4eeb1Rafael Espindola CmdArgs.push_back("-plugin"); 5855c5151543236bd213b8595a079cf9b1d26de4eeb1Rafael Espindola std::string Plugin = ToolChain.getDriver().Dir + "/../lib/LLVMgold.so"; 5856c5151543236bd213b8595a079cf9b1d26de4eeb1Rafael Espindola CmdArgs.push_back(Args.MakeArgString(Plugin)); 5857700d4e44793697288dd827c272ad363945f590a9Chandler Carruth 5858700d4e44793697288dd827c272ad363945f590a9Chandler Carruth // Try to pass driver level flags relevant to LTO code generation down to 5859700d4e44793697288dd827c272ad363945f590a9Chandler Carruth // the plugin. 5860700d4e44793697288dd827c272ad363945f590a9Chandler Carruth 5861700d4e44793697288dd827c272ad363945f590a9Chandler Carruth // Handle architecture-specific flags for selecting CPU variants. 5862700d4e44793697288dd827c272ad363945f590a9Chandler Carruth if (ToolChain.getArch() == llvm::Triple::x86 || 5863700d4e44793697288dd827c272ad363945f590a9Chandler Carruth ToolChain.getArch() == llvm::Triple::x86_64) 5864700d4e44793697288dd827c272ad363945f590a9Chandler Carruth CmdArgs.push_back( 5865700d4e44793697288dd827c272ad363945f590a9Chandler Carruth Args.MakeArgString(Twine("-plugin-opt=mcpu=") + 5866700d4e44793697288dd827c272ad363945f590a9Chandler Carruth getX86TargetCPU(Args, ToolChain.getTriple()))); 5867700d4e44793697288dd827c272ad363945f590a9Chandler Carruth else if (ToolChain.getArch() == llvm::Triple::arm || 5868700d4e44793697288dd827c272ad363945f590a9Chandler Carruth ToolChain.getArch() == llvm::Triple::thumb) 5869700d4e44793697288dd827c272ad363945f590a9Chandler Carruth CmdArgs.push_back( 5870700d4e44793697288dd827c272ad363945f590a9Chandler Carruth Args.MakeArgString(Twine("-plugin-opt=mcpu=") + 5871700d4e44793697288dd827c272ad363945f590a9Chandler Carruth getARMTargetCPU(Args, ToolChain.getTriple()))); 5872700d4e44793697288dd827c272ad363945f590a9Chandler Carruth 5873700d4e44793697288dd827c272ad363945f590a9Chandler Carruth // FIXME: Factor out logic for MIPS, PPC, and other targets to support this 5874700d4e44793697288dd827c272ad363945f590a9Chandler Carruth // as well. 5875c5151543236bd213b8595a079cf9b1d26de4eeb1Rafael Espindola } 5876c5151543236bd213b8595a079cf9b1d26de4eeb1Rafael Espindola 5877700d4e44793697288dd827c272ad363945f590a9Chandler Carruth 5878e276cfc4e30dd3d85e3904ee270e85d5d0e309adNick Lewycky if (Args.hasArg(options::OPT_Z_Xlinker__no_demangle)) 5879e276cfc4e30dd3d85e3904ee270e85d5d0e309adNick Lewycky CmdArgs.push_back("--no-demangle"); 5880e276cfc4e30dd3d85e3904ee270e85d5d0e309adNick Lewycky 5881c1da981bba867681004004b2d54ec2fdf3c08913Rafael Espindola AddLinkerInputs(ToolChain, Inputs, Args, CmdArgs); 5882c1da981bba867681004004b2d54ec2fdf3c08913Rafael Espindola 5883bb1071c0568db9bd7934e869a53d671632eb9291Alexey Samsonov SanitizerArgs Sanitize(D, Args); 5884c4dabadb51475e76b606024f144e7cf93b0bad00Richard Smith 58856716d9443d5d13f4f49a39b9d02f2e256cb83a97Eric Christopher // Call these before we add the C++ ABI library. 5886c4dabadb51475e76b606024f144e7cf93b0bad00Richard Smith if (Sanitize.needsUbsanRt()) 5887c4dabadb51475e76b606024f144e7cf93b0bad00Richard Smith addUbsanRTLinux(getToolChain(), Args, CmdArgs); 58886716d9443d5d13f4f49a39b9d02f2e256cb83a97Eric Christopher if (Sanitize.needsAsanRt()) 58896716d9443d5d13f4f49a39b9d02f2e256cb83a97Eric Christopher addAsanRTLinux(getToolChain(), Args, CmdArgs); 58906716d9443d5d13f4f49a39b9d02f2e256cb83a97Eric Christopher if (Sanitize.needsTsanRt()) 58916716d9443d5d13f4f49a39b9d02f2e256cb83a97Eric Christopher addTsanRTLinux(getToolChain(), Args, CmdArgs); 589209ccf39c13cfca102deea2986f45cb908bc232fdEvgeniy Stepanov if (Sanitize.needsMsanRt()) 589309ccf39c13cfca102deea2986f45cb908bc232fdEvgeniy Stepanov addMsanRTLinux(getToolChain(), Args, CmdArgs); 58948e1cee6f23e2552b96b81e5ef419ab3f69c5b5c2Richard Smith 58952ba542c741c39691940f5d1de0bc88c22f46c430Chandler Carruth if (D.CCCIsCXX && 58962ba542c741c39691940f5d1de0bc88c22f46c430Chandler Carruth !Args.hasArg(options::OPT_nostdlib) && 58972ba542c741c39691940f5d1de0bc88c22f46c430Chandler Carruth !Args.hasArg(options::OPT_nodefaultlibs)) { 589819706f8e702c04d19bc1ace504cbb9df008b6daaRafael Espindola bool OnlyLibstdcxxStatic = Args.hasArg(options::OPT_static_libstdcxx) && 589919706f8e702c04d19bc1ace504cbb9df008b6daaRafael Espindola !Args.hasArg(options::OPT_static); 590019706f8e702c04d19bc1ace504cbb9df008b6daaRafael Espindola if (OnlyLibstdcxxStatic) 590119706f8e702c04d19bc1ace504cbb9df008b6daaRafael Espindola CmdArgs.push_back("-Bstatic"); 5902c1da981bba867681004004b2d54ec2fdf3c08913Rafael Espindola ToolChain.AddCXXStdlibLibArgs(Args, CmdArgs); 590319706f8e702c04d19bc1ace504cbb9df008b6daaRafael Espindola if (OnlyLibstdcxxStatic) 590419706f8e702c04d19bc1ace504cbb9df008b6daaRafael Espindola CmdArgs.push_back("-Bdynamic"); 5905c1da981bba867681004004b2d54ec2fdf3c08913Rafael Espindola CmdArgs.push_back("-lm"); 5906c1da981bba867681004004b2d54ec2fdf3c08913Rafael Espindola } 5907c1da981bba867681004004b2d54ec2fdf3c08913Rafael Espindola 590889414b384a0004c698244cc675f49d0669bb3463Rafael Espindola if (!Args.hasArg(options::OPT_nostdlib)) { 59092ba542c741c39691940f5d1de0bc88c22f46c430Chandler Carruth if (!Args.hasArg(options::OPT_nodefaultlibs)) { 59102ba542c741c39691940f5d1de0bc88c22f46c430Chandler Carruth if (Args.hasArg(options::OPT_static)) 59112ba542c741c39691940f5d1de0bc88c22f46c430Chandler Carruth CmdArgs.push_back("--start-group"); 5912e0e6d3b5cf61dfefad3c0393f4786d2cf3d9c272Rafael Espindola 5913df96e022e95b8540c51e1bdaed03f66d851c6f93Chandler Carruth bool OpenMP = Args.hasArg(options::OPT_fopenmp); 5914df96e022e95b8540c51e1bdaed03f66d851c6f93Chandler Carruth if (OpenMP) { 5915df96e022e95b8540c51e1bdaed03f66d851c6f93Chandler Carruth CmdArgs.push_back("-lgomp"); 5916df96e022e95b8540c51e1bdaed03f66d851c6f93Chandler Carruth 5917df96e022e95b8540c51e1bdaed03f66d851c6f93Chandler Carruth // FIXME: Exclude this for platforms whith libgomp that doesn't require 5918df96e022e95b8540c51e1bdaed03f66d851c6f93Chandler Carruth // librt. Most modern Linux platfroms require it, but some may not. 5919df96e022e95b8540c51e1bdaed03f66d851c6f93Chandler Carruth CmdArgs.push_back("-lrt"); 5920df96e022e95b8540c51e1bdaed03f66d851c6f93Chandler Carruth } 5921df96e022e95b8540c51e1bdaed03f66d851c6f93Chandler Carruth 59222ba542c741c39691940f5d1de0bc88c22f46c430Chandler Carruth AddLibgcc(ToolChain.getTriple(), D, CmdArgs, Args); 5923c1da981bba867681004004b2d54ec2fdf3c08913Rafael Espindola 59242ba542c741c39691940f5d1de0bc88c22f46c430Chandler Carruth if (Args.hasArg(options::OPT_pthread) || 5925df96e022e95b8540c51e1bdaed03f66d851c6f93Chandler Carruth Args.hasArg(options::OPT_pthreads) || OpenMP) 59262ba542c741c39691940f5d1de0bc88c22f46c430Chandler Carruth CmdArgs.push_back("-lpthread"); 5927c1da981bba867681004004b2d54ec2fdf3c08913Rafael Espindola 59282ba542c741c39691940f5d1de0bc88c22f46c430Chandler Carruth CmdArgs.push_back("-lc"); 5929c1da981bba867681004004b2d54ec2fdf3c08913Rafael Espindola 59302ba542c741c39691940f5d1de0bc88c22f46c430Chandler Carruth if (Args.hasArg(options::OPT_static)) 59312ba542c741c39691940f5d1de0bc88c22f46c430Chandler Carruth CmdArgs.push_back("--end-group"); 59322ba542c741c39691940f5d1de0bc88c22f46c430Chandler Carruth else 59332ba542c741c39691940f5d1de0bc88c22f46c430Chandler Carruth AddLibgcc(ToolChain.getTriple(), D, CmdArgs, Args); 59342ba542c741c39691940f5d1de0bc88c22f46c430Chandler Carruth } 5935fdda17179047ff0b5e28cc777dc89ebc42f083cfRafael Espindola 593649c64fdcf354c7998b8b301402fb6140c24df36aRafael Espindola if (!Args.hasArg(options::OPT_nostartfiles)) { 593749c64fdcf354c7998b8b301402fb6140c24df36aRafael Espindola const char *crtend; 5938a92983d236c88c942c283a1ee98003b2d5b56ea5Evgeniy Stepanov if (Args.hasArg(options::OPT_shared)) 5939a6ddc02921d47d0a1dc9ffe4d31438f250751e05Evgeniy Stepanov crtend = isAndroid ? "crtend_so.o" : "crtendS.o"; 5940a92983d236c88c942c283a1ee98003b2d5b56ea5Evgeniy Stepanov else if (Args.hasArg(options::OPT_pie)) 5941a92983d236c88c942c283a1ee98003b2d5b56ea5Evgeniy Stepanov crtend = isAndroid ? "crtend_android.o" : "crtendS.o"; 594249c64fdcf354c7998b8b301402fb6140c24df36aRafael Espindola else 5943a6ddc02921d47d0a1dc9ffe4d31438f250751e05Evgeniy Stepanov crtend = isAndroid ? "crtend_android.o" : "crtend.o"; 594489414b384a0004c698244cc675f49d0669bb3463Rafael Espindola 594549c64fdcf354c7998b8b301402fb6140c24df36aRafael Espindola CmdArgs.push_back(Args.MakeArgString(ToolChain.GetFilePath(crtend))); 5946a6ddc02921d47d0a1dc9ffe4d31438f250751e05Evgeniy Stepanov if (!isAndroid) 5947a6ddc02921d47d0a1dc9ffe4d31438f250751e05Evgeniy Stepanov CmdArgs.push_back(Args.MakeArgString(ToolChain.GetFilePath("crtn.o"))); 594849c64fdcf354c7998b8b301402fb6140c24df36aRafael Espindola } 594989414b384a0004c698244cc675f49d0669bb3463Rafael Espindola } 5950c1da981bba867681004004b2d54ec2fdf3c08913Rafael Espindola 59513f4be6fb8872942f567166ab8d99c89885f26103Bill Wendling addProfileRT(getToolChain(), Args, CmdArgs, getToolChain().getTriple()); 59522e95a6d7d0b5aed39747875d7474c27824f7319fNick Lewycky 5953c1da981bba867681004004b2d54ec2fdf3c08913Rafael Espindola C.addCommand(new Command(JA, *this, ToolChain.Linker.c_str(), CmdArgs)); 5954c1da981bba867681004004b2d54ec2fdf3c08913Rafael Espindola} 5955ba30bbe4e36a30a274da809a11a42f9cdc168e92Rafael Espindola 595638e317d6dce161b249508686cc67eb7176958762Chris Lattnervoid minix::Assemble::ConstructJob(Compilation &C, const JobAction &JA, 59572fe238ed293bd4bc27af9beb9fa151fad2146fa8Daniel Dunbar const InputInfo &Output, 59582fe238ed293bd4bc27af9beb9fa151fad2146fa8Daniel Dunbar const InputInfoList &Inputs, 59592fe238ed293bd4bc27af9beb9fa151fad2146fa8Daniel Dunbar const ArgList &Args, 59602fe238ed293bd4bc27af9beb9fa151fad2146fa8Daniel Dunbar const char *LinkingOutput) const { 596138e317d6dce161b249508686cc67eb7176958762Chris Lattner ArgStringList CmdArgs; 596238e317d6dce161b249508686cc67eb7176958762Chris Lattner 596338e317d6dce161b249508686cc67eb7176958762Chris Lattner Args.AddAllArgValues(CmdArgs, options::OPT_Wa_COMMA, 596438e317d6dce161b249508686cc67eb7176958762Chris Lattner options::OPT_Xassembler); 596538e317d6dce161b249508686cc67eb7176958762Chris Lattner 596638e317d6dce161b249508686cc67eb7176958762Chris Lattner CmdArgs.push_back("-o"); 59677c1e46533cae07216e2a67d5636a5afb44253155Daniel Dunbar CmdArgs.push_back(Output.getFilename()); 596838e317d6dce161b249508686cc67eb7176958762Chris Lattner 596938e317d6dce161b249508686cc67eb7176958762Chris Lattner for (InputInfoList::const_iterator 597038e317d6dce161b249508686cc67eb7176958762Chris Lattner it = Inputs.begin(), ie = Inputs.end(); it != ie; ++it) { 597138e317d6dce161b249508686cc67eb7176958762Chris Lattner const InputInfo &II = *it; 59727c1e46533cae07216e2a67d5636a5afb44253155Daniel Dunbar CmdArgs.push_back(II.getFilename()); 597338e317d6dce161b249508686cc67eb7176958762Chris Lattner } 597438e317d6dce161b249508686cc67eb7176958762Chris Lattner 597538e317d6dce161b249508686cc67eb7176958762Chris Lattner const char *Exec = 59766d402dc963aa32194f3604af4463b113858291aeEli Friedman Args.MakeArgString(getToolChain().GetProgramPath("as")); 59772fe238ed293bd4bc27af9beb9fa151fad2146fa8Daniel Dunbar C.addCommand(new Command(JA, *this, Exec, CmdArgs)); 597838e317d6dce161b249508686cc67eb7176958762Chris Lattner} 597938e317d6dce161b249508686cc67eb7176958762Chris Lattner 598038e317d6dce161b249508686cc67eb7176958762Chris Lattnervoid minix::Link::ConstructJob(Compilation &C, const JobAction &JA, 59812fe238ed293bd4bc27af9beb9fa151fad2146fa8Daniel Dunbar const InputInfo &Output, 59822fe238ed293bd4bc27af9beb9fa151fad2146fa8Daniel Dunbar const InputInfoList &Inputs, 59832fe238ed293bd4bc27af9beb9fa151fad2146fa8Daniel Dunbar const ArgList &Args, 59842fe238ed293bd4bc27af9beb9fa151fad2146fa8Daniel Dunbar const char *LinkingOutput) const { 598538e317d6dce161b249508686cc67eb7176958762Chris Lattner const Driver &D = getToolChain().getDriver(); 598638e317d6dce161b249508686cc67eb7176958762Chris Lattner ArgStringList CmdArgs; 598738e317d6dce161b249508686cc67eb7176958762Chris Lattner 59887c1e46533cae07216e2a67d5636a5afb44253155Daniel Dunbar if (Output.isFilename()) { 598938e317d6dce161b249508686cc67eb7176958762Chris Lattner CmdArgs.push_back("-o"); 599038e317d6dce161b249508686cc67eb7176958762Chris Lattner CmdArgs.push_back(Output.getFilename()); 599138e317d6dce161b249508686cc67eb7176958762Chris Lattner } else { 599238e317d6dce161b249508686cc67eb7176958762Chris Lattner assert(Output.isNothing() && "Invalid output."); 599338e317d6dce161b249508686cc67eb7176958762Chris Lattner } 599438e317d6dce161b249508686cc67eb7176958762Chris Lattner 599538e317d6dce161b249508686cc67eb7176958762Chris Lattner if (!Args.hasArg(options::OPT_nostdlib) && 59966d402dc963aa32194f3604af4463b113858291aeEli Friedman !Args.hasArg(options::OPT_nostartfiles)) { 59976d402dc963aa32194f3604af4463b113858291aeEli Friedman CmdArgs.push_back(Args.MakeArgString(getToolChain().GetFilePath("crt1.o"))); 59986d402dc963aa32194f3604af4463b113858291aeEli Friedman CmdArgs.push_back(Args.MakeArgString(getToolChain().GetFilePath("crti.o"))); 59996d402dc963aa32194f3604af4463b113858291aeEli Friedman CmdArgs.push_back(Args.MakeArgString(getToolChain().GetFilePath("crtbegin.o"))); 60006d402dc963aa32194f3604af4463b113858291aeEli Friedman CmdArgs.push_back(Args.MakeArgString(getToolChain().GetFilePath("crtn.o"))); 60016d402dc963aa32194f3604af4463b113858291aeEli Friedman } 600238e317d6dce161b249508686cc67eb7176958762Chris Lattner 600338e317d6dce161b249508686cc67eb7176958762Chris Lattner Args.AddAllArgs(CmdArgs, options::OPT_L); 600438e317d6dce161b249508686cc67eb7176958762Chris Lattner Args.AddAllArgs(CmdArgs, options::OPT_T_Group); 600538e317d6dce161b249508686cc67eb7176958762Chris Lattner Args.AddAllArgs(CmdArgs, options::OPT_e); 600638e317d6dce161b249508686cc67eb7176958762Chris Lattner 60072008feead855f08500fb01ff43ef5eebee05d1e5Daniel Dunbar AddLinkerInputs(getToolChain(), Inputs, Args, CmdArgs); 600838e317d6dce161b249508686cc67eb7176958762Chris Lattner 60096d402dc963aa32194f3604af4463b113858291aeEli Friedman addProfileRT(getToolChain(), Args, CmdArgs, getToolChain().getTriple()); 60106d402dc963aa32194f3604af4463b113858291aeEli Friedman 601138e317d6dce161b249508686cc67eb7176958762Chris Lattner if (!Args.hasArg(options::OPT_nostdlib) && 601238e317d6dce161b249508686cc67eb7176958762Chris Lattner !Args.hasArg(options::OPT_nodefaultlibs)) { 601338e317d6dce161b249508686cc67eb7176958762Chris Lattner if (D.CCCIsCXX) { 6014132e35d2f87895d20e7ea146c8c00404b80221a1Daniel Dunbar getToolChain().AddCXXStdlibLibArgs(Args, CmdArgs); 601538e317d6dce161b249508686cc67eb7176958762Chris Lattner CmdArgs.push_back("-lm"); 601638e317d6dce161b249508686cc67eb7176958762Chris Lattner } 601738e317d6dce161b249508686cc67eb7176958762Chris Lattner } 601838e317d6dce161b249508686cc67eb7176958762Chris Lattner 601938e317d6dce161b249508686cc67eb7176958762Chris Lattner if (!Args.hasArg(options::OPT_nostdlib) && 602038e317d6dce161b249508686cc67eb7176958762Chris Lattner !Args.hasArg(options::OPT_nostartfiles)) { 60216d402dc963aa32194f3604af4463b113858291aeEli Friedman if (Args.hasArg(options::OPT_pthread)) 60226d402dc963aa32194f3604af4463b113858291aeEli Friedman CmdArgs.push_back("-lpthread"); 60236d402dc963aa32194f3604af4463b113858291aeEli Friedman CmdArgs.push_back("-lc"); 60246d402dc963aa32194f3604af4463b113858291aeEli Friedman CmdArgs.push_back("-lCompilerRT-Generic"); 60256d402dc963aa32194f3604af4463b113858291aeEli Friedman CmdArgs.push_back("-L/usr/pkg/compiler-rt/lib"); 60266d402dc963aa32194f3604af4463b113858291aeEli Friedman CmdArgs.push_back( 602727e2b983beb8b5a29869639637327725623069a8Eric Christopher Args.MakeArgString(getToolChain().GetFilePath("crtend.o"))); 602838e317d6dce161b249508686cc67eb7176958762Chris Lattner } 602938e317d6dce161b249508686cc67eb7176958762Chris Lattner 60306d402dc963aa32194f3604af4463b113858291aeEli Friedman const char *Exec = Args.MakeArgString(getToolChain().GetProgramPath("ld")); 60312fe238ed293bd4bc27af9beb9fa151fad2146fa8Daniel Dunbar C.addCommand(new Command(JA, *this, Exec, CmdArgs)); 603238e317d6dce161b249508686cc67eb7176958762Chris Lattner} 603338e317d6dce161b249508686cc67eb7176958762Chris Lattner 603411e1b40d759a643086f590f6ffbd9d68360bad46Daniel Dunbar/// DragonFly Tools 603511e1b40d759a643086f590f6ffbd9d68360bad46Daniel Dunbar 603611e1b40d759a643086f590f6ffbd9d68360bad46Daniel Dunbar// For now, DragonFly Assemble does just about the same as for 603711e1b40d759a643086f590f6ffbd9d68360bad46Daniel Dunbar// FreeBSD, but this may change soon. 603811e1b40d759a643086f590f6ffbd9d68360bad46Daniel Dunbarvoid dragonfly::Assemble::ConstructJob(Compilation &C, const JobAction &JA, 60392fe238ed293bd4bc27af9beb9fa151fad2146fa8Daniel Dunbar const InputInfo &Output, 6040294691eb1caf551083acd7b08630ef21c3fd760dDaniel Dunbar const InputInfoList &Inputs, 6041294691eb1caf551083acd7b08630ef21c3fd760dDaniel Dunbar const ArgList &Args, 6042294691eb1caf551083acd7b08630ef21c3fd760dDaniel Dunbar const char *LinkingOutput) const { 604311e1b40d759a643086f590f6ffbd9d68360bad46Daniel Dunbar ArgStringList CmdArgs; 604411e1b40d759a643086f590f6ffbd9d68360bad46Daniel Dunbar 604511e1b40d759a643086f590f6ffbd9d68360bad46Daniel Dunbar // When building 32-bit code on DragonFly/pc64, we have to explicitly 604611e1b40d759a643086f590f6ffbd9d68360bad46Daniel Dunbar // instruct as in the base system to assemble 32-bit code. 604764f7ad9328e877779ec63638f39de4e10d2ff276Rafael Espindola if (getToolChain().getArch() == llvm::Triple::x86) 604811e1b40d759a643086f590f6ffbd9d68360bad46Daniel Dunbar CmdArgs.push_back("--32"); 604911e1b40d759a643086f590f6ffbd9d68360bad46Daniel Dunbar 605011e1b40d759a643086f590f6ffbd9d68360bad46Daniel Dunbar Args.AddAllArgValues(CmdArgs, options::OPT_Wa_COMMA, 605111e1b40d759a643086f590f6ffbd9d68360bad46Daniel Dunbar options::OPT_Xassembler); 605211e1b40d759a643086f590f6ffbd9d68360bad46Daniel Dunbar 605311e1b40d759a643086f590f6ffbd9d68360bad46Daniel Dunbar CmdArgs.push_back("-o"); 60547c1e46533cae07216e2a67d5636a5afb44253155Daniel Dunbar CmdArgs.push_back(Output.getFilename()); 605511e1b40d759a643086f590f6ffbd9d68360bad46Daniel Dunbar 605611e1b40d759a643086f590f6ffbd9d68360bad46Daniel Dunbar for (InputInfoList::const_iterator 605711e1b40d759a643086f590f6ffbd9d68360bad46Daniel Dunbar it = Inputs.begin(), ie = Inputs.end(); it != ie; ++it) { 605811e1b40d759a643086f590f6ffbd9d68360bad46Daniel Dunbar const InputInfo &II = *it; 60597c1e46533cae07216e2a67d5636a5afb44253155Daniel Dunbar CmdArgs.push_back(II.getFilename()); 606011e1b40d759a643086f590f6ffbd9d68360bad46Daniel Dunbar } 606111e1b40d759a643086f590f6ffbd9d68360bad46Daniel Dunbar 606211e1b40d759a643086f590f6ffbd9d68360bad46Daniel Dunbar const char *Exec = 60634a7e88978cf646ad10d654020cb00b3877069210Daniel Dunbar Args.MakeArgString(getToolChain().GetProgramPath("as")); 60642fe238ed293bd4bc27af9beb9fa151fad2146fa8Daniel Dunbar C.addCommand(new Command(JA, *this, Exec, CmdArgs)); 606511e1b40d759a643086f590f6ffbd9d68360bad46Daniel Dunbar} 606611e1b40d759a643086f590f6ffbd9d68360bad46Daniel Dunbar 606711e1b40d759a643086f590f6ffbd9d68360bad46Daniel Dunbarvoid dragonfly::Link::ConstructJob(Compilation &C, const JobAction &JA, 60682fe238ed293bd4bc27af9beb9fa151fad2146fa8Daniel Dunbar const InputInfo &Output, 60692fe238ed293bd4bc27af9beb9fa151fad2146fa8Daniel Dunbar const InputInfoList &Inputs, 60702fe238ed293bd4bc27af9beb9fa151fad2146fa8Daniel Dunbar const ArgList &Args, 60712fe238ed293bd4bc27af9beb9fa151fad2146fa8Daniel Dunbar const char *LinkingOutput) const { 6072ee788e70fcd0adf76103b17c78ac658d4ea30c9bDaniel Dunbar const Driver &D = getToolChain().getDriver(); 607311e1b40d759a643086f590f6ffbd9d68360bad46Daniel Dunbar ArgStringList CmdArgs; 607411e1b40d759a643086f590f6ffbd9d68360bad46Daniel Dunbar 60758ab2bdcc4f397e100c684ede8e8ca6e226e1380aJoerg Sonnenberger if (!D.SysRoot.empty()) 60768ab2bdcc4f397e100c684ede8e8ca6e226e1380aJoerg Sonnenberger CmdArgs.push_back(Args.MakeArgString("--sysroot=" + D.SysRoot)); 60778ab2bdcc4f397e100c684ede8e8ca6e226e1380aJoerg Sonnenberger 607811e1b40d759a643086f590f6ffbd9d68360bad46Daniel Dunbar if (Args.hasArg(options::OPT_static)) { 607911e1b40d759a643086f590f6ffbd9d68360bad46Daniel Dunbar CmdArgs.push_back("-Bstatic"); 608011e1b40d759a643086f590f6ffbd9d68360bad46Daniel Dunbar } else { 608111e1b40d759a643086f590f6ffbd9d68360bad46Daniel Dunbar if (Args.hasArg(options::OPT_shared)) 608211e1b40d759a643086f590f6ffbd9d68360bad46Daniel Dunbar CmdArgs.push_back("-Bshareable"); 608311e1b40d759a643086f590f6ffbd9d68360bad46Daniel Dunbar else { 608411e1b40d759a643086f590f6ffbd9d68360bad46Daniel Dunbar CmdArgs.push_back("-dynamic-linker"); 608511e1b40d759a643086f590f6ffbd9d68360bad46Daniel Dunbar CmdArgs.push_back("/usr/libexec/ld-elf.so.2"); 608611e1b40d759a643086f590f6ffbd9d68360bad46Daniel Dunbar } 608711e1b40d759a643086f590f6ffbd9d68360bad46Daniel Dunbar } 608811e1b40d759a643086f590f6ffbd9d68360bad46Daniel Dunbar 608911e1b40d759a643086f590f6ffbd9d68360bad46Daniel Dunbar // When building 32-bit code on DragonFly/pc64, we have to explicitly 609011e1b40d759a643086f590f6ffbd9d68360bad46Daniel Dunbar // instruct ld in the base system to link 32-bit code. 609164f7ad9328e877779ec63638f39de4e10d2ff276Rafael Espindola if (getToolChain().getArch() == llvm::Triple::x86) { 609211e1b40d759a643086f590f6ffbd9d68360bad46Daniel Dunbar CmdArgs.push_back("-m"); 609311e1b40d759a643086f590f6ffbd9d68360bad46Daniel Dunbar CmdArgs.push_back("elf_i386"); 609411e1b40d759a643086f590f6ffbd9d68360bad46Daniel Dunbar } 609511e1b40d759a643086f590f6ffbd9d68360bad46Daniel Dunbar 60967c1e46533cae07216e2a67d5636a5afb44253155Daniel Dunbar if (Output.isFilename()) { 609711e1b40d759a643086f590f6ffbd9d68360bad46Daniel Dunbar CmdArgs.push_back("-o"); 609811e1b40d759a643086f590f6ffbd9d68360bad46Daniel Dunbar CmdArgs.push_back(Output.getFilename()); 609911e1b40d759a643086f590f6ffbd9d68360bad46Daniel Dunbar } else { 610011e1b40d759a643086f590f6ffbd9d68360bad46Daniel Dunbar assert(Output.isNothing() && "Invalid output."); 610111e1b40d759a643086f590f6ffbd9d68360bad46Daniel Dunbar } 610211e1b40d759a643086f590f6ffbd9d68360bad46Daniel Dunbar 610311e1b40d759a643086f590f6ffbd9d68360bad46Daniel Dunbar if (!Args.hasArg(options::OPT_nostdlib) && 610411e1b40d759a643086f590f6ffbd9d68360bad46Daniel Dunbar !Args.hasArg(options::OPT_nostartfiles)) { 610511e1b40d759a643086f590f6ffbd9d68360bad46Daniel Dunbar if (!Args.hasArg(options::OPT_shared)) { 610638e317d6dce161b249508686cc67eb7176958762Chris Lattner CmdArgs.push_back( 61074a7e88978cf646ad10d654020cb00b3877069210Daniel Dunbar Args.MakeArgString(getToolChain().GetFilePath("crt1.o"))); 610838e317d6dce161b249508686cc67eb7176958762Chris Lattner CmdArgs.push_back( 61094a7e88978cf646ad10d654020cb00b3877069210Daniel Dunbar Args.MakeArgString(getToolChain().GetFilePath("crti.o"))); 611038e317d6dce161b249508686cc67eb7176958762Chris Lattner CmdArgs.push_back( 61114a7e88978cf646ad10d654020cb00b3877069210Daniel Dunbar Args.MakeArgString(getToolChain().GetFilePath("crtbegin.o"))); 611211e1b40d759a643086f590f6ffbd9d68360bad46Daniel Dunbar } else { 611338e317d6dce161b249508686cc67eb7176958762Chris Lattner CmdArgs.push_back( 61144a7e88978cf646ad10d654020cb00b3877069210Daniel Dunbar Args.MakeArgString(getToolChain().GetFilePath("crti.o"))); 611538e317d6dce161b249508686cc67eb7176958762Chris Lattner CmdArgs.push_back( 61164a7e88978cf646ad10d654020cb00b3877069210Daniel Dunbar Args.MakeArgString(getToolChain().GetFilePath("crtbeginS.o"))); 611711e1b40d759a643086f590f6ffbd9d68360bad46Daniel Dunbar } 611811e1b40d759a643086f590f6ffbd9d68360bad46Daniel Dunbar } 611911e1b40d759a643086f590f6ffbd9d68360bad46Daniel Dunbar 612011e1b40d759a643086f590f6ffbd9d68360bad46Daniel Dunbar Args.AddAllArgs(CmdArgs, options::OPT_L); 612111e1b40d759a643086f590f6ffbd9d68360bad46Daniel Dunbar Args.AddAllArgs(CmdArgs, options::OPT_T_Group); 612211e1b40d759a643086f590f6ffbd9d68360bad46Daniel Dunbar Args.AddAllArgs(CmdArgs, options::OPT_e); 612311e1b40d759a643086f590f6ffbd9d68360bad46Daniel Dunbar 61242008feead855f08500fb01ff43ef5eebee05d1e5Daniel Dunbar AddLinkerInputs(getToolChain(), Inputs, Args, CmdArgs); 612511e1b40d759a643086f590f6ffbd9d68360bad46Daniel Dunbar 612611e1b40d759a643086f590f6ffbd9d68360bad46Daniel Dunbar if (!Args.hasArg(options::OPT_nostdlib) && 612711e1b40d759a643086f590f6ffbd9d68360bad46Daniel Dunbar !Args.hasArg(options::OPT_nodefaultlibs)) { 612811e1b40d759a643086f590f6ffbd9d68360bad46Daniel Dunbar // FIXME: GCC passes on -lgcc, -lgcc_pic and a whole lot of 612911e1b40d759a643086f590f6ffbd9d68360bad46Daniel Dunbar // rpaths 613011e1b40d759a643086f590f6ffbd9d68360bad46Daniel Dunbar CmdArgs.push_back("-L/usr/lib/gcc41"); 613111e1b40d759a643086f590f6ffbd9d68360bad46Daniel Dunbar 613211e1b40d759a643086f590f6ffbd9d68360bad46Daniel Dunbar if (!Args.hasArg(options::OPT_static)) { 613311e1b40d759a643086f590f6ffbd9d68360bad46Daniel Dunbar CmdArgs.push_back("-rpath"); 613411e1b40d759a643086f590f6ffbd9d68360bad46Daniel Dunbar CmdArgs.push_back("/usr/lib/gcc41"); 613511e1b40d759a643086f590f6ffbd9d68360bad46Daniel Dunbar 613611e1b40d759a643086f590f6ffbd9d68360bad46Daniel Dunbar CmdArgs.push_back("-rpath-link"); 613711e1b40d759a643086f590f6ffbd9d68360bad46Daniel Dunbar CmdArgs.push_back("/usr/lib/gcc41"); 613811e1b40d759a643086f590f6ffbd9d68360bad46Daniel Dunbar 613911e1b40d759a643086f590f6ffbd9d68360bad46Daniel Dunbar CmdArgs.push_back("-rpath"); 614011e1b40d759a643086f590f6ffbd9d68360bad46Daniel Dunbar CmdArgs.push_back("/usr/lib"); 614111e1b40d759a643086f590f6ffbd9d68360bad46Daniel Dunbar 614211e1b40d759a643086f590f6ffbd9d68360bad46Daniel Dunbar CmdArgs.push_back("-rpath-link"); 614311e1b40d759a643086f590f6ffbd9d68360bad46Daniel Dunbar CmdArgs.push_back("/usr/lib"); 614411e1b40d759a643086f590f6ffbd9d68360bad46Daniel Dunbar } 614511e1b40d759a643086f590f6ffbd9d68360bad46Daniel Dunbar 6146405861d4ae824795f506d03cd7578f011cbf5b87Rafael Espindola if (D.CCCIsCXX) { 6147132e35d2f87895d20e7ea146c8c00404b80221a1Daniel Dunbar getToolChain().AddCXXStdlibLibArgs(Args, CmdArgs); 6148405861d4ae824795f506d03cd7578f011cbf5b87Rafael Espindola CmdArgs.push_back("-lm"); 6149405861d4ae824795f506d03cd7578f011cbf5b87Rafael Espindola } 6150405861d4ae824795f506d03cd7578f011cbf5b87Rafael Espindola 615111e1b40d759a643086f590f6ffbd9d68360bad46Daniel Dunbar if (Args.hasArg(options::OPT_shared)) { 615211e1b40d759a643086f590f6ffbd9d68360bad46Daniel Dunbar CmdArgs.push_back("-lgcc_pic"); 615311e1b40d759a643086f590f6ffbd9d68360bad46Daniel Dunbar } else { 615411e1b40d759a643086f590f6ffbd9d68360bad46Daniel Dunbar CmdArgs.push_back("-lgcc"); 615511e1b40d759a643086f590f6ffbd9d68360bad46Daniel Dunbar } 615611e1b40d759a643086f590f6ffbd9d68360bad46Daniel Dunbar 615711e1b40d759a643086f590f6ffbd9d68360bad46Daniel Dunbar 615811e1b40d759a643086f590f6ffbd9d68360bad46Daniel Dunbar if (Args.hasArg(options::OPT_pthread)) 61594d63f8bc2686d5d7580324407854f2ca7c128832Mike Stump CmdArgs.push_back("-lpthread"); 616011e1b40d759a643086f590f6ffbd9d68360bad46Daniel Dunbar 616111e1b40d759a643086f590f6ffbd9d68360bad46Daniel Dunbar if (!Args.hasArg(options::OPT_nolibc)) { 616211e1b40d759a643086f590f6ffbd9d68360bad46Daniel Dunbar CmdArgs.push_back("-lc"); 616311e1b40d759a643086f590f6ffbd9d68360bad46Daniel Dunbar } 616411e1b40d759a643086f590f6ffbd9d68360bad46Daniel Dunbar 616511e1b40d759a643086f590f6ffbd9d68360bad46Daniel Dunbar if (Args.hasArg(options::OPT_shared)) { 616611e1b40d759a643086f590f6ffbd9d68360bad46Daniel Dunbar CmdArgs.push_back("-lgcc_pic"); 616711e1b40d759a643086f590f6ffbd9d68360bad46Daniel Dunbar } else { 616811e1b40d759a643086f590f6ffbd9d68360bad46Daniel Dunbar CmdArgs.push_back("-lgcc"); 616911e1b40d759a643086f590f6ffbd9d68360bad46Daniel Dunbar } 617011e1b40d759a643086f590f6ffbd9d68360bad46Daniel Dunbar } 617111e1b40d759a643086f590f6ffbd9d68360bad46Daniel Dunbar 617211e1b40d759a643086f590f6ffbd9d68360bad46Daniel Dunbar if (!Args.hasArg(options::OPT_nostdlib) && 617311e1b40d759a643086f590f6ffbd9d68360bad46Daniel Dunbar !Args.hasArg(options::OPT_nostartfiles)) { 617411e1b40d759a643086f590f6ffbd9d68360bad46Daniel Dunbar if (!Args.hasArg(options::OPT_shared)) 617538e317d6dce161b249508686cc67eb7176958762Chris Lattner CmdArgs.push_back(Args.MakeArgString( 61764a7e88978cf646ad10d654020cb00b3877069210Daniel Dunbar getToolChain().GetFilePath("crtend.o"))); 617711e1b40d759a643086f590f6ffbd9d68360bad46Daniel Dunbar else 617838e317d6dce161b249508686cc67eb7176958762Chris Lattner CmdArgs.push_back(Args.MakeArgString( 61794a7e88978cf646ad10d654020cb00b3877069210Daniel Dunbar getToolChain().GetFilePath("crtendS.o"))); 618038e317d6dce161b249508686cc67eb7176958762Chris Lattner CmdArgs.push_back(Args.MakeArgString( 61814a7e88978cf646ad10d654020cb00b3877069210Daniel Dunbar getToolChain().GetFilePath("crtn.o"))); 618211e1b40d759a643086f590f6ffbd9d68360bad46Daniel Dunbar } 618311e1b40d759a643086f590f6ffbd9d68360bad46Daniel Dunbar 61843f4be6fb8872942f567166ab8d99c89885f26103Bill Wendling addProfileRT(getToolChain(), Args, CmdArgs, getToolChain().getTriple()); 61852e95a6d7d0b5aed39747875d7474c27824f7319fNick Lewycky 618611e1b40d759a643086f590f6ffbd9d68360bad46Daniel Dunbar const char *Exec = 61874a7e88978cf646ad10d654020cb00b3877069210Daniel Dunbar Args.MakeArgString(getToolChain().GetProgramPath("ld")); 61882fe238ed293bd4bc27af9beb9fa151fad2146fa8Daniel Dunbar C.addCommand(new Command(JA, *this, Exec, CmdArgs)); 618911e1b40d759a643086f590f6ffbd9d68360bad46Daniel Dunbar} 6190ff58e3610f4e12094def69eb2d6dcb4330378d8fMichael J. Spencer 6191ff58e3610f4e12094def69eb2d6dcb4330378d8fMichael J. Spencervoid visualstudio::Link::ConstructJob(Compilation &C, const JobAction &JA, 6192ff58e3610f4e12094def69eb2d6dcb4330378d8fMichael J. Spencer const InputInfo &Output, 6193ff58e3610f4e12094def69eb2d6dcb4330378d8fMichael J. Spencer const InputInfoList &Inputs, 6194ff58e3610f4e12094def69eb2d6dcb4330378d8fMichael J. Spencer const ArgList &Args, 6195ff58e3610f4e12094def69eb2d6dcb4330378d8fMichael J. Spencer const char *LinkingOutput) const { 6196ff58e3610f4e12094def69eb2d6dcb4330378d8fMichael J. Spencer ArgStringList CmdArgs; 6197ff58e3610f4e12094def69eb2d6dcb4330378d8fMichael J. Spencer 6198ff58e3610f4e12094def69eb2d6dcb4330378d8fMichael J. Spencer if (Output.isFilename()) { 6199e5a37f48388c7e4cc081f44d13a4910bfa56cd35Daniel Dunbar CmdArgs.push_back(Args.MakeArgString(std::string("-out:") + 6200e5a37f48388c7e4cc081f44d13a4910bfa56cd35Daniel Dunbar Output.getFilename())); 6201ff58e3610f4e12094def69eb2d6dcb4330378d8fMichael J. Spencer } else { 6202ff58e3610f4e12094def69eb2d6dcb4330378d8fMichael J. Spencer assert(Output.isNothing() && "Invalid output."); 6203ff58e3610f4e12094def69eb2d6dcb4330378d8fMichael J. Spencer } 6204ff58e3610f4e12094def69eb2d6dcb4330378d8fMichael J. Spencer 6205ff58e3610f4e12094def69eb2d6dcb4330378d8fMichael J. Spencer if (!Args.hasArg(options::OPT_nostdlib) && 6206ff58e3610f4e12094def69eb2d6dcb4330378d8fMichael J. Spencer !Args.hasArg(options::OPT_nostartfiles)) { 6207ff58e3610f4e12094def69eb2d6dcb4330378d8fMichael J. Spencer CmdArgs.push_back("-defaultlib:libcmt"); 6208ff58e3610f4e12094def69eb2d6dcb4330378d8fMichael J. Spencer } 6209ff58e3610f4e12094def69eb2d6dcb4330378d8fMichael J. Spencer 6210ff58e3610f4e12094def69eb2d6dcb4330378d8fMichael J. Spencer CmdArgs.push_back("-nologo"); 6211ff58e3610f4e12094def69eb2d6dcb4330378d8fMichael J. Spencer 6212a2284f5dcab3201bb9dd37568a3bed2041f1ab0bMichael J. Spencer Args.AddAllArgValues(CmdArgs, options::OPT_l); 6213a2284f5dcab3201bb9dd37568a3bed2041f1ab0bMichael J. Spencer 6214a2284f5dcab3201bb9dd37568a3bed2041f1ab0bMichael J. Spencer // Add filenames immediately. 6215a2284f5dcab3201bb9dd37568a3bed2041f1ab0bMichael J. Spencer for (InputInfoList::const_iterator 6216a2284f5dcab3201bb9dd37568a3bed2041f1ab0bMichael J. Spencer it = Inputs.begin(), ie = Inputs.end(); it != ie; ++it) { 6217a2284f5dcab3201bb9dd37568a3bed2041f1ab0bMichael J. Spencer if (it->isFilename()) 6218a2284f5dcab3201bb9dd37568a3bed2041f1ab0bMichael J. Spencer CmdArgs.push_back(it->getFilename()); 6219a2284f5dcab3201bb9dd37568a3bed2041f1ab0bMichael J. Spencer } 6220ff58e3610f4e12094def69eb2d6dcb4330378d8fMichael J. Spencer 6221ff58e3610f4e12094def69eb2d6dcb4330378d8fMichael J. Spencer const char *Exec = 62222008feead855f08500fb01ff43ef5eebee05d1e5Daniel Dunbar Args.MakeArgString(getToolChain().GetProgramPath("link.exe")); 6223ff58e3610f4e12094def69eb2d6dcb4330378d8fMichael J. Spencer C.addCommand(new Command(JA, *this, Exec, CmdArgs)); 6224ff58e3610f4e12094def69eb2d6dcb4330378d8fMichael J. Spencer} 6225