Tools.cpp revision 95a0da7b263777e6f97e5a08b6eb893681a234ba
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 24871adcf4e41285e3f4c3b62eaa1b2e05b60b92daDaniel Dunbar#include "llvm/ADT/SmallVector.h" 2502633b541b04ad5ffc1c70f4c2feeeb13e607057Daniel Dunbar#include "llvm/Support/Format.h" 2602633b541b04ad5ffc1c70f4c2feeeb13e607057Daniel Dunbar#include "llvm/Support/raw_ostream.h" 27871adcf4e41285e3f4c3b62eaa1b2e05b60b92daDaniel Dunbar 28871adcf4e41285e3f4c3b62eaa1b2e05b60b92daDaniel Dunbar#include "InputInfo.h" 2902633b541b04ad5ffc1c70f4c2feeeb13e607057Daniel Dunbar#include "ToolChains.h" 30871adcf4e41285e3f4c3b62eaa1b2e05b60b92daDaniel Dunbar 3147ac7d27c44bd64a7d0fc03d4babc196cf2b8230Daniel Dunbarusing namespace clang::driver; 3247ac7d27c44bd64a7d0fc03d4babc196cf2b8230Daniel Dunbarusing namespace clang::driver::tools; 3347ac7d27c44bd64a7d0fc03d4babc196cf2b8230Daniel Dunbar 34868bd0aa9281929ef50d2e9a8c82a036906f53f5Daniel Dunbarstatic const char *MakeFormattedString(const ArgList &Args, 35868bd0aa9281929ef50d2e9a8c82a036906f53f5Daniel Dunbar const llvm::format_object_base &Fmt) { 36868bd0aa9281929ef50d2e9a8c82a036906f53f5Daniel Dunbar std::string Str; 37868bd0aa9281929ef50d2e9a8c82a036906f53f5Daniel Dunbar llvm::raw_string_ostream(Str) << Fmt; 38868bd0aa9281929ef50d2e9a8c82a036906f53f5Daniel Dunbar return Args.MakeArgString(Str.c_str()); 39868bd0aa9281929ef50d2e9a8c82a036906f53f5Daniel Dunbar} 40868bd0aa9281929ef50d2e9a8c82a036906f53f5Daniel Dunbar 41df91ef3d6c55692a0236f67b6c6b134a3bf84098Douglas Gregorvoid Clang::AddPreprocessingOptions(const Driver &D, 42df91ef3d6c55692a0236f67b6c6b134a3bf84098Douglas Gregor const ArgList &Args, 43c21c485b4fb58ef5d55cf3e523263dd824a2ace4Daniel Dunbar ArgStringList &CmdArgs, 44c21c485b4fb58ef5d55cf3e523263dd824a2ace4Daniel Dunbar const InputInfo &Output, 45c21c485b4fb58ef5d55cf3e523263dd824a2ace4Daniel Dunbar const InputInfoList &Inputs) const { 46c21c485b4fb58ef5d55cf3e523263dd824a2ace4Daniel Dunbar // Handle dependency file generation. 47c21c485b4fb58ef5d55cf3e523263dd824a2ace4Daniel Dunbar Arg *A; 48c21c485b4fb58ef5d55cf3e523263dd824a2ace4Daniel Dunbar if ((A = Args.getLastArg(options::OPT_M)) || 49c21c485b4fb58ef5d55cf3e523263dd824a2ace4Daniel Dunbar (A = Args.getLastArg(options::OPT_MM)) || 50c21c485b4fb58ef5d55cf3e523263dd824a2ace4Daniel Dunbar (A = Args.getLastArg(options::OPT_MD)) || 51c21c485b4fb58ef5d55cf3e523263dd824a2ace4Daniel Dunbar (A = Args.getLastArg(options::OPT_MMD))) { 52c21c485b4fb58ef5d55cf3e523263dd824a2ace4Daniel Dunbar // Determine the output location. 53c21c485b4fb58ef5d55cf3e523263dd824a2ace4Daniel Dunbar const char *DepFile; 54c21c485b4fb58ef5d55cf3e523263dd824a2ace4Daniel Dunbar if (Output.getType() == types::TY_Dependencies) { 55c21c485b4fb58ef5d55cf3e523263dd824a2ace4Daniel Dunbar if (Output.isPipe()) 56c21c485b4fb58ef5d55cf3e523263dd824a2ace4Daniel Dunbar DepFile = "-"; 57c21c485b4fb58ef5d55cf3e523263dd824a2ace4Daniel Dunbar else 58c21c485b4fb58ef5d55cf3e523263dd824a2ace4Daniel Dunbar DepFile = Output.getFilename(); 59c21c485b4fb58ef5d55cf3e523263dd824a2ace4Daniel Dunbar } else if (Arg *MF = Args.getLastArg(options::OPT_MF)) { 60c21c485b4fb58ef5d55cf3e523263dd824a2ace4Daniel Dunbar DepFile = MF->getValue(Args); 61c21c485b4fb58ef5d55cf3e523263dd824a2ace4Daniel Dunbar } else if (A->getOption().getId() == options::OPT_M || 62c21c485b4fb58ef5d55cf3e523263dd824a2ace4Daniel Dunbar A->getOption().getId() == options::OPT_MM) { 63c21c485b4fb58ef5d55cf3e523263dd824a2ace4Daniel Dunbar DepFile = "-"; 64c21c485b4fb58ef5d55cf3e523263dd824a2ace4Daniel Dunbar } else { 65c21c485b4fb58ef5d55cf3e523263dd824a2ace4Daniel Dunbar DepFile = darwin::CC1::getDependencyFileName(Args, Inputs); 66c21c485b4fb58ef5d55cf3e523263dd824a2ace4Daniel Dunbar } 67c21c485b4fb58ef5d55cf3e523263dd824a2ace4Daniel Dunbar CmdArgs.push_back("-dependency-file"); 68c21c485b4fb58ef5d55cf3e523263dd824a2ace4Daniel Dunbar CmdArgs.push_back(DepFile); 69c21c485b4fb58ef5d55cf3e523263dd824a2ace4Daniel Dunbar 70c21c485b4fb58ef5d55cf3e523263dd824a2ace4Daniel Dunbar // Add an -MT option if the user didn't specify their own. 71c21c485b4fb58ef5d55cf3e523263dd824a2ace4Daniel Dunbar // FIXME: This should use -MQ, when we support it. 72c21c485b4fb58ef5d55cf3e523263dd824a2ace4Daniel Dunbar if (!Args.hasArg(options::OPT_MT) && !Args.hasArg(options::OPT_MQ)) { 73c21c485b4fb58ef5d55cf3e523263dd824a2ace4Daniel Dunbar const char *DepTarget; 74c21c485b4fb58ef5d55cf3e523263dd824a2ace4Daniel Dunbar 75c21c485b4fb58ef5d55cf3e523263dd824a2ace4Daniel Dunbar // If user provided -o, that is the dependency target, except 76c21c485b4fb58ef5d55cf3e523263dd824a2ace4Daniel Dunbar // when we are only generating a dependency file. 77c21c485b4fb58ef5d55cf3e523263dd824a2ace4Daniel Dunbar Arg *OutputOpt = Args.getLastArg(options::OPT_o); 78c21c485b4fb58ef5d55cf3e523263dd824a2ace4Daniel Dunbar if (OutputOpt && Output.getType() != types::TY_Dependencies) { 79c21c485b4fb58ef5d55cf3e523263dd824a2ace4Daniel Dunbar DepTarget = OutputOpt->getValue(Args); 80c21c485b4fb58ef5d55cf3e523263dd824a2ace4Daniel Dunbar } else { 81c21c485b4fb58ef5d55cf3e523263dd824a2ace4Daniel Dunbar // Otherwise derive from the base input. 82c21c485b4fb58ef5d55cf3e523263dd824a2ace4Daniel Dunbar // 83c21c485b4fb58ef5d55cf3e523263dd824a2ace4Daniel Dunbar // FIXME: This should use the computed output file location. 84c21c485b4fb58ef5d55cf3e523263dd824a2ace4Daniel Dunbar llvm::sys::Path P(Inputs[0].getBaseInput()); 85c21c485b4fb58ef5d55cf3e523263dd824a2ace4Daniel Dunbar 86c21c485b4fb58ef5d55cf3e523263dd824a2ace4Daniel Dunbar P.eraseSuffix(); 87c21c485b4fb58ef5d55cf3e523263dd824a2ace4Daniel Dunbar P.appendSuffix("o"); 88c21c485b4fb58ef5d55cf3e523263dd824a2ace4Daniel Dunbar DepTarget = Args.MakeArgString(P.getLast().c_str()); 89c21c485b4fb58ef5d55cf3e523263dd824a2ace4Daniel Dunbar } 90c21c485b4fb58ef5d55cf3e523263dd824a2ace4Daniel Dunbar 91c21c485b4fb58ef5d55cf3e523263dd824a2ace4Daniel Dunbar CmdArgs.push_back("-MT"); 92c21c485b4fb58ef5d55cf3e523263dd824a2ace4Daniel Dunbar CmdArgs.push_back(DepTarget); 93c21c485b4fb58ef5d55cf3e523263dd824a2ace4Daniel Dunbar } 94c21c485b4fb58ef5d55cf3e523263dd824a2ace4Daniel Dunbar 95c21c485b4fb58ef5d55cf3e523263dd824a2ace4Daniel Dunbar if (A->getOption().getId() == options::OPT_M || 96c21c485b4fb58ef5d55cf3e523263dd824a2ace4Daniel Dunbar A->getOption().getId() == options::OPT_MD) 97c21c485b4fb58ef5d55cf3e523263dd824a2ace4Daniel Dunbar CmdArgs.push_back("-sys-header-deps"); 98c21c485b4fb58ef5d55cf3e523263dd824a2ace4Daniel Dunbar } 99c21c485b4fb58ef5d55cf3e523263dd824a2ace4Daniel Dunbar 100c21c485b4fb58ef5d55cf3e523263dd824a2ace4Daniel Dunbar Args.AddLastArg(CmdArgs, options::OPT_MP); 101c21c485b4fb58ef5d55cf3e523263dd824a2ace4Daniel Dunbar Args.AddAllArgs(CmdArgs, options::OPT_MT); 102c21c485b4fb58ef5d55cf3e523263dd824a2ace4Daniel Dunbar 103c21c485b4fb58ef5d55cf3e523263dd824a2ace4Daniel Dunbar // FIXME: Use iterator. 104c21c485b4fb58ef5d55cf3e523263dd824a2ace4Daniel Dunbar 105df91ef3d6c55692a0236f67b6c6b134a3bf84098Douglas Gregor // Add -i* options, and automatically translate to 106df91ef3d6c55692a0236f67b6c6b134a3bf84098Douglas Gregor // -include-pch/-include-pth for transparent PCH support. It's 107df91ef3d6c55692a0236f67b6c6b134a3bf84098Douglas Gregor // wonky, but we include looking for .gch so we can support seamless 108df91ef3d6c55692a0236f67b6c6b134a3bf84098Douglas Gregor // replacement into a build system already set up to be generating 109df91ef3d6c55692a0236f67b6c6b134a3bf84098Douglas Gregor // .gch files. 110c21c485b4fb58ef5d55cf3e523263dd824a2ace4Daniel Dunbar for (ArgList::const_iterator 111c21c485b4fb58ef5d55cf3e523263dd824a2ace4Daniel Dunbar it = Args.begin(), ie = Args.end(); it != ie; ++it) { 112c21c485b4fb58ef5d55cf3e523263dd824a2ace4Daniel Dunbar const Arg *A = *it; 113c21c485b4fb58ef5d55cf3e523263dd824a2ace4Daniel Dunbar if (!A->getOption().matches(options::OPT_clang_i_Group)) 114c21c485b4fb58ef5d55cf3e523263dd824a2ace4Daniel Dunbar continue; 115c21c485b4fb58ef5d55cf3e523263dd824a2ace4Daniel Dunbar 116c21c485b4fb58ef5d55cf3e523263dd824a2ace4Daniel Dunbar if (A->getOption().matches(options::OPT_include)) { 117c21c485b4fb58ef5d55cf3e523263dd824a2ace4Daniel Dunbar bool FoundPTH = false; 118df91ef3d6c55692a0236f67b6c6b134a3bf84098Douglas Gregor bool FoundPCH = false; 119c21c485b4fb58ef5d55cf3e523263dd824a2ace4Daniel Dunbar llvm::sys::Path P(A->getValue(Args)); 120df91ef3d6c55692a0236f67b6c6b134a3bf84098Douglas Gregor if (D.CCCUsePCH) { 121df91ef3d6c55692a0236f67b6c6b134a3bf84098Douglas Gregor P.appendSuffix("pch"); 122c21c485b4fb58ef5d55cf3e523263dd824a2ace4Daniel Dunbar if (P.exists()) 123df91ef3d6c55692a0236f67b6c6b134a3bf84098Douglas Gregor FoundPCH = true; 124df91ef3d6c55692a0236f67b6c6b134a3bf84098Douglas Gregor else 125df91ef3d6c55692a0236f67b6c6b134a3bf84098Douglas Gregor P.eraseSuffix(); 126df91ef3d6c55692a0236f67b6c6b134a3bf84098Douglas Gregor } 127df91ef3d6c55692a0236f67b6c6b134a3bf84098Douglas Gregor 128df91ef3d6c55692a0236f67b6c6b134a3bf84098Douglas Gregor if (!FoundPCH) { 129df91ef3d6c55692a0236f67b6c6b134a3bf84098Douglas Gregor P.appendSuffix("pth"); 130df91ef3d6c55692a0236f67b6c6b134a3bf84098Douglas Gregor if (P.exists()) 131c21c485b4fb58ef5d55cf3e523263dd824a2ace4Daniel Dunbar FoundPTH = true; 132df91ef3d6c55692a0236f67b6c6b134a3bf84098Douglas Gregor else 133df91ef3d6c55692a0236f67b6c6b134a3bf84098Douglas Gregor P.eraseSuffix(); 134df91ef3d6c55692a0236f67b6c6b134a3bf84098Douglas Gregor } 135df91ef3d6c55692a0236f67b6c6b134a3bf84098Douglas Gregor 136df91ef3d6c55692a0236f67b6c6b134a3bf84098Douglas Gregor if (!FoundPCH && !FoundPTH) { 137df91ef3d6c55692a0236f67b6c6b134a3bf84098Douglas Gregor P.appendSuffix("gch"); 138df91ef3d6c55692a0236f67b6c6b134a3bf84098Douglas Gregor if (P.exists()) { 139df91ef3d6c55692a0236f67b6c6b134a3bf84098Douglas Gregor FoundPCH = D.CCCUsePCH; 140df91ef3d6c55692a0236f67b6c6b134a3bf84098Douglas Gregor FoundPTH = !D.CCCUsePCH; 141df91ef3d6c55692a0236f67b6c6b134a3bf84098Douglas Gregor } 142df91ef3d6c55692a0236f67b6c6b134a3bf84098Douglas Gregor else 143df91ef3d6c55692a0236f67b6c6b134a3bf84098Douglas Gregor P.eraseSuffix(); 144c21c485b4fb58ef5d55cf3e523263dd824a2ace4Daniel Dunbar } 145c21c485b4fb58ef5d55cf3e523263dd824a2ace4Daniel Dunbar 146df91ef3d6c55692a0236f67b6c6b134a3bf84098Douglas Gregor if (FoundPCH || FoundPTH) { 147c21c485b4fb58ef5d55cf3e523263dd824a2ace4Daniel Dunbar A->claim(); 148ea71a5b388bc5bf91cb81ef004d0dd7f011af512Daniel Dunbar if (D.CCCUsePCH) 149df91ef3d6c55692a0236f67b6c6b134a3bf84098Douglas Gregor CmdArgs.push_back("-include-pch"); 150df91ef3d6c55692a0236f67b6c6b134a3bf84098Douglas Gregor else 151df91ef3d6c55692a0236f67b6c6b134a3bf84098Douglas Gregor CmdArgs.push_back("-include-pth"); 152c21c485b4fb58ef5d55cf3e523263dd824a2ace4Daniel Dunbar CmdArgs.push_back(Args.MakeArgString(P.c_str())); 153c21c485b4fb58ef5d55cf3e523263dd824a2ace4Daniel Dunbar continue; 154c21c485b4fb58ef5d55cf3e523263dd824a2ace4Daniel Dunbar } 155c21c485b4fb58ef5d55cf3e523263dd824a2ace4Daniel Dunbar } 156c21c485b4fb58ef5d55cf3e523263dd824a2ace4Daniel Dunbar 157c21c485b4fb58ef5d55cf3e523263dd824a2ace4Daniel Dunbar // Not translated, render as usual. 158c21c485b4fb58ef5d55cf3e523263dd824a2ace4Daniel Dunbar A->claim(); 159c21c485b4fb58ef5d55cf3e523263dd824a2ace4Daniel Dunbar A->render(Args, CmdArgs); 160c21c485b4fb58ef5d55cf3e523263dd824a2ace4Daniel Dunbar } 161c21c485b4fb58ef5d55cf3e523263dd824a2ace4Daniel Dunbar 162c21c485b4fb58ef5d55cf3e523263dd824a2ace4Daniel Dunbar Args.AddAllArgs(CmdArgs, options::OPT_D, options::OPT_U); 163c21c485b4fb58ef5d55cf3e523263dd824a2ace4Daniel Dunbar Args.AddAllArgs(CmdArgs, options::OPT_I_Group, options::OPT_F); 164c21c485b4fb58ef5d55cf3e523263dd824a2ace4Daniel Dunbar 165c21c485b4fb58ef5d55cf3e523263dd824a2ace4Daniel Dunbar // Add -Wp, and -Xassembler if using the preprocessor. 166c21c485b4fb58ef5d55cf3e523263dd824a2ace4Daniel Dunbar 167c21c485b4fb58ef5d55cf3e523263dd824a2ace4Daniel Dunbar // FIXME: There is a very unfortunate problem here, some troubled 168c21c485b4fb58ef5d55cf3e523263dd824a2ace4Daniel Dunbar // souls abuse -Wp, to pass preprocessor options in gcc syntax. To 169c21c485b4fb58ef5d55cf3e523263dd824a2ace4Daniel Dunbar // really support that we would have to parse and then translate 170c21c485b4fb58ef5d55cf3e523263dd824a2ace4Daniel Dunbar // those options. :( 171c21c485b4fb58ef5d55cf3e523263dd824a2ace4Daniel Dunbar Args.AddAllArgValues(CmdArgs, options::OPT_Wp_COMMA, 172c21c485b4fb58ef5d55cf3e523263dd824a2ace4Daniel Dunbar options::OPT_Xpreprocessor); 173c21c485b4fb58ef5d55cf3e523263dd824a2ace4Daniel Dunbar} 174c21c485b4fb58ef5d55cf3e523263dd824a2ace4Daniel Dunbar 17547ac7d27c44bd64a7d0fc03d4babc196cf2b8230Daniel Dunbarvoid Clang::ConstructJob(Compilation &C, const JobAction &JA, 176871adcf4e41285e3f4c3b62eaa1b2e05b60b92daDaniel Dunbar Job &Dest, 177871adcf4e41285e3f4c3b62eaa1b2e05b60b92daDaniel Dunbar const InputInfo &Output, 17862cf601812e03dd9bc5df42b8ef06a0cdedc38bfDaniel Dunbar const InputInfoList &Inputs, 1791d46033f760ba5fd266ce59fe391fac473f04f52Daniel Dunbar const ArgList &Args, 18047ac7d27c44bd64a7d0fc03d4babc196cf2b8230Daniel Dunbar const char *LinkingOutput) const { 1815c1aaafbd6dd25a99ca1960e1c3c98aeefe9d728Daniel Dunbar const Driver &D = getToolChain().getHost().getDriver(); 182b488c1dac8e53206f07103d794a62a3f5012c0f4Daniel Dunbar ArgStringList CmdArgs; 183b488c1dac8e53206f07103d794a62a3f5012c0f4Daniel Dunbar 184077ba6a3ac3628afb0d3c460e81ce013bccbdbedDaniel Dunbar assert(Inputs.size() == 1 && "Unable to handle multiple inputs."); 185077ba6a3ac3628afb0d3c460e81ce013bccbdbedDaniel Dunbar 186af07f936b698575f2c91f1c1134c116f1ef0deddDaniel Dunbar CmdArgs.push_back("-triple"); 187c21c485b4fb58ef5d55cf3e523263dd824a2ace4Daniel Dunbar const char *TripleStr = 188af07f936b698575f2c91f1c1134c116f1ef0deddDaniel Dunbar Args.MakeArgString(getToolChain().getTripleString().c_str()); 189af07f936b698575f2c91f1c1134c116f1ef0deddDaniel Dunbar CmdArgs.push_back(TripleStr); 190af07f936b698575f2c91f1c1134c116f1ef0deddDaniel Dunbar 1911d46033f760ba5fd266ce59fe391fac473f04f52Daniel Dunbar if (isa<AnalyzeJobAction>(JA)) { 1921d46033f760ba5fd266ce59fe391fac473f04f52Daniel Dunbar assert(JA.getType() == types::TY_Plist && "Invalid output type."); 1931d46033f760ba5fd266ce59fe391fac473f04f52Daniel Dunbar CmdArgs.push_back("-analyze"); 1941d46033f760ba5fd266ce59fe391fac473f04f52Daniel Dunbar } else if (isa<PreprocessJobAction>(JA)) { 195cd8e4c44dd068956e9181381be3ee2d49a0fac52Daniel Dunbar if (Output.getType() == types::TY_Dependencies) 196cd8e4c44dd068956e9181381be3ee2d49a0fac52Daniel Dunbar CmdArgs.push_back("-Eonly"); 197cd8e4c44dd068956e9181381be3ee2d49a0fac52Daniel Dunbar else 198cd8e4c44dd068956e9181381be3ee2d49a0fac52Daniel Dunbar CmdArgs.push_back("-E"); 1991d46033f760ba5fd266ce59fe391fac473f04f52Daniel Dunbar } else if (isa<PrecompileJobAction>(JA)) { 200df91ef3d6c55692a0236f67b6c6b134a3bf84098Douglas Gregor if (D.CCCUsePCH) 201df91ef3d6c55692a0236f67b6c6b134a3bf84098Douglas Gregor CmdArgs.push_back("-emit-pch"); 202df91ef3d6c55692a0236f67b6c6b134a3bf84098Douglas Gregor else 203df91ef3d6c55692a0236f67b6c6b134a3bf84098Douglas Gregor CmdArgs.push_back("-emit-pth"); 2041d46033f760ba5fd266ce59fe391fac473f04f52Daniel Dunbar } else { 2051d46033f760ba5fd266ce59fe391fac473f04f52Daniel Dunbar assert(isa<CompileJobAction>(JA) && "Invalid action for clang tool."); 206c21c485b4fb58ef5d55cf3e523263dd824a2ace4Daniel Dunbar 2071d46033f760ba5fd266ce59fe391fac473f04f52Daniel Dunbar if (JA.getType() == types::TY_Nothing) { 2081d46033f760ba5fd266ce59fe391fac473f04f52Daniel Dunbar CmdArgs.push_back("-fsyntax-only"); 2091d46033f760ba5fd266ce59fe391fac473f04f52Daniel Dunbar } else if (JA.getType() == types::TY_LLVMAsm) { 2101d46033f760ba5fd266ce59fe391fac473f04f52Daniel Dunbar CmdArgs.push_back("-emit-llvm"); 2111d46033f760ba5fd266ce59fe391fac473f04f52Daniel Dunbar } else if (JA.getType() == types::TY_LLVMBC) { 2121d46033f760ba5fd266ce59fe391fac473f04f52Daniel Dunbar CmdArgs.push_back("-emit-llvm-bc"); 2131d46033f760ba5fd266ce59fe391fac473f04f52Daniel Dunbar } else if (JA.getType() == types::TY_PP_Asm) { 2141d46033f760ba5fd266ce59fe391fac473f04f52Daniel Dunbar CmdArgs.push_back("-S"); 2151d46033f760ba5fd266ce59fe391fac473f04f52Daniel Dunbar } 2161d46033f760ba5fd266ce59fe391fac473f04f52Daniel Dunbar } 2171d46033f760ba5fd266ce59fe391fac473f04f52Daniel Dunbar 2181d46033f760ba5fd266ce59fe391fac473f04f52Daniel Dunbar // The make clang go fast button. 2191d46033f760ba5fd266ce59fe391fac473f04f52Daniel Dunbar CmdArgs.push_back("-disable-free"); 2201d46033f760ba5fd266ce59fe391fac473f04f52Daniel Dunbar 221c9abc043af88f90d177a5bd147f627b78ca49fdeDaniel Dunbar // Set the main file name, so that debug info works even with 222c9abc043af88f90d177a5bd147f627b78ca49fdeDaniel Dunbar // -save-temps. 223c9abc043af88f90d177a5bd147f627b78ca49fdeDaniel Dunbar CmdArgs.push_back("-main-file-name"); 224c9abc043af88f90d177a5bd147f627b78ca49fdeDaniel Dunbar CmdArgs.push_back(darwin::CC1::getBaseInputName(Args, Inputs)); 225c9abc043af88f90d177a5bd147f627b78ca49fdeDaniel Dunbar 2263bbc75302fd43cf13d868b46c94ff8794b302e43Daniel Dunbar // Some flags which affect the language (via preprocessor 2273bbc75302fd43cf13d868b46c94ff8794b302e43Daniel Dunbar // defines). See darwin::CC1::AddCPPArgs. 2283bbc75302fd43cf13d868b46c94ff8794b302e43Daniel Dunbar if (Args.hasArg(options::OPT_static)) 2293bbc75302fd43cf13d868b46c94ff8794b302e43Daniel Dunbar CmdArgs.push_back("-static-define"); 2303bbc75302fd43cf13d868b46c94ff8794b302e43Daniel Dunbar 2311d46033f760ba5fd266ce59fe391fac473f04f52Daniel Dunbar if (isa<AnalyzeJobAction>(JA)) { 2321d46033f760ba5fd266ce59fe391fac473f04f52Daniel Dunbar // Add default argument set. 2331d46033f760ba5fd266ce59fe391fac473f04f52Daniel Dunbar // 2341d46033f760ba5fd266ce59fe391fac473f04f52Daniel Dunbar // FIXME: Move into clang? 2351d46033f760ba5fd266ce59fe391fac473f04f52Daniel Dunbar CmdArgs.push_back("-warn-dead-stores"); 2361d46033f760ba5fd266ce59fe391fac473f04f52Daniel Dunbar CmdArgs.push_back("-checker-cfref"); 2379b646dac1c05fbfbfb4db0cb88ea28e74fbe7b9aTed Kremenek CmdArgs.push_back("-analyzer-eagerly-assume"); 2381d46033f760ba5fd266ce59fe391fac473f04f52Daniel Dunbar CmdArgs.push_back("-warn-objc-methodsigs"); 2391d46033f760ba5fd266ce59fe391fac473f04f52Daniel Dunbar // Do not enable the missing -dealloc check. 2401d46033f760ba5fd266ce59fe391fac473f04f52Daniel Dunbar // '-warn-objc-missing-dealloc', 2411d46033f760ba5fd266ce59fe391fac473f04f52Daniel Dunbar CmdArgs.push_back("-warn-objc-unused-ivars"); 242c21c485b4fb58ef5d55cf3e523263dd824a2ace4Daniel Dunbar 2431d46033f760ba5fd266ce59fe391fac473f04f52Daniel Dunbar CmdArgs.push_back("-analyzer-output=plist"); 2441d46033f760ba5fd266ce59fe391fac473f04f52Daniel Dunbar 2451d46033f760ba5fd266ce59fe391fac473f04f52Daniel Dunbar // Add -Xanalyzer arguments when running as analyzer. 2461d46033f760ba5fd266ce59fe391fac473f04f52Daniel Dunbar Args.AddAllArgValues(CmdArgs, options::OPT_Xanalyzer); 247bc85be85779a47bae728bbe6a2cd2e3732b1333dDaniel Dunbar } 248bc85be85779a47bae728bbe6a2cd2e3732b1333dDaniel Dunbar 249bc85be85779a47bae728bbe6a2cd2e3732b1333dDaniel Dunbar // Perform argument translation for LLVM backend. This 250bc85be85779a47bae728bbe6a2cd2e3732b1333dDaniel Dunbar // takes some care in reconciling with llvm-gcc. The 251bc85be85779a47bae728bbe6a2cd2e3732b1333dDaniel Dunbar // issue is that llvm-gcc translates these options based on 252bc85be85779a47bae728bbe6a2cd2e3732b1333dDaniel Dunbar // the values in cc1, whereas we are processing based on 253bc85be85779a47bae728bbe6a2cd2e3732b1333dDaniel Dunbar // the driver arguments. 254bc85be85779a47bae728bbe6a2cd2e3732b1333dDaniel Dunbar // 255bc85be85779a47bae728bbe6a2cd2e3732b1333dDaniel Dunbar // FIXME: This is currently broken for -f flags when -fno 256bc85be85779a47bae728bbe6a2cd2e3732b1333dDaniel Dunbar // variants are present. 2579fd0b1f845a61e71dd8099f596532d34c519630aDaniel Dunbar 258bc85be85779a47bae728bbe6a2cd2e3732b1333dDaniel Dunbar // This comes from the default translation the driver + cc1 259bc85be85779a47bae728bbe6a2cd2e3732b1333dDaniel Dunbar // would do to enable flag_pic. 260bc85be85779a47bae728bbe6a2cd2e3732b1333dDaniel Dunbar // 261bc85be85779a47bae728bbe6a2cd2e3732b1333dDaniel Dunbar // FIXME: Centralize this code. 262bc85be85779a47bae728bbe6a2cd2e3732b1333dDaniel Dunbar bool PICEnabled = (Args.hasArg(options::OPT_fPIC) || 263bc85be85779a47bae728bbe6a2cd2e3732b1333dDaniel Dunbar Args.hasArg(options::OPT_fpic) || 264bc85be85779a47bae728bbe6a2cd2e3732b1333dDaniel Dunbar Args.hasArg(options::OPT_fPIE) || 265bc85be85779a47bae728bbe6a2cd2e3732b1333dDaniel Dunbar Args.hasArg(options::OPT_fpie)); 266bc85be85779a47bae728bbe6a2cd2e3732b1333dDaniel Dunbar bool PICDisabled = (Args.hasArg(options::OPT_mkernel) || 267bc85be85779a47bae728bbe6a2cd2e3732b1333dDaniel Dunbar Args.hasArg(options::OPT_static)); 268bc85be85779a47bae728bbe6a2cd2e3732b1333dDaniel Dunbar const char *Model = getToolChain().GetForcedPicModel(); 269bc85be85779a47bae728bbe6a2cd2e3732b1333dDaniel Dunbar if (!Model) { 270bc85be85779a47bae728bbe6a2cd2e3732b1333dDaniel Dunbar if (Args.hasArg(options::OPT_mdynamic_no_pic)) 271bc85be85779a47bae728bbe6a2cd2e3732b1333dDaniel Dunbar Model = "dynamic-no-pic"; 272bc85be85779a47bae728bbe6a2cd2e3732b1333dDaniel Dunbar else if (PICDisabled) 273bc85be85779a47bae728bbe6a2cd2e3732b1333dDaniel Dunbar Model = "static"; 274bc85be85779a47bae728bbe6a2cd2e3732b1333dDaniel Dunbar else if (PICEnabled) 275bc85be85779a47bae728bbe6a2cd2e3732b1333dDaniel Dunbar Model = "pic"; 2761d46033f760ba5fd266ce59fe391fac473f04f52Daniel Dunbar else 277bc85be85779a47bae728bbe6a2cd2e3732b1333dDaniel Dunbar Model = getToolChain().GetDefaultRelocationModel(); 278bc85be85779a47bae728bbe6a2cd2e3732b1333dDaniel Dunbar } 279bc85be85779a47bae728bbe6a2cd2e3732b1333dDaniel Dunbar CmdArgs.push_back("--relocation-model"); 280bc85be85779a47bae728bbe6a2cd2e3732b1333dDaniel Dunbar CmdArgs.push_back(Model); 2811d46033f760ba5fd266ce59fe391fac473f04f52Daniel Dunbar 282bc85be85779a47bae728bbe6a2cd2e3732b1333dDaniel Dunbar // Infer the __PIC__ value. 283bc85be85779a47bae728bbe6a2cd2e3732b1333dDaniel Dunbar // 284bc85be85779a47bae728bbe6a2cd2e3732b1333dDaniel Dunbar // FIXME: This isn't quite right on Darwin, which always sets 285bc85be85779a47bae728bbe6a2cd2e3732b1333dDaniel Dunbar // __PIC__=2. 286bc85be85779a47bae728bbe6a2cd2e3732b1333dDaniel Dunbar if (strcmp(Model, "pic") == 0 || strcmp(Model, "dynamic-no-pic") == 0) { 287bc85be85779a47bae728bbe6a2cd2e3732b1333dDaniel Dunbar if (Args.hasArg(options::OPT_fPIC)) 288bc85be85779a47bae728bbe6a2cd2e3732b1333dDaniel Dunbar CmdArgs.push_back("-pic-level=2"); 2891d46033f760ba5fd266ce59fe391fac473f04f52Daniel Dunbar else 290bc85be85779a47bae728bbe6a2cd2e3732b1333dDaniel Dunbar CmdArgs.push_back("-pic-level=1"); 291bc85be85779a47bae728bbe6a2cd2e3732b1333dDaniel Dunbar } 2921d46033f760ba5fd266ce59fe391fac473f04f52Daniel Dunbar 293bc85be85779a47bae728bbe6a2cd2e3732b1333dDaniel Dunbar if (Args.hasArg(options::OPT_ftime_report)) 294bc85be85779a47bae728bbe6a2cd2e3732b1333dDaniel Dunbar CmdArgs.push_back("--time-passes"); 295bc85be85779a47bae728bbe6a2cd2e3732b1333dDaniel Dunbar // FIXME: Set --enable-unsafe-fp-math. 296bc85be85779a47bae728bbe6a2cd2e3732b1333dDaniel Dunbar if (!Args.hasArg(options::OPT_fomit_frame_pointer)) 297bc85be85779a47bae728bbe6a2cd2e3732b1333dDaniel Dunbar CmdArgs.push_back("--disable-fp-elim"); 298bc85be85779a47bae728bbe6a2cd2e3732b1333dDaniel Dunbar if (!Args.hasFlag(options::OPT_fzero_initialized_in_bss, 299bc85be85779a47bae728bbe6a2cd2e3732b1333dDaniel Dunbar options::OPT_fno_zero_initialized_in_bss, 300bc85be85779a47bae728bbe6a2cd2e3732b1333dDaniel Dunbar true)) 301bc85be85779a47bae728bbe6a2cd2e3732b1333dDaniel Dunbar CmdArgs.push_back("--nozero-initialized-in-bss"); 302bc85be85779a47bae728bbe6a2cd2e3732b1333dDaniel Dunbar if (Args.hasArg(options::OPT_dA) || Args.hasArg(options::OPT_fverbose_asm)) 303bc85be85779a47bae728bbe6a2cd2e3732b1333dDaniel Dunbar CmdArgs.push_back("--asm-verbose"); 304bc85be85779a47bae728bbe6a2cd2e3732b1333dDaniel Dunbar if (Args.hasArg(options::OPT_fdebug_pass_structure)) 305bc85be85779a47bae728bbe6a2cd2e3732b1333dDaniel Dunbar CmdArgs.push_back("--debug-pass=Structure"); 306bc85be85779a47bae728bbe6a2cd2e3732b1333dDaniel Dunbar if (Args.hasArg(options::OPT_fdebug_pass_arguments)) 307bc85be85779a47bae728bbe6a2cd2e3732b1333dDaniel Dunbar CmdArgs.push_back("--debug-pass=Arguments"); 308bc85be85779a47bae728bbe6a2cd2e3732b1333dDaniel Dunbar // FIXME: set --inline-threshhold=50 if (optimize_size || optimize 309bc85be85779a47bae728bbe6a2cd2e3732b1333dDaniel Dunbar // < 3) 310bc85be85779a47bae728bbe6a2cd2e3732b1333dDaniel Dunbar if (Args.hasFlag(options::OPT_funwind_tables, 311bc85be85779a47bae728bbe6a2cd2e3732b1333dDaniel Dunbar options::OPT_fno_unwind_tables, 312bc85be85779a47bae728bbe6a2cd2e3732b1333dDaniel Dunbar (getToolChain().IsUnwindTablesDefault() && 313bc85be85779a47bae728bbe6a2cd2e3732b1333dDaniel Dunbar !Args.hasArg(options::OPT_mkernel)))) 314bc85be85779a47bae728bbe6a2cd2e3732b1333dDaniel Dunbar CmdArgs.push_back("--unwind-tables=1"); 315bc85be85779a47bae728bbe6a2cd2e3732b1333dDaniel Dunbar else 316bc85be85779a47bae728bbe6a2cd2e3732b1333dDaniel Dunbar CmdArgs.push_back("--unwind-tables=0"); 317bc85be85779a47bae728bbe6a2cd2e3732b1333dDaniel Dunbar if (!Args.hasFlag(options::OPT_mred_zone, 318bc85be85779a47bae728bbe6a2cd2e3732b1333dDaniel Dunbar options::OPT_mno_red_zone, 319bc85be85779a47bae728bbe6a2cd2e3732b1333dDaniel Dunbar true) || 320bc85be85779a47bae728bbe6a2cd2e3732b1333dDaniel Dunbar Args.hasArg(options::OPT_mkernel) || 321bc85be85779a47bae728bbe6a2cd2e3732b1333dDaniel Dunbar Args.hasArg(options::OPT_fapple_kext)) 322bc85be85779a47bae728bbe6a2cd2e3732b1333dDaniel Dunbar CmdArgs.push_back("--disable-red-zone"); 323bc85be85779a47bae728bbe6a2cd2e3732b1333dDaniel Dunbar if (Args.hasFlag(options::OPT_msoft_float, 324bc85be85779a47bae728bbe6a2cd2e3732b1333dDaniel Dunbar options::OPT_mno_soft_float, 325bc85be85779a47bae728bbe6a2cd2e3732b1333dDaniel Dunbar false)) 326bc85be85779a47bae728bbe6a2cd2e3732b1333dDaniel Dunbar CmdArgs.push_back("--soft-float"); 327bc85be85779a47bae728bbe6a2cd2e3732b1333dDaniel Dunbar 328868bd0aa9281929ef50d2e9a8c82a036906f53f5Daniel Dunbar // FIXME: Handle -mtune=. 329868bd0aa9281929ef50d2e9a8c82a036906f53f5Daniel Dunbar (void) Args.hasArg(options::OPT_mtune_EQ); 330bc85be85779a47bae728bbe6a2cd2e3732b1333dDaniel Dunbar 331868bd0aa9281929ef50d2e9a8c82a036906f53f5Daniel Dunbar if (const Arg *A = Args.getLastArg(options::OPT_march_EQ)) { 332868bd0aa9281929ef50d2e9a8c82a036906f53f5Daniel Dunbar // FIXME: We made need some translation here from the options gcc 333868bd0aa9281929ef50d2e9a8c82a036906f53f5Daniel Dunbar // takes to names the LLVM backend understand? 334868bd0aa9281929ef50d2e9a8c82a036906f53f5Daniel Dunbar CmdArgs.push_back("-mcpu"); 335868bd0aa9281929ef50d2e9a8c82a036906f53f5Daniel Dunbar CmdArgs.push_back(A->getValue(Args)); 336868bd0aa9281929ef50d2e9a8c82a036906f53f5Daniel Dunbar } else { 337868bd0aa9281929ef50d2e9a8c82a036906f53f5Daniel Dunbar // Select default CPU. 338868bd0aa9281929ef50d2e9a8c82a036906f53f5Daniel Dunbar 339868bd0aa9281929ef50d2e9a8c82a036906f53f5Daniel Dunbar // FIXME: Need target hooks. 340868bd0aa9281929ef50d2e9a8c82a036906f53f5Daniel Dunbar if (memcmp(getToolChain().getOS().c_str(), "darwin", 6) == 0) { 341868bd0aa9281929ef50d2e9a8c82a036906f53f5Daniel Dunbar if (getToolChain().getArchName() == "x86_64") 342868bd0aa9281929ef50d2e9a8c82a036906f53f5Daniel Dunbar CmdArgs.push_back("--mcpu=core2"); 343868bd0aa9281929ef50d2e9a8c82a036906f53f5Daniel Dunbar else if (getToolChain().getArchName() == "i386") 344500aec477c82660adda912c35b634006017933beDaniel Dunbar CmdArgs.push_back("--mcpu=yonah"); 345500aec477c82660adda912c35b634006017933beDaniel Dunbar } else { 346500aec477c82660adda912c35b634006017933beDaniel Dunbar if (getToolChain().getArchName() == "x86_64") 347500aec477c82660adda912c35b634006017933beDaniel Dunbar CmdArgs.push_back("--mcpu=x86-64"); 348500aec477c82660adda912c35b634006017933beDaniel Dunbar else if (getToolChain().getArchName() == "i386") 349868bd0aa9281929ef50d2e9a8c82a036906f53f5Daniel Dunbar CmdArgs.push_back("--mcpu=pentium4"); 3501d46033f760ba5fd266ce59fe391fac473f04f52Daniel Dunbar } 351bc85be85779a47bae728bbe6a2cd2e3732b1333dDaniel Dunbar } 352868bd0aa9281929ef50d2e9a8c82a036906f53f5Daniel Dunbar 353868bd0aa9281929ef50d2e9a8c82a036906f53f5Daniel Dunbar // FIXME: Use iterator. 354868bd0aa9281929ef50d2e9a8c82a036906f53f5Daniel Dunbar for (ArgList::const_iterator 355868bd0aa9281929ef50d2e9a8c82a036906f53f5Daniel Dunbar it = Args.begin(), ie = Args.end(); it != ie; ++it) { 356868bd0aa9281929ef50d2e9a8c82a036906f53f5Daniel Dunbar const Arg *A = *it; 357868bd0aa9281929ef50d2e9a8c82a036906f53f5Daniel Dunbar if (A->getOption().matches(options::OPT_m_x86_Features_Group)) { 358868bd0aa9281929ef50d2e9a8c82a036906f53f5Daniel Dunbar const char *Name = A->getOption().getName(); 359868bd0aa9281929ef50d2e9a8c82a036906f53f5Daniel Dunbar 360868bd0aa9281929ef50d2e9a8c82a036906f53f5Daniel Dunbar // Skip over "-m". 361868bd0aa9281929ef50d2e9a8c82a036906f53f5Daniel Dunbar assert(Name[0] == '-' && Name[1] == 'm' && "Invalid feature name."); 362868bd0aa9281929ef50d2e9a8c82a036906f53f5Daniel Dunbar Name += 2; 363868bd0aa9281929ef50d2e9a8c82a036906f53f5Daniel Dunbar 364868bd0aa9281929ef50d2e9a8c82a036906f53f5Daniel Dunbar bool IsNegative = memcmp(Name, "no-", 3) == 0; 365868bd0aa9281929ef50d2e9a8c82a036906f53f5Daniel Dunbar if (IsNegative) 366868bd0aa9281929ef50d2e9a8c82a036906f53f5Daniel Dunbar Name += 3; 367868bd0aa9281929ef50d2e9a8c82a036906f53f5Daniel Dunbar 368868bd0aa9281929ef50d2e9a8c82a036906f53f5Daniel Dunbar A->claim(); 369868bd0aa9281929ef50d2e9a8c82a036906f53f5Daniel Dunbar CmdArgs.push_back("-target-feature"); 370868bd0aa9281929ef50d2e9a8c82a036906f53f5Daniel Dunbar CmdArgs.push_back(MakeFormattedString(Args, 371868bd0aa9281929ef50d2e9a8c82a036906f53f5Daniel Dunbar llvm::format("%c%s", 372868bd0aa9281929ef50d2e9a8c82a036906f53f5Daniel Dunbar IsNegative ? '-' : '+', 373868bd0aa9281929ef50d2e9a8c82a036906f53f5Daniel Dunbar Name))); 374868bd0aa9281929ef50d2e9a8c82a036906f53f5Daniel Dunbar } 375bc85be85779a47bae728bbe6a2cd2e3732b1333dDaniel Dunbar } 376c21c485b4fb58ef5d55cf3e523263dd824a2ace4Daniel Dunbar 377bc85be85779a47bae728bbe6a2cd2e3732b1333dDaniel Dunbar if (Args.hasFlag(options::OPT_fmath_errno, 378bc85be85779a47bae728bbe6a2cd2e3732b1333dDaniel Dunbar options::OPT_fno_math_errno, 379bc85be85779a47bae728bbe6a2cd2e3732b1333dDaniel Dunbar getToolChain().IsMathErrnoDefault())) 380bc85be85779a47bae728bbe6a2cd2e3732b1333dDaniel Dunbar CmdArgs.push_back("--fmath-errno=1"); 381bc85be85779a47bae728bbe6a2cd2e3732b1333dDaniel Dunbar else 382bc85be85779a47bae728bbe6a2cd2e3732b1333dDaniel Dunbar CmdArgs.push_back("--fmath-errno=0"); 3831d46033f760ba5fd266ce59fe391fac473f04f52Daniel Dunbar 384bc85be85779a47bae728bbe6a2cd2e3732b1333dDaniel Dunbar if (Arg *A = Args.getLastArg(options::OPT_flimited_precision_EQ)) { 385bc85be85779a47bae728bbe6a2cd2e3732b1333dDaniel Dunbar CmdArgs.push_back("--limit-float-precision"); 386bc85be85779a47bae728bbe6a2cd2e3732b1333dDaniel Dunbar CmdArgs.push_back(A->getValue(Args)); 3871d46033f760ba5fd266ce59fe391fac473f04f52Daniel Dunbar } 3881d46033f760ba5fd266ce59fe391fac473f04f52Daniel Dunbar 389bc85be85779a47bae728bbe6a2cd2e3732b1333dDaniel Dunbar // FIXME: Add --stack-protector-buffer-size=<xxx> on 390bc85be85779a47bae728bbe6a2cd2e3732b1333dDaniel Dunbar // -fstack-protect. 391bc85be85779a47bae728bbe6a2cd2e3732b1333dDaniel Dunbar 392bc85be85779a47bae728bbe6a2cd2e3732b1333dDaniel Dunbar Arg *Unsupported; 393bc85be85779a47bae728bbe6a2cd2e3732b1333dDaniel Dunbar if ((Unsupported = Args.getLastArg(options::OPT_MG)) || 39495a0da7b263777e6f97e5a08b6eb893681a234baDaniel Dunbar (Unsupported = Args.getLastArg(options::OPT_MQ)) || 39595a0da7b263777e6f97e5a08b6eb893681a234baDaniel Dunbar (Unsupported = Args.getLastArg(options::OPT_iframework))) 396bc85be85779a47bae728bbe6a2cd2e3732b1333dDaniel Dunbar D.Diag(clang::diag::err_drv_unsupported_opt) 397bc85be85779a47bae728bbe6a2cd2e3732b1333dDaniel Dunbar << Unsupported->getOption().getName(); 398bc85be85779a47bae728bbe6a2cd2e3732b1333dDaniel Dunbar 3991d46033f760ba5fd266ce59fe391fac473f04f52Daniel Dunbar Args.AddAllArgs(CmdArgs, options::OPT_v); 4001d46033f760ba5fd266ce59fe391fac473f04f52Daniel Dunbar Args.AddLastArg(CmdArgs, options::OPT_P); 4012ac9fc2ad64e16127df8c60caeea2edfe9a400a2Daniel Dunbar Args.AddLastArg(CmdArgs, options::OPT_mmacosx_version_min_EQ); 402ff8857a9e6f533765f63b2934902645baa7ddd09Daniel Dunbar Args.AddLastArg(CmdArgs, options::OPT_miphoneos_version_min_EQ); 403448f5e6c191b40c90a67c48547df420d16f48b96Fariborz Jahanian Args.AddLastArg(CmdArgs, options::OPT_print_ivar_layout); 4041d46033f760ba5fd266ce59fe391fac473f04f52Daniel Dunbar 4051d46033f760ba5fd266ce59fe391fac473f04f52Daniel Dunbar // Special case debug options to only pass -g to clang. This is 4061d46033f760ba5fd266ce59fe391fac473f04f52Daniel Dunbar // wrong. 4071d46033f760ba5fd266ce59fe391fac473f04f52Daniel Dunbar if (Args.hasArg(options::OPT_g_Group)) 4081d46033f760ba5fd266ce59fe391fac473f04f52Daniel Dunbar CmdArgs.push_back("-g"); 4091d46033f760ba5fd266ce59fe391fac473f04f52Daniel Dunbar 4101d46033f760ba5fd266ce59fe391fac473f04f52Daniel Dunbar Args.AddLastArg(CmdArgs, options::OPT_nostdinc); 4111d46033f760ba5fd266ce59fe391fac473f04f52Daniel Dunbar 4122ac9fc2ad64e16127df8c60caeea2edfe9a400a2Daniel Dunbar Args.AddLastArg(CmdArgs, options::OPT_isysroot); 4132ac9fc2ad64e16127df8c60caeea2edfe9a400a2Daniel Dunbar 414c21c485b4fb58ef5d55cf3e523263dd824a2ace4Daniel Dunbar // Add preprocessing options like -I, -D, etc. if we are using the 415c21c485b4fb58ef5d55cf3e523263dd824a2ace4Daniel Dunbar // preprocessor. 416c21c485b4fb58ef5d55cf3e523263dd824a2ace4Daniel Dunbar // 417c21c485b4fb58ef5d55cf3e523263dd824a2ace4Daniel Dunbar // FIXME: Support -fpreprocessed 418c21c485b4fb58ef5d55cf3e523263dd824a2ace4Daniel Dunbar types::ID InputType = Inputs[0].getType(); 419c21c485b4fb58ef5d55cf3e523263dd824a2ace4Daniel Dunbar if (types::getPreprocessedType(InputType) != types::TY_INVALID) 420df91ef3d6c55692a0236f67b6c6b134a3bf84098Douglas Gregor AddPreprocessingOptions(D, Args, CmdArgs, Output, Inputs); 4211d46033f760ba5fd266ce59fe391fac473f04f52Daniel Dunbar 422337a6271b98c4c183f7eaad1563a75260b4f2871Daniel Dunbar // Manually translate -O to -O1 and -O4 to -O3; let clang reject 423337a6271b98c4c183f7eaad1563a75260b4f2871Daniel Dunbar // others. 424337a6271b98c4c183f7eaad1563a75260b4f2871Daniel Dunbar if (Arg *A = Args.getLastArg(options::OPT_O_Group)) { 425c21c485b4fb58ef5d55cf3e523263dd824a2ace4Daniel Dunbar if (A->getOption().getId() == options::OPT_O4) 426337a6271b98c4c183f7eaad1563a75260b4f2871Daniel Dunbar CmdArgs.push_back("-O3"); 427337a6271b98c4c183f7eaad1563a75260b4f2871Daniel Dunbar else if (A->getValue(Args)[0] == '\0') 4281d46033f760ba5fd266ce59fe391fac473f04f52Daniel Dunbar CmdArgs.push_back("-O1"); 4291d46033f760ba5fd266ce59fe391fac473f04f52Daniel Dunbar else 4305697aa0d75c87bafec78984048d558f8d12ca1b3Daniel Dunbar A->render(Args, CmdArgs); 4311d46033f760ba5fd266ce59fe391fac473f04f52Daniel Dunbar } 4321d46033f760ba5fd266ce59fe391fac473f04f52Daniel Dunbar 43306ef3c3e9be4923b8e29c8e267b0c56afaa14ff3Daniel Dunbar Args.AddAllArgs(CmdArgs, options::OPT_W_Group, options::OPT_pedantic_Group); 4341d46033f760ba5fd266ce59fe391fac473f04f52Daniel Dunbar Args.AddLastArg(CmdArgs, options::OPT_w); 435d573d26e1abcce24c31ece3d6f7af158db569e4cDaniel Dunbar 436d573d26e1abcce24c31ece3d6f7af158db569e4cDaniel Dunbar // Handle -{std, ansi, trigraphs} -- take the last of -{std, ansi} 437d573d26e1abcce24c31ece3d6f7af158db569e4cDaniel Dunbar // (-ansi is equivalent to -std=c89). 438d573d26e1abcce24c31ece3d6f7af158db569e4cDaniel Dunbar // 439d573d26e1abcce24c31ece3d6f7af158db569e4cDaniel Dunbar // If a std is supplied, only add -trigraphs if it follows the 440d573d26e1abcce24c31ece3d6f7af158db569e4cDaniel Dunbar // option. 441d573d26e1abcce24c31ece3d6f7af158db569e4cDaniel Dunbar if (Arg *Std = Args.getLastArg(options::OPT_std_EQ, options::OPT_ansi)) { 442d573d26e1abcce24c31ece3d6f7af158db569e4cDaniel Dunbar if (Std->getOption().matches(options::OPT_ansi)) 443d573d26e1abcce24c31ece3d6f7af158db569e4cDaniel Dunbar CmdArgs.push_back("-std=c89"); 444d573d26e1abcce24c31ece3d6f7af158db569e4cDaniel Dunbar else 445d573d26e1abcce24c31ece3d6f7af158db569e4cDaniel Dunbar Std->render(Args, CmdArgs); 446d573d26e1abcce24c31ece3d6f7af158db569e4cDaniel Dunbar 447d573d26e1abcce24c31ece3d6f7af158db569e4cDaniel Dunbar if (Arg *A = Args.getLastArg(options::OPT_trigraphs)) 448d573d26e1abcce24c31ece3d6f7af158db569e4cDaniel Dunbar if (A->getIndex() > Std->getIndex()) 449d573d26e1abcce24c31ece3d6f7af158db569e4cDaniel Dunbar A->render(Args, CmdArgs); 450a3ff202ee4fb21728e930d5d029ba4925129912cDaniel Dunbar } else { 451a3ff202ee4fb21728e930d5d029ba4925129912cDaniel Dunbar // Honor -std-default. 452a3ff202ee4fb21728e930d5d029ba4925129912cDaniel Dunbar Args.AddAllArgsTranslated(CmdArgs, options::OPT_std_default_EQ, 453a3ff202ee4fb21728e930d5d029ba4925129912cDaniel Dunbar "-std=", /*Joined=*/true); 454d573d26e1abcce24c31ece3d6f7af158db569e4cDaniel Dunbar Args.AddLastArg(CmdArgs, options::OPT_trigraphs); 455a3ff202ee4fb21728e930d5d029ba4925129912cDaniel Dunbar } 456c21c485b4fb58ef5d55cf3e523263dd824a2ace4Daniel Dunbar 4571d46033f760ba5fd266ce59fe391fac473f04f52Daniel Dunbar if (Arg *A = Args.getLastArg(options::OPT_ftemplate_depth_)) { 4581d46033f760ba5fd266ce59fe391fac473f04f52Daniel Dunbar CmdArgs.push_back("-ftemplate-depth"); 4591d46033f760ba5fd266ce59fe391fac473f04f52Daniel Dunbar CmdArgs.push_back(A->getValue(Args)); 460b488c1dac8e53206f07103d794a62a3f5012c0f4Daniel Dunbar } 461b488c1dac8e53206f07103d794a62a3f5012c0f4Daniel Dunbar 46248d1ef782c8c88066b5febf60f8f456064d7d3f0Daniel Dunbar // Forward -f options which we can pass directly. 4633aaf082689d3235937a2e56a60f90fc1b3aebfb2Daniel Dunbar Args.AddLastArg(CmdArgs, options::OPT_femit_all_decls); 4643aaf082689d3235937a2e56a60f90fc1b3aebfb2Daniel Dunbar Args.AddLastArg(CmdArgs, options::OPT_fexceptions); 4653aaf082689d3235937a2e56a60f90fc1b3aebfb2Daniel Dunbar Args.AddLastArg(CmdArgs, options::OPT_ffreestanding); 4663aaf082689d3235937a2e56a60f90fc1b3aebfb2Daniel Dunbar Args.AddLastArg(CmdArgs, options::OPT_fheinous_gnu_extensions); 4673aaf082689d3235937a2e56a60f90fc1b3aebfb2Daniel Dunbar Args.AddLastArg(CmdArgs, options::OPT_fgnu_runtime); 4683aaf082689d3235937a2e56a60f90fc1b3aebfb2Daniel Dunbar Args.AddLastArg(CmdArgs, options::OPT_flax_vector_conversions); 469fffd93f38340d4d2ca7ee78a8c91c890b2ff3fa0Douglas Gregor Args.AddLastArg(CmdArgs, options::OPT_fmessage_length_EQ); 4703aaf082689d3235937a2e56a60f90fc1b3aebfb2Daniel Dunbar Args.AddLastArg(CmdArgs, options::OPT_fms_extensions); 4713aaf082689d3235937a2e56a60f90fc1b3aebfb2Daniel Dunbar Args.AddLastArg(CmdArgs, options::OPT_fnext_runtime); 4723aaf082689d3235937a2e56a60f90fc1b3aebfb2Daniel Dunbar Args.AddLastArg(CmdArgs, options::OPT_fno_caret_diagnostics); 4733aaf082689d3235937a2e56a60f90fc1b3aebfb2Daniel Dunbar Args.AddLastArg(CmdArgs, options::OPT_fno_show_column); 4743aaf082689d3235937a2e56a60f90fc1b3aebfb2Daniel Dunbar Args.AddLastArg(CmdArgs, options::OPT_fobjc_gc_only); 4753aaf082689d3235937a2e56a60f90fc1b3aebfb2Daniel Dunbar Args.AddLastArg(CmdArgs, options::OPT_fobjc_gc); 4763aaf082689d3235937a2e56a60f90fc1b3aebfb2Daniel Dunbar // FIXME: Should we remove this? 4773aaf082689d3235937a2e56a60f90fc1b3aebfb2Daniel Dunbar Args.AddLastArg(CmdArgs, options::OPT_fobjc_nonfragile_abi); 478d6884a0b90091a063478ec7fa31f6d76c94e4917Daniel Dunbar Args.AddLastArg(CmdArgs, options::OPT_fobjc_tight_layout); 4793aaf082689d3235937a2e56a60f90fc1b3aebfb2Daniel Dunbar Args.AddLastArg(CmdArgs, options::OPT_fprint_source_range_info); 480182e09240a33c6f1d303deecabec6e0e9c9d109dChris Lattner Args.AddLastArg(CmdArgs, options::OPT_fdiagnostics_print_source_range_info); 4813aaf082689d3235937a2e56a60f90fc1b3aebfb2Daniel Dunbar Args.AddLastArg(CmdArgs, options::OPT_ftime_report); 4823aaf082689d3235937a2e56a60f90fc1b3aebfb2Daniel Dunbar Args.AddLastArg(CmdArgs, options::OPT_ftrapv); 4833aaf082689d3235937a2e56a60f90fc1b3aebfb2Daniel Dunbar Args.AddLastArg(CmdArgs, options::OPT_fvisibility_EQ); 4843aaf082689d3235937a2e56a60f90fc1b3aebfb2Daniel Dunbar Args.AddLastArg(CmdArgs, options::OPT_fwritable_strings); 4851d46033f760ba5fd266ce59fe391fac473f04f52Daniel Dunbar 48648d1ef782c8c88066b5febf60f8f456064d7d3f0Daniel Dunbar // Forward -f options with positive and negative forms; we translate 48748d1ef782c8c88066b5febf60f8f456064d7d3f0Daniel Dunbar // these by hand. 48848d1ef782c8c88066b5febf60f8f456064d7d3f0Daniel Dunbar 48948d1ef782c8c88066b5febf60f8f456064d7d3f0Daniel Dunbar // -fbuiltin is default, only pass non-default. 49048d1ef782c8c88066b5febf60f8f456064d7d3f0Daniel Dunbar if (!Args.hasFlag(options::OPT_fbuiltin, options::OPT_fno_builtin)) 49148d1ef782c8c88066b5febf60f8f456064d7d3f0Daniel Dunbar CmdArgs.push_back("-fbuiltin=0"); 49248d1ef782c8c88066b5febf60f8f456064d7d3f0Daniel Dunbar 4937695fba30221613b7cf31276456217c41bb90960Daniel Dunbar // -fblocks default varies depending on platform and language; only 4947695fba30221613b7cf31276456217c41bb90960Daniel Dunbar // pass if specified. 49548d1ef782c8c88066b5febf60f8f456064d7d3f0Daniel Dunbar if (Arg *A = Args.getLastArg(options::OPT_fblocks, options::OPT_fno_blocks)) { 49648d1ef782c8c88066b5febf60f8f456064d7d3f0Daniel Dunbar if (A->getOption().matches(options::OPT_fblocks)) 49748d1ef782c8c88066b5febf60f8f456064d7d3f0Daniel Dunbar CmdArgs.push_back("-fblocks"); 49848d1ef782c8c88066b5febf60f8f456064d7d3f0Daniel Dunbar else 49948d1ef782c8c88066b5febf60f8f456064d7d3f0Daniel Dunbar CmdArgs.push_back("-fblocks=0"); 50048d1ef782c8c88066b5febf60f8f456064d7d3f0Daniel Dunbar } 50148d1ef782c8c88066b5febf60f8f456064d7d3f0Daniel Dunbar 50282d00688525c876bf47bce414dedae9c343e67f5Daniel Dunbar // -fno-pascal-strings is default, only pass non-default. If the 50382d00688525c876bf47bce414dedae9c343e67f5Daniel Dunbar // -tool chain happened to translate to -mpascal-strings, we want to 50482d00688525c876bf47bce414dedae9c343e67f5Daniel Dunbar // -back translate here. 50582d00688525c876bf47bce414dedae9c343e67f5Daniel Dunbar // 50682d00688525c876bf47bce414dedae9c343e67f5Daniel Dunbar // FIXME: This is gross; that translation should be pulled from the 50782d00688525c876bf47bce414dedae9c343e67f5Daniel Dunbar // tool chain. 508c21c485b4fb58ef5d55cf3e523263dd824a2ace4Daniel Dunbar if (Args.hasFlag(options::OPT_fpascal_strings, 50982d00688525c876bf47bce414dedae9c343e67f5Daniel Dunbar options::OPT_fno_pascal_strings, 51082d00688525c876bf47bce414dedae9c343e67f5Daniel Dunbar false) || 51182d00688525c876bf47bce414dedae9c343e67f5Daniel Dunbar Args.hasFlag(options::OPT_mpascal_strings, 51282d00688525c876bf47bce414dedae9c343e67f5Daniel Dunbar options::OPT_mno_pascal_strings, 51382d00688525c876bf47bce414dedae9c343e67f5Daniel Dunbar false)) 51448d1ef782c8c88066b5febf60f8f456064d7d3f0Daniel Dunbar CmdArgs.push_back("-fpascal-strings"); 51548d1ef782c8c88066b5febf60f8f456064d7d3f0Daniel Dunbar 51648d1ef782c8c88066b5febf60f8f456064d7d3f0Daniel Dunbar // -fcommon is default, only pass non-default. 51748d1ef782c8c88066b5febf60f8f456064d7d3f0Daniel Dunbar if (!Args.hasFlag(options::OPT_fcommon, options::OPT_fno_common)) 51848d1ef782c8c88066b5febf60f8f456064d7d3f0Daniel Dunbar CmdArgs.push_back("-fno-common"); 51948d1ef782c8c88066b5febf60f8f456064d7d3f0Daniel Dunbar 52070d3c92820f590b10553da9c96eda24e4325ba34Daniel Dunbar // -fsigned-bitfields is default, and clang doesn't yet support 52170d3c92820f590b10553da9c96eda24e4325ba34Daniel Dunbar // --funsigned-bitfields. 52270d3c92820f590b10553da9c96eda24e4325ba34Daniel Dunbar if (!Args.hasFlag(options::OPT_fsigned_bitfields, 52370d3c92820f590b10553da9c96eda24e4325ba34Daniel Dunbar options::OPT_funsigned_bitfields)) 52470d3c92820f590b10553da9c96eda24e4325ba34Daniel Dunbar D.Diag(clang::diag::warn_drv_clang_unsupported) 52570d3c92820f590b10553da9c96eda24e4325ba34Daniel Dunbar << Args.getLastArg(options::OPT_funsigned_bitfields)->getAsString(Args); 52670d3c92820f590b10553da9c96eda24e4325ba34Daniel Dunbar 52749138fc59eeac2aacd3b7e04c2642180d5baefd7Daniel Dunbar // -fdiagnostics-fixit-info is default, only pass non-default. 52849138fc59eeac2aacd3b7e04c2642180d5baefd7Daniel Dunbar if (!Args.hasFlag(options::OPT_fdiagnostics_fixit_info, 52949138fc59eeac2aacd3b7e04c2642180d5baefd7Daniel Dunbar options::OPT_fno_diagnostics_fixit_info)) 53049138fc59eeac2aacd3b7e04c2642180d5baefd7Daniel Dunbar CmdArgs.push_back("-fno-diagnostics-fixit-info"); 53149138fc59eeac2aacd3b7e04c2642180d5baefd7Daniel Dunbar 5329e820ee054fefe5422b4db3f681e567a8976747eDaniel Dunbar // Enable -fdiagnostics-show-option by default. 5339e820ee054fefe5422b4db3f681e567a8976747eDaniel Dunbar if (Args.hasFlag(options::OPT_fdiagnostics_show_option, 5349e820ee054fefe5422b4db3f681e567a8976747eDaniel Dunbar options::OPT_fno_diagnostics_show_option)) 5359e820ee054fefe5422b4db3f681e567a8976747eDaniel Dunbar CmdArgs.push_back("-fdiagnostics-show-option"); 5369e820ee054fefe5422b4db3f681e567a8976747eDaniel Dunbar 5377695fba30221613b7cf31276456217c41bb90960Daniel Dunbar // -fdollars-in-identifiers default varies depending on platform and 5387695fba30221613b7cf31276456217c41bb90960Daniel Dunbar // language; only pass if specified. 5397695fba30221613b7cf31276456217c41bb90960Daniel Dunbar if (Arg *A = Args.getLastArg(options::OPT_fdollars_in_identifiers, 5407695fba30221613b7cf31276456217c41bb90960Daniel Dunbar options::OPT_fno_dollars_in_identifiers)) { 5417695fba30221613b7cf31276456217c41bb90960Daniel Dunbar if (A->getOption().matches(options::OPT_fdollars_in_identifiers)) 5427695fba30221613b7cf31276456217c41bb90960Daniel Dunbar CmdArgs.push_back("-fdollars-in-identifiers=1"); 5437695fba30221613b7cf31276456217c41bb90960Daniel Dunbar else 5447695fba30221613b7cf31276456217c41bb90960Daniel Dunbar CmdArgs.push_back("-fdollars-in-identifiers=0"); 5457695fba30221613b7cf31276456217c41bb90960Daniel Dunbar } 5467695fba30221613b7cf31276456217c41bb90960Daniel Dunbar 5471d46033f760ba5fd266ce59fe391fac473f04f52Daniel Dunbar Args.AddLastArg(CmdArgs, options::OPT_dM); 548d82df3ad430397d7f9ef511e7c5157f997c41f53Chris Lattner Args.AddLastArg(CmdArgs, options::OPT_dD); 5491d46033f760ba5fd266ce59fe391fac473f04f52Daniel Dunbar 5501d46033f760ba5fd266ce59fe391fac473f04f52Daniel Dunbar Args.AddAllArgValues(CmdArgs, options::OPT_Xclang); 5511d46033f760ba5fd266ce59fe391fac473f04f52Daniel Dunbar 552cd8e4c44dd068956e9181381be3ee2d49a0fac52Daniel Dunbar if (Output.getType() == types::TY_Dependencies) { 553cd8e4c44dd068956e9181381be3ee2d49a0fac52Daniel Dunbar // Handled with other dependency code. 554a5a7bd0de7b6b80212095195a055a4a43f21d4b2Daniel Dunbar } else if (Output.isPipe()) { 555b488c1dac8e53206f07103d794a62a3f5012c0f4Daniel Dunbar CmdArgs.push_back("-o"); 556b488c1dac8e53206f07103d794a62a3f5012c0f4Daniel Dunbar CmdArgs.push_back("-"); 557115a79277edababaf1b26e3654044ae983197679Daniel Dunbar } else if (Output.isFilename()) { 558b488c1dac8e53206f07103d794a62a3f5012c0f4Daniel Dunbar CmdArgs.push_back("-o"); 559115a79277edababaf1b26e3654044ae983197679Daniel Dunbar CmdArgs.push_back(Output.getFilename()); 560115a79277edababaf1b26e3654044ae983197679Daniel Dunbar } else { 561115a79277edababaf1b26e3654044ae983197679Daniel Dunbar assert(Output.isNothing() && "Invalid output."); 562b488c1dac8e53206f07103d794a62a3f5012c0f4Daniel Dunbar } 563b488c1dac8e53206f07103d794a62a3f5012c0f4Daniel Dunbar 5641d46033f760ba5fd266ce59fe391fac473f04f52Daniel Dunbar for (InputInfoList::const_iterator 5651d46033f760ba5fd266ce59fe391fac473f04f52Daniel Dunbar it = Inputs.begin(), ie = Inputs.end(); it != ie; ++it) { 5661d46033f760ba5fd266ce59fe391fac473f04f52Daniel Dunbar const InputInfo &II = *it; 5671d46033f760ba5fd266ce59fe391fac473f04f52Daniel Dunbar CmdArgs.push_back("-x"); 5681d46033f760ba5fd266ce59fe391fac473f04f52Daniel Dunbar CmdArgs.push_back(types::getTypeName(II.getType())); 5691d46033f760ba5fd266ce59fe391fac473f04f52Daniel Dunbar if (II.isPipe()) 5701d46033f760ba5fd266ce59fe391fac473f04f52Daniel Dunbar CmdArgs.push_back("-"); 571115a79277edababaf1b26e3654044ae983197679Daniel Dunbar else if (II.isFilename()) 572115a79277edababaf1b26e3654044ae983197679Daniel Dunbar CmdArgs.push_back(II.getFilename()); 5731d46033f760ba5fd266ce59fe391fac473f04f52Daniel Dunbar else 574115a79277edababaf1b26e3654044ae983197679Daniel Dunbar II.getInputArg().renderAsInput(Args, CmdArgs); 5751d46033f760ba5fd266ce59fe391fac473f04f52Daniel Dunbar } 576c21c485b4fb58ef5d55cf3e523263dd824a2ace4Daniel Dunbar 577c21c485b4fb58ef5d55cf3e523263dd824a2ace4Daniel Dunbar const char *Exec = 578d7d5f0223bd30dfd618762349c6209dd1d5ea3e6Daniel Dunbar Args.MakeArgString(getToolChain().GetProgramPath(C, "clang-cc").c_str()); 5791d46033f760ba5fd266ce59fe391fac473f04f52Daniel Dunbar Dest.addCommand(new Command(Exec, CmdArgs)); 580a880db0b0fc028abf754c290d921d809eec0518aDaniel Dunbar 5815c1aaafbd6dd25a99ca1960e1c3c98aeefe9d728Daniel Dunbar // Explicitly warn that these options are unsupported, even though 5825c1aaafbd6dd25a99ca1960e1c3c98aeefe9d728Daniel Dunbar // we are allowing compilation to continue. 5835c1aaafbd6dd25a99ca1960e1c3c98aeefe9d728Daniel Dunbar // FIXME: Use iterator. 584c21c485b4fb58ef5d55cf3e523263dd824a2ace4Daniel Dunbar for (ArgList::const_iterator 5855c1aaafbd6dd25a99ca1960e1c3c98aeefe9d728Daniel Dunbar it = Args.begin(), ie = Args.end(); it != ie; ++it) { 5865c1aaafbd6dd25a99ca1960e1c3c98aeefe9d728Daniel Dunbar const Arg *A = *it; 5875c1aaafbd6dd25a99ca1960e1c3c98aeefe9d728Daniel Dunbar if (A->getOption().matches(options::OPT_pg)) { 5885c1aaafbd6dd25a99ca1960e1c3c98aeefe9d728Daniel Dunbar A->claim(); 589c21c485b4fb58ef5d55cf3e523263dd824a2ace4Daniel Dunbar D.Diag(clang::diag::warn_drv_clang_unsupported) 5905c1aaafbd6dd25a99ca1960e1c3c98aeefe9d728Daniel Dunbar << A->getAsString(Args); 5915c1aaafbd6dd25a99ca1960e1c3c98aeefe9d728Daniel Dunbar } 5925c1aaafbd6dd25a99ca1960e1c3c98aeefe9d728Daniel Dunbar } 5935c1aaafbd6dd25a99ca1960e1c3c98aeefe9d728Daniel Dunbar 59468fb469aeb19144403e703b825854d08353c8eeaDaniel Dunbar // Claim some arguments which clang supports automatically. 59568fb469aeb19144403e703b825854d08353c8eeaDaniel Dunbar 59668fb469aeb19144403e703b825854d08353c8eeaDaniel Dunbar // -fpch-preprocess is used with gcc to add a special marker in the 59768fb469aeb19144403e703b825854d08353c8eeaDaniel Dunbar // -output to include the PCH file. Clang's PTH solution is 59868fb469aeb19144403e703b825854d08353c8eeaDaniel Dunbar // -completely transparent, so we do not need to deal with it at 59968fb469aeb19144403e703b825854d08353c8eeaDaniel Dunbar // -all. 60068fb469aeb19144403e703b825854d08353c8eeaDaniel Dunbar Args.ClaimAllArgs(options::OPT_fpch_preprocess); 601c21c485b4fb58ef5d55cf3e523263dd824a2ace4Daniel Dunbar 602a880db0b0fc028abf754c290d921d809eec0518aDaniel Dunbar // Claim some arguments which clang doesn't support, but we don't 603a880db0b0fc028abf754c290d921d809eec0518aDaniel Dunbar // care to warn the user about. 604c21c485b4fb58ef5d55cf3e523263dd824a2ace4Daniel Dunbar 605a880db0b0fc028abf754c290d921d809eec0518aDaniel Dunbar // FIXME: Use iterator. 606c21c485b4fb58ef5d55cf3e523263dd824a2ace4Daniel Dunbar for (ArgList::const_iterator 607a880db0b0fc028abf754c290d921d809eec0518aDaniel Dunbar it = Args.begin(), ie = Args.end(); it != ie; ++it) { 608a880db0b0fc028abf754c290d921d809eec0518aDaniel Dunbar const Arg *A = *it; 60906ef3c3e9be4923b8e29c8e267b0c56afaa14ff3Daniel Dunbar if (A->getOption().matches(options::OPT_clang_ignored_f_Group) || 61016fd3a9f5159b74bfdd65cf290b4bd091088de91Daniel Dunbar A->getOption().matches(options::OPT_clang_ignored_m_Group)) 611a880db0b0fc028abf754c290d921d809eec0518aDaniel Dunbar A->claim(); 612a880db0b0fc028abf754c290d921d809eec0518aDaniel Dunbar } 61347ac7d27c44bd64a7d0fc03d4babc196cf2b8230Daniel Dunbar} 61447ac7d27c44bd64a7d0fc03d4babc196cf2b8230Daniel Dunbar 615b488c1dac8e53206f07103d794a62a3f5012c0f4Daniel Dunbarvoid gcc::Common::ConstructJob(Compilation &C, const JobAction &JA, 616b488c1dac8e53206f07103d794a62a3f5012c0f4Daniel Dunbar Job &Dest, 617b488c1dac8e53206f07103d794a62a3f5012c0f4Daniel Dunbar const InputInfo &Output, 618b488c1dac8e53206f07103d794a62a3f5012c0f4Daniel Dunbar const InputInfoList &Inputs, 6191d46033f760ba5fd266ce59fe391fac473f04f52Daniel Dunbar const ArgList &Args, 620b488c1dac8e53206f07103d794a62a3f5012c0f4Daniel Dunbar const char *LinkingOutput) const { 621a8304f67291b0182fb64f3afc621615288dd1d31Daniel Dunbar const Driver &D = getToolChain().getHost().getDriver(); 622b488c1dac8e53206f07103d794a62a3f5012c0f4Daniel Dunbar ArgStringList CmdArgs; 623b488c1dac8e53206f07103d794a62a3f5012c0f4Daniel Dunbar 624c21c485b4fb58ef5d55cf3e523263dd824a2ace4Daniel Dunbar for (ArgList::const_iterator 6251d46033f760ba5fd266ce59fe391fac473f04f52Daniel Dunbar it = Args.begin(), ie = Args.end(); it != ie; ++it) { 626b488c1dac8e53206f07103d794a62a3f5012c0f4Daniel Dunbar Arg *A = *it; 6277587719c40ebf02bf11e5e66c30bd20e98edebc2Daniel Dunbar if (A->getOption().hasForwardToGCC()) { 6287587719c40ebf02bf11e5e66c30bd20e98edebc2Daniel Dunbar // It is unfortunate that we have to claim here, as this means 6297587719c40ebf02bf11e5e66c30bd20e98edebc2Daniel Dunbar // we will basically never report anything interesting for 6306ecc7a993f939c5255c36c7c0d965fb9c1543f2aDaniel Dunbar // platforms using a generic gcc, even if we are just using gcc 6316ecc7a993f939c5255c36c7c0d965fb9c1543f2aDaniel Dunbar // to get to the assembler. 6327587719c40ebf02bf11e5e66c30bd20e98edebc2Daniel Dunbar A->claim(); 6331d46033f760ba5fd266ce59fe391fac473f04f52Daniel Dunbar A->render(Args, CmdArgs); 6347587719c40ebf02bf11e5e66c30bd20e98edebc2Daniel Dunbar } 635b488c1dac8e53206f07103d794a62a3f5012c0f4Daniel Dunbar } 636c21c485b4fb58ef5d55cf3e523263dd824a2ace4Daniel Dunbar 637b488c1dac8e53206f07103d794a62a3f5012c0f4Daniel Dunbar RenderExtraToolArgs(CmdArgs); 638b488c1dac8e53206f07103d794a62a3f5012c0f4Daniel Dunbar 639b488c1dac8e53206f07103d794a62a3f5012c0f4Daniel Dunbar // If using a driver driver, force the arch. 640b488c1dac8e53206f07103d794a62a3f5012c0f4Daniel Dunbar if (getToolChain().getHost().useDriverDriver()) { 641b488c1dac8e53206f07103d794a62a3f5012c0f4Daniel Dunbar CmdArgs.push_back("-arch"); 642bf54a06f9b771c2a2730cc63eb89bce0522515b5Daniel Dunbar 643bf54a06f9b771c2a2730cc63eb89bce0522515b5Daniel Dunbar // FIXME: Remove these special cases. 644bf54a06f9b771c2a2730cc63eb89bce0522515b5Daniel Dunbar const char *Str = getToolChain().getArchName().c_str(); 645bf54a06f9b771c2a2730cc63eb89bce0522515b5Daniel Dunbar if (strcmp(Str, "powerpc") == 0) 646bf54a06f9b771c2a2730cc63eb89bce0522515b5Daniel Dunbar Str = "ppc"; 647bf54a06f9b771c2a2730cc63eb89bce0522515b5Daniel Dunbar else if (strcmp(Str, "powerpc64") == 0) 648bf54a06f9b771c2a2730cc63eb89bce0522515b5Daniel Dunbar Str = "ppc64"; 649bf54a06f9b771c2a2730cc63eb89bce0522515b5Daniel Dunbar CmdArgs.push_back(Str); 650b488c1dac8e53206f07103d794a62a3f5012c0f4Daniel Dunbar } 651b488c1dac8e53206f07103d794a62a3f5012c0f4Daniel Dunbar 6526ecc7a993f939c5255c36c7c0d965fb9c1543f2aDaniel Dunbar // Try to force gcc to match the tool chain we want, if we recognize 6536ecc7a993f939c5255c36c7c0d965fb9c1543f2aDaniel Dunbar // the arch. 6546ecc7a993f939c5255c36c7c0d965fb9c1543f2aDaniel Dunbar const char *Str = getToolChain().getArchName().c_str(); 6556ecc7a993f939c5255c36c7c0d965fb9c1543f2aDaniel Dunbar if (strcmp(Str, "i386") == 0 || strcmp(Str, "powerpc") == 0) 6566ecc7a993f939c5255c36c7c0d965fb9c1543f2aDaniel Dunbar CmdArgs.push_back("-m32"); 6576ecc7a993f939c5255c36c7c0d965fb9c1543f2aDaniel Dunbar else if (strcmp(Str, "x86_64") == 0 || strcmp(Str, "powerpc64") == 0) 6586ecc7a993f939c5255c36c7c0d965fb9c1543f2aDaniel Dunbar CmdArgs.push_back("-m64"); 6596ecc7a993f939c5255c36c7c0d965fb9c1543f2aDaniel Dunbar 660b488c1dac8e53206f07103d794a62a3f5012c0f4Daniel Dunbar if (Output.isPipe()) { 661b488c1dac8e53206f07103d794a62a3f5012c0f4Daniel Dunbar CmdArgs.push_back("-o"); 662b488c1dac8e53206f07103d794a62a3f5012c0f4Daniel Dunbar CmdArgs.push_back("-"); 663115a79277edababaf1b26e3654044ae983197679Daniel Dunbar } else if (Output.isFilename()) { 664b488c1dac8e53206f07103d794a62a3f5012c0f4Daniel Dunbar CmdArgs.push_back("-o"); 665115a79277edababaf1b26e3654044ae983197679Daniel Dunbar CmdArgs.push_back(Output.getFilename()); 666115a79277edababaf1b26e3654044ae983197679Daniel Dunbar } else { 667115a79277edababaf1b26e3654044ae983197679Daniel Dunbar assert(Output.isNothing() && "Unexpected output"); 668b488c1dac8e53206f07103d794a62a3f5012c0f4Daniel Dunbar CmdArgs.push_back("-fsyntax-only"); 669115a79277edababaf1b26e3654044ae983197679Daniel Dunbar } 670b488c1dac8e53206f07103d794a62a3f5012c0f4Daniel Dunbar 671b488c1dac8e53206f07103d794a62a3f5012c0f4Daniel Dunbar 672b488c1dac8e53206f07103d794a62a3f5012c0f4Daniel Dunbar // Only pass -x if gcc will understand it; otherwise hope gcc 673b488c1dac8e53206f07103d794a62a3f5012c0f4Daniel Dunbar // understands the suffix correctly. The main use case this would go 674b488c1dac8e53206f07103d794a62a3f5012c0f4Daniel Dunbar // wrong in is for linker inputs if they happened to have an odd 675b488c1dac8e53206f07103d794a62a3f5012c0f4Daniel Dunbar // suffix; really the only way to get this to happen is a command 676b488c1dac8e53206f07103d794a62a3f5012c0f4Daniel Dunbar // like '-x foobar a.c' which will treat a.c like a linker input. 677b488c1dac8e53206f07103d794a62a3f5012c0f4Daniel Dunbar // 678b488c1dac8e53206f07103d794a62a3f5012c0f4Daniel Dunbar // FIXME: For the linker case specifically, can we safely convert 679b488c1dac8e53206f07103d794a62a3f5012c0f4Daniel Dunbar // inputs into '-Wl,' options? 680b488c1dac8e53206f07103d794a62a3f5012c0f4Daniel Dunbar for (InputInfoList::const_iterator 681b488c1dac8e53206f07103d794a62a3f5012c0f4Daniel Dunbar it = Inputs.begin(), ie = Inputs.end(); it != ie; ++it) { 682b488c1dac8e53206f07103d794a62a3f5012c0f4Daniel Dunbar const InputInfo &II = *it; 683a8304f67291b0182fb64f3afc621615288dd1d31Daniel Dunbar 684a8304f67291b0182fb64f3afc621615288dd1d31Daniel Dunbar // Don't try to pass LLVM inputs to a generic gcc. 685a8304f67291b0182fb64f3afc621615288dd1d31Daniel Dunbar if (II.getType() == types::TY_LLVMBC) 686a8304f67291b0182fb64f3afc621615288dd1d31Daniel Dunbar D.Diag(clang::diag::err_drv_no_linker_llvm_support) 687a8304f67291b0182fb64f3afc621615288dd1d31Daniel Dunbar << getToolChain().getTripleString().c_str(); 688a8304f67291b0182fb64f3afc621615288dd1d31Daniel Dunbar 689b488c1dac8e53206f07103d794a62a3f5012c0f4Daniel Dunbar if (types::canTypeBeUserSpecified(II.getType())) { 690b488c1dac8e53206f07103d794a62a3f5012c0f4Daniel Dunbar CmdArgs.push_back("-x"); 691b488c1dac8e53206f07103d794a62a3f5012c0f4Daniel Dunbar CmdArgs.push_back(types::getTypeName(II.getType())); 692b488c1dac8e53206f07103d794a62a3f5012c0f4Daniel Dunbar } 693b488c1dac8e53206f07103d794a62a3f5012c0f4Daniel Dunbar 694b488c1dac8e53206f07103d794a62a3f5012c0f4Daniel Dunbar if (II.isPipe()) 695b488c1dac8e53206f07103d794a62a3f5012c0f4Daniel Dunbar CmdArgs.push_back("-"); 696115a79277edababaf1b26e3654044ae983197679Daniel Dunbar else if (II.isFilename()) 697115a79277edababaf1b26e3654044ae983197679Daniel Dunbar CmdArgs.push_back(II.getFilename()); 698b488c1dac8e53206f07103d794a62a3f5012c0f4Daniel Dunbar else 699115a79277edababaf1b26e3654044ae983197679Daniel Dunbar // Don't render as input, we need gcc to do the translations. 700115a79277edababaf1b26e3654044ae983197679Daniel Dunbar II.getInputArg().render(Args, CmdArgs); 701b488c1dac8e53206f07103d794a62a3f5012c0f4Daniel Dunbar } 702b488c1dac8e53206f07103d794a62a3f5012c0f4Daniel Dunbar 703c21c485b4fb58ef5d55cf3e523263dd824a2ace4Daniel Dunbar const char *GCCName = 70478d8a089c8f124ba6f47bb37e2c4a36986f60e23Daniel Dunbar getToolChain().getHost().getDriver().CCCGenericGCCName.c_str(); 705c21c485b4fb58ef5d55cf3e523263dd824a2ace4Daniel Dunbar const char *Exec = 70678d8a089c8f124ba6f47bb37e2c4a36986f60e23Daniel Dunbar Args.MakeArgString(getToolChain().GetProgramPath(C, GCCName).c_str()); 707632f50edc08c76ebc643a0d4871bae33a55d7b4eDaniel Dunbar Dest.addCommand(new Command(Exec, CmdArgs)); 70847ac7d27c44bd64a7d0fc03d4babc196cf2b8230Daniel Dunbar} 70947ac7d27c44bd64a7d0fc03d4babc196cf2b8230Daniel Dunbar 710b488c1dac8e53206f07103d794a62a3f5012c0f4Daniel Dunbarvoid gcc::Preprocess::RenderExtraToolArgs(ArgStringList &CmdArgs) const { 711b488c1dac8e53206f07103d794a62a3f5012c0f4Daniel Dunbar CmdArgs.push_back("-E"); 71247ac7d27c44bd64a7d0fc03d4babc196cf2b8230Daniel Dunbar} 71347ac7d27c44bd64a7d0fc03d4babc196cf2b8230Daniel Dunbar 714b488c1dac8e53206f07103d794a62a3f5012c0f4Daniel Dunbarvoid gcc::Precompile::RenderExtraToolArgs(ArgStringList &CmdArgs) const { 715b488c1dac8e53206f07103d794a62a3f5012c0f4Daniel Dunbar // The type is good enough. 71647ac7d27c44bd64a7d0fc03d4babc196cf2b8230Daniel Dunbar} 71747ac7d27c44bd64a7d0fc03d4babc196cf2b8230Daniel Dunbar 718b488c1dac8e53206f07103d794a62a3f5012c0f4Daniel Dunbarvoid gcc::Compile::RenderExtraToolArgs(ArgStringList &CmdArgs) const { 719b488c1dac8e53206f07103d794a62a3f5012c0f4Daniel Dunbar CmdArgs.push_back("-S"); 72047ac7d27c44bd64a7d0fc03d4babc196cf2b8230Daniel Dunbar} 72147ac7d27c44bd64a7d0fc03d4babc196cf2b8230Daniel Dunbar 722b488c1dac8e53206f07103d794a62a3f5012c0f4Daniel Dunbarvoid gcc::Assemble::RenderExtraToolArgs(ArgStringList &CmdArgs) const { 723b488c1dac8e53206f07103d794a62a3f5012c0f4Daniel Dunbar CmdArgs.push_back("-c"); 724b488c1dac8e53206f07103d794a62a3f5012c0f4Daniel Dunbar} 72547ac7d27c44bd64a7d0fc03d4babc196cf2b8230Daniel Dunbar 726b488c1dac8e53206f07103d794a62a3f5012c0f4Daniel Dunbarvoid gcc::Link::RenderExtraToolArgs(ArgStringList &CmdArgs) const { 727b488c1dac8e53206f07103d794a62a3f5012c0f4Daniel Dunbar // The types are (hopefully) good enough. 72847ac7d27c44bd64a7d0fc03d4babc196cf2b8230Daniel Dunbar} 729b488c1dac8e53206f07103d794a62a3f5012c0f4Daniel Dunbar 73040f1265ebd42ece3e7f7917319b56012e8e2bce2Daniel Dunbarconst char *darwin::CC1::getCC1Name(types::ID Type) const { 73140f1265ebd42ece3e7f7917319b56012e8e2bce2Daniel Dunbar switch (Type) { 73240f1265ebd42ece3e7f7917319b56012e8e2bce2Daniel Dunbar default: 73340f1265ebd42ece3e7f7917319b56012e8e2bce2Daniel Dunbar assert(0 && "Unexpected type for Darwin CC1 tool."); 73440f1265ebd42ece3e7f7917319b56012e8e2bce2Daniel Dunbar case types::TY_Asm: 73540f1265ebd42ece3e7f7917319b56012e8e2bce2Daniel Dunbar case types::TY_C: case types::TY_CHeader: 73640f1265ebd42ece3e7f7917319b56012e8e2bce2Daniel Dunbar case types::TY_PP_C: case types::TY_PP_CHeader: 73740f1265ebd42ece3e7f7917319b56012e8e2bce2Daniel Dunbar return "cc1"; 73840f1265ebd42ece3e7f7917319b56012e8e2bce2Daniel Dunbar case types::TY_ObjC: case types::TY_ObjCHeader: 73940f1265ebd42ece3e7f7917319b56012e8e2bce2Daniel Dunbar case types::TY_PP_ObjC: case types::TY_PP_ObjCHeader: 74040f1265ebd42ece3e7f7917319b56012e8e2bce2Daniel Dunbar return "cc1obj"; 74140f1265ebd42ece3e7f7917319b56012e8e2bce2Daniel Dunbar case types::TY_CXX: case types::TY_CXXHeader: 74240f1265ebd42ece3e7f7917319b56012e8e2bce2Daniel Dunbar case types::TY_PP_CXX: case types::TY_PP_CXXHeader: 74340f1265ebd42ece3e7f7917319b56012e8e2bce2Daniel Dunbar return "cc1plus"; 74440f1265ebd42ece3e7f7917319b56012e8e2bce2Daniel Dunbar case types::TY_ObjCXX: case types::TY_ObjCXXHeader: 74540f1265ebd42ece3e7f7917319b56012e8e2bce2Daniel Dunbar case types::TY_PP_ObjCXX: case types::TY_PP_ObjCXXHeader: 74640f1265ebd42ece3e7f7917319b56012e8e2bce2Daniel Dunbar return "cc1objplus"; 74740f1265ebd42ece3e7f7917319b56012e8e2bce2Daniel Dunbar } 74840f1265ebd42ece3e7f7917319b56012e8e2bce2Daniel Dunbar} 74940f1265ebd42ece3e7f7917319b56012e8e2bce2Daniel Dunbar 750c21c485b4fb58ef5d55cf3e523263dd824a2ace4Daniel Dunbarconst char *darwin::CC1::getBaseInputName(const ArgList &Args, 751a5a7bd0de7b6b80212095195a055a4a43f21d4b2Daniel Dunbar const InputInfoList &Inputs) { 752a3ec60e0cf2a1916f479288998d31bd980b1a306Daniel Dunbar llvm::sys::Path P(Inputs[0].getBaseInput()); 753a3ec60e0cf2a1916f479288998d31bd980b1a306Daniel Dunbar return Args.MakeArgString(P.getLast().c_str()); 754a3ec60e0cf2a1916f479288998d31bd980b1a306Daniel Dunbar} 755a3ec60e0cf2a1916f479288998d31bd980b1a306Daniel Dunbar 756c21c485b4fb58ef5d55cf3e523263dd824a2ace4Daniel Dunbarconst char *darwin::CC1::getBaseInputStem(const ArgList &Args, 757a5a7bd0de7b6b80212095195a055a4a43f21d4b2Daniel Dunbar const InputInfoList &Inputs) { 758a3ec60e0cf2a1916f479288998d31bd980b1a306Daniel Dunbar const char *Str = getBaseInputName(Args, Inputs); 759a3ec60e0cf2a1916f479288998d31bd980b1a306Daniel Dunbar 760a3ec60e0cf2a1916f479288998d31bd980b1a306Daniel Dunbar if (const char *End = strchr(Str, '.')) 761a3ec60e0cf2a1916f479288998d31bd980b1a306Daniel Dunbar return Args.MakeArgString(std::string(Str, End).c_str()); 762a3ec60e0cf2a1916f479288998d31bd980b1a306Daniel Dunbar 763a3ec60e0cf2a1916f479288998d31bd980b1a306Daniel Dunbar return Str; 764a3ec60e0cf2a1916f479288998d31bd980b1a306Daniel Dunbar} 765a3ec60e0cf2a1916f479288998d31bd980b1a306Daniel Dunbar 766a3ec60e0cf2a1916f479288998d31bd980b1a306Daniel Dunbarconst char * 767c21c485b4fb58ef5d55cf3e523263dd824a2ace4Daniel Dunbardarwin::CC1::getDependencyFileName(const ArgList &Args, 768a5a7bd0de7b6b80212095195a055a4a43f21d4b2Daniel Dunbar const InputInfoList &Inputs) { 769a3ec60e0cf2a1916f479288998d31bd980b1a306Daniel Dunbar // FIXME: Think about this more. 770a3ec60e0cf2a1916f479288998d31bd980b1a306Daniel Dunbar std::string Res; 771a3ec60e0cf2a1916f479288998d31bd980b1a306Daniel Dunbar 772a3ec60e0cf2a1916f479288998d31bd980b1a306Daniel Dunbar if (Arg *OutputOpt = Args.getLastArg(options::OPT_o)) { 773a3ec60e0cf2a1916f479288998d31bd980b1a306Daniel Dunbar std::string Str(OutputOpt->getValue(Args)); 774c21c485b4fb58ef5d55cf3e523263dd824a2ace4Daniel Dunbar 775a3ec60e0cf2a1916f479288998d31bd980b1a306Daniel Dunbar Res = Str.substr(0, Str.rfind('.')); 776a3ec60e0cf2a1916f479288998d31bd980b1a306Daniel Dunbar } else 777a5a7bd0de7b6b80212095195a055a4a43f21d4b2Daniel Dunbar Res = darwin::CC1::getBaseInputStem(Args, Inputs); 778a3ec60e0cf2a1916f479288998d31bd980b1a306Daniel Dunbar 779a3ec60e0cf2a1916f479288998d31bd980b1a306Daniel Dunbar return Args.MakeArgString((Res + ".d").c_str()); 780a3ec60e0cf2a1916f479288998d31bd980b1a306Daniel Dunbar} 781a3ec60e0cf2a1916f479288998d31bd980b1a306Daniel Dunbar 782c21c485b4fb58ef5d55cf3e523263dd824a2ace4Daniel Dunbarvoid darwin::CC1::AddCC1Args(const ArgList &Args, 783a3ec60e0cf2a1916f479288998d31bd980b1a306Daniel Dunbar ArgStringList &CmdArgs) const { 784a3ec60e0cf2a1916f479288998d31bd980b1a306Daniel Dunbar // Derived from cc1 spec. 785a3ec60e0cf2a1916f479288998d31bd980b1a306Daniel Dunbar 786a3ec60e0cf2a1916f479288998d31bd980b1a306Daniel Dunbar // FIXME: -fapple-kext seems to disable this too. Investigate. 787a3ec60e0cf2a1916f479288998d31bd980b1a306Daniel Dunbar if (!Args.hasArg(options::OPT_mkernel) && !Args.hasArg(options::OPT_static) && 788a3ec60e0cf2a1916f479288998d31bd980b1a306Daniel Dunbar !Args.hasArg(options::OPT_mdynamic_no_pic)) 789a3ec60e0cf2a1916f479288998d31bd980b1a306Daniel Dunbar CmdArgs.push_back("-fPIC"); 790a3ec60e0cf2a1916f479288998d31bd980b1a306Daniel Dunbar 791a3ec60e0cf2a1916f479288998d31bd980b1a306Daniel Dunbar // gcc has some code here to deal with when no -mmacosx-version-min 792a3ec60e0cf2a1916f479288998d31bd980b1a306Daniel Dunbar // and no -miphoneos-version-min is present, but this never happens 793a3ec60e0cf2a1916f479288998d31bd980b1a306Daniel Dunbar // due to tool chain specific argument translation. 794a3ec60e0cf2a1916f479288998d31bd980b1a306Daniel Dunbar 795a3ec60e0cf2a1916f479288998d31bd980b1a306Daniel Dunbar // FIXME: Remove mthumb 796a3ec60e0cf2a1916f479288998d31bd980b1a306Daniel Dunbar // FIXME: Remove mno-thumb 797a3ec60e0cf2a1916f479288998d31bd980b1a306Daniel Dunbar // FIXME: Remove faltivec 798a3ec60e0cf2a1916f479288998d31bd980b1a306Daniel Dunbar // FIXME: Remove mno-fused-madd 799a3ec60e0cf2a1916f479288998d31bd980b1a306Daniel Dunbar // FIXME: Remove mlong-branch 800a3ec60e0cf2a1916f479288998d31bd980b1a306Daniel Dunbar // FIXME: Remove mlongcall 801a3ec60e0cf2a1916f479288998d31bd980b1a306Daniel Dunbar // FIXME: Remove mcpu=G4 802a3ec60e0cf2a1916f479288998d31bd980b1a306Daniel Dunbar // FIXME: Remove mcpu=G5 803c21c485b4fb58ef5d55cf3e523263dd824a2ace4Daniel Dunbar 804a3ec60e0cf2a1916f479288998d31bd980b1a306Daniel Dunbar if (Args.hasArg(options::OPT_g_Flag) && 805a3ec60e0cf2a1916f479288998d31bd980b1a306Daniel Dunbar !Args.hasArg(options::OPT_fno_eliminate_unused_debug_symbols)) 806a3ec60e0cf2a1916f479288998d31bd980b1a306Daniel Dunbar CmdArgs.push_back("-feliminate-unused-debug-symbols"); 807a3ec60e0cf2a1916f479288998d31bd980b1a306Daniel Dunbar} 808a3ec60e0cf2a1916f479288998d31bd980b1a306Daniel Dunbar 809a3ec60e0cf2a1916f479288998d31bd980b1a306Daniel Dunbarvoid darwin::CC1::AddCC1OptionsArgs(const ArgList &Args, ArgStringList &CmdArgs, 810a3ec60e0cf2a1916f479288998d31bd980b1a306Daniel Dunbar const InputInfoList &Inputs, 811a3ec60e0cf2a1916f479288998d31bd980b1a306Daniel Dunbar const ArgStringList &OutputArgs) const { 812a3ec60e0cf2a1916f479288998d31bd980b1a306Daniel Dunbar const Driver &D = getToolChain().getHost().getDriver(); 813a3ec60e0cf2a1916f479288998d31bd980b1a306Daniel Dunbar 814a3ec60e0cf2a1916f479288998d31bd980b1a306Daniel Dunbar // Derived from cc1_options spec. 815a3ec60e0cf2a1916f479288998d31bd980b1a306Daniel Dunbar if (Args.hasArg(options::OPT_fast) || 816a3ec60e0cf2a1916f479288998d31bd980b1a306Daniel Dunbar Args.hasArg(options::OPT_fastf) || 817a3ec60e0cf2a1916f479288998d31bd980b1a306Daniel Dunbar Args.hasArg(options::OPT_fastcp)) 818a3ec60e0cf2a1916f479288998d31bd980b1a306Daniel Dunbar CmdArgs.push_back("-O3"); 819c21c485b4fb58ef5d55cf3e523263dd824a2ace4Daniel Dunbar 820a3ec60e0cf2a1916f479288998d31bd980b1a306Daniel Dunbar if (Arg *A = Args.getLastArg(options::OPT_pg)) 821a3ec60e0cf2a1916f479288998d31bd980b1a306Daniel Dunbar if (Args.hasArg(options::OPT_fomit_frame_pointer)) 822a3ec60e0cf2a1916f479288998d31bd980b1a306Daniel Dunbar D.Diag(clang::diag::err_drv_argument_not_allowed_with) 823a3ec60e0cf2a1916f479288998d31bd980b1a306Daniel Dunbar << A->getAsString(Args) << "-fomit-frame-pointer"; 824a3ec60e0cf2a1916f479288998d31bd980b1a306Daniel Dunbar 825a3ec60e0cf2a1916f479288998d31bd980b1a306Daniel Dunbar AddCC1Args(Args, CmdArgs); 826a3ec60e0cf2a1916f479288998d31bd980b1a306Daniel Dunbar 827a3ec60e0cf2a1916f479288998d31bd980b1a306Daniel Dunbar if (!Args.hasArg(options::OPT_Q)) 828a3ec60e0cf2a1916f479288998d31bd980b1a306Daniel Dunbar CmdArgs.push_back("-quiet"); 829a3ec60e0cf2a1916f479288998d31bd980b1a306Daniel Dunbar 830a3ec60e0cf2a1916f479288998d31bd980b1a306Daniel Dunbar CmdArgs.push_back("-dumpbase"); 831a5a7bd0de7b6b80212095195a055a4a43f21d4b2Daniel Dunbar CmdArgs.push_back(darwin::CC1::getBaseInputName(Args, Inputs)); 832a3ec60e0cf2a1916f479288998d31bd980b1a306Daniel Dunbar 833a3ec60e0cf2a1916f479288998d31bd980b1a306Daniel Dunbar Args.AddAllArgs(CmdArgs, options::OPT_d_Group); 834a3ec60e0cf2a1916f479288998d31bd980b1a306Daniel Dunbar 835a3ec60e0cf2a1916f479288998d31bd980b1a306Daniel Dunbar Args.AddAllArgs(CmdArgs, options::OPT_m_Group); 836a3ec60e0cf2a1916f479288998d31bd980b1a306Daniel Dunbar Args.AddAllArgs(CmdArgs, options::OPT_a_Group); 837a3ec60e0cf2a1916f479288998d31bd980b1a306Daniel Dunbar 838a3ec60e0cf2a1916f479288998d31bd980b1a306Daniel Dunbar // FIXME: The goal is to use the user provided -o if that is our 839a3ec60e0cf2a1916f479288998d31bd980b1a306Daniel Dunbar // final output, otherwise to drive from the original input 840a3ec60e0cf2a1916f479288998d31bd980b1a306Daniel Dunbar // name. Find a clean way to go about this. 841a3ec60e0cf2a1916f479288998d31bd980b1a306Daniel Dunbar if ((Args.hasArg(options::OPT_c) || Args.hasArg(options::OPT_S)) && 842a3ec60e0cf2a1916f479288998d31bd980b1a306Daniel Dunbar Args.hasArg(options::OPT_o)) { 843a3ec60e0cf2a1916f479288998d31bd980b1a306Daniel Dunbar Arg *OutputOpt = Args.getLastArg(options::OPT_o); 844a3ec60e0cf2a1916f479288998d31bd980b1a306Daniel Dunbar CmdArgs.push_back("-auxbase-strip"); 845a3ec60e0cf2a1916f479288998d31bd980b1a306Daniel Dunbar CmdArgs.push_back(OutputOpt->getValue(Args)); 846a3ec60e0cf2a1916f479288998d31bd980b1a306Daniel Dunbar } else { 847a3ec60e0cf2a1916f479288998d31bd980b1a306Daniel Dunbar CmdArgs.push_back("-auxbase"); 848a5a7bd0de7b6b80212095195a055a4a43f21d4b2Daniel Dunbar CmdArgs.push_back(darwin::CC1::getBaseInputStem(Args, Inputs)); 849a3ec60e0cf2a1916f479288998d31bd980b1a306Daniel Dunbar } 850a3ec60e0cf2a1916f479288998d31bd980b1a306Daniel Dunbar 851a3ec60e0cf2a1916f479288998d31bd980b1a306Daniel Dunbar Args.AddAllArgs(CmdArgs, options::OPT_g_Group); 852a3ec60e0cf2a1916f479288998d31bd980b1a306Daniel Dunbar 853a3ec60e0cf2a1916f479288998d31bd980b1a306Daniel Dunbar Args.AddAllArgs(CmdArgs, options::OPT_O); 854a3ec60e0cf2a1916f479288998d31bd980b1a306Daniel Dunbar // FIXME: -Wall is getting some special treatment. Investigate. 855a3ec60e0cf2a1916f479288998d31bd980b1a306Daniel Dunbar Args.AddAllArgs(CmdArgs, options::OPT_W_Group, options::OPT_pedantic_Group); 856a3ec60e0cf2a1916f479288998d31bd980b1a306Daniel Dunbar Args.AddLastArg(CmdArgs, options::OPT_w); 857c21c485b4fb58ef5d55cf3e523263dd824a2ace4Daniel Dunbar Args.AddAllArgs(CmdArgs, options::OPT_std_EQ, options::OPT_ansi, 858a3ec60e0cf2a1916f479288998d31bd980b1a306Daniel Dunbar options::OPT_trigraphs); 859a3ff202ee4fb21728e930d5d029ba4925129912cDaniel Dunbar if (!Args.getLastArg(options::OPT_std_EQ, options::OPT_ansi)) { 860a3ff202ee4fb21728e930d5d029ba4925129912cDaniel Dunbar // Honor -std-default. 861a3ff202ee4fb21728e930d5d029ba4925129912cDaniel Dunbar Args.AddAllArgsTranslated(CmdArgs, options::OPT_std_default_EQ, 862a3ff202ee4fb21728e930d5d029ba4925129912cDaniel Dunbar "-std=", /*Joined=*/true); 863a3ff202ee4fb21728e930d5d029ba4925129912cDaniel Dunbar } 864a3ff202ee4fb21728e930d5d029ba4925129912cDaniel Dunbar 865a3ec60e0cf2a1916f479288998d31bd980b1a306Daniel Dunbar if (Args.hasArg(options::OPT_v)) 866a3ec60e0cf2a1916f479288998d31bd980b1a306Daniel Dunbar CmdArgs.push_back("-version"); 867a3ec60e0cf2a1916f479288998d31bd980b1a306Daniel Dunbar if (Args.hasArg(options::OPT_pg)) 868a3ec60e0cf2a1916f479288998d31bd980b1a306Daniel Dunbar CmdArgs.push_back("-p"); 869a3ec60e0cf2a1916f479288998d31bd980b1a306Daniel Dunbar Args.AddLastArg(CmdArgs, options::OPT_p); 870c21c485b4fb58ef5d55cf3e523263dd824a2ace4Daniel Dunbar 871a3ec60e0cf2a1916f479288998d31bd980b1a306Daniel Dunbar // The driver treats -fsyntax-only specially. 872a3ec60e0cf2a1916f479288998d31bd980b1a306Daniel Dunbar Args.AddAllArgs(CmdArgs, options::OPT_f_Group, options::OPT_fsyntax_only); 873c21c485b4fb58ef5d55cf3e523263dd824a2ace4Daniel Dunbar 874a3ec60e0cf2a1916f479288998d31bd980b1a306Daniel Dunbar Args.AddAllArgs(CmdArgs, options::OPT_undef); 875a3ec60e0cf2a1916f479288998d31bd980b1a306Daniel Dunbar if (Args.hasArg(options::OPT_Qn)) 876a3ec60e0cf2a1916f479288998d31bd980b1a306Daniel Dunbar CmdArgs.push_back("-fno-ident"); 877c21c485b4fb58ef5d55cf3e523263dd824a2ace4Daniel Dunbar 878a3ec60e0cf2a1916f479288998d31bd980b1a306Daniel Dunbar // FIXME: This isn't correct. 879a3ec60e0cf2a1916f479288998d31bd980b1a306Daniel Dunbar //Args.AddLastArg(CmdArgs, options::OPT__help) 880a3ec60e0cf2a1916f479288998d31bd980b1a306Daniel Dunbar //Args.AddLastArg(CmdArgs, options::OPT__targetHelp) 881a3ec60e0cf2a1916f479288998d31bd980b1a306Daniel Dunbar 882a3ec60e0cf2a1916f479288998d31bd980b1a306Daniel Dunbar CmdArgs.append(OutputArgs.begin(), OutputArgs.end()); 883a3ec60e0cf2a1916f479288998d31bd980b1a306Daniel Dunbar 884a3ec60e0cf2a1916f479288998d31bd980b1a306Daniel Dunbar // FIXME: Still don't get what is happening here. Investigate. 885a3ec60e0cf2a1916f479288998d31bd980b1a306Daniel Dunbar Args.AddAllArgs(CmdArgs, options::OPT__param); 886a3ec60e0cf2a1916f479288998d31bd980b1a306Daniel Dunbar 887a3ec60e0cf2a1916f479288998d31bd980b1a306Daniel Dunbar if (Args.hasArg(options::OPT_fmudflap) || 888a3ec60e0cf2a1916f479288998d31bd980b1a306Daniel Dunbar Args.hasArg(options::OPT_fmudflapth)) { 889a3ec60e0cf2a1916f479288998d31bd980b1a306Daniel Dunbar CmdArgs.push_back("-fno-builtin"); 890a3ec60e0cf2a1916f479288998d31bd980b1a306Daniel Dunbar CmdArgs.push_back("-fno-merge-constants"); 891a3ec60e0cf2a1916f479288998d31bd980b1a306Daniel Dunbar } 892c21c485b4fb58ef5d55cf3e523263dd824a2ace4Daniel Dunbar 893a3ec60e0cf2a1916f479288998d31bd980b1a306Daniel Dunbar if (Args.hasArg(options::OPT_coverage)) { 894a3ec60e0cf2a1916f479288998d31bd980b1a306Daniel Dunbar CmdArgs.push_back("-fprofile-arcs"); 895a3ec60e0cf2a1916f479288998d31bd980b1a306Daniel Dunbar CmdArgs.push_back("-ftest-coverage"); 896a3ec60e0cf2a1916f479288998d31bd980b1a306Daniel Dunbar } 897a3ec60e0cf2a1916f479288998d31bd980b1a306Daniel Dunbar 898a3ec60e0cf2a1916f479288998d31bd980b1a306Daniel Dunbar if (types::isCXX(Inputs[0].getType())) 899a3ec60e0cf2a1916f479288998d31bd980b1a306Daniel Dunbar CmdArgs.push_back("-D__private_extern__=extern"); 900a3ec60e0cf2a1916f479288998d31bd980b1a306Daniel Dunbar} 901a3ec60e0cf2a1916f479288998d31bd980b1a306Daniel Dunbar 902a3ec60e0cf2a1916f479288998d31bd980b1a306Daniel Dunbarvoid darwin::CC1::AddCPPOptionsArgs(const ArgList &Args, ArgStringList &CmdArgs, 903a3ec60e0cf2a1916f479288998d31bd980b1a306Daniel Dunbar const InputInfoList &Inputs, 904a3ec60e0cf2a1916f479288998d31bd980b1a306Daniel Dunbar const ArgStringList &OutputArgs) const { 905a3ec60e0cf2a1916f479288998d31bd980b1a306Daniel Dunbar // Derived from cpp_options 906a3ec60e0cf2a1916f479288998d31bd980b1a306Daniel Dunbar AddCPPUniqueOptionsArgs(Args, CmdArgs, Inputs); 907c21c485b4fb58ef5d55cf3e523263dd824a2ace4Daniel Dunbar 908a3ec60e0cf2a1916f479288998d31bd980b1a306Daniel Dunbar CmdArgs.append(OutputArgs.begin(), OutputArgs.end()); 909a3ec60e0cf2a1916f479288998d31bd980b1a306Daniel Dunbar 910a3ec60e0cf2a1916f479288998d31bd980b1a306Daniel Dunbar AddCC1Args(Args, CmdArgs); 911a3ec60e0cf2a1916f479288998d31bd980b1a306Daniel Dunbar 912a3ec60e0cf2a1916f479288998d31bd980b1a306Daniel Dunbar // NOTE: The code below has some commonality with cpp_options, but 913a3ec60e0cf2a1916f479288998d31bd980b1a306Daniel Dunbar // in classic gcc style ends up sending things in different 914a3ec60e0cf2a1916f479288998d31bd980b1a306Daniel Dunbar // orders. This may be a good merge candidate once we drop pedantic 915a3ec60e0cf2a1916f479288998d31bd980b1a306Daniel Dunbar // compatibility. 916a3ec60e0cf2a1916f479288998d31bd980b1a306Daniel Dunbar 917a3ec60e0cf2a1916f479288998d31bd980b1a306Daniel Dunbar Args.AddAllArgs(CmdArgs, options::OPT_m_Group); 918c21c485b4fb58ef5d55cf3e523263dd824a2ace4Daniel Dunbar Args.AddAllArgs(CmdArgs, options::OPT_std_EQ, options::OPT_ansi, 919a3ec60e0cf2a1916f479288998d31bd980b1a306Daniel Dunbar options::OPT_trigraphs); 920a3ff202ee4fb21728e930d5d029ba4925129912cDaniel Dunbar if (!Args.getLastArg(options::OPT_std_EQ, options::OPT_ansi)) { 921a3ff202ee4fb21728e930d5d029ba4925129912cDaniel Dunbar // Honor -std-default. 922a3ff202ee4fb21728e930d5d029ba4925129912cDaniel Dunbar Args.AddAllArgsTranslated(CmdArgs, options::OPT_std_default_EQ, 923a3ff202ee4fb21728e930d5d029ba4925129912cDaniel Dunbar "-std=", /*Joined=*/true); 924a3ff202ee4fb21728e930d5d029ba4925129912cDaniel Dunbar } 925a3ec60e0cf2a1916f479288998d31bd980b1a306Daniel Dunbar Args.AddAllArgs(CmdArgs, options::OPT_W_Group, options::OPT_pedantic_Group); 926a3ec60e0cf2a1916f479288998d31bd980b1a306Daniel Dunbar Args.AddLastArg(CmdArgs, options::OPT_w); 927c21c485b4fb58ef5d55cf3e523263dd824a2ace4Daniel Dunbar 928a3ec60e0cf2a1916f479288998d31bd980b1a306Daniel Dunbar // The driver treats -fsyntax-only specially. 929a3ec60e0cf2a1916f479288998d31bd980b1a306Daniel Dunbar Args.AddAllArgs(CmdArgs, options::OPT_f_Group, options::OPT_fsyntax_only); 930a3ec60e0cf2a1916f479288998d31bd980b1a306Daniel Dunbar 931a3ec60e0cf2a1916f479288998d31bd980b1a306Daniel Dunbar if (Args.hasArg(options::OPT_g_Group) && !Args.hasArg(options::OPT_g0) && 932a3ec60e0cf2a1916f479288998d31bd980b1a306Daniel Dunbar !Args.hasArg(options::OPT_fno_working_directory)) 933a3ec60e0cf2a1916f479288998d31bd980b1a306Daniel Dunbar CmdArgs.push_back("-fworking-directory"); 934a3ec60e0cf2a1916f479288998d31bd980b1a306Daniel Dunbar 935a3ec60e0cf2a1916f479288998d31bd980b1a306Daniel Dunbar Args.AddAllArgs(CmdArgs, options::OPT_O); 936a3ec60e0cf2a1916f479288998d31bd980b1a306Daniel Dunbar Args.AddAllArgs(CmdArgs, options::OPT_undef); 937a3ec60e0cf2a1916f479288998d31bd980b1a306Daniel Dunbar if (Args.hasArg(options::OPT_save_temps)) 938a3ec60e0cf2a1916f479288998d31bd980b1a306Daniel Dunbar CmdArgs.push_back("-fpch-preprocess"); 939a3ec60e0cf2a1916f479288998d31bd980b1a306Daniel Dunbar} 940a3ec60e0cf2a1916f479288998d31bd980b1a306Daniel Dunbar 941c21c485b4fb58ef5d55cf3e523263dd824a2ace4Daniel Dunbarvoid darwin::CC1::AddCPPUniqueOptionsArgs(const ArgList &Args, 942a3ec60e0cf2a1916f479288998d31bd980b1a306Daniel Dunbar ArgStringList &CmdArgs, 943a3ec60e0cf2a1916f479288998d31bd980b1a306Daniel Dunbar const InputInfoList &Inputs) const 944a3ec60e0cf2a1916f479288998d31bd980b1a306Daniel Dunbar{ 945a3ec60e0cf2a1916f479288998d31bd980b1a306Daniel Dunbar const Driver &D = getToolChain().getHost().getDriver(); 946a3ec60e0cf2a1916f479288998d31bd980b1a306Daniel Dunbar 947a3ec60e0cf2a1916f479288998d31bd980b1a306Daniel Dunbar // Derived from cpp_unique_options. 948a3ec60e0cf2a1916f479288998d31bd980b1a306Daniel Dunbar Arg *A; 949c21c485b4fb58ef5d55cf3e523263dd824a2ace4Daniel Dunbar if ((A = Args.getLastArg(options::OPT_C)) || 950a3ec60e0cf2a1916f479288998d31bd980b1a306Daniel Dunbar (A = Args.getLastArg(options::OPT_CC))) { 951a3ec60e0cf2a1916f479288998d31bd980b1a306Daniel Dunbar if (!Args.hasArg(options::OPT_E)) 952a3ec60e0cf2a1916f479288998d31bd980b1a306Daniel Dunbar D.Diag(clang::diag::err_drv_argument_only_allowed_with) 953a3ec60e0cf2a1916f479288998d31bd980b1a306Daniel Dunbar << A->getAsString(Args) << "-E"; 954a3ec60e0cf2a1916f479288998d31bd980b1a306Daniel Dunbar } 955a3ec60e0cf2a1916f479288998d31bd980b1a306Daniel Dunbar if (!Args.hasArg(options::OPT_Q)) 956a3ec60e0cf2a1916f479288998d31bd980b1a306Daniel Dunbar CmdArgs.push_back("-quiet"); 957a3ec60e0cf2a1916f479288998d31bd980b1a306Daniel Dunbar Args.AddAllArgs(CmdArgs, options::OPT_nostdinc); 958a3ec60e0cf2a1916f479288998d31bd980b1a306Daniel Dunbar Args.AddLastArg(CmdArgs, options::OPT_v); 959a3ec60e0cf2a1916f479288998d31bd980b1a306Daniel Dunbar Args.AddAllArgs(CmdArgs, options::OPT_I_Group, options::OPT_F); 960a3ec60e0cf2a1916f479288998d31bd980b1a306Daniel Dunbar Args.AddLastArg(CmdArgs, options::OPT_P); 961a3ec60e0cf2a1916f479288998d31bd980b1a306Daniel Dunbar 962a3ec60e0cf2a1916f479288998d31bd980b1a306Daniel Dunbar // FIXME: Handle %I properly. 963a3ec60e0cf2a1916f479288998d31bd980b1a306Daniel Dunbar if (getToolChain().getArchName() == "x86_64") { 964a3ec60e0cf2a1916f479288998d31bd980b1a306Daniel Dunbar CmdArgs.push_back("-imultilib"); 965a3ec60e0cf2a1916f479288998d31bd980b1a306Daniel Dunbar CmdArgs.push_back("x86_64"); 966a3ec60e0cf2a1916f479288998d31bd980b1a306Daniel Dunbar } 967a3ec60e0cf2a1916f479288998d31bd980b1a306Daniel Dunbar 968a3ec60e0cf2a1916f479288998d31bd980b1a306Daniel Dunbar if (Args.hasArg(options::OPT_MD)) { 969a3ec60e0cf2a1916f479288998d31bd980b1a306Daniel Dunbar CmdArgs.push_back("-MD"); 970a5a7bd0de7b6b80212095195a055a4a43f21d4b2Daniel Dunbar CmdArgs.push_back(darwin::CC1::getDependencyFileName(Args, Inputs)); 971a3ec60e0cf2a1916f479288998d31bd980b1a306Daniel Dunbar } 972a3ec60e0cf2a1916f479288998d31bd980b1a306Daniel Dunbar 973a3ec60e0cf2a1916f479288998d31bd980b1a306Daniel Dunbar if (Args.hasArg(options::OPT_MMD)) { 974a3ec60e0cf2a1916f479288998d31bd980b1a306Daniel Dunbar CmdArgs.push_back("-MMD"); 975a5a7bd0de7b6b80212095195a055a4a43f21d4b2Daniel Dunbar CmdArgs.push_back(darwin::CC1::getDependencyFileName(Args, Inputs)); 976a3ec60e0cf2a1916f479288998d31bd980b1a306Daniel Dunbar } 977a3ec60e0cf2a1916f479288998d31bd980b1a306Daniel Dunbar 978a3ec60e0cf2a1916f479288998d31bd980b1a306Daniel Dunbar Args.AddLastArg(CmdArgs, options::OPT_M); 979a3ec60e0cf2a1916f479288998d31bd980b1a306Daniel Dunbar Args.AddLastArg(CmdArgs, options::OPT_MM); 980a3ec60e0cf2a1916f479288998d31bd980b1a306Daniel Dunbar Args.AddAllArgs(CmdArgs, options::OPT_MF); 981a3ec60e0cf2a1916f479288998d31bd980b1a306Daniel Dunbar Args.AddLastArg(CmdArgs, options::OPT_MG); 982a3ec60e0cf2a1916f479288998d31bd980b1a306Daniel Dunbar Args.AddLastArg(CmdArgs, options::OPT_MP); 983a3ec60e0cf2a1916f479288998d31bd980b1a306Daniel Dunbar Args.AddAllArgs(CmdArgs, options::OPT_MQ); 984a3ec60e0cf2a1916f479288998d31bd980b1a306Daniel Dunbar Args.AddAllArgs(CmdArgs, options::OPT_MT); 985a3ec60e0cf2a1916f479288998d31bd980b1a306Daniel Dunbar if (!Args.hasArg(options::OPT_M) && !Args.hasArg(options::OPT_MM) && 986a3ec60e0cf2a1916f479288998d31bd980b1a306Daniel Dunbar (Args.hasArg(options::OPT_MD) || Args.hasArg(options::OPT_MMD))) { 987a3ec60e0cf2a1916f479288998d31bd980b1a306Daniel Dunbar if (Arg *OutputOpt = Args.getLastArg(options::OPT_o)) { 988a3ec60e0cf2a1916f479288998d31bd980b1a306Daniel Dunbar CmdArgs.push_back("-MQ"); 989a3ec60e0cf2a1916f479288998d31bd980b1a306Daniel Dunbar CmdArgs.push_back(OutputOpt->getValue(Args)); 990a3ec60e0cf2a1916f479288998d31bd980b1a306Daniel Dunbar } 991a3ec60e0cf2a1916f479288998d31bd980b1a306Daniel Dunbar } 992a3ec60e0cf2a1916f479288998d31bd980b1a306Daniel Dunbar 993a3ec60e0cf2a1916f479288998d31bd980b1a306Daniel Dunbar Args.AddLastArg(CmdArgs, options::OPT_remap); 994a3ec60e0cf2a1916f479288998d31bd980b1a306Daniel Dunbar if (Args.hasArg(options::OPT_g3)) 995a3ec60e0cf2a1916f479288998d31bd980b1a306Daniel Dunbar CmdArgs.push_back("-dD"); 996a3ec60e0cf2a1916f479288998d31bd980b1a306Daniel Dunbar Args.AddLastArg(CmdArgs, options::OPT_H); 997a3ec60e0cf2a1916f479288998d31bd980b1a306Daniel Dunbar 998a3ec60e0cf2a1916f479288998d31bd980b1a306Daniel Dunbar AddCPPArgs(Args, CmdArgs); 999a3ec60e0cf2a1916f479288998d31bd980b1a306Daniel Dunbar 1000a3ec60e0cf2a1916f479288998d31bd980b1a306Daniel Dunbar Args.AddAllArgs(CmdArgs, options::OPT_D, options::OPT_U, options::OPT_A); 1001a3ec60e0cf2a1916f479288998d31bd980b1a306Daniel Dunbar Args.AddAllArgs(CmdArgs, options::OPT_i_Group); 1002a3ec60e0cf2a1916f479288998d31bd980b1a306Daniel Dunbar 1003a3ec60e0cf2a1916f479288998d31bd980b1a306Daniel Dunbar for (InputInfoList::const_iterator 1004a3ec60e0cf2a1916f479288998d31bd980b1a306Daniel Dunbar it = Inputs.begin(), ie = Inputs.end(); it != ie; ++it) { 1005a3ec60e0cf2a1916f479288998d31bd980b1a306Daniel Dunbar const InputInfo &II = *it; 1006c21c485b4fb58ef5d55cf3e523263dd824a2ace4Daniel Dunbar 1007a3ec60e0cf2a1916f479288998d31bd980b1a306Daniel Dunbar if (II.isPipe()) 1008a3ec60e0cf2a1916f479288998d31bd980b1a306Daniel Dunbar CmdArgs.push_back("-"); 1009a3ec60e0cf2a1916f479288998d31bd980b1a306Daniel Dunbar else 1010a3ec60e0cf2a1916f479288998d31bd980b1a306Daniel Dunbar CmdArgs.push_back(II.getFilename()); 1011a3ec60e0cf2a1916f479288998d31bd980b1a306Daniel Dunbar } 1012a3ec60e0cf2a1916f479288998d31bd980b1a306Daniel Dunbar 1013a3ec60e0cf2a1916f479288998d31bd980b1a306Daniel Dunbar Args.AddAllArgValues(CmdArgs, options::OPT_Wp_COMMA, 1014a3ec60e0cf2a1916f479288998d31bd980b1a306Daniel Dunbar options::OPT_Xpreprocessor); 1015a3ec60e0cf2a1916f479288998d31bd980b1a306Daniel Dunbar 1016a3ec60e0cf2a1916f479288998d31bd980b1a306Daniel Dunbar if (Args.hasArg(options::OPT_fmudflap)) { 1017a3ec60e0cf2a1916f479288998d31bd980b1a306Daniel Dunbar CmdArgs.push_back("-D_MUDFLAP"); 1018a3ec60e0cf2a1916f479288998d31bd980b1a306Daniel Dunbar CmdArgs.push_back("-include"); 1019a3ec60e0cf2a1916f479288998d31bd980b1a306Daniel Dunbar CmdArgs.push_back("mf-runtime.h"); 1020a3ec60e0cf2a1916f479288998d31bd980b1a306Daniel Dunbar } 1021a3ec60e0cf2a1916f479288998d31bd980b1a306Daniel Dunbar 1022a3ec60e0cf2a1916f479288998d31bd980b1a306Daniel Dunbar if (Args.hasArg(options::OPT_fmudflapth)) { 1023a3ec60e0cf2a1916f479288998d31bd980b1a306Daniel Dunbar CmdArgs.push_back("-D_MUDFLAP"); 1024a3ec60e0cf2a1916f479288998d31bd980b1a306Daniel Dunbar CmdArgs.push_back("-D_MUDFLAPTH"); 1025a3ec60e0cf2a1916f479288998d31bd980b1a306Daniel Dunbar CmdArgs.push_back("-include"); 1026a3ec60e0cf2a1916f479288998d31bd980b1a306Daniel Dunbar CmdArgs.push_back("mf-runtime.h"); 1027a3ec60e0cf2a1916f479288998d31bd980b1a306Daniel Dunbar } 1028a3ec60e0cf2a1916f479288998d31bd980b1a306Daniel Dunbar} 1029a3ec60e0cf2a1916f479288998d31bd980b1a306Daniel Dunbar 1030c21c485b4fb58ef5d55cf3e523263dd824a2ace4Daniel Dunbarvoid darwin::CC1::AddCPPArgs(const ArgList &Args, 1031a3ec60e0cf2a1916f479288998d31bd980b1a306Daniel Dunbar ArgStringList &CmdArgs) const { 1032a3ec60e0cf2a1916f479288998d31bd980b1a306Daniel Dunbar // Derived from cpp spec. 1033a3ec60e0cf2a1916f479288998d31bd980b1a306Daniel Dunbar 1034a3ec60e0cf2a1916f479288998d31bd980b1a306Daniel Dunbar if (Args.hasArg(options::OPT_static)) { 1035a3ec60e0cf2a1916f479288998d31bd980b1a306Daniel Dunbar // The gcc spec is broken here, it refers to dynamic but 1036a3ec60e0cf2a1916f479288998d31bd980b1a306Daniel Dunbar // that has been translated. Start by being bug compatible. 1037c21c485b4fb58ef5d55cf3e523263dd824a2ace4Daniel Dunbar 1038a3ec60e0cf2a1916f479288998d31bd980b1a306Daniel Dunbar // if (!Args.hasArg(arglist.parser.dynamicOption)) 1039a3ec60e0cf2a1916f479288998d31bd980b1a306Daniel Dunbar CmdArgs.push_back("-D__STATIC__"); 1040a3ec60e0cf2a1916f479288998d31bd980b1a306Daniel Dunbar } else 1041a3ec60e0cf2a1916f479288998d31bd980b1a306Daniel Dunbar CmdArgs.push_back("-D__DYNAMIC__"); 1042a3ec60e0cf2a1916f479288998d31bd980b1a306Daniel Dunbar 1043a3ec60e0cf2a1916f479288998d31bd980b1a306Daniel Dunbar if (Args.hasArg(options::OPT_pthread)) 1044a3ec60e0cf2a1916f479288998d31bd980b1a306Daniel Dunbar CmdArgs.push_back("-D_REENTRANT"); 1045a3ec60e0cf2a1916f479288998d31bd980b1a306Daniel Dunbar} 1046a3ec60e0cf2a1916f479288998d31bd980b1a306Daniel Dunbar 104740f1265ebd42ece3e7f7917319b56012e8e2bce2Daniel Dunbarvoid darwin::Preprocess::ConstructJob(Compilation &C, const JobAction &JA, 1048c21c485b4fb58ef5d55cf3e523263dd824a2ace4Daniel Dunbar Job &Dest, const InputInfo &Output, 1049c21c485b4fb58ef5d55cf3e523263dd824a2ace4Daniel Dunbar const InputInfoList &Inputs, 1050c21c485b4fb58ef5d55cf3e523263dd824a2ace4Daniel Dunbar const ArgList &Args, 105140f1265ebd42ece3e7f7917319b56012e8e2bce2Daniel Dunbar const char *LinkingOutput) const { 105240f1265ebd42ece3e7f7917319b56012e8e2bce2Daniel Dunbar ArgStringList CmdArgs; 105340f1265ebd42ece3e7f7917319b56012e8e2bce2Daniel Dunbar 105440f1265ebd42ece3e7f7917319b56012e8e2bce2Daniel Dunbar assert(Inputs.size() == 1 && "Unexpected number of inputs!"); 105540f1265ebd42ece3e7f7917319b56012e8e2bce2Daniel Dunbar 105640f1265ebd42ece3e7f7917319b56012e8e2bce2Daniel Dunbar CmdArgs.push_back("-E"); 105740f1265ebd42ece3e7f7917319b56012e8e2bce2Daniel Dunbar 105840f1265ebd42ece3e7f7917319b56012e8e2bce2Daniel Dunbar if (Args.hasArg(options::OPT_traditional) || 105940f1265ebd42ece3e7f7917319b56012e8e2bce2Daniel Dunbar Args.hasArg(options::OPT_ftraditional) || 106040f1265ebd42ece3e7f7917319b56012e8e2bce2Daniel Dunbar Args.hasArg(options::OPT_traditional_cpp)) 106140f1265ebd42ece3e7f7917319b56012e8e2bce2Daniel Dunbar CmdArgs.push_back("-traditional-cpp"); 1062c21c485b4fb58ef5d55cf3e523263dd824a2ace4Daniel Dunbar 106340f1265ebd42ece3e7f7917319b56012e8e2bce2Daniel Dunbar ArgStringList OutputArgs; 106440f1265ebd42ece3e7f7917319b56012e8e2bce2Daniel Dunbar if (Output.isFilename()) { 106540f1265ebd42ece3e7f7917319b56012e8e2bce2Daniel Dunbar OutputArgs.push_back("-o"); 106640f1265ebd42ece3e7f7917319b56012e8e2bce2Daniel Dunbar OutputArgs.push_back(Output.getFilename()); 106740f1265ebd42ece3e7f7917319b56012e8e2bce2Daniel Dunbar } else { 106840f1265ebd42ece3e7f7917319b56012e8e2bce2Daniel Dunbar assert(Output.isPipe() && "Unexpected CC1 output."); 106940f1265ebd42ece3e7f7917319b56012e8e2bce2Daniel Dunbar } 107040f1265ebd42ece3e7f7917319b56012e8e2bce2Daniel Dunbar 10719120f179fd2e354f067e4ef2c76dcf3fc4db8a16Daniel Dunbar if (Args.hasArg(options::OPT_E)) { 10729120f179fd2e354f067e4ef2c76dcf3fc4db8a16Daniel Dunbar AddCPPOptionsArgs(Args, CmdArgs, Inputs, OutputArgs); 10739120f179fd2e354f067e4ef2c76dcf3fc4db8a16Daniel Dunbar } else { 10749120f179fd2e354f067e4ef2c76dcf3fc4db8a16Daniel Dunbar AddCPPOptionsArgs(Args, CmdArgs, Inputs, ArgStringList()); 10759120f179fd2e354f067e4ef2c76dcf3fc4db8a16Daniel Dunbar CmdArgs.append(OutputArgs.begin(), OutputArgs.end()); 10769120f179fd2e354f067e4ef2c76dcf3fc4db8a16Daniel Dunbar } 1077c21c485b4fb58ef5d55cf3e523263dd824a2ace4Daniel Dunbar 10788a2073a85670a13b0bcc1726bc7f80d458f8245bDaniel Dunbar Args.AddAllArgs(CmdArgs, options::OPT_d_Group); 10798a2073a85670a13b0bcc1726bc7f80d458f8245bDaniel Dunbar 108040f1265ebd42ece3e7f7917319b56012e8e2bce2Daniel Dunbar const char *CC1Name = getCC1Name(Inputs[0].getType()); 1081c21c485b4fb58ef5d55cf3e523263dd824a2ace4Daniel Dunbar const char *Exec = 108240f1265ebd42ece3e7f7917319b56012e8e2bce2Daniel Dunbar Args.MakeArgString(getToolChain().GetProgramPath(C, CC1Name).c_str()); 1083c21c485b4fb58ef5d55cf3e523263dd824a2ace4Daniel Dunbar Dest.addCommand(new Command(Exec, CmdArgs)); 108440f1265ebd42ece3e7f7917319b56012e8e2bce2Daniel Dunbar} 108540f1265ebd42ece3e7f7917319b56012e8e2bce2Daniel Dunbar 108640f1265ebd42ece3e7f7917319b56012e8e2bce2Daniel Dunbarvoid darwin::Compile::ConstructJob(Compilation &C, const JobAction &JA, 1087c21c485b4fb58ef5d55cf3e523263dd824a2ace4Daniel Dunbar Job &Dest, const InputInfo &Output, 1088c21c485b4fb58ef5d55cf3e523263dd824a2ace4Daniel Dunbar const InputInfoList &Inputs, 1089c21c485b4fb58ef5d55cf3e523263dd824a2ace4Daniel Dunbar const ArgList &Args, 109040f1265ebd42ece3e7f7917319b56012e8e2bce2Daniel Dunbar const char *LinkingOutput) const { 109140f1265ebd42ece3e7f7917319b56012e8e2bce2Daniel Dunbar const Driver &D = getToolChain().getHost().getDriver(); 109240f1265ebd42ece3e7f7917319b56012e8e2bce2Daniel Dunbar ArgStringList CmdArgs; 109340f1265ebd42ece3e7f7917319b56012e8e2bce2Daniel Dunbar 109440f1265ebd42ece3e7f7917319b56012e8e2bce2Daniel Dunbar assert(Inputs.size() == 1 && "Unexpected number of inputs!"); 109540f1265ebd42ece3e7f7917319b56012e8e2bce2Daniel Dunbar 109640f1265ebd42ece3e7f7917319b56012e8e2bce2Daniel Dunbar types::ID InputType = Inputs[0].getType(); 109740f1265ebd42ece3e7f7917319b56012e8e2bce2Daniel Dunbar const Arg *A; 1098c21c485b4fb58ef5d55cf3e523263dd824a2ace4Daniel Dunbar if ((A = Args.getLastArg(options::OPT_traditional)) || 109940f1265ebd42ece3e7f7917319b56012e8e2bce2Daniel Dunbar (A = Args.getLastArg(options::OPT_ftraditional))) 110040f1265ebd42ece3e7f7917319b56012e8e2bce2Daniel Dunbar D.Diag(clang::diag::err_drv_argument_only_allowed_with) 110140f1265ebd42ece3e7f7917319b56012e8e2bce2Daniel Dunbar << A->getAsString(Args) << "-E"; 110240f1265ebd42ece3e7f7917319b56012e8e2bce2Daniel Dunbar 110340f1265ebd42ece3e7f7917319b56012e8e2bce2Daniel Dunbar if (Output.getType() == types::TY_LLVMAsm) 110440f1265ebd42ece3e7f7917319b56012e8e2bce2Daniel Dunbar CmdArgs.push_back("-emit-llvm"); 110540f1265ebd42ece3e7f7917319b56012e8e2bce2Daniel Dunbar else if (Output.getType() == types::TY_LLVMBC) 110640f1265ebd42ece3e7f7917319b56012e8e2bce2Daniel Dunbar CmdArgs.push_back("-emit-llvm-bc"); 110740f1265ebd42ece3e7f7917319b56012e8e2bce2Daniel Dunbar 110840f1265ebd42ece3e7f7917319b56012e8e2bce2Daniel Dunbar ArgStringList OutputArgs; 110940f1265ebd42ece3e7f7917319b56012e8e2bce2Daniel Dunbar if (Output.getType() != types::TY_PCH) { 111040f1265ebd42ece3e7f7917319b56012e8e2bce2Daniel Dunbar OutputArgs.push_back("-o"); 111140f1265ebd42ece3e7f7917319b56012e8e2bce2Daniel Dunbar if (Output.isPipe()) 111240f1265ebd42ece3e7f7917319b56012e8e2bce2Daniel Dunbar OutputArgs.push_back("-"); 111340f1265ebd42ece3e7f7917319b56012e8e2bce2Daniel Dunbar else if (Output.isNothing()) 111440f1265ebd42ece3e7f7917319b56012e8e2bce2Daniel Dunbar OutputArgs.push_back("/dev/null"); 111540f1265ebd42ece3e7f7917319b56012e8e2bce2Daniel Dunbar else 111640f1265ebd42ece3e7f7917319b56012e8e2bce2Daniel Dunbar OutputArgs.push_back(Output.getFilename()); 111740f1265ebd42ece3e7f7917319b56012e8e2bce2Daniel Dunbar } 111840f1265ebd42ece3e7f7917319b56012e8e2bce2Daniel Dunbar 111940f1265ebd42ece3e7f7917319b56012e8e2bce2Daniel Dunbar // There is no need for this level of compatibility, but it makes 112040f1265ebd42ece3e7f7917319b56012e8e2bce2Daniel Dunbar // diffing easier. 112140f1265ebd42ece3e7f7917319b56012e8e2bce2Daniel Dunbar bool OutputArgsEarly = (Args.hasArg(options::OPT_fsyntax_only) || 112240f1265ebd42ece3e7f7917319b56012e8e2bce2Daniel Dunbar Args.hasArg(options::OPT_S)); 112340f1265ebd42ece3e7f7917319b56012e8e2bce2Daniel Dunbar 112440f1265ebd42ece3e7f7917319b56012e8e2bce2Daniel Dunbar if (types::getPreprocessedType(InputType) != types::TY_INVALID) { 1125a3ec60e0cf2a1916f479288998d31bd980b1a306Daniel Dunbar AddCPPUniqueOptionsArgs(Args, CmdArgs, Inputs); 112640f1265ebd42ece3e7f7917319b56012e8e2bce2Daniel Dunbar if (OutputArgsEarly) { 112740f1265ebd42ece3e7f7917319b56012e8e2bce2Daniel Dunbar AddCC1OptionsArgs(Args, CmdArgs, Inputs, OutputArgs); 112840f1265ebd42ece3e7f7917319b56012e8e2bce2Daniel Dunbar } else { 112940f1265ebd42ece3e7f7917319b56012e8e2bce2Daniel Dunbar AddCC1OptionsArgs(Args, CmdArgs, Inputs, ArgStringList()); 113040f1265ebd42ece3e7f7917319b56012e8e2bce2Daniel Dunbar CmdArgs.append(OutputArgs.begin(), OutputArgs.end()); 113140f1265ebd42ece3e7f7917319b56012e8e2bce2Daniel Dunbar } 113240f1265ebd42ece3e7f7917319b56012e8e2bce2Daniel Dunbar } else { 113340f1265ebd42ece3e7f7917319b56012e8e2bce2Daniel Dunbar CmdArgs.push_back("-fpreprocessed"); 1134c21c485b4fb58ef5d55cf3e523263dd824a2ace4Daniel Dunbar 113540f1265ebd42ece3e7f7917319b56012e8e2bce2Daniel Dunbar // FIXME: There is a spec command to remove 113640f1265ebd42ece3e7f7917319b56012e8e2bce2Daniel Dunbar // -fpredictive-compilation args here. Investigate. 113740f1265ebd42ece3e7f7917319b56012e8e2bce2Daniel Dunbar 113840f1265ebd42ece3e7f7917319b56012e8e2bce2Daniel Dunbar for (InputInfoList::const_iterator 113940f1265ebd42ece3e7f7917319b56012e8e2bce2Daniel Dunbar it = Inputs.begin(), ie = Inputs.end(); it != ie; ++it) { 114040f1265ebd42ece3e7f7917319b56012e8e2bce2Daniel Dunbar const InputInfo &II = *it; 114140f1265ebd42ece3e7f7917319b56012e8e2bce2Daniel Dunbar 114240f1265ebd42ece3e7f7917319b56012e8e2bce2Daniel Dunbar if (II.isPipe()) 114340f1265ebd42ece3e7f7917319b56012e8e2bce2Daniel Dunbar CmdArgs.push_back("-"); 114440f1265ebd42ece3e7f7917319b56012e8e2bce2Daniel Dunbar else 114540f1265ebd42ece3e7f7917319b56012e8e2bce2Daniel Dunbar CmdArgs.push_back(II.getFilename()); 114640f1265ebd42ece3e7f7917319b56012e8e2bce2Daniel Dunbar } 114740f1265ebd42ece3e7f7917319b56012e8e2bce2Daniel Dunbar 114840f1265ebd42ece3e7f7917319b56012e8e2bce2Daniel Dunbar if (OutputArgsEarly) { 114940f1265ebd42ece3e7f7917319b56012e8e2bce2Daniel Dunbar AddCC1OptionsArgs(Args, CmdArgs, Inputs, OutputArgs); 115040f1265ebd42ece3e7f7917319b56012e8e2bce2Daniel Dunbar } else { 115140f1265ebd42ece3e7f7917319b56012e8e2bce2Daniel Dunbar AddCC1OptionsArgs(Args, CmdArgs, Inputs, ArgStringList()); 115240f1265ebd42ece3e7f7917319b56012e8e2bce2Daniel Dunbar CmdArgs.append(OutputArgs.begin(), OutputArgs.end()); 115340f1265ebd42ece3e7f7917319b56012e8e2bce2Daniel Dunbar } 115440f1265ebd42ece3e7f7917319b56012e8e2bce2Daniel Dunbar } 1155c21c485b4fb58ef5d55cf3e523263dd824a2ace4Daniel Dunbar 115640f1265ebd42ece3e7f7917319b56012e8e2bce2Daniel Dunbar if (Output.getType() == types::TY_PCH) { 115740f1265ebd42ece3e7f7917319b56012e8e2bce2Daniel Dunbar assert(Output.isFilename() && "Invalid PCH output."); 115840f1265ebd42ece3e7f7917319b56012e8e2bce2Daniel Dunbar 115940f1265ebd42ece3e7f7917319b56012e8e2bce2Daniel Dunbar CmdArgs.push_back("-o"); 116040f1265ebd42ece3e7f7917319b56012e8e2bce2Daniel Dunbar // NOTE: gcc uses a temp .s file for this, but there doesn't seem 116140f1265ebd42ece3e7f7917319b56012e8e2bce2Daniel Dunbar // to be a good reason. 116240f1265ebd42ece3e7f7917319b56012e8e2bce2Daniel Dunbar CmdArgs.push_back("/dev/null"); 1163c21c485b4fb58ef5d55cf3e523263dd824a2ace4Daniel Dunbar 116440f1265ebd42ece3e7f7917319b56012e8e2bce2Daniel Dunbar CmdArgs.push_back("--output-pch="); 116540f1265ebd42ece3e7f7917319b56012e8e2bce2Daniel Dunbar CmdArgs.push_back(Output.getFilename()); 1166c21c485b4fb58ef5d55cf3e523263dd824a2ace4Daniel Dunbar } 116740f1265ebd42ece3e7f7917319b56012e8e2bce2Daniel Dunbar 116840f1265ebd42ece3e7f7917319b56012e8e2bce2Daniel Dunbar const char *CC1Name = getCC1Name(Inputs[0].getType()); 1169c21c485b4fb58ef5d55cf3e523263dd824a2ace4Daniel Dunbar const char *Exec = 117040f1265ebd42ece3e7f7917319b56012e8e2bce2Daniel Dunbar Args.MakeArgString(getToolChain().GetProgramPath(C, CC1Name).c_str()); 1171c21c485b4fb58ef5d55cf3e523263dd824a2ace4Daniel Dunbar Dest.addCommand(new Command(Exec, CmdArgs)); 117240f1265ebd42ece3e7f7917319b56012e8e2bce2Daniel Dunbar} 117340f1265ebd42ece3e7f7917319b56012e8e2bce2Daniel Dunbar 11748cac5f7e1ce63dd77ee0fb4ef68f9fa804f41ea6Daniel Dunbarvoid darwin::Assemble::ConstructJob(Compilation &C, const JobAction &JA, 1175c21c485b4fb58ef5d55cf3e523263dd824a2ace4Daniel Dunbar Job &Dest, const InputInfo &Output, 1176c21c485b4fb58ef5d55cf3e523263dd824a2ace4Daniel Dunbar const InputInfoList &Inputs, 1177c21c485b4fb58ef5d55cf3e523263dd824a2ace4Daniel Dunbar const ArgList &Args, 11788cac5f7e1ce63dd77ee0fb4ef68f9fa804f41ea6Daniel Dunbar const char *LinkingOutput) const { 11798cac5f7e1ce63dd77ee0fb4ef68f9fa804f41ea6Daniel Dunbar ArgStringList CmdArgs; 11808cac5f7e1ce63dd77ee0fb4ef68f9fa804f41ea6Daniel Dunbar 11818cac5f7e1ce63dd77ee0fb4ef68f9fa804f41ea6Daniel Dunbar assert(Inputs.size() == 1 && "Unexpected number of inputs."); 11828cac5f7e1ce63dd77ee0fb4ef68f9fa804f41ea6Daniel Dunbar const InputInfo &Input = Inputs[0]; 11838cac5f7e1ce63dd77ee0fb4ef68f9fa804f41ea6Daniel Dunbar 11848cac5f7e1ce63dd77ee0fb4ef68f9fa804f41ea6Daniel Dunbar // Bit of a hack, this is only used for original inputs. 1185c21c485b4fb58ef5d55cf3e523263dd824a2ace4Daniel Dunbar // 11868e4fea6750dbac032c172f3279c63b7815b7423eDaniel Dunbar // FIXME: This is broken for preprocessed .s inputs. 11878cac5f7e1ce63dd77ee0fb4ef68f9fa804f41ea6Daniel Dunbar if (Input.isFilename() && 11888e4fea6750dbac032c172f3279c63b7815b7423eDaniel Dunbar strcmp(Input.getFilename(), Input.getBaseInput()) == 0) { 11898e4fea6750dbac032c172f3279c63b7815b7423eDaniel Dunbar if (Args.hasArg(options::OPT_gstabs)) 11908e4fea6750dbac032c172f3279c63b7815b7423eDaniel Dunbar CmdArgs.push_back("--gstabs"); 11918e4fea6750dbac032c172f3279c63b7815b7423eDaniel Dunbar else if (Args.hasArg(options::OPT_g_Group)) 11928e4fea6750dbac032c172f3279c63b7815b7423eDaniel Dunbar CmdArgs.push_back("--gdwarf2"); 11938e4fea6750dbac032c172f3279c63b7815b7423eDaniel Dunbar } 1194c21c485b4fb58ef5d55cf3e523263dd824a2ace4Daniel Dunbar 11958cac5f7e1ce63dd77ee0fb4ef68f9fa804f41ea6Daniel Dunbar // Derived from asm spec. 11968cac5f7e1ce63dd77ee0fb4ef68f9fa804f41ea6Daniel Dunbar CmdArgs.push_back("-arch"); 11978cac5f7e1ce63dd77ee0fb4ef68f9fa804f41ea6Daniel Dunbar CmdArgs.push_back(getToolChain().getArchName().c_str()); 11988cac5f7e1ce63dd77ee0fb4ef68f9fa804f41ea6Daniel Dunbar 11998cac5f7e1ce63dd77ee0fb4ef68f9fa804f41ea6Daniel Dunbar CmdArgs.push_back("-force_cpusubtype_ALL"); 12008cac5f7e1ce63dd77ee0fb4ef68f9fa804f41ea6Daniel Dunbar if ((Args.hasArg(options::OPT_mkernel) || 12018cac5f7e1ce63dd77ee0fb4ef68f9fa804f41ea6Daniel Dunbar Args.hasArg(options::OPT_static) || 12028cac5f7e1ce63dd77ee0fb4ef68f9fa804f41ea6Daniel Dunbar Args.hasArg(options::OPT_fapple_kext)) && 12038cac5f7e1ce63dd77ee0fb4ef68f9fa804f41ea6Daniel Dunbar !Args.hasArg(options::OPT_dynamic)) 1204c21c485b4fb58ef5d55cf3e523263dd824a2ace4Daniel Dunbar CmdArgs.push_back("-static"); 1205c21c485b4fb58ef5d55cf3e523263dd824a2ace4Daniel Dunbar 12068cac5f7e1ce63dd77ee0fb4ef68f9fa804f41ea6Daniel Dunbar Args.AddAllArgValues(CmdArgs, options::OPT_Wa_COMMA, 12078cac5f7e1ce63dd77ee0fb4ef68f9fa804f41ea6Daniel Dunbar options::OPT_Xassembler); 12088cac5f7e1ce63dd77ee0fb4ef68f9fa804f41ea6Daniel Dunbar 12098cac5f7e1ce63dd77ee0fb4ef68f9fa804f41ea6Daniel Dunbar assert(Output.isFilename() && "Unexpected lipo output."); 12108cac5f7e1ce63dd77ee0fb4ef68f9fa804f41ea6Daniel Dunbar CmdArgs.push_back("-o"); 12118cac5f7e1ce63dd77ee0fb4ef68f9fa804f41ea6Daniel Dunbar CmdArgs.push_back(Output.getFilename()); 12128cac5f7e1ce63dd77ee0fb4ef68f9fa804f41ea6Daniel Dunbar 12138cac5f7e1ce63dd77ee0fb4ef68f9fa804f41ea6Daniel Dunbar if (Input.isPipe()) { 12148cac5f7e1ce63dd77ee0fb4ef68f9fa804f41ea6Daniel Dunbar CmdArgs.push_back("-"); 12158cac5f7e1ce63dd77ee0fb4ef68f9fa804f41ea6Daniel Dunbar } else { 12168cac5f7e1ce63dd77ee0fb4ef68f9fa804f41ea6Daniel Dunbar assert(Input.isFilename() && "Invalid input."); 12178cac5f7e1ce63dd77ee0fb4ef68f9fa804f41ea6Daniel Dunbar CmdArgs.push_back(Input.getFilename()); 12188cac5f7e1ce63dd77ee0fb4ef68f9fa804f41ea6Daniel Dunbar } 12198cac5f7e1ce63dd77ee0fb4ef68f9fa804f41ea6Daniel Dunbar 12208cac5f7e1ce63dd77ee0fb4ef68f9fa804f41ea6Daniel Dunbar // asm_final spec is empty. 12218cac5f7e1ce63dd77ee0fb4ef68f9fa804f41ea6Daniel Dunbar 1222c21c485b4fb58ef5d55cf3e523263dd824a2ace4Daniel Dunbar const char *Exec = 12238cac5f7e1ce63dd77ee0fb4ef68f9fa804f41ea6Daniel Dunbar Args.MakeArgString(getToolChain().GetProgramPath(C, "as").c_str()); 12248cac5f7e1ce63dd77ee0fb4ef68f9fa804f41ea6Daniel Dunbar Dest.addCommand(new Command(Exec, CmdArgs)); 12258cac5f7e1ce63dd77ee0fb4ef68f9fa804f41ea6Daniel Dunbar} 1226ff7488dc9a766f94daf54d81b03ab9160d0bfd88Daniel Dunbar 122702633b541b04ad5ffc1c70f4c2feeeb13e607057Daniel Dunbar/// Helper routine for seeing if we should use dsymutil; this is a 122802633b541b04ad5ffc1c70f4c2feeeb13e607057Daniel Dunbar/// gcc compatible hack, we should remove it and use the input 122902633b541b04ad5ffc1c70f4c2feeeb13e607057Daniel Dunbar/// type information. 123002633b541b04ad5ffc1c70f4c2feeeb13e607057Daniel Dunbarstatic bool isSourceSuffix(const char *Str) { 123102633b541b04ad5ffc1c70f4c2feeeb13e607057Daniel Dunbar // match: 'C', 'CPP', 'c', 'cc', 'cp', 'c++', 'cpp', 'cxx', 'm', 123202633b541b04ad5ffc1c70f4c2feeeb13e607057Daniel Dunbar // 'mm'. 123302633b541b04ad5ffc1c70f4c2feeeb13e607057Daniel Dunbar switch (strlen(Str)) { 123402633b541b04ad5ffc1c70f4c2feeeb13e607057Daniel Dunbar default: 123502633b541b04ad5ffc1c70f4c2feeeb13e607057Daniel Dunbar return false; 123602633b541b04ad5ffc1c70f4c2feeeb13e607057Daniel Dunbar case 1: 123702633b541b04ad5ffc1c70f4c2feeeb13e607057Daniel Dunbar return (memcmp(Str, "C", 1) == 0 || 123802633b541b04ad5ffc1c70f4c2feeeb13e607057Daniel Dunbar memcmp(Str, "c", 1) == 0 || 123902633b541b04ad5ffc1c70f4c2feeeb13e607057Daniel Dunbar memcmp(Str, "m", 1) == 0); 124002633b541b04ad5ffc1c70f4c2feeeb13e607057Daniel Dunbar case 2: 124102633b541b04ad5ffc1c70f4c2feeeb13e607057Daniel Dunbar return (memcmp(Str, "cc", 2) == 0 || 124202633b541b04ad5ffc1c70f4c2feeeb13e607057Daniel Dunbar memcmp(Str, "cp", 2) == 0 || 124302633b541b04ad5ffc1c70f4c2feeeb13e607057Daniel Dunbar memcmp(Str, "mm", 2) == 0); 124402633b541b04ad5ffc1c70f4c2feeeb13e607057Daniel Dunbar case 3: 124502633b541b04ad5ffc1c70f4c2feeeb13e607057Daniel Dunbar return (memcmp(Str, "CPP", 3) == 0 || 124602633b541b04ad5ffc1c70f4c2feeeb13e607057Daniel Dunbar memcmp(Str, "c++", 3) == 0 || 124702633b541b04ad5ffc1c70f4c2feeeb13e607057Daniel Dunbar memcmp(Str, "cpp", 3) == 0 || 124802633b541b04ad5ffc1c70f4c2feeeb13e607057Daniel Dunbar memcmp(Str, "cxx", 3) == 0); 124902633b541b04ad5ffc1c70f4c2feeeb13e607057Daniel Dunbar } 125002633b541b04ad5ffc1c70f4c2feeeb13e607057Daniel Dunbar} 125102633b541b04ad5ffc1c70f4c2feeeb13e607057Daniel Dunbar 125202633b541b04ad5ffc1c70f4c2feeeb13e607057Daniel Dunbarstatic bool isMacosxVersionLT(unsigned (&A)[3], unsigned (&B)[3]) { 125302633b541b04ad5ffc1c70f4c2feeeb13e607057Daniel Dunbar for (unsigned i=0; i < 3; ++i) { 125402633b541b04ad5ffc1c70f4c2feeeb13e607057Daniel Dunbar if (A[i] > B[i]) return false; 125502633b541b04ad5ffc1c70f4c2feeeb13e607057Daniel Dunbar if (A[i] < B[i]) return true; 125602633b541b04ad5ffc1c70f4c2feeeb13e607057Daniel Dunbar } 125702633b541b04ad5ffc1c70f4c2feeeb13e607057Daniel Dunbar return false; 125802633b541b04ad5ffc1c70f4c2feeeb13e607057Daniel Dunbar} 125902633b541b04ad5ffc1c70f4c2feeeb13e607057Daniel Dunbar 1260c21c485b4fb58ef5d55cf3e523263dd824a2ace4Daniel Dunbarstatic bool isMacosxVersionLT(unsigned (&A)[3], 126102633b541b04ad5ffc1c70f4c2feeeb13e607057Daniel Dunbar unsigned V0, unsigned V1=0, unsigned V2=0) { 126202633b541b04ad5ffc1c70f4c2feeeb13e607057Daniel Dunbar unsigned B[3] = { V0, V1, V2 }; 126302633b541b04ad5ffc1c70f4c2feeeb13e607057Daniel Dunbar return isMacosxVersionLT(A, B); 126402633b541b04ad5ffc1c70f4c2feeeb13e607057Daniel Dunbar} 126502633b541b04ad5ffc1c70f4c2feeeb13e607057Daniel Dunbar 126602633b541b04ad5ffc1c70f4c2feeeb13e607057Daniel Dunbarconst toolchains::Darwin_X86 &darwin::Link::getDarwinToolChain() const { 126702633b541b04ad5ffc1c70f4c2feeeb13e607057Daniel Dunbar return reinterpret_cast<const toolchains::Darwin_X86&>(getToolChain()); 126802633b541b04ad5ffc1c70f4c2feeeb13e607057Daniel Dunbar} 126902633b541b04ad5ffc1c70f4c2feeeb13e607057Daniel Dunbar 1270c21c485b4fb58ef5d55cf3e523263dd824a2ace4Daniel Dunbarvoid darwin::Link::AddDarwinArch(const ArgList &Args, 127102633b541b04ad5ffc1c70f4c2feeeb13e607057Daniel Dunbar ArgStringList &CmdArgs) const { 127202633b541b04ad5ffc1c70f4c2feeeb13e607057Daniel Dunbar // Derived from darwin_arch spec. 127302633b541b04ad5ffc1c70f4c2feeeb13e607057Daniel Dunbar CmdArgs.push_back("-arch"); 127402633b541b04ad5ffc1c70f4c2feeeb13e607057Daniel Dunbar CmdArgs.push_back(getToolChain().getArchName().c_str()); 127502633b541b04ad5ffc1c70f4c2feeeb13e607057Daniel Dunbar} 127602633b541b04ad5ffc1c70f4c2feeeb13e607057Daniel Dunbar 1277c21c485b4fb58ef5d55cf3e523263dd824a2ace4Daniel Dunbarvoid darwin::Link::AddDarwinSubArch(const ArgList &Args, 127802633b541b04ad5ffc1c70f4c2feeeb13e607057Daniel Dunbar ArgStringList &CmdArgs) const { 127902633b541b04ad5ffc1c70f4c2feeeb13e607057Daniel Dunbar // Derived from darwin_subarch spec, not sure what the distinction 128002633b541b04ad5ffc1c70f4c2feeeb13e607057Daniel Dunbar // exists for but at least for this chain it is the same. 128102633b541b04ad5ffc1c70f4c2feeeb13e607057Daniel Dunbar AddDarwinArch(Args, CmdArgs); 128202633b541b04ad5ffc1c70f4c2feeeb13e607057Daniel Dunbar} 128302633b541b04ad5ffc1c70f4c2feeeb13e607057Daniel Dunbar 1284c21c485b4fb58ef5d55cf3e523263dd824a2ace4Daniel Dunbarvoid darwin::Link::AddLinkArgs(const ArgList &Args, 128502633b541b04ad5ffc1c70f4c2feeeb13e607057Daniel Dunbar ArgStringList &CmdArgs) const { 128602633b541b04ad5ffc1c70f4c2feeeb13e607057Daniel Dunbar const Driver &D = getToolChain().getHost().getDriver(); 128702633b541b04ad5ffc1c70f4c2feeeb13e607057Daniel Dunbar 128802633b541b04ad5ffc1c70f4c2feeeb13e607057Daniel Dunbar // Derived from the "link" spec. 128902633b541b04ad5ffc1c70f4c2feeeb13e607057Daniel Dunbar Args.AddAllArgs(CmdArgs, options::OPT_static); 129002633b541b04ad5ffc1c70f4c2feeeb13e607057Daniel Dunbar if (!Args.hasArg(options::OPT_static)) 129102633b541b04ad5ffc1c70f4c2feeeb13e607057Daniel Dunbar CmdArgs.push_back("-dynamic"); 129202633b541b04ad5ffc1c70f4c2feeeb13e607057Daniel Dunbar if (Args.hasArg(options::OPT_fgnu_runtime)) { 129302633b541b04ad5ffc1c70f4c2feeeb13e607057Daniel Dunbar // FIXME: gcc replaces -lobjc in forward args with -lobjc-gnu 129402633b541b04ad5ffc1c70f4c2feeeb13e607057Daniel Dunbar // here. How do we wish to handle such things? 129502633b541b04ad5ffc1c70f4c2feeeb13e607057Daniel Dunbar } 1296c21c485b4fb58ef5d55cf3e523263dd824a2ace4Daniel Dunbar 129702633b541b04ad5ffc1c70f4c2feeeb13e607057Daniel Dunbar if (!Args.hasArg(options::OPT_dynamiclib)) { 129802633b541b04ad5ffc1c70f4c2feeeb13e607057Daniel Dunbar if (Args.hasArg(options::OPT_force__cpusubtype__ALL)) { 129902633b541b04ad5ffc1c70f4c2feeeb13e607057Daniel Dunbar AddDarwinArch(Args, CmdArgs); 130002633b541b04ad5ffc1c70f4c2feeeb13e607057Daniel Dunbar CmdArgs.push_back("-force_cpusubtype_ALL"); 130102633b541b04ad5ffc1c70f4c2feeeb13e607057Daniel Dunbar } else 130202633b541b04ad5ffc1c70f4c2feeeb13e607057Daniel Dunbar AddDarwinSubArch(Args, CmdArgs); 130302633b541b04ad5ffc1c70f4c2feeeb13e607057Daniel Dunbar 130402633b541b04ad5ffc1c70f4c2feeeb13e607057Daniel Dunbar Args.AddLastArg(CmdArgs, options::OPT_bundle); 130502633b541b04ad5ffc1c70f4c2feeeb13e607057Daniel Dunbar Args.AddAllArgs(CmdArgs, options::OPT_bundle__loader); 130602633b541b04ad5ffc1c70f4c2feeeb13e607057Daniel Dunbar Args.AddAllArgs(CmdArgs, options::OPT_client__name); 130702633b541b04ad5ffc1c70f4c2feeeb13e607057Daniel Dunbar 130802633b541b04ad5ffc1c70f4c2feeeb13e607057Daniel Dunbar Arg *A; 130902633b541b04ad5ffc1c70f4c2feeeb13e607057Daniel Dunbar if ((A = Args.getLastArg(options::OPT_compatibility__version)) || 131002633b541b04ad5ffc1c70f4c2feeeb13e607057Daniel Dunbar (A = Args.getLastArg(options::OPT_current__version)) || 131102633b541b04ad5ffc1c70f4c2feeeb13e607057Daniel Dunbar (A = Args.getLastArg(options::OPT_install__name))) 131202633b541b04ad5ffc1c70f4c2feeeb13e607057Daniel Dunbar D.Diag(clang::diag::err_drv_argument_only_allowed_with) 131302633b541b04ad5ffc1c70f4c2feeeb13e607057Daniel Dunbar << A->getAsString(Args) << "-dynamiclib"; 131402633b541b04ad5ffc1c70f4c2feeeb13e607057Daniel Dunbar 131502633b541b04ad5ffc1c70f4c2feeeb13e607057Daniel Dunbar Args.AddLastArg(CmdArgs, options::OPT_force__flat__namespace); 131602633b541b04ad5ffc1c70f4c2feeeb13e607057Daniel Dunbar Args.AddLastArg(CmdArgs, options::OPT_keep__private__externs); 131702633b541b04ad5ffc1c70f4c2feeeb13e607057Daniel Dunbar Args.AddLastArg(CmdArgs, options::OPT_private__bundle); 131802633b541b04ad5ffc1c70f4c2feeeb13e607057Daniel Dunbar } else { 131902633b541b04ad5ffc1c70f4c2feeeb13e607057Daniel Dunbar CmdArgs.push_back("-dylib"); 132002633b541b04ad5ffc1c70f4c2feeeb13e607057Daniel Dunbar 132102633b541b04ad5ffc1c70f4c2feeeb13e607057Daniel Dunbar Arg *A; 132202633b541b04ad5ffc1c70f4c2feeeb13e607057Daniel Dunbar if ((A = Args.getLastArg(options::OPT_bundle)) || 132302633b541b04ad5ffc1c70f4c2feeeb13e607057Daniel Dunbar (A = Args.getLastArg(options::OPT_bundle__loader)) || 132402633b541b04ad5ffc1c70f4c2feeeb13e607057Daniel Dunbar (A = Args.getLastArg(options::OPT_client__name)) || 132502633b541b04ad5ffc1c70f4c2feeeb13e607057Daniel Dunbar (A = Args.getLastArg(options::OPT_force__flat__namespace)) || 132602633b541b04ad5ffc1c70f4c2feeeb13e607057Daniel Dunbar (A = Args.getLastArg(options::OPT_keep__private__externs)) || 132702633b541b04ad5ffc1c70f4c2feeeb13e607057Daniel Dunbar (A = Args.getLastArg(options::OPT_private__bundle))) 132802633b541b04ad5ffc1c70f4c2feeeb13e607057Daniel Dunbar D.Diag(clang::diag::err_drv_argument_not_allowed_with) 132902633b541b04ad5ffc1c70f4c2feeeb13e607057Daniel Dunbar << A->getAsString(Args) << "-dynamiclib"; 1330c21c485b4fb58ef5d55cf3e523263dd824a2ace4Daniel Dunbar 133102633b541b04ad5ffc1c70f4c2feeeb13e607057Daniel Dunbar Args.AddAllArgsTranslated(CmdArgs, options::OPT_compatibility__version, 133202633b541b04ad5ffc1c70f4c2feeeb13e607057Daniel Dunbar "-dylib_compatibility_version"); 133302633b541b04ad5ffc1c70f4c2feeeb13e607057Daniel Dunbar Args.AddAllArgsTranslated(CmdArgs, options::OPT_current__version, 133402633b541b04ad5ffc1c70f4c2feeeb13e607057Daniel Dunbar "-dylib_current_version"); 133502633b541b04ad5ffc1c70f4c2feeeb13e607057Daniel Dunbar 133602633b541b04ad5ffc1c70f4c2feeeb13e607057Daniel Dunbar if (Args.hasArg(options::OPT_force__cpusubtype__ALL)) { 133702633b541b04ad5ffc1c70f4c2feeeb13e607057Daniel Dunbar AddDarwinArch(Args, CmdArgs); 1338c21c485b4fb58ef5d55cf3e523263dd824a2ace4Daniel Dunbar // NOTE: We don't add -force_cpusubtype_ALL on this path. Ok. 133902633b541b04ad5ffc1c70f4c2feeeb13e607057Daniel Dunbar } else 134002633b541b04ad5ffc1c70f4c2feeeb13e607057Daniel Dunbar AddDarwinSubArch(Args, CmdArgs); 134102633b541b04ad5ffc1c70f4c2feeeb13e607057Daniel Dunbar 134202633b541b04ad5ffc1c70f4c2feeeb13e607057Daniel Dunbar Args.AddAllArgsTranslated(CmdArgs, options::OPT_install__name, 134302633b541b04ad5ffc1c70f4c2feeeb13e607057Daniel Dunbar "-dylib_install_name"); 134402633b541b04ad5ffc1c70f4c2feeeb13e607057Daniel Dunbar } 134502633b541b04ad5ffc1c70f4c2feeeb13e607057Daniel Dunbar 134602633b541b04ad5ffc1c70f4c2feeeb13e607057Daniel Dunbar Args.AddLastArg(CmdArgs, options::OPT_all__load); 134702633b541b04ad5ffc1c70f4c2feeeb13e607057Daniel Dunbar Args.AddAllArgs(CmdArgs, options::OPT_allowable__client); 134802633b541b04ad5ffc1c70f4c2feeeb13e607057Daniel Dunbar Args.AddLastArg(CmdArgs, options::OPT_bind__at__load); 134902633b541b04ad5ffc1c70f4c2feeeb13e607057Daniel Dunbar Args.AddLastArg(CmdArgs, options::OPT_dead__strip); 135002633b541b04ad5ffc1c70f4c2feeeb13e607057Daniel Dunbar Args.AddLastArg(CmdArgs, options::OPT_no__dead__strip__inits__and__terms); 135102633b541b04ad5ffc1c70f4c2feeeb13e607057Daniel Dunbar Args.AddAllArgs(CmdArgs, options::OPT_dylib__file); 135202633b541b04ad5ffc1c70f4c2feeeb13e607057Daniel Dunbar Args.AddLastArg(CmdArgs, options::OPT_dynamic); 135302633b541b04ad5ffc1c70f4c2feeeb13e607057Daniel Dunbar Args.AddAllArgs(CmdArgs, options::OPT_exported__symbols__list); 135402633b541b04ad5ffc1c70f4c2feeeb13e607057Daniel Dunbar Args.AddLastArg(CmdArgs, options::OPT_flat__namespace); 135502633b541b04ad5ffc1c70f4c2feeeb13e607057Daniel Dunbar Args.AddAllArgs(CmdArgs, options::OPT_headerpad__max__install__names); 135602633b541b04ad5ffc1c70f4c2feeeb13e607057Daniel Dunbar Args.AddAllArgs(CmdArgs, options::OPT_image__base); 135702633b541b04ad5ffc1c70f4c2feeeb13e607057Daniel Dunbar Args.AddAllArgs(CmdArgs, options::OPT_init); 135802633b541b04ad5ffc1c70f4c2feeeb13e607057Daniel Dunbar 135902633b541b04ad5ffc1c70f4c2feeeb13e607057Daniel Dunbar if (!Args.hasArg(options::OPT_mmacosx_version_min_EQ)) { 136002633b541b04ad5ffc1c70f4c2feeeb13e607057Daniel Dunbar if (!Args.hasArg(options::OPT_miphoneos_version_min_EQ)) { 1361c21c485b4fb58ef5d55cf3e523263dd824a2ace4Daniel Dunbar // FIXME: I don't understand what is going on here. This is 1362c21c485b4fb58ef5d55cf3e523263dd824a2ace4Daniel Dunbar // supposed to come from darwin_ld_minversion, but gcc doesn't 1363c21c485b4fb58ef5d55cf3e523263dd824a2ace4Daniel Dunbar // seem to be following that; it must be getting overridden 1364c21c485b4fb58ef5d55cf3e523263dd824a2ace4Daniel Dunbar // somewhere. 1365c21c485b4fb58ef5d55cf3e523263dd824a2ace4Daniel Dunbar CmdArgs.push_back("-macosx_version_min"); 1366c21c485b4fb58ef5d55cf3e523263dd824a2ace4Daniel Dunbar CmdArgs.push_back(getDarwinToolChain().getMacosxVersionStr()); 1367c21c485b4fb58ef5d55cf3e523263dd824a2ace4Daniel Dunbar } 136802633b541b04ad5ffc1c70f4c2feeeb13e607057Daniel Dunbar } else { 136902633b541b04ad5ffc1c70f4c2feeeb13e607057Daniel Dunbar // Adding all arguments doesn't make sense here but this is what 137002633b541b04ad5ffc1c70f4c2feeeb13e607057Daniel Dunbar // gcc does. 137102633b541b04ad5ffc1c70f4c2feeeb13e607057Daniel Dunbar Args.AddAllArgsTranslated(CmdArgs, options::OPT_mmacosx_version_min_EQ, 137202633b541b04ad5ffc1c70f4c2feeeb13e607057Daniel Dunbar "-macosx_version_min"); 137302633b541b04ad5ffc1c70f4c2feeeb13e607057Daniel Dunbar } 137402633b541b04ad5ffc1c70f4c2feeeb13e607057Daniel Dunbar 137502633b541b04ad5ffc1c70f4c2feeeb13e607057Daniel Dunbar Args.AddAllArgsTranslated(CmdArgs, options::OPT_miphoneos_version_min_EQ, 137602633b541b04ad5ffc1c70f4c2feeeb13e607057Daniel Dunbar "-iphoneos_version_min"); 137702633b541b04ad5ffc1c70f4c2feeeb13e607057Daniel Dunbar Args.AddLastArg(CmdArgs, options::OPT_nomultidefs); 137802633b541b04ad5ffc1c70f4c2feeeb13e607057Daniel Dunbar Args.AddLastArg(CmdArgs, options::OPT_multi__module); 137902633b541b04ad5ffc1c70f4c2feeeb13e607057Daniel Dunbar Args.AddLastArg(CmdArgs, options::OPT_single__module); 138002633b541b04ad5ffc1c70f4c2feeeb13e607057Daniel Dunbar Args.AddAllArgs(CmdArgs, options::OPT_multiply__defined); 138102633b541b04ad5ffc1c70f4c2feeeb13e607057Daniel Dunbar Args.AddAllArgs(CmdArgs, options::OPT_multiply__defined__unused); 1382c21c485b4fb58ef5d55cf3e523263dd824a2ace4Daniel Dunbar 138302633b541b04ad5ffc1c70f4c2feeeb13e607057Daniel Dunbar if (Args.hasArg(options::OPT_fpie)) 138402633b541b04ad5ffc1c70f4c2feeeb13e607057Daniel Dunbar CmdArgs.push_back("-pie"); 138502633b541b04ad5ffc1c70f4c2feeeb13e607057Daniel Dunbar 138602633b541b04ad5ffc1c70f4c2feeeb13e607057Daniel Dunbar Args.AddLastArg(CmdArgs, options::OPT_prebind); 138702633b541b04ad5ffc1c70f4c2feeeb13e607057Daniel Dunbar Args.AddLastArg(CmdArgs, options::OPT_noprebind); 138802633b541b04ad5ffc1c70f4c2feeeb13e607057Daniel Dunbar Args.AddLastArg(CmdArgs, options::OPT_nofixprebinding); 138902633b541b04ad5ffc1c70f4c2feeeb13e607057Daniel Dunbar Args.AddLastArg(CmdArgs, options::OPT_prebind__all__twolevel__modules); 139002633b541b04ad5ffc1c70f4c2feeeb13e607057Daniel Dunbar Args.AddLastArg(CmdArgs, options::OPT_read__only__relocs); 139102633b541b04ad5ffc1c70f4c2feeeb13e607057Daniel Dunbar Args.AddAllArgs(CmdArgs, options::OPT_sectcreate); 139202633b541b04ad5ffc1c70f4c2feeeb13e607057Daniel Dunbar Args.AddAllArgs(CmdArgs, options::OPT_sectorder); 139302633b541b04ad5ffc1c70f4c2feeeb13e607057Daniel Dunbar Args.AddAllArgs(CmdArgs, options::OPT_seg1addr); 139402633b541b04ad5ffc1c70f4c2feeeb13e607057Daniel Dunbar Args.AddAllArgs(CmdArgs, options::OPT_segprot); 139502633b541b04ad5ffc1c70f4c2feeeb13e607057Daniel Dunbar Args.AddAllArgs(CmdArgs, options::OPT_segaddr); 139602633b541b04ad5ffc1c70f4c2feeeb13e607057Daniel Dunbar Args.AddAllArgs(CmdArgs, options::OPT_segs__read__only__addr); 139702633b541b04ad5ffc1c70f4c2feeeb13e607057Daniel Dunbar Args.AddAllArgs(CmdArgs, options::OPT_segs__read__write__addr); 139802633b541b04ad5ffc1c70f4c2feeeb13e607057Daniel Dunbar Args.AddAllArgs(CmdArgs, options::OPT_seg__addr__table); 139902633b541b04ad5ffc1c70f4c2feeeb13e607057Daniel Dunbar Args.AddAllArgs(CmdArgs, options::OPT_seg__addr__table__filename); 140002633b541b04ad5ffc1c70f4c2feeeb13e607057Daniel Dunbar Args.AddAllArgs(CmdArgs, options::OPT_sub__library); 140102633b541b04ad5ffc1c70f4c2feeeb13e607057Daniel Dunbar Args.AddAllArgs(CmdArgs, options::OPT_sub__umbrella); 140202633b541b04ad5ffc1c70f4c2feeeb13e607057Daniel Dunbar Args.AddAllArgsTranslated(CmdArgs, options::OPT_isysroot, "-syslibroot"); 140302633b541b04ad5ffc1c70f4c2feeeb13e607057Daniel Dunbar Args.AddLastArg(CmdArgs, options::OPT_twolevel__namespace); 140402633b541b04ad5ffc1c70f4c2feeeb13e607057Daniel Dunbar Args.AddLastArg(CmdArgs, options::OPT_twolevel__namespace__hints); 140502633b541b04ad5ffc1c70f4c2feeeb13e607057Daniel Dunbar Args.AddAllArgs(CmdArgs, options::OPT_umbrella); 140602633b541b04ad5ffc1c70f4c2feeeb13e607057Daniel Dunbar Args.AddAllArgs(CmdArgs, options::OPT_undefined); 140702633b541b04ad5ffc1c70f4c2feeeb13e607057Daniel Dunbar Args.AddAllArgs(CmdArgs, options::OPT_unexported__symbols__list); 140802633b541b04ad5ffc1c70f4c2feeeb13e607057Daniel Dunbar Args.AddAllArgs(CmdArgs, options::OPT_weak__reference__mismatches); 140902633b541b04ad5ffc1c70f4c2feeeb13e607057Daniel Dunbar 141002633b541b04ad5ffc1c70f4c2feeeb13e607057Daniel Dunbar if (!Args.hasArg(options::OPT_weak__reference__mismatches)) { 141102633b541b04ad5ffc1c70f4c2feeeb13e607057Daniel Dunbar CmdArgs.push_back("-weak_reference_mismatches"); 141202633b541b04ad5ffc1c70f4c2feeeb13e607057Daniel Dunbar CmdArgs.push_back("non-weak"); 141302633b541b04ad5ffc1c70f4c2feeeb13e607057Daniel Dunbar } 141402633b541b04ad5ffc1c70f4c2feeeb13e607057Daniel Dunbar 141502633b541b04ad5ffc1c70f4c2feeeb13e607057Daniel Dunbar Args.AddLastArg(CmdArgs, options::OPT_X_Flag); 141602633b541b04ad5ffc1c70f4c2feeeb13e607057Daniel Dunbar Args.AddAllArgs(CmdArgs, options::OPT_y); 141702633b541b04ad5ffc1c70f4c2feeeb13e607057Daniel Dunbar Args.AddLastArg(CmdArgs, options::OPT_w); 141802633b541b04ad5ffc1c70f4c2feeeb13e607057Daniel Dunbar Args.AddAllArgs(CmdArgs, options::OPT_pagezero__size); 141902633b541b04ad5ffc1c70f4c2feeeb13e607057Daniel Dunbar Args.AddAllArgs(CmdArgs, options::OPT_segs__read__); 142002633b541b04ad5ffc1c70f4c2feeeb13e607057Daniel Dunbar Args.AddLastArg(CmdArgs, options::OPT_seglinkedit); 142102633b541b04ad5ffc1c70f4c2feeeb13e607057Daniel Dunbar Args.AddLastArg(CmdArgs, options::OPT_noseglinkedit); 142202633b541b04ad5ffc1c70f4c2feeeb13e607057Daniel Dunbar Args.AddAllArgs(CmdArgs, options::OPT_sectalign); 142302633b541b04ad5ffc1c70f4c2feeeb13e607057Daniel Dunbar Args.AddAllArgs(CmdArgs, options::OPT_sectobjectsymbols); 142402633b541b04ad5ffc1c70f4c2feeeb13e607057Daniel Dunbar Args.AddAllArgs(CmdArgs, options::OPT_segcreate); 142502633b541b04ad5ffc1c70f4c2feeeb13e607057Daniel Dunbar Args.AddLastArg(CmdArgs, options::OPT_whyload); 142602633b541b04ad5ffc1c70f4c2feeeb13e607057Daniel Dunbar Args.AddLastArg(CmdArgs, options::OPT_whatsloaded); 142702633b541b04ad5ffc1c70f4c2feeeb13e607057Daniel Dunbar Args.AddAllArgs(CmdArgs, options::OPT_dylinker__install__name); 142802633b541b04ad5ffc1c70f4c2feeeb13e607057Daniel Dunbar Args.AddLastArg(CmdArgs, options::OPT_dylinker); 142902633b541b04ad5ffc1c70f4c2feeeb13e607057Daniel Dunbar Args.AddLastArg(CmdArgs, options::OPT_Mach); 143002633b541b04ad5ffc1c70f4c2feeeb13e607057Daniel Dunbar} 143102633b541b04ad5ffc1c70f4c2feeeb13e607057Daniel Dunbar 143202633b541b04ad5ffc1c70f4c2feeeb13e607057Daniel Dunbarvoid darwin::Link::ConstructJob(Compilation &C, const JobAction &JA, 1433c21c485b4fb58ef5d55cf3e523263dd824a2ace4Daniel Dunbar Job &Dest, const InputInfo &Output, 1434c21c485b4fb58ef5d55cf3e523263dd824a2ace4Daniel Dunbar const InputInfoList &Inputs, 1435c21c485b4fb58ef5d55cf3e523263dd824a2ace4Daniel Dunbar const ArgList &Args, 143602633b541b04ad5ffc1c70f4c2feeeb13e607057Daniel Dunbar const char *LinkingOutput) const { 143702633b541b04ad5ffc1c70f4c2feeeb13e607057Daniel Dunbar assert(Output.getType() == types::TY_Image && "Invalid linker output type."); 143802633b541b04ad5ffc1c70f4c2feeeb13e607057Daniel Dunbar // The logic here is derived from gcc's behavior; most of which 143902633b541b04ad5ffc1c70f4c2feeeb13e607057Daniel Dunbar // comes from specs (starting with link_command). Consult gcc for 144002633b541b04ad5ffc1c70f4c2feeeb13e607057Daniel Dunbar // more information. 144102633b541b04ad5ffc1c70f4c2feeeb13e607057Daniel Dunbar 144202633b541b04ad5ffc1c70f4c2feeeb13e607057Daniel Dunbar // FIXME: The spec references -fdump= which seems to have 144302633b541b04ad5ffc1c70f4c2feeeb13e607057Daniel Dunbar // disappeared? 144402633b541b04ad5ffc1c70f4c2feeeb13e607057Daniel Dunbar 144502633b541b04ad5ffc1c70f4c2feeeb13e607057Daniel Dunbar ArgStringList CmdArgs; 144602633b541b04ad5ffc1c70f4c2feeeb13e607057Daniel Dunbar 144702633b541b04ad5ffc1c70f4c2feeeb13e607057Daniel Dunbar // I'm not sure why this particular decomposition exists in gcc, but 144802633b541b04ad5ffc1c70f4c2feeeb13e607057Daniel Dunbar // we follow suite for ease of comparison. 144902633b541b04ad5ffc1c70f4c2feeeb13e607057Daniel Dunbar AddLinkArgs(Args, CmdArgs); 145002633b541b04ad5ffc1c70f4c2feeeb13e607057Daniel Dunbar 145102633b541b04ad5ffc1c70f4c2feeeb13e607057Daniel Dunbar // FIXME: gcc has %{x} in here. How could this ever happen? Cruft? 145202633b541b04ad5ffc1c70f4c2feeeb13e607057Daniel Dunbar Args.AddAllArgs(CmdArgs, options::OPT_d_Flag); 145302633b541b04ad5ffc1c70f4c2feeeb13e607057Daniel Dunbar Args.AddAllArgs(CmdArgs, options::OPT_s); 145402633b541b04ad5ffc1c70f4c2feeeb13e607057Daniel Dunbar Args.AddAllArgs(CmdArgs, options::OPT_t); 145502633b541b04ad5ffc1c70f4c2feeeb13e607057Daniel Dunbar Args.AddAllArgs(CmdArgs, options::OPT_Z_Flag); 145602633b541b04ad5ffc1c70f4c2feeeb13e607057Daniel Dunbar Args.AddAllArgs(CmdArgs, options::OPT_u_Group); 145702633b541b04ad5ffc1c70f4c2feeeb13e607057Daniel Dunbar Args.AddAllArgs(CmdArgs, options::OPT_A); 145802633b541b04ad5ffc1c70f4c2feeeb13e607057Daniel Dunbar Args.AddLastArg(CmdArgs, options::OPT_e); 145902633b541b04ad5ffc1c70f4c2feeeb13e607057Daniel Dunbar Args.AddAllArgs(CmdArgs, options::OPT_m_Separate); 146002633b541b04ad5ffc1c70f4c2feeeb13e607057Daniel Dunbar Args.AddAllArgs(CmdArgs, options::OPT_r); 146102633b541b04ad5ffc1c70f4c2feeeb13e607057Daniel Dunbar 146202633b541b04ad5ffc1c70f4c2feeeb13e607057Daniel Dunbar // FIXME: This is just being pedantically bug compatible, gcc 146302633b541b04ad5ffc1c70f4c2feeeb13e607057Daniel Dunbar // doesn't *mean* to forward this, it just does (yay for pattern 146402633b541b04ad5ffc1c70f4c2feeeb13e607057Daniel Dunbar // matching). It doesn't work, of course. 146502633b541b04ad5ffc1c70f4c2feeeb13e607057Daniel Dunbar Args.AddAllArgs(CmdArgs, options::OPT_object); 146602633b541b04ad5ffc1c70f4c2feeeb13e607057Daniel Dunbar 146702633b541b04ad5ffc1c70f4c2feeeb13e607057Daniel Dunbar CmdArgs.push_back("-o"); 146802633b541b04ad5ffc1c70f4c2feeeb13e607057Daniel Dunbar CmdArgs.push_back(Output.getFilename()); 146902633b541b04ad5ffc1c70f4c2feeeb13e607057Daniel Dunbar 147002633b541b04ad5ffc1c70f4c2feeeb13e607057Daniel Dunbar unsigned MacosxVersion[3]; 147102633b541b04ad5ffc1c70f4c2feeeb13e607057Daniel Dunbar if (Arg *A = Args.getLastArg(options::OPT_mmacosx_version_min_EQ)) { 147202633b541b04ad5ffc1c70f4c2feeeb13e607057Daniel Dunbar bool HadExtra; 1473c21c485b4fb58ef5d55cf3e523263dd824a2ace4Daniel Dunbar if (!Driver::GetReleaseVersion(A->getValue(Args), MacosxVersion[0], 147402633b541b04ad5ffc1c70f4c2feeeb13e607057Daniel Dunbar MacosxVersion[1], MacosxVersion[2], 147502633b541b04ad5ffc1c70f4c2feeeb13e607057Daniel Dunbar HadExtra) || 147602633b541b04ad5ffc1c70f4c2feeeb13e607057Daniel Dunbar HadExtra) { 147702633b541b04ad5ffc1c70f4c2feeeb13e607057Daniel Dunbar const Driver &D = getToolChain().getHost().getDriver(); 147802633b541b04ad5ffc1c70f4c2feeeb13e607057Daniel Dunbar D.Diag(clang::diag::err_drv_invalid_version_number) 147902633b541b04ad5ffc1c70f4c2feeeb13e607057Daniel Dunbar << A->getAsString(Args); 148002633b541b04ad5ffc1c70f4c2feeeb13e607057Daniel Dunbar } 148102633b541b04ad5ffc1c70f4c2feeeb13e607057Daniel Dunbar } else { 148202633b541b04ad5ffc1c70f4c2feeeb13e607057Daniel Dunbar getDarwinToolChain().getMacosxVersion(MacosxVersion); 148302633b541b04ad5ffc1c70f4c2feeeb13e607057Daniel Dunbar } 1484c21c485b4fb58ef5d55cf3e523263dd824a2ace4Daniel Dunbar 148502633b541b04ad5ffc1c70f4c2feeeb13e607057Daniel Dunbar if (!Args.hasArg(options::OPT_A) && 148602633b541b04ad5ffc1c70f4c2feeeb13e607057Daniel Dunbar !Args.hasArg(options::OPT_nostdlib) && 148702633b541b04ad5ffc1c70f4c2feeeb13e607057Daniel Dunbar !Args.hasArg(options::OPT_nostartfiles)) { 148802633b541b04ad5ffc1c70f4c2feeeb13e607057Daniel Dunbar // Derived from startfile spec. 148902633b541b04ad5ffc1c70f4c2feeeb13e607057Daniel Dunbar if (Args.hasArg(options::OPT_dynamiclib)) { 1490c21c485b4fb58ef5d55cf3e523263dd824a2ace4Daniel Dunbar // Derived from darwin_dylib1 spec. 14918a8d8afa3df40e9f122d2b826f1a825a66f6908dDaniel Dunbar if (isMacosxVersionLT(MacosxVersion, 10, 5)) 149202633b541b04ad5ffc1c70f4c2feeeb13e607057Daniel Dunbar CmdArgs.push_back("-ldylib1.o"); 14938a8d8afa3df40e9f122d2b826f1a825a66f6908dDaniel Dunbar else if (isMacosxVersionLT(MacosxVersion, 10, 6)) 149402633b541b04ad5ffc1c70f4c2feeeb13e607057Daniel Dunbar CmdArgs.push_back("-ldylib1.10.5.o"); 149502633b541b04ad5ffc1c70f4c2feeeb13e607057Daniel Dunbar } else { 149602633b541b04ad5ffc1c70f4c2feeeb13e607057Daniel Dunbar if (Args.hasArg(options::OPT_bundle)) { 14978a8d8afa3df40e9f122d2b826f1a825a66f6908dDaniel Dunbar if (!Args.hasArg(options::OPT_static)) { 14988a8d8afa3df40e9f122d2b826f1a825a66f6908dDaniel Dunbar // Derived from darwin_bundle1 spec. 14998a8d8afa3df40e9f122d2b826f1a825a66f6908dDaniel Dunbar if (isMacosxVersionLT(MacosxVersion, 10, 6)) 15008a8d8afa3df40e9f122d2b826f1a825a66f6908dDaniel Dunbar CmdArgs.push_back("-lbundle1.o"); 15018a8d8afa3df40e9f122d2b826f1a825a66f6908dDaniel Dunbar } 150202633b541b04ad5ffc1c70f4c2feeeb13e607057Daniel Dunbar } else { 150302633b541b04ad5ffc1c70f4c2feeeb13e607057Daniel Dunbar if (Args.hasArg(options::OPT_pg)) { 150402633b541b04ad5ffc1c70f4c2feeeb13e607057Daniel Dunbar if (Args.hasArg(options::OPT_static) || 150502633b541b04ad5ffc1c70f4c2feeeb13e607057Daniel Dunbar Args.hasArg(options::OPT_object) || 150602633b541b04ad5ffc1c70f4c2feeeb13e607057Daniel Dunbar Args.hasArg(options::OPT_preload)) { 150702633b541b04ad5ffc1c70f4c2feeeb13e607057Daniel Dunbar CmdArgs.push_back("-lgcrt0.o"); 150802633b541b04ad5ffc1c70f4c2feeeb13e607057Daniel Dunbar } else { 150902633b541b04ad5ffc1c70f4c2feeeb13e607057Daniel Dunbar CmdArgs.push_back("-lgcrt1.o"); 1510c21c485b4fb58ef5d55cf3e523263dd824a2ace4Daniel Dunbar 151102633b541b04ad5ffc1c70f4c2feeeb13e607057Daniel Dunbar // darwin_crt2 spec is empty. 1512c21c485b4fb58ef5d55cf3e523263dd824a2ace4Daniel Dunbar } 151302633b541b04ad5ffc1c70f4c2feeeb13e607057Daniel Dunbar } else { 151402633b541b04ad5ffc1c70f4c2feeeb13e607057Daniel Dunbar if (Args.hasArg(options::OPT_static) || 151502633b541b04ad5ffc1c70f4c2feeeb13e607057Daniel Dunbar Args.hasArg(options::OPT_object) || 151602633b541b04ad5ffc1c70f4c2feeeb13e607057Daniel Dunbar Args.hasArg(options::OPT_preload)) { 151702633b541b04ad5ffc1c70f4c2feeeb13e607057Daniel Dunbar CmdArgs.push_back("-lcrt0.o"); 151802633b541b04ad5ffc1c70f4c2feeeb13e607057Daniel Dunbar } else { 151902633b541b04ad5ffc1c70f4c2feeeb13e607057Daniel Dunbar // Derived from darwin_crt1 spec. 15208a8d8afa3df40e9f122d2b826f1a825a66f6908dDaniel Dunbar if (isMacosxVersionLT(MacosxVersion, 10, 5)) 152102633b541b04ad5ffc1c70f4c2feeeb13e607057Daniel Dunbar CmdArgs.push_back("-lcrt1.o"); 15228a8d8afa3df40e9f122d2b826f1a825a66f6908dDaniel Dunbar else if (isMacosxVersionLT(MacosxVersion, 10, 6)) 152302633b541b04ad5ffc1c70f4c2feeeb13e607057Daniel Dunbar CmdArgs.push_back("-lcrt1.10.5.o"); 15248a8d8afa3df40e9f122d2b826f1a825a66f6908dDaniel Dunbar else 15258a8d8afa3df40e9f122d2b826f1a825a66f6908dDaniel Dunbar CmdArgs.push_back("-lcrt1.10.6.o"); 1526c21c485b4fb58ef5d55cf3e523263dd824a2ace4Daniel Dunbar 15278a8d8afa3df40e9f122d2b826f1a825a66f6908dDaniel Dunbar // darwin_crt2 spec is empty. 152802633b541b04ad5ffc1c70f4c2feeeb13e607057Daniel Dunbar } 152902633b541b04ad5ffc1c70f4c2feeeb13e607057Daniel Dunbar } 153002633b541b04ad5ffc1c70f4c2feeeb13e607057Daniel Dunbar } 153102633b541b04ad5ffc1c70f4c2feeeb13e607057Daniel Dunbar } 153202633b541b04ad5ffc1c70f4c2feeeb13e607057Daniel Dunbar 153302633b541b04ad5ffc1c70f4c2feeeb13e607057Daniel Dunbar if (Args.hasArg(options::OPT_shared_libgcc) && 153402633b541b04ad5ffc1c70f4c2feeeb13e607057Daniel Dunbar !Args.hasArg(options::OPT_miphoneos_version_min_EQ) && 153502633b541b04ad5ffc1c70f4c2feeeb13e607057Daniel Dunbar isMacosxVersionLT(MacosxVersion, 10, 5)) { 153602633b541b04ad5ffc1c70f4c2feeeb13e607057Daniel Dunbar const char *Str = getToolChain().GetFilePath(C, "crt3.o").c_str(); 153702633b541b04ad5ffc1c70f4c2feeeb13e607057Daniel Dunbar CmdArgs.push_back(Args.MakeArgString(Str)); 153802633b541b04ad5ffc1c70f4c2feeeb13e607057Daniel Dunbar } 153902633b541b04ad5ffc1c70f4c2feeeb13e607057Daniel Dunbar } 154002633b541b04ad5ffc1c70f4c2feeeb13e607057Daniel Dunbar 154102633b541b04ad5ffc1c70f4c2feeeb13e607057Daniel Dunbar Args.AddAllArgs(CmdArgs, options::OPT_L); 1542c21c485b4fb58ef5d55cf3e523263dd824a2ace4Daniel Dunbar 154302633b541b04ad5ffc1c70f4c2feeeb13e607057Daniel Dunbar if (Args.hasArg(options::OPT_fopenmp)) 154402633b541b04ad5ffc1c70f4c2feeeb13e607057Daniel Dunbar // This is more complicated in gcc... 154502633b541b04ad5ffc1c70f4c2feeeb13e607057Daniel Dunbar CmdArgs.push_back("-lgomp"); 154602633b541b04ad5ffc1c70f4c2feeeb13e607057Daniel Dunbar 154702633b541b04ad5ffc1c70f4c2feeeb13e607057Daniel Dunbar // FIXME: Derive these correctly. 154802633b541b04ad5ffc1c70f4c2feeeb13e607057Daniel Dunbar const char *TCDir = getDarwinToolChain().getToolChainDir().c_str(); 154902633b541b04ad5ffc1c70f4c2feeeb13e607057Daniel Dunbar if (getToolChain().getArchName() == "x86_64") { 155002633b541b04ad5ffc1c70f4c2feeeb13e607057Daniel Dunbar CmdArgs.push_back(MakeFormattedString(Args, 1551c21c485b4fb58ef5d55cf3e523263dd824a2ace4Daniel Dunbar llvm::format("-L/usr/lib/gcc/%s/x86_64", TCDir))); 155202633b541b04ad5ffc1c70f4c2feeeb13e607057Daniel Dunbar // Intentionally duplicated for (temporary) gcc bug compatibility. 155302633b541b04ad5ffc1c70f4c2feeeb13e607057Daniel Dunbar CmdArgs.push_back(MakeFormattedString(Args, 1554c21c485b4fb58ef5d55cf3e523263dd824a2ace4Daniel Dunbar llvm::format("-L/usr/lib/gcc/%s/x86_64", TCDir))); 155502633b541b04ad5ffc1c70f4c2feeeb13e607057Daniel Dunbar } 1556c21c485b4fb58ef5d55cf3e523263dd824a2ace4Daniel Dunbar CmdArgs.push_back(MakeFormattedString(Args, 155702633b541b04ad5ffc1c70f4c2feeeb13e607057Daniel Dunbar llvm::format("-L/usr/lib/%s", TCDir))); 1558c21c485b4fb58ef5d55cf3e523263dd824a2ace4Daniel Dunbar CmdArgs.push_back(MakeFormattedString(Args, 1559c21c485b4fb58ef5d55cf3e523263dd824a2ace4Daniel Dunbar llvm::format("-L/usr/lib/gcc/%s", TCDir))); 156002633b541b04ad5ffc1c70f4c2feeeb13e607057Daniel Dunbar // Intentionally duplicated for (temporary) gcc bug compatibility. 156102633b541b04ad5ffc1c70f4c2feeeb13e607057Daniel Dunbar CmdArgs.push_back(MakeFormattedString(Args, 1562c21c485b4fb58ef5d55cf3e523263dd824a2ace4Daniel Dunbar llvm::format("-L/usr/lib/gcc/%s", TCDir))); 1563c21c485b4fb58ef5d55cf3e523263dd824a2ace4Daniel Dunbar CmdArgs.push_back(MakeFormattedString(Args, 1564c21c485b4fb58ef5d55cf3e523263dd824a2ace4Daniel Dunbar llvm::format("-L/usr/lib/gcc/%s/../../../%s", TCDir, TCDir))); 1565c21c485b4fb58ef5d55cf3e523263dd824a2ace4Daniel Dunbar CmdArgs.push_back(MakeFormattedString(Args, 1566c21c485b4fb58ef5d55cf3e523263dd824a2ace4Daniel Dunbar llvm::format("-L/usr/lib/gcc/%s/../../..", TCDir))); 1567c21c485b4fb58ef5d55cf3e523263dd824a2ace4Daniel Dunbar 156802633b541b04ad5ffc1c70f4c2feeeb13e607057Daniel Dunbar for (InputInfoList::const_iterator 156902633b541b04ad5ffc1c70f4c2feeeb13e607057Daniel Dunbar it = Inputs.begin(), ie = Inputs.end(); it != ie; ++it) { 157002633b541b04ad5ffc1c70f4c2feeeb13e607057Daniel Dunbar const InputInfo &II = *it; 157102633b541b04ad5ffc1c70f4c2feeeb13e607057Daniel Dunbar if (II.isFilename()) 157202633b541b04ad5ffc1c70f4c2feeeb13e607057Daniel Dunbar CmdArgs.push_back(II.getFilename()); 1573c21c485b4fb58ef5d55cf3e523263dd824a2ace4Daniel Dunbar else 157402633b541b04ad5ffc1c70f4c2feeeb13e607057Daniel Dunbar II.getInputArg().renderAsInput(Args, CmdArgs); 157502633b541b04ad5ffc1c70f4c2feeeb13e607057Daniel Dunbar } 157602633b541b04ad5ffc1c70f4c2feeeb13e607057Daniel Dunbar 157702633b541b04ad5ffc1c70f4c2feeeb13e607057Daniel Dunbar if (LinkingOutput) { 157802633b541b04ad5ffc1c70f4c2feeeb13e607057Daniel Dunbar CmdArgs.push_back("-arch_multiple"); 157902633b541b04ad5ffc1c70f4c2feeeb13e607057Daniel Dunbar CmdArgs.push_back("-final_output"); 158002633b541b04ad5ffc1c70f4c2feeeb13e607057Daniel Dunbar CmdArgs.push_back(LinkingOutput); 158102633b541b04ad5ffc1c70f4c2feeeb13e607057Daniel Dunbar } 158202633b541b04ad5ffc1c70f4c2feeeb13e607057Daniel Dunbar 158302633b541b04ad5ffc1c70f4c2feeeb13e607057Daniel Dunbar if (Args.hasArg(options::OPT_fprofile_arcs) || 158402633b541b04ad5ffc1c70f4c2feeeb13e607057Daniel Dunbar Args.hasArg(options::OPT_fprofile_generate) || 158502633b541b04ad5ffc1c70f4c2feeeb13e607057Daniel Dunbar Args.hasArg(options::OPT_fcreate_profile) || 158602633b541b04ad5ffc1c70f4c2feeeb13e607057Daniel Dunbar Args.hasArg(options::OPT_coverage)) 158702633b541b04ad5ffc1c70f4c2feeeb13e607057Daniel Dunbar CmdArgs.push_back("-lgcov"); 1588c21c485b4fb58ef5d55cf3e523263dd824a2ace4Daniel Dunbar 158902633b541b04ad5ffc1c70f4c2feeeb13e607057Daniel Dunbar if (Args.hasArg(options::OPT_fnested_functions)) 159002633b541b04ad5ffc1c70f4c2feeeb13e607057Daniel Dunbar CmdArgs.push_back("-allow_stack_execute"); 1591c21c485b4fb58ef5d55cf3e523263dd824a2ace4Daniel Dunbar 159202633b541b04ad5ffc1c70f4c2feeeb13e607057Daniel Dunbar if (!Args.hasArg(options::OPT_nostdlib) && 159302633b541b04ad5ffc1c70f4c2feeeb13e607057Daniel Dunbar !Args.hasArg(options::OPT_nodefaultlibs)) { 1594edfa02b85b186e9ea9e0c841539a77ed32ee9148Daniel Dunbar // FIXME: g++ is more complicated here, it tries to put -lstdc++ 1595edfa02b85b186e9ea9e0c841539a77ed32ee9148Daniel Dunbar // before -lm, for example. 1596edfa02b85b186e9ea9e0c841539a77ed32ee9148Daniel Dunbar if (getToolChain().getHost().getDriver().CCCIsCXX) 1597edfa02b85b186e9ea9e0c841539a77ed32ee9148Daniel Dunbar CmdArgs.push_back("-lstdc++"); 1598edfa02b85b186e9ea9e0c841539a77ed32ee9148Daniel Dunbar 159902633b541b04ad5ffc1c70f4c2feeeb13e607057Daniel Dunbar // link_ssp spec is empty. 160002633b541b04ad5ffc1c70f4c2feeeb13e607057Daniel Dunbar 16018a8d8afa3df40e9f122d2b826f1a825a66f6908dDaniel Dunbar // Derived from libgcc and lib specs but refactored. 160202633b541b04ad5ffc1c70f4c2feeeb13e607057Daniel Dunbar if (Args.hasArg(options::OPT_static)) { 160302633b541b04ad5ffc1c70f4c2feeeb13e607057Daniel Dunbar CmdArgs.push_back("-lgcc_static"); 160402633b541b04ad5ffc1c70f4c2feeeb13e607057Daniel Dunbar } else { 16058a8d8afa3df40e9f122d2b826f1a825a66f6908dDaniel Dunbar if (Args.hasArg(options::OPT_static_libgcc)) { 16068a8d8afa3df40e9f122d2b826f1a825a66f6908dDaniel Dunbar CmdArgs.push_back("-lgcc_eh"); 16078a8d8afa3df40e9f122d2b826f1a825a66f6908dDaniel Dunbar } else if (Args.hasArg(options::OPT_miphoneos_version_min_EQ)) { 16088a8d8afa3df40e9f122d2b826f1a825a66f6908dDaniel Dunbar // Derived from darwin_iphoneos_libgcc spec. 160902633b541b04ad5ffc1c70f4c2feeeb13e607057Daniel Dunbar CmdArgs.push_back("-lgcc_s.10.5"); 16108a8d8afa3df40e9f122d2b826f1a825a66f6908dDaniel Dunbar } else if (Args.hasArg(options::OPT_shared_libgcc) || 16118a8d8afa3df40e9f122d2b826f1a825a66f6908dDaniel Dunbar Args.hasArg(options::OPT_fexceptions) || 16128a8d8afa3df40e9f122d2b826f1a825a66f6908dDaniel Dunbar Args.hasArg(options::OPT_fgnu_runtime)) { 16138a8d8afa3df40e9f122d2b826f1a825a66f6908dDaniel Dunbar // FIXME: This is probably broken on 10.3? 16148a8d8afa3df40e9f122d2b826f1a825a66f6908dDaniel Dunbar if (isMacosxVersionLT(MacosxVersion, 10, 5)) 16158a8d8afa3df40e9f122d2b826f1a825a66f6908dDaniel Dunbar CmdArgs.push_back("-lgcc_s.10.4"); 16168a8d8afa3df40e9f122d2b826f1a825a66f6908dDaniel Dunbar else if (isMacosxVersionLT(MacosxVersion, 10, 6)) 16178a8d8afa3df40e9f122d2b826f1a825a66f6908dDaniel Dunbar CmdArgs.push_back("-lgcc_s.10.5"); 16188a8d8afa3df40e9f122d2b826f1a825a66f6908dDaniel Dunbar } else { 16198a8d8afa3df40e9f122d2b826f1a825a66f6908dDaniel Dunbar if (isMacosxVersionLT(MacosxVersion, 10, 3, 9)) 16208a8d8afa3df40e9f122d2b826f1a825a66f6908dDaniel Dunbar ; // Do nothing. 16218a8d8afa3df40e9f122d2b826f1a825a66f6908dDaniel Dunbar else if (isMacosxVersionLT(MacosxVersion, 10, 5)) 16228a8d8afa3df40e9f122d2b826f1a825a66f6908dDaniel Dunbar CmdArgs.push_back("-lgcc_s.10.4"); 16238a8d8afa3df40e9f122d2b826f1a825a66f6908dDaniel Dunbar else if (isMacosxVersionLT(MacosxVersion, 10, 6)) 16248a8d8afa3df40e9f122d2b826f1a825a66f6908dDaniel Dunbar CmdArgs.push_back("-lgcc_s.10.5"); 16258a8d8afa3df40e9f122d2b826f1a825a66f6908dDaniel Dunbar } 162602633b541b04ad5ffc1c70f4c2feeeb13e607057Daniel Dunbar 16278a8d8afa3df40e9f122d2b826f1a825a66f6908dDaniel Dunbar if (isMacosxVersionLT(MacosxVersion, 10, 6)) { 16288a8d8afa3df40e9f122d2b826f1a825a66f6908dDaniel Dunbar CmdArgs.push_back("-lgcc"); 16298a8d8afa3df40e9f122d2b826f1a825a66f6908dDaniel Dunbar CmdArgs.push_back("-lSystem"); 16308a8d8afa3df40e9f122d2b826f1a825a66f6908dDaniel Dunbar } else { 16318a8d8afa3df40e9f122d2b826f1a825a66f6908dDaniel Dunbar CmdArgs.push_back("-lSystem"); 16328a8d8afa3df40e9f122d2b826f1a825a66f6908dDaniel Dunbar CmdArgs.push_back("-lgcc"); 16338a8d8afa3df40e9f122d2b826f1a825a66f6908dDaniel Dunbar } 16348a8d8afa3df40e9f122d2b826f1a825a66f6908dDaniel Dunbar } 163502633b541b04ad5ffc1c70f4c2feeeb13e607057Daniel Dunbar } 163602633b541b04ad5ffc1c70f4c2feeeb13e607057Daniel Dunbar 163702633b541b04ad5ffc1c70f4c2feeeb13e607057Daniel Dunbar if (!Args.hasArg(options::OPT_A) && 163802633b541b04ad5ffc1c70f4c2feeeb13e607057Daniel Dunbar !Args.hasArg(options::OPT_nostdlib) && 163902633b541b04ad5ffc1c70f4c2feeeb13e607057Daniel Dunbar !Args.hasArg(options::OPT_nostartfiles)) { 164002633b541b04ad5ffc1c70f4c2feeeb13e607057Daniel Dunbar // endfile_spec is empty. 164102633b541b04ad5ffc1c70f4c2feeeb13e607057Daniel Dunbar } 164202633b541b04ad5ffc1c70f4c2feeeb13e607057Daniel Dunbar 164302633b541b04ad5ffc1c70f4c2feeeb13e607057Daniel Dunbar Args.AddAllArgs(CmdArgs, options::OPT_T_Group); 164402633b541b04ad5ffc1c70f4c2feeeb13e607057Daniel Dunbar Args.AddAllArgs(CmdArgs, options::OPT_F); 164502633b541b04ad5ffc1c70f4c2feeeb13e607057Daniel Dunbar 1646c21c485b4fb58ef5d55cf3e523263dd824a2ace4Daniel Dunbar const char *Exec = 164799612939d02d99a6ef3ff037aa14c4277e9c43ceDaniel Dunbar Args.MakeArgString(getToolChain().GetProgramPath(C, "ld").c_str()); 1648c21c485b4fb58ef5d55cf3e523263dd824a2ace4Daniel Dunbar Dest.addCommand(new Command(Exec, CmdArgs)); 164902633b541b04ad5ffc1c70f4c2feeeb13e607057Daniel Dunbar 16500b46e1b5389615a8d6641f4d7bf5415d29acfef3Daniel Dunbar // Find the first non-empty base input (we want to ignore linker 16510b46e1b5389615a8d6641f4d7bf5415d29acfef3Daniel Dunbar // inputs). 16520b46e1b5389615a8d6641f4d7bf5415d29acfef3Daniel Dunbar const char *BaseInput = ""; 16530b46e1b5389615a8d6641f4d7bf5415d29acfef3Daniel Dunbar for (unsigned i = 0, e = Inputs.size(); i != e; ++i) { 16540b46e1b5389615a8d6641f4d7bf5415d29acfef3Daniel Dunbar if (Inputs[i].getBaseInput()[0] != '\0') { 16550b46e1b5389615a8d6641f4d7bf5415d29acfef3Daniel Dunbar BaseInput = Inputs[i].getBaseInput(); 16560b46e1b5389615a8d6641f4d7bf5415d29acfef3Daniel Dunbar break; 16570b46e1b5389615a8d6641f4d7bf5415d29acfef3Daniel Dunbar } 16580b46e1b5389615a8d6641f4d7bf5415d29acfef3Daniel Dunbar } 1659c21c485b4fb58ef5d55cf3e523263dd824a2ace4Daniel Dunbar 16603ed294522653323e4867a2eba03acc98a99e5479Daniel Dunbar // Run dsymutil if we are making an executable in a single step. 16613ed294522653323e4867a2eba03acc98a99e5479Daniel Dunbar // 16623ed294522653323e4867a2eba03acc98a99e5479Daniel Dunbar // FIXME: Currently we don't want to do this when we are part of a 16633ed294522653323e4867a2eba03acc98a99e5479Daniel Dunbar // universal build step, as this would end up creating stray temp 16643ed294522653323e4867a2eba03acc98a99e5479Daniel Dunbar // files. 16653ed294522653323e4867a2eba03acc98a99e5479Daniel Dunbar if (!LinkingOutput && 16663ed294522653323e4867a2eba03acc98a99e5479Daniel Dunbar Args.getLastArg(options::OPT_g_Group) && 166702633b541b04ad5ffc1c70f4c2feeeb13e607057Daniel Dunbar !Args.getLastArg(options::OPT_gstabs) && 166802633b541b04ad5ffc1c70f4c2feeeb13e607057Daniel Dunbar !Args.getLastArg(options::OPT_g0)) { 166902633b541b04ad5ffc1c70f4c2feeeb13e607057Daniel Dunbar // FIXME: This is gross, but matches gcc. The test only considers 167002633b541b04ad5ffc1c70f4c2feeeb13e607057Daniel Dunbar // the suffix (not the -x type), and then only of the first 16710b46e1b5389615a8d6641f4d7bf5415d29acfef3Daniel Dunbar // source input. Awesome. 16720b46e1b5389615a8d6641f4d7bf5415d29acfef3Daniel Dunbar const char *Suffix = strrchr(BaseInput, '.'); 167302633b541b04ad5ffc1c70f4c2feeeb13e607057Daniel Dunbar if (Suffix && isSourceSuffix(Suffix + 1)) { 1674c21c485b4fb58ef5d55cf3e523263dd824a2ace4Daniel Dunbar const char *Exec = 1675c21c485b4fb58ef5d55cf3e523263dd824a2ace4Daniel Dunbar Args.MakeArgString(getToolChain().GetProgramPath(C, "dsymutil").c_str()); 167602633b541b04ad5ffc1c70f4c2feeeb13e607057Daniel Dunbar ArgStringList CmdArgs; 167702633b541b04ad5ffc1c70f4c2feeeb13e607057Daniel Dunbar CmdArgs.push_back(Output.getFilename()); 167802633b541b04ad5ffc1c70f4c2feeeb13e607057Daniel Dunbar C.getJobs().addCommand(new Command(Exec, CmdArgs)); 167902633b541b04ad5ffc1c70f4c2feeeb13e607057Daniel Dunbar } 168002633b541b04ad5ffc1c70f4c2feeeb13e607057Daniel Dunbar } 168102633b541b04ad5ffc1c70f4c2feeeb13e607057Daniel Dunbar} 168202633b541b04ad5ffc1c70f4c2feeeb13e607057Daniel Dunbar 1683ff7488dc9a766f94daf54d81b03ab9160d0bfd88Daniel Dunbarvoid darwin::Lipo::ConstructJob(Compilation &C, const JobAction &JA, 1684c21c485b4fb58ef5d55cf3e523263dd824a2ace4Daniel Dunbar Job &Dest, const InputInfo &Output, 1685c21c485b4fb58ef5d55cf3e523263dd824a2ace4Daniel Dunbar const InputInfoList &Inputs, 1686c21c485b4fb58ef5d55cf3e523263dd824a2ace4Daniel Dunbar const ArgList &Args, 1687ff7488dc9a766f94daf54d81b03ab9160d0bfd88Daniel Dunbar const char *LinkingOutput) const { 1688ff7488dc9a766f94daf54d81b03ab9160d0bfd88Daniel Dunbar ArgStringList CmdArgs; 1689ff7488dc9a766f94daf54d81b03ab9160d0bfd88Daniel Dunbar 1690ff7488dc9a766f94daf54d81b03ab9160d0bfd88Daniel Dunbar CmdArgs.push_back("-create"); 1691ff7488dc9a766f94daf54d81b03ab9160d0bfd88Daniel Dunbar assert(Output.isFilename() && "Unexpected lipo output."); 1692a428df828ea4cc6916ea90dcd9fbbc840776d207Daniel Dunbar 1693a428df828ea4cc6916ea90dcd9fbbc840776d207Daniel Dunbar CmdArgs.push_back("-output"); 1694ff7488dc9a766f94daf54d81b03ab9160d0bfd88Daniel Dunbar CmdArgs.push_back(Output.getFilename()); 1695a428df828ea4cc6916ea90dcd9fbbc840776d207Daniel Dunbar 1696ff7488dc9a766f94daf54d81b03ab9160d0bfd88Daniel Dunbar for (InputInfoList::const_iterator 1697ff7488dc9a766f94daf54d81b03ab9160d0bfd88Daniel Dunbar it = Inputs.begin(), ie = Inputs.end(); it != ie; ++it) { 1698ff7488dc9a766f94daf54d81b03ab9160d0bfd88Daniel Dunbar const InputInfo &II = *it; 1699ff7488dc9a766f94daf54d81b03ab9160d0bfd88Daniel Dunbar assert(II.isFilename() && "Unexpected lipo input."); 1700ff7488dc9a766f94daf54d81b03ab9160d0bfd88Daniel Dunbar CmdArgs.push_back(II.getFilename()); 1701ff7488dc9a766f94daf54d81b03ab9160d0bfd88Daniel Dunbar } 1702c21c485b4fb58ef5d55cf3e523263dd824a2ace4Daniel Dunbar const char *Exec = 1703ff7488dc9a766f94daf54d81b03ab9160d0bfd88Daniel Dunbar Args.MakeArgString(getToolChain().GetProgramPath(C, "lipo").c_str()); 1704ff7488dc9a766f94daf54d81b03ab9160d0bfd88Daniel Dunbar Dest.addCommand(new Command(Exec, CmdArgs)); 1705ff7488dc9a766f94daf54d81b03ab9160d0bfd88Daniel Dunbar} 170668a31d406c6dc4382c700d1199b062de2aa7e1daDaniel Dunbar 1707c66a5a30a27e7b9cfab46ac8be918e3ea5b0c5a5Ed Schouten 170868a31d406c6dc4382c700d1199b062de2aa7e1daDaniel Dunbarvoid freebsd::Assemble::ConstructJob(Compilation &C, const JobAction &JA, 1709c21c485b4fb58ef5d55cf3e523263dd824a2ace4Daniel Dunbar Job &Dest, const InputInfo &Output, 1710c21c485b4fb58ef5d55cf3e523263dd824a2ace4Daniel Dunbar const InputInfoList &Inputs, 1711c21c485b4fb58ef5d55cf3e523263dd824a2ace4Daniel Dunbar const ArgList &Args, 1712c21c485b4fb58ef5d55cf3e523263dd824a2ace4Daniel Dunbar const char *LinkingOutput) const 171368a31d406c6dc4382c700d1199b062de2aa7e1daDaniel Dunbar{ 171468a31d406c6dc4382c700d1199b062de2aa7e1daDaniel Dunbar ArgStringList CmdArgs; 171568a31d406c6dc4382c700d1199b062de2aa7e1daDaniel Dunbar 1716008f54a54299eaafdaa940e2bdeaf55935ecd95aDaniel Dunbar // When building 32-bit code on FreeBSD/amd64, we have to explicitly 1717008f54a54299eaafdaa940e2bdeaf55935ecd95aDaniel Dunbar // instruct as in the base system to assemble 32-bit code. 1718008f54a54299eaafdaa940e2bdeaf55935ecd95aDaniel Dunbar if (getToolChain().getArchName() == "i386") 171968a31d406c6dc4382c700d1199b062de2aa7e1daDaniel Dunbar CmdArgs.push_back("--32"); 172068a31d406c6dc4382c700d1199b062de2aa7e1daDaniel Dunbar 172168a31d406c6dc4382c700d1199b062de2aa7e1daDaniel Dunbar Args.AddAllArgValues(CmdArgs, options::OPT_Wa_COMMA, 172268a31d406c6dc4382c700d1199b062de2aa7e1daDaniel Dunbar options::OPT_Xassembler); 172368a31d406c6dc4382c700d1199b062de2aa7e1daDaniel Dunbar 172468a31d406c6dc4382c700d1199b062de2aa7e1daDaniel Dunbar CmdArgs.push_back("-o"); 172568a31d406c6dc4382c700d1199b062de2aa7e1daDaniel Dunbar if (Output.isPipe()) 172668a31d406c6dc4382c700d1199b062de2aa7e1daDaniel Dunbar CmdArgs.push_back("-"); 172768a31d406c6dc4382c700d1199b062de2aa7e1daDaniel Dunbar else 172868a31d406c6dc4382c700d1199b062de2aa7e1daDaniel Dunbar CmdArgs.push_back(Output.getFilename()); 172968a31d406c6dc4382c700d1199b062de2aa7e1daDaniel Dunbar 173068a31d406c6dc4382c700d1199b062de2aa7e1daDaniel Dunbar for (InputInfoList::const_iterator 173168a31d406c6dc4382c700d1199b062de2aa7e1daDaniel Dunbar it = Inputs.begin(), ie = Inputs.end(); it != ie; ++it) { 173268a31d406c6dc4382c700d1199b062de2aa7e1daDaniel Dunbar const InputInfo &II = *it; 173368a31d406c6dc4382c700d1199b062de2aa7e1daDaniel Dunbar if (II.isPipe()) 173468a31d406c6dc4382c700d1199b062de2aa7e1daDaniel Dunbar CmdArgs.push_back("-"); 173568a31d406c6dc4382c700d1199b062de2aa7e1daDaniel Dunbar else 173668a31d406c6dc4382c700d1199b062de2aa7e1daDaniel Dunbar CmdArgs.push_back(II.getFilename()); 173768a31d406c6dc4382c700d1199b062de2aa7e1daDaniel Dunbar } 173868a31d406c6dc4382c700d1199b062de2aa7e1daDaniel Dunbar 1739c21c485b4fb58ef5d55cf3e523263dd824a2ace4Daniel Dunbar const char *Exec = 174068a31d406c6dc4382c700d1199b062de2aa7e1daDaniel Dunbar Args.MakeArgString(getToolChain().GetProgramPath(C, "as").c_str()); 174168a31d406c6dc4382c700d1199b062de2aa7e1daDaniel Dunbar Dest.addCommand(new Command(Exec, CmdArgs)); 174268a31d406c6dc4382c700d1199b062de2aa7e1daDaniel Dunbar} 1743008f54a54299eaafdaa940e2bdeaf55935ecd95aDaniel Dunbar 1744008f54a54299eaafdaa940e2bdeaf55935ecd95aDaniel Dunbarvoid freebsd::Link::ConstructJob(Compilation &C, const JobAction &JA, 1745c21c485b4fb58ef5d55cf3e523263dd824a2ace4Daniel Dunbar Job &Dest, const InputInfo &Output, 1746c21c485b4fb58ef5d55cf3e523263dd824a2ace4Daniel Dunbar const InputInfoList &Inputs, 1747c21c485b4fb58ef5d55cf3e523263dd824a2ace4Daniel Dunbar const ArgList &Args, 1748a8304f67291b0182fb64f3afc621615288dd1d31Daniel Dunbar const char *LinkingOutput) const { 1749a8304f67291b0182fb64f3afc621615288dd1d31Daniel Dunbar const Driver &D = getToolChain().getHost().getDriver(); 1750008f54a54299eaafdaa940e2bdeaf55935ecd95aDaniel Dunbar ArgStringList CmdArgs; 1751008f54a54299eaafdaa940e2bdeaf55935ecd95aDaniel Dunbar 1752008f54a54299eaafdaa940e2bdeaf55935ecd95aDaniel Dunbar if (Args.hasArg(options::OPT_static)) { 1753008f54a54299eaafdaa940e2bdeaf55935ecd95aDaniel Dunbar CmdArgs.push_back("-Bstatic"); 1754008f54a54299eaafdaa940e2bdeaf55935ecd95aDaniel Dunbar } else { 1755008f54a54299eaafdaa940e2bdeaf55935ecd95aDaniel Dunbar CmdArgs.push_back("--eh-frame-hdr"); 1756008f54a54299eaafdaa940e2bdeaf55935ecd95aDaniel Dunbar if (Args.hasArg(options::OPT_shared)) { 1757008f54a54299eaafdaa940e2bdeaf55935ecd95aDaniel Dunbar CmdArgs.push_back("-Bshareable"); 1758008f54a54299eaafdaa940e2bdeaf55935ecd95aDaniel Dunbar } else { 1759008f54a54299eaafdaa940e2bdeaf55935ecd95aDaniel Dunbar CmdArgs.push_back("-dynamic-linker"); 1760008f54a54299eaafdaa940e2bdeaf55935ecd95aDaniel Dunbar CmdArgs.push_back("/libexec/ld-elf.so.1"); 1761008f54a54299eaafdaa940e2bdeaf55935ecd95aDaniel Dunbar } 1762008f54a54299eaafdaa940e2bdeaf55935ecd95aDaniel Dunbar } 1763008f54a54299eaafdaa940e2bdeaf55935ecd95aDaniel Dunbar 1764008f54a54299eaafdaa940e2bdeaf55935ecd95aDaniel Dunbar // When building 32-bit code on FreeBSD/amd64, we have to explicitly 1765008f54a54299eaafdaa940e2bdeaf55935ecd95aDaniel Dunbar // instruct ld in the base system to link 32-bit code. 1766008f54a54299eaafdaa940e2bdeaf55935ecd95aDaniel Dunbar if (getToolChain().getArchName() == "i386") { 1767008f54a54299eaafdaa940e2bdeaf55935ecd95aDaniel Dunbar CmdArgs.push_back("-m"); 1768008f54a54299eaafdaa940e2bdeaf55935ecd95aDaniel Dunbar CmdArgs.push_back("elf_i386_fbsd"); 1769008f54a54299eaafdaa940e2bdeaf55935ecd95aDaniel Dunbar } 1770008f54a54299eaafdaa940e2bdeaf55935ecd95aDaniel Dunbar 1771008f54a54299eaafdaa940e2bdeaf55935ecd95aDaniel Dunbar if (Output.isPipe()) { 1772008f54a54299eaafdaa940e2bdeaf55935ecd95aDaniel Dunbar CmdArgs.push_back("-o"); 1773008f54a54299eaafdaa940e2bdeaf55935ecd95aDaniel Dunbar CmdArgs.push_back("-"); 1774008f54a54299eaafdaa940e2bdeaf55935ecd95aDaniel Dunbar } else if (Output.isFilename()) { 1775008f54a54299eaafdaa940e2bdeaf55935ecd95aDaniel Dunbar CmdArgs.push_back("-o"); 1776008f54a54299eaafdaa940e2bdeaf55935ecd95aDaniel Dunbar CmdArgs.push_back(Output.getFilename()); 1777008f54a54299eaafdaa940e2bdeaf55935ecd95aDaniel Dunbar } else { 1778008f54a54299eaafdaa940e2bdeaf55935ecd95aDaniel Dunbar assert(Output.isNothing() && "Invalid output."); 1779008f54a54299eaafdaa940e2bdeaf55935ecd95aDaniel Dunbar } 1780008f54a54299eaafdaa940e2bdeaf55935ecd95aDaniel Dunbar 1781008f54a54299eaafdaa940e2bdeaf55935ecd95aDaniel Dunbar if (!Args.hasArg(options::OPT_nostdlib) && 1782008f54a54299eaafdaa940e2bdeaf55935ecd95aDaniel Dunbar !Args.hasArg(options::OPT_nostartfiles)) { 1783008f54a54299eaafdaa940e2bdeaf55935ecd95aDaniel Dunbar if (!Args.hasArg(options::OPT_shared)) { 1784008f54a54299eaafdaa940e2bdeaf55935ecd95aDaniel Dunbar CmdArgs.push_back(Args.MakeArgString(getToolChain().GetFilePath(C, "crt1.o").c_str())); 1785008f54a54299eaafdaa940e2bdeaf55935ecd95aDaniel Dunbar CmdArgs.push_back(Args.MakeArgString(getToolChain().GetFilePath(C, "crti.o").c_str())); 1786008f54a54299eaafdaa940e2bdeaf55935ecd95aDaniel Dunbar CmdArgs.push_back(Args.MakeArgString(getToolChain().GetFilePath(C, "crtbegin.o").c_str())); 1787008f54a54299eaafdaa940e2bdeaf55935ecd95aDaniel Dunbar } else { 1788008f54a54299eaafdaa940e2bdeaf55935ecd95aDaniel Dunbar CmdArgs.push_back(Args.MakeArgString(getToolChain().GetFilePath(C, "crti.o").c_str())); 1789008f54a54299eaafdaa940e2bdeaf55935ecd95aDaniel Dunbar CmdArgs.push_back(Args.MakeArgString(getToolChain().GetFilePath(C, "crtbeginS.o").c_str())); 1790008f54a54299eaafdaa940e2bdeaf55935ecd95aDaniel Dunbar } 1791008f54a54299eaafdaa940e2bdeaf55935ecd95aDaniel Dunbar } 1792008f54a54299eaafdaa940e2bdeaf55935ecd95aDaniel Dunbar 1793008f54a54299eaafdaa940e2bdeaf55935ecd95aDaniel Dunbar Args.AddAllArgs(CmdArgs, options::OPT_L); 1794008f54a54299eaafdaa940e2bdeaf55935ecd95aDaniel Dunbar Args.AddAllArgs(CmdArgs, options::OPT_T_Group); 1795008f54a54299eaafdaa940e2bdeaf55935ecd95aDaniel Dunbar Args.AddAllArgs(CmdArgs, options::OPT_e); 1796008f54a54299eaafdaa940e2bdeaf55935ecd95aDaniel Dunbar 1797008f54a54299eaafdaa940e2bdeaf55935ecd95aDaniel Dunbar for (InputInfoList::const_iterator 1798c21c485b4fb58ef5d55cf3e523263dd824a2ace4Daniel Dunbar it = Inputs.begin(), ie = Inputs.end(); it != ie; ++it) { 1799008f54a54299eaafdaa940e2bdeaf55935ecd95aDaniel Dunbar const InputInfo &II = *it; 1800a8304f67291b0182fb64f3afc621615288dd1d31Daniel Dunbar 1801a8304f67291b0182fb64f3afc621615288dd1d31Daniel Dunbar // Don't try to pass LLVM inputs to a generic gcc. 1802a8304f67291b0182fb64f3afc621615288dd1d31Daniel Dunbar if (II.getType() == types::TY_LLVMBC) 1803a8304f67291b0182fb64f3afc621615288dd1d31Daniel Dunbar D.Diag(clang::diag::err_drv_no_linker_llvm_support) 1804a8304f67291b0182fb64f3afc621615288dd1d31Daniel Dunbar << getToolChain().getTripleString().c_str(); 1805a8304f67291b0182fb64f3afc621615288dd1d31Daniel Dunbar 1806008f54a54299eaafdaa940e2bdeaf55935ecd95aDaniel Dunbar if (II.isPipe()) 1807008f54a54299eaafdaa940e2bdeaf55935ecd95aDaniel Dunbar CmdArgs.push_back("-"); 1808008f54a54299eaafdaa940e2bdeaf55935ecd95aDaniel Dunbar else if (II.isFilename()) 1809008f54a54299eaafdaa940e2bdeaf55935ecd95aDaniel Dunbar CmdArgs.push_back(II.getFilename()); 1810008f54a54299eaafdaa940e2bdeaf55935ecd95aDaniel Dunbar else 1811008f54a54299eaafdaa940e2bdeaf55935ecd95aDaniel Dunbar II.getInputArg().renderAsInput(Args, CmdArgs); 1812008f54a54299eaafdaa940e2bdeaf55935ecd95aDaniel Dunbar } 1813008f54a54299eaafdaa940e2bdeaf55935ecd95aDaniel Dunbar 1814008f54a54299eaafdaa940e2bdeaf55935ecd95aDaniel Dunbar if (!Args.hasArg(options::OPT_nostdlib) && 1815008f54a54299eaafdaa940e2bdeaf55935ecd95aDaniel Dunbar !Args.hasArg(options::OPT_nodefaultlibs)) { 1816008f54a54299eaafdaa940e2bdeaf55935ecd95aDaniel Dunbar // FIXME: For some reason GCC passes -lgcc and -lgcc_s before adding 1817008f54a54299eaafdaa940e2bdeaf55935ecd95aDaniel Dunbar // the default system libraries. Just mimic this for now. 1818008f54a54299eaafdaa940e2bdeaf55935ecd95aDaniel Dunbar CmdArgs.push_back("-lgcc"); 1819008f54a54299eaafdaa940e2bdeaf55935ecd95aDaniel Dunbar if (Args.hasArg(options::OPT_static)) { 1820008f54a54299eaafdaa940e2bdeaf55935ecd95aDaniel Dunbar CmdArgs.push_back("-lgcc_eh"); 1821008f54a54299eaafdaa940e2bdeaf55935ecd95aDaniel Dunbar } else { 1822008f54a54299eaafdaa940e2bdeaf55935ecd95aDaniel Dunbar CmdArgs.push_back("--as-needed"); 1823008f54a54299eaafdaa940e2bdeaf55935ecd95aDaniel Dunbar CmdArgs.push_back("-lgcc_s"); 1824008f54a54299eaafdaa940e2bdeaf55935ecd95aDaniel Dunbar CmdArgs.push_back("--no-as-needed"); 1825008f54a54299eaafdaa940e2bdeaf55935ecd95aDaniel Dunbar } 1826008f54a54299eaafdaa940e2bdeaf55935ecd95aDaniel Dunbar 1827008f54a54299eaafdaa940e2bdeaf55935ecd95aDaniel Dunbar if (Args.hasArg(options::OPT_pthread)) 1828008f54a54299eaafdaa940e2bdeaf55935ecd95aDaniel Dunbar CmdArgs.push_back("-lpthread"); 1829008f54a54299eaafdaa940e2bdeaf55935ecd95aDaniel Dunbar CmdArgs.push_back("-lc"); 1830008f54a54299eaafdaa940e2bdeaf55935ecd95aDaniel Dunbar 1831008f54a54299eaafdaa940e2bdeaf55935ecd95aDaniel Dunbar CmdArgs.push_back("-lgcc"); 1832008f54a54299eaafdaa940e2bdeaf55935ecd95aDaniel Dunbar if (Args.hasArg(options::OPT_static)) { 1833008f54a54299eaafdaa940e2bdeaf55935ecd95aDaniel Dunbar CmdArgs.push_back("-lgcc_eh"); 1834008f54a54299eaafdaa940e2bdeaf55935ecd95aDaniel Dunbar } else { 1835008f54a54299eaafdaa940e2bdeaf55935ecd95aDaniel Dunbar CmdArgs.push_back("--as-needed"); 1836008f54a54299eaafdaa940e2bdeaf55935ecd95aDaniel Dunbar CmdArgs.push_back("-lgcc_s"); 1837008f54a54299eaafdaa940e2bdeaf55935ecd95aDaniel Dunbar CmdArgs.push_back("--no-as-needed"); 1838008f54a54299eaafdaa940e2bdeaf55935ecd95aDaniel Dunbar } 1839008f54a54299eaafdaa940e2bdeaf55935ecd95aDaniel Dunbar } 1840008f54a54299eaafdaa940e2bdeaf55935ecd95aDaniel Dunbar 1841008f54a54299eaafdaa940e2bdeaf55935ecd95aDaniel Dunbar if (!Args.hasArg(options::OPT_nostdlib) && 1842008f54a54299eaafdaa940e2bdeaf55935ecd95aDaniel Dunbar !Args.hasArg(options::OPT_nostartfiles)) { 1843008f54a54299eaafdaa940e2bdeaf55935ecd95aDaniel Dunbar if (!Args.hasArg(options::OPT_shared)) 1844008f54a54299eaafdaa940e2bdeaf55935ecd95aDaniel Dunbar CmdArgs.push_back(Args.MakeArgString(getToolChain().GetFilePath(C, "crtend.o").c_str())); 1845008f54a54299eaafdaa940e2bdeaf55935ecd95aDaniel Dunbar else 1846008f54a54299eaafdaa940e2bdeaf55935ecd95aDaniel Dunbar CmdArgs.push_back(Args.MakeArgString(getToolChain().GetFilePath(C, "crtendS.o").c_str())); 1847008f54a54299eaafdaa940e2bdeaf55935ecd95aDaniel Dunbar CmdArgs.push_back(Args.MakeArgString(getToolChain().GetFilePath(C, "crtn.o").c_str())); 1848008f54a54299eaafdaa940e2bdeaf55935ecd95aDaniel Dunbar } 1849008f54a54299eaafdaa940e2bdeaf55935ecd95aDaniel Dunbar 1850c21c485b4fb58ef5d55cf3e523263dd824a2ace4Daniel Dunbar const char *Exec = 1851008f54a54299eaafdaa940e2bdeaf55935ecd95aDaniel Dunbar Args.MakeArgString(getToolChain().GetProgramPath(C, "ld").c_str()); 1852008f54a54299eaafdaa940e2bdeaf55935ecd95aDaniel Dunbar Dest.addCommand(new Command(Exec, CmdArgs)); 1853008f54a54299eaafdaa940e2bdeaf55935ecd95aDaniel Dunbar} 185411e1b40d759a643086f590f6ffbd9d68360bad46Daniel Dunbar 185511e1b40d759a643086f590f6ffbd9d68360bad46Daniel Dunbar/// DragonFly Tools 185611e1b40d759a643086f590f6ffbd9d68360bad46Daniel Dunbar 185711e1b40d759a643086f590f6ffbd9d68360bad46Daniel Dunbar// For now, DragonFly Assemble does just about the same as for 185811e1b40d759a643086f590f6ffbd9d68360bad46Daniel Dunbar// FreeBSD, but this may change soon. 185911e1b40d759a643086f590f6ffbd9d68360bad46Daniel Dunbarvoid dragonfly::Assemble::ConstructJob(Compilation &C, const JobAction &JA, 186011e1b40d759a643086f590f6ffbd9d68360bad46Daniel Dunbar Job &Dest, const InputInfo &Output, 186111e1b40d759a643086f590f6ffbd9d68360bad46Daniel Dunbar const InputInfoList &Inputs, 186211e1b40d759a643086f590f6ffbd9d68360bad46Daniel Dunbar const ArgList &Args, 186311e1b40d759a643086f590f6ffbd9d68360bad46Daniel Dunbar const char *LinkingOutput) const { 186411e1b40d759a643086f590f6ffbd9d68360bad46Daniel Dunbar ArgStringList CmdArgs; 186511e1b40d759a643086f590f6ffbd9d68360bad46Daniel Dunbar 186611e1b40d759a643086f590f6ffbd9d68360bad46Daniel Dunbar // When building 32-bit code on DragonFly/pc64, we have to explicitly 186711e1b40d759a643086f590f6ffbd9d68360bad46Daniel Dunbar // instruct as in the base system to assemble 32-bit code. 186811e1b40d759a643086f590f6ffbd9d68360bad46Daniel Dunbar if (getToolChain().getArchName() == "i386") 186911e1b40d759a643086f590f6ffbd9d68360bad46Daniel Dunbar CmdArgs.push_back("--32"); 187011e1b40d759a643086f590f6ffbd9d68360bad46Daniel Dunbar 187111e1b40d759a643086f590f6ffbd9d68360bad46Daniel Dunbar Args.AddAllArgValues(CmdArgs, options::OPT_Wa_COMMA, 187211e1b40d759a643086f590f6ffbd9d68360bad46Daniel Dunbar options::OPT_Xassembler); 187311e1b40d759a643086f590f6ffbd9d68360bad46Daniel Dunbar 187411e1b40d759a643086f590f6ffbd9d68360bad46Daniel Dunbar CmdArgs.push_back("-o"); 187511e1b40d759a643086f590f6ffbd9d68360bad46Daniel Dunbar if (Output.isPipe()) 187611e1b40d759a643086f590f6ffbd9d68360bad46Daniel Dunbar CmdArgs.push_back("-"); 187711e1b40d759a643086f590f6ffbd9d68360bad46Daniel Dunbar else 187811e1b40d759a643086f590f6ffbd9d68360bad46Daniel Dunbar CmdArgs.push_back(Output.getFilename()); 187911e1b40d759a643086f590f6ffbd9d68360bad46Daniel Dunbar 188011e1b40d759a643086f590f6ffbd9d68360bad46Daniel Dunbar for (InputInfoList::const_iterator 188111e1b40d759a643086f590f6ffbd9d68360bad46Daniel Dunbar it = Inputs.begin(), ie = Inputs.end(); it != ie; ++it) { 188211e1b40d759a643086f590f6ffbd9d68360bad46Daniel Dunbar const InputInfo &II = *it; 188311e1b40d759a643086f590f6ffbd9d68360bad46Daniel Dunbar if (II.isPipe()) 188411e1b40d759a643086f590f6ffbd9d68360bad46Daniel Dunbar CmdArgs.push_back("-"); 188511e1b40d759a643086f590f6ffbd9d68360bad46Daniel Dunbar else 188611e1b40d759a643086f590f6ffbd9d68360bad46Daniel Dunbar CmdArgs.push_back(II.getFilename()); 188711e1b40d759a643086f590f6ffbd9d68360bad46Daniel Dunbar } 188811e1b40d759a643086f590f6ffbd9d68360bad46Daniel Dunbar 188911e1b40d759a643086f590f6ffbd9d68360bad46Daniel Dunbar const char *Exec = 189011e1b40d759a643086f590f6ffbd9d68360bad46Daniel Dunbar Args.MakeArgString(getToolChain().GetProgramPath(C, "as").c_str()); 189111e1b40d759a643086f590f6ffbd9d68360bad46Daniel Dunbar Dest.addCommand(new Command(Exec, CmdArgs)); 189211e1b40d759a643086f590f6ffbd9d68360bad46Daniel Dunbar} 189311e1b40d759a643086f590f6ffbd9d68360bad46Daniel Dunbar 189411e1b40d759a643086f590f6ffbd9d68360bad46Daniel Dunbarvoid dragonfly::Link::ConstructJob(Compilation &C, const JobAction &JA, 189511e1b40d759a643086f590f6ffbd9d68360bad46Daniel Dunbar Job &Dest, const InputInfo &Output, 189611e1b40d759a643086f590f6ffbd9d68360bad46Daniel Dunbar const InputInfoList &Inputs, 189711e1b40d759a643086f590f6ffbd9d68360bad46Daniel Dunbar const ArgList &Args, 189811e1b40d759a643086f590f6ffbd9d68360bad46Daniel Dunbar const char *LinkingOutput) const { 1899a8304f67291b0182fb64f3afc621615288dd1d31Daniel Dunbar const Driver &D = getToolChain().getHost().getDriver(); 190011e1b40d759a643086f590f6ffbd9d68360bad46Daniel Dunbar ArgStringList CmdArgs; 190111e1b40d759a643086f590f6ffbd9d68360bad46Daniel Dunbar 190211e1b40d759a643086f590f6ffbd9d68360bad46Daniel Dunbar if (Args.hasArg(options::OPT_static)) { 190311e1b40d759a643086f590f6ffbd9d68360bad46Daniel Dunbar CmdArgs.push_back("-Bstatic"); 190411e1b40d759a643086f590f6ffbd9d68360bad46Daniel Dunbar } else { 190511e1b40d759a643086f590f6ffbd9d68360bad46Daniel Dunbar if (Args.hasArg(options::OPT_shared)) 190611e1b40d759a643086f590f6ffbd9d68360bad46Daniel Dunbar CmdArgs.push_back("-Bshareable"); 190711e1b40d759a643086f590f6ffbd9d68360bad46Daniel Dunbar else { 190811e1b40d759a643086f590f6ffbd9d68360bad46Daniel Dunbar CmdArgs.push_back("-dynamic-linker"); 190911e1b40d759a643086f590f6ffbd9d68360bad46Daniel Dunbar CmdArgs.push_back("/usr/libexec/ld-elf.so.2"); 191011e1b40d759a643086f590f6ffbd9d68360bad46Daniel Dunbar } 191111e1b40d759a643086f590f6ffbd9d68360bad46Daniel Dunbar } 191211e1b40d759a643086f590f6ffbd9d68360bad46Daniel Dunbar 191311e1b40d759a643086f590f6ffbd9d68360bad46Daniel Dunbar // When building 32-bit code on DragonFly/pc64, we have to explicitly 191411e1b40d759a643086f590f6ffbd9d68360bad46Daniel Dunbar // instruct ld in the base system to link 32-bit code. 191511e1b40d759a643086f590f6ffbd9d68360bad46Daniel Dunbar if (getToolChain().getArchName() == "i386") { 191611e1b40d759a643086f590f6ffbd9d68360bad46Daniel Dunbar CmdArgs.push_back("-m"); 191711e1b40d759a643086f590f6ffbd9d68360bad46Daniel Dunbar CmdArgs.push_back("elf_i386"); 191811e1b40d759a643086f590f6ffbd9d68360bad46Daniel Dunbar } 191911e1b40d759a643086f590f6ffbd9d68360bad46Daniel Dunbar 192011e1b40d759a643086f590f6ffbd9d68360bad46Daniel Dunbar if (Output.isPipe()) { 192111e1b40d759a643086f590f6ffbd9d68360bad46Daniel Dunbar CmdArgs.push_back("-o"); 192211e1b40d759a643086f590f6ffbd9d68360bad46Daniel Dunbar CmdArgs.push_back("-"); 192311e1b40d759a643086f590f6ffbd9d68360bad46Daniel Dunbar } else if (Output.isFilename()) { 192411e1b40d759a643086f590f6ffbd9d68360bad46Daniel Dunbar CmdArgs.push_back("-o"); 192511e1b40d759a643086f590f6ffbd9d68360bad46Daniel Dunbar CmdArgs.push_back(Output.getFilename()); 192611e1b40d759a643086f590f6ffbd9d68360bad46Daniel Dunbar } else { 192711e1b40d759a643086f590f6ffbd9d68360bad46Daniel Dunbar assert(Output.isNothing() && "Invalid output."); 192811e1b40d759a643086f590f6ffbd9d68360bad46Daniel Dunbar } 192911e1b40d759a643086f590f6ffbd9d68360bad46Daniel Dunbar 193011e1b40d759a643086f590f6ffbd9d68360bad46Daniel Dunbar if (!Args.hasArg(options::OPT_nostdlib) && 193111e1b40d759a643086f590f6ffbd9d68360bad46Daniel Dunbar !Args.hasArg(options::OPT_nostartfiles)) { 193211e1b40d759a643086f590f6ffbd9d68360bad46Daniel Dunbar if (!Args.hasArg(options::OPT_shared)) { 193311e1b40d759a643086f590f6ffbd9d68360bad46Daniel Dunbar CmdArgs.push_back(Args.MakeArgString(getToolChain().GetFilePath(C, "crt1.o").c_str())); 193411e1b40d759a643086f590f6ffbd9d68360bad46Daniel Dunbar CmdArgs.push_back(Args.MakeArgString(getToolChain().GetFilePath(C, "crti.o").c_str())); 193511e1b40d759a643086f590f6ffbd9d68360bad46Daniel Dunbar CmdArgs.push_back(Args.MakeArgString(getToolChain().GetFilePath(C, "crtbegin.o").c_str())); 193611e1b40d759a643086f590f6ffbd9d68360bad46Daniel Dunbar } else { 193711e1b40d759a643086f590f6ffbd9d68360bad46Daniel Dunbar CmdArgs.push_back(Args.MakeArgString(getToolChain().GetFilePath(C, "crti.o").c_str())); 193811e1b40d759a643086f590f6ffbd9d68360bad46Daniel Dunbar CmdArgs.push_back(Args.MakeArgString(getToolChain().GetFilePath(C, "crtbeginS.o").c_str())); 193911e1b40d759a643086f590f6ffbd9d68360bad46Daniel Dunbar } 194011e1b40d759a643086f590f6ffbd9d68360bad46Daniel Dunbar } 194111e1b40d759a643086f590f6ffbd9d68360bad46Daniel Dunbar 194211e1b40d759a643086f590f6ffbd9d68360bad46Daniel Dunbar Args.AddAllArgs(CmdArgs, options::OPT_L); 194311e1b40d759a643086f590f6ffbd9d68360bad46Daniel Dunbar Args.AddAllArgs(CmdArgs, options::OPT_T_Group); 194411e1b40d759a643086f590f6ffbd9d68360bad46Daniel Dunbar Args.AddAllArgs(CmdArgs, options::OPT_e); 194511e1b40d759a643086f590f6ffbd9d68360bad46Daniel Dunbar 194611e1b40d759a643086f590f6ffbd9d68360bad46Daniel Dunbar for (InputInfoList::const_iterator 194711e1b40d759a643086f590f6ffbd9d68360bad46Daniel Dunbar it = Inputs.begin(), ie = Inputs.end(); it != ie; ++it) { 194811e1b40d759a643086f590f6ffbd9d68360bad46Daniel Dunbar const InputInfo &II = *it; 1949a8304f67291b0182fb64f3afc621615288dd1d31Daniel Dunbar 1950a8304f67291b0182fb64f3afc621615288dd1d31Daniel Dunbar // Don't try to pass LLVM inputs to a generic gcc. 1951a8304f67291b0182fb64f3afc621615288dd1d31Daniel Dunbar if (II.getType() == types::TY_LLVMBC) 1952a8304f67291b0182fb64f3afc621615288dd1d31Daniel Dunbar D.Diag(clang::diag::err_drv_no_linker_llvm_support) 1953a8304f67291b0182fb64f3afc621615288dd1d31Daniel Dunbar << getToolChain().getTripleString().c_str(); 1954a8304f67291b0182fb64f3afc621615288dd1d31Daniel Dunbar 195511e1b40d759a643086f590f6ffbd9d68360bad46Daniel Dunbar if (II.isPipe()) 195611e1b40d759a643086f590f6ffbd9d68360bad46Daniel Dunbar CmdArgs.push_back("-"); 195711e1b40d759a643086f590f6ffbd9d68360bad46Daniel Dunbar else if (II.isFilename()) 195811e1b40d759a643086f590f6ffbd9d68360bad46Daniel Dunbar CmdArgs.push_back(II.getFilename()); 195911e1b40d759a643086f590f6ffbd9d68360bad46Daniel Dunbar else 196011e1b40d759a643086f590f6ffbd9d68360bad46Daniel Dunbar II.getInputArg().renderAsInput(Args, CmdArgs); 196111e1b40d759a643086f590f6ffbd9d68360bad46Daniel Dunbar } 196211e1b40d759a643086f590f6ffbd9d68360bad46Daniel Dunbar 196311e1b40d759a643086f590f6ffbd9d68360bad46Daniel Dunbar if (!Args.hasArg(options::OPT_nostdlib) && 196411e1b40d759a643086f590f6ffbd9d68360bad46Daniel Dunbar !Args.hasArg(options::OPT_nodefaultlibs)) { 196511e1b40d759a643086f590f6ffbd9d68360bad46Daniel Dunbar // FIXME: GCC passes on -lgcc, -lgcc_pic and a whole lot of 196611e1b40d759a643086f590f6ffbd9d68360bad46Daniel Dunbar // rpaths 196711e1b40d759a643086f590f6ffbd9d68360bad46Daniel Dunbar CmdArgs.push_back("-L/usr/lib/gcc41"); 196811e1b40d759a643086f590f6ffbd9d68360bad46Daniel Dunbar 196911e1b40d759a643086f590f6ffbd9d68360bad46Daniel Dunbar if (!Args.hasArg(options::OPT_static)) { 197011e1b40d759a643086f590f6ffbd9d68360bad46Daniel Dunbar CmdArgs.push_back("-rpath"); 197111e1b40d759a643086f590f6ffbd9d68360bad46Daniel Dunbar CmdArgs.push_back("/usr/lib/gcc41"); 197211e1b40d759a643086f590f6ffbd9d68360bad46Daniel Dunbar 197311e1b40d759a643086f590f6ffbd9d68360bad46Daniel Dunbar CmdArgs.push_back("-rpath-link"); 197411e1b40d759a643086f590f6ffbd9d68360bad46Daniel Dunbar CmdArgs.push_back("/usr/lib/gcc41"); 197511e1b40d759a643086f590f6ffbd9d68360bad46Daniel Dunbar 197611e1b40d759a643086f590f6ffbd9d68360bad46Daniel Dunbar CmdArgs.push_back("-rpath"); 197711e1b40d759a643086f590f6ffbd9d68360bad46Daniel Dunbar CmdArgs.push_back("/usr/lib"); 197811e1b40d759a643086f590f6ffbd9d68360bad46Daniel Dunbar 197911e1b40d759a643086f590f6ffbd9d68360bad46Daniel Dunbar CmdArgs.push_back("-rpath-link"); 198011e1b40d759a643086f590f6ffbd9d68360bad46Daniel Dunbar CmdArgs.push_back("/usr/lib"); 198111e1b40d759a643086f590f6ffbd9d68360bad46Daniel Dunbar } 198211e1b40d759a643086f590f6ffbd9d68360bad46Daniel Dunbar 198311e1b40d759a643086f590f6ffbd9d68360bad46Daniel Dunbar if (Args.hasArg(options::OPT_shared)) { 198411e1b40d759a643086f590f6ffbd9d68360bad46Daniel Dunbar CmdArgs.push_back("-lgcc_pic"); 198511e1b40d759a643086f590f6ffbd9d68360bad46Daniel Dunbar } else { 198611e1b40d759a643086f590f6ffbd9d68360bad46Daniel Dunbar CmdArgs.push_back("-lgcc"); 198711e1b40d759a643086f590f6ffbd9d68360bad46Daniel Dunbar } 198811e1b40d759a643086f590f6ffbd9d68360bad46Daniel Dunbar 198911e1b40d759a643086f590f6ffbd9d68360bad46Daniel Dunbar 199011e1b40d759a643086f590f6ffbd9d68360bad46Daniel Dunbar if (Args.hasArg(options::OPT_pthread)) 199111e1b40d759a643086f590f6ffbd9d68360bad46Daniel Dunbar CmdArgs.push_back("-lthread_xu"); 199211e1b40d759a643086f590f6ffbd9d68360bad46Daniel Dunbar 199311e1b40d759a643086f590f6ffbd9d68360bad46Daniel Dunbar if (!Args.hasArg(options::OPT_nolibc)) { 199411e1b40d759a643086f590f6ffbd9d68360bad46Daniel Dunbar CmdArgs.push_back("-lc"); 199511e1b40d759a643086f590f6ffbd9d68360bad46Daniel Dunbar } 199611e1b40d759a643086f590f6ffbd9d68360bad46Daniel Dunbar 199711e1b40d759a643086f590f6ffbd9d68360bad46Daniel Dunbar if (Args.hasArg(options::OPT_shared)) { 199811e1b40d759a643086f590f6ffbd9d68360bad46Daniel Dunbar CmdArgs.push_back("-lgcc_pic"); 199911e1b40d759a643086f590f6ffbd9d68360bad46Daniel Dunbar } else { 200011e1b40d759a643086f590f6ffbd9d68360bad46Daniel Dunbar CmdArgs.push_back("-lgcc"); 200111e1b40d759a643086f590f6ffbd9d68360bad46Daniel Dunbar } 200211e1b40d759a643086f590f6ffbd9d68360bad46Daniel Dunbar } 200311e1b40d759a643086f590f6ffbd9d68360bad46Daniel Dunbar 200411e1b40d759a643086f590f6ffbd9d68360bad46Daniel Dunbar if (!Args.hasArg(options::OPT_nostdlib) && 200511e1b40d759a643086f590f6ffbd9d68360bad46Daniel Dunbar !Args.hasArg(options::OPT_nostartfiles)) { 200611e1b40d759a643086f590f6ffbd9d68360bad46Daniel Dunbar if (!Args.hasArg(options::OPT_shared)) 200711e1b40d759a643086f590f6ffbd9d68360bad46Daniel Dunbar CmdArgs.push_back(Args.MakeArgString(getToolChain().GetFilePath(C, "crtend.o").c_str())); 200811e1b40d759a643086f590f6ffbd9d68360bad46Daniel Dunbar else 200911e1b40d759a643086f590f6ffbd9d68360bad46Daniel Dunbar CmdArgs.push_back(Args.MakeArgString(getToolChain().GetFilePath(C, "crtendS.o").c_str())); 201011e1b40d759a643086f590f6ffbd9d68360bad46Daniel Dunbar CmdArgs.push_back(Args.MakeArgString(getToolChain().GetFilePath(C, "crtn.o").c_str())); 201111e1b40d759a643086f590f6ffbd9d68360bad46Daniel Dunbar } 201211e1b40d759a643086f590f6ffbd9d68360bad46Daniel Dunbar 201311e1b40d759a643086f590f6ffbd9d68360bad46Daniel Dunbar const char *Exec = 201411e1b40d759a643086f590f6ffbd9d68360bad46Daniel Dunbar Args.MakeArgString(getToolChain().GetProgramPath(C, "ld").c_str()); 201511e1b40d759a643086f590f6ffbd9d68360bad46Daniel Dunbar Dest.addCommand(new Command(Exec, CmdArgs)); 201611e1b40d759a643086f590f6ffbd9d68360bad46Daniel Dunbar} 2017