Tools.cpp revision cd9902bfb79c5c67559360514951714bdafac36e
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" 15ee848a73e5f8ffe7511af8652ba811c020d1c7a0Daniel Dunbar#include "clang/Driver/Driver.h" 16ee848a73e5f8ffe7511af8652ba811c020d1c7a0Daniel Dunbar#include "clang/Driver/DriverDiagnostic.h" 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" 21265e9ef9f3ef30a97790e6e7bbc3c17d97981ca7Daniel Dunbar#include "clang/Driver/Options.h" 22b488c1dac8e53206f07103d794a62a3f5012c0f4Daniel Dunbar#include "clang/Driver/ToolChain.h" 23871adcf4e41285e3f4c3b62eaa1b2e05b60b92daDaniel Dunbar#include "clang/Driver/Util.h" 24871adcf4e41285e3f4c3b62eaa1b2e05b60b92daDaniel Dunbar 25881376467c46c5c6cc16fa6790271c2c22e1d4f1Daniel Dunbar#include "llvm/ADT/SmallString.h" 2655d3f7ae512875a1d6402943c3a619633feb2a18Douglas Gregor#include "llvm/ADT/StringSwitch.h" 275b750fe6189a41937ff2b080a983c95ea273769fDaniel Dunbar#include "llvm/ADT/Twine.h" 2802633b541b04ad5ffc1c70f4c2feeeb13e607057Daniel Dunbar#include "llvm/Support/Format.h" 2902633b541b04ad5ffc1c70f4c2feeeb13e607057Daniel Dunbar#include "llvm/Support/raw_ostream.h" 30f86feddbd5b13d2c144132e35d608fa630784dbbDaniel Dunbar#include "llvm/System/Host.h" 3155efe142a84b2aab6d0186c20a311c347a65f794Daniel Dunbar#include "llvm/System/Process.h" 32871adcf4e41285e3f4c3b62eaa1b2e05b60b92daDaniel Dunbar 33871adcf4e41285e3f4c3b62eaa1b2e05b60b92daDaniel Dunbar#include "InputInfo.h" 3402633b541b04ad5ffc1c70f4c2feeeb13e607057Daniel Dunbar#include "ToolChains.h" 35871adcf4e41285e3f4c3b62eaa1b2e05b60b92daDaniel Dunbar 3647ac7d27c44bd64a7d0fc03d4babc196cf2b8230Daniel Dunbarusing namespace clang::driver; 3747ac7d27c44bd64a7d0fc03d4babc196cf2b8230Daniel Dunbarusing namespace clang::driver::tools; 3847ac7d27c44bd64a7d0fc03d4babc196cf2b8230Daniel Dunbar 3988a3d6cf5ebab81614f89ba48a8d89023270637aDaniel Dunbar/// CheckPreprocessingOptions - Perform some validation of preprocessing 4088a3d6cf5ebab81614f89ba48a8d89023270637aDaniel Dunbar/// arguments that is shared with gcc. 4188a3d6cf5ebab81614f89ba48a8d89023270637aDaniel Dunbarstatic void CheckPreprocessingOptions(const Driver &D, const ArgList &Args) { 4288a3d6cf5ebab81614f89ba48a8d89023270637aDaniel Dunbar if (Arg *A = Args.getLastArg(options::OPT_C, options::OPT_CC)) 4388a3d6cf5ebab81614f89ba48a8d89023270637aDaniel Dunbar if (!Args.hasArg(options::OPT_E)) 4488a3d6cf5ebab81614f89ba48a8d89023270637aDaniel Dunbar D.Diag(clang::diag::err_drv_argument_only_allowed_with) 4588a3d6cf5ebab81614f89ba48a8d89023270637aDaniel Dunbar << A->getAsString(Args) << "-E"; 4688a3d6cf5ebab81614f89ba48a8d89023270637aDaniel Dunbar} 4788a3d6cf5ebab81614f89ba48a8d89023270637aDaniel Dunbar 48e2fd66418eca3d70cf6b62087d745d0c5181db69Daniel Dunbar/// CheckCodeGenerationOptions - Perform some validation of code generation 49e2fd66418eca3d70cf6b62087d745d0c5181db69Daniel Dunbar/// arguments that is shared with gcc. 50e2fd66418eca3d70cf6b62087d745d0c5181db69Daniel Dunbarstatic void CheckCodeGenerationOptions(const Driver &D, const ArgList &Args) { 51e2fd66418eca3d70cf6b62087d745d0c5181db69Daniel Dunbar // In gcc, only ARM checks this, but it seems reasonable to check universally. 52e2fd66418eca3d70cf6b62087d745d0c5181db69Daniel Dunbar if (Args.hasArg(options::OPT_static)) 53e2fd66418eca3d70cf6b62087d745d0c5181db69Daniel Dunbar if (const Arg *A = Args.getLastArg(options::OPT_dynamic, 54e2fd66418eca3d70cf6b62087d745d0c5181db69Daniel Dunbar options::OPT_mdynamic_no_pic)) 55e2fd66418eca3d70cf6b62087d745d0c5181db69Daniel Dunbar D.Diag(clang::diag::err_drv_argument_not_allowed_with) 56e2fd66418eca3d70cf6b62087d745d0c5181db69Daniel Dunbar << A->getAsString(Args) << "-static"; 57e2fd66418eca3d70cf6b62087d745d0c5181db69Daniel Dunbar} 58e2fd66418eca3d70cf6b62087d745d0c5181db69Daniel Dunbar 591eb4433ac451dc16f4133a88af2d002ac26c58efMike Stumpvoid Clang::AddPreprocessingOptions(const Driver &D, 60df91ef3d6c55692a0236f67b6c6b134a3bf84098Douglas Gregor const ArgList &Args, 61c21c485b4fb58ef5d55cf3e523263dd824a2ace4Daniel Dunbar ArgStringList &CmdArgs, 62c21c485b4fb58ef5d55cf3e523263dd824a2ace4Daniel Dunbar const InputInfo &Output, 63c21c485b4fb58ef5d55cf3e523263dd824a2ace4Daniel Dunbar const InputInfoList &Inputs) const { 64c21c485b4fb58ef5d55cf3e523263dd824a2ace4Daniel Dunbar Arg *A; 653a183d3d46426d8719031553131b8928f50aa606Daniel Dunbar 6688a3d6cf5ebab81614f89ba48a8d89023270637aDaniel Dunbar CheckPreprocessingOptions(D, Args); 6788a3d6cf5ebab81614f89ba48a8d89023270637aDaniel Dunbar 6888a3d6cf5ebab81614f89ba48a8d89023270637aDaniel Dunbar Args.AddLastArg(CmdArgs, options::OPT_C); 6988a3d6cf5ebab81614f89ba48a8d89023270637aDaniel Dunbar Args.AddLastArg(CmdArgs, options::OPT_CC); 703a183d3d46426d8719031553131b8928f50aa606Daniel Dunbar 713a183d3d46426d8719031553131b8928f50aa606Daniel Dunbar // Handle dependency file generation. 72c21c485b4fb58ef5d55cf3e523263dd824a2ace4Daniel Dunbar if ((A = Args.getLastArg(options::OPT_M)) || 73c21c485b4fb58ef5d55cf3e523263dd824a2ace4Daniel Dunbar (A = Args.getLastArg(options::OPT_MM)) || 74c21c485b4fb58ef5d55cf3e523263dd824a2ace4Daniel Dunbar (A = Args.getLastArg(options::OPT_MD)) || 75c21c485b4fb58ef5d55cf3e523263dd824a2ace4Daniel Dunbar (A = Args.getLastArg(options::OPT_MMD))) { 76c21c485b4fb58ef5d55cf3e523263dd824a2ace4Daniel Dunbar // Determine the output location. 77c21c485b4fb58ef5d55cf3e523263dd824a2ace4Daniel Dunbar const char *DepFile; 78c21c485b4fb58ef5d55cf3e523263dd824a2ace4Daniel Dunbar if (Output.getType() == types::TY_Dependencies) { 79c21c485b4fb58ef5d55cf3e523263dd824a2ace4Daniel Dunbar if (Output.isPipe()) 80c21c485b4fb58ef5d55cf3e523263dd824a2ace4Daniel Dunbar DepFile = "-"; 81c21c485b4fb58ef5d55cf3e523263dd824a2ace4Daniel Dunbar else 82c21c485b4fb58ef5d55cf3e523263dd824a2ace4Daniel Dunbar DepFile = Output.getFilename(); 83c21c485b4fb58ef5d55cf3e523263dd824a2ace4Daniel Dunbar } else if (Arg *MF = Args.getLastArg(options::OPT_MF)) { 84c21c485b4fb58ef5d55cf3e523263dd824a2ace4Daniel Dunbar DepFile = MF->getValue(Args); 85b827a0541b5fd095fcdb7ad0c3df93ca158c619aDaniel Dunbar } else if (A->getOption().matches(options::OPT_M) || 86b827a0541b5fd095fcdb7ad0c3df93ca158c619aDaniel Dunbar A->getOption().matches(options::OPT_MM)) { 87c21c485b4fb58ef5d55cf3e523263dd824a2ace4Daniel Dunbar DepFile = "-"; 88c21c485b4fb58ef5d55cf3e523263dd824a2ace4Daniel Dunbar } else { 89c21c485b4fb58ef5d55cf3e523263dd824a2ace4Daniel Dunbar DepFile = darwin::CC1::getDependencyFileName(Args, Inputs); 90c21c485b4fb58ef5d55cf3e523263dd824a2ace4Daniel Dunbar } 91c21c485b4fb58ef5d55cf3e523263dd824a2ace4Daniel Dunbar CmdArgs.push_back("-dependency-file"); 92c21c485b4fb58ef5d55cf3e523263dd824a2ace4Daniel Dunbar CmdArgs.push_back(DepFile); 93c21c485b4fb58ef5d55cf3e523263dd824a2ace4Daniel Dunbar 94c21c485b4fb58ef5d55cf3e523263dd824a2ace4Daniel Dunbar // Add an -MT option if the user didn't specify their own. 95e0be8b1729d8978de433d229c065830b95d0ae68Daniel Dunbar // 96c21c485b4fb58ef5d55cf3e523263dd824a2ace4Daniel Dunbar // FIXME: This should use -MQ, when we support it. 97c21c485b4fb58ef5d55cf3e523263dd824a2ace4Daniel Dunbar if (!Args.hasArg(options::OPT_MT) && !Args.hasArg(options::OPT_MQ)) { 98c21c485b4fb58ef5d55cf3e523263dd824a2ace4Daniel Dunbar const char *DepTarget; 99c21c485b4fb58ef5d55cf3e523263dd824a2ace4Daniel Dunbar 100c21c485b4fb58ef5d55cf3e523263dd824a2ace4Daniel Dunbar // If user provided -o, that is the dependency target, except 101c21c485b4fb58ef5d55cf3e523263dd824a2ace4Daniel Dunbar // when we are only generating a dependency file. 102c21c485b4fb58ef5d55cf3e523263dd824a2ace4Daniel Dunbar Arg *OutputOpt = Args.getLastArg(options::OPT_o); 103c21c485b4fb58ef5d55cf3e523263dd824a2ace4Daniel Dunbar if (OutputOpt && Output.getType() != types::TY_Dependencies) { 104c21c485b4fb58ef5d55cf3e523263dd824a2ace4Daniel Dunbar DepTarget = OutputOpt->getValue(Args); 105c21c485b4fb58ef5d55cf3e523263dd824a2ace4Daniel Dunbar } else { 106c21c485b4fb58ef5d55cf3e523263dd824a2ace4Daniel Dunbar // Otherwise derive from the base input. 107c21c485b4fb58ef5d55cf3e523263dd824a2ace4Daniel Dunbar // 108c21c485b4fb58ef5d55cf3e523263dd824a2ace4Daniel Dunbar // FIXME: This should use the computed output file location. 109c21c485b4fb58ef5d55cf3e523263dd824a2ace4Daniel Dunbar llvm::sys::Path P(Inputs[0].getBaseInput()); 110c21c485b4fb58ef5d55cf3e523263dd824a2ace4Daniel Dunbar 111c21c485b4fb58ef5d55cf3e523263dd824a2ace4Daniel Dunbar P.eraseSuffix(); 112c21c485b4fb58ef5d55cf3e523263dd824a2ace4Daniel Dunbar P.appendSuffix("o"); 113881376467c46c5c6cc16fa6790271c2c22e1d4f1Daniel Dunbar DepTarget = Args.MakeArgString(P.getLast()); 114c21c485b4fb58ef5d55cf3e523263dd824a2ace4Daniel Dunbar } 115c21c485b4fb58ef5d55cf3e523263dd824a2ace4Daniel Dunbar 116c21c485b4fb58ef5d55cf3e523263dd824a2ace4Daniel Dunbar CmdArgs.push_back("-MT"); 117c21c485b4fb58ef5d55cf3e523263dd824a2ace4Daniel Dunbar CmdArgs.push_back(DepTarget); 118c21c485b4fb58ef5d55cf3e523263dd824a2ace4Daniel Dunbar } 119c21c485b4fb58ef5d55cf3e523263dd824a2ace4Daniel Dunbar 120b827a0541b5fd095fcdb7ad0c3df93ca158c619aDaniel Dunbar if (A->getOption().matches(options::OPT_M) || 121b827a0541b5fd095fcdb7ad0c3df93ca158c619aDaniel Dunbar A->getOption().matches(options::OPT_MD)) 122c21c485b4fb58ef5d55cf3e523263dd824a2ace4Daniel Dunbar CmdArgs.push_back("-sys-header-deps"); 123c21c485b4fb58ef5d55cf3e523263dd824a2ace4Daniel Dunbar } 124c21c485b4fb58ef5d55cf3e523263dd824a2ace4Daniel Dunbar 125c21c485b4fb58ef5d55cf3e523263dd824a2ace4Daniel Dunbar Args.AddLastArg(CmdArgs, options::OPT_MP); 126c21c485b4fb58ef5d55cf3e523263dd824a2ace4Daniel Dunbar Args.AddAllArgs(CmdArgs, options::OPT_MT); 127c21c485b4fb58ef5d55cf3e523263dd824a2ace4Daniel Dunbar 128df91ef3d6c55692a0236f67b6c6b134a3bf84098Douglas Gregor // Add -i* options, and automatically translate to 129df91ef3d6c55692a0236f67b6c6b134a3bf84098Douglas Gregor // -include-pch/-include-pth for transparent PCH support. It's 130df91ef3d6c55692a0236f67b6c6b134a3bf84098Douglas Gregor // wonky, but we include looking for .gch so we can support seamless 131df91ef3d6c55692a0236f67b6c6b134a3bf84098Douglas Gregor // replacement into a build system already set up to be generating 132df91ef3d6c55692a0236f67b6c6b134a3bf84098Douglas Gregor // .gch files. 133cdd9686b890ebdc10039ae256ef4c9dfb5ebacb7Daniel Dunbar for (arg_iterator it = Args.filtered_begin(options::OPT_clang_i_Group), 134cdd9686b890ebdc10039ae256ef4c9dfb5ebacb7Daniel Dunbar ie = Args.filtered_end(); it != ie; ++it) { 135cdd9686b890ebdc10039ae256ef4c9dfb5ebacb7Daniel Dunbar const Arg *A = it; 136c21c485b4fb58ef5d55cf3e523263dd824a2ace4Daniel Dunbar 137c21c485b4fb58ef5d55cf3e523263dd824a2ace4Daniel Dunbar if (A->getOption().matches(options::OPT_include)) { 1380ebd9321ba380471010341f24c874f46f56e7581Daniel Dunbar // Use PCH if the user requested it, except for C++ (for now). 1390ebd9321ba380471010341f24c874f46f56e7581Daniel Dunbar bool UsePCH = D.CCCUsePCH; 1400ebd9321ba380471010341f24c874f46f56e7581Daniel Dunbar if (types::isCXX(Inputs[0].getType())) 1410ebd9321ba380471010341f24c874f46f56e7581Daniel Dunbar UsePCH = false; 1420ebd9321ba380471010341f24c874f46f56e7581Daniel Dunbar 143c21c485b4fb58ef5d55cf3e523263dd824a2ace4Daniel Dunbar bool FoundPTH = false; 144df91ef3d6c55692a0236f67b6c6b134a3bf84098Douglas Gregor bool FoundPCH = false; 145c21c485b4fb58ef5d55cf3e523263dd824a2ace4Daniel Dunbar llvm::sys::Path P(A->getValue(Args)); 1460ebd9321ba380471010341f24c874f46f56e7581Daniel Dunbar if (UsePCH) { 147df91ef3d6c55692a0236f67b6c6b134a3bf84098Douglas Gregor P.appendSuffix("pch"); 148c21c485b4fb58ef5d55cf3e523263dd824a2ace4Daniel Dunbar if (P.exists()) 149df91ef3d6c55692a0236f67b6c6b134a3bf84098Douglas Gregor FoundPCH = true; 1501eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump else 151df91ef3d6c55692a0236f67b6c6b134a3bf84098Douglas Gregor P.eraseSuffix(); 152df91ef3d6c55692a0236f67b6c6b134a3bf84098Douglas Gregor } 153df91ef3d6c55692a0236f67b6c6b134a3bf84098Douglas Gregor 154df91ef3d6c55692a0236f67b6c6b134a3bf84098Douglas Gregor if (!FoundPCH) { 155df91ef3d6c55692a0236f67b6c6b134a3bf84098Douglas Gregor P.appendSuffix("pth"); 1561eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump if (P.exists()) 157c21c485b4fb58ef5d55cf3e523263dd824a2ace4Daniel Dunbar FoundPTH = true; 158df91ef3d6c55692a0236f67b6c6b134a3bf84098Douglas Gregor else 159df91ef3d6c55692a0236f67b6c6b134a3bf84098Douglas Gregor P.eraseSuffix(); 1601eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump } 1611eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump 162df91ef3d6c55692a0236f67b6c6b134a3bf84098Douglas Gregor if (!FoundPCH && !FoundPTH) { 163df91ef3d6c55692a0236f67b6c6b134a3bf84098Douglas Gregor P.appendSuffix("gch"); 164df91ef3d6c55692a0236f67b6c6b134a3bf84098Douglas Gregor if (P.exists()) { 1650ebd9321ba380471010341f24c874f46f56e7581Daniel Dunbar FoundPCH = UsePCH; 1660ebd9321ba380471010341f24c874f46f56e7581Daniel Dunbar FoundPTH = !UsePCH; 167df91ef3d6c55692a0236f67b6c6b134a3bf84098Douglas Gregor } 1681eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump else 169df91ef3d6c55692a0236f67b6c6b134a3bf84098Douglas Gregor P.eraseSuffix(); 170c21c485b4fb58ef5d55cf3e523263dd824a2ace4Daniel Dunbar } 171c21c485b4fb58ef5d55cf3e523263dd824a2ace4Daniel Dunbar 172df91ef3d6c55692a0236f67b6c6b134a3bf84098Douglas Gregor if (FoundPCH || FoundPTH) { 173c21c485b4fb58ef5d55cf3e523263dd824a2ace4Daniel Dunbar A->claim(); 1740ebd9321ba380471010341f24c874f46f56e7581Daniel Dunbar if (UsePCH) 175df91ef3d6c55692a0236f67b6c6b134a3bf84098Douglas Gregor CmdArgs.push_back("-include-pch"); 176df91ef3d6c55692a0236f67b6c6b134a3bf84098Douglas Gregor else 177df91ef3d6c55692a0236f67b6c6b134a3bf84098Douglas Gregor CmdArgs.push_back("-include-pth"); 178881376467c46c5c6cc16fa6790271c2c22e1d4f1Daniel Dunbar CmdArgs.push_back(Args.MakeArgString(P.str())); 179c21c485b4fb58ef5d55cf3e523263dd824a2ace4Daniel Dunbar continue; 180c21c485b4fb58ef5d55cf3e523263dd824a2ace4Daniel Dunbar } 181c21c485b4fb58ef5d55cf3e523263dd824a2ace4Daniel Dunbar } 182c21c485b4fb58ef5d55cf3e523263dd824a2ace4Daniel Dunbar 183c21c485b4fb58ef5d55cf3e523263dd824a2ace4Daniel Dunbar // Not translated, render as usual. 184c21c485b4fb58ef5d55cf3e523263dd824a2ace4Daniel Dunbar A->claim(); 185c21c485b4fb58ef5d55cf3e523263dd824a2ace4Daniel Dunbar A->render(Args, CmdArgs); 186c21c485b4fb58ef5d55cf3e523263dd824a2ace4Daniel Dunbar } 187c21c485b4fb58ef5d55cf3e523263dd824a2ace4Daniel Dunbar 188c21c485b4fb58ef5d55cf3e523263dd824a2ace4Daniel Dunbar Args.AddAllArgs(CmdArgs, options::OPT_D, options::OPT_U); 189c21c485b4fb58ef5d55cf3e523263dd824a2ace4Daniel Dunbar Args.AddAllArgs(CmdArgs, options::OPT_I_Group, options::OPT_F); 190c21c485b4fb58ef5d55cf3e523263dd824a2ace4Daniel Dunbar 191c21c485b4fb58ef5d55cf3e523263dd824a2ace4Daniel Dunbar // Add -Wp, and -Xassembler if using the preprocessor. 192c21c485b4fb58ef5d55cf3e523263dd824a2ace4Daniel Dunbar 193c21c485b4fb58ef5d55cf3e523263dd824a2ace4Daniel Dunbar // FIXME: There is a very unfortunate problem here, some troubled 194c21c485b4fb58ef5d55cf3e523263dd824a2ace4Daniel Dunbar // souls abuse -Wp, to pass preprocessor options in gcc syntax. To 195c21c485b4fb58ef5d55cf3e523263dd824a2ace4Daniel Dunbar // really support that we would have to parse and then translate 196c21c485b4fb58ef5d55cf3e523263dd824a2ace4Daniel Dunbar // those options. :( 197c21c485b4fb58ef5d55cf3e523263dd824a2ace4Daniel Dunbar Args.AddAllArgValues(CmdArgs, options::OPT_Wp_COMMA, 198c21c485b4fb58ef5d55cf3e523263dd824a2ace4Daniel Dunbar options::OPT_Xpreprocessor); 199607d7f6d8f21066cc48bbe2c51e6ca412a00943fDaniel Dunbar 200607d7f6d8f21066cc48bbe2c51e6ca412a00943fDaniel Dunbar // -I- is a deprecated GCC feature, reject it. 201607d7f6d8f21066cc48bbe2c51e6ca412a00943fDaniel Dunbar if (Arg *A = Args.getLastArg(options::OPT_I_)) 202607d7f6d8f21066cc48bbe2c51e6ca412a00943fDaniel Dunbar D.Diag(clang::diag::err_drv_I_dash_not_supported) << A->getAsString(Args); 203c21c485b4fb58ef5d55cf3e523263dd824a2ace4Daniel Dunbar} 204c21c485b4fb58ef5d55cf3e523263dd824a2ace4Daniel Dunbar 205728a512753d85a6ccaae34e81385c8665c2de0e1Daniel Dunbar/// getARMTargetCPU - Get the (LLVM) name of the ARM cpu we are targetting. 206728a512753d85a6ccaae34e81385c8665c2de0e1Daniel Dunbar// 207728a512753d85a6ccaae34e81385c8665c2de0e1Daniel Dunbar// FIXME: tblgen this. 208a31100e62f83933432df9092a04e48f9e5561a14Daniel Dunbarstatic const char *getARMTargetCPU(const ArgList &Args) { 209728a512753d85a6ccaae34e81385c8665c2de0e1Daniel Dunbar // FIXME: Warn on inconsistent use of -mcpu and -march. 210b163ef7e7a5d904ef0962a7c38c460be083c4d63Daniel Dunbar 211b163ef7e7a5d904ef0962a7c38c460be083c4d63Daniel Dunbar // If we have -mcpu=, use that. 212b163ef7e7a5d904ef0962a7c38c460be083c4d63Daniel Dunbar if (Arg *A = Args.getLastArg(options::OPT_mcpu_EQ)) 213b163ef7e7a5d904ef0962a7c38c460be083c4d63Daniel Dunbar return A->getValue(Args); 214b163ef7e7a5d904ef0962a7c38c460be083c4d63Daniel Dunbar 215b163ef7e7a5d904ef0962a7c38c460be083c4d63Daniel Dunbar // Otherwise, if we have -march= choose the base CPU for that arch. 216b163ef7e7a5d904ef0962a7c38c460be083c4d63Daniel Dunbar if (Arg *A = Args.getLastArg(options::OPT_march_EQ)) { 217b163ef7e7a5d904ef0962a7c38c460be083c4d63Daniel Dunbar llvm::StringRef MArch = A->getValue(Args); 218b163ef7e7a5d904ef0962a7c38c460be083c4d63Daniel Dunbar 219b163ef7e7a5d904ef0962a7c38c460be083c4d63Daniel Dunbar if (MArch == "armv2" || MArch == "armv2a") 220b163ef7e7a5d904ef0962a7c38c460be083c4d63Daniel Dunbar return "arm2"; 221b163ef7e7a5d904ef0962a7c38c460be083c4d63Daniel Dunbar if (MArch == "armv3") 222b163ef7e7a5d904ef0962a7c38c460be083c4d63Daniel Dunbar return "arm6"; 223b163ef7e7a5d904ef0962a7c38c460be083c4d63Daniel Dunbar if (MArch == "armv3m") 224b163ef7e7a5d904ef0962a7c38c460be083c4d63Daniel Dunbar return "arm7m"; 225b163ef7e7a5d904ef0962a7c38c460be083c4d63Daniel Dunbar if (MArch == "armv4" || MArch == "armv4t") 226b163ef7e7a5d904ef0962a7c38c460be083c4d63Daniel Dunbar return "arm7tdmi"; 227b163ef7e7a5d904ef0962a7c38c460be083c4d63Daniel Dunbar if (MArch == "armv5" || MArch == "armv5t") 228b163ef7e7a5d904ef0962a7c38c460be083c4d63Daniel Dunbar return "arm10tdmi"; 229b163ef7e7a5d904ef0962a7c38c460be083c4d63Daniel Dunbar if (MArch == "armv5e" || MArch == "armv5te") 230b163ef7e7a5d904ef0962a7c38c460be083c4d63Daniel Dunbar return "arm1026ejs"; 231b163ef7e7a5d904ef0962a7c38c460be083c4d63Daniel Dunbar if (MArch == "armv5tej") 23297f52ac45369f6925b548404e61d511034c874ecDaniel Dunbar return "arm926ej-s"; 233b163ef7e7a5d904ef0962a7c38c460be083c4d63Daniel Dunbar if (MArch == "armv6" || MArch == "armv6k") 234b163ef7e7a5d904ef0962a7c38c460be083c4d63Daniel Dunbar return "arm1136jf-s"; 235b163ef7e7a5d904ef0962a7c38c460be083c4d63Daniel Dunbar if (MArch == "armv6j") 236b163ef7e7a5d904ef0962a7c38c460be083c4d63Daniel Dunbar return "arm1136j-s"; 237b163ef7e7a5d904ef0962a7c38c460be083c4d63Daniel Dunbar if (MArch == "armv6z" || MArch == "armv6zk") 238b163ef7e7a5d904ef0962a7c38c460be083c4d63Daniel Dunbar return "arm1176jzf-s"; 239b163ef7e7a5d904ef0962a7c38c460be083c4d63Daniel Dunbar if (MArch == "armv6t2") 240b163ef7e7a5d904ef0962a7c38c460be083c4d63Daniel Dunbar return "arm1156t2-s"; 241b163ef7e7a5d904ef0962a7c38c460be083c4d63Daniel Dunbar if (MArch == "armv7" || MArch == "armv7a" || MArch == "armv7-a") 242b163ef7e7a5d904ef0962a7c38c460be083c4d63Daniel Dunbar return "cortex-a8"; 243b163ef7e7a5d904ef0962a7c38c460be083c4d63Daniel Dunbar if (MArch == "armv7r" || MArch == "armv7-r") 244b163ef7e7a5d904ef0962a7c38c460be083c4d63Daniel Dunbar return "cortex-r4"; 245b163ef7e7a5d904ef0962a7c38c460be083c4d63Daniel Dunbar if (MArch == "armv7m" || MArch == "armv7-m") 246b163ef7e7a5d904ef0962a7c38c460be083c4d63Daniel Dunbar return "cortex-m3"; 247b163ef7e7a5d904ef0962a7c38c460be083c4d63Daniel Dunbar if (MArch == "ep9312") 248b163ef7e7a5d904ef0962a7c38c460be083c4d63Daniel Dunbar return "ep9312"; 249b163ef7e7a5d904ef0962a7c38c460be083c4d63Daniel Dunbar if (MArch == "iwmmxt") 250b163ef7e7a5d904ef0962a7c38c460be083c4d63Daniel Dunbar return "iwmmxt"; 251b163ef7e7a5d904ef0962a7c38c460be083c4d63Daniel Dunbar if (MArch == "xscale") 252b163ef7e7a5d904ef0962a7c38c460be083c4d63Daniel Dunbar return "xscale"; 253b163ef7e7a5d904ef0962a7c38c460be083c4d63Daniel Dunbar } 254b163ef7e7a5d904ef0962a7c38c460be083c4d63Daniel Dunbar 255b163ef7e7a5d904ef0962a7c38c460be083c4d63Daniel Dunbar // Otherwise return the most base CPU LLVM supports. 256b163ef7e7a5d904ef0962a7c38c460be083c4d63Daniel Dunbar return "arm7tdmi"; 257b163ef7e7a5d904ef0962a7c38c460be083c4d63Daniel Dunbar} 258b163ef7e7a5d904ef0962a7c38c460be083c4d63Daniel Dunbar 2591d65e4be6f22f7e4b4974efbaef92fa3454f1ec8Daniel Dunbar/// getLLVMArchSuffixForARM - Get the LLVM arch name to use for a particular 260728a512753d85a6ccaae34e81385c8665c2de0e1Daniel Dunbar/// CPU. 261728a512753d85a6ccaae34e81385c8665c2de0e1Daniel Dunbar// 262728a512753d85a6ccaae34e81385c8665c2de0e1Daniel Dunbar// FIXME: This is redundant with -mcpu, why does LLVM use this. 263728a512753d85a6ccaae34e81385c8665c2de0e1Daniel Dunbar// FIXME: tblgen this, or kill it! 2641d65e4be6f22f7e4b4974efbaef92fa3454f1ec8Daniel Dunbarstatic const char *getLLVMArchSuffixForARM(llvm::StringRef CPU) { 265728a512753d85a6ccaae34e81385c8665c2de0e1Daniel Dunbar if (CPU == "arm7tdmi" || CPU == "arm7tdmi-s" || CPU == "arm710t" || 266728a512753d85a6ccaae34e81385c8665c2de0e1Daniel Dunbar CPU == "arm720t" || CPU == "arm9" || CPU == "arm9tdmi" || 267728a512753d85a6ccaae34e81385c8665c2de0e1Daniel Dunbar CPU == "arm920" || CPU == "arm920t" || CPU == "arm922t" || 268728a512753d85a6ccaae34e81385c8665c2de0e1Daniel Dunbar CPU == "arm940t" || CPU == "ep9312") 2691d65e4be6f22f7e4b4974efbaef92fa3454f1ec8Daniel Dunbar return "v4t"; 270728a512753d85a6ccaae34e81385c8665c2de0e1Daniel Dunbar 271728a512753d85a6ccaae34e81385c8665c2de0e1Daniel Dunbar if (CPU == "arm10tdmi" || CPU == "arm1020t") 2721d65e4be6f22f7e4b4974efbaef92fa3454f1ec8Daniel Dunbar return "v5"; 273728a512753d85a6ccaae34e81385c8665c2de0e1Daniel Dunbar 274728a512753d85a6ccaae34e81385c8665c2de0e1Daniel Dunbar if (CPU == "arm9e" || CPU == "arm926ej-s" || CPU == "arm946e-s" || 275728a512753d85a6ccaae34e81385c8665c2de0e1Daniel Dunbar CPU == "arm966e-s" || CPU == "arm968e-s" || CPU == "arm10e" || 276728a512753d85a6ccaae34e81385c8665c2de0e1Daniel Dunbar CPU == "arm1020e" || CPU == "arm1022e" || CPU == "xscale" || 277728a512753d85a6ccaae34e81385c8665c2de0e1Daniel Dunbar CPU == "iwmmxt") 2781d65e4be6f22f7e4b4974efbaef92fa3454f1ec8Daniel Dunbar return "v5e"; 279728a512753d85a6ccaae34e81385c8665c2de0e1Daniel Dunbar 280728a512753d85a6ccaae34e81385c8665c2de0e1Daniel Dunbar if (CPU == "arm1136j-s" || CPU == "arm1136jf-s" || CPU == "arm1176jz-s" || 281728a512753d85a6ccaae34e81385c8665c2de0e1Daniel Dunbar CPU == "arm1176jzf-s" || CPU == "mpcorenovfp" || CPU == "mpcore") 2821d65e4be6f22f7e4b4974efbaef92fa3454f1ec8Daniel Dunbar return "v6"; 283728a512753d85a6ccaae34e81385c8665c2de0e1Daniel Dunbar 284728a512753d85a6ccaae34e81385c8665c2de0e1Daniel Dunbar if (CPU == "arm1156t2-s" || CPU == "arm1156t2f-s") 2851d65e4be6f22f7e4b4974efbaef92fa3454f1ec8Daniel Dunbar return "v6t2"; 286728a512753d85a6ccaae34e81385c8665c2de0e1Daniel Dunbar 287728a512753d85a6ccaae34e81385c8665c2de0e1Daniel Dunbar if (CPU == "cortex-a8" || CPU == "cortex-a9") 2881d65e4be6f22f7e4b4974efbaef92fa3454f1ec8Daniel Dunbar return "v7"; 289728a512753d85a6ccaae34e81385c8665c2de0e1Daniel Dunbar 2901d65e4be6f22f7e4b4974efbaef92fa3454f1ec8Daniel Dunbar return ""; 291728a512753d85a6ccaae34e81385c8665c2de0e1Daniel Dunbar} 292728a512753d85a6ccaae34e81385c8665c2de0e1Daniel Dunbar 293728a512753d85a6ccaae34e81385c8665c2de0e1Daniel Dunbar/// getLLVMTriple - Get the LLVM triple to use for a particular toolchain, which 294728a512753d85a6ccaae34e81385c8665c2de0e1Daniel Dunbar/// may depend on command line arguments. 295728a512753d85a6ccaae34e81385c8665c2de0e1Daniel Dunbarstatic std::string getLLVMTriple(const ToolChain &TC, const ArgList &Args) { 296728a512753d85a6ccaae34e81385c8665c2de0e1Daniel Dunbar switch (TC.getTriple().getArch()) { 297728a512753d85a6ccaae34e81385c8665c2de0e1Daniel Dunbar default: 298728a512753d85a6ccaae34e81385c8665c2de0e1Daniel Dunbar return TC.getTripleString(); 299728a512753d85a6ccaae34e81385c8665c2de0e1Daniel Dunbar 300728a512753d85a6ccaae34e81385c8665c2de0e1Daniel Dunbar case llvm::Triple::arm: 301728a512753d85a6ccaae34e81385c8665c2de0e1Daniel Dunbar case llvm::Triple::thumb: { 302f4aa4f61de7d364364dc94bbf83ff71448a11327Daniel Dunbar // FIXME: Factor into subclasses. 303728a512753d85a6ccaae34e81385c8665c2de0e1Daniel Dunbar llvm::Triple Triple = TC.getTriple(); 304f4aa4f61de7d364364dc94bbf83ff71448a11327Daniel Dunbar 305f4aa4f61de7d364364dc94bbf83ff71448a11327Daniel Dunbar // Thumb2 is the default for V7 on Darwin. 306f4aa4f61de7d364364dc94bbf83ff71448a11327Daniel Dunbar // 307f4aa4f61de7d364364dc94bbf83ff71448a11327Daniel Dunbar // FIXME: Thumb should just be another -target-feaure, not in the triple. 308f4aa4f61de7d364364dc94bbf83ff71448a11327Daniel Dunbar llvm::StringRef Suffix = getLLVMArchSuffixForARM(getARMTargetCPU(Args)); 309f4aa4f61de7d364364dc94bbf83ff71448a11327Daniel Dunbar bool ThumbDefault = 310f4aa4f61de7d364364dc94bbf83ff71448a11327Daniel Dunbar (Suffix == "v7" && TC.getTriple().getOS() == llvm::Triple::Darwin); 3111d65e4be6f22f7e4b4974efbaef92fa3454f1ec8Daniel Dunbar std::string ArchName = "arm"; 312f4aa4f61de7d364364dc94bbf83ff71448a11327Daniel Dunbar if (Args.hasFlag(options::OPT_mthumb, options::OPT_mno_thumb, ThumbDefault)) 313f4aa4f61de7d364364dc94bbf83ff71448a11327Daniel Dunbar ArchName = "thumb"; 314f4aa4f61de7d364364dc94bbf83ff71448a11327Daniel Dunbar Triple.setArchName(ArchName + Suffix.str()); 315f4aa4f61de7d364364dc94bbf83ff71448a11327Daniel Dunbar 316728a512753d85a6ccaae34e81385c8665c2de0e1Daniel Dunbar return Triple.getTriple(); 317728a512753d85a6ccaae34e81385c8665c2de0e1Daniel Dunbar } 318728a512753d85a6ccaae34e81385c8665c2de0e1Daniel Dunbar } 319728a512753d85a6ccaae34e81385c8665c2de0e1Daniel Dunbar} 320728a512753d85a6ccaae34e81385c8665c2de0e1Daniel Dunbar 3211f95e6567faab67f4363d650f73121359c4bdbabDaniel Dunbar// FIXME: Move to target hook. 3221f95e6567faab67f4363d650f73121359c4bdbabDaniel Dunbarstatic bool isSignedCharDefault(const llvm::Triple &Triple) { 3231f95e6567faab67f4363d650f73121359c4bdbabDaniel Dunbar switch (Triple.getArch()) { 3241f95e6567faab67f4363d650f73121359c4bdbabDaniel Dunbar default: 3251f95e6567faab67f4363d650f73121359c4bdbabDaniel Dunbar return true; 3261f95e6567faab67f4363d650f73121359c4bdbabDaniel Dunbar 3271f95e6567faab67f4363d650f73121359c4bdbabDaniel Dunbar case llvm::Triple::ppc: 3281f95e6567faab67f4363d650f73121359c4bdbabDaniel Dunbar case llvm::Triple::ppc64: 3291f95e6567faab67f4363d650f73121359c4bdbabDaniel Dunbar if (Triple.getOS() == llvm::Triple::Darwin) 3301f95e6567faab67f4363d650f73121359c4bdbabDaniel Dunbar return true; 3311f95e6567faab67f4363d650f73121359c4bdbabDaniel Dunbar return false; 3321f95e6567faab67f4363d650f73121359c4bdbabDaniel Dunbar 3331f95e6567faab67f4363d650f73121359c4bdbabDaniel Dunbar case llvm::Triple::systemz: 3341f95e6567faab67f4363d650f73121359c4bdbabDaniel Dunbar return false; 3351f95e6567faab67f4363d650f73121359c4bdbabDaniel Dunbar } 3361f95e6567faab67f4363d650f73121359c4bdbabDaniel Dunbar} 3371f95e6567faab67f4363d650f73121359c4bdbabDaniel Dunbar 338b163ef7e7a5d904ef0962a7c38c460be083c4d63Daniel Dunbarvoid Clang::AddARMTargetArgs(const ArgList &Args, 339b163ef7e7a5d904ef0962a7c38c460be083c4d63Daniel Dunbar ArgStringList &CmdArgs) const { 340ee788e70fcd0adf76103b17c78ac658d4ea30c9bDaniel Dunbar const Driver &D = getToolChain().getDriver(); 341cbd1933f83e2332b2d7add10459f80cc4e7eb7bfDaniel Dunbar 3422030d8f46b4226fa99e59389e3ca856a79c27e9aDaniel Dunbar // Select the ABI to use. 3432030d8f46b4226fa99e59389e3ca856a79c27e9aDaniel Dunbar // 3442030d8f46b4226fa99e59389e3ca856a79c27e9aDaniel Dunbar // FIXME: Support -meabi. 3452030d8f46b4226fa99e59389e3ca856a79c27e9aDaniel Dunbar const char *ABIName = 0; 3462030d8f46b4226fa99e59389e3ca856a79c27e9aDaniel Dunbar if (Arg *A = Args.getLastArg(options::OPT_mabi_EQ)) { 3472030d8f46b4226fa99e59389e3ca856a79c27e9aDaniel Dunbar ABIName = A->getValue(Args); 3482030d8f46b4226fa99e59389e3ca856a79c27e9aDaniel Dunbar } else { 3492030d8f46b4226fa99e59389e3ca856a79c27e9aDaniel Dunbar // Select the default based on the platform. 3502030d8f46b4226fa99e59389e3ca856a79c27e9aDaniel Dunbar switch (getToolChain().getTriple().getOS()) { 3512030d8f46b4226fa99e59389e3ca856a79c27e9aDaniel Dunbar // FIXME: Is this right for non-Darwin and non-Linux? 3522030d8f46b4226fa99e59389e3ca856a79c27e9aDaniel Dunbar default: 3532030d8f46b4226fa99e59389e3ca856a79c27e9aDaniel Dunbar ABIName = "aapcs"; 3542030d8f46b4226fa99e59389e3ca856a79c27e9aDaniel Dunbar break; 3552030d8f46b4226fa99e59389e3ca856a79c27e9aDaniel Dunbar 3562030d8f46b4226fa99e59389e3ca856a79c27e9aDaniel Dunbar case llvm::Triple::Darwin: 3572030d8f46b4226fa99e59389e3ca856a79c27e9aDaniel Dunbar ABIName = "apcs-gnu"; 3582030d8f46b4226fa99e59389e3ca856a79c27e9aDaniel Dunbar break; 3592030d8f46b4226fa99e59389e3ca856a79c27e9aDaniel Dunbar 3602030d8f46b4226fa99e59389e3ca856a79c27e9aDaniel Dunbar case llvm::Triple::Linux: 3612030d8f46b4226fa99e59389e3ca856a79c27e9aDaniel Dunbar ABIName = "aapcs-linux"; 3622030d8f46b4226fa99e59389e3ca856a79c27e9aDaniel Dunbar break; 3632030d8f46b4226fa99e59389e3ca856a79c27e9aDaniel Dunbar } 3642030d8f46b4226fa99e59389e3ca856a79c27e9aDaniel Dunbar } 3652030d8f46b4226fa99e59389e3ca856a79c27e9aDaniel Dunbar CmdArgs.push_back("-target-abi"); 3662030d8f46b4226fa99e59389e3ca856a79c27e9aDaniel Dunbar CmdArgs.push_back(ABIName); 3672030d8f46b4226fa99e59389e3ca856a79c27e9aDaniel Dunbar 368b163ef7e7a5d904ef0962a7c38c460be083c4d63Daniel Dunbar // Set the CPU based on -march= and -mcpu=. 36938b48afd338d494099697d2611e1f45e558e469eDaniel Dunbar CmdArgs.push_back("-target-cpu"); 370a31100e62f83933432df9092a04e48f9e5561a14Daniel Dunbar CmdArgs.push_back(getARMTargetCPU(Args)); 371b163ef7e7a5d904ef0962a7c38c460be083c4d63Daniel Dunbar 372cbd1933f83e2332b2d7add10459f80cc4e7eb7bfDaniel Dunbar // Select the float ABI as determined by -msoft-float, -mhard-float, and 373cbd1933f83e2332b2d7add10459f80cc4e7eb7bfDaniel Dunbar // -mfloat-abi=. 374cbd1933f83e2332b2d7add10459f80cc4e7eb7bfDaniel Dunbar llvm::StringRef FloatABI; 375cbd1933f83e2332b2d7add10459f80cc4e7eb7bfDaniel Dunbar if (Arg *A = Args.getLastArg(options::OPT_msoft_float, 376cbd1933f83e2332b2d7add10459f80cc4e7eb7bfDaniel Dunbar options::OPT_mhard_float, 377cbd1933f83e2332b2d7add10459f80cc4e7eb7bfDaniel Dunbar options::OPT_mfloat_abi_EQ)) { 378cbd1933f83e2332b2d7add10459f80cc4e7eb7bfDaniel Dunbar if (A->getOption().matches(options::OPT_msoft_float)) 379cbd1933f83e2332b2d7add10459f80cc4e7eb7bfDaniel Dunbar FloatABI = "soft"; 380cbd1933f83e2332b2d7add10459f80cc4e7eb7bfDaniel Dunbar else if (A->getOption().matches(options::OPT_mhard_float)) 381cbd1933f83e2332b2d7add10459f80cc4e7eb7bfDaniel Dunbar FloatABI = "hard"; 382cbd1933f83e2332b2d7add10459f80cc4e7eb7bfDaniel Dunbar else { 383cbd1933f83e2332b2d7add10459f80cc4e7eb7bfDaniel Dunbar FloatABI = A->getValue(Args); 384cbd1933f83e2332b2d7add10459f80cc4e7eb7bfDaniel Dunbar if (FloatABI != "soft" && FloatABI != "softfp" && FloatABI != "hard") { 385cbd1933f83e2332b2d7add10459f80cc4e7eb7bfDaniel Dunbar D.Diag(clang::diag::err_drv_invalid_mfloat_abi) 386cbd1933f83e2332b2d7add10459f80cc4e7eb7bfDaniel Dunbar << A->getAsString(Args); 387cbd1933f83e2332b2d7add10459f80cc4e7eb7bfDaniel Dunbar FloatABI = "soft"; 388cbd1933f83e2332b2d7add10459f80cc4e7eb7bfDaniel Dunbar } 389cbd1933f83e2332b2d7add10459f80cc4e7eb7bfDaniel Dunbar } 390cbd1933f83e2332b2d7add10459f80cc4e7eb7bfDaniel Dunbar } 391cbd1933f83e2332b2d7add10459f80cc4e7eb7bfDaniel Dunbar 392cbd1933f83e2332b2d7add10459f80cc4e7eb7bfDaniel Dunbar // If unspecified, choose the default based on the platform. 393cbd1933f83e2332b2d7add10459f80cc4e7eb7bfDaniel Dunbar if (FloatABI.empty()) { 394cbd1933f83e2332b2d7add10459f80cc4e7eb7bfDaniel Dunbar // FIXME: This is wrong for non-Darwin, we don't have a mechanism yet for 395cbd1933f83e2332b2d7add10459f80cc4e7eb7bfDaniel Dunbar // distinguishing things like linux-eabi vs linux-elf. 396cbd1933f83e2332b2d7add10459f80cc4e7eb7bfDaniel Dunbar switch (getToolChain().getTriple().getOS()) { 397cbd1933f83e2332b2d7add10459f80cc4e7eb7bfDaniel Dunbar case llvm::Triple::Darwin: { 398cbd1933f83e2332b2d7add10459f80cc4e7eb7bfDaniel Dunbar // Darwin defaults to "softfp" for v6 and v7. 399cbd1933f83e2332b2d7add10459f80cc4e7eb7bfDaniel Dunbar // 400cbd1933f83e2332b2d7add10459f80cc4e7eb7bfDaniel Dunbar // FIXME: Factor out an ARM class so we can cache the arch somewhere. 401cbd1933f83e2332b2d7add10459f80cc4e7eb7bfDaniel Dunbar llvm::StringRef ArchName = getLLVMArchSuffixForARM(getARMTargetCPU(Args)); 402cbd1933f83e2332b2d7add10459f80cc4e7eb7bfDaniel Dunbar if (ArchName.startswith("v6") || ArchName.startswith("v7")) 403cbd1933f83e2332b2d7add10459f80cc4e7eb7bfDaniel Dunbar FloatABI = "softfp"; 404cbd1933f83e2332b2d7add10459f80cc4e7eb7bfDaniel Dunbar else 405cbd1933f83e2332b2d7add10459f80cc4e7eb7bfDaniel Dunbar FloatABI = "soft"; 406cbd1933f83e2332b2d7add10459f80cc4e7eb7bfDaniel Dunbar break; 407cbd1933f83e2332b2d7add10459f80cc4e7eb7bfDaniel Dunbar } 408cbd1933f83e2332b2d7add10459f80cc4e7eb7bfDaniel Dunbar 409cbd1933f83e2332b2d7add10459f80cc4e7eb7bfDaniel Dunbar default: 410cbd1933f83e2332b2d7add10459f80cc4e7eb7bfDaniel Dunbar // Assume "soft", but warn the user we are guessing. 411cbd1933f83e2332b2d7add10459f80cc4e7eb7bfDaniel Dunbar FloatABI = "soft"; 412cbd1933f83e2332b2d7add10459f80cc4e7eb7bfDaniel Dunbar D.Diag(clang::diag::warn_drv_assuming_mfloat_abi_is) << "soft"; 413cbd1933f83e2332b2d7add10459f80cc4e7eb7bfDaniel Dunbar break; 414cbd1933f83e2332b2d7add10459f80cc4e7eb7bfDaniel Dunbar } 415cbd1933f83e2332b2d7add10459f80cc4e7eb7bfDaniel Dunbar } 416cbd1933f83e2332b2d7add10459f80cc4e7eb7bfDaniel Dunbar 417cbd1933f83e2332b2d7add10459f80cc4e7eb7bfDaniel Dunbar if (FloatABI == "soft") { 418cbd1933f83e2332b2d7add10459f80cc4e7eb7bfDaniel Dunbar // Floating point operations and argument passing are soft. 419cbd1933f83e2332b2d7add10459f80cc4e7eb7bfDaniel Dunbar // 420cbd1933f83e2332b2d7add10459f80cc4e7eb7bfDaniel Dunbar // FIXME: This changes CPP defines, we need -target-soft-float. 4213b315264d1a6fa303e20fe0caec306ccafc090deDaniel Dunbar CmdArgs.push_back("-msoft-float"); 42287667aafe68c366be57f5afb60428237593da0edDaniel Dunbar CmdArgs.push_back("-mfloat-abi"); 42387667aafe68c366be57f5afb60428237593da0edDaniel Dunbar CmdArgs.push_back("soft"); 424cbd1933f83e2332b2d7add10459f80cc4e7eb7bfDaniel Dunbar } else if (FloatABI == "softfp") { 425cbd1933f83e2332b2d7add10459f80cc4e7eb7bfDaniel Dunbar // Floating point operations are hard, but argument passing is soft. 42687667aafe68c366be57f5afb60428237593da0edDaniel Dunbar CmdArgs.push_back("-mfloat-abi"); 42787667aafe68c366be57f5afb60428237593da0edDaniel Dunbar CmdArgs.push_back("soft"); 428cbd1933f83e2332b2d7add10459f80cc4e7eb7bfDaniel Dunbar } else { 429cbd1933f83e2332b2d7add10459f80cc4e7eb7bfDaniel Dunbar // Floating point operations and argument passing are hard. 430cbd1933f83e2332b2d7add10459f80cc4e7eb7bfDaniel Dunbar assert(FloatABI == "hard" && "Invalid float abi!"); 43187667aafe68c366be57f5afb60428237593da0edDaniel Dunbar CmdArgs.push_back("-mfloat-abi"); 43287667aafe68c366be57f5afb60428237593da0edDaniel Dunbar CmdArgs.push_back("hard"); 433cbd1933f83e2332b2d7add10459f80cc4e7eb7bfDaniel Dunbar } 43497f52ac45369f6925b548404e61d511034c874ecDaniel Dunbar 43597f52ac45369f6925b548404e61d511034c874ecDaniel Dunbar // Set appropriate target features for floating point mode. 43697f52ac45369f6925b548404e61d511034c874ecDaniel Dunbar // 43797f52ac45369f6925b548404e61d511034c874ecDaniel Dunbar // FIXME: Note, this is a hack, the LLVM backend doesn't actually use these 43897f52ac45369f6925b548404e61d511034c874ecDaniel Dunbar // yet (it uses the -mfloat-abi and -msoft-float options above), and it is 43997f52ac45369f6925b548404e61d511034c874ecDaniel Dunbar // stripped out by the ARM target. 44097f52ac45369f6925b548404e61d511034c874ecDaniel Dunbar 44197f52ac45369f6925b548404e61d511034c874ecDaniel Dunbar // Use software floating point operations? 44297f52ac45369f6925b548404e61d511034c874ecDaniel Dunbar if (FloatABI == "soft") { 44397f52ac45369f6925b548404e61d511034c874ecDaniel Dunbar CmdArgs.push_back("-target-feature"); 44497f52ac45369f6925b548404e61d511034c874ecDaniel Dunbar CmdArgs.push_back("+soft-float"); 44597f52ac45369f6925b548404e61d511034c874ecDaniel Dunbar } 44697f52ac45369f6925b548404e61d511034c874ecDaniel Dunbar 44797f52ac45369f6925b548404e61d511034c874ecDaniel Dunbar // Use software floating point argument passing? 44897f52ac45369f6925b548404e61d511034c874ecDaniel Dunbar if (FloatABI != "hard") { 44997f52ac45369f6925b548404e61d511034c874ecDaniel Dunbar CmdArgs.push_back("-target-feature"); 45097f52ac45369f6925b548404e61d511034c874ecDaniel Dunbar CmdArgs.push_back("+soft-float-abi"); 45197f52ac45369f6925b548404e61d511034c874ecDaniel Dunbar } 452a91320b8af7143f7af4c0665ffa62a3b244c0bd9Daniel Dunbar 453a91320b8af7143f7af4c0665ffa62a3b244c0bd9Daniel Dunbar // Honor -mfpu=. 454a91320b8af7143f7af4c0665ffa62a3b244c0bd9Daniel Dunbar // 455a91320b8af7143f7af4c0665ffa62a3b244c0bd9Daniel Dunbar // FIXME: Centralize feature selection, defaulting shouldn't be also in the 456a91320b8af7143f7af4c0665ffa62a3b244c0bd9Daniel Dunbar // frontend target. 457a91320b8af7143f7af4c0665ffa62a3b244c0bd9Daniel Dunbar if (const Arg *A = Args.getLastArg(options::OPT_mfpu_EQ)) { 458a91320b8af7143f7af4c0665ffa62a3b244c0bd9Daniel Dunbar llvm::StringRef FPU = A->getValue(Args); 459a91320b8af7143f7af4c0665ffa62a3b244c0bd9Daniel Dunbar 460a91320b8af7143f7af4c0665ffa62a3b244c0bd9Daniel Dunbar // Set the target features based on the FPU. 461a91320b8af7143f7af4c0665ffa62a3b244c0bd9Daniel Dunbar if (FPU == "fpa" || FPU == "fpe2" || FPU == "fpe3" || FPU == "maverick") { 462a91320b8af7143f7af4c0665ffa62a3b244c0bd9Daniel Dunbar // Disable any default FPU support. 463a91320b8af7143f7af4c0665ffa62a3b244c0bd9Daniel Dunbar CmdArgs.push_back("-target-feature"); 464a91320b8af7143f7af4c0665ffa62a3b244c0bd9Daniel Dunbar CmdArgs.push_back("-vfp2"); 465a91320b8af7143f7af4c0665ffa62a3b244c0bd9Daniel Dunbar CmdArgs.push_back("-target-feature"); 466a91320b8af7143f7af4c0665ffa62a3b244c0bd9Daniel Dunbar CmdArgs.push_back("-vfp3"); 467a91320b8af7143f7af4c0665ffa62a3b244c0bd9Daniel Dunbar CmdArgs.push_back("-target-feature"); 468a91320b8af7143f7af4c0665ffa62a3b244c0bd9Daniel Dunbar CmdArgs.push_back("-neon"); 469a91320b8af7143f7af4c0665ffa62a3b244c0bd9Daniel Dunbar } else if (FPU == "vfp") { 470a91320b8af7143f7af4c0665ffa62a3b244c0bd9Daniel Dunbar CmdArgs.push_back("-target-feature"); 471a91320b8af7143f7af4c0665ffa62a3b244c0bd9Daniel Dunbar CmdArgs.push_back("+vfp2"); 472a91320b8af7143f7af4c0665ffa62a3b244c0bd9Daniel Dunbar } else if (FPU == "vfp3") { 473a91320b8af7143f7af4c0665ffa62a3b244c0bd9Daniel Dunbar CmdArgs.push_back("-target-feature"); 474a91320b8af7143f7af4c0665ffa62a3b244c0bd9Daniel Dunbar CmdArgs.push_back("+vfp3"); 475a91320b8af7143f7af4c0665ffa62a3b244c0bd9Daniel Dunbar } else if (FPU == "neon") { 476a91320b8af7143f7af4c0665ffa62a3b244c0bd9Daniel Dunbar CmdArgs.push_back("-target-feature"); 477a91320b8af7143f7af4c0665ffa62a3b244c0bd9Daniel Dunbar CmdArgs.push_back("+neon"); 478a91320b8af7143f7af4c0665ffa62a3b244c0bd9Daniel Dunbar } else 479a91320b8af7143f7af4c0665ffa62a3b244c0bd9Daniel Dunbar D.Diag(clang::diag::err_drv_clang_unsupported) << A->getAsString(Args); 480a91320b8af7143f7af4c0665ffa62a3b244c0bd9Daniel Dunbar } 481b163ef7e7a5d904ef0962a7c38c460be083c4d63Daniel Dunbar} 482b163ef7e7a5d904ef0962a7c38c460be083c4d63Daniel Dunbar 4836acda16e9c194dcbd0dea64341e182bdb65d0f41Daniel Dunbarvoid Clang::AddX86TargetArgs(const ArgList &Args, 4846acda16e9c194dcbd0dea64341e182bdb65d0f41Daniel Dunbar ArgStringList &CmdArgs) const { 485e6ad3f9fceef0ecc422ff26754ea069a5fd18c69Daniel Dunbar if (!Args.hasFlag(options::OPT_mred_zone, 486e6ad3f9fceef0ecc422ff26754ea069a5fd18c69Daniel Dunbar options::OPT_mno_red_zone, 487e6ad3f9fceef0ecc422ff26754ea069a5fd18c69Daniel Dunbar true) || 488e6ad3f9fceef0ecc422ff26754ea069a5fd18c69Daniel Dunbar Args.hasArg(options::OPT_mkernel) || 489e6ad3f9fceef0ecc422ff26754ea069a5fd18c69Daniel Dunbar Args.hasArg(options::OPT_fapple_kext)) 49066861e09d590994a8b941eaa328e4d8f33adec9eDaniel Dunbar CmdArgs.push_back("-disable-red-zone"); 491e6ad3f9fceef0ecc422ff26754ea069a5fd18c69Daniel Dunbar 492e6ad3f9fceef0ecc422ff26754ea069a5fd18c69Daniel Dunbar if (Args.hasFlag(options::OPT_msoft_float, 493e6ad3f9fceef0ecc422ff26754ea069a5fd18c69Daniel Dunbar options::OPT_mno_soft_float, 494e6ad3f9fceef0ecc422ff26754ea069a5fd18c69Daniel Dunbar false)) 49566861e09d590994a8b941eaa328e4d8f33adec9eDaniel Dunbar CmdArgs.push_back("-no-implicit-float"); 496e6ad3f9fceef0ecc422ff26754ea069a5fd18c69Daniel Dunbar 497f86feddbd5b13d2c144132e35d608fa630784dbbDaniel Dunbar const char *CPUName = 0; 4986acda16e9c194dcbd0dea64341e182bdb65d0f41Daniel Dunbar if (const Arg *A = Args.getLastArg(options::OPT_march_EQ)) { 499f86feddbd5b13d2c144132e35d608fa630784dbbDaniel Dunbar if (llvm::StringRef(A->getValue(Args)) == "native") { 500f86feddbd5b13d2c144132e35d608fa630784dbbDaniel Dunbar // FIXME: Reject attempts to use -march=native unless the target matches 501f86feddbd5b13d2c144132e35d608fa630784dbbDaniel Dunbar // the host. 502f86feddbd5b13d2c144132e35d608fa630784dbbDaniel Dunbar // 503f86feddbd5b13d2c144132e35d608fa630784dbbDaniel Dunbar // FIXME: We should also incorporate the detected target features for use 504f86feddbd5b13d2c144132e35d608fa630784dbbDaniel Dunbar // with -native. 505f86feddbd5b13d2c144132e35d608fa630784dbbDaniel Dunbar std::string CPU = llvm::sys::getHostCPUName(); 506f86feddbd5b13d2c144132e35d608fa630784dbbDaniel Dunbar if (!CPU.empty()) 507f86feddbd5b13d2c144132e35d608fa630784dbbDaniel Dunbar CPUName = Args.MakeArgString(CPU); 508f86feddbd5b13d2c144132e35d608fa630784dbbDaniel Dunbar } else 509f86feddbd5b13d2c144132e35d608fa630784dbbDaniel Dunbar CPUName = A->getValue(Args); 510f86feddbd5b13d2c144132e35d608fa630784dbbDaniel Dunbar } 5116acda16e9c194dcbd0dea64341e182bdb65d0f41Daniel Dunbar 512f86feddbd5b13d2c144132e35d608fa630784dbbDaniel Dunbar // Select the default CPU if none was given (or detection failed). 513f86feddbd5b13d2c144132e35d608fa630784dbbDaniel Dunbar if (!CPUName) { 5146acda16e9c194dcbd0dea64341e182bdb65d0f41Daniel Dunbar // FIXME: Need target hooks. 515f22d1fd96d6056a2f271b0f7353b31f47547127bBenjamin Kramer if (getToolChain().getOS().startswith("darwin")) { 5166acda16e9c194dcbd0dea64341e182bdb65d0f41Daniel Dunbar if (getToolChain().getArchName() == "x86_64") 517f86feddbd5b13d2c144132e35d608fa630784dbbDaniel Dunbar CPUName = "core2"; 5186acda16e9c194dcbd0dea64341e182bdb65d0f41Daniel Dunbar else if (getToolChain().getArchName() == "i386") 519f86feddbd5b13d2c144132e35d608fa630784dbbDaniel Dunbar CPUName = "yonah"; 5206acda16e9c194dcbd0dea64341e182bdb65d0f41Daniel Dunbar } else { 5216acda16e9c194dcbd0dea64341e182bdb65d0f41Daniel Dunbar if (getToolChain().getArchName() == "x86_64") 522f86feddbd5b13d2c144132e35d608fa630784dbbDaniel Dunbar CPUName = "x86-64"; 5236acda16e9c194dcbd0dea64341e182bdb65d0f41Daniel Dunbar else if (getToolChain().getArchName() == "i386") 524f86feddbd5b13d2c144132e35d608fa630784dbbDaniel Dunbar CPUName = "pentium4"; 5256acda16e9c194dcbd0dea64341e182bdb65d0f41Daniel Dunbar } 5266acda16e9c194dcbd0dea64341e182bdb65d0f41Daniel Dunbar } 5276acda16e9c194dcbd0dea64341e182bdb65d0f41Daniel Dunbar 528f86feddbd5b13d2c144132e35d608fa630784dbbDaniel Dunbar if (CPUName) { 52938b48afd338d494099697d2611e1f45e558e469eDaniel Dunbar CmdArgs.push_back("-target-cpu"); 530f86feddbd5b13d2c144132e35d608fa630784dbbDaniel Dunbar CmdArgs.push_back(CPUName); 531f86feddbd5b13d2c144132e35d608fa630784dbbDaniel Dunbar } 532f86feddbd5b13d2c144132e35d608fa630784dbbDaniel Dunbar 533cdd9686b890ebdc10039ae256ef4c9dfb5ebacb7Daniel Dunbar for (arg_iterator it = Args.filtered_begin(options::OPT_m_x86_Features_Group), 534cdd9686b890ebdc10039ae256ef4c9dfb5ebacb7Daniel Dunbar ie = Args.filtered_end(); it != ie; ++it) { 535cdd9686b890ebdc10039ae256ef4c9dfb5ebacb7Daniel Dunbar llvm::StringRef Name = it->getOption().getName(); 536cdd9686b890ebdc10039ae256ef4c9dfb5ebacb7Daniel Dunbar it->claim(); 5376acda16e9c194dcbd0dea64341e182bdb65d0f41Daniel Dunbar 538cdd9686b890ebdc10039ae256ef4c9dfb5ebacb7Daniel Dunbar // Skip over "-m". 539cdd9686b890ebdc10039ae256ef4c9dfb5ebacb7Daniel Dunbar assert(Name.startswith("-m") && "Invalid feature name."); 540cdd9686b890ebdc10039ae256ef4c9dfb5ebacb7Daniel Dunbar Name = Name.substr(2); 5416acda16e9c194dcbd0dea64341e182bdb65d0f41Daniel Dunbar 542cdd9686b890ebdc10039ae256ef4c9dfb5ebacb7Daniel Dunbar bool IsNegative = Name.startswith("no-"); 543cdd9686b890ebdc10039ae256ef4c9dfb5ebacb7Daniel Dunbar if (IsNegative) 544cdd9686b890ebdc10039ae256ef4c9dfb5ebacb7Daniel Dunbar Name = Name.substr(3); 5456acda16e9c194dcbd0dea64341e182bdb65d0f41Daniel Dunbar 546cdd9686b890ebdc10039ae256ef4c9dfb5ebacb7Daniel Dunbar CmdArgs.push_back("-target-feature"); 547cdd9686b890ebdc10039ae256ef4c9dfb5ebacb7Daniel Dunbar CmdArgs.push_back(Args.MakeArgString((IsNegative ? "-" : "+") + Name)); 5486acda16e9c194dcbd0dea64341e182bdb65d0f41Daniel Dunbar } 5496acda16e9c194dcbd0dea64341e182bdb65d0f41Daniel Dunbar} 5506acda16e9c194dcbd0dea64341e182bdb65d0f41Daniel Dunbar 55185caf03ee49c4de87ee9624a9b725ef5d20ee624Fariborz Jahanianstatic bool needsExceptions(const ArgList &Args, types::ID InputType, 55285caf03ee49c4de87ee9624a9b725ef5d20ee624Fariborz Jahanian const llvm::Triple &Triple) { 553f759df06d997050559fd925758bcd2cdef24db05Rafael Espindola if (Arg *A = Args.getLastArg(options::OPT_fexceptions, 554f759df06d997050559fd925758bcd2cdef24db05Rafael Espindola options::OPT_fno_exceptions)) { 555f759df06d997050559fd925758bcd2cdef24db05Rafael Espindola if (A->getOption().matches(options::OPT_fexceptions)) 556f759df06d997050559fd925758bcd2cdef24db05Rafael Espindola return true; 557f759df06d997050559fd925758bcd2cdef24db05Rafael Espindola else 558f759df06d997050559fd925758bcd2cdef24db05Rafael Espindola return false; 559f759df06d997050559fd925758bcd2cdef24db05Rafael Espindola } 560f759df06d997050559fd925758bcd2cdef24db05Rafael Espindola switch (InputType) { 561f759df06d997050559fd925758bcd2cdef24db05Rafael Espindola case types::TY_CXX: case types::TY_CXXHeader: 562f759df06d997050559fd925758bcd2cdef24db05Rafael Espindola case types::TY_PP_CXX: case types::TY_PP_CXXHeader: 563f759df06d997050559fd925758bcd2cdef24db05Rafael Espindola case types::TY_ObjCXX: case types::TY_ObjCXXHeader: 564f759df06d997050559fd925758bcd2cdef24db05Rafael Espindola case types::TY_PP_ObjCXX: case types::TY_PP_ObjCXXHeader: 565f759df06d997050559fd925758bcd2cdef24db05Rafael Espindola return true; 56685caf03ee49c4de87ee9624a9b725ef5d20ee624Fariborz Jahanian 567f759df06d997050559fd925758bcd2cdef24db05Rafael Espindola case types::TY_ObjC: case types::TY_ObjCHeader: 568f759df06d997050559fd925758bcd2cdef24db05Rafael Espindola case types::TY_PP_ObjC: case types::TY_PP_ObjCHeader: 569f759df06d997050559fd925758bcd2cdef24db05Rafael Espindola if (Args.hasArg(options::OPT_fobjc_nonfragile_abi)) 570f759df06d997050559fd925758bcd2cdef24db05Rafael Espindola return true; 57185caf03ee49c4de87ee9624a9b725ef5d20ee624Fariborz Jahanian if (Triple.getOS() != llvm::Triple::Darwin) 572f759df06d997050559fd925758bcd2cdef24db05Rafael Espindola return false; 57385caf03ee49c4de87ee9624a9b725ef5d20ee624Fariborz Jahanian return (Triple.getDarwinMajorNumber() >= 9 && 57485caf03ee49c4de87ee9624a9b725ef5d20ee624Fariborz Jahanian Triple.getArch() == llvm::Triple::x86_64); 57585caf03ee49c4de87ee9624a9b725ef5d20ee624Fariborz Jahanian 576f759df06d997050559fd925758bcd2cdef24db05Rafael Espindola default: 577f759df06d997050559fd925758bcd2cdef24db05Rafael Espindola return false; 578f759df06d997050559fd925758bcd2cdef24db05Rafael Espindola } 579f759df06d997050559fd925758bcd2cdef24db05Rafael Espindola} 580f759df06d997050559fd925758bcd2cdef24db05Rafael Espindola 581dd4fe00f03d8749b283948ea86aa1e4a53ed21abDaniel Dunbar/// getEffectiveClangTriple - Get the "effective" target triple, which is the 582dd4fe00f03d8749b283948ea86aa1e4a53ed21abDaniel Dunbar/// triple for the target but with the OS version potentially modified for 583dd4fe00f03d8749b283948ea86aa1e4a53ed21abDaniel Dunbar/// Darwin's -mmacosx-version-min. 584dd4fe00f03d8749b283948ea86aa1e4a53ed21abDaniel Dunbarstatic std::string getEffectiveClangTriple(const Driver &D, 585dd4fe00f03d8749b283948ea86aa1e4a53ed21abDaniel Dunbar const ToolChain &TC, 586dd4fe00f03d8749b283948ea86aa1e4a53ed21abDaniel Dunbar const ArgList &Args) { 587dd4fe00f03d8749b283948ea86aa1e4a53ed21abDaniel Dunbar llvm::Triple Triple(getLLVMTriple(TC, Args)); 588dd4fe00f03d8749b283948ea86aa1e4a53ed21abDaniel Dunbar 589408fceda7a518ac25975fb6299c856bfaa753939Daniel Dunbar // Handle -mmacosx-version-min and -miphoneos-version-min. 590dd4fe00f03d8749b283948ea86aa1e4a53ed21abDaniel Dunbar if (Triple.getOS() != llvm::Triple::Darwin) { 591dd4fe00f03d8749b283948ea86aa1e4a53ed21abDaniel Dunbar // Diagnose use of -mmacosx-version-min and -miphoneos-version-min on 592dd4fe00f03d8749b283948ea86aa1e4a53ed21abDaniel Dunbar // non-Darwin. 593408fceda7a518ac25975fb6299c856bfaa753939Daniel Dunbar if (Arg *A = Args.getLastArg(options::OPT_mmacosx_version_min_EQ, 594408fceda7a518ac25975fb6299c856bfaa753939Daniel Dunbar options::OPT_miphoneos_version_min_EQ)) 595408fceda7a518ac25975fb6299c856bfaa753939Daniel Dunbar D.Diag(clang::diag::err_drv_clang_unsupported) << A->getAsString(Args); 59621ae3196c9677a79523d294f9a62a4788ba40694Daniel Dunbar } else { 597408fceda7a518ac25975fb6299c856bfaa753939Daniel Dunbar const toolchains::Darwin &DarwinTC( 598408fceda7a518ac25975fb6299c856bfaa753939Daniel Dunbar reinterpret_cast<const toolchains::Darwin&>(TC)); 599408fceda7a518ac25975fb6299c856bfaa753939Daniel Dunbar unsigned Version[3]; 600408fceda7a518ac25975fb6299c856bfaa753939Daniel Dunbar DarwinTC.getTargetVersion(Version); 60121ae3196c9677a79523d294f9a62a4788ba40694Daniel Dunbar 60221ae3196c9677a79523d294f9a62a4788ba40694Daniel Dunbar // Mangle the target version into the OS triple component. For historical 60321ae3196c9677a79523d294f9a62a4788ba40694Daniel Dunbar // reasons that make little sense, the version passed here is the "darwin" 60421ae3196c9677a79523d294f9a62a4788ba40694Daniel Dunbar // version, which drops the 10 and offsets by 4. See inverse code when 60521ae3196c9677a79523d294f9a62a4788ba40694Daniel Dunbar // setting the OS version preprocessor define. 606408fceda7a518ac25975fb6299c856bfaa753939Daniel Dunbar if (!DarwinTC.isTargetIPhoneOS()) { 607408fceda7a518ac25975fb6299c856bfaa753939Daniel Dunbar Version[0] = Version[1] + 4; 608408fceda7a518ac25975fb6299c856bfaa753939Daniel Dunbar Version[1] = Version[2]; 609408fceda7a518ac25975fb6299c856bfaa753939Daniel Dunbar Version[2] = 0; 610408fceda7a518ac25975fb6299c856bfaa753939Daniel Dunbar } else { 611408fceda7a518ac25975fb6299c856bfaa753939Daniel Dunbar // Use the environment to communicate that we are targetting iPhoneOS. 612408fceda7a518ac25975fb6299c856bfaa753939Daniel Dunbar Triple.setEnvironmentName("iphoneos"); 61321ae3196c9677a79523d294f9a62a4788ba40694Daniel Dunbar } 614dd4fe00f03d8749b283948ea86aa1e4a53ed21abDaniel Dunbar 615dd4fe00f03d8749b283948ea86aa1e4a53ed21abDaniel Dunbar llvm::SmallString<16> Str; 616408fceda7a518ac25975fb6299c856bfaa753939Daniel Dunbar llvm::raw_svector_ostream(Str) << "darwin" << Version[0] 617408fceda7a518ac25975fb6299c856bfaa753939Daniel Dunbar << "." << Version[1] << "." << Version[2]; 618dd4fe00f03d8749b283948ea86aa1e4a53ed21abDaniel Dunbar Triple.setOSName(Str.str()); 619dd4fe00f03d8749b283948ea86aa1e4a53ed21abDaniel Dunbar } 620dd4fe00f03d8749b283948ea86aa1e4a53ed21abDaniel Dunbar 621dd4fe00f03d8749b283948ea86aa1e4a53ed21abDaniel Dunbar return Triple.getTriple(); 622dd4fe00f03d8749b283948ea86aa1e4a53ed21abDaniel Dunbar} 623dd4fe00f03d8749b283948ea86aa1e4a53ed21abDaniel Dunbar 62447ac7d27c44bd64a7d0fc03d4babc196cf2b8230Daniel Dunbarvoid Clang::ConstructJob(Compilation &C, const JobAction &JA, 625871adcf4e41285e3f4c3b62eaa1b2e05b60b92daDaniel Dunbar Job &Dest, 626871adcf4e41285e3f4c3b62eaa1b2e05b60b92daDaniel Dunbar const InputInfo &Output, 62762cf601812e03dd9bc5df42b8ef06a0cdedc38bfDaniel Dunbar const InputInfoList &Inputs, 6281d46033f760ba5fd266ce59fe391fac473f04f52Daniel Dunbar const ArgList &Args, 62947ac7d27c44bd64a7d0fc03d4babc196cf2b8230Daniel Dunbar const char *LinkingOutput) const { 630ee788e70fcd0adf76103b17c78ac658d4ea30c9bDaniel Dunbar const Driver &D = getToolChain().getDriver(); 631b488c1dac8e53206f07103d794a62a3f5012c0f4Daniel Dunbar ArgStringList CmdArgs; 632b488c1dac8e53206f07103d794a62a3f5012c0f4Daniel Dunbar 633077ba6a3ac3628afb0d3c460e81ce013bccbdbedDaniel Dunbar assert(Inputs.size() == 1 && "Unable to handle multiple inputs."); 634077ba6a3ac3628afb0d3c460e81ce013bccbdbedDaniel Dunbar 6358ff5b28d6efcffe2251e77634c7edf83a4763344Daniel Dunbar // Invoke ourselves in -cc1 mode. 6368ff5b28d6efcffe2251e77634c7edf83a4763344Daniel Dunbar // 6378ff5b28d6efcffe2251e77634c7edf83a4763344Daniel Dunbar // FIXME: Implement custom jobs for internal actions. 6388ff5b28d6efcffe2251e77634c7edf83a4763344Daniel Dunbar CmdArgs.push_back("-cc1"); 6398ff5b28d6efcffe2251e77634c7edf83a4763344Daniel Dunbar 640dd4fe00f03d8749b283948ea86aa1e4a53ed21abDaniel Dunbar // Add the "effective" target triple. 641af07f936b698575f2c91f1c1134c116f1ef0deddDaniel Dunbar CmdArgs.push_back("-triple"); 642dd4fe00f03d8749b283948ea86aa1e4a53ed21abDaniel Dunbar std::string TripleStr = getEffectiveClangTriple(D, getToolChain(), Args); 643dd4fe00f03d8749b283948ea86aa1e4a53ed21abDaniel Dunbar CmdArgs.push_back(Args.MakeArgString(TripleStr)); 644728a512753d85a6ccaae34e81385c8665c2de0e1Daniel Dunbar 645dd4fe00f03d8749b283948ea86aa1e4a53ed21abDaniel Dunbar // Select the appropriate action. 6461d46033f760ba5fd266ce59fe391fac473f04f52Daniel Dunbar if (isa<AnalyzeJobAction>(JA)) { 6471d46033f760ba5fd266ce59fe391fac473f04f52Daniel Dunbar assert(JA.getType() == types::TY_Plist && "Invalid output type."); 6481d46033f760ba5fd266ce59fe391fac473f04f52Daniel Dunbar CmdArgs.push_back("-analyze"); 6491d46033f760ba5fd266ce59fe391fac473f04f52Daniel Dunbar } else if (isa<PreprocessJobAction>(JA)) { 650cd8e4c44dd068956e9181381be3ee2d49a0fac52Daniel Dunbar if (Output.getType() == types::TY_Dependencies) 651cd8e4c44dd068956e9181381be3ee2d49a0fac52Daniel Dunbar CmdArgs.push_back("-Eonly"); 652cd8e4c44dd068956e9181381be3ee2d49a0fac52Daniel Dunbar else 653cd8e4c44dd068956e9181381be3ee2d49a0fac52Daniel Dunbar CmdArgs.push_back("-E"); 6548767cbc475ed96397b6f08617814eeb9cab121bdDaniel Dunbar } else if (isa<AssembleJobAction>(JA)) { 6558767cbc475ed96397b6f08617814eeb9cab121bdDaniel Dunbar CmdArgs.push_back("-emit-obj"); 6561d46033f760ba5fd266ce59fe391fac473f04f52Daniel Dunbar } else if (isa<PrecompileJobAction>(JA)) { 6570ebd9321ba380471010341f24c874f46f56e7581Daniel Dunbar // Use PCH if the user requested it, except for C++ (for now). 6580ebd9321ba380471010341f24c874f46f56e7581Daniel Dunbar bool UsePCH = D.CCCUsePCH; 6590ebd9321ba380471010341f24c874f46f56e7581Daniel Dunbar if (types::isCXX(Inputs[0].getType())) 6600ebd9321ba380471010341f24c874f46f56e7581Daniel Dunbar UsePCH = false; 6610ebd9321ba380471010341f24c874f46f56e7581Daniel Dunbar 6620ebd9321ba380471010341f24c874f46f56e7581Daniel Dunbar if (UsePCH) 663df91ef3d6c55692a0236f67b6c6b134a3bf84098Douglas Gregor CmdArgs.push_back("-emit-pch"); 664df91ef3d6c55692a0236f67b6c6b134a3bf84098Douglas Gregor else 665df91ef3d6c55692a0236f67b6c6b134a3bf84098Douglas Gregor CmdArgs.push_back("-emit-pth"); 6661d46033f760ba5fd266ce59fe391fac473f04f52Daniel Dunbar } else { 6671d46033f760ba5fd266ce59fe391fac473f04f52Daniel Dunbar assert(isa<CompileJobAction>(JA) && "Invalid action for clang tool."); 668c21c485b4fb58ef5d55cf3e523263dd824a2ace4Daniel Dunbar 6691d46033f760ba5fd266ce59fe391fac473f04f52Daniel Dunbar if (JA.getType() == types::TY_Nothing) { 6701d46033f760ba5fd266ce59fe391fac473f04f52Daniel Dunbar CmdArgs.push_back("-fsyntax-only"); 6711d46033f760ba5fd266ce59fe391fac473f04f52Daniel Dunbar } else if (JA.getType() == types::TY_LLVMAsm) { 6721d46033f760ba5fd266ce59fe391fac473f04f52Daniel Dunbar CmdArgs.push_back("-emit-llvm"); 6731d46033f760ba5fd266ce59fe391fac473f04f52Daniel Dunbar } else if (JA.getType() == types::TY_LLVMBC) { 6741d46033f760ba5fd266ce59fe391fac473f04f52Daniel Dunbar CmdArgs.push_back("-emit-llvm-bc"); 6751d46033f760ba5fd266ce59fe391fac473f04f52Daniel Dunbar } else if (JA.getType() == types::TY_PP_Asm) { 676e3b8d07e02861d245612b02b5f5a2c1f34b2a394Daniel Dunbar CmdArgs.push_back("-S"); 6775915fbf310e171c4cd3c2af05e9de360c0fa988aDaniel Dunbar } else if (JA.getType() == types::TY_AST) { 6785915fbf310e171c4cd3c2af05e9de360c0fa988aDaniel Dunbar CmdArgs.push_back("-emit-pch"); 6791d46033f760ba5fd266ce59fe391fac473f04f52Daniel Dunbar } 6801d46033f760ba5fd266ce59fe391fac473f04f52Daniel Dunbar } 6811d46033f760ba5fd266ce59fe391fac473f04f52Daniel Dunbar 6821d46033f760ba5fd266ce59fe391fac473f04f52Daniel Dunbar // The make clang go fast button. 6831d46033f760ba5fd266ce59fe391fac473f04f52Daniel Dunbar CmdArgs.push_back("-disable-free"); 6841d46033f760ba5fd266ce59fe391fac473f04f52Daniel Dunbar 685c9abc043af88f90d177a5bd147f627b78ca49fdeDaniel Dunbar // Set the main file name, so that debug info works even with 686c9abc043af88f90d177a5bd147f627b78ca49fdeDaniel Dunbar // -save-temps. 687c9abc043af88f90d177a5bd147f627b78ca49fdeDaniel Dunbar CmdArgs.push_back("-main-file-name"); 688c9abc043af88f90d177a5bd147f627b78ca49fdeDaniel Dunbar CmdArgs.push_back(darwin::CC1::getBaseInputName(Args, Inputs)); 689c9abc043af88f90d177a5bd147f627b78ca49fdeDaniel Dunbar 6903bbc75302fd43cf13d868b46c94ff8794b302e43Daniel Dunbar // Some flags which affect the language (via preprocessor 6913bbc75302fd43cf13d868b46c94ff8794b302e43Daniel Dunbar // defines). See darwin::CC1::AddCPPArgs. 6923bbc75302fd43cf13d868b46c94ff8794b302e43Daniel Dunbar if (Args.hasArg(options::OPT_static)) 6933bbc75302fd43cf13d868b46c94ff8794b302e43Daniel Dunbar CmdArgs.push_back("-static-define"); 6943bbc75302fd43cf13d868b46c94ff8794b302e43Daniel Dunbar 6951d46033f760ba5fd266ce59fe391fac473f04f52Daniel Dunbar if (isa<AnalyzeJobAction>(JA)) { 696b8bb3e797c5687715c6d9d960ee573e4d0e62230Ted Kremenek // Enable region store model by default. 697b8bb3e797c5687715c6d9d960ee573e4d0e62230Ted Kremenek CmdArgs.push_back("-analyzer-store=region"); 698b8bb3e797c5687715c6d9d960ee573e4d0e62230Ted Kremenek 699b40d06dec23b53bbc1157a9adae7f887be31aa3bTed Kremenek // Treat blocks as analysis entry points. 700b40d06dec23b53bbc1157a9adae7f887be31aa3bTed Kremenek CmdArgs.push_back("-analyzer-opt-analyze-nested-blocks"); 701b40d06dec23b53bbc1157a9adae7f887be31aa3bTed Kremenek 7021d46033f760ba5fd266ce59fe391fac473f04f52Daniel Dunbar // Add default argument set. 703d8fc0f2e7751cf31cec5c2f3cc6a0b447e9debb3Daniel Dunbar if (!Args.hasArg(options::OPT__analyzer_no_default_checks)) { 704cd9902bfb79c5c67559360514951714bdafac36eTed Kremenek CmdArgs.push_back("-analyzer-check-dead-stores"); 705fb3f893bc58071e548c97a3d667c8ab9b0c38cfbTed Kremenek CmdArgs.push_back("-analyzer-check-security-syntactic"); 706d8fc0f2e7751cf31cec5c2f3cc6a0b447e9debb3Daniel Dunbar CmdArgs.push_back("-checker-cfref"); 707d8fc0f2e7751cf31cec5c2f3cc6a0b447e9debb3Daniel Dunbar CmdArgs.push_back("-analyzer-eagerly-assume"); 708d8fc0f2e7751cf31cec5c2f3cc6a0b447e9debb3Daniel Dunbar CmdArgs.push_back("-warn-objc-methodsigs"); 709d8fc0f2e7751cf31cec5c2f3cc6a0b447e9debb3Daniel Dunbar // Do not enable the missing -dealloc check. 710d8fc0f2e7751cf31cec5c2f3cc6a0b447e9debb3Daniel Dunbar // '-warn-objc-missing-dealloc', 711d8fc0f2e7751cf31cec5c2f3cc6a0b447e9debb3Daniel Dunbar CmdArgs.push_back("-warn-objc-unused-ivars"); 712d8fc0f2e7751cf31cec5c2f3cc6a0b447e9debb3Daniel Dunbar } 713d8fc0f2e7751cf31cec5c2f3cc6a0b447e9debb3Daniel Dunbar 714d8fc0f2e7751cf31cec5c2f3cc6a0b447e9debb3Daniel Dunbar // Set the output format. The default is plist, for (lame) historical 715d8fc0f2e7751cf31cec5c2f3cc6a0b447e9debb3Daniel Dunbar // reasons. 716d8fc0f2e7751cf31cec5c2f3cc6a0b447e9debb3Daniel Dunbar CmdArgs.push_back("-analyzer-output"); 717d8fc0f2e7751cf31cec5c2f3cc6a0b447e9debb3Daniel Dunbar if (Arg *A = Args.getLastArg(options::OPT__analyzer_output)) 718d8fc0f2e7751cf31cec5c2f3cc6a0b447e9debb3Daniel Dunbar CmdArgs.push_back(A->getValue(Args)); 719d8fc0f2e7751cf31cec5c2f3cc6a0b447e9debb3Daniel Dunbar else 720d8fc0f2e7751cf31cec5c2f3cc6a0b447e9debb3Daniel Dunbar CmdArgs.push_back("plist"); 7211d46033f760ba5fd266ce59fe391fac473f04f52Daniel Dunbar 7221d46033f760ba5fd266ce59fe391fac473f04f52Daniel Dunbar // Add -Xanalyzer arguments when running as analyzer. 7231d46033f760ba5fd266ce59fe391fac473f04f52Daniel Dunbar Args.AddAllArgValues(CmdArgs, options::OPT_Xanalyzer); 7241eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump } 7251eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump 726e2fd66418eca3d70cf6b62087d745d0c5181db69Daniel Dunbar CheckCodeGenerationOptions(D, Args); 727e2fd66418eca3d70cf6b62087d745d0c5181db69Daniel Dunbar 728bc85be85779a47bae728bbe6a2cd2e3732b1333dDaniel Dunbar // Perform argument translation for LLVM backend. This 729bc85be85779a47bae728bbe6a2cd2e3732b1333dDaniel Dunbar // takes some care in reconciling with llvm-gcc. The 730bc85be85779a47bae728bbe6a2cd2e3732b1333dDaniel Dunbar // issue is that llvm-gcc translates these options based on 731bc85be85779a47bae728bbe6a2cd2e3732b1333dDaniel Dunbar // the values in cc1, whereas we are processing based on 732bc85be85779a47bae728bbe6a2cd2e3732b1333dDaniel Dunbar // the driver arguments. 7339fd0b1f845a61e71dd8099f596532d34c519630aDaniel Dunbar 734bc85be85779a47bae728bbe6a2cd2e3732b1333dDaniel Dunbar // This comes from the default translation the driver + cc1 735bc85be85779a47bae728bbe6a2cd2e3732b1333dDaniel Dunbar // would do to enable flag_pic. 736bc85be85779a47bae728bbe6a2cd2e3732b1333dDaniel Dunbar // 737bc85be85779a47bae728bbe6a2cd2e3732b1333dDaniel Dunbar // FIXME: Centralize this code. 738bc85be85779a47bae728bbe6a2cd2e3732b1333dDaniel Dunbar bool PICEnabled = (Args.hasArg(options::OPT_fPIC) || 739bc85be85779a47bae728bbe6a2cd2e3732b1333dDaniel Dunbar Args.hasArg(options::OPT_fpic) || 740bc85be85779a47bae728bbe6a2cd2e3732b1333dDaniel Dunbar Args.hasArg(options::OPT_fPIE) || 741bc85be85779a47bae728bbe6a2cd2e3732b1333dDaniel Dunbar Args.hasArg(options::OPT_fpie)); 742bc85be85779a47bae728bbe6a2cd2e3732b1333dDaniel Dunbar bool PICDisabled = (Args.hasArg(options::OPT_mkernel) || 743bc85be85779a47bae728bbe6a2cd2e3732b1333dDaniel Dunbar Args.hasArg(options::OPT_static)); 744bc85be85779a47bae728bbe6a2cd2e3732b1333dDaniel Dunbar const char *Model = getToolChain().GetForcedPicModel(); 745bc85be85779a47bae728bbe6a2cd2e3732b1333dDaniel Dunbar if (!Model) { 746bc85be85779a47bae728bbe6a2cd2e3732b1333dDaniel Dunbar if (Args.hasArg(options::OPT_mdynamic_no_pic)) 747bc85be85779a47bae728bbe6a2cd2e3732b1333dDaniel Dunbar Model = "dynamic-no-pic"; 748bc85be85779a47bae728bbe6a2cd2e3732b1333dDaniel Dunbar else if (PICDisabled) 749bc85be85779a47bae728bbe6a2cd2e3732b1333dDaniel Dunbar Model = "static"; 750bc85be85779a47bae728bbe6a2cd2e3732b1333dDaniel Dunbar else if (PICEnabled) 751bc85be85779a47bae728bbe6a2cd2e3732b1333dDaniel Dunbar Model = "pic"; 7521d46033f760ba5fd266ce59fe391fac473f04f52Daniel Dunbar else 753bc85be85779a47bae728bbe6a2cd2e3732b1333dDaniel Dunbar Model = getToolChain().GetDefaultRelocationModel(); 754bc85be85779a47bae728bbe6a2cd2e3732b1333dDaniel Dunbar } 755f219e7c1529fac29e34483667f740b452e5ef9ccDaniel Dunbar if (llvm::StringRef(Model) != "pic") { 756f219e7c1529fac29e34483667f740b452e5ef9ccDaniel Dunbar CmdArgs.push_back("-mrelocation-model"); 757f219e7c1529fac29e34483667f740b452e5ef9ccDaniel Dunbar CmdArgs.push_back(Model); 758f219e7c1529fac29e34483667f740b452e5ef9ccDaniel Dunbar } 7591d46033f760ba5fd266ce59fe391fac473f04f52Daniel Dunbar 760bc85be85779a47bae728bbe6a2cd2e3732b1333dDaniel Dunbar // Infer the __PIC__ value. 761bc85be85779a47bae728bbe6a2cd2e3732b1333dDaniel Dunbar // 762bc85be85779a47bae728bbe6a2cd2e3732b1333dDaniel Dunbar // FIXME: This isn't quite right on Darwin, which always sets 763bc85be85779a47bae728bbe6a2cd2e3732b1333dDaniel Dunbar // __PIC__=2. 764bc85be85779a47bae728bbe6a2cd2e3732b1333dDaniel Dunbar if (strcmp(Model, "pic") == 0 || strcmp(Model, "dynamic-no-pic") == 0) { 7657674352cf3e8f699914a2f739f1ae8c8c3480813Daniel Dunbar CmdArgs.push_back("-pic-level"); 7667674352cf3e8f699914a2f739f1ae8c8c3480813Daniel Dunbar CmdArgs.push_back(Args.hasArg(options::OPT_fPIC) ? "2" : "1"); 767bc85be85779a47bae728bbe6a2cd2e3732b1333dDaniel Dunbar } 768f219e7c1529fac29e34483667f740b452e5ef9ccDaniel Dunbar if (!Args.hasFlag(options::OPT_fmerge_all_constants, 769f219e7c1529fac29e34483667f740b452e5ef9ccDaniel Dunbar options::OPT_fno_merge_all_constants)) 770f219e7c1529fac29e34483667f740b452e5ef9ccDaniel Dunbar CmdArgs.push_back("-no-merge-all-constants"); 771f219e7c1529fac29e34483667f740b452e5ef9ccDaniel Dunbar 772f219e7c1529fac29e34483667f740b452e5ef9ccDaniel Dunbar // LLVM Code Generator Options. 7731d46033f760ba5fd266ce59fe391fac473f04f52Daniel Dunbar 774bc85be85779a47bae728bbe6a2cd2e3732b1333dDaniel Dunbar // FIXME: Set --enable-unsafe-fp-math. 77521656ddae8e81df04f142386337cb95a9e0f0971Benjamin Kramer if (Args.hasFlag(options::OPT_fno_omit_frame_pointer, 77621656ddae8e81df04f142386337cb95a9e0f0971Benjamin Kramer options::OPT_fomit_frame_pointer)) 777f219e7c1529fac29e34483667f740b452e5ef9ccDaniel Dunbar CmdArgs.push_back("-mdisable-fp-elim"); 778bc85be85779a47bae728bbe6a2cd2e3732b1333dDaniel Dunbar if (!Args.hasFlag(options::OPT_fzero_initialized_in_bss, 779f219e7c1529fac29e34483667f740b452e5ef9ccDaniel Dunbar options::OPT_fno_zero_initialized_in_bss)) 780f219e7c1529fac29e34483667f740b452e5ef9ccDaniel Dunbar CmdArgs.push_back("-mno-zero-initialized-in-bss"); 781bc85be85779a47bae728bbe6a2cd2e3732b1333dDaniel Dunbar if (Args.hasArg(options::OPT_dA) || Args.hasArg(options::OPT_fverbose_asm)) 782f219e7c1529fac29e34483667f740b452e5ef9ccDaniel Dunbar CmdArgs.push_back("-masm-verbose"); 783f219e7c1529fac29e34483667f740b452e5ef9ccDaniel Dunbar if (Args.hasArg(options::OPT_fdebug_pass_structure)) { 784f219e7c1529fac29e34483667f740b452e5ef9ccDaniel Dunbar CmdArgs.push_back("-mdebug-pass"); 785f219e7c1529fac29e34483667f740b452e5ef9ccDaniel Dunbar CmdArgs.push_back("Structure"); 786f219e7c1529fac29e34483667f740b452e5ef9ccDaniel Dunbar } 787f219e7c1529fac29e34483667f740b452e5ef9ccDaniel Dunbar if (Args.hasArg(options::OPT_fdebug_pass_arguments)) { 788f219e7c1529fac29e34483667f740b452e5ef9ccDaniel Dunbar CmdArgs.push_back("-mdebug-pass"); 789f219e7c1529fac29e34483667f740b452e5ef9ccDaniel Dunbar CmdArgs.push_back("Arguments"); 790f219e7c1529fac29e34483667f740b452e5ef9ccDaniel Dunbar } 7916bea73b3305a03479589e2642fbdcf6c096851aaDaniel Dunbar 7926bea73b3305a03479589e2642fbdcf6c096851aaDaniel Dunbar // This is a coarse approximation of what llvm-gcc actually does, both 7936bea73b3305a03479589e2642fbdcf6c096851aaDaniel Dunbar // -fasynchronous-unwind-tables and -fnon-call-exceptions interact in more 7946bea73b3305a03479589e2642fbdcf6c096851aaDaniel Dunbar // complicated ways. 7956bea73b3305a03479589e2642fbdcf6c096851aaDaniel Dunbar bool AsynchronousUnwindTables = 7966bea73b3305a03479589e2642fbdcf6c096851aaDaniel Dunbar Args.hasFlag(options::OPT_fasynchronous_unwind_tables, 7976bea73b3305a03479589e2642fbdcf6c096851aaDaniel Dunbar options::OPT_fno_asynchronous_unwind_tables, 7986bea73b3305a03479589e2642fbdcf6c096851aaDaniel Dunbar getToolChain().IsUnwindTablesDefault() && 7996bea73b3305a03479589e2642fbdcf6c096851aaDaniel Dunbar !Args.hasArg(options::OPT_mkernel)); 8006bea73b3305a03479589e2642fbdcf6c096851aaDaniel Dunbar if (Args.hasFlag(options::OPT_funwind_tables, options::OPT_fno_unwind_tables, 8016bea73b3305a03479589e2642fbdcf6c096851aaDaniel Dunbar AsynchronousUnwindTables)) 802f219e7c1529fac29e34483667f740b452e5ef9ccDaniel Dunbar CmdArgs.push_back("-munwind-tables"); 803f219e7c1529fac29e34483667f740b452e5ef9ccDaniel Dunbar 804f219e7c1529fac29e34483667f740b452e5ef9ccDaniel Dunbar if (Arg *A = Args.getLastArg(options::OPT_flimited_precision_EQ)) { 805f219e7c1529fac29e34483667f740b452e5ef9ccDaniel Dunbar CmdArgs.push_back("-mlimit-float-precision"); 806f219e7c1529fac29e34483667f740b452e5ef9ccDaniel Dunbar CmdArgs.push_back(A->getValue(Args)); 807f219e7c1529fac29e34483667f740b452e5ef9ccDaniel Dunbar } 808bc85be85779a47bae728bbe6a2cd2e3732b1333dDaniel Dunbar 809868bd0aa9281929ef50d2e9a8c82a036906f53f5Daniel Dunbar // FIXME: Handle -mtune=. 810868bd0aa9281929ef50d2e9a8c82a036906f53f5Daniel Dunbar (void) Args.hasArg(options::OPT_mtune_EQ); 811bc85be85779a47bae728bbe6a2cd2e3732b1333dDaniel Dunbar 8128e9ef0d87dad25f02e5abc6facf528778236115aBenjamin Kramer if (Arg *A = Args.getLastArg(options::OPT_mcmodel_EQ)) { 813f219e7c1529fac29e34483667f740b452e5ef9ccDaniel Dunbar CmdArgs.push_back("-mcode-model"); 8148e9ef0d87dad25f02e5abc6facf528778236115aBenjamin Kramer CmdArgs.push_back(A->getValue(Args)); 8158e9ef0d87dad25f02e5abc6facf528778236115aBenjamin Kramer } 8168e9ef0d87dad25f02e5abc6facf528778236115aBenjamin Kramer 8176acda16e9c194dcbd0dea64341e182bdb65d0f41Daniel Dunbar // Add target specific cpu and features flags. 8186acda16e9c194dcbd0dea64341e182bdb65d0f41Daniel Dunbar switch(getToolChain().getTriple().getArch()) { 8196acda16e9c194dcbd0dea64341e182bdb65d0f41Daniel Dunbar default: 8206acda16e9c194dcbd0dea64341e182bdb65d0f41Daniel Dunbar break; 821868bd0aa9281929ef50d2e9a8c82a036906f53f5Daniel Dunbar 822b163ef7e7a5d904ef0962a7c38c460be083c4d63Daniel Dunbar case llvm::Triple::arm: 823b163ef7e7a5d904ef0962a7c38c460be083c4d63Daniel Dunbar case llvm::Triple::thumb: 824b163ef7e7a5d904ef0962a7c38c460be083c4d63Daniel Dunbar AddARMTargetArgs(Args, CmdArgs); 825b163ef7e7a5d904ef0962a7c38c460be083c4d63Daniel Dunbar break; 826b163ef7e7a5d904ef0962a7c38c460be083c4d63Daniel Dunbar 8276acda16e9c194dcbd0dea64341e182bdb65d0f41Daniel Dunbar case llvm::Triple::x86: 8286acda16e9c194dcbd0dea64341e182bdb65d0f41Daniel Dunbar case llvm::Triple::x86_64: 8296acda16e9c194dcbd0dea64341e182bdb65d0f41Daniel Dunbar AddX86TargetArgs(Args, CmdArgs); 8306acda16e9c194dcbd0dea64341e182bdb65d0f41Daniel Dunbar break; 831bc85be85779a47bae728bbe6a2cd2e3732b1333dDaniel Dunbar } 832c21c485b4fb58ef5d55cf3e523263dd824a2ace4Daniel Dunbar 833c31176d5ebbcd407aa512bbd5f717e35da629e7dDan Gohman // -fno-math-errno is default. 834c31176d5ebbcd407aa512bbd5f717e35da629e7dDan Gohman if (Args.hasFlag(options::OPT_fmath_errno, 835bc85be85779a47bae728bbe6a2cd2e3732b1333dDaniel Dunbar options::OPT_fno_math_errno, 836c31176d5ebbcd407aa512bbd5f717e35da629e7dDan Gohman false)) 837c31176d5ebbcd407aa512bbd5f717e35da629e7dDan Gohman CmdArgs.push_back("-fmath-errno"); 8381d46033f760ba5fd266ce59fe391fac473f04f52Daniel Dunbar 839bc85be85779a47bae728bbe6a2cd2e3732b1333dDaniel Dunbar Arg *Unsupported; 840bc85be85779a47bae728bbe6a2cd2e3732b1333dDaniel Dunbar if ((Unsupported = Args.getLastArg(options::OPT_MG)) || 84195a0da7b263777e6f97e5a08b6eb893681a234baDaniel Dunbar (Unsupported = Args.getLastArg(options::OPT_MQ)) || 8426feaf57b46f0856127c84b03f3aee5fb51d0262bTed Kremenek (Unsupported = Args.getLastArg(options::OPT_iframework)) || 8436feaf57b46f0856127c84b03f3aee5fb51d0262bTed Kremenek (Unsupported = Args.getLastArg(options::OPT_fshort_enums))) 844e027a4b2399e9b0acfe0f77220c66bbe369067eeDaniel Dunbar D.Diag(clang::diag::err_drv_clang_unsupported) 845bc85be85779a47bae728bbe6a2cd2e3732b1333dDaniel Dunbar << Unsupported->getOption().getName(); 846bc85be85779a47bae728bbe6a2cd2e3732b1333dDaniel Dunbar 8471d46033f760ba5fd266ce59fe391fac473f04f52Daniel Dunbar Args.AddAllArgs(CmdArgs, options::OPT_v); 8481d46033f760ba5fd266ce59fe391fac473f04f52Daniel Dunbar Args.AddLastArg(CmdArgs, options::OPT_P); 8491eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump Args.AddLastArg(CmdArgs, options::OPT_print_ivar_layout); 8501d46033f760ba5fd266ce59fe391fac473f04f52Daniel Dunbar 8511d46033f760ba5fd266ce59fe391fac473f04f52Daniel Dunbar // Special case debug options to only pass -g to clang. This is 8521d46033f760ba5fd266ce59fe391fac473f04f52Daniel Dunbar // wrong. 8531d46033f760ba5fd266ce59fe391fac473f04f52Daniel Dunbar if (Args.hasArg(options::OPT_g_Group)) 8541d46033f760ba5fd266ce59fe391fac473f04f52Daniel Dunbar CmdArgs.push_back("-g"); 8551d46033f760ba5fd266ce59fe391fac473f04f52Daniel Dunbar 8561d46033f760ba5fd266ce59fe391fac473f04f52Daniel Dunbar Args.AddLastArg(CmdArgs, options::OPT_nostdinc); 8578d737cc78cb28f39179d6c7ca00eb5d3cf563129Rafael Espindola Args.AddLastArg(CmdArgs, options::OPT_nobuiltininc); 8581d46033f760ba5fd266ce59fe391fac473f04f52Daniel Dunbar 8595f12232ef39e3d6c36d6600a73ebbe3c4a79f514Daniel Dunbar // Pass the path to compiler resource files. 8605f12232ef39e3d6c36d6600a73ebbe3c4a79f514Daniel Dunbar CmdArgs.push_back("-resource-dir"); 861225c41706dc0f3682236e351820d339e14390e00Daniel Dunbar CmdArgs.push_back(D.ResourceDir.c_str()); 8622ac9fc2ad64e16127df8c60caeea2edfe9a400a2Daniel Dunbar 863c21c485b4fb58ef5d55cf3e523263dd824a2ace4Daniel Dunbar // Add preprocessing options like -I, -D, etc. if we are using the 864c21c485b4fb58ef5d55cf3e523263dd824a2ace4Daniel Dunbar // preprocessor. 865c21c485b4fb58ef5d55cf3e523263dd824a2ace4Daniel Dunbar // 866c21c485b4fb58ef5d55cf3e523263dd824a2ace4Daniel Dunbar // FIXME: Support -fpreprocessed 867c21c485b4fb58ef5d55cf3e523263dd824a2ace4Daniel Dunbar types::ID InputType = Inputs[0].getType(); 868c21c485b4fb58ef5d55cf3e523263dd824a2ace4Daniel Dunbar if (types::getPreprocessedType(InputType) != types::TY_INVALID) 869df91ef3d6c55692a0236f67b6c6b134a3bf84098Douglas Gregor AddPreprocessingOptions(D, Args, CmdArgs, Output, Inputs); 8701d46033f760ba5fd266ce59fe391fac473f04f52Daniel Dunbar 87120f0eacf1682e4594da9d318b5b13ed4f6d6e7e5Daniel Dunbar // Manually translate -O to -O2 and -O4 to -O3; let clang reject 872337a6271b98c4c183f7eaad1563a75260b4f2871Daniel Dunbar // others. 873337a6271b98c4c183f7eaad1563a75260b4f2871Daniel Dunbar if (Arg *A = Args.getLastArg(options::OPT_O_Group)) { 874b827a0541b5fd095fcdb7ad0c3df93ca158c619aDaniel Dunbar if (A->getOption().matches(options::OPT_O4)) 875337a6271b98c4c183f7eaad1563a75260b4f2871Daniel Dunbar CmdArgs.push_back("-O3"); 876337a6271b98c4c183f7eaad1563a75260b4f2871Daniel Dunbar else if (A->getValue(Args)[0] == '\0') 87720f0eacf1682e4594da9d318b5b13ed4f6d6e7e5Daniel Dunbar CmdArgs.push_back("-O2"); 8781d46033f760ba5fd266ce59fe391fac473f04f52Daniel Dunbar else 8795697aa0d75c87bafec78984048d558f8d12ca1b3Daniel Dunbar A->render(Args, CmdArgs); 8801d46033f760ba5fd266ce59fe391fac473f04f52Daniel Dunbar } 8811d46033f760ba5fd266ce59fe391fac473f04f52Daniel Dunbar 8826e8371eb97a08f724be22ae6042d1e9eacbe4c48Daniel Dunbar Args.AddAllArgs(CmdArgs, options::OPT_W_Group); 8836e8371eb97a08f724be22ae6042d1e9eacbe4c48Daniel Dunbar Args.AddLastArg(CmdArgs, options::OPT_pedantic); 8846e8371eb97a08f724be22ae6042d1e9eacbe4c48Daniel Dunbar Args.AddLastArg(CmdArgs, options::OPT_pedantic_errors); 8851d46033f760ba5fd266ce59fe391fac473f04f52Daniel Dunbar Args.AddLastArg(CmdArgs, options::OPT_w); 886d573d26e1abcce24c31ece3d6f7af158db569e4cDaniel Dunbar 887d573d26e1abcce24c31ece3d6f7af158db569e4cDaniel Dunbar // Handle -{std, ansi, trigraphs} -- take the last of -{std, ansi} 888d573d26e1abcce24c31ece3d6f7af158db569e4cDaniel Dunbar // (-ansi is equivalent to -std=c89). 889d573d26e1abcce24c31ece3d6f7af158db569e4cDaniel Dunbar // 890d573d26e1abcce24c31ece3d6f7af158db569e4cDaniel Dunbar // If a std is supplied, only add -trigraphs if it follows the 891d573d26e1abcce24c31ece3d6f7af158db569e4cDaniel Dunbar // option. 892d573d26e1abcce24c31ece3d6f7af158db569e4cDaniel Dunbar if (Arg *Std = Args.getLastArg(options::OPT_std_EQ, options::OPT_ansi)) { 893d573d26e1abcce24c31ece3d6f7af158db569e4cDaniel Dunbar if (Std->getOption().matches(options::OPT_ansi)) 894528365d3189d27f3a90a4012baaa8b2814e0a231Nuno Lopes if (types::isCXX(InputType)) 895294691eb1caf551083acd7b08630ef21c3fd760dDaniel Dunbar CmdArgs.push_back("-std=c++98"); 896528365d3189d27f3a90a4012baaa8b2814e0a231Nuno Lopes else 897294691eb1caf551083acd7b08630ef21c3fd760dDaniel Dunbar CmdArgs.push_back("-std=c89"); 898d573d26e1abcce24c31ece3d6f7af158db569e4cDaniel Dunbar else 899d573d26e1abcce24c31ece3d6f7af158db569e4cDaniel Dunbar Std->render(Args, CmdArgs); 900d573d26e1abcce24c31ece3d6f7af158db569e4cDaniel Dunbar 901d573d26e1abcce24c31ece3d6f7af158db569e4cDaniel Dunbar if (Arg *A = Args.getLastArg(options::OPT_trigraphs)) 902d573d26e1abcce24c31ece3d6f7af158db569e4cDaniel Dunbar if (A->getIndex() > Std->getIndex()) 903d573d26e1abcce24c31ece3d6f7af158db569e4cDaniel Dunbar A->render(Args, CmdArgs); 904a3ff202ee4fb21728e930d5d029ba4925129912cDaniel Dunbar } else { 905a3ff202ee4fb21728e930d5d029ba4925129912cDaniel Dunbar // Honor -std-default. 9064a5290e773e70ec2c3b4353a3a4aa7d1a3e3cd66Daniel Dunbar // 9074a5290e773e70ec2c3b4353a3a4aa7d1a3e3cd66Daniel Dunbar // FIXME: Clang doesn't correctly handle -std= when the input language 9084a5290e773e70ec2c3b4353a3a4aa7d1a3e3cd66Daniel Dunbar // doesn't match. For the time being just ignore this for C++ inputs; 9094a5290e773e70ec2c3b4353a3a4aa7d1a3e3cd66Daniel Dunbar // eventually we want to do all the standard defaulting here instead of 9104a5290e773e70ec2c3b4353a3a4aa7d1a3e3cd66Daniel Dunbar // splitting it between the driver and clang -cc1. 9114a5290e773e70ec2c3b4353a3a4aa7d1a3e3cd66Daniel Dunbar if (!types::isCXX(InputType)) 9124a5290e773e70ec2c3b4353a3a4aa7d1a3e3cd66Daniel Dunbar Args.AddAllArgsTranslated(CmdArgs, options::OPT_std_default_EQ, 9134a5290e773e70ec2c3b4353a3a4aa7d1a3e3cd66Daniel Dunbar "-std=", /*Joined=*/true); 914d573d26e1abcce24c31ece3d6f7af158db569e4cDaniel Dunbar Args.AddLastArg(CmdArgs, options::OPT_trigraphs); 915a3ff202ee4fb21728e930d5d029ba4925129912cDaniel Dunbar } 916c21c485b4fb58ef5d55cf3e523263dd824a2ace4Daniel Dunbar 9171d46033f760ba5fd266ce59fe391fac473f04f52Daniel Dunbar if (Arg *A = Args.getLastArg(options::OPT_ftemplate_depth_)) { 9181d46033f760ba5fd266ce59fe391fac473f04f52Daniel Dunbar CmdArgs.push_back("-ftemplate-depth"); 9191d46033f760ba5fd266ce59fe391fac473f04f52Daniel Dunbar CmdArgs.push_back(A->getValue(Args)); 920b488c1dac8e53206f07103d794a62a3f5012c0f4Daniel Dunbar } 921b488c1dac8e53206f07103d794a62a3f5012c0f4Daniel Dunbar 922e4bdae78c69d2a09ee96619cc5ccf81441674412Daniel Dunbar if (Args.hasArg(options::OPT__relocatable_pch)) 92366861e09d590994a8b941eaa328e4d8f33adec9eDaniel Dunbar CmdArgs.push_back("-relocatable-pch"); 9241eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump 925294691eb1caf551083acd7b08630ef21c3fd760dDaniel Dunbar if (Arg *A = Args.getLastArg(options::OPT_fconstant_string_class_EQ)) { 926294691eb1caf551083acd7b08630ef21c3fd760dDaniel Dunbar CmdArgs.push_back("-fconstant-string-class"); 927294691eb1caf551083acd7b08630ef21c3fd760dDaniel Dunbar CmdArgs.push_back(A->getValue(Args)); 928294691eb1caf551083acd7b08630ef21c3fd760dDaniel Dunbar } 9298a5a9aaddb627c0884c2ed8db55cc29fdb601195David Chisnall 930124fca533d9fef2e3f6359283909bd342b5f5f26Chris Lattner if (Arg *A = Args.getLastArg(options::OPT_ftabstop_EQ)) { 931124fca533d9fef2e3f6359283909bd342b5f5f26Chris Lattner CmdArgs.push_back("-ftabstop"); 932124fca533d9fef2e3f6359283909bd342b5f5f26Chris Lattner CmdArgs.push_back(A->getValue(Args)); 933124fca533d9fef2e3f6359283909bd342b5f5f26Chris Lattner } 934124fca533d9fef2e3f6359283909bd342b5f5f26Chris Lattner 93555efe142a84b2aab6d0186c20a311c347a65f794Daniel Dunbar // Pass -fmessage-length=. 936a28690e5b0e423a6287ebe3a5565fd1896d7ebffDaniel Dunbar CmdArgs.push_back("-fmessage-length"); 93755efe142a84b2aab6d0186c20a311c347a65f794Daniel Dunbar if (Arg *A = Args.getLastArg(options::OPT_fmessage_length_EQ)) { 938a28690e5b0e423a6287ebe3a5565fd1896d7ebffDaniel Dunbar CmdArgs.push_back(A->getValue(Args)); 93955efe142a84b2aab6d0186c20a311c347a65f794Daniel Dunbar } else { 94055efe142a84b2aab6d0186c20a311c347a65f794Daniel Dunbar // If -fmessage-length=N was not specified, determine whether this is a 94155efe142a84b2aab6d0186c20a311c347a65f794Daniel Dunbar // terminal and, if so, implicitly define -fmessage-length appropriately. 94255efe142a84b2aab6d0186c20a311c347a65f794Daniel Dunbar unsigned N = llvm::sys::Process::StandardErrColumns(); 94355efe142a84b2aab6d0186c20a311c347a65f794Daniel Dunbar CmdArgs.push_back(Args.MakeArgString(llvm::Twine(N))); 94455efe142a84b2aab6d0186c20a311c347a65f794Daniel Dunbar } 94555efe142a84b2aab6d0186c20a311c347a65f794Daniel Dunbar 946ba8d86172c8d9e2476c6fd2415731639223174c5Daniel Dunbar if (const Arg *A = Args.getLastArg(options::OPT_fvisibility_EQ)) { 947ba8d86172c8d9e2476c6fd2415731639223174c5Daniel Dunbar CmdArgs.push_back("-fvisibility"); 948ba8d86172c8d9e2476c6fd2415731639223174c5Daniel Dunbar CmdArgs.push_back(A->getValue(Args)); 949ba8d86172c8d9e2476c6fd2415731639223174c5Daniel Dunbar } 950ba8d86172c8d9e2476c6fd2415731639223174c5Daniel Dunbar 951ba8d86172c8d9e2476c6fd2415731639223174c5Daniel Dunbar // Forward -f (flag) options which we can pass directly. 9529c276ae0f24d4cee8f7954069d4b8eae45d0447dMike Stump Args.AddLastArg(CmdArgs, options::OPT_fcatch_undefined_behavior); 9533aaf082689d3235937a2e56a60f90fc1b3aebfb2Daniel Dunbar Args.AddLastArg(CmdArgs, options::OPT_femit_all_decls); 9543aaf082689d3235937a2e56a60f90fc1b3aebfb2Daniel Dunbar Args.AddLastArg(CmdArgs, options::OPT_ffreestanding); 9553aaf082689d3235937a2e56a60f90fc1b3aebfb2Daniel Dunbar Args.AddLastArg(CmdArgs, options::OPT_fheinous_gnu_extensions); 9563aaf082689d3235937a2e56a60f90fc1b3aebfb2Daniel Dunbar Args.AddLastArg(CmdArgs, options::OPT_flax_vector_conversions); 9573aaf082689d3235937a2e56a60f90fc1b3aebfb2Daniel Dunbar Args.AddLastArg(CmdArgs, options::OPT_fno_caret_diagnostics); 9583aaf082689d3235937a2e56a60f90fc1b3aebfb2Daniel Dunbar Args.AddLastArg(CmdArgs, options::OPT_fno_show_column); 9593aaf082689d3235937a2e56a60f90fc1b3aebfb2Daniel Dunbar Args.AddLastArg(CmdArgs, options::OPT_fobjc_gc_only); 9603aaf082689d3235937a2e56a60f90fc1b3aebfb2Daniel Dunbar Args.AddLastArg(CmdArgs, options::OPT_fobjc_gc); 96134e65770ad6142b033d6cec4f476ed20fb248bf3Fariborz Jahanian Args.AddLastArg(CmdArgs, options::OPT_fobjc_sender_dependent_dispatch); 962182e09240a33c6f1d303deecabec6e0e9c9d109dChris Lattner Args.AddLastArg(CmdArgs, options::OPT_fdiagnostics_print_source_range_info); 9633aaf082689d3235937a2e56a60f90fc1b3aebfb2Daniel Dunbar Args.AddLastArg(CmdArgs, options::OPT_ftime_report); 9643aaf082689d3235937a2e56a60f90fc1b3aebfb2Daniel Dunbar Args.AddLastArg(CmdArgs, options::OPT_ftrapv); 9653aaf082689d3235937a2e56a60f90fc1b3aebfb2Daniel Dunbar Args.AddLastArg(CmdArgs, options::OPT_fwritable_strings); 9661d46033f760ba5fd266ce59fe391fac473f04f52Daniel Dunbar 9675345c391c65d1780a0d7b0102b7f735cc3f82732Daniel Dunbar Args.AddLastArg(CmdArgs, options::OPT_pthread); 9685345c391c65d1780a0d7b0102b7f735cc3f82732Daniel Dunbar 9699e5cc6b703b2d0013f13800c2ffbeb3cf85fcfadDaniel Dunbar // -stack-protector=0 is default. 9709e5cc6b703b2d0013f13800c2ffbeb3cf85fcfadDaniel Dunbar unsigned StackProtectorLevel = 0; 97145483f7a1b3e57b4603b141bee80596b2d4dd443Bill Wendling if (Arg *A = Args.getLastArg(options::OPT_fno_stack_protector, 97245483f7a1b3e57b4603b141bee80596b2d4dd443Bill Wendling options::OPT_fstack_protector_all, 97345483f7a1b3e57b4603b141bee80596b2d4dd443Bill Wendling options::OPT_fstack_protector)) { 9749e5cc6b703b2d0013f13800c2ffbeb3cf85fcfadDaniel Dunbar if (A->getOption().matches(options::OPT_fstack_protector)) 9759e5cc6b703b2d0013f13800c2ffbeb3cf85fcfadDaniel Dunbar StackProtectorLevel = 1; 9769e5cc6b703b2d0013f13800c2ffbeb3cf85fcfadDaniel Dunbar else if (A->getOption().matches(options::OPT_fstack_protector_all)) 9779e5cc6b703b2d0013f13800c2ffbeb3cf85fcfadDaniel Dunbar StackProtectorLevel = 2; 9789e5cc6b703b2d0013f13800c2ffbeb3cf85fcfadDaniel Dunbar } else 9799e5cc6b703b2d0013f13800c2ffbeb3cf85fcfadDaniel Dunbar StackProtectorLevel = getToolChain().GetDefaultStackProtectorLevel(); 9809e5cc6b703b2d0013f13800c2ffbeb3cf85fcfadDaniel Dunbar if (StackProtectorLevel) { 9819e5cc6b703b2d0013f13800c2ffbeb3cf85fcfadDaniel Dunbar CmdArgs.push_back("-stack-protector"); 9829e5cc6b703b2d0013f13800c2ffbeb3cf85fcfadDaniel Dunbar CmdArgs.push_back(Args.MakeArgString(llvm::Twine(StackProtectorLevel))); 98345483f7a1b3e57b4603b141bee80596b2d4dd443Bill Wendling } 98445483f7a1b3e57b4603b141bee80596b2d4dd443Bill Wendling 98548d1ef782c8c88066b5febf60f8f456064d7d3f0Daniel Dunbar // Forward -f options with positive and negative forms; we translate 98648d1ef782c8c88066b5febf60f8f456064d7d3f0Daniel Dunbar // these by hand. 98748d1ef782c8c88066b5febf60f8f456064d7d3f0Daniel Dunbar 9889e5cc6b703b2d0013f13800c2ffbeb3cf85fcfadDaniel Dunbar // -fbuiltin is default. 98948d1ef782c8c88066b5febf60f8f456064d7d3f0Daniel Dunbar if (!Args.hasFlag(options::OPT_fbuiltin, options::OPT_fno_builtin)) 99053e8484581ca358c3a2ccd8ea39c136c6e85d606Daniel Dunbar CmdArgs.push_back("-fno-builtin"); 99148d1ef782c8c88066b5febf60f8f456064d7d3f0Daniel Dunbar 992fc2844846e91398205fddc71196fe9dda04e105fNuno Lopes if (!Args.hasFlag(options::OPT_fassume_sane_operator_new, 993fc2844846e91398205fddc71196fe9dda04e105fNuno Lopes options::OPT_fno_assume_sane_operator_new)) 994fc2844846e91398205fddc71196fe9dda04e105fNuno Lopes CmdArgs.push_back("-fno-assume-sane-operator-new"); 995fc2844846e91398205fddc71196fe9dda04e105fNuno Lopes 9969e5cc6b703b2d0013f13800c2ffbeb3cf85fcfadDaniel Dunbar // -fblocks=0 is default. 9979e5cc6b703b2d0013f13800c2ffbeb3cf85fcfadDaniel Dunbar if (Args.hasFlag(options::OPT_fblocks, options::OPT_fno_blocks, 9985e530af5d51572a0ed5dbe50da54bd333840c63dDavid Chisnall getToolChain().IsBlocksDefault())) { 9995e530af5d51572a0ed5dbe50da54bd333840c63dDavid Chisnall Args.AddLastArg(CmdArgs, options::OPT_fblock_introspection); 10009e5cc6b703b2d0013f13800c2ffbeb3cf85fcfadDaniel Dunbar CmdArgs.push_back("-fblocks"); 10015e530af5d51572a0ed5dbe50da54bd333840c63dDavid Chisnall } 100248d1ef782c8c88066b5febf60f8f456064d7d3f0Daniel Dunbar 10036d2eb4d07d40795131f28d719ef9146a2be500f6Daniel Dunbar // -fexceptions=0 is default. 100485caf03ee49c4de87ee9624a9b725ef5d20ee624Fariborz Jahanian if (needsExceptions(Args, InputType, getToolChain().getTriple())) 1005f759df06d997050559fd925758bcd2cdef24db05Rafael Espindola CmdArgs.push_back("-fexceptions"); 1006738f8c278da5950d0d4607de2debe0bdfad64185Mike Stump 10070be42c44f0199c5023b542d6a6d2e66eb594f27dDaniel Dunbar // -frtti is default. 1008738f8c278da5950d0d4607de2debe0bdfad64185Mike Stump if (!Args.hasFlag(options::OPT_frtti, options::OPT_fno_rtti)) 100953e8484581ca358c3a2ccd8ea39c136c6e85d606Daniel Dunbar CmdArgs.push_back("-fno-rtti"); 1010738f8c278da5950d0d4607de2debe0bdfad64185Mike Stump 10111f95e6567faab67f4363d650f73121359c4bdbabDaniel Dunbar // -fsigned-char is default. 10126d2eb4d07d40795131f28d719ef9146a2be500f6Daniel Dunbar if (!Args.hasFlag(options::OPT_fsigned_char, options::OPT_funsigned_char, 10131f95e6567faab67f4363d650f73121359c4bdbabDaniel Dunbar isSignedCharDefault(getToolChain().getTriple()))) 10147674352cf3e8f699914a2f739f1ae8c8c3480813Daniel Dunbar CmdArgs.push_back("-fno-signed-char"); 10155a77973d9bc2c9cdbdb7860dcf3ac795abe258ecEli Friedman 10160be42c44f0199c5023b542d6a6d2e66eb594f27dDaniel Dunbar // -fms-extensions=0 is default. 10176d2eb4d07d40795131f28d719ef9146a2be500f6Daniel Dunbar if (Args.hasFlag(options::OPT_fms_extensions, options::OPT_fno_ms_extensions, 10180be42c44f0199c5023b542d6a6d2e66eb594f27dDaniel Dunbar getToolChain().getTriple().getOS() == llvm::Triple::Win32)) 10190be42c44f0199c5023b542d6a6d2e66eb594f27dDaniel Dunbar CmdArgs.push_back("-fms-extensions"); 10200be42c44f0199c5023b542d6a6d2e66eb594f27dDaniel Dunbar 1021c5a97ec19408c3dca4b6a6385f11d8c783b94d0bDaniel Dunbar // -fnext-runtime is default. 10226d2eb4d07d40795131f28d719ef9146a2be500f6Daniel Dunbar if (!Args.hasFlag(options::OPT_fnext_runtime, options::OPT_fgnu_runtime, 1023c5a97ec19408c3dca4b6a6385f11d8c783b94d0bDaniel Dunbar getToolChain().getTriple().getOS() == llvm::Triple::Darwin)) 1024c5a97ec19408c3dca4b6a6385f11d8c783b94d0bDaniel Dunbar CmdArgs.push_back("-fgnu-runtime"); 1025c5a97ec19408c3dca4b6a6385f11d8c783b94d0bDaniel Dunbar 10269e5cc6b703b2d0013f13800c2ffbeb3cf85fcfadDaniel Dunbar // -fobjc-nonfragile-abi=0 is default. 10279e5cc6b703b2d0013f13800c2ffbeb3cf85fcfadDaniel Dunbar if (types::isObjC(InputType)) { 10289e5cc6b703b2d0013f13800c2ffbeb3cf85fcfadDaniel Dunbar if (Args.hasArg(options::OPT_fobjc_nonfragile_abi) || 1029984eb8611d9ee46fc6351dee43609f2deed99f3cDaniel Dunbar getToolChain().IsObjCNonFragileABIDefault()) { 10309e5cc6b703b2d0013f13800c2ffbeb3cf85fcfadDaniel Dunbar CmdArgs.push_back("-fobjc-nonfragile-abi"); 1031984eb8611d9ee46fc6351dee43609f2deed99f3cDaniel Dunbar 1032984eb8611d9ee46fc6351dee43609f2deed99f3cDaniel Dunbar // -fobjc-legacy-dispatch is only relevant with the nonfragile-abi, and 1033984eb8611d9ee46fc6351dee43609f2deed99f3cDaniel Dunbar // defaults to off. 1034984eb8611d9ee46fc6351dee43609f2deed99f3cDaniel Dunbar if (Args.hasFlag(options::OPT_fobjc_legacy_dispatch, 1035984eb8611d9ee46fc6351dee43609f2deed99f3cDaniel Dunbar options::OPT_fno_objc_legacy_dispatch, 1036609508ce95732e7e7010f79c5207613eced7c9cbDaniel Dunbar getToolChain().IsObjCLegacyDispatchDefault())) 1037984eb8611d9ee46fc6351dee43609f2deed99f3cDaniel Dunbar CmdArgs.push_back("-fobjc-legacy-dispatch"); 1038984eb8611d9ee46fc6351dee43609f2deed99f3cDaniel Dunbar } 10399e5cc6b703b2d0013f13800c2ffbeb3cf85fcfadDaniel Dunbar } 10409e5cc6b703b2d0013f13800c2ffbeb3cf85fcfadDaniel Dunbar 1041984eb8611d9ee46fc6351dee43609f2deed99f3cDaniel Dunbar if (!Args.hasFlag(options::OPT_fassume_sane_operator_new, 1042984eb8611d9ee46fc6351dee43609f2deed99f3cDaniel Dunbar options::OPT_fno_assume_sane_operator_new)) 1043984eb8611d9ee46fc6351dee43609f2deed99f3cDaniel Dunbar CmdArgs.push_back("-fno-assume-sane-operator-new"); 1044984eb8611d9ee46fc6351dee43609f2deed99f3cDaniel Dunbar 1045a6fda124bf380479529d6a80b84b62cacd3cb707John Thompson // -fshort-wchar default varies depending on platform; only 1046a6fda124bf380479529d6a80b84b62cacd3cb707John Thompson // pass if specified. 1047a6fda124bf380479529d6a80b84b62cacd3cb707John Thompson if (Arg *A = Args.getLastArg(options::OPT_fshort_wchar)) { 1048a6fda124bf380479529d6a80b84b62cacd3cb707John Thompson if (A->getOption().matches(options::OPT_fshort_wchar)) 1049a6fda124bf380479529d6a80b84b62cacd3cb707John Thompson CmdArgs.push_back("-fshort-wchar"); 1050a6fda124bf380479529d6a80b84b62cacd3cb707John Thompson } 1051a6fda124bf380479529d6a80b84b62cacd3cb707John Thompson 1052ee848a73e5f8ffe7511af8652ba811c020d1c7a0Daniel Dunbar // -fno-pascal-strings is default, only pass non-default. If the tool chain 1053ee848a73e5f8ffe7511af8652ba811c020d1c7a0Daniel Dunbar // happened to translate to -mpascal-strings, we want to back translate here. 105482d00688525c876bf47bce414dedae9c343e67f5Daniel Dunbar // 105582d00688525c876bf47bce414dedae9c343e67f5Daniel Dunbar // FIXME: This is gross; that translation should be pulled from the 105682d00688525c876bf47bce414dedae9c343e67f5Daniel Dunbar // tool chain. 1057c21c485b4fb58ef5d55cf3e523263dd824a2ace4Daniel Dunbar if (Args.hasFlag(options::OPT_fpascal_strings, 105882d00688525c876bf47bce414dedae9c343e67f5Daniel Dunbar options::OPT_fno_pascal_strings, 105982d00688525c876bf47bce414dedae9c343e67f5Daniel Dunbar false) || 106082d00688525c876bf47bce414dedae9c343e67f5Daniel Dunbar Args.hasFlag(options::OPT_mpascal_strings, 106182d00688525c876bf47bce414dedae9c343e67f5Daniel Dunbar options::OPT_mno_pascal_strings, 106282d00688525c876bf47bce414dedae9c343e67f5Daniel Dunbar false)) 106348d1ef782c8c88066b5febf60f8f456064d7d3f0Daniel Dunbar CmdArgs.push_back("-fpascal-strings"); 106448d1ef782c8c88066b5febf60f8f456064d7d3f0Daniel Dunbar 106548d1ef782c8c88066b5febf60f8f456064d7d3f0Daniel Dunbar // -fcommon is default, only pass non-default. 106648d1ef782c8c88066b5febf60f8f456064d7d3f0Daniel Dunbar if (!Args.hasFlag(options::OPT_fcommon, options::OPT_fno_common)) 106748d1ef782c8c88066b5febf60f8f456064d7d3f0Daniel Dunbar CmdArgs.push_back("-fno-common"); 106848d1ef782c8c88066b5febf60f8f456064d7d3f0Daniel Dunbar 106970d3c92820f590b10553da9c96eda24e4325ba34Daniel Dunbar // -fsigned-bitfields is default, and clang doesn't yet support 107070d3c92820f590b10553da9c96eda24e4325ba34Daniel Dunbar // --funsigned-bitfields. 10711eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump if (!Args.hasFlag(options::OPT_fsigned_bitfields, 107270d3c92820f590b10553da9c96eda24e4325ba34Daniel Dunbar options::OPT_funsigned_bitfields)) 107370d3c92820f590b10553da9c96eda24e4325ba34Daniel Dunbar D.Diag(clang::diag::warn_drv_clang_unsupported) 107470d3c92820f590b10553da9c96eda24e4325ba34Daniel Dunbar << Args.getLastArg(options::OPT_funsigned_bitfields)->getAsString(Args); 107570d3c92820f590b10553da9c96eda24e4325ba34Daniel Dunbar 107649138fc59eeac2aacd3b7e04c2642180d5baefd7Daniel Dunbar // -fdiagnostics-fixit-info is default, only pass non-default. 10771eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump if (!Args.hasFlag(options::OPT_fdiagnostics_fixit_info, 107849138fc59eeac2aacd3b7e04c2642180d5baefd7Daniel Dunbar options::OPT_fno_diagnostics_fixit_info)) 107949138fc59eeac2aacd3b7e04c2642180d5baefd7Daniel Dunbar CmdArgs.push_back("-fno-diagnostics-fixit-info"); 108049138fc59eeac2aacd3b7e04c2642180d5baefd7Daniel Dunbar 108174f20838caa266f829bf5ae43997f8ebfca54a9aDaniel Dunbar Args.AddLastArg(CmdArgs, options::OPT_fdiagnostics_binary); 1082d93256e55673a17d18543397ec462416acb13792Douglas Gregor 10839e820ee054fefe5422b4db3f681e567a8976747eDaniel Dunbar // Enable -fdiagnostics-show-option by default. 10841eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump if (Args.hasFlag(options::OPT_fdiagnostics_show_option, 10859e820ee054fefe5422b4db3f681e567a8976747eDaniel Dunbar options::OPT_fno_diagnostics_show_option)) 10869e820ee054fefe5422b4db3f681e567a8976747eDaniel Dunbar CmdArgs.push_back("-fdiagnostics-show-option"); 1087838be483dcf10ea3f2acd85f2cd65adc310011f9Daniel Dunbar 1088838be483dcf10ea3f2acd85f2cd65adc310011f9Daniel Dunbar // Color diagnostics are the default, unless the terminal doesn't support 1089838be483dcf10ea3f2acd85f2cd65adc310011f9Daniel Dunbar // them. 1090838be483dcf10ea3f2acd85f2cd65adc310011f9Daniel Dunbar if (Args.hasFlag(options::OPT_fcolor_diagnostics, 1091838be483dcf10ea3f2acd85f2cd65adc310011f9Daniel Dunbar options::OPT_fno_color_diagnostics) && 1092838be483dcf10ea3f2acd85f2cd65adc310011f9Daniel Dunbar llvm::sys::Process::StandardErrHasColors()) 1093838be483dcf10ea3f2acd85f2cd65adc310011f9Daniel Dunbar CmdArgs.push_back("-fcolor-diagnostics"); 1094838be483dcf10ea3f2acd85f2cd65adc310011f9Daniel Dunbar 109575eb1d64784946a37fc0b27596e2d92b6cf7033bDaniel Dunbar if (!Args.hasFlag(options::OPT_fshow_source_location, 109675eb1d64784946a37fc0b27596e2d92b6cf7033bDaniel Dunbar options::OPT_fno_show_source_location)) 109775eb1d64784946a37fc0b27596e2d92b6cf7033bDaniel Dunbar CmdArgs.push_back("-fno-show-source-location"); 10989e820ee054fefe5422b4db3f681e567a8976747eDaniel Dunbar 10997695fba30221613b7cf31276456217c41bb90960Daniel Dunbar // -fdollars-in-identifiers default varies depending on platform and 11007695fba30221613b7cf31276456217c41bb90960Daniel Dunbar // language; only pass if specified. 11011eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump if (Arg *A = Args.getLastArg(options::OPT_fdollars_in_identifiers, 11027695fba30221613b7cf31276456217c41bb90960Daniel Dunbar options::OPT_fno_dollars_in_identifiers)) { 11037695fba30221613b7cf31276456217c41bb90960Daniel Dunbar if (A->getOption().matches(options::OPT_fdollars_in_identifiers)) 11048663b180085e9bc7a0a87c80cc3f722efef99e79Daniel Dunbar CmdArgs.push_back("-fdollars-in-identifiers"); 11057695fba30221613b7cf31276456217c41bb90960Daniel Dunbar else 11068663b180085e9bc7a0a87c80cc3f722efef99e79Daniel Dunbar CmdArgs.push_back("-fno-dollars-in-identifiers"); 11077695fba30221613b7cf31276456217c41bb90960Daniel Dunbar } 11087695fba30221613b7cf31276456217c41bb90960Daniel Dunbar 1109e027a4b2399e9b0acfe0f77220c66bbe369067eeDaniel Dunbar // -funit-at-a-time is default, and we don't support -fno-unit-at-a-time for 1110e027a4b2399e9b0acfe0f77220c66bbe369067eeDaniel Dunbar // practical purposes. 11111eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump if (Arg *A = Args.getLastArg(options::OPT_funit_at_a_time, 1112e027a4b2399e9b0acfe0f77220c66bbe369067eeDaniel Dunbar options::OPT_fno_unit_at_a_time)) { 1113e027a4b2399e9b0acfe0f77220c66bbe369067eeDaniel Dunbar if (A->getOption().matches(options::OPT_fno_unit_at_a_time)) 1114c37691068db5ceb19c014ddd3e02afa9875f8181Edward O'Callaghan D.Diag(clang::diag::warn_drv_clang_unsupported) << A->getAsString(Args); 1115e027a4b2399e9b0acfe0f77220c66bbe369067eeDaniel Dunbar } 1116ceb5c5b7f67a30fae305d1d19b478b623e4fbcedEli Friedman 11172ba91575905a54f712a7f64304e56002e4882499Daniel Dunbar // Default to -fno-builtin-str{cat,cpy} on Darwin for ARM. 1118f84a4a469d8a45c76cb941595582a0fd3b9b15d3Daniel Dunbar // 11198ff5b28d6efcffe2251e77634c7edf83a4763344Daniel Dunbar // FIXME: This is disabled until clang -cc1 supports -fno-builtin-foo. PR4941. 1120f84a4a469d8a45c76cb941595582a0fd3b9b15d3Daniel Dunbar#if 0 11212ba91575905a54f712a7f64304e56002e4882499Daniel Dunbar if (getToolChain().getTriple().getOS() == llvm::Triple::Darwin && 11222ba91575905a54f712a7f64304e56002e4882499Daniel Dunbar (getToolChain().getTriple().getArch() == llvm::Triple::arm || 11232ba91575905a54f712a7f64304e56002e4882499Daniel Dunbar getToolChain().getTriple().getArch() == llvm::Triple::thumb)) { 11242ba91575905a54f712a7f64304e56002e4882499Daniel Dunbar if (!Args.hasArg(options::OPT_fbuiltin_strcat)) 11252ba91575905a54f712a7f64304e56002e4882499Daniel Dunbar CmdArgs.push_back("-fno-builtin-strcat"); 11262ba91575905a54f712a7f64304e56002e4882499Daniel Dunbar if (!Args.hasArg(options::OPT_fbuiltin_strcpy)) 11272ba91575905a54f712a7f64304e56002e4882499Daniel Dunbar CmdArgs.push_back("-fno-builtin-strcpy"); 11282ba91575905a54f712a7f64304e56002e4882499Daniel Dunbar } 1129f84a4a469d8a45c76cb941595582a0fd3b9b15d3Daniel Dunbar#endif 11302ba91575905a54f712a7f64304e56002e4882499Daniel Dunbar 11311eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump if (Arg *A = Args.getLastArg(options::OPT_traditional, 1132ceb5c5b7f67a30fae305d1d19b478b623e4fbcedEli Friedman options::OPT_traditional_cpp)) 1133ceb5c5b7f67a30fae305d1d19b478b623e4fbcedEli Friedman D.Diag(clang::diag::err_drv_clang_unsupported) << A->getAsString(Args); 1134ceb5c5b7f67a30fae305d1d19b478b623e4fbcedEli Friedman 11351d46033f760ba5fd266ce59fe391fac473f04f52Daniel Dunbar Args.AddLastArg(CmdArgs, options::OPT_dM); 1136d82df3ad430397d7f9ef511e7c5157f997c41f53Chris Lattner Args.AddLastArg(CmdArgs, options::OPT_dD); 11371d46033f760ba5fd266ce59fe391fac473f04f52Daniel Dunbar 11381d46033f760ba5fd266ce59fe391fac473f04f52Daniel Dunbar Args.AddAllArgValues(CmdArgs, options::OPT_Xclang); 1139e5280286573d4fe1220cdd66e147b572a05536a8Daniel Dunbar Args.AddAllArgValues(CmdArgs, options::OPT_mllvm); 11401d46033f760ba5fd266ce59fe391fac473f04f52Daniel Dunbar 1141cd8e4c44dd068956e9181381be3ee2d49a0fac52Daniel Dunbar if (Output.getType() == types::TY_Dependencies) { 1142cd8e4c44dd068956e9181381be3ee2d49a0fac52Daniel Dunbar // Handled with other dependency code. 1143a5a7bd0de7b6b80212095195a055a4a43f21d4b2Daniel Dunbar } else if (Output.isPipe()) { 1144b488c1dac8e53206f07103d794a62a3f5012c0f4Daniel Dunbar CmdArgs.push_back("-o"); 1145b488c1dac8e53206f07103d794a62a3f5012c0f4Daniel Dunbar CmdArgs.push_back("-"); 1146115a79277edababaf1b26e3654044ae983197679Daniel Dunbar } else if (Output.isFilename()) { 1147b488c1dac8e53206f07103d794a62a3f5012c0f4Daniel Dunbar CmdArgs.push_back("-o"); 1148115a79277edababaf1b26e3654044ae983197679Daniel Dunbar CmdArgs.push_back(Output.getFilename()); 1149115a79277edababaf1b26e3654044ae983197679Daniel Dunbar } else { 1150115a79277edababaf1b26e3654044ae983197679Daniel Dunbar assert(Output.isNothing() && "Invalid output."); 1151b488c1dac8e53206f07103d794a62a3f5012c0f4Daniel Dunbar } 1152b488c1dac8e53206f07103d794a62a3f5012c0f4Daniel Dunbar 11531d46033f760ba5fd266ce59fe391fac473f04f52Daniel Dunbar for (InputInfoList::const_iterator 11541d46033f760ba5fd266ce59fe391fac473f04f52Daniel Dunbar it = Inputs.begin(), ie = Inputs.end(); it != ie; ++it) { 11551d46033f760ba5fd266ce59fe391fac473f04f52Daniel Dunbar const InputInfo &II = *it; 11561d46033f760ba5fd266ce59fe391fac473f04f52Daniel Dunbar CmdArgs.push_back("-x"); 11571d46033f760ba5fd266ce59fe391fac473f04f52Daniel Dunbar CmdArgs.push_back(types::getTypeName(II.getType())); 11581d46033f760ba5fd266ce59fe391fac473f04f52Daniel Dunbar if (II.isPipe()) 11591d46033f760ba5fd266ce59fe391fac473f04f52Daniel Dunbar CmdArgs.push_back("-"); 1160115a79277edababaf1b26e3654044ae983197679Daniel Dunbar else if (II.isFilename()) 1161115a79277edababaf1b26e3654044ae983197679Daniel Dunbar CmdArgs.push_back(II.getFilename()); 11621d46033f760ba5fd266ce59fe391fac473f04f52Daniel Dunbar else 1163115a79277edababaf1b26e3654044ae983197679Daniel Dunbar II.getInputArg().renderAsInput(Args, CmdArgs); 11641d46033f760ba5fd266ce59fe391fac473f04f52Daniel Dunbar } 1165c21c485b4fb58ef5d55cf3e523263dd824a2ace4Daniel Dunbar 1166e6113de52df132b89c3a5a6141f17d37e83322aeChris Lattner Args.AddAllArgs(CmdArgs, options::OPT_undef); 1167e6113de52df132b89c3a5a6141f17d37e83322aeChris Lattner 1168c21c485b4fb58ef5d55cf3e523263dd824a2ace4Daniel Dunbar const char *Exec = 11698ff5b28d6efcffe2251e77634c7edf83a4763344Daniel Dunbar Args.MakeArgString(getToolChain().GetProgramPath(C, "clang")); 1170f2d8b9f967a1ab53ee9fdbcc3ac0a4ee0a83a26eDaniel Dunbar 1171f2d8b9f967a1ab53ee9fdbcc3ac0a4ee0a83a26eDaniel Dunbar // Optionally embed the -cc1 level arguments into the debug info, for build 1172f2d8b9f967a1ab53ee9fdbcc3ac0a4ee0a83a26eDaniel Dunbar // analysis. 1173f2d8b9f967a1ab53ee9fdbcc3ac0a4ee0a83a26eDaniel Dunbar if (getToolChain().UseDwarfDebugFlags()) { 1174f2d8b9f967a1ab53ee9fdbcc3ac0a4ee0a83a26eDaniel Dunbar llvm::SmallString<256> Flags; 1175f2d8b9f967a1ab53ee9fdbcc3ac0a4ee0a83a26eDaniel Dunbar Flags += Exec; 1176f2d8b9f967a1ab53ee9fdbcc3ac0a4ee0a83a26eDaniel Dunbar for (unsigned i = 0, e = CmdArgs.size(); i != e; ++i) { 1177f2d8b9f967a1ab53ee9fdbcc3ac0a4ee0a83a26eDaniel Dunbar Flags += " "; 1178f2d8b9f967a1ab53ee9fdbcc3ac0a4ee0a83a26eDaniel Dunbar Flags += CmdArgs[i]; 1179f2d8b9f967a1ab53ee9fdbcc3ac0a4ee0a83a26eDaniel Dunbar } 1180f2d8b9f967a1ab53ee9fdbcc3ac0a4ee0a83a26eDaniel Dunbar CmdArgs.push_back("-dwarf-debug-flags"); 1181f2d8b9f967a1ab53ee9fdbcc3ac0a4ee0a83a26eDaniel Dunbar CmdArgs.push_back(Args.MakeArgString(Flags.str())); 1182f2d8b9f967a1ab53ee9fdbcc3ac0a4ee0a83a26eDaniel Dunbar } 1183f2d8b9f967a1ab53ee9fdbcc3ac0a4ee0a83a26eDaniel Dunbar 1184daab7b1016f0a82fefa4f7be6e63c57c06b19ffcDaniel Dunbar Dest.addCommand(new Command(JA, *this, Exec, CmdArgs)); 1185a880db0b0fc028abf754c290d921d809eec0518aDaniel Dunbar 11865c1aaafbd6dd25a99ca1960e1c3c98aeefe9d728Daniel Dunbar // Explicitly warn that these options are unsupported, even though 11875c1aaafbd6dd25a99ca1960e1c3c98aeefe9d728Daniel Dunbar // we are allowing compilation to continue. 1188cdd9686b890ebdc10039ae256ef4c9dfb5ebacb7Daniel Dunbar for (arg_iterator it = Args.filtered_begin(options::OPT_pg), 1189cdd9686b890ebdc10039ae256ef4c9dfb5ebacb7Daniel Dunbar ie = Args.filtered_end(); it != ie; ++it) { 1190cdd9686b890ebdc10039ae256ef4c9dfb5ebacb7Daniel Dunbar it->claim(); 1191cdd9686b890ebdc10039ae256ef4c9dfb5ebacb7Daniel Dunbar D.Diag(clang::diag::warn_drv_clang_unsupported) << it->getAsString(Args); 11925c1aaafbd6dd25a99ca1960e1c3c98aeefe9d728Daniel Dunbar } 11935c1aaafbd6dd25a99ca1960e1c3c98aeefe9d728Daniel Dunbar 119468fb469aeb19144403e703b825854d08353c8eeaDaniel Dunbar // Claim some arguments which clang supports automatically. 119568fb469aeb19144403e703b825854d08353c8eeaDaniel Dunbar 119668fb469aeb19144403e703b825854d08353c8eeaDaniel Dunbar // -fpch-preprocess is used with gcc to add a special marker in the 119768fb469aeb19144403e703b825854d08353c8eeaDaniel Dunbar // -output to include the PCH file. Clang's PTH solution is 119868fb469aeb19144403e703b825854d08353c8eeaDaniel Dunbar // -completely transparent, so we do not need to deal with it at 119968fb469aeb19144403e703b825854d08353c8eeaDaniel Dunbar // -all. 120068fb469aeb19144403e703b825854d08353c8eeaDaniel Dunbar Args.ClaimAllArgs(options::OPT_fpch_preprocess); 1201c21c485b4fb58ef5d55cf3e523263dd824a2ace4Daniel Dunbar 1202a880db0b0fc028abf754c290d921d809eec0518aDaniel Dunbar // Claim some arguments which clang doesn't support, but we don't 1203a880db0b0fc028abf754c290d921d809eec0518aDaniel Dunbar // care to warn the user about. 1204cdd9686b890ebdc10039ae256ef4c9dfb5ebacb7Daniel Dunbar Args.ClaimAllArgs(options::OPT_clang_ignored_f_Group); 1205cdd9686b890ebdc10039ae256ef4c9dfb5ebacb7Daniel Dunbar Args.ClaimAllArgs(options::OPT_clang_ignored_m_Group); 120647ac7d27c44bd64a7d0fc03d4babc196cf2b8230Daniel Dunbar} 120747ac7d27c44bd64a7d0fc03d4babc196cf2b8230Daniel Dunbar 1208b488c1dac8e53206f07103d794a62a3f5012c0f4Daniel Dunbarvoid gcc::Common::ConstructJob(Compilation &C, const JobAction &JA, 1209b488c1dac8e53206f07103d794a62a3f5012c0f4Daniel Dunbar Job &Dest, 1210b488c1dac8e53206f07103d794a62a3f5012c0f4Daniel Dunbar const InputInfo &Output, 1211b488c1dac8e53206f07103d794a62a3f5012c0f4Daniel Dunbar const InputInfoList &Inputs, 12121d46033f760ba5fd266ce59fe391fac473f04f52Daniel Dunbar const ArgList &Args, 1213b488c1dac8e53206f07103d794a62a3f5012c0f4Daniel Dunbar const char *LinkingOutput) const { 1214ee788e70fcd0adf76103b17c78ac658d4ea30c9bDaniel Dunbar const Driver &D = getToolChain().getDriver(); 1215b488c1dac8e53206f07103d794a62a3f5012c0f4Daniel Dunbar ArgStringList CmdArgs; 1216b488c1dac8e53206f07103d794a62a3f5012c0f4Daniel Dunbar 1217c21c485b4fb58ef5d55cf3e523263dd824a2ace4Daniel Dunbar for (ArgList::const_iterator 12181d46033f760ba5fd266ce59fe391fac473f04f52Daniel Dunbar it = Args.begin(), ie = Args.end(); it != ie; ++it) { 1219b488c1dac8e53206f07103d794a62a3f5012c0f4Daniel Dunbar Arg *A = *it; 12207587719c40ebf02bf11e5e66c30bd20e98edebc2Daniel Dunbar if (A->getOption().hasForwardToGCC()) { 12217587719c40ebf02bf11e5e66c30bd20e98edebc2Daniel Dunbar // It is unfortunate that we have to claim here, as this means 12227587719c40ebf02bf11e5e66c30bd20e98edebc2Daniel Dunbar // we will basically never report anything interesting for 12236ecc7a993f939c5255c36c7c0d965fb9c1543f2aDaniel Dunbar // platforms using a generic gcc, even if we are just using gcc 12246ecc7a993f939c5255c36c7c0d965fb9c1543f2aDaniel Dunbar // to get to the assembler. 12257587719c40ebf02bf11e5e66c30bd20e98edebc2Daniel Dunbar A->claim(); 12261d46033f760ba5fd266ce59fe391fac473f04f52Daniel Dunbar A->render(Args, CmdArgs); 12277587719c40ebf02bf11e5e66c30bd20e98edebc2Daniel Dunbar } 1228b488c1dac8e53206f07103d794a62a3f5012c0f4Daniel Dunbar } 1229c21c485b4fb58ef5d55cf3e523263dd824a2ace4Daniel Dunbar 123082b51cce8cea6b6bb6175c406c2ab425c91d9dc8Daniel Dunbar RenderExtraToolArgs(JA, CmdArgs); 1231b488c1dac8e53206f07103d794a62a3f5012c0f4Daniel Dunbar 1232b488c1dac8e53206f07103d794a62a3f5012c0f4Daniel Dunbar // If using a driver driver, force the arch. 12337cfe31a713d8fcfc2a1328e8fbd8efdeb0aec51bDaniel Dunbar const std::string &Arch = getToolChain().getArchName(); 12341bda434673d3c51a2ba6b412f100ccfcf3e7083fDaniel Dunbar if (getToolChain().getTriple().getOS() == llvm::Triple::Darwin) { 1235b488c1dac8e53206f07103d794a62a3f5012c0f4Daniel Dunbar CmdArgs.push_back("-arch"); 1236bf54a06f9b771c2a2730cc63eb89bce0522515b5Daniel Dunbar 1237bf54a06f9b771c2a2730cc63eb89bce0522515b5Daniel Dunbar // FIXME: Remove these special cases. 12387cfe31a713d8fcfc2a1328e8fbd8efdeb0aec51bDaniel Dunbar if (Arch == "powerpc") 12397cfe31a713d8fcfc2a1328e8fbd8efdeb0aec51bDaniel Dunbar CmdArgs.push_back("ppc"); 12407cfe31a713d8fcfc2a1328e8fbd8efdeb0aec51bDaniel Dunbar else if (Arch == "powerpc64") 12417cfe31a713d8fcfc2a1328e8fbd8efdeb0aec51bDaniel Dunbar CmdArgs.push_back("ppc64"); 12427cfe31a713d8fcfc2a1328e8fbd8efdeb0aec51bDaniel Dunbar else 1243881376467c46c5c6cc16fa6790271c2c22e1d4f1Daniel Dunbar CmdArgs.push_back(Args.MakeArgString(Arch)); 1244b488c1dac8e53206f07103d794a62a3f5012c0f4Daniel Dunbar } 1245b488c1dac8e53206f07103d794a62a3f5012c0f4Daniel Dunbar 12466ecc7a993f939c5255c36c7c0d965fb9c1543f2aDaniel Dunbar // Try to force gcc to match the tool chain we want, if we recognize 12476ecc7a993f939c5255c36c7c0d965fb9c1543f2aDaniel Dunbar // the arch. 12487cfe31a713d8fcfc2a1328e8fbd8efdeb0aec51bDaniel Dunbar // 12497cfe31a713d8fcfc2a1328e8fbd8efdeb0aec51bDaniel Dunbar // FIXME: The triple class should directly provide the information we want 12507cfe31a713d8fcfc2a1328e8fbd8efdeb0aec51bDaniel Dunbar // here. 12517cfe31a713d8fcfc2a1328e8fbd8efdeb0aec51bDaniel Dunbar if (Arch == "i386" || Arch == "powerpc") 12526ecc7a993f939c5255c36c7c0d965fb9c1543f2aDaniel Dunbar CmdArgs.push_back("-m32"); 12537cfe31a713d8fcfc2a1328e8fbd8efdeb0aec51bDaniel Dunbar else if (Arch == "x86_64" || Arch == "powerpc64") 12546ecc7a993f939c5255c36c7c0d965fb9c1543f2aDaniel Dunbar CmdArgs.push_back("-m64"); 12556ecc7a993f939c5255c36c7c0d965fb9c1543f2aDaniel Dunbar 1256b488c1dac8e53206f07103d794a62a3f5012c0f4Daniel Dunbar if (Output.isPipe()) { 1257b488c1dac8e53206f07103d794a62a3f5012c0f4Daniel Dunbar CmdArgs.push_back("-o"); 1258b488c1dac8e53206f07103d794a62a3f5012c0f4Daniel Dunbar CmdArgs.push_back("-"); 1259115a79277edababaf1b26e3654044ae983197679Daniel Dunbar } else if (Output.isFilename()) { 1260b488c1dac8e53206f07103d794a62a3f5012c0f4Daniel Dunbar CmdArgs.push_back("-o"); 1261115a79277edababaf1b26e3654044ae983197679Daniel Dunbar CmdArgs.push_back(Output.getFilename()); 1262115a79277edababaf1b26e3654044ae983197679Daniel Dunbar } else { 1263115a79277edababaf1b26e3654044ae983197679Daniel Dunbar assert(Output.isNothing() && "Unexpected output"); 1264b488c1dac8e53206f07103d794a62a3f5012c0f4Daniel Dunbar CmdArgs.push_back("-fsyntax-only"); 1265115a79277edababaf1b26e3654044ae983197679Daniel Dunbar } 1266b488c1dac8e53206f07103d794a62a3f5012c0f4Daniel Dunbar 1267b488c1dac8e53206f07103d794a62a3f5012c0f4Daniel Dunbar 1268b488c1dac8e53206f07103d794a62a3f5012c0f4Daniel Dunbar // Only pass -x if gcc will understand it; otherwise hope gcc 1269b488c1dac8e53206f07103d794a62a3f5012c0f4Daniel Dunbar // understands the suffix correctly. The main use case this would go 1270b488c1dac8e53206f07103d794a62a3f5012c0f4Daniel Dunbar // wrong in is for linker inputs if they happened to have an odd 1271b488c1dac8e53206f07103d794a62a3f5012c0f4Daniel Dunbar // suffix; really the only way to get this to happen is a command 1272b488c1dac8e53206f07103d794a62a3f5012c0f4Daniel Dunbar // like '-x foobar a.c' which will treat a.c like a linker input. 1273b488c1dac8e53206f07103d794a62a3f5012c0f4Daniel Dunbar // 1274b488c1dac8e53206f07103d794a62a3f5012c0f4Daniel Dunbar // FIXME: For the linker case specifically, can we safely convert 1275b488c1dac8e53206f07103d794a62a3f5012c0f4Daniel Dunbar // inputs into '-Wl,' options? 1276b488c1dac8e53206f07103d794a62a3f5012c0f4Daniel Dunbar for (InputInfoList::const_iterator 1277b488c1dac8e53206f07103d794a62a3f5012c0f4Daniel Dunbar it = Inputs.begin(), ie = Inputs.end(); it != ie; ++it) { 1278b488c1dac8e53206f07103d794a62a3f5012c0f4Daniel Dunbar const InputInfo &II = *it; 1279a8304f67291b0182fb64f3afc621615288dd1d31Daniel Dunbar 12805915fbf310e171c4cd3c2af05e9de360c0fa988aDaniel Dunbar // Don't try to pass LLVM or AST inputs to a generic gcc. 1281a8304f67291b0182fb64f3afc621615288dd1d31Daniel Dunbar if (II.getType() == types::TY_LLVMBC) 1282a8304f67291b0182fb64f3afc621615288dd1d31Daniel Dunbar D.Diag(clang::diag::err_drv_no_linker_llvm_support) 1283881376467c46c5c6cc16fa6790271c2c22e1d4f1Daniel Dunbar << getToolChain().getTripleString(); 12845915fbf310e171c4cd3c2af05e9de360c0fa988aDaniel Dunbar else if (II.getType() == types::TY_AST) 12855915fbf310e171c4cd3c2af05e9de360c0fa988aDaniel Dunbar D.Diag(clang::diag::err_drv_no_ast_support) 1286881376467c46c5c6cc16fa6790271c2c22e1d4f1Daniel Dunbar << getToolChain().getTripleString(); 1287a8304f67291b0182fb64f3afc621615288dd1d31Daniel Dunbar 1288b488c1dac8e53206f07103d794a62a3f5012c0f4Daniel Dunbar if (types::canTypeBeUserSpecified(II.getType())) { 1289b488c1dac8e53206f07103d794a62a3f5012c0f4Daniel Dunbar CmdArgs.push_back("-x"); 1290b488c1dac8e53206f07103d794a62a3f5012c0f4Daniel Dunbar CmdArgs.push_back(types::getTypeName(II.getType())); 1291b488c1dac8e53206f07103d794a62a3f5012c0f4Daniel Dunbar } 1292b488c1dac8e53206f07103d794a62a3f5012c0f4Daniel Dunbar 1293b488c1dac8e53206f07103d794a62a3f5012c0f4Daniel Dunbar if (II.isPipe()) 1294b488c1dac8e53206f07103d794a62a3f5012c0f4Daniel Dunbar CmdArgs.push_back("-"); 1295115a79277edababaf1b26e3654044ae983197679Daniel Dunbar else if (II.isFilename()) 1296115a79277edababaf1b26e3654044ae983197679Daniel Dunbar CmdArgs.push_back(II.getFilename()); 1297b488c1dac8e53206f07103d794a62a3f5012c0f4Daniel Dunbar else 1298115a79277edababaf1b26e3654044ae983197679Daniel Dunbar // Don't render as input, we need gcc to do the translations. 1299115a79277edababaf1b26e3654044ae983197679Daniel Dunbar II.getInputArg().render(Args, CmdArgs); 1300b488c1dac8e53206f07103d794a62a3f5012c0f4Daniel Dunbar } 1301b488c1dac8e53206f07103d794a62a3f5012c0f4Daniel Dunbar 1302ee788e70fcd0adf76103b17c78ac658d4ea30c9bDaniel Dunbar const char *GCCName = getToolChain().getDriver().CCCGenericGCCName.c_str(); 1303c21c485b4fb58ef5d55cf3e523263dd824a2ace4Daniel Dunbar const char *Exec = 13045ed34f4c58b6ad4e21038d713c1fae31a6146ff5Daniel Dunbar Args.MakeArgString(getToolChain().GetProgramPath(C, GCCName)); 1305daab7b1016f0a82fefa4f7be6e63c57c06b19ffcDaniel Dunbar Dest.addCommand(new Command(JA, *this, Exec, CmdArgs)); 130647ac7d27c44bd64a7d0fc03d4babc196cf2b8230Daniel Dunbar} 130747ac7d27c44bd64a7d0fc03d4babc196cf2b8230Daniel Dunbar 130882b51cce8cea6b6bb6175c406c2ab425c91d9dc8Daniel Dunbarvoid gcc::Preprocess::RenderExtraToolArgs(const JobAction &JA, 130982b51cce8cea6b6bb6175c406c2ab425c91d9dc8Daniel Dunbar ArgStringList &CmdArgs) const { 1310b488c1dac8e53206f07103d794a62a3f5012c0f4Daniel Dunbar CmdArgs.push_back("-E"); 131147ac7d27c44bd64a7d0fc03d4babc196cf2b8230Daniel Dunbar} 131247ac7d27c44bd64a7d0fc03d4babc196cf2b8230Daniel Dunbar 131382b51cce8cea6b6bb6175c406c2ab425c91d9dc8Daniel Dunbarvoid gcc::Precompile::RenderExtraToolArgs(const JobAction &JA, 131482b51cce8cea6b6bb6175c406c2ab425c91d9dc8Daniel Dunbar ArgStringList &CmdArgs) const { 1315b488c1dac8e53206f07103d794a62a3f5012c0f4Daniel Dunbar // The type is good enough. 131647ac7d27c44bd64a7d0fc03d4babc196cf2b8230Daniel Dunbar} 131747ac7d27c44bd64a7d0fc03d4babc196cf2b8230Daniel Dunbar 131882b51cce8cea6b6bb6175c406c2ab425c91d9dc8Daniel Dunbarvoid gcc::Compile::RenderExtraToolArgs(const JobAction &JA, 131982b51cce8cea6b6bb6175c406c2ab425c91d9dc8Daniel Dunbar ArgStringList &CmdArgs) const { 132082b51cce8cea6b6bb6175c406c2ab425c91d9dc8Daniel Dunbar // If -flto, etc. are present then make sure not to force assembly output. 132182b51cce8cea6b6bb6175c406c2ab425c91d9dc8Daniel Dunbar if (JA.getType() == types::TY_LLVMBC) 132282b51cce8cea6b6bb6175c406c2ab425c91d9dc8Daniel Dunbar CmdArgs.push_back("-c"); 132382b51cce8cea6b6bb6175c406c2ab425c91d9dc8Daniel Dunbar else 132482b51cce8cea6b6bb6175c406c2ab425c91d9dc8Daniel Dunbar CmdArgs.push_back("-S"); 132547ac7d27c44bd64a7d0fc03d4babc196cf2b8230Daniel Dunbar} 132647ac7d27c44bd64a7d0fc03d4babc196cf2b8230Daniel Dunbar 132782b51cce8cea6b6bb6175c406c2ab425c91d9dc8Daniel Dunbarvoid gcc::Assemble::RenderExtraToolArgs(const JobAction &JA, 132882b51cce8cea6b6bb6175c406c2ab425c91d9dc8Daniel Dunbar ArgStringList &CmdArgs) const { 1329b488c1dac8e53206f07103d794a62a3f5012c0f4Daniel Dunbar CmdArgs.push_back("-c"); 1330b488c1dac8e53206f07103d794a62a3f5012c0f4Daniel Dunbar} 133147ac7d27c44bd64a7d0fc03d4babc196cf2b8230Daniel Dunbar 133282b51cce8cea6b6bb6175c406c2ab425c91d9dc8Daniel Dunbarvoid gcc::Link::RenderExtraToolArgs(const JobAction &JA, 133382b51cce8cea6b6bb6175c406c2ab425c91d9dc8Daniel Dunbar ArgStringList &CmdArgs) const { 1334b488c1dac8e53206f07103d794a62a3f5012c0f4Daniel Dunbar // The types are (hopefully) good enough. 133547ac7d27c44bd64a7d0fc03d4babc196cf2b8230Daniel Dunbar} 1336b488c1dac8e53206f07103d794a62a3f5012c0f4Daniel Dunbar 133740f1265ebd42ece3e7f7917319b56012e8e2bce2Daniel Dunbarconst char *darwin::CC1::getCC1Name(types::ID Type) const { 133840f1265ebd42ece3e7f7917319b56012e8e2bce2Daniel Dunbar switch (Type) { 133940f1265ebd42ece3e7f7917319b56012e8e2bce2Daniel Dunbar default: 134040f1265ebd42ece3e7f7917319b56012e8e2bce2Daniel Dunbar assert(0 && "Unexpected type for Darwin CC1 tool."); 134140f1265ebd42ece3e7f7917319b56012e8e2bce2Daniel Dunbar case types::TY_Asm: 134240f1265ebd42ece3e7f7917319b56012e8e2bce2Daniel Dunbar case types::TY_C: case types::TY_CHeader: 134340f1265ebd42ece3e7f7917319b56012e8e2bce2Daniel Dunbar case types::TY_PP_C: case types::TY_PP_CHeader: 134440f1265ebd42ece3e7f7917319b56012e8e2bce2Daniel Dunbar return "cc1"; 134540f1265ebd42ece3e7f7917319b56012e8e2bce2Daniel Dunbar case types::TY_ObjC: case types::TY_ObjCHeader: 134640f1265ebd42ece3e7f7917319b56012e8e2bce2Daniel Dunbar case types::TY_PP_ObjC: case types::TY_PP_ObjCHeader: 134740f1265ebd42ece3e7f7917319b56012e8e2bce2Daniel Dunbar return "cc1obj"; 134840f1265ebd42ece3e7f7917319b56012e8e2bce2Daniel Dunbar case types::TY_CXX: case types::TY_CXXHeader: 134940f1265ebd42ece3e7f7917319b56012e8e2bce2Daniel Dunbar case types::TY_PP_CXX: case types::TY_PP_CXXHeader: 135040f1265ebd42ece3e7f7917319b56012e8e2bce2Daniel Dunbar return "cc1plus"; 135140f1265ebd42ece3e7f7917319b56012e8e2bce2Daniel Dunbar case types::TY_ObjCXX: case types::TY_ObjCXXHeader: 135240f1265ebd42ece3e7f7917319b56012e8e2bce2Daniel Dunbar case types::TY_PP_ObjCXX: case types::TY_PP_ObjCXXHeader: 135340f1265ebd42ece3e7f7917319b56012e8e2bce2Daniel Dunbar return "cc1objplus"; 135440f1265ebd42ece3e7f7917319b56012e8e2bce2Daniel Dunbar } 135540f1265ebd42ece3e7f7917319b56012e8e2bce2Daniel Dunbar} 135640f1265ebd42ece3e7f7917319b56012e8e2bce2Daniel Dunbar 1357c21c485b4fb58ef5d55cf3e523263dd824a2ace4Daniel Dunbarconst char *darwin::CC1::getBaseInputName(const ArgList &Args, 1358a5a7bd0de7b6b80212095195a055a4a43f21d4b2Daniel Dunbar const InputInfoList &Inputs) { 1359a3ec60e0cf2a1916f479288998d31bd980b1a306Daniel Dunbar llvm::sys::Path P(Inputs[0].getBaseInput()); 1360881376467c46c5c6cc16fa6790271c2c22e1d4f1Daniel Dunbar return Args.MakeArgString(P.getLast()); 1361a3ec60e0cf2a1916f479288998d31bd980b1a306Daniel Dunbar} 1362a3ec60e0cf2a1916f479288998d31bd980b1a306Daniel Dunbar 1363c21c485b4fb58ef5d55cf3e523263dd824a2ace4Daniel Dunbarconst char *darwin::CC1::getBaseInputStem(const ArgList &Args, 1364a5a7bd0de7b6b80212095195a055a4a43f21d4b2Daniel Dunbar const InputInfoList &Inputs) { 1365a3ec60e0cf2a1916f479288998d31bd980b1a306Daniel Dunbar const char *Str = getBaseInputName(Args, Inputs); 1366a3ec60e0cf2a1916f479288998d31bd980b1a306Daniel Dunbar 1367a3ec60e0cf2a1916f479288998d31bd980b1a306Daniel Dunbar if (const char *End = strchr(Str, '.')) 1368881376467c46c5c6cc16fa6790271c2c22e1d4f1Daniel Dunbar return Args.MakeArgString(std::string(Str, End)); 1369a3ec60e0cf2a1916f479288998d31bd980b1a306Daniel Dunbar 1370a3ec60e0cf2a1916f479288998d31bd980b1a306Daniel Dunbar return Str; 1371a3ec60e0cf2a1916f479288998d31bd980b1a306Daniel Dunbar} 1372a3ec60e0cf2a1916f479288998d31bd980b1a306Daniel Dunbar 1373a3ec60e0cf2a1916f479288998d31bd980b1a306Daniel Dunbarconst char * 1374c21c485b4fb58ef5d55cf3e523263dd824a2ace4Daniel Dunbardarwin::CC1::getDependencyFileName(const ArgList &Args, 1375a5a7bd0de7b6b80212095195a055a4a43f21d4b2Daniel Dunbar const InputInfoList &Inputs) { 1376a3ec60e0cf2a1916f479288998d31bd980b1a306Daniel Dunbar // FIXME: Think about this more. 1377a3ec60e0cf2a1916f479288998d31bd980b1a306Daniel Dunbar std::string Res; 1378a3ec60e0cf2a1916f479288998d31bd980b1a306Daniel Dunbar 1379a3ec60e0cf2a1916f479288998d31bd980b1a306Daniel Dunbar if (Arg *OutputOpt = Args.getLastArg(options::OPT_o)) { 1380a3ec60e0cf2a1916f479288998d31bd980b1a306Daniel Dunbar std::string Str(OutputOpt->getValue(Args)); 1381c21c485b4fb58ef5d55cf3e523263dd824a2ace4Daniel Dunbar 1382a3ec60e0cf2a1916f479288998d31bd980b1a306Daniel Dunbar Res = Str.substr(0, Str.rfind('.')); 1383a3ec60e0cf2a1916f479288998d31bd980b1a306Daniel Dunbar } else 1384a5a7bd0de7b6b80212095195a055a4a43f21d4b2Daniel Dunbar Res = darwin::CC1::getBaseInputStem(Args, Inputs); 1385a3ec60e0cf2a1916f479288998d31bd980b1a306Daniel Dunbar 1386881376467c46c5c6cc16fa6790271c2c22e1d4f1Daniel Dunbar return Args.MakeArgString(Res + ".d"); 1387a3ec60e0cf2a1916f479288998d31bd980b1a306Daniel Dunbar} 1388a3ec60e0cf2a1916f479288998d31bd980b1a306Daniel Dunbar 1389c21c485b4fb58ef5d55cf3e523263dd824a2ace4Daniel Dunbarvoid darwin::CC1::AddCC1Args(const ArgList &Args, 1390a3ec60e0cf2a1916f479288998d31bd980b1a306Daniel Dunbar ArgStringList &CmdArgs) const { 1391ee788e70fcd0adf76103b17c78ac658d4ea30c9bDaniel Dunbar const Driver &D = getToolChain().getDriver(); 1392e2fd66418eca3d70cf6b62087d745d0c5181db69Daniel Dunbar 1393e2fd66418eca3d70cf6b62087d745d0c5181db69Daniel Dunbar CheckCodeGenerationOptions(D, Args); 1394e2fd66418eca3d70cf6b62087d745d0c5181db69Daniel Dunbar 1395a3ec60e0cf2a1916f479288998d31bd980b1a306Daniel Dunbar // Derived from cc1 spec. 1396a3ec60e0cf2a1916f479288998d31bd980b1a306Daniel Dunbar if (!Args.hasArg(options::OPT_mkernel) && !Args.hasArg(options::OPT_static) && 1397a3ec60e0cf2a1916f479288998d31bd980b1a306Daniel Dunbar !Args.hasArg(options::OPT_mdynamic_no_pic)) 1398a3ec60e0cf2a1916f479288998d31bd980b1a306Daniel Dunbar CmdArgs.push_back("-fPIC"); 1399a3ec60e0cf2a1916f479288998d31bd980b1a306Daniel Dunbar 14002ba91575905a54f712a7f64304e56002e4882499Daniel Dunbar if (getToolChain().getTriple().getArch() == llvm::Triple::arm || 14012ba91575905a54f712a7f64304e56002e4882499Daniel Dunbar getToolChain().getTriple().getArch() == llvm::Triple::thumb) { 14022ba91575905a54f712a7f64304e56002e4882499Daniel Dunbar if (!Args.hasArg(options::OPT_fbuiltin_strcat)) 14032ba91575905a54f712a7f64304e56002e4882499Daniel Dunbar CmdArgs.push_back("-fno-builtin-strcat"); 14042ba91575905a54f712a7f64304e56002e4882499Daniel Dunbar if (!Args.hasArg(options::OPT_fbuiltin_strcpy)) 14052ba91575905a54f712a7f64304e56002e4882499Daniel Dunbar CmdArgs.push_back("-fno-builtin-strcpy"); 14062ba91575905a54f712a7f64304e56002e4882499Daniel Dunbar } 14072ba91575905a54f712a7f64304e56002e4882499Daniel Dunbar 1408a3ec60e0cf2a1916f479288998d31bd980b1a306Daniel Dunbar // gcc has some code here to deal with when no -mmacosx-version-min 1409a3ec60e0cf2a1916f479288998d31bd980b1a306Daniel Dunbar // and no -miphoneos-version-min is present, but this never happens 1410a3ec60e0cf2a1916f479288998d31bd980b1a306Daniel Dunbar // due to tool chain specific argument translation. 1411a3ec60e0cf2a1916f479288998d31bd980b1a306Daniel Dunbar 1412a3ec60e0cf2a1916f479288998d31bd980b1a306Daniel Dunbar if (Args.hasArg(options::OPT_g_Flag) && 1413a3ec60e0cf2a1916f479288998d31bd980b1a306Daniel Dunbar !Args.hasArg(options::OPT_fno_eliminate_unused_debug_symbols)) 1414a3ec60e0cf2a1916f479288998d31bd980b1a306Daniel Dunbar CmdArgs.push_back("-feliminate-unused-debug-symbols"); 1415a3ec60e0cf2a1916f479288998d31bd980b1a306Daniel Dunbar} 1416a3ec60e0cf2a1916f479288998d31bd980b1a306Daniel Dunbar 1417a3ec60e0cf2a1916f479288998d31bd980b1a306Daniel Dunbarvoid darwin::CC1::AddCC1OptionsArgs(const ArgList &Args, ArgStringList &CmdArgs, 1418a3ec60e0cf2a1916f479288998d31bd980b1a306Daniel Dunbar const InputInfoList &Inputs, 1419a3ec60e0cf2a1916f479288998d31bd980b1a306Daniel Dunbar const ArgStringList &OutputArgs) const { 1420ee788e70fcd0adf76103b17c78ac658d4ea30c9bDaniel Dunbar const Driver &D = getToolChain().getDriver(); 1421a3ec60e0cf2a1916f479288998d31bd980b1a306Daniel Dunbar 1422a3ec60e0cf2a1916f479288998d31bd980b1a306Daniel Dunbar // Derived from cc1_options spec. 1423a3ec60e0cf2a1916f479288998d31bd980b1a306Daniel Dunbar if (Args.hasArg(options::OPT_fast) || 1424a3ec60e0cf2a1916f479288998d31bd980b1a306Daniel Dunbar Args.hasArg(options::OPT_fastf) || 1425a3ec60e0cf2a1916f479288998d31bd980b1a306Daniel Dunbar Args.hasArg(options::OPT_fastcp)) 1426a3ec60e0cf2a1916f479288998d31bd980b1a306Daniel Dunbar CmdArgs.push_back("-O3"); 1427c21c485b4fb58ef5d55cf3e523263dd824a2ace4Daniel Dunbar 1428a3ec60e0cf2a1916f479288998d31bd980b1a306Daniel Dunbar if (Arg *A = Args.getLastArg(options::OPT_pg)) 1429a3ec60e0cf2a1916f479288998d31bd980b1a306Daniel Dunbar if (Args.hasArg(options::OPT_fomit_frame_pointer)) 1430a3ec60e0cf2a1916f479288998d31bd980b1a306Daniel Dunbar D.Diag(clang::diag::err_drv_argument_not_allowed_with) 1431a3ec60e0cf2a1916f479288998d31bd980b1a306Daniel Dunbar << A->getAsString(Args) << "-fomit-frame-pointer"; 1432a3ec60e0cf2a1916f479288998d31bd980b1a306Daniel Dunbar 1433a3ec60e0cf2a1916f479288998d31bd980b1a306Daniel Dunbar AddCC1Args(Args, CmdArgs); 1434a3ec60e0cf2a1916f479288998d31bd980b1a306Daniel Dunbar 1435a3ec60e0cf2a1916f479288998d31bd980b1a306Daniel Dunbar if (!Args.hasArg(options::OPT_Q)) 1436a3ec60e0cf2a1916f479288998d31bd980b1a306Daniel Dunbar CmdArgs.push_back("-quiet"); 1437a3ec60e0cf2a1916f479288998d31bd980b1a306Daniel Dunbar 1438a3ec60e0cf2a1916f479288998d31bd980b1a306Daniel Dunbar CmdArgs.push_back("-dumpbase"); 1439a5a7bd0de7b6b80212095195a055a4a43f21d4b2Daniel Dunbar CmdArgs.push_back(darwin::CC1::getBaseInputName(Args, Inputs)); 1440a3ec60e0cf2a1916f479288998d31bd980b1a306Daniel Dunbar 1441a3ec60e0cf2a1916f479288998d31bd980b1a306Daniel Dunbar Args.AddAllArgs(CmdArgs, options::OPT_d_Group); 1442a3ec60e0cf2a1916f479288998d31bd980b1a306Daniel Dunbar 1443a3ec60e0cf2a1916f479288998d31bd980b1a306Daniel Dunbar Args.AddAllArgs(CmdArgs, options::OPT_m_Group); 1444a3ec60e0cf2a1916f479288998d31bd980b1a306Daniel Dunbar Args.AddAllArgs(CmdArgs, options::OPT_a_Group); 1445a3ec60e0cf2a1916f479288998d31bd980b1a306Daniel Dunbar 1446a3ec60e0cf2a1916f479288998d31bd980b1a306Daniel Dunbar // FIXME: The goal is to use the user provided -o if that is our 1447a3ec60e0cf2a1916f479288998d31bd980b1a306Daniel Dunbar // final output, otherwise to drive from the original input 1448a3ec60e0cf2a1916f479288998d31bd980b1a306Daniel Dunbar // name. Find a clean way to go about this. 1449a3ec60e0cf2a1916f479288998d31bd980b1a306Daniel Dunbar if ((Args.hasArg(options::OPT_c) || Args.hasArg(options::OPT_S)) && 1450a3ec60e0cf2a1916f479288998d31bd980b1a306Daniel Dunbar Args.hasArg(options::OPT_o)) { 1451a3ec60e0cf2a1916f479288998d31bd980b1a306Daniel Dunbar Arg *OutputOpt = Args.getLastArg(options::OPT_o); 1452a3ec60e0cf2a1916f479288998d31bd980b1a306Daniel Dunbar CmdArgs.push_back("-auxbase-strip"); 1453a3ec60e0cf2a1916f479288998d31bd980b1a306Daniel Dunbar CmdArgs.push_back(OutputOpt->getValue(Args)); 1454a3ec60e0cf2a1916f479288998d31bd980b1a306Daniel Dunbar } else { 1455a3ec60e0cf2a1916f479288998d31bd980b1a306Daniel Dunbar CmdArgs.push_back("-auxbase"); 1456a5a7bd0de7b6b80212095195a055a4a43f21d4b2Daniel Dunbar CmdArgs.push_back(darwin::CC1::getBaseInputStem(Args, Inputs)); 1457a3ec60e0cf2a1916f479288998d31bd980b1a306Daniel Dunbar } 1458a3ec60e0cf2a1916f479288998d31bd980b1a306Daniel Dunbar 1459a3ec60e0cf2a1916f479288998d31bd980b1a306Daniel Dunbar Args.AddAllArgs(CmdArgs, options::OPT_g_Group); 1460a3ec60e0cf2a1916f479288998d31bd980b1a306Daniel Dunbar 1461a3ec60e0cf2a1916f479288998d31bd980b1a306Daniel Dunbar Args.AddAllArgs(CmdArgs, options::OPT_O); 1462a3ec60e0cf2a1916f479288998d31bd980b1a306Daniel Dunbar // FIXME: -Wall is getting some special treatment. Investigate. 1463a3ec60e0cf2a1916f479288998d31bd980b1a306Daniel Dunbar Args.AddAllArgs(CmdArgs, options::OPT_W_Group, options::OPT_pedantic_Group); 1464a3ec60e0cf2a1916f479288998d31bd980b1a306Daniel Dunbar Args.AddLastArg(CmdArgs, options::OPT_w); 1465c21c485b4fb58ef5d55cf3e523263dd824a2ace4Daniel Dunbar Args.AddAllArgs(CmdArgs, options::OPT_std_EQ, options::OPT_ansi, 1466a3ec60e0cf2a1916f479288998d31bd980b1a306Daniel Dunbar options::OPT_trigraphs); 1467a3ff202ee4fb21728e930d5d029ba4925129912cDaniel Dunbar if (!Args.getLastArg(options::OPT_std_EQ, options::OPT_ansi)) { 1468a3ff202ee4fb21728e930d5d029ba4925129912cDaniel Dunbar // Honor -std-default. 1469a3ff202ee4fb21728e930d5d029ba4925129912cDaniel Dunbar Args.AddAllArgsTranslated(CmdArgs, options::OPT_std_default_EQ, 1470a3ff202ee4fb21728e930d5d029ba4925129912cDaniel Dunbar "-std=", /*Joined=*/true); 1471a3ff202ee4fb21728e930d5d029ba4925129912cDaniel Dunbar } 1472a3ff202ee4fb21728e930d5d029ba4925129912cDaniel Dunbar 1473a3ec60e0cf2a1916f479288998d31bd980b1a306Daniel Dunbar if (Args.hasArg(options::OPT_v)) 1474a3ec60e0cf2a1916f479288998d31bd980b1a306Daniel Dunbar CmdArgs.push_back("-version"); 1475a3ec60e0cf2a1916f479288998d31bd980b1a306Daniel Dunbar if (Args.hasArg(options::OPT_pg)) 1476a3ec60e0cf2a1916f479288998d31bd980b1a306Daniel Dunbar CmdArgs.push_back("-p"); 1477a3ec60e0cf2a1916f479288998d31bd980b1a306Daniel Dunbar Args.AddLastArg(CmdArgs, options::OPT_p); 1478c21c485b4fb58ef5d55cf3e523263dd824a2ace4Daniel Dunbar 1479a3ec60e0cf2a1916f479288998d31bd980b1a306Daniel Dunbar // The driver treats -fsyntax-only specially. 14802ba91575905a54f712a7f64304e56002e4882499Daniel Dunbar if (getToolChain().getTriple().getArch() == llvm::Triple::arm || 14812ba91575905a54f712a7f64304e56002e4882499Daniel Dunbar getToolChain().getTriple().getArch() == llvm::Triple::thumb) { 14822ba91575905a54f712a7f64304e56002e4882499Daniel Dunbar // Removes -fbuiltin-str{cat,cpy}; these aren't recognized by cc1 but are 14832ba91575905a54f712a7f64304e56002e4882499Daniel Dunbar // used to inhibit the default -fno-builtin-str{cat,cpy}. 14842ba91575905a54f712a7f64304e56002e4882499Daniel Dunbar // 14852ba91575905a54f712a7f64304e56002e4882499Daniel Dunbar // FIXME: Should we grow a better way to deal with "removing" args? 1486cdd9686b890ebdc10039ae256ef4c9dfb5ebacb7Daniel Dunbar for (arg_iterator it = Args.filtered_begin(options::OPT_f_Group, 1487cdd9686b890ebdc10039ae256ef4c9dfb5ebacb7Daniel Dunbar options::OPT_fsyntax_only), 1488cdd9686b890ebdc10039ae256ef4c9dfb5ebacb7Daniel Dunbar ie = Args.filtered_end(); it != ie; ++it) { 1489cdd9686b890ebdc10039ae256ef4c9dfb5ebacb7Daniel Dunbar if (!it->getOption().matches(options::OPT_fbuiltin_strcat) && 1490cdd9686b890ebdc10039ae256ef4c9dfb5ebacb7Daniel Dunbar !it->getOption().matches(options::OPT_fbuiltin_strcpy)) { 1491cdd9686b890ebdc10039ae256ef4c9dfb5ebacb7Daniel Dunbar it->claim(); 1492cdd9686b890ebdc10039ae256ef4c9dfb5ebacb7Daniel Dunbar it->render(Args, CmdArgs); 14932ba91575905a54f712a7f64304e56002e4882499Daniel Dunbar } 14942ba91575905a54f712a7f64304e56002e4882499Daniel Dunbar } 14952ba91575905a54f712a7f64304e56002e4882499Daniel Dunbar } else 14962ba91575905a54f712a7f64304e56002e4882499Daniel Dunbar Args.AddAllArgs(CmdArgs, options::OPT_f_Group, options::OPT_fsyntax_only); 1497c21c485b4fb58ef5d55cf3e523263dd824a2ace4Daniel Dunbar 1498a3ec60e0cf2a1916f479288998d31bd980b1a306Daniel Dunbar Args.AddAllArgs(CmdArgs, options::OPT_undef); 1499a3ec60e0cf2a1916f479288998d31bd980b1a306Daniel Dunbar if (Args.hasArg(options::OPT_Qn)) 1500a3ec60e0cf2a1916f479288998d31bd980b1a306Daniel Dunbar CmdArgs.push_back("-fno-ident"); 1501c21c485b4fb58ef5d55cf3e523263dd824a2ace4Daniel Dunbar 1502a3ec60e0cf2a1916f479288998d31bd980b1a306Daniel Dunbar // FIXME: This isn't correct. 1503a3ec60e0cf2a1916f479288998d31bd980b1a306Daniel Dunbar //Args.AddLastArg(CmdArgs, options::OPT__help) 1504a3ec60e0cf2a1916f479288998d31bd980b1a306Daniel Dunbar //Args.AddLastArg(CmdArgs, options::OPT__targetHelp) 1505a3ec60e0cf2a1916f479288998d31bd980b1a306Daniel Dunbar 1506a3ec60e0cf2a1916f479288998d31bd980b1a306Daniel Dunbar CmdArgs.append(OutputArgs.begin(), OutputArgs.end()); 1507a3ec60e0cf2a1916f479288998d31bd980b1a306Daniel Dunbar 1508a3ec60e0cf2a1916f479288998d31bd980b1a306Daniel Dunbar // FIXME: Still don't get what is happening here. Investigate. 1509a3ec60e0cf2a1916f479288998d31bd980b1a306Daniel Dunbar Args.AddAllArgs(CmdArgs, options::OPT__param); 1510a3ec60e0cf2a1916f479288998d31bd980b1a306Daniel Dunbar 1511a3ec60e0cf2a1916f479288998d31bd980b1a306Daniel Dunbar if (Args.hasArg(options::OPT_fmudflap) || 1512a3ec60e0cf2a1916f479288998d31bd980b1a306Daniel Dunbar Args.hasArg(options::OPT_fmudflapth)) { 1513a3ec60e0cf2a1916f479288998d31bd980b1a306Daniel Dunbar CmdArgs.push_back("-fno-builtin"); 1514a3ec60e0cf2a1916f479288998d31bd980b1a306Daniel Dunbar CmdArgs.push_back("-fno-merge-constants"); 1515a3ec60e0cf2a1916f479288998d31bd980b1a306Daniel Dunbar } 1516c21c485b4fb58ef5d55cf3e523263dd824a2ace4Daniel Dunbar 1517a3ec60e0cf2a1916f479288998d31bd980b1a306Daniel Dunbar if (Args.hasArg(options::OPT_coverage)) { 1518a3ec60e0cf2a1916f479288998d31bd980b1a306Daniel Dunbar CmdArgs.push_back("-fprofile-arcs"); 1519a3ec60e0cf2a1916f479288998d31bd980b1a306Daniel Dunbar CmdArgs.push_back("-ftest-coverage"); 1520a3ec60e0cf2a1916f479288998d31bd980b1a306Daniel Dunbar } 1521a3ec60e0cf2a1916f479288998d31bd980b1a306Daniel Dunbar 1522a3ec60e0cf2a1916f479288998d31bd980b1a306Daniel Dunbar if (types::isCXX(Inputs[0].getType())) 1523a3ec60e0cf2a1916f479288998d31bd980b1a306Daniel Dunbar CmdArgs.push_back("-D__private_extern__=extern"); 1524a3ec60e0cf2a1916f479288998d31bd980b1a306Daniel Dunbar} 1525a3ec60e0cf2a1916f479288998d31bd980b1a306Daniel Dunbar 1526a3ec60e0cf2a1916f479288998d31bd980b1a306Daniel Dunbarvoid darwin::CC1::AddCPPOptionsArgs(const ArgList &Args, ArgStringList &CmdArgs, 1527a3ec60e0cf2a1916f479288998d31bd980b1a306Daniel Dunbar const InputInfoList &Inputs, 1528a3ec60e0cf2a1916f479288998d31bd980b1a306Daniel Dunbar const ArgStringList &OutputArgs) const { 1529a3ec60e0cf2a1916f479288998d31bd980b1a306Daniel Dunbar // Derived from cpp_options 1530a3ec60e0cf2a1916f479288998d31bd980b1a306Daniel Dunbar AddCPPUniqueOptionsArgs(Args, CmdArgs, Inputs); 1531c21c485b4fb58ef5d55cf3e523263dd824a2ace4Daniel Dunbar 1532a3ec60e0cf2a1916f479288998d31bd980b1a306Daniel Dunbar CmdArgs.append(OutputArgs.begin(), OutputArgs.end()); 1533a3ec60e0cf2a1916f479288998d31bd980b1a306Daniel Dunbar 1534a3ec60e0cf2a1916f479288998d31bd980b1a306Daniel Dunbar AddCC1Args(Args, CmdArgs); 1535a3ec60e0cf2a1916f479288998d31bd980b1a306Daniel Dunbar 1536a3ec60e0cf2a1916f479288998d31bd980b1a306Daniel Dunbar // NOTE: The code below has some commonality with cpp_options, but 1537a3ec60e0cf2a1916f479288998d31bd980b1a306Daniel Dunbar // in classic gcc style ends up sending things in different 1538a3ec60e0cf2a1916f479288998d31bd980b1a306Daniel Dunbar // orders. This may be a good merge candidate once we drop pedantic 1539a3ec60e0cf2a1916f479288998d31bd980b1a306Daniel Dunbar // compatibility. 1540a3ec60e0cf2a1916f479288998d31bd980b1a306Daniel Dunbar 1541a3ec60e0cf2a1916f479288998d31bd980b1a306Daniel Dunbar Args.AddAllArgs(CmdArgs, options::OPT_m_Group); 1542c21c485b4fb58ef5d55cf3e523263dd824a2ace4Daniel Dunbar Args.AddAllArgs(CmdArgs, options::OPT_std_EQ, options::OPT_ansi, 1543a3ec60e0cf2a1916f479288998d31bd980b1a306Daniel Dunbar options::OPT_trigraphs); 1544a3ff202ee4fb21728e930d5d029ba4925129912cDaniel Dunbar if (!Args.getLastArg(options::OPT_std_EQ, options::OPT_ansi)) { 1545a3ff202ee4fb21728e930d5d029ba4925129912cDaniel Dunbar // Honor -std-default. 1546a3ff202ee4fb21728e930d5d029ba4925129912cDaniel Dunbar Args.AddAllArgsTranslated(CmdArgs, options::OPT_std_default_EQ, 1547a3ff202ee4fb21728e930d5d029ba4925129912cDaniel Dunbar "-std=", /*Joined=*/true); 1548a3ff202ee4fb21728e930d5d029ba4925129912cDaniel Dunbar } 1549a3ec60e0cf2a1916f479288998d31bd980b1a306Daniel Dunbar Args.AddAllArgs(CmdArgs, options::OPT_W_Group, options::OPT_pedantic_Group); 1550a3ec60e0cf2a1916f479288998d31bd980b1a306Daniel Dunbar Args.AddLastArg(CmdArgs, options::OPT_w); 1551c21c485b4fb58ef5d55cf3e523263dd824a2ace4Daniel Dunbar 1552a3ec60e0cf2a1916f479288998d31bd980b1a306Daniel Dunbar // The driver treats -fsyntax-only specially. 1553a3ec60e0cf2a1916f479288998d31bd980b1a306Daniel Dunbar Args.AddAllArgs(CmdArgs, options::OPT_f_Group, options::OPT_fsyntax_only); 1554a3ec60e0cf2a1916f479288998d31bd980b1a306Daniel Dunbar 1555a3ec60e0cf2a1916f479288998d31bd980b1a306Daniel Dunbar if (Args.hasArg(options::OPT_g_Group) && !Args.hasArg(options::OPT_g0) && 1556a3ec60e0cf2a1916f479288998d31bd980b1a306Daniel Dunbar !Args.hasArg(options::OPT_fno_working_directory)) 1557a3ec60e0cf2a1916f479288998d31bd980b1a306Daniel Dunbar CmdArgs.push_back("-fworking-directory"); 1558a3ec60e0cf2a1916f479288998d31bd980b1a306Daniel Dunbar 1559a3ec60e0cf2a1916f479288998d31bd980b1a306Daniel Dunbar Args.AddAllArgs(CmdArgs, options::OPT_O); 1560a3ec60e0cf2a1916f479288998d31bd980b1a306Daniel Dunbar Args.AddAllArgs(CmdArgs, options::OPT_undef); 1561a3ec60e0cf2a1916f479288998d31bd980b1a306Daniel Dunbar if (Args.hasArg(options::OPT_save_temps)) 1562a3ec60e0cf2a1916f479288998d31bd980b1a306Daniel Dunbar CmdArgs.push_back("-fpch-preprocess"); 1563a3ec60e0cf2a1916f479288998d31bd980b1a306Daniel Dunbar} 1564a3ec60e0cf2a1916f479288998d31bd980b1a306Daniel Dunbar 1565c21c485b4fb58ef5d55cf3e523263dd824a2ace4Daniel Dunbarvoid darwin::CC1::AddCPPUniqueOptionsArgs(const ArgList &Args, 1566a3ec60e0cf2a1916f479288998d31bd980b1a306Daniel Dunbar ArgStringList &CmdArgs, 15671eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump const InputInfoList &Inputs) const { 1568ee788e70fcd0adf76103b17c78ac658d4ea30c9bDaniel Dunbar const Driver &D = getToolChain().getDriver(); 1569a3ec60e0cf2a1916f479288998d31bd980b1a306Daniel Dunbar 157088a3d6cf5ebab81614f89ba48a8d89023270637aDaniel Dunbar CheckPreprocessingOptions(D, Args); 157188a3d6cf5ebab81614f89ba48a8d89023270637aDaniel Dunbar 1572a3ec60e0cf2a1916f479288998d31bd980b1a306Daniel Dunbar // Derived from cpp_unique_options. 157388a3d6cf5ebab81614f89ba48a8d89023270637aDaniel Dunbar // -{C,CC} only with -E is checked in CheckPreprocessingOptions(). 157488a3d6cf5ebab81614f89ba48a8d89023270637aDaniel Dunbar Args.AddLastArg(CmdArgs, options::OPT_C); 157588a3d6cf5ebab81614f89ba48a8d89023270637aDaniel Dunbar Args.AddLastArg(CmdArgs, options::OPT_CC); 1576a3ec60e0cf2a1916f479288998d31bd980b1a306Daniel Dunbar if (!Args.hasArg(options::OPT_Q)) 1577a3ec60e0cf2a1916f479288998d31bd980b1a306Daniel Dunbar CmdArgs.push_back("-quiet"); 1578a3ec60e0cf2a1916f479288998d31bd980b1a306Daniel Dunbar Args.AddAllArgs(CmdArgs, options::OPT_nostdinc); 1579a3ec60e0cf2a1916f479288998d31bd980b1a306Daniel Dunbar Args.AddLastArg(CmdArgs, options::OPT_v); 1580a3ec60e0cf2a1916f479288998d31bd980b1a306Daniel Dunbar Args.AddAllArgs(CmdArgs, options::OPT_I_Group, options::OPT_F); 1581a3ec60e0cf2a1916f479288998d31bd980b1a306Daniel Dunbar Args.AddLastArg(CmdArgs, options::OPT_P); 1582a3ec60e0cf2a1916f479288998d31bd980b1a306Daniel Dunbar 1583a3ec60e0cf2a1916f479288998d31bd980b1a306Daniel Dunbar // FIXME: Handle %I properly. 1584a3ec60e0cf2a1916f479288998d31bd980b1a306Daniel Dunbar if (getToolChain().getArchName() == "x86_64") { 1585a3ec60e0cf2a1916f479288998d31bd980b1a306Daniel Dunbar CmdArgs.push_back("-imultilib"); 1586a3ec60e0cf2a1916f479288998d31bd980b1a306Daniel Dunbar CmdArgs.push_back("x86_64"); 1587a3ec60e0cf2a1916f479288998d31bd980b1a306Daniel Dunbar } 1588a3ec60e0cf2a1916f479288998d31bd980b1a306Daniel Dunbar 1589a3ec60e0cf2a1916f479288998d31bd980b1a306Daniel Dunbar if (Args.hasArg(options::OPT_MD)) { 1590a3ec60e0cf2a1916f479288998d31bd980b1a306Daniel Dunbar CmdArgs.push_back("-MD"); 1591a5a7bd0de7b6b80212095195a055a4a43f21d4b2Daniel Dunbar CmdArgs.push_back(darwin::CC1::getDependencyFileName(Args, Inputs)); 1592a3ec60e0cf2a1916f479288998d31bd980b1a306Daniel Dunbar } 1593a3ec60e0cf2a1916f479288998d31bd980b1a306Daniel Dunbar 1594a3ec60e0cf2a1916f479288998d31bd980b1a306Daniel Dunbar if (Args.hasArg(options::OPT_MMD)) { 1595a3ec60e0cf2a1916f479288998d31bd980b1a306Daniel Dunbar CmdArgs.push_back("-MMD"); 1596a5a7bd0de7b6b80212095195a055a4a43f21d4b2Daniel Dunbar CmdArgs.push_back(darwin::CC1::getDependencyFileName(Args, Inputs)); 1597a3ec60e0cf2a1916f479288998d31bd980b1a306Daniel Dunbar } 1598a3ec60e0cf2a1916f479288998d31bd980b1a306Daniel Dunbar 1599a3ec60e0cf2a1916f479288998d31bd980b1a306Daniel Dunbar Args.AddLastArg(CmdArgs, options::OPT_M); 1600a3ec60e0cf2a1916f479288998d31bd980b1a306Daniel Dunbar Args.AddLastArg(CmdArgs, options::OPT_MM); 1601a3ec60e0cf2a1916f479288998d31bd980b1a306Daniel Dunbar Args.AddAllArgs(CmdArgs, options::OPT_MF); 1602a3ec60e0cf2a1916f479288998d31bd980b1a306Daniel Dunbar Args.AddLastArg(CmdArgs, options::OPT_MG); 1603a3ec60e0cf2a1916f479288998d31bd980b1a306Daniel Dunbar Args.AddLastArg(CmdArgs, options::OPT_MP); 1604a3ec60e0cf2a1916f479288998d31bd980b1a306Daniel Dunbar Args.AddAllArgs(CmdArgs, options::OPT_MQ); 1605a3ec60e0cf2a1916f479288998d31bd980b1a306Daniel Dunbar Args.AddAllArgs(CmdArgs, options::OPT_MT); 1606a3ec60e0cf2a1916f479288998d31bd980b1a306Daniel Dunbar if (!Args.hasArg(options::OPT_M) && !Args.hasArg(options::OPT_MM) && 1607a3ec60e0cf2a1916f479288998d31bd980b1a306Daniel Dunbar (Args.hasArg(options::OPT_MD) || Args.hasArg(options::OPT_MMD))) { 1608a3ec60e0cf2a1916f479288998d31bd980b1a306Daniel Dunbar if (Arg *OutputOpt = Args.getLastArg(options::OPT_o)) { 1609a3ec60e0cf2a1916f479288998d31bd980b1a306Daniel Dunbar CmdArgs.push_back("-MQ"); 1610a3ec60e0cf2a1916f479288998d31bd980b1a306Daniel Dunbar CmdArgs.push_back(OutputOpt->getValue(Args)); 1611a3ec60e0cf2a1916f479288998d31bd980b1a306Daniel Dunbar } 1612a3ec60e0cf2a1916f479288998d31bd980b1a306Daniel Dunbar } 1613a3ec60e0cf2a1916f479288998d31bd980b1a306Daniel Dunbar 1614a3ec60e0cf2a1916f479288998d31bd980b1a306Daniel Dunbar Args.AddLastArg(CmdArgs, options::OPT_remap); 1615a3ec60e0cf2a1916f479288998d31bd980b1a306Daniel Dunbar if (Args.hasArg(options::OPT_g3)) 1616a3ec60e0cf2a1916f479288998d31bd980b1a306Daniel Dunbar CmdArgs.push_back("-dD"); 1617a3ec60e0cf2a1916f479288998d31bd980b1a306Daniel Dunbar Args.AddLastArg(CmdArgs, options::OPT_H); 1618a3ec60e0cf2a1916f479288998d31bd980b1a306Daniel Dunbar 1619a3ec60e0cf2a1916f479288998d31bd980b1a306Daniel Dunbar AddCPPArgs(Args, CmdArgs); 1620a3ec60e0cf2a1916f479288998d31bd980b1a306Daniel Dunbar 1621a3ec60e0cf2a1916f479288998d31bd980b1a306Daniel Dunbar Args.AddAllArgs(CmdArgs, options::OPT_D, options::OPT_U, options::OPT_A); 1622a3ec60e0cf2a1916f479288998d31bd980b1a306Daniel Dunbar Args.AddAllArgs(CmdArgs, options::OPT_i_Group); 1623a3ec60e0cf2a1916f479288998d31bd980b1a306Daniel Dunbar 1624a3ec60e0cf2a1916f479288998d31bd980b1a306Daniel Dunbar for (InputInfoList::const_iterator 1625a3ec60e0cf2a1916f479288998d31bd980b1a306Daniel Dunbar it = Inputs.begin(), ie = Inputs.end(); it != ie; ++it) { 1626a3ec60e0cf2a1916f479288998d31bd980b1a306Daniel Dunbar const InputInfo &II = *it; 1627c21c485b4fb58ef5d55cf3e523263dd824a2ace4Daniel Dunbar 1628a3ec60e0cf2a1916f479288998d31bd980b1a306Daniel Dunbar if (II.isPipe()) 1629a3ec60e0cf2a1916f479288998d31bd980b1a306Daniel Dunbar CmdArgs.push_back("-"); 1630a3ec60e0cf2a1916f479288998d31bd980b1a306Daniel Dunbar else 1631a3ec60e0cf2a1916f479288998d31bd980b1a306Daniel Dunbar CmdArgs.push_back(II.getFilename()); 1632a3ec60e0cf2a1916f479288998d31bd980b1a306Daniel Dunbar } 1633a3ec60e0cf2a1916f479288998d31bd980b1a306Daniel Dunbar 1634a3ec60e0cf2a1916f479288998d31bd980b1a306Daniel Dunbar Args.AddAllArgValues(CmdArgs, options::OPT_Wp_COMMA, 1635a3ec60e0cf2a1916f479288998d31bd980b1a306Daniel Dunbar options::OPT_Xpreprocessor); 1636a3ec60e0cf2a1916f479288998d31bd980b1a306Daniel Dunbar 1637a3ec60e0cf2a1916f479288998d31bd980b1a306Daniel Dunbar if (Args.hasArg(options::OPT_fmudflap)) { 1638a3ec60e0cf2a1916f479288998d31bd980b1a306Daniel Dunbar CmdArgs.push_back("-D_MUDFLAP"); 1639a3ec60e0cf2a1916f479288998d31bd980b1a306Daniel Dunbar CmdArgs.push_back("-include"); 1640a3ec60e0cf2a1916f479288998d31bd980b1a306Daniel Dunbar CmdArgs.push_back("mf-runtime.h"); 1641a3ec60e0cf2a1916f479288998d31bd980b1a306Daniel Dunbar } 1642a3ec60e0cf2a1916f479288998d31bd980b1a306Daniel Dunbar 1643a3ec60e0cf2a1916f479288998d31bd980b1a306Daniel Dunbar if (Args.hasArg(options::OPT_fmudflapth)) { 1644a3ec60e0cf2a1916f479288998d31bd980b1a306Daniel Dunbar CmdArgs.push_back("-D_MUDFLAP"); 1645a3ec60e0cf2a1916f479288998d31bd980b1a306Daniel Dunbar CmdArgs.push_back("-D_MUDFLAPTH"); 1646a3ec60e0cf2a1916f479288998d31bd980b1a306Daniel Dunbar CmdArgs.push_back("-include"); 1647a3ec60e0cf2a1916f479288998d31bd980b1a306Daniel Dunbar CmdArgs.push_back("mf-runtime.h"); 1648a3ec60e0cf2a1916f479288998d31bd980b1a306Daniel Dunbar } 1649a3ec60e0cf2a1916f479288998d31bd980b1a306Daniel Dunbar} 1650a3ec60e0cf2a1916f479288998d31bd980b1a306Daniel Dunbar 1651c21c485b4fb58ef5d55cf3e523263dd824a2ace4Daniel Dunbarvoid darwin::CC1::AddCPPArgs(const ArgList &Args, 1652a3ec60e0cf2a1916f479288998d31bd980b1a306Daniel Dunbar ArgStringList &CmdArgs) const { 1653a3ec60e0cf2a1916f479288998d31bd980b1a306Daniel Dunbar // Derived from cpp spec. 1654a3ec60e0cf2a1916f479288998d31bd980b1a306Daniel Dunbar 1655a3ec60e0cf2a1916f479288998d31bd980b1a306Daniel Dunbar if (Args.hasArg(options::OPT_static)) { 1656a3ec60e0cf2a1916f479288998d31bd980b1a306Daniel Dunbar // The gcc spec is broken here, it refers to dynamic but 1657a3ec60e0cf2a1916f479288998d31bd980b1a306Daniel Dunbar // that has been translated. Start by being bug compatible. 1658c21c485b4fb58ef5d55cf3e523263dd824a2ace4Daniel Dunbar 1659a3ec60e0cf2a1916f479288998d31bd980b1a306Daniel Dunbar // if (!Args.hasArg(arglist.parser.dynamicOption)) 1660a3ec60e0cf2a1916f479288998d31bd980b1a306Daniel Dunbar CmdArgs.push_back("-D__STATIC__"); 1661a3ec60e0cf2a1916f479288998d31bd980b1a306Daniel Dunbar } else 1662a3ec60e0cf2a1916f479288998d31bd980b1a306Daniel Dunbar CmdArgs.push_back("-D__DYNAMIC__"); 1663a3ec60e0cf2a1916f479288998d31bd980b1a306Daniel Dunbar 1664a3ec60e0cf2a1916f479288998d31bd980b1a306Daniel Dunbar if (Args.hasArg(options::OPT_pthread)) 1665a3ec60e0cf2a1916f479288998d31bd980b1a306Daniel Dunbar CmdArgs.push_back("-D_REENTRANT"); 1666a3ec60e0cf2a1916f479288998d31bd980b1a306Daniel Dunbar} 1667a3ec60e0cf2a1916f479288998d31bd980b1a306Daniel Dunbar 166840f1265ebd42ece3e7f7917319b56012e8e2bce2Daniel Dunbarvoid darwin::Preprocess::ConstructJob(Compilation &C, const JobAction &JA, 1669c21c485b4fb58ef5d55cf3e523263dd824a2ace4Daniel Dunbar Job &Dest, const InputInfo &Output, 1670c21c485b4fb58ef5d55cf3e523263dd824a2ace4Daniel Dunbar const InputInfoList &Inputs, 1671c21c485b4fb58ef5d55cf3e523263dd824a2ace4Daniel Dunbar const ArgList &Args, 167240f1265ebd42ece3e7f7917319b56012e8e2bce2Daniel Dunbar const char *LinkingOutput) const { 167340f1265ebd42ece3e7f7917319b56012e8e2bce2Daniel Dunbar ArgStringList CmdArgs; 167440f1265ebd42ece3e7f7917319b56012e8e2bce2Daniel Dunbar 167540f1265ebd42ece3e7f7917319b56012e8e2bce2Daniel Dunbar assert(Inputs.size() == 1 && "Unexpected number of inputs!"); 167640f1265ebd42ece3e7f7917319b56012e8e2bce2Daniel Dunbar 167740f1265ebd42ece3e7f7917319b56012e8e2bce2Daniel Dunbar CmdArgs.push_back("-E"); 167840f1265ebd42ece3e7f7917319b56012e8e2bce2Daniel Dunbar 167940f1265ebd42ece3e7f7917319b56012e8e2bce2Daniel Dunbar if (Args.hasArg(options::OPT_traditional) || 168040f1265ebd42ece3e7f7917319b56012e8e2bce2Daniel Dunbar Args.hasArg(options::OPT_traditional_cpp)) 168140f1265ebd42ece3e7f7917319b56012e8e2bce2Daniel Dunbar CmdArgs.push_back("-traditional-cpp"); 1682c21c485b4fb58ef5d55cf3e523263dd824a2ace4Daniel Dunbar 168340f1265ebd42ece3e7f7917319b56012e8e2bce2Daniel Dunbar ArgStringList OutputArgs; 168440f1265ebd42ece3e7f7917319b56012e8e2bce2Daniel Dunbar if (Output.isFilename()) { 168540f1265ebd42ece3e7f7917319b56012e8e2bce2Daniel Dunbar OutputArgs.push_back("-o"); 168640f1265ebd42ece3e7f7917319b56012e8e2bce2Daniel Dunbar OutputArgs.push_back(Output.getFilename()); 168740f1265ebd42ece3e7f7917319b56012e8e2bce2Daniel Dunbar } else { 168840f1265ebd42ece3e7f7917319b56012e8e2bce2Daniel Dunbar assert(Output.isPipe() && "Unexpected CC1 output."); 168940f1265ebd42ece3e7f7917319b56012e8e2bce2Daniel Dunbar } 169040f1265ebd42ece3e7f7917319b56012e8e2bce2Daniel Dunbar 16919120f179fd2e354f067e4ef2c76dcf3fc4db8a16Daniel Dunbar if (Args.hasArg(options::OPT_E)) { 16929120f179fd2e354f067e4ef2c76dcf3fc4db8a16Daniel Dunbar AddCPPOptionsArgs(Args, CmdArgs, Inputs, OutputArgs); 16939120f179fd2e354f067e4ef2c76dcf3fc4db8a16Daniel Dunbar } else { 16949120f179fd2e354f067e4ef2c76dcf3fc4db8a16Daniel Dunbar AddCPPOptionsArgs(Args, CmdArgs, Inputs, ArgStringList()); 16959120f179fd2e354f067e4ef2c76dcf3fc4db8a16Daniel Dunbar CmdArgs.append(OutputArgs.begin(), OutputArgs.end()); 16969120f179fd2e354f067e4ef2c76dcf3fc4db8a16Daniel Dunbar } 1697c21c485b4fb58ef5d55cf3e523263dd824a2ace4Daniel Dunbar 16988a2073a85670a13b0bcc1726bc7f80d458f8245bDaniel Dunbar Args.AddAllArgs(CmdArgs, options::OPT_d_Group); 16998a2073a85670a13b0bcc1726bc7f80d458f8245bDaniel Dunbar 170040f1265ebd42ece3e7f7917319b56012e8e2bce2Daniel Dunbar const char *CC1Name = getCC1Name(Inputs[0].getType()); 1701c21c485b4fb58ef5d55cf3e523263dd824a2ace4Daniel Dunbar const char *Exec = 17025ed34f4c58b6ad4e21038d713c1fae31a6146ff5Daniel Dunbar Args.MakeArgString(getToolChain().GetProgramPath(C, CC1Name)); 1703daab7b1016f0a82fefa4f7be6e63c57c06b19ffcDaniel Dunbar Dest.addCommand(new Command(JA, *this, Exec, CmdArgs)); 170440f1265ebd42ece3e7f7917319b56012e8e2bce2Daniel Dunbar} 170540f1265ebd42ece3e7f7917319b56012e8e2bce2Daniel Dunbar 170640f1265ebd42ece3e7f7917319b56012e8e2bce2Daniel Dunbarvoid darwin::Compile::ConstructJob(Compilation &C, const JobAction &JA, 1707c21c485b4fb58ef5d55cf3e523263dd824a2ace4Daniel Dunbar Job &Dest, const InputInfo &Output, 1708c21c485b4fb58ef5d55cf3e523263dd824a2ace4Daniel Dunbar const InputInfoList &Inputs, 1709c21c485b4fb58ef5d55cf3e523263dd824a2ace4Daniel Dunbar const ArgList &Args, 171040f1265ebd42ece3e7f7917319b56012e8e2bce2Daniel Dunbar const char *LinkingOutput) const { 1711ee788e70fcd0adf76103b17c78ac658d4ea30c9bDaniel Dunbar const Driver &D = getToolChain().getDriver(); 171240f1265ebd42ece3e7f7917319b56012e8e2bce2Daniel Dunbar ArgStringList CmdArgs; 171340f1265ebd42ece3e7f7917319b56012e8e2bce2Daniel Dunbar 171440f1265ebd42ece3e7f7917319b56012e8e2bce2Daniel Dunbar assert(Inputs.size() == 1 && "Unexpected number of inputs!"); 171540f1265ebd42ece3e7f7917319b56012e8e2bce2Daniel Dunbar 171640f1265ebd42ece3e7f7917319b56012e8e2bce2Daniel Dunbar types::ID InputType = Inputs[0].getType(); 171740f1265ebd42ece3e7f7917319b56012e8e2bce2Daniel Dunbar const Arg *A; 1718ceb5c5b7f67a30fae305d1d19b478b623e4fbcedEli Friedman if ((A = Args.getLastArg(options::OPT_traditional))) 171940f1265ebd42ece3e7f7917319b56012e8e2bce2Daniel Dunbar D.Diag(clang::diag::err_drv_argument_only_allowed_with) 172040f1265ebd42ece3e7f7917319b56012e8e2bce2Daniel Dunbar << A->getAsString(Args) << "-E"; 172140f1265ebd42ece3e7f7917319b56012e8e2bce2Daniel Dunbar 172240f1265ebd42ece3e7f7917319b56012e8e2bce2Daniel Dunbar if (Output.getType() == types::TY_LLVMAsm) 172340f1265ebd42ece3e7f7917319b56012e8e2bce2Daniel Dunbar CmdArgs.push_back("-emit-llvm"); 172440f1265ebd42ece3e7f7917319b56012e8e2bce2Daniel Dunbar else if (Output.getType() == types::TY_LLVMBC) 172540f1265ebd42ece3e7f7917319b56012e8e2bce2Daniel Dunbar CmdArgs.push_back("-emit-llvm-bc"); 17265915fbf310e171c4cd3c2af05e9de360c0fa988aDaniel Dunbar else if (Output.getType() == types::TY_AST) 17275915fbf310e171c4cd3c2af05e9de360c0fa988aDaniel Dunbar D.Diag(clang::diag::err_drv_no_ast_support) 1728881376467c46c5c6cc16fa6790271c2c22e1d4f1Daniel Dunbar << getToolChain().getTripleString(); 172940f1265ebd42ece3e7f7917319b56012e8e2bce2Daniel Dunbar 173040f1265ebd42ece3e7f7917319b56012e8e2bce2Daniel Dunbar ArgStringList OutputArgs; 173140f1265ebd42ece3e7f7917319b56012e8e2bce2Daniel Dunbar if (Output.getType() != types::TY_PCH) { 173240f1265ebd42ece3e7f7917319b56012e8e2bce2Daniel Dunbar OutputArgs.push_back("-o"); 173340f1265ebd42ece3e7f7917319b56012e8e2bce2Daniel Dunbar if (Output.isPipe()) 173440f1265ebd42ece3e7f7917319b56012e8e2bce2Daniel Dunbar OutputArgs.push_back("-"); 173540f1265ebd42ece3e7f7917319b56012e8e2bce2Daniel Dunbar else if (Output.isNothing()) 173640f1265ebd42ece3e7f7917319b56012e8e2bce2Daniel Dunbar OutputArgs.push_back("/dev/null"); 173740f1265ebd42ece3e7f7917319b56012e8e2bce2Daniel Dunbar else 173840f1265ebd42ece3e7f7917319b56012e8e2bce2Daniel Dunbar OutputArgs.push_back(Output.getFilename()); 173940f1265ebd42ece3e7f7917319b56012e8e2bce2Daniel Dunbar } 174040f1265ebd42ece3e7f7917319b56012e8e2bce2Daniel Dunbar 174140f1265ebd42ece3e7f7917319b56012e8e2bce2Daniel Dunbar // There is no need for this level of compatibility, but it makes 174240f1265ebd42ece3e7f7917319b56012e8e2bce2Daniel Dunbar // diffing easier. 174340f1265ebd42ece3e7f7917319b56012e8e2bce2Daniel Dunbar bool OutputArgsEarly = (Args.hasArg(options::OPT_fsyntax_only) || 174440f1265ebd42ece3e7f7917319b56012e8e2bce2Daniel Dunbar Args.hasArg(options::OPT_S)); 174540f1265ebd42ece3e7f7917319b56012e8e2bce2Daniel Dunbar 174640f1265ebd42ece3e7f7917319b56012e8e2bce2Daniel Dunbar if (types::getPreprocessedType(InputType) != types::TY_INVALID) { 1747a3ec60e0cf2a1916f479288998d31bd980b1a306Daniel Dunbar AddCPPUniqueOptionsArgs(Args, CmdArgs, Inputs); 174840f1265ebd42ece3e7f7917319b56012e8e2bce2Daniel Dunbar if (OutputArgsEarly) { 174940f1265ebd42ece3e7f7917319b56012e8e2bce2Daniel Dunbar AddCC1OptionsArgs(Args, CmdArgs, Inputs, OutputArgs); 175040f1265ebd42ece3e7f7917319b56012e8e2bce2Daniel Dunbar } else { 175140f1265ebd42ece3e7f7917319b56012e8e2bce2Daniel Dunbar AddCC1OptionsArgs(Args, CmdArgs, Inputs, ArgStringList()); 175240f1265ebd42ece3e7f7917319b56012e8e2bce2Daniel Dunbar CmdArgs.append(OutputArgs.begin(), OutputArgs.end()); 175340f1265ebd42ece3e7f7917319b56012e8e2bce2Daniel Dunbar } 175440f1265ebd42ece3e7f7917319b56012e8e2bce2Daniel Dunbar } else { 175540f1265ebd42ece3e7f7917319b56012e8e2bce2Daniel Dunbar CmdArgs.push_back("-fpreprocessed"); 1756c21c485b4fb58ef5d55cf3e523263dd824a2ace4Daniel Dunbar 175740f1265ebd42ece3e7f7917319b56012e8e2bce2Daniel Dunbar for (InputInfoList::const_iterator 175840f1265ebd42ece3e7f7917319b56012e8e2bce2Daniel Dunbar it = Inputs.begin(), ie = Inputs.end(); it != ie; ++it) { 175940f1265ebd42ece3e7f7917319b56012e8e2bce2Daniel Dunbar const InputInfo &II = *it; 176040f1265ebd42ece3e7f7917319b56012e8e2bce2Daniel Dunbar 17615915fbf310e171c4cd3c2af05e9de360c0fa988aDaniel Dunbar // Reject AST inputs. 17625915fbf310e171c4cd3c2af05e9de360c0fa988aDaniel Dunbar if (II.getType() == types::TY_AST) { 17635915fbf310e171c4cd3c2af05e9de360c0fa988aDaniel Dunbar D.Diag(clang::diag::err_drv_no_ast_support) 1764881376467c46c5c6cc16fa6790271c2c22e1d4f1Daniel Dunbar << getToolChain().getTripleString(); 17655915fbf310e171c4cd3c2af05e9de360c0fa988aDaniel Dunbar return; 17665915fbf310e171c4cd3c2af05e9de360c0fa988aDaniel Dunbar } 17675915fbf310e171c4cd3c2af05e9de360c0fa988aDaniel Dunbar 176840f1265ebd42ece3e7f7917319b56012e8e2bce2Daniel Dunbar if (II.isPipe()) 176940f1265ebd42ece3e7f7917319b56012e8e2bce2Daniel Dunbar CmdArgs.push_back("-"); 177040f1265ebd42ece3e7f7917319b56012e8e2bce2Daniel Dunbar else 177140f1265ebd42ece3e7f7917319b56012e8e2bce2Daniel Dunbar CmdArgs.push_back(II.getFilename()); 177240f1265ebd42ece3e7f7917319b56012e8e2bce2Daniel Dunbar } 177340f1265ebd42ece3e7f7917319b56012e8e2bce2Daniel Dunbar 177440f1265ebd42ece3e7f7917319b56012e8e2bce2Daniel Dunbar if (OutputArgsEarly) { 177540f1265ebd42ece3e7f7917319b56012e8e2bce2Daniel Dunbar AddCC1OptionsArgs(Args, CmdArgs, Inputs, OutputArgs); 177640f1265ebd42ece3e7f7917319b56012e8e2bce2Daniel Dunbar } else { 177740f1265ebd42ece3e7f7917319b56012e8e2bce2Daniel Dunbar AddCC1OptionsArgs(Args, CmdArgs, Inputs, ArgStringList()); 177840f1265ebd42ece3e7f7917319b56012e8e2bce2Daniel Dunbar CmdArgs.append(OutputArgs.begin(), OutputArgs.end()); 177940f1265ebd42ece3e7f7917319b56012e8e2bce2Daniel Dunbar } 178040f1265ebd42ece3e7f7917319b56012e8e2bce2Daniel Dunbar } 1781c21c485b4fb58ef5d55cf3e523263dd824a2ace4Daniel Dunbar 178240f1265ebd42ece3e7f7917319b56012e8e2bce2Daniel Dunbar if (Output.getType() == types::TY_PCH) { 178340f1265ebd42ece3e7f7917319b56012e8e2bce2Daniel Dunbar assert(Output.isFilename() && "Invalid PCH output."); 178440f1265ebd42ece3e7f7917319b56012e8e2bce2Daniel Dunbar 178540f1265ebd42ece3e7f7917319b56012e8e2bce2Daniel Dunbar CmdArgs.push_back("-o"); 178640f1265ebd42ece3e7f7917319b56012e8e2bce2Daniel Dunbar // NOTE: gcc uses a temp .s file for this, but there doesn't seem 178740f1265ebd42ece3e7f7917319b56012e8e2bce2Daniel Dunbar // to be a good reason. 178840f1265ebd42ece3e7f7917319b56012e8e2bce2Daniel Dunbar CmdArgs.push_back("/dev/null"); 1789c21c485b4fb58ef5d55cf3e523263dd824a2ace4Daniel Dunbar 1790e6c9ae147835fb450a90800bd378420c0e5ffb35Daniel Dunbar CmdArgs.push_back("--output-pch="); 179140f1265ebd42ece3e7f7917319b56012e8e2bce2Daniel Dunbar CmdArgs.push_back(Output.getFilename()); 1792c21c485b4fb58ef5d55cf3e523263dd824a2ace4Daniel Dunbar } 179340f1265ebd42ece3e7f7917319b56012e8e2bce2Daniel Dunbar 179440f1265ebd42ece3e7f7917319b56012e8e2bce2Daniel Dunbar const char *CC1Name = getCC1Name(Inputs[0].getType()); 1795c21c485b4fb58ef5d55cf3e523263dd824a2ace4Daniel Dunbar const char *Exec = 17965ed34f4c58b6ad4e21038d713c1fae31a6146ff5Daniel Dunbar Args.MakeArgString(getToolChain().GetProgramPath(C, CC1Name)); 1797daab7b1016f0a82fefa4f7be6e63c57c06b19ffcDaniel Dunbar Dest.addCommand(new Command(JA, *this, Exec, CmdArgs)); 179840f1265ebd42ece3e7f7917319b56012e8e2bce2Daniel Dunbar} 179940f1265ebd42ece3e7f7917319b56012e8e2bce2Daniel Dunbar 18008cac5f7e1ce63dd77ee0fb4ef68f9fa804f41ea6Daniel Dunbarvoid darwin::Assemble::ConstructJob(Compilation &C, const JobAction &JA, 1801c21c485b4fb58ef5d55cf3e523263dd824a2ace4Daniel Dunbar Job &Dest, const InputInfo &Output, 1802c21c485b4fb58ef5d55cf3e523263dd824a2ace4Daniel Dunbar const InputInfoList &Inputs, 1803c21c485b4fb58ef5d55cf3e523263dd824a2ace4Daniel Dunbar const ArgList &Args, 18048cac5f7e1ce63dd77ee0fb4ef68f9fa804f41ea6Daniel Dunbar const char *LinkingOutput) const { 18058cac5f7e1ce63dd77ee0fb4ef68f9fa804f41ea6Daniel Dunbar ArgStringList CmdArgs; 18068cac5f7e1ce63dd77ee0fb4ef68f9fa804f41ea6Daniel Dunbar 18078cac5f7e1ce63dd77ee0fb4ef68f9fa804f41ea6Daniel Dunbar assert(Inputs.size() == 1 && "Unexpected number of inputs."); 18088cac5f7e1ce63dd77ee0fb4ef68f9fa804f41ea6Daniel Dunbar const InputInfo &Input = Inputs[0]; 18098cac5f7e1ce63dd77ee0fb4ef68f9fa804f41ea6Daniel Dunbar 18108cac5f7e1ce63dd77ee0fb4ef68f9fa804f41ea6Daniel Dunbar // Bit of a hack, this is only used for original inputs. 1811c21c485b4fb58ef5d55cf3e523263dd824a2ace4Daniel Dunbar // 18128e4fea6750dbac032c172f3279c63b7815b7423eDaniel Dunbar // FIXME: This is broken for preprocessed .s inputs. 18138cac5f7e1ce63dd77ee0fb4ef68f9fa804f41ea6Daniel Dunbar if (Input.isFilename() && 18148e4fea6750dbac032c172f3279c63b7815b7423eDaniel Dunbar strcmp(Input.getFilename(), Input.getBaseInput()) == 0) { 18158e4fea6750dbac032c172f3279c63b7815b7423eDaniel Dunbar if (Args.hasArg(options::OPT_gstabs)) 18168e4fea6750dbac032c172f3279c63b7815b7423eDaniel Dunbar CmdArgs.push_back("--gstabs"); 18178e4fea6750dbac032c172f3279c63b7815b7423eDaniel Dunbar else if (Args.hasArg(options::OPT_g_Group)) 18188e4fea6750dbac032c172f3279c63b7815b7423eDaniel Dunbar CmdArgs.push_back("--gdwarf2"); 18198e4fea6750dbac032c172f3279c63b7815b7423eDaniel Dunbar } 1820c21c485b4fb58ef5d55cf3e523263dd824a2ace4Daniel Dunbar 18218cac5f7e1ce63dd77ee0fb4ef68f9fa804f41ea6Daniel Dunbar // Derived from asm spec. 1822cc6f803f98fa6ba9a9c366400210448516d01b3cDaniel Dunbar AddDarwinArch(Args, CmdArgs); 1823cc6f803f98fa6ba9a9c366400210448516d01b3cDaniel Dunbar 1824251ca6c9fb2bb398d9bf9fe7399c27bed7074b5cDaniel Dunbar if (!getDarwinToolChain().isTargetIPhoneOS() || 1825cc6f803f98fa6ba9a9c366400210448516d01b3cDaniel Dunbar Args.hasArg(options::OPT_force__cpusubtype__ALL)) 1826cc6f803f98fa6ba9a9c366400210448516d01b3cDaniel Dunbar CmdArgs.push_back("-force_cpusubtype_ALL"); 18278cac5f7e1ce63dd77ee0fb4ef68f9fa804f41ea6Daniel Dunbar 18280e2679d29be70186fc1197a1484948ed239922baDaniel Dunbar if (getToolChain().getTriple().getArch() != llvm::Triple::x86_64 && 18290e2679d29be70186fc1197a1484948ed239922baDaniel Dunbar (Args.hasArg(options::OPT_mkernel) || 18308cac5f7e1ce63dd77ee0fb4ef68f9fa804f41ea6Daniel Dunbar Args.hasArg(options::OPT_static) || 18310e2679d29be70186fc1197a1484948ed239922baDaniel Dunbar Args.hasArg(options::OPT_fapple_kext))) 1832c21c485b4fb58ef5d55cf3e523263dd824a2ace4Daniel Dunbar CmdArgs.push_back("-static"); 1833c21c485b4fb58ef5d55cf3e523263dd824a2ace4Daniel Dunbar 18348cac5f7e1ce63dd77ee0fb4ef68f9fa804f41ea6Daniel Dunbar Args.AddAllArgValues(CmdArgs, options::OPT_Wa_COMMA, 18358cac5f7e1ce63dd77ee0fb4ef68f9fa804f41ea6Daniel Dunbar options::OPT_Xassembler); 18368cac5f7e1ce63dd77ee0fb4ef68f9fa804f41ea6Daniel Dunbar 18378cac5f7e1ce63dd77ee0fb4ef68f9fa804f41ea6Daniel Dunbar assert(Output.isFilename() && "Unexpected lipo output."); 18388cac5f7e1ce63dd77ee0fb4ef68f9fa804f41ea6Daniel Dunbar CmdArgs.push_back("-o"); 18398cac5f7e1ce63dd77ee0fb4ef68f9fa804f41ea6Daniel Dunbar CmdArgs.push_back(Output.getFilename()); 18408cac5f7e1ce63dd77ee0fb4ef68f9fa804f41ea6Daniel Dunbar 18418cac5f7e1ce63dd77ee0fb4ef68f9fa804f41ea6Daniel Dunbar if (Input.isPipe()) { 18428cac5f7e1ce63dd77ee0fb4ef68f9fa804f41ea6Daniel Dunbar CmdArgs.push_back("-"); 18438cac5f7e1ce63dd77ee0fb4ef68f9fa804f41ea6Daniel Dunbar } else { 18448cac5f7e1ce63dd77ee0fb4ef68f9fa804f41ea6Daniel Dunbar assert(Input.isFilename() && "Invalid input."); 18458cac5f7e1ce63dd77ee0fb4ef68f9fa804f41ea6Daniel Dunbar CmdArgs.push_back(Input.getFilename()); 18468cac5f7e1ce63dd77ee0fb4ef68f9fa804f41ea6Daniel Dunbar } 18478cac5f7e1ce63dd77ee0fb4ef68f9fa804f41ea6Daniel Dunbar 18488cac5f7e1ce63dd77ee0fb4ef68f9fa804f41ea6Daniel Dunbar // asm_final spec is empty. 18498cac5f7e1ce63dd77ee0fb4ef68f9fa804f41ea6Daniel Dunbar 1850c21c485b4fb58ef5d55cf3e523263dd824a2ace4Daniel Dunbar const char *Exec = 18515ed34f4c58b6ad4e21038d713c1fae31a6146ff5Daniel Dunbar Args.MakeArgString(getToolChain().GetProgramPath(C, "as")); 1852daab7b1016f0a82fefa4f7be6e63c57c06b19ffcDaniel Dunbar Dest.addCommand(new Command(JA, *this, Exec, CmdArgs)); 18538cac5f7e1ce63dd77ee0fb4ef68f9fa804f41ea6Daniel Dunbar} 1854ff7488dc9a766f94daf54d81b03ab9160d0bfd88Daniel Dunbar 185502633b541b04ad5ffc1c70f4c2feeeb13e607057Daniel Dunbar/// Helper routine for seeing if we should use dsymutil; this is a 185602633b541b04ad5ffc1c70f4c2feeeb13e607057Daniel Dunbar/// gcc compatible hack, we should remove it and use the input 185702633b541b04ad5ffc1c70f4c2feeeb13e607057Daniel Dunbar/// type information. 185802633b541b04ad5ffc1c70f4c2feeeb13e607057Daniel Dunbarstatic bool isSourceSuffix(const char *Str) { 185902633b541b04ad5ffc1c70f4c2feeeb13e607057Daniel Dunbar // match: 'C', 'CPP', 'c', 'cc', 'cp', 'c++', 'cpp', 'cxx', 'm', 186002633b541b04ad5ffc1c70f4c2feeeb13e607057Daniel Dunbar // 'mm'. 186155d3f7ae512875a1d6402943c3a619633feb2a18Douglas Gregor return llvm::StringSwitch<bool>(Str) 186255d3f7ae512875a1d6402943c3a619633feb2a18Douglas Gregor .Case("C", true) 186355d3f7ae512875a1d6402943c3a619633feb2a18Douglas Gregor .Case("c", true) 186455d3f7ae512875a1d6402943c3a619633feb2a18Douglas Gregor .Case("m", true) 186555d3f7ae512875a1d6402943c3a619633feb2a18Douglas Gregor .Case("cc", true) 186655d3f7ae512875a1d6402943c3a619633feb2a18Douglas Gregor .Case("cp", true) 186755d3f7ae512875a1d6402943c3a619633feb2a18Douglas Gregor .Case("mm", true) 186855d3f7ae512875a1d6402943c3a619633feb2a18Douglas Gregor .Case("CPP", true) 186955d3f7ae512875a1d6402943c3a619633feb2a18Douglas Gregor .Case("c++", true) 187055d3f7ae512875a1d6402943c3a619633feb2a18Douglas Gregor .Case("cpp", true) 187155d3f7ae512875a1d6402943c3a619633feb2a18Douglas Gregor .Case("cxx", true) 187255d3f7ae512875a1d6402943c3a619633feb2a18Douglas Gregor .Default(false); 187302633b541b04ad5ffc1c70f4c2feeeb13e607057Daniel Dunbar} 187402633b541b04ad5ffc1c70f4c2feeeb13e607057Daniel Dunbar 1875fbefe6bd6f62a3361813498dc672ab0d6c0d4fd1Daniel Dunbarvoid darwin::DarwinTool::AddDarwinArch(const ArgList &Args, 1876fbefe6bd6f62a3361813498dc672ab0d6c0d4fd1Daniel Dunbar ArgStringList &CmdArgs) const { 1877eeff406730f50afd973f005a8d501a19af4785e5Daniel Dunbar llvm::StringRef ArchName = getDarwinToolChain().getDarwinArchName(Args); 1878eeff406730f50afd973f005a8d501a19af4785e5Daniel Dunbar 187902633b541b04ad5ffc1c70f4c2feeeb13e607057Daniel Dunbar // Derived from darwin_arch spec. 188002633b541b04ad5ffc1c70f4c2feeeb13e607057Daniel Dunbar CmdArgs.push_back("-arch"); 1881eeff406730f50afd973f005a8d501a19af4785e5Daniel Dunbar CmdArgs.push_back(Args.MakeArgString(ArchName)); 188278dbd580a02759bbc408dbefb6754afa71b2c24cDaniel Dunbar 1883eeff406730f50afd973f005a8d501a19af4785e5Daniel Dunbar // FIXME: Is this needed anymore? 1884eeff406730f50afd973f005a8d501a19af4785e5Daniel Dunbar if (ArchName == "arm") 188578dbd580a02759bbc408dbefb6754afa71b2c24cDaniel Dunbar CmdArgs.push_back("-force_cpusubtype_ALL"); 188602633b541b04ad5ffc1c70f4c2feeeb13e607057Daniel Dunbar} 188702633b541b04ad5ffc1c70f4c2feeeb13e607057Daniel Dunbar 1888c21c485b4fb58ef5d55cf3e523263dd824a2ace4Daniel Dunbarvoid darwin::Link::AddLinkArgs(const ArgList &Args, 188902633b541b04ad5ffc1c70f4c2feeeb13e607057Daniel Dunbar ArgStringList &CmdArgs) const { 1890ee788e70fcd0adf76103b17c78ac658d4ea30c9bDaniel Dunbar const Driver &D = getToolChain().getDriver(); 189102633b541b04ad5ffc1c70f4c2feeeb13e607057Daniel Dunbar 189202633b541b04ad5ffc1c70f4c2feeeb13e607057Daniel Dunbar // Derived from the "link" spec. 189302633b541b04ad5ffc1c70f4c2feeeb13e607057Daniel Dunbar Args.AddAllArgs(CmdArgs, options::OPT_static); 189402633b541b04ad5ffc1c70f4c2feeeb13e607057Daniel Dunbar if (!Args.hasArg(options::OPT_static)) 189502633b541b04ad5ffc1c70f4c2feeeb13e607057Daniel Dunbar CmdArgs.push_back("-dynamic"); 189602633b541b04ad5ffc1c70f4c2feeeb13e607057Daniel Dunbar if (Args.hasArg(options::OPT_fgnu_runtime)) { 189702633b541b04ad5ffc1c70f4c2feeeb13e607057Daniel Dunbar // FIXME: gcc replaces -lobjc in forward args with -lobjc-gnu 189802633b541b04ad5ffc1c70f4c2feeeb13e607057Daniel Dunbar // here. How do we wish to handle such things? 189902633b541b04ad5ffc1c70f4c2feeeb13e607057Daniel Dunbar } 1900c21c485b4fb58ef5d55cf3e523263dd824a2ace4Daniel Dunbar 190102633b541b04ad5ffc1c70f4c2feeeb13e607057Daniel Dunbar if (!Args.hasArg(options::OPT_dynamiclib)) { 1902a6d38494d18e260958e73bfe5e2b3f1dc4160459Daniel Dunbar AddDarwinArch(Args, CmdArgs); 1903a6d38494d18e260958e73bfe5e2b3f1dc4160459Daniel Dunbar // FIXME: Why do this only on this path? 19048917dd4457affb8750c81f08cbc21902a36cff26Daniel Dunbar Args.AddLastArg(CmdArgs, options::OPT_force__cpusubtype__ALL); 190502633b541b04ad5ffc1c70f4c2feeeb13e607057Daniel Dunbar 190602633b541b04ad5ffc1c70f4c2feeeb13e607057Daniel Dunbar Args.AddLastArg(CmdArgs, options::OPT_bundle); 190702633b541b04ad5ffc1c70f4c2feeeb13e607057Daniel Dunbar Args.AddAllArgs(CmdArgs, options::OPT_bundle__loader); 190802633b541b04ad5ffc1c70f4c2feeeb13e607057Daniel Dunbar Args.AddAllArgs(CmdArgs, options::OPT_client__name); 190902633b541b04ad5ffc1c70f4c2feeeb13e607057Daniel Dunbar 191002633b541b04ad5ffc1c70f4c2feeeb13e607057Daniel Dunbar Arg *A; 191102633b541b04ad5ffc1c70f4c2feeeb13e607057Daniel Dunbar if ((A = Args.getLastArg(options::OPT_compatibility__version)) || 191202633b541b04ad5ffc1c70f4c2feeeb13e607057Daniel Dunbar (A = Args.getLastArg(options::OPT_current__version)) || 191302633b541b04ad5ffc1c70f4c2feeeb13e607057Daniel Dunbar (A = Args.getLastArg(options::OPT_install__name))) 191402633b541b04ad5ffc1c70f4c2feeeb13e607057Daniel Dunbar D.Diag(clang::diag::err_drv_argument_only_allowed_with) 191502633b541b04ad5ffc1c70f4c2feeeb13e607057Daniel Dunbar << A->getAsString(Args) << "-dynamiclib"; 191602633b541b04ad5ffc1c70f4c2feeeb13e607057Daniel Dunbar 191702633b541b04ad5ffc1c70f4c2feeeb13e607057Daniel Dunbar Args.AddLastArg(CmdArgs, options::OPT_force__flat__namespace); 191802633b541b04ad5ffc1c70f4c2feeeb13e607057Daniel Dunbar Args.AddLastArg(CmdArgs, options::OPT_keep__private__externs); 191902633b541b04ad5ffc1c70f4c2feeeb13e607057Daniel Dunbar Args.AddLastArg(CmdArgs, options::OPT_private__bundle); 192002633b541b04ad5ffc1c70f4c2feeeb13e607057Daniel Dunbar } else { 192102633b541b04ad5ffc1c70f4c2feeeb13e607057Daniel Dunbar CmdArgs.push_back("-dylib"); 192202633b541b04ad5ffc1c70f4c2feeeb13e607057Daniel Dunbar 192302633b541b04ad5ffc1c70f4c2feeeb13e607057Daniel Dunbar Arg *A; 192402633b541b04ad5ffc1c70f4c2feeeb13e607057Daniel Dunbar if ((A = Args.getLastArg(options::OPT_bundle)) || 192502633b541b04ad5ffc1c70f4c2feeeb13e607057Daniel Dunbar (A = Args.getLastArg(options::OPT_bundle__loader)) || 192602633b541b04ad5ffc1c70f4c2feeeb13e607057Daniel Dunbar (A = Args.getLastArg(options::OPT_client__name)) || 192702633b541b04ad5ffc1c70f4c2feeeb13e607057Daniel Dunbar (A = Args.getLastArg(options::OPT_force__flat__namespace)) || 192802633b541b04ad5ffc1c70f4c2feeeb13e607057Daniel Dunbar (A = Args.getLastArg(options::OPT_keep__private__externs)) || 192902633b541b04ad5ffc1c70f4c2feeeb13e607057Daniel Dunbar (A = Args.getLastArg(options::OPT_private__bundle))) 193002633b541b04ad5ffc1c70f4c2feeeb13e607057Daniel Dunbar D.Diag(clang::diag::err_drv_argument_not_allowed_with) 193102633b541b04ad5ffc1c70f4c2feeeb13e607057Daniel Dunbar << A->getAsString(Args) << "-dynamiclib"; 1932c21c485b4fb58ef5d55cf3e523263dd824a2ace4Daniel Dunbar 193302633b541b04ad5ffc1c70f4c2feeeb13e607057Daniel Dunbar Args.AddAllArgsTranslated(CmdArgs, options::OPT_compatibility__version, 193402633b541b04ad5ffc1c70f4c2feeeb13e607057Daniel Dunbar "-dylib_compatibility_version"); 193502633b541b04ad5ffc1c70f4c2feeeb13e607057Daniel Dunbar Args.AddAllArgsTranslated(CmdArgs, options::OPT_current__version, 193602633b541b04ad5ffc1c70f4c2feeeb13e607057Daniel Dunbar "-dylib_current_version"); 193702633b541b04ad5ffc1c70f4c2feeeb13e607057Daniel Dunbar 1938a6d38494d18e260958e73bfe5e2b3f1dc4160459Daniel Dunbar AddDarwinArch(Args, CmdArgs); 193902633b541b04ad5ffc1c70f4c2feeeb13e607057Daniel Dunbar 194002633b541b04ad5ffc1c70f4c2feeeb13e607057Daniel Dunbar Args.AddAllArgsTranslated(CmdArgs, options::OPT_install__name, 194102633b541b04ad5ffc1c70f4c2feeeb13e607057Daniel Dunbar "-dylib_install_name"); 194202633b541b04ad5ffc1c70f4c2feeeb13e607057Daniel Dunbar } 194302633b541b04ad5ffc1c70f4c2feeeb13e607057Daniel Dunbar 194402633b541b04ad5ffc1c70f4c2feeeb13e607057Daniel Dunbar Args.AddLastArg(CmdArgs, options::OPT_all__load); 194502633b541b04ad5ffc1c70f4c2feeeb13e607057Daniel Dunbar Args.AddAllArgs(CmdArgs, options::OPT_allowable__client); 194602633b541b04ad5ffc1c70f4c2feeeb13e607057Daniel Dunbar Args.AddLastArg(CmdArgs, options::OPT_bind__at__load); 1947251ca6c9fb2bb398d9bf9fe7399c27bed7074b5cDaniel Dunbar if (getDarwinToolChain().isTargetIPhoneOS()) 1948d82f8fa53771b454885c546f0fd452a4980b3a3eDaniel Dunbar Args.AddLastArg(CmdArgs, options::OPT_arch__errors__fatal); 194902633b541b04ad5ffc1c70f4c2feeeb13e607057Daniel Dunbar Args.AddLastArg(CmdArgs, options::OPT_dead__strip); 195002633b541b04ad5ffc1c70f4c2feeeb13e607057Daniel Dunbar Args.AddLastArg(CmdArgs, options::OPT_no__dead__strip__inits__and__terms); 195102633b541b04ad5ffc1c70f4c2feeeb13e607057Daniel Dunbar Args.AddAllArgs(CmdArgs, options::OPT_dylib__file); 195202633b541b04ad5ffc1c70f4c2feeeb13e607057Daniel Dunbar Args.AddLastArg(CmdArgs, options::OPT_dynamic); 195302633b541b04ad5ffc1c70f4c2feeeb13e607057Daniel Dunbar Args.AddAllArgs(CmdArgs, options::OPT_exported__symbols__list); 195402633b541b04ad5ffc1c70f4c2feeeb13e607057Daniel Dunbar Args.AddLastArg(CmdArgs, options::OPT_flat__namespace); 195502633b541b04ad5ffc1c70f4c2feeeb13e607057Daniel Dunbar Args.AddAllArgs(CmdArgs, options::OPT_headerpad__max__install__names); 195602633b541b04ad5ffc1c70f4c2feeeb13e607057Daniel Dunbar Args.AddAllArgs(CmdArgs, options::OPT_image__base); 195702633b541b04ad5ffc1c70f4c2feeeb13e607057Daniel Dunbar Args.AddAllArgs(CmdArgs, options::OPT_init); 195802633b541b04ad5ffc1c70f4c2feeeb13e607057Daniel Dunbar 1959314cba02728c451c783b38bf6c00f220afb193c8Daniel Dunbar // Adding all arguments doesn't make sense here but this is what gcc does. One 1960314cba02728c451c783b38bf6c00f220afb193c8Daniel Dunbar // of this should always be present thanks to argument translation. 1961314cba02728c451c783b38bf6c00f220afb193c8Daniel Dunbar assert((Args.hasArg(options::OPT_mmacosx_version_min_EQ) || 1962314cba02728c451c783b38bf6c00f220afb193c8Daniel Dunbar Args.hasArg(options::OPT_miphoneos_version_min_EQ)) && 1963314cba02728c451c783b38bf6c00f220afb193c8Daniel Dunbar "Missing version argument (lost in translation)?"); 196430392de4681602f1aabc61b0184b1de53bc172f0Daniel Dunbar Args.AddAllArgsTranslated(CmdArgs, options::OPT_mmacosx_version_min_EQ, 1965294691eb1caf551083acd7b08630ef21c3fd760dDaniel Dunbar "-macosx_version_min"); 196602633b541b04ad5ffc1c70f4c2feeeb13e607057Daniel Dunbar Args.AddAllArgsTranslated(CmdArgs, options::OPT_miphoneos_version_min_EQ, 196702633b541b04ad5ffc1c70f4c2feeeb13e607057Daniel Dunbar "-iphoneos_version_min"); 196802633b541b04ad5ffc1c70f4c2feeeb13e607057Daniel Dunbar Args.AddLastArg(CmdArgs, options::OPT_nomultidefs); 196902633b541b04ad5ffc1c70f4c2feeeb13e607057Daniel Dunbar Args.AddLastArg(CmdArgs, options::OPT_multi__module); 197002633b541b04ad5ffc1c70f4c2feeeb13e607057Daniel Dunbar Args.AddLastArg(CmdArgs, options::OPT_single__module); 197102633b541b04ad5ffc1c70f4c2feeeb13e607057Daniel Dunbar Args.AddAllArgs(CmdArgs, options::OPT_multiply__defined); 197202633b541b04ad5ffc1c70f4c2feeeb13e607057Daniel Dunbar Args.AddAllArgs(CmdArgs, options::OPT_multiply__defined__unused); 1973c21c485b4fb58ef5d55cf3e523263dd824a2ace4Daniel Dunbar 197402633b541b04ad5ffc1c70f4c2feeeb13e607057Daniel Dunbar if (Args.hasArg(options::OPT_fpie)) 197502633b541b04ad5ffc1c70f4c2feeeb13e607057Daniel Dunbar CmdArgs.push_back("-pie"); 197602633b541b04ad5ffc1c70f4c2feeeb13e607057Daniel Dunbar 197702633b541b04ad5ffc1c70f4c2feeeb13e607057Daniel Dunbar Args.AddLastArg(CmdArgs, options::OPT_prebind); 197802633b541b04ad5ffc1c70f4c2feeeb13e607057Daniel Dunbar Args.AddLastArg(CmdArgs, options::OPT_noprebind); 197902633b541b04ad5ffc1c70f4c2feeeb13e607057Daniel Dunbar Args.AddLastArg(CmdArgs, options::OPT_nofixprebinding); 198002633b541b04ad5ffc1c70f4c2feeeb13e607057Daniel Dunbar Args.AddLastArg(CmdArgs, options::OPT_prebind__all__twolevel__modules); 198102633b541b04ad5ffc1c70f4c2feeeb13e607057Daniel Dunbar Args.AddLastArg(CmdArgs, options::OPT_read__only__relocs); 198202633b541b04ad5ffc1c70f4c2feeeb13e607057Daniel Dunbar Args.AddAllArgs(CmdArgs, options::OPT_sectcreate); 198302633b541b04ad5ffc1c70f4c2feeeb13e607057Daniel Dunbar Args.AddAllArgs(CmdArgs, options::OPT_sectorder); 198402633b541b04ad5ffc1c70f4c2feeeb13e607057Daniel Dunbar Args.AddAllArgs(CmdArgs, options::OPT_seg1addr); 198502633b541b04ad5ffc1c70f4c2feeeb13e607057Daniel Dunbar Args.AddAllArgs(CmdArgs, options::OPT_segprot); 198602633b541b04ad5ffc1c70f4c2feeeb13e607057Daniel Dunbar Args.AddAllArgs(CmdArgs, options::OPT_segaddr); 198702633b541b04ad5ffc1c70f4c2feeeb13e607057Daniel Dunbar Args.AddAllArgs(CmdArgs, options::OPT_segs__read__only__addr); 198802633b541b04ad5ffc1c70f4c2feeeb13e607057Daniel Dunbar Args.AddAllArgs(CmdArgs, options::OPT_segs__read__write__addr); 198902633b541b04ad5ffc1c70f4c2feeeb13e607057Daniel Dunbar Args.AddAllArgs(CmdArgs, options::OPT_seg__addr__table); 199002633b541b04ad5ffc1c70f4c2feeeb13e607057Daniel Dunbar Args.AddAllArgs(CmdArgs, options::OPT_seg__addr__table__filename); 199102633b541b04ad5ffc1c70f4c2feeeb13e607057Daniel Dunbar Args.AddAllArgs(CmdArgs, options::OPT_sub__library); 199202633b541b04ad5ffc1c70f4c2feeeb13e607057Daniel Dunbar Args.AddAllArgs(CmdArgs, options::OPT_sub__umbrella); 1993d82f8fa53771b454885c546f0fd452a4980b3a3eDaniel Dunbar 199402633b541b04ad5ffc1c70f4c2feeeb13e607057Daniel Dunbar Args.AddAllArgsTranslated(CmdArgs, options::OPT_isysroot, "-syslibroot"); 1995251ca6c9fb2bb398d9bf9fe7399c27bed7074b5cDaniel Dunbar if (getDarwinToolChain().isTargetIPhoneOS()) { 1996d82f8fa53771b454885c546f0fd452a4980b3a3eDaniel Dunbar if (!Args.hasArg(options::OPT_isysroot)) { 1997d82f8fa53771b454885c546f0fd452a4980b3a3eDaniel Dunbar CmdArgs.push_back("-syslibroot"); 1998d82f8fa53771b454885c546f0fd452a4980b3a3eDaniel Dunbar CmdArgs.push_back("/Developer/SDKs/Extra"); 1999d82f8fa53771b454885c546f0fd452a4980b3a3eDaniel Dunbar } 2000d82f8fa53771b454885c546f0fd452a4980b3a3eDaniel Dunbar } 2001d82f8fa53771b454885c546f0fd452a4980b3a3eDaniel Dunbar 200202633b541b04ad5ffc1c70f4c2feeeb13e607057Daniel Dunbar Args.AddLastArg(CmdArgs, options::OPT_twolevel__namespace); 200302633b541b04ad5ffc1c70f4c2feeeb13e607057Daniel Dunbar Args.AddLastArg(CmdArgs, options::OPT_twolevel__namespace__hints); 200402633b541b04ad5ffc1c70f4c2feeeb13e607057Daniel Dunbar Args.AddAllArgs(CmdArgs, options::OPT_umbrella); 200502633b541b04ad5ffc1c70f4c2feeeb13e607057Daniel Dunbar Args.AddAllArgs(CmdArgs, options::OPT_undefined); 200602633b541b04ad5ffc1c70f4c2feeeb13e607057Daniel Dunbar Args.AddAllArgs(CmdArgs, options::OPT_unexported__symbols__list); 2007d82f8fa53771b454885c546f0fd452a4980b3a3eDaniel Dunbar Args.AddAllArgs(CmdArgs, options::OPT_weak__reference__mismatches); 200802633b541b04ad5ffc1c70f4c2feeeb13e607057Daniel Dunbar Args.AddLastArg(CmdArgs, options::OPT_X_Flag); 200902633b541b04ad5ffc1c70f4c2feeeb13e607057Daniel Dunbar Args.AddAllArgs(CmdArgs, options::OPT_y); 201002633b541b04ad5ffc1c70f4c2feeeb13e607057Daniel Dunbar Args.AddLastArg(CmdArgs, options::OPT_w); 201102633b541b04ad5ffc1c70f4c2feeeb13e607057Daniel Dunbar Args.AddAllArgs(CmdArgs, options::OPT_pagezero__size); 201202633b541b04ad5ffc1c70f4c2feeeb13e607057Daniel Dunbar Args.AddAllArgs(CmdArgs, options::OPT_segs__read__); 201302633b541b04ad5ffc1c70f4c2feeeb13e607057Daniel Dunbar Args.AddLastArg(CmdArgs, options::OPT_seglinkedit); 201402633b541b04ad5ffc1c70f4c2feeeb13e607057Daniel Dunbar Args.AddLastArg(CmdArgs, options::OPT_noseglinkedit); 201502633b541b04ad5ffc1c70f4c2feeeb13e607057Daniel Dunbar Args.AddAllArgs(CmdArgs, options::OPT_sectalign); 201602633b541b04ad5ffc1c70f4c2feeeb13e607057Daniel Dunbar Args.AddAllArgs(CmdArgs, options::OPT_sectobjectsymbols); 201702633b541b04ad5ffc1c70f4c2feeeb13e607057Daniel Dunbar Args.AddAllArgs(CmdArgs, options::OPT_segcreate); 201802633b541b04ad5ffc1c70f4c2feeeb13e607057Daniel Dunbar Args.AddLastArg(CmdArgs, options::OPT_whyload); 201902633b541b04ad5ffc1c70f4c2feeeb13e607057Daniel Dunbar Args.AddLastArg(CmdArgs, options::OPT_whatsloaded); 202002633b541b04ad5ffc1c70f4c2feeeb13e607057Daniel Dunbar Args.AddAllArgs(CmdArgs, options::OPT_dylinker__install__name); 202102633b541b04ad5ffc1c70f4c2feeeb13e607057Daniel Dunbar Args.AddLastArg(CmdArgs, options::OPT_dylinker); 202202633b541b04ad5ffc1c70f4c2feeeb13e607057Daniel Dunbar Args.AddLastArg(CmdArgs, options::OPT_Mach); 202302633b541b04ad5ffc1c70f4c2feeeb13e607057Daniel Dunbar} 202402633b541b04ad5ffc1c70f4c2feeeb13e607057Daniel Dunbar 202502633b541b04ad5ffc1c70f4c2feeeb13e607057Daniel Dunbarvoid darwin::Link::ConstructJob(Compilation &C, const JobAction &JA, 2026c21c485b4fb58ef5d55cf3e523263dd824a2ace4Daniel Dunbar Job &Dest, const InputInfo &Output, 2027c21c485b4fb58ef5d55cf3e523263dd824a2ace4Daniel Dunbar const InputInfoList &Inputs, 2028c21c485b4fb58ef5d55cf3e523263dd824a2ace4Daniel Dunbar const ArgList &Args, 202902633b541b04ad5ffc1c70f4c2feeeb13e607057Daniel Dunbar const char *LinkingOutput) const { 203002633b541b04ad5ffc1c70f4c2feeeb13e607057Daniel Dunbar assert(Output.getType() == types::TY_Image && "Invalid linker output type."); 2031e0be8b1729d8978de433d229c065830b95d0ae68Daniel Dunbar 203202633b541b04ad5ffc1c70f4c2feeeb13e607057Daniel Dunbar // The logic here is derived from gcc's behavior; most of which 203302633b541b04ad5ffc1c70f4c2feeeb13e607057Daniel Dunbar // comes from specs (starting with link_command). Consult gcc for 203402633b541b04ad5ffc1c70f4c2feeeb13e607057Daniel Dunbar // more information. 203502633b541b04ad5ffc1c70f4c2feeeb13e607057Daniel Dunbar ArgStringList CmdArgs; 203602633b541b04ad5ffc1c70f4c2feeeb13e607057Daniel Dunbar 203702633b541b04ad5ffc1c70f4c2feeeb13e607057Daniel Dunbar // I'm not sure why this particular decomposition exists in gcc, but 203802633b541b04ad5ffc1c70f4c2feeeb13e607057Daniel Dunbar // we follow suite for ease of comparison. 203902633b541b04ad5ffc1c70f4c2feeeb13e607057Daniel Dunbar AddLinkArgs(Args, CmdArgs); 204002633b541b04ad5ffc1c70f4c2feeeb13e607057Daniel Dunbar 204102633b541b04ad5ffc1c70f4c2feeeb13e607057Daniel Dunbar Args.AddAllArgs(CmdArgs, options::OPT_d_Flag); 204202633b541b04ad5ffc1c70f4c2feeeb13e607057Daniel Dunbar Args.AddAllArgs(CmdArgs, options::OPT_s); 204302633b541b04ad5ffc1c70f4c2feeeb13e607057Daniel Dunbar Args.AddAllArgs(CmdArgs, options::OPT_t); 204402633b541b04ad5ffc1c70f4c2feeeb13e607057Daniel Dunbar Args.AddAllArgs(CmdArgs, options::OPT_Z_Flag); 204502633b541b04ad5ffc1c70f4c2feeeb13e607057Daniel Dunbar Args.AddAllArgs(CmdArgs, options::OPT_u_Group); 204602633b541b04ad5ffc1c70f4c2feeeb13e607057Daniel Dunbar Args.AddAllArgs(CmdArgs, options::OPT_A); 204702633b541b04ad5ffc1c70f4c2feeeb13e607057Daniel Dunbar Args.AddLastArg(CmdArgs, options::OPT_e); 204802633b541b04ad5ffc1c70f4c2feeeb13e607057Daniel Dunbar Args.AddAllArgs(CmdArgs, options::OPT_m_Separate); 204902633b541b04ad5ffc1c70f4c2feeeb13e607057Daniel Dunbar Args.AddAllArgs(CmdArgs, options::OPT_r); 205002633b541b04ad5ffc1c70f4c2feeeb13e607057Daniel Dunbar 205102633b541b04ad5ffc1c70f4c2feeeb13e607057Daniel Dunbar CmdArgs.push_back("-o"); 205202633b541b04ad5ffc1c70f4c2feeeb13e607057Daniel Dunbar CmdArgs.push_back(Output.getFilename()); 205302633b541b04ad5ffc1c70f4c2feeeb13e607057Daniel Dunbar 205402633b541b04ad5ffc1c70f4c2feeeb13e607057Daniel Dunbar if (!Args.hasArg(options::OPT_A) && 205502633b541b04ad5ffc1c70f4c2feeeb13e607057Daniel Dunbar !Args.hasArg(options::OPT_nostdlib) && 205602633b541b04ad5ffc1c70f4c2feeeb13e607057Daniel Dunbar !Args.hasArg(options::OPT_nostartfiles)) { 205702633b541b04ad5ffc1c70f4c2feeeb13e607057Daniel Dunbar // Derived from startfile spec. 205802633b541b04ad5ffc1c70f4c2feeeb13e607057Daniel Dunbar if (Args.hasArg(options::OPT_dynamiclib)) { 2059c21c485b4fb58ef5d55cf3e523263dd824a2ace4Daniel Dunbar // Derived from darwin_dylib1 spec. 2060cacb0f007001f7463d44ebd5dde7bfaecf876a71Daniel Dunbar if (getDarwinToolChain().isTargetIPhoneOS()) { 2061cacb0f007001f7463d44ebd5dde7bfaecf876a71Daniel Dunbar if (getDarwinToolChain().isIPhoneOSVersionLT(3, 1)) 2062cacb0f007001f7463d44ebd5dde7bfaecf876a71Daniel Dunbar CmdArgs.push_back("-ldylib1.o"); 2063cacb0f007001f7463d44ebd5dde7bfaecf876a71Daniel Dunbar } else { 2064ce3fdf233353b10f20d74dceda3d77a82285de17Daniel Dunbar if (getDarwinToolChain().isMacosxVersionLT(10, 5)) 2065cacb0f007001f7463d44ebd5dde7bfaecf876a71Daniel Dunbar CmdArgs.push_back("-ldylib1.o"); 2066ce3fdf233353b10f20d74dceda3d77a82285de17Daniel Dunbar else if (getDarwinToolChain().isMacosxVersionLT(10, 6)) 2067cacb0f007001f7463d44ebd5dde7bfaecf876a71Daniel Dunbar CmdArgs.push_back("-ldylib1.10.5.o"); 2068cacb0f007001f7463d44ebd5dde7bfaecf876a71Daniel Dunbar } 206902633b541b04ad5ffc1c70f4c2feeeb13e607057Daniel Dunbar } else { 207002633b541b04ad5ffc1c70f4c2feeeb13e607057Daniel Dunbar if (Args.hasArg(options::OPT_bundle)) { 20718a8d8afa3df40e9f122d2b826f1a825a66f6908dDaniel Dunbar if (!Args.hasArg(options::OPT_static)) { 20728a8d8afa3df40e9f122d2b826f1a825a66f6908dDaniel Dunbar // Derived from darwin_bundle1 spec. 2073cacb0f007001f7463d44ebd5dde7bfaecf876a71Daniel Dunbar if (getDarwinToolChain().isTargetIPhoneOS()) { 2074cacb0f007001f7463d44ebd5dde7bfaecf876a71Daniel Dunbar if (getDarwinToolChain().isIPhoneOSVersionLT(3, 1)) 2075cacb0f007001f7463d44ebd5dde7bfaecf876a71Daniel Dunbar CmdArgs.push_back("-lbundle1.o"); 2076cacb0f007001f7463d44ebd5dde7bfaecf876a71Daniel Dunbar } else { 2077ce3fdf233353b10f20d74dceda3d77a82285de17Daniel Dunbar if (getDarwinToolChain().isMacosxVersionLT(10, 6)) 2078cacb0f007001f7463d44ebd5dde7bfaecf876a71Daniel Dunbar CmdArgs.push_back("-lbundle1.o"); 2079cacb0f007001f7463d44ebd5dde7bfaecf876a71Daniel Dunbar } 20808a8d8afa3df40e9f122d2b826f1a825a66f6908dDaniel Dunbar } 208102633b541b04ad5ffc1c70f4c2feeeb13e607057Daniel Dunbar } else { 208202633b541b04ad5ffc1c70f4c2feeeb13e607057Daniel Dunbar if (Args.hasArg(options::OPT_pg)) { 208302633b541b04ad5ffc1c70f4c2feeeb13e607057Daniel Dunbar if (Args.hasArg(options::OPT_static) || 208402633b541b04ad5ffc1c70f4c2feeeb13e607057Daniel Dunbar Args.hasArg(options::OPT_object) || 208502633b541b04ad5ffc1c70f4c2feeeb13e607057Daniel Dunbar Args.hasArg(options::OPT_preload)) { 208602633b541b04ad5ffc1c70f4c2feeeb13e607057Daniel Dunbar CmdArgs.push_back("-lgcrt0.o"); 208702633b541b04ad5ffc1c70f4c2feeeb13e607057Daniel Dunbar } else { 208802633b541b04ad5ffc1c70f4c2feeeb13e607057Daniel Dunbar CmdArgs.push_back("-lgcrt1.o"); 2089c21c485b4fb58ef5d55cf3e523263dd824a2ace4Daniel Dunbar 209002633b541b04ad5ffc1c70f4c2feeeb13e607057Daniel Dunbar // darwin_crt2 spec is empty. 2091c21c485b4fb58ef5d55cf3e523263dd824a2ace4Daniel Dunbar } 209202633b541b04ad5ffc1c70f4c2feeeb13e607057Daniel Dunbar } else { 209302633b541b04ad5ffc1c70f4c2feeeb13e607057Daniel Dunbar if (Args.hasArg(options::OPT_static) || 209402633b541b04ad5ffc1c70f4c2feeeb13e607057Daniel Dunbar Args.hasArg(options::OPT_object) || 209502633b541b04ad5ffc1c70f4c2feeeb13e607057Daniel Dunbar Args.hasArg(options::OPT_preload)) { 209602633b541b04ad5ffc1c70f4c2feeeb13e607057Daniel Dunbar CmdArgs.push_back("-lcrt0.o"); 209702633b541b04ad5ffc1c70f4c2feeeb13e607057Daniel Dunbar } else { 209802633b541b04ad5ffc1c70f4c2feeeb13e607057Daniel Dunbar // Derived from darwin_crt1 spec. 2099251ca6c9fb2bb398d9bf9fe7399c27bed7074b5cDaniel Dunbar if (getDarwinToolChain().isTargetIPhoneOS()) { 2100cacb0f007001f7463d44ebd5dde7bfaecf876a71Daniel Dunbar if (getDarwinToolChain().isIPhoneOSVersionLT(3, 1)) 2101cacb0f007001f7463d44ebd5dde7bfaecf876a71Daniel Dunbar CmdArgs.push_back("-lcrt1.o"); 2102cacb0f007001f7463d44ebd5dde7bfaecf876a71Daniel Dunbar else 2103cacb0f007001f7463d44ebd5dde7bfaecf876a71Daniel Dunbar CmdArgs.push_back("-lcrt1.3.1.o"); 2104ce3fdf233353b10f20d74dceda3d77a82285de17Daniel Dunbar } else { 2105ce3fdf233353b10f20d74dceda3d77a82285de17Daniel Dunbar if (getDarwinToolChain().isMacosxVersionLT(10, 5)) 2106ce3fdf233353b10f20d74dceda3d77a82285de17Daniel Dunbar CmdArgs.push_back("-lcrt1.o"); 2107ce3fdf233353b10f20d74dceda3d77a82285de17Daniel Dunbar else if (getDarwinToolChain().isMacosxVersionLT(10, 6)) 2108ce3fdf233353b10f20d74dceda3d77a82285de17Daniel Dunbar CmdArgs.push_back("-lcrt1.10.5.o"); 2109ce3fdf233353b10f20d74dceda3d77a82285de17Daniel Dunbar else 2110ce3fdf233353b10f20d74dceda3d77a82285de17Daniel Dunbar CmdArgs.push_back("-lcrt1.10.6.o"); 2111c21c485b4fb58ef5d55cf3e523263dd824a2ace4Daniel Dunbar 2112ce3fdf233353b10f20d74dceda3d77a82285de17Daniel Dunbar // darwin_crt2 spec is empty. 2113ce3fdf233353b10f20d74dceda3d77a82285de17Daniel Dunbar } 211402633b541b04ad5ffc1c70f4c2feeeb13e607057Daniel Dunbar } 211502633b541b04ad5ffc1c70f4c2feeeb13e607057Daniel Dunbar } 211602633b541b04ad5ffc1c70f4c2feeeb13e607057Daniel Dunbar } 211702633b541b04ad5ffc1c70f4c2feeeb13e607057Daniel Dunbar } 211802633b541b04ad5ffc1c70f4c2feeeb13e607057Daniel Dunbar 2119ce3fdf233353b10f20d74dceda3d77a82285de17Daniel Dunbar if (!getDarwinToolChain().isTargetIPhoneOS() && 2120ce3fdf233353b10f20d74dceda3d77a82285de17Daniel Dunbar Args.hasArg(options::OPT_shared_libgcc) && 2121ce3fdf233353b10f20d74dceda3d77a82285de17Daniel Dunbar getDarwinToolChain().isMacosxVersionLT(10, 5)) { 2122881376467c46c5c6cc16fa6790271c2c22e1d4f1Daniel Dunbar const char *Str = 21235ed34f4c58b6ad4e21038d713c1fae31a6146ff5Daniel Dunbar Args.MakeArgString(getToolChain().GetFilePath(C, "crt3.o")); 2124881376467c46c5c6cc16fa6790271c2c22e1d4f1Daniel Dunbar CmdArgs.push_back(Str); 212502633b541b04ad5ffc1c70f4c2feeeb13e607057Daniel Dunbar } 212602633b541b04ad5ffc1c70f4c2feeeb13e607057Daniel Dunbar } 212702633b541b04ad5ffc1c70f4c2feeeb13e607057Daniel Dunbar 212802633b541b04ad5ffc1c70f4c2feeeb13e607057Daniel Dunbar Args.AddAllArgs(CmdArgs, options::OPT_L); 2129c21c485b4fb58ef5d55cf3e523263dd824a2ace4Daniel Dunbar 213002633b541b04ad5ffc1c70f4c2feeeb13e607057Daniel Dunbar if (Args.hasArg(options::OPT_fopenmp)) 213102633b541b04ad5ffc1c70f4c2feeeb13e607057Daniel Dunbar // This is more complicated in gcc... 213202633b541b04ad5ffc1c70f4c2feeeb13e607057Daniel Dunbar CmdArgs.push_back("-lgomp"); 213302633b541b04ad5ffc1c70f4c2feeeb13e607057Daniel Dunbar 21346b200b2b698b6ac9e310f2225c69c85d28ae4fb0Daniel Dunbar getDarwinToolChain().AddLinkSearchPathArgs(Args, CmdArgs); 2135c21c485b4fb58ef5d55cf3e523263dd824a2ace4Daniel Dunbar 213602633b541b04ad5ffc1c70f4c2feeeb13e607057Daniel Dunbar for (InputInfoList::const_iterator 213702633b541b04ad5ffc1c70f4c2feeeb13e607057Daniel Dunbar it = Inputs.begin(), ie = Inputs.end(); it != ie; ++it) { 213802633b541b04ad5ffc1c70f4c2feeeb13e607057Daniel Dunbar const InputInfo &II = *it; 213902633b541b04ad5ffc1c70f4c2feeeb13e607057Daniel Dunbar if (II.isFilename()) 214002633b541b04ad5ffc1c70f4c2feeeb13e607057Daniel Dunbar CmdArgs.push_back(II.getFilename()); 2141c21c485b4fb58ef5d55cf3e523263dd824a2ace4Daniel Dunbar else 214202633b541b04ad5ffc1c70f4c2feeeb13e607057Daniel Dunbar II.getInputArg().renderAsInput(Args, CmdArgs); 214302633b541b04ad5ffc1c70f4c2feeeb13e607057Daniel Dunbar } 214402633b541b04ad5ffc1c70f4c2feeeb13e607057Daniel Dunbar 214502633b541b04ad5ffc1c70f4c2feeeb13e607057Daniel Dunbar if (LinkingOutput) { 214602633b541b04ad5ffc1c70f4c2feeeb13e607057Daniel Dunbar CmdArgs.push_back("-arch_multiple"); 214702633b541b04ad5ffc1c70f4c2feeeb13e607057Daniel Dunbar CmdArgs.push_back("-final_output"); 214802633b541b04ad5ffc1c70f4c2feeeb13e607057Daniel Dunbar CmdArgs.push_back(LinkingOutput); 214902633b541b04ad5ffc1c70f4c2feeeb13e607057Daniel Dunbar } 215002633b541b04ad5ffc1c70f4c2feeeb13e607057Daniel Dunbar 215102633b541b04ad5ffc1c70f4c2feeeb13e607057Daniel Dunbar if (Args.hasArg(options::OPT_fprofile_arcs) || 215202633b541b04ad5ffc1c70f4c2feeeb13e607057Daniel Dunbar Args.hasArg(options::OPT_fprofile_generate) || 215302633b541b04ad5ffc1c70f4c2feeeb13e607057Daniel Dunbar Args.hasArg(options::OPT_fcreate_profile) || 215402633b541b04ad5ffc1c70f4c2feeeb13e607057Daniel Dunbar Args.hasArg(options::OPT_coverage)) 215502633b541b04ad5ffc1c70f4c2feeeb13e607057Daniel Dunbar CmdArgs.push_back("-lgcov"); 2156c21c485b4fb58ef5d55cf3e523263dd824a2ace4Daniel Dunbar 215702633b541b04ad5ffc1c70f4c2feeeb13e607057Daniel Dunbar if (Args.hasArg(options::OPT_fnested_functions)) 215802633b541b04ad5ffc1c70f4c2feeeb13e607057Daniel Dunbar CmdArgs.push_back("-allow_stack_execute"); 2159c21c485b4fb58ef5d55cf3e523263dd824a2ace4Daniel Dunbar 216002633b541b04ad5ffc1c70f4c2feeeb13e607057Daniel Dunbar if (!Args.hasArg(options::OPT_nostdlib) && 216102633b541b04ad5ffc1c70f4c2feeeb13e607057Daniel Dunbar !Args.hasArg(options::OPT_nodefaultlibs)) { 2162edfa02b85b186e9ea9e0c841539a77ed32ee9148Daniel Dunbar // FIXME: g++ is more complicated here, it tries to put -lstdc++ 2163edfa02b85b186e9ea9e0c841539a77ed32ee9148Daniel Dunbar // before -lm, for example. 2164ee788e70fcd0adf76103b17c78ac658d4ea30c9bDaniel Dunbar if (getToolChain().getDriver().CCCIsCXX) 2165edfa02b85b186e9ea9e0c841539a77ed32ee9148Daniel Dunbar CmdArgs.push_back("-lstdc++"); 2166edfa02b85b186e9ea9e0c841539a77ed32ee9148Daniel Dunbar 216702633b541b04ad5ffc1c70f4c2feeeb13e607057Daniel Dunbar // link_ssp spec is empty. 216802633b541b04ad5ffc1c70f4c2feeeb13e607057Daniel Dunbar 21696cd4154b9088fa18ae05d11c0f3140fafd76c734Daniel Dunbar // Let the tool chain choose which runtime library to link. 21706cd4154b9088fa18ae05d11c0f3140fafd76c734Daniel Dunbar getDarwinToolChain().AddLinkRuntimeLibArgs(Args, CmdArgs); 217102633b541b04ad5ffc1c70f4c2feeeb13e607057Daniel Dunbar } 217202633b541b04ad5ffc1c70f4c2feeeb13e607057Daniel Dunbar 217302633b541b04ad5ffc1c70f4c2feeeb13e607057Daniel Dunbar if (!Args.hasArg(options::OPT_A) && 217402633b541b04ad5ffc1c70f4c2feeeb13e607057Daniel Dunbar !Args.hasArg(options::OPT_nostdlib) && 217502633b541b04ad5ffc1c70f4c2feeeb13e607057Daniel Dunbar !Args.hasArg(options::OPT_nostartfiles)) { 217602633b541b04ad5ffc1c70f4c2feeeb13e607057Daniel Dunbar // endfile_spec is empty. 217702633b541b04ad5ffc1c70f4c2feeeb13e607057Daniel Dunbar } 217802633b541b04ad5ffc1c70f4c2feeeb13e607057Daniel Dunbar 217902633b541b04ad5ffc1c70f4c2feeeb13e607057Daniel Dunbar Args.AddAllArgs(CmdArgs, options::OPT_T_Group); 218002633b541b04ad5ffc1c70f4c2feeeb13e607057Daniel Dunbar Args.AddAllArgs(CmdArgs, options::OPT_F); 218102633b541b04ad5ffc1c70f4c2feeeb13e607057Daniel Dunbar 2182c21c485b4fb58ef5d55cf3e523263dd824a2ace4Daniel Dunbar const char *Exec = 21835ed34f4c58b6ad4e21038d713c1fae31a6146ff5Daniel Dunbar Args.MakeArgString(getToolChain().GetProgramPath(C, "ld")); 2184daab7b1016f0a82fefa4f7be6e63c57c06b19ffcDaniel Dunbar Dest.addCommand(new Command(JA, *this, Exec, CmdArgs)); 218502633b541b04ad5ffc1c70f4c2feeeb13e607057Daniel Dunbar 21860b46e1b5389615a8d6641f4d7bf5415d29acfef3Daniel Dunbar // Find the first non-empty base input (we want to ignore linker 21870b46e1b5389615a8d6641f4d7bf5415d29acfef3Daniel Dunbar // inputs). 21880b46e1b5389615a8d6641f4d7bf5415d29acfef3Daniel Dunbar const char *BaseInput = ""; 21890b46e1b5389615a8d6641f4d7bf5415d29acfef3Daniel Dunbar for (unsigned i = 0, e = Inputs.size(); i != e; ++i) { 21900b46e1b5389615a8d6641f4d7bf5415d29acfef3Daniel Dunbar if (Inputs[i].getBaseInput()[0] != '\0') { 21910b46e1b5389615a8d6641f4d7bf5415d29acfef3Daniel Dunbar BaseInput = Inputs[i].getBaseInput(); 21920b46e1b5389615a8d6641f4d7bf5415d29acfef3Daniel Dunbar break; 21930b46e1b5389615a8d6641f4d7bf5415d29acfef3Daniel Dunbar } 21940b46e1b5389615a8d6641f4d7bf5415d29acfef3Daniel Dunbar } 2195c21c485b4fb58ef5d55cf3e523263dd824a2ace4Daniel Dunbar 21963ed294522653323e4867a2eba03acc98a99e5479Daniel Dunbar // Run dsymutil if we are making an executable in a single step. 21973ed294522653323e4867a2eba03acc98a99e5479Daniel Dunbar // 21983ed294522653323e4867a2eba03acc98a99e5479Daniel Dunbar // FIXME: Currently we don't want to do this when we are part of a 21993ed294522653323e4867a2eba03acc98a99e5479Daniel Dunbar // universal build step, as this would end up creating stray temp 22003ed294522653323e4867a2eba03acc98a99e5479Daniel Dunbar // files. 22013ed294522653323e4867a2eba03acc98a99e5479Daniel Dunbar if (!LinkingOutput && 22023ed294522653323e4867a2eba03acc98a99e5479Daniel Dunbar Args.getLastArg(options::OPT_g_Group) && 220302633b541b04ad5ffc1c70f4c2feeeb13e607057Daniel Dunbar !Args.getLastArg(options::OPT_gstabs) && 220402633b541b04ad5ffc1c70f4c2feeeb13e607057Daniel Dunbar !Args.getLastArg(options::OPT_g0)) { 220502633b541b04ad5ffc1c70f4c2feeeb13e607057Daniel Dunbar // FIXME: This is gross, but matches gcc. The test only considers 220602633b541b04ad5ffc1c70f4c2feeeb13e607057Daniel Dunbar // the suffix (not the -x type), and then only of the first 22070b46e1b5389615a8d6641f4d7bf5415d29acfef3Daniel Dunbar // source input. Awesome. 22080b46e1b5389615a8d6641f4d7bf5415d29acfef3Daniel Dunbar const char *Suffix = strrchr(BaseInput, '.'); 220902633b541b04ad5ffc1c70f4c2feeeb13e607057Daniel Dunbar if (Suffix && isSourceSuffix(Suffix + 1)) { 2210c21c485b4fb58ef5d55cf3e523263dd824a2ace4Daniel Dunbar const char *Exec = 22115ed34f4c58b6ad4e21038d713c1fae31a6146ff5Daniel Dunbar Args.MakeArgString(getToolChain().GetProgramPath(C, "dsymutil")); 221202633b541b04ad5ffc1c70f4c2feeeb13e607057Daniel Dunbar ArgStringList CmdArgs; 221302633b541b04ad5ffc1c70f4c2feeeb13e607057Daniel Dunbar CmdArgs.push_back(Output.getFilename()); 2214daab7b1016f0a82fefa4f7be6e63c57c06b19ffcDaniel Dunbar C.getJobs().addCommand(new Command(JA, *this, Exec, CmdArgs)); 221502633b541b04ad5ffc1c70f4c2feeeb13e607057Daniel Dunbar } 221602633b541b04ad5ffc1c70f4c2feeeb13e607057Daniel Dunbar } 221702633b541b04ad5ffc1c70f4c2feeeb13e607057Daniel Dunbar} 221802633b541b04ad5ffc1c70f4c2feeeb13e607057Daniel Dunbar 2219ff7488dc9a766f94daf54d81b03ab9160d0bfd88Daniel Dunbarvoid darwin::Lipo::ConstructJob(Compilation &C, const JobAction &JA, 2220c21c485b4fb58ef5d55cf3e523263dd824a2ace4Daniel Dunbar Job &Dest, const InputInfo &Output, 2221c21c485b4fb58ef5d55cf3e523263dd824a2ace4Daniel Dunbar const InputInfoList &Inputs, 2222c21c485b4fb58ef5d55cf3e523263dd824a2ace4Daniel Dunbar const ArgList &Args, 2223ff7488dc9a766f94daf54d81b03ab9160d0bfd88Daniel Dunbar const char *LinkingOutput) const { 2224ff7488dc9a766f94daf54d81b03ab9160d0bfd88Daniel Dunbar ArgStringList CmdArgs; 2225ff7488dc9a766f94daf54d81b03ab9160d0bfd88Daniel Dunbar 2226ff7488dc9a766f94daf54d81b03ab9160d0bfd88Daniel Dunbar CmdArgs.push_back("-create"); 2227ff7488dc9a766f94daf54d81b03ab9160d0bfd88Daniel Dunbar assert(Output.isFilename() && "Unexpected lipo output."); 2228a428df828ea4cc6916ea90dcd9fbbc840776d207Daniel Dunbar 2229a428df828ea4cc6916ea90dcd9fbbc840776d207Daniel Dunbar CmdArgs.push_back("-output"); 2230ff7488dc9a766f94daf54d81b03ab9160d0bfd88Daniel Dunbar CmdArgs.push_back(Output.getFilename()); 2231a428df828ea4cc6916ea90dcd9fbbc840776d207Daniel Dunbar 2232ff7488dc9a766f94daf54d81b03ab9160d0bfd88Daniel Dunbar for (InputInfoList::const_iterator 2233ff7488dc9a766f94daf54d81b03ab9160d0bfd88Daniel Dunbar it = Inputs.begin(), ie = Inputs.end(); it != ie; ++it) { 2234ff7488dc9a766f94daf54d81b03ab9160d0bfd88Daniel Dunbar const InputInfo &II = *it; 2235ff7488dc9a766f94daf54d81b03ab9160d0bfd88Daniel Dunbar assert(II.isFilename() && "Unexpected lipo input."); 2236ff7488dc9a766f94daf54d81b03ab9160d0bfd88Daniel Dunbar CmdArgs.push_back(II.getFilename()); 2237ff7488dc9a766f94daf54d81b03ab9160d0bfd88Daniel Dunbar } 2238c21c485b4fb58ef5d55cf3e523263dd824a2ace4Daniel Dunbar const char *Exec = 22395ed34f4c58b6ad4e21038d713c1fae31a6146ff5Daniel Dunbar Args.MakeArgString(getToolChain().GetProgramPath(C, "lipo")); 2240daab7b1016f0a82fefa4f7be6e63c57c06b19ffcDaniel Dunbar Dest.addCommand(new Command(JA, *this, Exec, CmdArgs)); 2241ff7488dc9a766f94daf54d81b03ab9160d0bfd88Daniel Dunbar} 224268a31d406c6dc4382c700d1199b062de2aa7e1daDaniel Dunbar 2243e7925a075f110ab21afeae084670a155dea568e3Edward O'Callaghanvoid auroraux::Assemble::ConstructJob(Compilation &C, const JobAction &JA, 2244294691eb1caf551083acd7b08630ef21c3fd760dDaniel Dunbar Job &Dest, const InputInfo &Output, 2245294691eb1caf551083acd7b08630ef21c3fd760dDaniel Dunbar const InputInfoList &Inputs, 2246294691eb1caf551083acd7b08630ef21c3fd760dDaniel Dunbar const ArgList &Args, 2247294691eb1caf551083acd7b08630ef21c3fd760dDaniel Dunbar const char *LinkingOutput) const { 2248e7925a075f110ab21afeae084670a155dea568e3Edward O'Callaghan ArgStringList CmdArgs; 2249e7925a075f110ab21afeae084670a155dea568e3Edward O'Callaghan 2250e7925a075f110ab21afeae084670a155dea568e3Edward O'Callaghan Args.AddAllArgValues(CmdArgs, options::OPT_Wa_COMMA, 2251e7925a075f110ab21afeae084670a155dea568e3Edward O'Callaghan options::OPT_Xassembler); 2252e7925a075f110ab21afeae084670a155dea568e3Edward O'Callaghan 2253e7925a075f110ab21afeae084670a155dea568e3Edward O'Callaghan CmdArgs.push_back("-o"); 2254e7925a075f110ab21afeae084670a155dea568e3Edward O'Callaghan if (Output.isPipe()) 2255e7925a075f110ab21afeae084670a155dea568e3Edward O'Callaghan CmdArgs.push_back("-"); 2256e7925a075f110ab21afeae084670a155dea568e3Edward O'Callaghan else 2257e7925a075f110ab21afeae084670a155dea568e3Edward O'Callaghan CmdArgs.push_back(Output.getFilename()); 2258e7925a075f110ab21afeae084670a155dea568e3Edward O'Callaghan 2259e7925a075f110ab21afeae084670a155dea568e3Edward O'Callaghan for (InputInfoList::const_iterator 2260e7925a075f110ab21afeae084670a155dea568e3Edward O'Callaghan it = Inputs.begin(), ie = Inputs.end(); it != ie; ++it) { 2261e7925a075f110ab21afeae084670a155dea568e3Edward O'Callaghan const InputInfo &II = *it; 2262e7925a075f110ab21afeae084670a155dea568e3Edward O'Callaghan if (II.isPipe()) 2263e7925a075f110ab21afeae084670a155dea568e3Edward O'Callaghan CmdArgs.push_back("-"); 2264e7925a075f110ab21afeae084670a155dea568e3Edward O'Callaghan else 2265e7925a075f110ab21afeae084670a155dea568e3Edward O'Callaghan CmdArgs.push_back(II.getFilename()); 2266e7925a075f110ab21afeae084670a155dea568e3Edward O'Callaghan } 2267e7925a075f110ab21afeae084670a155dea568e3Edward O'Callaghan 2268e7925a075f110ab21afeae084670a155dea568e3Edward O'Callaghan const char *Exec = 2269ff430e6d68d1bea07046adafa28a52b314eeaa88Edward O'Callaghan Args.MakeArgString(getToolChain().GetProgramPath(C, "gas")); 2270daab7b1016f0a82fefa4f7be6e63c57c06b19ffcDaniel Dunbar Dest.addCommand(new Command(JA, *this, Exec, CmdArgs)); 2271e7925a075f110ab21afeae084670a155dea568e3Edward O'Callaghan} 2272e7925a075f110ab21afeae084670a155dea568e3Edward O'Callaghan 2273e7925a075f110ab21afeae084670a155dea568e3Edward O'Callaghanvoid auroraux::Link::ConstructJob(Compilation &C, const JobAction &JA, 2274294691eb1caf551083acd7b08630ef21c3fd760dDaniel Dunbar Job &Dest, const InputInfo &Output, 2275294691eb1caf551083acd7b08630ef21c3fd760dDaniel Dunbar const InputInfoList &Inputs, 2276294691eb1caf551083acd7b08630ef21c3fd760dDaniel Dunbar const ArgList &Args, 2277294691eb1caf551083acd7b08630ef21c3fd760dDaniel Dunbar const char *LinkingOutput) const { 2278ee788e70fcd0adf76103b17c78ac658d4ea30c9bDaniel Dunbar const Driver &D = getToolChain().getDriver(); 2279e7925a075f110ab21afeae084670a155dea568e3Edward O'Callaghan ArgStringList CmdArgs; 2280e7925a075f110ab21afeae084670a155dea568e3Edward O'Callaghan 2281e7925a075f110ab21afeae084670a155dea568e3Edward O'Callaghan if ((!Args.hasArg(options::OPT_nostdlib)) && 2282294691eb1caf551083acd7b08630ef21c3fd760dDaniel Dunbar (!Args.hasArg(options::OPT_shared))) { 2283e7925a075f110ab21afeae084670a155dea568e3Edward O'Callaghan CmdArgs.push_back("-e"); 22847adf94906e23eae295a006659c55eab9ffcf8b37Edward O'Callaghan CmdArgs.push_back("_start"); 2285e7925a075f110ab21afeae084670a155dea568e3Edward O'Callaghan } 2286e7925a075f110ab21afeae084670a155dea568e3Edward O'Callaghan 2287e7925a075f110ab21afeae084670a155dea568e3Edward O'Callaghan if (Args.hasArg(options::OPT_static)) { 2288e7925a075f110ab21afeae084670a155dea568e3Edward O'Callaghan CmdArgs.push_back("-Bstatic"); 22897adf94906e23eae295a006659c55eab9ffcf8b37Edward O'Callaghan CmdArgs.push_back("-dn"); 2290e7925a075f110ab21afeae084670a155dea568e3Edward O'Callaghan } else { 22917adf94906e23eae295a006659c55eab9ffcf8b37Edward O'Callaghan// CmdArgs.push_back("--eh-frame-hdr"); 2292e7925a075f110ab21afeae084670a155dea568e3Edward O'Callaghan CmdArgs.push_back("-Bdynamic"); 2293e7925a075f110ab21afeae084670a155dea568e3Edward O'Callaghan if (Args.hasArg(options::OPT_shared)) { 2294e7925a075f110ab21afeae084670a155dea568e3Edward O'Callaghan CmdArgs.push_back("-shared"); 2295e7925a075f110ab21afeae084670a155dea568e3Edward O'Callaghan } else { 22963cecc19f606ba1000da885b8ff4c089abad224ddEdward O'Callaghan CmdArgs.push_back("--dynamic-linker"); 2297e7925a075f110ab21afeae084670a155dea568e3Edward O'Callaghan CmdArgs.push_back("/lib/ld.so.1"); // 64Bit Path /lib/amd64/ld.so.1 2298e7925a075f110ab21afeae084670a155dea568e3Edward O'Callaghan } 2299e7925a075f110ab21afeae084670a155dea568e3Edward O'Callaghan } 2300e7925a075f110ab21afeae084670a155dea568e3Edward O'Callaghan 2301e7925a075f110ab21afeae084670a155dea568e3Edward O'Callaghan if (Output.isPipe()) { 2302e7925a075f110ab21afeae084670a155dea568e3Edward O'Callaghan CmdArgs.push_back("-o"); 2303e7925a075f110ab21afeae084670a155dea568e3Edward O'Callaghan CmdArgs.push_back("-"); 2304e7925a075f110ab21afeae084670a155dea568e3Edward O'Callaghan } else if (Output.isFilename()) { 2305e7925a075f110ab21afeae084670a155dea568e3Edward O'Callaghan CmdArgs.push_back("-o"); 2306e7925a075f110ab21afeae084670a155dea568e3Edward O'Callaghan CmdArgs.push_back(Output.getFilename()); 2307e7925a075f110ab21afeae084670a155dea568e3Edward O'Callaghan } else { 2308e7925a075f110ab21afeae084670a155dea568e3Edward O'Callaghan assert(Output.isNothing() && "Invalid output."); 2309e7925a075f110ab21afeae084670a155dea568e3Edward O'Callaghan } 2310e7925a075f110ab21afeae084670a155dea568e3Edward O'Callaghan 2311e7925a075f110ab21afeae084670a155dea568e3Edward O'Callaghan if (!Args.hasArg(options::OPT_nostdlib) && 2312e7925a075f110ab21afeae084670a155dea568e3Edward O'Callaghan !Args.hasArg(options::OPT_nostartfiles)) { 2313e7925a075f110ab21afeae084670a155dea568e3Edward O'Callaghan if (!Args.hasArg(options::OPT_shared)) { 23147adf94906e23eae295a006659c55eab9ffcf8b37Edward O'Callaghan CmdArgs.push_back(Args.MakeArgString(getToolChain().GetFilePath(C, "crt1.o"))); 23157adf94906e23eae295a006659c55eab9ffcf8b37Edward O'Callaghan CmdArgs.push_back(Args.MakeArgString(getToolChain().GetFilePath(C, "crti.o"))); 23165ed34f4c58b6ad4e21038d713c1fae31a6146ff5Daniel Dunbar CmdArgs.push_back(Args.MakeArgString(getToolChain().GetFilePath(C, "crtbegin.o"))); 2317e7925a075f110ab21afeae084670a155dea568e3Edward O'Callaghan } else { 23187adf94906e23eae295a006659c55eab9ffcf8b37Edward O'Callaghan CmdArgs.push_back(Args.MakeArgString(getToolChain().GetFilePath(C, "crti.o"))); 2319e7925a075f110ab21afeae084670a155dea568e3Edward O'Callaghan } 23207adf94906e23eae295a006659c55eab9ffcf8b37Edward O'Callaghan CmdArgs.push_back(Args.MakeArgString(getToolChain().GetFilePath(C, "crtn.o"))); 2321e7925a075f110ab21afeae084670a155dea568e3Edward O'Callaghan } 2322e7925a075f110ab21afeae084670a155dea568e3Edward O'Callaghan 2323294691eb1caf551083acd7b08630ef21c3fd760dDaniel Dunbar CmdArgs.push_back(Args.MakeArgString("-L/opt/gcc4/lib/gcc/" 2324294691eb1caf551083acd7b08630ef21c3fd760dDaniel Dunbar + getToolChain().getTripleString() 2325f7fb31f4751c9c5ac3d9f93c19ec05a74dd9546fDaniel Dunbar + "/4.2.4")); 2326e7925a075f110ab21afeae084670a155dea568e3Edward O'Callaghan 2327e7925a075f110ab21afeae084670a155dea568e3Edward O'Callaghan Args.AddAllArgs(CmdArgs, options::OPT_L); 2328e7925a075f110ab21afeae084670a155dea568e3Edward O'Callaghan Args.AddAllArgs(CmdArgs, options::OPT_T_Group); 2329e7925a075f110ab21afeae084670a155dea568e3Edward O'Callaghan Args.AddAllArgs(CmdArgs, options::OPT_e); 2330e7925a075f110ab21afeae084670a155dea568e3Edward O'Callaghan 2331e7925a075f110ab21afeae084670a155dea568e3Edward O'Callaghan for (InputInfoList::const_iterator 2332e7925a075f110ab21afeae084670a155dea568e3Edward O'Callaghan it = Inputs.begin(), ie = Inputs.end(); it != ie; ++it) { 2333e7925a075f110ab21afeae084670a155dea568e3Edward O'Callaghan const InputInfo &II = *it; 2334e7925a075f110ab21afeae084670a155dea568e3Edward O'Callaghan 2335e7925a075f110ab21afeae084670a155dea568e3Edward O'Callaghan // Don't try to pass LLVM inputs to a generic gcc. 2336e7925a075f110ab21afeae084670a155dea568e3Edward O'Callaghan if (II.getType() == types::TY_LLVMBC) 2337e7925a075f110ab21afeae084670a155dea568e3Edward O'Callaghan D.Diag(clang::diag::err_drv_no_linker_llvm_support) 2338881376467c46c5c6cc16fa6790271c2c22e1d4f1Daniel Dunbar << getToolChain().getTripleString(); 2339e7925a075f110ab21afeae084670a155dea568e3Edward O'Callaghan 2340e7925a075f110ab21afeae084670a155dea568e3Edward O'Callaghan if (II.isPipe()) 2341e7925a075f110ab21afeae084670a155dea568e3Edward O'Callaghan CmdArgs.push_back("-"); 2342e7925a075f110ab21afeae084670a155dea568e3Edward O'Callaghan else if (II.isFilename()) 2343e7925a075f110ab21afeae084670a155dea568e3Edward O'Callaghan CmdArgs.push_back(II.getFilename()); 2344e7925a075f110ab21afeae084670a155dea568e3Edward O'Callaghan else 2345e7925a075f110ab21afeae084670a155dea568e3Edward O'Callaghan II.getInputArg().renderAsInput(Args, CmdArgs); 2346e7925a075f110ab21afeae084670a155dea568e3Edward O'Callaghan } 2347e7925a075f110ab21afeae084670a155dea568e3Edward O'Callaghan 2348e7925a075f110ab21afeae084670a155dea568e3Edward O'Callaghan if (!Args.hasArg(options::OPT_nostdlib) && 2349e7925a075f110ab21afeae084670a155dea568e3Edward O'Callaghan !Args.hasArg(options::OPT_nodefaultlibs)) { 2350e7925a075f110ab21afeae084670a155dea568e3Edward O'Callaghan // FIXME: For some reason GCC passes -lgcc before adding 2351e7925a075f110ab21afeae084670a155dea568e3Edward O'Callaghan // the default system libraries. Just mimic this for now. 2352e7925a075f110ab21afeae084670a155dea568e3Edward O'Callaghan CmdArgs.push_back("-lgcc"); 2353e7925a075f110ab21afeae084670a155dea568e3Edward O'Callaghan 2354e7925a075f110ab21afeae084670a155dea568e3Edward O'Callaghan if (Args.hasArg(options::OPT_pthread)) 2355e7925a075f110ab21afeae084670a155dea568e3Edward O'Callaghan CmdArgs.push_back("-pthread"); 2356e7925a075f110ab21afeae084670a155dea568e3Edward O'Callaghan if (!Args.hasArg(options::OPT_shared)) 2357e7925a075f110ab21afeae084670a155dea568e3Edward O'Callaghan CmdArgs.push_back("-lc"); 2358e7925a075f110ab21afeae084670a155dea568e3Edward O'Callaghan CmdArgs.push_back("-lgcc"); 2359e7925a075f110ab21afeae084670a155dea568e3Edward O'Callaghan } 2360e7925a075f110ab21afeae084670a155dea568e3Edward O'Callaghan 2361e7925a075f110ab21afeae084670a155dea568e3Edward O'Callaghan if (!Args.hasArg(options::OPT_nostdlib) && 2362e7925a075f110ab21afeae084670a155dea568e3Edward O'Callaghan !Args.hasArg(options::OPT_nostartfiles)) { 2363e7925a075f110ab21afeae084670a155dea568e3Edward O'Callaghan if (!Args.hasArg(options::OPT_shared)) 23645ed34f4c58b6ad4e21038d713c1fae31a6146ff5Daniel Dunbar CmdArgs.push_back(Args.MakeArgString(getToolChain().GetFilePath(C, "crtend.o"))); 23657adf94906e23eae295a006659c55eab9ffcf8b37Edward O'Callaghan// else 23667adf94906e23eae295a006659c55eab9ffcf8b37Edward O'Callaghan// CmdArgs.push_back(Args.MakeArgString(getToolChain().GetFilePath(C, "crtendS.o"))); 2367e7925a075f110ab21afeae084670a155dea568e3Edward O'Callaghan } 2368e7925a075f110ab21afeae084670a155dea568e3Edward O'Callaghan 2369e7925a075f110ab21afeae084670a155dea568e3Edward O'Callaghan const char *Exec = 23705ed34f4c58b6ad4e21038d713c1fae31a6146ff5Daniel Dunbar Args.MakeArgString(getToolChain().GetProgramPath(C, "ld")); 2371daab7b1016f0a82fefa4f7be6e63c57c06b19ffcDaniel Dunbar Dest.addCommand(new Command(JA, *this, Exec, CmdArgs)); 2372e7925a075f110ab21afeae084670a155dea568e3Edward O'Callaghan} 2373e7925a075f110ab21afeae084670a155dea568e3Edward O'Callaghan 2374f7b8eec37c8c8012fa525c71fb29a58c9f29beefDaniel Dunbarvoid openbsd::Assemble::ConstructJob(Compilation &C, const JobAction &JA, 2375f7b8eec37c8c8012fa525c71fb29a58c9f29beefDaniel Dunbar Job &Dest, const InputInfo &Output, 2376f7b8eec37c8c8012fa525c71fb29a58c9f29beefDaniel Dunbar const InputInfoList &Inputs, 2377f7b8eec37c8c8012fa525c71fb29a58c9f29beefDaniel Dunbar const ArgList &Args, 23781eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump const char *LinkingOutput) const { 2379f7b8eec37c8c8012fa525c71fb29a58c9f29beefDaniel Dunbar ArgStringList CmdArgs; 2380f7b8eec37c8c8012fa525c71fb29a58c9f29beefDaniel Dunbar 2381f7b8eec37c8c8012fa525c71fb29a58c9f29beefDaniel Dunbar Args.AddAllArgValues(CmdArgs, options::OPT_Wa_COMMA, 2382f7b8eec37c8c8012fa525c71fb29a58c9f29beefDaniel Dunbar options::OPT_Xassembler); 2383f7b8eec37c8c8012fa525c71fb29a58c9f29beefDaniel Dunbar 2384f7b8eec37c8c8012fa525c71fb29a58c9f29beefDaniel Dunbar CmdArgs.push_back("-o"); 2385f7b8eec37c8c8012fa525c71fb29a58c9f29beefDaniel Dunbar if (Output.isPipe()) 2386f7b8eec37c8c8012fa525c71fb29a58c9f29beefDaniel Dunbar CmdArgs.push_back("-"); 2387f7b8eec37c8c8012fa525c71fb29a58c9f29beefDaniel Dunbar else 2388f7b8eec37c8c8012fa525c71fb29a58c9f29beefDaniel Dunbar CmdArgs.push_back(Output.getFilename()); 2389f7b8eec37c8c8012fa525c71fb29a58c9f29beefDaniel Dunbar 2390f7b8eec37c8c8012fa525c71fb29a58c9f29beefDaniel Dunbar for (InputInfoList::const_iterator 2391f7b8eec37c8c8012fa525c71fb29a58c9f29beefDaniel Dunbar it = Inputs.begin(), ie = Inputs.end(); it != ie; ++it) { 2392f7b8eec37c8c8012fa525c71fb29a58c9f29beefDaniel Dunbar const InputInfo &II = *it; 2393f7b8eec37c8c8012fa525c71fb29a58c9f29beefDaniel Dunbar if (II.isPipe()) 2394f7b8eec37c8c8012fa525c71fb29a58c9f29beefDaniel Dunbar CmdArgs.push_back("-"); 2395f7b8eec37c8c8012fa525c71fb29a58c9f29beefDaniel Dunbar else 2396f7b8eec37c8c8012fa525c71fb29a58c9f29beefDaniel Dunbar CmdArgs.push_back(II.getFilename()); 2397f7b8eec37c8c8012fa525c71fb29a58c9f29beefDaniel Dunbar } 2398f7b8eec37c8c8012fa525c71fb29a58c9f29beefDaniel Dunbar 2399f7b8eec37c8c8012fa525c71fb29a58c9f29beefDaniel Dunbar const char *Exec = 24005ed34f4c58b6ad4e21038d713c1fae31a6146ff5Daniel Dunbar Args.MakeArgString(getToolChain().GetProgramPath(C, "as")); 2401daab7b1016f0a82fefa4f7be6e63c57c06b19ffcDaniel Dunbar Dest.addCommand(new Command(JA, *this, Exec, CmdArgs)); 2402f7b8eec37c8c8012fa525c71fb29a58c9f29beefDaniel Dunbar} 2403f7b8eec37c8c8012fa525c71fb29a58c9f29beefDaniel Dunbar 2404f7b8eec37c8c8012fa525c71fb29a58c9f29beefDaniel Dunbarvoid openbsd::Link::ConstructJob(Compilation &C, const JobAction &JA, 2405f7b8eec37c8c8012fa525c71fb29a58c9f29beefDaniel Dunbar Job &Dest, const InputInfo &Output, 2406f7b8eec37c8c8012fa525c71fb29a58c9f29beefDaniel Dunbar const InputInfoList &Inputs, 2407f7b8eec37c8c8012fa525c71fb29a58c9f29beefDaniel Dunbar const ArgList &Args, 2408f7b8eec37c8c8012fa525c71fb29a58c9f29beefDaniel Dunbar const char *LinkingOutput) const { 2409ee788e70fcd0adf76103b17c78ac658d4ea30c9bDaniel Dunbar const Driver &D = getToolChain().getDriver(); 2410f7b8eec37c8c8012fa525c71fb29a58c9f29beefDaniel Dunbar ArgStringList CmdArgs; 2411f7b8eec37c8c8012fa525c71fb29a58c9f29beefDaniel Dunbar 24122bbcf669742b6b27748414e22f8042236fceef65Daniel Dunbar if ((!Args.hasArg(options::OPT_nostdlib)) && 2413294691eb1caf551083acd7b08630ef21c3fd760dDaniel Dunbar (!Args.hasArg(options::OPT_shared))) { 24142bbcf669742b6b27748414e22f8042236fceef65Daniel Dunbar CmdArgs.push_back("-e"); 24152bbcf669742b6b27748414e22f8042236fceef65Daniel Dunbar CmdArgs.push_back("__start"); 24162bbcf669742b6b27748414e22f8042236fceef65Daniel Dunbar } 24172bbcf669742b6b27748414e22f8042236fceef65Daniel Dunbar 2418f7b8eec37c8c8012fa525c71fb29a58c9f29beefDaniel Dunbar if (Args.hasArg(options::OPT_static)) { 2419f7b8eec37c8c8012fa525c71fb29a58c9f29beefDaniel Dunbar CmdArgs.push_back("-Bstatic"); 2420f7b8eec37c8c8012fa525c71fb29a58c9f29beefDaniel Dunbar } else { 2421f7b8eec37c8c8012fa525c71fb29a58c9f29beefDaniel Dunbar CmdArgs.push_back("--eh-frame-hdr"); 24222bbcf669742b6b27748414e22f8042236fceef65Daniel Dunbar CmdArgs.push_back("-Bdynamic"); 2423f7b8eec37c8c8012fa525c71fb29a58c9f29beefDaniel Dunbar if (Args.hasArg(options::OPT_shared)) { 24242bbcf669742b6b27748414e22f8042236fceef65Daniel Dunbar CmdArgs.push_back("-shared"); 2425f7b8eec37c8c8012fa525c71fb29a58c9f29beefDaniel Dunbar } else { 2426f7b8eec37c8c8012fa525c71fb29a58c9f29beefDaniel Dunbar CmdArgs.push_back("-dynamic-linker"); 2427f7b8eec37c8c8012fa525c71fb29a58c9f29beefDaniel Dunbar CmdArgs.push_back("/usr/libexec/ld.so"); 2428f7b8eec37c8c8012fa525c71fb29a58c9f29beefDaniel Dunbar } 2429f7b8eec37c8c8012fa525c71fb29a58c9f29beefDaniel Dunbar } 2430f7b8eec37c8c8012fa525c71fb29a58c9f29beefDaniel Dunbar 2431f7b8eec37c8c8012fa525c71fb29a58c9f29beefDaniel Dunbar if (Output.isPipe()) { 2432f7b8eec37c8c8012fa525c71fb29a58c9f29beefDaniel Dunbar CmdArgs.push_back("-o"); 2433f7b8eec37c8c8012fa525c71fb29a58c9f29beefDaniel Dunbar CmdArgs.push_back("-"); 2434f7b8eec37c8c8012fa525c71fb29a58c9f29beefDaniel Dunbar } else if (Output.isFilename()) { 2435f7b8eec37c8c8012fa525c71fb29a58c9f29beefDaniel Dunbar CmdArgs.push_back("-o"); 2436f7b8eec37c8c8012fa525c71fb29a58c9f29beefDaniel Dunbar CmdArgs.push_back(Output.getFilename()); 2437f7b8eec37c8c8012fa525c71fb29a58c9f29beefDaniel Dunbar } else { 2438f7b8eec37c8c8012fa525c71fb29a58c9f29beefDaniel Dunbar assert(Output.isNothing() && "Invalid output."); 2439f7b8eec37c8c8012fa525c71fb29a58c9f29beefDaniel Dunbar } 2440f7b8eec37c8c8012fa525c71fb29a58c9f29beefDaniel Dunbar 2441f7b8eec37c8c8012fa525c71fb29a58c9f29beefDaniel Dunbar if (!Args.hasArg(options::OPT_nostdlib) && 2442f7b8eec37c8c8012fa525c71fb29a58c9f29beefDaniel Dunbar !Args.hasArg(options::OPT_nostartfiles)) { 2443f7b8eec37c8c8012fa525c71fb29a58c9f29beefDaniel Dunbar if (!Args.hasArg(options::OPT_shared)) { 24445ed34f4c58b6ad4e21038d713c1fae31a6146ff5Daniel Dunbar CmdArgs.push_back(Args.MakeArgString(getToolChain().GetFilePath(C, "crt0.o"))); 24455ed34f4c58b6ad4e21038d713c1fae31a6146ff5Daniel Dunbar CmdArgs.push_back(Args.MakeArgString(getToolChain().GetFilePath(C, "crtbegin.o"))); 2446f7b8eec37c8c8012fa525c71fb29a58c9f29beefDaniel Dunbar } else { 24475ed34f4c58b6ad4e21038d713c1fae31a6146ff5Daniel Dunbar CmdArgs.push_back(Args.MakeArgString(getToolChain().GetFilePath(C, "crtbeginS.o"))); 2448f7b8eec37c8c8012fa525c71fb29a58c9f29beefDaniel Dunbar } 2449f7b8eec37c8c8012fa525c71fb29a58c9f29beefDaniel Dunbar } 2450f7b8eec37c8c8012fa525c71fb29a58c9f29beefDaniel Dunbar 2451e7e18200e614a5e619602a088544c85ac8305a1fEdward O'Callaghan std::string Triple = getToolChain().getTripleString(); 2452e7e18200e614a5e619602a088544c85ac8305a1fEdward O'Callaghan if (Triple.substr(0, 6) == "x86_64") 2453294691eb1caf551083acd7b08630ef21c3fd760dDaniel Dunbar Triple.replace(0, 6, "amd64"); 2454f7fb31f4751c9c5ac3d9f93c19ec05a74dd9546fDaniel Dunbar CmdArgs.push_back(Args.MakeArgString("-L/usr/lib/gcc-lib/" + Triple + 2455f7fb31f4751c9c5ac3d9f93c19ec05a74dd9546fDaniel Dunbar "/3.3.5")); 24562bbcf669742b6b27748414e22f8042236fceef65Daniel Dunbar 2457f7b8eec37c8c8012fa525c71fb29a58c9f29beefDaniel Dunbar Args.AddAllArgs(CmdArgs, options::OPT_L); 2458f7b8eec37c8c8012fa525c71fb29a58c9f29beefDaniel Dunbar Args.AddAllArgs(CmdArgs, options::OPT_T_Group); 2459f7b8eec37c8c8012fa525c71fb29a58c9f29beefDaniel Dunbar Args.AddAllArgs(CmdArgs, options::OPT_e); 2460f7b8eec37c8c8012fa525c71fb29a58c9f29beefDaniel Dunbar 2461f7b8eec37c8c8012fa525c71fb29a58c9f29beefDaniel Dunbar for (InputInfoList::const_iterator 2462f7b8eec37c8c8012fa525c71fb29a58c9f29beefDaniel Dunbar it = Inputs.begin(), ie = Inputs.end(); it != ie; ++it) { 2463f7b8eec37c8c8012fa525c71fb29a58c9f29beefDaniel Dunbar const InputInfo &II = *it; 2464f7b8eec37c8c8012fa525c71fb29a58c9f29beefDaniel Dunbar 2465f7b8eec37c8c8012fa525c71fb29a58c9f29beefDaniel Dunbar // Don't try to pass LLVM inputs to a generic gcc. 2466f7b8eec37c8c8012fa525c71fb29a58c9f29beefDaniel Dunbar if (II.getType() == types::TY_LLVMBC) 2467f7b8eec37c8c8012fa525c71fb29a58c9f29beefDaniel Dunbar D.Diag(clang::diag::err_drv_no_linker_llvm_support) 2468881376467c46c5c6cc16fa6790271c2c22e1d4f1Daniel Dunbar << getToolChain().getTripleString(); 2469f7b8eec37c8c8012fa525c71fb29a58c9f29beefDaniel Dunbar 2470f7b8eec37c8c8012fa525c71fb29a58c9f29beefDaniel Dunbar if (II.isPipe()) 2471f7b8eec37c8c8012fa525c71fb29a58c9f29beefDaniel Dunbar CmdArgs.push_back("-"); 2472f7b8eec37c8c8012fa525c71fb29a58c9f29beefDaniel Dunbar else if (II.isFilename()) 2473f7b8eec37c8c8012fa525c71fb29a58c9f29beefDaniel Dunbar CmdArgs.push_back(II.getFilename()); 2474f7b8eec37c8c8012fa525c71fb29a58c9f29beefDaniel Dunbar else 2475f7b8eec37c8c8012fa525c71fb29a58c9f29beefDaniel Dunbar II.getInputArg().renderAsInput(Args, CmdArgs); 2476f7b8eec37c8c8012fa525c71fb29a58c9f29beefDaniel Dunbar } 2477f7b8eec37c8c8012fa525c71fb29a58c9f29beefDaniel Dunbar 2478f7b8eec37c8c8012fa525c71fb29a58c9f29beefDaniel Dunbar if (!Args.hasArg(options::OPT_nostdlib) && 2479f7b8eec37c8c8012fa525c71fb29a58c9f29beefDaniel Dunbar !Args.hasArg(options::OPT_nodefaultlibs)) { 24802bbcf669742b6b27748414e22f8042236fceef65Daniel Dunbar // FIXME: For some reason GCC passes -lgcc before adding 24812bbcf669742b6b27748414e22f8042236fceef65Daniel Dunbar // the default system libraries. Just mimic this for now. 24822bbcf669742b6b27748414e22f8042236fceef65Daniel Dunbar CmdArgs.push_back("-lgcc"); 2483f7b8eec37c8c8012fa525c71fb29a58c9f29beefDaniel Dunbar 2484f7b8eec37c8c8012fa525c71fb29a58c9f29beefDaniel Dunbar if (Args.hasArg(options::OPT_pthread)) 2485f7b8eec37c8c8012fa525c71fb29a58c9f29beefDaniel Dunbar CmdArgs.push_back("-pthread"); 24862bbcf669742b6b27748414e22f8042236fceef65Daniel Dunbar if (!Args.hasArg(options::OPT_shared)) 24872bbcf669742b6b27748414e22f8042236fceef65Daniel Dunbar CmdArgs.push_back("-lc"); 24882bbcf669742b6b27748414e22f8042236fceef65Daniel Dunbar CmdArgs.push_back("-lgcc"); 2489f7b8eec37c8c8012fa525c71fb29a58c9f29beefDaniel Dunbar } 2490f7b8eec37c8c8012fa525c71fb29a58c9f29beefDaniel Dunbar 2491f7b8eec37c8c8012fa525c71fb29a58c9f29beefDaniel Dunbar if (!Args.hasArg(options::OPT_nostdlib) && 2492f7b8eec37c8c8012fa525c71fb29a58c9f29beefDaniel Dunbar !Args.hasArg(options::OPT_nostartfiles)) { 2493f7b8eec37c8c8012fa525c71fb29a58c9f29beefDaniel Dunbar if (!Args.hasArg(options::OPT_shared)) 24945ed34f4c58b6ad4e21038d713c1fae31a6146ff5Daniel Dunbar CmdArgs.push_back(Args.MakeArgString(getToolChain().GetFilePath(C, "crtend.o"))); 2495f7b8eec37c8c8012fa525c71fb29a58c9f29beefDaniel Dunbar else 24965ed34f4c58b6ad4e21038d713c1fae31a6146ff5Daniel Dunbar CmdArgs.push_back(Args.MakeArgString(getToolChain().GetFilePath(C, "crtendS.o"))); 2497f7b8eec37c8c8012fa525c71fb29a58c9f29beefDaniel Dunbar } 2498f7b8eec37c8c8012fa525c71fb29a58c9f29beefDaniel Dunbar 2499f7b8eec37c8c8012fa525c71fb29a58c9f29beefDaniel Dunbar const char *Exec = 25005ed34f4c58b6ad4e21038d713c1fae31a6146ff5Daniel Dunbar Args.MakeArgString(getToolChain().GetProgramPath(C, "ld")); 2501daab7b1016f0a82fefa4f7be6e63c57c06b19ffcDaniel Dunbar Dest.addCommand(new Command(JA, *this, Exec, CmdArgs)); 2502f7b8eec37c8c8012fa525c71fb29a58c9f29beefDaniel Dunbar} 2503c66a5a30a27e7b9cfab46ac8be918e3ea5b0c5a5Ed Schouten 250468a31d406c6dc4382c700d1199b062de2aa7e1daDaniel Dunbarvoid freebsd::Assemble::ConstructJob(Compilation &C, const JobAction &JA, 2505c21c485b4fb58ef5d55cf3e523263dd824a2ace4Daniel Dunbar Job &Dest, const InputInfo &Output, 2506c21c485b4fb58ef5d55cf3e523263dd824a2ace4Daniel Dunbar const InputInfoList &Inputs, 2507c21c485b4fb58ef5d55cf3e523263dd824a2ace4Daniel Dunbar const ArgList &Args, 25081eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump const char *LinkingOutput) const { 250968a31d406c6dc4382c700d1199b062de2aa7e1daDaniel Dunbar ArgStringList CmdArgs; 251068a31d406c6dc4382c700d1199b062de2aa7e1daDaniel Dunbar 2511008f54a54299eaafdaa940e2bdeaf55935ecd95aDaniel Dunbar // When building 32-bit code on FreeBSD/amd64, we have to explicitly 2512008f54a54299eaafdaa940e2bdeaf55935ecd95aDaniel Dunbar // instruct as in the base system to assemble 32-bit code. 2513008f54a54299eaafdaa940e2bdeaf55935ecd95aDaniel Dunbar if (getToolChain().getArchName() == "i386") 251468a31d406c6dc4382c700d1199b062de2aa7e1daDaniel Dunbar CmdArgs.push_back("--32"); 251568a31d406c6dc4382c700d1199b062de2aa7e1daDaniel Dunbar 251668a31d406c6dc4382c700d1199b062de2aa7e1daDaniel Dunbar Args.AddAllArgValues(CmdArgs, options::OPT_Wa_COMMA, 251768a31d406c6dc4382c700d1199b062de2aa7e1daDaniel Dunbar options::OPT_Xassembler); 251868a31d406c6dc4382c700d1199b062de2aa7e1daDaniel Dunbar 251968a31d406c6dc4382c700d1199b062de2aa7e1daDaniel Dunbar CmdArgs.push_back("-o"); 252068a31d406c6dc4382c700d1199b062de2aa7e1daDaniel Dunbar if (Output.isPipe()) 252168a31d406c6dc4382c700d1199b062de2aa7e1daDaniel Dunbar CmdArgs.push_back("-"); 252268a31d406c6dc4382c700d1199b062de2aa7e1daDaniel Dunbar else 252368a31d406c6dc4382c700d1199b062de2aa7e1daDaniel Dunbar CmdArgs.push_back(Output.getFilename()); 252468a31d406c6dc4382c700d1199b062de2aa7e1daDaniel Dunbar 252568a31d406c6dc4382c700d1199b062de2aa7e1daDaniel Dunbar for (InputInfoList::const_iterator 252668a31d406c6dc4382c700d1199b062de2aa7e1daDaniel Dunbar it = Inputs.begin(), ie = Inputs.end(); it != ie; ++it) { 252768a31d406c6dc4382c700d1199b062de2aa7e1daDaniel Dunbar const InputInfo &II = *it; 252868a31d406c6dc4382c700d1199b062de2aa7e1daDaniel Dunbar if (II.isPipe()) 252968a31d406c6dc4382c700d1199b062de2aa7e1daDaniel Dunbar CmdArgs.push_back("-"); 253068a31d406c6dc4382c700d1199b062de2aa7e1daDaniel Dunbar else 253168a31d406c6dc4382c700d1199b062de2aa7e1daDaniel Dunbar CmdArgs.push_back(II.getFilename()); 253268a31d406c6dc4382c700d1199b062de2aa7e1daDaniel Dunbar } 253368a31d406c6dc4382c700d1199b062de2aa7e1daDaniel Dunbar 2534c21c485b4fb58ef5d55cf3e523263dd824a2ace4Daniel Dunbar const char *Exec = 25355ed34f4c58b6ad4e21038d713c1fae31a6146ff5Daniel Dunbar Args.MakeArgString(getToolChain().GetProgramPath(C, "as")); 2536daab7b1016f0a82fefa4f7be6e63c57c06b19ffcDaniel Dunbar Dest.addCommand(new Command(JA, *this, Exec, CmdArgs)); 253768a31d406c6dc4382c700d1199b062de2aa7e1daDaniel Dunbar} 2538008f54a54299eaafdaa940e2bdeaf55935ecd95aDaniel Dunbar 2539008f54a54299eaafdaa940e2bdeaf55935ecd95aDaniel Dunbarvoid freebsd::Link::ConstructJob(Compilation &C, const JobAction &JA, 2540c21c485b4fb58ef5d55cf3e523263dd824a2ace4Daniel Dunbar Job &Dest, const InputInfo &Output, 2541c21c485b4fb58ef5d55cf3e523263dd824a2ace4Daniel Dunbar const InputInfoList &Inputs, 2542c21c485b4fb58ef5d55cf3e523263dd824a2ace4Daniel Dunbar const ArgList &Args, 2543a8304f67291b0182fb64f3afc621615288dd1d31Daniel Dunbar const char *LinkingOutput) const { 2544ee788e70fcd0adf76103b17c78ac658d4ea30c9bDaniel Dunbar const Driver &D = getToolChain().getDriver(); 2545008f54a54299eaafdaa940e2bdeaf55935ecd95aDaniel Dunbar ArgStringList CmdArgs; 2546008f54a54299eaafdaa940e2bdeaf55935ecd95aDaniel Dunbar 2547008f54a54299eaafdaa940e2bdeaf55935ecd95aDaniel Dunbar if (Args.hasArg(options::OPT_static)) { 2548008f54a54299eaafdaa940e2bdeaf55935ecd95aDaniel Dunbar CmdArgs.push_back("-Bstatic"); 2549008f54a54299eaafdaa940e2bdeaf55935ecd95aDaniel Dunbar } else { 2550008f54a54299eaafdaa940e2bdeaf55935ecd95aDaniel Dunbar CmdArgs.push_back("--eh-frame-hdr"); 2551008f54a54299eaafdaa940e2bdeaf55935ecd95aDaniel Dunbar if (Args.hasArg(options::OPT_shared)) { 2552008f54a54299eaafdaa940e2bdeaf55935ecd95aDaniel Dunbar CmdArgs.push_back("-Bshareable"); 2553008f54a54299eaafdaa940e2bdeaf55935ecd95aDaniel Dunbar } else { 2554008f54a54299eaafdaa940e2bdeaf55935ecd95aDaniel Dunbar CmdArgs.push_back("-dynamic-linker"); 2555008f54a54299eaafdaa940e2bdeaf55935ecd95aDaniel Dunbar CmdArgs.push_back("/libexec/ld-elf.so.1"); 2556008f54a54299eaafdaa940e2bdeaf55935ecd95aDaniel Dunbar } 2557008f54a54299eaafdaa940e2bdeaf55935ecd95aDaniel Dunbar } 2558008f54a54299eaafdaa940e2bdeaf55935ecd95aDaniel Dunbar 2559008f54a54299eaafdaa940e2bdeaf55935ecd95aDaniel Dunbar // When building 32-bit code on FreeBSD/amd64, we have to explicitly 2560008f54a54299eaafdaa940e2bdeaf55935ecd95aDaniel Dunbar // instruct ld in the base system to link 32-bit code. 2561008f54a54299eaafdaa940e2bdeaf55935ecd95aDaniel Dunbar if (getToolChain().getArchName() == "i386") { 2562008f54a54299eaafdaa940e2bdeaf55935ecd95aDaniel Dunbar CmdArgs.push_back("-m"); 2563008f54a54299eaafdaa940e2bdeaf55935ecd95aDaniel Dunbar CmdArgs.push_back("elf_i386_fbsd"); 2564008f54a54299eaafdaa940e2bdeaf55935ecd95aDaniel Dunbar } 2565008f54a54299eaafdaa940e2bdeaf55935ecd95aDaniel Dunbar 2566008f54a54299eaafdaa940e2bdeaf55935ecd95aDaniel Dunbar if (Output.isPipe()) { 2567008f54a54299eaafdaa940e2bdeaf55935ecd95aDaniel Dunbar CmdArgs.push_back("-o"); 2568008f54a54299eaafdaa940e2bdeaf55935ecd95aDaniel Dunbar CmdArgs.push_back("-"); 2569008f54a54299eaafdaa940e2bdeaf55935ecd95aDaniel Dunbar } else if (Output.isFilename()) { 2570008f54a54299eaafdaa940e2bdeaf55935ecd95aDaniel Dunbar CmdArgs.push_back("-o"); 2571008f54a54299eaafdaa940e2bdeaf55935ecd95aDaniel Dunbar CmdArgs.push_back(Output.getFilename()); 2572008f54a54299eaafdaa940e2bdeaf55935ecd95aDaniel Dunbar } else { 2573008f54a54299eaafdaa940e2bdeaf55935ecd95aDaniel Dunbar assert(Output.isNothing() && "Invalid output."); 2574008f54a54299eaafdaa940e2bdeaf55935ecd95aDaniel Dunbar } 2575008f54a54299eaafdaa940e2bdeaf55935ecd95aDaniel Dunbar 2576008f54a54299eaafdaa940e2bdeaf55935ecd95aDaniel Dunbar if (!Args.hasArg(options::OPT_nostdlib) && 2577008f54a54299eaafdaa940e2bdeaf55935ecd95aDaniel Dunbar !Args.hasArg(options::OPT_nostartfiles)) { 2578008f54a54299eaafdaa940e2bdeaf55935ecd95aDaniel Dunbar if (!Args.hasArg(options::OPT_shared)) { 25795ed34f4c58b6ad4e21038d713c1fae31a6146ff5Daniel Dunbar CmdArgs.push_back(Args.MakeArgString(getToolChain().GetFilePath(C, "crt1.o"))); 25805ed34f4c58b6ad4e21038d713c1fae31a6146ff5Daniel Dunbar CmdArgs.push_back(Args.MakeArgString(getToolChain().GetFilePath(C, "crti.o"))); 25815ed34f4c58b6ad4e21038d713c1fae31a6146ff5Daniel Dunbar CmdArgs.push_back(Args.MakeArgString(getToolChain().GetFilePath(C, "crtbegin.o"))); 2582008f54a54299eaafdaa940e2bdeaf55935ecd95aDaniel Dunbar } else { 25835ed34f4c58b6ad4e21038d713c1fae31a6146ff5Daniel Dunbar CmdArgs.push_back(Args.MakeArgString(getToolChain().GetFilePath(C, "crti.o"))); 25845ed34f4c58b6ad4e21038d713c1fae31a6146ff5Daniel Dunbar CmdArgs.push_back(Args.MakeArgString(getToolChain().GetFilePath(C, "crtbeginS.o"))); 2585008f54a54299eaafdaa940e2bdeaf55935ecd95aDaniel Dunbar } 2586008f54a54299eaafdaa940e2bdeaf55935ecd95aDaniel Dunbar } 2587008f54a54299eaafdaa940e2bdeaf55935ecd95aDaniel Dunbar 2588008f54a54299eaafdaa940e2bdeaf55935ecd95aDaniel Dunbar Args.AddAllArgs(CmdArgs, options::OPT_L); 2589008f54a54299eaafdaa940e2bdeaf55935ecd95aDaniel Dunbar Args.AddAllArgs(CmdArgs, options::OPT_T_Group); 2590008f54a54299eaafdaa940e2bdeaf55935ecd95aDaniel Dunbar Args.AddAllArgs(CmdArgs, options::OPT_e); 2591008f54a54299eaafdaa940e2bdeaf55935ecd95aDaniel Dunbar 2592008f54a54299eaafdaa940e2bdeaf55935ecd95aDaniel Dunbar for (InputInfoList::const_iterator 2593c21c485b4fb58ef5d55cf3e523263dd824a2ace4Daniel Dunbar it = Inputs.begin(), ie = Inputs.end(); it != ie; ++it) { 2594008f54a54299eaafdaa940e2bdeaf55935ecd95aDaniel Dunbar const InputInfo &II = *it; 2595a8304f67291b0182fb64f3afc621615288dd1d31Daniel Dunbar 2596a8304f67291b0182fb64f3afc621615288dd1d31Daniel Dunbar // Don't try to pass LLVM inputs to a generic gcc. 2597a8304f67291b0182fb64f3afc621615288dd1d31Daniel Dunbar if (II.getType() == types::TY_LLVMBC) 2598a8304f67291b0182fb64f3afc621615288dd1d31Daniel Dunbar D.Diag(clang::diag::err_drv_no_linker_llvm_support) 2599881376467c46c5c6cc16fa6790271c2c22e1d4f1Daniel Dunbar << getToolChain().getTripleString(); 2600a8304f67291b0182fb64f3afc621615288dd1d31Daniel Dunbar 2601008f54a54299eaafdaa940e2bdeaf55935ecd95aDaniel Dunbar if (II.isPipe()) 2602008f54a54299eaafdaa940e2bdeaf55935ecd95aDaniel Dunbar CmdArgs.push_back("-"); 2603008f54a54299eaafdaa940e2bdeaf55935ecd95aDaniel Dunbar else if (II.isFilename()) 2604008f54a54299eaafdaa940e2bdeaf55935ecd95aDaniel Dunbar CmdArgs.push_back(II.getFilename()); 2605008f54a54299eaafdaa940e2bdeaf55935ecd95aDaniel Dunbar else 2606008f54a54299eaafdaa940e2bdeaf55935ecd95aDaniel Dunbar II.getInputArg().renderAsInput(Args, CmdArgs); 2607008f54a54299eaafdaa940e2bdeaf55935ecd95aDaniel Dunbar } 2608008f54a54299eaafdaa940e2bdeaf55935ecd95aDaniel Dunbar 2609008f54a54299eaafdaa940e2bdeaf55935ecd95aDaniel Dunbar if (!Args.hasArg(options::OPT_nostdlib) && 2610008f54a54299eaafdaa940e2bdeaf55935ecd95aDaniel Dunbar !Args.hasArg(options::OPT_nodefaultlibs)) { 2611008f54a54299eaafdaa940e2bdeaf55935ecd95aDaniel Dunbar // FIXME: For some reason GCC passes -lgcc and -lgcc_s before adding 2612008f54a54299eaafdaa940e2bdeaf55935ecd95aDaniel Dunbar // the default system libraries. Just mimic this for now. 2613008f54a54299eaafdaa940e2bdeaf55935ecd95aDaniel Dunbar CmdArgs.push_back("-lgcc"); 261469203e108b097695c421561c8f1b45b498f5e5d4Edward O'Callaghan if (D.CCCIsCXX) 261569203e108b097695c421561c8f1b45b498f5e5d4Edward O'Callaghan CmdArgs.push_back("-lstdc++"); 2616008f54a54299eaafdaa940e2bdeaf55935ecd95aDaniel Dunbar if (Args.hasArg(options::OPT_static)) { 2617008f54a54299eaafdaa940e2bdeaf55935ecd95aDaniel Dunbar CmdArgs.push_back("-lgcc_eh"); 2618008f54a54299eaafdaa940e2bdeaf55935ecd95aDaniel Dunbar } else { 2619008f54a54299eaafdaa940e2bdeaf55935ecd95aDaniel Dunbar CmdArgs.push_back("--as-needed"); 2620008f54a54299eaafdaa940e2bdeaf55935ecd95aDaniel Dunbar CmdArgs.push_back("-lgcc_s"); 2621008f54a54299eaafdaa940e2bdeaf55935ecd95aDaniel Dunbar CmdArgs.push_back("--no-as-needed"); 2622008f54a54299eaafdaa940e2bdeaf55935ecd95aDaniel Dunbar } 2623008f54a54299eaafdaa940e2bdeaf55935ecd95aDaniel Dunbar 2624008f54a54299eaafdaa940e2bdeaf55935ecd95aDaniel Dunbar if (Args.hasArg(options::OPT_pthread)) 2625008f54a54299eaafdaa940e2bdeaf55935ecd95aDaniel Dunbar CmdArgs.push_back("-lpthread"); 2626008f54a54299eaafdaa940e2bdeaf55935ecd95aDaniel Dunbar CmdArgs.push_back("-lc"); 2627008f54a54299eaafdaa940e2bdeaf55935ecd95aDaniel Dunbar 2628008f54a54299eaafdaa940e2bdeaf55935ecd95aDaniel Dunbar CmdArgs.push_back("-lgcc"); 2629008f54a54299eaafdaa940e2bdeaf55935ecd95aDaniel Dunbar if (Args.hasArg(options::OPT_static)) { 2630008f54a54299eaafdaa940e2bdeaf55935ecd95aDaniel Dunbar CmdArgs.push_back("-lgcc_eh"); 2631008f54a54299eaafdaa940e2bdeaf55935ecd95aDaniel Dunbar } else { 2632008f54a54299eaafdaa940e2bdeaf55935ecd95aDaniel Dunbar CmdArgs.push_back("--as-needed"); 2633008f54a54299eaafdaa940e2bdeaf55935ecd95aDaniel Dunbar CmdArgs.push_back("-lgcc_s"); 2634008f54a54299eaafdaa940e2bdeaf55935ecd95aDaniel Dunbar CmdArgs.push_back("--no-as-needed"); 2635008f54a54299eaafdaa940e2bdeaf55935ecd95aDaniel Dunbar } 2636008f54a54299eaafdaa940e2bdeaf55935ecd95aDaniel Dunbar } 2637008f54a54299eaafdaa940e2bdeaf55935ecd95aDaniel Dunbar 2638008f54a54299eaafdaa940e2bdeaf55935ecd95aDaniel Dunbar if (!Args.hasArg(options::OPT_nostdlib) && 2639008f54a54299eaafdaa940e2bdeaf55935ecd95aDaniel Dunbar !Args.hasArg(options::OPT_nostartfiles)) { 2640008f54a54299eaafdaa940e2bdeaf55935ecd95aDaniel Dunbar if (!Args.hasArg(options::OPT_shared)) 26415ed34f4c58b6ad4e21038d713c1fae31a6146ff5Daniel Dunbar CmdArgs.push_back(Args.MakeArgString(getToolChain().GetFilePath(C, "crtend.o"))); 2642008f54a54299eaafdaa940e2bdeaf55935ecd95aDaniel Dunbar else 26435ed34f4c58b6ad4e21038d713c1fae31a6146ff5Daniel Dunbar CmdArgs.push_back(Args.MakeArgString(getToolChain().GetFilePath(C, "crtendS.o"))); 26445ed34f4c58b6ad4e21038d713c1fae31a6146ff5Daniel Dunbar CmdArgs.push_back(Args.MakeArgString(getToolChain().GetFilePath(C, "crtn.o"))); 2645008f54a54299eaafdaa940e2bdeaf55935ecd95aDaniel Dunbar } 2646008f54a54299eaafdaa940e2bdeaf55935ecd95aDaniel Dunbar 2647c21c485b4fb58ef5d55cf3e523263dd824a2ace4Daniel Dunbar const char *Exec = 26485ed34f4c58b6ad4e21038d713c1fae31a6146ff5Daniel Dunbar Args.MakeArgString(getToolChain().GetProgramPath(C, "ld")); 2649daab7b1016f0a82fefa4f7be6e63c57c06b19ffcDaniel Dunbar Dest.addCommand(new Command(JA, *this, Exec, CmdArgs)); 2650008f54a54299eaafdaa940e2bdeaf55935ecd95aDaniel Dunbar} 265111e1b40d759a643086f590f6ffbd9d68360bad46Daniel Dunbar 265211e1b40d759a643086f590f6ffbd9d68360bad46Daniel Dunbar/// DragonFly Tools 265311e1b40d759a643086f590f6ffbd9d68360bad46Daniel Dunbar 265411e1b40d759a643086f590f6ffbd9d68360bad46Daniel Dunbar// For now, DragonFly Assemble does just about the same as for 265511e1b40d759a643086f590f6ffbd9d68360bad46Daniel Dunbar// FreeBSD, but this may change soon. 265611e1b40d759a643086f590f6ffbd9d68360bad46Daniel Dunbarvoid dragonfly::Assemble::ConstructJob(Compilation &C, const JobAction &JA, 2657294691eb1caf551083acd7b08630ef21c3fd760dDaniel Dunbar Job &Dest, const InputInfo &Output, 2658294691eb1caf551083acd7b08630ef21c3fd760dDaniel Dunbar const InputInfoList &Inputs, 2659294691eb1caf551083acd7b08630ef21c3fd760dDaniel Dunbar const ArgList &Args, 2660294691eb1caf551083acd7b08630ef21c3fd760dDaniel Dunbar const char *LinkingOutput) const { 266111e1b40d759a643086f590f6ffbd9d68360bad46Daniel Dunbar ArgStringList CmdArgs; 266211e1b40d759a643086f590f6ffbd9d68360bad46Daniel Dunbar 266311e1b40d759a643086f590f6ffbd9d68360bad46Daniel Dunbar // When building 32-bit code on DragonFly/pc64, we have to explicitly 266411e1b40d759a643086f590f6ffbd9d68360bad46Daniel Dunbar // instruct as in the base system to assemble 32-bit code. 266511e1b40d759a643086f590f6ffbd9d68360bad46Daniel Dunbar if (getToolChain().getArchName() == "i386") 266611e1b40d759a643086f590f6ffbd9d68360bad46Daniel Dunbar CmdArgs.push_back("--32"); 266711e1b40d759a643086f590f6ffbd9d68360bad46Daniel Dunbar 266811e1b40d759a643086f590f6ffbd9d68360bad46Daniel Dunbar Args.AddAllArgValues(CmdArgs, options::OPT_Wa_COMMA, 266911e1b40d759a643086f590f6ffbd9d68360bad46Daniel Dunbar options::OPT_Xassembler); 267011e1b40d759a643086f590f6ffbd9d68360bad46Daniel Dunbar 267111e1b40d759a643086f590f6ffbd9d68360bad46Daniel Dunbar CmdArgs.push_back("-o"); 267211e1b40d759a643086f590f6ffbd9d68360bad46Daniel Dunbar if (Output.isPipe()) 267311e1b40d759a643086f590f6ffbd9d68360bad46Daniel Dunbar CmdArgs.push_back("-"); 267411e1b40d759a643086f590f6ffbd9d68360bad46Daniel Dunbar else 267511e1b40d759a643086f590f6ffbd9d68360bad46Daniel Dunbar CmdArgs.push_back(Output.getFilename()); 267611e1b40d759a643086f590f6ffbd9d68360bad46Daniel Dunbar 267711e1b40d759a643086f590f6ffbd9d68360bad46Daniel Dunbar for (InputInfoList::const_iterator 267811e1b40d759a643086f590f6ffbd9d68360bad46Daniel Dunbar it = Inputs.begin(), ie = Inputs.end(); it != ie; ++it) { 267911e1b40d759a643086f590f6ffbd9d68360bad46Daniel Dunbar const InputInfo &II = *it; 268011e1b40d759a643086f590f6ffbd9d68360bad46Daniel Dunbar if (II.isPipe()) 268111e1b40d759a643086f590f6ffbd9d68360bad46Daniel Dunbar CmdArgs.push_back("-"); 268211e1b40d759a643086f590f6ffbd9d68360bad46Daniel Dunbar else 268311e1b40d759a643086f590f6ffbd9d68360bad46Daniel Dunbar CmdArgs.push_back(II.getFilename()); 268411e1b40d759a643086f590f6ffbd9d68360bad46Daniel Dunbar } 268511e1b40d759a643086f590f6ffbd9d68360bad46Daniel Dunbar 268611e1b40d759a643086f590f6ffbd9d68360bad46Daniel Dunbar const char *Exec = 26875ed34f4c58b6ad4e21038d713c1fae31a6146ff5Daniel Dunbar Args.MakeArgString(getToolChain().GetProgramPath(C, "as")); 2688daab7b1016f0a82fefa4f7be6e63c57c06b19ffcDaniel Dunbar Dest.addCommand(new Command(JA, *this, Exec, CmdArgs)); 268911e1b40d759a643086f590f6ffbd9d68360bad46Daniel Dunbar} 269011e1b40d759a643086f590f6ffbd9d68360bad46Daniel Dunbar 269111e1b40d759a643086f590f6ffbd9d68360bad46Daniel Dunbarvoid dragonfly::Link::ConstructJob(Compilation &C, const JobAction &JA, 269211e1b40d759a643086f590f6ffbd9d68360bad46Daniel Dunbar Job &Dest, const InputInfo &Output, 269311e1b40d759a643086f590f6ffbd9d68360bad46Daniel Dunbar const InputInfoList &Inputs, 269411e1b40d759a643086f590f6ffbd9d68360bad46Daniel Dunbar const ArgList &Args, 269511e1b40d759a643086f590f6ffbd9d68360bad46Daniel Dunbar const char *LinkingOutput) const { 2696ee788e70fcd0adf76103b17c78ac658d4ea30c9bDaniel Dunbar const Driver &D = getToolChain().getDriver(); 269711e1b40d759a643086f590f6ffbd9d68360bad46Daniel Dunbar ArgStringList CmdArgs; 269811e1b40d759a643086f590f6ffbd9d68360bad46Daniel Dunbar 269911e1b40d759a643086f590f6ffbd9d68360bad46Daniel Dunbar if (Args.hasArg(options::OPT_static)) { 270011e1b40d759a643086f590f6ffbd9d68360bad46Daniel Dunbar CmdArgs.push_back("-Bstatic"); 270111e1b40d759a643086f590f6ffbd9d68360bad46Daniel Dunbar } else { 270211e1b40d759a643086f590f6ffbd9d68360bad46Daniel Dunbar if (Args.hasArg(options::OPT_shared)) 270311e1b40d759a643086f590f6ffbd9d68360bad46Daniel Dunbar CmdArgs.push_back("-Bshareable"); 270411e1b40d759a643086f590f6ffbd9d68360bad46Daniel Dunbar else { 270511e1b40d759a643086f590f6ffbd9d68360bad46Daniel Dunbar CmdArgs.push_back("-dynamic-linker"); 270611e1b40d759a643086f590f6ffbd9d68360bad46Daniel Dunbar CmdArgs.push_back("/usr/libexec/ld-elf.so.2"); 270711e1b40d759a643086f590f6ffbd9d68360bad46Daniel Dunbar } 270811e1b40d759a643086f590f6ffbd9d68360bad46Daniel Dunbar } 270911e1b40d759a643086f590f6ffbd9d68360bad46Daniel Dunbar 271011e1b40d759a643086f590f6ffbd9d68360bad46Daniel Dunbar // When building 32-bit code on DragonFly/pc64, we have to explicitly 271111e1b40d759a643086f590f6ffbd9d68360bad46Daniel Dunbar // instruct ld in the base system to link 32-bit code. 271211e1b40d759a643086f590f6ffbd9d68360bad46Daniel Dunbar if (getToolChain().getArchName() == "i386") { 271311e1b40d759a643086f590f6ffbd9d68360bad46Daniel Dunbar CmdArgs.push_back("-m"); 271411e1b40d759a643086f590f6ffbd9d68360bad46Daniel Dunbar CmdArgs.push_back("elf_i386"); 271511e1b40d759a643086f590f6ffbd9d68360bad46Daniel Dunbar } 271611e1b40d759a643086f590f6ffbd9d68360bad46Daniel Dunbar 271711e1b40d759a643086f590f6ffbd9d68360bad46Daniel Dunbar if (Output.isPipe()) { 271811e1b40d759a643086f590f6ffbd9d68360bad46Daniel Dunbar CmdArgs.push_back("-o"); 271911e1b40d759a643086f590f6ffbd9d68360bad46Daniel Dunbar CmdArgs.push_back("-"); 272011e1b40d759a643086f590f6ffbd9d68360bad46Daniel Dunbar } else if (Output.isFilename()) { 272111e1b40d759a643086f590f6ffbd9d68360bad46Daniel Dunbar CmdArgs.push_back("-o"); 272211e1b40d759a643086f590f6ffbd9d68360bad46Daniel Dunbar CmdArgs.push_back(Output.getFilename()); 272311e1b40d759a643086f590f6ffbd9d68360bad46Daniel Dunbar } else { 272411e1b40d759a643086f590f6ffbd9d68360bad46Daniel Dunbar assert(Output.isNothing() && "Invalid output."); 272511e1b40d759a643086f590f6ffbd9d68360bad46Daniel Dunbar } 272611e1b40d759a643086f590f6ffbd9d68360bad46Daniel Dunbar 272711e1b40d759a643086f590f6ffbd9d68360bad46Daniel Dunbar if (!Args.hasArg(options::OPT_nostdlib) && 272811e1b40d759a643086f590f6ffbd9d68360bad46Daniel Dunbar !Args.hasArg(options::OPT_nostartfiles)) { 272911e1b40d759a643086f590f6ffbd9d68360bad46Daniel Dunbar if (!Args.hasArg(options::OPT_shared)) { 27305ed34f4c58b6ad4e21038d713c1fae31a6146ff5Daniel Dunbar CmdArgs.push_back(Args.MakeArgString(getToolChain().GetFilePath(C, "crt1.o"))); 27315ed34f4c58b6ad4e21038d713c1fae31a6146ff5Daniel Dunbar CmdArgs.push_back(Args.MakeArgString(getToolChain().GetFilePath(C, "crti.o"))); 27325ed34f4c58b6ad4e21038d713c1fae31a6146ff5Daniel Dunbar CmdArgs.push_back(Args.MakeArgString(getToolChain().GetFilePath(C, "crtbegin.o"))); 273311e1b40d759a643086f590f6ffbd9d68360bad46Daniel Dunbar } else { 27345ed34f4c58b6ad4e21038d713c1fae31a6146ff5Daniel Dunbar CmdArgs.push_back(Args.MakeArgString(getToolChain().GetFilePath(C, "crti.o"))); 27355ed34f4c58b6ad4e21038d713c1fae31a6146ff5Daniel Dunbar CmdArgs.push_back(Args.MakeArgString(getToolChain().GetFilePath(C, "crtbeginS.o"))); 273611e1b40d759a643086f590f6ffbd9d68360bad46Daniel Dunbar } 273711e1b40d759a643086f590f6ffbd9d68360bad46Daniel Dunbar } 273811e1b40d759a643086f590f6ffbd9d68360bad46Daniel Dunbar 273911e1b40d759a643086f590f6ffbd9d68360bad46Daniel Dunbar Args.AddAllArgs(CmdArgs, options::OPT_L); 274011e1b40d759a643086f590f6ffbd9d68360bad46Daniel Dunbar Args.AddAllArgs(CmdArgs, options::OPT_T_Group); 274111e1b40d759a643086f590f6ffbd9d68360bad46Daniel Dunbar Args.AddAllArgs(CmdArgs, options::OPT_e); 274211e1b40d759a643086f590f6ffbd9d68360bad46Daniel Dunbar 274311e1b40d759a643086f590f6ffbd9d68360bad46Daniel Dunbar for (InputInfoList::const_iterator 274411e1b40d759a643086f590f6ffbd9d68360bad46Daniel Dunbar it = Inputs.begin(), ie = Inputs.end(); it != ie; ++it) { 274511e1b40d759a643086f590f6ffbd9d68360bad46Daniel Dunbar const InputInfo &II = *it; 2746a8304f67291b0182fb64f3afc621615288dd1d31Daniel Dunbar 2747a8304f67291b0182fb64f3afc621615288dd1d31Daniel Dunbar // Don't try to pass LLVM inputs to a generic gcc. 2748a8304f67291b0182fb64f3afc621615288dd1d31Daniel Dunbar if (II.getType() == types::TY_LLVMBC) 2749a8304f67291b0182fb64f3afc621615288dd1d31Daniel Dunbar D.Diag(clang::diag::err_drv_no_linker_llvm_support) 2750881376467c46c5c6cc16fa6790271c2c22e1d4f1Daniel Dunbar << getToolChain().getTripleString(); 2751a8304f67291b0182fb64f3afc621615288dd1d31Daniel Dunbar 275211e1b40d759a643086f590f6ffbd9d68360bad46Daniel Dunbar if (II.isPipe()) 275311e1b40d759a643086f590f6ffbd9d68360bad46Daniel Dunbar CmdArgs.push_back("-"); 275411e1b40d759a643086f590f6ffbd9d68360bad46Daniel Dunbar else if (II.isFilename()) 275511e1b40d759a643086f590f6ffbd9d68360bad46Daniel Dunbar CmdArgs.push_back(II.getFilename()); 275611e1b40d759a643086f590f6ffbd9d68360bad46Daniel Dunbar else 275711e1b40d759a643086f590f6ffbd9d68360bad46Daniel Dunbar II.getInputArg().renderAsInput(Args, CmdArgs); 275811e1b40d759a643086f590f6ffbd9d68360bad46Daniel Dunbar } 275911e1b40d759a643086f590f6ffbd9d68360bad46Daniel Dunbar 276011e1b40d759a643086f590f6ffbd9d68360bad46Daniel Dunbar if (!Args.hasArg(options::OPT_nostdlib) && 276111e1b40d759a643086f590f6ffbd9d68360bad46Daniel Dunbar !Args.hasArg(options::OPT_nodefaultlibs)) { 276211e1b40d759a643086f590f6ffbd9d68360bad46Daniel Dunbar // FIXME: GCC passes on -lgcc, -lgcc_pic and a whole lot of 276311e1b40d759a643086f590f6ffbd9d68360bad46Daniel Dunbar // rpaths 276411e1b40d759a643086f590f6ffbd9d68360bad46Daniel Dunbar CmdArgs.push_back("-L/usr/lib/gcc41"); 276511e1b40d759a643086f590f6ffbd9d68360bad46Daniel Dunbar 276611e1b40d759a643086f590f6ffbd9d68360bad46Daniel Dunbar if (!Args.hasArg(options::OPT_static)) { 276711e1b40d759a643086f590f6ffbd9d68360bad46Daniel Dunbar CmdArgs.push_back("-rpath"); 276811e1b40d759a643086f590f6ffbd9d68360bad46Daniel Dunbar CmdArgs.push_back("/usr/lib/gcc41"); 276911e1b40d759a643086f590f6ffbd9d68360bad46Daniel Dunbar 277011e1b40d759a643086f590f6ffbd9d68360bad46Daniel Dunbar CmdArgs.push_back("-rpath-link"); 277111e1b40d759a643086f590f6ffbd9d68360bad46Daniel Dunbar CmdArgs.push_back("/usr/lib/gcc41"); 277211e1b40d759a643086f590f6ffbd9d68360bad46Daniel Dunbar 277311e1b40d759a643086f590f6ffbd9d68360bad46Daniel Dunbar CmdArgs.push_back("-rpath"); 277411e1b40d759a643086f590f6ffbd9d68360bad46Daniel Dunbar CmdArgs.push_back("/usr/lib"); 277511e1b40d759a643086f590f6ffbd9d68360bad46Daniel Dunbar 277611e1b40d759a643086f590f6ffbd9d68360bad46Daniel Dunbar CmdArgs.push_back("-rpath-link"); 277711e1b40d759a643086f590f6ffbd9d68360bad46Daniel Dunbar CmdArgs.push_back("/usr/lib"); 277811e1b40d759a643086f590f6ffbd9d68360bad46Daniel Dunbar } 277911e1b40d759a643086f590f6ffbd9d68360bad46Daniel Dunbar 278011e1b40d759a643086f590f6ffbd9d68360bad46Daniel Dunbar if (Args.hasArg(options::OPT_shared)) { 278111e1b40d759a643086f590f6ffbd9d68360bad46Daniel Dunbar CmdArgs.push_back("-lgcc_pic"); 278211e1b40d759a643086f590f6ffbd9d68360bad46Daniel Dunbar } else { 278311e1b40d759a643086f590f6ffbd9d68360bad46Daniel Dunbar CmdArgs.push_back("-lgcc"); 278411e1b40d759a643086f590f6ffbd9d68360bad46Daniel Dunbar } 278511e1b40d759a643086f590f6ffbd9d68360bad46Daniel Dunbar 278611e1b40d759a643086f590f6ffbd9d68360bad46Daniel Dunbar 278711e1b40d759a643086f590f6ffbd9d68360bad46Daniel Dunbar if (Args.hasArg(options::OPT_pthread)) 27884d63f8bc2686d5d7580324407854f2ca7c128832Mike Stump CmdArgs.push_back("-lpthread"); 278911e1b40d759a643086f590f6ffbd9d68360bad46Daniel Dunbar 279011e1b40d759a643086f590f6ffbd9d68360bad46Daniel Dunbar if (!Args.hasArg(options::OPT_nolibc)) { 279111e1b40d759a643086f590f6ffbd9d68360bad46Daniel Dunbar CmdArgs.push_back("-lc"); 279211e1b40d759a643086f590f6ffbd9d68360bad46Daniel Dunbar } 279311e1b40d759a643086f590f6ffbd9d68360bad46Daniel Dunbar 279411e1b40d759a643086f590f6ffbd9d68360bad46Daniel Dunbar if (Args.hasArg(options::OPT_shared)) { 279511e1b40d759a643086f590f6ffbd9d68360bad46Daniel Dunbar CmdArgs.push_back("-lgcc_pic"); 279611e1b40d759a643086f590f6ffbd9d68360bad46Daniel Dunbar } else { 279711e1b40d759a643086f590f6ffbd9d68360bad46Daniel Dunbar CmdArgs.push_back("-lgcc"); 279811e1b40d759a643086f590f6ffbd9d68360bad46Daniel Dunbar } 279911e1b40d759a643086f590f6ffbd9d68360bad46Daniel Dunbar } 280011e1b40d759a643086f590f6ffbd9d68360bad46Daniel Dunbar 280111e1b40d759a643086f590f6ffbd9d68360bad46Daniel Dunbar if (!Args.hasArg(options::OPT_nostdlib) && 280211e1b40d759a643086f590f6ffbd9d68360bad46Daniel Dunbar !Args.hasArg(options::OPT_nostartfiles)) { 280311e1b40d759a643086f590f6ffbd9d68360bad46Daniel Dunbar if (!Args.hasArg(options::OPT_shared)) 28045ed34f4c58b6ad4e21038d713c1fae31a6146ff5Daniel Dunbar CmdArgs.push_back(Args.MakeArgString(getToolChain().GetFilePath(C, "crtend.o"))); 280511e1b40d759a643086f590f6ffbd9d68360bad46Daniel Dunbar else 28065ed34f4c58b6ad4e21038d713c1fae31a6146ff5Daniel Dunbar CmdArgs.push_back(Args.MakeArgString(getToolChain().GetFilePath(C, "crtendS.o"))); 28075ed34f4c58b6ad4e21038d713c1fae31a6146ff5Daniel Dunbar CmdArgs.push_back(Args.MakeArgString(getToolChain().GetFilePath(C, "crtn.o"))); 280811e1b40d759a643086f590f6ffbd9d68360bad46Daniel Dunbar } 280911e1b40d759a643086f590f6ffbd9d68360bad46Daniel Dunbar 281011e1b40d759a643086f590f6ffbd9d68360bad46Daniel Dunbar const char *Exec = 28115ed34f4c58b6ad4e21038d713c1fae31a6146ff5Daniel Dunbar Args.MakeArgString(getToolChain().GetProgramPath(C, "ld")); 2812daab7b1016f0a82fefa4f7be6e63c57c06b19ffcDaniel Dunbar Dest.addCommand(new Command(JA, *this, Exec, CmdArgs)); 281311e1b40d759a643086f590f6ffbd9d68360bad46Daniel Dunbar} 2814