Tools.cpp revision e9756514b410b0ac5afa00cdb4569e1f62f4a7f4
16ba612efffba42bec102ac58a1540496158f747eAndrew Sapperstein//===--- Tools.cpp - Tools Implementations ------------------------------*-===// 26ba612efffba42bec102ac58a1540496158f747eAndrew Sapperstein// 36ba612efffba42bec102ac58a1540496158f747eAndrew Sapperstein// The LLVM Compiler Infrastructure 46ba612efffba42bec102ac58a1540496158f747eAndrew Sapperstein// 56ba612efffba42bec102ac58a1540496158f747eAndrew Sapperstein// This file is distributed under the University of Illinois Open Source 66ba612efffba42bec102ac58a1540496158f747eAndrew Sapperstein// License. See LICENSE.TXT for details. 76ba612efffba42bec102ac58a1540496158f747eAndrew Sapperstein// 86ba612efffba42bec102ac58a1540496158f747eAndrew Sapperstein//===----------------------------------------------------------------------===// 96ba612efffba42bec102ac58a1540496158f747eAndrew Sapperstein 106ba612efffba42bec102ac58a1540496158f747eAndrew Sapperstein#include "Tools.h" 116ba612efffba42bec102ac58a1540496158f747eAndrew Sapperstein 126ba612efffba42bec102ac58a1540496158f747eAndrew Sapperstein#include "clang/Basic/Version.h" 136ba612efffba42bec102ac58a1540496158f747eAndrew Sapperstein#include "clang/Driver/Action.h" 146ba612efffba42bec102ac58a1540496158f747eAndrew Sapperstein#include "clang/Driver/Arg.h" 156ba612efffba42bec102ac58a1540496158f747eAndrew Sapperstein#include "clang/Driver/ArgList.h" 166ba612efffba42bec102ac58a1540496158f747eAndrew Sapperstein#include "clang/Driver/Driver.h" 17d6eaacbb9eb56763d38a3815fc509b92ed98a585Andrew Sapperstein#include "clang/Driver/DriverDiagnostic.h" 18d6eaacbb9eb56763d38a3815fc509b92ed98a585Andrew Sapperstein#include "clang/Driver/Compilation.h" 19d6eaacbb9eb56763d38a3815fc509b92ed98a585Andrew Sapperstein#include "clang/Driver/Job.h" 20d6eaacbb9eb56763d38a3815fc509b92ed98a585Andrew Sapperstein#include "clang/Driver/HostInfo.h" 21d6eaacbb9eb56763d38a3815fc509b92ed98a585Andrew Sapperstein#include "clang/Driver/Option.h" 22d6eaacbb9eb56763d38a3815fc509b92ed98a585Andrew Sapperstein#include "clang/Driver/Options.h" 23d6eaacbb9eb56763d38a3815fc509b92ed98a585Andrew Sapperstein#include "clang/Driver/ToolChain.h" 24d6eaacbb9eb56763d38a3815fc509b92ed98a585Andrew Sapperstein#include "clang/Driver/Util.h" 25d6eaacbb9eb56763d38a3815fc509b92ed98a585Andrew Sapperstein 26d6eaacbb9eb56763d38a3815fc509b92ed98a585Andrew Sapperstein#include "llvm/ADT/SmallString.h" 27d6eaacbb9eb56763d38a3815fc509b92ed98a585Andrew Sapperstein#include "llvm/ADT/StringSwitch.h" 28d6eaacbb9eb56763d38a3815fc509b92ed98a585Andrew Sapperstein#include "llvm/ADT/Twine.h" 29d6eaacbb9eb56763d38a3815fc509b92ed98a585Andrew Sapperstein#include "llvm/Support/Format.h" 30d6eaacbb9eb56763d38a3815fc509b92ed98a585Andrew Sapperstein#include "llvm/Support/raw_ostream.h" 31d6eaacbb9eb56763d38a3815fc509b92ed98a585Andrew Sapperstein#include "llvm/System/Host.h" 32d6eaacbb9eb56763d38a3815fc509b92ed98a585Andrew Sapperstein#include "llvm/System/Process.h" 33d6eaacbb9eb56763d38a3815fc509b92ed98a585Andrew Sapperstein 34d6eaacbb9eb56763d38a3815fc509b92ed98a585Andrew Sapperstein#include "InputInfo.h" 35d6eaacbb9eb56763d38a3815fc509b92ed98a585Andrew Sapperstein#include "ToolChains.h" 36d6eaacbb9eb56763d38a3815fc509b92ed98a585Andrew Sapperstein 37d6eaacbb9eb56763d38a3815fc509b92ed98a585Andrew Sappersteinusing namespace clang::driver; 38d6eaacbb9eb56763d38a3815fc509b92ed98a585Andrew Sappersteinusing namespace clang::driver::tools; 39d6eaacbb9eb56763d38a3815fc509b92ed98a585Andrew Sapperstein 40d6eaacbb9eb56763d38a3815fc509b92ed98a585Andrew Sapperstein/// CheckPreprocessingOptions - Perform some validation of preprocessing 41d6eaacbb9eb56763d38a3815fc509b92ed98a585Andrew Sapperstein/// arguments that is shared with gcc. 42d6eaacbb9eb56763d38a3815fc509b92ed98a585Andrew Sappersteinstatic void CheckPreprocessingOptions(const Driver &D, const ArgList &Args) { 43d6eaacbb9eb56763d38a3815fc509b92ed98a585Andrew Sapperstein if (Arg *A = Args.getLastArg(options::OPT_C, options::OPT_CC)) 44d6eaacbb9eb56763d38a3815fc509b92ed98a585Andrew Sapperstein if (!Args.hasArg(options::OPT_E)) 45d6eaacbb9eb56763d38a3815fc509b92ed98a585Andrew Sapperstein D.Diag(clang::diag::err_drv_argument_only_allowed_with) 46d6eaacbb9eb56763d38a3815fc509b92ed98a585Andrew Sapperstein << A->getAsString(Args) << "-E"; 47d6eaacbb9eb56763d38a3815fc509b92ed98a585Andrew Sapperstein} 48d6eaacbb9eb56763d38a3815fc509b92ed98a585Andrew Sapperstein 49d6eaacbb9eb56763d38a3815fc509b92ed98a585Andrew Sapperstein/// CheckCodeGenerationOptions - Perform some validation of code generation 50d6eaacbb9eb56763d38a3815fc509b92ed98a585Andrew Sapperstein/// arguments that is shared with gcc. 516ba612efffba42bec102ac58a1540496158f747eAndrew Sappersteinstatic void CheckCodeGenerationOptions(const Driver &D, const ArgList &Args) { 526ba612efffba42bec102ac58a1540496158f747eAndrew Sapperstein // In gcc, only ARM checks this, but it seems reasonable to check universally. 536ba612efffba42bec102ac58a1540496158f747eAndrew Sapperstein if (Args.hasArg(options::OPT_static)) 546ba612efffba42bec102ac58a1540496158f747eAndrew Sapperstein if (const Arg *A = Args.getLastArg(options::OPT_dynamic, 556ba612efffba42bec102ac58a1540496158f747eAndrew Sapperstein options::OPT_mdynamic_no_pic)) 566ba612efffba42bec102ac58a1540496158f747eAndrew Sapperstein D.Diag(clang::diag::err_drv_argument_not_allowed_with) 576ba612efffba42bec102ac58a1540496158f747eAndrew Sapperstein << A->getAsString(Args) << "-static"; 586ba612efffba42bec102ac58a1540496158f747eAndrew Sapperstein} 596ba612efffba42bec102ac58a1540496158f747eAndrew Sapperstein 606ba612efffba42bec102ac58a1540496158f747eAndrew Sappersteinvoid Clang::AddPreprocessingOptions(const Driver &D, 616ba612efffba42bec102ac58a1540496158f747eAndrew Sapperstein const ArgList &Args, 626ba612efffba42bec102ac58a1540496158f747eAndrew Sapperstein ArgStringList &CmdArgs, 636ba612efffba42bec102ac58a1540496158f747eAndrew Sapperstein const InputInfo &Output, 646ba612efffba42bec102ac58a1540496158f747eAndrew Sapperstein const InputInfoList &Inputs) const { 656ba612efffba42bec102ac58a1540496158f747eAndrew Sapperstein Arg *A; 666ba612efffba42bec102ac58a1540496158f747eAndrew Sapperstein 676ba612efffba42bec102ac58a1540496158f747eAndrew Sapperstein CheckPreprocessingOptions(D, Args); 686ba612efffba42bec102ac58a1540496158f747eAndrew Sapperstein 696ba612efffba42bec102ac58a1540496158f747eAndrew Sapperstein Args.AddLastArg(CmdArgs, options::OPT_C); 706ba612efffba42bec102ac58a1540496158f747eAndrew Sapperstein Args.AddLastArg(CmdArgs, options::OPT_CC); 716ba612efffba42bec102ac58a1540496158f747eAndrew Sapperstein 726ba612efffba42bec102ac58a1540496158f747eAndrew Sapperstein // Handle dependency file generation. 736ba612efffba42bec102ac58a1540496158f747eAndrew Sapperstein if ((A = Args.getLastArg(options::OPT_M)) || 746ba612efffba42bec102ac58a1540496158f747eAndrew Sapperstein (A = Args.getLastArg(options::OPT_MM)) || 756ba612efffba42bec102ac58a1540496158f747eAndrew Sapperstein (A = Args.getLastArg(options::OPT_MD)) || 766ba612efffba42bec102ac58a1540496158f747eAndrew Sapperstein (A = Args.getLastArg(options::OPT_MMD))) { 776ba612efffba42bec102ac58a1540496158f747eAndrew Sapperstein // Determine the output location. 786ba612efffba42bec102ac58a1540496158f747eAndrew Sapperstein const char *DepFile; 796ba612efffba42bec102ac58a1540496158f747eAndrew Sapperstein if (Output.getType() == types::TY_Dependencies) { 806ba612efffba42bec102ac58a1540496158f747eAndrew Sapperstein if (Output.isPipe()) 816ba612efffba42bec102ac58a1540496158f747eAndrew Sapperstein DepFile = "-"; 826ba612efffba42bec102ac58a1540496158f747eAndrew Sapperstein else 836ba612efffba42bec102ac58a1540496158f747eAndrew Sapperstein DepFile = Output.getFilename(); 846ba612efffba42bec102ac58a1540496158f747eAndrew Sapperstein } else if (Arg *MF = Args.getLastArg(options::OPT_MF)) { 856ba612efffba42bec102ac58a1540496158f747eAndrew Sapperstein DepFile = MF->getValue(Args); 866ba612efffba42bec102ac58a1540496158f747eAndrew Sapperstein } else if (A->getOption().matches(options::OPT_M) || 876ba612efffba42bec102ac58a1540496158f747eAndrew Sapperstein A->getOption().matches(options::OPT_MM)) { 886ba612efffba42bec102ac58a1540496158f747eAndrew Sapperstein DepFile = "-"; 896ba612efffba42bec102ac58a1540496158f747eAndrew Sapperstein } else { 906ba612efffba42bec102ac58a1540496158f747eAndrew Sapperstein DepFile = darwin::CC1::getDependencyFileName(Args, Inputs); 916ba612efffba42bec102ac58a1540496158f747eAndrew Sapperstein } 926ba612efffba42bec102ac58a1540496158f747eAndrew Sapperstein CmdArgs.push_back("-dependency-file"); 936ba612efffba42bec102ac58a1540496158f747eAndrew Sapperstein CmdArgs.push_back(DepFile); 946ba612efffba42bec102ac58a1540496158f747eAndrew Sapperstein 956ba612efffba42bec102ac58a1540496158f747eAndrew Sapperstein // Add an -MT option if the user didn't specify their own. 966ba612efffba42bec102ac58a1540496158f747eAndrew Sapperstein // 976ba612efffba42bec102ac58a1540496158f747eAndrew Sapperstein // FIXME: This should use -MQ, when we support it. 986ba612efffba42bec102ac58a1540496158f747eAndrew Sapperstein if (!Args.hasArg(options::OPT_MT) && !Args.hasArg(options::OPT_MQ)) { 996ba612efffba42bec102ac58a1540496158f747eAndrew Sapperstein const char *DepTarget; 1006ba612efffba42bec102ac58a1540496158f747eAndrew Sapperstein 1016ba612efffba42bec102ac58a1540496158f747eAndrew Sapperstein // If user provided -o, that is the dependency target, except 1026ba612efffba42bec102ac58a1540496158f747eAndrew Sapperstein // when we are only generating a dependency file. 1036ba612efffba42bec102ac58a1540496158f747eAndrew Sapperstein Arg *OutputOpt = Args.getLastArg(options::OPT_o); 1046ba612efffba42bec102ac58a1540496158f747eAndrew Sapperstein if (OutputOpt && Output.getType() != types::TY_Dependencies) { 1056ba612efffba42bec102ac58a1540496158f747eAndrew Sapperstein DepTarget = OutputOpt->getValue(Args); 1066ba612efffba42bec102ac58a1540496158f747eAndrew Sapperstein } else { 1076ba612efffba42bec102ac58a1540496158f747eAndrew Sapperstein // Otherwise derive from the base input. 1086ba612efffba42bec102ac58a1540496158f747eAndrew Sapperstein // 1096ba612efffba42bec102ac58a1540496158f747eAndrew Sapperstein // FIXME: This should use the computed output file location. 1106ba612efffba42bec102ac58a1540496158f747eAndrew Sapperstein llvm::sys::Path P(Inputs[0].getBaseInput()); 1116ba612efffba42bec102ac58a1540496158f747eAndrew Sapperstein 1126ba612efffba42bec102ac58a1540496158f747eAndrew Sapperstein P.eraseSuffix(); 1136ba612efffba42bec102ac58a1540496158f747eAndrew Sapperstein P.appendSuffix("o"); 1146ba612efffba42bec102ac58a1540496158f747eAndrew Sapperstein DepTarget = Args.MakeArgString(P.getLast()); 1156ba612efffba42bec102ac58a1540496158f747eAndrew Sapperstein } 1166ba612efffba42bec102ac58a1540496158f747eAndrew Sapperstein 1176ba612efffba42bec102ac58a1540496158f747eAndrew Sapperstein CmdArgs.push_back("-MT"); 1186ba612efffba42bec102ac58a1540496158f747eAndrew Sapperstein CmdArgs.push_back(DepTarget); 1196ba612efffba42bec102ac58a1540496158f747eAndrew Sapperstein } 1206ba612efffba42bec102ac58a1540496158f747eAndrew Sapperstein 1216ba612efffba42bec102ac58a1540496158f747eAndrew Sapperstein if (A->getOption().matches(options::OPT_M) || 1226ba612efffba42bec102ac58a1540496158f747eAndrew Sapperstein A->getOption().matches(options::OPT_MD)) 1236ba612efffba42bec102ac58a1540496158f747eAndrew Sapperstein CmdArgs.push_back("-sys-header-deps"); 1246ba612efffba42bec102ac58a1540496158f747eAndrew Sapperstein } 1256ba612efffba42bec102ac58a1540496158f747eAndrew Sapperstein 1266ba612efffba42bec102ac58a1540496158f747eAndrew Sapperstein Args.AddLastArg(CmdArgs, options::OPT_MP); 1276ba612efffba42bec102ac58a1540496158f747eAndrew Sapperstein Args.AddAllArgs(CmdArgs, options::OPT_MT); 1286ba612efffba42bec102ac58a1540496158f747eAndrew Sapperstein 1296ba612efffba42bec102ac58a1540496158f747eAndrew Sapperstein // Add -i* options, and automatically translate to 1306ba612efffba42bec102ac58a1540496158f747eAndrew Sapperstein // -include-pch/-include-pth for transparent PCH support. It's 1316ba612efffba42bec102ac58a1540496158f747eAndrew Sapperstein // wonky, but we include looking for .gch so we can support seamless 1326ba612efffba42bec102ac58a1540496158f747eAndrew Sapperstein // replacement into a build system already set up to be generating 1336ba612efffba42bec102ac58a1540496158f747eAndrew Sapperstein // .gch files. 1346ba612efffba42bec102ac58a1540496158f747eAndrew Sapperstein for (arg_iterator it = Args.filtered_begin(options::OPT_clang_i_Group), 1356ba612efffba42bec102ac58a1540496158f747eAndrew Sapperstein ie = Args.filtered_end(); it != ie; ++it) { 1366ba612efffba42bec102ac58a1540496158f747eAndrew Sapperstein const Arg *A = it; 1376ba612efffba42bec102ac58a1540496158f747eAndrew Sapperstein 1386ba612efffba42bec102ac58a1540496158f747eAndrew Sapperstein if (A->getOption().matches(options::OPT_include)) { 1396ba612efffba42bec102ac58a1540496158f747eAndrew Sapperstein // Use PCH if the user requested it, except for C++ (for now). 1406ba612efffba42bec102ac58a1540496158f747eAndrew Sapperstein bool UsePCH = D.CCCUsePCH; 1416ba612efffba42bec102ac58a1540496158f747eAndrew Sapperstein if (types::isCXX(Inputs[0].getType())) 1426ba612efffba42bec102ac58a1540496158f747eAndrew Sapperstein UsePCH = false; 1436ba612efffba42bec102ac58a1540496158f747eAndrew Sapperstein 1446ba612efffba42bec102ac58a1540496158f747eAndrew Sapperstein bool FoundPTH = false; 1456ba612efffba42bec102ac58a1540496158f747eAndrew Sapperstein bool FoundPCH = false; 1466ba612efffba42bec102ac58a1540496158f747eAndrew Sapperstein llvm::sys::Path P(A->getValue(Args)); 1476ba612efffba42bec102ac58a1540496158f747eAndrew Sapperstein if (UsePCH) { 1486ba612efffba42bec102ac58a1540496158f747eAndrew Sapperstein P.appendSuffix("pch"); 149d6eaacbb9eb56763d38a3815fc509b92ed98a585Andrew Sapperstein if (P.exists()) 150d6eaacbb9eb56763d38a3815fc509b92ed98a585Andrew Sapperstein FoundPCH = true; 151d6eaacbb9eb56763d38a3815fc509b92ed98a585Andrew Sapperstein else 152d6eaacbb9eb56763d38a3815fc509b92ed98a585Andrew Sapperstein P.eraseSuffix(); 153d6eaacbb9eb56763d38a3815fc509b92ed98a585Andrew Sapperstein } 154d6eaacbb9eb56763d38a3815fc509b92ed98a585Andrew Sapperstein 155d6eaacbb9eb56763d38a3815fc509b92ed98a585Andrew Sapperstein if (!FoundPCH) { 156d6eaacbb9eb56763d38a3815fc509b92ed98a585Andrew Sapperstein P.appendSuffix("pth"); 157d6eaacbb9eb56763d38a3815fc509b92ed98a585Andrew Sapperstein if (P.exists()) 158d6eaacbb9eb56763d38a3815fc509b92ed98a585Andrew Sapperstein FoundPTH = true; 159d6eaacbb9eb56763d38a3815fc509b92ed98a585Andrew Sapperstein else 160d6eaacbb9eb56763d38a3815fc509b92ed98a585Andrew Sapperstein P.eraseSuffix(); 1616ba612efffba42bec102ac58a1540496158f747eAndrew Sapperstein } 162d6eaacbb9eb56763d38a3815fc509b92ed98a585Andrew Sapperstein 163d6eaacbb9eb56763d38a3815fc509b92ed98a585Andrew Sapperstein if (!FoundPCH && !FoundPTH) { 164d6eaacbb9eb56763d38a3815fc509b92ed98a585Andrew Sapperstein P.appendSuffix("gch"); 165d6eaacbb9eb56763d38a3815fc509b92ed98a585Andrew Sapperstein if (P.exists()) { 166d6eaacbb9eb56763d38a3815fc509b92ed98a585Andrew Sapperstein FoundPCH = UsePCH; 167d6eaacbb9eb56763d38a3815fc509b92ed98a585Andrew Sapperstein FoundPTH = !UsePCH; 1686ba612efffba42bec102ac58a1540496158f747eAndrew Sapperstein } 1696ba612efffba42bec102ac58a1540496158f747eAndrew Sapperstein else 170d6eaacbb9eb56763d38a3815fc509b92ed98a585Andrew Sapperstein P.eraseSuffix(); 171d6eaacbb9eb56763d38a3815fc509b92ed98a585Andrew Sapperstein } 172d6eaacbb9eb56763d38a3815fc509b92ed98a585Andrew Sapperstein 173d6eaacbb9eb56763d38a3815fc509b92ed98a585Andrew Sapperstein if (FoundPCH || FoundPTH) { 174d6eaacbb9eb56763d38a3815fc509b92ed98a585Andrew Sapperstein A->claim(); 175d6eaacbb9eb56763d38a3815fc509b92ed98a585Andrew Sapperstein if (UsePCH) 176d6eaacbb9eb56763d38a3815fc509b92ed98a585Andrew Sapperstein CmdArgs.push_back("-include-pch"); 177d6eaacbb9eb56763d38a3815fc509b92ed98a585Andrew Sapperstein else 178d6eaacbb9eb56763d38a3815fc509b92ed98a585Andrew Sapperstein CmdArgs.push_back("-include-pth"); 179d6eaacbb9eb56763d38a3815fc509b92ed98a585Andrew Sapperstein CmdArgs.push_back(Args.MakeArgString(P.str())); 180d6eaacbb9eb56763d38a3815fc509b92ed98a585Andrew Sapperstein continue; 181d6eaacbb9eb56763d38a3815fc509b92ed98a585Andrew Sapperstein } 182d6eaacbb9eb56763d38a3815fc509b92ed98a585Andrew Sapperstein } 183d6eaacbb9eb56763d38a3815fc509b92ed98a585Andrew Sapperstein 184d6eaacbb9eb56763d38a3815fc509b92ed98a585Andrew Sapperstein // Not translated, render as usual. 185d6eaacbb9eb56763d38a3815fc509b92ed98a585Andrew Sapperstein A->claim(); 186d6eaacbb9eb56763d38a3815fc509b92ed98a585Andrew Sapperstein A->render(Args, CmdArgs); 187d6eaacbb9eb56763d38a3815fc509b92ed98a585Andrew Sapperstein } 188d6eaacbb9eb56763d38a3815fc509b92ed98a585Andrew Sapperstein 1896ba612efffba42bec102ac58a1540496158f747eAndrew Sapperstein Args.AddAllArgs(CmdArgs, options::OPT_D, options::OPT_U); 1906ba612efffba42bec102ac58a1540496158f747eAndrew Sapperstein Args.AddAllArgs(CmdArgs, options::OPT_I_Group, options::OPT_F); 191d6eaacbb9eb56763d38a3815fc509b92ed98a585Andrew Sapperstein 192d6eaacbb9eb56763d38a3815fc509b92ed98a585Andrew Sapperstein // Add -Wp, and -Xassembler if using the preprocessor. 193d6eaacbb9eb56763d38a3815fc509b92ed98a585Andrew Sapperstein 194d6eaacbb9eb56763d38a3815fc509b92ed98a585Andrew Sapperstein // FIXME: There is a very unfortunate problem here, some troubled 195d6eaacbb9eb56763d38a3815fc509b92ed98a585Andrew Sapperstein // souls abuse -Wp, to pass preprocessor options in gcc syntax. To 196d6eaacbb9eb56763d38a3815fc509b92ed98a585Andrew Sapperstein // really support that we would have to parse and then translate 197d6eaacbb9eb56763d38a3815fc509b92ed98a585Andrew Sapperstein // those options. :( 198d6eaacbb9eb56763d38a3815fc509b92ed98a585Andrew Sapperstein Args.AddAllArgValues(CmdArgs, options::OPT_Wp_COMMA, 199d6eaacbb9eb56763d38a3815fc509b92ed98a585Andrew Sapperstein options::OPT_Xpreprocessor); 200d6eaacbb9eb56763d38a3815fc509b92ed98a585Andrew Sapperstein 201d6eaacbb9eb56763d38a3815fc509b92ed98a585Andrew Sapperstein // -I- is a deprecated GCC feature, reject it. 202d6eaacbb9eb56763d38a3815fc509b92ed98a585Andrew Sapperstein if (Arg *A = Args.getLastArg(options::OPT_I_)) 203d6eaacbb9eb56763d38a3815fc509b92ed98a585Andrew Sapperstein D.Diag(clang::diag::err_drv_I_dash_not_supported) << A->getAsString(Args); 204d6eaacbb9eb56763d38a3815fc509b92ed98a585Andrew Sapperstein} 205d6eaacbb9eb56763d38a3815fc509b92ed98a585Andrew Sapperstein 206d6eaacbb9eb56763d38a3815fc509b92ed98a585Andrew Sapperstein/// getARMTargetCPU - Get the (LLVM) name of the ARM cpu we are targetting. 2076ba612efffba42bec102ac58a1540496158f747eAndrew Sapperstein// 208d6eaacbb9eb56763d38a3815fc509b92ed98a585Andrew Sapperstein// FIXME: tblgen this. 209d6eaacbb9eb56763d38a3815fc509b92ed98a585Andrew Sappersteinstatic const char *getARMTargetCPU(const ArgList &Args) { 210d6eaacbb9eb56763d38a3815fc509b92ed98a585Andrew Sapperstein // FIXME: Warn on inconsistent use of -mcpu and -march. 211d6eaacbb9eb56763d38a3815fc509b92ed98a585Andrew Sapperstein 212d6eaacbb9eb56763d38a3815fc509b92ed98a585Andrew Sapperstein // If we have -mcpu=, use that. 213d6eaacbb9eb56763d38a3815fc509b92ed98a585Andrew Sapperstein if (Arg *A = Args.getLastArg(options::OPT_mcpu_EQ)) 214d6eaacbb9eb56763d38a3815fc509b92ed98a585Andrew Sapperstein return A->getValue(Args); 215d6eaacbb9eb56763d38a3815fc509b92ed98a585Andrew Sapperstein 216d6eaacbb9eb56763d38a3815fc509b92ed98a585Andrew Sapperstein // Otherwise, if we have -march= choose the base CPU for that arch. 217d6eaacbb9eb56763d38a3815fc509b92ed98a585Andrew Sapperstein if (Arg *A = Args.getLastArg(options::OPT_march_EQ)) { 218d6eaacbb9eb56763d38a3815fc509b92ed98a585Andrew Sapperstein llvm::StringRef MArch = A->getValue(Args); 219d6eaacbb9eb56763d38a3815fc509b92ed98a585Andrew Sapperstein 220d6eaacbb9eb56763d38a3815fc509b92ed98a585Andrew Sapperstein if (MArch == "armv2" || MArch == "armv2a") 221d6eaacbb9eb56763d38a3815fc509b92ed98a585Andrew Sapperstein return "arm2"; 222d6eaacbb9eb56763d38a3815fc509b92ed98a585Andrew Sapperstein if (MArch == "armv3") 223d6eaacbb9eb56763d38a3815fc509b92ed98a585Andrew Sapperstein return "arm6"; 224d6eaacbb9eb56763d38a3815fc509b92ed98a585Andrew Sapperstein if (MArch == "armv3m") 225d6eaacbb9eb56763d38a3815fc509b92ed98a585Andrew Sapperstein return "arm7m"; 226d6eaacbb9eb56763d38a3815fc509b92ed98a585Andrew Sapperstein if (MArch == "armv4" || MArch == "armv4t") 227d6eaacbb9eb56763d38a3815fc509b92ed98a585Andrew Sapperstein return "arm7tdmi"; 228d6eaacbb9eb56763d38a3815fc509b92ed98a585Andrew Sapperstein if (MArch == "armv5" || MArch == "armv5t") 229d6eaacbb9eb56763d38a3815fc509b92ed98a585Andrew Sapperstein return "arm10tdmi"; 230d6eaacbb9eb56763d38a3815fc509b92ed98a585Andrew Sapperstein if (MArch == "armv5e" || MArch == "armv5te") 231d6eaacbb9eb56763d38a3815fc509b92ed98a585Andrew Sapperstein return "arm1026ejs"; 232d6eaacbb9eb56763d38a3815fc509b92ed98a585Andrew Sapperstein if (MArch == "armv5tej") 233d6eaacbb9eb56763d38a3815fc509b92ed98a585Andrew Sapperstein return "arm926ejs"; 234d6eaacbb9eb56763d38a3815fc509b92ed98a585Andrew Sapperstein if (MArch == "armv6" || MArch == "armv6k") 235d6eaacbb9eb56763d38a3815fc509b92ed98a585Andrew Sapperstein return "arm1136jf-s"; 236d6eaacbb9eb56763d38a3815fc509b92ed98a585Andrew Sapperstein if (MArch == "armv6j") 237d6eaacbb9eb56763d38a3815fc509b92ed98a585Andrew Sapperstein return "arm1136j-s"; 238d6eaacbb9eb56763d38a3815fc509b92ed98a585Andrew Sapperstein if (MArch == "armv6z" || MArch == "armv6zk") 239d6eaacbb9eb56763d38a3815fc509b92ed98a585Andrew Sapperstein return "arm1176jzf-s"; 240d6eaacbb9eb56763d38a3815fc509b92ed98a585Andrew Sapperstein if (MArch == "armv6t2") 241d6eaacbb9eb56763d38a3815fc509b92ed98a585Andrew Sapperstein return "arm1156t2-s"; 242d6eaacbb9eb56763d38a3815fc509b92ed98a585Andrew Sapperstein if (MArch == "armv7" || MArch == "armv7a" || MArch == "armv7-a") 243d6eaacbb9eb56763d38a3815fc509b92ed98a585Andrew Sapperstein return "cortex-a8"; 244d6eaacbb9eb56763d38a3815fc509b92ed98a585Andrew Sapperstein if (MArch == "armv7r" || MArch == "armv7-r") 245d6eaacbb9eb56763d38a3815fc509b92ed98a585Andrew Sapperstein return "cortex-r4"; 2466ba612efffba42bec102ac58a1540496158f747eAndrew Sapperstein if (MArch == "armv7m" || MArch == "armv7-m") 247d6eaacbb9eb56763d38a3815fc509b92ed98a585Andrew Sapperstein return "cortex-m3"; 248d6eaacbb9eb56763d38a3815fc509b92ed98a585Andrew Sapperstein if (MArch == "ep9312") 249d6eaacbb9eb56763d38a3815fc509b92ed98a585Andrew Sapperstein return "ep9312"; 250d6eaacbb9eb56763d38a3815fc509b92ed98a585Andrew Sapperstein if (MArch == "iwmmxt") 251d6eaacbb9eb56763d38a3815fc509b92ed98a585Andrew Sapperstein return "iwmmxt"; 252d6eaacbb9eb56763d38a3815fc509b92ed98a585Andrew Sapperstein if (MArch == "xscale") 2536ba612efffba42bec102ac58a1540496158f747eAndrew Sapperstein return "xscale"; 254d6eaacbb9eb56763d38a3815fc509b92ed98a585Andrew Sapperstein } 255d6eaacbb9eb56763d38a3815fc509b92ed98a585Andrew Sapperstein 2566ba612efffba42bec102ac58a1540496158f747eAndrew Sapperstein // Otherwise return the most base CPU LLVM supports. 257d6eaacbb9eb56763d38a3815fc509b92ed98a585Andrew Sapperstein return "arm7tdmi"; 258d6eaacbb9eb56763d38a3815fc509b92ed98a585Andrew Sapperstein} 259d6eaacbb9eb56763d38a3815fc509b92ed98a585Andrew Sapperstein 260d6eaacbb9eb56763d38a3815fc509b92ed98a585Andrew Sapperstein/// getLLVMArchSuffixForARM - Get the LLVM arch name to use for a particular 261d6eaacbb9eb56763d38a3815fc509b92ed98a585Andrew Sapperstein/// CPU. 262d6eaacbb9eb56763d38a3815fc509b92ed98a585Andrew Sapperstein// 263d6eaacbb9eb56763d38a3815fc509b92ed98a585Andrew Sapperstein// FIXME: This is redundant with -mcpu, why does LLVM use this. 264d6eaacbb9eb56763d38a3815fc509b92ed98a585Andrew Sapperstein// FIXME: tblgen this, or kill it! 265d6eaacbb9eb56763d38a3815fc509b92ed98a585Andrew Sappersteinstatic const char *getLLVMArchSuffixForARM(llvm::StringRef CPU) { 266d6eaacbb9eb56763d38a3815fc509b92ed98a585Andrew Sapperstein if (CPU == "arm7tdmi" || CPU == "arm7tdmi-s" || CPU == "arm710t" || 267d6eaacbb9eb56763d38a3815fc509b92ed98a585Andrew Sapperstein CPU == "arm720t" || CPU == "arm9" || CPU == "arm9tdmi" || 268d6eaacbb9eb56763d38a3815fc509b92ed98a585Andrew Sapperstein CPU == "arm920" || CPU == "arm920t" || CPU == "arm922t" || 2696ba612efffba42bec102ac58a1540496158f747eAndrew Sapperstein CPU == "arm940t" || CPU == "ep9312") 270d6eaacbb9eb56763d38a3815fc509b92ed98a585Andrew Sapperstein return "v4t"; 271d6eaacbb9eb56763d38a3815fc509b92ed98a585Andrew Sapperstein 272d6eaacbb9eb56763d38a3815fc509b92ed98a585Andrew Sapperstein if (CPU == "arm10tdmi" || CPU == "arm1020t") 273d6eaacbb9eb56763d38a3815fc509b92ed98a585Andrew Sapperstein return "v5"; 274d6eaacbb9eb56763d38a3815fc509b92ed98a585Andrew Sapperstein 275d6eaacbb9eb56763d38a3815fc509b92ed98a585Andrew Sapperstein if (CPU == "arm9e" || CPU == "arm926ej-s" || CPU == "arm946e-s" || 276d6eaacbb9eb56763d38a3815fc509b92ed98a585Andrew Sapperstein CPU == "arm966e-s" || CPU == "arm968e-s" || CPU == "arm10e" || 277d6eaacbb9eb56763d38a3815fc509b92ed98a585Andrew Sapperstein CPU == "arm1020e" || CPU == "arm1022e" || CPU == "xscale" || 278d6eaacbb9eb56763d38a3815fc509b92ed98a585Andrew Sapperstein CPU == "iwmmxt") 279d6eaacbb9eb56763d38a3815fc509b92ed98a585Andrew Sapperstein return "v5e"; 280d6eaacbb9eb56763d38a3815fc509b92ed98a585Andrew Sapperstein 281d6eaacbb9eb56763d38a3815fc509b92ed98a585Andrew Sapperstein if (CPU == "arm1136j-s" || CPU == "arm1136jf-s" || CPU == "arm1176jz-s" || 282d6eaacbb9eb56763d38a3815fc509b92ed98a585Andrew Sapperstein CPU == "arm1176jzf-s" || CPU == "mpcorenovfp" || CPU == "mpcore") 283d6eaacbb9eb56763d38a3815fc509b92ed98a585Andrew Sapperstein return "v6"; 284d6eaacbb9eb56763d38a3815fc509b92ed98a585Andrew Sapperstein 2856ba612efffba42bec102ac58a1540496158f747eAndrew Sapperstein if (CPU == "arm1156t2-s" || CPU == "arm1156t2f-s") 286d6eaacbb9eb56763d38a3815fc509b92ed98a585Andrew Sapperstein return "v6t2"; 287d6eaacbb9eb56763d38a3815fc509b92ed98a585Andrew Sapperstein 2886ba612efffba42bec102ac58a1540496158f747eAndrew Sapperstein if (CPU == "cortex-a8" || CPU == "cortex-a9") 289d6eaacbb9eb56763d38a3815fc509b92ed98a585Andrew Sapperstein return "v7"; 290d6eaacbb9eb56763d38a3815fc509b92ed98a585Andrew Sapperstein 291d6eaacbb9eb56763d38a3815fc509b92ed98a585Andrew Sapperstein return ""; 292d6eaacbb9eb56763d38a3815fc509b92ed98a585Andrew Sapperstein} 293d6eaacbb9eb56763d38a3815fc509b92ed98a585Andrew Sapperstein 294d6eaacbb9eb56763d38a3815fc509b92ed98a585Andrew Sapperstein/// getLLVMTriple - Get the LLVM triple to use for a particular toolchain, which 295d6eaacbb9eb56763d38a3815fc509b92ed98a585Andrew Sapperstein/// may depend on command line arguments. 296d6eaacbb9eb56763d38a3815fc509b92ed98a585Andrew Sappersteinstatic std::string getLLVMTriple(const ToolChain &TC, const ArgList &Args) { 297d6eaacbb9eb56763d38a3815fc509b92ed98a585Andrew Sapperstein switch (TC.getTriple().getArch()) { 298d6eaacbb9eb56763d38a3815fc509b92ed98a585Andrew Sapperstein default: 299d6eaacbb9eb56763d38a3815fc509b92ed98a585Andrew Sapperstein return TC.getTripleString(); 300d6eaacbb9eb56763d38a3815fc509b92ed98a585Andrew Sapperstein 301d6eaacbb9eb56763d38a3815fc509b92ed98a585Andrew Sapperstein case llvm::Triple::arm: 3026ba612efffba42bec102ac58a1540496158f747eAndrew Sapperstein case llvm::Triple::thumb: { 303d6eaacbb9eb56763d38a3815fc509b92ed98a585Andrew Sapperstein // FIXME: Factor into subclasses. 304d6eaacbb9eb56763d38a3815fc509b92ed98a585Andrew Sapperstein llvm::Triple Triple = TC.getTriple(); 305d6eaacbb9eb56763d38a3815fc509b92ed98a585Andrew Sapperstein 306d6eaacbb9eb56763d38a3815fc509b92ed98a585Andrew Sapperstein // Thumb2 is the default for V7 on Darwin. 307d6eaacbb9eb56763d38a3815fc509b92ed98a585Andrew Sapperstein // 308d6eaacbb9eb56763d38a3815fc509b92ed98a585Andrew Sapperstein // FIXME: Thumb should just be another -target-feaure, not in the triple. 309d6eaacbb9eb56763d38a3815fc509b92ed98a585Andrew Sapperstein llvm::StringRef Suffix = getLLVMArchSuffixForARM(getARMTargetCPU(Args)); 310d6eaacbb9eb56763d38a3815fc509b92ed98a585Andrew Sapperstein bool ThumbDefault = 311d6eaacbb9eb56763d38a3815fc509b92ed98a585Andrew Sapperstein (Suffix == "v7" && TC.getTriple().getOS() == llvm::Triple::Darwin); 312d6eaacbb9eb56763d38a3815fc509b92ed98a585Andrew Sapperstein std::string ArchName = "arm"; 313d6eaacbb9eb56763d38a3815fc509b92ed98a585Andrew Sapperstein if (Args.hasFlag(options::OPT_mthumb, options::OPT_mno_thumb, ThumbDefault)) 314d6eaacbb9eb56763d38a3815fc509b92ed98a585Andrew Sapperstein ArchName = "thumb"; 315d6eaacbb9eb56763d38a3815fc509b92ed98a585Andrew Sapperstein Triple.setArchName(ArchName + Suffix.str()); 316d6eaacbb9eb56763d38a3815fc509b92ed98a585Andrew Sapperstein 317d6eaacbb9eb56763d38a3815fc509b92ed98a585Andrew Sapperstein return Triple.getTriple(); 318d6eaacbb9eb56763d38a3815fc509b92ed98a585Andrew Sapperstein } 319d6eaacbb9eb56763d38a3815fc509b92ed98a585Andrew Sapperstein } 320d6eaacbb9eb56763d38a3815fc509b92ed98a585Andrew Sapperstein} 321d6eaacbb9eb56763d38a3815fc509b92ed98a585Andrew Sapperstein 3226ba612efffba42bec102ac58a1540496158f747eAndrew Sapperstein// FIXME: Move to target hook. 323d6eaacbb9eb56763d38a3815fc509b92ed98a585Andrew Sappersteinstatic bool isSignedCharDefault(const llvm::Triple &Triple) { 324d6eaacbb9eb56763d38a3815fc509b92ed98a585Andrew Sapperstein switch (Triple.getArch()) { 3256ba612efffba42bec102ac58a1540496158f747eAndrew Sapperstein default: 326d6eaacbb9eb56763d38a3815fc509b92ed98a585Andrew Sapperstein return true; 327d6eaacbb9eb56763d38a3815fc509b92ed98a585Andrew Sapperstein 328d6eaacbb9eb56763d38a3815fc509b92ed98a585Andrew Sapperstein case llvm::Triple::ppc: 329d6eaacbb9eb56763d38a3815fc509b92ed98a585Andrew Sapperstein case llvm::Triple::ppc64: 330d6eaacbb9eb56763d38a3815fc509b92ed98a585Andrew Sapperstein if (Triple.getOS() == llvm::Triple::Darwin) 331d6eaacbb9eb56763d38a3815fc509b92ed98a585Andrew Sapperstein return true; 332d6eaacbb9eb56763d38a3815fc509b92ed98a585Andrew Sapperstein return false; 333d6eaacbb9eb56763d38a3815fc509b92ed98a585Andrew Sapperstein 334d6eaacbb9eb56763d38a3815fc509b92ed98a585Andrew Sapperstein case llvm::Triple::systemz: 335d6eaacbb9eb56763d38a3815fc509b92ed98a585Andrew Sapperstein return false; 336d6eaacbb9eb56763d38a3815fc509b92ed98a585Andrew Sapperstein } 337d6eaacbb9eb56763d38a3815fc509b92ed98a585Andrew Sapperstein} 338d6eaacbb9eb56763d38a3815fc509b92ed98a585Andrew Sapperstein 3396ba612efffba42bec102ac58a1540496158f747eAndrew Sappersteinvoid Clang::AddARMTargetArgs(const ArgList &Args, 340d6eaacbb9eb56763d38a3815fc509b92ed98a585Andrew Sapperstein ArgStringList &CmdArgs) const { 341d6eaacbb9eb56763d38a3815fc509b92ed98a585Andrew Sapperstein const Driver &D = getToolChain().getHost().getDriver(); 342d6eaacbb9eb56763d38a3815fc509b92ed98a585Andrew Sapperstein 343d6eaacbb9eb56763d38a3815fc509b92ed98a585Andrew Sapperstein // Select the ABI to use. 344d6eaacbb9eb56763d38a3815fc509b92ed98a585Andrew Sapperstein // 345d6eaacbb9eb56763d38a3815fc509b92ed98a585Andrew Sapperstein // FIXME: Support -meabi. 346d6eaacbb9eb56763d38a3815fc509b92ed98a585Andrew Sapperstein const char *ABIName = 0; 347d6eaacbb9eb56763d38a3815fc509b92ed98a585Andrew Sapperstein if (Arg *A = Args.getLastArg(options::OPT_mabi_EQ)) { 348d6eaacbb9eb56763d38a3815fc509b92ed98a585Andrew Sapperstein ABIName = A->getValue(Args); 349d6eaacbb9eb56763d38a3815fc509b92ed98a585Andrew Sapperstein } else { 350d6eaacbb9eb56763d38a3815fc509b92ed98a585Andrew Sapperstein // Select the default based on the platform. 351d6eaacbb9eb56763d38a3815fc509b92ed98a585Andrew Sapperstein switch (getToolChain().getTriple().getOS()) { 352d6eaacbb9eb56763d38a3815fc509b92ed98a585Andrew Sapperstein // FIXME: Is this right for non-Darwin and non-Linux? 353d6eaacbb9eb56763d38a3815fc509b92ed98a585Andrew Sapperstein default: 354d6eaacbb9eb56763d38a3815fc509b92ed98a585Andrew Sapperstein ABIName = "aapcs"; 355d6eaacbb9eb56763d38a3815fc509b92ed98a585Andrew Sapperstein break; 356d6eaacbb9eb56763d38a3815fc509b92ed98a585Andrew Sapperstein 357d6eaacbb9eb56763d38a3815fc509b92ed98a585Andrew Sapperstein case llvm::Triple::Darwin: 358d6eaacbb9eb56763d38a3815fc509b92ed98a585Andrew Sapperstein ABIName = "apcs-gnu"; 359d6eaacbb9eb56763d38a3815fc509b92ed98a585Andrew Sapperstein break; 360d6eaacbb9eb56763d38a3815fc509b92ed98a585Andrew Sapperstein 361d6eaacbb9eb56763d38a3815fc509b92ed98a585Andrew Sapperstein case llvm::Triple::Linux: 362d6eaacbb9eb56763d38a3815fc509b92ed98a585Andrew Sapperstein ABIName = "aapcs-linux"; 363d6eaacbb9eb56763d38a3815fc509b92ed98a585Andrew Sapperstein break; 364d6eaacbb9eb56763d38a3815fc509b92ed98a585Andrew Sapperstein } 365d6eaacbb9eb56763d38a3815fc509b92ed98a585Andrew Sapperstein } 366d6eaacbb9eb56763d38a3815fc509b92ed98a585Andrew Sapperstein CmdArgs.push_back("-target-abi"); 367d6eaacbb9eb56763d38a3815fc509b92ed98a585Andrew Sapperstein CmdArgs.push_back(ABIName); 368d6eaacbb9eb56763d38a3815fc509b92ed98a585Andrew Sapperstein 3696ba612efffba42bec102ac58a1540496158f747eAndrew Sapperstein // Set the CPU based on -march= and -mcpu=. 370d6eaacbb9eb56763d38a3815fc509b92ed98a585Andrew Sapperstein CmdArgs.push_back("-mcpu"); 371d6eaacbb9eb56763d38a3815fc509b92ed98a585Andrew Sapperstein CmdArgs.push_back(getARMTargetCPU(Args)); 372d6eaacbb9eb56763d38a3815fc509b92ed98a585Andrew Sapperstein 373d6eaacbb9eb56763d38a3815fc509b92ed98a585Andrew Sapperstein // Select the float ABI as determined by -msoft-float, -mhard-float, and 374d6eaacbb9eb56763d38a3815fc509b92ed98a585Andrew Sapperstein // -mfloat-abi=. 375d6eaacbb9eb56763d38a3815fc509b92ed98a585Andrew Sapperstein llvm::StringRef FloatABI; 376d6eaacbb9eb56763d38a3815fc509b92ed98a585Andrew Sapperstein if (Arg *A = Args.getLastArg(options::OPT_msoft_float, 377d6eaacbb9eb56763d38a3815fc509b92ed98a585Andrew Sapperstein options::OPT_mhard_float, 378d6eaacbb9eb56763d38a3815fc509b92ed98a585Andrew Sapperstein options::OPT_mfloat_abi_EQ)) { 379d6eaacbb9eb56763d38a3815fc509b92ed98a585Andrew Sapperstein if (A->getOption().matches(options::OPT_msoft_float)) 380d6eaacbb9eb56763d38a3815fc509b92ed98a585Andrew Sapperstein FloatABI = "soft"; 381d6eaacbb9eb56763d38a3815fc509b92ed98a585Andrew Sapperstein else if (A->getOption().matches(options::OPT_mhard_float)) 382d6eaacbb9eb56763d38a3815fc509b92ed98a585Andrew Sapperstein FloatABI = "hard"; 383d6eaacbb9eb56763d38a3815fc509b92ed98a585Andrew Sapperstein else { 384d6eaacbb9eb56763d38a3815fc509b92ed98a585Andrew Sapperstein FloatABI = A->getValue(Args); 385d6eaacbb9eb56763d38a3815fc509b92ed98a585Andrew Sapperstein if (FloatABI != "soft" && FloatABI != "softfp" && FloatABI != "hard") { 386d6eaacbb9eb56763d38a3815fc509b92ed98a585Andrew Sapperstein D.Diag(clang::diag::err_drv_invalid_mfloat_abi) 387d6eaacbb9eb56763d38a3815fc509b92ed98a585Andrew Sapperstein << A->getAsString(Args); 388d6eaacbb9eb56763d38a3815fc509b92ed98a585Andrew Sapperstein FloatABI = "soft"; 389d6eaacbb9eb56763d38a3815fc509b92ed98a585Andrew Sapperstein } 390d6eaacbb9eb56763d38a3815fc509b92ed98a585Andrew Sapperstein } 391d6eaacbb9eb56763d38a3815fc509b92ed98a585Andrew Sapperstein } 392d6eaacbb9eb56763d38a3815fc509b92ed98a585Andrew Sapperstein 393d6eaacbb9eb56763d38a3815fc509b92ed98a585Andrew Sapperstein // If unspecified, choose the default based on the platform. 394d6eaacbb9eb56763d38a3815fc509b92ed98a585Andrew Sapperstein if (FloatABI.empty()) { 395d6eaacbb9eb56763d38a3815fc509b92ed98a585Andrew Sapperstein // FIXME: This is wrong for non-Darwin, we don't have a mechanism yet for 396d6eaacbb9eb56763d38a3815fc509b92ed98a585Andrew Sapperstein // distinguishing things like linux-eabi vs linux-elf. 3976ba612efffba42bec102ac58a1540496158f747eAndrew Sapperstein switch (getToolChain().getTriple().getOS()) { 398d6eaacbb9eb56763d38a3815fc509b92ed98a585Andrew Sapperstein case llvm::Triple::Darwin: { 399d6eaacbb9eb56763d38a3815fc509b92ed98a585Andrew Sapperstein // Darwin defaults to "softfp" for v6 and v7. 400d6eaacbb9eb56763d38a3815fc509b92ed98a585Andrew Sapperstein // 401d6eaacbb9eb56763d38a3815fc509b92ed98a585Andrew Sapperstein // FIXME: Factor out an ARM class so we can cache the arch somewhere. 402d6eaacbb9eb56763d38a3815fc509b92ed98a585Andrew Sapperstein llvm::StringRef ArchName = getLLVMArchSuffixForARM(getARMTargetCPU(Args)); 403d6eaacbb9eb56763d38a3815fc509b92ed98a585Andrew Sapperstein if (ArchName.startswith("v6") || ArchName.startswith("v7")) 404d6eaacbb9eb56763d38a3815fc509b92ed98a585Andrew Sapperstein FloatABI = "softfp"; 4056ba612efffba42bec102ac58a1540496158f747eAndrew Sapperstein else 406d6eaacbb9eb56763d38a3815fc509b92ed98a585Andrew Sapperstein FloatABI = "soft"; 407d6eaacbb9eb56763d38a3815fc509b92ed98a585Andrew Sapperstein break; 408d6eaacbb9eb56763d38a3815fc509b92ed98a585Andrew Sapperstein } 409d6eaacbb9eb56763d38a3815fc509b92ed98a585Andrew Sapperstein 410d6eaacbb9eb56763d38a3815fc509b92ed98a585Andrew Sapperstein default: 411d6eaacbb9eb56763d38a3815fc509b92ed98a585Andrew Sapperstein // Assume "soft", but warn the user we are guessing. 412d6eaacbb9eb56763d38a3815fc509b92ed98a585Andrew Sapperstein FloatABI = "soft"; 413d6eaacbb9eb56763d38a3815fc509b92ed98a585Andrew Sapperstein D.Diag(clang::diag::warn_drv_assuming_mfloat_abi_is) << "soft"; 414d6eaacbb9eb56763d38a3815fc509b92ed98a585Andrew Sapperstein break; 415d6eaacbb9eb56763d38a3815fc509b92ed98a585Andrew Sapperstein } 416d6eaacbb9eb56763d38a3815fc509b92ed98a585Andrew Sapperstein } 417d6eaacbb9eb56763d38a3815fc509b92ed98a585Andrew Sapperstein 418d6eaacbb9eb56763d38a3815fc509b92ed98a585Andrew Sapperstein if (FloatABI == "soft") { 419d6eaacbb9eb56763d38a3815fc509b92ed98a585Andrew Sapperstein // Floating point operations and argument passing are soft. 420d6eaacbb9eb56763d38a3815fc509b92ed98a585Andrew Sapperstein // 421d6eaacbb9eb56763d38a3815fc509b92ed98a585Andrew Sapperstein // FIXME: This changes CPP defines, we need -target-soft-float. 422d6eaacbb9eb56763d38a3815fc509b92ed98a585Andrew Sapperstein CmdArgs.push_back("-msoft-float"); 4236ba612efffba42bec102ac58a1540496158f747eAndrew Sapperstein CmdArgs.push_back("-mfloat-abi"); 4246ba612efffba42bec102ac58a1540496158f747eAndrew Sapperstein CmdArgs.push_back("soft"); 425d6eaacbb9eb56763d38a3815fc509b92ed98a585Andrew Sapperstein } else if (FloatABI == "softfp") { 426d6eaacbb9eb56763d38a3815fc509b92ed98a585Andrew Sapperstein // Floating point operations are hard, but argument passing is soft. 427d6eaacbb9eb56763d38a3815fc509b92ed98a585Andrew Sapperstein CmdArgs.push_back("-mfloat-abi"); 428d6eaacbb9eb56763d38a3815fc509b92ed98a585Andrew Sapperstein CmdArgs.push_back("soft"); 429d6eaacbb9eb56763d38a3815fc509b92ed98a585Andrew Sapperstein } else { 430d6eaacbb9eb56763d38a3815fc509b92ed98a585Andrew Sapperstein // Floating point operations and argument passing are hard. 431d6eaacbb9eb56763d38a3815fc509b92ed98a585Andrew Sapperstein assert(FloatABI == "hard" && "Invalid float abi!"); 432d6eaacbb9eb56763d38a3815fc509b92ed98a585Andrew Sapperstein CmdArgs.push_back("-mfloat-abi"); 433d6eaacbb9eb56763d38a3815fc509b92ed98a585Andrew Sapperstein CmdArgs.push_back("hard"); 434d6eaacbb9eb56763d38a3815fc509b92ed98a585Andrew Sapperstein } 435d6eaacbb9eb56763d38a3815fc509b92ed98a585Andrew Sapperstein} 436d6eaacbb9eb56763d38a3815fc509b92ed98a585Andrew Sapperstein 437d6eaacbb9eb56763d38a3815fc509b92ed98a585Andrew Sappersteinvoid Clang::AddX86TargetArgs(const ArgList &Args, 438d6eaacbb9eb56763d38a3815fc509b92ed98a585Andrew Sapperstein ArgStringList &CmdArgs) const { 439d6eaacbb9eb56763d38a3815fc509b92ed98a585Andrew Sapperstein if (!Args.hasFlag(options::OPT_mred_zone, 440d6eaacbb9eb56763d38a3815fc509b92ed98a585Andrew Sapperstein options::OPT_mno_red_zone, 441d6eaacbb9eb56763d38a3815fc509b92ed98a585Andrew Sapperstein true) || 442d6eaacbb9eb56763d38a3815fc509b92ed98a585Andrew Sapperstein Args.hasArg(options::OPT_mkernel) || 443d6eaacbb9eb56763d38a3815fc509b92ed98a585Andrew Sapperstein Args.hasArg(options::OPT_fapple_kext)) 444d6eaacbb9eb56763d38a3815fc509b92ed98a585Andrew Sapperstein CmdArgs.push_back("-disable-red-zone"); 445d6eaacbb9eb56763d38a3815fc509b92ed98a585Andrew Sapperstein 446d6eaacbb9eb56763d38a3815fc509b92ed98a585Andrew Sapperstein if (Args.hasFlag(options::OPT_msoft_float, 4476ba612efffba42bec102ac58a1540496158f747eAndrew Sapperstein options::OPT_mno_soft_float, 4486ba612efffba42bec102ac58a1540496158f747eAndrew Sapperstein false)) 449d6eaacbb9eb56763d38a3815fc509b92ed98a585Andrew Sapperstein CmdArgs.push_back("-no-implicit-float"); 450d6eaacbb9eb56763d38a3815fc509b92ed98a585Andrew Sapperstein 451d6eaacbb9eb56763d38a3815fc509b92ed98a585Andrew Sapperstein const char *CPUName = 0; 452d6eaacbb9eb56763d38a3815fc509b92ed98a585Andrew Sapperstein if (const Arg *A = Args.getLastArg(options::OPT_march_EQ)) { 453d6eaacbb9eb56763d38a3815fc509b92ed98a585Andrew Sapperstein if (llvm::StringRef(A->getValue(Args)) == "native") { 454d6eaacbb9eb56763d38a3815fc509b92ed98a585Andrew Sapperstein // FIXME: Reject attempts to use -march=native unless the target matches 455d6eaacbb9eb56763d38a3815fc509b92ed98a585Andrew Sapperstein // the host. 456d6eaacbb9eb56763d38a3815fc509b92ed98a585Andrew Sapperstein // 457d6eaacbb9eb56763d38a3815fc509b92ed98a585Andrew Sapperstein // FIXME: We should also incorporate the detected target features for use 458d6eaacbb9eb56763d38a3815fc509b92ed98a585Andrew Sapperstein // with -native. 459d6eaacbb9eb56763d38a3815fc509b92ed98a585Andrew Sapperstein std::string CPU = llvm::sys::getHostCPUName(); 460d6eaacbb9eb56763d38a3815fc509b92ed98a585Andrew Sapperstein if (!CPU.empty()) 461d6eaacbb9eb56763d38a3815fc509b92ed98a585Andrew Sapperstein CPUName = Args.MakeArgString(CPU); 462d6eaacbb9eb56763d38a3815fc509b92ed98a585Andrew Sapperstein } else 463d6eaacbb9eb56763d38a3815fc509b92ed98a585Andrew Sapperstein CPUName = A->getValue(Args); 464d6eaacbb9eb56763d38a3815fc509b92ed98a585Andrew Sapperstein } 465d6eaacbb9eb56763d38a3815fc509b92ed98a585Andrew Sapperstein 466d6eaacbb9eb56763d38a3815fc509b92ed98a585Andrew Sapperstein // Select the default CPU if none was given (or detection failed). 467d6eaacbb9eb56763d38a3815fc509b92ed98a585Andrew Sapperstein if (!CPUName) { 468d6eaacbb9eb56763d38a3815fc509b92ed98a585Andrew Sapperstein // FIXME: Need target hooks. 469d6eaacbb9eb56763d38a3815fc509b92ed98a585Andrew Sapperstein if (memcmp(getToolChain().getOS().c_str(), "darwin", 6) == 0) { 470d6eaacbb9eb56763d38a3815fc509b92ed98a585Andrew Sapperstein if (getToolChain().getArchName() == "x86_64") 4716ba612efffba42bec102ac58a1540496158f747eAndrew Sapperstein CPUName = "core2"; 472d6eaacbb9eb56763d38a3815fc509b92ed98a585Andrew Sapperstein else if (getToolChain().getArchName() == "i386") 473d6eaacbb9eb56763d38a3815fc509b92ed98a585Andrew Sapperstein CPUName = "yonah"; 474d6eaacbb9eb56763d38a3815fc509b92ed98a585Andrew Sapperstein } else { 475d6eaacbb9eb56763d38a3815fc509b92ed98a585Andrew Sapperstein if (getToolChain().getArchName() == "x86_64") 4766ba612efffba42bec102ac58a1540496158f747eAndrew Sapperstein CPUName = "x86-64"; 477d6eaacbb9eb56763d38a3815fc509b92ed98a585Andrew Sapperstein else if (getToolChain().getArchName() == "i386") 4786ba612efffba42bec102ac58a1540496158f747eAndrew Sapperstein CPUName = "pentium4"; 479d6eaacbb9eb56763d38a3815fc509b92ed98a585Andrew Sapperstein } 480d6eaacbb9eb56763d38a3815fc509b92ed98a585Andrew Sapperstein } 481d6eaacbb9eb56763d38a3815fc509b92ed98a585Andrew Sapperstein 482d6eaacbb9eb56763d38a3815fc509b92ed98a585Andrew Sapperstein if (CPUName) { 483d6eaacbb9eb56763d38a3815fc509b92ed98a585Andrew Sapperstein CmdArgs.push_back("-mcpu"); 484d6eaacbb9eb56763d38a3815fc509b92ed98a585Andrew Sapperstein CmdArgs.push_back(CPUName); 485d6eaacbb9eb56763d38a3815fc509b92ed98a585Andrew Sapperstein } 486d6eaacbb9eb56763d38a3815fc509b92ed98a585Andrew Sapperstein 487d6eaacbb9eb56763d38a3815fc509b92ed98a585Andrew Sapperstein for (arg_iterator it = Args.filtered_begin(options::OPT_m_x86_Features_Group), 488d6eaacbb9eb56763d38a3815fc509b92ed98a585Andrew Sapperstein ie = Args.filtered_end(); it != ie; ++it) { 489d6eaacbb9eb56763d38a3815fc509b92ed98a585Andrew Sapperstein llvm::StringRef Name = it->getOption().getName(); 490d6eaacbb9eb56763d38a3815fc509b92ed98a585Andrew Sapperstein it->claim(); 491d6eaacbb9eb56763d38a3815fc509b92ed98a585Andrew Sapperstein 4926ba612efffba42bec102ac58a1540496158f747eAndrew Sapperstein // Skip over "-m". 493d6eaacbb9eb56763d38a3815fc509b92ed98a585Andrew Sapperstein assert(Name.startswith("-m") && "Invalid feature name."); 494d6eaacbb9eb56763d38a3815fc509b92ed98a585Andrew Sapperstein Name = Name.substr(2); 495d6eaacbb9eb56763d38a3815fc509b92ed98a585Andrew Sapperstein 496d6eaacbb9eb56763d38a3815fc509b92ed98a585Andrew Sapperstein bool IsNegative = Name.startswith("no-"); 497d6eaacbb9eb56763d38a3815fc509b92ed98a585Andrew Sapperstein if (IsNegative) 498d6eaacbb9eb56763d38a3815fc509b92ed98a585Andrew Sapperstein Name = Name.substr(3); 499d6eaacbb9eb56763d38a3815fc509b92ed98a585Andrew Sapperstein 500d6eaacbb9eb56763d38a3815fc509b92ed98a585Andrew Sapperstein CmdArgs.push_back("-target-feature"); 501d6eaacbb9eb56763d38a3815fc509b92ed98a585Andrew Sapperstein CmdArgs.push_back(Args.MakeArgString((IsNegative ? "-" : "+") + Name)); 502d6eaacbb9eb56763d38a3815fc509b92ed98a585Andrew Sapperstein } 503d6eaacbb9eb56763d38a3815fc509b92ed98a585Andrew Sapperstein} 504d6eaacbb9eb56763d38a3815fc509b92ed98a585Andrew Sapperstein 505d6eaacbb9eb56763d38a3815fc509b92ed98a585Andrew Sappersteinstatic bool needsExceptions(const ArgList &Args, types::ID InputType, 506d6eaacbb9eb56763d38a3815fc509b92ed98a585Andrew Sapperstein const llvm::Triple &Triple) { 507d6eaacbb9eb56763d38a3815fc509b92ed98a585Andrew Sapperstein if (Arg *A = Args.getLastArg(options::OPT_fexceptions, 508d6eaacbb9eb56763d38a3815fc509b92ed98a585Andrew Sapperstein options::OPT_fno_exceptions)) { 5096ba612efffba42bec102ac58a1540496158f747eAndrew Sapperstein if (A->getOption().matches(options::OPT_fexceptions)) 510d6eaacbb9eb56763d38a3815fc509b92ed98a585Andrew Sapperstein return true; 511d6eaacbb9eb56763d38a3815fc509b92ed98a585Andrew Sapperstein else 512d6eaacbb9eb56763d38a3815fc509b92ed98a585Andrew Sapperstein return false; 513d6eaacbb9eb56763d38a3815fc509b92ed98a585Andrew Sapperstein } 514d6eaacbb9eb56763d38a3815fc509b92ed98a585Andrew Sapperstein switch (InputType) { 515d6eaacbb9eb56763d38a3815fc509b92ed98a585Andrew Sapperstein case types::TY_CXX: case types::TY_CXXHeader: 516d6eaacbb9eb56763d38a3815fc509b92ed98a585Andrew Sapperstein case types::TY_PP_CXX: case types::TY_PP_CXXHeader: 517d6eaacbb9eb56763d38a3815fc509b92ed98a585Andrew Sapperstein case types::TY_ObjCXX: case types::TY_ObjCXXHeader: 518d6eaacbb9eb56763d38a3815fc509b92ed98a585Andrew Sapperstein case types::TY_PP_ObjCXX: case types::TY_PP_ObjCXXHeader: 519d6eaacbb9eb56763d38a3815fc509b92ed98a585Andrew Sapperstein return true; 520d6eaacbb9eb56763d38a3815fc509b92ed98a585Andrew Sapperstein 521d6eaacbb9eb56763d38a3815fc509b92ed98a585Andrew Sapperstein case types::TY_ObjC: case types::TY_ObjCHeader: 5226ba612efffba42bec102ac58a1540496158f747eAndrew Sapperstein case types::TY_PP_ObjC: case types::TY_PP_ObjCHeader: 523d6eaacbb9eb56763d38a3815fc509b92ed98a585Andrew Sapperstein if (Args.hasArg(options::OPT_fobjc_nonfragile_abi)) 524d6eaacbb9eb56763d38a3815fc509b92ed98a585Andrew Sapperstein return true; 525d6eaacbb9eb56763d38a3815fc509b92ed98a585Andrew Sapperstein if (Triple.getOS() != llvm::Triple::Darwin) 526d6eaacbb9eb56763d38a3815fc509b92ed98a585Andrew Sapperstein return false; 527d6eaacbb9eb56763d38a3815fc509b92ed98a585Andrew Sapperstein return (Triple.getDarwinMajorNumber() >= 9 && 528d6eaacbb9eb56763d38a3815fc509b92ed98a585Andrew Sapperstein Triple.getArch() == llvm::Triple::x86_64); 529d6eaacbb9eb56763d38a3815fc509b92ed98a585Andrew Sapperstein 530d6eaacbb9eb56763d38a3815fc509b92ed98a585Andrew Sapperstein default: 531d6eaacbb9eb56763d38a3815fc509b92ed98a585Andrew Sapperstein return false; 532d6eaacbb9eb56763d38a3815fc509b92ed98a585Andrew Sapperstein } 533d6eaacbb9eb56763d38a3815fc509b92ed98a585Andrew Sapperstein} 5346ba612efffba42bec102ac58a1540496158f747eAndrew Sapperstein 535d6eaacbb9eb56763d38a3815fc509b92ed98a585Andrew Sapperstein/// getEffectiveClangTriple - Get the "effective" target triple, which is the 536d6eaacbb9eb56763d38a3815fc509b92ed98a585Andrew Sapperstein/// triple for the target but with the OS version potentially modified for 537d6eaacbb9eb56763d38a3815fc509b92ed98a585Andrew Sapperstein/// Darwin's -mmacosx-version-min. 538d6eaacbb9eb56763d38a3815fc509b92ed98a585Andrew Sappersteinstatic std::string getEffectiveClangTriple(const Driver &D, 539d6eaacbb9eb56763d38a3815fc509b92ed98a585Andrew Sapperstein const ToolChain &TC, 540d6eaacbb9eb56763d38a3815fc509b92ed98a585Andrew Sapperstein const ArgList &Args) { 541d6eaacbb9eb56763d38a3815fc509b92ed98a585Andrew Sapperstein llvm::Triple Triple(getLLVMTriple(TC, Args)); 542d6eaacbb9eb56763d38a3815fc509b92ed98a585Andrew Sapperstein 5436ba612efffba42bec102ac58a1540496158f747eAndrew Sapperstein if (Triple.getOS() != llvm::Triple::Darwin) { 544d6eaacbb9eb56763d38a3815fc509b92ed98a585Andrew Sapperstein // Diagnose use of -mmacosx-version-min and -miphoneos-version-min on 545d6eaacbb9eb56763d38a3815fc509b92ed98a585Andrew Sapperstein // non-Darwin. 546d6eaacbb9eb56763d38a3815fc509b92ed98a585Andrew Sapperstein if (Arg *A = Args.getLastArg(options::OPT_mmacosx_version_min_EQ, 547d6eaacbb9eb56763d38a3815fc509b92ed98a585Andrew Sapperstein options::OPT_miphoneos_version_min_EQ)) 548d6eaacbb9eb56763d38a3815fc509b92ed98a585Andrew Sapperstein D.Diag(clang::diag::err_drv_clang_unsupported) << A->getAsString(Args); 549d6eaacbb9eb56763d38a3815fc509b92ed98a585Andrew Sapperstein return Triple.getTriple(); 550d6eaacbb9eb56763d38a3815fc509b92ed98a585Andrew Sapperstein } 551d6eaacbb9eb56763d38a3815fc509b92ed98a585Andrew Sapperstein 552d6eaacbb9eb56763d38a3815fc509b92ed98a585Andrew Sapperstein // If -mmacosx-version-min=10.3.9 is specified, change the effective triple 553d6eaacbb9eb56763d38a3815fc509b92ed98a585Andrew Sapperstein // from being something like powerpc-apple-darwin9 to powerpc-apple-darwin7. 554d6eaacbb9eb56763d38a3815fc509b92ed98a585Andrew Sapperstein if (Arg *A = Args.getLastArg(options::OPT_mmacosx_version_min_EQ)) { 555d6eaacbb9eb56763d38a3815fc509b92ed98a585Andrew Sapperstein unsigned Major, Minor, Micro; 5566ba612efffba42bec102ac58a1540496158f747eAndrew Sapperstein bool HadExtra; 557d6eaacbb9eb56763d38a3815fc509b92ed98a585Andrew Sapperstein if (!Driver::GetReleaseVersion(A->getValue(Args), Major, Minor, Micro, 558d6eaacbb9eb56763d38a3815fc509b92ed98a585Andrew Sapperstein HadExtra) || HadExtra || 5596ba612efffba42bec102ac58a1540496158f747eAndrew Sapperstein Major != 10) 560d6eaacbb9eb56763d38a3815fc509b92ed98a585Andrew Sapperstein D.Diag(clang::diag::err_drv_invalid_version_number) 561d6eaacbb9eb56763d38a3815fc509b92ed98a585Andrew Sapperstein << A->getAsString(Args); 562d6eaacbb9eb56763d38a3815fc509b92ed98a585Andrew Sapperstein 563d6eaacbb9eb56763d38a3815fc509b92ed98a585Andrew Sapperstein // Mangle the MacOS version min number into the Darwin number: e.g. 10.3.9 564d6eaacbb9eb56763d38a3815fc509b92ed98a585Andrew Sapperstein // is darwin7.9. 565d6eaacbb9eb56763d38a3815fc509b92ed98a585Andrew Sapperstein llvm::SmallString<16> Str; 566d6eaacbb9eb56763d38a3815fc509b92ed98a585Andrew Sapperstein llvm::raw_svector_ostream(Str) << "darwin" << Minor + 4 << "." << Micro; 567d6eaacbb9eb56763d38a3815fc509b92ed98a585Andrew Sapperstein Triple.setOSName(Str.str()); 568d6eaacbb9eb56763d38a3815fc509b92ed98a585Andrew Sapperstein } else if (Arg *A = Args.getLastArg(options::OPT_miphoneos_version_min_EQ)) { 569d6eaacbb9eb56763d38a3815fc509b92ed98a585Andrew Sapperstein unsigned Major, Minor, Micro; 570d6eaacbb9eb56763d38a3815fc509b92ed98a585Andrew Sapperstein bool HadExtra; 571d6eaacbb9eb56763d38a3815fc509b92ed98a585Andrew Sapperstein if (!Driver::GetReleaseVersion(A->getValue(Args), Major, Minor, Micro, 572d6eaacbb9eb56763d38a3815fc509b92ed98a585Andrew Sapperstein HadExtra) || HadExtra) 5736ba612efffba42bec102ac58a1540496158f747eAndrew Sapperstein D.Diag(clang::diag::err_drv_invalid_version_number) 574d6eaacbb9eb56763d38a3815fc509b92ed98a585Andrew Sapperstein << A->getAsString(Args); 575d6eaacbb9eb56763d38a3815fc509b92ed98a585Andrew Sapperstein 576d6eaacbb9eb56763d38a3815fc509b92ed98a585Andrew Sapperstein // Mangle the iPhoneOS version number into the Darwin number: e.g. 2.0 is 2 577d6eaacbb9eb56763d38a3815fc509b92ed98a585Andrew Sapperstein // -> 9.2.0. 578d6eaacbb9eb56763d38a3815fc509b92ed98a585Andrew Sapperstein llvm::SmallString<16> Str; 579d6eaacbb9eb56763d38a3815fc509b92ed98a585Andrew Sapperstein llvm::raw_svector_ostream(Str) << "darwin9." << Major << "." << Minor; 580d6eaacbb9eb56763d38a3815fc509b92ed98a585Andrew Sapperstein Triple.setOSName(Str.str()); 581d6eaacbb9eb56763d38a3815fc509b92ed98a585Andrew Sapperstein } 582d6eaacbb9eb56763d38a3815fc509b92ed98a585Andrew Sapperstein 583d6eaacbb9eb56763d38a3815fc509b92ed98a585Andrew Sapperstein return Triple.getTriple(); 584d6eaacbb9eb56763d38a3815fc509b92ed98a585Andrew Sapperstein} 585d6eaacbb9eb56763d38a3815fc509b92ed98a585Andrew Sapperstein 586d6eaacbb9eb56763d38a3815fc509b92ed98a585Andrew Sappersteinvoid Clang::ConstructJob(Compilation &C, const JobAction &JA, 587d6eaacbb9eb56763d38a3815fc509b92ed98a585Andrew Sapperstein Job &Dest, 588d6eaacbb9eb56763d38a3815fc509b92ed98a585Andrew Sapperstein const InputInfo &Output, 5896ba612efffba42bec102ac58a1540496158f747eAndrew Sapperstein const InputInfoList &Inputs, 590d6eaacbb9eb56763d38a3815fc509b92ed98a585Andrew Sapperstein const ArgList &Args, 591d6eaacbb9eb56763d38a3815fc509b92ed98a585Andrew Sapperstein const char *LinkingOutput) const { 592d6eaacbb9eb56763d38a3815fc509b92ed98a585Andrew Sapperstein const Driver &D = getToolChain().getHost().getDriver(); 593d6eaacbb9eb56763d38a3815fc509b92ed98a585Andrew Sapperstein ArgStringList CmdArgs; 594d6eaacbb9eb56763d38a3815fc509b92ed98a585Andrew Sapperstein 595d6eaacbb9eb56763d38a3815fc509b92ed98a585Andrew Sapperstein assert(Inputs.size() == 1 && "Unable to handle multiple inputs."); 596d6eaacbb9eb56763d38a3815fc509b92ed98a585Andrew Sapperstein 597d6eaacbb9eb56763d38a3815fc509b92ed98a585Andrew Sapperstein // Invoke ourselves in -cc1 mode. 5986ba612efffba42bec102ac58a1540496158f747eAndrew Sapperstein // 599d6eaacbb9eb56763d38a3815fc509b92ed98a585Andrew Sapperstein // FIXME: Implement custom jobs for internal actions. 600d6eaacbb9eb56763d38a3815fc509b92ed98a585Andrew Sapperstein CmdArgs.push_back("-cc1"); 601d6eaacbb9eb56763d38a3815fc509b92ed98a585Andrew Sapperstein 602d6eaacbb9eb56763d38a3815fc509b92ed98a585Andrew Sapperstein // Add the "effective" target triple. 603d6eaacbb9eb56763d38a3815fc509b92ed98a585Andrew Sapperstein CmdArgs.push_back("-triple"); 604d6eaacbb9eb56763d38a3815fc509b92ed98a585Andrew Sapperstein std::string TripleStr = getEffectiveClangTriple(D, getToolChain(), Args); 605d6eaacbb9eb56763d38a3815fc509b92ed98a585Andrew Sapperstein CmdArgs.push_back(Args.MakeArgString(TripleStr)); 606d6eaacbb9eb56763d38a3815fc509b92ed98a585Andrew Sapperstein 607d6eaacbb9eb56763d38a3815fc509b92ed98a585Andrew Sapperstein // Select the appropriate action. 608d6eaacbb9eb56763d38a3815fc509b92ed98a585Andrew Sapperstein if (isa<AnalyzeJobAction>(JA)) { 609d6eaacbb9eb56763d38a3815fc509b92ed98a585Andrew Sapperstein assert(JA.getType() == types::TY_Plist && "Invalid output type."); 610d6eaacbb9eb56763d38a3815fc509b92ed98a585Andrew Sapperstein CmdArgs.push_back("-analyze"); 6116ba612efffba42bec102ac58a1540496158f747eAndrew Sapperstein } else if (isa<PreprocessJobAction>(JA)) { 612d6eaacbb9eb56763d38a3815fc509b92ed98a585Andrew Sapperstein if (Output.getType() == types::TY_Dependencies) 6136ba612efffba42bec102ac58a1540496158f747eAndrew Sapperstein CmdArgs.push_back("-Eonly"); 614d6eaacbb9eb56763d38a3815fc509b92ed98a585Andrew Sapperstein else 615d6eaacbb9eb56763d38a3815fc509b92ed98a585Andrew Sapperstein CmdArgs.push_back("-E"); 616d6eaacbb9eb56763d38a3815fc509b92ed98a585Andrew Sapperstein } else if (isa<PrecompileJobAction>(JA)) { 617d6eaacbb9eb56763d38a3815fc509b92ed98a585Andrew Sapperstein // Use PCH if the user requested it, except for C++ (for now). 618d6eaacbb9eb56763d38a3815fc509b92ed98a585Andrew Sapperstein bool UsePCH = D.CCCUsePCH; 619d6eaacbb9eb56763d38a3815fc509b92ed98a585Andrew Sapperstein if (types::isCXX(Inputs[0].getType())) 620d6eaacbb9eb56763d38a3815fc509b92ed98a585Andrew Sapperstein UsePCH = false; 621d6eaacbb9eb56763d38a3815fc509b92ed98a585Andrew Sapperstein 622d6eaacbb9eb56763d38a3815fc509b92ed98a585Andrew Sapperstein if (UsePCH) 623d6eaacbb9eb56763d38a3815fc509b92ed98a585Andrew Sapperstein CmdArgs.push_back("-emit-pch"); 624d6eaacbb9eb56763d38a3815fc509b92ed98a585Andrew Sapperstein else 625d6eaacbb9eb56763d38a3815fc509b92ed98a585Andrew Sapperstein CmdArgs.push_back("-emit-pth"); 626d6eaacbb9eb56763d38a3815fc509b92ed98a585Andrew Sapperstein } else { 6276ba612efffba42bec102ac58a1540496158f747eAndrew Sapperstein assert(isa<CompileJobAction>(JA) && "Invalid action for clang tool."); 628d6eaacbb9eb56763d38a3815fc509b92ed98a585Andrew Sapperstein 629d6eaacbb9eb56763d38a3815fc509b92ed98a585Andrew Sapperstein if (JA.getType() == types::TY_Nothing) { 630d6eaacbb9eb56763d38a3815fc509b92ed98a585Andrew Sapperstein CmdArgs.push_back("-fsyntax-only"); 631d6eaacbb9eb56763d38a3815fc509b92ed98a585Andrew Sapperstein } else if (JA.getType() == types::TY_LLVMAsm) { 632d6eaacbb9eb56763d38a3815fc509b92ed98a585Andrew Sapperstein CmdArgs.push_back("-emit-llvm"); 633d6eaacbb9eb56763d38a3815fc509b92ed98a585Andrew Sapperstein } else if (JA.getType() == types::TY_LLVMBC) { 634d6eaacbb9eb56763d38a3815fc509b92ed98a585Andrew Sapperstein CmdArgs.push_back("-emit-llvm-bc"); 635d6eaacbb9eb56763d38a3815fc509b92ed98a585Andrew Sapperstein } else if (JA.getType() == types::TY_PP_Asm) { 636d6eaacbb9eb56763d38a3815fc509b92ed98a585Andrew Sapperstein CmdArgs.push_back("-S"); 637d6eaacbb9eb56763d38a3815fc509b92ed98a585Andrew Sapperstein } else if (JA.getType() == types::TY_AST) { 638d6eaacbb9eb56763d38a3815fc509b92ed98a585Andrew Sapperstein CmdArgs.push_back("-emit-pch"); 639d6eaacbb9eb56763d38a3815fc509b92ed98a585Andrew Sapperstein } 640d6eaacbb9eb56763d38a3815fc509b92ed98a585Andrew Sapperstein } 641d6eaacbb9eb56763d38a3815fc509b92ed98a585Andrew Sapperstein 642d6eaacbb9eb56763d38a3815fc509b92ed98a585Andrew Sapperstein // The make clang go fast button. 643d6eaacbb9eb56763d38a3815fc509b92ed98a585Andrew Sapperstein CmdArgs.push_back("-disable-free"); 644d6eaacbb9eb56763d38a3815fc509b92ed98a585Andrew Sapperstein 645d6eaacbb9eb56763d38a3815fc509b92ed98a585Andrew Sapperstein // Set the main file name, so that debug info works even with 646d6eaacbb9eb56763d38a3815fc509b92ed98a585Andrew Sapperstein // -save-temps. 647d6eaacbb9eb56763d38a3815fc509b92ed98a585Andrew Sapperstein CmdArgs.push_back("-main-file-name"); 6486ba612efffba42bec102ac58a1540496158f747eAndrew Sapperstein CmdArgs.push_back(darwin::CC1::getBaseInputName(Args, Inputs)); 649d6eaacbb9eb56763d38a3815fc509b92ed98a585Andrew Sapperstein 6506ba612efffba42bec102ac58a1540496158f747eAndrew Sapperstein // Some flags which affect the language (via preprocessor 651d6eaacbb9eb56763d38a3815fc509b92ed98a585Andrew Sapperstein // defines). See darwin::CC1::AddCPPArgs. 652d6eaacbb9eb56763d38a3815fc509b92ed98a585Andrew Sapperstein if (Args.hasArg(options::OPT_static)) 653d6eaacbb9eb56763d38a3815fc509b92ed98a585Andrew Sapperstein CmdArgs.push_back("-static-define"); 654d6eaacbb9eb56763d38a3815fc509b92ed98a585Andrew Sapperstein 655d6eaacbb9eb56763d38a3815fc509b92ed98a585Andrew Sapperstein if (isa<AnalyzeJobAction>(JA)) { 656d6eaacbb9eb56763d38a3815fc509b92ed98a585Andrew Sapperstein // Enable region store model by default. 657d6eaacbb9eb56763d38a3815fc509b92ed98a585Andrew Sapperstein CmdArgs.push_back("-analyzer-store=region"); 658d6eaacbb9eb56763d38a3815fc509b92ed98a585Andrew Sapperstein 659d6eaacbb9eb56763d38a3815fc509b92ed98a585Andrew Sapperstein // Treat blocks as analysis entry points. 660d6eaacbb9eb56763d38a3815fc509b92ed98a585Andrew Sapperstein CmdArgs.push_back("-analyzer-opt-analyze-nested-blocks"); 661d6eaacbb9eb56763d38a3815fc509b92ed98a585Andrew Sapperstein 662d6eaacbb9eb56763d38a3815fc509b92ed98a585Andrew Sapperstein // Add default argument set. 663d6eaacbb9eb56763d38a3815fc509b92ed98a585Andrew Sapperstein if (!Args.hasArg(options::OPT__analyzer_no_default_checks)) { 6646ba612efffba42bec102ac58a1540496158f747eAndrew Sapperstein CmdArgs.push_back("-warn-dead-stores"); 665d6eaacbb9eb56763d38a3815fc509b92ed98a585Andrew Sapperstein CmdArgs.push_back("-warn-security-syntactic"); 666d6eaacbb9eb56763d38a3815fc509b92ed98a585Andrew Sapperstein CmdArgs.push_back("-checker-cfref"); 667d6eaacbb9eb56763d38a3815fc509b92ed98a585Andrew Sapperstein CmdArgs.push_back("-analyzer-eagerly-assume"); 668d6eaacbb9eb56763d38a3815fc509b92ed98a585Andrew Sapperstein CmdArgs.push_back("-warn-objc-methodsigs"); 669d6eaacbb9eb56763d38a3815fc509b92ed98a585Andrew Sapperstein // Do not enable the missing -dealloc check. 670d6eaacbb9eb56763d38a3815fc509b92ed98a585Andrew Sapperstein // '-warn-objc-missing-dealloc', 671d6eaacbb9eb56763d38a3815fc509b92ed98a585Andrew Sapperstein CmdArgs.push_back("-warn-objc-unused-ivars"); 672d6eaacbb9eb56763d38a3815fc509b92ed98a585Andrew Sapperstein } 673d6eaacbb9eb56763d38a3815fc509b92ed98a585Andrew Sapperstein 674d6eaacbb9eb56763d38a3815fc509b92ed98a585Andrew Sapperstein // Set the output format. The default is plist, for (lame) historical 675d6eaacbb9eb56763d38a3815fc509b92ed98a585Andrew Sapperstein // reasons. 676d6eaacbb9eb56763d38a3815fc509b92ed98a585Andrew Sapperstein CmdArgs.push_back("-analyzer-output"); 677d6eaacbb9eb56763d38a3815fc509b92ed98a585Andrew Sapperstein if (Arg *A = Args.getLastArg(options::OPT__analyzer_output)) 678d6eaacbb9eb56763d38a3815fc509b92ed98a585Andrew Sapperstein CmdArgs.push_back(A->getValue(Args)); 679d6eaacbb9eb56763d38a3815fc509b92ed98a585Andrew Sapperstein else 680d6eaacbb9eb56763d38a3815fc509b92ed98a585Andrew Sapperstein CmdArgs.push_back("plist"); 681d6eaacbb9eb56763d38a3815fc509b92ed98a585Andrew Sapperstein 682d6eaacbb9eb56763d38a3815fc509b92ed98a585Andrew Sapperstein // Add -Xanalyzer arguments when running as analyzer. 683d6eaacbb9eb56763d38a3815fc509b92ed98a585Andrew Sapperstein Args.AddAllArgValues(CmdArgs, options::OPT_Xanalyzer); 6846ba612efffba42bec102ac58a1540496158f747eAndrew Sapperstein } 685d6eaacbb9eb56763d38a3815fc509b92ed98a585Andrew Sapperstein 686d6eaacbb9eb56763d38a3815fc509b92ed98a585Andrew Sapperstein CheckCodeGenerationOptions(D, Args); 6876ba612efffba42bec102ac58a1540496158f747eAndrew Sapperstein 688d6eaacbb9eb56763d38a3815fc509b92ed98a585Andrew Sapperstein // Perform argument translation for LLVM backend. This 689d6eaacbb9eb56763d38a3815fc509b92ed98a585Andrew Sapperstein // takes some care in reconciling with llvm-gcc. The 690d6eaacbb9eb56763d38a3815fc509b92ed98a585Andrew Sapperstein // issue is that llvm-gcc translates these options based on 691d6eaacbb9eb56763d38a3815fc509b92ed98a585Andrew Sapperstein // the values in cc1, whereas we are processing based on 692d6eaacbb9eb56763d38a3815fc509b92ed98a585Andrew Sapperstein // the driver arguments. 693d6eaacbb9eb56763d38a3815fc509b92ed98a585Andrew Sapperstein 694d6eaacbb9eb56763d38a3815fc509b92ed98a585Andrew Sapperstein // This comes from the default translation the driver + cc1 695d6eaacbb9eb56763d38a3815fc509b92ed98a585Andrew Sapperstein // would do to enable flag_pic. 696d6eaacbb9eb56763d38a3815fc509b92ed98a585Andrew Sapperstein // 697d6eaacbb9eb56763d38a3815fc509b92ed98a585Andrew Sapperstein // FIXME: Centralize this code. 698d6eaacbb9eb56763d38a3815fc509b92ed98a585Andrew Sapperstein bool PICEnabled = (Args.hasArg(options::OPT_fPIC) || 699d6eaacbb9eb56763d38a3815fc509b92ed98a585Andrew Sapperstein Args.hasArg(options::OPT_fpic) || 7006ba612efffba42bec102ac58a1540496158f747eAndrew Sapperstein Args.hasArg(options::OPT_fPIE) || 701d6eaacbb9eb56763d38a3815fc509b92ed98a585Andrew Sapperstein Args.hasArg(options::OPT_fpie)); 702d6eaacbb9eb56763d38a3815fc509b92ed98a585Andrew Sapperstein bool PICDisabled = (Args.hasArg(options::OPT_mkernel) || 703d6eaacbb9eb56763d38a3815fc509b92ed98a585Andrew Sapperstein Args.hasArg(options::OPT_static)); 704d6eaacbb9eb56763d38a3815fc509b92ed98a585Andrew Sapperstein const char *Model = getToolChain().GetForcedPicModel(); 705d6eaacbb9eb56763d38a3815fc509b92ed98a585Andrew Sapperstein if (!Model) { 706d6eaacbb9eb56763d38a3815fc509b92ed98a585Andrew Sapperstein if (Args.hasArg(options::OPT_mdynamic_no_pic)) 707d6eaacbb9eb56763d38a3815fc509b92ed98a585Andrew Sapperstein Model = "dynamic-no-pic"; 708d6eaacbb9eb56763d38a3815fc509b92ed98a585Andrew Sapperstein else if (PICDisabled) 709d6eaacbb9eb56763d38a3815fc509b92ed98a585Andrew Sapperstein Model = "static"; 710d6eaacbb9eb56763d38a3815fc509b92ed98a585Andrew Sapperstein else if (PICEnabled) 711d6eaacbb9eb56763d38a3815fc509b92ed98a585Andrew Sapperstein Model = "pic"; 7126ba612efffba42bec102ac58a1540496158f747eAndrew Sapperstein else 713d6eaacbb9eb56763d38a3815fc509b92ed98a585Andrew Sapperstein Model = getToolChain().GetDefaultRelocationModel(); 714d6eaacbb9eb56763d38a3815fc509b92ed98a585Andrew Sapperstein } 715d6eaacbb9eb56763d38a3815fc509b92ed98a585Andrew Sapperstein if (llvm::StringRef(Model) != "pic") { 716d6eaacbb9eb56763d38a3815fc509b92ed98a585Andrew Sapperstein CmdArgs.push_back("-mrelocation-model"); 717d6eaacbb9eb56763d38a3815fc509b92ed98a585Andrew Sapperstein CmdArgs.push_back(Model); 718d6eaacbb9eb56763d38a3815fc509b92ed98a585Andrew Sapperstein } 719d6eaacbb9eb56763d38a3815fc509b92ed98a585Andrew Sapperstein 720d6eaacbb9eb56763d38a3815fc509b92ed98a585Andrew Sapperstein // Infer the __PIC__ value. 721d6eaacbb9eb56763d38a3815fc509b92ed98a585Andrew Sapperstein // 722d6eaacbb9eb56763d38a3815fc509b92ed98a585Andrew Sapperstein // FIXME: This isn't quite right on Darwin, which always sets 723d6eaacbb9eb56763d38a3815fc509b92ed98a585Andrew Sapperstein // __PIC__=2. 724d6eaacbb9eb56763d38a3815fc509b92ed98a585Andrew Sapperstein if (strcmp(Model, "pic") == 0 || strcmp(Model, "dynamic-no-pic") == 0) { 725d6eaacbb9eb56763d38a3815fc509b92ed98a585Andrew Sapperstein CmdArgs.push_back("-pic-level"); 726d6eaacbb9eb56763d38a3815fc509b92ed98a585Andrew Sapperstein CmdArgs.push_back(Args.hasArg(options::OPT_fPIC) ? "2" : "1"); 727d6eaacbb9eb56763d38a3815fc509b92ed98a585Andrew Sapperstein } 728d6eaacbb9eb56763d38a3815fc509b92ed98a585Andrew Sapperstein if (!Args.hasFlag(options::OPT_fmerge_all_constants, 729d6eaacbb9eb56763d38a3815fc509b92ed98a585Andrew Sapperstein options::OPT_fno_merge_all_constants)) 7306ba612efffba42bec102ac58a1540496158f747eAndrew Sapperstein CmdArgs.push_back("-no-merge-all-constants"); 731d6eaacbb9eb56763d38a3815fc509b92ed98a585Andrew Sapperstein 7326ba612efffba42bec102ac58a1540496158f747eAndrew Sapperstein // LLVM Code Generator Options. 7336ba612efffba42bec102ac58a1540496158f747eAndrew Sapperstein 734d6eaacbb9eb56763d38a3815fc509b92ed98a585Andrew Sapperstein // FIXME: Set --enable-unsafe-fp-math. 735d6eaacbb9eb56763d38a3815fc509b92ed98a585Andrew Sapperstein if (Args.hasFlag(options::OPT_fno_omit_frame_pointer, 736d6eaacbb9eb56763d38a3815fc509b92ed98a585Andrew Sapperstein options::OPT_fomit_frame_pointer)) 737d6eaacbb9eb56763d38a3815fc509b92ed98a585Andrew Sapperstein CmdArgs.push_back("-mdisable-fp-elim"); 738d6eaacbb9eb56763d38a3815fc509b92ed98a585Andrew Sapperstein if (!Args.hasFlag(options::OPT_fzero_initialized_in_bss, 739d6eaacbb9eb56763d38a3815fc509b92ed98a585Andrew Sapperstein options::OPT_fno_zero_initialized_in_bss)) 740d6eaacbb9eb56763d38a3815fc509b92ed98a585Andrew Sapperstein CmdArgs.push_back("-mno-zero-initialized-in-bss"); 7416ba612efffba42bec102ac58a1540496158f747eAndrew Sapperstein if (Args.hasArg(options::OPT_dA) || Args.hasArg(options::OPT_fverbose_asm)) 742d6eaacbb9eb56763d38a3815fc509b92ed98a585Andrew Sapperstein CmdArgs.push_back("-masm-verbose"); 7436ba612efffba42bec102ac58a1540496158f747eAndrew Sapperstein if (Args.hasArg(options::OPT_fdebug_pass_structure)) { 7446ba612efffba42bec102ac58a1540496158f747eAndrew Sapperstein CmdArgs.push_back("-mdebug-pass"); 745d6eaacbb9eb56763d38a3815fc509b92ed98a585Andrew Sapperstein CmdArgs.push_back("Structure"); 746d6eaacbb9eb56763d38a3815fc509b92ed98a585Andrew Sapperstein } 7476ba612efffba42bec102ac58a1540496158f747eAndrew Sapperstein if (Args.hasArg(options::OPT_fdebug_pass_arguments)) { 748d6eaacbb9eb56763d38a3815fc509b92ed98a585Andrew Sapperstein CmdArgs.push_back("-mdebug-pass"); 749d6eaacbb9eb56763d38a3815fc509b92ed98a585Andrew Sapperstein CmdArgs.push_back("Arguments"); 750d6eaacbb9eb56763d38a3815fc509b92ed98a585Andrew Sapperstein } 751d6eaacbb9eb56763d38a3815fc509b92ed98a585Andrew Sapperstein 752d6eaacbb9eb56763d38a3815fc509b92ed98a585Andrew Sapperstein // This is a coarse approximation of what llvm-gcc actually does, both 753d6eaacbb9eb56763d38a3815fc509b92ed98a585Andrew Sapperstein // -fasynchronous-unwind-tables and -fnon-call-exceptions interact in more 754d6eaacbb9eb56763d38a3815fc509b92ed98a585Andrew Sapperstein // complicated ways. 755d6eaacbb9eb56763d38a3815fc509b92ed98a585Andrew Sapperstein bool AsynchronousUnwindTables = 756d6eaacbb9eb56763d38a3815fc509b92ed98a585Andrew Sapperstein Args.hasFlag(options::OPT_fasynchronous_unwind_tables, 757d6eaacbb9eb56763d38a3815fc509b92ed98a585Andrew Sapperstein options::OPT_fno_asynchronous_unwind_tables, 758d6eaacbb9eb56763d38a3815fc509b92ed98a585Andrew Sapperstein getToolChain().IsUnwindTablesDefault() && 759d6eaacbb9eb56763d38a3815fc509b92ed98a585Andrew Sapperstein !Args.hasArg(options::OPT_mkernel)); 7606ba612efffba42bec102ac58a1540496158f747eAndrew Sapperstein if (Args.hasFlag(options::OPT_funwind_tables, options::OPT_fno_unwind_tables, 761d6eaacbb9eb56763d38a3815fc509b92ed98a585Andrew Sapperstein AsynchronousUnwindTables)) 762d6eaacbb9eb56763d38a3815fc509b92ed98a585Andrew Sapperstein CmdArgs.push_back("-munwind-tables"); 763d6eaacbb9eb56763d38a3815fc509b92ed98a585Andrew Sapperstein 764d6eaacbb9eb56763d38a3815fc509b92ed98a585Andrew Sapperstein if (Arg *A = Args.getLastArg(options::OPT_flimited_precision_EQ)) { 765d6eaacbb9eb56763d38a3815fc509b92ed98a585Andrew Sapperstein CmdArgs.push_back("-mlimit-float-precision"); 766d6eaacbb9eb56763d38a3815fc509b92ed98a585Andrew Sapperstein CmdArgs.push_back(A->getValue(Args)); 767d6eaacbb9eb56763d38a3815fc509b92ed98a585Andrew Sapperstein } 768d6eaacbb9eb56763d38a3815fc509b92ed98a585Andrew Sapperstein 769d6eaacbb9eb56763d38a3815fc509b92ed98a585Andrew Sapperstein // FIXME: Handle -mtune=. 770d6eaacbb9eb56763d38a3815fc509b92ed98a585Andrew Sapperstein (void) Args.hasArg(options::OPT_mtune_EQ); 771d6eaacbb9eb56763d38a3815fc509b92ed98a585Andrew Sapperstein 772d6eaacbb9eb56763d38a3815fc509b92ed98a585Andrew Sapperstein if (Arg *A = Args.getLastArg(options::OPT_mcmodel_EQ)) { 773d6eaacbb9eb56763d38a3815fc509b92ed98a585Andrew Sapperstein CmdArgs.push_back("-mcode-model"); 774d6eaacbb9eb56763d38a3815fc509b92ed98a585Andrew Sapperstein CmdArgs.push_back(A->getValue(Args)); 775d6eaacbb9eb56763d38a3815fc509b92ed98a585Andrew Sapperstein } 776d6eaacbb9eb56763d38a3815fc509b92ed98a585Andrew Sapperstein 777d6eaacbb9eb56763d38a3815fc509b92ed98a585Andrew Sapperstein // Add target specific cpu and features flags. 778d6eaacbb9eb56763d38a3815fc509b92ed98a585Andrew Sapperstein switch(getToolChain().getTriple().getArch()) { 779d6eaacbb9eb56763d38a3815fc509b92ed98a585Andrew Sapperstein default: 780d6eaacbb9eb56763d38a3815fc509b92ed98a585Andrew Sapperstein break; 781d6eaacbb9eb56763d38a3815fc509b92ed98a585Andrew Sapperstein 782d6eaacbb9eb56763d38a3815fc509b92ed98a585Andrew Sapperstein case llvm::Triple::arm: 783d6eaacbb9eb56763d38a3815fc509b92ed98a585Andrew Sapperstein case llvm::Triple::thumb: 784d6eaacbb9eb56763d38a3815fc509b92ed98a585Andrew Sapperstein AddARMTargetArgs(Args, CmdArgs); 785d6eaacbb9eb56763d38a3815fc509b92ed98a585Andrew Sapperstein break; 786d6eaacbb9eb56763d38a3815fc509b92ed98a585Andrew Sapperstein 787d6eaacbb9eb56763d38a3815fc509b92ed98a585Andrew Sapperstein case llvm::Triple::x86: 788d6eaacbb9eb56763d38a3815fc509b92ed98a585Andrew Sapperstein case llvm::Triple::x86_64: 789d6eaacbb9eb56763d38a3815fc509b92ed98a585Andrew Sapperstein AddX86TargetArgs(Args, CmdArgs); 7906ba612efffba42bec102ac58a1540496158f747eAndrew Sapperstein break; 791d6eaacbb9eb56763d38a3815fc509b92ed98a585Andrew Sapperstein } 792d6eaacbb9eb56763d38a3815fc509b92ed98a585Andrew Sapperstein 793d6eaacbb9eb56763d38a3815fc509b92ed98a585Andrew Sapperstein // -fmath-errno is default. 794d6eaacbb9eb56763d38a3815fc509b92ed98a585Andrew Sapperstein if (!Args.hasFlag(options::OPT_fmath_errno, 795d6eaacbb9eb56763d38a3815fc509b92ed98a585Andrew Sapperstein options::OPT_fno_math_errno, 796d6eaacbb9eb56763d38a3815fc509b92ed98a585Andrew Sapperstein getToolChain().IsMathErrnoDefault())) 797d6eaacbb9eb56763d38a3815fc509b92ed98a585Andrew Sapperstein CmdArgs.push_back("-fno-math-errno"); 798d6eaacbb9eb56763d38a3815fc509b92ed98a585Andrew Sapperstein 7996ba612efffba42bec102ac58a1540496158f747eAndrew Sapperstein Arg *Unsupported; 800d6eaacbb9eb56763d38a3815fc509b92ed98a585Andrew Sapperstein if ((Unsupported = Args.getLastArg(options::OPT_MG)) || 801d6eaacbb9eb56763d38a3815fc509b92ed98a585Andrew Sapperstein (Unsupported = Args.getLastArg(options::OPT_MQ)) || 802d6eaacbb9eb56763d38a3815fc509b92ed98a585Andrew Sapperstein (Unsupported = Args.getLastArg(options::OPT_iframework)) || 803d6eaacbb9eb56763d38a3815fc509b92ed98a585Andrew Sapperstein (Unsupported = Args.getLastArg(options::OPT_fshort_enums))) 804d6eaacbb9eb56763d38a3815fc509b92ed98a585Andrew Sapperstein D.Diag(clang::diag::err_drv_clang_unsupported) 805d6eaacbb9eb56763d38a3815fc509b92ed98a585Andrew Sapperstein << Unsupported->getOption().getName(); 806d6eaacbb9eb56763d38a3815fc509b92ed98a585Andrew Sapperstein 807d6eaacbb9eb56763d38a3815fc509b92ed98a585Andrew Sapperstein Args.AddAllArgs(CmdArgs, options::OPT_v); 808d6eaacbb9eb56763d38a3815fc509b92ed98a585Andrew Sapperstein Args.AddLastArg(CmdArgs, options::OPT_P); 809d6eaacbb9eb56763d38a3815fc509b92ed98a585Andrew Sapperstein Args.AddLastArg(CmdArgs, options::OPT_print_ivar_layout); 810d6eaacbb9eb56763d38a3815fc509b92ed98a585Andrew Sapperstein 811d6eaacbb9eb56763d38a3815fc509b92ed98a585Andrew Sapperstein // Special case debug options to only pass -g to clang. This is 812d6eaacbb9eb56763d38a3815fc509b92ed98a585Andrew Sapperstein // wrong. 813d6eaacbb9eb56763d38a3815fc509b92ed98a585Andrew Sapperstein if (Args.hasArg(options::OPT_g_Group)) 814d6eaacbb9eb56763d38a3815fc509b92ed98a585Andrew Sapperstein CmdArgs.push_back("-g"); 815d6eaacbb9eb56763d38a3815fc509b92ed98a585Andrew Sapperstein 8166ba612efffba42bec102ac58a1540496158f747eAndrew Sapperstein Args.AddLastArg(CmdArgs, options::OPT_nostdinc); 817d6eaacbb9eb56763d38a3815fc509b92ed98a585Andrew Sapperstein Args.AddLastArg(CmdArgs, options::OPT_nobuiltininc); 818d6eaacbb9eb56763d38a3815fc509b92ed98a585Andrew Sapperstein 819d6eaacbb9eb56763d38a3815fc509b92ed98a585Andrew Sapperstein // Pass the path to compiler resource files. 820d6eaacbb9eb56763d38a3815fc509b92ed98a585Andrew Sapperstein // 821d6eaacbb9eb56763d38a3815fc509b92ed98a585Andrew Sapperstein // FIXME: Get this from a configuration object. 822d6eaacbb9eb56763d38a3815fc509b92ed98a585Andrew Sapperstein llvm::sys::Path P(D.Dir); 823d6eaacbb9eb56763d38a3815fc509b92ed98a585Andrew Sapperstein P.eraseComponent(); // Remove /bin from foo/bin 824d6eaacbb9eb56763d38a3815fc509b92ed98a585Andrew Sapperstein P.appendComponent("lib"); 825d6eaacbb9eb56763d38a3815fc509b92ed98a585Andrew Sapperstein P.appendComponent("clang"); 826d6eaacbb9eb56763d38a3815fc509b92ed98a585Andrew Sapperstein P.appendComponent(CLANG_VERSION_STRING); 827d6eaacbb9eb56763d38a3815fc509b92ed98a585Andrew Sapperstein CmdArgs.push_back("-resource-dir"); 828d6eaacbb9eb56763d38a3815fc509b92ed98a585Andrew Sapperstein CmdArgs.push_back(Args.MakeArgString(P.str())); 829d6eaacbb9eb56763d38a3815fc509b92ed98a585Andrew Sapperstein 8306ba612efffba42bec102ac58a1540496158f747eAndrew Sapperstein // Add preprocessing options like -I, -D, etc. if we are using the 831d6eaacbb9eb56763d38a3815fc509b92ed98a585Andrew Sapperstein // preprocessor. 832d6eaacbb9eb56763d38a3815fc509b92ed98a585Andrew Sapperstein // 833d6eaacbb9eb56763d38a3815fc509b92ed98a585Andrew Sapperstein // FIXME: Support -fpreprocessed 834d6eaacbb9eb56763d38a3815fc509b92ed98a585Andrew Sapperstein types::ID InputType = Inputs[0].getType(); 835d6eaacbb9eb56763d38a3815fc509b92ed98a585Andrew Sapperstein if (types::getPreprocessedType(InputType) != types::TY_INVALID) 836d6eaacbb9eb56763d38a3815fc509b92ed98a585Andrew Sapperstein AddPreprocessingOptions(D, Args, CmdArgs, Output, Inputs); 837d6eaacbb9eb56763d38a3815fc509b92ed98a585Andrew Sapperstein 838d6eaacbb9eb56763d38a3815fc509b92ed98a585Andrew Sapperstein // Manually translate -O to -O2 and -O4 to -O3; let clang reject 839d6eaacbb9eb56763d38a3815fc509b92ed98a585Andrew Sapperstein // others. 840d6eaacbb9eb56763d38a3815fc509b92ed98a585Andrew Sapperstein if (Arg *A = Args.getLastArg(options::OPT_O_Group)) { 841d6eaacbb9eb56763d38a3815fc509b92ed98a585Andrew Sapperstein if (A->getOption().matches(options::OPT_O4)) 842d6eaacbb9eb56763d38a3815fc509b92ed98a585Andrew Sapperstein CmdArgs.push_back("-O3"); 843d6eaacbb9eb56763d38a3815fc509b92ed98a585Andrew Sapperstein else if (A->getValue(Args)[0] == '\0') 844d6eaacbb9eb56763d38a3815fc509b92ed98a585Andrew Sapperstein CmdArgs.push_back("-O2"); 845d6eaacbb9eb56763d38a3815fc509b92ed98a585Andrew Sapperstein else 846d6eaacbb9eb56763d38a3815fc509b92ed98a585Andrew Sapperstein A->render(Args, CmdArgs); 847d6eaacbb9eb56763d38a3815fc509b92ed98a585Andrew Sapperstein } 848d6eaacbb9eb56763d38a3815fc509b92ed98a585Andrew Sapperstein 849d6eaacbb9eb56763d38a3815fc509b92ed98a585Andrew Sapperstein Args.AddAllArgs(CmdArgs, options::OPT_W_Group); 850d6eaacbb9eb56763d38a3815fc509b92ed98a585Andrew Sapperstein Args.AddLastArg(CmdArgs, options::OPT_pedantic); 851d6eaacbb9eb56763d38a3815fc509b92ed98a585Andrew Sapperstein Args.AddLastArg(CmdArgs, options::OPT_pedantic_errors); 852d6eaacbb9eb56763d38a3815fc509b92ed98a585Andrew Sapperstein Args.AddLastArg(CmdArgs, options::OPT_w); 853d6eaacbb9eb56763d38a3815fc509b92ed98a585Andrew Sapperstein 854d6eaacbb9eb56763d38a3815fc509b92ed98a585Andrew Sapperstein // Handle -{std, ansi, trigraphs} -- take the last of -{std, ansi} 855d6eaacbb9eb56763d38a3815fc509b92ed98a585Andrew Sapperstein // (-ansi is equivalent to -std=c89). 856d6eaacbb9eb56763d38a3815fc509b92ed98a585Andrew Sapperstein // 857d6eaacbb9eb56763d38a3815fc509b92ed98a585Andrew Sapperstein // If a std is supplied, only add -trigraphs if it follows the 858d6eaacbb9eb56763d38a3815fc509b92ed98a585Andrew Sapperstein // option. 859d6eaacbb9eb56763d38a3815fc509b92ed98a585Andrew Sapperstein if (Arg *Std = Args.getLastArg(options::OPT_std_EQ, options::OPT_ansi)) { 8606ba612efffba42bec102ac58a1540496158f747eAndrew Sapperstein if (Std->getOption().matches(options::OPT_ansi)) 8616ba612efffba42bec102ac58a1540496158f747eAndrew Sapperstein if (types::isCXX(InputType)) 862d6eaacbb9eb56763d38a3815fc509b92ed98a585Andrew Sapperstein CmdArgs.push_back("-std=c++98"); 863d6eaacbb9eb56763d38a3815fc509b92ed98a585Andrew Sapperstein else 864d6eaacbb9eb56763d38a3815fc509b92ed98a585Andrew Sapperstein CmdArgs.push_back("-std=c89"); 865d6eaacbb9eb56763d38a3815fc509b92ed98a585Andrew Sapperstein else 866d6eaacbb9eb56763d38a3815fc509b92ed98a585Andrew Sapperstein Std->render(Args, CmdArgs); 867d6eaacbb9eb56763d38a3815fc509b92ed98a585Andrew Sapperstein 868d6eaacbb9eb56763d38a3815fc509b92ed98a585Andrew Sapperstein if (Arg *A = Args.getLastArg(options::OPT_trigraphs)) 869d6eaacbb9eb56763d38a3815fc509b92ed98a585Andrew Sapperstein if (A->getIndex() > Std->getIndex()) 870d6eaacbb9eb56763d38a3815fc509b92ed98a585Andrew Sapperstein A->render(Args, CmdArgs); 871d6eaacbb9eb56763d38a3815fc509b92ed98a585Andrew Sapperstein } else { 8726ba612efffba42bec102ac58a1540496158f747eAndrew Sapperstein // Honor -std-default. 873d6eaacbb9eb56763d38a3815fc509b92ed98a585Andrew Sapperstein Args.AddAllArgsTranslated(CmdArgs, options::OPT_std_default_EQ, 874d6eaacbb9eb56763d38a3815fc509b92ed98a585Andrew Sapperstein "-std=", /*Joined=*/true); 875d6eaacbb9eb56763d38a3815fc509b92ed98a585Andrew Sapperstein Args.AddLastArg(CmdArgs, options::OPT_trigraphs); 876d6eaacbb9eb56763d38a3815fc509b92ed98a585Andrew Sapperstein } 877d6eaacbb9eb56763d38a3815fc509b92ed98a585Andrew Sapperstein 878d6eaacbb9eb56763d38a3815fc509b92ed98a585Andrew Sapperstein if (Arg *A = Args.getLastArg(options::OPT_ftemplate_depth_)) { 879d6eaacbb9eb56763d38a3815fc509b92ed98a585Andrew Sapperstein CmdArgs.push_back("-ftemplate-depth"); 880d6eaacbb9eb56763d38a3815fc509b92ed98a585Andrew Sapperstein CmdArgs.push_back(A->getValue(Args)); 8816ba612efffba42bec102ac58a1540496158f747eAndrew Sapperstein } 882d6eaacbb9eb56763d38a3815fc509b92ed98a585Andrew Sapperstein 883d6eaacbb9eb56763d38a3815fc509b92ed98a585Andrew Sapperstein if (Args.hasArg(options::OPT__relocatable_pch)) 884d6eaacbb9eb56763d38a3815fc509b92ed98a585Andrew Sapperstein CmdArgs.push_back("-relocatable-pch"); 885d6eaacbb9eb56763d38a3815fc509b92ed98a585Andrew Sapperstein 886d6eaacbb9eb56763d38a3815fc509b92ed98a585Andrew Sapperstein if (Arg *A = Args.getLastArg(options::OPT_fconstant_string_class_EQ)) { 887d6eaacbb9eb56763d38a3815fc509b92ed98a585Andrew Sapperstein CmdArgs.push_back("-fconstant-string-class"); 888d6eaacbb9eb56763d38a3815fc509b92ed98a585Andrew Sapperstein CmdArgs.push_back(A->getValue(Args)); 889d6eaacbb9eb56763d38a3815fc509b92ed98a585Andrew Sapperstein } 890d6eaacbb9eb56763d38a3815fc509b92ed98a585Andrew Sapperstein 891d6eaacbb9eb56763d38a3815fc509b92ed98a585Andrew Sapperstein // Pass -fmessage-length=. 892d6eaacbb9eb56763d38a3815fc509b92ed98a585Andrew Sapperstein CmdArgs.push_back("-fmessage-length"); 893d6eaacbb9eb56763d38a3815fc509b92ed98a585Andrew Sapperstein if (Arg *A = Args.getLastArg(options::OPT_fmessage_length_EQ)) { 894d6eaacbb9eb56763d38a3815fc509b92ed98a585Andrew Sapperstein CmdArgs.push_back(A->getValue(Args)); 895d6eaacbb9eb56763d38a3815fc509b92ed98a585Andrew Sapperstein } else { 896d6eaacbb9eb56763d38a3815fc509b92ed98a585Andrew Sapperstein // If -fmessage-length=N was not specified, determine whether this is a 897d6eaacbb9eb56763d38a3815fc509b92ed98a585Andrew Sapperstein // terminal and, if so, implicitly define -fmessage-length appropriately. 8986ba612efffba42bec102ac58a1540496158f747eAndrew Sapperstein unsigned N = llvm::sys::Process::StandardErrColumns(); 899d6eaacbb9eb56763d38a3815fc509b92ed98a585Andrew Sapperstein CmdArgs.push_back(Args.MakeArgString(llvm::Twine(N))); 900d6eaacbb9eb56763d38a3815fc509b92ed98a585Andrew Sapperstein } 901d6eaacbb9eb56763d38a3815fc509b92ed98a585Andrew Sapperstein 902d6eaacbb9eb56763d38a3815fc509b92ed98a585Andrew Sapperstein if (const Arg *A = Args.getLastArg(options::OPT_fvisibility_EQ)) { 903d6eaacbb9eb56763d38a3815fc509b92ed98a585Andrew Sapperstein CmdArgs.push_back("-fvisibility"); 904d6eaacbb9eb56763d38a3815fc509b92ed98a585Andrew Sapperstein CmdArgs.push_back(A->getValue(Args)); 905d6eaacbb9eb56763d38a3815fc509b92ed98a585Andrew Sapperstein } 906d6eaacbb9eb56763d38a3815fc509b92ed98a585Andrew Sapperstein 907d6eaacbb9eb56763d38a3815fc509b92ed98a585Andrew Sapperstein // Forward -f (flag) options which we can pass directly. 908d6eaacbb9eb56763d38a3815fc509b92ed98a585Andrew Sapperstein Args.AddLastArg(CmdArgs, options::OPT_fcatch_undefined_behavior); 909d6eaacbb9eb56763d38a3815fc509b92ed98a585Andrew Sapperstein Args.AddLastArg(CmdArgs, options::OPT_femit_all_decls); 910d6eaacbb9eb56763d38a3815fc509b92ed98a585Andrew Sapperstein Args.AddLastArg(CmdArgs, options::OPT_ffreestanding); 911d6eaacbb9eb56763d38a3815fc509b92ed98a585Andrew Sapperstein Args.AddLastArg(CmdArgs, options::OPT_fheinous_gnu_extensions); 9126ba612efffba42bec102ac58a1540496158f747eAndrew Sapperstein Args.AddLastArg(CmdArgs, options::OPT_flax_vector_conversions); 913d6eaacbb9eb56763d38a3815fc509b92ed98a585Andrew Sapperstein Args.AddLastArg(CmdArgs, options::OPT_fno_caret_diagnostics); 914d6eaacbb9eb56763d38a3815fc509b92ed98a585Andrew Sapperstein Args.AddLastArg(CmdArgs, options::OPT_fno_show_column); 915d6eaacbb9eb56763d38a3815fc509b92ed98a585Andrew Sapperstein Args.AddLastArg(CmdArgs, options::OPT_fobjc_gc_only); 916d6eaacbb9eb56763d38a3815fc509b92ed98a585Andrew Sapperstein Args.AddLastArg(CmdArgs, options::OPT_fobjc_gc); 917d6eaacbb9eb56763d38a3815fc509b92ed98a585Andrew Sapperstein Args.AddLastArg(CmdArgs, options::OPT_fobjc_sender_dependent_dispatch); 918d6eaacbb9eb56763d38a3815fc509b92ed98a585Andrew Sapperstein Args.AddLastArg(CmdArgs, options::OPT_fdiagnostics_print_source_range_info); 919d6eaacbb9eb56763d38a3815fc509b92ed98a585Andrew Sapperstein Args.AddLastArg(CmdArgs, options::OPT_ftime_report); 920d6eaacbb9eb56763d38a3815fc509b92ed98a585Andrew Sapperstein Args.AddLastArg(CmdArgs, options::OPT_ftrapv); 921d6eaacbb9eb56763d38a3815fc509b92ed98a585Andrew Sapperstein Args.AddLastArg(CmdArgs, options::OPT_fwritable_strings); 922d6eaacbb9eb56763d38a3815fc509b92ed98a585Andrew Sapperstein 923d6eaacbb9eb56763d38a3815fc509b92ed98a585Andrew Sapperstein Args.AddLastArg(CmdArgs, options::OPT_pthread); 924d6eaacbb9eb56763d38a3815fc509b92ed98a585Andrew Sapperstein 925d6eaacbb9eb56763d38a3815fc509b92ed98a585Andrew Sapperstein // -stack-protector=0 is default. 926d6eaacbb9eb56763d38a3815fc509b92ed98a585Andrew Sapperstein unsigned StackProtectorLevel = 0; 927d6eaacbb9eb56763d38a3815fc509b92ed98a585Andrew Sapperstein if (Arg *A = Args.getLastArg(options::OPT_fno_stack_protector, 928d6eaacbb9eb56763d38a3815fc509b92ed98a585Andrew Sapperstein options::OPT_fstack_protector_all, 929d6eaacbb9eb56763d38a3815fc509b92ed98a585Andrew Sapperstein options::OPT_fstack_protector)) { 930d6eaacbb9eb56763d38a3815fc509b92ed98a585Andrew Sapperstein if (A->getOption().matches(options::OPT_fstack_protector)) 931d6eaacbb9eb56763d38a3815fc509b92ed98a585Andrew Sapperstein StackProtectorLevel = 1; 932d6eaacbb9eb56763d38a3815fc509b92ed98a585Andrew Sapperstein else if (A->getOption().matches(options::OPT_fstack_protector_all)) 933d6eaacbb9eb56763d38a3815fc509b92ed98a585Andrew Sapperstein StackProtectorLevel = 2; 934d6eaacbb9eb56763d38a3815fc509b92ed98a585Andrew Sapperstein } else 935d6eaacbb9eb56763d38a3815fc509b92ed98a585Andrew Sapperstein StackProtectorLevel = getToolChain().GetDefaultStackProtectorLevel(); 936d6eaacbb9eb56763d38a3815fc509b92ed98a585Andrew Sapperstein if (StackProtectorLevel) { 937d6eaacbb9eb56763d38a3815fc509b92ed98a585Andrew Sapperstein CmdArgs.push_back("-stack-protector"); 938d6eaacbb9eb56763d38a3815fc509b92ed98a585Andrew Sapperstein CmdArgs.push_back(Args.MakeArgString(llvm::Twine(StackProtectorLevel))); 939d6eaacbb9eb56763d38a3815fc509b92ed98a585Andrew Sapperstein } 9406ba612efffba42bec102ac58a1540496158f747eAndrew Sapperstein 9416ba612efffba42bec102ac58a1540496158f747eAndrew Sapperstein // Forward -f options with positive and negative forms; we translate 942d6eaacbb9eb56763d38a3815fc509b92ed98a585Andrew Sapperstein // these by hand. 943d6eaacbb9eb56763d38a3815fc509b92ed98a585Andrew Sapperstein 944d6eaacbb9eb56763d38a3815fc509b92ed98a585Andrew Sapperstein // -fbuiltin is default. 945d6eaacbb9eb56763d38a3815fc509b92ed98a585Andrew Sapperstein if (!Args.hasFlag(options::OPT_fbuiltin, options::OPT_fno_builtin)) 946d6eaacbb9eb56763d38a3815fc509b92ed98a585Andrew Sapperstein CmdArgs.push_back("-fno-builtin"); 947d6eaacbb9eb56763d38a3815fc509b92ed98a585Andrew Sapperstein 948d6eaacbb9eb56763d38a3815fc509b92ed98a585Andrew Sapperstein if (!Args.hasFlag(options::OPT_fassume_sane_operator_new, 949d6eaacbb9eb56763d38a3815fc509b92ed98a585Andrew Sapperstein options::OPT_fno_assume_sane_operator_new)) 950d6eaacbb9eb56763d38a3815fc509b92ed98a585Andrew Sapperstein CmdArgs.push_back("-fno-assume-sane-operator-new"); 951d6eaacbb9eb56763d38a3815fc509b92ed98a585Andrew Sapperstein 952d6eaacbb9eb56763d38a3815fc509b92ed98a585Andrew Sapperstein // -fblocks=0 is default. 953d6eaacbb9eb56763d38a3815fc509b92ed98a585Andrew Sapperstein if (Args.hasFlag(options::OPT_fblocks, options::OPT_fno_blocks, 954d6eaacbb9eb56763d38a3815fc509b92ed98a585Andrew Sapperstein getToolChain().IsBlocksDefault())) { 955d6eaacbb9eb56763d38a3815fc509b92ed98a585Andrew Sapperstein Args.AddLastArg(CmdArgs, options::OPT_fblock_introspection); 956d6eaacbb9eb56763d38a3815fc509b92ed98a585Andrew Sapperstein CmdArgs.push_back("-fblocks"); 957d6eaacbb9eb56763d38a3815fc509b92ed98a585Andrew Sapperstein } 958d6eaacbb9eb56763d38a3815fc509b92ed98a585Andrew Sapperstein 959d6eaacbb9eb56763d38a3815fc509b92ed98a585Andrew Sapperstein // -fexceptions=0 is default. 960d6eaacbb9eb56763d38a3815fc509b92ed98a585Andrew Sapperstein if (needsExceptions(Args, InputType, getToolChain().getTriple())) 961d6eaacbb9eb56763d38a3815fc509b92ed98a585Andrew Sapperstein CmdArgs.push_back("-fexceptions"); 962d6eaacbb9eb56763d38a3815fc509b92ed98a585Andrew Sapperstein 963d6eaacbb9eb56763d38a3815fc509b92ed98a585Andrew Sapperstein // -frtti is default. 9646ba612efffba42bec102ac58a1540496158f747eAndrew Sapperstein if (!Args.hasFlag(options::OPT_frtti, options::OPT_fno_rtti)) 9656ba612efffba42bec102ac58a1540496158f747eAndrew Sapperstein CmdArgs.push_back("-fno-rtti"); 966d6eaacbb9eb56763d38a3815fc509b92ed98a585Andrew Sapperstein 967d6eaacbb9eb56763d38a3815fc509b92ed98a585Andrew Sapperstein // -fsigned-char is default. 968d6eaacbb9eb56763d38a3815fc509b92ed98a585Andrew Sapperstein if (!Args.hasFlag(options::OPT_fsigned_char, options::OPT_funsigned_char, 969d6eaacbb9eb56763d38a3815fc509b92ed98a585Andrew Sapperstein isSignedCharDefault(getToolChain().getTriple()))) 970d6eaacbb9eb56763d38a3815fc509b92ed98a585Andrew Sapperstein CmdArgs.push_back("-fno-signed-char"); 971d6eaacbb9eb56763d38a3815fc509b92ed98a585Andrew Sapperstein 972d6eaacbb9eb56763d38a3815fc509b92ed98a585Andrew Sapperstein // -fms-extensions=0 is default. 973d6eaacbb9eb56763d38a3815fc509b92ed98a585Andrew Sapperstein if (Args.hasFlag(options::OPT_fms_extensions, options::OPT_fno_ms_extensions, 974d6eaacbb9eb56763d38a3815fc509b92ed98a585Andrew Sapperstein getToolChain().getTriple().getOS() == llvm::Triple::Win32)) 975d6eaacbb9eb56763d38a3815fc509b92ed98a585Andrew Sapperstein CmdArgs.push_back("-fms-extensions"); 976d6eaacbb9eb56763d38a3815fc509b92ed98a585Andrew Sapperstein 977d6eaacbb9eb56763d38a3815fc509b92ed98a585Andrew Sapperstein // -fnext-runtime is default. 978d6eaacbb9eb56763d38a3815fc509b92ed98a585Andrew Sapperstein if (!Args.hasFlag(options::OPT_fnext_runtime, options::OPT_fgnu_runtime, 979d6eaacbb9eb56763d38a3815fc509b92ed98a585Andrew Sapperstein getToolChain().getTriple().getOS() == llvm::Triple::Darwin)) 980d6eaacbb9eb56763d38a3815fc509b92ed98a585Andrew Sapperstein CmdArgs.push_back("-fgnu-runtime"); 981d6eaacbb9eb56763d38a3815fc509b92ed98a585Andrew Sapperstein 982d6eaacbb9eb56763d38a3815fc509b92ed98a585Andrew Sapperstein // -fobjc-nonfragile-abi=0 is default. 983d6eaacbb9eb56763d38a3815fc509b92ed98a585Andrew Sapperstein if (types::isObjC(InputType)) { 984d6eaacbb9eb56763d38a3815fc509b92ed98a585Andrew Sapperstein if (Args.hasArg(options::OPT_fobjc_nonfragile_abi) || 985d6eaacbb9eb56763d38a3815fc509b92ed98a585Andrew Sapperstein getToolChain().IsObjCNonFragileABIDefault()) 986d6eaacbb9eb56763d38a3815fc509b92ed98a585Andrew Sapperstein CmdArgs.push_back("-fobjc-nonfragile-abi"); 987d6eaacbb9eb56763d38a3815fc509b92ed98a585Andrew Sapperstein } 988d6eaacbb9eb56763d38a3815fc509b92ed98a585Andrew Sapperstein 989d6eaacbb9eb56763d38a3815fc509b92ed98a585Andrew Sapperstein // -fshort-wchar default varies depending on platform; only 9906ba612efffba42bec102ac58a1540496158f747eAndrew Sapperstein // pass if specified. 9916ba612efffba42bec102ac58a1540496158f747eAndrew Sapperstein if (Arg *A = Args.getLastArg(options::OPT_fshort_wchar)) { 992d6eaacbb9eb56763d38a3815fc509b92ed98a585Andrew Sapperstein if (A->getOption().matches(options::OPT_fshort_wchar)) 993d6eaacbb9eb56763d38a3815fc509b92ed98a585Andrew Sapperstein CmdArgs.push_back("-fshort-wchar"); 994d6eaacbb9eb56763d38a3815fc509b92ed98a585Andrew Sapperstein } 995d6eaacbb9eb56763d38a3815fc509b92ed98a585Andrew Sapperstein 996d6eaacbb9eb56763d38a3815fc509b92ed98a585Andrew Sapperstein // -fno-pascal-strings is default, only pass non-default. If the tool chain 997d6eaacbb9eb56763d38a3815fc509b92ed98a585Andrew Sapperstein // happened to translate to -mpascal-strings, we want to back translate here. 998d6eaacbb9eb56763d38a3815fc509b92ed98a585Andrew Sapperstein // 999d6eaacbb9eb56763d38a3815fc509b92ed98a585Andrew Sapperstein // FIXME: This is gross; that translation should be pulled from the 1000d6eaacbb9eb56763d38a3815fc509b92ed98a585Andrew Sapperstein // tool chain. 1001d6eaacbb9eb56763d38a3815fc509b92ed98a585Andrew Sapperstein if (Args.hasFlag(options::OPT_fpascal_strings, 1002d6eaacbb9eb56763d38a3815fc509b92ed98a585Andrew Sapperstein options::OPT_fno_pascal_strings, 1003d6eaacbb9eb56763d38a3815fc509b92ed98a585Andrew Sapperstein false) || 1004d6eaacbb9eb56763d38a3815fc509b92ed98a585Andrew Sapperstein Args.hasFlag(options::OPT_mpascal_strings, 1005d6eaacbb9eb56763d38a3815fc509b92ed98a585Andrew Sapperstein options::OPT_mno_pascal_strings, 1006d6eaacbb9eb56763d38a3815fc509b92ed98a585Andrew Sapperstein false)) 1007d6eaacbb9eb56763d38a3815fc509b92ed98a585Andrew Sapperstein CmdArgs.push_back("-fpascal-strings"); 1008d6eaacbb9eb56763d38a3815fc509b92ed98a585Andrew Sapperstein 1009d6eaacbb9eb56763d38a3815fc509b92ed98a585Andrew Sapperstein // -fcommon is default, only pass non-default. 1010d6eaacbb9eb56763d38a3815fc509b92ed98a585Andrew Sapperstein if (!Args.hasFlag(options::OPT_fcommon, options::OPT_fno_common)) 10116ba612efffba42bec102ac58a1540496158f747eAndrew Sapperstein CmdArgs.push_back("-fno-common"); 10126ba612efffba42bec102ac58a1540496158f747eAndrew Sapperstein 1013d6eaacbb9eb56763d38a3815fc509b92ed98a585Andrew Sapperstein // -fsigned-bitfields is default, and clang doesn't yet support 1014d6eaacbb9eb56763d38a3815fc509b92ed98a585Andrew Sapperstein // --funsigned-bitfields. 10156ba612efffba42bec102ac58a1540496158f747eAndrew Sapperstein if (!Args.hasFlag(options::OPT_fsigned_bitfields, 1016d6eaacbb9eb56763d38a3815fc509b92ed98a585Andrew Sapperstein options::OPT_funsigned_bitfields)) 1017d6eaacbb9eb56763d38a3815fc509b92ed98a585Andrew Sapperstein D.Diag(clang::diag::warn_drv_clang_unsupported) 1018d6eaacbb9eb56763d38a3815fc509b92ed98a585Andrew Sapperstein << Args.getLastArg(options::OPT_funsigned_bitfields)->getAsString(Args); 1019d6eaacbb9eb56763d38a3815fc509b92ed98a585Andrew Sapperstein 1020d6eaacbb9eb56763d38a3815fc509b92ed98a585Andrew Sapperstein // -fdiagnostics-fixit-info is default, only pass non-default. 1021d6eaacbb9eb56763d38a3815fc509b92ed98a585Andrew Sapperstein if (!Args.hasFlag(options::OPT_fdiagnostics_fixit_info, 1022d6eaacbb9eb56763d38a3815fc509b92ed98a585Andrew Sapperstein options::OPT_fno_diagnostics_fixit_info)) 1023d6eaacbb9eb56763d38a3815fc509b92ed98a585Andrew Sapperstein CmdArgs.push_back("-fno-diagnostics-fixit-info"); 10246ba612efffba42bec102ac58a1540496158f747eAndrew Sapperstein 1025d6eaacbb9eb56763d38a3815fc509b92ed98a585Andrew Sapperstein // Enable -fdiagnostics-show-option by default. 1026d6eaacbb9eb56763d38a3815fc509b92ed98a585Andrew Sapperstein if (Args.hasFlag(options::OPT_fdiagnostics_show_option, 1027d6eaacbb9eb56763d38a3815fc509b92ed98a585Andrew Sapperstein options::OPT_fno_diagnostics_show_option)) 1028d6eaacbb9eb56763d38a3815fc509b92ed98a585Andrew Sapperstein CmdArgs.push_back("-fdiagnostics-show-option"); 1029d6eaacbb9eb56763d38a3815fc509b92ed98a585Andrew Sapperstein 1030d6eaacbb9eb56763d38a3815fc509b92ed98a585Andrew Sapperstein // Color diagnostics are the default, unless the terminal doesn't support 1031d6eaacbb9eb56763d38a3815fc509b92ed98a585Andrew Sapperstein // them. 1032d6eaacbb9eb56763d38a3815fc509b92ed98a585Andrew Sapperstein if (Args.hasFlag(options::OPT_fcolor_diagnostics, 1033d6eaacbb9eb56763d38a3815fc509b92ed98a585Andrew Sapperstein options::OPT_fno_color_diagnostics) && 1034d6eaacbb9eb56763d38a3815fc509b92ed98a585Andrew Sapperstein llvm::sys::Process::StandardErrHasColors()) 1035d6eaacbb9eb56763d38a3815fc509b92ed98a585Andrew Sapperstein CmdArgs.push_back("-fcolor-diagnostics"); 1036d6eaacbb9eb56763d38a3815fc509b92ed98a585Andrew Sapperstein 1037d6eaacbb9eb56763d38a3815fc509b92ed98a585Andrew Sapperstein if (!Args.hasFlag(options::OPT_fshow_source_location, 1038d6eaacbb9eb56763d38a3815fc509b92ed98a585Andrew Sapperstein options::OPT_fno_show_source_location)) 1039d6eaacbb9eb56763d38a3815fc509b92ed98a585Andrew Sapperstein CmdArgs.push_back("-fno-show-source-location"); 1040d6eaacbb9eb56763d38a3815fc509b92ed98a585Andrew Sapperstein 1041d6eaacbb9eb56763d38a3815fc509b92ed98a585Andrew Sapperstein // -fdollars-in-identifiers default varies depending on platform and 1042d6eaacbb9eb56763d38a3815fc509b92ed98a585Andrew Sapperstein // language; only pass if specified. 1043d6eaacbb9eb56763d38a3815fc509b92ed98a585Andrew Sapperstein if (Arg *A = Args.getLastArg(options::OPT_fdollars_in_identifiers, 1044d6eaacbb9eb56763d38a3815fc509b92ed98a585Andrew Sapperstein options::OPT_fno_dollars_in_identifiers)) { 1045d6eaacbb9eb56763d38a3815fc509b92ed98a585Andrew Sapperstein if (A->getOption().matches(options::OPT_fdollars_in_identifiers)) 1046d6eaacbb9eb56763d38a3815fc509b92ed98a585Andrew Sapperstein CmdArgs.push_back("-fdollars-in-identifiers"); 1047d6eaacbb9eb56763d38a3815fc509b92ed98a585Andrew Sapperstein else 1048d6eaacbb9eb56763d38a3815fc509b92ed98a585Andrew Sapperstein CmdArgs.push_back("-fno-dollars-in-identifiers"); 10496ba612efffba42bec102ac58a1540496158f747eAndrew Sapperstein } 10506ba612efffba42bec102ac58a1540496158f747eAndrew Sapperstein 10516ba612efffba42bec102ac58a1540496158f747eAndrew Sapperstein // -funit-at-a-time is default, and we don't support -fno-unit-at-a-time for 10526ba612efffba42bec102ac58a1540496158f747eAndrew Sapperstein // practical purposes. 10536ba612efffba42bec102ac58a1540496158f747eAndrew Sapperstein if (Arg *A = Args.getLastArg(options::OPT_funit_at_a_time, 1054d6eaacbb9eb56763d38a3815fc509b92ed98a585Andrew Sapperstein options::OPT_fno_unit_at_a_time)) { 1055d6eaacbb9eb56763d38a3815fc509b92ed98a585Andrew Sapperstein if (A->getOption().matches(options::OPT_fno_unit_at_a_time)) 10566ba612efffba42bec102ac58a1540496158f747eAndrew Sapperstein D.Diag(clang::diag::warn_drv_clang_unsupported) << A->getAsString(Args); 10576ba612efffba42bec102ac58a1540496158f747eAndrew Sapperstein } 1058d6eaacbb9eb56763d38a3815fc509b92ed98a585Andrew Sapperstein 1059d6eaacbb9eb56763d38a3815fc509b92ed98a585Andrew Sapperstein // Default to -fno-builtin-str{cat,cpy} on Darwin for ARM. 1060d6eaacbb9eb56763d38a3815fc509b92ed98a585Andrew Sapperstein // 10616ba612efffba42bec102ac58a1540496158f747eAndrew Sapperstein // FIXME: This is disabled until clang -cc1 supports -fno-builtin-foo. PR4941. 10626ba612efffba42bec102ac58a1540496158f747eAndrew Sapperstein#if 0 10636ba612efffba42bec102ac58a1540496158f747eAndrew Sapperstein if (getToolChain().getTriple().getOS() == llvm::Triple::Darwin && 10646ba612efffba42bec102ac58a1540496158f747eAndrew Sapperstein (getToolChain().getTriple().getArch() == llvm::Triple::arm || 10656ba612efffba42bec102ac58a1540496158f747eAndrew Sapperstein getToolChain().getTriple().getArch() == llvm::Triple::thumb)) { 10666ba612efffba42bec102ac58a1540496158f747eAndrew Sapperstein if (!Args.hasArg(options::OPT_fbuiltin_strcat)) 10676ba612efffba42bec102ac58a1540496158f747eAndrew Sapperstein CmdArgs.push_back("-fno-builtin-strcat"); 10686ba612efffba42bec102ac58a1540496158f747eAndrew Sapperstein if (!Args.hasArg(options::OPT_fbuiltin_strcpy)) 10696ba612efffba42bec102ac58a1540496158f747eAndrew Sapperstein CmdArgs.push_back("-fno-builtin-strcpy"); 10706ba612efffba42bec102ac58a1540496158f747eAndrew Sapperstein } 10716ba612efffba42bec102ac58a1540496158f747eAndrew Sapperstein#endif 10726ba612efffba42bec102ac58a1540496158f747eAndrew Sapperstein 10736ba612efffba42bec102ac58a1540496158f747eAndrew Sapperstein if (Arg *A = Args.getLastArg(options::OPT_traditional, 10746ba612efffba42bec102ac58a1540496158f747eAndrew Sapperstein options::OPT_traditional_cpp)) 1075d6eaacbb9eb56763d38a3815fc509b92ed98a585Andrew Sapperstein D.Diag(clang::diag::err_drv_clang_unsupported) << A->getAsString(Args); 1076d6eaacbb9eb56763d38a3815fc509b92ed98a585Andrew Sapperstein 1077d6eaacbb9eb56763d38a3815fc509b92ed98a585Andrew Sapperstein Args.AddLastArg(CmdArgs, options::OPT_dM); 1078d6eaacbb9eb56763d38a3815fc509b92ed98a585Andrew Sapperstein Args.AddLastArg(CmdArgs, options::OPT_dD); 1079d6eaacbb9eb56763d38a3815fc509b92ed98a585Andrew Sapperstein 1080d6eaacbb9eb56763d38a3815fc509b92ed98a585Andrew Sapperstein Args.AddAllArgValues(CmdArgs, options::OPT_Xclang); 1081d6eaacbb9eb56763d38a3815fc509b92ed98a585Andrew Sapperstein Args.AddAllArgValues(CmdArgs, options::OPT_mllvm); 1082d6eaacbb9eb56763d38a3815fc509b92ed98a585Andrew Sapperstein 1083d6eaacbb9eb56763d38a3815fc509b92ed98a585Andrew Sapperstein if (Output.getType() == types::TY_Dependencies) { 1084d6eaacbb9eb56763d38a3815fc509b92ed98a585Andrew Sapperstein // Handled with other dependency code. 1085d6eaacbb9eb56763d38a3815fc509b92ed98a585Andrew Sapperstein } else if (Output.isPipe()) { 1086d6eaacbb9eb56763d38a3815fc509b92ed98a585Andrew Sapperstein CmdArgs.push_back("-o"); 10876ba612efffba42bec102ac58a1540496158f747eAndrew Sapperstein CmdArgs.push_back("-"); 1088d6eaacbb9eb56763d38a3815fc509b92ed98a585Andrew Sapperstein } else if (Output.isFilename()) { 1089d6eaacbb9eb56763d38a3815fc509b92ed98a585Andrew Sapperstein CmdArgs.push_back("-o"); 1090d6eaacbb9eb56763d38a3815fc509b92ed98a585Andrew Sapperstein CmdArgs.push_back(Output.getFilename()); 1091d6eaacbb9eb56763d38a3815fc509b92ed98a585Andrew Sapperstein } else { 1092d6eaacbb9eb56763d38a3815fc509b92ed98a585Andrew Sapperstein assert(Output.isNothing() && "Invalid output."); 1093d6eaacbb9eb56763d38a3815fc509b92ed98a585Andrew Sapperstein } 10946ba612efffba42bec102ac58a1540496158f747eAndrew Sapperstein 1095d6eaacbb9eb56763d38a3815fc509b92ed98a585Andrew Sapperstein for (InputInfoList::const_iterator 1096d6eaacbb9eb56763d38a3815fc509b92ed98a585Andrew Sapperstein it = Inputs.begin(), ie = Inputs.end(); it != ie; ++it) { 1097d6eaacbb9eb56763d38a3815fc509b92ed98a585Andrew Sapperstein const InputInfo &II = *it; 1098d6eaacbb9eb56763d38a3815fc509b92ed98a585Andrew Sapperstein CmdArgs.push_back("-x"); 1099d6eaacbb9eb56763d38a3815fc509b92ed98a585Andrew Sapperstein CmdArgs.push_back(types::getTypeName(II.getType())); 1100d6eaacbb9eb56763d38a3815fc509b92ed98a585Andrew Sapperstein if (II.isPipe()) 1101d6eaacbb9eb56763d38a3815fc509b92ed98a585Andrew Sapperstein CmdArgs.push_back("-"); 1102d6eaacbb9eb56763d38a3815fc509b92ed98a585Andrew Sapperstein else if (II.isFilename()) 1103d6eaacbb9eb56763d38a3815fc509b92ed98a585Andrew Sapperstein CmdArgs.push_back(II.getFilename()); 1104d6eaacbb9eb56763d38a3815fc509b92ed98a585Andrew Sapperstein else 1105d6eaacbb9eb56763d38a3815fc509b92ed98a585Andrew Sapperstein II.getInputArg().renderAsInput(Args, CmdArgs); 1106d6eaacbb9eb56763d38a3815fc509b92ed98a585Andrew Sapperstein } 1107d6eaacbb9eb56763d38a3815fc509b92ed98a585Andrew Sapperstein 11086ba612efffba42bec102ac58a1540496158f747eAndrew Sapperstein Args.AddAllArgs(CmdArgs, options::OPT_undef); 11096ba612efffba42bec102ac58a1540496158f747eAndrew Sapperstein 11106ba612efffba42bec102ac58a1540496158f747eAndrew Sapperstein const char *Exec = 11116ba612efffba42bec102ac58a1540496158f747eAndrew Sapperstein Args.MakeArgString(getToolChain().GetProgramPath(C, "clang")); 11126ba612efffba42bec102ac58a1540496158f747eAndrew Sapperstein 11136ba612efffba42bec102ac58a1540496158f747eAndrew Sapperstein // Optionally embed the -cc1 level arguments into the debug info, for build 11146ba612efffba42bec102ac58a1540496158f747eAndrew Sapperstein // analysis. 1115d6eaacbb9eb56763d38a3815fc509b92ed98a585Andrew Sapperstein if (getToolChain().UseDwarfDebugFlags()) { 1116d6eaacbb9eb56763d38a3815fc509b92ed98a585Andrew Sapperstein llvm::SmallString<256> Flags; 1117d6eaacbb9eb56763d38a3815fc509b92ed98a585Andrew Sapperstein Flags += Exec; 1118d6eaacbb9eb56763d38a3815fc509b92ed98a585Andrew Sapperstein for (unsigned i = 0, e = CmdArgs.size(); i != e; ++i) { 1119d6eaacbb9eb56763d38a3815fc509b92ed98a585Andrew Sapperstein Flags += " "; 1120d6eaacbb9eb56763d38a3815fc509b92ed98a585Andrew Sapperstein Flags += CmdArgs[i]; 1121d6eaacbb9eb56763d38a3815fc509b92ed98a585Andrew Sapperstein } 11226ba612efffba42bec102ac58a1540496158f747eAndrew Sapperstein CmdArgs.push_back("-dwarf-debug-flags"); 11236ba612efffba42bec102ac58a1540496158f747eAndrew Sapperstein CmdArgs.push_back(Args.MakeArgString(Flags.str())); 11246ba612efffba42bec102ac58a1540496158f747eAndrew Sapperstein } 1125d6eaacbb9eb56763d38a3815fc509b92ed98a585Andrew Sapperstein 1126d6eaacbb9eb56763d38a3815fc509b92ed98a585Andrew Sapperstein Dest.addCommand(new Command(JA, *this, Exec, CmdArgs)); 1127d6eaacbb9eb56763d38a3815fc509b92ed98a585Andrew Sapperstein 1128d6eaacbb9eb56763d38a3815fc509b92ed98a585Andrew Sapperstein // Explicitly warn that these options are unsupported, even though 1129d6eaacbb9eb56763d38a3815fc509b92ed98a585Andrew Sapperstein // we are allowing compilation to continue. 1130d6eaacbb9eb56763d38a3815fc509b92ed98a585Andrew Sapperstein for (arg_iterator it = Args.filtered_begin(options::OPT_pg), 1131d6eaacbb9eb56763d38a3815fc509b92ed98a585Andrew Sapperstein ie = Args.filtered_end(); it != ie; ++it) { 1132d6eaacbb9eb56763d38a3815fc509b92ed98a585Andrew Sapperstein it->claim(); 1133d6eaacbb9eb56763d38a3815fc509b92ed98a585Andrew Sapperstein D.Diag(clang::diag::warn_drv_clang_unsupported) << it->getAsString(Args); 1134d6eaacbb9eb56763d38a3815fc509b92ed98a585Andrew Sapperstein } 1135d6eaacbb9eb56763d38a3815fc509b92ed98a585Andrew Sapperstein 1136d6eaacbb9eb56763d38a3815fc509b92ed98a585Andrew Sapperstein // Claim some arguments which clang supports automatically. 1137d6eaacbb9eb56763d38a3815fc509b92ed98a585Andrew Sapperstein 11386ba612efffba42bec102ac58a1540496158f747eAndrew Sapperstein // -fpch-preprocess is used with gcc to add a special marker in the 11396ba612efffba42bec102ac58a1540496158f747eAndrew Sapperstein // -output to include the PCH file. Clang's PTH solution is 1140d6eaacbb9eb56763d38a3815fc509b92ed98a585Andrew Sapperstein // -completely transparent, so we do not need to deal with it at 1141d6eaacbb9eb56763d38a3815fc509b92ed98a585Andrew Sapperstein // -all. 11426ba612efffba42bec102ac58a1540496158f747eAndrew Sapperstein Args.ClaimAllArgs(options::OPT_fpch_preprocess); 1143d6eaacbb9eb56763d38a3815fc509b92ed98a585Andrew Sapperstein 1144d6eaacbb9eb56763d38a3815fc509b92ed98a585Andrew Sapperstein // Claim some arguments which clang doesn't support, but we don't 11456ba612efffba42bec102ac58a1540496158f747eAndrew Sapperstein // care to warn the user about. 1146d6eaacbb9eb56763d38a3815fc509b92ed98a585Andrew Sapperstein Args.ClaimAllArgs(options::OPT_clang_ignored_f_Group); 1147d6eaacbb9eb56763d38a3815fc509b92ed98a585Andrew Sapperstein Args.ClaimAllArgs(options::OPT_clang_ignored_m_Group); 1148d6eaacbb9eb56763d38a3815fc509b92ed98a585Andrew Sapperstein} 11496ba612efffba42bec102ac58a1540496158f747eAndrew Sapperstein 11506ba612efffba42bec102ac58a1540496158f747eAndrew Sappersteinvoid gcc::Common::ConstructJob(Compilation &C, const JobAction &JA, 11516ba612efffba42bec102ac58a1540496158f747eAndrew Sapperstein Job &Dest, 11526ba612efffba42bec102ac58a1540496158f747eAndrew Sapperstein const InputInfo &Output, 11536ba612efffba42bec102ac58a1540496158f747eAndrew Sapperstein const InputInfoList &Inputs, 11546ba612efffba42bec102ac58a1540496158f747eAndrew Sapperstein const ArgList &Args, 11556ba612efffba42bec102ac58a1540496158f747eAndrew Sapperstein const char *LinkingOutput) const { 11566ba612efffba42bec102ac58a1540496158f747eAndrew Sapperstein const Driver &D = getToolChain().getHost().getDriver(); 11576ba612efffba42bec102ac58a1540496158f747eAndrew Sapperstein ArgStringList CmdArgs; 11586ba612efffba42bec102ac58a1540496158f747eAndrew Sapperstein 1159d6eaacbb9eb56763d38a3815fc509b92ed98a585Andrew Sapperstein for (ArgList::const_iterator 1160d6eaacbb9eb56763d38a3815fc509b92ed98a585Andrew Sapperstein it = Args.begin(), ie = Args.end(); it != ie; ++it) { 1161d6eaacbb9eb56763d38a3815fc509b92ed98a585Andrew Sapperstein Arg *A = *it; 1162d6eaacbb9eb56763d38a3815fc509b92ed98a585Andrew Sapperstein if (A->getOption().hasForwardToGCC()) { 1163d6eaacbb9eb56763d38a3815fc509b92ed98a585Andrew Sapperstein // It is unfortunate that we have to claim here, as this means 1164d6eaacbb9eb56763d38a3815fc509b92ed98a585Andrew Sapperstein // we will basically never report anything interesting for 1165d6eaacbb9eb56763d38a3815fc509b92ed98a585Andrew Sapperstein // platforms using a generic gcc, even if we are just using gcc 1166d6eaacbb9eb56763d38a3815fc509b92ed98a585Andrew Sapperstein // to get to the assembler. 11676ba612efffba42bec102ac58a1540496158f747eAndrew Sapperstein A->claim(); 1168d6eaacbb9eb56763d38a3815fc509b92ed98a585Andrew Sapperstein A->render(Args, CmdArgs); 1169d6eaacbb9eb56763d38a3815fc509b92ed98a585Andrew Sapperstein } 1170d6eaacbb9eb56763d38a3815fc509b92ed98a585Andrew Sapperstein } 1171d6eaacbb9eb56763d38a3815fc509b92ed98a585Andrew Sapperstein 1172d6eaacbb9eb56763d38a3815fc509b92ed98a585Andrew Sapperstein RenderExtraToolArgs(CmdArgs); 1173d6eaacbb9eb56763d38a3815fc509b92ed98a585Andrew Sapperstein 11746ba612efffba42bec102ac58a1540496158f747eAndrew Sapperstein // If using a driver driver, force the arch. 1175d6eaacbb9eb56763d38a3815fc509b92ed98a585Andrew Sapperstein const std::string &Arch = getToolChain().getArchName(); 1176d6eaacbb9eb56763d38a3815fc509b92ed98a585Andrew Sapperstein if (getToolChain().getHost().useDriverDriver()) { 1177d6eaacbb9eb56763d38a3815fc509b92ed98a585Andrew Sapperstein CmdArgs.push_back("-arch"); 1178d6eaacbb9eb56763d38a3815fc509b92ed98a585Andrew Sapperstein 1179d6eaacbb9eb56763d38a3815fc509b92ed98a585Andrew Sapperstein // FIXME: Remove these special cases. 1180d6eaacbb9eb56763d38a3815fc509b92ed98a585Andrew Sapperstein if (Arch == "powerpc") 1181d6eaacbb9eb56763d38a3815fc509b92ed98a585Andrew Sapperstein CmdArgs.push_back("ppc"); 1182d6eaacbb9eb56763d38a3815fc509b92ed98a585Andrew Sapperstein else if (Arch == "powerpc64") 1183d6eaacbb9eb56763d38a3815fc509b92ed98a585Andrew Sapperstein CmdArgs.push_back("ppc64"); 1184d6eaacbb9eb56763d38a3815fc509b92ed98a585Andrew Sapperstein else 1185d6eaacbb9eb56763d38a3815fc509b92ed98a585Andrew Sapperstein CmdArgs.push_back(Args.MakeArgString(Arch)); 1186d6eaacbb9eb56763d38a3815fc509b92ed98a585Andrew Sapperstein } 1187d6eaacbb9eb56763d38a3815fc509b92ed98a585Andrew Sapperstein 11886ba612efffba42bec102ac58a1540496158f747eAndrew Sapperstein // Try to force gcc to match the tool chain we want, if we recognize 11896ba612efffba42bec102ac58a1540496158f747eAndrew Sapperstein // the arch. 11906ba612efffba42bec102ac58a1540496158f747eAndrew Sapperstein // 11916ba612efffba42bec102ac58a1540496158f747eAndrew Sapperstein // FIXME: The triple class should directly provide the information we want 11926ba612efffba42bec102ac58a1540496158f747eAndrew Sapperstein // here. 11936ba612efffba42bec102ac58a1540496158f747eAndrew Sapperstein if (Arch == "i386" || Arch == "powerpc") 11946ba612efffba42bec102ac58a1540496158f747eAndrew Sapperstein CmdArgs.push_back("-m32"); 1195d6eaacbb9eb56763d38a3815fc509b92ed98a585Andrew Sapperstein else if (Arch == "x86_64" || Arch == "powerpc64") 1196d6eaacbb9eb56763d38a3815fc509b92ed98a585Andrew Sapperstein CmdArgs.push_back("-m64"); 1197d6eaacbb9eb56763d38a3815fc509b92ed98a585Andrew Sapperstein 1198d6eaacbb9eb56763d38a3815fc509b92ed98a585Andrew Sapperstein if (Output.isPipe()) { 1199d6eaacbb9eb56763d38a3815fc509b92ed98a585Andrew Sapperstein CmdArgs.push_back("-o"); 1200d6eaacbb9eb56763d38a3815fc509b92ed98a585Andrew Sapperstein CmdArgs.push_back("-"); 1201d6eaacbb9eb56763d38a3815fc509b92ed98a585Andrew Sapperstein } else if (Output.isFilename()) { 1202d6eaacbb9eb56763d38a3815fc509b92ed98a585Andrew Sapperstein CmdArgs.push_back("-o"); 1203d6eaacbb9eb56763d38a3815fc509b92ed98a585Andrew Sapperstein CmdArgs.push_back(Output.getFilename()); 1204d6eaacbb9eb56763d38a3815fc509b92ed98a585Andrew Sapperstein } else { 1205d6eaacbb9eb56763d38a3815fc509b92ed98a585Andrew Sapperstein assert(Output.isNothing() && "Unexpected output"); 1206d6eaacbb9eb56763d38a3815fc509b92ed98a585Andrew Sapperstein CmdArgs.push_back("-fsyntax-only"); 1207d6eaacbb9eb56763d38a3815fc509b92ed98a585Andrew Sapperstein } 1208d6eaacbb9eb56763d38a3815fc509b92ed98a585Andrew Sapperstein 1209d6eaacbb9eb56763d38a3815fc509b92ed98a585Andrew Sapperstein 1210d6eaacbb9eb56763d38a3815fc509b92ed98a585Andrew Sapperstein // Only pass -x if gcc will understand it; otherwise hope gcc 1211d6eaacbb9eb56763d38a3815fc509b92ed98a585Andrew Sapperstein // understands the suffix correctly. The main use case this would go 1212d6eaacbb9eb56763d38a3815fc509b92ed98a585Andrew Sapperstein // wrong in is for linker inputs if they happened to have an odd 12136ba612efffba42bec102ac58a1540496158f747eAndrew Sapperstein // suffix; really the only way to get this to happen is a command 12146ba612efffba42bec102ac58a1540496158f747eAndrew Sapperstein // like '-x foobar a.c' which will treat a.c like a linker input. 12156ba612efffba42bec102ac58a1540496158f747eAndrew Sapperstein // 12166ba612efffba42bec102ac58a1540496158f747eAndrew Sapperstein // FIXME: For the linker case specifically, can we safely convert 12176ba612efffba42bec102ac58a1540496158f747eAndrew Sapperstein // inputs into '-Wl,' options? 12186ba612efffba42bec102ac58a1540496158f747eAndrew Sapperstein for (InputInfoList::const_iterator 12196ba612efffba42bec102ac58a1540496158f747eAndrew Sapperstein it = Inputs.begin(), ie = Inputs.end(); it != ie; ++it) { 12206ba612efffba42bec102ac58a1540496158f747eAndrew Sapperstein const InputInfo &II = *it; 12216ba612efffba42bec102ac58a1540496158f747eAndrew Sapperstein 12226ba612efffba42bec102ac58a1540496158f747eAndrew Sapperstein // Don't try to pass LLVM or AST inputs to a generic gcc. 12236ba612efffba42bec102ac58a1540496158f747eAndrew Sapperstein if (II.getType() == types::TY_LLVMBC) 12246ba612efffba42bec102ac58a1540496158f747eAndrew Sapperstein D.Diag(clang::diag::err_drv_no_linker_llvm_support) 12256ba612efffba42bec102ac58a1540496158f747eAndrew Sapperstein << getToolChain().getTripleString(); 12266ba612efffba42bec102ac58a1540496158f747eAndrew Sapperstein else if (II.getType() == types::TY_AST) 12276ba612efffba42bec102ac58a1540496158f747eAndrew Sapperstein D.Diag(clang::diag::err_drv_no_ast_support) 12286ba612efffba42bec102ac58a1540496158f747eAndrew Sapperstein << getToolChain().getTripleString(); 12296ba612efffba42bec102ac58a1540496158f747eAndrew Sapperstein 12306ba612efffba42bec102ac58a1540496158f747eAndrew Sapperstein if (types::canTypeBeUserSpecified(II.getType())) { 12316ba612efffba42bec102ac58a1540496158f747eAndrew Sapperstein CmdArgs.push_back("-x"); 12326ba612efffba42bec102ac58a1540496158f747eAndrew Sapperstein CmdArgs.push_back(types::getTypeName(II.getType())); 12336ba612efffba42bec102ac58a1540496158f747eAndrew Sapperstein } 12346ba612efffba42bec102ac58a1540496158f747eAndrew Sapperstein 12356ba612efffba42bec102ac58a1540496158f747eAndrew Sapperstein if (II.isPipe()) 12366ba612efffba42bec102ac58a1540496158f747eAndrew Sapperstein CmdArgs.push_back("-"); 12376ba612efffba42bec102ac58a1540496158f747eAndrew Sapperstein else if (II.isFilename()) 12386ba612efffba42bec102ac58a1540496158f747eAndrew Sapperstein CmdArgs.push_back(II.getFilename()); 12396ba612efffba42bec102ac58a1540496158f747eAndrew Sapperstein else 12406ba612efffba42bec102ac58a1540496158f747eAndrew Sapperstein // Don't render as input, we need gcc to do the translations. 12416ba612efffba42bec102ac58a1540496158f747eAndrew Sapperstein II.getInputArg().render(Args, CmdArgs); 12426ba612efffba42bec102ac58a1540496158f747eAndrew Sapperstein } 12436ba612efffba42bec102ac58a1540496158f747eAndrew Sapperstein 12446ba612efffba42bec102ac58a1540496158f747eAndrew Sapperstein const char *GCCName = 12456ba612efffba42bec102ac58a1540496158f747eAndrew Sapperstein getToolChain().getHost().getDriver().CCCGenericGCCName.c_str(); 12466ba612efffba42bec102ac58a1540496158f747eAndrew Sapperstein const char *Exec = 12476ba612efffba42bec102ac58a1540496158f747eAndrew Sapperstein Args.MakeArgString(getToolChain().GetProgramPath(C, GCCName)); 12486ba612efffba42bec102ac58a1540496158f747eAndrew Sapperstein Dest.addCommand(new Command(JA, *this, Exec, CmdArgs)); 12496ba612efffba42bec102ac58a1540496158f747eAndrew Sapperstein} 12506ba612efffba42bec102ac58a1540496158f747eAndrew Sapperstein 12516ba612efffba42bec102ac58a1540496158f747eAndrew Sappersteinvoid gcc::Preprocess::RenderExtraToolArgs(ArgStringList &CmdArgs) const { 12526ba612efffba42bec102ac58a1540496158f747eAndrew Sapperstein CmdArgs.push_back("-E"); 12536ba612efffba42bec102ac58a1540496158f747eAndrew Sapperstein} 12546ba612efffba42bec102ac58a1540496158f747eAndrew Sapperstein 12556ba612efffba42bec102ac58a1540496158f747eAndrew Sappersteinvoid gcc::Precompile::RenderExtraToolArgs(ArgStringList &CmdArgs) const { 12566ba612efffba42bec102ac58a1540496158f747eAndrew Sapperstein // The type is good enough. 12576ba612efffba42bec102ac58a1540496158f747eAndrew Sapperstein} 1258d6eaacbb9eb56763d38a3815fc509b92ed98a585Andrew Sapperstein 1259d6eaacbb9eb56763d38a3815fc509b92ed98a585Andrew Sappersteinvoid gcc::Compile::RenderExtraToolArgs(ArgStringList &CmdArgs) const { 1260d6eaacbb9eb56763d38a3815fc509b92ed98a585Andrew Sapperstein CmdArgs.push_back("-S"); 12616ba612efffba42bec102ac58a1540496158f747eAndrew Sapperstein} 12626ba612efffba42bec102ac58a1540496158f747eAndrew Sapperstein 1263d6eaacbb9eb56763d38a3815fc509b92ed98a585Andrew Sappersteinvoid gcc::Assemble::RenderExtraToolArgs(ArgStringList &CmdArgs) const { 1264d6eaacbb9eb56763d38a3815fc509b92ed98a585Andrew Sapperstein CmdArgs.push_back("-c"); 12656ba612efffba42bec102ac58a1540496158f747eAndrew Sapperstein} 1266d6eaacbb9eb56763d38a3815fc509b92ed98a585Andrew Sapperstein 1267d6eaacbb9eb56763d38a3815fc509b92ed98a585Andrew Sappersteinvoid gcc::Link::RenderExtraToolArgs(ArgStringList &CmdArgs) const { 1268d6eaacbb9eb56763d38a3815fc509b92ed98a585Andrew Sapperstein // The types are (hopefully) good enough. 1269d6eaacbb9eb56763d38a3815fc509b92ed98a585Andrew Sapperstein} 12706ba612efffba42bec102ac58a1540496158f747eAndrew Sapperstein 1271d6eaacbb9eb56763d38a3815fc509b92ed98a585Andrew Sappersteinconst char *darwin::CC1::getCC1Name(types::ID Type) const { 1272d6eaacbb9eb56763d38a3815fc509b92ed98a585Andrew Sapperstein switch (Type) { 1273d6eaacbb9eb56763d38a3815fc509b92ed98a585Andrew Sapperstein default: 1274d6eaacbb9eb56763d38a3815fc509b92ed98a585Andrew Sapperstein assert(0 && "Unexpected type for Darwin CC1 tool."); 1275d6eaacbb9eb56763d38a3815fc509b92ed98a585Andrew Sapperstein case types::TY_Asm: 1276d6eaacbb9eb56763d38a3815fc509b92ed98a585Andrew Sapperstein case types::TY_C: case types::TY_CHeader: 12776ba612efffba42bec102ac58a1540496158f747eAndrew Sapperstein case types::TY_PP_C: case types::TY_PP_CHeader: 1278d6eaacbb9eb56763d38a3815fc509b92ed98a585Andrew Sapperstein return "cc1"; 1279d6eaacbb9eb56763d38a3815fc509b92ed98a585Andrew Sapperstein case types::TY_ObjC: case types::TY_ObjCHeader: 1280d6eaacbb9eb56763d38a3815fc509b92ed98a585Andrew Sapperstein case types::TY_PP_ObjC: case types::TY_PP_ObjCHeader: 1281d6eaacbb9eb56763d38a3815fc509b92ed98a585Andrew Sapperstein return "cc1obj"; 1282d6eaacbb9eb56763d38a3815fc509b92ed98a585Andrew Sapperstein case types::TY_CXX: case types::TY_CXXHeader: 1283d6eaacbb9eb56763d38a3815fc509b92ed98a585Andrew Sapperstein case types::TY_PP_CXX: case types::TY_PP_CXXHeader: 12846ba612efffba42bec102ac58a1540496158f747eAndrew Sapperstein return "cc1plus"; 1285d6eaacbb9eb56763d38a3815fc509b92ed98a585Andrew Sapperstein case types::TY_ObjCXX: case types::TY_ObjCXXHeader: 1286d6eaacbb9eb56763d38a3815fc509b92ed98a585Andrew Sapperstein case types::TY_PP_ObjCXX: case types::TY_PP_ObjCXXHeader: 1287d6eaacbb9eb56763d38a3815fc509b92ed98a585Andrew Sapperstein return "cc1objplus"; 1288d6eaacbb9eb56763d38a3815fc509b92ed98a585Andrew Sapperstein } 1289d6eaacbb9eb56763d38a3815fc509b92ed98a585Andrew Sapperstein} 1290d6eaacbb9eb56763d38a3815fc509b92ed98a585Andrew Sapperstein 12916ba612efffba42bec102ac58a1540496158f747eAndrew Sappersteinconst char *darwin::CC1::getBaseInputName(const ArgList &Args, 1292d6eaacbb9eb56763d38a3815fc509b92ed98a585Andrew Sapperstein const InputInfoList &Inputs) { 1293d6eaacbb9eb56763d38a3815fc509b92ed98a585Andrew Sapperstein llvm::sys::Path P(Inputs[0].getBaseInput()); 1294d6eaacbb9eb56763d38a3815fc509b92ed98a585Andrew Sapperstein return Args.MakeArgString(P.getLast()); 1295d6eaacbb9eb56763d38a3815fc509b92ed98a585Andrew Sapperstein} 1296d6eaacbb9eb56763d38a3815fc509b92ed98a585Andrew Sapperstein 1297d6eaacbb9eb56763d38a3815fc509b92ed98a585Andrew Sappersteinconst char *darwin::CC1::getBaseInputStem(const ArgList &Args, 12986ba612efffba42bec102ac58a1540496158f747eAndrew Sapperstein const InputInfoList &Inputs) { 1299d6eaacbb9eb56763d38a3815fc509b92ed98a585Andrew Sapperstein const char *Str = getBaseInputName(Args, Inputs); 1300d6eaacbb9eb56763d38a3815fc509b92ed98a585Andrew Sapperstein 1301d6eaacbb9eb56763d38a3815fc509b92ed98a585Andrew Sapperstein if (const char *End = strchr(Str, '.')) 1302d6eaacbb9eb56763d38a3815fc509b92ed98a585Andrew Sapperstein return Args.MakeArgString(std::string(Str, End)); 1303d6eaacbb9eb56763d38a3815fc509b92ed98a585Andrew Sapperstein 1304d6eaacbb9eb56763d38a3815fc509b92ed98a585Andrew Sapperstein return Str; 13056ba612efffba42bec102ac58a1540496158f747eAndrew Sapperstein} 1306d6eaacbb9eb56763d38a3815fc509b92ed98a585Andrew Sapperstein 1307d6eaacbb9eb56763d38a3815fc509b92ed98a585Andrew Sappersteinconst char * 1308d6eaacbb9eb56763d38a3815fc509b92ed98a585Andrew Sappersteindarwin::CC1::getDependencyFileName(const ArgList &Args, 1309d6eaacbb9eb56763d38a3815fc509b92ed98a585Andrew Sapperstein const InputInfoList &Inputs) { 1310d6eaacbb9eb56763d38a3815fc509b92ed98a585Andrew Sapperstein // FIXME: Think about this more. 1311d6eaacbb9eb56763d38a3815fc509b92ed98a585Andrew Sapperstein std::string Res; 13126ba612efffba42bec102ac58a1540496158f747eAndrew Sapperstein 1313d6eaacbb9eb56763d38a3815fc509b92ed98a585Andrew Sapperstein if (Arg *OutputOpt = Args.getLastArg(options::OPT_o)) { 1314d6eaacbb9eb56763d38a3815fc509b92ed98a585Andrew Sapperstein std::string Str(OutputOpt->getValue(Args)); 1315d6eaacbb9eb56763d38a3815fc509b92ed98a585Andrew Sapperstein 1316d6eaacbb9eb56763d38a3815fc509b92ed98a585Andrew Sapperstein Res = Str.substr(0, Str.rfind('.')); 1317d6eaacbb9eb56763d38a3815fc509b92ed98a585Andrew Sapperstein } else 1318d6eaacbb9eb56763d38a3815fc509b92ed98a585Andrew Sapperstein Res = darwin::CC1::getBaseInputStem(Args, Inputs); 13196ba612efffba42bec102ac58a1540496158f747eAndrew Sapperstein 1320d6eaacbb9eb56763d38a3815fc509b92ed98a585Andrew Sapperstein return Args.MakeArgString(Res + ".d"); 1321d6eaacbb9eb56763d38a3815fc509b92ed98a585Andrew Sapperstein} 1322d6eaacbb9eb56763d38a3815fc509b92ed98a585Andrew Sapperstein 1323d6eaacbb9eb56763d38a3815fc509b92ed98a585Andrew Sappersteinvoid darwin::CC1::AddCC1Args(const ArgList &Args, 1324d6eaacbb9eb56763d38a3815fc509b92ed98a585Andrew Sapperstein ArgStringList &CmdArgs) const { 1325d6eaacbb9eb56763d38a3815fc509b92ed98a585Andrew Sapperstein const Driver &D = getToolChain().getHost().getDriver(); 13266ba612efffba42bec102ac58a1540496158f747eAndrew Sapperstein 1327d6eaacbb9eb56763d38a3815fc509b92ed98a585Andrew Sapperstein CheckCodeGenerationOptions(D, Args); 13286ba612efffba42bec102ac58a1540496158f747eAndrew Sapperstein 13296ba612efffba42bec102ac58a1540496158f747eAndrew Sapperstein // Derived from cc1 spec. 1330d6eaacbb9eb56763d38a3815fc509b92ed98a585Andrew Sapperstein if (!Args.hasArg(options::OPT_mkernel) && !Args.hasArg(options::OPT_static) && 1331d6eaacbb9eb56763d38a3815fc509b92ed98a585Andrew Sapperstein !Args.hasArg(options::OPT_mdynamic_no_pic)) 1332d6eaacbb9eb56763d38a3815fc509b92ed98a585Andrew Sapperstein CmdArgs.push_back("-fPIC"); 1333d6eaacbb9eb56763d38a3815fc509b92ed98a585Andrew Sapperstein 1334d6eaacbb9eb56763d38a3815fc509b92ed98a585Andrew Sapperstein if (getToolChain().getTriple().getArch() == llvm::Triple::arm || 13356ba612efffba42bec102ac58a1540496158f747eAndrew Sapperstein getToolChain().getTriple().getArch() == llvm::Triple::thumb) { 13366ba612efffba42bec102ac58a1540496158f747eAndrew Sapperstein if (!Args.hasArg(options::OPT_fbuiltin_strcat)) 1337d6eaacbb9eb56763d38a3815fc509b92ed98a585Andrew Sapperstein CmdArgs.push_back("-fno-builtin-strcat"); 1338d6eaacbb9eb56763d38a3815fc509b92ed98a585Andrew Sapperstein if (!Args.hasArg(options::OPT_fbuiltin_strcpy)) 1339d6eaacbb9eb56763d38a3815fc509b92ed98a585Andrew Sapperstein CmdArgs.push_back("-fno-builtin-strcpy"); 1340d6eaacbb9eb56763d38a3815fc509b92ed98a585Andrew Sapperstein } 1341d6eaacbb9eb56763d38a3815fc509b92ed98a585Andrew Sapperstein 13426ba612efffba42bec102ac58a1540496158f747eAndrew Sapperstein // gcc has some code here to deal with when no -mmacosx-version-min 13436ba612efffba42bec102ac58a1540496158f747eAndrew Sapperstein // and no -miphoneos-version-min is present, but this never happens 1344d6eaacbb9eb56763d38a3815fc509b92ed98a585Andrew Sapperstein // due to tool chain specific argument translation. 1345d6eaacbb9eb56763d38a3815fc509b92ed98a585Andrew Sapperstein 1346d6eaacbb9eb56763d38a3815fc509b92ed98a585Andrew Sapperstein if (Args.hasArg(options::OPT_g_Flag) && 1347d6eaacbb9eb56763d38a3815fc509b92ed98a585Andrew Sapperstein !Args.hasArg(options::OPT_fno_eliminate_unused_debug_symbols)) 1348d6eaacbb9eb56763d38a3815fc509b92ed98a585Andrew Sapperstein CmdArgs.push_back("-feliminate-unused-debug-symbols"); 1349d6eaacbb9eb56763d38a3815fc509b92ed98a585Andrew Sapperstein} 1350d6eaacbb9eb56763d38a3815fc509b92ed98a585Andrew Sapperstein 1351d6eaacbb9eb56763d38a3815fc509b92ed98a585Andrew Sappersteinvoid darwin::CC1::AddCC1OptionsArgs(const ArgList &Args, ArgStringList &CmdArgs, 1352d6eaacbb9eb56763d38a3815fc509b92ed98a585Andrew Sapperstein const InputInfoList &Inputs, 13536ba612efffba42bec102ac58a1540496158f747eAndrew Sapperstein const ArgStringList &OutputArgs) const { 1354d6eaacbb9eb56763d38a3815fc509b92ed98a585Andrew Sapperstein const Driver &D = getToolChain().getHost().getDriver(); 13556ba612efffba42bec102ac58a1540496158f747eAndrew Sapperstein 13566ba612efffba42bec102ac58a1540496158f747eAndrew Sapperstein // Derived from cc1_options spec. 1357d6eaacbb9eb56763d38a3815fc509b92ed98a585Andrew Sapperstein if (Args.hasArg(options::OPT_fast) || 1358d6eaacbb9eb56763d38a3815fc509b92ed98a585Andrew Sapperstein Args.hasArg(options::OPT_fastf) || 1359d6eaacbb9eb56763d38a3815fc509b92ed98a585Andrew Sapperstein Args.hasArg(options::OPT_fastcp)) 1360d6eaacbb9eb56763d38a3815fc509b92ed98a585Andrew Sapperstein CmdArgs.push_back("-O3"); 1361d6eaacbb9eb56763d38a3815fc509b92ed98a585Andrew Sapperstein 13626ba612efffba42bec102ac58a1540496158f747eAndrew Sapperstein if (Arg *A = Args.getLastArg(options::OPT_pg)) 13636ba612efffba42bec102ac58a1540496158f747eAndrew Sapperstein if (Args.hasArg(options::OPT_fomit_frame_pointer)) 1364d6eaacbb9eb56763d38a3815fc509b92ed98a585Andrew Sapperstein D.Diag(clang::diag::err_drv_argument_not_allowed_with) 1365d6eaacbb9eb56763d38a3815fc509b92ed98a585Andrew Sapperstein << A->getAsString(Args) << "-fomit-frame-pointer"; 1366d6eaacbb9eb56763d38a3815fc509b92ed98a585Andrew Sapperstein 1367d6eaacbb9eb56763d38a3815fc509b92ed98a585Andrew Sapperstein AddCC1Args(Args, CmdArgs); 1368d6eaacbb9eb56763d38a3815fc509b92ed98a585Andrew Sapperstein 1369d6eaacbb9eb56763d38a3815fc509b92ed98a585Andrew Sapperstein if (!Args.hasArg(options::OPT_Q)) 1370d6eaacbb9eb56763d38a3815fc509b92ed98a585Andrew Sapperstein CmdArgs.push_back("-quiet"); 1371d6eaacbb9eb56763d38a3815fc509b92ed98a585Andrew Sapperstein 1372d6eaacbb9eb56763d38a3815fc509b92ed98a585Andrew Sapperstein CmdArgs.push_back("-dumpbase"); 13736ba612efffba42bec102ac58a1540496158f747eAndrew Sapperstein CmdArgs.push_back(darwin::CC1::getBaseInputName(Args, Inputs)); 1374d6eaacbb9eb56763d38a3815fc509b92ed98a585Andrew Sapperstein 13756ba612efffba42bec102ac58a1540496158f747eAndrew Sapperstein Args.AddAllArgs(CmdArgs, options::OPT_d_Group); 13766ba612efffba42bec102ac58a1540496158f747eAndrew Sapperstein 1377d6eaacbb9eb56763d38a3815fc509b92ed98a585Andrew Sapperstein Args.AddAllArgs(CmdArgs, options::OPT_m_Group); 1378d6eaacbb9eb56763d38a3815fc509b92ed98a585Andrew Sapperstein Args.AddAllArgs(CmdArgs, options::OPT_a_Group); 1379d6eaacbb9eb56763d38a3815fc509b92ed98a585Andrew Sapperstein 1380d6eaacbb9eb56763d38a3815fc509b92ed98a585Andrew Sapperstein // FIXME: The goal is to use the user provided -o if that is our 1381d6eaacbb9eb56763d38a3815fc509b92ed98a585Andrew Sapperstein // final output, otherwise to drive from the original input 1382d6eaacbb9eb56763d38a3815fc509b92ed98a585Andrew Sapperstein // name. Find a clean way to go about this. 1383d6eaacbb9eb56763d38a3815fc509b92ed98a585Andrew Sapperstein if ((Args.hasArg(options::OPT_c) || Args.hasArg(options::OPT_S)) && 1384d6eaacbb9eb56763d38a3815fc509b92ed98a585Andrew Sapperstein Args.hasArg(options::OPT_o)) { 1385d6eaacbb9eb56763d38a3815fc509b92ed98a585Andrew Sapperstein Arg *OutputOpt = Args.getLastArg(options::OPT_o); 1386d6eaacbb9eb56763d38a3815fc509b92ed98a585Andrew Sapperstein CmdArgs.push_back("-auxbase-strip"); 1387d6eaacbb9eb56763d38a3815fc509b92ed98a585Andrew Sapperstein CmdArgs.push_back(OutputOpt->getValue(Args)); 1388d6eaacbb9eb56763d38a3815fc509b92ed98a585Andrew Sapperstein } else { 1389d6eaacbb9eb56763d38a3815fc509b92ed98a585Andrew Sapperstein CmdArgs.push_back("-auxbase"); 1390d6eaacbb9eb56763d38a3815fc509b92ed98a585Andrew Sapperstein CmdArgs.push_back(darwin::CC1::getBaseInputStem(Args, Inputs)); 1391d6eaacbb9eb56763d38a3815fc509b92ed98a585Andrew Sapperstein } 1392d6eaacbb9eb56763d38a3815fc509b92ed98a585Andrew Sapperstein 1393d6eaacbb9eb56763d38a3815fc509b92ed98a585Andrew Sapperstein Args.AddAllArgs(CmdArgs, options::OPT_g_Group); 1394d6eaacbb9eb56763d38a3815fc509b92ed98a585Andrew Sapperstein 1395d6eaacbb9eb56763d38a3815fc509b92ed98a585Andrew Sapperstein Args.AddAllArgs(CmdArgs, options::OPT_O); 1396d6eaacbb9eb56763d38a3815fc509b92ed98a585Andrew Sapperstein // FIXME: -Wall is getting some special treatment. Investigate. 1397d6eaacbb9eb56763d38a3815fc509b92ed98a585Andrew Sapperstein Args.AddAllArgs(CmdArgs, options::OPT_W_Group, options::OPT_pedantic_Group); 1398d6eaacbb9eb56763d38a3815fc509b92ed98a585Andrew Sapperstein Args.AddLastArg(CmdArgs, options::OPT_w); 1399d6eaacbb9eb56763d38a3815fc509b92ed98a585Andrew Sapperstein Args.AddAllArgs(CmdArgs, options::OPT_std_EQ, options::OPT_ansi, 1400d6eaacbb9eb56763d38a3815fc509b92ed98a585Andrew Sapperstein options::OPT_trigraphs); 1401d6eaacbb9eb56763d38a3815fc509b92ed98a585Andrew Sapperstein if (!Args.getLastArg(options::OPT_std_EQ, options::OPT_ansi)) { 14026ba612efffba42bec102ac58a1540496158f747eAndrew Sapperstein // Honor -std-default. 14036ba612efffba42bec102ac58a1540496158f747eAndrew Sapperstein Args.AddAllArgsTranslated(CmdArgs, options::OPT_std_default_EQ, 1404d6eaacbb9eb56763d38a3815fc509b92ed98a585Andrew Sapperstein "-std=", /*Joined=*/true); 1405d6eaacbb9eb56763d38a3815fc509b92ed98a585Andrew Sapperstein } 1406d6eaacbb9eb56763d38a3815fc509b92ed98a585Andrew Sapperstein 1407d6eaacbb9eb56763d38a3815fc509b92ed98a585Andrew Sapperstein if (Args.hasArg(options::OPT_v)) 1408d6eaacbb9eb56763d38a3815fc509b92ed98a585Andrew Sapperstein CmdArgs.push_back("-version"); 1409d6eaacbb9eb56763d38a3815fc509b92ed98a585Andrew Sapperstein if (Args.hasArg(options::OPT_pg)) 1410d6eaacbb9eb56763d38a3815fc509b92ed98a585Andrew Sapperstein CmdArgs.push_back("-p"); 1411d6eaacbb9eb56763d38a3815fc509b92ed98a585Andrew Sapperstein Args.AddLastArg(CmdArgs, options::OPT_p); 1412d6eaacbb9eb56763d38a3815fc509b92ed98a585Andrew Sapperstein 1413d6eaacbb9eb56763d38a3815fc509b92ed98a585Andrew Sapperstein // The driver treats -fsyntax-only specially. 1414d6eaacbb9eb56763d38a3815fc509b92ed98a585Andrew Sapperstein if (getToolChain().getTriple().getArch() == llvm::Triple::arm || 1415d6eaacbb9eb56763d38a3815fc509b92ed98a585Andrew Sapperstein getToolChain().getTriple().getArch() == llvm::Triple::thumb) { 1416d6eaacbb9eb56763d38a3815fc509b92ed98a585Andrew Sapperstein // Removes -fbuiltin-str{cat,cpy}; these aren't recognized by cc1 but are 1417d6eaacbb9eb56763d38a3815fc509b92ed98a585Andrew Sapperstein // used to inhibit the default -fno-builtin-str{cat,cpy}. 1418d6eaacbb9eb56763d38a3815fc509b92ed98a585Andrew Sapperstein // 1419d6eaacbb9eb56763d38a3815fc509b92ed98a585Andrew Sapperstein // FIXME: Should we grow a better way to deal with "removing" args? 1420d6eaacbb9eb56763d38a3815fc509b92ed98a585Andrew Sapperstein for (arg_iterator it = Args.filtered_begin(options::OPT_f_Group, 1421d6eaacbb9eb56763d38a3815fc509b92ed98a585Andrew Sapperstein options::OPT_fsyntax_only), 1422d6eaacbb9eb56763d38a3815fc509b92ed98a585Andrew Sapperstein ie = Args.filtered_end(); it != ie; ++it) { 1423d6eaacbb9eb56763d38a3815fc509b92ed98a585Andrew Sapperstein if (!it->getOption().matches(options::OPT_fbuiltin_strcat) && 1424d6eaacbb9eb56763d38a3815fc509b92ed98a585Andrew Sapperstein !it->getOption().matches(options::OPT_fbuiltin_strcpy)) { 1425d6eaacbb9eb56763d38a3815fc509b92ed98a585Andrew Sapperstein it->claim(); 1426d6eaacbb9eb56763d38a3815fc509b92ed98a585Andrew Sapperstein it->render(Args, CmdArgs); 1427d6eaacbb9eb56763d38a3815fc509b92ed98a585Andrew Sapperstein } 1428d6eaacbb9eb56763d38a3815fc509b92ed98a585Andrew Sapperstein } 1429d6eaacbb9eb56763d38a3815fc509b92ed98a585Andrew Sapperstein } else 1430d6eaacbb9eb56763d38a3815fc509b92ed98a585Andrew Sapperstein Args.AddAllArgs(CmdArgs, options::OPT_f_Group, options::OPT_fsyntax_only); 1431d6eaacbb9eb56763d38a3815fc509b92ed98a585Andrew Sapperstein 1432d6eaacbb9eb56763d38a3815fc509b92ed98a585Andrew Sapperstein Args.AddAllArgs(CmdArgs, options::OPT_undef); 1433d6eaacbb9eb56763d38a3815fc509b92ed98a585Andrew Sapperstein if (Args.hasArg(options::OPT_Qn)) 1434d6eaacbb9eb56763d38a3815fc509b92ed98a585Andrew Sapperstein CmdArgs.push_back("-fno-ident"); 1435d6eaacbb9eb56763d38a3815fc509b92ed98a585Andrew Sapperstein 14366ba612efffba42bec102ac58a1540496158f747eAndrew Sapperstein // FIXME: This isn't correct. 14376ba612efffba42bec102ac58a1540496158f747eAndrew Sapperstein //Args.AddLastArg(CmdArgs, options::OPT__help) 1438d6eaacbb9eb56763d38a3815fc509b92ed98a585Andrew Sapperstein //Args.AddLastArg(CmdArgs, options::OPT__targetHelp) 1439d6eaacbb9eb56763d38a3815fc509b92ed98a585Andrew Sapperstein 1440d6eaacbb9eb56763d38a3815fc509b92ed98a585Andrew Sapperstein CmdArgs.append(OutputArgs.begin(), OutputArgs.end()); 1441d6eaacbb9eb56763d38a3815fc509b92ed98a585Andrew Sapperstein 1442d6eaacbb9eb56763d38a3815fc509b92ed98a585Andrew Sapperstein // FIXME: Still don't get what is happening here. Investigate. 1443d6eaacbb9eb56763d38a3815fc509b92ed98a585Andrew Sapperstein Args.AddAllArgs(CmdArgs, options::OPT__param); 1444d6eaacbb9eb56763d38a3815fc509b92ed98a585Andrew Sapperstein 1445d6eaacbb9eb56763d38a3815fc509b92ed98a585Andrew Sapperstein if (Args.hasArg(options::OPT_fmudflap) || 14466ba612efffba42bec102ac58a1540496158f747eAndrew Sapperstein Args.hasArg(options::OPT_fmudflapth)) { 1447d6eaacbb9eb56763d38a3815fc509b92ed98a585Andrew Sapperstein CmdArgs.push_back("-fno-builtin"); 1448d6eaacbb9eb56763d38a3815fc509b92ed98a585Andrew Sapperstein CmdArgs.push_back("-fno-merge-constants"); 1449d6eaacbb9eb56763d38a3815fc509b92ed98a585Andrew Sapperstein } 1450d6eaacbb9eb56763d38a3815fc509b92ed98a585Andrew Sapperstein 1451d6eaacbb9eb56763d38a3815fc509b92ed98a585Andrew Sapperstein if (Args.hasArg(options::OPT_coverage)) { 1452d6eaacbb9eb56763d38a3815fc509b92ed98a585Andrew Sapperstein CmdArgs.push_back("-fprofile-arcs"); 1453d6eaacbb9eb56763d38a3815fc509b92ed98a585Andrew Sapperstein CmdArgs.push_back("-ftest-coverage"); 1454d6eaacbb9eb56763d38a3815fc509b92ed98a585Andrew Sapperstein } 1455d6eaacbb9eb56763d38a3815fc509b92ed98a585Andrew Sapperstein 1456d6eaacbb9eb56763d38a3815fc509b92ed98a585Andrew Sapperstein if (types::isCXX(Inputs[0].getType())) 1457d6eaacbb9eb56763d38a3815fc509b92ed98a585Andrew Sapperstein CmdArgs.push_back("-D__private_extern__=extern"); 1458d6eaacbb9eb56763d38a3815fc509b92ed98a585Andrew Sapperstein} 1459d6eaacbb9eb56763d38a3815fc509b92ed98a585Andrew Sapperstein 1460d6eaacbb9eb56763d38a3815fc509b92ed98a585Andrew Sappersteinvoid darwin::CC1::AddCPPOptionsArgs(const ArgList &Args, ArgStringList &CmdArgs, 1461d6eaacbb9eb56763d38a3815fc509b92ed98a585Andrew Sapperstein const InputInfoList &Inputs, 1462d6eaacbb9eb56763d38a3815fc509b92ed98a585Andrew Sapperstein const ArgStringList &OutputArgs) const { 1463d6eaacbb9eb56763d38a3815fc509b92ed98a585Andrew Sapperstein // Derived from cpp_options 1464d6eaacbb9eb56763d38a3815fc509b92ed98a585Andrew Sapperstein AddCPPUniqueOptionsArgs(Args, CmdArgs, Inputs); 1465d6eaacbb9eb56763d38a3815fc509b92ed98a585Andrew Sapperstein 1466d6eaacbb9eb56763d38a3815fc509b92ed98a585Andrew Sapperstein CmdArgs.append(OutputArgs.begin(), OutputArgs.end()); 1467d6eaacbb9eb56763d38a3815fc509b92ed98a585Andrew Sapperstein 1468d6eaacbb9eb56763d38a3815fc509b92ed98a585Andrew Sapperstein AddCC1Args(Args, CmdArgs); 1469d6eaacbb9eb56763d38a3815fc509b92ed98a585Andrew Sapperstein 1470d6eaacbb9eb56763d38a3815fc509b92ed98a585Andrew Sapperstein // NOTE: The code below has some commonality with cpp_options, but 14716ba612efffba42bec102ac58a1540496158f747eAndrew Sapperstein // in classic gcc style ends up sending things in different 1472d6eaacbb9eb56763d38a3815fc509b92ed98a585Andrew Sapperstein // orders. This may be a good merge candidate once we drop pedantic 1473d6eaacbb9eb56763d38a3815fc509b92ed98a585Andrew Sapperstein // compatibility. 1474d6eaacbb9eb56763d38a3815fc509b92ed98a585Andrew Sapperstein 1475d6eaacbb9eb56763d38a3815fc509b92ed98a585Andrew Sapperstein Args.AddAllArgs(CmdArgs, options::OPT_m_Group); 1476d6eaacbb9eb56763d38a3815fc509b92ed98a585Andrew Sapperstein Args.AddAllArgs(CmdArgs, options::OPT_std_EQ, options::OPT_ansi, 1477d6eaacbb9eb56763d38a3815fc509b92ed98a585Andrew Sapperstein options::OPT_trigraphs); 1478d6eaacbb9eb56763d38a3815fc509b92ed98a585Andrew Sapperstein if (!Args.getLastArg(options::OPT_std_EQ, options::OPT_ansi)) { 1479d6eaacbb9eb56763d38a3815fc509b92ed98a585Andrew Sapperstein // Honor -std-default. 1480d6eaacbb9eb56763d38a3815fc509b92ed98a585Andrew Sapperstein Args.AddAllArgsTranslated(CmdArgs, options::OPT_std_default_EQ, 1481d6eaacbb9eb56763d38a3815fc509b92ed98a585Andrew Sapperstein "-std=", /*Joined=*/true); 1482d6eaacbb9eb56763d38a3815fc509b92ed98a585Andrew Sapperstein } 1483d6eaacbb9eb56763d38a3815fc509b92ed98a585Andrew Sapperstein Args.AddAllArgs(CmdArgs, options::OPT_W_Group, options::OPT_pedantic_Group); 1484d6eaacbb9eb56763d38a3815fc509b92ed98a585Andrew Sapperstein Args.AddLastArg(CmdArgs, options::OPT_w); 1485d6eaacbb9eb56763d38a3815fc509b92ed98a585Andrew Sapperstein 1486d6eaacbb9eb56763d38a3815fc509b92ed98a585Andrew Sapperstein // The driver treats -fsyntax-only specially. 1487d6eaacbb9eb56763d38a3815fc509b92ed98a585Andrew Sapperstein Args.AddAllArgs(CmdArgs, options::OPT_f_Group, options::OPT_fsyntax_only); 1488d6eaacbb9eb56763d38a3815fc509b92ed98a585Andrew Sapperstein 1489d6eaacbb9eb56763d38a3815fc509b92ed98a585Andrew Sapperstein if (Args.hasArg(options::OPT_g_Group) && !Args.hasArg(options::OPT_g0) && 1490d6eaacbb9eb56763d38a3815fc509b92ed98a585Andrew Sapperstein !Args.hasArg(options::OPT_fno_working_directory)) 1491d6eaacbb9eb56763d38a3815fc509b92ed98a585Andrew Sapperstein CmdArgs.push_back("-fworking-directory"); 1492d6eaacbb9eb56763d38a3815fc509b92ed98a585Andrew Sapperstein 1493d6eaacbb9eb56763d38a3815fc509b92ed98a585Andrew Sapperstein Args.AddAllArgs(CmdArgs, options::OPT_O); 1494d6eaacbb9eb56763d38a3815fc509b92ed98a585Andrew Sapperstein Args.AddAllArgs(CmdArgs, options::OPT_undef); 1495d6eaacbb9eb56763d38a3815fc509b92ed98a585Andrew Sapperstein if (Args.hasArg(options::OPT_save_temps)) 1496d6eaacbb9eb56763d38a3815fc509b92ed98a585Andrew Sapperstein CmdArgs.push_back("-fpch-preprocess"); 1497d6eaacbb9eb56763d38a3815fc509b92ed98a585Andrew Sapperstein} 1498d6eaacbb9eb56763d38a3815fc509b92ed98a585Andrew Sapperstein 1499d6eaacbb9eb56763d38a3815fc509b92ed98a585Andrew Sappersteinvoid darwin::CC1::AddCPPUniqueOptionsArgs(const ArgList &Args, 1500d6eaacbb9eb56763d38a3815fc509b92ed98a585Andrew Sapperstein ArgStringList &CmdArgs, 1501d6eaacbb9eb56763d38a3815fc509b92ed98a585Andrew Sapperstein const InputInfoList &Inputs) const { 1502d6eaacbb9eb56763d38a3815fc509b92ed98a585Andrew Sapperstein const Driver &D = getToolChain().getHost().getDriver(); 1503d6eaacbb9eb56763d38a3815fc509b92ed98a585Andrew Sapperstein 1504d6eaacbb9eb56763d38a3815fc509b92ed98a585Andrew Sapperstein CheckPreprocessingOptions(D, Args); 1505d6eaacbb9eb56763d38a3815fc509b92ed98a585Andrew Sapperstein 1506d6eaacbb9eb56763d38a3815fc509b92ed98a585Andrew Sapperstein // Derived from cpp_unique_options. 1507d6eaacbb9eb56763d38a3815fc509b92ed98a585Andrew Sapperstein // -{C,CC} only with -E is checked in CheckPreprocessingOptions(). 15086ba612efffba42bec102ac58a1540496158f747eAndrew Sapperstein Args.AddLastArg(CmdArgs, options::OPT_C); 1509d6eaacbb9eb56763d38a3815fc509b92ed98a585Andrew Sapperstein Args.AddLastArg(CmdArgs, options::OPT_CC); 1510d6eaacbb9eb56763d38a3815fc509b92ed98a585Andrew Sapperstein if (!Args.hasArg(options::OPT_Q)) 1511d6eaacbb9eb56763d38a3815fc509b92ed98a585Andrew Sapperstein CmdArgs.push_back("-quiet"); 1512d6eaacbb9eb56763d38a3815fc509b92ed98a585Andrew Sapperstein Args.AddAllArgs(CmdArgs, options::OPT_nostdinc); 15136ba612efffba42bec102ac58a1540496158f747eAndrew Sapperstein Args.AddLastArg(CmdArgs, options::OPT_v); 1514d6eaacbb9eb56763d38a3815fc509b92ed98a585Andrew Sapperstein Args.AddAllArgs(CmdArgs, options::OPT_I_Group, options::OPT_F); 1515d6eaacbb9eb56763d38a3815fc509b92ed98a585Andrew Sapperstein Args.AddLastArg(CmdArgs, options::OPT_P); 1516d6eaacbb9eb56763d38a3815fc509b92ed98a585Andrew Sapperstein 15176ba612efffba42bec102ac58a1540496158f747eAndrew Sapperstein // FIXME: Handle %I properly. 1518d6eaacbb9eb56763d38a3815fc509b92ed98a585Andrew Sapperstein if (getToolChain().getArchName() == "x86_64") { 1519d6eaacbb9eb56763d38a3815fc509b92ed98a585Andrew Sapperstein CmdArgs.push_back("-imultilib"); 1520d6eaacbb9eb56763d38a3815fc509b92ed98a585Andrew Sapperstein CmdArgs.push_back("x86_64"); 1521d6eaacbb9eb56763d38a3815fc509b92ed98a585Andrew Sapperstein } 1522d6eaacbb9eb56763d38a3815fc509b92ed98a585Andrew Sapperstein 1523d6eaacbb9eb56763d38a3815fc509b92ed98a585Andrew Sapperstein if (Args.hasArg(options::OPT_MD)) { 1524d6eaacbb9eb56763d38a3815fc509b92ed98a585Andrew Sapperstein CmdArgs.push_back("-MD"); 1525d6eaacbb9eb56763d38a3815fc509b92ed98a585Andrew Sapperstein CmdArgs.push_back(darwin::CC1::getDependencyFileName(Args, Inputs)); 1526d6eaacbb9eb56763d38a3815fc509b92ed98a585Andrew Sapperstein } 1527d6eaacbb9eb56763d38a3815fc509b92ed98a585Andrew Sapperstein 1528d6eaacbb9eb56763d38a3815fc509b92ed98a585Andrew Sapperstein if (Args.hasArg(options::OPT_MMD)) { 1529d6eaacbb9eb56763d38a3815fc509b92ed98a585Andrew Sapperstein CmdArgs.push_back("-MMD"); 15306ba612efffba42bec102ac58a1540496158f747eAndrew Sapperstein CmdArgs.push_back(darwin::CC1::getDependencyFileName(Args, Inputs)); 1531d6eaacbb9eb56763d38a3815fc509b92ed98a585Andrew Sapperstein } 1532d6eaacbb9eb56763d38a3815fc509b92ed98a585Andrew Sapperstein 1533d6eaacbb9eb56763d38a3815fc509b92ed98a585Andrew Sapperstein Args.AddLastArg(CmdArgs, options::OPT_M); 1534d6eaacbb9eb56763d38a3815fc509b92ed98a585Andrew Sapperstein Args.AddLastArg(CmdArgs, options::OPT_MM); 1535d6eaacbb9eb56763d38a3815fc509b92ed98a585Andrew Sapperstein Args.AddAllArgs(CmdArgs, options::OPT_MF); 1536d6eaacbb9eb56763d38a3815fc509b92ed98a585Andrew Sapperstein Args.AddLastArg(CmdArgs, options::OPT_MG); 1537d6eaacbb9eb56763d38a3815fc509b92ed98a585Andrew Sapperstein Args.AddLastArg(CmdArgs, options::OPT_MP); 1538d6eaacbb9eb56763d38a3815fc509b92ed98a585Andrew Sapperstein Args.AddAllArgs(CmdArgs, options::OPT_MQ); 1539d6eaacbb9eb56763d38a3815fc509b92ed98a585Andrew Sapperstein Args.AddAllArgs(CmdArgs, options::OPT_MT); 1540d6eaacbb9eb56763d38a3815fc509b92ed98a585Andrew Sapperstein if (!Args.hasArg(options::OPT_M) && !Args.hasArg(options::OPT_MM) && 1541d6eaacbb9eb56763d38a3815fc509b92ed98a585Andrew Sapperstein (Args.hasArg(options::OPT_MD) || Args.hasArg(options::OPT_MMD))) { 1542d6eaacbb9eb56763d38a3815fc509b92ed98a585Andrew Sapperstein if (Arg *OutputOpt = Args.getLastArg(options::OPT_o)) { 1543d6eaacbb9eb56763d38a3815fc509b92ed98a585Andrew Sapperstein CmdArgs.push_back("-MQ"); 1544d6eaacbb9eb56763d38a3815fc509b92ed98a585Andrew Sapperstein CmdArgs.push_back(OutputOpt->getValue(Args)); 1545d6eaacbb9eb56763d38a3815fc509b92ed98a585Andrew Sapperstein } 1546d6eaacbb9eb56763d38a3815fc509b92ed98a585Andrew Sapperstein } 1547d6eaacbb9eb56763d38a3815fc509b92ed98a585Andrew Sapperstein 1548d6eaacbb9eb56763d38a3815fc509b92ed98a585Andrew Sapperstein Args.AddLastArg(CmdArgs, options::OPT_remap); 1549d6eaacbb9eb56763d38a3815fc509b92ed98a585Andrew Sapperstein if (Args.hasArg(options::OPT_g3)) 15506ba612efffba42bec102ac58a1540496158f747eAndrew Sapperstein CmdArgs.push_back("-dD"); 1551d6eaacbb9eb56763d38a3815fc509b92ed98a585Andrew Sapperstein Args.AddLastArg(CmdArgs, options::OPT_H); 1552d6eaacbb9eb56763d38a3815fc509b92ed98a585Andrew Sapperstein 1553d6eaacbb9eb56763d38a3815fc509b92ed98a585Andrew Sapperstein AddCPPArgs(Args, CmdArgs); 1554d6eaacbb9eb56763d38a3815fc509b92ed98a585Andrew Sapperstein 1555d6eaacbb9eb56763d38a3815fc509b92ed98a585Andrew Sapperstein Args.AddAllArgs(CmdArgs, options::OPT_D, options::OPT_U, options::OPT_A); 1556d6eaacbb9eb56763d38a3815fc509b92ed98a585Andrew Sapperstein Args.AddAllArgs(CmdArgs, options::OPT_i_Group); 1557d6eaacbb9eb56763d38a3815fc509b92ed98a585Andrew Sapperstein 1558d6eaacbb9eb56763d38a3815fc509b92ed98a585Andrew Sapperstein for (InputInfoList::const_iterator 1559d6eaacbb9eb56763d38a3815fc509b92ed98a585Andrew Sapperstein it = Inputs.begin(), ie = Inputs.end(); it != ie; ++it) { 1560d6eaacbb9eb56763d38a3815fc509b92ed98a585Andrew Sapperstein const InputInfo &II = *it; 1561d6eaacbb9eb56763d38a3815fc509b92ed98a585Andrew Sapperstein 1562d6eaacbb9eb56763d38a3815fc509b92ed98a585Andrew Sapperstein if (II.isPipe()) 1563d6eaacbb9eb56763d38a3815fc509b92ed98a585Andrew Sapperstein CmdArgs.push_back("-"); 1564d6eaacbb9eb56763d38a3815fc509b92ed98a585Andrew Sapperstein else 1565d6eaacbb9eb56763d38a3815fc509b92ed98a585Andrew Sapperstein CmdArgs.push_back(II.getFilename()); 1566d6eaacbb9eb56763d38a3815fc509b92ed98a585Andrew Sapperstein } 1567d6eaacbb9eb56763d38a3815fc509b92ed98a585Andrew Sapperstein 1568d6eaacbb9eb56763d38a3815fc509b92ed98a585Andrew Sapperstein Args.AddAllArgValues(CmdArgs, options::OPT_Wp_COMMA, 1569d6eaacbb9eb56763d38a3815fc509b92ed98a585Andrew Sapperstein options::OPT_Xpreprocessor); 1570d6eaacbb9eb56763d38a3815fc509b92ed98a585Andrew Sapperstein 1571d6eaacbb9eb56763d38a3815fc509b92ed98a585Andrew Sapperstein if (Args.hasArg(options::OPT_fmudflap)) { 1572d6eaacbb9eb56763d38a3815fc509b92ed98a585Andrew Sapperstein CmdArgs.push_back("-D_MUDFLAP"); 1573d6eaacbb9eb56763d38a3815fc509b92ed98a585Andrew Sapperstein CmdArgs.push_back("-include"); 15746ba612efffba42bec102ac58a1540496158f747eAndrew Sapperstein CmdArgs.push_back("mf-runtime.h"); 1575d6eaacbb9eb56763d38a3815fc509b92ed98a585Andrew Sapperstein } 1576d6eaacbb9eb56763d38a3815fc509b92ed98a585Andrew Sapperstein 1577d6eaacbb9eb56763d38a3815fc509b92ed98a585Andrew Sapperstein if (Args.hasArg(options::OPT_fmudflapth)) { 1578d6eaacbb9eb56763d38a3815fc509b92ed98a585Andrew Sapperstein CmdArgs.push_back("-D_MUDFLAP"); 1579d6eaacbb9eb56763d38a3815fc509b92ed98a585Andrew Sapperstein CmdArgs.push_back("-D_MUDFLAPTH"); 1580d6eaacbb9eb56763d38a3815fc509b92ed98a585Andrew Sapperstein CmdArgs.push_back("-include"); 1581d6eaacbb9eb56763d38a3815fc509b92ed98a585Andrew Sapperstein CmdArgs.push_back("mf-runtime.h"); 15826ba612efffba42bec102ac58a1540496158f747eAndrew Sapperstein } 1583d6eaacbb9eb56763d38a3815fc509b92ed98a585Andrew Sapperstein} 1584d6eaacbb9eb56763d38a3815fc509b92ed98a585Andrew Sapperstein 1585d6eaacbb9eb56763d38a3815fc509b92ed98a585Andrew Sappersteinvoid darwin::CC1::AddCPPArgs(const ArgList &Args, 1586d6eaacbb9eb56763d38a3815fc509b92ed98a585Andrew Sapperstein ArgStringList &CmdArgs) const { 1587d6eaacbb9eb56763d38a3815fc509b92ed98a585Andrew Sapperstein // Derived from cpp spec. 1588d6eaacbb9eb56763d38a3815fc509b92ed98a585Andrew Sapperstein 15896ba612efffba42bec102ac58a1540496158f747eAndrew Sapperstein if (Args.hasArg(options::OPT_static)) { 1590d6eaacbb9eb56763d38a3815fc509b92ed98a585Andrew Sapperstein // The gcc spec is broken here, it refers to dynamic but 1591d6eaacbb9eb56763d38a3815fc509b92ed98a585Andrew Sapperstein // that has been translated. Start by being bug compatible. 1592d6eaacbb9eb56763d38a3815fc509b92ed98a585Andrew Sapperstein 1593d6eaacbb9eb56763d38a3815fc509b92ed98a585Andrew Sapperstein // if (!Args.hasArg(arglist.parser.dynamicOption)) 1594d6eaacbb9eb56763d38a3815fc509b92ed98a585Andrew Sapperstein CmdArgs.push_back("-D__STATIC__"); 1595d6eaacbb9eb56763d38a3815fc509b92ed98a585Andrew Sapperstein } else 1596d6eaacbb9eb56763d38a3815fc509b92ed98a585Andrew Sapperstein CmdArgs.push_back("-D__DYNAMIC__"); 1597d6eaacbb9eb56763d38a3815fc509b92ed98a585Andrew Sapperstein 1598d6eaacbb9eb56763d38a3815fc509b92ed98a585Andrew Sapperstein if (Args.hasArg(options::OPT_pthread)) 1599d6eaacbb9eb56763d38a3815fc509b92ed98a585Andrew Sapperstein CmdArgs.push_back("-D_REENTRANT"); 1600d6eaacbb9eb56763d38a3815fc509b92ed98a585Andrew Sapperstein} 1601d6eaacbb9eb56763d38a3815fc509b92ed98a585Andrew Sapperstein 1602d6eaacbb9eb56763d38a3815fc509b92ed98a585Andrew Sappersteinvoid darwin::Preprocess::ConstructJob(Compilation &C, const JobAction &JA, 1603d6eaacbb9eb56763d38a3815fc509b92ed98a585Andrew Sapperstein Job &Dest, const InputInfo &Output, 1604d6eaacbb9eb56763d38a3815fc509b92ed98a585Andrew Sapperstein const InputInfoList &Inputs, 16056ba612efffba42bec102ac58a1540496158f747eAndrew Sapperstein const ArgList &Args, 1606d6eaacbb9eb56763d38a3815fc509b92ed98a585Andrew Sapperstein const char *LinkingOutput) const { 1607d6eaacbb9eb56763d38a3815fc509b92ed98a585Andrew Sapperstein ArgStringList CmdArgs; 1608d6eaacbb9eb56763d38a3815fc509b92ed98a585Andrew Sapperstein 16096ba612efffba42bec102ac58a1540496158f747eAndrew Sapperstein assert(Inputs.size() == 1 && "Unexpected number of inputs!"); 1610d6eaacbb9eb56763d38a3815fc509b92ed98a585Andrew Sapperstein 1611d6eaacbb9eb56763d38a3815fc509b92ed98a585Andrew Sapperstein CmdArgs.push_back("-E"); 1612d6eaacbb9eb56763d38a3815fc509b92ed98a585Andrew Sapperstein 1613d6eaacbb9eb56763d38a3815fc509b92ed98a585Andrew Sapperstein if (Args.hasArg(options::OPT_traditional) || 1614d6eaacbb9eb56763d38a3815fc509b92ed98a585Andrew Sapperstein Args.hasArg(options::OPT_traditional_cpp)) 1615d6eaacbb9eb56763d38a3815fc509b92ed98a585Andrew Sapperstein CmdArgs.push_back("-traditional-cpp"); 1616d6eaacbb9eb56763d38a3815fc509b92ed98a585Andrew Sapperstein 1617d6eaacbb9eb56763d38a3815fc509b92ed98a585Andrew Sapperstein ArgStringList OutputArgs; 1618d6eaacbb9eb56763d38a3815fc509b92ed98a585Andrew Sapperstein if (Output.isFilename()) { 1619d6eaacbb9eb56763d38a3815fc509b92ed98a585Andrew Sapperstein OutputArgs.push_back("-o"); 1620d6eaacbb9eb56763d38a3815fc509b92ed98a585Andrew Sapperstein OutputArgs.push_back(Output.getFilename()); 1621d6eaacbb9eb56763d38a3815fc509b92ed98a585Andrew Sapperstein } else { 16226ba612efffba42bec102ac58a1540496158f747eAndrew Sapperstein assert(Output.isPipe() && "Unexpected CC1 output."); 1623d6eaacbb9eb56763d38a3815fc509b92ed98a585Andrew Sapperstein } 1624d6eaacbb9eb56763d38a3815fc509b92ed98a585Andrew Sapperstein 1625d6eaacbb9eb56763d38a3815fc509b92ed98a585Andrew Sapperstein if (Args.hasArg(options::OPT_E)) { 1626d6eaacbb9eb56763d38a3815fc509b92ed98a585Andrew Sapperstein AddCPPOptionsArgs(Args, CmdArgs, Inputs, OutputArgs); 1627d6eaacbb9eb56763d38a3815fc509b92ed98a585Andrew Sapperstein } else { 1628d6eaacbb9eb56763d38a3815fc509b92ed98a585Andrew Sapperstein AddCPPOptionsArgs(Args, CmdArgs, Inputs, ArgStringList()); 1629d6eaacbb9eb56763d38a3815fc509b92ed98a585Andrew Sapperstein CmdArgs.append(OutputArgs.begin(), OutputArgs.end()); 1630d6eaacbb9eb56763d38a3815fc509b92ed98a585Andrew Sapperstein } 1631d6eaacbb9eb56763d38a3815fc509b92ed98a585Andrew Sapperstein 1632d6eaacbb9eb56763d38a3815fc509b92ed98a585Andrew Sapperstein Args.AddAllArgs(CmdArgs, options::OPT_d_Group); 1633d6eaacbb9eb56763d38a3815fc509b92ed98a585Andrew Sapperstein 1634d6eaacbb9eb56763d38a3815fc509b92ed98a585Andrew Sapperstein const char *CC1Name = getCC1Name(Inputs[0].getType()); 1635d6eaacbb9eb56763d38a3815fc509b92ed98a585Andrew Sapperstein const char *Exec = 1636d6eaacbb9eb56763d38a3815fc509b92ed98a585Andrew Sapperstein Args.MakeArgString(getToolChain().GetProgramPath(C, CC1Name)); 1637d6eaacbb9eb56763d38a3815fc509b92ed98a585Andrew Sapperstein Dest.addCommand(new Command(JA, *this, Exec, CmdArgs)); 1638d6eaacbb9eb56763d38a3815fc509b92ed98a585Andrew Sapperstein} 1639d6eaacbb9eb56763d38a3815fc509b92ed98a585Andrew Sapperstein 1640d6eaacbb9eb56763d38a3815fc509b92ed98a585Andrew Sappersteinvoid darwin::Compile::ConstructJob(Compilation &C, const JobAction &JA, 1641d6eaacbb9eb56763d38a3815fc509b92ed98a585Andrew Sapperstein Job &Dest, const InputInfo &Output, 1642d6eaacbb9eb56763d38a3815fc509b92ed98a585Andrew Sapperstein const InputInfoList &Inputs, 1643d6eaacbb9eb56763d38a3815fc509b92ed98a585Andrew Sapperstein const ArgList &Args, 1644d6eaacbb9eb56763d38a3815fc509b92ed98a585Andrew Sapperstein const char *LinkingOutput) const { 1645d6eaacbb9eb56763d38a3815fc509b92ed98a585Andrew Sapperstein const Driver &D = getToolChain().getHost().getDriver(); 1646d6eaacbb9eb56763d38a3815fc509b92ed98a585Andrew Sapperstein ArgStringList CmdArgs; 1647d6eaacbb9eb56763d38a3815fc509b92ed98a585Andrew Sapperstein 1648d6eaacbb9eb56763d38a3815fc509b92ed98a585Andrew Sapperstein assert(Inputs.size() == 1 && "Unexpected number of inputs!"); 1649d6eaacbb9eb56763d38a3815fc509b92ed98a585Andrew Sapperstein 1650d6eaacbb9eb56763d38a3815fc509b92ed98a585Andrew Sapperstein types::ID InputType = Inputs[0].getType(); 1651d6eaacbb9eb56763d38a3815fc509b92ed98a585Andrew Sapperstein const Arg *A; 1652d6eaacbb9eb56763d38a3815fc509b92ed98a585Andrew Sapperstein if ((A = Args.getLastArg(options::OPT_traditional))) 1653d6eaacbb9eb56763d38a3815fc509b92ed98a585Andrew Sapperstein D.Diag(clang::diag::err_drv_argument_only_allowed_with) 1654d6eaacbb9eb56763d38a3815fc509b92ed98a585Andrew Sapperstein << A->getAsString(Args) << "-E"; 1655d6eaacbb9eb56763d38a3815fc509b92ed98a585Andrew Sapperstein 1656d6eaacbb9eb56763d38a3815fc509b92ed98a585Andrew Sapperstein if (Output.getType() == types::TY_LLVMAsm) 1657d6eaacbb9eb56763d38a3815fc509b92ed98a585Andrew Sapperstein CmdArgs.push_back("-emit-llvm"); 1658d6eaacbb9eb56763d38a3815fc509b92ed98a585Andrew Sapperstein else if (Output.getType() == types::TY_LLVMBC) 1659d6eaacbb9eb56763d38a3815fc509b92ed98a585Andrew Sapperstein CmdArgs.push_back("-emit-llvm-bc"); 1660d6eaacbb9eb56763d38a3815fc509b92ed98a585Andrew Sapperstein else if (Output.getType() == types::TY_AST) 1661d6eaacbb9eb56763d38a3815fc509b92ed98a585Andrew Sapperstein D.Diag(clang::diag::err_drv_no_ast_support) 1662d6eaacbb9eb56763d38a3815fc509b92ed98a585Andrew Sapperstein << getToolChain().getTripleString(); 16636ba612efffba42bec102ac58a1540496158f747eAndrew Sapperstein 16646ba612efffba42bec102ac58a1540496158f747eAndrew Sapperstein ArgStringList OutputArgs; 1665d6eaacbb9eb56763d38a3815fc509b92ed98a585Andrew Sapperstein if (Output.getType() != types::TY_PCH) { 1666d6eaacbb9eb56763d38a3815fc509b92ed98a585Andrew Sapperstein OutputArgs.push_back("-o"); 1667d6eaacbb9eb56763d38a3815fc509b92ed98a585Andrew Sapperstein if (Output.isPipe()) 1668d6eaacbb9eb56763d38a3815fc509b92ed98a585Andrew Sapperstein OutputArgs.push_back("-"); 1669d6eaacbb9eb56763d38a3815fc509b92ed98a585Andrew Sapperstein else if (Output.isNothing()) 1670d6eaacbb9eb56763d38a3815fc509b92ed98a585Andrew Sapperstein OutputArgs.push_back("/dev/null"); 1671d6eaacbb9eb56763d38a3815fc509b92ed98a585Andrew Sapperstein else 1672d6eaacbb9eb56763d38a3815fc509b92ed98a585Andrew Sapperstein OutputArgs.push_back(Output.getFilename()); 1673d6eaacbb9eb56763d38a3815fc509b92ed98a585Andrew Sapperstein } 1674d6eaacbb9eb56763d38a3815fc509b92ed98a585Andrew Sapperstein 1675d6eaacbb9eb56763d38a3815fc509b92ed98a585Andrew Sapperstein // There is no need for this level of compatibility, but it makes 1676d6eaacbb9eb56763d38a3815fc509b92ed98a585Andrew Sapperstein // diffing easier. 1677d6eaacbb9eb56763d38a3815fc509b92ed98a585Andrew Sapperstein bool OutputArgsEarly = (Args.hasArg(options::OPT_fsyntax_only) || 1678d6eaacbb9eb56763d38a3815fc509b92ed98a585Andrew Sapperstein Args.hasArg(options::OPT_S)); 1679d6eaacbb9eb56763d38a3815fc509b92ed98a585Andrew Sapperstein 1680d6eaacbb9eb56763d38a3815fc509b92ed98a585Andrew Sapperstein if (types::getPreprocessedType(InputType) != types::TY_INVALID) { 1681d6eaacbb9eb56763d38a3815fc509b92ed98a585Andrew Sapperstein AddCPPUniqueOptionsArgs(Args, CmdArgs, Inputs); 1682d6eaacbb9eb56763d38a3815fc509b92ed98a585Andrew Sapperstein if (OutputArgsEarly) { 1683d6eaacbb9eb56763d38a3815fc509b92ed98a585Andrew Sapperstein AddCC1OptionsArgs(Args, CmdArgs, Inputs, OutputArgs); 16846ba612efffba42bec102ac58a1540496158f747eAndrew Sapperstein } else { 16856ba612efffba42bec102ac58a1540496158f747eAndrew Sapperstein AddCC1OptionsArgs(Args, CmdArgs, Inputs, ArgStringList()); 1686d6eaacbb9eb56763d38a3815fc509b92ed98a585Andrew Sapperstein CmdArgs.append(OutputArgs.begin(), OutputArgs.end()); 1687d6eaacbb9eb56763d38a3815fc509b92ed98a585Andrew Sapperstein } 1688d6eaacbb9eb56763d38a3815fc509b92ed98a585Andrew Sapperstein } else { 1689d6eaacbb9eb56763d38a3815fc509b92ed98a585Andrew Sapperstein CmdArgs.push_back("-fpreprocessed"); 1690d6eaacbb9eb56763d38a3815fc509b92ed98a585Andrew Sapperstein 1691d6eaacbb9eb56763d38a3815fc509b92ed98a585Andrew Sapperstein for (InputInfoList::const_iterator 1692d6eaacbb9eb56763d38a3815fc509b92ed98a585Andrew Sapperstein it = Inputs.begin(), ie = Inputs.end(); it != ie; ++it) { 1693d6eaacbb9eb56763d38a3815fc509b92ed98a585Andrew Sapperstein const InputInfo &II = *it; 1694d6eaacbb9eb56763d38a3815fc509b92ed98a585Andrew Sapperstein 1695d6eaacbb9eb56763d38a3815fc509b92ed98a585Andrew Sapperstein // Reject AST inputs. 1696d6eaacbb9eb56763d38a3815fc509b92ed98a585Andrew Sapperstein if (II.getType() == types::TY_AST) { 1697d6eaacbb9eb56763d38a3815fc509b92ed98a585Andrew Sapperstein D.Diag(clang::diag::err_drv_no_ast_support) 1698d6eaacbb9eb56763d38a3815fc509b92ed98a585Andrew Sapperstein << getToolChain().getTripleString(); 1699d6eaacbb9eb56763d38a3815fc509b92ed98a585Andrew Sapperstein return; 1700d6eaacbb9eb56763d38a3815fc509b92ed98a585Andrew Sapperstein } 1701d6eaacbb9eb56763d38a3815fc509b92ed98a585Andrew Sapperstein 1702d6eaacbb9eb56763d38a3815fc509b92ed98a585Andrew Sapperstein if (II.isPipe()) 1703d6eaacbb9eb56763d38a3815fc509b92ed98a585Andrew Sapperstein CmdArgs.push_back("-"); 1704d6eaacbb9eb56763d38a3815fc509b92ed98a585Andrew Sapperstein else 17056ba612efffba42bec102ac58a1540496158f747eAndrew Sapperstein CmdArgs.push_back(II.getFilename()); 17066ba612efffba42bec102ac58a1540496158f747eAndrew Sapperstein } 1707d6eaacbb9eb56763d38a3815fc509b92ed98a585Andrew Sapperstein 1708d6eaacbb9eb56763d38a3815fc509b92ed98a585Andrew Sapperstein if (OutputArgsEarly) { 1709d6eaacbb9eb56763d38a3815fc509b92ed98a585Andrew Sapperstein AddCC1OptionsArgs(Args, CmdArgs, Inputs, OutputArgs); 1710d6eaacbb9eb56763d38a3815fc509b92ed98a585Andrew Sapperstein } else { 1711d6eaacbb9eb56763d38a3815fc509b92ed98a585Andrew Sapperstein AddCC1OptionsArgs(Args, CmdArgs, Inputs, ArgStringList()); 1712d6eaacbb9eb56763d38a3815fc509b92ed98a585Andrew Sapperstein CmdArgs.append(OutputArgs.begin(), OutputArgs.end()); 1713d6eaacbb9eb56763d38a3815fc509b92ed98a585Andrew Sapperstein } 1714d6eaacbb9eb56763d38a3815fc509b92ed98a585Andrew Sapperstein } 1715d6eaacbb9eb56763d38a3815fc509b92ed98a585Andrew Sapperstein 1716d6eaacbb9eb56763d38a3815fc509b92ed98a585Andrew Sapperstein if (Output.getType() == types::TY_PCH) { 1717d6eaacbb9eb56763d38a3815fc509b92ed98a585Andrew Sapperstein assert(Output.isFilename() && "Invalid PCH output."); 1718d6eaacbb9eb56763d38a3815fc509b92ed98a585Andrew Sapperstein 1719d6eaacbb9eb56763d38a3815fc509b92ed98a585Andrew Sapperstein CmdArgs.push_back("-o"); 1720d6eaacbb9eb56763d38a3815fc509b92ed98a585Andrew Sapperstein // NOTE: gcc uses a temp .s file for this, but there doesn't seem 1721d6eaacbb9eb56763d38a3815fc509b92ed98a585Andrew Sapperstein // to be a good reason. 1722d6eaacbb9eb56763d38a3815fc509b92ed98a585Andrew Sapperstein CmdArgs.push_back("/dev/null"); 1723d6eaacbb9eb56763d38a3815fc509b92ed98a585Andrew Sapperstein 1724d6eaacbb9eb56763d38a3815fc509b92ed98a585Andrew Sapperstein CmdArgs.push_back("--output-pch="); 1725d6eaacbb9eb56763d38a3815fc509b92ed98a585Andrew Sapperstein CmdArgs.push_back(Output.getFilename()); 17266ba612efffba42bec102ac58a1540496158f747eAndrew Sapperstein } 17276ba612efffba42bec102ac58a1540496158f747eAndrew Sapperstein 1728d6eaacbb9eb56763d38a3815fc509b92ed98a585Andrew Sapperstein const char *CC1Name = getCC1Name(Inputs[0].getType()); 1729d6eaacbb9eb56763d38a3815fc509b92ed98a585Andrew Sapperstein const char *Exec = 1730d6eaacbb9eb56763d38a3815fc509b92ed98a585Andrew Sapperstein Args.MakeArgString(getToolChain().GetProgramPath(C, CC1Name)); 1731d6eaacbb9eb56763d38a3815fc509b92ed98a585Andrew Sapperstein Dest.addCommand(new Command(JA, *this, Exec, CmdArgs)); 1732d6eaacbb9eb56763d38a3815fc509b92ed98a585Andrew Sapperstein} 1733d6eaacbb9eb56763d38a3815fc509b92ed98a585Andrew Sapperstein 1734d6eaacbb9eb56763d38a3815fc509b92ed98a585Andrew Sappersteinvoid darwin::Assemble::ConstructJob(Compilation &C, const JobAction &JA, 1735d6eaacbb9eb56763d38a3815fc509b92ed98a585Andrew Sapperstein Job &Dest, const InputInfo &Output, 1736d6eaacbb9eb56763d38a3815fc509b92ed98a585Andrew Sapperstein const InputInfoList &Inputs, 1737d6eaacbb9eb56763d38a3815fc509b92ed98a585Andrew Sapperstein const ArgList &Args, 1738d6eaacbb9eb56763d38a3815fc509b92ed98a585Andrew Sapperstein const char *LinkingOutput) const { 1739d6eaacbb9eb56763d38a3815fc509b92ed98a585Andrew Sapperstein ArgStringList CmdArgs; 1740d6eaacbb9eb56763d38a3815fc509b92ed98a585Andrew Sapperstein 1741d6eaacbb9eb56763d38a3815fc509b92ed98a585Andrew Sapperstein assert(Inputs.size() == 1 && "Unexpected number of inputs."); 1742d6eaacbb9eb56763d38a3815fc509b92ed98a585Andrew Sapperstein const InputInfo &Input = Inputs[0]; 1743d6eaacbb9eb56763d38a3815fc509b92ed98a585Andrew Sapperstein 1744d6eaacbb9eb56763d38a3815fc509b92ed98a585Andrew Sapperstein // Bit of a hack, this is only used for original inputs. 1745d6eaacbb9eb56763d38a3815fc509b92ed98a585Andrew Sapperstein // 1746d6eaacbb9eb56763d38a3815fc509b92ed98a585Andrew Sapperstein // FIXME: This is broken for preprocessed .s inputs. 17476ba612efffba42bec102ac58a1540496158f747eAndrew Sapperstein if (Input.isFilename() && 17486ba612efffba42bec102ac58a1540496158f747eAndrew Sapperstein strcmp(Input.getFilename(), Input.getBaseInput()) == 0) { 1749d6eaacbb9eb56763d38a3815fc509b92ed98a585Andrew Sapperstein if (Args.hasArg(options::OPT_gstabs)) 1750d6eaacbb9eb56763d38a3815fc509b92ed98a585Andrew Sapperstein CmdArgs.push_back("--gstabs"); 1751d6eaacbb9eb56763d38a3815fc509b92ed98a585Andrew Sapperstein else if (Args.hasArg(options::OPT_g_Group)) 1752d6eaacbb9eb56763d38a3815fc509b92ed98a585Andrew Sapperstein CmdArgs.push_back("--gdwarf2"); 1753d6eaacbb9eb56763d38a3815fc509b92ed98a585Andrew Sapperstein } 1754d6eaacbb9eb56763d38a3815fc509b92ed98a585Andrew Sapperstein 1755d6eaacbb9eb56763d38a3815fc509b92ed98a585Andrew Sapperstein // Derived from asm spec. 1756d6eaacbb9eb56763d38a3815fc509b92ed98a585Andrew Sapperstein AddDarwinArch(Args, CmdArgs); 1757d6eaacbb9eb56763d38a3815fc509b92ed98a585Andrew Sapperstein 1758d6eaacbb9eb56763d38a3815fc509b92ed98a585Andrew Sapperstein if (!getDarwinToolChain().isIPhoneOS() || 1759d6eaacbb9eb56763d38a3815fc509b92ed98a585Andrew Sapperstein Args.hasArg(options::OPT_force__cpusubtype__ALL)) 1760d6eaacbb9eb56763d38a3815fc509b92ed98a585Andrew Sapperstein CmdArgs.push_back("-force_cpusubtype_ALL"); 1761d6eaacbb9eb56763d38a3815fc509b92ed98a585Andrew Sapperstein 1762d6eaacbb9eb56763d38a3815fc509b92ed98a585Andrew Sapperstein if (getToolChain().getTriple().getArch() != llvm::Triple::x86_64 && 1763d6eaacbb9eb56763d38a3815fc509b92ed98a585Andrew Sapperstein (Args.hasArg(options::OPT_mkernel) || 1764d6eaacbb9eb56763d38a3815fc509b92ed98a585Andrew Sapperstein Args.hasArg(options::OPT_static) || 1765d6eaacbb9eb56763d38a3815fc509b92ed98a585Andrew Sapperstein Args.hasArg(options::OPT_fapple_kext))) 1766d6eaacbb9eb56763d38a3815fc509b92ed98a585Andrew Sapperstein CmdArgs.push_back("-static"); 1767d6eaacbb9eb56763d38a3815fc509b92ed98a585Andrew Sapperstein 17686ba612efffba42bec102ac58a1540496158f747eAndrew Sapperstein Args.AddAllArgValues(CmdArgs, options::OPT_Wa_COMMA, 17696ba612efffba42bec102ac58a1540496158f747eAndrew Sapperstein options::OPT_Xassembler); 1770d6eaacbb9eb56763d38a3815fc509b92ed98a585Andrew Sapperstein 1771d6eaacbb9eb56763d38a3815fc509b92ed98a585Andrew Sapperstein assert(Output.isFilename() && "Unexpected lipo output."); 1772d6eaacbb9eb56763d38a3815fc509b92ed98a585Andrew Sapperstein CmdArgs.push_back("-o"); 1773d6eaacbb9eb56763d38a3815fc509b92ed98a585Andrew Sapperstein CmdArgs.push_back(Output.getFilename()); 1774d6eaacbb9eb56763d38a3815fc509b92ed98a585Andrew Sapperstein 1775d6eaacbb9eb56763d38a3815fc509b92ed98a585Andrew Sapperstein if (Input.isPipe()) { 1776d6eaacbb9eb56763d38a3815fc509b92ed98a585Andrew Sapperstein CmdArgs.push_back("-"); 1777d6eaacbb9eb56763d38a3815fc509b92ed98a585Andrew Sapperstein } else { 1778d6eaacbb9eb56763d38a3815fc509b92ed98a585Andrew Sapperstein assert(Input.isFilename() && "Invalid input."); 1779d6eaacbb9eb56763d38a3815fc509b92ed98a585Andrew Sapperstein CmdArgs.push_back(Input.getFilename()); 1780d6eaacbb9eb56763d38a3815fc509b92ed98a585Andrew Sapperstein } 1781d6eaacbb9eb56763d38a3815fc509b92ed98a585Andrew Sapperstein 1782d6eaacbb9eb56763d38a3815fc509b92ed98a585Andrew Sapperstein // asm_final spec is empty. 1783d6eaacbb9eb56763d38a3815fc509b92ed98a585Andrew Sapperstein 1784d6eaacbb9eb56763d38a3815fc509b92ed98a585Andrew Sapperstein const char *Exec = 1785d6eaacbb9eb56763d38a3815fc509b92ed98a585Andrew Sapperstein Args.MakeArgString(getToolChain().GetProgramPath(C, "as")); 1786d6eaacbb9eb56763d38a3815fc509b92ed98a585Andrew Sapperstein Dest.addCommand(new Command(JA, *this, Exec, CmdArgs)); 1787d6eaacbb9eb56763d38a3815fc509b92ed98a585Andrew Sapperstein} 1788d6eaacbb9eb56763d38a3815fc509b92ed98a585Andrew Sapperstein 17896ba612efffba42bec102ac58a1540496158f747eAndrew Sapperstein/// Helper routine for seeing if we should use dsymutil; this is a 17906ba612efffba42bec102ac58a1540496158f747eAndrew Sapperstein/// gcc compatible hack, we should remove it and use the input 1791d6eaacbb9eb56763d38a3815fc509b92ed98a585Andrew Sapperstein/// type information. 1792d6eaacbb9eb56763d38a3815fc509b92ed98a585Andrew Sappersteinstatic bool isSourceSuffix(const char *Str) { 1793d6eaacbb9eb56763d38a3815fc509b92ed98a585Andrew Sapperstein // match: 'C', 'CPP', 'c', 'cc', 'cp', 'c++', 'cpp', 'cxx', 'm', 1794d6eaacbb9eb56763d38a3815fc509b92ed98a585Andrew Sapperstein // 'mm'. 1795d6eaacbb9eb56763d38a3815fc509b92ed98a585Andrew Sapperstein return llvm::StringSwitch<bool>(Str) 1796d6eaacbb9eb56763d38a3815fc509b92ed98a585Andrew Sapperstein .Case("C", true) 1797d6eaacbb9eb56763d38a3815fc509b92ed98a585Andrew Sapperstein .Case("c", true) 1798d6eaacbb9eb56763d38a3815fc509b92ed98a585Andrew Sapperstein .Case("m", true) 1799d6eaacbb9eb56763d38a3815fc509b92ed98a585Andrew Sapperstein .Case("cc", true) 1800d6eaacbb9eb56763d38a3815fc509b92ed98a585Andrew Sapperstein .Case("cp", true) 1801d6eaacbb9eb56763d38a3815fc509b92ed98a585Andrew Sapperstein .Case("mm", true) 1802d6eaacbb9eb56763d38a3815fc509b92ed98a585Andrew Sapperstein .Case("CPP", true) 1803d6eaacbb9eb56763d38a3815fc509b92ed98a585Andrew Sapperstein .Case("c++", true) 1804d6eaacbb9eb56763d38a3815fc509b92ed98a585Andrew Sapperstein .Case("cpp", true) 1805d6eaacbb9eb56763d38a3815fc509b92ed98a585Andrew Sapperstein .Case("cxx", true) 1806d6eaacbb9eb56763d38a3815fc509b92ed98a585Andrew Sapperstein .Default(false); 1807d6eaacbb9eb56763d38a3815fc509b92ed98a585Andrew Sapperstein} 1808d6eaacbb9eb56763d38a3815fc509b92ed98a585Andrew Sapperstein 1809d6eaacbb9eb56763d38a3815fc509b92ed98a585Andrew Sapperstein// FIXME: Can we tablegen this? 18106ba612efffba42bec102ac58a1540496158f747eAndrew Sappersteinstatic const char *GetArmArchForMArch(llvm::StringRef Value) { 18116ba612efffba42bec102ac58a1540496158f747eAndrew Sapperstein if (Value == "armv6k") 1812d6eaacbb9eb56763d38a3815fc509b92ed98a585Andrew Sapperstein return "armv6"; 1813d6eaacbb9eb56763d38a3815fc509b92ed98a585Andrew Sapperstein 1814d6eaacbb9eb56763d38a3815fc509b92ed98a585Andrew Sapperstein if (Value == "armv5tej") 1815d6eaacbb9eb56763d38a3815fc509b92ed98a585Andrew Sapperstein return "armv5"; 1816d6eaacbb9eb56763d38a3815fc509b92ed98a585Andrew Sapperstein 1817d6eaacbb9eb56763d38a3815fc509b92ed98a585Andrew Sapperstein if (Value == "xscale") 1818d6eaacbb9eb56763d38a3815fc509b92ed98a585Andrew Sapperstein return "xscale"; 1819d6eaacbb9eb56763d38a3815fc509b92ed98a585Andrew Sapperstein 1820d6eaacbb9eb56763d38a3815fc509b92ed98a585Andrew Sapperstein if (Value == "armv4t") 1821d6eaacbb9eb56763d38a3815fc509b92ed98a585Andrew Sapperstein return "armv4t"; 1822d6eaacbb9eb56763d38a3815fc509b92ed98a585Andrew Sapperstein 1823d6eaacbb9eb56763d38a3815fc509b92ed98a585Andrew Sapperstein if (Value == "armv7" || Value == "armv7-a" || Value == "armv7-r" || 1824d6eaacbb9eb56763d38a3815fc509b92ed98a585Andrew Sapperstein Value == "armv7-m" || Value == "armv7a" || Value == "armv7r" || 1825d6eaacbb9eb56763d38a3815fc509b92ed98a585Andrew Sapperstein Value == "armv7m") 1826d6eaacbb9eb56763d38a3815fc509b92ed98a585Andrew Sapperstein return "armv7"; 1827d6eaacbb9eb56763d38a3815fc509b92ed98a585Andrew Sapperstein 1828d6eaacbb9eb56763d38a3815fc509b92ed98a585Andrew Sapperstein return 0; 1829d6eaacbb9eb56763d38a3815fc509b92ed98a585Andrew Sapperstein} 1830d6eaacbb9eb56763d38a3815fc509b92ed98a585Andrew Sapperstein 18316ba612efffba42bec102ac58a1540496158f747eAndrew Sapperstein// FIXME: Can we tablegen this? 18326ba612efffba42bec102ac58a1540496158f747eAndrew Sappersteinstatic const char *GetArmArchForMCpu(llvm::StringRef Value) { 1833d6eaacbb9eb56763d38a3815fc509b92ed98a585Andrew Sapperstein if (Value == "arm10tdmi" || Value == "arm1020t" || Value == "arm9e" || 1834d6eaacbb9eb56763d38a3815fc509b92ed98a585Andrew Sapperstein Value == "arm946e-s" || Value == "arm966e-s" || 1835d6eaacbb9eb56763d38a3815fc509b92ed98a585Andrew Sapperstein Value == "arm968e-s" || Value == "arm10e" || 1836d6eaacbb9eb56763d38a3815fc509b92ed98a585Andrew Sapperstein Value == "arm1020e" || Value == "arm1022e" || Value == "arm926ej-s" || 1837d6eaacbb9eb56763d38a3815fc509b92ed98a585Andrew Sapperstein Value == "arm1026ej-s") 1838d6eaacbb9eb56763d38a3815fc509b92ed98a585Andrew Sapperstein return "armv5"; 1839d6eaacbb9eb56763d38a3815fc509b92ed98a585Andrew Sapperstein 1840d6eaacbb9eb56763d38a3815fc509b92ed98a585Andrew Sapperstein if (Value == "xscale") 1841d6eaacbb9eb56763d38a3815fc509b92ed98a585Andrew Sapperstein return "xscale"; 1842d6eaacbb9eb56763d38a3815fc509b92ed98a585Andrew Sapperstein 1843d6eaacbb9eb56763d38a3815fc509b92ed98a585Andrew Sapperstein if (Value == "arm1136j-s" || Value == "arm1136jf-s" || 1844d6eaacbb9eb56763d38a3815fc509b92ed98a585Andrew Sapperstein Value == "arm1176jz-s" || Value == "arm1176jzf-s") 1845d6eaacbb9eb56763d38a3815fc509b92ed98a585Andrew Sapperstein return "armv6"; 1846d6eaacbb9eb56763d38a3815fc509b92ed98a585Andrew Sapperstein 1847d6eaacbb9eb56763d38a3815fc509b92ed98a585Andrew Sapperstein if (Value == "cortex-a8" || Value == "cortex-r4" || Value == "cortex-m3") 1848d6eaacbb9eb56763d38a3815fc509b92ed98a585Andrew Sapperstein return "armv7"; 1849d6eaacbb9eb56763d38a3815fc509b92ed98a585Andrew Sapperstein 1850d6eaacbb9eb56763d38a3815fc509b92ed98a585Andrew Sapperstein return 0; 1851d6eaacbb9eb56763d38a3815fc509b92ed98a585Andrew Sapperstein} 18526ba612efffba42bec102ac58a1540496158f747eAndrew Sapperstein 18536ba612efffba42bec102ac58a1540496158f747eAndrew Sappersteinvoid darwin::DarwinTool::AddDarwinArch(const ArgList &Args, 1854d6eaacbb9eb56763d38a3815fc509b92ed98a585Andrew Sapperstein ArgStringList &CmdArgs) const { 1855d6eaacbb9eb56763d38a3815fc509b92ed98a585Andrew Sapperstein // Derived from darwin_arch spec. 1856d6eaacbb9eb56763d38a3815fc509b92ed98a585Andrew Sapperstein CmdArgs.push_back("-arch"); 1857d6eaacbb9eb56763d38a3815fc509b92ed98a585Andrew Sapperstein 1858d6eaacbb9eb56763d38a3815fc509b92ed98a585Andrew Sapperstein switch (getToolChain().getTriple().getArch()) { 1859d6eaacbb9eb56763d38a3815fc509b92ed98a585Andrew Sapperstein default: 1860d6eaacbb9eb56763d38a3815fc509b92ed98a585Andrew Sapperstein CmdArgs.push_back(Args.MakeArgString(getToolChain().getArchName())); 1861d6eaacbb9eb56763d38a3815fc509b92ed98a585Andrew Sapperstein break; 1862d6eaacbb9eb56763d38a3815fc509b92ed98a585Andrew Sapperstein 1863d6eaacbb9eb56763d38a3815fc509b92ed98a585Andrew Sapperstein case llvm::Triple::arm: { 1864d6eaacbb9eb56763d38a3815fc509b92ed98a585Andrew Sapperstein if (const Arg *A = Args.getLastArg(options::OPT_march_EQ)) { 1865d6eaacbb9eb56763d38a3815fc509b92ed98a585Andrew Sapperstein if (const char *Arch = GetArmArchForMArch(A->getValue(Args))) { 1866d6eaacbb9eb56763d38a3815fc509b92ed98a585Andrew Sapperstein CmdArgs.push_back(Arch); 1867d6eaacbb9eb56763d38a3815fc509b92ed98a585Andrew Sapperstein return; 1868d6eaacbb9eb56763d38a3815fc509b92ed98a585Andrew Sapperstein } 1869d6eaacbb9eb56763d38a3815fc509b92ed98a585Andrew Sapperstein } 1870d6eaacbb9eb56763d38a3815fc509b92ed98a585Andrew Sapperstein 1871d6eaacbb9eb56763d38a3815fc509b92ed98a585Andrew Sapperstein if (const Arg *A = Args.getLastArg(options::OPT_mcpu_EQ)) { 1872d6eaacbb9eb56763d38a3815fc509b92ed98a585Andrew Sapperstein if (const char *Arch = GetArmArchForMCpu(A->getValue(Args))) { 18736ba612efffba42bec102ac58a1540496158f747eAndrew Sapperstein CmdArgs.push_back(Arch); 18746ba612efffba42bec102ac58a1540496158f747eAndrew Sapperstein return; 1875d6eaacbb9eb56763d38a3815fc509b92ed98a585Andrew Sapperstein } 1876d6eaacbb9eb56763d38a3815fc509b92ed98a585Andrew Sapperstein } 1877d6eaacbb9eb56763d38a3815fc509b92ed98a585Andrew Sapperstein 1878d6eaacbb9eb56763d38a3815fc509b92ed98a585Andrew Sapperstein CmdArgs.push_back("arm"); 1879d6eaacbb9eb56763d38a3815fc509b92ed98a585Andrew Sapperstein CmdArgs.push_back("-force_cpusubtype_ALL"); 1880d6eaacbb9eb56763d38a3815fc509b92ed98a585Andrew Sapperstein return; 1881d6eaacbb9eb56763d38a3815fc509b92ed98a585Andrew Sapperstein } 1882d6eaacbb9eb56763d38a3815fc509b92ed98a585Andrew Sapperstein } 1883d6eaacbb9eb56763d38a3815fc509b92ed98a585Andrew Sapperstein} 1884d6eaacbb9eb56763d38a3815fc509b92ed98a585Andrew Sapperstein 1885d6eaacbb9eb56763d38a3815fc509b92ed98a585Andrew Sappersteinvoid darwin::DarwinTool::AddDarwinSubArch(const ArgList &Args, 1886d6eaacbb9eb56763d38a3815fc509b92ed98a585Andrew Sapperstein ArgStringList &CmdArgs) const { 1887d6eaacbb9eb56763d38a3815fc509b92ed98a585Andrew Sapperstein // Derived from darwin_subarch spec, not sure what the distinction 1888d6eaacbb9eb56763d38a3815fc509b92ed98a585Andrew Sapperstein // exists for but at least for this chain it is the same. 1889d6eaacbb9eb56763d38a3815fc509b92ed98a585Andrew Sapperstein AddDarwinArch(Args, CmdArgs); 1890d6eaacbb9eb56763d38a3815fc509b92ed98a585Andrew Sapperstein} 1891d6eaacbb9eb56763d38a3815fc509b92ed98a585Andrew Sapperstein 1892d6eaacbb9eb56763d38a3815fc509b92ed98a585Andrew Sappersteinvoid darwin::Link::AddLinkArgs(const ArgList &Args, 1893d6eaacbb9eb56763d38a3815fc509b92ed98a585Andrew Sapperstein ArgStringList &CmdArgs) const { 18946ba612efffba42bec102ac58a1540496158f747eAndrew Sapperstein const Driver &D = getToolChain().getHost().getDriver(); 18956ba612efffba42bec102ac58a1540496158f747eAndrew Sapperstein 1896d6eaacbb9eb56763d38a3815fc509b92ed98a585Andrew Sapperstein // Derived from the "link" spec. 1897d6eaacbb9eb56763d38a3815fc509b92ed98a585Andrew Sapperstein Args.AddAllArgs(CmdArgs, options::OPT_static); 1898d6eaacbb9eb56763d38a3815fc509b92ed98a585Andrew Sapperstein if (!Args.hasArg(options::OPT_static)) 1899d6eaacbb9eb56763d38a3815fc509b92ed98a585Andrew Sapperstein CmdArgs.push_back("-dynamic"); 1900d6eaacbb9eb56763d38a3815fc509b92ed98a585Andrew Sapperstein if (Args.hasArg(options::OPT_fgnu_runtime)) { 1901d6eaacbb9eb56763d38a3815fc509b92ed98a585Andrew Sapperstein // FIXME: gcc replaces -lobjc in forward args with -lobjc-gnu 1902d6eaacbb9eb56763d38a3815fc509b92ed98a585Andrew Sapperstein // here. How do we wish to handle such things? 1903d6eaacbb9eb56763d38a3815fc509b92ed98a585Andrew Sapperstein } 1904d6eaacbb9eb56763d38a3815fc509b92ed98a585Andrew Sapperstein 1905d6eaacbb9eb56763d38a3815fc509b92ed98a585Andrew Sapperstein if (!Args.hasArg(options::OPT_dynamiclib)) { 1906d6eaacbb9eb56763d38a3815fc509b92ed98a585Andrew Sapperstein if (Args.hasArg(options::OPT_force__cpusubtype__ALL)) { 1907d6eaacbb9eb56763d38a3815fc509b92ed98a585Andrew Sapperstein AddDarwinArch(Args, CmdArgs); 1908d6eaacbb9eb56763d38a3815fc509b92ed98a585Andrew Sapperstein CmdArgs.push_back("-force_cpusubtype_ALL"); 1909d6eaacbb9eb56763d38a3815fc509b92ed98a585Andrew Sapperstein } else 1910d6eaacbb9eb56763d38a3815fc509b92ed98a585Andrew Sapperstein AddDarwinSubArch(Args, CmdArgs); 1911d6eaacbb9eb56763d38a3815fc509b92ed98a585Andrew Sapperstein 1912d6eaacbb9eb56763d38a3815fc509b92ed98a585Andrew Sapperstein Args.AddLastArg(CmdArgs, options::OPT_bundle); 1913d6eaacbb9eb56763d38a3815fc509b92ed98a585Andrew Sapperstein Args.AddAllArgs(CmdArgs, options::OPT_bundle__loader); 1914d6eaacbb9eb56763d38a3815fc509b92ed98a585Andrew Sapperstein Args.AddAllArgs(CmdArgs, options::OPT_client__name); 19156ba612efffba42bec102ac58a1540496158f747eAndrew Sapperstein 19166ba612efffba42bec102ac58a1540496158f747eAndrew Sapperstein Arg *A; 1917d6eaacbb9eb56763d38a3815fc509b92ed98a585Andrew Sapperstein if ((A = Args.getLastArg(options::OPT_compatibility__version)) || 1918d6eaacbb9eb56763d38a3815fc509b92ed98a585Andrew Sapperstein (A = Args.getLastArg(options::OPT_current__version)) || 1919d6eaacbb9eb56763d38a3815fc509b92ed98a585Andrew Sapperstein (A = Args.getLastArg(options::OPT_install__name))) 1920d6eaacbb9eb56763d38a3815fc509b92ed98a585Andrew Sapperstein D.Diag(clang::diag::err_drv_argument_only_allowed_with) 1921d6eaacbb9eb56763d38a3815fc509b92ed98a585Andrew Sapperstein << A->getAsString(Args) << "-dynamiclib"; 1922d6eaacbb9eb56763d38a3815fc509b92ed98a585Andrew Sapperstein 1923d6eaacbb9eb56763d38a3815fc509b92ed98a585Andrew Sapperstein Args.AddLastArg(CmdArgs, options::OPT_force__flat__namespace); 1924d6eaacbb9eb56763d38a3815fc509b92ed98a585Andrew Sapperstein Args.AddLastArg(CmdArgs, options::OPT_keep__private__externs); 1925d6eaacbb9eb56763d38a3815fc509b92ed98a585Andrew Sapperstein Args.AddLastArg(CmdArgs, options::OPT_private__bundle); 1926d6eaacbb9eb56763d38a3815fc509b92ed98a585Andrew Sapperstein } else { 1927d6eaacbb9eb56763d38a3815fc509b92ed98a585Andrew Sapperstein CmdArgs.push_back("-dylib"); 1928d6eaacbb9eb56763d38a3815fc509b92ed98a585Andrew Sapperstein 1929d6eaacbb9eb56763d38a3815fc509b92ed98a585Andrew Sapperstein Arg *A; 1930d6eaacbb9eb56763d38a3815fc509b92ed98a585Andrew Sapperstein if ((A = Args.getLastArg(options::OPT_bundle)) || 1931d6eaacbb9eb56763d38a3815fc509b92ed98a585Andrew Sapperstein (A = Args.getLastArg(options::OPT_bundle__loader)) || 1932d6eaacbb9eb56763d38a3815fc509b92ed98a585Andrew Sapperstein (A = Args.getLastArg(options::OPT_client__name)) || 1933d6eaacbb9eb56763d38a3815fc509b92ed98a585Andrew Sapperstein (A = Args.getLastArg(options::OPT_force__flat__namespace)) || 1934d6eaacbb9eb56763d38a3815fc509b92ed98a585Andrew Sapperstein (A = Args.getLastArg(options::OPT_keep__private__externs)) || 1935d6eaacbb9eb56763d38a3815fc509b92ed98a585Andrew Sapperstein (A = Args.getLastArg(options::OPT_private__bundle))) 19366ba612efffba42bec102ac58a1540496158f747eAndrew Sapperstein D.Diag(clang::diag::err_drv_argument_not_allowed_with) 19376ba612efffba42bec102ac58a1540496158f747eAndrew Sapperstein << A->getAsString(Args) << "-dynamiclib"; 1938d6eaacbb9eb56763d38a3815fc509b92ed98a585Andrew Sapperstein 1939d6eaacbb9eb56763d38a3815fc509b92ed98a585Andrew Sapperstein Args.AddAllArgsTranslated(CmdArgs, options::OPT_compatibility__version, 1940d6eaacbb9eb56763d38a3815fc509b92ed98a585Andrew Sapperstein "-dylib_compatibility_version"); 1941d6eaacbb9eb56763d38a3815fc509b92ed98a585Andrew Sapperstein Args.AddAllArgsTranslated(CmdArgs, options::OPT_current__version, 1942d6eaacbb9eb56763d38a3815fc509b92ed98a585Andrew Sapperstein "-dylib_current_version"); 1943d6eaacbb9eb56763d38a3815fc509b92ed98a585Andrew Sapperstein 1944d6eaacbb9eb56763d38a3815fc509b92ed98a585Andrew Sapperstein if (Args.hasArg(options::OPT_force__cpusubtype__ALL)) { 1945d6eaacbb9eb56763d38a3815fc509b92ed98a585Andrew Sapperstein AddDarwinArch(Args, CmdArgs); 1946d6eaacbb9eb56763d38a3815fc509b92ed98a585Andrew Sapperstein // NOTE: We don't add -force_cpusubtype_ALL on this path. Ok. 1947d6eaacbb9eb56763d38a3815fc509b92ed98a585Andrew Sapperstein } else 1948d6eaacbb9eb56763d38a3815fc509b92ed98a585Andrew Sapperstein AddDarwinSubArch(Args, CmdArgs); 1949d6eaacbb9eb56763d38a3815fc509b92ed98a585Andrew Sapperstein 1950d6eaacbb9eb56763d38a3815fc509b92ed98a585Andrew Sapperstein Args.AddAllArgsTranslated(CmdArgs, options::OPT_install__name, 1951d6eaacbb9eb56763d38a3815fc509b92ed98a585Andrew Sapperstein "-dylib_install_name"); 1952d6eaacbb9eb56763d38a3815fc509b92ed98a585Andrew Sapperstein } 1953d6eaacbb9eb56763d38a3815fc509b92ed98a585Andrew Sapperstein 1954d6eaacbb9eb56763d38a3815fc509b92ed98a585Andrew Sapperstein Args.AddLastArg(CmdArgs, options::OPT_all__load); 1955d6eaacbb9eb56763d38a3815fc509b92ed98a585Andrew Sapperstein Args.AddAllArgs(CmdArgs, options::OPT_allowable__client); 1956d6eaacbb9eb56763d38a3815fc509b92ed98a585Andrew Sapperstein Args.AddLastArg(CmdArgs, options::OPT_bind__at__load); 19576ba612efffba42bec102ac58a1540496158f747eAndrew Sapperstein if (getDarwinToolChain().isIPhoneOS()) 19586ba612efffba42bec102ac58a1540496158f747eAndrew Sapperstein Args.AddLastArg(CmdArgs, options::OPT_arch__errors__fatal); 1959d6eaacbb9eb56763d38a3815fc509b92ed98a585Andrew Sapperstein Args.AddLastArg(CmdArgs, options::OPT_dead__strip); 1960d6eaacbb9eb56763d38a3815fc509b92ed98a585Andrew Sapperstein Args.AddLastArg(CmdArgs, options::OPT_no__dead__strip__inits__and__terms); 1961d6eaacbb9eb56763d38a3815fc509b92ed98a585Andrew Sapperstein Args.AddAllArgs(CmdArgs, options::OPT_dylib__file); 1962d6eaacbb9eb56763d38a3815fc509b92ed98a585Andrew Sapperstein Args.AddLastArg(CmdArgs, options::OPT_dynamic); 1963d6eaacbb9eb56763d38a3815fc509b92ed98a585Andrew Sapperstein Args.AddAllArgs(CmdArgs, options::OPT_exported__symbols__list); 1964d6eaacbb9eb56763d38a3815fc509b92ed98a585Andrew Sapperstein Args.AddLastArg(CmdArgs, options::OPT_flat__namespace); 1965d6eaacbb9eb56763d38a3815fc509b92ed98a585Andrew Sapperstein Args.AddAllArgs(CmdArgs, options::OPT_headerpad__max__install__names); 1966d6eaacbb9eb56763d38a3815fc509b92ed98a585Andrew Sapperstein Args.AddAllArgs(CmdArgs, options::OPT_image__base); 1967d6eaacbb9eb56763d38a3815fc509b92ed98a585Andrew Sapperstein Args.AddAllArgs(CmdArgs, options::OPT_init); 1968d6eaacbb9eb56763d38a3815fc509b92ed98a585Andrew Sapperstein 1969d6eaacbb9eb56763d38a3815fc509b92ed98a585Andrew Sapperstein if (!Args.hasArg(options::OPT_mmacosx_version_min_EQ) && 1970d6eaacbb9eb56763d38a3815fc509b92ed98a585Andrew Sapperstein !Args.hasArg(options::OPT_miphoneos_version_min_EQ)) { 1971d6eaacbb9eb56763d38a3815fc509b92ed98a585Andrew Sapperstein // Add default version min. 1972d6eaacbb9eb56763d38a3815fc509b92ed98a585Andrew Sapperstein if (!getDarwinToolChain().isIPhoneOS()) { 1973d6eaacbb9eb56763d38a3815fc509b92ed98a585Andrew Sapperstein CmdArgs.push_back("-macosx_version_min"); 1974d6eaacbb9eb56763d38a3815fc509b92ed98a585Andrew Sapperstein CmdArgs.push_back(getDarwinToolChain().getMacosxVersionStr()); 1975d6eaacbb9eb56763d38a3815fc509b92ed98a585Andrew Sapperstein } else { 1976d6eaacbb9eb56763d38a3815fc509b92ed98a585Andrew Sapperstein CmdArgs.push_back("-iphoneos_version_min"); 1977d6eaacbb9eb56763d38a3815fc509b92ed98a585Andrew Sapperstein CmdArgs.push_back(getDarwinToolChain().getIPhoneOSVersionStr()); 19786ba612efffba42bec102ac58a1540496158f747eAndrew Sapperstein } 19796ba612efffba42bec102ac58a1540496158f747eAndrew Sapperstein } 1980d6eaacbb9eb56763d38a3815fc509b92ed98a585Andrew Sapperstein 1981d6eaacbb9eb56763d38a3815fc509b92ed98a585Andrew Sapperstein // Adding all arguments doesn't make sense here but this is what 1982d6eaacbb9eb56763d38a3815fc509b92ed98a585Andrew Sapperstein // gcc does. 1983d6eaacbb9eb56763d38a3815fc509b92ed98a585Andrew Sapperstein Args.AddAllArgsTranslated(CmdArgs, options::OPT_mmacosx_version_min_EQ, 1984d6eaacbb9eb56763d38a3815fc509b92ed98a585Andrew Sapperstein "-macosx_version_min"); 1985d6eaacbb9eb56763d38a3815fc509b92ed98a585Andrew Sapperstein Args.AddAllArgsTranslated(CmdArgs, options::OPT_miphoneos_version_min_EQ, 1986d6eaacbb9eb56763d38a3815fc509b92ed98a585Andrew Sapperstein "-iphoneos_version_min"); 1987d6eaacbb9eb56763d38a3815fc509b92ed98a585Andrew Sapperstein Args.AddLastArg(CmdArgs, options::OPT_nomultidefs); 1988d6eaacbb9eb56763d38a3815fc509b92ed98a585Andrew Sapperstein Args.AddLastArg(CmdArgs, options::OPT_multi__module); 1989d6eaacbb9eb56763d38a3815fc509b92ed98a585Andrew Sapperstein Args.AddLastArg(CmdArgs, options::OPT_single__module); 1990d6eaacbb9eb56763d38a3815fc509b92ed98a585Andrew Sapperstein Args.AddAllArgs(CmdArgs, options::OPT_multiply__defined); 1991d6eaacbb9eb56763d38a3815fc509b92ed98a585Andrew Sapperstein Args.AddAllArgs(CmdArgs, options::OPT_multiply__defined__unused); 1992d6eaacbb9eb56763d38a3815fc509b92ed98a585Andrew Sapperstein 1993d6eaacbb9eb56763d38a3815fc509b92ed98a585Andrew Sapperstein if (Args.hasArg(options::OPT_fpie)) 1994d6eaacbb9eb56763d38a3815fc509b92ed98a585Andrew Sapperstein CmdArgs.push_back("-pie"); 1995d6eaacbb9eb56763d38a3815fc509b92ed98a585Andrew Sapperstein 1996d6eaacbb9eb56763d38a3815fc509b92ed98a585Andrew Sapperstein Args.AddLastArg(CmdArgs, options::OPT_prebind); 1997d6eaacbb9eb56763d38a3815fc509b92ed98a585Andrew Sapperstein Args.AddLastArg(CmdArgs, options::OPT_noprebind); 1998d6eaacbb9eb56763d38a3815fc509b92ed98a585Andrew Sapperstein Args.AddLastArg(CmdArgs, options::OPT_nofixprebinding); 19996ba612efffba42bec102ac58a1540496158f747eAndrew Sapperstein Args.AddLastArg(CmdArgs, options::OPT_prebind__all__twolevel__modules); 20006ba612efffba42bec102ac58a1540496158f747eAndrew Sapperstein Args.AddLastArg(CmdArgs, options::OPT_read__only__relocs); 2001d6eaacbb9eb56763d38a3815fc509b92ed98a585Andrew Sapperstein Args.AddAllArgs(CmdArgs, options::OPT_sectcreate); 2002d6eaacbb9eb56763d38a3815fc509b92ed98a585Andrew Sapperstein Args.AddAllArgs(CmdArgs, options::OPT_sectorder); 2003d6eaacbb9eb56763d38a3815fc509b92ed98a585Andrew Sapperstein Args.AddAllArgs(CmdArgs, options::OPT_seg1addr); 2004d6eaacbb9eb56763d38a3815fc509b92ed98a585Andrew Sapperstein Args.AddAllArgs(CmdArgs, options::OPT_segprot); 2005d6eaacbb9eb56763d38a3815fc509b92ed98a585Andrew Sapperstein Args.AddAllArgs(CmdArgs, options::OPT_segaddr); 2006d6eaacbb9eb56763d38a3815fc509b92ed98a585Andrew Sapperstein Args.AddAllArgs(CmdArgs, options::OPT_segs__read__only__addr); 2007d6eaacbb9eb56763d38a3815fc509b92ed98a585Andrew Sapperstein Args.AddAllArgs(CmdArgs, options::OPT_segs__read__write__addr); 2008d6eaacbb9eb56763d38a3815fc509b92ed98a585Andrew Sapperstein Args.AddAllArgs(CmdArgs, options::OPT_seg__addr__table); 2009d6eaacbb9eb56763d38a3815fc509b92ed98a585Andrew Sapperstein Args.AddAllArgs(CmdArgs, options::OPT_seg__addr__table__filename); 2010d6eaacbb9eb56763d38a3815fc509b92ed98a585Andrew Sapperstein Args.AddAllArgs(CmdArgs, options::OPT_sub__library); 2011d6eaacbb9eb56763d38a3815fc509b92ed98a585Andrew Sapperstein Args.AddAllArgs(CmdArgs, options::OPT_sub__umbrella); 2012d6eaacbb9eb56763d38a3815fc509b92ed98a585Andrew Sapperstein 2013d6eaacbb9eb56763d38a3815fc509b92ed98a585Andrew Sapperstein Args.AddAllArgsTranslated(CmdArgs, options::OPT_isysroot, "-syslibroot"); 2014d6eaacbb9eb56763d38a3815fc509b92ed98a585Andrew Sapperstein if (getDarwinToolChain().isIPhoneOS()) { 2015d6eaacbb9eb56763d38a3815fc509b92ed98a585Andrew Sapperstein if (!Args.hasArg(options::OPT_isysroot)) { 2016d6eaacbb9eb56763d38a3815fc509b92ed98a585Andrew Sapperstein CmdArgs.push_back("-syslibroot"); 2017d6eaacbb9eb56763d38a3815fc509b92ed98a585Andrew Sapperstein CmdArgs.push_back("/Developer/SDKs/Extra"); 2018d6eaacbb9eb56763d38a3815fc509b92ed98a585Andrew Sapperstein } 2019d6eaacbb9eb56763d38a3815fc509b92ed98a585Andrew Sapperstein } 20206ba612efffba42bec102ac58a1540496158f747eAndrew Sapperstein 20216ba612efffba42bec102ac58a1540496158f747eAndrew Sapperstein Args.AddLastArg(CmdArgs, options::OPT_twolevel__namespace); 2022d6eaacbb9eb56763d38a3815fc509b92ed98a585Andrew Sapperstein Args.AddLastArg(CmdArgs, options::OPT_twolevel__namespace__hints); 2023d6eaacbb9eb56763d38a3815fc509b92ed98a585Andrew Sapperstein Args.AddAllArgs(CmdArgs, options::OPT_umbrella); 2024d6eaacbb9eb56763d38a3815fc509b92ed98a585Andrew Sapperstein Args.AddAllArgs(CmdArgs, options::OPT_undefined); 2025d6eaacbb9eb56763d38a3815fc509b92ed98a585Andrew Sapperstein Args.AddAllArgs(CmdArgs, options::OPT_unexported__symbols__list); 2026d6eaacbb9eb56763d38a3815fc509b92ed98a585Andrew Sapperstein 2027d6eaacbb9eb56763d38a3815fc509b92ed98a585Andrew Sapperstein Args.AddAllArgs(CmdArgs, options::OPT_weak__reference__mismatches); 2028d6eaacbb9eb56763d38a3815fc509b92ed98a585Andrew Sapperstein if (!Args.hasArg(options::OPT_weak__reference__mismatches)) { 2029d6eaacbb9eb56763d38a3815fc509b92ed98a585Andrew Sapperstein CmdArgs.push_back("-weak_reference_mismatches"); 2030d6eaacbb9eb56763d38a3815fc509b92ed98a585Andrew Sapperstein CmdArgs.push_back("non-weak"); 2031d6eaacbb9eb56763d38a3815fc509b92ed98a585Andrew Sapperstein } 2032d6eaacbb9eb56763d38a3815fc509b92ed98a585Andrew Sapperstein 2033d6eaacbb9eb56763d38a3815fc509b92ed98a585Andrew Sapperstein Args.AddLastArg(CmdArgs, options::OPT_X_Flag); 2034d6eaacbb9eb56763d38a3815fc509b92ed98a585Andrew Sapperstein Args.AddAllArgs(CmdArgs, options::OPT_y); 2035d6eaacbb9eb56763d38a3815fc509b92ed98a585Andrew Sapperstein Args.AddLastArg(CmdArgs, options::OPT_w); 2036d6eaacbb9eb56763d38a3815fc509b92ed98a585Andrew Sapperstein Args.AddAllArgs(CmdArgs, options::OPT_pagezero__size); 2037d6eaacbb9eb56763d38a3815fc509b92ed98a585Andrew Sapperstein Args.AddAllArgs(CmdArgs, options::OPT_segs__read__); 2038d6eaacbb9eb56763d38a3815fc509b92ed98a585Andrew Sapperstein Args.AddLastArg(CmdArgs, options::OPT_seglinkedit); 2039d6eaacbb9eb56763d38a3815fc509b92ed98a585Andrew Sapperstein Args.AddLastArg(CmdArgs, options::OPT_noseglinkedit); 2040d6eaacbb9eb56763d38a3815fc509b92ed98a585Andrew Sapperstein Args.AddAllArgs(CmdArgs, options::OPT_sectalign); 20416ba612efffba42bec102ac58a1540496158f747eAndrew Sapperstein Args.AddAllArgs(CmdArgs, options::OPT_sectobjectsymbols); 20426ba612efffba42bec102ac58a1540496158f747eAndrew Sapperstein Args.AddAllArgs(CmdArgs, options::OPT_segcreate); 2043d6eaacbb9eb56763d38a3815fc509b92ed98a585Andrew Sapperstein Args.AddLastArg(CmdArgs, options::OPT_whyload); 2044d6eaacbb9eb56763d38a3815fc509b92ed98a585Andrew Sapperstein Args.AddLastArg(CmdArgs, options::OPT_whatsloaded); 2045d6eaacbb9eb56763d38a3815fc509b92ed98a585Andrew Sapperstein Args.AddAllArgs(CmdArgs, options::OPT_dylinker__install__name); 2046d6eaacbb9eb56763d38a3815fc509b92ed98a585Andrew Sapperstein Args.AddLastArg(CmdArgs, options::OPT_dylinker); 2047d6eaacbb9eb56763d38a3815fc509b92ed98a585Andrew Sapperstein Args.AddLastArg(CmdArgs, options::OPT_Mach); 2048d6eaacbb9eb56763d38a3815fc509b92ed98a585Andrew Sapperstein} 2049d6eaacbb9eb56763d38a3815fc509b92ed98a585Andrew Sapperstein 2050d6eaacbb9eb56763d38a3815fc509b92ed98a585Andrew Sappersteinvoid darwin::Link::ConstructJob(Compilation &C, const JobAction &JA, 2051d6eaacbb9eb56763d38a3815fc509b92ed98a585Andrew Sapperstein Job &Dest, const InputInfo &Output, 2052d6eaacbb9eb56763d38a3815fc509b92ed98a585Andrew Sapperstein const InputInfoList &Inputs, 2053d6eaacbb9eb56763d38a3815fc509b92ed98a585Andrew Sapperstein const ArgList &Args, 2054d6eaacbb9eb56763d38a3815fc509b92ed98a585Andrew Sapperstein const char *LinkingOutput) const { 2055d6eaacbb9eb56763d38a3815fc509b92ed98a585Andrew Sapperstein assert(Output.getType() == types::TY_Image && "Invalid linker output type."); 2056d6eaacbb9eb56763d38a3815fc509b92ed98a585Andrew Sapperstein 2057d6eaacbb9eb56763d38a3815fc509b92ed98a585Andrew Sapperstein // The logic here is derived from gcc's behavior; most of which 2058d6eaacbb9eb56763d38a3815fc509b92ed98a585Andrew Sapperstein // comes from specs (starting with link_command). Consult gcc for 2059d6eaacbb9eb56763d38a3815fc509b92ed98a585Andrew Sapperstein // more information. 2060d6eaacbb9eb56763d38a3815fc509b92ed98a585Andrew Sapperstein ArgStringList CmdArgs; 2061d6eaacbb9eb56763d38a3815fc509b92ed98a585Andrew Sapperstein 20626ba612efffba42bec102ac58a1540496158f747eAndrew Sapperstein // I'm not sure why this particular decomposition exists in gcc, but 20636ba612efffba42bec102ac58a1540496158f747eAndrew Sapperstein // we follow suite for ease of comparison. 2064d6eaacbb9eb56763d38a3815fc509b92ed98a585Andrew Sapperstein AddLinkArgs(Args, CmdArgs); 2065d6eaacbb9eb56763d38a3815fc509b92ed98a585Andrew Sapperstein 2066d6eaacbb9eb56763d38a3815fc509b92ed98a585Andrew Sapperstein Args.AddAllArgs(CmdArgs, options::OPT_d_Flag); 2067d6eaacbb9eb56763d38a3815fc509b92ed98a585Andrew Sapperstein Args.AddAllArgs(CmdArgs, options::OPT_s); 2068d6eaacbb9eb56763d38a3815fc509b92ed98a585Andrew Sapperstein Args.AddAllArgs(CmdArgs, options::OPT_t); 2069d6eaacbb9eb56763d38a3815fc509b92ed98a585Andrew Sapperstein Args.AddAllArgs(CmdArgs, options::OPT_Z_Flag); 2070d6eaacbb9eb56763d38a3815fc509b92ed98a585Andrew Sapperstein Args.AddAllArgs(CmdArgs, options::OPT_u_Group); 2071d6eaacbb9eb56763d38a3815fc509b92ed98a585Andrew Sapperstein Args.AddAllArgs(CmdArgs, options::OPT_A); 2072d6eaacbb9eb56763d38a3815fc509b92ed98a585Andrew Sapperstein Args.AddLastArg(CmdArgs, options::OPT_e); 2073d6eaacbb9eb56763d38a3815fc509b92ed98a585Andrew Sapperstein Args.AddAllArgs(CmdArgs, options::OPT_m_Separate); 2074d6eaacbb9eb56763d38a3815fc509b92ed98a585Andrew Sapperstein Args.AddAllArgs(CmdArgs, options::OPT_r); 2075d6eaacbb9eb56763d38a3815fc509b92ed98a585Andrew Sapperstein 2076d6eaacbb9eb56763d38a3815fc509b92ed98a585Andrew Sapperstein CmdArgs.push_back("-o"); 2077d6eaacbb9eb56763d38a3815fc509b92ed98a585Andrew Sapperstein CmdArgs.push_back(Output.getFilename()); 2078d6eaacbb9eb56763d38a3815fc509b92ed98a585Andrew Sapperstein 2079d6eaacbb9eb56763d38a3815fc509b92ed98a585Andrew Sapperstein 2080d6eaacbb9eb56763d38a3815fc509b92ed98a585Andrew Sapperstein unsigned MacosxVersionMin[3]; 2081d6eaacbb9eb56763d38a3815fc509b92ed98a585Andrew Sapperstein getDarwinToolChain().getMacosxVersionMin(Args, MacosxVersionMin); 2082d6eaacbb9eb56763d38a3815fc509b92ed98a585Andrew Sapperstein 20836ba612efffba42bec102ac58a1540496158f747eAndrew Sapperstein if (!Args.hasArg(options::OPT_A) && 20846ba612efffba42bec102ac58a1540496158f747eAndrew Sapperstein !Args.hasArg(options::OPT_nostdlib) && 2085d6eaacbb9eb56763d38a3815fc509b92ed98a585Andrew Sapperstein !Args.hasArg(options::OPT_nostartfiles)) { 2086d6eaacbb9eb56763d38a3815fc509b92ed98a585Andrew Sapperstein // Derived from startfile spec. 2087d6eaacbb9eb56763d38a3815fc509b92ed98a585Andrew Sapperstein if (Args.hasArg(options::OPT_dynamiclib)) { 2088d6eaacbb9eb56763d38a3815fc509b92ed98a585Andrew Sapperstein // Derived from darwin_dylib1 spec. 2089d6eaacbb9eb56763d38a3815fc509b92ed98a585Andrew Sapperstein if (getDarwinToolChain().isMacosxVersionLT(MacosxVersionMin, 10, 5)) 2090d6eaacbb9eb56763d38a3815fc509b92ed98a585Andrew Sapperstein CmdArgs.push_back("-ldylib1.o"); 2091d6eaacbb9eb56763d38a3815fc509b92ed98a585Andrew Sapperstein else if (getDarwinToolChain().isMacosxVersionLT(MacosxVersionMin, 10, 6)) 2092d6eaacbb9eb56763d38a3815fc509b92ed98a585Andrew Sapperstein CmdArgs.push_back("-ldylib1.10.5.o"); 2093d6eaacbb9eb56763d38a3815fc509b92ed98a585Andrew Sapperstein } else { 2094d6eaacbb9eb56763d38a3815fc509b92ed98a585Andrew Sapperstein if (Args.hasArg(options::OPT_bundle)) { 2095d6eaacbb9eb56763d38a3815fc509b92ed98a585Andrew Sapperstein if (!Args.hasArg(options::OPT_static)) { 2096d6eaacbb9eb56763d38a3815fc509b92ed98a585Andrew Sapperstein // Derived from darwin_bundle1 spec. 2097d6eaacbb9eb56763d38a3815fc509b92ed98a585Andrew Sapperstein if (getDarwinToolChain().isMacosxVersionLT(MacosxVersionMin, 10, 6)) 2098d6eaacbb9eb56763d38a3815fc509b92ed98a585Andrew Sapperstein CmdArgs.push_back("-lbundle1.o"); 2099d6eaacbb9eb56763d38a3815fc509b92ed98a585Andrew Sapperstein } 2100d6eaacbb9eb56763d38a3815fc509b92ed98a585Andrew Sapperstein } else { 2101d6eaacbb9eb56763d38a3815fc509b92ed98a585Andrew Sapperstein if (Args.hasArg(options::OPT_pg)) { 2102d6eaacbb9eb56763d38a3815fc509b92ed98a585Andrew Sapperstein if (Args.hasArg(options::OPT_static) || 2103d6eaacbb9eb56763d38a3815fc509b92ed98a585Andrew Sapperstein Args.hasArg(options::OPT_object) || 21046ba612efffba42bec102ac58a1540496158f747eAndrew Sapperstein Args.hasArg(options::OPT_preload)) { 21056ba612efffba42bec102ac58a1540496158f747eAndrew Sapperstein CmdArgs.push_back("-lgcrt0.o"); 2106d6eaacbb9eb56763d38a3815fc509b92ed98a585Andrew Sapperstein } else { 2107d6eaacbb9eb56763d38a3815fc509b92ed98a585Andrew Sapperstein CmdArgs.push_back("-lgcrt1.o"); 2108d6eaacbb9eb56763d38a3815fc509b92ed98a585Andrew Sapperstein 2109d6eaacbb9eb56763d38a3815fc509b92ed98a585Andrew Sapperstein // darwin_crt2 spec is empty. 2110d6eaacbb9eb56763d38a3815fc509b92ed98a585Andrew Sapperstein } 2111d6eaacbb9eb56763d38a3815fc509b92ed98a585Andrew Sapperstein } else { 2112d6eaacbb9eb56763d38a3815fc509b92ed98a585Andrew Sapperstein if (Args.hasArg(options::OPT_static) || 2113d6eaacbb9eb56763d38a3815fc509b92ed98a585Andrew Sapperstein Args.hasArg(options::OPT_object) || 2114d6eaacbb9eb56763d38a3815fc509b92ed98a585Andrew Sapperstein Args.hasArg(options::OPT_preload)) { 2115d6eaacbb9eb56763d38a3815fc509b92ed98a585Andrew Sapperstein CmdArgs.push_back("-lcrt0.o"); 2116d6eaacbb9eb56763d38a3815fc509b92ed98a585Andrew Sapperstein } else { 2117d6eaacbb9eb56763d38a3815fc509b92ed98a585Andrew Sapperstein // Derived from darwin_crt1 spec. 2118d6eaacbb9eb56763d38a3815fc509b92ed98a585Andrew Sapperstein if (getDarwinToolChain().isIPhoneOS()) { 2119d6eaacbb9eb56763d38a3815fc509b92ed98a585Andrew Sapperstein CmdArgs.push_back("-lcrt1.o"); 2120d6eaacbb9eb56763d38a3815fc509b92ed98a585Andrew Sapperstein } else if (getDarwinToolChain().isMacosxVersionLT(MacosxVersionMin, 2121d6eaacbb9eb56763d38a3815fc509b92ed98a585Andrew Sapperstein 10, 5)) 2122d6eaacbb9eb56763d38a3815fc509b92ed98a585Andrew Sapperstein CmdArgs.push_back("-lcrt1.o"); 2123d6eaacbb9eb56763d38a3815fc509b92ed98a585Andrew Sapperstein else if (getDarwinToolChain().isMacosxVersionLT(MacosxVersionMin, 2124d6eaacbb9eb56763d38a3815fc509b92ed98a585Andrew Sapperstein 10, 6)) 21256ba612efffba42bec102ac58a1540496158f747eAndrew Sapperstein CmdArgs.push_back("-lcrt1.10.5.o"); 21266ba612efffba42bec102ac58a1540496158f747eAndrew Sapperstein else 2127d6eaacbb9eb56763d38a3815fc509b92ed98a585Andrew Sapperstein CmdArgs.push_back("-lcrt1.10.6.o"); 2128d6eaacbb9eb56763d38a3815fc509b92ed98a585Andrew Sapperstein 2129d6eaacbb9eb56763d38a3815fc509b92ed98a585Andrew Sapperstein // darwin_crt2 spec is empty. 2130d6eaacbb9eb56763d38a3815fc509b92ed98a585Andrew Sapperstein } 2131d6eaacbb9eb56763d38a3815fc509b92ed98a585Andrew Sapperstein } 2132d6eaacbb9eb56763d38a3815fc509b92ed98a585Andrew Sapperstein } 2133d6eaacbb9eb56763d38a3815fc509b92ed98a585Andrew Sapperstein } 2134d6eaacbb9eb56763d38a3815fc509b92ed98a585Andrew Sapperstein 2135d6eaacbb9eb56763d38a3815fc509b92ed98a585Andrew Sapperstein if (Args.hasArg(options::OPT_shared_libgcc) && 2136d6eaacbb9eb56763d38a3815fc509b92ed98a585Andrew Sapperstein !Args.hasArg(options::OPT_miphoneos_version_min_EQ) && 2137d6eaacbb9eb56763d38a3815fc509b92ed98a585Andrew Sapperstein getDarwinToolChain().isMacosxVersionLT(MacosxVersionMin, 10, 5)) { 2138d6eaacbb9eb56763d38a3815fc509b92ed98a585Andrew Sapperstein const char *Str = 2139d6eaacbb9eb56763d38a3815fc509b92ed98a585Andrew Sapperstein Args.MakeArgString(getToolChain().GetFilePath(C, "crt3.o")); 2140d6eaacbb9eb56763d38a3815fc509b92ed98a585Andrew Sapperstein CmdArgs.push_back(Str); 2141d6eaacbb9eb56763d38a3815fc509b92ed98a585Andrew Sapperstein } 2142d6eaacbb9eb56763d38a3815fc509b92ed98a585Andrew Sapperstein } 2143d6eaacbb9eb56763d38a3815fc509b92ed98a585Andrew Sapperstein 2144d6eaacbb9eb56763d38a3815fc509b92ed98a585Andrew Sapperstein Args.AddAllArgs(CmdArgs, options::OPT_L); 2145d6eaacbb9eb56763d38a3815fc509b92ed98a585Andrew Sapperstein 21466ba612efffba42bec102ac58a1540496158f747eAndrew Sapperstein if (Args.hasArg(options::OPT_fopenmp)) 21476ba612efffba42bec102ac58a1540496158f747eAndrew Sapperstein // This is more complicated in gcc... 2148d6eaacbb9eb56763d38a3815fc509b92ed98a585Andrew Sapperstein CmdArgs.push_back("-lgomp"); 2149d6eaacbb9eb56763d38a3815fc509b92ed98a585Andrew Sapperstein 2150d6eaacbb9eb56763d38a3815fc509b92ed98a585Andrew Sapperstein getDarwinToolChain().AddLinkSearchPathArgs(Args, CmdArgs); 2151d6eaacbb9eb56763d38a3815fc509b92ed98a585Andrew Sapperstein 2152d6eaacbb9eb56763d38a3815fc509b92ed98a585Andrew Sapperstein for (InputInfoList::const_iterator 2153d6eaacbb9eb56763d38a3815fc509b92ed98a585Andrew Sapperstein it = Inputs.begin(), ie = Inputs.end(); it != ie; ++it) { 2154d6eaacbb9eb56763d38a3815fc509b92ed98a585Andrew Sapperstein const InputInfo &II = *it; 2155d6eaacbb9eb56763d38a3815fc509b92ed98a585Andrew Sapperstein if (II.isFilename()) 2156d6eaacbb9eb56763d38a3815fc509b92ed98a585Andrew Sapperstein CmdArgs.push_back(II.getFilename()); 2157d6eaacbb9eb56763d38a3815fc509b92ed98a585Andrew Sapperstein else 2158d6eaacbb9eb56763d38a3815fc509b92ed98a585Andrew Sapperstein II.getInputArg().renderAsInput(Args, CmdArgs); 2159d6eaacbb9eb56763d38a3815fc509b92ed98a585Andrew Sapperstein } 2160d6eaacbb9eb56763d38a3815fc509b92ed98a585Andrew Sapperstein 2161d6eaacbb9eb56763d38a3815fc509b92ed98a585Andrew Sapperstein if (LinkingOutput) { 2162d6eaacbb9eb56763d38a3815fc509b92ed98a585Andrew Sapperstein CmdArgs.push_back("-arch_multiple"); 2163d6eaacbb9eb56763d38a3815fc509b92ed98a585Andrew Sapperstein CmdArgs.push_back("-final_output"); 2164d6eaacbb9eb56763d38a3815fc509b92ed98a585Andrew Sapperstein CmdArgs.push_back(LinkingOutput); 2165d6eaacbb9eb56763d38a3815fc509b92ed98a585Andrew Sapperstein } 2166d6eaacbb9eb56763d38a3815fc509b92ed98a585Andrew Sapperstein 21676ba612efffba42bec102ac58a1540496158f747eAndrew Sapperstein if (Args.hasArg(options::OPT_fprofile_arcs) || 21686ba612efffba42bec102ac58a1540496158f747eAndrew Sapperstein Args.hasArg(options::OPT_fprofile_generate) || 2169d6eaacbb9eb56763d38a3815fc509b92ed98a585Andrew Sapperstein Args.hasArg(options::OPT_fcreate_profile) || 2170d6eaacbb9eb56763d38a3815fc509b92ed98a585Andrew Sapperstein Args.hasArg(options::OPT_coverage)) 2171d6eaacbb9eb56763d38a3815fc509b92ed98a585Andrew Sapperstein CmdArgs.push_back("-lgcov"); 2172d6eaacbb9eb56763d38a3815fc509b92ed98a585Andrew Sapperstein 2173d6eaacbb9eb56763d38a3815fc509b92ed98a585Andrew Sapperstein if (Args.hasArg(options::OPT_fnested_functions)) 2174d6eaacbb9eb56763d38a3815fc509b92ed98a585Andrew Sapperstein CmdArgs.push_back("-allow_stack_execute"); 2175d6eaacbb9eb56763d38a3815fc509b92ed98a585Andrew Sapperstein 2176d6eaacbb9eb56763d38a3815fc509b92ed98a585Andrew Sapperstein if (!Args.hasArg(options::OPT_nostdlib) && 2177d6eaacbb9eb56763d38a3815fc509b92ed98a585Andrew Sapperstein !Args.hasArg(options::OPT_nodefaultlibs)) { 2178d6eaacbb9eb56763d38a3815fc509b92ed98a585Andrew Sapperstein // FIXME: g++ is more complicated here, it tries to put -lstdc++ 2179d6eaacbb9eb56763d38a3815fc509b92ed98a585Andrew Sapperstein // before -lm, for example. 2180d6eaacbb9eb56763d38a3815fc509b92ed98a585Andrew Sapperstein if (getToolChain().getHost().getDriver().CCCIsCXX) 2181d6eaacbb9eb56763d38a3815fc509b92ed98a585Andrew Sapperstein CmdArgs.push_back("-lstdc++"); 2182d6eaacbb9eb56763d38a3815fc509b92ed98a585Andrew Sapperstein 2183d6eaacbb9eb56763d38a3815fc509b92ed98a585Andrew Sapperstein // link_ssp spec is empty. 2184d6eaacbb9eb56763d38a3815fc509b92ed98a585Andrew Sapperstein 2185d6eaacbb9eb56763d38a3815fc509b92ed98a585Andrew Sapperstein // Let the tool chain choose which runtime library to link. 2186d6eaacbb9eb56763d38a3815fc509b92ed98a585Andrew Sapperstein getDarwinToolChain().AddLinkRuntimeLibArgs(Args, CmdArgs); 2187d6eaacbb9eb56763d38a3815fc509b92ed98a585Andrew Sapperstein } 21886ba612efffba42bec102ac58a1540496158f747eAndrew Sapperstein 21896ba612efffba42bec102ac58a1540496158f747eAndrew Sapperstein if (!Args.hasArg(options::OPT_A) && 2190d6eaacbb9eb56763d38a3815fc509b92ed98a585Andrew Sapperstein !Args.hasArg(options::OPT_nostdlib) && 2191d6eaacbb9eb56763d38a3815fc509b92ed98a585Andrew Sapperstein !Args.hasArg(options::OPT_nostartfiles)) { 2192d6eaacbb9eb56763d38a3815fc509b92ed98a585Andrew Sapperstein // endfile_spec is empty. 2193d6eaacbb9eb56763d38a3815fc509b92ed98a585Andrew Sapperstein } 2194d6eaacbb9eb56763d38a3815fc509b92ed98a585Andrew Sapperstein 2195d6eaacbb9eb56763d38a3815fc509b92ed98a585Andrew Sapperstein Args.AddAllArgs(CmdArgs, options::OPT_T_Group); 2196d6eaacbb9eb56763d38a3815fc509b92ed98a585Andrew Sapperstein Args.AddAllArgs(CmdArgs, options::OPT_F); 2197d6eaacbb9eb56763d38a3815fc509b92ed98a585Andrew Sapperstein 2198d6eaacbb9eb56763d38a3815fc509b92ed98a585Andrew Sapperstein const char *Exec = 2199d6eaacbb9eb56763d38a3815fc509b92ed98a585Andrew Sapperstein Args.MakeArgString(getToolChain().GetProgramPath(C, "ld")); 2200d6eaacbb9eb56763d38a3815fc509b92ed98a585Andrew Sapperstein Dest.addCommand(new Command(JA, *this, Exec, CmdArgs)); 2201d6eaacbb9eb56763d38a3815fc509b92ed98a585Andrew Sapperstein 2202d6eaacbb9eb56763d38a3815fc509b92ed98a585Andrew Sapperstein // Find the first non-empty base input (we want to ignore linker 2203d6eaacbb9eb56763d38a3815fc509b92ed98a585Andrew Sapperstein // inputs). 2204d6eaacbb9eb56763d38a3815fc509b92ed98a585Andrew Sapperstein const char *BaseInput = ""; 2205d6eaacbb9eb56763d38a3815fc509b92ed98a585Andrew Sapperstein for (unsigned i = 0, e = Inputs.size(); i != e; ++i) { 2206d6eaacbb9eb56763d38a3815fc509b92ed98a585Andrew Sapperstein if (Inputs[i].getBaseInput()[0] != '\0') { 2207d6eaacbb9eb56763d38a3815fc509b92ed98a585Andrew Sapperstein BaseInput = Inputs[i].getBaseInput(); 2208d6eaacbb9eb56763d38a3815fc509b92ed98a585Andrew Sapperstein break; 22096ba612efffba42bec102ac58a1540496158f747eAndrew Sapperstein } 22106ba612efffba42bec102ac58a1540496158f747eAndrew Sapperstein } 2211d6eaacbb9eb56763d38a3815fc509b92ed98a585Andrew Sapperstein 2212d6eaacbb9eb56763d38a3815fc509b92ed98a585Andrew Sapperstein // Run dsymutil if we are making an executable in a single step. 2213d6eaacbb9eb56763d38a3815fc509b92ed98a585Andrew Sapperstein // 2214d6eaacbb9eb56763d38a3815fc509b92ed98a585Andrew Sapperstein // FIXME: Currently we don't want to do this when we are part of a 2215d6eaacbb9eb56763d38a3815fc509b92ed98a585Andrew Sapperstein // universal build step, as this would end up creating stray temp 2216d6eaacbb9eb56763d38a3815fc509b92ed98a585Andrew Sapperstein // files. 2217d6eaacbb9eb56763d38a3815fc509b92ed98a585Andrew Sapperstein if (!LinkingOutput && 2218d6eaacbb9eb56763d38a3815fc509b92ed98a585Andrew Sapperstein Args.getLastArg(options::OPT_g_Group) && 2219d6eaacbb9eb56763d38a3815fc509b92ed98a585Andrew Sapperstein !Args.getLastArg(options::OPT_gstabs) && 2220d6eaacbb9eb56763d38a3815fc509b92ed98a585Andrew Sapperstein !Args.getLastArg(options::OPT_g0)) { 2221d6eaacbb9eb56763d38a3815fc509b92ed98a585Andrew Sapperstein // FIXME: This is gross, but matches gcc. The test only considers 2222d6eaacbb9eb56763d38a3815fc509b92ed98a585Andrew Sapperstein // the suffix (not the -x type), and then only of the first 2223d6eaacbb9eb56763d38a3815fc509b92ed98a585Andrew Sapperstein // source input. Awesome. 2224d6eaacbb9eb56763d38a3815fc509b92ed98a585Andrew Sapperstein const char *Suffix = strrchr(BaseInput, '.'); 2225d6eaacbb9eb56763d38a3815fc509b92ed98a585Andrew Sapperstein if (Suffix && isSourceSuffix(Suffix + 1)) { 2226d6eaacbb9eb56763d38a3815fc509b92ed98a585Andrew Sapperstein const char *Exec = 2227d6eaacbb9eb56763d38a3815fc509b92ed98a585Andrew Sapperstein Args.MakeArgString(getToolChain().GetProgramPath(C, "dsymutil")); 2228d6eaacbb9eb56763d38a3815fc509b92ed98a585Andrew Sapperstein ArgStringList CmdArgs; 2229d6eaacbb9eb56763d38a3815fc509b92ed98a585Andrew Sapperstein CmdArgs.push_back(Output.getFilename()); 22306ba612efffba42bec102ac58a1540496158f747eAndrew Sapperstein C.getJobs().addCommand(new Command(JA, *this, Exec, CmdArgs)); 22316ba612efffba42bec102ac58a1540496158f747eAndrew Sapperstein } 2232d6eaacbb9eb56763d38a3815fc509b92ed98a585Andrew Sapperstein } 2233d6eaacbb9eb56763d38a3815fc509b92ed98a585Andrew Sapperstein} 2234d6eaacbb9eb56763d38a3815fc509b92ed98a585Andrew Sapperstein 2235d6eaacbb9eb56763d38a3815fc509b92ed98a585Andrew Sappersteinvoid darwin::Lipo::ConstructJob(Compilation &C, const JobAction &JA, 2236d6eaacbb9eb56763d38a3815fc509b92ed98a585Andrew Sapperstein Job &Dest, const InputInfo &Output, 2237d6eaacbb9eb56763d38a3815fc509b92ed98a585Andrew Sapperstein const InputInfoList &Inputs, 2238d6eaacbb9eb56763d38a3815fc509b92ed98a585Andrew Sapperstein const ArgList &Args, 2239d6eaacbb9eb56763d38a3815fc509b92ed98a585Andrew Sapperstein const char *LinkingOutput) const { 2240d6eaacbb9eb56763d38a3815fc509b92ed98a585Andrew Sapperstein ArgStringList CmdArgs; 2241d6eaacbb9eb56763d38a3815fc509b92ed98a585Andrew Sapperstein 2242d6eaacbb9eb56763d38a3815fc509b92ed98a585Andrew Sapperstein CmdArgs.push_back("-create"); 2243d6eaacbb9eb56763d38a3815fc509b92ed98a585Andrew Sapperstein assert(Output.isFilename() && "Unexpected lipo output."); 2244d6eaacbb9eb56763d38a3815fc509b92ed98a585Andrew Sapperstein 2245d6eaacbb9eb56763d38a3815fc509b92ed98a585Andrew Sapperstein CmdArgs.push_back("-output"); 2246d6eaacbb9eb56763d38a3815fc509b92ed98a585Andrew Sapperstein CmdArgs.push_back(Output.getFilename()); 2247d6eaacbb9eb56763d38a3815fc509b92ed98a585Andrew Sapperstein 2248d6eaacbb9eb56763d38a3815fc509b92ed98a585Andrew Sapperstein for (InputInfoList::const_iterator 2249d6eaacbb9eb56763d38a3815fc509b92ed98a585Andrew Sapperstein it = Inputs.begin(), ie = Inputs.end(); it != ie; ++it) { 2250d6eaacbb9eb56763d38a3815fc509b92ed98a585Andrew Sapperstein const InputInfo &II = *it; 22516ba612efffba42bec102ac58a1540496158f747eAndrew Sapperstein assert(II.isFilename() && "Unexpected lipo input."); 22526ba612efffba42bec102ac58a1540496158f747eAndrew Sapperstein CmdArgs.push_back(II.getFilename()); 2253d6eaacbb9eb56763d38a3815fc509b92ed98a585Andrew Sapperstein } 2254d6eaacbb9eb56763d38a3815fc509b92ed98a585Andrew Sapperstein const char *Exec = 2255d6eaacbb9eb56763d38a3815fc509b92ed98a585Andrew Sapperstein Args.MakeArgString(getToolChain().GetProgramPath(C, "lipo")); 2256d6eaacbb9eb56763d38a3815fc509b92ed98a585Andrew Sapperstein Dest.addCommand(new Command(JA, *this, Exec, CmdArgs)); 2257d6eaacbb9eb56763d38a3815fc509b92ed98a585Andrew Sapperstein} 2258d6eaacbb9eb56763d38a3815fc509b92ed98a585Andrew Sapperstein 2259d6eaacbb9eb56763d38a3815fc509b92ed98a585Andrew Sappersteinvoid auroraux::Assemble::ConstructJob(Compilation &C, const JobAction &JA, 2260d6eaacbb9eb56763d38a3815fc509b92ed98a585Andrew Sapperstein Job &Dest, const InputInfo &Output, 2261d6eaacbb9eb56763d38a3815fc509b92ed98a585Andrew Sapperstein const InputInfoList &Inputs, 2262d6eaacbb9eb56763d38a3815fc509b92ed98a585Andrew Sapperstein const ArgList &Args, 2263d6eaacbb9eb56763d38a3815fc509b92ed98a585Andrew Sapperstein const char *LinkingOutput) const { 2264d6eaacbb9eb56763d38a3815fc509b92ed98a585Andrew Sapperstein ArgStringList CmdArgs; 2265d6eaacbb9eb56763d38a3815fc509b92ed98a585Andrew Sapperstein 2266d6eaacbb9eb56763d38a3815fc509b92ed98a585Andrew Sapperstein Args.AddAllArgValues(CmdArgs, options::OPT_Wa_COMMA, 2267d6eaacbb9eb56763d38a3815fc509b92ed98a585Andrew Sapperstein options::OPT_Xassembler); 2268d6eaacbb9eb56763d38a3815fc509b92ed98a585Andrew Sapperstein 2269d6eaacbb9eb56763d38a3815fc509b92ed98a585Andrew Sapperstein CmdArgs.push_back("-o"); 2270d6eaacbb9eb56763d38a3815fc509b92ed98a585Andrew Sapperstein if (Output.isPipe()) 2271d6eaacbb9eb56763d38a3815fc509b92ed98a585Andrew Sapperstein CmdArgs.push_back("-"); 22726ba612efffba42bec102ac58a1540496158f747eAndrew Sapperstein else 22736ba612efffba42bec102ac58a1540496158f747eAndrew Sapperstein CmdArgs.push_back(Output.getFilename()); 2274d6eaacbb9eb56763d38a3815fc509b92ed98a585Andrew Sapperstein 2275d6eaacbb9eb56763d38a3815fc509b92ed98a585Andrew Sapperstein for (InputInfoList::const_iterator 2276d6eaacbb9eb56763d38a3815fc509b92ed98a585Andrew Sapperstein it = Inputs.begin(), ie = Inputs.end(); it != ie; ++it) { 2277d6eaacbb9eb56763d38a3815fc509b92ed98a585Andrew Sapperstein const InputInfo &II = *it; 2278d6eaacbb9eb56763d38a3815fc509b92ed98a585Andrew Sapperstein if (II.isPipe()) 2279d6eaacbb9eb56763d38a3815fc509b92ed98a585Andrew Sapperstein CmdArgs.push_back("-"); 2280d6eaacbb9eb56763d38a3815fc509b92ed98a585Andrew Sapperstein else 2281d6eaacbb9eb56763d38a3815fc509b92ed98a585Andrew Sapperstein CmdArgs.push_back(II.getFilename()); 2282d6eaacbb9eb56763d38a3815fc509b92ed98a585Andrew Sapperstein } 2283d6eaacbb9eb56763d38a3815fc509b92ed98a585Andrew Sapperstein 2284d6eaacbb9eb56763d38a3815fc509b92ed98a585Andrew Sapperstein const char *Exec = 2285d6eaacbb9eb56763d38a3815fc509b92ed98a585Andrew Sapperstein Args.MakeArgString(getToolChain().GetProgramPath(C, "gas")); 2286d6eaacbb9eb56763d38a3815fc509b92ed98a585Andrew Sapperstein Dest.addCommand(new Command(JA, *this, Exec, CmdArgs)); 2287d6eaacbb9eb56763d38a3815fc509b92ed98a585Andrew Sapperstein} 2288d6eaacbb9eb56763d38a3815fc509b92ed98a585Andrew Sapperstein 2289d6eaacbb9eb56763d38a3815fc509b92ed98a585Andrew Sappersteinvoid auroraux::Link::ConstructJob(Compilation &C, const JobAction &JA, 2290d6eaacbb9eb56763d38a3815fc509b92ed98a585Andrew Sapperstein Job &Dest, const InputInfo &Output, 2291d6eaacbb9eb56763d38a3815fc509b92ed98a585Andrew Sapperstein const InputInfoList &Inputs, 2292d6eaacbb9eb56763d38a3815fc509b92ed98a585Andrew Sapperstein const ArgList &Args, 22936ba612efffba42bec102ac58a1540496158f747eAndrew Sapperstein const char *LinkingOutput) const { 22946ba612efffba42bec102ac58a1540496158f747eAndrew Sapperstein const Driver &D = getToolChain().getHost().getDriver(); 2295d6eaacbb9eb56763d38a3815fc509b92ed98a585Andrew Sapperstein ArgStringList CmdArgs; 2296d6eaacbb9eb56763d38a3815fc509b92ed98a585Andrew Sapperstein 2297d6eaacbb9eb56763d38a3815fc509b92ed98a585Andrew Sapperstein if ((!Args.hasArg(options::OPT_nostdlib)) && 2298d6eaacbb9eb56763d38a3815fc509b92ed98a585Andrew Sapperstein (!Args.hasArg(options::OPT_shared))) { 2299d6eaacbb9eb56763d38a3815fc509b92ed98a585Andrew Sapperstein CmdArgs.push_back("-e"); 2300d6eaacbb9eb56763d38a3815fc509b92ed98a585Andrew Sapperstein CmdArgs.push_back("_start"); 2301d6eaacbb9eb56763d38a3815fc509b92ed98a585Andrew Sapperstein } 2302d6eaacbb9eb56763d38a3815fc509b92ed98a585Andrew Sapperstein 2303d6eaacbb9eb56763d38a3815fc509b92ed98a585Andrew Sapperstein if (Args.hasArg(options::OPT_static)) { 2304d6eaacbb9eb56763d38a3815fc509b92ed98a585Andrew Sapperstein CmdArgs.push_back("-Bstatic"); 2305d6eaacbb9eb56763d38a3815fc509b92ed98a585Andrew Sapperstein CmdArgs.push_back("-dn"); 2306d6eaacbb9eb56763d38a3815fc509b92ed98a585Andrew Sapperstein } else { 2307d6eaacbb9eb56763d38a3815fc509b92ed98a585Andrew Sapperstein// CmdArgs.push_back("--eh-frame-hdr"); 2308d6eaacbb9eb56763d38a3815fc509b92ed98a585Andrew Sapperstein CmdArgs.push_back("-Bdynamic"); 2309d6eaacbb9eb56763d38a3815fc509b92ed98a585Andrew Sapperstein if (Args.hasArg(options::OPT_shared)) { 2310d6eaacbb9eb56763d38a3815fc509b92ed98a585Andrew Sapperstein CmdArgs.push_back("-shared"); 2311d6eaacbb9eb56763d38a3815fc509b92ed98a585Andrew Sapperstein } else { 2312d6eaacbb9eb56763d38a3815fc509b92ed98a585Andrew Sapperstein CmdArgs.push_back("--dynamic-linker"); 2313d6eaacbb9eb56763d38a3815fc509b92ed98a585Andrew Sapperstein CmdArgs.push_back("/lib/ld.so.1"); // 64Bit Path /lib/amd64/ld.so.1 23146ba612efffba42bec102ac58a1540496158f747eAndrew Sapperstein } 23156ba612efffba42bec102ac58a1540496158f747eAndrew Sapperstein } 2316d6eaacbb9eb56763d38a3815fc509b92ed98a585Andrew Sapperstein 2317d6eaacbb9eb56763d38a3815fc509b92ed98a585Andrew Sapperstein if (Output.isPipe()) { 2318d6eaacbb9eb56763d38a3815fc509b92ed98a585Andrew Sapperstein CmdArgs.push_back("-o"); 2319d6eaacbb9eb56763d38a3815fc509b92ed98a585Andrew Sapperstein CmdArgs.push_back("-"); 2320d6eaacbb9eb56763d38a3815fc509b92ed98a585Andrew Sapperstein } else if (Output.isFilename()) { 2321d6eaacbb9eb56763d38a3815fc509b92ed98a585Andrew Sapperstein CmdArgs.push_back("-o"); 2322d6eaacbb9eb56763d38a3815fc509b92ed98a585Andrew Sapperstein CmdArgs.push_back(Output.getFilename()); 2323d6eaacbb9eb56763d38a3815fc509b92ed98a585Andrew Sapperstein } else { 2324d6eaacbb9eb56763d38a3815fc509b92ed98a585Andrew Sapperstein assert(Output.isNothing() && "Invalid output."); 2325d6eaacbb9eb56763d38a3815fc509b92ed98a585Andrew Sapperstein } 2326d6eaacbb9eb56763d38a3815fc509b92ed98a585Andrew Sapperstein 2327d6eaacbb9eb56763d38a3815fc509b92ed98a585Andrew Sapperstein if (!Args.hasArg(options::OPT_nostdlib) && 2328d6eaacbb9eb56763d38a3815fc509b92ed98a585Andrew Sapperstein !Args.hasArg(options::OPT_nostartfiles)) { 2329d6eaacbb9eb56763d38a3815fc509b92ed98a585Andrew Sapperstein if (!Args.hasArg(options::OPT_shared)) { 2330d6eaacbb9eb56763d38a3815fc509b92ed98a585Andrew Sapperstein CmdArgs.push_back(Args.MakeArgString(getToolChain().GetFilePath(C, "crt1.o"))); 2331d6eaacbb9eb56763d38a3815fc509b92ed98a585Andrew Sapperstein CmdArgs.push_back(Args.MakeArgString(getToolChain().GetFilePath(C, "crti.o"))); 2332d6eaacbb9eb56763d38a3815fc509b92ed98a585Andrew Sapperstein CmdArgs.push_back(Args.MakeArgString(getToolChain().GetFilePath(C, "crtbegin.o"))); 2333d6eaacbb9eb56763d38a3815fc509b92ed98a585Andrew Sapperstein } else { 2334d6eaacbb9eb56763d38a3815fc509b92ed98a585Andrew Sapperstein CmdArgs.push_back(Args.MakeArgString(getToolChain().GetFilePath(C, "crti.o"))); 23356ba612efffba42bec102ac58a1540496158f747eAndrew Sapperstein } 23366ba612efffba42bec102ac58a1540496158f747eAndrew Sapperstein CmdArgs.push_back(Args.MakeArgString(getToolChain().GetFilePath(C, "crtn.o"))); 2337d6eaacbb9eb56763d38a3815fc509b92ed98a585Andrew Sapperstein } 2338d6eaacbb9eb56763d38a3815fc509b92ed98a585Andrew Sapperstein 2339d6eaacbb9eb56763d38a3815fc509b92ed98a585Andrew Sapperstein CmdArgs.push_back(Args.MakeArgString("-L/opt/gcc4/lib/gcc/" 2340d6eaacbb9eb56763d38a3815fc509b92ed98a585Andrew Sapperstein + getToolChain().getTripleString() 2341d6eaacbb9eb56763d38a3815fc509b92ed98a585Andrew Sapperstein + "/4.2.4")); 2342d6eaacbb9eb56763d38a3815fc509b92ed98a585Andrew Sapperstein 2343d6eaacbb9eb56763d38a3815fc509b92ed98a585Andrew Sapperstein Args.AddAllArgs(CmdArgs, options::OPT_L); 2344d6eaacbb9eb56763d38a3815fc509b92ed98a585Andrew Sapperstein Args.AddAllArgs(CmdArgs, options::OPT_T_Group); 2345d6eaacbb9eb56763d38a3815fc509b92ed98a585Andrew Sapperstein Args.AddAllArgs(CmdArgs, options::OPT_e); 2346d6eaacbb9eb56763d38a3815fc509b92ed98a585Andrew Sapperstein 2347d6eaacbb9eb56763d38a3815fc509b92ed98a585Andrew Sapperstein for (InputInfoList::const_iterator 2348d6eaacbb9eb56763d38a3815fc509b92ed98a585Andrew Sapperstein it = Inputs.begin(), ie = Inputs.end(); it != ie; ++it) { 2349d6eaacbb9eb56763d38a3815fc509b92ed98a585Andrew Sapperstein const InputInfo &II = *it; 2350d6eaacbb9eb56763d38a3815fc509b92ed98a585Andrew Sapperstein 2351d6eaacbb9eb56763d38a3815fc509b92ed98a585Andrew Sapperstein // Don't try to pass LLVM inputs to a generic gcc. 2352d6eaacbb9eb56763d38a3815fc509b92ed98a585Andrew Sapperstein if (II.getType() == types::TY_LLVMBC) 2353d6eaacbb9eb56763d38a3815fc509b92ed98a585Andrew Sapperstein D.Diag(clang::diag::err_drv_no_linker_llvm_support) 2354d6eaacbb9eb56763d38a3815fc509b92ed98a585Andrew Sapperstein << getToolChain().getTripleString(); 2355d6eaacbb9eb56763d38a3815fc509b92ed98a585Andrew Sapperstein 23566ba612efffba42bec102ac58a1540496158f747eAndrew Sapperstein if (II.isPipe()) 23576ba612efffba42bec102ac58a1540496158f747eAndrew Sapperstein CmdArgs.push_back("-"); 2358d6eaacbb9eb56763d38a3815fc509b92ed98a585Andrew Sapperstein else if (II.isFilename()) 2359d6eaacbb9eb56763d38a3815fc509b92ed98a585Andrew Sapperstein CmdArgs.push_back(II.getFilename()); 2360d6eaacbb9eb56763d38a3815fc509b92ed98a585Andrew Sapperstein else 2361d6eaacbb9eb56763d38a3815fc509b92ed98a585Andrew Sapperstein II.getInputArg().renderAsInput(Args, CmdArgs); 2362d6eaacbb9eb56763d38a3815fc509b92ed98a585Andrew Sapperstein } 2363d6eaacbb9eb56763d38a3815fc509b92ed98a585Andrew Sapperstein 2364d6eaacbb9eb56763d38a3815fc509b92ed98a585Andrew Sapperstein if (!Args.hasArg(options::OPT_nostdlib) && 2365d6eaacbb9eb56763d38a3815fc509b92ed98a585Andrew Sapperstein !Args.hasArg(options::OPT_nodefaultlibs)) { 2366d6eaacbb9eb56763d38a3815fc509b92ed98a585Andrew Sapperstein // FIXME: For some reason GCC passes -lgcc before adding 2367d6eaacbb9eb56763d38a3815fc509b92ed98a585Andrew Sapperstein // the default system libraries. Just mimic this for now. 2368d6eaacbb9eb56763d38a3815fc509b92ed98a585Andrew Sapperstein CmdArgs.push_back("-lgcc"); 2369d6eaacbb9eb56763d38a3815fc509b92ed98a585Andrew Sapperstein 2370d6eaacbb9eb56763d38a3815fc509b92ed98a585Andrew Sapperstein if (Args.hasArg(options::OPT_pthread)) 2371d6eaacbb9eb56763d38a3815fc509b92ed98a585Andrew Sapperstein CmdArgs.push_back("-pthread"); 2372d6eaacbb9eb56763d38a3815fc509b92ed98a585Andrew Sapperstein if (!Args.hasArg(options::OPT_shared)) 2373d6eaacbb9eb56763d38a3815fc509b92ed98a585Andrew Sapperstein CmdArgs.push_back("-lc"); 2374d6eaacbb9eb56763d38a3815fc509b92ed98a585Andrew Sapperstein CmdArgs.push_back("-lgcc"); 2375d6eaacbb9eb56763d38a3815fc509b92ed98a585Andrew Sapperstein } 2376d6eaacbb9eb56763d38a3815fc509b92ed98a585Andrew Sapperstein 23776ba612efffba42bec102ac58a1540496158f747eAndrew Sapperstein if (!Args.hasArg(options::OPT_nostdlib) && 23786ba612efffba42bec102ac58a1540496158f747eAndrew Sapperstein !Args.hasArg(options::OPT_nostartfiles)) { 2379d6eaacbb9eb56763d38a3815fc509b92ed98a585Andrew Sapperstein if (!Args.hasArg(options::OPT_shared)) 2380d6eaacbb9eb56763d38a3815fc509b92ed98a585Andrew Sapperstein CmdArgs.push_back(Args.MakeArgString(getToolChain().GetFilePath(C, "crtend.o"))); 2381d6eaacbb9eb56763d38a3815fc509b92ed98a585Andrew Sapperstein// else 2382d6eaacbb9eb56763d38a3815fc509b92ed98a585Andrew Sapperstein// CmdArgs.push_back(Args.MakeArgString(getToolChain().GetFilePath(C, "crtendS.o"))); 2383d6eaacbb9eb56763d38a3815fc509b92ed98a585Andrew Sapperstein } 2384d6eaacbb9eb56763d38a3815fc509b92ed98a585Andrew Sapperstein 2385d6eaacbb9eb56763d38a3815fc509b92ed98a585Andrew Sapperstein const char *Exec = 2386d6eaacbb9eb56763d38a3815fc509b92ed98a585Andrew Sapperstein Args.MakeArgString(getToolChain().GetProgramPath(C, "ld")); 2387d6eaacbb9eb56763d38a3815fc509b92ed98a585Andrew Sapperstein Dest.addCommand(new Command(JA, *this, Exec, CmdArgs)); 2388d6eaacbb9eb56763d38a3815fc509b92ed98a585Andrew Sapperstein} 2389d6eaacbb9eb56763d38a3815fc509b92ed98a585Andrew Sapperstein 2390d6eaacbb9eb56763d38a3815fc509b92ed98a585Andrew Sappersteinvoid openbsd::Assemble::ConstructJob(Compilation &C, const JobAction &JA, 2391d6eaacbb9eb56763d38a3815fc509b92ed98a585Andrew Sapperstein Job &Dest, const InputInfo &Output, 2392d6eaacbb9eb56763d38a3815fc509b92ed98a585Andrew Sapperstein const InputInfoList &Inputs, 2393d6eaacbb9eb56763d38a3815fc509b92ed98a585Andrew Sapperstein const ArgList &Args, 2394d6eaacbb9eb56763d38a3815fc509b92ed98a585Andrew Sapperstein const char *LinkingOutput) const { 2395d6eaacbb9eb56763d38a3815fc509b92ed98a585Andrew Sapperstein ArgStringList CmdArgs; 2396d6eaacbb9eb56763d38a3815fc509b92ed98a585Andrew Sapperstein 2397d6eaacbb9eb56763d38a3815fc509b92ed98a585Andrew Sapperstein Args.AddAllArgValues(CmdArgs, options::OPT_Wa_COMMA, 23986ba612efffba42bec102ac58a1540496158f747eAndrew Sapperstein options::OPT_Xassembler); 23996ba612efffba42bec102ac58a1540496158f747eAndrew Sapperstein 2400d6eaacbb9eb56763d38a3815fc509b92ed98a585Andrew Sapperstein CmdArgs.push_back("-o"); 2401d6eaacbb9eb56763d38a3815fc509b92ed98a585Andrew Sapperstein if (Output.isPipe()) 2402d6eaacbb9eb56763d38a3815fc509b92ed98a585Andrew Sapperstein CmdArgs.push_back("-"); 2403d6eaacbb9eb56763d38a3815fc509b92ed98a585Andrew Sapperstein else 2404d6eaacbb9eb56763d38a3815fc509b92ed98a585Andrew Sapperstein CmdArgs.push_back(Output.getFilename()); 2405d6eaacbb9eb56763d38a3815fc509b92ed98a585Andrew Sapperstein 2406d6eaacbb9eb56763d38a3815fc509b92ed98a585Andrew Sapperstein for (InputInfoList::const_iterator 2407d6eaacbb9eb56763d38a3815fc509b92ed98a585Andrew Sapperstein it = Inputs.begin(), ie = Inputs.end(); it != ie; ++it) { 2408d6eaacbb9eb56763d38a3815fc509b92ed98a585Andrew Sapperstein const InputInfo &II = *it; 2409d6eaacbb9eb56763d38a3815fc509b92ed98a585Andrew Sapperstein if (II.isPipe()) 2410d6eaacbb9eb56763d38a3815fc509b92ed98a585Andrew Sapperstein CmdArgs.push_back("-"); 2411d6eaacbb9eb56763d38a3815fc509b92ed98a585Andrew Sapperstein else 2412d6eaacbb9eb56763d38a3815fc509b92ed98a585Andrew Sapperstein CmdArgs.push_back(II.getFilename()); 2413d6eaacbb9eb56763d38a3815fc509b92ed98a585Andrew Sapperstein } 2414d6eaacbb9eb56763d38a3815fc509b92ed98a585Andrew Sapperstein 2415d6eaacbb9eb56763d38a3815fc509b92ed98a585Andrew Sapperstein const char *Exec = 2416d6eaacbb9eb56763d38a3815fc509b92ed98a585Andrew Sapperstein Args.MakeArgString(getToolChain().GetProgramPath(C, "as")); 2417d6eaacbb9eb56763d38a3815fc509b92ed98a585Andrew Sapperstein Dest.addCommand(new Command(JA, *this, Exec, CmdArgs)); 2418d6eaacbb9eb56763d38a3815fc509b92ed98a585Andrew Sapperstein} 24196ba612efffba42bec102ac58a1540496158f747eAndrew Sapperstein 24206ba612efffba42bec102ac58a1540496158f747eAndrew Sappersteinvoid openbsd::Link::ConstructJob(Compilation &C, const JobAction &JA, 2421d6eaacbb9eb56763d38a3815fc509b92ed98a585Andrew Sapperstein Job &Dest, const InputInfo &Output, 2422d6eaacbb9eb56763d38a3815fc509b92ed98a585Andrew Sapperstein const InputInfoList &Inputs, 2423d6eaacbb9eb56763d38a3815fc509b92ed98a585Andrew Sapperstein const ArgList &Args, 2424d6eaacbb9eb56763d38a3815fc509b92ed98a585Andrew Sapperstein const char *LinkingOutput) const { 2425d6eaacbb9eb56763d38a3815fc509b92ed98a585Andrew Sapperstein const Driver &D = getToolChain().getHost().getDriver(); 2426d6eaacbb9eb56763d38a3815fc509b92ed98a585Andrew Sapperstein ArgStringList CmdArgs; 2427d6eaacbb9eb56763d38a3815fc509b92ed98a585Andrew Sapperstein 2428d6eaacbb9eb56763d38a3815fc509b92ed98a585Andrew Sapperstein if ((!Args.hasArg(options::OPT_nostdlib)) && 2429d6eaacbb9eb56763d38a3815fc509b92ed98a585Andrew Sapperstein (!Args.hasArg(options::OPT_shared))) { 2430d6eaacbb9eb56763d38a3815fc509b92ed98a585Andrew Sapperstein CmdArgs.push_back("-e"); 2431d6eaacbb9eb56763d38a3815fc509b92ed98a585Andrew Sapperstein CmdArgs.push_back("__start"); 2432d6eaacbb9eb56763d38a3815fc509b92ed98a585Andrew Sapperstein } 2433d6eaacbb9eb56763d38a3815fc509b92ed98a585Andrew Sapperstein 2434d6eaacbb9eb56763d38a3815fc509b92ed98a585Andrew Sapperstein if (Args.hasArg(options::OPT_static)) { 2435d6eaacbb9eb56763d38a3815fc509b92ed98a585Andrew Sapperstein CmdArgs.push_back("-Bstatic"); 2436d6eaacbb9eb56763d38a3815fc509b92ed98a585Andrew Sapperstein } else { 2437d6eaacbb9eb56763d38a3815fc509b92ed98a585Andrew Sapperstein CmdArgs.push_back("--eh-frame-hdr"); 2438d6eaacbb9eb56763d38a3815fc509b92ed98a585Andrew Sapperstein CmdArgs.push_back("-Bdynamic"); 2439d6eaacbb9eb56763d38a3815fc509b92ed98a585Andrew Sapperstein if (Args.hasArg(options::OPT_shared)) { 24406ba612efffba42bec102ac58a1540496158f747eAndrew Sapperstein CmdArgs.push_back("-shared"); 24416ba612efffba42bec102ac58a1540496158f747eAndrew Sapperstein } else { 2442d6eaacbb9eb56763d38a3815fc509b92ed98a585Andrew Sapperstein CmdArgs.push_back("-dynamic-linker"); 2443d6eaacbb9eb56763d38a3815fc509b92ed98a585Andrew Sapperstein CmdArgs.push_back("/usr/libexec/ld.so"); 2444d6eaacbb9eb56763d38a3815fc509b92ed98a585Andrew Sapperstein } 2445d6eaacbb9eb56763d38a3815fc509b92ed98a585Andrew Sapperstein } 2446d6eaacbb9eb56763d38a3815fc509b92ed98a585Andrew Sapperstein 2447d6eaacbb9eb56763d38a3815fc509b92ed98a585Andrew Sapperstein if (Output.isPipe()) { 2448d6eaacbb9eb56763d38a3815fc509b92ed98a585Andrew Sapperstein CmdArgs.push_back("-o"); 2449d6eaacbb9eb56763d38a3815fc509b92ed98a585Andrew Sapperstein CmdArgs.push_back("-"); 2450d6eaacbb9eb56763d38a3815fc509b92ed98a585Andrew Sapperstein } else if (Output.isFilename()) { 2451d6eaacbb9eb56763d38a3815fc509b92ed98a585Andrew Sapperstein CmdArgs.push_back("-o"); 2452d6eaacbb9eb56763d38a3815fc509b92ed98a585Andrew Sapperstein CmdArgs.push_back(Output.getFilename()); 2453d6eaacbb9eb56763d38a3815fc509b92ed98a585Andrew Sapperstein } else { 2454d6eaacbb9eb56763d38a3815fc509b92ed98a585Andrew Sapperstein assert(Output.isNothing() && "Invalid output."); 2455d6eaacbb9eb56763d38a3815fc509b92ed98a585Andrew Sapperstein } 2456d6eaacbb9eb56763d38a3815fc509b92ed98a585Andrew Sapperstein 2457d6eaacbb9eb56763d38a3815fc509b92ed98a585Andrew Sapperstein if (!Args.hasArg(options::OPT_nostdlib) && 2458d6eaacbb9eb56763d38a3815fc509b92ed98a585Andrew Sapperstein !Args.hasArg(options::OPT_nostartfiles)) { 2459d6eaacbb9eb56763d38a3815fc509b92ed98a585Andrew Sapperstein if (!Args.hasArg(options::OPT_shared)) { 2460d6eaacbb9eb56763d38a3815fc509b92ed98a585Andrew Sapperstein CmdArgs.push_back(Args.MakeArgString(getToolChain().GetFilePath(C, "crt0.o"))); 24616ba612efffba42bec102ac58a1540496158f747eAndrew Sapperstein CmdArgs.push_back(Args.MakeArgString(getToolChain().GetFilePath(C, "crtbegin.o"))); 24626ba612efffba42bec102ac58a1540496158f747eAndrew Sapperstein } else { 2463d6eaacbb9eb56763d38a3815fc509b92ed98a585Andrew Sapperstein CmdArgs.push_back(Args.MakeArgString(getToolChain().GetFilePath(C, "crtbeginS.o"))); 2464d6eaacbb9eb56763d38a3815fc509b92ed98a585Andrew Sapperstein } 2465d6eaacbb9eb56763d38a3815fc509b92ed98a585Andrew Sapperstein } 2466d6eaacbb9eb56763d38a3815fc509b92ed98a585Andrew Sapperstein 2467d6eaacbb9eb56763d38a3815fc509b92ed98a585Andrew Sapperstein std::string Triple = getToolChain().getTripleString(); 2468d6eaacbb9eb56763d38a3815fc509b92ed98a585Andrew Sapperstein if (Triple.substr(0, 6) == "x86_64") 2469d6eaacbb9eb56763d38a3815fc509b92ed98a585Andrew Sapperstein Triple.replace(0, 6, "amd64"); 2470d6eaacbb9eb56763d38a3815fc509b92ed98a585Andrew Sapperstein CmdArgs.push_back(Args.MakeArgString("-L/usr/lib/gcc-lib/" + Triple + 2471d6eaacbb9eb56763d38a3815fc509b92ed98a585Andrew Sapperstein "/3.3.5")); 2472d6eaacbb9eb56763d38a3815fc509b92ed98a585Andrew Sapperstein 2473d6eaacbb9eb56763d38a3815fc509b92ed98a585Andrew Sapperstein Args.AddAllArgs(CmdArgs, options::OPT_L); 2474d6eaacbb9eb56763d38a3815fc509b92ed98a585Andrew Sapperstein Args.AddAllArgs(CmdArgs, options::OPT_T_Group); 2475d6eaacbb9eb56763d38a3815fc509b92ed98a585Andrew Sapperstein Args.AddAllArgs(CmdArgs, options::OPT_e); 2476d6eaacbb9eb56763d38a3815fc509b92ed98a585Andrew Sapperstein 2477d6eaacbb9eb56763d38a3815fc509b92ed98a585Andrew Sapperstein for (InputInfoList::const_iterator 2478d6eaacbb9eb56763d38a3815fc509b92ed98a585Andrew Sapperstein it = Inputs.begin(), ie = Inputs.end(); it != ie; ++it) { 2479d6eaacbb9eb56763d38a3815fc509b92ed98a585Andrew Sapperstein const InputInfo &II = *it; 2480d6eaacbb9eb56763d38a3815fc509b92ed98a585Andrew Sapperstein 2481d6eaacbb9eb56763d38a3815fc509b92ed98a585Andrew Sapperstein // Don't try to pass LLVM inputs to a generic gcc. 24826ba612efffba42bec102ac58a1540496158f747eAndrew Sapperstein if (II.getType() == types::TY_LLVMBC) 24836ba612efffba42bec102ac58a1540496158f747eAndrew Sapperstein D.Diag(clang::diag::err_drv_no_linker_llvm_support) 2484d6eaacbb9eb56763d38a3815fc509b92ed98a585Andrew Sapperstein << getToolChain().getTripleString(); 2485d6eaacbb9eb56763d38a3815fc509b92ed98a585Andrew Sapperstein 2486d6eaacbb9eb56763d38a3815fc509b92ed98a585Andrew Sapperstein if (II.isPipe()) 2487d6eaacbb9eb56763d38a3815fc509b92ed98a585Andrew Sapperstein CmdArgs.push_back("-"); 2488d6eaacbb9eb56763d38a3815fc509b92ed98a585Andrew Sapperstein else if (II.isFilename()) 2489d6eaacbb9eb56763d38a3815fc509b92ed98a585Andrew Sapperstein CmdArgs.push_back(II.getFilename()); 2490d6eaacbb9eb56763d38a3815fc509b92ed98a585Andrew Sapperstein else 2491d6eaacbb9eb56763d38a3815fc509b92ed98a585Andrew Sapperstein II.getInputArg().renderAsInput(Args, CmdArgs); 2492d6eaacbb9eb56763d38a3815fc509b92ed98a585Andrew Sapperstein } 2493d6eaacbb9eb56763d38a3815fc509b92ed98a585Andrew Sapperstein 2494d6eaacbb9eb56763d38a3815fc509b92ed98a585Andrew Sapperstein if (!Args.hasArg(options::OPT_nostdlib) && 2495d6eaacbb9eb56763d38a3815fc509b92ed98a585Andrew Sapperstein !Args.hasArg(options::OPT_nodefaultlibs)) { 2496d6eaacbb9eb56763d38a3815fc509b92ed98a585Andrew Sapperstein // FIXME: For some reason GCC passes -lgcc before adding 2497d6eaacbb9eb56763d38a3815fc509b92ed98a585Andrew Sapperstein // the default system libraries. Just mimic this for now. 2498d6eaacbb9eb56763d38a3815fc509b92ed98a585Andrew Sapperstein CmdArgs.push_back("-lgcc"); 2499d6eaacbb9eb56763d38a3815fc509b92ed98a585Andrew Sapperstein 2500d6eaacbb9eb56763d38a3815fc509b92ed98a585Andrew Sapperstein if (Args.hasArg(options::OPT_pthread)) 2501d6eaacbb9eb56763d38a3815fc509b92ed98a585Andrew Sapperstein CmdArgs.push_back("-pthread"); 2502d6eaacbb9eb56763d38a3815fc509b92ed98a585Andrew Sapperstein if (!Args.hasArg(options::OPT_shared)) 25036ba612efffba42bec102ac58a1540496158f747eAndrew Sapperstein CmdArgs.push_back("-lc"); 25046ba612efffba42bec102ac58a1540496158f747eAndrew Sapperstein CmdArgs.push_back("-lgcc"); 2505d6eaacbb9eb56763d38a3815fc509b92ed98a585Andrew Sapperstein } 2506d6eaacbb9eb56763d38a3815fc509b92ed98a585Andrew Sapperstein 2507d6eaacbb9eb56763d38a3815fc509b92ed98a585Andrew Sapperstein if (!Args.hasArg(options::OPT_nostdlib) && 2508d6eaacbb9eb56763d38a3815fc509b92ed98a585Andrew Sapperstein !Args.hasArg(options::OPT_nostartfiles)) { 2509d6eaacbb9eb56763d38a3815fc509b92ed98a585Andrew Sapperstein if (!Args.hasArg(options::OPT_shared)) 2510d6eaacbb9eb56763d38a3815fc509b92ed98a585Andrew Sapperstein CmdArgs.push_back(Args.MakeArgString(getToolChain().GetFilePath(C, "crtend.o"))); 2511d6eaacbb9eb56763d38a3815fc509b92ed98a585Andrew Sapperstein else 2512d6eaacbb9eb56763d38a3815fc509b92ed98a585Andrew Sapperstein CmdArgs.push_back(Args.MakeArgString(getToolChain().GetFilePath(C, "crtendS.o"))); 2513d6eaacbb9eb56763d38a3815fc509b92ed98a585Andrew Sapperstein } 2514d6eaacbb9eb56763d38a3815fc509b92ed98a585Andrew Sapperstein 2515d6eaacbb9eb56763d38a3815fc509b92ed98a585Andrew Sapperstein const char *Exec = 2516d6eaacbb9eb56763d38a3815fc509b92ed98a585Andrew Sapperstein Args.MakeArgString(getToolChain().GetProgramPath(C, "ld")); 2517d6eaacbb9eb56763d38a3815fc509b92ed98a585Andrew Sapperstein Dest.addCommand(new Command(JA, *this, Exec, CmdArgs)); 2518d6eaacbb9eb56763d38a3815fc509b92ed98a585Andrew Sapperstein} 2519d6eaacbb9eb56763d38a3815fc509b92ed98a585Andrew Sapperstein 2520d6eaacbb9eb56763d38a3815fc509b92ed98a585Andrew Sappersteinvoid freebsd::Assemble::ConstructJob(Compilation &C, const JobAction &JA, 2521d6eaacbb9eb56763d38a3815fc509b92ed98a585Andrew Sapperstein Job &Dest, const InputInfo &Output, 2522d6eaacbb9eb56763d38a3815fc509b92ed98a585Andrew Sapperstein const InputInfoList &Inputs, 2523d6eaacbb9eb56763d38a3815fc509b92ed98a585Andrew Sapperstein const ArgList &Args, 25246ba612efffba42bec102ac58a1540496158f747eAndrew Sapperstein const char *LinkingOutput) const { 25256ba612efffba42bec102ac58a1540496158f747eAndrew Sapperstein ArgStringList CmdArgs; 2526d6eaacbb9eb56763d38a3815fc509b92ed98a585Andrew Sapperstein 2527d6eaacbb9eb56763d38a3815fc509b92ed98a585Andrew Sapperstein // When building 32-bit code on FreeBSD/amd64, we have to explicitly 2528d6eaacbb9eb56763d38a3815fc509b92ed98a585Andrew Sapperstein // instruct as in the base system to assemble 32-bit code. 2529d6eaacbb9eb56763d38a3815fc509b92ed98a585Andrew Sapperstein if (getToolChain().getArchName() == "i386") 2530d6eaacbb9eb56763d38a3815fc509b92ed98a585Andrew Sapperstein CmdArgs.push_back("--32"); 2531d6eaacbb9eb56763d38a3815fc509b92ed98a585Andrew Sapperstein 2532d6eaacbb9eb56763d38a3815fc509b92ed98a585Andrew Sapperstein Args.AddAllArgValues(CmdArgs, options::OPT_Wa_COMMA, 2533d6eaacbb9eb56763d38a3815fc509b92ed98a585Andrew Sapperstein options::OPT_Xassembler); 2534d6eaacbb9eb56763d38a3815fc509b92ed98a585Andrew Sapperstein 2535d6eaacbb9eb56763d38a3815fc509b92ed98a585Andrew Sapperstein CmdArgs.push_back("-o"); 2536d6eaacbb9eb56763d38a3815fc509b92ed98a585Andrew Sapperstein if (Output.isPipe()) 2537d6eaacbb9eb56763d38a3815fc509b92ed98a585Andrew Sapperstein CmdArgs.push_back("-"); 2538d6eaacbb9eb56763d38a3815fc509b92ed98a585Andrew Sapperstein else 2539d6eaacbb9eb56763d38a3815fc509b92ed98a585Andrew Sapperstein CmdArgs.push_back(Output.getFilename()); 2540d6eaacbb9eb56763d38a3815fc509b92ed98a585Andrew Sapperstein 2541d6eaacbb9eb56763d38a3815fc509b92ed98a585Andrew Sapperstein for (InputInfoList::const_iterator 2542d6eaacbb9eb56763d38a3815fc509b92ed98a585Andrew Sapperstein it = Inputs.begin(), ie = Inputs.end(); it != ie; ++it) { 2543d6eaacbb9eb56763d38a3815fc509b92ed98a585Andrew Sapperstein const InputInfo &II = *it; 2544d6eaacbb9eb56763d38a3815fc509b92ed98a585Andrew Sapperstein if (II.isPipe()) 25456ba612efffba42bec102ac58a1540496158f747eAndrew Sapperstein CmdArgs.push_back("-"); 25466ba612efffba42bec102ac58a1540496158f747eAndrew Sapperstein else 2547d6eaacbb9eb56763d38a3815fc509b92ed98a585Andrew Sapperstein CmdArgs.push_back(II.getFilename()); 2548d6eaacbb9eb56763d38a3815fc509b92ed98a585Andrew Sapperstein } 2549d6eaacbb9eb56763d38a3815fc509b92ed98a585Andrew Sapperstein 2550d6eaacbb9eb56763d38a3815fc509b92ed98a585Andrew Sapperstein const char *Exec = 2551d6eaacbb9eb56763d38a3815fc509b92ed98a585Andrew Sapperstein Args.MakeArgString(getToolChain().GetProgramPath(C, "as")); 2552d6eaacbb9eb56763d38a3815fc509b92ed98a585Andrew Sapperstein Dest.addCommand(new Command(JA, *this, Exec, CmdArgs)); 2553d6eaacbb9eb56763d38a3815fc509b92ed98a585Andrew Sapperstein} 2554d6eaacbb9eb56763d38a3815fc509b92ed98a585Andrew Sapperstein 2555d6eaacbb9eb56763d38a3815fc509b92ed98a585Andrew Sappersteinvoid freebsd::Link::ConstructJob(Compilation &C, const JobAction &JA, 2556d6eaacbb9eb56763d38a3815fc509b92ed98a585Andrew Sapperstein Job &Dest, const InputInfo &Output, 2557d6eaacbb9eb56763d38a3815fc509b92ed98a585Andrew Sapperstein const InputInfoList &Inputs, 2558d6eaacbb9eb56763d38a3815fc509b92ed98a585Andrew Sapperstein const ArgList &Args, 2559d6eaacbb9eb56763d38a3815fc509b92ed98a585Andrew Sapperstein const char *LinkingOutput) const { 2560d6eaacbb9eb56763d38a3815fc509b92ed98a585Andrew Sapperstein const Driver &D = getToolChain().getHost().getDriver(); 2561d6eaacbb9eb56763d38a3815fc509b92ed98a585Andrew Sapperstein ArgStringList CmdArgs; 2562d6eaacbb9eb56763d38a3815fc509b92ed98a585Andrew Sapperstein 2563d6eaacbb9eb56763d38a3815fc509b92ed98a585Andrew Sapperstein if (Args.hasArg(options::OPT_static)) { 2564d6eaacbb9eb56763d38a3815fc509b92ed98a585Andrew Sapperstein CmdArgs.push_back("-Bstatic"); 2565d6eaacbb9eb56763d38a3815fc509b92ed98a585Andrew Sapperstein } else { 25666ba612efffba42bec102ac58a1540496158f747eAndrew Sapperstein CmdArgs.push_back("--eh-frame-hdr"); 25676ba612efffba42bec102ac58a1540496158f747eAndrew Sapperstein if (Args.hasArg(options::OPT_shared)) { 2568d6eaacbb9eb56763d38a3815fc509b92ed98a585Andrew Sapperstein CmdArgs.push_back("-Bshareable"); 2569d6eaacbb9eb56763d38a3815fc509b92ed98a585Andrew Sapperstein } else { 2570d6eaacbb9eb56763d38a3815fc509b92ed98a585Andrew Sapperstein CmdArgs.push_back("-dynamic-linker"); 2571d6eaacbb9eb56763d38a3815fc509b92ed98a585Andrew Sapperstein CmdArgs.push_back("/libexec/ld-elf.so.1"); 2572d6eaacbb9eb56763d38a3815fc509b92ed98a585Andrew Sapperstein } 2573d6eaacbb9eb56763d38a3815fc509b92ed98a585Andrew Sapperstein } 2574d6eaacbb9eb56763d38a3815fc509b92ed98a585Andrew Sapperstein 2575d6eaacbb9eb56763d38a3815fc509b92ed98a585Andrew Sapperstein // When building 32-bit code on FreeBSD/amd64, we have to explicitly 2576d6eaacbb9eb56763d38a3815fc509b92ed98a585Andrew Sapperstein // instruct ld in the base system to link 32-bit code. 2577d6eaacbb9eb56763d38a3815fc509b92ed98a585Andrew Sapperstein if (getToolChain().getArchName() == "i386") { 2578d6eaacbb9eb56763d38a3815fc509b92ed98a585Andrew Sapperstein CmdArgs.push_back("-m"); 2579d6eaacbb9eb56763d38a3815fc509b92ed98a585Andrew Sapperstein CmdArgs.push_back("elf_i386_fbsd"); 2580d6eaacbb9eb56763d38a3815fc509b92ed98a585Andrew Sapperstein } 2581d6eaacbb9eb56763d38a3815fc509b92ed98a585Andrew Sapperstein 2582d6eaacbb9eb56763d38a3815fc509b92ed98a585Andrew Sapperstein if (Output.isPipe()) { 2583d6eaacbb9eb56763d38a3815fc509b92ed98a585Andrew Sapperstein CmdArgs.push_back("-o"); 2584d6eaacbb9eb56763d38a3815fc509b92ed98a585Andrew Sapperstein CmdArgs.push_back("-"); 2585d6eaacbb9eb56763d38a3815fc509b92ed98a585Andrew Sapperstein } else if (Output.isFilename()) { 2586d6eaacbb9eb56763d38a3815fc509b92ed98a585Andrew Sapperstein CmdArgs.push_back("-o"); 25876ba612efffba42bec102ac58a1540496158f747eAndrew Sapperstein CmdArgs.push_back(Output.getFilename()); 25886ba612efffba42bec102ac58a1540496158f747eAndrew Sapperstein } else { 2589d6eaacbb9eb56763d38a3815fc509b92ed98a585Andrew Sapperstein assert(Output.isNothing() && "Invalid output."); 2590d6eaacbb9eb56763d38a3815fc509b92ed98a585Andrew Sapperstein } 2591d6eaacbb9eb56763d38a3815fc509b92ed98a585Andrew Sapperstein 2592d6eaacbb9eb56763d38a3815fc509b92ed98a585Andrew Sapperstein if (!Args.hasArg(options::OPT_nostdlib) && 2593d6eaacbb9eb56763d38a3815fc509b92ed98a585Andrew Sapperstein !Args.hasArg(options::OPT_nostartfiles)) { 2594d6eaacbb9eb56763d38a3815fc509b92ed98a585Andrew Sapperstein if (!Args.hasArg(options::OPT_shared)) { 2595d6eaacbb9eb56763d38a3815fc509b92ed98a585Andrew Sapperstein CmdArgs.push_back(Args.MakeArgString(getToolChain().GetFilePath(C, "crt1.o"))); 2596d6eaacbb9eb56763d38a3815fc509b92ed98a585Andrew Sapperstein CmdArgs.push_back(Args.MakeArgString(getToolChain().GetFilePath(C, "crti.o"))); 2597d6eaacbb9eb56763d38a3815fc509b92ed98a585Andrew Sapperstein CmdArgs.push_back(Args.MakeArgString(getToolChain().GetFilePath(C, "crtbegin.o"))); 2598d6eaacbb9eb56763d38a3815fc509b92ed98a585Andrew Sapperstein } else { 2599d6eaacbb9eb56763d38a3815fc509b92ed98a585Andrew Sapperstein CmdArgs.push_back(Args.MakeArgString(getToolChain().GetFilePath(C, "crti.o"))); 2600d6eaacbb9eb56763d38a3815fc509b92ed98a585Andrew Sapperstein CmdArgs.push_back(Args.MakeArgString(getToolChain().GetFilePath(C, "crtbeginS.o"))); 2601d6eaacbb9eb56763d38a3815fc509b92ed98a585Andrew Sapperstein } 2602d6eaacbb9eb56763d38a3815fc509b92ed98a585Andrew Sapperstein } 2603d6eaacbb9eb56763d38a3815fc509b92ed98a585Andrew Sapperstein 2604d6eaacbb9eb56763d38a3815fc509b92ed98a585Andrew Sapperstein Args.AddAllArgs(CmdArgs, options::OPT_L); 2605d6eaacbb9eb56763d38a3815fc509b92ed98a585Andrew Sapperstein Args.AddAllArgs(CmdArgs, options::OPT_T_Group); 2606d6eaacbb9eb56763d38a3815fc509b92ed98a585Andrew Sapperstein Args.AddAllArgs(CmdArgs, options::OPT_e); 2607d6eaacbb9eb56763d38a3815fc509b92ed98a585Andrew Sapperstein 26086ba612efffba42bec102ac58a1540496158f747eAndrew Sapperstein for (InputInfoList::const_iterator 26096ba612efffba42bec102ac58a1540496158f747eAndrew Sapperstein it = Inputs.begin(), ie = Inputs.end(); it != ie; ++it) { 2610d6eaacbb9eb56763d38a3815fc509b92ed98a585Andrew Sapperstein const InputInfo &II = *it; 2611d6eaacbb9eb56763d38a3815fc509b92ed98a585Andrew Sapperstein 2612d6eaacbb9eb56763d38a3815fc509b92ed98a585Andrew Sapperstein // Don't try to pass LLVM inputs to a generic gcc. 2613d6eaacbb9eb56763d38a3815fc509b92ed98a585Andrew Sapperstein if (II.getType() == types::TY_LLVMBC) 2614d6eaacbb9eb56763d38a3815fc509b92ed98a585Andrew Sapperstein D.Diag(clang::diag::err_drv_no_linker_llvm_support) 2615d6eaacbb9eb56763d38a3815fc509b92ed98a585Andrew Sapperstein << getToolChain().getTripleString(); 2616d6eaacbb9eb56763d38a3815fc509b92ed98a585Andrew Sapperstein 2617d6eaacbb9eb56763d38a3815fc509b92ed98a585Andrew Sapperstein if (II.isPipe()) 2618d6eaacbb9eb56763d38a3815fc509b92ed98a585Andrew Sapperstein CmdArgs.push_back("-"); 2619d6eaacbb9eb56763d38a3815fc509b92ed98a585Andrew Sapperstein else if (II.isFilename()) 2620d6eaacbb9eb56763d38a3815fc509b92ed98a585Andrew Sapperstein CmdArgs.push_back(II.getFilename()); 2621d6eaacbb9eb56763d38a3815fc509b92ed98a585Andrew Sapperstein else 2622d6eaacbb9eb56763d38a3815fc509b92ed98a585Andrew Sapperstein II.getInputArg().renderAsInput(Args, CmdArgs); 2623d6eaacbb9eb56763d38a3815fc509b92ed98a585Andrew Sapperstein } 2624d6eaacbb9eb56763d38a3815fc509b92ed98a585Andrew Sapperstein 2625d6eaacbb9eb56763d38a3815fc509b92ed98a585Andrew Sapperstein if (!Args.hasArg(options::OPT_nostdlib) && 2626d6eaacbb9eb56763d38a3815fc509b92ed98a585Andrew Sapperstein !Args.hasArg(options::OPT_nodefaultlibs)) { 2627d6eaacbb9eb56763d38a3815fc509b92ed98a585Andrew Sapperstein // FIXME: For some reason GCC passes -lgcc and -lgcc_s before adding 2628d6eaacbb9eb56763d38a3815fc509b92ed98a585Andrew Sapperstein // the default system libraries. Just mimic this for now. 26296ba612efffba42bec102ac58a1540496158f747eAndrew Sapperstein CmdArgs.push_back("-lgcc"); 26306ba612efffba42bec102ac58a1540496158f747eAndrew Sapperstein if (D.CCCIsCXX) 2631d6eaacbb9eb56763d38a3815fc509b92ed98a585Andrew Sapperstein CmdArgs.push_back("-lstdc++"); 2632d6eaacbb9eb56763d38a3815fc509b92ed98a585Andrew Sapperstein if (Args.hasArg(options::OPT_static)) { 2633d6eaacbb9eb56763d38a3815fc509b92ed98a585Andrew Sapperstein CmdArgs.push_back("-lgcc_eh"); 2634d6eaacbb9eb56763d38a3815fc509b92ed98a585Andrew Sapperstein } else { 2635d6eaacbb9eb56763d38a3815fc509b92ed98a585Andrew Sapperstein CmdArgs.push_back("--as-needed"); 2636d6eaacbb9eb56763d38a3815fc509b92ed98a585Andrew Sapperstein CmdArgs.push_back("-lgcc_s"); 2637d6eaacbb9eb56763d38a3815fc509b92ed98a585Andrew Sapperstein CmdArgs.push_back("--no-as-needed"); 2638d6eaacbb9eb56763d38a3815fc509b92ed98a585Andrew Sapperstein } 2639d6eaacbb9eb56763d38a3815fc509b92ed98a585Andrew Sapperstein 2640d6eaacbb9eb56763d38a3815fc509b92ed98a585Andrew Sapperstein if (Args.hasArg(options::OPT_pthread)) 2641d6eaacbb9eb56763d38a3815fc509b92ed98a585Andrew Sapperstein CmdArgs.push_back("-lpthread"); 2642d6eaacbb9eb56763d38a3815fc509b92ed98a585Andrew Sapperstein CmdArgs.push_back("-lc"); 2643d6eaacbb9eb56763d38a3815fc509b92ed98a585Andrew Sapperstein 2644d6eaacbb9eb56763d38a3815fc509b92ed98a585Andrew Sapperstein CmdArgs.push_back("-lgcc"); 2645d6eaacbb9eb56763d38a3815fc509b92ed98a585Andrew Sapperstein if (Args.hasArg(options::OPT_static)) { 2646d6eaacbb9eb56763d38a3815fc509b92ed98a585Andrew Sapperstein CmdArgs.push_back("-lgcc_eh"); 2647d6eaacbb9eb56763d38a3815fc509b92ed98a585Andrew Sapperstein } else { 2648d6eaacbb9eb56763d38a3815fc509b92ed98a585Andrew Sapperstein CmdArgs.push_back("--as-needed"); 2649d6eaacbb9eb56763d38a3815fc509b92ed98a585Andrew Sapperstein CmdArgs.push_back("-lgcc_s"); 26506ba612efffba42bec102ac58a1540496158f747eAndrew Sapperstein CmdArgs.push_back("--no-as-needed"); 26516ba612efffba42bec102ac58a1540496158f747eAndrew Sapperstein } 2652d6eaacbb9eb56763d38a3815fc509b92ed98a585Andrew Sapperstein } 2653d6eaacbb9eb56763d38a3815fc509b92ed98a585Andrew Sapperstein 2654d6eaacbb9eb56763d38a3815fc509b92ed98a585Andrew Sapperstein if (!Args.hasArg(options::OPT_nostdlib) && 2655d6eaacbb9eb56763d38a3815fc509b92ed98a585Andrew Sapperstein !Args.hasArg(options::OPT_nostartfiles)) { 2656d6eaacbb9eb56763d38a3815fc509b92ed98a585Andrew Sapperstein if (!Args.hasArg(options::OPT_shared)) 2657d6eaacbb9eb56763d38a3815fc509b92ed98a585Andrew Sapperstein CmdArgs.push_back(Args.MakeArgString(getToolChain().GetFilePath(C, "crtend.o"))); 2658d6eaacbb9eb56763d38a3815fc509b92ed98a585Andrew Sapperstein else 2659d6eaacbb9eb56763d38a3815fc509b92ed98a585Andrew Sapperstein CmdArgs.push_back(Args.MakeArgString(getToolChain().GetFilePath(C, "crtendS.o"))); 2660d6eaacbb9eb56763d38a3815fc509b92ed98a585Andrew Sapperstein CmdArgs.push_back(Args.MakeArgString(getToolChain().GetFilePath(C, "crtn.o"))); 2661d6eaacbb9eb56763d38a3815fc509b92ed98a585Andrew Sapperstein } 2662d6eaacbb9eb56763d38a3815fc509b92ed98a585Andrew Sapperstein 2663d6eaacbb9eb56763d38a3815fc509b92ed98a585Andrew Sapperstein const char *Exec = 2664d6eaacbb9eb56763d38a3815fc509b92ed98a585Andrew Sapperstein Args.MakeArgString(getToolChain().GetProgramPath(C, "ld")); 2665d6eaacbb9eb56763d38a3815fc509b92ed98a585Andrew Sapperstein Dest.addCommand(new Command(JA, *this, Exec, CmdArgs)); 2666d6eaacbb9eb56763d38a3815fc509b92ed98a585Andrew Sapperstein} 2667d6eaacbb9eb56763d38a3815fc509b92ed98a585Andrew Sapperstein 2668d6eaacbb9eb56763d38a3815fc509b92ed98a585Andrew Sapperstein/// DragonFly Tools 2669d6eaacbb9eb56763d38a3815fc509b92ed98a585Andrew Sapperstein 2670d6eaacbb9eb56763d38a3815fc509b92ed98a585Andrew Sapperstein// For now, DragonFly Assemble does just about the same as for 26716ba612efffba42bec102ac58a1540496158f747eAndrew Sapperstein// FreeBSD, but this may change soon. 26726ba612efffba42bec102ac58a1540496158f747eAndrew Sappersteinvoid dragonfly::Assemble::ConstructJob(Compilation &C, const JobAction &JA, 2673d6eaacbb9eb56763d38a3815fc509b92ed98a585Andrew Sapperstein Job &Dest, const InputInfo &Output, 2674d6eaacbb9eb56763d38a3815fc509b92ed98a585Andrew Sapperstein const InputInfoList &Inputs, 2675d6eaacbb9eb56763d38a3815fc509b92ed98a585Andrew Sapperstein const ArgList &Args, 2676d6eaacbb9eb56763d38a3815fc509b92ed98a585Andrew Sapperstein const char *LinkingOutput) const { 2677d6eaacbb9eb56763d38a3815fc509b92ed98a585Andrew Sapperstein ArgStringList CmdArgs; 2678d6eaacbb9eb56763d38a3815fc509b92ed98a585Andrew Sapperstein 2679d6eaacbb9eb56763d38a3815fc509b92ed98a585Andrew Sapperstein // When building 32-bit code on DragonFly/pc64, we have to explicitly 2680d6eaacbb9eb56763d38a3815fc509b92ed98a585Andrew Sapperstein // instruct as in the base system to assemble 32-bit code. 2681d6eaacbb9eb56763d38a3815fc509b92ed98a585Andrew Sapperstein if (getToolChain().getArchName() == "i386") 2682d6eaacbb9eb56763d38a3815fc509b92ed98a585Andrew Sapperstein CmdArgs.push_back("--32"); 2683d6eaacbb9eb56763d38a3815fc509b92ed98a585Andrew Sapperstein 2684d6eaacbb9eb56763d38a3815fc509b92ed98a585Andrew Sapperstein Args.AddAllArgValues(CmdArgs, options::OPT_Wa_COMMA, 2685d6eaacbb9eb56763d38a3815fc509b92ed98a585Andrew Sapperstein options::OPT_Xassembler); 2686d6eaacbb9eb56763d38a3815fc509b92ed98a585Andrew Sapperstein 2687d6eaacbb9eb56763d38a3815fc509b92ed98a585Andrew Sapperstein CmdArgs.push_back("-o"); 2688d6eaacbb9eb56763d38a3815fc509b92ed98a585Andrew Sapperstein if (Output.isPipe()) 2689d6eaacbb9eb56763d38a3815fc509b92ed98a585Andrew Sapperstein CmdArgs.push_back("-"); 2690d6eaacbb9eb56763d38a3815fc509b92ed98a585Andrew Sapperstein else 2691d6eaacbb9eb56763d38a3815fc509b92ed98a585Andrew Sapperstein CmdArgs.push_back(Output.getFilename()); 26926ba612efffba42bec102ac58a1540496158f747eAndrew Sapperstein 26936ba612efffba42bec102ac58a1540496158f747eAndrew Sapperstein for (InputInfoList::const_iterator 2694d6eaacbb9eb56763d38a3815fc509b92ed98a585Andrew Sapperstein it = Inputs.begin(), ie = Inputs.end(); it != ie; ++it) { 2695d6eaacbb9eb56763d38a3815fc509b92ed98a585Andrew Sapperstein const InputInfo &II = *it; 2696d6eaacbb9eb56763d38a3815fc509b92ed98a585Andrew Sapperstein if (II.isPipe()) 2697d6eaacbb9eb56763d38a3815fc509b92ed98a585Andrew Sapperstein CmdArgs.push_back("-"); 2698d6eaacbb9eb56763d38a3815fc509b92ed98a585Andrew Sapperstein else 2699d6eaacbb9eb56763d38a3815fc509b92ed98a585Andrew Sapperstein CmdArgs.push_back(II.getFilename()); 2700d6eaacbb9eb56763d38a3815fc509b92ed98a585Andrew Sapperstein } 2701d6eaacbb9eb56763d38a3815fc509b92ed98a585Andrew Sapperstein 2702d6eaacbb9eb56763d38a3815fc509b92ed98a585Andrew Sapperstein const char *Exec = 2703d6eaacbb9eb56763d38a3815fc509b92ed98a585Andrew Sapperstein Args.MakeArgString(getToolChain().GetProgramPath(C, "as")); 2704d6eaacbb9eb56763d38a3815fc509b92ed98a585Andrew Sapperstein Dest.addCommand(new Command(JA, *this, Exec, CmdArgs)); 2705d6eaacbb9eb56763d38a3815fc509b92ed98a585Andrew Sapperstein} 2706d6eaacbb9eb56763d38a3815fc509b92ed98a585Andrew Sapperstein 2707d6eaacbb9eb56763d38a3815fc509b92ed98a585Andrew Sappersteinvoid dragonfly::Link::ConstructJob(Compilation &C, const JobAction &JA, 2708d6eaacbb9eb56763d38a3815fc509b92ed98a585Andrew Sapperstein Job &Dest, const InputInfo &Output, 2709d6eaacbb9eb56763d38a3815fc509b92ed98a585Andrew Sapperstein const InputInfoList &Inputs, 2710d6eaacbb9eb56763d38a3815fc509b92ed98a585Andrew Sapperstein const ArgList &Args, 2711d6eaacbb9eb56763d38a3815fc509b92ed98a585Andrew Sapperstein const char *LinkingOutput) const { 2712d6eaacbb9eb56763d38a3815fc509b92ed98a585Andrew Sapperstein const Driver &D = getToolChain().getHost().getDriver(); 27136ba612efffba42bec102ac58a1540496158f747eAndrew Sapperstein ArgStringList CmdArgs; 27146ba612efffba42bec102ac58a1540496158f747eAndrew Sapperstein 2715d6eaacbb9eb56763d38a3815fc509b92ed98a585Andrew Sapperstein if (Args.hasArg(options::OPT_static)) { 2716d6eaacbb9eb56763d38a3815fc509b92ed98a585Andrew Sapperstein CmdArgs.push_back("-Bstatic"); 2717d6eaacbb9eb56763d38a3815fc509b92ed98a585Andrew Sapperstein } else { 2718d6eaacbb9eb56763d38a3815fc509b92ed98a585Andrew Sapperstein if (Args.hasArg(options::OPT_shared)) 2719d6eaacbb9eb56763d38a3815fc509b92ed98a585Andrew Sapperstein CmdArgs.push_back("-Bshareable"); 2720d6eaacbb9eb56763d38a3815fc509b92ed98a585Andrew Sapperstein else { 2721d6eaacbb9eb56763d38a3815fc509b92ed98a585Andrew Sapperstein CmdArgs.push_back("-dynamic-linker"); 2722d6eaacbb9eb56763d38a3815fc509b92ed98a585Andrew Sapperstein CmdArgs.push_back("/usr/libexec/ld-elf.so.2"); 2723d6eaacbb9eb56763d38a3815fc509b92ed98a585Andrew Sapperstein } 2724d6eaacbb9eb56763d38a3815fc509b92ed98a585Andrew Sapperstein } 2725d6eaacbb9eb56763d38a3815fc509b92ed98a585Andrew Sapperstein 2726d6eaacbb9eb56763d38a3815fc509b92ed98a585Andrew Sapperstein // When building 32-bit code on DragonFly/pc64, we have to explicitly 2727d6eaacbb9eb56763d38a3815fc509b92ed98a585Andrew Sapperstein // instruct ld in the base system to link 32-bit code. 2728d6eaacbb9eb56763d38a3815fc509b92ed98a585Andrew Sapperstein if (getToolChain().getArchName() == "i386") { 2729d6eaacbb9eb56763d38a3815fc509b92ed98a585Andrew Sapperstein CmdArgs.push_back("-m"); 2730d6eaacbb9eb56763d38a3815fc509b92ed98a585Andrew Sapperstein CmdArgs.push_back("elf_i386"); 2731d6eaacbb9eb56763d38a3815fc509b92ed98a585Andrew Sapperstein } 2732d6eaacbb9eb56763d38a3815fc509b92ed98a585Andrew Sapperstein 2733d6eaacbb9eb56763d38a3815fc509b92ed98a585Andrew Sapperstein if (Output.isPipe()) { 27346ba612efffba42bec102ac58a1540496158f747eAndrew Sapperstein CmdArgs.push_back("-o"); 27356ba612efffba42bec102ac58a1540496158f747eAndrew Sapperstein CmdArgs.push_back("-"); 2736d6eaacbb9eb56763d38a3815fc509b92ed98a585Andrew Sapperstein } else if (Output.isFilename()) { 2737d6eaacbb9eb56763d38a3815fc509b92ed98a585Andrew Sapperstein CmdArgs.push_back("-o"); 2738d6eaacbb9eb56763d38a3815fc509b92ed98a585Andrew Sapperstein CmdArgs.push_back(Output.getFilename()); 2739d6eaacbb9eb56763d38a3815fc509b92ed98a585Andrew Sapperstein } else { 2740d6eaacbb9eb56763d38a3815fc509b92ed98a585Andrew Sapperstein assert(Output.isNothing() && "Invalid output."); 2741d6eaacbb9eb56763d38a3815fc509b92ed98a585Andrew Sapperstein } 2742d6eaacbb9eb56763d38a3815fc509b92ed98a585Andrew Sapperstein 2743d6eaacbb9eb56763d38a3815fc509b92ed98a585Andrew Sapperstein if (!Args.hasArg(options::OPT_nostdlib) && 2744d6eaacbb9eb56763d38a3815fc509b92ed98a585Andrew Sapperstein !Args.hasArg(options::OPT_nostartfiles)) { 2745d6eaacbb9eb56763d38a3815fc509b92ed98a585Andrew Sapperstein if (!Args.hasArg(options::OPT_shared)) { 2746d6eaacbb9eb56763d38a3815fc509b92ed98a585Andrew Sapperstein CmdArgs.push_back(Args.MakeArgString(getToolChain().GetFilePath(C, "crt1.o"))); 2747d6eaacbb9eb56763d38a3815fc509b92ed98a585Andrew Sapperstein CmdArgs.push_back(Args.MakeArgString(getToolChain().GetFilePath(C, "crti.o"))); 2748d6eaacbb9eb56763d38a3815fc509b92ed98a585Andrew Sapperstein CmdArgs.push_back(Args.MakeArgString(getToolChain().GetFilePath(C, "crtbegin.o"))); 2749d6eaacbb9eb56763d38a3815fc509b92ed98a585Andrew Sapperstein } else { 2750d6eaacbb9eb56763d38a3815fc509b92ed98a585Andrew Sapperstein CmdArgs.push_back(Args.MakeArgString(getToolChain().GetFilePath(C, "crti.o"))); 2751d6eaacbb9eb56763d38a3815fc509b92ed98a585Andrew Sapperstein CmdArgs.push_back(Args.MakeArgString(getToolChain().GetFilePath(C, "crtbeginS.o"))); 2752d6eaacbb9eb56763d38a3815fc509b92ed98a585Andrew Sapperstein } 2753d6eaacbb9eb56763d38a3815fc509b92ed98a585Andrew Sapperstein } 2754d6eaacbb9eb56763d38a3815fc509b92ed98a585Andrew Sapperstein 27556ba612efffba42bec102ac58a1540496158f747eAndrew Sapperstein Args.AddAllArgs(CmdArgs, options::OPT_L); 27566ba612efffba42bec102ac58a1540496158f747eAndrew Sapperstein Args.AddAllArgs(CmdArgs, options::OPT_T_Group); 2757d6eaacbb9eb56763d38a3815fc509b92ed98a585Andrew Sapperstein Args.AddAllArgs(CmdArgs, options::OPT_e); 2758d6eaacbb9eb56763d38a3815fc509b92ed98a585Andrew Sapperstein 2759d6eaacbb9eb56763d38a3815fc509b92ed98a585Andrew Sapperstein for (InputInfoList::const_iterator 2760d6eaacbb9eb56763d38a3815fc509b92ed98a585Andrew Sapperstein it = Inputs.begin(), ie = Inputs.end(); it != ie; ++it) { 2761d6eaacbb9eb56763d38a3815fc509b92ed98a585Andrew Sapperstein const InputInfo &II = *it; 2762d6eaacbb9eb56763d38a3815fc509b92ed98a585Andrew Sapperstein 2763d6eaacbb9eb56763d38a3815fc509b92ed98a585Andrew Sapperstein // Don't try to pass LLVM inputs to a generic gcc. 2764d6eaacbb9eb56763d38a3815fc509b92ed98a585Andrew Sapperstein if (II.getType() == types::TY_LLVMBC) 2765d6eaacbb9eb56763d38a3815fc509b92ed98a585Andrew Sapperstein D.Diag(clang::diag::err_drv_no_linker_llvm_support) 2766d6eaacbb9eb56763d38a3815fc509b92ed98a585Andrew Sapperstein << getToolChain().getTripleString(); 2767d6eaacbb9eb56763d38a3815fc509b92ed98a585Andrew Sapperstein 2768d6eaacbb9eb56763d38a3815fc509b92ed98a585Andrew Sapperstein if (II.isPipe()) 2769d6eaacbb9eb56763d38a3815fc509b92ed98a585Andrew Sapperstein CmdArgs.push_back("-"); 2770d6eaacbb9eb56763d38a3815fc509b92ed98a585Andrew Sapperstein else if (II.isFilename()) 2771d6eaacbb9eb56763d38a3815fc509b92ed98a585Andrew Sapperstein CmdArgs.push_back(II.getFilename()); 2772d6eaacbb9eb56763d38a3815fc509b92ed98a585Andrew Sapperstein else 2773d6eaacbb9eb56763d38a3815fc509b92ed98a585Andrew Sapperstein II.getInputArg().renderAsInput(Args, CmdArgs); 2774d6eaacbb9eb56763d38a3815fc509b92ed98a585Andrew Sapperstein } 2775d6eaacbb9eb56763d38a3815fc509b92ed98a585Andrew Sapperstein 27766ba612efffba42bec102ac58a1540496158f747eAndrew Sapperstein if (!Args.hasArg(options::OPT_nostdlib) && 27776ba612efffba42bec102ac58a1540496158f747eAndrew Sapperstein !Args.hasArg(options::OPT_nodefaultlibs)) { 2778d6eaacbb9eb56763d38a3815fc509b92ed98a585Andrew Sapperstein // FIXME: GCC passes on -lgcc, -lgcc_pic and a whole lot of 2779d6eaacbb9eb56763d38a3815fc509b92ed98a585Andrew Sapperstein // rpaths 2780d6eaacbb9eb56763d38a3815fc509b92ed98a585Andrew Sapperstein CmdArgs.push_back("-L/usr/lib/gcc41"); 2781d6eaacbb9eb56763d38a3815fc509b92ed98a585Andrew Sapperstein 2782d6eaacbb9eb56763d38a3815fc509b92ed98a585Andrew Sapperstein if (!Args.hasArg(options::OPT_static)) { 2783d6eaacbb9eb56763d38a3815fc509b92ed98a585Andrew Sapperstein CmdArgs.push_back("-rpath"); 2784d6eaacbb9eb56763d38a3815fc509b92ed98a585Andrew Sapperstein CmdArgs.push_back("/usr/lib/gcc41"); 2785d6eaacbb9eb56763d38a3815fc509b92ed98a585Andrew Sapperstein 2786d6eaacbb9eb56763d38a3815fc509b92ed98a585Andrew Sapperstein CmdArgs.push_back("-rpath-link"); 2787d6eaacbb9eb56763d38a3815fc509b92ed98a585Andrew Sapperstein CmdArgs.push_back("/usr/lib/gcc41"); 2788d6eaacbb9eb56763d38a3815fc509b92ed98a585Andrew Sapperstein 2789d6eaacbb9eb56763d38a3815fc509b92ed98a585Andrew Sapperstein CmdArgs.push_back("-rpath"); 2790d6eaacbb9eb56763d38a3815fc509b92ed98a585Andrew Sapperstein CmdArgs.push_back("/usr/lib"); 2791d6eaacbb9eb56763d38a3815fc509b92ed98a585Andrew Sapperstein 2792d6eaacbb9eb56763d38a3815fc509b92ed98a585Andrew Sapperstein CmdArgs.push_back("-rpath-link"); 2793d6eaacbb9eb56763d38a3815fc509b92ed98a585Andrew Sapperstein CmdArgs.push_back("/usr/lib"); 2794d6eaacbb9eb56763d38a3815fc509b92ed98a585Andrew Sapperstein } 2795d6eaacbb9eb56763d38a3815fc509b92ed98a585Andrew Sapperstein 27966ba612efffba42bec102ac58a1540496158f747eAndrew Sapperstein if (Args.hasArg(options::OPT_shared)) { 27976ba612efffba42bec102ac58a1540496158f747eAndrew Sapperstein CmdArgs.push_back("-lgcc_pic"); 2798d6eaacbb9eb56763d38a3815fc509b92ed98a585Andrew Sapperstein } else { 2799d6eaacbb9eb56763d38a3815fc509b92ed98a585Andrew Sapperstein CmdArgs.push_back("-lgcc"); 2800d6eaacbb9eb56763d38a3815fc509b92ed98a585Andrew Sapperstein } 2801d6eaacbb9eb56763d38a3815fc509b92ed98a585Andrew Sapperstein 2802d6eaacbb9eb56763d38a3815fc509b92ed98a585Andrew Sapperstein 2803d6eaacbb9eb56763d38a3815fc509b92ed98a585Andrew Sapperstein if (Args.hasArg(options::OPT_pthread)) 2804d6eaacbb9eb56763d38a3815fc509b92ed98a585Andrew Sapperstein CmdArgs.push_back("-lpthread"); 2805d6eaacbb9eb56763d38a3815fc509b92ed98a585Andrew Sapperstein 2806d6eaacbb9eb56763d38a3815fc509b92ed98a585Andrew Sapperstein if (!Args.hasArg(options::OPT_nolibc)) { 2807d6eaacbb9eb56763d38a3815fc509b92ed98a585Andrew Sapperstein CmdArgs.push_back("-lc"); 2808d6eaacbb9eb56763d38a3815fc509b92ed98a585Andrew Sapperstein } 2809d6eaacbb9eb56763d38a3815fc509b92ed98a585Andrew Sapperstein 2810d6eaacbb9eb56763d38a3815fc509b92ed98a585Andrew Sapperstein if (Args.hasArg(options::OPT_shared)) { 2811d6eaacbb9eb56763d38a3815fc509b92ed98a585Andrew Sapperstein CmdArgs.push_back("-lgcc_pic"); 2812d6eaacbb9eb56763d38a3815fc509b92ed98a585Andrew Sapperstein } else { 2813d6eaacbb9eb56763d38a3815fc509b92ed98a585Andrew Sapperstein CmdArgs.push_back("-lgcc"); 2814d6eaacbb9eb56763d38a3815fc509b92ed98a585Andrew Sapperstein } 2815d6eaacbb9eb56763d38a3815fc509b92ed98a585Andrew Sapperstein } 28166ba612efffba42bec102ac58a1540496158f747eAndrew Sapperstein 28176ba612efffba42bec102ac58a1540496158f747eAndrew Sapperstein if (!Args.hasArg(options::OPT_nostdlib) && 2818d6eaacbb9eb56763d38a3815fc509b92ed98a585Andrew Sapperstein !Args.hasArg(options::OPT_nostartfiles)) { 2819d6eaacbb9eb56763d38a3815fc509b92ed98a585Andrew Sapperstein if (!Args.hasArg(options::OPT_shared)) 2820d6eaacbb9eb56763d38a3815fc509b92ed98a585Andrew Sapperstein CmdArgs.push_back(Args.MakeArgString(getToolChain().GetFilePath(C, "crtend.o"))); 2821d6eaacbb9eb56763d38a3815fc509b92ed98a585Andrew Sapperstein else 2822d6eaacbb9eb56763d38a3815fc509b92ed98a585Andrew Sapperstein CmdArgs.push_back(Args.MakeArgString(getToolChain().GetFilePath(C, "crtendS.o"))); 2823d6eaacbb9eb56763d38a3815fc509b92ed98a585Andrew Sapperstein CmdArgs.push_back(Args.MakeArgString(getToolChain().GetFilePath(C, "crtn.o"))); 2824d6eaacbb9eb56763d38a3815fc509b92ed98a585Andrew Sapperstein } 2825d6eaacbb9eb56763d38a3815fc509b92ed98a585Andrew Sapperstein 2826d6eaacbb9eb56763d38a3815fc509b92ed98a585Andrew Sapperstein const char *Exec = 2827d6eaacbb9eb56763d38a3815fc509b92ed98a585Andrew Sapperstein Args.MakeArgString(getToolChain().GetProgramPath(C, "ld")); 2828d6eaacbb9eb56763d38a3815fc509b92ed98a585Andrew Sapperstein Dest.addCommand(new Command(JA, *this, Exec, CmdArgs)); 2829d6eaacbb9eb56763d38a3815fc509b92ed98a585Andrew Sapperstein} 2830d6eaacbb9eb56763d38a3815fc509b92ed98a585Andrew Sapperstein