Tools.cpp revision 32579cf507d088e776b67327c5d6bc46e1f217cc
147ac7d27c44bd64a7d0fc03d4babc196cf2b8230Daniel Dunbar//===--- Tools.cpp - Tools Implementations ------------------------------*-===// 247ac7d27c44bd64a7d0fc03d4babc196cf2b8230Daniel Dunbar// 347ac7d27c44bd64a7d0fc03d4babc196cf2b8230Daniel Dunbar// The LLVM Compiler Infrastructure 447ac7d27c44bd64a7d0fc03d4babc196cf2b8230Daniel Dunbar// 547ac7d27c44bd64a7d0fc03d4babc196cf2b8230Daniel Dunbar// This file is distributed under the University of Illinois Open Source 647ac7d27c44bd64a7d0fc03d4babc196cf2b8230Daniel Dunbar// License. See LICENSE.TXT for details. 747ac7d27c44bd64a7d0fc03d4babc196cf2b8230Daniel Dunbar// 847ac7d27c44bd64a7d0fc03d4babc196cf2b8230Daniel Dunbar//===----------------------------------------------------------------------===// 947ac7d27c44bd64a7d0fc03d4babc196cf2b8230Daniel Dunbar 1047ac7d27c44bd64a7d0fc03d4babc196cf2b8230Daniel Dunbar#include "Tools.h" 1147ac7d27c44bd64a7d0fc03d4babc196cf2b8230Daniel Dunbar 121d46033f760ba5fd266ce59fe391fac473f04f52Daniel Dunbar#include "clang/Driver/Action.h" 13871adcf4e41285e3f4c3b62eaa1b2e05b60b92daDaniel Dunbar#include "clang/Driver/Arg.h" 14b488c1dac8e53206f07103d794a62a3f5012c0f4Daniel Dunbar#include "clang/Driver/ArgList.h" 15ee848a73e5f8ffe7511af8652ba811c020d1c7a0Daniel Dunbar#include "clang/Driver/Driver.h" 16ee848a73e5f8ffe7511af8652ba811c020d1c7a0Daniel Dunbar#include "clang/Driver/DriverDiagnostic.h" 17871adcf4e41285e3f4c3b62eaa1b2e05b60b92daDaniel Dunbar#include "clang/Driver/Compilation.h" 18871adcf4e41285e3f4c3b62eaa1b2e05b60b92daDaniel Dunbar#include "clang/Driver/Job.h" 19b488c1dac8e53206f07103d794a62a3f5012c0f4Daniel Dunbar#include "clang/Driver/HostInfo.h" 20b488c1dac8e53206f07103d794a62a3f5012c0f4Daniel Dunbar#include "clang/Driver/Option.h" 21265e9ef9f3ef30a97790e6e7bbc3c17d97981ca7Daniel Dunbar#include "clang/Driver/Options.h" 22b488c1dac8e53206f07103d794a62a3f5012c0f4Daniel Dunbar#include "clang/Driver/ToolChain.h" 23871adcf4e41285e3f4c3b62eaa1b2e05b60b92daDaniel Dunbar#include "clang/Driver/Util.h" 24871adcf4e41285e3f4c3b62eaa1b2e05b60b92daDaniel Dunbar 25881376467c46c5c6cc16fa6790271c2c22e1d4f1Daniel Dunbar#include "llvm/ADT/SmallString.h" 2655d3f7ae512875a1d6402943c3a619633feb2a18Douglas Gregor#include "llvm/ADT/StringSwitch.h" 275b750fe6189a41937ff2b080a983c95ea273769fDaniel Dunbar#include "llvm/ADT/Twine.h" 2802633b541b04ad5ffc1c70f4c2feeeb13e607057Daniel Dunbar#include "llvm/Support/Format.h" 2902633b541b04ad5ffc1c70f4c2feeeb13e607057Daniel Dunbar#include "llvm/Support/raw_ostream.h" 30f86feddbd5b13d2c144132e35d608fa630784dbbDaniel Dunbar#include "llvm/System/Host.h" 3155efe142a84b2aab6d0186c20a311c347a65f794Daniel Dunbar#include "llvm/System/Process.h" 32871adcf4e41285e3f4c3b62eaa1b2e05b60b92daDaniel Dunbar 33871adcf4e41285e3f4c3b62eaa1b2e05b60b92daDaniel Dunbar#include "InputInfo.h" 3402633b541b04ad5ffc1c70f4c2feeeb13e607057Daniel Dunbar#include "ToolChains.h" 35871adcf4e41285e3f4c3b62eaa1b2e05b60b92daDaniel Dunbar 3647ac7d27c44bd64a7d0fc03d4babc196cf2b8230Daniel Dunbarusing namespace clang::driver; 3747ac7d27c44bd64a7d0fc03d4babc196cf2b8230Daniel Dunbarusing namespace clang::driver::tools; 3847ac7d27c44bd64a7d0fc03d4babc196cf2b8230Daniel Dunbar 3988a3d6cf5ebab81614f89ba48a8d89023270637aDaniel Dunbar/// CheckPreprocessingOptions - Perform some validation of preprocessing 4088a3d6cf5ebab81614f89ba48a8d89023270637aDaniel Dunbar/// arguments that is shared with gcc. 4188a3d6cf5ebab81614f89ba48a8d89023270637aDaniel Dunbarstatic void CheckPreprocessingOptions(const Driver &D, const ArgList &Args) { 4288a3d6cf5ebab81614f89ba48a8d89023270637aDaniel Dunbar if (Arg *A = Args.getLastArg(options::OPT_C, options::OPT_CC)) 4388a3d6cf5ebab81614f89ba48a8d89023270637aDaniel Dunbar if (!Args.hasArg(options::OPT_E)) 4488a3d6cf5ebab81614f89ba48a8d89023270637aDaniel Dunbar D.Diag(clang::diag::err_drv_argument_only_allowed_with) 4588a3d6cf5ebab81614f89ba48a8d89023270637aDaniel Dunbar << A->getAsString(Args) << "-E"; 4688a3d6cf5ebab81614f89ba48a8d89023270637aDaniel Dunbar} 4788a3d6cf5ebab81614f89ba48a8d89023270637aDaniel Dunbar 48e2fd66418eca3d70cf6b62087d745d0c5181db69Daniel Dunbar/// CheckCodeGenerationOptions - Perform some validation of code generation 49e2fd66418eca3d70cf6b62087d745d0c5181db69Daniel Dunbar/// arguments that is shared with gcc. 50e2fd66418eca3d70cf6b62087d745d0c5181db69Daniel Dunbarstatic void CheckCodeGenerationOptions(const Driver &D, const ArgList &Args) { 51e2fd66418eca3d70cf6b62087d745d0c5181db69Daniel Dunbar // In gcc, only ARM checks this, but it seems reasonable to check universally. 52e2fd66418eca3d70cf6b62087d745d0c5181db69Daniel Dunbar if (Args.hasArg(options::OPT_static)) 53e2fd66418eca3d70cf6b62087d745d0c5181db69Daniel Dunbar if (const Arg *A = Args.getLastArg(options::OPT_dynamic, 54e2fd66418eca3d70cf6b62087d745d0c5181db69Daniel Dunbar options::OPT_mdynamic_no_pic)) 55e2fd66418eca3d70cf6b62087d745d0c5181db69Daniel Dunbar D.Diag(clang::diag::err_drv_argument_not_allowed_with) 56e2fd66418eca3d70cf6b62087d745d0c5181db69Daniel Dunbar << A->getAsString(Args) << "-static"; 57e2fd66418eca3d70cf6b62087d745d0c5181db69Daniel Dunbar} 58e2fd66418eca3d70cf6b62087d745d0c5181db69Daniel Dunbar 593edbeb78fe5ea7fffea7a94575478cde19e830e0Chris Lattner// Quote target names for inclusion in GNU Make dependency files. 603edbeb78fe5ea7fffea7a94575478cde19e830e0Chris Lattner// Only the characters '$', '#', ' ', '\t' are quoted. 613edbeb78fe5ea7fffea7a94575478cde19e830e0Chris Lattnerstatic void QuoteTarget(llvm::StringRef Target, 623edbeb78fe5ea7fffea7a94575478cde19e830e0Chris Lattner llvm::SmallVectorImpl<char> &Res) { 633edbeb78fe5ea7fffea7a94575478cde19e830e0Chris Lattner for (unsigned i = 0, e = Target.size(); i != e; ++i) { 643edbeb78fe5ea7fffea7a94575478cde19e830e0Chris Lattner switch (Target[i]) { 653edbeb78fe5ea7fffea7a94575478cde19e830e0Chris Lattner case ' ': 663edbeb78fe5ea7fffea7a94575478cde19e830e0Chris Lattner case '\t': 673edbeb78fe5ea7fffea7a94575478cde19e830e0Chris Lattner // Escape the preceding backslashes 683edbeb78fe5ea7fffea7a94575478cde19e830e0Chris Lattner for (int j = i - 1; j >= 0 && Target[j] == '\\'; --j) 693edbeb78fe5ea7fffea7a94575478cde19e830e0Chris Lattner Res.push_back('\\'); 703edbeb78fe5ea7fffea7a94575478cde19e830e0Chris Lattner 713edbeb78fe5ea7fffea7a94575478cde19e830e0Chris Lattner // Escape the space/tab 723edbeb78fe5ea7fffea7a94575478cde19e830e0Chris Lattner Res.push_back('\\'); 733edbeb78fe5ea7fffea7a94575478cde19e830e0Chris Lattner break; 743edbeb78fe5ea7fffea7a94575478cde19e830e0Chris Lattner case '$': 753edbeb78fe5ea7fffea7a94575478cde19e830e0Chris Lattner Res.push_back('$'); 763edbeb78fe5ea7fffea7a94575478cde19e830e0Chris Lattner break; 773edbeb78fe5ea7fffea7a94575478cde19e830e0Chris Lattner case '#': 783edbeb78fe5ea7fffea7a94575478cde19e830e0Chris Lattner Res.push_back('\\'); 793edbeb78fe5ea7fffea7a94575478cde19e830e0Chris Lattner break; 803edbeb78fe5ea7fffea7a94575478cde19e830e0Chris Lattner default: 813edbeb78fe5ea7fffea7a94575478cde19e830e0Chris Lattner break; 823edbeb78fe5ea7fffea7a94575478cde19e830e0Chris Lattner } 833edbeb78fe5ea7fffea7a94575478cde19e830e0Chris Lattner 843edbeb78fe5ea7fffea7a94575478cde19e830e0Chris Lattner Res.push_back(Target[i]); 853edbeb78fe5ea7fffea7a94575478cde19e830e0Chris Lattner } 863edbeb78fe5ea7fffea7a94575478cde19e830e0Chris Lattner} 873edbeb78fe5ea7fffea7a94575478cde19e830e0Chris Lattner 881eb4433ac451dc16f4133a88af2d002ac26c58efMike Stumpvoid Clang::AddPreprocessingOptions(const Driver &D, 89df91ef3d6c55692a0236f67b6c6b134a3bf84098Douglas Gregor const ArgList &Args, 90c21c485b4fb58ef5d55cf3e523263dd824a2ace4Daniel Dunbar ArgStringList &CmdArgs, 91c21c485b4fb58ef5d55cf3e523263dd824a2ace4Daniel Dunbar const InputInfo &Output, 92c21c485b4fb58ef5d55cf3e523263dd824a2ace4Daniel Dunbar const InputInfoList &Inputs) const { 93c21c485b4fb58ef5d55cf3e523263dd824a2ace4Daniel Dunbar Arg *A; 943a183d3d46426d8719031553131b8928f50aa606Daniel Dunbar 9588a3d6cf5ebab81614f89ba48a8d89023270637aDaniel Dunbar CheckPreprocessingOptions(D, Args); 9688a3d6cf5ebab81614f89ba48a8d89023270637aDaniel Dunbar 9788a3d6cf5ebab81614f89ba48a8d89023270637aDaniel Dunbar Args.AddLastArg(CmdArgs, options::OPT_C); 9888a3d6cf5ebab81614f89ba48a8d89023270637aDaniel Dunbar Args.AddLastArg(CmdArgs, options::OPT_CC); 993a183d3d46426d8719031553131b8928f50aa606Daniel Dunbar 1003a183d3d46426d8719031553131b8928f50aa606Daniel Dunbar // Handle dependency file generation. 101c21c485b4fb58ef5d55cf3e523263dd824a2ace4Daniel Dunbar if ((A = Args.getLastArg(options::OPT_M)) || 102c21c485b4fb58ef5d55cf3e523263dd824a2ace4Daniel Dunbar (A = Args.getLastArg(options::OPT_MM)) || 103c21c485b4fb58ef5d55cf3e523263dd824a2ace4Daniel Dunbar (A = Args.getLastArg(options::OPT_MD)) || 104c21c485b4fb58ef5d55cf3e523263dd824a2ace4Daniel Dunbar (A = Args.getLastArg(options::OPT_MMD))) { 105c21c485b4fb58ef5d55cf3e523263dd824a2ace4Daniel Dunbar // Determine the output location. 106c21c485b4fb58ef5d55cf3e523263dd824a2ace4Daniel Dunbar const char *DepFile; 107c21c485b4fb58ef5d55cf3e523263dd824a2ace4Daniel Dunbar if (Output.getType() == types::TY_Dependencies) { 108c21c485b4fb58ef5d55cf3e523263dd824a2ace4Daniel Dunbar if (Output.isPipe()) 109c21c485b4fb58ef5d55cf3e523263dd824a2ace4Daniel Dunbar DepFile = "-"; 110c21c485b4fb58ef5d55cf3e523263dd824a2ace4Daniel Dunbar else 111c21c485b4fb58ef5d55cf3e523263dd824a2ace4Daniel Dunbar DepFile = Output.getFilename(); 112c21c485b4fb58ef5d55cf3e523263dd824a2ace4Daniel Dunbar } else if (Arg *MF = Args.getLastArg(options::OPT_MF)) { 113c21c485b4fb58ef5d55cf3e523263dd824a2ace4Daniel Dunbar DepFile = MF->getValue(Args); 114b827a0541b5fd095fcdb7ad0c3df93ca158c619aDaniel Dunbar } else if (A->getOption().matches(options::OPT_M) || 115b827a0541b5fd095fcdb7ad0c3df93ca158c619aDaniel Dunbar A->getOption().matches(options::OPT_MM)) { 116c21c485b4fb58ef5d55cf3e523263dd824a2ace4Daniel Dunbar DepFile = "-"; 117c21c485b4fb58ef5d55cf3e523263dd824a2ace4Daniel Dunbar } else { 118c21c485b4fb58ef5d55cf3e523263dd824a2ace4Daniel Dunbar DepFile = darwin::CC1::getDependencyFileName(Args, Inputs); 119c21c485b4fb58ef5d55cf3e523263dd824a2ace4Daniel Dunbar } 120c21c485b4fb58ef5d55cf3e523263dd824a2ace4Daniel Dunbar CmdArgs.push_back("-dependency-file"); 121c21c485b4fb58ef5d55cf3e523263dd824a2ace4Daniel Dunbar CmdArgs.push_back(DepFile); 122c21c485b4fb58ef5d55cf3e523263dd824a2ace4Daniel Dunbar 1233edbeb78fe5ea7fffea7a94575478cde19e830e0Chris Lattner // Add a default target if one wasn't specified. 124c21c485b4fb58ef5d55cf3e523263dd824a2ace4Daniel Dunbar if (!Args.hasArg(options::OPT_MT) && !Args.hasArg(options::OPT_MQ)) { 125c21c485b4fb58ef5d55cf3e523263dd824a2ace4Daniel Dunbar const char *DepTarget; 126c21c485b4fb58ef5d55cf3e523263dd824a2ace4Daniel Dunbar 127c21c485b4fb58ef5d55cf3e523263dd824a2ace4Daniel Dunbar // If user provided -o, that is the dependency target, except 128c21c485b4fb58ef5d55cf3e523263dd824a2ace4Daniel Dunbar // when we are only generating a dependency file. 129c21c485b4fb58ef5d55cf3e523263dd824a2ace4Daniel Dunbar Arg *OutputOpt = Args.getLastArg(options::OPT_o); 130c21c485b4fb58ef5d55cf3e523263dd824a2ace4Daniel Dunbar if (OutputOpt && Output.getType() != types::TY_Dependencies) { 131c21c485b4fb58ef5d55cf3e523263dd824a2ace4Daniel Dunbar DepTarget = OutputOpt->getValue(Args); 132c21c485b4fb58ef5d55cf3e523263dd824a2ace4Daniel Dunbar } else { 133c21c485b4fb58ef5d55cf3e523263dd824a2ace4Daniel Dunbar // Otherwise derive from the base input. 134c21c485b4fb58ef5d55cf3e523263dd824a2ace4Daniel Dunbar // 135c21c485b4fb58ef5d55cf3e523263dd824a2ace4Daniel Dunbar // FIXME: This should use the computed output file location. 136c21c485b4fb58ef5d55cf3e523263dd824a2ace4Daniel Dunbar llvm::sys::Path P(Inputs[0].getBaseInput()); 137c21c485b4fb58ef5d55cf3e523263dd824a2ace4Daniel Dunbar 138c21c485b4fb58ef5d55cf3e523263dd824a2ace4Daniel Dunbar P.eraseSuffix(); 139c21c485b4fb58ef5d55cf3e523263dd824a2ace4Daniel Dunbar P.appendSuffix("o"); 140881376467c46c5c6cc16fa6790271c2c22e1d4f1Daniel Dunbar DepTarget = Args.MakeArgString(P.getLast()); 141c21c485b4fb58ef5d55cf3e523263dd824a2ace4Daniel Dunbar } 142c21c485b4fb58ef5d55cf3e523263dd824a2ace4Daniel Dunbar 143c21c485b4fb58ef5d55cf3e523263dd824a2ace4Daniel Dunbar CmdArgs.push_back("-MT"); 1443edbeb78fe5ea7fffea7a94575478cde19e830e0Chris Lattner llvm::SmallString<128> Quoted; 1453edbeb78fe5ea7fffea7a94575478cde19e830e0Chris Lattner QuoteTarget(DepTarget, Quoted); 1463edbeb78fe5ea7fffea7a94575478cde19e830e0Chris Lattner CmdArgs.push_back(Args.MakeArgString(Quoted)); 147c21c485b4fb58ef5d55cf3e523263dd824a2ace4Daniel Dunbar } 148c21c485b4fb58ef5d55cf3e523263dd824a2ace4Daniel Dunbar 149b827a0541b5fd095fcdb7ad0c3df93ca158c619aDaniel Dunbar if (A->getOption().matches(options::OPT_M) || 150b827a0541b5fd095fcdb7ad0c3df93ca158c619aDaniel Dunbar A->getOption().matches(options::OPT_MD)) 151c21c485b4fb58ef5d55cf3e523263dd824a2ace4Daniel Dunbar CmdArgs.push_back("-sys-header-deps"); 152c21c485b4fb58ef5d55cf3e523263dd824a2ace4Daniel Dunbar } 153c21c485b4fb58ef5d55cf3e523263dd824a2ace4Daniel Dunbar 154c21c485b4fb58ef5d55cf3e523263dd824a2ace4Daniel Dunbar Args.AddLastArg(CmdArgs, options::OPT_MP); 1553edbeb78fe5ea7fffea7a94575478cde19e830e0Chris Lattner 1563edbeb78fe5ea7fffea7a94575478cde19e830e0Chris Lattner // Convert all -MQ <target> args to -MT <quoted target> 1573edbeb78fe5ea7fffea7a94575478cde19e830e0Chris Lattner for (arg_iterator it = Args.filtered_begin(options::OPT_MT, 1583edbeb78fe5ea7fffea7a94575478cde19e830e0Chris Lattner options::OPT_MQ), 1593edbeb78fe5ea7fffea7a94575478cde19e830e0Chris Lattner ie = Args.filtered_end(); it != ie; ++it) { 1603edbeb78fe5ea7fffea7a94575478cde19e830e0Chris Lattner 1613edbeb78fe5ea7fffea7a94575478cde19e830e0Chris Lattner it->claim(); 1623edbeb78fe5ea7fffea7a94575478cde19e830e0Chris Lattner 1633edbeb78fe5ea7fffea7a94575478cde19e830e0Chris Lattner if (it->getOption().matches(options::OPT_MQ)) { 1643edbeb78fe5ea7fffea7a94575478cde19e830e0Chris Lattner CmdArgs.push_back("-MT"); 1653edbeb78fe5ea7fffea7a94575478cde19e830e0Chris Lattner llvm::SmallString<128> Quoted; 1663edbeb78fe5ea7fffea7a94575478cde19e830e0Chris Lattner QuoteTarget(it->getValue(Args), Quoted); 1673edbeb78fe5ea7fffea7a94575478cde19e830e0Chris Lattner CmdArgs.push_back(Args.MakeArgString(Quoted)); 1683edbeb78fe5ea7fffea7a94575478cde19e830e0Chris Lattner 1693edbeb78fe5ea7fffea7a94575478cde19e830e0Chris Lattner // -MT flag - no change 1703edbeb78fe5ea7fffea7a94575478cde19e830e0Chris Lattner } else { 1713edbeb78fe5ea7fffea7a94575478cde19e830e0Chris Lattner it->render(Args, CmdArgs); 1723edbeb78fe5ea7fffea7a94575478cde19e830e0Chris Lattner } 1733edbeb78fe5ea7fffea7a94575478cde19e830e0Chris Lattner } 174c21c485b4fb58ef5d55cf3e523263dd824a2ace4Daniel Dunbar 175df91ef3d6c55692a0236f67b6c6b134a3bf84098Douglas Gregor // Add -i* options, and automatically translate to 176df91ef3d6c55692a0236f67b6c6b134a3bf84098Douglas Gregor // -include-pch/-include-pth for transparent PCH support. It's 177df91ef3d6c55692a0236f67b6c6b134a3bf84098Douglas Gregor // wonky, but we include looking for .gch so we can support seamless 178df91ef3d6c55692a0236f67b6c6b134a3bf84098Douglas Gregor // replacement into a build system already set up to be generating 179df91ef3d6c55692a0236f67b6c6b134a3bf84098Douglas Gregor // .gch files. 180cdd9686b890ebdc10039ae256ef4c9dfb5ebacb7Daniel Dunbar for (arg_iterator it = Args.filtered_begin(options::OPT_clang_i_Group), 181cdd9686b890ebdc10039ae256ef4c9dfb5ebacb7Daniel Dunbar ie = Args.filtered_end(); it != ie; ++it) { 182cdd9686b890ebdc10039ae256ef4c9dfb5ebacb7Daniel Dunbar const Arg *A = it; 183c21c485b4fb58ef5d55cf3e523263dd824a2ace4Daniel Dunbar 184c21c485b4fb58ef5d55cf3e523263dd824a2ace4Daniel Dunbar if (A->getOption().matches(options::OPT_include)) { 1850ebd9321ba380471010341f24c874f46f56e7581Daniel Dunbar // Use PCH if the user requested it, except for C++ (for now). 1860ebd9321ba380471010341f24c874f46f56e7581Daniel Dunbar bool UsePCH = D.CCCUsePCH; 1870ebd9321ba380471010341f24c874f46f56e7581Daniel Dunbar if (types::isCXX(Inputs[0].getType())) 1880ebd9321ba380471010341f24c874f46f56e7581Daniel Dunbar UsePCH = false; 1890ebd9321ba380471010341f24c874f46f56e7581Daniel Dunbar 190c21c485b4fb58ef5d55cf3e523263dd824a2ace4Daniel Dunbar bool FoundPTH = false; 191df91ef3d6c55692a0236f67b6c6b134a3bf84098Douglas Gregor bool FoundPCH = false; 192c21c485b4fb58ef5d55cf3e523263dd824a2ace4Daniel Dunbar llvm::sys::Path P(A->getValue(Args)); 1930ebd9321ba380471010341f24c874f46f56e7581Daniel Dunbar if (UsePCH) { 194df91ef3d6c55692a0236f67b6c6b134a3bf84098Douglas Gregor P.appendSuffix("pch"); 195c21c485b4fb58ef5d55cf3e523263dd824a2ace4Daniel Dunbar if (P.exists()) 196df91ef3d6c55692a0236f67b6c6b134a3bf84098Douglas Gregor FoundPCH = true; 1971eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump else 198df91ef3d6c55692a0236f67b6c6b134a3bf84098Douglas Gregor P.eraseSuffix(); 199df91ef3d6c55692a0236f67b6c6b134a3bf84098Douglas Gregor } 200df91ef3d6c55692a0236f67b6c6b134a3bf84098Douglas Gregor 201df91ef3d6c55692a0236f67b6c6b134a3bf84098Douglas Gregor if (!FoundPCH) { 202df91ef3d6c55692a0236f67b6c6b134a3bf84098Douglas Gregor P.appendSuffix("pth"); 2031eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump if (P.exists()) 204c21c485b4fb58ef5d55cf3e523263dd824a2ace4Daniel Dunbar FoundPTH = true; 205df91ef3d6c55692a0236f67b6c6b134a3bf84098Douglas Gregor else 206df91ef3d6c55692a0236f67b6c6b134a3bf84098Douglas Gregor P.eraseSuffix(); 2071eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump } 2081eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump 209df91ef3d6c55692a0236f67b6c6b134a3bf84098Douglas Gregor if (!FoundPCH && !FoundPTH) { 210df91ef3d6c55692a0236f67b6c6b134a3bf84098Douglas Gregor P.appendSuffix("gch"); 211df91ef3d6c55692a0236f67b6c6b134a3bf84098Douglas Gregor if (P.exists()) { 2120ebd9321ba380471010341f24c874f46f56e7581Daniel Dunbar FoundPCH = UsePCH; 2130ebd9321ba380471010341f24c874f46f56e7581Daniel Dunbar FoundPTH = !UsePCH; 214df91ef3d6c55692a0236f67b6c6b134a3bf84098Douglas Gregor } 2151eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump else 216df91ef3d6c55692a0236f67b6c6b134a3bf84098Douglas Gregor P.eraseSuffix(); 217c21c485b4fb58ef5d55cf3e523263dd824a2ace4Daniel Dunbar } 218c21c485b4fb58ef5d55cf3e523263dd824a2ace4Daniel Dunbar 219df91ef3d6c55692a0236f67b6c6b134a3bf84098Douglas Gregor if (FoundPCH || FoundPTH) { 220c21c485b4fb58ef5d55cf3e523263dd824a2ace4Daniel Dunbar A->claim(); 2210ebd9321ba380471010341f24c874f46f56e7581Daniel Dunbar if (UsePCH) 222df91ef3d6c55692a0236f67b6c6b134a3bf84098Douglas Gregor CmdArgs.push_back("-include-pch"); 223df91ef3d6c55692a0236f67b6c6b134a3bf84098Douglas Gregor else 224df91ef3d6c55692a0236f67b6c6b134a3bf84098Douglas Gregor CmdArgs.push_back("-include-pth"); 225881376467c46c5c6cc16fa6790271c2c22e1d4f1Daniel Dunbar CmdArgs.push_back(Args.MakeArgString(P.str())); 226c21c485b4fb58ef5d55cf3e523263dd824a2ace4Daniel Dunbar continue; 227c21c485b4fb58ef5d55cf3e523263dd824a2ace4Daniel Dunbar } 228c21c485b4fb58ef5d55cf3e523263dd824a2ace4Daniel Dunbar } 229c21c485b4fb58ef5d55cf3e523263dd824a2ace4Daniel Dunbar 230c21c485b4fb58ef5d55cf3e523263dd824a2ace4Daniel Dunbar // Not translated, render as usual. 231c21c485b4fb58ef5d55cf3e523263dd824a2ace4Daniel Dunbar A->claim(); 232c21c485b4fb58ef5d55cf3e523263dd824a2ace4Daniel Dunbar A->render(Args, CmdArgs); 233c21c485b4fb58ef5d55cf3e523263dd824a2ace4Daniel Dunbar } 234c21c485b4fb58ef5d55cf3e523263dd824a2ace4Daniel Dunbar 235c21c485b4fb58ef5d55cf3e523263dd824a2ace4Daniel Dunbar Args.AddAllArgs(CmdArgs, options::OPT_D, options::OPT_U); 236c21c485b4fb58ef5d55cf3e523263dd824a2ace4Daniel Dunbar Args.AddAllArgs(CmdArgs, options::OPT_I_Group, options::OPT_F); 237c21c485b4fb58ef5d55cf3e523263dd824a2ace4Daniel Dunbar 238c21c485b4fb58ef5d55cf3e523263dd824a2ace4Daniel Dunbar // Add -Wp, and -Xassembler if using the preprocessor. 239c21c485b4fb58ef5d55cf3e523263dd824a2ace4Daniel Dunbar 240c21c485b4fb58ef5d55cf3e523263dd824a2ace4Daniel Dunbar // FIXME: There is a very unfortunate problem here, some troubled 241c21c485b4fb58ef5d55cf3e523263dd824a2ace4Daniel Dunbar // souls abuse -Wp, to pass preprocessor options in gcc syntax. To 242c21c485b4fb58ef5d55cf3e523263dd824a2ace4Daniel Dunbar // really support that we would have to parse and then translate 243c21c485b4fb58ef5d55cf3e523263dd824a2ace4Daniel Dunbar // those options. :( 244c21c485b4fb58ef5d55cf3e523263dd824a2ace4Daniel Dunbar Args.AddAllArgValues(CmdArgs, options::OPT_Wp_COMMA, 245c21c485b4fb58ef5d55cf3e523263dd824a2ace4Daniel Dunbar options::OPT_Xpreprocessor); 246607d7f6d8f21066cc48bbe2c51e6ca412a00943fDaniel Dunbar 247607d7f6d8f21066cc48bbe2c51e6ca412a00943fDaniel Dunbar // -I- is a deprecated GCC feature, reject it. 248607d7f6d8f21066cc48bbe2c51e6ca412a00943fDaniel Dunbar if (Arg *A = Args.getLastArg(options::OPT_I_)) 249607d7f6d8f21066cc48bbe2c51e6ca412a00943fDaniel Dunbar D.Diag(clang::diag::err_drv_I_dash_not_supported) << A->getAsString(Args); 250c21c485b4fb58ef5d55cf3e523263dd824a2ace4Daniel Dunbar} 251c21c485b4fb58ef5d55cf3e523263dd824a2ace4Daniel Dunbar 252728a512753d85a6ccaae34e81385c8665c2de0e1Daniel Dunbar/// getARMTargetCPU - Get the (LLVM) name of the ARM cpu we are targetting. 253728a512753d85a6ccaae34e81385c8665c2de0e1Daniel Dunbar// 254728a512753d85a6ccaae34e81385c8665c2de0e1Daniel Dunbar// FIXME: tblgen this. 255a31100e62f83933432df9092a04e48f9e5561a14Daniel Dunbarstatic const char *getARMTargetCPU(const ArgList &Args) { 256728a512753d85a6ccaae34e81385c8665c2de0e1Daniel Dunbar // FIXME: Warn on inconsistent use of -mcpu and -march. 257b163ef7e7a5d904ef0962a7c38c460be083c4d63Daniel Dunbar 258b163ef7e7a5d904ef0962a7c38c460be083c4d63Daniel Dunbar // If we have -mcpu=, use that. 259b163ef7e7a5d904ef0962a7c38c460be083c4d63Daniel Dunbar if (Arg *A = Args.getLastArg(options::OPT_mcpu_EQ)) 260b163ef7e7a5d904ef0962a7c38c460be083c4d63Daniel Dunbar return A->getValue(Args); 261b163ef7e7a5d904ef0962a7c38c460be083c4d63Daniel Dunbar 262b163ef7e7a5d904ef0962a7c38c460be083c4d63Daniel Dunbar // Otherwise, if we have -march= choose the base CPU for that arch. 263b163ef7e7a5d904ef0962a7c38c460be083c4d63Daniel Dunbar if (Arg *A = Args.getLastArg(options::OPT_march_EQ)) { 264b163ef7e7a5d904ef0962a7c38c460be083c4d63Daniel Dunbar llvm::StringRef MArch = A->getValue(Args); 265b163ef7e7a5d904ef0962a7c38c460be083c4d63Daniel Dunbar 266b163ef7e7a5d904ef0962a7c38c460be083c4d63Daniel Dunbar if (MArch == "armv2" || MArch == "armv2a") 267b163ef7e7a5d904ef0962a7c38c460be083c4d63Daniel Dunbar return "arm2"; 268b163ef7e7a5d904ef0962a7c38c460be083c4d63Daniel Dunbar if (MArch == "armv3") 269b163ef7e7a5d904ef0962a7c38c460be083c4d63Daniel Dunbar return "arm6"; 270b163ef7e7a5d904ef0962a7c38c460be083c4d63Daniel Dunbar if (MArch == "armv3m") 271b163ef7e7a5d904ef0962a7c38c460be083c4d63Daniel Dunbar return "arm7m"; 272b163ef7e7a5d904ef0962a7c38c460be083c4d63Daniel Dunbar if (MArch == "armv4" || MArch == "armv4t") 273b163ef7e7a5d904ef0962a7c38c460be083c4d63Daniel Dunbar return "arm7tdmi"; 274b163ef7e7a5d904ef0962a7c38c460be083c4d63Daniel Dunbar if (MArch == "armv5" || MArch == "armv5t") 275b163ef7e7a5d904ef0962a7c38c460be083c4d63Daniel Dunbar return "arm10tdmi"; 276b163ef7e7a5d904ef0962a7c38c460be083c4d63Daniel Dunbar if (MArch == "armv5e" || MArch == "armv5te") 277b163ef7e7a5d904ef0962a7c38c460be083c4d63Daniel Dunbar return "arm1026ejs"; 278b163ef7e7a5d904ef0962a7c38c460be083c4d63Daniel Dunbar if (MArch == "armv5tej") 27997f52ac45369f6925b548404e61d511034c874ecDaniel Dunbar return "arm926ej-s"; 280b163ef7e7a5d904ef0962a7c38c460be083c4d63Daniel Dunbar if (MArch == "armv6" || MArch == "armv6k") 281b163ef7e7a5d904ef0962a7c38c460be083c4d63Daniel Dunbar return "arm1136jf-s"; 282b163ef7e7a5d904ef0962a7c38c460be083c4d63Daniel Dunbar if (MArch == "armv6j") 283b163ef7e7a5d904ef0962a7c38c460be083c4d63Daniel Dunbar return "arm1136j-s"; 284b163ef7e7a5d904ef0962a7c38c460be083c4d63Daniel Dunbar if (MArch == "armv6z" || MArch == "armv6zk") 285b163ef7e7a5d904ef0962a7c38c460be083c4d63Daniel Dunbar return "arm1176jzf-s"; 286b163ef7e7a5d904ef0962a7c38c460be083c4d63Daniel Dunbar if (MArch == "armv6t2") 287b163ef7e7a5d904ef0962a7c38c460be083c4d63Daniel Dunbar return "arm1156t2-s"; 288b163ef7e7a5d904ef0962a7c38c460be083c4d63Daniel Dunbar if (MArch == "armv7" || MArch == "armv7a" || MArch == "armv7-a") 289b163ef7e7a5d904ef0962a7c38c460be083c4d63Daniel Dunbar return "cortex-a8"; 290b163ef7e7a5d904ef0962a7c38c460be083c4d63Daniel Dunbar if (MArch == "armv7r" || MArch == "armv7-r") 291b163ef7e7a5d904ef0962a7c38c460be083c4d63Daniel Dunbar return "cortex-r4"; 292b163ef7e7a5d904ef0962a7c38c460be083c4d63Daniel Dunbar if (MArch == "armv7m" || MArch == "armv7-m") 293b163ef7e7a5d904ef0962a7c38c460be083c4d63Daniel Dunbar return "cortex-m3"; 294b163ef7e7a5d904ef0962a7c38c460be083c4d63Daniel Dunbar if (MArch == "ep9312") 295b163ef7e7a5d904ef0962a7c38c460be083c4d63Daniel Dunbar return "ep9312"; 296b163ef7e7a5d904ef0962a7c38c460be083c4d63Daniel Dunbar if (MArch == "iwmmxt") 297b163ef7e7a5d904ef0962a7c38c460be083c4d63Daniel Dunbar return "iwmmxt"; 298b163ef7e7a5d904ef0962a7c38c460be083c4d63Daniel Dunbar if (MArch == "xscale") 299b163ef7e7a5d904ef0962a7c38c460be083c4d63Daniel Dunbar return "xscale"; 300b163ef7e7a5d904ef0962a7c38c460be083c4d63Daniel Dunbar } 301b163ef7e7a5d904ef0962a7c38c460be083c4d63Daniel Dunbar 302b163ef7e7a5d904ef0962a7c38c460be083c4d63Daniel Dunbar // Otherwise return the most base CPU LLVM supports. 303b163ef7e7a5d904ef0962a7c38c460be083c4d63Daniel Dunbar return "arm7tdmi"; 304b163ef7e7a5d904ef0962a7c38c460be083c4d63Daniel Dunbar} 305b163ef7e7a5d904ef0962a7c38c460be083c4d63Daniel Dunbar 3061d65e4be6f22f7e4b4974efbaef92fa3454f1ec8Daniel Dunbar/// getLLVMArchSuffixForARM - Get the LLVM arch name to use for a particular 307728a512753d85a6ccaae34e81385c8665c2de0e1Daniel Dunbar/// CPU. 308728a512753d85a6ccaae34e81385c8665c2de0e1Daniel Dunbar// 309728a512753d85a6ccaae34e81385c8665c2de0e1Daniel Dunbar// FIXME: This is redundant with -mcpu, why does LLVM use this. 310728a512753d85a6ccaae34e81385c8665c2de0e1Daniel Dunbar// FIXME: tblgen this, or kill it! 3111d65e4be6f22f7e4b4974efbaef92fa3454f1ec8Daniel Dunbarstatic const char *getLLVMArchSuffixForARM(llvm::StringRef CPU) { 312728a512753d85a6ccaae34e81385c8665c2de0e1Daniel Dunbar if (CPU == "arm7tdmi" || CPU == "arm7tdmi-s" || CPU == "arm710t" || 313728a512753d85a6ccaae34e81385c8665c2de0e1Daniel Dunbar CPU == "arm720t" || CPU == "arm9" || CPU == "arm9tdmi" || 314728a512753d85a6ccaae34e81385c8665c2de0e1Daniel Dunbar CPU == "arm920" || CPU == "arm920t" || CPU == "arm922t" || 315728a512753d85a6ccaae34e81385c8665c2de0e1Daniel Dunbar CPU == "arm940t" || CPU == "ep9312") 3161d65e4be6f22f7e4b4974efbaef92fa3454f1ec8Daniel Dunbar return "v4t"; 317728a512753d85a6ccaae34e81385c8665c2de0e1Daniel Dunbar 318728a512753d85a6ccaae34e81385c8665c2de0e1Daniel Dunbar if (CPU == "arm10tdmi" || CPU == "arm1020t") 3191d65e4be6f22f7e4b4974efbaef92fa3454f1ec8Daniel Dunbar return "v5"; 320728a512753d85a6ccaae34e81385c8665c2de0e1Daniel Dunbar 321728a512753d85a6ccaae34e81385c8665c2de0e1Daniel Dunbar if (CPU == "arm9e" || CPU == "arm926ej-s" || CPU == "arm946e-s" || 322728a512753d85a6ccaae34e81385c8665c2de0e1Daniel Dunbar CPU == "arm966e-s" || CPU == "arm968e-s" || CPU == "arm10e" || 323728a512753d85a6ccaae34e81385c8665c2de0e1Daniel Dunbar CPU == "arm1020e" || CPU == "arm1022e" || CPU == "xscale" || 324728a512753d85a6ccaae34e81385c8665c2de0e1Daniel Dunbar CPU == "iwmmxt") 3251d65e4be6f22f7e4b4974efbaef92fa3454f1ec8Daniel Dunbar return "v5e"; 326728a512753d85a6ccaae34e81385c8665c2de0e1Daniel Dunbar 327728a512753d85a6ccaae34e81385c8665c2de0e1Daniel Dunbar if (CPU == "arm1136j-s" || CPU == "arm1136jf-s" || CPU == "arm1176jz-s" || 328728a512753d85a6ccaae34e81385c8665c2de0e1Daniel Dunbar CPU == "arm1176jzf-s" || CPU == "mpcorenovfp" || CPU == "mpcore") 3291d65e4be6f22f7e4b4974efbaef92fa3454f1ec8Daniel Dunbar return "v6"; 330728a512753d85a6ccaae34e81385c8665c2de0e1Daniel Dunbar 331728a512753d85a6ccaae34e81385c8665c2de0e1Daniel Dunbar if (CPU == "arm1156t2-s" || CPU == "arm1156t2f-s") 3321d65e4be6f22f7e4b4974efbaef92fa3454f1ec8Daniel Dunbar return "v6t2"; 333728a512753d85a6ccaae34e81385c8665c2de0e1Daniel Dunbar 334728a512753d85a6ccaae34e81385c8665c2de0e1Daniel Dunbar if (CPU == "cortex-a8" || CPU == "cortex-a9") 3351d65e4be6f22f7e4b4974efbaef92fa3454f1ec8Daniel Dunbar return "v7"; 336728a512753d85a6ccaae34e81385c8665c2de0e1Daniel Dunbar 3371d65e4be6f22f7e4b4974efbaef92fa3454f1ec8Daniel Dunbar return ""; 338728a512753d85a6ccaae34e81385c8665c2de0e1Daniel Dunbar} 339728a512753d85a6ccaae34e81385c8665c2de0e1Daniel Dunbar 340728a512753d85a6ccaae34e81385c8665c2de0e1Daniel Dunbar/// getLLVMTriple - Get the LLVM triple to use for a particular toolchain, which 341728a512753d85a6ccaae34e81385c8665c2de0e1Daniel Dunbar/// may depend on command line arguments. 342728a512753d85a6ccaae34e81385c8665c2de0e1Daniel Dunbarstatic std::string getLLVMTriple(const ToolChain &TC, const ArgList &Args) { 343728a512753d85a6ccaae34e81385c8665c2de0e1Daniel Dunbar switch (TC.getTriple().getArch()) { 344728a512753d85a6ccaae34e81385c8665c2de0e1Daniel Dunbar default: 345728a512753d85a6ccaae34e81385c8665c2de0e1Daniel Dunbar return TC.getTripleString(); 346728a512753d85a6ccaae34e81385c8665c2de0e1Daniel Dunbar 347728a512753d85a6ccaae34e81385c8665c2de0e1Daniel Dunbar case llvm::Triple::arm: 348728a512753d85a6ccaae34e81385c8665c2de0e1Daniel Dunbar case llvm::Triple::thumb: { 349f4aa4f61de7d364364dc94bbf83ff71448a11327Daniel Dunbar // FIXME: Factor into subclasses. 350728a512753d85a6ccaae34e81385c8665c2de0e1Daniel Dunbar llvm::Triple Triple = TC.getTriple(); 351f4aa4f61de7d364364dc94bbf83ff71448a11327Daniel Dunbar 352f4aa4f61de7d364364dc94bbf83ff71448a11327Daniel Dunbar // Thumb2 is the default for V7 on Darwin. 353f4aa4f61de7d364364dc94bbf83ff71448a11327Daniel Dunbar // 354f4aa4f61de7d364364dc94bbf83ff71448a11327Daniel Dunbar // FIXME: Thumb should just be another -target-feaure, not in the triple. 355f4aa4f61de7d364364dc94bbf83ff71448a11327Daniel Dunbar llvm::StringRef Suffix = getLLVMArchSuffixForARM(getARMTargetCPU(Args)); 356f4aa4f61de7d364364dc94bbf83ff71448a11327Daniel Dunbar bool ThumbDefault = 357f4aa4f61de7d364364dc94bbf83ff71448a11327Daniel Dunbar (Suffix == "v7" && TC.getTriple().getOS() == llvm::Triple::Darwin); 3581d65e4be6f22f7e4b4974efbaef92fa3454f1ec8Daniel Dunbar std::string ArchName = "arm"; 359f4aa4f61de7d364364dc94bbf83ff71448a11327Daniel Dunbar if (Args.hasFlag(options::OPT_mthumb, options::OPT_mno_thumb, ThumbDefault)) 360f4aa4f61de7d364364dc94bbf83ff71448a11327Daniel Dunbar ArchName = "thumb"; 361f4aa4f61de7d364364dc94bbf83ff71448a11327Daniel Dunbar Triple.setArchName(ArchName + Suffix.str()); 362f4aa4f61de7d364364dc94bbf83ff71448a11327Daniel Dunbar 363728a512753d85a6ccaae34e81385c8665c2de0e1Daniel Dunbar return Triple.getTriple(); 364728a512753d85a6ccaae34e81385c8665c2de0e1Daniel Dunbar } 365728a512753d85a6ccaae34e81385c8665c2de0e1Daniel Dunbar } 366728a512753d85a6ccaae34e81385c8665c2de0e1Daniel Dunbar} 367728a512753d85a6ccaae34e81385c8665c2de0e1Daniel Dunbar 3681f95e6567faab67f4363d650f73121359c4bdbabDaniel Dunbar// FIXME: Move to target hook. 3691f95e6567faab67f4363d650f73121359c4bdbabDaniel Dunbarstatic bool isSignedCharDefault(const llvm::Triple &Triple) { 3701f95e6567faab67f4363d650f73121359c4bdbabDaniel Dunbar switch (Triple.getArch()) { 3711f95e6567faab67f4363d650f73121359c4bdbabDaniel Dunbar default: 3721f95e6567faab67f4363d650f73121359c4bdbabDaniel Dunbar return true; 3731f95e6567faab67f4363d650f73121359c4bdbabDaniel Dunbar 3741f95e6567faab67f4363d650f73121359c4bdbabDaniel Dunbar case llvm::Triple::ppc: 3751f95e6567faab67f4363d650f73121359c4bdbabDaniel Dunbar case llvm::Triple::ppc64: 3761f95e6567faab67f4363d650f73121359c4bdbabDaniel Dunbar if (Triple.getOS() == llvm::Triple::Darwin) 3771f95e6567faab67f4363d650f73121359c4bdbabDaniel Dunbar return true; 3781f95e6567faab67f4363d650f73121359c4bdbabDaniel Dunbar return false; 3791f95e6567faab67f4363d650f73121359c4bdbabDaniel Dunbar 3801f95e6567faab67f4363d650f73121359c4bdbabDaniel Dunbar case llvm::Triple::systemz: 3811f95e6567faab67f4363d650f73121359c4bdbabDaniel Dunbar return false; 3821f95e6567faab67f4363d650f73121359c4bdbabDaniel Dunbar } 3831f95e6567faab67f4363d650f73121359c4bdbabDaniel Dunbar} 3841f95e6567faab67f4363d650f73121359c4bdbabDaniel Dunbar 385b163ef7e7a5d904ef0962a7c38c460be083c4d63Daniel Dunbarvoid Clang::AddARMTargetArgs(const ArgList &Args, 386b163ef7e7a5d904ef0962a7c38c460be083c4d63Daniel Dunbar ArgStringList &CmdArgs) const { 387ee788e70fcd0adf76103b17c78ac658d4ea30c9bDaniel Dunbar const Driver &D = getToolChain().getDriver(); 388cbd1933f83e2332b2d7add10459f80cc4e7eb7bfDaniel Dunbar 3892030d8f46b4226fa99e59389e3ca856a79c27e9aDaniel Dunbar // Select the ABI to use. 3902030d8f46b4226fa99e59389e3ca856a79c27e9aDaniel Dunbar // 3912030d8f46b4226fa99e59389e3ca856a79c27e9aDaniel Dunbar // FIXME: Support -meabi. 3922030d8f46b4226fa99e59389e3ca856a79c27e9aDaniel Dunbar const char *ABIName = 0; 3932030d8f46b4226fa99e59389e3ca856a79c27e9aDaniel Dunbar if (Arg *A = Args.getLastArg(options::OPT_mabi_EQ)) { 3942030d8f46b4226fa99e59389e3ca856a79c27e9aDaniel Dunbar ABIName = A->getValue(Args); 3952030d8f46b4226fa99e59389e3ca856a79c27e9aDaniel Dunbar } else { 3962030d8f46b4226fa99e59389e3ca856a79c27e9aDaniel Dunbar // Select the default based on the platform. 3972030d8f46b4226fa99e59389e3ca856a79c27e9aDaniel Dunbar switch (getToolChain().getTriple().getOS()) { 3982030d8f46b4226fa99e59389e3ca856a79c27e9aDaniel Dunbar // FIXME: Is this right for non-Darwin and non-Linux? 3992030d8f46b4226fa99e59389e3ca856a79c27e9aDaniel Dunbar default: 4002030d8f46b4226fa99e59389e3ca856a79c27e9aDaniel Dunbar ABIName = "aapcs"; 4012030d8f46b4226fa99e59389e3ca856a79c27e9aDaniel Dunbar break; 4022030d8f46b4226fa99e59389e3ca856a79c27e9aDaniel Dunbar 4032030d8f46b4226fa99e59389e3ca856a79c27e9aDaniel Dunbar case llvm::Triple::Darwin: 4042030d8f46b4226fa99e59389e3ca856a79c27e9aDaniel Dunbar ABIName = "apcs-gnu"; 4052030d8f46b4226fa99e59389e3ca856a79c27e9aDaniel Dunbar break; 4062030d8f46b4226fa99e59389e3ca856a79c27e9aDaniel Dunbar 4072030d8f46b4226fa99e59389e3ca856a79c27e9aDaniel Dunbar case llvm::Triple::Linux: 4082030d8f46b4226fa99e59389e3ca856a79c27e9aDaniel Dunbar ABIName = "aapcs-linux"; 4092030d8f46b4226fa99e59389e3ca856a79c27e9aDaniel Dunbar break; 4102030d8f46b4226fa99e59389e3ca856a79c27e9aDaniel Dunbar } 4112030d8f46b4226fa99e59389e3ca856a79c27e9aDaniel Dunbar } 4122030d8f46b4226fa99e59389e3ca856a79c27e9aDaniel Dunbar CmdArgs.push_back("-target-abi"); 4132030d8f46b4226fa99e59389e3ca856a79c27e9aDaniel Dunbar CmdArgs.push_back(ABIName); 4142030d8f46b4226fa99e59389e3ca856a79c27e9aDaniel Dunbar 415b163ef7e7a5d904ef0962a7c38c460be083c4d63Daniel Dunbar // Set the CPU based on -march= and -mcpu=. 41638b48afd338d494099697d2611e1f45e558e469eDaniel Dunbar CmdArgs.push_back("-target-cpu"); 417a31100e62f83933432df9092a04e48f9e5561a14Daniel Dunbar CmdArgs.push_back(getARMTargetCPU(Args)); 418b163ef7e7a5d904ef0962a7c38c460be083c4d63Daniel Dunbar 419cbd1933f83e2332b2d7add10459f80cc4e7eb7bfDaniel Dunbar // Select the float ABI as determined by -msoft-float, -mhard-float, and 420cbd1933f83e2332b2d7add10459f80cc4e7eb7bfDaniel Dunbar // -mfloat-abi=. 421cbd1933f83e2332b2d7add10459f80cc4e7eb7bfDaniel Dunbar llvm::StringRef FloatABI; 422cbd1933f83e2332b2d7add10459f80cc4e7eb7bfDaniel Dunbar if (Arg *A = Args.getLastArg(options::OPT_msoft_float, 423cbd1933f83e2332b2d7add10459f80cc4e7eb7bfDaniel Dunbar options::OPT_mhard_float, 424cbd1933f83e2332b2d7add10459f80cc4e7eb7bfDaniel Dunbar options::OPT_mfloat_abi_EQ)) { 425cbd1933f83e2332b2d7add10459f80cc4e7eb7bfDaniel Dunbar if (A->getOption().matches(options::OPT_msoft_float)) 426cbd1933f83e2332b2d7add10459f80cc4e7eb7bfDaniel Dunbar FloatABI = "soft"; 427cbd1933f83e2332b2d7add10459f80cc4e7eb7bfDaniel Dunbar else if (A->getOption().matches(options::OPT_mhard_float)) 428cbd1933f83e2332b2d7add10459f80cc4e7eb7bfDaniel Dunbar FloatABI = "hard"; 429cbd1933f83e2332b2d7add10459f80cc4e7eb7bfDaniel Dunbar else { 430cbd1933f83e2332b2d7add10459f80cc4e7eb7bfDaniel Dunbar FloatABI = A->getValue(Args); 431cbd1933f83e2332b2d7add10459f80cc4e7eb7bfDaniel Dunbar if (FloatABI != "soft" && FloatABI != "softfp" && FloatABI != "hard") { 432cbd1933f83e2332b2d7add10459f80cc4e7eb7bfDaniel Dunbar D.Diag(clang::diag::err_drv_invalid_mfloat_abi) 433cbd1933f83e2332b2d7add10459f80cc4e7eb7bfDaniel Dunbar << A->getAsString(Args); 434cbd1933f83e2332b2d7add10459f80cc4e7eb7bfDaniel Dunbar FloatABI = "soft"; 435cbd1933f83e2332b2d7add10459f80cc4e7eb7bfDaniel Dunbar } 436cbd1933f83e2332b2d7add10459f80cc4e7eb7bfDaniel Dunbar } 437cbd1933f83e2332b2d7add10459f80cc4e7eb7bfDaniel Dunbar } 438cbd1933f83e2332b2d7add10459f80cc4e7eb7bfDaniel Dunbar 439cbd1933f83e2332b2d7add10459f80cc4e7eb7bfDaniel Dunbar // If unspecified, choose the default based on the platform. 440cbd1933f83e2332b2d7add10459f80cc4e7eb7bfDaniel Dunbar if (FloatABI.empty()) { 441cbd1933f83e2332b2d7add10459f80cc4e7eb7bfDaniel Dunbar // FIXME: This is wrong for non-Darwin, we don't have a mechanism yet for 442cbd1933f83e2332b2d7add10459f80cc4e7eb7bfDaniel Dunbar // distinguishing things like linux-eabi vs linux-elf. 443cbd1933f83e2332b2d7add10459f80cc4e7eb7bfDaniel Dunbar switch (getToolChain().getTriple().getOS()) { 444cbd1933f83e2332b2d7add10459f80cc4e7eb7bfDaniel Dunbar case llvm::Triple::Darwin: { 445cbd1933f83e2332b2d7add10459f80cc4e7eb7bfDaniel Dunbar // Darwin defaults to "softfp" for v6 and v7. 446cbd1933f83e2332b2d7add10459f80cc4e7eb7bfDaniel Dunbar // 447cbd1933f83e2332b2d7add10459f80cc4e7eb7bfDaniel Dunbar // FIXME: Factor out an ARM class so we can cache the arch somewhere. 448cbd1933f83e2332b2d7add10459f80cc4e7eb7bfDaniel Dunbar llvm::StringRef ArchName = getLLVMArchSuffixForARM(getARMTargetCPU(Args)); 449cbd1933f83e2332b2d7add10459f80cc4e7eb7bfDaniel Dunbar if (ArchName.startswith("v6") || ArchName.startswith("v7")) 450cbd1933f83e2332b2d7add10459f80cc4e7eb7bfDaniel Dunbar FloatABI = "softfp"; 451cbd1933f83e2332b2d7add10459f80cc4e7eb7bfDaniel Dunbar else 452cbd1933f83e2332b2d7add10459f80cc4e7eb7bfDaniel Dunbar FloatABI = "soft"; 453cbd1933f83e2332b2d7add10459f80cc4e7eb7bfDaniel Dunbar break; 454cbd1933f83e2332b2d7add10459f80cc4e7eb7bfDaniel Dunbar } 455cbd1933f83e2332b2d7add10459f80cc4e7eb7bfDaniel Dunbar 456cbd1933f83e2332b2d7add10459f80cc4e7eb7bfDaniel Dunbar default: 457cbd1933f83e2332b2d7add10459f80cc4e7eb7bfDaniel Dunbar // Assume "soft", but warn the user we are guessing. 458cbd1933f83e2332b2d7add10459f80cc4e7eb7bfDaniel Dunbar FloatABI = "soft"; 459cbd1933f83e2332b2d7add10459f80cc4e7eb7bfDaniel Dunbar D.Diag(clang::diag::warn_drv_assuming_mfloat_abi_is) << "soft"; 460cbd1933f83e2332b2d7add10459f80cc4e7eb7bfDaniel Dunbar break; 461cbd1933f83e2332b2d7add10459f80cc4e7eb7bfDaniel Dunbar } 462cbd1933f83e2332b2d7add10459f80cc4e7eb7bfDaniel Dunbar } 463cbd1933f83e2332b2d7add10459f80cc4e7eb7bfDaniel Dunbar 464cbd1933f83e2332b2d7add10459f80cc4e7eb7bfDaniel Dunbar if (FloatABI == "soft") { 465cbd1933f83e2332b2d7add10459f80cc4e7eb7bfDaniel Dunbar // Floating point operations and argument passing are soft. 466cbd1933f83e2332b2d7add10459f80cc4e7eb7bfDaniel Dunbar // 467cbd1933f83e2332b2d7add10459f80cc4e7eb7bfDaniel Dunbar // FIXME: This changes CPP defines, we need -target-soft-float. 4683b315264d1a6fa303e20fe0caec306ccafc090deDaniel Dunbar CmdArgs.push_back("-msoft-float"); 46987667aafe68c366be57f5afb60428237593da0edDaniel Dunbar CmdArgs.push_back("-mfloat-abi"); 47087667aafe68c366be57f5afb60428237593da0edDaniel Dunbar CmdArgs.push_back("soft"); 471cbd1933f83e2332b2d7add10459f80cc4e7eb7bfDaniel Dunbar } else if (FloatABI == "softfp") { 472cbd1933f83e2332b2d7add10459f80cc4e7eb7bfDaniel Dunbar // Floating point operations are hard, but argument passing is soft. 47387667aafe68c366be57f5afb60428237593da0edDaniel Dunbar CmdArgs.push_back("-mfloat-abi"); 47487667aafe68c366be57f5afb60428237593da0edDaniel Dunbar CmdArgs.push_back("soft"); 475cbd1933f83e2332b2d7add10459f80cc4e7eb7bfDaniel Dunbar } else { 476cbd1933f83e2332b2d7add10459f80cc4e7eb7bfDaniel Dunbar // Floating point operations and argument passing are hard. 477cbd1933f83e2332b2d7add10459f80cc4e7eb7bfDaniel Dunbar assert(FloatABI == "hard" && "Invalid float abi!"); 47887667aafe68c366be57f5afb60428237593da0edDaniel Dunbar CmdArgs.push_back("-mfloat-abi"); 47987667aafe68c366be57f5afb60428237593da0edDaniel Dunbar CmdArgs.push_back("hard"); 480cbd1933f83e2332b2d7add10459f80cc4e7eb7bfDaniel Dunbar } 48197f52ac45369f6925b548404e61d511034c874ecDaniel Dunbar 48297f52ac45369f6925b548404e61d511034c874ecDaniel Dunbar // Set appropriate target features for floating point mode. 48397f52ac45369f6925b548404e61d511034c874ecDaniel Dunbar // 48497f52ac45369f6925b548404e61d511034c874ecDaniel Dunbar // FIXME: Note, this is a hack, the LLVM backend doesn't actually use these 48597f52ac45369f6925b548404e61d511034c874ecDaniel Dunbar // yet (it uses the -mfloat-abi and -msoft-float options above), and it is 48697f52ac45369f6925b548404e61d511034c874ecDaniel Dunbar // stripped out by the ARM target. 48797f52ac45369f6925b548404e61d511034c874ecDaniel Dunbar 48897f52ac45369f6925b548404e61d511034c874ecDaniel Dunbar // Use software floating point operations? 48997f52ac45369f6925b548404e61d511034c874ecDaniel Dunbar if (FloatABI == "soft") { 49097f52ac45369f6925b548404e61d511034c874ecDaniel Dunbar CmdArgs.push_back("-target-feature"); 49197f52ac45369f6925b548404e61d511034c874ecDaniel Dunbar CmdArgs.push_back("+soft-float"); 49297f52ac45369f6925b548404e61d511034c874ecDaniel Dunbar } 49397f52ac45369f6925b548404e61d511034c874ecDaniel Dunbar 49497f52ac45369f6925b548404e61d511034c874ecDaniel Dunbar // Use software floating point argument passing? 49597f52ac45369f6925b548404e61d511034c874ecDaniel Dunbar if (FloatABI != "hard") { 49697f52ac45369f6925b548404e61d511034c874ecDaniel Dunbar CmdArgs.push_back("-target-feature"); 49797f52ac45369f6925b548404e61d511034c874ecDaniel Dunbar CmdArgs.push_back("+soft-float-abi"); 49897f52ac45369f6925b548404e61d511034c874ecDaniel Dunbar } 499a91320b8af7143f7af4c0665ffa62a3b244c0bd9Daniel Dunbar 500a91320b8af7143f7af4c0665ffa62a3b244c0bd9Daniel Dunbar // Honor -mfpu=. 501a91320b8af7143f7af4c0665ffa62a3b244c0bd9Daniel Dunbar // 502a91320b8af7143f7af4c0665ffa62a3b244c0bd9Daniel Dunbar // FIXME: Centralize feature selection, defaulting shouldn't be also in the 503a91320b8af7143f7af4c0665ffa62a3b244c0bd9Daniel Dunbar // frontend target. 504a91320b8af7143f7af4c0665ffa62a3b244c0bd9Daniel Dunbar if (const Arg *A = Args.getLastArg(options::OPT_mfpu_EQ)) { 505a91320b8af7143f7af4c0665ffa62a3b244c0bd9Daniel Dunbar llvm::StringRef FPU = A->getValue(Args); 506a91320b8af7143f7af4c0665ffa62a3b244c0bd9Daniel Dunbar 507a91320b8af7143f7af4c0665ffa62a3b244c0bd9Daniel Dunbar // Set the target features based on the FPU. 508a91320b8af7143f7af4c0665ffa62a3b244c0bd9Daniel Dunbar if (FPU == "fpa" || FPU == "fpe2" || FPU == "fpe3" || FPU == "maverick") { 509a91320b8af7143f7af4c0665ffa62a3b244c0bd9Daniel Dunbar // Disable any default FPU support. 510a91320b8af7143f7af4c0665ffa62a3b244c0bd9Daniel Dunbar CmdArgs.push_back("-target-feature"); 511a91320b8af7143f7af4c0665ffa62a3b244c0bd9Daniel Dunbar CmdArgs.push_back("-vfp2"); 512a91320b8af7143f7af4c0665ffa62a3b244c0bd9Daniel Dunbar CmdArgs.push_back("-target-feature"); 513a91320b8af7143f7af4c0665ffa62a3b244c0bd9Daniel Dunbar CmdArgs.push_back("-vfp3"); 514a91320b8af7143f7af4c0665ffa62a3b244c0bd9Daniel Dunbar CmdArgs.push_back("-target-feature"); 515a91320b8af7143f7af4c0665ffa62a3b244c0bd9Daniel Dunbar CmdArgs.push_back("-neon"); 516a91320b8af7143f7af4c0665ffa62a3b244c0bd9Daniel Dunbar } else if (FPU == "vfp") { 517a91320b8af7143f7af4c0665ffa62a3b244c0bd9Daniel Dunbar CmdArgs.push_back("-target-feature"); 518a91320b8af7143f7af4c0665ffa62a3b244c0bd9Daniel Dunbar CmdArgs.push_back("+vfp2"); 519a91320b8af7143f7af4c0665ffa62a3b244c0bd9Daniel Dunbar } else if (FPU == "vfp3") { 520a91320b8af7143f7af4c0665ffa62a3b244c0bd9Daniel Dunbar CmdArgs.push_back("-target-feature"); 521a91320b8af7143f7af4c0665ffa62a3b244c0bd9Daniel Dunbar CmdArgs.push_back("+vfp3"); 522a91320b8af7143f7af4c0665ffa62a3b244c0bd9Daniel Dunbar } else if (FPU == "neon") { 523a91320b8af7143f7af4c0665ffa62a3b244c0bd9Daniel Dunbar CmdArgs.push_back("-target-feature"); 524a91320b8af7143f7af4c0665ffa62a3b244c0bd9Daniel Dunbar CmdArgs.push_back("+neon"); 525a91320b8af7143f7af4c0665ffa62a3b244c0bd9Daniel Dunbar } else 526a91320b8af7143f7af4c0665ffa62a3b244c0bd9Daniel Dunbar D.Diag(clang::diag::err_drv_clang_unsupported) << A->getAsString(Args); 527a91320b8af7143f7af4c0665ffa62a3b244c0bd9Daniel Dunbar } 528b163ef7e7a5d904ef0962a7c38c460be083c4d63Daniel Dunbar} 529b163ef7e7a5d904ef0962a7c38c460be083c4d63Daniel Dunbar 530ed734737d5af31906e30e537d4a41c760ddcfc59Eric Christophervoid Clang::AddMIPSTargetArgs(const ArgList &Args, 531ed734737d5af31906e30e537d4a41c760ddcfc59Eric Christopher ArgStringList &CmdArgs) const { 532ed734737d5af31906e30e537d4a41c760ddcfc59Eric Christopher const Driver &D = getToolChain().getDriver(); 533ed734737d5af31906e30e537d4a41c760ddcfc59Eric Christopher 534ed734737d5af31906e30e537d4a41c760ddcfc59Eric Christopher // Select the ABI to use. 535ed734737d5af31906e30e537d4a41c760ddcfc59Eric Christopher const char *ABIName = 0; 536ed734737d5af31906e30e537d4a41c760ddcfc59Eric Christopher if (Arg *A = Args.getLastArg(options::OPT_mabi_EQ)) { 537ed734737d5af31906e30e537d4a41c760ddcfc59Eric Christopher ABIName = A->getValue(Args); 538ed734737d5af31906e30e537d4a41c760ddcfc59Eric Christopher } else { 539ed734737d5af31906e30e537d4a41c760ddcfc59Eric Christopher ABIName = "o32"; 540ed734737d5af31906e30e537d4a41c760ddcfc59Eric Christopher } 541ed734737d5af31906e30e537d4a41c760ddcfc59Eric Christopher 542ed734737d5af31906e30e537d4a41c760ddcfc59Eric Christopher CmdArgs.push_back("-target-abi"); 543ed734737d5af31906e30e537d4a41c760ddcfc59Eric Christopher CmdArgs.push_back(ABIName); 544ed734737d5af31906e30e537d4a41c760ddcfc59Eric Christopher 545ed734737d5af31906e30e537d4a41c760ddcfc59Eric Christopher if (const Arg *A = Args.getLastArg(options::OPT_march_EQ)) { 546ed734737d5af31906e30e537d4a41c760ddcfc59Eric Christopher llvm::StringRef MArch = A->getValue(Args); 547ed734737d5af31906e30e537d4a41c760ddcfc59Eric Christopher CmdArgs.push_back("-target-cpu"); 548ed734737d5af31906e30e537d4a41c760ddcfc59Eric Christopher 549ed734737d5af31906e30e537d4a41c760ddcfc59Eric Christopher if ((MArch == "r2000") || (MArch == "r3000")) 550ed734737d5af31906e30e537d4a41c760ddcfc59Eric Christopher CmdArgs.push_back("mips1"); 551ed734737d5af31906e30e537d4a41c760ddcfc59Eric Christopher else if (MArch == "r6000") 552ed734737d5af31906e30e537d4a41c760ddcfc59Eric Christopher CmdArgs.push_back("mips2"); 553ed734737d5af31906e30e537d4a41c760ddcfc59Eric Christopher else 554ed734737d5af31906e30e537d4a41c760ddcfc59Eric Christopher CmdArgs.push_back(MArch.str().c_str()); 555ed734737d5af31906e30e537d4a41c760ddcfc59Eric Christopher } 556ed734737d5af31906e30e537d4a41c760ddcfc59Eric Christopher 557ed734737d5af31906e30e537d4a41c760ddcfc59Eric Christopher // Select the float ABI as determined by -msoft-float, -mhard-float, and 558ed734737d5af31906e30e537d4a41c760ddcfc59Eric Christopher llvm::StringRef FloatABI; 559ed734737d5af31906e30e537d4a41c760ddcfc59Eric Christopher if (Arg *A = Args.getLastArg(options::OPT_msoft_float, 560ed734737d5af31906e30e537d4a41c760ddcfc59Eric Christopher options::OPT_mhard_float)) { 561ed734737d5af31906e30e537d4a41c760ddcfc59Eric Christopher if (A->getOption().matches(options::OPT_msoft_float)) 562ed734737d5af31906e30e537d4a41c760ddcfc59Eric Christopher FloatABI = "soft"; 563ed734737d5af31906e30e537d4a41c760ddcfc59Eric Christopher else if (A->getOption().matches(options::OPT_mhard_float)) 564ed734737d5af31906e30e537d4a41c760ddcfc59Eric Christopher FloatABI = "hard"; 565ed734737d5af31906e30e537d4a41c760ddcfc59Eric Christopher } 566ed734737d5af31906e30e537d4a41c760ddcfc59Eric Christopher 567ed734737d5af31906e30e537d4a41c760ddcfc59Eric Christopher // If unspecified, choose the default based on the platform. 568ed734737d5af31906e30e537d4a41c760ddcfc59Eric Christopher if (FloatABI.empty()) { 56971c972acd4a2cb5e369e35471dbb719185913cdcBenjamin Kramer // Assume "soft", but warn the user we are guessing. 57071c972acd4a2cb5e369e35471dbb719185913cdcBenjamin Kramer FloatABI = "soft"; 57171c972acd4a2cb5e369e35471dbb719185913cdcBenjamin Kramer D.Diag(clang::diag::warn_drv_assuming_mfloat_abi_is) << "soft"; 572ed734737d5af31906e30e537d4a41c760ddcfc59Eric Christopher } 573ed734737d5af31906e30e537d4a41c760ddcfc59Eric Christopher 574ed734737d5af31906e30e537d4a41c760ddcfc59Eric Christopher if (FloatABI == "soft") { 575ed734737d5af31906e30e537d4a41c760ddcfc59Eric Christopher // Floating point operations and argument passing are soft. 576ed734737d5af31906e30e537d4a41c760ddcfc59Eric Christopher // 577ed734737d5af31906e30e537d4a41c760ddcfc59Eric Christopher // FIXME: This changes CPP defines, we need -target-soft-float. 578ed734737d5af31906e30e537d4a41c760ddcfc59Eric Christopher CmdArgs.push_back("-msoft-float"); 579ed734737d5af31906e30e537d4a41c760ddcfc59Eric Christopher } else { 580ed734737d5af31906e30e537d4a41c760ddcfc59Eric Christopher assert(FloatABI == "hard" && "Invalid float abi!"); 581ed734737d5af31906e30e537d4a41c760ddcfc59Eric Christopher CmdArgs.push_back("-mhard-float"); 582ed734737d5af31906e30e537d4a41c760ddcfc59Eric Christopher } 583ed734737d5af31906e30e537d4a41c760ddcfc59Eric Christopher} 584ed734737d5af31906e30e537d4a41c760ddcfc59Eric Christopher 5856acda16e9c194dcbd0dea64341e182bdb65d0f41Daniel Dunbarvoid Clang::AddX86TargetArgs(const ArgList &Args, 5866acda16e9c194dcbd0dea64341e182bdb65d0f41Daniel Dunbar ArgStringList &CmdArgs) const { 587e6ad3f9fceef0ecc422ff26754ea069a5fd18c69Daniel Dunbar if (!Args.hasFlag(options::OPT_mred_zone, 588e6ad3f9fceef0ecc422ff26754ea069a5fd18c69Daniel Dunbar options::OPT_mno_red_zone, 589e6ad3f9fceef0ecc422ff26754ea069a5fd18c69Daniel Dunbar true) || 590e6ad3f9fceef0ecc422ff26754ea069a5fd18c69Daniel Dunbar Args.hasArg(options::OPT_mkernel) || 591e6ad3f9fceef0ecc422ff26754ea069a5fd18c69Daniel Dunbar Args.hasArg(options::OPT_fapple_kext)) 59266861e09d590994a8b941eaa328e4d8f33adec9eDaniel Dunbar CmdArgs.push_back("-disable-red-zone"); 593e6ad3f9fceef0ecc422ff26754ea069a5fd18c69Daniel Dunbar 594e6ad3f9fceef0ecc422ff26754ea069a5fd18c69Daniel Dunbar if (Args.hasFlag(options::OPT_msoft_float, 595e6ad3f9fceef0ecc422ff26754ea069a5fd18c69Daniel Dunbar options::OPT_mno_soft_float, 596e6ad3f9fceef0ecc422ff26754ea069a5fd18c69Daniel Dunbar false)) 59766861e09d590994a8b941eaa328e4d8f33adec9eDaniel Dunbar CmdArgs.push_back("-no-implicit-float"); 598e6ad3f9fceef0ecc422ff26754ea069a5fd18c69Daniel Dunbar 599f86feddbd5b13d2c144132e35d608fa630784dbbDaniel Dunbar const char *CPUName = 0; 6006acda16e9c194dcbd0dea64341e182bdb65d0f41Daniel Dunbar if (const Arg *A = Args.getLastArg(options::OPT_march_EQ)) { 601f86feddbd5b13d2c144132e35d608fa630784dbbDaniel Dunbar if (llvm::StringRef(A->getValue(Args)) == "native") { 602f86feddbd5b13d2c144132e35d608fa630784dbbDaniel Dunbar // FIXME: Reject attempts to use -march=native unless the target matches 603f86feddbd5b13d2c144132e35d608fa630784dbbDaniel Dunbar // the host. 604f86feddbd5b13d2c144132e35d608fa630784dbbDaniel Dunbar // 605f86feddbd5b13d2c144132e35d608fa630784dbbDaniel Dunbar // FIXME: We should also incorporate the detected target features for use 606f86feddbd5b13d2c144132e35d608fa630784dbbDaniel Dunbar // with -native. 607f86feddbd5b13d2c144132e35d608fa630784dbbDaniel Dunbar std::string CPU = llvm::sys::getHostCPUName(); 608f86feddbd5b13d2c144132e35d608fa630784dbbDaniel Dunbar if (!CPU.empty()) 609f86feddbd5b13d2c144132e35d608fa630784dbbDaniel Dunbar CPUName = Args.MakeArgString(CPU); 610f86feddbd5b13d2c144132e35d608fa630784dbbDaniel Dunbar } else 611f86feddbd5b13d2c144132e35d608fa630784dbbDaniel Dunbar CPUName = A->getValue(Args); 612f86feddbd5b13d2c144132e35d608fa630784dbbDaniel Dunbar } 6136acda16e9c194dcbd0dea64341e182bdb65d0f41Daniel Dunbar 614f86feddbd5b13d2c144132e35d608fa630784dbbDaniel Dunbar // Select the default CPU if none was given (or detection failed). 615f86feddbd5b13d2c144132e35d608fa630784dbbDaniel Dunbar if (!CPUName) { 6166acda16e9c194dcbd0dea64341e182bdb65d0f41Daniel Dunbar // FIXME: Need target hooks. 617f22d1fd96d6056a2f271b0f7353b31f47547127bBenjamin Kramer if (getToolChain().getOS().startswith("darwin")) { 6186acda16e9c194dcbd0dea64341e182bdb65d0f41Daniel Dunbar if (getToolChain().getArchName() == "x86_64") 619f86feddbd5b13d2c144132e35d608fa630784dbbDaniel Dunbar CPUName = "core2"; 6206acda16e9c194dcbd0dea64341e182bdb65d0f41Daniel Dunbar else if (getToolChain().getArchName() == "i386") 621f86feddbd5b13d2c144132e35d608fa630784dbbDaniel Dunbar CPUName = "yonah"; 6226acda16e9c194dcbd0dea64341e182bdb65d0f41Daniel Dunbar } else { 6236acda16e9c194dcbd0dea64341e182bdb65d0f41Daniel Dunbar if (getToolChain().getArchName() == "x86_64") 624f86feddbd5b13d2c144132e35d608fa630784dbbDaniel Dunbar CPUName = "x86-64"; 6256acda16e9c194dcbd0dea64341e182bdb65d0f41Daniel Dunbar else if (getToolChain().getArchName() == "i386") 626f86feddbd5b13d2c144132e35d608fa630784dbbDaniel Dunbar CPUName = "pentium4"; 6276acda16e9c194dcbd0dea64341e182bdb65d0f41Daniel Dunbar } 6286acda16e9c194dcbd0dea64341e182bdb65d0f41Daniel Dunbar } 6296acda16e9c194dcbd0dea64341e182bdb65d0f41Daniel Dunbar 630f86feddbd5b13d2c144132e35d608fa630784dbbDaniel Dunbar if (CPUName) { 63138b48afd338d494099697d2611e1f45e558e469eDaniel Dunbar CmdArgs.push_back("-target-cpu"); 632f86feddbd5b13d2c144132e35d608fa630784dbbDaniel Dunbar CmdArgs.push_back(CPUName); 633f86feddbd5b13d2c144132e35d608fa630784dbbDaniel Dunbar } 634f86feddbd5b13d2c144132e35d608fa630784dbbDaniel Dunbar 635cdd9686b890ebdc10039ae256ef4c9dfb5ebacb7Daniel Dunbar for (arg_iterator it = Args.filtered_begin(options::OPT_m_x86_Features_Group), 636cdd9686b890ebdc10039ae256ef4c9dfb5ebacb7Daniel Dunbar ie = Args.filtered_end(); it != ie; ++it) { 637cdd9686b890ebdc10039ae256ef4c9dfb5ebacb7Daniel Dunbar llvm::StringRef Name = it->getOption().getName(); 638cdd9686b890ebdc10039ae256ef4c9dfb5ebacb7Daniel Dunbar it->claim(); 6396acda16e9c194dcbd0dea64341e182bdb65d0f41Daniel Dunbar 640cdd9686b890ebdc10039ae256ef4c9dfb5ebacb7Daniel Dunbar // Skip over "-m". 641cdd9686b890ebdc10039ae256ef4c9dfb5ebacb7Daniel Dunbar assert(Name.startswith("-m") && "Invalid feature name."); 642cdd9686b890ebdc10039ae256ef4c9dfb5ebacb7Daniel Dunbar Name = Name.substr(2); 6436acda16e9c194dcbd0dea64341e182bdb65d0f41Daniel Dunbar 644cdd9686b890ebdc10039ae256ef4c9dfb5ebacb7Daniel Dunbar bool IsNegative = Name.startswith("no-"); 645cdd9686b890ebdc10039ae256ef4c9dfb5ebacb7Daniel Dunbar if (IsNegative) 646cdd9686b890ebdc10039ae256ef4c9dfb5ebacb7Daniel Dunbar Name = Name.substr(3); 6476acda16e9c194dcbd0dea64341e182bdb65d0f41Daniel Dunbar 648cdd9686b890ebdc10039ae256ef4c9dfb5ebacb7Daniel Dunbar CmdArgs.push_back("-target-feature"); 649cdd9686b890ebdc10039ae256ef4c9dfb5ebacb7Daniel Dunbar CmdArgs.push_back(Args.MakeArgString((IsNegative ? "-" : "+") + Name)); 6506acda16e9c194dcbd0dea64341e182bdb65d0f41Daniel Dunbar } 6516acda16e9c194dcbd0dea64341e182bdb65d0f41Daniel Dunbar} 6526acda16e9c194dcbd0dea64341e182bdb65d0f41Daniel Dunbar 65385caf03ee49c4de87ee9624a9b725ef5d20ee624Fariborz Jahanianstatic bool needsExceptions(const ArgList &Args, types::ID InputType, 65485caf03ee49c4de87ee9624a9b725ef5d20ee624Fariborz Jahanian const llvm::Triple &Triple) { 655f759df06d997050559fd925758bcd2cdef24db05Rafael Espindola if (Arg *A = Args.getLastArg(options::OPT_fexceptions, 656f759df06d997050559fd925758bcd2cdef24db05Rafael Espindola options::OPT_fno_exceptions)) { 657f759df06d997050559fd925758bcd2cdef24db05Rafael Espindola if (A->getOption().matches(options::OPT_fexceptions)) 658f759df06d997050559fd925758bcd2cdef24db05Rafael Espindola return true; 659f759df06d997050559fd925758bcd2cdef24db05Rafael Espindola else 660f759df06d997050559fd925758bcd2cdef24db05Rafael Espindola return false; 661f759df06d997050559fd925758bcd2cdef24db05Rafael Espindola } 662f759df06d997050559fd925758bcd2cdef24db05Rafael Espindola switch (InputType) { 663f759df06d997050559fd925758bcd2cdef24db05Rafael Espindola case types::TY_CXX: case types::TY_CXXHeader: 664f759df06d997050559fd925758bcd2cdef24db05Rafael Espindola case types::TY_PP_CXX: case types::TY_PP_CXXHeader: 665f759df06d997050559fd925758bcd2cdef24db05Rafael Espindola case types::TY_ObjCXX: case types::TY_ObjCXXHeader: 666f759df06d997050559fd925758bcd2cdef24db05Rafael Espindola case types::TY_PP_ObjCXX: case types::TY_PP_ObjCXXHeader: 667f759df06d997050559fd925758bcd2cdef24db05Rafael Espindola return true; 66885caf03ee49c4de87ee9624a9b725ef5d20ee624Fariborz Jahanian 669f759df06d997050559fd925758bcd2cdef24db05Rafael Espindola case types::TY_ObjC: case types::TY_ObjCHeader: 670f759df06d997050559fd925758bcd2cdef24db05Rafael Espindola case types::TY_PP_ObjC: case types::TY_PP_ObjCHeader: 671f759df06d997050559fd925758bcd2cdef24db05Rafael Espindola if (Args.hasArg(options::OPT_fobjc_nonfragile_abi)) 672f759df06d997050559fd925758bcd2cdef24db05Rafael Espindola return true; 67385caf03ee49c4de87ee9624a9b725ef5d20ee624Fariborz Jahanian if (Triple.getOS() != llvm::Triple::Darwin) 674f759df06d997050559fd925758bcd2cdef24db05Rafael Espindola return false; 67585caf03ee49c4de87ee9624a9b725ef5d20ee624Fariborz Jahanian return (Triple.getDarwinMajorNumber() >= 9 && 67685caf03ee49c4de87ee9624a9b725ef5d20ee624Fariborz Jahanian Triple.getArch() == llvm::Triple::x86_64); 67785caf03ee49c4de87ee9624a9b725ef5d20ee624Fariborz Jahanian 678f759df06d997050559fd925758bcd2cdef24db05Rafael Espindola default: 679f759df06d997050559fd925758bcd2cdef24db05Rafael Espindola return false; 680f759df06d997050559fd925758bcd2cdef24db05Rafael Espindola } 681f759df06d997050559fd925758bcd2cdef24db05Rafael Espindola} 682f759df06d997050559fd925758bcd2cdef24db05Rafael Espindola 683dd4fe00f03d8749b283948ea86aa1e4a53ed21abDaniel Dunbar/// getEffectiveClangTriple - Get the "effective" target triple, which is the 684dd4fe00f03d8749b283948ea86aa1e4a53ed21abDaniel Dunbar/// triple for the target but with the OS version potentially modified for 685dd4fe00f03d8749b283948ea86aa1e4a53ed21abDaniel Dunbar/// Darwin's -mmacosx-version-min. 686dd4fe00f03d8749b283948ea86aa1e4a53ed21abDaniel Dunbarstatic std::string getEffectiveClangTriple(const Driver &D, 687dd4fe00f03d8749b283948ea86aa1e4a53ed21abDaniel Dunbar const ToolChain &TC, 688dd4fe00f03d8749b283948ea86aa1e4a53ed21abDaniel Dunbar const ArgList &Args) { 689dd4fe00f03d8749b283948ea86aa1e4a53ed21abDaniel Dunbar llvm::Triple Triple(getLLVMTriple(TC, Args)); 690dd4fe00f03d8749b283948ea86aa1e4a53ed21abDaniel Dunbar 691408fceda7a518ac25975fb6299c856bfaa753939Daniel Dunbar // Handle -mmacosx-version-min and -miphoneos-version-min. 692dd4fe00f03d8749b283948ea86aa1e4a53ed21abDaniel Dunbar if (Triple.getOS() != llvm::Triple::Darwin) { 693dd4fe00f03d8749b283948ea86aa1e4a53ed21abDaniel Dunbar // Diagnose use of -mmacosx-version-min and -miphoneos-version-min on 694dd4fe00f03d8749b283948ea86aa1e4a53ed21abDaniel Dunbar // non-Darwin. 695408fceda7a518ac25975fb6299c856bfaa753939Daniel Dunbar if (Arg *A = Args.getLastArg(options::OPT_mmacosx_version_min_EQ, 696408fceda7a518ac25975fb6299c856bfaa753939Daniel Dunbar options::OPT_miphoneos_version_min_EQ)) 697408fceda7a518ac25975fb6299c856bfaa753939Daniel Dunbar D.Diag(clang::diag::err_drv_clang_unsupported) << A->getAsString(Args); 69821ae3196c9677a79523d294f9a62a4788ba40694Daniel Dunbar } else { 699408fceda7a518ac25975fb6299c856bfaa753939Daniel Dunbar const toolchains::Darwin &DarwinTC( 700408fceda7a518ac25975fb6299c856bfaa753939Daniel Dunbar reinterpret_cast<const toolchains::Darwin&>(TC)); 70103d87ee556f9e11ab83f6d2f80c9ee92e3667301Daniel Dunbar 70203d87ee556f9e11ab83f6d2f80c9ee92e3667301Daniel Dunbar // If the target isn't initialized (e.g., an unknown Darwin platform, return 70303d87ee556f9e11ab83f6d2f80c9ee92e3667301Daniel Dunbar // the default triple). 70403d87ee556f9e11ab83f6d2f80c9ee92e3667301Daniel Dunbar if (!DarwinTC.isTargetInitialized()) 70503d87ee556f9e11ab83f6d2f80c9ee92e3667301Daniel Dunbar return Triple.getTriple(); 70603d87ee556f9e11ab83f6d2f80c9ee92e3667301Daniel Dunbar 707408fceda7a518ac25975fb6299c856bfaa753939Daniel Dunbar unsigned Version[3]; 708408fceda7a518ac25975fb6299c856bfaa753939Daniel Dunbar DarwinTC.getTargetVersion(Version); 70921ae3196c9677a79523d294f9a62a4788ba40694Daniel Dunbar 71021ae3196c9677a79523d294f9a62a4788ba40694Daniel Dunbar // Mangle the target version into the OS triple component. For historical 71121ae3196c9677a79523d294f9a62a4788ba40694Daniel Dunbar // reasons that make little sense, the version passed here is the "darwin" 71221ae3196c9677a79523d294f9a62a4788ba40694Daniel Dunbar // version, which drops the 10 and offsets by 4. See inverse code when 71321ae3196c9677a79523d294f9a62a4788ba40694Daniel Dunbar // setting the OS version preprocessor define. 714408fceda7a518ac25975fb6299c856bfaa753939Daniel Dunbar if (!DarwinTC.isTargetIPhoneOS()) { 715408fceda7a518ac25975fb6299c856bfaa753939Daniel Dunbar Version[0] = Version[1] + 4; 716408fceda7a518ac25975fb6299c856bfaa753939Daniel Dunbar Version[1] = Version[2]; 717408fceda7a518ac25975fb6299c856bfaa753939Daniel Dunbar Version[2] = 0; 718408fceda7a518ac25975fb6299c856bfaa753939Daniel Dunbar } else { 719408fceda7a518ac25975fb6299c856bfaa753939Daniel Dunbar // Use the environment to communicate that we are targetting iPhoneOS. 720408fceda7a518ac25975fb6299c856bfaa753939Daniel Dunbar Triple.setEnvironmentName("iphoneos"); 72121ae3196c9677a79523d294f9a62a4788ba40694Daniel Dunbar } 722dd4fe00f03d8749b283948ea86aa1e4a53ed21abDaniel Dunbar 723dd4fe00f03d8749b283948ea86aa1e4a53ed21abDaniel Dunbar llvm::SmallString<16> Str; 724408fceda7a518ac25975fb6299c856bfaa753939Daniel Dunbar llvm::raw_svector_ostream(Str) << "darwin" << Version[0] 725408fceda7a518ac25975fb6299c856bfaa753939Daniel Dunbar << "." << Version[1] << "." << Version[2]; 726dd4fe00f03d8749b283948ea86aa1e4a53ed21abDaniel Dunbar Triple.setOSName(Str.str()); 727dd4fe00f03d8749b283948ea86aa1e4a53ed21abDaniel Dunbar } 728dd4fe00f03d8749b283948ea86aa1e4a53ed21abDaniel Dunbar 729dd4fe00f03d8749b283948ea86aa1e4a53ed21abDaniel Dunbar return Triple.getTriple(); 730dd4fe00f03d8749b283948ea86aa1e4a53ed21abDaniel Dunbar} 731dd4fe00f03d8749b283948ea86aa1e4a53ed21abDaniel Dunbar 73247ac7d27c44bd64a7d0fc03d4babc196cf2b8230Daniel Dunbarvoid Clang::ConstructJob(Compilation &C, const JobAction &JA, 733871adcf4e41285e3f4c3b62eaa1b2e05b60b92daDaniel Dunbar Job &Dest, 734871adcf4e41285e3f4c3b62eaa1b2e05b60b92daDaniel Dunbar const InputInfo &Output, 73562cf601812e03dd9bc5df42b8ef06a0cdedc38bfDaniel Dunbar const InputInfoList &Inputs, 7361d46033f760ba5fd266ce59fe391fac473f04f52Daniel Dunbar const ArgList &Args, 73747ac7d27c44bd64a7d0fc03d4babc196cf2b8230Daniel Dunbar const char *LinkingOutput) const { 7380a80ba74ffa3d3df55abfbc4474d7470c7c923e3Daniel Dunbar bool KernelOrKext = Args.hasArg(options::OPT_mkernel, 7390a80ba74ffa3d3df55abfbc4474d7470c7c923e3Daniel Dunbar options::OPT_fapple_kext); 740ee788e70fcd0adf76103b17c78ac658d4ea30c9bDaniel Dunbar const Driver &D = getToolChain().getDriver(); 741b488c1dac8e53206f07103d794a62a3f5012c0f4Daniel Dunbar ArgStringList CmdArgs; 742b488c1dac8e53206f07103d794a62a3f5012c0f4Daniel Dunbar 743077ba6a3ac3628afb0d3c460e81ce013bccbdbedDaniel Dunbar assert(Inputs.size() == 1 && "Unable to handle multiple inputs."); 744077ba6a3ac3628afb0d3c460e81ce013bccbdbedDaniel Dunbar 7458ff5b28d6efcffe2251e77634c7edf83a4763344Daniel Dunbar // Invoke ourselves in -cc1 mode. 7468ff5b28d6efcffe2251e77634c7edf83a4763344Daniel Dunbar // 7478ff5b28d6efcffe2251e77634c7edf83a4763344Daniel Dunbar // FIXME: Implement custom jobs for internal actions. 7488ff5b28d6efcffe2251e77634c7edf83a4763344Daniel Dunbar CmdArgs.push_back("-cc1"); 7498ff5b28d6efcffe2251e77634c7edf83a4763344Daniel Dunbar 750dd4fe00f03d8749b283948ea86aa1e4a53ed21abDaniel Dunbar // Add the "effective" target triple. 751af07f936b698575f2c91f1c1134c116f1ef0deddDaniel Dunbar CmdArgs.push_back("-triple"); 752dd4fe00f03d8749b283948ea86aa1e4a53ed21abDaniel Dunbar std::string TripleStr = getEffectiveClangTriple(D, getToolChain(), Args); 753dd4fe00f03d8749b283948ea86aa1e4a53ed21abDaniel Dunbar CmdArgs.push_back(Args.MakeArgString(TripleStr)); 754728a512753d85a6ccaae34e81385c8665c2de0e1Daniel Dunbar 755dd4fe00f03d8749b283948ea86aa1e4a53ed21abDaniel Dunbar // Select the appropriate action. 7561d46033f760ba5fd266ce59fe391fac473f04f52Daniel Dunbar if (isa<AnalyzeJobAction>(JA)) { 7571d46033f760ba5fd266ce59fe391fac473f04f52Daniel Dunbar assert(JA.getType() == types::TY_Plist && "Invalid output type."); 7581d46033f760ba5fd266ce59fe391fac473f04f52Daniel Dunbar CmdArgs.push_back("-analyze"); 7591d46033f760ba5fd266ce59fe391fac473f04f52Daniel Dunbar } else if (isa<PreprocessJobAction>(JA)) { 760cd8e4c44dd068956e9181381be3ee2d49a0fac52Daniel Dunbar if (Output.getType() == types::TY_Dependencies) 761cd8e4c44dd068956e9181381be3ee2d49a0fac52Daniel Dunbar CmdArgs.push_back("-Eonly"); 762cd8e4c44dd068956e9181381be3ee2d49a0fac52Daniel Dunbar else 763cd8e4c44dd068956e9181381be3ee2d49a0fac52Daniel Dunbar CmdArgs.push_back("-E"); 7648767cbc475ed96397b6f08617814eeb9cab121bdDaniel Dunbar } else if (isa<AssembleJobAction>(JA)) { 7658767cbc475ed96397b6f08617814eeb9cab121bdDaniel Dunbar CmdArgs.push_back("-emit-obj"); 7661d46033f760ba5fd266ce59fe391fac473f04f52Daniel Dunbar } else if (isa<PrecompileJobAction>(JA)) { 7670ebd9321ba380471010341f24c874f46f56e7581Daniel Dunbar // Use PCH if the user requested it, except for C++ (for now). 7680ebd9321ba380471010341f24c874f46f56e7581Daniel Dunbar bool UsePCH = D.CCCUsePCH; 7690ebd9321ba380471010341f24c874f46f56e7581Daniel Dunbar if (types::isCXX(Inputs[0].getType())) 7700ebd9321ba380471010341f24c874f46f56e7581Daniel Dunbar UsePCH = false; 7710ebd9321ba380471010341f24c874f46f56e7581Daniel Dunbar 7720ebd9321ba380471010341f24c874f46f56e7581Daniel Dunbar if (UsePCH) 773df91ef3d6c55692a0236f67b6c6b134a3bf84098Douglas Gregor CmdArgs.push_back("-emit-pch"); 774df91ef3d6c55692a0236f67b6c6b134a3bf84098Douglas Gregor else 775df91ef3d6c55692a0236f67b6c6b134a3bf84098Douglas Gregor CmdArgs.push_back("-emit-pth"); 7761d46033f760ba5fd266ce59fe391fac473f04f52Daniel Dunbar } else { 7771d46033f760ba5fd266ce59fe391fac473f04f52Daniel Dunbar assert(isa<CompileJobAction>(JA) && "Invalid action for clang tool."); 778c21c485b4fb58ef5d55cf3e523263dd824a2ace4Daniel Dunbar 7791d46033f760ba5fd266ce59fe391fac473f04f52Daniel Dunbar if (JA.getType() == types::TY_Nothing) { 7801d46033f760ba5fd266ce59fe391fac473f04f52Daniel Dunbar CmdArgs.push_back("-fsyntax-only"); 7811d46033f760ba5fd266ce59fe391fac473f04f52Daniel Dunbar } else if (JA.getType() == types::TY_LLVMAsm) { 7821d46033f760ba5fd266ce59fe391fac473f04f52Daniel Dunbar CmdArgs.push_back("-emit-llvm"); 7831d46033f760ba5fd266ce59fe391fac473f04f52Daniel Dunbar } else if (JA.getType() == types::TY_LLVMBC) { 7841d46033f760ba5fd266ce59fe391fac473f04f52Daniel Dunbar CmdArgs.push_back("-emit-llvm-bc"); 7851d46033f760ba5fd266ce59fe391fac473f04f52Daniel Dunbar } else if (JA.getType() == types::TY_PP_Asm) { 786e3b8d07e02861d245612b02b5f5a2c1f34b2a394Daniel Dunbar CmdArgs.push_back("-S"); 7875915fbf310e171c4cd3c2af05e9de360c0fa988aDaniel Dunbar } else if (JA.getType() == types::TY_AST) { 7885915fbf310e171c4cd3c2af05e9de360c0fa988aDaniel Dunbar CmdArgs.push_back("-emit-pch"); 78964952508c2b0c8bffb45c8b410f0af3d2457f59bDaniel Dunbar } else if (JA.getType() == types::TY_RewrittenObjC) { 79064952508c2b0c8bffb45c8b410f0af3d2457f59bDaniel Dunbar CmdArgs.push_back("-rewrite-objc"); 79164952508c2b0c8bffb45c8b410f0af3d2457f59bDaniel Dunbar } else { 79264952508c2b0c8bffb45c8b410f0af3d2457f59bDaniel Dunbar assert(JA.getType() == types::TY_PP_Asm && 79364952508c2b0c8bffb45c8b410f0af3d2457f59bDaniel Dunbar "Unexpected output type!"); 7941d46033f760ba5fd266ce59fe391fac473f04f52Daniel Dunbar } 7951d46033f760ba5fd266ce59fe391fac473f04f52Daniel Dunbar } 7961d46033f760ba5fd266ce59fe391fac473f04f52Daniel Dunbar 7971d46033f760ba5fd266ce59fe391fac473f04f52Daniel Dunbar // The make clang go fast button. 7981d46033f760ba5fd266ce59fe391fac473f04f52Daniel Dunbar CmdArgs.push_back("-disable-free"); 7991d46033f760ba5fd266ce59fe391fac473f04f52Daniel Dunbar 800b689afb75049012a431d483432114ad5e75d4a92John McCall // Disable the verification pass in -asserts builds. 801b689afb75049012a431d483432114ad5e75d4a92John McCall#ifdef NDEBUG 802b689afb75049012a431d483432114ad5e75d4a92John McCall CmdArgs.push_back("-disable-llvm-verifier"); 803b689afb75049012a431d483432114ad5e75d4a92John McCall#endif 804b689afb75049012a431d483432114ad5e75d4a92John McCall 805c9abc043af88f90d177a5bd147f627b78ca49fdeDaniel Dunbar // Set the main file name, so that debug info works even with 806c9abc043af88f90d177a5bd147f627b78ca49fdeDaniel Dunbar // -save-temps. 807c9abc043af88f90d177a5bd147f627b78ca49fdeDaniel Dunbar CmdArgs.push_back("-main-file-name"); 808c9abc043af88f90d177a5bd147f627b78ca49fdeDaniel Dunbar CmdArgs.push_back(darwin::CC1::getBaseInputName(Args, Inputs)); 809c9abc043af88f90d177a5bd147f627b78ca49fdeDaniel Dunbar 8103bbc75302fd43cf13d868b46c94ff8794b302e43Daniel Dunbar // Some flags which affect the language (via preprocessor 8113bbc75302fd43cf13d868b46c94ff8794b302e43Daniel Dunbar // defines). See darwin::CC1::AddCPPArgs. 8123bbc75302fd43cf13d868b46c94ff8794b302e43Daniel Dunbar if (Args.hasArg(options::OPT_static)) 8133bbc75302fd43cf13d868b46c94ff8794b302e43Daniel Dunbar CmdArgs.push_back("-static-define"); 8143bbc75302fd43cf13d868b46c94ff8794b302e43Daniel Dunbar 8151d46033f760ba5fd266ce59fe391fac473f04f52Daniel Dunbar if (isa<AnalyzeJobAction>(JA)) { 816b8bb3e797c5687715c6d9d960ee573e4d0e62230Ted Kremenek // Enable region store model by default. 817b8bb3e797c5687715c6d9d960ee573e4d0e62230Ted Kremenek CmdArgs.push_back("-analyzer-store=region"); 818b8bb3e797c5687715c6d9d960ee573e4d0e62230Ted Kremenek 819b40d06dec23b53bbc1157a9adae7f887be31aa3bTed Kremenek // Treat blocks as analysis entry points. 820b40d06dec23b53bbc1157a9adae7f887be31aa3bTed Kremenek CmdArgs.push_back("-analyzer-opt-analyze-nested-blocks"); 821b40d06dec23b53bbc1157a9adae7f887be31aa3bTed Kremenek 8221d46033f760ba5fd266ce59fe391fac473f04f52Daniel Dunbar // Add default argument set. 823d8fc0f2e7751cf31cec5c2f3cc6a0b447e9debb3Daniel Dunbar if (!Args.hasArg(options::OPT__analyzer_no_default_checks)) { 824cd9902bfb79c5c67559360514951714bdafac36eTed Kremenek CmdArgs.push_back("-analyzer-check-dead-stores"); 825fb3f893bc58071e548c97a3d667c8ab9b0c38cfbTed Kremenek CmdArgs.push_back("-analyzer-check-security-syntactic"); 826565e465c6d0093f1bf8414b2cabdc842022385a9Ted Kremenek CmdArgs.push_back("-analyzer-check-objc-mem"); 827d8fc0f2e7751cf31cec5c2f3cc6a0b447e9debb3Daniel Dunbar CmdArgs.push_back("-analyzer-eagerly-assume"); 828fa15be4cf95b7ed2d1df583497b16a6f897cf789Ted Kremenek CmdArgs.push_back("-analyzer-check-objc-methodsigs"); 829d8fc0f2e7751cf31cec5c2f3cc6a0b447e9debb3Daniel Dunbar // Do not enable the missing -dealloc check. 8307909fc8833e734aac521d7d6945bd823d75150acTed Kremenek // '-analyzer-check-objc-missing-dealloc', 8312ade536f6815bf6ff128333520232c3b0e701146Ted Kremenek CmdArgs.push_back("-analyzer-check-objc-unused-ivars"); 832d8fc0f2e7751cf31cec5c2f3cc6a0b447e9debb3Daniel Dunbar } 833d8fc0f2e7751cf31cec5c2f3cc6a0b447e9debb3Daniel Dunbar 834d8fc0f2e7751cf31cec5c2f3cc6a0b447e9debb3Daniel Dunbar // Set the output format. The default is plist, for (lame) historical 835d8fc0f2e7751cf31cec5c2f3cc6a0b447e9debb3Daniel Dunbar // reasons. 836d8fc0f2e7751cf31cec5c2f3cc6a0b447e9debb3Daniel Dunbar CmdArgs.push_back("-analyzer-output"); 837d8fc0f2e7751cf31cec5c2f3cc6a0b447e9debb3Daniel Dunbar if (Arg *A = Args.getLastArg(options::OPT__analyzer_output)) 838d8fc0f2e7751cf31cec5c2f3cc6a0b447e9debb3Daniel Dunbar CmdArgs.push_back(A->getValue(Args)); 839d8fc0f2e7751cf31cec5c2f3cc6a0b447e9debb3Daniel Dunbar else 840d8fc0f2e7751cf31cec5c2f3cc6a0b447e9debb3Daniel Dunbar CmdArgs.push_back("plist"); 8411d46033f760ba5fd266ce59fe391fac473f04f52Daniel Dunbar 8420647a7b9ad844565b8a4b5e1a5de882dd64efabfTed Kremenek // Disable the presentation of standard compiler warnings when 8430647a7b9ad844565b8a4b5e1a5de882dd64efabfTed Kremenek // using --analyze. We only want to show static analyzer diagnostics 8440647a7b9ad844565b8a4b5e1a5de882dd64efabfTed Kremenek // or frontend errors. 8450647a7b9ad844565b8a4b5e1a5de882dd64efabfTed Kremenek CmdArgs.push_back("-w"); 8460647a7b9ad844565b8a4b5e1a5de882dd64efabfTed Kremenek 8471d46033f760ba5fd266ce59fe391fac473f04f52Daniel Dunbar // Add -Xanalyzer arguments when running as analyzer. 8481d46033f760ba5fd266ce59fe391fac473f04f52Daniel Dunbar Args.AddAllArgValues(CmdArgs, options::OPT_Xanalyzer); 8491eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump } 8501eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump 851e2fd66418eca3d70cf6b62087d745d0c5181db69Daniel Dunbar CheckCodeGenerationOptions(D, Args); 852e2fd66418eca3d70cf6b62087d745d0c5181db69Daniel Dunbar 853bc85be85779a47bae728bbe6a2cd2e3732b1333dDaniel Dunbar // Perform argument translation for LLVM backend. This 854bc85be85779a47bae728bbe6a2cd2e3732b1333dDaniel Dunbar // takes some care in reconciling with llvm-gcc. The 855bc85be85779a47bae728bbe6a2cd2e3732b1333dDaniel Dunbar // issue is that llvm-gcc translates these options based on 856bc85be85779a47bae728bbe6a2cd2e3732b1333dDaniel Dunbar // the values in cc1, whereas we are processing based on 857bc85be85779a47bae728bbe6a2cd2e3732b1333dDaniel Dunbar // the driver arguments. 8589fd0b1f845a61e71dd8099f596532d34c519630aDaniel Dunbar 859bc85be85779a47bae728bbe6a2cd2e3732b1333dDaniel Dunbar // This comes from the default translation the driver + cc1 860bc85be85779a47bae728bbe6a2cd2e3732b1333dDaniel Dunbar // would do to enable flag_pic. 861bc85be85779a47bae728bbe6a2cd2e3732b1333dDaniel Dunbar // 862bc85be85779a47bae728bbe6a2cd2e3732b1333dDaniel Dunbar // FIXME: Centralize this code. 863bc85be85779a47bae728bbe6a2cd2e3732b1333dDaniel Dunbar bool PICEnabled = (Args.hasArg(options::OPT_fPIC) || 864bc85be85779a47bae728bbe6a2cd2e3732b1333dDaniel Dunbar Args.hasArg(options::OPT_fpic) || 865bc85be85779a47bae728bbe6a2cd2e3732b1333dDaniel Dunbar Args.hasArg(options::OPT_fPIE) || 866bc85be85779a47bae728bbe6a2cd2e3732b1333dDaniel Dunbar Args.hasArg(options::OPT_fpie)); 867bc85be85779a47bae728bbe6a2cd2e3732b1333dDaniel Dunbar bool PICDisabled = (Args.hasArg(options::OPT_mkernel) || 868bc85be85779a47bae728bbe6a2cd2e3732b1333dDaniel Dunbar Args.hasArg(options::OPT_static)); 869bc85be85779a47bae728bbe6a2cd2e3732b1333dDaniel Dunbar const char *Model = getToolChain().GetForcedPicModel(); 870bc85be85779a47bae728bbe6a2cd2e3732b1333dDaniel Dunbar if (!Model) { 871bc85be85779a47bae728bbe6a2cd2e3732b1333dDaniel Dunbar if (Args.hasArg(options::OPT_mdynamic_no_pic)) 872bc85be85779a47bae728bbe6a2cd2e3732b1333dDaniel Dunbar Model = "dynamic-no-pic"; 873bc85be85779a47bae728bbe6a2cd2e3732b1333dDaniel Dunbar else if (PICDisabled) 874bc85be85779a47bae728bbe6a2cd2e3732b1333dDaniel Dunbar Model = "static"; 875bc85be85779a47bae728bbe6a2cd2e3732b1333dDaniel Dunbar else if (PICEnabled) 876bc85be85779a47bae728bbe6a2cd2e3732b1333dDaniel Dunbar Model = "pic"; 8771d46033f760ba5fd266ce59fe391fac473f04f52Daniel Dunbar else 878bc85be85779a47bae728bbe6a2cd2e3732b1333dDaniel Dunbar Model = getToolChain().GetDefaultRelocationModel(); 879bc85be85779a47bae728bbe6a2cd2e3732b1333dDaniel Dunbar } 880f219e7c1529fac29e34483667f740b452e5ef9ccDaniel Dunbar if (llvm::StringRef(Model) != "pic") { 881f219e7c1529fac29e34483667f740b452e5ef9ccDaniel Dunbar CmdArgs.push_back("-mrelocation-model"); 882f219e7c1529fac29e34483667f740b452e5ef9ccDaniel Dunbar CmdArgs.push_back(Model); 883f219e7c1529fac29e34483667f740b452e5ef9ccDaniel Dunbar } 8841d46033f760ba5fd266ce59fe391fac473f04f52Daniel Dunbar 885bc85be85779a47bae728bbe6a2cd2e3732b1333dDaniel Dunbar // Infer the __PIC__ value. 886bc85be85779a47bae728bbe6a2cd2e3732b1333dDaniel Dunbar // 887bc85be85779a47bae728bbe6a2cd2e3732b1333dDaniel Dunbar // FIXME: This isn't quite right on Darwin, which always sets 888bc85be85779a47bae728bbe6a2cd2e3732b1333dDaniel Dunbar // __PIC__=2. 889bc85be85779a47bae728bbe6a2cd2e3732b1333dDaniel Dunbar if (strcmp(Model, "pic") == 0 || strcmp(Model, "dynamic-no-pic") == 0) { 8907674352cf3e8f699914a2f739f1ae8c8c3480813Daniel Dunbar CmdArgs.push_back("-pic-level"); 8917674352cf3e8f699914a2f739f1ae8c8c3480813Daniel Dunbar CmdArgs.push_back(Args.hasArg(options::OPT_fPIC) ? "2" : "1"); 892bc85be85779a47bae728bbe6a2cd2e3732b1333dDaniel Dunbar } 893f219e7c1529fac29e34483667f740b452e5ef9ccDaniel Dunbar if (!Args.hasFlag(options::OPT_fmerge_all_constants, 894f219e7c1529fac29e34483667f740b452e5ef9ccDaniel Dunbar options::OPT_fno_merge_all_constants)) 895f219e7c1529fac29e34483667f740b452e5ef9ccDaniel Dunbar CmdArgs.push_back("-no-merge-all-constants"); 896f219e7c1529fac29e34483667f740b452e5ef9ccDaniel Dunbar 897f219e7c1529fac29e34483667f740b452e5ef9ccDaniel Dunbar // LLVM Code Generator Options. 8981d46033f760ba5fd266ce59fe391fac473f04f52Daniel Dunbar 899bc85be85779a47bae728bbe6a2cd2e3732b1333dDaniel Dunbar // FIXME: Set --enable-unsafe-fp-math. 90021656ddae8e81df04f142386337cb95a9e0f0971Benjamin Kramer if (Args.hasFlag(options::OPT_fno_omit_frame_pointer, 90121656ddae8e81df04f142386337cb95a9e0f0971Benjamin Kramer options::OPT_fomit_frame_pointer)) 902f219e7c1529fac29e34483667f740b452e5ef9ccDaniel Dunbar CmdArgs.push_back("-mdisable-fp-elim"); 903bc85be85779a47bae728bbe6a2cd2e3732b1333dDaniel Dunbar if (!Args.hasFlag(options::OPT_fzero_initialized_in_bss, 904f219e7c1529fac29e34483667f740b452e5ef9ccDaniel Dunbar options::OPT_fno_zero_initialized_in_bss)) 905f219e7c1529fac29e34483667f740b452e5ef9ccDaniel Dunbar CmdArgs.push_back("-mno-zero-initialized-in-bss"); 906bc85be85779a47bae728bbe6a2cd2e3732b1333dDaniel Dunbar if (Args.hasArg(options::OPT_dA) || Args.hasArg(options::OPT_fverbose_asm)) 907f219e7c1529fac29e34483667f740b452e5ef9ccDaniel Dunbar CmdArgs.push_back("-masm-verbose"); 908f219e7c1529fac29e34483667f740b452e5ef9ccDaniel Dunbar if (Args.hasArg(options::OPT_fdebug_pass_structure)) { 909f219e7c1529fac29e34483667f740b452e5ef9ccDaniel Dunbar CmdArgs.push_back("-mdebug-pass"); 910f219e7c1529fac29e34483667f740b452e5ef9ccDaniel Dunbar CmdArgs.push_back("Structure"); 911f219e7c1529fac29e34483667f740b452e5ef9ccDaniel Dunbar } 912f219e7c1529fac29e34483667f740b452e5ef9ccDaniel Dunbar if (Args.hasArg(options::OPT_fdebug_pass_arguments)) { 913f219e7c1529fac29e34483667f740b452e5ef9ccDaniel Dunbar CmdArgs.push_back("-mdebug-pass"); 914f219e7c1529fac29e34483667f740b452e5ef9ccDaniel Dunbar CmdArgs.push_back("Arguments"); 915f219e7c1529fac29e34483667f740b452e5ef9ccDaniel Dunbar } 9166bea73b3305a03479589e2642fbdcf6c096851aaDaniel Dunbar 917d0c2ec44e093011256b6a0f57d455f36dffdea70John McCall // Enable -mconstructor-aliases except on darwin, where we have to 918d0c2ec44e093011256b6a0f57d455f36dffdea70John McCall // work around a linker bug; see <rdar://problem/7651567>. 919d0c2ec44e093011256b6a0f57d455f36dffdea70John McCall if (getToolChain().getTriple().getOS() != llvm::Triple::Darwin) 920d0c2ec44e093011256b6a0f57d455f36dffdea70John McCall CmdArgs.push_back("-mconstructor-aliases"); 921d0c2ec44e093011256b6a0f57d455f36dffdea70John McCall 9226bea73b3305a03479589e2642fbdcf6c096851aaDaniel Dunbar // This is a coarse approximation of what llvm-gcc actually does, both 9236bea73b3305a03479589e2642fbdcf6c096851aaDaniel Dunbar // -fasynchronous-unwind-tables and -fnon-call-exceptions interact in more 9246bea73b3305a03479589e2642fbdcf6c096851aaDaniel Dunbar // complicated ways. 9256bea73b3305a03479589e2642fbdcf6c096851aaDaniel Dunbar bool AsynchronousUnwindTables = 9266bea73b3305a03479589e2642fbdcf6c096851aaDaniel Dunbar Args.hasFlag(options::OPT_fasynchronous_unwind_tables, 9276bea73b3305a03479589e2642fbdcf6c096851aaDaniel Dunbar options::OPT_fno_asynchronous_unwind_tables, 9286bea73b3305a03479589e2642fbdcf6c096851aaDaniel Dunbar getToolChain().IsUnwindTablesDefault() && 9290a80ba74ffa3d3df55abfbc4474d7470c7c923e3Daniel Dunbar !KernelOrKext); 9306bea73b3305a03479589e2642fbdcf6c096851aaDaniel Dunbar if (Args.hasFlag(options::OPT_funwind_tables, options::OPT_fno_unwind_tables, 9316bea73b3305a03479589e2642fbdcf6c096851aaDaniel Dunbar AsynchronousUnwindTables)) 932f219e7c1529fac29e34483667f740b452e5ef9ccDaniel Dunbar CmdArgs.push_back("-munwind-tables"); 933f219e7c1529fac29e34483667f740b452e5ef9ccDaniel Dunbar 934f219e7c1529fac29e34483667f740b452e5ef9ccDaniel Dunbar if (Arg *A = Args.getLastArg(options::OPT_flimited_precision_EQ)) { 935f219e7c1529fac29e34483667f740b452e5ef9ccDaniel Dunbar CmdArgs.push_back("-mlimit-float-precision"); 936f219e7c1529fac29e34483667f740b452e5ef9ccDaniel Dunbar CmdArgs.push_back(A->getValue(Args)); 937f219e7c1529fac29e34483667f740b452e5ef9ccDaniel Dunbar } 938bc85be85779a47bae728bbe6a2cd2e3732b1333dDaniel Dunbar 939868bd0aa9281929ef50d2e9a8c82a036906f53f5Daniel Dunbar // FIXME: Handle -mtune=. 940868bd0aa9281929ef50d2e9a8c82a036906f53f5Daniel Dunbar (void) Args.hasArg(options::OPT_mtune_EQ); 941bc85be85779a47bae728bbe6a2cd2e3732b1333dDaniel Dunbar 9428e9ef0d87dad25f02e5abc6facf528778236115aBenjamin Kramer if (Arg *A = Args.getLastArg(options::OPT_mcmodel_EQ)) { 943f219e7c1529fac29e34483667f740b452e5ef9ccDaniel Dunbar CmdArgs.push_back("-mcode-model"); 9448e9ef0d87dad25f02e5abc6facf528778236115aBenjamin Kramer CmdArgs.push_back(A->getValue(Args)); 9458e9ef0d87dad25f02e5abc6facf528778236115aBenjamin Kramer } 9468e9ef0d87dad25f02e5abc6facf528778236115aBenjamin Kramer 9476acda16e9c194dcbd0dea64341e182bdb65d0f41Daniel Dunbar // Add target specific cpu and features flags. 9486acda16e9c194dcbd0dea64341e182bdb65d0f41Daniel Dunbar switch(getToolChain().getTriple().getArch()) { 9496acda16e9c194dcbd0dea64341e182bdb65d0f41Daniel Dunbar default: 9506acda16e9c194dcbd0dea64341e182bdb65d0f41Daniel Dunbar break; 951868bd0aa9281929ef50d2e9a8c82a036906f53f5Daniel Dunbar 952b163ef7e7a5d904ef0962a7c38c460be083c4d63Daniel Dunbar case llvm::Triple::arm: 953b163ef7e7a5d904ef0962a7c38c460be083c4d63Daniel Dunbar case llvm::Triple::thumb: 954b163ef7e7a5d904ef0962a7c38c460be083c4d63Daniel Dunbar AddARMTargetArgs(Args, CmdArgs); 955b163ef7e7a5d904ef0962a7c38c460be083c4d63Daniel Dunbar break; 956b163ef7e7a5d904ef0962a7c38c460be083c4d63Daniel Dunbar 957ed734737d5af31906e30e537d4a41c760ddcfc59Eric Christopher case llvm::Triple::mips: 958ed734737d5af31906e30e537d4a41c760ddcfc59Eric Christopher case llvm::Triple::mipsel: 959ed734737d5af31906e30e537d4a41c760ddcfc59Eric Christopher AddMIPSTargetArgs(Args, CmdArgs); 960ed734737d5af31906e30e537d4a41c760ddcfc59Eric Christopher break; 961ed734737d5af31906e30e537d4a41c760ddcfc59Eric Christopher 9626acda16e9c194dcbd0dea64341e182bdb65d0f41Daniel Dunbar case llvm::Triple::x86: 9636acda16e9c194dcbd0dea64341e182bdb65d0f41Daniel Dunbar case llvm::Triple::x86_64: 9646acda16e9c194dcbd0dea64341e182bdb65d0f41Daniel Dunbar AddX86TargetArgs(Args, CmdArgs); 9656acda16e9c194dcbd0dea64341e182bdb65d0f41Daniel Dunbar break; 966bc85be85779a47bae728bbe6a2cd2e3732b1333dDaniel Dunbar } 967c21c485b4fb58ef5d55cf3e523263dd824a2ace4Daniel Dunbar 968c31176d5ebbcd407aa512bbd5f717e35da629e7dDan Gohman // -fno-math-errno is default. 969c31176d5ebbcd407aa512bbd5f717e35da629e7dDan Gohman if (Args.hasFlag(options::OPT_fmath_errno, 970bc85be85779a47bae728bbe6a2cd2e3732b1333dDaniel Dunbar options::OPT_fno_math_errno, 971c31176d5ebbcd407aa512bbd5f717e35da629e7dDan Gohman false)) 972c31176d5ebbcd407aa512bbd5f717e35da629e7dDan Gohman CmdArgs.push_back("-fmath-errno"); 9731d46033f760ba5fd266ce59fe391fac473f04f52Daniel Dunbar 974bc85be85779a47bae728bbe6a2cd2e3732b1333dDaniel Dunbar Arg *Unsupported; 975bc85be85779a47bae728bbe6a2cd2e3732b1333dDaniel Dunbar if ((Unsupported = Args.getLastArg(options::OPT_MG)) || 9766feaf57b46f0856127c84b03f3aee5fb51d0262bTed Kremenek (Unsupported = Args.getLastArg(options::OPT_iframework)) || 9776feaf57b46f0856127c84b03f3aee5fb51d0262bTed Kremenek (Unsupported = Args.getLastArg(options::OPT_fshort_enums))) 978e027a4b2399e9b0acfe0f77220c66bbe369067eeDaniel Dunbar D.Diag(clang::diag::err_drv_clang_unsupported) 979bc85be85779a47bae728bbe6a2cd2e3732b1333dDaniel Dunbar << Unsupported->getOption().getName(); 980bc85be85779a47bae728bbe6a2cd2e3732b1333dDaniel Dunbar 9811d46033f760ba5fd266ce59fe391fac473f04f52Daniel Dunbar Args.AddAllArgs(CmdArgs, options::OPT_v); 9821d46033f760ba5fd266ce59fe391fac473f04f52Daniel Dunbar Args.AddLastArg(CmdArgs, options::OPT_P); 9831eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump Args.AddLastArg(CmdArgs, options::OPT_print_ivar_layout); 9841d46033f760ba5fd266ce59fe391fac473f04f52Daniel Dunbar 9851d46033f760ba5fd266ce59fe391fac473f04f52Daniel Dunbar // Special case debug options to only pass -g to clang. This is 9861d46033f760ba5fd266ce59fe391fac473f04f52Daniel Dunbar // wrong. 98718f36d9eac8b425e8cfed389bbbf02c030f26be7Rafael Espindola Args.ClaimAllArgs(options::OPT_g_Group); 98818f36d9eac8b425e8cfed389bbbf02c030f26be7Rafael Espindola Arg *Garg = Args.getLastArg(options::OPT_g_Group); 98918f36d9eac8b425e8cfed389bbbf02c030f26be7Rafael Espindola if (Garg && Garg != Args.getLastArg(options::OPT_g0)) 9901d46033f760ba5fd266ce59fe391fac473f04f52Daniel Dunbar CmdArgs.push_back("-g"); 9911d46033f760ba5fd266ce59fe391fac473f04f52Daniel Dunbar 9921d46033f760ba5fd266ce59fe391fac473f04f52Daniel Dunbar Args.AddLastArg(CmdArgs, options::OPT_nostdinc); 9934c2bcad7b843c10fd4a2ffd43da40bfefb4dc8baDouglas Gregor Args.AddLastArg(CmdArgs, options::OPT_nostdincxx); 9948d737cc78cb28f39179d6c7ca00eb5d3cf563129Rafael Espindola Args.AddLastArg(CmdArgs, options::OPT_nobuiltininc); 9951d46033f760ba5fd266ce59fe391fac473f04f52Daniel Dunbar 9965f12232ef39e3d6c36d6600a73ebbe3c4a79f514Daniel Dunbar // Pass the path to compiler resource files. 9975f12232ef39e3d6c36d6600a73ebbe3c4a79f514Daniel Dunbar CmdArgs.push_back("-resource-dir"); 998225c41706dc0f3682236e351820d339e14390e00Daniel Dunbar CmdArgs.push_back(D.ResourceDir.c_str()); 9992ac9fc2ad64e16127df8c60caeea2edfe9a400a2Daniel Dunbar 1000c21c485b4fb58ef5d55cf3e523263dd824a2ace4Daniel Dunbar // Add preprocessing options like -I, -D, etc. if we are using the 1001c21c485b4fb58ef5d55cf3e523263dd824a2ace4Daniel Dunbar // preprocessor. 1002c21c485b4fb58ef5d55cf3e523263dd824a2ace4Daniel Dunbar // 1003c21c485b4fb58ef5d55cf3e523263dd824a2ace4Daniel Dunbar // FIXME: Support -fpreprocessed 1004c21c485b4fb58ef5d55cf3e523263dd824a2ace4Daniel Dunbar types::ID InputType = Inputs[0].getType(); 1005c21c485b4fb58ef5d55cf3e523263dd824a2ace4Daniel Dunbar if (types::getPreprocessedType(InputType) != types::TY_INVALID) 1006df91ef3d6c55692a0236f67b6c6b134a3bf84098Douglas Gregor AddPreprocessingOptions(D, Args, CmdArgs, Output, Inputs); 10071d46033f760ba5fd266ce59fe391fac473f04f52Daniel Dunbar 100820f0eacf1682e4594da9d318b5b13ed4f6d6e7e5Daniel Dunbar // Manually translate -O to -O2 and -O4 to -O3; let clang reject 1009337a6271b98c4c183f7eaad1563a75260b4f2871Daniel Dunbar // others. 1010337a6271b98c4c183f7eaad1563a75260b4f2871Daniel Dunbar if (Arg *A = Args.getLastArg(options::OPT_O_Group)) { 1011b827a0541b5fd095fcdb7ad0c3df93ca158c619aDaniel Dunbar if (A->getOption().matches(options::OPT_O4)) 1012337a6271b98c4c183f7eaad1563a75260b4f2871Daniel Dunbar CmdArgs.push_back("-O3"); 1013337a6271b98c4c183f7eaad1563a75260b4f2871Daniel Dunbar else if (A->getValue(Args)[0] == '\0') 101420f0eacf1682e4594da9d318b5b13ed4f6d6e7e5Daniel Dunbar CmdArgs.push_back("-O2"); 10151d46033f760ba5fd266ce59fe391fac473f04f52Daniel Dunbar else 10165697aa0d75c87bafec78984048d558f8d12ca1b3Daniel Dunbar A->render(Args, CmdArgs); 10171d46033f760ba5fd266ce59fe391fac473f04f52Daniel Dunbar } 10181d46033f760ba5fd266ce59fe391fac473f04f52Daniel Dunbar 10196e8371eb97a08f724be22ae6042d1e9eacbe4c48Daniel Dunbar Args.AddAllArgs(CmdArgs, options::OPT_W_Group); 10206e8371eb97a08f724be22ae6042d1e9eacbe4c48Daniel Dunbar Args.AddLastArg(CmdArgs, options::OPT_pedantic); 10216e8371eb97a08f724be22ae6042d1e9eacbe4c48Daniel Dunbar Args.AddLastArg(CmdArgs, options::OPT_pedantic_errors); 10221d46033f760ba5fd266ce59fe391fac473f04f52Daniel Dunbar Args.AddLastArg(CmdArgs, options::OPT_w); 1023d573d26e1abcce24c31ece3d6f7af158db569e4cDaniel Dunbar 1024d573d26e1abcce24c31ece3d6f7af158db569e4cDaniel Dunbar // Handle -{std, ansi, trigraphs} -- take the last of -{std, ansi} 1025d573d26e1abcce24c31ece3d6f7af158db569e4cDaniel Dunbar // (-ansi is equivalent to -std=c89). 1026d573d26e1abcce24c31ece3d6f7af158db569e4cDaniel Dunbar // 1027d573d26e1abcce24c31ece3d6f7af158db569e4cDaniel Dunbar // If a std is supplied, only add -trigraphs if it follows the 1028d573d26e1abcce24c31ece3d6f7af158db569e4cDaniel Dunbar // option. 1029d573d26e1abcce24c31ece3d6f7af158db569e4cDaniel Dunbar if (Arg *Std = Args.getLastArg(options::OPT_std_EQ, options::OPT_ansi)) { 1030d573d26e1abcce24c31ece3d6f7af158db569e4cDaniel Dunbar if (Std->getOption().matches(options::OPT_ansi)) 1031528365d3189d27f3a90a4012baaa8b2814e0a231Nuno Lopes if (types::isCXX(InputType)) 1032294691eb1caf551083acd7b08630ef21c3fd760dDaniel Dunbar CmdArgs.push_back("-std=c++98"); 1033528365d3189d27f3a90a4012baaa8b2814e0a231Nuno Lopes else 1034294691eb1caf551083acd7b08630ef21c3fd760dDaniel Dunbar CmdArgs.push_back("-std=c89"); 1035d573d26e1abcce24c31ece3d6f7af158db569e4cDaniel Dunbar else 1036d573d26e1abcce24c31ece3d6f7af158db569e4cDaniel Dunbar Std->render(Args, CmdArgs); 1037d573d26e1abcce24c31ece3d6f7af158db569e4cDaniel Dunbar 1038d573d26e1abcce24c31ece3d6f7af158db569e4cDaniel Dunbar if (Arg *A = Args.getLastArg(options::OPT_trigraphs)) 1039d573d26e1abcce24c31ece3d6f7af158db569e4cDaniel Dunbar if (A->getIndex() > Std->getIndex()) 1040d573d26e1abcce24c31ece3d6f7af158db569e4cDaniel Dunbar A->render(Args, CmdArgs); 1041a3ff202ee4fb21728e930d5d029ba4925129912cDaniel Dunbar } else { 1042a3ff202ee4fb21728e930d5d029ba4925129912cDaniel Dunbar // Honor -std-default. 10434a5290e773e70ec2c3b4353a3a4aa7d1a3e3cd66Daniel Dunbar // 10444a5290e773e70ec2c3b4353a3a4aa7d1a3e3cd66Daniel Dunbar // FIXME: Clang doesn't correctly handle -std= when the input language 10454a5290e773e70ec2c3b4353a3a4aa7d1a3e3cd66Daniel Dunbar // doesn't match. For the time being just ignore this for C++ inputs; 10464a5290e773e70ec2c3b4353a3a4aa7d1a3e3cd66Daniel Dunbar // eventually we want to do all the standard defaulting here instead of 10474a5290e773e70ec2c3b4353a3a4aa7d1a3e3cd66Daniel Dunbar // splitting it between the driver and clang -cc1. 10484a5290e773e70ec2c3b4353a3a4aa7d1a3e3cd66Daniel Dunbar if (!types::isCXX(InputType)) 10494a5290e773e70ec2c3b4353a3a4aa7d1a3e3cd66Daniel Dunbar Args.AddAllArgsTranslated(CmdArgs, options::OPT_std_default_EQ, 10504a5290e773e70ec2c3b4353a3a4aa7d1a3e3cd66Daniel Dunbar "-std=", /*Joined=*/true); 1051d573d26e1abcce24c31ece3d6f7af158db569e4cDaniel Dunbar Args.AddLastArg(CmdArgs, options::OPT_trigraphs); 1052a3ff202ee4fb21728e930d5d029ba4925129912cDaniel Dunbar } 1053c21c485b4fb58ef5d55cf3e523263dd824a2ace4Daniel Dunbar 10541d46033f760ba5fd266ce59fe391fac473f04f52Daniel Dunbar if (Arg *A = Args.getLastArg(options::OPT_ftemplate_depth_)) { 10551d46033f760ba5fd266ce59fe391fac473f04f52Daniel Dunbar CmdArgs.push_back("-ftemplate-depth"); 10561d46033f760ba5fd266ce59fe391fac473f04f52Daniel Dunbar CmdArgs.push_back(A->getValue(Args)); 1057b488c1dac8e53206f07103d794a62a3f5012c0f4Daniel Dunbar } 1058b488c1dac8e53206f07103d794a62a3f5012c0f4Daniel Dunbar 1059e4bdae78c69d2a09ee96619cc5ccf81441674412Daniel Dunbar if (Args.hasArg(options::OPT__relocatable_pch)) 106066861e09d590994a8b941eaa328e4d8f33adec9eDaniel Dunbar CmdArgs.push_back("-relocatable-pch"); 10611eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump 1062294691eb1caf551083acd7b08630ef21c3fd760dDaniel Dunbar if (Arg *A = Args.getLastArg(options::OPT_fconstant_string_class_EQ)) { 1063294691eb1caf551083acd7b08630ef21c3fd760dDaniel Dunbar CmdArgs.push_back("-fconstant-string-class"); 1064294691eb1caf551083acd7b08630ef21c3fd760dDaniel Dunbar CmdArgs.push_back(A->getValue(Args)); 1065294691eb1caf551083acd7b08630ef21c3fd760dDaniel Dunbar } 10668a5a9aaddb627c0884c2ed8db55cc29fdb601195David Chisnall 1067124fca533d9fef2e3f6359283909bd342b5f5f26Chris Lattner if (Arg *A = Args.getLastArg(options::OPT_ftabstop_EQ)) { 1068124fca533d9fef2e3f6359283909bd342b5f5f26Chris Lattner CmdArgs.push_back("-ftabstop"); 1069124fca533d9fef2e3f6359283909bd342b5f5f26Chris Lattner CmdArgs.push_back(A->getValue(Args)); 1070124fca533d9fef2e3f6359283909bd342b5f5f26Chris Lattner } 1071124fca533d9fef2e3f6359283909bd342b5f5f26Chris Lattner 10720f0c963f9b7ac6f0176c34d405d48fcb005dfab6Chris Lattner CmdArgs.push_back("-ferror-limit"); 10730f0c963f9b7ac6f0176c34d405d48fcb005dfab6Chris Lattner if (Arg *A = Args.getLastArg(options::OPT_ferror_limit_EQ)) 10740f0c963f9b7ac6f0176c34d405d48fcb005dfab6Chris Lattner CmdArgs.push_back(A->getValue(Args)); 10750f0c963f9b7ac6f0176c34d405d48fcb005dfab6Chris Lattner else 10760f0c963f9b7ac6f0176c34d405d48fcb005dfab6Chris Lattner CmdArgs.push_back("19"); 10770f0c963f9b7ac6f0176c34d405d48fcb005dfab6Chris Lattner 107855efe142a84b2aab6d0186c20a311c347a65f794Daniel Dunbar // Pass -fmessage-length=. 1079a28690e5b0e423a6287ebe3a5565fd1896d7ebffDaniel Dunbar CmdArgs.push_back("-fmessage-length"); 108055efe142a84b2aab6d0186c20a311c347a65f794Daniel Dunbar if (Arg *A = Args.getLastArg(options::OPT_fmessage_length_EQ)) { 1081a28690e5b0e423a6287ebe3a5565fd1896d7ebffDaniel Dunbar CmdArgs.push_back(A->getValue(Args)); 108255efe142a84b2aab6d0186c20a311c347a65f794Daniel Dunbar } else { 108355efe142a84b2aab6d0186c20a311c347a65f794Daniel Dunbar // If -fmessage-length=N was not specified, determine whether this is a 108455efe142a84b2aab6d0186c20a311c347a65f794Daniel Dunbar // terminal and, if so, implicitly define -fmessage-length appropriately. 108555efe142a84b2aab6d0186c20a311c347a65f794Daniel Dunbar unsigned N = llvm::sys::Process::StandardErrColumns(); 108655efe142a84b2aab6d0186c20a311c347a65f794Daniel Dunbar CmdArgs.push_back(Args.MakeArgString(llvm::Twine(N))); 108755efe142a84b2aab6d0186c20a311c347a65f794Daniel Dunbar } 108855efe142a84b2aab6d0186c20a311c347a65f794Daniel Dunbar 1089ba8d86172c8d9e2476c6fd2415731639223174c5Daniel Dunbar if (const Arg *A = Args.getLastArg(options::OPT_fvisibility_EQ)) { 1090ba8d86172c8d9e2476c6fd2415731639223174c5Daniel Dunbar CmdArgs.push_back("-fvisibility"); 1091ba8d86172c8d9e2476c6fd2415731639223174c5Daniel Dunbar CmdArgs.push_back(A->getValue(Args)); 1092ba8d86172c8d9e2476c6fd2415731639223174c5Daniel Dunbar } 1093ba8d86172c8d9e2476c6fd2415731639223174c5Daniel Dunbar 10940a80ba74ffa3d3df55abfbc4474d7470c7c923e3Daniel Dunbar // -fhosted is default. 10950a80ba74ffa3d3df55abfbc4474d7470c7c923e3Daniel Dunbar if (KernelOrKext || Args.hasFlag(options::OPT_ffreestanding, 10960a80ba74ffa3d3df55abfbc4474d7470c7c923e3Daniel Dunbar options::OPT_fhosted, 10970a80ba74ffa3d3df55abfbc4474d7470c7c923e3Daniel Dunbar false)) 10980a80ba74ffa3d3df55abfbc4474d7470c7c923e3Daniel Dunbar CmdArgs.push_back("-ffreestanding"); 10990a80ba74ffa3d3df55abfbc4474d7470c7c923e3Daniel Dunbar 1100ba8d86172c8d9e2476c6fd2415731639223174c5Daniel Dunbar // Forward -f (flag) options which we can pass directly. 11019c276ae0f24d4cee8f7954069d4b8eae45d0447dMike Stump Args.AddLastArg(CmdArgs, options::OPT_fcatch_undefined_behavior); 11023aaf082689d3235937a2e56a60f90fc1b3aebfb2Daniel Dunbar Args.AddLastArg(CmdArgs, options::OPT_femit_all_decls); 11033aaf082689d3235937a2e56a60f90fc1b3aebfb2Daniel Dunbar Args.AddLastArg(CmdArgs, options::OPT_fheinous_gnu_extensions); 11048c6fa84b2e4a30317b7b214a7657cb593d67773bDaniel Dunbar 11058c6fa84b2e4a30317b7b214a7657cb593d67773bDaniel Dunbar // -flax-vector-conversions is default. 11068c6fa84b2e4a30317b7b214a7657cb593d67773bDaniel Dunbar if (!Args.hasFlag(options::OPT_flax_vector_conversions, 11078c6fa84b2e4a30317b7b214a7657cb593d67773bDaniel Dunbar options::OPT_fno_lax_vector_conversions)) 11088c6fa84b2e4a30317b7b214a7657cb593d67773bDaniel Dunbar CmdArgs.push_back("-fno-lax-vector-conversions"); 11098c6fa84b2e4a30317b7b214a7657cb593d67773bDaniel Dunbar 11103aaf082689d3235937a2e56a60f90fc1b3aebfb2Daniel Dunbar Args.AddLastArg(CmdArgs, options::OPT_fno_caret_diagnostics); 11113aaf082689d3235937a2e56a60f90fc1b3aebfb2Daniel Dunbar Args.AddLastArg(CmdArgs, options::OPT_fno_show_column); 11123aaf082689d3235937a2e56a60f90fc1b3aebfb2Daniel Dunbar Args.AddLastArg(CmdArgs, options::OPT_fobjc_gc_only); 11133aaf082689d3235937a2e56a60f90fc1b3aebfb2Daniel Dunbar Args.AddLastArg(CmdArgs, options::OPT_fobjc_gc); 111434e65770ad6142b033d6cec4f476ed20fb248bf3Fariborz Jahanian Args.AddLastArg(CmdArgs, options::OPT_fobjc_sender_dependent_dispatch); 1115182e09240a33c6f1d303deecabec6e0e9c9d109dChris Lattner Args.AddLastArg(CmdArgs, options::OPT_fdiagnostics_print_source_range_info); 11163aaf082689d3235937a2e56a60f90fc1b3aebfb2Daniel Dunbar Args.AddLastArg(CmdArgs, options::OPT_ftime_report); 11173aaf082689d3235937a2e56a60f90fc1b3aebfb2Daniel Dunbar Args.AddLastArg(CmdArgs, options::OPT_ftrapv); 11183aaf082689d3235937a2e56a60f90fc1b3aebfb2Daniel Dunbar Args.AddLastArg(CmdArgs, options::OPT_fwritable_strings); 11191d46033f760ba5fd266ce59fe391fac473f04f52Daniel Dunbar 11205345c391c65d1780a0d7b0102b7f735cc3f82732Daniel Dunbar Args.AddLastArg(CmdArgs, options::OPT_pthread); 11215345c391c65d1780a0d7b0102b7f735cc3f82732Daniel Dunbar 11229e5cc6b703b2d0013f13800c2ffbeb3cf85fcfadDaniel Dunbar // -stack-protector=0 is default. 11239e5cc6b703b2d0013f13800c2ffbeb3cf85fcfadDaniel Dunbar unsigned StackProtectorLevel = 0; 112445483f7a1b3e57b4603b141bee80596b2d4dd443Bill Wendling if (Arg *A = Args.getLastArg(options::OPT_fno_stack_protector, 112545483f7a1b3e57b4603b141bee80596b2d4dd443Bill Wendling options::OPT_fstack_protector_all, 112645483f7a1b3e57b4603b141bee80596b2d4dd443Bill Wendling options::OPT_fstack_protector)) { 11279e5cc6b703b2d0013f13800c2ffbeb3cf85fcfadDaniel Dunbar if (A->getOption().matches(options::OPT_fstack_protector)) 11289e5cc6b703b2d0013f13800c2ffbeb3cf85fcfadDaniel Dunbar StackProtectorLevel = 1; 11299e5cc6b703b2d0013f13800c2ffbeb3cf85fcfadDaniel Dunbar else if (A->getOption().matches(options::OPT_fstack_protector_all)) 11309e5cc6b703b2d0013f13800c2ffbeb3cf85fcfadDaniel Dunbar StackProtectorLevel = 2; 11319e5cc6b703b2d0013f13800c2ffbeb3cf85fcfadDaniel Dunbar } else 11329e5cc6b703b2d0013f13800c2ffbeb3cf85fcfadDaniel Dunbar StackProtectorLevel = getToolChain().GetDefaultStackProtectorLevel(); 11339e5cc6b703b2d0013f13800c2ffbeb3cf85fcfadDaniel Dunbar if (StackProtectorLevel) { 11349e5cc6b703b2d0013f13800c2ffbeb3cf85fcfadDaniel Dunbar CmdArgs.push_back("-stack-protector"); 11359e5cc6b703b2d0013f13800c2ffbeb3cf85fcfadDaniel Dunbar CmdArgs.push_back(Args.MakeArgString(llvm::Twine(StackProtectorLevel))); 113645483f7a1b3e57b4603b141bee80596b2d4dd443Bill Wendling } 113745483f7a1b3e57b4603b141bee80596b2d4dd443Bill Wendling 113848d1ef782c8c88066b5febf60f8f456064d7d3f0Daniel Dunbar // Forward -f options with positive and negative forms; we translate 113948d1ef782c8c88066b5febf60f8f456064d7d3f0Daniel Dunbar // these by hand. 114048d1ef782c8c88066b5febf60f8f456064d7d3f0Daniel Dunbar 11419e5cc6b703b2d0013f13800c2ffbeb3cf85fcfadDaniel Dunbar // -fbuiltin is default. 114248d1ef782c8c88066b5febf60f8f456064d7d3f0Daniel Dunbar if (!Args.hasFlag(options::OPT_fbuiltin, options::OPT_fno_builtin)) 114353e8484581ca358c3a2ccd8ea39c136c6e85d606Daniel Dunbar CmdArgs.push_back("-fno-builtin"); 114448d1ef782c8c88066b5febf60f8f456064d7d3f0Daniel Dunbar 1145fc2844846e91398205fddc71196fe9dda04e105fNuno Lopes if (!Args.hasFlag(options::OPT_fassume_sane_operator_new, 1146fc2844846e91398205fddc71196fe9dda04e105fNuno Lopes options::OPT_fno_assume_sane_operator_new)) 1147fc2844846e91398205fddc71196fe9dda04e105fNuno Lopes CmdArgs.push_back("-fno-assume-sane-operator-new"); 1148fc2844846e91398205fddc71196fe9dda04e105fNuno Lopes 11499e5cc6b703b2d0013f13800c2ffbeb3cf85fcfadDaniel Dunbar // -fblocks=0 is default. 11509e5cc6b703b2d0013f13800c2ffbeb3cf85fcfadDaniel Dunbar if (Args.hasFlag(options::OPT_fblocks, options::OPT_fno_blocks, 11515e530af5d51572a0ed5dbe50da54bd333840c63dDavid Chisnall getToolChain().IsBlocksDefault())) { 11529e5cc6b703b2d0013f13800c2ffbeb3cf85fcfadDaniel Dunbar CmdArgs.push_back("-fblocks"); 11535e530af5d51572a0ed5dbe50da54bd333840c63dDavid Chisnall } 115448d1ef782c8c88066b5febf60f8f456064d7d3f0Daniel Dunbar 115532579cf507d088e776b67327c5d6bc46e1f217ccJohn McCall // -faccess-control is default. 11567002f4c03c2d0544f4e8bea8d3a5636519081e35John McCall if (Args.hasFlag(options::OPT_fno_access_control, 11577002f4c03c2d0544f4e8bea8d3a5636519081e35John McCall options::OPT_faccess_control, 115832579cf507d088e776b67327c5d6bc46e1f217ccJohn McCall false)) 11597002f4c03c2d0544f4e8bea8d3a5636519081e35John McCall CmdArgs.push_back("-fno-access-control"); 11603ddd6e026a173e9519e84e27f8d6aed5473b8b4eJohn McCall 11616d2eb4d07d40795131f28d719ef9146a2be500f6Daniel Dunbar // -fexceptions=0 is default. 116285caf03ee49c4de87ee9624a9b725ef5d20ee624Fariborz Jahanian if (needsExceptions(Args, InputType, getToolChain().getTriple())) 1163f759df06d997050559fd925758bcd2cdef24db05Rafael Espindola CmdArgs.push_back("-fexceptions"); 1164738f8c278da5950d0d4607de2debe0bdfad64185Mike Stump 1165b2987d159a88ab0ee2e40c884eb4d77b42ab89b6Daniel Dunbar if (getToolChain().UseSjLjExceptions()) 1166b2987d159a88ab0ee2e40c884eb4d77b42ab89b6Daniel Dunbar CmdArgs.push_back("-fsjlj-exceptions"); 1167b2987d159a88ab0ee2e40c884eb4d77b42ab89b6Daniel Dunbar 11680be42c44f0199c5023b542d6a6d2e66eb594f27dDaniel Dunbar // -frtti is default. 11690a80ba74ffa3d3df55abfbc4474d7470c7c923e3Daniel Dunbar if (KernelOrKext || 11700a80ba74ffa3d3df55abfbc4474d7470c7c923e3Daniel Dunbar !Args.hasFlag(options::OPT_frtti, options::OPT_fno_rtti)) 117153e8484581ca358c3a2ccd8ea39c136c6e85d606Daniel Dunbar CmdArgs.push_back("-fno-rtti"); 1172738f8c278da5950d0d4607de2debe0bdfad64185Mike Stump 11731f95e6567faab67f4363d650f73121359c4bdbabDaniel Dunbar // -fsigned-char is default. 11746d2eb4d07d40795131f28d719ef9146a2be500f6Daniel Dunbar if (!Args.hasFlag(options::OPT_fsigned_char, options::OPT_funsigned_char, 11751f95e6567faab67f4363d650f73121359c4bdbabDaniel Dunbar isSignedCharDefault(getToolChain().getTriple()))) 11767674352cf3e8f699914a2f739f1ae8c8c3480813Daniel Dunbar CmdArgs.push_back("-fno-signed-char"); 11775a77973d9bc2c9cdbdb7860dcf3ac795abe258ecEli Friedman 1178a508b7de6c5246ab04ed69d0ab4e9977ec1fb4d4Anders Carlsson // -fthreadsafe-static is default. 1179a508b7de6c5246ab04ed69d0ab4e9977ec1fb4d4Anders Carlsson if (!Args.hasFlag(options::OPT_fthreadsafe_statics, 1180a508b7de6c5246ab04ed69d0ab4e9977ec1fb4d4Anders Carlsson options::OPT_fno_threadsafe_statics)) 1181a508b7de6c5246ab04ed69d0ab4e9977ec1fb4d4Anders Carlsson CmdArgs.push_back("-fno-threadsafe-statics"); 1182a508b7de6c5246ab04ed69d0ab4e9977ec1fb4d4Anders Carlsson 1183efb0fa9e11f75af51744a6159530ef7cc8efa24aDaniel Dunbar // -fuse-cxa-atexit is default. 11840a80ba74ffa3d3df55abfbc4474d7470c7c923e3Daniel Dunbar if (KernelOrKext || !Args.hasFlag(options::OPT_fuse_cxa_atexit, 11850a80ba74ffa3d3df55abfbc4474d7470c7c923e3Daniel Dunbar options::OPT_fno_use_cxa_atexit)) 1186efb0fa9e11f75af51744a6159530ef7cc8efa24aDaniel Dunbar CmdArgs.push_back("-fno-use-cxa-atexit"); 1187efb0fa9e11f75af51744a6159530ef7cc8efa24aDaniel Dunbar 11880be42c44f0199c5023b542d6a6d2e66eb594f27dDaniel Dunbar // -fms-extensions=0 is default. 11896d2eb4d07d40795131f28d719ef9146a2be500f6Daniel Dunbar if (Args.hasFlag(options::OPT_fms_extensions, options::OPT_fno_ms_extensions, 11900be42c44f0199c5023b542d6a6d2e66eb594f27dDaniel Dunbar getToolChain().getTriple().getOS() == llvm::Triple::Win32)) 11910be42c44f0199c5023b542d6a6d2e66eb594f27dDaniel Dunbar CmdArgs.push_back("-fms-extensions"); 11920be42c44f0199c5023b542d6a6d2e66eb594f27dDaniel Dunbar 1193c5a97ec19408c3dca4b6a6385f11d8c783b94d0bDaniel Dunbar // -fnext-runtime is default. 11946d2eb4d07d40795131f28d719ef9146a2be500f6Daniel Dunbar if (!Args.hasFlag(options::OPT_fnext_runtime, options::OPT_fgnu_runtime, 1195c5a97ec19408c3dca4b6a6385f11d8c783b94d0bDaniel Dunbar getToolChain().getTriple().getOS() == llvm::Triple::Darwin)) 1196c5a97ec19408c3dca4b6a6385f11d8c783b94d0bDaniel Dunbar CmdArgs.push_back("-fgnu-runtime"); 1197c5a97ec19408c3dca4b6a6385f11d8c783b94d0bDaniel Dunbar 11989e5cc6b703b2d0013f13800c2ffbeb3cf85fcfadDaniel Dunbar // -fobjc-nonfragile-abi=0 is default. 11999e5cc6b703b2d0013f13800c2ffbeb3cf85fcfadDaniel Dunbar if (types::isObjC(InputType)) { 12009e5cc6b703b2d0013f13800c2ffbeb3cf85fcfadDaniel Dunbar if (Args.hasArg(options::OPT_fobjc_nonfragile_abi) || 1201984eb8611d9ee46fc6351dee43609f2deed99f3cDaniel Dunbar getToolChain().IsObjCNonFragileABIDefault()) { 12029e5cc6b703b2d0013f13800c2ffbeb3cf85fcfadDaniel Dunbar CmdArgs.push_back("-fobjc-nonfragile-abi"); 1203984eb8611d9ee46fc6351dee43609f2deed99f3cDaniel Dunbar 1204984eb8611d9ee46fc6351dee43609f2deed99f3cDaniel Dunbar // -fobjc-legacy-dispatch is only relevant with the nonfragile-abi, and 1205984eb8611d9ee46fc6351dee43609f2deed99f3cDaniel Dunbar // defaults to off. 1206984eb8611d9ee46fc6351dee43609f2deed99f3cDaniel Dunbar if (Args.hasFlag(options::OPT_fobjc_legacy_dispatch, 1207984eb8611d9ee46fc6351dee43609f2deed99f3cDaniel Dunbar options::OPT_fno_objc_legacy_dispatch, 1208609508ce95732e7e7010f79c5207613eced7c9cbDaniel Dunbar getToolChain().IsObjCLegacyDispatchDefault())) 1209984eb8611d9ee46fc6351dee43609f2deed99f3cDaniel Dunbar CmdArgs.push_back("-fobjc-legacy-dispatch"); 1210984eb8611d9ee46fc6351dee43609f2deed99f3cDaniel Dunbar } 12119e5cc6b703b2d0013f13800c2ffbeb3cf85fcfadDaniel Dunbar } 12129e5cc6b703b2d0013f13800c2ffbeb3cf85fcfadDaniel Dunbar 1213984eb8611d9ee46fc6351dee43609f2deed99f3cDaniel Dunbar if (!Args.hasFlag(options::OPT_fassume_sane_operator_new, 1214984eb8611d9ee46fc6351dee43609f2deed99f3cDaniel Dunbar options::OPT_fno_assume_sane_operator_new)) 1215984eb8611d9ee46fc6351dee43609f2deed99f3cDaniel Dunbar CmdArgs.push_back("-fno-assume-sane-operator-new"); 1216984eb8611d9ee46fc6351dee43609f2deed99f3cDaniel Dunbar 1217a6fda124bf380479529d6a80b84b62cacd3cb707John Thompson // -fshort-wchar default varies depending on platform; only 1218a6fda124bf380479529d6a80b84b62cacd3cb707John Thompson // pass if specified. 1219a6fda124bf380479529d6a80b84b62cacd3cb707John Thompson if (Arg *A = Args.getLastArg(options::OPT_fshort_wchar)) { 1220a6fda124bf380479529d6a80b84b62cacd3cb707John Thompson if (A->getOption().matches(options::OPT_fshort_wchar)) 1221a6fda124bf380479529d6a80b84b62cacd3cb707John Thompson CmdArgs.push_back("-fshort-wchar"); 1222a6fda124bf380479529d6a80b84b62cacd3cb707John Thompson } 1223a6fda124bf380479529d6a80b84b62cacd3cb707John Thompson 1224ee848a73e5f8ffe7511af8652ba811c020d1c7a0Daniel Dunbar // -fno-pascal-strings is default, only pass non-default. If the tool chain 1225ee848a73e5f8ffe7511af8652ba811c020d1c7a0Daniel Dunbar // happened to translate to -mpascal-strings, we want to back translate here. 122682d00688525c876bf47bce414dedae9c343e67f5Daniel Dunbar // 122782d00688525c876bf47bce414dedae9c343e67f5Daniel Dunbar // FIXME: This is gross; that translation should be pulled from the 122882d00688525c876bf47bce414dedae9c343e67f5Daniel Dunbar // tool chain. 1229c21c485b4fb58ef5d55cf3e523263dd824a2ace4Daniel Dunbar if (Args.hasFlag(options::OPT_fpascal_strings, 123082d00688525c876bf47bce414dedae9c343e67f5Daniel Dunbar options::OPT_fno_pascal_strings, 123182d00688525c876bf47bce414dedae9c343e67f5Daniel Dunbar false) || 123282d00688525c876bf47bce414dedae9c343e67f5Daniel Dunbar Args.hasFlag(options::OPT_mpascal_strings, 123382d00688525c876bf47bce414dedae9c343e67f5Daniel Dunbar options::OPT_mno_pascal_strings, 123482d00688525c876bf47bce414dedae9c343e67f5Daniel Dunbar false)) 123548d1ef782c8c88066b5febf60f8f456064d7d3f0Daniel Dunbar CmdArgs.push_back("-fpascal-strings"); 123648d1ef782c8c88066b5febf60f8f456064d7d3f0Daniel Dunbar 123748d1ef782c8c88066b5febf60f8f456064d7d3f0Daniel Dunbar // -fcommon is default, only pass non-default. 123848d1ef782c8c88066b5febf60f8f456064d7d3f0Daniel Dunbar if (!Args.hasFlag(options::OPT_fcommon, options::OPT_fno_common)) 123948d1ef782c8c88066b5febf60f8f456064d7d3f0Daniel Dunbar CmdArgs.push_back("-fno-common"); 124048d1ef782c8c88066b5febf60f8f456064d7d3f0Daniel Dunbar 124170d3c92820f590b10553da9c96eda24e4325ba34Daniel Dunbar // -fsigned-bitfields is default, and clang doesn't yet support 124270d3c92820f590b10553da9c96eda24e4325ba34Daniel Dunbar // --funsigned-bitfields. 12431eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump if (!Args.hasFlag(options::OPT_fsigned_bitfields, 124470d3c92820f590b10553da9c96eda24e4325ba34Daniel Dunbar options::OPT_funsigned_bitfields)) 124570d3c92820f590b10553da9c96eda24e4325ba34Daniel Dunbar D.Diag(clang::diag::warn_drv_clang_unsupported) 124670d3c92820f590b10553da9c96eda24e4325ba34Daniel Dunbar << Args.getLastArg(options::OPT_funsigned_bitfields)->getAsString(Args); 124770d3c92820f590b10553da9c96eda24e4325ba34Daniel Dunbar 124849138fc59eeac2aacd3b7e04c2642180d5baefd7Daniel Dunbar // -fdiagnostics-fixit-info is default, only pass non-default. 12491eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump if (!Args.hasFlag(options::OPT_fdiagnostics_fixit_info, 125049138fc59eeac2aacd3b7e04c2642180d5baefd7Daniel Dunbar options::OPT_fno_diagnostics_fixit_info)) 125149138fc59eeac2aacd3b7e04c2642180d5baefd7Daniel Dunbar CmdArgs.push_back("-fno-diagnostics-fixit-info"); 125249138fc59eeac2aacd3b7e04c2642180d5baefd7Daniel Dunbar 125374f20838caa266f829bf5ae43997f8ebfca54a9aDaniel Dunbar Args.AddLastArg(CmdArgs, options::OPT_fdiagnostics_binary); 1254d93256e55673a17d18543397ec462416acb13792Douglas Gregor 12559e820ee054fefe5422b4db3f681e567a8976747eDaniel Dunbar // Enable -fdiagnostics-show-option by default. 12561eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump if (Args.hasFlag(options::OPT_fdiagnostics_show_option, 12579e820ee054fefe5422b4db3f681e567a8976747eDaniel Dunbar options::OPT_fno_diagnostics_show_option)) 12589e820ee054fefe5422b4db3f681e567a8976747eDaniel Dunbar CmdArgs.push_back("-fdiagnostics-show-option"); 1259838be483dcf10ea3f2acd85f2cd65adc310011f9Daniel Dunbar 1260838be483dcf10ea3f2acd85f2cd65adc310011f9Daniel Dunbar // Color diagnostics are the default, unless the terminal doesn't support 1261838be483dcf10ea3f2acd85f2cd65adc310011f9Daniel Dunbar // them. 1262838be483dcf10ea3f2acd85f2cd65adc310011f9Daniel Dunbar if (Args.hasFlag(options::OPT_fcolor_diagnostics, 1263838be483dcf10ea3f2acd85f2cd65adc310011f9Daniel Dunbar options::OPT_fno_color_diagnostics) && 1264838be483dcf10ea3f2acd85f2cd65adc310011f9Daniel Dunbar llvm::sys::Process::StandardErrHasColors()) 1265838be483dcf10ea3f2acd85f2cd65adc310011f9Daniel Dunbar CmdArgs.push_back("-fcolor-diagnostics"); 1266838be483dcf10ea3f2acd85f2cd65adc310011f9Daniel Dunbar 126775eb1d64784946a37fc0b27596e2d92b6cf7033bDaniel Dunbar if (!Args.hasFlag(options::OPT_fshow_source_location, 126875eb1d64784946a37fc0b27596e2d92b6cf7033bDaniel Dunbar options::OPT_fno_show_source_location)) 126975eb1d64784946a37fc0b27596e2d92b6cf7033bDaniel Dunbar CmdArgs.push_back("-fno-show-source-location"); 12709e820ee054fefe5422b4db3f681e567a8976747eDaniel Dunbar 12717695fba30221613b7cf31276456217c41bb90960Daniel Dunbar // -fdollars-in-identifiers default varies depending on platform and 12727695fba30221613b7cf31276456217c41bb90960Daniel Dunbar // language; only pass if specified. 12731eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump if (Arg *A = Args.getLastArg(options::OPT_fdollars_in_identifiers, 12747695fba30221613b7cf31276456217c41bb90960Daniel Dunbar options::OPT_fno_dollars_in_identifiers)) { 12757695fba30221613b7cf31276456217c41bb90960Daniel Dunbar if (A->getOption().matches(options::OPT_fdollars_in_identifiers)) 12768663b180085e9bc7a0a87c80cc3f722efef99e79Daniel Dunbar CmdArgs.push_back("-fdollars-in-identifiers"); 12777695fba30221613b7cf31276456217c41bb90960Daniel Dunbar else 12788663b180085e9bc7a0a87c80cc3f722efef99e79Daniel Dunbar CmdArgs.push_back("-fno-dollars-in-identifiers"); 12797695fba30221613b7cf31276456217c41bb90960Daniel Dunbar } 12807695fba30221613b7cf31276456217c41bb90960Daniel Dunbar 1281e027a4b2399e9b0acfe0f77220c66bbe369067eeDaniel Dunbar // -funit-at-a-time is default, and we don't support -fno-unit-at-a-time for 1282e027a4b2399e9b0acfe0f77220c66bbe369067eeDaniel Dunbar // practical purposes. 12831eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump if (Arg *A = Args.getLastArg(options::OPT_funit_at_a_time, 1284e027a4b2399e9b0acfe0f77220c66bbe369067eeDaniel Dunbar options::OPT_fno_unit_at_a_time)) { 1285e027a4b2399e9b0acfe0f77220c66bbe369067eeDaniel Dunbar if (A->getOption().matches(options::OPT_fno_unit_at_a_time)) 1286c37691068db5ceb19c014ddd3e02afa9875f8181Edward O'Callaghan D.Diag(clang::diag::warn_drv_clang_unsupported) << A->getAsString(Args); 1287e027a4b2399e9b0acfe0f77220c66bbe369067eeDaniel Dunbar } 1288ceb5c5b7f67a30fae305d1d19b478b623e4fbcedEli Friedman 12892ba91575905a54f712a7f64304e56002e4882499Daniel Dunbar // Default to -fno-builtin-str{cat,cpy} on Darwin for ARM. 1290f84a4a469d8a45c76cb941595582a0fd3b9b15d3Daniel Dunbar // 12918ff5b28d6efcffe2251e77634c7edf83a4763344Daniel Dunbar // FIXME: This is disabled until clang -cc1 supports -fno-builtin-foo. PR4941. 1292f84a4a469d8a45c76cb941595582a0fd3b9b15d3Daniel Dunbar#if 0 12932ba91575905a54f712a7f64304e56002e4882499Daniel Dunbar if (getToolChain().getTriple().getOS() == llvm::Triple::Darwin && 12942ba91575905a54f712a7f64304e56002e4882499Daniel Dunbar (getToolChain().getTriple().getArch() == llvm::Triple::arm || 12952ba91575905a54f712a7f64304e56002e4882499Daniel Dunbar getToolChain().getTriple().getArch() == llvm::Triple::thumb)) { 12962ba91575905a54f712a7f64304e56002e4882499Daniel Dunbar if (!Args.hasArg(options::OPT_fbuiltin_strcat)) 12972ba91575905a54f712a7f64304e56002e4882499Daniel Dunbar CmdArgs.push_back("-fno-builtin-strcat"); 12982ba91575905a54f712a7f64304e56002e4882499Daniel Dunbar if (!Args.hasArg(options::OPT_fbuiltin_strcpy)) 12992ba91575905a54f712a7f64304e56002e4882499Daniel Dunbar CmdArgs.push_back("-fno-builtin-strcpy"); 13002ba91575905a54f712a7f64304e56002e4882499Daniel Dunbar } 1301f84a4a469d8a45c76cb941595582a0fd3b9b15d3Daniel Dunbar#endif 13022ba91575905a54f712a7f64304e56002e4882499Daniel Dunbar 13031eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump if (Arg *A = Args.getLastArg(options::OPT_traditional, 1304ceb5c5b7f67a30fae305d1d19b478b623e4fbcedEli Friedman options::OPT_traditional_cpp)) 1305ceb5c5b7f67a30fae305d1d19b478b623e4fbcedEli Friedman D.Diag(clang::diag::err_drv_clang_unsupported) << A->getAsString(Args); 1306ceb5c5b7f67a30fae305d1d19b478b623e4fbcedEli Friedman 13071d46033f760ba5fd266ce59fe391fac473f04f52Daniel Dunbar Args.AddLastArg(CmdArgs, options::OPT_dM); 1308d82df3ad430397d7f9ef511e7c5157f997c41f53Chris Lattner Args.AddLastArg(CmdArgs, options::OPT_dD); 13091d46033f760ba5fd266ce59fe391fac473f04f52Daniel Dunbar 13101d46033f760ba5fd266ce59fe391fac473f04f52Daniel Dunbar Args.AddAllArgValues(CmdArgs, options::OPT_Xclang); 1311e5280286573d4fe1220cdd66e147b572a05536a8Daniel Dunbar Args.AddAllArgValues(CmdArgs, options::OPT_mllvm); 13121d46033f760ba5fd266ce59fe391fac473f04f52Daniel Dunbar 1313cd8e4c44dd068956e9181381be3ee2d49a0fac52Daniel Dunbar if (Output.getType() == types::TY_Dependencies) { 1314cd8e4c44dd068956e9181381be3ee2d49a0fac52Daniel Dunbar // Handled with other dependency code. 1315a5a7bd0de7b6b80212095195a055a4a43f21d4b2Daniel Dunbar } else if (Output.isPipe()) { 1316b488c1dac8e53206f07103d794a62a3f5012c0f4Daniel Dunbar CmdArgs.push_back("-o"); 1317b488c1dac8e53206f07103d794a62a3f5012c0f4Daniel Dunbar CmdArgs.push_back("-"); 1318115a79277edababaf1b26e3654044ae983197679Daniel Dunbar } else if (Output.isFilename()) { 1319b488c1dac8e53206f07103d794a62a3f5012c0f4Daniel Dunbar CmdArgs.push_back("-o"); 1320115a79277edababaf1b26e3654044ae983197679Daniel Dunbar CmdArgs.push_back(Output.getFilename()); 1321115a79277edababaf1b26e3654044ae983197679Daniel Dunbar } else { 1322115a79277edababaf1b26e3654044ae983197679Daniel Dunbar assert(Output.isNothing() && "Invalid output."); 1323b488c1dac8e53206f07103d794a62a3f5012c0f4Daniel Dunbar } 1324b488c1dac8e53206f07103d794a62a3f5012c0f4Daniel Dunbar 13251d46033f760ba5fd266ce59fe391fac473f04f52Daniel Dunbar for (InputInfoList::const_iterator 13261d46033f760ba5fd266ce59fe391fac473f04f52Daniel Dunbar it = Inputs.begin(), ie = Inputs.end(); it != ie; ++it) { 13271d46033f760ba5fd266ce59fe391fac473f04f52Daniel Dunbar const InputInfo &II = *it; 13281d46033f760ba5fd266ce59fe391fac473f04f52Daniel Dunbar CmdArgs.push_back("-x"); 13291d46033f760ba5fd266ce59fe391fac473f04f52Daniel Dunbar CmdArgs.push_back(types::getTypeName(II.getType())); 13301d46033f760ba5fd266ce59fe391fac473f04f52Daniel Dunbar if (II.isPipe()) 13311d46033f760ba5fd266ce59fe391fac473f04f52Daniel Dunbar CmdArgs.push_back("-"); 1332115a79277edababaf1b26e3654044ae983197679Daniel Dunbar else if (II.isFilename()) 1333115a79277edababaf1b26e3654044ae983197679Daniel Dunbar CmdArgs.push_back(II.getFilename()); 13341d46033f760ba5fd266ce59fe391fac473f04f52Daniel Dunbar else 1335115a79277edababaf1b26e3654044ae983197679Daniel Dunbar II.getInputArg().renderAsInput(Args, CmdArgs); 13361d46033f760ba5fd266ce59fe391fac473f04f52Daniel Dunbar } 1337c21c485b4fb58ef5d55cf3e523263dd824a2ace4Daniel Dunbar 1338e6113de52df132b89c3a5a6141f17d37e83322aeChris Lattner Args.AddAllArgs(CmdArgs, options::OPT_undef); 1339e6113de52df132b89c3a5a6141f17d37e83322aeChris Lattner 1340c21c485b4fb58ef5d55cf3e523263dd824a2ace4Daniel Dunbar const char *Exec = 13418ff5b28d6efcffe2251e77634c7edf83a4763344Daniel Dunbar Args.MakeArgString(getToolChain().GetProgramPath(C, "clang")); 1342f2d8b9f967a1ab53ee9fdbcc3ac0a4ee0a83a26eDaniel Dunbar 1343f2d8b9f967a1ab53ee9fdbcc3ac0a4ee0a83a26eDaniel Dunbar // Optionally embed the -cc1 level arguments into the debug info, for build 1344f2d8b9f967a1ab53ee9fdbcc3ac0a4ee0a83a26eDaniel Dunbar // analysis. 1345f2d8b9f967a1ab53ee9fdbcc3ac0a4ee0a83a26eDaniel Dunbar if (getToolChain().UseDwarfDebugFlags()) { 1346f2d8b9f967a1ab53ee9fdbcc3ac0a4ee0a83a26eDaniel Dunbar llvm::SmallString<256> Flags; 1347f2d8b9f967a1ab53ee9fdbcc3ac0a4ee0a83a26eDaniel Dunbar Flags += Exec; 1348f2d8b9f967a1ab53ee9fdbcc3ac0a4ee0a83a26eDaniel Dunbar for (unsigned i = 0, e = CmdArgs.size(); i != e; ++i) { 1349f2d8b9f967a1ab53ee9fdbcc3ac0a4ee0a83a26eDaniel Dunbar Flags += " "; 1350f2d8b9f967a1ab53ee9fdbcc3ac0a4ee0a83a26eDaniel Dunbar Flags += CmdArgs[i]; 1351f2d8b9f967a1ab53ee9fdbcc3ac0a4ee0a83a26eDaniel Dunbar } 1352f2d8b9f967a1ab53ee9fdbcc3ac0a4ee0a83a26eDaniel Dunbar CmdArgs.push_back("-dwarf-debug-flags"); 1353f2d8b9f967a1ab53ee9fdbcc3ac0a4ee0a83a26eDaniel Dunbar CmdArgs.push_back(Args.MakeArgString(Flags.str())); 1354f2d8b9f967a1ab53ee9fdbcc3ac0a4ee0a83a26eDaniel Dunbar } 1355f2d8b9f967a1ab53ee9fdbcc3ac0a4ee0a83a26eDaniel Dunbar 1356daab7b1016f0a82fefa4f7be6e63c57c06b19ffcDaniel Dunbar Dest.addCommand(new Command(JA, *this, Exec, CmdArgs)); 1357a880db0b0fc028abf754c290d921d809eec0518aDaniel Dunbar 13585c1aaafbd6dd25a99ca1960e1c3c98aeefe9d728Daniel Dunbar // Explicitly warn that these options are unsupported, even though 13595c1aaafbd6dd25a99ca1960e1c3c98aeefe9d728Daniel Dunbar // we are allowing compilation to continue. 1360cdd9686b890ebdc10039ae256ef4c9dfb5ebacb7Daniel Dunbar for (arg_iterator it = Args.filtered_begin(options::OPT_pg), 1361cdd9686b890ebdc10039ae256ef4c9dfb5ebacb7Daniel Dunbar ie = Args.filtered_end(); it != ie; ++it) { 1362cdd9686b890ebdc10039ae256ef4c9dfb5ebacb7Daniel Dunbar it->claim(); 1363cdd9686b890ebdc10039ae256ef4c9dfb5ebacb7Daniel Dunbar D.Diag(clang::diag::warn_drv_clang_unsupported) << it->getAsString(Args); 13645c1aaafbd6dd25a99ca1960e1c3c98aeefe9d728Daniel Dunbar } 13655c1aaafbd6dd25a99ca1960e1c3c98aeefe9d728Daniel Dunbar 136668fb469aeb19144403e703b825854d08353c8eeaDaniel Dunbar // Claim some arguments which clang supports automatically. 136768fb469aeb19144403e703b825854d08353c8eeaDaniel Dunbar 136868fb469aeb19144403e703b825854d08353c8eeaDaniel Dunbar // -fpch-preprocess is used with gcc to add a special marker in the 136968fb469aeb19144403e703b825854d08353c8eeaDaniel Dunbar // -output to include the PCH file. Clang's PTH solution is 137068fb469aeb19144403e703b825854d08353c8eeaDaniel Dunbar // -completely transparent, so we do not need to deal with it at 137168fb469aeb19144403e703b825854d08353c8eeaDaniel Dunbar // -all. 137268fb469aeb19144403e703b825854d08353c8eeaDaniel Dunbar Args.ClaimAllArgs(options::OPT_fpch_preprocess); 1373c21c485b4fb58ef5d55cf3e523263dd824a2ace4Daniel Dunbar 1374a880db0b0fc028abf754c290d921d809eec0518aDaniel Dunbar // Claim some arguments which clang doesn't support, but we don't 1375a880db0b0fc028abf754c290d921d809eec0518aDaniel Dunbar // care to warn the user about. 1376cdd9686b890ebdc10039ae256ef4c9dfb5ebacb7Daniel Dunbar Args.ClaimAllArgs(options::OPT_clang_ignored_f_Group); 1377cdd9686b890ebdc10039ae256ef4c9dfb5ebacb7Daniel Dunbar Args.ClaimAllArgs(options::OPT_clang_ignored_m_Group); 137847ac7d27c44bd64a7d0fc03d4babc196cf2b8230Daniel Dunbar} 137947ac7d27c44bd64a7d0fc03d4babc196cf2b8230Daniel Dunbar 1380b488c1dac8e53206f07103d794a62a3f5012c0f4Daniel Dunbarvoid gcc::Common::ConstructJob(Compilation &C, const JobAction &JA, 1381b488c1dac8e53206f07103d794a62a3f5012c0f4Daniel Dunbar Job &Dest, 1382b488c1dac8e53206f07103d794a62a3f5012c0f4Daniel Dunbar const InputInfo &Output, 1383b488c1dac8e53206f07103d794a62a3f5012c0f4Daniel Dunbar const InputInfoList &Inputs, 13841d46033f760ba5fd266ce59fe391fac473f04f52Daniel Dunbar const ArgList &Args, 1385b488c1dac8e53206f07103d794a62a3f5012c0f4Daniel Dunbar const char *LinkingOutput) const { 1386ee788e70fcd0adf76103b17c78ac658d4ea30c9bDaniel Dunbar const Driver &D = getToolChain().getDriver(); 1387b488c1dac8e53206f07103d794a62a3f5012c0f4Daniel Dunbar ArgStringList CmdArgs; 1388b488c1dac8e53206f07103d794a62a3f5012c0f4Daniel Dunbar 1389c21c485b4fb58ef5d55cf3e523263dd824a2ace4Daniel Dunbar for (ArgList::const_iterator 13901d46033f760ba5fd266ce59fe391fac473f04f52Daniel Dunbar it = Args.begin(), ie = Args.end(); it != ie; ++it) { 1391b488c1dac8e53206f07103d794a62a3f5012c0f4Daniel Dunbar Arg *A = *it; 13927587719c40ebf02bf11e5e66c30bd20e98edebc2Daniel Dunbar if (A->getOption().hasForwardToGCC()) { 13937587719c40ebf02bf11e5e66c30bd20e98edebc2Daniel Dunbar // It is unfortunate that we have to claim here, as this means 13947587719c40ebf02bf11e5e66c30bd20e98edebc2Daniel Dunbar // we will basically never report anything interesting for 13956ecc7a993f939c5255c36c7c0d965fb9c1543f2aDaniel Dunbar // platforms using a generic gcc, even if we are just using gcc 13966ecc7a993f939c5255c36c7c0d965fb9c1543f2aDaniel Dunbar // to get to the assembler. 13977587719c40ebf02bf11e5e66c30bd20e98edebc2Daniel Dunbar A->claim(); 13981d46033f760ba5fd266ce59fe391fac473f04f52Daniel Dunbar A->render(Args, CmdArgs); 13997587719c40ebf02bf11e5e66c30bd20e98edebc2Daniel Dunbar } 1400b488c1dac8e53206f07103d794a62a3f5012c0f4Daniel Dunbar } 1401c21c485b4fb58ef5d55cf3e523263dd824a2ace4Daniel Dunbar 140282b51cce8cea6b6bb6175c406c2ab425c91d9dc8Daniel Dunbar RenderExtraToolArgs(JA, CmdArgs); 1403b488c1dac8e53206f07103d794a62a3f5012c0f4Daniel Dunbar 1404b488c1dac8e53206f07103d794a62a3f5012c0f4Daniel Dunbar // If using a driver driver, force the arch. 14057cfe31a713d8fcfc2a1328e8fbd8efdeb0aec51bDaniel Dunbar const std::string &Arch = getToolChain().getArchName(); 14061bda434673d3c51a2ba6b412f100ccfcf3e7083fDaniel Dunbar if (getToolChain().getTriple().getOS() == llvm::Triple::Darwin) { 1407b488c1dac8e53206f07103d794a62a3f5012c0f4Daniel Dunbar CmdArgs.push_back("-arch"); 1408bf54a06f9b771c2a2730cc63eb89bce0522515b5Daniel Dunbar 1409bf54a06f9b771c2a2730cc63eb89bce0522515b5Daniel Dunbar // FIXME: Remove these special cases. 14107cfe31a713d8fcfc2a1328e8fbd8efdeb0aec51bDaniel Dunbar if (Arch == "powerpc") 14117cfe31a713d8fcfc2a1328e8fbd8efdeb0aec51bDaniel Dunbar CmdArgs.push_back("ppc"); 14127cfe31a713d8fcfc2a1328e8fbd8efdeb0aec51bDaniel Dunbar else if (Arch == "powerpc64") 14137cfe31a713d8fcfc2a1328e8fbd8efdeb0aec51bDaniel Dunbar CmdArgs.push_back("ppc64"); 14147cfe31a713d8fcfc2a1328e8fbd8efdeb0aec51bDaniel Dunbar else 1415881376467c46c5c6cc16fa6790271c2c22e1d4f1Daniel Dunbar CmdArgs.push_back(Args.MakeArgString(Arch)); 1416b488c1dac8e53206f07103d794a62a3f5012c0f4Daniel Dunbar } 1417b488c1dac8e53206f07103d794a62a3f5012c0f4Daniel Dunbar 14186ecc7a993f939c5255c36c7c0d965fb9c1543f2aDaniel Dunbar // Try to force gcc to match the tool chain we want, if we recognize 14196ecc7a993f939c5255c36c7c0d965fb9c1543f2aDaniel Dunbar // the arch. 14207cfe31a713d8fcfc2a1328e8fbd8efdeb0aec51bDaniel Dunbar // 14217cfe31a713d8fcfc2a1328e8fbd8efdeb0aec51bDaniel Dunbar // FIXME: The triple class should directly provide the information we want 14227cfe31a713d8fcfc2a1328e8fbd8efdeb0aec51bDaniel Dunbar // here. 14237cfe31a713d8fcfc2a1328e8fbd8efdeb0aec51bDaniel Dunbar if (Arch == "i386" || Arch == "powerpc") 14246ecc7a993f939c5255c36c7c0d965fb9c1543f2aDaniel Dunbar CmdArgs.push_back("-m32"); 14257cfe31a713d8fcfc2a1328e8fbd8efdeb0aec51bDaniel Dunbar else if (Arch == "x86_64" || Arch == "powerpc64") 14266ecc7a993f939c5255c36c7c0d965fb9c1543f2aDaniel Dunbar CmdArgs.push_back("-m64"); 14276ecc7a993f939c5255c36c7c0d965fb9c1543f2aDaniel Dunbar 1428b488c1dac8e53206f07103d794a62a3f5012c0f4Daniel Dunbar if (Output.isPipe()) { 1429b488c1dac8e53206f07103d794a62a3f5012c0f4Daniel Dunbar CmdArgs.push_back("-o"); 1430b488c1dac8e53206f07103d794a62a3f5012c0f4Daniel Dunbar CmdArgs.push_back("-"); 1431115a79277edababaf1b26e3654044ae983197679Daniel Dunbar } else if (Output.isFilename()) { 1432b488c1dac8e53206f07103d794a62a3f5012c0f4Daniel Dunbar CmdArgs.push_back("-o"); 1433115a79277edababaf1b26e3654044ae983197679Daniel Dunbar CmdArgs.push_back(Output.getFilename()); 1434115a79277edababaf1b26e3654044ae983197679Daniel Dunbar } else { 1435115a79277edababaf1b26e3654044ae983197679Daniel Dunbar assert(Output.isNothing() && "Unexpected output"); 1436b488c1dac8e53206f07103d794a62a3f5012c0f4Daniel Dunbar CmdArgs.push_back("-fsyntax-only"); 1437115a79277edababaf1b26e3654044ae983197679Daniel Dunbar } 1438b488c1dac8e53206f07103d794a62a3f5012c0f4Daniel Dunbar 1439b488c1dac8e53206f07103d794a62a3f5012c0f4Daniel Dunbar 1440b488c1dac8e53206f07103d794a62a3f5012c0f4Daniel Dunbar // Only pass -x if gcc will understand it; otherwise hope gcc 1441b488c1dac8e53206f07103d794a62a3f5012c0f4Daniel Dunbar // understands the suffix correctly. The main use case this would go 1442b488c1dac8e53206f07103d794a62a3f5012c0f4Daniel Dunbar // wrong in is for linker inputs if they happened to have an odd 1443b488c1dac8e53206f07103d794a62a3f5012c0f4Daniel Dunbar // suffix; really the only way to get this to happen is a command 1444b488c1dac8e53206f07103d794a62a3f5012c0f4Daniel Dunbar // like '-x foobar a.c' which will treat a.c like a linker input. 1445b488c1dac8e53206f07103d794a62a3f5012c0f4Daniel Dunbar // 1446b488c1dac8e53206f07103d794a62a3f5012c0f4Daniel Dunbar // FIXME: For the linker case specifically, can we safely convert 1447b488c1dac8e53206f07103d794a62a3f5012c0f4Daniel Dunbar // inputs into '-Wl,' options? 1448b488c1dac8e53206f07103d794a62a3f5012c0f4Daniel Dunbar for (InputInfoList::const_iterator 1449b488c1dac8e53206f07103d794a62a3f5012c0f4Daniel Dunbar it = Inputs.begin(), ie = Inputs.end(); it != ie; ++it) { 1450b488c1dac8e53206f07103d794a62a3f5012c0f4Daniel Dunbar const InputInfo &II = *it; 1451a8304f67291b0182fb64f3afc621615288dd1d31Daniel Dunbar 14525915fbf310e171c4cd3c2af05e9de360c0fa988aDaniel Dunbar // Don't try to pass LLVM or AST inputs to a generic gcc. 1453a8304f67291b0182fb64f3afc621615288dd1d31Daniel Dunbar if (II.getType() == types::TY_LLVMBC) 1454a8304f67291b0182fb64f3afc621615288dd1d31Daniel Dunbar D.Diag(clang::diag::err_drv_no_linker_llvm_support) 1455881376467c46c5c6cc16fa6790271c2c22e1d4f1Daniel Dunbar << getToolChain().getTripleString(); 14565915fbf310e171c4cd3c2af05e9de360c0fa988aDaniel Dunbar else if (II.getType() == types::TY_AST) 14575915fbf310e171c4cd3c2af05e9de360c0fa988aDaniel Dunbar D.Diag(clang::diag::err_drv_no_ast_support) 1458881376467c46c5c6cc16fa6790271c2c22e1d4f1Daniel Dunbar << getToolChain().getTripleString(); 1459a8304f67291b0182fb64f3afc621615288dd1d31Daniel Dunbar 1460b488c1dac8e53206f07103d794a62a3f5012c0f4Daniel Dunbar if (types::canTypeBeUserSpecified(II.getType())) { 1461b488c1dac8e53206f07103d794a62a3f5012c0f4Daniel Dunbar CmdArgs.push_back("-x"); 1462b488c1dac8e53206f07103d794a62a3f5012c0f4Daniel Dunbar CmdArgs.push_back(types::getTypeName(II.getType())); 1463b488c1dac8e53206f07103d794a62a3f5012c0f4Daniel Dunbar } 1464b488c1dac8e53206f07103d794a62a3f5012c0f4Daniel Dunbar 1465b488c1dac8e53206f07103d794a62a3f5012c0f4Daniel Dunbar if (II.isPipe()) 1466b488c1dac8e53206f07103d794a62a3f5012c0f4Daniel Dunbar CmdArgs.push_back("-"); 1467115a79277edababaf1b26e3654044ae983197679Daniel Dunbar else if (II.isFilename()) 1468115a79277edababaf1b26e3654044ae983197679Daniel Dunbar CmdArgs.push_back(II.getFilename()); 1469b488c1dac8e53206f07103d794a62a3f5012c0f4Daniel Dunbar else 1470115a79277edababaf1b26e3654044ae983197679Daniel Dunbar // Don't render as input, we need gcc to do the translations. 1471115a79277edababaf1b26e3654044ae983197679Daniel Dunbar II.getInputArg().render(Args, CmdArgs); 1472b488c1dac8e53206f07103d794a62a3f5012c0f4Daniel Dunbar } 1473b488c1dac8e53206f07103d794a62a3f5012c0f4Daniel Dunbar 1474ee788e70fcd0adf76103b17c78ac658d4ea30c9bDaniel Dunbar const char *GCCName = getToolChain().getDriver().CCCGenericGCCName.c_str(); 1475c21c485b4fb58ef5d55cf3e523263dd824a2ace4Daniel Dunbar const char *Exec = 14765ed34f4c58b6ad4e21038d713c1fae31a6146ff5Daniel Dunbar Args.MakeArgString(getToolChain().GetProgramPath(C, GCCName)); 1477daab7b1016f0a82fefa4f7be6e63c57c06b19ffcDaniel Dunbar Dest.addCommand(new Command(JA, *this, Exec, CmdArgs)); 147847ac7d27c44bd64a7d0fc03d4babc196cf2b8230Daniel Dunbar} 147947ac7d27c44bd64a7d0fc03d4babc196cf2b8230Daniel Dunbar 148082b51cce8cea6b6bb6175c406c2ab425c91d9dc8Daniel Dunbarvoid gcc::Preprocess::RenderExtraToolArgs(const JobAction &JA, 148182b51cce8cea6b6bb6175c406c2ab425c91d9dc8Daniel Dunbar ArgStringList &CmdArgs) const { 1482b488c1dac8e53206f07103d794a62a3f5012c0f4Daniel Dunbar CmdArgs.push_back("-E"); 148347ac7d27c44bd64a7d0fc03d4babc196cf2b8230Daniel Dunbar} 148447ac7d27c44bd64a7d0fc03d4babc196cf2b8230Daniel Dunbar 148582b51cce8cea6b6bb6175c406c2ab425c91d9dc8Daniel Dunbarvoid gcc::Precompile::RenderExtraToolArgs(const JobAction &JA, 148682b51cce8cea6b6bb6175c406c2ab425c91d9dc8Daniel Dunbar ArgStringList &CmdArgs) const { 1487b488c1dac8e53206f07103d794a62a3f5012c0f4Daniel Dunbar // The type is good enough. 148847ac7d27c44bd64a7d0fc03d4babc196cf2b8230Daniel Dunbar} 148947ac7d27c44bd64a7d0fc03d4babc196cf2b8230Daniel Dunbar 149082b51cce8cea6b6bb6175c406c2ab425c91d9dc8Daniel Dunbarvoid gcc::Compile::RenderExtraToolArgs(const JobAction &JA, 149182b51cce8cea6b6bb6175c406c2ab425c91d9dc8Daniel Dunbar ArgStringList &CmdArgs) const { 149264952508c2b0c8bffb45c8b410f0af3d2457f59bDaniel Dunbar const Driver &D = getToolChain().getDriver(); 149364952508c2b0c8bffb45c8b410f0af3d2457f59bDaniel Dunbar 149482b51cce8cea6b6bb6175c406c2ab425c91d9dc8Daniel Dunbar // If -flto, etc. are present then make sure not to force assembly output. 149582b51cce8cea6b6bb6175c406c2ab425c91d9dc8Daniel Dunbar if (JA.getType() == types::TY_LLVMBC) 149682b51cce8cea6b6bb6175c406c2ab425c91d9dc8Daniel Dunbar CmdArgs.push_back("-c"); 149764952508c2b0c8bffb45c8b410f0af3d2457f59bDaniel Dunbar else { 149864952508c2b0c8bffb45c8b410f0af3d2457f59bDaniel Dunbar if (JA.getType() != types::TY_PP_Asm) 149964952508c2b0c8bffb45c8b410f0af3d2457f59bDaniel Dunbar D.Diag(clang::diag::err_drv_invalid_gcc_output_type) 150064952508c2b0c8bffb45c8b410f0af3d2457f59bDaniel Dunbar << getTypeName(JA.getType()); 150164952508c2b0c8bffb45c8b410f0af3d2457f59bDaniel Dunbar 150282b51cce8cea6b6bb6175c406c2ab425c91d9dc8Daniel Dunbar CmdArgs.push_back("-S"); 150364952508c2b0c8bffb45c8b410f0af3d2457f59bDaniel Dunbar } 150447ac7d27c44bd64a7d0fc03d4babc196cf2b8230Daniel Dunbar} 150547ac7d27c44bd64a7d0fc03d4babc196cf2b8230Daniel Dunbar 150682b51cce8cea6b6bb6175c406c2ab425c91d9dc8Daniel Dunbarvoid gcc::Assemble::RenderExtraToolArgs(const JobAction &JA, 150782b51cce8cea6b6bb6175c406c2ab425c91d9dc8Daniel Dunbar ArgStringList &CmdArgs) const { 1508b488c1dac8e53206f07103d794a62a3f5012c0f4Daniel Dunbar CmdArgs.push_back("-c"); 1509b488c1dac8e53206f07103d794a62a3f5012c0f4Daniel Dunbar} 151047ac7d27c44bd64a7d0fc03d4babc196cf2b8230Daniel Dunbar 151182b51cce8cea6b6bb6175c406c2ab425c91d9dc8Daniel Dunbarvoid gcc::Link::RenderExtraToolArgs(const JobAction &JA, 151282b51cce8cea6b6bb6175c406c2ab425c91d9dc8Daniel Dunbar ArgStringList &CmdArgs) const { 1513b488c1dac8e53206f07103d794a62a3f5012c0f4Daniel Dunbar // The types are (hopefully) good enough. 151447ac7d27c44bd64a7d0fc03d4babc196cf2b8230Daniel Dunbar} 1515b488c1dac8e53206f07103d794a62a3f5012c0f4Daniel Dunbar 151640f1265ebd42ece3e7f7917319b56012e8e2bce2Daniel Dunbarconst char *darwin::CC1::getCC1Name(types::ID Type) const { 151740f1265ebd42ece3e7f7917319b56012e8e2bce2Daniel Dunbar switch (Type) { 151840f1265ebd42ece3e7f7917319b56012e8e2bce2Daniel Dunbar default: 151940f1265ebd42ece3e7f7917319b56012e8e2bce2Daniel Dunbar assert(0 && "Unexpected type for Darwin CC1 tool."); 152040f1265ebd42ece3e7f7917319b56012e8e2bce2Daniel Dunbar case types::TY_Asm: 152140f1265ebd42ece3e7f7917319b56012e8e2bce2Daniel Dunbar case types::TY_C: case types::TY_CHeader: 152240f1265ebd42ece3e7f7917319b56012e8e2bce2Daniel Dunbar case types::TY_PP_C: case types::TY_PP_CHeader: 152340f1265ebd42ece3e7f7917319b56012e8e2bce2Daniel Dunbar return "cc1"; 152440f1265ebd42ece3e7f7917319b56012e8e2bce2Daniel Dunbar case types::TY_ObjC: case types::TY_ObjCHeader: 152540f1265ebd42ece3e7f7917319b56012e8e2bce2Daniel Dunbar case types::TY_PP_ObjC: case types::TY_PP_ObjCHeader: 152640f1265ebd42ece3e7f7917319b56012e8e2bce2Daniel Dunbar return "cc1obj"; 152740f1265ebd42ece3e7f7917319b56012e8e2bce2Daniel Dunbar case types::TY_CXX: case types::TY_CXXHeader: 152840f1265ebd42ece3e7f7917319b56012e8e2bce2Daniel Dunbar case types::TY_PP_CXX: case types::TY_PP_CXXHeader: 152940f1265ebd42ece3e7f7917319b56012e8e2bce2Daniel Dunbar return "cc1plus"; 153040f1265ebd42ece3e7f7917319b56012e8e2bce2Daniel Dunbar case types::TY_ObjCXX: case types::TY_ObjCXXHeader: 153140f1265ebd42ece3e7f7917319b56012e8e2bce2Daniel Dunbar case types::TY_PP_ObjCXX: case types::TY_PP_ObjCXXHeader: 153240f1265ebd42ece3e7f7917319b56012e8e2bce2Daniel Dunbar return "cc1objplus"; 153340f1265ebd42ece3e7f7917319b56012e8e2bce2Daniel Dunbar } 153440f1265ebd42ece3e7f7917319b56012e8e2bce2Daniel Dunbar} 153540f1265ebd42ece3e7f7917319b56012e8e2bce2Daniel Dunbar 1536c21c485b4fb58ef5d55cf3e523263dd824a2ace4Daniel Dunbarconst char *darwin::CC1::getBaseInputName(const ArgList &Args, 1537a5a7bd0de7b6b80212095195a055a4a43f21d4b2Daniel Dunbar const InputInfoList &Inputs) { 1538a3ec60e0cf2a1916f479288998d31bd980b1a306Daniel Dunbar llvm::sys::Path P(Inputs[0].getBaseInput()); 1539881376467c46c5c6cc16fa6790271c2c22e1d4f1Daniel Dunbar return Args.MakeArgString(P.getLast()); 1540a3ec60e0cf2a1916f479288998d31bd980b1a306Daniel Dunbar} 1541a3ec60e0cf2a1916f479288998d31bd980b1a306Daniel Dunbar 1542c21c485b4fb58ef5d55cf3e523263dd824a2ace4Daniel Dunbarconst char *darwin::CC1::getBaseInputStem(const ArgList &Args, 1543a5a7bd0de7b6b80212095195a055a4a43f21d4b2Daniel Dunbar const InputInfoList &Inputs) { 1544a3ec60e0cf2a1916f479288998d31bd980b1a306Daniel Dunbar const char *Str = getBaseInputName(Args, Inputs); 1545a3ec60e0cf2a1916f479288998d31bd980b1a306Daniel Dunbar 1546a3ec60e0cf2a1916f479288998d31bd980b1a306Daniel Dunbar if (const char *End = strchr(Str, '.')) 1547881376467c46c5c6cc16fa6790271c2c22e1d4f1Daniel Dunbar return Args.MakeArgString(std::string(Str, End)); 1548a3ec60e0cf2a1916f479288998d31bd980b1a306Daniel Dunbar 1549a3ec60e0cf2a1916f479288998d31bd980b1a306Daniel Dunbar return Str; 1550a3ec60e0cf2a1916f479288998d31bd980b1a306Daniel Dunbar} 1551a3ec60e0cf2a1916f479288998d31bd980b1a306Daniel Dunbar 1552a3ec60e0cf2a1916f479288998d31bd980b1a306Daniel Dunbarconst char * 1553c21c485b4fb58ef5d55cf3e523263dd824a2ace4Daniel Dunbardarwin::CC1::getDependencyFileName(const ArgList &Args, 1554a5a7bd0de7b6b80212095195a055a4a43f21d4b2Daniel Dunbar const InputInfoList &Inputs) { 1555a3ec60e0cf2a1916f479288998d31bd980b1a306Daniel Dunbar // FIXME: Think about this more. 1556a3ec60e0cf2a1916f479288998d31bd980b1a306Daniel Dunbar std::string Res; 1557a3ec60e0cf2a1916f479288998d31bd980b1a306Daniel Dunbar 1558a3ec60e0cf2a1916f479288998d31bd980b1a306Daniel Dunbar if (Arg *OutputOpt = Args.getLastArg(options::OPT_o)) { 1559a3ec60e0cf2a1916f479288998d31bd980b1a306Daniel Dunbar std::string Str(OutputOpt->getValue(Args)); 1560c21c485b4fb58ef5d55cf3e523263dd824a2ace4Daniel Dunbar 1561a3ec60e0cf2a1916f479288998d31bd980b1a306Daniel Dunbar Res = Str.substr(0, Str.rfind('.')); 1562a3ec60e0cf2a1916f479288998d31bd980b1a306Daniel Dunbar } else 1563a5a7bd0de7b6b80212095195a055a4a43f21d4b2Daniel Dunbar Res = darwin::CC1::getBaseInputStem(Args, Inputs); 1564a3ec60e0cf2a1916f479288998d31bd980b1a306Daniel Dunbar 1565881376467c46c5c6cc16fa6790271c2c22e1d4f1Daniel Dunbar return Args.MakeArgString(Res + ".d"); 1566a3ec60e0cf2a1916f479288998d31bd980b1a306Daniel Dunbar} 1567a3ec60e0cf2a1916f479288998d31bd980b1a306Daniel Dunbar 1568c21c485b4fb58ef5d55cf3e523263dd824a2ace4Daniel Dunbarvoid darwin::CC1::AddCC1Args(const ArgList &Args, 1569a3ec60e0cf2a1916f479288998d31bd980b1a306Daniel Dunbar ArgStringList &CmdArgs) const { 1570ee788e70fcd0adf76103b17c78ac658d4ea30c9bDaniel Dunbar const Driver &D = getToolChain().getDriver(); 1571e2fd66418eca3d70cf6b62087d745d0c5181db69Daniel Dunbar 1572e2fd66418eca3d70cf6b62087d745d0c5181db69Daniel Dunbar CheckCodeGenerationOptions(D, Args); 1573e2fd66418eca3d70cf6b62087d745d0c5181db69Daniel Dunbar 1574a3ec60e0cf2a1916f479288998d31bd980b1a306Daniel Dunbar // Derived from cc1 spec. 1575a3ec60e0cf2a1916f479288998d31bd980b1a306Daniel Dunbar if (!Args.hasArg(options::OPT_mkernel) && !Args.hasArg(options::OPT_static) && 1576a3ec60e0cf2a1916f479288998d31bd980b1a306Daniel Dunbar !Args.hasArg(options::OPT_mdynamic_no_pic)) 1577a3ec60e0cf2a1916f479288998d31bd980b1a306Daniel Dunbar CmdArgs.push_back("-fPIC"); 1578a3ec60e0cf2a1916f479288998d31bd980b1a306Daniel Dunbar 15792ba91575905a54f712a7f64304e56002e4882499Daniel Dunbar if (getToolChain().getTriple().getArch() == llvm::Triple::arm || 15802ba91575905a54f712a7f64304e56002e4882499Daniel Dunbar getToolChain().getTriple().getArch() == llvm::Triple::thumb) { 15812ba91575905a54f712a7f64304e56002e4882499Daniel Dunbar if (!Args.hasArg(options::OPT_fbuiltin_strcat)) 15822ba91575905a54f712a7f64304e56002e4882499Daniel Dunbar CmdArgs.push_back("-fno-builtin-strcat"); 15832ba91575905a54f712a7f64304e56002e4882499Daniel Dunbar if (!Args.hasArg(options::OPT_fbuiltin_strcpy)) 15842ba91575905a54f712a7f64304e56002e4882499Daniel Dunbar CmdArgs.push_back("-fno-builtin-strcpy"); 15852ba91575905a54f712a7f64304e56002e4882499Daniel Dunbar } 15862ba91575905a54f712a7f64304e56002e4882499Daniel Dunbar 1587a3ec60e0cf2a1916f479288998d31bd980b1a306Daniel Dunbar // gcc has some code here to deal with when no -mmacosx-version-min 1588a3ec60e0cf2a1916f479288998d31bd980b1a306Daniel Dunbar // and no -miphoneos-version-min is present, but this never happens 1589a3ec60e0cf2a1916f479288998d31bd980b1a306Daniel Dunbar // due to tool chain specific argument translation. 1590a3ec60e0cf2a1916f479288998d31bd980b1a306Daniel Dunbar 1591a3ec60e0cf2a1916f479288998d31bd980b1a306Daniel Dunbar if (Args.hasArg(options::OPT_g_Flag) && 1592a3ec60e0cf2a1916f479288998d31bd980b1a306Daniel Dunbar !Args.hasArg(options::OPT_fno_eliminate_unused_debug_symbols)) 1593a3ec60e0cf2a1916f479288998d31bd980b1a306Daniel Dunbar CmdArgs.push_back("-feliminate-unused-debug-symbols"); 1594a3ec60e0cf2a1916f479288998d31bd980b1a306Daniel Dunbar} 1595a3ec60e0cf2a1916f479288998d31bd980b1a306Daniel Dunbar 1596a3ec60e0cf2a1916f479288998d31bd980b1a306Daniel Dunbarvoid darwin::CC1::AddCC1OptionsArgs(const ArgList &Args, ArgStringList &CmdArgs, 1597a3ec60e0cf2a1916f479288998d31bd980b1a306Daniel Dunbar const InputInfoList &Inputs, 1598a3ec60e0cf2a1916f479288998d31bd980b1a306Daniel Dunbar const ArgStringList &OutputArgs) const { 1599ee788e70fcd0adf76103b17c78ac658d4ea30c9bDaniel Dunbar const Driver &D = getToolChain().getDriver(); 1600a3ec60e0cf2a1916f479288998d31bd980b1a306Daniel Dunbar 1601a3ec60e0cf2a1916f479288998d31bd980b1a306Daniel Dunbar // Derived from cc1_options spec. 1602a3ec60e0cf2a1916f479288998d31bd980b1a306Daniel Dunbar if (Args.hasArg(options::OPT_fast) || 1603a3ec60e0cf2a1916f479288998d31bd980b1a306Daniel Dunbar Args.hasArg(options::OPT_fastf) || 1604a3ec60e0cf2a1916f479288998d31bd980b1a306Daniel Dunbar Args.hasArg(options::OPT_fastcp)) 1605a3ec60e0cf2a1916f479288998d31bd980b1a306Daniel Dunbar CmdArgs.push_back("-O3"); 1606c21c485b4fb58ef5d55cf3e523263dd824a2ace4Daniel Dunbar 1607a3ec60e0cf2a1916f479288998d31bd980b1a306Daniel Dunbar if (Arg *A = Args.getLastArg(options::OPT_pg)) 1608a3ec60e0cf2a1916f479288998d31bd980b1a306Daniel Dunbar if (Args.hasArg(options::OPT_fomit_frame_pointer)) 1609a3ec60e0cf2a1916f479288998d31bd980b1a306Daniel Dunbar D.Diag(clang::diag::err_drv_argument_not_allowed_with) 1610a3ec60e0cf2a1916f479288998d31bd980b1a306Daniel Dunbar << A->getAsString(Args) << "-fomit-frame-pointer"; 1611a3ec60e0cf2a1916f479288998d31bd980b1a306Daniel Dunbar 1612a3ec60e0cf2a1916f479288998d31bd980b1a306Daniel Dunbar AddCC1Args(Args, CmdArgs); 1613a3ec60e0cf2a1916f479288998d31bd980b1a306Daniel Dunbar 1614a3ec60e0cf2a1916f479288998d31bd980b1a306Daniel Dunbar if (!Args.hasArg(options::OPT_Q)) 1615a3ec60e0cf2a1916f479288998d31bd980b1a306Daniel Dunbar CmdArgs.push_back("-quiet"); 1616a3ec60e0cf2a1916f479288998d31bd980b1a306Daniel Dunbar 1617a3ec60e0cf2a1916f479288998d31bd980b1a306Daniel Dunbar CmdArgs.push_back("-dumpbase"); 1618a5a7bd0de7b6b80212095195a055a4a43f21d4b2Daniel Dunbar CmdArgs.push_back(darwin::CC1::getBaseInputName(Args, Inputs)); 1619a3ec60e0cf2a1916f479288998d31bd980b1a306Daniel Dunbar 1620a3ec60e0cf2a1916f479288998d31bd980b1a306Daniel Dunbar Args.AddAllArgs(CmdArgs, options::OPT_d_Group); 1621a3ec60e0cf2a1916f479288998d31bd980b1a306Daniel Dunbar 1622a3ec60e0cf2a1916f479288998d31bd980b1a306Daniel Dunbar Args.AddAllArgs(CmdArgs, options::OPT_m_Group); 1623a3ec60e0cf2a1916f479288998d31bd980b1a306Daniel Dunbar Args.AddAllArgs(CmdArgs, options::OPT_a_Group); 1624a3ec60e0cf2a1916f479288998d31bd980b1a306Daniel Dunbar 1625a3ec60e0cf2a1916f479288998d31bd980b1a306Daniel Dunbar // FIXME: The goal is to use the user provided -o if that is our 1626a3ec60e0cf2a1916f479288998d31bd980b1a306Daniel Dunbar // final output, otherwise to drive from the original input 1627a3ec60e0cf2a1916f479288998d31bd980b1a306Daniel Dunbar // name. Find a clean way to go about this. 1628a3ec60e0cf2a1916f479288998d31bd980b1a306Daniel Dunbar if ((Args.hasArg(options::OPT_c) || Args.hasArg(options::OPT_S)) && 1629a3ec60e0cf2a1916f479288998d31bd980b1a306Daniel Dunbar Args.hasArg(options::OPT_o)) { 1630a3ec60e0cf2a1916f479288998d31bd980b1a306Daniel Dunbar Arg *OutputOpt = Args.getLastArg(options::OPT_o); 1631a3ec60e0cf2a1916f479288998d31bd980b1a306Daniel Dunbar CmdArgs.push_back("-auxbase-strip"); 1632a3ec60e0cf2a1916f479288998d31bd980b1a306Daniel Dunbar CmdArgs.push_back(OutputOpt->getValue(Args)); 1633a3ec60e0cf2a1916f479288998d31bd980b1a306Daniel Dunbar } else { 1634a3ec60e0cf2a1916f479288998d31bd980b1a306Daniel Dunbar CmdArgs.push_back("-auxbase"); 1635a5a7bd0de7b6b80212095195a055a4a43f21d4b2Daniel Dunbar CmdArgs.push_back(darwin::CC1::getBaseInputStem(Args, Inputs)); 1636a3ec60e0cf2a1916f479288998d31bd980b1a306Daniel Dunbar } 1637a3ec60e0cf2a1916f479288998d31bd980b1a306Daniel Dunbar 1638a3ec60e0cf2a1916f479288998d31bd980b1a306Daniel Dunbar Args.AddAllArgs(CmdArgs, options::OPT_g_Group); 1639a3ec60e0cf2a1916f479288998d31bd980b1a306Daniel Dunbar 1640a3ec60e0cf2a1916f479288998d31bd980b1a306Daniel Dunbar Args.AddAllArgs(CmdArgs, options::OPT_O); 1641a3ec60e0cf2a1916f479288998d31bd980b1a306Daniel Dunbar // FIXME: -Wall is getting some special treatment. Investigate. 1642a3ec60e0cf2a1916f479288998d31bd980b1a306Daniel Dunbar Args.AddAllArgs(CmdArgs, options::OPT_W_Group, options::OPT_pedantic_Group); 1643a3ec60e0cf2a1916f479288998d31bd980b1a306Daniel Dunbar Args.AddLastArg(CmdArgs, options::OPT_w); 1644c21c485b4fb58ef5d55cf3e523263dd824a2ace4Daniel Dunbar Args.AddAllArgs(CmdArgs, options::OPT_std_EQ, options::OPT_ansi, 1645a3ec60e0cf2a1916f479288998d31bd980b1a306Daniel Dunbar options::OPT_trigraphs); 1646a3ff202ee4fb21728e930d5d029ba4925129912cDaniel Dunbar if (!Args.getLastArg(options::OPT_std_EQ, options::OPT_ansi)) { 1647a3ff202ee4fb21728e930d5d029ba4925129912cDaniel Dunbar // Honor -std-default. 1648a3ff202ee4fb21728e930d5d029ba4925129912cDaniel Dunbar Args.AddAllArgsTranslated(CmdArgs, options::OPT_std_default_EQ, 1649a3ff202ee4fb21728e930d5d029ba4925129912cDaniel Dunbar "-std=", /*Joined=*/true); 1650a3ff202ee4fb21728e930d5d029ba4925129912cDaniel Dunbar } 1651a3ff202ee4fb21728e930d5d029ba4925129912cDaniel Dunbar 1652a3ec60e0cf2a1916f479288998d31bd980b1a306Daniel Dunbar if (Args.hasArg(options::OPT_v)) 1653a3ec60e0cf2a1916f479288998d31bd980b1a306Daniel Dunbar CmdArgs.push_back("-version"); 1654a3ec60e0cf2a1916f479288998d31bd980b1a306Daniel Dunbar if (Args.hasArg(options::OPT_pg)) 1655a3ec60e0cf2a1916f479288998d31bd980b1a306Daniel Dunbar CmdArgs.push_back("-p"); 1656a3ec60e0cf2a1916f479288998d31bd980b1a306Daniel Dunbar Args.AddLastArg(CmdArgs, options::OPT_p); 1657c21c485b4fb58ef5d55cf3e523263dd824a2ace4Daniel Dunbar 1658a3ec60e0cf2a1916f479288998d31bd980b1a306Daniel Dunbar // The driver treats -fsyntax-only specially. 16592ba91575905a54f712a7f64304e56002e4882499Daniel Dunbar if (getToolChain().getTriple().getArch() == llvm::Triple::arm || 16602ba91575905a54f712a7f64304e56002e4882499Daniel Dunbar getToolChain().getTriple().getArch() == llvm::Triple::thumb) { 16612ba91575905a54f712a7f64304e56002e4882499Daniel Dunbar // Removes -fbuiltin-str{cat,cpy}; these aren't recognized by cc1 but are 16622ba91575905a54f712a7f64304e56002e4882499Daniel Dunbar // used to inhibit the default -fno-builtin-str{cat,cpy}. 16632ba91575905a54f712a7f64304e56002e4882499Daniel Dunbar // 16642ba91575905a54f712a7f64304e56002e4882499Daniel Dunbar // FIXME: Should we grow a better way to deal with "removing" args? 1665cdd9686b890ebdc10039ae256ef4c9dfb5ebacb7Daniel Dunbar for (arg_iterator it = Args.filtered_begin(options::OPT_f_Group, 1666cdd9686b890ebdc10039ae256ef4c9dfb5ebacb7Daniel Dunbar options::OPT_fsyntax_only), 1667cdd9686b890ebdc10039ae256ef4c9dfb5ebacb7Daniel Dunbar ie = Args.filtered_end(); it != ie; ++it) { 1668cdd9686b890ebdc10039ae256ef4c9dfb5ebacb7Daniel Dunbar if (!it->getOption().matches(options::OPT_fbuiltin_strcat) && 1669cdd9686b890ebdc10039ae256ef4c9dfb5ebacb7Daniel Dunbar !it->getOption().matches(options::OPT_fbuiltin_strcpy)) { 1670cdd9686b890ebdc10039ae256ef4c9dfb5ebacb7Daniel Dunbar it->claim(); 1671cdd9686b890ebdc10039ae256ef4c9dfb5ebacb7Daniel Dunbar it->render(Args, CmdArgs); 16722ba91575905a54f712a7f64304e56002e4882499Daniel Dunbar } 16732ba91575905a54f712a7f64304e56002e4882499Daniel Dunbar } 16742ba91575905a54f712a7f64304e56002e4882499Daniel Dunbar } else 16752ba91575905a54f712a7f64304e56002e4882499Daniel Dunbar Args.AddAllArgs(CmdArgs, options::OPT_f_Group, options::OPT_fsyntax_only); 1676c21c485b4fb58ef5d55cf3e523263dd824a2ace4Daniel Dunbar 1677a3ec60e0cf2a1916f479288998d31bd980b1a306Daniel Dunbar Args.AddAllArgs(CmdArgs, options::OPT_undef); 1678a3ec60e0cf2a1916f479288998d31bd980b1a306Daniel Dunbar if (Args.hasArg(options::OPT_Qn)) 1679a3ec60e0cf2a1916f479288998d31bd980b1a306Daniel Dunbar CmdArgs.push_back("-fno-ident"); 1680c21c485b4fb58ef5d55cf3e523263dd824a2ace4Daniel Dunbar 1681a3ec60e0cf2a1916f479288998d31bd980b1a306Daniel Dunbar // FIXME: This isn't correct. 1682a3ec60e0cf2a1916f479288998d31bd980b1a306Daniel Dunbar //Args.AddLastArg(CmdArgs, options::OPT__help) 1683a3ec60e0cf2a1916f479288998d31bd980b1a306Daniel Dunbar //Args.AddLastArg(CmdArgs, options::OPT__targetHelp) 1684a3ec60e0cf2a1916f479288998d31bd980b1a306Daniel Dunbar 1685a3ec60e0cf2a1916f479288998d31bd980b1a306Daniel Dunbar CmdArgs.append(OutputArgs.begin(), OutputArgs.end()); 1686a3ec60e0cf2a1916f479288998d31bd980b1a306Daniel Dunbar 1687a3ec60e0cf2a1916f479288998d31bd980b1a306Daniel Dunbar // FIXME: Still don't get what is happening here. Investigate. 1688a3ec60e0cf2a1916f479288998d31bd980b1a306Daniel Dunbar Args.AddAllArgs(CmdArgs, options::OPT__param); 1689a3ec60e0cf2a1916f479288998d31bd980b1a306Daniel Dunbar 1690a3ec60e0cf2a1916f479288998d31bd980b1a306Daniel Dunbar if (Args.hasArg(options::OPT_fmudflap) || 1691a3ec60e0cf2a1916f479288998d31bd980b1a306Daniel Dunbar Args.hasArg(options::OPT_fmudflapth)) { 1692a3ec60e0cf2a1916f479288998d31bd980b1a306Daniel Dunbar CmdArgs.push_back("-fno-builtin"); 1693a3ec60e0cf2a1916f479288998d31bd980b1a306Daniel Dunbar CmdArgs.push_back("-fno-merge-constants"); 1694a3ec60e0cf2a1916f479288998d31bd980b1a306Daniel Dunbar } 1695c21c485b4fb58ef5d55cf3e523263dd824a2ace4Daniel Dunbar 1696a3ec60e0cf2a1916f479288998d31bd980b1a306Daniel Dunbar if (Args.hasArg(options::OPT_coverage)) { 1697a3ec60e0cf2a1916f479288998d31bd980b1a306Daniel Dunbar CmdArgs.push_back("-fprofile-arcs"); 1698a3ec60e0cf2a1916f479288998d31bd980b1a306Daniel Dunbar CmdArgs.push_back("-ftest-coverage"); 1699a3ec60e0cf2a1916f479288998d31bd980b1a306Daniel Dunbar } 1700a3ec60e0cf2a1916f479288998d31bd980b1a306Daniel Dunbar 1701a3ec60e0cf2a1916f479288998d31bd980b1a306Daniel Dunbar if (types::isCXX(Inputs[0].getType())) 1702a3ec60e0cf2a1916f479288998d31bd980b1a306Daniel Dunbar CmdArgs.push_back("-D__private_extern__=extern"); 1703a3ec60e0cf2a1916f479288998d31bd980b1a306Daniel Dunbar} 1704a3ec60e0cf2a1916f479288998d31bd980b1a306Daniel Dunbar 1705a3ec60e0cf2a1916f479288998d31bd980b1a306Daniel Dunbarvoid darwin::CC1::AddCPPOptionsArgs(const ArgList &Args, ArgStringList &CmdArgs, 1706a3ec60e0cf2a1916f479288998d31bd980b1a306Daniel Dunbar const InputInfoList &Inputs, 1707a3ec60e0cf2a1916f479288998d31bd980b1a306Daniel Dunbar const ArgStringList &OutputArgs) const { 1708a3ec60e0cf2a1916f479288998d31bd980b1a306Daniel Dunbar // Derived from cpp_options 1709a3ec60e0cf2a1916f479288998d31bd980b1a306Daniel Dunbar AddCPPUniqueOptionsArgs(Args, CmdArgs, Inputs); 1710c21c485b4fb58ef5d55cf3e523263dd824a2ace4Daniel Dunbar 1711a3ec60e0cf2a1916f479288998d31bd980b1a306Daniel Dunbar CmdArgs.append(OutputArgs.begin(), OutputArgs.end()); 1712a3ec60e0cf2a1916f479288998d31bd980b1a306Daniel Dunbar 1713a3ec60e0cf2a1916f479288998d31bd980b1a306Daniel Dunbar AddCC1Args(Args, CmdArgs); 1714a3ec60e0cf2a1916f479288998d31bd980b1a306Daniel Dunbar 1715a3ec60e0cf2a1916f479288998d31bd980b1a306Daniel Dunbar // NOTE: The code below has some commonality with cpp_options, but 1716a3ec60e0cf2a1916f479288998d31bd980b1a306Daniel Dunbar // in classic gcc style ends up sending things in different 1717a3ec60e0cf2a1916f479288998d31bd980b1a306Daniel Dunbar // orders. This may be a good merge candidate once we drop pedantic 1718a3ec60e0cf2a1916f479288998d31bd980b1a306Daniel Dunbar // compatibility. 1719a3ec60e0cf2a1916f479288998d31bd980b1a306Daniel Dunbar 1720a3ec60e0cf2a1916f479288998d31bd980b1a306Daniel Dunbar Args.AddAllArgs(CmdArgs, options::OPT_m_Group); 1721c21c485b4fb58ef5d55cf3e523263dd824a2ace4Daniel Dunbar Args.AddAllArgs(CmdArgs, options::OPT_std_EQ, options::OPT_ansi, 1722a3ec60e0cf2a1916f479288998d31bd980b1a306Daniel Dunbar options::OPT_trigraphs); 1723a3ff202ee4fb21728e930d5d029ba4925129912cDaniel Dunbar if (!Args.getLastArg(options::OPT_std_EQ, options::OPT_ansi)) { 1724a3ff202ee4fb21728e930d5d029ba4925129912cDaniel Dunbar // Honor -std-default. 1725a3ff202ee4fb21728e930d5d029ba4925129912cDaniel Dunbar Args.AddAllArgsTranslated(CmdArgs, options::OPT_std_default_EQ, 1726a3ff202ee4fb21728e930d5d029ba4925129912cDaniel Dunbar "-std=", /*Joined=*/true); 1727a3ff202ee4fb21728e930d5d029ba4925129912cDaniel Dunbar } 1728a3ec60e0cf2a1916f479288998d31bd980b1a306Daniel Dunbar Args.AddAllArgs(CmdArgs, options::OPT_W_Group, options::OPT_pedantic_Group); 1729a3ec60e0cf2a1916f479288998d31bd980b1a306Daniel Dunbar Args.AddLastArg(CmdArgs, options::OPT_w); 1730c21c485b4fb58ef5d55cf3e523263dd824a2ace4Daniel Dunbar 1731a3ec60e0cf2a1916f479288998d31bd980b1a306Daniel Dunbar // The driver treats -fsyntax-only specially. 1732a3ec60e0cf2a1916f479288998d31bd980b1a306Daniel Dunbar Args.AddAllArgs(CmdArgs, options::OPT_f_Group, options::OPT_fsyntax_only); 1733a3ec60e0cf2a1916f479288998d31bd980b1a306Daniel Dunbar 1734a3ec60e0cf2a1916f479288998d31bd980b1a306Daniel Dunbar if (Args.hasArg(options::OPT_g_Group) && !Args.hasArg(options::OPT_g0) && 1735a3ec60e0cf2a1916f479288998d31bd980b1a306Daniel Dunbar !Args.hasArg(options::OPT_fno_working_directory)) 1736a3ec60e0cf2a1916f479288998d31bd980b1a306Daniel Dunbar CmdArgs.push_back("-fworking-directory"); 1737a3ec60e0cf2a1916f479288998d31bd980b1a306Daniel Dunbar 1738a3ec60e0cf2a1916f479288998d31bd980b1a306Daniel Dunbar Args.AddAllArgs(CmdArgs, options::OPT_O); 1739a3ec60e0cf2a1916f479288998d31bd980b1a306Daniel Dunbar Args.AddAllArgs(CmdArgs, options::OPT_undef); 1740a3ec60e0cf2a1916f479288998d31bd980b1a306Daniel Dunbar if (Args.hasArg(options::OPT_save_temps)) 1741a3ec60e0cf2a1916f479288998d31bd980b1a306Daniel Dunbar CmdArgs.push_back("-fpch-preprocess"); 1742a3ec60e0cf2a1916f479288998d31bd980b1a306Daniel Dunbar} 1743a3ec60e0cf2a1916f479288998d31bd980b1a306Daniel Dunbar 1744c21c485b4fb58ef5d55cf3e523263dd824a2ace4Daniel Dunbarvoid darwin::CC1::AddCPPUniqueOptionsArgs(const ArgList &Args, 1745a3ec60e0cf2a1916f479288998d31bd980b1a306Daniel Dunbar ArgStringList &CmdArgs, 17461eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump const InputInfoList &Inputs) const { 1747ee788e70fcd0adf76103b17c78ac658d4ea30c9bDaniel Dunbar const Driver &D = getToolChain().getDriver(); 1748a3ec60e0cf2a1916f479288998d31bd980b1a306Daniel Dunbar 174988a3d6cf5ebab81614f89ba48a8d89023270637aDaniel Dunbar CheckPreprocessingOptions(D, Args); 175088a3d6cf5ebab81614f89ba48a8d89023270637aDaniel Dunbar 1751a3ec60e0cf2a1916f479288998d31bd980b1a306Daniel Dunbar // Derived from cpp_unique_options. 175288a3d6cf5ebab81614f89ba48a8d89023270637aDaniel Dunbar // -{C,CC} only with -E is checked in CheckPreprocessingOptions(). 175388a3d6cf5ebab81614f89ba48a8d89023270637aDaniel Dunbar Args.AddLastArg(CmdArgs, options::OPT_C); 175488a3d6cf5ebab81614f89ba48a8d89023270637aDaniel Dunbar Args.AddLastArg(CmdArgs, options::OPT_CC); 1755a3ec60e0cf2a1916f479288998d31bd980b1a306Daniel Dunbar if (!Args.hasArg(options::OPT_Q)) 1756a3ec60e0cf2a1916f479288998d31bd980b1a306Daniel Dunbar CmdArgs.push_back("-quiet"); 1757a3ec60e0cf2a1916f479288998d31bd980b1a306Daniel Dunbar Args.AddAllArgs(CmdArgs, options::OPT_nostdinc); 17584c2bcad7b843c10fd4a2ffd43da40bfefb4dc8baDouglas Gregor Args.AddAllArgs(CmdArgs, options::OPT_nostdincxx); 1759a3ec60e0cf2a1916f479288998d31bd980b1a306Daniel Dunbar Args.AddLastArg(CmdArgs, options::OPT_v); 1760a3ec60e0cf2a1916f479288998d31bd980b1a306Daniel Dunbar Args.AddAllArgs(CmdArgs, options::OPT_I_Group, options::OPT_F); 1761a3ec60e0cf2a1916f479288998d31bd980b1a306Daniel Dunbar Args.AddLastArg(CmdArgs, options::OPT_P); 1762a3ec60e0cf2a1916f479288998d31bd980b1a306Daniel Dunbar 1763a3ec60e0cf2a1916f479288998d31bd980b1a306Daniel Dunbar // FIXME: Handle %I properly. 1764a3ec60e0cf2a1916f479288998d31bd980b1a306Daniel Dunbar if (getToolChain().getArchName() == "x86_64") { 1765a3ec60e0cf2a1916f479288998d31bd980b1a306Daniel Dunbar CmdArgs.push_back("-imultilib"); 1766a3ec60e0cf2a1916f479288998d31bd980b1a306Daniel Dunbar CmdArgs.push_back("x86_64"); 1767a3ec60e0cf2a1916f479288998d31bd980b1a306Daniel Dunbar } 1768a3ec60e0cf2a1916f479288998d31bd980b1a306Daniel Dunbar 1769a3ec60e0cf2a1916f479288998d31bd980b1a306Daniel Dunbar if (Args.hasArg(options::OPT_MD)) { 1770a3ec60e0cf2a1916f479288998d31bd980b1a306Daniel Dunbar CmdArgs.push_back("-MD"); 1771a5a7bd0de7b6b80212095195a055a4a43f21d4b2Daniel Dunbar CmdArgs.push_back(darwin::CC1::getDependencyFileName(Args, Inputs)); 1772a3ec60e0cf2a1916f479288998d31bd980b1a306Daniel Dunbar } 1773a3ec60e0cf2a1916f479288998d31bd980b1a306Daniel Dunbar 1774a3ec60e0cf2a1916f479288998d31bd980b1a306Daniel Dunbar if (Args.hasArg(options::OPT_MMD)) { 1775a3ec60e0cf2a1916f479288998d31bd980b1a306Daniel Dunbar CmdArgs.push_back("-MMD"); 1776a5a7bd0de7b6b80212095195a055a4a43f21d4b2Daniel Dunbar CmdArgs.push_back(darwin::CC1::getDependencyFileName(Args, Inputs)); 1777a3ec60e0cf2a1916f479288998d31bd980b1a306Daniel Dunbar } 1778a3ec60e0cf2a1916f479288998d31bd980b1a306Daniel Dunbar 1779a3ec60e0cf2a1916f479288998d31bd980b1a306Daniel Dunbar Args.AddLastArg(CmdArgs, options::OPT_M); 1780a3ec60e0cf2a1916f479288998d31bd980b1a306Daniel Dunbar Args.AddLastArg(CmdArgs, options::OPT_MM); 1781a3ec60e0cf2a1916f479288998d31bd980b1a306Daniel Dunbar Args.AddAllArgs(CmdArgs, options::OPT_MF); 1782a3ec60e0cf2a1916f479288998d31bd980b1a306Daniel Dunbar Args.AddLastArg(CmdArgs, options::OPT_MG); 1783a3ec60e0cf2a1916f479288998d31bd980b1a306Daniel Dunbar Args.AddLastArg(CmdArgs, options::OPT_MP); 1784a3ec60e0cf2a1916f479288998d31bd980b1a306Daniel Dunbar Args.AddAllArgs(CmdArgs, options::OPT_MQ); 1785a3ec60e0cf2a1916f479288998d31bd980b1a306Daniel Dunbar Args.AddAllArgs(CmdArgs, options::OPT_MT); 1786a3ec60e0cf2a1916f479288998d31bd980b1a306Daniel Dunbar if (!Args.hasArg(options::OPT_M) && !Args.hasArg(options::OPT_MM) && 1787a3ec60e0cf2a1916f479288998d31bd980b1a306Daniel Dunbar (Args.hasArg(options::OPT_MD) || Args.hasArg(options::OPT_MMD))) { 1788a3ec60e0cf2a1916f479288998d31bd980b1a306Daniel Dunbar if (Arg *OutputOpt = Args.getLastArg(options::OPT_o)) { 1789a3ec60e0cf2a1916f479288998d31bd980b1a306Daniel Dunbar CmdArgs.push_back("-MQ"); 1790a3ec60e0cf2a1916f479288998d31bd980b1a306Daniel Dunbar CmdArgs.push_back(OutputOpt->getValue(Args)); 1791a3ec60e0cf2a1916f479288998d31bd980b1a306Daniel Dunbar } 1792a3ec60e0cf2a1916f479288998d31bd980b1a306Daniel Dunbar } 1793a3ec60e0cf2a1916f479288998d31bd980b1a306Daniel Dunbar 1794a3ec60e0cf2a1916f479288998d31bd980b1a306Daniel Dunbar Args.AddLastArg(CmdArgs, options::OPT_remap); 1795a3ec60e0cf2a1916f479288998d31bd980b1a306Daniel Dunbar if (Args.hasArg(options::OPT_g3)) 1796a3ec60e0cf2a1916f479288998d31bd980b1a306Daniel Dunbar CmdArgs.push_back("-dD"); 1797a3ec60e0cf2a1916f479288998d31bd980b1a306Daniel Dunbar Args.AddLastArg(CmdArgs, options::OPT_H); 1798a3ec60e0cf2a1916f479288998d31bd980b1a306Daniel Dunbar 1799a3ec60e0cf2a1916f479288998d31bd980b1a306Daniel Dunbar AddCPPArgs(Args, CmdArgs); 1800a3ec60e0cf2a1916f479288998d31bd980b1a306Daniel Dunbar 1801a3ec60e0cf2a1916f479288998d31bd980b1a306Daniel Dunbar Args.AddAllArgs(CmdArgs, options::OPT_D, options::OPT_U, options::OPT_A); 1802a3ec60e0cf2a1916f479288998d31bd980b1a306Daniel Dunbar Args.AddAllArgs(CmdArgs, options::OPT_i_Group); 1803a3ec60e0cf2a1916f479288998d31bd980b1a306Daniel Dunbar 1804a3ec60e0cf2a1916f479288998d31bd980b1a306Daniel Dunbar for (InputInfoList::const_iterator 1805a3ec60e0cf2a1916f479288998d31bd980b1a306Daniel Dunbar it = Inputs.begin(), ie = Inputs.end(); it != ie; ++it) { 1806a3ec60e0cf2a1916f479288998d31bd980b1a306Daniel Dunbar const InputInfo &II = *it; 1807c21c485b4fb58ef5d55cf3e523263dd824a2ace4Daniel Dunbar 1808a3ec60e0cf2a1916f479288998d31bd980b1a306Daniel Dunbar if (II.isPipe()) 1809a3ec60e0cf2a1916f479288998d31bd980b1a306Daniel Dunbar CmdArgs.push_back("-"); 1810a3ec60e0cf2a1916f479288998d31bd980b1a306Daniel Dunbar else 1811a3ec60e0cf2a1916f479288998d31bd980b1a306Daniel Dunbar CmdArgs.push_back(II.getFilename()); 1812a3ec60e0cf2a1916f479288998d31bd980b1a306Daniel Dunbar } 1813a3ec60e0cf2a1916f479288998d31bd980b1a306Daniel Dunbar 1814a3ec60e0cf2a1916f479288998d31bd980b1a306Daniel Dunbar Args.AddAllArgValues(CmdArgs, options::OPT_Wp_COMMA, 1815a3ec60e0cf2a1916f479288998d31bd980b1a306Daniel Dunbar options::OPT_Xpreprocessor); 1816a3ec60e0cf2a1916f479288998d31bd980b1a306Daniel Dunbar 1817a3ec60e0cf2a1916f479288998d31bd980b1a306Daniel Dunbar if (Args.hasArg(options::OPT_fmudflap)) { 1818a3ec60e0cf2a1916f479288998d31bd980b1a306Daniel Dunbar CmdArgs.push_back("-D_MUDFLAP"); 1819a3ec60e0cf2a1916f479288998d31bd980b1a306Daniel Dunbar CmdArgs.push_back("-include"); 1820a3ec60e0cf2a1916f479288998d31bd980b1a306Daniel Dunbar CmdArgs.push_back("mf-runtime.h"); 1821a3ec60e0cf2a1916f479288998d31bd980b1a306Daniel Dunbar } 1822a3ec60e0cf2a1916f479288998d31bd980b1a306Daniel Dunbar 1823a3ec60e0cf2a1916f479288998d31bd980b1a306Daniel Dunbar if (Args.hasArg(options::OPT_fmudflapth)) { 1824a3ec60e0cf2a1916f479288998d31bd980b1a306Daniel Dunbar CmdArgs.push_back("-D_MUDFLAP"); 1825a3ec60e0cf2a1916f479288998d31bd980b1a306Daniel Dunbar CmdArgs.push_back("-D_MUDFLAPTH"); 1826a3ec60e0cf2a1916f479288998d31bd980b1a306Daniel Dunbar CmdArgs.push_back("-include"); 1827a3ec60e0cf2a1916f479288998d31bd980b1a306Daniel Dunbar CmdArgs.push_back("mf-runtime.h"); 1828a3ec60e0cf2a1916f479288998d31bd980b1a306Daniel Dunbar } 1829a3ec60e0cf2a1916f479288998d31bd980b1a306Daniel Dunbar} 1830a3ec60e0cf2a1916f479288998d31bd980b1a306Daniel Dunbar 1831c21c485b4fb58ef5d55cf3e523263dd824a2ace4Daniel Dunbarvoid darwin::CC1::AddCPPArgs(const ArgList &Args, 1832a3ec60e0cf2a1916f479288998d31bd980b1a306Daniel Dunbar ArgStringList &CmdArgs) const { 1833a3ec60e0cf2a1916f479288998d31bd980b1a306Daniel Dunbar // Derived from cpp spec. 1834a3ec60e0cf2a1916f479288998d31bd980b1a306Daniel Dunbar 1835a3ec60e0cf2a1916f479288998d31bd980b1a306Daniel Dunbar if (Args.hasArg(options::OPT_static)) { 1836a3ec60e0cf2a1916f479288998d31bd980b1a306Daniel Dunbar // The gcc spec is broken here, it refers to dynamic but 1837a3ec60e0cf2a1916f479288998d31bd980b1a306Daniel Dunbar // that has been translated. Start by being bug compatible. 1838c21c485b4fb58ef5d55cf3e523263dd824a2ace4Daniel Dunbar 1839a3ec60e0cf2a1916f479288998d31bd980b1a306Daniel Dunbar // if (!Args.hasArg(arglist.parser.dynamicOption)) 1840a3ec60e0cf2a1916f479288998d31bd980b1a306Daniel Dunbar CmdArgs.push_back("-D__STATIC__"); 1841a3ec60e0cf2a1916f479288998d31bd980b1a306Daniel Dunbar } else 1842a3ec60e0cf2a1916f479288998d31bd980b1a306Daniel Dunbar CmdArgs.push_back("-D__DYNAMIC__"); 1843a3ec60e0cf2a1916f479288998d31bd980b1a306Daniel Dunbar 1844a3ec60e0cf2a1916f479288998d31bd980b1a306Daniel Dunbar if (Args.hasArg(options::OPT_pthread)) 1845a3ec60e0cf2a1916f479288998d31bd980b1a306Daniel Dunbar CmdArgs.push_back("-D_REENTRANT"); 1846a3ec60e0cf2a1916f479288998d31bd980b1a306Daniel Dunbar} 1847a3ec60e0cf2a1916f479288998d31bd980b1a306Daniel Dunbar 184840f1265ebd42ece3e7f7917319b56012e8e2bce2Daniel Dunbarvoid darwin::Preprocess::ConstructJob(Compilation &C, const JobAction &JA, 1849c21c485b4fb58ef5d55cf3e523263dd824a2ace4Daniel Dunbar Job &Dest, const InputInfo &Output, 1850c21c485b4fb58ef5d55cf3e523263dd824a2ace4Daniel Dunbar const InputInfoList &Inputs, 1851c21c485b4fb58ef5d55cf3e523263dd824a2ace4Daniel Dunbar const ArgList &Args, 185240f1265ebd42ece3e7f7917319b56012e8e2bce2Daniel Dunbar const char *LinkingOutput) const { 185340f1265ebd42ece3e7f7917319b56012e8e2bce2Daniel Dunbar ArgStringList CmdArgs; 185440f1265ebd42ece3e7f7917319b56012e8e2bce2Daniel Dunbar 185540f1265ebd42ece3e7f7917319b56012e8e2bce2Daniel Dunbar assert(Inputs.size() == 1 && "Unexpected number of inputs!"); 185640f1265ebd42ece3e7f7917319b56012e8e2bce2Daniel Dunbar 185740f1265ebd42ece3e7f7917319b56012e8e2bce2Daniel Dunbar CmdArgs.push_back("-E"); 185840f1265ebd42ece3e7f7917319b56012e8e2bce2Daniel Dunbar 185940f1265ebd42ece3e7f7917319b56012e8e2bce2Daniel Dunbar if (Args.hasArg(options::OPT_traditional) || 186040f1265ebd42ece3e7f7917319b56012e8e2bce2Daniel Dunbar Args.hasArg(options::OPT_traditional_cpp)) 186140f1265ebd42ece3e7f7917319b56012e8e2bce2Daniel Dunbar CmdArgs.push_back("-traditional-cpp"); 1862c21c485b4fb58ef5d55cf3e523263dd824a2ace4Daniel Dunbar 186340f1265ebd42ece3e7f7917319b56012e8e2bce2Daniel Dunbar ArgStringList OutputArgs; 186440f1265ebd42ece3e7f7917319b56012e8e2bce2Daniel Dunbar if (Output.isFilename()) { 186540f1265ebd42ece3e7f7917319b56012e8e2bce2Daniel Dunbar OutputArgs.push_back("-o"); 186640f1265ebd42ece3e7f7917319b56012e8e2bce2Daniel Dunbar OutputArgs.push_back(Output.getFilename()); 186740f1265ebd42ece3e7f7917319b56012e8e2bce2Daniel Dunbar } else { 186840f1265ebd42ece3e7f7917319b56012e8e2bce2Daniel Dunbar assert(Output.isPipe() && "Unexpected CC1 output."); 186940f1265ebd42ece3e7f7917319b56012e8e2bce2Daniel Dunbar } 187040f1265ebd42ece3e7f7917319b56012e8e2bce2Daniel Dunbar 18719120f179fd2e354f067e4ef2c76dcf3fc4db8a16Daniel Dunbar if (Args.hasArg(options::OPT_E)) { 18729120f179fd2e354f067e4ef2c76dcf3fc4db8a16Daniel Dunbar AddCPPOptionsArgs(Args, CmdArgs, Inputs, OutputArgs); 18739120f179fd2e354f067e4ef2c76dcf3fc4db8a16Daniel Dunbar } else { 18749120f179fd2e354f067e4ef2c76dcf3fc4db8a16Daniel Dunbar AddCPPOptionsArgs(Args, CmdArgs, Inputs, ArgStringList()); 18759120f179fd2e354f067e4ef2c76dcf3fc4db8a16Daniel Dunbar CmdArgs.append(OutputArgs.begin(), OutputArgs.end()); 18769120f179fd2e354f067e4ef2c76dcf3fc4db8a16Daniel Dunbar } 1877c21c485b4fb58ef5d55cf3e523263dd824a2ace4Daniel Dunbar 18788a2073a85670a13b0bcc1726bc7f80d458f8245bDaniel Dunbar Args.AddAllArgs(CmdArgs, options::OPT_d_Group); 18798a2073a85670a13b0bcc1726bc7f80d458f8245bDaniel Dunbar 188040f1265ebd42ece3e7f7917319b56012e8e2bce2Daniel Dunbar const char *CC1Name = getCC1Name(Inputs[0].getType()); 1881c21c485b4fb58ef5d55cf3e523263dd824a2ace4Daniel Dunbar const char *Exec = 18825ed34f4c58b6ad4e21038d713c1fae31a6146ff5Daniel Dunbar Args.MakeArgString(getToolChain().GetProgramPath(C, CC1Name)); 1883daab7b1016f0a82fefa4f7be6e63c57c06b19ffcDaniel Dunbar Dest.addCommand(new Command(JA, *this, Exec, CmdArgs)); 188440f1265ebd42ece3e7f7917319b56012e8e2bce2Daniel Dunbar} 188540f1265ebd42ece3e7f7917319b56012e8e2bce2Daniel Dunbar 188640f1265ebd42ece3e7f7917319b56012e8e2bce2Daniel Dunbarvoid darwin::Compile::ConstructJob(Compilation &C, const JobAction &JA, 1887c21c485b4fb58ef5d55cf3e523263dd824a2ace4Daniel Dunbar Job &Dest, const InputInfo &Output, 1888c21c485b4fb58ef5d55cf3e523263dd824a2ace4Daniel Dunbar const InputInfoList &Inputs, 1889c21c485b4fb58ef5d55cf3e523263dd824a2ace4Daniel Dunbar const ArgList &Args, 189040f1265ebd42ece3e7f7917319b56012e8e2bce2Daniel Dunbar const char *LinkingOutput) const { 1891ee788e70fcd0adf76103b17c78ac658d4ea30c9bDaniel Dunbar const Driver &D = getToolChain().getDriver(); 189240f1265ebd42ece3e7f7917319b56012e8e2bce2Daniel Dunbar ArgStringList CmdArgs; 189340f1265ebd42ece3e7f7917319b56012e8e2bce2Daniel Dunbar 189440f1265ebd42ece3e7f7917319b56012e8e2bce2Daniel Dunbar assert(Inputs.size() == 1 && "Unexpected number of inputs!"); 189540f1265ebd42ece3e7f7917319b56012e8e2bce2Daniel Dunbar 189640f1265ebd42ece3e7f7917319b56012e8e2bce2Daniel Dunbar types::ID InputType = Inputs[0].getType(); 189740f1265ebd42ece3e7f7917319b56012e8e2bce2Daniel Dunbar const Arg *A; 1898ceb5c5b7f67a30fae305d1d19b478b623e4fbcedEli Friedman if ((A = Args.getLastArg(options::OPT_traditional))) 189940f1265ebd42ece3e7f7917319b56012e8e2bce2Daniel Dunbar D.Diag(clang::diag::err_drv_argument_only_allowed_with) 190040f1265ebd42ece3e7f7917319b56012e8e2bce2Daniel Dunbar << A->getAsString(Args) << "-E"; 190140f1265ebd42ece3e7f7917319b56012e8e2bce2Daniel Dunbar 190240f1265ebd42ece3e7f7917319b56012e8e2bce2Daniel Dunbar if (Output.getType() == types::TY_LLVMAsm) 190340f1265ebd42ece3e7f7917319b56012e8e2bce2Daniel Dunbar CmdArgs.push_back("-emit-llvm"); 190440f1265ebd42ece3e7f7917319b56012e8e2bce2Daniel Dunbar else if (Output.getType() == types::TY_LLVMBC) 190540f1265ebd42ece3e7f7917319b56012e8e2bce2Daniel Dunbar CmdArgs.push_back("-emit-llvm-bc"); 19065915fbf310e171c4cd3c2af05e9de360c0fa988aDaniel Dunbar else if (Output.getType() == types::TY_AST) 19075915fbf310e171c4cd3c2af05e9de360c0fa988aDaniel Dunbar D.Diag(clang::diag::err_drv_no_ast_support) 1908881376467c46c5c6cc16fa6790271c2c22e1d4f1Daniel Dunbar << getToolChain().getTripleString(); 1909ae24a88655c461e751d0984cc21dda6e17882356Daniel Dunbar else if (JA.getType() != types::TY_PP_Asm && 1910ae24a88655c461e751d0984cc21dda6e17882356Daniel Dunbar JA.getType() != types::TY_PCH) 191164952508c2b0c8bffb45c8b410f0af3d2457f59bDaniel Dunbar D.Diag(clang::diag::err_drv_invalid_gcc_output_type) 191264952508c2b0c8bffb45c8b410f0af3d2457f59bDaniel Dunbar << getTypeName(JA.getType()); 191340f1265ebd42ece3e7f7917319b56012e8e2bce2Daniel Dunbar 191440f1265ebd42ece3e7f7917319b56012e8e2bce2Daniel Dunbar ArgStringList OutputArgs; 191540f1265ebd42ece3e7f7917319b56012e8e2bce2Daniel Dunbar if (Output.getType() != types::TY_PCH) { 191640f1265ebd42ece3e7f7917319b56012e8e2bce2Daniel Dunbar OutputArgs.push_back("-o"); 191740f1265ebd42ece3e7f7917319b56012e8e2bce2Daniel Dunbar if (Output.isPipe()) 191840f1265ebd42ece3e7f7917319b56012e8e2bce2Daniel Dunbar OutputArgs.push_back("-"); 191940f1265ebd42ece3e7f7917319b56012e8e2bce2Daniel Dunbar else if (Output.isNothing()) 192040f1265ebd42ece3e7f7917319b56012e8e2bce2Daniel Dunbar OutputArgs.push_back("/dev/null"); 192140f1265ebd42ece3e7f7917319b56012e8e2bce2Daniel Dunbar else 192240f1265ebd42ece3e7f7917319b56012e8e2bce2Daniel Dunbar OutputArgs.push_back(Output.getFilename()); 192340f1265ebd42ece3e7f7917319b56012e8e2bce2Daniel Dunbar } 192440f1265ebd42ece3e7f7917319b56012e8e2bce2Daniel Dunbar 192540f1265ebd42ece3e7f7917319b56012e8e2bce2Daniel Dunbar // There is no need for this level of compatibility, but it makes 192640f1265ebd42ece3e7f7917319b56012e8e2bce2Daniel Dunbar // diffing easier. 192740f1265ebd42ece3e7f7917319b56012e8e2bce2Daniel Dunbar bool OutputArgsEarly = (Args.hasArg(options::OPT_fsyntax_only) || 192840f1265ebd42ece3e7f7917319b56012e8e2bce2Daniel Dunbar Args.hasArg(options::OPT_S)); 192940f1265ebd42ece3e7f7917319b56012e8e2bce2Daniel Dunbar 193040f1265ebd42ece3e7f7917319b56012e8e2bce2Daniel Dunbar if (types::getPreprocessedType(InputType) != types::TY_INVALID) { 1931a3ec60e0cf2a1916f479288998d31bd980b1a306Daniel Dunbar AddCPPUniqueOptionsArgs(Args, CmdArgs, Inputs); 193240f1265ebd42ece3e7f7917319b56012e8e2bce2Daniel Dunbar if (OutputArgsEarly) { 193340f1265ebd42ece3e7f7917319b56012e8e2bce2Daniel Dunbar AddCC1OptionsArgs(Args, CmdArgs, Inputs, OutputArgs); 193440f1265ebd42ece3e7f7917319b56012e8e2bce2Daniel Dunbar } else { 193540f1265ebd42ece3e7f7917319b56012e8e2bce2Daniel Dunbar AddCC1OptionsArgs(Args, CmdArgs, Inputs, ArgStringList()); 193640f1265ebd42ece3e7f7917319b56012e8e2bce2Daniel Dunbar CmdArgs.append(OutputArgs.begin(), OutputArgs.end()); 193740f1265ebd42ece3e7f7917319b56012e8e2bce2Daniel Dunbar } 193840f1265ebd42ece3e7f7917319b56012e8e2bce2Daniel Dunbar } else { 193940f1265ebd42ece3e7f7917319b56012e8e2bce2Daniel Dunbar CmdArgs.push_back("-fpreprocessed"); 1940c21c485b4fb58ef5d55cf3e523263dd824a2ace4Daniel Dunbar 194140f1265ebd42ece3e7f7917319b56012e8e2bce2Daniel Dunbar for (InputInfoList::const_iterator 194240f1265ebd42ece3e7f7917319b56012e8e2bce2Daniel Dunbar it = Inputs.begin(), ie = Inputs.end(); it != ie; ++it) { 194340f1265ebd42ece3e7f7917319b56012e8e2bce2Daniel Dunbar const InputInfo &II = *it; 194440f1265ebd42ece3e7f7917319b56012e8e2bce2Daniel Dunbar 19455915fbf310e171c4cd3c2af05e9de360c0fa988aDaniel Dunbar // Reject AST inputs. 19465915fbf310e171c4cd3c2af05e9de360c0fa988aDaniel Dunbar if (II.getType() == types::TY_AST) { 19475915fbf310e171c4cd3c2af05e9de360c0fa988aDaniel Dunbar D.Diag(clang::diag::err_drv_no_ast_support) 1948881376467c46c5c6cc16fa6790271c2c22e1d4f1Daniel Dunbar << getToolChain().getTripleString(); 19495915fbf310e171c4cd3c2af05e9de360c0fa988aDaniel Dunbar return; 19505915fbf310e171c4cd3c2af05e9de360c0fa988aDaniel Dunbar } 19515915fbf310e171c4cd3c2af05e9de360c0fa988aDaniel Dunbar 195240f1265ebd42ece3e7f7917319b56012e8e2bce2Daniel Dunbar if (II.isPipe()) 195340f1265ebd42ece3e7f7917319b56012e8e2bce2Daniel Dunbar CmdArgs.push_back("-"); 195440f1265ebd42ece3e7f7917319b56012e8e2bce2Daniel Dunbar else 195540f1265ebd42ece3e7f7917319b56012e8e2bce2Daniel Dunbar CmdArgs.push_back(II.getFilename()); 195640f1265ebd42ece3e7f7917319b56012e8e2bce2Daniel Dunbar } 195740f1265ebd42ece3e7f7917319b56012e8e2bce2Daniel Dunbar 195840f1265ebd42ece3e7f7917319b56012e8e2bce2Daniel Dunbar if (OutputArgsEarly) { 195940f1265ebd42ece3e7f7917319b56012e8e2bce2Daniel Dunbar AddCC1OptionsArgs(Args, CmdArgs, Inputs, OutputArgs); 196040f1265ebd42ece3e7f7917319b56012e8e2bce2Daniel Dunbar } else { 196140f1265ebd42ece3e7f7917319b56012e8e2bce2Daniel Dunbar AddCC1OptionsArgs(Args, CmdArgs, Inputs, ArgStringList()); 196240f1265ebd42ece3e7f7917319b56012e8e2bce2Daniel Dunbar CmdArgs.append(OutputArgs.begin(), OutputArgs.end()); 196340f1265ebd42ece3e7f7917319b56012e8e2bce2Daniel Dunbar } 196440f1265ebd42ece3e7f7917319b56012e8e2bce2Daniel Dunbar } 1965c21c485b4fb58ef5d55cf3e523263dd824a2ace4Daniel Dunbar 196640f1265ebd42ece3e7f7917319b56012e8e2bce2Daniel Dunbar if (Output.getType() == types::TY_PCH) { 196740f1265ebd42ece3e7f7917319b56012e8e2bce2Daniel Dunbar assert(Output.isFilename() && "Invalid PCH output."); 196840f1265ebd42ece3e7f7917319b56012e8e2bce2Daniel Dunbar 196940f1265ebd42ece3e7f7917319b56012e8e2bce2Daniel Dunbar CmdArgs.push_back("-o"); 197040f1265ebd42ece3e7f7917319b56012e8e2bce2Daniel Dunbar // NOTE: gcc uses a temp .s file for this, but there doesn't seem 197140f1265ebd42ece3e7f7917319b56012e8e2bce2Daniel Dunbar // to be a good reason. 197240f1265ebd42ece3e7f7917319b56012e8e2bce2Daniel Dunbar CmdArgs.push_back("/dev/null"); 1973c21c485b4fb58ef5d55cf3e523263dd824a2ace4Daniel Dunbar 1974e6c9ae147835fb450a90800bd378420c0e5ffb35Daniel Dunbar CmdArgs.push_back("--output-pch="); 197540f1265ebd42ece3e7f7917319b56012e8e2bce2Daniel Dunbar CmdArgs.push_back(Output.getFilename()); 1976c21c485b4fb58ef5d55cf3e523263dd824a2ace4Daniel Dunbar } 197740f1265ebd42ece3e7f7917319b56012e8e2bce2Daniel Dunbar 197840f1265ebd42ece3e7f7917319b56012e8e2bce2Daniel Dunbar const char *CC1Name = getCC1Name(Inputs[0].getType()); 1979c21c485b4fb58ef5d55cf3e523263dd824a2ace4Daniel Dunbar const char *Exec = 19805ed34f4c58b6ad4e21038d713c1fae31a6146ff5Daniel Dunbar Args.MakeArgString(getToolChain().GetProgramPath(C, CC1Name)); 1981daab7b1016f0a82fefa4f7be6e63c57c06b19ffcDaniel Dunbar Dest.addCommand(new Command(JA, *this, Exec, CmdArgs)); 198240f1265ebd42ece3e7f7917319b56012e8e2bce2Daniel Dunbar} 198340f1265ebd42ece3e7f7917319b56012e8e2bce2Daniel Dunbar 19848cac5f7e1ce63dd77ee0fb4ef68f9fa804f41ea6Daniel Dunbarvoid darwin::Assemble::ConstructJob(Compilation &C, const JobAction &JA, 1985c21c485b4fb58ef5d55cf3e523263dd824a2ace4Daniel Dunbar Job &Dest, const InputInfo &Output, 1986c21c485b4fb58ef5d55cf3e523263dd824a2ace4Daniel Dunbar const InputInfoList &Inputs, 1987c21c485b4fb58ef5d55cf3e523263dd824a2ace4Daniel Dunbar const ArgList &Args, 19888cac5f7e1ce63dd77ee0fb4ef68f9fa804f41ea6Daniel Dunbar const char *LinkingOutput) const { 19898cac5f7e1ce63dd77ee0fb4ef68f9fa804f41ea6Daniel Dunbar ArgStringList CmdArgs; 19908cac5f7e1ce63dd77ee0fb4ef68f9fa804f41ea6Daniel Dunbar 19918cac5f7e1ce63dd77ee0fb4ef68f9fa804f41ea6Daniel Dunbar assert(Inputs.size() == 1 && "Unexpected number of inputs."); 19928cac5f7e1ce63dd77ee0fb4ef68f9fa804f41ea6Daniel Dunbar const InputInfo &Input = Inputs[0]; 19938cac5f7e1ce63dd77ee0fb4ef68f9fa804f41ea6Daniel Dunbar 19948cac5f7e1ce63dd77ee0fb4ef68f9fa804f41ea6Daniel Dunbar // Bit of a hack, this is only used for original inputs. 1995c21c485b4fb58ef5d55cf3e523263dd824a2ace4Daniel Dunbar // 19968e4fea6750dbac032c172f3279c63b7815b7423eDaniel Dunbar // FIXME: This is broken for preprocessed .s inputs. 19978cac5f7e1ce63dd77ee0fb4ef68f9fa804f41ea6Daniel Dunbar if (Input.isFilename() && 19988e4fea6750dbac032c172f3279c63b7815b7423eDaniel Dunbar strcmp(Input.getFilename(), Input.getBaseInput()) == 0) { 19998e4fea6750dbac032c172f3279c63b7815b7423eDaniel Dunbar if (Args.hasArg(options::OPT_gstabs)) 20008e4fea6750dbac032c172f3279c63b7815b7423eDaniel Dunbar CmdArgs.push_back("--gstabs"); 20018e4fea6750dbac032c172f3279c63b7815b7423eDaniel Dunbar else if (Args.hasArg(options::OPT_g_Group)) 20028e4fea6750dbac032c172f3279c63b7815b7423eDaniel Dunbar CmdArgs.push_back("--gdwarf2"); 20038e4fea6750dbac032c172f3279c63b7815b7423eDaniel Dunbar } 2004c21c485b4fb58ef5d55cf3e523263dd824a2ace4Daniel Dunbar 20058cac5f7e1ce63dd77ee0fb4ef68f9fa804f41ea6Daniel Dunbar // Derived from asm spec. 2006cc6f803f98fa6ba9a9c366400210448516d01b3cDaniel Dunbar AddDarwinArch(Args, CmdArgs); 2007cc6f803f98fa6ba9a9c366400210448516d01b3cDaniel Dunbar 2008251ca6c9fb2bb398d9bf9fe7399c27bed7074b5cDaniel Dunbar if (!getDarwinToolChain().isTargetIPhoneOS() || 2009cc6f803f98fa6ba9a9c366400210448516d01b3cDaniel Dunbar Args.hasArg(options::OPT_force__cpusubtype__ALL)) 2010cc6f803f98fa6ba9a9c366400210448516d01b3cDaniel Dunbar CmdArgs.push_back("-force_cpusubtype_ALL"); 20118cac5f7e1ce63dd77ee0fb4ef68f9fa804f41ea6Daniel Dunbar 20120e2679d29be70186fc1197a1484948ed239922baDaniel Dunbar if (getToolChain().getTriple().getArch() != llvm::Triple::x86_64 && 20130e2679d29be70186fc1197a1484948ed239922baDaniel Dunbar (Args.hasArg(options::OPT_mkernel) || 20148cac5f7e1ce63dd77ee0fb4ef68f9fa804f41ea6Daniel Dunbar Args.hasArg(options::OPT_static) || 20150e2679d29be70186fc1197a1484948ed239922baDaniel Dunbar Args.hasArg(options::OPT_fapple_kext))) 2016c21c485b4fb58ef5d55cf3e523263dd824a2ace4Daniel Dunbar CmdArgs.push_back("-static"); 2017c21c485b4fb58ef5d55cf3e523263dd824a2ace4Daniel Dunbar 20188cac5f7e1ce63dd77ee0fb4ef68f9fa804f41ea6Daniel Dunbar Args.AddAllArgValues(CmdArgs, options::OPT_Wa_COMMA, 20198cac5f7e1ce63dd77ee0fb4ef68f9fa804f41ea6Daniel Dunbar options::OPT_Xassembler); 20208cac5f7e1ce63dd77ee0fb4ef68f9fa804f41ea6Daniel Dunbar 20218cac5f7e1ce63dd77ee0fb4ef68f9fa804f41ea6Daniel Dunbar assert(Output.isFilename() && "Unexpected lipo output."); 20228cac5f7e1ce63dd77ee0fb4ef68f9fa804f41ea6Daniel Dunbar CmdArgs.push_back("-o"); 20238cac5f7e1ce63dd77ee0fb4ef68f9fa804f41ea6Daniel Dunbar CmdArgs.push_back(Output.getFilename()); 20248cac5f7e1ce63dd77ee0fb4ef68f9fa804f41ea6Daniel Dunbar 20258cac5f7e1ce63dd77ee0fb4ef68f9fa804f41ea6Daniel Dunbar if (Input.isPipe()) { 20268cac5f7e1ce63dd77ee0fb4ef68f9fa804f41ea6Daniel Dunbar CmdArgs.push_back("-"); 20278cac5f7e1ce63dd77ee0fb4ef68f9fa804f41ea6Daniel Dunbar } else { 20288cac5f7e1ce63dd77ee0fb4ef68f9fa804f41ea6Daniel Dunbar assert(Input.isFilename() && "Invalid input."); 20298cac5f7e1ce63dd77ee0fb4ef68f9fa804f41ea6Daniel Dunbar CmdArgs.push_back(Input.getFilename()); 20308cac5f7e1ce63dd77ee0fb4ef68f9fa804f41ea6Daniel Dunbar } 20318cac5f7e1ce63dd77ee0fb4ef68f9fa804f41ea6Daniel Dunbar 20328cac5f7e1ce63dd77ee0fb4ef68f9fa804f41ea6Daniel Dunbar // asm_final spec is empty. 20338cac5f7e1ce63dd77ee0fb4ef68f9fa804f41ea6Daniel Dunbar 2034c21c485b4fb58ef5d55cf3e523263dd824a2ace4Daniel Dunbar const char *Exec = 20355ed34f4c58b6ad4e21038d713c1fae31a6146ff5Daniel Dunbar Args.MakeArgString(getToolChain().GetProgramPath(C, "as")); 2036daab7b1016f0a82fefa4f7be6e63c57c06b19ffcDaniel Dunbar Dest.addCommand(new Command(JA, *this, Exec, CmdArgs)); 20378cac5f7e1ce63dd77ee0fb4ef68f9fa804f41ea6Daniel Dunbar} 2038ff7488dc9a766f94daf54d81b03ab9160d0bfd88Daniel Dunbar 203902633b541b04ad5ffc1c70f4c2feeeb13e607057Daniel Dunbar/// Helper routine for seeing if we should use dsymutil; this is a 204002633b541b04ad5ffc1c70f4c2feeeb13e607057Daniel Dunbar/// gcc compatible hack, we should remove it and use the input 204102633b541b04ad5ffc1c70f4c2feeeb13e607057Daniel Dunbar/// type information. 204202633b541b04ad5ffc1c70f4c2feeeb13e607057Daniel Dunbarstatic bool isSourceSuffix(const char *Str) { 204302633b541b04ad5ffc1c70f4c2feeeb13e607057Daniel Dunbar // match: 'C', 'CPP', 'c', 'cc', 'cp', 'c++', 'cpp', 'cxx', 'm', 204402633b541b04ad5ffc1c70f4c2feeeb13e607057Daniel Dunbar // 'mm'. 204555d3f7ae512875a1d6402943c3a619633feb2a18Douglas Gregor return llvm::StringSwitch<bool>(Str) 204655d3f7ae512875a1d6402943c3a619633feb2a18Douglas Gregor .Case("C", true) 204755d3f7ae512875a1d6402943c3a619633feb2a18Douglas Gregor .Case("c", true) 204855d3f7ae512875a1d6402943c3a619633feb2a18Douglas Gregor .Case("m", true) 204955d3f7ae512875a1d6402943c3a619633feb2a18Douglas Gregor .Case("cc", true) 205055d3f7ae512875a1d6402943c3a619633feb2a18Douglas Gregor .Case("cp", true) 205155d3f7ae512875a1d6402943c3a619633feb2a18Douglas Gregor .Case("mm", true) 205255d3f7ae512875a1d6402943c3a619633feb2a18Douglas Gregor .Case("CPP", true) 205355d3f7ae512875a1d6402943c3a619633feb2a18Douglas Gregor .Case("c++", true) 205455d3f7ae512875a1d6402943c3a619633feb2a18Douglas Gregor .Case("cpp", true) 205555d3f7ae512875a1d6402943c3a619633feb2a18Douglas Gregor .Case("cxx", true) 205655d3f7ae512875a1d6402943c3a619633feb2a18Douglas Gregor .Default(false); 205702633b541b04ad5ffc1c70f4c2feeeb13e607057Daniel Dunbar} 205802633b541b04ad5ffc1c70f4c2feeeb13e607057Daniel Dunbar 2059fbefe6bd6f62a3361813498dc672ab0d6c0d4fd1Daniel Dunbarvoid darwin::DarwinTool::AddDarwinArch(const ArgList &Args, 2060fbefe6bd6f62a3361813498dc672ab0d6c0d4fd1Daniel Dunbar ArgStringList &CmdArgs) const { 2061eeff406730f50afd973f005a8d501a19af4785e5Daniel Dunbar llvm::StringRef ArchName = getDarwinToolChain().getDarwinArchName(Args); 2062eeff406730f50afd973f005a8d501a19af4785e5Daniel Dunbar 206302633b541b04ad5ffc1c70f4c2feeeb13e607057Daniel Dunbar // Derived from darwin_arch spec. 206402633b541b04ad5ffc1c70f4c2feeeb13e607057Daniel Dunbar CmdArgs.push_back("-arch"); 2065eeff406730f50afd973f005a8d501a19af4785e5Daniel Dunbar CmdArgs.push_back(Args.MakeArgString(ArchName)); 206678dbd580a02759bbc408dbefb6754afa71b2c24cDaniel Dunbar 2067eeff406730f50afd973f005a8d501a19af4785e5Daniel Dunbar // FIXME: Is this needed anymore? 2068eeff406730f50afd973f005a8d501a19af4785e5Daniel Dunbar if (ArchName == "arm") 206978dbd580a02759bbc408dbefb6754afa71b2c24cDaniel Dunbar CmdArgs.push_back("-force_cpusubtype_ALL"); 207002633b541b04ad5ffc1c70f4c2feeeb13e607057Daniel Dunbar} 207102633b541b04ad5ffc1c70f4c2feeeb13e607057Daniel Dunbar 2072c21c485b4fb58ef5d55cf3e523263dd824a2ace4Daniel Dunbarvoid darwin::Link::AddLinkArgs(const ArgList &Args, 207302633b541b04ad5ffc1c70f4c2feeeb13e607057Daniel Dunbar ArgStringList &CmdArgs) const { 2074ee788e70fcd0adf76103b17c78ac658d4ea30c9bDaniel Dunbar const Driver &D = getToolChain().getDriver(); 207502633b541b04ad5ffc1c70f4c2feeeb13e607057Daniel Dunbar 207602633b541b04ad5ffc1c70f4c2feeeb13e607057Daniel Dunbar // Derived from the "link" spec. 207702633b541b04ad5ffc1c70f4c2feeeb13e607057Daniel Dunbar Args.AddAllArgs(CmdArgs, options::OPT_static); 207802633b541b04ad5ffc1c70f4c2feeeb13e607057Daniel Dunbar if (!Args.hasArg(options::OPT_static)) 207902633b541b04ad5ffc1c70f4c2feeeb13e607057Daniel Dunbar CmdArgs.push_back("-dynamic"); 208002633b541b04ad5ffc1c70f4c2feeeb13e607057Daniel Dunbar if (Args.hasArg(options::OPT_fgnu_runtime)) { 208102633b541b04ad5ffc1c70f4c2feeeb13e607057Daniel Dunbar // FIXME: gcc replaces -lobjc in forward args with -lobjc-gnu 208202633b541b04ad5ffc1c70f4c2feeeb13e607057Daniel Dunbar // here. How do we wish to handle such things? 208302633b541b04ad5ffc1c70f4c2feeeb13e607057Daniel Dunbar } 2084c21c485b4fb58ef5d55cf3e523263dd824a2ace4Daniel Dunbar 208502633b541b04ad5ffc1c70f4c2feeeb13e607057Daniel Dunbar if (!Args.hasArg(options::OPT_dynamiclib)) { 2086a6d38494d18e260958e73bfe5e2b3f1dc4160459Daniel Dunbar AddDarwinArch(Args, CmdArgs); 2087a6d38494d18e260958e73bfe5e2b3f1dc4160459Daniel Dunbar // FIXME: Why do this only on this path? 20888917dd4457affb8750c81f08cbc21902a36cff26Daniel Dunbar Args.AddLastArg(CmdArgs, options::OPT_force__cpusubtype__ALL); 208902633b541b04ad5ffc1c70f4c2feeeb13e607057Daniel Dunbar 209002633b541b04ad5ffc1c70f4c2feeeb13e607057Daniel Dunbar Args.AddLastArg(CmdArgs, options::OPT_bundle); 209102633b541b04ad5ffc1c70f4c2feeeb13e607057Daniel Dunbar Args.AddAllArgs(CmdArgs, options::OPT_bundle__loader); 209202633b541b04ad5ffc1c70f4c2feeeb13e607057Daniel Dunbar Args.AddAllArgs(CmdArgs, options::OPT_client__name); 209302633b541b04ad5ffc1c70f4c2feeeb13e607057Daniel Dunbar 209402633b541b04ad5ffc1c70f4c2feeeb13e607057Daniel Dunbar Arg *A; 209502633b541b04ad5ffc1c70f4c2feeeb13e607057Daniel Dunbar if ((A = Args.getLastArg(options::OPT_compatibility__version)) || 209602633b541b04ad5ffc1c70f4c2feeeb13e607057Daniel Dunbar (A = Args.getLastArg(options::OPT_current__version)) || 209702633b541b04ad5ffc1c70f4c2feeeb13e607057Daniel Dunbar (A = Args.getLastArg(options::OPT_install__name))) 209802633b541b04ad5ffc1c70f4c2feeeb13e607057Daniel Dunbar D.Diag(clang::diag::err_drv_argument_only_allowed_with) 209902633b541b04ad5ffc1c70f4c2feeeb13e607057Daniel Dunbar << A->getAsString(Args) << "-dynamiclib"; 210002633b541b04ad5ffc1c70f4c2feeeb13e607057Daniel Dunbar 210102633b541b04ad5ffc1c70f4c2feeeb13e607057Daniel Dunbar Args.AddLastArg(CmdArgs, options::OPT_force__flat__namespace); 210202633b541b04ad5ffc1c70f4c2feeeb13e607057Daniel Dunbar Args.AddLastArg(CmdArgs, options::OPT_keep__private__externs); 210302633b541b04ad5ffc1c70f4c2feeeb13e607057Daniel Dunbar Args.AddLastArg(CmdArgs, options::OPT_private__bundle); 210402633b541b04ad5ffc1c70f4c2feeeb13e607057Daniel Dunbar } else { 210502633b541b04ad5ffc1c70f4c2feeeb13e607057Daniel Dunbar CmdArgs.push_back("-dylib"); 210602633b541b04ad5ffc1c70f4c2feeeb13e607057Daniel Dunbar 210702633b541b04ad5ffc1c70f4c2feeeb13e607057Daniel Dunbar Arg *A; 210802633b541b04ad5ffc1c70f4c2feeeb13e607057Daniel Dunbar if ((A = Args.getLastArg(options::OPT_bundle)) || 210902633b541b04ad5ffc1c70f4c2feeeb13e607057Daniel Dunbar (A = Args.getLastArg(options::OPT_bundle__loader)) || 211002633b541b04ad5ffc1c70f4c2feeeb13e607057Daniel Dunbar (A = Args.getLastArg(options::OPT_client__name)) || 211102633b541b04ad5ffc1c70f4c2feeeb13e607057Daniel Dunbar (A = Args.getLastArg(options::OPT_force__flat__namespace)) || 211202633b541b04ad5ffc1c70f4c2feeeb13e607057Daniel Dunbar (A = Args.getLastArg(options::OPT_keep__private__externs)) || 211302633b541b04ad5ffc1c70f4c2feeeb13e607057Daniel Dunbar (A = Args.getLastArg(options::OPT_private__bundle))) 211402633b541b04ad5ffc1c70f4c2feeeb13e607057Daniel Dunbar D.Diag(clang::diag::err_drv_argument_not_allowed_with) 211502633b541b04ad5ffc1c70f4c2feeeb13e607057Daniel Dunbar << A->getAsString(Args) << "-dynamiclib"; 2116c21c485b4fb58ef5d55cf3e523263dd824a2ace4Daniel Dunbar 211702633b541b04ad5ffc1c70f4c2feeeb13e607057Daniel Dunbar Args.AddAllArgsTranslated(CmdArgs, options::OPT_compatibility__version, 211802633b541b04ad5ffc1c70f4c2feeeb13e607057Daniel Dunbar "-dylib_compatibility_version"); 211902633b541b04ad5ffc1c70f4c2feeeb13e607057Daniel Dunbar Args.AddAllArgsTranslated(CmdArgs, options::OPT_current__version, 212002633b541b04ad5ffc1c70f4c2feeeb13e607057Daniel Dunbar "-dylib_current_version"); 212102633b541b04ad5ffc1c70f4c2feeeb13e607057Daniel Dunbar 2122a6d38494d18e260958e73bfe5e2b3f1dc4160459Daniel Dunbar AddDarwinArch(Args, CmdArgs); 212302633b541b04ad5ffc1c70f4c2feeeb13e607057Daniel Dunbar 212402633b541b04ad5ffc1c70f4c2feeeb13e607057Daniel Dunbar Args.AddAllArgsTranslated(CmdArgs, options::OPT_install__name, 212502633b541b04ad5ffc1c70f4c2feeeb13e607057Daniel Dunbar "-dylib_install_name"); 212602633b541b04ad5ffc1c70f4c2feeeb13e607057Daniel Dunbar } 212702633b541b04ad5ffc1c70f4c2feeeb13e607057Daniel Dunbar 212802633b541b04ad5ffc1c70f4c2feeeb13e607057Daniel Dunbar Args.AddLastArg(CmdArgs, options::OPT_all__load); 212902633b541b04ad5ffc1c70f4c2feeeb13e607057Daniel Dunbar Args.AddAllArgs(CmdArgs, options::OPT_allowable__client); 213002633b541b04ad5ffc1c70f4c2feeeb13e607057Daniel Dunbar Args.AddLastArg(CmdArgs, options::OPT_bind__at__load); 2131251ca6c9fb2bb398d9bf9fe7399c27bed7074b5cDaniel Dunbar if (getDarwinToolChain().isTargetIPhoneOS()) 2132d82f8fa53771b454885c546f0fd452a4980b3a3eDaniel Dunbar Args.AddLastArg(CmdArgs, options::OPT_arch__errors__fatal); 213302633b541b04ad5ffc1c70f4c2feeeb13e607057Daniel Dunbar Args.AddLastArg(CmdArgs, options::OPT_dead__strip); 213402633b541b04ad5ffc1c70f4c2feeeb13e607057Daniel Dunbar Args.AddLastArg(CmdArgs, options::OPT_no__dead__strip__inits__and__terms); 213502633b541b04ad5ffc1c70f4c2feeeb13e607057Daniel Dunbar Args.AddAllArgs(CmdArgs, options::OPT_dylib__file); 213602633b541b04ad5ffc1c70f4c2feeeb13e607057Daniel Dunbar Args.AddLastArg(CmdArgs, options::OPT_dynamic); 213702633b541b04ad5ffc1c70f4c2feeeb13e607057Daniel Dunbar Args.AddAllArgs(CmdArgs, options::OPT_exported__symbols__list); 213802633b541b04ad5ffc1c70f4c2feeeb13e607057Daniel Dunbar Args.AddLastArg(CmdArgs, options::OPT_flat__namespace); 213902633b541b04ad5ffc1c70f4c2feeeb13e607057Daniel Dunbar Args.AddAllArgs(CmdArgs, options::OPT_headerpad__max__install__names); 214002633b541b04ad5ffc1c70f4c2feeeb13e607057Daniel Dunbar Args.AddAllArgs(CmdArgs, options::OPT_image__base); 214102633b541b04ad5ffc1c70f4c2feeeb13e607057Daniel Dunbar Args.AddAllArgs(CmdArgs, options::OPT_init); 214202633b541b04ad5ffc1c70f4c2feeeb13e607057Daniel Dunbar 2143314cba02728c451c783b38bf6c00f220afb193c8Daniel Dunbar // Adding all arguments doesn't make sense here but this is what gcc does. One 2144314cba02728c451c783b38bf6c00f220afb193c8Daniel Dunbar // of this should always be present thanks to argument translation. 2145314cba02728c451c783b38bf6c00f220afb193c8Daniel Dunbar assert((Args.hasArg(options::OPT_mmacosx_version_min_EQ) || 2146314cba02728c451c783b38bf6c00f220afb193c8Daniel Dunbar Args.hasArg(options::OPT_miphoneos_version_min_EQ)) && 2147314cba02728c451c783b38bf6c00f220afb193c8Daniel Dunbar "Missing version argument (lost in translation)?"); 214830392de4681602f1aabc61b0184b1de53bc172f0Daniel Dunbar Args.AddAllArgsTranslated(CmdArgs, options::OPT_mmacosx_version_min_EQ, 2149294691eb1caf551083acd7b08630ef21c3fd760dDaniel Dunbar "-macosx_version_min"); 215002633b541b04ad5ffc1c70f4c2feeeb13e607057Daniel Dunbar Args.AddAllArgsTranslated(CmdArgs, options::OPT_miphoneos_version_min_EQ, 215102633b541b04ad5ffc1c70f4c2feeeb13e607057Daniel Dunbar "-iphoneos_version_min"); 215202633b541b04ad5ffc1c70f4c2feeeb13e607057Daniel Dunbar Args.AddLastArg(CmdArgs, options::OPT_nomultidefs); 215302633b541b04ad5ffc1c70f4c2feeeb13e607057Daniel Dunbar Args.AddLastArg(CmdArgs, options::OPT_multi__module); 215402633b541b04ad5ffc1c70f4c2feeeb13e607057Daniel Dunbar Args.AddLastArg(CmdArgs, options::OPT_single__module); 215502633b541b04ad5ffc1c70f4c2feeeb13e607057Daniel Dunbar Args.AddAllArgs(CmdArgs, options::OPT_multiply__defined); 215602633b541b04ad5ffc1c70f4c2feeeb13e607057Daniel Dunbar Args.AddAllArgs(CmdArgs, options::OPT_multiply__defined__unused); 2157c21c485b4fb58ef5d55cf3e523263dd824a2ace4Daniel Dunbar 215802633b541b04ad5ffc1c70f4c2feeeb13e607057Daniel Dunbar if (Args.hasArg(options::OPT_fpie)) 215902633b541b04ad5ffc1c70f4c2feeeb13e607057Daniel Dunbar CmdArgs.push_back("-pie"); 216002633b541b04ad5ffc1c70f4c2feeeb13e607057Daniel Dunbar 216102633b541b04ad5ffc1c70f4c2feeeb13e607057Daniel Dunbar Args.AddLastArg(CmdArgs, options::OPT_prebind); 216202633b541b04ad5ffc1c70f4c2feeeb13e607057Daniel Dunbar Args.AddLastArg(CmdArgs, options::OPT_noprebind); 216302633b541b04ad5ffc1c70f4c2feeeb13e607057Daniel Dunbar Args.AddLastArg(CmdArgs, options::OPT_nofixprebinding); 216402633b541b04ad5ffc1c70f4c2feeeb13e607057Daniel Dunbar Args.AddLastArg(CmdArgs, options::OPT_prebind__all__twolevel__modules); 216502633b541b04ad5ffc1c70f4c2feeeb13e607057Daniel Dunbar Args.AddLastArg(CmdArgs, options::OPT_read__only__relocs); 216602633b541b04ad5ffc1c70f4c2feeeb13e607057Daniel Dunbar Args.AddAllArgs(CmdArgs, options::OPT_sectcreate); 216702633b541b04ad5ffc1c70f4c2feeeb13e607057Daniel Dunbar Args.AddAllArgs(CmdArgs, options::OPT_sectorder); 216802633b541b04ad5ffc1c70f4c2feeeb13e607057Daniel Dunbar Args.AddAllArgs(CmdArgs, options::OPT_seg1addr); 216902633b541b04ad5ffc1c70f4c2feeeb13e607057Daniel Dunbar Args.AddAllArgs(CmdArgs, options::OPT_segprot); 217002633b541b04ad5ffc1c70f4c2feeeb13e607057Daniel Dunbar Args.AddAllArgs(CmdArgs, options::OPT_segaddr); 217102633b541b04ad5ffc1c70f4c2feeeb13e607057Daniel Dunbar Args.AddAllArgs(CmdArgs, options::OPT_segs__read__only__addr); 217202633b541b04ad5ffc1c70f4c2feeeb13e607057Daniel Dunbar Args.AddAllArgs(CmdArgs, options::OPT_segs__read__write__addr); 217302633b541b04ad5ffc1c70f4c2feeeb13e607057Daniel Dunbar Args.AddAllArgs(CmdArgs, options::OPT_seg__addr__table); 217402633b541b04ad5ffc1c70f4c2feeeb13e607057Daniel Dunbar Args.AddAllArgs(CmdArgs, options::OPT_seg__addr__table__filename); 217502633b541b04ad5ffc1c70f4c2feeeb13e607057Daniel Dunbar Args.AddAllArgs(CmdArgs, options::OPT_sub__library); 217602633b541b04ad5ffc1c70f4c2feeeb13e607057Daniel Dunbar Args.AddAllArgs(CmdArgs, options::OPT_sub__umbrella); 2177d82f8fa53771b454885c546f0fd452a4980b3a3eDaniel Dunbar 217802633b541b04ad5ffc1c70f4c2feeeb13e607057Daniel Dunbar Args.AddAllArgsTranslated(CmdArgs, options::OPT_isysroot, "-syslibroot"); 2179251ca6c9fb2bb398d9bf9fe7399c27bed7074b5cDaniel Dunbar if (getDarwinToolChain().isTargetIPhoneOS()) { 2180d82f8fa53771b454885c546f0fd452a4980b3a3eDaniel Dunbar if (!Args.hasArg(options::OPT_isysroot)) { 2181d82f8fa53771b454885c546f0fd452a4980b3a3eDaniel Dunbar CmdArgs.push_back("-syslibroot"); 2182d82f8fa53771b454885c546f0fd452a4980b3a3eDaniel Dunbar CmdArgs.push_back("/Developer/SDKs/Extra"); 2183d82f8fa53771b454885c546f0fd452a4980b3a3eDaniel Dunbar } 2184d82f8fa53771b454885c546f0fd452a4980b3a3eDaniel Dunbar } 2185d82f8fa53771b454885c546f0fd452a4980b3a3eDaniel Dunbar 218602633b541b04ad5ffc1c70f4c2feeeb13e607057Daniel Dunbar Args.AddLastArg(CmdArgs, options::OPT_twolevel__namespace); 218702633b541b04ad5ffc1c70f4c2feeeb13e607057Daniel Dunbar Args.AddLastArg(CmdArgs, options::OPT_twolevel__namespace__hints); 218802633b541b04ad5ffc1c70f4c2feeeb13e607057Daniel Dunbar Args.AddAllArgs(CmdArgs, options::OPT_umbrella); 218902633b541b04ad5ffc1c70f4c2feeeb13e607057Daniel Dunbar Args.AddAllArgs(CmdArgs, options::OPT_undefined); 219002633b541b04ad5ffc1c70f4c2feeeb13e607057Daniel Dunbar Args.AddAllArgs(CmdArgs, options::OPT_unexported__symbols__list); 2191d82f8fa53771b454885c546f0fd452a4980b3a3eDaniel Dunbar Args.AddAllArgs(CmdArgs, options::OPT_weak__reference__mismatches); 219202633b541b04ad5ffc1c70f4c2feeeb13e607057Daniel Dunbar Args.AddLastArg(CmdArgs, options::OPT_X_Flag); 219302633b541b04ad5ffc1c70f4c2feeeb13e607057Daniel Dunbar Args.AddAllArgs(CmdArgs, options::OPT_y); 219402633b541b04ad5ffc1c70f4c2feeeb13e607057Daniel Dunbar Args.AddLastArg(CmdArgs, options::OPT_w); 219502633b541b04ad5ffc1c70f4c2feeeb13e607057Daniel Dunbar Args.AddAllArgs(CmdArgs, options::OPT_pagezero__size); 219602633b541b04ad5ffc1c70f4c2feeeb13e607057Daniel Dunbar Args.AddAllArgs(CmdArgs, options::OPT_segs__read__); 219702633b541b04ad5ffc1c70f4c2feeeb13e607057Daniel Dunbar Args.AddLastArg(CmdArgs, options::OPT_seglinkedit); 219802633b541b04ad5ffc1c70f4c2feeeb13e607057Daniel Dunbar Args.AddLastArg(CmdArgs, options::OPT_noseglinkedit); 219902633b541b04ad5ffc1c70f4c2feeeb13e607057Daniel Dunbar Args.AddAllArgs(CmdArgs, options::OPT_sectalign); 220002633b541b04ad5ffc1c70f4c2feeeb13e607057Daniel Dunbar Args.AddAllArgs(CmdArgs, options::OPT_sectobjectsymbols); 220102633b541b04ad5ffc1c70f4c2feeeb13e607057Daniel Dunbar Args.AddAllArgs(CmdArgs, options::OPT_segcreate); 220202633b541b04ad5ffc1c70f4c2feeeb13e607057Daniel Dunbar Args.AddLastArg(CmdArgs, options::OPT_whyload); 220302633b541b04ad5ffc1c70f4c2feeeb13e607057Daniel Dunbar Args.AddLastArg(CmdArgs, options::OPT_whatsloaded); 220402633b541b04ad5ffc1c70f4c2feeeb13e607057Daniel Dunbar Args.AddAllArgs(CmdArgs, options::OPT_dylinker__install__name); 220502633b541b04ad5ffc1c70f4c2feeeb13e607057Daniel Dunbar Args.AddLastArg(CmdArgs, options::OPT_dylinker); 220602633b541b04ad5ffc1c70f4c2feeeb13e607057Daniel Dunbar Args.AddLastArg(CmdArgs, options::OPT_Mach); 220702633b541b04ad5ffc1c70f4c2feeeb13e607057Daniel Dunbar} 220802633b541b04ad5ffc1c70f4c2feeeb13e607057Daniel Dunbar 220902633b541b04ad5ffc1c70f4c2feeeb13e607057Daniel Dunbarvoid darwin::Link::ConstructJob(Compilation &C, const JobAction &JA, 2210c21c485b4fb58ef5d55cf3e523263dd824a2ace4Daniel Dunbar Job &Dest, const InputInfo &Output, 2211c21c485b4fb58ef5d55cf3e523263dd824a2ace4Daniel Dunbar const InputInfoList &Inputs, 2212c21c485b4fb58ef5d55cf3e523263dd824a2ace4Daniel Dunbar const ArgList &Args, 221302633b541b04ad5ffc1c70f4c2feeeb13e607057Daniel Dunbar const char *LinkingOutput) const { 221402633b541b04ad5ffc1c70f4c2feeeb13e607057Daniel Dunbar assert(Output.getType() == types::TY_Image && "Invalid linker output type."); 2215e0be8b1729d8978de433d229c065830b95d0ae68Daniel Dunbar 221602633b541b04ad5ffc1c70f4c2feeeb13e607057Daniel Dunbar // The logic here is derived from gcc's behavior; most of which 221702633b541b04ad5ffc1c70f4c2feeeb13e607057Daniel Dunbar // comes from specs (starting with link_command). Consult gcc for 221802633b541b04ad5ffc1c70f4c2feeeb13e607057Daniel Dunbar // more information. 221902633b541b04ad5ffc1c70f4c2feeeb13e607057Daniel Dunbar ArgStringList CmdArgs; 222002633b541b04ad5ffc1c70f4c2feeeb13e607057Daniel Dunbar 222102633b541b04ad5ffc1c70f4c2feeeb13e607057Daniel Dunbar // I'm not sure why this particular decomposition exists in gcc, but 222202633b541b04ad5ffc1c70f4c2feeeb13e607057Daniel Dunbar // we follow suite for ease of comparison. 222302633b541b04ad5ffc1c70f4c2feeeb13e607057Daniel Dunbar AddLinkArgs(Args, CmdArgs); 222402633b541b04ad5ffc1c70f4c2feeeb13e607057Daniel Dunbar 222502633b541b04ad5ffc1c70f4c2feeeb13e607057Daniel Dunbar Args.AddAllArgs(CmdArgs, options::OPT_d_Flag); 222602633b541b04ad5ffc1c70f4c2feeeb13e607057Daniel Dunbar Args.AddAllArgs(CmdArgs, options::OPT_s); 222702633b541b04ad5ffc1c70f4c2feeeb13e607057Daniel Dunbar Args.AddAllArgs(CmdArgs, options::OPT_t); 222802633b541b04ad5ffc1c70f4c2feeeb13e607057Daniel Dunbar Args.AddAllArgs(CmdArgs, options::OPT_Z_Flag); 222902633b541b04ad5ffc1c70f4c2feeeb13e607057Daniel Dunbar Args.AddAllArgs(CmdArgs, options::OPT_u_Group); 223002633b541b04ad5ffc1c70f4c2feeeb13e607057Daniel Dunbar Args.AddAllArgs(CmdArgs, options::OPT_A); 223102633b541b04ad5ffc1c70f4c2feeeb13e607057Daniel Dunbar Args.AddLastArg(CmdArgs, options::OPT_e); 223202633b541b04ad5ffc1c70f4c2feeeb13e607057Daniel Dunbar Args.AddAllArgs(CmdArgs, options::OPT_m_Separate); 223302633b541b04ad5ffc1c70f4c2feeeb13e607057Daniel Dunbar Args.AddAllArgs(CmdArgs, options::OPT_r); 223402633b541b04ad5ffc1c70f4c2feeeb13e607057Daniel Dunbar 223502633b541b04ad5ffc1c70f4c2feeeb13e607057Daniel Dunbar CmdArgs.push_back("-o"); 223602633b541b04ad5ffc1c70f4c2feeeb13e607057Daniel Dunbar CmdArgs.push_back(Output.getFilename()); 223702633b541b04ad5ffc1c70f4c2feeeb13e607057Daniel Dunbar 223802633b541b04ad5ffc1c70f4c2feeeb13e607057Daniel Dunbar if (!Args.hasArg(options::OPT_A) && 223902633b541b04ad5ffc1c70f4c2feeeb13e607057Daniel Dunbar !Args.hasArg(options::OPT_nostdlib) && 224002633b541b04ad5ffc1c70f4c2feeeb13e607057Daniel Dunbar !Args.hasArg(options::OPT_nostartfiles)) { 224102633b541b04ad5ffc1c70f4c2feeeb13e607057Daniel Dunbar // Derived from startfile spec. 224202633b541b04ad5ffc1c70f4c2feeeb13e607057Daniel Dunbar if (Args.hasArg(options::OPT_dynamiclib)) { 2243c21c485b4fb58ef5d55cf3e523263dd824a2ace4Daniel Dunbar // Derived from darwin_dylib1 spec. 2244cacb0f007001f7463d44ebd5dde7bfaecf876a71Daniel Dunbar if (getDarwinToolChain().isTargetIPhoneOS()) { 2245cacb0f007001f7463d44ebd5dde7bfaecf876a71Daniel Dunbar if (getDarwinToolChain().isIPhoneOSVersionLT(3, 1)) 2246cacb0f007001f7463d44ebd5dde7bfaecf876a71Daniel Dunbar CmdArgs.push_back("-ldylib1.o"); 2247cacb0f007001f7463d44ebd5dde7bfaecf876a71Daniel Dunbar } else { 2248ce3fdf233353b10f20d74dceda3d77a82285de17Daniel Dunbar if (getDarwinToolChain().isMacosxVersionLT(10, 5)) 2249cacb0f007001f7463d44ebd5dde7bfaecf876a71Daniel Dunbar CmdArgs.push_back("-ldylib1.o"); 2250ce3fdf233353b10f20d74dceda3d77a82285de17Daniel Dunbar else if (getDarwinToolChain().isMacosxVersionLT(10, 6)) 2251cacb0f007001f7463d44ebd5dde7bfaecf876a71Daniel Dunbar CmdArgs.push_back("-ldylib1.10.5.o"); 2252cacb0f007001f7463d44ebd5dde7bfaecf876a71Daniel Dunbar } 225302633b541b04ad5ffc1c70f4c2feeeb13e607057Daniel Dunbar } else { 225402633b541b04ad5ffc1c70f4c2feeeb13e607057Daniel Dunbar if (Args.hasArg(options::OPT_bundle)) { 22558a8d8afa3df40e9f122d2b826f1a825a66f6908dDaniel Dunbar if (!Args.hasArg(options::OPT_static)) { 22568a8d8afa3df40e9f122d2b826f1a825a66f6908dDaniel Dunbar // Derived from darwin_bundle1 spec. 2257cacb0f007001f7463d44ebd5dde7bfaecf876a71Daniel Dunbar if (getDarwinToolChain().isTargetIPhoneOS()) { 2258cacb0f007001f7463d44ebd5dde7bfaecf876a71Daniel Dunbar if (getDarwinToolChain().isIPhoneOSVersionLT(3, 1)) 2259cacb0f007001f7463d44ebd5dde7bfaecf876a71Daniel Dunbar CmdArgs.push_back("-lbundle1.o"); 2260cacb0f007001f7463d44ebd5dde7bfaecf876a71Daniel Dunbar } else { 2261ce3fdf233353b10f20d74dceda3d77a82285de17Daniel Dunbar if (getDarwinToolChain().isMacosxVersionLT(10, 6)) 2262cacb0f007001f7463d44ebd5dde7bfaecf876a71Daniel Dunbar CmdArgs.push_back("-lbundle1.o"); 2263cacb0f007001f7463d44ebd5dde7bfaecf876a71Daniel Dunbar } 22648a8d8afa3df40e9f122d2b826f1a825a66f6908dDaniel Dunbar } 226502633b541b04ad5ffc1c70f4c2feeeb13e607057Daniel Dunbar } else { 226602633b541b04ad5ffc1c70f4c2feeeb13e607057Daniel Dunbar if (Args.hasArg(options::OPT_pg)) { 226702633b541b04ad5ffc1c70f4c2feeeb13e607057Daniel Dunbar if (Args.hasArg(options::OPT_static) || 226802633b541b04ad5ffc1c70f4c2feeeb13e607057Daniel Dunbar Args.hasArg(options::OPT_object) || 226902633b541b04ad5ffc1c70f4c2feeeb13e607057Daniel Dunbar Args.hasArg(options::OPT_preload)) { 227002633b541b04ad5ffc1c70f4c2feeeb13e607057Daniel Dunbar CmdArgs.push_back("-lgcrt0.o"); 227102633b541b04ad5ffc1c70f4c2feeeb13e607057Daniel Dunbar } else { 227202633b541b04ad5ffc1c70f4c2feeeb13e607057Daniel Dunbar CmdArgs.push_back("-lgcrt1.o"); 2273c21c485b4fb58ef5d55cf3e523263dd824a2ace4Daniel Dunbar 227402633b541b04ad5ffc1c70f4c2feeeb13e607057Daniel Dunbar // darwin_crt2 spec is empty. 2275c21c485b4fb58ef5d55cf3e523263dd824a2ace4Daniel Dunbar } 227602633b541b04ad5ffc1c70f4c2feeeb13e607057Daniel Dunbar } else { 227702633b541b04ad5ffc1c70f4c2feeeb13e607057Daniel Dunbar if (Args.hasArg(options::OPT_static) || 227802633b541b04ad5ffc1c70f4c2feeeb13e607057Daniel Dunbar Args.hasArg(options::OPT_object) || 227902633b541b04ad5ffc1c70f4c2feeeb13e607057Daniel Dunbar Args.hasArg(options::OPT_preload)) { 228002633b541b04ad5ffc1c70f4c2feeeb13e607057Daniel Dunbar CmdArgs.push_back("-lcrt0.o"); 228102633b541b04ad5ffc1c70f4c2feeeb13e607057Daniel Dunbar } else { 228202633b541b04ad5ffc1c70f4c2feeeb13e607057Daniel Dunbar // Derived from darwin_crt1 spec. 2283251ca6c9fb2bb398d9bf9fe7399c27bed7074b5cDaniel Dunbar if (getDarwinToolChain().isTargetIPhoneOS()) { 2284cacb0f007001f7463d44ebd5dde7bfaecf876a71Daniel Dunbar if (getDarwinToolChain().isIPhoneOSVersionLT(3, 1)) 2285cacb0f007001f7463d44ebd5dde7bfaecf876a71Daniel Dunbar CmdArgs.push_back("-lcrt1.o"); 2286cacb0f007001f7463d44ebd5dde7bfaecf876a71Daniel Dunbar else 2287cacb0f007001f7463d44ebd5dde7bfaecf876a71Daniel Dunbar CmdArgs.push_back("-lcrt1.3.1.o"); 2288ce3fdf233353b10f20d74dceda3d77a82285de17Daniel Dunbar } else { 2289ce3fdf233353b10f20d74dceda3d77a82285de17Daniel Dunbar if (getDarwinToolChain().isMacosxVersionLT(10, 5)) 2290ce3fdf233353b10f20d74dceda3d77a82285de17Daniel Dunbar CmdArgs.push_back("-lcrt1.o"); 2291ce3fdf233353b10f20d74dceda3d77a82285de17Daniel Dunbar else if (getDarwinToolChain().isMacosxVersionLT(10, 6)) 2292ce3fdf233353b10f20d74dceda3d77a82285de17Daniel Dunbar CmdArgs.push_back("-lcrt1.10.5.o"); 2293ce3fdf233353b10f20d74dceda3d77a82285de17Daniel Dunbar else 2294ce3fdf233353b10f20d74dceda3d77a82285de17Daniel Dunbar CmdArgs.push_back("-lcrt1.10.6.o"); 2295c21c485b4fb58ef5d55cf3e523263dd824a2ace4Daniel Dunbar 2296ce3fdf233353b10f20d74dceda3d77a82285de17Daniel Dunbar // darwin_crt2 spec is empty. 2297ce3fdf233353b10f20d74dceda3d77a82285de17Daniel Dunbar } 229802633b541b04ad5ffc1c70f4c2feeeb13e607057Daniel Dunbar } 229902633b541b04ad5ffc1c70f4c2feeeb13e607057Daniel Dunbar } 230002633b541b04ad5ffc1c70f4c2feeeb13e607057Daniel Dunbar } 230102633b541b04ad5ffc1c70f4c2feeeb13e607057Daniel Dunbar } 230202633b541b04ad5ffc1c70f4c2feeeb13e607057Daniel Dunbar 2303ce3fdf233353b10f20d74dceda3d77a82285de17Daniel Dunbar if (!getDarwinToolChain().isTargetIPhoneOS() && 2304ce3fdf233353b10f20d74dceda3d77a82285de17Daniel Dunbar Args.hasArg(options::OPT_shared_libgcc) && 2305ce3fdf233353b10f20d74dceda3d77a82285de17Daniel Dunbar getDarwinToolChain().isMacosxVersionLT(10, 5)) { 2306881376467c46c5c6cc16fa6790271c2c22e1d4f1Daniel Dunbar const char *Str = 23075ed34f4c58b6ad4e21038d713c1fae31a6146ff5Daniel Dunbar Args.MakeArgString(getToolChain().GetFilePath(C, "crt3.o")); 2308881376467c46c5c6cc16fa6790271c2c22e1d4f1Daniel Dunbar CmdArgs.push_back(Str); 230902633b541b04ad5ffc1c70f4c2feeeb13e607057Daniel Dunbar } 231002633b541b04ad5ffc1c70f4c2feeeb13e607057Daniel Dunbar } 231102633b541b04ad5ffc1c70f4c2feeeb13e607057Daniel Dunbar 231202633b541b04ad5ffc1c70f4c2feeeb13e607057Daniel Dunbar Args.AddAllArgs(CmdArgs, options::OPT_L); 2313c21c485b4fb58ef5d55cf3e523263dd824a2ace4Daniel Dunbar 231402633b541b04ad5ffc1c70f4c2feeeb13e607057Daniel Dunbar if (Args.hasArg(options::OPT_fopenmp)) 231502633b541b04ad5ffc1c70f4c2feeeb13e607057Daniel Dunbar // This is more complicated in gcc... 231602633b541b04ad5ffc1c70f4c2feeeb13e607057Daniel Dunbar CmdArgs.push_back("-lgomp"); 231702633b541b04ad5ffc1c70f4c2feeeb13e607057Daniel Dunbar 23186b200b2b698b6ac9e310f2225c69c85d28ae4fb0Daniel Dunbar getDarwinToolChain().AddLinkSearchPathArgs(Args, CmdArgs); 2319c21c485b4fb58ef5d55cf3e523263dd824a2ace4Daniel Dunbar 232002633b541b04ad5ffc1c70f4c2feeeb13e607057Daniel Dunbar for (InputInfoList::const_iterator 232102633b541b04ad5ffc1c70f4c2feeeb13e607057Daniel Dunbar it = Inputs.begin(), ie = Inputs.end(); it != ie; ++it) { 232202633b541b04ad5ffc1c70f4c2feeeb13e607057Daniel Dunbar const InputInfo &II = *it; 232302633b541b04ad5ffc1c70f4c2feeeb13e607057Daniel Dunbar if (II.isFilename()) 232402633b541b04ad5ffc1c70f4c2feeeb13e607057Daniel Dunbar CmdArgs.push_back(II.getFilename()); 2325c21c485b4fb58ef5d55cf3e523263dd824a2ace4Daniel Dunbar else 232602633b541b04ad5ffc1c70f4c2feeeb13e607057Daniel Dunbar II.getInputArg().renderAsInput(Args, CmdArgs); 232702633b541b04ad5ffc1c70f4c2feeeb13e607057Daniel Dunbar } 232802633b541b04ad5ffc1c70f4c2feeeb13e607057Daniel Dunbar 232902633b541b04ad5ffc1c70f4c2feeeb13e607057Daniel Dunbar if (LinkingOutput) { 233002633b541b04ad5ffc1c70f4c2feeeb13e607057Daniel Dunbar CmdArgs.push_back("-arch_multiple"); 233102633b541b04ad5ffc1c70f4c2feeeb13e607057Daniel Dunbar CmdArgs.push_back("-final_output"); 233202633b541b04ad5ffc1c70f4c2feeeb13e607057Daniel Dunbar CmdArgs.push_back(LinkingOutput); 233302633b541b04ad5ffc1c70f4c2feeeb13e607057Daniel Dunbar } 233402633b541b04ad5ffc1c70f4c2feeeb13e607057Daniel Dunbar 233502633b541b04ad5ffc1c70f4c2feeeb13e607057Daniel Dunbar if (Args.hasArg(options::OPT_fprofile_arcs) || 233602633b541b04ad5ffc1c70f4c2feeeb13e607057Daniel Dunbar Args.hasArg(options::OPT_fprofile_generate) || 233702633b541b04ad5ffc1c70f4c2feeeb13e607057Daniel Dunbar Args.hasArg(options::OPT_fcreate_profile) || 233802633b541b04ad5ffc1c70f4c2feeeb13e607057Daniel Dunbar Args.hasArg(options::OPT_coverage)) 233902633b541b04ad5ffc1c70f4c2feeeb13e607057Daniel Dunbar CmdArgs.push_back("-lgcov"); 2340c21c485b4fb58ef5d55cf3e523263dd824a2ace4Daniel Dunbar 234102633b541b04ad5ffc1c70f4c2feeeb13e607057Daniel Dunbar if (Args.hasArg(options::OPT_fnested_functions)) 234202633b541b04ad5ffc1c70f4c2feeeb13e607057Daniel Dunbar CmdArgs.push_back("-allow_stack_execute"); 2343c21c485b4fb58ef5d55cf3e523263dd824a2ace4Daniel Dunbar 234402633b541b04ad5ffc1c70f4c2feeeb13e607057Daniel Dunbar if (!Args.hasArg(options::OPT_nostdlib) && 234502633b541b04ad5ffc1c70f4c2feeeb13e607057Daniel Dunbar !Args.hasArg(options::OPT_nodefaultlibs)) { 2346edfa02b85b186e9ea9e0c841539a77ed32ee9148Daniel Dunbar // FIXME: g++ is more complicated here, it tries to put -lstdc++ 2347edfa02b85b186e9ea9e0c841539a77ed32ee9148Daniel Dunbar // before -lm, for example. 2348ee788e70fcd0adf76103b17c78ac658d4ea30c9bDaniel Dunbar if (getToolChain().getDriver().CCCIsCXX) 2349edfa02b85b186e9ea9e0c841539a77ed32ee9148Daniel Dunbar CmdArgs.push_back("-lstdc++"); 2350edfa02b85b186e9ea9e0c841539a77ed32ee9148Daniel Dunbar 235102633b541b04ad5ffc1c70f4c2feeeb13e607057Daniel Dunbar // link_ssp spec is empty. 235202633b541b04ad5ffc1c70f4c2feeeb13e607057Daniel Dunbar 23536cd4154b9088fa18ae05d11c0f3140fafd76c734Daniel Dunbar // Let the tool chain choose which runtime library to link. 23546cd4154b9088fa18ae05d11c0f3140fafd76c734Daniel Dunbar getDarwinToolChain().AddLinkRuntimeLibArgs(Args, CmdArgs); 235502633b541b04ad5ffc1c70f4c2feeeb13e607057Daniel Dunbar } 235602633b541b04ad5ffc1c70f4c2feeeb13e607057Daniel Dunbar 235702633b541b04ad5ffc1c70f4c2feeeb13e607057Daniel Dunbar if (!Args.hasArg(options::OPT_A) && 235802633b541b04ad5ffc1c70f4c2feeeb13e607057Daniel Dunbar !Args.hasArg(options::OPT_nostdlib) && 235902633b541b04ad5ffc1c70f4c2feeeb13e607057Daniel Dunbar !Args.hasArg(options::OPT_nostartfiles)) { 236002633b541b04ad5ffc1c70f4c2feeeb13e607057Daniel Dunbar // endfile_spec is empty. 236102633b541b04ad5ffc1c70f4c2feeeb13e607057Daniel Dunbar } 236202633b541b04ad5ffc1c70f4c2feeeb13e607057Daniel Dunbar 236302633b541b04ad5ffc1c70f4c2feeeb13e607057Daniel Dunbar Args.AddAllArgs(CmdArgs, options::OPT_T_Group); 236402633b541b04ad5ffc1c70f4c2feeeb13e607057Daniel Dunbar Args.AddAllArgs(CmdArgs, options::OPT_F); 236502633b541b04ad5ffc1c70f4c2feeeb13e607057Daniel Dunbar 2366c21c485b4fb58ef5d55cf3e523263dd824a2ace4Daniel Dunbar const char *Exec = 23675ed34f4c58b6ad4e21038d713c1fae31a6146ff5Daniel Dunbar Args.MakeArgString(getToolChain().GetProgramPath(C, "ld")); 2368daab7b1016f0a82fefa4f7be6e63c57c06b19ffcDaniel Dunbar Dest.addCommand(new Command(JA, *this, Exec, CmdArgs)); 236902633b541b04ad5ffc1c70f4c2feeeb13e607057Daniel Dunbar 23700b46e1b5389615a8d6641f4d7bf5415d29acfef3Daniel Dunbar // Find the first non-empty base input (we want to ignore linker 23710b46e1b5389615a8d6641f4d7bf5415d29acfef3Daniel Dunbar // inputs). 23720b46e1b5389615a8d6641f4d7bf5415d29acfef3Daniel Dunbar const char *BaseInput = ""; 23730b46e1b5389615a8d6641f4d7bf5415d29acfef3Daniel Dunbar for (unsigned i = 0, e = Inputs.size(); i != e; ++i) { 23740b46e1b5389615a8d6641f4d7bf5415d29acfef3Daniel Dunbar if (Inputs[i].getBaseInput()[0] != '\0') { 23750b46e1b5389615a8d6641f4d7bf5415d29acfef3Daniel Dunbar BaseInput = Inputs[i].getBaseInput(); 23760b46e1b5389615a8d6641f4d7bf5415d29acfef3Daniel Dunbar break; 23770b46e1b5389615a8d6641f4d7bf5415d29acfef3Daniel Dunbar } 23780b46e1b5389615a8d6641f4d7bf5415d29acfef3Daniel Dunbar } 2379c21c485b4fb58ef5d55cf3e523263dd824a2ace4Daniel Dunbar 23803ed294522653323e4867a2eba03acc98a99e5479Daniel Dunbar // Run dsymutil if we are making an executable in a single step. 23813ed294522653323e4867a2eba03acc98a99e5479Daniel Dunbar // 23823ed294522653323e4867a2eba03acc98a99e5479Daniel Dunbar // FIXME: Currently we don't want to do this when we are part of a 23833ed294522653323e4867a2eba03acc98a99e5479Daniel Dunbar // universal build step, as this would end up creating stray temp 23843ed294522653323e4867a2eba03acc98a99e5479Daniel Dunbar // files. 23853ed294522653323e4867a2eba03acc98a99e5479Daniel Dunbar if (!LinkingOutput && 23863ed294522653323e4867a2eba03acc98a99e5479Daniel Dunbar Args.getLastArg(options::OPT_g_Group) && 238702633b541b04ad5ffc1c70f4c2feeeb13e607057Daniel Dunbar !Args.getLastArg(options::OPT_gstabs) && 238802633b541b04ad5ffc1c70f4c2feeeb13e607057Daniel Dunbar !Args.getLastArg(options::OPT_g0)) { 238902633b541b04ad5ffc1c70f4c2feeeb13e607057Daniel Dunbar // FIXME: This is gross, but matches gcc. The test only considers 239002633b541b04ad5ffc1c70f4c2feeeb13e607057Daniel Dunbar // the suffix (not the -x type), and then only of the first 23910b46e1b5389615a8d6641f4d7bf5415d29acfef3Daniel Dunbar // source input. Awesome. 23920b46e1b5389615a8d6641f4d7bf5415d29acfef3Daniel Dunbar const char *Suffix = strrchr(BaseInput, '.'); 239302633b541b04ad5ffc1c70f4c2feeeb13e607057Daniel Dunbar if (Suffix && isSourceSuffix(Suffix + 1)) { 2394c21c485b4fb58ef5d55cf3e523263dd824a2ace4Daniel Dunbar const char *Exec = 23955ed34f4c58b6ad4e21038d713c1fae31a6146ff5Daniel Dunbar Args.MakeArgString(getToolChain().GetProgramPath(C, "dsymutil")); 239602633b541b04ad5ffc1c70f4c2feeeb13e607057Daniel Dunbar ArgStringList CmdArgs; 239702633b541b04ad5ffc1c70f4c2feeeb13e607057Daniel Dunbar CmdArgs.push_back(Output.getFilename()); 2398daab7b1016f0a82fefa4f7be6e63c57c06b19ffcDaniel Dunbar C.getJobs().addCommand(new Command(JA, *this, Exec, CmdArgs)); 239902633b541b04ad5ffc1c70f4c2feeeb13e607057Daniel Dunbar } 240002633b541b04ad5ffc1c70f4c2feeeb13e607057Daniel Dunbar } 240102633b541b04ad5ffc1c70f4c2feeeb13e607057Daniel Dunbar} 240202633b541b04ad5ffc1c70f4c2feeeb13e607057Daniel Dunbar 2403ff7488dc9a766f94daf54d81b03ab9160d0bfd88Daniel Dunbarvoid darwin::Lipo::ConstructJob(Compilation &C, const JobAction &JA, 2404c21c485b4fb58ef5d55cf3e523263dd824a2ace4Daniel Dunbar Job &Dest, const InputInfo &Output, 2405c21c485b4fb58ef5d55cf3e523263dd824a2ace4Daniel Dunbar const InputInfoList &Inputs, 2406c21c485b4fb58ef5d55cf3e523263dd824a2ace4Daniel Dunbar const ArgList &Args, 2407ff7488dc9a766f94daf54d81b03ab9160d0bfd88Daniel Dunbar const char *LinkingOutput) const { 2408ff7488dc9a766f94daf54d81b03ab9160d0bfd88Daniel Dunbar ArgStringList CmdArgs; 2409ff7488dc9a766f94daf54d81b03ab9160d0bfd88Daniel Dunbar 2410ff7488dc9a766f94daf54d81b03ab9160d0bfd88Daniel Dunbar CmdArgs.push_back("-create"); 2411ff7488dc9a766f94daf54d81b03ab9160d0bfd88Daniel Dunbar assert(Output.isFilename() && "Unexpected lipo output."); 2412a428df828ea4cc6916ea90dcd9fbbc840776d207Daniel Dunbar 2413a428df828ea4cc6916ea90dcd9fbbc840776d207Daniel Dunbar CmdArgs.push_back("-output"); 2414ff7488dc9a766f94daf54d81b03ab9160d0bfd88Daniel Dunbar CmdArgs.push_back(Output.getFilename()); 2415a428df828ea4cc6916ea90dcd9fbbc840776d207Daniel Dunbar 2416ff7488dc9a766f94daf54d81b03ab9160d0bfd88Daniel Dunbar for (InputInfoList::const_iterator 2417ff7488dc9a766f94daf54d81b03ab9160d0bfd88Daniel Dunbar it = Inputs.begin(), ie = Inputs.end(); it != ie; ++it) { 2418ff7488dc9a766f94daf54d81b03ab9160d0bfd88Daniel Dunbar const InputInfo &II = *it; 2419ff7488dc9a766f94daf54d81b03ab9160d0bfd88Daniel Dunbar assert(II.isFilename() && "Unexpected lipo input."); 2420ff7488dc9a766f94daf54d81b03ab9160d0bfd88Daniel Dunbar CmdArgs.push_back(II.getFilename()); 2421ff7488dc9a766f94daf54d81b03ab9160d0bfd88Daniel Dunbar } 2422c21c485b4fb58ef5d55cf3e523263dd824a2ace4Daniel Dunbar const char *Exec = 24235ed34f4c58b6ad4e21038d713c1fae31a6146ff5Daniel Dunbar Args.MakeArgString(getToolChain().GetProgramPath(C, "lipo")); 2424daab7b1016f0a82fefa4f7be6e63c57c06b19ffcDaniel Dunbar Dest.addCommand(new Command(JA, *this, Exec, CmdArgs)); 2425ff7488dc9a766f94daf54d81b03ab9160d0bfd88Daniel Dunbar} 242668a31d406c6dc4382c700d1199b062de2aa7e1daDaniel Dunbar 2427e7925a075f110ab21afeae084670a155dea568e3Edward O'Callaghanvoid auroraux::Assemble::ConstructJob(Compilation &C, const JobAction &JA, 2428294691eb1caf551083acd7b08630ef21c3fd760dDaniel Dunbar Job &Dest, const InputInfo &Output, 2429294691eb1caf551083acd7b08630ef21c3fd760dDaniel Dunbar const InputInfoList &Inputs, 2430294691eb1caf551083acd7b08630ef21c3fd760dDaniel Dunbar const ArgList &Args, 2431294691eb1caf551083acd7b08630ef21c3fd760dDaniel Dunbar const char *LinkingOutput) const { 2432e7925a075f110ab21afeae084670a155dea568e3Edward O'Callaghan ArgStringList CmdArgs; 2433e7925a075f110ab21afeae084670a155dea568e3Edward O'Callaghan 2434e7925a075f110ab21afeae084670a155dea568e3Edward O'Callaghan Args.AddAllArgValues(CmdArgs, options::OPT_Wa_COMMA, 2435e7925a075f110ab21afeae084670a155dea568e3Edward O'Callaghan options::OPT_Xassembler); 2436e7925a075f110ab21afeae084670a155dea568e3Edward O'Callaghan 2437e7925a075f110ab21afeae084670a155dea568e3Edward O'Callaghan CmdArgs.push_back("-o"); 2438e7925a075f110ab21afeae084670a155dea568e3Edward O'Callaghan if (Output.isPipe()) 2439e7925a075f110ab21afeae084670a155dea568e3Edward O'Callaghan CmdArgs.push_back("-"); 2440e7925a075f110ab21afeae084670a155dea568e3Edward O'Callaghan else 2441e7925a075f110ab21afeae084670a155dea568e3Edward O'Callaghan CmdArgs.push_back(Output.getFilename()); 2442e7925a075f110ab21afeae084670a155dea568e3Edward O'Callaghan 2443e7925a075f110ab21afeae084670a155dea568e3Edward O'Callaghan for (InputInfoList::const_iterator 2444e7925a075f110ab21afeae084670a155dea568e3Edward O'Callaghan it = Inputs.begin(), ie = Inputs.end(); it != ie; ++it) { 2445e7925a075f110ab21afeae084670a155dea568e3Edward O'Callaghan const InputInfo &II = *it; 2446e7925a075f110ab21afeae084670a155dea568e3Edward O'Callaghan if (II.isPipe()) 2447e7925a075f110ab21afeae084670a155dea568e3Edward O'Callaghan CmdArgs.push_back("-"); 2448e7925a075f110ab21afeae084670a155dea568e3Edward O'Callaghan else 2449e7925a075f110ab21afeae084670a155dea568e3Edward O'Callaghan CmdArgs.push_back(II.getFilename()); 2450e7925a075f110ab21afeae084670a155dea568e3Edward O'Callaghan } 2451e7925a075f110ab21afeae084670a155dea568e3Edward O'Callaghan 2452e7925a075f110ab21afeae084670a155dea568e3Edward O'Callaghan const char *Exec = 2453ff430e6d68d1bea07046adafa28a52b314eeaa88Edward O'Callaghan Args.MakeArgString(getToolChain().GetProgramPath(C, "gas")); 2454daab7b1016f0a82fefa4f7be6e63c57c06b19ffcDaniel Dunbar Dest.addCommand(new Command(JA, *this, Exec, CmdArgs)); 2455e7925a075f110ab21afeae084670a155dea568e3Edward O'Callaghan} 2456e7925a075f110ab21afeae084670a155dea568e3Edward O'Callaghan 2457e7925a075f110ab21afeae084670a155dea568e3Edward O'Callaghanvoid auroraux::Link::ConstructJob(Compilation &C, const JobAction &JA, 2458294691eb1caf551083acd7b08630ef21c3fd760dDaniel Dunbar Job &Dest, const InputInfo &Output, 2459294691eb1caf551083acd7b08630ef21c3fd760dDaniel Dunbar const InputInfoList &Inputs, 2460294691eb1caf551083acd7b08630ef21c3fd760dDaniel Dunbar const ArgList &Args, 2461294691eb1caf551083acd7b08630ef21c3fd760dDaniel Dunbar const char *LinkingOutput) const { 2462ee788e70fcd0adf76103b17c78ac658d4ea30c9bDaniel Dunbar const Driver &D = getToolChain().getDriver(); 2463e7925a075f110ab21afeae084670a155dea568e3Edward O'Callaghan ArgStringList CmdArgs; 2464e7925a075f110ab21afeae084670a155dea568e3Edward O'Callaghan 2465e7925a075f110ab21afeae084670a155dea568e3Edward O'Callaghan if ((!Args.hasArg(options::OPT_nostdlib)) && 2466294691eb1caf551083acd7b08630ef21c3fd760dDaniel Dunbar (!Args.hasArg(options::OPT_shared))) { 2467e7925a075f110ab21afeae084670a155dea568e3Edward O'Callaghan CmdArgs.push_back("-e"); 24687adf94906e23eae295a006659c55eab9ffcf8b37Edward O'Callaghan CmdArgs.push_back("_start"); 2469e7925a075f110ab21afeae084670a155dea568e3Edward O'Callaghan } 2470e7925a075f110ab21afeae084670a155dea568e3Edward O'Callaghan 2471e7925a075f110ab21afeae084670a155dea568e3Edward O'Callaghan if (Args.hasArg(options::OPT_static)) { 2472e7925a075f110ab21afeae084670a155dea568e3Edward O'Callaghan CmdArgs.push_back("-Bstatic"); 24737adf94906e23eae295a006659c55eab9ffcf8b37Edward O'Callaghan CmdArgs.push_back("-dn"); 2474e7925a075f110ab21afeae084670a155dea568e3Edward O'Callaghan } else { 24757adf94906e23eae295a006659c55eab9ffcf8b37Edward O'Callaghan// CmdArgs.push_back("--eh-frame-hdr"); 2476e7925a075f110ab21afeae084670a155dea568e3Edward O'Callaghan CmdArgs.push_back("-Bdynamic"); 2477e7925a075f110ab21afeae084670a155dea568e3Edward O'Callaghan if (Args.hasArg(options::OPT_shared)) { 2478e7925a075f110ab21afeae084670a155dea568e3Edward O'Callaghan CmdArgs.push_back("-shared"); 2479e7925a075f110ab21afeae084670a155dea568e3Edward O'Callaghan } else { 24803cecc19f606ba1000da885b8ff4c089abad224ddEdward O'Callaghan CmdArgs.push_back("--dynamic-linker"); 2481e7925a075f110ab21afeae084670a155dea568e3Edward O'Callaghan CmdArgs.push_back("/lib/ld.so.1"); // 64Bit Path /lib/amd64/ld.so.1 2482e7925a075f110ab21afeae084670a155dea568e3Edward O'Callaghan } 2483e7925a075f110ab21afeae084670a155dea568e3Edward O'Callaghan } 2484e7925a075f110ab21afeae084670a155dea568e3Edward O'Callaghan 2485e7925a075f110ab21afeae084670a155dea568e3Edward O'Callaghan if (Output.isPipe()) { 2486e7925a075f110ab21afeae084670a155dea568e3Edward O'Callaghan CmdArgs.push_back("-o"); 2487e7925a075f110ab21afeae084670a155dea568e3Edward O'Callaghan CmdArgs.push_back("-"); 2488e7925a075f110ab21afeae084670a155dea568e3Edward O'Callaghan } else if (Output.isFilename()) { 2489e7925a075f110ab21afeae084670a155dea568e3Edward O'Callaghan CmdArgs.push_back("-o"); 2490e7925a075f110ab21afeae084670a155dea568e3Edward O'Callaghan CmdArgs.push_back(Output.getFilename()); 2491e7925a075f110ab21afeae084670a155dea568e3Edward O'Callaghan } else { 2492e7925a075f110ab21afeae084670a155dea568e3Edward O'Callaghan assert(Output.isNothing() && "Invalid output."); 2493e7925a075f110ab21afeae084670a155dea568e3Edward O'Callaghan } 2494e7925a075f110ab21afeae084670a155dea568e3Edward O'Callaghan 2495e7925a075f110ab21afeae084670a155dea568e3Edward O'Callaghan if (!Args.hasArg(options::OPT_nostdlib) && 2496e7925a075f110ab21afeae084670a155dea568e3Edward O'Callaghan !Args.hasArg(options::OPT_nostartfiles)) { 2497e7925a075f110ab21afeae084670a155dea568e3Edward O'Callaghan if (!Args.hasArg(options::OPT_shared)) { 24987adf94906e23eae295a006659c55eab9ffcf8b37Edward O'Callaghan CmdArgs.push_back(Args.MakeArgString(getToolChain().GetFilePath(C, "crt1.o"))); 24997adf94906e23eae295a006659c55eab9ffcf8b37Edward O'Callaghan CmdArgs.push_back(Args.MakeArgString(getToolChain().GetFilePath(C, "crti.o"))); 25005ed34f4c58b6ad4e21038d713c1fae31a6146ff5Daniel Dunbar CmdArgs.push_back(Args.MakeArgString(getToolChain().GetFilePath(C, "crtbegin.o"))); 2501e7925a075f110ab21afeae084670a155dea568e3Edward O'Callaghan } else { 25027adf94906e23eae295a006659c55eab9ffcf8b37Edward O'Callaghan CmdArgs.push_back(Args.MakeArgString(getToolChain().GetFilePath(C, "crti.o"))); 2503e7925a075f110ab21afeae084670a155dea568e3Edward O'Callaghan } 25047adf94906e23eae295a006659c55eab9ffcf8b37Edward O'Callaghan CmdArgs.push_back(Args.MakeArgString(getToolChain().GetFilePath(C, "crtn.o"))); 2505e7925a075f110ab21afeae084670a155dea568e3Edward O'Callaghan } 2506e7925a075f110ab21afeae084670a155dea568e3Edward O'Callaghan 2507294691eb1caf551083acd7b08630ef21c3fd760dDaniel Dunbar CmdArgs.push_back(Args.MakeArgString("-L/opt/gcc4/lib/gcc/" 2508294691eb1caf551083acd7b08630ef21c3fd760dDaniel Dunbar + getToolChain().getTripleString() 2509f7fb31f4751c9c5ac3d9f93c19ec05a74dd9546fDaniel Dunbar + "/4.2.4")); 2510e7925a075f110ab21afeae084670a155dea568e3Edward O'Callaghan 2511e7925a075f110ab21afeae084670a155dea568e3Edward O'Callaghan Args.AddAllArgs(CmdArgs, options::OPT_L); 2512e7925a075f110ab21afeae084670a155dea568e3Edward O'Callaghan Args.AddAllArgs(CmdArgs, options::OPT_T_Group); 2513e7925a075f110ab21afeae084670a155dea568e3Edward O'Callaghan Args.AddAllArgs(CmdArgs, options::OPT_e); 2514e7925a075f110ab21afeae084670a155dea568e3Edward O'Callaghan 2515e7925a075f110ab21afeae084670a155dea568e3Edward O'Callaghan for (InputInfoList::const_iterator 2516e7925a075f110ab21afeae084670a155dea568e3Edward O'Callaghan it = Inputs.begin(), ie = Inputs.end(); it != ie; ++it) { 2517e7925a075f110ab21afeae084670a155dea568e3Edward O'Callaghan const InputInfo &II = *it; 2518e7925a075f110ab21afeae084670a155dea568e3Edward O'Callaghan 2519e7925a075f110ab21afeae084670a155dea568e3Edward O'Callaghan // Don't try to pass LLVM inputs to a generic gcc. 2520e7925a075f110ab21afeae084670a155dea568e3Edward O'Callaghan if (II.getType() == types::TY_LLVMBC) 2521e7925a075f110ab21afeae084670a155dea568e3Edward O'Callaghan D.Diag(clang::diag::err_drv_no_linker_llvm_support) 2522881376467c46c5c6cc16fa6790271c2c22e1d4f1Daniel Dunbar << getToolChain().getTripleString(); 2523e7925a075f110ab21afeae084670a155dea568e3Edward O'Callaghan 2524e7925a075f110ab21afeae084670a155dea568e3Edward O'Callaghan if (II.isPipe()) 2525e7925a075f110ab21afeae084670a155dea568e3Edward O'Callaghan CmdArgs.push_back("-"); 2526e7925a075f110ab21afeae084670a155dea568e3Edward O'Callaghan else if (II.isFilename()) 2527e7925a075f110ab21afeae084670a155dea568e3Edward O'Callaghan CmdArgs.push_back(II.getFilename()); 2528e7925a075f110ab21afeae084670a155dea568e3Edward O'Callaghan else 2529e7925a075f110ab21afeae084670a155dea568e3Edward O'Callaghan II.getInputArg().renderAsInput(Args, CmdArgs); 2530e7925a075f110ab21afeae084670a155dea568e3Edward O'Callaghan } 2531e7925a075f110ab21afeae084670a155dea568e3Edward O'Callaghan 2532e7925a075f110ab21afeae084670a155dea568e3Edward O'Callaghan if (!Args.hasArg(options::OPT_nostdlib) && 2533e7925a075f110ab21afeae084670a155dea568e3Edward O'Callaghan !Args.hasArg(options::OPT_nodefaultlibs)) { 2534e7925a075f110ab21afeae084670a155dea568e3Edward O'Callaghan // FIXME: For some reason GCC passes -lgcc before adding 2535e7925a075f110ab21afeae084670a155dea568e3Edward O'Callaghan // the default system libraries. Just mimic this for now. 2536e7925a075f110ab21afeae084670a155dea568e3Edward O'Callaghan CmdArgs.push_back("-lgcc"); 2537e7925a075f110ab21afeae084670a155dea568e3Edward O'Callaghan 2538e7925a075f110ab21afeae084670a155dea568e3Edward O'Callaghan if (Args.hasArg(options::OPT_pthread)) 2539e7925a075f110ab21afeae084670a155dea568e3Edward O'Callaghan CmdArgs.push_back("-pthread"); 2540e7925a075f110ab21afeae084670a155dea568e3Edward O'Callaghan if (!Args.hasArg(options::OPT_shared)) 2541e7925a075f110ab21afeae084670a155dea568e3Edward O'Callaghan CmdArgs.push_back("-lc"); 2542e7925a075f110ab21afeae084670a155dea568e3Edward O'Callaghan CmdArgs.push_back("-lgcc"); 2543e7925a075f110ab21afeae084670a155dea568e3Edward O'Callaghan } 2544e7925a075f110ab21afeae084670a155dea568e3Edward O'Callaghan 2545e7925a075f110ab21afeae084670a155dea568e3Edward O'Callaghan if (!Args.hasArg(options::OPT_nostdlib) && 2546e7925a075f110ab21afeae084670a155dea568e3Edward O'Callaghan !Args.hasArg(options::OPT_nostartfiles)) { 2547e7925a075f110ab21afeae084670a155dea568e3Edward O'Callaghan if (!Args.hasArg(options::OPT_shared)) 25485ed34f4c58b6ad4e21038d713c1fae31a6146ff5Daniel Dunbar CmdArgs.push_back(Args.MakeArgString(getToolChain().GetFilePath(C, "crtend.o"))); 25497adf94906e23eae295a006659c55eab9ffcf8b37Edward O'Callaghan// else 25507adf94906e23eae295a006659c55eab9ffcf8b37Edward O'Callaghan// CmdArgs.push_back(Args.MakeArgString(getToolChain().GetFilePath(C, "crtendS.o"))); 2551e7925a075f110ab21afeae084670a155dea568e3Edward O'Callaghan } 2552e7925a075f110ab21afeae084670a155dea568e3Edward O'Callaghan 2553e7925a075f110ab21afeae084670a155dea568e3Edward O'Callaghan const char *Exec = 25545ed34f4c58b6ad4e21038d713c1fae31a6146ff5Daniel Dunbar Args.MakeArgString(getToolChain().GetProgramPath(C, "ld")); 2555daab7b1016f0a82fefa4f7be6e63c57c06b19ffcDaniel Dunbar Dest.addCommand(new Command(JA, *this, Exec, CmdArgs)); 2556e7925a075f110ab21afeae084670a155dea568e3Edward O'Callaghan} 2557e7925a075f110ab21afeae084670a155dea568e3Edward O'Callaghan 2558f7b8eec37c8c8012fa525c71fb29a58c9f29beefDaniel Dunbarvoid openbsd::Assemble::ConstructJob(Compilation &C, const JobAction &JA, 2559f7b8eec37c8c8012fa525c71fb29a58c9f29beefDaniel Dunbar Job &Dest, const InputInfo &Output, 2560f7b8eec37c8c8012fa525c71fb29a58c9f29beefDaniel Dunbar const InputInfoList &Inputs, 2561f7b8eec37c8c8012fa525c71fb29a58c9f29beefDaniel Dunbar const ArgList &Args, 25621eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump const char *LinkingOutput) const { 2563f7b8eec37c8c8012fa525c71fb29a58c9f29beefDaniel Dunbar ArgStringList CmdArgs; 2564f7b8eec37c8c8012fa525c71fb29a58c9f29beefDaniel Dunbar 2565f7b8eec37c8c8012fa525c71fb29a58c9f29beefDaniel Dunbar Args.AddAllArgValues(CmdArgs, options::OPT_Wa_COMMA, 2566f7b8eec37c8c8012fa525c71fb29a58c9f29beefDaniel Dunbar options::OPT_Xassembler); 2567f7b8eec37c8c8012fa525c71fb29a58c9f29beefDaniel Dunbar 2568f7b8eec37c8c8012fa525c71fb29a58c9f29beefDaniel Dunbar CmdArgs.push_back("-o"); 2569f7b8eec37c8c8012fa525c71fb29a58c9f29beefDaniel Dunbar if (Output.isPipe()) 2570f7b8eec37c8c8012fa525c71fb29a58c9f29beefDaniel Dunbar CmdArgs.push_back("-"); 2571f7b8eec37c8c8012fa525c71fb29a58c9f29beefDaniel Dunbar else 2572f7b8eec37c8c8012fa525c71fb29a58c9f29beefDaniel Dunbar CmdArgs.push_back(Output.getFilename()); 2573f7b8eec37c8c8012fa525c71fb29a58c9f29beefDaniel Dunbar 2574f7b8eec37c8c8012fa525c71fb29a58c9f29beefDaniel Dunbar for (InputInfoList::const_iterator 2575f7b8eec37c8c8012fa525c71fb29a58c9f29beefDaniel Dunbar it = Inputs.begin(), ie = Inputs.end(); it != ie; ++it) { 2576f7b8eec37c8c8012fa525c71fb29a58c9f29beefDaniel Dunbar const InputInfo &II = *it; 2577f7b8eec37c8c8012fa525c71fb29a58c9f29beefDaniel Dunbar if (II.isPipe()) 2578f7b8eec37c8c8012fa525c71fb29a58c9f29beefDaniel Dunbar CmdArgs.push_back("-"); 2579f7b8eec37c8c8012fa525c71fb29a58c9f29beefDaniel Dunbar else 2580f7b8eec37c8c8012fa525c71fb29a58c9f29beefDaniel Dunbar CmdArgs.push_back(II.getFilename()); 2581f7b8eec37c8c8012fa525c71fb29a58c9f29beefDaniel Dunbar } 2582f7b8eec37c8c8012fa525c71fb29a58c9f29beefDaniel Dunbar 2583f7b8eec37c8c8012fa525c71fb29a58c9f29beefDaniel Dunbar const char *Exec = 25845ed34f4c58b6ad4e21038d713c1fae31a6146ff5Daniel Dunbar Args.MakeArgString(getToolChain().GetProgramPath(C, "as")); 2585daab7b1016f0a82fefa4f7be6e63c57c06b19ffcDaniel Dunbar Dest.addCommand(new Command(JA, *this, Exec, CmdArgs)); 2586f7b8eec37c8c8012fa525c71fb29a58c9f29beefDaniel Dunbar} 2587f7b8eec37c8c8012fa525c71fb29a58c9f29beefDaniel Dunbar 2588f7b8eec37c8c8012fa525c71fb29a58c9f29beefDaniel Dunbarvoid openbsd::Link::ConstructJob(Compilation &C, const JobAction &JA, 2589f7b8eec37c8c8012fa525c71fb29a58c9f29beefDaniel Dunbar Job &Dest, const InputInfo &Output, 2590f7b8eec37c8c8012fa525c71fb29a58c9f29beefDaniel Dunbar const InputInfoList &Inputs, 2591f7b8eec37c8c8012fa525c71fb29a58c9f29beefDaniel Dunbar const ArgList &Args, 2592f7b8eec37c8c8012fa525c71fb29a58c9f29beefDaniel Dunbar const char *LinkingOutput) const { 2593ee788e70fcd0adf76103b17c78ac658d4ea30c9bDaniel Dunbar const Driver &D = getToolChain().getDriver(); 2594f7b8eec37c8c8012fa525c71fb29a58c9f29beefDaniel Dunbar ArgStringList CmdArgs; 2595f7b8eec37c8c8012fa525c71fb29a58c9f29beefDaniel Dunbar 25962bbcf669742b6b27748414e22f8042236fceef65Daniel Dunbar if ((!Args.hasArg(options::OPT_nostdlib)) && 2597294691eb1caf551083acd7b08630ef21c3fd760dDaniel Dunbar (!Args.hasArg(options::OPT_shared))) { 25982bbcf669742b6b27748414e22f8042236fceef65Daniel Dunbar CmdArgs.push_back("-e"); 25992bbcf669742b6b27748414e22f8042236fceef65Daniel Dunbar CmdArgs.push_back("__start"); 26002bbcf669742b6b27748414e22f8042236fceef65Daniel Dunbar } 26012bbcf669742b6b27748414e22f8042236fceef65Daniel Dunbar 2602f7b8eec37c8c8012fa525c71fb29a58c9f29beefDaniel Dunbar if (Args.hasArg(options::OPT_static)) { 2603f7b8eec37c8c8012fa525c71fb29a58c9f29beefDaniel Dunbar CmdArgs.push_back("-Bstatic"); 2604f7b8eec37c8c8012fa525c71fb29a58c9f29beefDaniel Dunbar } else { 2605f7b8eec37c8c8012fa525c71fb29a58c9f29beefDaniel Dunbar CmdArgs.push_back("--eh-frame-hdr"); 26062bbcf669742b6b27748414e22f8042236fceef65Daniel Dunbar CmdArgs.push_back("-Bdynamic"); 2607f7b8eec37c8c8012fa525c71fb29a58c9f29beefDaniel Dunbar if (Args.hasArg(options::OPT_shared)) { 26082bbcf669742b6b27748414e22f8042236fceef65Daniel Dunbar CmdArgs.push_back("-shared"); 2609f7b8eec37c8c8012fa525c71fb29a58c9f29beefDaniel Dunbar } else { 2610f7b8eec37c8c8012fa525c71fb29a58c9f29beefDaniel Dunbar CmdArgs.push_back("-dynamic-linker"); 2611f7b8eec37c8c8012fa525c71fb29a58c9f29beefDaniel Dunbar CmdArgs.push_back("/usr/libexec/ld.so"); 2612f7b8eec37c8c8012fa525c71fb29a58c9f29beefDaniel Dunbar } 2613f7b8eec37c8c8012fa525c71fb29a58c9f29beefDaniel Dunbar } 2614f7b8eec37c8c8012fa525c71fb29a58c9f29beefDaniel Dunbar 2615f7b8eec37c8c8012fa525c71fb29a58c9f29beefDaniel Dunbar if (Output.isPipe()) { 2616f7b8eec37c8c8012fa525c71fb29a58c9f29beefDaniel Dunbar CmdArgs.push_back("-o"); 2617f7b8eec37c8c8012fa525c71fb29a58c9f29beefDaniel Dunbar CmdArgs.push_back("-"); 2618f7b8eec37c8c8012fa525c71fb29a58c9f29beefDaniel Dunbar } else if (Output.isFilename()) { 2619f7b8eec37c8c8012fa525c71fb29a58c9f29beefDaniel Dunbar CmdArgs.push_back("-o"); 2620f7b8eec37c8c8012fa525c71fb29a58c9f29beefDaniel Dunbar CmdArgs.push_back(Output.getFilename()); 2621f7b8eec37c8c8012fa525c71fb29a58c9f29beefDaniel Dunbar } else { 2622f7b8eec37c8c8012fa525c71fb29a58c9f29beefDaniel Dunbar assert(Output.isNothing() && "Invalid output."); 2623f7b8eec37c8c8012fa525c71fb29a58c9f29beefDaniel Dunbar } 2624f7b8eec37c8c8012fa525c71fb29a58c9f29beefDaniel Dunbar 2625f7b8eec37c8c8012fa525c71fb29a58c9f29beefDaniel Dunbar if (!Args.hasArg(options::OPT_nostdlib) && 2626f7b8eec37c8c8012fa525c71fb29a58c9f29beefDaniel Dunbar !Args.hasArg(options::OPT_nostartfiles)) { 2627f7b8eec37c8c8012fa525c71fb29a58c9f29beefDaniel Dunbar if (!Args.hasArg(options::OPT_shared)) { 26285ed34f4c58b6ad4e21038d713c1fae31a6146ff5Daniel Dunbar CmdArgs.push_back(Args.MakeArgString(getToolChain().GetFilePath(C, "crt0.o"))); 26295ed34f4c58b6ad4e21038d713c1fae31a6146ff5Daniel Dunbar CmdArgs.push_back(Args.MakeArgString(getToolChain().GetFilePath(C, "crtbegin.o"))); 2630f7b8eec37c8c8012fa525c71fb29a58c9f29beefDaniel Dunbar } else { 26315ed34f4c58b6ad4e21038d713c1fae31a6146ff5Daniel Dunbar CmdArgs.push_back(Args.MakeArgString(getToolChain().GetFilePath(C, "crtbeginS.o"))); 2632f7b8eec37c8c8012fa525c71fb29a58c9f29beefDaniel Dunbar } 2633f7b8eec37c8c8012fa525c71fb29a58c9f29beefDaniel Dunbar } 2634f7b8eec37c8c8012fa525c71fb29a58c9f29beefDaniel Dunbar 2635e7e18200e614a5e619602a088544c85ac8305a1fEdward O'Callaghan std::string Triple = getToolChain().getTripleString(); 2636e7e18200e614a5e619602a088544c85ac8305a1fEdward O'Callaghan if (Triple.substr(0, 6) == "x86_64") 2637294691eb1caf551083acd7b08630ef21c3fd760dDaniel Dunbar Triple.replace(0, 6, "amd64"); 2638f7fb31f4751c9c5ac3d9f93c19ec05a74dd9546fDaniel Dunbar CmdArgs.push_back(Args.MakeArgString("-L/usr/lib/gcc-lib/" + Triple + 2639f7fb31f4751c9c5ac3d9f93c19ec05a74dd9546fDaniel Dunbar "/3.3.5")); 26402bbcf669742b6b27748414e22f8042236fceef65Daniel Dunbar 2641f7b8eec37c8c8012fa525c71fb29a58c9f29beefDaniel Dunbar Args.AddAllArgs(CmdArgs, options::OPT_L); 2642f7b8eec37c8c8012fa525c71fb29a58c9f29beefDaniel Dunbar Args.AddAllArgs(CmdArgs, options::OPT_T_Group); 2643f7b8eec37c8c8012fa525c71fb29a58c9f29beefDaniel Dunbar Args.AddAllArgs(CmdArgs, options::OPT_e); 2644f7b8eec37c8c8012fa525c71fb29a58c9f29beefDaniel Dunbar 2645f7b8eec37c8c8012fa525c71fb29a58c9f29beefDaniel Dunbar for (InputInfoList::const_iterator 2646f7b8eec37c8c8012fa525c71fb29a58c9f29beefDaniel Dunbar it = Inputs.begin(), ie = Inputs.end(); it != ie; ++it) { 2647f7b8eec37c8c8012fa525c71fb29a58c9f29beefDaniel Dunbar const InputInfo &II = *it; 2648f7b8eec37c8c8012fa525c71fb29a58c9f29beefDaniel Dunbar 2649f7b8eec37c8c8012fa525c71fb29a58c9f29beefDaniel Dunbar // Don't try to pass LLVM inputs to a generic gcc. 2650f7b8eec37c8c8012fa525c71fb29a58c9f29beefDaniel Dunbar if (II.getType() == types::TY_LLVMBC) 2651f7b8eec37c8c8012fa525c71fb29a58c9f29beefDaniel Dunbar D.Diag(clang::diag::err_drv_no_linker_llvm_support) 2652881376467c46c5c6cc16fa6790271c2c22e1d4f1Daniel Dunbar << getToolChain().getTripleString(); 2653f7b8eec37c8c8012fa525c71fb29a58c9f29beefDaniel Dunbar 2654f7b8eec37c8c8012fa525c71fb29a58c9f29beefDaniel Dunbar if (II.isPipe()) 2655f7b8eec37c8c8012fa525c71fb29a58c9f29beefDaniel Dunbar CmdArgs.push_back("-"); 2656f7b8eec37c8c8012fa525c71fb29a58c9f29beefDaniel Dunbar else if (II.isFilename()) 2657f7b8eec37c8c8012fa525c71fb29a58c9f29beefDaniel Dunbar CmdArgs.push_back(II.getFilename()); 2658f7b8eec37c8c8012fa525c71fb29a58c9f29beefDaniel Dunbar else 2659f7b8eec37c8c8012fa525c71fb29a58c9f29beefDaniel Dunbar II.getInputArg().renderAsInput(Args, CmdArgs); 2660f7b8eec37c8c8012fa525c71fb29a58c9f29beefDaniel Dunbar } 2661f7b8eec37c8c8012fa525c71fb29a58c9f29beefDaniel Dunbar 2662f7b8eec37c8c8012fa525c71fb29a58c9f29beefDaniel Dunbar if (!Args.hasArg(options::OPT_nostdlib) && 2663f7b8eec37c8c8012fa525c71fb29a58c9f29beefDaniel Dunbar !Args.hasArg(options::OPT_nodefaultlibs)) { 26642bbcf669742b6b27748414e22f8042236fceef65Daniel Dunbar // FIXME: For some reason GCC passes -lgcc before adding 26652bbcf669742b6b27748414e22f8042236fceef65Daniel Dunbar // the default system libraries. Just mimic this for now. 26662bbcf669742b6b27748414e22f8042236fceef65Daniel Dunbar CmdArgs.push_back("-lgcc"); 2667f7b8eec37c8c8012fa525c71fb29a58c9f29beefDaniel Dunbar 2668f7b8eec37c8c8012fa525c71fb29a58c9f29beefDaniel Dunbar if (Args.hasArg(options::OPT_pthread)) 2669f7b8eec37c8c8012fa525c71fb29a58c9f29beefDaniel Dunbar CmdArgs.push_back("-pthread"); 26702bbcf669742b6b27748414e22f8042236fceef65Daniel Dunbar if (!Args.hasArg(options::OPT_shared)) 26712bbcf669742b6b27748414e22f8042236fceef65Daniel Dunbar CmdArgs.push_back("-lc"); 26722bbcf669742b6b27748414e22f8042236fceef65Daniel Dunbar CmdArgs.push_back("-lgcc"); 2673f7b8eec37c8c8012fa525c71fb29a58c9f29beefDaniel Dunbar } 2674f7b8eec37c8c8012fa525c71fb29a58c9f29beefDaniel Dunbar 2675f7b8eec37c8c8012fa525c71fb29a58c9f29beefDaniel Dunbar if (!Args.hasArg(options::OPT_nostdlib) && 2676f7b8eec37c8c8012fa525c71fb29a58c9f29beefDaniel Dunbar !Args.hasArg(options::OPT_nostartfiles)) { 2677f7b8eec37c8c8012fa525c71fb29a58c9f29beefDaniel Dunbar if (!Args.hasArg(options::OPT_shared)) 26785ed34f4c58b6ad4e21038d713c1fae31a6146ff5Daniel Dunbar CmdArgs.push_back(Args.MakeArgString(getToolChain().GetFilePath(C, "crtend.o"))); 2679f7b8eec37c8c8012fa525c71fb29a58c9f29beefDaniel Dunbar else 26805ed34f4c58b6ad4e21038d713c1fae31a6146ff5Daniel Dunbar CmdArgs.push_back(Args.MakeArgString(getToolChain().GetFilePath(C, "crtendS.o"))); 2681f7b8eec37c8c8012fa525c71fb29a58c9f29beefDaniel Dunbar } 2682f7b8eec37c8c8012fa525c71fb29a58c9f29beefDaniel Dunbar 2683f7b8eec37c8c8012fa525c71fb29a58c9f29beefDaniel Dunbar const char *Exec = 26845ed34f4c58b6ad4e21038d713c1fae31a6146ff5Daniel Dunbar Args.MakeArgString(getToolChain().GetProgramPath(C, "ld")); 2685daab7b1016f0a82fefa4f7be6e63c57c06b19ffcDaniel Dunbar Dest.addCommand(new Command(JA, *this, Exec, CmdArgs)); 2686f7b8eec37c8c8012fa525c71fb29a58c9f29beefDaniel Dunbar} 2687c66a5a30a27e7b9cfab46ac8be918e3ea5b0c5a5Ed Schouten 268868a31d406c6dc4382c700d1199b062de2aa7e1daDaniel Dunbarvoid freebsd::Assemble::ConstructJob(Compilation &C, const JobAction &JA, 2689c21c485b4fb58ef5d55cf3e523263dd824a2ace4Daniel Dunbar Job &Dest, const InputInfo &Output, 2690c21c485b4fb58ef5d55cf3e523263dd824a2ace4Daniel Dunbar const InputInfoList &Inputs, 2691c21c485b4fb58ef5d55cf3e523263dd824a2ace4Daniel Dunbar const ArgList &Args, 26921eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump const char *LinkingOutput) const { 269368a31d406c6dc4382c700d1199b062de2aa7e1daDaniel Dunbar ArgStringList CmdArgs; 269468a31d406c6dc4382c700d1199b062de2aa7e1daDaniel Dunbar 2695008f54a54299eaafdaa940e2bdeaf55935ecd95aDaniel Dunbar // When building 32-bit code on FreeBSD/amd64, we have to explicitly 2696008f54a54299eaafdaa940e2bdeaf55935ecd95aDaniel Dunbar // instruct as in the base system to assemble 32-bit code. 2697008f54a54299eaafdaa940e2bdeaf55935ecd95aDaniel Dunbar if (getToolChain().getArchName() == "i386") 269868a31d406c6dc4382c700d1199b062de2aa7e1daDaniel Dunbar CmdArgs.push_back("--32"); 269968a31d406c6dc4382c700d1199b062de2aa7e1daDaniel Dunbar 2700ed734737d5af31906e30e537d4a41c760ddcfc59Eric Christopher 2701ed734737d5af31906e30e537d4a41c760ddcfc59Eric Christopher // Set byte order explicitly 2702ed734737d5af31906e30e537d4a41c760ddcfc59Eric Christopher if (getToolChain().getArchName() == "mips") 2703ed734737d5af31906e30e537d4a41c760ddcfc59Eric Christopher CmdArgs.push_back("-EB"); 2704ed734737d5af31906e30e537d4a41c760ddcfc59Eric Christopher else if (getToolChain().getArchName() == "mipsel") 2705ed734737d5af31906e30e537d4a41c760ddcfc59Eric Christopher CmdArgs.push_back("-EL"); 2706ed734737d5af31906e30e537d4a41c760ddcfc59Eric Christopher 270768a31d406c6dc4382c700d1199b062de2aa7e1daDaniel Dunbar Args.AddAllArgValues(CmdArgs, options::OPT_Wa_COMMA, 270868a31d406c6dc4382c700d1199b062de2aa7e1daDaniel Dunbar options::OPT_Xassembler); 270968a31d406c6dc4382c700d1199b062de2aa7e1daDaniel Dunbar 271068a31d406c6dc4382c700d1199b062de2aa7e1daDaniel Dunbar CmdArgs.push_back("-o"); 271168a31d406c6dc4382c700d1199b062de2aa7e1daDaniel Dunbar if (Output.isPipe()) 271268a31d406c6dc4382c700d1199b062de2aa7e1daDaniel Dunbar CmdArgs.push_back("-"); 271368a31d406c6dc4382c700d1199b062de2aa7e1daDaniel Dunbar else 271468a31d406c6dc4382c700d1199b062de2aa7e1daDaniel Dunbar CmdArgs.push_back(Output.getFilename()); 271568a31d406c6dc4382c700d1199b062de2aa7e1daDaniel Dunbar 271668a31d406c6dc4382c700d1199b062de2aa7e1daDaniel Dunbar for (InputInfoList::const_iterator 271768a31d406c6dc4382c700d1199b062de2aa7e1daDaniel Dunbar it = Inputs.begin(), ie = Inputs.end(); it != ie; ++it) { 271868a31d406c6dc4382c700d1199b062de2aa7e1daDaniel Dunbar const InputInfo &II = *it; 271968a31d406c6dc4382c700d1199b062de2aa7e1daDaniel Dunbar if (II.isPipe()) 272068a31d406c6dc4382c700d1199b062de2aa7e1daDaniel Dunbar CmdArgs.push_back("-"); 272168a31d406c6dc4382c700d1199b062de2aa7e1daDaniel Dunbar else 272268a31d406c6dc4382c700d1199b062de2aa7e1daDaniel Dunbar CmdArgs.push_back(II.getFilename()); 272368a31d406c6dc4382c700d1199b062de2aa7e1daDaniel Dunbar } 272468a31d406c6dc4382c700d1199b062de2aa7e1daDaniel Dunbar 2725c21c485b4fb58ef5d55cf3e523263dd824a2ace4Daniel Dunbar const char *Exec = 27265ed34f4c58b6ad4e21038d713c1fae31a6146ff5Daniel Dunbar Args.MakeArgString(getToolChain().GetProgramPath(C, "as")); 2727daab7b1016f0a82fefa4f7be6e63c57c06b19ffcDaniel Dunbar Dest.addCommand(new Command(JA, *this, Exec, CmdArgs)); 272868a31d406c6dc4382c700d1199b062de2aa7e1daDaniel Dunbar} 2729008f54a54299eaafdaa940e2bdeaf55935ecd95aDaniel Dunbar 2730008f54a54299eaafdaa940e2bdeaf55935ecd95aDaniel Dunbarvoid freebsd::Link::ConstructJob(Compilation &C, const JobAction &JA, 2731c21c485b4fb58ef5d55cf3e523263dd824a2ace4Daniel Dunbar Job &Dest, const InputInfo &Output, 2732c21c485b4fb58ef5d55cf3e523263dd824a2ace4Daniel Dunbar const InputInfoList &Inputs, 2733c21c485b4fb58ef5d55cf3e523263dd824a2ace4Daniel Dunbar const ArgList &Args, 2734a8304f67291b0182fb64f3afc621615288dd1d31Daniel Dunbar const char *LinkingOutput) const { 2735ee788e70fcd0adf76103b17c78ac658d4ea30c9bDaniel Dunbar const Driver &D = getToolChain().getDriver(); 2736008f54a54299eaafdaa940e2bdeaf55935ecd95aDaniel Dunbar ArgStringList CmdArgs; 2737008f54a54299eaafdaa940e2bdeaf55935ecd95aDaniel Dunbar 2738008f54a54299eaafdaa940e2bdeaf55935ecd95aDaniel Dunbar if (Args.hasArg(options::OPT_static)) { 2739008f54a54299eaafdaa940e2bdeaf55935ecd95aDaniel Dunbar CmdArgs.push_back("-Bstatic"); 2740008f54a54299eaafdaa940e2bdeaf55935ecd95aDaniel Dunbar } else { 2741008f54a54299eaafdaa940e2bdeaf55935ecd95aDaniel Dunbar CmdArgs.push_back("--eh-frame-hdr"); 2742008f54a54299eaafdaa940e2bdeaf55935ecd95aDaniel Dunbar if (Args.hasArg(options::OPT_shared)) { 2743008f54a54299eaafdaa940e2bdeaf55935ecd95aDaniel Dunbar CmdArgs.push_back("-Bshareable"); 2744008f54a54299eaafdaa940e2bdeaf55935ecd95aDaniel Dunbar } else { 2745008f54a54299eaafdaa940e2bdeaf55935ecd95aDaniel Dunbar CmdArgs.push_back("-dynamic-linker"); 2746008f54a54299eaafdaa940e2bdeaf55935ecd95aDaniel Dunbar CmdArgs.push_back("/libexec/ld-elf.so.1"); 2747008f54a54299eaafdaa940e2bdeaf55935ecd95aDaniel Dunbar } 2748008f54a54299eaafdaa940e2bdeaf55935ecd95aDaniel Dunbar } 2749008f54a54299eaafdaa940e2bdeaf55935ecd95aDaniel Dunbar 2750008f54a54299eaafdaa940e2bdeaf55935ecd95aDaniel Dunbar // When building 32-bit code on FreeBSD/amd64, we have to explicitly 2751008f54a54299eaafdaa940e2bdeaf55935ecd95aDaniel Dunbar // instruct ld in the base system to link 32-bit code. 2752008f54a54299eaafdaa940e2bdeaf55935ecd95aDaniel Dunbar if (getToolChain().getArchName() == "i386") { 2753008f54a54299eaafdaa940e2bdeaf55935ecd95aDaniel Dunbar CmdArgs.push_back("-m"); 2754008f54a54299eaafdaa940e2bdeaf55935ecd95aDaniel Dunbar CmdArgs.push_back("elf_i386_fbsd"); 2755008f54a54299eaafdaa940e2bdeaf55935ecd95aDaniel Dunbar } 2756008f54a54299eaafdaa940e2bdeaf55935ecd95aDaniel Dunbar 2757008f54a54299eaafdaa940e2bdeaf55935ecd95aDaniel Dunbar if (Output.isPipe()) { 2758008f54a54299eaafdaa940e2bdeaf55935ecd95aDaniel Dunbar CmdArgs.push_back("-o"); 2759008f54a54299eaafdaa940e2bdeaf55935ecd95aDaniel Dunbar CmdArgs.push_back("-"); 2760008f54a54299eaafdaa940e2bdeaf55935ecd95aDaniel Dunbar } else if (Output.isFilename()) { 2761008f54a54299eaafdaa940e2bdeaf55935ecd95aDaniel Dunbar CmdArgs.push_back("-o"); 2762008f54a54299eaafdaa940e2bdeaf55935ecd95aDaniel Dunbar CmdArgs.push_back(Output.getFilename()); 2763008f54a54299eaafdaa940e2bdeaf55935ecd95aDaniel Dunbar } else { 2764008f54a54299eaafdaa940e2bdeaf55935ecd95aDaniel Dunbar assert(Output.isNothing() && "Invalid output."); 2765008f54a54299eaafdaa940e2bdeaf55935ecd95aDaniel Dunbar } 2766008f54a54299eaafdaa940e2bdeaf55935ecd95aDaniel Dunbar 2767008f54a54299eaafdaa940e2bdeaf55935ecd95aDaniel Dunbar if (!Args.hasArg(options::OPT_nostdlib) && 2768008f54a54299eaafdaa940e2bdeaf55935ecd95aDaniel Dunbar !Args.hasArg(options::OPT_nostartfiles)) { 2769008f54a54299eaafdaa940e2bdeaf55935ecd95aDaniel Dunbar if (!Args.hasArg(options::OPT_shared)) { 27705ed34f4c58b6ad4e21038d713c1fae31a6146ff5Daniel Dunbar CmdArgs.push_back(Args.MakeArgString(getToolChain().GetFilePath(C, "crt1.o"))); 27715ed34f4c58b6ad4e21038d713c1fae31a6146ff5Daniel Dunbar CmdArgs.push_back(Args.MakeArgString(getToolChain().GetFilePath(C, "crti.o"))); 27725ed34f4c58b6ad4e21038d713c1fae31a6146ff5Daniel Dunbar CmdArgs.push_back(Args.MakeArgString(getToolChain().GetFilePath(C, "crtbegin.o"))); 2773008f54a54299eaafdaa940e2bdeaf55935ecd95aDaniel Dunbar } else { 27745ed34f4c58b6ad4e21038d713c1fae31a6146ff5Daniel Dunbar CmdArgs.push_back(Args.MakeArgString(getToolChain().GetFilePath(C, "crti.o"))); 27755ed34f4c58b6ad4e21038d713c1fae31a6146ff5Daniel Dunbar CmdArgs.push_back(Args.MakeArgString(getToolChain().GetFilePath(C, "crtbeginS.o"))); 2776008f54a54299eaafdaa940e2bdeaf55935ecd95aDaniel Dunbar } 2777008f54a54299eaafdaa940e2bdeaf55935ecd95aDaniel Dunbar } 2778008f54a54299eaafdaa940e2bdeaf55935ecd95aDaniel Dunbar 2779008f54a54299eaafdaa940e2bdeaf55935ecd95aDaniel Dunbar Args.AddAllArgs(CmdArgs, options::OPT_L); 2780008f54a54299eaafdaa940e2bdeaf55935ecd95aDaniel Dunbar Args.AddAllArgs(CmdArgs, options::OPT_T_Group); 2781008f54a54299eaafdaa940e2bdeaf55935ecd95aDaniel Dunbar Args.AddAllArgs(CmdArgs, options::OPT_e); 2782008f54a54299eaafdaa940e2bdeaf55935ecd95aDaniel Dunbar 2783008f54a54299eaafdaa940e2bdeaf55935ecd95aDaniel Dunbar for (InputInfoList::const_iterator 2784c21c485b4fb58ef5d55cf3e523263dd824a2ace4Daniel Dunbar it = Inputs.begin(), ie = Inputs.end(); it != ie; ++it) { 2785008f54a54299eaafdaa940e2bdeaf55935ecd95aDaniel Dunbar const InputInfo &II = *it; 2786a8304f67291b0182fb64f3afc621615288dd1d31Daniel Dunbar 2787a8304f67291b0182fb64f3afc621615288dd1d31Daniel Dunbar // Don't try to pass LLVM inputs to a generic gcc. 2788a8304f67291b0182fb64f3afc621615288dd1d31Daniel Dunbar if (II.getType() == types::TY_LLVMBC) 2789a8304f67291b0182fb64f3afc621615288dd1d31Daniel Dunbar D.Diag(clang::diag::err_drv_no_linker_llvm_support) 2790881376467c46c5c6cc16fa6790271c2c22e1d4f1Daniel Dunbar << getToolChain().getTripleString(); 2791a8304f67291b0182fb64f3afc621615288dd1d31Daniel Dunbar 2792008f54a54299eaafdaa940e2bdeaf55935ecd95aDaniel Dunbar if (II.isPipe()) 2793008f54a54299eaafdaa940e2bdeaf55935ecd95aDaniel Dunbar CmdArgs.push_back("-"); 2794008f54a54299eaafdaa940e2bdeaf55935ecd95aDaniel Dunbar else if (II.isFilename()) 2795008f54a54299eaafdaa940e2bdeaf55935ecd95aDaniel Dunbar CmdArgs.push_back(II.getFilename()); 2796008f54a54299eaafdaa940e2bdeaf55935ecd95aDaniel Dunbar else 2797008f54a54299eaafdaa940e2bdeaf55935ecd95aDaniel Dunbar II.getInputArg().renderAsInput(Args, CmdArgs); 2798008f54a54299eaafdaa940e2bdeaf55935ecd95aDaniel Dunbar } 2799008f54a54299eaafdaa940e2bdeaf55935ecd95aDaniel Dunbar 2800008f54a54299eaafdaa940e2bdeaf55935ecd95aDaniel Dunbar if (!Args.hasArg(options::OPT_nostdlib) && 2801008f54a54299eaafdaa940e2bdeaf55935ecd95aDaniel Dunbar !Args.hasArg(options::OPT_nodefaultlibs)) { 28022002263e10aa369c89008d37cada2908203fd822Daniel Dunbar if (D.CCCIsCXX) { 28032002263e10aa369c89008d37cada2908203fd822Daniel Dunbar CmdArgs.push_back("-lstdc++"); 28042002263e10aa369c89008d37cada2908203fd822Daniel Dunbar CmdArgs.push_back("-lm"); 28052002263e10aa369c89008d37cada2908203fd822Daniel Dunbar } 2806008f54a54299eaafdaa940e2bdeaf55935ecd95aDaniel Dunbar // FIXME: For some reason GCC passes -lgcc and -lgcc_s before adding 2807008f54a54299eaafdaa940e2bdeaf55935ecd95aDaniel Dunbar // the default system libraries. Just mimic this for now. 2808008f54a54299eaafdaa940e2bdeaf55935ecd95aDaniel Dunbar CmdArgs.push_back("-lgcc"); 2809008f54a54299eaafdaa940e2bdeaf55935ecd95aDaniel Dunbar if (Args.hasArg(options::OPT_static)) { 2810008f54a54299eaafdaa940e2bdeaf55935ecd95aDaniel Dunbar CmdArgs.push_back("-lgcc_eh"); 2811008f54a54299eaafdaa940e2bdeaf55935ecd95aDaniel Dunbar } else { 2812008f54a54299eaafdaa940e2bdeaf55935ecd95aDaniel Dunbar CmdArgs.push_back("--as-needed"); 2813008f54a54299eaafdaa940e2bdeaf55935ecd95aDaniel Dunbar CmdArgs.push_back("-lgcc_s"); 2814008f54a54299eaafdaa940e2bdeaf55935ecd95aDaniel Dunbar CmdArgs.push_back("--no-as-needed"); 2815008f54a54299eaafdaa940e2bdeaf55935ecd95aDaniel Dunbar } 2816008f54a54299eaafdaa940e2bdeaf55935ecd95aDaniel Dunbar 2817008f54a54299eaafdaa940e2bdeaf55935ecd95aDaniel Dunbar if (Args.hasArg(options::OPT_pthread)) 2818008f54a54299eaafdaa940e2bdeaf55935ecd95aDaniel Dunbar CmdArgs.push_back("-lpthread"); 2819008f54a54299eaafdaa940e2bdeaf55935ecd95aDaniel Dunbar CmdArgs.push_back("-lc"); 2820008f54a54299eaafdaa940e2bdeaf55935ecd95aDaniel Dunbar 2821008f54a54299eaafdaa940e2bdeaf55935ecd95aDaniel Dunbar CmdArgs.push_back("-lgcc"); 2822008f54a54299eaafdaa940e2bdeaf55935ecd95aDaniel Dunbar if (Args.hasArg(options::OPT_static)) { 2823008f54a54299eaafdaa940e2bdeaf55935ecd95aDaniel Dunbar CmdArgs.push_back("-lgcc_eh"); 2824008f54a54299eaafdaa940e2bdeaf55935ecd95aDaniel Dunbar } else { 2825008f54a54299eaafdaa940e2bdeaf55935ecd95aDaniel Dunbar CmdArgs.push_back("--as-needed"); 2826008f54a54299eaafdaa940e2bdeaf55935ecd95aDaniel Dunbar CmdArgs.push_back("-lgcc_s"); 2827008f54a54299eaafdaa940e2bdeaf55935ecd95aDaniel Dunbar CmdArgs.push_back("--no-as-needed"); 2828008f54a54299eaafdaa940e2bdeaf55935ecd95aDaniel Dunbar } 2829008f54a54299eaafdaa940e2bdeaf55935ecd95aDaniel Dunbar } 2830008f54a54299eaafdaa940e2bdeaf55935ecd95aDaniel Dunbar 2831008f54a54299eaafdaa940e2bdeaf55935ecd95aDaniel Dunbar if (!Args.hasArg(options::OPT_nostdlib) && 2832008f54a54299eaafdaa940e2bdeaf55935ecd95aDaniel Dunbar !Args.hasArg(options::OPT_nostartfiles)) { 2833008f54a54299eaafdaa940e2bdeaf55935ecd95aDaniel Dunbar if (!Args.hasArg(options::OPT_shared)) 28345ed34f4c58b6ad4e21038d713c1fae31a6146ff5Daniel Dunbar CmdArgs.push_back(Args.MakeArgString(getToolChain().GetFilePath(C, "crtend.o"))); 2835008f54a54299eaafdaa940e2bdeaf55935ecd95aDaniel Dunbar else 28365ed34f4c58b6ad4e21038d713c1fae31a6146ff5Daniel Dunbar CmdArgs.push_back(Args.MakeArgString(getToolChain().GetFilePath(C, "crtendS.o"))); 28375ed34f4c58b6ad4e21038d713c1fae31a6146ff5Daniel Dunbar CmdArgs.push_back(Args.MakeArgString(getToolChain().GetFilePath(C, "crtn.o"))); 2838008f54a54299eaafdaa940e2bdeaf55935ecd95aDaniel Dunbar } 2839008f54a54299eaafdaa940e2bdeaf55935ecd95aDaniel Dunbar 2840c21c485b4fb58ef5d55cf3e523263dd824a2ace4Daniel Dunbar const char *Exec = 28415ed34f4c58b6ad4e21038d713c1fae31a6146ff5Daniel Dunbar Args.MakeArgString(getToolChain().GetProgramPath(C, "ld")); 2842daab7b1016f0a82fefa4f7be6e63c57c06b19ffcDaniel Dunbar Dest.addCommand(new Command(JA, *this, Exec, CmdArgs)); 2843008f54a54299eaafdaa940e2bdeaf55935ecd95aDaniel Dunbar} 284411e1b40d759a643086f590f6ffbd9d68360bad46Daniel Dunbar 284511e1b40d759a643086f590f6ffbd9d68360bad46Daniel Dunbar/// DragonFly Tools 284611e1b40d759a643086f590f6ffbd9d68360bad46Daniel Dunbar 284711e1b40d759a643086f590f6ffbd9d68360bad46Daniel Dunbar// For now, DragonFly Assemble does just about the same as for 284811e1b40d759a643086f590f6ffbd9d68360bad46Daniel Dunbar// FreeBSD, but this may change soon. 284911e1b40d759a643086f590f6ffbd9d68360bad46Daniel Dunbarvoid dragonfly::Assemble::ConstructJob(Compilation &C, const JobAction &JA, 2850294691eb1caf551083acd7b08630ef21c3fd760dDaniel Dunbar Job &Dest, const InputInfo &Output, 2851294691eb1caf551083acd7b08630ef21c3fd760dDaniel Dunbar const InputInfoList &Inputs, 2852294691eb1caf551083acd7b08630ef21c3fd760dDaniel Dunbar const ArgList &Args, 2853294691eb1caf551083acd7b08630ef21c3fd760dDaniel Dunbar const char *LinkingOutput) const { 285411e1b40d759a643086f590f6ffbd9d68360bad46Daniel Dunbar ArgStringList CmdArgs; 285511e1b40d759a643086f590f6ffbd9d68360bad46Daniel Dunbar 285611e1b40d759a643086f590f6ffbd9d68360bad46Daniel Dunbar // When building 32-bit code on DragonFly/pc64, we have to explicitly 285711e1b40d759a643086f590f6ffbd9d68360bad46Daniel Dunbar // instruct as in the base system to assemble 32-bit code. 285811e1b40d759a643086f590f6ffbd9d68360bad46Daniel Dunbar if (getToolChain().getArchName() == "i386") 285911e1b40d759a643086f590f6ffbd9d68360bad46Daniel Dunbar CmdArgs.push_back("--32"); 286011e1b40d759a643086f590f6ffbd9d68360bad46Daniel Dunbar 286111e1b40d759a643086f590f6ffbd9d68360bad46Daniel Dunbar Args.AddAllArgValues(CmdArgs, options::OPT_Wa_COMMA, 286211e1b40d759a643086f590f6ffbd9d68360bad46Daniel Dunbar options::OPT_Xassembler); 286311e1b40d759a643086f590f6ffbd9d68360bad46Daniel Dunbar 286411e1b40d759a643086f590f6ffbd9d68360bad46Daniel Dunbar CmdArgs.push_back("-o"); 286511e1b40d759a643086f590f6ffbd9d68360bad46Daniel Dunbar if (Output.isPipe()) 286611e1b40d759a643086f590f6ffbd9d68360bad46Daniel Dunbar CmdArgs.push_back("-"); 286711e1b40d759a643086f590f6ffbd9d68360bad46Daniel Dunbar else 286811e1b40d759a643086f590f6ffbd9d68360bad46Daniel Dunbar CmdArgs.push_back(Output.getFilename()); 286911e1b40d759a643086f590f6ffbd9d68360bad46Daniel Dunbar 287011e1b40d759a643086f590f6ffbd9d68360bad46Daniel Dunbar for (InputInfoList::const_iterator 287111e1b40d759a643086f590f6ffbd9d68360bad46Daniel Dunbar it = Inputs.begin(), ie = Inputs.end(); it != ie; ++it) { 287211e1b40d759a643086f590f6ffbd9d68360bad46Daniel Dunbar const InputInfo &II = *it; 287311e1b40d759a643086f590f6ffbd9d68360bad46Daniel Dunbar if (II.isPipe()) 287411e1b40d759a643086f590f6ffbd9d68360bad46Daniel Dunbar CmdArgs.push_back("-"); 287511e1b40d759a643086f590f6ffbd9d68360bad46Daniel Dunbar else 287611e1b40d759a643086f590f6ffbd9d68360bad46Daniel Dunbar CmdArgs.push_back(II.getFilename()); 287711e1b40d759a643086f590f6ffbd9d68360bad46Daniel Dunbar } 287811e1b40d759a643086f590f6ffbd9d68360bad46Daniel Dunbar 287911e1b40d759a643086f590f6ffbd9d68360bad46Daniel Dunbar const char *Exec = 28805ed34f4c58b6ad4e21038d713c1fae31a6146ff5Daniel Dunbar Args.MakeArgString(getToolChain().GetProgramPath(C, "as")); 2881daab7b1016f0a82fefa4f7be6e63c57c06b19ffcDaniel Dunbar Dest.addCommand(new Command(JA, *this, Exec, CmdArgs)); 288211e1b40d759a643086f590f6ffbd9d68360bad46Daniel Dunbar} 288311e1b40d759a643086f590f6ffbd9d68360bad46Daniel Dunbar 288411e1b40d759a643086f590f6ffbd9d68360bad46Daniel Dunbarvoid dragonfly::Link::ConstructJob(Compilation &C, const JobAction &JA, 288511e1b40d759a643086f590f6ffbd9d68360bad46Daniel Dunbar Job &Dest, const InputInfo &Output, 288611e1b40d759a643086f590f6ffbd9d68360bad46Daniel Dunbar const InputInfoList &Inputs, 288711e1b40d759a643086f590f6ffbd9d68360bad46Daniel Dunbar const ArgList &Args, 288811e1b40d759a643086f590f6ffbd9d68360bad46Daniel Dunbar const char *LinkingOutput) const { 2889ee788e70fcd0adf76103b17c78ac658d4ea30c9bDaniel Dunbar const Driver &D = getToolChain().getDriver(); 289011e1b40d759a643086f590f6ffbd9d68360bad46Daniel Dunbar ArgStringList CmdArgs; 289111e1b40d759a643086f590f6ffbd9d68360bad46Daniel Dunbar 289211e1b40d759a643086f590f6ffbd9d68360bad46Daniel Dunbar if (Args.hasArg(options::OPT_static)) { 289311e1b40d759a643086f590f6ffbd9d68360bad46Daniel Dunbar CmdArgs.push_back("-Bstatic"); 289411e1b40d759a643086f590f6ffbd9d68360bad46Daniel Dunbar } else { 289511e1b40d759a643086f590f6ffbd9d68360bad46Daniel Dunbar if (Args.hasArg(options::OPT_shared)) 289611e1b40d759a643086f590f6ffbd9d68360bad46Daniel Dunbar CmdArgs.push_back("-Bshareable"); 289711e1b40d759a643086f590f6ffbd9d68360bad46Daniel Dunbar else { 289811e1b40d759a643086f590f6ffbd9d68360bad46Daniel Dunbar CmdArgs.push_back("-dynamic-linker"); 289911e1b40d759a643086f590f6ffbd9d68360bad46Daniel Dunbar CmdArgs.push_back("/usr/libexec/ld-elf.so.2"); 290011e1b40d759a643086f590f6ffbd9d68360bad46Daniel Dunbar } 290111e1b40d759a643086f590f6ffbd9d68360bad46Daniel Dunbar } 290211e1b40d759a643086f590f6ffbd9d68360bad46Daniel Dunbar 290311e1b40d759a643086f590f6ffbd9d68360bad46Daniel Dunbar // When building 32-bit code on DragonFly/pc64, we have to explicitly 290411e1b40d759a643086f590f6ffbd9d68360bad46Daniel Dunbar // instruct ld in the base system to link 32-bit code. 290511e1b40d759a643086f590f6ffbd9d68360bad46Daniel Dunbar if (getToolChain().getArchName() == "i386") { 290611e1b40d759a643086f590f6ffbd9d68360bad46Daniel Dunbar CmdArgs.push_back("-m"); 290711e1b40d759a643086f590f6ffbd9d68360bad46Daniel Dunbar CmdArgs.push_back("elf_i386"); 290811e1b40d759a643086f590f6ffbd9d68360bad46Daniel Dunbar } 290911e1b40d759a643086f590f6ffbd9d68360bad46Daniel Dunbar 291011e1b40d759a643086f590f6ffbd9d68360bad46Daniel Dunbar if (Output.isPipe()) { 291111e1b40d759a643086f590f6ffbd9d68360bad46Daniel Dunbar CmdArgs.push_back("-o"); 291211e1b40d759a643086f590f6ffbd9d68360bad46Daniel Dunbar CmdArgs.push_back("-"); 291311e1b40d759a643086f590f6ffbd9d68360bad46Daniel Dunbar } else if (Output.isFilename()) { 291411e1b40d759a643086f590f6ffbd9d68360bad46Daniel Dunbar CmdArgs.push_back("-o"); 291511e1b40d759a643086f590f6ffbd9d68360bad46Daniel Dunbar CmdArgs.push_back(Output.getFilename()); 291611e1b40d759a643086f590f6ffbd9d68360bad46Daniel Dunbar } else { 291711e1b40d759a643086f590f6ffbd9d68360bad46Daniel Dunbar assert(Output.isNothing() && "Invalid output."); 291811e1b40d759a643086f590f6ffbd9d68360bad46Daniel Dunbar } 291911e1b40d759a643086f590f6ffbd9d68360bad46Daniel Dunbar 292011e1b40d759a643086f590f6ffbd9d68360bad46Daniel Dunbar if (!Args.hasArg(options::OPT_nostdlib) && 292111e1b40d759a643086f590f6ffbd9d68360bad46Daniel Dunbar !Args.hasArg(options::OPT_nostartfiles)) { 292211e1b40d759a643086f590f6ffbd9d68360bad46Daniel Dunbar if (!Args.hasArg(options::OPT_shared)) { 29235ed34f4c58b6ad4e21038d713c1fae31a6146ff5Daniel Dunbar CmdArgs.push_back(Args.MakeArgString(getToolChain().GetFilePath(C, "crt1.o"))); 29245ed34f4c58b6ad4e21038d713c1fae31a6146ff5Daniel Dunbar CmdArgs.push_back(Args.MakeArgString(getToolChain().GetFilePath(C, "crti.o"))); 29255ed34f4c58b6ad4e21038d713c1fae31a6146ff5Daniel Dunbar CmdArgs.push_back(Args.MakeArgString(getToolChain().GetFilePath(C, "crtbegin.o"))); 292611e1b40d759a643086f590f6ffbd9d68360bad46Daniel Dunbar } else { 29275ed34f4c58b6ad4e21038d713c1fae31a6146ff5Daniel Dunbar CmdArgs.push_back(Args.MakeArgString(getToolChain().GetFilePath(C, "crti.o"))); 29285ed34f4c58b6ad4e21038d713c1fae31a6146ff5Daniel Dunbar CmdArgs.push_back(Args.MakeArgString(getToolChain().GetFilePath(C, "crtbeginS.o"))); 292911e1b40d759a643086f590f6ffbd9d68360bad46Daniel Dunbar } 293011e1b40d759a643086f590f6ffbd9d68360bad46Daniel Dunbar } 293111e1b40d759a643086f590f6ffbd9d68360bad46Daniel Dunbar 293211e1b40d759a643086f590f6ffbd9d68360bad46Daniel Dunbar Args.AddAllArgs(CmdArgs, options::OPT_L); 293311e1b40d759a643086f590f6ffbd9d68360bad46Daniel Dunbar Args.AddAllArgs(CmdArgs, options::OPT_T_Group); 293411e1b40d759a643086f590f6ffbd9d68360bad46Daniel Dunbar Args.AddAllArgs(CmdArgs, options::OPT_e); 293511e1b40d759a643086f590f6ffbd9d68360bad46Daniel Dunbar 293611e1b40d759a643086f590f6ffbd9d68360bad46Daniel Dunbar for (InputInfoList::const_iterator 293711e1b40d759a643086f590f6ffbd9d68360bad46Daniel Dunbar it = Inputs.begin(), ie = Inputs.end(); it != ie; ++it) { 293811e1b40d759a643086f590f6ffbd9d68360bad46Daniel Dunbar const InputInfo &II = *it; 2939a8304f67291b0182fb64f3afc621615288dd1d31Daniel Dunbar 2940a8304f67291b0182fb64f3afc621615288dd1d31Daniel Dunbar // Don't try to pass LLVM inputs to a generic gcc. 2941a8304f67291b0182fb64f3afc621615288dd1d31Daniel Dunbar if (II.getType() == types::TY_LLVMBC) 2942a8304f67291b0182fb64f3afc621615288dd1d31Daniel Dunbar D.Diag(clang::diag::err_drv_no_linker_llvm_support) 2943881376467c46c5c6cc16fa6790271c2c22e1d4f1Daniel Dunbar << getToolChain().getTripleString(); 2944a8304f67291b0182fb64f3afc621615288dd1d31Daniel Dunbar 294511e1b40d759a643086f590f6ffbd9d68360bad46Daniel Dunbar if (II.isPipe()) 294611e1b40d759a643086f590f6ffbd9d68360bad46Daniel Dunbar CmdArgs.push_back("-"); 294711e1b40d759a643086f590f6ffbd9d68360bad46Daniel Dunbar else if (II.isFilename()) 294811e1b40d759a643086f590f6ffbd9d68360bad46Daniel Dunbar CmdArgs.push_back(II.getFilename()); 294911e1b40d759a643086f590f6ffbd9d68360bad46Daniel Dunbar else 295011e1b40d759a643086f590f6ffbd9d68360bad46Daniel Dunbar II.getInputArg().renderAsInput(Args, CmdArgs); 295111e1b40d759a643086f590f6ffbd9d68360bad46Daniel Dunbar } 295211e1b40d759a643086f590f6ffbd9d68360bad46Daniel Dunbar 295311e1b40d759a643086f590f6ffbd9d68360bad46Daniel Dunbar if (!Args.hasArg(options::OPT_nostdlib) && 295411e1b40d759a643086f590f6ffbd9d68360bad46Daniel Dunbar !Args.hasArg(options::OPT_nodefaultlibs)) { 295511e1b40d759a643086f590f6ffbd9d68360bad46Daniel Dunbar // FIXME: GCC passes on -lgcc, -lgcc_pic and a whole lot of 295611e1b40d759a643086f590f6ffbd9d68360bad46Daniel Dunbar // rpaths 295711e1b40d759a643086f590f6ffbd9d68360bad46Daniel Dunbar CmdArgs.push_back("-L/usr/lib/gcc41"); 295811e1b40d759a643086f590f6ffbd9d68360bad46Daniel Dunbar 295911e1b40d759a643086f590f6ffbd9d68360bad46Daniel Dunbar if (!Args.hasArg(options::OPT_static)) { 296011e1b40d759a643086f590f6ffbd9d68360bad46Daniel Dunbar CmdArgs.push_back("-rpath"); 296111e1b40d759a643086f590f6ffbd9d68360bad46Daniel Dunbar CmdArgs.push_back("/usr/lib/gcc41"); 296211e1b40d759a643086f590f6ffbd9d68360bad46Daniel Dunbar 296311e1b40d759a643086f590f6ffbd9d68360bad46Daniel Dunbar CmdArgs.push_back("-rpath-link"); 296411e1b40d759a643086f590f6ffbd9d68360bad46Daniel Dunbar CmdArgs.push_back("/usr/lib/gcc41"); 296511e1b40d759a643086f590f6ffbd9d68360bad46Daniel Dunbar 296611e1b40d759a643086f590f6ffbd9d68360bad46Daniel Dunbar CmdArgs.push_back("-rpath"); 296711e1b40d759a643086f590f6ffbd9d68360bad46Daniel Dunbar CmdArgs.push_back("/usr/lib"); 296811e1b40d759a643086f590f6ffbd9d68360bad46Daniel Dunbar 296911e1b40d759a643086f590f6ffbd9d68360bad46Daniel Dunbar CmdArgs.push_back("-rpath-link"); 297011e1b40d759a643086f590f6ffbd9d68360bad46Daniel Dunbar CmdArgs.push_back("/usr/lib"); 297111e1b40d759a643086f590f6ffbd9d68360bad46Daniel Dunbar } 297211e1b40d759a643086f590f6ffbd9d68360bad46Daniel Dunbar 297311e1b40d759a643086f590f6ffbd9d68360bad46Daniel Dunbar if (Args.hasArg(options::OPT_shared)) { 297411e1b40d759a643086f590f6ffbd9d68360bad46Daniel Dunbar CmdArgs.push_back("-lgcc_pic"); 297511e1b40d759a643086f590f6ffbd9d68360bad46Daniel Dunbar } else { 297611e1b40d759a643086f590f6ffbd9d68360bad46Daniel Dunbar CmdArgs.push_back("-lgcc"); 297711e1b40d759a643086f590f6ffbd9d68360bad46Daniel Dunbar } 297811e1b40d759a643086f590f6ffbd9d68360bad46Daniel Dunbar 297911e1b40d759a643086f590f6ffbd9d68360bad46Daniel Dunbar 298011e1b40d759a643086f590f6ffbd9d68360bad46Daniel Dunbar if (Args.hasArg(options::OPT_pthread)) 29814d63f8bc2686d5d7580324407854f2ca7c128832Mike Stump CmdArgs.push_back("-lpthread"); 298211e1b40d759a643086f590f6ffbd9d68360bad46Daniel Dunbar 298311e1b40d759a643086f590f6ffbd9d68360bad46Daniel Dunbar if (!Args.hasArg(options::OPT_nolibc)) { 298411e1b40d759a643086f590f6ffbd9d68360bad46Daniel Dunbar CmdArgs.push_back("-lc"); 298511e1b40d759a643086f590f6ffbd9d68360bad46Daniel Dunbar } 298611e1b40d759a643086f590f6ffbd9d68360bad46Daniel Dunbar 298711e1b40d759a643086f590f6ffbd9d68360bad46Daniel Dunbar if (Args.hasArg(options::OPT_shared)) { 298811e1b40d759a643086f590f6ffbd9d68360bad46Daniel Dunbar CmdArgs.push_back("-lgcc_pic"); 298911e1b40d759a643086f590f6ffbd9d68360bad46Daniel Dunbar } else { 299011e1b40d759a643086f590f6ffbd9d68360bad46Daniel Dunbar CmdArgs.push_back("-lgcc"); 299111e1b40d759a643086f590f6ffbd9d68360bad46Daniel Dunbar } 299211e1b40d759a643086f590f6ffbd9d68360bad46Daniel Dunbar } 299311e1b40d759a643086f590f6ffbd9d68360bad46Daniel Dunbar 299411e1b40d759a643086f590f6ffbd9d68360bad46Daniel Dunbar if (!Args.hasArg(options::OPT_nostdlib) && 299511e1b40d759a643086f590f6ffbd9d68360bad46Daniel Dunbar !Args.hasArg(options::OPT_nostartfiles)) { 299611e1b40d759a643086f590f6ffbd9d68360bad46Daniel Dunbar if (!Args.hasArg(options::OPT_shared)) 29975ed34f4c58b6ad4e21038d713c1fae31a6146ff5Daniel Dunbar CmdArgs.push_back(Args.MakeArgString(getToolChain().GetFilePath(C, "crtend.o"))); 299811e1b40d759a643086f590f6ffbd9d68360bad46Daniel Dunbar else 29995ed34f4c58b6ad4e21038d713c1fae31a6146ff5Daniel Dunbar CmdArgs.push_back(Args.MakeArgString(getToolChain().GetFilePath(C, "crtendS.o"))); 30005ed34f4c58b6ad4e21038d713c1fae31a6146ff5Daniel Dunbar CmdArgs.push_back(Args.MakeArgString(getToolChain().GetFilePath(C, "crtn.o"))); 300111e1b40d759a643086f590f6ffbd9d68360bad46Daniel Dunbar } 300211e1b40d759a643086f590f6ffbd9d68360bad46Daniel Dunbar 300311e1b40d759a643086f590f6ffbd9d68360bad46Daniel Dunbar const char *Exec = 30045ed34f4c58b6ad4e21038d713c1fae31a6146ff5Daniel Dunbar Args.MakeArgString(getToolChain().GetProgramPath(C, "ld")); 3005daab7b1016f0a82fefa4f7be6e63c57c06b19ffcDaniel Dunbar Dest.addCommand(new Command(JA, *this, Exec, CmdArgs)); 300611e1b40d759a643086f590f6ffbd9d68360bad46Daniel Dunbar} 3007