Tools.cpp revision 2030d8f46b4226fa99e59389e3ca856a79c27e9a
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) { 5155915fbf310e171c4cd3c2af05e9de360c0fa988aDaniel Dunbar if (Inputs[0].getType() == types::TY_AST) 5165915fbf310e171c4cd3c2af05e9de360c0fa988aDaniel Dunbar CmdArgs.push_back("-compile-ast"); 5175915fbf310e171c4cd3c2af05e9de360c0fa988aDaniel Dunbar else 5185915fbf310e171c4cd3c2af05e9de360c0fa988aDaniel Dunbar CmdArgs.push_back("-S"); 5195915fbf310e171c4cd3c2af05e9de360c0fa988aDaniel Dunbar } else if (JA.getType() == types::TY_AST) { 5205915fbf310e171c4cd3c2af05e9de360c0fa988aDaniel Dunbar CmdArgs.push_back("-emit-pch"); 5211d46033f760ba5fd266ce59fe391fac473f04f52Daniel Dunbar } 5221d46033f760ba5fd266ce59fe391fac473f04f52Daniel Dunbar } 5231d46033f760ba5fd266ce59fe391fac473f04f52Daniel Dunbar 5241d46033f760ba5fd266ce59fe391fac473f04f52Daniel Dunbar // The make clang go fast button. 5251d46033f760ba5fd266ce59fe391fac473f04f52Daniel Dunbar CmdArgs.push_back("-disable-free"); 5261d46033f760ba5fd266ce59fe391fac473f04f52Daniel Dunbar 527c9abc043af88f90d177a5bd147f627b78ca49fdeDaniel Dunbar // Set the main file name, so that debug info works even with 528c9abc043af88f90d177a5bd147f627b78ca49fdeDaniel Dunbar // -save-temps. 529c9abc043af88f90d177a5bd147f627b78ca49fdeDaniel Dunbar CmdArgs.push_back("-main-file-name"); 530c9abc043af88f90d177a5bd147f627b78ca49fdeDaniel Dunbar CmdArgs.push_back(darwin::CC1::getBaseInputName(Args, Inputs)); 531c9abc043af88f90d177a5bd147f627b78ca49fdeDaniel Dunbar 5323bbc75302fd43cf13d868b46c94ff8794b302e43Daniel Dunbar // Some flags which affect the language (via preprocessor 5333bbc75302fd43cf13d868b46c94ff8794b302e43Daniel Dunbar // defines). See darwin::CC1::AddCPPArgs. 5343bbc75302fd43cf13d868b46c94ff8794b302e43Daniel Dunbar if (Args.hasArg(options::OPT_static)) 5353bbc75302fd43cf13d868b46c94ff8794b302e43Daniel Dunbar CmdArgs.push_back("-static-define"); 5363bbc75302fd43cf13d868b46c94ff8794b302e43Daniel Dunbar 5371d46033f760ba5fd266ce59fe391fac473f04f52Daniel Dunbar if (isa<AnalyzeJobAction>(JA)) { 5381d46033f760ba5fd266ce59fe391fac473f04f52Daniel Dunbar // Add default argument set. 539d8fc0f2e7751cf31cec5c2f3cc6a0b447e9debb3Daniel Dunbar if (!Args.hasArg(options::OPT__analyzer_no_default_checks)) { 540d8fc0f2e7751cf31cec5c2f3cc6a0b447e9debb3Daniel Dunbar CmdArgs.push_back("-warn-dead-stores"); 54111727519fbdaec68f526ae7c54a83d0a4601f561Ted Kremenek CmdArgs.push_back("-warn-security-syntactic"); 542d8fc0f2e7751cf31cec5c2f3cc6a0b447e9debb3Daniel Dunbar CmdArgs.push_back("-checker-cfref"); 543d8fc0f2e7751cf31cec5c2f3cc6a0b447e9debb3Daniel Dunbar CmdArgs.push_back("-analyzer-eagerly-assume"); 544d8fc0f2e7751cf31cec5c2f3cc6a0b447e9debb3Daniel Dunbar CmdArgs.push_back("-warn-objc-methodsigs"); 545d8fc0f2e7751cf31cec5c2f3cc6a0b447e9debb3Daniel Dunbar // Do not enable the missing -dealloc check. 546d8fc0f2e7751cf31cec5c2f3cc6a0b447e9debb3Daniel Dunbar // '-warn-objc-missing-dealloc', 547d8fc0f2e7751cf31cec5c2f3cc6a0b447e9debb3Daniel Dunbar CmdArgs.push_back("-warn-objc-unused-ivars"); 548d8fc0f2e7751cf31cec5c2f3cc6a0b447e9debb3Daniel Dunbar } 549d8fc0f2e7751cf31cec5c2f3cc6a0b447e9debb3Daniel Dunbar 550d8fc0f2e7751cf31cec5c2f3cc6a0b447e9debb3Daniel Dunbar // Set the output format. The default is plist, for (lame) historical 551d8fc0f2e7751cf31cec5c2f3cc6a0b447e9debb3Daniel Dunbar // reasons. 552d8fc0f2e7751cf31cec5c2f3cc6a0b447e9debb3Daniel Dunbar CmdArgs.push_back("-analyzer-output"); 553d8fc0f2e7751cf31cec5c2f3cc6a0b447e9debb3Daniel Dunbar if (Arg *A = Args.getLastArg(options::OPT__analyzer_output)) 554d8fc0f2e7751cf31cec5c2f3cc6a0b447e9debb3Daniel Dunbar CmdArgs.push_back(A->getValue(Args)); 555d8fc0f2e7751cf31cec5c2f3cc6a0b447e9debb3Daniel Dunbar else 556d8fc0f2e7751cf31cec5c2f3cc6a0b447e9debb3Daniel Dunbar CmdArgs.push_back("plist"); 5571d46033f760ba5fd266ce59fe391fac473f04f52Daniel Dunbar 5581d46033f760ba5fd266ce59fe391fac473f04f52Daniel Dunbar // Add -Xanalyzer arguments when running as analyzer. 5591d46033f760ba5fd266ce59fe391fac473f04f52Daniel Dunbar Args.AddAllArgValues(CmdArgs, options::OPT_Xanalyzer); 5601eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump } 5611eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump 562e2fd66418eca3d70cf6b62087d745d0c5181db69Daniel Dunbar CheckCodeGenerationOptions(D, Args); 563e2fd66418eca3d70cf6b62087d745d0c5181db69Daniel Dunbar 564bc85be85779a47bae728bbe6a2cd2e3732b1333dDaniel Dunbar // Perform argument translation for LLVM backend. This 565bc85be85779a47bae728bbe6a2cd2e3732b1333dDaniel Dunbar // takes some care in reconciling with llvm-gcc. The 566bc85be85779a47bae728bbe6a2cd2e3732b1333dDaniel Dunbar // issue is that llvm-gcc translates these options based on 567bc85be85779a47bae728bbe6a2cd2e3732b1333dDaniel Dunbar // the values in cc1, whereas we are processing based on 568bc85be85779a47bae728bbe6a2cd2e3732b1333dDaniel Dunbar // the driver arguments. 569bc85be85779a47bae728bbe6a2cd2e3732b1333dDaniel Dunbar // 570bc85be85779a47bae728bbe6a2cd2e3732b1333dDaniel Dunbar // FIXME: This is currently broken for -f flags when -fno 571bc85be85779a47bae728bbe6a2cd2e3732b1333dDaniel Dunbar // variants are present. 5729fd0b1f845a61e71dd8099f596532d34c519630aDaniel Dunbar 573bc85be85779a47bae728bbe6a2cd2e3732b1333dDaniel Dunbar // This comes from the default translation the driver + cc1 574bc85be85779a47bae728bbe6a2cd2e3732b1333dDaniel Dunbar // would do to enable flag_pic. 575bc85be85779a47bae728bbe6a2cd2e3732b1333dDaniel Dunbar // 576bc85be85779a47bae728bbe6a2cd2e3732b1333dDaniel Dunbar // FIXME: Centralize this code. 577bc85be85779a47bae728bbe6a2cd2e3732b1333dDaniel Dunbar bool PICEnabled = (Args.hasArg(options::OPT_fPIC) || 578bc85be85779a47bae728bbe6a2cd2e3732b1333dDaniel Dunbar Args.hasArg(options::OPT_fpic) || 579bc85be85779a47bae728bbe6a2cd2e3732b1333dDaniel Dunbar Args.hasArg(options::OPT_fPIE) || 580bc85be85779a47bae728bbe6a2cd2e3732b1333dDaniel Dunbar Args.hasArg(options::OPT_fpie)); 581bc85be85779a47bae728bbe6a2cd2e3732b1333dDaniel Dunbar bool PICDisabled = (Args.hasArg(options::OPT_mkernel) || 582bc85be85779a47bae728bbe6a2cd2e3732b1333dDaniel Dunbar Args.hasArg(options::OPT_static)); 583bc85be85779a47bae728bbe6a2cd2e3732b1333dDaniel Dunbar const char *Model = getToolChain().GetForcedPicModel(); 584bc85be85779a47bae728bbe6a2cd2e3732b1333dDaniel Dunbar if (!Model) { 585bc85be85779a47bae728bbe6a2cd2e3732b1333dDaniel Dunbar if (Args.hasArg(options::OPT_mdynamic_no_pic)) 586bc85be85779a47bae728bbe6a2cd2e3732b1333dDaniel Dunbar Model = "dynamic-no-pic"; 587bc85be85779a47bae728bbe6a2cd2e3732b1333dDaniel Dunbar else if (PICDisabled) 588bc85be85779a47bae728bbe6a2cd2e3732b1333dDaniel Dunbar Model = "static"; 589bc85be85779a47bae728bbe6a2cd2e3732b1333dDaniel Dunbar else if (PICEnabled) 590bc85be85779a47bae728bbe6a2cd2e3732b1333dDaniel Dunbar Model = "pic"; 5911d46033f760ba5fd266ce59fe391fac473f04f52Daniel Dunbar else 592bc85be85779a47bae728bbe6a2cd2e3732b1333dDaniel Dunbar Model = getToolChain().GetDefaultRelocationModel(); 593bc85be85779a47bae728bbe6a2cd2e3732b1333dDaniel Dunbar } 594bc85be85779a47bae728bbe6a2cd2e3732b1333dDaniel Dunbar CmdArgs.push_back("--relocation-model"); 595bc85be85779a47bae728bbe6a2cd2e3732b1333dDaniel Dunbar CmdArgs.push_back(Model); 5961d46033f760ba5fd266ce59fe391fac473f04f52Daniel Dunbar 597bc85be85779a47bae728bbe6a2cd2e3732b1333dDaniel Dunbar // Infer the __PIC__ value. 598bc85be85779a47bae728bbe6a2cd2e3732b1333dDaniel Dunbar // 599bc85be85779a47bae728bbe6a2cd2e3732b1333dDaniel Dunbar // FIXME: This isn't quite right on Darwin, which always sets 600bc85be85779a47bae728bbe6a2cd2e3732b1333dDaniel Dunbar // __PIC__=2. 601bc85be85779a47bae728bbe6a2cd2e3732b1333dDaniel Dunbar if (strcmp(Model, "pic") == 0 || strcmp(Model, "dynamic-no-pic") == 0) { 602bc85be85779a47bae728bbe6a2cd2e3732b1333dDaniel Dunbar if (Args.hasArg(options::OPT_fPIC)) 603bc85be85779a47bae728bbe6a2cd2e3732b1333dDaniel Dunbar CmdArgs.push_back("-pic-level=2"); 6041d46033f760ba5fd266ce59fe391fac473f04f52Daniel Dunbar else 605bc85be85779a47bae728bbe6a2cd2e3732b1333dDaniel Dunbar CmdArgs.push_back("-pic-level=1"); 606bc85be85779a47bae728bbe6a2cd2e3732b1333dDaniel Dunbar } 6071d46033f760ba5fd266ce59fe391fac473f04f52Daniel Dunbar 608bc85be85779a47bae728bbe6a2cd2e3732b1333dDaniel Dunbar if (Args.hasArg(options::OPT_ftime_report)) 609bc85be85779a47bae728bbe6a2cd2e3732b1333dDaniel Dunbar CmdArgs.push_back("--time-passes"); 610bc85be85779a47bae728bbe6a2cd2e3732b1333dDaniel Dunbar // FIXME: Set --enable-unsafe-fp-math. 61121656ddae8e81df04f142386337cb95a9e0f0971Benjamin Kramer if (Args.hasFlag(options::OPT_fno_omit_frame_pointer, 61221656ddae8e81df04f142386337cb95a9e0f0971Benjamin Kramer options::OPT_fomit_frame_pointer)) 613bc85be85779a47bae728bbe6a2cd2e3732b1333dDaniel Dunbar CmdArgs.push_back("--disable-fp-elim"); 614bc85be85779a47bae728bbe6a2cd2e3732b1333dDaniel Dunbar if (!Args.hasFlag(options::OPT_fzero_initialized_in_bss, 615bc85be85779a47bae728bbe6a2cd2e3732b1333dDaniel Dunbar options::OPT_fno_zero_initialized_in_bss, 616bc85be85779a47bae728bbe6a2cd2e3732b1333dDaniel Dunbar true)) 617bc85be85779a47bae728bbe6a2cd2e3732b1333dDaniel Dunbar CmdArgs.push_back("--nozero-initialized-in-bss"); 618bc85be85779a47bae728bbe6a2cd2e3732b1333dDaniel Dunbar if (Args.hasArg(options::OPT_dA) || Args.hasArg(options::OPT_fverbose_asm)) 619bc85be85779a47bae728bbe6a2cd2e3732b1333dDaniel Dunbar CmdArgs.push_back("--asm-verbose"); 620bc85be85779a47bae728bbe6a2cd2e3732b1333dDaniel Dunbar if (Args.hasArg(options::OPT_fdebug_pass_structure)) 621bc85be85779a47bae728bbe6a2cd2e3732b1333dDaniel Dunbar CmdArgs.push_back("--debug-pass=Structure"); 622bc85be85779a47bae728bbe6a2cd2e3732b1333dDaniel Dunbar if (Args.hasArg(options::OPT_fdebug_pass_arguments)) 623bc85be85779a47bae728bbe6a2cd2e3732b1333dDaniel Dunbar CmdArgs.push_back("--debug-pass=Arguments"); 624bc85be85779a47bae728bbe6a2cd2e3732b1333dDaniel Dunbar // FIXME: set --inline-threshhold=50 if (optimize_size || optimize 625bc85be85779a47bae728bbe6a2cd2e3732b1333dDaniel Dunbar // < 3) 626bc85be85779a47bae728bbe6a2cd2e3732b1333dDaniel Dunbar if (Args.hasFlag(options::OPT_funwind_tables, 627bc85be85779a47bae728bbe6a2cd2e3732b1333dDaniel Dunbar options::OPT_fno_unwind_tables, 628bc85be85779a47bae728bbe6a2cd2e3732b1333dDaniel Dunbar (getToolChain().IsUnwindTablesDefault() && 629bc85be85779a47bae728bbe6a2cd2e3732b1333dDaniel Dunbar !Args.hasArg(options::OPT_mkernel)))) 630bc85be85779a47bae728bbe6a2cd2e3732b1333dDaniel Dunbar CmdArgs.push_back("--unwind-tables=1"); 631bc85be85779a47bae728bbe6a2cd2e3732b1333dDaniel Dunbar else 632bc85be85779a47bae728bbe6a2cd2e3732b1333dDaniel Dunbar CmdArgs.push_back("--unwind-tables=0"); 633bc85be85779a47bae728bbe6a2cd2e3732b1333dDaniel Dunbar 634868bd0aa9281929ef50d2e9a8c82a036906f53f5Daniel Dunbar // FIXME: Handle -mtune=. 635868bd0aa9281929ef50d2e9a8c82a036906f53f5Daniel Dunbar (void) Args.hasArg(options::OPT_mtune_EQ); 636bc85be85779a47bae728bbe6a2cd2e3732b1333dDaniel Dunbar 6378e9ef0d87dad25f02e5abc6facf528778236115aBenjamin Kramer if (Arg *A = Args.getLastArg(options::OPT_mcmodel_EQ)) { 6388e9ef0d87dad25f02e5abc6facf528778236115aBenjamin Kramer CmdArgs.push_back("-code-model"); 6398e9ef0d87dad25f02e5abc6facf528778236115aBenjamin Kramer CmdArgs.push_back(A->getValue(Args)); 6408e9ef0d87dad25f02e5abc6facf528778236115aBenjamin Kramer } 6418e9ef0d87dad25f02e5abc6facf528778236115aBenjamin Kramer 6426acda16e9c194dcbd0dea64341e182bdb65d0f41Daniel Dunbar // Add target specific cpu and features flags. 6436acda16e9c194dcbd0dea64341e182bdb65d0f41Daniel Dunbar switch(getToolChain().getTriple().getArch()) { 6446acda16e9c194dcbd0dea64341e182bdb65d0f41Daniel Dunbar default: 6456acda16e9c194dcbd0dea64341e182bdb65d0f41Daniel Dunbar break; 646868bd0aa9281929ef50d2e9a8c82a036906f53f5Daniel Dunbar 647b163ef7e7a5d904ef0962a7c38c460be083c4d63Daniel Dunbar case llvm::Triple::arm: 648b163ef7e7a5d904ef0962a7c38c460be083c4d63Daniel Dunbar case llvm::Triple::thumb: 649b163ef7e7a5d904ef0962a7c38c460be083c4d63Daniel Dunbar AddARMTargetArgs(Args, CmdArgs); 650b163ef7e7a5d904ef0962a7c38c460be083c4d63Daniel Dunbar break; 651b163ef7e7a5d904ef0962a7c38c460be083c4d63Daniel Dunbar 6526acda16e9c194dcbd0dea64341e182bdb65d0f41Daniel Dunbar case llvm::Triple::x86: 6536acda16e9c194dcbd0dea64341e182bdb65d0f41Daniel Dunbar case llvm::Triple::x86_64: 6546acda16e9c194dcbd0dea64341e182bdb65d0f41Daniel Dunbar AddX86TargetArgs(Args, CmdArgs); 6556acda16e9c194dcbd0dea64341e182bdb65d0f41Daniel Dunbar break; 656bc85be85779a47bae728bbe6a2cd2e3732b1333dDaniel Dunbar } 657c21c485b4fb58ef5d55cf3e523263dd824a2ace4Daniel Dunbar 658bc85be85779a47bae728bbe6a2cd2e3732b1333dDaniel Dunbar if (Args.hasFlag(options::OPT_fmath_errno, 659bc85be85779a47bae728bbe6a2cd2e3732b1333dDaniel Dunbar options::OPT_fno_math_errno, 660bc85be85779a47bae728bbe6a2cd2e3732b1333dDaniel Dunbar getToolChain().IsMathErrnoDefault())) 661bc85be85779a47bae728bbe6a2cd2e3732b1333dDaniel Dunbar CmdArgs.push_back("--fmath-errno=1"); 662bc85be85779a47bae728bbe6a2cd2e3732b1333dDaniel Dunbar else 663bc85be85779a47bae728bbe6a2cd2e3732b1333dDaniel Dunbar CmdArgs.push_back("--fmath-errno=0"); 6641d46033f760ba5fd266ce59fe391fac473f04f52Daniel Dunbar 665bc85be85779a47bae728bbe6a2cd2e3732b1333dDaniel Dunbar if (Arg *A = Args.getLastArg(options::OPT_flimited_precision_EQ)) { 666bc85be85779a47bae728bbe6a2cd2e3732b1333dDaniel Dunbar CmdArgs.push_back("--limit-float-precision"); 667bc85be85779a47bae728bbe6a2cd2e3732b1333dDaniel Dunbar CmdArgs.push_back(A->getValue(Args)); 6681d46033f760ba5fd266ce59fe391fac473f04f52Daniel Dunbar } 6691d46033f760ba5fd266ce59fe391fac473f04f52Daniel Dunbar 670bc85be85779a47bae728bbe6a2cd2e3732b1333dDaniel Dunbar // FIXME: Add --stack-protector-buffer-size=<xxx> on 671bc85be85779a47bae728bbe6a2cd2e3732b1333dDaniel Dunbar // -fstack-protect. 672bc85be85779a47bae728bbe6a2cd2e3732b1333dDaniel Dunbar 673bc85be85779a47bae728bbe6a2cd2e3732b1333dDaniel Dunbar Arg *Unsupported; 674bc85be85779a47bae728bbe6a2cd2e3732b1333dDaniel Dunbar if ((Unsupported = Args.getLastArg(options::OPT_MG)) || 67595a0da7b263777e6f97e5a08b6eb893681a234baDaniel Dunbar (Unsupported = Args.getLastArg(options::OPT_MQ)) || 67695a0da7b263777e6f97e5a08b6eb893681a234baDaniel Dunbar (Unsupported = Args.getLastArg(options::OPT_iframework))) 677e027a4b2399e9b0acfe0f77220c66bbe369067eeDaniel Dunbar D.Diag(clang::diag::err_drv_clang_unsupported) 678bc85be85779a47bae728bbe6a2cd2e3732b1333dDaniel Dunbar << Unsupported->getOption().getName(); 679bc85be85779a47bae728bbe6a2cd2e3732b1333dDaniel Dunbar 6801d46033f760ba5fd266ce59fe391fac473f04f52Daniel Dunbar Args.AddAllArgs(CmdArgs, options::OPT_v); 6811d46033f760ba5fd266ce59fe391fac473f04f52Daniel Dunbar Args.AddLastArg(CmdArgs, options::OPT_P); 6822ac9fc2ad64e16127df8c60caeea2edfe9a400a2Daniel Dunbar Args.AddLastArg(CmdArgs, options::OPT_mmacosx_version_min_EQ); 683ff8857a9e6f533765f63b2934902645baa7ddd09Daniel Dunbar Args.AddLastArg(CmdArgs, options::OPT_miphoneos_version_min_EQ); 6841eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump Args.AddLastArg(CmdArgs, options::OPT_print_ivar_layout); 6851d46033f760ba5fd266ce59fe391fac473f04f52Daniel Dunbar 6861d46033f760ba5fd266ce59fe391fac473f04f52Daniel Dunbar // Special case debug options to only pass -g to clang. This is 6871d46033f760ba5fd266ce59fe391fac473f04f52Daniel Dunbar // wrong. 6881d46033f760ba5fd266ce59fe391fac473f04f52Daniel Dunbar if (Args.hasArg(options::OPT_g_Group)) 6891d46033f760ba5fd266ce59fe391fac473f04f52Daniel Dunbar CmdArgs.push_back("-g"); 6901d46033f760ba5fd266ce59fe391fac473f04f52Daniel Dunbar 6911d46033f760ba5fd266ce59fe391fac473f04f52Daniel Dunbar Args.AddLastArg(CmdArgs, options::OPT_nostdinc); 6921d46033f760ba5fd266ce59fe391fac473f04f52Daniel Dunbar 6932ac9fc2ad64e16127df8c60caeea2edfe9a400a2Daniel Dunbar Args.AddLastArg(CmdArgs, options::OPT_isysroot); 6942ac9fc2ad64e16127df8c60caeea2edfe9a400a2Daniel Dunbar 695c21c485b4fb58ef5d55cf3e523263dd824a2ace4Daniel Dunbar // Add preprocessing options like -I, -D, etc. if we are using the 696c21c485b4fb58ef5d55cf3e523263dd824a2ace4Daniel Dunbar // preprocessor. 697c21c485b4fb58ef5d55cf3e523263dd824a2ace4Daniel Dunbar // 698c21c485b4fb58ef5d55cf3e523263dd824a2ace4Daniel Dunbar // FIXME: Support -fpreprocessed 699c21c485b4fb58ef5d55cf3e523263dd824a2ace4Daniel Dunbar types::ID InputType = Inputs[0].getType(); 700c21c485b4fb58ef5d55cf3e523263dd824a2ace4Daniel Dunbar if (types::getPreprocessedType(InputType) != types::TY_INVALID) 701df91ef3d6c55692a0236f67b6c6b134a3bf84098Douglas Gregor AddPreprocessingOptions(D, Args, CmdArgs, Output, Inputs); 7021d46033f760ba5fd266ce59fe391fac473f04f52Daniel Dunbar 703337a6271b98c4c183f7eaad1563a75260b4f2871Daniel Dunbar // Manually translate -O to -O1 and -O4 to -O3; let clang reject 704337a6271b98c4c183f7eaad1563a75260b4f2871Daniel Dunbar // others. 705337a6271b98c4c183f7eaad1563a75260b4f2871Daniel Dunbar if (Arg *A = Args.getLastArg(options::OPT_O_Group)) { 706c21c485b4fb58ef5d55cf3e523263dd824a2ace4Daniel Dunbar if (A->getOption().getId() == options::OPT_O4) 707337a6271b98c4c183f7eaad1563a75260b4f2871Daniel Dunbar CmdArgs.push_back("-O3"); 708337a6271b98c4c183f7eaad1563a75260b4f2871Daniel Dunbar else if (A->getValue(Args)[0] == '\0') 7091d46033f760ba5fd266ce59fe391fac473f04f52Daniel Dunbar CmdArgs.push_back("-O1"); 7101d46033f760ba5fd266ce59fe391fac473f04f52Daniel Dunbar else 7115697aa0d75c87bafec78984048d558f8d12ca1b3Daniel Dunbar A->render(Args, CmdArgs); 7121d46033f760ba5fd266ce59fe391fac473f04f52Daniel Dunbar } 7131d46033f760ba5fd266ce59fe391fac473f04f52Daniel Dunbar 71406ef3c3e9be4923b8e29c8e267b0c56afaa14ff3Daniel Dunbar Args.AddAllArgs(CmdArgs, options::OPT_W_Group, options::OPT_pedantic_Group); 7151d46033f760ba5fd266ce59fe391fac473f04f52Daniel Dunbar Args.AddLastArg(CmdArgs, options::OPT_w); 716d573d26e1abcce24c31ece3d6f7af158db569e4cDaniel Dunbar 717d573d26e1abcce24c31ece3d6f7af158db569e4cDaniel Dunbar // Handle -{std, ansi, trigraphs} -- take the last of -{std, ansi} 718d573d26e1abcce24c31ece3d6f7af158db569e4cDaniel Dunbar // (-ansi is equivalent to -std=c89). 719d573d26e1abcce24c31ece3d6f7af158db569e4cDaniel Dunbar // 720d573d26e1abcce24c31ece3d6f7af158db569e4cDaniel Dunbar // If a std is supplied, only add -trigraphs if it follows the 721d573d26e1abcce24c31ece3d6f7af158db569e4cDaniel Dunbar // option. 722d573d26e1abcce24c31ece3d6f7af158db569e4cDaniel Dunbar if (Arg *Std = Args.getLastArg(options::OPT_std_EQ, options::OPT_ansi)) { 723d573d26e1abcce24c31ece3d6f7af158db569e4cDaniel Dunbar if (Std->getOption().matches(options::OPT_ansi)) 724d573d26e1abcce24c31ece3d6f7af158db569e4cDaniel Dunbar CmdArgs.push_back("-std=c89"); 725d573d26e1abcce24c31ece3d6f7af158db569e4cDaniel Dunbar else 726d573d26e1abcce24c31ece3d6f7af158db569e4cDaniel Dunbar Std->render(Args, CmdArgs); 727d573d26e1abcce24c31ece3d6f7af158db569e4cDaniel Dunbar 728d573d26e1abcce24c31ece3d6f7af158db569e4cDaniel Dunbar if (Arg *A = Args.getLastArg(options::OPT_trigraphs)) 729d573d26e1abcce24c31ece3d6f7af158db569e4cDaniel Dunbar if (A->getIndex() > Std->getIndex()) 730d573d26e1abcce24c31ece3d6f7af158db569e4cDaniel Dunbar A->render(Args, CmdArgs); 731a3ff202ee4fb21728e930d5d029ba4925129912cDaniel Dunbar } else { 732a3ff202ee4fb21728e930d5d029ba4925129912cDaniel Dunbar // Honor -std-default. 733a3ff202ee4fb21728e930d5d029ba4925129912cDaniel Dunbar Args.AddAllArgsTranslated(CmdArgs, options::OPT_std_default_EQ, 734a3ff202ee4fb21728e930d5d029ba4925129912cDaniel Dunbar "-std=", /*Joined=*/true); 735d573d26e1abcce24c31ece3d6f7af158db569e4cDaniel Dunbar Args.AddLastArg(CmdArgs, options::OPT_trigraphs); 736a3ff202ee4fb21728e930d5d029ba4925129912cDaniel Dunbar } 737c21c485b4fb58ef5d55cf3e523263dd824a2ace4Daniel Dunbar 7381d46033f760ba5fd266ce59fe391fac473f04f52Daniel Dunbar if (Arg *A = Args.getLastArg(options::OPT_ftemplate_depth_)) { 7391d46033f760ba5fd266ce59fe391fac473f04f52Daniel Dunbar CmdArgs.push_back("-ftemplate-depth"); 7401d46033f760ba5fd266ce59fe391fac473f04f52Daniel Dunbar CmdArgs.push_back(A->getValue(Args)); 741b488c1dac8e53206f07103d794a62a3f5012c0f4Daniel Dunbar } 742b488c1dac8e53206f07103d794a62a3f5012c0f4Daniel Dunbar 743e650c8c3bca2f58cad8ffa8aab63126d26e890cdDouglas Gregor if (Args.hasArg(options::OPT__relocatable_pch, true)) 744e650c8c3bca2f58cad8ffa8aab63126d26e890cdDouglas Gregor CmdArgs.push_back("--relocatable-pch"); 7451eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump 7468a5a9aaddb627c0884c2ed8db55cc29fdb601195David Chisnall if (Arg *A = Args.getLastArg(options::OPT_fconstant_string_class_EQ)) { 7478a5a9aaddb627c0884c2ed8db55cc29fdb601195David Chisnall CmdArgs.push_back("-fconstant-string-class"); 7488a5a9aaddb627c0884c2ed8db55cc29fdb601195David Chisnall CmdArgs.push_back(A->getValue(Args)); 7498a5a9aaddb627c0884c2ed8db55cc29fdb601195David Chisnall } 7508a5a9aaddb627c0884c2ed8db55cc29fdb601195David Chisnall 75148d1ef782c8c88066b5febf60f8f456064d7d3f0Daniel Dunbar // Forward -f options which we can pass directly. 7523aaf082689d3235937a2e56a60f90fc1b3aebfb2Daniel Dunbar Args.AddLastArg(CmdArgs, options::OPT_femit_all_decls); 7533aaf082689d3235937a2e56a60f90fc1b3aebfb2Daniel Dunbar Args.AddLastArg(CmdArgs, options::OPT_ffreestanding); 7543aaf082689d3235937a2e56a60f90fc1b3aebfb2Daniel Dunbar Args.AddLastArg(CmdArgs, options::OPT_fheinous_gnu_extensions); 7553aaf082689d3235937a2e56a60f90fc1b3aebfb2Daniel Dunbar Args.AddLastArg(CmdArgs, options::OPT_fgnu_runtime); 7563aaf082689d3235937a2e56a60f90fc1b3aebfb2Daniel Dunbar Args.AddLastArg(CmdArgs, options::OPT_flax_vector_conversions); 757fffd93f38340d4d2ca7ee78a8c91c890b2ff3fa0Douglas Gregor Args.AddLastArg(CmdArgs, options::OPT_fmessage_length_EQ); 7583aaf082689d3235937a2e56a60f90fc1b3aebfb2Daniel Dunbar Args.AddLastArg(CmdArgs, options::OPT_fms_extensions); 7593aaf082689d3235937a2e56a60f90fc1b3aebfb2Daniel Dunbar Args.AddLastArg(CmdArgs, options::OPT_fnext_runtime); 7603aaf082689d3235937a2e56a60f90fc1b3aebfb2Daniel Dunbar Args.AddLastArg(CmdArgs, options::OPT_fno_caret_diagnostics); 7613aaf082689d3235937a2e56a60f90fc1b3aebfb2Daniel Dunbar Args.AddLastArg(CmdArgs, options::OPT_fno_show_column); 7623aaf082689d3235937a2e56a60f90fc1b3aebfb2Daniel Dunbar Args.AddLastArg(CmdArgs, options::OPT_fobjc_gc_only); 7633aaf082689d3235937a2e56a60f90fc1b3aebfb2Daniel Dunbar Args.AddLastArg(CmdArgs, options::OPT_fobjc_gc); 76434e65770ad6142b033d6cec4f476ed20fb248bf3Fariborz Jahanian Args.AddLastArg(CmdArgs, options::OPT_fobjc_sender_dependent_dispatch); 7653aaf082689d3235937a2e56a60f90fc1b3aebfb2Daniel Dunbar // FIXME: Should we remove this? 7663aaf082689d3235937a2e56a60f90fc1b3aebfb2Daniel Dunbar Args.AddLastArg(CmdArgs, options::OPT_fobjc_nonfragile_abi); 767d6884a0b90091a063478ec7fa31f6d76c94e4917Daniel Dunbar Args.AddLastArg(CmdArgs, options::OPT_fobjc_tight_layout); 768182e09240a33c6f1d303deecabec6e0e9c9d109dChris Lattner Args.AddLastArg(CmdArgs, options::OPT_fdiagnostics_print_source_range_info); 7693aaf082689d3235937a2e56a60f90fc1b3aebfb2Daniel Dunbar Args.AddLastArg(CmdArgs, options::OPT_ftime_report); 7703aaf082689d3235937a2e56a60f90fc1b3aebfb2Daniel Dunbar Args.AddLastArg(CmdArgs, options::OPT_ftrapv); 7713aaf082689d3235937a2e56a60f90fc1b3aebfb2Daniel Dunbar Args.AddLastArg(CmdArgs, options::OPT_fvisibility_EQ); 7723aaf082689d3235937a2e56a60f90fc1b3aebfb2Daniel Dunbar Args.AddLastArg(CmdArgs, options::OPT_fwritable_strings); 7731d46033f760ba5fd266ce59fe391fac473f04f52Daniel Dunbar 7745345c391c65d1780a0d7b0102b7f735cc3f82732Daniel Dunbar Args.AddLastArg(CmdArgs, options::OPT_pthread); 7755345c391c65d1780a0d7b0102b7f735cc3f82732Daniel Dunbar 77645483f7a1b3e57b4603b141bee80596b2d4dd443Bill Wendling // Forward stack protector flags. 77745483f7a1b3e57b4603b141bee80596b2d4dd443Bill Wendling if (Arg *A = Args.getLastArg(options::OPT_fno_stack_protector, 77845483f7a1b3e57b4603b141bee80596b2d4dd443Bill Wendling options::OPT_fstack_protector_all, 77945483f7a1b3e57b4603b141bee80596b2d4dd443Bill Wendling options::OPT_fstack_protector)) { 78045483f7a1b3e57b4603b141bee80596b2d4dd443Bill Wendling if (A->getOption().matches(options::OPT_fno_stack_protector)) 78145483f7a1b3e57b4603b141bee80596b2d4dd443Bill Wendling CmdArgs.push_back("--stack-protector=0"); 78245483f7a1b3e57b4603b141bee80596b2d4dd443Bill Wendling else if (A->getOption().matches(options::OPT_fstack_protector)) 78345483f7a1b3e57b4603b141bee80596b2d4dd443Bill Wendling CmdArgs.push_back("--stack-protector=1"); 78445483f7a1b3e57b4603b141bee80596b2d4dd443Bill Wendling else 78545483f7a1b3e57b4603b141bee80596b2d4dd443Bill Wendling CmdArgs.push_back("--stack-protector=2"); 78645483f7a1b3e57b4603b141bee80596b2d4dd443Bill Wendling } 78745483f7a1b3e57b4603b141bee80596b2d4dd443Bill Wendling 78848d1ef782c8c88066b5febf60f8f456064d7d3f0Daniel Dunbar // Forward -f options with positive and negative forms; we translate 78948d1ef782c8c88066b5febf60f8f456064d7d3f0Daniel Dunbar // these by hand. 79048d1ef782c8c88066b5febf60f8f456064d7d3f0Daniel Dunbar 79148d1ef782c8c88066b5febf60f8f456064d7d3f0Daniel Dunbar // -fbuiltin is default, only pass non-default. 79248d1ef782c8c88066b5febf60f8f456064d7d3f0Daniel Dunbar if (!Args.hasFlag(options::OPT_fbuiltin, options::OPT_fno_builtin)) 79348d1ef782c8c88066b5febf60f8f456064d7d3f0Daniel Dunbar CmdArgs.push_back("-fbuiltin=0"); 79448d1ef782c8c88066b5febf60f8f456064d7d3f0Daniel Dunbar 7957695fba30221613b7cf31276456217c41bb90960Daniel Dunbar // -fblocks default varies depending on platform and language; only 7967695fba30221613b7cf31276456217c41bb90960Daniel Dunbar // pass if specified. 79748d1ef782c8c88066b5febf60f8f456064d7d3f0Daniel Dunbar if (Arg *A = Args.getLastArg(options::OPT_fblocks, options::OPT_fno_blocks)) { 79848d1ef782c8c88066b5febf60f8f456064d7d3f0Daniel Dunbar if (A->getOption().matches(options::OPT_fblocks)) 79948d1ef782c8c88066b5febf60f8f456064d7d3f0Daniel Dunbar CmdArgs.push_back("-fblocks"); 80048d1ef782c8c88066b5febf60f8f456064d7d3f0Daniel Dunbar else 80148d1ef782c8c88066b5febf60f8f456064d7d3f0Daniel Dunbar CmdArgs.push_back("-fblocks=0"); 80248d1ef782c8c88066b5febf60f8f456064d7d3f0Daniel Dunbar } 80348d1ef782c8c88066b5febf60f8f456064d7d3f0Daniel Dunbar 804738f8c278da5950d0d4607de2debe0bdfad64185Mike Stump // -fexceptions default varies depending on platform and language; only 805738f8c278da5950d0d4607de2debe0bdfad64185Mike Stump // pass if specified. 806738f8c278da5950d0d4607de2debe0bdfad64185Mike Stump if (Arg *A = Args.getLastArg(options::OPT_fexceptions, 807738f8c278da5950d0d4607de2debe0bdfad64185Mike Stump options::OPT_fno_exceptions)) { 808738f8c278da5950d0d4607de2debe0bdfad64185Mike Stump if (A->getOption().matches(options::OPT_fexceptions)) 809738f8c278da5950d0d4607de2debe0bdfad64185Mike Stump CmdArgs.push_back("-fexceptions"); 810738f8c278da5950d0d4607de2debe0bdfad64185Mike Stump else 811738f8c278da5950d0d4607de2debe0bdfad64185Mike Stump CmdArgs.push_back("-fexceptions=0"); 812738f8c278da5950d0d4607de2debe0bdfad64185Mike Stump } 813738f8c278da5950d0d4607de2debe0bdfad64185Mike Stump 814738f8c278da5950d0d4607de2debe0bdfad64185Mike Stump // -frtti is default, only pass non-default. 815738f8c278da5950d0d4607de2debe0bdfad64185Mike Stump if (!Args.hasFlag(options::OPT_frtti, options::OPT_fno_rtti)) 816738f8c278da5950d0d4607de2debe0bdfad64185Mike Stump CmdArgs.push_back("-frtti=0"); 817738f8c278da5950d0d4607de2debe0bdfad64185Mike Stump 8185a77973d9bc2c9cdbdb7860dcf3ac795abe258ecEli Friedman // -fsigned-char/-funsigned-char default varies depending on platform; only 8195a77973d9bc2c9cdbdb7860dcf3ac795abe258ecEli Friedman // pass if specified. 8205a77973d9bc2c9cdbdb7860dcf3ac795abe258ecEli Friedman if (Arg *A = Args.getLastArg(options::OPT_fsigned_char, 8215a77973d9bc2c9cdbdb7860dcf3ac795abe258ecEli Friedman options::OPT_funsigned_char)) { 8225a77973d9bc2c9cdbdb7860dcf3ac795abe258ecEli Friedman if (A->getOption().matches(options::OPT_fsigned_char)) 8235a77973d9bc2c9cdbdb7860dcf3ac795abe258ecEli Friedman CmdArgs.push_back("-fsigned-char"); 8245a77973d9bc2c9cdbdb7860dcf3ac795abe258ecEli Friedman else 8255a77973d9bc2c9cdbdb7860dcf3ac795abe258ecEli Friedman CmdArgs.push_back("-fsigned-char=0"); 8265a77973d9bc2c9cdbdb7860dcf3ac795abe258ecEli Friedman } 8275a77973d9bc2c9cdbdb7860dcf3ac795abe258ecEli Friedman 82882d00688525c876bf47bce414dedae9c343e67f5Daniel Dunbar // -fno-pascal-strings is default, only pass non-default. If the 82982d00688525c876bf47bce414dedae9c343e67f5Daniel Dunbar // -tool chain happened to translate to -mpascal-strings, we want to 83082d00688525c876bf47bce414dedae9c343e67f5Daniel Dunbar // -back translate here. 83182d00688525c876bf47bce414dedae9c343e67f5Daniel Dunbar // 83282d00688525c876bf47bce414dedae9c343e67f5Daniel Dunbar // FIXME: This is gross; that translation should be pulled from the 83382d00688525c876bf47bce414dedae9c343e67f5Daniel Dunbar // tool chain. 834c21c485b4fb58ef5d55cf3e523263dd824a2ace4Daniel Dunbar if (Args.hasFlag(options::OPT_fpascal_strings, 83582d00688525c876bf47bce414dedae9c343e67f5Daniel Dunbar options::OPT_fno_pascal_strings, 83682d00688525c876bf47bce414dedae9c343e67f5Daniel Dunbar false) || 83782d00688525c876bf47bce414dedae9c343e67f5Daniel Dunbar Args.hasFlag(options::OPT_mpascal_strings, 83882d00688525c876bf47bce414dedae9c343e67f5Daniel Dunbar options::OPT_mno_pascal_strings, 83982d00688525c876bf47bce414dedae9c343e67f5Daniel Dunbar false)) 84048d1ef782c8c88066b5febf60f8f456064d7d3f0Daniel Dunbar CmdArgs.push_back("-fpascal-strings"); 84148d1ef782c8c88066b5febf60f8f456064d7d3f0Daniel Dunbar 84248d1ef782c8c88066b5febf60f8f456064d7d3f0Daniel Dunbar // -fcommon is default, only pass non-default. 84348d1ef782c8c88066b5febf60f8f456064d7d3f0Daniel Dunbar if (!Args.hasFlag(options::OPT_fcommon, options::OPT_fno_common)) 84448d1ef782c8c88066b5febf60f8f456064d7d3f0Daniel Dunbar CmdArgs.push_back("-fno-common"); 84548d1ef782c8c88066b5febf60f8f456064d7d3f0Daniel Dunbar 84670d3c92820f590b10553da9c96eda24e4325ba34Daniel Dunbar // -fsigned-bitfields is default, and clang doesn't yet support 84770d3c92820f590b10553da9c96eda24e4325ba34Daniel Dunbar // --funsigned-bitfields. 8481eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump if (!Args.hasFlag(options::OPT_fsigned_bitfields, 84970d3c92820f590b10553da9c96eda24e4325ba34Daniel Dunbar options::OPT_funsigned_bitfields)) 85070d3c92820f590b10553da9c96eda24e4325ba34Daniel Dunbar D.Diag(clang::diag::warn_drv_clang_unsupported) 85170d3c92820f590b10553da9c96eda24e4325ba34Daniel Dunbar << Args.getLastArg(options::OPT_funsigned_bitfields)->getAsString(Args); 85270d3c92820f590b10553da9c96eda24e4325ba34Daniel Dunbar 85349138fc59eeac2aacd3b7e04c2642180d5baefd7Daniel Dunbar // -fdiagnostics-fixit-info is default, only pass non-default. 8541eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump if (!Args.hasFlag(options::OPT_fdiagnostics_fixit_info, 85549138fc59eeac2aacd3b7e04c2642180d5baefd7Daniel Dunbar options::OPT_fno_diagnostics_fixit_info)) 85649138fc59eeac2aacd3b7e04c2642180d5baefd7Daniel Dunbar CmdArgs.push_back("-fno-diagnostics-fixit-info"); 85749138fc59eeac2aacd3b7e04c2642180d5baefd7Daniel Dunbar 8589e820ee054fefe5422b4db3f681e567a8976747eDaniel Dunbar // Enable -fdiagnostics-show-option by default. 8591eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump if (Args.hasFlag(options::OPT_fdiagnostics_show_option, 8609e820ee054fefe5422b4db3f681e567a8976747eDaniel Dunbar options::OPT_fno_diagnostics_show_option)) 8619e820ee054fefe5422b4db3f681e567a8976747eDaniel Dunbar CmdArgs.push_back("-fdiagnostics-show-option"); 862a46c71abb1dc2f9758ad1abe3378534fe138e802Torok Edwin if (!Args.hasFlag(options::OPT_fcolor_diagnostics, 86375eb1d64784946a37fc0b27596e2d92b6cf7033bDaniel Dunbar options::OPT_fno_color_diagnostics)) 864a46c71abb1dc2f9758ad1abe3378534fe138e802Torok Edwin CmdArgs.push_back("-fno-color-diagnostics"); 86575eb1d64784946a37fc0b27596e2d92b6cf7033bDaniel Dunbar if (!Args.hasFlag(options::OPT_fshow_source_location, 86675eb1d64784946a37fc0b27596e2d92b6cf7033bDaniel Dunbar options::OPT_fno_show_source_location)) 86775eb1d64784946a37fc0b27596e2d92b6cf7033bDaniel Dunbar CmdArgs.push_back("-fno-show-source-location"); 8689e820ee054fefe5422b4db3f681e567a8976747eDaniel Dunbar 8697695fba30221613b7cf31276456217c41bb90960Daniel Dunbar // -fdollars-in-identifiers default varies depending on platform and 8707695fba30221613b7cf31276456217c41bb90960Daniel Dunbar // language; only pass if specified. 8711eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump if (Arg *A = Args.getLastArg(options::OPT_fdollars_in_identifiers, 8727695fba30221613b7cf31276456217c41bb90960Daniel Dunbar options::OPT_fno_dollars_in_identifiers)) { 8737695fba30221613b7cf31276456217c41bb90960Daniel Dunbar if (A->getOption().matches(options::OPT_fdollars_in_identifiers)) 8747695fba30221613b7cf31276456217c41bb90960Daniel Dunbar CmdArgs.push_back("-fdollars-in-identifiers=1"); 8757695fba30221613b7cf31276456217c41bb90960Daniel Dunbar else 8767695fba30221613b7cf31276456217c41bb90960Daniel Dunbar CmdArgs.push_back("-fdollars-in-identifiers=0"); 8777695fba30221613b7cf31276456217c41bb90960Daniel Dunbar } 8787695fba30221613b7cf31276456217c41bb90960Daniel Dunbar 879e027a4b2399e9b0acfe0f77220c66bbe369067eeDaniel Dunbar // -funit-at-a-time is default, and we don't support -fno-unit-at-a-time for 880e027a4b2399e9b0acfe0f77220c66bbe369067eeDaniel Dunbar // practical purposes. 8811eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump if (Arg *A = Args.getLastArg(options::OPT_funit_at_a_time, 882e027a4b2399e9b0acfe0f77220c66bbe369067eeDaniel Dunbar options::OPT_fno_unit_at_a_time)) { 883e027a4b2399e9b0acfe0f77220c66bbe369067eeDaniel Dunbar if (A->getOption().matches(options::OPT_fno_unit_at_a_time)) 884e027a4b2399e9b0acfe0f77220c66bbe369067eeDaniel Dunbar D.Diag(clang::diag::err_drv_clang_unsupported) << A->getAsString(Args); 885e027a4b2399e9b0acfe0f77220c66bbe369067eeDaniel Dunbar } 886ceb5c5b7f67a30fae305d1d19b478b623e4fbcedEli Friedman 8872ba91575905a54f712a7f64304e56002e4882499Daniel Dunbar // Default to -fno-builtin-str{cat,cpy} on Darwin for ARM. 888f84a4a469d8a45c76cb941595582a0fd3b9b15d3Daniel Dunbar // 889f84a4a469d8a45c76cb941595582a0fd3b9b15d3Daniel Dunbar // FIXME: This is disabled until clang-cc supports -fno-builtin-foo. PR4941. 890f84a4a469d8a45c76cb941595582a0fd3b9b15d3Daniel Dunbar#if 0 8912ba91575905a54f712a7f64304e56002e4882499Daniel Dunbar if (getToolChain().getTriple().getOS() == llvm::Triple::Darwin && 8922ba91575905a54f712a7f64304e56002e4882499Daniel Dunbar (getToolChain().getTriple().getArch() == llvm::Triple::arm || 8932ba91575905a54f712a7f64304e56002e4882499Daniel Dunbar getToolChain().getTriple().getArch() == llvm::Triple::thumb)) { 8942ba91575905a54f712a7f64304e56002e4882499Daniel Dunbar if (!Args.hasArg(options::OPT_fbuiltin_strcat)) 8952ba91575905a54f712a7f64304e56002e4882499Daniel Dunbar CmdArgs.push_back("-fno-builtin-strcat"); 8962ba91575905a54f712a7f64304e56002e4882499Daniel Dunbar if (!Args.hasArg(options::OPT_fbuiltin_strcpy)) 8972ba91575905a54f712a7f64304e56002e4882499Daniel Dunbar CmdArgs.push_back("-fno-builtin-strcpy"); 8982ba91575905a54f712a7f64304e56002e4882499Daniel Dunbar } 899f84a4a469d8a45c76cb941595582a0fd3b9b15d3Daniel Dunbar#endif 9002ba91575905a54f712a7f64304e56002e4882499Daniel Dunbar 9011eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump if (Arg *A = Args.getLastArg(options::OPT_traditional, 902ceb5c5b7f67a30fae305d1d19b478b623e4fbcedEli Friedman options::OPT_traditional_cpp)) 903ceb5c5b7f67a30fae305d1d19b478b623e4fbcedEli Friedman D.Diag(clang::diag::err_drv_clang_unsupported) << A->getAsString(Args); 904ceb5c5b7f67a30fae305d1d19b478b623e4fbcedEli Friedman 9051d46033f760ba5fd266ce59fe391fac473f04f52Daniel Dunbar Args.AddLastArg(CmdArgs, options::OPT_dM); 906d82df3ad430397d7f9ef511e7c5157f997c41f53Chris Lattner Args.AddLastArg(CmdArgs, options::OPT_dD); 9071d46033f760ba5fd266ce59fe391fac473f04f52Daniel Dunbar 9081d46033f760ba5fd266ce59fe391fac473f04f52Daniel Dunbar Args.AddAllArgValues(CmdArgs, options::OPT_Xclang); 909e5280286573d4fe1220cdd66e147b572a05536a8Daniel Dunbar Args.AddAllArgValues(CmdArgs, options::OPT_mllvm); 9101d46033f760ba5fd266ce59fe391fac473f04f52Daniel Dunbar 911cd8e4c44dd068956e9181381be3ee2d49a0fac52Daniel Dunbar if (Output.getType() == types::TY_Dependencies) { 912cd8e4c44dd068956e9181381be3ee2d49a0fac52Daniel Dunbar // Handled with other dependency code. 913a5a7bd0de7b6b80212095195a055a4a43f21d4b2Daniel Dunbar } else if (Output.isPipe()) { 914b488c1dac8e53206f07103d794a62a3f5012c0f4Daniel Dunbar CmdArgs.push_back("-o"); 915b488c1dac8e53206f07103d794a62a3f5012c0f4Daniel Dunbar CmdArgs.push_back("-"); 916115a79277edababaf1b26e3654044ae983197679Daniel Dunbar } else if (Output.isFilename()) { 917b488c1dac8e53206f07103d794a62a3f5012c0f4Daniel Dunbar CmdArgs.push_back("-o"); 918115a79277edababaf1b26e3654044ae983197679Daniel Dunbar CmdArgs.push_back(Output.getFilename()); 919115a79277edababaf1b26e3654044ae983197679Daniel Dunbar } else { 920115a79277edababaf1b26e3654044ae983197679Daniel Dunbar assert(Output.isNothing() && "Invalid output."); 921b488c1dac8e53206f07103d794a62a3f5012c0f4Daniel Dunbar } 922b488c1dac8e53206f07103d794a62a3f5012c0f4Daniel Dunbar 9231d46033f760ba5fd266ce59fe391fac473f04f52Daniel Dunbar for (InputInfoList::const_iterator 9241d46033f760ba5fd266ce59fe391fac473f04f52Daniel Dunbar it = Inputs.begin(), ie = Inputs.end(); it != ie; ++it) { 9251d46033f760ba5fd266ce59fe391fac473f04f52Daniel Dunbar const InputInfo &II = *it; 9261d46033f760ba5fd266ce59fe391fac473f04f52Daniel Dunbar CmdArgs.push_back("-x"); 9271d46033f760ba5fd266ce59fe391fac473f04f52Daniel Dunbar CmdArgs.push_back(types::getTypeName(II.getType())); 9281d46033f760ba5fd266ce59fe391fac473f04f52Daniel Dunbar if (II.isPipe()) 9291d46033f760ba5fd266ce59fe391fac473f04f52Daniel Dunbar CmdArgs.push_back("-"); 930115a79277edababaf1b26e3654044ae983197679Daniel Dunbar else if (II.isFilename()) 931115a79277edababaf1b26e3654044ae983197679Daniel Dunbar CmdArgs.push_back(II.getFilename()); 9321d46033f760ba5fd266ce59fe391fac473f04f52Daniel Dunbar else 933115a79277edababaf1b26e3654044ae983197679Daniel Dunbar II.getInputArg().renderAsInput(Args, CmdArgs); 9341d46033f760ba5fd266ce59fe391fac473f04f52Daniel Dunbar } 935c21c485b4fb58ef5d55cf3e523263dd824a2ace4Daniel Dunbar 936c21c485b4fb58ef5d55cf3e523263dd824a2ace4Daniel Dunbar const char *Exec = 9375ed34f4c58b6ad4e21038d713c1fae31a6146ff5Daniel Dunbar Args.MakeArgString(getToolChain().GetProgramPath(C, "clang-cc")); 938cae087e164e94e4286c11bf694dd0ff88f295302Daniel Dunbar Dest.addCommand(new Command(JA, Exec, CmdArgs)); 939a880db0b0fc028abf754c290d921d809eec0518aDaniel Dunbar 9405c1aaafbd6dd25a99ca1960e1c3c98aeefe9d728Daniel Dunbar // Explicitly warn that these options are unsupported, even though 9415c1aaafbd6dd25a99ca1960e1c3c98aeefe9d728Daniel Dunbar // we are allowing compilation to continue. 9425c1aaafbd6dd25a99ca1960e1c3c98aeefe9d728Daniel Dunbar // FIXME: Use iterator. 943c21c485b4fb58ef5d55cf3e523263dd824a2ace4Daniel Dunbar for (ArgList::const_iterator 9445c1aaafbd6dd25a99ca1960e1c3c98aeefe9d728Daniel Dunbar it = Args.begin(), ie = Args.end(); it != ie; ++it) { 9455c1aaafbd6dd25a99ca1960e1c3c98aeefe9d728Daniel Dunbar const Arg *A = *it; 9465c1aaafbd6dd25a99ca1960e1c3c98aeefe9d728Daniel Dunbar if (A->getOption().matches(options::OPT_pg)) { 9475c1aaafbd6dd25a99ca1960e1c3c98aeefe9d728Daniel Dunbar A->claim(); 948c21c485b4fb58ef5d55cf3e523263dd824a2ace4Daniel Dunbar D.Diag(clang::diag::warn_drv_clang_unsupported) 9495c1aaafbd6dd25a99ca1960e1c3c98aeefe9d728Daniel Dunbar << A->getAsString(Args); 9505c1aaafbd6dd25a99ca1960e1c3c98aeefe9d728Daniel Dunbar } 9515c1aaafbd6dd25a99ca1960e1c3c98aeefe9d728Daniel Dunbar } 9525c1aaafbd6dd25a99ca1960e1c3c98aeefe9d728Daniel Dunbar 95368fb469aeb19144403e703b825854d08353c8eeaDaniel Dunbar // Claim some arguments which clang supports automatically. 95468fb469aeb19144403e703b825854d08353c8eeaDaniel Dunbar 95568fb469aeb19144403e703b825854d08353c8eeaDaniel Dunbar // -fpch-preprocess is used with gcc to add a special marker in the 95668fb469aeb19144403e703b825854d08353c8eeaDaniel Dunbar // -output to include the PCH file. Clang's PTH solution is 95768fb469aeb19144403e703b825854d08353c8eeaDaniel Dunbar // -completely transparent, so we do not need to deal with it at 95868fb469aeb19144403e703b825854d08353c8eeaDaniel Dunbar // -all. 95968fb469aeb19144403e703b825854d08353c8eeaDaniel Dunbar Args.ClaimAllArgs(options::OPT_fpch_preprocess); 960c21c485b4fb58ef5d55cf3e523263dd824a2ace4Daniel Dunbar 961a880db0b0fc028abf754c290d921d809eec0518aDaniel Dunbar // Claim some arguments which clang doesn't support, but we don't 962a880db0b0fc028abf754c290d921d809eec0518aDaniel Dunbar // care to warn the user about. 963c21c485b4fb58ef5d55cf3e523263dd824a2ace4Daniel Dunbar 964a880db0b0fc028abf754c290d921d809eec0518aDaniel Dunbar // FIXME: Use iterator. 965c21c485b4fb58ef5d55cf3e523263dd824a2ace4Daniel Dunbar for (ArgList::const_iterator 966a880db0b0fc028abf754c290d921d809eec0518aDaniel Dunbar it = Args.begin(), ie = Args.end(); it != ie; ++it) { 967a880db0b0fc028abf754c290d921d809eec0518aDaniel Dunbar const Arg *A = *it; 96806ef3c3e9be4923b8e29c8e267b0c56afaa14ff3Daniel Dunbar if (A->getOption().matches(options::OPT_clang_ignored_f_Group) || 96916fd3a9f5159b74bfdd65cf290b4bd091088de91Daniel Dunbar A->getOption().matches(options::OPT_clang_ignored_m_Group)) 970a880db0b0fc028abf754c290d921d809eec0518aDaniel Dunbar A->claim(); 971a880db0b0fc028abf754c290d921d809eec0518aDaniel Dunbar } 97247ac7d27c44bd64a7d0fc03d4babc196cf2b8230Daniel Dunbar} 97347ac7d27c44bd64a7d0fc03d4babc196cf2b8230Daniel Dunbar 974b488c1dac8e53206f07103d794a62a3f5012c0f4Daniel Dunbarvoid gcc::Common::ConstructJob(Compilation &C, const JobAction &JA, 975b488c1dac8e53206f07103d794a62a3f5012c0f4Daniel Dunbar Job &Dest, 976b488c1dac8e53206f07103d794a62a3f5012c0f4Daniel Dunbar const InputInfo &Output, 977b488c1dac8e53206f07103d794a62a3f5012c0f4Daniel Dunbar const InputInfoList &Inputs, 9781d46033f760ba5fd266ce59fe391fac473f04f52Daniel Dunbar const ArgList &Args, 979b488c1dac8e53206f07103d794a62a3f5012c0f4Daniel Dunbar const char *LinkingOutput) const { 980a8304f67291b0182fb64f3afc621615288dd1d31Daniel Dunbar const Driver &D = getToolChain().getHost().getDriver(); 981b488c1dac8e53206f07103d794a62a3f5012c0f4Daniel Dunbar ArgStringList CmdArgs; 982b488c1dac8e53206f07103d794a62a3f5012c0f4Daniel Dunbar 983c21c485b4fb58ef5d55cf3e523263dd824a2ace4Daniel Dunbar for (ArgList::const_iterator 9841d46033f760ba5fd266ce59fe391fac473f04f52Daniel Dunbar it = Args.begin(), ie = Args.end(); it != ie; ++it) { 985b488c1dac8e53206f07103d794a62a3f5012c0f4Daniel Dunbar Arg *A = *it; 9867587719c40ebf02bf11e5e66c30bd20e98edebc2Daniel Dunbar if (A->getOption().hasForwardToGCC()) { 9877587719c40ebf02bf11e5e66c30bd20e98edebc2Daniel Dunbar // It is unfortunate that we have to claim here, as this means 9887587719c40ebf02bf11e5e66c30bd20e98edebc2Daniel Dunbar // we will basically never report anything interesting for 9896ecc7a993f939c5255c36c7c0d965fb9c1543f2aDaniel Dunbar // platforms using a generic gcc, even if we are just using gcc 9906ecc7a993f939c5255c36c7c0d965fb9c1543f2aDaniel Dunbar // to get to the assembler. 9917587719c40ebf02bf11e5e66c30bd20e98edebc2Daniel Dunbar A->claim(); 9921d46033f760ba5fd266ce59fe391fac473f04f52Daniel Dunbar A->render(Args, CmdArgs); 9937587719c40ebf02bf11e5e66c30bd20e98edebc2Daniel Dunbar } 994b488c1dac8e53206f07103d794a62a3f5012c0f4Daniel Dunbar } 995c21c485b4fb58ef5d55cf3e523263dd824a2ace4Daniel Dunbar 996b488c1dac8e53206f07103d794a62a3f5012c0f4Daniel Dunbar RenderExtraToolArgs(CmdArgs); 997b488c1dac8e53206f07103d794a62a3f5012c0f4Daniel Dunbar 998b488c1dac8e53206f07103d794a62a3f5012c0f4Daniel Dunbar // If using a driver driver, force the arch. 9997cfe31a713d8fcfc2a1328e8fbd8efdeb0aec51bDaniel Dunbar const std::string &Arch = getToolChain().getArchName(); 1000b488c1dac8e53206f07103d794a62a3f5012c0f4Daniel Dunbar if (getToolChain().getHost().useDriverDriver()) { 1001b488c1dac8e53206f07103d794a62a3f5012c0f4Daniel Dunbar CmdArgs.push_back("-arch"); 1002bf54a06f9b771c2a2730cc63eb89bce0522515b5Daniel Dunbar 1003bf54a06f9b771c2a2730cc63eb89bce0522515b5Daniel Dunbar // FIXME: Remove these special cases. 10047cfe31a713d8fcfc2a1328e8fbd8efdeb0aec51bDaniel Dunbar if (Arch == "powerpc") 10057cfe31a713d8fcfc2a1328e8fbd8efdeb0aec51bDaniel Dunbar CmdArgs.push_back("ppc"); 10067cfe31a713d8fcfc2a1328e8fbd8efdeb0aec51bDaniel Dunbar else if (Arch == "powerpc64") 10077cfe31a713d8fcfc2a1328e8fbd8efdeb0aec51bDaniel Dunbar CmdArgs.push_back("ppc64"); 10087cfe31a713d8fcfc2a1328e8fbd8efdeb0aec51bDaniel Dunbar else 1009881376467c46c5c6cc16fa6790271c2c22e1d4f1Daniel Dunbar CmdArgs.push_back(Args.MakeArgString(Arch)); 1010b488c1dac8e53206f07103d794a62a3f5012c0f4Daniel Dunbar } 1011b488c1dac8e53206f07103d794a62a3f5012c0f4Daniel Dunbar 10126ecc7a993f939c5255c36c7c0d965fb9c1543f2aDaniel Dunbar // Try to force gcc to match the tool chain we want, if we recognize 10136ecc7a993f939c5255c36c7c0d965fb9c1543f2aDaniel Dunbar // the arch. 10147cfe31a713d8fcfc2a1328e8fbd8efdeb0aec51bDaniel Dunbar // 10157cfe31a713d8fcfc2a1328e8fbd8efdeb0aec51bDaniel Dunbar // FIXME: The triple class should directly provide the information we want 10167cfe31a713d8fcfc2a1328e8fbd8efdeb0aec51bDaniel Dunbar // here. 10177cfe31a713d8fcfc2a1328e8fbd8efdeb0aec51bDaniel Dunbar if (Arch == "i386" || Arch == "powerpc") 10186ecc7a993f939c5255c36c7c0d965fb9c1543f2aDaniel Dunbar CmdArgs.push_back("-m32"); 10197cfe31a713d8fcfc2a1328e8fbd8efdeb0aec51bDaniel Dunbar else if (Arch == "x86_64" || Arch == "powerpc64") 10206ecc7a993f939c5255c36c7c0d965fb9c1543f2aDaniel Dunbar CmdArgs.push_back("-m64"); 10216ecc7a993f939c5255c36c7c0d965fb9c1543f2aDaniel Dunbar 1022b488c1dac8e53206f07103d794a62a3f5012c0f4Daniel Dunbar if (Output.isPipe()) { 1023b488c1dac8e53206f07103d794a62a3f5012c0f4Daniel Dunbar CmdArgs.push_back("-o"); 1024b488c1dac8e53206f07103d794a62a3f5012c0f4Daniel Dunbar CmdArgs.push_back("-"); 1025115a79277edababaf1b26e3654044ae983197679Daniel Dunbar } else if (Output.isFilename()) { 1026b488c1dac8e53206f07103d794a62a3f5012c0f4Daniel Dunbar CmdArgs.push_back("-o"); 1027115a79277edababaf1b26e3654044ae983197679Daniel Dunbar CmdArgs.push_back(Output.getFilename()); 1028115a79277edababaf1b26e3654044ae983197679Daniel Dunbar } else { 1029115a79277edababaf1b26e3654044ae983197679Daniel Dunbar assert(Output.isNothing() && "Unexpected output"); 1030b488c1dac8e53206f07103d794a62a3f5012c0f4Daniel Dunbar CmdArgs.push_back("-fsyntax-only"); 1031115a79277edababaf1b26e3654044ae983197679Daniel Dunbar } 1032b488c1dac8e53206f07103d794a62a3f5012c0f4Daniel Dunbar 1033b488c1dac8e53206f07103d794a62a3f5012c0f4Daniel Dunbar 1034b488c1dac8e53206f07103d794a62a3f5012c0f4Daniel Dunbar // Only pass -x if gcc will understand it; otherwise hope gcc 1035b488c1dac8e53206f07103d794a62a3f5012c0f4Daniel Dunbar // understands the suffix correctly. The main use case this would go 1036b488c1dac8e53206f07103d794a62a3f5012c0f4Daniel Dunbar // wrong in is for linker inputs if they happened to have an odd 1037b488c1dac8e53206f07103d794a62a3f5012c0f4Daniel Dunbar // suffix; really the only way to get this to happen is a command 1038b488c1dac8e53206f07103d794a62a3f5012c0f4Daniel Dunbar // like '-x foobar a.c' which will treat a.c like a linker input. 1039b488c1dac8e53206f07103d794a62a3f5012c0f4Daniel Dunbar // 1040b488c1dac8e53206f07103d794a62a3f5012c0f4Daniel Dunbar // FIXME: For the linker case specifically, can we safely convert 1041b488c1dac8e53206f07103d794a62a3f5012c0f4Daniel Dunbar // inputs into '-Wl,' options? 1042b488c1dac8e53206f07103d794a62a3f5012c0f4Daniel Dunbar for (InputInfoList::const_iterator 1043b488c1dac8e53206f07103d794a62a3f5012c0f4Daniel Dunbar it = Inputs.begin(), ie = Inputs.end(); it != ie; ++it) { 1044b488c1dac8e53206f07103d794a62a3f5012c0f4Daniel Dunbar const InputInfo &II = *it; 1045a8304f67291b0182fb64f3afc621615288dd1d31Daniel Dunbar 10465915fbf310e171c4cd3c2af05e9de360c0fa988aDaniel Dunbar // Don't try to pass LLVM or AST inputs to a generic gcc. 1047a8304f67291b0182fb64f3afc621615288dd1d31Daniel Dunbar if (II.getType() == types::TY_LLVMBC) 1048a8304f67291b0182fb64f3afc621615288dd1d31Daniel Dunbar D.Diag(clang::diag::err_drv_no_linker_llvm_support) 1049881376467c46c5c6cc16fa6790271c2c22e1d4f1Daniel Dunbar << getToolChain().getTripleString(); 10505915fbf310e171c4cd3c2af05e9de360c0fa988aDaniel Dunbar else if (II.getType() == types::TY_AST) 10515915fbf310e171c4cd3c2af05e9de360c0fa988aDaniel Dunbar D.Diag(clang::diag::err_drv_no_ast_support) 1052881376467c46c5c6cc16fa6790271c2c22e1d4f1Daniel Dunbar << getToolChain().getTripleString(); 1053a8304f67291b0182fb64f3afc621615288dd1d31Daniel Dunbar 1054b488c1dac8e53206f07103d794a62a3f5012c0f4Daniel Dunbar if (types::canTypeBeUserSpecified(II.getType())) { 1055b488c1dac8e53206f07103d794a62a3f5012c0f4Daniel Dunbar CmdArgs.push_back("-x"); 1056b488c1dac8e53206f07103d794a62a3f5012c0f4Daniel Dunbar CmdArgs.push_back(types::getTypeName(II.getType())); 1057b488c1dac8e53206f07103d794a62a3f5012c0f4Daniel Dunbar } 1058b488c1dac8e53206f07103d794a62a3f5012c0f4Daniel Dunbar 1059b488c1dac8e53206f07103d794a62a3f5012c0f4Daniel Dunbar if (II.isPipe()) 1060b488c1dac8e53206f07103d794a62a3f5012c0f4Daniel Dunbar CmdArgs.push_back("-"); 1061115a79277edababaf1b26e3654044ae983197679Daniel Dunbar else if (II.isFilename()) 1062115a79277edababaf1b26e3654044ae983197679Daniel Dunbar CmdArgs.push_back(II.getFilename()); 1063b488c1dac8e53206f07103d794a62a3f5012c0f4Daniel Dunbar else 1064115a79277edababaf1b26e3654044ae983197679Daniel Dunbar // Don't render as input, we need gcc to do the translations. 1065115a79277edababaf1b26e3654044ae983197679Daniel Dunbar II.getInputArg().render(Args, CmdArgs); 1066b488c1dac8e53206f07103d794a62a3f5012c0f4Daniel Dunbar } 1067b488c1dac8e53206f07103d794a62a3f5012c0f4Daniel Dunbar 1068c21c485b4fb58ef5d55cf3e523263dd824a2ace4Daniel Dunbar const char *GCCName = 106978d8a089c8f124ba6f47bb37e2c4a36986f60e23Daniel Dunbar getToolChain().getHost().getDriver().CCCGenericGCCName.c_str(); 1070c21c485b4fb58ef5d55cf3e523263dd824a2ace4Daniel Dunbar const char *Exec = 10715ed34f4c58b6ad4e21038d713c1fae31a6146ff5Daniel Dunbar Args.MakeArgString(getToolChain().GetProgramPath(C, GCCName)); 1072cae087e164e94e4286c11bf694dd0ff88f295302Daniel Dunbar Dest.addCommand(new Command(JA, Exec, CmdArgs)); 107347ac7d27c44bd64a7d0fc03d4babc196cf2b8230Daniel Dunbar} 107447ac7d27c44bd64a7d0fc03d4babc196cf2b8230Daniel Dunbar 1075b488c1dac8e53206f07103d794a62a3f5012c0f4Daniel Dunbarvoid gcc::Preprocess::RenderExtraToolArgs(ArgStringList &CmdArgs) const { 1076b488c1dac8e53206f07103d794a62a3f5012c0f4Daniel Dunbar CmdArgs.push_back("-E"); 107747ac7d27c44bd64a7d0fc03d4babc196cf2b8230Daniel Dunbar} 107847ac7d27c44bd64a7d0fc03d4babc196cf2b8230Daniel Dunbar 1079b488c1dac8e53206f07103d794a62a3f5012c0f4Daniel Dunbarvoid gcc::Precompile::RenderExtraToolArgs(ArgStringList &CmdArgs) const { 1080b488c1dac8e53206f07103d794a62a3f5012c0f4Daniel Dunbar // The type is good enough. 108147ac7d27c44bd64a7d0fc03d4babc196cf2b8230Daniel Dunbar} 108247ac7d27c44bd64a7d0fc03d4babc196cf2b8230Daniel Dunbar 1083b488c1dac8e53206f07103d794a62a3f5012c0f4Daniel Dunbarvoid gcc::Compile::RenderExtraToolArgs(ArgStringList &CmdArgs) const { 1084b488c1dac8e53206f07103d794a62a3f5012c0f4Daniel Dunbar CmdArgs.push_back("-S"); 108547ac7d27c44bd64a7d0fc03d4babc196cf2b8230Daniel Dunbar} 108647ac7d27c44bd64a7d0fc03d4babc196cf2b8230Daniel Dunbar 1087b488c1dac8e53206f07103d794a62a3f5012c0f4Daniel Dunbarvoid gcc::Assemble::RenderExtraToolArgs(ArgStringList &CmdArgs) const { 1088b488c1dac8e53206f07103d794a62a3f5012c0f4Daniel Dunbar CmdArgs.push_back("-c"); 1089b488c1dac8e53206f07103d794a62a3f5012c0f4Daniel Dunbar} 109047ac7d27c44bd64a7d0fc03d4babc196cf2b8230Daniel Dunbar 1091b488c1dac8e53206f07103d794a62a3f5012c0f4Daniel Dunbarvoid gcc::Link::RenderExtraToolArgs(ArgStringList &CmdArgs) const { 1092b488c1dac8e53206f07103d794a62a3f5012c0f4Daniel Dunbar // The types are (hopefully) good enough. 109347ac7d27c44bd64a7d0fc03d4babc196cf2b8230Daniel Dunbar} 1094b488c1dac8e53206f07103d794a62a3f5012c0f4Daniel Dunbar 109540f1265ebd42ece3e7f7917319b56012e8e2bce2Daniel Dunbarconst char *darwin::CC1::getCC1Name(types::ID Type) const { 109640f1265ebd42ece3e7f7917319b56012e8e2bce2Daniel Dunbar switch (Type) { 109740f1265ebd42ece3e7f7917319b56012e8e2bce2Daniel Dunbar default: 109840f1265ebd42ece3e7f7917319b56012e8e2bce2Daniel Dunbar assert(0 && "Unexpected type for Darwin CC1 tool."); 109940f1265ebd42ece3e7f7917319b56012e8e2bce2Daniel Dunbar case types::TY_Asm: 110040f1265ebd42ece3e7f7917319b56012e8e2bce2Daniel Dunbar case types::TY_C: case types::TY_CHeader: 110140f1265ebd42ece3e7f7917319b56012e8e2bce2Daniel Dunbar case types::TY_PP_C: case types::TY_PP_CHeader: 110240f1265ebd42ece3e7f7917319b56012e8e2bce2Daniel Dunbar return "cc1"; 110340f1265ebd42ece3e7f7917319b56012e8e2bce2Daniel Dunbar case types::TY_ObjC: case types::TY_ObjCHeader: 110440f1265ebd42ece3e7f7917319b56012e8e2bce2Daniel Dunbar case types::TY_PP_ObjC: case types::TY_PP_ObjCHeader: 110540f1265ebd42ece3e7f7917319b56012e8e2bce2Daniel Dunbar return "cc1obj"; 110640f1265ebd42ece3e7f7917319b56012e8e2bce2Daniel Dunbar case types::TY_CXX: case types::TY_CXXHeader: 110740f1265ebd42ece3e7f7917319b56012e8e2bce2Daniel Dunbar case types::TY_PP_CXX: case types::TY_PP_CXXHeader: 110840f1265ebd42ece3e7f7917319b56012e8e2bce2Daniel Dunbar return "cc1plus"; 110940f1265ebd42ece3e7f7917319b56012e8e2bce2Daniel Dunbar case types::TY_ObjCXX: case types::TY_ObjCXXHeader: 111040f1265ebd42ece3e7f7917319b56012e8e2bce2Daniel Dunbar case types::TY_PP_ObjCXX: case types::TY_PP_ObjCXXHeader: 111140f1265ebd42ece3e7f7917319b56012e8e2bce2Daniel Dunbar return "cc1objplus"; 111240f1265ebd42ece3e7f7917319b56012e8e2bce2Daniel Dunbar } 111340f1265ebd42ece3e7f7917319b56012e8e2bce2Daniel Dunbar} 111440f1265ebd42ece3e7f7917319b56012e8e2bce2Daniel Dunbar 1115c21c485b4fb58ef5d55cf3e523263dd824a2ace4Daniel Dunbarconst char *darwin::CC1::getBaseInputName(const ArgList &Args, 1116a5a7bd0de7b6b80212095195a055a4a43f21d4b2Daniel Dunbar const InputInfoList &Inputs) { 1117a3ec60e0cf2a1916f479288998d31bd980b1a306Daniel Dunbar llvm::sys::Path P(Inputs[0].getBaseInput()); 1118881376467c46c5c6cc16fa6790271c2c22e1d4f1Daniel Dunbar return Args.MakeArgString(P.getLast()); 1119a3ec60e0cf2a1916f479288998d31bd980b1a306Daniel Dunbar} 1120a3ec60e0cf2a1916f479288998d31bd980b1a306Daniel Dunbar 1121c21c485b4fb58ef5d55cf3e523263dd824a2ace4Daniel Dunbarconst char *darwin::CC1::getBaseInputStem(const ArgList &Args, 1122a5a7bd0de7b6b80212095195a055a4a43f21d4b2Daniel Dunbar const InputInfoList &Inputs) { 1123a3ec60e0cf2a1916f479288998d31bd980b1a306Daniel Dunbar const char *Str = getBaseInputName(Args, Inputs); 1124a3ec60e0cf2a1916f479288998d31bd980b1a306Daniel Dunbar 1125a3ec60e0cf2a1916f479288998d31bd980b1a306Daniel Dunbar if (const char *End = strchr(Str, '.')) 1126881376467c46c5c6cc16fa6790271c2c22e1d4f1Daniel Dunbar return Args.MakeArgString(std::string(Str, End)); 1127a3ec60e0cf2a1916f479288998d31bd980b1a306Daniel Dunbar 1128a3ec60e0cf2a1916f479288998d31bd980b1a306Daniel Dunbar return Str; 1129a3ec60e0cf2a1916f479288998d31bd980b1a306Daniel Dunbar} 1130a3ec60e0cf2a1916f479288998d31bd980b1a306Daniel Dunbar 1131a3ec60e0cf2a1916f479288998d31bd980b1a306Daniel Dunbarconst char * 1132c21c485b4fb58ef5d55cf3e523263dd824a2ace4Daniel Dunbardarwin::CC1::getDependencyFileName(const ArgList &Args, 1133a5a7bd0de7b6b80212095195a055a4a43f21d4b2Daniel Dunbar const InputInfoList &Inputs) { 1134a3ec60e0cf2a1916f479288998d31bd980b1a306Daniel Dunbar // FIXME: Think about this more. 1135a3ec60e0cf2a1916f479288998d31bd980b1a306Daniel Dunbar std::string Res; 1136a3ec60e0cf2a1916f479288998d31bd980b1a306Daniel Dunbar 1137a3ec60e0cf2a1916f479288998d31bd980b1a306Daniel Dunbar if (Arg *OutputOpt = Args.getLastArg(options::OPT_o)) { 1138a3ec60e0cf2a1916f479288998d31bd980b1a306Daniel Dunbar std::string Str(OutputOpt->getValue(Args)); 1139c21c485b4fb58ef5d55cf3e523263dd824a2ace4Daniel Dunbar 1140a3ec60e0cf2a1916f479288998d31bd980b1a306Daniel Dunbar Res = Str.substr(0, Str.rfind('.')); 1141a3ec60e0cf2a1916f479288998d31bd980b1a306Daniel Dunbar } else 1142a5a7bd0de7b6b80212095195a055a4a43f21d4b2Daniel Dunbar Res = darwin::CC1::getBaseInputStem(Args, Inputs); 1143a3ec60e0cf2a1916f479288998d31bd980b1a306Daniel Dunbar 1144881376467c46c5c6cc16fa6790271c2c22e1d4f1Daniel Dunbar return Args.MakeArgString(Res + ".d"); 1145a3ec60e0cf2a1916f479288998d31bd980b1a306Daniel Dunbar} 1146a3ec60e0cf2a1916f479288998d31bd980b1a306Daniel Dunbar 1147c21c485b4fb58ef5d55cf3e523263dd824a2ace4Daniel Dunbarvoid darwin::CC1::AddCC1Args(const ArgList &Args, 1148a3ec60e0cf2a1916f479288998d31bd980b1a306Daniel Dunbar ArgStringList &CmdArgs) const { 1149e2fd66418eca3d70cf6b62087d745d0c5181db69Daniel Dunbar const Driver &D = getToolChain().getHost().getDriver(); 1150e2fd66418eca3d70cf6b62087d745d0c5181db69Daniel Dunbar 1151e2fd66418eca3d70cf6b62087d745d0c5181db69Daniel Dunbar CheckCodeGenerationOptions(D, Args); 1152e2fd66418eca3d70cf6b62087d745d0c5181db69Daniel Dunbar 1153a3ec60e0cf2a1916f479288998d31bd980b1a306Daniel Dunbar // Derived from cc1 spec. 1154a3ec60e0cf2a1916f479288998d31bd980b1a306Daniel Dunbar if (!Args.hasArg(options::OPT_mkernel) && !Args.hasArg(options::OPT_static) && 1155a3ec60e0cf2a1916f479288998d31bd980b1a306Daniel Dunbar !Args.hasArg(options::OPT_mdynamic_no_pic)) 1156a3ec60e0cf2a1916f479288998d31bd980b1a306Daniel Dunbar CmdArgs.push_back("-fPIC"); 1157a3ec60e0cf2a1916f479288998d31bd980b1a306Daniel Dunbar 11582ba91575905a54f712a7f64304e56002e4882499Daniel Dunbar if (getToolChain().getTriple().getArch() == llvm::Triple::arm || 11592ba91575905a54f712a7f64304e56002e4882499Daniel Dunbar getToolChain().getTriple().getArch() == llvm::Triple::thumb) { 11602ba91575905a54f712a7f64304e56002e4882499Daniel Dunbar if (!Args.hasArg(options::OPT_fbuiltin_strcat)) 11612ba91575905a54f712a7f64304e56002e4882499Daniel Dunbar CmdArgs.push_back("-fno-builtin-strcat"); 11622ba91575905a54f712a7f64304e56002e4882499Daniel Dunbar if (!Args.hasArg(options::OPT_fbuiltin_strcpy)) 11632ba91575905a54f712a7f64304e56002e4882499Daniel Dunbar CmdArgs.push_back("-fno-builtin-strcpy"); 11642ba91575905a54f712a7f64304e56002e4882499Daniel Dunbar } 11652ba91575905a54f712a7f64304e56002e4882499Daniel Dunbar 1166a3ec60e0cf2a1916f479288998d31bd980b1a306Daniel Dunbar // gcc has some code here to deal with when no -mmacosx-version-min 1167a3ec60e0cf2a1916f479288998d31bd980b1a306Daniel Dunbar // and no -miphoneos-version-min is present, but this never happens 1168a3ec60e0cf2a1916f479288998d31bd980b1a306Daniel Dunbar // due to tool chain specific argument translation. 1169a3ec60e0cf2a1916f479288998d31bd980b1a306Daniel Dunbar 1170a3ec60e0cf2a1916f479288998d31bd980b1a306Daniel Dunbar if (Args.hasArg(options::OPT_g_Flag) && 1171a3ec60e0cf2a1916f479288998d31bd980b1a306Daniel Dunbar !Args.hasArg(options::OPT_fno_eliminate_unused_debug_symbols)) 1172a3ec60e0cf2a1916f479288998d31bd980b1a306Daniel Dunbar CmdArgs.push_back("-feliminate-unused-debug-symbols"); 1173a3ec60e0cf2a1916f479288998d31bd980b1a306Daniel Dunbar} 1174a3ec60e0cf2a1916f479288998d31bd980b1a306Daniel Dunbar 1175a3ec60e0cf2a1916f479288998d31bd980b1a306Daniel Dunbarvoid darwin::CC1::AddCC1OptionsArgs(const ArgList &Args, ArgStringList &CmdArgs, 1176a3ec60e0cf2a1916f479288998d31bd980b1a306Daniel Dunbar const InputInfoList &Inputs, 1177a3ec60e0cf2a1916f479288998d31bd980b1a306Daniel Dunbar const ArgStringList &OutputArgs) const { 1178a3ec60e0cf2a1916f479288998d31bd980b1a306Daniel Dunbar const Driver &D = getToolChain().getHost().getDriver(); 1179a3ec60e0cf2a1916f479288998d31bd980b1a306Daniel Dunbar 1180a3ec60e0cf2a1916f479288998d31bd980b1a306Daniel Dunbar // Derived from cc1_options spec. 1181a3ec60e0cf2a1916f479288998d31bd980b1a306Daniel Dunbar if (Args.hasArg(options::OPT_fast) || 1182a3ec60e0cf2a1916f479288998d31bd980b1a306Daniel Dunbar Args.hasArg(options::OPT_fastf) || 1183a3ec60e0cf2a1916f479288998d31bd980b1a306Daniel Dunbar Args.hasArg(options::OPT_fastcp)) 1184a3ec60e0cf2a1916f479288998d31bd980b1a306Daniel Dunbar CmdArgs.push_back("-O3"); 1185c21c485b4fb58ef5d55cf3e523263dd824a2ace4Daniel Dunbar 1186a3ec60e0cf2a1916f479288998d31bd980b1a306Daniel Dunbar if (Arg *A = Args.getLastArg(options::OPT_pg)) 1187a3ec60e0cf2a1916f479288998d31bd980b1a306Daniel Dunbar if (Args.hasArg(options::OPT_fomit_frame_pointer)) 1188a3ec60e0cf2a1916f479288998d31bd980b1a306Daniel Dunbar D.Diag(clang::diag::err_drv_argument_not_allowed_with) 1189a3ec60e0cf2a1916f479288998d31bd980b1a306Daniel Dunbar << A->getAsString(Args) << "-fomit-frame-pointer"; 1190a3ec60e0cf2a1916f479288998d31bd980b1a306Daniel Dunbar 1191a3ec60e0cf2a1916f479288998d31bd980b1a306Daniel Dunbar AddCC1Args(Args, CmdArgs); 1192a3ec60e0cf2a1916f479288998d31bd980b1a306Daniel Dunbar 1193a3ec60e0cf2a1916f479288998d31bd980b1a306Daniel Dunbar if (!Args.hasArg(options::OPT_Q)) 1194a3ec60e0cf2a1916f479288998d31bd980b1a306Daniel Dunbar CmdArgs.push_back("-quiet"); 1195a3ec60e0cf2a1916f479288998d31bd980b1a306Daniel Dunbar 1196a3ec60e0cf2a1916f479288998d31bd980b1a306Daniel Dunbar CmdArgs.push_back("-dumpbase"); 1197a5a7bd0de7b6b80212095195a055a4a43f21d4b2Daniel Dunbar CmdArgs.push_back(darwin::CC1::getBaseInputName(Args, Inputs)); 1198a3ec60e0cf2a1916f479288998d31bd980b1a306Daniel Dunbar 1199a3ec60e0cf2a1916f479288998d31bd980b1a306Daniel Dunbar Args.AddAllArgs(CmdArgs, options::OPT_d_Group); 1200a3ec60e0cf2a1916f479288998d31bd980b1a306Daniel Dunbar 1201a3ec60e0cf2a1916f479288998d31bd980b1a306Daniel Dunbar Args.AddAllArgs(CmdArgs, options::OPT_m_Group); 1202a3ec60e0cf2a1916f479288998d31bd980b1a306Daniel Dunbar Args.AddAllArgs(CmdArgs, options::OPT_a_Group); 1203a3ec60e0cf2a1916f479288998d31bd980b1a306Daniel Dunbar 1204a3ec60e0cf2a1916f479288998d31bd980b1a306Daniel Dunbar // FIXME: The goal is to use the user provided -o if that is our 1205a3ec60e0cf2a1916f479288998d31bd980b1a306Daniel Dunbar // final output, otherwise to drive from the original input 1206a3ec60e0cf2a1916f479288998d31bd980b1a306Daniel Dunbar // name. Find a clean way to go about this. 1207a3ec60e0cf2a1916f479288998d31bd980b1a306Daniel Dunbar if ((Args.hasArg(options::OPT_c) || Args.hasArg(options::OPT_S)) && 1208a3ec60e0cf2a1916f479288998d31bd980b1a306Daniel Dunbar Args.hasArg(options::OPT_o)) { 1209a3ec60e0cf2a1916f479288998d31bd980b1a306Daniel Dunbar Arg *OutputOpt = Args.getLastArg(options::OPT_o); 1210a3ec60e0cf2a1916f479288998d31bd980b1a306Daniel Dunbar CmdArgs.push_back("-auxbase-strip"); 1211a3ec60e0cf2a1916f479288998d31bd980b1a306Daniel Dunbar CmdArgs.push_back(OutputOpt->getValue(Args)); 1212a3ec60e0cf2a1916f479288998d31bd980b1a306Daniel Dunbar } else { 1213a3ec60e0cf2a1916f479288998d31bd980b1a306Daniel Dunbar CmdArgs.push_back("-auxbase"); 1214a5a7bd0de7b6b80212095195a055a4a43f21d4b2Daniel Dunbar CmdArgs.push_back(darwin::CC1::getBaseInputStem(Args, Inputs)); 1215a3ec60e0cf2a1916f479288998d31bd980b1a306Daniel Dunbar } 1216a3ec60e0cf2a1916f479288998d31bd980b1a306Daniel Dunbar 1217a3ec60e0cf2a1916f479288998d31bd980b1a306Daniel Dunbar Args.AddAllArgs(CmdArgs, options::OPT_g_Group); 1218a3ec60e0cf2a1916f479288998d31bd980b1a306Daniel Dunbar 1219a3ec60e0cf2a1916f479288998d31bd980b1a306Daniel Dunbar Args.AddAllArgs(CmdArgs, options::OPT_O); 1220a3ec60e0cf2a1916f479288998d31bd980b1a306Daniel Dunbar // FIXME: -Wall is getting some special treatment. Investigate. 1221a3ec60e0cf2a1916f479288998d31bd980b1a306Daniel Dunbar Args.AddAllArgs(CmdArgs, options::OPT_W_Group, options::OPT_pedantic_Group); 1222a3ec60e0cf2a1916f479288998d31bd980b1a306Daniel Dunbar Args.AddLastArg(CmdArgs, options::OPT_w); 1223c21c485b4fb58ef5d55cf3e523263dd824a2ace4Daniel Dunbar Args.AddAllArgs(CmdArgs, options::OPT_std_EQ, options::OPT_ansi, 1224a3ec60e0cf2a1916f479288998d31bd980b1a306Daniel Dunbar options::OPT_trigraphs); 1225a3ff202ee4fb21728e930d5d029ba4925129912cDaniel Dunbar if (!Args.getLastArg(options::OPT_std_EQ, options::OPT_ansi)) { 1226a3ff202ee4fb21728e930d5d029ba4925129912cDaniel Dunbar // Honor -std-default. 1227a3ff202ee4fb21728e930d5d029ba4925129912cDaniel Dunbar Args.AddAllArgsTranslated(CmdArgs, options::OPT_std_default_EQ, 1228a3ff202ee4fb21728e930d5d029ba4925129912cDaniel Dunbar "-std=", /*Joined=*/true); 1229a3ff202ee4fb21728e930d5d029ba4925129912cDaniel Dunbar } 1230a3ff202ee4fb21728e930d5d029ba4925129912cDaniel Dunbar 1231a3ec60e0cf2a1916f479288998d31bd980b1a306Daniel Dunbar if (Args.hasArg(options::OPT_v)) 1232a3ec60e0cf2a1916f479288998d31bd980b1a306Daniel Dunbar CmdArgs.push_back("-version"); 1233a3ec60e0cf2a1916f479288998d31bd980b1a306Daniel Dunbar if (Args.hasArg(options::OPT_pg)) 1234a3ec60e0cf2a1916f479288998d31bd980b1a306Daniel Dunbar CmdArgs.push_back("-p"); 1235a3ec60e0cf2a1916f479288998d31bd980b1a306Daniel Dunbar Args.AddLastArg(CmdArgs, options::OPT_p); 1236c21c485b4fb58ef5d55cf3e523263dd824a2ace4Daniel Dunbar 1237a3ec60e0cf2a1916f479288998d31bd980b1a306Daniel Dunbar // The driver treats -fsyntax-only specially. 12382ba91575905a54f712a7f64304e56002e4882499Daniel Dunbar if (getToolChain().getTriple().getArch() == llvm::Triple::arm || 12392ba91575905a54f712a7f64304e56002e4882499Daniel Dunbar getToolChain().getTriple().getArch() == llvm::Triple::thumb) { 12402ba91575905a54f712a7f64304e56002e4882499Daniel Dunbar // Removes -fbuiltin-str{cat,cpy}; these aren't recognized by cc1 but are 12412ba91575905a54f712a7f64304e56002e4882499Daniel Dunbar // used to inhibit the default -fno-builtin-str{cat,cpy}. 12422ba91575905a54f712a7f64304e56002e4882499Daniel Dunbar // 12432ba91575905a54f712a7f64304e56002e4882499Daniel Dunbar // FIXME: Should we grow a better way to deal with "removing" args? 12442ba91575905a54f712a7f64304e56002e4882499Daniel Dunbar // 12452ba91575905a54f712a7f64304e56002e4882499Daniel Dunbar // FIXME: Use iterator. 12462ba91575905a54f712a7f64304e56002e4882499Daniel Dunbar for (ArgList::const_iterator it = Args.begin(), 12472ba91575905a54f712a7f64304e56002e4882499Daniel Dunbar ie = Args.end(); it != ie; ++it) { 12482ba91575905a54f712a7f64304e56002e4882499Daniel Dunbar const Arg *A = *it; 1249728a512753d85a6ccaae34e81385c8665c2de0e1Daniel Dunbar if (A->getOption().matches(options::OPT_f_Group) || 12502ba91575905a54f712a7f64304e56002e4882499Daniel Dunbar A->getOption().matches(options::OPT_fsyntax_only)) { 12512ba91575905a54f712a7f64304e56002e4882499Daniel Dunbar if (!A->getOption().matches(options::OPT_fbuiltin_strcat) && 12522ba91575905a54f712a7f64304e56002e4882499Daniel Dunbar !A->getOption().matches(options::OPT_fbuiltin_strcpy)) { 12532ba91575905a54f712a7f64304e56002e4882499Daniel Dunbar A->claim(); 12542ba91575905a54f712a7f64304e56002e4882499Daniel Dunbar A->render(Args, CmdArgs); 12552ba91575905a54f712a7f64304e56002e4882499Daniel Dunbar } 12562ba91575905a54f712a7f64304e56002e4882499Daniel Dunbar } 12572ba91575905a54f712a7f64304e56002e4882499Daniel Dunbar } 12582ba91575905a54f712a7f64304e56002e4882499Daniel Dunbar } else 12592ba91575905a54f712a7f64304e56002e4882499Daniel Dunbar Args.AddAllArgs(CmdArgs, options::OPT_f_Group, options::OPT_fsyntax_only); 1260c21c485b4fb58ef5d55cf3e523263dd824a2ace4Daniel Dunbar 1261a3ec60e0cf2a1916f479288998d31bd980b1a306Daniel Dunbar Args.AddAllArgs(CmdArgs, options::OPT_undef); 1262a3ec60e0cf2a1916f479288998d31bd980b1a306Daniel Dunbar if (Args.hasArg(options::OPT_Qn)) 1263a3ec60e0cf2a1916f479288998d31bd980b1a306Daniel Dunbar CmdArgs.push_back("-fno-ident"); 1264c21c485b4fb58ef5d55cf3e523263dd824a2ace4Daniel Dunbar 1265a3ec60e0cf2a1916f479288998d31bd980b1a306Daniel Dunbar // FIXME: This isn't correct. 1266a3ec60e0cf2a1916f479288998d31bd980b1a306Daniel Dunbar //Args.AddLastArg(CmdArgs, options::OPT__help) 1267a3ec60e0cf2a1916f479288998d31bd980b1a306Daniel Dunbar //Args.AddLastArg(CmdArgs, options::OPT__targetHelp) 1268a3ec60e0cf2a1916f479288998d31bd980b1a306Daniel Dunbar 1269a3ec60e0cf2a1916f479288998d31bd980b1a306Daniel Dunbar CmdArgs.append(OutputArgs.begin(), OutputArgs.end()); 1270a3ec60e0cf2a1916f479288998d31bd980b1a306Daniel Dunbar 1271a3ec60e0cf2a1916f479288998d31bd980b1a306Daniel Dunbar // FIXME: Still don't get what is happening here. Investigate. 1272a3ec60e0cf2a1916f479288998d31bd980b1a306Daniel Dunbar Args.AddAllArgs(CmdArgs, options::OPT__param); 1273a3ec60e0cf2a1916f479288998d31bd980b1a306Daniel Dunbar 1274a3ec60e0cf2a1916f479288998d31bd980b1a306Daniel Dunbar if (Args.hasArg(options::OPT_fmudflap) || 1275a3ec60e0cf2a1916f479288998d31bd980b1a306Daniel Dunbar Args.hasArg(options::OPT_fmudflapth)) { 1276a3ec60e0cf2a1916f479288998d31bd980b1a306Daniel Dunbar CmdArgs.push_back("-fno-builtin"); 1277a3ec60e0cf2a1916f479288998d31bd980b1a306Daniel Dunbar CmdArgs.push_back("-fno-merge-constants"); 1278a3ec60e0cf2a1916f479288998d31bd980b1a306Daniel Dunbar } 1279c21c485b4fb58ef5d55cf3e523263dd824a2ace4Daniel Dunbar 1280a3ec60e0cf2a1916f479288998d31bd980b1a306Daniel Dunbar if (Args.hasArg(options::OPT_coverage)) { 1281a3ec60e0cf2a1916f479288998d31bd980b1a306Daniel Dunbar CmdArgs.push_back("-fprofile-arcs"); 1282a3ec60e0cf2a1916f479288998d31bd980b1a306Daniel Dunbar CmdArgs.push_back("-ftest-coverage"); 1283a3ec60e0cf2a1916f479288998d31bd980b1a306Daniel Dunbar } 1284a3ec60e0cf2a1916f479288998d31bd980b1a306Daniel Dunbar 1285a3ec60e0cf2a1916f479288998d31bd980b1a306Daniel Dunbar if (types::isCXX(Inputs[0].getType())) 1286a3ec60e0cf2a1916f479288998d31bd980b1a306Daniel Dunbar CmdArgs.push_back("-D__private_extern__=extern"); 1287a3ec60e0cf2a1916f479288998d31bd980b1a306Daniel Dunbar} 1288a3ec60e0cf2a1916f479288998d31bd980b1a306Daniel Dunbar 1289a3ec60e0cf2a1916f479288998d31bd980b1a306Daniel Dunbarvoid darwin::CC1::AddCPPOptionsArgs(const ArgList &Args, ArgStringList &CmdArgs, 1290a3ec60e0cf2a1916f479288998d31bd980b1a306Daniel Dunbar const InputInfoList &Inputs, 1291a3ec60e0cf2a1916f479288998d31bd980b1a306Daniel Dunbar const ArgStringList &OutputArgs) const { 1292a3ec60e0cf2a1916f479288998d31bd980b1a306Daniel Dunbar // Derived from cpp_options 1293a3ec60e0cf2a1916f479288998d31bd980b1a306Daniel Dunbar AddCPPUniqueOptionsArgs(Args, CmdArgs, Inputs); 1294c21c485b4fb58ef5d55cf3e523263dd824a2ace4Daniel Dunbar 1295a3ec60e0cf2a1916f479288998d31bd980b1a306Daniel Dunbar CmdArgs.append(OutputArgs.begin(), OutputArgs.end()); 1296a3ec60e0cf2a1916f479288998d31bd980b1a306Daniel Dunbar 1297a3ec60e0cf2a1916f479288998d31bd980b1a306Daniel Dunbar AddCC1Args(Args, CmdArgs); 1298a3ec60e0cf2a1916f479288998d31bd980b1a306Daniel Dunbar 1299a3ec60e0cf2a1916f479288998d31bd980b1a306Daniel Dunbar // NOTE: The code below has some commonality with cpp_options, but 1300a3ec60e0cf2a1916f479288998d31bd980b1a306Daniel Dunbar // in classic gcc style ends up sending things in different 1301a3ec60e0cf2a1916f479288998d31bd980b1a306Daniel Dunbar // orders. This may be a good merge candidate once we drop pedantic 1302a3ec60e0cf2a1916f479288998d31bd980b1a306Daniel Dunbar // compatibility. 1303a3ec60e0cf2a1916f479288998d31bd980b1a306Daniel Dunbar 1304a3ec60e0cf2a1916f479288998d31bd980b1a306Daniel Dunbar Args.AddAllArgs(CmdArgs, options::OPT_m_Group); 1305c21c485b4fb58ef5d55cf3e523263dd824a2ace4Daniel Dunbar Args.AddAllArgs(CmdArgs, options::OPT_std_EQ, options::OPT_ansi, 1306a3ec60e0cf2a1916f479288998d31bd980b1a306Daniel Dunbar options::OPT_trigraphs); 1307a3ff202ee4fb21728e930d5d029ba4925129912cDaniel Dunbar if (!Args.getLastArg(options::OPT_std_EQ, options::OPT_ansi)) { 1308a3ff202ee4fb21728e930d5d029ba4925129912cDaniel Dunbar // Honor -std-default. 1309a3ff202ee4fb21728e930d5d029ba4925129912cDaniel Dunbar Args.AddAllArgsTranslated(CmdArgs, options::OPT_std_default_EQ, 1310a3ff202ee4fb21728e930d5d029ba4925129912cDaniel Dunbar "-std=", /*Joined=*/true); 1311a3ff202ee4fb21728e930d5d029ba4925129912cDaniel Dunbar } 1312a3ec60e0cf2a1916f479288998d31bd980b1a306Daniel Dunbar Args.AddAllArgs(CmdArgs, options::OPT_W_Group, options::OPT_pedantic_Group); 1313a3ec60e0cf2a1916f479288998d31bd980b1a306Daniel Dunbar Args.AddLastArg(CmdArgs, options::OPT_w); 1314c21c485b4fb58ef5d55cf3e523263dd824a2ace4Daniel Dunbar 1315a3ec60e0cf2a1916f479288998d31bd980b1a306Daniel Dunbar // The driver treats -fsyntax-only specially. 1316a3ec60e0cf2a1916f479288998d31bd980b1a306Daniel Dunbar Args.AddAllArgs(CmdArgs, options::OPT_f_Group, options::OPT_fsyntax_only); 1317a3ec60e0cf2a1916f479288998d31bd980b1a306Daniel Dunbar 1318a3ec60e0cf2a1916f479288998d31bd980b1a306Daniel Dunbar if (Args.hasArg(options::OPT_g_Group) && !Args.hasArg(options::OPT_g0) && 1319a3ec60e0cf2a1916f479288998d31bd980b1a306Daniel Dunbar !Args.hasArg(options::OPT_fno_working_directory)) 1320a3ec60e0cf2a1916f479288998d31bd980b1a306Daniel Dunbar CmdArgs.push_back("-fworking-directory"); 1321a3ec60e0cf2a1916f479288998d31bd980b1a306Daniel Dunbar 1322a3ec60e0cf2a1916f479288998d31bd980b1a306Daniel Dunbar Args.AddAllArgs(CmdArgs, options::OPT_O); 1323a3ec60e0cf2a1916f479288998d31bd980b1a306Daniel Dunbar Args.AddAllArgs(CmdArgs, options::OPT_undef); 1324a3ec60e0cf2a1916f479288998d31bd980b1a306Daniel Dunbar if (Args.hasArg(options::OPT_save_temps)) 1325a3ec60e0cf2a1916f479288998d31bd980b1a306Daniel Dunbar CmdArgs.push_back("-fpch-preprocess"); 1326a3ec60e0cf2a1916f479288998d31bd980b1a306Daniel Dunbar} 1327a3ec60e0cf2a1916f479288998d31bd980b1a306Daniel Dunbar 1328c21c485b4fb58ef5d55cf3e523263dd824a2ace4Daniel Dunbarvoid darwin::CC1::AddCPPUniqueOptionsArgs(const ArgList &Args, 1329a3ec60e0cf2a1916f479288998d31bd980b1a306Daniel Dunbar ArgStringList &CmdArgs, 13301eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump const InputInfoList &Inputs) const { 1331a3ec60e0cf2a1916f479288998d31bd980b1a306Daniel Dunbar const Driver &D = getToolChain().getHost().getDriver(); 1332a3ec60e0cf2a1916f479288998d31bd980b1a306Daniel Dunbar 133388a3d6cf5ebab81614f89ba48a8d89023270637aDaniel Dunbar CheckPreprocessingOptions(D, Args); 133488a3d6cf5ebab81614f89ba48a8d89023270637aDaniel Dunbar 1335a3ec60e0cf2a1916f479288998d31bd980b1a306Daniel Dunbar // Derived from cpp_unique_options. 133688a3d6cf5ebab81614f89ba48a8d89023270637aDaniel Dunbar // -{C,CC} only with -E is checked in CheckPreprocessingOptions(). 133788a3d6cf5ebab81614f89ba48a8d89023270637aDaniel Dunbar Args.AddLastArg(CmdArgs, options::OPT_C); 133888a3d6cf5ebab81614f89ba48a8d89023270637aDaniel Dunbar Args.AddLastArg(CmdArgs, options::OPT_CC); 1339a3ec60e0cf2a1916f479288998d31bd980b1a306Daniel Dunbar if (!Args.hasArg(options::OPT_Q)) 1340a3ec60e0cf2a1916f479288998d31bd980b1a306Daniel Dunbar CmdArgs.push_back("-quiet"); 1341a3ec60e0cf2a1916f479288998d31bd980b1a306Daniel Dunbar Args.AddAllArgs(CmdArgs, options::OPT_nostdinc); 1342a3ec60e0cf2a1916f479288998d31bd980b1a306Daniel Dunbar Args.AddLastArg(CmdArgs, options::OPT_v); 1343a3ec60e0cf2a1916f479288998d31bd980b1a306Daniel Dunbar Args.AddAllArgs(CmdArgs, options::OPT_I_Group, options::OPT_F); 1344a3ec60e0cf2a1916f479288998d31bd980b1a306Daniel Dunbar Args.AddLastArg(CmdArgs, options::OPT_P); 1345a3ec60e0cf2a1916f479288998d31bd980b1a306Daniel Dunbar 1346a3ec60e0cf2a1916f479288998d31bd980b1a306Daniel Dunbar // FIXME: Handle %I properly. 1347a3ec60e0cf2a1916f479288998d31bd980b1a306Daniel Dunbar if (getToolChain().getArchName() == "x86_64") { 1348a3ec60e0cf2a1916f479288998d31bd980b1a306Daniel Dunbar CmdArgs.push_back("-imultilib"); 1349a3ec60e0cf2a1916f479288998d31bd980b1a306Daniel Dunbar CmdArgs.push_back("x86_64"); 1350a3ec60e0cf2a1916f479288998d31bd980b1a306Daniel Dunbar } 1351a3ec60e0cf2a1916f479288998d31bd980b1a306Daniel Dunbar 1352a3ec60e0cf2a1916f479288998d31bd980b1a306Daniel Dunbar if (Args.hasArg(options::OPT_MD)) { 1353a3ec60e0cf2a1916f479288998d31bd980b1a306Daniel Dunbar CmdArgs.push_back("-MD"); 1354a5a7bd0de7b6b80212095195a055a4a43f21d4b2Daniel Dunbar CmdArgs.push_back(darwin::CC1::getDependencyFileName(Args, Inputs)); 1355a3ec60e0cf2a1916f479288998d31bd980b1a306Daniel Dunbar } 1356a3ec60e0cf2a1916f479288998d31bd980b1a306Daniel Dunbar 1357a3ec60e0cf2a1916f479288998d31bd980b1a306Daniel Dunbar if (Args.hasArg(options::OPT_MMD)) { 1358a3ec60e0cf2a1916f479288998d31bd980b1a306Daniel Dunbar CmdArgs.push_back("-MMD"); 1359a5a7bd0de7b6b80212095195a055a4a43f21d4b2Daniel Dunbar CmdArgs.push_back(darwin::CC1::getDependencyFileName(Args, Inputs)); 1360a3ec60e0cf2a1916f479288998d31bd980b1a306Daniel Dunbar } 1361a3ec60e0cf2a1916f479288998d31bd980b1a306Daniel Dunbar 1362a3ec60e0cf2a1916f479288998d31bd980b1a306Daniel Dunbar Args.AddLastArg(CmdArgs, options::OPT_M); 1363a3ec60e0cf2a1916f479288998d31bd980b1a306Daniel Dunbar Args.AddLastArg(CmdArgs, options::OPT_MM); 1364a3ec60e0cf2a1916f479288998d31bd980b1a306Daniel Dunbar Args.AddAllArgs(CmdArgs, options::OPT_MF); 1365a3ec60e0cf2a1916f479288998d31bd980b1a306Daniel Dunbar Args.AddLastArg(CmdArgs, options::OPT_MG); 1366a3ec60e0cf2a1916f479288998d31bd980b1a306Daniel Dunbar Args.AddLastArg(CmdArgs, options::OPT_MP); 1367a3ec60e0cf2a1916f479288998d31bd980b1a306Daniel Dunbar Args.AddAllArgs(CmdArgs, options::OPT_MQ); 1368a3ec60e0cf2a1916f479288998d31bd980b1a306Daniel Dunbar Args.AddAllArgs(CmdArgs, options::OPT_MT); 1369a3ec60e0cf2a1916f479288998d31bd980b1a306Daniel Dunbar if (!Args.hasArg(options::OPT_M) && !Args.hasArg(options::OPT_MM) && 1370a3ec60e0cf2a1916f479288998d31bd980b1a306Daniel Dunbar (Args.hasArg(options::OPT_MD) || Args.hasArg(options::OPT_MMD))) { 1371a3ec60e0cf2a1916f479288998d31bd980b1a306Daniel Dunbar if (Arg *OutputOpt = Args.getLastArg(options::OPT_o)) { 1372a3ec60e0cf2a1916f479288998d31bd980b1a306Daniel Dunbar CmdArgs.push_back("-MQ"); 1373a3ec60e0cf2a1916f479288998d31bd980b1a306Daniel Dunbar CmdArgs.push_back(OutputOpt->getValue(Args)); 1374a3ec60e0cf2a1916f479288998d31bd980b1a306Daniel Dunbar } 1375a3ec60e0cf2a1916f479288998d31bd980b1a306Daniel Dunbar } 1376a3ec60e0cf2a1916f479288998d31bd980b1a306Daniel Dunbar 1377a3ec60e0cf2a1916f479288998d31bd980b1a306Daniel Dunbar Args.AddLastArg(CmdArgs, options::OPT_remap); 1378a3ec60e0cf2a1916f479288998d31bd980b1a306Daniel Dunbar if (Args.hasArg(options::OPT_g3)) 1379a3ec60e0cf2a1916f479288998d31bd980b1a306Daniel Dunbar CmdArgs.push_back("-dD"); 1380a3ec60e0cf2a1916f479288998d31bd980b1a306Daniel Dunbar Args.AddLastArg(CmdArgs, options::OPT_H); 1381a3ec60e0cf2a1916f479288998d31bd980b1a306Daniel Dunbar 1382a3ec60e0cf2a1916f479288998d31bd980b1a306Daniel Dunbar AddCPPArgs(Args, CmdArgs); 1383a3ec60e0cf2a1916f479288998d31bd980b1a306Daniel Dunbar 1384a3ec60e0cf2a1916f479288998d31bd980b1a306Daniel Dunbar Args.AddAllArgs(CmdArgs, options::OPT_D, options::OPT_U, options::OPT_A); 1385a3ec60e0cf2a1916f479288998d31bd980b1a306Daniel Dunbar Args.AddAllArgs(CmdArgs, options::OPT_i_Group); 1386a3ec60e0cf2a1916f479288998d31bd980b1a306Daniel Dunbar 1387a3ec60e0cf2a1916f479288998d31bd980b1a306Daniel Dunbar for (InputInfoList::const_iterator 1388a3ec60e0cf2a1916f479288998d31bd980b1a306Daniel Dunbar it = Inputs.begin(), ie = Inputs.end(); it != ie; ++it) { 1389a3ec60e0cf2a1916f479288998d31bd980b1a306Daniel Dunbar const InputInfo &II = *it; 1390c21c485b4fb58ef5d55cf3e523263dd824a2ace4Daniel Dunbar 1391a3ec60e0cf2a1916f479288998d31bd980b1a306Daniel Dunbar if (II.isPipe()) 1392a3ec60e0cf2a1916f479288998d31bd980b1a306Daniel Dunbar CmdArgs.push_back("-"); 1393a3ec60e0cf2a1916f479288998d31bd980b1a306Daniel Dunbar else 1394a3ec60e0cf2a1916f479288998d31bd980b1a306Daniel Dunbar CmdArgs.push_back(II.getFilename()); 1395a3ec60e0cf2a1916f479288998d31bd980b1a306Daniel Dunbar } 1396a3ec60e0cf2a1916f479288998d31bd980b1a306Daniel Dunbar 1397a3ec60e0cf2a1916f479288998d31bd980b1a306Daniel Dunbar Args.AddAllArgValues(CmdArgs, options::OPT_Wp_COMMA, 1398a3ec60e0cf2a1916f479288998d31bd980b1a306Daniel Dunbar options::OPT_Xpreprocessor); 1399a3ec60e0cf2a1916f479288998d31bd980b1a306Daniel Dunbar 1400a3ec60e0cf2a1916f479288998d31bd980b1a306Daniel Dunbar if (Args.hasArg(options::OPT_fmudflap)) { 1401a3ec60e0cf2a1916f479288998d31bd980b1a306Daniel Dunbar CmdArgs.push_back("-D_MUDFLAP"); 1402a3ec60e0cf2a1916f479288998d31bd980b1a306Daniel Dunbar CmdArgs.push_back("-include"); 1403a3ec60e0cf2a1916f479288998d31bd980b1a306Daniel Dunbar CmdArgs.push_back("mf-runtime.h"); 1404a3ec60e0cf2a1916f479288998d31bd980b1a306Daniel Dunbar } 1405a3ec60e0cf2a1916f479288998d31bd980b1a306Daniel Dunbar 1406a3ec60e0cf2a1916f479288998d31bd980b1a306Daniel Dunbar if (Args.hasArg(options::OPT_fmudflapth)) { 1407a3ec60e0cf2a1916f479288998d31bd980b1a306Daniel Dunbar CmdArgs.push_back("-D_MUDFLAP"); 1408a3ec60e0cf2a1916f479288998d31bd980b1a306Daniel Dunbar CmdArgs.push_back("-D_MUDFLAPTH"); 1409a3ec60e0cf2a1916f479288998d31bd980b1a306Daniel Dunbar CmdArgs.push_back("-include"); 1410a3ec60e0cf2a1916f479288998d31bd980b1a306Daniel Dunbar CmdArgs.push_back("mf-runtime.h"); 1411a3ec60e0cf2a1916f479288998d31bd980b1a306Daniel Dunbar } 1412a3ec60e0cf2a1916f479288998d31bd980b1a306Daniel Dunbar} 1413a3ec60e0cf2a1916f479288998d31bd980b1a306Daniel Dunbar 1414c21c485b4fb58ef5d55cf3e523263dd824a2ace4Daniel Dunbarvoid darwin::CC1::AddCPPArgs(const ArgList &Args, 1415a3ec60e0cf2a1916f479288998d31bd980b1a306Daniel Dunbar ArgStringList &CmdArgs) const { 1416a3ec60e0cf2a1916f479288998d31bd980b1a306Daniel Dunbar // Derived from cpp spec. 1417a3ec60e0cf2a1916f479288998d31bd980b1a306Daniel Dunbar 1418a3ec60e0cf2a1916f479288998d31bd980b1a306Daniel Dunbar if (Args.hasArg(options::OPT_static)) { 1419a3ec60e0cf2a1916f479288998d31bd980b1a306Daniel Dunbar // The gcc spec is broken here, it refers to dynamic but 1420a3ec60e0cf2a1916f479288998d31bd980b1a306Daniel Dunbar // that has been translated. Start by being bug compatible. 1421c21c485b4fb58ef5d55cf3e523263dd824a2ace4Daniel Dunbar 1422a3ec60e0cf2a1916f479288998d31bd980b1a306Daniel Dunbar // if (!Args.hasArg(arglist.parser.dynamicOption)) 1423a3ec60e0cf2a1916f479288998d31bd980b1a306Daniel Dunbar CmdArgs.push_back("-D__STATIC__"); 1424a3ec60e0cf2a1916f479288998d31bd980b1a306Daniel Dunbar } else 1425a3ec60e0cf2a1916f479288998d31bd980b1a306Daniel Dunbar CmdArgs.push_back("-D__DYNAMIC__"); 1426a3ec60e0cf2a1916f479288998d31bd980b1a306Daniel Dunbar 1427a3ec60e0cf2a1916f479288998d31bd980b1a306Daniel Dunbar if (Args.hasArg(options::OPT_pthread)) 1428a3ec60e0cf2a1916f479288998d31bd980b1a306Daniel Dunbar CmdArgs.push_back("-D_REENTRANT"); 1429a3ec60e0cf2a1916f479288998d31bd980b1a306Daniel Dunbar} 1430a3ec60e0cf2a1916f479288998d31bd980b1a306Daniel Dunbar 143140f1265ebd42ece3e7f7917319b56012e8e2bce2Daniel Dunbarvoid darwin::Preprocess::ConstructJob(Compilation &C, const JobAction &JA, 1432c21c485b4fb58ef5d55cf3e523263dd824a2ace4Daniel Dunbar Job &Dest, const InputInfo &Output, 1433c21c485b4fb58ef5d55cf3e523263dd824a2ace4Daniel Dunbar const InputInfoList &Inputs, 1434c21c485b4fb58ef5d55cf3e523263dd824a2ace4Daniel Dunbar const ArgList &Args, 143540f1265ebd42ece3e7f7917319b56012e8e2bce2Daniel Dunbar const char *LinkingOutput) const { 143640f1265ebd42ece3e7f7917319b56012e8e2bce2Daniel Dunbar ArgStringList CmdArgs; 143740f1265ebd42ece3e7f7917319b56012e8e2bce2Daniel Dunbar 143840f1265ebd42ece3e7f7917319b56012e8e2bce2Daniel Dunbar assert(Inputs.size() == 1 && "Unexpected number of inputs!"); 143940f1265ebd42ece3e7f7917319b56012e8e2bce2Daniel Dunbar 144040f1265ebd42ece3e7f7917319b56012e8e2bce2Daniel Dunbar CmdArgs.push_back("-E"); 144140f1265ebd42ece3e7f7917319b56012e8e2bce2Daniel Dunbar 144240f1265ebd42ece3e7f7917319b56012e8e2bce2Daniel Dunbar if (Args.hasArg(options::OPT_traditional) || 144340f1265ebd42ece3e7f7917319b56012e8e2bce2Daniel Dunbar Args.hasArg(options::OPT_traditional_cpp)) 144440f1265ebd42ece3e7f7917319b56012e8e2bce2Daniel Dunbar CmdArgs.push_back("-traditional-cpp"); 1445c21c485b4fb58ef5d55cf3e523263dd824a2ace4Daniel Dunbar 144640f1265ebd42ece3e7f7917319b56012e8e2bce2Daniel Dunbar ArgStringList OutputArgs; 144740f1265ebd42ece3e7f7917319b56012e8e2bce2Daniel Dunbar if (Output.isFilename()) { 144840f1265ebd42ece3e7f7917319b56012e8e2bce2Daniel Dunbar OutputArgs.push_back("-o"); 144940f1265ebd42ece3e7f7917319b56012e8e2bce2Daniel Dunbar OutputArgs.push_back(Output.getFilename()); 145040f1265ebd42ece3e7f7917319b56012e8e2bce2Daniel Dunbar } else { 145140f1265ebd42ece3e7f7917319b56012e8e2bce2Daniel Dunbar assert(Output.isPipe() && "Unexpected CC1 output."); 145240f1265ebd42ece3e7f7917319b56012e8e2bce2Daniel Dunbar } 145340f1265ebd42ece3e7f7917319b56012e8e2bce2Daniel Dunbar 14549120f179fd2e354f067e4ef2c76dcf3fc4db8a16Daniel Dunbar if (Args.hasArg(options::OPT_E)) { 14559120f179fd2e354f067e4ef2c76dcf3fc4db8a16Daniel Dunbar AddCPPOptionsArgs(Args, CmdArgs, Inputs, OutputArgs); 14569120f179fd2e354f067e4ef2c76dcf3fc4db8a16Daniel Dunbar } else { 14579120f179fd2e354f067e4ef2c76dcf3fc4db8a16Daniel Dunbar AddCPPOptionsArgs(Args, CmdArgs, Inputs, ArgStringList()); 14589120f179fd2e354f067e4ef2c76dcf3fc4db8a16Daniel Dunbar CmdArgs.append(OutputArgs.begin(), OutputArgs.end()); 14599120f179fd2e354f067e4ef2c76dcf3fc4db8a16Daniel Dunbar } 1460c21c485b4fb58ef5d55cf3e523263dd824a2ace4Daniel Dunbar 14618a2073a85670a13b0bcc1726bc7f80d458f8245bDaniel Dunbar Args.AddAllArgs(CmdArgs, options::OPT_d_Group); 14628a2073a85670a13b0bcc1726bc7f80d458f8245bDaniel Dunbar 146340f1265ebd42ece3e7f7917319b56012e8e2bce2Daniel Dunbar const char *CC1Name = getCC1Name(Inputs[0].getType()); 1464c21c485b4fb58ef5d55cf3e523263dd824a2ace4Daniel Dunbar const char *Exec = 14655ed34f4c58b6ad4e21038d713c1fae31a6146ff5Daniel Dunbar Args.MakeArgString(getToolChain().GetProgramPath(C, CC1Name)); 1466cae087e164e94e4286c11bf694dd0ff88f295302Daniel Dunbar Dest.addCommand(new Command(JA, Exec, CmdArgs)); 146740f1265ebd42ece3e7f7917319b56012e8e2bce2Daniel Dunbar} 146840f1265ebd42ece3e7f7917319b56012e8e2bce2Daniel Dunbar 146940f1265ebd42ece3e7f7917319b56012e8e2bce2Daniel Dunbarvoid darwin::Compile::ConstructJob(Compilation &C, const JobAction &JA, 1470c21c485b4fb58ef5d55cf3e523263dd824a2ace4Daniel Dunbar Job &Dest, const InputInfo &Output, 1471c21c485b4fb58ef5d55cf3e523263dd824a2ace4Daniel Dunbar const InputInfoList &Inputs, 1472c21c485b4fb58ef5d55cf3e523263dd824a2ace4Daniel Dunbar const ArgList &Args, 147340f1265ebd42ece3e7f7917319b56012e8e2bce2Daniel Dunbar const char *LinkingOutput) const { 147440f1265ebd42ece3e7f7917319b56012e8e2bce2Daniel Dunbar const Driver &D = getToolChain().getHost().getDriver(); 147540f1265ebd42ece3e7f7917319b56012e8e2bce2Daniel Dunbar ArgStringList CmdArgs; 147640f1265ebd42ece3e7f7917319b56012e8e2bce2Daniel Dunbar 147740f1265ebd42ece3e7f7917319b56012e8e2bce2Daniel Dunbar assert(Inputs.size() == 1 && "Unexpected number of inputs!"); 147840f1265ebd42ece3e7f7917319b56012e8e2bce2Daniel Dunbar 147940f1265ebd42ece3e7f7917319b56012e8e2bce2Daniel Dunbar types::ID InputType = Inputs[0].getType(); 148040f1265ebd42ece3e7f7917319b56012e8e2bce2Daniel Dunbar const Arg *A; 1481ceb5c5b7f67a30fae305d1d19b478b623e4fbcedEli Friedman if ((A = Args.getLastArg(options::OPT_traditional))) 148240f1265ebd42ece3e7f7917319b56012e8e2bce2Daniel Dunbar D.Diag(clang::diag::err_drv_argument_only_allowed_with) 148340f1265ebd42ece3e7f7917319b56012e8e2bce2Daniel Dunbar << A->getAsString(Args) << "-E"; 148440f1265ebd42ece3e7f7917319b56012e8e2bce2Daniel Dunbar 148540f1265ebd42ece3e7f7917319b56012e8e2bce2Daniel Dunbar if (Output.getType() == types::TY_LLVMAsm) 148640f1265ebd42ece3e7f7917319b56012e8e2bce2Daniel Dunbar CmdArgs.push_back("-emit-llvm"); 148740f1265ebd42ece3e7f7917319b56012e8e2bce2Daniel Dunbar else if (Output.getType() == types::TY_LLVMBC) 148840f1265ebd42ece3e7f7917319b56012e8e2bce2Daniel Dunbar CmdArgs.push_back("-emit-llvm-bc"); 14895915fbf310e171c4cd3c2af05e9de360c0fa988aDaniel Dunbar else if (Output.getType() == types::TY_AST) 14905915fbf310e171c4cd3c2af05e9de360c0fa988aDaniel Dunbar D.Diag(clang::diag::err_drv_no_ast_support) 1491881376467c46c5c6cc16fa6790271c2c22e1d4f1Daniel Dunbar << getToolChain().getTripleString(); 149240f1265ebd42ece3e7f7917319b56012e8e2bce2Daniel Dunbar 149340f1265ebd42ece3e7f7917319b56012e8e2bce2Daniel Dunbar ArgStringList OutputArgs; 149440f1265ebd42ece3e7f7917319b56012e8e2bce2Daniel Dunbar if (Output.getType() != types::TY_PCH) { 149540f1265ebd42ece3e7f7917319b56012e8e2bce2Daniel Dunbar OutputArgs.push_back("-o"); 149640f1265ebd42ece3e7f7917319b56012e8e2bce2Daniel Dunbar if (Output.isPipe()) 149740f1265ebd42ece3e7f7917319b56012e8e2bce2Daniel Dunbar OutputArgs.push_back("-"); 149840f1265ebd42ece3e7f7917319b56012e8e2bce2Daniel Dunbar else if (Output.isNothing()) 149940f1265ebd42ece3e7f7917319b56012e8e2bce2Daniel Dunbar OutputArgs.push_back("/dev/null"); 150040f1265ebd42ece3e7f7917319b56012e8e2bce2Daniel Dunbar else 150140f1265ebd42ece3e7f7917319b56012e8e2bce2Daniel Dunbar OutputArgs.push_back(Output.getFilename()); 150240f1265ebd42ece3e7f7917319b56012e8e2bce2Daniel Dunbar } 150340f1265ebd42ece3e7f7917319b56012e8e2bce2Daniel Dunbar 150440f1265ebd42ece3e7f7917319b56012e8e2bce2Daniel Dunbar // There is no need for this level of compatibility, but it makes 150540f1265ebd42ece3e7f7917319b56012e8e2bce2Daniel Dunbar // diffing easier. 150640f1265ebd42ece3e7f7917319b56012e8e2bce2Daniel Dunbar bool OutputArgsEarly = (Args.hasArg(options::OPT_fsyntax_only) || 150740f1265ebd42ece3e7f7917319b56012e8e2bce2Daniel Dunbar Args.hasArg(options::OPT_S)); 150840f1265ebd42ece3e7f7917319b56012e8e2bce2Daniel Dunbar 150940f1265ebd42ece3e7f7917319b56012e8e2bce2Daniel Dunbar if (types::getPreprocessedType(InputType) != types::TY_INVALID) { 1510a3ec60e0cf2a1916f479288998d31bd980b1a306Daniel Dunbar AddCPPUniqueOptionsArgs(Args, CmdArgs, Inputs); 151140f1265ebd42ece3e7f7917319b56012e8e2bce2Daniel Dunbar if (OutputArgsEarly) { 151240f1265ebd42ece3e7f7917319b56012e8e2bce2Daniel Dunbar AddCC1OptionsArgs(Args, CmdArgs, Inputs, OutputArgs); 151340f1265ebd42ece3e7f7917319b56012e8e2bce2Daniel Dunbar } else { 151440f1265ebd42ece3e7f7917319b56012e8e2bce2Daniel Dunbar AddCC1OptionsArgs(Args, CmdArgs, Inputs, ArgStringList()); 151540f1265ebd42ece3e7f7917319b56012e8e2bce2Daniel Dunbar CmdArgs.append(OutputArgs.begin(), OutputArgs.end()); 151640f1265ebd42ece3e7f7917319b56012e8e2bce2Daniel Dunbar } 151740f1265ebd42ece3e7f7917319b56012e8e2bce2Daniel Dunbar } else { 151840f1265ebd42ece3e7f7917319b56012e8e2bce2Daniel Dunbar CmdArgs.push_back("-fpreprocessed"); 1519c21c485b4fb58ef5d55cf3e523263dd824a2ace4Daniel Dunbar 152040f1265ebd42ece3e7f7917319b56012e8e2bce2Daniel Dunbar for (InputInfoList::const_iterator 152140f1265ebd42ece3e7f7917319b56012e8e2bce2Daniel Dunbar it = Inputs.begin(), ie = Inputs.end(); it != ie; ++it) { 152240f1265ebd42ece3e7f7917319b56012e8e2bce2Daniel Dunbar const InputInfo &II = *it; 152340f1265ebd42ece3e7f7917319b56012e8e2bce2Daniel Dunbar 15245915fbf310e171c4cd3c2af05e9de360c0fa988aDaniel Dunbar // Reject AST inputs. 15255915fbf310e171c4cd3c2af05e9de360c0fa988aDaniel Dunbar if (II.getType() == types::TY_AST) { 15265915fbf310e171c4cd3c2af05e9de360c0fa988aDaniel Dunbar D.Diag(clang::diag::err_drv_no_ast_support) 1527881376467c46c5c6cc16fa6790271c2c22e1d4f1Daniel Dunbar << getToolChain().getTripleString(); 15285915fbf310e171c4cd3c2af05e9de360c0fa988aDaniel Dunbar return; 15295915fbf310e171c4cd3c2af05e9de360c0fa988aDaniel Dunbar } 15305915fbf310e171c4cd3c2af05e9de360c0fa988aDaniel Dunbar 153140f1265ebd42ece3e7f7917319b56012e8e2bce2Daniel Dunbar if (II.isPipe()) 153240f1265ebd42ece3e7f7917319b56012e8e2bce2Daniel Dunbar CmdArgs.push_back("-"); 153340f1265ebd42ece3e7f7917319b56012e8e2bce2Daniel Dunbar else 153440f1265ebd42ece3e7f7917319b56012e8e2bce2Daniel Dunbar CmdArgs.push_back(II.getFilename()); 153540f1265ebd42ece3e7f7917319b56012e8e2bce2Daniel Dunbar } 153640f1265ebd42ece3e7f7917319b56012e8e2bce2Daniel Dunbar 153740f1265ebd42ece3e7f7917319b56012e8e2bce2Daniel Dunbar if (OutputArgsEarly) { 153840f1265ebd42ece3e7f7917319b56012e8e2bce2Daniel Dunbar AddCC1OptionsArgs(Args, CmdArgs, Inputs, OutputArgs); 153940f1265ebd42ece3e7f7917319b56012e8e2bce2Daniel Dunbar } else { 154040f1265ebd42ece3e7f7917319b56012e8e2bce2Daniel Dunbar AddCC1OptionsArgs(Args, CmdArgs, Inputs, ArgStringList()); 154140f1265ebd42ece3e7f7917319b56012e8e2bce2Daniel Dunbar CmdArgs.append(OutputArgs.begin(), OutputArgs.end()); 154240f1265ebd42ece3e7f7917319b56012e8e2bce2Daniel Dunbar } 154340f1265ebd42ece3e7f7917319b56012e8e2bce2Daniel Dunbar } 1544c21c485b4fb58ef5d55cf3e523263dd824a2ace4Daniel Dunbar 154540f1265ebd42ece3e7f7917319b56012e8e2bce2Daniel Dunbar if (Output.getType() == types::TY_PCH) { 154640f1265ebd42ece3e7f7917319b56012e8e2bce2Daniel Dunbar assert(Output.isFilename() && "Invalid PCH output."); 154740f1265ebd42ece3e7f7917319b56012e8e2bce2Daniel Dunbar 154840f1265ebd42ece3e7f7917319b56012e8e2bce2Daniel Dunbar CmdArgs.push_back("-o"); 154940f1265ebd42ece3e7f7917319b56012e8e2bce2Daniel Dunbar // NOTE: gcc uses a temp .s file for this, but there doesn't seem 155040f1265ebd42ece3e7f7917319b56012e8e2bce2Daniel Dunbar // to be a good reason. 155140f1265ebd42ece3e7f7917319b56012e8e2bce2Daniel Dunbar CmdArgs.push_back("/dev/null"); 1552c21c485b4fb58ef5d55cf3e523263dd824a2ace4Daniel Dunbar 155340f1265ebd42ece3e7f7917319b56012e8e2bce2Daniel Dunbar CmdArgs.push_back("--output-pch="); 155440f1265ebd42ece3e7f7917319b56012e8e2bce2Daniel Dunbar CmdArgs.push_back(Output.getFilename()); 1555c21c485b4fb58ef5d55cf3e523263dd824a2ace4Daniel Dunbar } 155640f1265ebd42ece3e7f7917319b56012e8e2bce2Daniel Dunbar 155740f1265ebd42ece3e7f7917319b56012e8e2bce2Daniel Dunbar const char *CC1Name = getCC1Name(Inputs[0].getType()); 1558c21c485b4fb58ef5d55cf3e523263dd824a2ace4Daniel Dunbar const char *Exec = 15595ed34f4c58b6ad4e21038d713c1fae31a6146ff5Daniel Dunbar Args.MakeArgString(getToolChain().GetProgramPath(C, CC1Name)); 1560cae087e164e94e4286c11bf694dd0ff88f295302Daniel Dunbar Dest.addCommand(new Command(JA, Exec, CmdArgs)); 156140f1265ebd42ece3e7f7917319b56012e8e2bce2Daniel Dunbar} 156240f1265ebd42ece3e7f7917319b56012e8e2bce2Daniel Dunbar 15638cac5f7e1ce63dd77ee0fb4ef68f9fa804f41ea6Daniel Dunbarvoid darwin::Assemble::ConstructJob(Compilation &C, const JobAction &JA, 1564c21c485b4fb58ef5d55cf3e523263dd824a2ace4Daniel Dunbar Job &Dest, const InputInfo &Output, 1565c21c485b4fb58ef5d55cf3e523263dd824a2ace4Daniel Dunbar const InputInfoList &Inputs, 1566c21c485b4fb58ef5d55cf3e523263dd824a2ace4Daniel Dunbar const ArgList &Args, 15678cac5f7e1ce63dd77ee0fb4ef68f9fa804f41ea6Daniel Dunbar const char *LinkingOutput) const { 15688cac5f7e1ce63dd77ee0fb4ef68f9fa804f41ea6Daniel Dunbar ArgStringList CmdArgs; 15698cac5f7e1ce63dd77ee0fb4ef68f9fa804f41ea6Daniel Dunbar 15708cac5f7e1ce63dd77ee0fb4ef68f9fa804f41ea6Daniel Dunbar assert(Inputs.size() == 1 && "Unexpected number of inputs."); 15718cac5f7e1ce63dd77ee0fb4ef68f9fa804f41ea6Daniel Dunbar const InputInfo &Input = Inputs[0]; 15728cac5f7e1ce63dd77ee0fb4ef68f9fa804f41ea6Daniel Dunbar 15738cac5f7e1ce63dd77ee0fb4ef68f9fa804f41ea6Daniel Dunbar // Bit of a hack, this is only used for original inputs. 1574c21c485b4fb58ef5d55cf3e523263dd824a2ace4Daniel Dunbar // 15758e4fea6750dbac032c172f3279c63b7815b7423eDaniel Dunbar // FIXME: This is broken for preprocessed .s inputs. 15768cac5f7e1ce63dd77ee0fb4ef68f9fa804f41ea6Daniel Dunbar if (Input.isFilename() && 15778e4fea6750dbac032c172f3279c63b7815b7423eDaniel Dunbar strcmp(Input.getFilename(), Input.getBaseInput()) == 0) { 15788e4fea6750dbac032c172f3279c63b7815b7423eDaniel Dunbar if (Args.hasArg(options::OPT_gstabs)) 15798e4fea6750dbac032c172f3279c63b7815b7423eDaniel Dunbar CmdArgs.push_back("--gstabs"); 15808e4fea6750dbac032c172f3279c63b7815b7423eDaniel Dunbar else if (Args.hasArg(options::OPT_g_Group)) 15818e4fea6750dbac032c172f3279c63b7815b7423eDaniel Dunbar CmdArgs.push_back("--gdwarf2"); 15828e4fea6750dbac032c172f3279c63b7815b7423eDaniel Dunbar } 1583c21c485b4fb58ef5d55cf3e523263dd824a2ace4Daniel Dunbar 15848cac5f7e1ce63dd77ee0fb4ef68f9fa804f41ea6Daniel Dunbar // Derived from asm spec. 1585cc6f803f98fa6ba9a9c366400210448516d01b3cDaniel Dunbar AddDarwinArch(Args, CmdArgs); 1586cc6f803f98fa6ba9a9c366400210448516d01b3cDaniel Dunbar 1587cc6f803f98fa6ba9a9c366400210448516d01b3cDaniel Dunbar if (!getDarwinToolChain().isIPhone() || 1588cc6f803f98fa6ba9a9c366400210448516d01b3cDaniel Dunbar Args.hasArg(options::OPT_force__cpusubtype__ALL)) 1589cc6f803f98fa6ba9a9c366400210448516d01b3cDaniel Dunbar CmdArgs.push_back("-force_cpusubtype_ALL"); 15908cac5f7e1ce63dd77ee0fb4ef68f9fa804f41ea6Daniel Dunbar 15910e2679d29be70186fc1197a1484948ed239922baDaniel Dunbar if (getToolChain().getTriple().getArch() != llvm::Triple::x86_64 && 15920e2679d29be70186fc1197a1484948ed239922baDaniel Dunbar (Args.hasArg(options::OPT_mkernel) || 15938cac5f7e1ce63dd77ee0fb4ef68f9fa804f41ea6Daniel Dunbar Args.hasArg(options::OPT_static) || 15940e2679d29be70186fc1197a1484948ed239922baDaniel Dunbar Args.hasArg(options::OPT_fapple_kext))) 1595c21c485b4fb58ef5d55cf3e523263dd824a2ace4Daniel Dunbar CmdArgs.push_back("-static"); 1596c21c485b4fb58ef5d55cf3e523263dd824a2ace4Daniel Dunbar 15978cac5f7e1ce63dd77ee0fb4ef68f9fa804f41ea6Daniel Dunbar Args.AddAllArgValues(CmdArgs, options::OPT_Wa_COMMA, 15988cac5f7e1ce63dd77ee0fb4ef68f9fa804f41ea6Daniel Dunbar options::OPT_Xassembler); 15998cac5f7e1ce63dd77ee0fb4ef68f9fa804f41ea6Daniel Dunbar 16008cac5f7e1ce63dd77ee0fb4ef68f9fa804f41ea6Daniel Dunbar assert(Output.isFilename() && "Unexpected lipo output."); 16018cac5f7e1ce63dd77ee0fb4ef68f9fa804f41ea6Daniel Dunbar CmdArgs.push_back("-o"); 16028cac5f7e1ce63dd77ee0fb4ef68f9fa804f41ea6Daniel Dunbar CmdArgs.push_back(Output.getFilename()); 16038cac5f7e1ce63dd77ee0fb4ef68f9fa804f41ea6Daniel Dunbar 16048cac5f7e1ce63dd77ee0fb4ef68f9fa804f41ea6Daniel Dunbar if (Input.isPipe()) { 16058cac5f7e1ce63dd77ee0fb4ef68f9fa804f41ea6Daniel Dunbar CmdArgs.push_back("-"); 16068cac5f7e1ce63dd77ee0fb4ef68f9fa804f41ea6Daniel Dunbar } else { 16078cac5f7e1ce63dd77ee0fb4ef68f9fa804f41ea6Daniel Dunbar assert(Input.isFilename() && "Invalid input."); 16088cac5f7e1ce63dd77ee0fb4ef68f9fa804f41ea6Daniel Dunbar CmdArgs.push_back(Input.getFilename()); 16098cac5f7e1ce63dd77ee0fb4ef68f9fa804f41ea6Daniel Dunbar } 16108cac5f7e1ce63dd77ee0fb4ef68f9fa804f41ea6Daniel Dunbar 16118cac5f7e1ce63dd77ee0fb4ef68f9fa804f41ea6Daniel Dunbar // asm_final spec is empty. 16128cac5f7e1ce63dd77ee0fb4ef68f9fa804f41ea6Daniel Dunbar 1613c21c485b4fb58ef5d55cf3e523263dd824a2ace4Daniel Dunbar const char *Exec = 16145ed34f4c58b6ad4e21038d713c1fae31a6146ff5Daniel Dunbar Args.MakeArgString(getToolChain().GetProgramPath(C, "as")); 1615cae087e164e94e4286c11bf694dd0ff88f295302Daniel Dunbar Dest.addCommand(new Command(JA, Exec, CmdArgs)); 16168cac5f7e1ce63dd77ee0fb4ef68f9fa804f41ea6Daniel Dunbar} 1617ff7488dc9a766f94daf54d81b03ab9160d0bfd88Daniel Dunbar 161802633b541b04ad5ffc1c70f4c2feeeb13e607057Daniel Dunbar/// Helper routine for seeing if we should use dsymutil; this is a 161902633b541b04ad5ffc1c70f4c2feeeb13e607057Daniel Dunbar/// gcc compatible hack, we should remove it and use the input 162002633b541b04ad5ffc1c70f4c2feeeb13e607057Daniel Dunbar/// type information. 162102633b541b04ad5ffc1c70f4c2feeeb13e607057Daniel Dunbarstatic bool isSourceSuffix(const char *Str) { 162202633b541b04ad5ffc1c70f4c2feeeb13e607057Daniel Dunbar // match: 'C', 'CPP', 'c', 'cc', 'cp', 'c++', 'cpp', 'cxx', 'm', 162302633b541b04ad5ffc1c70f4c2feeeb13e607057Daniel Dunbar // 'mm'. 162402633b541b04ad5ffc1c70f4c2feeeb13e607057Daniel Dunbar switch (strlen(Str)) { 162502633b541b04ad5ffc1c70f4c2feeeb13e607057Daniel Dunbar default: 162602633b541b04ad5ffc1c70f4c2feeeb13e607057Daniel Dunbar return false; 162702633b541b04ad5ffc1c70f4c2feeeb13e607057Daniel Dunbar case 1: 162802633b541b04ad5ffc1c70f4c2feeeb13e607057Daniel Dunbar return (memcmp(Str, "C", 1) == 0 || 162902633b541b04ad5ffc1c70f4c2feeeb13e607057Daniel Dunbar memcmp(Str, "c", 1) == 0 || 163002633b541b04ad5ffc1c70f4c2feeeb13e607057Daniel Dunbar memcmp(Str, "m", 1) == 0); 163102633b541b04ad5ffc1c70f4c2feeeb13e607057Daniel Dunbar case 2: 163202633b541b04ad5ffc1c70f4c2feeeb13e607057Daniel Dunbar return (memcmp(Str, "cc", 2) == 0 || 163302633b541b04ad5ffc1c70f4c2feeeb13e607057Daniel Dunbar memcmp(Str, "cp", 2) == 0 || 163402633b541b04ad5ffc1c70f4c2feeeb13e607057Daniel Dunbar memcmp(Str, "mm", 2) == 0); 163502633b541b04ad5ffc1c70f4c2feeeb13e607057Daniel Dunbar case 3: 163602633b541b04ad5ffc1c70f4c2feeeb13e607057Daniel Dunbar return (memcmp(Str, "CPP", 3) == 0 || 163702633b541b04ad5ffc1c70f4c2feeeb13e607057Daniel Dunbar memcmp(Str, "c++", 3) == 0 || 163802633b541b04ad5ffc1c70f4c2feeeb13e607057Daniel Dunbar memcmp(Str, "cpp", 3) == 0 || 163902633b541b04ad5ffc1c70f4c2feeeb13e607057Daniel Dunbar memcmp(Str, "cxx", 3) == 0); 164002633b541b04ad5ffc1c70f4c2feeeb13e607057Daniel Dunbar } 164102633b541b04ad5ffc1c70f4c2feeeb13e607057Daniel Dunbar} 164202633b541b04ad5ffc1c70f4c2feeeb13e607057Daniel Dunbar 164302633b541b04ad5ffc1c70f4c2feeeb13e607057Daniel Dunbarstatic bool isMacosxVersionLT(unsigned (&A)[3], unsigned (&B)[3]) { 164402633b541b04ad5ffc1c70f4c2feeeb13e607057Daniel Dunbar for (unsigned i=0; i < 3; ++i) { 164502633b541b04ad5ffc1c70f4c2feeeb13e607057Daniel Dunbar if (A[i] > B[i]) return false; 164602633b541b04ad5ffc1c70f4c2feeeb13e607057Daniel Dunbar if (A[i] < B[i]) return true; 164702633b541b04ad5ffc1c70f4c2feeeb13e607057Daniel Dunbar } 164802633b541b04ad5ffc1c70f4c2feeeb13e607057Daniel Dunbar return false; 164902633b541b04ad5ffc1c70f4c2feeeb13e607057Daniel Dunbar} 165002633b541b04ad5ffc1c70f4c2feeeb13e607057Daniel Dunbar 1651c21c485b4fb58ef5d55cf3e523263dd824a2ace4Daniel Dunbarstatic bool isMacosxVersionLT(unsigned (&A)[3], 165202633b541b04ad5ffc1c70f4c2feeeb13e607057Daniel Dunbar unsigned V0, unsigned V1=0, unsigned V2=0) { 165302633b541b04ad5ffc1c70f4c2feeeb13e607057Daniel Dunbar unsigned B[3] = { V0, V1, V2 }; 165402633b541b04ad5ffc1c70f4c2feeeb13e607057Daniel Dunbar return isMacosxVersionLT(A, B); 165502633b541b04ad5ffc1c70f4c2feeeb13e607057Daniel Dunbar} 165602633b541b04ad5ffc1c70f4c2feeeb13e607057Daniel Dunbar 165778dbd580a02759bbc408dbefb6754afa71b2c24cDaniel Dunbar// FIXME: Can we tablegen this? 165878dbd580a02759bbc408dbefb6754afa71b2c24cDaniel Dunbarstatic const char *GetArmArchForMArch(llvm::StringRef Value) { 165978dbd580a02759bbc408dbefb6754afa71b2c24cDaniel Dunbar if (Value == "armv6k") 166078dbd580a02759bbc408dbefb6754afa71b2c24cDaniel Dunbar return "armv6"; 166178dbd580a02759bbc408dbefb6754afa71b2c24cDaniel Dunbar 166278dbd580a02759bbc408dbefb6754afa71b2c24cDaniel Dunbar if (Value == "armv5tej") 166378dbd580a02759bbc408dbefb6754afa71b2c24cDaniel Dunbar return "armv5"; 166478dbd580a02759bbc408dbefb6754afa71b2c24cDaniel Dunbar 166578dbd580a02759bbc408dbefb6754afa71b2c24cDaniel Dunbar if (Value == "xscale") 166678dbd580a02759bbc408dbefb6754afa71b2c24cDaniel Dunbar return "xscale"; 166778dbd580a02759bbc408dbefb6754afa71b2c24cDaniel Dunbar 166878dbd580a02759bbc408dbefb6754afa71b2c24cDaniel Dunbar if (Value == "armv4t") 166978dbd580a02759bbc408dbefb6754afa71b2c24cDaniel Dunbar return "armv4t"; 167078dbd580a02759bbc408dbefb6754afa71b2c24cDaniel Dunbar 167178dbd580a02759bbc408dbefb6754afa71b2c24cDaniel Dunbar if (Value == "armv7" || Value == "armv7-a" || Value == "armv7-r" || 167278dbd580a02759bbc408dbefb6754afa71b2c24cDaniel Dunbar Value == "armv7-m" || Value == "armv7a" || Value == "armv7r" || 167378dbd580a02759bbc408dbefb6754afa71b2c24cDaniel Dunbar Value == "armv7m") 167478dbd580a02759bbc408dbefb6754afa71b2c24cDaniel Dunbar return "armv7"; 167578dbd580a02759bbc408dbefb6754afa71b2c24cDaniel Dunbar 167678dbd580a02759bbc408dbefb6754afa71b2c24cDaniel Dunbar return 0; 167778dbd580a02759bbc408dbefb6754afa71b2c24cDaniel Dunbar} 167878dbd580a02759bbc408dbefb6754afa71b2c24cDaniel Dunbar 167978dbd580a02759bbc408dbefb6754afa71b2c24cDaniel Dunbar// FIXME: Can we tablegen this? 168078dbd580a02759bbc408dbefb6754afa71b2c24cDaniel Dunbarstatic const char *GetArmArchForMCpu(llvm::StringRef Value) { 168178dbd580a02759bbc408dbefb6754afa71b2c24cDaniel Dunbar if (Value == "arm10tdmi" || Value == "arm1020t" || Value == "arm9e" || 168278dbd580a02759bbc408dbefb6754afa71b2c24cDaniel Dunbar Value == "arm946e-s" || Value == "arm966e-s" || 168378dbd580a02759bbc408dbefb6754afa71b2c24cDaniel Dunbar Value == "arm968e-s" || Value == "arm10e" || 168478dbd580a02759bbc408dbefb6754afa71b2c24cDaniel Dunbar Value == "arm1020e" || Value == "arm1022e" || Value == "arm926ej-s" || 168578dbd580a02759bbc408dbefb6754afa71b2c24cDaniel Dunbar Value == "arm1026ej-s") 168678dbd580a02759bbc408dbefb6754afa71b2c24cDaniel Dunbar return "armv5"; 168778dbd580a02759bbc408dbefb6754afa71b2c24cDaniel Dunbar 168878dbd580a02759bbc408dbefb6754afa71b2c24cDaniel Dunbar if (Value == "xscale") 168978dbd580a02759bbc408dbefb6754afa71b2c24cDaniel Dunbar return "xscale"; 169078dbd580a02759bbc408dbefb6754afa71b2c24cDaniel Dunbar 169178dbd580a02759bbc408dbefb6754afa71b2c24cDaniel Dunbar if (Value == "arm1136j-s" || Value == "arm1136jf-s" || 169278dbd580a02759bbc408dbefb6754afa71b2c24cDaniel Dunbar Value == "arm1176jz-s" || Value == "arm1176jzf-s") 169378dbd580a02759bbc408dbefb6754afa71b2c24cDaniel Dunbar return "armv6"; 169478dbd580a02759bbc408dbefb6754afa71b2c24cDaniel Dunbar 169578dbd580a02759bbc408dbefb6754afa71b2c24cDaniel Dunbar if (Value == "cortex-a8" || Value == "cortex-r4" || Value == "cortex-m3") 169678dbd580a02759bbc408dbefb6754afa71b2c24cDaniel Dunbar return "armv7"; 169778dbd580a02759bbc408dbefb6754afa71b2c24cDaniel Dunbar 169878dbd580a02759bbc408dbefb6754afa71b2c24cDaniel Dunbar return 0; 169978dbd580a02759bbc408dbefb6754afa71b2c24cDaniel Dunbar} 170078dbd580a02759bbc408dbefb6754afa71b2c24cDaniel Dunbar 1701fbefe6bd6f62a3361813498dc672ab0d6c0d4fd1Daniel Dunbarvoid darwin::DarwinTool::AddDarwinArch(const ArgList &Args, 1702fbefe6bd6f62a3361813498dc672ab0d6c0d4fd1Daniel Dunbar ArgStringList &CmdArgs) const { 170302633b541b04ad5ffc1c70f4c2feeeb13e607057Daniel Dunbar // Derived from darwin_arch spec. 170402633b541b04ad5ffc1c70f4c2feeeb13e607057Daniel Dunbar CmdArgs.push_back("-arch"); 170578dbd580a02759bbc408dbefb6754afa71b2c24cDaniel Dunbar 170678dbd580a02759bbc408dbefb6754afa71b2c24cDaniel Dunbar switch (getToolChain().getTriple().getArch()) { 170778dbd580a02759bbc408dbefb6754afa71b2c24cDaniel Dunbar default: 1708881376467c46c5c6cc16fa6790271c2c22e1d4f1Daniel Dunbar CmdArgs.push_back(Args.MakeArgString(getToolChain().getArchName())); 170978dbd580a02759bbc408dbefb6754afa71b2c24cDaniel Dunbar break; 171078dbd580a02759bbc408dbefb6754afa71b2c24cDaniel Dunbar 171178dbd580a02759bbc408dbefb6754afa71b2c24cDaniel Dunbar case llvm::Triple::arm: { 171278dbd580a02759bbc408dbefb6754afa71b2c24cDaniel Dunbar if (const Arg *A = Args.getLastArg(options::OPT_march_EQ)) { 171378dbd580a02759bbc408dbefb6754afa71b2c24cDaniel Dunbar if (const char *Arch = GetArmArchForMArch(A->getValue(Args))) { 171478dbd580a02759bbc408dbefb6754afa71b2c24cDaniel Dunbar CmdArgs.push_back(Arch); 171578dbd580a02759bbc408dbefb6754afa71b2c24cDaniel Dunbar return; 171678dbd580a02759bbc408dbefb6754afa71b2c24cDaniel Dunbar } 171778dbd580a02759bbc408dbefb6754afa71b2c24cDaniel Dunbar } 171878dbd580a02759bbc408dbefb6754afa71b2c24cDaniel Dunbar 171978dbd580a02759bbc408dbefb6754afa71b2c24cDaniel Dunbar if (const Arg *A = Args.getLastArg(options::OPT_mcpu_EQ)) { 172078dbd580a02759bbc408dbefb6754afa71b2c24cDaniel Dunbar if (const char *Arch = GetArmArchForMCpu(A->getValue(Args))) { 172178dbd580a02759bbc408dbefb6754afa71b2c24cDaniel Dunbar CmdArgs.push_back(Arch); 172278dbd580a02759bbc408dbefb6754afa71b2c24cDaniel Dunbar return; 172378dbd580a02759bbc408dbefb6754afa71b2c24cDaniel Dunbar } 172478dbd580a02759bbc408dbefb6754afa71b2c24cDaniel Dunbar } 172578dbd580a02759bbc408dbefb6754afa71b2c24cDaniel Dunbar 172678dbd580a02759bbc408dbefb6754afa71b2c24cDaniel Dunbar CmdArgs.push_back("arm"); 172778dbd580a02759bbc408dbefb6754afa71b2c24cDaniel Dunbar CmdArgs.push_back("-force_cpusubtype_ALL"); 172878dbd580a02759bbc408dbefb6754afa71b2c24cDaniel Dunbar return; 172978dbd580a02759bbc408dbefb6754afa71b2c24cDaniel Dunbar } 173078dbd580a02759bbc408dbefb6754afa71b2c24cDaniel Dunbar } 173102633b541b04ad5ffc1c70f4c2feeeb13e607057Daniel Dunbar} 173202633b541b04ad5ffc1c70f4c2feeeb13e607057Daniel Dunbar 1733fbefe6bd6f62a3361813498dc672ab0d6c0d4fd1Daniel Dunbarvoid darwin::DarwinTool::AddDarwinSubArch(const ArgList &Args, 1734fbefe6bd6f62a3361813498dc672ab0d6c0d4fd1Daniel Dunbar ArgStringList &CmdArgs) const { 173502633b541b04ad5ffc1c70f4c2feeeb13e607057Daniel Dunbar // Derived from darwin_subarch spec, not sure what the distinction 173602633b541b04ad5ffc1c70f4c2feeeb13e607057Daniel Dunbar // exists for but at least for this chain it is the same. 173702633b541b04ad5ffc1c70f4c2feeeb13e607057Daniel Dunbar AddDarwinArch(Args, CmdArgs); 173802633b541b04ad5ffc1c70f4c2feeeb13e607057Daniel Dunbar} 173902633b541b04ad5ffc1c70f4c2feeeb13e607057Daniel Dunbar 1740c21c485b4fb58ef5d55cf3e523263dd824a2ace4Daniel Dunbarvoid darwin::Link::AddLinkArgs(const ArgList &Args, 174102633b541b04ad5ffc1c70f4c2feeeb13e607057Daniel Dunbar ArgStringList &CmdArgs) const { 174202633b541b04ad5ffc1c70f4c2feeeb13e607057Daniel Dunbar const Driver &D = getToolChain().getHost().getDriver(); 174302633b541b04ad5ffc1c70f4c2feeeb13e607057Daniel Dunbar 174402633b541b04ad5ffc1c70f4c2feeeb13e607057Daniel Dunbar // Derived from the "link" spec. 174502633b541b04ad5ffc1c70f4c2feeeb13e607057Daniel Dunbar Args.AddAllArgs(CmdArgs, options::OPT_static); 174602633b541b04ad5ffc1c70f4c2feeeb13e607057Daniel Dunbar if (!Args.hasArg(options::OPT_static)) 174702633b541b04ad5ffc1c70f4c2feeeb13e607057Daniel Dunbar CmdArgs.push_back("-dynamic"); 174802633b541b04ad5ffc1c70f4c2feeeb13e607057Daniel Dunbar if (Args.hasArg(options::OPT_fgnu_runtime)) { 174902633b541b04ad5ffc1c70f4c2feeeb13e607057Daniel Dunbar // FIXME: gcc replaces -lobjc in forward args with -lobjc-gnu 175002633b541b04ad5ffc1c70f4c2feeeb13e607057Daniel Dunbar // here. How do we wish to handle such things? 175102633b541b04ad5ffc1c70f4c2feeeb13e607057Daniel Dunbar } 1752c21c485b4fb58ef5d55cf3e523263dd824a2ace4Daniel Dunbar 175302633b541b04ad5ffc1c70f4c2feeeb13e607057Daniel Dunbar if (!Args.hasArg(options::OPT_dynamiclib)) { 175402633b541b04ad5ffc1c70f4c2feeeb13e607057Daniel Dunbar if (Args.hasArg(options::OPT_force__cpusubtype__ALL)) { 175502633b541b04ad5ffc1c70f4c2feeeb13e607057Daniel Dunbar AddDarwinArch(Args, CmdArgs); 175602633b541b04ad5ffc1c70f4c2feeeb13e607057Daniel Dunbar CmdArgs.push_back("-force_cpusubtype_ALL"); 175702633b541b04ad5ffc1c70f4c2feeeb13e607057Daniel Dunbar } else 175802633b541b04ad5ffc1c70f4c2feeeb13e607057Daniel Dunbar AddDarwinSubArch(Args, CmdArgs); 175902633b541b04ad5ffc1c70f4c2feeeb13e607057Daniel Dunbar 176002633b541b04ad5ffc1c70f4c2feeeb13e607057Daniel Dunbar Args.AddLastArg(CmdArgs, options::OPT_bundle); 176102633b541b04ad5ffc1c70f4c2feeeb13e607057Daniel Dunbar Args.AddAllArgs(CmdArgs, options::OPT_bundle__loader); 176202633b541b04ad5ffc1c70f4c2feeeb13e607057Daniel Dunbar Args.AddAllArgs(CmdArgs, options::OPT_client__name); 176302633b541b04ad5ffc1c70f4c2feeeb13e607057Daniel Dunbar 176402633b541b04ad5ffc1c70f4c2feeeb13e607057Daniel Dunbar Arg *A; 176502633b541b04ad5ffc1c70f4c2feeeb13e607057Daniel Dunbar if ((A = Args.getLastArg(options::OPT_compatibility__version)) || 176602633b541b04ad5ffc1c70f4c2feeeb13e607057Daniel Dunbar (A = Args.getLastArg(options::OPT_current__version)) || 176702633b541b04ad5ffc1c70f4c2feeeb13e607057Daniel Dunbar (A = Args.getLastArg(options::OPT_install__name))) 176802633b541b04ad5ffc1c70f4c2feeeb13e607057Daniel Dunbar D.Diag(clang::diag::err_drv_argument_only_allowed_with) 176902633b541b04ad5ffc1c70f4c2feeeb13e607057Daniel Dunbar << A->getAsString(Args) << "-dynamiclib"; 177002633b541b04ad5ffc1c70f4c2feeeb13e607057Daniel Dunbar 177102633b541b04ad5ffc1c70f4c2feeeb13e607057Daniel Dunbar Args.AddLastArg(CmdArgs, options::OPT_force__flat__namespace); 177202633b541b04ad5ffc1c70f4c2feeeb13e607057Daniel Dunbar Args.AddLastArg(CmdArgs, options::OPT_keep__private__externs); 177302633b541b04ad5ffc1c70f4c2feeeb13e607057Daniel Dunbar Args.AddLastArg(CmdArgs, options::OPT_private__bundle); 177402633b541b04ad5ffc1c70f4c2feeeb13e607057Daniel Dunbar } else { 177502633b541b04ad5ffc1c70f4c2feeeb13e607057Daniel Dunbar CmdArgs.push_back("-dylib"); 177602633b541b04ad5ffc1c70f4c2feeeb13e607057Daniel Dunbar 177702633b541b04ad5ffc1c70f4c2feeeb13e607057Daniel Dunbar Arg *A; 177802633b541b04ad5ffc1c70f4c2feeeb13e607057Daniel Dunbar if ((A = Args.getLastArg(options::OPT_bundle)) || 177902633b541b04ad5ffc1c70f4c2feeeb13e607057Daniel Dunbar (A = Args.getLastArg(options::OPT_bundle__loader)) || 178002633b541b04ad5ffc1c70f4c2feeeb13e607057Daniel Dunbar (A = Args.getLastArg(options::OPT_client__name)) || 178102633b541b04ad5ffc1c70f4c2feeeb13e607057Daniel Dunbar (A = Args.getLastArg(options::OPT_force__flat__namespace)) || 178202633b541b04ad5ffc1c70f4c2feeeb13e607057Daniel Dunbar (A = Args.getLastArg(options::OPT_keep__private__externs)) || 178302633b541b04ad5ffc1c70f4c2feeeb13e607057Daniel Dunbar (A = Args.getLastArg(options::OPT_private__bundle))) 178402633b541b04ad5ffc1c70f4c2feeeb13e607057Daniel Dunbar D.Diag(clang::diag::err_drv_argument_not_allowed_with) 178502633b541b04ad5ffc1c70f4c2feeeb13e607057Daniel Dunbar << A->getAsString(Args) << "-dynamiclib"; 1786c21c485b4fb58ef5d55cf3e523263dd824a2ace4Daniel Dunbar 178702633b541b04ad5ffc1c70f4c2feeeb13e607057Daniel Dunbar Args.AddAllArgsTranslated(CmdArgs, options::OPT_compatibility__version, 178802633b541b04ad5ffc1c70f4c2feeeb13e607057Daniel Dunbar "-dylib_compatibility_version"); 178902633b541b04ad5ffc1c70f4c2feeeb13e607057Daniel Dunbar Args.AddAllArgsTranslated(CmdArgs, options::OPT_current__version, 179002633b541b04ad5ffc1c70f4c2feeeb13e607057Daniel Dunbar "-dylib_current_version"); 179102633b541b04ad5ffc1c70f4c2feeeb13e607057Daniel Dunbar 179202633b541b04ad5ffc1c70f4c2feeeb13e607057Daniel Dunbar if (Args.hasArg(options::OPT_force__cpusubtype__ALL)) { 179302633b541b04ad5ffc1c70f4c2feeeb13e607057Daniel Dunbar AddDarwinArch(Args, CmdArgs); 1794c21c485b4fb58ef5d55cf3e523263dd824a2ace4Daniel Dunbar // NOTE: We don't add -force_cpusubtype_ALL on this path. Ok. 179502633b541b04ad5ffc1c70f4c2feeeb13e607057Daniel Dunbar } else 179602633b541b04ad5ffc1c70f4c2feeeb13e607057Daniel Dunbar AddDarwinSubArch(Args, CmdArgs); 179702633b541b04ad5ffc1c70f4c2feeeb13e607057Daniel Dunbar 179802633b541b04ad5ffc1c70f4c2feeeb13e607057Daniel Dunbar Args.AddAllArgsTranslated(CmdArgs, options::OPT_install__name, 179902633b541b04ad5ffc1c70f4c2feeeb13e607057Daniel Dunbar "-dylib_install_name"); 180002633b541b04ad5ffc1c70f4c2feeeb13e607057Daniel Dunbar } 180102633b541b04ad5ffc1c70f4c2feeeb13e607057Daniel Dunbar 180202633b541b04ad5ffc1c70f4c2feeeb13e607057Daniel Dunbar Args.AddLastArg(CmdArgs, options::OPT_all__load); 180302633b541b04ad5ffc1c70f4c2feeeb13e607057Daniel Dunbar Args.AddAllArgs(CmdArgs, options::OPT_allowable__client); 180402633b541b04ad5ffc1c70f4c2feeeb13e607057Daniel Dunbar Args.AddLastArg(CmdArgs, options::OPT_bind__at__load); 1805d82f8fa53771b454885c546f0fd452a4980b3a3eDaniel Dunbar if (getDarwinToolChain().isIPhone()) 1806d82f8fa53771b454885c546f0fd452a4980b3a3eDaniel Dunbar Args.AddLastArg(CmdArgs, options::OPT_arch__errors__fatal); 180702633b541b04ad5ffc1c70f4c2feeeb13e607057Daniel Dunbar Args.AddLastArg(CmdArgs, options::OPT_dead__strip); 180802633b541b04ad5ffc1c70f4c2feeeb13e607057Daniel Dunbar Args.AddLastArg(CmdArgs, options::OPT_no__dead__strip__inits__and__terms); 180902633b541b04ad5ffc1c70f4c2feeeb13e607057Daniel Dunbar Args.AddAllArgs(CmdArgs, options::OPT_dylib__file); 181002633b541b04ad5ffc1c70f4c2feeeb13e607057Daniel Dunbar Args.AddLastArg(CmdArgs, options::OPT_dynamic); 181102633b541b04ad5ffc1c70f4c2feeeb13e607057Daniel Dunbar Args.AddAllArgs(CmdArgs, options::OPT_exported__symbols__list); 181202633b541b04ad5ffc1c70f4c2feeeb13e607057Daniel Dunbar Args.AddLastArg(CmdArgs, options::OPT_flat__namespace); 181302633b541b04ad5ffc1c70f4c2feeeb13e607057Daniel Dunbar Args.AddAllArgs(CmdArgs, options::OPT_headerpad__max__install__names); 181402633b541b04ad5ffc1c70f4c2feeeb13e607057Daniel Dunbar Args.AddAllArgs(CmdArgs, options::OPT_image__base); 181502633b541b04ad5ffc1c70f4c2feeeb13e607057Daniel Dunbar Args.AddAllArgs(CmdArgs, options::OPT_init); 181602633b541b04ad5ffc1c70f4c2feeeb13e607057Daniel Dunbar 181730392de4681602f1aabc61b0184b1de53bc172f0Daniel Dunbar if (!Args.hasArg(options::OPT_mmacosx_version_min_EQ) && 181830392de4681602f1aabc61b0184b1de53bc172f0Daniel Dunbar !Args.hasArg(options::OPT_miphoneos_version_min_EQ)) { 181930392de4681602f1aabc61b0184b1de53bc172f0Daniel Dunbar // Add default version min. 182030392de4681602f1aabc61b0184b1de53bc172f0Daniel Dunbar if (!getDarwinToolChain().isIPhone()) { 1821c21c485b4fb58ef5d55cf3e523263dd824a2ace4Daniel Dunbar CmdArgs.push_back("-macosx_version_min"); 1822c21c485b4fb58ef5d55cf3e523263dd824a2ace4Daniel Dunbar CmdArgs.push_back(getDarwinToolChain().getMacosxVersionStr()); 182330392de4681602f1aabc61b0184b1de53bc172f0Daniel Dunbar } else { 182430392de4681602f1aabc61b0184b1de53bc172f0Daniel Dunbar CmdArgs.push_back("-iphoneos_version_min"); 182530392de4681602f1aabc61b0184b1de53bc172f0Daniel Dunbar CmdArgs.push_back(getDarwinToolChain().getIPhoneOSVersionStr()); 1826c21c485b4fb58ef5d55cf3e523263dd824a2ace4Daniel Dunbar } 182702633b541b04ad5ffc1c70f4c2feeeb13e607057Daniel Dunbar } 182802633b541b04ad5ffc1c70f4c2feeeb13e607057Daniel Dunbar 182930392de4681602f1aabc61b0184b1de53bc172f0Daniel Dunbar // Adding all arguments doesn't make sense here but this is what 183030392de4681602f1aabc61b0184b1de53bc172f0Daniel Dunbar // gcc does. 183130392de4681602f1aabc61b0184b1de53bc172f0Daniel Dunbar Args.AddAllArgsTranslated(CmdArgs, options::OPT_mmacosx_version_min_EQ, 183230392de4681602f1aabc61b0184b1de53bc172f0Daniel Dunbar "-macosx_version_min"); 183302633b541b04ad5ffc1c70f4c2feeeb13e607057Daniel Dunbar Args.AddAllArgsTranslated(CmdArgs, options::OPT_miphoneos_version_min_EQ, 183402633b541b04ad5ffc1c70f4c2feeeb13e607057Daniel Dunbar "-iphoneos_version_min"); 183502633b541b04ad5ffc1c70f4c2feeeb13e607057Daniel Dunbar Args.AddLastArg(CmdArgs, options::OPT_nomultidefs); 183602633b541b04ad5ffc1c70f4c2feeeb13e607057Daniel Dunbar Args.AddLastArg(CmdArgs, options::OPT_multi__module); 183702633b541b04ad5ffc1c70f4c2feeeb13e607057Daniel Dunbar Args.AddLastArg(CmdArgs, options::OPT_single__module); 183802633b541b04ad5ffc1c70f4c2feeeb13e607057Daniel Dunbar Args.AddAllArgs(CmdArgs, options::OPT_multiply__defined); 183902633b541b04ad5ffc1c70f4c2feeeb13e607057Daniel Dunbar Args.AddAllArgs(CmdArgs, options::OPT_multiply__defined__unused); 1840c21c485b4fb58ef5d55cf3e523263dd824a2ace4Daniel Dunbar 184102633b541b04ad5ffc1c70f4c2feeeb13e607057Daniel Dunbar if (Args.hasArg(options::OPT_fpie)) 184202633b541b04ad5ffc1c70f4c2feeeb13e607057Daniel Dunbar CmdArgs.push_back("-pie"); 184302633b541b04ad5ffc1c70f4c2feeeb13e607057Daniel Dunbar 184402633b541b04ad5ffc1c70f4c2feeeb13e607057Daniel Dunbar Args.AddLastArg(CmdArgs, options::OPT_prebind); 184502633b541b04ad5ffc1c70f4c2feeeb13e607057Daniel Dunbar Args.AddLastArg(CmdArgs, options::OPT_noprebind); 184602633b541b04ad5ffc1c70f4c2feeeb13e607057Daniel Dunbar Args.AddLastArg(CmdArgs, options::OPT_nofixprebinding); 184702633b541b04ad5ffc1c70f4c2feeeb13e607057Daniel Dunbar Args.AddLastArg(CmdArgs, options::OPT_prebind__all__twolevel__modules); 184802633b541b04ad5ffc1c70f4c2feeeb13e607057Daniel Dunbar Args.AddLastArg(CmdArgs, options::OPT_read__only__relocs); 184902633b541b04ad5ffc1c70f4c2feeeb13e607057Daniel Dunbar Args.AddAllArgs(CmdArgs, options::OPT_sectcreate); 185002633b541b04ad5ffc1c70f4c2feeeb13e607057Daniel Dunbar Args.AddAllArgs(CmdArgs, options::OPT_sectorder); 185102633b541b04ad5ffc1c70f4c2feeeb13e607057Daniel Dunbar Args.AddAllArgs(CmdArgs, options::OPT_seg1addr); 185202633b541b04ad5ffc1c70f4c2feeeb13e607057Daniel Dunbar Args.AddAllArgs(CmdArgs, options::OPT_segprot); 185302633b541b04ad5ffc1c70f4c2feeeb13e607057Daniel Dunbar Args.AddAllArgs(CmdArgs, options::OPT_segaddr); 185402633b541b04ad5ffc1c70f4c2feeeb13e607057Daniel Dunbar Args.AddAllArgs(CmdArgs, options::OPT_segs__read__only__addr); 185502633b541b04ad5ffc1c70f4c2feeeb13e607057Daniel Dunbar Args.AddAllArgs(CmdArgs, options::OPT_segs__read__write__addr); 185602633b541b04ad5ffc1c70f4c2feeeb13e607057Daniel Dunbar Args.AddAllArgs(CmdArgs, options::OPT_seg__addr__table); 185702633b541b04ad5ffc1c70f4c2feeeb13e607057Daniel Dunbar Args.AddAllArgs(CmdArgs, options::OPT_seg__addr__table__filename); 185802633b541b04ad5ffc1c70f4c2feeeb13e607057Daniel Dunbar Args.AddAllArgs(CmdArgs, options::OPT_sub__library); 185902633b541b04ad5ffc1c70f4c2feeeb13e607057Daniel Dunbar Args.AddAllArgs(CmdArgs, options::OPT_sub__umbrella); 1860d82f8fa53771b454885c546f0fd452a4980b3a3eDaniel Dunbar 186102633b541b04ad5ffc1c70f4c2feeeb13e607057Daniel Dunbar Args.AddAllArgsTranslated(CmdArgs, options::OPT_isysroot, "-syslibroot"); 1862d82f8fa53771b454885c546f0fd452a4980b3a3eDaniel Dunbar if (getDarwinToolChain().isIPhone()) { 1863d82f8fa53771b454885c546f0fd452a4980b3a3eDaniel Dunbar if (!Args.hasArg(options::OPT_isysroot)) { 1864d82f8fa53771b454885c546f0fd452a4980b3a3eDaniel Dunbar CmdArgs.push_back("-syslibroot"); 1865d82f8fa53771b454885c546f0fd452a4980b3a3eDaniel Dunbar CmdArgs.push_back("/Developer/SDKs/Extra"); 1866d82f8fa53771b454885c546f0fd452a4980b3a3eDaniel Dunbar } 1867d82f8fa53771b454885c546f0fd452a4980b3a3eDaniel Dunbar } 1868d82f8fa53771b454885c546f0fd452a4980b3a3eDaniel Dunbar 186902633b541b04ad5ffc1c70f4c2feeeb13e607057Daniel Dunbar Args.AddLastArg(CmdArgs, options::OPT_twolevel__namespace); 187002633b541b04ad5ffc1c70f4c2feeeb13e607057Daniel Dunbar Args.AddLastArg(CmdArgs, options::OPT_twolevel__namespace__hints); 187102633b541b04ad5ffc1c70f4c2feeeb13e607057Daniel Dunbar Args.AddAllArgs(CmdArgs, options::OPT_umbrella); 187202633b541b04ad5ffc1c70f4c2feeeb13e607057Daniel Dunbar Args.AddAllArgs(CmdArgs, options::OPT_undefined); 187302633b541b04ad5ffc1c70f4c2feeeb13e607057Daniel Dunbar Args.AddAllArgs(CmdArgs, options::OPT_unexported__symbols__list); 187402633b541b04ad5ffc1c70f4c2feeeb13e607057Daniel Dunbar 1875d82f8fa53771b454885c546f0fd452a4980b3a3eDaniel Dunbar Args.AddAllArgs(CmdArgs, options::OPT_weak__reference__mismatches); 187602633b541b04ad5ffc1c70f4c2feeeb13e607057Daniel Dunbar if (!Args.hasArg(options::OPT_weak__reference__mismatches)) { 187702633b541b04ad5ffc1c70f4c2feeeb13e607057Daniel Dunbar CmdArgs.push_back("-weak_reference_mismatches"); 187802633b541b04ad5ffc1c70f4c2feeeb13e607057Daniel Dunbar CmdArgs.push_back("non-weak"); 187902633b541b04ad5ffc1c70f4c2feeeb13e607057Daniel Dunbar } 188002633b541b04ad5ffc1c70f4c2feeeb13e607057Daniel Dunbar 188102633b541b04ad5ffc1c70f4c2feeeb13e607057Daniel Dunbar Args.AddLastArg(CmdArgs, options::OPT_X_Flag); 188202633b541b04ad5ffc1c70f4c2feeeb13e607057Daniel Dunbar Args.AddAllArgs(CmdArgs, options::OPT_y); 188302633b541b04ad5ffc1c70f4c2feeeb13e607057Daniel Dunbar Args.AddLastArg(CmdArgs, options::OPT_w); 188402633b541b04ad5ffc1c70f4c2feeeb13e607057Daniel Dunbar Args.AddAllArgs(CmdArgs, options::OPT_pagezero__size); 188502633b541b04ad5ffc1c70f4c2feeeb13e607057Daniel Dunbar Args.AddAllArgs(CmdArgs, options::OPT_segs__read__); 188602633b541b04ad5ffc1c70f4c2feeeb13e607057Daniel Dunbar Args.AddLastArg(CmdArgs, options::OPT_seglinkedit); 188702633b541b04ad5ffc1c70f4c2feeeb13e607057Daniel Dunbar Args.AddLastArg(CmdArgs, options::OPT_noseglinkedit); 188802633b541b04ad5ffc1c70f4c2feeeb13e607057Daniel Dunbar Args.AddAllArgs(CmdArgs, options::OPT_sectalign); 188902633b541b04ad5ffc1c70f4c2feeeb13e607057Daniel Dunbar Args.AddAllArgs(CmdArgs, options::OPT_sectobjectsymbols); 189002633b541b04ad5ffc1c70f4c2feeeb13e607057Daniel Dunbar Args.AddAllArgs(CmdArgs, options::OPT_segcreate); 189102633b541b04ad5ffc1c70f4c2feeeb13e607057Daniel Dunbar Args.AddLastArg(CmdArgs, options::OPT_whyload); 189202633b541b04ad5ffc1c70f4c2feeeb13e607057Daniel Dunbar Args.AddLastArg(CmdArgs, options::OPT_whatsloaded); 189302633b541b04ad5ffc1c70f4c2feeeb13e607057Daniel Dunbar Args.AddAllArgs(CmdArgs, options::OPT_dylinker__install__name); 189402633b541b04ad5ffc1c70f4c2feeeb13e607057Daniel Dunbar Args.AddLastArg(CmdArgs, options::OPT_dylinker); 189502633b541b04ad5ffc1c70f4c2feeeb13e607057Daniel Dunbar Args.AddLastArg(CmdArgs, options::OPT_Mach); 189602633b541b04ad5ffc1c70f4c2feeeb13e607057Daniel Dunbar} 189702633b541b04ad5ffc1c70f4c2feeeb13e607057Daniel Dunbar 189802633b541b04ad5ffc1c70f4c2feeeb13e607057Daniel Dunbarvoid darwin::Link::ConstructJob(Compilation &C, const JobAction &JA, 1899c21c485b4fb58ef5d55cf3e523263dd824a2ace4Daniel Dunbar Job &Dest, const InputInfo &Output, 1900c21c485b4fb58ef5d55cf3e523263dd824a2ace4Daniel Dunbar const InputInfoList &Inputs, 1901c21c485b4fb58ef5d55cf3e523263dd824a2ace4Daniel Dunbar const ArgList &Args, 190202633b541b04ad5ffc1c70f4c2feeeb13e607057Daniel Dunbar const char *LinkingOutput) const { 190302633b541b04ad5ffc1c70f4c2feeeb13e607057Daniel Dunbar assert(Output.getType() == types::TY_Image && "Invalid linker output type."); 1904e0be8b1729d8978de433d229c065830b95d0ae68Daniel Dunbar 190502633b541b04ad5ffc1c70f4c2feeeb13e607057Daniel Dunbar // The logic here is derived from gcc's behavior; most of which 190602633b541b04ad5ffc1c70f4c2feeeb13e607057Daniel Dunbar // comes from specs (starting with link_command). Consult gcc for 190702633b541b04ad5ffc1c70f4c2feeeb13e607057Daniel Dunbar // more information. 190802633b541b04ad5ffc1c70f4c2feeeb13e607057Daniel Dunbar ArgStringList CmdArgs; 190902633b541b04ad5ffc1c70f4c2feeeb13e607057Daniel Dunbar 191002633b541b04ad5ffc1c70f4c2feeeb13e607057Daniel Dunbar // I'm not sure why this particular decomposition exists in gcc, but 191102633b541b04ad5ffc1c70f4c2feeeb13e607057Daniel Dunbar // we follow suite for ease of comparison. 191202633b541b04ad5ffc1c70f4c2feeeb13e607057Daniel Dunbar AddLinkArgs(Args, CmdArgs); 191302633b541b04ad5ffc1c70f4c2feeeb13e607057Daniel Dunbar 191402633b541b04ad5ffc1c70f4c2feeeb13e607057Daniel Dunbar Args.AddAllArgs(CmdArgs, options::OPT_d_Flag); 191502633b541b04ad5ffc1c70f4c2feeeb13e607057Daniel Dunbar Args.AddAllArgs(CmdArgs, options::OPT_s); 191602633b541b04ad5ffc1c70f4c2feeeb13e607057Daniel Dunbar Args.AddAllArgs(CmdArgs, options::OPT_t); 191702633b541b04ad5ffc1c70f4c2feeeb13e607057Daniel Dunbar Args.AddAllArgs(CmdArgs, options::OPT_Z_Flag); 191802633b541b04ad5ffc1c70f4c2feeeb13e607057Daniel Dunbar Args.AddAllArgs(CmdArgs, options::OPT_u_Group); 191902633b541b04ad5ffc1c70f4c2feeeb13e607057Daniel Dunbar Args.AddAllArgs(CmdArgs, options::OPT_A); 192002633b541b04ad5ffc1c70f4c2feeeb13e607057Daniel Dunbar Args.AddLastArg(CmdArgs, options::OPT_e); 192102633b541b04ad5ffc1c70f4c2feeeb13e607057Daniel Dunbar Args.AddAllArgs(CmdArgs, options::OPT_m_Separate); 192202633b541b04ad5ffc1c70f4c2feeeb13e607057Daniel Dunbar Args.AddAllArgs(CmdArgs, options::OPT_r); 192302633b541b04ad5ffc1c70f4c2feeeb13e607057Daniel Dunbar 192402633b541b04ad5ffc1c70f4c2feeeb13e607057Daniel Dunbar CmdArgs.push_back("-o"); 192502633b541b04ad5ffc1c70f4c2feeeb13e607057Daniel Dunbar CmdArgs.push_back(Output.getFilename()); 192602633b541b04ad5ffc1c70f4c2feeeb13e607057Daniel Dunbar 192702633b541b04ad5ffc1c70f4c2feeeb13e607057Daniel Dunbar unsigned MacosxVersion[3]; 192802633b541b04ad5ffc1c70f4c2feeeb13e607057Daniel Dunbar if (Arg *A = Args.getLastArg(options::OPT_mmacosx_version_min_EQ)) { 192902633b541b04ad5ffc1c70f4c2feeeb13e607057Daniel Dunbar bool HadExtra; 1930c21c485b4fb58ef5d55cf3e523263dd824a2ace4Daniel Dunbar if (!Driver::GetReleaseVersion(A->getValue(Args), MacosxVersion[0], 193102633b541b04ad5ffc1c70f4c2feeeb13e607057Daniel Dunbar MacosxVersion[1], MacosxVersion[2], 193202633b541b04ad5ffc1c70f4c2feeeb13e607057Daniel Dunbar HadExtra) || 193302633b541b04ad5ffc1c70f4c2feeeb13e607057Daniel Dunbar HadExtra) { 193402633b541b04ad5ffc1c70f4c2feeeb13e607057Daniel Dunbar const Driver &D = getToolChain().getHost().getDriver(); 193502633b541b04ad5ffc1c70f4c2feeeb13e607057Daniel Dunbar D.Diag(clang::diag::err_drv_invalid_version_number) 193602633b541b04ad5ffc1c70f4c2feeeb13e607057Daniel Dunbar << A->getAsString(Args); 193702633b541b04ad5ffc1c70f4c2feeeb13e607057Daniel Dunbar } 193802633b541b04ad5ffc1c70f4c2feeeb13e607057Daniel Dunbar } else { 193902633b541b04ad5ffc1c70f4c2feeeb13e607057Daniel Dunbar getDarwinToolChain().getMacosxVersion(MacosxVersion); 194002633b541b04ad5ffc1c70f4c2feeeb13e607057Daniel Dunbar } 1941c21c485b4fb58ef5d55cf3e523263dd824a2ace4Daniel Dunbar 194202633b541b04ad5ffc1c70f4c2feeeb13e607057Daniel Dunbar if (!Args.hasArg(options::OPT_A) && 194302633b541b04ad5ffc1c70f4c2feeeb13e607057Daniel Dunbar !Args.hasArg(options::OPT_nostdlib) && 194402633b541b04ad5ffc1c70f4c2feeeb13e607057Daniel Dunbar !Args.hasArg(options::OPT_nostartfiles)) { 194502633b541b04ad5ffc1c70f4c2feeeb13e607057Daniel Dunbar // Derived from startfile spec. 194602633b541b04ad5ffc1c70f4c2feeeb13e607057Daniel Dunbar if (Args.hasArg(options::OPT_dynamiclib)) { 1947c21c485b4fb58ef5d55cf3e523263dd824a2ace4Daniel Dunbar // Derived from darwin_dylib1 spec. 19488a8d8afa3df40e9f122d2b826f1a825a66f6908dDaniel Dunbar if (isMacosxVersionLT(MacosxVersion, 10, 5)) 194902633b541b04ad5ffc1c70f4c2feeeb13e607057Daniel Dunbar CmdArgs.push_back("-ldylib1.o"); 19508a8d8afa3df40e9f122d2b826f1a825a66f6908dDaniel Dunbar else if (isMacosxVersionLT(MacosxVersion, 10, 6)) 195102633b541b04ad5ffc1c70f4c2feeeb13e607057Daniel Dunbar CmdArgs.push_back("-ldylib1.10.5.o"); 195202633b541b04ad5ffc1c70f4c2feeeb13e607057Daniel Dunbar } else { 195302633b541b04ad5ffc1c70f4c2feeeb13e607057Daniel Dunbar if (Args.hasArg(options::OPT_bundle)) { 19548a8d8afa3df40e9f122d2b826f1a825a66f6908dDaniel Dunbar if (!Args.hasArg(options::OPT_static)) { 19558a8d8afa3df40e9f122d2b826f1a825a66f6908dDaniel Dunbar // Derived from darwin_bundle1 spec. 19568a8d8afa3df40e9f122d2b826f1a825a66f6908dDaniel Dunbar if (isMacosxVersionLT(MacosxVersion, 10, 6)) 19578a8d8afa3df40e9f122d2b826f1a825a66f6908dDaniel Dunbar CmdArgs.push_back("-lbundle1.o"); 19588a8d8afa3df40e9f122d2b826f1a825a66f6908dDaniel Dunbar } 195902633b541b04ad5ffc1c70f4c2feeeb13e607057Daniel Dunbar } else { 196002633b541b04ad5ffc1c70f4c2feeeb13e607057Daniel Dunbar if (Args.hasArg(options::OPT_pg)) { 196102633b541b04ad5ffc1c70f4c2feeeb13e607057Daniel Dunbar if (Args.hasArg(options::OPT_static) || 196202633b541b04ad5ffc1c70f4c2feeeb13e607057Daniel Dunbar Args.hasArg(options::OPT_object) || 196302633b541b04ad5ffc1c70f4c2feeeb13e607057Daniel Dunbar Args.hasArg(options::OPT_preload)) { 196402633b541b04ad5ffc1c70f4c2feeeb13e607057Daniel Dunbar CmdArgs.push_back("-lgcrt0.o"); 196502633b541b04ad5ffc1c70f4c2feeeb13e607057Daniel Dunbar } else { 196602633b541b04ad5ffc1c70f4c2feeeb13e607057Daniel Dunbar CmdArgs.push_back("-lgcrt1.o"); 1967c21c485b4fb58ef5d55cf3e523263dd824a2ace4Daniel Dunbar 196802633b541b04ad5ffc1c70f4c2feeeb13e607057Daniel Dunbar // darwin_crt2 spec is empty. 1969c21c485b4fb58ef5d55cf3e523263dd824a2ace4Daniel Dunbar } 197002633b541b04ad5ffc1c70f4c2feeeb13e607057Daniel Dunbar } else { 197102633b541b04ad5ffc1c70f4c2feeeb13e607057Daniel Dunbar if (Args.hasArg(options::OPT_static) || 197202633b541b04ad5ffc1c70f4c2feeeb13e607057Daniel Dunbar Args.hasArg(options::OPT_object) || 197302633b541b04ad5ffc1c70f4c2feeeb13e607057Daniel Dunbar Args.hasArg(options::OPT_preload)) { 197402633b541b04ad5ffc1c70f4c2feeeb13e607057Daniel Dunbar CmdArgs.push_back("-lcrt0.o"); 197502633b541b04ad5ffc1c70f4c2feeeb13e607057Daniel Dunbar } else { 197602633b541b04ad5ffc1c70f4c2feeeb13e607057Daniel Dunbar // Derived from darwin_crt1 spec. 1977ae33f8ff4749dd69060c70dae15e68e454dc3011Daniel Dunbar if (getDarwinToolChain().isIPhone()) { 1978ae33f8ff4749dd69060c70dae15e68e454dc3011Daniel Dunbar CmdArgs.push_back("-lcrt1.o"); 1979ae33f8ff4749dd69060c70dae15e68e454dc3011Daniel Dunbar } else if (isMacosxVersionLT(MacosxVersion, 10, 5)) 198002633b541b04ad5ffc1c70f4c2feeeb13e607057Daniel Dunbar CmdArgs.push_back("-lcrt1.o"); 19818a8d8afa3df40e9f122d2b826f1a825a66f6908dDaniel Dunbar else if (isMacosxVersionLT(MacosxVersion, 10, 6)) 198202633b541b04ad5ffc1c70f4c2feeeb13e607057Daniel Dunbar CmdArgs.push_back("-lcrt1.10.5.o"); 19838a8d8afa3df40e9f122d2b826f1a825a66f6908dDaniel Dunbar else 19848a8d8afa3df40e9f122d2b826f1a825a66f6908dDaniel Dunbar CmdArgs.push_back("-lcrt1.10.6.o"); 1985c21c485b4fb58ef5d55cf3e523263dd824a2ace4Daniel Dunbar 19868a8d8afa3df40e9f122d2b826f1a825a66f6908dDaniel Dunbar // darwin_crt2 spec is empty. 198702633b541b04ad5ffc1c70f4c2feeeb13e607057Daniel Dunbar } 198802633b541b04ad5ffc1c70f4c2feeeb13e607057Daniel Dunbar } 198902633b541b04ad5ffc1c70f4c2feeeb13e607057Daniel Dunbar } 199002633b541b04ad5ffc1c70f4c2feeeb13e607057Daniel Dunbar } 199102633b541b04ad5ffc1c70f4c2feeeb13e607057Daniel Dunbar 199202633b541b04ad5ffc1c70f4c2feeeb13e607057Daniel Dunbar if (Args.hasArg(options::OPT_shared_libgcc) && 199302633b541b04ad5ffc1c70f4c2feeeb13e607057Daniel Dunbar !Args.hasArg(options::OPT_miphoneos_version_min_EQ) && 199402633b541b04ad5ffc1c70f4c2feeeb13e607057Daniel Dunbar isMacosxVersionLT(MacosxVersion, 10, 5)) { 1995881376467c46c5c6cc16fa6790271c2c22e1d4f1Daniel Dunbar const char *Str = 19965ed34f4c58b6ad4e21038d713c1fae31a6146ff5Daniel Dunbar Args.MakeArgString(getToolChain().GetFilePath(C, "crt3.o")); 1997881376467c46c5c6cc16fa6790271c2c22e1d4f1Daniel Dunbar CmdArgs.push_back(Str); 199802633b541b04ad5ffc1c70f4c2feeeb13e607057Daniel Dunbar } 199902633b541b04ad5ffc1c70f4c2feeeb13e607057Daniel Dunbar } 200002633b541b04ad5ffc1c70f4c2feeeb13e607057Daniel Dunbar 200102633b541b04ad5ffc1c70f4c2feeeb13e607057Daniel Dunbar Args.AddAllArgs(CmdArgs, options::OPT_L); 2002c21c485b4fb58ef5d55cf3e523263dd824a2ace4Daniel Dunbar 200302633b541b04ad5ffc1c70f4c2feeeb13e607057Daniel Dunbar if (Args.hasArg(options::OPT_fopenmp)) 200402633b541b04ad5ffc1c70f4c2feeeb13e607057Daniel Dunbar // This is more complicated in gcc... 200502633b541b04ad5ffc1c70f4c2feeeb13e607057Daniel Dunbar CmdArgs.push_back("-lgomp"); 200602633b541b04ad5ffc1c70f4c2feeeb13e607057Daniel Dunbar 200702633b541b04ad5ffc1c70f4c2feeeb13e607057Daniel Dunbar // FIXME: Derive these correctly. 2008302e2eacf6334eaf18308c4820d2e2b116adfd5dDaniel Dunbar llvm::StringRef TCDir = getDarwinToolChain().getToolChainDir(); 200902633b541b04ad5ffc1c70f4c2feeeb13e607057Daniel Dunbar if (getToolChain().getArchName() == "x86_64") { 2010302e2eacf6334eaf18308c4820d2e2b116adfd5dDaniel Dunbar CmdArgs.push_back(Args.MakeArgString("-L/usr/lib/gcc/" + TCDir + 2011302e2eacf6334eaf18308c4820d2e2b116adfd5dDaniel Dunbar "/x86_64")); 201202633b541b04ad5ffc1c70f4c2feeeb13e607057Daniel Dunbar // Intentionally duplicated for (temporary) gcc bug compatibility. 2013302e2eacf6334eaf18308c4820d2e2b116adfd5dDaniel Dunbar CmdArgs.push_back(Args.MakeArgString("-L/usr/lib/gcc/" + TCDir + 2014302e2eacf6334eaf18308c4820d2e2b116adfd5dDaniel Dunbar "/x86_64")); 201502633b541b04ad5ffc1c70f4c2feeeb13e607057Daniel Dunbar } 2016302e2eacf6334eaf18308c4820d2e2b116adfd5dDaniel Dunbar CmdArgs.push_back(Args.MakeArgString("-L/usr/lib/" + TCDir)); 2017302e2eacf6334eaf18308c4820d2e2b116adfd5dDaniel Dunbar CmdArgs.push_back(Args.MakeArgString("-L/usr/lib/gcc/" + TCDir)); 201802633b541b04ad5ffc1c70f4c2feeeb13e607057Daniel Dunbar // Intentionally duplicated for (temporary) gcc bug compatibility. 2019302e2eacf6334eaf18308c4820d2e2b116adfd5dDaniel Dunbar CmdArgs.push_back(Args.MakeArgString("-L/usr/lib/gcc/" + TCDir)); 2020302e2eacf6334eaf18308c4820d2e2b116adfd5dDaniel Dunbar CmdArgs.push_back(Args.MakeArgString("-L/usr/lib/gcc/" + TCDir + 2021302e2eacf6334eaf18308c4820d2e2b116adfd5dDaniel Dunbar "/../../../" + TCDir)); 2022302e2eacf6334eaf18308c4820d2e2b116adfd5dDaniel Dunbar CmdArgs.push_back(Args.MakeArgString("-L/usr/lib/gcc/" + TCDir + 2023302e2eacf6334eaf18308c4820d2e2b116adfd5dDaniel Dunbar "/../../..")); 2024c21c485b4fb58ef5d55cf3e523263dd824a2ace4Daniel Dunbar 202502633b541b04ad5ffc1c70f4c2feeeb13e607057Daniel Dunbar for (InputInfoList::const_iterator 202602633b541b04ad5ffc1c70f4c2feeeb13e607057Daniel Dunbar it = Inputs.begin(), ie = Inputs.end(); it != ie; ++it) { 202702633b541b04ad5ffc1c70f4c2feeeb13e607057Daniel Dunbar const InputInfo &II = *it; 202802633b541b04ad5ffc1c70f4c2feeeb13e607057Daniel Dunbar if (II.isFilename()) 202902633b541b04ad5ffc1c70f4c2feeeb13e607057Daniel Dunbar CmdArgs.push_back(II.getFilename()); 2030c21c485b4fb58ef5d55cf3e523263dd824a2ace4Daniel Dunbar else 203102633b541b04ad5ffc1c70f4c2feeeb13e607057Daniel Dunbar II.getInputArg().renderAsInput(Args, CmdArgs); 203202633b541b04ad5ffc1c70f4c2feeeb13e607057Daniel Dunbar } 203302633b541b04ad5ffc1c70f4c2feeeb13e607057Daniel Dunbar 203402633b541b04ad5ffc1c70f4c2feeeb13e607057Daniel Dunbar if (LinkingOutput) { 203502633b541b04ad5ffc1c70f4c2feeeb13e607057Daniel Dunbar CmdArgs.push_back("-arch_multiple"); 203602633b541b04ad5ffc1c70f4c2feeeb13e607057Daniel Dunbar CmdArgs.push_back("-final_output"); 203702633b541b04ad5ffc1c70f4c2feeeb13e607057Daniel Dunbar CmdArgs.push_back(LinkingOutput); 203802633b541b04ad5ffc1c70f4c2feeeb13e607057Daniel Dunbar } 203902633b541b04ad5ffc1c70f4c2feeeb13e607057Daniel Dunbar 204002633b541b04ad5ffc1c70f4c2feeeb13e607057Daniel Dunbar if (Args.hasArg(options::OPT_fprofile_arcs) || 204102633b541b04ad5ffc1c70f4c2feeeb13e607057Daniel Dunbar Args.hasArg(options::OPT_fprofile_generate) || 204202633b541b04ad5ffc1c70f4c2feeeb13e607057Daniel Dunbar Args.hasArg(options::OPT_fcreate_profile) || 204302633b541b04ad5ffc1c70f4c2feeeb13e607057Daniel Dunbar Args.hasArg(options::OPT_coverage)) 204402633b541b04ad5ffc1c70f4c2feeeb13e607057Daniel Dunbar CmdArgs.push_back("-lgcov"); 2045c21c485b4fb58ef5d55cf3e523263dd824a2ace4Daniel Dunbar 204602633b541b04ad5ffc1c70f4c2feeeb13e607057Daniel Dunbar if (Args.hasArg(options::OPT_fnested_functions)) 204702633b541b04ad5ffc1c70f4c2feeeb13e607057Daniel Dunbar CmdArgs.push_back("-allow_stack_execute"); 2048c21c485b4fb58ef5d55cf3e523263dd824a2ace4Daniel Dunbar 204902633b541b04ad5ffc1c70f4c2feeeb13e607057Daniel Dunbar if (!Args.hasArg(options::OPT_nostdlib) && 205002633b541b04ad5ffc1c70f4c2feeeb13e607057Daniel Dunbar !Args.hasArg(options::OPT_nodefaultlibs)) { 2051edfa02b85b186e9ea9e0c841539a77ed32ee9148Daniel Dunbar // FIXME: g++ is more complicated here, it tries to put -lstdc++ 2052edfa02b85b186e9ea9e0c841539a77ed32ee9148Daniel Dunbar // before -lm, for example. 2053edfa02b85b186e9ea9e0c841539a77ed32ee9148Daniel Dunbar if (getToolChain().getHost().getDriver().CCCIsCXX) 2054edfa02b85b186e9ea9e0c841539a77ed32ee9148Daniel Dunbar CmdArgs.push_back("-lstdc++"); 2055edfa02b85b186e9ea9e0c841539a77ed32ee9148Daniel Dunbar 205602633b541b04ad5ffc1c70f4c2feeeb13e607057Daniel Dunbar // link_ssp spec is empty. 205702633b541b04ad5ffc1c70f4c2feeeb13e607057Daniel Dunbar 20588a8d8afa3df40e9f122d2b826f1a825a66f6908dDaniel Dunbar // Derived from libgcc and lib specs but refactored. 205902633b541b04ad5ffc1c70f4c2feeeb13e607057Daniel Dunbar if (Args.hasArg(options::OPT_static)) { 206002633b541b04ad5ffc1c70f4c2feeeb13e607057Daniel Dunbar CmdArgs.push_back("-lgcc_static"); 206102633b541b04ad5ffc1c70f4c2feeeb13e607057Daniel Dunbar } else { 20628a8d8afa3df40e9f122d2b826f1a825a66f6908dDaniel Dunbar if (Args.hasArg(options::OPT_static_libgcc)) { 20638a8d8afa3df40e9f122d2b826f1a825a66f6908dDaniel Dunbar CmdArgs.push_back("-lgcc_eh"); 20648a8d8afa3df40e9f122d2b826f1a825a66f6908dDaniel Dunbar } else if (Args.hasArg(options::OPT_miphoneos_version_min_EQ)) { 20658a8d8afa3df40e9f122d2b826f1a825a66f6908dDaniel Dunbar // Derived from darwin_iphoneos_libgcc spec. 2066ae33f8ff4749dd69060c70dae15e68e454dc3011Daniel Dunbar if (getDarwinToolChain().isIPhone()) { 2067ae33f8ff4749dd69060c70dae15e68e454dc3011Daniel Dunbar CmdArgs.push_back("-lgcc_s.1"); 2068ae33f8ff4749dd69060c70dae15e68e454dc3011Daniel Dunbar } else { 2069ae33f8ff4749dd69060c70dae15e68e454dc3011Daniel Dunbar CmdArgs.push_back("-lgcc_s.10.5"); 2070ae33f8ff4749dd69060c70dae15e68e454dc3011Daniel Dunbar } 20718a8d8afa3df40e9f122d2b826f1a825a66f6908dDaniel Dunbar } else if (Args.hasArg(options::OPT_shared_libgcc) || 2072738f8c278da5950d0d4607de2debe0bdfad64185Mike Stump // FIXME: -fexceptions -fno-exceptions means no exceptions 20738a8d8afa3df40e9f122d2b826f1a825a66f6908dDaniel Dunbar Args.hasArg(options::OPT_fexceptions) || 20748a8d8afa3df40e9f122d2b826f1a825a66f6908dDaniel Dunbar Args.hasArg(options::OPT_fgnu_runtime)) { 20758a8d8afa3df40e9f122d2b826f1a825a66f6908dDaniel Dunbar // FIXME: This is probably broken on 10.3? 20768a8d8afa3df40e9f122d2b826f1a825a66f6908dDaniel Dunbar if (isMacosxVersionLT(MacosxVersion, 10, 5)) 20778a8d8afa3df40e9f122d2b826f1a825a66f6908dDaniel Dunbar CmdArgs.push_back("-lgcc_s.10.4"); 20788a8d8afa3df40e9f122d2b826f1a825a66f6908dDaniel Dunbar else if (isMacosxVersionLT(MacosxVersion, 10, 6)) 20798a8d8afa3df40e9f122d2b826f1a825a66f6908dDaniel Dunbar CmdArgs.push_back("-lgcc_s.10.5"); 20808a8d8afa3df40e9f122d2b826f1a825a66f6908dDaniel Dunbar } else { 20818a8d8afa3df40e9f122d2b826f1a825a66f6908dDaniel Dunbar if (isMacosxVersionLT(MacosxVersion, 10, 3, 9)) 20828a8d8afa3df40e9f122d2b826f1a825a66f6908dDaniel Dunbar ; // Do nothing. 20838a8d8afa3df40e9f122d2b826f1a825a66f6908dDaniel Dunbar else if (isMacosxVersionLT(MacosxVersion, 10, 5)) 20848a8d8afa3df40e9f122d2b826f1a825a66f6908dDaniel Dunbar CmdArgs.push_back("-lgcc_s.10.4"); 20858a8d8afa3df40e9f122d2b826f1a825a66f6908dDaniel Dunbar else if (isMacosxVersionLT(MacosxVersion, 10, 6)) 20868a8d8afa3df40e9f122d2b826f1a825a66f6908dDaniel Dunbar CmdArgs.push_back("-lgcc_s.10.5"); 20878a8d8afa3df40e9f122d2b826f1a825a66f6908dDaniel Dunbar } 208802633b541b04ad5ffc1c70f4c2feeeb13e607057Daniel Dunbar 2089ae33f8ff4749dd69060c70dae15e68e454dc3011Daniel Dunbar if (getDarwinToolChain().isIPhone() || 2090ae33f8ff4749dd69060c70dae15e68e454dc3011Daniel Dunbar isMacosxVersionLT(MacosxVersion, 10, 6)) { 20918a8d8afa3df40e9f122d2b826f1a825a66f6908dDaniel Dunbar CmdArgs.push_back("-lgcc"); 20928a8d8afa3df40e9f122d2b826f1a825a66f6908dDaniel Dunbar CmdArgs.push_back("-lSystem"); 20938a8d8afa3df40e9f122d2b826f1a825a66f6908dDaniel Dunbar } else { 20948a8d8afa3df40e9f122d2b826f1a825a66f6908dDaniel Dunbar CmdArgs.push_back("-lSystem"); 20958a8d8afa3df40e9f122d2b826f1a825a66f6908dDaniel Dunbar CmdArgs.push_back("-lgcc"); 20968a8d8afa3df40e9f122d2b826f1a825a66f6908dDaniel Dunbar } 20978a8d8afa3df40e9f122d2b826f1a825a66f6908dDaniel Dunbar } 209802633b541b04ad5ffc1c70f4c2feeeb13e607057Daniel Dunbar } 209902633b541b04ad5ffc1c70f4c2feeeb13e607057Daniel Dunbar 210002633b541b04ad5ffc1c70f4c2feeeb13e607057Daniel Dunbar if (!Args.hasArg(options::OPT_A) && 210102633b541b04ad5ffc1c70f4c2feeeb13e607057Daniel Dunbar !Args.hasArg(options::OPT_nostdlib) && 210202633b541b04ad5ffc1c70f4c2feeeb13e607057Daniel Dunbar !Args.hasArg(options::OPT_nostartfiles)) { 210302633b541b04ad5ffc1c70f4c2feeeb13e607057Daniel Dunbar // endfile_spec is empty. 210402633b541b04ad5ffc1c70f4c2feeeb13e607057Daniel Dunbar } 210502633b541b04ad5ffc1c70f4c2feeeb13e607057Daniel Dunbar 210602633b541b04ad5ffc1c70f4c2feeeb13e607057Daniel Dunbar Args.AddAllArgs(CmdArgs, options::OPT_T_Group); 210702633b541b04ad5ffc1c70f4c2feeeb13e607057Daniel Dunbar Args.AddAllArgs(CmdArgs, options::OPT_F); 210802633b541b04ad5ffc1c70f4c2feeeb13e607057Daniel Dunbar 2109c21c485b4fb58ef5d55cf3e523263dd824a2ace4Daniel Dunbar const char *Exec = 21105ed34f4c58b6ad4e21038d713c1fae31a6146ff5Daniel Dunbar Args.MakeArgString(getToolChain().GetProgramPath(C, "ld")); 2111cae087e164e94e4286c11bf694dd0ff88f295302Daniel Dunbar Dest.addCommand(new Command(JA, Exec, CmdArgs)); 211202633b541b04ad5ffc1c70f4c2feeeb13e607057Daniel Dunbar 21130b46e1b5389615a8d6641f4d7bf5415d29acfef3Daniel Dunbar // Find the first non-empty base input (we want to ignore linker 21140b46e1b5389615a8d6641f4d7bf5415d29acfef3Daniel Dunbar // inputs). 21150b46e1b5389615a8d6641f4d7bf5415d29acfef3Daniel Dunbar const char *BaseInput = ""; 21160b46e1b5389615a8d6641f4d7bf5415d29acfef3Daniel Dunbar for (unsigned i = 0, e = Inputs.size(); i != e; ++i) { 21170b46e1b5389615a8d6641f4d7bf5415d29acfef3Daniel Dunbar if (Inputs[i].getBaseInput()[0] != '\0') { 21180b46e1b5389615a8d6641f4d7bf5415d29acfef3Daniel Dunbar BaseInput = Inputs[i].getBaseInput(); 21190b46e1b5389615a8d6641f4d7bf5415d29acfef3Daniel Dunbar break; 21200b46e1b5389615a8d6641f4d7bf5415d29acfef3Daniel Dunbar } 21210b46e1b5389615a8d6641f4d7bf5415d29acfef3Daniel Dunbar } 2122c21c485b4fb58ef5d55cf3e523263dd824a2ace4Daniel Dunbar 21233ed294522653323e4867a2eba03acc98a99e5479Daniel Dunbar // Run dsymutil if we are making an executable in a single step. 21243ed294522653323e4867a2eba03acc98a99e5479Daniel Dunbar // 21253ed294522653323e4867a2eba03acc98a99e5479Daniel Dunbar // FIXME: Currently we don't want to do this when we are part of a 21263ed294522653323e4867a2eba03acc98a99e5479Daniel Dunbar // universal build step, as this would end up creating stray temp 21273ed294522653323e4867a2eba03acc98a99e5479Daniel Dunbar // files. 21283ed294522653323e4867a2eba03acc98a99e5479Daniel Dunbar if (!LinkingOutput && 21293ed294522653323e4867a2eba03acc98a99e5479Daniel Dunbar Args.getLastArg(options::OPT_g_Group) && 213002633b541b04ad5ffc1c70f4c2feeeb13e607057Daniel Dunbar !Args.getLastArg(options::OPT_gstabs) && 213102633b541b04ad5ffc1c70f4c2feeeb13e607057Daniel Dunbar !Args.getLastArg(options::OPT_g0)) { 213202633b541b04ad5ffc1c70f4c2feeeb13e607057Daniel Dunbar // FIXME: This is gross, but matches gcc. The test only considers 213302633b541b04ad5ffc1c70f4c2feeeb13e607057Daniel Dunbar // the suffix (not the -x type), and then only of the first 21340b46e1b5389615a8d6641f4d7bf5415d29acfef3Daniel Dunbar // source input. Awesome. 21350b46e1b5389615a8d6641f4d7bf5415d29acfef3Daniel Dunbar const char *Suffix = strrchr(BaseInput, '.'); 213602633b541b04ad5ffc1c70f4c2feeeb13e607057Daniel Dunbar if (Suffix && isSourceSuffix(Suffix + 1)) { 2137c21c485b4fb58ef5d55cf3e523263dd824a2ace4Daniel Dunbar const char *Exec = 21385ed34f4c58b6ad4e21038d713c1fae31a6146ff5Daniel Dunbar Args.MakeArgString(getToolChain().GetProgramPath(C, "dsymutil")); 213902633b541b04ad5ffc1c70f4c2feeeb13e607057Daniel Dunbar ArgStringList CmdArgs; 214002633b541b04ad5ffc1c70f4c2feeeb13e607057Daniel Dunbar CmdArgs.push_back(Output.getFilename()); 2141cae087e164e94e4286c11bf694dd0ff88f295302Daniel Dunbar C.getJobs().addCommand(new Command(JA, Exec, CmdArgs)); 214202633b541b04ad5ffc1c70f4c2feeeb13e607057Daniel Dunbar } 214302633b541b04ad5ffc1c70f4c2feeeb13e607057Daniel Dunbar } 214402633b541b04ad5ffc1c70f4c2feeeb13e607057Daniel Dunbar} 214502633b541b04ad5ffc1c70f4c2feeeb13e607057Daniel Dunbar 2146ff7488dc9a766f94daf54d81b03ab9160d0bfd88Daniel Dunbarvoid darwin::Lipo::ConstructJob(Compilation &C, const JobAction &JA, 2147c21c485b4fb58ef5d55cf3e523263dd824a2ace4Daniel Dunbar Job &Dest, const InputInfo &Output, 2148c21c485b4fb58ef5d55cf3e523263dd824a2ace4Daniel Dunbar const InputInfoList &Inputs, 2149c21c485b4fb58ef5d55cf3e523263dd824a2ace4Daniel Dunbar const ArgList &Args, 2150ff7488dc9a766f94daf54d81b03ab9160d0bfd88Daniel Dunbar const char *LinkingOutput) const { 2151ff7488dc9a766f94daf54d81b03ab9160d0bfd88Daniel Dunbar ArgStringList CmdArgs; 2152ff7488dc9a766f94daf54d81b03ab9160d0bfd88Daniel Dunbar 2153ff7488dc9a766f94daf54d81b03ab9160d0bfd88Daniel Dunbar CmdArgs.push_back("-create"); 2154ff7488dc9a766f94daf54d81b03ab9160d0bfd88Daniel Dunbar assert(Output.isFilename() && "Unexpected lipo output."); 2155a428df828ea4cc6916ea90dcd9fbbc840776d207Daniel Dunbar 2156a428df828ea4cc6916ea90dcd9fbbc840776d207Daniel Dunbar CmdArgs.push_back("-output"); 2157ff7488dc9a766f94daf54d81b03ab9160d0bfd88Daniel Dunbar CmdArgs.push_back(Output.getFilename()); 2158a428df828ea4cc6916ea90dcd9fbbc840776d207Daniel Dunbar 2159ff7488dc9a766f94daf54d81b03ab9160d0bfd88Daniel Dunbar for (InputInfoList::const_iterator 2160ff7488dc9a766f94daf54d81b03ab9160d0bfd88Daniel Dunbar it = Inputs.begin(), ie = Inputs.end(); it != ie; ++it) { 2161ff7488dc9a766f94daf54d81b03ab9160d0bfd88Daniel Dunbar const InputInfo &II = *it; 2162ff7488dc9a766f94daf54d81b03ab9160d0bfd88Daniel Dunbar assert(II.isFilename() && "Unexpected lipo input."); 2163ff7488dc9a766f94daf54d81b03ab9160d0bfd88Daniel Dunbar CmdArgs.push_back(II.getFilename()); 2164ff7488dc9a766f94daf54d81b03ab9160d0bfd88Daniel Dunbar } 2165c21c485b4fb58ef5d55cf3e523263dd824a2ace4Daniel Dunbar const char *Exec = 21665ed34f4c58b6ad4e21038d713c1fae31a6146ff5Daniel Dunbar Args.MakeArgString(getToolChain().GetProgramPath(C, "lipo")); 2167cae087e164e94e4286c11bf694dd0ff88f295302Daniel Dunbar Dest.addCommand(new Command(JA, Exec, CmdArgs)); 2168ff7488dc9a766f94daf54d81b03ab9160d0bfd88Daniel Dunbar} 216968a31d406c6dc4382c700d1199b062de2aa7e1daDaniel Dunbar 2170e7925a075f110ab21afeae084670a155dea568e3Edward O'Callaghanvoid auroraux::Assemble::ConstructJob(Compilation &C, const JobAction &JA, 2171e7925a075f110ab21afeae084670a155dea568e3Edward O'Callaghan Job &Dest, const InputInfo &Output, 2172e7925a075f110ab21afeae084670a155dea568e3Edward O'Callaghan const InputInfoList &Inputs, 2173e7925a075f110ab21afeae084670a155dea568e3Edward O'Callaghan const ArgList &Args, 21741eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump const char *LinkingOutput) const { 2175e7925a075f110ab21afeae084670a155dea568e3Edward O'Callaghan ArgStringList CmdArgs; 2176e7925a075f110ab21afeae084670a155dea568e3Edward O'Callaghan 2177e7925a075f110ab21afeae084670a155dea568e3Edward O'Callaghan Args.AddAllArgValues(CmdArgs, options::OPT_Wa_COMMA, 2178e7925a075f110ab21afeae084670a155dea568e3Edward O'Callaghan options::OPT_Xassembler); 2179e7925a075f110ab21afeae084670a155dea568e3Edward O'Callaghan 2180e7925a075f110ab21afeae084670a155dea568e3Edward O'Callaghan CmdArgs.push_back("-o"); 2181e7925a075f110ab21afeae084670a155dea568e3Edward O'Callaghan if (Output.isPipe()) 2182e7925a075f110ab21afeae084670a155dea568e3Edward O'Callaghan CmdArgs.push_back("-"); 2183e7925a075f110ab21afeae084670a155dea568e3Edward O'Callaghan else 2184e7925a075f110ab21afeae084670a155dea568e3Edward O'Callaghan CmdArgs.push_back(Output.getFilename()); 2185e7925a075f110ab21afeae084670a155dea568e3Edward O'Callaghan 2186e7925a075f110ab21afeae084670a155dea568e3Edward O'Callaghan for (InputInfoList::const_iterator 2187e7925a075f110ab21afeae084670a155dea568e3Edward O'Callaghan it = Inputs.begin(), ie = Inputs.end(); it != ie; ++it) { 2188e7925a075f110ab21afeae084670a155dea568e3Edward O'Callaghan const InputInfo &II = *it; 2189e7925a075f110ab21afeae084670a155dea568e3Edward O'Callaghan if (II.isPipe()) 2190e7925a075f110ab21afeae084670a155dea568e3Edward O'Callaghan CmdArgs.push_back("-"); 2191e7925a075f110ab21afeae084670a155dea568e3Edward O'Callaghan else 2192e7925a075f110ab21afeae084670a155dea568e3Edward O'Callaghan CmdArgs.push_back(II.getFilename()); 2193e7925a075f110ab21afeae084670a155dea568e3Edward O'Callaghan } 2194e7925a075f110ab21afeae084670a155dea568e3Edward O'Callaghan 2195e7925a075f110ab21afeae084670a155dea568e3Edward O'Callaghan const char *Exec = 21965ed34f4c58b6ad4e21038d713c1fae31a6146ff5Daniel Dunbar Args.MakeArgString(getToolChain().GetProgramPath(C, "as")); 2197e7925a075f110ab21afeae084670a155dea568e3Edward O'Callaghan Dest.addCommand(new Command(JA, Exec, CmdArgs)); 2198e7925a075f110ab21afeae084670a155dea568e3Edward O'Callaghan} 2199e7925a075f110ab21afeae084670a155dea568e3Edward O'Callaghan 2200e7925a075f110ab21afeae084670a155dea568e3Edward O'Callaghanvoid auroraux::Link::ConstructJob(Compilation &C, const JobAction &JA, 2201e7925a075f110ab21afeae084670a155dea568e3Edward O'Callaghan Job &Dest, const InputInfo &Output, 2202e7925a075f110ab21afeae084670a155dea568e3Edward O'Callaghan const InputInfoList &Inputs, 2203e7925a075f110ab21afeae084670a155dea568e3Edward O'Callaghan const ArgList &Args, 2204e7925a075f110ab21afeae084670a155dea568e3Edward O'Callaghan const char *LinkingOutput) const { 2205e7925a075f110ab21afeae084670a155dea568e3Edward O'Callaghan const Driver &D = getToolChain().getHost().getDriver(); 2206e7925a075f110ab21afeae084670a155dea568e3Edward O'Callaghan ArgStringList CmdArgs; 2207e7925a075f110ab21afeae084670a155dea568e3Edward O'Callaghan 2208e7925a075f110ab21afeae084670a155dea568e3Edward O'Callaghan if ((!Args.hasArg(options::OPT_nostdlib)) && 2209e7925a075f110ab21afeae084670a155dea568e3Edward O'Callaghan (!Args.hasArg(options::OPT_shared))) { 2210e7925a075f110ab21afeae084670a155dea568e3Edward O'Callaghan CmdArgs.push_back("-e"); 2211e7925a075f110ab21afeae084670a155dea568e3Edward O'Callaghan CmdArgs.push_back("__start"); 2212e7925a075f110ab21afeae084670a155dea568e3Edward O'Callaghan } 2213e7925a075f110ab21afeae084670a155dea568e3Edward O'Callaghan 2214e7925a075f110ab21afeae084670a155dea568e3Edward O'Callaghan if (Args.hasArg(options::OPT_static)) { 2215e7925a075f110ab21afeae084670a155dea568e3Edward O'Callaghan CmdArgs.push_back("-Bstatic"); 2216e7925a075f110ab21afeae084670a155dea568e3Edward O'Callaghan } else { 2217e7925a075f110ab21afeae084670a155dea568e3Edward O'Callaghan CmdArgs.push_back("--eh-frame-hdr"); 2218e7925a075f110ab21afeae084670a155dea568e3Edward O'Callaghan CmdArgs.push_back("-Bdynamic"); 2219e7925a075f110ab21afeae084670a155dea568e3Edward O'Callaghan if (Args.hasArg(options::OPT_shared)) { 2220e7925a075f110ab21afeae084670a155dea568e3Edward O'Callaghan CmdArgs.push_back("-shared"); 2221e7925a075f110ab21afeae084670a155dea568e3Edward O'Callaghan } else { 2222e7925a075f110ab21afeae084670a155dea568e3Edward O'Callaghan CmdArgs.push_back("-dynamic-linker"); 2223e7925a075f110ab21afeae084670a155dea568e3Edward O'Callaghan CmdArgs.push_back("/lib/ld.so.1"); // 64Bit Path /lib/amd64/ld.so.1 2224e7925a075f110ab21afeae084670a155dea568e3Edward O'Callaghan } 2225e7925a075f110ab21afeae084670a155dea568e3Edward O'Callaghan } 2226e7925a075f110ab21afeae084670a155dea568e3Edward O'Callaghan 2227e7925a075f110ab21afeae084670a155dea568e3Edward O'Callaghan if (Output.isPipe()) { 2228e7925a075f110ab21afeae084670a155dea568e3Edward O'Callaghan CmdArgs.push_back("-o"); 2229e7925a075f110ab21afeae084670a155dea568e3Edward O'Callaghan CmdArgs.push_back("-"); 2230e7925a075f110ab21afeae084670a155dea568e3Edward O'Callaghan } else if (Output.isFilename()) { 2231e7925a075f110ab21afeae084670a155dea568e3Edward O'Callaghan CmdArgs.push_back("-o"); 2232e7925a075f110ab21afeae084670a155dea568e3Edward O'Callaghan CmdArgs.push_back(Output.getFilename()); 2233e7925a075f110ab21afeae084670a155dea568e3Edward O'Callaghan } else { 2234e7925a075f110ab21afeae084670a155dea568e3Edward O'Callaghan assert(Output.isNothing() && "Invalid output."); 2235e7925a075f110ab21afeae084670a155dea568e3Edward O'Callaghan } 2236e7925a075f110ab21afeae084670a155dea568e3Edward O'Callaghan 2237e7925a075f110ab21afeae084670a155dea568e3Edward O'Callaghan if (!Args.hasArg(options::OPT_nostdlib) && 2238e7925a075f110ab21afeae084670a155dea568e3Edward O'Callaghan !Args.hasArg(options::OPT_nostartfiles)) { 2239e7925a075f110ab21afeae084670a155dea568e3Edward O'Callaghan if (!Args.hasArg(options::OPT_shared)) { 22405ed34f4c58b6ad4e21038d713c1fae31a6146ff5Daniel Dunbar CmdArgs.push_back(Args.MakeArgString(getToolChain().GetFilePath(C, "crt0.o"))); 22415ed34f4c58b6ad4e21038d713c1fae31a6146ff5Daniel Dunbar CmdArgs.push_back(Args.MakeArgString(getToolChain().GetFilePath(C, "crtbegin.o"))); 2242e7925a075f110ab21afeae084670a155dea568e3Edward O'Callaghan } else { 22435ed34f4c58b6ad4e21038d713c1fae31a6146ff5Daniel Dunbar CmdArgs.push_back(Args.MakeArgString(getToolChain().GetFilePath(C, "crtbeginS.o"))); 2244e7925a075f110ab21afeae084670a155dea568e3Edward O'Callaghan } 2245e7925a075f110ab21afeae084670a155dea568e3Edward O'Callaghan } 2246e7925a075f110ab21afeae084670a155dea568e3Edward O'Callaghan 2247e7925a075f110ab21afeae084670a155dea568e3Edward O'Callaghan CmdArgs.push_back(MakeFormattedString(Args, 2248e7925a075f110ab21afeae084670a155dea568e3Edward O'Callaghan llvm::format("-L/opt/gcc4/lib/gcc/%s/4.2.4", 2249e7925a075f110ab21afeae084670a155dea568e3Edward O'Callaghan getToolChain().getTripleString().c_str()))); 2250e7925a075f110ab21afeae084670a155dea568e3Edward O'Callaghan 2251e7925a075f110ab21afeae084670a155dea568e3Edward O'Callaghan Args.AddAllArgs(CmdArgs, options::OPT_L); 2252e7925a075f110ab21afeae084670a155dea568e3Edward O'Callaghan Args.AddAllArgs(CmdArgs, options::OPT_T_Group); 2253e7925a075f110ab21afeae084670a155dea568e3Edward O'Callaghan Args.AddAllArgs(CmdArgs, options::OPT_e); 2254e7925a075f110ab21afeae084670a155dea568e3Edward O'Callaghan 2255e7925a075f110ab21afeae084670a155dea568e3Edward O'Callaghan for (InputInfoList::const_iterator 2256e7925a075f110ab21afeae084670a155dea568e3Edward O'Callaghan it = Inputs.begin(), ie = Inputs.end(); it != ie; ++it) { 2257e7925a075f110ab21afeae084670a155dea568e3Edward O'Callaghan const InputInfo &II = *it; 2258e7925a075f110ab21afeae084670a155dea568e3Edward O'Callaghan 2259e7925a075f110ab21afeae084670a155dea568e3Edward O'Callaghan // Don't try to pass LLVM inputs to a generic gcc. 2260e7925a075f110ab21afeae084670a155dea568e3Edward O'Callaghan if (II.getType() == types::TY_LLVMBC) 2261e7925a075f110ab21afeae084670a155dea568e3Edward O'Callaghan D.Diag(clang::diag::err_drv_no_linker_llvm_support) 2262881376467c46c5c6cc16fa6790271c2c22e1d4f1Daniel Dunbar << getToolChain().getTripleString(); 2263e7925a075f110ab21afeae084670a155dea568e3Edward O'Callaghan 2264e7925a075f110ab21afeae084670a155dea568e3Edward O'Callaghan if (II.isPipe()) 2265e7925a075f110ab21afeae084670a155dea568e3Edward O'Callaghan CmdArgs.push_back("-"); 2266e7925a075f110ab21afeae084670a155dea568e3Edward O'Callaghan else if (II.isFilename()) 2267e7925a075f110ab21afeae084670a155dea568e3Edward O'Callaghan CmdArgs.push_back(II.getFilename()); 2268e7925a075f110ab21afeae084670a155dea568e3Edward O'Callaghan else 2269e7925a075f110ab21afeae084670a155dea568e3Edward O'Callaghan II.getInputArg().renderAsInput(Args, CmdArgs); 2270e7925a075f110ab21afeae084670a155dea568e3Edward O'Callaghan } 2271e7925a075f110ab21afeae084670a155dea568e3Edward O'Callaghan 2272e7925a075f110ab21afeae084670a155dea568e3Edward O'Callaghan if (!Args.hasArg(options::OPT_nostdlib) && 2273e7925a075f110ab21afeae084670a155dea568e3Edward O'Callaghan !Args.hasArg(options::OPT_nodefaultlibs)) { 2274e7925a075f110ab21afeae084670a155dea568e3Edward O'Callaghan // FIXME: For some reason GCC passes -lgcc before adding 2275e7925a075f110ab21afeae084670a155dea568e3Edward O'Callaghan // the default system libraries. Just mimic this for now. 2276e7925a075f110ab21afeae084670a155dea568e3Edward O'Callaghan CmdArgs.push_back("-lgcc"); 2277e7925a075f110ab21afeae084670a155dea568e3Edward O'Callaghan 2278e7925a075f110ab21afeae084670a155dea568e3Edward O'Callaghan if (Args.hasArg(options::OPT_pthread)) 2279e7925a075f110ab21afeae084670a155dea568e3Edward O'Callaghan CmdArgs.push_back("-pthread"); 2280e7925a075f110ab21afeae084670a155dea568e3Edward O'Callaghan if (!Args.hasArg(options::OPT_shared)) 2281e7925a075f110ab21afeae084670a155dea568e3Edward O'Callaghan CmdArgs.push_back("-lc"); 2282e7925a075f110ab21afeae084670a155dea568e3Edward O'Callaghan CmdArgs.push_back("-lgcc"); 2283e7925a075f110ab21afeae084670a155dea568e3Edward O'Callaghan } 2284e7925a075f110ab21afeae084670a155dea568e3Edward O'Callaghan 2285e7925a075f110ab21afeae084670a155dea568e3Edward O'Callaghan if (!Args.hasArg(options::OPT_nostdlib) && 2286e7925a075f110ab21afeae084670a155dea568e3Edward O'Callaghan !Args.hasArg(options::OPT_nostartfiles)) { 2287e7925a075f110ab21afeae084670a155dea568e3Edward O'Callaghan if (!Args.hasArg(options::OPT_shared)) 22885ed34f4c58b6ad4e21038d713c1fae31a6146ff5Daniel Dunbar CmdArgs.push_back(Args.MakeArgString(getToolChain().GetFilePath(C, "crtend.o"))); 2289e7925a075f110ab21afeae084670a155dea568e3Edward O'Callaghan else 22905ed34f4c58b6ad4e21038d713c1fae31a6146ff5Daniel Dunbar CmdArgs.push_back(Args.MakeArgString(getToolChain().GetFilePath(C, "crtendS.o"))); 2291e7925a075f110ab21afeae084670a155dea568e3Edward O'Callaghan } 2292e7925a075f110ab21afeae084670a155dea568e3Edward O'Callaghan 2293e7925a075f110ab21afeae084670a155dea568e3Edward O'Callaghan const char *Exec = 22945ed34f4c58b6ad4e21038d713c1fae31a6146ff5Daniel Dunbar Args.MakeArgString(getToolChain().GetProgramPath(C, "ld")); 2295e7925a075f110ab21afeae084670a155dea568e3Edward O'Callaghan Dest.addCommand(new Command(JA, Exec, CmdArgs)); 2296e7925a075f110ab21afeae084670a155dea568e3Edward O'Callaghan} 2297e7925a075f110ab21afeae084670a155dea568e3Edward O'Callaghan 2298f7b8eec37c8c8012fa525c71fb29a58c9f29beefDaniel Dunbarvoid openbsd::Assemble::ConstructJob(Compilation &C, const JobAction &JA, 2299f7b8eec37c8c8012fa525c71fb29a58c9f29beefDaniel Dunbar Job &Dest, const InputInfo &Output, 2300f7b8eec37c8c8012fa525c71fb29a58c9f29beefDaniel Dunbar const InputInfoList &Inputs, 2301f7b8eec37c8c8012fa525c71fb29a58c9f29beefDaniel Dunbar const ArgList &Args, 23021eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump const char *LinkingOutput) const { 2303f7b8eec37c8c8012fa525c71fb29a58c9f29beefDaniel Dunbar ArgStringList CmdArgs; 2304f7b8eec37c8c8012fa525c71fb29a58c9f29beefDaniel Dunbar 2305f7b8eec37c8c8012fa525c71fb29a58c9f29beefDaniel Dunbar Args.AddAllArgValues(CmdArgs, options::OPT_Wa_COMMA, 2306f7b8eec37c8c8012fa525c71fb29a58c9f29beefDaniel Dunbar options::OPT_Xassembler); 2307f7b8eec37c8c8012fa525c71fb29a58c9f29beefDaniel Dunbar 2308f7b8eec37c8c8012fa525c71fb29a58c9f29beefDaniel Dunbar CmdArgs.push_back("-o"); 2309f7b8eec37c8c8012fa525c71fb29a58c9f29beefDaniel Dunbar if (Output.isPipe()) 2310f7b8eec37c8c8012fa525c71fb29a58c9f29beefDaniel Dunbar CmdArgs.push_back("-"); 2311f7b8eec37c8c8012fa525c71fb29a58c9f29beefDaniel Dunbar else 2312f7b8eec37c8c8012fa525c71fb29a58c9f29beefDaniel Dunbar CmdArgs.push_back(Output.getFilename()); 2313f7b8eec37c8c8012fa525c71fb29a58c9f29beefDaniel Dunbar 2314f7b8eec37c8c8012fa525c71fb29a58c9f29beefDaniel Dunbar for (InputInfoList::const_iterator 2315f7b8eec37c8c8012fa525c71fb29a58c9f29beefDaniel Dunbar it = Inputs.begin(), ie = Inputs.end(); it != ie; ++it) { 2316f7b8eec37c8c8012fa525c71fb29a58c9f29beefDaniel Dunbar const InputInfo &II = *it; 2317f7b8eec37c8c8012fa525c71fb29a58c9f29beefDaniel Dunbar if (II.isPipe()) 2318f7b8eec37c8c8012fa525c71fb29a58c9f29beefDaniel Dunbar CmdArgs.push_back("-"); 2319f7b8eec37c8c8012fa525c71fb29a58c9f29beefDaniel Dunbar else 2320f7b8eec37c8c8012fa525c71fb29a58c9f29beefDaniel Dunbar CmdArgs.push_back(II.getFilename()); 2321f7b8eec37c8c8012fa525c71fb29a58c9f29beefDaniel Dunbar } 2322f7b8eec37c8c8012fa525c71fb29a58c9f29beefDaniel Dunbar 2323f7b8eec37c8c8012fa525c71fb29a58c9f29beefDaniel Dunbar const char *Exec = 23245ed34f4c58b6ad4e21038d713c1fae31a6146ff5Daniel Dunbar Args.MakeArgString(getToolChain().GetProgramPath(C, "as")); 2325cae087e164e94e4286c11bf694dd0ff88f295302Daniel Dunbar Dest.addCommand(new Command(JA, Exec, CmdArgs)); 2326f7b8eec37c8c8012fa525c71fb29a58c9f29beefDaniel Dunbar} 2327f7b8eec37c8c8012fa525c71fb29a58c9f29beefDaniel Dunbar 2328f7b8eec37c8c8012fa525c71fb29a58c9f29beefDaniel Dunbarvoid openbsd::Link::ConstructJob(Compilation &C, const JobAction &JA, 2329f7b8eec37c8c8012fa525c71fb29a58c9f29beefDaniel Dunbar Job &Dest, const InputInfo &Output, 2330f7b8eec37c8c8012fa525c71fb29a58c9f29beefDaniel Dunbar const InputInfoList &Inputs, 2331f7b8eec37c8c8012fa525c71fb29a58c9f29beefDaniel Dunbar const ArgList &Args, 2332f7b8eec37c8c8012fa525c71fb29a58c9f29beefDaniel Dunbar const char *LinkingOutput) const { 2333f7b8eec37c8c8012fa525c71fb29a58c9f29beefDaniel Dunbar const Driver &D = getToolChain().getHost().getDriver(); 2334f7b8eec37c8c8012fa525c71fb29a58c9f29beefDaniel Dunbar ArgStringList CmdArgs; 2335f7b8eec37c8c8012fa525c71fb29a58c9f29beefDaniel Dunbar 23362bbcf669742b6b27748414e22f8042236fceef65Daniel Dunbar if ((!Args.hasArg(options::OPT_nostdlib)) && 23372bbcf669742b6b27748414e22f8042236fceef65Daniel Dunbar (!Args.hasArg(options::OPT_shared))) { 23382bbcf669742b6b27748414e22f8042236fceef65Daniel Dunbar CmdArgs.push_back("-e"); 23392bbcf669742b6b27748414e22f8042236fceef65Daniel Dunbar CmdArgs.push_back("__start"); 23402bbcf669742b6b27748414e22f8042236fceef65Daniel Dunbar } 23412bbcf669742b6b27748414e22f8042236fceef65Daniel Dunbar 2342f7b8eec37c8c8012fa525c71fb29a58c9f29beefDaniel Dunbar if (Args.hasArg(options::OPT_static)) { 2343f7b8eec37c8c8012fa525c71fb29a58c9f29beefDaniel Dunbar CmdArgs.push_back("-Bstatic"); 2344f7b8eec37c8c8012fa525c71fb29a58c9f29beefDaniel Dunbar } else { 2345f7b8eec37c8c8012fa525c71fb29a58c9f29beefDaniel Dunbar CmdArgs.push_back("--eh-frame-hdr"); 23462bbcf669742b6b27748414e22f8042236fceef65Daniel Dunbar CmdArgs.push_back("-Bdynamic"); 2347f7b8eec37c8c8012fa525c71fb29a58c9f29beefDaniel Dunbar if (Args.hasArg(options::OPT_shared)) { 23482bbcf669742b6b27748414e22f8042236fceef65Daniel Dunbar CmdArgs.push_back("-shared"); 2349f7b8eec37c8c8012fa525c71fb29a58c9f29beefDaniel Dunbar } else { 2350f7b8eec37c8c8012fa525c71fb29a58c9f29beefDaniel Dunbar CmdArgs.push_back("-dynamic-linker"); 2351f7b8eec37c8c8012fa525c71fb29a58c9f29beefDaniel Dunbar CmdArgs.push_back("/usr/libexec/ld.so"); 2352f7b8eec37c8c8012fa525c71fb29a58c9f29beefDaniel Dunbar } 2353f7b8eec37c8c8012fa525c71fb29a58c9f29beefDaniel Dunbar } 2354f7b8eec37c8c8012fa525c71fb29a58c9f29beefDaniel Dunbar 2355f7b8eec37c8c8012fa525c71fb29a58c9f29beefDaniel Dunbar if (Output.isPipe()) { 2356f7b8eec37c8c8012fa525c71fb29a58c9f29beefDaniel Dunbar CmdArgs.push_back("-o"); 2357f7b8eec37c8c8012fa525c71fb29a58c9f29beefDaniel Dunbar CmdArgs.push_back("-"); 2358f7b8eec37c8c8012fa525c71fb29a58c9f29beefDaniel Dunbar } else if (Output.isFilename()) { 2359f7b8eec37c8c8012fa525c71fb29a58c9f29beefDaniel Dunbar CmdArgs.push_back("-o"); 2360f7b8eec37c8c8012fa525c71fb29a58c9f29beefDaniel Dunbar CmdArgs.push_back(Output.getFilename()); 2361f7b8eec37c8c8012fa525c71fb29a58c9f29beefDaniel Dunbar } else { 2362f7b8eec37c8c8012fa525c71fb29a58c9f29beefDaniel Dunbar assert(Output.isNothing() && "Invalid output."); 2363f7b8eec37c8c8012fa525c71fb29a58c9f29beefDaniel Dunbar } 2364f7b8eec37c8c8012fa525c71fb29a58c9f29beefDaniel Dunbar 2365f7b8eec37c8c8012fa525c71fb29a58c9f29beefDaniel Dunbar if (!Args.hasArg(options::OPT_nostdlib) && 2366f7b8eec37c8c8012fa525c71fb29a58c9f29beefDaniel Dunbar !Args.hasArg(options::OPT_nostartfiles)) { 2367f7b8eec37c8c8012fa525c71fb29a58c9f29beefDaniel Dunbar if (!Args.hasArg(options::OPT_shared)) { 23685ed34f4c58b6ad4e21038d713c1fae31a6146ff5Daniel Dunbar CmdArgs.push_back(Args.MakeArgString(getToolChain().GetFilePath(C, "crt0.o"))); 23695ed34f4c58b6ad4e21038d713c1fae31a6146ff5Daniel Dunbar CmdArgs.push_back(Args.MakeArgString(getToolChain().GetFilePath(C, "crtbegin.o"))); 2370f7b8eec37c8c8012fa525c71fb29a58c9f29beefDaniel Dunbar } else { 23715ed34f4c58b6ad4e21038d713c1fae31a6146ff5Daniel Dunbar CmdArgs.push_back(Args.MakeArgString(getToolChain().GetFilePath(C, "crtbeginS.o"))); 2372f7b8eec37c8c8012fa525c71fb29a58c9f29beefDaniel Dunbar } 2373f7b8eec37c8c8012fa525c71fb29a58c9f29beefDaniel Dunbar } 2374f7b8eec37c8c8012fa525c71fb29a58c9f29beefDaniel Dunbar 23752bbcf669742b6b27748414e22f8042236fceef65Daniel Dunbar CmdArgs.push_back(MakeFormattedString(Args, 23762bbcf669742b6b27748414e22f8042236fceef65Daniel Dunbar llvm::format("-L/usr/lib/gcc-lib/%s/3.3.5", 2377881376467c46c5c6cc16fa6790271c2c22e1d4f1Daniel Dunbar getToolChain().getTripleString().c_str()))); 23782bbcf669742b6b27748414e22f8042236fceef65Daniel Dunbar 2379f7b8eec37c8c8012fa525c71fb29a58c9f29beefDaniel Dunbar Args.AddAllArgs(CmdArgs, options::OPT_L); 2380f7b8eec37c8c8012fa525c71fb29a58c9f29beefDaniel Dunbar Args.AddAllArgs(CmdArgs, options::OPT_T_Group); 2381f7b8eec37c8c8012fa525c71fb29a58c9f29beefDaniel Dunbar Args.AddAllArgs(CmdArgs, options::OPT_e); 2382f7b8eec37c8c8012fa525c71fb29a58c9f29beefDaniel Dunbar 2383f7b8eec37c8c8012fa525c71fb29a58c9f29beefDaniel Dunbar for (InputInfoList::const_iterator 2384f7b8eec37c8c8012fa525c71fb29a58c9f29beefDaniel Dunbar it = Inputs.begin(), ie = Inputs.end(); it != ie; ++it) { 2385f7b8eec37c8c8012fa525c71fb29a58c9f29beefDaniel Dunbar const InputInfo &II = *it; 2386f7b8eec37c8c8012fa525c71fb29a58c9f29beefDaniel Dunbar 2387f7b8eec37c8c8012fa525c71fb29a58c9f29beefDaniel Dunbar // Don't try to pass LLVM inputs to a generic gcc. 2388f7b8eec37c8c8012fa525c71fb29a58c9f29beefDaniel Dunbar if (II.getType() == types::TY_LLVMBC) 2389f7b8eec37c8c8012fa525c71fb29a58c9f29beefDaniel Dunbar D.Diag(clang::diag::err_drv_no_linker_llvm_support) 2390881376467c46c5c6cc16fa6790271c2c22e1d4f1Daniel Dunbar << getToolChain().getTripleString(); 2391f7b8eec37c8c8012fa525c71fb29a58c9f29beefDaniel Dunbar 2392f7b8eec37c8c8012fa525c71fb29a58c9f29beefDaniel Dunbar if (II.isPipe()) 2393f7b8eec37c8c8012fa525c71fb29a58c9f29beefDaniel Dunbar CmdArgs.push_back("-"); 2394f7b8eec37c8c8012fa525c71fb29a58c9f29beefDaniel Dunbar else if (II.isFilename()) 2395f7b8eec37c8c8012fa525c71fb29a58c9f29beefDaniel Dunbar CmdArgs.push_back(II.getFilename()); 2396f7b8eec37c8c8012fa525c71fb29a58c9f29beefDaniel Dunbar else 2397f7b8eec37c8c8012fa525c71fb29a58c9f29beefDaniel Dunbar II.getInputArg().renderAsInput(Args, CmdArgs); 2398f7b8eec37c8c8012fa525c71fb29a58c9f29beefDaniel Dunbar } 2399f7b8eec37c8c8012fa525c71fb29a58c9f29beefDaniel Dunbar 2400f7b8eec37c8c8012fa525c71fb29a58c9f29beefDaniel Dunbar if (!Args.hasArg(options::OPT_nostdlib) && 2401f7b8eec37c8c8012fa525c71fb29a58c9f29beefDaniel Dunbar !Args.hasArg(options::OPT_nodefaultlibs)) { 24022bbcf669742b6b27748414e22f8042236fceef65Daniel Dunbar // FIXME: For some reason GCC passes -lgcc before adding 24032bbcf669742b6b27748414e22f8042236fceef65Daniel Dunbar // the default system libraries. Just mimic this for now. 24042bbcf669742b6b27748414e22f8042236fceef65Daniel Dunbar CmdArgs.push_back("-lgcc"); 2405f7b8eec37c8c8012fa525c71fb29a58c9f29beefDaniel Dunbar 2406f7b8eec37c8c8012fa525c71fb29a58c9f29beefDaniel Dunbar if (Args.hasArg(options::OPT_pthread)) 2407f7b8eec37c8c8012fa525c71fb29a58c9f29beefDaniel Dunbar CmdArgs.push_back("-pthread"); 24082bbcf669742b6b27748414e22f8042236fceef65Daniel Dunbar if (!Args.hasArg(options::OPT_shared)) 24092bbcf669742b6b27748414e22f8042236fceef65Daniel Dunbar CmdArgs.push_back("-lc"); 24102bbcf669742b6b27748414e22f8042236fceef65Daniel Dunbar CmdArgs.push_back("-lgcc"); 2411f7b8eec37c8c8012fa525c71fb29a58c9f29beefDaniel Dunbar } 2412f7b8eec37c8c8012fa525c71fb29a58c9f29beefDaniel Dunbar 2413f7b8eec37c8c8012fa525c71fb29a58c9f29beefDaniel Dunbar if (!Args.hasArg(options::OPT_nostdlib) && 2414f7b8eec37c8c8012fa525c71fb29a58c9f29beefDaniel Dunbar !Args.hasArg(options::OPT_nostartfiles)) { 2415f7b8eec37c8c8012fa525c71fb29a58c9f29beefDaniel Dunbar if (!Args.hasArg(options::OPT_shared)) 24165ed34f4c58b6ad4e21038d713c1fae31a6146ff5Daniel Dunbar CmdArgs.push_back(Args.MakeArgString(getToolChain().GetFilePath(C, "crtend.o"))); 2417f7b8eec37c8c8012fa525c71fb29a58c9f29beefDaniel Dunbar else 24185ed34f4c58b6ad4e21038d713c1fae31a6146ff5Daniel Dunbar CmdArgs.push_back(Args.MakeArgString(getToolChain().GetFilePath(C, "crtendS.o"))); 2419f7b8eec37c8c8012fa525c71fb29a58c9f29beefDaniel Dunbar } 2420f7b8eec37c8c8012fa525c71fb29a58c9f29beefDaniel Dunbar 2421f7b8eec37c8c8012fa525c71fb29a58c9f29beefDaniel Dunbar const char *Exec = 24225ed34f4c58b6ad4e21038d713c1fae31a6146ff5Daniel Dunbar Args.MakeArgString(getToolChain().GetProgramPath(C, "ld")); 2423cae087e164e94e4286c11bf694dd0ff88f295302Daniel Dunbar Dest.addCommand(new Command(JA, Exec, CmdArgs)); 2424f7b8eec37c8c8012fa525c71fb29a58c9f29beefDaniel Dunbar} 2425c66a5a30a27e7b9cfab46ac8be918e3ea5b0c5a5Ed Schouten 242668a31d406c6dc4382c700d1199b062de2aa7e1daDaniel Dunbarvoid freebsd::Assemble::ConstructJob(Compilation &C, const JobAction &JA, 2427c21c485b4fb58ef5d55cf3e523263dd824a2ace4Daniel Dunbar Job &Dest, const InputInfo &Output, 2428c21c485b4fb58ef5d55cf3e523263dd824a2ace4Daniel Dunbar const InputInfoList &Inputs, 2429c21c485b4fb58ef5d55cf3e523263dd824a2ace4Daniel Dunbar const ArgList &Args, 24301eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump const char *LinkingOutput) const { 243168a31d406c6dc4382c700d1199b062de2aa7e1daDaniel Dunbar ArgStringList CmdArgs; 243268a31d406c6dc4382c700d1199b062de2aa7e1daDaniel Dunbar 2433008f54a54299eaafdaa940e2bdeaf55935ecd95aDaniel Dunbar // When building 32-bit code on FreeBSD/amd64, we have to explicitly 2434008f54a54299eaafdaa940e2bdeaf55935ecd95aDaniel Dunbar // instruct as in the base system to assemble 32-bit code. 2435008f54a54299eaafdaa940e2bdeaf55935ecd95aDaniel Dunbar if (getToolChain().getArchName() == "i386") 243668a31d406c6dc4382c700d1199b062de2aa7e1daDaniel Dunbar CmdArgs.push_back("--32"); 243768a31d406c6dc4382c700d1199b062de2aa7e1daDaniel Dunbar 243868a31d406c6dc4382c700d1199b062de2aa7e1daDaniel Dunbar Args.AddAllArgValues(CmdArgs, options::OPT_Wa_COMMA, 243968a31d406c6dc4382c700d1199b062de2aa7e1daDaniel Dunbar options::OPT_Xassembler); 244068a31d406c6dc4382c700d1199b062de2aa7e1daDaniel Dunbar 244168a31d406c6dc4382c700d1199b062de2aa7e1daDaniel Dunbar CmdArgs.push_back("-o"); 244268a31d406c6dc4382c700d1199b062de2aa7e1daDaniel Dunbar if (Output.isPipe()) 244368a31d406c6dc4382c700d1199b062de2aa7e1daDaniel Dunbar CmdArgs.push_back("-"); 244468a31d406c6dc4382c700d1199b062de2aa7e1daDaniel Dunbar else 244568a31d406c6dc4382c700d1199b062de2aa7e1daDaniel Dunbar CmdArgs.push_back(Output.getFilename()); 244668a31d406c6dc4382c700d1199b062de2aa7e1daDaniel Dunbar 244768a31d406c6dc4382c700d1199b062de2aa7e1daDaniel Dunbar for (InputInfoList::const_iterator 244868a31d406c6dc4382c700d1199b062de2aa7e1daDaniel Dunbar it = Inputs.begin(), ie = Inputs.end(); it != ie; ++it) { 244968a31d406c6dc4382c700d1199b062de2aa7e1daDaniel Dunbar const InputInfo &II = *it; 245068a31d406c6dc4382c700d1199b062de2aa7e1daDaniel Dunbar if (II.isPipe()) 245168a31d406c6dc4382c700d1199b062de2aa7e1daDaniel Dunbar CmdArgs.push_back("-"); 245268a31d406c6dc4382c700d1199b062de2aa7e1daDaniel Dunbar else 245368a31d406c6dc4382c700d1199b062de2aa7e1daDaniel Dunbar CmdArgs.push_back(II.getFilename()); 245468a31d406c6dc4382c700d1199b062de2aa7e1daDaniel Dunbar } 245568a31d406c6dc4382c700d1199b062de2aa7e1daDaniel Dunbar 2456c21c485b4fb58ef5d55cf3e523263dd824a2ace4Daniel Dunbar const char *Exec = 24575ed34f4c58b6ad4e21038d713c1fae31a6146ff5Daniel Dunbar Args.MakeArgString(getToolChain().GetProgramPath(C, "as")); 2458cae087e164e94e4286c11bf694dd0ff88f295302Daniel Dunbar Dest.addCommand(new Command(JA, Exec, CmdArgs)); 245968a31d406c6dc4382c700d1199b062de2aa7e1daDaniel Dunbar} 2460008f54a54299eaafdaa940e2bdeaf55935ecd95aDaniel Dunbar 2461008f54a54299eaafdaa940e2bdeaf55935ecd95aDaniel Dunbarvoid freebsd::Link::ConstructJob(Compilation &C, const JobAction &JA, 2462c21c485b4fb58ef5d55cf3e523263dd824a2ace4Daniel Dunbar Job &Dest, const InputInfo &Output, 2463c21c485b4fb58ef5d55cf3e523263dd824a2ace4Daniel Dunbar const InputInfoList &Inputs, 2464c21c485b4fb58ef5d55cf3e523263dd824a2ace4Daniel Dunbar const ArgList &Args, 2465a8304f67291b0182fb64f3afc621615288dd1d31Daniel Dunbar const char *LinkingOutput) const { 2466a8304f67291b0182fb64f3afc621615288dd1d31Daniel Dunbar const Driver &D = getToolChain().getHost().getDriver(); 2467008f54a54299eaafdaa940e2bdeaf55935ecd95aDaniel Dunbar ArgStringList CmdArgs; 2468008f54a54299eaafdaa940e2bdeaf55935ecd95aDaniel Dunbar 2469008f54a54299eaafdaa940e2bdeaf55935ecd95aDaniel Dunbar if (Args.hasArg(options::OPT_static)) { 2470008f54a54299eaafdaa940e2bdeaf55935ecd95aDaniel Dunbar CmdArgs.push_back("-Bstatic"); 2471008f54a54299eaafdaa940e2bdeaf55935ecd95aDaniel Dunbar } else { 2472008f54a54299eaafdaa940e2bdeaf55935ecd95aDaniel Dunbar CmdArgs.push_back("--eh-frame-hdr"); 2473008f54a54299eaafdaa940e2bdeaf55935ecd95aDaniel Dunbar if (Args.hasArg(options::OPT_shared)) { 2474008f54a54299eaafdaa940e2bdeaf55935ecd95aDaniel Dunbar CmdArgs.push_back("-Bshareable"); 2475008f54a54299eaafdaa940e2bdeaf55935ecd95aDaniel Dunbar } else { 2476008f54a54299eaafdaa940e2bdeaf55935ecd95aDaniel Dunbar CmdArgs.push_back("-dynamic-linker"); 2477008f54a54299eaafdaa940e2bdeaf55935ecd95aDaniel Dunbar CmdArgs.push_back("/libexec/ld-elf.so.1"); 2478008f54a54299eaafdaa940e2bdeaf55935ecd95aDaniel Dunbar } 2479008f54a54299eaafdaa940e2bdeaf55935ecd95aDaniel Dunbar } 2480008f54a54299eaafdaa940e2bdeaf55935ecd95aDaniel Dunbar 2481008f54a54299eaafdaa940e2bdeaf55935ecd95aDaniel Dunbar // When building 32-bit code on FreeBSD/amd64, we have to explicitly 2482008f54a54299eaafdaa940e2bdeaf55935ecd95aDaniel Dunbar // instruct ld in the base system to link 32-bit code. 2483008f54a54299eaafdaa940e2bdeaf55935ecd95aDaniel Dunbar if (getToolChain().getArchName() == "i386") { 2484008f54a54299eaafdaa940e2bdeaf55935ecd95aDaniel Dunbar CmdArgs.push_back("-m"); 2485008f54a54299eaafdaa940e2bdeaf55935ecd95aDaniel Dunbar CmdArgs.push_back("elf_i386_fbsd"); 2486008f54a54299eaafdaa940e2bdeaf55935ecd95aDaniel Dunbar } 2487008f54a54299eaafdaa940e2bdeaf55935ecd95aDaniel Dunbar 2488008f54a54299eaafdaa940e2bdeaf55935ecd95aDaniel Dunbar if (Output.isPipe()) { 2489008f54a54299eaafdaa940e2bdeaf55935ecd95aDaniel Dunbar CmdArgs.push_back("-o"); 2490008f54a54299eaafdaa940e2bdeaf55935ecd95aDaniel Dunbar CmdArgs.push_back("-"); 2491008f54a54299eaafdaa940e2bdeaf55935ecd95aDaniel Dunbar } else if (Output.isFilename()) { 2492008f54a54299eaafdaa940e2bdeaf55935ecd95aDaniel Dunbar CmdArgs.push_back("-o"); 2493008f54a54299eaafdaa940e2bdeaf55935ecd95aDaniel Dunbar CmdArgs.push_back(Output.getFilename()); 2494008f54a54299eaafdaa940e2bdeaf55935ecd95aDaniel Dunbar } else { 2495008f54a54299eaafdaa940e2bdeaf55935ecd95aDaniel Dunbar assert(Output.isNothing() && "Invalid output."); 2496008f54a54299eaafdaa940e2bdeaf55935ecd95aDaniel Dunbar } 2497008f54a54299eaafdaa940e2bdeaf55935ecd95aDaniel Dunbar 2498008f54a54299eaafdaa940e2bdeaf55935ecd95aDaniel Dunbar if (!Args.hasArg(options::OPT_nostdlib) && 2499008f54a54299eaafdaa940e2bdeaf55935ecd95aDaniel Dunbar !Args.hasArg(options::OPT_nostartfiles)) { 2500008f54a54299eaafdaa940e2bdeaf55935ecd95aDaniel Dunbar if (!Args.hasArg(options::OPT_shared)) { 25015ed34f4c58b6ad4e21038d713c1fae31a6146ff5Daniel Dunbar CmdArgs.push_back(Args.MakeArgString(getToolChain().GetFilePath(C, "crt1.o"))); 25025ed34f4c58b6ad4e21038d713c1fae31a6146ff5Daniel Dunbar CmdArgs.push_back(Args.MakeArgString(getToolChain().GetFilePath(C, "crti.o"))); 25035ed34f4c58b6ad4e21038d713c1fae31a6146ff5Daniel Dunbar CmdArgs.push_back(Args.MakeArgString(getToolChain().GetFilePath(C, "crtbegin.o"))); 2504008f54a54299eaafdaa940e2bdeaf55935ecd95aDaniel Dunbar } else { 25055ed34f4c58b6ad4e21038d713c1fae31a6146ff5Daniel Dunbar CmdArgs.push_back(Args.MakeArgString(getToolChain().GetFilePath(C, "crti.o"))); 25065ed34f4c58b6ad4e21038d713c1fae31a6146ff5Daniel Dunbar CmdArgs.push_back(Args.MakeArgString(getToolChain().GetFilePath(C, "crtbeginS.o"))); 2507008f54a54299eaafdaa940e2bdeaf55935ecd95aDaniel Dunbar } 2508008f54a54299eaafdaa940e2bdeaf55935ecd95aDaniel Dunbar } 2509008f54a54299eaafdaa940e2bdeaf55935ecd95aDaniel Dunbar 2510008f54a54299eaafdaa940e2bdeaf55935ecd95aDaniel Dunbar Args.AddAllArgs(CmdArgs, options::OPT_L); 2511008f54a54299eaafdaa940e2bdeaf55935ecd95aDaniel Dunbar Args.AddAllArgs(CmdArgs, options::OPT_T_Group); 2512008f54a54299eaafdaa940e2bdeaf55935ecd95aDaniel Dunbar Args.AddAllArgs(CmdArgs, options::OPT_e); 2513008f54a54299eaafdaa940e2bdeaf55935ecd95aDaniel Dunbar 2514008f54a54299eaafdaa940e2bdeaf55935ecd95aDaniel Dunbar for (InputInfoList::const_iterator 2515c21c485b4fb58ef5d55cf3e523263dd824a2ace4Daniel Dunbar it = Inputs.begin(), ie = Inputs.end(); it != ie; ++it) { 2516008f54a54299eaafdaa940e2bdeaf55935ecd95aDaniel Dunbar const InputInfo &II = *it; 2517a8304f67291b0182fb64f3afc621615288dd1d31Daniel Dunbar 2518a8304f67291b0182fb64f3afc621615288dd1d31Daniel Dunbar // Don't try to pass LLVM inputs to a generic gcc. 2519a8304f67291b0182fb64f3afc621615288dd1d31Daniel Dunbar if (II.getType() == types::TY_LLVMBC) 2520a8304f67291b0182fb64f3afc621615288dd1d31Daniel Dunbar D.Diag(clang::diag::err_drv_no_linker_llvm_support) 2521881376467c46c5c6cc16fa6790271c2c22e1d4f1Daniel Dunbar << getToolChain().getTripleString(); 2522a8304f67291b0182fb64f3afc621615288dd1d31Daniel Dunbar 2523008f54a54299eaafdaa940e2bdeaf55935ecd95aDaniel Dunbar if (II.isPipe()) 2524008f54a54299eaafdaa940e2bdeaf55935ecd95aDaniel Dunbar CmdArgs.push_back("-"); 2525008f54a54299eaafdaa940e2bdeaf55935ecd95aDaniel Dunbar else if (II.isFilename()) 2526008f54a54299eaafdaa940e2bdeaf55935ecd95aDaniel Dunbar CmdArgs.push_back(II.getFilename()); 2527008f54a54299eaafdaa940e2bdeaf55935ecd95aDaniel Dunbar else 2528008f54a54299eaafdaa940e2bdeaf55935ecd95aDaniel Dunbar II.getInputArg().renderAsInput(Args, CmdArgs); 2529008f54a54299eaafdaa940e2bdeaf55935ecd95aDaniel Dunbar } 2530008f54a54299eaafdaa940e2bdeaf55935ecd95aDaniel Dunbar 2531008f54a54299eaafdaa940e2bdeaf55935ecd95aDaniel Dunbar if (!Args.hasArg(options::OPT_nostdlib) && 2532008f54a54299eaafdaa940e2bdeaf55935ecd95aDaniel Dunbar !Args.hasArg(options::OPT_nodefaultlibs)) { 2533008f54a54299eaafdaa940e2bdeaf55935ecd95aDaniel Dunbar // FIXME: For some reason GCC passes -lgcc and -lgcc_s before adding 2534008f54a54299eaafdaa940e2bdeaf55935ecd95aDaniel Dunbar // the default system libraries. Just mimic this for now. 2535008f54a54299eaafdaa940e2bdeaf55935ecd95aDaniel Dunbar CmdArgs.push_back("-lgcc"); 2536008f54a54299eaafdaa940e2bdeaf55935ecd95aDaniel Dunbar if (Args.hasArg(options::OPT_static)) { 2537008f54a54299eaafdaa940e2bdeaf55935ecd95aDaniel Dunbar CmdArgs.push_back("-lgcc_eh"); 2538008f54a54299eaafdaa940e2bdeaf55935ecd95aDaniel Dunbar } else { 2539008f54a54299eaafdaa940e2bdeaf55935ecd95aDaniel Dunbar CmdArgs.push_back("--as-needed"); 2540008f54a54299eaafdaa940e2bdeaf55935ecd95aDaniel Dunbar CmdArgs.push_back("-lgcc_s"); 2541008f54a54299eaafdaa940e2bdeaf55935ecd95aDaniel Dunbar CmdArgs.push_back("--no-as-needed"); 2542008f54a54299eaafdaa940e2bdeaf55935ecd95aDaniel Dunbar } 2543008f54a54299eaafdaa940e2bdeaf55935ecd95aDaniel Dunbar 2544008f54a54299eaafdaa940e2bdeaf55935ecd95aDaniel Dunbar if (Args.hasArg(options::OPT_pthread)) 2545008f54a54299eaafdaa940e2bdeaf55935ecd95aDaniel Dunbar CmdArgs.push_back("-lpthread"); 2546008f54a54299eaafdaa940e2bdeaf55935ecd95aDaniel Dunbar CmdArgs.push_back("-lc"); 2547008f54a54299eaafdaa940e2bdeaf55935ecd95aDaniel Dunbar 2548008f54a54299eaafdaa940e2bdeaf55935ecd95aDaniel Dunbar CmdArgs.push_back("-lgcc"); 2549008f54a54299eaafdaa940e2bdeaf55935ecd95aDaniel Dunbar if (Args.hasArg(options::OPT_static)) { 2550008f54a54299eaafdaa940e2bdeaf55935ecd95aDaniel Dunbar CmdArgs.push_back("-lgcc_eh"); 2551008f54a54299eaafdaa940e2bdeaf55935ecd95aDaniel Dunbar } else { 2552008f54a54299eaafdaa940e2bdeaf55935ecd95aDaniel Dunbar CmdArgs.push_back("--as-needed"); 2553008f54a54299eaafdaa940e2bdeaf55935ecd95aDaniel Dunbar CmdArgs.push_back("-lgcc_s"); 2554008f54a54299eaafdaa940e2bdeaf55935ecd95aDaniel Dunbar CmdArgs.push_back("--no-as-needed"); 2555008f54a54299eaafdaa940e2bdeaf55935ecd95aDaniel Dunbar } 2556008f54a54299eaafdaa940e2bdeaf55935ecd95aDaniel Dunbar } 2557008f54a54299eaafdaa940e2bdeaf55935ecd95aDaniel Dunbar 2558008f54a54299eaafdaa940e2bdeaf55935ecd95aDaniel Dunbar if (!Args.hasArg(options::OPT_nostdlib) && 2559008f54a54299eaafdaa940e2bdeaf55935ecd95aDaniel Dunbar !Args.hasArg(options::OPT_nostartfiles)) { 2560008f54a54299eaafdaa940e2bdeaf55935ecd95aDaniel Dunbar if (!Args.hasArg(options::OPT_shared)) 25615ed34f4c58b6ad4e21038d713c1fae31a6146ff5Daniel Dunbar CmdArgs.push_back(Args.MakeArgString(getToolChain().GetFilePath(C, "crtend.o"))); 2562008f54a54299eaafdaa940e2bdeaf55935ecd95aDaniel Dunbar else 25635ed34f4c58b6ad4e21038d713c1fae31a6146ff5Daniel Dunbar CmdArgs.push_back(Args.MakeArgString(getToolChain().GetFilePath(C, "crtendS.o"))); 25645ed34f4c58b6ad4e21038d713c1fae31a6146ff5Daniel Dunbar CmdArgs.push_back(Args.MakeArgString(getToolChain().GetFilePath(C, "crtn.o"))); 2565008f54a54299eaafdaa940e2bdeaf55935ecd95aDaniel Dunbar } 2566008f54a54299eaafdaa940e2bdeaf55935ecd95aDaniel Dunbar 2567c21c485b4fb58ef5d55cf3e523263dd824a2ace4Daniel Dunbar const char *Exec = 25685ed34f4c58b6ad4e21038d713c1fae31a6146ff5Daniel Dunbar Args.MakeArgString(getToolChain().GetProgramPath(C, "ld")); 2569cae087e164e94e4286c11bf694dd0ff88f295302Daniel Dunbar Dest.addCommand(new Command(JA, Exec, CmdArgs)); 2570008f54a54299eaafdaa940e2bdeaf55935ecd95aDaniel Dunbar} 257111e1b40d759a643086f590f6ffbd9d68360bad46Daniel Dunbar 257211e1b40d759a643086f590f6ffbd9d68360bad46Daniel Dunbar/// DragonFly Tools 257311e1b40d759a643086f590f6ffbd9d68360bad46Daniel Dunbar 257411e1b40d759a643086f590f6ffbd9d68360bad46Daniel Dunbar// For now, DragonFly Assemble does just about the same as for 257511e1b40d759a643086f590f6ffbd9d68360bad46Daniel Dunbar// FreeBSD, but this may change soon. 257611e1b40d759a643086f590f6ffbd9d68360bad46Daniel Dunbarvoid dragonfly::Assemble::ConstructJob(Compilation &C, const JobAction &JA, 257711e1b40d759a643086f590f6ffbd9d68360bad46Daniel Dunbar Job &Dest, const InputInfo &Output, 257811e1b40d759a643086f590f6ffbd9d68360bad46Daniel Dunbar const InputInfoList &Inputs, 257911e1b40d759a643086f590f6ffbd9d68360bad46Daniel Dunbar const ArgList &Args, 258011e1b40d759a643086f590f6ffbd9d68360bad46Daniel Dunbar const char *LinkingOutput) const { 258111e1b40d759a643086f590f6ffbd9d68360bad46Daniel Dunbar ArgStringList CmdArgs; 258211e1b40d759a643086f590f6ffbd9d68360bad46Daniel Dunbar 258311e1b40d759a643086f590f6ffbd9d68360bad46Daniel Dunbar // When building 32-bit code on DragonFly/pc64, we have to explicitly 258411e1b40d759a643086f590f6ffbd9d68360bad46Daniel Dunbar // instruct as in the base system to assemble 32-bit code. 258511e1b40d759a643086f590f6ffbd9d68360bad46Daniel Dunbar if (getToolChain().getArchName() == "i386") 258611e1b40d759a643086f590f6ffbd9d68360bad46Daniel Dunbar CmdArgs.push_back("--32"); 258711e1b40d759a643086f590f6ffbd9d68360bad46Daniel Dunbar 258811e1b40d759a643086f590f6ffbd9d68360bad46Daniel Dunbar Args.AddAllArgValues(CmdArgs, options::OPT_Wa_COMMA, 258911e1b40d759a643086f590f6ffbd9d68360bad46Daniel Dunbar options::OPT_Xassembler); 259011e1b40d759a643086f590f6ffbd9d68360bad46Daniel Dunbar 259111e1b40d759a643086f590f6ffbd9d68360bad46Daniel Dunbar CmdArgs.push_back("-o"); 259211e1b40d759a643086f590f6ffbd9d68360bad46Daniel Dunbar if (Output.isPipe()) 259311e1b40d759a643086f590f6ffbd9d68360bad46Daniel Dunbar CmdArgs.push_back("-"); 259411e1b40d759a643086f590f6ffbd9d68360bad46Daniel Dunbar else 259511e1b40d759a643086f590f6ffbd9d68360bad46Daniel Dunbar CmdArgs.push_back(Output.getFilename()); 259611e1b40d759a643086f590f6ffbd9d68360bad46Daniel Dunbar 259711e1b40d759a643086f590f6ffbd9d68360bad46Daniel Dunbar for (InputInfoList::const_iterator 259811e1b40d759a643086f590f6ffbd9d68360bad46Daniel Dunbar it = Inputs.begin(), ie = Inputs.end(); it != ie; ++it) { 259911e1b40d759a643086f590f6ffbd9d68360bad46Daniel Dunbar const InputInfo &II = *it; 260011e1b40d759a643086f590f6ffbd9d68360bad46Daniel Dunbar if (II.isPipe()) 260111e1b40d759a643086f590f6ffbd9d68360bad46Daniel Dunbar CmdArgs.push_back("-"); 260211e1b40d759a643086f590f6ffbd9d68360bad46Daniel Dunbar else 260311e1b40d759a643086f590f6ffbd9d68360bad46Daniel Dunbar CmdArgs.push_back(II.getFilename()); 260411e1b40d759a643086f590f6ffbd9d68360bad46Daniel Dunbar } 260511e1b40d759a643086f590f6ffbd9d68360bad46Daniel Dunbar 260611e1b40d759a643086f590f6ffbd9d68360bad46Daniel Dunbar const char *Exec = 26075ed34f4c58b6ad4e21038d713c1fae31a6146ff5Daniel Dunbar Args.MakeArgString(getToolChain().GetProgramPath(C, "as")); 2608cae087e164e94e4286c11bf694dd0ff88f295302Daniel Dunbar Dest.addCommand(new Command(JA, Exec, CmdArgs)); 260911e1b40d759a643086f590f6ffbd9d68360bad46Daniel Dunbar} 261011e1b40d759a643086f590f6ffbd9d68360bad46Daniel Dunbar 261111e1b40d759a643086f590f6ffbd9d68360bad46Daniel Dunbarvoid dragonfly::Link::ConstructJob(Compilation &C, const JobAction &JA, 261211e1b40d759a643086f590f6ffbd9d68360bad46Daniel Dunbar Job &Dest, const InputInfo &Output, 261311e1b40d759a643086f590f6ffbd9d68360bad46Daniel Dunbar const InputInfoList &Inputs, 261411e1b40d759a643086f590f6ffbd9d68360bad46Daniel Dunbar const ArgList &Args, 261511e1b40d759a643086f590f6ffbd9d68360bad46Daniel Dunbar const char *LinkingOutput) const { 2616a8304f67291b0182fb64f3afc621615288dd1d31Daniel Dunbar const Driver &D = getToolChain().getHost().getDriver(); 261711e1b40d759a643086f590f6ffbd9d68360bad46Daniel Dunbar ArgStringList CmdArgs; 261811e1b40d759a643086f590f6ffbd9d68360bad46Daniel Dunbar 261911e1b40d759a643086f590f6ffbd9d68360bad46Daniel Dunbar if (Args.hasArg(options::OPT_static)) { 262011e1b40d759a643086f590f6ffbd9d68360bad46Daniel Dunbar CmdArgs.push_back("-Bstatic"); 262111e1b40d759a643086f590f6ffbd9d68360bad46Daniel Dunbar } else { 262211e1b40d759a643086f590f6ffbd9d68360bad46Daniel Dunbar if (Args.hasArg(options::OPT_shared)) 262311e1b40d759a643086f590f6ffbd9d68360bad46Daniel Dunbar CmdArgs.push_back("-Bshareable"); 262411e1b40d759a643086f590f6ffbd9d68360bad46Daniel Dunbar else { 262511e1b40d759a643086f590f6ffbd9d68360bad46Daniel Dunbar CmdArgs.push_back("-dynamic-linker"); 262611e1b40d759a643086f590f6ffbd9d68360bad46Daniel Dunbar CmdArgs.push_back("/usr/libexec/ld-elf.so.2"); 262711e1b40d759a643086f590f6ffbd9d68360bad46Daniel Dunbar } 262811e1b40d759a643086f590f6ffbd9d68360bad46Daniel Dunbar } 262911e1b40d759a643086f590f6ffbd9d68360bad46Daniel Dunbar 263011e1b40d759a643086f590f6ffbd9d68360bad46Daniel Dunbar // When building 32-bit code on DragonFly/pc64, we have to explicitly 263111e1b40d759a643086f590f6ffbd9d68360bad46Daniel Dunbar // instruct ld in the base system to link 32-bit code. 263211e1b40d759a643086f590f6ffbd9d68360bad46Daniel Dunbar if (getToolChain().getArchName() == "i386") { 263311e1b40d759a643086f590f6ffbd9d68360bad46Daniel Dunbar CmdArgs.push_back("-m"); 263411e1b40d759a643086f590f6ffbd9d68360bad46Daniel Dunbar CmdArgs.push_back("elf_i386"); 263511e1b40d759a643086f590f6ffbd9d68360bad46Daniel Dunbar } 263611e1b40d759a643086f590f6ffbd9d68360bad46Daniel Dunbar 263711e1b40d759a643086f590f6ffbd9d68360bad46Daniel Dunbar if (Output.isPipe()) { 263811e1b40d759a643086f590f6ffbd9d68360bad46Daniel Dunbar CmdArgs.push_back("-o"); 263911e1b40d759a643086f590f6ffbd9d68360bad46Daniel Dunbar CmdArgs.push_back("-"); 264011e1b40d759a643086f590f6ffbd9d68360bad46Daniel Dunbar } else if (Output.isFilename()) { 264111e1b40d759a643086f590f6ffbd9d68360bad46Daniel Dunbar CmdArgs.push_back("-o"); 264211e1b40d759a643086f590f6ffbd9d68360bad46Daniel Dunbar CmdArgs.push_back(Output.getFilename()); 264311e1b40d759a643086f590f6ffbd9d68360bad46Daniel Dunbar } else { 264411e1b40d759a643086f590f6ffbd9d68360bad46Daniel Dunbar assert(Output.isNothing() && "Invalid output."); 264511e1b40d759a643086f590f6ffbd9d68360bad46Daniel Dunbar } 264611e1b40d759a643086f590f6ffbd9d68360bad46Daniel Dunbar 264711e1b40d759a643086f590f6ffbd9d68360bad46Daniel Dunbar if (!Args.hasArg(options::OPT_nostdlib) && 264811e1b40d759a643086f590f6ffbd9d68360bad46Daniel Dunbar !Args.hasArg(options::OPT_nostartfiles)) { 264911e1b40d759a643086f590f6ffbd9d68360bad46Daniel Dunbar if (!Args.hasArg(options::OPT_shared)) { 26505ed34f4c58b6ad4e21038d713c1fae31a6146ff5Daniel Dunbar CmdArgs.push_back(Args.MakeArgString(getToolChain().GetFilePath(C, "crt1.o"))); 26515ed34f4c58b6ad4e21038d713c1fae31a6146ff5Daniel Dunbar CmdArgs.push_back(Args.MakeArgString(getToolChain().GetFilePath(C, "crti.o"))); 26525ed34f4c58b6ad4e21038d713c1fae31a6146ff5Daniel Dunbar CmdArgs.push_back(Args.MakeArgString(getToolChain().GetFilePath(C, "crtbegin.o"))); 265311e1b40d759a643086f590f6ffbd9d68360bad46Daniel Dunbar } else { 26545ed34f4c58b6ad4e21038d713c1fae31a6146ff5Daniel Dunbar CmdArgs.push_back(Args.MakeArgString(getToolChain().GetFilePath(C, "crti.o"))); 26555ed34f4c58b6ad4e21038d713c1fae31a6146ff5Daniel Dunbar CmdArgs.push_back(Args.MakeArgString(getToolChain().GetFilePath(C, "crtbeginS.o"))); 265611e1b40d759a643086f590f6ffbd9d68360bad46Daniel Dunbar } 265711e1b40d759a643086f590f6ffbd9d68360bad46Daniel Dunbar } 265811e1b40d759a643086f590f6ffbd9d68360bad46Daniel Dunbar 265911e1b40d759a643086f590f6ffbd9d68360bad46Daniel Dunbar Args.AddAllArgs(CmdArgs, options::OPT_L); 266011e1b40d759a643086f590f6ffbd9d68360bad46Daniel Dunbar Args.AddAllArgs(CmdArgs, options::OPT_T_Group); 266111e1b40d759a643086f590f6ffbd9d68360bad46Daniel Dunbar Args.AddAllArgs(CmdArgs, options::OPT_e); 266211e1b40d759a643086f590f6ffbd9d68360bad46Daniel Dunbar 266311e1b40d759a643086f590f6ffbd9d68360bad46Daniel Dunbar for (InputInfoList::const_iterator 266411e1b40d759a643086f590f6ffbd9d68360bad46Daniel Dunbar it = Inputs.begin(), ie = Inputs.end(); it != ie; ++it) { 266511e1b40d759a643086f590f6ffbd9d68360bad46Daniel Dunbar const InputInfo &II = *it; 2666a8304f67291b0182fb64f3afc621615288dd1d31Daniel Dunbar 2667a8304f67291b0182fb64f3afc621615288dd1d31Daniel Dunbar // Don't try to pass LLVM inputs to a generic gcc. 2668a8304f67291b0182fb64f3afc621615288dd1d31Daniel Dunbar if (II.getType() == types::TY_LLVMBC) 2669a8304f67291b0182fb64f3afc621615288dd1d31Daniel Dunbar D.Diag(clang::diag::err_drv_no_linker_llvm_support) 2670881376467c46c5c6cc16fa6790271c2c22e1d4f1Daniel Dunbar << getToolChain().getTripleString(); 2671a8304f67291b0182fb64f3afc621615288dd1d31Daniel Dunbar 267211e1b40d759a643086f590f6ffbd9d68360bad46Daniel Dunbar if (II.isPipe()) 267311e1b40d759a643086f590f6ffbd9d68360bad46Daniel Dunbar CmdArgs.push_back("-"); 267411e1b40d759a643086f590f6ffbd9d68360bad46Daniel Dunbar else if (II.isFilename()) 267511e1b40d759a643086f590f6ffbd9d68360bad46Daniel Dunbar CmdArgs.push_back(II.getFilename()); 267611e1b40d759a643086f590f6ffbd9d68360bad46Daniel Dunbar else 267711e1b40d759a643086f590f6ffbd9d68360bad46Daniel Dunbar II.getInputArg().renderAsInput(Args, CmdArgs); 267811e1b40d759a643086f590f6ffbd9d68360bad46Daniel Dunbar } 267911e1b40d759a643086f590f6ffbd9d68360bad46Daniel Dunbar 268011e1b40d759a643086f590f6ffbd9d68360bad46Daniel Dunbar if (!Args.hasArg(options::OPT_nostdlib) && 268111e1b40d759a643086f590f6ffbd9d68360bad46Daniel Dunbar !Args.hasArg(options::OPT_nodefaultlibs)) { 268211e1b40d759a643086f590f6ffbd9d68360bad46Daniel Dunbar // FIXME: GCC passes on -lgcc, -lgcc_pic and a whole lot of 268311e1b40d759a643086f590f6ffbd9d68360bad46Daniel Dunbar // rpaths 268411e1b40d759a643086f590f6ffbd9d68360bad46Daniel Dunbar CmdArgs.push_back("-L/usr/lib/gcc41"); 268511e1b40d759a643086f590f6ffbd9d68360bad46Daniel Dunbar 268611e1b40d759a643086f590f6ffbd9d68360bad46Daniel Dunbar if (!Args.hasArg(options::OPT_static)) { 268711e1b40d759a643086f590f6ffbd9d68360bad46Daniel Dunbar CmdArgs.push_back("-rpath"); 268811e1b40d759a643086f590f6ffbd9d68360bad46Daniel Dunbar CmdArgs.push_back("/usr/lib/gcc41"); 268911e1b40d759a643086f590f6ffbd9d68360bad46Daniel Dunbar 269011e1b40d759a643086f590f6ffbd9d68360bad46Daniel Dunbar CmdArgs.push_back("-rpath-link"); 269111e1b40d759a643086f590f6ffbd9d68360bad46Daniel Dunbar CmdArgs.push_back("/usr/lib/gcc41"); 269211e1b40d759a643086f590f6ffbd9d68360bad46Daniel Dunbar 269311e1b40d759a643086f590f6ffbd9d68360bad46Daniel Dunbar CmdArgs.push_back("-rpath"); 269411e1b40d759a643086f590f6ffbd9d68360bad46Daniel Dunbar CmdArgs.push_back("/usr/lib"); 269511e1b40d759a643086f590f6ffbd9d68360bad46Daniel Dunbar 269611e1b40d759a643086f590f6ffbd9d68360bad46Daniel Dunbar CmdArgs.push_back("-rpath-link"); 269711e1b40d759a643086f590f6ffbd9d68360bad46Daniel Dunbar CmdArgs.push_back("/usr/lib"); 269811e1b40d759a643086f590f6ffbd9d68360bad46Daniel Dunbar } 269911e1b40d759a643086f590f6ffbd9d68360bad46Daniel Dunbar 270011e1b40d759a643086f590f6ffbd9d68360bad46Daniel Dunbar if (Args.hasArg(options::OPT_shared)) { 270111e1b40d759a643086f590f6ffbd9d68360bad46Daniel Dunbar CmdArgs.push_back("-lgcc_pic"); 270211e1b40d759a643086f590f6ffbd9d68360bad46Daniel Dunbar } else { 270311e1b40d759a643086f590f6ffbd9d68360bad46Daniel Dunbar CmdArgs.push_back("-lgcc"); 270411e1b40d759a643086f590f6ffbd9d68360bad46Daniel Dunbar } 270511e1b40d759a643086f590f6ffbd9d68360bad46Daniel Dunbar 270611e1b40d759a643086f590f6ffbd9d68360bad46Daniel Dunbar 270711e1b40d759a643086f590f6ffbd9d68360bad46Daniel Dunbar if (Args.hasArg(options::OPT_pthread)) 270811e1b40d759a643086f590f6ffbd9d68360bad46Daniel Dunbar CmdArgs.push_back("-lthread_xu"); 270911e1b40d759a643086f590f6ffbd9d68360bad46Daniel Dunbar 271011e1b40d759a643086f590f6ffbd9d68360bad46Daniel Dunbar if (!Args.hasArg(options::OPT_nolibc)) { 271111e1b40d759a643086f590f6ffbd9d68360bad46Daniel Dunbar CmdArgs.push_back("-lc"); 271211e1b40d759a643086f590f6ffbd9d68360bad46Daniel Dunbar } 271311e1b40d759a643086f590f6ffbd9d68360bad46Daniel Dunbar 271411e1b40d759a643086f590f6ffbd9d68360bad46Daniel Dunbar if (Args.hasArg(options::OPT_shared)) { 271511e1b40d759a643086f590f6ffbd9d68360bad46Daniel Dunbar CmdArgs.push_back("-lgcc_pic"); 271611e1b40d759a643086f590f6ffbd9d68360bad46Daniel Dunbar } else { 271711e1b40d759a643086f590f6ffbd9d68360bad46Daniel Dunbar CmdArgs.push_back("-lgcc"); 271811e1b40d759a643086f590f6ffbd9d68360bad46Daniel Dunbar } 271911e1b40d759a643086f590f6ffbd9d68360bad46Daniel Dunbar } 272011e1b40d759a643086f590f6ffbd9d68360bad46Daniel Dunbar 272111e1b40d759a643086f590f6ffbd9d68360bad46Daniel Dunbar if (!Args.hasArg(options::OPT_nostdlib) && 272211e1b40d759a643086f590f6ffbd9d68360bad46Daniel Dunbar !Args.hasArg(options::OPT_nostartfiles)) { 272311e1b40d759a643086f590f6ffbd9d68360bad46Daniel Dunbar if (!Args.hasArg(options::OPT_shared)) 27245ed34f4c58b6ad4e21038d713c1fae31a6146ff5Daniel Dunbar CmdArgs.push_back(Args.MakeArgString(getToolChain().GetFilePath(C, "crtend.o"))); 272511e1b40d759a643086f590f6ffbd9d68360bad46Daniel Dunbar else 27265ed34f4c58b6ad4e21038d713c1fae31a6146ff5Daniel Dunbar CmdArgs.push_back(Args.MakeArgString(getToolChain().GetFilePath(C, "crtendS.o"))); 27275ed34f4c58b6ad4e21038d713c1fae31a6146ff5Daniel Dunbar CmdArgs.push_back(Args.MakeArgString(getToolChain().GetFilePath(C, "crtn.o"))); 272811e1b40d759a643086f590f6ffbd9d68360bad46Daniel Dunbar } 272911e1b40d759a643086f590f6ffbd9d68360bad46Daniel Dunbar 273011e1b40d759a643086f590f6ffbd9d68360bad46Daniel Dunbar const char *Exec = 27315ed34f4c58b6ad4e21038d713c1fae31a6146ff5Daniel Dunbar Args.MakeArgString(getToolChain().GetProgramPath(C, "ld")); 2732cae087e164e94e4286c11bf694dd0ff88f295302Daniel Dunbar Dest.addCommand(new Command(JA, Exec, CmdArgs)); 273311e1b40d759a643086f590f6ffbd9d68360bad46Daniel Dunbar} 2734