Tools.cpp revision 55d3f7ae512875a1d6402943c3a619633feb2a18
147ac7d27c44bd64a7d0fc03d4babc196cf2b8230Daniel Dunbar//===--- Tools.cpp - Tools Implementations ------------------------------*-===// 247ac7d27c44bd64a7d0fc03d4babc196cf2b8230Daniel Dunbar// 347ac7d27c44bd64a7d0fc03d4babc196cf2b8230Daniel Dunbar// The LLVM Compiler Infrastructure 447ac7d27c44bd64a7d0fc03d4babc196cf2b8230Daniel Dunbar// 547ac7d27c44bd64a7d0fc03d4babc196cf2b8230Daniel Dunbar// This file is distributed under the University of Illinois Open Source 647ac7d27c44bd64a7d0fc03d4babc196cf2b8230Daniel Dunbar// License. See LICENSE.TXT for details. 747ac7d27c44bd64a7d0fc03d4babc196cf2b8230Daniel Dunbar// 847ac7d27c44bd64a7d0fc03d4babc196cf2b8230Daniel Dunbar//===----------------------------------------------------------------------===// 947ac7d27c44bd64a7d0fc03d4babc196cf2b8230Daniel Dunbar 1047ac7d27c44bd64a7d0fc03d4babc196cf2b8230Daniel Dunbar#include "Tools.h" 1147ac7d27c44bd64a7d0fc03d4babc196cf2b8230Daniel Dunbar 121d46033f760ba5fd266ce59fe391fac473f04f52Daniel Dunbar#include "clang/Driver/Action.h" 13871adcf4e41285e3f4c3b62eaa1b2e05b60b92daDaniel Dunbar#include "clang/Driver/Arg.h" 14b488c1dac8e53206f07103d794a62a3f5012c0f4Daniel Dunbar#include "clang/Driver/ArgList.h" 151d46033f760ba5fd266ce59fe391fac473f04f52Daniel Dunbar#include "clang/Driver/Driver.h" // FIXME: Remove? 161d46033f760ba5fd266ce59fe391fac473f04f52Daniel Dunbar#include "clang/Driver/DriverDiagnostic.h" // FIXME: Remove? 17871adcf4e41285e3f4c3b62eaa1b2e05b60b92daDaniel Dunbar#include "clang/Driver/Compilation.h" 18871adcf4e41285e3f4c3b62eaa1b2e05b60b92daDaniel Dunbar#include "clang/Driver/Job.h" 19b488c1dac8e53206f07103d794a62a3f5012c0f4Daniel Dunbar#include "clang/Driver/HostInfo.h" 20b488c1dac8e53206f07103d794a62a3f5012c0f4Daniel Dunbar#include "clang/Driver/Option.h" 21b488c1dac8e53206f07103d794a62a3f5012c0f4Daniel Dunbar#include "clang/Driver/ToolChain.h" 22871adcf4e41285e3f4c3b62eaa1b2e05b60b92daDaniel Dunbar#include "clang/Driver/Util.h" 23871adcf4e41285e3f4c3b62eaa1b2e05b60b92daDaniel Dunbar 24881376467c46c5c6cc16fa6790271c2c22e1d4f1Daniel Dunbar#include "llvm/ADT/SmallString.h" 2555d3f7ae512875a1d6402943c3a619633feb2a18Douglas Gregor#include "llvm/ADT/StringSwitch.h" 265b750fe6189a41937ff2b080a983c95ea273769fDaniel Dunbar#include "llvm/ADT/Twine.h" 2702633b541b04ad5ffc1c70f4c2feeeb13e607057Daniel Dunbar#include "llvm/Support/Format.h" 2802633b541b04ad5ffc1c70f4c2feeeb13e607057Daniel Dunbar#include "llvm/Support/raw_ostream.h" 29871adcf4e41285e3f4c3b62eaa1b2e05b60b92daDaniel Dunbar 30871adcf4e41285e3f4c3b62eaa1b2e05b60b92daDaniel Dunbar#include "InputInfo.h" 3102633b541b04ad5ffc1c70f4c2feeeb13e607057Daniel Dunbar#include "ToolChains.h" 32871adcf4e41285e3f4c3b62eaa1b2e05b60b92daDaniel Dunbar 3347ac7d27c44bd64a7d0fc03d4babc196cf2b8230Daniel Dunbarusing namespace clang::driver; 3447ac7d27c44bd64a7d0fc03d4babc196cf2b8230Daniel Dunbarusing namespace clang::driver::tools; 3547ac7d27c44bd64a7d0fc03d4babc196cf2b8230Daniel Dunbar 36868bd0aa9281929ef50d2e9a8c82a036906f53f5Daniel Dunbarstatic const char *MakeFormattedString(const ArgList &Args, 37868bd0aa9281929ef50d2e9a8c82a036906f53f5Daniel Dunbar const llvm::format_object_base &Fmt) { 38881376467c46c5c6cc16fa6790271c2c22e1d4f1Daniel Dunbar llvm::SmallString<256> Str; 39881376467c46c5c6cc16fa6790271c2c22e1d4f1Daniel Dunbar llvm::raw_svector_ostream(Str) << Fmt; 40881376467c46c5c6cc16fa6790271c2c22e1d4f1Daniel Dunbar return Args.MakeArgString(Str.str()); 41868bd0aa9281929ef50d2e9a8c82a036906f53f5Daniel Dunbar} 42868bd0aa9281929ef50d2e9a8c82a036906f53f5Daniel Dunbar 4388a3d6cf5ebab81614f89ba48a8d89023270637aDaniel Dunbar/// CheckPreprocessingOptions - Perform some validation of preprocessing 4488a3d6cf5ebab81614f89ba48a8d89023270637aDaniel Dunbar/// arguments that is shared with gcc. 4588a3d6cf5ebab81614f89ba48a8d89023270637aDaniel Dunbarstatic void CheckPreprocessingOptions(const Driver &D, const ArgList &Args) { 4688a3d6cf5ebab81614f89ba48a8d89023270637aDaniel Dunbar if (Arg *A = Args.getLastArg(options::OPT_C, options::OPT_CC)) 4788a3d6cf5ebab81614f89ba48a8d89023270637aDaniel Dunbar if (!Args.hasArg(options::OPT_E)) 4888a3d6cf5ebab81614f89ba48a8d89023270637aDaniel Dunbar D.Diag(clang::diag::err_drv_argument_only_allowed_with) 4988a3d6cf5ebab81614f89ba48a8d89023270637aDaniel Dunbar << A->getAsString(Args) << "-E"; 5088a3d6cf5ebab81614f89ba48a8d89023270637aDaniel Dunbar} 5188a3d6cf5ebab81614f89ba48a8d89023270637aDaniel Dunbar 52e2fd66418eca3d70cf6b62087d745d0c5181db69Daniel Dunbar/// CheckCodeGenerationOptions - Perform some validation of code generation 53e2fd66418eca3d70cf6b62087d745d0c5181db69Daniel Dunbar/// arguments that is shared with gcc. 54e2fd66418eca3d70cf6b62087d745d0c5181db69Daniel Dunbarstatic void CheckCodeGenerationOptions(const Driver &D, const ArgList &Args) { 55e2fd66418eca3d70cf6b62087d745d0c5181db69Daniel Dunbar // In gcc, only ARM checks this, but it seems reasonable to check universally. 56e2fd66418eca3d70cf6b62087d745d0c5181db69Daniel Dunbar if (Args.hasArg(options::OPT_static)) 57e2fd66418eca3d70cf6b62087d745d0c5181db69Daniel Dunbar if (const Arg *A = Args.getLastArg(options::OPT_dynamic, 58e2fd66418eca3d70cf6b62087d745d0c5181db69Daniel Dunbar options::OPT_mdynamic_no_pic)) 59e2fd66418eca3d70cf6b62087d745d0c5181db69Daniel Dunbar D.Diag(clang::diag::err_drv_argument_not_allowed_with) 60e2fd66418eca3d70cf6b62087d745d0c5181db69Daniel Dunbar << A->getAsString(Args) << "-static"; 61e2fd66418eca3d70cf6b62087d745d0c5181db69Daniel Dunbar} 62e2fd66418eca3d70cf6b62087d745d0c5181db69Daniel Dunbar 631eb4433ac451dc16f4133a88af2d002ac26c58efMike Stumpvoid Clang::AddPreprocessingOptions(const Driver &D, 64df91ef3d6c55692a0236f67b6c6b134a3bf84098Douglas Gregor const ArgList &Args, 65c21c485b4fb58ef5d55cf3e523263dd824a2ace4Daniel Dunbar ArgStringList &CmdArgs, 66c21c485b4fb58ef5d55cf3e523263dd824a2ace4Daniel Dunbar const InputInfo &Output, 67c21c485b4fb58ef5d55cf3e523263dd824a2ace4Daniel Dunbar const InputInfoList &Inputs) const { 68c21c485b4fb58ef5d55cf3e523263dd824a2ace4Daniel Dunbar Arg *A; 693a183d3d46426d8719031553131b8928f50aa606Daniel Dunbar 7088a3d6cf5ebab81614f89ba48a8d89023270637aDaniel Dunbar CheckPreprocessingOptions(D, Args); 7188a3d6cf5ebab81614f89ba48a8d89023270637aDaniel Dunbar 7288a3d6cf5ebab81614f89ba48a8d89023270637aDaniel Dunbar Args.AddLastArg(CmdArgs, options::OPT_C); 7388a3d6cf5ebab81614f89ba48a8d89023270637aDaniel Dunbar Args.AddLastArg(CmdArgs, options::OPT_CC); 743a183d3d46426d8719031553131b8928f50aa606Daniel Dunbar 753a183d3d46426d8719031553131b8928f50aa606Daniel Dunbar // Handle dependency file generation. 76c21c485b4fb58ef5d55cf3e523263dd824a2ace4Daniel Dunbar if ((A = Args.getLastArg(options::OPT_M)) || 77c21c485b4fb58ef5d55cf3e523263dd824a2ace4Daniel Dunbar (A = Args.getLastArg(options::OPT_MM)) || 78c21c485b4fb58ef5d55cf3e523263dd824a2ace4Daniel Dunbar (A = Args.getLastArg(options::OPT_MD)) || 79c21c485b4fb58ef5d55cf3e523263dd824a2ace4Daniel Dunbar (A = Args.getLastArg(options::OPT_MMD))) { 80c21c485b4fb58ef5d55cf3e523263dd824a2ace4Daniel Dunbar // Determine the output location. 81c21c485b4fb58ef5d55cf3e523263dd824a2ace4Daniel Dunbar const char *DepFile; 82c21c485b4fb58ef5d55cf3e523263dd824a2ace4Daniel Dunbar if (Output.getType() == types::TY_Dependencies) { 83c21c485b4fb58ef5d55cf3e523263dd824a2ace4Daniel Dunbar if (Output.isPipe()) 84c21c485b4fb58ef5d55cf3e523263dd824a2ace4Daniel Dunbar DepFile = "-"; 85c21c485b4fb58ef5d55cf3e523263dd824a2ace4Daniel Dunbar else 86c21c485b4fb58ef5d55cf3e523263dd824a2ace4Daniel Dunbar DepFile = Output.getFilename(); 87c21c485b4fb58ef5d55cf3e523263dd824a2ace4Daniel Dunbar } else if (Arg *MF = Args.getLastArg(options::OPT_MF)) { 88c21c485b4fb58ef5d55cf3e523263dd824a2ace4Daniel Dunbar DepFile = MF->getValue(Args); 89c21c485b4fb58ef5d55cf3e523263dd824a2ace4Daniel Dunbar } else if (A->getOption().getId() == options::OPT_M || 90c21c485b4fb58ef5d55cf3e523263dd824a2ace4Daniel Dunbar A->getOption().getId() == options::OPT_MM) { 91c21c485b4fb58ef5d55cf3e523263dd824a2ace4Daniel Dunbar DepFile = "-"; 92c21c485b4fb58ef5d55cf3e523263dd824a2ace4Daniel Dunbar } else { 93c21c485b4fb58ef5d55cf3e523263dd824a2ace4Daniel Dunbar DepFile = darwin::CC1::getDependencyFileName(Args, Inputs); 94c21c485b4fb58ef5d55cf3e523263dd824a2ace4Daniel Dunbar } 95c21c485b4fb58ef5d55cf3e523263dd824a2ace4Daniel Dunbar CmdArgs.push_back("-dependency-file"); 96c21c485b4fb58ef5d55cf3e523263dd824a2ace4Daniel Dunbar CmdArgs.push_back(DepFile); 97c21c485b4fb58ef5d55cf3e523263dd824a2ace4Daniel Dunbar 98c21c485b4fb58ef5d55cf3e523263dd824a2ace4Daniel Dunbar // Add an -MT option if the user didn't specify their own. 99e0be8b1729d8978de433d229c065830b95d0ae68Daniel Dunbar // 100c21c485b4fb58ef5d55cf3e523263dd824a2ace4Daniel Dunbar // FIXME: This should use -MQ, when we support it. 101c21c485b4fb58ef5d55cf3e523263dd824a2ace4Daniel Dunbar if (!Args.hasArg(options::OPT_MT) && !Args.hasArg(options::OPT_MQ)) { 102c21c485b4fb58ef5d55cf3e523263dd824a2ace4Daniel Dunbar const char *DepTarget; 103c21c485b4fb58ef5d55cf3e523263dd824a2ace4Daniel Dunbar 104c21c485b4fb58ef5d55cf3e523263dd824a2ace4Daniel Dunbar // If user provided -o, that is the dependency target, except 105c21c485b4fb58ef5d55cf3e523263dd824a2ace4Daniel Dunbar // when we are only generating a dependency file. 106c21c485b4fb58ef5d55cf3e523263dd824a2ace4Daniel Dunbar Arg *OutputOpt = Args.getLastArg(options::OPT_o); 107c21c485b4fb58ef5d55cf3e523263dd824a2ace4Daniel Dunbar if (OutputOpt && Output.getType() != types::TY_Dependencies) { 108c21c485b4fb58ef5d55cf3e523263dd824a2ace4Daniel Dunbar DepTarget = OutputOpt->getValue(Args); 109c21c485b4fb58ef5d55cf3e523263dd824a2ace4Daniel Dunbar } else { 110c21c485b4fb58ef5d55cf3e523263dd824a2ace4Daniel Dunbar // Otherwise derive from the base input. 111c21c485b4fb58ef5d55cf3e523263dd824a2ace4Daniel Dunbar // 112c21c485b4fb58ef5d55cf3e523263dd824a2ace4Daniel Dunbar // FIXME: This should use the computed output file location. 113c21c485b4fb58ef5d55cf3e523263dd824a2ace4Daniel Dunbar llvm::sys::Path P(Inputs[0].getBaseInput()); 114c21c485b4fb58ef5d55cf3e523263dd824a2ace4Daniel Dunbar 115c21c485b4fb58ef5d55cf3e523263dd824a2ace4Daniel Dunbar P.eraseSuffix(); 116c21c485b4fb58ef5d55cf3e523263dd824a2ace4Daniel Dunbar P.appendSuffix("o"); 117881376467c46c5c6cc16fa6790271c2c22e1d4f1Daniel Dunbar DepTarget = Args.MakeArgString(P.getLast()); 118c21c485b4fb58ef5d55cf3e523263dd824a2ace4Daniel Dunbar } 119c21c485b4fb58ef5d55cf3e523263dd824a2ace4Daniel Dunbar 120c21c485b4fb58ef5d55cf3e523263dd824a2ace4Daniel Dunbar CmdArgs.push_back("-MT"); 121c21c485b4fb58ef5d55cf3e523263dd824a2ace4Daniel Dunbar CmdArgs.push_back(DepTarget); 122c21c485b4fb58ef5d55cf3e523263dd824a2ace4Daniel Dunbar } 123c21c485b4fb58ef5d55cf3e523263dd824a2ace4Daniel Dunbar 124c21c485b4fb58ef5d55cf3e523263dd824a2ace4Daniel Dunbar if (A->getOption().getId() == options::OPT_M || 125c21c485b4fb58ef5d55cf3e523263dd824a2ace4Daniel Dunbar A->getOption().getId() == options::OPT_MD) 126c21c485b4fb58ef5d55cf3e523263dd824a2ace4Daniel Dunbar CmdArgs.push_back("-sys-header-deps"); 127c21c485b4fb58ef5d55cf3e523263dd824a2ace4Daniel Dunbar } 128c21c485b4fb58ef5d55cf3e523263dd824a2ace4Daniel Dunbar 129c21c485b4fb58ef5d55cf3e523263dd824a2ace4Daniel Dunbar Args.AddLastArg(CmdArgs, options::OPT_MP); 130c21c485b4fb58ef5d55cf3e523263dd824a2ace4Daniel Dunbar Args.AddAllArgs(CmdArgs, options::OPT_MT); 131c21c485b4fb58ef5d55cf3e523263dd824a2ace4Daniel Dunbar 132df91ef3d6c55692a0236f67b6c6b134a3bf84098Douglas Gregor // Add -i* options, and automatically translate to 133df91ef3d6c55692a0236f67b6c6b134a3bf84098Douglas Gregor // -include-pch/-include-pth for transparent PCH support. It's 134df91ef3d6c55692a0236f67b6c6b134a3bf84098Douglas Gregor // wonky, but we include looking for .gch so we can support seamless 135df91ef3d6c55692a0236f67b6c6b134a3bf84098Douglas Gregor // replacement into a build system already set up to be generating 136df91ef3d6c55692a0236f67b6c6b134a3bf84098Douglas Gregor // .gch files. 137e0be8b1729d8978de433d229c065830b95d0ae68Daniel Dunbar // 138e0be8b1729d8978de433d229c065830b95d0ae68Daniel Dunbar // FIXME: Use iterator. 139c21c485b4fb58ef5d55cf3e523263dd824a2ace4Daniel Dunbar for (ArgList::const_iterator 140c21c485b4fb58ef5d55cf3e523263dd824a2ace4Daniel Dunbar it = Args.begin(), ie = Args.end(); it != ie; ++it) { 141c21c485b4fb58ef5d55cf3e523263dd824a2ace4Daniel Dunbar const Arg *A = *it; 142c21c485b4fb58ef5d55cf3e523263dd824a2ace4Daniel Dunbar if (!A->getOption().matches(options::OPT_clang_i_Group)) 143c21c485b4fb58ef5d55cf3e523263dd824a2ace4Daniel Dunbar continue; 144c21c485b4fb58ef5d55cf3e523263dd824a2ace4Daniel Dunbar 145c21c485b4fb58ef5d55cf3e523263dd824a2ace4Daniel Dunbar if (A->getOption().matches(options::OPT_include)) { 1460ebd9321ba380471010341f24c874f46f56e7581Daniel Dunbar // Use PCH if the user requested it, except for C++ (for now). 1470ebd9321ba380471010341f24c874f46f56e7581Daniel Dunbar bool UsePCH = D.CCCUsePCH; 1480ebd9321ba380471010341f24c874f46f56e7581Daniel Dunbar if (types::isCXX(Inputs[0].getType())) 1490ebd9321ba380471010341f24c874f46f56e7581Daniel Dunbar UsePCH = false; 1500ebd9321ba380471010341f24c874f46f56e7581Daniel Dunbar 151c21c485b4fb58ef5d55cf3e523263dd824a2ace4Daniel Dunbar bool FoundPTH = false; 152df91ef3d6c55692a0236f67b6c6b134a3bf84098Douglas Gregor bool FoundPCH = false; 153c21c485b4fb58ef5d55cf3e523263dd824a2ace4Daniel Dunbar llvm::sys::Path P(A->getValue(Args)); 1540ebd9321ba380471010341f24c874f46f56e7581Daniel Dunbar if (UsePCH) { 155df91ef3d6c55692a0236f67b6c6b134a3bf84098Douglas Gregor P.appendSuffix("pch"); 156c21c485b4fb58ef5d55cf3e523263dd824a2ace4Daniel Dunbar if (P.exists()) 157df91ef3d6c55692a0236f67b6c6b134a3bf84098Douglas Gregor FoundPCH = true; 1581eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump else 159df91ef3d6c55692a0236f67b6c6b134a3bf84098Douglas Gregor P.eraseSuffix(); 160df91ef3d6c55692a0236f67b6c6b134a3bf84098Douglas Gregor } 161df91ef3d6c55692a0236f67b6c6b134a3bf84098Douglas Gregor 162df91ef3d6c55692a0236f67b6c6b134a3bf84098Douglas Gregor if (!FoundPCH) { 163df91ef3d6c55692a0236f67b6c6b134a3bf84098Douglas Gregor P.appendSuffix("pth"); 1641eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump if (P.exists()) 165c21c485b4fb58ef5d55cf3e523263dd824a2ace4Daniel Dunbar FoundPTH = true; 166df91ef3d6c55692a0236f67b6c6b134a3bf84098Douglas Gregor else 167df91ef3d6c55692a0236f67b6c6b134a3bf84098Douglas Gregor P.eraseSuffix(); 1681eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump } 1691eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump 170df91ef3d6c55692a0236f67b6c6b134a3bf84098Douglas Gregor if (!FoundPCH && !FoundPTH) { 171df91ef3d6c55692a0236f67b6c6b134a3bf84098Douglas Gregor P.appendSuffix("gch"); 172df91ef3d6c55692a0236f67b6c6b134a3bf84098Douglas Gregor if (P.exists()) { 1730ebd9321ba380471010341f24c874f46f56e7581Daniel Dunbar FoundPCH = UsePCH; 1740ebd9321ba380471010341f24c874f46f56e7581Daniel Dunbar FoundPTH = !UsePCH; 175df91ef3d6c55692a0236f67b6c6b134a3bf84098Douglas Gregor } 1761eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump else 177df91ef3d6c55692a0236f67b6c6b134a3bf84098Douglas Gregor P.eraseSuffix(); 178c21c485b4fb58ef5d55cf3e523263dd824a2ace4Daniel Dunbar } 179c21c485b4fb58ef5d55cf3e523263dd824a2ace4Daniel Dunbar 180df91ef3d6c55692a0236f67b6c6b134a3bf84098Douglas Gregor if (FoundPCH || FoundPTH) { 181c21c485b4fb58ef5d55cf3e523263dd824a2ace4Daniel Dunbar A->claim(); 1820ebd9321ba380471010341f24c874f46f56e7581Daniel Dunbar if (UsePCH) 183df91ef3d6c55692a0236f67b6c6b134a3bf84098Douglas Gregor CmdArgs.push_back("-include-pch"); 184df91ef3d6c55692a0236f67b6c6b134a3bf84098Douglas Gregor else 185df91ef3d6c55692a0236f67b6c6b134a3bf84098Douglas Gregor CmdArgs.push_back("-include-pth"); 186881376467c46c5c6cc16fa6790271c2c22e1d4f1Daniel Dunbar CmdArgs.push_back(Args.MakeArgString(P.str())); 187c21c485b4fb58ef5d55cf3e523263dd824a2ace4Daniel Dunbar continue; 188c21c485b4fb58ef5d55cf3e523263dd824a2ace4Daniel Dunbar } 189c21c485b4fb58ef5d55cf3e523263dd824a2ace4Daniel Dunbar } 190c21c485b4fb58ef5d55cf3e523263dd824a2ace4Daniel Dunbar 191c21c485b4fb58ef5d55cf3e523263dd824a2ace4Daniel Dunbar // Not translated, render as usual. 192c21c485b4fb58ef5d55cf3e523263dd824a2ace4Daniel Dunbar A->claim(); 193c21c485b4fb58ef5d55cf3e523263dd824a2ace4Daniel Dunbar A->render(Args, CmdArgs); 194c21c485b4fb58ef5d55cf3e523263dd824a2ace4Daniel Dunbar } 195c21c485b4fb58ef5d55cf3e523263dd824a2ace4Daniel Dunbar 196c21c485b4fb58ef5d55cf3e523263dd824a2ace4Daniel Dunbar Args.AddAllArgs(CmdArgs, options::OPT_D, options::OPT_U); 197c21c485b4fb58ef5d55cf3e523263dd824a2ace4Daniel Dunbar Args.AddAllArgs(CmdArgs, options::OPT_I_Group, options::OPT_F); 198c21c485b4fb58ef5d55cf3e523263dd824a2ace4Daniel Dunbar 199c21c485b4fb58ef5d55cf3e523263dd824a2ace4Daniel Dunbar // Add -Wp, and -Xassembler if using the preprocessor. 200c21c485b4fb58ef5d55cf3e523263dd824a2ace4Daniel Dunbar 201c21c485b4fb58ef5d55cf3e523263dd824a2ace4Daniel Dunbar // FIXME: There is a very unfortunate problem here, some troubled 202c21c485b4fb58ef5d55cf3e523263dd824a2ace4Daniel Dunbar // souls abuse -Wp, to pass preprocessor options in gcc syntax. To 203c21c485b4fb58ef5d55cf3e523263dd824a2ace4Daniel Dunbar // really support that we would have to parse and then translate 204c21c485b4fb58ef5d55cf3e523263dd824a2ace4Daniel Dunbar // those options. :( 205c21c485b4fb58ef5d55cf3e523263dd824a2ace4Daniel Dunbar Args.AddAllArgValues(CmdArgs, options::OPT_Wp_COMMA, 206c21c485b4fb58ef5d55cf3e523263dd824a2ace4Daniel Dunbar options::OPT_Xpreprocessor); 207c21c485b4fb58ef5d55cf3e523263dd824a2ace4Daniel Dunbar} 208c21c485b4fb58ef5d55cf3e523263dd824a2ace4Daniel Dunbar 209728a512753d85a6ccaae34e81385c8665c2de0e1Daniel Dunbar/// getARMTargetCPU - Get the (LLVM) name of the ARM cpu we are targetting. 210728a512753d85a6ccaae34e81385c8665c2de0e1Daniel Dunbar// 211728a512753d85a6ccaae34e81385c8665c2de0e1Daniel Dunbar// FIXME: tblgen this. 212b163ef7e7a5d904ef0962a7c38c460be083c4d63Daniel Dunbarstatic llvm::StringRef getARMTargetCPU(const ArgList &Args) { 213728a512753d85a6ccaae34e81385c8665c2de0e1Daniel Dunbar // FIXME: Warn on inconsistent use of -mcpu and -march. 214b163ef7e7a5d904ef0962a7c38c460be083c4d63Daniel Dunbar 215b163ef7e7a5d904ef0962a7c38c460be083c4d63Daniel Dunbar // If we have -mcpu=, use that. 216b163ef7e7a5d904ef0962a7c38c460be083c4d63Daniel Dunbar if (Arg *A = Args.getLastArg(options::OPT_mcpu_EQ)) 217b163ef7e7a5d904ef0962a7c38c460be083c4d63Daniel Dunbar return A->getValue(Args); 218b163ef7e7a5d904ef0962a7c38c460be083c4d63Daniel Dunbar 219b163ef7e7a5d904ef0962a7c38c460be083c4d63Daniel Dunbar // Otherwise, if we have -march= choose the base CPU for that arch. 220b163ef7e7a5d904ef0962a7c38c460be083c4d63Daniel Dunbar if (Arg *A = Args.getLastArg(options::OPT_march_EQ)) { 221b163ef7e7a5d904ef0962a7c38c460be083c4d63Daniel Dunbar llvm::StringRef MArch = A->getValue(Args); 222b163ef7e7a5d904ef0962a7c38c460be083c4d63Daniel Dunbar 223b163ef7e7a5d904ef0962a7c38c460be083c4d63Daniel Dunbar if (MArch == "armv2" || MArch == "armv2a") 224b163ef7e7a5d904ef0962a7c38c460be083c4d63Daniel Dunbar return "arm2"; 225b163ef7e7a5d904ef0962a7c38c460be083c4d63Daniel Dunbar if (MArch == "armv3") 226b163ef7e7a5d904ef0962a7c38c460be083c4d63Daniel Dunbar return "arm6"; 227b163ef7e7a5d904ef0962a7c38c460be083c4d63Daniel Dunbar if (MArch == "armv3m") 228b163ef7e7a5d904ef0962a7c38c460be083c4d63Daniel Dunbar return "arm7m"; 229b163ef7e7a5d904ef0962a7c38c460be083c4d63Daniel Dunbar if (MArch == "armv4" || MArch == "armv4t") 230b163ef7e7a5d904ef0962a7c38c460be083c4d63Daniel Dunbar return "arm7tdmi"; 231b163ef7e7a5d904ef0962a7c38c460be083c4d63Daniel Dunbar if (MArch == "armv5" || MArch == "armv5t") 232b163ef7e7a5d904ef0962a7c38c460be083c4d63Daniel Dunbar return "arm10tdmi"; 233b163ef7e7a5d904ef0962a7c38c460be083c4d63Daniel Dunbar if (MArch == "armv5e" || MArch == "armv5te") 234b163ef7e7a5d904ef0962a7c38c460be083c4d63Daniel Dunbar return "arm1026ejs"; 235b163ef7e7a5d904ef0962a7c38c460be083c4d63Daniel Dunbar if (MArch == "armv5tej") 236b163ef7e7a5d904ef0962a7c38c460be083c4d63Daniel Dunbar return "arm926ejs"; 237b163ef7e7a5d904ef0962a7c38c460be083c4d63Daniel Dunbar if (MArch == "armv6" || MArch == "armv6k") 238b163ef7e7a5d904ef0962a7c38c460be083c4d63Daniel Dunbar return "arm1136jf-s"; 239b163ef7e7a5d904ef0962a7c38c460be083c4d63Daniel Dunbar if (MArch == "armv6j") 240b163ef7e7a5d904ef0962a7c38c460be083c4d63Daniel Dunbar return "arm1136j-s"; 241b163ef7e7a5d904ef0962a7c38c460be083c4d63Daniel Dunbar if (MArch == "armv6z" || MArch == "armv6zk") 242b163ef7e7a5d904ef0962a7c38c460be083c4d63Daniel Dunbar return "arm1176jzf-s"; 243b163ef7e7a5d904ef0962a7c38c460be083c4d63Daniel Dunbar if (MArch == "armv6t2") 244b163ef7e7a5d904ef0962a7c38c460be083c4d63Daniel Dunbar return "arm1156t2-s"; 245b163ef7e7a5d904ef0962a7c38c460be083c4d63Daniel Dunbar if (MArch == "armv7" || MArch == "armv7a" || MArch == "armv7-a") 246b163ef7e7a5d904ef0962a7c38c460be083c4d63Daniel Dunbar return "cortex-a8"; 247b163ef7e7a5d904ef0962a7c38c460be083c4d63Daniel Dunbar if (MArch == "armv7r" || MArch == "armv7-r") 248b163ef7e7a5d904ef0962a7c38c460be083c4d63Daniel Dunbar return "cortex-r4"; 249b163ef7e7a5d904ef0962a7c38c460be083c4d63Daniel Dunbar if (MArch == "armv7m" || MArch == "armv7-m") 250b163ef7e7a5d904ef0962a7c38c460be083c4d63Daniel Dunbar return "cortex-m3"; 251b163ef7e7a5d904ef0962a7c38c460be083c4d63Daniel Dunbar if (MArch == "ep9312") 252b163ef7e7a5d904ef0962a7c38c460be083c4d63Daniel Dunbar return "ep9312"; 253b163ef7e7a5d904ef0962a7c38c460be083c4d63Daniel Dunbar if (MArch == "iwmmxt") 254b163ef7e7a5d904ef0962a7c38c460be083c4d63Daniel Dunbar return "iwmmxt"; 255b163ef7e7a5d904ef0962a7c38c460be083c4d63Daniel Dunbar if (MArch == "xscale") 256b163ef7e7a5d904ef0962a7c38c460be083c4d63Daniel Dunbar return "xscale"; 257b163ef7e7a5d904ef0962a7c38c460be083c4d63Daniel Dunbar } 258b163ef7e7a5d904ef0962a7c38c460be083c4d63Daniel Dunbar 259b163ef7e7a5d904ef0962a7c38c460be083c4d63Daniel Dunbar // Otherwise return the most base CPU LLVM supports. 260b163ef7e7a5d904ef0962a7c38c460be083c4d63Daniel Dunbar return "arm7tdmi"; 261b163ef7e7a5d904ef0962a7c38c460be083c4d63Daniel Dunbar} 262b163ef7e7a5d904ef0962a7c38c460be083c4d63Daniel Dunbar 2631d65e4be6f22f7e4b4974efbaef92fa3454f1ec8Daniel Dunbar/// getLLVMArchSuffixForARM - Get the LLVM arch name to use for a particular 264728a512753d85a6ccaae34e81385c8665c2de0e1Daniel Dunbar/// CPU. 265728a512753d85a6ccaae34e81385c8665c2de0e1Daniel Dunbar// 266728a512753d85a6ccaae34e81385c8665c2de0e1Daniel Dunbar// FIXME: This is redundant with -mcpu, why does LLVM use this. 267728a512753d85a6ccaae34e81385c8665c2de0e1Daniel Dunbar// FIXME: tblgen this, or kill it! 2681d65e4be6f22f7e4b4974efbaef92fa3454f1ec8Daniel Dunbarstatic const char *getLLVMArchSuffixForARM(llvm::StringRef CPU) { 269728a512753d85a6ccaae34e81385c8665c2de0e1Daniel Dunbar if (CPU == "arm7tdmi" || CPU == "arm7tdmi-s" || CPU == "arm710t" || 270728a512753d85a6ccaae34e81385c8665c2de0e1Daniel Dunbar CPU == "arm720t" || CPU == "arm9" || CPU == "arm9tdmi" || 271728a512753d85a6ccaae34e81385c8665c2de0e1Daniel Dunbar CPU == "arm920" || CPU == "arm920t" || CPU == "arm922t" || 272728a512753d85a6ccaae34e81385c8665c2de0e1Daniel Dunbar CPU == "arm940t" || CPU == "ep9312") 2731d65e4be6f22f7e4b4974efbaef92fa3454f1ec8Daniel Dunbar return "v4t"; 274728a512753d85a6ccaae34e81385c8665c2de0e1Daniel Dunbar 275728a512753d85a6ccaae34e81385c8665c2de0e1Daniel Dunbar if (CPU == "arm10tdmi" || CPU == "arm1020t") 2761d65e4be6f22f7e4b4974efbaef92fa3454f1ec8Daniel Dunbar return "v5"; 277728a512753d85a6ccaae34e81385c8665c2de0e1Daniel Dunbar 278728a512753d85a6ccaae34e81385c8665c2de0e1Daniel Dunbar if (CPU == "arm9e" || CPU == "arm926ej-s" || CPU == "arm946e-s" || 279728a512753d85a6ccaae34e81385c8665c2de0e1Daniel Dunbar CPU == "arm966e-s" || CPU == "arm968e-s" || CPU == "arm10e" || 280728a512753d85a6ccaae34e81385c8665c2de0e1Daniel Dunbar CPU == "arm1020e" || CPU == "arm1022e" || CPU == "xscale" || 281728a512753d85a6ccaae34e81385c8665c2de0e1Daniel Dunbar CPU == "iwmmxt") 2821d65e4be6f22f7e4b4974efbaef92fa3454f1ec8Daniel Dunbar return "v5e"; 283728a512753d85a6ccaae34e81385c8665c2de0e1Daniel Dunbar 284728a512753d85a6ccaae34e81385c8665c2de0e1Daniel Dunbar if (CPU == "arm1136j-s" || CPU == "arm1136jf-s" || CPU == "arm1176jz-s" || 285728a512753d85a6ccaae34e81385c8665c2de0e1Daniel Dunbar CPU == "arm1176jzf-s" || CPU == "mpcorenovfp" || CPU == "mpcore") 2861d65e4be6f22f7e4b4974efbaef92fa3454f1ec8Daniel Dunbar return "v6"; 287728a512753d85a6ccaae34e81385c8665c2de0e1Daniel Dunbar 288728a512753d85a6ccaae34e81385c8665c2de0e1Daniel Dunbar if (CPU == "arm1156t2-s" || CPU == "arm1156t2f-s") 2891d65e4be6f22f7e4b4974efbaef92fa3454f1ec8Daniel Dunbar return "v6t2"; 290728a512753d85a6ccaae34e81385c8665c2de0e1Daniel Dunbar 291728a512753d85a6ccaae34e81385c8665c2de0e1Daniel Dunbar if (CPU == "cortex-a8" || CPU == "cortex-a9") 2921d65e4be6f22f7e4b4974efbaef92fa3454f1ec8Daniel Dunbar return "v7"; 293728a512753d85a6ccaae34e81385c8665c2de0e1Daniel Dunbar 2941d65e4be6f22f7e4b4974efbaef92fa3454f1ec8Daniel Dunbar return ""; 295728a512753d85a6ccaae34e81385c8665c2de0e1Daniel Dunbar} 296728a512753d85a6ccaae34e81385c8665c2de0e1Daniel Dunbar 297728a512753d85a6ccaae34e81385c8665c2de0e1Daniel Dunbar/// getLLVMTriple - Get the LLVM triple to use for a particular toolchain, which 298728a512753d85a6ccaae34e81385c8665c2de0e1Daniel Dunbar/// may depend on command line arguments. 299728a512753d85a6ccaae34e81385c8665c2de0e1Daniel Dunbarstatic std::string getLLVMTriple(const ToolChain &TC, const ArgList &Args) { 300728a512753d85a6ccaae34e81385c8665c2de0e1Daniel Dunbar switch (TC.getTriple().getArch()) { 301728a512753d85a6ccaae34e81385c8665c2de0e1Daniel Dunbar default: 302728a512753d85a6ccaae34e81385c8665c2de0e1Daniel Dunbar return TC.getTripleString(); 303728a512753d85a6ccaae34e81385c8665c2de0e1Daniel Dunbar 304728a512753d85a6ccaae34e81385c8665c2de0e1Daniel Dunbar case llvm::Triple::arm: 305728a512753d85a6ccaae34e81385c8665c2de0e1Daniel Dunbar case llvm::Triple::thumb: { 306f4aa4f61de7d364364dc94bbf83ff71448a11327Daniel Dunbar // FIXME: Factor into subclasses. 307728a512753d85a6ccaae34e81385c8665c2de0e1Daniel Dunbar llvm::Triple Triple = TC.getTriple(); 308f4aa4f61de7d364364dc94bbf83ff71448a11327Daniel Dunbar 309f4aa4f61de7d364364dc94bbf83ff71448a11327Daniel Dunbar // Thumb2 is the default for V7 on Darwin. 310f4aa4f61de7d364364dc94bbf83ff71448a11327Daniel Dunbar // 311f4aa4f61de7d364364dc94bbf83ff71448a11327Daniel Dunbar // FIXME: Thumb should just be another -target-feaure, not in the triple. 312f4aa4f61de7d364364dc94bbf83ff71448a11327Daniel Dunbar llvm::StringRef Suffix = getLLVMArchSuffixForARM(getARMTargetCPU(Args)); 313f4aa4f61de7d364364dc94bbf83ff71448a11327Daniel Dunbar bool ThumbDefault = 314f4aa4f61de7d364364dc94bbf83ff71448a11327Daniel Dunbar (Suffix == "v7" && TC.getTriple().getOS() == llvm::Triple::Darwin); 3151d65e4be6f22f7e4b4974efbaef92fa3454f1ec8Daniel Dunbar std::string ArchName = "arm"; 316f4aa4f61de7d364364dc94bbf83ff71448a11327Daniel Dunbar if (Args.hasFlag(options::OPT_mthumb, options::OPT_mno_thumb, ThumbDefault)) 317f4aa4f61de7d364364dc94bbf83ff71448a11327Daniel Dunbar ArchName = "thumb"; 318f4aa4f61de7d364364dc94bbf83ff71448a11327Daniel Dunbar Triple.setArchName(ArchName + Suffix.str()); 319f4aa4f61de7d364364dc94bbf83ff71448a11327Daniel Dunbar 320728a512753d85a6ccaae34e81385c8665c2de0e1Daniel Dunbar return Triple.getTriple(); 321728a512753d85a6ccaae34e81385c8665c2de0e1Daniel Dunbar } 322728a512753d85a6ccaae34e81385c8665c2de0e1Daniel Dunbar } 323728a512753d85a6ccaae34e81385c8665c2de0e1Daniel Dunbar} 324728a512753d85a6ccaae34e81385c8665c2de0e1Daniel Dunbar 325b163ef7e7a5d904ef0962a7c38c460be083c4d63Daniel Dunbarvoid Clang::AddARMTargetArgs(const ArgList &Args, 326b163ef7e7a5d904ef0962a7c38c460be083c4d63Daniel Dunbar ArgStringList &CmdArgs) const { 327cbd1933f83e2332b2d7add10459f80cc4e7eb7bfDaniel Dunbar const Driver &D = getToolChain().getHost().getDriver(); 328cbd1933f83e2332b2d7add10459f80cc4e7eb7bfDaniel Dunbar 3292030d8f46b4226fa99e59389e3ca856a79c27e9aDaniel Dunbar // Select the ABI to use. 3302030d8f46b4226fa99e59389e3ca856a79c27e9aDaniel Dunbar // 3312030d8f46b4226fa99e59389e3ca856a79c27e9aDaniel Dunbar // FIXME: Support -meabi. 3322030d8f46b4226fa99e59389e3ca856a79c27e9aDaniel Dunbar const char *ABIName = 0; 3332030d8f46b4226fa99e59389e3ca856a79c27e9aDaniel Dunbar if (Arg *A = Args.getLastArg(options::OPT_mabi_EQ)) { 3342030d8f46b4226fa99e59389e3ca856a79c27e9aDaniel Dunbar ABIName = A->getValue(Args); 3352030d8f46b4226fa99e59389e3ca856a79c27e9aDaniel Dunbar } else { 3362030d8f46b4226fa99e59389e3ca856a79c27e9aDaniel Dunbar // Select the default based on the platform. 3372030d8f46b4226fa99e59389e3ca856a79c27e9aDaniel Dunbar switch (getToolChain().getTriple().getOS()) { 3382030d8f46b4226fa99e59389e3ca856a79c27e9aDaniel Dunbar // FIXME: Is this right for non-Darwin and non-Linux? 3392030d8f46b4226fa99e59389e3ca856a79c27e9aDaniel Dunbar default: 3402030d8f46b4226fa99e59389e3ca856a79c27e9aDaniel Dunbar ABIName = "aapcs"; 3412030d8f46b4226fa99e59389e3ca856a79c27e9aDaniel Dunbar break; 3422030d8f46b4226fa99e59389e3ca856a79c27e9aDaniel Dunbar 3432030d8f46b4226fa99e59389e3ca856a79c27e9aDaniel Dunbar case llvm::Triple::Darwin: 3442030d8f46b4226fa99e59389e3ca856a79c27e9aDaniel Dunbar ABIName = "apcs-gnu"; 3452030d8f46b4226fa99e59389e3ca856a79c27e9aDaniel Dunbar break; 3462030d8f46b4226fa99e59389e3ca856a79c27e9aDaniel Dunbar 3472030d8f46b4226fa99e59389e3ca856a79c27e9aDaniel Dunbar case llvm::Triple::Linux: 3482030d8f46b4226fa99e59389e3ca856a79c27e9aDaniel Dunbar ABIName = "aapcs-linux"; 3492030d8f46b4226fa99e59389e3ca856a79c27e9aDaniel Dunbar break; 3502030d8f46b4226fa99e59389e3ca856a79c27e9aDaniel Dunbar } 3512030d8f46b4226fa99e59389e3ca856a79c27e9aDaniel Dunbar } 3522030d8f46b4226fa99e59389e3ca856a79c27e9aDaniel Dunbar CmdArgs.push_back("-target-abi"); 3532030d8f46b4226fa99e59389e3ca856a79c27e9aDaniel Dunbar CmdArgs.push_back(ABIName); 3542030d8f46b4226fa99e59389e3ca856a79c27e9aDaniel Dunbar 355b163ef7e7a5d904ef0962a7c38c460be083c4d63Daniel Dunbar // Set the CPU based on -march= and -mcpu=. 356b163ef7e7a5d904ef0962a7c38c460be083c4d63Daniel Dunbar CmdArgs.push_back(Args.MakeArgString("-mcpu=" + getARMTargetCPU(Args))); 357b163ef7e7a5d904ef0962a7c38c460be083c4d63Daniel Dunbar 358cbd1933f83e2332b2d7add10459f80cc4e7eb7bfDaniel Dunbar // Select the float ABI as determined by -msoft-float, -mhard-float, and 359cbd1933f83e2332b2d7add10459f80cc4e7eb7bfDaniel Dunbar // -mfloat-abi=. 360cbd1933f83e2332b2d7add10459f80cc4e7eb7bfDaniel Dunbar llvm::StringRef FloatABI; 361cbd1933f83e2332b2d7add10459f80cc4e7eb7bfDaniel Dunbar if (Arg *A = Args.getLastArg(options::OPT_msoft_float, 362cbd1933f83e2332b2d7add10459f80cc4e7eb7bfDaniel Dunbar options::OPT_mhard_float, 363cbd1933f83e2332b2d7add10459f80cc4e7eb7bfDaniel Dunbar options::OPT_mfloat_abi_EQ)) { 364cbd1933f83e2332b2d7add10459f80cc4e7eb7bfDaniel Dunbar if (A->getOption().matches(options::OPT_msoft_float)) 365cbd1933f83e2332b2d7add10459f80cc4e7eb7bfDaniel Dunbar FloatABI = "soft"; 366cbd1933f83e2332b2d7add10459f80cc4e7eb7bfDaniel Dunbar else if (A->getOption().matches(options::OPT_mhard_float)) 367cbd1933f83e2332b2d7add10459f80cc4e7eb7bfDaniel Dunbar FloatABI = "hard"; 368cbd1933f83e2332b2d7add10459f80cc4e7eb7bfDaniel Dunbar else { 369cbd1933f83e2332b2d7add10459f80cc4e7eb7bfDaniel Dunbar FloatABI = A->getValue(Args); 370cbd1933f83e2332b2d7add10459f80cc4e7eb7bfDaniel Dunbar if (FloatABI != "soft" && FloatABI != "softfp" && FloatABI != "hard") { 371cbd1933f83e2332b2d7add10459f80cc4e7eb7bfDaniel Dunbar D.Diag(clang::diag::err_drv_invalid_mfloat_abi) 372cbd1933f83e2332b2d7add10459f80cc4e7eb7bfDaniel Dunbar << A->getAsString(Args); 373cbd1933f83e2332b2d7add10459f80cc4e7eb7bfDaniel Dunbar FloatABI = "soft"; 374cbd1933f83e2332b2d7add10459f80cc4e7eb7bfDaniel Dunbar } 375cbd1933f83e2332b2d7add10459f80cc4e7eb7bfDaniel Dunbar } 376cbd1933f83e2332b2d7add10459f80cc4e7eb7bfDaniel Dunbar } 377cbd1933f83e2332b2d7add10459f80cc4e7eb7bfDaniel Dunbar 378cbd1933f83e2332b2d7add10459f80cc4e7eb7bfDaniel Dunbar // If unspecified, choose the default based on the platform. 379cbd1933f83e2332b2d7add10459f80cc4e7eb7bfDaniel Dunbar if (FloatABI.empty()) { 380cbd1933f83e2332b2d7add10459f80cc4e7eb7bfDaniel Dunbar // FIXME: This is wrong for non-Darwin, we don't have a mechanism yet for 381cbd1933f83e2332b2d7add10459f80cc4e7eb7bfDaniel Dunbar // distinguishing things like linux-eabi vs linux-elf. 382cbd1933f83e2332b2d7add10459f80cc4e7eb7bfDaniel Dunbar switch (getToolChain().getTriple().getOS()) { 383cbd1933f83e2332b2d7add10459f80cc4e7eb7bfDaniel Dunbar case llvm::Triple::Darwin: { 384cbd1933f83e2332b2d7add10459f80cc4e7eb7bfDaniel Dunbar // Darwin defaults to "softfp" for v6 and v7. 385cbd1933f83e2332b2d7add10459f80cc4e7eb7bfDaniel Dunbar // 386cbd1933f83e2332b2d7add10459f80cc4e7eb7bfDaniel Dunbar // FIXME: Factor out an ARM class so we can cache the arch somewhere. 387cbd1933f83e2332b2d7add10459f80cc4e7eb7bfDaniel Dunbar llvm::StringRef ArchName = getLLVMArchSuffixForARM(getARMTargetCPU(Args)); 388cbd1933f83e2332b2d7add10459f80cc4e7eb7bfDaniel Dunbar if (ArchName.startswith("v6") || ArchName.startswith("v7")) 389cbd1933f83e2332b2d7add10459f80cc4e7eb7bfDaniel Dunbar FloatABI = "softfp"; 390cbd1933f83e2332b2d7add10459f80cc4e7eb7bfDaniel Dunbar else 391cbd1933f83e2332b2d7add10459f80cc4e7eb7bfDaniel Dunbar FloatABI = "soft"; 392cbd1933f83e2332b2d7add10459f80cc4e7eb7bfDaniel Dunbar break; 393cbd1933f83e2332b2d7add10459f80cc4e7eb7bfDaniel Dunbar } 394cbd1933f83e2332b2d7add10459f80cc4e7eb7bfDaniel Dunbar 395cbd1933f83e2332b2d7add10459f80cc4e7eb7bfDaniel Dunbar default: 396cbd1933f83e2332b2d7add10459f80cc4e7eb7bfDaniel Dunbar // Assume "soft", but warn the user we are guessing. 397cbd1933f83e2332b2d7add10459f80cc4e7eb7bfDaniel Dunbar FloatABI = "soft"; 398cbd1933f83e2332b2d7add10459f80cc4e7eb7bfDaniel Dunbar D.Diag(clang::diag::warn_drv_assuming_mfloat_abi_is) << "soft"; 399cbd1933f83e2332b2d7add10459f80cc4e7eb7bfDaniel Dunbar break; 400cbd1933f83e2332b2d7add10459f80cc4e7eb7bfDaniel Dunbar } 401cbd1933f83e2332b2d7add10459f80cc4e7eb7bfDaniel Dunbar } 402cbd1933f83e2332b2d7add10459f80cc4e7eb7bfDaniel Dunbar 403cbd1933f83e2332b2d7add10459f80cc4e7eb7bfDaniel Dunbar if (FloatABI == "soft") { 404cbd1933f83e2332b2d7add10459f80cc4e7eb7bfDaniel Dunbar // Floating point operations and argument passing are soft. 405cbd1933f83e2332b2d7add10459f80cc4e7eb7bfDaniel Dunbar // 406cbd1933f83e2332b2d7add10459f80cc4e7eb7bfDaniel Dunbar // FIXME: This changes CPP defines, we need -target-soft-float. 407cbd1933f83e2332b2d7add10459f80cc4e7eb7bfDaniel Dunbar CmdArgs.push_back("-soft-float"); 408cbd1933f83e2332b2d7add10459f80cc4e7eb7bfDaniel Dunbar CmdArgs.push_back("-float-abi=soft"); 409cbd1933f83e2332b2d7add10459f80cc4e7eb7bfDaniel Dunbar } else if (FloatABI == "softfp") { 410cbd1933f83e2332b2d7add10459f80cc4e7eb7bfDaniel Dunbar // Floating point operations are hard, but argument passing is soft. 411cbd1933f83e2332b2d7add10459f80cc4e7eb7bfDaniel Dunbar CmdArgs.push_back("-float-abi=soft"); 412cbd1933f83e2332b2d7add10459f80cc4e7eb7bfDaniel Dunbar } else { 413cbd1933f83e2332b2d7add10459f80cc4e7eb7bfDaniel Dunbar // Floating point operations and argument passing are hard. 414cbd1933f83e2332b2d7add10459f80cc4e7eb7bfDaniel Dunbar assert(FloatABI == "hard" && "Invalid float abi!"); 415cbd1933f83e2332b2d7add10459f80cc4e7eb7bfDaniel Dunbar CmdArgs.push_back("-float-abi=hard"); 416cbd1933f83e2332b2d7add10459f80cc4e7eb7bfDaniel Dunbar } 417b163ef7e7a5d904ef0962a7c38c460be083c4d63Daniel Dunbar} 418b163ef7e7a5d904ef0962a7c38c460be083c4d63Daniel Dunbar 4196acda16e9c194dcbd0dea64341e182bdb65d0f41Daniel Dunbarvoid Clang::AddX86TargetArgs(const ArgList &Args, 4206acda16e9c194dcbd0dea64341e182bdb65d0f41Daniel Dunbar ArgStringList &CmdArgs) const { 421e6ad3f9fceef0ecc422ff26754ea069a5fd18c69Daniel Dunbar // FIXME: This needs to change to use a clang-cc option, and set the attribute 422e6ad3f9fceef0ecc422ff26754ea069a5fd18c69Daniel Dunbar // on functions. 423e6ad3f9fceef0ecc422ff26754ea069a5fd18c69Daniel Dunbar if (!Args.hasFlag(options::OPT_mred_zone, 424e6ad3f9fceef0ecc422ff26754ea069a5fd18c69Daniel Dunbar options::OPT_mno_red_zone, 425e6ad3f9fceef0ecc422ff26754ea069a5fd18c69Daniel Dunbar true) || 426e6ad3f9fceef0ecc422ff26754ea069a5fd18c69Daniel Dunbar Args.hasArg(options::OPT_mkernel) || 427e6ad3f9fceef0ecc422ff26754ea069a5fd18c69Daniel Dunbar Args.hasArg(options::OPT_fapple_kext)) 428e6ad3f9fceef0ecc422ff26754ea069a5fd18c69Daniel Dunbar CmdArgs.push_back("--disable-red-zone"); 429e6ad3f9fceef0ecc422ff26754ea069a5fd18c69Daniel Dunbar 430e6ad3f9fceef0ecc422ff26754ea069a5fd18c69Daniel Dunbar // FIXME: This needs to change to use a clang-cc option, and set the attribute 431e6ad3f9fceef0ecc422ff26754ea069a5fd18c69Daniel Dunbar // on functions. 432e6ad3f9fceef0ecc422ff26754ea069a5fd18c69Daniel Dunbar if (Args.hasFlag(options::OPT_msoft_float, 433e6ad3f9fceef0ecc422ff26754ea069a5fd18c69Daniel Dunbar options::OPT_mno_soft_float, 434e6ad3f9fceef0ecc422ff26754ea069a5fd18c69Daniel Dunbar false)) 435e6ad3f9fceef0ecc422ff26754ea069a5fd18c69Daniel Dunbar CmdArgs.push_back("--no-implicit-float"); 436e6ad3f9fceef0ecc422ff26754ea069a5fd18c69Daniel Dunbar 4376acda16e9c194dcbd0dea64341e182bdb65d0f41Daniel Dunbar if (const Arg *A = Args.getLastArg(options::OPT_march_EQ)) { 4386acda16e9c194dcbd0dea64341e182bdb65d0f41Daniel Dunbar // FIXME: We may need some translation here from the options gcc takes to 4396acda16e9c194dcbd0dea64341e182bdb65d0f41Daniel Dunbar // names the LLVM backend understand? 4406acda16e9c194dcbd0dea64341e182bdb65d0f41Daniel Dunbar CmdArgs.push_back("-mcpu"); 4416acda16e9c194dcbd0dea64341e182bdb65d0f41Daniel Dunbar CmdArgs.push_back(A->getValue(Args)); 4426acda16e9c194dcbd0dea64341e182bdb65d0f41Daniel Dunbar } else { 4436acda16e9c194dcbd0dea64341e182bdb65d0f41Daniel Dunbar // Select default CPU. 4446acda16e9c194dcbd0dea64341e182bdb65d0f41Daniel Dunbar 4456acda16e9c194dcbd0dea64341e182bdb65d0f41Daniel Dunbar // FIXME: Need target hooks. 4466acda16e9c194dcbd0dea64341e182bdb65d0f41Daniel Dunbar if (memcmp(getToolChain().getOS().c_str(), "darwin", 6) == 0) { 4476acda16e9c194dcbd0dea64341e182bdb65d0f41Daniel Dunbar if (getToolChain().getArchName() == "x86_64") 4486acda16e9c194dcbd0dea64341e182bdb65d0f41Daniel Dunbar CmdArgs.push_back("--mcpu=core2"); 4496acda16e9c194dcbd0dea64341e182bdb65d0f41Daniel Dunbar else if (getToolChain().getArchName() == "i386") 4506acda16e9c194dcbd0dea64341e182bdb65d0f41Daniel Dunbar CmdArgs.push_back("--mcpu=yonah"); 4516acda16e9c194dcbd0dea64341e182bdb65d0f41Daniel Dunbar } else { 4526acda16e9c194dcbd0dea64341e182bdb65d0f41Daniel Dunbar if (getToolChain().getArchName() == "x86_64") 4536acda16e9c194dcbd0dea64341e182bdb65d0f41Daniel Dunbar CmdArgs.push_back("--mcpu=x86-64"); 4546acda16e9c194dcbd0dea64341e182bdb65d0f41Daniel Dunbar else if (getToolChain().getArchName() == "i386") 4556acda16e9c194dcbd0dea64341e182bdb65d0f41Daniel Dunbar CmdArgs.push_back("--mcpu=pentium4"); 4566acda16e9c194dcbd0dea64341e182bdb65d0f41Daniel Dunbar } 4576acda16e9c194dcbd0dea64341e182bdb65d0f41Daniel Dunbar } 4586acda16e9c194dcbd0dea64341e182bdb65d0f41Daniel Dunbar 4596acda16e9c194dcbd0dea64341e182bdb65d0f41Daniel Dunbar // FIXME: Use iterator. 4606acda16e9c194dcbd0dea64341e182bdb65d0f41Daniel Dunbar for (ArgList::const_iterator 4616acda16e9c194dcbd0dea64341e182bdb65d0f41Daniel Dunbar it = Args.begin(), ie = Args.end(); it != ie; ++it) { 4626acda16e9c194dcbd0dea64341e182bdb65d0f41Daniel Dunbar const Arg *A = *it; 4636acda16e9c194dcbd0dea64341e182bdb65d0f41Daniel Dunbar if (A->getOption().matches(options::OPT_m_x86_Features_Group)) { 4646acda16e9c194dcbd0dea64341e182bdb65d0f41Daniel Dunbar llvm::StringRef Name = A->getOption().getName(); 4656acda16e9c194dcbd0dea64341e182bdb65d0f41Daniel Dunbar 4666acda16e9c194dcbd0dea64341e182bdb65d0f41Daniel Dunbar // Skip over "-m". 4676acda16e9c194dcbd0dea64341e182bdb65d0f41Daniel Dunbar assert(Name.startswith("-m") && "Invalid feature name."); 4686acda16e9c194dcbd0dea64341e182bdb65d0f41Daniel Dunbar Name = Name.substr(2); 4696acda16e9c194dcbd0dea64341e182bdb65d0f41Daniel Dunbar 4706acda16e9c194dcbd0dea64341e182bdb65d0f41Daniel Dunbar bool IsNegative = Name.startswith("no-"); 4716acda16e9c194dcbd0dea64341e182bdb65d0f41Daniel Dunbar if (IsNegative) 4726acda16e9c194dcbd0dea64341e182bdb65d0f41Daniel Dunbar Name = Name.substr(3); 4736acda16e9c194dcbd0dea64341e182bdb65d0f41Daniel Dunbar 4746acda16e9c194dcbd0dea64341e182bdb65d0f41Daniel Dunbar A->claim(); 4756acda16e9c194dcbd0dea64341e182bdb65d0f41Daniel Dunbar CmdArgs.push_back("-target-feature"); 4766acda16e9c194dcbd0dea64341e182bdb65d0f41Daniel Dunbar CmdArgs.push_back(Args.MakeArgString((IsNegative ? "-" : "+") + Name)); 4776acda16e9c194dcbd0dea64341e182bdb65d0f41Daniel Dunbar } 4786acda16e9c194dcbd0dea64341e182bdb65d0f41Daniel Dunbar } 4796acda16e9c194dcbd0dea64341e182bdb65d0f41Daniel Dunbar} 4806acda16e9c194dcbd0dea64341e182bdb65d0f41Daniel Dunbar 48185caf03ee49c4de87ee9624a9b725ef5d20ee624Fariborz Jahanianstatic bool needsExceptions(const ArgList &Args, types::ID InputType, 48285caf03ee49c4de87ee9624a9b725ef5d20ee624Fariborz Jahanian const llvm::Triple &Triple) { 483f759df06d997050559fd925758bcd2cdef24db05Rafael Espindola if (Arg *A = Args.getLastArg(options::OPT_fexceptions, 484f759df06d997050559fd925758bcd2cdef24db05Rafael Espindola options::OPT_fno_exceptions)) { 485f759df06d997050559fd925758bcd2cdef24db05Rafael Espindola if (A->getOption().matches(options::OPT_fexceptions)) 486f759df06d997050559fd925758bcd2cdef24db05Rafael Espindola return true; 487f759df06d997050559fd925758bcd2cdef24db05Rafael Espindola else 488f759df06d997050559fd925758bcd2cdef24db05Rafael Espindola return false; 489f759df06d997050559fd925758bcd2cdef24db05Rafael Espindola } 490f759df06d997050559fd925758bcd2cdef24db05Rafael Espindola switch (InputType) { 491f759df06d997050559fd925758bcd2cdef24db05Rafael Espindola case types::TY_CXX: case types::TY_CXXHeader: 492f759df06d997050559fd925758bcd2cdef24db05Rafael Espindola case types::TY_PP_CXX: case types::TY_PP_CXXHeader: 493f759df06d997050559fd925758bcd2cdef24db05Rafael Espindola case types::TY_ObjCXX: case types::TY_ObjCXXHeader: 494f759df06d997050559fd925758bcd2cdef24db05Rafael Espindola case types::TY_PP_ObjCXX: case types::TY_PP_ObjCXXHeader: 495f759df06d997050559fd925758bcd2cdef24db05Rafael Espindola return true; 49685caf03ee49c4de87ee9624a9b725ef5d20ee624Fariborz Jahanian 497f759df06d997050559fd925758bcd2cdef24db05Rafael Espindola case types::TY_ObjC: case types::TY_ObjCHeader: 498f759df06d997050559fd925758bcd2cdef24db05Rafael Espindola case types::TY_PP_ObjC: case types::TY_PP_ObjCHeader: 499f759df06d997050559fd925758bcd2cdef24db05Rafael Espindola if (Args.hasArg(options::OPT_fobjc_nonfragile_abi)) 500f759df06d997050559fd925758bcd2cdef24db05Rafael Espindola return true; 50185caf03ee49c4de87ee9624a9b725ef5d20ee624Fariborz Jahanian if (Triple.getOS() != llvm::Triple::Darwin) 502f759df06d997050559fd925758bcd2cdef24db05Rafael Espindola return false; 50385caf03ee49c4de87ee9624a9b725ef5d20ee624Fariborz Jahanian return (Triple.getDarwinMajorNumber() >= 9 && 50485caf03ee49c4de87ee9624a9b725ef5d20ee624Fariborz Jahanian Triple.getArch() == llvm::Triple::x86_64); 50585caf03ee49c4de87ee9624a9b725ef5d20ee624Fariborz Jahanian 506f759df06d997050559fd925758bcd2cdef24db05Rafael Espindola default: 507f759df06d997050559fd925758bcd2cdef24db05Rafael Espindola return false; 508f759df06d997050559fd925758bcd2cdef24db05Rafael Espindola } 509f759df06d997050559fd925758bcd2cdef24db05Rafael Espindola} 510f759df06d997050559fd925758bcd2cdef24db05Rafael Espindola 51147ac7d27c44bd64a7d0fc03d4babc196cf2b8230Daniel Dunbarvoid Clang::ConstructJob(Compilation &C, const JobAction &JA, 512871adcf4e41285e3f4c3b62eaa1b2e05b60b92daDaniel Dunbar Job &Dest, 513871adcf4e41285e3f4c3b62eaa1b2e05b60b92daDaniel Dunbar const InputInfo &Output, 51462cf601812e03dd9bc5df42b8ef06a0cdedc38bfDaniel Dunbar const InputInfoList &Inputs, 5151d46033f760ba5fd266ce59fe391fac473f04f52Daniel Dunbar const ArgList &Args, 51647ac7d27c44bd64a7d0fc03d4babc196cf2b8230Daniel Dunbar const char *LinkingOutput) const { 5175c1aaafbd6dd25a99ca1960e1c3c98aeefe9d728Daniel Dunbar const Driver &D = getToolChain().getHost().getDriver(); 518b488c1dac8e53206f07103d794a62a3f5012c0f4Daniel Dunbar ArgStringList CmdArgs; 519b488c1dac8e53206f07103d794a62a3f5012c0f4Daniel Dunbar 520077ba6a3ac3628afb0d3c460e81ce013bccbdbedDaniel Dunbar assert(Inputs.size() == 1 && "Unable to handle multiple inputs."); 521077ba6a3ac3628afb0d3c460e81ce013bccbdbedDaniel Dunbar 522af07f936b698575f2c91f1c1134c116f1ef0deddDaniel Dunbar CmdArgs.push_back("-triple"); 523728a512753d85a6ccaae34e81385c8665c2de0e1Daniel Dunbar 524c21c485b4fb58ef5d55cf3e523263dd824a2ace4Daniel Dunbar const char *TripleStr = 525728a512753d85a6ccaae34e81385c8665c2de0e1Daniel Dunbar Args.MakeArgString(getLLVMTriple(getToolChain(), Args)); 526af07f936b698575f2c91f1c1134c116f1ef0deddDaniel Dunbar CmdArgs.push_back(TripleStr); 527af07f936b698575f2c91f1c1134c116f1ef0deddDaniel Dunbar 5281d46033f760ba5fd266ce59fe391fac473f04f52Daniel Dunbar if (isa<AnalyzeJobAction>(JA)) { 5291d46033f760ba5fd266ce59fe391fac473f04f52Daniel Dunbar assert(JA.getType() == types::TY_Plist && "Invalid output type."); 5301d46033f760ba5fd266ce59fe391fac473f04f52Daniel Dunbar CmdArgs.push_back("-analyze"); 5311d46033f760ba5fd266ce59fe391fac473f04f52Daniel Dunbar } else if (isa<PreprocessJobAction>(JA)) { 532cd8e4c44dd068956e9181381be3ee2d49a0fac52Daniel Dunbar if (Output.getType() == types::TY_Dependencies) 533cd8e4c44dd068956e9181381be3ee2d49a0fac52Daniel Dunbar CmdArgs.push_back("-Eonly"); 534cd8e4c44dd068956e9181381be3ee2d49a0fac52Daniel Dunbar else 535cd8e4c44dd068956e9181381be3ee2d49a0fac52Daniel Dunbar CmdArgs.push_back("-E"); 5361d46033f760ba5fd266ce59fe391fac473f04f52Daniel Dunbar } else if (isa<PrecompileJobAction>(JA)) { 5370ebd9321ba380471010341f24c874f46f56e7581Daniel Dunbar // Use PCH if the user requested it, except for C++ (for now). 5380ebd9321ba380471010341f24c874f46f56e7581Daniel Dunbar bool UsePCH = D.CCCUsePCH; 5390ebd9321ba380471010341f24c874f46f56e7581Daniel Dunbar if (types::isCXX(Inputs[0].getType())) 5400ebd9321ba380471010341f24c874f46f56e7581Daniel Dunbar UsePCH = false; 5410ebd9321ba380471010341f24c874f46f56e7581Daniel Dunbar 5420ebd9321ba380471010341f24c874f46f56e7581Daniel Dunbar if (UsePCH) 543df91ef3d6c55692a0236f67b6c6b134a3bf84098Douglas Gregor CmdArgs.push_back("-emit-pch"); 544df91ef3d6c55692a0236f67b6c6b134a3bf84098Douglas Gregor else 545df91ef3d6c55692a0236f67b6c6b134a3bf84098Douglas Gregor CmdArgs.push_back("-emit-pth"); 5461d46033f760ba5fd266ce59fe391fac473f04f52Daniel Dunbar } else { 5471d46033f760ba5fd266ce59fe391fac473f04f52Daniel Dunbar assert(isa<CompileJobAction>(JA) && "Invalid action for clang tool."); 548c21c485b4fb58ef5d55cf3e523263dd824a2ace4Daniel Dunbar 5491d46033f760ba5fd266ce59fe391fac473f04f52Daniel Dunbar if (JA.getType() == types::TY_Nothing) { 5501d46033f760ba5fd266ce59fe391fac473f04f52Daniel Dunbar CmdArgs.push_back("-fsyntax-only"); 5511d46033f760ba5fd266ce59fe391fac473f04f52Daniel Dunbar } else if (JA.getType() == types::TY_LLVMAsm) { 5521d46033f760ba5fd266ce59fe391fac473f04f52Daniel Dunbar CmdArgs.push_back("-emit-llvm"); 5531d46033f760ba5fd266ce59fe391fac473f04f52Daniel Dunbar } else if (JA.getType() == types::TY_LLVMBC) { 5541d46033f760ba5fd266ce59fe391fac473f04f52Daniel Dunbar CmdArgs.push_back("-emit-llvm-bc"); 5551d46033f760ba5fd266ce59fe391fac473f04f52Daniel Dunbar } else if (JA.getType() == types::TY_PP_Asm) { 556e3b8d07e02861d245612b02b5f5a2c1f34b2a394Daniel Dunbar CmdArgs.push_back("-S"); 5575915fbf310e171c4cd3c2af05e9de360c0fa988aDaniel Dunbar } else if (JA.getType() == types::TY_AST) { 5585915fbf310e171c4cd3c2af05e9de360c0fa988aDaniel Dunbar CmdArgs.push_back("-emit-pch"); 5591d46033f760ba5fd266ce59fe391fac473f04f52Daniel Dunbar } 5601d46033f760ba5fd266ce59fe391fac473f04f52Daniel Dunbar } 5611d46033f760ba5fd266ce59fe391fac473f04f52Daniel Dunbar 5621d46033f760ba5fd266ce59fe391fac473f04f52Daniel Dunbar // The make clang go fast button. 5631d46033f760ba5fd266ce59fe391fac473f04f52Daniel Dunbar CmdArgs.push_back("-disable-free"); 5641d46033f760ba5fd266ce59fe391fac473f04f52Daniel Dunbar 565c9abc043af88f90d177a5bd147f627b78ca49fdeDaniel Dunbar // Set the main file name, so that debug info works even with 566c9abc043af88f90d177a5bd147f627b78ca49fdeDaniel Dunbar // -save-temps. 567c9abc043af88f90d177a5bd147f627b78ca49fdeDaniel Dunbar CmdArgs.push_back("-main-file-name"); 568c9abc043af88f90d177a5bd147f627b78ca49fdeDaniel Dunbar CmdArgs.push_back(darwin::CC1::getBaseInputName(Args, Inputs)); 569c9abc043af88f90d177a5bd147f627b78ca49fdeDaniel Dunbar 5703bbc75302fd43cf13d868b46c94ff8794b302e43Daniel Dunbar // Some flags which affect the language (via preprocessor 5713bbc75302fd43cf13d868b46c94ff8794b302e43Daniel Dunbar // defines). See darwin::CC1::AddCPPArgs. 5723bbc75302fd43cf13d868b46c94ff8794b302e43Daniel Dunbar if (Args.hasArg(options::OPT_static)) 5733bbc75302fd43cf13d868b46c94ff8794b302e43Daniel Dunbar CmdArgs.push_back("-static-define"); 5743bbc75302fd43cf13d868b46c94ff8794b302e43Daniel Dunbar 5751d46033f760ba5fd266ce59fe391fac473f04f52Daniel Dunbar if (isa<AnalyzeJobAction>(JA)) { 576b8bb3e797c5687715c6d9d960ee573e4d0e62230Ted Kremenek // Enable region store model by default. 577b8bb3e797c5687715c6d9d960ee573e4d0e62230Ted Kremenek CmdArgs.push_back("-analyzer-store=region"); 578b8bb3e797c5687715c6d9d960ee573e4d0e62230Ted Kremenek 5791d46033f760ba5fd266ce59fe391fac473f04f52Daniel Dunbar // Add default argument set. 580d8fc0f2e7751cf31cec5c2f3cc6a0b447e9debb3Daniel Dunbar if (!Args.hasArg(options::OPT__analyzer_no_default_checks)) { 581d8fc0f2e7751cf31cec5c2f3cc6a0b447e9debb3Daniel Dunbar CmdArgs.push_back("-warn-dead-stores"); 58211727519fbdaec68f526ae7c54a83d0a4601f561Ted Kremenek CmdArgs.push_back("-warn-security-syntactic"); 583d8fc0f2e7751cf31cec5c2f3cc6a0b447e9debb3Daniel Dunbar CmdArgs.push_back("-checker-cfref"); 584d8fc0f2e7751cf31cec5c2f3cc6a0b447e9debb3Daniel Dunbar CmdArgs.push_back("-analyzer-eagerly-assume"); 585d8fc0f2e7751cf31cec5c2f3cc6a0b447e9debb3Daniel Dunbar CmdArgs.push_back("-warn-objc-methodsigs"); 586d8fc0f2e7751cf31cec5c2f3cc6a0b447e9debb3Daniel Dunbar // Do not enable the missing -dealloc check. 587d8fc0f2e7751cf31cec5c2f3cc6a0b447e9debb3Daniel Dunbar // '-warn-objc-missing-dealloc', 588d8fc0f2e7751cf31cec5c2f3cc6a0b447e9debb3Daniel Dunbar CmdArgs.push_back("-warn-objc-unused-ivars"); 589d8fc0f2e7751cf31cec5c2f3cc6a0b447e9debb3Daniel Dunbar } 590d8fc0f2e7751cf31cec5c2f3cc6a0b447e9debb3Daniel Dunbar 591d8fc0f2e7751cf31cec5c2f3cc6a0b447e9debb3Daniel Dunbar // Set the output format. The default is plist, for (lame) historical 592d8fc0f2e7751cf31cec5c2f3cc6a0b447e9debb3Daniel Dunbar // reasons. 593d8fc0f2e7751cf31cec5c2f3cc6a0b447e9debb3Daniel Dunbar CmdArgs.push_back("-analyzer-output"); 594d8fc0f2e7751cf31cec5c2f3cc6a0b447e9debb3Daniel Dunbar if (Arg *A = Args.getLastArg(options::OPT__analyzer_output)) 595d8fc0f2e7751cf31cec5c2f3cc6a0b447e9debb3Daniel Dunbar CmdArgs.push_back(A->getValue(Args)); 596d8fc0f2e7751cf31cec5c2f3cc6a0b447e9debb3Daniel Dunbar else 597d8fc0f2e7751cf31cec5c2f3cc6a0b447e9debb3Daniel Dunbar CmdArgs.push_back("plist"); 5981d46033f760ba5fd266ce59fe391fac473f04f52Daniel Dunbar 5991d46033f760ba5fd266ce59fe391fac473f04f52Daniel Dunbar // Add -Xanalyzer arguments when running as analyzer. 6001d46033f760ba5fd266ce59fe391fac473f04f52Daniel Dunbar Args.AddAllArgValues(CmdArgs, options::OPT_Xanalyzer); 6011eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump } 6021eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump 603e2fd66418eca3d70cf6b62087d745d0c5181db69Daniel Dunbar CheckCodeGenerationOptions(D, Args); 604e2fd66418eca3d70cf6b62087d745d0c5181db69Daniel Dunbar 605bc85be85779a47bae728bbe6a2cd2e3732b1333dDaniel Dunbar // Perform argument translation for LLVM backend. This 606bc85be85779a47bae728bbe6a2cd2e3732b1333dDaniel Dunbar // takes some care in reconciling with llvm-gcc. The 607bc85be85779a47bae728bbe6a2cd2e3732b1333dDaniel Dunbar // issue is that llvm-gcc translates these options based on 608bc85be85779a47bae728bbe6a2cd2e3732b1333dDaniel Dunbar // the values in cc1, whereas we are processing based on 609bc85be85779a47bae728bbe6a2cd2e3732b1333dDaniel Dunbar // the driver arguments. 610bc85be85779a47bae728bbe6a2cd2e3732b1333dDaniel Dunbar // 611bc85be85779a47bae728bbe6a2cd2e3732b1333dDaniel Dunbar // FIXME: This is currently broken for -f flags when -fno 612bc85be85779a47bae728bbe6a2cd2e3732b1333dDaniel Dunbar // variants are present. 6139fd0b1f845a61e71dd8099f596532d34c519630aDaniel Dunbar 614bc85be85779a47bae728bbe6a2cd2e3732b1333dDaniel Dunbar // This comes from the default translation the driver + cc1 615bc85be85779a47bae728bbe6a2cd2e3732b1333dDaniel Dunbar // would do to enable flag_pic. 616bc85be85779a47bae728bbe6a2cd2e3732b1333dDaniel Dunbar // 617bc85be85779a47bae728bbe6a2cd2e3732b1333dDaniel Dunbar // FIXME: Centralize this code. 618bc85be85779a47bae728bbe6a2cd2e3732b1333dDaniel Dunbar bool PICEnabled = (Args.hasArg(options::OPT_fPIC) || 619bc85be85779a47bae728bbe6a2cd2e3732b1333dDaniel Dunbar Args.hasArg(options::OPT_fpic) || 620bc85be85779a47bae728bbe6a2cd2e3732b1333dDaniel Dunbar Args.hasArg(options::OPT_fPIE) || 621bc85be85779a47bae728bbe6a2cd2e3732b1333dDaniel Dunbar Args.hasArg(options::OPT_fpie)); 622bc85be85779a47bae728bbe6a2cd2e3732b1333dDaniel Dunbar bool PICDisabled = (Args.hasArg(options::OPT_mkernel) || 623bc85be85779a47bae728bbe6a2cd2e3732b1333dDaniel Dunbar Args.hasArg(options::OPT_static)); 624bc85be85779a47bae728bbe6a2cd2e3732b1333dDaniel Dunbar const char *Model = getToolChain().GetForcedPicModel(); 625bc85be85779a47bae728bbe6a2cd2e3732b1333dDaniel Dunbar if (!Model) { 626bc85be85779a47bae728bbe6a2cd2e3732b1333dDaniel Dunbar if (Args.hasArg(options::OPT_mdynamic_no_pic)) 627bc85be85779a47bae728bbe6a2cd2e3732b1333dDaniel Dunbar Model = "dynamic-no-pic"; 628bc85be85779a47bae728bbe6a2cd2e3732b1333dDaniel Dunbar else if (PICDisabled) 629bc85be85779a47bae728bbe6a2cd2e3732b1333dDaniel Dunbar Model = "static"; 630bc85be85779a47bae728bbe6a2cd2e3732b1333dDaniel Dunbar else if (PICEnabled) 631bc85be85779a47bae728bbe6a2cd2e3732b1333dDaniel Dunbar Model = "pic"; 6321d46033f760ba5fd266ce59fe391fac473f04f52Daniel Dunbar else 633bc85be85779a47bae728bbe6a2cd2e3732b1333dDaniel Dunbar Model = getToolChain().GetDefaultRelocationModel(); 634bc85be85779a47bae728bbe6a2cd2e3732b1333dDaniel Dunbar } 635bc85be85779a47bae728bbe6a2cd2e3732b1333dDaniel Dunbar CmdArgs.push_back("--relocation-model"); 636bc85be85779a47bae728bbe6a2cd2e3732b1333dDaniel Dunbar CmdArgs.push_back(Model); 6371d46033f760ba5fd266ce59fe391fac473f04f52Daniel Dunbar 638bc85be85779a47bae728bbe6a2cd2e3732b1333dDaniel Dunbar // Infer the __PIC__ value. 639bc85be85779a47bae728bbe6a2cd2e3732b1333dDaniel Dunbar // 640bc85be85779a47bae728bbe6a2cd2e3732b1333dDaniel Dunbar // FIXME: This isn't quite right on Darwin, which always sets 641bc85be85779a47bae728bbe6a2cd2e3732b1333dDaniel Dunbar // __PIC__=2. 642bc85be85779a47bae728bbe6a2cd2e3732b1333dDaniel Dunbar if (strcmp(Model, "pic") == 0 || strcmp(Model, "dynamic-no-pic") == 0) { 643bc85be85779a47bae728bbe6a2cd2e3732b1333dDaniel Dunbar if (Args.hasArg(options::OPT_fPIC)) 644bc85be85779a47bae728bbe6a2cd2e3732b1333dDaniel Dunbar CmdArgs.push_back("-pic-level=2"); 6451d46033f760ba5fd266ce59fe391fac473f04f52Daniel Dunbar else 646bc85be85779a47bae728bbe6a2cd2e3732b1333dDaniel Dunbar CmdArgs.push_back("-pic-level=1"); 647bc85be85779a47bae728bbe6a2cd2e3732b1333dDaniel Dunbar } 6481d46033f760ba5fd266ce59fe391fac473f04f52Daniel Dunbar 649bc85be85779a47bae728bbe6a2cd2e3732b1333dDaniel Dunbar if (Args.hasArg(options::OPT_ftime_report)) 650bc85be85779a47bae728bbe6a2cd2e3732b1333dDaniel Dunbar CmdArgs.push_back("--time-passes"); 651bc85be85779a47bae728bbe6a2cd2e3732b1333dDaniel Dunbar // FIXME: Set --enable-unsafe-fp-math. 65221656ddae8e81df04f142386337cb95a9e0f0971Benjamin Kramer if (Args.hasFlag(options::OPT_fno_omit_frame_pointer, 65321656ddae8e81df04f142386337cb95a9e0f0971Benjamin Kramer options::OPT_fomit_frame_pointer)) 654bc85be85779a47bae728bbe6a2cd2e3732b1333dDaniel Dunbar CmdArgs.push_back("--disable-fp-elim"); 655bc85be85779a47bae728bbe6a2cd2e3732b1333dDaniel Dunbar if (!Args.hasFlag(options::OPT_fzero_initialized_in_bss, 656bc85be85779a47bae728bbe6a2cd2e3732b1333dDaniel Dunbar options::OPT_fno_zero_initialized_in_bss, 657bc85be85779a47bae728bbe6a2cd2e3732b1333dDaniel Dunbar true)) 658bc85be85779a47bae728bbe6a2cd2e3732b1333dDaniel Dunbar CmdArgs.push_back("--nozero-initialized-in-bss"); 659bc85be85779a47bae728bbe6a2cd2e3732b1333dDaniel Dunbar if (Args.hasArg(options::OPT_dA) || Args.hasArg(options::OPT_fverbose_asm)) 660bc85be85779a47bae728bbe6a2cd2e3732b1333dDaniel Dunbar CmdArgs.push_back("--asm-verbose"); 661bc85be85779a47bae728bbe6a2cd2e3732b1333dDaniel Dunbar if (Args.hasArg(options::OPT_fdebug_pass_structure)) 662bc85be85779a47bae728bbe6a2cd2e3732b1333dDaniel Dunbar CmdArgs.push_back("--debug-pass=Structure"); 663bc85be85779a47bae728bbe6a2cd2e3732b1333dDaniel Dunbar if (Args.hasArg(options::OPT_fdebug_pass_arguments)) 664bc85be85779a47bae728bbe6a2cd2e3732b1333dDaniel Dunbar CmdArgs.push_back("--debug-pass=Arguments"); 665bc85be85779a47bae728bbe6a2cd2e3732b1333dDaniel Dunbar // FIXME: set --inline-threshhold=50 if (optimize_size || optimize 666bc85be85779a47bae728bbe6a2cd2e3732b1333dDaniel Dunbar // < 3) 6676bea73b3305a03479589e2642fbdcf6c096851aaDaniel Dunbar 6686bea73b3305a03479589e2642fbdcf6c096851aaDaniel Dunbar // This is a coarse approximation of what llvm-gcc actually does, both 6696bea73b3305a03479589e2642fbdcf6c096851aaDaniel Dunbar // -fasynchronous-unwind-tables and -fnon-call-exceptions interact in more 6706bea73b3305a03479589e2642fbdcf6c096851aaDaniel Dunbar // complicated ways. 6716bea73b3305a03479589e2642fbdcf6c096851aaDaniel Dunbar bool AsynchronousUnwindTables = 6726bea73b3305a03479589e2642fbdcf6c096851aaDaniel Dunbar Args.hasFlag(options::OPT_fasynchronous_unwind_tables, 6736bea73b3305a03479589e2642fbdcf6c096851aaDaniel Dunbar options::OPT_fno_asynchronous_unwind_tables, 6746bea73b3305a03479589e2642fbdcf6c096851aaDaniel Dunbar getToolChain().IsUnwindTablesDefault() && 6756bea73b3305a03479589e2642fbdcf6c096851aaDaniel Dunbar !Args.hasArg(options::OPT_mkernel)); 6766bea73b3305a03479589e2642fbdcf6c096851aaDaniel Dunbar if (Args.hasFlag(options::OPT_funwind_tables, options::OPT_fno_unwind_tables, 6776bea73b3305a03479589e2642fbdcf6c096851aaDaniel Dunbar AsynchronousUnwindTables)) 678bc85be85779a47bae728bbe6a2cd2e3732b1333dDaniel Dunbar CmdArgs.push_back("--unwind-tables=1"); 679bc85be85779a47bae728bbe6a2cd2e3732b1333dDaniel Dunbar else 680bc85be85779a47bae728bbe6a2cd2e3732b1333dDaniel Dunbar CmdArgs.push_back("--unwind-tables=0"); 681bc85be85779a47bae728bbe6a2cd2e3732b1333dDaniel Dunbar 682868bd0aa9281929ef50d2e9a8c82a036906f53f5Daniel Dunbar // FIXME: Handle -mtune=. 683868bd0aa9281929ef50d2e9a8c82a036906f53f5Daniel Dunbar (void) Args.hasArg(options::OPT_mtune_EQ); 684bc85be85779a47bae728bbe6a2cd2e3732b1333dDaniel Dunbar 6858e9ef0d87dad25f02e5abc6facf528778236115aBenjamin Kramer if (Arg *A = Args.getLastArg(options::OPT_mcmodel_EQ)) { 6868e9ef0d87dad25f02e5abc6facf528778236115aBenjamin Kramer CmdArgs.push_back("-code-model"); 6878e9ef0d87dad25f02e5abc6facf528778236115aBenjamin Kramer CmdArgs.push_back(A->getValue(Args)); 6888e9ef0d87dad25f02e5abc6facf528778236115aBenjamin Kramer } 6898e9ef0d87dad25f02e5abc6facf528778236115aBenjamin Kramer 6906acda16e9c194dcbd0dea64341e182bdb65d0f41Daniel Dunbar // Add target specific cpu and features flags. 6916acda16e9c194dcbd0dea64341e182bdb65d0f41Daniel Dunbar switch(getToolChain().getTriple().getArch()) { 6926acda16e9c194dcbd0dea64341e182bdb65d0f41Daniel Dunbar default: 6936acda16e9c194dcbd0dea64341e182bdb65d0f41Daniel Dunbar break; 694868bd0aa9281929ef50d2e9a8c82a036906f53f5Daniel Dunbar 695b163ef7e7a5d904ef0962a7c38c460be083c4d63Daniel Dunbar case llvm::Triple::arm: 696b163ef7e7a5d904ef0962a7c38c460be083c4d63Daniel Dunbar case llvm::Triple::thumb: 697b163ef7e7a5d904ef0962a7c38c460be083c4d63Daniel Dunbar AddARMTargetArgs(Args, CmdArgs); 698b163ef7e7a5d904ef0962a7c38c460be083c4d63Daniel Dunbar break; 699b163ef7e7a5d904ef0962a7c38c460be083c4d63Daniel Dunbar 7006acda16e9c194dcbd0dea64341e182bdb65d0f41Daniel Dunbar case llvm::Triple::x86: 7016acda16e9c194dcbd0dea64341e182bdb65d0f41Daniel Dunbar case llvm::Triple::x86_64: 7026acda16e9c194dcbd0dea64341e182bdb65d0f41Daniel Dunbar AddX86TargetArgs(Args, CmdArgs); 7036acda16e9c194dcbd0dea64341e182bdb65d0f41Daniel Dunbar break; 704bc85be85779a47bae728bbe6a2cd2e3732b1333dDaniel Dunbar } 705c21c485b4fb58ef5d55cf3e523263dd824a2ace4Daniel Dunbar 706bc85be85779a47bae728bbe6a2cd2e3732b1333dDaniel Dunbar if (Args.hasFlag(options::OPT_fmath_errno, 707bc85be85779a47bae728bbe6a2cd2e3732b1333dDaniel Dunbar options::OPT_fno_math_errno, 708bc85be85779a47bae728bbe6a2cd2e3732b1333dDaniel Dunbar getToolChain().IsMathErrnoDefault())) 709bc85be85779a47bae728bbe6a2cd2e3732b1333dDaniel Dunbar CmdArgs.push_back("--fmath-errno=1"); 710bc85be85779a47bae728bbe6a2cd2e3732b1333dDaniel Dunbar else 711bc85be85779a47bae728bbe6a2cd2e3732b1333dDaniel Dunbar CmdArgs.push_back("--fmath-errno=0"); 7121d46033f760ba5fd266ce59fe391fac473f04f52Daniel Dunbar 713bc85be85779a47bae728bbe6a2cd2e3732b1333dDaniel Dunbar if (Arg *A = Args.getLastArg(options::OPT_flimited_precision_EQ)) { 714bc85be85779a47bae728bbe6a2cd2e3732b1333dDaniel Dunbar CmdArgs.push_back("--limit-float-precision"); 715bc85be85779a47bae728bbe6a2cd2e3732b1333dDaniel Dunbar CmdArgs.push_back(A->getValue(Args)); 7161d46033f760ba5fd266ce59fe391fac473f04f52Daniel Dunbar } 7171d46033f760ba5fd266ce59fe391fac473f04f52Daniel Dunbar 718bc85be85779a47bae728bbe6a2cd2e3732b1333dDaniel Dunbar // FIXME: Add --stack-protector-buffer-size=<xxx> on 719bc85be85779a47bae728bbe6a2cd2e3732b1333dDaniel Dunbar // -fstack-protect. 720bc85be85779a47bae728bbe6a2cd2e3732b1333dDaniel Dunbar 721bc85be85779a47bae728bbe6a2cd2e3732b1333dDaniel Dunbar Arg *Unsupported; 722bc85be85779a47bae728bbe6a2cd2e3732b1333dDaniel Dunbar if ((Unsupported = Args.getLastArg(options::OPT_MG)) || 72395a0da7b263777e6f97e5a08b6eb893681a234baDaniel Dunbar (Unsupported = Args.getLastArg(options::OPT_MQ)) || 72495a0da7b263777e6f97e5a08b6eb893681a234baDaniel Dunbar (Unsupported = Args.getLastArg(options::OPT_iframework))) 725e027a4b2399e9b0acfe0f77220c66bbe369067eeDaniel Dunbar D.Diag(clang::diag::err_drv_clang_unsupported) 726bc85be85779a47bae728bbe6a2cd2e3732b1333dDaniel Dunbar << Unsupported->getOption().getName(); 727bc85be85779a47bae728bbe6a2cd2e3732b1333dDaniel Dunbar 7281d46033f760ba5fd266ce59fe391fac473f04f52Daniel Dunbar Args.AddAllArgs(CmdArgs, options::OPT_v); 7291d46033f760ba5fd266ce59fe391fac473f04f52Daniel Dunbar Args.AddLastArg(CmdArgs, options::OPT_P); 7302ac9fc2ad64e16127df8c60caeea2edfe9a400a2Daniel Dunbar Args.AddLastArg(CmdArgs, options::OPT_mmacosx_version_min_EQ); 731ff8857a9e6f533765f63b2934902645baa7ddd09Daniel Dunbar Args.AddLastArg(CmdArgs, options::OPT_miphoneos_version_min_EQ); 7321eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump Args.AddLastArg(CmdArgs, options::OPT_print_ivar_layout); 7331d46033f760ba5fd266ce59fe391fac473f04f52Daniel Dunbar 7341d46033f760ba5fd266ce59fe391fac473f04f52Daniel Dunbar // Special case debug options to only pass -g to clang. This is 7351d46033f760ba5fd266ce59fe391fac473f04f52Daniel Dunbar // wrong. 7361d46033f760ba5fd266ce59fe391fac473f04f52Daniel Dunbar if (Args.hasArg(options::OPT_g_Group)) 7371d46033f760ba5fd266ce59fe391fac473f04f52Daniel Dunbar CmdArgs.push_back("-g"); 7381d46033f760ba5fd266ce59fe391fac473f04f52Daniel Dunbar 7391d46033f760ba5fd266ce59fe391fac473f04f52Daniel Dunbar Args.AddLastArg(CmdArgs, options::OPT_nostdinc); 7408d737cc78cb28f39179d6c7ca00eb5d3cf563129Rafael Espindola Args.AddLastArg(CmdArgs, options::OPT_nobuiltininc); 7411d46033f760ba5fd266ce59fe391fac473f04f52Daniel Dunbar 7422ac9fc2ad64e16127df8c60caeea2edfe9a400a2Daniel Dunbar Args.AddLastArg(CmdArgs, options::OPT_isysroot); 7432ac9fc2ad64e16127df8c60caeea2edfe9a400a2Daniel Dunbar 744c21c485b4fb58ef5d55cf3e523263dd824a2ace4Daniel Dunbar // Add preprocessing options like -I, -D, etc. if we are using the 745c21c485b4fb58ef5d55cf3e523263dd824a2ace4Daniel Dunbar // preprocessor. 746c21c485b4fb58ef5d55cf3e523263dd824a2ace4Daniel Dunbar // 747c21c485b4fb58ef5d55cf3e523263dd824a2ace4Daniel Dunbar // FIXME: Support -fpreprocessed 748c21c485b4fb58ef5d55cf3e523263dd824a2ace4Daniel Dunbar types::ID InputType = Inputs[0].getType(); 749c21c485b4fb58ef5d55cf3e523263dd824a2ace4Daniel Dunbar if (types::getPreprocessedType(InputType) != types::TY_INVALID) 750df91ef3d6c55692a0236f67b6c6b134a3bf84098Douglas Gregor AddPreprocessingOptions(D, Args, CmdArgs, Output, Inputs); 7511d46033f760ba5fd266ce59fe391fac473f04f52Daniel Dunbar 75220f0eacf1682e4594da9d318b5b13ed4f6d6e7e5Daniel Dunbar // Manually translate -O to -O2 and -O4 to -O3; let clang reject 753337a6271b98c4c183f7eaad1563a75260b4f2871Daniel Dunbar // others. 754337a6271b98c4c183f7eaad1563a75260b4f2871Daniel Dunbar if (Arg *A = Args.getLastArg(options::OPT_O_Group)) { 755c21c485b4fb58ef5d55cf3e523263dd824a2ace4Daniel Dunbar if (A->getOption().getId() == options::OPT_O4) 756337a6271b98c4c183f7eaad1563a75260b4f2871Daniel Dunbar CmdArgs.push_back("-O3"); 757337a6271b98c4c183f7eaad1563a75260b4f2871Daniel Dunbar else if (A->getValue(Args)[0] == '\0') 75820f0eacf1682e4594da9d318b5b13ed4f6d6e7e5Daniel Dunbar CmdArgs.push_back("-O2"); 7591d46033f760ba5fd266ce59fe391fac473f04f52Daniel Dunbar else 7605697aa0d75c87bafec78984048d558f8d12ca1b3Daniel Dunbar A->render(Args, CmdArgs); 7611d46033f760ba5fd266ce59fe391fac473f04f52Daniel Dunbar } 7621d46033f760ba5fd266ce59fe391fac473f04f52Daniel Dunbar 76306ef3c3e9be4923b8e29c8e267b0c56afaa14ff3Daniel Dunbar Args.AddAllArgs(CmdArgs, options::OPT_W_Group, options::OPT_pedantic_Group); 7641d46033f760ba5fd266ce59fe391fac473f04f52Daniel Dunbar Args.AddLastArg(CmdArgs, options::OPT_w); 765d573d26e1abcce24c31ece3d6f7af158db569e4cDaniel Dunbar 766d573d26e1abcce24c31ece3d6f7af158db569e4cDaniel Dunbar // Handle -{std, ansi, trigraphs} -- take the last of -{std, ansi} 767d573d26e1abcce24c31ece3d6f7af158db569e4cDaniel Dunbar // (-ansi is equivalent to -std=c89). 768d573d26e1abcce24c31ece3d6f7af158db569e4cDaniel Dunbar // 769d573d26e1abcce24c31ece3d6f7af158db569e4cDaniel Dunbar // If a std is supplied, only add -trigraphs if it follows the 770d573d26e1abcce24c31ece3d6f7af158db569e4cDaniel Dunbar // option. 771d573d26e1abcce24c31ece3d6f7af158db569e4cDaniel Dunbar if (Arg *Std = Args.getLastArg(options::OPT_std_EQ, options::OPT_ansi)) { 772d573d26e1abcce24c31ece3d6f7af158db569e4cDaniel Dunbar if (Std->getOption().matches(options::OPT_ansi)) 773528365d3189d27f3a90a4012baaa8b2814e0a231Nuno Lopes if (types::isCXX(InputType)) 774528365d3189d27f3a90a4012baaa8b2814e0a231Nuno Lopes CmdArgs.push_back("-std=c++98"); 775528365d3189d27f3a90a4012baaa8b2814e0a231Nuno Lopes else 776528365d3189d27f3a90a4012baaa8b2814e0a231Nuno Lopes CmdArgs.push_back("-std=c89"); 777d573d26e1abcce24c31ece3d6f7af158db569e4cDaniel Dunbar else 778d573d26e1abcce24c31ece3d6f7af158db569e4cDaniel Dunbar Std->render(Args, CmdArgs); 779d573d26e1abcce24c31ece3d6f7af158db569e4cDaniel Dunbar 780d573d26e1abcce24c31ece3d6f7af158db569e4cDaniel Dunbar if (Arg *A = Args.getLastArg(options::OPT_trigraphs)) 781d573d26e1abcce24c31ece3d6f7af158db569e4cDaniel Dunbar if (A->getIndex() > Std->getIndex()) 782d573d26e1abcce24c31ece3d6f7af158db569e4cDaniel Dunbar A->render(Args, CmdArgs); 783a3ff202ee4fb21728e930d5d029ba4925129912cDaniel Dunbar } else { 784a3ff202ee4fb21728e930d5d029ba4925129912cDaniel Dunbar // Honor -std-default. 785a3ff202ee4fb21728e930d5d029ba4925129912cDaniel Dunbar Args.AddAllArgsTranslated(CmdArgs, options::OPT_std_default_EQ, 786a3ff202ee4fb21728e930d5d029ba4925129912cDaniel Dunbar "-std=", /*Joined=*/true); 787d573d26e1abcce24c31ece3d6f7af158db569e4cDaniel Dunbar Args.AddLastArg(CmdArgs, options::OPT_trigraphs); 788a3ff202ee4fb21728e930d5d029ba4925129912cDaniel Dunbar } 789c21c485b4fb58ef5d55cf3e523263dd824a2ace4Daniel Dunbar 7901d46033f760ba5fd266ce59fe391fac473f04f52Daniel Dunbar if (Arg *A = Args.getLastArg(options::OPT_ftemplate_depth_)) { 7911d46033f760ba5fd266ce59fe391fac473f04f52Daniel Dunbar CmdArgs.push_back("-ftemplate-depth"); 7921d46033f760ba5fd266ce59fe391fac473f04f52Daniel Dunbar CmdArgs.push_back(A->getValue(Args)); 793b488c1dac8e53206f07103d794a62a3f5012c0f4Daniel Dunbar } 794b488c1dac8e53206f07103d794a62a3f5012c0f4Daniel Dunbar 795e650c8c3bca2f58cad8ffa8aab63126d26e890cdDouglas Gregor if (Args.hasArg(options::OPT__relocatable_pch, true)) 796e650c8c3bca2f58cad8ffa8aab63126d26e890cdDouglas Gregor CmdArgs.push_back("--relocatable-pch"); 7971eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump 7988a5a9aaddb627c0884c2ed8db55cc29fdb601195David Chisnall if (Arg *A = Args.getLastArg(options::OPT_fconstant_string_class_EQ)) { 7998a5a9aaddb627c0884c2ed8db55cc29fdb601195David Chisnall CmdArgs.push_back("-fconstant-string-class"); 8008a5a9aaddb627c0884c2ed8db55cc29fdb601195David Chisnall CmdArgs.push_back(A->getValue(Args)); 8018a5a9aaddb627c0884c2ed8db55cc29fdb601195David Chisnall } 8028a5a9aaddb627c0884c2ed8db55cc29fdb601195David Chisnall 80348d1ef782c8c88066b5febf60f8f456064d7d3f0Daniel Dunbar // Forward -f options which we can pass directly. 8043aaf082689d3235937a2e56a60f90fc1b3aebfb2Daniel Dunbar Args.AddLastArg(CmdArgs, options::OPT_femit_all_decls); 8053aaf082689d3235937a2e56a60f90fc1b3aebfb2Daniel Dunbar Args.AddLastArg(CmdArgs, options::OPT_ffreestanding); 8063aaf082689d3235937a2e56a60f90fc1b3aebfb2Daniel Dunbar Args.AddLastArg(CmdArgs, options::OPT_fheinous_gnu_extensions); 8073aaf082689d3235937a2e56a60f90fc1b3aebfb2Daniel Dunbar Args.AddLastArg(CmdArgs, options::OPT_fgnu_runtime); 8083aaf082689d3235937a2e56a60f90fc1b3aebfb2Daniel Dunbar Args.AddLastArg(CmdArgs, options::OPT_flax_vector_conversions); 809fffd93f38340d4d2ca7ee78a8c91c890b2ff3fa0Douglas Gregor Args.AddLastArg(CmdArgs, options::OPT_fmessage_length_EQ); 8103aaf082689d3235937a2e56a60f90fc1b3aebfb2Daniel Dunbar Args.AddLastArg(CmdArgs, options::OPT_fms_extensions); 8113aaf082689d3235937a2e56a60f90fc1b3aebfb2Daniel Dunbar Args.AddLastArg(CmdArgs, options::OPT_fnext_runtime); 8123aaf082689d3235937a2e56a60f90fc1b3aebfb2Daniel Dunbar Args.AddLastArg(CmdArgs, options::OPT_fno_caret_diagnostics); 8133aaf082689d3235937a2e56a60f90fc1b3aebfb2Daniel Dunbar Args.AddLastArg(CmdArgs, options::OPT_fno_show_column); 8143aaf082689d3235937a2e56a60f90fc1b3aebfb2Daniel Dunbar Args.AddLastArg(CmdArgs, options::OPT_fobjc_gc_only); 8153aaf082689d3235937a2e56a60f90fc1b3aebfb2Daniel Dunbar Args.AddLastArg(CmdArgs, options::OPT_fobjc_gc); 81634e65770ad6142b033d6cec4f476ed20fb248bf3Fariborz Jahanian Args.AddLastArg(CmdArgs, options::OPT_fobjc_sender_dependent_dispatch); 8173aaf082689d3235937a2e56a60f90fc1b3aebfb2Daniel Dunbar // FIXME: Should we remove this? 8183aaf082689d3235937a2e56a60f90fc1b3aebfb2Daniel Dunbar Args.AddLastArg(CmdArgs, options::OPT_fobjc_nonfragile_abi); 819d6884a0b90091a063478ec7fa31f6d76c94e4917Daniel Dunbar Args.AddLastArg(CmdArgs, options::OPT_fobjc_tight_layout); 820182e09240a33c6f1d303deecabec6e0e9c9d109dChris Lattner Args.AddLastArg(CmdArgs, options::OPT_fdiagnostics_print_source_range_info); 8213aaf082689d3235937a2e56a60f90fc1b3aebfb2Daniel Dunbar Args.AddLastArg(CmdArgs, options::OPT_ftime_report); 8223aaf082689d3235937a2e56a60f90fc1b3aebfb2Daniel Dunbar Args.AddLastArg(CmdArgs, options::OPT_ftrapv); 8233aaf082689d3235937a2e56a60f90fc1b3aebfb2Daniel Dunbar Args.AddLastArg(CmdArgs, options::OPT_fvisibility_EQ); 8243aaf082689d3235937a2e56a60f90fc1b3aebfb2Daniel Dunbar Args.AddLastArg(CmdArgs, options::OPT_fwritable_strings); 8251d46033f760ba5fd266ce59fe391fac473f04f52Daniel Dunbar 8265345c391c65d1780a0d7b0102b7f735cc3f82732Daniel Dunbar Args.AddLastArg(CmdArgs, options::OPT_pthread); 8275345c391c65d1780a0d7b0102b7f735cc3f82732Daniel Dunbar 82845483f7a1b3e57b4603b141bee80596b2d4dd443Bill Wendling // Forward stack protector flags. 82945483f7a1b3e57b4603b141bee80596b2d4dd443Bill Wendling if (Arg *A = Args.getLastArg(options::OPT_fno_stack_protector, 83045483f7a1b3e57b4603b141bee80596b2d4dd443Bill Wendling options::OPT_fstack_protector_all, 83145483f7a1b3e57b4603b141bee80596b2d4dd443Bill Wendling options::OPT_fstack_protector)) { 83245483f7a1b3e57b4603b141bee80596b2d4dd443Bill Wendling if (A->getOption().matches(options::OPT_fno_stack_protector)) 83345483f7a1b3e57b4603b141bee80596b2d4dd443Bill Wendling CmdArgs.push_back("--stack-protector=0"); 83445483f7a1b3e57b4603b141bee80596b2d4dd443Bill Wendling else if (A->getOption().matches(options::OPT_fstack_protector)) 83545483f7a1b3e57b4603b141bee80596b2d4dd443Bill Wendling CmdArgs.push_back("--stack-protector=1"); 83645483f7a1b3e57b4603b141bee80596b2d4dd443Bill Wendling else 83745483f7a1b3e57b4603b141bee80596b2d4dd443Bill Wendling CmdArgs.push_back("--stack-protector=2"); 83845483f7a1b3e57b4603b141bee80596b2d4dd443Bill Wendling } 83945483f7a1b3e57b4603b141bee80596b2d4dd443Bill Wendling 84048d1ef782c8c88066b5febf60f8f456064d7d3f0Daniel Dunbar // Forward -f options with positive and negative forms; we translate 84148d1ef782c8c88066b5febf60f8f456064d7d3f0Daniel Dunbar // these by hand. 84248d1ef782c8c88066b5febf60f8f456064d7d3f0Daniel Dunbar 84348d1ef782c8c88066b5febf60f8f456064d7d3f0Daniel Dunbar // -fbuiltin is default, only pass non-default. 84448d1ef782c8c88066b5febf60f8f456064d7d3f0Daniel Dunbar if (!Args.hasFlag(options::OPT_fbuiltin, options::OPT_fno_builtin)) 84548d1ef782c8c88066b5febf60f8f456064d7d3f0Daniel Dunbar CmdArgs.push_back("-fbuiltin=0"); 84648d1ef782c8c88066b5febf60f8f456064d7d3f0Daniel Dunbar 8477695fba30221613b7cf31276456217c41bb90960Daniel Dunbar // -fblocks default varies depending on platform and language; only 8487695fba30221613b7cf31276456217c41bb90960Daniel Dunbar // pass if specified. 84948d1ef782c8c88066b5febf60f8f456064d7d3f0Daniel Dunbar if (Arg *A = Args.getLastArg(options::OPT_fblocks, options::OPT_fno_blocks)) { 85048d1ef782c8c88066b5febf60f8f456064d7d3f0Daniel Dunbar if (A->getOption().matches(options::OPT_fblocks)) 85148d1ef782c8c88066b5febf60f8f456064d7d3f0Daniel Dunbar CmdArgs.push_back("-fblocks"); 85248d1ef782c8c88066b5febf60f8f456064d7d3f0Daniel Dunbar else 85348d1ef782c8c88066b5febf60f8f456064d7d3f0Daniel Dunbar CmdArgs.push_back("-fblocks=0"); 85448d1ef782c8c88066b5febf60f8f456064d7d3f0Daniel Dunbar } 85548d1ef782c8c88066b5febf60f8f456064d7d3f0Daniel Dunbar 85685caf03ee49c4de87ee9624a9b725ef5d20ee624Fariborz Jahanian if (needsExceptions(Args, InputType, getToolChain().getTriple())) 857f759df06d997050559fd925758bcd2cdef24db05Rafael Espindola CmdArgs.push_back("-fexceptions"); 858f759df06d997050559fd925758bcd2cdef24db05Rafael Espindola else 859f759df06d997050559fd925758bcd2cdef24db05Rafael Espindola CmdArgs.push_back("-fexceptions=0"); 860738f8c278da5950d0d4607de2debe0bdfad64185Mike Stump 861738f8c278da5950d0d4607de2debe0bdfad64185Mike Stump // -frtti is default, only pass non-default. 862738f8c278da5950d0d4607de2debe0bdfad64185Mike Stump if (!Args.hasFlag(options::OPT_frtti, options::OPT_fno_rtti)) 863738f8c278da5950d0d4607de2debe0bdfad64185Mike Stump CmdArgs.push_back("-frtti=0"); 864738f8c278da5950d0d4607de2debe0bdfad64185Mike Stump 8655a77973d9bc2c9cdbdb7860dcf3ac795abe258ecEli Friedman // -fsigned-char/-funsigned-char default varies depending on platform; only 8665a77973d9bc2c9cdbdb7860dcf3ac795abe258ecEli Friedman // pass if specified. 8675a77973d9bc2c9cdbdb7860dcf3ac795abe258ecEli Friedman if (Arg *A = Args.getLastArg(options::OPT_fsigned_char, 8685a77973d9bc2c9cdbdb7860dcf3ac795abe258ecEli Friedman options::OPT_funsigned_char)) { 8695a77973d9bc2c9cdbdb7860dcf3ac795abe258ecEli Friedman if (A->getOption().matches(options::OPT_fsigned_char)) 8705a77973d9bc2c9cdbdb7860dcf3ac795abe258ecEli Friedman CmdArgs.push_back("-fsigned-char"); 8715a77973d9bc2c9cdbdb7860dcf3ac795abe258ecEli Friedman else 8725a77973d9bc2c9cdbdb7860dcf3ac795abe258ecEli Friedman CmdArgs.push_back("-fsigned-char=0"); 8735a77973d9bc2c9cdbdb7860dcf3ac795abe258ecEli Friedman } 8745a77973d9bc2c9cdbdb7860dcf3ac795abe258ecEli Friedman 87582d00688525c876bf47bce414dedae9c343e67f5Daniel Dunbar // -fno-pascal-strings is default, only pass non-default. If the 87682d00688525c876bf47bce414dedae9c343e67f5Daniel Dunbar // -tool chain happened to translate to -mpascal-strings, we want to 87782d00688525c876bf47bce414dedae9c343e67f5Daniel Dunbar // -back translate here. 87882d00688525c876bf47bce414dedae9c343e67f5Daniel Dunbar // 87982d00688525c876bf47bce414dedae9c343e67f5Daniel Dunbar // FIXME: This is gross; that translation should be pulled from the 88082d00688525c876bf47bce414dedae9c343e67f5Daniel Dunbar // tool chain. 881c21c485b4fb58ef5d55cf3e523263dd824a2ace4Daniel Dunbar if (Args.hasFlag(options::OPT_fpascal_strings, 88282d00688525c876bf47bce414dedae9c343e67f5Daniel Dunbar options::OPT_fno_pascal_strings, 88382d00688525c876bf47bce414dedae9c343e67f5Daniel Dunbar false) || 88482d00688525c876bf47bce414dedae9c343e67f5Daniel Dunbar Args.hasFlag(options::OPT_mpascal_strings, 88582d00688525c876bf47bce414dedae9c343e67f5Daniel Dunbar options::OPT_mno_pascal_strings, 88682d00688525c876bf47bce414dedae9c343e67f5Daniel Dunbar false)) 88748d1ef782c8c88066b5febf60f8f456064d7d3f0Daniel Dunbar CmdArgs.push_back("-fpascal-strings"); 88848d1ef782c8c88066b5febf60f8f456064d7d3f0Daniel Dunbar 88948d1ef782c8c88066b5febf60f8f456064d7d3f0Daniel Dunbar // -fcommon is default, only pass non-default. 89048d1ef782c8c88066b5febf60f8f456064d7d3f0Daniel Dunbar if (!Args.hasFlag(options::OPT_fcommon, options::OPT_fno_common)) 89148d1ef782c8c88066b5febf60f8f456064d7d3f0Daniel Dunbar CmdArgs.push_back("-fno-common"); 89248d1ef782c8c88066b5febf60f8f456064d7d3f0Daniel Dunbar 89370d3c92820f590b10553da9c96eda24e4325ba34Daniel Dunbar // -fsigned-bitfields is default, and clang doesn't yet support 89470d3c92820f590b10553da9c96eda24e4325ba34Daniel Dunbar // --funsigned-bitfields. 8951eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump if (!Args.hasFlag(options::OPT_fsigned_bitfields, 89670d3c92820f590b10553da9c96eda24e4325ba34Daniel Dunbar options::OPT_funsigned_bitfields)) 89770d3c92820f590b10553da9c96eda24e4325ba34Daniel Dunbar D.Diag(clang::diag::warn_drv_clang_unsupported) 89870d3c92820f590b10553da9c96eda24e4325ba34Daniel Dunbar << Args.getLastArg(options::OPT_funsigned_bitfields)->getAsString(Args); 89970d3c92820f590b10553da9c96eda24e4325ba34Daniel Dunbar 90049138fc59eeac2aacd3b7e04c2642180d5baefd7Daniel Dunbar // -fdiagnostics-fixit-info is default, only pass non-default. 9011eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump if (!Args.hasFlag(options::OPT_fdiagnostics_fixit_info, 90249138fc59eeac2aacd3b7e04c2642180d5baefd7Daniel Dunbar options::OPT_fno_diagnostics_fixit_info)) 90349138fc59eeac2aacd3b7e04c2642180d5baefd7Daniel Dunbar CmdArgs.push_back("-fno-diagnostics-fixit-info"); 90449138fc59eeac2aacd3b7e04c2642180d5baefd7Daniel Dunbar 9059e820ee054fefe5422b4db3f681e567a8976747eDaniel Dunbar // Enable -fdiagnostics-show-option by default. 9061eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump if (Args.hasFlag(options::OPT_fdiagnostics_show_option, 9079e820ee054fefe5422b4db3f681e567a8976747eDaniel Dunbar options::OPT_fno_diagnostics_show_option)) 9089e820ee054fefe5422b4db3f681e567a8976747eDaniel Dunbar CmdArgs.push_back("-fdiagnostics-show-option"); 909a46c71abb1dc2f9758ad1abe3378534fe138e802Torok Edwin if (!Args.hasFlag(options::OPT_fcolor_diagnostics, 91075eb1d64784946a37fc0b27596e2d92b6cf7033bDaniel Dunbar options::OPT_fno_color_diagnostics)) 911a46c71abb1dc2f9758ad1abe3378534fe138e802Torok Edwin CmdArgs.push_back("-fno-color-diagnostics"); 91275eb1d64784946a37fc0b27596e2d92b6cf7033bDaniel Dunbar if (!Args.hasFlag(options::OPT_fshow_source_location, 91375eb1d64784946a37fc0b27596e2d92b6cf7033bDaniel Dunbar options::OPT_fno_show_source_location)) 91475eb1d64784946a37fc0b27596e2d92b6cf7033bDaniel Dunbar CmdArgs.push_back("-fno-show-source-location"); 9159e820ee054fefe5422b4db3f681e567a8976747eDaniel Dunbar 9167695fba30221613b7cf31276456217c41bb90960Daniel Dunbar // -fdollars-in-identifiers default varies depending on platform and 9177695fba30221613b7cf31276456217c41bb90960Daniel Dunbar // language; only pass if specified. 9181eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump if (Arg *A = Args.getLastArg(options::OPT_fdollars_in_identifiers, 9197695fba30221613b7cf31276456217c41bb90960Daniel Dunbar options::OPT_fno_dollars_in_identifiers)) { 9207695fba30221613b7cf31276456217c41bb90960Daniel Dunbar if (A->getOption().matches(options::OPT_fdollars_in_identifiers)) 9217695fba30221613b7cf31276456217c41bb90960Daniel Dunbar CmdArgs.push_back("-fdollars-in-identifiers=1"); 9227695fba30221613b7cf31276456217c41bb90960Daniel Dunbar else 9237695fba30221613b7cf31276456217c41bb90960Daniel Dunbar CmdArgs.push_back("-fdollars-in-identifiers=0"); 9247695fba30221613b7cf31276456217c41bb90960Daniel Dunbar } 9257695fba30221613b7cf31276456217c41bb90960Daniel Dunbar 926e027a4b2399e9b0acfe0f77220c66bbe369067eeDaniel Dunbar // -funit-at-a-time is default, and we don't support -fno-unit-at-a-time for 927e027a4b2399e9b0acfe0f77220c66bbe369067eeDaniel Dunbar // practical purposes. 9281eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump if (Arg *A = Args.getLastArg(options::OPT_funit_at_a_time, 929e027a4b2399e9b0acfe0f77220c66bbe369067eeDaniel Dunbar options::OPT_fno_unit_at_a_time)) { 930e027a4b2399e9b0acfe0f77220c66bbe369067eeDaniel Dunbar if (A->getOption().matches(options::OPT_fno_unit_at_a_time)) 931c37691068db5ceb19c014ddd3e02afa9875f8181Edward O'Callaghan D.Diag(clang::diag::warn_drv_clang_unsupported) << A->getAsString(Args); 932e027a4b2399e9b0acfe0f77220c66bbe369067eeDaniel Dunbar } 933ceb5c5b7f67a30fae305d1d19b478b623e4fbcedEli Friedman 9342ba91575905a54f712a7f64304e56002e4882499Daniel Dunbar // Default to -fno-builtin-str{cat,cpy} on Darwin for ARM. 935f84a4a469d8a45c76cb941595582a0fd3b9b15d3Daniel Dunbar // 936f84a4a469d8a45c76cb941595582a0fd3b9b15d3Daniel Dunbar // FIXME: This is disabled until clang-cc supports -fno-builtin-foo. PR4941. 937f84a4a469d8a45c76cb941595582a0fd3b9b15d3Daniel Dunbar#if 0 9382ba91575905a54f712a7f64304e56002e4882499Daniel Dunbar if (getToolChain().getTriple().getOS() == llvm::Triple::Darwin && 9392ba91575905a54f712a7f64304e56002e4882499Daniel Dunbar (getToolChain().getTriple().getArch() == llvm::Triple::arm || 9402ba91575905a54f712a7f64304e56002e4882499Daniel Dunbar getToolChain().getTriple().getArch() == llvm::Triple::thumb)) { 9412ba91575905a54f712a7f64304e56002e4882499Daniel Dunbar if (!Args.hasArg(options::OPT_fbuiltin_strcat)) 9422ba91575905a54f712a7f64304e56002e4882499Daniel Dunbar CmdArgs.push_back("-fno-builtin-strcat"); 9432ba91575905a54f712a7f64304e56002e4882499Daniel Dunbar if (!Args.hasArg(options::OPT_fbuiltin_strcpy)) 9442ba91575905a54f712a7f64304e56002e4882499Daniel Dunbar CmdArgs.push_back("-fno-builtin-strcpy"); 9452ba91575905a54f712a7f64304e56002e4882499Daniel Dunbar } 946f84a4a469d8a45c76cb941595582a0fd3b9b15d3Daniel Dunbar#endif 9472ba91575905a54f712a7f64304e56002e4882499Daniel Dunbar 9481eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump if (Arg *A = Args.getLastArg(options::OPT_traditional, 949ceb5c5b7f67a30fae305d1d19b478b623e4fbcedEli Friedman options::OPT_traditional_cpp)) 950ceb5c5b7f67a30fae305d1d19b478b623e4fbcedEli Friedman D.Diag(clang::diag::err_drv_clang_unsupported) << A->getAsString(Args); 951ceb5c5b7f67a30fae305d1d19b478b623e4fbcedEli Friedman 9521d46033f760ba5fd266ce59fe391fac473f04f52Daniel Dunbar Args.AddLastArg(CmdArgs, options::OPT_dM); 953d82df3ad430397d7f9ef511e7c5157f997c41f53Chris Lattner Args.AddLastArg(CmdArgs, options::OPT_dD); 9541d46033f760ba5fd266ce59fe391fac473f04f52Daniel Dunbar 9551d46033f760ba5fd266ce59fe391fac473f04f52Daniel Dunbar Args.AddAllArgValues(CmdArgs, options::OPT_Xclang); 956e5280286573d4fe1220cdd66e147b572a05536a8Daniel Dunbar Args.AddAllArgValues(CmdArgs, options::OPT_mllvm); 9571d46033f760ba5fd266ce59fe391fac473f04f52Daniel Dunbar 958cd8e4c44dd068956e9181381be3ee2d49a0fac52Daniel Dunbar if (Output.getType() == types::TY_Dependencies) { 959cd8e4c44dd068956e9181381be3ee2d49a0fac52Daniel Dunbar // Handled with other dependency code. 960a5a7bd0de7b6b80212095195a055a4a43f21d4b2Daniel Dunbar } else if (Output.isPipe()) { 961b488c1dac8e53206f07103d794a62a3f5012c0f4Daniel Dunbar CmdArgs.push_back("-o"); 962b488c1dac8e53206f07103d794a62a3f5012c0f4Daniel Dunbar CmdArgs.push_back("-"); 963115a79277edababaf1b26e3654044ae983197679Daniel Dunbar } else if (Output.isFilename()) { 964b488c1dac8e53206f07103d794a62a3f5012c0f4Daniel Dunbar CmdArgs.push_back("-o"); 965115a79277edababaf1b26e3654044ae983197679Daniel Dunbar CmdArgs.push_back(Output.getFilename()); 966115a79277edababaf1b26e3654044ae983197679Daniel Dunbar } else { 967115a79277edababaf1b26e3654044ae983197679Daniel Dunbar assert(Output.isNothing() && "Invalid output."); 968b488c1dac8e53206f07103d794a62a3f5012c0f4Daniel Dunbar } 969b488c1dac8e53206f07103d794a62a3f5012c0f4Daniel Dunbar 9701d46033f760ba5fd266ce59fe391fac473f04f52Daniel Dunbar for (InputInfoList::const_iterator 9711d46033f760ba5fd266ce59fe391fac473f04f52Daniel Dunbar it = Inputs.begin(), ie = Inputs.end(); it != ie; ++it) { 9721d46033f760ba5fd266ce59fe391fac473f04f52Daniel Dunbar const InputInfo &II = *it; 9731d46033f760ba5fd266ce59fe391fac473f04f52Daniel Dunbar CmdArgs.push_back("-x"); 9741d46033f760ba5fd266ce59fe391fac473f04f52Daniel Dunbar CmdArgs.push_back(types::getTypeName(II.getType())); 9751d46033f760ba5fd266ce59fe391fac473f04f52Daniel Dunbar if (II.isPipe()) 9761d46033f760ba5fd266ce59fe391fac473f04f52Daniel Dunbar CmdArgs.push_back("-"); 977115a79277edababaf1b26e3654044ae983197679Daniel Dunbar else if (II.isFilename()) 978115a79277edababaf1b26e3654044ae983197679Daniel Dunbar CmdArgs.push_back(II.getFilename()); 9791d46033f760ba5fd266ce59fe391fac473f04f52Daniel Dunbar else 980115a79277edababaf1b26e3654044ae983197679Daniel Dunbar II.getInputArg().renderAsInput(Args, CmdArgs); 9811d46033f760ba5fd266ce59fe391fac473f04f52Daniel Dunbar } 982c21c485b4fb58ef5d55cf3e523263dd824a2ace4Daniel Dunbar 983c21c485b4fb58ef5d55cf3e523263dd824a2ace4Daniel Dunbar const char *Exec = 9845ed34f4c58b6ad4e21038d713c1fae31a6146ff5Daniel Dunbar Args.MakeArgString(getToolChain().GetProgramPath(C, "clang-cc")); 985cae087e164e94e4286c11bf694dd0ff88f295302Daniel Dunbar Dest.addCommand(new Command(JA, Exec, CmdArgs)); 986a880db0b0fc028abf754c290d921d809eec0518aDaniel Dunbar 9875c1aaafbd6dd25a99ca1960e1c3c98aeefe9d728Daniel Dunbar // Explicitly warn that these options are unsupported, even though 9885c1aaafbd6dd25a99ca1960e1c3c98aeefe9d728Daniel Dunbar // we are allowing compilation to continue. 9895c1aaafbd6dd25a99ca1960e1c3c98aeefe9d728Daniel Dunbar // FIXME: Use iterator. 990c21c485b4fb58ef5d55cf3e523263dd824a2ace4Daniel Dunbar for (ArgList::const_iterator 9915c1aaafbd6dd25a99ca1960e1c3c98aeefe9d728Daniel Dunbar it = Args.begin(), ie = Args.end(); it != ie; ++it) { 9925c1aaafbd6dd25a99ca1960e1c3c98aeefe9d728Daniel Dunbar const Arg *A = *it; 9935c1aaafbd6dd25a99ca1960e1c3c98aeefe9d728Daniel Dunbar if (A->getOption().matches(options::OPT_pg)) { 9945c1aaafbd6dd25a99ca1960e1c3c98aeefe9d728Daniel Dunbar A->claim(); 995c21c485b4fb58ef5d55cf3e523263dd824a2ace4Daniel Dunbar D.Diag(clang::diag::warn_drv_clang_unsupported) 9965c1aaafbd6dd25a99ca1960e1c3c98aeefe9d728Daniel Dunbar << A->getAsString(Args); 9975c1aaafbd6dd25a99ca1960e1c3c98aeefe9d728Daniel Dunbar } 9985c1aaafbd6dd25a99ca1960e1c3c98aeefe9d728Daniel Dunbar } 9995c1aaafbd6dd25a99ca1960e1c3c98aeefe9d728Daniel Dunbar 100068fb469aeb19144403e703b825854d08353c8eeaDaniel Dunbar // Claim some arguments which clang supports automatically. 100168fb469aeb19144403e703b825854d08353c8eeaDaniel Dunbar 100268fb469aeb19144403e703b825854d08353c8eeaDaniel Dunbar // -fpch-preprocess is used with gcc to add a special marker in the 100368fb469aeb19144403e703b825854d08353c8eeaDaniel Dunbar // -output to include the PCH file. Clang's PTH solution is 100468fb469aeb19144403e703b825854d08353c8eeaDaniel Dunbar // -completely transparent, so we do not need to deal with it at 100568fb469aeb19144403e703b825854d08353c8eeaDaniel Dunbar // -all. 100668fb469aeb19144403e703b825854d08353c8eeaDaniel Dunbar Args.ClaimAllArgs(options::OPT_fpch_preprocess); 1007c21c485b4fb58ef5d55cf3e523263dd824a2ace4Daniel Dunbar 1008a880db0b0fc028abf754c290d921d809eec0518aDaniel Dunbar // Claim some arguments which clang doesn't support, but we don't 1009a880db0b0fc028abf754c290d921d809eec0518aDaniel Dunbar // care to warn the user about. 1010c21c485b4fb58ef5d55cf3e523263dd824a2ace4Daniel Dunbar 1011a880db0b0fc028abf754c290d921d809eec0518aDaniel Dunbar // FIXME: Use iterator. 1012c21c485b4fb58ef5d55cf3e523263dd824a2ace4Daniel Dunbar for (ArgList::const_iterator 1013a880db0b0fc028abf754c290d921d809eec0518aDaniel Dunbar it = Args.begin(), ie = Args.end(); it != ie; ++it) { 1014a880db0b0fc028abf754c290d921d809eec0518aDaniel Dunbar const Arg *A = *it; 101506ef3c3e9be4923b8e29c8e267b0c56afaa14ff3Daniel Dunbar if (A->getOption().matches(options::OPT_clang_ignored_f_Group) || 101616fd3a9f5159b74bfdd65cf290b4bd091088de91Daniel Dunbar A->getOption().matches(options::OPT_clang_ignored_m_Group)) 1017a880db0b0fc028abf754c290d921d809eec0518aDaniel Dunbar A->claim(); 1018a880db0b0fc028abf754c290d921d809eec0518aDaniel Dunbar } 101947ac7d27c44bd64a7d0fc03d4babc196cf2b8230Daniel Dunbar} 102047ac7d27c44bd64a7d0fc03d4babc196cf2b8230Daniel Dunbar 1021b488c1dac8e53206f07103d794a62a3f5012c0f4Daniel Dunbarvoid gcc::Common::ConstructJob(Compilation &C, const JobAction &JA, 1022b488c1dac8e53206f07103d794a62a3f5012c0f4Daniel Dunbar Job &Dest, 1023b488c1dac8e53206f07103d794a62a3f5012c0f4Daniel Dunbar const InputInfo &Output, 1024b488c1dac8e53206f07103d794a62a3f5012c0f4Daniel Dunbar const InputInfoList &Inputs, 10251d46033f760ba5fd266ce59fe391fac473f04f52Daniel Dunbar const ArgList &Args, 1026b488c1dac8e53206f07103d794a62a3f5012c0f4Daniel Dunbar const char *LinkingOutput) const { 1027a8304f67291b0182fb64f3afc621615288dd1d31Daniel Dunbar const Driver &D = getToolChain().getHost().getDriver(); 1028b488c1dac8e53206f07103d794a62a3f5012c0f4Daniel Dunbar ArgStringList CmdArgs; 1029b488c1dac8e53206f07103d794a62a3f5012c0f4Daniel Dunbar 1030c21c485b4fb58ef5d55cf3e523263dd824a2ace4Daniel Dunbar for (ArgList::const_iterator 10311d46033f760ba5fd266ce59fe391fac473f04f52Daniel Dunbar it = Args.begin(), ie = Args.end(); it != ie; ++it) { 1032b488c1dac8e53206f07103d794a62a3f5012c0f4Daniel Dunbar Arg *A = *it; 10337587719c40ebf02bf11e5e66c30bd20e98edebc2Daniel Dunbar if (A->getOption().hasForwardToGCC()) { 10347587719c40ebf02bf11e5e66c30bd20e98edebc2Daniel Dunbar // It is unfortunate that we have to claim here, as this means 10357587719c40ebf02bf11e5e66c30bd20e98edebc2Daniel Dunbar // we will basically never report anything interesting for 10366ecc7a993f939c5255c36c7c0d965fb9c1543f2aDaniel Dunbar // platforms using a generic gcc, even if we are just using gcc 10376ecc7a993f939c5255c36c7c0d965fb9c1543f2aDaniel Dunbar // to get to the assembler. 10387587719c40ebf02bf11e5e66c30bd20e98edebc2Daniel Dunbar A->claim(); 10391d46033f760ba5fd266ce59fe391fac473f04f52Daniel Dunbar A->render(Args, CmdArgs); 10407587719c40ebf02bf11e5e66c30bd20e98edebc2Daniel Dunbar } 1041b488c1dac8e53206f07103d794a62a3f5012c0f4Daniel Dunbar } 1042c21c485b4fb58ef5d55cf3e523263dd824a2ace4Daniel Dunbar 1043b488c1dac8e53206f07103d794a62a3f5012c0f4Daniel Dunbar RenderExtraToolArgs(CmdArgs); 1044b488c1dac8e53206f07103d794a62a3f5012c0f4Daniel Dunbar 1045b488c1dac8e53206f07103d794a62a3f5012c0f4Daniel Dunbar // If using a driver driver, force the arch. 10467cfe31a713d8fcfc2a1328e8fbd8efdeb0aec51bDaniel Dunbar const std::string &Arch = getToolChain().getArchName(); 1047b488c1dac8e53206f07103d794a62a3f5012c0f4Daniel Dunbar if (getToolChain().getHost().useDriverDriver()) { 1048b488c1dac8e53206f07103d794a62a3f5012c0f4Daniel Dunbar CmdArgs.push_back("-arch"); 1049bf54a06f9b771c2a2730cc63eb89bce0522515b5Daniel Dunbar 1050bf54a06f9b771c2a2730cc63eb89bce0522515b5Daniel Dunbar // FIXME: Remove these special cases. 10517cfe31a713d8fcfc2a1328e8fbd8efdeb0aec51bDaniel Dunbar if (Arch == "powerpc") 10527cfe31a713d8fcfc2a1328e8fbd8efdeb0aec51bDaniel Dunbar CmdArgs.push_back("ppc"); 10537cfe31a713d8fcfc2a1328e8fbd8efdeb0aec51bDaniel Dunbar else if (Arch == "powerpc64") 10547cfe31a713d8fcfc2a1328e8fbd8efdeb0aec51bDaniel Dunbar CmdArgs.push_back("ppc64"); 10557cfe31a713d8fcfc2a1328e8fbd8efdeb0aec51bDaniel Dunbar else 1056881376467c46c5c6cc16fa6790271c2c22e1d4f1Daniel Dunbar CmdArgs.push_back(Args.MakeArgString(Arch)); 1057b488c1dac8e53206f07103d794a62a3f5012c0f4Daniel Dunbar } 1058b488c1dac8e53206f07103d794a62a3f5012c0f4Daniel Dunbar 10596ecc7a993f939c5255c36c7c0d965fb9c1543f2aDaniel Dunbar // Try to force gcc to match the tool chain we want, if we recognize 10606ecc7a993f939c5255c36c7c0d965fb9c1543f2aDaniel Dunbar // the arch. 10617cfe31a713d8fcfc2a1328e8fbd8efdeb0aec51bDaniel Dunbar // 10627cfe31a713d8fcfc2a1328e8fbd8efdeb0aec51bDaniel Dunbar // FIXME: The triple class should directly provide the information we want 10637cfe31a713d8fcfc2a1328e8fbd8efdeb0aec51bDaniel Dunbar // here. 10647cfe31a713d8fcfc2a1328e8fbd8efdeb0aec51bDaniel Dunbar if (Arch == "i386" || Arch == "powerpc") 10656ecc7a993f939c5255c36c7c0d965fb9c1543f2aDaniel Dunbar CmdArgs.push_back("-m32"); 10667cfe31a713d8fcfc2a1328e8fbd8efdeb0aec51bDaniel Dunbar else if (Arch == "x86_64" || Arch == "powerpc64") 10676ecc7a993f939c5255c36c7c0d965fb9c1543f2aDaniel Dunbar CmdArgs.push_back("-m64"); 10686ecc7a993f939c5255c36c7c0d965fb9c1543f2aDaniel Dunbar 1069b488c1dac8e53206f07103d794a62a3f5012c0f4Daniel Dunbar if (Output.isPipe()) { 1070b488c1dac8e53206f07103d794a62a3f5012c0f4Daniel Dunbar CmdArgs.push_back("-o"); 1071b488c1dac8e53206f07103d794a62a3f5012c0f4Daniel Dunbar CmdArgs.push_back("-"); 1072115a79277edababaf1b26e3654044ae983197679Daniel Dunbar } else if (Output.isFilename()) { 1073b488c1dac8e53206f07103d794a62a3f5012c0f4Daniel Dunbar CmdArgs.push_back("-o"); 1074115a79277edababaf1b26e3654044ae983197679Daniel Dunbar CmdArgs.push_back(Output.getFilename()); 1075115a79277edababaf1b26e3654044ae983197679Daniel Dunbar } else { 1076115a79277edababaf1b26e3654044ae983197679Daniel Dunbar assert(Output.isNothing() && "Unexpected output"); 1077b488c1dac8e53206f07103d794a62a3f5012c0f4Daniel Dunbar CmdArgs.push_back("-fsyntax-only"); 1078115a79277edababaf1b26e3654044ae983197679Daniel Dunbar } 1079b488c1dac8e53206f07103d794a62a3f5012c0f4Daniel Dunbar 1080b488c1dac8e53206f07103d794a62a3f5012c0f4Daniel Dunbar 1081b488c1dac8e53206f07103d794a62a3f5012c0f4Daniel Dunbar // Only pass -x if gcc will understand it; otherwise hope gcc 1082b488c1dac8e53206f07103d794a62a3f5012c0f4Daniel Dunbar // understands the suffix correctly. The main use case this would go 1083b488c1dac8e53206f07103d794a62a3f5012c0f4Daniel Dunbar // wrong in is for linker inputs if they happened to have an odd 1084b488c1dac8e53206f07103d794a62a3f5012c0f4Daniel Dunbar // suffix; really the only way to get this to happen is a command 1085b488c1dac8e53206f07103d794a62a3f5012c0f4Daniel Dunbar // like '-x foobar a.c' which will treat a.c like a linker input. 1086b488c1dac8e53206f07103d794a62a3f5012c0f4Daniel Dunbar // 1087b488c1dac8e53206f07103d794a62a3f5012c0f4Daniel Dunbar // FIXME: For the linker case specifically, can we safely convert 1088b488c1dac8e53206f07103d794a62a3f5012c0f4Daniel Dunbar // inputs into '-Wl,' options? 1089b488c1dac8e53206f07103d794a62a3f5012c0f4Daniel Dunbar for (InputInfoList::const_iterator 1090b488c1dac8e53206f07103d794a62a3f5012c0f4Daniel Dunbar it = Inputs.begin(), ie = Inputs.end(); it != ie; ++it) { 1091b488c1dac8e53206f07103d794a62a3f5012c0f4Daniel Dunbar const InputInfo &II = *it; 1092a8304f67291b0182fb64f3afc621615288dd1d31Daniel Dunbar 10935915fbf310e171c4cd3c2af05e9de360c0fa988aDaniel Dunbar // Don't try to pass LLVM or AST inputs to a generic gcc. 1094a8304f67291b0182fb64f3afc621615288dd1d31Daniel Dunbar if (II.getType() == types::TY_LLVMBC) 1095a8304f67291b0182fb64f3afc621615288dd1d31Daniel Dunbar D.Diag(clang::diag::err_drv_no_linker_llvm_support) 1096881376467c46c5c6cc16fa6790271c2c22e1d4f1Daniel Dunbar << getToolChain().getTripleString(); 10975915fbf310e171c4cd3c2af05e9de360c0fa988aDaniel Dunbar else if (II.getType() == types::TY_AST) 10985915fbf310e171c4cd3c2af05e9de360c0fa988aDaniel Dunbar D.Diag(clang::diag::err_drv_no_ast_support) 1099881376467c46c5c6cc16fa6790271c2c22e1d4f1Daniel Dunbar << getToolChain().getTripleString(); 1100a8304f67291b0182fb64f3afc621615288dd1d31Daniel Dunbar 1101b488c1dac8e53206f07103d794a62a3f5012c0f4Daniel Dunbar if (types::canTypeBeUserSpecified(II.getType())) { 1102b488c1dac8e53206f07103d794a62a3f5012c0f4Daniel Dunbar CmdArgs.push_back("-x"); 1103b488c1dac8e53206f07103d794a62a3f5012c0f4Daniel Dunbar CmdArgs.push_back(types::getTypeName(II.getType())); 1104b488c1dac8e53206f07103d794a62a3f5012c0f4Daniel Dunbar } 1105b488c1dac8e53206f07103d794a62a3f5012c0f4Daniel Dunbar 1106b488c1dac8e53206f07103d794a62a3f5012c0f4Daniel Dunbar if (II.isPipe()) 1107b488c1dac8e53206f07103d794a62a3f5012c0f4Daniel Dunbar CmdArgs.push_back("-"); 1108115a79277edababaf1b26e3654044ae983197679Daniel Dunbar else if (II.isFilename()) 1109115a79277edababaf1b26e3654044ae983197679Daniel Dunbar CmdArgs.push_back(II.getFilename()); 1110b488c1dac8e53206f07103d794a62a3f5012c0f4Daniel Dunbar else 1111115a79277edababaf1b26e3654044ae983197679Daniel Dunbar // Don't render as input, we need gcc to do the translations. 1112115a79277edababaf1b26e3654044ae983197679Daniel Dunbar II.getInputArg().render(Args, CmdArgs); 1113b488c1dac8e53206f07103d794a62a3f5012c0f4Daniel Dunbar } 1114b488c1dac8e53206f07103d794a62a3f5012c0f4Daniel Dunbar 1115c21c485b4fb58ef5d55cf3e523263dd824a2ace4Daniel Dunbar const char *GCCName = 111678d8a089c8f124ba6f47bb37e2c4a36986f60e23Daniel Dunbar getToolChain().getHost().getDriver().CCCGenericGCCName.c_str(); 1117c21c485b4fb58ef5d55cf3e523263dd824a2ace4Daniel Dunbar const char *Exec = 11185ed34f4c58b6ad4e21038d713c1fae31a6146ff5Daniel Dunbar Args.MakeArgString(getToolChain().GetProgramPath(C, GCCName)); 1119cae087e164e94e4286c11bf694dd0ff88f295302Daniel Dunbar Dest.addCommand(new Command(JA, Exec, CmdArgs)); 112047ac7d27c44bd64a7d0fc03d4babc196cf2b8230Daniel Dunbar} 112147ac7d27c44bd64a7d0fc03d4babc196cf2b8230Daniel Dunbar 1122b488c1dac8e53206f07103d794a62a3f5012c0f4Daniel Dunbarvoid gcc::Preprocess::RenderExtraToolArgs(ArgStringList &CmdArgs) const { 1123b488c1dac8e53206f07103d794a62a3f5012c0f4Daniel Dunbar CmdArgs.push_back("-E"); 112447ac7d27c44bd64a7d0fc03d4babc196cf2b8230Daniel Dunbar} 112547ac7d27c44bd64a7d0fc03d4babc196cf2b8230Daniel Dunbar 1126b488c1dac8e53206f07103d794a62a3f5012c0f4Daniel Dunbarvoid gcc::Precompile::RenderExtraToolArgs(ArgStringList &CmdArgs) const { 1127b488c1dac8e53206f07103d794a62a3f5012c0f4Daniel Dunbar // The type is good enough. 112847ac7d27c44bd64a7d0fc03d4babc196cf2b8230Daniel Dunbar} 112947ac7d27c44bd64a7d0fc03d4babc196cf2b8230Daniel Dunbar 1130b488c1dac8e53206f07103d794a62a3f5012c0f4Daniel Dunbarvoid gcc::Compile::RenderExtraToolArgs(ArgStringList &CmdArgs) const { 1131b488c1dac8e53206f07103d794a62a3f5012c0f4Daniel Dunbar CmdArgs.push_back("-S"); 113247ac7d27c44bd64a7d0fc03d4babc196cf2b8230Daniel Dunbar} 113347ac7d27c44bd64a7d0fc03d4babc196cf2b8230Daniel Dunbar 1134b488c1dac8e53206f07103d794a62a3f5012c0f4Daniel Dunbarvoid gcc::Assemble::RenderExtraToolArgs(ArgStringList &CmdArgs) const { 1135b488c1dac8e53206f07103d794a62a3f5012c0f4Daniel Dunbar CmdArgs.push_back("-c"); 1136b488c1dac8e53206f07103d794a62a3f5012c0f4Daniel Dunbar} 113747ac7d27c44bd64a7d0fc03d4babc196cf2b8230Daniel Dunbar 1138b488c1dac8e53206f07103d794a62a3f5012c0f4Daniel Dunbarvoid gcc::Link::RenderExtraToolArgs(ArgStringList &CmdArgs) const { 1139b488c1dac8e53206f07103d794a62a3f5012c0f4Daniel Dunbar // The types are (hopefully) good enough. 114047ac7d27c44bd64a7d0fc03d4babc196cf2b8230Daniel Dunbar} 1141b488c1dac8e53206f07103d794a62a3f5012c0f4Daniel Dunbar 114240f1265ebd42ece3e7f7917319b56012e8e2bce2Daniel Dunbarconst char *darwin::CC1::getCC1Name(types::ID Type) const { 114340f1265ebd42ece3e7f7917319b56012e8e2bce2Daniel Dunbar switch (Type) { 114440f1265ebd42ece3e7f7917319b56012e8e2bce2Daniel Dunbar default: 114540f1265ebd42ece3e7f7917319b56012e8e2bce2Daniel Dunbar assert(0 && "Unexpected type for Darwin CC1 tool."); 114640f1265ebd42ece3e7f7917319b56012e8e2bce2Daniel Dunbar case types::TY_Asm: 114740f1265ebd42ece3e7f7917319b56012e8e2bce2Daniel Dunbar case types::TY_C: case types::TY_CHeader: 114840f1265ebd42ece3e7f7917319b56012e8e2bce2Daniel Dunbar case types::TY_PP_C: case types::TY_PP_CHeader: 114940f1265ebd42ece3e7f7917319b56012e8e2bce2Daniel Dunbar return "cc1"; 115040f1265ebd42ece3e7f7917319b56012e8e2bce2Daniel Dunbar case types::TY_ObjC: case types::TY_ObjCHeader: 115140f1265ebd42ece3e7f7917319b56012e8e2bce2Daniel Dunbar case types::TY_PP_ObjC: case types::TY_PP_ObjCHeader: 115240f1265ebd42ece3e7f7917319b56012e8e2bce2Daniel Dunbar return "cc1obj"; 115340f1265ebd42ece3e7f7917319b56012e8e2bce2Daniel Dunbar case types::TY_CXX: case types::TY_CXXHeader: 115440f1265ebd42ece3e7f7917319b56012e8e2bce2Daniel Dunbar case types::TY_PP_CXX: case types::TY_PP_CXXHeader: 115540f1265ebd42ece3e7f7917319b56012e8e2bce2Daniel Dunbar return "cc1plus"; 115640f1265ebd42ece3e7f7917319b56012e8e2bce2Daniel Dunbar case types::TY_ObjCXX: case types::TY_ObjCXXHeader: 115740f1265ebd42ece3e7f7917319b56012e8e2bce2Daniel Dunbar case types::TY_PP_ObjCXX: case types::TY_PP_ObjCXXHeader: 115840f1265ebd42ece3e7f7917319b56012e8e2bce2Daniel Dunbar return "cc1objplus"; 115940f1265ebd42ece3e7f7917319b56012e8e2bce2Daniel Dunbar } 116040f1265ebd42ece3e7f7917319b56012e8e2bce2Daniel Dunbar} 116140f1265ebd42ece3e7f7917319b56012e8e2bce2Daniel Dunbar 1162c21c485b4fb58ef5d55cf3e523263dd824a2ace4Daniel Dunbarconst char *darwin::CC1::getBaseInputName(const ArgList &Args, 1163a5a7bd0de7b6b80212095195a055a4a43f21d4b2Daniel Dunbar const InputInfoList &Inputs) { 1164a3ec60e0cf2a1916f479288998d31bd980b1a306Daniel Dunbar llvm::sys::Path P(Inputs[0].getBaseInput()); 1165881376467c46c5c6cc16fa6790271c2c22e1d4f1Daniel Dunbar return Args.MakeArgString(P.getLast()); 1166a3ec60e0cf2a1916f479288998d31bd980b1a306Daniel Dunbar} 1167a3ec60e0cf2a1916f479288998d31bd980b1a306Daniel Dunbar 1168c21c485b4fb58ef5d55cf3e523263dd824a2ace4Daniel Dunbarconst char *darwin::CC1::getBaseInputStem(const ArgList &Args, 1169a5a7bd0de7b6b80212095195a055a4a43f21d4b2Daniel Dunbar const InputInfoList &Inputs) { 1170a3ec60e0cf2a1916f479288998d31bd980b1a306Daniel Dunbar const char *Str = getBaseInputName(Args, Inputs); 1171a3ec60e0cf2a1916f479288998d31bd980b1a306Daniel Dunbar 1172a3ec60e0cf2a1916f479288998d31bd980b1a306Daniel Dunbar if (const char *End = strchr(Str, '.')) 1173881376467c46c5c6cc16fa6790271c2c22e1d4f1Daniel Dunbar return Args.MakeArgString(std::string(Str, End)); 1174a3ec60e0cf2a1916f479288998d31bd980b1a306Daniel Dunbar 1175a3ec60e0cf2a1916f479288998d31bd980b1a306Daniel Dunbar return Str; 1176a3ec60e0cf2a1916f479288998d31bd980b1a306Daniel Dunbar} 1177a3ec60e0cf2a1916f479288998d31bd980b1a306Daniel Dunbar 1178a3ec60e0cf2a1916f479288998d31bd980b1a306Daniel Dunbarconst char * 1179c21c485b4fb58ef5d55cf3e523263dd824a2ace4Daniel Dunbardarwin::CC1::getDependencyFileName(const ArgList &Args, 1180a5a7bd0de7b6b80212095195a055a4a43f21d4b2Daniel Dunbar const InputInfoList &Inputs) { 1181a3ec60e0cf2a1916f479288998d31bd980b1a306Daniel Dunbar // FIXME: Think about this more. 1182a3ec60e0cf2a1916f479288998d31bd980b1a306Daniel Dunbar std::string Res; 1183a3ec60e0cf2a1916f479288998d31bd980b1a306Daniel Dunbar 1184a3ec60e0cf2a1916f479288998d31bd980b1a306Daniel Dunbar if (Arg *OutputOpt = Args.getLastArg(options::OPT_o)) { 1185a3ec60e0cf2a1916f479288998d31bd980b1a306Daniel Dunbar std::string Str(OutputOpt->getValue(Args)); 1186c21c485b4fb58ef5d55cf3e523263dd824a2ace4Daniel Dunbar 1187a3ec60e0cf2a1916f479288998d31bd980b1a306Daniel Dunbar Res = Str.substr(0, Str.rfind('.')); 1188a3ec60e0cf2a1916f479288998d31bd980b1a306Daniel Dunbar } else 1189a5a7bd0de7b6b80212095195a055a4a43f21d4b2Daniel Dunbar Res = darwin::CC1::getBaseInputStem(Args, Inputs); 1190a3ec60e0cf2a1916f479288998d31bd980b1a306Daniel Dunbar 1191881376467c46c5c6cc16fa6790271c2c22e1d4f1Daniel Dunbar return Args.MakeArgString(Res + ".d"); 1192a3ec60e0cf2a1916f479288998d31bd980b1a306Daniel Dunbar} 1193a3ec60e0cf2a1916f479288998d31bd980b1a306Daniel Dunbar 1194c21c485b4fb58ef5d55cf3e523263dd824a2ace4Daniel Dunbarvoid darwin::CC1::AddCC1Args(const ArgList &Args, 1195a3ec60e0cf2a1916f479288998d31bd980b1a306Daniel Dunbar ArgStringList &CmdArgs) const { 1196e2fd66418eca3d70cf6b62087d745d0c5181db69Daniel Dunbar const Driver &D = getToolChain().getHost().getDriver(); 1197e2fd66418eca3d70cf6b62087d745d0c5181db69Daniel Dunbar 1198e2fd66418eca3d70cf6b62087d745d0c5181db69Daniel Dunbar CheckCodeGenerationOptions(D, Args); 1199e2fd66418eca3d70cf6b62087d745d0c5181db69Daniel Dunbar 1200a3ec60e0cf2a1916f479288998d31bd980b1a306Daniel Dunbar // Derived from cc1 spec. 1201a3ec60e0cf2a1916f479288998d31bd980b1a306Daniel Dunbar if (!Args.hasArg(options::OPT_mkernel) && !Args.hasArg(options::OPT_static) && 1202a3ec60e0cf2a1916f479288998d31bd980b1a306Daniel Dunbar !Args.hasArg(options::OPT_mdynamic_no_pic)) 1203a3ec60e0cf2a1916f479288998d31bd980b1a306Daniel Dunbar CmdArgs.push_back("-fPIC"); 1204a3ec60e0cf2a1916f479288998d31bd980b1a306Daniel Dunbar 12052ba91575905a54f712a7f64304e56002e4882499Daniel Dunbar if (getToolChain().getTriple().getArch() == llvm::Triple::arm || 12062ba91575905a54f712a7f64304e56002e4882499Daniel Dunbar getToolChain().getTriple().getArch() == llvm::Triple::thumb) { 12072ba91575905a54f712a7f64304e56002e4882499Daniel Dunbar if (!Args.hasArg(options::OPT_fbuiltin_strcat)) 12082ba91575905a54f712a7f64304e56002e4882499Daniel Dunbar CmdArgs.push_back("-fno-builtin-strcat"); 12092ba91575905a54f712a7f64304e56002e4882499Daniel Dunbar if (!Args.hasArg(options::OPT_fbuiltin_strcpy)) 12102ba91575905a54f712a7f64304e56002e4882499Daniel Dunbar CmdArgs.push_back("-fno-builtin-strcpy"); 12112ba91575905a54f712a7f64304e56002e4882499Daniel Dunbar } 12122ba91575905a54f712a7f64304e56002e4882499Daniel Dunbar 1213a3ec60e0cf2a1916f479288998d31bd980b1a306Daniel Dunbar // gcc has some code here to deal with when no -mmacosx-version-min 1214a3ec60e0cf2a1916f479288998d31bd980b1a306Daniel Dunbar // and no -miphoneos-version-min is present, but this never happens 1215a3ec60e0cf2a1916f479288998d31bd980b1a306Daniel Dunbar // due to tool chain specific argument translation. 1216a3ec60e0cf2a1916f479288998d31bd980b1a306Daniel Dunbar 1217a3ec60e0cf2a1916f479288998d31bd980b1a306Daniel Dunbar if (Args.hasArg(options::OPT_g_Flag) && 1218a3ec60e0cf2a1916f479288998d31bd980b1a306Daniel Dunbar !Args.hasArg(options::OPT_fno_eliminate_unused_debug_symbols)) 1219a3ec60e0cf2a1916f479288998d31bd980b1a306Daniel Dunbar CmdArgs.push_back("-feliminate-unused-debug-symbols"); 1220a3ec60e0cf2a1916f479288998d31bd980b1a306Daniel Dunbar} 1221a3ec60e0cf2a1916f479288998d31bd980b1a306Daniel Dunbar 1222a3ec60e0cf2a1916f479288998d31bd980b1a306Daniel Dunbarvoid darwin::CC1::AddCC1OptionsArgs(const ArgList &Args, ArgStringList &CmdArgs, 1223a3ec60e0cf2a1916f479288998d31bd980b1a306Daniel Dunbar const InputInfoList &Inputs, 1224a3ec60e0cf2a1916f479288998d31bd980b1a306Daniel Dunbar const ArgStringList &OutputArgs) const { 1225a3ec60e0cf2a1916f479288998d31bd980b1a306Daniel Dunbar const Driver &D = getToolChain().getHost().getDriver(); 1226a3ec60e0cf2a1916f479288998d31bd980b1a306Daniel Dunbar 1227a3ec60e0cf2a1916f479288998d31bd980b1a306Daniel Dunbar // Derived from cc1_options spec. 1228a3ec60e0cf2a1916f479288998d31bd980b1a306Daniel Dunbar if (Args.hasArg(options::OPT_fast) || 1229a3ec60e0cf2a1916f479288998d31bd980b1a306Daniel Dunbar Args.hasArg(options::OPT_fastf) || 1230a3ec60e0cf2a1916f479288998d31bd980b1a306Daniel Dunbar Args.hasArg(options::OPT_fastcp)) 1231a3ec60e0cf2a1916f479288998d31bd980b1a306Daniel Dunbar CmdArgs.push_back("-O3"); 1232c21c485b4fb58ef5d55cf3e523263dd824a2ace4Daniel Dunbar 1233a3ec60e0cf2a1916f479288998d31bd980b1a306Daniel Dunbar if (Arg *A = Args.getLastArg(options::OPT_pg)) 1234a3ec60e0cf2a1916f479288998d31bd980b1a306Daniel Dunbar if (Args.hasArg(options::OPT_fomit_frame_pointer)) 1235a3ec60e0cf2a1916f479288998d31bd980b1a306Daniel Dunbar D.Diag(clang::diag::err_drv_argument_not_allowed_with) 1236a3ec60e0cf2a1916f479288998d31bd980b1a306Daniel Dunbar << A->getAsString(Args) << "-fomit-frame-pointer"; 1237a3ec60e0cf2a1916f479288998d31bd980b1a306Daniel Dunbar 1238a3ec60e0cf2a1916f479288998d31bd980b1a306Daniel Dunbar AddCC1Args(Args, CmdArgs); 1239a3ec60e0cf2a1916f479288998d31bd980b1a306Daniel Dunbar 1240a3ec60e0cf2a1916f479288998d31bd980b1a306Daniel Dunbar if (!Args.hasArg(options::OPT_Q)) 1241a3ec60e0cf2a1916f479288998d31bd980b1a306Daniel Dunbar CmdArgs.push_back("-quiet"); 1242a3ec60e0cf2a1916f479288998d31bd980b1a306Daniel Dunbar 1243a3ec60e0cf2a1916f479288998d31bd980b1a306Daniel Dunbar CmdArgs.push_back("-dumpbase"); 1244a5a7bd0de7b6b80212095195a055a4a43f21d4b2Daniel Dunbar CmdArgs.push_back(darwin::CC1::getBaseInputName(Args, Inputs)); 1245a3ec60e0cf2a1916f479288998d31bd980b1a306Daniel Dunbar 1246a3ec60e0cf2a1916f479288998d31bd980b1a306Daniel Dunbar Args.AddAllArgs(CmdArgs, options::OPT_d_Group); 1247a3ec60e0cf2a1916f479288998d31bd980b1a306Daniel Dunbar 1248a3ec60e0cf2a1916f479288998d31bd980b1a306Daniel Dunbar Args.AddAllArgs(CmdArgs, options::OPT_m_Group); 1249a3ec60e0cf2a1916f479288998d31bd980b1a306Daniel Dunbar Args.AddAllArgs(CmdArgs, options::OPT_a_Group); 1250a3ec60e0cf2a1916f479288998d31bd980b1a306Daniel Dunbar 1251a3ec60e0cf2a1916f479288998d31bd980b1a306Daniel Dunbar // FIXME: The goal is to use the user provided -o if that is our 1252a3ec60e0cf2a1916f479288998d31bd980b1a306Daniel Dunbar // final output, otherwise to drive from the original input 1253a3ec60e0cf2a1916f479288998d31bd980b1a306Daniel Dunbar // name. Find a clean way to go about this. 1254a3ec60e0cf2a1916f479288998d31bd980b1a306Daniel Dunbar if ((Args.hasArg(options::OPT_c) || Args.hasArg(options::OPT_S)) && 1255a3ec60e0cf2a1916f479288998d31bd980b1a306Daniel Dunbar Args.hasArg(options::OPT_o)) { 1256a3ec60e0cf2a1916f479288998d31bd980b1a306Daniel Dunbar Arg *OutputOpt = Args.getLastArg(options::OPT_o); 1257a3ec60e0cf2a1916f479288998d31bd980b1a306Daniel Dunbar CmdArgs.push_back("-auxbase-strip"); 1258a3ec60e0cf2a1916f479288998d31bd980b1a306Daniel Dunbar CmdArgs.push_back(OutputOpt->getValue(Args)); 1259a3ec60e0cf2a1916f479288998d31bd980b1a306Daniel Dunbar } else { 1260a3ec60e0cf2a1916f479288998d31bd980b1a306Daniel Dunbar CmdArgs.push_back("-auxbase"); 1261a5a7bd0de7b6b80212095195a055a4a43f21d4b2Daniel Dunbar CmdArgs.push_back(darwin::CC1::getBaseInputStem(Args, Inputs)); 1262a3ec60e0cf2a1916f479288998d31bd980b1a306Daniel Dunbar } 1263a3ec60e0cf2a1916f479288998d31bd980b1a306Daniel Dunbar 1264a3ec60e0cf2a1916f479288998d31bd980b1a306Daniel Dunbar Args.AddAllArgs(CmdArgs, options::OPT_g_Group); 1265a3ec60e0cf2a1916f479288998d31bd980b1a306Daniel Dunbar 1266a3ec60e0cf2a1916f479288998d31bd980b1a306Daniel Dunbar Args.AddAllArgs(CmdArgs, options::OPT_O); 1267a3ec60e0cf2a1916f479288998d31bd980b1a306Daniel Dunbar // FIXME: -Wall is getting some special treatment. Investigate. 1268a3ec60e0cf2a1916f479288998d31bd980b1a306Daniel Dunbar Args.AddAllArgs(CmdArgs, options::OPT_W_Group, options::OPT_pedantic_Group); 1269a3ec60e0cf2a1916f479288998d31bd980b1a306Daniel Dunbar Args.AddLastArg(CmdArgs, options::OPT_w); 1270c21c485b4fb58ef5d55cf3e523263dd824a2ace4Daniel Dunbar Args.AddAllArgs(CmdArgs, options::OPT_std_EQ, options::OPT_ansi, 1271a3ec60e0cf2a1916f479288998d31bd980b1a306Daniel Dunbar options::OPT_trigraphs); 1272a3ff202ee4fb21728e930d5d029ba4925129912cDaniel Dunbar if (!Args.getLastArg(options::OPT_std_EQ, options::OPT_ansi)) { 1273a3ff202ee4fb21728e930d5d029ba4925129912cDaniel Dunbar // Honor -std-default. 1274a3ff202ee4fb21728e930d5d029ba4925129912cDaniel Dunbar Args.AddAllArgsTranslated(CmdArgs, options::OPT_std_default_EQ, 1275a3ff202ee4fb21728e930d5d029ba4925129912cDaniel Dunbar "-std=", /*Joined=*/true); 1276a3ff202ee4fb21728e930d5d029ba4925129912cDaniel Dunbar } 1277a3ff202ee4fb21728e930d5d029ba4925129912cDaniel Dunbar 1278a3ec60e0cf2a1916f479288998d31bd980b1a306Daniel Dunbar if (Args.hasArg(options::OPT_v)) 1279a3ec60e0cf2a1916f479288998d31bd980b1a306Daniel Dunbar CmdArgs.push_back("-version"); 1280a3ec60e0cf2a1916f479288998d31bd980b1a306Daniel Dunbar if (Args.hasArg(options::OPT_pg)) 1281a3ec60e0cf2a1916f479288998d31bd980b1a306Daniel Dunbar CmdArgs.push_back("-p"); 1282a3ec60e0cf2a1916f479288998d31bd980b1a306Daniel Dunbar Args.AddLastArg(CmdArgs, options::OPT_p); 1283c21c485b4fb58ef5d55cf3e523263dd824a2ace4Daniel Dunbar 1284a3ec60e0cf2a1916f479288998d31bd980b1a306Daniel Dunbar // The driver treats -fsyntax-only specially. 12852ba91575905a54f712a7f64304e56002e4882499Daniel Dunbar if (getToolChain().getTriple().getArch() == llvm::Triple::arm || 12862ba91575905a54f712a7f64304e56002e4882499Daniel Dunbar getToolChain().getTriple().getArch() == llvm::Triple::thumb) { 12872ba91575905a54f712a7f64304e56002e4882499Daniel Dunbar // Removes -fbuiltin-str{cat,cpy}; these aren't recognized by cc1 but are 12882ba91575905a54f712a7f64304e56002e4882499Daniel Dunbar // used to inhibit the default -fno-builtin-str{cat,cpy}. 12892ba91575905a54f712a7f64304e56002e4882499Daniel Dunbar // 12902ba91575905a54f712a7f64304e56002e4882499Daniel Dunbar // FIXME: Should we grow a better way to deal with "removing" args? 12912ba91575905a54f712a7f64304e56002e4882499Daniel Dunbar // 12922ba91575905a54f712a7f64304e56002e4882499Daniel Dunbar // FIXME: Use iterator. 12932ba91575905a54f712a7f64304e56002e4882499Daniel Dunbar for (ArgList::const_iterator it = Args.begin(), 12942ba91575905a54f712a7f64304e56002e4882499Daniel Dunbar ie = Args.end(); it != ie; ++it) { 12952ba91575905a54f712a7f64304e56002e4882499Daniel Dunbar const Arg *A = *it; 1296728a512753d85a6ccaae34e81385c8665c2de0e1Daniel Dunbar if (A->getOption().matches(options::OPT_f_Group) || 12972ba91575905a54f712a7f64304e56002e4882499Daniel Dunbar A->getOption().matches(options::OPT_fsyntax_only)) { 12982ba91575905a54f712a7f64304e56002e4882499Daniel Dunbar if (!A->getOption().matches(options::OPT_fbuiltin_strcat) && 12992ba91575905a54f712a7f64304e56002e4882499Daniel Dunbar !A->getOption().matches(options::OPT_fbuiltin_strcpy)) { 13002ba91575905a54f712a7f64304e56002e4882499Daniel Dunbar A->claim(); 13012ba91575905a54f712a7f64304e56002e4882499Daniel Dunbar A->render(Args, CmdArgs); 13022ba91575905a54f712a7f64304e56002e4882499Daniel Dunbar } 13032ba91575905a54f712a7f64304e56002e4882499Daniel Dunbar } 13042ba91575905a54f712a7f64304e56002e4882499Daniel Dunbar } 13052ba91575905a54f712a7f64304e56002e4882499Daniel Dunbar } else 13062ba91575905a54f712a7f64304e56002e4882499Daniel Dunbar Args.AddAllArgs(CmdArgs, options::OPT_f_Group, options::OPT_fsyntax_only); 1307c21c485b4fb58ef5d55cf3e523263dd824a2ace4Daniel Dunbar 1308a3ec60e0cf2a1916f479288998d31bd980b1a306Daniel Dunbar Args.AddAllArgs(CmdArgs, options::OPT_undef); 1309a3ec60e0cf2a1916f479288998d31bd980b1a306Daniel Dunbar if (Args.hasArg(options::OPT_Qn)) 1310a3ec60e0cf2a1916f479288998d31bd980b1a306Daniel Dunbar CmdArgs.push_back("-fno-ident"); 1311c21c485b4fb58ef5d55cf3e523263dd824a2ace4Daniel Dunbar 1312a3ec60e0cf2a1916f479288998d31bd980b1a306Daniel Dunbar // FIXME: This isn't correct. 1313a3ec60e0cf2a1916f479288998d31bd980b1a306Daniel Dunbar //Args.AddLastArg(CmdArgs, options::OPT__help) 1314a3ec60e0cf2a1916f479288998d31bd980b1a306Daniel Dunbar //Args.AddLastArg(CmdArgs, options::OPT__targetHelp) 1315a3ec60e0cf2a1916f479288998d31bd980b1a306Daniel Dunbar 1316a3ec60e0cf2a1916f479288998d31bd980b1a306Daniel Dunbar CmdArgs.append(OutputArgs.begin(), OutputArgs.end()); 1317a3ec60e0cf2a1916f479288998d31bd980b1a306Daniel Dunbar 1318a3ec60e0cf2a1916f479288998d31bd980b1a306Daniel Dunbar // FIXME: Still don't get what is happening here. Investigate. 1319a3ec60e0cf2a1916f479288998d31bd980b1a306Daniel Dunbar Args.AddAllArgs(CmdArgs, options::OPT__param); 1320a3ec60e0cf2a1916f479288998d31bd980b1a306Daniel Dunbar 1321a3ec60e0cf2a1916f479288998d31bd980b1a306Daniel Dunbar if (Args.hasArg(options::OPT_fmudflap) || 1322a3ec60e0cf2a1916f479288998d31bd980b1a306Daniel Dunbar Args.hasArg(options::OPT_fmudflapth)) { 1323a3ec60e0cf2a1916f479288998d31bd980b1a306Daniel Dunbar CmdArgs.push_back("-fno-builtin"); 1324a3ec60e0cf2a1916f479288998d31bd980b1a306Daniel Dunbar CmdArgs.push_back("-fno-merge-constants"); 1325a3ec60e0cf2a1916f479288998d31bd980b1a306Daniel Dunbar } 1326c21c485b4fb58ef5d55cf3e523263dd824a2ace4Daniel Dunbar 1327a3ec60e0cf2a1916f479288998d31bd980b1a306Daniel Dunbar if (Args.hasArg(options::OPT_coverage)) { 1328a3ec60e0cf2a1916f479288998d31bd980b1a306Daniel Dunbar CmdArgs.push_back("-fprofile-arcs"); 1329a3ec60e0cf2a1916f479288998d31bd980b1a306Daniel Dunbar CmdArgs.push_back("-ftest-coverage"); 1330a3ec60e0cf2a1916f479288998d31bd980b1a306Daniel Dunbar } 1331a3ec60e0cf2a1916f479288998d31bd980b1a306Daniel Dunbar 1332a3ec60e0cf2a1916f479288998d31bd980b1a306Daniel Dunbar if (types::isCXX(Inputs[0].getType())) 1333a3ec60e0cf2a1916f479288998d31bd980b1a306Daniel Dunbar CmdArgs.push_back("-D__private_extern__=extern"); 1334a3ec60e0cf2a1916f479288998d31bd980b1a306Daniel Dunbar} 1335a3ec60e0cf2a1916f479288998d31bd980b1a306Daniel Dunbar 1336a3ec60e0cf2a1916f479288998d31bd980b1a306Daniel Dunbarvoid darwin::CC1::AddCPPOptionsArgs(const ArgList &Args, ArgStringList &CmdArgs, 1337a3ec60e0cf2a1916f479288998d31bd980b1a306Daniel Dunbar const InputInfoList &Inputs, 1338a3ec60e0cf2a1916f479288998d31bd980b1a306Daniel Dunbar const ArgStringList &OutputArgs) const { 1339a3ec60e0cf2a1916f479288998d31bd980b1a306Daniel Dunbar // Derived from cpp_options 1340a3ec60e0cf2a1916f479288998d31bd980b1a306Daniel Dunbar AddCPPUniqueOptionsArgs(Args, CmdArgs, Inputs); 1341c21c485b4fb58ef5d55cf3e523263dd824a2ace4Daniel Dunbar 1342a3ec60e0cf2a1916f479288998d31bd980b1a306Daniel Dunbar CmdArgs.append(OutputArgs.begin(), OutputArgs.end()); 1343a3ec60e0cf2a1916f479288998d31bd980b1a306Daniel Dunbar 1344a3ec60e0cf2a1916f479288998d31bd980b1a306Daniel Dunbar AddCC1Args(Args, CmdArgs); 1345a3ec60e0cf2a1916f479288998d31bd980b1a306Daniel Dunbar 1346a3ec60e0cf2a1916f479288998d31bd980b1a306Daniel Dunbar // NOTE: The code below has some commonality with cpp_options, but 1347a3ec60e0cf2a1916f479288998d31bd980b1a306Daniel Dunbar // in classic gcc style ends up sending things in different 1348a3ec60e0cf2a1916f479288998d31bd980b1a306Daniel Dunbar // orders. This may be a good merge candidate once we drop pedantic 1349a3ec60e0cf2a1916f479288998d31bd980b1a306Daniel Dunbar // compatibility. 1350a3ec60e0cf2a1916f479288998d31bd980b1a306Daniel Dunbar 1351a3ec60e0cf2a1916f479288998d31bd980b1a306Daniel Dunbar Args.AddAllArgs(CmdArgs, options::OPT_m_Group); 1352c21c485b4fb58ef5d55cf3e523263dd824a2ace4Daniel Dunbar Args.AddAllArgs(CmdArgs, options::OPT_std_EQ, options::OPT_ansi, 1353a3ec60e0cf2a1916f479288998d31bd980b1a306Daniel Dunbar options::OPT_trigraphs); 1354a3ff202ee4fb21728e930d5d029ba4925129912cDaniel Dunbar if (!Args.getLastArg(options::OPT_std_EQ, options::OPT_ansi)) { 1355a3ff202ee4fb21728e930d5d029ba4925129912cDaniel Dunbar // Honor -std-default. 1356a3ff202ee4fb21728e930d5d029ba4925129912cDaniel Dunbar Args.AddAllArgsTranslated(CmdArgs, options::OPT_std_default_EQ, 1357a3ff202ee4fb21728e930d5d029ba4925129912cDaniel Dunbar "-std=", /*Joined=*/true); 1358a3ff202ee4fb21728e930d5d029ba4925129912cDaniel Dunbar } 1359a3ec60e0cf2a1916f479288998d31bd980b1a306Daniel Dunbar Args.AddAllArgs(CmdArgs, options::OPT_W_Group, options::OPT_pedantic_Group); 1360a3ec60e0cf2a1916f479288998d31bd980b1a306Daniel Dunbar Args.AddLastArg(CmdArgs, options::OPT_w); 1361c21c485b4fb58ef5d55cf3e523263dd824a2ace4Daniel Dunbar 1362a3ec60e0cf2a1916f479288998d31bd980b1a306Daniel Dunbar // The driver treats -fsyntax-only specially. 1363a3ec60e0cf2a1916f479288998d31bd980b1a306Daniel Dunbar Args.AddAllArgs(CmdArgs, options::OPT_f_Group, options::OPT_fsyntax_only); 1364a3ec60e0cf2a1916f479288998d31bd980b1a306Daniel Dunbar 1365a3ec60e0cf2a1916f479288998d31bd980b1a306Daniel Dunbar if (Args.hasArg(options::OPT_g_Group) && !Args.hasArg(options::OPT_g0) && 1366a3ec60e0cf2a1916f479288998d31bd980b1a306Daniel Dunbar !Args.hasArg(options::OPT_fno_working_directory)) 1367a3ec60e0cf2a1916f479288998d31bd980b1a306Daniel Dunbar CmdArgs.push_back("-fworking-directory"); 1368a3ec60e0cf2a1916f479288998d31bd980b1a306Daniel Dunbar 1369a3ec60e0cf2a1916f479288998d31bd980b1a306Daniel Dunbar Args.AddAllArgs(CmdArgs, options::OPT_O); 1370a3ec60e0cf2a1916f479288998d31bd980b1a306Daniel Dunbar Args.AddAllArgs(CmdArgs, options::OPT_undef); 1371a3ec60e0cf2a1916f479288998d31bd980b1a306Daniel Dunbar if (Args.hasArg(options::OPT_save_temps)) 1372a3ec60e0cf2a1916f479288998d31bd980b1a306Daniel Dunbar CmdArgs.push_back("-fpch-preprocess"); 1373a3ec60e0cf2a1916f479288998d31bd980b1a306Daniel Dunbar} 1374a3ec60e0cf2a1916f479288998d31bd980b1a306Daniel Dunbar 1375c21c485b4fb58ef5d55cf3e523263dd824a2ace4Daniel Dunbarvoid darwin::CC1::AddCPPUniqueOptionsArgs(const ArgList &Args, 1376a3ec60e0cf2a1916f479288998d31bd980b1a306Daniel Dunbar ArgStringList &CmdArgs, 13771eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump const InputInfoList &Inputs) const { 1378a3ec60e0cf2a1916f479288998d31bd980b1a306Daniel Dunbar const Driver &D = getToolChain().getHost().getDriver(); 1379a3ec60e0cf2a1916f479288998d31bd980b1a306Daniel Dunbar 138088a3d6cf5ebab81614f89ba48a8d89023270637aDaniel Dunbar CheckPreprocessingOptions(D, Args); 138188a3d6cf5ebab81614f89ba48a8d89023270637aDaniel Dunbar 1382a3ec60e0cf2a1916f479288998d31bd980b1a306Daniel Dunbar // Derived from cpp_unique_options. 138388a3d6cf5ebab81614f89ba48a8d89023270637aDaniel Dunbar // -{C,CC} only with -E is checked in CheckPreprocessingOptions(). 138488a3d6cf5ebab81614f89ba48a8d89023270637aDaniel Dunbar Args.AddLastArg(CmdArgs, options::OPT_C); 138588a3d6cf5ebab81614f89ba48a8d89023270637aDaniel Dunbar Args.AddLastArg(CmdArgs, options::OPT_CC); 1386a3ec60e0cf2a1916f479288998d31bd980b1a306Daniel Dunbar if (!Args.hasArg(options::OPT_Q)) 1387a3ec60e0cf2a1916f479288998d31bd980b1a306Daniel Dunbar CmdArgs.push_back("-quiet"); 1388a3ec60e0cf2a1916f479288998d31bd980b1a306Daniel Dunbar Args.AddAllArgs(CmdArgs, options::OPT_nostdinc); 1389a3ec60e0cf2a1916f479288998d31bd980b1a306Daniel Dunbar Args.AddLastArg(CmdArgs, options::OPT_v); 1390a3ec60e0cf2a1916f479288998d31bd980b1a306Daniel Dunbar Args.AddAllArgs(CmdArgs, options::OPT_I_Group, options::OPT_F); 1391a3ec60e0cf2a1916f479288998d31bd980b1a306Daniel Dunbar Args.AddLastArg(CmdArgs, options::OPT_P); 1392a3ec60e0cf2a1916f479288998d31bd980b1a306Daniel Dunbar 1393a3ec60e0cf2a1916f479288998d31bd980b1a306Daniel Dunbar // FIXME: Handle %I properly. 1394a3ec60e0cf2a1916f479288998d31bd980b1a306Daniel Dunbar if (getToolChain().getArchName() == "x86_64") { 1395a3ec60e0cf2a1916f479288998d31bd980b1a306Daniel Dunbar CmdArgs.push_back("-imultilib"); 1396a3ec60e0cf2a1916f479288998d31bd980b1a306Daniel Dunbar CmdArgs.push_back("x86_64"); 1397a3ec60e0cf2a1916f479288998d31bd980b1a306Daniel Dunbar } 1398a3ec60e0cf2a1916f479288998d31bd980b1a306Daniel Dunbar 1399a3ec60e0cf2a1916f479288998d31bd980b1a306Daniel Dunbar if (Args.hasArg(options::OPT_MD)) { 1400a3ec60e0cf2a1916f479288998d31bd980b1a306Daniel Dunbar CmdArgs.push_back("-MD"); 1401a5a7bd0de7b6b80212095195a055a4a43f21d4b2Daniel Dunbar CmdArgs.push_back(darwin::CC1::getDependencyFileName(Args, Inputs)); 1402a3ec60e0cf2a1916f479288998d31bd980b1a306Daniel Dunbar } 1403a3ec60e0cf2a1916f479288998d31bd980b1a306Daniel Dunbar 1404a3ec60e0cf2a1916f479288998d31bd980b1a306Daniel Dunbar if (Args.hasArg(options::OPT_MMD)) { 1405a3ec60e0cf2a1916f479288998d31bd980b1a306Daniel Dunbar CmdArgs.push_back("-MMD"); 1406a5a7bd0de7b6b80212095195a055a4a43f21d4b2Daniel Dunbar CmdArgs.push_back(darwin::CC1::getDependencyFileName(Args, Inputs)); 1407a3ec60e0cf2a1916f479288998d31bd980b1a306Daniel Dunbar } 1408a3ec60e0cf2a1916f479288998d31bd980b1a306Daniel Dunbar 1409a3ec60e0cf2a1916f479288998d31bd980b1a306Daniel Dunbar Args.AddLastArg(CmdArgs, options::OPT_M); 1410a3ec60e0cf2a1916f479288998d31bd980b1a306Daniel Dunbar Args.AddLastArg(CmdArgs, options::OPT_MM); 1411a3ec60e0cf2a1916f479288998d31bd980b1a306Daniel Dunbar Args.AddAllArgs(CmdArgs, options::OPT_MF); 1412a3ec60e0cf2a1916f479288998d31bd980b1a306Daniel Dunbar Args.AddLastArg(CmdArgs, options::OPT_MG); 1413a3ec60e0cf2a1916f479288998d31bd980b1a306Daniel Dunbar Args.AddLastArg(CmdArgs, options::OPT_MP); 1414a3ec60e0cf2a1916f479288998d31bd980b1a306Daniel Dunbar Args.AddAllArgs(CmdArgs, options::OPT_MQ); 1415a3ec60e0cf2a1916f479288998d31bd980b1a306Daniel Dunbar Args.AddAllArgs(CmdArgs, options::OPT_MT); 1416a3ec60e0cf2a1916f479288998d31bd980b1a306Daniel Dunbar if (!Args.hasArg(options::OPT_M) && !Args.hasArg(options::OPT_MM) && 1417a3ec60e0cf2a1916f479288998d31bd980b1a306Daniel Dunbar (Args.hasArg(options::OPT_MD) || Args.hasArg(options::OPT_MMD))) { 1418a3ec60e0cf2a1916f479288998d31bd980b1a306Daniel Dunbar if (Arg *OutputOpt = Args.getLastArg(options::OPT_o)) { 1419a3ec60e0cf2a1916f479288998d31bd980b1a306Daniel Dunbar CmdArgs.push_back("-MQ"); 1420a3ec60e0cf2a1916f479288998d31bd980b1a306Daniel Dunbar CmdArgs.push_back(OutputOpt->getValue(Args)); 1421a3ec60e0cf2a1916f479288998d31bd980b1a306Daniel Dunbar } 1422a3ec60e0cf2a1916f479288998d31bd980b1a306Daniel Dunbar } 1423a3ec60e0cf2a1916f479288998d31bd980b1a306Daniel Dunbar 1424a3ec60e0cf2a1916f479288998d31bd980b1a306Daniel Dunbar Args.AddLastArg(CmdArgs, options::OPT_remap); 1425a3ec60e0cf2a1916f479288998d31bd980b1a306Daniel Dunbar if (Args.hasArg(options::OPT_g3)) 1426a3ec60e0cf2a1916f479288998d31bd980b1a306Daniel Dunbar CmdArgs.push_back("-dD"); 1427a3ec60e0cf2a1916f479288998d31bd980b1a306Daniel Dunbar Args.AddLastArg(CmdArgs, options::OPT_H); 1428a3ec60e0cf2a1916f479288998d31bd980b1a306Daniel Dunbar 1429a3ec60e0cf2a1916f479288998d31bd980b1a306Daniel Dunbar AddCPPArgs(Args, CmdArgs); 1430a3ec60e0cf2a1916f479288998d31bd980b1a306Daniel Dunbar 1431a3ec60e0cf2a1916f479288998d31bd980b1a306Daniel Dunbar Args.AddAllArgs(CmdArgs, options::OPT_D, options::OPT_U, options::OPT_A); 1432a3ec60e0cf2a1916f479288998d31bd980b1a306Daniel Dunbar Args.AddAllArgs(CmdArgs, options::OPT_i_Group); 1433a3ec60e0cf2a1916f479288998d31bd980b1a306Daniel Dunbar 1434a3ec60e0cf2a1916f479288998d31bd980b1a306Daniel Dunbar for (InputInfoList::const_iterator 1435a3ec60e0cf2a1916f479288998d31bd980b1a306Daniel Dunbar it = Inputs.begin(), ie = Inputs.end(); it != ie; ++it) { 1436a3ec60e0cf2a1916f479288998d31bd980b1a306Daniel Dunbar const InputInfo &II = *it; 1437c21c485b4fb58ef5d55cf3e523263dd824a2ace4Daniel Dunbar 1438a3ec60e0cf2a1916f479288998d31bd980b1a306Daniel Dunbar if (II.isPipe()) 1439a3ec60e0cf2a1916f479288998d31bd980b1a306Daniel Dunbar CmdArgs.push_back("-"); 1440a3ec60e0cf2a1916f479288998d31bd980b1a306Daniel Dunbar else 1441a3ec60e0cf2a1916f479288998d31bd980b1a306Daniel Dunbar CmdArgs.push_back(II.getFilename()); 1442a3ec60e0cf2a1916f479288998d31bd980b1a306Daniel Dunbar } 1443a3ec60e0cf2a1916f479288998d31bd980b1a306Daniel Dunbar 1444a3ec60e0cf2a1916f479288998d31bd980b1a306Daniel Dunbar Args.AddAllArgValues(CmdArgs, options::OPT_Wp_COMMA, 1445a3ec60e0cf2a1916f479288998d31bd980b1a306Daniel Dunbar options::OPT_Xpreprocessor); 1446a3ec60e0cf2a1916f479288998d31bd980b1a306Daniel Dunbar 1447a3ec60e0cf2a1916f479288998d31bd980b1a306Daniel Dunbar if (Args.hasArg(options::OPT_fmudflap)) { 1448a3ec60e0cf2a1916f479288998d31bd980b1a306Daniel Dunbar CmdArgs.push_back("-D_MUDFLAP"); 1449a3ec60e0cf2a1916f479288998d31bd980b1a306Daniel Dunbar CmdArgs.push_back("-include"); 1450a3ec60e0cf2a1916f479288998d31bd980b1a306Daniel Dunbar CmdArgs.push_back("mf-runtime.h"); 1451a3ec60e0cf2a1916f479288998d31bd980b1a306Daniel Dunbar } 1452a3ec60e0cf2a1916f479288998d31bd980b1a306Daniel Dunbar 1453a3ec60e0cf2a1916f479288998d31bd980b1a306Daniel Dunbar if (Args.hasArg(options::OPT_fmudflapth)) { 1454a3ec60e0cf2a1916f479288998d31bd980b1a306Daniel Dunbar CmdArgs.push_back("-D_MUDFLAP"); 1455a3ec60e0cf2a1916f479288998d31bd980b1a306Daniel Dunbar CmdArgs.push_back("-D_MUDFLAPTH"); 1456a3ec60e0cf2a1916f479288998d31bd980b1a306Daniel Dunbar CmdArgs.push_back("-include"); 1457a3ec60e0cf2a1916f479288998d31bd980b1a306Daniel Dunbar CmdArgs.push_back("mf-runtime.h"); 1458a3ec60e0cf2a1916f479288998d31bd980b1a306Daniel Dunbar } 1459a3ec60e0cf2a1916f479288998d31bd980b1a306Daniel Dunbar} 1460a3ec60e0cf2a1916f479288998d31bd980b1a306Daniel Dunbar 1461c21c485b4fb58ef5d55cf3e523263dd824a2ace4Daniel Dunbarvoid darwin::CC1::AddCPPArgs(const ArgList &Args, 1462a3ec60e0cf2a1916f479288998d31bd980b1a306Daniel Dunbar ArgStringList &CmdArgs) const { 1463a3ec60e0cf2a1916f479288998d31bd980b1a306Daniel Dunbar // Derived from cpp spec. 1464a3ec60e0cf2a1916f479288998d31bd980b1a306Daniel Dunbar 1465a3ec60e0cf2a1916f479288998d31bd980b1a306Daniel Dunbar if (Args.hasArg(options::OPT_static)) { 1466a3ec60e0cf2a1916f479288998d31bd980b1a306Daniel Dunbar // The gcc spec is broken here, it refers to dynamic but 1467a3ec60e0cf2a1916f479288998d31bd980b1a306Daniel Dunbar // that has been translated. Start by being bug compatible. 1468c21c485b4fb58ef5d55cf3e523263dd824a2ace4Daniel Dunbar 1469a3ec60e0cf2a1916f479288998d31bd980b1a306Daniel Dunbar // if (!Args.hasArg(arglist.parser.dynamicOption)) 1470a3ec60e0cf2a1916f479288998d31bd980b1a306Daniel Dunbar CmdArgs.push_back("-D__STATIC__"); 1471a3ec60e0cf2a1916f479288998d31bd980b1a306Daniel Dunbar } else 1472a3ec60e0cf2a1916f479288998d31bd980b1a306Daniel Dunbar CmdArgs.push_back("-D__DYNAMIC__"); 1473a3ec60e0cf2a1916f479288998d31bd980b1a306Daniel Dunbar 1474a3ec60e0cf2a1916f479288998d31bd980b1a306Daniel Dunbar if (Args.hasArg(options::OPT_pthread)) 1475a3ec60e0cf2a1916f479288998d31bd980b1a306Daniel Dunbar CmdArgs.push_back("-D_REENTRANT"); 1476a3ec60e0cf2a1916f479288998d31bd980b1a306Daniel Dunbar} 1477a3ec60e0cf2a1916f479288998d31bd980b1a306Daniel Dunbar 147840f1265ebd42ece3e7f7917319b56012e8e2bce2Daniel Dunbarvoid darwin::Preprocess::ConstructJob(Compilation &C, const JobAction &JA, 1479c21c485b4fb58ef5d55cf3e523263dd824a2ace4Daniel Dunbar Job &Dest, const InputInfo &Output, 1480c21c485b4fb58ef5d55cf3e523263dd824a2ace4Daniel Dunbar const InputInfoList &Inputs, 1481c21c485b4fb58ef5d55cf3e523263dd824a2ace4Daniel Dunbar const ArgList &Args, 148240f1265ebd42ece3e7f7917319b56012e8e2bce2Daniel Dunbar const char *LinkingOutput) const { 148340f1265ebd42ece3e7f7917319b56012e8e2bce2Daniel Dunbar ArgStringList CmdArgs; 148440f1265ebd42ece3e7f7917319b56012e8e2bce2Daniel Dunbar 148540f1265ebd42ece3e7f7917319b56012e8e2bce2Daniel Dunbar assert(Inputs.size() == 1 && "Unexpected number of inputs!"); 148640f1265ebd42ece3e7f7917319b56012e8e2bce2Daniel Dunbar 148740f1265ebd42ece3e7f7917319b56012e8e2bce2Daniel Dunbar CmdArgs.push_back("-E"); 148840f1265ebd42ece3e7f7917319b56012e8e2bce2Daniel Dunbar 148940f1265ebd42ece3e7f7917319b56012e8e2bce2Daniel Dunbar if (Args.hasArg(options::OPT_traditional) || 149040f1265ebd42ece3e7f7917319b56012e8e2bce2Daniel Dunbar Args.hasArg(options::OPT_traditional_cpp)) 149140f1265ebd42ece3e7f7917319b56012e8e2bce2Daniel Dunbar CmdArgs.push_back("-traditional-cpp"); 1492c21c485b4fb58ef5d55cf3e523263dd824a2ace4Daniel Dunbar 149340f1265ebd42ece3e7f7917319b56012e8e2bce2Daniel Dunbar ArgStringList OutputArgs; 149440f1265ebd42ece3e7f7917319b56012e8e2bce2Daniel Dunbar if (Output.isFilename()) { 149540f1265ebd42ece3e7f7917319b56012e8e2bce2Daniel Dunbar OutputArgs.push_back("-o"); 149640f1265ebd42ece3e7f7917319b56012e8e2bce2Daniel Dunbar OutputArgs.push_back(Output.getFilename()); 149740f1265ebd42ece3e7f7917319b56012e8e2bce2Daniel Dunbar } else { 149840f1265ebd42ece3e7f7917319b56012e8e2bce2Daniel Dunbar assert(Output.isPipe() && "Unexpected CC1 output."); 149940f1265ebd42ece3e7f7917319b56012e8e2bce2Daniel Dunbar } 150040f1265ebd42ece3e7f7917319b56012e8e2bce2Daniel Dunbar 15019120f179fd2e354f067e4ef2c76dcf3fc4db8a16Daniel Dunbar if (Args.hasArg(options::OPT_E)) { 15029120f179fd2e354f067e4ef2c76dcf3fc4db8a16Daniel Dunbar AddCPPOptionsArgs(Args, CmdArgs, Inputs, OutputArgs); 15039120f179fd2e354f067e4ef2c76dcf3fc4db8a16Daniel Dunbar } else { 15049120f179fd2e354f067e4ef2c76dcf3fc4db8a16Daniel Dunbar AddCPPOptionsArgs(Args, CmdArgs, Inputs, ArgStringList()); 15059120f179fd2e354f067e4ef2c76dcf3fc4db8a16Daniel Dunbar CmdArgs.append(OutputArgs.begin(), OutputArgs.end()); 15069120f179fd2e354f067e4ef2c76dcf3fc4db8a16Daniel Dunbar } 1507c21c485b4fb58ef5d55cf3e523263dd824a2ace4Daniel Dunbar 15088a2073a85670a13b0bcc1726bc7f80d458f8245bDaniel Dunbar Args.AddAllArgs(CmdArgs, options::OPT_d_Group); 15098a2073a85670a13b0bcc1726bc7f80d458f8245bDaniel Dunbar 151040f1265ebd42ece3e7f7917319b56012e8e2bce2Daniel Dunbar const char *CC1Name = getCC1Name(Inputs[0].getType()); 1511c21c485b4fb58ef5d55cf3e523263dd824a2ace4Daniel Dunbar const char *Exec = 15125ed34f4c58b6ad4e21038d713c1fae31a6146ff5Daniel Dunbar Args.MakeArgString(getToolChain().GetProgramPath(C, CC1Name)); 1513cae087e164e94e4286c11bf694dd0ff88f295302Daniel Dunbar Dest.addCommand(new Command(JA, Exec, CmdArgs)); 151440f1265ebd42ece3e7f7917319b56012e8e2bce2Daniel Dunbar} 151540f1265ebd42ece3e7f7917319b56012e8e2bce2Daniel Dunbar 151640f1265ebd42ece3e7f7917319b56012e8e2bce2Daniel Dunbarvoid darwin::Compile::ConstructJob(Compilation &C, const JobAction &JA, 1517c21c485b4fb58ef5d55cf3e523263dd824a2ace4Daniel Dunbar Job &Dest, const InputInfo &Output, 1518c21c485b4fb58ef5d55cf3e523263dd824a2ace4Daniel Dunbar const InputInfoList &Inputs, 1519c21c485b4fb58ef5d55cf3e523263dd824a2ace4Daniel Dunbar const ArgList &Args, 152040f1265ebd42ece3e7f7917319b56012e8e2bce2Daniel Dunbar const char *LinkingOutput) const { 152140f1265ebd42ece3e7f7917319b56012e8e2bce2Daniel Dunbar const Driver &D = getToolChain().getHost().getDriver(); 152240f1265ebd42ece3e7f7917319b56012e8e2bce2Daniel Dunbar ArgStringList CmdArgs; 152340f1265ebd42ece3e7f7917319b56012e8e2bce2Daniel Dunbar 152440f1265ebd42ece3e7f7917319b56012e8e2bce2Daniel Dunbar assert(Inputs.size() == 1 && "Unexpected number of inputs!"); 152540f1265ebd42ece3e7f7917319b56012e8e2bce2Daniel Dunbar 152640f1265ebd42ece3e7f7917319b56012e8e2bce2Daniel Dunbar types::ID InputType = Inputs[0].getType(); 152740f1265ebd42ece3e7f7917319b56012e8e2bce2Daniel Dunbar const Arg *A; 1528ceb5c5b7f67a30fae305d1d19b478b623e4fbcedEli Friedman if ((A = Args.getLastArg(options::OPT_traditional))) 152940f1265ebd42ece3e7f7917319b56012e8e2bce2Daniel Dunbar D.Diag(clang::diag::err_drv_argument_only_allowed_with) 153040f1265ebd42ece3e7f7917319b56012e8e2bce2Daniel Dunbar << A->getAsString(Args) << "-E"; 153140f1265ebd42ece3e7f7917319b56012e8e2bce2Daniel Dunbar 153240f1265ebd42ece3e7f7917319b56012e8e2bce2Daniel Dunbar if (Output.getType() == types::TY_LLVMAsm) 153340f1265ebd42ece3e7f7917319b56012e8e2bce2Daniel Dunbar CmdArgs.push_back("-emit-llvm"); 153440f1265ebd42ece3e7f7917319b56012e8e2bce2Daniel Dunbar else if (Output.getType() == types::TY_LLVMBC) 153540f1265ebd42ece3e7f7917319b56012e8e2bce2Daniel Dunbar CmdArgs.push_back("-emit-llvm-bc"); 15365915fbf310e171c4cd3c2af05e9de360c0fa988aDaniel Dunbar else if (Output.getType() == types::TY_AST) 15375915fbf310e171c4cd3c2af05e9de360c0fa988aDaniel Dunbar D.Diag(clang::diag::err_drv_no_ast_support) 1538881376467c46c5c6cc16fa6790271c2c22e1d4f1Daniel Dunbar << getToolChain().getTripleString(); 153940f1265ebd42ece3e7f7917319b56012e8e2bce2Daniel Dunbar 154040f1265ebd42ece3e7f7917319b56012e8e2bce2Daniel Dunbar ArgStringList OutputArgs; 154140f1265ebd42ece3e7f7917319b56012e8e2bce2Daniel Dunbar if (Output.getType() != types::TY_PCH) { 154240f1265ebd42ece3e7f7917319b56012e8e2bce2Daniel Dunbar OutputArgs.push_back("-o"); 154340f1265ebd42ece3e7f7917319b56012e8e2bce2Daniel Dunbar if (Output.isPipe()) 154440f1265ebd42ece3e7f7917319b56012e8e2bce2Daniel Dunbar OutputArgs.push_back("-"); 154540f1265ebd42ece3e7f7917319b56012e8e2bce2Daniel Dunbar else if (Output.isNothing()) 154640f1265ebd42ece3e7f7917319b56012e8e2bce2Daniel Dunbar OutputArgs.push_back("/dev/null"); 154740f1265ebd42ece3e7f7917319b56012e8e2bce2Daniel Dunbar else 154840f1265ebd42ece3e7f7917319b56012e8e2bce2Daniel Dunbar OutputArgs.push_back(Output.getFilename()); 154940f1265ebd42ece3e7f7917319b56012e8e2bce2Daniel Dunbar } 155040f1265ebd42ece3e7f7917319b56012e8e2bce2Daniel Dunbar 155140f1265ebd42ece3e7f7917319b56012e8e2bce2Daniel Dunbar // There is no need for this level of compatibility, but it makes 155240f1265ebd42ece3e7f7917319b56012e8e2bce2Daniel Dunbar // diffing easier. 155340f1265ebd42ece3e7f7917319b56012e8e2bce2Daniel Dunbar bool OutputArgsEarly = (Args.hasArg(options::OPT_fsyntax_only) || 155440f1265ebd42ece3e7f7917319b56012e8e2bce2Daniel Dunbar Args.hasArg(options::OPT_S)); 155540f1265ebd42ece3e7f7917319b56012e8e2bce2Daniel Dunbar 155640f1265ebd42ece3e7f7917319b56012e8e2bce2Daniel Dunbar if (types::getPreprocessedType(InputType) != types::TY_INVALID) { 1557a3ec60e0cf2a1916f479288998d31bd980b1a306Daniel Dunbar AddCPPUniqueOptionsArgs(Args, CmdArgs, Inputs); 155840f1265ebd42ece3e7f7917319b56012e8e2bce2Daniel Dunbar if (OutputArgsEarly) { 155940f1265ebd42ece3e7f7917319b56012e8e2bce2Daniel Dunbar AddCC1OptionsArgs(Args, CmdArgs, Inputs, OutputArgs); 156040f1265ebd42ece3e7f7917319b56012e8e2bce2Daniel Dunbar } else { 156140f1265ebd42ece3e7f7917319b56012e8e2bce2Daniel Dunbar AddCC1OptionsArgs(Args, CmdArgs, Inputs, ArgStringList()); 156240f1265ebd42ece3e7f7917319b56012e8e2bce2Daniel Dunbar CmdArgs.append(OutputArgs.begin(), OutputArgs.end()); 156340f1265ebd42ece3e7f7917319b56012e8e2bce2Daniel Dunbar } 156440f1265ebd42ece3e7f7917319b56012e8e2bce2Daniel Dunbar } else { 156540f1265ebd42ece3e7f7917319b56012e8e2bce2Daniel Dunbar CmdArgs.push_back("-fpreprocessed"); 1566c21c485b4fb58ef5d55cf3e523263dd824a2ace4Daniel Dunbar 156740f1265ebd42ece3e7f7917319b56012e8e2bce2Daniel Dunbar for (InputInfoList::const_iterator 156840f1265ebd42ece3e7f7917319b56012e8e2bce2Daniel Dunbar it = Inputs.begin(), ie = Inputs.end(); it != ie; ++it) { 156940f1265ebd42ece3e7f7917319b56012e8e2bce2Daniel Dunbar const InputInfo &II = *it; 157040f1265ebd42ece3e7f7917319b56012e8e2bce2Daniel Dunbar 15715915fbf310e171c4cd3c2af05e9de360c0fa988aDaniel Dunbar // Reject AST inputs. 15725915fbf310e171c4cd3c2af05e9de360c0fa988aDaniel Dunbar if (II.getType() == types::TY_AST) { 15735915fbf310e171c4cd3c2af05e9de360c0fa988aDaniel Dunbar D.Diag(clang::diag::err_drv_no_ast_support) 1574881376467c46c5c6cc16fa6790271c2c22e1d4f1Daniel Dunbar << getToolChain().getTripleString(); 15755915fbf310e171c4cd3c2af05e9de360c0fa988aDaniel Dunbar return; 15765915fbf310e171c4cd3c2af05e9de360c0fa988aDaniel Dunbar } 15775915fbf310e171c4cd3c2af05e9de360c0fa988aDaniel Dunbar 157840f1265ebd42ece3e7f7917319b56012e8e2bce2Daniel Dunbar if (II.isPipe()) 157940f1265ebd42ece3e7f7917319b56012e8e2bce2Daniel Dunbar CmdArgs.push_back("-"); 158040f1265ebd42ece3e7f7917319b56012e8e2bce2Daniel Dunbar else 158140f1265ebd42ece3e7f7917319b56012e8e2bce2Daniel Dunbar CmdArgs.push_back(II.getFilename()); 158240f1265ebd42ece3e7f7917319b56012e8e2bce2Daniel Dunbar } 158340f1265ebd42ece3e7f7917319b56012e8e2bce2Daniel Dunbar 158440f1265ebd42ece3e7f7917319b56012e8e2bce2Daniel Dunbar if (OutputArgsEarly) { 158540f1265ebd42ece3e7f7917319b56012e8e2bce2Daniel Dunbar AddCC1OptionsArgs(Args, CmdArgs, Inputs, OutputArgs); 158640f1265ebd42ece3e7f7917319b56012e8e2bce2Daniel Dunbar } else { 158740f1265ebd42ece3e7f7917319b56012e8e2bce2Daniel Dunbar AddCC1OptionsArgs(Args, CmdArgs, Inputs, ArgStringList()); 158840f1265ebd42ece3e7f7917319b56012e8e2bce2Daniel Dunbar CmdArgs.append(OutputArgs.begin(), OutputArgs.end()); 158940f1265ebd42ece3e7f7917319b56012e8e2bce2Daniel Dunbar } 159040f1265ebd42ece3e7f7917319b56012e8e2bce2Daniel Dunbar } 1591c21c485b4fb58ef5d55cf3e523263dd824a2ace4Daniel Dunbar 159240f1265ebd42ece3e7f7917319b56012e8e2bce2Daniel Dunbar if (Output.getType() == types::TY_PCH) { 159340f1265ebd42ece3e7f7917319b56012e8e2bce2Daniel Dunbar assert(Output.isFilename() && "Invalid PCH output."); 159440f1265ebd42ece3e7f7917319b56012e8e2bce2Daniel Dunbar 159540f1265ebd42ece3e7f7917319b56012e8e2bce2Daniel Dunbar CmdArgs.push_back("-o"); 159640f1265ebd42ece3e7f7917319b56012e8e2bce2Daniel Dunbar // NOTE: gcc uses a temp .s file for this, but there doesn't seem 159740f1265ebd42ece3e7f7917319b56012e8e2bce2Daniel Dunbar // to be a good reason. 159840f1265ebd42ece3e7f7917319b56012e8e2bce2Daniel Dunbar CmdArgs.push_back("/dev/null"); 1599c21c485b4fb58ef5d55cf3e523263dd824a2ace4Daniel Dunbar 160040f1265ebd42ece3e7f7917319b56012e8e2bce2Daniel Dunbar CmdArgs.push_back("--output-pch="); 160140f1265ebd42ece3e7f7917319b56012e8e2bce2Daniel Dunbar CmdArgs.push_back(Output.getFilename()); 1602c21c485b4fb58ef5d55cf3e523263dd824a2ace4Daniel Dunbar } 160340f1265ebd42ece3e7f7917319b56012e8e2bce2Daniel Dunbar 160440f1265ebd42ece3e7f7917319b56012e8e2bce2Daniel Dunbar const char *CC1Name = getCC1Name(Inputs[0].getType()); 1605c21c485b4fb58ef5d55cf3e523263dd824a2ace4Daniel Dunbar const char *Exec = 16065ed34f4c58b6ad4e21038d713c1fae31a6146ff5Daniel Dunbar Args.MakeArgString(getToolChain().GetProgramPath(C, CC1Name)); 1607cae087e164e94e4286c11bf694dd0ff88f295302Daniel Dunbar Dest.addCommand(new Command(JA, Exec, CmdArgs)); 160840f1265ebd42ece3e7f7917319b56012e8e2bce2Daniel Dunbar} 160940f1265ebd42ece3e7f7917319b56012e8e2bce2Daniel Dunbar 16108cac5f7e1ce63dd77ee0fb4ef68f9fa804f41ea6Daniel Dunbarvoid darwin::Assemble::ConstructJob(Compilation &C, const JobAction &JA, 1611c21c485b4fb58ef5d55cf3e523263dd824a2ace4Daniel Dunbar Job &Dest, const InputInfo &Output, 1612c21c485b4fb58ef5d55cf3e523263dd824a2ace4Daniel Dunbar const InputInfoList &Inputs, 1613c21c485b4fb58ef5d55cf3e523263dd824a2ace4Daniel Dunbar const ArgList &Args, 16148cac5f7e1ce63dd77ee0fb4ef68f9fa804f41ea6Daniel Dunbar const char *LinkingOutput) const { 16158cac5f7e1ce63dd77ee0fb4ef68f9fa804f41ea6Daniel Dunbar ArgStringList CmdArgs; 16168cac5f7e1ce63dd77ee0fb4ef68f9fa804f41ea6Daniel Dunbar 16178cac5f7e1ce63dd77ee0fb4ef68f9fa804f41ea6Daniel Dunbar assert(Inputs.size() == 1 && "Unexpected number of inputs."); 16188cac5f7e1ce63dd77ee0fb4ef68f9fa804f41ea6Daniel Dunbar const InputInfo &Input = Inputs[0]; 16198cac5f7e1ce63dd77ee0fb4ef68f9fa804f41ea6Daniel Dunbar 16208cac5f7e1ce63dd77ee0fb4ef68f9fa804f41ea6Daniel Dunbar // Bit of a hack, this is only used for original inputs. 1621c21c485b4fb58ef5d55cf3e523263dd824a2ace4Daniel Dunbar // 16228e4fea6750dbac032c172f3279c63b7815b7423eDaniel Dunbar // FIXME: This is broken for preprocessed .s inputs. 16238cac5f7e1ce63dd77ee0fb4ef68f9fa804f41ea6Daniel Dunbar if (Input.isFilename() && 16248e4fea6750dbac032c172f3279c63b7815b7423eDaniel Dunbar strcmp(Input.getFilename(), Input.getBaseInput()) == 0) { 16258e4fea6750dbac032c172f3279c63b7815b7423eDaniel Dunbar if (Args.hasArg(options::OPT_gstabs)) 16268e4fea6750dbac032c172f3279c63b7815b7423eDaniel Dunbar CmdArgs.push_back("--gstabs"); 16278e4fea6750dbac032c172f3279c63b7815b7423eDaniel Dunbar else if (Args.hasArg(options::OPT_g_Group)) 16288e4fea6750dbac032c172f3279c63b7815b7423eDaniel Dunbar CmdArgs.push_back("--gdwarf2"); 16298e4fea6750dbac032c172f3279c63b7815b7423eDaniel Dunbar } 1630c21c485b4fb58ef5d55cf3e523263dd824a2ace4Daniel Dunbar 16318cac5f7e1ce63dd77ee0fb4ef68f9fa804f41ea6Daniel Dunbar // Derived from asm spec. 1632cc6f803f98fa6ba9a9c366400210448516d01b3cDaniel Dunbar AddDarwinArch(Args, CmdArgs); 1633cc6f803f98fa6ba9a9c366400210448516d01b3cDaniel Dunbar 16341d4612b829500cbe04a2eafca74afac703e34934Daniel Dunbar if (!getDarwinToolChain().isIPhoneOS() || 1635cc6f803f98fa6ba9a9c366400210448516d01b3cDaniel Dunbar Args.hasArg(options::OPT_force__cpusubtype__ALL)) 1636cc6f803f98fa6ba9a9c366400210448516d01b3cDaniel Dunbar CmdArgs.push_back("-force_cpusubtype_ALL"); 16378cac5f7e1ce63dd77ee0fb4ef68f9fa804f41ea6Daniel Dunbar 16380e2679d29be70186fc1197a1484948ed239922baDaniel Dunbar if (getToolChain().getTriple().getArch() != llvm::Triple::x86_64 && 16390e2679d29be70186fc1197a1484948ed239922baDaniel Dunbar (Args.hasArg(options::OPT_mkernel) || 16408cac5f7e1ce63dd77ee0fb4ef68f9fa804f41ea6Daniel Dunbar Args.hasArg(options::OPT_static) || 16410e2679d29be70186fc1197a1484948ed239922baDaniel Dunbar Args.hasArg(options::OPT_fapple_kext))) 1642c21c485b4fb58ef5d55cf3e523263dd824a2ace4Daniel Dunbar CmdArgs.push_back("-static"); 1643c21c485b4fb58ef5d55cf3e523263dd824a2ace4Daniel Dunbar 16448cac5f7e1ce63dd77ee0fb4ef68f9fa804f41ea6Daniel Dunbar Args.AddAllArgValues(CmdArgs, options::OPT_Wa_COMMA, 16458cac5f7e1ce63dd77ee0fb4ef68f9fa804f41ea6Daniel Dunbar options::OPT_Xassembler); 16468cac5f7e1ce63dd77ee0fb4ef68f9fa804f41ea6Daniel Dunbar 16478cac5f7e1ce63dd77ee0fb4ef68f9fa804f41ea6Daniel Dunbar assert(Output.isFilename() && "Unexpected lipo output."); 16488cac5f7e1ce63dd77ee0fb4ef68f9fa804f41ea6Daniel Dunbar CmdArgs.push_back("-o"); 16498cac5f7e1ce63dd77ee0fb4ef68f9fa804f41ea6Daniel Dunbar CmdArgs.push_back(Output.getFilename()); 16508cac5f7e1ce63dd77ee0fb4ef68f9fa804f41ea6Daniel Dunbar 16518cac5f7e1ce63dd77ee0fb4ef68f9fa804f41ea6Daniel Dunbar if (Input.isPipe()) { 16528cac5f7e1ce63dd77ee0fb4ef68f9fa804f41ea6Daniel Dunbar CmdArgs.push_back("-"); 16538cac5f7e1ce63dd77ee0fb4ef68f9fa804f41ea6Daniel Dunbar } else { 16548cac5f7e1ce63dd77ee0fb4ef68f9fa804f41ea6Daniel Dunbar assert(Input.isFilename() && "Invalid input."); 16558cac5f7e1ce63dd77ee0fb4ef68f9fa804f41ea6Daniel Dunbar CmdArgs.push_back(Input.getFilename()); 16568cac5f7e1ce63dd77ee0fb4ef68f9fa804f41ea6Daniel Dunbar } 16578cac5f7e1ce63dd77ee0fb4ef68f9fa804f41ea6Daniel Dunbar 16588cac5f7e1ce63dd77ee0fb4ef68f9fa804f41ea6Daniel Dunbar // asm_final spec is empty. 16598cac5f7e1ce63dd77ee0fb4ef68f9fa804f41ea6Daniel Dunbar 1660c21c485b4fb58ef5d55cf3e523263dd824a2ace4Daniel Dunbar const char *Exec = 16615ed34f4c58b6ad4e21038d713c1fae31a6146ff5Daniel Dunbar Args.MakeArgString(getToolChain().GetProgramPath(C, "as")); 1662cae087e164e94e4286c11bf694dd0ff88f295302Daniel Dunbar Dest.addCommand(new Command(JA, Exec, CmdArgs)); 16638cac5f7e1ce63dd77ee0fb4ef68f9fa804f41ea6Daniel Dunbar} 1664ff7488dc9a766f94daf54d81b03ab9160d0bfd88Daniel Dunbar 166502633b541b04ad5ffc1c70f4c2feeeb13e607057Daniel Dunbar/// Helper routine for seeing if we should use dsymutil; this is a 166602633b541b04ad5ffc1c70f4c2feeeb13e607057Daniel Dunbar/// gcc compatible hack, we should remove it and use the input 166702633b541b04ad5ffc1c70f4c2feeeb13e607057Daniel Dunbar/// type information. 166802633b541b04ad5ffc1c70f4c2feeeb13e607057Daniel Dunbarstatic bool isSourceSuffix(const char *Str) { 166902633b541b04ad5ffc1c70f4c2feeeb13e607057Daniel Dunbar // match: 'C', 'CPP', 'c', 'cc', 'cp', 'c++', 'cpp', 'cxx', 'm', 167002633b541b04ad5ffc1c70f4c2feeeb13e607057Daniel Dunbar // 'mm'. 167155d3f7ae512875a1d6402943c3a619633feb2a18Douglas Gregor return llvm::StringSwitch<bool>(Str) 167255d3f7ae512875a1d6402943c3a619633feb2a18Douglas Gregor .Case("C", true) 167355d3f7ae512875a1d6402943c3a619633feb2a18Douglas Gregor .Case("c", true) 167455d3f7ae512875a1d6402943c3a619633feb2a18Douglas Gregor .Case("m", true) 167555d3f7ae512875a1d6402943c3a619633feb2a18Douglas Gregor .Case("cc", true) 167655d3f7ae512875a1d6402943c3a619633feb2a18Douglas Gregor .Case("cp", true) 167755d3f7ae512875a1d6402943c3a619633feb2a18Douglas Gregor .Case("mm", true) 167855d3f7ae512875a1d6402943c3a619633feb2a18Douglas Gregor .Case("CPP", true) 167955d3f7ae512875a1d6402943c3a619633feb2a18Douglas Gregor .Case("c++", true) 168055d3f7ae512875a1d6402943c3a619633feb2a18Douglas Gregor .Case("cpp", true) 168155d3f7ae512875a1d6402943c3a619633feb2a18Douglas Gregor .Case("cxx", true) 168255d3f7ae512875a1d6402943c3a619633feb2a18Douglas Gregor .Default(false); 168302633b541b04ad5ffc1c70f4c2feeeb13e607057Daniel Dunbar} 168402633b541b04ad5ffc1c70f4c2feeeb13e607057Daniel Dunbar 168578dbd580a02759bbc408dbefb6754afa71b2c24cDaniel Dunbar// FIXME: Can we tablegen this? 168678dbd580a02759bbc408dbefb6754afa71b2c24cDaniel Dunbarstatic const char *GetArmArchForMArch(llvm::StringRef Value) { 168778dbd580a02759bbc408dbefb6754afa71b2c24cDaniel Dunbar if (Value == "armv6k") 168878dbd580a02759bbc408dbefb6754afa71b2c24cDaniel Dunbar return "armv6"; 168978dbd580a02759bbc408dbefb6754afa71b2c24cDaniel Dunbar 169078dbd580a02759bbc408dbefb6754afa71b2c24cDaniel Dunbar if (Value == "armv5tej") 169178dbd580a02759bbc408dbefb6754afa71b2c24cDaniel Dunbar return "armv5"; 169278dbd580a02759bbc408dbefb6754afa71b2c24cDaniel Dunbar 169378dbd580a02759bbc408dbefb6754afa71b2c24cDaniel Dunbar if (Value == "xscale") 169478dbd580a02759bbc408dbefb6754afa71b2c24cDaniel Dunbar return "xscale"; 169578dbd580a02759bbc408dbefb6754afa71b2c24cDaniel Dunbar 169678dbd580a02759bbc408dbefb6754afa71b2c24cDaniel Dunbar if (Value == "armv4t") 169778dbd580a02759bbc408dbefb6754afa71b2c24cDaniel Dunbar return "armv4t"; 169878dbd580a02759bbc408dbefb6754afa71b2c24cDaniel Dunbar 169978dbd580a02759bbc408dbefb6754afa71b2c24cDaniel Dunbar if (Value == "armv7" || Value == "armv7-a" || Value == "armv7-r" || 170078dbd580a02759bbc408dbefb6754afa71b2c24cDaniel Dunbar Value == "armv7-m" || Value == "armv7a" || Value == "armv7r" || 170178dbd580a02759bbc408dbefb6754afa71b2c24cDaniel Dunbar Value == "armv7m") 170278dbd580a02759bbc408dbefb6754afa71b2c24cDaniel Dunbar return "armv7"; 170378dbd580a02759bbc408dbefb6754afa71b2c24cDaniel Dunbar 170478dbd580a02759bbc408dbefb6754afa71b2c24cDaniel Dunbar return 0; 170578dbd580a02759bbc408dbefb6754afa71b2c24cDaniel Dunbar} 170678dbd580a02759bbc408dbefb6754afa71b2c24cDaniel Dunbar 170778dbd580a02759bbc408dbefb6754afa71b2c24cDaniel Dunbar// FIXME: Can we tablegen this? 170878dbd580a02759bbc408dbefb6754afa71b2c24cDaniel Dunbarstatic const char *GetArmArchForMCpu(llvm::StringRef Value) { 170978dbd580a02759bbc408dbefb6754afa71b2c24cDaniel Dunbar if (Value == "arm10tdmi" || Value == "arm1020t" || Value == "arm9e" || 171078dbd580a02759bbc408dbefb6754afa71b2c24cDaniel Dunbar Value == "arm946e-s" || Value == "arm966e-s" || 171178dbd580a02759bbc408dbefb6754afa71b2c24cDaniel Dunbar Value == "arm968e-s" || Value == "arm10e" || 171278dbd580a02759bbc408dbefb6754afa71b2c24cDaniel Dunbar Value == "arm1020e" || Value == "arm1022e" || Value == "arm926ej-s" || 171378dbd580a02759bbc408dbefb6754afa71b2c24cDaniel Dunbar Value == "arm1026ej-s") 171478dbd580a02759bbc408dbefb6754afa71b2c24cDaniel Dunbar return "armv5"; 171578dbd580a02759bbc408dbefb6754afa71b2c24cDaniel Dunbar 171678dbd580a02759bbc408dbefb6754afa71b2c24cDaniel Dunbar if (Value == "xscale") 171778dbd580a02759bbc408dbefb6754afa71b2c24cDaniel Dunbar return "xscale"; 171878dbd580a02759bbc408dbefb6754afa71b2c24cDaniel Dunbar 171978dbd580a02759bbc408dbefb6754afa71b2c24cDaniel Dunbar if (Value == "arm1136j-s" || Value == "arm1136jf-s" || 172078dbd580a02759bbc408dbefb6754afa71b2c24cDaniel Dunbar Value == "arm1176jz-s" || Value == "arm1176jzf-s") 172178dbd580a02759bbc408dbefb6754afa71b2c24cDaniel Dunbar return "armv6"; 172278dbd580a02759bbc408dbefb6754afa71b2c24cDaniel Dunbar 172378dbd580a02759bbc408dbefb6754afa71b2c24cDaniel Dunbar if (Value == "cortex-a8" || Value == "cortex-r4" || Value == "cortex-m3") 172478dbd580a02759bbc408dbefb6754afa71b2c24cDaniel Dunbar return "armv7"; 172578dbd580a02759bbc408dbefb6754afa71b2c24cDaniel Dunbar 172678dbd580a02759bbc408dbefb6754afa71b2c24cDaniel Dunbar return 0; 172778dbd580a02759bbc408dbefb6754afa71b2c24cDaniel Dunbar} 172878dbd580a02759bbc408dbefb6754afa71b2c24cDaniel Dunbar 1729fbefe6bd6f62a3361813498dc672ab0d6c0d4fd1Daniel Dunbarvoid darwin::DarwinTool::AddDarwinArch(const ArgList &Args, 1730fbefe6bd6f62a3361813498dc672ab0d6c0d4fd1Daniel Dunbar ArgStringList &CmdArgs) const { 173102633b541b04ad5ffc1c70f4c2feeeb13e607057Daniel Dunbar // Derived from darwin_arch spec. 173202633b541b04ad5ffc1c70f4c2feeeb13e607057Daniel Dunbar CmdArgs.push_back("-arch"); 173378dbd580a02759bbc408dbefb6754afa71b2c24cDaniel Dunbar 173478dbd580a02759bbc408dbefb6754afa71b2c24cDaniel Dunbar switch (getToolChain().getTriple().getArch()) { 173578dbd580a02759bbc408dbefb6754afa71b2c24cDaniel Dunbar default: 1736881376467c46c5c6cc16fa6790271c2c22e1d4f1Daniel Dunbar CmdArgs.push_back(Args.MakeArgString(getToolChain().getArchName())); 173778dbd580a02759bbc408dbefb6754afa71b2c24cDaniel Dunbar break; 173878dbd580a02759bbc408dbefb6754afa71b2c24cDaniel Dunbar 173978dbd580a02759bbc408dbefb6754afa71b2c24cDaniel Dunbar case llvm::Triple::arm: { 174078dbd580a02759bbc408dbefb6754afa71b2c24cDaniel Dunbar if (const Arg *A = Args.getLastArg(options::OPT_march_EQ)) { 174178dbd580a02759bbc408dbefb6754afa71b2c24cDaniel Dunbar if (const char *Arch = GetArmArchForMArch(A->getValue(Args))) { 174278dbd580a02759bbc408dbefb6754afa71b2c24cDaniel Dunbar CmdArgs.push_back(Arch); 174378dbd580a02759bbc408dbefb6754afa71b2c24cDaniel Dunbar return; 174478dbd580a02759bbc408dbefb6754afa71b2c24cDaniel Dunbar } 174578dbd580a02759bbc408dbefb6754afa71b2c24cDaniel Dunbar } 174678dbd580a02759bbc408dbefb6754afa71b2c24cDaniel Dunbar 174778dbd580a02759bbc408dbefb6754afa71b2c24cDaniel Dunbar if (const Arg *A = Args.getLastArg(options::OPT_mcpu_EQ)) { 174878dbd580a02759bbc408dbefb6754afa71b2c24cDaniel Dunbar if (const char *Arch = GetArmArchForMCpu(A->getValue(Args))) { 174978dbd580a02759bbc408dbefb6754afa71b2c24cDaniel Dunbar CmdArgs.push_back(Arch); 175078dbd580a02759bbc408dbefb6754afa71b2c24cDaniel Dunbar return; 175178dbd580a02759bbc408dbefb6754afa71b2c24cDaniel Dunbar } 175278dbd580a02759bbc408dbefb6754afa71b2c24cDaniel Dunbar } 175378dbd580a02759bbc408dbefb6754afa71b2c24cDaniel Dunbar 175478dbd580a02759bbc408dbefb6754afa71b2c24cDaniel Dunbar CmdArgs.push_back("arm"); 175578dbd580a02759bbc408dbefb6754afa71b2c24cDaniel Dunbar CmdArgs.push_back("-force_cpusubtype_ALL"); 175678dbd580a02759bbc408dbefb6754afa71b2c24cDaniel Dunbar return; 175778dbd580a02759bbc408dbefb6754afa71b2c24cDaniel Dunbar } 175878dbd580a02759bbc408dbefb6754afa71b2c24cDaniel Dunbar } 175902633b541b04ad5ffc1c70f4c2feeeb13e607057Daniel Dunbar} 176002633b541b04ad5ffc1c70f4c2feeeb13e607057Daniel Dunbar 1761fbefe6bd6f62a3361813498dc672ab0d6c0d4fd1Daniel Dunbarvoid darwin::DarwinTool::AddDarwinSubArch(const ArgList &Args, 1762fbefe6bd6f62a3361813498dc672ab0d6c0d4fd1Daniel Dunbar ArgStringList &CmdArgs) const { 176302633b541b04ad5ffc1c70f4c2feeeb13e607057Daniel Dunbar // Derived from darwin_subarch spec, not sure what the distinction 176402633b541b04ad5ffc1c70f4c2feeeb13e607057Daniel Dunbar // exists for but at least for this chain it is the same. 176502633b541b04ad5ffc1c70f4c2feeeb13e607057Daniel Dunbar AddDarwinArch(Args, CmdArgs); 176602633b541b04ad5ffc1c70f4c2feeeb13e607057Daniel Dunbar} 176702633b541b04ad5ffc1c70f4c2feeeb13e607057Daniel Dunbar 1768c21c485b4fb58ef5d55cf3e523263dd824a2ace4Daniel Dunbarvoid darwin::Link::AddLinkArgs(const ArgList &Args, 176902633b541b04ad5ffc1c70f4c2feeeb13e607057Daniel Dunbar ArgStringList &CmdArgs) const { 177002633b541b04ad5ffc1c70f4c2feeeb13e607057Daniel Dunbar const Driver &D = getToolChain().getHost().getDriver(); 177102633b541b04ad5ffc1c70f4c2feeeb13e607057Daniel Dunbar 177202633b541b04ad5ffc1c70f4c2feeeb13e607057Daniel Dunbar // Derived from the "link" spec. 177302633b541b04ad5ffc1c70f4c2feeeb13e607057Daniel Dunbar Args.AddAllArgs(CmdArgs, options::OPT_static); 177402633b541b04ad5ffc1c70f4c2feeeb13e607057Daniel Dunbar if (!Args.hasArg(options::OPT_static)) 177502633b541b04ad5ffc1c70f4c2feeeb13e607057Daniel Dunbar CmdArgs.push_back("-dynamic"); 177602633b541b04ad5ffc1c70f4c2feeeb13e607057Daniel Dunbar if (Args.hasArg(options::OPT_fgnu_runtime)) { 177702633b541b04ad5ffc1c70f4c2feeeb13e607057Daniel Dunbar // FIXME: gcc replaces -lobjc in forward args with -lobjc-gnu 177802633b541b04ad5ffc1c70f4c2feeeb13e607057Daniel Dunbar // here. How do we wish to handle such things? 177902633b541b04ad5ffc1c70f4c2feeeb13e607057Daniel Dunbar } 1780c21c485b4fb58ef5d55cf3e523263dd824a2ace4Daniel Dunbar 178102633b541b04ad5ffc1c70f4c2feeeb13e607057Daniel Dunbar if (!Args.hasArg(options::OPT_dynamiclib)) { 178202633b541b04ad5ffc1c70f4c2feeeb13e607057Daniel Dunbar if (Args.hasArg(options::OPT_force__cpusubtype__ALL)) { 178302633b541b04ad5ffc1c70f4c2feeeb13e607057Daniel Dunbar AddDarwinArch(Args, CmdArgs); 178402633b541b04ad5ffc1c70f4c2feeeb13e607057Daniel Dunbar CmdArgs.push_back("-force_cpusubtype_ALL"); 178502633b541b04ad5ffc1c70f4c2feeeb13e607057Daniel Dunbar } else 178602633b541b04ad5ffc1c70f4c2feeeb13e607057Daniel Dunbar AddDarwinSubArch(Args, CmdArgs); 178702633b541b04ad5ffc1c70f4c2feeeb13e607057Daniel Dunbar 178802633b541b04ad5ffc1c70f4c2feeeb13e607057Daniel Dunbar Args.AddLastArg(CmdArgs, options::OPT_bundle); 178902633b541b04ad5ffc1c70f4c2feeeb13e607057Daniel Dunbar Args.AddAllArgs(CmdArgs, options::OPT_bundle__loader); 179002633b541b04ad5ffc1c70f4c2feeeb13e607057Daniel Dunbar Args.AddAllArgs(CmdArgs, options::OPT_client__name); 179102633b541b04ad5ffc1c70f4c2feeeb13e607057Daniel Dunbar 179202633b541b04ad5ffc1c70f4c2feeeb13e607057Daniel Dunbar Arg *A; 179302633b541b04ad5ffc1c70f4c2feeeb13e607057Daniel Dunbar if ((A = Args.getLastArg(options::OPT_compatibility__version)) || 179402633b541b04ad5ffc1c70f4c2feeeb13e607057Daniel Dunbar (A = Args.getLastArg(options::OPT_current__version)) || 179502633b541b04ad5ffc1c70f4c2feeeb13e607057Daniel Dunbar (A = Args.getLastArg(options::OPT_install__name))) 179602633b541b04ad5ffc1c70f4c2feeeb13e607057Daniel Dunbar D.Diag(clang::diag::err_drv_argument_only_allowed_with) 179702633b541b04ad5ffc1c70f4c2feeeb13e607057Daniel Dunbar << A->getAsString(Args) << "-dynamiclib"; 179802633b541b04ad5ffc1c70f4c2feeeb13e607057Daniel Dunbar 179902633b541b04ad5ffc1c70f4c2feeeb13e607057Daniel Dunbar Args.AddLastArg(CmdArgs, options::OPT_force__flat__namespace); 180002633b541b04ad5ffc1c70f4c2feeeb13e607057Daniel Dunbar Args.AddLastArg(CmdArgs, options::OPT_keep__private__externs); 180102633b541b04ad5ffc1c70f4c2feeeb13e607057Daniel Dunbar Args.AddLastArg(CmdArgs, options::OPT_private__bundle); 180202633b541b04ad5ffc1c70f4c2feeeb13e607057Daniel Dunbar } else { 180302633b541b04ad5ffc1c70f4c2feeeb13e607057Daniel Dunbar CmdArgs.push_back("-dylib"); 180402633b541b04ad5ffc1c70f4c2feeeb13e607057Daniel Dunbar 180502633b541b04ad5ffc1c70f4c2feeeb13e607057Daniel Dunbar Arg *A; 180602633b541b04ad5ffc1c70f4c2feeeb13e607057Daniel Dunbar if ((A = Args.getLastArg(options::OPT_bundle)) || 180702633b541b04ad5ffc1c70f4c2feeeb13e607057Daniel Dunbar (A = Args.getLastArg(options::OPT_bundle__loader)) || 180802633b541b04ad5ffc1c70f4c2feeeb13e607057Daniel Dunbar (A = Args.getLastArg(options::OPT_client__name)) || 180902633b541b04ad5ffc1c70f4c2feeeb13e607057Daniel Dunbar (A = Args.getLastArg(options::OPT_force__flat__namespace)) || 181002633b541b04ad5ffc1c70f4c2feeeb13e607057Daniel Dunbar (A = Args.getLastArg(options::OPT_keep__private__externs)) || 181102633b541b04ad5ffc1c70f4c2feeeb13e607057Daniel Dunbar (A = Args.getLastArg(options::OPT_private__bundle))) 181202633b541b04ad5ffc1c70f4c2feeeb13e607057Daniel Dunbar D.Diag(clang::diag::err_drv_argument_not_allowed_with) 181302633b541b04ad5ffc1c70f4c2feeeb13e607057Daniel Dunbar << A->getAsString(Args) << "-dynamiclib"; 1814c21c485b4fb58ef5d55cf3e523263dd824a2ace4Daniel Dunbar 181502633b541b04ad5ffc1c70f4c2feeeb13e607057Daniel Dunbar Args.AddAllArgsTranslated(CmdArgs, options::OPT_compatibility__version, 181602633b541b04ad5ffc1c70f4c2feeeb13e607057Daniel Dunbar "-dylib_compatibility_version"); 181702633b541b04ad5ffc1c70f4c2feeeb13e607057Daniel Dunbar Args.AddAllArgsTranslated(CmdArgs, options::OPT_current__version, 181802633b541b04ad5ffc1c70f4c2feeeb13e607057Daniel Dunbar "-dylib_current_version"); 181902633b541b04ad5ffc1c70f4c2feeeb13e607057Daniel Dunbar 182002633b541b04ad5ffc1c70f4c2feeeb13e607057Daniel Dunbar if (Args.hasArg(options::OPT_force__cpusubtype__ALL)) { 182102633b541b04ad5ffc1c70f4c2feeeb13e607057Daniel Dunbar AddDarwinArch(Args, CmdArgs); 1822c21c485b4fb58ef5d55cf3e523263dd824a2ace4Daniel Dunbar // NOTE: We don't add -force_cpusubtype_ALL on this path. Ok. 182302633b541b04ad5ffc1c70f4c2feeeb13e607057Daniel Dunbar } else 182402633b541b04ad5ffc1c70f4c2feeeb13e607057Daniel Dunbar AddDarwinSubArch(Args, CmdArgs); 182502633b541b04ad5ffc1c70f4c2feeeb13e607057Daniel Dunbar 182602633b541b04ad5ffc1c70f4c2feeeb13e607057Daniel Dunbar Args.AddAllArgsTranslated(CmdArgs, options::OPT_install__name, 182702633b541b04ad5ffc1c70f4c2feeeb13e607057Daniel Dunbar "-dylib_install_name"); 182802633b541b04ad5ffc1c70f4c2feeeb13e607057Daniel Dunbar } 182902633b541b04ad5ffc1c70f4c2feeeb13e607057Daniel Dunbar 183002633b541b04ad5ffc1c70f4c2feeeb13e607057Daniel Dunbar Args.AddLastArg(CmdArgs, options::OPT_all__load); 183102633b541b04ad5ffc1c70f4c2feeeb13e607057Daniel Dunbar Args.AddAllArgs(CmdArgs, options::OPT_allowable__client); 183202633b541b04ad5ffc1c70f4c2feeeb13e607057Daniel Dunbar Args.AddLastArg(CmdArgs, options::OPT_bind__at__load); 18331d4612b829500cbe04a2eafca74afac703e34934Daniel Dunbar if (getDarwinToolChain().isIPhoneOS()) 1834d82f8fa53771b454885c546f0fd452a4980b3a3eDaniel Dunbar Args.AddLastArg(CmdArgs, options::OPT_arch__errors__fatal); 183502633b541b04ad5ffc1c70f4c2feeeb13e607057Daniel Dunbar Args.AddLastArg(CmdArgs, options::OPT_dead__strip); 183602633b541b04ad5ffc1c70f4c2feeeb13e607057Daniel Dunbar Args.AddLastArg(CmdArgs, options::OPT_no__dead__strip__inits__and__terms); 183702633b541b04ad5ffc1c70f4c2feeeb13e607057Daniel Dunbar Args.AddAllArgs(CmdArgs, options::OPT_dylib__file); 183802633b541b04ad5ffc1c70f4c2feeeb13e607057Daniel Dunbar Args.AddLastArg(CmdArgs, options::OPT_dynamic); 183902633b541b04ad5ffc1c70f4c2feeeb13e607057Daniel Dunbar Args.AddAllArgs(CmdArgs, options::OPT_exported__symbols__list); 184002633b541b04ad5ffc1c70f4c2feeeb13e607057Daniel Dunbar Args.AddLastArg(CmdArgs, options::OPT_flat__namespace); 184102633b541b04ad5ffc1c70f4c2feeeb13e607057Daniel Dunbar Args.AddAllArgs(CmdArgs, options::OPT_headerpad__max__install__names); 184202633b541b04ad5ffc1c70f4c2feeeb13e607057Daniel Dunbar Args.AddAllArgs(CmdArgs, options::OPT_image__base); 184302633b541b04ad5ffc1c70f4c2feeeb13e607057Daniel Dunbar Args.AddAllArgs(CmdArgs, options::OPT_init); 184402633b541b04ad5ffc1c70f4c2feeeb13e607057Daniel Dunbar 184530392de4681602f1aabc61b0184b1de53bc172f0Daniel Dunbar if (!Args.hasArg(options::OPT_mmacosx_version_min_EQ) && 184630392de4681602f1aabc61b0184b1de53bc172f0Daniel Dunbar !Args.hasArg(options::OPT_miphoneos_version_min_EQ)) { 184730392de4681602f1aabc61b0184b1de53bc172f0Daniel Dunbar // Add default version min. 18481d4612b829500cbe04a2eafca74afac703e34934Daniel Dunbar if (!getDarwinToolChain().isIPhoneOS()) { 1849c21c485b4fb58ef5d55cf3e523263dd824a2ace4Daniel Dunbar CmdArgs.push_back("-macosx_version_min"); 1850c21c485b4fb58ef5d55cf3e523263dd824a2ace4Daniel Dunbar CmdArgs.push_back(getDarwinToolChain().getMacosxVersionStr()); 185130392de4681602f1aabc61b0184b1de53bc172f0Daniel Dunbar } else { 185230392de4681602f1aabc61b0184b1de53bc172f0Daniel Dunbar CmdArgs.push_back("-iphoneos_version_min"); 185330392de4681602f1aabc61b0184b1de53bc172f0Daniel Dunbar CmdArgs.push_back(getDarwinToolChain().getIPhoneOSVersionStr()); 1854c21c485b4fb58ef5d55cf3e523263dd824a2ace4Daniel Dunbar } 185502633b541b04ad5ffc1c70f4c2feeeb13e607057Daniel Dunbar } 185602633b541b04ad5ffc1c70f4c2feeeb13e607057Daniel Dunbar 185730392de4681602f1aabc61b0184b1de53bc172f0Daniel Dunbar // Adding all arguments doesn't make sense here but this is what 185830392de4681602f1aabc61b0184b1de53bc172f0Daniel Dunbar // gcc does. 185930392de4681602f1aabc61b0184b1de53bc172f0Daniel Dunbar Args.AddAllArgsTranslated(CmdArgs, options::OPT_mmacosx_version_min_EQ, 186030392de4681602f1aabc61b0184b1de53bc172f0Daniel Dunbar "-macosx_version_min"); 186102633b541b04ad5ffc1c70f4c2feeeb13e607057Daniel Dunbar Args.AddAllArgsTranslated(CmdArgs, options::OPT_miphoneos_version_min_EQ, 186202633b541b04ad5ffc1c70f4c2feeeb13e607057Daniel Dunbar "-iphoneos_version_min"); 186302633b541b04ad5ffc1c70f4c2feeeb13e607057Daniel Dunbar Args.AddLastArg(CmdArgs, options::OPT_nomultidefs); 186402633b541b04ad5ffc1c70f4c2feeeb13e607057Daniel Dunbar Args.AddLastArg(CmdArgs, options::OPT_multi__module); 186502633b541b04ad5ffc1c70f4c2feeeb13e607057Daniel Dunbar Args.AddLastArg(CmdArgs, options::OPT_single__module); 186602633b541b04ad5ffc1c70f4c2feeeb13e607057Daniel Dunbar Args.AddAllArgs(CmdArgs, options::OPT_multiply__defined); 186702633b541b04ad5ffc1c70f4c2feeeb13e607057Daniel Dunbar Args.AddAllArgs(CmdArgs, options::OPT_multiply__defined__unused); 1868c21c485b4fb58ef5d55cf3e523263dd824a2ace4Daniel Dunbar 186902633b541b04ad5ffc1c70f4c2feeeb13e607057Daniel Dunbar if (Args.hasArg(options::OPT_fpie)) 187002633b541b04ad5ffc1c70f4c2feeeb13e607057Daniel Dunbar CmdArgs.push_back("-pie"); 187102633b541b04ad5ffc1c70f4c2feeeb13e607057Daniel Dunbar 187202633b541b04ad5ffc1c70f4c2feeeb13e607057Daniel Dunbar Args.AddLastArg(CmdArgs, options::OPT_prebind); 187302633b541b04ad5ffc1c70f4c2feeeb13e607057Daniel Dunbar Args.AddLastArg(CmdArgs, options::OPT_noprebind); 187402633b541b04ad5ffc1c70f4c2feeeb13e607057Daniel Dunbar Args.AddLastArg(CmdArgs, options::OPT_nofixprebinding); 187502633b541b04ad5ffc1c70f4c2feeeb13e607057Daniel Dunbar Args.AddLastArg(CmdArgs, options::OPT_prebind__all__twolevel__modules); 187602633b541b04ad5ffc1c70f4c2feeeb13e607057Daniel Dunbar Args.AddLastArg(CmdArgs, options::OPT_read__only__relocs); 187702633b541b04ad5ffc1c70f4c2feeeb13e607057Daniel Dunbar Args.AddAllArgs(CmdArgs, options::OPT_sectcreate); 187802633b541b04ad5ffc1c70f4c2feeeb13e607057Daniel Dunbar Args.AddAllArgs(CmdArgs, options::OPT_sectorder); 187902633b541b04ad5ffc1c70f4c2feeeb13e607057Daniel Dunbar Args.AddAllArgs(CmdArgs, options::OPT_seg1addr); 188002633b541b04ad5ffc1c70f4c2feeeb13e607057Daniel Dunbar Args.AddAllArgs(CmdArgs, options::OPT_segprot); 188102633b541b04ad5ffc1c70f4c2feeeb13e607057Daniel Dunbar Args.AddAllArgs(CmdArgs, options::OPT_segaddr); 188202633b541b04ad5ffc1c70f4c2feeeb13e607057Daniel Dunbar Args.AddAllArgs(CmdArgs, options::OPT_segs__read__only__addr); 188302633b541b04ad5ffc1c70f4c2feeeb13e607057Daniel Dunbar Args.AddAllArgs(CmdArgs, options::OPT_segs__read__write__addr); 188402633b541b04ad5ffc1c70f4c2feeeb13e607057Daniel Dunbar Args.AddAllArgs(CmdArgs, options::OPT_seg__addr__table); 188502633b541b04ad5ffc1c70f4c2feeeb13e607057Daniel Dunbar Args.AddAllArgs(CmdArgs, options::OPT_seg__addr__table__filename); 188602633b541b04ad5ffc1c70f4c2feeeb13e607057Daniel Dunbar Args.AddAllArgs(CmdArgs, options::OPT_sub__library); 188702633b541b04ad5ffc1c70f4c2feeeb13e607057Daniel Dunbar Args.AddAllArgs(CmdArgs, options::OPT_sub__umbrella); 1888d82f8fa53771b454885c546f0fd452a4980b3a3eDaniel Dunbar 188902633b541b04ad5ffc1c70f4c2feeeb13e607057Daniel Dunbar Args.AddAllArgsTranslated(CmdArgs, options::OPT_isysroot, "-syslibroot"); 18901d4612b829500cbe04a2eafca74afac703e34934Daniel Dunbar if (getDarwinToolChain().isIPhoneOS()) { 1891d82f8fa53771b454885c546f0fd452a4980b3a3eDaniel Dunbar if (!Args.hasArg(options::OPT_isysroot)) { 1892d82f8fa53771b454885c546f0fd452a4980b3a3eDaniel Dunbar CmdArgs.push_back("-syslibroot"); 1893d82f8fa53771b454885c546f0fd452a4980b3a3eDaniel Dunbar CmdArgs.push_back("/Developer/SDKs/Extra"); 1894d82f8fa53771b454885c546f0fd452a4980b3a3eDaniel Dunbar } 1895d82f8fa53771b454885c546f0fd452a4980b3a3eDaniel Dunbar } 1896d82f8fa53771b454885c546f0fd452a4980b3a3eDaniel Dunbar 189702633b541b04ad5ffc1c70f4c2feeeb13e607057Daniel Dunbar Args.AddLastArg(CmdArgs, options::OPT_twolevel__namespace); 189802633b541b04ad5ffc1c70f4c2feeeb13e607057Daniel Dunbar Args.AddLastArg(CmdArgs, options::OPT_twolevel__namespace__hints); 189902633b541b04ad5ffc1c70f4c2feeeb13e607057Daniel Dunbar Args.AddAllArgs(CmdArgs, options::OPT_umbrella); 190002633b541b04ad5ffc1c70f4c2feeeb13e607057Daniel Dunbar Args.AddAllArgs(CmdArgs, options::OPT_undefined); 190102633b541b04ad5ffc1c70f4c2feeeb13e607057Daniel Dunbar Args.AddAllArgs(CmdArgs, options::OPT_unexported__symbols__list); 190202633b541b04ad5ffc1c70f4c2feeeb13e607057Daniel Dunbar 1903d82f8fa53771b454885c546f0fd452a4980b3a3eDaniel Dunbar Args.AddAllArgs(CmdArgs, options::OPT_weak__reference__mismatches); 190402633b541b04ad5ffc1c70f4c2feeeb13e607057Daniel Dunbar if (!Args.hasArg(options::OPT_weak__reference__mismatches)) { 190502633b541b04ad5ffc1c70f4c2feeeb13e607057Daniel Dunbar CmdArgs.push_back("-weak_reference_mismatches"); 190602633b541b04ad5ffc1c70f4c2feeeb13e607057Daniel Dunbar CmdArgs.push_back("non-weak"); 190702633b541b04ad5ffc1c70f4c2feeeb13e607057Daniel Dunbar } 190802633b541b04ad5ffc1c70f4c2feeeb13e607057Daniel Dunbar 190902633b541b04ad5ffc1c70f4c2feeeb13e607057Daniel Dunbar Args.AddLastArg(CmdArgs, options::OPT_X_Flag); 191002633b541b04ad5ffc1c70f4c2feeeb13e607057Daniel Dunbar Args.AddAllArgs(CmdArgs, options::OPT_y); 191102633b541b04ad5ffc1c70f4c2feeeb13e607057Daniel Dunbar Args.AddLastArg(CmdArgs, options::OPT_w); 191202633b541b04ad5ffc1c70f4c2feeeb13e607057Daniel Dunbar Args.AddAllArgs(CmdArgs, options::OPT_pagezero__size); 191302633b541b04ad5ffc1c70f4c2feeeb13e607057Daniel Dunbar Args.AddAllArgs(CmdArgs, options::OPT_segs__read__); 191402633b541b04ad5ffc1c70f4c2feeeb13e607057Daniel Dunbar Args.AddLastArg(CmdArgs, options::OPT_seglinkedit); 191502633b541b04ad5ffc1c70f4c2feeeb13e607057Daniel Dunbar Args.AddLastArg(CmdArgs, options::OPT_noseglinkedit); 191602633b541b04ad5ffc1c70f4c2feeeb13e607057Daniel Dunbar Args.AddAllArgs(CmdArgs, options::OPT_sectalign); 191702633b541b04ad5ffc1c70f4c2feeeb13e607057Daniel Dunbar Args.AddAllArgs(CmdArgs, options::OPT_sectobjectsymbols); 191802633b541b04ad5ffc1c70f4c2feeeb13e607057Daniel Dunbar Args.AddAllArgs(CmdArgs, options::OPT_segcreate); 191902633b541b04ad5ffc1c70f4c2feeeb13e607057Daniel Dunbar Args.AddLastArg(CmdArgs, options::OPT_whyload); 192002633b541b04ad5ffc1c70f4c2feeeb13e607057Daniel Dunbar Args.AddLastArg(CmdArgs, options::OPT_whatsloaded); 192102633b541b04ad5ffc1c70f4c2feeeb13e607057Daniel Dunbar Args.AddAllArgs(CmdArgs, options::OPT_dylinker__install__name); 192202633b541b04ad5ffc1c70f4c2feeeb13e607057Daniel Dunbar Args.AddLastArg(CmdArgs, options::OPT_dylinker); 192302633b541b04ad5ffc1c70f4c2feeeb13e607057Daniel Dunbar Args.AddLastArg(CmdArgs, options::OPT_Mach); 192402633b541b04ad5ffc1c70f4c2feeeb13e607057Daniel Dunbar} 192502633b541b04ad5ffc1c70f4c2feeeb13e607057Daniel Dunbar 192602633b541b04ad5ffc1c70f4c2feeeb13e607057Daniel Dunbarvoid darwin::Link::ConstructJob(Compilation &C, const JobAction &JA, 1927c21c485b4fb58ef5d55cf3e523263dd824a2ace4Daniel Dunbar Job &Dest, const InputInfo &Output, 1928c21c485b4fb58ef5d55cf3e523263dd824a2ace4Daniel Dunbar const InputInfoList &Inputs, 1929c21c485b4fb58ef5d55cf3e523263dd824a2ace4Daniel Dunbar const ArgList &Args, 193002633b541b04ad5ffc1c70f4c2feeeb13e607057Daniel Dunbar const char *LinkingOutput) const { 193102633b541b04ad5ffc1c70f4c2feeeb13e607057Daniel Dunbar assert(Output.getType() == types::TY_Image && "Invalid linker output type."); 1932e0be8b1729d8978de433d229c065830b95d0ae68Daniel Dunbar 193302633b541b04ad5ffc1c70f4c2feeeb13e607057Daniel Dunbar // The logic here is derived from gcc's behavior; most of which 193402633b541b04ad5ffc1c70f4c2feeeb13e607057Daniel Dunbar // comes from specs (starting with link_command). Consult gcc for 193502633b541b04ad5ffc1c70f4c2feeeb13e607057Daniel Dunbar // more information. 193602633b541b04ad5ffc1c70f4c2feeeb13e607057Daniel Dunbar ArgStringList CmdArgs; 193702633b541b04ad5ffc1c70f4c2feeeb13e607057Daniel Dunbar 193802633b541b04ad5ffc1c70f4c2feeeb13e607057Daniel Dunbar // I'm not sure why this particular decomposition exists in gcc, but 193902633b541b04ad5ffc1c70f4c2feeeb13e607057Daniel Dunbar // we follow suite for ease of comparison. 194002633b541b04ad5ffc1c70f4c2feeeb13e607057Daniel Dunbar AddLinkArgs(Args, CmdArgs); 194102633b541b04ad5ffc1c70f4c2feeeb13e607057Daniel Dunbar 194202633b541b04ad5ffc1c70f4c2feeeb13e607057Daniel Dunbar Args.AddAllArgs(CmdArgs, options::OPT_d_Flag); 194302633b541b04ad5ffc1c70f4c2feeeb13e607057Daniel Dunbar Args.AddAllArgs(CmdArgs, options::OPT_s); 194402633b541b04ad5ffc1c70f4c2feeeb13e607057Daniel Dunbar Args.AddAllArgs(CmdArgs, options::OPT_t); 194502633b541b04ad5ffc1c70f4c2feeeb13e607057Daniel Dunbar Args.AddAllArgs(CmdArgs, options::OPT_Z_Flag); 194602633b541b04ad5ffc1c70f4c2feeeb13e607057Daniel Dunbar Args.AddAllArgs(CmdArgs, options::OPT_u_Group); 194702633b541b04ad5ffc1c70f4c2feeeb13e607057Daniel Dunbar Args.AddAllArgs(CmdArgs, options::OPT_A); 194802633b541b04ad5ffc1c70f4c2feeeb13e607057Daniel Dunbar Args.AddLastArg(CmdArgs, options::OPT_e); 194902633b541b04ad5ffc1c70f4c2feeeb13e607057Daniel Dunbar Args.AddAllArgs(CmdArgs, options::OPT_m_Separate); 195002633b541b04ad5ffc1c70f4c2feeeb13e607057Daniel Dunbar Args.AddAllArgs(CmdArgs, options::OPT_r); 195102633b541b04ad5ffc1c70f4c2feeeb13e607057Daniel Dunbar 195202633b541b04ad5ffc1c70f4c2feeeb13e607057Daniel Dunbar CmdArgs.push_back("-o"); 195302633b541b04ad5ffc1c70f4c2feeeb13e607057Daniel Dunbar CmdArgs.push_back(Output.getFilename()); 195402633b541b04ad5ffc1c70f4c2feeeb13e607057Daniel Dunbar 1955608d04cb7bee2db28c8689f6626bf9e0b114c473Daniel Dunbar 1956ae54af2fdcf2262e778f551941541913828fde49Daniel Dunbar unsigned MacosxVersionMin[3]; 195748d5aae4387f07aef99dbe03f4047d709e9f4d35Daniel Dunbar getDarwinToolChain().getMacosxVersionMin(Args, MacosxVersionMin); 1958c21c485b4fb58ef5d55cf3e523263dd824a2ace4Daniel Dunbar 195902633b541b04ad5ffc1c70f4c2feeeb13e607057Daniel Dunbar if (!Args.hasArg(options::OPT_A) && 196002633b541b04ad5ffc1c70f4c2feeeb13e607057Daniel Dunbar !Args.hasArg(options::OPT_nostdlib) && 196102633b541b04ad5ffc1c70f4c2feeeb13e607057Daniel Dunbar !Args.hasArg(options::OPT_nostartfiles)) { 196202633b541b04ad5ffc1c70f4c2feeeb13e607057Daniel Dunbar // Derived from startfile spec. 196302633b541b04ad5ffc1c70f4c2feeeb13e607057Daniel Dunbar if (Args.hasArg(options::OPT_dynamiclib)) { 1964c21c485b4fb58ef5d55cf3e523263dd824a2ace4Daniel Dunbar // Derived from darwin_dylib1 spec. 1965608d04cb7bee2db28c8689f6626bf9e0b114c473Daniel Dunbar if (getDarwinToolChain().isMacosxVersionLT(MacosxVersionMin, 10, 5)) 196602633b541b04ad5ffc1c70f4c2feeeb13e607057Daniel Dunbar CmdArgs.push_back("-ldylib1.o"); 1967608d04cb7bee2db28c8689f6626bf9e0b114c473Daniel Dunbar else if (getDarwinToolChain().isMacosxVersionLT(MacosxVersionMin, 10, 6)) 196802633b541b04ad5ffc1c70f4c2feeeb13e607057Daniel Dunbar CmdArgs.push_back("-ldylib1.10.5.o"); 196902633b541b04ad5ffc1c70f4c2feeeb13e607057Daniel Dunbar } else { 197002633b541b04ad5ffc1c70f4c2feeeb13e607057Daniel Dunbar if (Args.hasArg(options::OPT_bundle)) { 19718a8d8afa3df40e9f122d2b826f1a825a66f6908dDaniel Dunbar if (!Args.hasArg(options::OPT_static)) { 19728a8d8afa3df40e9f122d2b826f1a825a66f6908dDaniel Dunbar // Derived from darwin_bundle1 spec. 1973608d04cb7bee2db28c8689f6626bf9e0b114c473Daniel Dunbar if (getDarwinToolChain().isMacosxVersionLT(MacosxVersionMin, 10, 6)) 19748a8d8afa3df40e9f122d2b826f1a825a66f6908dDaniel Dunbar CmdArgs.push_back("-lbundle1.o"); 19758a8d8afa3df40e9f122d2b826f1a825a66f6908dDaniel Dunbar } 197602633b541b04ad5ffc1c70f4c2feeeb13e607057Daniel Dunbar } else { 197702633b541b04ad5ffc1c70f4c2feeeb13e607057Daniel Dunbar if (Args.hasArg(options::OPT_pg)) { 197802633b541b04ad5ffc1c70f4c2feeeb13e607057Daniel Dunbar if (Args.hasArg(options::OPT_static) || 197902633b541b04ad5ffc1c70f4c2feeeb13e607057Daniel Dunbar Args.hasArg(options::OPT_object) || 198002633b541b04ad5ffc1c70f4c2feeeb13e607057Daniel Dunbar Args.hasArg(options::OPT_preload)) { 198102633b541b04ad5ffc1c70f4c2feeeb13e607057Daniel Dunbar CmdArgs.push_back("-lgcrt0.o"); 198202633b541b04ad5ffc1c70f4c2feeeb13e607057Daniel Dunbar } else { 198302633b541b04ad5ffc1c70f4c2feeeb13e607057Daniel Dunbar CmdArgs.push_back("-lgcrt1.o"); 1984c21c485b4fb58ef5d55cf3e523263dd824a2ace4Daniel Dunbar 198502633b541b04ad5ffc1c70f4c2feeeb13e607057Daniel Dunbar // darwin_crt2 spec is empty. 1986c21c485b4fb58ef5d55cf3e523263dd824a2ace4Daniel Dunbar } 198702633b541b04ad5ffc1c70f4c2feeeb13e607057Daniel Dunbar } else { 198802633b541b04ad5ffc1c70f4c2feeeb13e607057Daniel Dunbar if (Args.hasArg(options::OPT_static) || 198902633b541b04ad5ffc1c70f4c2feeeb13e607057Daniel Dunbar Args.hasArg(options::OPT_object) || 199002633b541b04ad5ffc1c70f4c2feeeb13e607057Daniel Dunbar Args.hasArg(options::OPT_preload)) { 199102633b541b04ad5ffc1c70f4c2feeeb13e607057Daniel Dunbar CmdArgs.push_back("-lcrt0.o"); 199202633b541b04ad5ffc1c70f4c2feeeb13e607057Daniel Dunbar } else { 199302633b541b04ad5ffc1c70f4c2feeeb13e607057Daniel Dunbar // Derived from darwin_crt1 spec. 19941d4612b829500cbe04a2eafca74afac703e34934Daniel Dunbar if (getDarwinToolChain().isIPhoneOS()) { 1995ae33f8ff4749dd69060c70dae15e68e454dc3011Daniel Dunbar CmdArgs.push_back("-lcrt1.o"); 1996608d04cb7bee2db28c8689f6626bf9e0b114c473Daniel Dunbar } else if (getDarwinToolChain().isMacosxVersionLT(MacosxVersionMin, 1997608d04cb7bee2db28c8689f6626bf9e0b114c473Daniel Dunbar 10, 5)) 199802633b541b04ad5ffc1c70f4c2feeeb13e607057Daniel Dunbar CmdArgs.push_back("-lcrt1.o"); 1999608d04cb7bee2db28c8689f6626bf9e0b114c473Daniel Dunbar else if (getDarwinToolChain().isMacosxVersionLT(MacosxVersionMin, 2000608d04cb7bee2db28c8689f6626bf9e0b114c473Daniel Dunbar 10, 6)) 200102633b541b04ad5ffc1c70f4c2feeeb13e607057Daniel Dunbar CmdArgs.push_back("-lcrt1.10.5.o"); 20028a8d8afa3df40e9f122d2b826f1a825a66f6908dDaniel Dunbar else 20038a8d8afa3df40e9f122d2b826f1a825a66f6908dDaniel Dunbar CmdArgs.push_back("-lcrt1.10.6.o"); 2004c21c485b4fb58ef5d55cf3e523263dd824a2ace4Daniel Dunbar 20058a8d8afa3df40e9f122d2b826f1a825a66f6908dDaniel Dunbar // darwin_crt2 spec is empty. 200602633b541b04ad5ffc1c70f4c2feeeb13e607057Daniel Dunbar } 200702633b541b04ad5ffc1c70f4c2feeeb13e607057Daniel Dunbar } 200802633b541b04ad5ffc1c70f4c2feeeb13e607057Daniel Dunbar } 200902633b541b04ad5ffc1c70f4c2feeeb13e607057Daniel Dunbar } 201002633b541b04ad5ffc1c70f4c2feeeb13e607057Daniel Dunbar 201102633b541b04ad5ffc1c70f4c2feeeb13e607057Daniel Dunbar if (Args.hasArg(options::OPT_shared_libgcc) && 201202633b541b04ad5ffc1c70f4c2feeeb13e607057Daniel Dunbar !Args.hasArg(options::OPT_miphoneos_version_min_EQ) && 2013608d04cb7bee2db28c8689f6626bf9e0b114c473Daniel Dunbar getDarwinToolChain().isMacosxVersionLT(MacosxVersionMin, 10, 5)) { 2014881376467c46c5c6cc16fa6790271c2c22e1d4f1Daniel Dunbar const char *Str = 20155ed34f4c58b6ad4e21038d713c1fae31a6146ff5Daniel Dunbar Args.MakeArgString(getToolChain().GetFilePath(C, "crt3.o")); 2016881376467c46c5c6cc16fa6790271c2c22e1d4f1Daniel Dunbar CmdArgs.push_back(Str); 201702633b541b04ad5ffc1c70f4c2feeeb13e607057Daniel Dunbar } 201802633b541b04ad5ffc1c70f4c2feeeb13e607057Daniel Dunbar } 201902633b541b04ad5ffc1c70f4c2feeeb13e607057Daniel Dunbar 202002633b541b04ad5ffc1c70f4c2feeeb13e607057Daniel Dunbar Args.AddAllArgs(CmdArgs, options::OPT_L); 2021c21c485b4fb58ef5d55cf3e523263dd824a2ace4Daniel Dunbar 202202633b541b04ad5ffc1c70f4c2feeeb13e607057Daniel Dunbar if (Args.hasArg(options::OPT_fopenmp)) 202302633b541b04ad5ffc1c70f4c2feeeb13e607057Daniel Dunbar // This is more complicated in gcc... 202402633b541b04ad5ffc1c70f4c2feeeb13e607057Daniel Dunbar CmdArgs.push_back("-lgomp"); 202502633b541b04ad5ffc1c70f4c2feeeb13e607057Daniel Dunbar 20266b200b2b698b6ac9e310f2225c69c85d28ae4fb0Daniel Dunbar getDarwinToolChain().AddLinkSearchPathArgs(Args, CmdArgs); 2027c21c485b4fb58ef5d55cf3e523263dd824a2ace4Daniel Dunbar 202802633b541b04ad5ffc1c70f4c2feeeb13e607057Daniel Dunbar for (InputInfoList::const_iterator 202902633b541b04ad5ffc1c70f4c2feeeb13e607057Daniel Dunbar it = Inputs.begin(), ie = Inputs.end(); it != ie; ++it) { 203002633b541b04ad5ffc1c70f4c2feeeb13e607057Daniel Dunbar const InputInfo &II = *it; 203102633b541b04ad5ffc1c70f4c2feeeb13e607057Daniel Dunbar if (II.isFilename()) 203202633b541b04ad5ffc1c70f4c2feeeb13e607057Daniel Dunbar CmdArgs.push_back(II.getFilename()); 2033c21c485b4fb58ef5d55cf3e523263dd824a2ace4Daniel Dunbar else 203402633b541b04ad5ffc1c70f4c2feeeb13e607057Daniel Dunbar II.getInputArg().renderAsInput(Args, CmdArgs); 203502633b541b04ad5ffc1c70f4c2feeeb13e607057Daniel Dunbar } 203602633b541b04ad5ffc1c70f4c2feeeb13e607057Daniel Dunbar 203702633b541b04ad5ffc1c70f4c2feeeb13e607057Daniel Dunbar if (LinkingOutput) { 203802633b541b04ad5ffc1c70f4c2feeeb13e607057Daniel Dunbar CmdArgs.push_back("-arch_multiple"); 203902633b541b04ad5ffc1c70f4c2feeeb13e607057Daniel Dunbar CmdArgs.push_back("-final_output"); 204002633b541b04ad5ffc1c70f4c2feeeb13e607057Daniel Dunbar CmdArgs.push_back(LinkingOutput); 204102633b541b04ad5ffc1c70f4c2feeeb13e607057Daniel Dunbar } 204202633b541b04ad5ffc1c70f4c2feeeb13e607057Daniel Dunbar 204302633b541b04ad5ffc1c70f4c2feeeb13e607057Daniel Dunbar if (Args.hasArg(options::OPT_fprofile_arcs) || 204402633b541b04ad5ffc1c70f4c2feeeb13e607057Daniel Dunbar Args.hasArg(options::OPT_fprofile_generate) || 204502633b541b04ad5ffc1c70f4c2feeeb13e607057Daniel Dunbar Args.hasArg(options::OPT_fcreate_profile) || 204602633b541b04ad5ffc1c70f4c2feeeb13e607057Daniel Dunbar Args.hasArg(options::OPT_coverage)) 204702633b541b04ad5ffc1c70f4c2feeeb13e607057Daniel Dunbar CmdArgs.push_back("-lgcov"); 2048c21c485b4fb58ef5d55cf3e523263dd824a2ace4Daniel Dunbar 204902633b541b04ad5ffc1c70f4c2feeeb13e607057Daniel Dunbar if (Args.hasArg(options::OPT_fnested_functions)) 205002633b541b04ad5ffc1c70f4c2feeeb13e607057Daniel Dunbar CmdArgs.push_back("-allow_stack_execute"); 2051c21c485b4fb58ef5d55cf3e523263dd824a2ace4Daniel Dunbar 205202633b541b04ad5ffc1c70f4c2feeeb13e607057Daniel Dunbar if (!Args.hasArg(options::OPT_nostdlib) && 205302633b541b04ad5ffc1c70f4c2feeeb13e607057Daniel Dunbar !Args.hasArg(options::OPT_nodefaultlibs)) { 2054edfa02b85b186e9ea9e0c841539a77ed32ee9148Daniel Dunbar // FIXME: g++ is more complicated here, it tries to put -lstdc++ 2055edfa02b85b186e9ea9e0c841539a77ed32ee9148Daniel Dunbar // before -lm, for example. 2056edfa02b85b186e9ea9e0c841539a77ed32ee9148Daniel Dunbar if (getToolChain().getHost().getDriver().CCCIsCXX) 2057edfa02b85b186e9ea9e0c841539a77ed32ee9148Daniel Dunbar CmdArgs.push_back("-lstdc++"); 2058edfa02b85b186e9ea9e0c841539a77ed32ee9148Daniel Dunbar 205902633b541b04ad5ffc1c70f4c2feeeb13e607057Daniel Dunbar // link_ssp spec is empty. 206002633b541b04ad5ffc1c70f4c2feeeb13e607057Daniel Dunbar 20616cd4154b9088fa18ae05d11c0f3140fafd76c734Daniel Dunbar // Let the tool chain choose which runtime library to link. 20626cd4154b9088fa18ae05d11c0f3140fafd76c734Daniel Dunbar getDarwinToolChain().AddLinkRuntimeLibArgs(Args, CmdArgs); 206302633b541b04ad5ffc1c70f4c2feeeb13e607057Daniel Dunbar } 206402633b541b04ad5ffc1c70f4c2feeeb13e607057Daniel Dunbar 206502633b541b04ad5ffc1c70f4c2feeeb13e607057Daniel Dunbar if (!Args.hasArg(options::OPT_A) && 206602633b541b04ad5ffc1c70f4c2feeeb13e607057Daniel Dunbar !Args.hasArg(options::OPT_nostdlib) && 206702633b541b04ad5ffc1c70f4c2feeeb13e607057Daniel Dunbar !Args.hasArg(options::OPT_nostartfiles)) { 206802633b541b04ad5ffc1c70f4c2feeeb13e607057Daniel Dunbar // endfile_spec is empty. 206902633b541b04ad5ffc1c70f4c2feeeb13e607057Daniel Dunbar } 207002633b541b04ad5ffc1c70f4c2feeeb13e607057Daniel Dunbar 207102633b541b04ad5ffc1c70f4c2feeeb13e607057Daniel Dunbar Args.AddAllArgs(CmdArgs, options::OPT_T_Group); 207202633b541b04ad5ffc1c70f4c2feeeb13e607057Daniel Dunbar Args.AddAllArgs(CmdArgs, options::OPT_F); 207302633b541b04ad5ffc1c70f4c2feeeb13e607057Daniel Dunbar 2074c21c485b4fb58ef5d55cf3e523263dd824a2ace4Daniel Dunbar const char *Exec = 20755ed34f4c58b6ad4e21038d713c1fae31a6146ff5Daniel Dunbar Args.MakeArgString(getToolChain().GetProgramPath(C, "ld")); 2076cae087e164e94e4286c11bf694dd0ff88f295302Daniel Dunbar Dest.addCommand(new Command(JA, Exec, CmdArgs)); 207702633b541b04ad5ffc1c70f4c2feeeb13e607057Daniel Dunbar 20780b46e1b5389615a8d6641f4d7bf5415d29acfef3Daniel Dunbar // Find the first non-empty base input (we want to ignore linker 20790b46e1b5389615a8d6641f4d7bf5415d29acfef3Daniel Dunbar // inputs). 20800b46e1b5389615a8d6641f4d7bf5415d29acfef3Daniel Dunbar const char *BaseInput = ""; 20810b46e1b5389615a8d6641f4d7bf5415d29acfef3Daniel Dunbar for (unsigned i = 0, e = Inputs.size(); i != e; ++i) { 20820b46e1b5389615a8d6641f4d7bf5415d29acfef3Daniel Dunbar if (Inputs[i].getBaseInput()[0] != '\0') { 20830b46e1b5389615a8d6641f4d7bf5415d29acfef3Daniel Dunbar BaseInput = Inputs[i].getBaseInput(); 20840b46e1b5389615a8d6641f4d7bf5415d29acfef3Daniel Dunbar break; 20850b46e1b5389615a8d6641f4d7bf5415d29acfef3Daniel Dunbar } 20860b46e1b5389615a8d6641f4d7bf5415d29acfef3Daniel Dunbar } 2087c21c485b4fb58ef5d55cf3e523263dd824a2ace4Daniel Dunbar 20883ed294522653323e4867a2eba03acc98a99e5479Daniel Dunbar // Run dsymutil if we are making an executable in a single step. 20893ed294522653323e4867a2eba03acc98a99e5479Daniel Dunbar // 20903ed294522653323e4867a2eba03acc98a99e5479Daniel Dunbar // FIXME: Currently we don't want to do this when we are part of a 20913ed294522653323e4867a2eba03acc98a99e5479Daniel Dunbar // universal build step, as this would end up creating stray temp 20923ed294522653323e4867a2eba03acc98a99e5479Daniel Dunbar // files. 20933ed294522653323e4867a2eba03acc98a99e5479Daniel Dunbar if (!LinkingOutput && 20943ed294522653323e4867a2eba03acc98a99e5479Daniel Dunbar Args.getLastArg(options::OPT_g_Group) && 209502633b541b04ad5ffc1c70f4c2feeeb13e607057Daniel Dunbar !Args.getLastArg(options::OPT_gstabs) && 209602633b541b04ad5ffc1c70f4c2feeeb13e607057Daniel Dunbar !Args.getLastArg(options::OPT_g0)) { 209702633b541b04ad5ffc1c70f4c2feeeb13e607057Daniel Dunbar // FIXME: This is gross, but matches gcc. The test only considers 209802633b541b04ad5ffc1c70f4c2feeeb13e607057Daniel Dunbar // the suffix (not the -x type), and then only of the first 20990b46e1b5389615a8d6641f4d7bf5415d29acfef3Daniel Dunbar // source input. Awesome. 21000b46e1b5389615a8d6641f4d7bf5415d29acfef3Daniel Dunbar const char *Suffix = strrchr(BaseInput, '.'); 210102633b541b04ad5ffc1c70f4c2feeeb13e607057Daniel Dunbar if (Suffix && isSourceSuffix(Suffix + 1)) { 2102c21c485b4fb58ef5d55cf3e523263dd824a2ace4Daniel Dunbar const char *Exec = 21035ed34f4c58b6ad4e21038d713c1fae31a6146ff5Daniel Dunbar Args.MakeArgString(getToolChain().GetProgramPath(C, "dsymutil")); 210402633b541b04ad5ffc1c70f4c2feeeb13e607057Daniel Dunbar ArgStringList CmdArgs; 210502633b541b04ad5ffc1c70f4c2feeeb13e607057Daniel Dunbar CmdArgs.push_back(Output.getFilename()); 2106cae087e164e94e4286c11bf694dd0ff88f295302Daniel Dunbar C.getJobs().addCommand(new Command(JA, Exec, CmdArgs)); 210702633b541b04ad5ffc1c70f4c2feeeb13e607057Daniel Dunbar } 210802633b541b04ad5ffc1c70f4c2feeeb13e607057Daniel Dunbar } 210902633b541b04ad5ffc1c70f4c2feeeb13e607057Daniel Dunbar} 211002633b541b04ad5ffc1c70f4c2feeeb13e607057Daniel Dunbar 2111ff7488dc9a766f94daf54d81b03ab9160d0bfd88Daniel Dunbarvoid darwin::Lipo::ConstructJob(Compilation &C, const JobAction &JA, 2112c21c485b4fb58ef5d55cf3e523263dd824a2ace4Daniel Dunbar Job &Dest, const InputInfo &Output, 2113c21c485b4fb58ef5d55cf3e523263dd824a2ace4Daniel Dunbar const InputInfoList &Inputs, 2114c21c485b4fb58ef5d55cf3e523263dd824a2ace4Daniel Dunbar const ArgList &Args, 2115ff7488dc9a766f94daf54d81b03ab9160d0bfd88Daniel Dunbar const char *LinkingOutput) const { 2116ff7488dc9a766f94daf54d81b03ab9160d0bfd88Daniel Dunbar ArgStringList CmdArgs; 2117ff7488dc9a766f94daf54d81b03ab9160d0bfd88Daniel Dunbar 2118ff7488dc9a766f94daf54d81b03ab9160d0bfd88Daniel Dunbar CmdArgs.push_back("-create"); 2119ff7488dc9a766f94daf54d81b03ab9160d0bfd88Daniel Dunbar assert(Output.isFilename() && "Unexpected lipo output."); 2120a428df828ea4cc6916ea90dcd9fbbc840776d207Daniel Dunbar 2121a428df828ea4cc6916ea90dcd9fbbc840776d207Daniel Dunbar CmdArgs.push_back("-output"); 2122ff7488dc9a766f94daf54d81b03ab9160d0bfd88Daniel Dunbar CmdArgs.push_back(Output.getFilename()); 2123a428df828ea4cc6916ea90dcd9fbbc840776d207Daniel Dunbar 2124ff7488dc9a766f94daf54d81b03ab9160d0bfd88Daniel Dunbar for (InputInfoList::const_iterator 2125ff7488dc9a766f94daf54d81b03ab9160d0bfd88Daniel Dunbar it = Inputs.begin(), ie = Inputs.end(); it != ie; ++it) { 2126ff7488dc9a766f94daf54d81b03ab9160d0bfd88Daniel Dunbar const InputInfo &II = *it; 2127ff7488dc9a766f94daf54d81b03ab9160d0bfd88Daniel Dunbar assert(II.isFilename() && "Unexpected lipo input."); 2128ff7488dc9a766f94daf54d81b03ab9160d0bfd88Daniel Dunbar CmdArgs.push_back(II.getFilename()); 2129ff7488dc9a766f94daf54d81b03ab9160d0bfd88Daniel Dunbar } 2130c21c485b4fb58ef5d55cf3e523263dd824a2ace4Daniel Dunbar const char *Exec = 21315ed34f4c58b6ad4e21038d713c1fae31a6146ff5Daniel Dunbar Args.MakeArgString(getToolChain().GetProgramPath(C, "lipo")); 2132cae087e164e94e4286c11bf694dd0ff88f295302Daniel Dunbar Dest.addCommand(new Command(JA, Exec, CmdArgs)); 2133ff7488dc9a766f94daf54d81b03ab9160d0bfd88Daniel Dunbar} 213468a31d406c6dc4382c700d1199b062de2aa7e1daDaniel Dunbar 2135e7925a075f110ab21afeae084670a155dea568e3Edward O'Callaghanvoid auroraux::Assemble::ConstructJob(Compilation &C, const JobAction &JA, 2136e7925a075f110ab21afeae084670a155dea568e3Edward O'Callaghan Job &Dest, const InputInfo &Output, 2137e7925a075f110ab21afeae084670a155dea568e3Edward O'Callaghan const InputInfoList &Inputs, 2138e7925a075f110ab21afeae084670a155dea568e3Edward O'Callaghan const ArgList &Args, 21391eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump const char *LinkingOutput) const { 2140e7925a075f110ab21afeae084670a155dea568e3Edward O'Callaghan ArgStringList CmdArgs; 2141e7925a075f110ab21afeae084670a155dea568e3Edward O'Callaghan 2142e7925a075f110ab21afeae084670a155dea568e3Edward O'Callaghan Args.AddAllArgValues(CmdArgs, options::OPT_Wa_COMMA, 2143e7925a075f110ab21afeae084670a155dea568e3Edward O'Callaghan options::OPT_Xassembler); 2144e7925a075f110ab21afeae084670a155dea568e3Edward O'Callaghan 2145e7925a075f110ab21afeae084670a155dea568e3Edward O'Callaghan CmdArgs.push_back("-o"); 2146e7925a075f110ab21afeae084670a155dea568e3Edward O'Callaghan if (Output.isPipe()) 2147e7925a075f110ab21afeae084670a155dea568e3Edward O'Callaghan CmdArgs.push_back("-"); 2148e7925a075f110ab21afeae084670a155dea568e3Edward O'Callaghan else 2149e7925a075f110ab21afeae084670a155dea568e3Edward O'Callaghan CmdArgs.push_back(Output.getFilename()); 2150e7925a075f110ab21afeae084670a155dea568e3Edward O'Callaghan 2151e7925a075f110ab21afeae084670a155dea568e3Edward O'Callaghan for (InputInfoList::const_iterator 2152e7925a075f110ab21afeae084670a155dea568e3Edward O'Callaghan it = Inputs.begin(), ie = Inputs.end(); it != ie; ++it) { 2153e7925a075f110ab21afeae084670a155dea568e3Edward O'Callaghan const InputInfo &II = *it; 2154e7925a075f110ab21afeae084670a155dea568e3Edward O'Callaghan if (II.isPipe()) 2155e7925a075f110ab21afeae084670a155dea568e3Edward O'Callaghan CmdArgs.push_back("-"); 2156e7925a075f110ab21afeae084670a155dea568e3Edward O'Callaghan else 2157e7925a075f110ab21afeae084670a155dea568e3Edward O'Callaghan CmdArgs.push_back(II.getFilename()); 2158e7925a075f110ab21afeae084670a155dea568e3Edward O'Callaghan } 2159e7925a075f110ab21afeae084670a155dea568e3Edward O'Callaghan 2160e7925a075f110ab21afeae084670a155dea568e3Edward O'Callaghan const char *Exec = 2161ff430e6d68d1bea07046adafa28a52b314eeaa88Edward O'Callaghan Args.MakeArgString(getToolChain().GetProgramPath(C, "gas")); 2162e7925a075f110ab21afeae084670a155dea568e3Edward O'Callaghan Dest.addCommand(new Command(JA, Exec, CmdArgs)); 2163e7925a075f110ab21afeae084670a155dea568e3Edward O'Callaghan} 2164e7925a075f110ab21afeae084670a155dea568e3Edward O'Callaghan 2165e7925a075f110ab21afeae084670a155dea568e3Edward O'Callaghanvoid auroraux::Link::ConstructJob(Compilation &C, const JobAction &JA, 2166e7925a075f110ab21afeae084670a155dea568e3Edward O'Callaghan Job &Dest, const InputInfo &Output, 2167e7925a075f110ab21afeae084670a155dea568e3Edward O'Callaghan const InputInfoList &Inputs, 2168e7925a075f110ab21afeae084670a155dea568e3Edward O'Callaghan const ArgList &Args, 2169e7925a075f110ab21afeae084670a155dea568e3Edward O'Callaghan const char *LinkingOutput) const { 2170e7925a075f110ab21afeae084670a155dea568e3Edward O'Callaghan const Driver &D = getToolChain().getHost().getDriver(); 2171e7925a075f110ab21afeae084670a155dea568e3Edward O'Callaghan ArgStringList CmdArgs; 2172e7925a075f110ab21afeae084670a155dea568e3Edward O'Callaghan 2173e7925a075f110ab21afeae084670a155dea568e3Edward O'Callaghan if ((!Args.hasArg(options::OPT_nostdlib)) && 2174e7925a075f110ab21afeae084670a155dea568e3Edward O'Callaghan (!Args.hasArg(options::OPT_shared))) { 2175e7925a075f110ab21afeae084670a155dea568e3Edward O'Callaghan CmdArgs.push_back("-e"); 21767adf94906e23eae295a006659c55eab9ffcf8b37Edward O'Callaghan CmdArgs.push_back("_start"); 2177e7925a075f110ab21afeae084670a155dea568e3Edward O'Callaghan } 2178e7925a075f110ab21afeae084670a155dea568e3Edward O'Callaghan 2179e7925a075f110ab21afeae084670a155dea568e3Edward O'Callaghan if (Args.hasArg(options::OPT_static)) { 2180e7925a075f110ab21afeae084670a155dea568e3Edward O'Callaghan CmdArgs.push_back("-Bstatic"); 21817adf94906e23eae295a006659c55eab9ffcf8b37Edward O'Callaghan CmdArgs.push_back("-dn"); 2182e7925a075f110ab21afeae084670a155dea568e3Edward O'Callaghan } else { 21837adf94906e23eae295a006659c55eab9ffcf8b37Edward O'Callaghan// CmdArgs.push_back("--eh-frame-hdr"); 2184e7925a075f110ab21afeae084670a155dea568e3Edward O'Callaghan CmdArgs.push_back("-Bdynamic"); 2185e7925a075f110ab21afeae084670a155dea568e3Edward O'Callaghan if (Args.hasArg(options::OPT_shared)) { 2186e7925a075f110ab21afeae084670a155dea568e3Edward O'Callaghan CmdArgs.push_back("-shared"); 2187e7925a075f110ab21afeae084670a155dea568e3Edward O'Callaghan } else { 21883cecc19f606ba1000da885b8ff4c089abad224ddEdward O'Callaghan CmdArgs.push_back("--dynamic-linker"); 2189e7925a075f110ab21afeae084670a155dea568e3Edward O'Callaghan CmdArgs.push_back("/lib/ld.so.1"); // 64Bit Path /lib/amd64/ld.so.1 2190e7925a075f110ab21afeae084670a155dea568e3Edward O'Callaghan } 2191e7925a075f110ab21afeae084670a155dea568e3Edward O'Callaghan } 2192e7925a075f110ab21afeae084670a155dea568e3Edward O'Callaghan 2193e7925a075f110ab21afeae084670a155dea568e3Edward O'Callaghan if (Output.isPipe()) { 2194e7925a075f110ab21afeae084670a155dea568e3Edward O'Callaghan CmdArgs.push_back("-o"); 2195e7925a075f110ab21afeae084670a155dea568e3Edward O'Callaghan CmdArgs.push_back("-"); 2196e7925a075f110ab21afeae084670a155dea568e3Edward O'Callaghan } else if (Output.isFilename()) { 2197e7925a075f110ab21afeae084670a155dea568e3Edward O'Callaghan CmdArgs.push_back("-o"); 2198e7925a075f110ab21afeae084670a155dea568e3Edward O'Callaghan CmdArgs.push_back(Output.getFilename()); 2199e7925a075f110ab21afeae084670a155dea568e3Edward O'Callaghan } else { 2200e7925a075f110ab21afeae084670a155dea568e3Edward O'Callaghan assert(Output.isNothing() && "Invalid output."); 2201e7925a075f110ab21afeae084670a155dea568e3Edward O'Callaghan } 2202e7925a075f110ab21afeae084670a155dea568e3Edward O'Callaghan 2203e7925a075f110ab21afeae084670a155dea568e3Edward O'Callaghan if (!Args.hasArg(options::OPT_nostdlib) && 2204e7925a075f110ab21afeae084670a155dea568e3Edward O'Callaghan !Args.hasArg(options::OPT_nostartfiles)) { 2205e7925a075f110ab21afeae084670a155dea568e3Edward O'Callaghan if (!Args.hasArg(options::OPT_shared)) { 22067adf94906e23eae295a006659c55eab9ffcf8b37Edward O'Callaghan CmdArgs.push_back(Args.MakeArgString(getToolChain().GetFilePath(C, "crt1.o"))); 22077adf94906e23eae295a006659c55eab9ffcf8b37Edward O'Callaghan CmdArgs.push_back(Args.MakeArgString(getToolChain().GetFilePath(C, "crti.o"))); 22085ed34f4c58b6ad4e21038d713c1fae31a6146ff5Daniel Dunbar CmdArgs.push_back(Args.MakeArgString(getToolChain().GetFilePath(C, "crtbegin.o"))); 2209e7925a075f110ab21afeae084670a155dea568e3Edward O'Callaghan } else { 22107adf94906e23eae295a006659c55eab9ffcf8b37Edward O'Callaghan CmdArgs.push_back(Args.MakeArgString(getToolChain().GetFilePath(C, "crti.o"))); 22117adf94906e23eae295a006659c55eab9ffcf8b37Edward O'Callaghan// CmdArgs.push_back(Args.MakeArgString(getToolChain().GetFilePath(C, "crtbeginS.o"))); 2212e7925a075f110ab21afeae084670a155dea568e3Edward O'Callaghan } 22137adf94906e23eae295a006659c55eab9ffcf8b37Edward O'Callaghan CmdArgs.push_back(Args.MakeArgString(getToolChain().GetFilePath(C, "crtn.o"))); 2214e7925a075f110ab21afeae084670a155dea568e3Edward O'Callaghan } 2215e7925a075f110ab21afeae084670a155dea568e3Edward O'Callaghan 2216e7925a075f110ab21afeae084670a155dea568e3Edward O'Callaghan CmdArgs.push_back(MakeFormattedString(Args, 2217e7925a075f110ab21afeae084670a155dea568e3Edward O'Callaghan llvm::format("-L/opt/gcc4/lib/gcc/%s/4.2.4", 2218e7925a075f110ab21afeae084670a155dea568e3Edward O'Callaghan getToolChain().getTripleString().c_str()))); 2219e7925a075f110ab21afeae084670a155dea568e3Edward O'Callaghan 2220e7925a075f110ab21afeae084670a155dea568e3Edward O'Callaghan Args.AddAllArgs(CmdArgs, options::OPT_L); 2221e7925a075f110ab21afeae084670a155dea568e3Edward O'Callaghan Args.AddAllArgs(CmdArgs, options::OPT_T_Group); 2222e7925a075f110ab21afeae084670a155dea568e3Edward O'Callaghan Args.AddAllArgs(CmdArgs, options::OPT_e); 2223e7925a075f110ab21afeae084670a155dea568e3Edward O'Callaghan 2224e7925a075f110ab21afeae084670a155dea568e3Edward O'Callaghan for (InputInfoList::const_iterator 2225e7925a075f110ab21afeae084670a155dea568e3Edward O'Callaghan it = Inputs.begin(), ie = Inputs.end(); it != ie; ++it) { 2226e7925a075f110ab21afeae084670a155dea568e3Edward O'Callaghan const InputInfo &II = *it; 2227e7925a075f110ab21afeae084670a155dea568e3Edward O'Callaghan 2228e7925a075f110ab21afeae084670a155dea568e3Edward O'Callaghan // Don't try to pass LLVM inputs to a generic gcc. 2229e7925a075f110ab21afeae084670a155dea568e3Edward O'Callaghan if (II.getType() == types::TY_LLVMBC) 2230e7925a075f110ab21afeae084670a155dea568e3Edward O'Callaghan D.Diag(clang::diag::err_drv_no_linker_llvm_support) 2231881376467c46c5c6cc16fa6790271c2c22e1d4f1Daniel Dunbar << getToolChain().getTripleString(); 2232e7925a075f110ab21afeae084670a155dea568e3Edward O'Callaghan 2233e7925a075f110ab21afeae084670a155dea568e3Edward O'Callaghan if (II.isPipe()) 2234e7925a075f110ab21afeae084670a155dea568e3Edward O'Callaghan CmdArgs.push_back("-"); 2235e7925a075f110ab21afeae084670a155dea568e3Edward O'Callaghan else if (II.isFilename()) 2236e7925a075f110ab21afeae084670a155dea568e3Edward O'Callaghan CmdArgs.push_back(II.getFilename()); 2237e7925a075f110ab21afeae084670a155dea568e3Edward O'Callaghan else 2238e7925a075f110ab21afeae084670a155dea568e3Edward O'Callaghan II.getInputArg().renderAsInput(Args, CmdArgs); 2239e7925a075f110ab21afeae084670a155dea568e3Edward O'Callaghan } 2240e7925a075f110ab21afeae084670a155dea568e3Edward O'Callaghan 2241e7925a075f110ab21afeae084670a155dea568e3Edward O'Callaghan if (!Args.hasArg(options::OPT_nostdlib) && 2242e7925a075f110ab21afeae084670a155dea568e3Edward O'Callaghan !Args.hasArg(options::OPT_nodefaultlibs)) { 2243e7925a075f110ab21afeae084670a155dea568e3Edward O'Callaghan // FIXME: For some reason GCC passes -lgcc before adding 2244e7925a075f110ab21afeae084670a155dea568e3Edward O'Callaghan // the default system libraries. Just mimic this for now. 2245e7925a075f110ab21afeae084670a155dea568e3Edward O'Callaghan CmdArgs.push_back("-lgcc"); 2246e7925a075f110ab21afeae084670a155dea568e3Edward O'Callaghan 2247e7925a075f110ab21afeae084670a155dea568e3Edward O'Callaghan if (Args.hasArg(options::OPT_pthread)) 2248e7925a075f110ab21afeae084670a155dea568e3Edward O'Callaghan CmdArgs.push_back("-pthread"); 2249e7925a075f110ab21afeae084670a155dea568e3Edward O'Callaghan if (!Args.hasArg(options::OPT_shared)) 2250e7925a075f110ab21afeae084670a155dea568e3Edward O'Callaghan CmdArgs.push_back("-lc"); 2251e7925a075f110ab21afeae084670a155dea568e3Edward O'Callaghan CmdArgs.push_back("-lgcc"); 2252e7925a075f110ab21afeae084670a155dea568e3Edward O'Callaghan } 2253e7925a075f110ab21afeae084670a155dea568e3Edward O'Callaghan 2254e7925a075f110ab21afeae084670a155dea568e3Edward O'Callaghan if (!Args.hasArg(options::OPT_nostdlib) && 2255e7925a075f110ab21afeae084670a155dea568e3Edward O'Callaghan !Args.hasArg(options::OPT_nostartfiles)) { 2256e7925a075f110ab21afeae084670a155dea568e3Edward O'Callaghan if (!Args.hasArg(options::OPT_shared)) 22575ed34f4c58b6ad4e21038d713c1fae31a6146ff5Daniel Dunbar CmdArgs.push_back(Args.MakeArgString(getToolChain().GetFilePath(C, "crtend.o"))); 22587adf94906e23eae295a006659c55eab9ffcf8b37Edward O'Callaghan// else 22597adf94906e23eae295a006659c55eab9ffcf8b37Edward O'Callaghan// CmdArgs.push_back(Args.MakeArgString(getToolChain().GetFilePath(C, "crtendS.o"))); 2260e7925a075f110ab21afeae084670a155dea568e3Edward O'Callaghan } 2261e7925a075f110ab21afeae084670a155dea568e3Edward O'Callaghan 2262e7925a075f110ab21afeae084670a155dea568e3Edward O'Callaghan const char *Exec = 22635ed34f4c58b6ad4e21038d713c1fae31a6146ff5Daniel Dunbar Args.MakeArgString(getToolChain().GetProgramPath(C, "ld")); 2264e7925a075f110ab21afeae084670a155dea568e3Edward O'Callaghan Dest.addCommand(new Command(JA, Exec, CmdArgs)); 2265e7925a075f110ab21afeae084670a155dea568e3Edward O'Callaghan} 2266e7925a075f110ab21afeae084670a155dea568e3Edward O'Callaghan 2267f7b8eec37c8c8012fa525c71fb29a58c9f29beefDaniel Dunbarvoid openbsd::Assemble::ConstructJob(Compilation &C, const JobAction &JA, 2268f7b8eec37c8c8012fa525c71fb29a58c9f29beefDaniel Dunbar Job &Dest, const InputInfo &Output, 2269f7b8eec37c8c8012fa525c71fb29a58c9f29beefDaniel Dunbar const InputInfoList &Inputs, 2270f7b8eec37c8c8012fa525c71fb29a58c9f29beefDaniel Dunbar const ArgList &Args, 22711eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump const char *LinkingOutput) const { 2272f7b8eec37c8c8012fa525c71fb29a58c9f29beefDaniel Dunbar ArgStringList CmdArgs; 2273f7b8eec37c8c8012fa525c71fb29a58c9f29beefDaniel Dunbar 2274f7b8eec37c8c8012fa525c71fb29a58c9f29beefDaniel Dunbar Args.AddAllArgValues(CmdArgs, options::OPT_Wa_COMMA, 2275f7b8eec37c8c8012fa525c71fb29a58c9f29beefDaniel Dunbar options::OPT_Xassembler); 2276f7b8eec37c8c8012fa525c71fb29a58c9f29beefDaniel Dunbar 2277f7b8eec37c8c8012fa525c71fb29a58c9f29beefDaniel Dunbar CmdArgs.push_back("-o"); 2278f7b8eec37c8c8012fa525c71fb29a58c9f29beefDaniel Dunbar if (Output.isPipe()) 2279f7b8eec37c8c8012fa525c71fb29a58c9f29beefDaniel Dunbar CmdArgs.push_back("-"); 2280f7b8eec37c8c8012fa525c71fb29a58c9f29beefDaniel Dunbar else 2281f7b8eec37c8c8012fa525c71fb29a58c9f29beefDaniel Dunbar CmdArgs.push_back(Output.getFilename()); 2282f7b8eec37c8c8012fa525c71fb29a58c9f29beefDaniel Dunbar 2283f7b8eec37c8c8012fa525c71fb29a58c9f29beefDaniel Dunbar for (InputInfoList::const_iterator 2284f7b8eec37c8c8012fa525c71fb29a58c9f29beefDaniel Dunbar it = Inputs.begin(), ie = Inputs.end(); it != ie; ++it) { 2285f7b8eec37c8c8012fa525c71fb29a58c9f29beefDaniel Dunbar const InputInfo &II = *it; 2286f7b8eec37c8c8012fa525c71fb29a58c9f29beefDaniel Dunbar if (II.isPipe()) 2287f7b8eec37c8c8012fa525c71fb29a58c9f29beefDaniel Dunbar CmdArgs.push_back("-"); 2288f7b8eec37c8c8012fa525c71fb29a58c9f29beefDaniel Dunbar else 2289f7b8eec37c8c8012fa525c71fb29a58c9f29beefDaniel Dunbar CmdArgs.push_back(II.getFilename()); 2290f7b8eec37c8c8012fa525c71fb29a58c9f29beefDaniel Dunbar } 2291f7b8eec37c8c8012fa525c71fb29a58c9f29beefDaniel Dunbar 2292f7b8eec37c8c8012fa525c71fb29a58c9f29beefDaniel Dunbar const char *Exec = 22935ed34f4c58b6ad4e21038d713c1fae31a6146ff5Daniel Dunbar Args.MakeArgString(getToolChain().GetProgramPath(C, "as")); 2294cae087e164e94e4286c11bf694dd0ff88f295302Daniel Dunbar Dest.addCommand(new Command(JA, Exec, CmdArgs)); 2295f7b8eec37c8c8012fa525c71fb29a58c9f29beefDaniel Dunbar} 2296f7b8eec37c8c8012fa525c71fb29a58c9f29beefDaniel Dunbar 2297f7b8eec37c8c8012fa525c71fb29a58c9f29beefDaniel Dunbarvoid openbsd::Link::ConstructJob(Compilation &C, const JobAction &JA, 2298f7b8eec37c8c8012fa525c71fb29a58c9f29beefDaniel Dunbar Job &Dest, const InputInfo &Output, 2299f7b8eec37c8c8012fa525c71fb29a58c9f29beefDaniel Dunbar const InputInfoList &Inputs, 2300f7b8eec37c8c8012fa525c71fb29a58c9f29beefDaniel Dunbar const ArgList &Args, 2301f7b8eec37c8c8012fa525c71fb29a58c9f29beefDaniel Dunbar const char *LinkingOutput) const { 2302f7b8eec37c8c8012fa525c71fb29a58c9f29beefDaniel Dunbar const Driver &D = getToolChain().getHost().getDriver(); 2303f7b8eec37c8c8012fa525c71fb29a58c9f29beefDaniel Dunbar ArgStringList CmdArgs; 2304f7b8eec37c8c8012fa525c71fb29a58c9f29beefDaniel Dunbar 23052bbcf669742b6b27748414e22f8042236fceef65Daniel Dunbar if ((!Args.hasArg(options::OPT_nostdlib)) && 23062bbcf669742b6b27748414e22f8042236fceef65Daniel Dunbar (!Args.hasArg(options::OPT_shared))) { 23072bbcf669742b6b27748414e22f8042236fceef65Daniel Dunbar CmdArgs.push_back("-e"); 23082bbcf669742b6b27748414e22f8042236fceef65Daniel Dunbar CmdArgs.push_back("__start"); 23092bbcf669742b6b27748414e22f8042236fceef65Daniel Dunbar } 23102bbcf669742b6b27748414e22f8042236fceef65Daniel Dunbar 2311f7b8eec37c8c8012fa525c71fb29a58c9f29beefDaniel Dunbar if (Args.hasArg(options::OPT_static)) { 2312f7b8eec37c8c8012fa525c71fb29a58c9f29beefDaniel Dunbar CmdArgs.push_back("-Bstatic"); 2313f7b8eec37c8c8012fa525c71fb29a58c9f29beefDaniel Dunbar } else { 2314f7b8eec37c8c8012fa525c71fb29a58c9f29beefDaniel Dunbar CmdArgs.push_back("--eh-frame-hdr"); 23152bbcf669742b6b27748414e22f8042236fceef65Daniel Dunbar CmdArgs.push_back("-Bdynamic"); 2316f7b8eec37c8c8012fa525c71fb29a58c9f29beefDaniel Dunbar if (Args.hasArg(options::OPT_shared)) { 23172bbcf669742b6b27748414e22f8042236fceef65Daniel Dunbar CmdArgs.push_back("-shared"); 2318f7b8eec37c8c8012fa525c71fb29a58c9f29beefDaniel Dunbar } else { 2319f7b8eec37c8c8012fa525c71fb29a58c9f29beefDaniel Dunbar CmdArgs.push_back("-dynamic-linker"); 2320f7b8eec37c8c8012fa525c71fb29a58c9f29beefDaniel Dunbar CmdArgs.push_back("/usr/libexec/ld.so"); 2321f7b8eec37c8c8012fa525c71fb29a58c9f29beefDaniel Dunbar } 2322f7b8eec37c8c8012fa525c71fb29a58c9f29beefDaniel Dunbar } 2323f7b8eec37c8c8012fa525c71fb29a58c9f29beefDaniel Dunbar 2324f7b8eec37c8c8012fa525c71fb29a58c9f29beefDaniel Dunbar if (Output.isPipe()) { 2325f7b8eec37c8c8012fa525c71fb29a58c9f29beefDaniel Dunbar CmdArgs.push_back("-o"); 2326f7b8eec37c8c8012fa525c71fb29a58c9f29beefDaniel Dunbar CmdArgs.push_back("-"); 2327f7b8eec37c8c8012fa525c71fb29a58c9f29beefDaniel Dunbar } else if (Output.isFilename()) { 2328f7b8eec37c8c8012fa525c71fb29a58c9f29beefDaniel Dunbar CmdArgs.push_back("-o"); 2329f7b8eec37c8c8012fa525c71fb29a58c9f29beefDaniel Dunbar CmdArgs.push_back(Output.getFilename()); 2330f7b8eec37c8c8012fa525c71fb29a58c9f29beefDaniel Dunbar } else { 2331f7b8eec37c8c8012fa525c71fb29a58c9f29beefDaniel Dunbar assert(Output.isNothing() && "Invalid output."); 2332f7b8eec37c8c8012fa525c71fb29a58c9f29beefDaniel Dunbar } 2333f7b8eec37c8c8012fa525c71fb29a58c9f29beefDaniel Dunbar 2334f7b8eec37c8c8012fa525c71fb29a58c9f29beefDaniel Dunbar if (!Args.hasArg(options::OPT_nostdlib) && 2335f7b8eec37c8c8012fa525c71fb29a58c9f29beefDaniel Dunbar !Args.hasArg(options::OPT_nostartfiles)) { 2336f7b8eec37c8c8012fa525c71fb29a58c9f29beefDaniel Dunbar if (!Args.hasArg(options::OPT_shared)) { 23375ed34f4c58b6ad4e21038d713c1fae31a6146ff5Daniel Dunbar CmdArgs.push_back(Args.MakeArgString(getToolChain().GetFilePath(C, "crt0.o"))); 23385ed34f4c58b6ad4e21038d713c1fae31a6146ff5Daniel Dunbar CmdArgs.push_back(Args.MakeArgString(getToolChain().GetFilePath(C, "crtbegin.o"))); 2339f7b8eec37c8c8012fa525c71fb29a58c9f29beefDaniel Dunbar } else { 23405ed34f4c58b6ad4e21038d713c1fae31a6146ff5Daniel Dunbar CmdArgs.push_back(Args.MakeArgString(getToolChain().GetFilePath(C, "crtbeginS.o"))); 2341f7b8eec37c8c8012fa525c71fb29a58c9f29beefDaniel Dunbar } 2342f7b8eec37c8c8012fa525c71fb29a58c9f29beefDaniel Dunbar } 2343f7b8eec37c8c8012fa525c71fb29a58c9f29beefDaniel Dunbar 2344e7e18200e614a5e619602a088544c85ac8305a1fEdward O'Callaghan std::string Triple = getToolChain().getTripleString(); 2345e7e18200e614a5e619602a088544c85ac8305a1fEdward O'Callaghan if (Triple.substr(0, 6) == "x86_64") 2346e7e18200e614a5e619602a088544c85ac8305a1fEdward O'Callaghan Triple.replace(0, 6, "amd64"); 23472bbcf669742b6b27748414e22f8042236fceef65Daniel Dunbar CmdArgs.push_back(MakeFormattedString(Args, 23482bbcf669742b6b27748414e22f8042236fceef65Daniel Dunbar llvm::format("-L/usr/lib/gcc-lib/%s/3.3.5", 2349e7e18200e614a5e619602a088544c85ac8305a1fEdward O'Callaghan Triple.c_str()))); 23502bbcf669742b6b27748414e22f8042236fceef65Daniel Dunbar 2351f7b8eec37c8c8012fa525c71fb29a58c9f29beefDaniel Dunbar Args.AddAllArgs(CmdArgs, options::OPT_L); 2352f7b8eec37c8c8012fa525c71fb29a58c9f29beefDaniel Dunbar Args.AddAllArgs(CmdArgs, options::OPT_T_Group); 2353f7b8eec37c8c8012fa525c71fb29a58c9f29beefDaniel Dunbar Args.AddAllArgs(CmdArgs, options::OPT_e); 2354f7b8eec37c8c8012fa525c71fb29a58c9f29beefDaniel Dunbar 2355f7b8eec37c8c8012fa525c71fb29a58c9f29beefDaniel Dunbar for (InputInfoList::const_iterator 2356f7b8eec37c8c8012fa525c71fb29a58c9f29beefDaniel Dunbar it = Inputs.begin(), ie = Inputs.end(); it != ie; ++it) { 2357f7b8eec37c8c8012fa525c71fb29a58c9f29beefDaniel Dunbar const InputInfo &II = *it; 2358f7b8eec37c8c8012fa525c71fb29a58c9f29beefDaniel Dunbar 2359f7b8eec37c8c8012fa525c71fb29a58c9f29beefDaniel Dunbar // Don't try to pass LLVM inputs to a generic gcc. 2360f7b8eec37c8c8012fa525c71fb29a58c9f29beefDaniel Dunbar if (II.getType() == types::TY_LLVMBC) 2361f7b8eec37c8c8012fa525c71fb29a58c9f29beefDaniel Dunbar D.Diag(clang::diag::err_drv_no_linker_llvm_support) 2362881376467c46c5c6cc16fa6790271c2c22e1d4f1Daniel Dunbar << getToolChain().getTripleString(); 2363f7b8eec37c8c8012fa525c71fb29a58c9f29beefDaniel Dunbar 2364f7b8eec37c8c8012fa525c71fb29a58c9f29beefDaniel Dunbar if (II.isPipe()) 2365f7b8eec37c8c8012fa525c71fb29a58c9f29beefDaniel Dunbar CmdArgs.push_back("-"); 2366f7b8eec37c8c8012fa525c71fb29a58c9f29beefDaniel Dunbar else if (II.isFilename()) 2367f7b8eec37c8c8012fa525c71fb29a58c9f29beefDaniel Dunbar CmdArgs.push_back(II.getFilename()); 2368f7b8eec37c8c8012fa525c71fb29a58c9f29beefDaniel Dunbar else 2369f7b8eec37c8c8012fa525c71fb29a58c9f29beefDaniel Dunbar II.getInputArg().renderAsInput(Args, CmdArgs); 2370f7b8eec37c8c8012fa525c71fb29a58c9f29beefDaniel Dunbar } 2371f7b8eec37c8c8012fa525c71fb29a58c9f29beefDaniel Dunbar 2372f7b8eec37c8c8012fa525c71fb29a58c9f29beefDaniel Dunbar if (!Args.hasArg(options::OPT_nostdlib) && 2373f7b8eec37c8c8012fa525c71fb29a58c9f29beefDaniel Dunbar !Args.hasArg(options::OPT_nodefaultlibs)) { 23742bbcf669742b6b27748414e22f8042236fceef65Daniel Dunbar // FIXME: For some reason GCC passes -lgcc before adding 23752bbcf669742b6b27748414e22f8042236fceef65Daniel Dunbar // the default system libraries. Just mimic this for now. 23762bbcf669742b6b27748414e22f8042236fceef65Daniel Dunbar CmdArgs.push_back("-lgcc"); 2377f7b8eec37c8c8012fa525c71fb29a58c9f29beefDaniel Dunbar 2378f7b8eec37c8c8012fa525c71fb29a58c9f29beefDaniel Dunbar if (Args.hasArg(options::OPT_pthread)) 2379f7b8eec37c8c8012fa525c71fb29a58c9f29beefDaniel Dunbar CmdArgs.push_back("-pthread"); 23802bbcf669742b6b27748414e22f8042236fceef65Daniel Dunbar if (!Args.hasArg(options::OPT_shared)) 23812bbcf669742b6b27748414e22f8042236fceef65Daniel Dunbar CmdArgs.push_back("-lc"); 23822bbcf669742b6b27748414e22f8042236fceef65Daniel Dunbar CmdArgs.push_back("-lgcc"); 2383f7b8eec37c8c8012fa525c71fb29a58c9f29beefDaniel Dunbar } 2384f7b8eec37c8c8012fa525c71fb29a58c9f29beefDaniel Dunbar 2385f7b8eec37c8c8012fa525c71fb29a58c9f29beefDaniel Dunbar if (!Args.hasArg(options::OPT_nostdlib) && 2386f7b8eec37c8c8012fa525c71fb29a58c9f29beefDaniel Dunbar !Args.hasArg(options::OPT_nostartfiles)) { 2387f7b8eec37c8c8012fa525c71fb29a58c9f29beefDaniel Dunbar if (!Args.hasArg(options::OPT_shared)) 23885ed34f4c58b6ad4e21038d713c1fae31a6146ff5Daniel Dunbar CmdArgs.push_back(Args.MakeArgString(getToolChain().GetFilePath(C, "crtend.o"))); 2389f7b8eec37c8c8012fa525c71fb29a58c9f29beefDaniel Dunbar else 23905ed34f4c58b6ad4e21038d713c1fae31a6146ff5Daniel Dunbar CmdArgs.push_back(Args.MakeArgString(getToolChain().GetFilePath(C, "crtendS.o"))); 2391f7b8eec37c8c8012fa525c71fb29a58c9f29beefDaniel Dunbar } 2392f7b8eec37c8c8012fa525c71fb29a58c9f29beefDaniel Dunbar 2393f7b8eec37c8c8012fa525c71fb29a58c9f29beefDaniel Dunbar const char *Exec = 23945ed34f4c58b6ad4e21038d713c1fae31a6146ff5Daniel Dunbar Args.MakeArgString(getToolChain().GetProgramPath(C, "ld")); 2395cae087e164e94e4286c11bf694dd0ff88f295302Daniel Dunbar Dest.addCommand(new Command(JA, Exec, CmdArgs)); 2396f7b8eec37c8c8012fa525c71fb29a58c9f29beefDaniel Dunbar} 2397c66a5a30a27e7b9cfab46ac8be918e3ea5b0c5a5Ed Schouten 239868a31d406c6dc4382c700d1199b062de2aa7e1daDaniel Dunbarvoid freebsd::Assemble::ConstructJob(Compilation &C, const JobAction &JA, 2399c21c485b4fb58ef5d55cf3e523263dd824a2ace4Daniel Dunbar Job &Dest, const InputInfo &Output, 2400c21c485b4fb58ef5d55cf3e523263dd824a2ace4Daniel Dunbar const InputInfoList &Inputs, 2401c21c485b4fb58ef5d55cf3e523263dd824a2ace4Daniel Dunbar const ArgList &Args, 24021eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump const char *LinkingOutput) const { 240368a31d406c6dc4382c700d1199b062de2aa7e1daDaniel Dunbar ArgStringList CmdArgs; 240468a31d406c6dc4382c700d1199b062de2aa7e1daDaniel Dunbar 2405008f54a54299eaafdaa940e2bdeaf55935ecd95aDaniel Dunbar // When building 32-bit code on FreeBSD/amd64, we have to explicitly 2406008f54a54299eaafdaa940e2bdeaf55935ecd95aDaniel Dunbar // instruct as in the base system to assemble 32-bit code. 2407008f54a54299eaafdaa940e2bdeaf55935ecd95aDaniel Dunbar if (getToolChain().getArchName() == "i386") 240868a31d406c6dc4382c700d1199b062de2aa7e1daDaniel Dunbar CmdArgs.push_back("--32"); 240968a31d406c6dc4382c700d1199b062de2aa7e1daDaniel Dunbar 241068a31d406c6dc4382c700d1199b062de2aa7e1daDaniel Dunbar Args.AddAllArgValues(CmdArgs, options::OPT_Wa_COMMA, 241168a31d406c6dc4382c700d1199b062de2aa7e1daDaniel Dunbar options::OPT_Xassembler); 241268a31d406c6dc4382c700d1199b062de2aa7e1daDaniel Dunbar 241368a31d406c6dc4382c700d1199b062de2aa7e1daDaniel Dunbar CmdArgs.push_back("-o"); 241468a31d406c6dc4382c700d1199b062de2aa7e1daDaniel Dunbar if (Output.isPipe()) 241568a31d406c6dc4382c700d1199b062de2aa7e1daDaniel Dunbar CmdArgs.push_back("-"); 241668a31d406c6dc4382c700d1199b062de2aa7e1daDaniel Dunbar else 241768a31d406c6dc4382c700d1199b062de2aa7e1daDaniel Dunbar CmdArgs.push_back(Output.getFilename()); 241868a31d406c6dc4382c700d1199b062de2aa7e1daDaniel Dunbar 241968a31d406c6dc4382c700d1199b062de2aa7e1daDaniel Dunbar for (InputInfoList::const_iterator 242068a31d406c6dc4382c700d1199b062de2aa7e1daDaniel Dunbar it = Inputs.begin(), ie = Inputs.end(); it != ie; ++it) { 242168a31d406c6dc4382c700d1199b062de2aa7e1daDaniel Dunbar const InputInfo &II = *it; 242268a31d406c6dc4382c700d1199b062de2aa7e1daDaniel Dunbar if (II.isPipe()) 242368a31d406c6dc4382c700d1199b062de2aa7e1daDaniel Dunbar CmdArgs.push_back("-"); 242468a31d406c6dc4382c700d1199b062de2aa7e1daDaniel Dunbar else 242568a31d406c6dc4382c700d1199b062de2aa7e1daDaniel Dunbar CmdArgs.push_back(II.getFilename()); 242668a31d406c6dc4382c700d1199b062de2aa7e1daDaniel Dunbar } 242768a31d406c6dc4382c700d1199b062de2aa7e1daDaniel Dunbar 2428c21c485b4fb58ef5d55cf3e523263dd824a2ace4Daniel Dunbar const char *Exec = 24295ed34f4c58b6ad4e21038d713c1fae31a6146ff5Daniel Dunbar Args.MakeArgString(getToolChain().GetProgramPath(C, "as")); 2430cae087e164e94e4286c11bf694dd0ff88f295302Daniel Dunbar Dest.addCommand(new Command(JA, Exec, CmdArgs)); 243168a31d406c6dc4382c700d1199b062de2aa7e1daDaniel Dunbar} 2432008f54a54299eaafdaa940e2bdeaf55935ecd95aDaniel Dunbar 2433008f54a54299eaafdaa940e2bdeaf55935ecd95aDaniel Dunbarvoid freebsd::Link::ConstructJob(Compilation &C, const JobAction &JA, 2434c21c485b4fb58ef5d55cf3e523263dd824a2ace4Daniel Dunbar Job &Dest, const InputInfo &Output, 2435c21c485b4fb58ef5d55cf3e523263dd824a2ace4Daniel Dunbar const InputInfoList &Inputs, 2436c21c485b4fb58ef5d55cf3e523263dd824a2ace4Daniel Dunbar const ArgList &Args, 2437a8304f67291b0182fb64f3afc621615288dd1d31Daniel Dunbar const char *LinkingOutput) const { 2438a8304f67291b0182fb64f3afc621615288dd1d31Daniel Dunbar const Driver &D = getToolChain().getHost().getDriver(); 2439008f54a54299eaafdaa940e2bdeaf55935ecd95aDaniel Dunbar ArgStringList CmdArgs; 2440008f54a54299eaafdaa940e2bdeaf55935ecd95aDaniel Dunbar 2441008f54a54299eaafdaa940e2bdeaf55935ecd95aDaniel Dunbar if (Args.hasArg(options::OPT_static)) { 2442008f54a54299eaafdaa940e2bdeaf55935ecd95aDaniel Dunbar CmdArgs.push_back("-Bstatic"); 2443008f54a54299eaafdaa940e2bdeaf55935ecd95aDaniel Dunbar } else { 2444008f54a54299eaafdaa940e2bdeaf55935ecd95aDaniel Dunbar CmdArgs.push_back("--eh-frame-hdr"); 2445008f54a54299eaafdaa940e2bdeaf55935ecd95aDaniel Dunbar if (Args.hasArg(options::OPT_shared)) { 2446008f54a54299eaafdaa940e2bdeaf55935ecd95aDaniel Dunbar CmdArgs.push_back("-Bshareable"); 2447008f54a54299eaafdaa940e2bdeaf55935ecd95aDaniel Dunbar } else { 2448008f54a54299eaafdaa940e2bdeaf55935ecd95aDaniel Dunbar CmdArgs.push_back("-dynamic-linker"); 2449008f54a54299eaafdaa940e2bdeaf55935ecd95aDaniel Dunbar CmdArgs.push_back("/libexec/ld-elf.so.1"); 2450008f54a54299eaafdaa940e2bdeaf55935ecd95aDaniel Dunbar } 2451008f54a54299eaafdaa940e2bdeaf55935ecd95aDaniel Dunbar } 2452008f54a54299eaafdaa940e2bdeaf55935ecd95aDaniel Dunbar 2453008f54a54299eaafdaa940e2bdeaf55935ecd95aDaniel Dunbar // When building 32-bit code on FreeBSD/amd64, we have to explicitly 2454008f54a54299eaafdaa940e2bdeaf55935ecd95aDaniel Dunbar // instruct ld in the base system to link 32-bit code. 2455008f54a54299eaafdaa940e2bdeaf55935ecd95aDaniel Dunbar if (getToolChain().getArchName() == "i386") { 2456008f54a54299eaafdaa940e2bdeaf55935ecd95aDaniel Dunbar CmdArgs.push_back("-m"); 2457008f54a54299eaafdaa940e2bdeaf55935ecd95aDaniel Dunbar CmdArgs.push_back("elf_i386_fbsd"); 2458008f54a54299eaafdaa940e2bdeaf55935ecd95aDaniel Dunbar } 2459008f54a54299eaafdaa940e2bdeaf55935ecd95aDaniel Dunbar 2460008f54a54299eaafdaa940e2bdeaf55935ecd95aDaniel Dunbar if (Output.isPipe()) { 2461008f54a54299eaafdaa940e2bdeaf55935ecd95aDaniel Dunbar CmdArgs.push_back("-o"); 2462008f54a54299eaafdaa940e2bdeaf55935ecd95aDaniel Dunbar CmdArgs.push_back("-"); 2463008f54a54299eaafdaa940e2bdeaf55935ecd95aDaniel Dunbar } else if (Output.isFilename()) { 2464008f54a54299eaafdaa940e2bdeaf55935ecd95aDaniel Dunbar CmdArgs.push_back("-o"); 2465008f54a54299eaafdaa940e2bdeaf55935ecd95aDaniel Dunbar CmdArgs.push_back(Output.getFilename()); 2466008f54a54299eaafdaa940e2bdeaf55935ecd95aDaniel Dunbar } else { 2467008f54a54299eaafdaa940e2bdeaf55935ecd95aDaniel Dunbar assert(Output.isNothing() && "Invalid output."); 2468008f54a54299eaafdaa940e2bdeaf55935ecd95aDaniel Dunbar } 2469008f54a54299eaafdaa940e2bdeaf55935ecd95aDaniel Dunbar 2470008f54a54299eaafdaa940e2bdeaf55935ecd95aDaniel Dunbar if (!Args.hasArg(options::OPT_nostdlib) && 2471008f54a54299eaafdaa940e2bdeaf55935ecd95aDaniel Dunbar !Args.hasArg(options::OPT_nostartfiles)) { 2472008f54a54299eaafdaa940e2bdeaf55935ecd95aDaniel Dunbar if (!Args.hasArg(options::OPT_shared)) { 24735ed34f4c58b6ad4e21038d713c1fae31a6146ff5Daniel Dunbar CmdArgs.push_back(Args.MakeArgString(getToolChain().GetFilePath(C, "crt1.o"))); 24745ed34f4c58b6ad4e21038d713c1fae31a6146ff5Daniel Dunbar CmdArgs.push_back(Args.MakeArgString(getToolChain().GetFilePath(C, "crti.o"))); 24755ed34f4c58b6ad4e21038d713c1fae31a6146ff5Daniel Dunbar CmdArgs.push_back(Args.MakeArgString(getToolChain().GetFilePath(C, "crtbegin.o"))); 2476008f54a54299eaafdaa940e2bdeaf55935ecd95aDaniel Dunbar } else { 24775ed34f4c58b6ad4e21038d713c1fae31a6146ff5Daniel Dunbar CmdArgs.push_back(Args.MakeArgString(getToolChain().GetFilePath(C, "crti.o"))); 24785ed34f4c58b6ad4e21038d713c1fae31a6146ff5Daniel Dunbar CmdArgs.push_back(Args.MakeArgString(getToolChain().GetFilePath(C, "crtbeginS.o"))); 2479008f54a54299eaafdaa940e2bdeaf55935ecd95aDaniel Dunbar } 2480008f54a54299eaafdaa940e2bdeaf55935ecd95aDaniel Dunbar } 2481008f54a54299eaafdaa940e2bdeaf55935ecd95aDaniel Dunbar 2482008f54a54299eaafdaa940e2bdeaf55935ecd95aDaniel Dunbar Args.AddAllArgs(CmdArgs, options::OPT_L); 2483008f54a54299eaafdaa940e2bdeaf55935ecd95aDaniel Dunbar Args.AddAllArgs(CmdArgs, options::OPT_T_Group); 2484008f54a54299eaafdaa940e2bdeaf55935ecd95aDaniel Dunbar Args.AddAllArgs(CmdArgs, options::OPT_e); 2485008f54a54299eaafdaa940e2bdeaf55935ecd95aDaniel Dunbar 2486008f54a54299eaafdaa940e2bdeaf55935ecd95aDaniel Dunbar for (InputInfoList::const_iterator 2487c21c485b4fb58ef5d55cf3e523263dd824a2ace4Daniel Dunbar it = Inputs.begin(), ie = Inputs.end(); it != ie; ++it) { 2488008f54a54299eaafdaa940e2bdeaf55935ecd95aDaniel Dunbar const InputInfo &II = *it; 2489a8304f67291b0182fb64f3afc621615288dd1d31Daniel Dunbar 2490a8304f67291b0182fb64f3afc621615288dd1d31Daniel Dunbar // Don't try to pass LLVM inputs to a generic gcc. 2491a8304f67291b0182fb64f3afc621615288dd1d31Daniel Dunbar if (II.getType() == types::TY_LLVMBC) 2492a8304f67291b0182fb64f3afc621615288dd1d31Daniel Dunbar D.Diag(clang::diag::err_drv_no_linker_llvm_support) 2493881376467c46c5c6cc16fa6790271c2c22e1d4f1Daniel Dunbar << getToolChain().getTripleString(); 2494a8304f67291b0182fb64f3afc621615288dd1d31Daniel Dunbar 2495008f54a54299eaafdaa940e2bdeaf55935ecd95aDaniel Dunbar if (II.isPipe()) 2496008f54a54299eaafdaa940e2bdeaf55935ecd95aDaniel Dunbar CmdArgs.push_back("-"); 2497008f54a54299eaafdaa940e2bdeaf55935ecd95aDaniel Dunbar else if (II.isFilename()) 2498008f54a54299eaafdaa940e2bdeaf55935ecd95aDaniel Dunbar CmdArgs.push_back(II.getFilename()); 2499008f54a54299eaafdaa940e2bdeaf55935ecd95aDaniel Dunbar else 2500008f54a54299eaafdaa940e2bdeaf55935ecd95aDaniel Dunbar II.getInputArg().renderAsInput(Args, CmdArgs); 2501008f54a54299eaafdaa940e2bdeaf55935ecd95aDaniel Dunbar } 2502008f54a54299eaafdaa940e2bdeaf55935ecd95aDaniel Dunbar 2503008f54a54299eaafdaa940e2bdeaf55935ecd95aDaniel Dunbar if (!Args.hasArg(options::OPT_nostdlib) && 2504008f54a54299eaafdaa940e2bdeaf55935ecd95aDaniel Dunbar !Args.hasArg(options::OPT_nodefaultlibs)) { 2505008f54a54299eaafdaa940e2bdeaf55935ecd95aDaniel Dunbar // FIXME: For some reason GCC passes -lgcc and -lgcc_s before adding 2506008f54a54299eaafdaa940e2bdeaf55935ecd95aDaniel Dunbar // the default system libraries. Just mimic this for now. 2507008f54a54299eaafdaa940e2bdeaf55935ecd95aDaniel Dunbar CmdArgs.push_back("-lgcc"); 2508008f54a54299eaafdaa940e2bdeaf55935ecd95aDaniel Dunbar if (Args.hasArg(options::OPT_static)) { 2509008f54a54299eaafdaa940e2bdeaf55935ecd95aDaniel Dunbar CmdArgs.push_back("-lgcc_eh"); 2510008f54a54299eaafdaa940e2bdeaf55935ecd95aDaniel Dunbar } else { 2511008f54a54299eaafdaa940e2bdeaf55935ecd95aDaniel Dunbar CmdArgs.push_back("--as-needed"); 2512008f54a54299eaafdaa940e2bdeaf55935ecd95aDaniel Dunbar CmdArgs.push_back("-lgcc_s"); 2513008f54a54299eaafdaa940e2bdeaf55935ecd95aDaniel Dunbar CmdArgs.push_back("--no-as-needed"); 2514008f54a54299eaafdaa940e2bdeaf55935ecd95aDaniel Dunbar } 2515008f54a54299eaafdaa940e2bdeaf55935ecd95aDaniel Dunbar 2516008f54a54299eaafdaa940e2bdeaf55935ecd95aDaniel Dunbar if (Args.hasArg(options::OPT_pthread)) 2517008f54a54299eaafdaa940e2bdeaf55935ecd95aDaniel Dunbar CmdArgs.push_back("-lpthread"); 2518008f54a54299eaafdaa940e2bdeaf55935ecd95aDaniel Dunbar CmdArgs.push_back("-lc"); 2519008f54a54299eaafdaa940e2bdeaf55935ecd95aDaniel Dunbar 2520008f54a54299eaafdaa940e2bdeaf55935ecd95aDaniel Dunbar CmdArgs.push_back("-lgcc"); 2521008f54a54299eaafdaa940e2bdeaf55935ecd95aDaniel Dunbar if (Args.hasArg(options::OPT_static)) { 2522008f54a54299eaafdaa940e2bdeaf55935ecd95aDaniel Dunbar CmdArgs.push_back("-lgcc_eh"); 2523008f54a54299eaafdaa940e2bdeaf55935ecd95aDaniel Dunbar } else { 2524008f54a54299eaafdaa940e2bdeaf55935ecd95aDaniel Dunbar CmdArgs.push_back("--as-needed"); 2525008f54a54299eaafdaa940e2bdeaf55935ecd95aDaniel Dunbar CmdArgs.push_back("-lgcc_s"); 2526008f54a54299eaafdaa940e2bdeaf55935ecd95aDaniel Dunbar CmdArgs.push_back("--no-as-needed"); 2527008f54a54299eaafdaa940e2bdeaf55935ecd95aDaniel Dunbar } 2528008f54a54299eaafdaa940e2bdeaf55935ecd95aDaniel Dunbar } 2529008f54a54299eaafdaa940e2bdeaf55935ecd95aDaniel Dunbar 2530008f54a54299eaafdaa940e2bdeaf55935ecd95aDaniel Dunbar if (!Args.hasArg(options::OPT_nostdlib) && 2531008f54a54299eaafdaa940e2bdeaf55935ecd95aDaniel Dunbar !Args.hasArg(options::OPT_nostartfiles)) { 2532008f54a54299eaafdaa940e2bdeaf55935ecd95aDaniel Dunbar if (!Args.hasArg(options::OPT_shared)) 25335ed34f4c58b6ad4e21038d713c1fae31a6146ff5Daniel Dunbar CmdArgs.push_back(Args.MakeArgString(getToolChain().GetFilePath(C, "crtend.o"))); 2534008f54a54299eaafdaa940e2bdeaf55935ecd95aDaniel Dunbar else 25355ed34f4c58b6ad4e21038d713c1fae31a6146ff5Daniel Dunbar CmdArgs.push_back(Args.MakeArgString(getToolChain().GetFilePath(C, "crtendS.o"))); 25365ed34f4c58b6ad4e21038d713c1fae31a6146ff5Daniel Dunbar CmdArgs.push_back(Args.MakeArgString(getToolChain().GetFilePath(C, "crtn.o"))); 2537008f54a54299eaafdaa940e2bdeaf55935ecd95aDaniel Dunbar } 2538008f54a54299eaafdaa940e2bdeaf55935ecd95aDaniel Dunbar 2539c21c485b4fb58ef5d55cf3e523263dd824a2ace4Daniel Dunbar const char *Exec = 25405ed34f4c58b6ad4e21038d713c1fae31a6146ff5Daniel Dunbar Args.MakeArgString(getToolChain().GetProgramPath(C, "ld")); 2541cae087e164e94e4286c11bf694dd0ff88f295302Daniel Dunbar Dest.addCommand(new Command(JA, Exec, CmdArgs)); 2542008f54a54299eaafdaa940e2bdeaf55935ecd95aDaniel Dunbar} 254311e1b40d759a643086f590f6ffbd9d68360bad46Daniel Dunbar 254411e1b40d759a643086f590f6ffbd9d68360bad46Daniel Dunbar/// DragonFly Tools 254511e1b40d759a643086f590f6ffbd9d68360bad46Daniel Dunbar 254611e1b40d759a643086f590f6ffbd9d68360bad46Daniel Dunbar// For now, DragonFly Assemble does just about the same as for 254711e1b40d759a643086f590f6ffbd9d68360bad46Daniel Dunbar// FreeBSD, but this may change soon. 254811e1b40d759a643086f590f6ffbd9d68360bad46Daniel Dunbarvoid dragonfly::Assemble::ConstructJob(Compilation &C, const JobAction &JA, 254911e1b40d759a643086f590f6ffbd9d68360bad46Daniel Dunbar Job &Dest, const InputInfo &Output, 255011e1b40d759a643086f590f6ffbd9d68360bad46Daniel Dunbar const InputInfoList &Inputs, 255111e1b40d759a643086f590f6ffbd9d68360bad46Daniel Dunbar const ArgList &Args, 255211e1b40d759a643086f590f6ffbd9d68360bad46Daniel Dunbar const char *LinkingOutput) const { 255311e1b40d759a643086f590f6ffbd9d68360bad46Daniel Dunbar ArgStringList CmdArgs; 255411e1b40d759a643086f590f6ffbd9d68360bad46Daniel Dunbar 255511e1b40d759a643086f590f6ffbd9d68360bad46Daniel Dunbar // When building 32-bit code on DragonFly/pc64, we have to explicitly 255611e1b40d759a643086f590f6ffbd9d68360bad46Daniel Dunbar // instruct as in the base system to assemble 32-bit code. 255711e1b40d759a643086f590f6ffbd9d68360bad46Daniel Dunbar if (getToolChain().getArchName() == "i386") 255811e1b40d759a643086f590f6ffbd9d68360bad46Daniel Dunbar CmdArgs.push_back("--32"); 255911e1b40d759a643086f590f6ffbd9d68360bad46Daniel Dunbar 256011e1b40d759a643086f590f6ffbd9d68360bad46Daniel Dunbar Args.AddAllArgValues(CmdArgs, options::OPT_Wa_COMMA, 256111e1b40d759a643086f590f6ffbd9d68360bad46Daniel Dunbar options::OPT_Xassembler); 256211e1b40d759a643086f590f6ffbd9d68360bad46Daniel Dunbar 256311e1b40d759a643086f590f6ffbd9d68360bad46Daniel Dunbar CmdArgs.push_back("-o"); 256411e1b40d759a643086f590f6ffbd9d68360bad46Daniel Dunbar if (Output.isPipe()) 256511e1b40d759a643086f590f6ffbd9d68360bad46Daniel Dunbar CmdArgs.push_back("-"); 256611e1b40d759a643086f590f6ffbd9d68360bad46Daniel Dunbar else 256711e1b40d759a643086f590f6ffbd9d68360bad46Daniel Dunbar CmdArgs.push_back(Output.getFilename()); 256811e1b40d759a643086f590f6ffbd9d68360bad46Daniel Dunbar 256911e1b40d759a643086f590f6ffbd9d68360bad46Daniel Dunbar for (InputInfoList::const_iterator 257011e1b40d759a643086f590f6ffbd9d68360bad46Daniel Dunbar it = Inputs.begin(), ie = Inputs.end(); it != ie; ++it) { 257111e1b40d759a643086f590f6ffbd9d68360bad46Daniel Dunbar const InputInfo &II = *it; 257211e1b40d759a643086f590f6ffbd9d68360bad46Daniel Dunbar if (II.isPipe()) 257311e1b40d759a643086f590f6ffbd9d68360bad46Daniel Dunbar CmdArgs.push_back("-"); 257411e1b40d759a643086f590f6ffbd9d68360bad46Daniel Dunbar else 257511e1b40d759a643086f590f6ffbd9d68360bad46Daniel Dunbar CmdArgs.push_back(II.getFilename()); 257611e1b40d759a643086f590f6ffbd9d68360bad46Daniel Dunbar } 257711e1b40d759a643086f590f6ffbd9d68360bad46Daniel Dunbar 257811e1b40d759a643086f590f6ffbd9d68360bad46Daniel Dunbar const char *Exec = 25795ed34f4c58b6ad4e21038d713c1fae31a6146ff5Daniel Dunbar Args.MakeArgString(getToolChain().GetProgramPath(C, "as")); 2580cae087e164e94e4286c11bf694dd0ff88f295302Daniel Dunbar Dest.addCommand(new Command(JA, Exec, CmdArgs)); 258111e1b40d759a643086f590f6ffbd9d68360bad46Daniel Dunbar} 258211e1b40d759a643086f590f6ffbd9d68360bad46Daniel Dunbar 258311e1b40d759a643086f590f6ffbd9d68360bad46Daniel Dunbarvoid dragonfly::Link::ConstructJob(Compilation &C, const JobAction &JA, 258411e1b40d759a643086f590f6ffbd9d68360bad46Daniel Dunbar Job &Dest, const InputInfo &Output, 258511e1b40d759a643086f590f6ffbd9d68360bad46Daniel Dunbar const InputInfoList &Inputs, 258611e1b40d759a643086f590f6ffbd9d68360bad46Daniel Dunbar const ArgList &Args, 258711e1b40d759a643086f590f6ffbd9d68360bad46Daniel Dunbar const char *LinkingOutput) const { 2588a8304f67291b0182fb64f3afc621615288dd1d31Daniel Dunbar const Driver &D = getToolChain().getHost().getDriver(); 258911e1b40d759a643086f590f6ffbd9d68360bad46Daniel Dunbar ArgStringList CmdArgs; 259011e1b40d759a643086f590f6ffbd9d68360bad46Daniel Dunbar 259111e1b40d759a643086f590f6ffbd9d68360bad46Daniel Dunbar if (Args.hasArg(options::OPT_static)) { 259211e1b40d759a643086f590f6ffbd9d68360bad46Daniel Dunbar CmdArgs.push_back("-Bstatic"); 259311e1b40d759a643086f590f6ffbd9d68360bad46Daniel Dunbar } else { 259411e1b40d759a643086f590f6ffbd9d68360bad46Daniel Dunbar if (Args.hasArg(options::OPT_shared)) 259511e1b40d759a643086f590f6ffbd9d68360bad46Daniel Dunbar CmdArgs.push_back("-Bshareable"); 259611e1b40d759a643086f590f6ffbd9d68360bad46Daniel Dunbar else { 259711e1b40d759a643086f590f6ffbd9d68360bad46Daniel Dunbar CmdArgs.push_back("-dynamic-linker"); 259811e1b40d759a643086f590f6ffbd9d68360bad46Daniel Dunbar CmdArgs.push_back("/usr/libexec/ld-elf.so.2"); 259911e1b40d759a643086f590f6ffbd9d68360bad46Daniel Dunbar } 260011e1b40d759a643086f590f6ffbd9d68360bad46Daniel Dunbar } 260111e1b40d759a643086f590f6ffbd9d68360bad46Daniel Dunbar 260211e1b40d759a643086f590f6ffbd9d68360bad46Daniel Dunbar // When building 32-bit code on DragonFly/pc64, we have to explicitly 260311e1b40d759a643086f590f6ffbd9d68360bad46Daniel Dunbar // instruct ld in the base system to link 32-bit code. 260411e1b40d759a643086f590f6ffbd9d68360bad46Daniel Dunbar if (getToolChain().getArchName() == "i386") { 260511e1b40d759a643086f590f6ffbd9d68360bad46Daniel Dunbar CmdArgs.push_back("-m"); 260611e1b40d759a643086f590f6ffbd9d68360bad46Daniel Dunbar CmdArgs.push_back("elf_i386"); 260711e1b40d759a643086f590f6ffbd9d68360bad46Daniel Dunbar } 260811e1b40d759a643086f590f6ffbd9d68360bad46Daniel Dunbar 260911e1b40d759a643086f590f6ffbd9d68360bad46Daniel Dunbar if (Output.isPipe()) { 261011e1b40d759a643086f590f6ffbd9d68360bad46Daniel Dunbar CmdArgs.push_back("-o"); 261111e1b40d759a643086f590f6ffbd9d68360bad46Daniel Dunbar CmdArgs.push_back("-"); 261211e1b40d759a643086f590f6ffbd9d68360bad46Daniel Dunbar } else if (Output.isFilename()) { 261311e1b40d759a643086f590f6ffbd9d68360bad46Daniel Dunbar CmdArgs.push_back("-o"); 261411e1b40d759a643086f590f6ffbd9d68360bad46Daniel Dunbar CmdArgs.push_back(Output.getFilename()); 261511e1b40d759a643086f590f6ffbd9d68360bad46Daniel Dunbar } else { 261611e1b40d759a643086f590f6ffbd9d68360bad46Daniel Dunbar assert(Output.isNothing() && "Invalid output."); 261711e1b40d759a643086f590f6ffbd9d68360bad46Daniel Dunbar } 261811e1b40d759a643086f590f6ffbd9d68360bad46Daniel Dunbar 261911e1b40d759a643086f590f6ffbd9d68360bad46Daniel Dunbar if (!Args.hasArg(options::OPT_nostdlib) && 262011e1b40d759a643086f590f6ffbd9d68360bad46Daniel Dunbar !Args.hasArg(options::OPT_nostartfiles)) { 262111e1b40d759a643086f590f6ffbd9d68360bad46Daniel Dunbar if (!Args.hasArg(options::OPT_shared)) { 26225ed34f4c58b6ad4e21038d713c1fae31a6146ff5Daniel Dunbar CmdArgs.push_back(Args.MakeArgString(getToolChain().GetFilePath(C, "crt1.o"))); 26235ed34f4c58b6ad4e21038d713c1fae31a6146ff5Daniel Dunbar CmdArgs.push_back(Args.MakeArgString(getToolChain().GetFilePath(C, "crti.o"))); 26245ed34f4c58b6ad4e21038d713c1fae31a6146ff5Daniel Dunbar CmdArgs.push_back(Args.MakeArgString(getToolChain().GetFilePath(C, "crtbegin.o"))); 262511e1b40d759a643086f590f6ffbd9d68360bad46Daniel Dunbar } else { 26265ed34f4c58b6ad4e21038d713c1fae31a6146ff5Daniel Dunbar CmdArgs.push_back(Args.MakeArgString(getToolChain().GetFilePath(C, "crti.o"))); 26275ed34f4c58b6ad4e21038d713c1fae31a6146ff5Daniel Dunbar CmdArgs.push_back(Args.MakeArgString(getToolChain().GetFilePath(C, "crtbeginS.o"))); 262811e1b40d759a643086f590f6ffbd9d68360bad46Daniel Dunbar } 262911e1b40d759a643086f590f6ffbd9d68360bad46Daniel Dunbar } 263011e1b40d759a643086f590f6ffbd9d68360bad46Daniel Dunbar 263111e1b40d759a643086f590f6ffbd9d68360bad46Daniel Dunbar Args.AddAllArgs(CmdArgs, options::OPT_L); 263211e1b40d759a643086f590f6ffbd9d68360bad46Daniel Dunbar Args.AddAllArgs(CmdArgs, options::OPT_T_Group); 263311e1b40d759a643086f590f6ffbd9d68360bad46Daniel Dunbar Args.AddAllArgs(CmdArgs, options::OPT_e); 263411e1b40d759a643086f590f6ffbd9d68360bad46Daniel Dunbar 263511e1b40d759a643086f590f6ffbd9d68360bad46Daniel Dunbar for (InputInfoList::const_iterator 263611e1b40d759a643086f590f6ffbd9d68360bad46Daniel Dunbar it = Inputs.begin(), ie = Inputs.end(); it != ie; ++it) { 263711e1b40d759a643086f590f6ffbd9d68360bad46Daniel Dunbar const InputInfo &II = *it; 2638a8304f67291b0182fb64f3afc621615288dd1d31Daniel Dunbar 2639a8304f67291b0182fb64f3afc621615288dd1d31Daniel Dunbar // Don't try to pass LLVM inputs to a generic gcc. 2640a8304f67291b0182fb64f3afc621615288dd1d31Daniel Dunbar if (II.getType() == types::TY_LLVMBC) 2641a8304f67291b0182fb64f3afc621615288dd1d31Daniel Dunbar D.Diag(clang::diag::err_drv_no_linker_llvm_support) 2642881376467c46c5c6cc16fa6790271c2c22e1d4f1Daniel Dunbar << getToolChain().getTripleString(); 2643a8304f67291b0182fb64f3afc621615288dd1d31Daniel Dunbar 264411e1b40d759a643086f590f6ffbd9d68360bad46Daniel Dunbar if (II.isPipe()) 264511e1b40d759a643086f590f6ffbd9d68360bad46Daniel Dunbar CmdArgs.push_back("-"); 264611e1b40d759a643086f590f6ffbd9d68360bad46Daniel Dunbar else if (II.isFilename()) 264711e1b40d759a643086f590f6ffbd9d68360bad46Daniel Dunbar CmdArgs.push_back(II.getFilename()); 264811e1b40d759a643086f590f6ffbd9d68360bad46Daniel Dunbar else 264911e1b40d759a643086f590f6ffbd9d68360bad46Daniel Dunbar II.getInputArg().renderAsInput(Args, CmdArgs); 265011e1b40d759a643086f590f6ffbd9d68360bad46Daniel Dunbar } 265111e1b40d759a643086f590f6ffbd9d68360bad46Daniel Dunbar 265211e1b40d759a643086f590f6ffbd9d68360bad46Daniel Dunbar if (!Args.hasArg(options::OPT_nostdlib) && 265311e1b40d759a643086f590f6ffbd9d68360bad46Daniel Dunbar !Args.hasArg(options::OPT_nodefaultlibs)) { 265411e1b40d759a643086f590f6ffbd9d68360bad46Daniel Dunbar // FIXME: GCC passes on -lgcc, -lgcc_pic and a whole lot of 265511e1b40d759a643086f590f6ffbd9d68360bad46Daniel Dunbar // rpaths 265611e1b40d759a643086f590f6ffbd9d68360bad46Daniel Dunbar CmdArgs.push_back("-L/usr/lib/gcc41"); 265711e1b40d759a643086f590f6ffbd9d68360bad46Daniel Dunbar 265811e1b40d759a643086f590f6ffbd9d68360bad46Daniel Dunbar if (!Args.hasArg(options::OPT_static)) { 265911e1b40d759a643086f590f6ffbd9d68360bad46Daniel Dunbar CmdArgs.push_back("-rpath"); 266011e1b40d759a643086f590f6ffbd9d68360bad46Daniel Dunbar CmdArgs.push_back("/usr/lib/gcc41"); 266111e1b40d759a643086f590f6ffbd9d68360bad46Daniel Dunbar 266211e1b40d759a643086f590f6ffbd9d68360bad46Daniel Dunbar CmdArgs.push_back("-rpath-link"); 266311e1b40d759a643086f590f6ffbd9d68360bad46Daniel Dunbar CmdArgs.push_back("/usr/lib/gcc41"); 266411e1b40d759a643086f590f6ffbd9d68360bad46Daniel Dunbar 266511e1b40d759a643086f590f6ffbd9d68360bad46Daniel Dunbar CmdArgs.push_back("-rpath"); 266611e1b40d759a643086f590f6ffbd9d68360bad46Daniel Dunbar CmdArgs.push_back("/usr/lib"); 266711e1b40d759a643086f590f6ffbd9d68360bad46Daniel Dunbar 266811e1b40d759a643086f590f6ffbd9d68360bad46Daniel Dunbar CmdArgs.push_back("-rpath-link"); 266911e1b40d759a643086f590f6ffbd9d68360bad46Daniel Dunbar CmdArgs.push_back("/usr/lib"); 267011e1b40d759a643086f590f6ffbd9d68360bad46Daniel Dunbar } 267111e1b40d759a643086f590f6ffbd9d68360bad46Daniel Dunbar 267211e1b40d759a643086f590f6ffbd9d68360bad46Daniel Dunbar if (Args.hasArg(options::OPT_shared)) { 267311e1b40d759a643086f590f6ffbd9d68360bad46Daniel Dunbar CmdArgs.push_back("-lgcc_pic"); 267411e1b40d759a643086f590f6ffbd9d68360bad46Daniel Dunbar } else { 267511e1b40d759a643086f590f6ffbd9d68360bad46Daniel Dunbar CmdArgs.push_back("-lgcc"); 267611e1b40d759a643086f590f6ffbd9d68360bad46Daniel Dunbar } 267711e1b40d759a643086f590f6ffbd9d68360bad46Daniel Dunbar 267811e1b40d759a643086f590f6ffbd9d68360bad46Daniel Dunbar 267911e1b40d759a643086f590f6ffbd9d68360bad46Daniel Dunbar if (Args.hasArg(options::OPT_pthread)) 268011e1b40d759a643086f590f6ffbd9d68360bad46Daniel Dunbar CmdArgs.push_back("-lthread_xu"); 268111e1b40d759a643086f590f6ffbd9d68360bad46Daniel Dunbar 268211e1b40d759a643086f590f6ffbd9d68360bad46Daniel Dunbar if (!Args.hasArg(options::OPT_nolibc)) { 268311e1b40d759a643086f590f6ffbd9d68360bad46Daniel Dunbar CmdArgs.push_back("-lc"); 268411e1b40d759a643086f590f6ffbd9d68360bad46Daniel Dunbar } 268511e1b40d759a643086f590f6ffbd9d68360bad46Daniel Dunbar 268611e1b40d759a643086f590f6ffbd9d68360bad46Daniel Dunbar if (Args.hasArg(options::OPT_shared)) { 268711e1b40d759a643086f590f6ffbd9d68360bad46Daniel Dunbar CmdArgs.push_back("-lgcc_pic"); 268811e1b40d759a643086f590f6ffbd9d68360bad46Daniel Dunbar } else { 268911e1b40d759a643086f590f6ffbd9d68360bad46Daniel Dunbar CmdArgs.push_back("-lgcc"); 269011e1b40d759a643086f590f6ffbd9d68360bad46Daniel Dunbar } 269111e1b40d759a643086f590f6ffbd9d68360bad46Daniel Dunbar } 269211e1b40d759a643086f590f6ffbd9d68360bad46Daniel Dunbar 269311e1b40d759a643086f590f6ffbd9d68360bad46Daniel Dunbar if (!Args.hasArg(options::OPT_nostdlib) && 269411e1b40d759a643086f590f6ffbd9d68360bad46Daniel Dunbar !Args.hasArg(options::OPT_nostartfiles)) { 269511e1b40d759a643086f590f6ffbd9d68360bad46Daniel Dunbar if (!Args.hasArg(options::OPT_shared)) 26965ed34f4c58b6ad4e21038d713c1fae31a6146ff5Daniel Dunbar CmdArgs.push_back(Args.MakeArgString(getToolChain().GetFilePath(C, "crtend.o"))); 269711e1b40d759a643086f590f6ffbd9d68360bad46Daniel Dunbar else 26985ed34f4c58b6ad4e21038d713c1fae31a6146ff5Daniel Dunbar CmdArgs.push_back(Args.MakeArgString(getToolChain().GetFilePath(C, "crtendS.o"))); 26995ed34f4c58b6ad4e21038d713c1fae31a6146ff5Daniel Dunbar CmdArgs.push_back(Args.MakeArgString(getToolChain().GetFilePath(C, "crtn.o"))); 270011e1b40d759a643086f590f6ffbd9d68360bad46Daniel Dunbar } 270111e1b40d759a643086f590f6ffbd9d68360bad46Daniel Dunbar 270211e1b40d759a643086f590f6ffbd9d68360bad46Daniel Dunbar const char *Exec = 27035ed34f4c58b6ad4e21038d713c1fae31a6146ff5Daniel Dunbar Args.MakeArgString(getToolChain().GetProgramPath(C, "ld")); 2704cae087e164e94e4286c11bf694dd0ff88f295302Daniel Dunbar Dest.addCommand(new Command(JA, Exec, CmdArgs)); 270511e1b40d759a643086f590f6ffbd9d68360bad46Daniel Dunbar} 2706