Tools.cpp revision 6b200b2b698b6ac9e310f2225c69c85d28ae4fb0
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" 255b750fe6189a41937ff2b080a983c95ea273769fDaniel Dunbar#include "llvm/ADT/Twine.h" 2602633b541b04ad5ffc1c70f4c2feeeb13e607057Daniel Dunbar#include "llvm/Support/Format.h" 2702633b541b04ad5ffc1c70f4c2feeeb13e607057Daniel Dunbar#include "llvm/Support/raw_ostream.h" 28871adcf4e41285e3f4c3b62eaa1b2e05b60b92daDaniel Dunbar 29871adcf4e41285e3f4c3b62eaa1b2e05b60b92daDaniel Dunbar#include "InputInfo.h" 3002633b541b04ad5ffc1c70f4c2feeeb13e607057Daniel Dunbar#include "ToolChains.h" 31871adcf4e41285e3f4c3b62eaa1b2e05b60b92daDaniel Dunbar 3247ac7d27c44bd64a7d0fc03d4babc196cf2b8230Daniel Dunbarusing namespace clang::driver; 3347ac7d27c44bd64a7d0fc03d4babc196cf2b8230Daniel Dunbarusing namespace clang::driver::tools; 3447ac7d27c44bd64a7d0fc03d4babc196cf2b8230Daniel Dunbar 35868bd0aa9281929ef50d2e9a8c82a036906f53f5Daniel Dunbarstatic const char *MakeFormattedString(const ArgList &Args, 36868bd0aa9281929ef50d2e9a8c82a036906f53f5Daniel Dunbar const llvm::format_object_base &Fmt) { 37881376467c46c5c6cc16fa6790271c2c22e1d4f1Daniel Dunbar llvm::SmallString<256> Str; 38881376467c46c5c6cc16fa6790271c2c22e1d4f1Daniel Dunbar llvm::raw_svector_ostream(Str) << Fmt; 39881376467c46c5c6cc16fa6790271c2c22e1d4f1Daniel Dunbar return Args.MakeArgString(Str.str()); 40868bd0aa9281929ef50d2e9a8c82a036906f53f5Daniel Dunbar} 41868bd0aa9281929ef50d2e9a8c82a036906f53f5Daniel Dunbar 4288a3d6cf5ebab81614f89ba48a8d89023270637aDaniel Dunbar/// CheckPreprocessingOptions - Perform some validation of preprocessing 4388a3d6cf5ebab81614f89ba48a8d89023270637aDaniel Dunbar/// arguments that is shared with gcc. 4488a3d6cf5ebab81614f89ba48a8d89023270637aDaniel Dunbarstatic void CheckPreprocessingOptions(const Driver &D, const ArgList &Args) { 4588a3d6cf5ebab81614f89ba48a8d89023270637aDaniel Dunbar if (Arg *A = Args.getLastArg(options::OPT_C, options::OPT_CC)) 4688a3d6cf5ebab81614f89ba48a8d89023270637aDaniel Dunbar if (!Args.hasArg(options::OPT_E)) 4788a3d6cf5ebab81614f89ba48a8d89023270637aDaniel Dunbar D.Diag(clang::diag::err_drv_argument_only_allowed_with) 4888a3d6cf5ebab81614f89ba48a8d89023270637aDaniel Dunbar << A->getAsString(Args) << "-E"; 4988a3d6cf5ebab81614f89ba48a8d89023270637aDaniel Dunbar} 5088a3d6cf5ebab81614f89ba48a8d89023270637aDaniel Dunbar 51e2fd66418eca3d70cf6b62087d745d0c5181db69Daniel Dunbar/// CheckCodeGenerationOptions - Perform some validation of code generation 52e2fd66418eca3d70cf6b62087d745d0c5181db69Daniel Dunbar/// arguments that is shared with gcc. 53e2fd66418eca3d70cf6b62087d745d0c5181db69Daniel Dunbarstatic void CheckCodeGenerationOptions(const Driver &D, const ArgList &Args) { 54e2fd66418eca3d70cf6b62087d745d0c5181db69Daniel Dunbar // In gcc, only ARM checks this, but it seems reasonable to check universally. 55e2fd66418eca3d70cf6b62087d745d0c5181db69Daniel Dunbar if (Args.hasArg(options::OPT_static)) 56e2fd66418eca3d70cf6b62087d745d0c5181db69Daniel Dunbar if (const Arg *A = Args.getLastArg(options::OPT_dynamic, 57e2fd66418eca3d70cf6b62087d745d0c5181db69Daniel Dunbar options::OPT_mdynamic_no_pic)) 58e2fd66418eca3d70cf6b62087d745d0c5181db69Daniel Dunbar D.Diag(clang::diag::err_drv_argument_not_allowed_with) 59e2fd66418eca3d70cf6b62087d745d0c5181db69Daniel Dunbar << A->getAsString(Args) << "-static"; 60e2fd66418eca3d70cf6b62087d745d0c5181db69Daniel Dunbar} 61e2fd66418eca3d70cf6b62087d745d0c5181db69Daniel Dunbar 621eb4433ac451dc16f4133a88af2d002ac26c58efMike Stumpvoid Clang::AddPreprocessingOptions(const Driver &D, 63df91ef3d6c55692a0236f67b6c6b134a3bf84098Douglas Gregor const ArgList &Args, 64c21c485b4fb58ef5d55cf3e523263dd824a2ace4Daniel Dunbar ArgStringList &CmdArgs, 65c21c485b4fb58ef5d55cf3e523263dd824a2ace4Daniel Dunbar const InputInfo &Output, 66c21c485b4fb58ef5d55cf3e523263dd824a2ace4Daniel Dunbar const InputInfoList &Inputs) const { 67c21c485b4fb58ef5d55cf3e523263dd824a2ace4Daniel Dunbar Arg *A; 683a183d3d46426d8719031553131b8928f50aa606Daniel Dunbar 6988a3d6cf5ebab81614f89ba48a8d89023270637aDaniel Dunbar CheckPreprocessingOptions(D, Args); 7088a3d6cf5ebab81614f89ba48a8d89023270637aDaniel Dunbar 7188a3d6cf5ebab81614f89ba48a8d89023270637aDaniel Dunbar Args.AddLastArg(CmdArgs, options::OPT_C); 7288a3d6cf5ebab81614f89ba48a8d89023270637aDaniel Dunbar Args.AddLastArg(CmdArgs, options::OPT_CC); 733a183d3d46426d8719031553131b8928f50aa606Daniel Dunbar 743a183d3d46426d8719031553131b8928f50aa606Daniel Dunbar // Handle dependency file generation. 75c21c485b4fb58ef5d55cf3e523263dd824a2ace4Daniel Dunbar if ((A = Args.getLastArg(options::OPT_M)) || 76c21c485b4fb58ef5d55cf3e523263dd824a2ace4Daniel Dunbar (A = Args.getLastArg(options::OPT_MM)) || 77c21c485b4fb58ef5d55cf3e523263dd824a2ace4Daniel Dunbar (A = Args.getLastArg(options::OPT_MD)) || 78c21c485b4fb58ef5d55cf3e523263dd824a2ace4Daniel Dunbar (A = Args.getLastArg(options::OPT_MMD))) { 79c21c485b4fb58ef5d55cf3e523263dd824a2ace4Daniel Dunbar // Determine the output location. 80c21c485b4fb58ef5d55cf3e523263dd824a2ace4Daniel Dunbar const char *DepFile; 81c21c485b4fb58ef5d55cf3e523263dd824a2ace4Daniel Dunbar if (Output.getType() == types::TY_Dependencies) { 82c21c485b4fb58ef5d55cf3e523263dd824a2ace4Daniel Dunbar if (Output.isPipe()) 83c21c485b4fb58ef5d55cf3e523263dd824a2ace4Daniel Dunbar DepFile = "-"; 84c21c485b4fb58ef5d55cf3e523263dd824a2ace4Daniel Dunbar else 85c21c485b4fb58ef5d55cf3e523263dd824a2ace4Daniel Dunbar DepFile = Output.getFilename(); 86c21c485b4fb58ef5d55cf3e523263dd824a2ace4Daniel Dunbar } else if (Arg *MF = Args.getLastArg(options::OPT_MF)) { 87c21c485b4fb58ef5d55cf3e523263dd824a2ace4Daniel Dunbar DepFile = MF->getValue(Args); 88c21c485b4fb58ef5d55cf3e523263dd824a2ace4Daniel Dunbar } else if (A->getOption().getId() == options::OPT_M || 89c21c485b4fb58ef5d55cf3e523263dd824a2ace4Daniel Dunbar A->getOption().getId() == options::OPT_MM) { 90c21c485b4fb58ef5d55cf3e523263dd824a2ace4Daniel Dunbar DepFile = "-"; 91c21c485b4fb58ef5d55cf3e523263dd824a2ace4Daniel Dunbar } else { 92c21c485b4fb58ef5d55cf3e523263dd824a2ace4Daniel Dunbar DepFile = darwin::CC1::getDependencyFileName(Args, Inputs); 93c21c485b4fb58ef5d55cf3e523263dd824a2ace4Daniel Dunbar } 94c21c485b4fb58ef5d55cf3e523263dd824a2ace4Daniel Dunbar CmdArgs.push_back("-dependency-file"); 95c21c485b4fb58ef5d55cf3e523263dd824a2ace4Daniel Dunbar CmdArgs.push_back(DepFile); 96c21c485b4fb58ef5d55cf3e523263dd824a2ace4Daniel Dunbar 97c21c485b4fb58ef5d55cf3e523263dd824a2ace4Daniel Dunbar // Add an -MT option if the user didn't specify their own. 98e0be8b1729d8978de433d229c065830b95d0ae68Daniel Dunbar // 99c21c485b4fb58ef5d55cf3e523263dd824a2ace4Daniel Dunbar // FIXME: This should use -MQ, when we support it. 100c21c485b4fb58ef5d55cf3e523263dd824a2ace4Daniel Dunbar if (!Args.hasArg(options::OPT_MT) && !Args.hasArg(options::OPT_MQ)) { 101c21c485b4fb58ef5d55cf3e523263dd824a2ace4Daniel Dunbar const char *DepTarget; 102c21c485b4fb58ef5d55cf3e523263dd824a2ace4Daniel Dunbar 103c21c485b4fb58ef5d55cf3e523263dd824a2ace4Daniel Dunbar // If user provided -o, that is the dependency target, except 104c21c485b4fb58ef5d55cf3e523263dd824a2ace4Daniel Dunbar // when we are only generating a dependency file. 105c21c485b4fb58ef5d55cf3e523263dd824a2ace4Daniel Dunbar Arg *OutputOpt = Args.getLastArg(options::OPT_o); 106c21c485b4fb58ef5d55cf3e523263dd824a2ace4Daniel Dunbar if (OutputOpt && Output.getType() != types::TY_Dependencies) { 107c21c485b4fb58ef5d55cf3e523263dd824a2ace4Daniel Dunbar DepTarget = OutputOpt->getValue(Args); 108c21c485b4fb58ef5d55cf3e523263dd824a2ace4Daniel Dunbar } else { 109c21c485b4fb58ef5d55cf3e523263dd824a2ace4Daniel Dunbar // Otherwise derive from the base input. 110c21c485b4fb58ef5d55cf3e523263dd824a2ace4Daniel Dunbar // 111c21c485b4fb58ef5d55cf3e523263dd824a2ace4Daniel Dunbar // FIXME: This should use the computed output file location. 112c21c485b4fb58ef5d55cf3e523263dd824a2ace4Daniel Dunbar llvm::sys::Path P(Inputs[0].getBaseInput()); 113c21c485b4fb58ef5d55cf3e523263dd824a2ace4Daniel Dunbar 114c21c485b4fb58ef5d55cf3e523263dd824a2ace4Daniel Dunbar P.eraseSuffix(); 115c21c485b4fb58ef5d55cf3e523263dd824a2ace4Daniel Dunbar P.appendSuffix("o"); 116881376467c46c5c6cc16fa6790271c2c22e1d4f1Daniel Dunbar DepTarget = Args.MakeArgString(P.getLast()); 117c21c485b4fb58ef5d55cf3e523263dd824a2ace4Daniel Dunbar } 118c21c485b4fb58ef5d55cf3e523263dd824a2ace4Daniel Dunbar 119c21c485b4fb58ef5d55cf3e523263dd824a2ace4Daniel Dunbar CmdArgs.push_back("-MT"); 120c21c485b4fb58ef5d55cf3e523263dd824a2ace4Daniel Dunbar CmdArgs.push_back(DepTarget); 121c21c485b4fb58ef5d55cf3e523263dd824a2ace4Daniel Dunbar } 122c21c485b4fb58ef5d55cf3e523263dd824a2ace4Daniel Dunbar 123c21c485b4fb58ef5d55cf3e523263dd824a2ace4Daniel Dunbar if (A->getOption().getId() == options::OPT_M || 124c21c485b4fb58ef5d55cf3e523263dd824a2ace4Daniel Dunbar A->getOption().getId() == options::OPT_MD) 125c21c485b4fb58ef5d55cf3e523263dd824a2ace4Daniel Dunbar CmdArgs.push_back("-sys-header-deps"); 126c21c485b4fb58ef5d55cf3e523263dd824a2ace4Daniel Dunbar } 127c21c485b4fb58ef5d55cf3e523263dd824a2ace4Daniel Dunbar 128c21c485b4fb58ef5d55cf3e523263dd824a2ace4Daniel Dunbar Args.AddLastArg(CmdArgs, options::OPT_MP); 129c21c485b4fb58ef5d55cf3e523263dd824a2ace4Daniel Dunbar Args.AddAllArgs(CmdArgs, options::OPT_MT); 130c21c485b4fb58ef5d55cf3e523263dd824a2ace4Daniel Dunbar 131df91ef3d6c55692a0236f67b6c6b134a3bf84098Douglas Gregor // Add -i* options, and automatically translate to 132df91ef3d6c55692a0236f67b6c6b134a3bf84098Douglas Gregor // -include-pch/-include-pth for transparent PCH support. It's 133df91ef3d6c55692a0236f67b6c6b134a3bf84098Douglas Gregor // wonky, but we include looking for .gch so we can support seamless 134df91ef3d6c55692a0236f67b6c6b134a3bf84098Douglas Gregor // replacement into a build system already set up to be generating 135df91ef3d6c55692a0236f67b6c6b134a3bf84098Douglas Gregor // .gch files. 136e0be8b1729d8978de433d229c065830b95d0ae68Daniel Dunbar // 137e0be8b1729d8978de433d229c065830b95d0ae68Daniel Dunbar // FIXME: Use iterator. 138c21c485b4fb58ef5d55cf3e523263dd824a2ace4Daniel Dunbar for (ArgList::const_iterator 139c21c485b4fb58ef5d55cf3e523263dd824a2ace4Daniel Dunbar it = Args.begin(), ie = Args.end(); it != ie; ++it) { 140c21c485b4fb58ef5d55cf3e523263dd824a2ace4Daniel Dunbar const Arg *A = *it; 141c21c485b4fb58ef5d55cf3e523263dd824a2ace4Daniel Dunbar if (!A->getOption().matches(options::OPT_clang_i_Group)) 142c21c485b4fb58ef5d55cf3e523263dd824a2ace4Daniel Dunbar continue; 143c21c485b4fb58ef5d55cf3e523263dd824a2ace4Daniel Dunbar 144c21c485b4fb58ef5d55cf3e523263dd824a2ace4Daniel Dunbar if (A->getOption().matches(options::OPT_include)) { 145c21c485b4fb58ef5d55cf3e523263dd824a2ace4Daniel Dunbar bool FoundPTH = false; 146df91ef3d6c55692a0236f67b6c6b134a3bf84098Douglas Gregor bool FoundPCH = false; 147c21c485b4fb58ef5d55cf3e523263dd824a2ace4Daniel Dunbar llvm::sys::Path P(A->getValue(Args)); 148df91ef3d6c55692a0236f67b6c6b134a3bf84098Douglas Gregor if (D.CCCUsePCH) { 149df91ef3d6c55692a0236f67b6c6b134a3bf84098Douglas Gregor P.appendSuffix("pch"); 150c21c485b4fb58ef5d55cf3e523263dd824a2ace4Daniel Dunbar if (P.exists()) 151df91ef3d6c55692a0236f67b6c6b134a3bf84098Douglas Gregor FoundPCH = true; 1521eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump else 153df91ef3d6c55692a0236f67b6c6b134a3bf84098Douglas Gregor P.eraseSuffix(); 154df91ef3d6c55692a0236f67b6c6b134a3bf84098Douglas Gregor } 155df91ef3d6c55692a0236f67b6c6b134a3bf84098Douglas Gregor 156df91ef3d6c55692a0236f67b6c6b134a3bf84098Douglas Gregor if (!FoundPCH) { 157df91ef3d6c55692a0236f67b6c6b134a3bf84098Douglas Gregor P.appendSuffix("pth"); 1581eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump if (P.exists()) 159c21c485b4fb58ef5d55cf3e523263dd824a2ace4Daniel Dunbar FoundPTH = true; 160df91ef3d6c55692a0236f67b6c6b134a3bf84098Douglas Gregor else 161df91ef3d6c55692a0236f67b6c6b134a3bf84098Douglas Gregor P.eraseSuffix(); 1621eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump } 1631eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump 164df91ef3d6c55692a0236f67b6c6b134a3bf84098Douglas Gregor if (!FoundPCH && !FoundPTH) { 165df91ef3d6c55692a0236f67b6c6b134a3bf84098Douglas Gregor P.appendSuffix("gch"); 166df91ef3d6c55692a0236f67b6c6b134a3bf84098Douglas Gregor if (P.exists()) { 167df91ef3d6c55692a0236f67b6c6b134a3bf84098Douglas Gregor FoundPCH = D.CCCUsePCH; 168df91ef3d6c55692a0236f67b6c6b134a3bf84098Douglas Gregor FoundPTH = !D.CCCUsePCH; 169df91ef3d6c55692a0236f67b6c6b134a3bf84098Douglas Gregor } 1701eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump else 171df91ef3d6c55692a0236f67b6c6b134a3bf84098Douglas Gregor P.eraseSuffix(); 172c21c485b4fb58ef5d55cf3e523263dd824a2ace4Daniel Dunbar } 173c21c485b4fb58ef5d55cf3e523263dd824a2ace4Daniel Dunbar 174df91ef3d6c55692a0236f67b6c6b134a3bf84098Douglas Gregor if (FoundPCH || FoundPTH) { 175c21c485b4fb58ef5d55cf3e523263dd824a2ace4Daniel Dunbar A->claim(); 176ea71a5b388bc5bf91cb81ef004d0dd7f011af512Daniel Dunbar if (D.CCCUsePCH) 177df91ef3d6c55692a0236f67b6c6b134a3bf84098Douglas Gregor CmdArgs.push_back("-include-pch"); 178df91ef3d6c55692a0236f67b6c6b134a3bf84098Douglas Gregor else 179df91ef3d6c55692a0236f67b6c6b134a3bf84098Douglas Gregor CmdArgs.push_back("-include-pth"); 180881376467c46c5c6cc16fa6790271c2c22e1d4f1Daniel Dunbar CmdArgs.push_back(Args.MakeArgString(P.str())); 181c21c485b4fb58ef5d55cf3e523263dd824a2ace4Daniel Dunbar continue; 182c21c485b4fb58ef5d55cf3e523263dd824a2ace4Daniel Dunbar } 183c21c485b4fb58ef5d55cf3e523263dd824a2ace4Daniel Dunbar } 184c21c485b4fb58ef5d55cf3e523263dd824a2ace4Daniel Dunbar 185c21c485b4fb58ef5d55cf3e523263dd824a2ace4Daniel Dunbar // Not translated, render as usual. 186c21c485b4fb58ef5d55cf3e523263dd824a2ace4Daniel Dunbar A->claim(); 187c21c485b4fb58ef5d55cf3e523263dd824a2ace4Daniel Dunbar A->render(Args, CmdArgs); 188c21c485b4fb58ef5d55cf3e523263dd824a2ace4Daniel Dunbar } 189c21c485b4fb58ef5d55cf3e523263dd824a2ace4Daniel Dunbar 190c21c485b4fb58ef5d55cf3e523263dd824a2ace4Daniel Dunbar Args.AddAllArgs(CmdArgs, options::OPT_D, options::OPT_U); 191c21c485b4fb58ef5d55cf3e523263dd824a2ace4Daniel Dunbar Args.AddAllArgs(CmdArgs, options::OPT_I_Group, options::OPT_F); 192c21c485b4fb58ef5d55cf3e523263dd824a2ace4Daniel Dunbar 193c21c485b4fb58ef5d55cf3e523263dd824a2ace4Daniel Dunbar // Add -Wp, and -Xassembler if using the preprocessor. 194c21c485b4fb58ef5d55cf3e523263dd824a2ace4Daniel Dunbar 195c21c485b4fb58ef5d55cf3e523263dd824a2ace4Daniel Dunbar // FIXME: There is a very unfortunate problem here, some troubled 196c21c485b4fb58ef5d55cf3e523263dd824a2ace4Daniel Dunbar // souls abuse -Wp, to pass preprocessor options in gcc syntax. To 197c21c485b4fb58ef5d55cf3e523263dd824a2ace4Daniel Dunbar // really support that we would have to parse and then translate 198c21c485b4fb58ef5d55cf3e523263dd824a2ace4Daniel Dunbar // those options. :( 199c21c485b4fb58ef5d55cf3e523263dd824a2ace4Daniel Dunbar Args.AddAllArgValues(CmdArgs, options::OPT_Wp_COMMA, 200c21c485b4fb58ef5d55cf3e523263dd824a2ace4Daniel Dunbar options::OPT_Xpreprocessor); 201c21c485b4fb58ef5d55cf3e523263dd824a2ace4Daniel Dunbar} 202c21c485b4fb58ef5d55cf3e523263dd824a2ace4Daniel Dunbar 203728a512753d85a6ccaae34e81385c8665c2de0e1Daniel Dunbar/// getARMTargetCPU - Get the (LLVM) name of the ARM cpu we are targetting. 204728a512753d85a6ccaae34e81385c8665c2de0e1Daniel Dunbar// 205728a512753d85a6ccaae34e81385c8665c2de0e1Daniel Dunbar// FIXME: tblgen this. 206b163ef7e7a5d904ef0962a7c38c460be083c4d63Daniel Dunbarstatic llvm::StringRef getARMTargetCPU(const ArgList &Args) { 207728a512753d85a6ccaae34e81385c8665c2de0e1Daniel Dunbar // FIXME: Warn on inconsistent use of -mcpu and -march. 208b163ef7e7a5d904ef0962a7c38c460be083c4d63Daniel Dunbar 209b163ef7e7a5d904ef0962a7c38c460be083c4d63Daniel Dunbar // If we have -mcpu=, use that. 210b163ef7e7a5d904ef0962a7c38c460be083c4d63Daniel Dunbar if (Arg *A = Args.getLastArg(options::OPT_mcpu_EQ)) 211b163ef7e7a5d904ef0962a7c38c460be083c4d63Daniel Dunbar return A->getValue(Args); 212b163ef7e7a5d904ef0962a7c38c460be083c4d63Daniel Dunbar 213b163ef7e7a5d904ef0962a7c38c460be083c4d63Daniel Dunbar // Otherwise, if we have -march= choose the base CPU for that arch. 214b163ef7e7a5d904ef0962a7c38c460be083c4d63Daniel Dunbar if (Arg *A = Args.getLastArg(options::OPT_march_EQ)) { 215b163ef7e7a5d904ef0962a7c38c460be083c4d63Daniel Dunbar llvm::StringRef MArch = A->getValue(Args); 216b163ef7e7a5d904ef0962a7c38c460be083c4d63Daniel Dunbar 217b163ef7e7a5d904ef0962a7c38c460be083c4d63Daniel Dunbar if (MArch == "armv2" || MArch == "armv2a") 218b163ef7e7a5d904ef0962a7c38c460be083c4d63Daniel Dunbar return "arm2"; 219b163ef7e7a5d904ef0962a7c38c460be083c4d63Daniel Dunbar if (MArch == "armv3") 220b163ef7e7a5d904ef0962a7c38c460be083c4d63Daniel Dunbar return "arm6"; 221b163ef7e7a5d904ef0962a7c38c460be083c4d63Daniel Dunbar if (MArch == "armv3m") 222b163ef7e7a5d904ef0962a7c38c460be083c4d63Daniel Dunbar return "arm7m"; 223b163ef7e7a5d904ef0962a7c38c460be083c4d63Daniel Dunbar if (MArch == "armv4" || MArch == "armv4t") 224b163ef7e7a5d904ef0962a7c38c460be083c4d63Daniel Dunbar return "arm7tdmi"; 225b163ef7e7a5d904ef0962a7c38c460be083c4d63Daniel Dunbar if (MArch == "armv5" || MArch == "armv5t") 226b163ef7e7a5d904ef0962a7c38c460be083c4d63Daniel Dunbar return "arm10tdmi"; 227b163ef7e7a5d904ef0962a7c38c460be083c4d63Daniel Dunbar if (MArch == "armv5e" || MArch == "armv5te") 228b163ef7e7a5d904ef0962a7c38c460be083c4d63Daniel Dunbar return "arm1026ejs"; 229b163ef7e7a5d904ef0962a7c38c460be083c4d63Daniel Dunbar if (MArch == "armv5tej") 230b163ef7e7a5d904ef0962a7c38c460be083c4d63Daniel Dunbar return "arm926ejs"; 231b163ef7e7a5d904ef0962a7c38c460be083c4d63Daniel Dunbar if (MArch == "armv6" || MArch == "armv6k") 232b163ef7e7a5d904ef0962a7c38c460be083c4d63Daniel Dunbar return "arm1136jf-s"; 233b163ef7e7a5d904ef0962a7c38c460be083c4d63Daniel Dunbar if (MArch == "armv6j") 234b163ef7e7a5d904ef0962a7c38c460be083c4d63Daniel Dunbar return "arm1136j-s"; 235b163ef7e7a5d904ef0962a7c38c460be083c4d63Daniel Dunbar if (MArch == "armv6z" || MArch == "armv6zk") 236b163ef7e7a5d904ef0962a7c38c460be083c4d63Daniel Dunbar return "arm1176jzf-s"; 237b163ef7e7a5d904ef0962a7c38c460be083c4d63Daniel Dunbar if (MArch == "armv6t2") 238b163ef7e7a5d904ef0962a7c38c460be083c4d63Daniel Dunbar return "arm1156t2-s"; 239b163ef7e7a5d904ef0962a7c38c460be083c4d63Daniel Dunbar if (MArch == "armv7" || MArch == "armv7a" || MArch == "armv7-a") 240b163ef7e7a5d904ef0962a7c38c460be083c4d63Daniel Dunbar return "cortex-a8"; 241b163ef7e7a5d904ef0962a7c38c460be083c4d63Daniel Dunbar if (MArch == "armv7r" || MArch == "armv7-r") 242b163ef7e7a5d904ef0962a7c38c460be083c4d63Daniel Dunbar return "cortex-r4"; 243b163ef7e7a5d904ef0962a7c38c460be083c4d63Daniel Dunbar if (MArch == "armv7m" || MArch == "armv7-m") 244b163ef7e7a5d904ef0962a7c38c460be083c4d63Daniel Dunbar return "cortex-m3"; 245b163ef7e7a5d904ef0962a7c38c460be083c4d63Daniel Dunbar if (MArch == "ep9312") 246b163ef7e7a5d904ef0962a7c38c460be083c4d63Daniel Dunbar return "ep9312"; 247b163ef7e7a5d904ef0962a7c38c460be083c4d63Daniel Dunbar if (MArch == "iwmmxt") 248b163ef7e7a5d904ef0962a7c38c460be083c4d63Daniel Dunbar return "iwmmxt"; 249b163ef7e7a5d904ef0962a7c38c460be083c4d63Daniel Dunbar if (MArch == "xscale") 250b163ef7e7a5d904ef0962a7c38c460be083c4d63Daniel Dunbar return "xscale"; 251b163ef7e7a5d904ef0962a7c38c460be083c4d63Daniel Dunbar } 252b163ef7e7a5d904ef0962a7c38c460be083c4d63Daniel Dunbar 253b163ef7e7a5d904ef0962a7c38c460be083c4d63Daniel Dunbar // Otherwise return the most base CPU LLVM supports. 254b163ef7e7a5d904ef0962a7c38c460be083c4d63Daniel Dunbar return "arm7tdmi"; 255b163ef7e7a5d904ef0962a7c38c460be083c4d63Daniel Dunbar} 256b163ef7e7a5d904ef0962a7c38c460be083c4d63Daniel Dunbar 2571d65e4be6f22f7e4b4974efbaef92fa3454f1ec8Daniel Dunbar/// getLLVMArchSuffixForARM - Get the LLVM arch name to use for a particular 258728a512753d85a6ccaae34e81385c8665c2de0e1Daniel Dunbar/// CPU. 259728a512753d85a6ccaae34e81385c8665c2de0e1Daniel Dunbar// 260728a512753d85a6ccaae34e81385c8665c2de0e1Daniel Dunbar// FIXME: This is redundant with -mcpu, why does LLVM use this. 261728a512753d85a6ccaae34e81385c8665c2de0e1Daniel Dunbar// FIXME: tblgen this, or kill it! 2621d65e4be6f22f7e4b4974efbaef92fa3454f1ec8Daniel Dunbarstatic const char *getLLVMArchSuffixForARM(llvm::StringRef CPU) { 263728a512753d85a6ccaae34e81385c8665c2de0e1Daniel Dunbar if (CPU == "arm7tdmi" || CPU == "arm7tdmi-s" || CPU == "arm710t" || 264728a512753d85a6ccaae34e81385c8665c2de0e1Daniel Dunbar CPU == "arm720t" || CPU == "arm9" || CPU == "arm9tdmi" || 265728a512753d85a6ccaae34e81385c8665c2de0e1Daniel Dunbar CPU == "arm920" || CPU == "arm920t" || CPU == "arm922t" || 266728a512753d85a6ccaae34e81385c8665c2de0e1Daniel Dunbar CPU == "arm940t" || CPU == "ep9312") 2671d65e4be6f22f7e4b4974efbaef92fa3454f1ec8Daniel Dunbar return "v4t"; 268728a512753d85a6ccaae34e81385c8665c2de0e1Daniel Dunbar 269728a512753d85a6ccaae34e81385c8665c2de0e1Daniel Dunbar if (CPU == "arm10tdmi" || CPU == "arm1020t") 2701d65e4be6f22f7e4b4974efbaef92fa3454f1ec8Daniel Dunbar return "v5"; 271728a512753d85a6ccaae34e81385c8665c2de0e1Daniel Dunbar 272728a512753d85a6ccaae34e81385c8665c2de0e1Daniel Dunbar if (CPU == "arm9e" || CPU == "arm926ej-s" || CPU == "arm946e-s" || 273728a512753d85a6ccaae34e81385c8665c2de0e1Daniel Dunbar CPU == "arm966e-s" || CPU == "arm968e-s" || CPU == "arm10e" || 274728a512753d85a6ccaae34e81385c8665c2de0e1Daniel Dunbar CPU == "arm1020e" || CPU == "arm1022e" || CPU == "xscale" || 275728a512753d85a6ccaae34e81385c8665c2de0e1Daniel Dunbar CPU == "iwmmxt") 2761d65e4be6f22f7e4b4974efbaef92fa3454f1ec8Daniel Dunbar return "v5e"; 277728a512753d85a6ccaae34e81385c8665c2de0e1Daniel Dunbar 278728a512753d85a6ccaae34e81385c8665c2de0e1Daniel Dunbar if (CPU == "arm1136j-s" || CPU == "arm1136jf-s" || CPU == "arm1176jz-s" || 279728a512753d85a6ccaae34e81385c8665c2de0e1Daniel Dunbar CPU == "arm1176jzf-s" || CPU == "mpcorenovfp" || CPU == "mpcore") 2801d65e4be6f22f7e4b4974efbaef92fa3454f1ec8Daniel Dunbar return "v6"; 281728a512753d85a6ccaae34e81385c8665c2de0e1Daniel Dunbar 282728a512753d85a6ccaae34e81385c8665c2de0e1Daniel Dunbar if (CPU == "arm1156t2-s" || CPU == "arm1156t2f-s") 2831d65e4be6f22f7e4b4974efbaef92fa3454f1ec8Daniel Dunbar return "v6t2"; 284728a512753d85a6ccaae34e81385c8665c2de0e1Daniel Dunbar 285728a512753d85a6ccaae34e81385c8665c2de0e1Daniel Dunbar if (CPU == "cortex-a8" || CPU == "cortex-a9") 2861d65e4be6f22f7e4b4974efbaef92fa3454f1ec8Daniel Dunbar return "v7"; 287728a512753d85a6ccaae34e81385c8665c2de0e1Daniel Dunbar 2881d65e4be6f22f7e4b4974efbaef92fa3454f1ec8Daniel Dunbar return ""; 289728a512753d85a6ccaae34e81385c8665c2de0e1Daniel Dunbar} 290728a512753d85a6ccaae34e81385c8665c2de0e1Daniel Dunbar 291728a512753d85a6ccaae34e81385c8665c2de0e1Daniel Dunbar/// getLLVMTriple - Get the LLVM triple to use for a particular toolchain, which 292728a512753d85a6ccaae34e81385c8665c2de0e1Daniel Dunbar/// may depend on command line arguments. 293728a512753d85a6ccaae34e81385c8665c2de0e1Daniel Dunbarstatic std::string getLLVMTriple(const ToolChain &TC, const ArgList &Args) { 294728a512753d85a6ccaae34e81385c8665c2de0e1Daniel Dunbar switch (TC.getTriple().getArch()) { 295728a512753d85a6ccaae34e81385c8665c2de0e1Daniel Dunbar default: 296728a512753d85a6ccaae34e81385c8665c2de0e1Daniel Dunbar return TC.getTripleString(); 297728a512753d85a6ccaae34e81385c8665c2de0e1Daniel Dunbar 298728a512753d85a6ccaae34e81385c8665c2de0e1Daniel Dunbar case llvm::Triple::arm: 299728a512753d85a6ccaae34e81385c8665c2de0e1Daniel Dunbar case llvm::Triple::thumb: { 300f4aa4f61de7d364364dc94bbf83ff71448a11327Daniel Dunbar // FIXME: Factor into subclasses. 301728a512753d85a6ccaae34e81385c8665c2de0e1Daniel Dunbar llvm::Triple Triple = TC.getTriple(); 302f4aa4f61de7d364364dc94bbf83ff71448a11327Daniel Dunbar 303f4aa4f61de7d364364dc94bbf83ff71448a11327Daniel Dunbar // Thumb2 is the default for V7 on Darwin. 304f4aa4f61de7d364364dc94bbf83ff71448a11327Daniel Dunbar // 305f4aa4f61de7d364364dc94bbf83ff71448a11327Daniel Dunbar // FIXME: Thumb should just be another -target-feaure, not in the triple. 306f4aa4f61de7d364364dc94bbf83ff71448a11327Daniel Dunbar llvm::StringRef Suffix = getLLVMArchSuffixForARM(getARMTargetCPU(Args)); 307f4aa4f61de7d364364dc94bbf83ff71448a11327Daniel Dunbar bool ThumbDefault = 308f4aa4f61de7d364364dc94bbf83ff71448a11327Daniel Dunbar (Suffix == "v7" && TC.getTriple().getOS() == llvm::Triple::Darwin); 3091d65e4be6f22f7e4b4974efbaef92fa3454f1ec8Daniel Dunbar std::string ArchName = "arm"; 310f4aa4f61de7d364364dc94bbf83ff71448a11327Daniel Dunbar if (Args.hasFlag(options::OPT_mthumb, options::OPT_mno_thumb, ThumbDefault)) 311f4aa4f61de7d364364dc94bbf83ff71448a11327Daniel Dunbar ArchName = "thumb"; 312f4aa4f61de7d364364dc94bbf83ff71448a11327Daniel Dunbar Triple.setArchName(ArchName + Suffix.str()); 313f4aa4f61de7d364364dc94bbf83ff71448a11327Daniel Dunbar 314728a512753d85a6ccaae34e81385c8665c2de0e1Daniel Dunbar return Triple.getTriple(); 315728a512753d85a6ccaae34e81385c8665c2de0e1Daniel Dunbar } 316728a512753d85a6ccaae34e81385c8665c2de0e1Daniel Dunbar } 317728a512753d85a6ccaae34e81385c8665c2de0e1Daniel Dunbar} 318728a512753d85a6ccaae34e81385c8665c2de0e1Daniel Dunbar 319b163ef7e7a5d904ef0962a7c38c460be083c4d63Daniel Dunbarvoid Clang::AddARMTargetArgs(const ArgList &Args, 320b163ef7e7a5d904ef0962a7c38c460be083c4d63Daniel Dunbar ArgStringList &CmdArgs) const { 321cbd1933f83e2332b2d7add10459f80cc4e7eb7bfDaniel Dunbar const Driver &D = getToolChain().getHost().getDriver(); 322cbd1933f83e2332b2d7add10459f80cc4e7eb7bfDaniel Dunbar 3232030d8f46b4226fa99e59389e3ca856a79c27e9aDaniel Dunbar // Select the ABI to use. 3242030d8f46b4226fa99e59389e3ca856a79c27e9aDaniel Dunbar // 3252030d8f46b4226fa99e59389e3ca856a79c27e9aDaniel Dunbar // FIXME: Support -meabi. 3262030d8f46b4226fa99e59389e3ca856a79c27e9aDaniel Dunbar const char *ABIName = 0; 3272030d8f46b4226fa99e59389e3ca856a79c27e9aDaniel Dunbar if (Arg *A = Args.getLastArg(options::OPT_mabi_EQ)) { 3282030d8f46b4226fa99e59389e3ca856a79c27e9aDaniel Dunbar ABIName = A->getValue(Args); 3292030d8f46b4226fa99e59389e3ca856a79c27e9aDaniel Dunbar } else { 3302030d8f46b4226fa99e59389e3ca856a79c27e9aDaniel Dunbar // Select the default based on the platform. 3312030d8f46b4226fa99e59389e3ca856a79c27e9aDaniel Dunbar switch (getToolChain().getTriple().getOS()) { 3322030d8f46b4226fa99e59389e3ca856a79c27e9aDaniel Dunbar // FIXME: Is this right for non-Darwin and non-Linux? 3332030d8f46b4226fa99e59389e3ca856a79c27e9aDaniel Dunbar default: 3342030d8f46b4226fa99e59389e3ca856a79c27e9aDaniel Dunbar ABIName = "aapcs"; 3352030d8f46b4226fa99e59389e3ca856a79c27e9aDaniel Dunbar break; 3362030d8f46b4226fa99e59389e3ca856a79c27e9aDaniel Dunbar 3372030d8f46b4226fa99e59389e3ca856a79c27e9aDaniel Dunbar case llvm::Triple::Darwin: 3382030d8f46b4226fa99e59389e3ca856a79c27e9aDaniel Dunbar ABIName = "apcs-gnu"; 3392030d8f46b4226fa99e59389e3ca856a79c27e9aDaniel Dunbar break; 3402030d8f46b4226fa99e59389e3ca856a79c27e9aDaniel Dunbar 3412030d8f46b4226fa99e59389e3ca856a79c27e9aDaniel Dunbar case llvm::Triple::Linux: 3422030d8f46b4226fa99e59389e3ca856a79c27e9aDaniel Dunbar ABIName = "aapcs-linux"; 3432030d8f46b4226fa99e59389e3ca856a79c27e9aDaniel Dunbar break; 3442030d8f46b4226fa99e59389e3ca856a79c27e9aDaniel Dunbar } 3452030d8f46b4226fa99e59389e3ca856a79c27e9aDaniel Dunbar } 3462030d8f46b4226fa99e59389e3ca856a79c27e9aDaniel Dunbar CmdArgs.push_back("-target-abi"); 3472030d8f46b4226fa99e59389e3ca856a79c27e9aDaniel Dunbar CmdArgs.push_back(ABIName); 3482030d8f46b4226fa99e59389e3ca856a79c27e9aDaniel Dunbar 349b163ef7e7a5d904ef0962a7c38c460be083c4d63Daniel Dunbar // Set the CPU based on -march= and -mcpu=. 350b163ef7e7a5d904ef0962a7c38c460be083c4d63Daniel Dunbar CmdArgs.push_back(Args.MakeArgString("-mcpu=" + getARMTargetCPU(Args))); 351b163ef7e7a5d904ef0962a7c38c460be083c4d63Daniel Dunbar 352cbd1933f83e2332b2d7add10459f80cc4e7eb7bfDaniel Dunbar // Select the float ABI as determined by -msoft-float, -mhard-float, and 353cbd1933f83e2332b2d7add10459f80cc4e7eb7bfDaniel Dunbar // -mfloat-abi=. 354cbd1933f83e2332b2d7add10459f80cc4e7eb7bfDaniel Dunbar llvm::StringRef FloatABI; 355cbd1933f83e2332b2d7add10459f80cc4e7eb7bfDaniel Dunbar if (Arg *A = Args.getLastArg(options::OPT_msoft_float, 356cbd1933f83e2332b2d7add10459f80cc4e7eb7bfDaniel Dunbar options::OPT_mhard_float, 357cbd1933f83e2332b2d7add10459f80cc4e7eb7bfDaniel Dunbar options::OPT_mfloat_abi_EQ)) { 358cbd1933f83e2332b2d7add10459f80cc4e7eb7bfDaniel Dunbar if (A->getOption().matches(options::OPT_msoft_float)) 359cbd1933f83e2332b2d7add10459f80cc4e7eb7bfDaniel Dunbar FloatABI = "soft"; 360cbd1933f83e2332b2d7add10459f80cc4e7eb7bfDaniel Dunbar else if (A->getOption().matches(options::OPT_mhard_float)) 361cbd1933f83e2332b2d7add10459f80cc4e7eb7bfDaniel Dunbar FloatABI = "hard"; 362cbd1933f83e2332b2d7add10459f80cc4e7eb7bfDaniel Dunbar else { 363cbd1933f83e2332b2d7add10459f80cc4e7eb7bfDaniel Dunbar FloatABI = A->getValue(Args); 364cbd1933f83e2332b2d7add10459f80cc4e7eb7bfDaniel Dunbar if (FloatABI != "soft" && FloatABI != "softfp" && FloatABI != "hard") { 365cbd1933f83e2332b2d7add10459f80cc4e7eb7bfDaniel Dunbar D.Diag(clang::diag::err_drv_invalid_mfloat_abi) 366cbd1933f83e2332b2d7add10459f80cc4e7eb7bfDaniel Dunbar << A->getAsString(Args); 367cbd1933f83e2332b2d7add10459f80cc4e7eb7bfDaniel Dunbar FloatABI = "soft"; 368cbd1933f83e2332b2d7add10459f80cc4e7eb7bfDaniel Dunbar } 369cbd1933f83e2332b2d7add10459f80cc4e7eb7bfDaniel Dunbar } 370cbd1933f83e2332b2d7add10459f80cc4e7eb7bfDaniel Dunbar } 371cbd1933f83e2332b2d7add10459f80cc4e7eb7bfDaniel Dunbar 372cbd1933f83e2332b2d7add10459f80cc4e7eb7bfDaniel Dunbar // If unspecified, choose the default based on the platform. 373cbd1933f83e2332b2d7add10459f80cc4e7eb7bfDaniel Dunbar if (FloatABI.empty()) { 374cbd1933f83e2332b2d7add10459f80cc4e7eb7bfDaniel Dunbar // FIXME: This is wrong for non-Darwin, we don't have a mechanism yet for 375cbd1933f83e2332b2d7add10459f80cc4e7eb7bfDaniel Dunbar // distinguishing things like linux-eabi vs linux-elf. 376cbd1933f83e2332b2d7add10459f80cc4e7eb7bfDaniel Dunbar switch (getToolChain().getTriple().getOS()) { 377cbd1933f83e2332b2d7add10459f80cc4e7eb7bfDaniel Dunbar case llvm::Triple::Darwin: { 378cbd1933f83e2332b2d7add10459f80cc4e7eb7bfDaniel Dunbar // Darwin defaults to "softfp" for v6 and v7. 379cbd1933f83e2332b2d7add10459f80cc4e7eb7bfDaniel Dunbar // 380cbd1933f83e2332b2d7add10459f80cc4e7eb7bfDaniel Dunbar // FIXME: Factor out an ARM class so we can cache the arch somewhere. 381cbd1933f83e2332b2d7add10459f80cc4e7eb7bfDaniel Dunbar llvm::StringRef ArchName = getLLVMArchSuffixForARM(getARMTargetCPU(Args)); 382cbd1933f83e2332b2d7add10459f80cc4e7eb7bfDaniel Dunbar if (ArchName.startswith("v6") || ArchName.startswith("v7")) 383cbd1933f83e2332b2d7add10459f80cc4e7eb7bfDaniel Dunbar FloatABI = "softfp"; 384cbd1933f83e2332b2d7add10459f80cc4e7eb7bfDaniel Dunbar else 385cbd1933f83e2332b2d7add10459f80cc4e7eb7bfDaniel Dunbar FloatABI = "soft"; 386cbd1933f83e2332b2d7add10459f80cc4e7eb7bfDaniel Dunbar break; 387cbd1933f83e2332b2d7add10459f80cc4e7eb7bfDaniel Dunbar } 388cbd1933f83e2332b2d7add10459f80cc4e7eb7bfDaniel Dunbar 389cbd1933f83e2332b2d7add10459f80cc4e7eb7bfDaniel Dunbar default: 390cbd1933f83e2332b2d7add10459f80cc4e7eb7bfDaniel Dunbar // Assume "soft", but warn the user we are guessing. 391cbd1933f83e2332b2d7add10459f80cc4e7eb7bfDaniel Dunbar FloatABI = "soft"; 392cbd1933f83e2332b2d7add10459f80cc4e7eb7bfDaniel Dunbar D.Diag(clang::diag::warn_drv_assuming_mfloat_abi_is) << "soft"; 393cbd1933f83e2332b2d7add10459f80cc4e7eb7bfDaniel Dunbar break; 394cbd1933f83e2332b2d7add10459f80cc4e7eb7bfDaniel Dunbar } 395cbd1933f83e2332b2d7add10459f80cc4e7eb7bfDaniel Dunbar } 396cbd1933f83e2332b2d7add10459f80cc4e7eb7bfDaniel Dunbar 397cbd1933f83e2332b2d7add10459f80cc4e7eb7bfDaniel Dunbar if (FloatABI == "soft") { 398cbd1933f83e2332b2d7add10459f80cc4e7eb7bfDaniel Dunbar // Floating point operations and argument passing are soft. 399cbd1933f83e2332b2d7add10459f80cc4e7eb7bfDaniel Dunbar // 400cbd1933f83e2332b2d7add10459f80cc4e7eb7bfDaniel Dunbar // FIXME: This changes CPP defines, we need -target-soft-float. 401cbd1933f83e2332b2d7add10459f80cc4e7eb7bfDaniel Dunbar CmdArgs.push_back("-soft-float"); 402cbd1933f83e2332b2d7add10459f80cc4e7eb7bfDaniel Dunbar CmdArgs.push_back("-float-abi=soft"); 403cbd1933f83e2332b2d7add10459f80cc4e7eb7bfDaniel Dunbar } else if (FloatABI == "softfp") { 404cbd1933f83e2332b2d7add10459f80cc4e7eb7bfDaniel Dunbar // Floating point operations are hard, but argument passing is soft. 405cbd1933f83e2332b2d7add10459f80cc4e7eb7bfDaniel Dunbar CmdArgs.push_back("-float-abi=soft"); 406cbd1933f83e2332b2d7add10459f80cc4e7eb7bfDaniel Dunbar } else { 407cbd1933f83e2332b2d7add10459f80cc4e7eb7bfDaniel Dunbar // Floating point operations and argument passing are hard. 408cbd1933f83e2332b2d7add10459f80cc4e7eb7bfDaniel Dunbar assert(FloatABI == "hard" && "Invalid float abi!"); 409cbd1933f83e2332b2d7add10459f80cc4e7eb7bfDaniel Dunbar CmdArgs.push_back("-float-abi=hard"); 410cbd1933f83e2332b2d7add10459f80cc4e7eb7bfDaniel Dunbar } 411b163ef7e7a5d904ef0962a7c38c460be083c4d63Daniel Dunbar} 412b163ef7e7a5d904ef0962a7c38c460be083c4d63Daniel Dunbar 4136acda16e9c194dcbd0dea64341e182bdb65d0f41Daniel Dunbarvoid Clang::AddX86TargetArgs(const ArgList &Args, 4146acda16e9c194dcbd0dea64341e182bdb65d0f41Daniel Dunbar ArgStringList &CmdArgs) const { 415e6ad3f9fceef0ecc422ff26754ea069a5fd18c69Daniel Dunbar // FIXME: This needs to change to use a clang-cc option, and set the attribute 416e6ad3f9fceef0ecc422ff26754ea069a5fd18c69Daniel Dunbar // on functions. 417e6ad3f9fceef0ecc422ff26754ea069a5fd18c69Daniel Dunbar if (!Args.hasFlag(options::OPT_mred_zone, 418e6ad3f9fceef0ecc422ff26754ea069a5fd18c69Daniel Dunbar options::OPT_mno_red_zone, 419e6ad3f9fceef0ecc422ff26754ea069a5fd18c69Daniel Dunbar true) || 420e6ad3f9fceef0ecc422ff26754ea069a5fd18c69Daniel Dunbar Args.hasArg(options::OPT_mkernel) || 421e6ad3f9fceef0ecc422ff26754ea069a5fd18c69Daniel Dunbar Args.hasArg(options::OPT_fapple_kext)) 422e6ad3f9fceef0ecc422ff26754ea069a5fd18c69Daniel Dunbar CmdArgs.push_back("--disable-red-zone"); 423e6ad3f9fceef0ecc422ff26754ea069a5fd18c69Daniel Dunbar 424e6ad3f9fceef0ecc422ff26754ea069a5fd18c69Daniel Dunbar // FIXME: This needs to change to use a clang-cc option, and set the attribute 425e6ad3f9fceef0ecc422ff26754ea069a5fd18c69Daniel Dunbar // on functions. 426e6ad3f9fceef0ecc422ff26754ea069a5fd18c69Daniel Dunbar if (Args.hasFlag(options::OPT_msoft_float, 427e6ad3f9fceef0ecc422ff26754ea069a5fd18c69Daniel Dunbar options::OPT_mno_soft_float, 428e6ad3f9fceef0ecc422ff26754ea069a5fd18c69Daniel Dunbar false)) 429e6ad3f9fceef0ecc422ff26754ea069a5fd18c69Daniel Dunbar CmdArgs.push_back("--no-implicit-float"); 430e6ad3f9fceef0ecc422ff26754ea069a5fd18c69Daniel Dunbar 4316acda16e9c194dcbd0dea64341e182bdb65d0f41Daniel Dunbar if (const Arg *A = Args.getLastArg(options::OPT_march_EQ)) { 4326acda16e9c194dcbd0dea64341e182bdb65d0f41Daniel Dunbar // FIXME: We may need some translation here from the options gcc takes to 4336acda16e9c194dcbd0dea64341e182bdb65d0f41Daniel Dunbar // names the LLVM backend understand? 4346acda16e9c194dcbd0dea64341e182bdb65d0f41Daniel Dunbar CmdArgs.push_back("-mcpu"); 4356acda16e9c194dcbd0dea64341e182bdb65d0f41Daniel Dunbar CmdArgs.push_back(A->getValue(Args)); 4366acda16e9c194dcbd0dea64341e182bdb65d0f41Daniel Dunbar } else { 4376acda16e9c194dcbd0dea64341e182bdb65d0f41Daniel Dunbar // Select default CPU. 4386acda16e9c194dcbd0dea64341e182bdb65d0f41Daniel Dunbar 4396acda16e9c194dcbd0dea64341e182bdb65d0f41Daniel Dunbar // FIXME: Need target hooks. 4406acda16e9c194dcbd0dea64341e182bdb65d0f41Daniel Dunbar if (memcmp(getToolChain().getOS().c_str(), "darwin", 6) == 0) { 4416acda16e9c194dcbd0dea64341e182bdb65d0f41Daniel Dunbar if (getToolChain().getArchName() == "x86_64") 4426acda16e9c194dcbd0dea64341e182bdb65d0f41Daniel Dunbar CmdArgs.push_back("--mcpu=core2"); 4436acda16e9c194dcbd0dea64341e182bdb65d0f41Daniel Dunbar else if (getToolChain().getArchName() == "i386") 4446acda16e9c194dcbd0dea64341e182bdb65d0f41Daniel Dunbar CmdArgs.push_back("--mcpu=yonah"); 4456acda16e9c194dcbd0dea64341e182bdb65d0f41Daniel Dunbar } else { 4466acda16e9c194dcbd0dea64341e182bdb65d0f41Daniel Dunbar if (getToolChain().getArchName() == "x86_64") 4476acda16e9c194dcbd0dea64341e182bdb65d0f41Daniel Dunbar CmdArgs.push_back("--mcpu=x86-64"); 4486acda16e9c194dcbd0dea64341e182bdb65d0f41Daniel Dunbar else if (getToolChain().getArchName() == "i386") 4496acda16e9c194dcbd0dea64341e182bdb65d0f41Daniel Dunbar CmdArgs.push_back("--mcpu=pentium4"); 4506acda16e9c194dcbd0dea64341e182bdb65d0f41Daniel Dunbar } 4516acda16e9c194dcbd0dea64341e182bdb65d0f41Daniel Dunbar } 4526acda16e9c194dcbd0dea64341e182bdb65d0f41Daniel Dunbar 4536acda16e9c194dcbd0dea64341e182bdb65d0f41Daniel Dunbar // FIXME: Use iterator. 4546acda16e9c194dcbd0dea64341e182bdb65d0f41Daniel Dunbar for (ArgList::const_iterator 4556acda16e9c194dcbd0dea64341e182bdb65d0f41Daniel Dunbar it = Args.begin(), ie = Args.end(); it != ie; ++it) { 4566acda16e9c194dcbd0dea64341e182bdb65d0f41Daniel Dunbar const Arg *A = *it; 4576acda16e9c194dcbd0dea64341e182bdb65d0f41Daniel Dunbar if (A->getOption().matches(options::OPT_m_x86_Features_Group)) { 4586acda16e9c194dcbd0dea64341e182bdb65d0f41Daniel Dunbar llvm::StringRef Name = A->getOption().getName(); 4596acda16e9c194dcbd0dea64341e182bdb65d0f41Daniel Dunbar 4606acda16e9c194dcbd0dea64341e182bdb65d0f41Daniel Dunbar // Skip over "-m". 4616acda16e9c194dcbd0dea64341e182bdb65d0f41Daniel Dunbar assert(Name.startswith("-m") && "Invalid feature name."); 4626acda16e9c194dcbd0dea64341e182bdb65d0f41Daniel Dunbar Name = Name.substr(2); 4636acda16e9c194dcbd0dea64341e182bdb65d0f41Daniel Dunbar 4646acda16e9c194dcbd0dea64341e182bdb65d0f41Daniel Dunbar bool IsNegative = Name.startswith("no-"); 4656acda16e9c194dcbd0dea64341e182bdb65d0f41Daniel Dunbar if (IsNegative) 4666acda16e9c194dcbd0dea64341e182bdb65d0f41Daniel Dunbar Name = Name.substr(3); 4676acda16e9c194dcbd0dea64341e182bdb65d0f41Daniel Dunbar 4686acda16e9c194dcbd0dea64341e182bdb65d0f41Daniel Dunbar A->claim(); 4696acda16e9c194dcbd0dea64341e182bdb65d0f41Daniel Dunbar CmdArgs.push_back("-target-feature"); 4706acda16e9c194dcbd0dea64341e182bdb65d0f41Daniel Dunbar CmdArgs.push_back(Args.MakeArgString((IsNegative ? "-" : "+") + Name)); 4716acda16e9c194dcbd0dea64341e182bdb65d0f41Daniel Dunbar } 4726acda16e9c194dcbd0dea64341e182bdb65d0f41Daniel Dunbar } 4736acda16e9c194dcbd0dea64341e182bdb65d0f41Daniel Dunbar} 4746acda16e9c194dcbd0dea64341e182bdb65d0f41Daniel Dunbar 47547ac7d27c44bd64a7d0fc03d4babc196cf2b8230Daniel Dunbarvoid Clang::ConstructJob(Compilation &C, const JobAction &JA, 476871adcf4e41285e3f4c3b62eaa1b2e05b60b92daDaniel Dunbar Job &Dest, 477871adcf4e41285e3f4c3b62eaa1b2e05b60b92daDaniel Dunbar const InputInfo &Output, 47862cf601812e03dd9bc5df42b8ef06a0cdedc38bfDaniel Dunbar const InputInfoList &Inputs, 4791d46033f760ba5fd266ce59fe391fac473f04f52Daniel Dunbar const ArgList &Args, 48047ac7d27c44bd64a7d0fc03d4babc196cf2b8230Daniel Dunbar const char *LinkingOutput) const { 4815c1aaafbd6dd25a99ca1960e1c3c98aeefe9d728Daniel Dunbar const Driver &D = getToolChain().getHost().getDriver(); 482b488c1dac8e53206f07103d794a62a3f5012c0f4Daniel Dunbar ArgStringList CmdArgs; 483b488c1dac8e53206f07103d794a62a3f5012c0f4Daniel Dunbar 484077ba6a3ac3628afb0d3c460e81ce013bccbdbedDaniel Dunbar assert(Inputs.size() == 1 && "Unable to handle multiple inputs."); 485077ba6a3ac3628afb0d3c460e81ce013bccbdbedDaniel Dunbar 486af07f936b698575f2c91f1c1134c116f1ef0deddDaniel Dunbar CmdArgs.push_back("-triple"); 487728a512753d85a6ccaae34e81385c8665c2de0e1Daniel Dunbar 488c21c485b4fb58ef5d55cf3e523263dd824a2ace4Daniel Dunbar const char *TripleStr = 489728a512753d85a6ccaae34e81385c8665c2de0e1Daniel Dunbar Args.MakeArgString(getLLVMTriple(getToolChain(), Args)); 490af07f936b698575f2c91f1c1134c116f1ef0deddDaniel Dunbar CmdArgs.push_back(TripleStr); 491af07f936b698575f2c91f1c1134c116f1ef0deddDaniel Dunbar 4921d46033f760ba5fd266ce59fe391fac473f04f52Daniel Dunbar if (isa<AnalyzeJobAction>(JA)) { 4931d46033f760ba5fd266ce59fe391fac473f04f52Daniel Dunbar assert(JA.getType() == types::TY_Plist && "Invalid output type."); 4941d46033f760ba5fd266ce59fe391fac473f04f52Daniel Dunbar CmdArgs.push_back("-analyze"); 4951d46033f760ba5fd266ce59fe391fac473f04f52Daniel Dunbar } else if (isa<PreprocessJobAction>(JA)) { 496cd8e4c44dd068956e9181381be3ee2d49a0fac52Daniel Dunbar if (Output.getType() == types::TY_Dependencies) 497cd8e4c44dd068956e9181381be3ee2d49a0fac52Daniel Dunbar CmdArgs.push_back("-Eonly"); 498cd8e4c44dd068956e9181381be3ee2d49a0fac52Daniel Dunbar else 499cd8e4c44dd068956e9181381be3ee2d49a0fac52Daniel Dunbar CmdArgs.push_back("-E"); 5001d46033f760ba5fd266ce59fe391fac473f04f52Daniel Dunbar } else if (isa<PrecompileJobAction>(JA)) { 501df91ef3d6c55692a0236f67b6c6b134a3bf84098Douglas Gregor if (D.CCCUsePCH) 502df91ef3d6c55692a0236f67b6c6b134a3bf84098Douglas Gregor CmdArgs.push_back("-emit-pch"); 503df91ef3d6c55692a0236f67b6c6b134a3bf84098Douglas Gregor else 504df91ef3d6c55692a0236f67b6c6b134a3bf84098Douglas Gregor CmdArgs.push_back("-emit-pth"); 5051d46033f760ba5fd266ce59fe391fac473f04f52Daniel Dunbar } else { 5061d46033f760ba5fd266ce59fe391fac473f04f52Daniel Dunbar assert(isa<CompileJobAction>(JA) && "Invalid action for clang tool."); 507c21c485b4fb58ef5d55cf3e523263dd824a2ace4Daniel Dunbar 5081d46033f760ba5fd266ce59fe391fac473f04f52Daniel Dunbar if (JA.getType() == types::TY_Nothing) { 5091d46033f760ba5fd266ce59fe391fac473f04f52Daniel Dunbar CmdArgs.push_back("-fsyntax-only"); 5101d46033f760ba5fd266ce59fe391fac473f04f52Daniel Dunbar } else if (JA.getType() == types::TY_LLVMAsm) { 5111d46033f760ba5fd266ce59fe391fac473f04f52Daniel Dunbar CmdArgs.push_back("-emit-llvm"); 5121d46033f760ba5fd266ce59fe391fac473f04f52Daniel Dunbar } else if (JA.getType() == types::TY_LLVMBC) { 5131d46033f760ba5fd266ce59fe391fac473f04f52Daniel Dunbar CmdArgs.push_back("-emit-llvm-bc"); 5141d46033f760ba5fd266ce59fe391fac473f04f52Daniel Dunbar } else if (JA.getType() == types::TY_PP_Asm) { 515e3b8d07e02861d245612b02b5f5a2c1f34b2a394Daniel Dunbar CmdArgs.push_back("-S"); 5165915fbf310e171c4cd3c2af05e9de360c0fa988aDaniel Dunbar } else if (JA.getType() == types::TY_AST) { 5175915fbf310e171c4cd3c2af05e9de360c0fa988aDaniel Dunbar CmdArgs.push_back("-emit-pch"); 5181d46033f760ba5fd266ce59fe391fac473f04f52Daniel Dunbar } 5191d46033f760ba5fd266ce59fe391fac473f04f52Daniel Dunbar } 5201d46033f760ba5fd266ce59fe391fac473f04f52Daniel Dunbar 5211d46033f760ba5fd266ce59fe391fac473f04f52Daniel Dunbar // The make clang go fast button. 5221d46033f760ba5fd266ce59fe391fac473f04f52Daniel Dunbar CmdArgs.push_back("-disable-free"); 5231d46033f760ba5fd266ce59fe391fac473f04f52Daniel Dunbar 524c9abc043af88f90d177a5bd147f627b78ca49fdeDaniel Dunbar // Set the main file name, so that debug info works even with 525c9abc043af88f90d177a5bd147f627b78ca49fdeDaniel Dunbar // -save-temps. 526c9abc043af88f90d177a5bd147f627b78ca49fdeDaniel Dunbar CmdArgs.push_back("-main-file-name"); 527c9abc043af88f90d177a5bd147f627b78ca49fdeDaniel Dunbar CmdArgs.push_back(darwin::CC1::getBaseInputName(Args, Inputs)); 528c9abc043af88f90d177a5bd147f627b78ca49fdeDaniel Dunbar 5293bbc75302fd43cf13d868b46c94ff8794b302e43Daniel Dunbar // Some flags which affect the language (via preprocessor 5303bbc75302fd43cf13d868b46c94ff8794b302e43Daniel Dunbar // defines). See darwin::CC1::AddCPPArgs. 5313bbc75302fd43cf13d868b46c94ff8794b302e43Daniel Dunbar if (Args.hasArg(options::OPT_static)) 5323bbc75302fd43cf13d868b46c94ff8794b302e43Daniel Dunbar CmdArgs.push_back("-static-define"); 5333bbc75302fd43cf13d868b46c94ff8794b302e43Daniel Dunbar 5341d46033f760ba5fd266ce59fe391fac473f04f52Daniel Dunbar if (isa<AnalyzeJobAction>(JA)) { 5351d46033f760ba5fd266ce59fe391fac473f04f52Daniel Dunbar // Add default argument set. 536d8fc0f2e7751cf31cec5c2f3cc6a0b447e9debb3Daniel Dunbar if (!Args.hasArg(options::OPT__analyzer_no_default_checks)) { 537d8fc0f2e7751cf31cec5c2f3cc6a0b447e9debb3Daniel Dunbar CmdArgs.push_back("-warn-dead-stores"); 53811727519fbdaec68f526ae7c54a83d0a4601f561Ted Kremenek CmdArgs.push_back("-warn-security-syntactic"); 539d8fc0f2e7751cf31cec5c2f3cc6a0b447e9debb3Daniel Dunbar CmdArgs.push_back("-checker-cfref"); 540d8fc0f2e7751cf31cec5c2f3cc6a0b447e9debb3Daniel Dunbar CmdArgs.push_back("-analyzer-eagerly-assume"); 541d8fc0f2e7751cf31cec5c2f3cc6a0b447e9debb3Daniel Dunbar CmdArgs.push_back("-warn-objc-methodsigs"); 542d8fc0f2e7751cf31cec5c2f3cc6a0b447e9debb3Daniel Dunbar // Do not enable the missing -dealloc check. 543d8fc0f2e7751cf31cec5c2f3cc6a0b447e9debb3Daniel Dunbar // '-warn-objc-missing-dealloc', 544d8fc0f2e7751cf31cec5c2f3cc6a0b447e9debb3Daniel Dunbar CmdArgs.push_back("-warn-objc-unused-ivars"); 545d8fc0f2e7751cf31cec5c2f3cc6a0b447e9debb3Daniel Dunbar } 546d8fc0f2e7751cf31cec5c2f3cc6a0b447e9debb3Daniel Dunbar 547d8fc0f2e7751cf31cec5c2f3cc6a0b447e9debb3Daniel Dunbar // Set the output format. The default is plist, for (lame) historical 548d8fc0f2e7751cf31cec5c2f3cc6a0b447e9debb3Daniel Dunbar // reasons. 549d8fc0f2e7751cf31cec5c2f3cc6a0b447e9debb3Daniel Dunbar CmdArgs.push_back("-analyzer-output"); 550d8fc0f2e7751cf31cec5c2f3cc6a0b447e9debb3Daniel Dunbar if (Arg *A = Args.getLastArg(options::OPT__analyzer_output)) 551d8fc0f2e7751cf31cec5c2f3cc6a0b447e9debb3Daniel Dunbar CmdArgs.push_back(A->getValue(Args)); 552d8fc0f2e7751cf31cec5c2f3cc6a0b447e9debb3Daniel Dunbar else 553d8fc0f2e7751cf31cec5c2f3cc6a0b447e9debb3Daniel Dunbar CmdArgs.push_back("plist"); 5541d46033f760ba5fd266ce59fe391fac473f04f52Daniel Dunbar 5551d46033f760ba5fd266ce59fe391fac473f04f52Daniel Dunbar // Add -Xanalyzer arguments when running as analyzer. 5561d46033f760ba5fd266ce59fe391fac473f04f52Daniel Dunbar Args.AddAllArgValues(CmdArgs, options::OPT_Xanalyzer); 5571eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump } 5581eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump 559e2fd66418eca3d70cf6b62087d745d0c5181db69Daniel Dunbar CheckCodeGenerationOptions(D, Args); 560e2fd66418eca3d70cf6b62087d745d0c5181db69Daniel Dunbar 561bc85be85779a47bae728bbe6a2cd2e3732b1333dDaniel Dunbar // Perform argument translation for LLVM backend. This 562bc85be85779a47bae728bbe6a2cd2e3732b1333dDaniel Dunbar // takes some care in reconciling with llvm-gcc. The 563bc85be85779a47bae728bbe6a2cd2e3732b1333dDaniel Dunbar // issue is that llvm-gcc translates these options based on 564bc85be85779a47bae728bbe6a2cd2e3732b1333dDaniel Dunbar // the values in cc1, whereas we are processing based on 565bc85be85779a47bae728bbe6a2cd2e3732b1333dDaniel Dunbar // the driver arguments. 566bc85be85779a47bae728bbe6a2cd2e3732b1333dDaniel Dunbar // 567bc85be85779a47bae728bbe6a2cd2e3732b1333dDaniel Dunbar // FIXME: This is currently broken for -f flags when -fno 568bc85be85779a47bae728bbe6a2cd2e3732b1333dDaniel Dunbar // variants are present. 5699fd0b1f845a61e71dd8099f596532d34c519630aDaniel Dunbar 570bc85be85779a47bae728bbe6a2cd2e3732b1333dDaniel Dunbar // This comes from the default translation the driver + cc1 571bc85be85779a47bae728bbe6a2cd2e3732b1333dDaniel Dunbar // would do to enable flag_pic. 572bc85be85779a47bae728bbe6a2cd2e3732b1333dDaniel Dunbar // 573bc85be85779a47bae728bbe6a2cd2e3732b1333dDaniel Dunbar // FIXME: Centralize this code. 574bc85be85779a47bae728bbe6a2cd2e3732b1333dDaniel Dunbar bool PICEnabled = (Args.hasArg(options::OPT_fPIC) || 575bc85be85779a47bae728bbe6a2cd2e3732b1333dDaniel Dunbar Args.hasArg(options::OPT_fpic) || 576bc85be85779a47bae728bbe6a2cd2e3732b1333dDaniel Dunbar Args.hasArg(options::OPT_fPIE) || 577bc85be85779a47bae728bbe6a2cd2e3732b1333dDaniel Dunbar Args.hasArg(options::OPT_fpie)); 578bc85be85779a47bae728bbe6a2cd2e3732b1333dDaniel Dunbar bool PICDisabled = (Args.hasArg(options::OPT_mkernel) || 579bc85be85779a47bae728bbe6a2cd2e3732b1333dDaniel Dunbar Args.hasArg(options::OPT_static)); 580bc85be85779a47bae728bbe6a2cd2e3732b1333dDaniel Dunbar const char *Model = getToolChain().GetForcedPicModel(); 581bc85be85779a47bae728bbe6a2cd2e3732b1333dDaniel Dunbar if (!Model) { 582bc85be85779a47bae728bbe6a2cd2e3732b1333dDaniel Dunbar if (Args.hasArg(options::OPT_mdynamic_no_pic)) 583bc85be85779a47bae728bbe6a2cd2e3732b1333dDaniel Dunbar Model = "dynamic-no-pic"; 584bc85be85779a47bae728bbe6a2cd2e3732b1333dDaniel Dunbar else if (PICDisabled) 585bc85be85779a47bae728bbe6a2cd2e3732b1333dDaniel Dunbar Model = "static"; 586bc85be85779a47bae728bbe6a2cd2e3732b1333dDaniel Dunbar else if (PICEnabled) 587bc85be85779a47bae728bbe6a2cd2e3732b1333dDaniel Dunbar Model = "pic"; 5881d46033f760ba5fd266ce59fe391fac473f04f52Daniel Dunbar else 589bc85be85779a47bae728bbe6a2cd2e3732b1333dDaniel Dunbar Model = getToolChain().GetDefaultRelocationModel(); 590bc85be85779a47bae728bbe6a2cd2e3732b1333dDaniel Dunbar } 591bc85be85779a47bae728bbe6a2cd2e3732b1333dDaniel Dunbar CmdArgs.push_back("--relocation-model"); 592bc85be85779a47bae728bbe6a2cd2e3732b1333dDaniel Dunbar CmdArgs.push_back(Model); 5931d46033f760ba5fd266ce59fe391fac473f04f52Daniel Dunbar 594bc85be85779a47bae728bbe6a2cd2e3732b1333dDaniel Dunbar // Infer the __PIC__ value. 595bc85be85779a47bae728bbe6a2cd2e3732b1333dDaniel Dunbar // 596bc85be85779a47bae728bbe6a2cd2e3732b1333dDaniel Dunbar // FIXME: This isn't quite right on Darwin, which always sets 597bc85be85779a47bae728bbe6a2cd2e3732b1333dDaniel Dunbar // __PIC__=2. 598bc85be85779a47bae728bbe6a2cd2e3732b1333dDaniel Dunbar if (strcmp(Model, "pic") == 0 || strcmp(Model, "dynamic-no-pic") == 0) { 599bc85be85779a47bae728bbe6a2cd2e3732b1333dDaniel Dunbar if (Args.hasArg(options::OPT_fPIC)) 600bc85be85779a47bae728bbe6a2cd2e3732b1333dDaniel Dunbar CmdArgs.push_back("-pic-level=2"); 6011d46033f760ba5fd266ce59fe391fac473f04f52Daniel Dunbar else 602bc85be85779a47bae728bbe6a2cd2e3732b1333dDaniel Dunbar CmdArgs.push_back("-pic-level=1"); 603bc85be85779a47bae728bbe6a2cd2e3732b1333dDaniel Dunbar } 6041d46033f760ba5fd266ce59fe391fac473f04f52Daniel Dunbar 605bc85be85779a47bae728bbe6a2cd2e3732b1333dDaniel Dunbar if (Args.hasArg(options::OPT_ftime_report)) 606bc85be85779a47bae728bbe6a2cd2e3732b1333dDaniel Dunbar CmdArgs.push_back("--time-passes"); 607bc85be85779a47bae728bbe6a2cd2e3732b1333dDaniel Dunbar // FIXME: Set --enable-unsafe-fp-math. 60821656ddae8e81df04f142386337cb95a9e0f0971Benjamin Kramer if (Args.hasFlag(options::OPT_fno_omit_frame_pointer, 60921656ddae8e81df04f142386337cb95a9e0f0971Benjamin Kramer options::OPT_fomit_frame_pointer)) 610bc85be85779a47bae728bbe6a2cd2e3732b1333dDaniel Dunbar CmdArgs.push_back("--disable-fp-elim"); 611bc85be85779a47bae728bbe6a2cd2e3732b1333dDaniel Dunbar if (!Args.hasFlag(options::OPT_fzero_initialized_in_bss, 612bc85be85779a47bae728bbe6a2cd2e3732b1333dDaniel Dunbar options::OPT_fno_zero_initialized_in_bss, 613bc85be85779a47bae728bbe6a2cd2e3732b1333dDaniel Dunbar true)) 614bc85be85779a47bae728bbe6a2cd2e3732b1333dDaniel Dunbar CmdArgs.push_back("--nozero-initialized-in-bss"); 615bc85be85779a47bae728bbe6a2cd2e3732b1333dDaniel Dunbar if (Args.hasArg(options::OPT_dA) || Args.hasArg(options::OPT_fverbose_asm)) 616bc85be85779a47bae728bbe6a2cd2e3732b1333dDaniel Dunbar CmdArgs.push_back("--asm-verbose"); 617bc85be85779a47bae728bbe6a2cd2e3732b1333dDaniel Dunbar if (Args.hasArg(options::OPT_fdebug_pass_structure)) 618bc85be85779a47bae728bbe6a2cd2e3732b1333dDaniel Dunbar CmdArgs.push_back("--debug-pass=Structure"); 619bc85be85779a47bae728bbe6a2cd2e3732b1333dDaniel Dunbar if (Args.hasArg(options::OPT_fdebug_pass_arguments)) 620bc85be85779a47bae728bbe6a2cd2e3732b1333dDaniel Dunbar CmdArgs.push_back("--debug-pass=Arguments"); 621bc85be85779a47bae728bbe6a2cd2e3732b1333dDaniel Dunbar // FIXME: set --inline-threshhold=50 if (optimize_size || optimize 622bc85be85779a47bae728bbe6a2cd2e3732b1333dDaniel Dunbar // < 3) 6236bea73b3305a03479589e2642fbdcf6c096851aaDaniel Dunbar 6246bea73b3305a03479589e2642fbdcf6c096851aaDaniel Dunbar // This is a coarse approximation of what llvm-gcc actually does, both 6256bea73b3305a03479589e2642fbdcf6c096851aaDaniel Dunbar // -fasynchronous-unwind-tables and -fnon-call-exceptions interact in more 6266bea73b3305a03479589e2642fbdcf6c096851aaDaniel Dunbar // complicated ways. 6276bea73b3305a03479589e2642fbdcf6c096851aaDaniel Dunbar bool AsynchronousUnwindTables = 6286bea73b3305a03479589e2642fbdcf6c096851aaDaniel Dunbar Args.hasFlag(options::OPT_fasynchronous_unwind_tables, 6296bea73b3305a03479589e2642fbdcf6c096851aaDaniel Dunbar options::OPT_fno_asynchronous_unwind_tables, 6306bea73b3305a03479589e2642fbdcf6c096851aaDaniel Dunbar getToolChain().IsUnwindTablesDefault() && 6316bea73b3305a03479589e2642fbdcf6c096851aaDaniel Dunbar !Args.hasArg(options::OPT_mkernel)); 6326bea73b3305a03479589e2642fbdcf6c096851aaDaniel Dunbar if (Args.hasFlag(options::OPT_funwind_tables, options::OPT_fno_unwind_tables, 6336bea73b3305a03479589e2642fbdcf6c096851aaDaniel Dunbar AsynchronousUnwindTables)) 634bc85be85779a47bae728bbe6a2cd2e3732b1333dDaniel Dunbar CmdArgs.push_back("--unwind-tables=1"); 635bc85be85779a47bae728bbe6a2cd2e3732b1333dDaniel Dunbar else 636bc85be85779a47bae728bbe6a2cd2e3732b1333dDaniel Dunbar CmdArgs.push_back("--unwind-tables=0"); 637bc85be85779a47bae728bbe6a2cd2e3732b1333dDaniel Dunbar 638868bd0aa9281929ef50d2e9a8c82a036906f53f5Daniel Dunbar // FIXME: Handle -mtune=. 639868bd0aa9281929ef50d2e9a8c82a036906f53f5Daniel Dunbar (void) Args.hasArg(options::OPT_mtune_EQ); 640bc85be85779a47bae728bbe6a2cd2e3732b1333dDaniel Dunbar 6418e9ef0d87dad25f02e5abc6facf528778236115aBenjamin Kramer if (Arg *A = Args.getLastArg(options::OPT_mcmodel_EQ)) { 6428e9ef0d87dad25f02e5abc6facf528778236115aBenjamin Kramer CmdArgs.push_back("-code-model"); 6438e9ef0d87dad25f02e5abc6facf528778236115aBenjamin Kramer CmdArgs.push_back(A->getValue(Args)); 6448e9ef0d87dad25f02e5abc6facf528778236115aBenjamin Kramer } 6458e9ef0d87dad25f02e5abc6facf528778236115aBenjamin Kramer 6466acda16e9c194dcbd0dea64341e182bdb65d0f41Daniel Dunbar // Add target specific cpu and features flags. 6476acda16e9c194dcbd0dea64341e182bdb65d0f41Daniel Dunbar switch(getToolChain().getTriple().getArch()) { 6486acda16e9c194dcbd0dea64341e182bdb65d0f41Daniel Dunbar default: 6496acda16e9c194dcbd0dea64341e182bdb65d0f41Daniel Dunbar break; 650868bd0aa9281929ef50d2e9a8c82a036906f53f5Daniel Dunbar 651b163ef7e7a5d904ef0962a7c38c460be083c4d63Daniel Dunbar case llvm::Triple::arm: 652b163ef7e7a5d904ef0962a7c38c460be083c4d63Daniel Dunbar case llvm::Triple::thumb: 653b163ef7e7a5d904ef0962a7c38c460be083c4d63Daniel Dunbar AddARMTargetArgs(Args, CmdArgs); 654b163ef7e7a5d904ef0962a7c38c460be083c4d63Daniel Dunbar break; 655b163ef7e7a5d904ef0962a7c38c460be083c4d63Daniel Dunbar 6566acda16e9c194dcbd0dea64341e182bdb65d0f41Daniel Dunbar case llvm::Triple::x86: 6576acda16e9c194dcbd0dea64341e182bdb65d0f41Daniel Dunbar case llvm::Triple::x86_64: 6586acda16e9c194dcbd0dea64341e182bdb65d0f41Daniel Dunbar AddX86TargetArgs(Args, CmdArgs); 6596acda16e9c194dcbd0dea64341e182bdb65d0f41Daniel Dunbar break; 660bc85be85779a47bae728bbe6a2cd2e3732b1333dDaniel Dunbar } 661c21c485b4fb58ef5d55cf3e523263dd824a2ace4Daniel Dunbar 662bc85be85779a47bae728bbe6a2cd2e3732b1333dDaniel Dunbar if (Args.hasFlag(options::OPT_fmath_errno, 663bc85be85779a47bae728bbe6a2cd2e3732b1333dDaniel Dunbar options::OPT_fno_math_errno, 664bc85be85779a47bae728bbe6a2cd2e3732b1333dDaniel Dunbar getToolChain().IsMathErrnoDefault())) 665bc85be85779a47bae728bbe6a2cd2e3732b1333dDaniel Dunbar CmdArgs.push_back("--fmath-errno=1"); 666bc85be85779a47bae728bbe6a2cd2e3732b1333dDaniel Dunbar else 667bc85be85779a47bae728bbe6a2cd2e3732b1333dDaniel Dunbar CmdArgs.push_back("--fmath-errno=0"); 6681d46033f760ba5fd266ce59fe391fac473f04f52Daniel Dunbar 669bc85be85779a47bae728bbe6a2cd2e3732b1333dDaniel Dunbar if (Arg *A = Args.getLastArg(options::OPT_flimited_precision_EQ)) { 670bc85be85779a47bae728bbe6a2cd2e3732b1333dDaniel Dunbar CmdArgs.push_back("--limit-float-precision"); 671bc85be85779a47bae728bbe6a2cd2e3732b1333dDaniel Dunbar CmdArgs.push_back(A->getValue(Args)); 6721d46033f760ba5fd266ce59fe391fac473f04f52Daniel Dunbar } 6731d46033f760ba5fd266ce59fe391fac473f04f52Daniel Dunbar 674bc85be85779a47bae728bbe6a2cd2e3732b1333dDaniel Dunbar // FIXME: Add --stack-protector-buffer-size=<xxx> on 675bc85be85779a47bae728bbe6a2cd2e3732b1333dDaniel Dunbar // -fstack-protect. 676bc85be85779a47bae728bbe6a2cd2e3732b1333dDaniel Dunbar 677bc85be85779a47bae728bbe6a2cd2e3732b1333dDaniel Dunbar Arg *Unsupported; 678bc85be85779a47bae728bbe6a2cd2e3732b1333dDaniel Dunbar if ((Unsupported = Args.getLastArg(options::OPT_MG)) || 67995a0da7b263777e6f97e5a08b6eb893681a234baDaniel Dunbar (Unsupported = Args.getLastArg(options::OPT_MQ)) || 68095a0da7b263777e6f97e5a08b6eb893681a234baDaniel Dunbar (Unsupported = Args.getLastArg(options::OPT_iframework))) 681e027a4b2399e9b0acfe0f77220c66bbe369067eeDaniel Dunbar D.Diag(clang::diag::err_drv_clang_unsupported) 682bc85be85779a47bae728bbe6a2cd2e3732b1333dDaniel Dunbar << Unsupported->getOption().getName(); 683bc85be85779a47bae728bbe6a2cd2e3732b1333dDaniel Dunbar 6841d46033f760ba5fd266ce59fe391fac473f04f52Daniel Dunbar Args.AddAllArgs(CmdArgs, options::OPT_v); 6851d46033f760ba5fd266ce59fe391fac473f04f52Daniel Dunbar Args.AddLastArg(CmdArgs, options::OPT_P); 6862ac9fc2ad64e16127df8c60caeea2edfe9a400a2Daniel Dunbar Args.AddLastArg(CmdArgs, options::OPT_mmacosx_version_min_EQ); 687ff8857a9e6f533765f63b2934902645baa7ddd09Daniel Dunbar Args.AddLastArg(CmdArgs, options::OPT_miphoneos_version_min_EQ); 6881eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump Args.AddLastArg(CmdArgs, options::OPT_print_ivar_layout); 6891d46033f760ba5fd266ce59fe391fac473f04f52Daniel Dunbar 6901d46033f760ba5fd266ce59fe391fac473f04f52Daniel Dunbar // Special case debug options to only pass -g to clang. This is 6911d46033f760ba5fd266ce59fe391fac473f04f52Daniel Dunbar // wrong. 6921d46033f760ba5fd266ce59fe391fac473f04f52Daniel Dunbar if (Args.hasArg(options::OPT_g_Group)) 6931d46033f760ba5fd266ce59fe391fac473f04f52Daniel Dunbar CmdArgs.push_back("-g"); 6941d46033f760ba5fd266ce59fe391fac473f04f52Daniel Dunbar 6951d46033f760ba5fd266ce59fe391fac473f04f52Daniel Dunbar Args.AddLastArg(CmdArgs, options::OPT_nostdinc); 6961d46033f760ba5fd266ce59fe391fac473f04f52Daniel Dunbar 6972ac9fc2ad64e16127df8c60caeea2edfe9a400a2Daniel Dunbar Args.AddLastArg(CmdArgs, options::OPT_isysroot); 6982ac9fc2ad64e16127df8c60caeea2edfe9a400a2Daniel Dunbar 699c21c485b4fb58ef5d55cf3e523263dd824a2ace4Daniel Dunbar // Add preprocessing options like -I, -D, etc. if we are using the 700c21c485b4fb58ef5d55cf3e523263dd824a2ace4Daniel Dunbar // preprocessor. 701c21c485b4fb58ef5d55cf3e523263dd824a2ace4Daniel Dunbar // 702c21c485b4fb58ef5d55cf3e523263dd824a2ace4Daniel Dunbar // FIXME: Support -fpreprocessed 703c21c485b4fb58ef5d55cf3e523263dd824a2ace4Daniel Dunbar types::ID InputType = Inputs[0].getType(); 704c21c485b4fb58ef5d55cf3e523263dd824a2ace4Daniel Dunbar if (types::getPreprocessedType(InputType) != types::TY_INVALID) 705df91ef3d6c55692a0236f67b6c6b134a3bf84098Douglas Gregor AddPreprocessingOptions(D, Args, CmdArgs, Output, Inputs); 7061d46033f760ba5fd266ce59fe391fac473f04f52Daniel Dunbar 70720f0eacf1682e4594da9d318b5b13ed4f6d6e7e5Daniel Dunbar // Manually translate -O to -O2 and -O4 to -O3; let clang reject 708337a6271b98c4c183f7eaad1563a75260b4f2871Daniel Dunbar // others. 709337a6271b98c4c183f7eaad1563a75260b4f2871Daniel Dunbar if (Arg *A = Args.getLastArg(options::OPT_O_Group)) { 710c21c485b4fb58ef5d55cf3e523263dd824a2ace4Daniel Dunbar if (A->getOption().getId() == options::OPT_O4) 711337a6271b98c4c183f7eaad1563a75260b4f2871Daniel Dunbar CmdArgs.push_back("-O3"); 712337a6271b98c4c183f7eaad1563a75260b4f2871Daniel Dunbar else if (A->getValue(Args)[0] == '\0') 71320f0eacf1682e4594da9d318b5b13ed4f6d6e7e5Daniel Dunbar CmdArgs.push_back("-O2"); 7141d46033f760ba5fd266ce59fe391fac473f04f52Daniel Dunbar else 7155697aa0d75c87bafec78984048d558f8d12ca1b3Daniel Dunbar A->render(Args, CmdArgs); 7161d46033f760ba5fd266ce59fe391fac473f04f52Daniel Dunbar } 7171d46033f760ba5fd266ce59fe391fac473f04f52Daniel Dunbar 71806ef3c3e9be4923b8e29c8e267b0c56afaa14ff3Daniel Dunbar Args.AddAllArgs(CmdArgs, options::OPT_W_Group, options::OPT_pedantic_Group); 7191d46033f760ba5fd266ce59fe391fac473f04f52Daniel Dunbar Args.AddLastArg(CmdArgs, options::OPT_w); 720d573d26e1abcce24c31ece3d6f7af158db569e4cDaniel Dunbar 721d573d26e1abcce24c31ece3d6f7af158db569e4cDaniel Dunbar // Handle -{std, ansi, trigraphs} -- take the last of -{std, ansi} 722d573d26e1abcce24c31ece3d6f7af158db569e4cDaniel Dunbar // (-ansi is equivalent to -std=c89). 723d573d26e1abcce24c31ece3d6f7af158db569e4cDaniel Dunbar // 724d573d26e1abcce24c31ece3d6f7af158db569e4cDaniel Dunbar // If a std is supplied, only add -trigraphs if it follows the 725d573d26e1abcce24c31ece3d6f7af158db569e4cDaniel Dunbar // option. 726d573d26e1abcce24c31ece3d6f7af158db569e4cDaniel Dunbar if (Arg *Std = Args.getLastArg(options::OPT_std_EQ, options::OPT_ansi)) { 727d573d26e1abcce24c31ece3d6f7af158db569e4cDaniel Dunbar if (Std->getOption().matches(options::OPT_ansi)) 728d573d26e1abcce24c31ece3d6f7af158db569e4cDaniel Dunbar CmdArgs.push_back("-std=c89"); 729d573d26e1abcce24c31ece3d6f7af158db569e4cDaniel Dunbar else 730d573d26e1abcce24c31ece3d6f7af158db569e4cDaniel Dunbar Std->render(Args, CmdArgs); 731d573d26e1abcce24c31ece3d6f7af158db569e4cDaniel Dunbar 732d573d26e1abcce24c31ece3d6f7af158db569e4cDaniel Dunbar if (Arg *A = Args.getLastArg(options::OPT_trigraphs)) 733d573d26e1abcce24c31ece3d6f7af158db569e4cDaniel Dunbar if (A->getIndex() > Std->getIndex()) 734d573d26e1abcce24c31ece3d6f7af158db569e4cDaniel Dunbar A->render(Args, CmdArgs); 735a3ff202ee4fb21728e930d5d029ba4925129912cDaniel Dunbar } else { 736a3ff202ee4fb21728e930d5d029ba4925129912cDaniel Dunbar // Honor -std-default. 737a3ff202ee4fb21728e930d5d029ba4925129912cDaniel Dunbar Args.AddAllArgsTranslated(CmdArgs, options::OPT_std_default_EQ, 738a3ff202ee4fb21728e930d5d029ba4925129912cDaniel Dunbar "-std=", /*Joined=*/true); 739d573d26e1abcce24c31ece3d6f7af158db569e4cDaniel Dunbar Args.AddLastArg(CmdArgs, options::OPT_trigraphs); 740a3ff202ee4fb21728e930d5d029ba4925129912cDaniel Dunbar } 741c21c485b4fb58ef5d55cf3e523263dd824a2ace4Daniel Dunbar 7421d46033f760ba5fd266ce59fe391fac473f04f52Daniel Dunbar if (Arg *A = Args.getLastArg(options::OPT_ftemplate_depth_)) { 7431d46033f760ba5fd266ce59fe391fac473f04f52Daniel Dunbar CmdArgs.push_back("-ftemplate-depth"); 7441d46033f760ba5fd266ce59fe391fac473f04f52Daniel Dunbar CmdArgs.push_back(A->getValue(Args)); 745b488c1dac8e53206f07103d794a62a3f5012c0f4Daniel Dunbar } 746b488c1dac8e53206f07103d794a62a3f5012c0f4Daniel Dunbar 747e650c8c3bca2f58cad8ffa8aab63126d26e890cdDouglas Gregor if (Args.hasArg(options::OPT__relocatable_pch, true)) 748e650c8c3bca2f58cad8ffa8aab63126d26e890cdDouglas Gregor CmdArgs.push_back("--relocatable-pch"); 7491eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump 7508a5a9aaddb627c0884c2ed8db55cc29fdb601195David Chisnall if (Arg *A = Args.getLastArg(options::OPT_fconstant_string_class_EQ)) { 7518a5a9aaddb627c0884c2ed8db55cc29fdb601195David Chisnall CmdArgs.push_back("-fconstant-string-class"); 7528a5a9aaddb627c0884c2ed8db55cc29fdb601195David Chisnall CmdArgs.push_back(A->getValue(Args)); 7538a5a9aaddb627c0884c2ed8db55cc29fdb601195David Chisnall } 7548a5a9aaddb627c0884c2ed8db55cc29fdb601195David Chisnall 75548d1ef782c8c88066b5febf60f8f456064d7d3f0Daniel Dunbar // Forward -f options which we can pass directly. 7563aaf082689d3235937a2e56a60f90fc1b3aebfb2Daniel Dunbar Args.AddLastArg(CmdArgs, options::OPT_femit_all_decls); 7573aaf082689d3235937a2e56a60f90fc1b3aebfb2Daniel Dunbar Args.AddLastArg(CmdArgs, options::OPT_ffreestanding); 7583aaf082689d3235937a2e56a60f90fc1b3aebfb2Daniel Dunbar Args.AddLastArg(CmdArgs, options::OPT_fheinous_gnu_extensions); 7593aaf082689d3235937a2e56a60f90fc1b3aebfb2Daniel Dunbar Args.AddLastArg(CmdArgs, options::OPT_fgnu_runtime); 7603aaf082689d3235937a2e56a60f90fc1b3aebfb2Daniel Dunbar Args.AddLastArg(CmdArgs, options::OPT_flax_vector_conversions); 761fffd93f38340d4d2ca7ee78a8c91c890b2ff3fa0Douglas Gregor Args.AddLastArg(CmdArgs, options::OPT_fmessage_length_EQ); 7623aaf082689d3235937a2e56a60f90fc1b3aebfb2Daniel Dunbar Args.AddLastArg(CmdArgs, options::OPT_fms_extensions); 7633aaf082689d3235937a2e56a60f90fc1b3aebfb2Daniel Dunbar Args.AddLastArg(CmdArgs, options::OPT_fnext_runtime); 7643aaf082689d3235937a2e56a60f90fc1b3aebfb2Daniel Dunbar Args.AddLastArg(CmdArgs, options::OPT_fno_caret_diagnostics); 7653aaf082689d3235937a2e56a60f90fc1b3aebfb2Daniel Dunbar Args.AddLastArg(CmdArgs, options::OPT_fno_show_column); 7663aaf082689d3235937a2e56a60f90fc1b3aebfb2Daniel Dunbar Args.AddLastArg(CmdArgs, options::OPT_fobjc_gc_only); 7673aaf082689d3235937a2e56a60f90fc1b3aebfb2Daniel Dunbar Args.AddLastArg(CmdArgs, options::OPT_fobjc_gc); 76834e65770ad6142b033d6cec4f476ed20fb248bf3Fariborz Jahanian Args.AddLastArg(CmdArgs, options::OPT_fobjc_sender_dependent_dispatch); 7693aaf082689d3235937a2e56a60f90fc1b3aebfb2Daniel Dunbar // FIXME: Should we remove this? 7703aaf082689d3235937a2e56a60f90fc1b3aebfb2Daniel Dunbar Args.AddLastArg(CmdArgs, options::OPT_fobjc_nonfragile_abi); 771d6884a0b90091a063478ec7fa31f6d76c94e4917Daniel Dunbar Args.AddLastArg(CmdArgs, options::OPT_fobjc_tight_layout); 772182e09240a33c6f1d303deecabec6e0e9c9d109dChris Lattner Args.AddLastArg(CmdArgs, options::OPT_fdiagnostics_print_source_range_info); 7733aaf082689d3235937a2e56a60f90fc1b3aebfb2Daniel Dunbar Args.AddLastArg(CmdArgs, options::OPT_ftime_report); 7743aaf082689d3235937a2e56a60f90fc1b3aebfb2Daniel Dunbar Args.AddLastArg(CmdArgs, options::OPT_ftrapv); 7753aaf082689d3235937a2e56a60f90fc1b3aebfb2Daniel Dunbar Args.AddLastArg(CmdArgs, options::OPT_fvisibility_EQ); 7763aaf082689d3235937a2e56a60f90fc1b3aebfb2Daniel Dunbar Args.AddLastArg(CmdArgs, options::OPT_fwritable_strings); 7771d46033f760ba5fd266ce59fe391fac473f04f52Daniel Dunbar 7785345c391c65d1780a0d7b0102b7f735cc3f82732Daniel Dunbar Args.AddLastArg(CmdArgs, options::OPT_pthread); 7795345c391c65d1780a0d7b0102b7f735cc3f82732Daniel Dunbar 78045483f7a1b3e57b4603b141bee80596b2d4dd443Bill Wendling // Forward stack protector flags. 78145483f7a1b3e57b4603b141bee80596b2d4dd443Bill Wendling if (Arg *A = Args.getLastArg(options::OPT_fno_stack_protector, 78245483f7a1b3e57b4603b141bee80596b2d4dd443Bill Wendling options::OPT_fstack_protector_all, 78345483f7a1b3e57b4603b141bee80596b2d4dd443Bill Wendling options::OPT_fstack_protector)) { 78445483f7a1b3e57b4603b141bee80596b2d4dd443Bill Wendling if (A->getOption().matches(options::OPT_fno_stack_protector)) 78545483f7a1b3e57b4603b141bee80596b2d4dd443Bill Wendling CmdArgs.push_back("--stack-protector=0"); 78645483f7a1b3e57b4603b141bee80596b2d4dd443Bill Wendling else if (A->getOption().matches(options::OPT_fstack_protector)) 78745483f7a1b3e57b4603b141bee80596b2d4dd443Bill Wendling CmdArgs.push_back("--stack-protector=1"); 78845483f7a1b3e57b4603b141bee80596b2d4dd443Bill Wendling else 78945483f7a1b3e57b4603b141bee80596b2d4dd443Bill Wendling CmdArgs.push_back("--stack-protector=2"); 79045483f7a1b3e57b4603b141bee80596b2d4dd443Bill Wendling } 79145483f7a1b3e57b4603b141bee80596b2d4dd443Bill Wendling 79248d1ef782c8c88066b5febf60f8f456064d7d3f0Daniel Dunbar // Forward -f options with positive and negative forms; we translate 79348d1ef782c8c88066b5febf60f8f456064d7d3f0Daniel Dunbar // these by hand. 79448d1ef782c8c88066b5febf60f8f456064d7d3f0Daniel Dunbar 79548d1ef782c8c88066b5febf60f8f456064d7d3f0Daniel Dunbar // -fbuiltin is default, only pass non-default. 79648d1ef782c8c88066b5febf60f8f456064d7d3f0Daniel Dunbar if (!Args.hasFlag(options::OPT_fbuiltin, options::OPT_fno_builtin)) 79748d1ef782c8c88066b5febf60f8f456064d7d3f0Daniel Dunbar CmdArgs.push_back("-fbuiltin=0"); 79848d1ef782c8c88066b5febf60f8f456064d7d3f0Daniel Dunbar 7997695fba30221613b7cf31276456217c41bb90960Daniel Dunbar // -fblocks default varies depending on platform and language; only 8007695fba30221613b7cf31276456217c41bb90960Daniel Dunbar // pass if specified. 80148d1ef782c8c88066b5febf60f8f456064d7d3f0Daniel Dunbar if (Arg *A = Args.getLastArg(options::OPT_fblocks, options::OPT_fno_blocks)) { 80248d1ef782c8c88066b5febf60f8f456064d7d3f0Daniel Dunbar if (A->getOption().matches(options::OPT_fblocks)) 80348d1ef782c8c88066b5febf60f8f456064d7d3f0Daniel Dunbar CmdArgs.push_back("-fblocks"); 80448d1ef782c8c88066b5febf60f8f456064d7d3f0Daniel Dunbar else 80548d1ef782c8c88066b5febf60f8f456064d7d3f0Daniel Dunbar CmdArgs.push_back("-fblocks=0"); 80648d1ef782c8c88066b5febf60f8f456064d7d3f0Daniel Dunbar } 80748d1ef782c8c88066b5febf60f8f456064d7d3f0Daniel Dunbar 808738f8c278da5950d0d4607de2debe0bdfad64185Mike Stump // -fexceptions default varies depending on platform and language; only 809738f8c278da5950d0d4607de2debe0bdfad64185Mike Stump // pass if specified. 810738f8c278da5950d0d4607de2debe0bdfad64185Mike Stump if (Arg *A = Args.getLastArg(options::OPT_fexceptions, 811738f8c278da5950d0d4607de2debe0bdfad64185Mike Stump options::OPT_fno_exceptions)) { 812738f8c278da5950d0d4607de2debe0bdfad64185Mike Stump if (A->getOption().matches(options::OPT_fexceptions)) 813738f8c278da5950d0d4607de2debe0bdfad64185Mike Stump CmdArgs.push_back("-fexceptions"); 814738f8c278da5950d0d4607de2debe0bdfad64185Mike Stump else 815738f8c278da5950d0d4607de2debe0bdfad64185Mike Stump CmdArgs.push_back("-fexceptions=0"); 816738f8c278da5950d0d4607de2debe0bdfad64185Mike Stump } 817738f8c278da5950d0d4607de2debe0bdfad64185Mike Stump 818738f8c278da5950d0d4607de2debe0bdfad64185Mike Stump // -frtti is default, only pass non-default. 819738f8c278da5950d0d4607de2debe0bdfad64185Mike Stump if (!Args.hasFlag(options::OPT_frtti, options::OPT_fno_rtti)) 820738f8c278da5950d0d4607de2debe0bdfad64185Mike Stump CmdArgs.push_back("-frtti=0"); 821738f8c278da5950d0d4607de2debe0bdfad64185Mike Stump 8225a77973d9bc2c9cdbdb7860dcf3ac795abe258ecEli Friedman // -fsigned-char/-funsigned-char default varies depending on platform; only 8235a77973d9bc2c9cdbdb7860dcf3ac795abe258ecEli Friedman // pass if specified. 8245a77973d9bc2c9cdbdb7860dcf3ac795abe258ecEli Friedman if (Arg *A = Args.getLastArg(options::OPT_fsigned_char, 8255a77973d9bc2c9cdbdb7860dcf3ac795abe258ecEli Friedman options::OPT_funsigned_char)) { 8265a77973d9bc2c9cdbdb7860dcf3ac795abe258ecEli Friedman if (A->getOption().matches(options::OPT_fsigned_char)) 8275a77973d9bc2c9cdbdb7860dcf3ac795abe258ecEli Friedman CmdArgs.push_back("-fsigned-char"); 8285a77973d9bc2c9cdbdb7860dcf3ac795abe258ecEli Friedman else 8295a77973d9bc2c9cdbdb7860dcf3ac795abe258ecEli Friedman CmdArgs.push_back("-fsigned-char=0"); 8305a77973d9bc2c9cdbdb7860dcf3ac795abe258ecEli Friedman } 8315a77973d9bc2c9cdbdb7860dcf3ac795abe258ecEli Friedman 83282d00688525c876bf47bce414dedae9c343e67f5Daniel Dunbar // -fno-pascal-strings is default, only pass non-default. If the 83382d00688525c876bf47bce414dedae9c343e67f5Daniel Dunbar // -tool chain happened to translate to -mpascal-strings, we want to 83482d00688525c876bf47bce414dedae9c343e67f5Daniel Dunbar // -back translate here. 83582d00688525c876bf47bce414dedae9c343e67f5Daniel Dunbar // 83682d00688525c876bf47bce414dedae9c343e67f5Daniel Dunbar // FIXME: This is gross; that translation should be pulled from the 83782d00688525c876bf47bce414dedae9c343e67f5Daniel Dunbar // tool chain. 838c21c485b4fb58ef5d55cf3e523263dd824a2ace4Daniel Dunbar if (Args.hasFlag(options::OPT_fpascal_strings, 83982d00688525c876bf47bce414dedae9c343e67f5Daniel Dunbar options::OPT_fno_pascal_strings, 84082d00688525c876bf47bce414dedae9c343e67f5Daniel Dunbar false) || 84182d00688525c876bf47bce414dedae9c343e67f5Daniel Dunbar Args.hasFlag(options::OPT_mpascal_strings, 84282d00688525c876bf47bce414dedae9c343e67f5Daniel Dunbar options::OPT_mno_pascal_strings, 84382d00688525c876bf47bce414dedae9c343e67f5Daniel Dunbar false)) 84448d1ef782c8c88066b5febf60f8f456064d7d3f0Daniel Dunbar CmdArgs.push_back("-fpascal-strings"); 84548d1ef782c8c88066b5febf60f8f456064d7d3f0Daniel Dunbar 84648d1ef782c8c88066b5febf60f8f456064d7d3f0Daniel Dunbar // -fcommon is default, only pass non-default. 84748d1ef782c8c88066b5febf60f8f456064d7d3f0Daniel Dunbar if (!Args.hasFlag(options::OPT_fcommon, options::OPT_fno_common)) 84848d1ef782c8c88066b5febf60f8f456064d7d3f0Daniel Dunbar CmdArgs.push_back("-fno-common"); 84948d1ef782c8c88066b5febf60f8f456064d7d3f0Daniel Dunbar 85070d3c92820f590b10553da9c96eda24e4325ba34Daniel Dunbar // -fsigned-bitfields is default, and clang doesn't yet support 85170d3c92820f590b10553da9c96eda24e4325ba34Daniel Dunbar // --funsigned-bitfields. 8521eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump if (!Args.hasFlag(options::OPT_fsigned_bitfields, 85370d3c92820f590b10553da9c96eda24e4325ba34Daniel Dunbar options::OPT_funsigned_bitfields)) 85470d3c92820f590b10553da9c96eda24e4325ba34Daniel Dunbar D.Diag(clang::diag::warn_drv_clang_unsupported) 85570d3c92820f590b10553da9c96eda24e4325ba34Daniel Dunbar << Args.getLastArg(options::OPT_funsigned_bitfields)->getAsString(Args); 85670d3c92820f590b10553da9c96eda24e4325ba34Daniel Dunbar 85749138fc59eeac2aacd3b7e04c2642180d5baefd7Daniel Dunbar // -fdiagnostics-fixit-info is default, only pass non-default. 8581eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump if (!Args.hasFlag(options::OPT_fdiagnostics_fixit_info, 85949138fc59eeac2aacd3b7e04c2642180d5baefd7Daniel Dunbar options::OPT_fno_diagnostics_fixit_info)) 86049138fc59eeac2aacd3b7e04c2642180d5baefd7Daniel Dunbar CmdArgs.push_back("-fno-diagnostics-fixit-info"); 86149138fc59eeac2aacd3b7e04c2642180d5baefd7Daniel Dunbar 8629e820ee054fefe5422b4db3f681e567a8976747eDaniel Dunbar // Enable -fdiagnostics-show-option by default. 8631eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump if (Args.hasFlag(options::OPT_fdiagnostics_show_option, 8649e820ee054fefe5422b4db3f681e567a8976747eDaniel Dunbar options::OPT_fno_diagnostics_show_option)) 8659e820ee054fefe5422b4db3f681e567a8976747eDaniel Dunbar CmdArgs.push_back("-fdiagnostics-show-option"); 866a46c71abb1dc2f9758ad1abe3378534fe138e802Torok Edwin if (!Args.hasFlag(options::OPT_fcolor_diagnostics, 86775eb1d64784946a37fc0b27596e2d92b6cf7033bDaniel Dunbar options::OPT_fno_color_diagnostics)) 868a46c71abb1dc2f9758ad1abe3378534fe138e802Torok Edwin CmdArgs.push_back("-fno-color-diagnostics"); 86975eb1d64784946a37fc0b27596e2d92b6cf7033bDaniel Dunbar if (!Args.hasFlag(options::OPT_fshow_source_location, 87075eb1d64784946a37fc0b27596e2d92b6cf7033bDaniel Dunbar options::OPT_fno_show_source_location)) 87175eb1d64784946a37fc0b27596e2d92b6cf7033bDaniel Dunbar CmdArgs.push_back("-fno-show-source-location"); 8729e820ee054fefe5422b4db3f681e567a8976747eDaniel Dunbar 8737695fba30221613b7cf31276456217c41bb90960Daniel Dunbar // -fdollars-in-identifiers default varies depending on platform and 8747695fba30221613b7cf31276456217c41bb90960Daniel Dunbar // language; only pass if specified. 8751eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump if (Arg *A = Args.getLastArg(options::OPT_fdollars_in_identifiers, 8767695fba30221613b7cf31276456217c41bb90960Daniel Dunbar options::OPT_fno_dollars_in_identifiers)) { 8777695fba30221613b7cf31276456217c41bb90960Daniel Dunbar if (A->getOption().matches(options::OPT_fdollars_in_identifiers)) 8787695fba30221613b7cf31276456217c41bb90960Daniel Dunbar CmdArgs.push_back("-fdollars-in-identifiers=1"); 8797695fba30221613b7cf31276456217c41bb90960Daniel Dunbar else 8807695fba30221613b7cf31276456217c41bb90960Daniel Dunbar CmdArgs.push_back("-fdollars-in-identifiers=0"); 8817695fba30221613b7cf31276456217c41bb90960Daniel Dunbar } 8827695fba30221613b7cf31276456217c41bb90960Daniel Dunbar 883e027a4b2399e9b0acfe0f77220c66bbe369067eeDaniel Dunbar // -funit-at-a-time is default, and we don't support -fno-unit-at-a-time for 884e027a4b2399e9b0acfe0f77220c66bbe369067eeDaniel Dunbar // practical purposes. 8851eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump if (Arg *A = Args.getLastArg(options::OPT_funit_at_a_time, 886e027a4b2399e9b0acfe0f77220c66bbe369067eeDaniel Dunbar options::OPT_fno_unit_at_a_time)) { 887e027a4b2399e9b0acfe0f77220c66bbe369067eeDaniel Dunbar if (A->getOption().matches(options::OPT_fno_unit_at_a_time)) 888e027a4b2399e9b0acfe0f77220c66bbe369067eeDaniel Dunbar D.Diag(clang::diag::err_drv_clang_unsupported) << A->getAsString(Args); 889e027a4b2399e9b0acfe0f77220c66bbe369067eeDaniel Dunbar } 890ceb5c5b7f67a30fae305d1d19b478b623e4fbcedEli Friedman 8912ba91575905a54f712a7f64304e56002e4882499Daniel Dunbar // Default to -fno-builtin-str{cat,cpy} on Darwin for ARM. 892f84a4a469d8a45c76cb941595582a0fd3b9b15d3Daniel Dunbar // 893f84a4a469d8a45c76cb941595582a0fd3b9b15d3Daniel Dunbar // FIXME: This is disabled until clang-cc supports -fno-builtin-foo. PR4941. 894f84a4a469d8a45c76cb941595582a0fd3b9b15d3Daniel Dunbar#if 0 8952ba91575905a54f712a7f64304e56002e4882499Daniel Dunbar if (getToolChain().getTriple().getOS() == llvm::Triple::Darwin && 8962ba91575905a54f712a7f64304e56002e4882499Daniel Dunbar (getToolChain().getTriple().getArch() == llvm::Triple::arm || 8972ba91575905a54f712a7f64304e56002e4882499Daniel Dunbar getToolChain().getTriple().getArch() == llvm::Triple::thumb)) { 8982ba91575905a54f712a7f64304e56002e4882499Daniel Dunbar if (!Args.hasArg(options::OPT_fbuiltin_strcat)) 8992ba91575905a54f712a7f64304e56002e4882499Daniel Dunbar CmdArgs.push_back("-fno-builtin-strcat"); 9002ba91575905a54f712a7f64304e56002e4882499Daniel Dunbar if (!Args.hasArg(options::OPT_fbuiltin_strcpy)) 9012ba91575905a54f712a7f64304e56002e4882499Daniel Dunbar CmdArgs.push_back("-fno-builtin-strcpy"); 9022ba91575905a54f712a7f64304e56002e4882499Daniel Dunbar } 903f84a4a469d8a45c76cb941595582a0fd3b9b15d3Daniel Dunbar#endif 9042ba91575905a54f712a7f64304e56002e4882499Daniel Dunbar 9051eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump if (Arg *A = Args.getLastArg(options::OPT_traditional, 906ceb5c5b7f67a30fae305d1d19b478b623e4fbcedEli Friedman options::OPT_traditional_cpp)) 907ceb5c5b7f67a30fae305d1d19b478b623e4fbcedEli Friedman D.Diag(clang::diag::err_drv_clang_unsupported) << A->getAsString(Args); 908ceb5c5b7f67a30fae305d1d19b478b623e4fbcedEli Friedman 9091d46033f760ba5fd266ce59fe391fac473f04f52Daniel Dunbar Args.AddLastArg(CmdArgs, options::OPT_dM); 910d82df3ad430397d7f9ef511e7c5157f997c41f53Chris Lattner Args.AddLastArg(CmdArgs, options::OPT_dD); 9111d46033f760ba5fd266ce59fe391fac473f04f52Daniel Dunbar 9121d46033f760ba5fd266ce59fe391fac473f04f52Daniel Dunbar Args.AddAllArgValues(CmdArgs, options::OPT_Xclang); 913e5280286573d4fe1220cdd66e147b572a05536a8Daniel Dunbar Args.AddAllArgValues(CmdArgs, options::OPT_mllvm); 9141d46033f760ba5fd266ce59fe391fac473f04f52Daniel Dunbar 915cd8e4c44dd068956e9181381be3ee2d49a0fac52Daniel Dunbar if (Output.getType() == types::TY_Dependencies) { 916cd8e4c44dd068956e9181381be3ee2d49a0fac52Daniel Dunbar // Handled with other dependency code. 917a5a7bd0de7b6b80212095195a055a4a43f21d4b2Daniel Dunbar } else if (Output.isPipe()) { 918b488c1dac8e53206f07103d794a62a3f5012c0f4Daniel Dunbar CmdArgs.push_back("-o"); 919b488c1dac8e53206f07103d794a62a3f5012c0f4Daniel Dunbar CmdArgs.push_back("-"); 920115a79277edababaf1b26e3654044ae983197679Daniel Dunbar } else if (Output.isFilename()) { 921b488c1dac8e53206f07103d794a62a3f5012c0f4Daniel Dunbar CmdArgs.push_back("-o"); 922115a79277edababaf1b26e3654044ae983197679Daniel Dunbar CmdArgs.push_back(Output.getFilename()); 923115a79277edababaf1b26e3654044ae983197679Daniel Dunbar } else { 924115a79277edababaf1b26e3654044ae983197679Daniel Dunbar assert(Output.isNothing() && "Invalid output."); 925b488c1dac8e53206f07103d794a62a3f5012c0f4Daniel Dunbar } 926b488c1dac8e53206f07103d794a62a3f5012c0f4Daniel Dunbar 9271d46033f760ba5fd266ce59fe391fac473f04f52Daniel Dunbar for (InputInfoList::const_iterator 9281d46033f760ba5fd266ce59fe391fac473f04f52Daniel Dunbar it = Inputs.begin(), ie = Inputs.end(); it != ie; ++it) { 9291d46033f760ba5fd266ce59fe391fac473f04f52Daniel Dunbar const InputInfo &II = *it; 9301d46033f760ba5fd266ce59fe391fac473f04f52Daniel Dunbar CmdArgs.push_back("-x"); 9311d46033f760ba5fd266ce59fe391fac473f04f52Daniel Dunbar CmdArgs.push_back(types::getTypeName(II.getType())); 9321d46033f760ba5fd266ce59fe391fac473f04f52Daniel Dunbar if (II.isPipe()) 9331d46033f760ba5fd266ce59fe391fac473f04f52Daniel Dunbar CmdArgs.push_back("-"); 934115a79277edababaf1b26e3654044ae983197679Daniel Dunbar else if (II.isFilename()) 935115a79277edababaf1b26e3654044ae983197679Daniel Dunbar CmdArgs.push_back(II.getFilename()); 9361d46033f760ba5fd266ce59fe391fac473f04f52Daniel Dunbar else 937115a79277edababaf1b26e3654044ae983197679Daniel Dunbar II.getInputArg().renderAsInput(Args, CmdArgs); 9381d46033f760ba5fd266ce59fe391fac473f04f52Daniel Dunbar } 939c21c485b4fb58ef5d55cf3e523263dd824a2ace4Daniel Dunbar 940c21c485b4fb58ef5d55cf3e523263dd824a2ace4Daniel Dunbar const char *Exec = 9415ed34f4c58b6ad4e21038d713c1fae31a6146ff5Daniel Dunbar Args.MakeArgString(getToolChain().GetProgramPath(C, "clang-cc")); 942cae087e164e94e4286c11bf694dd0ff88f295302Daniel Dunbar Dest.addCommand(new Command(JA, Exec, CmdArgs)); 943a880db0b0fc028abf754c290d921d809eec0518aDaniel Dunbar 9445c1aaafbd6dd25a99ca1960e1c3c98aeefe9d728Daniel Dunbar // Explicitly warn that these options are unsupported, even though 9455c1aaafbd6dd25a99ca1960e1c3c98aeefe9d728Daniel Dunbar // we are allowing compilation to continue. 9465c1aaafbd6dd25a99ca1960e1c3c98aeefe9d728Daniel Dunbar // FIXME: Use iterator. 947c21c485b4fb58ef5d55cf3e523263dd824a2ace4Daniel Dunbar for (ArgList::const_iterator 9485c1aaafbd6dd25a99ca1960e1c3c98aeefe9d728Daniel Dunbar it = Args.begin(), ie = Args.end(); it != ie; ++it) { 9495c1aaafbd6dd25a99ca1960e1c3c98aeefe9d728Daniel Dunbar const Arg *A = *it; 9505c1aaafbd6dd25a99ca1960e1c3c98aeefe9d728Daniel Dunbar if (A->getOption().matches(options::OPT_pg)) { 9515c1aaafbd6dd25a99ca1960e1c3c98aeefe9d728Daniel Dunbar A->claim(); 952c21c485b4fb58ef5d55cf3e523263dd824a2ace4Daniel Dunbar D.Diag(clang::diag::warn_drv_clang_unsupported) 9535c1aaafbd6dd25a99ca1960e1c3c98aeefe9d728Daniel Dunbar << A->getAsString(Args); 9545c1aaafbd6dd25a99ca1960e1c3c98aeefe9d728Daniel Dunbar } 9555c1aaafbd6dd25a99ca1960e1c3c98aeefe9d728Daniel Dunbar } 9565c1aaafbd6dd25a99ca1960e1c3c98aeefe9d728Daniel Dunbar 95768fb469aeb19144403e703b825854d08353c8eeaDaniel Dunbar // Claim some arguments which clang supports automatically. 95868fb469aeb19144403e703b825854d08353c8eeaDaniel Dunbar 95968fb469aeb19144403e703b825854d08353c8eeaDaniel Dunbar // -fpch-preprocess is used with gcc to add a special marker in the 96068fb469aeb19144403e703b825854d08353c8eeaDaniel Dunbar // -output to include the PCH file. Clang's PTH solution is 96168fb469aeb19144403e703b825854d08353c8eeaDaniel Dunbar // -completely transparent, so we do not need to deal with it at 96268fb469aeb19144403e703b825854d08353c8eeaDaniel Dunbar // -all. 96368fb469aeb19144403e703b825854d08353c8eeaDaniel Dunbar Args.ClaimAllArgs(options::OPT_fpch_preprocess); 964c21c485b4fb58ef5d55cf3e523263dd824a2ace4Daniel Dunbar 965a880db0b0fc028abf754c290d921d809eec0518aDaniel Dunbar // Claim some arguments which clang doesn't support, but we don't 966a880db0b0fc028abf754c290d921d809eec0518aDaniel Dunbar // care to warn the user about. 967c21c485b4fb58ef5d55cf3e523263dd824a2ace4Daniel Dunbar 968a880db0b0fc028abf754c290d921d809eec0518aDaniel Dunbar // FIXME: Use iterator. 969c21c485b4fb58ef5d55cf3e523263dd824a2ace4Daniel Dunbar for (ArgList::const_iterator 970a880db0b0fc028abf754c290d921d809eec0518aDaniel Dunbar it = Args.begin(), ie = Args.end(); it != ie; ++it) { 971a880db0b0fc028abf754c290d921d809eec0518aDaniel Dunbar const Arg *A = *it; 97206ef3c3e9be4923b8e29c8e267b0c56afaa14ff3Daniel Dunbar if (A->getOption().matches(options::OPT_clang_ignored_f_Group) || 97316fd3a9f5159b74bfdd65cf290b4bd091088de91Daniel Dunbar A->getOption().matches(options::OPT_clang_ignored_m_Group)) 974a880db0b0fc028abf754c290d921d809eec0518aDaniel Dunbar A->claim(); 975a880db0b0fc028abf754c290d921d809eec0518aDaniel Dunbar } 97647ac7d27c44bd64a7d0fc03d4babc196cf2b8230Daniel Dunbar} 97747ac7d27c44bd64a7d0fc03d4babc196cf2b8230Daniel Dunbar 978b488c1dac8e53206f07103d794a62a3f5012c0f4Daniel Dunbarvoid gcc::Common::ConstructJob(Compilation &C, const JobAction &JA, 979b488c1dac8e53206f07103d794a62a3f5012c0f4Daniel Dunbar Job &Dest, 980b488c1dac8e53206f07103d794a62a3f5012c0f4Daniel Dunbar const InputInfo &Output, 981b488c1dac8e53206f07103d794a62a3f5012c0f4Daniel Dunbar const InputInfoList &Inputs, 9821d46033f760ba5fd266ce59fe391fac473f04f52Daniel Dunbar const ArgList &Args, 983b488c1dac8e53206f07103d794a62a3f5012c0f4Daniel Dunbar const char *LinkingOutput) const { 984a8304f67291b0182fb64f3afc621615288dd1d31Daniel Dunbar const Driver &D = getToolChain().getHost().getDriver(); 985b488c1dac8e53206f07103d794a62a3f5012c0f4Daniel Dunbar ArgStringList CmdArgs; 986b488c1dac8e53206f07103d794a62a3f5012c0f4Daniel Dunbar 987c21c485b4fb58ef5d55cf3e523263dd824a2ace4Daniel Dunbar for (ArgList::const_iterator 9881d46033f760ba5fd266ce59fe391fac473f04f52Daniel Dunbar it = Args.begin(), ie = Args.end(); it != ie; ++it) { 989b488c1dac8e53206f07103d794a62a3f5012c0f4Daniel Dunbar Arg *A = *it; 9907587719c40ebf02bf11e5e66c30bd20e98edebc2Daniel Dunbar if (A->getOption().hasForwardToGCC()) { 9917587719c40ebf02bf11e5e66c30bd20e98edebc2Daniel Dunbar // It is unfortunate that we have to claim here, as this means 9927587719c40ebf02bf11e5e66c30bd20e98edebc2Daniel Dunbar // we will basically never report anything interesting for 9936ecc7a993f939c5255c36c7c0d965fb9c1543f2aDaniel Dunbar // platforms using a generic gcc, even if we are just using gcc 9946ecc7a993f939c5255c36c7c0d965fb9c1543f2aDaniel Dunbar // to get to the assembler. 9957587719c40ebf02bf11e5e66c30bd20e98edebc2Daniel Dunbar A->claim(); 9961d46033f760ba5fd266ce59fe391fac473f04f52Daniel Dunbar A->render(Args, CmdArgs); 9977587719c40ebf02bf11e5e66c30bd20e98edebc2Daniel Dunbar } 998b488c1dac8e53206f07103d794a62a3f5012c0f4Daniel Dunbar } 999c21c485b4fb58ef5d55cf3e523263dd824a2ace4Daniel Dunbar 1000b488c1dac8e53206f07103d794a62a3f5012c0f4Daniel Dunbar RenderExtraToolArgs(CmdArgs); 1001b488c1dac8e53206f07103d794a62a3f5012c0f4Daniel Dunbar 1002b488c1dac8e53206f07103d794a62a3f5012c0f4Daniel Dunbar // If using a driver driver, force the arch. 10037cfe31a713d8fcfc2a1328e8fbd8efdeb0aec51bDaniel Dunbar const std::string &Arch = getToolChain().getArchName(); 1004b488c1dac8e53206f07103d794a62a3f5012c0f4Daniel Dunbar if (getToolChain().getHost().useDriverDriver()) { 1005b488c1dac8e53206f07103d794a62a3f5012c0f4Daniel Dunbar CmdArgs.push_back("-arch"); 1006bf54a06f9b771c2a2730cc63eb89bce0522515b5Daniel Dunbar 1007bf54a06f9b771c2a2730cc63eb89bce0522515b5Daniel Dunbar // FIXME: Remove these special cases. 10087cfe31a713d8fcfc2a1328e8fbd8efdeb0aec51bDaniel Dunbar if (Arch == "powerpc") 10097cfe31a713d8fcfc2a1328e8fbd8efdeb0aec51bDaniel Dunbar CmdArgs.push_back("ppc"); 10107cfe31a713d8fcfc2a1328e8fbd8efdeb0aec51bDaniel Dunbar else if (Arch == "powerpc64") 10117cfe31a713d8fcfc2a1328e8fbd8efdeb0aec51bDaniel Dunbar CmdArgs.push_back("ppc64"); 10127cfe31a713d8fcfc2a1328e8fbd8efdeb0aec51bDaniel Dunbar else 1013881376467c46c5c6cc16fa6790271c2c22e1d4f1Daniel Dunbar CmdArgs.push_back(Args.MakeArgString(Arch)); 1014b488c1dac8e53206f07103d794a62a3f5012c0f4Daniel Dunbar } 1015b488c1dac8e53206f07103d794a62a3f5012c0f4Daniel Dunbar 10166ecc7a993f939c5255c36c7c0d965fb9c1543f2aDaniel Dunbar // Try to force gcc to match the tool chain we want, if we recognize 10176ecc7a993f939c5255c36c7c0d965fb9c1543f2aDaniel Dunbar // the arch. 10187cfe31a713d8fcfc2a1328e8fbd8efdeb0aec51bDaniel Dunbar // 10197cfe31a713d8fcfc2a1328e8fbd8efdeb0aec51bDaniel Dunbar // FIXME: The triple class should directly provide the information we want 10207cfe31a713d8fcfc2a1328e8fbd8efdeb0aec51bDaniel Dunbar // here. 10217cfe31a713d8fcfc2a1328e8fbd8efdeb0aec51bDaniel Dunbar if (Arch == "i386" || Arch == "powerpc") 10226ecc7a993f939c5255c36c7c0d965fb9c1543f2aDaniel Dunbar CmdArgs.push_back("-m32"); 10237cfe31a713d8fcfc2a1328e8fbd8efdeb0aec51bDaniel Dunbar else if (Arch == "x86_64" || Arch == "powerpc64") 10246ecc7a993f939c5255c36c7c0d965fb9c1543f2aDaniel Dunbar CmdArgs.push_back("-m64"); 10256ecc7a993f939c5255c36c7c0d965fb9c1543f2aDaniel Dunbar 1026b488c1dac8e53206f07103d794a62a3f5012c0f4Daniel Dunbar if (Output.isPipe()) { 1027b488c1dac8e53206f07103d794a62a3f5012c0f4Daniel Dunbar CmdArgs.push_back("-o"); 1028b488c1dac8e53206f07103d794a62a3f5012c0f4Daniel Dunbar CmdArgs.push_back("-"); 1029115a79277edababaf1b26e3654044ae983197679Daniel Dunbar } else if (Output.isFilename()) { 1030b488c1dac8e53206f07103d794a62a3f5012c0f4Daniel Dunbar CmdArgs.push_back("-o"); 1031115a79277edababaf1b26e3654044ae983197679Daniel Dunbar CmdArgs.push_back(Output.getFilename()); 1032115a79277edababaf1b26e3654044ae983197679Daniel Dunbar } else { 1033115a79277edababaf1b26e3654044ae983197679Daniel Dunbar assert(Output.isNothing() && "Unexpected output"); 1034b488c1dac8e53206f07103d794a62a3f5012c0f4Daniel Dunbar CmdArgs.push_back("-fsyntax-only"); 1035115a79277edababaf1b26e3654044ae983197679Daniel Dunbar } 1036b488c1dac8e53206f07103d794a62a3f5012c0f4Daniel Dunbar 1037b488c1dac8e53206f07103d794a62a3f5012c0f4Daniel Dunbar 1038b488c1dac8e53206f07103d794a62a3f5012c0f4Daniel Dunbar // Only pass -x if gcc will understand it; otherwise hope gcc 1039b488c1dac8e53206f07103d794a62a3f5012c0f4Daniel Dunbar // understands the suffix correctly. The main use case this would go 1040b488c1dac8e53206f07103d794a62a3f5012c0f4Daniel Dunbar // wrong in is for linker inputs if they happened to have an odd 1041b488c1dac8e53206f07103d794a62a3f5012c0f4Daniel Dunbar // suffix; really the only way to get this to happen is a command 1042b488c1dac8e53206f07103d794a62a3f5012c0f4Daniel Dunbar // like '-x foobar a.c' which will treat a.c like a linker input. 1043b488c1dac8e53206f07103d794a62a3f5012c0f4Daniel Dunbar // 1044b488c1dac8e53206f07103d794a62a3f5012c0f4Daniel Dunbar // FIXME: For the linker case specifically, can we safely convert 1045b488c1dac8e53206f07103d794a62a3f5012c0f4Daniel Dunbar // inputs into '-Wl,' options? 1046b488c1dac8e53206f07103d794a62a3f5012c0f4Daniel Dunbar for (InputInfoList::const_iterator 1047b488c1dac8e53206f07103d794a62a3f5012c0f4Daniel Dunbar it = Inputs.begin(), ie = Inputs.end(); it != ie; ++it) { 1048b488c1dac8e53206f07103d794a62a3f5012c0f4Daniel Dunbar const InputInfo &II = *it; 1049a8304f67291b0182fb64f3afc621615288dd1d31Daniel Dunbar 10505915fbf310e171c4cd3c2af05e9de360c0fa988aDaniel Dunbar // Don't try to pass LLVM or AST inputs to a generic gcc. 1051a8304f67291b0182fb64f3afc621615288dd1d31Daniel Dunbar if (II.getType() == types::TY_LLVMBC) 1052a8304f67291b0182fb64f3afc621615288dd1d31Daniel Dunbar D.Diag(clang::diag::err_drv_no_linker_llvm_support) 1053881376467c46c5c6cc16fa6790271c2c22e1d4f1Daniel Dunbar << getToolChain().getTripleString(); 10545915fbf310e171c4cd3c2af05e9de360c0fa988aDaniel Dunbar else if (II.getType() == types::TY_AST) 10555915fbf310e171c4cd3c2af05e9de360c0fa988aDaniel Dunbar D.Diag(clang::diag::err_drv_no_ast_support) 1056881376467c46c5c6cc16fa6790271c2c22e1d4f1Daniel Dunbar << getToolChain().getTripleString(); 1057a8304f67291b0182fb64f3afc621615288dd1d31Daniel Dunbar 1058b488c1dac8e53206f07103d794a62a3f5012c0f4Daniel Dunbar if (types::canTypeBeUserSpecified(II.getType())) { 1059b488c1dac8e53206f07103d794a62a3f5012c0f4Daniel Dunbar CmdArgs.push_back("-x"); 1060b488c1dac8e53206f07103d794a62a3f5012c0f4Daniel Dunbar CmdArgs.push_back(types::getTypeName(II.getType())); 1061b488c1dac8e53206f07103d794a62a3f5012c0f4Daniel Dunbar } 1062b488c1dac8e53206f07103d794a62a3f5012c0f4Daniel Dunbar 1063b488c1dac8e53206f07103d794a62a3f5012c0f4Daniel Dunbar if (II.isPipe()) 1064b488c1dac8e53206f07103d794a62a3f5012c0f4Daniel Dunbar CmdArgs.push_back("-"); 1065115a79277edababaf1b26e3654044ae983197679Daniel Dunbar else if (II.isFilename()) 1066115a79277edababaf1b26e3654044ae983197679Daniel Dunbar CmdArgs.push_back(II.getFilename()); 1067b488c1dac8e53206f07103d794a62a3f5012c0f4Daniel Dunbar else 1068115a79277edababaf1b26e3654044ae983197679Daniel Dunbar // Don't render as input, we need gcc to do the translations. 1069115a79277edababaf1b26e3654044ae983197679Daniel Dunbar II.getInputArg().render(Args, CmdArgs); 1070b488c1dac8e53206f07103d794a62a3f5012c0f4Daniel Dunbar } 1071b488c1dac8e53206f07103d794a62a3f5012c0f4Daniel Dunbar 1072c21c485b4fb58ef5d55cf3e523263dd824a2ace4Daniel Dunbar const char *GCCName = 107378d8a089c8f124ba6f47bb37e2c4a36986f60e23Daniel Dunbar getToolChain().getHost().getDriver().CCCGenericGCCName.c_str(); 1074c21c485b4fb58ef5d55cf3e523263dd824a2ace4Daniel Dunbar const char *Exec = 10755ed34f4c58b6ad4e21038d713c1fae31a6146ff5Daniel Dunbar Args.MakeArgString(getToolChain().GetProgramPath(C, GCCName)); 1076cae087e164e94e4286c11bf694dd0ff88f295302Daniel Dunbar Dest.addCommand(new Command(JA, Exec, CmdArgs)); 107747ac7d27c44bd64a7d0fc03d4babc196cf2b8230Daniel Dunbar} 107847ac7d27c44bd64a7d0fc03d4babc196cf2b8230Daniel Dunbar 1079b488c1dac8e53206f07103d794a62a3f5012c0f4Daniel Dunbarvoid gcc::Preprocess::RenderExtraToolArgs(ArgStringList &CmdArgs) const { 1080b488c1dac8e53206f07103d794a62a3f5012c0f4Daniel Dunbar CmdArgs.push_back("-E"); 108147ac7d27c44bd64a7d0fc03d4babc196cf2b8230Daniel Dunbar} 108247ac7d27c44bd64a7d0fc03d4babc196cf2b8230Daniel Dunbar 1083b488c1dac8e53206f07103d794a62a3f5012c0f4Daniel Dunbarvoid gcc::Precompile::RenderExtraToolArgs(ArgStringList &CmdArgs) const { 1084b488c1dac8e53206f07103d794a62a3f5012c0f4Daniel Dunbar // The type is good enough. 108547ac7d27c44bd64a7d0fc03d4babc196cf2b8230Daniel Dunbar} 108647ac7d27c44bd64a7d0fc03d4babc196cf2b8230Daniel Dunbar 1087b488c1dac8e53206f07103d794a62a3f5012c0f4Daniel Dunbarvoid gcc::Compile::RenderExtraToolArgs(ArgStringList &CmdArgs) const { 1088b488c1dac8e53206f07103d794a62a3f5012c0f4Daniel Dunbar CmdArgs.push_back("-S"); 108947ac7d27c44bd64a7d0fc03d4babc196cf2b8230Daniel Dunbar} 109047ac7d27c44bd64a7d0fc03d4babc196cf2b8230Daniel Dunbar 1091b488c1dac8e53206f07103d794a62a3f5012c0f4Daniel Dunbarvoid gcc::Assemble::RenderExtraToolArgs(ArgStringList &CmdArgs) const { 1092b488c1dac8e53206f07103d794a62a3f5012c0f4Daniel Dunbar CmdArgs.push_back("-c"); 1093b488c1dac8e53206f07103d794a62a3f5012c0f4Daniel Dunbar} 109447ac7d27c44bd64a7d0fc03d4babc196cf2b8230Daniel Dunbar 1095b488c1dac8e53206f07103d794a62a3f5012c0f4Daniel Dunbarvoid gcc::Link::RenderExtraToolArgs(ArgStringList &CmdArgs) const { 1096b488c1dac8e53206f07103d794a62a3f5012c0f4Daniel Dunbar // The types are (hopefully) good enough. 109747ac7d27c44bd64a7d0fc03d4babc196cf2b8230Daniel Dunbar} 1098b488c1dac8e53206f07103d794a62a3f5012c0f4Daniel Dunbar 109940f1265ebd42ece3e7f7917319b56012e8e2bce2Daniel Dunbarconst char *darwin::CC1::getCC1Name(types::ID Type) const { 110040f1265ebd42ece3e7f7917319b56012e8e2bce2Daniel Dunbar switch (Type) { 110140f1265ebd42ece3e7f7917319b56012e8e2bce2Daniel Dunbar default: 110240f1265ebd42ece3e7f7917319b56012e8e2bce2Daniel Dunbar assert(0 && "Unexpected type for Darwin CC1 tool."); 110340f1265ebd42ece3e7f7917319b56012e8e2bce2Daniel Dunbar case types::TY_Asm: 110440f1265ebd42ece3e7f7917319b56012e8e2bce2Daniel Dunbar case types::TY_C: case types::TY_CHeader: 110540f1265ebd42ece3e7f7917319b56012e8e2bce2Daniel Dunbar case types::TY_PP_C: case types::TY_PP_CHeader: 110640f1265ebd42ece3e7f7917319b56012e8e2bce2Daniel Dunbar return "cc1"; 110740f1265ebd42ece3e7f7917319b56012e8e2bce2Daniel Dunbar case types::TY_ObjC: case types::TY_ObjCHeader: 110840f1265ebd42ece3e7f7917319b56012e8e2bce2Daniel Dunbar case types::TY_PP_ObjC: case types::TY_PP_ObjCHeader: 110940f1265ebd42ece3e7f7917319b56012e8e2bce2Daniel Dunbar return "cc1obj"; 111040f1265ebd42ece3e7f7917319b56012e8e2bce2Daniel Dunbar case types::TY_CXX: case types::TY_CXXHeader: 111140f1265ebd42ece3e7f7917319b56012e8e2bce2Daniel Dunbar case types::TY_PP_CXX: case types::TY_PP_CXXHeader: 111240f1265ebd42ece3e7f7917319b56012e8e2bce2Daniel Dunbar return "cc1plus"; 111340f1265ebd42ece3e7f7917319b56012e8e2bce2Daniel Dunbar case types::TY_ObjCXX: case types::TY_ObjCXXHeader: 111440f1265ebd42ece3e7f7917319b56012e8e2bce2Daniel Dunbar case types::TY_PP_ObjCXX: case types::TY_PP_ObjCXXHeader: 111540f1265ebd42ece3e7f7917319b56012e8e2bce2Daniel Dunbar return "cc1objplus"; 111640f1265ebd42ece3e7f7917319b56012e8e2bce2Daniel Dunbar } 111740f1265ebd42ece3e7f7917319b56012e8e2bce2Daniel Dunbar} 111840f1265ebd42ece3e7f7917319b56012e8e2bce2Daniel Dunbar 1119c21c485b4fb58ef5d55cf3e523263dd824a2ace4Daniel Dunbarconst char *darwin::CC1::getBaseInputName(const ArgList &Args, 1120a5a7bd0de7b6b80212095195a055a4a43f21d4b2Daniel Dunbar const InputInfoList &Inputs) { 1121a3ec60e0cf2a1916f479288998d31bd980b1a306Daniel Dunbar llvm::sys::Path P(Inputs[0].getBaseInput()); 1122881376467c46c5c6cc16fa6790271c2c22e1d4f1Daniel Dunbar return Args.MakeArgString(P.getLast()); 1123a3ec60e0cf2a1916f479288998d31bd980b1a306Daniel Dunbar} 1124a3ec60e0cf2a1916f479288998d31bd980b1a306Daniel Dunbar 1125c21c485b4fb58ef5d55cf3e523263dd824a2ace4Daniel Dunbarconst char *darwin::CC1::getBaseInputStem(const ArgList &Args, 1126a5a7bd0de7b6b80212095195a055a4a43f21d4b2Daniel Dunbar const InputInfoList &Inputs) { 1127a3ec60e0cf2a1916f479288998d31bd980b1a306Daniel Dunbar const char *Str = getBaseInputName(Args, Inputs); 1128a3ec60e0cf2a1916f479288998d31bd980b1a306Daniel Dunbar 1129a3ec60e0cf2a1916f479288998d31bd980b1a306Daniel Dunbar if (const char *End = strchr(Str, '.')) 1130881376467c46c5c6cc16fa6790271c2c22e1d4f1Daniel Dunbar return Args.MakeArgString(std::string(Str, End)); 1131a3ec60e0cf2a1916f479288998d31bd980b1a306Daniel Dunbar 1132a3ec60e0cf2a1916f479288998d31bd980b1a306Daniel Dunbar return Str; 1133a3ec60e0cf2a1916f479288998d31bd980b1a306Daniel Dunbar} 1134a3ec60e0cf2a1916f479288998d31bd980b1a306Daniel Dunbar 1135a3ec60e0cf2a1916f479288998d31bd980b1a306Daniel Dunbarconst char * 1136c21c485b4fb58ef5d55cf3e523263dd824a2ace4Daniel Dunbardarwin::CC1::getDependencyFileName(const ArgList &Args, 1137a5a7bd0de7b6b80212095195a055a4a43f21d4b2Daniel Dunbar const InputInfoList &Inputs) { 1138a3ec60e0cf2a1916f479288998d31bd980b1a306Daniel Dunbar // FIXME: Think about this more. 1139a3ec60e0cf2a1916f479288998d31bd980b1a306Daniel Dunbar std::string Res; 1140a3ec60e0cf2a1916f479288998d31bd980b1a306Daniel Dunbar 1141a3ec60e0cf2a1916f479288998d31bd980b1a306Daniel Dunbar if (Arg *OutputOpt = Args.getLastArg(options::OPT_o)) { 1142a3ec60e0cf2a1916f479288998d31bd980b1a306Daniel Dunbar std::string Str(OutputOpt->getValue(Args)); 1143c21c485b4fb58ef5d55cf3e523263dd824a2ace4Daniel Dunbar 1144a3ec60e0cf2a1916f479288998d31bd980b1a306Daniel Dunbar Res = Str.substr(0, Str.rfind('.')); 1145a3ec60e0cf2a1916f479288998d31bd980b1a306Daniel Dunbar } else 1146a5a7bd0de7b6b80212095195a055a4a43f21d4b2Daniel Dunbar Res = darwin::CC1::getBaseInputStem(Args, Inputs); 1147a3ec60e0cf2a1916f479288998d31bd980b1a306Daniel Dunbar 1148881376467c46c5c6cc16fa6790271c2c22e1d4f1Daniel Dunbar return Args.MakeArgString(Res + ".d"); 1149a3ec60e0cf2a1916f479288998d31bd980b1a306Daniel Dunbar} 1150a3ec60e0cf2a1916f479288998d31bd980b1a306Daniel Dunbar 1151c21c485b4fb58ef5d55cf3e523263dd824a2ace4Daniel Dunbarvoid darwin::CC1::AddCC1Args(const ArgList &Args, 1152a3ec60e0cf2a1916f479288998d31bd980b1a306Daniel Dunbar ArgStringList &CmdArgs) const { 1153e2fd66418eca3d70cf6b62087d745d0c5181db69Daniel Dunbar const Driver &D = getToolChain().getHost().getDriver(); 1154e2fd66418eca3d70cf6b62087d745d0c5181db69Daniel Dunbar 1155e2fd66418eca3d70cf6b62087d745d0c5181db69Daniel Dunbar CheckCodeGenerationOptions(D, Args); 1156e2fd66418eca3d70cf6b62087d745d0c5181db69Daniel Dunbar 1157a3ec60e0cf2a1916f479288998d31bd980b1a306Daniel Dunbar // Derived from cc1 spec. 1158a3ec60e0cf2a1916f479288998d31bd980b1a306Daniel Dunbar if (!Args.hasArg(options::OPT_mkernel) && !Args.hasArg(options::OPT_static) && 1159a3ec60e0cf2a1916f479288998d31bd980b1a306Daniel Dunbar !Args.hasArg(options::OPT_mdynamic_no_pic)) 1160a3ec60e0cf2a1916f479288998d31bd980b1a306Daniel Dunbar CmdArgs.push_back("-fPIC"); 1161a3ec60e0cf2a1916f479288998d31bd980b1a306Daniel Dunbar 11622ba91575905a54f712a7f64304e56002e4882499Daniel Dunbar if (getToolChain().getTriple().getArch() == llvm::Triple::arm || 11632ba91575905a54f712a7f64304e56002e4882499Daniel Dunbar getToolChain().getTriple().getArch() == llvm::Triple::thumb) { 11642ba91575905a54f712a7f64304e56002e4882499Daniel Dunbar if (!Args.hasArg(options::OPT_fbuiltin_strcat)) 11652ba91575905a54f712a7f64304e56002e4882499Daniel Dunbar CmdArgs.push_back("-fno-builtin-strcat"); 11662ba91575905a54f712a7f64304e56002e4882499Daniel Dunbar if (!Args.hasArg(options::OPT_fbuiltin_strcpy)) 11672ba91575905a54f712a7f64304e56002e4882499Daniel Dunbar CmdArgs.push_back("-fno-builtin-strcpy"); 11682ba91575905a54f712a7f64304e56002e4882499Daniel Dunbar } 11692ba91575905a54f712a7f64304e56002e4882499Daniel Dunbar 1170a3ec60e0cf2a1916f479288998d31bd980b1a306Daniel Dunbar // gcc has some code here to deal with when no -mmacosx-version-min 1171a3ec60e0cf2a1916f479288998d31bd980b1a306Daniel Dunbar // and no -miphoneos-version-min is present, but this never happens 1172a3ec60e0cf2a1916f479288998d31bd980b1a306Daniel Dunbar // due to tool chain specific argument translation. 1173a3ec60e0cf2a1916f479288998d31bd980b1a306Daniel Dunbar 1174a3ec60e0cf2a1916f479288998d31bd980b1a306Daniel Dunbar if (Args.hasArg(options::OPT_g_Flag) && 1175a3ec60e0cf2a1916f479288998d31bd980b1a306Daniel Dunbar !Args.hasArg(options::OPT_fno_eliminate_unused_debug_symbols)) 1176a3ec60e0cf2a1916f479288998d31bd980b1a306Daniel Dunbar CmdArgs.push_back("-feliminate-unused-debug-symbols"); 1177a3ec60e0cf2a1916f479288998d31bd980b1a306Daniel Dunbar} 1178a3ec60e0cf2a1916f479288998d31bd980b1a306Daniel Dunbar 1179a3ec60e0cf2a1916f479288998d31bd980b1a306Daniel Dunbarvoid darwin::CC1::AddCC1OptionsArgs(const ArgList &Args, ArgStringList &CmdArgs, 1180a3ec60e0cf2a1916f479288998d31bd980b1a306Daniel Dunbar const InputInfoList &Inputs, 1181a3ec60e0cf2a1916f479288998d31bd980b1a306Daniel Dunbar const ArgStringList &OutputArgs) const { 1182a3ec60e0cf2a1916f479288998d31bd980b1a306Daniel Dunbar const Driver &D = getToolChain().getHost().getDriver(); 1183a3ec60e0cf2a1916f479288998d31bd980b1a306Daniel Dunbar 1184a3ec60e0cf2a1916f479288998d31bd980b1a306Daniel Dunbar // Derived from cc1_options spec. 1185a3ec60e0cf2a1916f479288998d31bd980b1a306Daniel Dunbar if (Args.hasArg(options::OPT_fast) || 1186a3ec60e0cf2a1916f479288998d31bd980b1a306Daniel Dunbar Args.hasArg(options::OPT_fastf) || 1187a3ec60e0cf2a1916f479288998d31bd980b1a306Daniel Dunbar Args.hasArg(options::OPT_fastcp)) 1188a3ec60e0cf2a1916f479288998d31bd980b1a306Daniel Dunbar CmdArgs.push_back("-O3"); 1189c21c485b4fb58ef5d55cf3e523263dd824a2ace4Daniel Dunbar 1190a3ec60e0cf2a1916f479288998d31bd980b1a306Daniel Dunbar if (Arg *A = Args.getLastArg(options::OPT_pg)) 1191a3ec60e0cf2a1916f479288998d31bd980b1a306Daniel Dunbar if (Args.hasArg(options::OPT_fomit_frame_pointer)) 1192a3ec60e0cf2a1916f479288998d31bd980b1a306Daniel Dunbar D.Diag(clang::diag::err_drv_argument_not_allowed_with) 1193a3ec60e0cf2a1916f479288998d31bd980b1a306Daniel Dunbar << A->getAsString(Args) << "-fomit-frame-pointer"; 1194a3ec60e0cf2a1916f479288998d31bd980b1a306Daniel Dunbar 1195a3ec60e0cf2a1916f479288998d31bd980b1a306Daniel Dunbar AddCC1Args(Args, CmdArgs); 1196a3ec60e0cf2a1916f479288998d31bd980b1a306Daniel Dunbar 1197a3ec60e0cf2a1916f479288998d31bd980b1a306Daniel Dunbar if (!Args.hasArg(options::OPT_Q)) 1198a3ec60e0cf2a1916f479288998d31bd980b1a306Daniel Dunbar CmdArgs.push_back("-quiet"); 1199a3ec60e0cf2a1916f479288998d31bd980b1a306Daniel Dunbar 1200a3ec60e0cf2a1916f479288998d31bd980b1a306Daniel Dunbar CmdArgs.push_back("-dumpbase"); 1201a5a7bd0de7b6b80212095195a055a4a43f21d4b2Daniel Dunbar CmdArgs.push_back(darwin::CC1::getBaseInputName(Args, Inputs)); 1202a3ec60e0cf2a1916f479288998d31bd980b1a306Daniel Dunbar 1203a3ec60e0cf2a1916f479288998d31bd980b1a306Daniel Dunbar Args.AddAllArgs(CmdArgs, options::OPT_d_Group); 1204a3ec60e0cf2a1916f479288998d31bd980b1a306Daniel Dunbar 1205a3ec60e0cf2a1916f479288998d31bd980b1a306Daniel Dunbar Args.AddAllArgs(CmdArgs, options::OPT_m_Group); 1206a3ec60e0cf2a1916f479288998d31bd980b1a306Daniel Dunbar Args.AddAllArgs(CmdArgs, options::OPT_a_Group); 1207a3ec60e0cf2a1916f479288998d31bd980b1a306Daniel Dunbar 1208a3ec60e0cf2a1916f479288998d31bd980b1a306Daniel Dunbar // FIXME: The goal is to use the user provided -o if that is our 1209a3ec60e0cf2a1916f479288998d31bd980b1a306Daniel Dunbar // final output, otherwise to drive from the original input 1210a3ec60e0cf2a1916f479288998d31bd980b1a306Daniel Dunbar // name. Find a clean way to go about this. 1211a3ec60e0cf2a1916f479288998d31bd980b1a306Daniel Dunbar if ((Args.hasArg(options::OPT_c) || Args.hasArg(options::OPT_S)) && 1212a3ec60e0cf2a1916f479288998d31bd980b1a306Daniel Dunbar Args.hasArg(options::OPT_o)) { 1213a3ec60e0cf2a1916f479288998d31bd980b1a306Daniel Dunbar Arg *OutputOpt = Args.getLastArg(options::OPT_o); 1214a3ec60e0cf2a1916f479288998d31bd980b1a306Daniel Dunbar CmdArgs.push_back("-auxbase-strip"); 1215a3ec60e0cf2a1916f479288998d31bd980b1a306Daniel Dunbar CmdArgs.push_back(OutputOpt->getValue(Args)); 1216a3ec60e0cf2a1916f479288998d31bd980b1a306Daniel Dunbar } else { 1217a3ec60e0cf2a1916f479288998d31bd980b1a306Daniel Dunbar CmdArgs.push_back("-auxbase"); 1218a5a7bd0de7b6b80212095195a055a4a43f21d4b2Daniel Dunbar CmdArgs.push_back(darwin::CC1::getBaseInputStem(Args, Inputs)); 1219a3ec60e0cf2a1916f479288998d31bd980b1a306Daniel Dunbar } 1220a3ec60e0cf2a1916f479288998d31bd980b1a306Daniel Dunbar 1221a3ec60e0cf2a1916f479288998d31bd980b1a306Daniel Dunbar Args.AddAllArgs(CmdArgs, options::OPT_g_Group); 1222a3ec60e0cf2a1916f479288998d31bd980b1a306Daniel Dunbar 1223a3ec60e0cf2a1916f479288998d31bd980b1a306Daniel Dunbar Args.AddAllArgs(CmdArgs, options::OPT_O); 1224a3ec60e0cf2a1916f479288998d31bd980b1a306Daniel Dunbar // FIXME: -Wall is getting some special treatment. Investigate. 1225a3ec60e0cf2a1916f479288998d31bd980b1a306Daniel Dunbar Args.AddAllArgs(CmdArgs, options::OPT_W_Group, options::OPT_pedantic_Group); 1226a3ec60e0cf2a1916f479288998d31bd980b1a306Daniel Dunbar Args.AddLastArg(CmdArgs, options::OPT_w); 1227c21c485b4fb58ef5d55cf3e523263dd824a2ace4Daniel Dunbar Args.AddAllArgs(CmdArgs, options::OPT_std_EQ, options::OPT_ansi, 1228a3ec60e0cf2a1916f479288998d31bd980b1a306Daniel Dunbar options::OPT_trigraphs); 1229a3ff202ee4fb21728e930d5d029ba4925129912cDaniel Dunbar if (!Args.getLastArg(options::OPT_std_EQ, options::OPT_ansi)) { 1230a3ff202ee4fb21728e930d5d029ba4925129912cDaniel Dunbar // Honor -std-default. 1231a3ff202ee4fb21728e930d5d029ba4925129912cDaniel Dunbar Args.AddAllArgsTranslated(CmdArgs, options::OPT_std_default_EQ, 1232a3ff202ee4fb21728e930d5d029ba4925129912cDaniel Dunbar "-std=", /*Joined=*/true); 1233a3ff202ee4fb21728e930d5d029ba4925129912cDaniel Dunbar } 1234a3ff202ee4fb21728e930d5d029ba4925129912cDaniel Dunbar 1235a3ec60e0cf2a1916f479288998d31bd980b1a306Daniel Dunbar if (Args.hasArg(options::OPT_v)) 1236a3ec60e0cf2a1916f479288998d31bd980b1a306Daniel Dunbar CmdArgs.push_back("-version"); 1237a3ec60e0cf2a1916f479288998d31bd980b1a306Daniel Dunbar if (Args.hasArg(options::OPT_pg)) 1238a3ec60e0cf2a1916f479288998d31bd980b1a306Daniel Dunbar CmdArgs.push_back("-p"); 1239a3ec60e0cf2a1916f479288998d31bd980b1a306Daniel Dunbar Args.AddLastArg(CmdArgs, options::OPT_p); 1240c21c485b4fb58ef5d55cf3e523263dd824a2ace4Daniel Dunbar 1241a3ec60e0cf2a1916f479288998d31bd980b1a306Daniel Dunbar // The driver treats -fsyntax-only specially. 12422ba91575905a54f712a7f64304e56002e4882499Daniel Dunbar if (getToolChain().getTriple().getArch() == llvm::Triple::arm || 12432ba91575905a54f712a7f64304e56002e4882499Daniel Dunbar getToolChain().getTriple().getArch() == llvm::Triple::thumb) { 12442ba91575905a54f712a7f64304e56002e4882499Daniel Dunbar // Removes -fbuiltin-str{cat,cpy}; these aren't recognized by cc1 but are 12452ba91575905a54f712a7f64304e56002e4882499Daniel Dunbar // used to inhibit the default -fno-builtin-str{cat,cpy}. 12462ba91575905a54f712a7f64304e56002e4882499Daniel Dunbar // 12472ba91575905a54f712a7f64304e56002e4882499Daniel Dunbar // FIXME: Should we grow a better way to deal with "removing" args? 12482ba91575905a54f712a7f64304e56002e4882499Daniel Dunbar // 12492ba91575905a54f712a7f64304e56002e4882499Daniel Dunbar // FIXME: Use iterator. 12502ba91575905a54f712a7f64304e56002e4882499Daniel Dunbar for (ArgList::const_iterator it = Args.begin(), 12512ba91575905a54f712a7f64304e56002e4882499Daniel Dunbar ie = Args.end(); it != ie; ++it) { 12522ba91575905a54f712a7f64304e56002e4882499Daniel Dunbar const Arg *A = *it; 1253728a512753d85a6ccaae34e81385c8665c2de0e1Daniel Dunbar if (A->getOption().matches(options::OPT_f_Group) || 12542ba91575905a54f712a7f64304e56002e4882499Daniel Dunbar A->getOption().matches(options::OPT_fsyntax_only)) { 12552ba91575905a54f712a7f64304e56002e4882499Daniel Dunbar if (!A->getOption().matches(options::OPT_fbuiltin_strcat) && 12562ba91575905a54f712a7f64304e56002e4882499Daniel Dunbar !A->getOption().matches(options::OPT_fbuiltin_strcpy)) { 12572ba91575905a54f712a7f64304e56002e4882499Daniel Dunbar A->claim(); 12582ba91575905a54f712a7f64304e56002e4882499Daniel Dunbar A->render(Args, CmdArgs); 12592ba91575905a54f712a7f64304e56002e4882499Daniel Dunbar } 12602ba91575905a54f712a7f64304e56002e4882499Daniel Dunbar } 12612ba91575905a54f712a7f64304e56002e4882499Daniel Dunbar } 12622ba91575905a54f712a7f64304e56002e4882499Daniel Dunbar } else 12632ba91575905a54f712a7f64304e56002e4882499Daniel Dunbar Args.AddAllArgs(CmdArgs, options::OPT_f_Group, options::OPT_fsyntax_only); 1264c21c485b4fb58ef5d55cf3e523263dd824a2ace4Daniel Dunbar 1265a3ec60e0cf2a1916f479288998d31bd980b1a306Daniel Dunbar Args.AddAllArgs(CmdArgs, options::OPT_undef); 1266a3ec60e0cf2a1916f479288998d31bd980b1a306Daniel Dunbar if (Args.hasArg(options::OPT_Qn)) 1267a3ec60e0cf2a1916f479288998d31bd980b1a306Daniel Dunbar CmdArgs.push_back("-fno-ident"); 1268c21c485b4fb58ef5d55cf3e523263dd824a2ace4Daniel Dunbar 1269a3ec60e0cf2a1916f479288998d31bd980b1a306Daniel Dunbar // FIXME: This isn't correct. 1270a3ec60e0cf2a1916f479288998d31bd980b1a306Daniel Dunbar //Args.AddLastArg(CmdArgs, options::OPT__help) 1271a3ec60e0cf2a1916f479288998d31bd980b1a306Daniel Dunbar //Args.AddLastArg(CmdArgs, options::OPT__targetHelp) 1272a3ec60e0cf2a1916f479288998d31bd980b1a306Daniel Dunbar 1273a3ec60e0cf2a1916f479288998d31bd980b1a306Daniel Dunbar CmdArgs.append(OutputArgs.begin(), OutputArgs.end()); 1274a3ec60e0cf2a1916f479288998d31bd980b1a306Daniel Dunbar 1275a3ec60e0cf2a1916f479288998d31bd980b1a306Daniel Dunbar // FIXME: Still don't get what is happening here. Investigate. 1276a3ec60e0cf2a1916f479288998d31bd980b1a306Daniel Dunbar Args.AddAllArgs(CmdArgs, options::OPT__param); 1277a3ec60e0cf2a1916f479288998d31bd980b1a306Daniel Dunbar 1278a3ec60e0cf2a1916f479288998d31bd980b1a306Daniel Dunbar if (Args.hasArg(options::OPT_fmudflap) || 1279a3ec60e0cf2a1916f479288998d31bd980b1a306Daniel Dunbar Args.hasArg(options::OPT_fmudflapth)) { 1280a3ec60e0cf2a1916f479288998d31bd980b1a306Daniel Dunbar CmdArgs.push_back("-fno-builtin"); 1281a3ec60e0cf2a1916f479288998d31bd980b1a306Daniel Dunbar CmdArgs.push_back("-fno-merge-constants"); 1282a3ec60e0cf2a1916f479288998d31bd980b1a306Daniel Dunbar } 1283c21c485b4fb58ef5d55cf3e523263dd824a2ace4Daniel Dunbar 1284a3ec60e0cf2a1916f479288998d31bd980b1a306Daniel Dunbar if (Args.hasArg(options::OPT_coverage)) { 1285a3ec60e0cf2a1916f479288998d31bd980b1a306Daniel Dunbar CmdArgs.push_back("-fprofile-arcs"); 1286a3ec60e0cf2a1916f479288998d31bd980b1a306Daniel Dunbar CmdArgs.push_back("-ftest-coverage"); 1287a3ec60e0cf2a1916f479288998d31bd980b1a306Daniel Dunbar } 1288a3ec60e0cf2a1916f479288998d31bd980b1a306Daniel Dunbar 1289a3ec60e0cf2a1916f479288998d31bd980b1a306Daniel Dunbar if (types::isCXX(Inputs[0].getType())) 1290a3ec60e0cf2a1916f479288998d31bd980b1a306Daniel Dunbar CmdArgs.push_back("-D__private_extern__=extern"); 1291a3ec60e0cf2a1916f479288998d31bd980b1a306Daniel Dunbar} 1292a3ec60e0cf2a1916f479288998d31bd980b1a306Daniel Dunbar 1293a3ec60e0cf2a1916f479288998d31bd980b1a306Daniel Dunbarvoid darwin::CC1::AddCPPOptionsArgs(const ArgList &Args, ArgStringList &CmdArgs, 1294a3ec60e0cf2a1916f479288998d31bd980b1a306Daniel Dunbar const InputInfoList &Inputs, 1295a3ec60e0cf2a1916f479288998d31bd980b1a306Daniel Dunbar const ArgStringList &OutputArgs) const { 1296a3ec60e0cf2a1916f479288998d31bd980b1a306Daniel Dunbar // Derived from cpp_options 1297a3ec60e0cf2a1916f479288998d31bd980b1a306Daniel Dunbar AddCPPUniqueOptionsArgs(Args, CmdArgs, Inputs); 1298c21c485b4fb58ef5d55cf3e523263dd824a2ace4Daniel Dunbar 1299a3ec60e0cf2a1916f479288998d31bd980b1a306Daniel Dunbar CmdArgs.append(OutputArgs.begin(), OutputArgs.end()); 1300a3ec60e0cf2a1916f479288998d31bd980b1a306Daniel Dunbar 1301a3ec60e0cf2a1916f479288998d31bd980b1a306Daniel Dunbar AddCC1Args(Args, CmdArgs); 1302a3ec60e0cf2a1916f479288998d31bd980b1a306Daniel Dunbar 1303a3ec60e0cf2a1916f479288998d31bd980b1a306Daniel Dunbar // NOTE: The code below has some commonality with cpp_options, but 1304a3ec60e0cf2a1916f479288998d31bd980b1a306Daniel Dunbar // in classic gcc style ends up sending things in different 1305a3ec60e0cf2a1916f479288998d31bd980b1a306Daniel Dunbar // orders. This may be a good merge candidate once we drop pedantic 1306a3ec60e0cf2a1916f479288998d31bd980b1a306Daniel Dunbar // compatibility. 1307a3ec60e0cf2a1916f479288998d31bd980b1a306Daniel Dunbar 1308a3ec60e0cf2a1916f479288998d31bd980b1a306Daniel Dunbar Args.AddAllArgs(CmdArgs, options::OPT_m_Group); 1309c21c485b4fb58ef5d55cf3e523263dd824a2ace4Daniel Dunbar Args.AddAllArgs(CmdArgs, options::OPT_std_EQ, options::OPT_ansi, 1310a3ec60e0cf2a1916f479288998d31bd980b1a306Daniel Dunbar options::OPT_trigraphs); 1311a3ff202ee4fb21728e930d5d029ba4925129912cDaniel Dunbar if (!Args.getLastArg(options::OPT_std_EQ, options::OPT_ansi)) { 1312a3ff202ee4fb21728e930d5d029ba4925129912cDaniel Dunbar // Honor -std-default. 1313a3ff202ee4fb21728e930d5d029ba4925129912cDaniel Dunbar Args.AddAllArgsTranslated(CmdArgs, options::OPT_std_default_EQ, 1314a3ff202ee4fb21728e930d5d029ba4925129912cDaniel Dunbar "-std=", /*Joined=*/true); 1315a3ff202ee4fb21728e930d5d029ba4925129912cDaniel Dunbar } 1316a3ec60e0cf2a1916f479288998d31bd980b1a306Daniel Dunbar Args.AddAllArgs(CmdArgs, options::OPT_W_Group, options::OPT_pedantic_Group); 1317a3ec60e0cf2a1916f479288998d31bd980b1a306Daniel Dunbar Args.AddLastArg(CmdArgs, options::OPT_w); 1318c21c485b4fb58ef5d55cf3e523263dd824a2ace4Daniel Dunbar 1319a3ec60e0cf2a1916f479288998d31bd980b1a306Daniel Dunbar // The driver treats -fsyntax-only specially. 1320a3ec60e0cf2a1916f479288998d31bd980b1a306Daniel Dunbar Args.AddAllArgs(CmdArgs, options::OPT_f_Group, options::OPT_fsyntax_only); 1321a3ec60e0cf2a1916f479288998d31bd980b1a306Daniel Dunbar 1322a3ec60e0cf2a1916f479288998d31bd980b1a306Daniel Dunbar if (Args.hasArg(options::OPT_g_Group) && !Args.hasArg(options::OPT_g0) && 1323a3ec60e0cf2a1916f479288998d31bd980b1a306Daniel Dunbar !Args.hasArg(options::OPT_fno_working_directory)) 1324a3ec60e0cf2a1916f479288998d31bd980b1a306Daniel Dunbar CmdArgs.push_back("-fworking-directory"); 1325a3ec60e0cf2a1916f479288998d31bd980b1a306Daniel Dunbar 1326a3ec60e0cf2a1916f479288998d31bd980b1a306Daniel Dunbar Args.AddAllArgs(CmdArgs, options::OPT_O); 1327a3ec60e0cf2a1916f479288998d31bd980b1a306Daniel Dunbar Args.AddAllArgs(CmdArgs, options::OPT_undef); 1328a3ec60e0cf2a1916f479288998d31bd980b1a306Daniel Dunbar if (Args.hasArg(options::OPT_save_temps)) 1329a3ec60e0cf2a1916f479288998d31bd980b1a306Daniel Dunbar CmdArgs.push_back("-fpch-preprocess"); 1330a3ec60e0cf2a1916f479288998d31bd980b1a306Daniel Dunbar} 1331a3ec60e0cf2a1916f479288998d31bd980b1a306Daniel Dunbar 1332c21c485b4fb58ef5d55cf3e523263dd824a2ace4Daniel Dunbarvoid darwin::CC1::AddCPPUniqueOptionsArgs(const ArgList &Args, 1333a3ec60e0cf2a1916f479288998d31bd980b1a306Daniel Dunbar ArgStringList &CmdArgs, 13341eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump const InputInfoList &Inputs) const { 1335a3ec60e0cf2a1916f479288998d31bd980b1a306Daniel Dunbar const Driver &D = getToolChain().getHost().getDriver(); 1336a3ec60e0cf2a1916f479288998d31bd980b1a306Daniel Dunbar 133788a3d6cf5ebab81614f89ba48a8d89023270637aDaniel Dunbar CheckPreprocessingOptions(D, Args); 133888a3d6cf5ebab81614f89ba48a8d89023270637aDaniel Dunbar 1339a3ec60e0cf2a1916f479288998d31bd980b1a306Daniel Dunbar // Derived from cpp_unique_options. 134088a3d6cf5ebab81614f89ba48a8d89023270637aDaniel Dunbar // -{C,CC} only with -E is checked in CheckPreprocessingOptions(). 134188a3d6cf5ebab81614f89ba48a8d89023270637aDaniel Dunbar Args.AddLastArg(CmdArgs, options::OPT_C); 134288a3d6cf5ebab81614f89ba48a8d89023270637aDaniel Dunbar Args.AddLastArg(CmdArgs, options::OPT_CC); 1343a3ec60e0cf2a1916f479288998d31bd980b1a306Daniel Dunbar if (!Args.hasArg(options::OPT_Q)) 1344a3ec60e0cf2a1916f479288998d31bd980b1a306Daniel Dunbar CmdArgs.push_back("-quiet"); 1345a3ec60e0cf2a1916f479288998d31bd980b1a306Daniel Dunbar Args.AddAllArgs(CmdArgs, options::OPT_nostdinc); 1346a3ec60e0cf2a1916f479288998d31bd980b1a306Daniel Dunbar Args.AddLastArg(CmdArgs, options::OPT_v); 1347a3ec60e0cf2a1916f479288998d31bd980b1a306Daniel Dunbar Args.AddAllArgs(CmdArgs, options::OPT_I_Group, options::OPT_F); 1348a3ec60e0cf2a1916f479288998d31bd980b1a306Daniel Dunbar Args.AddLastArg(CmdArgs, options::OPT_P); 1349a3ec60e0cf2a1916f479288998d31bd980b1a306Daniel Dunbar 1350a3ec60e0cf2a1916f479288998d31bd980b1a306Daniel Dunbar // FIXME: Handle %I properly. 1351a3ec60e0cf2a1916f479288998d31bd980b1a306Daniel Dunbar if (getToolChain().getArchName() == "x86_64") { 1352a3ec60e0cf2a1916f479288998d31bd980b1a306Daniel Dunbar CmdArgs.push_back("-imultilib"); 1353a3ec60e0cf2a1916f479288998d31bd980b1a306Daniel Dunbar CmdArgs.push_back("x86_64"); 1354a3ec60e0cf2a1916f479288998d31bd980b1a306Daniel Dunbar } 1355a3ec60e0cf2a1916f479288998d31bd980b1a306Daniel Dunbar 1356a3ec60e0cf2a1916f479288998d31bd980b1a306Daniel Dunbar if (Args.hasArg(options::OPT_MD)) { 1357a3ec60e0cf2a1916f479288998d31bd980b1a306Daniel Dunbar CmdArgs.push_back("-MD"); 1358a5a7bd0de7b6b80212095195a055a4a43f21d4b2Daniel Dunbar CmdArgs.push_back(darwin::CC1::getDependencyFileName(Args, Inputs)); 1359a3ec60e0cf2a1916f479288998d31bd980b1a306Daniel Dunbar } 1360a3ec60e0cf2a1916f479288998d31bd980b1a306Daniel Dunbar 1361a3ec60e0cf2a1916f479288998d31bd980b1a306Daniel Dunbar if (Args.hasArg(options::OPT_MMD)) { 1362a3ec60e0cf2a1916f479288998d31bd980b1a306Daniel Dunbar CmdArgs.push_back("-MMD"); 1363a5a7bd0de7b6b80212095195a055a4a43f21d4b2Daniel Dunbar CmdArgs.push_back(darwin::CC1::getDependencyFileName(Args, Inputs)); 1364a3ec60e0cf2a1916f479288998d31bd980b1a306Daniel Dunbar } 1365a3ec60e0cf2a1916f479288998d31bd980b1a306Daniel Dunbar 1366a3ec60e0cf2a1916f479288998d31bd980b1a306Daniel Dunbar Args.AddLastArg(CmdArgs, options::OPT_M); 1367a3ec60e0cf2a1916f479288998d31bd980b1a306Daniel Dunbar Args.AddLastArg(CmdArgs, options::OPT_MM); 1368a3ec60e0cf2a1916f479288998d31bd980b1a306Daniel Dunbar Args.AddAllArgs(CmdArgs, options::OPT_MF); 1369a3ec60e0cf2a1916f479288998d31bd980b1a306Daniel Dunbar Args.AddLastArg(CmdArgs, options::OPT_MG); 1370a3ec60e0cf2a1916f479288998d31bd980b1a306Daniel Dunbar Args.AddLastArg(CmdArgs, options::OPT_MP); 1371a3ec60e0cf2a1916f479288998d31bd980b1a306Daniel Dunbar Args.AddAllArgs(CmdArgs, options::OPT_MQ); 1372a3ec60e0cf2a1916f479288998d31bd980b1a306Daniel Dunbar Args.AddAllArgs(CmdArgs, options::OPT_MT); 1373a3ec60e0cf2a1916f479288998d31bd980b1a306Daniel Dunbar if (!Args.hasArg(options::OPT_M) && !Args.hasArg(options::OPT_MM) && 1374a3ec60e0cf2a1916f479288998d31bd980b1a306Daniel Dunbar (Args.hasArg(options::OPT_MD) || Args.hasArg(options::OPT_MMD))) { 1375a3ec60e0cf2a1916f479288998d31bd980b1a306Daniel Dunbar if (Arg *OutputOpt = Args.getLastArg(options::OPT_o)) { 1376a3ec60e0cf2a1916f479288998d31bd980b1a306Daniel Dunbar CmdArgs.push_back("-MQ"); 1377a3ec60e0cf2a1916f479288998d31bd980b1a306Daniel Dunbar CmdArgs.push_back(OutputOpt->getValue(Args)); 1378a3ec60e0cf2a1916f479288998d31bd980b1a306Daniel Dunbar } 1379a3ec60e0cf2a1916f479288998d31bd980b1a306Daniel Dunbar } 1380a3ec60e0cf2a1916f479288998d31bd980b1a306Daniel Dunbar 1381a3ec60e0cf2a1916f479288998d31bd980b1a306Daniel Dunbar Args.AddLastArg(CmdArgs, options::OPT_remap); 1382a3ec60e0cf2a1916f479288998d31bd980b1a306Daniel Dunbar if (Args.hasArg(options::OPT_g3)) 1383a3ec60e0cf2a1916f479288998d31bd980b1a306Daniel Dunbar CmdArgs.push_back("-dD"); 1384a3ec60e0cf2a1916f479288998d31bd980b1a306Daniel Dunbar Args.AddLastArg(CmdArgs, options::OPT_H); 1385a3ec60e0cf2a1916f479288998d31bd980b1a306Daniel Dunbar 1386a3ec60e0cf2a1916f479288998d31bd980b1a306Daniel Dunbar AddCPPArgs(Args, CmdArgs); 1387a3ec60e0cf2a1916f479288998d31bd980b1a306Daniel Dunbar 1388a3ec60e0cf2a1916f479288998d31bd980b1a306Daniel Dunbar Args.AddAllArgs(CmdArgs, options::OPT_D, options::OPT_U, options::OPT_A); 1389a3ec60e0cf2a1916f479288998d31bd980b1a306Daniel Dunbar Args.AddAllArgs(CmdArgs, options::OPT_i_Group); 1390a3ec60e0cf2a1916f479288998d31bd980b1a306Daniel Dunbar 1391a3ec60e0cf2a1916f479288998d31bd980b1a306Daniel Dunbar for (InputInfoList::const_iterator 1392a3ec60e0cf2a1916f479288998d31bd980b1a306Daniel Dunbar it = Inputs.begin(), ie = Inputs.end(); it != ie; ++it) { 1393a3ec60e0cf2a1916f479288998d31bd980b1a306Daniel Dunbar const InputInfo &II = *it; 1394c21c485b4fb58ef5d55cf3e523263dd824a2ace4Daniel Dunbar 1395a3ec60e0cf2a1916f479288998d31bd980b1a306Daniel Dunbar if (II.isPipe()) 1396a3ec60e0cf2a1916f479288998d31bd980b1a306Daniel Dunbar CmdArgs.push_back("-"); 1397a3ec60e0cf2a1916f479288998d31bd980b1a306Daniel Dunbar else 1398a3ec60e0cf2a1916f479288998d31bd980b1a306Daniel Dunbar CmdArgs.push_back(II.getFilename()); 1399a3ec60e0cf2a1916f479288998d31bd980b1a306Daniel Dunbar } 1400a3ec60e0cf2a1916f479288998d31bd980b1a306Daniel Dunbar 1401a3ec60e0cf2a1916f479288998d31bd980b1a306Daniel Dunbar Args.AddAllArgValues(CmdArgs, options::OPT_Wp_COMMA, 1402a3ec60e0cf2a1916f479288998d31bd980b1a306Daniel Dunbar options::OPT_Xpreprocessor); 1403a3ec60e0cf2a1916f479288998d31bd980b1a306Daniel Dunbar 1404a3ec60e0cf2a1916f479288998d31bd980b1a306Daniel Dunbar if (Args.hasArg(options::OPT_fmudflap)) { 1405a3ec60e0cf2a1916f479288998d31bd980b1a306Daniel Dunbar CmdArgs.push_back("-D_MUDFLAP"); 1406a3ec60e0cf2a1916f479288998d31bd980b1a306Daniel Dunbar CmdArgs.push_back("-include"); 1407a3ec60e0cf2a1916f479288998d31bd980b1a306Daniel Dunbar CmdArgs.push_back("mf-runtime.h"); 1408a3ec60e0cf2a1916f479288998d31bd980b1a306Daniel Dunbar } 1409a3ec60e0cf2a1916f479288998d31bd980b1a306Daniel Dunbar 1410a3ec60e0cf2a1916f479288998d31bd980b1a306Daniel Dunbar if (Args.hasArg(options::OPT_fmudflapth)) { 1411a3ec60e0cf2a1916f479288998d31bd980b1a306Daniel Dunbar CmdArgs.push_back("-D_MUDFLAP"); 1412a3ec60e0cf2a1916f479288998d31bd980b1a306Daniel Dunbar CmdArgs.push_back("-D_MUDFLAPTH"); 1413a3ec60e0cf2a1916f479288998d31bd980b1a306Daniel Dunbar CmdArgs.push_back("-include"); 1414a3ec60e0cf2a1916f479288998d31bd980b1a306Daniel Dunbar CmdArgs.push_back("mf-runtime.h"); 1415a3ec60e0cf2a1916f479288998d31bd980b1a306Daniel Dunbar } 1416a3ec60e0cf2a1916f479288998d31bd980b1a306Daniel Dunbar} 1417a3ec60e0cf2a1916f479288998d31bd980b1a306Daniel Dunbar 1418c21c485b4fb58ef5d55cf3e523263dd824a2ace4Daniel Dunbarvoid darwin::CC1::AddCPPArgs(const ArgList &Args, 1419a3ec60e0cf2a1916f479288998d31bd980b1a306Daniel Dunbar ArgStringList &CmdArgs) const { 1420a3ec60e0cf2a1916f479288998d31bd980b1a306Daniel Dunbar // Derived from cpp spec. 1421a3ec60e0cf2a1916f479288998d31bd980b1a306Daniel Dunbar 1422a3ec60e0cf2a1916f479288998d31bd980b1a306Daniel Dunbar if (Args.hasArg(options::OPT_static)) { 1423a3ec60e0cf2a1916f479288998d31bd980b1a306Daniel Dunbar // The gcc spec is broken here, it refers to dynamic but 1424a3ec60e0cf2a1916f479288998d31bd980b1a306Daniel Dunbar // that has been translated. Start by being bug compatible. 1425c21c485b4fb58ef5d55cf3e523263dd824a2ace4Daniel Dunbar 1426a3ec60e0cf2a1916f479288998d31bd980b1a306Daniel Dunbar // if (!Args.hasArg(arglist.parser.dynamicOption)) 1427a3ec60e0cf2a1916f479288998d31bd980b1a306Daniel Dunbar CmdArgs.push_back("-D__STATIC__"); 1428a3ec60e0cf2a1916f479288998d31bd980b1a306Daniel Dunbar } else 1429a3ec60e0cf2a1916f479288998d31bd980b1a306Daniel Dunbar CmdArgs.push_back("-D__DYNAMIC__"); 1430a3ec60e0cf2a1916f479288998d31bd980b1a306Daniel Dunbar 1431a3ec60e0cf2a1916f479288998d31bd980b1a306Daniel Dunbar if (Args.hasArg(options::OPT_pthread)) 1432a3ec60e0cf2a1916f479288998d31bd980b1a306Daniel Dunbar CmdArgs.push_back("-D_REENTRANT"); 1433a3ec60e0cf2a1916f479288998d31bd980b1a306Daniel Dunbar} 1434a3ec60e0cf2a1916f479288998d31bd980b1a306Daniel Dunbar 143540f1265ebd42ece3e7f7917319b56012e8e2bce2Daniel Dunbarvoid darwin::Preprocess::ConstructJob(Compilation &C, const JobAction &JA, 1436c21c485b4fb58ef5d55cf3e523263dd824a2ace4Daniel Dunbar Job &Dest, const InputInfo &Output, 1437c21c485b4fb58ef5d55cf3e523263dd824a2ace4Daniel Dunbar const InputInfoList &Inputs, 1438c21c485b4fb58ef5d55cf3e523263dd824a2ace4Daniel Dunbar const ArgList &Args, 143940f1265ebd42ece3e7f7917319b56012e8e2bce2Daniel Dunbar const char *LinkingOutput) const { 144040f1265ebd42ece3e7f7917319b56012e8e2bce2Daniel Dunbar ArgStringList CmdArgs; 144140f1265ebd42ece3e7f7917319b56012e8e2bce2Daniel Dunbar 144240f1265ebd42ece3e7f7917319b56012e8e2bce2Daniel Dunbar assert(Inputs.size() == 1 && "Unexpected number of inputs!"); 144340f1265ebd42ece3e7f7917319b56012e8e2bce2Daniel Dunbar 144440f1265ebd42ece3e7f7917319b56012e8e2bce2Daniel Dunbar CmdArgs.push_back("-E"); 144540f1265ebd42ece3e7f7917319b56012e8e2bce2Daniel Dunbar 144640f1265ebd42ece3e7f7917319b56012e8e2bce2Daniel Dunbar if (Args.hasArg(options::OPT_traditional) || 144740f1265ebd42ece3e7f7917319b56012e8e2bce2Daniel Dunbar Args.hasArg(options::OPT_traditional_cpp)) 144840f1265ebd42ece3e7f7917319b56012e8e2bce2Daniel Dunbar CmdArgs.push_back("-traditional-cpp"); 1449c21c485b4fb58ef5d55cf3e523263dd824a2ace4Daniel Dunbar 145040f1265ebd42ece3e7f7917319b56012e8e2bce2Daniel Dunbar ArgStringList OutputArgs; 145140f1265ebd42ece3e7f7917319b56012e8e2bce2Daniel Dunbar if (Output.isFilename()) { 145240f1265ebd42ece3e7f7917319b56012e8e2bce2Daniel Dunbar OutputArgs.push_back("-o"); 145340f1265ebd42ece3e7f7917319b56012e8e2bce2Daniel Dunbar OutputArgs.push_back(Output.getFilename()); 145440f1265ebd42ece3e7f7917319b56012e8e2bce2Daniel Dunbar } else { 145540f1265ebd42ece3e7f7917319b56012e8e2bce2Daniel Dunbar assert(Output.isPipe() && "Unexpected CC1 output."); 145640f1265ebd42ece3e7f7917319b56012e8e2bce2Daniel Dunbar } 145740f1265ebd42ece3e7f7917319b56012e8e2bce2Daniel Dunbar 14589120f179fd2e354f067e4ef2c76dcf3fc4db8a16Daniel Dunbar if (Args.hasArg(options::OPT_E)) { 14599120f179fd2e354f067e4ef2c76dcf3fc4db8a16Daniel Dunbar AddCPPOptionsArgs(Args, CmdArgs, Inputs, OutputArgs); 14609120f179fd2e354f067e4ef2c76dcf3fc4db8a16Daniel Dunbar } else { 14619120f179fd2e354f067e4ef2c76dcf3fc4db8a16Daniel Dunbar AddCPPOptionsArgs(Args, CmdArgs, Inputs, ArgStringList()); 14629120f179fd2e354f067e4ef2c76dcf3fc4db8a16Daniel Dunbar CmdArgs.append(OutputArgs.begin(), OutputArgs.end()); 14639120f179fd2e354f067e4ef2c76dcf3fc4db8a16Daniel Dunbar } 1464c21c485b4fb58ef5d55cf3e523263dd824a2ace4Daniel Dunbar 14658a2073a85670a13b0bcc1726bc7f80d458f8245bDaniel Dunbar Args.AddAllArgs(CmdArgs, options::OPT_d_Group); 14668a2073a85670a13b0bcc1726bc7f80d458f8245bDaniel Dunbar 146740f1265ebd42ece3e7f7917319b56012e8e2bce2Daniel Dunbar const char *CC1Name = getCC1Name(Inputs[0].getType()); 1468c21c485b4fb58ef5d55cf3e523263dd824a2ace4Daniel Dunbar const char *Exec = 14695ed34f4c58b6ad4e21038d713c1fae31a6146ff5Daniel Dunbar Args.MakeArgString(getToolChain().GetProgramPath(C, CC1Name)); 1470cae087e164e94e4286c11bf694dd0ff88f295302Daniel Dunbar Dest.addCommand(new Command(JA, Exec, CmdArgs)); 147140f1265ebd42ece3e7f7917319b56012e8e2bce2Daniel Dunbar} 147240f1265ebd42ece3e7f7917319b56012e8e2bce2Daniel Dunbar 147340f1265ebd42ece3e7f7917319b56012e8e2bce2Daniel Dunbarvoid darwin::Compile::ConstructJob(Compilation &C, const JobAction &JA, 1474c21c485b4fb58ef5d55cf3e523263dd824a2ace4Daniel Dunbar Job &Dest, const InputInfo &Output, 1475c21c485b4fb58ef5d55cf3e523263dd824a2ace4Daniel Dunbar const InputInfoList &Inputs, 1476c21c485b4fb58ef5d55cf3e523263dd824a2ace4Daniel Dunbar const ArgList &Args, 147740f1265ebd42ece3e7f7917319b56012e8e2bce2Daniel Dunbar const char *LinkingOutput) const { 147840f1265ebd42ece3e7f7917319b56012e8e2bce2Daniel Dunbar const Driver &D = getToolChain().getHost().getDriver(); 147940f1265ebd42ece3e7f7917319b56012e8e2bce2Daniel Dunbar ArgStringList CmdArgs; 148040f1265ebd42ece3e7f7917319b56012e8e2bce2Daniel Dunbar 148140f1265ebd42ece3e7f7917319b56012e8e2bce2Daniel Dunbar assert(Inputs.size() == 1 && "Unexpected number of inputs!"); 148240f1265ebd42ece3e7f7917319b56012e8e2bce2Daniel Dunbar 148340f1265ebd42ece3e7f7917319b56012e8e2bce2Daniel Dunbar types::ID InputType = Inputs[0].getType(); 148440f1265ebd42ece3e7f7917319b56012e8e2bce2Daniel Dunbar const Arg *A; 1485ceb5c5b7f67a30fae305d1d19b478b623e4fbcedEli Friedman if ((A = Args.getLastArg(options::OPT_traditional))) 148640f1265ebd42ece3e7f7917319b56012e8e2bce2Daniel Dunbar D.Diag(clang::diag::err_drv_argument_only_allowed_with) 148740f1265ebd42ece3e7f7917319b56012e8e2bce2Daniel Dunbar << A->getAsString(Args) << "-E"; 148840f1265ebd42ece3e7f7917319b56012e8e2bce2Daniel Dunbar 148940f1265ebd42ece3e7f7917319b56012e8e2bce2Daniel Dunbar if (Output.getType() == types::TY_LLVMAsm) 149040f1265ebd42ece3e7f7917319b56012e8e2bce2Daniel Dunbar CmdArgs.push_back("-emit-llvm"); 149140f1265ebd42ece3e7f7917319b56012e8e2bce2Daniel Dunbar else if (Output.getType() == types::TY_LLVMBC) 149240f1265ebd42ece3e7f7917319b56012e8e2bce2Daniel Dunbar CmdArgs.push_back("-emit-llvm-bc"); 14935915fbf310e171c4cd3c2af05e9de360c0fa988aDaniel Dunbar else if (Output.getType() == types::TY_AST) 14945915fbf310e171c4cd3c2af05e9de360c0fa988aDaniel Dunbar D.Diag(clang::diag::err_drv_no_ast_support) 1495881376467c46c5c6cc16fa6790271c2c22e1d4f1Daniel Dunbar << getToolChain().getTripleString(); 149640f1265ebd42ece3e7f7917319b56012e8e2bce2Daniel Dunbar 149740f1265ebd42ece3e7f7917319b56012e8e2bce2Daniel Dunbar ArgStringList OutputArgs; 149840f1265ebd42ece3e7f7917319b56012e8e2bce2Daniel Dunbar if (Output.getType() != types::TY_PCH) { 149940f1265ebd42ece3e7f7917319b56012e8e2bce2Daniel Dunbar OutputArgs.push_back("-o"); 150040f1265ebd42ece3e7f7917319b56012e8e2bce2Daniel Dunbar if (Output.isPipe()) 150140f1265ebd42ece3e7f7917319b56012e8e2bce2Daniel Dunbar OutputArgs.push_back("-"); 150240f1265ebd42ece3e7f7917319b56012e8e2bce2Daniel Dunbar else if (Output.isNothing()) 150340f1265ebd42ece3e7f7917319b56012e8e2bce2Daniel Dunbar OutputArgs.push_back("/dev/null"); 150440f1265ebd42ece3e7f7917319b56012e8e2bce2Daniel Dunbar else 150540f1265ebd42ece3e7f7917319b56012e8e2bce2Daniel Dunbar OutputArgs.push_back(Output.getFilename()); 150640f1265ebd42ece3e7f7917319b56012e8e2bce2Daniel Dunbar } 150740f1265ebd42ece3e7f7917319b56012e8e2bce2Daniel Dunbar 150840f1265ebd42ece3e7f7917319b56012e8e2bce2Daniel Dunbar // There is no need for this level of compatibility, but it makes 150940f1265ebd42ece3e7f7917319b56012e8e2bce2Daniel Dunbar // diffing easier. 151040f1265ebd42ece3e7f7917319b56012e8e2bce2Daniel Dunbar bool OutputArgsEarly = (Args.hasArg(options::OPT_fsyntax_only) || 151140f1265ebd42ece3e7f7917319b56012e8e2bce2Daniel Dunbar Args.hasArg(options::OPT_S)); 151240f1265ebd42ece3e7f7917319b56012e8e2bce2Daniel Dunbar 151340f1265ebd42ece3e7f7917319b56012e8e2bce2Daniel Dunbar if (types::getPreprocessedType(InputType) != types::TY_INVALID) { 1514a3ec60e0cf2a1916f479288998d31bd980b1a306Daniel Dunbar AddCPPUniqueOptionsArgs(Args, CmdArgs, Inputs); 151540f1265ebd42ece3e7f7917319b56012e8e2bce2Daniel Dunbar if (OutputArgsEarly) { 151640f1265ebd42ece3e7f7917319b56012e8e2bce2Daniel Dunbar AddCC1OptionsArgs(Args, CmdArgs, Inputs, OutputArgs); 151740f1265ebd42ece3e7f7917319b56012e8e2bce2Daniel Dunbar } else { 151840f1265ebd42ece3e7f7917319b56012e8e2bce2Daniel Dunbar AddCC1OptionsArgs(Args, CmdArgs, Inputs, ArgStringList()); 151940f1265ebd42ece3e7f7917319b56012e8e2bce2Daniel Dunbar CmdArgs.append(OutputArgs.begin(), OutputArgs.end()); 152040f1265ebd42ece3e7f7917319b56012e8e2bce2Daniel Dunbar } 152140f1265ebd42ece3e7f7917319b56012e8e2bce2Daniel Dunbar } else { 152240f1265ebd42ece3e7f7917319b56012e8e2bce2Daniel Dunbar CmdArgs.push_back("-fpreprocessed"); 1523c21c485b4fb58ef5d55cf3e523263dd824a2ace4Daniel Dunbar 152440f1265ebd42ece3e7f7917319b56012e8e2bce2Daniel Dunbar for (InputInfoList::const_iterator 152540f1265ebd42ece3e7f7917319b56012e8e2bce2Daniel Dunbar it = Inputs.begin(), ie = Inputs.end(); it != ie; ++it) { 152640f1265ebd42ece3e7f7917319b56012e8e2bce2Daniel Dunbar const InputInfo &II = *it; 152740f1265ebd42ece3e7f7917319b56012e8e2bce2Daniel Dunbar 15285915fbf310e171c4cd3c2af05e9de360c0fa988aDaniel Dunbar // Reject AST inputs. 15295915fbf310e171c4cd3c2af05e9de360c0fa988aDaniel Dunbar if (II.getType() == types::TY_AST) { 15305915fbf310e171c4cd3c2af05e9de360c0fa988aDaniel Dunbar D.Diag(clang::diag::err_drv_no_ast_support) 1531881376467c46c5c6cc16fa6790271c2c22e1d4f1Daniel Dunbar << getToolChain().getTripleString(); 15325915fbf310e171c4cd3c2af05e9de360c0fa988aDaniel Dunbar return; 15335915fbf310e171c4cd3c2af05e9de360c0fa988aDaniel Dunbar } 15345915fbf310e171c4cd3c2af05e9de360c0fa988aDaniel Dunbar 153540f1265ebd42ece3e7f7917319b56012e8e2bce2Daniel Dunbar if (II.isPipe()) 153640f1265ebd42ece3e7f7917319b56012e8e2bce2Daniel Dunbar CmdArgs.push_back("-"); 153740f1265ebd42ece3e7f7917319b56012e8e2bce2Daniel Dunbar else 153840f1265ebd42ece3e7f7917319b56012e8e2bce2Daniel Dunbar CmdArgs.push_back(II.getFilename()); 153940f1265ebd42ece3e7f7917319b56012e8e2bce2Daniel Dunbar } 154040f1265ebd42ece3e7f7917319b56012e8e2bce2Daniel Dunbar 154140f1265ebd42ece3e7f7917319b56012e8e2bce2Daniel Dunbar if (OutputArgsEarly) { 154240f1265ebd42ece3e7f7917319b56012e8e2bce2Daniel Dunbar AddCC1OptionsArgs(Args, CmdArgs, Inputs, OutputArgs); 154340f1265ebd42ece3e7f7917319b56012e8e2bce2Daniel Dunbar } else { 154440f1265ebd42ece3e7f7917319b56012e8e2bce2Daniel Dunbar AddCC1OptionsArgs(Args, CmdArgs, Inputs, ArgStringList()); 154540f1265ebd42ece3e7f7917319b56012e8e2bce2Daniel Dunbar CmdArgs.append(OutputArgs.begin(), OutputArgs.end()); 154640f1265ebd42ece3e7f7917319b56012e8e2bce2Daniel Dunbar } 154740f1265ebd42ece3e7f7917319b56012e8e2bce2Daniel Dunbar } 1548c21c485b4fb58ef5d55cf3e523263dd824a2ace4Daniel Dunbar 154940f1265ebd42ece3e7f7917319b56012e8e2bce2Daniel Dunbar if (Output.getType() == types::TY_PCH) { 155040f1265ebd42ece3e7f7917319b56012e8e2bce2Daniel Dunbar assert(Output.isFilename() && "Invalid PCH output."); 155140f1265ebd42ece3e7f7917319b56012e8e2bce2Daniel Dunbar 155240f1265ebd42ece3e7f7917319b56012e8e2bce2Daniel Dunbar CmdArgs.push_back("-o"); 155340f1265ebd42ece3e7f7917319b56012e8e2bce2Daniel Dunbar // NOTE: gcc uses a temp .s file for this, but there doesn't seem 155440f1265ebd42ece3e7f7917319b56012e8e2bce2Daniel Dunbar // to be a good reason. 155540f1265ebd42ece3e7f7917319b56012e8e2bce2Daniel Dunbar CmdArgs.push_back("/dev/null"); 1556c21c485b4fb58ef5d55cf3e523263dd824a2ace4Daniel Dunbar 155740f1265ebd42ece3e7f7917319b56012e8e2bce2Daniel Dunbar CmdArgs.push_back("--output-pch="); 155840f1265ebd42ece3e7f7917319b56012e8e2bce2Daniel Dunbar CmdArgs.push_back(Output.getFilename()); 1559c21c485b4fb58ef5d55cf3e523263dd824a2ace4Daniel Dunbar } 156040f1265ebd42ece3e7f7917319b56012e8e2bce2Daniel Dunbar 156140f1265ebd42ece3e7f7917319b56012e8e2bce2Daniel Dunbar const char *CC1Name = getCC1Name(Inputs[0].getType()); 1562c21c485b4fb58ef5d55cf3e523263dd824a2ace4Daniel Dunbar const char *Exec = 15635ed34f4c58b6ad4e21038d713c1fae31a6146ff5Daniel Dunbar Args.MakeArgString(getToolChain().GetProgramPath(C, CC1Name)); 1564cae087e164e94e4286c11bf694dd0ff88f295302Daniel Dunbar Dest.addCommand(new Command(JA, Exec, CmdArgs)); 156540f1265ebd42ece3e7f7917319b56012e8e2bce2Daniel Dunbar} 156640f1265ebd42ece3e7f7917319b56012e8e2bce2Daniel Dunbar 15678cac5f7e1ce63dd77ee0fb4ef68f9fa804f41ea6Daniel Dunbarvoid darwin::Assemble::ConstructJob(Compilation &C, const JobAction &JA, 1568c21c485b4fb58ef5d55cf3e523263dd824a2ace4Daniel Dunbar Job &Dest, const InputInfo &Output, 1569c21c485b4fb58ef5d55cf3e523263dd824a2ace4Daniel Dunbar const InputInfoList &Inputs, 1570c21c485b4fb58ef5d55cf3e523263dd824a2ace4Daniel Dunbar const ArgList &Args, 15718cac5f7e1ce63dd77ee0fb4ef68f9fa804f41ea6Daniel Dunbar const char *LinkingOutput) const { 15728cac5f7e1ce63dd77ee0fb4ef68f9fa804f41ea6Daniel Dunbar ArgStringList CmdArgs; 15738cac5f7e1ce63dd77ee0fb4ef68f9fa804f41ea6Daniel Dunbar 15748cac5f7e1ce63dd77ee0fb4ef68f9fa804f41ea6Daniel Dunbar assert(Inputs.size() == 1 && "Unexpected number of inputs."); 15758cac5f7e1ce63dd77ee0fb4ef68f9fa804f41ea6Daniel Dunbar const InputInfo &Input = Inputs[0]; 15768cac5f7e1ce63dd77ee0fb4ef68f9fa804f41ea6Daniel Dunbar 15778cac5f7e1ce63dd77ee0fb4ef68f9fa804f41ea6Daniel Dunbar // Bit of a hack, this is only used for original inputs. 1578c21c485b4fb58ef5d55cf3e523263dd824a2ace4Daniel Dunbar // 15798e4fea6750dbac032c172f3279c63b7815b7423eDaniel Dunbar // FIXME: This is broken for preprocessed .s inputs. 15808cac5f7e1ce63dd77ee0fb4ef68f9fa804f41ea6Daniel Dunbar if (Input.isFilename() && 15818e4fea6750dbac032c172f3279c63b7815b7423eDaniel Dunbar strcmp(Input.getFilename(), Input.getBaseInput()) == 0) { 15828e4fea6750dbac032c172f3279c63b7815b7423eDaniel Dunbar if (Args.hasArg(options::OPT_gstabs)) 15838e4fea6750dbac032c172f3279c63b7815b7423eDaniel Dunbar CmdArgs.push_back("--gstabs"); 15848e4fea6750dbac032c172f3279c63b7815b7423eDaniel Dunbar else if (Args.hasArg(options::OPT_g_Group)) 15858e4fea6750dbac032c172f3279c63b7815b7423eDaniel Dunbar CmdArgs.push_back("--gdwarf2"); 15868e4fea6750dbac032c172f3279c63b7815b7423eDaniel Dunbar } 1587c21c485b4fb58ef5d55cf3e523263dd824a2ace4Daniel Dunbar 15888cac5f7e1ce63dd77ee0fb4ef68f9fa804f41ea6Daniel Dunbar // Derived from asm spec. 1589cc6f803f98fa6ba9a9c366400210448516d01b3cDaniel Dunbar AddDarwinArch(Args, CmdArgs); 1590cc6f803f98fa6ba9a9c366400210448516d01b3cDaniel Dunbar 1591cc6f803f98fa6ba9a9c366400210448516d01b3cDaniel Dunbar if (!getDarwinToolChain().isIPhone() || 1592cc6f803f98fa6ba9a9c366400210448516d01b3cDaniel Dunbar Args.hasArg(options::OPT_force__cpusubtype__ALL)) 1593cc6f803f98fa6ba9a9c366400210448516d01b3cDaniel Dunbar CmdArgs.push_back("-force_cpusubtype_ALL"); 15948cac5f7e1ce63dd77ee0fb4ef68f9fa804f41ea6Daniel Dunbar 15950e2679d29be70186fc1197a1484948ed239922baDaniel Dunbar if (getToolChain().getTriple().getArch() != llvm::Triple::x86_64 && 15960e2679d29be70186fc1197a1484948ed239922baDaniel Dunbar (Args.hasArg(options::OPT_mkernel) || 15978cac5f7e1ce63dd77ee0fb4ef68f9fa804f41ea6Daniel Dunbar Args.hasArg(options::OPT_static) || 15980e2679d29be70186fc1197a1484948ed239922baDaniel Dunbar Args.hasArg(options::OPT_fapple_kext))) 1599c21c485b4fb58ef5d55cf3e523263dd824a2ace4Daniel Dunbar CmdArgs.push_back("-static"); 1600c21c485b4fb58ef5d55cf3e523263dd824a2ace4Daniel Dunbar 16018cac5f7e1ce63dd77ee0fb4ef68f9fa804f41ea6Daniel Dunbar Args.AddAllArgValues(CmdArgs, options::OPT_Wa_COMMA, 16028cac5f7e1ce63dd77ee0fb4ef68f9fa804f41ea6Daniel Dunbar options::OPT_Xassembler); 16038cac5f7e1ce63dd77ee0fb4ef68f9fa804f41ea6Daniel Dunbar 16048cac5f7e1ce63dd77ee0fb4ef68f9fa804f41ea6Daniel Dunbar assert(Output.isFilename() && "Unexpected lipo output."); 16058cac5f7e1ce63dd77ee0fb4ef68f9fa804f41ea6Daniel Dunbar CmdArgs.push_back("-o"); 16068cac5f7e1ce63dd77ee0fb4ef68f9fa804f41ea6Daniel Dunbar CmdArgs.push_back(Output.getFilename()); 16078cac5f7e1ce63dd77ee0fb4ef68f9fa804f41ea6Daniel Dunbar 16088cac5f7e1ce63dd77ee0fb4ef68f9fa804f41ea6Daniel Dunbar if (Input.isPipe()) { 16098cac5f7e1ce63dd77ee0fb4ef68f9fa804f41ea6Daniel Dunbar CmdArgs.push_back("-"); 16108cac5f7e1ce63dd77ee0fb4ef68f9fa804f41ea6Daniel Dunbar } else { 16118cac5f7e1ce63dd77ee0fb4ef68f9fa804f41ea6Daniel Dunbar assert(Input.isFilename() && "Invalid input."); 16128cac5f7e1ce63dd77ee0fb4ef68f9fa804f41ea6Daniel Dunbar CmdArgs.push_back(Input.getFilename()); 16138cac5f7e1ce63dd77ee0fb4ef68f9fa804f41ea6Daniel Dunbar } 16148cac5f7e1ce63dd77ee0fb4ef68f9fa804f41ea6Daniel Dunbar 16158cac5f7e1ce63dd77ee0fb4ef68f9fa804f41ea6Daniel Dunbar // asm_final spec is empty. 16168cac5f7e1ce63dd77ee0fb4ef68f9fa804f41ea6Daniel Dunbar 1617c21c485b4fb58ef5d55cf3e523263dd824a2ace4Daniel Dunbar const char *Exec = 16185ed34f4c58b6ad4e21038d713c1fae31a6146ff5Daniel Dunbar Args.MakeArgString(getToolChain().GetProgramPath(C, "as")); 1619cae087e164e94e4286c11bf694dd0ff88f295302Daniel Dunbar Dest.addCommand(new Command(JA, Exec, CmdArgs)); 16208cac5f7e1ce63dd77ee0fb4ef68f9fa804f41ea6Daniel Dunbar} 1621ff7488dc9a766f94daf54d81b03ab9160d0bfd88Daniel Dunbar 162202633b541b04ad5ffc1c70f4c2feeeb13e607057Daniel Dunbar/// Helper routine for seeing if we should use dsymutil; this is a 162302633b541b04ad5ffc1c70f4c2feeeb13e607057Daniel Dunbar/// gcc compatible hack, we should remove it and use the input 162402633b541b04ad5ffc1c70f4c2feeeb13e607057Daniel Dunbar/// type information. 162502633b541b04ad5ffc1c70f4c2feeeb13e607057Daniel Dunbarstatic bool isSourceSuffix(const char *Str) { 162602633b541b04ad5ffc1c70f4c2feeeb13e607057Daniel Dunbar // match: 'C', 'CPP', 'c', 'cc', 'cp', 'c++', 'cpp', 'cxx', 'm', 162702633b541b04ad5ffc1c70f4c2feeeb13e607057Daniel Dunbar // 'mm'. 162802633b541b04ad5ffc1c70f4c2feeeb13e607057Daniel Dunbar switch (strlen(Str)) { 162902633b541b04ad5ffc1c70f4c2feeeb13e607057Daniel Dunbar default: 163002633b541b04ad5ffc1c70f4c2feeeb13e607057Daniel Dunbar return false; 163102633b541b04ad5ffc1c70f4c2feeeb13e607057Daniel Dunbar case 1: 163202633b541b04ad5ffc1c70f4c2feeeb13e607057Daniel Dunbar return (memcmp(Str, "C", 1) == 0 || 163302633b541b04ad5ffc1c70f4c2feeeb13e607057Daniel Dunbar memcmp(Str, "c", 1) == 0 || 163402633b541b04ad5ffc1c70f4c2feeeb13e607057Daniel Dunbar memcmp(Str, "m", 1) == 0); 163502633b541b04ad5ffc1c70f4c2feeeb13e607057Daniel Dunbar case 2: 163602633b541b04ad5ffc1c70f4c2feeeb13e607057Daniel Dunbar return (memcmp(Str, "cc", 2) == 0 || 163702633b541b04ad5ffc1c70f4c2feeeb13e607057Daniel Dunbar memcmp(Str, "cp", 2) == 0 || 163802633b541b04ad5ffc1c70f4c2feeeb13e607057Daniel Dunbar memcmp(Str, "mm", 2) == 0); 163902633b541b04ad5ffc1c70f4c2feeeb13e607057Daniel Dunbar case 3: 164002633b541b04ad5ffc1c70f4c2feeeb13e607057Daniel Dunbar return (memcmp(Str, "CPP", 3) == 0 || 164102633b541b04ad5ffc1c70f4c2feeeb13e607057Daniel Dunbar memcmp(Str, "c++", 3) == 0 || 164202633b541b04ad5ffc1c70f4c2feeeb13e607057Daniel Dunbar memcmp(Str, "cpp", 3) == 0 || 164302633b541b04ad5ffc1c70f4c2feeeb13e607057Daniel Dunbar memcmp(Str, "cxx", 3) == 0); 164402633b541b04ad5ffc1c70f4c2feeeb13e607057Daniel Dunbar } 164502633b541b04ad5ffc1c70f4c2feeeb13e607057Daniel Dunbar} 164602633b541b04ad5ffc1c70f4c2feeeb13e607057Daniel Dunbar 164702633b541b04ad5ffc1c70f4c2feeeb13e607057Daniel Dunbarstatic bool isMacosxVersionLT(unsigned (&A)[3], unsigned (&B)[3]) { 164802633b541b04ad5ffc1c70f4c2feeeb13e607057Daniel Dunbar for (unsigned i=0; i < 3; ++i) { 164902633b541b04ad5ffc1c70f4c2feeeb13e607057Daniel Dunbar if (A[i] > B[i]) return false; 165002633b541b04ad5ffc1c70f4c2feeeb13e607057Daniel Dunbar if (A[i] < B[i]) return true; 165102633b541b04ad5ffc1c70f4c2feeeb13e607057Daniel Dunbar } 165202633b541b04ad5ffc1c70f4c2feeeb13e607057Daniel Dunbar return false; 165302633b541b04ad5ffc1c70f4c2feeeb13e607057Daniel Dunbar} 165402633b541b04ad5ffc1c70f4c2feeeb13e607057Daniel Dunbar 1655c21c485b4fb58ef5d55cf3e523263dd824a2ace4Daniel Dunbarstatic bool isMacosxVersionLT(unsigned (&A)[3], 165602633b541b04ad5ffc1c70f4c2feeeb13e607057Daniel Dunbar unsigned V0, unsigned V1=0, unsigned V2=0) { 165702633b541b04ad5ffc1c70f4c2feeeb13e607057Daniel Dunbar unsigned B[3] = { V0, V1, V2 }; 165802633b541b04ad5ffc1c70f4c2feeeb13e607057Daniel Dunbar return isMacosxVersionLT(A, B); 165902633b541b04ad5ffc1c70f4c2feeeb13e607057Daniel Dunbar} 166002633b541b04ad5ffc1c70f4c2feeeb13e607057Daniel Dunbar 166178dbd580a02759bbc408dbefb6754afa71b2c24cDaniel Dunbar// FIXME: Can we tablegen this? 166278dbd580a02759bbc408dbefb6754afa71b2c24cDaniel Dunbarstatic const char *GetArmArchForMArch(llvm::StringRef Value) { 166378dbd580a02759bbc408dbefb6754afa71b2c24cDaniel Dunbar if (Value == "armv6k") 166478dbd580a02759bbc408dbefb6754afa71b2c24cDaniel Dunbar return "armv6"; 166578dbd580a02759bbc408dbefb6754afa71b2c24cDaniel Dunbar 166678dbd580a02759bbc408dbefb6754afa71b2c24cDaniel Dunbar if (Value == "armv5tej") 166778dbd580a02759bbc408dbefb6754afa71b2c24cDaniel Dunbar return "armv5"; 166878dbd580a02759bbc408dbefb6754afa71b2c24cDaniel Dunbar 166978dbd580a02759bbc408dbefb6754afa71b2c24cDaniel Dunbar if (Value == "xscale") 167078dbd580a02759bbc408dbefb6754afa71b2c24cDaniel Dunbar return "xscale"; 167178dbd580a02759bbc408dbefb6754afa71b2c24cDaniel Dunbar 167278dbd580a02759bbc408dbefb6754afa71b2c24cDaniel Dunbar if (Value == "armv4t") 167378dbd580a02759bbc408dbefb6754afa71b2c24cDaniel Dunbar return "armv4t"; 167478dbd580a02759bbc408dbefb6754afa71b2c24cDaniel Dunbar 167578dbd580a02759bbc408dbefb6754afa71b2c24cDaniel Dunbar if (Value == "armv7" || Value == "armv7-a" || Value == "armv7-r" || 167678dbd580a02759bbc408dbefb6754afa71b2c24cDaniel Dunbar Value == "armv7-m" || Value == "armv7a" || Value == "armv7r" || 167778dbd580a02759bbc408dbefb6754afa71b2c24cDaniel Dunbar Value == "armv7m") 167878dbd580a02759bbc408dbefb6754afa71b2c24cDaniel Dunbar return "armv7"; 167978dbd580a02759bbc408dbefb6754afa71b2c24cDaniel Dunbar 168078dbd580a02759bbc408dbefb6754afa71b2c24cDaniel Dunbar return 0; 168178dbd580a02759bbc408dbefb6754afa71b2c24cDaniel Dunbar} 168278dbd580a02759bbc408dbefb6754afa71b2c24cDaniel Dunbar 168378dbd580a02759bbc408dbefb6754afa71b2c24cDaniel Dunbar// FIXME: Can we tablegen this? 168478dbd580a02759bbc408dbefb6754afa71b2c24cDaniel Dunbarstatic const char *GetArmArchForMCpu(llvm::StringRef Value) { 168578dbd580a02759bbc408dbefb6754afa71b2c24cDaniel Dunbar if (Value == "arm10tdmi" || Value == "arm1020t" || Value == "arm9e" || 168678dbd580a02759bbc408dbefb6754afa71b2c24cDaniel Dunbar Value == "arm946e-s" || Value == "arm966e-s" || 168778dbd580a02759bbc408dbefb6754afa71b2c24cDaniel Dunbar Value == "arm968e-s" || Value == "arm10e" || 168878dbd580a02759bbc408dbefb6754afa71b2c24cDaniel Dunbar Value == "arm1020e" || Value == "arm1022e" || Value == "arm926ej-s" || 168978dbd580a02759bbc408dbefb6754afa71b2c24cDaniel Dunbar Value == "arm1026ej-s") 169078dbd580a02759bbc408dbefb6754afa71b2c24cDaniel Dunbar return "armv5"; 169178dbd580a02759bbc408dbefb6754afa71b2c24cDaniel Dunbar 169278dbd580a02759bbc408dbefb6754afa71b2c24cDaniel Dunbar if (Value == "xscale") 169378dbd580a02759bbc408dbefb6754afa71b2c24cDaniel Dunbar return "xscale"; 169478dbd580a02759bbc408dbefb6754afa71b2c24cDaniel Dunbar 169578dbd580a02759bbc408dbefb6754afa71b2c24cDaniel Dunbar if (Value == "arm1136j-s" || Value == "arm1136jf-s" || 169678dbd580a02759bbc408dbefb6754afa71b2c24cDaniel Dunbar Value == "arm1176jz-s" || Value == "arm1176jzf-s") 169778dbd580a02759bbc408dbefb6754afa71b2c24cDaniel Dunbar return "armv6"; 169878dbd580a02759bbc408dbefb6754afa71b2c24cDaniel Dunbar 169978dbd580a02759bbc408dbefb6754afa71b2c24cDaniel Dunbar if (Value == "cortex-a8" || Value == "cortex-r4" || Value == "cortex-m3") 170078dbd580a02759bbc408dbefb6754afa71b2c24cDaniel Dunbar return "armv7"; 170178dbd580a02759bbc408dbefb6754afa71b2c24cDaniel Dunbar 170278dbd580a02759bbc408dbefb6754afa71b2c24cDaniel Dunbar return 0; 170378dbd580a02759bbc408dbefb6754afa71b2c24cDaniel Dunbar} 170478dbd580a02759bbc408dbefb6754afa71b2c24cDaniel Dunbar 1705fbefe6bd6f62a3361813498dc672ab0d6c0d4fd1Daniel Dunbarvoid darwin::DarwinTool::AddDarwinArch(const ArgList &Args, 1706fbefe6bd6f62a3361813498dc672ab0d6c0d4fd1Daniel Dunbar ArgStringList &CmdArgs) const { 170702633b541b04ad5ffc1c70f4c2feeeb13e607057Daniel Dunbar // Derived from darwin_arch spec. 170802633b541b04ad5ffc1c70f4c2feeeb13e607057Daniel Dunbar CmdArgs.push_back("-arch"); 170978dbd580a02759bbc408dbefb6754afa71b2c24cDaniel Dunbar 171078dbd580a02759bbc408dbefb6754afa71b2c24cDaniel Dunbar switch (getToolChain().getTriple().getArch()) { 171178dbd580a02759bbc408dbefb6754afa71b2c24cDaniel Dunbar default: 1712881376467c46c5c6cc16fa6790271c2c22e1d4f1Daniel Dunbar CmdArgs.push_back(Args.MakeArgString(getToolChain().getArchName())); 171378dbd580a02759bbc408dbefb6754afa71b2c24cDaniel Dunbar break; 171478dbd580a02759bbc408dbefb6754afa71b2c24cDaniel Dunbar 171578dbd580a02759bbc408dbefb6754afa71b2c24cDaniel Dunbar case llvm::Triple::arm: { 171678dbd580a02759bbc408dbefb6754afa71b2c24cDaniel Dunbar if (const Arg *A = Args.getLastArg(options::OPT_march_EQ)) { 171778dbd580a02759bbc408dbefb6754afa71b2c24cDaniel Dunbar if (const char *Arch = GetArmArchForMArch(A->getValue(Args))) { 171878dbd580a02759bbc408dbefb6754afa71b2c24cDaniel Dunbar CmdArgs.push_back(Arch); 171978dbd580a02759bbc408dbefb6754afa71b2c24cDaniel Dunbar return; 172078dbd580a02759bbc408dbefb6754afa71b2c24cDaniel Dunbar } 172178dbd580a02759bbc408dbefb6754afa71b2c24cDaniel Dunbar } 172278dbd580a02759bbc408dbefb6754afa71b2c24cDaniel Dunbar 172378dbd580a02759bbc408dbefb6754afa71b2c24cDaniel Dunbar if (const Arg *A = Args.getLastArg(options::OPT_mcpu_EQ)) { 172478dbd580a02759bbc408dbefb6754afa71b2c24cDaniel Dunbar if (const char *Arch = GetArmArchForMCpu(A->getValue(Args))) { 172578dbd580a02759bbc408dbefb6754afa71b2c24cDaniel Dunbar CmdArgs.push_back(Arch); 172678dbd580a02759bbc408dbefb6754afa71b2c24cDaniel Dunbar return; 172778dbd580a02759bbc408dbefb6754afa71b2c24cDaniel Dunbar } 172878dbd580a02759bbc408dbefb6754afa71b2c24cDaniel Dunbar } 172978dbd580a02759bbc408dbefb6754afa71b2c24cDaniel Dunbar 173078dbd580a02759bbc408dbefb6754afa71b2c24cDaniel Dunbar CmdArgs.push_back("arm"); 173178dbd580a02759bbc408dbefb6754afa71b2c24cDaniel Dunbar CmdArgs.push_back("-force_cpusubtype_ALL"); 173278dbd580a02759bbc408dbefb6754afa71b2c24cDaniel Dunbar return; 173378dbd580a02759bbc408dbefb6754afa71b2c24cDaniel Dunbar } 173478dbd580a02759bbc408dbefb6754afa71b2c24cDaniel Dunbar } 173502633b541b04ad5ffc1c70f4c2feeeb13e607057Daniel Dunbar} 173602633b541b04ad5ffc1c70f4c2feeeb13e607057Daniel Dunbar 1737fbefe6bd6f62a3361813498dc672ab0d6c0d4fd1Daniel Dunbarvoid darwin::DarwinTool::AddDarwinSubArch(const ArgList &Args, 1738fbefe6bd6f62a3361813498dc672ab0d6c0d4fd1Daniel Dunbar ArgStringList &CmdArgs) const { 173902633b541b04ad5ffc1c70f4c2feeeb13e607057Daniel Dunbar // Derived from darwin_subarch spec, not sure what the distinction 174002633b541b04ad5ffc1c70f4c2feeeb13e607057Daniel Dunbar // exists for but at least for this chain it is the same. 174102633b541b04ad5ffc1c70f4c2feeeb13e607057Daniel Dunbar AddDarwinArch(Args, CmdArgs); 174202633b541b04ad5ffc1c70f4c2feeeb13e607057Daniel Dunbar} 174302633b541b04ad5ffc1c70f4c2feeeb13e607057Daniel Dunbar 1744c21c485b4fb58ef5d55cf3e523263dd824a2ace4Daniel Dunbarvoid darwin::Link::AddLinkArgs(const ArgList &Args, 174502633b541b04ad5ffc1c70f4c2feeeb13e607057Daniel Dunbar ArgStringList &CmdArgs) const { 174602633b541b04ad5ffc1c70f4c2feeeb13e607057Daniel Dunbar const Driver &D = getToolChain().getHost().getDriver(); 174702633b541b04ad5ffc1c70f4c2feeeb13e607057Daniel Dunbar 174802633b541b04ad5ffc1c70f4c2feeeb13e607057Daniel Dunbar // Derived from the "link" spec. 174902633b541b04ad5ffc1c70f4c2feeeb13e607057Daniel Dunbar Args.AddAllArgs(CmdArgs, options::OPT_static); 175002633b541b04ad5ffc1c70f4c2feeeb13e607057Daniel Dunbar if (!Args.hasArg(options::OPT_static)) 175102633b541b04ad5ffc1c70f4c2feeeb13e607057Daniel Dunbar CmdArgs.push_back("-dynamic"); 175202633b541b04ad5ffc1c70f4c2feeeb13e607057Daniel Dunbar if (Args.hasArg(options::OPT_fgnu_runtime)) { 175302633b541b04ad5ffc1c70f4c2feeeb13e607057Daniel Dunbar // FIXME: gcc replaces -lobjc in forward args with -lobjc-gnu 175402633b541b04ad5ffc1c70f4c2feeeb13e607057Daniel Dunbar // here. How do we wish to handle such things? 175502633b541b04ad5ffc1c70f4c2feeeb13e607057Daniel Dunbar } 1756c21c485b4fb58ef5d55cf3e523263dd824a2ace4Daniel Dunbar 175702633b541b04ad5ffc1c70f4c2feeeb13e607057Daniel Dunbar if (!Args.hasArg(options::OPT_dynamiclib)) { 175802633b541b04ad5ffc1c70f4c2feeeb13e607057Daniel Dunbar if (Args.hasArg(options::OPT_force__cpusubtype__ALL)) { 175902633b541b04ad5ffc1c70f4c2feeeb13e607057Daniel Dunbar AddDarwinArch(Args, CmdArgs); 176002633b541b04ad5ffc1c70f4c2feeeb13e607057Daniel Dunbar CmdArgs.push_back("-force_cpusubtype_ALL"); 176102633b541b04ad5ffc1c70f4c2feeeb13e607057Daniel Dunbar } else 176202633b541b04ad5ffc1c70f4c2feeeb13e607057Daniel Dunbar AddDarwinSubArch(Args, CmdArgs); 176302633b541b04ad5ffc1c70f4c2feeeb13e607057Daniel Dunbar 176402633b541b04ad5ffc1c70f4c2feeeb13e607057Daniel Dunbar Args.AddLastArg(CmdArgs, options::OPT_bundle); 176502633b541b04ad5ffc1c70f4c2feeeb13e607057Daniel Dunbar Args.AddAllArgs(CmdArgs, options::OPT_bundle__loader); 176602633b541b04ad5ffc1c70f4c2feeeb13e607057Daniel Dunbar Args.AddAllArgs(CmdArgs, options::OPT_client__name); 176702633b541b04ad5ffc1c70f4c2feeeb13e607057Daniel Dunbar 176802633b541b04ad5ffc1c70f4c2feeeb13e607057Daniel Dunbar Arg *A; 176902633b541b04ad5ffc1c70f4c2feeeb13e607057Daniel Dunbar if ((A = Args.getLastArg(options::OPT_compatibility__version)) || 177002633b541b04ad5ffc1c70f4c2feeeb13e607057Daniel Dunbar (A = Args.getLastArg(options::OPT_current__version)) || 177102633b541b04ad5ffc1c70f4c2feeeb13e607057Daniel Dunbar (A = Args.getLastArg(options::OPT_install__name))) 177202633b541b04ad5ffc1c70f4c2feeeb13e607057Daniel Dunbar D.Diag(clang::diag::err_drv_argument_only_allowed_with) 177302633b541b04ad5ffc1c70f4c2feeeb13e607057Daniel Dunbar << A->getAsString(Args) << "-dynamiclib"; 177402633b541b04ad5ffc1c70f4c2feeeb13e607057Daniel Dunbar 177502633b541b04ad5ffc1c70f4c2feeeb13e607057Daniel Dunbar Args.AddLastArg(CmdArgs, options::OPT_force__flat__namespace); 177602633b541b04ad5ffc1c70f4c2feeeb13e607057Daniel Dunbar Args.AddLastArg(CmdArgs, options::OPT_keep__private__externs); 177702633b541b04ad5ffc1c70f4c2feeeb13e607057Daniel Dunbar Args.AddLastArg(CmdArgs, options::OPT_private__bundle); 177802633b541b04ad5ffc1c70f4c2feeeb13e607057Daniel Dunbar } else { 177902633b541b04ad5ffc1c70f4c2feeeb13e607057Daniel Dunbar CmdArgs.push_back("-dylib"); 178002633b541b04ad5ffc1c70f4c2feeeb13e607057Daniel Dunbar 178102633b541b04ad5ffc1c70f4c2feeeb13e607057Daniel Dunbar Arg *A; 178202633b541b04ad5ffc1c70f4c2feeeb13e607057Daniel Dunbar if ((A = Args.getLastArg(options::OPT_bundle)) || 178302633b541b04ad5ffc1c70f4c2feeeb13e607057Daniel Dunbar (A = Args.getLastArg(options::OPT_bundle__loader)) || 178402633b541b04ad5ffc1c70f4c2feeeb13e607057Daniel Dunbar (A = Args.getLastArg(options::OPT_client__name)) || 178502633b541b04ad5ffc1c70f4c2feeeb13e607057Daniel Dunbar (A = Args.getLastArg(options::OPT_force__flat__namespace)) || 178602633b541b04ad5ffc1c70f4c2feeeb13e607057Daniel Dunbar (A = Args.getLastArg(options::OPT_keep__private__externs)) || 178702633b541b04ad5ffc1c70f4c2feeeb13e607057Daniel Dunbar (A = Args.getLastArg(options::OPT_private__bundle))) 178802633b541b04ad5ffc1c70f4c2feeeb13e607057Daniel Dunbar D.Diag(clang::diag::err_drv_argument_not_allowed_with) 178902633b541b04ad5ffc1c70f4c2feeeb13e607057Daniel Dunbar << A->getAsString(Args) << "-dynamiclib"; 1790c21c485b4fb58ef5d55cf3e523263dd824a2ace4Daniel Dunbar 179102633b541b04ad5ffc1c70f4c2feeeb13e607057Daniel Dunbar Args.AddAllArgsTranslated(CmdArgs, options::OPT_compatibility__version, 179202633b541b04ad5ffc1c70f4c2feeeb13e607057Daniel Dunbar "-dylib_compatibility_version"); 179302633b541b04ad5ffc1c70f4c2feeeb13e607057Daniel Dunbar Args.AddAllArgsTranslated(CmdArgs, options::OPT_current__version, 179402633b541b04ad5ffc1c70f4c2feeeb13e607057Daniel Dunbar "-dylib_current_version"); 179502633b541b04ad5ffc1c70f4c2feeeb13e607057Daniel Dunbar 179602633b541b04ad5ffc1c70f4c2feeeb13e607057Daniel Dunbar if (Args.hasArg(options::OPT_force__cpusubtype__ALL)) { 179702633b541b04ad5ffc1c70f4c2feeeb13e607057Daniel Dunbar AddDarwinArch(Args, CmdArgs); 1798c21c485b4fb58ef5d55cf3e523263dd824a2ace4Daniel Dunbar // NOTE: We don't add -force_cpusubtype_ALL on this path. Ok. 179902633b541b04ad5ffc1c70f4c2feeeb13e607057Daniel Dunbar } else 180002633b541b04ad5ffc1c70f4c2feeeb13e607057Daniel Dunbar AddDarwinSubArch(Args, CmdArgs); 180102633b541b04ad5ffc1c70f4c2feeeb13e607057Daniel Dunbar 180202633b541b04ad5ffc1c70f4c2feeeb13e607057Daniel Dunbar Args.AddAllArgsTranslated(CmdArgs, options::OPT_install__name, 180302633b541b04ad5ffc1c70f4c2feeeb13e607057Daniel Dunbar "-dylib_install_name"); 180402633b541b04ad5ffc1c70f4c2feeeb13e607057Daniel Dunbar } 180502633b541b04ad5ffc1c70f4c2feeeb13e607057Daniel Dunbar 180602633b541b04ad5ffc1c70f4c2feeeb13e607057Daniel Dunbar Args.AddLastArg(CmdArgs, options::OPT_all__load); 180702633b541b04ad5ffc1c70f4c2feeeb13e607057Daniel Dunbar Args.AddAllArgs(CmdArgs, options::OPT_allowable__client); 180802633b541b04ad5ffc1c70f4c2feeeb13e607057Daniel Dunbar Args.AddLastArg(CmdArgs, options::OPT_bind__at__load); 1809d82f8fa53771b454885c546f0fd452a4980b3a3eDaniel Dunbar if (getDarwinToolChain().isIPhone()) 1810d82f8fa53771b454885c546f0fd452a4980b3a3eDaniel Dunbar Args.AddLastArg(CmdArgs, options::OPT_arch__errors__fatal); 181102633b541b04ad5ffc1c70f4c2feeeb13e607057Daniel Dunbar Args.AddLastArg(CmdArgs, options::OPT_dead__strip); 181202633b541b04ad5ffc1c70f4c2feeeb13e607057Daniel Dunbar Args.AddLastArg(CmdArgs, options::OPT_no__dead__strip__inits__and__terms); 181302633b541b04ad5ffc1c70f4c2feeeb13e607057Daniel Dunbar Args.AddAllArgs(CmdArgs, options::OPT_dylib__file); 181402633b541b04ad5ffc1c70f4c2feeeb13e607057Daniel Dunbar Args.AddLastArg(CmdArgs, options::OPT_dynamic); 181502633b541b04ad5ffc1c70f4c2feeeb13e607057Daniel Dunbar Args.AddAllArgs(CmdArgs, options::OPT_exported__symbols__list); 181602633b541b04ad5ffc1c70f4c2feeeb13e607057Daniel Dunbar Args.AddLastArg(CmdArgs, options::OPT_flat__namespace); 181702633b541b04ad5ffc1c70f4c2feeeb13e607057Daniel Dunbar Args.AddAllArgs(CmdArgs, options::OPT_headerpad__max__install__names); 181802633b541b04ad5ffc1c70f4c2feeeb13e607057Daniel Dunbar Args.AddAllArgs(CmdArgs, options::OPT_image__base); 181902633b541b04ad5ffc1c70f4c2feeeb13e607057Daniel Dunbar Args.AddAllArgs(CmdArgs, options::OPT_init); 182002633b541b04ad5ffc1c70f4c2feeeb13e607057Daniel Dunbar 182130392de4681602f1aabc61b0184b1de53bc172f0Daniel Dunbar if (!Args.hasArg(options::OPT_mmacosx_version_min_EQ) && 182230392de4681602f1aabc61b0184b1de53bc172f0Daniel Dunbar !Args.hasArg(options::OPT_miphoneos_version_min_EQ)) { 182330392de4681602f1aabc61b0184b1de53bc172f0Daniel Dunbar // Add default version min. 182430392de4681602f1aabc61b0184b1de53bc172f0Daniel Dunbar if (!getDarwinToolChain().isIPhone()) { 1825c21c485b4fb58ef5d55cf3e523263dd824a2ace4Daniel Dunbar CmdArgs.push_back("-macosx_version_min"); 1826c21c485b4fb58ef5d55cf3e523263dd824a2ace4Daniel Dunbar CmdArgs.push_back(getDarwinToolChain().getMacosxVersionStr()); 182730392de4681602f1aabc61b0184b1de53bc172f0Daniel Dunbar } else { 182830392de4681602f1aabc61b0184b1de53bc172f0Daniel Dunbar CmdArgs.push_back("-iphoneos_version_min"); 182930392de4681602f1aabc61b0184b1de53bc172f0Daniel Dunbar CmdArgs.push_back(getDarwinToolChain().getIPhoneOSVersionStr()); 1830c21c485b4fb58ef5d55cf3e523263dd824a2ace4Daniel Dunbar } 183102633b541b04ad5ffc1c70f4c2feeeb13e607057Daniel Dunbar } 183202633b541b04ad5ffc1c70f4c2feeeb13e607057Daniel Dunbar 183330392de4681602f1aabc61b0184b1de53bc172f0Daniel Dunbar // Adding all arguments doesn't make sense here but this is what 183430392de4681602f1aabc61b0184b1de53bc172f0Daniel Dunbar // gcc does. 183530392de4681602f1aabc61b0184b1de53bc172f0Daniel Dunbar Args.AddAllArgsTranslated(CmdArgs, options::OPT_mmacosx_version_min_EQ, 183630392de4681602f1aabc61b0184b1de53bc172f0Daniel Dunbar "-macosx_version_min"); 183702633b541b04ad5ffc1c70f4c2feeeb13e607057Daniel Dunbar Args.AddAllArgsTranslated(CmdArgs, options::OPT_miphoneos_version_min_EQ, 183802633b541b04ad5ffc1c70f4c2feeeb13e607057Daniel Dunbar "-iphoneos_version_min"); 183902633b541b04ad5ffc1c70f4c2feeeb13e607057Daniel Dunbar Args.AddLastArg(CmdArgs, options::OPT_nomultidefs); 184002633b541b04ad5ffc1c70f4c2feeeb13e607057Daniel Dunbar Args.AddLastArg(CmdArgs, options::OPT_multi__module); 184102633b541b04ad5ffc1c70f4c2feeeb13e607057Daniel Dunbar Args.AddLastArg(CmdArgs, options::OPT_single__module); 184202633b541b04ad5ffc1c70f4c2feeeb13e607057Daniel Dunbar Args.AddAllArgs(CmdArgs, options::OPT_multiply__defined); 184302633b541b04ad5ffc1c70f4c2feeeb13e607057Daniel Dunbar Args.AddAllArgs(CmdArgs, options::OPT_multiply__defined__unused); 1844c21c485b4fb58ef5d55cf3e523263dd824a2ace4Daniel Dunbar 184502633b541b04ad5ffc1c70f4c2feeeb13e607057Daniel Dunbar if (Args.hasArg(options::OPT_fpie)) 184602633b541b04ad5ffc1c70f4c2feeeb13e607057Daniel Dunbar CmdArgs.push_back("-pie"); 184702633b541b04ad5ffc1c70f4c2feeeb13e607057Daniel Dunbar 184802633b541b04ad5ffc1c70f4c2feeeb13e607057Daniel Dunbar Args.AddLastArg(CmdArgs, options::OPT_prebind); 184902633b541b04ad5ffc1c70f4c2feeeb13e607057Daniel Dunbar Args.AddLastArg(CmdArgs, options::OPT_noprebind); 185002633b541b04ad5ffc1c70f4c2feeeb13e607057Daniel Dunbar Args.AddLastArg(CmdArgs, options::OPT_nofixprebinding); 185102633b541b04ad5ffc1c70f4c2feeeb13e607057Daniel Dunbar Args.AddLastArg(CmdArgs, options::OPT_prebind__all__twolevel__modules); 185202633b541b04ad5ffc1c70f4c2feeeb13e607057Daniel Dunbar Args.AddLastArg(CmdArgs, options::OPT_read__only__relocs); 185302633b541b04ad5ffc1c70f4c2feeeb13e607057Daniel Dunbar Args.AddAllArgs(CmdArgs, options::OPT_sectcreate); 185402633b541b04ad5ffc1c70f4c2feeeb13e607057Daniel Dunbar Args.AddAllArgs(CmdArgs, options::OPT_sectorder); 185502633b541b04ad5ffc1c70f4c2feeeb13e607057Daniel Dunbar Args.AddAllArgs(CmdArgs, options::OPT_seg1addr); 185602633b541b04ad5ffc1c70f4c2feeeb13e607057Daniel Dunbar Args.AddAllArgs(CmdArgs, options::OPT_segprot); 185702633b541b04ad5ffc1c70f4c2feeeb13e607057Daniel Dunbar Args.AddAllArgs(CmdArgs, options::OPT_segaddr); 185802633b541b04ad5ffc1c70f4c2feeeb13e607057Daniel Dunbar Args.AddAllArgs(CmdArgs, options::OPT_segs__read__only__addr); 185902633b541b04ad5ffc1c70f4c2feeeb13e607057Daniel Dunbar Args.AddAllArgs(CmdArgs, options::OPT_segs__read__write__addr); 186002633b541b04ad5ffc1c70f4c2feeeb13e607057Daniel Dunbar Args.AddAllArgs(CmdArgs, options::OPT_seg__addr__table); 186102633b541b04ad5ffc1c70f4c2feeeb13e607057Daniel Dunbar Args.AddAllArgs(CmdArgs, options::OPT_seg__addr__table__filename); 186202633b541b04ad5ffc1c70f4c2feeeb13e607057Daniel Dunbar Args.AddAllArgs(CmdArgs, options::OPT_sub__library); 186302633b541b04ad5ffc1c70f4c2feeeb13e607057Daniel Dunbar Args.AddAllArgs(CmdArgs, options::OPT_sub__umbrella); 1864d82f8fa53771b454885c546f0fd452a4980b3a3eDaniel Dunbar 186502633b541b04ad5ffc1c70f4c2feeeb13e607057Daniel Dunbar Args.AddAllArgsTranslated(CmdArgs, options::OPT_isysroot, "-syslibroot"); 1866d82f8fa53771b454885c546f0fd452a4980b3a3eDaniel Dunbar if (getDarwinToolChain().isIPhone()) { 1867d82f8fa53771b454885c546f0fd452a4980b3a3eDaniel Dunbar if (!Args.hasArg(options::OPT_isysroot)) { 1868d82f8fa53771b454885c546f0fd452a4980b3a3eDaniel Dunbar CmdArgs.push_back("-syslibroot"); 1869d82f8fa53771b454885c546f0fd452a4980b3a3eDaniel Dunbar CmdArgs.push_back("/Developer/SDKs/Extra"); 1870d82f8fa53771b454885c546f0fd452a4980b3a3eDaniel Dunbar } 1871d82f8fa53771b454885c546f0fd452a4980b3a3eDaniel Dunbar } 1872d82f8fa53771b454885c546f0fd452a4980b3a3eDaniel Dunbar 187302633b541b04ad5ffc1c70f4c2feeeb13e607057Daniel Dunbar Args.AddLastArg(CmdArgs, options::OPT_twolevel__namespace); 187402633b541b04ad5ffc1c70f4c2feeeb13e607057Daniel Dunbar Args.AddLastArg(CmdArgs, options::OPT_twolevel__namespace__hints); 187502633b541b04ad5ffc1c70f4c2feeeb13e607057Daniel Dunbar Args.AddAllArgs(CmdArgs, options::OPT_umbrella); 187602633b541b04ad5ffc1c70f4c2feeeb13e607057Daniel Dunbar Args.AddAllArgs(CmdArgs, options::OPT_undefined); 187702633b541b04ad5ffc1c70f4c2feeeb13e607057Daniel Dunbar Args.AddAllArgs(CmdArgs, options::OPT_unexported__symbols__list); 187802633b541b04ad5ffc1c70f4c2feeeb13e607057Daniel Dunbar 1879d82f8fa53771b454885c546f0fd452a4980b3a3eDaniel Dunbar Args.AddAllArgs(CmdArgs, options::OPT_weak__reference__mismatches); 188002633b541b04ad5ffc1c70f4c2feeeb13e607057Daniel Dunbar if (!Args.hasArg(options::OPT_weak__reference__mismatches)) { 188102633b541b04ad5ffc1c70f4c2feeeb13e607057Daniel Dunbar CmdArgs.push_back("-weak_reference_mismatches"); 188202633b541b04ad5ffc1c70f4c2feeeb13e607057Daniel Dunbar CmdArgs.push_back("non-weak"); 188302633b541b04ad5ffc1c70f4c2feeeb13e607057Daniel Dunbar } 188402633b541b04ad5ffc1c70f4c2feeeb13e607057Daniel Dunbar 188502633b541b04ad5ffc1c70f4c2feeeb13e607057Daniel Dunbar Args.AddLastArg(CmdArgs, options::OPT_X_Flag); 188602633b541b04ad5ffc1c70f4c2feeeb13e607057Daniel Dunbar Args.AddAllArgs(CmdArgs, options::OPT_y); 188702633b541b04ad5ffc1c70f4c2feeeb13e607057Daniel Dunbar Args.AddLastArg(CmdArgs, options::OPT_w); 188802633b541b04ad5ffc1c70f4c2feeeb13e607057Daniel Dunbar Args.AddAllArgs(CmdArgs, options::OPT_pagezero__size); 188902633b541b04ad5ffc1c70f4c2feeeb13e607057Daniel Dunbar Args.AddAllArgs(CmdArgs, options::OPT_segs__read__); 189002633b541b04ad5ffc1c70f4c2feeeb13e607057Daniel Dunbar Args.AddLastArg(CmdArgs, options::OPT_seglinkedit); 189102633b541b04ad5ffc1c70f4c2feeeb13e607057Daniel Dunbar Args.AddLastArg(CmdArgs, options::OPT_noseglinkedit); 189202633b541b04ad5ffc1c70f4c2feeeb13e607057Daniel Dunbar Args.AddAllArgs(CmdArgs, options::OPT_sectalign); 189302633b541b04ad5ffc1c70f4c2feeeb13e607057Daniel Dunbar Args.AddAllArgs(CmdArgs, options::OPT_sectobjectsymbols); 189402633b541b04ad5ffc1c70f4c2feeeb13e607057Daniel Dunbar Args.AddAllArgs(CmdArgs, options::OPT_segcreate); 189502633b541b04ad5ffc1c70f4c2feeeb13e607057Daniel Dunbar Args.AddLastArg(CmdArgs, options::OPT_whyload); 189602633b541b04ad5ffc1c70f4c2feeeb13e607057Daniel Dunbar Args.AddLastArg(CmdArgs, options::OPT_whatsloaded); 189702633b541b04ad5ffc1c70f4c2feeeb13e607057Daniel Dunbar Args.AddAllArgs(CmdArgs, options::OPT_dylinker__install__name); 189802633b541b04ad5ffc1c70f4c2feeeb13e607057Daniel Dunbar Args.AddLastArg(CmdArgs, options::OPT_dylinker); 189902633b541b04ad5ffc1c70f4c2feeeb13e607057Daniel Dunbar Args.AddLastArg(CmdArgs, options::OPT_Mach); 190002633b541b04ad5ffc1c70f4c2feeeb13e607057Daniel Dunbar} 190102633b541b04ad5ffc1c70f4c2feeeb13e607057Daniel Dunbar 190202633b541b04ad5ffc1c70f4c2feeeb13e607057Daniel Dunbarvoid darwin::Link::ConstructJob(Compilation &C, const JobAction &JA, 1903c21c485b4fb58ef5d55cf3e523263dd824a2ace4Daniel Dunbar Job &Dest, const InputInfo &Output, 1904c21c485b4fb58ef5d55cf3e523263dd824a2ace4Daniel Dunbar const InputInfoList &Inputs, 1905c21c485b4fb58ef5d55cf3e523263dd824a2ace4Daniel Dunbar const ArgList &Args, 190602633b541b04ad5ffc1c70f4c2feeeb13e607057Daniel Dunbar const char *LinkingOutput) const { 190702633b541b04ad5ffc1c70f4c2feeeb13e607057Daniel Dunbar assert(Output.getType() == types::TY_Image && "Invalid linker output type."); 1908e0be8b1729d8978de433d229c065830b95d0ae68Daniel Dunbar 190902633b541b04ad5ffc1c70f4c2feeeb13e607057Daniel Dunbar // The logic here is derived from gcc's behavior; most of which 191002633b541b04ad5ffc1c70f4c2feeeb13e607057Daniel Dunbar // comes from specs (starting with link_command). Consult gcc for 191102633b541b04ad5ffc1c70f4c2feeeb13e607057Daniel Dunbar // more information. 191202633b541b04ad5ffc1c70f4c2feeeb13e607057Daniel Dunbar ArgStringList CmdArgs; 191302633b541b04ad5ffc1c70f4c2feeeb13e607057Daniel Dunbar 191402633b541b04ad5ffc1c70f4c2feeeb13e607057Daniel Dunbar // I'm not sure why this particular decomposition exists in gcc, but 191502633b541b04ad5ffc1c70f4c2feeeb13e607057Daniel Dunbar // we follow suite for ease of comparison. 191602633b541b04ad5ffc1c70f4c2feeeb13e607057Daniel Dunbar AddLinkArgs(Args, CmdArgs); 191702633b541b04ad5ffc1c70f4c2feeeb13e607057Daniel Dunbar 191802633b541b04ad5ffc1c70f4c2feeeb13e607057Daniel Dunbar Args.AddAllArgs(CmdArgs, options::OPT_d_Flag); 191902633b541b04ad5ffc1c70f4c2feeeb13e607057Daniel Dunbar Args.AddAllArgs(CmdArgs, options::OPT_s); 192002633b541b04ad5ffc1c70f4c2feeeb13e607057Daniel Dunbar Args.AddAllArgs(CmdArgs, options::OPT_t); 192102633b541b04ad5ffc1c70f4c2feeeb13e607057Daniel Dunbar Args.AddAllArgs(CmdArgs, options::OPT_Z_Flag); 192202633b541b04ad5ffc1c70f4c2feeeb13e607057Daniel Dunbar Args.AddAllArgs(CmdArgs, options::OPT_u_Group); 192302633b541b04ad5ffc1c70f4c2feeeb13e607057Daniel Dunbar Args.AddAllArgs(CmdArgs, options::OPT_A); 192402633b541b04ad5ffc1c70f4c2feeeb13e607057Daniel Dunbar Args.AddLastArg(CmdArgs, options::OPT_e); 192502633b541b04ad5ffc1c70f4c2feeeb13e607057Daniel Dunbar Args.AddAllArgs(CmdArgs, options::OPT_m_Separate); 192602633b541b04ad5ffc1c70f4c2feeeb13e607057Daniel Dunbar Args.AddAllArgs(CmdArgs, options::OPT_r); 192702633b541b04ad5ffc1c70f4c2feeeb13e607057Daniel Dunbar 192802633b541b04ad5ffc1c70f4c2feeeb13e607057Daniel Dunbar CmdArgs.push_back("-o"); 192902633b541b04ad5ffc1c70f4c2feeeb13e607057Daniel Dunbar CmdArgs.push_back(Output.getFilename()); 193002633b541b04ad5ffc1c70f4c2feeeb13e607057Daniel Dunbar 1931ae54af2fdcf2262e778f551941541913828fde49Daniel Dunbar unsigned MacosxVersionMin[3]; 193202633b541b04ad5ffc1c70f4c2feeeb13e607057Daniel Dunbar if (Arg *A = Args.getLastArg(options::OPT_mmacosx_version_min_EQ)) { 193302633b541b04ad5ffc1c70f4c2feeeb13e607057Daniel Dunbar bool HadExtra; 1934ae54af2fdcf2262e778f551941541913828fde49Daniel Dunbar if (!Driver::GetReleaseVersion(A->getValue(Args), MacosxVersionMin[0], 1935ae54af2fdcf2262e778f551941541913828fde49Daniel Dunbar MacosxVersionMin[1], MacosxVersionMin[2], 193602633b541b04ad5ffc1c70f4c2feeeb13e607057Daniel Dunbar HadExtra) || 193702633b541b04ad5ffc1c70f4c2feeeb13e607057Daniel Dunbar HadExtra) { 193802633b541b04ad5ffc1c70f4c2feeeb13e607057Daniel Dunbar const Driver &D = getToolChain().getHost().getDriver(); 193902633b541b04ad5ffc1c70f4c2feeeb13e607057Daniel Dunbar D.Diag(clang::diag::err_drv_invalid_version_number) 194002633b541b04ad5ffc1c70f4c2feeeb13e607057Daniel Dunbar << A->getAsString(Args); 194102633b541b04ad5ffc1c70f4c2feeeb13e607057Daniel Dunbar } 194202633b541b04ad5ffc1c70f4c2feeeb13e607057Daniel Dunbar } else { 1943ae54af2fdcf2262e778f551941541913828fde49Daniel Dunbar getDarwinToolChain().getMacosxVersion(MacosxVersionMin); 194402633b541b04ad5ffc1c70f4c2feeeb13e607057Daniel Dunbar } 1945c21c485b4fb58ef5d55cf3e523263dd824a2ace4Daniel Dunbar 194602633b541b04ad5ffc1c70f4c2feeeb13e607057Daniel Dunbar if (!Args.hasArg(options::OPT_A) && 194702633b541b04ad5ffc1c70f4c2feeeb13e607057Daniel Dunbar !Args.hasArg(options::OPT_nostdlib) && 194802633b541b04ad5ffc1c70f4c2feeeb13e607057Daniel Dunbar !Args.hasArg(options::OPT_nostartfiles)) { 194902633b541b04ad5ffc1c70f4c2feeeb13e607057Daniel Dunbar // Derived from startfile spec. 195002633b541b04ad5ffc1c70f4c2feeeb13e607057Daniel Dunbar if (Args.hasArg(options::OPT_dynamiclib)) { 1951c21c485b4fb58ef5d55cf3e523263dd824a2ace4Daniel Dunbar // Derived from darwin_dylib1 spec. 1952ae54af2fdcf2262e778f551941541913828fde49Daniel Dunbar if (isMacosxVersionLT(MacosxVersionMin, 10, 5)) 195302633b541b04ad5ffc1c70f4c2feeeb13e607057Daniel Dunbar CmdArgs.push_back("-ldylib1.o"); 1954ae54af2fdcf2262e778f551941541913828fde49Daniel Dunbar else if (isMacosxVersionLT(MacosxVersionMin, 10, 6)) 195502633b541b04ad5ffc1c70f4c2feeeb13e607057Daniel Dunbar CmdArgs.push_back("-ldylib1.10.5.o"); 195602633b541b04ad5ffc1c70f4c2feeeb13e607057Daniel Dunbar } else { 195702633b541b04ad5ffc1c70f4c2feeeb13e607057Daniel Dunbar if (Args.hasArg(options::OPT_bundle)) { 19588a8d8afa3df40e9f122d2b826f1a825a66f6908dDaniel Dunbar if (!Args.hasArg(options::OPT_static)) { 19598a8d8afa3df40e9f122d2b826f1a825a66f6908dDaniel Dunbar // Derived from darwin_bundle1 spec. 1960ae54af2fdcf2262e778f551941541913828fde49Daniel Dunbar if (isMacosxVersionLT(MacosxVersionMin, 10, 6)) 19618a8d8afa3df40e9f122d2b826f1a825a66f6908dDaniel Dunbar CmdArgs.push_back("-lbundle1.o"); 19628a8d8afa3df40e9f122d2b826f1a825a66f6908dDaniel Dunbar } 196302633b541b04ad5ffc1c70f4c2feeeb13e607057Daniel Dunbar } else { 196402633b541b04ad5ffc1c70f4c2feeeb13e607057Daniel Dunbar if (Args.hasArg(options::OPT_pg)) { 196502633b541b04ad5ffc1c70f4c2feeeb13e607057Daniel Dunbar if (Args.hasArg(options::OPT_static) || 196602633b541b04ad5ffc1c70f4c2feeeb13e607057Daniel Dunbar Args.hasArg(options::OPT_object) || 196702633b541b04ad5ffc1c70f4c2feeeb13e607057Daniel Dunbar Args.hasArg(options::OPT_preload)) { 196802633b541b04ad5ffc1c70f4c2feeeb13e607057Daniel Dunbar CmdArgs.push_back("-lgcrt0.o"); 196902633b541b04ad5ffc1c70f4c2feeeb13e607057Daniel Dunbar } else { 197002633b541b04ad5ffc1c70f4c2feeeb13e607057Daniel Dunbar CmdArgs.push_back("-lgcrt1.o"); 1971c21c485b4fb58ef5d55cf3e523263dd824a2ace4Daniel Dunbar 197202633b541b04ad5ffc1c70f4c2feeeb13e607057Daniel Dunbar // darwin_crt2 spec is empty. 1973c21c485b4fb58ef5d55cf3e523263dd824a2ace4Daniel Dunbar } 197402633b541b04ad5ffc1c70f4c2feeeb13e607057Daniel Dunbar } else { 197502633b541b04ad5ffc1c70f4c2feeeb13e607057Daniel Dunbar if (Args.hasArg(options::OPT_static) || 197602633b541b04ad5ffc1c70f4c2feeeb13e607057Daniel Dunbar Args.hasArg(options::OPT_object) || 197702633b541b04ad5ffc1c70f4c2feeeb13e607057Daniel Dunbar Args.hasArg(options::OPT_preload)) { 197802633b541b04ad5ffc1c70f4c2feeeb13e607057Daniel Dunbar CmdArgs.push_back("-lcrt0.o"); 197902633b541b04ad5ffc1c70f4c2feeeb13e607057Daniel Dunbar } else { 198002633b541b04ad5ffc1c70f4c2feeeb13e607057Daniel Dunbar // Derived from darwin_crt1 spec. 1981ae33f8ff4749dd69060c70dae15e68e454dc3011Daniel Dunbar if (getDarwinToolChain().isIPhone()) { 1982ae33f8ff4749dd69060c70dae15e68e454dc3011Daniel Dunbar CmdArgs.push_back("-lcrt1.o"); 1983ae54af2fdcf2262e778f551941541913828fde49Daniel Dunbar } else if (isMacosxVersionLT(MacosxVersionMin, 10, 5)) 198402633b541b04ad5ffc1c70f4c2feeeb13e607057Daniel Dunbar CmdArgs.push_back("-lcrt1.o"); 1985ae54af2fdcf2262e778f551941541913828fde49Daniel Dunbar else if (isMacosxVersionLT(MacosxVersionMin, 10, 6)) 198602633b541b04ad5ffc1c70f4c2feeeb13e607057Daniel Dunbar CmdArgs.push_back("-lcrt1.10.5.o"); 19878a8d8afa3df40e9f122d2b826f1a825a66f6908dDaniel Dunbar else 19888a8d8afa3df40e9f122d2b826f1a825a66f6908dDaniel Dunbar CmdArgs.push_back("-lcrt1.10.6.o"); 1989c21c485b4fb58ef5d55cf3e523263dd824a2ace4Daniel Dunbar 19908a8d8afa3df40e9f122d2b826f1a825a66f6908dDaniel Dunbar // darwin_crt2 spec is empty. 199102633b541b04ad5ffc1c70f4c2feeeb13e607057Daniel Dunbar } 199202633b541b04ad5ffc1c70f4c2feeeb13e607057Daniel Dunbar } 199302633b541b04ad5ffc1c70f4c2feeeb13e607057Daniel Dunbar } 199402633b541b04ad5ffc1c70f4c2feeeb13e607057Daniel Dunbar } 199502633b541b04ad5ffc1c70f4c2feeeb13e607057Daniel Dunbar 199602633b541b04ad5ffc1c70f4c2feeeb13e607057Daniel Dunbar if (Args.hasArg(options::OPT_shared_libgcc) && 199702633b541b04ad5ffc1c70f4c2feeeb13e607057Daniel Dunbar !Args.hasArg(options::OPT_miphoneos_version_min_EQ) && 1998ae54af2fdcf2262e778f551941541913828fde49Daniel Dunbar isMacosxVersionLT(MacosxVersionMin, 10, 5)) { 1999881376467c46c5c6cc16fa6790271c2c22e1d4f1Daniel Dunbar const char *Str = 20005ed34f4c58b6ad4e21038d713c1fae31a6146ff5Daniel Dunbar Args.MakeArgString(getToolChain().GetFilePath(C, "crt3.o")); 2001881376467c46c5c6cc16fa6790271c2c22e1d4f1Daniel Dunbar CmdArgs.push_back(Str); 200202633b541b04ad5ffc1c70f4c2feeeb13e607057Daniel Dunbar } 200302633b541b04ad5ffc1c70f4c2feeeb13e607057Daniel Dunbar } 200402633b541b04ad5ffc1c70f4c2feeeb13e607057Daniel Dunbar 200502633b541b04ad5ffc1c70f4c2feeeb13e607057Daniel Dunbar Args.AddAllArgs(CmdArgs, options::OPT_L); 2006c21c485b4fb58ef5d55cf3e523263dd824a2ace4Daniel Dunbar 200702633b541b04ad5ffc1c70f4c2feeeb13e607057Daniel Dunbar if (Args.hasArg(options::OPT_fopenmp)) 200802633b541b04ad5ffc1c70f4c2feeeb13e607057Daniel Dunbar // This is more complicated in gcc... 200902633b541b04ad5ffc1c70f4c2feeeb13e607057Daniel Dunbar CmdArgs.push_back("-lgomp"); 201002633b541b04ad5ffc1c70f4c2feeeb13e607057Daniel Dunbar 20116b200b2b698b6ac9e310f2225c69c85d28ae4fb0Daniel Dunbar getDarwinToolChain().AddLinkSearchPathArgs(Args, CmdArgs); 2012c21c485b4fb58ef5d55cf3e523263dd824a2ace4Daniel Dunbar 201302633b541b04ad5ffc1c70f4c2feeeb13e607057Daniel Dunbar for (InputInfoList::const_iterator 201402633b541b04ad5ffc1c70f4c2feeeb13e607057Daniel Dunbar it = Inputs.begin(), ie = Inputs.end(); it != ie; ++it) { 201502633b541b04ad5ffc1c70f4c2feeeb13e607057Daniel Dunbar const InputInfo &II = *it; 201602633b541b04ad5ffc1c70f4c2feeeb13e607057Daniel Dunbar if (II.isFilename()) 201702633b541b04ad5ffc1c70f4c2feeeb13e607057Daniel Dunbar CmdArgs.push_back(II.getFilename()); 2018c21c485b4fb58ef5d55cf3e523263dd824a2ace4Daniel Dunbar else 201902633b541b04ad5ffc1c70f4c2feeeb13e607057Daniel Dunbar II.getInputArg().renderAsInput(Args, CmdArgs); 202002633b541b04ad5ffc1c70f4c2feeeb13e607057Daniel Dunbar } 202102633b541b04ad5ffc1c70f4c2feeeb13e607057Daniel Dunbar 202202633b541b04ad5ffc1c70f4c2feeeb13e607057Daniel Dunbar if (LinkingOutput) { 202302633b541b04ad5ffc1c70f4c2feeeb13e607057Daniel Dunbar CmdArgs.push_back("-arch_multiple"); 202402633b541b04ad5ffc1c70f4c2feeeb13e607057Daniel Dunbar CmdArgs.push_back("-final_output"); 202502633b541b04ad5ffc1c70f4c2feeeb13e607057Daniel Dunbar CmdArgs.push_back(LinkingOutput); 202602633b541b04ad5ffc1c70f4c2feeeb13e607057Daniel Dunbar } 202702633b541b04ad5ffc1c70f4c2feeeb13e607057Daniel Dunbar 202802633b541b04ad5ffc1c70f4c2feeeb13e607057Daniel Dunbar if (Args.hasArg(options::OPT_fprofile_arcs) || 202902633b541b04ad5ffc1c70f4c2feeeb13e607057Daniel Dunbar Args.hasArg(options::OPT_fprofile_generate) || 203002633b541b04ad5ffc1c70f4c2feeeb13e607057Daniel Dunbar Args.hasArg(options::OPT_fcreate_profile) || 203102633b541b04ad5ffc1c70f4c2feeeb13e607057Daniel Dunbar Args.hasArg(options::OPT_coverage)) 203202633b541b04ad5ffc1c70f4c2feeeb13e607057Daniel Dunbar CmdArgs.push_back("-lgcov"); 2033c21c485b4fb58ef5d55cf3e523263dd824a2ace4Daniel Dunbar 203402633b541b04ad5ffc1c70f4c2feeeb13e607057Daniel Dunbar if (Args.hasArg(options::OPT_fnested_functions)) 203502633b541b04ad5ffc1c70f4c2feeeb13e607057Daniel Dunbar CmdArgs.push_back("-allow_stack_execute"); 2036c21c485b4fb58ef5d55cf3e523263dd824a2ace4Daniel Dunbar 203702633b541b04ad5ffc1c70f4c2feeeb13e607057Daniel Dunbar if (!Args.hasArg(options::OPT_nostdlib) && 203802633b541b04ad5ffc1c70f4c2feeeb13e607057Daniel Dunbar !Args.hasArg(options::OPT_nodefaultlibs)) { 2039edfa02b85b186e9ea9e0c841539a77ed32ee9148Daniel Dunbar // FIXME: g++ is more complicated here, it tries to put -lstdc++ 2040edfa02b85b186e9ea9e0c841539a77ed32ee9148Daniel Dunbar // before -lm, for example. 2041edfa02b85b186e9ea9e0c841539a77ed32ee9148Daniel Dunbar if (getToolChain().getHost().getDriver().CCCIsCXX) 2042edfa02b85b186e9ea9e0c841539a77ed32ee9148Daniel Dunbar CmdArgs.push_back("-lstdc++"); 2043edfa02b85b186e9ea9e0c841539a77ed32ee9148Daniel Dunbar 204402633b541b04ad5ffc1c70f4c2feeeb13e607057Daniel Dunbar // link_ssp spec is empty. 204502633b541b04ad5ffc1c70f4c2feeeb13e607057Daniel Dunbar 20468a8d8afa3df40e9f122d2b826f1a825a66f6908dDaniel Dunbar // Derived from libgcc and lib specs but refactored. 204702633b541b04ad5ffc1c70f4c2feeeb13e607057Daniel Dunbar if (Args.hasArg(options::OPT_static)) { 204802633b541b04ad5ffc1c70f4c2feeeb13e607057Daniel Dunbar CmdArgs.push_back("-lgcc_static"); 204902633b541b04ad5ffc1c70f4c2feeeb13e607057Daniel Dunbar } else { 20508a8d8afa3df40e9f122d2b826f1a825a66f6908dDaniel Dunbar if (Args.hasArg(options::OPT_static_libgcc)) { 20518a8d8afa3df40e9f122d2b826f1a825a66f6908dDaniel Dunbar CmdArgs.push_back("-lgcc_eh"); 20528a8d8afa3df40e9f122d2b826f1a825a66f6908dDaniel Dunbar } else if (Args.hasArg(options::OPT_miphoneos_version_min_EQ)) { 20538a8d8afa3df40e9f122d2b826f1a825a66f6908dDaniel Dunbar // Derived from darwin_iphoneos_libgcc spec. 2054ae33f8ff4749dd69060c70dae15e68e454dc3011Daniel Dunbar if (getDarwinToolChain().isIPhone()) { 2055ae33f8ff4749dd69060c70dae15e68e454dc3011Daniel Dunbar CmdArgs.push_back("-lgcc_s.1"); 2056ae33f8ff4749dd69060c70dae15e68e454dc3011Daniel Dunbar } else { 2057ae33f8ff4749dd69060c70dae15e68e454dc3011Daniel Dunbar CmdArgs.push_back("-lgcc_s.10.5"); 2058ae33f8ff4749dd69060c70dae15e68e454dc3011Daniel Dunbar } 20598a8d8afa3df40e9f122d2b826f1a825a66f6908dDaniel Dunbar } else if (Args.hasArg(options::OPT_shared_libgcc) || 2060738f8c278da5950d0d4607de2debe0bdfad64185Mike Stump // FIXME: -fexceptions -fno-exceptions means no exceptions 20618a8d8afa3df40e9f122d2b826f1a825a66f6908dDaniel Dunbar Args.hasArg(options::OPT_fexceptions) || 20628a8d8afa3df40e9f122d2b826f1a825a66f6908dDaniel Dunbar Args.hasArg(options::OPT_fgnu_runtime)) { 20638a8d8afa3df40e9f122d2b826f1a825a66f6908dDaniel Dunbar // FIXME: This is probably broken on 10.3? 2064ae54af2fdcf2262e778f551941541913828fde49Daniel Dunbar if (isMacosxVersionLT(MacosxVersionMin, 10, 5)) 20658a8d8afa3df40e9f122d2b826f1a825a66f6908dDaniel Dunbar CmdArgs.push_back("-lgcc_s.10.4"); 2066ae54af2fdcf2262e778f551941541913828fde49Daniel Dunbar else if (isMacosxVersionLT(MacosxVersionMin, 10, 6)) 20678a8d8afa3df40e9f122d2b826f1a825a66f6908dDaniel Dunbar CmdArgs.push_back("-lgcc_s.10.5"); 20688a8d8afa3df40e9f122d2b826f1a825a66f6908dDaniel Dunbar } else { 2069ae54af2fdcf2262e778f551941541913828fde49Daniel Dunbar if (isMacosxVersionLT(MacosxVersionMin, 10, 3, 9)) 20708a8d8afa3df40e9f122d2b826f1a825a66f6908dDaniel Dunbar ; // Do nothing. 2071ae54af2fdcf2262e778f551941541913828fde49Daniel Dunbar else if (isMacosxVersionLT(MacosxVersionMin, 10, 5)) 20728a8d8afa3df40e9f122d2b826f1a825a66f6908dDaniel Dunbar CmdArgs.push_back("-lgcc_s.10.4"); 2073ae54af2fdcf2262e778f551941541913828fde49Daniel Dunbar else if (isMacosxVersionLT(MacosxVersionMin, 10, 6)) 20748a8d8afa3df40e9f122d2b826f1a825a66f6908dDaniel Dunbar CmdArgs.push_back("-lgcc_s.10.5"); 20758a8d8afa3df40e9f122d2b826f1a825a66f6908dDaniel Dunbar } 207602633b541b04ad5ffc1c70f4c2feeeb13e607057Daniel Dunbar 2077ae33f8ff4749dd69060c70dae15e68e454dc3011Daniel Dunbar if (getDarwinToolChain().isIPhone() || 2078ae54af2fdcf2262e778f551941541913828fde49Daniel Dunbar isMacosxVersionLT(MacosxVersionMin, 10, 6)) { 20798a8d8afa3df40e9f122d2b826f1a825a66f6908dDaniel Dunbar CmdArgs.push_back("-lgcc"); 20808a8d8afa3df40e9f122d2b826f1a825a66f6908dDaniel Dunbar CmdArgs.push_back("-lSystem"); 20818a8d8afa3df40e9f122d2b826f1a825a66f6908dDaniel Dunbar } else { 20828a8d8afa3df40e9f122d2b826f1a825a66f6908dDaniel Dunbar CmdArgs.push_back("-lSystem"); 20838a8d8afa3df40e9f122d2b826f1a825a66f6908dDaniel Dunbar CmdArgs.push_back("-lgcc"); 20848a8d8afa3df40e9f122d2b826f1a825a66f6908dDaniel Dunbar } 20858a8d8afa3df40e9f122d2b826f1a825a66f6908dDaniel Dunbar } 208602633b541b04ad5ffc1c70f4c2feeeb13e607057Daniel Dunbar } 208702633b541b04ad5ffc1c70f4c2feeeb13e607057Daniel Dunbar 208802633b541b04ad5ffc1c70f4c2feeeb13e607057Daniel Dunbar if (!Args.hasArg(options::OPT_A) && 208902633b541b04ad5ffc1c70f4c2feeeb13e607057Daniel Dunbar !Args.hasArg(options::OPT_nostdlib) && 209002633b541b04ad5ffc1c70f4c2feeeb13e607057Daniel Dunbar !Args.hasArg(options::OPT_nostartfiles)) { 209102633b541b04ad5ffc1c70f4c2feeeb13e607057Daniel Dunbar // endfile_spec is empty. 209202633b541b04ad5ffc1c70f4c2feeeb13e607057Daniel Dunbar } 209302633b541b04ad5ffc1c70f4c2feeeb13e607057Daniel Dunbar 209402633b541b04ad5ffc1c70f4c2feeeb13e607057Daniel Dunbar Args.AddAllArgs(CmdArgs, options::OPT_T_Group); 209502633b541b04ad5ffc1c70f4c2feeeb13e607057Daniel Dunbar Args.AddAllArgs(CmdArgs, options::OPT_F); 209602633b541b04ad5ffc1c70f4c2feeeb13e607057Daniel Dunbar 2097c21c485b4fb58ef5d55cf3e523263dd824a2ace4Daniel Dunbar const char *Exec = 20985ed34f4c58b6ad4e21038d713c1fae31a6146ff5Daniel Dunbar Args.MakeArgString(getToolChain().GetProgramPath(C, "ld")); 2099cae087e164e94e4286c11bf694dd0ff88f295302Daniel Dunbar Dest.addCommand(new Command(JA, Exec, CmdArgs)); 210002633b541b04ad5ffc1c70f4c2feeeb13e607057Daniel Dunbar 21010b46e1b5389615a8d6641f4d7bf5415d29acfef3Daniel Dunbar // Find the first non-empty base input (we want to ignore linker 21020b46e1b5389615a8d6641f4d7bf5415d29acfef3Daniel Dunbar // inputs). 21030b46e1b5389615a8d6641f4d7bf5415d29acfef3Daniel Dunbar const char *BaseInput = ""; 21040b46e1b5389615a8d6641f4d7bf5415d29acfef3Daniel Dunbar for (unsigned i = 0, e = Inputs.size(); i != e; ++i) { 21050b46e1b5389615a8d6641f4d7bf5415d29acfef3Daniel Dunbar if (Inputs[i].getBaseInput()[0] != '\0') { 21060b46e1b5389615a8d6641f4d7bf5415d29acfef3Daniel Dunbar BaseInput = Inputs[i].getBaseInput(); 21070b46e1b5389615a8d6641f4d7bf5415d29acfef3Daniel Dunbar break; 21080b46e1b5389615a8d6641f4d7bf5415d29acfef3Daniel Dunbar } 21090b46e1b5389615a8d6641f4d7bf5415d29acfef3Daniel Dunbar } 2110c21c485b4fb58ef5d55cf3e523263dd824a2ace4Daniel Dunbar 21113ed294522653323e4867a2eba03acc98a99e5479Daniel Dunbar // Run dsymutil if we are making an executable in a single step. 21123ed294522653323e4867a2eba03acc98a99e5479Daniel Dunbar // 21133ed294522653323e4867a2eba03acc98a99e5479Daniel Dunbar // FIXME: Currently we don't want to do this when we are part of a 21143ed294522653323e4867a2eba03acc98a99e5479Daniel Dunbar // universal build step, as this would end up creating stray temp 21153ed294522653323e4867a2eba03acc98a99e5479Daniel Dunbar // files. 21163ed294522653323e4867a2eba03acc98a99e5479Daniel Dunbar if (!LinkingOutput && 21173ed294522653323e4867a2eba03acc98a99e5479Daniel Dunbar Args.getLastArg(options::OPT_g_Group) && 211802633b541b04ad5ffc1c70f4c2feeeb13e607057Daniel Dunbar !Args.getLastArg(options::OPT_gstabs) && 211902633b541b04ad5ffc1c70f4c2feeeb13e607057Daniel Dunbar !Args.getLastArg(options::OPT_g0)) { 212002633b541b04ad5ffc1c70f4c2feeeb13e607057Daniel Dunbar // FIXME: This is gross, but matches gcc. The test only considers 212102633b541b04ad5ffc1c70f4c2feeeb13e607057Daniel Dunbar // the suffix (not the -x type), and then only of the first 21220b46e1b5389615a8d6641f4d7bf5415d29acfef3Daniel Dunbar // source input. Awesome. 21230b46e1b5389615a8d6641f4d7bf5415d29acfef3Daniel Dunbar const char *Suffix = strrchr(BaseInput, '.'); 212402633b541b04ad5ffc1c70f4c2feeeb13e607057Daniel Dunbar if (Suffix && isSourceSuffix(Suffix + 1)) { 2125c21c485b4fb58ef5d55cf3e523263dd824a2ace4Daniel Dunbar const char *Exec = 21265ed34f4c58b6ad4e21038d713c1fae31a6146ff5Daniel Dunbar Args.MakeArgString(getToolChain().GetProgramPath(C, "dsymutil")); 212702633b541b04ad5ffc1c70f4c2feeeb13e607057Daniel Dunbar ArgStringList CmdArgs; 212802633b541b04ad5ffc1c70f4c2feeeb13e607057Daniel Dunbar CmdArgs.push_back(Output.getFilename()); 2129cae087e164e94e4286c11bf694dd0ff88f295302Daniel Dunbar C.getJobs().addCommand(new Command(JA, Exec, CmdArgs)); 213002633b541b04ad5ffc1c70f4c2feeeb13e607057Daniel Dunbar } 213102633b541b04ad5ffc1c70f4c2feeeb13e607057Daniel Dunbar } 213202633b541b04ad5ffc1c70f4c2feeeb13e607057Daniel Dunbar} 213302633b541b04ad5ffc1c70f4c2feeeb13e607057Daniel Dunbar 2134ff7488dc9a766f94daf54d81b03ab9160d0bfd88Daniel Dunbarvoid darwin::Lipo::ConstructJob(Compilation &C, const JobAction &JA, 2135c21c485b4fb58ef5d55cf3e523263dd824a2ace4Daniel Dunbar Job &Dest, const InputInfo &Output, 2136c21c485b4fb58ef5d55cf3e523263dd824a2ace4Daniel Dunbar const InputInfoList &Inputs, 2137c21c485b4fb58ef5d55cf3e523263dd824a2ace4Daniel Dunbar const ArgList &Args, 2138ff7488dc9a766f94daf54d81b03ab9160d0bfd88Daniel Dunbar const char *LinkingOutput) const { 2139ff7488dc9a766f94daf54d81b03ab9160d0bfd88Daniel Dunbar ArgStringList CmdArgs; 2140ff7488dc9a766f94daf54d81b03ab9160d0bfd88Daniel Dunbar 2141ff7488dc9a766f94daf54d81b03ab9160d0bfd88Daniel Dunbar CmdArgs.push_back("-create"); 2142ff7488dc9a766f94daf54d81b03ab9160d0bfd88Daniel Dunbar assert(Output.isFilename() && "Unexpected lipo output."); 2143a428df828ea4cc6916ea90dcd9fbbc840776d207Daniel Dunbar 2144a428df828ea4cc6916ea90dcd9fbbc840776d207Daniel Dunbar CmdArgs.push_back("-output"); 2145ff7488dc9a766f94daf54d81b03ab9160d0bfd88Daniel Dunbar CmdArgs.push_back(Output.getFilename()); 2146a428df828ea4cc6916ea90dcd9fbbc840776d207Daniel Dunbar 2147ff7488dc9a766f94daf54d81b03ab9160d0bfd88Daniel Dunbar for (InputInfoList::const_iterator 2148ff7488dc9a766f94daf54d81b03ab9160d0bfd88Daniel Dunbar it = Inputs.begin(), ie = Inputs.end(); it != ie; ++it) { 2149ff7488dc9a766f94daf54d81b03ab9160d0bfd88Daniel Dunbar const InputInfo &II = *it; 2150ff7488dc9a766f94daf54d81b03ab9160d0bfd88Daniel Dunbar assert(II.isFilename() && "Unexpected lipo input."); 2151ff7488dc9a766f94daf54d81b03ab9160d0bfd88Daniel Dunbar CmdArgs.push_back(II.getFilename()); 2152ff7488dc9a766f94daf54d81b03ab9160d0bfd88Daniel Dunbar } 2153c21c485b4fb58ef5d55cf3e523263dd824a2ace4Daniel Dunbar const char *Exec = 21545ed34f4c58b6ad4e21038d713c1fae31a6146ff5Daniel Dunbar Args.MakeArgString(getToolChain().GetProgramPath(C, "lipo")); 2155cae087e164e94e4286c11bf694dd0ff88f295302Daniel Dunbar Dest.addCommand(new Command(JA, Exec, CmdArgs)); 2156ff7488dc9a766f94daf54d81b03ab9160d0bfd88Daniel Dunbar} 215768a31d406c6dc4382c700d1199b062de2aa7e1daDaniel Dunbar 2158e7925a075f110ab21afeae084670a155dea568e3Edward O'Callaghanvoid auroraux::Assemble::ConstructJob(Compilation &C, const JobAction &JA, 2159e7925a075f110ab21afeae084670a155dea568e3Edward O'Callaghan Job &Dest, const InputInfo &Output, 2160e7925a075f110ab21afeae084670a155dea568e3Edward O'Callaghan const InputInfoList &Inputs, 2161e7925a075f110ab21afeae084670a155dea568e3Edward O'Callaghan const ArgList &Args, 21621eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump const char *LinkingOutput) const { 2163e7925a075f110ab21afeae084670a155dea568e3Edward O'Callaghan ArgStringList CmdArgs; 2164e7925a075f110ab21afeae084670a155dea568e3Edward O'Callaghan 2165e7925a075f110ab21afeae084670a155dea568e3Edward O'Callaghan Args.AddAllArgValues(CmdArgs, options::OPT_Wa_COMMA, 2166e7925a075f110ab21afeae084670a155dea568e3Edward O'Callaghan options::OPT_Xassembler); 2167e7925a075f110ab21afeae084670a155dea568e3Edward O'Callaghan 2168e7925a075f110ab21afeae084670a155dea568e3Edward O'Callaghan CmdArgs.push_back("-o"); 2169e7925a075f110ab21afeae084670a155dea568e3Edward O'Callaghan if (Output.isPipe()) 2170e7925a075f110ab21afeae084670a155dea568e3Edward O'Callaghan CmdArgs.push_back("-"); 2171e7925a075f110ab21afeae084670a155dea568e3Edward O'Callaghan else 2172e7925a075f110ab21afeae084670a155dea568e3Edward O'Callaghan CmdArgs.push_back(Output.getFilename()); 2173e7925a075f110ab21afeae084670a155dea568e3Edward O'Callaghan 2174e7925a075f110ab21afeae084670a155dea568e3Edward O'Callaghan for (InputInfoList::const_iterator 2175e7925a075f110ab21afeae084670a155dea568e3Edward O'Callaghan it = Inputs.begin(), ie = Inputs.end(); it != ie; ++it) { 2176e7925a075f110ab21afeae084670a155dea568e3Edward O'Callaghan const InputInfo &II = *it; 2177e7925a075f110ab21afeae084670a155dea568e3Edward O'Callaghan if (II.isPipe()) 2178e7925a075f110ab21afeae084670a155dea568e3Edward O'Callaghan CmdArgs.push_back("-"); 2179e7925a075f110ab21afeae084670a155dea568e3Edward O'Callaghan else 2180e7925a075f110ab21afeae084670a155dea568e3Edward O'Callaghan CmdArgs.push_back(II.getFilename()); 2181e7925a075f110ab21afeae084670a155dea568e3Edward O'Callaghan } 2182e7925a075f110ab21afeae084670a155dea568e3Edward O'Callaghan 2183e7925a075f110ab21afeae084670a155dea568e3Edward O'Callaghan const char *Exec = 21845ed34f4c58b6ad4e21038d713c1fae31a6146ff5Daniel Dunbar Args.MakeArgString(getToolChain().GetProgramPath(C, "as")); 2185e7925a075f110ab21afeae084670a155dea568e3Edward O'Callaghan Dest.addCommand(new Command(JA, Exec, CmdArgs)); 2186e7925a075f110ab21afeae084670a155dea568e3Edward O'Callaghan} 2187e7925a075f110ab21afeae084670a155dea568e3Edward O'Callaghan 2188e7925a075f110ab21afeae084670a155dea568e3Edward O'Callaghanvoid auroraux::Link::ConstructJob(Compilation &C, const JobAction &JA, 2189e7925a075f110ab21afeae084670a155dea568e3Edward O'Callaghan Job &Dest, const InputInfo &Output, 2190e7925a075f110ab21afeae084670a155dea568e3Edward O'Callaghan const InputInfoList &Inputs, 2191e7925a075f110ab21afeae084670a155dea568e3Edward O'Callaghan const ArgList &Args, 2192e7925a075f110ab21afeae084670a155dea568e3Edward O'Callaghan const char *LinkingOutput) const { 2193e7925a075f110ab21afeae084670a155dea568e3Edward O'Callaghan const Driver &D = getToolChain().getHost().getDriver(); 2194e7925a075f110ab21afeae084670a155dea568e3Edward O'Callaghan ArgStringList CmdArgs; 2195e7925a075f110ab21afeae084670a155dea568e3Edward O'Callaghan 2196e7925a075f110ab21afeae084670a155dea568e3Edward O'Callaghan if ((!Args.hasArg(options::OPT_nostdlib)) && 2197e7925a075f110ab21afeae084670a155dea568e3Edward O'Callaghan (!Args.hasArg(options::OPT_shared))) { 2198e7925a075f110ab21afeae084670a155dea568e3Edward O'Callaghan CmdArgs.push_back("-e"); 2199e7925a075f110ab21afeae084670a155dea568e3Edward O'Callaghan CmdArgs.push_back("__start"); 2200e7925a075f110ab21afeae084670a155dea568e3Edward O'Callaghan } 2201e7925a075f110ab21afeae084670a155dea568e3Edward O'Callaghan 2202e7925a075f110ab21afeae084670a155dea568e3Edward O'Callaghan if (Args.hasArg(options::OPT_static)) { 2203e7925a075f110ab21afeae084670a155dea568e3Edward O'Callaghan CmdArgs.push_back("-Bstatic"); 2204e7925a075f110ab21afeae084670a155dea568e3Edward O'Callaghan } else { 2205e7925a075f110ab21afeae084670a155dea568e3Edward O'Callaghan CmdArgs.push_back("--eh-frame-hdr"); 2206e7925a075f110ab21afeae084670a155dea568e3Edward O'Callaghan CmdArgs.push_back("-Bdynamic"); 2207e7925a075f110ab21afeae084670a155dea568e3Edward O'Callaghan if (Args.hasArg(options::OPT_shared)) { 2208e7925a075f110ab21afeae084670a155dea568e3Edward O'Callaghan CmdArgs.push_back("-shared"); 2209e7925a075f110ab21afeae084670a155dea568e3Edward O'Callaghan } else { 2210e7925a075f110ab21afeae084670a155dea568e3Edward O'Callaghan CmdArgs.push_back("-dynamic-linker"); 2211e7925a075f110ab21afeae084670a155dea568e3Edward O'Callaghan CmdArgs.push_back("/lib/ld.so.1"); // 64Bit Path /lib/amd64/ld.so.1 2212e7925a075f110ab21afeae084670a155dea568e3Edward O'Callaghan } 2213e7925a075f110ab21afeae084670a155dea568e3Edward O'Callaghan } 2214e7925a075f110ab21afeae084670a155dea568e3Edward O'Callaghan 2215e7925a075f110ab21afeae084670a155dea568e3Edward O'Callaghan if (Output.isPipe()) { 2216e7925a075f110ab21afeae084670a155dea568e3Edward O'Callaghan CmdArgs.push_back("-o"); 2217e7925a075f110ab21afeae084670a155dea568e3Edward O'Callaghan CmdArgs.push_back("-"); 2218e7925a075f110ab21afeae084670a155dea568e3Edward O'Callaghan } else if (Output.isFilename()) { 2219e7925a075f110ab21afeae084670a155dea568e3Edward O'Callaghan CmdArgs.push_back("-o"); 2220e7925a075f110ab21afeae084670a155dea568e3Edward O'Callaghan CmdArgs.push_back(Output.getFilename()); 2221e7925a075f110ab21afeae084670a155dea568e3Edward O'Callaghan } else { 2222e7925a075f110ab21afeae084670a155dea568e3Edward O'Callaghan assert(Output.isNothing() && "Invalid output."); 2223e7925a075f110ab21afeae084670a155dea568e3Edward O'Callaghan } 2224e7925a075f110ab21afeae084670a155dea568e3Edward O'Callaghan 2225e7925a075f110ab21afeae084670a155dea568e3Edward O'Callaghan if (!Args.hasArg(options::OPT_nostdlib) && 2226e7925a075f110ab21afeae084670a155dea568e3Edward O'Callaghan !Args.hasArg(options::OPT_nostartfiles)) { 2227e7925a075f110ab21afeae084670a155dea568e3Edward O'Callaghan if (!Args.hasArg(options::OPT_shared)) { 22285ed34f4c58b6ad4e21038d713c1fae31a6146ff5Daniel Dunbar CmdArgs.push_back(Args.MakeArgString(getToolChain().GetFilePath(C, "crt0.o"))); 22295ed34f4c58b6ad4e21038d713c1fae31a6146ff5Daniel Dunbar CmdArgs.push_back(Args.MakeArgString(getToolChain().GetFilePath(C, "crtbegin.o"))); 2230e7925a075f110ab21afeae084670a155dea568e3Edward O'Callaghan } else { 22315ed34f4c58b6ad4e21038d713c1fae31a6146ff5Daniel Dunbar CmdArgs.push_back(Args.MakeArgString(getToolChain().GetFilePath(C, "crtbeginS.o"))); 2232e7925a075f110ab21afeae084670a155dea568e3Edward O'Callaghan } 2233e7925a075f110ab21afeae084670a155dea568e3Edward O'Callaghan } 2234e7925a075f110ab21afeae084670a155dea568e3Edward O'Callaghan 2235e7925a075f110ab21afeae084670a155dea568e3Edward O'Callaghan CmdArgs.push_back(MakeFormattedString(Args, 2236e7925a075f110ab21afeae084670a155dea568e3Edward O'Callaghan llvm::format("-L/opt/gcc4/lib/gcc/%s/4.2.4", 2237e7925a075f110ab21afeae084670a155dea568e3Edward O'Callaghan getToolChain().getTripleString().c_str()))); 2238e7925a075f110ab21afeae084670a155dea568e3Edward O'Callaghan 2239e7925a075f110ab21afeae084670a155dea568e3Edward O'Callaghan Args.AddAllArgs(CmdArgs, options::OPT_L); 2240e7925a075f110ab21afeae084670a155dea568e3Edward O'Callaghan Args.AddAllArgs(CmdArgs, options::OPT_T_Group); 2241e7925a075f110ab21afeae084670a155dea568e3Edward O'Callaghan Args.AddAllArgs(CmdArgs, options::OPT_e); 2242e7925a075f110ab21afeae084670a155dea568e3Edward O'Callaghan 2243e7925a075f110ab21afeae084670a155dea568e3Edward O'Callaghan for (InputInfoList::const_iterator 2244e7925a075f110ab21afeae084670a155dea568e3Edward O'Callaghan it = Inputs.begin(), ie = Inputs.end(); it != ie; ++it) { 2245e7925a075f110ab21afeae084670a155dea568e3Edward O'Callaghan const InputInfo &II = *it; 2246e7925a075f110ab21afeae084670a155dea568e3Edward O'Callaghan 2247e7925a075f110ab21afeae084670a155dea568e3Edward O'Callaghan // Don't try to pass LLVM inputs to a generic gcc. 2248e7925a075f110ab21afeae084670a155dea568e3Edward O'Callaghan if (II.getType() == types::TY_LLVMBC) 2249e7925a075f110ab21afeae084670a155dea568e3Edward O'Callaghan D.Diag(clang::diag::err_drv_no_linker_llvm_support) 2250881376467c46c5c6cc16fa6790271c2c22e1d4f1Daniel Dunbar << getToolChain().getTripleString(); 2251e7925a075f110ab21afeae084670a155dea568e3Edward O'Callaghan 2252e7925a075f110ab21afeae084670a155dea568e3Edward O'Callaghan if (II.isPipe()) 2253e7925a075f110ab21afeae084670a155dea568e3Edward O'Callaghan CmdArgs.push_back("-"); 2254e7925a075f110ab21afeae084670a155dea568e3Edward O'Callaghan else if (II.isFilename()) 2255e7925a075f110ab21afeae084670a155dea568e3Edward O'Callaghan CmdArgs.push_back(II.getFilename()); 2256e7925a075f110ab21afeae084670a155dea568e3Edward O'Callaghan else 2257e7925a075f110ab21afeae084670a155dea568e3Edward O'Callaghan II.getInputArg().renderAsInput(Args, CmdArgs); 2258e7925a075f110ab21afeae084670a155dea568e3Edward O'Callaghan } 2259e7925a075f110ab21afeae084670a155dea568e3Edward O'Callaghan 2260e7925a075f110ab21afeae084670a155dea568e3Edward O'Callaghan if (!Args.hasArg(options::OPT_nostdlib) && 2261e7925a075f110ab21afeae084670a155dea568e3Edward O'Callaghan !Args.hasArg(options::OPT_nodefaultlibs)) { 2262e7925a075f110ab21afeae084670a155dea568e3Edward O'Callaghan // FIXME: For some reason GCC passes -lgcc before adding 2263e7925a075f110ab21afeae084670a155dea568e3Edward O'Callaghan // the default system libraries. Just mimic this for now. 2264e7925a075f110ab21afeae084670a155dea568e3Edward O'Callaghan CmdArgs.push_back("-lgcc"); 2265e7925a075f110ab21afeae084670a155dea568e3Edward O'Callaghan 2266e7925a075f110ab21afeae084670a155dea568e3Edward O'Callaghan if (Args.hasArg(options::OPT_pthread)) 2267e7925a075f110ab21afeae084670a155dea568e3Edward O'Callaghan CmdArgs.push_back("-pthread"); 2268e7925a075f110ab21afeae084670a155dea568e3Edward O'Callaghan if (!Args.hasArg(options::OPT_shared)) 2269e7925a075f110ab21afeae084670a155dea568e3Edward O'Callaghan CmdArgs.push_back("-lc"); 2270e7925a075f110ab21afeae084670a155dea568e3Edward O'Callaghan CmdArgs.push_back("-lgcc"); 2271e7925a075f110ab21afeae084670a155dea568e3Edward O'Callaghan } 2272e7925a075f110ab21afeae084670a155dea568e3Edward O'Callaghan 2273e7925a075f110ab21afeae084670a155dea568e3Edward O'Callaghan if (!Args.hasArg(options::OPT_nostdlib) && 2274e7925a075f110ab21afeae084670a155dea568e3Edward O'Callaghan !Args.hasArg(options::OPT_nostartfiles)) { 2275e7925a075f110ab21afeae084670a155dea568e3Edward O'Callaghan if (!Args.hasArg(options::OPT_shared)) 22765ed34f4c58b6ad4e21038d713c1fae31a6146ff5Daniel Dunbar CmdArgs.push_back(Args.MakeArgString(getToolChain().GetFilePath(C, "crtend.o"))); 2277e7925a075f110ab21afeae084670a155dea568e3Edward O'Callaghan else 22785ed34f4c58b6ad4e21038d713c1fae31a6146ff5Daniel Dunbar CmdArgs.push_back(Args.MakeArgString(getToolChain().GetFilePath(C, "crtendS.o"))); 2279e7925a075f110ab21afeae084670a155dea568e3Edward O'Callaghan } 2280e7925a075f110ab21afeae084670a155dea568e3Edward O'Callaghan 2281e7925a075f110ab21afeae084670a155dea568e3Edward O'Callaghan const char *Exec = 22825ed34f4c58b6ad4e21038d713c1fae31a6146ff5Daniel Dunbar Args.MakeArgString(getToolChain().GetProgramPath(C, "ld")); 2283e7925a075f110ab21afeae084670a155dea568e3Edward O'Callaghan Dest.addCommand(new Command(JA, Exec, CmdArgs)); 2284e7925a075f110ab21afeae084670a155dea568e3Edward O'Callaghan} 2285e7925a075f110ab21afeae084670a155dea568e3Edward O'Callaghan 2286f7b8eec37c8c8012fa525c71fb29a58c9f29beefDaniel Dunbarvoid openbsd::Assemble::ConstructJob(Compilation &C, const JobAction &JA, 2287f7b8eec37c8c8012fa525c71fb29a58c9f29beefDaniel Dunbar Job &Dest, const InputInfo &Output, 2288f7b8eec37c8c8012fa525c71fb29a58c9f29beefDaniel Dunbar const InputInfoList &Inputs, 2289f7b8eec37c8c8012fa525c71fb29a58c9f29beefDaniel Dunbar const ArgList &Args, 22901eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump const char *LinkingOutput) const { 2291f7b8eec37c8c8012fa525c71fb29a58c9f29beefDaniel Dunbar ArgStringList CmdArgs; 2292f7b8eec37c8c8012fa525c71fb29a58c9f29beefDaniel Dunbar 2293f7b8eec37c8c8012fa525c71fb29a58c9f29beefDaniel Dunbar Args.AddAllArgValues(CmdArgs, options::OPT_Wa_COMMA, 2294f7b8eec37c8c8012fa525c71fb29a58c9f29beefDaniel Dunbar options::OPT_Xassembler); 2295f7b8eec37c8c8012fa525c71fb29a58c9f29beefDaniel Dunbar 2296f7b8eec37c8c8012fa525c71fb29a58c9f29beefDaniel Dunbar CmdArgs.push_back("-o"); 2297f7b8eec37c8c8012fa525c71fb29a58c9f29beefDaniel Dunbar if (Output.isPipe()) 2298f7b8eec37c8c8012fa525c71fb29a58c9f29beefDaniel Dunbar CmdArgs.push_back("-"); 2299f7b8eec37c8c8012fa525c71fb29a58c9f29beefDaniel Dunbar else 2300f7b8eec37c8c8012fa525c71fb29a58c9f29beefDaniel Dunbar CmdArgs.push_back(Output.getFilename()); 2301f7b8eec37c8c8012fa525c71fb29a58c9f29beefDaniel Dunbar 2302f7b8eec37c8c8012fa525c71fb29a58c9f29beefDaniel Dunbar for (InputInfoList::const_iterator 2303f7b8eec37c8c8012fa525c71fb29a58c9f29beefDaniel Dunbar it = Inputs.begin(), ie = Inputs.end(); it != ie; ++it) { 2304f7b8eec37c8c8012fa525c71fb29a58c9f29beefDaniel Dunbar const InputInfo &II = *it; 2305f7b8eec37c8c8012fa525c71fb29a58c9f29beefDaniel Dunbar if (II.isPipe()) 2306f7b8eec37c8c8012fa525c71fb29a58c9f29beefDaniel Dunbar CmdArgs.push_back("-"); 2307f7b8eec37c8c8012fa525c71fb29a58c9f29beefDaniel Dunbar else 2308f7b8eec37c8c8012fa525c71fb29a58c9f29beefDaniel Dunbar CmdArgs.push_back(II.getFilename()); 2309f7b8eec37c8c8012fa525c71fb29a58c9f29beefDaniel Dunbar } 2310f7b8eec37c8c8012fa525c71fb29a58c9f29beefDaniel Dunbar 2311f7b8eec37c8c8012fa525c71fb29a58c9f29beefDaniel Dunbar const char *Exec = 23125ed34f4c58b6ad4e21038d713c1fae31a6146ff5Daniel Dunbar Args.MakeArgString(getToolChain().GetProgramPath(C, "as")); 2313cae087e164e94e4286c11bf694dd0ff88f295302Daniel Dunbar Dest.addCommand(new Command(JA, Exec, CmdArgs)); 2314f7b8eec37c8c8012fa525c71fb29a58c9f29beefDaniel Dunbar} 2315f7b8eec37c8c8012fa525c71fb29a58c9f29beefDaniel Dunbar 2316f7b8eec37c8c8012fa525c71fb29a58c9f29beefDaniel Dunbarvoid openbsd::Link::ConstructJob(Compilation &C, const JobAction &JA, 2317f7b8eec37c8c8012fa525c71fb29a58c9f29beefDaniel Dunbar Job &Dest, const InputInfo &Output, 2318f7b8eec37c8c8012fa525c71fb29a58c9f29beefDaniel Dunbar const InputInfoList &Inputs, 2319f7b8eec37c8c8012fa525c71fb29a58c9f29beefDaniel Dunbar const ArgList &Args, 2320f7b8eec37c8c8012fa525c71fb29a58c9f29beefDaniel Dunbar const char *LinkingOutput) const { 2321f7b8eec37c8c8012fa525c71fb29a58c9f29beefDaniel Dunbar const Driver &D = getToolChain().getHost().getDriver(); 2322f7b8eec37c8c8012fa525c71fb29a58c9f29beefDaniel Dunbar ArgStringList CmdArgs; 2323f7b8eec37c8c8012fa525c71fb29a58c9f29beefDaniel Dunbar 23242bbcf669742b6b27748414e22f8042236fceef65Daniel Dunbar if ((!Args.hasArg(options::OPT_nostdlib)) && 23252bbcf669742b6b27748414e22f8042236fceef65Daniel Dunbar (!Args.hasArg(options::OPT_shared))) { 23262bbcf669742b6b27748414e22f8042236fceef65Daniel Dunbar CmdArgs.push_back("-e"); 23272bbcf669742b6b27748414e22f8042236fceef65Daniel Dunbar CmdArgs.push_back("__start"); 23282bbcf669742b6b27748414e22f8042236fceef65Daniel Dunbar } 23292bbcf669742b6b27748414e22f8042236fceef65Daniel Dunbar 2330f7b8eec37c8c8012fa525c71fb29a58c9f29beefDaniel Dunbar if (Args.hasArg(options::OPT_static)) { 2331f7b8eec37c8c8012fa525c71fb29a58c9f29beefDaniel Dunbar CmdArgs.push_back("-Bstatic"); 2332f7b8eec37c8c8012fa525c71fb29a58c9f29beefDaniel Dunbar } else { 2333f7b8eec37c8c8012fa525c71fb29a58c9f29beefDaniel Dunbar CmdArgs.push_back("--eh-frame-hdr"); 23342bbcf669742b6b27748414e22f8042236fceef65Daniel Dunbar CmdArgs.push_back("-Bdynamic"); 2335f7b8eec37c8c8012fa525c71fb29a58c9f29beefDaniel Dunbar if (Args.hasArg(options::OPT_shared)) { 23362bbcf669742b6b27748414e22f8042236fceef65Daniel Dunbar CmdArgs.push_back("-shared"); 2337f7b8eec37c8c8012fa525c71fb29a58c9f29beefDaniel Dunbar } else { 2338f7b8eec37c8c8012fa525c71fb29a58c9f29beefDaniel Dunbar CmdArgs.push_back("-dynamic-linker"); 2339f7b8eec37c8c8012fa525c71fb29a58c9f29beefDaniel Dunbar CmdArgs.push_back("/usr/libexec/ld.so"); 2340f7b8eec37c8c8012fa525c71fb29a58c9f29beefDaniel Dunbar } 2341f7b8eec37c8c8012fa525c71fb29a58c9f29beefDaniel Dunbar } 2342f7b8eec37c8c8012fa525c71fb29a58c9f29beefDaniel Dunbar 2343f7b8eec37c8c8012fa525c71fb29a58c9f29beefDaniel Dunbar if (Output.isPipe()) { 2344f7b8eec37c8c8012fa525c71fb29a58c9f29beefDaniel Dunbar CmdArgs.push_back("-o"); 2345f7b8eec37c8c8012fa525c71fb29a58c9f29beefDaniel Dunbar CmdArgs.push_back("-"); 2346f7b8eec37c8c8012fa525c71fb29a58c9f29beefDaniel Dunbar } else if (Output.isFilename()) { 2347f7b8eec37c8c8012fa525c71fb29a58c9f29beefDaniel Dunbar CmdArgs.push_back("-o"); 2348f7b8eec37c8c8012fa525c71fb29a58c9f29beefDaniel Dunbar CmdArgs.push_back(Output.getFilename()); 2349f7b8eec37c8c8012fa525c71fb29a58c9f29beefDaniel Dunbar } else { 2350f7b8eec37c8c8012fa525c71fb29a58c9f29beefDaniel Dunbar assert(Output.isNothing() && "Invalid output."); 2351f7b8eec37c8c8012fa525c71fb29a58c9f29beefDaniel Dunbar } 2352f7b8eec37c8c8012fa525c71fb29a58c9f29beefDaniel Dunbar 2353f7b8eec37c8c8012fa525c71fb29a58c9f29beefDaniel Dunbar if (!Args.hasArg(options::OPT_nostdlib) && 2354f7b8eec37c8c8012fa525c71fb29a58c9f29beefDaniel Dunbar !Args.hasArg(options::OPT_nostartfiles)) { 2355f7b8eec37c8c8012fa525c71fb29a58c9f29beefDaniel Dunbar if (!Args.hasArg(options::OPT_shared)) { 23565ed34f4c58b6ad4e21038d713c1fae31a6146ff5Daniel Dunbar CmdArgs.push_back(Args.MakeArgString(getToolChain().GetFilePath(C, "crt0.o"))); 23575ed34f4c58b6ad4e21038d713c1fae31a6146ff5Daniel Dunbar CmdArgs.push_back(Args.MakeArgString(getToolChain().GetFilePath(C, "crtbegin.o"))); 2358f7b8eec37c8c8012fa525c71fb29a58c9f29beefDaniel Dunbar } else { 23595ed34f4c58b6ad4e21038d713c1fae31a6146ff5Daniel Dunbar CmdArgs.push_back(Args.MakeArgString(getToolChain().GetFilePath(C, "crtbeginS.o"))); 2360f7b8eec37c8c8012fa525c71fb29a58c9f29beefDaniel Dunbar } 2361f7b8eec37c8c8012fa525c71fb29a58c9f29beefDaniel Dunbar } 2362f7b8eec37c8c8012fa525c71fb29a58c9f29beefDaniel Dunbar 23632bbcf669742b6b27748414e22f8042236fceef65Daniel Dunbar CmdArgs.push_back(MakeFormattedString(Args, 23642bbcf669742b6b27748414e22f8042236fceef65Daniel Dunbar llvm::format("-L/usr/lib/gcc-lib/%s/3.3.5", 2365881376467c46c5c6cc16fa6790271c2c22e1d4f1Daniel Dunbar getToolChain().getTripleString().c_str()))); 23662bbcf669742b6b27748414e22f8042236fceef65Daniel Dunbar 2367f7b8eec37c8c8012fa525c71fb29a58c9f29beefDaniel Dunbar Args.AddAllArgs(CmdArgs, options::OPT_L); 2368f7b8eec37c8c8012fa525c71fb29a58c9f29beefDaniel Dunbar Args.AddAllArgs(CmdArgs, options::OPT_T_Group); 2369f7b8eec37c8c8012fa525c71fb29a58c9f29beefDaniel Dunbar Args.AddAllArgs(CmdArgs, options::OPT_e); 2370f7b8eec37c8c8012fa525c71fb29a58c9f29beefDaniel Dunbar 2371f7b8eec37c8c8012fa525c71fb29a58c9f29beefDaniel Dunbar for (InputInfoList::const_iterator 2372f7b8eec37c8c8012fa525c71fb29a58c9f29beefDaniel Dunbar it = Inputs.begin(), ie = Inputs.end(); it != ie; ++it) { 2373f7b8eec37c8c8012fa525c71fb29a58c9f29beefDaniel Dunbar const InputInfo &II = *it; 2374f7b8eec37c8c8012fa525c71fb29a58c9f29beefDaniel Dunbar 2375f7b8eec37c8c8012fa525c71fb29a58c9f29beefDaniel Dunbar // Don't try to pass LLVM inputs to a generic gcc. 2376f7b8eec37c8c8012fa525c71fb29a58c9f29beefDaniel Dunbar if (II.getType() == types::TY_LLVMBC) 2377f7b8eec37c8c8012fa525c71fb29a58c9f29beefDaniel Dunbar D.Diag(clang::diag::err_drv_no_linker_llvm_support) 2378881376467c46c5c6cc16fa6790271c2c22e1d4f1Daniel Dunbar << getToolChain().getTripleString(); 2379f7b8eec37c8c8012fa525c71fb29a58c9f29beefDaniel Dunbar 2380f7b8eec37c8c8012fa525c71fb29a58c9f29beefDaniel Dunbar if (II.isPipe()) 2381f7b8eec37c8c8012fa525c71fb29a58c9f29beefDaniel Dunbar CmdArgs.push_back("-"); 2382f7b8eec37c8c8012fa525c71fb29a58c9f29beefDaniel Dunbar else if (II.isFilename()) 2383f7b8eec37c8c8012fa525c71fb29a58c9f29beefDaniel Dunbar CmdArgs.push_back(II.getFilename()); 2384f7b8eec37c8c8012fa525c71fb29a58c9f29beefDaniel Dunbar else 2385f7b8eec37c8c8012fa525c71fb29a58c9f29beefDaniel Dunbar II.getInputArg().renderAsInput(Args, CmdArgs); 2386f7b8eec37c8c8012fa525c71fb29a58c9f29beefDaniel Dunbar } 2387f7b8eec37c8c8012fa525c71fb29a58c9f29beefDaniel Dunbar 2388f7b8eec37c8c8012fa525c71fb29a58c9f29beefDaniel Dunbar if (!Args.hasArg(options::OPT_nostdlib) && 2389f7b8eec37c8c8012fa525c71fb29a58c9f29beefDaniel Dunbar !Args.hasArg(options::OPT_nodefaultlibs)) { 23902bbcf669742b6b27748414e22f8042236fceef65Daniel Dunbar // FIXME: For some reason GCC passes -lgcc before adding 23912bbcf669742b6b27748414e22f8042236fceef65Daniel Dunbar // the default system libraries. Just mimic this for now. 23922bbcf669742b6b27748414e22f8042236fceef65Daniel Dunbar CmdArgs.push_back("-lgcc"); 2393f7b8eec37c8c8012fa525c71fb29a58c9f29beefDaniel Dunbar 2394f7b8eec37c8c8012fa525c71fb29a58c9f29beefDaniel Dunbar if (Args.hasArg(options::OPT_pthread)) 2395f7b8eec37c8c8012fa525c71fb29a58c9f29beefDaniel Dunbar CmdArgs.push_back("-pthread"); 23962bbcf669742b6b27748414e22f8042236fceef65Daniel Dunbar if (!Args.hasArg(options::OPT_shared)) 23972bbcf669742b6b27748414e22f8042236fceef65Daniel Dunbar CmdArgs.push_back("-lc"); 23982bbcf669742b6b27748414e22f8042236fceef65Daniel Dunbar CmdArgs.push_back("-lgcc"); 2399f7b8eec37c8c8012fa525c71fb29a58c9f29beefDaniel Dunbar } 2400f7b8eec37c8c8012fa525c71fb29a58c9f29beefDaniel Dunbar 2401f7b8eec37c8c8012fa525c71fb29a58c9f29beefDaniel Dunbar if (!Args.hasArg(options::OPT_nostdlib) && 2402f7b8eec37c8c8012fa525c71fb29a58c9f29beefDaniel Dunbar !Args.hasArg(options::OPT_nostartfiles)) { 2403f7b8eec37c8c8012fa525c71fb29a58c9f29beefDaniel Dunbar if (!Args.hasArg(options::OPT_shared)) 24045ed34f4c58b6ad4e21038d713c1fae31a6146ff5Daniel Dunbar CmdArgs.push_back(Args.MakeArgString(getToolChain().GetFilePath(C, "crtend.o"))); 2405f7b8eec37c8c8012fa525c71fb29a58c9f29beefDaniel Dunbar else 24065ed34f4c58b6ad4e21038d713c1fae31a6146ff5Daniel Dunbar CmdArgs.push_back(Args.MakeArgString(getToolChain().GetFilePath(C, "crtendS.o"))); 2407f7b8eec37c8c8012fa525c71fb29a58c9f29beefDaniel Dunbar } 2408f7b8eec37c8c8012fa525c71fb29a58c9f29beefDaniel Dunbar 2409f7b8eec37c8c8012fa525c71fb29a58c9f29beefDaniel Dunbar const char *Exec = 24105ed34f4c58b6ad4e21038d713c1fae31a6146ff5Daniel Dunbar Args.MakeArgString(getToolChain().GetProgramPath(C, "ld")); 2411cae087e164e94e4286c11bf694dd0ff88f295302Daniel Dunbar Dest.addCommand(new Command(JA, Exec, CmdArgs)); 2412f7b8eec37c8c8012fa525c71fb29a58c9f29beefDaniel Dunbar} 2413c66a5a30a27e7b9cfab46ac8be918e3ea5b0c5a5Ed Schouten 241468a31d406c6dc4382c700d1199b062de2aa7e1daDaniel Dunbarvoid freebsd::Assemble::ConstructJob(Compilation &C, const JobAction &JA, 2415c21c485b4fb58ef5d55cf3e523263dd824a2ace4Daniel Dunbar Job &Dest, const InputInfo &Output, 2416c21c485b4fb58ef5d55cf3e523263dd824a2ace4Daniel Dunbar const InputInfoList &Inputs, 2417c21c485b4fb58ef5d55cf3e523263dd824a2ace4Daniel Dunbar const ArgList &Args, 24181eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump const char *LinkingOutput) const { 241968a31d406c6dc4382c700d1199b062de2aa7e1daDaniel Dunbar ArgStringList CmdArgs; 242068a31d406c6dc4382c700d1199b062de2aa7e1daDaniel Dunbar 2421008f54a54299eaafdaa940e2bdeaf55935ecd95aDaniel Dunbar // When building 32-bit code on FreeBSD/amd64, we have to explicitly 2422008f54a54299eaafdaa940e2bdeaf55935ecd95aDaniel Dunbar // instruct as in the base system to assemble 32-bit code. 2423008f54a54299eaafdaa940e2bdeaf55935ecd95aDaniel Dunbar if (getToolChain().getArchName() == "i386") 242468a31d406c6dc4382c700d1199b062de2aa7e1daDaniel Dunbar CmdArgs.push_back("--32"); 242568a31d406c6dc4382c700d1199b062de2aa7e1daDaniel Dunbar 242668a31d406c6dc4382c700d1199b062de2aa7e1daDaniel Dunbar Args.AddAllArgValues(CmdArgs, options::OPT_Wa_COMMA, 242768a31d406c6dc4382c700d1199b062de2aa7e1daDaniel Dunbar options::OPT_Xassembler); 242868a31d406c6dc4382c700d1199b062de2aa7e1daDaniel Dunbar 242968a31d406c6dc4382c700d1199b062de2aa7e1daDaniel Dunbar CmdArgs.push_back("-o"); 243068a31d406c6dc4382c700d1199b062de2aa7e1daDaniel Dunbar if (Output.isPipe()) 243168a31d406c6dc4382c700d1199b062de2aa7e1daDaniel Dunbar CmdArgs.push_back("-"); 243268a31d406c6dc4382c700d1199b062de2aa7e1daDaniel Dunbar else 243368a31d406c6dc4382c700d1199b062de2aa7e1daDaniel Dunbar CmdArgs.push_back(Output.getFilename()); 243468a31d406c6dc4382c700d1199b062de2aa7e1daDaniel Dunbar 243568a31d406c6dc4382c700d1199b062de2aa7e1daDaniel Dunbar for (InputInfoList::const_iterator 243668a31d406c6dc4382c700d1199b062de2aa7e1daDaniel Dunbar it = Inputs.begin(), ie = Inputs.end(); it != ie; ++it) { 243768a31d406c6dc4382c700d1199b062de2aa7e1daDaniel Dunbar const InputInfo &II = *it; 243868a31d406c6dc4382c700d1199b062de2aa7e1daDaniel Dunbar if (II.isPipe()) 243968a31d406c6dc4382c700d1199b062de2aa7e1daDaniel Dunbar CmdArgs.push_back("-"); 244068a31d406c6dc4382c700d1199b062de2aa7e1daDaniel Dunbar else 244168a31d406c6dc4382c700d1199b062de2aa7e1daDaniel Dunbar CmdArgs.push_back(II.getFilename()); 244268a31d406c6dc4382c700d1199b062de2aa7e1daDaniel Dunbar } 244368a31d406c6dc4382c700d1199b062de2aa7e1daDaniel Dunbar 2444c21c485b4fb58ef5d55cf3e523263dd824a2ace4Daniel Dunbar const char *Exec = 24455ed34f4c58b6ad4e21038d713c1fae31a6146ff5Daniel Dunbar Args.MakeArgString(getToolChain().GetProgramPath(C, "as")); 2446cae087e164e94e4286c11bf694dd0ff88f295302Daniel Dunbar Dest.addCommand(new Command(JA, Exec, CmdArgs)); 244768a31d406c6dc4382c700d1199b062de2aa7e1daDaniel Dunbar} 2448008f54a54299eaafdaa940e2bdeaf55935ecd95aDaniel Dunbar 2449008f54a54299eaafdaa940e2bdeaf55935ecd95aDaniel Dunbarvoid freebsd::Link::ConstructJob(Compilation &C, const JobAction &JA, 2450c21c485b4fb58ef5d55cf3e523263dd824a2ace4Daniel Dunbar Job &Dest, const InputInfo &Output, 2451c21c485b4fb58ef5d55cf3e523263dd824a2ace4Daniel Dunbar const InputInfoList &Inputs, 2452c21c485b4fb58ef5d55cf3e523263dd824a2ace4Daniel Dunbar const ArgList &Args, 2453a8304f67291b0182fb64f3afc621615288dd1d31Daniel Dunbar const char *LinkingOutput) const { 2454a8304f67291b0182fb64f3afc621615288dd1d31Daniel Dunbar const Driver &D = getToolChain().getHost().getDriver(); 2455008f54a54299eaafdaa940e2bdeaf55935ecd95aDaniel Dunbar ArgStringList CmdArgs; 2456008f54a54299eaafdaa940e2bdeaf55935ecd95aDaniel Dunbar 2457008f54a54299eaafdaa940e2bdeaf55935ecd95aDaniel Dunbar if (Args.hasArg(options::OPT_static)) { 2458008f54a54299eaafdaa940e2bdeaf55935ecd95aDaniel Dunbar CmdArgs.push_back("-Bstatic"); 2459008f54a54299eaafdaa940e2bdeaf55935ecd95aDaniel Dunbar } else { 2460008f54a54299eaafdaa940e2bdeaf55935ecd95aDaniel Dunbar CmdArgs.push_back("--eh-frame-hdr"); 2461008f54a54299eaafdaa940e2bdeaf55935ecd95aDaniel Dunbar if (Args.hasArg(options::OPT_shared)) { 2462008f54a54299eaafdaa940e2bdeaf55935ecd95aDaniel Dunbar CmdArgs.push_back("-Bshareable"); 2463008f54a54299eaafdaa940e2bdeaf55935ecd95aDaniel Dunbar } else { 2464008f54a54299eaafdaa940e2bdeaf55935ecd95aDaniel Dunbar CmdArgs.push_back("-dynamic-linker"); 2465008f54a54299eaafdaa940e2bdeaf55935ecd95aDaniel Dunbar CmdArgs.push_back("/libexec/ld-elf.so.1"); 2466008f54a54299eaafdaa940e2bdeaf55935ecd95aDaniel Dunbar } 2467008f54a54299eaafdaa940e2bdeaf55935ecd95aDaniel Dunbar } 2468008f54a54299eaafdaa940e2bdeaf55935ecd95aDaniel Dunbar 2469008f54a54299eaafdaa940e2bdeaf55935ecd95aDaniel Dunbar // When building 32-bit code on FreeBSD/amd64, we have to explicitly 2470008f54a54299eaafdaa940e2bdeaf55935ecd95aDaniel Dunbar // instruct ld in the base system to link 32-bit code. 2471008f54a54299eaafdaa940e2bdeaf55935ecd95aDaniel Dunbar if (getToolChain().getArchName() == "i386") { 2472008f54a54299eaafdaa940e2bdeaf55935ecd95aDaniel Dunbar CmdArgs.push_back("-m"); 2473008f54a54299eaafdaa940e2bdeaf55935ecd95aDaniel Dunbar CmdArgs.push_back("elf_i386_fbsd"); 2474008f54a54299eaafdaa940e2bdeaf55935ecd95aDaniel Dunbar } 2475008f54a54299eaafdaa940e2bdeaf55935ecd95aDaniel Dunbar 2476008f54a54299eaafdaa940e2bdeaf55935ecd95aDaniel Dunbar if (Output.isPipe()) { 2477008f54a54299eaafdaa940e2bdeaf55935ecd95aDaniel Dunbar CmdArgs.push_back("-o"); 2478008f54a54299eaafdaa940e2bdeaf55935ecd95aDaniel Dunbar CmdArgs.push_back("-"); 2479008f54a54299eaafdaa940e2bdeaf55935ecd95aDaniel Dunbar } else if (Output.isFilename()) { 2480008f54a54299eaafdaa940e2bdeaf55935ecd95aDaniel Dunbar CmdArgs.push_back("-o"); 2481008f54a54299eaafdaa940e2bdeaf55935ecd95aDaniel Dunbar CmdArgs.push_back(Output.getFilename()); 2482008f54a54299eaafdaa940e2bdeaf55935ecd95aDaniel Dunbar } else { 2483008f54a54299eaafdaa940e2bdeaf55935ecd95aDaniel Dunbar assert(Output.isNothing() && "Invalid output."); 2484008f54a54299eaafdaa940e2bdeaf55935ecd95aDaniel Dunbar } 2485008f54a54299eaafdaa940e2bdeaf55935ecd95aDaniel Dunbar 2486008f54a54299eaafdaa940e2bdeaf55935ecd95aDaniel Dunbar if (!Args.hasArg(options::OPT_nostdlib) && 2487008f54a54299eaafdaa940e2bdeaf55935ecd95aDaniel Dunbar !Args.hasArg(options::OPT_nostartfiles)) { 2488008f54a54299eaafdaa940e2bdeaf55935ecd95aDaniel Dunbar if (!Args.hasArg(options::OPT_shared)) { 24895ed34f4c58b6ad4e21038d713c1fae31a6146ff5Daniel Dunbar CmdArgs.push_back(Args.MakeArgString(getToolChain().GetFilePath(C, "crt1.o"))); 24905ed34f4c58b6ad4e21038d713c1fae31a6146ff5Daniel Dunbar CmdArgs.push_back(Args.MakeArgString(getToolChain().GetFilePath(C, "crti.o"))); 24915ed34f4c58b6ad4e21038d713c1fae31a6146ff5Daniel Dunbar CmdArgs.push_back(Args.MakeArgString(getToolChain().GetFilePath(C, "crtbegin.o"))); 2492008f54a54299eaafdaa940e2bdeaf55935ecd95aDaniel Dunbar } else { 24935ed34f4c58b6ad4e21038d713c1fae31a6146ff5Daniel Dunbar CmdArgs.push_back(Args.MakeArgString(getToolChain().GetFilePath(C, "crti.o"))); 24945ed34f4c58b6ad4e21038d713c1fae31a6146ff5Daniel Dunbar CmdArgs.push_back(Args.MakeArgString(getToolChain().GetFilePath(C, "crtbeginS.o"))); 2495008f54a54299eaafdaa940e2bdeaf55935ecd95aDaniel Dunbar } 2496008f54a54299eaafdaa940e2bdeaf55935ecd95aDaniel Dunbar } 2497008f54a54299eaafdaa940e2bdeaf55935ecd95aDaniel Dunbar 2498008f54a54299eaafdaa940e2bdeaf55935ecd95aDaniel Dunbar Args.AddAllArgs(CmdArgs, options::OPT_L); 2499008f54a54299eaafdaa940e2bdeaf55935ecd95aDaniel Dunbar Args.AddAllArgs(CmdArgs, options::OPT_T_Group); 2500008f54a54299eaafdaa940e2bdeaf55935ecd95aDaniel Dunbar Args.AddAllArgs(CmdArgs, options::OPT_e); 2501008f54a54299eaafdaa940e2bdeaf55935ecd95aDaniel Dunbar 2502008f54a54299eaafdaa940e2bdeaf55935ecd95aDaniel Dunbar for (InputInfoList::const_iterator 2503c21c485b4fb58ef5d55cf3e523263dd824a2ace4Daniel Dunbar it = Inputs.begin(), ie = Inputs.end(); it != ie; ++it) { 2504008f54a54299eaafdaa940e2bdeaf55935ecd95aDaniel Dunbar const InputInfo &II = *it; 2505a8304f67291b0182fb64f3afc621615288dd1d31Daniel Dunbar 2506a8304f67291b0182fb64f3afc621615288dd1d31Daniel Dunbar // Don't try to pass LLVM inputs to a generic gcc. 2507a8304f67291b0182fb64f3afc621615288dd1d31Daniel Dunbar if (II.getType() == types::TY_LLVMBC) 2508a8304f67291b0182fb64f3afc621615288dd1d31Daniel Dunbar D.Diag(clang::diag::err_drv_no_linker_llvm_support) 2509881376467c46c5c6cc16fa6790271c2c22e1d4f1Daniel Dunbar << getToolChain().getTripleString(); 2510a8304f67291b0182fb64f3afc621615288dd1d31Daniel Dunbar 2511008f54a54299eaafdaa940e2bdeaf55935ecd95aDaniel Dunbar if (II.isPipe()) 2512008f54a54299eaafdaa940e2bdeaf55935ecd95aDaniel Dunbar CmdArgs.push_back("-"); 2513008f54a54299eaafdaa940e2bdeaf55935ecd95aDaniel Dunbar else if (II.isFilename()) 2514008f54a54299eaafdaa940e2bdeaf55935ecd95aDaniel Dunbar CmdArgs.push_back(II.getFilename()); 2515008f54a54299eaafdaa940e2bdeaf55935ecd95aDaniel Dunbar else 2516008f54a54299eaafdaa940e2bdeaf55935ecd95aDaniel Dunbar II.getInputArg().renderAsInput(Args, CmdArgs); 2517008f54a54299eaafdaa940e2bdeaf55935ecd95aDaniel Dunbar } 2518008f54a54299eaafdaa940e2bdeaf55935ecd95aDaniel Dunbar 2519008f54a54299eaafdaa940e2bdeaf55935ecd95aDaniel Dunbar if (!Args.hasArg(options::OPT_nostdlib) && 2520008f54a54299eaafdaa940e2bdeaf55935ecd95aDaniel Dunbar !Args.hasArg(options::OPT_nodefaultlibs)) { 2521008f54a54299eaafdaa940e2bdeaf55935ecd95aDaniel Dunbar // FIXME: For some reason GCC passes -lgcc and -lgcc_s before adding 2522008f54a54299eaafdaa940e2bdeaf55935ecd95aDaniel Dunbar // the default system libraries. Just mimic this for now. 2523008f54a54299eaafdaa940e2bdeaf55935ecd95aDaniel Dunbar CmdArgs.push_back("-lgcc"); 2524008f54a54299eaafdaa940e2bdeaf55935ecd95aDaniel Dunbar if (Args.hasArg(options::OPT_static)) { 2525008f54a54299eaafdaa940e2bdeaf55935ecd95aDaniel Dunbar CmdArgs.push_back("-lgcc_eh"); 2526008f54a54299eaafdaa940e2bdeaf55935ecd95aDaniel Dunbar } else { 2527008f54a54299eaafdaa940e2bdeaf55935ecd95aDaniel Dunbar CmdArgs.push_back("--as-needed"); 2528008f54a54299eaafdaa940e2bdeaf55935ecd95aDaniel Dunbar CmdArgs.push_back("-lgcc_s"); 2529008f54a54299eaafdaa940e2bdeaf55935ecd95aDaniel Dunbar CmdArgs.push_back("--no-as-needed"); 2530008f54a54299eaafdaa940e2bdeaf55935ecd95aDaniel Dunbar } 2531008f54a54299eaafdaa940e2bdeaf55935ecd95aDaniel Dunbar 2532008f54a54299eaafdaa940e2bdeaf55935ecd95aDaniel Dunbar if (Args.hasArg(options::OPT_pthread)) 2533008f54a54299eaafdaa940e2bdeaf55935ecd95aDaniel Dunbar CmdArgs.push_back("-lpthread"); 2534008f54a54299eaafdaa940e2bdeaf55935ecd95aDaniel Dunbar CmdArgs.push_back("-lc"); 2535008f54a54299eaafdaa940e2bdeaf55935ecd95aDaniel Dunbar 2536008f54a54299eaafdaa940e2bdeaf55935ecd95aDaniel Dunbar CmdArgs.push_back("-lgcc"); 2537008f54a54299eaafdaa940e2bdeaf55935ecd95aDaniel Dunbar if (Args.hasArg(options::OPT_static)) { 2538008f54a54299eaafdaa940e2bdeaf55935ecd95aDaniel Dunbar CmdArgs.push_back("-lgcc_eh"); 2539008f54a54299eaafdaa940e2bdeaf55935ecd95aDaniel Dunbar } else { 2540008f54a54299eaafdaa940e2bdeaf55935ecd95aDaniel Dunbar CmdArgs.push_back("--as-needed"); 2541008f54a54299eaafdaa940e2bdeaf55935ecd95aDaniel Dunbar CmdArgs.push_back("-lgcc_s"); 2542008f54a54299eaafdaa940e2bdeaf55935ecd95aDaniel Dunbar CmdArgs.push_back("--no-as-needed"); 2543008f54a54299eaafdaa940e2bdeaf55935ecd95aDaniel Dunbar } 2544008f54a54299eaafdaa940e2bdeaf55935ecd95aDaniel Dunbar } 2545008f54a54299eaafdaa940e2bdeaf55935ecd95aDaniel Dunbar 2546008f54a54299eaafdaa940e2bdeaf55935ecd95aDaniel Dunbar if (!Args.hasArg(options::OPT_nostdlib) && 2547008f54a54299eaafdaa940e2bdeaf55935ecd95aDaniel Dunbar !Args.hasArg(options::OPT_nostartfiles)) { 2548008f54a54299eaafdaa940e2bdeaf55935ecd95aDaniel Dunbar if (!Args.hasArg(options::OPT_shared)) 25495ed34f4c58b6ad4e21038d713c1fae31a6146ff5Daniel Dunbar CmdArgs.push_back(Args.MakeArgString(getToolChain().GetFilePath(C, "crtend.o"))); 2550008f54a54299eaafdaa940e2bdeaf55935ecd95aDaniel Dunbar else 25515ed34f4c58b6ad4e21038d713c1fae31a6146ff5Daniel Dunbar CmdArgs.push_back(Args.MakeArgString(getToolChain().GetFilePath(C, "crtendS.o"))); 25525ed34f4c58b6ad4e21038d713c1fae31a6146ff5Daniel Dunbar CmdArgs.push_back(Args.MakeArgString(getToolChain().GetFilePath(C, "crtn.o"))); 2553008f54a54299eaafdaa940e2bdeaf55935ecd95aDaniel Dunbar } 2554008f54a54299eaafdaa940e2bdeaf55935ecd95aDaniel Dunbar 2555c21c485b4fb58ef5d55cf3e523263dd824a2ace4Daniel Dunbar const char *Exec = 25565ed34f4c58b6ad4e21038d713c1fae31a6146ff5Daniel Dunbar Args.MakeArgString(getToolChain().GetProgramPath(C, "ld")); 2557cae087e164e94e4286c11bf694dd0ff88f295302Daniel Dunbar Dest.addCommand(new Command(JA, Exec, CmdArgs)); 2558008f54a54299eaafdaa940e2bdeaf55935ecd95aDaniel Dunbar} 255911e1b40d759a643086f590f6ffbd9d68360bad46Daniel Dunbar 256011e1b40d759a643086f590f6ffbd9d68360bad46Daniel Dunbar/// DragonFly Tools 256111e1b40d759a643086f590f6ffbd9d68360bad46Daniel Dunbar 256211e1b40d759a643086f590f6ffbd9d68360bad46Daniel Dunbar// For now, DragonFly Assemble does just about the same as for 256311e1b40d759a643086f590f6ffbd9d68360bad46Daniel Dunbar// FreeBSD, but this may change soon. 256411e1b40d759a643086f590f6ffbd9d68360bad46Daniel Dunbarvoid dragonfly::Assemble::ConstructJob(Compilation &C, const JobAction &JA, 256511e1b40d759a643086f590f6ffbd9d68360bad46Daniel Dunbar Job &Dest, const InputInfo &Output, 256611e1b40d759a643086f590f6ffbd9d68360bad46Daniel Dunbar const InputInfoList &Inputs, 256711e1b40d759a643086f590f6ffbd9d68360bad46Daniel Dunbar const ArgList &Args, 256811e1b40d759a643086f590f6ffbd9d68360bad46Daniel Dunbar const char *LinkingOutput) const { 256911e1b40d759a643086f590f6ffbd9d68360bad46Daniel Dunbar ArgStringList CmdArgs; 257011e1b40d759a643086f590f6ffbd9d68360bad46Daniel Dunbar 257111e1b40d759a643086f590f6ffbd9d68360bad46Daniel Dunbar // When building 32-bit code on DragonFly/pc64, we have to explicitly 257211e1b40d759a643086f590f6ffbd9d68360bad46Daniel Dunbar // instruct as in the base system to assemble 32-bit code. 257311e1b40d759a643086f590f6ffbd9d68360bad46Daniel Dunbar if (getToolChain().getArchName() == "i386") 257411e1b40d759a643086f590f6ffbd9d68360bad46Daniel Dunbar CmdArgs.push_back("--32"); 257511e1b40d759a643086f590f6ffbd9d68360bad46Daniel Dunbar 257611e1b40d759a643086f590f6ffbd9d68360bad46Daniel Dunbar Args.AddAllArgValues(CmdArgs, options::OPT_Wa_COMMA, 257711e1b40d759a643086f590f6ffbd9d68360bad46Daniel Dunbar options::OPT_Xassembler); 257811e1b40d759a643086f590f6ffbd9d68360bad46Daniel Dunbar 257911e1b40d759a643086f590f6ffbd9d68360bad46Daniel Dunbar CmdArgs.push_back("-o"); 258011e1b40d759a643086f590f6ffbd9d68360bad46Daniel Dunbar if (Output.isPipe()) 258111e1b40d759a643086f590f6ffbd9d68360bad46Daniel Dunbar CmdArgs.push_back("-"); 258211e1b40d759a643086f590f6ffbd9d68360bad46Daniel Dunbar else 258311e1b40d759a643086f590f6ffbd9d68360bad46Daniel Dunbar CmdArgs.push_back(Output.getFilename()); 258411e1b40d759a643086f590f6ffbd9d68360bad46Daniel Dunbar 258511e1b40d759a643086f590f6ffbd9d68360bad46Daniel Dunbar for (InputInfoList::const_iterator 258611e1b40d759a643086f590f6ffbd9d68360bad46Daniel Dunbar it = Inputs.begin(), ie = Inputs.end(); it != ie; ++it) { 258711e1b40d759a643086f590f6ffbd9d68360bad46Daniel Dunbar const InputInfo &II = *it; 258811e1b40d759a643086f590f6ffbd9d68360bad46Daniel Dunbar if (II.isPipe()) 258911e1b40d759a643086f590f6ffbd9d68360bad46Daniel Dunbar CmdArgs.push_back("-"); 259011e1b40d759a643086f590f6ffbd9d68360bad46Daniel Dunbar else 259111e1b40d759a643086f590f6ffbd9d68360bad46Daniel Dunbar CmdArgs.push_back(II.getFilename()); 259211e1b40d759a643086f590f6ffbd9d68360bad46Daniel Dunbar } 259311e1b40d759a643086f590f6ffbd9d68360bad46Daniel Dunbar 259411e1b40d759a643086f590f6ffbd9d68360bad46Daniel Dunbar const char *Exec = 25955ed34f4c58b6ad4e21038d713c1fae31a6146ff5Daniel Dunbar Args.MakeArgString(getToolChain().GetProgramPath(C, "as")); 2596cae087e164e94e4286c11bf694dd0ff88f295302Daniel Dunbar Dest.addCommand(new Command(JA, Exec, CmdArgs)); 259711e1b40d759a643086f590f6ffbd9d68360bad46Daniel Dunbar} 259811e1b40d759a643086f590f6ffbd9d68360bad46Daniel Dunbar 259911e1b40d759a643086f590f6ffbd9d68360bad46Daniel Dunbarvoid dragonfly::Link::ConstructJob(Compilation &C, const JobAction &JA, 260011e1b40d759a643086f590f6ffbd9d68360bad46Daniel Dunbar Job &Dest, const InputInfo &Output, 260111e1b40d759a643086f590f6ffbd9d68360bad46Daniel Dunbar const InputInfoList &Inputs, 260211e1b40d759a643086f590f6ffbd9d68360bad46Daniel Dunbar const ArgList &Args, 260311e1b40d759a643086f590f6ffbd9d68360bad46Daniel Dunbar const char *LinkingOutput) const { 2604a8304f67291b0182fb64f3afc621615288dd1d31Daniel Dunbar const Driver &D = getToolChain().getHost().getDriver(); 260511e1b40d759a643086f590f6ffbd9d68360bad46Daniel Dunbar ArgStringList CmdArgs; 260611e1b40d759a643086f590f6ffbd9d68360bad46Daniel Dunbar 260711e1b40d759a643086f590f6ffbd9d68360bad46Daniel Dunbar if (Args.hasArg(options::OPT_static)) { 260811e1b40d759a643086f590f6ffbd9d68360bad46Daniel Dunbar CmdArgs.push_back("-Bstatic"); 260911e1b40d759a643086f590f6ffbd9d68360bad46Daniel Dunbar } else { 261011e1b40d759a643086f590f6ffbd9d68360bad46Daniel Dunbar if (Args.hasArg(options::OPT_shared)) 261111e1b40d759a643086f590f6ffbd9d68360bad46Daniel Dunbar CmdArgs.push_back("-Bshareable"); 261211e1b40d759a643086f590f6ffbd9d68360bad46Daniel Dunbar else { 261311e1b40d759a643086f590f6ffbd9d68360bad46Daniel Dunbar CmdArgs.push_back("-dynamic-linker"); 261411e1b40d759a643086f590f6ffbd9d68360bad46Daniel Dunbar CmdArgs.push_back("/usr/libexec/ld-elf.so.2"); 261511e1b40d759a643086f590f6ffbd9d68360bad46Daniel Dunbar } 261611e1b40d759a643086f590f6ffbd9d68360bad46Daniel Dunbar } 261711e1b40d759a643086f590f6ffbd9d68360bad46Daniel Dunbar 261811e1b40d759a643086f590f6ffbd9d68360bad46Daniel Dunbar // When building 32-bit code on DragonFly/pc64, we have to explicitly 261911e1b40d759a643086f590f6ffbd9d68360bad46Daniel Dunbar // instruct ld in the base system to link 32-bit code. 262011e1b40d759a643086f590f6ffbd9d68360bad46Daniel Dunbar if (getToolChain().getArchName() == "i386") { 262111e1b40d759a643086f590f6ffbd9d68360bad46Daniel Dunbar CmdArgs.push_back("-m"); 262211e1b40d759a643086f590f6ffbd9d68360bad46Daniel Dunbar CmdArgs.push_back("elf_i386"); 262311e1b40d759a643086f590f6ffbd9d68360bad46Daniel Dunbar } 262411e1b40d759a643086f590f6ffbd9d68360bad46Daniel Dunbar 262511e1b40d759a643086f590f6ffbd9d68360bad46Daniel Dunbar if (Output.isPipe()) { 262611e1b40d759a643086f590f6ffbd9d68360bad46Daniel Dunbar CmdArgs.push_back("-o"); 262711e1b40d759a643086f590f6ffbd9d68360bad46Daniel Dunbar CmdArgs.push_back("-"); 262811e1b40d759a643086f590f6ffbd9d68360bad46Daniel Dunbar } else if (Output.isFilename()) { 262911e1b40d759a643086f590f6ffbd9d68360bad46Daniel Dunbar CmdArgs.push_back("-o"); 263011e1b40d759a643086f590f6ffbd9d68360bad46Daniel Dunbar CmdArgs.push_back(Output.getFilename()); 263111e1b40d759a643086f590f6ffbd9d68360bad46Daniel Dunbar } else { 263211e1b40d759a643086f590f6ffbd9d68360bad46Daniel Dunbar assert(Output.isNothing() && "Invalid output."); 263311e1b40d759a643086f590f6ffbd9d68360bad46Daniel Dunbar } 263411e1b40d759a643086f590f6ffbd9d68360bad46Daniel Dunbar 263511e1b40d759a643086f590f6ffbd9d68360bad46Daniel Dunbar if (!Args.hasArg(options::OPT_nostdlib) && 263611e1b40d759a643086f590f6ffbd9d68360bad46Daniel Dunbar !Args.hasArg(options::OPT_nostartfiles)) { 263711e1b40d759a643086f590f6ffbd9d68360bad46Daniel Dunbar if (!Args.hasArg(options::OPT_shared)) { 26385ed34f4c58b6ad4e21038d713c1fae31a6146ff5Daniel Dunbar CmdArgs.push_back(Args.MakeArgString(getToolChain().GetFilePath(C, "crt1.o"))); 26395ed34f4c58b6ad4e21038d713c1fae31a6146ff5Daniel Dunbar CmdArgs.push_back(Args.MakeArgString(getToolChain().GetFilePath(C, "crti.o"))); 26405ed34f4c58b6ad4e21038d713c1fae31a6146ff5Daniel Dunbar CmdArgs.push_back(Args.MakeArgString(getToolChain().GetFilePath(C, "crtbegin.o"))); 264111e1b40d759a643086f590f6ffbd9d68360bad46Daniel Dunbar } else { 26425ed34f4c58b6ad4e21038d713c1fae31a6146ff5Daniel Dunbar CmdArgs.push_back(Args.MakeArgString(getToolChain().GetFilePath(C, "crti.o"))); 26435ed34f4c58b6ad4e21038d713c1fae31a6146ff5Daniel Dunbar CmdArgs.push_back(Args.MakeArgString(getToolChain().GetFilePath(C, "crtbeginS.o"))); 264411e1b40d759a643086f590f6ffbd9d68360bad46Daniel Dunbar } 264511e1b40d759a643086f590f6ffbd9d68360bad46Daniel Dunbar } 264611e1b40d759a643086f590f6ffbd9d68360bad46Daniel Dunbar 264711e1b40d759a643086f590f6ffbd9d68360bad46Daniel Dunbar Args.AddAllArgs(CmdArgs, options::OPT_L); 264811e1b40d759a643086f590f6ffbd9d68360bad46Daniel Dunbar Args.AddAllArgs(CmdArgs, options::OPT_T_Group); 264911e1b40d759a643086f590f6ffbd9d68360bad46Daniel Dunbar Args.AddAllArgs(CmdArgs, options::OPT_e); 265011e1b40d759a643086f590f6ffbd9d68360bad46Daniel Dunbar 265111e1b40d759a643086f590f6ffbd9d68360bad46Daniel Dunbar for (InputInfoList::const_iterator 265211e1b40d759a643086f590f6ffbd9d68360bad46Daniel Dunbar it = Inputs.begin(), ie = Inputs.end(); it != ie; ++it) { 265311e1b40d759a643086f590f6ffbd9d68360bad46Daniel Dunbar const InputInfo &II = *it; 2654a8304f67291b0182fb64f3afc621615288dd1d31Daniel Dunbar 2655a8304f67291b0182fb64f3afc621615288dd1d31Daniel Dunbar // Don't try to pass LLVM inputs to a generic gcc. 2656a8304f67291b0182fb64f3afc621615288dd1d31Daniel Dunbar if (II.getType() == types::TY_LLVMBC) 2657a8304f67291b0182fb64f3afc621615288dd1d31Daniel Dunbar D.Diag(clang::diag::err_drv_no_linker_llvm_support) 2658881376467c46c5c6cc16fa6790271c2c22e1d4f1Daniel Dunbar << getToolChain().getTripleString(); 2659a8304f67291b0182fb64f3afc621615288dd1d31Daniel Dunbar 266011e1b40d759a643086f590f6ffbd9d68360bad46Daniel Dunbar if (II.isPipe()) 266111e1b40d759a643086f590f6ffbd9d68360bad46Daniel Dunbar CmdArgs.push_back("-"); 266211e1b40d759a643086f590f6ffbd9d68360bad46Daniel Dunbar else if (II.isFilename()) 266311e1b40d759a643086f590f6ffbd9d68360bad46Daniel Dunbar CmdArgs.push_back(II.getFilename()); 266411e1b40d759a643086f590f6ffbd9d68360bad46Daniel Dunbar else 266511e1b40d759a643086f590f6ffbd9d68360bad46Daniel Dunbar II.getInputArg().renderAsInput(Args, CmdArgs); 266611e1b40d759a643086f590f6ffbd9d68360bad46Daniel Dunbar } 266711e1b40d759a643086f590f6ffbd9d68360bad46Daniel Dunbar 266811e1b40d759a643086f590f6ffbd9d68360bad46Daniel Dunbar if (!Args.hasArg(options::OPT_nostdlib) && 266911e1b40d759a643086f590f6ffbd9d68360bad46Daniel Dunbar !Args.hasArg(options::OPT_nodefaultlibs)) { 267011e1b40d759a643086f590f6ffbd9d68360bad46Daniel Dunbar // FIXME: GCC passes on -lgcc, -lgcc_pic and a whole lot of 267111e1b40d759a643086f590f6ffbd9d68360bad46Daniel Dunbar // rpaths 267211e1b40d759a643086f590f6ffbd9d68360bad46Daniel Dunbar CmdArgs.push_back("-L/usr/lib/gcc41"); 267311e1b40d759a643086f590f6ffbd9d68360bad46Daniel Dunbar 267411e1b40d759a643086f590f6ffbd9d68360bad46Daniel Dunbar if (!Args.hasArg(options::OPT_static)) { 267511e1b40d759a643086f590f6ffbd9d68360bad46Daniel Dunbar CmdArgs.push_back("-rpath"); 267611e1b40d759a643086f590f6ffbd9d68360bad46Daniel Dunbar CmdArgs.push_back("/usr/lib/gcc41"); 267711e1b40d759a643086f590f6ffbd9d68360bad46Daniel Dunbar 267811e1b40d759a643086f590f6ffbd9d68360bad46Daniel Dunbar CmdArgs.push_back("-rpath-link"); 267911e1b40d759a643086f590f6ffbd9d68360bad46Daniel Dunbar CmdArgs.push_back("/usr/lib/gcc41"); 268011e1b40d759a643086f590f6ffbd9d68360bad46Daniel Dunbar 268111e1b40d759a643086f590f6ffbd9d68360bad46Daniel Dunbar CmdArgs.push_back("-rpath"); 268211e1b40d759a643086f590f6ffbd9d68360bad46Daniel Dunbar CmdArgs.push_back("/usr/lib"); 268311e1b40d759a643086f590f6ffbd9d68360bad46Daniel Dunbar 268411e1b40d759a643086f590f6ffbd9d68360bad46Daniel Dunbar CmdArgs.push_back("-rpath-link"); 268511e1b40d759a643086f590f6ffbd9d68360bad46Daniel Dunbar CmdArgs.push_back("/usr/lib"); 268611e1b40d759a643086f590f6ffbd9d68360bad46Daniel Dunbar } 268711e1b40d759a643086f590f6ffbd9d68360bad46Daniel Dunbar 268811e1b40d759a643086f590f6ffbd9d68360bad46Daniel Dunbar if (Args.hasArg(options::OPT_shared)) { 268911e1b40d759a643086f590f6ffbd9d68360bad46Daniel Dunbar CmdArgs.push_back("-lgcc_pic"); 269011e1b40d759a643086f590f6ffbd9d68360bad46Daniel Dunbar } else { 269111e1b40d759a643086f590f6ffbd9d68360bad46Daniel Dunbar CmdArgs.push_back("-lgcc"); 269211e1b40d759a643086f590f6ffbd9d68360bad46Daniel Dunbar } 269311e1b40d759a643086f590f6ffbd9d68360bad46Daniel Dunbar 269411e1b40d759a643086f590f6ffbd9d68360bad46Daniel Dunbar 269511e1b40d759a643086f590f6ffbd9d68360bad46Daniel Dunbar if (Args.hasArg(options::OPT_pthread)) 269611e1b40d759a643086f590f6ffbd9d68360bad46Daniel Dunbar CmdArgs.push_back("-lthread_xu"); 269711e1b40d759a643086f590f6ffbd9d68360bad46Daniel Dunbar 269811e1b40d759a643086f590f6ffbd9d68360bad46Daniel Dunbar if (!Args.hasArg(options::OPT_nolibc)) { 269911e1b40d759a643086f590f6ffbd9d68360bad46Daniel Dunbar CmdArgs.push_back("-lc"); 270011e1b40d759a643086f590f6ffbd9d68360bad46Daniel Dunbar } 270111e1b40d759a643086f590f6ffbd9d68360bad46Daniel Dunbar 270211e1b40d759a643086f590f6ffbd9d68360bad46Daniel Dunbar if (Args.hasArg(options::OPT_shared)) { 270311e1b40d759a643086f590f6ffbd9d68360bad46Daniel Dunbar CmdArgs.push_back("-lgcc_pic"); 270411e1b40d759a643086f590f6ffbd9d68360bad46Daniel Dunbar } else { 270511e1b40d759a643086f590f6ffbd9d68360bad46Daniel Dunbar CmdArgs.push_back("-lgcc"); 270611e1b40d759a643086f590f6ffbd9d68360bad46Daniel Dunbar } 270711e1b40d759a643086f590f6ffbd9d68360bad46Daniel Dunbar } 270811e1b40d759a643086f590f6ffbd9d68360bad46Daniel Dunbar 270911e1b40d759a643086f590f6ffbd9d68360bad46Daniel Dunbar if (!Args.hasArg(options::OPT_nostdlib) && 271011e1b40d759a643086f590f6ffbd9d68360bad46Daniel Dunbar !Args.hasArg(options::OPT_nostartfiles)) { 271111e1b40d759a643086f590f6ffbd9d68360bad46Daniel Dunbar if (!Args.hasArg(options::OPT_shared)) 27125ed34f4c58b6ad4e21038d713c1fae31a6146ff5Daniel Dunbar CmdArgs.push_back(Args.MakeArgString(getToolChain().GetFilePath(C, "crtend.o"))); 271311e1b40d759a643086f590f6ffbd9d68360bad46Daniel Dunbar else 27145ed34f4c58b6ad4e21038d713c1fae31a6146ff5Daniel Dunbar CmdArgs.push_back(Args.MakeArgString(getToolChain().GetFilePath(C, "crtendS.o"))); 27155ed34f4c58b6ad4e21038d713c1fae31a6146ff5Daniel Dunbar CmdArgs.push_back(Args.MakeArgString(getToolChain().GetFilePath(C, "crtn.o"))); 271611e1b40d759a643086f590f6ffbd9d68360bad46Daniel Dunbar } 271711e1b40d759a643086f590f6ffbd9d68360bad46Daniel Dunbar 271811e1b40d759a643086f590f6ffbd9d68360bad46Daniel Dunbar const char *Exec = 27195ed34f4c58b6ad4e21038d713c1fae31a6146ff5Daniel Dunbar Args.MakeArgString(getToolChain().GetProgramPath(C, "ld")); 2720cae087e164e94e4286c11bf694dd0ff88f295302Daniel Dunbar Dest.addCommand(new Command(JA, Exec, CmdArgs)); 272111e1b40d759a643086f590f6ffbd9d68360bad46Daniel Dunbar} 2722