blob: 5bc7d5e7dcd4b9e57f4472f1310494047034e5d6 [file] [log] [blame]
Nick Lewyckye47c2452010-09-23 23:48:20 +00001//===--- Tools.cpp - Tools Implementations --------------------------------===//
Daniel Dunbar1a093d22009-03-18 06:00:36 +00002//
3// The LLVM Compiler Infrastructure
4//
5// This file is distributed under the University of Illinois Open Source
6// License. See LICENSE.TXT for details.
7//
8//===----------------------------------------------------------------------===//
9
10#include "Tools.h"
Chandler Carruth3a022472012-12-04 09:13:33 +000011#include "InputInfo.h"
Chandler Carruth3a022472012-12-04 09:13:33 +000012#include "ToolChains.h"
Josh Mageee0fc1a82014-02-11 01:35:14 +000013#include "clang/Basic/LangOptions.h"
Chandler Carruth3a022472012-12-04 09:13:33 +000014#include "clang/Basic/ObjCRuntime.h"
Kevin Enderbyae2ec472013-01-17 21:38:06 +000015#include "clang/Basic/Version.h"
Daniel Dunbara2aedc62009-03-18 10:01:51 +000016#include "clang/Driver/Action.h"
Chandler Carruth3a022472012-12-04 09:13:33 +000017#include "clang/Driver/Compilation.h"
Daniel Dunbar1a8a2e82009-10-29 02:39:57 +000018#include "clang/Driver/Driver.h"
19#include "clang/Driver/DriverDiagnostic.h"
Daniel Dunbar04c4c2c2009-03-18 07:06:02 +000020#include "clang/Driver/Job.h"
Daniel Dunbarda13faf2009-11-19 04:25:22 +000021#include "clang/Driver/Options.h"
Alexey Samsonov609213f92013-08-19 09:14:21 +000022#include "clang/Driver/SanitizerArgs.h"
Daniel Dunbara3246a02009-03-18 08:07:30 +000023#include "clang/Driver/ToolChain.h"
Daniel Dunbar04c4c2c2009-03-18 07:06:02 +000024#include "clang/Driver/Util.h"
Daniel Dunbar1c28f1e2009-09-09 22:32:48 +000025#include "llvm/ADT/SmallString.h"
Hans Wennborg188382e2013-09-20 18:16:35 +000026#include "llvm/ADT/StringExtras.h"
Douglas Gregorf7b87cb2009-10-29 00:41:01 +000027#include "llvm/ADT/StringSwitch.h"
Daniel Dunbarb4a3e432009-09-09 22:32:34 +000028#include "llvm/ADT/Twine.h"
Reid Kleckner898229a2013-06-14 17:17:23 +000029#include "llvm/Option/Arg.h"
30#include "llvm/Option/ArgList.h"
31#include "llvm/Option/Option.h"
David Blaikie24bbfed22014-03-31 23:29:38 +000032#include "llvm/Support/Compression.h"
Chandler Carruth3a022472012-12-04 09:13:33 +000033#include "llvm/Support/ErrorHandling.h"
Michael J. Spencerf6efe582011-01-10 02:34:13 +000034#include "llvm/Support/FileSystem.h"
Daniel Dunbarc1964212009-03-26 16:23:12 +000035#include "llvm/Support/Format.h"
Michael J. Spencer8aaf4992010-11-29 18:12:39 +000036#include "llvm/Support/Host.h"
Hans Wennborg188382e2013-09-20 18:16:35 +000037#include "llvm/Support/Path.h"
Michael J. Spencer8aaf4992010-11-29 18:12:39 +000038#include "llvm/Support/Process.h"
Chandler Carruth5553d0d2014-01-07 11:51:46 +000039#include "llvm/Support/Program.h"
Chandler Carruth3a022472012-12-04 09:13:33 +000040#include "llvm/Support/raw_ostream.h"
Reid Kleckner898229a2013-06-14 17:17:23 +000041#include <sys/stat.h>
Daniel Dunbar04c4c2c2009-03-18 07:06:02 +000042
Daniel Dunbar1a093d22009-03-18 06:00:36 +000043using namespace clang::driver;
44using namespace clang::driver::tools;
Chris Lattner0e62c1c2011-07-23 10:55:15 +000045using namespace clang;
Reid Kleckner898229a2013-06-14 17:17:23 +000046using namespace llvm::opt;
Daniel Dunbar1a093d22009-03-18 06:00:36 +000047
Joerg Sonnenbergerc151b022014-02-19 21:58:52 +000048static void addAssemblerKPIC(const ArgList &Args, ArgStringList &CmdArgs) {
49 Arg *LastPICArg = Args.getLastArg(options::OPT_fPIC, options::OPT_fno_PIC,
50 options::OPT_fpic, options::OPT_fno_pic,
51 options::OPT_fPIE, options::OPT_fno_PIE,
52 options::OPT_fpie, options::OPT_fno_pie);
53 if (!LastPICArg)
54 return;
55 if (LastPICArg->getOption().matches(options::OPT_fPIC) ||
56 LastPICArg->getOption().matches(options::OPT_fpic) ||
57 LastPICArg->getOption().matches(options::OPT_fPIE) ||
58 LastPICArg->getOption().matches(options::OPT_fpie)) {
59 CmdArgs.push_back("-KPIC");
60 }
61}
62
Daniel Dunbar64198ef2009-09-10 01:21:05 +000063/// CheckPreprocessingOptions - Perform some validation of preprocessing
64/// arguments that is shared with gcc.
65static void CheckPreprocessingOptions(const Driver &D, const ArgList &Args) {
66 if (Arg *A = Args.getLastArg(options::OPT_C, options::OPT_CC))
Hans Wennborg70850d82013-07-18 20:29:38 +000067 if (!Args.hasArg(options::OPT_E) && !D.CCCIsCPP())
Chris Lattner0e62c1c2011-07-23 10:55:15 +000068 D.Diag(diag::err_drv_argument_only_allowed_with)
Daniel Dunbar64198ef2009-09-10 01:21:05 +000069 << A->getAsString(Args) << "-E";
70}
71
Daniel Dunbar4eadb602009-09-10 01:21:12 +000072/// CheckCodeGenerationOptions - Perform some validation of code generation
73/// arguments that is shared with gcc.
74static void CheckCodeGenerationOptions(const Driver &D, const ArgList &Args) {
75 // In gcc, only ARM checks this, but it seems reasonable to check universally.
76 if (Args.hasArg(options::OPT_static))
77 if (const Arg *A = Args.getLastArg(options::OPT_dynamic,
78 options::OPT_mdynamic_no_pic))
Chris Lattner0e62c1c2011-07-23 10:55:15 +000079 D.Diag(diag::err_drv_argument_not_allowed_with)
Daniel Dunbar4eadb602009-09-10 01:21:12 +000080 << A->getAsString(Args) << "-static";
81}
82
Chris Lattnerbf2803f2010-03-29 17:55:58 +000083// Quote target names for inclusion in GNU Make dependency files.
84// Only the characters '$', '#', ' ', '\t' are quoted.
Chris Lattner0e62c1c2011-07-23 10:55:15 +000085static void QuoteTarget(StringRef Target,
86 SmallVectorImpl<char> &Res) {
Chris Lattnerbf2803f2010-03-29 17:55:58 +000087 for (unsigned i = 0, e = Target.size(); i != e; ++i) {
88 switch (Target[i]) {
89 case ' ':
90 case '\t':
91 // Escape the preceding backslashes
92 for (int j = i - 1; j >= 0 && Target[j] == '\\'; --j)
93 Res.push_back('\\');
94
95 // Escape the space/tab
96 Res.push_back('\\');
97 break;
98 case '$':
99 Res.push_back('$');
100 break;
101 case '#':
102 Res.push_back('\\');
103 break;
104 default:
105 break;
106 }
107
108 Res.push_back(Target[i]);
109 }
110}
111
Bill Wendlingc0938f32012-03-12 22:10:06 +0000112static void addDirectoryList(const ArgList &Args,
Bill Wendling281ca292012-03-12 21:22:35 +0000113 ArgStringList &CmdArgs,
114 const char *ArgName,
Bill Wendlingc0938f32012-03-12 22:10:06 +0000115 const char *EnvVar) {
116 const char *DirList = ::getenv(EnvVar);
Chad Rosier616e8a52012-10-30 21:42:09 +0000117 bool CombinedArg = false;
118
Bill Wendling281ca292012-03-12 21:22:35 +0000119 if (!DirList)
120 return; // Nothing to do.
121
Chad Rosier616e8a52012-10-30 21:42:09 +0000122 StringRef Name(ArgName);
123 if (Name.equals("-I") || Name.equals("-L"))
124 CombinedArg = true;
125
Bill Wendling281ca292012-03-12 21:22:35 +0000126 StringRef Dirs(DirList);
127 if (Dirs.empty()) // Empty string should not add '.'.
128 return;
129
130 StringRef::size_type Delim;
Rafael Espindola04b3fc42013-06-25 14:29:51 +0000131 while ((Delim = Dirs.find(llvm::sys::EnvPathSeparator)) != StringRef::npos) {
Bill Wendling281ca292012-03-12 21:22:35 +0000132 if (Delim == 0) { // Leading colon.
Chad Rosier616e8a52012-10-30 21:42:09 +0000133 if (CombinedArg) {
134 CmdArgs.push_back(Args.MakeArgString(std::string(ArgName) + "."));
135 } else {
136 CmdArgs.push_back(ArgName);
137 CmdArgs.push_back(".");
138 }
Bill Wendling281ca292012-03-12 21:22:35 +0000139 } else {
Chad Rosier616e8a52012-10-30 21:42:09 +0000140 if (CombinedArg) {
141 CmdArgs.push_back(Args.MakeArgString(std::string(ArgName) + Dirs.substr(0, Delim)));
142 } else {
143 CmdArgs.push_back(ArgName);
144 CmdArgs.push_back(Args.MakeArgString(Dirs.substr(0, Delim)));
145 }
Bill Wendling281ca292012-03-12 21:22:35 +0000146 }
Nico Weber89355782012-03-19 15:00:03 +0000147 Dirs = Dirs.substr(Delim + 1);
Bill Wendling281ca292012-03-12 21:22:35 +0000148 }
149
150 if (Dirs.empty()) { // Trailing colon.
Chad Rosier616e8a52012-10-30 21:42:09 +0000151 if (CombinedArg) {
152 CmdArgs.push_back(Args.MakeArgString(std::string(ArgName) + "."));
153 } else {
154 CmdArgs.push_back(ArgName);
155 CmdArgs.push_back(".");
156 }
Bill Wendling281ca292012-03-12 21:22:35 +0000157 } else { // Add the last path.
Chad Rosier616e8a52012-10-30 21:42:09 +0000158 if (CombinedArg) {
159 CmdArgs.push_back(Args.MakeArgString(std::string(ArgName) + Dirs));
160 } else {
161 CmdArgs.push_back(ArgName);
162 CmdArgs.push_back(Args.MakeArgString(Dirs));
163 }
Bill Wendling281ca292012-03-12 21:22:35 +0000164 }
165}
166
Daniel Dunbar54423b22010-09-17 00:24:54 +0000167static void AddLinkerInputs(const ToolChain &TC,
168 const InputInfoList &Inputs, const ArgList &Args,
169 ArgStringList &CmdArgs) {
170 const Driver &D = TC.getDriver();
171
Daniel Dunbar1094bb12011-02-19 05:33:51 +0000172 // Add extra linker input arguments which are not treated as inputs
173 // (constructed via -Xarch_).
174 Args.AddAllArgValues(CmdArgs, options::OPT_Zlinker_input);
175
Daniel Dunbar54423b22010-09-17 00:24:54 +0000176 for (InputInfoList::const_iterator
177 it = Inputs.begin(), ie = Inputs.end(); it != ie; ++it) {
178 const InputInfo &II = *it;
179
180 if (!TC.HasNativeLLVMSupport()) {
181 // Don't try to pass LLVM inputs unless we have native support.
182 if (II.getType() == types::TY_LLVM_IR ||
183 II.getType() == types::TY_LTO_IR ||
184 II.getType() == types::TY_LLVM_BC ||
185 II.getType() == types::TY_LTO_BC)
Chris Lattner0e62c1c2011-07-23 10:55:15 +0000186 D.Diag(diag::err_drv_no_linker_llvm_support)
Daniel Dunbar54423b22010-09-17 00:24:54 +0000187 << TC.getTripleString();
188 }
189
Daniel Dunbar2cc3f172010-09-17 00:45:02 +0000190 // Add filenames immediately.
191 if (II.isFilename()) {
Daniel Dunbar54423b22010-09-17 00:24:54 +0000192 CmdArgs.push_back(II.getFilename());
Daniel Dunbar2cc3f172010-09-17 00:45:02 +0000193 continue;
194 }
195
196 // Otherwise, this is a linker input argument.
197 const Arg &A = II.getInputArg();
198
199 // Handle reserved library options.
200 if (A.getOption().matches(options::OPT_Z_reserved_lib_stdcxx)) {
Daniel Dunbar3f7796f2010-09-17 01:20:05 +0000201 TC.AddCXXStdlibLibArgs(Args, CmdArgs);
Shantonu Senafeb03b2010-09-17 18:39:08 +0000202 } else if (A.getOption().matches(options::OPT_Z_reserved_lib_cckext)) {
203 TC.AddCCKextLibArgs(Args, CmdArgs);
Daniel Dunbar2cc3f172010-09-17 00:45:02 +0000204 } else
205 A.renderAsInput(Args, CmdArgs);
Daniel Dunbar54423b22010-09-17 00:24:54 +0000206 }
Bill Wendling281ca292012-03-12 21:22:35 +0000207
208 // LIBRARY_PATH - included following the user specified library paths.
Richard Barton5828d7b2013-12-17 11:11:25 +0000209 // and only supported on native toolchains.
210 if (!TC.isCrossCompiling())
211 addDirectoryList(Args, CmdArgs, "-L", "LIBRARY_PATH");
Daniel Dunbar54423b22010-09-17 00:24:54 +0000212}
213
John McCall31168b02011-06-15 23:02:42 +0000214/// \brief Determine whether Objective-C automated reference counting is
215/// enabled.
216static bool isObjCAutoRefCount(const ArgList &Args) {
217 return Args.hasFlag(options::OPT_fobjc_arc, options::OPT_fno_objc_arc, false);
218}
219
Ted Kremeneke65b0862012-03-06 20:05:56 +0000220/// \brief Determine whether we are linking the ObjC runtime.
221static bool isObjCRuntimeLinked(const ArgList &Args) {
Bob Wilson29536fc2012-08-07 19:58:00 +0000222 if (isObjCAutoRefCount(Args)) {
223 Args.ClaimAllArgs(options::OPT_fobjc_link_runtime);
Ted Kremeneke65b0862012-03-06 20:05:56 +0000224 return true;
Bob Wilson29536fc2012-08-07 19:58:00 +0000225 }
Ted Kremeneke65b0862012-03-06 20:05:56 +0000226 return Args.hasArg(options::OPT_fobjc_link_runtime);
227}
228
Michael J. Spencer66e2b202012-10-19 22:37:06 +0000229static bool forwardToGCC(const Option &O) {
Reid Kleckner3793d5e2013-06-19 15:09:06 +0000230 // Don't forward inputs from the original command line. They are added from
231 // InputInfoList.
Richard Smith8e5e9762013-06-20 01:33:59 +0000232 return O.getKind() != Option::InputClass &&
Michael J. Spencer66e2b202012-10-19 22:37:06 +0000233 !O.hasFlag(options::DriverOption) &&
234 !O.hasFlag(options::LinkerInput);
235}
236
Peter Collingbourne9b515cb2011-11-06 00:40:05 +0000237void Clang::AddPreprocessingOptions(Compilation &C,
Chad Rosier633dcdc2013-01-24 19:14:47 +0000238 const JobAction &JA,
Peter Collingbourne9b515cb2011-11-06 00:40:05 +0000239 const Driver &D,
Douglas Gregor111af7d2009-04-18 00:34:01 +0000240 const ArgList &Args,
Daniel Dunbard067f7f2009-04-08 23:54:23 +0000241 ArgStringList &CmdArgs,
242 const InputInfo &Output,
243 const InputInfoList &Inputs) const {
Daniel Dunbard067f7f2009-04-08 23:54:23 +0000244 Arg *A;
Daniel Dunbar367dbb92009-06-08 21:48:20 +0000245
Daniel Dunbar64198ef2009-09-10 01:21:05 +0000246 CheckPreprocessingOptions(D, Args);
247
248 Args.AddLastArg(CmdArgs, options::OPT_C);
249 Args.AddLastArg(CmdArgs, options::OPT_CC);
Daniel Dunbar367dbb92009-06-08 21:48:20 +0000250
251 // Handle dependency file generation.
Daniel Dunbar86aed7d2010-12-08 21:33:40 +0000252 if ((A = Args.getLastArg(options::OPT_M, options::OPT_MM)) ||
Daniel Dunbard067f7f2009-04-08 23:54:23 +0000253 (A = Args.getLastArg(options::OPT_MD)) ||
254 (A = Args.getLastArg(options::OPT_MMD))) {
255 // Determine the output location.
256 const char *DepFile;
Benjamin Kramer2715fce2012-09-26 19:01:49 +0000257 if (Arg *MF = Args.getLastArg(options::OPT_MF)) {
Richard Smithbd55daf2012-11-01 04:30:05 +0000258 DepFile = MF->getValue();
Chad Rosier633dcdc2013-01-24 19:14:47 +0000259 C.addFailureResultFile(DepFile, &JA);
Benjamin Kramer2715fce2012-09-26 19:01:49 +0000260 } else if (Output.getType() == types::TY_Dependencies) {
261 DepFile = Output.getFilename();
Daniel Dunbar0bfb21e2009-11-19 03:26:40 +0000262 } else if (A->getOption().matches(options::OPT_M) ||
263 A->getOption().matches(options::OPT_MM)) {
Daniel Dunbard067f7f2009-04-08 23:54:23 +0000264 DepFile = "-";
265 } else {
Bob Wilsondecc03e2012-11-23 06:14:39 +0000266 DepFile = getDependencyFileName(Args, Inputs);
Chad Rosier633dcdc2013-01-24 19:14:47 +0000267 C.addFailureResultFile(DepFile, &JA);
Daniel Dunbard067f7f2009-04-08 23:54:23 +0000268 }
269 CmdArgs.push_back("-dependency-file");
270 CmdArgs.push_back(DepFile);
271
Chris Lattnerbf2803f2010-03-29 17:55:58 +0000272 // Add a default target if one wasn't specified.
Daniel Dunbard067f7f2009-04-08 23:54:23 +0000273 if (!Args.hasArg(options::OPT_MT) && !Args.hasArg(options::OPT_MQ)) {
274 const char *DepTarget;
275
276 // If user provided -o, that is the dependency target, except
277 // when we are only generating a dependency file.
278 Arg *OutputOpt = Args.getLastArg(options::OPT_o);
279 if (OutputOpt && Output.getType() != types::TY_Dependencies) {
Richard Smithbd55daf2012-11-01 04:30:05 +0000280 DepTarget = OutputOpt->getValue();
Daniel Dunbard067f7f2009-04-08 23:54:23 +0000281 } else {
282 // Otherwise derive from the base input.
283 //
284 // FIXME: This should use the computed output file location.
Dylan Noblesmith2c1dd272012-02-05 02:13:05 +0000285 SmallString<128> P(Inputs[0].getBaseInput());
Michael J. Spencere1696752010-12-18 00:19:12 +0000286 llvm::sys::path::replace_extension(P, "o");
287 DepTarget = Args.MakeArgString(llvm::sys::path::filename(P));
Daniel Dunbard067f7f2009-04-08 23:54:23 +0000288 }
289
290 CmdArgs.push_back("-MT");
Dylan Noblesmith2c1dd272012-02-05 02:13:05 +0000291 SmallString<128> Quoted;
Chris Lattnerbf2803f2010-03-29 17:55:58 +0000292 QuoteTarget(DepTarget, Quoted);
293 CmdArgs.push_back(Args.MakeArgString(Quoted));
Daniel Dunbard067f7f2009-04-08 23:54:23 +0000294 }
295
Daniel Dunbar0bfb21e2009-11-19 03:26:40 +0000296 if (A->getOption().matches(options::OPT_M) ||
297 A->getOption().matches(options::OPT_MD))
Daniel Dunbard067f7f2009-04-08 23:54:23 +0000298 CmdArgs.push_back("-sys-header-deps");
Argyrios Kyrtzidis6d0753d2014-03-14 03:07:38 +0000299
300 if (isa<PrecompileJobAction>(JA))
301 CmdArgs.push_back("-module-file-deps");
Daniel Dunbard067f7f2009-04-08 23:54:23 +0000302 }
303
Peter Collingbourne77b0e7f22011-07-12 19:35:15 +0000304 if (Args.hasArg(options::OPT_MG)) {
305 if (!A || A->getOption().matches(options::OPT_MD) ||
306 A->getOption().matches(options::OPT_MMD))
Chris Lattner0e62c1c2011-07-23 10:55:15 +0000307 D.Diag(diag::err_drv_mg_requires_m_or_mm);
Peter Collingbourne77b0e7f22011-07-12 19:35:15 +0000308 CmdArgs.push_back("-MG");
309 }
310
Daniel Dunbard067f7f2009-04-08 23:54:23 +0000311 Args.AddLastArg(CmdArgs, options::OPT_MP);
Chris Lattnerbf2803f2010-03-29 17:55:58 +0000312
313 // Convert all -MQ <target> args to -MT <quoted target>
314 for (arg_iterator it = Args.filtered_begin(options::OPT_MT,
315 options::OPT_MQ),
316 ie = Args.filtered_end(); it != ie; ++it) {
Daniel Dunbara442fd52010-06-11 22:00:13 +0000317 const Arg *A = *it;
318 A->claim();
Chris Lattnerbf2803f2010-03-29 17:55:58 +0000319
Daniel Dunbara442fd52010-06-11 22:00:13 +0000320 if (A->getOption().matches(options::OPT_MQ)) {
Chris Lattnerbf2803f2010-03-29 17:55:58 +0000321 CmdArgs.push_back("-MT");
Dylan Noblesmith2c1dd272012-02-05 02:13:05 +0000322 SmallString<128> Quoted;
Richard Smithbd55daf2012-11-01 04:30:05 +0000323 QuoteTarget(A->getValue(), Quoted);
Chris Lattnerbf2803f2010-03-29 17:55:58 +0000324 CmdArgs.push_back(Args.MakeArgString(Quoted));
325
326 // -MT flag - no change
327 } else {
Daniel Dunbara442fd52010-06-11 22:00:13 +0000328 A->render(Args, CmdArgs);
Chris Lattnerbf2803f2010-03-29 17:55:58 +0000329 }
330 }
Daniel Dunbard067f7f2009-04-08 23:54:23 +0000331
Douglas Gregor111af7d2009-04-18 00:34:01 +0000332 // Add -i* options, and automatically translate to
333 // -include-pch/-include-pth for transparent PCH support. It's
334 // wonky, but we include looking for .gch so we can support seamless
335 // replacement into a build system already set up to be generating
336 // .gch files.
Argyrios Kyrtzidis2f23b412010-09-30 16:53:47 +0000337 bool RenderedImplicitInclude = false;
Daniel Dunbar44b36ee2009-11-25 11:53:23 +0000338 for (arg_iterator it = Args.filtered_begin(options::OPT_clang_i_Group),
339 ie = Args.filtered_end(); it != ie; ++it) {
340 const Arg *A = it;
Daniel Dunbard067f7f2009-04-08 23:54:23 +0000341
342 if (A->getOption().matches(options::OPT_include)) {
Argyrios Kyrtzidis2f23b412010-09-30 16:53:47 +0000343 bool IsFirstImplicitInclude = !RenderedImplicitInclude;
344 RenderedImplicitInclude = true;
345
Argyrios Kyrtzidis90bdfbb2010-08-11 23:27:58 +0000346 // Use PCH if the user requested it.
Daniel Dunbarcbc34b72009-10-15 20:02:44 +0000347 bool UsePCH = D.CCCUsePCH;
Daniel Dunbarcbc34b72009-10-15 20:02:44 +0000348
Daniel Dunbard067f7f2009-04-08 23:54:23 +0000349 bool FoundPTH = false;
Douglas Gregor111af7d2009-04-18 00:34:01 +0000350 bool FoundPCH = false;
Rafael Espindola00eaafd2013-06-25 15:03:59 +0000351 SmallString<128> P(A->getValue());
352 // We want the files to have a name like foo.h.pch. Add a dummy extension
353 // so that replace_extension does the right thing.
354 P += ".dummy";
Daniel Dunbarcbc34b72009-10-15 20:02:44 +0000355 if (UsePCH) {
Rafael Espindola00eaafd2013-06-25 15:03:59 +0000356 llvm::sys::path::replace_extension(P, "pch");
Rafael Espindola54bbaad2013-06-25 14:48:00 +0000357 if (llvm::sys::fs::exists(P.str()))
Douglas Gregor111af7d2009-04-18 00:34:01 +0000358 FoundPCH = true;
Daniel Dunbard067f7f2009-04-08 23:54:23 +0000359 }
360
Douglas Gregor111af7d2009-04-18 00:34:01 +0000361 if (!FoundPCH) {
Rafael Espindola00eaafd2013-06-25 15:03:59 +0000362 llvm::sys::path::replace_extension(P, "pth");
Rafael Espindola54bbaad2013-06-25 14:48:00 +0000363 if (llvm::sys::fs::exists(P.str()))
Douglas Gregor111af7d2009-04-18 00:34:01 +0000364 FoundPTH = true;
Mike Stump11289f42009-09-09 15:08:12 +0000365 }
366
Douglas Gregor111af7d2009-04-18 00:34:01 +0000367 if (!FoundPCH && !FoundPTH) {
Rafael Espindola00eaafd2013-06-25 15:03:59 +0000368 llvm::sys::path::replace_extension(P, "gch");
Rafael Espindola54bbaad2013-06-25 14:48:00 +0000369 if (llvm::sys::fs::exists(P.str())) {
Daniel Dunbarcbc34b72009-10-15 20:02:44 +0000370 FoundPCH = UsePCH;
371 FoundPTH = !UsePCH;
Douglas Gregor111af7d2009-04-18 00:34:01 +0000372 }
Douglas Gregor111af7d2009-04-18 00:34:01 +0000373 }
374
375 if (FoundPCH || FoundPTH) {
Argyrios Kyrtzidis2f23b412010-09-30 16:53:47 +0000376 if (IsFirstImplicitInclude) {
377 A->claim();
378 if (UsePCH)
379 CmdArgs.push_back("-include-pch");
380 else
381 CmdArgs.push_back("-include-pth");
382 CmdArgs.push_back(Args.MakeArgString(P.str()));
383 continue;
384 } else {
385 // Ignore the PCH if not first on command line and emit warning.
Chris Lattner0e62c1c2011-07-23 10:55:15 +0000386 D.Diag(diag::warn_drv_pch_not_first_include)
Argyrios Kyrtzidis2f23b412010-09-30 16:53:47 +0000387 << P.str() << A->getAsString(Args);
388 }
Daniel Dunbard067f7f2009-04-08 23:54:23 +0000389 }
390 }
391
392 // Not translated, render as usual.
393 A->claim();
394 A->render(Args, CmdArgs);
395 }
396
397 Args.AddAllArgs(CmdArgs, options::OPT_D, options::OPT_U);
Douglas Gregor9f93e382011-07-28 04:45:53 +0000398 Args.AddAllArgs(CmdArgs, options::OPT_I_Group, options::OPT_F,
399 options::OPT_index_header_map);
Daniel Dunbard067f7f2009-04-08 23:54:23 +0000400
401 // Add -Wp, and -Xassembler if using the preprocessor.
402
403 // FIXME: There is a very unfortunate problem here, some troubled
404 // souls abuse -Wp, to pass preprocessor options in gcc syntax. To
405 // really support that we would have to parse and then translate
406 // those options. :(
407 Args.AddAllArgValues(CmdArgs, options::OPT_Wp_COMMA,
408 options::OPT_Xpreprocessor);
Daniel Dunbar38b62792009-10-29 01:53:44 +0000409
410 // -I- is a deprecated GCC feature, reject it.
411 if (Arg *A = Args.getLastArg(options::OPT_I_))
Chris Lattner0e62c1c2011-07-23 10:55:15 +0000412 D.Diag(diag::err_drv_I_dash_not_supported) << A->getAsString(Args);
Chandler Carruth24e17e12010-10-20 07:00:47 +0000413
414 // If we have a --sysroot, and don't have an explicit -isysroot flag, add an
415 // -isysroot to the CC1 invocation.
Sebastian Pop980920a2012-04-16 04:16:43 +0000416 StringRef sysroot = C.getSysRoot();
417 if (sysroot != "") {
Chandler Carruth24e17e12010-10-20 07:00:47 +0000418 if (!Args.hasArg(options::OPT_isysroot)) {
419 CmdArgs.push_back("-isysroot");
Sebastian Pop980920a2012-04-16 04:16:43 +0000420 CmdArgs.push_back(C.getArgs().MakeArgString(sysroot));
Chandler Carruth24e17e12010-10-20 07:00:47 +0000421 }
422 }
Douglas Gregor5dc38992013-02-07 00:21:12 +0000423
Benjamin Kramer8404eb02011-09-22 21:41:16 +0000424 // Parse additional include paths from environment variables.
Chandler Carruth9802c142011-11-04 07:12:58 +0000425 // FIXME: We should probably sink the logic for handling these from the
426 // frontend into the driver. It will allow deleting 4 otherwise unused flags.
Benjamin Kramer8404eb02011-09-22 21:41:16 +0000427 // CPATH - included following the user specified includes (but prior to
428 // builtin and standard includes).
Bill Wendlingc0938f32012-03-12 22:10:06 +0000429 addDirectoryList(Args, CmdArgs, "-I", "CPATH");
Benjamin Kramer8404eb02011-09-22 21:41:16 +0000430 // C_INCLUDE_PATH - system includes enabled when compiling C.
Bill Wendlingc0938f32012-03-12 22:10:06 +0000431 addDirectoryList(Args, CmdArgs, "-c-isystem", "C_INCLUDE_PATH");
Benjamin Kramer8404eb02011-09-22 21:41:16 +0000432 // CPLUS_INCLUDE_PATH - system includes enabled when compiling C++.
Bill Wendlingc0938f32012-03-12 22:10:06 +0000433 addDirectoryList(Args, CmdArgs, "-cxx-isystem", "CPLUS_INCLUDE_PATH");
Benjamin Kramer8404eb02011-09-22 21:41:16 +0000434 // OBJC_INCLUDE_PATH - system includes enabled when compiling ObjC.
Bill Wendlingc0938f32012-03-12 22:10:06 +0000435 addDirectoryList(Args, CmdArgs, "-objc-isystem", "OBJC_INCLUDE_PATH");
Benjamin Kramer8404eb02011-09-22 21:41:16 +0000436 // OBJCPLUS_INCLUDE_PATH - system includes enabled when compiling ObjC++.
Bill Wendlingc0938f32012-03-12 22:10:06 +0000437 addDirectoryList(Args, CmdArgs, "-objcxx-isystem", "OBJCPLUS_INCLUDE_PATH");
Chandler Carruth6bfd84f2011-11-04 07:12:53 +0000438
Chandler Carruth6bfd84f2011-11-04 07:12:53 +0000439 // Add C++ include arguments, if needed.
Chandler Carruth4c81dfa2011-11-04 07:43:33 +0000440 if (types::isCXX(Inputs[0].getType()))
Chandler Carruth491db322011-11-04 07:34:47 +0000441 getToolChain().AddClangCXXStdlibIncludeArgs(Args, CmdArgs);
Chandler Carrutha796f532011-11-05 20:17:13 +0000442
443 // Add system include arguments.
444 getToolChain().AddClangSystemIncludeArgs(Args, CmdArgs);
Daniel Dunbard067f7f2009-04-08 23:54:23 +0000445}
446
Amara Emerson703da2e2013-10-31 09:32:33 +0000447/// getAArch64TargetCPU - Get the (LLVM) name of the AArch64 cpu we are targeting.
448//
449// FIXME: tblgen this.
450static std::string getAArch64TargetCPU(const ArgList &Args,
451 const llvm::Triple &Triple) {
452 // FIXME: Warn on inconsistent use of -mcpu and -march.
453
454 // If we have -mcpu=, use that.
455 if (Arg *A = Args.getLastArg(options::OPT_mcpu_EQ)) {
456 StringRef MCPU = A->getValue();
457 // Handle -mcpu=native.
458 if (MCPU == "native")
459 return llvm::sys::getHostCPUName();
460 else
461 return MCPU;
462 }
463
464 return "generic";
465}
466
Daniel Dunbard609b7b2009-11-17 06:37:03 +0000467// FIXME: Move to target hook.
468static bool isSignedCharDefault(const llvm::Triple &Triple) {
469 switch (Triple.getArch()) {
470 default:
471 return true;
472
Tim Northover9bb857a2013-01-31 12:13:10 +0000473 case llvm::Triple::aarch64:
Christian Pirker9b019ae2014-02-25 13:51:00 +0000474 case llvm::Triple::aarch64_be:
Tim Northovera2ee4332014-03-29 15:09:45 +0000475 case llvm::Triple::arm64:
Jim Grosbach7c2c6642011-05-24 15:40:46 +0000476 case llvm::Triple::arm:
Christian Pirkerf01cd6f2014-03-28 14:40:46 +0000477 case llvm::Triple::armeb:
Saleem Abdulrasoolf4c9e492014-04-04 20:31:19 +0000478 if (Triple.isOSDarwin() || Triple.isOSWindows())
479 return true;
480 return false;
481
Daniel Dunbard609b7b2009-11-17 06:37:03 +0000482 case llvm::Triple::ppc:
483 case llvm::Triple::ppc64:
Jonathan Roelofs2cea1be2014-02-12 03:21:20 +0000484 if (Triple.isOSDarwin())
Daniel Dunbard609b7b2009-11-17 06:37:03 +0000485 return true;
486 return false;
Ulrich Weigand47445072013-05-06 16:26:41 +0000487
Bill Schmidt778d3872013-07-26 01:36:11 +0000488 case llvm::Triple::ppc64le:
Ulrich Weigand47445072013-05-06 16:26:41 +0000489 case llvm::Triple::systemz:
Robert Lytton0e076492013-08-13 09:43:10 +0000490 case llvm::Triple::xcore:
Ulrich Weigand47445072013-05-06 16:26:41 +0000491 return false;
Daniel Dunbard609b7b2009-11-17 06:37:03 +0000492 }
493}
494
Robert Lytton0e076492013-08-13 09:43:10 +0000495static bool isNoCommonDefault(const llvm::Triple &Triple) {
496 switch (Triple.getArch()) {
497 default:
498 return false;
499
500 case llvm::Triple::xcore:
501 return true;
502 }
503}
504
Chad Rosiercfbfc582012-04-04 20:51:35 +0000505// Handle -mfpu=.
506//
507// FIXME: Centralize feature selection, defaulting shouldn't be also in the
508// frontend target.
Amara Emerson4cdb87b2013-10-01 10:20:54 +0000509static void getAArch64FPUFeatures(const Driver &D, const Arg *A,
510 const ArgList &Args,
511 std::vector<const char *> &Features) {
512 StringRef FPU = A->getValue();
513 if (FPU == "fp-armv8") {
514 Features.push_back("+fp-armv8");
515 } else if (FPU == "neon-fp-armv8") {
516 Features.push_back("+fp-armv8");
517 Features.push_back("+neon");
518 } else if (FPU == "crypto-neon-fp-armv8") {
519 Features.push_back("+fp-armv8");
520 Features.push_back("+neon");
521 Features.push_back("+crypto");
522 } else if (FPU == "neon") {
523 Features.push_back("+neon");
Amara Emerson4cdb87b2013-10-01 10:20:54 +0000524 } else
525 D.Diag(diag::err_drv_clang_unsupported) << A->getAsString(Args);
526}
527
Silviu Barangaf9671dd2013-10-21 10:54:53 +0000528// Handle -mhwdiv=.
529static void getARMHWDivFeatures(const Driver &D, const Arg *A,
530 const ArgList &Args,
531 std::vector<const char *> &Features) {
532 StringRef HWDiv = A->getValue();
533 if (HWDiv == "arm") {
534 Features.push_back("+hwdiv-arm");
535 Features.push_back("-hwdiv");
536 } else if (HWDiv == "thumb") {
537 Features.push_back("-hwdiv-arm");
538 Features.push_back("+hwdiv");
539 } else if (HWDiv == "arm,thumb" || HWDiv == "thumb,arm") {
540 Features.push_back("+hwdiv-arm");
541 Features.push_back("+hwdiv");
542 } else if (HWDiv == "none") {
543 Features.push_back("-hwdiv-arm");
544 Features.push_back("-hwdiv");
545 } else
546 D.Diag(diag::err_drv_clang_unsupported) << A->getAsString(Args);
547}
548
Amara Emerson4cdb87b2013-10-01 10:20:54 +0000549// Handle -mfpu=.
550//
551// FIXME: Centralize feature selection, defaulting shouldn't be also in the
552// frontend target.
553static void getARMFPUFeatures(const Driver &D, const Arg *A,
554 const ArgList &Args,
555 std::vector<const char *> &Features) {
Richard Smithbd55daf2012-11-01 04:30:05 +0000556 StringRef FPU = A->getValue();
Chad Rosiercfbfc582012-04-04 20:51:35 +0000557
558 // Set the target features based on the FPU.
559 if (FPU == "fpa" || FPU == "fpe2" || FPU == "fpe3" || FPU == "maverick") {
560 // Disable any default FPU support.
Rafael Espindola28e1f4b2013-08-21 16:39:20 +0000561 Features.push_back("-vfp2");
562 Features.push_back("-vfp3");
563 Features.push_back("-neon");
Artyom Skrobov53b000a82013-11-21 14:04:38 +0000564 } else if (FPU == "vfp") {
565 Features.push_back("+vfp2");
566 Features.push_back("-neon");
Chad Rosiercfbfc582012-04-04 20:51:35 +0000567 } else if (FPU == "vfp3-d16" || FPU == "vfpv3-d16") {
Rafael Espindola28e1f4b2013-08-21 16:39:20 +0000568 Features.push_back("+vfp3");
569 Features.push_back("+d16");
570 Features.push_back("-neon");
Chad Rosiercfbfc582012-04-04 20:51:35 +0000571 } else if (FPU == "vfp3" || FPU == "vfpv3") {
Rafael Espindola28e1f4b2013-08-21 16:39:20 +0000572 Features.push_back("+vfp3");
573 Features.push_back("-neon");
Artyom Skrobov53b000a82013-11-21 14:04:38 +0000574 } else if (FPU == "vfp4-d16" || FPU == "vfpv4-d16") {
575 Features.push_back("+vfp4");
576 Features.push_back("+d16");
577 Features.push_back("-neon");
578 } else if (FPU == "vfp4" || FPU == "vfpv4") {
579 Features.push_back("+vfp4");
580 Features.push_back("-neon");
Oliver Stannard96601ca2014-02-21 10:39:15 +0000581 } else if (FPU == "fp4-sp-d16" || FPU == "fpv4-sp-d16") {
582 Features.push_back("+vfp4");
583 Features.push_back("+d16");
584 Features.push_back("+fp-only-sp");
585 Features.push_back("-neon");
Joey Gouly7db275b2013-06-27 13:19:54 +0000586 } else if (FPU == "fp-armv8") {
Joey Goulybe8c2732013-09-13 13:48:33 +0000587 Features.push_back("+fp-armv8");
Bernard Ogdenda13af32013-10-24 18:32:51 +0000588 Features.push_back("-neon");
589 Features.push_back("-crypto");
Joey Gouly7db275b2013-06-27 13:19:54 +0000590 } else if (FPU == "neon-fp-armv8") {
Joey Goulybe8c2732013-09-13 13:48:33 +0000591 Features.push_back("+fp-armv8");
Rafael Espindola28e1f4b2013-08-21 16:39:20 +0000592 Features.push_back("+neon");
Bernard Ogdenda13af32013-10-24 18:32:51 +0000593 Features.push_back("-crypto");
Amara Emersonfc362c62013-09-19 13:54:03 +0000594 } else if (FPU == "crypto-neon-fp-armv8") {
Amara Emersonfc362c62013-09-19 13:54:03 +0000595 Features.push_back("+fp-armv8");
Bernard Ogdenda13af32013-10-24 18:32:51 +0000596 Features.push_back("+neon");
597 Features.push_back("+crypto");
Chad Rosiercfbfc582012-04-04 20:51:35 +0000598 } else if (FPU == "neon") {
Rafael Espindola28e1f4b2013-08-21 16:39:20 +0000599 Features.push_back("+neon");
Amara Emerson4cdb87b2013-10-01 10:20:54 +0000600 } else if (FPU == "none") {
601 Features.push_back("-vfp2");
602 Features.push_back("-vfp3");
603 Features.push_back("-vfp4");
604 Features.push_back("-fp-armv8");
605 Features.push_back("-crypto");
606 Features.push_back("-neon");
Chad Rosiercfbfc582012-04-04 20:51:35 +0000607 } else
608 D.Diag(diag::err_drv_clang_unsupported) << A->getAsString(Args);
609}
610
Anton Korobeynikova29e4622012-04-09 13:38:30 +0000611// Select the float ABI as determined by -msoft-float, -mhard-float, and
612// -mfloat-abi=.
Tim Northover9c7e0352013-12-12 11:55:52 +0000613StringRef tools::arm::getARMFloatABI(const Driver &D, const ArgList &Args,
614 const llvm::Triple &Triple) {
Chris Lattner0e62c1c2011-07-23 10:55:15 +0000615 StringRef FloatABI;
Daniel Dunbar78485922009-09-10 23:00:09 +0000616 if (Arg *A = Args.getLastArg(options::OPT_msoft_float,
617 options::OPT_mhard_float,
618 options::OPT_mfloat_abi_EQ)) {
619 if (A->getOption().matches(options::OPT_msoft_float))
620 FloatABI = "soft";
621 else if (A->getOption().matches(options::OPT_mhard_float))
622 FloatABI = "hard";
623 else {
Richard Smithbd55daf2012-11-01 04:30:05 +0000624 FloatABI = A->getValue();
Daniel Dunbar78485922009-09-10 23:00:09 +0000625 if (FloatABI != "soft" && FloatABI != "softfp" && FloatABI != "hard") {
Chris Lattner0e62c1c2011-07-23 10:55:15 +0000626 D.Diag(diag::err_drv_invalid_mfloat_abi)
Daniel Dunbar78485922009-09-10 23:00:09 +0000627 << A->getAsString(Args);
628 FloatABI = "soft";
629 }
630 }
631 }
632
633 // If unspecified, choose the default based on the platform.
634 if (FloatABI.empty()) {
Rafael Espindola0e1fb4f2010-06-28 17:18:09 +0000635 switch (Triple.getOS()) {
Bob Wilson6524dd32011-10-14 05:03:44 +0000636 case llvm::Triple::Darwin:
637 case llvm::Triple::MacOSX:
638 case llvm::Triple::IOS: {
Daniel Dunbar78485922009-09-10 23:00:09 +0000639 // Darwin defaults to "softfp" for v6 and v7.
640 //
641 // FIXME: Factor out an ARM class so we can cache the arch somewhere.
Benjamin Kramer09811c72012-06-26 22:20:06 +0000642 std::string ArchName =
Bernard Ogden31561762013-12-12 13:27:11 +0000643 arm::getLLVMArchSuffixForARM(arm::getARMTargetCPU(Args, Triple));
Benjamin Kramer09811c72012-06-26 22:20:06 +0000644 if (StringRef(ArchName).startswith("v6") ||
645 StringRef(ArchName).startswith("v7"))
Daniel Dunbar78485922009-09-10 23:00:09 +0000646 FloatABI = "softfp";
647 else
648 FloatABI = "soft";
649 break;
650 }
651
Saleem Abdulrasoolf4c9e492014-04-04 20:31:19 +0000652 // FIXME: this is invalid for WindowsCE
653 case llvm::Triple::Win32:
654 FloatABI = "hard";
655 break;
656
Rafael Espindola0f207ed2012-12-13 04:17:14 +0000657 case llvm::Triple::FreeBSD:
Renato Golinf4421f72014-02-19 10:44:07 +0000658 switch(Triple.getEnvironment()) {
659 case llvm::Triple::GNUEABIHF:
660 FloatABI = "hard";
661 break;
662 default:
663 // FreeBSD defaults to soft float
664 FloatABI = "soft";
665 break;
666 }
Rafael Espindola0f207ed2012-12-13 04:17:14 +0000667 break;
668
Daniel Dunbar78485922009-09-10 23:00:09 +0000669 default:
Bob Wilsond1447c42011-02-04 17:59:28 +0000670 switch(Triple.getEnvironment()) {
Jiangning Liu61b06cb2012-07-31 08:06:29 +0000671 case llvm::Triple::GNUEABIHF:
672 FloatABI = "hard";
673 break;
Bob Wilsond1447c42011-02-04 17:59:28 +0000674 case llvm::Triple::GNUEABI:
675 FloatABI = "softfp";
676 break;
Joerg Sonnenbergerd75a1f82013-12-16 19:16:04 +0000677 case llvm::Triple::EABIHF:
678 FloatABI = "hard";
679 break;
Bob Wilsond1447c42011-02-04 17:59:28 +0000680 case llvm::Triple::EABI:
681 // EABI is always AAPCS, and if it was not marked 'hard', it's softfp
682 FloatABI = "softfp";
683 break;
Logan Chienc6fd8202012-09-02 09:30:11 +0000684 case llvm::Triple::Android: {
Benjamin Kramer09811c72012-06-26 22:20:06 +0000685 std::string ArchName =
Bernard Ogden31561762013-12-12 13:27:11 +0000686 arm::getLLVMArchSuffixForARM(arm::getARMTargetCPU(Args, Triple));
Benjamin Kramer09811c72012-06-26 22:20:06 +0000687 if (StringRef(ArchName).startswith("v7"))
Chandler Carruthc89aa9d2012-01-10 19:47:42 +0000688 FloatABI = "softfp";
689 else
690 FloatABI = "soft";
691 break;
692 }
Bob Wilsond1447c42011-02-04 17:59:28 +0000693 default:
694 // Assume "soft", but warn the user we are guessing.
695 FloatABI = "soft";
Saleem Abdulrasool377066a2014-03-27 22:50:18 +0000696 if (Triple.getOS() != llvm::Triple::UnknownOS ||
697 !Triple.isOSBinFormatMachO())
698 D.Diag(diag::warn_drv_assuming_mfloat_abi_is) << "soft";
Bob Wilsond1447c42011-02-04 17:59:28 +0000699 break;
700 }
Daniel Dunbar78485922009-09-10 23:00:09 +0000701 }
702 }
703
Anton Korobeynikova29e4622012-04-09 13:38:30 +0000704 return FloatABI;
705}
706
Rafael Espindola28e1f4b2013-08-21 16:39:20 +0000707static void getARMTargetFeatures(const Driver &D, const llvm::Triple &Triple,
708 const ArgList &Args,
Rafael Espindola9c6fb0f2013-11-23 14:36:40 +0000709 std::vector<const char *> &Features,
710 bool ForAS) {
Tim Northover9c7e0352013-12-12 11:55:52 +0000711 StringRef FloatABI = tools::arm::getARMFloatABI(D, Args, Triple);
Rafael Espindola9c6fb0f2013-11-23 14:36:40 +0000712 if (!ForAS) {
713 // FIXME: Note, this is a hack, the LLVM backend doesn't actually use these
714 // yet (it uses the -mfloat-abi and -msoft-float options), and it is
715 // stripped out by the ARM target. We should probably pass this a new
716 // -target-option, which is handled by the -cc1/-cc1as invocation.
717 //
718 // FIXME2: For consistency, it would be ideal if we set up the target
719 // machine state the same when using the frontend or the assembler. We don't
720 // currently do that for the assembler, we pass the options directly to the
721 // backend and never even instantiate the frontend TargetInfo. If we did,
722 // and used its handleTargetFeatures hook, then we could ensure the
723 // assembler and the frontend behave the same.
Rafael Espindola28e1f4b2013-08-21 16:39:20 +0000724
Rafael Espindola9c6fb0f2013-11-23 14:36:40 +0000725 // Use software floating point operations?
726 if (FloatABI == "soft")
727 Features.push_back("+soft-float");
728
729 // Use software floating point argument passing?
730 if (FloatABI != "hard")
731 Features.push_back("+soft-float-abi");
732 }
Rafael Espindola28e1f4b2013-08-21 16:39:20 +0000733
734 // Honor -mfpu=.
735 if (const Arg *A = Args.getLastArg(options::OPT_mfpu_EQ))
Amara Emerson4cdb87b2013-10-01 10:20:54 +0000736 getARMFPUFeatures(D, A, Args, Features);
Silviu Barangaf9671dd2013-10-21 10:54:53 +0000737 if (const Arg *A = Args.getLastArg(options::OPT_mhwdiv_EQ))
738 getARMHWDivFeatures(D, A, Args, Features);
Rafael Espindola28e1f4b2013-08-21 16:39:20 +0000739
Rafael Espindola28e1f4b2013-08-21 16:39:20 +0000740 // Setting -msoft-float effectively disables NEON because of the GCC
741 // implementation, although the same isn't true of VFP or VFP3.
Amara Emersonecbe18e2014-02-12 10:22:35 +0000742 if (FloatABI == "soft") {
Rafael Espindola28e1f4b2013-08-21 16:39:20 +0000743 Features.push_back("-neon");
Amara Emersonecbe18e2014-02-12 10:22:35 +0000744 // Also need to explicitly disable features which imply NEON.
745 Features.push_back("-crypto");
746 }
Bernard Ogden18b57012013-10-29 09:47:51 +0000747
748 // En/disable crc
749 if (Arg *A = Args.getLastArg(options::OPT_mcrc,
750 options::OPT_mnocrc)) {
751 if (A->getOption().matches(options::OPT_mcrc))
752 Features.push_back("+crc");
753 else
754 Features.push_back("-crc");
755 }
Rafael Espindola28e1f4b2013-08-21 16:39:20 +0000756}
Anton Korobeynikova29e4622012-04-09 13:38:30 +0000757
758void Clang::AddARMTargetArgs(const ArgList &Args,
759 ArgStringList &CmdArgs,
760 bool KernelOrKext) const {
761 const Driver &D = getToolChain().getDriver();
Daniel Dunbarbd847cc2012-10-15 22:23:53 +0000762 // Get the effective triple, which takes into account the deployment target.
763 std::string TripleStr = getToolChain().ComputeEffectiveClangTriple(Args);
764 llvm::Triple Triple(TripleStr);
Bernard Ogden31561762013-12-12 13:27:11 +0000765 std::string CPUName = arm::getARMTargetCPU(Args, Triple);
Anton Korobeynikova29e4622012-04-09 13:38:30 +0000766
767 // Select the ABI to use.
768 //
769 // FIXME: Support -meabi.
770 const char *ABIName = 0;
771 if (Arg *A = Args.getLastArg(options::OPT_mabi_EQ)) {
Richard Smithbd55daf2012-11-01 04:30:05 +0000772 ABIName = A->getValue();
Jonathan Roelofs2cea1be2014-02-12 03:21:20 +0000773 } else if (Triple.isOSDarwin()) {
Daniel Dunbar5f18f6e2012-10-22 18:30:51 +0000774 // The backend is hardwired to assume AAPCS for M-class processors, ensure
775 // the frontend matches that.
Tim Northovere66c9462013-10-03 14:23:28 +0000776 if (Triple.getEnvironment() == llvm::Triple::EABI ||
Saleem Abdulrasool29b82b62014-03-06 20:47:19 +0000777 (Triple.getOS() == llvm::Triple::UnknownOS &&
778 Triple.getObjectFormat() == llvm::Triple::MachO) ||
Tim Northovere66c9462013-10-03 14:23:28 +0000779 StringRef(CPUName).startswith("cortex-m")) {
Daniel Dunbar5f18f6e2012-10-22 18:30:51 +0000780 ABIName = "aapcs";
781 } else {
782 ABIName = "apcs-gnu";
783 }
Saleem Abdulrasoolf4c9e492014-04-04 20:31:19 +0000784 } else if (Triple.isOSWindows()) {
785 // FIXME: this is invalid for WindowsCE
786 ABIName = "aapcs";
Anton Korobeynikova29e4622012-04-09 13:38:30 +0000787 } else {
788 // Select the default based on the platform.
789 switch(Triple.getEnvironment()) {
Logan Chienc6fd8202012-09-02 09:30:11 +0000790 case llvm::Triple::Android:
Anton Korobeynikova29e4622012-04-09 13:38:30 +0000791 case llvm::Triple::GNUEABI:
Jiangning Liu61b06cb2012-07-31 08:06:29 +0000792 case llvm::Triple::GNUEABIHF:
Anton Korobeynikova29e4622012-04-09 13:38:30 +0000793 ABIName = "aapcs-linux";
794 break;
Joerg Sonnenbergerd75a1f82013-12-16 19:16:04 +0000795 case llvm::Triple::EABIHF:
Anton Korobeynikova29e4622012-04-09 13:38:30 +0000796 case llvm::Triple::EABI:
797 ABIName = "aapcs";
798 break;
799 default:
800 ABIName = "apcs-gnu";
801 }
802 }
803 CmdArgs.push_back("-target-abi");
804 CmdArgs.push_back(ABIName);
805
Anton Korobeynikova29e4622012-04-09 13:38:30 +0000806 // Determine floating point ABI from the options & target defaults.
Tim Northover9c7e0352013-12-12 11:55:52 +0000807 StringRef FloatABI = tools::arm::getARMFloatABI(D, Args, Triple);
Daniel Dunbar78485922009-09-10 23:00:09 +0000808 if (FloatABI == "soft") {
809 // Floating point operations and argument passing are soft.
810 //
811 // FIXME: This changes CPP defines, we need -target-soft-float.
Daniel Dunbara74f8ff2009-11-30 08:42:00 +0000812 CmdArgs.push_back("-msoft-float");
Daniel Dunbar6cc525b2009-12-08 19:49:51 +0000813 CmdArgs.push_back("-mfloat-abi");
814 CmdArgs.push_back("soft");
Daniel Dunbar78485922009-09-10 23:00:09 +0000815 } else if (FloatABI == "softfp") {
816 // Floating point operations are hard, but argument passing is soft.
Daniel Dunbar6cc525b2009-12-08 19:49:51 +0000817 CmdArgs.push_back("-mfloat-abi");
818 CmdArgs.push_back("soft");
Daniel Dunbar78485922009-09-10 23:00:09 +0000819 } else {
820 // Floating point operations and argument passing are hard.
821 assert(FloatABI == "hard" && "Invalid float abi!");
Daniel Dunbar6cc525b2009-12-08 19:49:51 +0000822 CmdArgs.push_back("-mfloat-abi");
823 CmdArgs.push_back("hard");
Daniel Dunbar78485922009-09-10 23:00:09 +0000824 }
Daniel Dunbar893d4752009-12-19 04:15:38 +0000825
Daniel Dunbarc9388c12011-03-17 17:10:06 +0000826 // Kernel code has more strict alignment requirements.
827 if (KernelOrKext) {
Cameron Esfahani556d91e2013-09-14 01:09:11 +0000828 if (!Triple.isiOS() || Triple.isOSVersionLT(6)) {
Daniel Dunbarbd847cc2012-10-15 22:23:53 +0000829 CmdArgs.push_back("-backend-option");
830 CmdArgs.push_back("-arm-long-calls");
831 }
Daniel Dunbarc9388c12011-03-17 17:10:06 +0000832
Daniel Dunbar12100e22011-03-22 16:48:17 +0000833 CmdArgs.push_back("-backend-option");
Daniel Dunbarc9388c12011-03-17 17:10:06 +0000834 CmdArgs.push_back("-arm-strict-align");
Daniel Dunbared904c82011-04-18 21:26:42 +0000835
836 // The kext linker doesn't know how to deal with movw/movt.
Daniel Dunbared904c82011-04-18 21:26:42 +0000837 CmdArgs.push_back("-backend-option");
Renato Golin3d510b32013-08-15 20:54:45 +0000838 CmdArgs.push_back("-arm-use-movt=0");
Daniel Dunbarb1db4b62011-03-17 00:07:34 +0000839 }
Chad Rosierba3df1d2011-08-26 00:26:29 +0000840
841 // Setting -mno-global-merge disables the codegen global merge pass. Setting
842 // -mglobal-merge has no effect as the pass is enabled by default.
843 if (Arg *A = Args.getLastArg(options::OPT_mglobal_merge,
844 options::OPT_mno_global_merge)) {
845 if (A->getOption().matches(options::OPT_mno_global_merge))
846 CmdArgs.push_back("-mno-global-merge");
847 }
Chad Rosierf1985d22012-05-16 20:40:09 +0000848
Bob Wilson9c8af452013-04-11 18:53:25 +0000849 if (!Args.hasFlag(options::OPT_mimplicit_float,
850 options::OPT_mno_implicit_float,
851 true))
Chad Rosierf1985d22012-05-16 20:40:09 +0000852 CmdArgs.push_back("-no-implicit-float");
Renato Golindbb77e62013-08-24 14:44:35 +0000853
Logan Chien749763e2014-04-03 13:12:44 +0000854 // llvm does not support reserving registers in general. There is support
855 // for reserving r9 on ARM though (defined as a platform-specific register
856 // in ARM EABI).
857 if (Args.hasArg(options::OPT_ffixed_r9)) {
858 CmdArgs.push_back("-backend-option");
859 CmdArgs.push_back("-arm-reserve-r9");
860 }
Daniel Dunbar0f5c5422009-09-10 04:57:17 +0000861}
862
Tim Northovera2ee4332014-03-29 15:09:45 +0000863/// getARM64TargetCPU - Get the (LLVM) name of the ARM64 cpu we are targeting.
864static std::string getARM64TargetCPU(const ArgList &Args) {
865 // If we have -mcpu=, use that.
866 if (Arg *A = Args.getLastArg(options::OPT_mcpu_EQ)) {
867 StringRef MCPU = A->getValue();
868 // Handle -mcpu=native.
869 if (MCPU == "native")
870 return llvm::sys::getHostCPUName();
871 else
872 return MCPU;
873 }
874
875 // At some point, we may need to check -march here, but for now we only
876 // one arm64 architecture.
877
878 // Default to "cyclone" CPU.
879 return "cyclone";
880}
881
882void Clang::AddARM64TargetArgs(const ArgList &Args,
883 ArgStringList &CmdArgs) const {
884 std::string TripleStr = getToolChain().ComputeEffectiveClangTriple(Args);
885 llvm::Triple Triple(TripleStr);
886
887 if (!Args.hasFlag(options::OPT_mred_zone, options::OPT_mno_red_zone, true) ||
888 Args.hasArg(options::OPT_mkernel) ||
889 Args.hasArg(options::OPT_fapple_kext))
890 CmdArgs.push_back("-disable-red-zone");
891
892 if (!Args.hasFlag(options::OPT_mimplicit_float,
893 options::OPT_mno_implicit_float, true))
894 CmdArgs.push_back("-no-implicit-float");
895
896 const char *ABIName = 0;
897 if (Arg *A = Args.getLastArg(options::OPT_mabi_EQ))
898 ABIName = A->getValue();
899 else if (Triple.isOSDarwin())
900 ABIName = "darwinpcs";
901 else
902 ABIName = "aapcs";
903
904 CmdArgs.push_back("-target-abi");
905 CmdArgs.push_back(ABIName);
906
907 CmdArgs.push_back("-target-cpu");
908 CmdArgs.push_back(Args.MakeArgString(getARM64TargetCPU(Args)));
909
910 if (Args.hasArg(options::OPT_mstrict_align)) {
911 CmdArgs.push_back("-backend-option");
912 CmdArgs.push_back("-arm64-strict-align");
913 }
914}
915
Simon Atanasyan3b7589a2012-04-07 22:09:23 +0000916// Get CPU and ABI names. They are not independent
917// so we have to calculate them together.
918static void getMipsCPUAndABI(const ArgList &Args,
Rafael Espindola22ce34a2013-08-20 22:12:08 +0000919 const llvm::Triple &Triple,
Simon Atanasyan3b7589a2012-04-07 22:09:23 +0000920 StringRef &CPUName,
921 StringRef &ABIName) {
Simon Atanasyan1a3665b62014-01-27 13:59:04 +0000922 const char *DefMips32CPU = "mips32r2";
923 const char *DefMips64CPU = "mips64r2";
Akira Hatanaka37fd9e92011-09-26 21:07:52 +0000924
Simon Atanasyan464a7f72012-09-10 08:32:41 +0000925 if (Arg *A = Args.getLastArg(options::OPT_march_EQ,
Simon Atanasyane0cc7c72013-10-09 12:12:24 +0000926 options::OPT_mcpu_EQ))
927 CPUName = A->getValue();
Simon Atanasyan464a7f72012-09-10 08:32:41 +0000928
Simon Atanasyan4938ddb2013-04-21 13:30:10 +0000929 if (Arg *A = Args.getLastArg(options::OPT_mabi_EQ)) {
Richard Smithbd55daf2012-11-01 04:30:05 +0000930 ABIName = A->getValue();
Simon Atanasyan4938ddb2013-04-21 13:30:10 +0000931 // Convert a GNU style Mips ABI name to the name
932 // accepted by LLVM Mips backend.
933 ABIName = llvm::StringSwitch<llvm::StringRef>(ABIName)
934 .Case("32", "o32")
935 .Case("64", "n64")
936 .Default(ABIName);
937 }
Simon Atanasyan464a7f72012-09-10 08:32:41 +0000938
939 // Setup default CPU and ABI names.
940 if (CPUName.empty() && ABIName.empty()) {
Rafael Espindola22ce34a2013-08-20 22:12:08 +0000941 switch (Triple.getArch()) {
Simon Atanasyan464a7f72012-09-10 08:32:41 +0000942 default:
943 llvm_unreachable("Unexpected triple arch name");
944 case llvm::Triple::mips:
945 case llvm::Triple::mipsel:
946 CPUName = DefMips32CPU;
947 break;
948 case llvm::Triple::mips64:
949 case llvm::Triple::mips64el:
950 CPUName = DefMips64CPU;
951 break;
952 }
953 }
954
955 if (!ABIName.empty()) {
956 // Deduce CPU name from ABI name.
957 CPUName = llvm::StringSwitch<const char *>(ABIName)
Simon Atanasyan0da400c2013-02-27 14:55:49 +0000958 .Cases("32", "o32", "eabi", DefMips32CPU)
959 .Cases("n32", "n64", "64", DefMips64CPU)
Simon Atanasyan464a7f72012-09-10 08:32:41 +0000960 .Default("");
961 }
962 else if (!CPUName.empty()) {
963 // Deduce ABI name from CPU name.
964 ABIName = llvm::StringSwitch<const char *>(CPUName)
965 .Cases("mips32", "mips32r2", "o32")
966 .Cases("mips64", "mips64r2", "n64")
967 .Default("");
968 }
969
970 // FIXME: Warn on inconsistent cpu and abi usage.
Simon Atanasyan3b7589a2012-04-07 22:09:23 +0000971}
972
Simon Atanasyan0da400c2013-02-27 14:55:49 +0000973// Convert ABI name to the GNU tools acceptable variant.
974static StringRef getGnuCompatibleMipsABIName(StringRef ABI) {
975 return llvm::StringSwitch<llvm::StringRef>(ABI)
976 .Case("o32", "32")
977 .Case("n64", "64")
978 .Default(ABI);
979}
980
Simon Atanasyan590ad8f2012-06-02 15:06:29 +0000981// Select the MIPS float ABI as determined by -msoft-float, -mhard-float,
982// and -mfloat-abi=.
983static StringRef getMipsFloatABI(const Driver &D, const ArgList &Args) {
Chris Lattner0e62c1c2011-07-23 10:55:15 +0000984 StringRef FloatABI;
Eric Christopher0b26a612010-03-02 02:41:08 +0000985 if (Arg *A = Args.getLastArg(options::OPT_msoft_float,
Akira Hatanaka6976ec82012-03-23 23:07:09 +0000986 options::OPT_mhard_float,
987 options::OPT_mfloat_abi_EQ)) {
Eric Christopher0b26a612010-03-02 02:41:08 +0000988 if (A->getOption().matches(options::OPT_msoft_float))
989 FloatABI = "soft";
990 else if (A->getOption().matches(options::OPT_mhard_float))
991 FloatABI = "hard";
Akira Hatanaka6976ec82012-03-23 23:07:09 +0000992 else {
Richard Smithbd55daf2012-11-01 04:30:05 +0000993 FloatABI = A->getValue();
Simon Atanasyan512dc382013-04-14 08:37:15 +0000994 if (FloatABI != "soft" && FloatABI != "hard") {
Simon Atanasyan590ad8f2012-06-02 15:06:29 +0000995 D.Diag(diag::err_drv_invalid_mfloat_abi) << A->getAsString(Args);
Akira Hatanaka6976ec82012-03-23 23:07:09 +0000996 FloatABI = "hard";
997 }
998 }
Eric Christopher0b26a612010-03-02 02:41:08 +0000999 }
1000
1001 // If unspecified, choose the default based on the platform.
1002 if (FloatABI.empty()) {
Akira Hatanaka6976ec82012-03-23 23:07:09 +00001003 // Assume "hard", because it's a default value used by gcc.
1004 // When we start to recognize specific target MIPS processors,
1005 // we will be able to select the default more correctly.
1006 FloatABI = "hard";
Eric Christopher0b26a612010-03-02 02:41:08 +00001007 }
1008
Simon Atanasyan590ad8f2012-06-02 15:06:29 +00001009 return FloatABI;
1010}
1011
Simon Atanasyan9b1932d2012-07-05 18:51:43 +00001012static void AddTargetFeature(const ArgList &Args,
Rafael Espindola28e1f4b2013-08-21 16:39:20 +00001013 std::vector<const char *> &Features,
1014 OptSpecifier OnOpt, OptSpecifier OffOpt,
Simon Atanasyan9b1932d2012-07-05 18:51:43 +00001015 StringRef FeatureName) {
1016 if (Arg *A = Args.getLastArg(OnOpt, OffOpt)) {
Simon Atanasyan9b1932d2012-07-05 18:51:43 +00001017 if (A->getOption().matches(OnOpt))
Rafael Espindola28e1f4b2013-08-21 16:39:20 +00001018 Features.push_back(Args.MakeArgString("+" + FeatureName));
Simon Atanasyan9b1932d2012-07-05 18:51:43 +00001019 else
Rafael Espindola28e1f4b2013-08-21 16:39:20 +00001020 Features.push_back(Args.MakeArgString("-" + FeatureName));
Simon Atanasyan9b1932d2012-07-05 18:51:43 +00001021 }
1022}
1023
Rafael Espindola28e1f4b2013-08-21 16:39:20 +00001024static void getMIPSTargetFeatures(const Driver &D, const ArgList &Args,
1025 std::vector<const char *> &Features) {
1026 StringRef FloatABI = getMipsFloatABI(D, Args);
Simon Atanasyan22a6f4d2013-11-19 12:22:38 +00001027 if (FloatABI == "soft") {
Rafael Espindola28e1f4b2013-08-21 16:39:20 +00001028 // FIXME: Note, this is a hack. We need to pass the selected float
1029 // mode to the MipsTargetInfoBase to define appropriate macros there.
1030 // Now it is the only method.
1031 Features.push_back("+soft-float");
1032 }
1033
Simon Atanasyan22127ce2013-09-24 09:09:16 +00001034 if (Arg *A = Args.getLastArg(options::OPT_mnan_EQ)) {
1035 if (StringRef(A->getValue()) == "2008")
1036 Features.push_back("+nan2008");
1037 }
1038
Rafael Espindola28e1f4b2013-08-21 16:39:20 +00001039 AddTargetFeature(Args, Features, options::OPT_msingle_float,
1040 options::OPT_mdouble_float, "single-float");
1041 AddTargetFeature(Args, Features, options::OPT_mips16, options::OPT_mno_mips16,
1042 "mips16");
1043 AddTargetFeature(Args, Features, options::OPT_mmicromips,
1044 options::OPT_mno_micromips, "micromips");
1045 AddTargetFeature(Args, Features, options::OPT_mdsp, options::OPT_mno_dsp,
1046 "dsp");
1047 AddTargetFeature(Args, Features, options::OPT_mdspr2, options::OPT_mno_dspr2,
1048 "dspr2");
1049 AddTargetFeature(Args, Features, options::OPT_mmsa, options::OPT_mno_msa,
1050 "msa");
Daniel Sanders94694172013-10-17 14:55:58 +00001051 AddTargetFeature(Args, Features, options::OPT_mfp64, options::OPT_mfp32,
1052 "fp64");
Rafael Espindola28e1f4b2013-08-21 16:39:20 +00001053}
1054
Simon Atanasyan590ad8f2012-06-02 15:06:29 +00001055void Clang::AddMIPSTargetArgs(const ArgList &Args,
Simon Atanasyanf0087242013-04-14 14:07:41 +00001056 ArgStringList &CmdArgs) const {
Simon Atanasyan590ad8f2012-06-02 15:06:29 +00001057 const Driver &D = getToolChain().getDriver();
1058 StringRef CPUName;
1059 StringRef ABIName;
Rafael Espindola22ce34a2013-08-20 22:12:08 +00001060 const llvm::Triple &Triple = getToolChain().getTriple();
1061 getMipsCPUAndABI(Args, Triple, CPUName, ABIName);
Simon Atanasyan590ad8f2012-06-02 15:06:29 +00001062
1063 CmdArgs.push_back("-target-abi");
1064 CmdArgs.push_back(ABIName.data());
1065
1066 StringRef FloatABI = getMipsFloatABI(D, Args);
1067
Simon Atanasyan22a6f4d2013-11-19 12:22:38 +00001068 if (FloatABI == "soft") {
Eric Christopher0b26a612010-03-02 02:41:08 +00001069 // Floating point operations and argument passing are soft.
Eric Christopher0b26a612010-03-02 02:41:08 +00001070 CmdArgs.push_back("-msoft-float");
Akira Hatanaka6976ec82012-03-23 23:07:09 +00001071 CmdArgs.push_back("-mfloat-abi");
1072 CmdArgs.push_back("soft");
Akira Hatanaka6976ec82012-03-23 23:07:09 +00001073 }
Akira Hatanaka6976ec82012-03-23 23:07:09 +00001074 else {
1075 // Floating point operations and argument passing are hard.
Eric Christopher0b26a612010-03-02 02:41:08 +00001076 assert(FloatABI == "hard" && "Invalid float abi!");
Akira Hatanaka6976ec82012-03-23 23:07:09 +00001077 CmdArgs.push_back("-mfloat-abi");
1078 CmdArgs.push_back("hard");
Eric Christopher0b26a612010-03-02 02:41:08 +00001079 }
Simon Atanasyan6f23fa02012-07-05 14:19:39 +00001080
Simon Atanasyan2eaec512012-12-01 18:27:21 +00001081 if (Arg *A = Args.getLastArg(options::OPT_mxgot, options::OPT_mno_xgot)) {
1082 if (A->getOption().matches(options::OPT_mxgot)) {
1083 CmdArgs.push_back("-mllvm");
1084 CmdArgs.push_back("-mxgot");
1085 }
1086 }
1087
Simon Atanasyanc580b322013-05-11 06:33:44 +00001088 if (Arg *A = Args.getLastArg(options::OPT_mldc1_sdc1,
1089 options::OPT_mno_ldc1_sdc1)) {
1090 if (A->getOption().matches(options::OPT_mno_ldc1_sdc1)) {
1091 CmdArgs.push_back("-mllvm");
1092 CmdArgs.push_back("-mno-ldc1-sdc1");
1093 }
1094 }
1095
Akira Hatanaka0aa60ef2013-07-19 18:58:48 +00001096 if (Arg *A = Args.getLastArg(options::OPT_mcheck_zero_division,
1097 options::OPT_mno_check_zero_division)) {
1098 if (A->getOption().matches(options::OPT_mno_check_zero_division)) {
1099 CmdArgs.push_back("-mllvm");
1100 CmdArgs.push_back("-mno-check-zero-division");
1101 }
1102 }
1103
Simon Atanasyanec4b1c12012-08-27 20:55:56 +00001104 if (Arg *A = Args.getLastArg(options::OPT_G)) {
Richard Smithbd55daf2012-11-01 04:30:05 +00001105 StringRef v = A->getValue();
Simon Atanasyanec4b1c12012-08-27 20:55:56 +00001106 CmdArgs.push_back("-mllvm");
1107 CmdArgs.push_back(Args.MakeArgString("-mips-ssection-threshold=" + v));
1108 A->claim();
1109 }
Eric Christopher0b26a612010-03-02 02:41:08 +00001110}
1111
Hal Finkel8eb59282012-06-11 22:35:19 +00001112/// getPPCTargetCPU - Get the (LLVM) name of the PowerPC cpu we are targeting.
1113static std::string getPPCTargetCPU(const ArgList &Args) {
1114 if (Arg *A = Args.getLastArg(options::OPT_mcpu_EQ)) {
Richard Smithbd55daf2012-11-01 04:30:05 +00001115 StringRef CPUName = A->getValue();
Hal Finkel8eb59282012-06-11 22:35:19 +00001116
1117 if (CPUName == "native") {
1118 std::string CPU = llvm::sys::getHostCPUName();
1119 if (!CPU.empty() && CPU != "generic")
1120 return CPU;
1121 else
1122 return "";
1123 }
1124
1125 return llvm::StringSwitch<const char *>(CPUName)
1126 .Case("common", "generic")
1127 .Case("440", "440")
1128 .Case("440fp", "440")
1129 .Case("450", "450")
1130 .Case("601", "601")
1131 .Case("602", "602")
1132 .Case("603", "603")
1133 .Case("603e", "603e")
1134 .Case("603ev", "603ev")
1135 .Case("604", "604")
1136 .Case("604e", "604e")
1137 .Case("620", "620")
Bill Schmidt38378a02013-02-01 20:23:10 +00001138 .Case("630", "pwr3")
Hal Finkel8eb59282012-06-11 22:35:19 +00001139 .Case("G3", "g3")
1140 .Case("7400", "7400")
1141 .Case("G4", "g4")
1142 .Case("7450", "7450")
1143 .Case("G4+", "g4+")
1144 .Case("750", "750")
1145 .Case("970", "970")
1146 .Case("G5", "g5")
1147 .Case("a2", "a2")
Hal Finkeldf1e4bf2013-02-01 05:53:33 +00001148 .Case("a2q", "a2q")
Hal Finkelf6d6cb02012-09-18 22:25:03 +00001149 .Case("e500mc", "e500mc")
1150 .Case("e5500", "e5500")
Bill Schmidt38378a02013-02-01 20:23:10 +00001151 .Case("power3", "pwr3")
1152 .Case("power4", "pwr4")
1153 .Case("power5", "pwr5")
1154 .Case("power5x", "pwr5x")
Hal Finkel8eb59282012-06-11 22:35:19 +00001155 .Case("power6", "pwr6")
Bill Schmidt38378a02013-02-01 20:23:10 +00001156 .Case("power6x", "pwr6x")
Hal Finkel8eb59282012-06-11 22:35:19 +00001157 .Case("power7", "pwr7")
Bill Schmidt38378a02013-02-01 20:23:10 +00001158 .Case("pwr3", "pwr3")
1159 .Case("pwr4", "pwr4")
1160 .Case("pwr5", "pwr5")
1161 .Case("pwr5x", "pwr5x")
1162 .Case("pwr6", "pwr6")
1163 .Case("pwr6x", "pwr6x")
1164 .Case("pwr7", "pwr7")
Hal Finkel8eb59282012-06-11 22:35:19 +00001165 .Case("powerpc", "ppc")
1166 .Case("powerpc64", "ppc64")
Bill Schmidt778d3872013-07-26 01:36:11 +00001167 .Case("powerpc64le", "ppc64le")
Hal Finkel8eb59282012-06-11 22:35:19 +00001168 .Default("");
1169 }
1170
1171 return "";
1172}
1173
Rafael Espindola28e1f4b2013-08-21 16:39:20 +00001174static void getPPCTargetFeatures(const ArgList &Args,
1175 std::vector<const char *> &Features) {
Eric Christopher643bb6a2013-10-16 20:40:08 +00001176 for (arg_iterator it = Args.filtered_begin(options::OPT_m_ppc_Features_Group),
1177 ie = Args.filtered_end();
1178 it != ie; ++it) {
1179 StringRef Name = (*it)->getOption().getName();
1180 (*it)->claim();
1181
1182 // Skip over "-m".
1183 assert(Name.startswith("m") && "Invalid feature name.");
1184 Name = Name.substr(1);
1185
1186 bool IsNegative = Name.startswith("no-");
1187 if (IsNegative)
1188 Name = Name.substr(3);
1189
1190 // Note that gcc calls this mfcrf and LLVM calls this mfocrf so we
1191 // pass the correct option to the backend while calling the frontend
1192 // option the same.
1193 // TODO: Change the LLVM backend option maybe?
1194 if (Name == "mfcrf")
1195 Name = "mfocrf";
1196
1197 Features.push_back(Args.MakeArgString((IsNegative ? "-" : "+") + Name));
1198 }
1199
1200 // Altivec is a bit weird, allow overriding of the Altivec feature here.
Rafael Espindola28e1f4b2013-08-21 16:39:20 +00001201 AddTargetFeature(Args, Features, options::OPT_faltivec,
1202 options::OPT_fno_altivec, "altivec");
Hal Finkel8eb59282012-06-11 22:35:19 +00001203}
1204
Tom Stellard6674c702013-04-01 20:56:53 +00001205/// Get the (LLVM) name of the R600 gpu we are targeting.
1206static std::string getR600TargetGPU(const ArgList &Args) {
1207 if (Arg *A = Args.getLastArg(options::OPT_mcpu_EQ)) {
Benjamin Kramerb2ccade2013-10-21 12:33:55 +00001208 const char *GPUName = A->getValue();
Tom Stellard6674c702013-04-01 20:56:53 +00001209 return llvm::StringSwitch<const char *>(GPUName)
Tom Stellardb38600c2013-05-06 16:12:05 +00001210 .Cases("rv630", "rv635", "r600")
1211 .Cases("rv610", "rv620", "rs780", "rs880")
Tom Stellard6674c702013-04-01 20:56:53 +00001212 .Case("rv740", "rv770")
1213 .Case("palm", "cedar")
Tom Stellardb38600c2013-05-06 16:12:05 +00001214 .Cases("sumo", "sumo2", "sumo")
Tom Stellard6674c702013-04-01 20:56:53 +00001215 .Case("hemlock", "cypress")
1216 .Case("aruba", "cayman")
Benjamin Kramerb2ccade2013-10-21 12:33:55 +00001217 .Default(GPUName);
Tom Stellard6674c702013-04-01 20:56:53 +00001218 }
1219 return "";
1220}
1221
Rafael Espindola28e1f4b2013-08-21 16:39:20 +00001222static void getSparcTargetFeatures(const ArgList &Args,
1223 std::vector<const char *> Features) {
1224 bool SoftFloatABI = true;
1225 if (Arg *A =
1226 Args.getLastArg(options::OPT_msoft_float, options::OPT_mhard_float)) {
1227 if (A->getOption().matches(options::OPT_mhard_float))
1228 SoftFloatABI = false;
1229 }
1230 if (SoftFloatABI)
1231 Features.push_back("+soft-float");
1232}
1233
Bruno Cardoso Lopese7f211c2010-11-09 17:21:19 +00001234void Clang::AddSparcTargetArgs(const ArgList &Args,
1235 ArgStringList &CmdArgs) const {
1236 const Driver &D = getToolChain().getDriver();
1237
Bruno Cardoso Lopese7f211c2010-11-09 17:21:19 +00001238 // Select the float ABI as determined by -msoft-float, -mhard-float, and
Chris Lattner0e62c1c2011-07-23 10:55:15 +00001239 StringRef FloatABI;
Bruno Cardoso Lopese7f211c2010-11-09 17:21:19 +00001240 if (Arg *A = Args.getLastArg(options::OPT_msoft_float,
1241 options::OPT_mhard_float)) {
1242 if (A->getOption().matches(options::OPT_msoft_float))
1243 FloatABI = "soft";
1244 else if (A->getOption().matches(options::OPT_mhard_float))
1245 FloatABI = "hard";
1246 }
1247
1248 // If unspecified, choose the default based on the platform.
1249 if (FloatABI.empty()) {
Aaron Ballmand0d27ab2013-07-15 13:41:33 +00001250 // Assume "soft", but warn the user we are guessing.
1251 FloatABI = "soft";
1252 D.Diag(diag::warn_drv_assuming_mfloat_abi_is) << "soft";
Bruno Cardoso Lopese7f211c2010-11-09 17:21:19 +00001253 }
1254
1255 if (FloatABI == "soft") {
1256 // Floating point operations and argument passing are soft.
1257 //
1258 // FIXME: This changes CPP defines, we need -target-soft-float.
1259 CmdArgs.push_back("-msoft-float");
Bruno Cardoso Lopese7f211c2010-11-09 17:21:19 +00001260 } else {
1261 assert(FloatABI == "hard" && "Invalid float abi!");
1262 CmdArgs.push_back("-mhard-float");
1263 }
1264}
1265
Richard Sandiford4652d892013-07-19 16:51:51 +00001266static const char *getSystemZTargetCPU(const ArgList &Args) {
1267 if (const Arg *A = Args.getLastArg(options::OPT_march_EQ))
1268 return A->getValue();
1269 return "z10";
1270}
1271
Chandler Carruth953fb082013-01-13 11:46:33 +00001272static const char *getX86TargetCPU(const ArgList &Args,
1273 const llvm::Triple &Triple) {
1274 if (const Arg *A = Args.getLastArg(options::OPT_march_EQ)) {
Jim Grosbach82eee262013-11-16 00:53:35 +00001275 if (StringRef(A->getValue()) != "native") {
Jonathan Roelofs2cea1be2014-02-12 03:21:20 +00001276 if (Triple.isOSDarwin() && Triple.getArchName() == "x86_64h")
Jim Grosbach82eee262013-11-16 00:53:35 +00001277 return "core-avx2";
1278
Chandler Carruth953fb082013-01-13 11:46:33 +00001279 return A->getValue();
Jim Grosbach82eee262013-11-16 00:53:35 +00001280 }
Chandler Carruth953fb082013-01-13 11:46:33 +00001281
1282 // FIXME: Reject attempts to use -march=native unless the target matches
1283 // the host.
1284 //
1285 // FIXME: We should also incorporate the detected target features for use
1286 // with -native.
1287 std::string CPU = llvm::sys::getHostCPUName();
1288 if (!CPU.empty() && CPU != "generic")
1289 return Args.MakeArgString(CPU);
1290 }
1291
1292 // Select the default CPU if none was given (or detection failed).
1293
1294 if (Triple.getArch() != llvm::Triple::x86_64 &&
1295 Triple.getArch() != llvm::Triple::x86)
1296 return 0; // This routine is only handling x86 targets.
1297
1298 bool Is64Bit = Triple.getArch() == llvm::Triple::x86_64;
1299
1300 // FIXME: Need target hooks.
Jonathan Roelofs2cea1be2014-02-12 03:21:20 +00001301 if (Triple.isOSDarwin()) {
Jim Grosbach82eee262013-11-16 00:53:35 +00001302 if (Triple.getArchName() == "x86_64h")
1303 return "core-avx2";
Chandler Carruth953fb082013-01-13 11:46:33 +00001304 return Is64Bit ? "core2" : "yonah";
Jim Grosbach82eee262013-11-16 00:53:35 +00001305 }
Chandler Carruth953fb082013-01-13 11:46:33 +00001306
Alexey Bataev286d1b92014-01-31 04:07:13 +00001307 // On Android use targets compatible with gcc
Chandler Carruth953fb082013-01-13 11:46:33 +00001308 if (Triple.getEnvironment() == llvm::Triple::Android)
Alexey Bataev286d1b92014-01-31 04:07:13 +00001309 return Is64Bit ? "x86-64" : "i686";
Chandler Carruth953fb082013-01-13 11:46:33 +00001310
Benjamin Kramerb2ccade2013-10-21 12:33:55 +00001311 // Everything else goes to x86-64 in 64-bit mode.
1312 if (Is64Bit)
1313 return "x86-64";
1314
1315 switch (Triple.getOS()) {
1316 case llvm::Triple::FreeBSD:
1317 case llvm::Triple::NetBSD:
1318 case llvm::Triple::OpenBSD:
1319 return "i486";
1320 case llvm::Triple::Haiku:
1321 return "i586";
1322 case llvm::Triple::Bitrig:
1323 return "i686";
1324 default:
1325 // Fallback to p4.
1326 return "pentium4";
1327 }
Chandler Carruth953fb082013-01-13 11:46:33 +00001328}
1329
Rafael Espindola22ce34a2013-08-20 22:12:08 +00001330static std::string getCPUName(const ArgList &Args, const llvm::Triple &T) {
1331 switch(T.getArch()) {
1332 default:
1333 return "";
1334
Amara Emerson703da2e2013-10-31 09:32:33 +00001335 case llvm::Triple::aarch64:
Christian Pirker9b019ae2014-02-25 13:51:00 +00001336 case llvm::Triple::aarch64_be:
Amara Emerson703da2e2013-10-31 09:32:33 +00001337 return getAArch64TargetCPU(Args, T);
1338
Quentin Colombetd9f26202014-04-15 00:27:35 +00001339 case llvm::Triple::arm64:
1340 return getARM64TargetCPU(Args);
1341
Rafael Espindola22ce34a2013-08-20 22:12:08 +00001342 case llvm::Triple::arm:
Christian Pirkerf01cd6f2014-03-28 14:40:46 +00001343 case llvm::Triple::armeb:
Rafael Espindola22ce34a2013-08-20 22:12:08 +00001344 case llvm::Triple::thumb:
Christian Pirkerf01cd6f2014-03-28 14:40:46 +00001345 case llvm::Triple::thumbeb:
Bernard Ogden31561762013-12-12 13:27:11 +00001346 return arm::getARMTargetCPU(Args, T);
Rafael Espindola22ce34a2013-08-20 22:12:08 +00001347
1348 case llvm::Triple::mips:
1349 case llvm::Triple::mipsel:
1350 case llvm::Triple::mips64:
1351 case llvm::Triple::mips64el: {
1352 StringRef CPUName;
1353 StringRef ABIName;
1354 getMipsCPUAndABI(Args, T, CPUName, ABIName);
1355 return CPUName;
1356 }
1357
1358 case llvm::Triple::ppc:
1359 case llvm::Triple::ppc64:
1360 case llvm::Triple::ppc64le: {
1361 std::string TargetCPUName = getPPCTargetCPU(Args);
1362 // LLVM may default to generating code for the native CPU,
1363 // but, like gcc, we default to a more generic option for
1364 // each architecture. (except on Darwin)
1365 if (TargetCPUName.empty() && !T.isOSDarwin()) {
1366 if (T.getArch() == llvm::Triple::ppc64)
1367 TargetCPUName = "ppc64";
1368 else if (T.getArch() == llvm::Triple::ppc64le)
1369 TargetCPUName = "ppc64le";
1370 else
1371 TargetCPUName = "ppc";
1372 }
1373 return TargetCPUName;
1374 }
1375
1376 case llvm::Triple::sparc:
Roman Divackyb1ae3d42014-02-25 18:35:30 +00001377 case llvm::Triple::sparcv9:
1378 if (const Arg *A = Args.getLastArg(options::OPT_mcpu_EQ))
Rafael Espindola22ce34a2013-08-20 22:12:08 +00001379 return A->getValue();
1380 return "";
1381
1382 case llvm::Triple::x86:
1383 case llvm::Triple::x86_64:
1384 return getX86TargetCPU(Args, T);
1385
1386 case llvm::Triple::hexagon:
1387 return "hexagon" + toolchains::Hexagon_TC::GetTargetCPU(Args).str();
1388
1389 case llvm::Triple::systemz:
1390 return getSystemZTargetCPU(Args);
1391
1392 case llvm::Triple::r600:
1393 return getR600TargetGPU(Args);
1394 }
1395}
1396
Alp Tokerce365ca2013-12-02 12:43:03 +00001397static void AddGoldPlugin(const ToolChain &ToolChain, const ArgList &Args,
1398 ArgStringList &CmdArgs) {
1399 // Tell the linker to load the plugin. This has to come before AddLinkerInputs
1400 // as gold requires -plugin to come before any -plugin-opt that -Wl might
1401 // forward.
1402 CmdArgs.push_back("-plugin");
1403 std::string Plugin = ToolChain.getDriver().Dir + "/../lib/LLVMgold.so";
1404 CmdArgs.push_back(Args.MakeArgString(Plugin));
1405
1406 // Try to pass driver level flags relevant to LTO code generation down to
1407 // the plugin.
1408
1409 // Handle flags for selecting CPU variants.
1410 std::string CPU = getCPUName(Args, ToolChain.getTriple());
1411 if (!CPU.empty())
1412 CmdArgs.push_back(Args.MakeArgString(Twine("-plugin-opt=mcpu=") + CPU));
1413}
1414
Jim Grosbach82eee262013-11-16 00:53:35 +00001415static void getX86TargetFeatures(const llvm::Triple &Triple,
1416 const ArgList &Args,
Rafael Espindola28e1f4b2013-08-21 16:39:20 +00001417 std::vector<const char *> &Features) {
Jim Grosbach82eee262013-11-16 00:53:35 +00001418 if (Triple.getArchName() == "x86_64h") {
1419 // x86_64h implies quite a few of the more modern subtarget features
1420 // for Haswell class CPUs, but not all of them. Opt-out of a few.
1421 Features.push_back("-rdrnd");
1422 Features.push_back("-aes");
1423 Features.push_back("-pclmul");
1424 Features.push_back("-rtm");
1425 Features.push_back("-hle");
1426 Features.push_back("-fsgsbase");
1427 }
1428
Alexey Bataev286d1b92014-01-31 04:07:13 +00001429 if (Triple.getEnvironment() == llvm::Triple::Android) {
1430 // Add sse3 feature to comply with gcc on Android
1431 Features.push_back("+sse3");
1432 }
1433
Jim Grosbach82eee262013-11-16 00:53:35 +00001434 // Now add any that the user explicitly requested on the command line,
1435 // which may override the defaults.
Rafael Espindola28e1f4b2013-08-21 16:39:20 +00001436 for (arg_iterator it = Args.filtered_begin(options::OPT_m_x86_Features_Group),
1437 ie = Args.filtered_end();
1438 it != ie; ++it) {
1439 StringRef Name = (*it)->getOption().getName();
1440 (*it)->claim();
1441
1442 // Skip over "-m".
1443 assert(Name.startswith("m") && "Invalid feature name.");
1444 Name = Name.substr(1);
1445
1446 bool IsNegative = Name.startswith("no-");
1447 if (IsNegative)
1448 Name = Name.substr(3);
1449
1450 Features.push_back(Args.MakeArgString((IsNegative ? "-" : "+") + Name));
1451 }
1452}
1453
Daniel Dunbar3b3191f2009-09-09 22:33:08 +00001454void Clang::AddX86TargetArgs(const ArgList &Args,
1455 ArgStringList &CmdArgs) const {
Daniel Dunbare2cf8f72009-09-10 22:59:57 +00001456 if (!Args.hasFlag(options::OPT_mred_zone,
1457 options::OPT_mno_red_zone,
1458 true) ||
1459 Args.hasArg(options::OPT_mkernel) ||
1460 Args.hasArg(options::OPT_fapple_kext))
Daniel Dunbar8bed86c2009-11-20 22:21:36 +00001461 CmdArgs.push_back("-disable-red-zone");
Daniel Dunbare2cf8f72009-09-10 22:59:57 +00001462
Bob Wilson2616e2e2013-02-10 16:01:41 +00001463 // Default to avoid implicit floating-point for kernel/kext code, but allow
1464 // that to be overridden with -mno-soft-float.
1465 bool NoImplicitFloat = (Args.hasArg(options::OPT_mkernel) ||
1466 Args.hasArg(options::OPT_fapple_kext));
1467 if (Arg *A = Args.getLastArg(options::OPT_msoft_float,
1468 options::OPT_mno_soft_float,
Bob Wilson9c8af452013-04-11 18:53:25 +00001469 options::OPT_mimplicit_float,
Bob Wilson2616e2e2013-02-10 16:01:41 +00001470 options::OPT_mno_implicit_float)) {
1471 const Option &O = A->getOption();
1472 NoImplicitFloat = (O.matches(options::OPT_mno_implicit_float) ||
1473 O.matches(options::OPT_msoft_float));
1474 }
1475 if (NoImplicitFloat)
Daniel Dunbar8bed86c2009-11-20 22:21:36 +00001476 CmdArgs.push_back("-no-implicit-float");
Daniel Dunbar3b3191f2009-09-09 22:33:08 +00001477}
1478
Matthew Curtise8f80a12012-12-06 17:49:03 +00001479static inline bool HasPICArg(const ArgList &Args) {
1480 return Args.hasArg(options::OPT_fPIC)
1481 || Args.hasArg(options::OPT_fpic);
1482}
1483
1484static Arg *GetLastSmallDataThresholdArg(const ArgList &Args) {
1485 return Args.getLastArg(options::OPT_G,
1486 options::OPT_G_EQ,
1487 options::OPT_msmall_data_threshold_EQ);
1488}
1489
1490static std::string GetHexagonSmallDataThresholdValue(const ArgList &Args) {
1491 std::string value;
1492 if (HasPICArg(Args))
1493 value = "0";
1494 else if (Arg *A = GetLastSmallDataThresholdArg(Args)) {
1495 value = A->getValue();
1496 A->claim();
1497 }
1498 return value;
1499}
1500
Tony Linthicum76329bf2011-12-12 21:14:55 +00001501void Clang::AddHexagonTargetArgs(const ArgList &Args,
1502 ArgStringList &CmdArgs) const {
Tony Linthicum76329bf2011-12-12 21:14:55 +00001503 CmdArgs.push_back("-fno-signed-char");
Matthew Curtis6b222782012-12-07 13:52:44 +00001504 CmdArgs.push_back("-mqdsp6-compat");
1505 CmdArgs.push_back("-Wreturn-type");
Tony Linthicum76329bf2011-12-12 21:14:55 +00001506
Matthew Curtise8f80a12012-12-06 17:49:03 +00001507 std::string SmallDataThreshold = GetHexagonSmallDataThresholdValue(Args);
1508 if (!SmallDataThreshold.empty()) {
Tony Linthicum76329bf2011-12-12 21:14:55 +00001509 CmdArgs.push_back ("-mllvm");
Matthew Curtise8f80a12012-12-06 17:49:03 +00001510 CmdArgs.push_back(Args.MakeArgString(
1511 "-hexagon-small-data-threshold=" + SmallDataThreshold));
Tony Linthicum76329bf2011-12-12 21:14:55 +00001512 }
1513
Sirish Pande11ebc4e2012-05-10 20:19:54 +00001514 if (!Args.hasArg(options::OPT_fno_short_enums))
1515 CmdArgs.push_back("-fshort-enums");
1516 if (Args.getLastArg(options::OPT_mieee_rnd_near)) {
1517 CmdArgs.push_back ("-mllvm");
1518 CmdArgs.push_back ("-enable-hexagon-ieee-rnd-near");
1519 }
Tony Linthicum76329bf2011-12-12 21:14:55 +00001520 CmdArgs.push_back ("-mllvm");
1521 CmdArgs.push_back ("-machine-sink-split=0");
1522}
1523
Rafael Espindola28e1f4b2013-08-21 16:39:20 +00001524static void getAArch64TargetFeatures(const Driver &D, const ArgList &Args,
1525 std::vector<const char *> &Features) {
Tim Northover2fe823a2013-08-01 09:23:19 +00001526 // Honor -mfpu=.
1527 if (const Arg *A = Args.getLastArg(options::OPT_mfpu_EQ))
Amara Emerson4cdb87b2013-10-01 10:20:54 +00001528 getAArch64FPUFeatures(D, A, Args, Features);
Jiangning Liub19c5b62014-02-14 04:37:46 +00001529 else
1530 Features.push_back("+neon");
Amara Emerson04e2ecf2014-01-23 15:48:30 +00001531
1532 if (Args.getLastArg(options::OPT_mgeneral_regs_only)) {
1533 Features.push_back("-fp-armv8");
1534 Features.push_back("-crypto");
1535 Features.push_back("-neon");
1536 }
Rafael Espindola28e1f4b2013-08-21 16:39:20 +00001537}
1538
1539static void getTargetFeatures(const Driver &D, const llvm::Triple &Triple,
Rafael Espindola9c6fb0f2013-11-23 14:36:40 +00001540 const ArgList &Args, ArgStringList &CmdArgs,
1541 bool ForAS) {
Rafael Espindola28e1f4b2013-08-21 16:39:20 +00001542 std::vector<const char *> Features;
1543 switch (Triple.getArch()) {
1544 default:
1545 break;
1546 case llvm::Triple::mips:
1547 case llvm::Triple::mipsel:
1548 case llvm::Triple::mips64:
1549 case llvm::Triple::mips64el:
1550 getMIPSTargetFeatures(D, Args, Features);
1551 break;
1552
1553 case llvm::Triple::arm:
Christian Pirkerf01cd6f2014-03-28 14:40:46 +00001554 case llvm::Triple::armeb:
Rafael Espindola28e1f4b2013-08-21 16:39:20 +00001555 case llvm::Triple::thumb:
Christian Pirkerf01cd6f2014-03-28 14:40:46 +00001556 case llvm::Triple::thumbeb:
Rafael Espindola9c6fb0f2013-11-23 14:36:40 +00001557 getARMTargetFeatures(D, Triple, Args, Features, ForAS);
Rafael Espindola28e1f4b2013-08-21 16:39:20 +00001558 break;
1559
1560 case llvm::Triple::ppc:
1561 case llvm::Triple::ppc64:
1562 case llvm::Triple::ppc64le:
1563 getPPCTargetFeatures(Args, Features);
1564 break;
1565 case llvm::Triple::sparc:
1566 getSparcTargetFeatures(Args, Features);
1567 break;
1568 case llvm::Triple::aarch64:
Christian Pirker9b019ae2014-02-25 13:51:00 +00001569 case llvm::Triple::aarch64_be:
Rafael Espindola28e1f4b2013-08-21 16:39:20 +00001570 getAArch64TargetFeatures(D, Args, Features);
1571 break;
1572 case llvm::Triple::x86:
1573 case llvm::Triple::x86_64:
Jim Grosbach82eee262013-11-16 00:53:35 +00001574 getX86TargetFeatures(Triple, Args, Features);
Rafael Espindola28e1f4b2013-08-21 16:39:20 +00001575 break;
1576 }
Rafael Espindola43964802013-08-21 17:34:32 +00001577
1578 // Find the last of each feature.
1579 llvm::StringMap<unsigned> LastOpt;
1580 for (unsigned I = 0, N = Features.size(); I < N; ++I) {
1581 const char *Name = Features[I];
1582 assert(Name[0] == '-' || Name[0] == '+');
1583 LastOpt[Name + 1] = I;
1584 }
1585
1586 for (unsigned I = 0, N = Features.size(); I < N; ++I) {
1587 // If this feature was overridden, ignore it.
1588 const char *Name = Features[I];
1589 llvm::StringMap<unsigned>::iterator LastI = LastOpt.find(Name + 1);
1590 assert(LastI != LastOpt.end());
1591 unsigned Last = LastI->second;
1592 if (Last != I)
1593 continue;
1594
Rafael Espindola28e1f4b2013-08-21 16:39:20 +00001595 CmdArgs.push_back("-target-feature");
Rafael Espindola43964802013-08-21 17:34:32 +00001596 CmdArgs.push_back(Name);
Rafael Espindola28e1f4b2013-08-21 16:39:20 +00001597 }
Tim Northover2fe823a2013-08-01 09:23:19 +00001598}
1599
Eric Christopher84fbdb42011-08-19 00:30:14 +00001600static bool
John McCall5fb5df92012-06-20 06:18:46 +00001601shouldUseExceptionTablesForObjCExceptions(const ObjCRuntime &runtime,
Anders Carlsson246ff3f2011-02-28 00:44:51 +00001602 const llvm::Triple &Triple) {
1603 // We use the zero-cost exception tables for Objective-C if the non-fragile
1604 // ABI is enabled or when compiling for x86_64 and ARM on Snow Leopard and
1605 // later.
John McCall5fb5df92012-06-20 06:18:46 +00001606 if (runtime.isNonFragile())
Anders Carlsson246ff3f2011-02-28 00:44:51 +00001607 return true;
1608
Bob Wilson83e723a2013-12-05 19:38:42 +00001609 if (!Triple.isMacOSX())
Anders Carlsson246ff3f2011-02-28 00:44:51 +00001610 return false;
1611
Eric Christopherbf15d2b2011-07-02 00:20:22 +00001612 return (!Triple.isMacOSXVersionLT(10,5) &&
Anders Carlsson246ff3f2011-02-28 00:44:51 +00001613 (Triple.getArch() == llvm::Triple::x86_64 ||
Eric Christopher84fbdb42011-08-19 00:30:14 +00001614 Triple.getArch() == llvm::Triple::arm));
Anders Carlsson246ff3f2011-02-28 00:44:51 +00001615}
1616
Robert Lyttonf7e03c12014-02-13 10:34:44 +00001617namespace {
1618 struct ExceptionSettings {
1619 bool ExceptionsEnabled;
1620 bool ShouldUseExceptionTables;
1621 ExceptionSettings() : ExceptionsEnabled(false),
1622 ShouldUseExceptionTables(false) {}
1623 };
1624} // end anonymous namespace.
1625
Robert Lytton694f8842014-02-13 10:38:56 +00001626// exceptionSettings() exists to share the logic between -cc1 and linker invocations.
Robert Lyttonf7e03c12014-02-13 10:34:44 +00001627static ExceptionSettings exceptionSettings(const ArgList &Args,
1628 const llvm::Triple &Triple) {
1629 ExceptionSettings ES;
1630
1631 // Are exceptions enabled by default?
1632 ES.ExceptionsEnabled = (Triple.getArch() != llvm::Triple::xcore);
1633
1634 // This keeps track of whether exceptions were explicitly turned on or off.
1635 bool DidHaveExplicitExceptionFlag = false;
1636
1637 if (Arg *A = Args.getLastArg(options::OPT_fexceptions,
1638 options::OPT_fno_exceptions)) {
1639 if (A->getOption().matches(options::OPT_fexceptions))
1640 ES.ExceptionsEnabled = true;
1641 else
1642 ES.ExceptionsEnabled = false;
1643
1644 DidHaveExplicitExceptionFlag = true;
1645 }
1646
1647 // Exception tables and cleanups can be enabled with -fexceptions even if the
1648 // language itself doesn't support exceptions.
1649 if (ES.ExceptionsEnabled && DidHaveExplicitExceptionFlag)
1650 ES.ShouldUseExceptionTables = true;
1651
1652 return ES;
1653}
1654
Anders Carlssone96ab552011-02-28 02:27:16 +00001655/// addExceptionArgs - Adds exception related arguments to the driver command
1656/// arguments. There's a master flag, -fexceptions and also language specific
1657/// flags to enable/disable C++ and Objective-C exceptions.
1658/// This makes it possible to for example disable C++ exceptions but enable
1659/// Objective-C exceptions.
1660static void addExceptionArgs(const ArgList &Args, types::ID InputType,
1661 const llvm::Triple &Triple,
Fariborz Jahanianb2482212012-04-04 18:28:00 +00001662 bool KernelOrKext,
John McCall5fb5df92012-06-20 06:18:46 +00001663 const ObjCRuntime &objcRuntime,
Anders Carlssone96ab552011-02-28 02:27:16 +00001664 ArgStringList &CmdArgs) {
Chad Rosier4fab82c2012-03-26 22:04:46 +00001665 if (KernelOrKext) {
1666 // -mkernel and -fapple-kext imply no exceptions, so claim exception related
1667 // arguments now to avoid warnings about unused arguments.
1668 Args.ClaimAllArgs(options::OPT_fexceptions);
1669 Args.ClaimAllArgs(options::OPT_fno_exceptions);
1670 Args.ClaimAllArgs(options::OPT_fobjc_exceptions);
1671 Args.ClaimAllArgs(options::OPT_fno_objc_exceptions);
1672 Args.ClaimAllArgs(options::OPT_fcxx_exceptions);
1673 Args.ClaimAllArgs(options::OPT_fno_cxx_exceptions);
Anders Carlssone96ab552011-02-28 02:27:16 +00001674 return;
Chad Rosier4fab82c2012-03-26 22:04:46 +00001675 }
Anders Carlssone96ab552011-02-28 02:27:16 +00001676
Robert Lyttonf7e03c12014-02-13 10:34:44 +00001677 // Gather the exception settings from the command line arguments.
1678 ExceptionSettings ES = exceptionSettings(Args, Triple);
Daniel Dunbar30a12b82010-09-14 23:12:31 +00001679
Daniel Dunbarc44f8cf2011-03-17 23:28:31 +00001680 // Obj-C exceptions are enabled by default, regardless of -fexceptions. This
1681 // is not necessarily sensible, but follows GCC.
1682 if (types::isObjC(InputType) &&
Eric Christopher84fbdb42011-08-19 00:30:14 +00001683 Args.hasFlag(options::OPT_fobjc_exceptions,
Daniel Dunbarc44f8cf2011-03-17 23:28:31 +00001684 options::OPT_fno_objc_exceptions,
1685 true)) {
1686 CmdArgs.push_back("-fobjc-exceptions");
Anders Carlssone96ab552011-02-28 02:27:16 +00001687
Robert Lyttonf7e03c12014-02-13 10:34:44 +00001688 ES.ShouldUseExceptionTables |=
John McCall5fb5df92012-06-20 06:18:46 +00001689 shouldUseExceptionTablesForObjCExceptions(objcRuntime, Triple);
Anders Carlssone96ab552011-02-28 02:27:16 +00001690 }
1691
1692 if (types::isCXX(InputType)) {
Robert Lyttonf7e03c12014-02-13 10:34:44 +00001693 bool CXXExceptionsEnabled = ES.ExceptionsEnabled;
Anders Carlssone96ab552011-02-28 02:27:16 +00001694
Eric Christopher84fbdb42011-08-19 00:30:14 +00001695 if (Arg *A = Args.getLastArg(options::OPT_fcxx_exceptions,
1696 options::OPT_fno_cxx_exceptions,
Anders Carlssone96ab552011-02-28 02:27:16 +00001697 options::OPT_fexceptions,
1698 options::OPT_fno_exceptions)) {
1699 if (A->getOption().matches(options::OPT_fcxx_exceptions))
1700 CXXExceptionsEnabled = true;
Chandler Carruth74f87112011-02-28 07:25:18 +00001701 else if (A->getOption().matches(options::OPT_fno_cxx_exceptions))
Anders Carlssone96ab552011-02-28 02:27:16 +00001702 CXXExceptionsEnabled = false;
1703 }
1704
1705 if (CXXExceptionsEnabled) {
1706 CmdArgs.push_back("-fcxx-exceptions");
1707
Robert Lyttonf7e03c12014-02-13 10:34:44 +00001708 ES.ShouldUseExceptionTables = true;
Anders Carlssone96ab552011-02-28 02:27:16 +00001709 }
1710 }
1711
Robert Lyttonf7e03c12014-02-13 10:34:44 +00001712 if (ES.ShouldUseExceptionTables)
Anders Carlssone96ab552011-02-28 02:27:16 +00001713 CmdArgs.push_back("-fexceptions");
Rafael Espindola00a66572009-10-01 13:33:33 +00001714}
1715
Daniel Dunbare246fbe2013-04-16 18:21:19 +00001716static bool ShouldDisableAutolink(const ArgList &Args,
1717 const ToolChain &TC) {
1718 bool Default = true;
1719 if (TC.getTriple().isOSDarwin()) {
1720 // The native darwin assembler doesn't support the linker_option directives,
1721 // so we disable them if we think the .s file will be passed to it.
1722 Default = TC.useIntegratedAs();
1723 }
1724 return !Args.hasFlag(options::OPT_fautolink, options::OPT_fno_autolink,
1725 Default);
1726}
1727
Rafael Espindola4cfa7972011-05-02 17:43:32 +00001728static bool ShouldDisableCFI(const ArgList &Args,
1729 const ToolChain &TC) {
Rafael Espindolac41db922012-03-08 14:39:55 +00001730 bool Default = true;
Bob Wilson6524dd32011-10-14 05:03:44 +00001731 if (TC.getTriple().isOSDarwin()) {
Rafael Espindolaf934f982011-05-17 16:26:17 +00001732 // The native darwin assembler doesn't support cfi directives, so
Rafael Espindola35ab91c2011-05-17 19:06:58 +00001733 // we disable them if we think the .s file will be passed to it.
Rafael Espindola84b588b2013-03-18 18:10:27 +00001734 Default = TC.useIntegratedAs();
Rafael Espindolaf934f982011-05-17 16:26:17 +00001735 }
Rafael Espindolac41db922012-03-08 14:39:55 +00001736 return !Args.hasFlag(options::OPT_fdwarf2_cfi_asm,
Eric Christopher45f2e712012-12-18 00:31:10 +00001737 options::OPT_fno_dwarf2_cfi_asm,
1738 Default);
Rafael Espindola4cfa7972011-05-02 17:43:32 +00001739}
1740
Ted Kremenek62093662013-03-12 17:02:12 +00001741static bool ShouldDisableDwarfDirectory(const ArgList &Args,
1742 const ToolChain &TC) {
Nick Lewycky1d617ac2011-10-17 23:05:52 +00001743 bool UseDwarfDirectory = Args.hasFlag(options::OPT_fdwarf_directory_asm,
1744 options::OPT_fno_dwarf_directory_asm,
Rafael Espindola84b588b2013-03-18 18:10:27 +00001745 TC.useIntegratedAs());
Nick Lewycky1d617ac2011-10-17 23:05:52 +00001746 return !UseDwarfDirectory;
1747}
1748
Joerg Sonnenbergeref317a22011-05-06 14:35:16 +00001749/// \brief Check whether the given input tree contains any compilation actions.
1750static bool ContainsCompileAction(const Action *A) {
Chris Lattner0e62c1c2011-07-23 10:55:15 +00001751 if (isa<CompileJobAction>(A))
Joerg Sonnenbergeref317a22011-05-06 14:35:16 +00001752 return true;
1753
1754 for (Action::const_iterator it = A->begin(), ie = A->end(); it != ie; ++it)
1755 if (ContainsCompileAction(*it))
1756 return true;
1757
1758 return false;
1759}
1760
1761/// \brief Check if -relax-all should be passed to the internal assembler.
1762/// This is done by default when compiling non-assembler source with -O0.
1763static bool UseRelaxAll(Compilation &C, const ArgList &Args) {
1764 bool RelaxDefault = true;
1765
1766 if (Arg *A = Args.getLastArg(options::OPT_O_Group))
1767 RelaxDefault = A->getOption().matches(options::OPT_O0);
1768
1769 if (RelaxDefault) {
1770 RelaxDefault = false;
1771 for (ActionList::const_iterator it = C.getActions().begin(),
1772 ie = C.getActions().end(); it != ie; ++it) {
1773 if (ContainsCompileAction(*it)) {
1774 RelaxDefault = true;
1775 break;
1776 }
1777 }
1778 }
1779
1780 return Args.hasFlag(options::OPT_mrelax_all, options::OPT_mno_relax_all,
1781 RelaxDefault);
1782}
1783
David Blaikie9260ed62013-07-25 21:19:01 +00001784static void CollectArgsForIntegratedAssembler(Compilation &C,
1785 const ArgList &Args,
1786 ArgStringList &CmdArgs,
1787 const Driver &D) {
1788 if (UseRelaxAll(C, Args))
1789 CmdArgs.push_back("-mrelax-all");
1790
David Peixottodfb66142013-11-14 22:52:58 +00001791 // When passing -I arguments to the assembler we sometimes need to
David Peixotto4afe0792013-11-14 22:58:17 +00001792 // unconditionally take the next argument. For example, when parsing
David Peixottodfb66142013-11-14 22:52:58 +00001793 // '-Wa,-I -Wa,foo' we need to accept the -Wa,foo arg after seeing the
1794 // -Wa,-I arg and when parsing '-Wa,-I,foo' we need to accept the 'foo'
1795 // arg after parsing the '-I' arg.
1796 bool TakeNextArg = false;
1797
David Blaikie9260ed62013-07-25 21:19:01 +00001798 // When using an integrated assembler, translate -Wa, and -Xassembler
1799 // options.
David Blaikie7e2fd942014-03-27 20:47:30 +00001800 bool CompressDebugSections = false;
David Blaikie9260ed62013-07-25 21:19:01 +00001801 for (arg_iterator it = Args.filtered_begin(options::OPT_Wa_COMMA,
1802 options::OPT_Xassembler),
1803 ie = Args.filtered_end(); it != ie; ++it) {
1804 const Arg *A = *it;
1805 A->claim();
1806
1807 for (unsigned i = 0, e = A->getNumValues(); i != e; ++i) {
1808 StringRef Value = A->getValue(i);
David Peixottodfb66142013-11-14 22:52:58 +00001809 if (TakeNextArg) {
1810 CmdArgs.push_back(Value.data());
1811 TakeNextArg = false;
1812 continue;
1813 }
David Blaikie9260ed62013-07-25 21:19:01 +00001814
1815 if (Value == "-force_cpusubtype_ALL") {
1816 // Do nothing, this is the default and we don't support anything else.
1817 } else if (Value == "-L") {
1818 CmdArgs.push_back("-msave-temp-labels");
1819 } else if (Value == "--fatal-warnings") {
1820 CmdArgs.push_back("-mllvm");
1821 CmdArgs.push_back("-fatal-assembler-warnings");
1822 } else if (Value == "--noexecstack") {
1823 CmdArgs.push_back("-mnoexecstack");
David Blaikieec59e752014-01-22 19:22:21 +00001824 } else if (Value == "-compress-debug-sections" ||
1825 Value == "--compress-debug-sections") {
David Blaikie7e2fd942014-03-27 20:47:30 +00001826 CompressDebugSections = true;
1827 } else if (Value == "-nocompress-debug-sections" ||
1828 Value == "--nocompress-debug-sections") {
1829 CompressDebugSections = false;
David Peixottodfb66142013-11-14 22:52:58 +00001830 } else if (Value.startswith("-I")) {
1831 CmdArgs.push_back(Value.data());
1832 // We need to consume the next argument if the current arg is a plain
1833 // -I. The next arg will be the include directory.
1834 if (Value == "-I")
1835 TakeNextArg = true;
David Blaikie9260ed62013-07-25 21:19:01 +00001836 } else {
1837 D.Diag(diag::err_drv_unsupported_option_argument)
1838 << A->getOption().getName() << Value;
1839 }
1840 }
1841 }
David Blaikie24bbfed22014-03-31 23:29:38 +00001842 if (CompressDebugSections) {
1843 if (llvm::zlib::isAvailable())
1844 CmdArgs.push_back("-compress-debug-sections");
1845 else
1846 D.Diag(diag::warn_debug_compression_unavailable);
1847 }
David Blaikie9260ed62013-07-25 21:19:01 +00001848}
1849
Renato Goline807c122014-01-31 11:47:28 +00001850// Until ARM libraries are build separately, we have them all in one library
1851static StringRef getArchNameForCompilerRTLib(const ToolChain &TC) {
Christian Pirkerf01cd6f2014-03-28 14:40:46 +00001852 if (TC.getArch() == llvm::Triple::arm ||
1853 TC.getArch() == llvm::Triple::armeb)
Renato Goline807c122014-01-31 11:47:28 +00001854 return "arm";
1855 else
1856 return TC.getArchName();
1857}
1858
Alexey Samsonovce8ab102014-02-25 12:43:43 +00001859static SmallString<128> getCompilerRTLibDir(const ToolChain &TC) {
1860 // The runtimes are located in the OS-specific resource directory.
1861 SmallString<128> Res(TC.getDriver().ResourceDir);
Viktor Kutuzovaa5b5f72014-03-18 09:36:50 +00001862 const llvm::Triple &Triple = TC.getTriple();
1863 // TC.getOS() yield "freebsd10.0" whereas "freebsd" is expected.
1864 StringRef OSLibName = (Triple.getOS() == llvm::Triple::FreeBSD) ?
1865 "freebsd" : TC.getOS();
1866 llvm::sys::path::append(Res, "lib", OSLibName);
Alexey Samsonovce8ab102014-02-25 12:43:43 +00001867 return Res;
Alexey Samsonov7811d192014-02-20 13:57:37 +00001868}
1869
Renato Golinc4b49242014-02-13 10:01:16 +00001870// This adds the static libclang_rt.arch.a directly to the command line
1871// FIXME: Make sure we can also emit shared objects if they're requested
1872// and available, check for possible errors, etc.
1873static void addClangRTLinux(
1874 const ToolChain &TC, const ArgList &Args, ArgStringList &CmdArgs) {
Alexey Samsonovce8ab102014-02-25 12:43:43 +00001875 SmallString<128> LibClangRT = getCompilerRTLibDir(TC);
1876 llvm::sys::path::append(LibClangRT,
Renato Golinc4b49242014-02-13 10:01:16 +00001877 Twine("libclang_rt.") + getArchNameForCompilerRTLib(TC) + ".a");
1878
Alexey Samsonovce8ab102014-02-25 12:43:43 +00001879 CmdArgs.push_back(Args.MakeArgString(LibClangRT));
Renato Golinc4b49242014-02-13 10:01:16 +00001880 CmdArgs.push_back("-lgcc_s");
1881 if (TC.getDriver().CCCIsCXX())
1882 CmdArgs.push_back("-lgcc_eh");
1883}
1884
Alexey Samsonov7811d192014-02-20 13:57:37 +00001885static void addProfileRT(
Chandler Carruth36381702013-06-23 11:28:48 +00001886 const ToolChain &TC, const ArgList &Args, ArgStringList &CmdArgs) {
1887 if (!(Args.hasArg(options::OPT_fprofile_arcs) ||
1888 Args.hasArg(options::OPT_fprofile_generate) ||
Justin Bogner6a9d2cf2014-01-06 22:27:36 +00001889 Args.hasArg(options::OPT_fprofile_instr_generate) ||
Chandler Carruth36381702013-06-23 11:28:48 +00001890 Args.hasArg(options::OPT_fcreate_profile) ||
1891 Args.hasArg(options::OPT_coverage)))
1892 return;
1893
Alexey Samsonovce8ab102014-02-25 12:43:43 +00001894 SmallString<128> LibProfile = getCompilerRTLibDir(TC);
1895 llvm::sys::path::append(LibProfile,
Renato Goline807c122014-01-31 11:47:28 +00001896 Twine("libclang_rt.profile-") + getArchNameForCompilerRTLib(TC) + ".a");
Chandler Carruth36381702013-06-23 11:28:48 +00001897
Duncan P. N. Exon Smith2d8f93e2014-03-28 17:53:17 +00001898 CmdArgs.push_back(Args.MakeArgString(LibProfile));
Chandler Carruth36381702013-06-23 11:28:48 +00001899}
1900
Alexey Samsonovbdfa6c22014-04-01 13:31:10 +00001901static SmallString<128> getSanitizerRTLibName(const ToolChain &TC,
1902 const StringRef Sanitizer,
1903 bool Shared) {
1904 // Sanitizer runtime has name "libclang_rt.<Sanitizer>-<ArchName>.{a,so}"
1905 // (or "libclang_rt.<Sanitizer>-<ArchName>-android.so for Android)
1906 const char *EnvSuffix =
1907 TC.getTriple().getEnvironment() == llvm::Triple::Android ? "-android" : "";
Alexey Samsonovce8ab102014-02-25 12:43:43 +00001908 SmallString<128> LibSanitizer = getCompilerRTLibDir(TC);
1909 llvm::sys::path::append(LibSanitizer,
Alexey Samsonovbdfa6c22014-04-01 13:31:10 +00001910 Twine("libclang_rt.") + Sanitizer + "-" +
1911 getArchNameForCompilerRTLib(TC) + EnvSuffix +
1912 (Shared ? ".so" : ".a"));
1913 return LibSanitizer;
1914}
1915
1916static void addSanitizerRTLinkFlags(const ToolChain &TC, const ArgList &Args,
1917 ArgStringList &CmdArgs,
1918 const StringRef Sanitizer,
1919 bool BeforeLibStdCXX,
1920 bool ExportSymbols = true,
1921 bool LinkDeps = true) {
1922 SmallString<128> LibSanitizer =
1923 getSanitizerRTLibName(TC, Sanitizer, /*Shared*/ false);
Richard Smithcff3cde2013-03-20 23:49:07 +00001924
Alexey Samsonovbfb0cd32013-02-27 11:14:55 +00001925 // Sanitizer runtime may need to come before -lstdc++ (or -lc++, libstdc++.a,
1926 // etc.) so that the linker picks custom versions of the global 'operator
1927 // new' and 'operator delete' symbols. We take the extreme (but simple)
Peter Collingbournef7ef3fd812013-10-20 21:29:13 +00001928 // strategy of inserting it at the front of the link command. It also
1929 // needs to be forced to end up in the executable, so wrap it in
1930 // whole-archive.
Richard Smithcff3cde2013-03-20 23:49:07 +00001931 SmallVector<const char *, 3> LibSanitizerArgs;
Peter Collingbournef7ef3fd812013-10-20 21:29:13 +00001932 LibSanitizerArgs.push_back("-whole-archive");
Richard Smithcff3cde2013-03-20 23:49:07 +00001933 LibSanitizerArgs.push_back(Args.MakeArgString(LibSanitizer));
Peter Collingbournef7ef3fd812013-10-20 21:29:13 +00001934 LibSanitizerArgs.push_back("-no-whole-archive");
Richard Smithcff3cde2013-03-20 23:49:07 +00001935
1936 CmdArgs.insert(BeforeLibStdCXX ? CmdArgs.begin() : CmdArgs.end(),
1937 LibSanitizerArgs.begin(), LibSanitizerArgs.end());
1938
Alexey Samsonovbdfa6c22014-04-01 13:31:10 +00001939 if (LinkDeps) {
1940 // Link sanitizer dependencies explicitly
1941 CmdArgs.push_back("-lpthread");
1942 CmdArgs.push_back("-lrt");
1943 CmdArgs.push_back("-lm");
1944 // There's no libdl on FreeBSD.
1945 if (TC.getTriple().getOS() != llvm::Triple::FreeBSD)
1946 CmdArgs.push_back("-ldl");
1947 }
Richard Smithf3e624c2013-03-23 00:30:08 +00001948
1949 // If possible, use a dynamic symbols file to export the symbols from the
1950 // runtime library. If we can't do so, use -export-dynamic instead to export
1951 // all symbols from the binary.
1952 if (ExportSymbols) {
1953 if (llvm::sys::fs::exists(LibSanitizer + ".syms"))
1954 CmdArgs.push_back(
1955 Args.MakeArgString("--dynamic-list=" + LibSanitizer + ".syms"));
1956 else
1957 CmdArgs.push_back("-export-dynamic");
1958 }
Alexey Samsonovbfb0cd32013-02-27 11:14:55 +00001959}
1960
Kostya Serebryany7bca6c22011-11-30 01:39:16 +00001961/// If AddressSanitizer is enabled, add appropriate linker flags (Linux).
1962/// This needs to be called before we add the C run-time (malloc, etc).
Alexey Samsonovce8ab102014-02-25 12:43:43 +00001963static void addAsanRT(const ToolChain &TC, const ArgList &Args,
Alexey Samsonovbdfa6c22014-04-01 13:31:10 +00001964 ArgStringList &CmdArgs, bool Shared) {
1965 if (Shared) {
1966 // Link dynamic runtime if necessary.
1967 SmallString<128> LibSanitizer =
1968 getSanitizerRTLibName(TC, "asan", Shared);
1969 CmdArgs.insert(CmdArgs.begin(), Args.MakeArgString(LibSanitizer));
Evgeniy Stepanov77866712012-04-25 08:59:22 +00001970 }
Alexey Samsonovbdfa6c22014-04-01 13:31:10 +00001971
1972 // Do not link static runtime to DSOs or if compiling for Android.
1973 if (Args.hasArg(options::OPT_shared) ||
1974 (TC.getTriple().getEnvironment() == llvm::Triple::Android))
1975 return;
1976
1977 const char *LibAsanStaticPart = Shared ? "asan-preinit" : "asan";
1978 addSanitizerRTLinkFlags(TC, Args, CmdArgs, LibAsanStaticPart,
1979 /*BeforeLibStdCXX*/ true, /*ExportSymbols*/ !Shared,
1980 /*LinkDeps*/ !Shared);
Kostya Serebryany7bca6c22011-11-30 01:39:16 +00001981}
1982
Kostya Serebryany66e8fab2012-05-16 06:36:00 +00001983/// If ThreadSanitizer is enabled, add appropriate linker flags (Linux).
1984/// This needs to be called before we add the C run-time (malloc, etc).
Alexey Samsonovce8ab102014-02-25 12:43:43 +00001985static void addTsanRT(const ToolChain &TC, const ArgList &Args,
1986 ArgStringList &CmdArgs) {
Sergey Matveev1814e9e2013-05-27 11:17:01 +00001987 if (!Args.hasArg(options::OPT_shared))
Alexey Samsonovce8ab102014-02-25 12:43:43 +00001988 addSanitizerRTLinkFlags(TC, Args, CmdArgs, "tsan", true);
Kostya Serebryany66e8fab2012-05-16 06:36:00 +00001989}
1990
Evgeniy Stepanovaea92e52012-12-03 13:20:43 +00001991/// If MemorySanitizer is enabled, add appropriate linker flags (Linux).
1992/// This needs to be called before we add the C run-time (malloc, etc).
Alexey Samsonovce8ab102014-02-25 12:43:43 +00001993static void addMsanRT(const ToolChain &TC, const ArgList &Args,
1994 ArgStringList &CmdArgs) {
Sergey Matveev1814e9e2013-05-27 11:17:01 +00001995 if (!Args.hasArg(options::OPT_shared))
Alexey Samsonovce8ab102014-02-25 12:43:43 +00001996 addSanitizerRTLinkFlags(TC, Args, CmdArgs, "msan", true);
Sergey Matveev1814e9e2013-05-27 11:17:01 +00001997}
1998
1999/// If LeakSanitizer is enabled, add appropriate linker flags (Linux).
2000/// This needs to be called before we add the C run-time (malloc, etc).
Alexey Samsonovce8ab102014-02-25 12:43:43 +00002001static void addLsanRT(const ToolChain &TC, const ArgList &Args,
2002 ArgStringList &CmdArgs) {
Sergey Matveev1814e9e2013-05-27 11:17:01 +00002003 if (!Args.hasArg(options::OPT_shared))
Alexey Samsonovce8ab102014-02-25 12:43:43 +00002004 addSanitizerRTLinkFlags(TC, Args, CmdArgs, "lsan", true);
Evgeniy Stepanovaea92e52012-12-03 13:20:43 +00002005}
2006
Richard Smithe30752c2012-10-09 19:52:38 +00002007/// If UndefinedBehaviorSanitizer is enabled, add appropriate linker flags
2008/// (Linux).
Alexey Samsonovce8ab102014-02-25 12:43:43 +00002009static void addUbsanRT(const ToolChain &TC, const ArgList &Args,
2010 ArgStringList &CmdArgs, bool IsCXX,
2011 bool HasOtherSanitizerRt) {
Nick Lewycky24921692013-10-19 00:27:23 +00002012 // Need a copy of sanitizer_common. This could come from another sanitizer
2013 // runtime; if we're not including one, include our own copy.
2014 if (!HasOtherSanitizerRt)
Alexey Samsonovce8ab102014-02-25 12:43:43 +00002015 addSanitizerRTLinkFlags(TC, Args, CmdArgs, "san", true, false);
Peter Collingbournef7ef3fd812013-10-20 21:29:13 +00002016
Alexey Samsonovce8ab102014-02-25 12:43:43 +00002017 addSanitizerRTLinkFlags(TC, Args, CmdArgs, "ubsan", false);
Peter Collingbournef7ef3fd812013-10-20 21:29:13 +00002018
2019 // Only include the bits of the runtime which need a C++ ABI library if
2020 // we're linking in C++ mode.
2021 if (IsCXX)
Alexey Samsonovce8ab102014-02-25 12:43:43 +00002022 addSanitizerRTLinkFlags(TC, Args, CmdArgs, "ubsan_cxx", false);
Richard Smithe30752c2012-10-09 19:52:38 +00002023}
2024
Alexey Samsonovce8ab102014-02-25 12:43:43 +00002025static void addDfsanRT(const ToolChain &TC, const ArgList &Args,
2026 ArgStringList &CmdArgs) {
Peter Collingbournec3772752013-08-07 22:47:34 +00002027 if (!Args.hasArg(options::OPT_shared))
Alexey Samsonovce8ab102014-02-25 12:43:43 +00002028 addSanitizerRTLinkFlags(TC, Args, CmdArgs, "dfsan", true);
2029}
2030
2031// Should be called before we add C++ ABI library.
2032static void addSanitizerRuntimes(const ToolChain &TC, const ArgList &Args,
2033 ArgStringList &CmdArgs) {
2034 const SanitizerArgs &Sanitize = TC.getSanitizerArgs();
2035 const Driver &D = TC.getDriver();
2036 if (Sanitize.needsUbsanRt())
2037 addUbsanRT(TC, Args, CmdArgs, D.CCCIsCXX(),
2038 Sanitize.needsAsanRt() || Sanitize.needsTsanRt() ||
2039 Sanitize.needsMsanRt() || Sanitize.needsLsanRt());
2040 if (Sanitize.needsAsanRt())
Alexey Samsonovbdfa6c22014-04-01 13:31:10 +00002041 addAsanRT(TC, Args, CmdArgs, Sanitize.needsSharedAsanRt());
Alexey Samsonovce8ab102014-02-25 12:43:43 +00002042 if (Sanitize.needsTsanRt())
2043 addTsanRT(TC, Args, CmdArgs);
2044 if (Sanitize.needsMsanRt())
2045 addMsanRT(TC, Args, CmdArgs);
2046 if (Sanitize.needsLsanRt())
2047 addLsanRT(TC, Args, CmdArgs);
2048 if (Sanitize.needsDfsanRt())
2049 addDfsanRT(TC, Args, CmdArgs);
Peter Collingbournec3772752013-08-07 22:47:34 +00002050}
2051
Benjamin Kramer34cb0432013-10-16 17:42:39 +00002052static bool shouldUseFramePointerForTarget(const ArgList &Args,
2053 const llvm::Triple &Triple) {
2054 switch (Triple.getArch()) {
2055 // Don't use a frame pointer on linux if optimizing for certain targets.
2056 case llvm::Triple::mips64:
2057 case llvm::Triple::mips64el:
2058 case llvm::Triple::mips:
2059 case llvm::Triple::mipsel:
2060 case llvm::Triple::systemz:
2061 case llvm::Triple::x86:
2062 case llvm::Triple::x86_64:
2063 if (Triple.isOSLinux())
2064 if (Arg *A = Args.getLastArg(options::OPT_O_Group))
2065 if (!A->getOption().matches(options::OPT_O0))
2066 return false;
2067 return true;
2068 case llvm::Triple::xcore:
2069 return false;
2070 default:
2071 return true;
2072 }
2073}
2074
Rafael Espindola224dd632011-12-14 21:02:23 +00002075static bool shouldUseFramePointer(const ArgList &Args,
2076 const llvm::Triple &Triple) {
2077 if (Arg *A = Args.getLastArg(options::OPT_fno_omit_frame_pointer,
2078 options::OPT_fomit_frame_pointer))
2079 return A->getOption().matches(options::OPT_fno_omit_frame_pointer);
2080
Benjamin Kramer34cb0432013-10-16 17:42:39 +00002081 return shouldUseFramePointerForTarget(Args, Triple);
Rafael Espindola224dd632011-12-14 21:02:23 +00002082}
2083
Eric Christopherb7d97e92013-04-03 01:58:53 +00002084static bool shouldUseLeafFramePointer(const ArgList &Args,
2085 const llvm::Triple &Triple) {
2086 if (Arg *A = Args.getLastArg(options::OPT_mno_omit_leaf_frame_pointer,
2087 options::OPT_momit_leaf_frame_pointer))
2088 return A->getOption().matches(options::OPT_mno_omit_leaf_frame_pointer);
2089
Benjamin Kramer34cb0432013-10-16 17:42:39 +00002090 return shouldUseFramePointerForTarget(Args, Triple);
Eric Christopherb7d97e92013-04-03 01:58:53 +00002091}
2092
Rafael Espindolac7367ff2013-08-10 01:40:10 +00002093/// Add a CC1 option to specify the debug compilation directory.
Chandler Carruth4d5e1a92012-12-17 21:40:04 +00002094static void addDebugCompDirArg(const ArgList &Args, ArgStringList &CmdArgs) {
Benjamin Kramer698d7c82013-04-27 08:12:29 +00002095 SmallString<128> cwd;
2096 if (!llvm::sys::fs::current_path(cwd)) {
Chad Rosiera35d5a32013-04-26 20:49:50 +00002097 CmdArgs.push_back("-fdebug-compilation-dir");
2098 CmdArgs.push_back(Args.MakeArgString(cwd));
Chandler Carruth4d5e1a92012-12-17 21:40:04 +00002099 }
2100}
2101
Eric Christopherd3804002013-02-22 20:12:52 +00002102static const char *SplitDebugName(const ArgList &Args,
2103 const InputInfoList &Inputs) {
2104 Arg *FinalOutput = Args.getLastArg(options::OPT_o);
2105 if (FinalOutput && Args.hasArg(options::OPT_c)) {
2106 SmallString<128> T(FinalOutput->getValue());
2107 llvm::sys::path::replace_extension(T, "dwo");
2108 return Args.MakeArgString(T);
2109 } else {
2110 // Use the compilation dir.
2111 SmallString<128> T(Args.getLastArgValue(options::OPT_fdebug_compilation_dir));
2112 SmallString<128> F(llvm::sys::path::stem(Inputs[0].getBaseInput()));
2113 llvm::sys::path::replace_extension(F, "dwo");
2114 T += F;
2115 return Args.MakeArgString(F);
2116 }
2117}
2118
2119static void SplitDebugInfo(const ToolChain &TC, Compilation &C,
2120 const Tool &T, const JobAction &JA,
2121 const ArgList &Args, const InputInfo &Output,
2122 const char *OutFile) {
Eric Christopher248357f2013-02-21 22:35:01 +00002123 ArgStringList ExtractArgs;
2124 ExtractArgs.push_back("--extract-dwo");
2125
2126 ArgStringList StripArgs;
2127 StripArgs.push_back("--strip-dwo");
2128
2129 // Grabbing the output of the earlier compile step.
2130 StripArgs.push_back(Output.getFilename());
2131 ExtractArgs.push_back(Output.getFilename());
Eric Christopher248357f2013-02-21 22:35:01 +00002132 ExtractArgs.push_back(OutFile);
2133
2134 const char *Exec =
Eric Christopherd3804002013-02-22 20:12:52 +00002135 Args.MakeArgString(TC.GetProgramPath("objcopy"));
Eric Christopher248357f2013-02-21 22:35:01 +00002136
2137 // First extract the dwo sections.
Eric Christopherd3804002013-02-22 20:12:52 +00002138 C.addCommand(new Command(JA, T, Exec, ExtractArgs));
Eric Christopher248357f2013-02-21 22:35:01 +00002139
2140 // Then remove them from the original .o file.
Eric Christopherd3804002013-02-22 20:12:52 +00002141 C.addCommand(new Command(JA, T, Exec, StripArgs));
Eric Christopher248357f2013-02-21 22:35:01 +00002142}
2143
Arnold Schwaighofer7f994ce2013-08-13 15:46:23 +00002144/// \brief Vectorize at all optimization levels greater than 1 except for -Oz.
2145static bool shouldEnableVectorizerAtOLevel(const ArgList &Args) {
2146 if (Arg *A = Args.getLastArg(options::OPT_O_Group)) {
Rafael Espindolaad70d962013-08-27 16:58:15 +00002147 if (A->getOption().matches(options::OPT_O4) ||
2148 A->getOption().matches(options::OPT_Ofast))
Arnold Schwaighofer7f994ce2013-08-13 15:46:23 +00002149 return true;
2150
2151 if (A->getOption().matches(options::OPT_O0))
2152 return false;
2153
2154 assert(A->getOption().matches(options::OPT_O) && "Must have a -O flag");
2155
Rafael Espindola91780de2013-08-26 14:05:41 +00002156 // Vectorize -Os.
Arnold Schwaighofer7f994ce2013-08-13 15:46:23 +00002157 StringRef S(A->getValue());
Rafael Espindola91780de2013-08-26 14:05:41 +00002158 if (S == "s")
Arnold Schwaighofer7f994ce2013-08-13 15:46:23 +00002159 return true;
2160
2161 // Don't vectorize -Oz.
2162 if (S == "z")
2163 return false;
2164
2165 unsigned OptLevel = 0;
2166 if (S.getAsInteger(10, OptLevel))
2167 return false;
2168
2169 return OptLevel > 1;
2170 }
2171
2172 return false;
2173}
2174
Ben Langmuir2cb4a782014-02-05 22:21:15 +00002175/// Add -x lang to \p CmdArgs for \p Input.
2176static void addDashXForInput(const ArgList &Args, const InputInfo &Input,
2177 ArgStringList &CmdArgs) {
2178 // When using -verify-pch, we don't want to provide the type
2179 // 'precompiled-header' if it was inferred from the file extension
2180 if (Args.hasArg(options::OPT_verify_pch) && Input.getType() == types::TY_PCH)
2181 return;
2182
2183 CmdArgs.push_back("-x");
2184 if (Args.hasArg(options::OPT_rewrite_objc))
2185 CmdArgs.push_back(types::getTypeName(types::TY_PP_ObjCXX));
2186 else
2187 CmdArgs.push_back(types::getTypeName(Input.getType()));
2188}
2189
Daniel Dunbar1a093d22009-03-18 06:00:36 +00002190void Clang::ConstructJob(Compilation &C, const JobAction &JA,
Daniel Dunbar04c4c2c2009-03-18 07:06:02 +00002191 const InputInfo &Output,
Daniel Dunbar0450e6d2009-03-18 06:07:59 +00002192 const InputInfoList &Inputs,
Daniel Dunbara2aedc62009-03-18 10:01:51 +00002193 const ArgList &Args,
Daniel Dunbar1a093d22009-03-18 06:00:36 +00002194 const char *LinkingOutput) const {
Daniel Dunbare46b52a2010-03-20 04:52:14 +00002195 bool KernelOrKext = Args.hasArg(options::OPT_mkernel,
2196 options::OPT_fapple_kext);
Daniel Dunbar083edf72009-12-21 18:54:17 +00002197 const Driver &D = getToolChain().getDriver();
Daniel Dunbara3246a02009-03-18 08:07:30 +00002198 ArgStringList CmdArgs;
2199
Saleem Abdulrasool377066a2014-03-27 22:50:18 +00002200 bool IsWindowsGNU = getToolChain().getTriple().isWindowsGNUEnvironment();
2201 bool IsWindowsCygnus = getToolChain().getTriple().isWindowsCygwinEnvironment();
2202 bool IsWindowsMSVC = getToolChain().getTriple().isWindowsMSVCEnvironment();
2203
Daniel Dunbare521a892009-03-31 20:53:55 +00002204 assert(Inputs.size() == 1 && "Unable to handle multiple inputs.");
2205
Daniel Dunbar6c536aa2009-12-11 23:00:49 +00002206 // Invoke ourselves in -cc1 mode.
2207 //
2208 // FIXME: Implement custom jobs for internal actions.
2209 CmdArgs.push_back("-cc1");
2210
Daniel Dunbar624c21b2009-10-30 18:12:20 +00002211 // Add the "effective" target triple.
Daniel Dunbard640be22009-03-31 17:35:15 +00002212 CmdArgs.push_back("-triple");
Daniel Dunbar82eb4ce2010-08-23 22:35:37 +00002213 std::string TripleStr = getToolChain().ComputeEffectiveClangTriple(Args);
Daniel Dunbar624c21b2009-10-30 18:12:20 +00002214 CmdArgs.push_back(Args.MakeArgString(TripleStr));
Daniel Dunbarfb58b0a2009-09-10 06:49:20 +00002215
Saleem Abdulrasoolf4c9e492014-04-04 20:31:19 +00002216 const llvm::Triple TT(TripleStr);
2217 if (TT.isOSWindows() && (TT.getArch() == llvm::Triple::arm ||
2218 TT.getArch() == llvm::Triple::thumb)) {
2219 unsigned Offset = TT.getArch() == llvm::Triple::arm ? 4 : 6;
2220 unsigned Version;
2221 TT.getArchName().substr(Offset).getAsInteger(10, Version);
2222 if (Version < 7)
2223 D.Diag(diag::err_target_unsupported_arch) << TT.getArchName() << TripleStr;
2224 }
2225
Tim Northover336f1892014-03-29 13:16:12 +00002226 // Push all default warning arguments that are specific to
2227 // the given target. These come before user provided warning options
2228 // are provided.
2229 getToolChain().addClangWarningOptions(CmdArgs);
2230
Daniel Dunbar624c21b2009-10-30 18:12:20 +00002231 // Select the appropriate action.
John McCall5fb5df92012-06-20 06:18:46 +00002232 RewriteKind rewriteKind = RK_None;
Fariborz Jahanian7ebeede2012-04-04 18:50:28 +00002233
Daniel Dunbara2aedc62009-03-18 10:01:51 +00002234 if (isa<AnalyzeJobAction>(JA)) {
2235 assert(JA.getType() == types::TY_Plist && "Invalid output type.");
2236 CmdArgs.push_back("-analyze");
Ted Kremenekf7639e12012-03-06 20:06:33 +00002237 } else if (isa<MigrateJobAction>(JA)) {
2238 CmdArgs.push_back("-migrate");
Daniel Dunbara2aedc62009-03-18 10:01:51 +00002239 } else if (isa<PreprocessJobAction>(JA)) {
Daniel Dunbard67a3222009-03-30 06:36:42 +00002240 if (Output.getType() == types::TY_Dependencies)
2241 CmdArgs.push_back("-Eonly");
Fariborz Jahaniane0a75d62013-03-18 19:41:18 +00002242 else {
Daniel Dunbard67a3222009-03-30 06:36:42 +00002243 CmdArgs.push_back("-E");
Fariborz Jahaniane0a75d62013-03-18 19:41:18 +00002244 if (Args.hasArg(options::OPT_rewrite_objc) &&
2245 !Args.hasArg(options::OPT_g_Group))
2246 CmdArgs.push_back("-P");
2247 }
Daniel Dunbarc4343942010-02-03 03:07:56 +00002248 } else if (isa<AssembleJobAction>(JA)) {
2249 CmdArgs.push_back("-emit-obj");
Daniel Dunbar06e2cc32010-05-27 06:18:05 +00002250
David Blaikie9260ed62013-07-25 21:19:01 +00002251 CollectArgsForIntegratedAssembler(C, Args, CmdArgs, D);
Daniel Dunbar7c874332010-11-19 16:23:35 +00002252
2253 // Also ignore explicit -force_cpusubtype_ALL option.
2254 (void) Args.hasArg(options::OPT_force__cpusubtype__ALL);
Daniel Dunbara2aedc62009-03-18 10:01:51 +00002255 } else if (isa<PrecompileJobAction>(JA)) {
Argyrios Kyrtzidis90bdfbb2010-08-11 23:27:58 +00002256 // Use PCH if the user requested it.
Daniel Dunbarcbc34b72009-10-15 20:02:44 +00002257 bool UsePCH = D.CCCUsePCH;
Daniel Dunbarcbc34b72009-10-15 20:02:44 +00002258
Aaron Ballman1f10cc52012-07-31 01:21:00 +00002259 if (JA.getType() == types::TY_Nothing)
2260 CmdArgs.push_back("-fsyntax-only");
2261 else if (UsePCH)
Douglas Gregor111af7d2009-04-18 00:34:01 +00002262 CmdArgs.push_back("-emit-pch");
2263 else
2264 CmdArgs.push_back("-emit-pth");
Ben Langmuir9b9a8d32014-02-06 18:53:25 +00002265 } else if (isa<VerifyPCHJobAction>(JA)) {
2266 CmdArgs.push_back("-verify-pch");
Daniel Dunbara2aedc62009-03-18 10:01:51 +00002267 } else {
2268 assert(isa<CompileJobAction>(JA) && "Invalid action for clang tool.");
Daniel Dunbard067f7f2009-04-08 23:54:23 +00002269
Daniel Dunbara2aedc62009-03-18 10:01:51 +00002270 if (JA.getType() == types::TY_Nothing) {
Ben Langmuir9b9a8d32014-02-06 18:53:25 +00002271 CmdArgs.push_back("-fsyntax-only");
Daniel Dunbar24e52992010-06-07 23:28:45 +00002272 } else if (JA.getType() == types::TY_LLVM_IR ||
2273 JA.getType() == types::TY_LTO_IR) {
Daniel Dunbara2aedc62009-03-18 10:01:51 +00002274 CmdArgs.push_back("-emit-llvm");
Daniel Dunbar24e52992010-06-07 23:28:45 +00002275 } else if (JA.getType() == types::TY_LLVM_BC ||
2276 JA.getType() == types::TY_LTO_BC) {
Daniel Dunbara2aedc62009-03-18 10:01:51 +00002277 CmdArgs.push_back("-emit-llvm-bc");
2278 } else if (JA.getType() == types::TY_PP_Asm) {
Daniel Dunbard112f102009-09-17 00:47:53 +00002279 CmdArgs.push_back("-S");
Daniel Dunbar6cdf83c2009-09-01 16:57:46 +00002280 } else if (JA.getType() == types::TY_AST) {
2281 CmdArgs.push_back("-emit-pch");
Douglas Gregorbf7fc9c2013-03-27 16:47:18 +00002282 } else if (JA.getType() == types::TY_ModuleFile) {
2283 CmdArgs.push_back("-module-file-info");
Daniel Dunbaraeea8ac2010-02-11 03:16:21 +00002284 } else if (JA.getType() == types::TY_RewrittenObjC) {
2285 CmdArgs.push_back("-rewrite-objc");
John McCall5fb5df92012-06-20 06:18:46 +00002286 rewriteKind = RK_NonFragile;
Fariborz Jahanian73223bb2012-04-02 15:59:19 +00002287 } else if (JA.getType() == types::TY_RewrittenLegacyObjC) {
2288 CmdArgs.push_back("-rewrite-objc");
John McCall5fb5df92012-06-20 06:18:46 +00002289 rewriteKind = RK_Fragile;
Daniel Dunbaraeea8ac2010-02-11 03:16:21 +00002290 } else {
2291 assert(JA.getType() == types::TY_PP_Asm &&
2292 "Unexpected output type!");
Daniel Dunbara2aedc62009-03-18 10:01:51 +00002293 }
Daniel Dunbara3246a02009-03-18 08:07:30 +00002294 }
2295
Daniel Dunbara2aedc62009-03-18 10:01:51 +00002296 // The make clang go fast button.
2297 CmdArgs.push_back("-disable-free");
2298
John McCallbb79b5f2010-02-13 03:50:24 +00002299 // Disable the verification pass in -asserts builds.
2300#ifdef NDEBUG
2301 CmdArgs.push_back("-disable-llvm-verifier");
2302#endif
2303
Daniel Dunbar3b358a32009-04-08 05:11:16 +00002304 // Set the main file name, so that debug info works even with
2305 // -save-temps.
2306 CmdArgs.push_back("-main-file-name");
Bob Wilsondecc03e2012-11-23 06:14:39 +00002307 CmdArgs.push_back(getBaseInputName(Args, Inputs));
Daniel Dunbar3b358a32009-04-08 05:11:16 +00002308
Daniel Dunbar17ddaa62009-04-08 18:03:55 +00002309 // Some flags which affect the language (via preprocessor
Bob Wilsondecc03e2012-11-23 06:14:39 +00002310 // defines).
Daniel Dunbar17ddaa62009-04-08 18:03:55 +00002311 if (Args.hasArg(options::OPT_static))
2312 CmdArgs.push_back("-static-define");
2313
Daniel Dunbara2aedc62009-03-18 10:01:51 +00002314 if (isa<AnalyzeJobAction>(JA)) {
Ted Kremenek05e6f5b2009-09-25 05:55:59 +00002315 // Enable region store model by default.
2316 CmdArgs.push_back("-analyzer-store=region");
2317
Ted Kremenek7bea9a12009-12-07 22:26:14 +00002318 // Treat blocks as analysis entry points.
2319 CmdArgs.push_back("-analyzer-opt-analyze-nested-blocks");
2320
Ted Kremenek49c79792011-03-24 00:28:47 +00002321 CmdArgs.push_back("-analyzer-eagerly-assume");
2322
Daniel Dunbara2aedc62009-03-18 10:01:51 +00002323 // Add default argument set.
Daniel Dunbar58f345ce2009-05-22 00:38:15 +00002324 if (!Args.hasArg(options::OPT__analyzer_no_default_checks)) {
Argyrios Kyrtzidisa6d04d52011-02-15 07:42:33 +00002325 CmdArgs.push_back("-analyzer-checker=core");
Ted Kremenek49c79792011-03-24 00:28:47 +00002326
Saleem Abdulrasool377066a2014-03-27 22:50:18 +00002327 if (!IsWindowsMSVC)
Argyrios Kyrtzidisa6d04d52011-02-15 07:42:33 +00002328 CmdArgs.push_back("-analyzer-checker=unix");
Ted Kremenek49c79792011-03-24 00:28:47 +00002329
Argyrios Kyrtzidisa6d04d52011-02-15 07:42:33 +00002330 if (getToolChain().getTriple().getVendor() == llvm::Triple::Apple)
Ted Kremenek49c79792011-03-24 00:28:47 +00002331 CmdArgs.push_back("-analyzer-checker=osx");
Ted Kremenekb9ff6b22012-01-20 06:00:17 +00002332
2333 CmdArgs.push_back("-analyzer-checker=deadcode");
Ted Kremenek37e96522012-01-26 02:27:38 +00002334
Jordan Rose10ad0812013-04-05 17:55:07 +00002335 if (types::isCXX(Inputs[0].getType()))
2336 CmdArgs.push_back("-analyzer-checker=cplusplus");
2337
Ted Kremenek37e96522012-01-26 02:27:38 +00002338 // Enable the following experimental checkers for testing.
Ted Kremenek37e96522012-01-26 02:27:38 +00002339 CmdArgs.push_back("-analyzer-checker=security.insecureAPI.UncheckedReturn");
2340 CmdArgs.push_back("-analyzer-checker=security.insecureAPI.getpw");
2341 CmdArgs.push_back("-analyzer-checker=security.insecureAPI.gets");
2342 CmdArgs.push_back("-analyzer-checker=security.insecureAPI.mktemp");
2343 CmdArgs.push_back("-analyzer-checker=security.insecureAPI.mkstemp");
2344 CmdArgs.push_back("-analyzer-checker=security.insecureAPI.vfork");
Daniel Dunbar58f345ce2009-05-22 00:38:15 +00002345 }
Daniel Dunbard067f7f2009-04-08 23:54:23 +00002346
Daniel Dunbar58f345ce2009-05-22 00:38:15 +00002347 // Set the output format. The default is plist, for (lame) historical
2348 // reasons.
2349 CmdArgs.push_back("-analyzer-output");
2350 if (Arg *A = Args.getLastArg(options::OPT__analyzer_output))
Richard Smithbd55daf2012-11-01 04:30:05 +00002351 CmdArgs.push_back(A->getValue());
Daniel Dunbar58f345ce2009-05-22 00:38:15 +00002352 else
2353 CmdArgs.push_back("plist");
Daniel Dunbara2aedc62009-03-18 10:01:51 +00002354
Ted Kremenekfe449a22010-03-22 22:32:05 +00002355 // Disable the presentation of standard compiler warnings when
2356 // using --analyze. We only want to show static analyzer diagnostics
2357 // or frontend errors.
2358 CmdArgs.push_back("-w");
2359
Daniel Dunbara2aedc62009-03-18 10:01:51 +00002360 // Add -Xanalyzer arguments when running as analyzer.
2361 Args.AddAllArgValues(CmdArgs, options::OPT_Xanalyzer);
Mike Stump11289f42009-09-09 15:08:12 +00002362 }
2363
Daniel Dunbar4eadb602009-09-10 01:21:12 +00002364 CheckCodeGenerationOptions(D, Args);
2365
Peter Collingbourne54d770c2013-04-09 04:35:11 +00002366 bool PIE = getToolChain().isPIEDefault();
2367 bool PIC = PIE || getToolChain().isPICDefault();
Chandler Carruth76a943b2012-11-19 03:52:03 +00002368 bool IsPICLevelTwo = PIC;
Peter Collingbourne54d770c2013-04-09 04:35:11 +00002369
Alexey Bataev40e75222014-01-28 06:30:35 +00002370 // Android-specific defaults for PIC/PIE
2371 if (getToolChain().getTriple().getEnvironment() == llvm::Triple::Android) {
2372 switch (getToolChain().getTriple().getArch()) {
2373 case llvm::Triple::arm:
Christian Pirkerf01cd6f2014-03-28 14:40:46 +00002374 case llvm::Triple::armeb:
Alexey Bataev40e75222014-01-28 06:30:35 +00002375 case llvm::Triple::thumb:
Christian Pirkerf01cd6f2014-03-28 14:40:46 +00002376 case llvm::Triple::thumbeb:
Alexey Bataev40e75222014-01-28 06:30:35 +00002377 case llvm::Triple::mips:
2378 case llvm::Triple::mipsel:
2379 case llvm::Triple::mips64:
2380 case llvm::Triple::mips64el:
2381 PIC = true; // "-fpic"
2382 break;
2383
2384 case llvm::Triple::x86:
2385 case llvm::Triple::x86_64:
2386 PIC = true; // "-fPIC"
2387 IsPICLevelTwo = true;
2388 break;
2389
2390 default:
2391 break;
2392 }
2393 }
2394
Alexey Samsonov090301e2013-04-09 12:28:19 +00002395 // For the PIC and PIE flag options, this logic is different from the
2396 // legacy logic in very old versions of GCC, as that logic was just
2397 // a bug no one had ever fixed. This logic is both more rational and
2398 // consistent with GCC's new logic now that the bugs are fixed. The last
2399 // argument relating to either PIC or PIE wins, and no other argument is
2400 // used. If the last argument is any flavor of the '-fno-...' arguments,
2401 // both PIC and PIE are disabled. Any PIE option implicitly enables PIC
2402 // at the same level.
2403 Arg *LastPICArg =Args.getLastArg(options::OPT_fPIC, options::OPT_fno_PIC,
2404 options::OPT_fpic, options::OPT_fno_pic,
2405 options::OPT_fPIE, options::OPT_fno_PIE,
2406 options::OPT_fpie, options::OPT_fno_pie);
Chandler Carruth76a943b2012-11-19 03:52:03 +00002407 // Check whether the tool chain trumps the PIC-ness decision. If the PIC-ness
2408 // is forced, then neither PIC nor PIE flags will have no effect.
Peter Collingbourne54d770c2013-04-09 04:35:11 +00002409 if (!getToolChain().isPICDefaultForced()) {
Alexey Samsonov090301e2013-04-09 12:28:19 +00002410 if (LastPICArg) {
2411 Option O = LastPICArg->getOption();
Peter Collingbourne54d770c2013-04-09 04:35:11 +00002412 if (O.matches(options::OPT_fPIC) || O.matches(options::OPT_fpic) ||
2413 O.matches(options::OPT_fPIE) || O.matches(options::OPT_fpie)) {
2414 PIE = O.matches(options::OPT_fPIE) || O.matches(options::OPT_fpie);
2415 PIC = PIE || O.matches(options::OPT_fPIC) ||
2416 O.matches(options::OPT_fpic);
2417 IsPICLevelTwo = O.matches(options::OPT_fPIE) ||
2418 O.matches(options::OPT_fPIC);
2419 } else {
2420 PIE = PIC = false;
2421 }
2422 }
Chandler Carruthc0c04552012-04-08 16:40:35 +00002423 }
Chandler Carruth76a943b2012-11-19 03:52:03 +00002424
Nick Lewycky609dd662013-10-11 03:33:53 +00002425 // Introduce a Darwin-specific hack. If the default is PIC but the flags
Chandler Carruth76a943b2012-11-19 03:52:03 +00002426 // specified while enabling PIC enabled level 1 PIC, just force it back to
2427 // level 2 PIC instead. This matches the behavior of Darwin GCC (based on my
2428 // informal testing).
2429 if (PIC && getToolChain().getTriple().isOSDarwin())
2430 IsPICLevelTwo |= getToolChain().isPICDefault();
2431
Chandler Carruthc0c04552012-04-08 16:40:35 +00002432 // Note that these flags are trump-cards. Regardless of the order w.r.t. the
2433 // PIC or PIE options above, if these show up, PIC is disabled.
Daniel Dunbarbd847cc2012-10-15 22:23:53 +00002434 llvm::Triple Triple(TripleStr);
Tim Northovera2ee4332014-03-29 15:09:45 +00002435 if (KernelOrKext && (!Triple.isiOS() || Triple.isOSVersionLT(6) ||
2436 Triple.getArch() == llvm::Triple::arm64))
Chandler Carruth76a943b2012-11-19 03:52:03 +00002437 PIC = PIE = false;
Simon Atanasyaneeb6f272013-10-04 11:46:54 +00002438 if (Args.hasArg(options::OPT_static))
Chandler Carruth76a943b2012-11-19 03:52:03 +00002439 PIC = PIE = false;
Chandler Carruthc0c04552012-04-08 16:40:35 +00002440
Chandler Carruth76a943b2012-11-19 03:52:03 +00002441 if (Arg *A = Args.getLastArg(options::OPT_mdynamic_no_pic)) {
2442 // This is a very special mode. It trumps the other modes, almost no one
2443 // uses it, and it isn't even valid on any OS but Darwin.
2444 if (!getToolChain().getTriple().isOSDarwin())
2445 D.Diag(diag::err_drv_unsupported_opt_for_target)
2446 << A->getSpelling() << getToolChain().getTriple().str();
2447
2448 // FIXME: Warn when this flag trumps some other PIC or PIE flag.
2449
Daniel Dunbara1b02a22009-11-29 07:18:39 +00002450 CmdArgs.push_back("-mrelocation-model");
Chandler Carruth76a943b2012-11-19 03:52:03 +00002451 CmdArgs.push_back("dynamic-no-pic");
Daniel Dunbar44e71222009-04-29 18:32:25 +00002452
Chandler Carruth76a943b2012-11-19 03:52:03 +00002453 // Only a forced PIC mode can cause the actual compile to have PIC defines
2454 // etc., no flags are sufficient. This behavior was selected to closely
2455 // match that of llvm-gcc and Apple GCC before that.
2456 if (getToolChain().isPICDefault() && getToolChain().isPICDefaultForced()) {
2457 CmdArgs.push_back("-pic-level");
2458 CmdArgs.push_back("2");
2459 }
2460 } else {
2461 // Currently, LLVM only knows about PIC vs. static; the PIE differences are
2462 // handled in Clang's IRGen by the -pie-level flag.
2463 CmdArgs.push_back("-mrelocation-model");
2464 CmdArgs.push_back(PIC ? "pic" : "static");
2465
2466 if (PIC) {
2467 CmdArgs.push_back("-pic-level");
2468 CmdArgs.push_back(IsPICLevelTwo ? "2" : "1");
2469 if (PIE) {
2470 CmdArgs.push_back("-pie-level");
2471 CmdArgs.push_back(IsPICLevelTwo ? "2" : "1");
2472 }
2473 }
Daniel Dunbar44e71222009-04-29 18:32:25 +00002474 }
Chandler Carruthc0c04552012-04-08 16:40:35 +00002475
Tanya Lattnerf9d41df2009-11-04 01:18:09 +00002476 if (!Args.hasFlag(options::OPT_fmerge_all_constants,
2477 options::OPT_fno_merge_all_constants))
Chris Lattner9242b332011-04-08 18:06:54 +00002478 CmdArgs.push_back("-fno-merge-all-constants");
Daniel Dunbar306945d2009-09-16 06:17:29 +00002479
Daniel Dunbara1b02a22009-11-29 07:18:39 +00002480 // LLVM Code Generator Options.
2481
Daniel Dunbar0bb03312011-02-09 17:54:19 +00002482 if (Arg *A = Args.getLastArg(options::OPT_mregparm_EQ)) {
2483 CmdArgs.push_back("-mregparm");
Richard Smithbd55daf2012-11-01 04:30:05 +00002484 CmdArgs.push_back(A->getValue());
Daniel Dunbar0bb03312011-02-09 17:54:19 +00002485 }
2486
Nick Lewyckyd3f3e4f2013-06-25 01:49:44 +00002487 if (Arg *A = Args.getLastArg(options::OPT_fpcc_struct_return,
2488 options::OPT_freg_struct_return)) {
Eli Benderskyd4a6aec2013-07-24 22:20:49 +00002489 if (getToolChain().getArch() != llvm::Triple::x86) {
John McCall1fe2a8c2013-06-18 02:46:29 +00002490 D.Diag(diag::err_drv_unsupported_opt_for_target)
2491 << A->getSpelling() << getToolChain().getTriple().str();
2492 } else if (A->getOption().matches(options::OPT_fpcc_struct_return)) {
2493 CmdArgs.push_back("-fpcc-struct-return");
2494 } else {
2495 assert(A->getOption().matches(options::OPT_freg_struct_return));
2496 CmdArgs.push_back("-freg-struct-return");
2497 }
2498 }
2499
Roman Divacky65b88cd2011-03-01 17:40:53 +00002500 if (Args.hasFlag(options::OPT_mrtd, options::OPT_mno_rtd, false))
2501 CmdArgs.push_back("-mrtd");
2502
Rafael Espindola224dd632011-12-14 21:02:23 +00002503 if (shouldUseFramePointer(Args, getToolChain().getTriple()))
Daniel Dunbara1b02a22009-11-29 07:18:39 +00002504 CmdArgs.push_back("-mdisable-fp-elim");
2505 if (!Args.hasFlag(options::OPT_fzero_initialized_in_bss,
2506 options::OPT_fno_zero_initialized_in_bss))
2507 CmdArgs.push_back("-mno-zero-initialized-in-bss");
Chad Rosierb71f6aa2013-04-24 18:09:54 +00002508
2509 bool OFastEnabled = isOptimizationLevelFast(Args);
2510 // If -Ofast is the optimization level, then -fstrict-aliasing should be
2511 // enabled. This alias option is being used to simplify the hasFlag logic.
2512 OptSpecifier StrictAliasingAliasOption = OFastEnabled ? options::OPT_Ofast :
2513 options::OPT_fstrict_aliasing;
Reid Kleckner2a24e3a2014-04-09 20:07:39 +00002514 // We turn strict aliasing off by default if we're in CL mode, since MSVC
2515 // doesn't do any TBAA.
2516 bool TBAAOnByDefault = !getToolChain().getDriver().IsCLMode();
Chad Rosierb71f6aa2013-04-24 18:09:54 +00002517 if (!Args.hasFlag(options::OPT_fstrict_aliasing, StrictAliasingAliasOption,
Reid Kleckner2a24e3a2014-04-09 20:07:39 +00002518 options::OPT_fno_strict_aliasing, TBAAOnByDefault))
Dan Gohman10169b92010-10-14 22:36:56 +00002519 CmdArgs.push_back("-relaxed-aliasing");
Manman Renf5d9d342013-10-11 20:48:38 +00002520 if (!Args.hasFlag(options::OPT_fstruct_path_tbaa,
2521 options::OPT_fno_struct_path_tbaa))
2522 CmdArgs.push_back("-no-struct-path-tbaa");
Chandler Carruth8b4140d2012-03-27 23:58:37 +00002523 if (Args.hasFlag(options::OPT_fstrict_enums, options::OPT_fno_strict_enums,
2524 false))
2525 CmdArgs.push_back("-fstrict-enums");
Nick Lewycky1c8c4362012-01-23 08:29:12 +00002526 if (!Args.hasFlag(options::OPT_foptimize_sibling_calls,
2527 options::OPT_fno_optimize_sibling_calls))
2528 CmdArgs.push_back("-mdisable-tail-calls");
Daniel Dunbar0d8ca9e2010-05-14 22:00:22 +00002529
Eric Christopher006208c2013-04-04 06:29:47 +00002530 // Handle segmented stacks.
2531 if (Args.hasArg(options::OPT_fsplit_stack))
2532 CmdArgs.push_back("-split-stacks");
Chad Rosierb71f6aa2013-04-24 18:09:54 +00002533
2534 // If -Ofast is the optimization level, then -ffast-math should be enabled.
2535 // This alias option is being used to simplify the getLastArg logic.
2536 OptSpecifier FastMathAliasOption = OFastEnabled ? options::OPT_Ofast :
2537 options::OPT_ffast_math;
Eric Christopher006208c2013-04-04 06:29:47 +00002538
Chandler Carruth306bd2c2012-01-02 14:19:45 +00002539 // Handle various floating point optimization flags, mapping them to the
2540 // appropriate LLVM code generation flags. The pattern for all of these is to
2541 // default off the codegen optimizations, and if any flag enables them and no
2542 // flag disables them after the flag enabling them, enable the codegen
2543 // optimization. This is complicated by several "umbrella" flags.
Chad Rosierb71f6aa2013-04-24 18:09:54 +00002544 if (Arg *A = Args.getLastArg(options::OPT_ffast_math, FastMathAliasOption,
Chad Rosierc30eb1c2012-09-25 22:03:25 +00002545 options::OPT_fno_fast_math,
Chandler Carruth306bd2c2012-01-02 14:19:45 +00002546 options::OPT_ffinite_math_only,
2547 options::OPT_fno_finite_math_only,
2548 options::OPT_fhonor_infinities,
2549 options::OPT_fno_honor_infinities))
Chad Rosierc30eb1c2012-09-25 22:03:25 +00002550 if (A->getOption().getID() != options::OPT_fno_fast_math &&
2551 A->getOption().getID() != options::OPT_fno_finite_math_only &&
Chandler Carruth306bd2c2012-01-02 14:19:45 +00002552 A->getOption().getID() != options::OPT_fhonor_infinities)
2553 CmdArgs.push_back("-menable-no-infs");
Chad Rosierb71f6aa2013-04-24 18:09:54 +00002554 if (Arg *A = Args.getLastArg(options::OPT_ffast_math, FastMathAliasOption,
Chad Rosierc30eb1c2012-09-25 22:03:25 +00002555 options::OPT_fno_fast_math,
Chandler Carruth306bd2c2012-01-02 14:19:45 +00002556 options::OPT_ffinite_math_only,
2557 options::OPT_fno_finite_math_only,
2558 options::OPT_fhonor_nans,
2559 options::OPT_fno_honor_nans))
Chad Rosierc30eb1c2012-09-25 22:03:25 +00002560 if (A->getOption().getID() != options::OPT_fno_fast_math &&
2561 A->getOption().getID() != options::OPT_fno_finite_math_only &&
Chandler Carruth306bd2c2012-01-02 14:19:45 +00002562 A->getOption().getID() != options::OPT_fhonor_nans)
2563 CmdArgs.push_back("-menable-no-nans");
2564
Benjamin Kramerc242ef22012-05-02 14:55:48 +00002565 // -fmath-errno is the default on some platforms, e.g. BSD-derived OSes.
2566 bool MathErrno = getToolChain().IsMathErrnoDefault();
Chad Rosierb71f6aa2013-04-24 18:09:54 +00002567 if (Arg *A = Args.getLastArg(options::OPT_ffast_math, FastMathAliasOption,
Chad Rosierc30eb1c2012-09-25 22:03:25 +00002568 options::OPT_fno_fast_math,
Chandler Carruth306bd2c2012-01-02 14:19:45 +00002569 options::OPT_fmath_errno,
Chandler Carruth0d4b9e62013-05-18 20:47:36 +00002570 options::OPT_fno_math_errno)) {
2571 // Turning on -ffast_math (with either flag) removes the need for MathErrno.
2572 // However, turning *off* -ffast_math merely restores the toolchain default
2573 // (which may be false).
2574 if (A->getOption().getID() == options::OPT_fno_math_errno ||
2575 A->getOption().getID() == options::OPT_ffast_math ||
2576 A->getOption().getID() == options::OPT_Ofast)
2577 MathErrno = false;
2578 else if (A->getOption().getID() == options::OPT_fmath_errno)
2579 MathErrno = true;
2580 }
Chandler Carruth3634c662012-04-26 02:10:51 +00002581 if (MathErrno)
2582 CmdArgs.push_back("-fmath-errno");
Chandler Carruth306bd2c2012-01-02 14:19:45 +00002583
2584 // There are several flags which require disabling very specific
2585 // optimizations. Any of these being disabled forces us to turn off the
2586 // entire set of LLVM optimizations, so collect them through all the flag
2587 // madness.
2588 bool AssociativeMath = false;
Chad Rosierb71f6aa2013-04-24 18:09:54 +00002589 if (Arg *A = Args.getLastArg(options::OPT_ffast_math, FastMathAliasOption,
Chad Rosierc30eb1c2012-09-25 22:03:25 +00002590 options::OPT_fno_fast_math,
Chandler Carruth306bd2c2012-01-02 14:19:45 +00002591 options::OPT_funsafe_math_optimizations,
2592 options::OPT_fno_unsafe_math_optimizations,
2593 options::OPT_fassociative_math,
2594 options::OPT_fno_associative_math))
Chad Rosierc30eb1c2012-09-25 22:03:25 +00002595 if (A->getOption().getID() != options::OPT_fno_fast_math &&
2596 A->getOption().getID() != options::OPT_fno_unsafe_math_optimizations &&
Chandler Carruth306bd2c2012-01-02 14:19:45 +00002597 A->getOption().getID() != options::OPT_fno_associative_math)
2598 AssociativeMath = true;
2599 bool ReciprocalMath = false;
Chad Rosierb71f6aa2013-04-24 18:09:54 +00002600 if (Arg *A = Args.getLastArg(options::OPT_ffast_math, FastMathAliasOption,
Chad Rosierc30eb1c2012-09-25 22:03:25 +00002601 options::OPT_fno_fast_math,
Chandler Carruth306bd2c2012-01-02 14:19:45 +00002602 options::OPT_funsafe_math_optimizations,
2603 options::OPT_fno_unsafe_math_optimizations,
2604 options::OPT_freciprocal_math,
2605 options::OPT_fno_reciprocal_math))
Chad Rosierc30eb1c2012-09-25 22:03:25 +00002606 if (A->getOption().getID() != options::OPT_fno_fast_math &&
2607 A->getOption().getID() != options::OPT_fno_unsafe_math_optimizations &&
Chandler Carruth306bd2c2012-01-02 14:19:45 +00002608 A->getOption().getID() != options::OPT_fno_reciprocal_math)
2609 ReciprocalMath = true;
2610 bool SignedZeros = true;
Chad Rosierb71f6aa2013-04-24 18:09:54 +00002611 if (Arg *A = Args.getLastArg(options::OPT_ffast_math, FastMathAliasOption,
Chad Rosierc30eb1c2012-09-25 22:03:25 +00002612 options::OPT_fno_fast_math,
Chandler Carruth306bd2c2012-01-02 14:19:45 +00002613 options::OPT_funsafe_math_optimizations,
2614 options::OPT_fno_unsafe_math_optimizations,
2615 options::OPT_fsigned_zeros,
2616 options::OPT_fno_signed_zeros))
Chad Rosierc30eb1c2012-09-25 22:03:25 +00002617 if (A->getOption().getID() != options::OPT_fno_fast_math &&
2618 A->getOption().getID() != options::OPT_fno_unsafe_math_optimizations &&
Chandler Carruth306bd2c2012-01-02 14:19:45 +00002619 A->getOption().getID() != options::OPT_fsigned_zeros)
2620 SignedZeros = false;
2621 bool TrappingMath = true;
Chad Rosierb71f6aa2013-04-24 18:09:54 +00002622 if (Arg *A = Args.getLastArg(options::OPT_ffast_math, FastMathAliasOption,
Chad Rosierc30eb1c2012-09-25 22:03:25 +00002623 options::OPT_fno_fast_math,
Chandler Carruth306bd2c2012-01-02 14:19:45 +00002624 options::OPT_funsafe_math_optimizations,
2625 options::OPT_fno_unsafe_math_optimizations,
2626 options::OPT_ftrapping_math,
2627 options::OPT_fno_trapping_math))
Chad Rosierc30eb1c2012-09-25 22:03:25 +00002628 if (A->getOption().getID() != options::OPT_fno_fast_math &&
2629 A->getOption().getID() != options::OPT_fno_unsafe_math_optimizations &&
Chandler Carruth306bd2c2012-01-02 14:19:45 +00002630 A->getOption().getID() != options::OPT_ftrapping_math)
2631 TrappingMath = false;
2632 if (!MathErrno && AssociativeMath && ReciprocalMath && !SignedZeros &&
2633 !TrappingMath)
2634 CmdArgs.push_back("-menable-unsafe-fp-math");
2635
Lang Hamesaa53b932012-07-06 00:59:19 +00002636
2637 // Validate and pass through -fp-contract option.
Chad Rosierb71f6aa2013-04-24 18:09:54 +00002638 if (Arg *A = Args.getLastArg(options::OPT_ffast_math, FastMathAliasOption,
Chad Rosierc30eb1c2012-09-25 22:03:25 +00002639 options::OPT_fno_fast_math,
Lang Hamesaa53b932012-07-06 00:59:19 +00002640 options::OPT_ffp_contract)) {
2641 if (A->getOption().getID() == options::OPT_ffp_contract) {
Richard Smithbd55daf2012-11-01 04:30:05 +00002642 StringRef Val = A->getValue();
Lang Hamesaa53b932012-07-06 00:59:19 +00002643 if (Val == "fast" || Val == "on" || Val == "off") {
2644 CmdArgs.push_back(Args.MakeArgString("-ffp-contract=" + Val));
2645 } else {
2646 D.Diag(diag::err_drv_unsupported_option_argument)
2647 << A->getOption().getName() << Val;
2648 }
Chad Rosierb71f6aa2013-04-24 18:09:54 +00002649 } else if (A->getOption().matches(options::OPT_ffast_math) ||
2650 (OFastEnabled && A->getOption().matches(options::OPT_Ofast))) {
Lang Hamesaa53b932012-07-06 00:59:19 +00002651 // If fast-math is set then set the fp-contract mode to fast.
2652 CmdArgs.push_back(Args.MakeArgString("-ffp-contract=fast"));
2653 }
2654 }
2655
Bob Wilson6a039162012-07-19 03:52:53 +00002656 // We separately look for the '-ffast-math' and '-ffinite-math-only' flags,
2657 // and if we find them, tell the frontend to provide the appropriate
2658 // preprocessor macros. This is distinct from enabling any optimizations as
2659 // these options induce language changes which must survive serialization
2660 // and deserialization, etc.
Chad Rosierb71f6aa2013-04-24 18:09:54 +00002661 if (Arg *A = Args.getLastArg(options::OPT_ffast_math, FastMathAliasOption,
2662 options::OPT_fno_fast_math))
2663 if (!A->getOption().matches(options::OPT_fno_fast_math))
2664 CmdArgs.push_back("-ffast-math");
Chad Rosierc30eb1c2012-09-25 22:03:25 +00002665 if (Arg *A = Args.getLastArg(options::OPT_ffinite_math_only, options::OPT_fno_fast_math))
2666 if (A->getOption().matches(options::OPT_ffinite_math_only))
2667 CmdArgs.push_back("-ffinite-math-only");
Chandler Carruth306bd2c2012-01-02 14:19:45 +00002668
Daniel Dunbar0d8ca9e2010-05-14 22:00:22 +00002669 // Decide whether to use verbose asm. Verbose assembly is the default on
2670 // toolchains which have the integrated assembler on by default.
Saleem Abdulrasool42e4b592014-02-22 23:37:58 +00002671 bool IsIntegratedAssemblerDefault =
2672 getToolChain().IsIntegratedAssemblerDefault();
Daniel Dunbar0d8ca9e2010-05-14 22:00:22 +00002673 if (Args.hasFlag(options::OPT_fverbose_asm, options::OPT_fno_verbose_asm,
Saleem Abdulrasool42e4b592014-02-22 23:37:58 +00002674 IsIntegratedAssemblerDefault) ||
Daniel Dunbar0d8ca9e2010-05-14 22:00:22 +00002675 Args.hasArg(options::OPT_dA))
Daniel Dunbara1b02a22009-11-29 07:18:39 +00002676 CmdArgs.push_back("-masm-verbose");
Daniel Dunbar0d8ca9e2010-05-14 22:00:22 +00002677
Saleem Abdulrasoolcfeb90d2014-02-23 00:40:30 +00002678 if (!Args.hasFlag(options::OPT_fintegrated_as, options::OPT_fno_integrated_as,
Saleem Abdulrasool42e4b592014-02-22 23:37:58 +00002679 IsIntegratedAssemblerDefault))
2680 CmdArgs.push_back("-no-integrated-as");
2681
Daniel Dunbara1b02a22009-11-29 07:18:39 +00002682 if (Args.hasArg(options::OPT_fdebug_pass_structure)) {
2683 CmdArgs.push_back("-mdebug-pass");
2684 CmdArgs.push_back("Structure");
2685 }
2686 if (Args.hasArg(options::OPT_fdebug_pass_arguments)) {
2687 CmdArgs.push_back("-mdebug-pass");
2688 CmdArgs.push_back("Arguments");
2689 }
2690
John McCall8517abc2010-02-19 02:45:38 +00002691 // Enable -mconstructor-aliases except on darwin, where we have to
2692 // work around a linker bug; see <rdar://problem/7651567>.
Bob Wilson6524dd32011-10-14 05:03:44 +00002693 if (!getToolChain().getTriple().isOSDarwin())
John McCall8517abc2010-02-19 02:45:38 +00002694 CmdArgs.push_back("-mconstructor-aliases");
NAKAMURA Takumi029d74b2011-02-17 08:50:50 +00002695
John McCall7ef5cb32011-03-18 02:56:14 +00002696 // Darwin's kernel doesn't support guard variables; just die if we
2697 // try to use them.
Bob Wilson6524dd32011-10-14 05:03:44 +00002698 if (KernelOrKext && getToolChain().getTriple().isOSDarwin())
John McCall7ef5cb32011-03-18 02:56:14 +00002699 CmdArgs.push_back("-fforbid-guard-variables");
2700
Douglas Gregordbe39272011-02-01 15:15:22 +00002701 if (Args.hasArg(options::OPT_mms_bitfields)) {
2702 CmdArgs.push_back("-mms-bitfields");
2703 }
John McCall8517abc2010-02-19 02:45:38 +00002704
Daniel Dunbar306945d2009-09-16 06:17:29 +00002705 // This is a coarse approximation of what llvm-gcc actually does, both
2706 // -fasynchronous-unwind-tables and -fnon-call-exceptions interact in more
2707 // complicated ways.
2708 bool AsynchronousUnwindTables =
Evgeniy Stepanov7429c592014-02-14 08:56:25 +00002709 Args.hasFlag(options::OPT_fasynchronous_unwind_tables,
2710 options::OPT_fno_asynchronous_unwind_tables,
2711 (getToolChain().IsUnwindTablesDefault() ||
2712 getToolChain().getSanitizerArgs().needsUnwindTables()) &&
2713 !KernelOrKext);
Daniel Dunbar306945d2009-09-16 06:17:29 +00002714 if (Args.hasFlag(options::OPT_funwind_tables, options::OPT_fno_unwind_tables,
2715 AsynchronousUnwindTables))
Daniel Dunbara1b02a22009-11-29 07:18:39 +00002716 CmdArgs.push_back("-munwind-tables");
2717
Chandler Carruth05fb5852012-11-21 23:40:23 +00002718 getToolChain().addClangTargetOptions(Args, CmdArgs);
Rafael Espindola66aa0452012-06-19 01:26:10 +00002719
Daniel Dunbara1b02a22009-11-29 07:18:39 +00002720 if (Arg *A = Args.getLastArg(options::OPT_flimited_precision_EQ)) {
2721 CmdArgs.push_back("-mlimit-float-precision");
Richard Smithbd55daf2012-11-01 04:30:05 +00002722 CmdArgs.push_back(A->getValue());
Daniel Dunbara1b02a22009-11-29 07:18:39 +00002723 }
Daniel Dunbar44e71222009-04-29 18:32:25 +00002724
Daniel Dunbar4dbaaa62009-05-06 03:16:41 +00002725 // FIXME: Handle -mtune=.
2726 (void) Args.hasArg(options::OPT_mtune_EQ);
Daniel Dunbar44e71222009-04-29 18:32:25 +00002727
Benjamin Kramercf4371a2009-08-05 14:30:52 +00002728 if (Arg *A = Args.getLastArg(options::OPT_mcmodel_EQ)) {
Daniel Dunbara1b02a22009-11-29 07:18:39 +00002729 CmdArgs.push_back("-mcode-model");
Richard Smithbd55daf2012-11-01 04:30:05 +00002730 CmdArgs.push_back(A->getValue());
Benjamin Kramercf4371a2009-08-05 14:30:52 +00002731 }
2732
Rafael Espindola22ce34a2013-08-20 22:12:08 +00002733 // Add the target cpu
2734 std::string ETripleStr = getToolChain().ComputeEffectiveClangTriple(Args);
2735 llvm::Triple ETriple(ETripleStr);
2736 std::string CPU = getCPUName(Args, ETriple);
2737 if (!CPU.empty()) {
2738 CmdArgs.push_back("-target-cpu");
2739 CmdArgs.push_back(Args.MakeArgString(CPU));
2740 }
2741
Rafael Espindolaeb265472013-08-21 21:59:03 +00002742 if (const Arg *A = Args.getLastArg(options::OPT_mfpmath_EQ)) {
2743 CmdArgs.push_back("-mfpmath");
2744 CmdArgs.push_back(A->getValue());
2745 }
2746
Rafael Espindola28e1f4b2013-08-21 16:39:20 +00002747 // Add the target features
Rafael Espindola9c6fb0f2013-11-23 14:36:40 +00002748 getTargetFeatures(D, ETriple, Args, CmdArgs, false);
Rafael Espindola28e1f4b2013-08-21 16:39:20 +00002749
Rafael Espindola22ce34a2013-08-20 22:12:08 +00002750 // Add target specific flags.
Eli Benderskyd4a6aec2013-07-24 22:20:49 +00002751 switch(getToolChain().getArch()) {
Daniel Dunbar3b3191f2009-09-09 22:33:08 +00002752 default:
2753 break;
Daniel Dunbar4dbaaa62009-05-06 03:16:41 +00002754
Daniel Dunbar0f5c5422009-09-10 04:57:17 +00002755 case llvm::Triple::arm:
Christian Pirkerf01cd6f2014-03-28 14:40:46 +00002756 case llvm::Triple::armeb:
Daniel Dunbar0f5c5422009-09-10 04:57:17 +00002757 case llvm::Triple::thumb:
Christian Pirkerf01cd6f2014-03-28 14:40:46 +00002758 case llvm::Triple::thumbeb:
Daniel Dunbarc9388c12011-03-17 17:10:06 +00002759 AddARMTargetArgs(Args, CmdArgs, KernelOrKext);
Daniel Dunbar0f5c5422009-09-10 04:57:17 +00002760 break;
2761
Tim Northovera2ee4332014-03-29 15:09:45 +00002762 case llvm::Triple::arm64:
2763 AddARM64TargetArgs(Args, CmdArgs);
2764 break;
2765
Eric Christopher0b26a612010-03-02 02:41:08 +00002766 case llvm::Triple::mips:
2767 case llvm::Triple::mipsel:
Akira Hatanaka94ab5542011-09-21 02:13:07 +00002768 case llvm::Triple::mips64:
2769 case llvm::Triple::mips64el:
Eric Christopher0b26a612010-03-02 02:41:08 +00002770 AddMIPSTargetArgs(Args, CmdArgs);
2771 break;
2772
Bruno Cardoso Lopese7f211c2010-11-09 17:21:19 +00002773 case llvm::Triple::sparc:
2774 AddSparcTargetArgs(Args, CmdArgs);
2775 break;
2776
Daniel Dunbar3b3191f2009-09-09 22:33:08 +00002777 case llvm::Triple::x86:
2778 case llvm::Triple::x86_64:
2779 AddX86TargetArgs(Args, CmdArgs);
2780 break;
Tony Linthicum76329bf2011-12-12 21:14:55 +00002781
2782 case llvm::Triple::hexagon:
2783 AddHexagonTargetArgs(Args, CmdArgs);
2784 break;
Daniel Dunbar44e71222009-04-29 18:32:25 +00002785 }
2786
Hans Wennborg75958c42013-08-08 00:17:41 +00002787 // Add clang-cl arguments.
2788 if (getToolChain().getDriver().IsCLMode())
2789 AddClangCLArgs(Args, CmdArgs);
2790
Daniel Dunbar976a2f52010-08-11 23:07:47 +00002791 // Pass the linker version in use.
2792 if (Arg *A = Args.getLastArg(options::OPT_mlinker_version_EQ)) {
2793 CmdArgs.push_back("-target-linker-version");
Richard Smithbd55daf2012-11-01 04:30:05 +00002794 CmdArgs.push_back(A->getValue());
Daniel Dunbar976a2f52010-08-11 23:07:47 +00002795 }
2796
Eric Christopherb7d97e92013-04-03 01:58:53 +00002797 if (!shouldUseLeafFramePointer(Args, getToolChain().getTriple()))
Daniel Dunbarbb7ac522010-07-01 01:31:45 +00002798 CmdArgs.push_back("-momit-leaf-frame-pointer");
2799
Daniel Dunbarfcc49a82010-05-12 18:19:58 +00002800 // Explicitly error on some things we know we don't support and can't just
2801 // ignore.
2802 types::ID InputType = Inputs[0].getType();
Daniel Dunbar4ed214a2010-09-24 19:39:37 +00002803 if (!Args.hasArg(options::OPT_fallow_unsupported)) {
2804 Arg *Unsupported;
Daniel Dunbar4ed214a2010-09-24 19:39:37 +00002805 if (types::isCXX(InputType) &&
Bob Wilson6524dd32011-10-14 05:03:44 +00002806 getToolChain().getTriple().isOSDarwin() &&
Eli Benderskyd4a6aec2013-07-24 22:20:49 +00002807 getToolChain().getArch() == llvm::Triple::x86) {
Bob Wilson0d45f582011-08-13 23:48:55 +00002808 if ((Unsupported = Args.getLastArg(options::OPT_fapple_kext)) ||
2809 (Unsupported = Args.getLastArg(options::OPT_mkernel)))
Chris Lattner0e62c1c2011-07-23 10:55:15 +00002810 D.Diag(diag::err_drv_clang_unsupported_opt_cxx_darwin_i386)
Daniel Dunbar4ed214a2010-09-24 19:39:37 +00002811 << Unsupported->getOption().getName();
2812 }
Daniel Dunbarfcc49a82010-05-12 18:19:58 +00002813 }
2814
Daniel Dunbara2aedc62009-03-18 10:01:51 +00002815 Args.AddAllArgs(CmdArgs, options::OPT_v);
Daniel Dunbard4352752010-08-24 22:44:13 +00002816 Args.AddLastArg(CmdArgs, options::OPT_H);
Chad Rosierbe10f982011-08-02 17:58:04 +00002817 if (D.CCPrintHeaders && !D.CCGenDiagnostics) {
Daniel Dunbarac540b32011-02-02 21:11:35 +00002818 CmdArgs.push_back("-header-include-file");
2819 CmdArgs.push_back(D.CCPrintHeadersFilename ?
2820 D.CCPrintHeadersFilename : "-");
2821 }
Daniel Dunbara2aedc62009-03-18 10:01:51 +00002822 Args.AddLastArg(CmdArgs, options::OPT_P);
Mike Stump11289f42009-09-09 15:08:12 +00002823 Args.AddLastArg(CmdArgs, options::OPT_print_ivar_layout);
Daniel Dunbara2aedc62009-03-18 10:01:51 +00002824
Chad Rosierbe10f982011-08-02 17:58:04 +00002825 if (D.CCLogDiagnostics && !D.CCGenDiagnostics) {
Daniel Dunbar529c03b2011-04-07 18:01:20 +00002826 CmdArgs.push_back("-diagnostic-log-file");
2827 CmdArgs.push_back(D.CCLogDiagnosticsFilename ?
2828 D.CCLogDiagnosticsFilename : "-");
2829 }
2830
Manman Ren17bdb0f2013-11-20 20:22:14 +00002831 // Use the last option from "-g" group. "-gline-tables-only" and "-gdwarf-x"
2832 // are preserved, all other debug options are substituted with "-g".
Rafael Espindola08a692a2010-03-07 04:46:18 +00002833 Args.ClaimAllArgs(options::OPT_g_Group);
Alexey Samsonovdda3a7f2012-05-29 08:10:34 +00002834 if (Arg *A = Args.getLastArg(options::OPT_g_Group)) {
David Blaikief5961452014-03-25 20:42:27 +00002835 if (A->getOption().matches(options::OPT_gline_tables_only)) {
Manman Ren17bdb0f2013-11-20 20:22:14 +00002836 // FIXME: we should support specifying dwarf version with
2837 // -gline-tables-only.
Alexey Samsonovdda3a7f2012-05-29 08:10:34 +00002838 CmdArgs.push_back("-gline-tables-only");
Adrian Prantl549c5142014-02-17 17:40:52 +00002839 // Default is dwarf-2 for darwin.
2840 if (getToolChain().getTriple().isOSDarwin())
2841 CmdArgs.push_back("-gdwarf-2");
Manman Ren17bdb0f2013-11-20 20:22:14 +00002842 } else if (A->getOption().matches(options::OPT_gdwarf_2))
Manman Ren9691f7f2013-06-19 01:46:49 +00002843 CmdArgs.push_back("-gdwarf-2");
2844 else if (A->getOption().matches(options::OPT_gdwarf_3))
2845 CmdArgs.push_back("-gdwarf-3");
2846 else if (A->getOption().matches(options::OPT_gdwarf_4))
2847 CmdArgs.push_back("-gdwarf-4");
Eric Christopher2ba5fcb2013-02-05 07:29:57 +00002848 else if (!A->getOption().matches(options::OPT_g0) &&
Adrian Prantl549c5142014-02-17 17:40:52 +00002849 !A->getOption().matches(options::OPT_ggdb0)) {
2850 // Default is dwarf-2 for darwin.
2851 if (getToolChain().getTriple().isOSDarwin())
2852 CmdArgs.push_back("-gdwarf-2");
2853 else
2854 CmdArgs.push_back("-g");
2855 }
Alexey Samsonovdda3a7f2012-05-29 08:10:34 +00002856 }
Daniel Dunbara2aedc62009-03-18 10:01:51 +00002857
Alexey Samsonovf50a9ff2012-06-21 08:22:39 +00002858 // We ignore flags -gstrict-dwarf and -grecord-gcc-switches for now.
2859 Args.ClaimAllArgs(options::OPT_g_flags_Group);
Eric Christophera2f7eb72012-10-18 21:52:18 +00002860 if (Args.hasArg(options::OPT_gcolumn_info))
2861 CmdArgs.push_back("-dwarf-column-info");
Alexey Samsonovf50a9ff2012-06-21 08:22:39 +00002862
Eric Christopher138c32b2013-09-13 22:37:55 +00002863 // FIXME: Move backend command line options to the module.
Eric Christopher2ba5fcb2013-02-05 07:29:57 +00002864 // -gsplit-dwarf should turn on -g and enable the backend dwarf
2865 // splitting and extraction.
Eric Christopherd42fb732013-02-21 22:35:05 +00002866 // FIXME: Currently only works on Linux.
Cameron Esfahani556d91e2013-09-14 01:09:11 +00002867 if (getToolChain().getTriple().isOSLinux() &&
Eric Christopherd42fb732013-02-21 22:35:05 +00002868 Args.hasArg(options::OPT_gsplit_dwarf)) {
Eric Christopher2ba5fcb2013-02-05 07:29:57 +00002869 CmdArgs.push_back("-g");
2870 CmdArgs.push_back("-backend-option");
2871 CmdArgs.push_back("-split-dwarf=Enable");
2872 }
2873
Eric Christopher138c32b2013-09-13 22:37:55 +00002874 // -ggnu-pubnames turns on gnu style pubnames in the backend.
2875 if (Args.hasArg(options::OPT_ggnu_pubnames)) {
2876 CmdArgs.push_back("-backend-option");
2877 CmdArgs.push_back("-generate-gnu-dwarf-pub-sections");
2878 }
Eric Christophereec89c22013-06-18 00:03:50 +00002879
Eric Christopher0d403d22014-02-14 01:27:03 +00002880 // -gdwarf-aranges turns on the emission of the aranges section in the
2881 // backend.
2882 if (Args.hasArg(options::OPT_gdwarf_aranges)) {
2883 CmdArgs.push_back("-backend-option");
2884 CmdArgs.push_back("-generate-arange-section");
2885 }
2886
David Blaikief36d9ba2014-01-27 18:52:43 +00002887 if (Args.hasFlag(options::OPT_fdebug_types_section,
2888 options::OPT_fno_debug_types_section, false)) {
David Blaikied74be702014-01-18 02:02:06 +00002889 CmdArgs.push_back("-backend-option");
2890 CmdArgs.push_back("-generate-type-units");
2891 }
Eric Christophereec89c22013-06-18 00:03:50 +00002892
Evgeniy Stepanov9e7cb332014-02-03 11:11:37 +00002893 if (Args.hasFlag(options::OPT_ffunction_sections,
2894 options::OPT_fno_function_sections, false)) {
2895 CmdArgs.push_back("-ffunction-sections");
2896 }
2897
2898 if (Args.hasFlag(options::OPT_fdata_sections,
2899 options::OPT_fno_data_sections, false)) {
2900 CmdArgs.push_back("-fdata-sections");
2901 }
Rafael Espindola66bfb2752010-05-06 21:06:04 +00002902
Chris Lattner3c77a352010-06-22 00:03:40 +00002903 Args.AddAllArgs(CmdArgs, options::OPT_finstrument_functions);
2904
Justin Bogner6a9d2cf2014-01-06 22:27:36 +00002905 if (Args.hasArg(options::OPT_fprofile_instr_generate) &&
2906 (Args.hasArg(options::OPT_fprofile_instr_use) ||
2907 Args.hasArg(options::OPT_fprofile_instr_use_EQ)))
2908 D.Diag(diag::err_drv_argument_not_allowed_with)
2909 << "-fprofile-instr-generate" << "-fprofile-instr-use";
2910
2911 Args.AddAllArgs(CmdArgs, options::OPT_fprofile_instr_generate);
2912
2913 if (Arg *A = Args.getLastArg(options::OPT_fprofile_instr_use_EQ))
2914 A->render(Args, CmdArgs);
2915 else if (Args.hasArg(options::OPT_fprofile_instr_use))
2916 CmdArgs.push_back("-fprofile-instr-use=pgo-data");
2917
Nick Lewycky207bce32011-04-21 23:44:07 +00002918 if (Args.hasArg(options::OPT_ftest_coverage) ||
2919 Args.hasArg(options::OPT_coverage))
2920 CmdArgs.push_back("-femit-coverage-notes");
2921 if (Args.hasArg(options::OPT_fprofile_arcs) ||
2922 Args.hasArg(options::OPT_coverage))
2923 CmdArgs.push_back("-femit-coverage-data");
2924
Nick Lewycky480cb992011-05-04 20:46:58 +00002925 if (C.getArgs().hasArg(options::OPT_c) ||
2926 C.getArgs().hasArg(options::OPT_S)) {
2927 if (Output.isFilename()) {
Nick Lewycky85c011d2011-05-05 00:08:20 +00002928 CmdArgs.push_back("-coverage-file");
Eric Christophere30f61c2013-02-22 00:24:40 +00002929 SmallString<128> CoverageFilename(Output.getFilename());
Nick Lewycky737a4522013-03-07 08:28:53 +00002930 if (llvm::sys::path::is_relative(CoverageFilename.str())) {
Rafael Espindolac7367ff2013-08-10 01:40:10 +00002931 SmallString<128> Pwd;
2932 if (!llvm::sys::fs::current_path(Pwd)) {
2933 llvm::sys::path::append(Pwd, CoverageFilename.str());
2934 CoverageFilename.swap(Pwd);
Nick Lewycky737a4522013-03-07 08:28:53 +00002935 }
2936 }
Eric Christophere30f61c2013-02-22 00:24:40 +00002937 CmdArgs.push_back(Args.MakeArgString(CoverageFilename));
Nick Lewycky480cb992011-05-04 20:46:58 +00002938 }
2939 }
2940
Daniel Dunbarb25bfde2011-10-11 18:20:10 +00002941 // Pass options for controlling the default header search paths.
2942 if (Args.hasArg(options::OPT_nostdinc)) {
2943 CmdArgs.push_back("-nostdsysteminc");
2944 CmdArgs.push_back("-nobuiltininc");
2945 } else {
Daniel Dunbar0f41eee2011-10-11 18:20:16 +00002946 if (Args.hasArg(options::OPT_nostdlibinc))
2947 CmdArgs.push_back("-nostdsysteminc");
Daniel Dunbarb25bfde2011-10-11 18:20:10 +00002948 Args.AddLastArg(CmdArgs, options::OPT_nostdincxx);
2949 Args.AddLastArg(CmdArgs, options::OPT_nobuiltininc);
2950 }
Daniel Dunbara2aedc62009-03-18 10:01:51 +00002951
Daniel Dunbar34e0b8c2009-12-15 01:02:52 +00002952 // Pass the path to compiler resource files.
Daniel Dunbar34e0b8c2009-12-15 01:02:52 +00002953 CmdArgs.push_back("-resource-dir");
Daniel Dunbar3f3e2cd2010-01-20 02:35:16 +00002954 CmdArgs.push_back(D.ResourceDir.c_str());
Daniel Dunbar9dc82a22009-04-07 21:42:00 +00002955
Argyrios Kyrtzidis71731d62010-11-03 22:45:23 +00002956 Args.AddLastArg(CmdArgs, options::OPT_working_directory);
2957
Ted Kremenekf7639e12012-03-06 20:06:33 +00002958 bool ARCMTEnabled = false;
Argyrios Kyrtzidis85230d52013-09-17 19:14:29 +00002959 if (!Args.hasArg(options::OPT_fno_objc_arc, options::OPT_fobjc_arc)) {
Argyrios Kyrtzidisc44b93d2011-07-07 04:00:39 +00002960 if (const Arg *A = Args.getLastArg(options::OPT_ccc_arcmt_check,
Argyrios Kyrtzidis7fbd97f2011-07-09 20:00:58 +00002961 options::OPT_ccc_arcmt_modify,
2962 options::OPT_ccc_arcmt_migrate)) {
Ted Kremenekf7639e12012-03-06 20:06:33 +00002963 ARCMTEnabled = true;
John McCalld70fb982011-06-15 23:25:17 +00002964 switch (A->getOption().getID()) {
2965 default:
2966 llvm_unreachable("missed a case");
Argyrios Kyrtzidisc44b93d2011-07-07 04:00:39 +00002967 case options::OPT_ccc_arcmt_check:
John McCalld70fb982011-06-15 23:25:17 +00002968 CmdArgs.push_back("-arcmt-check");
2969 break;
Argyrios Kyrtzidisc44b93d2011-07-07 04:00:39 +00002970 case options::OPT_ccc_arcmt_modify:
John McCalld70fb982011-06-15 23:25:17 +00002971 CmdArgs.push_back("-arcmt-modify");
2972 break;
Argyrios Kyrtzidis7fbd97f2011-07-09 20:00:58 +00002973 case options::OPT_ccc_arcmt_migrate:
2974 CmdArgs.push_back("-arcmt-migrate");
Ted Kremenekf7639e12012-03-06 20:06:33 +00002975 CmdArgs.push_back("-mt-migrate-directory");
Richard Smithbd55daf2012-11-01 04:30:05 +00002976 CmdArgs.push_back(A->getValue());
Argyrios Kyrtzidisd5713632011-07-19 17:20:03 +00002977
2978 Args.AddLastArg(CmdArgs, options::OPT_arcmt_migrate_report_output);
2979 Args.AddLastArg(CmdArgs, options::OPT_arcmt_migrate_emit_arc_errors);
Argyrios Kyrtzidis7fbd97f2011-07-09 20:00:58 +00002980 break;
John McCalld70fb982011-06-15 23:25:17 +00002981 }
2982 }
Argyrios Kyrtzidisb11a1922013-06-24 19:01:18 +00002983 } else {
2984 Args.ClaimAllArgs(options::OPT_ccc_arcmt_check);
2985 Args.ClaimAllArgs(options::OPT_ccc_arcmt_modify);
2986 Args.ClaimAllArgs(options::OPT_ccc_arcmt_migrate);
John McCalld70fb982011-06-15 23:25:17 +00002987 }
Eric Christopher84fbdb42011-08-19 00:30:14 +00002988
Ted Kremenekf7639e12012-03-06 20:06:33 +00002989 if (const Arg *A = Args.getLastArg(options::OPT_ccc_objcmt_migrate)) {
2990 if (ARCMTEnabled) {
2991 D.Diag(diag::err_drv_argument_not_allowed_with)
2992 << A->getAsString(Args) << "-ccc-arcmt-migrate";
2993 }
2994 CmdArgs.push_back("-mt-migrate-directory");
Richard Smithbd55daf2012-11-01 04:30:05 +00002995 CmdArgs.push_back(A->getValue());
Ted Kremenekf7639e12012-03-06 20:06:33 +00002996
2997 if (!Args.hasArg(options::OPT_objcmt_migrate_literals,
Fariborz Jahaniand83ef842013-07-09 16:59:14 +00002998 options::OPT_objcmt_migrate_subscripting,
2999 options::OPT_objcmt_migrate_property)) {
Ted Kremenekf7639e12012-03-06 20:06:33 +00003000 // None specified, means enable them all.
3001 CmdArgs.push_back("-objcmt-migrate-literals");
3002 CmdArgs.push_back("-objcmt-migrate-subscripting");
Fariborz Jahaniand83ef842013-07-09 16:59:14 +00003003 CmdArgs.push_back("-objcmt-migrate-property");
Ted Kremenekf7639e12012-03-06 20:06:33 +00003004 } else {
3005 Args.AddLastArg(CmdArgs, options::OPT_objcmt_migrate_literals);
3006 Args.AddLastArg(CmdArgs, options::OPT_objcmt_migrate_subscripting);
Fariborz Jahaniand83ef842013-07-09 16:59:14 +00003007 Args.AddLastArg(CmdArgs, options::OPT_objcmt_migrate_property);
Ted Kremenekf7639e12012-03-06 20:06:33 +00003008 }
Argyrios Kyrtzidis55ecf992013-11-13 23:38:20 +00003009 } else {
3010 Args.AddLastArg(CmdArgs, options::OPT_objcmt_migrate_literals);
3011 Args.AddLastArg(CmdArgs, options::OPT_objcmt_migrate_subscripting);
3012 Args.AddLastArg(CmdArgs, options::OPT_objcmt_migrate_property);
3013 Args.AddLastArg(CmdArgs, options::OPT_objcmt_migrate_all);
3014 Args.AddLastArg(CmdArgs, options::OPT_objcmt_migrate_readonly_property);
3015 Args.AddLastArg(CmdArgs, options::OPT_objcmt_migrate_readwrite_property);
3016 Args.AddLastArg(CmdArgs, options::OPT_objcmt_migrate_annotation);
3017 Args.AddLastArg(CmdArgs, options::OPT_objcmt_migrate_instancetype);
3018 Args.AddLastArg(CmdArgs, options::OPT_objcmt_migrate_nsmacros);
3019 Args.AddLastArg(CmdArgs, options::OPT_objcmt_migrate_protocol_conformance);
3020 Args.AddLastArg(CmdArgs, options::OPT_objcmt_atomic_property);
3021 Args.AddLastArg(CmdArgs, options::OPT_objcmt_returns_innerpointer_property);
3022 Args.AddLastArg(CmdArgs, options::OPT_objcmt_ns_nonatomic_iosonly);
Argyrios Kyrtzidis74aa02562013-12-11 01:29:48 +00003023 Args.AddLastArg(CmdArgs, options::OPT_objcmt_migrate_designated_init);
Argyrios Kyrtzidisd5ba86b2013-12-10 18:36:53 +00003024 Args.AddLastArg(CmdArgs, options::OPT_objcmt_whitelist_dir_path);
Ted Kremenekf7639e12012-03-06 20:06:33 +00003025 }
3026
Daniel Dunbard067f7f2009-04-08 23:54:23 +00003027 // Add preprocessing options like -I, -D, etc. if we are using the
3028 // preprocessor.
3029 //
3030 // FIXME: Support -fpreprocessed
Daniel Dunbard067f7f2009-04-08 23:54:23 +00003031 if (types::getPreprocessedType(InputType) != types::TY_INVALID)
Chad Rosier633dcdc2013-01-24 19:14:47 +00003032 AddPreprocessingOptions(C, JA, D, Args, CmdArgs, Output, Inputs);
Daniel Dunbara2aedc62009-03-18 10:01:51 +00003033
Rafael Espindolaa7431922011-07-21 23:40:37 +00003034 // Don't warn about "clang -c -DPIC -fPIC test.i" because libtool.m4 assumes
3035 // that "The compiler can only warn and ignore the option if not recognized".
3036 // When building with ccache, it will pass -D options to clang even on
3037 // preprocessed inputs and configure concludes that -fPIC is not supported.
3038 Args.ClaimAllArgs(options::OPT_D);
3039
Alp Toker7874bdc2013-11-15 20:40:58 +00003040 // Manually translate -O4 to -O3; let clang reject others.
Rafael Espindolaad70d962013-08-27 16:58:15 +00003041 if (Arg *A = Args.getLastArg(options::OPT_O_Group)) {
3042 if (A->getOption().matches(options::OPT_O4)) {
3043 CmdArgs.push_back("-O3");
3044 D.Diag(diag::warn_O4_is_O3);
3045 } else {
3046 A->render(Args, CmdArgs);
3047 }
3048 }
Daniel Dunbara2aedc62009-03-18 10:01:51 +00003049
Chad Rosier86b82082012-12-12 20:06:31 +00003050 // Don't warn about unused -flto. This can happen when we're preprocessing or
3051 // precompiling.
3052 Args.ClaimAllArgs(options::OPT_flto);
3053
Daniel Dunbar945577c2009-10-29 02:24:45 +00003054 Args.AddAllArgs(CmdArgs, options::OPT_W_Group);
Ted Kremenekb22ea2a2012-07-07 05:53:30 +00003055 if (Args.hasFlag(options::OPT_pedantic, options::OPT_no_pedantic, false))
3056 CmdArgs.push_back("-pedantic");
Daniel Dunbar945577c2009-10-29 02:24:45 +00003057 Args.AddLastArg(CmdArgs, options::OPT_pedantic_errors);
Daniel Dunbara2aedc62009-03-18 10:01:51 +00003058 Args.AddLastArg(CmdArgs, options::OPT_w);
Daniel Dunbarc44b4cc2009-04-07 22:13:21 +00003059
3060 // Handle -{std, ansi, trigraphs} -- take the last of -{std, ansi}
Hans Wennborgec993822013-07-31 16:57:56 +00003061 // (-ansi is equivalent to -std=c89 or -std=c++98).
Daniel Dunbarc44b4cc2009-04-07 22:13:21 +00003062 //
3063 // If a std is supplied, only add -trigraphs if it follows the
3064 // option.
3065 if (Arg *Std = Args.getLastArg(options::OPT_std_EQ, options::OPT_ansi)) {
3066 if (Std->getOption().matches(options::OPT_ansi))
Nuno Lopes275225d2009-10-16 14:28:06 +00003067 if (types::isCXX(InputType))
Daniel Dunbar1c7577c2009-11-04 06:24:38 +00003068 CmdArgs.push_back("-std=c++98");
Nuno Lopes275225d2009-10-16 14:28:06 +00003069 else
Daniel Dunbar1c7577c2009-11-04 06:24:38 +00003070 CmdArgs.push_back("-std=c89");
Daniel Dunbarc44b4cc2009-04-07 22:13:21 +00003071 else
3072 Std->render(Args, CmdArgs);
3073
Daniel Dunbar3f1a1ff2010-06-14 21:23:08 +00003074 if (Arg *A = Args.getLastArg(options::OPT_std_EQ, options::OPT_ansi,
3075 options::OPT_trigraphs))
3076 if (A != Std)
Daniel Dunbarc44b4cc2009-04-07 22:13:21 +00003077 A->render(Args, CmdArgs);
Daniel Dunbar72a60902009-04-26 01:10:38 +00003078 } else {
3079 // Honor -std-default.
Daniel Dunbar12998192010-01-29 21:03:02 +00003080 //
3081 // FIXME: Clang doesn't correctly handle -std= when the input language
3082 // doesn't match. For the time being just ignore this for C++ inputs;
3083 // eventually we want to do all the standard defaulting here instead of
3084 // splitting it between the driver and clang -cc1.
3085 if (!types::isCXX(InputType))
Nico Weber723b4f02012-08-30 02:08:31 +00003086 Args.AddAllArgsTranslated(CmdArgs, options::OPT_std_default_EQ,
3087 "-std=", /*Joined=*/true);
Saleem Abdulrasool377066a2014-03-27 22:50:18 +00003088 else if (IsWindowsMSVC)
Nico Weber723b4f02012-08-30 02:08:31 +00003089 CmdArgs.push_back("-std=c++11");
3090
Daniel Dunbarc44b4cc2009-04-07 22:13:21 +00003091 Args.AddLastArg(CmdArgs, options::OPT_trigraphs);
Daniel Dunbar72a60902009-04-26 01:10:38 +00003092 }
Daniel Dunbard067f7f2009-04-08 23:54:23 +00003093
Richard Smith282b4492013-09-04 22:50:31 +00003094 // GCC's behavior for -Wwrite-strings is a bit strange:
3095 // * In C, this "warning flag" changes the types of string literals from
3096 // 'char[N]' to 'const char[N]', and thus triggers an unrelated warning
3097 // for the discarded qualifier.
3098 // * In C++, this is just a normal warning flag.
3099 //
3100 // Implementing this warning correctly in C is hard, so we follow GCC's
3101 // behavior for now. FIXME: Directly diagnose uses of a string literal as
3102 // a non-const char* in C, rather than using this crude hack.
3103 if (!types::isCXX(InputType)) {
Argyrios Kyrtzidis25f2afde2014-02-07 08:33:28 +00003104 // FIXME: This should behave just like a warning flag, and thus should also
3105 // respect -Weverything, -Wno-everything, -Werror=write-strings, and so on.
3106 Arg *WriteStrings =
3107 Args.getLastArg(options::OPT_Wwrite_strings,
3108 options::OPT_Wno_write_strings, options::OPT_w);
3109 if (WriteStrings &&
3110 WriteStrings->getOption().matches(options::OPT_Wwrite_strings))
Richard Smith282b4492013-09-04 22:50:31 +00003111 CmdArgs.push_back("-fconst-strings");
Chandler Carruthb009b142011-04-23 06:30:43 +00003112 }
3113
Chandler Carruth61fbf622011-04-23 09:27:53 +00003114 // GCC provides a macro definition '__DEPRECATED' when -Wdeprecated is active
Chandler Carruth30483fb2011-04-23 19:48:40 +00003115 // during C++ compilation, which it is by default. GCC keeps this define even
3116 // in the presence of '-w', match this behavior bug-for-bug.
3117 if (types::isCXX(InputType) &&
3118 Args.hasFlag(options::OPT_Wdeprecated, options::OPT_Wno_deprecated,
3119 true)) {
3120 CmdArgs.push_back("-fdeprecated-macro");
Chandler Carruth61fbf622011-04-23 09:27:53 +00003121 }
3122
Chandler Carruthe0391482010-05-22 02:21:53 +00003123 // Translate GCC's misnamer '-fasm' arguments to '-fgnu-keywords'.
3124 if (Arg *Asm = Args.getLastArg(options::OPT_fasm, options::OPT_fno_asm)) {
3125 if (Asm->getOption().matches(options::OPT_fasm))
3126 CmdArgs.push_back("-fgnu-keywords");
3127 else
3128 CmdArgs.push_back("-fno-gnu-keywords");
3129 }
3130
Rafael Espindola4cfa7972011-05-02 17:43:32 +00003131 if (ShouldDisableCFI(Args, getToolChain()))
3132 CmdArgs.push_back("-fno-dwarf2-cfi-asm");
Rafael Espindolae2641872011-04-30 18:35:43 +00003133
Nick Lewycky1d617ac2011-10-17 23:05:52 +00003134 if (ShouldDisableDwarfDirectory(Args, getToolChain()))
3135 CmdArgs.push_back("-fno-dwarf-directory-asm");
3136
Daniel Dunbare246fbe2013-04-16 18:21:19 +00003137 if (ShouldDisableAutolink(Args, getToolChain()))
3138 CmdArgs.push_back("-fno-autolink");
3139
Chandler Carruth4d5e1a92012-12-17 21:40:04 +00003140 // Add in -fdebug-compilation-dir if necessary.
3141 addDebugCompDirArg(Args, CmdArgs);
Nick Lewyckyba743b72011-10-21 02:32:14 +00003142
Richard Smith9a568822011-11-21 19:36:32 +00003143 if (Arg *A = Args.getLastArg(options::OPT_ftemplate_depth_,
3144 options::OPT_ftemplate_depth_EQ)) {
Daniel Dunbara2aedc62009-03-18 10:01:51 +00003145 CmdArgs.push_back("-ftemplate-depth");
Richard Smithbd55daf2012-11-01 04:30:05 +00003146 CmdArgs.push_back(A->getValue());
Daniel Dunbara2aedc62009-03-18 10:01:51 +00003147 }
3148
Richard Smith79c927b2013-11-06 19:31:51 +00003149 if (Arg *A = Args.getLastArg(options::OPT_foperator_arrow_depth_EQ)) {
3150 CmdArgs.push_back("-foperator-arrow-depth");
3151 CmdArgs.push_back(A->getValue());
3152 }
3153
Richard Smith9a568822011-11-21 19:36:32 +00003154 if (Arg *A = Args.getLastArg(options::OPT_fconstexpr_depth_EQ)) {
3155 CmdArgs.push_back("-fconstexpr-depth");
Richard Smithbd55daf2012-11-01 04:30:05 +00003156 CmdArgs.push_back(A->getValue());
Richard Smith9a568822011-11-21 19:36:32 +00003157 }
3158
Richard Smitha3d3bd22013-05-08 02:12:03 +00003159 if (Arg *A = Args.getLastArg(options::OPT_fconstexpr_steps_EQ)) {
3160 CmdArgs.push_back("-fconstexpr-steps");
3161 CmdArgs.push_back(A->getValue());
3162 }
3163
Richard Smithb3a14522013-02-22 01:59:51 +00003164 if (Arg *A = Args.getLastArg(options::OPT_fbracket_depth_EQ)) {
3165 CmdArgs.push_back("-fbracket-depth");
3166 CmdArgs.push_back(A->getValue());
3167 }
3168
Argyrios Kyrtzidisef6c8da2010-11-18 00:20:36 +00003169 if (Arg *A = Args.getLastArg(options::OPT_Wlarge_by_value_copy_EQ,
3170 options::OPT_Wlarge_by_value_copy_def)) {
Jean-Daniel Dupas73d801c2012-05-04 08:08:37 +00003171 if (A->getNumValues()) {
Richard Smithbd55daf2012-11-01 04:30:05 +00003172 StringRef bytes = A->getValue();
Jean-Daniel Dupas73d801c2012-05-04 08:08:37 +00003173 CmdArgs.push_back(Args.MakeArgString("-Wlarge-by-value-copy=" + bytes));
3174 } else
3175 CmdArgs.push_back("-Wlarge-by-value-copy=64"); // default value
Argyrios Kyrtzidisaf84ec02010-11-17 23:11:54 +00003176 }
3177
Nuno Lopes3d6311d2012-05-08 22:10:46 +00003178
Michael J. Spencer929fccd2012-10-22 22:13:48 +00003179 if (Args.hasArg(options::OPT_relocatable_pch))
Daniel Dunbar8bed86c2009-11-20 22:21:36 +00003180 CmdArgs.push_back("-relocatable-pch");
Mike Stump11289f42009-09-09 15:08:12 +00003181
Daniel Dunbar1c7577c2009-11-04 06:24:38 +00003182 if (Arg *A = Args.getLastArg(options::OPT_fconstant_string_class_EQ)) {
3183 CmdArgs.push_back("-fconstant-string-class");
Richard Smithbd55daf2012-11-01 04:30:05 +00003184 CmdArgs.push_back(A->getValue());
Daniel Dunbar1c7577c2009-11-04 06:24:38 +00003185 }
David Chisnall5778fce2009-08-31 16:41:57 +00003186
Chris Lattnere23003d2010-01-09 21:54:33 +00003187 if (Arg *A = Args.getLastArg(options::OPT_ftabstop_EQ)) {
3188 CmdArgs.push_back("-ftabstop");
Richard Smithbd55daf2012-11-01 04:30:05 +00003189 CmdArgs.push_back(A->getValue());
Chris Lattnere23003d2010-01-09 21:54:33 +00003190 }
3191
Chris Lattnerb35583d2010-04-07 20:49:23 +00003192 CmdArgs.push_back("-ferror-limit");
3193 if (Arg *A = Args.getLastArg(options::OPT_ferror_limit_EQ))
Richard Smithbd55daf2012-11-01 04:30:05 +00003194 CmdArgs.push_back(A->getValue());
Chris Lattnerb35583d2010-04-07 20:49:23 +00003195 else
3196 CmdArgs.push_back("19");
Douglas Gregorffed1cb2010-04-20 07:18:24 +00003197
Chandler Carrutha77a7272010-05-06 04:55:18 +00003198 if (Arg *A = Args.getLastArg(options::OPT_fmacro_backtrace_limit_EQ)) {
3199 CmdArgs.push_back("-fmacro-backtrace-limit");
Richard Smithbd55daf2012-11-01 04:30:05 +00003200 CmdArgs.push_back(A->getValue());
Chandler Carrutha77a7272010-05-06 04:55:18 +00003201 }
3202
3203 if (Arg *A = Args.getLastArg(options::OPT_ftemplate_backtrace_limit_EQ)) {
3204 CmdArgs.push_back("-ftemplate-backtrace-limit");
Richard Smithbd55daf2012-11-01 04:30:05 +00003205 CmdArgs.push_back(A->getValue());
Chandler Carrutha77a7272010-05-06 04:55:18 +00003206 }
3207
Richard Smithf6f003a2011-12-16 19:06:07 +00003208 if (Arg *A = Args.getLastArg(options::OPT_fconstexpr_backtrace_limit_EQ)) {
3209 CmdArgs.push_back("-fconstexpr-backtrace-limit");
Richard Smithbd55daf2012-11-01 04:30:05 +00003210 CmdArgs.push_back(A->getValue());
Richard Smithf6f003a2011-12-16 19:06:07 +00003211 }
3212
Daniel Dunbar2c978472009-11-04 06:24:47 +00003213 // Pass -fmessage-length=.
Daniel Dunbar84bb7932009-11-30 08:40:54 +00003214 CmdArgs.push_back("-fmessage-length");
Daniel Dunbar2c978472009-11-04 06:24:47 +00003215 if (Arg *A = Args.getLastArg(options::OPT_fmessage_length_EQ)) {
Richard Smithbd55daf2012-11-01 04:30:05 +00003216 CmdArgs.push_back(A->getValue());
Daniel Dunbar2c978472009-11-04 06:24:47 +00003217 } else {
3218 // If -fmessage-length=N was not specified, determine whether this is a
3219 // terminal and, if so, implicitly define -fmessage-length appropriately.
3220 unsigned N = llvm::sys::Process::StandardErrColumns();
Chris Lattner0e62c1c2011-07-23 10:55:15 +00003221 CmdArgs.push_back(Args.MakeArgString(Twine(N)));
Daniel Dunbar2c978472009-11-04 06:24:47 +00003222 }
3223
John McCallb4a99d32013-02-19 01:57:35 +00003224 // -fvisibility= and -fvisibility-ms-compat are of a piece.
3225 if (const Arg *A = Args.getLastArg(options::OPT_fvisibility_EQ,
3226 options::OPT_fvisibility_ms_compat)) {
3227 if (A->getOption().matches(options::OPT_fvisibility_EQ)) {
3228 CmdArgs.push_back("-fvisibility");
3229 CmdArgs.push_back(A->getValue());
3230 } else {
3231 assert(A->getOption().matches(options::OPT_fvisibility_ms_compat));
3232 CmdArgs.push_back("-fvisibility");
3233 CmdArgs.push_back("hidden");
3234 CmdArgs.push_back("-ftype-visibility");
3235 CmdArgs.push_back("default");
3236 }
Daniel Dunbare357d562009-12-03 18:42:11 +00003237 }
3238
Douglas Gregor08329632010-06-15 17:05:35 +00003239 Args.AddLastArg(CmdArgs, options::OPT_fvisibility_inlines_hidden);
Michael J. Spencer4c0ffa82010-10-21 03:16:25 +00003240
Hans Wennborgf60f6af2012-06-28 08:01:44 +00003241 Args.AddLastArg(CmdArgs, options::OPT_ftlsmodel_EQ);
3242
Daniel Dunbare46b52a2010-03-20 04:52:14 +00003243 // -fhosted is default.
Chad Rosier4fab82c2012-03-26 22:04:46 +00003244 if (Args.hasFlag(options::OPT_ffreestanding, options::OPT_fhosted, false) ||
3245 KernelOrKext)
Daniel Dunbare46b52a2010-03-20 04:52:14 +00003246 CmdArgs.push_back("-ffreestanding");
3247
Daniel Dunbare357d562009-12-03 18:42:11 +00003248 // Forward -f (flag) options which we can pass directly.
Daniel Dunbar3a148f22009-04-07 21:51:40 +00003249 Args.AddLastArg(CmdArgs, options::OPT_femit_all_decls);
Daniel Dunbar3a148f22009-04-07 21:51:40 +00003250 Args.AddLastArg(CmdArgs, options::OPT_fheinous_gnu_extensions);
Adrian Prantla7634472014-01-07 01:19:08 +00003251 Args.AddLastArg(CmdArgs, options::OPT_fstandalone_debug);
3252 Args.AddLastArg(CmdArgs, options::OPT_fno_standalone_debug);
Eric Christopher86050822011-10-25 07:13:06 +00003253 Args.AddLastArg(CmdArgs, options::OPT_fno_operator_names);
Bill Schmidtb3b804e2013-07-03 15:36:02 +00003254 // AltiVec language extensions aren't relevant for assembling.
3255 if (!isa<PreprocessJobAction>(JA) ||
3256 Output.getType() != types::TY_PP_Asm)
3257 Args.AddLastArg(CmdArgs, options::OPT_faltivec);
Richard Trieu91844232012-06-26 18:18:47 +00003258 Args.AddLastArg(CmdArgs, options::OPT_fdiagnostics_show_template_tree);
3259 Args.AddLastArg(CmdArgs, options::OPT_fno_elide_type);
Chad Rosier864dfe12012-03-13 23:45:51 +00003260
Peter Collingbourne32701642013-11-01 18:16:25 +00003261 const SanitizerArgs &Sanitize = getToolChain().getSanitizerArgs();
3262 Sanitize.addArgs(Args, CmdArgs);
Richard Smith52be6192012-11-05 22:04:41 +00003263
Will Dietz3676d562012-12-30 20:53:28 +00003264 if (!Args.hasFlag(options::OPT_fsanitize_recover,
3265 options::OPT_fno_sanitize_recover,
3266 true))
3267 CmdArgs.push_back("-fno-sanitize-recover");
3268
Alexey Samsonovcb3f8122014-03-20 10:48:29 +00003269 if (Args.hasFlag(options::OPT_fsanitize_undefined_trap_on_error,
Chad Rosierae229d52013-01-29 23:31:22 +00003270 options::OPT_fno_sanitize_undefined_trap_on_error, false))
3271 CmdArgs.push_back("-fsanitize-undefined-trap-on-error");
3272
Eric Christopher459d2712013-02-19 06:16:53 +00003273 // Report an error for -faltivec on anything other than PowerPC.
Chad Rosier864dfe12012-03-13 23:45:51 +00003274 if (const Arg *A = Args.getLastArg(options::OPT_faltivec))
Eli Benderskyd4a6aec2013-07-24 22:20:49 +00003275 if (!(getToolChain().getArch() == llvm::Triple::ppc ||
Bill Schmidt778d3872013-07-26 01:36:11 +00003276 getToolChain().getArch() == llvm::Triple::ppc64 ||
3277 getToolChain().getArch() == llvm::Triple::ppc64le))
Chad Rosier864dfe12012-03-13 23:45:51 +00003278 D.Diag(diag::err_drv_argument_only_allowed_with)
Bill Schmidt778d3872013-07-26 01:36:11 +00003279 << A->getAsString(Args) << "ppc/ppc64/ppc64le";
Chad Rosier864dfe12012-03-13 23:45:51 +00003280
Daniel Dunbar733b0f82011-03-01 18:49:30 +00003281 if (getToolChain().SupportsProfiling())
3282 Args.AddLastArg(CmdArgs, options::OPT_pg);
Daniel Dunbar35621a92010-03-16 16:57:46 +00003283
3284 // -flax-vector-conversions is default.
3285 if (!Args.hasFlag(options::OPT_flax_vector_conversions,
3286 options::OPT_fno_lax_vector_conversions))
3287 CmdArgs.push_back("-fno-lax-vector-conversions");
3288
Fariborz Jahaniana4cfff82011-01-07 01:05:02 +00003289 if (Args.getLastArg(options::OPT_fapple_kext))
3290 CmdArgs.push_back("-fapple-kext");
3291
David Blaikie690f21e2012-06-14 18:55:27 +00003292 if (Args.hasFlag(options::OPT_frewrite_includes,
3293 options::OPT_fno_rewrite_includes, false))
3294 CmdArgs.push_back("-frewrite-includes");
3295
Fariborz Jahaniana4404f22009-05-22 20:17:16 +00003296 Args.AddLastArg(CmdArgs, options::OPT_fobjc_sender_dependent_dispatch);
Chris Lattner69686412009-04-21 05:34:31 +00003297 Args.AddLastArg(CmdArgs, options::OPT_fdiagnostics_print_source_range_info);
Douglas Gregoreec975c2010-08-19 20:24:43 +00003298 Args.AddLastArg(CmdArgs, options::OPT_fdiagnostics_parseable_fixits);
Daniel Dunbar3a148f22009-04-07 21:51:40 +00003299 Args.AddLastArg(CmdArgs, options::OPT_ftime_report);
3300 Args.AddLastArg(CmdArgs, options::OPT_ftrapv);
David Chisnalldd84ef12010-09-17 18:29:54 +00003301
3302 if (Arg *A = Args.getLastArg(options::OPT_ftrapv_handler_EQ)) {
3303 CmdArgs.push_back("-ftrapv-handler");
Richard Smithbd55daf2012-11-01 04:30:05 +00003304 CmdArgs.push_back(A->getValue());
David Chisnalldd84ef12010-09-17 18:29:54 +00003305 }
3306
Bob Wilson14adb362012-02-03 06:27:22 +00003307 Args.AddLastArg(CmdArgs, options::OPT_ftrap_function_EQ);
Evan Cheng04c94292011-04-08 21:37:45 +00003308
Chandler Carruth6e501032011-03-27 00:04:55 +00003309 // -fno-strict-overflow implies -fwrapv if it isn't disabled, but
3310 // -fstrict-overflow won't turn off an explicitly enabled -fwrapv.
3311 if (Arg *A = Args.getLastArg(options::OPT_fwrapv,
3312 options::OPT_fno_wrapv)) {
3313 if (A->getOption().matches(options::OPT_fwrapv))
3314 CmdArgs.push_back("-fwrapv");
3315 } else if (Arg *A = Args.getLastArg(options::OPT_fstrict_overflow,
3316 options::OPT_fno_strict_overflow)) {
3317 if (A->getOption().matches(options::OPT_fno_strict_overflow))
3318 CmdArgs.push_back("-fwrapv");
3319 }
Hal Finkelce0697f2013-11-17 16:03:29 +00003320
3321 if (Arg *A = Args.getLastArg(options::OPT_freroll_loops,
3322 options::OPT_fno_reroll_loops))
3323 if (A->getOption().matches(options::OPT_freroll_loops))
3324 CmdArgs.push_back("-freroll-loops");
3325
Daniel Dunbar3a148f22009-04-07 21:51:40 +00003326 Args.AddLastArg(CmdArgs, options::OPT_fwritable_strings);
Chandler Carruth54c29102013-08-08 08:34:35 +00003327 Args.AddLastArg(CmdArgs, options::OPT_funroll_loops,
3328 options::OPT_fno_unroll_loops);
Daniel Dunbara2aedc62009-03-18 10:01:51 +00003329
Daniel Dunbara77eaeb2009-09-03 04:54:28 +00003330 Args.AddLastArg(CmdArgs, options::OPT_pthread);
3331
Mahesha S6a682be42012-10-27 07:47:56 +00003332
Daniel Dunbar4930e332009-11-17 08:07:36 +00003333 // -stack-protector=0 is default.
3334 unsigned StackProtectorLevel = 0;
Bill Wendlingd63bbad2009-06-28 07:36:13 +00003335 if (Arg *A = Args.getLastArg(options::OPT_fno_stack_protector,
3336 options::OPT_fstack_protector_all,
Josh Mageee0fc1a82014-02-11 01:35:14 +00003337 options::OPT_fstack_protector_strong,
Bill Wendlingd63bbad2009-06-28 07:36:13 +00003338 options::OPT_fstack_protector)) {
Daniel Dunbar4930e332009-11-17 08:07:36 +00003339 if (A->getOption().matches(options::OPT_fstack_protector))
Josh Mageee0fc1a82014-02-11 01:35:14 +00003340 StackProtectorLevel = LangOptions::SSPOn;
3341 else if (A->getOption().matches(options::OPT_fstack_protector_strong))
3342 StackProtectorLevel = LangOptions::SSPStrong;
Daniel Dunbar4930e332009-11-17 08:07:36 +00003343 else if (A->getOption().matches(options::OPT_fstack_protector_all))
Josh Mageee0fc1a82014-02-11 01:35:14 +00003344 StackProtectorLevel = LangOptions::SSPReq;
Nico Weberdd473632011-08-23 07:38:27 +00003345 } else {
3346 StackProtectorLevel =
3347 getToolChain().GetDefaultStackProtectorLevel(KernelOrKext);
3348 }
Daniel Dunbar4930e332009-11-17 08:07:36 +00003349 if (StackProtectorLevel) {
3350 CmdArgs.push_back("-stack-protector");
Chris Lattner0e62c1c2011-07-23 10:55:15 +00003351 CmdArgs.push_back(Args.MakeArgString(Twine(StackProtectorLevel)));
Joerg Sonnenberger85e2bbc2012-09-12 13:51:14 +00003352 }
Chad Rosierdb3da832012-08-21 16:16:06 +00003353
Joerg Sonnenberger85e2bbc2012-09-12 13:51:14 +00003354 // --param ssp-buffer-size=
3355 for (arg_iterator it = Args.filtered_begin(options::OPT__param),
3356 ie = Args.filtered_end(); it != ie; ++it) {
Richard Smithbd55daf2012-11-01 04:30:05 +00003357 StringRef Str((*it)->getValue());
Joerg Sonnenberger85e2bbc2012-09-12 13:51:14 +00003358 if (Str.startswith("ssp-buffer-size=")) {
3359 if (StackProtectorLevel) {
Chad Rosierdb3da832012-08-21 16:16:06 +00003360 CmdArgs.push_back("-stack-protector-buffer-size");
3361 // FIXME: Verify the argument is a valid integer.
3362 CmdArgs.push_back(Args.MakeArgString(Str.drop_front(16)));
Chad Rosierdb3da832012-08-21 16:16:06 +00003363 }
Joerg Sonnenberger85e2bbc2012-09-12 13:51:14 +00003364 (*it)->claim();
Chad Rosierdb3da832012-08-21 16:16:06 +00003365 }
Bill Wendlingd63bbad2009-06-28 07:36:13 +00003366 }
3367
Nick Lewyckyf4d3f7a2011-12-06 03:33:03 +00003368 // Translate -mstackrealign
3369 if (Args.hasFlag(options::OPT_mstackrealign, options::OPT_mno_stackrealign,
3370 false)) {
3371 CmdArgs.push_back("-backend-option");
3372 CmdArgs.push_back("-force-align-stack");
3373 }
3374 if (!Args.hasFlag(options::OPT_mno_stackrealign, options::OPT_mstackrealign,
3375 false)) {
3376 CmdArgs.push_back(Args.MakeArgString("-mstackrealign"));
3377 }
3378
Joerg Sonnenbergerdb66ed02011-12-05 23:05:23 +00003379 if (Args.hasArg(options::OPT_mstack_alignment)) {
3380 StringRef alignment = Args.getLastArgValue(options::OPT_mstack_alignment);
3381 CmdArgs.push_back(Args.MakeArgString("-mstack-alignment=" + alignment));
Eric Christopherd5c45f62011-05-02 21:18:22 +00003382 }
Chad Rosier9ae53f82012-11-29 00:42:06 +00003383 // -mkernel implies -mstrict-align; don't add the redundant option.
Renato Golina146a482013-08-24 14:44:41 +00003384 if (!KernelOrKext) {
Renato Golin8d5f3142013-08-28 23:56:07 +00003385 if (Arg *A = Args.getLastArg(options::OPT_mno_unaligned_access,
3386 options::OPT_munaligned_access)) {
3387 if (A->getOption().matches(options::OPT_mno_unaligned_access)) {
3388 CmdArgs.push_back("-backend-option");
3389 CmdArgs.push_back("-arm-strict-align");
3390 } else {
3391 CmdArgs.push_back("-backend-option");
3392 CmdArgs.push_back("-arm-no-strict-align");
3393 }
Renato Golina146a482013-08-24 14:44:41 +00003394 }
Chad Rosier60027022012-11-09 17:29:19 +00003395 }
Eric Christopher84fbdb42011-08-19 00:30:14 +00003396
Weiming Zhao580dcfb2013-11-13 18:31:23 +00003397 if (Arg *A = Args.getLastArg(options::OPT_mrestrict_it,
3398 options::OPT_mno_restrict_it)) {
3399 if (A->getOption().matches(options::OPT_mrestrict_it)) {
3400 CmdArgs.push_back("-backend-option");
3401 CmdArgs.push_back("-arm-restrict-it");
3402 } else {
3403 CmdArgs.push_back("-backend-option");
3404 CmdArgs.push_back("-arm-no-restrict-it");
3405 }
3406 }
3407
Daniel Dunbard18049a2009-04-07 21:16:11 +00003408 // Forward -f options with positive and negative forms; we translate
3409 // these by hand.
Diego Novillo5c297052013-11-13 12:22:39 +00003410 if (Arg *A = Args.getLastArg(options::OPT_fprofile_sample_use_EQ)) {
3411 StringRef fname = A->getValue();
3412 if (!llvm::sys::fs::exists(fname))
3413 D.Diag(diag::err_drv_no_such_file) << fname;
3414 else
3415 A->render(Args, CmdArgs);
3416 }
Daniel Dunbard18049a2009-04-07 21:16:11 +00003417
Fariborz Jahaniana4cfff82011-01-07 01:05:02 +00003418 if (Args.hasArg(options::OPT_mkernel)) {
Daniel Dunbar80f787c2011-02-04 17:24:47 +00003419 if (!Args.hasArg(options::OPT_fapple_kext) && types::isCXX(InputType))
Fariborz Jahaniana4cfff82011-01-07 01:05:02 +00003420 CmdArgs.push_back("-fapple-kext");
3421 if (!Args.hasArg(options::OPT_fbuiltin))
3422 CmdArgs.push_back("-fno-builtin");
Chad Rosierf27e1c42012-03-26 21:29:17 +00003423 Args.ClaimAllArgs(options::OPT_fno_builtin);
Fariborz Jahaniana4cfff82011-01-07 01:05:02 +00003424 }
Daniel Dunbar4930e332009-11-17 08:07:36 +00003425 // -fbuiltin is default.
Fariborz Jahaniana4cfff82011-01-07 01:05:02 +00003426 else if (!Args.hasFlag(options::OPT_fbuiltin, options::OPT_fno_builtin))
Daniel Dunbar484afa22009-11-19 04:55:23 +00003427 CmdArgs.push_back("-fno-builtin");
Daniel Dunbard18049a2009-04-07 21:16:11 +00003428
Nuno Lopes13c88c72009-12-16 16:59:22 +00003429 if (!Args.hasFlag(options::OPT_fassume_sane_operator_new,
3430 options::OPT_fno_assume_sane_operator_new))
3431 CmdArgs.push_back("-fno-assume-sane-operator-new");
3432
Daniel Dunbar4930e332009-11-17 08:07:36 +00003433 // -fblocks=0 is default.
3434 if (Args.hasFlag(options::OPT_fblocks, options::OPT_fno_blocks,
David Chisnallda209912011-02-28 17:11:43 +00003435 getToolChain().IsBlocksDefault()) ||
3436 (Args.hasArg(options::OPT_fgnu_runtime) &&
3437 Args.hasArg(options::OPT_fobjc_nonfragile_abi) &&
3438 !Args.hasArg(options::OPT_fno_blocks))) {
Daniel Dunbar4930e332009-11-17 08:07:36 +00003439 CmdArgs.push_back("-fblocks");
John McCall7959fee2011-09-09 20:41:01 +00003440
3441 if (!Args.hasArg(options::OPT_fgnu_runtime) &&
3442 !getToolChain().hasBlocksRuntime())
3443 CmdArgs.push_back("-fblocks-runtime-optional");
David Chisnall950a9512009-11-17 19:33:30 +00003444 }
Daniel Dunbard18049a2009-04-07 21:16:11 +00003445
Douglas Gregor226173a2012-01-18 15:19:58 +00003446 // -fmodules enables modules (off by default). However, for C++/Objective-C++,
3447 // users must also pass -fcxx-modules. The latter flag will disappear once the
3448 // modules implementation is solid for C++/Objective-C++ programs as well.
Douglas Gregorc60437f2013-01-16 01:23:41 +00003449 bool HaveModules = false;
Douglas Gregor226173a2012-01-18 15:19:58 +00003450 if (Args.hasFlag(options::OPT_fmodules, options::OPT_fno_modules, false)) {
3451 bool AllowedInCXX = Args.hasFlag(options::OPT_fcxx_modules,
3452 options::OPT_fno_cxx_modules,
3453 false);
Douglas Gregorc60437f2013-01-16 01:23:41 +00003454 if (AllowedInCXX || !types::isCXX(InputType)) {
Douglas Gregor226173a2012-01-18 15:19:58 +00003455 CmdArgs.push_back("-fmodules");
Douglas Gregorc60437f2013-01-16 01:23:41 +00003456 HaveModules = true;
3457 }
3458 }
3459
Daniel Jasper07e6c402013-08-05 20:26:17 +00003460 // -fmodule-maps enables module map processing (off by default) for header
3461 // checking. It is implied by -fmodules.
3462 if (Args.hasFlag(options::OPT_fmodule_maps, options::OPT_fno_module_maps,
3463 false)) {
3464 CmdArgs.push_back("-fmodule-maps");
3465 }
3466
Daniel Jasperac42b752013-10-21 06:34:34 +00003467 // -fmodules-decluse checks that modules used are declared so (off by
3468 // default).
Daniel Jasperba7f2f72013-09-24 09:14:14 +00003469 if (Args.hasFlag(options::OPT_fmodules_decluse,
3470 options::OPT_fno_modules_decluse,
3471 false)) {
Daniel Jasper6e16d542013-09-29 12:40:54 +00003472 CmdArgs.push_back("-fmodules-decluse");
Daniel Jasperba7f2f72013-09-24 09:14:14 +00003473 }
3474
Daniel Jasper962b38e2014-04-11 11:47:45 +00003475 // -fmodules-strict-decluse is like -fmodule-decluse, but also checks that
3476 // all #included headers are part of modules.
3477 if (Args.hasFlag(options::OPT_fmodules_strict_decluse,
3478 options::OPT_fno_modules_strict_decluse,
3479 false)) {
3480 CmdArgs.push_back("-fmodules-strict-decluse");
3481 }
3482
Daniel Jasperac42b752013-10-21 06:34:34 +00003483 // -fmodule-name specifies the module that is currently being built (or
3484 // used for header checking by -fmodule-maps).
3485 if (Arg *A = Args.getLastArg(options::OPT_fmodule_name)) {
3486 A->claim();
3487 A->render(Args, CmdArgs);
3488 }
3489
3490 // -fmodule-map-file can be used to specify a file containing module
3491 // definitions.
3492 if (Arg *A = Args.getLastArg(options::OPT_fmodule_map_file)) {
3493 A->claim();
3494 A->render(Args, CmdArgs);
3495 }
3496
Douglas Gregor35b04d62013-02-07 19:01:24 +00003497 // If a module path was provided, pass it along. Otherwise, use a temporary
3498 // directory.
3499 if (Arg *A = Args.getLastArg(options::OPT_fmodules_cache_path)) {
3500 A->claim();
3501 if (HaveModules) {
3502 A->render(Args, CmdArgs);
3503 }
3504 } else if (HaveModules) {
3505 SmallString<128> DefaultModuleCache;
3506 llvm::sys::path::system_temp_directory(/*erasedOnReboot=*/false,
3507 DefaultModuleCache);
Douglas Gregor23c7d672013-03-21 21:48:48 +00003508 llvm::sys::path::append(DefaultModuleCache, "org.llvm.clang");
3509 llvm::sys::path::append(DefaultModuleCache, "ModuleCache");
Douglas Gregor4bedb492013-02-07 22:59:12 +00003510 const char Arg[] = "-fmodules-cache-path=";
3511 DefaultModuleCache.insert(DefaultModuleCache.begin(),
3512 Arg, Arg + strlen(Arg));
Douglas Gregor35b04d62013-02-07 19:01:24 +00003513 CmdArgs.push_back(Args.MakeArgString(DefaultModuleCache));
3514 }
3515
Argyrios Kyrtzidis1594c152014-03-03 08:12:05 +00003516 if (Arg *A = Args.getLastArg(options::OPT_fmodules_user_build_path)) {
3517 A->claim();
3518 if (HaveModules) {
3519 A->render(Args, CmdArgs);
3520 }
3521 }
3522
Douglas Gregor35b04d62013-02-07 19:01:24 +00003523 // Pass through all -fmodules-ignore-macro arguments.
3524 Args.AddAllArgs(CmdArgs, options::OPT_fmodules_ignore_macro);
Douglas Gregor527b1c92013-03-25 21:19:16 +00003525 Args.AddLastArg(CmdArgs, options::OPT_fmodules_prune_interval);
3526 Args.AddLastArg(CmdArgs, options::OPT_fmodules_prune_after);
Douglas Gregor35b04d62013-02-07 19:01:24 +00003527
Dmitri Gribenkof430da42014-02-12 10:33:14 +00003528 Args.AddLastArg(CmdArgs, options::OPT_fbuild_session_timestamp);
3529
3530 if (Args.getLastArg(options::OPT_fmodules_validate_once_per_build_session)) {
3531 if (!Args.getLastArg(options::OPT_fbuild_session_timestamp))
3532 D.Diag(diag::err_drv_modules_validate_once_requires_timestamp);
3533
3534 Args.AddLastArg(CmdArgs,
3535 options::OPT_fmodules_validate_once_per_build_session);
3536 }
3537
Ben Langmuirdcf73862014-03-12 00:06:17 +00003538 Args.AddLastArg(CmdArgs, options::OPT_fmodules_validate_system_headers);
3539
John McCalldfea9982010-04-09 19:12:06 +00003540 // -faccess-control is default.
John McCall3155f572010-04-09 19:03:51 +00003541 if (Args.hasFlag(options::OPT_fno_access_control,
3542 options::OPT_faccess_control,
John McCalldfea9982010-04-09 19:12:06 +00003543 false))
John McCall3155f572010-04-09 19:03:51 +00003544 CmdArgs.push_back("-fno-access-control");
John McCall59bb1d42010-03-17 01:32:13 +00003545
Anders Carlssond470fef2010-11-21 00:09:52 +00003546 // -felide-constructors is the default.
3547 if (Args.hasFlag(options::OPT_fno_elide_constructors,
3548 options::OPT_felide_constructors,
3549 false))
3550 CmdArgs.push_back("-fno-elide-constructors");
3551
Daniel Dunbar0730e4f2009-11-17 07:06:20 +00003552 // -frtti is default.
Chad Rosier4fab82c2012-03-26 22:04:46 +00003553 if (!Args.hasFlag(options::OPT_frtti, options::OPT_fno_rtti) ||
Richard Smith52be6192012-11-05 22:04:41 +00003554 KernelOrKext) {
Daniel Dunbar484afa22009-11-19 04:55:23 +00003555 CmdArgs.push_back("-fno-rtti");
Mike Stump183c3d22009-07-31 23:15:31 +00003556
Richard Smith52be6192012-11-05 22:04:41 +00003557 // -fno-rtti cannot usefully be combined with -fsanitize=vptr.
Alexey Samsonov627b10f2012-11-06 15:09:03 +00003558 if (Sanitize.sanitizesVptr()) {
NAKAMURA Takumiab060362012-11-06 22:02:00 +00003559 std::string NoRttiArg =
Richard Smith52be6192012-11-05 22:04:41 +00003560 Args.getLastArg(options::OPT_mkernel,
3561 options::OPT_fapple_kext,
Richard Smithaa716572012-11-06 01:12:02 +00003562 options::OPT_fno_rtti)->getAsString(Args);
Richard Smith52be6192012-11-05 22:04:41 +00003563 D.Diag(diag::err_drv_argument_not_allowed_with)
3564 << "-fsanitize=vptr" << NoRttiArg;
3565 }
3566 }
3567
Tony Linthicum76329bf2011-12-12 21:14:55 +00003568 // -fshort-enums=0 is default for all architectures except Hexagon.
Argyrios Kyrtzidis74825bc2010-10-08 00:25:19 +00003569 if (Args.hasFlag(options::OPT_fshort_enums,
Tony Linthicum76329bf2011-12-12 21:14:55 +00003570 options::OPT_fno_short_enums,
Eli Benderskyd4a6aec2013-07-24 22:20:49 +00003571 getToolChain().getArch() ==
Tony Linthicum76329bf2011-12-12 21:14:55 +00003572 llvm::Triple::hexagon))
Argyrios Kyrtzidis74825bc2010-10-08 00:25:19 +00003573 CmdArgs.push_back("-fshort-enums");
3574
Daniel Dunbard609b7b2009-11-17 06:37:03 +00003575 // -fsigned-char is default.
Daniel Dunbar5bdd2992009-11-25 10:14:30 +00003576 if (!Args.hasFlag(options::OPT_fsigned_char, options::OPT_funsigned_char,
Daniel Dunbard609b7b2009-11-17 06:37:03 +00003577 isSignedCharDefault(getToolChain().getTriple())))
Daniel Dunbar5fe08662009-11-29 02:39:08 +00003578 CmdArgs.push_back("-fno-signed-char");
Eli Friedman327f0b52009-06-05 07:21:14 +00003579
Anders Carlssonfcd764a2010-02-06 23:23:06 +00003580 // -fthreadsafe-static is default.
Michael J. Spencer4c0ffa82010-10-21 03:16:25 +00003581 if (!Args.hasFlag(options::OPT_fthreadsafe_statics,
Anders Carlssonfcd764a2010-02-06 23:23:06 +00003582 options::OPT_fno_threadsafe_statics))
3583 CmdArgs.push_back("-fno-threadsafe-statics");
3584
Daniel Dunbarfe06df42010-03-20 04:15:41 +00003585 // -fuse-cxa-atexit is default.
Saleem Abdulrasool377066a2014-03-27 22:50:18 +00003586 if (!Args.hasFlag(options::OPT_fuse_cxa_atexit,
3587 options::OPT_fno_use_cxa_atexit,
3588 !IsWindowsCygnus && !IsWindowsGNU &&
3589 getToolChain().getArch() != llvm::Triple::hexagon &&
3590 getToolChain().getArch() != llvm::Triple::xcore) ||
Chad Rosier4fab82c2012-03-26 22:04:46 +00003591 KernelOrKext)
Daniel Dunbarfe06df42010-03-20 04:15:41 +00003592 CmdArgs.push_back("-fno-use-cxa-atexit");
3593
Daniel Dunbar0730e4f2009-11-17 07:06:20 +00003594 // -fms-extensions=0 is default.
Daniel Dunbar5bdd2992009-11-25 10:14:30 +00003595 if (Args.hasFlag(options::OPT_fms_extensions, options::OPT_fno_ms_extensions,
Saleem Abdulrasool377066a2014-03-27 22:50:18 +00003596 IsWindowsMSVC))
Daniel Dunbar0730e4f2009-11-17 07:06:20 +00003597 CmdArgs.push_back("-fms-extensions");
3598
Francois Pichet1b4f1632011-09-17 04:32:15 +00003599 // -fms-compatibility=0 is default.
Douglas Gregor2b4907e2011-10-24 15:49:38 +00003600 if (Args.hasFlag(options::OPT_fms_compatibility,
3601 options::OPT_fno_ms_compatibility,
Saleem Abdulrasool377066a2014-03-27 22:50:18 +00003602 (IsWindowsMSVC && Args.hasFlag(options::OPT_fms_extensions,
3603 options::OPT_fno_ms_extensions,
3604 true))))
Francois Pichet1b4f1632011-09-17 04:32:15 +00003605 CmdArgs.push_back("-fms-compatibility");
3606
Reid Klecknerc106fda2013-09-18 00:33:59 +00003607 // -fmsc-version=1700 is default.
Michael J. Spencer4992ca4b2010-10-21 05:21:48 +00003608 if (Args.hasFlag(options::OPT_fms_extensions, options::OPT_fno_ms_extensions,
Saleem Abdulrasool377066a2014-03-27 22:50:18 +00003609 IsWindowsMSVC) || Args.hasArg(options::OPT_fmsc_version)) {
Chris Lattner0e62c1c2011-07-23 10:55:15 +00003610 StringRef msc_ver = Args.getLastArgValue(options::OPT_fmsc_version);
Michael J. Spencer4992ca4b2010-10-21 05:21:48 +00003611 if (msc_ver.empty())
Reid Klecknerc106fda2013-09-18 00:33:59 +00003612 CmdArgs.push_back("-fmsc-version=1700");
Michael J. Spencer4992ca4b2010-10-21 05:21:48 +00003613 else
3614 CmdArgs.push_back(Args.MakeArgString("-fmsc-version=" + msc_ver));
3615 }
3616
3617
Eric Christopher5ecce122013-02-18 00:38:31 +00003618 // -fno-borland-extensions is default.
Dawn Perchik68bb1b42010-09-02 23:59:25 +00003619 if (Args.hasFlag(options::OPT_fborland_extensions,
3620 options::OPT_fno_borland_extensions, false))
3621 CmdArgs.push_back("-fborland-extensions");
3622
Francois Pichet02744872011-09-01 16:38:08 +00003623 // -fno-delayed-template-parsing is default, except for Windows where MSVC STL
3624 // needs it.
Francois Pichet1c229c02011-04-22 22:18:13 +00003625 if (Args.hasFlag(options::OPT_fdelayed_template_parsing,
Saleem Abdulrasool377066a2014-03-27 22:50:18 +00003626 options::OPT_fno_delayed_template_parsing, IsWindowsMSVC))
Francois Pichet35bc5de2011-08-26 00:22:34 +00003627 CmdArgs.push_back("-fdelayed-template-parsing");
Francois Pichet1c229c02011-04-22 22:18:13 +00003628
Chandler Carruthe03aa552010-04-17 20:17:31 +00003629 // -fgnu-keywords default varies depending on language; only pass if
3630 // specified.
3631 if (Arg *A = Args.getLastArg(options::OPT_fgnu_keywords,
Daniel Dunbardb059592010-04-24 17:56:39 +00003632 options::OPT_fno_gnu_keywords))
3633 A->render(Args, CmdArgs);
Chandler Carruthe03aa552010-04-17 20:17:31 +00003634
Rafael Espindola922a6242011-06-02 17:30:53 +00003635 if (Args.hasFlag(options::OPT_fgnu89_inline,
3636 options::OPT_fno_gnu89_inline,
3637 false))
Rafael Espindolafb2af642011-06-02 16:13:27 +00003638 CmdArgs.push_back("-fgnu89-inline");
3639
Chad Rosier9c76d242012-03-15 22:31:42 +00003640 if (Args.hasArg(options::OPT_fno_inline))
3641 CmdArgs.push_back("-fno-inline");
3642
Chad Rosier64d6be92012-03-06 21:17:19 +00003643 if (Args.hasArg(options::OPT_fno_inline_functions))
3644 CmdArgs.push_back("-fno-inline-functions");
Chad Rosier80603182012-03-06 18:49:20 +00003645
John McCall5fb5df92012-06-20 06:18:46 +00003646 ObjCRuntime objcRuntime = AddObjCRuntimeArgs(Args, CmdArgs, rewriteKind);
John McCall24fc0de2011-07-06 00:26:06 +00003647
John McCall5fb5df92012-06-20 06:18:46 +00003648 // -fobjc-dispatch-method is only relevant with the nonfragile-abi, and
Fariborz Jahanian15f60cb2014-01-20 19:32:33 +00003649 // legacy is the default. Except for deployment taget of 10.5,
3650 // next runtime is always legacy dispatch and -fno-objc-legacy-dispatch
3651 // gets ignored silently.
3652 if (objcRuntime.isNonFragile()) {
David Chisnall3154e682011-09-30 13:32:35 +00003653 if (!Args.hasFlag(options::OPT_fobjc_legacy_dispatch,
3654 options::OPT_fno_objc_legacy_dispatch,
David Chisnallda225352012-07-04 11:52:24 +00003655 objcRuntime.isLegacyDispatchDefaultForArch(
Eli Benderskyd4a6aec2013-07-24 22:20:49 +00003656 getToolChain().getArch()))) {
David Chisnall3154e682011-09-30 13:32:35 +00003657 if (getToolChain().UseObjCMixedDispatch())
3658 CmdArgs.push_back("-fobjc-dispatch-method=mixed");
3659 else
3660 CmdArgs.push_back("-fobjc-dispatch-method=non-legacy");
3661 }
3662 }
Rafael Espindolab44676c2013-11-12 04:33:56 +00003663
Fariborz Jahanianfd4ce192013-11-12 17:08:46 +00003664 // When ObjectiveC legacy runtime is in effect on MacOSX,
3665 // turn on the option to do Array/Dictionary subscripting
3666 // by default.
Fariborz Jahanianff6c97c2013-11-12 20:50:26 +00003667 if (getToolChain().getTriple().getArch() == llvm::Triple::x86 &&
3668 getToolChain().getTriple().isMacOSX() &&
3669 !getToolChain().getTriple().isMacOSXVersionLT(10, 7) &&
3670 objcRuntime.getKind() == ObjCRuntime::FragileMacOSX &&
Fariborz Jahanianfd4ce192013-11-12 17:08:46 +00003671 objcRuntime.isNeXTFamily())
3672 CmdArgs.push_back("-fobjc-subscripting-legacy-runtime");
3673
Fariborz Jahanian0e3043b2012-11-15 19:02:45 +00003674 // -fencode-extended-block-signature=1 is default.
3675 if (getToolChain().IsEncodeExtendedBlockSignatureDefault()) {
3676 CmdArgs.push_back("-fencode-extended-block-signature");
3677 }
3678
John McCall24fc0de2011-07-06 00:26:06 +00003679 // Allow -fno-objc-arr to trump -fobjc-arr/-fobjc-arc.
3680 // NOTE: This logic is duplicated in ToolChains.cpp.
3681 bool ARC = isObjCAutoRefCount(Args);
3682 if (ARC) {
John McCall3deb1ad2012-08-21 02:47:43 +00003683 getToolChain().CheckObjCARC();
Argyrios Kyrtzidis3dbeb552012-02-29 03:43:52 +00003684
John McCall24fc0de2011-07-06 00:26:06 +00003685 CmdArgs.push_back("-fobjc-arc");
3686
Chandler Carruth491db322011-11-04 07:34:47 +00003687 // FIXME: It seems like this entire block, and several around it should be
3688 // wrapped in isObjC, but for now we just use it here as this is where it
3689 // was being used previously.
3690 if (types::isCXX(InputType) && types::isObjC(InputType)) {
3691 if (getToolChain().GetCXXStdlibType(Args) == ToolChain::CST_Libcxx)
3692 CmdArgs.push_back("-fobjc-arc-cxxlib=libc++");
3693 else
3694 CmdArgs.push_back("-fobjc-arc-cxxlib=libstdc++");
3695 }
3696
John McCall24fc0de2011-07-06 00:26:06 +00003697 // Allow the user to enable full exceptions code emission.
3698 // We define off for Objective-CC, on for Objective-C++.
3699 if (Args.hasFlag(options::OPT_fobjc_arc_exceptions,
3700 options::OPT_fno_objc_arc_exceptions,
3701 /*default*/ types::isCXX(InputType)))
3702 CmdArgs.push_back("-fobjc-arc-exceptions");
3703 }
3704
3705 // -fobjc-infer-related-result-type is the default, except in the Objective-C
3706 // rewriter.
John McCall5fb5df92012-06-20 06:18:46 +00003707 if (rewriteKind != RK_None)
John McCall24fc0de2011-07-06 00:26:06 +00003708 CmdArgs.push_back("-fno-objc-infer-related-result-type");
Eric Christopher84fbdb42011-08-19 00:30:14 +00003709
John McCall24fc0de2011-07-06 00:26:06 +00003710 // Handle -fobjc-gc and -fobjc-gc-only. They are exclusive, and -fobjc-gc-only
3711 // takes precedence.
3712 const Arg *GCArg = Args.getLastArg(options::OPT_fobjc_gc_only);
3713 if (!GCArg)
3714 GCArg = Args.getLastArg(options::OPT_fobjc_gc);
3715 if (GCArg) {
3716 if (ARC) {
Chris Lattner0e62c1c2011-07-23 10:55:15 +00003717 D.Diag(diag::err_drv_objc_gc_arr)
John McCall24fc0de2011-07-06 00:26:06 +00003718 << GCArg->getAsString(Args);
3719 } else if (getToolChain().SupportsObjCGC()) {
3720 GCArg->render(Args, CmdArgs);
3721 } else {
3722 // FIXME: We should move this to a hard error.
Chris Lattner0e62c1c2011-07-23 10:55:15 +00003723 D.Diag(diag::warn_drv_objc_gc_unsupported)
John McCall24fc0de2011-07-06 00:26:06 +00003724 << GCArg->getAsString(Args);
3725 }
3726 }
3727
John McCallb5f652e2011-06-22 00:53:57 +00003728 // Add exception args.
3729 addExceptionArgs(Args, InputType, getToolChain().getTriple(),
John McCall5fb5df92012-06-20 06:18:46 +00003730 KernelOrKext, objcRuntime, CmdArgs);
John McCallb5f652e2011-06-22 00:53:57 +00003731
3732 if (getToolChain().UseSjLjExceptions())
3733 CmdArgs.push_back("-fsjlj-exceptions");
3734
3735 // C++ "sane" operator new.
Daniel Dunbar2e3f2c82010-02-01 21:07:25 +00003736 if (!Args.hasFlag(options::OPT_fassume_sane_operator_new,
3737 options::OPT_fno_assume_sane_operator_new))
3738 CmdArgs.push_back("-fno-assume-sane-operator-new");
3739
Daniel Dunbar34d7a992010-04-27 15:34:57 +00003740 // -fconstant-cfstrings is default, and may be subject to argument translation
3741 // on Darwin.
3742 if (!Args.hasFlag(options::OPT_fconstant_cfstrings,
3743 options::OPT_fno_constant_cfstrings) ||
3744 !Args.hasFlag(options::OPT_mconstant_cfstrings,
3745 options::OPT_mno_constant_cfstrings))
3746 CmdArgs.push_back("-fno-constant-cfstrings");
3747
John Thompsoned4e2952009-11-05 20:14:16 +00003748 // -fshort-wchar default varies depending on platform; only
3749 // pass if specified.
Richard Bartonc9b5f352014-02-24 18:43:28 +00003750 if (Arg *A = Args.getLastArg(options::OPT_fshort_wchar,
3751 options::OPT_fno_short_wchar))
Daniel Dunbar2cb4e7a2010-04-27 15:35:03 +00003752 A->render(Args, CmdArgs);
John Thompsoned4e2952009-11-05 20:14:16 +00003753
Hans Wennborg28c96312013-07-31 23:39:13 +00003754 // -fno-pascal-strings is default, only pass non-default.
Daniel Dunbard067f7f2009-04-08 23:54:23 +00003755 if (Args.hasFlag(options::OPT_fpascal_strings,
Daniel Dunbard4510f22009-04-07 23:51:44 +00003756 options::OPT_fno_pascal_strings,
Daniel Dunbard4510f22009-04-07 23:51:44 +00003757 false))
Daniel Dunbard18049a2009-04-07 21:16:11 +00003758 CmdArgs.push_back("-fpascal-strings");
NAKAMURA Takumi029d74b2011-02-17 08:50:50 +00003759
Daniel Dunbar096ed292011-10-05 21:04:55 +00003760 // Honor -fpack-struct= and -fpack-struct, if given. Note that
3761 // -fno-pack-struct doesn't apply to -fpack-struct=.
3762 if (Arg *A = Args.getLastArg(options::OPT_fpack_struct_EQ)) {
James Molloycebf75e2012-05-02 07:56:14 +00003763 std::string PackStructStr = "-fpack-struct=";
Richard Smithbd55daf2012-11-01 04:30:05 +00003764 PackStructStr += A->getValue();
James Molloycebf75e2012-05-02 07:56:14 +00003765 CmdArgs.push_back(Args.MakeArgString(PackStructStr));
Daniel Dunbar096ed292011-10-05 21:04:55 +00003766 } else if (Args.hasFlag(options::OPT_fpack_struct,
3767 options::OPT_fno_pack_struct, false)) {
James Molloycebf75e2012-05-02 07:56:14 +00003768 CmdArgs.push_back("-fpack-struct=1");
Daniel Dunbar096ed292011-10-05 21:04:55 +00003769 }
3770
Robert Lytton0e076492013-08-13 09:43:10 +00003771 if (KernelOrKext || isNoCommonDefault(getToolChain().getTriple())) {
Fariborz Jahaniana4cfff82011-01-07 01:05:02 +00003772 if (!Args.hasArg(options::OPT_fcommon))
3773 CmdArgs.push_back("-fno-common");
Chad Rosierd9d80e02012-03-26 21:35:40 +00003774 Args.ClaimAllArgs(options::OPT_fno_common);
Fariborz Jahaniana4cfff82011-01-07 01:05:02 +00003775 }
Daniel Dunbar096ed292011-10-05 21:04:55 +00003776
Daniel Dunbard18049a2009-04-07 21:16:11 +00003777 // -fcommon is default, only pass non-default.
Fariborz Jahaniana4cfff82011-01-07 01:05:02 +00003778 else if (!Args.hasFlag(options::OPT_fcommon, options::OPT_fno_common))
Daniel Dunbard18049a2009-04-07 21:16:11 +00003779 CmdArgs.push_back("-fno-common");
3780
Daniel Dunbar2edd9232009-04-15 02:37:43 +00003781 // -fsigned-bitfields is default, and clang doesn't yet support
Daniel Dunbar6358d682010-10-15 22:30:42 +00003782 // -funsigned-bitfields.
Mike Stump11289f42009-09-09 15:08:12 +00003783 if (!Args.hasFlag(options::OPT_fsigned_bitfields,
Daniel Dunbar2edd9232009-04-15 02:37:43 +00003784 options::OPT_funsigned_bitfields))
Chris Lattner0e62c1c2011-07-23 10:55:15 +00003785 D.Diag(diag::warn_drv_clang_unsupported)
Daniel Dunbar2edd9232009-04-15 02:37:43 +00003786 << Args.getLastArg(options::OPT_funsigned_bitfields)->getAsString(Args);
3787
Daniel Dunbar6358d682010-10-15 22:30:42 +00003788 // -fsigned-bitfields is default, and clang doesn't support -fno-for-scope.
3789 if (!Args.hasFlag(options::OPT_ffor_scope,
3790 options::OPT_fno_for_scope))
Chris Lattner0e62c1c2011-07-23 10:55:15 +00003791 D.Diag(diag::err_drv_clang_unsupported)
Daniel Dunbar6358d682010-10-15 22:30:42 +00003792 << Args.getLastArg(options::OPT_fno_for_scope)->getAsString(Args);
3793
Jeffrey Yasskin460aa542010-06-08 04:56:20 +00003794 // -fcaret-diagnostics is default.
3795 if (!Args.hasFlag(options::OPT_fcaret_diagnostics,
3796 options::OPT_fno_caret_diagnostics, true))
3797 CmdArgs.push_back("-fno-caret-diagnostics");
3798
Daniel Dunbar8281bde2009-04-19 21:09:34 +00003799 // -fdiagnostics-fixit-info is default, only pass non-default.
Mike Stump11289f42009-09-09 15:08:12 +00003800 if (!Args.hasFlag(options::OPT_fdiagnostics_fixit_info,
Daniel Dunbar8281bde2009-04-19 21:09:34 +00003801 options::OPT_fno_diagnostics_fixit_info))
3802 CmdArgs.push_back("-fno-diagnostics-fixit-info");
Eric Christopher84fbdb42011-08-19 00:30:14 +00003803
Daniel Dunbar092f0cc2009-04-16 06:32:38 +00003804 // Enable -fdiagnostics-show-option by default.
Mike Stump11289f42009-09-09 15:08:12 +00003805 if (Args.hasFlag(options::OPT_fdiagnostics_show_option,
Daniel Dunbar092f0cc2009-04-16 06:32:38 +00003806 options::OPT_fno_diagnostics_show_option))
3807 CmdArgs.push_back("-fdiagnostics-show-option");
Daniel Dunbar5ec95022009-11-04 06:24:57 +00003808
Chris Lattnerbf6fac82010-05-04 21:55:25 +00003809 if (const Arg *A =
3810 Args.getLastArg(options::OPT_fdiagnostics_show_category_EQ)) {
3811 CmdArgs.push_back("-fdiagnostics-show-category");
Richard Smithbd55daf2012-11-01 04:30:05 +00003812 CmdArgs.push_back(A->getValue());
Chris Lattnerbf6fac82010-05-04 21:55:25 +00003813 }
Daniel Dunbarfe6c97b2010-08-24 16:47:49 +00003814
Douglas Gregor643c9222011-05-21 17:07:29 +00003815 if (const Arg *A =
3816 Args.getLastArg(options::OPT_fdiagnostics_format_EQ)) {
3817 CmdArgs.push_back("-fdiagnostics-format");
Richard Smithbd55daf2012-11-01 04:30:05 +00003818 CmdArgs.push_back(A->getValue());
Douglas Gregor643c9222011-05-21 17:07:29 +00003819 }
3820
Chandler Carruthb6766f02011-03-27 01:50:55 +00003821 if (Arg *A = Args.getLastArg(
3822 options::OPT_fdiagnostics_show_note_include_stack,
3823 options::OPT_fno_diagnostics_show_note_include_stack)) {
3824 if (A->getOption().matches(
3825 options::OPT_fdiagnostics_show_note_include_stack))
3826 CmdArgs.push_back("-fdiagnostics-show-note-include-stack");
3827 else
3828 CmdArgs.push_back("-fno-diagnostics-show-note-include-stack");
3829 }
3830
Daniel Dunbar5ec95022009-11-04 06:24:57 +00003831 // Color diagnostics are the default, unless the terminal doesn't support
3832 // them.
Nico Weber7e2da792013-04-17 21:52:44 +00003833 // Support both clang's -f[no-]color-diagnostics and gcc's
3834 // -f[no-]diagnostics-colors[=never|always|auto].
3835 enum { Colors_On, Colors_Off, Colors_Auto } ShowColors = Colors_Auto;
3836 for (ArgList::const_iterator it = Args.begin(), ie = Args.end();
3837 it != ie; ++it) {
3838 const Option &O = (*it)->getOption();
3839 if (!O.matches(options::OPT_fcolor_diagnostics) &&
3840 !O.matches(options::OPT_fdiagnostics_color) &&
3841 !O.matches(options::OPT_fno_color_diagnostics) &&
3842 !O.matches(options::OPT_fno_diagnostics_color) &&
3843 !O.matches(options::OPT_fdiagnostics_color_EQ))
3844 continue;
3845
3846 (*it)->claim();
3847 if (O.matches(options::OPT_fcolor_diagnostics) ||
3848 O.matches(options::OPT_fdiagnostics_color)) {
3849 ShowColors = Colors_On;
3850 } else if (O.matches(options::OPT_fno_color_diagnostics) ||
3851 O.matches(options::OPT_fno_diagnostics_color)) {
3852 ShowColors = Colors_Off;
3853 } else {
3854 assert(O.matches(options::OPT_fdiagnostics_color_EQ));
3855 StringRef value((*it)->getValue());
3856 if (value == "always")
3857 ShowColors = Colors_On;
3858 else if (value == "never")
3859 ShowColors = Colors_Off;
3860 else if (value == "auto")
3861 ShowColors = Colors_Auto;
3862 else
3863 getToolChain().getDriver().Diag(diag::err_drv_clang_unsupported)
3864 << ("-fdiagnostics-color=" + value).str();
3865 }
3866 }
3867 if (ShowColors == Colors_On ||
3868 (ShowColors == Colors_Auto && llvm::sys::Process::StandardErrHasColors()))
Daniel Dunbar5ec95022009-11-04 06:24:57 +00003869 CmdArgs.push_back("-fcolor-diagnostics");
3870
Nico Rieck7857d462013-09-11 00:38:02 +00003871 if (Args.hasArg(options::OPT_fansi_escape_codes))
3872 CmdArgs.push_back("-fansi-escape-codes");
3873
Daniel Dunbardb097022009-06-08 21:13:54 +00003874 if (!Args.hasFlag(options::OPT_fshow_source_location,
3875 options::OPT_fno_show_source_location))
3876 CmdArgs.push_back("-fno-show-source-location");
Daniel Dunbar092f0cc2009-04-16 06:32:38 +00003877
Douglas Gregor643c9222011-05-21 17:07:29 +00003878 if (!Args.hasFlag(options::OPT_fshow_column,
3879 options::OPT_fno_show_column,
3880 true))
3881 CmdArgs.push_back("-fno-show-column");
3882
Douglas Gregor8ed0c0b2010-07-09 17:35:33 +00003883 if (!Args.hasFlag(options::OPT_fspell_checking,
3884 options::OPT_fno_spell_checking))
3885 CmdArgs.push_back("-fno-spell-checking");
Daniel Dunbarfe6c97b2010-08-24 16:47:49 +00003886
Daniel Dunbar473f8a62010-10-18 22:49:46 +00003887
Chad Rosierc8e56e82012-12-05 21:08:21 +00003888 // -fno-asm-blocks is default.
3889 if (Args.hasFlag(options::OPT_fasm_blocks, options::OPT_fno_asm_blocks,
3890 false))
3891 CmdArgs.push_back("-fasm-blocks");
Daniel Dunbar473f8a62010-10-18 22:49:46 +00003892
Arnold Schwaighofer7f994ce2013-08-13 15:46:23 +00003893 // Enable vectorization per default according to the optimization level
3894 // selected. For optimization levels that want vectorization we use the alias
3895 // option to simplify the hasFlag logic.
3896 bool EnableVec = shouldEnableVectorizerAtOLevel(Args);
3897 OptSpecifier VectorizeAliasOption = EnableVec ? options::OPT_O_Group :
Chad Rosier679b0752013-04-24 18:29:59 +00003898 options::OPT_fvectorize;
Chad Rosier679b0752013-04-24 18:29:59 +00003899 if (Args.hasFlag(options::OPT_fvectorize, VectorizeAliasOption,
Hal Finkel108c46a2013-08-28 05:21:45 +00003900 options::OPT_fno_vectorize, EnableVec))
Chad Rosier0d3ed6f2012-12-11 17:12:28 +00003901 CmdArgs.push_back("-vectorize-loops");
Chad Rosier0d3ed6f2012-12-11 17:12:28 +00003902
Rafael Espindolaf818ef42013-08-01 23:56:42 +00003903 // -fslp-vectorize is default.
3904 if (Args.hasFlag(options::OPT_fslp_vectorize,
3905 options::OPT_fno_slp_vectorize, true))
Nadav Rotem0a2604d2013-04-15 04:57:18 +00003906 CmdArgs.push_back("-vectorize-slp");
Hal Finkel061f1652012-12-11 19:59:32 +00003907
Nadav Rotem6a0dd6b2013-04-15 05:38:41 +00003908 // -fno-slp-vectorize-aggressive is default.
3909 if (Args.hasFlag(options::OPT_fslp_vectorize_aggressive,
Nick Lewyckyd3f3e4f2013-06-25 01:49:44 +00003910 options::OPT_fno_slp_vectorize_aggressive, false))
Nadav Rotem6a0dd6b2013-04-15 05:38:41 +00003911 CmdArgs.push_back("-vectorize-slp-aggressive");
Nadav Rotem6a0dd6b2013-04-15 05:38:41 +00003912
Jeffrey Yasskin2b99c6f2010-06-11 05:57:47 +00003913 if (Arg *A = Args.getLastArg(options::OPT_fshow_overloads_EQ))
3914 A->render(Args, CmdArgs);
3915
Daniel Dunbarf5e9b1f2009-04-19 21:20:32 +00003916 // -fdollars-in-identifiers default varies depending on platform and
3917 // language; only pass if specified.
Mike Stump11289f42009-09-09 15:08:12 +00003918 if (Arg *A = Args.getLastArg(options::OPT_fdollars_in_identifiers,
Daniel Dunbarf5e9b1f2009-04-19 21:20:32 +00003919 options::OPT_fno_dollars_in_identifiers)) {
3920 if (A->getOption().matches(options::OPT_fdollars_in_identifiers))
Daniel Dunbar15cef0e2009-12-16 20:10:18 +00003921 CmdArgs.push_back("-fdollars-in-identifiers");
Daniel Dunbarf5e9b1f2009-04-19 21:20:32 +00003922 else
Daniel Dunbar15cef0e2009-12-16 20:10:18 +00003923 CmdArgs.push_back("-fno-dollars-in-identifiers");
Daniel Dunbarf5e9b1f2009-04-19 21:20:32 +00003924 }
3925
Daniel Dunbaradeeb052009-05-22 19:02:20 +00003926 // -funit-at-a-time is default, and we don't support -fno-unit-at-a-time for
3927 // practical purposes.
Mike Stump11289f42009-09-09 15:08:12 +00003928 if (Arg *A = Args.getLastArg(options::OPT_funit_at_a_time,
Daniel Dunbaradeeb052009-05-22 19:02:20 +00003929 options::OPT_fno_unit_at_a_time)) {
3930 if (A->getOption().matches(options::OPT_fno_unit_at_a_time))
Chris Lattner0e62c1c2011-07-23 10:55:15 +00003931 D.Diag(diag::warn_drv_clang_unsupported) << A->getAsString(Args);
Daniel Dunbaradeeb052009-05-22 19:02:20 +00003932 }
Eli Friedmanbb0d9a52009-07-14 21:58:17 +00003933
Eli Friedman055c9702011-11-02 01:53:16 +00003934 if (Args.hasFlag(options::OPT_fapple_pragma_pack,
3935 options::OPT_fno_apple_pragma_pack, false))
3936 CmdArgs.push_back("-fapple-pragma-pack");
3937
Eli Benderskyc95cfe82013-07-24 18:20:14 +00003938 // le32-specific flags:
3939 // -fno-math-builtin: clang should not convert math builtins to intrinsics
3940 // by default.
3941 if (getToolChain().getArch() == llvm::Triple::le32) {
3942 CmdArgs.push_back("-fno-math-builtin");
3943 }
3944
Daniel Dunbar2ffe0292009-09-10 03:37:02 +00003945 // Default to -fno-builtin-str{cat,cpy} on Darwin for ARM.
Daniel Dunbar4fa08112009-09-10 04:57:27 +00003946 //
Daniel Dunbar6c536aa2009-12-11 23:00:49 +00003947 // FIXME: This is disabled until clang -cc1 supports -fno-builtin-foo. PR4941.
Daniel Dunbar4fa08112009-09-10 04:57:27 +00003948#if 0
Bob Wilson6524dd32011-10-14 05:03:44 +00003949 if (getToolChain().getTriple().isOSDarwin() &&
Eli Benderskyd4a6aec2013-07-24 22:20:49 +00003950 (getToolChain().getArch() == llvm::Triple::arm ||
3951 getToolChain().getArch() == llvm::Triple::thumb)) {
Daniel Dunbar2ffe0292009-09-10 03:37:02 +00003952 if (!Args.hasArg(options::OPT_fbuiltin_strcat))
3953 CmdArgs.push_back("-fno-builtin-strcat");
3954 if (!Args.hasArg(options::OPT_fbuiltin_strcpy))
3955 CmdArgs.push_back("-fno-builtin-strcpy");
3956 }
Daniel Dunbar4fa08112009-09-10 04:57:27 +00003957#endif
Daniel Dunbar2ffe0292009-09-10 03:37:02 +00003958
Daniel Dunbar8c3d7352011-03-18 21:23:40 +00003959 // Only allow -traditional or -traditional-cpp outside in preprocessing modes.
Mike Stump11289f42009-09-09 15:08:12 +00003960 if (Arg *A = Args.getLastArg(options::OPT_traditional,
Daniel Dunbar8c3d7352011-03-18 21:23:40 +00003961 options::OPT_traditional_cpp)) {
3962 if (isa<PreprocessJobAction>(JA))
3963 CmdArgs.push_back("-traditional-cpp");
Eric Christopher84fbdb42011-08-19 00:30:14 +00003964 else
Chris Lattner0e62c1c2011-07-23 10:55:15 +00003965 D.Diag(diag::err_drv_clang_unsupported) << A->getAsString(Args);
Daniel Dunbar8c3d7352011-03-18 21:23:40 +00003966 }
Eli Friedmanbb0d9a52009-07-14 21:58:17 +00003967
Daniel Dunbara2aedc62009-03-18 10:01:51 +00003968 Args.AddLastArg(CmdArgs, options::OPT_dM);
Chris Lattnercac63f32009-04-12 01:56:53 +00003969 Args.AddLastArg(CmdArgs, options::OPT_dD);
Ted Kremeneke73d9ed2011-11-11 00:07:43 +00003970
3971 // Handle serialized diagnostics.
3972 if (Arg *A = Args.getLastArg(options::OPT__serialize_diags)) {
3973 CmdArgs.push_back("-serialize-diagnostic-file");
Richard Smithbd55daf2012-11-01 04:30:05 +00003974 CmdArgs.push_back(Args.MakeArgString(A->getValue()));
Ted Kremeneke73d9ed2011-11-11 00:07:43 +00003975 }
Daniel Dunbara2aedc62009-03-18 10:01:51 +00003976
Ted Kremenekb47e6bc2012-09-13 06:41:18 +00003977 if (Args.hasArg(options::OPT_fretain_comments_from_system_headers))
3978 CmdArgs.push_back("-fretain-comments-from-system-headers");
3979
Dmitri Gribenkoacf2e782013-02-22 14:21:27 +00003980 // Forward -fcomment-block-commands to -cc1.
3981 Args.AddAllArgs(CmdArgs, options::OPT_fcomment_block_commands);
Dmitri Gribenkoa7d16ce2013-04-10 15:35:17 +00003982 // Forward -fparse-all-comments to -cc1.
3983 Args.AddAllArgs(CmdArgs, options::OPT_fparse_all_comments);
Dmitri Gribenkoacf2e782013-02-22 14:21:27 +00003984
Daniel Dunbar76fa8402010-04-15 06:09:03 +00003985 // Forward -Xclang arguments to -cc1, and -mllvm arguments to the LLVM option
3986 // parser.
Daniel Dunbara2aedc62009-03-18 10:01:51 +00003987 Args.AddAllArgValues(CmdArgs, options::OPT_Xclang);
Daniel Dunbar76fa8402010-04-15 06:09:03 +00003988 for (arg_iterator it = Args.filtered_begin(options::OPT_mllvm),
3989 ie = Args.filtered_end(); it != ie; ++it) {
Daniel Dunbara442fd52010-06-11 22:00:13 +00003990 (*it)->claim();
Daniel Dunbar88534f42010-04-17 06:10:00 +00003991
Daniel Dunbar76fa8402010-04-15 06:09:03 +00003992 // We translate this by hand to the -cc1 argument, since nightly test uses
3993 // it and developers have been trained to spell it with -mllvm.
Richard Smithbd55daf2012-11-01 04:30:05 +00003994 if (StringRef((*it)->getValue(0)) == "-disable-llvm-optzns")
Daniel Dunbar76fa8402010-04-15 06:09:03 +00003995 CmdArgs.push_back("-disable-llvm-optzns");
3996 else
Daniel Dunbara442fd52010-06-11 22:00:13 +00003997 (*it)->render(Args, CmdArgs);
Daniel Dunbar76fa8402010-04-15 06:09:03 +00003998 }
Daniel Dunbara2aedc62009-03-18 10:01:51 +00003999
Daniel Dunbard67a3222009-03-30 06:36:42 +00004000 if (Output.getType() == types::TY_Dependencies) {
4001 // Handled with other dependency code.
Daniel Dunbar5cdf3e02009-03-19 07:29:38 +00004002 } else if (Output.isFilename()) {
Daniel Dunbara3246a02009-03-18 08:07:30 +00004003 CmdArgs.push_back("-o");
Daniel Dunbar5cdf3e02009-03-19 07:29:38 +00004004 CmdArgs.push_back(Output.getFilename());
4005 } else {
4006 assert(Output.isNothing() && "Invalid output.");
Daniel Dunbara3246a02009-03-18 08:07:30 +00004007 }
4008
Daniel Dunbara2aedc62009-03-18 10:01:51 +00004009 for (InputInfoList::const_iterator
4010 it = Inputs.begin(), ie = Inputs.end(); it != ie; ++it) {
4011 const InputInfo &II = *it;
Ben Langmuir2cb4a782014-02-05 22:21:15 +00004012
4013 addDashXForInput(Args, II, CmdArgs);
4014
Daniel Dunbarb440f562010-08-02 02:38:21 +00004015 if (II.isFilename())
Daniel Dunbar5cdf3e02009-03-19 07:29:38 +00004016 CmdArgs.push_back(II.getFilename());
Daniel Dunbara2aedc62009-03-18 10:01:51 +00004017 else
Daniel Dunbar5cdf3e02009-03-19 07:29:38 +00004018 II.getInputArg().renderAsInput(Args, CmdArgs);
Daniel Dunbara2aedc62009-03-18 10:01:51 +00004019 }
Daniel Dunbard067f7f2009-04-08 23:54:23 +00004020
Chris Lattnere9d7d782009-11-03 19:50:27 +00004021 Args.AddAllArgs(CmdArgs, options::OPT_undef);
4022
Daniel Dunbarb31b76f2010-07-18 21:16:15 +00004023 const char *Exec = getToolChain().getDriver().getClangProgramPath();
Daniel Dunbar24c7f5e2009-12-18 02:43:17 +00004024
4025 // Optionally embed the -cc1 level arguments into the debug info, for build
4026 // analysis.
4027 if (getToolChain().UseDwarfDebugFlags()) {
Daniel Dunbar7f3d9502010-06-04 18:47:06 +00004028 ArgStringList OriginalArgs;
4029 for (ArgList::const_iterator it = Args.begin(),
4030 ie = Args.end(); it != ie; ++it)
4031 (*it)->render(Args, OriginalArgs);
Daniel Dunbarfe6c97b2010-08-24 16:47:49 +00004032
Dylan Noblesmith2c1dd272012-02-05 02:13:05 +00004033 SmallString<256> Flags;
Daniel Dunbar24c7f5e2009-12-18 02:43:17 +00004034 Flags += Exec;
Daniel Dunbar7f3d9502010-06-04 18:47:06 +00004035 for (unsigned i = 0, e = OriginalArgs.size(); i != e; ++i) {
Daniel Dunbar24c7f5e2009-12-18 02:43:17 +00004036 Flags += " ";
Daniel Dunbar7f3d9502010-06-04 18:47:06 +00004037 Flags += OriginalArgs[i];
Daniel Dunbar24c7f5e2009-12-18 02:43:17 +00004038 }
4039 CmdArgs.push_back("-dwarf-debug-flags");
4040 CmdArgs.push_back(Args.MakeArgString(Flags.str()));
4041 }
4042
Eric Christopherd3804002013-02-22 20:12:52 +00004043 // Add the split debug info name to the command lines here so we
4044 // can propagate it to the backend.
4045 bool SplitDwarf = Args.hasArg(options::OPT_gsplit_dwarf) &&
Cameron Esfahani556d91e2013-09-14 01:09:11 +00004046 getToolChain().getTriple().isOSLinux() &&
Eric Christopherf1545832013-02-22 23:50:16 +00004047 (isa<AssembleJobAction>(JA) || isa<CompileJobAction>(JA));
Eric Christopherd3804002013-02-22 20:12:52 +00004048 const char *SplitDwarfOut;
4049 if (SplitDwarf) {
4050 CmdArgs.push_back("-split-dwarf-file");
4051 SplitDwarfOut = SplitDebugName(Args, Inputs);
4052 CmdArgs.push_back(SplitDwarfOut);
4053 }
4054
4055 // Finally add the compile command to the compilation.
Hans Wennborg859422a2014-01-13 22:24:42 +00004056 if (Args.hasArg(options::OPT__SLASH_fallback) &&
4057 Output.getType() == types::TY_Object) {
Hans Wennborg87cfa712013-09-19 20:32:16 +00004058 tools::visualstudio::Compile CL(getToolChain());
4059 Command *CLCommand = CL.GetCommand(C, JA, Output, Inputs, Args,
4060 LinkingOutput);
4061 C.addCommand(new FallbackCommand(JA, *this, Exec, CmdArgs, CLCommand));
4062 } else {
4063 C.addCommand(new Command(JA, *this, Exec, CmdArgs));
4064 }
4065
Daniel Dunbar17731772009-03-23 19:03:36 +00004066
Eric Christopherf1545832013-02-22 23:50:16 +00004067 // Handle the debug info splitting at object creation time if we're
4068 // creating an object.
Eric Christopher248357f2013-02-21 22:35:01 +00004069 // TODO: Currently only works on linux with newer objcopy.
Eric Christopherf1545832013-02-22 23:50:16 +00004070 if (SplitDwarf && !isa<CompileJobAction>(JA))
Eric Christopherd3804002013-02-22 20:12:52 +00004071 SplitDebugInfo(getToolChain(), C, *this, JA, Args, Output, SplitDwarfOut);
Eric Christopher248357f2013-02-21 22:35:01 +00004072
Roman Divacky178e01602011-02-10 16:52:03 +00004073 if (Arg *A = Args.getLastArg(options::OPT_pg))
4074 if (Args.hasArg(options::OPT_fomit_frame_pointer))
Chris Lattner0e62c1c2011-07-23 10:55:15 +00004075 D.Diag(diag::err_drv_argument_not_allowed_with)
Roman Divacky178e01602011-02-10 16:52:03 +00004076 << "-fomit-frame-pointer" << A->getAsString(Args);
Michael J. Spencer4c0ffa82010-10-21 03:16:25 +00004077
Daniel Dunbarc2a71892009-04-03 20:51:31 +00004078 // Claim some arguments which clang supports automatically.
4079
Daniel Dunbar3e0cac62010-04-15 06:18:42 +00004080 // -fpch-preprocess is used with gcc to add a special marker in the output to
4081 // include the PCH file. Clang's PTH solution is completely transparent, so we
4082 // do not need to deal with it at all.
Daniel Dunbarc2a71892009-04-03 20:51:31 +00004083 Args.ClaimAllArgs(options::OPT_fpch_preprocess);
Daniel Dunbard067f7f2009-04-08 23:54:23 +00004084
Daniel Dunbar17731772009-03-23 19:03:36 +00004085 // Claim some arguments which clang doesn't support, but we don't
4086 // care to warn the user about.
Daniel Dunbar44b36ee2009-11-25 11:53:23 +00004087 Args.ClaimAllArgs(options::OPT_clang_ignored_f_Group);
4088 Args.ClaimAllArgs(options::OPT_clang_ignored_m_Group);
Rafael Espindola22f603032011-02-28 23:29:45 +00004089
Rafael Espindolab0092d72013-09-04 19:37:35 +00004090 // Disable warnings for clang -E -emit-llvm foo.c
Rafael Espindolad95a8122011-03-01 05:25:27 +00004091 Args.ClaimAllArgs(options::OPT_emit_llvm);
Daniel Dunbar1a093d22009-03-18 06:00:36 +00004092}
4093
John McCall5fb5df92012-06-20 06:18:46 +00004094/// Add options related to the Objective-C runtime/ABI.
4095///
4096/// Returns true if the runtime is non-fragile.
4097ObjCRuntime Clang::AddObjCRuntimeArgs(const ArgList &args,
4098 ArgStringList &cmdArgs,
4099 RewriteKind rewriteKind) const {
4100 // Look for the controlling runtime option.
4101 Arg *runtimeArg = args.getLastArg(options::OPT_fnext_runtime,
4102 options::OPT_fgnu_runtime,
4103 options::OPT_fobjc_runtime_EQ);
4104
4105 // Just forward -fobjc-runtime= to the frontend. This supercedes
4106 // options about fragility.
4107 if (runtimeArg &&
4108 runtimeArg->getOption().matches(options::OPT_fobjc_runtime_EQ)) {
4109 ObjCRuntime runtime;
Richard Smithbd55daf2012-11-01 04:30:05 +00004110 StringRef value = runtimeArg->getValue();
John McCall5fb5df92012-06-20 06:18:46 +00004111 if (runtime.tryParse(value)) {
4112 getToolChain().getDriver().Diag(diag::err_drv_unknown_objc_runtime)
4113 << value;
4114 }
4115
4116 runtimeArg->render(args, cmdArgs);
4117 return runtime;
4118 }
4119
4120 // Otherwise, we'll need the ABI "version". Version numbers are
4121 // slightly confusing for historical reasons:
4122 // 1 - Traditional "fragile" ABI
4123 // 2 - Non-fragile ABI, version 1
4124 // 3 - Non-fragile ABI, version 2
4125 unsigned objcABIVersion = 1;
4126 // If -fobjc-abi-version= is present, use that to set the version.
4127 if (Arg *abiArg = args.getLastArg(options::OPT_fobjc_abi_version_EQ)) {
Richard Smithbd55daf2012-11-01 04:30:05 +00004128 StringRef value = abiArg->getValue();
John McCall5fb5df92012-06-20 06:18:46 +00004129 if (value == "1")
4130 objcABIVersion = 1;
4131 else if (value == "2")
4132 objcABIVersion = 2;
4133 else if (value == "3")
4134 objcABIVersion = 3;
4135 else
4136 getToolChain().getDriver().Diag(diag::err_drv_clang_unsupported)
4137 << value;
4138 } else {
4139 // Otherwise, determine if we are using the non-fragile ABI.
4140 bool nonFragileABIIsDefault =
4141 (rewriteKind == RK_NonFragile ||
4142 (rewriteKind == RK_None &&
4143 getToolChain().IsObjCNonFragileABIDefault()));
4144 if (args.hasFlag(options::OPT_fobjc_nonfragile_abi,
4145 options::OPT_fno_objc_nonfragile_abi,
4146 nonFragileABIIsDefault)) {
4147 // Determine the non-fragile ABI version to use.
4148#ifdef DISABLE_DEFAULT_NONFRAGILEABI_TWO
4149 unsigned nonFragileABIVersion = 1;
4150#else
4151 unsigned nonFragileABIVersion = 2;
4152#endif
4153
4154 if (Arg *abiArg = args.getLastArg(
4155 options::OPT_fobjc_nonfragile_abi_version_EQ)) {
Richard Smithbd55daf2012-11-01 04:30:05 +00004156 StringRef value = abiArg->getValue();
John McCall5fb5df92012-06-20 06:18:46 +00004157 if (value == "1")
4158 nonFragileABIVersion = 1;
4159 else if (value == "2")
4160 nonFragileABIVersion = 2;
4161 else
4162 getToolChain().getDriver().Diag(diag::err_drv_clang_unsupported)
4163 << value;
4164 }
4165
4166 objcABIVersion = 1 + nonFragileABIVersion;
4167 } else {
4168 objcABIVersion = 1;
4169 }
4170 }
4171
4172 // We don't actually care about the ABI version other than whether
4173 // it's non-fragile.
4174 bool isNonFragile = objcABIVersion != 1;
4175
4176 // If we have no runtime argument, ask the toolchain for its default runtime.
4177 // However, the rewriter only really supports the Mac runtime, so assume that.
4178 ObjCRuntime runtime;
4179 if (!runtimeArg) {
4180 switch (rewriteKind) {
4181 case RK_None:
4182 runtime = getToolChain().getDefaultObjCRuntime(isNonFragile);
4183 break;
4184 case RK_Fragile:
4185 runtime = ObjCRuntime(ObjCRuntime::FragileMacOSX, VersionTuple());
4186 break;
4187 case RK_NonFragile:
4188 runtime = ObjCRuntime(ObjCRuntime::MacOSX, VersionTuple());
4189 break;
4190 }
4191
4192 // -fnext-runtime
4193 } else if (runtimeArg->getOption().matches(options::OPT_fnext_runtime)) {
4194 // On Darwin, make this use the default behavior for the toolchain.
Jonathan Roelofs2cea1be2014-02-12 03:21:20 +00004195 if (getToolChain().getTriple().isOSDarwin()) {
John McCall5fb5df92012-06-20 06:18:46 +00004196 runtime = getToolChain().getDefaultObjCRuntime(isNonFragile);
4197
4198 // Otherwise, build for a generic macosx port.
4199 } else {
4200 runtime = ObjCRuntime(ObjCRuntime::MacOSX, VersionTuple());
4201 }
4202
4203 // -fgnu-runtime
4204 } else {
4205 assert(runtimeArg->getOption().matches(options::OPT_fgnu_runtime));
David Chisnall314896c2012-07-04 10:37:03 +00004206 // Legacy behaviour is to target the gnustep runtime if we are i
4207 // non-fragile mode or the GCC runtime in fragile mode.
4208 if (isNonFragile)
David Chisnalla5f59412012-10-16 15:11:55 +00004209 runtime = ObjCRuntime(ObjCRuntime::GNUstep, VersionTuple(1,6));
David Chisnall314896c2012-07-04 10:37:03 +00004210 else
4211 runtime = ObjCRuntime(ObjCRuntime::GCC, VersionTuple());
John McCall5fb5df92012-06-20 06:18:46 +00004212 }
4213
4214 cmdArgs.push_back(args.MakeArgString(
4215 "-fobjc-runtime=" + runtime.getAsString()));
4216 return runtime;
4217}
4218
Hans Wennborg75958c42013-08-08 00:17:41 +00004219void Clang::AddClangCLArgs(const ArgList &Args, ArgStringList &CmdArgs) const {
4220 unsigned RTOptionID = options::OPT__SLASH_MT;
4221
Hans Wennborgf1a74252013-09-10 20:18:04 +00004222 if (Args.hasArg(options::OPT__SLASH_LDd))
4223 // The /LDd option implies /MTd. The dependent lib part can be overridden,
4224 // but defining _DEBUG is sticky.
4225 RTOptionID = options::OPT__SLASH_MTd;
4226
Hans Wennborg9cb7d9ba2013-09-18 22:26:39 +00004227 if (Arg *A = Args.getLastArg(options::OPT__SLASH_M_Group))
Hans Wennborg75958c42013-08-08 00:17:41 +00004228 RTOptionID = A->getOption().getID();
Hans Wennborgd9ad0682013-09-11 16:38:41 +00004229
Hans Wennborg75958c42013-08-08 00:17:41 +00004230 switch(RTOptionID) {
4231 case options::OPT__SLASH_MD:
Hans Wennborgf1a74252013-09-10 20:18:04 +00004232 if (Args.hasArg(options::OPT__SLASH_LDd))
4233 CmdArgs.push_back("-D_DEBUG");
Hans Wennborg75958c42013-08-08 00:17:41 +00004234 CmdArgs.push_back("-D_MT");
4235 CmdArgs.push_back("-D_DLL");
4236 CmdArgs.push_back("--dependent-lib=msvcrt");
4237 break;
4238 case options::OPT__SLASH_MDd:
4239 CmdArgs.push_back("-D_DEBUG");
4240 CmdArgs.push_back("-D_MT");
4241 CmdArgs.push_back("-D_DLL");
4242 CmdArgs.push_back("--dependent-lib=msvcrtd");
4243 break;
4244 case options::OPT__SLASH_MT:
Hans Wennborgf1a74252013-09-10 20:18:04 +00004245 if (Args.hasArg(options::OPT__SLASH_LDd))
4246 CmdArgs.push_back("-D_DEBUG");
Hans Wennborg75958c42013-08-08 00:17:41 +00004247 CmdArgs.push_back("-D_MT");
4248 CmdArgs.push_back("--dependent-lib=libcmt");
4249 break;
4250 case options::OPT__SLASH_MTd:
4251 CmdArgs.push_back("-D_DEBUG");
4252 CmdArgs.push_back("-D_MT");
4253 CmdArgs.push_back("--dependent-lib=libcmtd");
4254 break;
4255 default:
4256 llvm_unreachable("Unexpected option ID.");
4257 }
4258
Reid Kleckner6beca0e2013-08-08 19:33:10 +00004259 // This provides POSIX compatibility (maps 'open' to '_open'), which most
4260 // users want. The /Za flag to cl.exe turns this off, but it's not
4261 // implemented in clang.
4262 CmdArgs.push_back("--dependent-lib=oldnames");
Hans Wennborg614f7072013-08-08 19:54:30 +00004263
Hans Wennborg0fd62072013-08-09 00:32:23 +00004264 if (Arg *A = Args.getLastArg(options::OPT_show_includes))
4265 A->render(Args, CmdArgs);
Hans Wennborg81f74482013-09-10 01:07:07 +00004266
Hans Wennborg7b0dcef2014-02-25 18:36:22 +00004267 // RTTI is currently not supported, so disable it by default.
4268 if (!Args.hasArg(options::OPT_frtti, options::OPT_fno_rtti))
4269 CmdArgs.push_back("-fno-rtti");
4270
David Majnemer86c318f2014-02-11 21:05:00 +00004271 const Driver &D = getToolChain().getDriver();
4272 Arg *MostGeneralArg = Args.getLastArg(options::OPT__SLASH_vmg);
4273 Arg *BestCaseArg = Args.getLastArg(options::OPT__SLASH_vmb);
4274 if (MostGeneralArg && BestCaseArg)
4275 D.Diag(clang::diag::err_drv_argument_not_allowed_with)
4276 << MostGeneralArg->getAsString(Args) << BestCaseArg->getAsString(Args);
4277
4278 if (MostGeneralArg) {
4279 Arg *SingleArg = Args.getLastArg(options::OPT__SLASH_vms);
4280 Arg *MultipleArg = Args.getLastArg(options::OPT__SLASH_vmm);
4281 Arg *VirtualArg = Args.getLastArg(options::OPT__SLASH_vmv);
4282
4283 Arg *FirstConflict = SingleArg ? SingleArg : MultipleArg;
4284 Arg *SecondConflict = VirtualArg ? VirtualArg : MultipleArg;
4285 if (FirstConflict && SecondConflict && FirstConflict != SecondConflict)
4286 D.Diag(clang::diag::err_drv_argument_not_allowed_with)
4287 << FirstConflict->getAsString(Args)
4288 << SecondConflict->getAsString(Args);
4289
4290 if (SingleArg)
4291 CmdArgs.push_back("-fms-memptr-rep=single");
4292 else if (MultipleArg)
4293 CmdArgs.push_back("-fms-memptr-rep=multiple");
4294 else
4295 CmdArgs.push_back("-fms-memptr-rep=virtual");
4296 }
4297
Reid Klecknerc0dca6d2014-02-12 23:50:26 +00004298 if (Arg *A = Args.getLastArg(options::OPT_vtordisp_mode_EQ))
4299 A->render(Args, CmdArgs);
4300
Hans Wennborg81f74482013-09-10 01:07:07 +00004301 if (!Args.hasArg(options::OPT_fdiagnostics_format_EQ)) {
4302 CmdArgs.push_back("-fdiagnostics-format");
Hans Wennborgf4aee182013-09-24 00:08:55 +00004303 if (Args.hasArg(options::OPT__SLASH_fallback))
4304 CmdArgs.push_back("msvc-fallback");
4305 else
4306 CmdArgs.push_back("msvc");
Hans Wennborg81f74482013-09-10 01:07:07 +00004307 }
Hans Wennborg75958c42013-08-08 00:17:41 +00004308}
4309
Daniel Dunbar4f5e79c2010-05-20 21:30:13 +00004310void ClangAs::ConstructJob(Compilation &C, const JobAction &JA,
Daniel Dunbar4f5e79c2010-05-20 21:30:13 +00004311 const InputInfo &Output,
4312 const InputInfoList &Inputs,
4313 const ArgList &Args,
4314 const char *LinkingOutput) const {
Daniel Dunbar4f5e79c2010-05-20 21:30:13 +00004315 ArgStringList CmdArgs;
4316
4317 assert(Inputs.size() == 1 && "Unexpected number of inputs.");
4318 const InputInfo &Input = Inputs[0];
4319
Rafael Espindolacfaadda2010-11-17 22:13:25 +00004320 // Don't warn about "clang -w -c foo.s"
4321 Args.ClaimAllArgs(options::OPT_w);
Rafael Espindolad95a8122011-03-01 05:25:27 +00004322 // and "clang -emit-llvm -c foo.s"
4323 Args.ClaimAllArgs(options::OPT_emit_llvm);
Rafael Espindolacfaadda2010-11-17 22:13:25 +00004324
Daniel Dunbar4f5e79c2010-05-20 21:30:13 +00004325 // Invoke ourselves in -cc1as mode.
4326 //
4327 // FIXME: Implement custom jobs for internal actions.
4328 CmdArgs.push_back("-cc1as");
4329
4330 // Add the "effective" target triple.
4331 CmdArgs.push_back("-triple");
Chad Rosierd3a0f952011-09-20 20:44:06 +00004332 std::string TripleStr =
4333 getToolChain().ComputeEffectiveClangTriple(Args, Input.getType());
Daniel Dunbar4f5e79c2010-05-20 21:30:13 +00004334 CmdArgs.push_back(Args.MakeArgString(TripleStr));
4335
4336 // Set the output mode, we currently only expect to be used as a real
4337 // assembler.
4338 CmdArgs.push_back("-filetype");
4339 CmdArgs.push_back("obj");
4340
Eric Christopher45f2e712012-12-18 00:31:10 +00004341 // Set the main file name, so that debug info works even with
4342 // -save-temps or preprocessed assembly.
4343 CmdArgs.push_back("-main-file-name");
4344 CmdArgs.push_back(Clang::getBaseInputName(Args, Inputs));
4345
Rafael Espindola22ce34a2013-08-20 22:12:08 +00004346 // Add the target cpu
Rafael Espindola28e1f4b2013-08-21 16:39:20 +00004347 const llvm::Triple &Triple = getToolChain().getTriple();
4348 std::string CPU = getCPUName(Args, Triple);
Rafael Espindola22ce34a2013-08-20 22:12:08 +00004349 if (!CPU.empty()) {
4350 CmdArgs.push_back("-target-cpu");
4351 CmdArgs.push_back(Args.MakeArgString(CPU));
4352 }
4353
Rafael Espindola28e1f4b2013-08-21 16:39:20 +00004354 // Add the target features
4355 const Driver &D = getToolChain().getDriver();
Rafael Espindola9c6fb0f2013-11-23 14:36:40 +00004356 getTargetFeatures(D, Triple, Args, CmdArgs, true);
Jim Grosbach576452b2012-02-10 20:37:10 +00004357
Daniel Dunbar1d733e22011-03-17 17:37:29 +00004358 // Ignore explicit -force_cpusubtype_ALL option.
4359 (void) Args.hasArg(options::OPT_force__cpusubtype__ALL);
Daniel Dunbar4f5e79c2010-05-20 21:30:13 +00004360
Eric Christopherfc3ee562012-01-10 00:38:01 +00004361 // Determine the original source input.
4362 const Action *SourceAction = &JA;
4363 while (SourceAction->getKind() != Action::InputClass) {
4364 assert(!SourceAction->getInputs().empty() && "unexpected root action!");
4365 SourceAction = SourceAction->getInputs()[0];
4366 }
4367
Chandler Carruth4d5e1a92012-12-17 21:40:04 +00004368 // Forward -g and handle debug info related flags, assuming we are dealing
4369 // with an actual assembly file.
Eric Christopherfc3ee562012-01-10 00:38:01 +00004370 if (SourceAction->getType() == types::TY_Asm ||
4371 SourceAction->getType() == types::TY_PP_Asm) {
4372 Args.ClaimAllArgs(options::OPT_g_Group);
4373 if (Arg *A = Args.getLastArg(options::OPT_g_Group))
4374 if (!A->getOption().matches(options::OPT_g0))
4375 CmdArgs.push_back("-g");
Chandler Carruth4d5e1a92012-12-17 21:40:04 +00004376
4377 // Add the -fdebug-compilation-dir flag if needed.
4378 addDebugCompDirArg(Args, CmdArgs);
Kevin Enderbyae2ec472013-01-17 21:38:06 +00004379
4380 // Set the AT_producer to the clang version when using the integrated
4381 // assembler on assembly source files.
4382 CmdArgs.push_back("-dwarf-debug-producer");
4383 CmdArgs.push_back(Args.MakeArgString(getClangFullVersion()));
Eric Christopherfc3ee562012-01-10 00:38:01 +00004384 }
Kevin Enderby292dc082011-12-22 19:31:58 +00004385
4386 // Optionally embed the -cc1as level arguments into the debug info, for build
4387 // analysis.
4388 if (getToolChain().UseDwarfDebugFlags()) {
4389 ArgStringList OriginalArgs;
4390 for (ArgList::const_iterator it = Args.begin(),
4391 ie = Args.end(); it != ie; ++it)
4392 (*it)->render(Args, OriginalArgs);
4393
Dylan Noblesmith2c1dd272012-02-05 02:13:05 +00004394 SmallString<256> Flags;
Kevin Enderby292dc082011-12-22 19:31:58 +00004395 const char *Exec = getToolChain().getDriver().getClangProgramPath();
4396 Flags += Exec;
4397 for (unsigned i = 0, e = OriginalArgs.size(); i != e; ++i) {
4398 Flags += " ";
4399 Flags += OriginalArgs[i];
4400 }
4401 CmdArgs.push_back("-dwarf-debug-flags");
4402 CmdArgs.push_back(Args.MakeArgString(Flags.str()));
4403 }
Daniel Dunbar4f5e79c2010-05-20 21:30:13 +00004404
4405 // FIXME: Add -static support, once we have it.
4406
David Blaikie372d9502014-01-17 03:17:40 +00004407 // Consume all the warning flags. Usually this would be handled more
4408 // gracefully by -cc1 (warning about unknown warning flags, etc) but -cc1as
4409 // doesn't handle that so rather than warning about unused flags that are
4410 // actually used, we'll lie by omission instead.
4411 // FIXME: Stop lying and consume only the appropriate driver flags
4412 for (arg_iterator it = Args.filtered_begin(options::OPT_W_Group),
4413 ie = Args.filtered_end();
4414 it != ie; ++it)
4415 (*it)->claim();
4416
David Blaikie9260ed62013-07-25 21:19:01 +00004417 CollectArgsForIntegratedAssembler(C, Args, CmdArgs,
4418 getToolChain().getDriver());
4419
Daniel Dunbar252e8f92011-04-29 17:53:18 +00004420 Args.AddAllArgs(CmdArgs, options::OPT_mllvm);
Daniel Dunbar4f5e79c2010-05-20 21:30:13 +00004421
4422 assert(Output.isFilename() && "Unexpected lipo output.");
4423 CmdArgs.push_back("-o");
4424 CmdArgs.push_back(Output.getFilename());
4425
Daniel Dunbarb440f562010-08-02 02:38:21 +00004426 assert(Input.isFilename() && "Invalid input.");
4427 CmdArgs.push_back(Input.getFilename());
Daniel Dunbar4f5e79c2010-05-20 21:30:13 +00004428
Daniel Dunbarb31b76f2010-07-18 21:16:15 +00004429 const char *Exec = getToolChain().getDriver().getClangProgramPath();
Daniel Dunbar7fbaf532010-08-02 02:38:28 +00004430 C.addCommand(new Command(JA, *this, Exec, CmdArgs));
Eric Christophera75018a2013-04-10 21:30:40 +00004431
4432 // Handle the debug info splitting at object creation time if we're
4433 // creating an object.
4434 // TODO: Currently only works on linux with newer objcopy.
4435 if (Args.hasArg(options::OPT_gsplit_dwarf) &&
Cameron Esfahani556d91e2013-09-14 01:09:11 +00004436 getToolChain().getTriple().isOSLinux())
Eric Christophera75018a2013-04-10 21:30:40 +00004437 SplitDebugInfo(getToolChain(), C, *this, JA, Args, Output,
4438 SplitDebugName(Args, Inputs));
Daniel Dunbar4f5e79c2010-05-20 21:30:13 +00004439}
4440
Daniel Dunbara3246a02009-03-18 08:07:30 +00004441void gcc::Common::ConstructJob(Compilation &C, const JobAction &JA,
Daniel Dunbara3246a02009-03-18 08:07:30 +00004442 const InputInfo &Output,
4443 const InputInfoList &Inputs,
Daniel Dunbara2aedc62009-03-18 10:01:51 +00004444 const ArgList &Args,
Daniel Dunbara3246a02009-03-18 08:07:30 +00004445 const char *LinkingOutput) const {
Daniel Dunbar083edf72009-12-21 18:54:17 +00004446 const Driver &D = getToolChain().getDriver();
Daniel Dunbara3246a02009-03-18 08:07:30 +00004447 ArgStringList CmdArgs;
Daniel Dunbar1a093d22009-03-18 06:00:36 +00004448
Daniel Dunbard067f7f2009-04-08 23:54:23 +00004449 for (ArgList::const_iterator
Daniel Dunbara2aedc62009-03-18 10:01:51 +00004450 it = Args.begin(), ie = Args.end(); it != ie; ++it) {
Daniel Dunbara3246a02009-03-18 08:07:30 +00004451 Arg *A = *it;
Michael J. Spencer66e2b202012-10-19 22:37:06 +00004452 if (forwardToGCC(A->getOption())) {
Daniel Dunbar939c1212010-08-03 16:14:14 +00004453 // Don't forward any -g arguments to assembly steps.
4454 if (isa<AssembleJobAction>(JA) &&
4455 A->getOption().matches(options::OPT_g_Group))
4456 continue;
4457
NAKAMURA Takumi053704f2013-08-19 11:51:51 +00004458 // Don't forward any -W arguments to assembly and link steps.
4459 if ((isa<AssembleJobAction>(JA) || isa<LinkJobAction>(JA)) &&
4460 A->getOption().matches(options::OPT_W_Group))
4461 continue;
4462
Daniel Dunbar2da02722009-03-19 07:55:12 +00004463 // It is unfortunate that we have to claim here, as this means
4464 // we will basically never report anything interesting for
Daniel Dunbar5716d872009-05-02 21:41:52 +00004465 // platforms using a generic gcc, even if we are just using gcc
4466 // to get to the assembler.
Daniel Dunbar2da02722009-03-19 07:55:12 +00004467 A->claim();
Daniel Dunbara2aedc62009-03-18 10:01:51 +00004468 A->render(Args, CmdArgs);
Daniel Dunbar2da02722009-03-19 07:55:12 +00004469 }
Daniel Dunbara3246a02009-03-18 08:07:30 +00004470 }
Daniel Dunbard067f7f2009-04-08 23:54:23 +00004471
Daniel Dunbar4e295052010-01-25 22:35:08 +00004472 RenderExtraToolArgs(JA, CmdArgs);
Daniel Dunbara3246a02009-03-18 08:07:30 +00004473
4474 // If using a driver driver, force the arch.
Rafael Espindola35ca7d92012-10-07 04:44:33 +00004475 llvm::Triple::ArchType Arch = getToolChain().getArch();
Jonathan Roelofs2cea1be2014-02-12 03:21:20 +00004476 if (getToolChain().getTriple().isOSDarwin()) {
Daniel Dunbara3246a02009-03-18 08:07:30 +00004477 CmdArgs.push_back("-arch");
Daniel Dunbar0a05d932009-04-01 20:33:11 +00004478
4479 // FIXME: Remove these special cases.
Rafael Espindola35ca7d92012-10-07 04:44:33 +00004480 if (Arch == llvm::Triple::ppc)
Daniel Dunbar5bbebfe2009-05-22 02:21:04 +00004481 CmdArgs.push_back("ppc");
Rafael Espindola35ca7d92012-10-07 04:44:33 +00004482 else if (Arch == llvm::Triple::ppc64)
Daniel Dunbar5bbebfe2009-05-22 02:21:04 +00004483 CmdArgs.push_back("ppc64");
Bill Schmidt778d3872013-07-26 01:36:11 +00004484 else if (Arch == llvm::Triple::ppc64le)
4485 CmdArgs.push_back("ppc64le");
Daniel Dunbar5bbebfe2009-05-22 02:21:04 +00004486 else
Rafael Espindola35ca7d92012-10-07 04:44:33 +00004487 CmdArgs.push_back(Args.MakeArgString(getToolChain().getArchName()));
Daniel Dunbara3246a02009-03-18 08:07:30 +00004488 }
4489
Daniel Dunbar5716d872009-05-02 21:41:52 +00004490 // Try to force gcc to match the tool chain we want, if we recognize
4491 // the arch.
Daniel Dunbar5bbebfe2009-05-22 02:21:04 +00004492 //
4493 // FIXME: The triple class should directly provide the information we want
4494 // here.
Rafael Espindola35ca7d92012-10-07 04:44:33 +00004495 if (Arch == llvm::Triple::x86 || Arch == llvm::Triple::ppc)
Daniel Dunbar5716d872009-05-02 21:41:52 +00004496 CmdArgs.push_back("-m32");
Bill Schmidt778d3872013-07-26 01:36:11 +00004497 else if (Arch == llvm::Triple::x86_64 || Arch == llvm::Triple::ppc64 ||
4498 Arch == llvm::Triple::ppc64le)
Daniel Dunbar5716d872009-05-02 21:41:52 +00004499 CmdArgs.push_back("-m64");
4500
Daniel Dunbarb440f562010-08-02 02:38:21 +00004501 if (Output.isFilename()) {
Daniel Dunbara3246a02009-03-18 08:07:30 +00004502 CmdArgs.push_back("-o");
Daniel Dunbar5cdf3e02009-03-19 07:29:38 +00004503 CmdArgs.push_back(Output.getFilename());
4504 } else {
4505 assert(Output.isNothing() && "Unexpected output");
Daniel Dunbara3246a02009-03-18 08:07:30 +00004506 CmdArgs.push_back("-fsyntax-only");
Daniel Dunbar5cdf3e02009-03-19 07:29:38 +00004507 }
Daniel Dunbara3246a02009-03-18 08:07:30 +00004508
Tony Linthicum76329bf2011-12-12 21:14:55 +00004509 Args.AddAllArgValues(CmdArgs, options::OPT_Wa_COMMA,
4510 options::OPT_Xassembler);
Daniel Dunbara3246a02009-03-18 08:07:30 +00004511
4512 // Only pass -x if gcc will understand it; otherwise hope gcc
4513 // understands the suffix correctly. The main use case this would go
4514 // wrong in is for linker inputs if they happened to have an odd
4515 // suffix; really the only way to get this to happen is a command
4516 // like '-x foobar a.c' which will treat a.c like a linker input.
4517 //
4518 // FIXME: For the linker case specifically, can we safely convert
4519 // inputs into '-Wl,' options?
4520 for (InputInfoList::const_iterator
4521 it = Inputs.begin(), ie = Inputs.end(); it != ie; ++it) {
4522 const InputInfo &II = *it;
Daniel Dunbare3e263f2009-05-02 20:14:53 +00004523
Daniel Dunbar6cdf83c2009-09-01 16:57:46 +00004524 // Don't try to pass LLVM or AST inputs to a generic gcc.
Daniel Dunbar24e52992010-06-07 23:28:45 +00004525 if (II.getType() == types::TY_LLVM_IR || II.getType() == types::TY_LTO_IR ||
4526 II.getType() == types::TY_LLVM_BC || II.getType() == types::TY_LTO_BC)
Chris Lattner0e62c1c2011-07-23 10:55:15 +00004527 D.Diag(diag::err_drv_no_linker_llvm_support)
Daniel Dunbar1c28f1e2009-09-09 22:32:48 +00004528 << getToolChain().getTripleString();
Daniel Dunbar6cdf83c2009-09-01 16:57:46 +00004529 else if (II.getType() == types::TY_AST)
Chris Lattner0e62c1c2011-07-23 10:55:15 +00004530 D.Diag(diag::err_drv_no_ast_support)
Daniel Dunbar1c28f1e2009-09-09 22:32:48 +00004531 << getToolChain().getTripleString();
Douglas Gregorbf7fc9c2013-03-27 16:47:18 +00004532 else if (II.getType() == types::TY_ModuleFile)
4533 D.Diag(diag::err_drv_no_module_support)
4534 << getToolChain().getTripleString();
Daniel Dunbare3e263f2009-05-02 20:14:53 +00004535
Daniel Dunbara3246a02009-03-18 08:07:30 +00004536 if (types::canTypeBeUserSpecified(II.getType())) {
4537 CmdArgs.push_back("-x");
4538 CmdArgs.push_back(types::getTypeName(II.getType()));
4539 }
4540
Daniel Dunbarb440f562010-08-02 02:38:21 +00004541 if (II.isFilename())
Daniel Dunbar5cdf3e02009-03-19 07:29:38 +00004542 CmdArgs.push_back(II.getFilename());
Daniel Dunbarf2476752010-09-25 18:10:05 +00004543 else {
4544 const Arg &A = II.getInputArg();
4545
4546 // Reverse translate some rewritten options.
4547 if (A.getOption().matches(options::OPT_Z_reserved_lib_stdcxx)) {
4548 CmdArgs.push_back("-lstdc++");
4549 continue;
4550 }
4551
Daniel Dunbar5cdf3e02009-03-19 07:29:38 +00004552 // Don't render as input, we need gcc to do the translations.
Daniel Dunbarf2476752010-09-25 18:10:05 +00004553 A.render(Args, CmdArgs);
4554 }
Daniel Dunbara3246a02009-03-18 08:07:30 +00004555 }
4556
Dylan Noblesmith70e73a32011-04-09 13:31:59 +00004557 const std::string customGCCName = D.getCCCGenericGCCName();
4558 const char *GCCName;
4559 if (!customGCCName.empty())
4560 GCCName = customGCCName.c_str();
Hans Wennborg70850d82013-07-18 20:29:38 +00004561 else if (D.CCCIsCXX()) {
Dylan Noblesmith70e73a32011-04-09 13:31:59 +00004562 GCCName = "g++";
Dylan Noblesmith70e73a32011-04-09 13:31:59 +00004563 } else
4564 GCCName = "gcc";
4565
Daniel Dunbard067f7f2009-04-08 23:54:23 +00004566 const char *Exec =
Daniel Dunbar9c3ed5f2010-07-14 18:46:23 +00004567 Args.MakeArgString(getToolChain().GetProgramPath(GCCName));
Daniel Dunbar7fbaf532010-08-02 02:38:28 +00004568 C.addCommand(new Command(JA, *this, Exec, CmdArgs));
Daniel Dunbar1a093d22009-03-18 06:00:36 +00004569}
4570
Daniel Dunbar4e295052010-01-25 22:35:08 +00004571void gcc::Preprocess::RenderExtraToolArgs(const JobAction &JA,
4572 ArgStringList &CmdArgs) const {
Daniel Dunbara3246a02009-03-18 08:07:30 +00004573 CmdArgs.push_back("-E");
Daniel Dunbar1a093d22009-03-18 06:00:36 +00004574}
4575
Daniel Dunbar4e295052010-01-25 22:35:08 +00004576void gcc::Compile::RenderExtraToolArgs(const JobAction &JA,
4577 ArgStringList &CmdArgs) const {
Daniel Dunbaraeea8ac2010-02-11 03:16:21 +00004578 const Driver &D = getToolChain().getDriver();
4579
Daniel Dunbar4e295052010-01-25 22:35:08 +00004580 // If -flto, etc. are present then make sure not to force assembly output.
Daniel Dunbar24e52992010-06-07 23:28:45 +00004581 if (JA.getType() == types::TY_LLVM_IR || JA.getType() == types::TY_LTO_IR ||
4582 JA.getType() == types::TY_LLVM_BC || JA.getType() == types::TY_LTO_BC)
Daniel Dunbar4e295052010-01-25 22:35:08 +00004583 CmdArgs.push_back("-c");
Daniel Dunbaraeea8ac2010-02-11 03:16:21 +00004584 else {
4585 if (JA.getType() != types::TY_PP_Asm)
Chris Lattner0e62c1c2011-07-23 10:55:15 +00004586 D.Diag(diag::err_drv_invalid_gcc_output_type)
Daniel Dunbaraeea8ac2010-02-11 03:16:21 +00004587 << getTypeName(JA.getType());
Michael J. Spencer4c0ffa82010-10-21 03:16:25 +00004588
Daniel Dunbar4e295052010-01-25 22:35:08 +00004589 CmdArgs.push_back("-S");
Daniel Dunbaraeea8ac2010-02-11 03:16:21 +00004590 }
Daniel Dunbar1a093d22009-03-18 06:00:36 +00004591}
4592
Daniel Dunbar4e295052010-01-25 22:35:08 +00004593void gcc::Link::RenderExtraToolArgs(const JobAction &JA,
4594 ArgStringList &CmdArgs) const {
Daniel Dunbara3246a02009-03-18 08:07:30 +00004595 // The types are (hopefully) good enough.
4596}
4597
Tony Linthicum76329bf2011-12-12 21:14:55 +00004598// Hexagon tools start.
4599void hexagon::Assemble::RenderExtraToolArgs(const JobAction &JA,
4600 ArgStringList &CmdArgs) const {
4601
4602}
4603void hexagon::Assemble::ConstructJob(Compilation &C, const JobAction &JA,
4604 const InputInfo &Output,
4605 const InputInfoList &Inputs,
4606 const ArgList &Args,
4607 const char *LinkingOutput) const {
4608
4609 const Driver &D = getToolChain().getDriver();
4610 ArgStringList CmdArgs;
4611
4612 std::string MarchString = "-march=";
Matthew Curtisf10a5952012-12-06 14:16:43 +00004613 MarchString += toolchains::Hexagon_TC::GetTargetCPU(Args);
Tony Linthicum76329bf2011-12-12 21:14:55 +00004614 CmdArgs.push_back(Args.MakeArgString(MarchString));
4615
4616 RenderExtraToolArgs(JA, CmdArgs);
4617
4618 if (Output.isFilename()) {
4619 CmdArgs.push_back("-o");
4620 CmdArgs.push_back(Output.getFilename());
4621 } else {
4622 assert(Output.isNothing() && "Unexpected output");
4623 CmdArgs.push_back("-fsyntax-only");
4624 }
4625
Matthew Curtise8f80a12012-12-06 17:49:03 +00004626 std::string SmallDataThreshold = GetHexagonSmallDataThresholdValue(Args);
4627 if (!SmallDataThreshold.empty())
4628 CmdArgs.push_back(
4629 Args.MakeArgString(std::string("-G") + SmallDataThreshold));
Tony Linthicum76329bf2011-12-12 21:14:55 +00004630
Matthew Curtise5df3812012-12-07 17:23:04 +00004631 Args.AddAllArgValues(CmdArgs, options::OPT_Wa_COMMA,
4632 options::OPT_Xassembler);
4633
Tony Linthicum76329bf2011-12-12 21:14:55 +00004634 // Only pass -x if gcc will understand it; otherwise hope gcc
4635 // understands the suffix correctly. The main use case this would go
4636 // wrong in is for linker inputs if they happened to have an odd
4637 // suffix; really the only way to get this to happen is a command
4638 // like '-x foobar a.c' which will treat a.c like a linker input.
4639 //
4640 // FIXME: For the linker case specifically, can we safely convert
4641 // inputs into '-Wl,' options?
4642 for (InputInfoList::const_iterator
4643 it = Inputs.begin(), ie = Inputs.end(); it != ie; ++it) {
4644 const InputInfo &II = *it;
4645
4646 // Don't try to pass LLVM or AST inputs to a generic gcc.
4647 if (II.getType() == types::TY_LLVM_IR || II.getType() == types::TY_LTO_IR ||
4648 II.getType() == types::TY_LLVM_BC || II.getType() == types::TY_LTO_BC)
4649 D.Diag(clang::diag::err_drv_no_linker_llvm_support)
4650 << getToolChain().getTripleString();
4651 else if (II.getType() == types::TY_AST)
4652 D.Diag(clang::diag::err_drv_no_ast_support)
4653 << getToolChain().getTripleString();
Douglas Gregorbf7fc9c2013-03-27 16:47:18 +00004654 else if (II.getType() == types::TY_ModuleFile)
4655 D.Diag(diag::err_drv_no_module_support)
4656 << getToolChain().getTripleString();
Tony Linthicum76329bf2011-12-12 21:14:55 +00004657
4658 if (II.isFilename())
4659 CmdArgs.push_back(II.getFilename());
4660 else
4661 // Don't render as input, we need gcc to do the translations. FIXME: Pranav: What is this ?
4662 II.getInputArg().render(Args, CmdArgs);
4663 }
4664
4665 const char *GCCName = "hexagon-as";
4666 const char *Exec =
4667 Args.MakeArgString(getToolChain().GetProgramPath(GCCName));
4668 C.addCommand(new Command(JA, *this, Exec, CmdArgs));
4669
4670}
4671void hexagon::Link::RenderExtraToolArgs(const JobAction &JA,
4672 ArgStringList &CmdArgs) const {
4673 // The types are (hopefully) good enough.
4674}
4675
4676void hexagon::Link::ConstructJob(Compilation &C, const JobAction &JA,
4677 const InputInfo &Output,
4678 const InputInfoList &Inputs,
4679 const ArgList &Args,
4680 const char *LinkingOutput) const {
4681
Matthew Curtise689b052012-12-06 15:46:07 +00004682 const toolchains::Hexagon_TC& ToolChain =
4683 static_cast<const toolchains::Hexagon_TC&>(getToolChain());
4684 const Driver &D = ToolChain.getDriver();
4685
Tony Linthicum76329bf2011-12-12 21:14:55 +00004686 ArgStringList CmdArgs;
4687
Matthew Curtise689b052012-12-06 15:46:07 +00004688 //----------------------------------------------------------------------------
4689 //
4690 //----------------------------------------------------------------------------
4691 bool hasStaticArg = Args.hasArg(options::OPT_static);
4692 bool buildingLib = Args.hasArg(options::OPT_shared);
Matthew Curtise8f80a12012-12-06 17:49:03 +00004693 bool buildPIE = Args.hasArg(options::OPT_pie);
Matthew Curtise689b052012-12-06 15:46:07 +00004694 bool incStdLib = !Args.hasArg(options::OPT_nostdlib);
4695 bool incStartFiles = !Args.hasArg(options::OPT_nostartfiles);
4696 bool incDefLibs = !Args.hasArg(options::OPT_nodefaultlibs);
4697 bool useShared = buildingLib && !hasStaticArg;
Tony Linthicum76329bf2011-12-12 21:14:55 +00004698
Matthew Curtise689b052012-12-06 15:46:07 +00004699 //----------------------------------------------------------------------------
4700 // Silence warnings for various options
4701 //----------------------------------------------------------------------------
Tony Linthicum76329bf2011-12-12 21:14:55 +00004702
Matthew Curtise689b052012-12-06 15:46:07 +00004703 Args.ClaimAllArgs(options::OPT_g_Group);
4704 Args.ClaimAllArgs(options::OPT_emit_llvm);
4705 Args.ClaimAllArgs(options::OPT_w); // Other warning options are already
4706 // handled somewhere else.
4707 Args.ClaimAllArgs(options::OPT_static_libgcc);
4708
4709 //----------------------------------------------------------------------------
4710 //
4711 //----------------------------------------------------------------------------
4712 for (std::vector<std::string>::const_iterator i = ToolChain.ExtraOpts.begin(),
4713 e = ToolChain.ExtraOpts.end();
4714 i != e; ++i)
4715 CmdArgs.push_back(i->c_str());
Tony Linthicum76329bf2011-12-12 21:14:55 +00004716
Matthew Curtisf10a5952012-12-06 14:16:43 +00004717 std::string MarchString = toolchains::Hexagon_TC::GetTargetCPU(Args);
4718 CmdArgs.push_back(Args.MakeArgString("-m" + MarchString));
Sebastian Pop86500282012-01-13 20:37:10 +00004719
Matthew Curtise689b052012-12-06 15:46:07 +00004720 if (buildingLib) {
4721 CmdArgs.push_back("-shared");
4722 CmdArgs.push_back("-call_shared"); // should be the default, but doing as
4723 // hexagon-gcc does
Tony Linthicum76329bf2011-12-12 21:14:55 +00004724 }
4725
Matthew Curtise689b052012-12-06 15:46:07 +00004726 if (hasStaticArg)
4727 CmdArgs.push_back("-static");
Tony Linthicum76329bf2011-12-12 21:14:55 +00004728
Matthew Curtise8f80a12012-12-06 17:49:03 +00004729 if (buildPIE && !buildingLib)
4730 CmdArgs.push_back("-pie");
4731
4732 std::string SmallDataThreshold = GetHexagonSmallDataThresholdValue(Args);
4733 if (!SmallDataThreshold.empty()) {
4734 CmdArgs.push_back(
4735 Args.MakeArgString(std::string("-G") + SmallDataThreshold));
4736 }
4737
Matthew Curtise689b052012-12-06 15:46:07 +00004738 //----------------------------------------------------------------------------
4739 //
4740 //----------------------------------------------------------------------------
4741 CmdArgs.push_back("-o");
4742 CmdArgs.push_back(Output.getFilename());
Tony Linthicum76329bf2011-12-12 21:14:55 +00004743
Matthew Curtise689b052012-12-06 15:46:07 +00004744 const std::string MarchSuffix = "/" + MarchString;
4745 const std::string G0Suffix = "/G0";
4746 const std::string MarchG0Suffix = MarchSuffix + G0Suffix;
4747 const std::string RootDir = toolchains::Hexagon_TC::GetGnuDir(D.InstalledDir)
4748 + "/";
4749 const std::string StartFilesDir = RootDir
4750 + "hexagon/lib"
4751 + (buildingLib
4752 ? MarchG0Suffix : MarchSuffix);
4753
4754 //----------------------------------------------------------------------------
4755 // moslib
4756 //----------------------------------------------------------------------------
4757 std::vector<std::string> oslibs;
4758 bool hasStandalone= false;
4759
4760 for (arg_iterator it = Args.filtered_begin(options::OPT_moslib_EQ),
4761 ie = Args.filtered_end(); it != ie; ++it) {
4762 (*it)->claim();
4763 oslibs.push_back((*it)->getValue());
4764 hasStandalone = hasStandalone || (oslibs.back() == "standalone");
Tony Linthicum76329bf2011-12-12 21:14:55 +00004765 }
Matthew Curtise689b052012-12-06 15:46:07 +00004766 if (oslibs.empty()) {
4767 oslibs.push_back("standalone");
4768 hasStandalone = true;
4769 }
Tony Linthicum76329bf2011-12-12 21:14:55 +00004770
Matthew Curtise689b052012-12-06 15:46:07 +00004771 //----------------------------------------------------------------------------
4772 // Start Files
4773 //----------------------------------------------------------------------------
4774 if (incStdLib && incStartFiles) {
4775
4776 if (!buildingLib) {
4777 if (hasStandalone) {
4778 CmdArgs.push_back(
4779 Args.MakeArgString(StartFilesDir + "/crt0_standalone.o"));
4780 }
4781 CmdArgs.push_back(Args.MakeArgString(StartFilesDir + "/crt0.o"));
4782 }
4783 std::string initObj = useShared ? "/initS.o" : "/init.o";
4784 CmdArgs.push_back(Args.MakeArgString(StartFilesDir + initObj));
4785 }
4786
4787 //----------------------------------------------------------------------------
4788 // Library Search Paths
4789 //----------------------------------------------------------------------------
4790 const ToolChain::path_list &LibPaths = ToolChain.getFilePaths();
4791 for (ToolChain::path_list::const_iterator
4792 i = LibPaths.begin(),
4793 e = LibPaths.end();
4794 i != e;
4795 ++i)
4796 CmdArgs.push_back(Args.MakeArgString(StringRef("-L") + *i));
4797
4798 //----------------------------------------------------------------------------
4799 //
4800 //----------------------------------------------------------------------------
4801 Args.AddAllArgs(CmdArgs, options::OPT_T_Group);
4802 Args.AddAllArgs(CmdArgs, options::OPT_e);
4803 Args.AddAllArgs(CmdArgs, options::OPT_s);
4804 Args.AddAllArgs(CmdArgs, options::OPT_t);
4805 Args.AddAllArgs(CmdArgs, options::OPT_u_Group);
4806
4807 AddLinkerInputs(ToolChain, Inputs, Args, CmdArgs);
4808
4809 //----------------------------------------------------------------------------
4810 // Libraries
4811 //----------------------------------------------------------------------------
4812 if (incStdLib && incDefLibs) {
Hans Wennborg70850d82013-07-18 20:29:38 +00004813 if (D.CCCIsCXX()) {
Matthew Curtise689b052012-12-06 15:46:07 +00004814 ToolChain.AddCXXStdlibLibArgs(Args, CmdArgs);
4815 CmdArgs.push_back("-lm");
4816 }
4817
4818 CmdArgs.push_back("--start-group");
4819
4820 if (!buildingLib) {
4821 for(std::vector<std::string>::iterator i = oslibs.begin(),
4822 e = oslibs.end(); i != e; ++i)
4823 CmdArgs.push_back(Args.MakeArgString("-l" + *i));
4824 CmdArgs.push_back("-lc");
4825 }
4826 CmdArgs.push_back("-lgcc");
4827
4828 CmdArgs.push_back("--end-group");
4829 }
4830
4831 //----------------------------------------------------------------------------
4832 // End files
4833 //----------------------------------------------------------------------------
4834 if (incStdLib && incStartFiles) {
4835 std::string finiObj = useShared ? "/finiS.o" : "/fini.o";
4836 CmdArgs.push_back(Args.MakeArgString(StartFilesDir + finiObj));
4837 }
4838
4839 std::string Linker = ToolChain.GetProgramPath("hexagon-ld");
Benjamin Kramerb2ccade2013-10-21 12:33:55 +00004840 C.addCommand(new Command(JA, *this, Args.MakeArgString(Linker), CmdArgs));
Tony Linthicum76329bf2011-12-12 21:14:55 +00004841}
4842// Hexagon tools end.
4843
Bernard Ogden31561762013-12-12 13:27:11 +00004844/// getARMCPUForMArch - Get the (LLVM) name of the minimum ARM CPU for the arch we are targeting
4845//
4846// FIXME: tblgen this.
4847const char *arm::getARMCPUForMArch(const ArgList &Args,
4848 const llvm::Triple &Triple) {
4849 StringRef MArch;
4850 if (Arg *A = Args.getLastArg(options::OPT_march_EQ)) {
4851 // Otherwise, if we have -march= choose the base CPU for that arch.
4852 MArch = A->getValue();
4853 } else {
4854 // Otherwise, use the Arch from the triple.
4855 MArch = Triple.getArchName();
4856 }
4857
4858 // Handle -march=native.
Bernard Ogden31561762013-12-12 13:27:11 +00004859 if (MArch == "native") {
4860 std::string CPU = llvm::sys::getHostCPUName();
4861 if (CPU != "generic") {
4862 // Translate the native cpu into the architecture. The switch below will
4863 // then chose the minimum cpu for that arch.
Bernard Ogdenf6ba17d2013-12-12 13:27:15 +00004864 MArch = std::string("arm") + arm::getLLVMArchSuffixForARM(CPU);
Bernard Ogden31561762013-12-12 13:27:11 +00004865 }
4866 }
4867
Saleem Abdulrasoolf4c9e492014-04-04 20:31:19 +00004868 switch (Triple.getOS()) {
4869 case llvm::Triple::NetBSD:
Bernard Ogden31561762013-12-12 13:27:11 +00004870 if (MArch == "armv6")
4871 return "arm1176jzf-s";
Saleem Abdulrasoolf4c9e492014-04-04 20:31:19 +00004872 break;
4873 case llvm::Triple::Win32:
4874 // FIXME: this is invalid for WindowsCE
4875 return "cortex-a9";
4876 default:
4877 break;
Bernard Ogden31561762013-12-12 13:27:11 +00004878 }
4879
4880 const char *result = llvm::StringSwitch<const char *>(MArch)
4881 .Cases("armv2", "armv2a","arm2")
4882 .Case("armv3", "arm6")
4883 .Case("armv3m", "arm7m")
4884 .Case("armv4", "strongarm")
4885 .Case("armv4t", "arm7tdmi")
4886 .Case("thumbv4t", "arm7tdmi")
4887 .Cases("armv5", "armv5t", "arm10tdmi")
4888 .Cases("thumbv5", "thumbv5t", "arm10tdmi")
4889 .Cases("armv5e", "armv5te", "arm1022e")
4890 .Cases("thumbv5e", "thumbv5te", "arm1022e")
4891 .Case("armv5tej", "arm926ej-s")
4892 .Case("thumbv5tej", "arm926ej-s")
4893 .Cases("armv6", "armv6k", "arm1136jf-s")
4894 .Cases("thumbv6", "thumbv6k", "arm1136jf-s")
4895 .Case("armv6j", "arm1136j-s")
4896 .Case("thumbv6j", "arm1136j-s")
4897 .Cases("armv6z", "armv6zk", "arm1176jzf-s")
4898 .Cases("thumbv6z", "thumbv6zk", "arm1176jzf-s")
4899 .Case("armv6t2", "arm1156t2-s")
4900 .Case("thumbv6t2", "arm1156t2-s")
4901 .Cases("armv6m", "armv6-m", "cortex-m0")
4902 .Case("thumbv6m", "cortex-m0")
4903 .Cases("armv7", "armv7a", "armv7-a", "cortex-a8")
Christian Pirkerf01cd6f2014-03-28 14:40:46 +00004904 .Cases("armebv7", "armebv7a", "armebv7-a", "cortex-a8")
Bernard Ogden31561762013-12-12 13:27:11 +00004905 .Cases("thumbv7", "thumbv7a", "cortex-a8")
Christian Pirkerf01cd6f2014-03-28 14:40:46 +00004906 .Cases("thumbebv7", "thumbebv7a", "cortex-a8")
Bernard Ogden31561762013-12-12 13:27:11 +00004907 .Cases("armv7l", "armv7-l", "cortex-a8")
Christian Pirkerf01cd6f2014-03-28 14:40:46 +00004908 .Cases("armebv7l", "armebv7-l", "cortex-a8")
Bernard Ogden31561762013-12-12 13:27:11 +00004909 .Cases("armv7s", "armv7-s", "swift")
Christian Pirkerf01cd6f2014-03-28 14:40:46 +00004910 .Cases("armebv7s", "armebv7-s", "swift")
Bernard Ogden31561762013-12-12 13:27:11 +00004911 .Cases("armv7r", "armv7-r", "cortex-r4")
Christian Pirkerf01cd6f2014-03-28 14:40:46 +00004912 .Cases("armebv7r", "armebv7-r", "cortex-r4")
Bernard Ogden31561762013-12-12 13:27:11 +00004913 .Case("thumbv7r", "cortex-r4")
Christian Pirkerf01cd6f2014-03-28 14:40:46 +00004914 .Case("thumbebv7r", "cortex-r4")
Bernard Ogden31561762013-12-12 13:27:11 +00004915 .Cases("armv7m", "armv7-m", "cortex-m3")
Christian Pirkerf01cd6f2014-03-28 14:40:46 +00004916 .Cases("armebv7m", "armebv7-m", "cortex-m3")
Bernard Ogden31561762013-12-12 13:27:11 +00004917 .Case("thumbv7m", "cortex-m3")
Christian Pirkerf01cd6f2014-03-28 14:40:46 +00004918 .Case("thumbebv7m", "cortex-m3")
Bernard Ogden31561762013-12-12 13:27:11 +00004919 .Cases("armv7em", "armv7e-m", "cortex-m4")
Christian Pirkerf01cd6f2014-03-28 14:40:46 +00004920 .Cases("armebv7em", "armebv7e-m", "cortex-m4")
Bernard Ogden31561762013-12-12 13:27:11 +00004921 .Cases("thumbv7em", "thumbv7e-m", "cortex-m4")
Christian Pirkerf01cd6f2014-03-28 14:40:46 +00004922 .Cases("thumbebv7em", "thumbebv7e-m", "cortex-m4")
Bernard Ogden31561762013-12-12 13:27:11 +00004923 .Cases("armv8", "armv8a", "armv8-a", "cortex-a53")
Christian Pirkerf01cd6f2014-03-28 14:40:46 +00004924 .Cases("armebv8", "armebv8a", "armebv8-a", "cortex-a53")
Bernard Ogden31561762013-12-12 13:27:11 +00004925 .Cases("thumbv8", "thumbv8a", "cortex-a53")
Christian Pirkerf01cd6f2014-03-28 14:40:46 +00004926 .Cases("thumbebv8", "thumbebv8a", "cortex-a53")
Bernard Ogden31561762013-12-12 13:27:11 +00004927 .Case("ep9312", "ep9312")
4928 .Case("iwmmxt", "iwmmxt")
4929 .Case("xscale", "xscale")
4930 // If all else failed, return the most base CPU with thumb interworking
4931 // supported by LLVM.
4932 .Default(0);
4933
4934 if (result)
4935 return result;
4936
Joerg Sonnenberger695fdb32014-02-21 21:53:33 +00004937 switch (Triple.getOS()) {
4938 case llvm::Triple::NetBSD:
4939 switch (Triple.getEnvironment()) {
4940 case llvm::Triple::GNUEABIHF:
4941 case llvm::Triple::GNUEABI:
4942 case llvm::Triple::EABIHF:
4943 case llvm::Triple::EABI:
4944 return "arm926ej-s";
4945 default:
4946 return "strongarm";
4947 }
4948 default:
4949 switch (Triple.getEnvironment()) {
4950 case llvm::Triple::EABIHF:
4951 case llvm::Triple::GNUEABIHF:
4952 return "arm1176jzf-s";
4953 default:
4954 return "arm7tdmi";
4955 }
4956 }
Bernard Ogden31561762013-12-12 13:27:11 +00004957}
4958
4959/// getARMTargetCPU - Get the (LLVM) name of the ARM cpu we are targeting.
Rafael Espindola80d333b2013-12-12 15:48:19 +00004960StringRef arm::getARMTargetCPU(const ArgList &Args,
4961 const llvm::Triple &Triple) {
Bernard Ogden31561762013-12-12 13:27:11 +00004962 // FIXME: Warn on inconsistent use of -mcpu and -march.
4963 // If we have -mcpu=, use that.
4964 if (Arg *A = Args.getLastArg(options::OPT_mcpu_EQ)) {
4965 StringRef MCPU = A->getValue();
4966 // Handle -mcpu=native.
4967 if (MCPU == "native")
Rafael Espindola9c5ef122013-12-12 15:39:05 +00004968 return llvm::sys::getHostCPUName();
Bernard Ogden31561762013-12-12 13:27:11 +00004969 else
Rafael Espindola80d333b2013-12-12 15:48:19 +00004970 return MCPU;
Bernard Ogden31561762013-12-12 13:27:11 +00004971 }
4972
4973 return getARMCPUForMArch(Args, Triple);
4974}
4975
4976/// getLLVMArchSuffixForARM - Get the LLVM arch name to use for a particular
4977/// CPU.
4978//
4979// FIXME: This is redundant with -mcpu, why does LLVM use this.
4980// FIXME: tblgen this, or kill it!
4981const char *arm::getLLVMArchSuffixForARM(StringRef CPU) {
4982 return llvm::StringSwitch<const char *>(CPU)
4983 .Case("strongarm", "v4")
4984 .Cases("arm7tdmi", "arm7tdmi-s", "arm710t", "v4t")
4985 .Cases("arm720t", "arm9", "arm9tdmi", "v4t")
4986 .Cases("arm920", "arm920t", "arm922t", "v4t")
4987 .Cases("arm940t", "ep9312","v4t")
4988 .Cases("arm10tdmi", "arm1020t", "v5")
4989 .Cases("arm9e", "arm926ej-s", "arm946e-s", "v5e")
4990 .Cases("arm966e-s", "arm968e-s", "arm10e", "v5e")
4991 .Cases("arm1020e", "arm1022e", "xscale", "iwmmxt", "v5e")
4992 .Cases("arm1136j-s", "arm1136jf-s", "arm1176jz-s", "v6")
4993 .Cases("arm1176jzf-s", "mpcorenovfp", "mpcore", "v6")
4994 .Cases("arm1156t2-s", "arm1156t2f-s", "v6t2")
Bob Wilsonb767d152014-01-15 21:43:40 +00004995 .Cases("cortex-a5", "cortex-a7", "cortex-a8", "cortex-a9-mp", "v7")
Bernard Ogden31561762013-12-12 13:27:11 +00004996 .Cases("cortex-a9", "cortex-a12", "cortex-a15", "krait", "v7")
4997 .Cases("cortex-r4", "cortex-r5", "v7r")
4998 .Case("cortex-m0", "v6m")
4999 .Case("cortex-m3", "v7m")
5000 .Case("cortex-m4", "v7em")
Bernard Ogden31561762013-12-12 13:27:11 +00005001 .Case("swift", "v7s")
Tim Northovera2ee4332014-03-29 15:09:45 +00005002 .Case("cyclone", "v8")
Bernard Ogden31561762013-12-12 13:27:11 +00005003 .Cases("cortex-a53", "cortex-a57", "v8")
5004 .Default("");
5005}
5006
Jonathan Roelofs2cea1be2014-02-12 03:21:20 +00005007bool mips::hasMipsAbiArg(const ArgList &Args, const char *Value) {
5008 Arg *A = Args.getLastArg(options::OPT_mabi_EQ);
5009 return A && (A->getValue() == StringRef(Value));
5010}
5011
Tim Northover157d9112014-01-16 08:48:16 +00005012llvm::Triple::ArchType darwin::getArchTypeForMachOArchName(StringRef Str) {
Rafael Espindoladcbf6982012-10-31 18:51:07 +00005013 // See arch(3) and llvm-gcc's driver-driver.c. We don't implement support for
5014 // archs which Darwin doesn't use.
5015
5016 // The matching this routine does is fairly pointless, since it is neither the
5017 // complete architecture list, nor a reasonable subset. The problem is that
5018 // historically the driver driver accepts this and also ties its -march=
5019 // handling to the architecture name, so we need to be careful before removing
5020 // support for it.
5021
5022 // This code must be kept in sync with Clang's Darwin specific argument
5023 // translation.
5024
5025 return llvm::StringSwitch<llvm::Triple::ArchType>(Str)
5026 .Cases("ppc", "ppc601", "ppc603", "ppc604", "ppc604e", llvm::Triple::ppc)
5027 .Cases("ppc750", "ppc7400", "ppc7450", "ppc970", llvm::Triple::ppc)
5028 .Case("ppc64", llvm::Triple::ppc64)
5029 .Cases("i386", "i486", "i486SX", "i586", "i686", llvm::Triple::x86)
5030 .Cases("pentium", "pentpro", "pentIIm3", "pentIIm5", "pentium4",
5031 llvm::Triple::x86)
Jim Grosbach82eee262013-11-16 00:53:35 +00005032 .Cases("x86_64", "x86_64h", llvm::Triple::x86_64)
Rafael Espindoladcbf6982012-10-31 18:51:07 +00005033 // This is derived from the driver driver.
Bob Wilson743bf672013-03-04 22:37:49 +00005034 .Cases("arm", "armv4t", "armv5", "armv6", "armv6m", llvm::Triple::arm)
Bob Wilsonb767d152014-01-15 21:43:40 +00005035 .Cases("armv7", "armv7em", "armv7k", "armv7m", llvm::Triple::arm)
Bob Wilson743bf672013-03-04 22:37:49 +00005036 .Cases("armv7s", "xscale", llvm::Triple::arm)
Tim Northovera2ee4332014-03-29 15:09:45 +00005037 .Case("arm64", llvm::Triple::arm64)
Rafael Espindoladcbf6982012-10-31 18:51:07 +00005038 .Case("r600", llvm::Triple::r600)
5039 .Case("nvptx", llvm::Triple::nvptx)
5040 .Case("nvptx64", llvm::Triple::nvptx64)
5041 .Case("amdil", llvm::Triple::amdil)
5042 .Case("spir", llvm::Triple::spir)
5043 .Default(llvm::Triple::UnknownArch);
5044}
Tony Linthicum76329bf2011-12-12 21:14:55 +00005045
Tim Northover157d9112014-01-16 08:48:16 +00005046void darwin::setTripleTypeForMachOArchName(llvm::Triple &T, StringRef Str) {
5047 llvm::Triple::ArchType Arch = getArchTypeForMachOArchName(Str);
5048 T.setArch(Arch);
5049
5050 if (Str == "x86_64h")
5051 T.setArchName(Str);
5052 else if (Str == "armv6m" || Str == "armv7m" || Str == "armv7em") {
5053 T.setOS(llvm::Triple::UnknownOS);
Saleem Abdulrasool29b82b62014-03-06 20:47:19 +00005054 T.setObjectFormat(llvm::Triple::MachO);
Tim Northover157d9112014-01-16 08:48:16 +00005055 }
5056}
5057
Bob Wilsondecc03e2012-11-23 06:14:39 +00005058const char *Clang::getBaseInputName(const ArgList &Args,
5059 const InputInfoList &Inputs) {
Michael J. Spencere1696752010-12-18 00:19:12 +00005060 return Args.MakeArgString(
5061 llvm::sys::path::filename(Inputs[0].getBaseInput()));
Daniel Dunbarafec1f52009-03-29 18:40:18 +00005062}
5063
Bob Wilsondecc03e2012-11-23 06:14:39 +00005064const char *Clang::getBaseInputStem(const ArgList &Args,
5065 const InputInfoList &Inputs) {
Daniel Dunbarafec1f52009-03-29 18:40:18 +00005066 const char *Str = getBaseInputName(Args, Inputs);
5067
Chris Lattner906bb902011-01-16 08:14:11 +00005068 if (const char *End = strrchr(Str, '.'))
Daniel Dunbar1c28f1e2009-09-09 22:32:48 +00005069 return Args.MakeArgString(std::string(Str, End));
Daniel Dunbarafec1f52009-03-29 18:40:18 +00005070
5071 return Str;
5072}
5073
Bob Wilsondecc03e2012-11-23 06:14:39 +00005074const char *Clang::getDependencyFileName(const ArgList &Args,
5075 const InputInfoList &Inputs) {
Daniel Dunbarafec1f52009-03-29 18:40:18 +00005076 // FIXME: Think about this more.
5077 std::string Res;
5078
5079 if (Arg *OutputOpt = Args.getLastArg(options::OPT_o)) {
Richard Smithbd55daf2012-11-01 04:30:05 +00005080 std::string Str(OutputOpt->getValue());
Daniel Dunbarafec1f52009-03-29 18:40:18 +00005081 Res = Str.substr(0, Str.rfind('.'));
Chad Rosier6fdf38b2011-08-17 23:08:45 +00005082 } else {
Bob Wilsondecc03e2012-11-23 06:14:39 +00005083 Res = getBaseInputStem(Args, Inputs);
Chad Rosier6fdf38b2011-08-17 23:08:45 +00005084 }
Daniel Dunbar1c28f1e2009-09-09 22:32:48 +00005085 return Args.MakeArgString(Res + ".d");
Daniel Dunbarafec1f52009-03-29 18:40:18 +00005086}
5087
Daniel Dunbarbe220842009-03-20 16:06:39 +00005088void darwin::Assemble::ConstructJob(Compilation &C, const JobAction &JA,
Daniel Dunbar7fbaf532010-08-02 02:38:28 +00005089 const InputInfo &Output,
Daniel Dunbard067f7f2009-04-08 23:54:23 +00005090 const InputInfoList &Inputs,
5091 const ArgList &Args,
Daniel Dunbarbe220842009-03-20 16:06:39 +00005092 const char *LinkingOutput) const {
5093 ArgStringList CmdArgs;
5094
5095 assert(Inputs.size() == 1 && "Unexpected number of inputs.");
5096 const InputInfo &Input = Inputs[0];
5097
Daniel Dunbardc8355e2011-04-12 23:59:20 +00005098 // Determine the original source input.
5099 const Action *SourceAction = &JA;
5100 while (SourceAction->getKind() != Action::InputClass) {
5101 assert(!SourceAction->getInputs().empty() && "unexpected root action!");
5102 SourceAction = SourceAction->getInputs()[0];
5103 }
5104
Saleem Abdulrasoolcfeb90d2014-02-23 00:40:30 +00005105 // If -fno_integrated_as is used add -Q to the darwin assember driver to make
Kevin Enderby319baa42013-11-18 23:30:29 +00005106 // sure it runs its system assembler not clang's integrated assembler.
David Fang073a7c92013-12-10 22:51:25 +00005107 // Applicable to darwin11+ and Xcode 4+. darwin<10 lacked integrated-as.
5108 // FIXME: at run-time detect assembler capabilities or rely on version
5109 // information forwarded by -target-assembler-version (future)
Saleem Abdulrasoolcfeb90d2014-02-23 00:40:30 +00005110 if (Args.hasArg(options::OPT_fno_integrated_as)) {
David Fangadcdde02013-12-10 23:13:11 +00005111 const llvm::Triple &T(getToolChain().getTriple());
5112 if (!(T.isMacOSX() && T.isMacOSXVersionLT(10, 7)))
David Fang073a7c92013-12-10 22:51:25 +00005113 CmdArgs.push_back("-Q");
5114 }
Kevin Enderby319baa42013-11-18 23:30:29 +00005115
Daniel Dunbardc8355e2011-04-12 23:59:20 +00005116 // Forward -g, assuming we are dealing with an actual assembly file.
Eric Christopher84fbdb42011-08-19 00:30:14 +00005117 if (SourceAction->getType() == types::TY_Asm ||
Daniel Dunbardc8355e2011-04-12 23:59:20 +00005118 SourceAction->getType() == types::TY_PP_Asm) {
Daniel Dunbar5c9c1182009-04-01 00:27:44 +00005119 if (Args.hasArg(options::OPT_gstabs))
5120 CmdArgs.push_back("--gstabs");
5121 else if (Args.hasArg(options::OPT_g_Group))
Bob Wilson126c4912011-11-02 05:10:45 +00005122 CmdArgs.push_back("-g");
Daniel Dunbar5c9c1182009-04-01 00:27:44 +00005123 }
Daniel Dunbard067f7f2009-04-08 23:54:23 +00005124
Daniel Dunbarbe220842009-03-20 16:06:39 +00005125 // Derived from asm spec.
Tim Northover157d9112014-01-16 08:48:16 +00005126 AddMachOArch(Args, CmdArgs);
Daniel Dunbarbe220842009-03-20 16:06:39 +00005127
Daniel Dunbar6d484762010-07-22 01:47:22 +00005128 // Use -force_cpusubtype_ALL on x86 by default.
Eli Benderskyd4a6aec2013-07-24 22:20:49 +00005129 if (getToolChain().getArch() == llvm::Triple::x86 ||
5130 getToolChain().getArch() == llvm::Triple::x86_64 ||
Daniel Dunbar3571dd92009-09-09 18:36:27 +00005131 Args.hasArg(options::OPT_force__cpusubtype__ALL))
5132 CmdArgs.push_back("-force_cpusubtype_ALL");
5133
Eli Benderskyd4a6aec2013-07-24 22:20:49 +00005134 if (getToolChain().getArch() != llvm::Triple::x86_64 &&
Daniel Dunbarbd847cc2012-10-15 22:23:53 +00005135 (((Args.hasArg(options::OPT_mkernel) ||
Eric Christopher248357f2013-02-21 22:35:01 +00005136 Args.hasArg(options::OPT_fapple_kext)) &&
Tim Northover157d9112014-01-16 08:48:16 +00005137 getMachOToolChain().isKernelStatic()) ||
Daniel Dunbarbd847cc2012-10-15 22:23:53 +00005138 Args.hasArg(options::OPT_static)))
Daniel Dunbard067f7f2009-04-08 23:54:23 +00005139 CmdArgs.push_back("-static");
5140
Daniel Dunbarbe220842009-03-20 16:06:39 +00005141 Args.AddAllArgValues(CmdArgs, options::OPT_Wa_COMMA,
5142 options::OPT_Xassembler);
5143
5144 assert(Output.isFilename() && "Unexpected lipo output.");
5145 CmdArgs.push_back("-o");
5146 CmdArgs.push_back(Output.getFilename());
5147
Daniel Dunbarb440f562010-08-02 02:38:21 +00005148 assert(Input.isFilename() && "Invalid input.");
5149 CmdArgs.push_back(Input.getFilename());
Daniel Dunbarbe220842009-03-20 16:06:39 +00005150
5151 // asm_final spec is empty.
5152
Daniel Dunbard067f7f2009-04-08 23:54:23 +00005153 const char *Exec =
Daniel Dunbar9c3ed5f2010-07-14 18:46:23 +00005154 Args.MakeArgString(getToolChain().GetProgramPath("as"));
Daniel Dunbar7fbaf532010-08-02 02:38:28 +00005155 C.addCommand(new Command(JA, *this, Exec, CmdArgs));
Daniel Dunbarbe220842009-03-20 16:06:39 +00005156}
Daniel Dunbar64ed5e32009-03-20 00:52:38 +00005157
Tim Northover157d9112014-01-16 08:48:16 +00005158void darwin::MachOTool::anchor() {}
David Blaikie68e081d2011-12-20 02:48:34 +00005159
Tim Northover157d9112014-01-16 08:48:16 +00005160void darwin::MachOTool::AddMachOArch(const ArgList &Args,
5161 ArgStringList &CmdArgs) const {
5162 StringRef ArchName = getMachOToolChain().getMachOArchName(Args);
Daniel Dunbardcc3b652010-01-22 02:04:58 +00005163
Daniel Dunbarc1964212009-03-26 16:23:12 +00005164 // Derived from darwin_arch spec.
5165 CmdArgs.push_back("-arch");
Daniel Dunbardcc3b652010-01-22 02:04:58 +00005166 CmdArgs.push_back(Args.MakeArgString(ArchName));
Daniel Dunbar91dbfd62009-09-04 18:35:31 +00005167
Daniel Dunbardcc3b652010-01-22 02:04:58 +00005168 // FIXME: Is this needed anymore?
5169 if (ArchName == "arm")
Daniel Dunbar91dbfd62009-09-04 18:35:31 +00005170 CmdArgs.push_back("-force_cpusubtype_ALL");
Daniel Dunbarc1964212009-03-26 16:23:12 +00005171}
5172
Bill Wendling3b2000f2012-10-02 18:02:50 +00005173bool darwin::Link::NeedsTempPath(const InputInfoList &Inputs) const {
5174 // We only need to generate a temp path for LTO if we aren't compiling object
5175 // files. When compiling source files, we run 'dsymutil' after linking. We
5176 // don't run 'dsymutil' when compiling object files.
5177 for (InputInfoList::const_iterator
5178 it = Inputs.begin(), ie = Inputs.end(); it != ie; ++it)
5179 if (it->getType() != types::TY_Object)
5180 return true;
5181
5182 return false;
5183}
5184
Daniel Dunbarccbc4522010-09-09 21:51:05 +00005185void darwin::Link::AddLinkArgs(Compilation &C,
5186 const ArgList &Args,
Bill Wendling3b2000f2012-10-02 18:02:50 +00005187 ArgStringList &CmdArgs,
5188 const InputInfoList &Inputs) const {
Daniel Dunbar083edf72009-12-21 18:54:17 +00005189 const Driver &D = getToolChain().getDriver();
Tim Northover157d9112014-01-16 08:48:16 +00005190 const toolchains::MachO &MachOTC = getMachOToolChain();
Daniel Dunbarc1964212009-03-26 16:23:12 +00005191
Daniel Dunbarcacb0e22010-08-11 23:07:50 +00005192 unsigned Version[3] = { 0, 0, 0 };
5193 if (Arg *A = Args.getLastArg(options::OPT_mlinker_version_EQ)) {
5194 bool HadExtra;
Richard Smithbd55daf2012-11-01 04:30:05 +00005195 if (!Driver::GetReleaseVersion(A->getValue(), Version[0],
Daniel Dunbarcacb0e22010-08-11 23:07:50 +00005196 Version[1], Version[2], HadExtra) ||
5197 HadExtra)
Chris Lattner0e62c1c2011-07-23 10:55:15 +00005198 D.Diag(diag::err_drv_invalid_version_number)
Daniel Dunbarcacb0e22010-08-11 23:07:50 +00005199 << A->getAsString(Args);
5200 }
5201
Bob Wilson5a4f3ea2014-01-14 01:56:31 +00005202 // Newer linkers support -demangle. Pass it if supported and not disabled by
Daniel Dunbarcacb0e22010-08-11 23:07:50 +00005203 // the user.
Bob Wilson5a4f3ea2014-01-14 01:56:31 +00005204 if (Version[0] >= 100 && !Args.hasArg(options::OPT_Z_Xlinker__no_demangle))
5205 CmdArgs.push_back("-demangle");
Daniel Dunbarcacb0e22010-08-11 23:07:50 +00005206
Bob Wilson3d27dad2013-08-02 22:25:34 +00005207 if (Args.hasArg(options::OPT_rdynamic) && Version[0] >= 137)
5208 CmdArgs.push_back("-export_dynamic");
5209
Bill Wendling313b6bf2012-11-16 23:03:00 +00005210 // If we are using LTO, then automatically create a temporary file path for
5211 // the linker to use, so that it's lifetime will extend past a possible
5212 // dsymutil step.
5213 if (Version[0] >= 116 && D.IsUsingLTO(Args) && NeedsTempPath(Inputs)) {
5214 const char *TmpPath = C.getArgs().MakeArgString(
5215 D.GetTemporaryPath("cc", types::getTypeTempSuffix(types::TY_Object)));
5216 C.addTempFile(TmpPath);
5217 CmdArgs.push_back("-object_path_lto");
5218 CmdArgs.push_back(TmpPath);
Daniel Dunbaref889c72011-06-21 20:55:11 +00005219 }
5220
Daniel Dunbarc1964212009-03-26 16:23:12 +00005221 // Derived from the "link" spec.
5222 Args.AddAllArgs(CmdArgs, options::OPT_static);
5223 if (!Args.hasArg(options::OPT_static))
5224 CmdArgs.push_back("-dynamic");
5225 if (Args.hasArg(options::OPT_fgnu_runtime)) {
5226 // FIXME: gcc replaces -lobjc in forward args with -lobjc-gnu
5227 // here. How do we wish to handle such things?
5228 }
Daniel Dunbard067f7f2009-04-08 23:54:23 +00005229
Daniel Dunbarc1964212009-03-26 16:23:12 +00005230 if (!Args.hasArg(options::OPT_dynamiclib)) {
Tim Northover157d9112014-01-16 08:48:16 +00005231 AddMachOArch(Args, CmdArgs);
Daniel Dunbara48823f2010-01-22 02:04:52 +00005232 // FIXME: Why do this only on this path?
Daniel Dunbar93d7acf2010-01-22 03:37:33 +00005233 Args.AddLastArg(CmdArgs, options::OPT_force__cpusubtype__ALL);
Daniel Dunbarc1964212009-03-26 16:23:12 +00005234
5235 Args.AddLastArg(CmdArgs, options::OPT_bundle);
5236 Args.AddAllArgs(CmdArgs, options::OPT_bundle__loader);
5237 Args.AddAllArgs(CmdArgs, options::OPT_client__name);
5238
5239 Arg *A;
5240 if ((A = Args.getLastArg(options::OPT_compatibility__version)) ||
5241 (A = Args.getLastArg(options::OPT_current__version)) ||
5242 (A = Args.getLastArg(options::OPT_install__name)))
Chris Lattner0e62c1c2011-07-23 10:55:15 +00005243 D.Diag(diag::err_drv_argument_only_allowed_with)
Daniel Dunbarc1964212009-03-26 16:23:12 +00005244 << A->getAsString(Args) << "-dynamiclib";
5245
5246 Args.AddLastArg(CmdArgs, options::OPT_force__flat__namespace);
5247 Args.AddLastArg(CmdArgs, options::OPT_keep__private__externs);
5248 Args.AddLastArg(CmdArgs, options::OPT_private__bundle);
5249 } else {
5250 CmdArgs.push_back("-dylib");
5251
5252 Arg *A;
5253 if ((A = Args.getLastArg(options::OPT_bundle)) ||
5254 (A = Args.getLastArg(options::OPT_bundle__loader)) ||
5255 (A = Args.getLastArg(options::OPT_client__name)) ||
5256 (A = Args.getLastArg(options::OPT_force__flat__namespace)) ||
5257 (A = Args.getLastArg(options::OPT_keep__private__externs)) ||
5258 (A = Args.getLastArg(options::OPT_private__bundle)))
Chris Lattner0e62c1c2011-07-23 10:55:15 +00005259 D.Diag(diag::err_drv_argument_not_allowed_with)
Daniel Dunbarc1964212009-03-26 16:23:12 +00005260 << A->getAsString(Args) << "-dynamiclib";
Daniel Dunbard067f7f2009-04-08 23:54:23 +00005261
Daniel Dunbarc1964212009-03-26 16:23:12 +00005262 Args.AddAllArgsTranslated(CmdArgs, options::OPT_compatibility__version,
5263 "-dylib_compatibility_version");
5264 Args.AddAllArgsTranslated(CmdArgs, options::OPT_current__version,
5265 "-dylib_current_version");
5266
Tim Northover157d9112014-01-16 08:48:16 +00005267 AddMachOArch(Args, CmdArgs);
Daniel Dunbarc1964212009-03-26 16:23:12 +00005268
5269 Args.AddAllArgsTranslated(CmdArgs, options::OPT_install__name,
5270 "-dylib_install_name");
5271 }
5272
5273 Args.AddLastArg(CmdArgs, options::OPT_all__load);
5274 Args.AddAllArgs(CmdArgs, options::OPT_allowable__client);
5275 Args.AddLastArg(CmdArgs, options::OPT_bind__at__load);
Tim Northover157d9112014-01-16 08:48:16 +00005276 if (MachOTC.isTargetIOSBased())
Daniel Dunbar2b5f6812009-09-04 18:35:41 +00005277 Args.AddLastArg(CmdArgs, options::OPT_arch__errors__fatal);
Daniel Dunbarc1964212009-03-26 16:23:12 +00005278 Args.AddLastArg(CmdArgs, options::OPT_dead__strip);
5279 Args.AddLastArg(CmdArgs, options::OPT_no__dead__strip__inits__and__terms);
5280 Args.AddAllArgs(CmdArgs, options::OPT_dylib__file);
5281 Args.AddLastArg(CmdArgs, options::OPT_dynamic);
5282 Args.AddAllArgs(CmdArgs, options::OPT_exported__symbols__list);
5283 Args.AddLastArg(CmdArgs, options::OPT_flat__namespace);
Daniel Dunbar044a3902011-06-28 20:16:02 +00005284 Args.AddAllArgs(CmdArgs, options::OPT_force__load);
Daniel Dunbarc1964212009-03-26 16:23:12 +00005285 Args.AddAllArgs(CmdArgs, options::OPT_headerpad__max__install__names);
5286 Args.AddAllArgs(CmdArgs, options::OPT_image__base);
5287 Args.AddAllArgs(CmdArgs, options::OPT_init);
5288
Daniel Dunbarc44d3132011-04-28 21:23:41 +00005289 // Add the deployment target.
Tim Northover157d9112014-01-16 08:48:16 +00005290 MachOTC.addMinVersionArgs(Args, CmdArgs);
Daniel Dunbarc44d3132011-04-28 21:23:41 +00005291
Daniel Dunbarc1964212009-03-26 16:23:12 +00005292 Args.AddLastArg(CmdArgs, options::OPT_nomultidefs);
5293 Args.AddLastArg(CmdArgs, options::OPT_multi__module);
5294 Args.AddLastArg(CmdArgs, options::OPT_single__module);
5295 Args.AddAllArgs(CmdArgs, options::OPT_multiply__defined);
5296 Args.AddAllArgs(CmdArgs, options::OPT_multiply__defined__unused);
Daniel Dunbard067f7f2009-04-08 23:54:23 +00005297
Daniel Dunbaraf68a882010-07-13 23:31:40 +00005298 if (const Arg *A = Args.getLastArg(options::OPT_fpie, options::OPT_fPIE,
5299 options::OPT_fno_pie,
5300 options::OPT_fno_PIE)) {
5301 if (A->getOption().matches(options::OPT_fpie) ||
5302 A->getOption().matches(options::OPT_fPIE))
5303 CmdArgs.push_back("-pie");
5304 else
5305 CmdArgs.push_back("-no_pie");
5306 }
Daniel Dunbarc1964212009-03-26 16:23:12 +00005307
5308 Args.AddLastArg(CmdArgs, options::OPT_prebind);
5309 Args.AddLastArg(CmdArgs, options::OPT_noprebind);
5310 Args.AddLastArg(CmdArgs, options::OPT_nofixprebinding);
5311 Args.AddLastArg(CmdArgs, options::OPT_prebind__all__twolevel__modules);
5312 Args.AddLastArg(CmdArgs, options::OPT_read__only__relocs);
5313 Args.AddAllArgs(CmdArgs, options::OPT_sectcreate);
5314 Args.AddAllArgs(CmdArgs, options::OPT_sectorder);
5315 Args.AddAllArgs(CmdArgs, options::OPT_seg1addr);
5316 Args.AddAllArgs(CmdArgs, options::OPT_segprot);
5317 Args.AddAllArgs(CmdArgs, options::OPT_segaddr);
5318 Args.AddAllArgs(CmdArgs, options::OPT_segs__read__only__addr);
5319 Args.AddAllArgs(CmdArgs, options::OPT_segs__read__write__addr);
5320 Args.AddAllArgs(CmdArgs, options::OPT_seg__addr__table);
5321 Args.AddAllArgs(CmdArgs, options::OPT_seg__addr__table__filename);
5322 Args.AddAllArgs(CmdArgs, options::OPT_sub__library);
5323 Args.AddAllArgs(CmdArgs, options::OPT_sub__umbrella);
Daniel Dunbar2b5f6812009-09-04 18:35:41 +00005324
Daniel Dunbar84384642011-05-02 21:03:47 +00005325 // Give --sysroot= preference, over the Apple specific behavior to also use
5326 // --isysroot as the syslibroot.
Sebastian Pop980920a2012-04-16 04:16:43 +00005327 StringRef sysroot = C.getSysRoot();
5328 if (sysroot != "") {
Daniel Dunbar84384642011-05-02 21:03:47 +00005329 CmdArgs.push_back("-syslibroot");
Sebastian Pop980920a2012-04-16 04:16:43 +00005330 CmdArgs.push_back(C.getArgs().MakeArgString(sysroot));
Daniel Dunbar84384642011-05-02 21:03:47 +00005331 } else if (const Arg *A = Args.getLastArg(options::OPT_isysroot)) {
5332 CmdArgs.push_back("-syslibroot");
Richard Smithbd55daf2012-11-01 04:30:05 +00005333 CmdArgs.push_back(A->getValue());
Daniel Dunbar2b5f6812009-09-04 18:35:41 +00005334 }
5335
Daniel Dunbarc1964212009-03-26 16:23:12 +00005336 Args.AddLastArg(CmdArgs, options::OPT_twolevel__namespace);
5337 Args.AddLastArg(CmdArgs, options::OPT_twolevel__namespace__hints);
5338 Args.AddAllArgs(CmdArgs, options::OPT_umbrella);
5339 Args.AddAllArgs(CmdArgs, options::OPT_undefined);
5340 Args.AddAllArgs(CmdArgs, options::OPT_unexported__symbols__list);
Daniel Dunbar2b5f6812009-09-04 18:35:41 +00005341 Args.AddAllArgs(CmdArgs, options::OPT_weak__reference__mismatches);
Daniel Dunbarc1964212009-03-26 16:23:12 +00005342 Args.AddLastArg(CmdArgs, options::OPT_X_Flag);
5343 Args.AddAllArgs(CmdArgs, options::OPT_y);
5344 Args.AddLastArg(CmdArgs, options::OPT_w);
5345 Args.AddAllArgs(CmdArgs, options::OPT_pagezero__size);
5346 Args.AddAllArgs(CmdArgs, options::OPT_segs__read__);
5347 Args.AddLastArg(CmdArgs, options::OPT_seglinkedit);
5348 Args.AddLastArg(CmdArgs, options::OPT_noseglinkedit);
5349 Args.AddAllArgs(CmdArgs, options::OPT_sectalign);
5350 Args.AddAllArgs(CmdArgs, options::OPT_sectobjectsymbols);
5351 Args.AddAllArgs(CmdArgs, options::OPT_segcreate);
5352 Args.AddLastArg(CmdArgs, options::OPT_whyload);
5353 Args.AddLastArg(CmdArgs, options::OPT_whatsloaded);
5354 Args.AddAllArgs(CmdArgs, options::OPT_dylinker__install__name);
5355 Args.AddLastArg(CmdArgs, options::OPT_dylinker);
5356 Args.AddLastArg(CmdArgs, options::OPT_Mach);
5357}
5358
Alexey Bataev186b28a2014-03-06 05:43:53 +00005359enum LibOpenMP {
5360 LibUnknown,
5361 LibGOMP,
5362 LibIOMP5
5363};
5364
Daniel Dunbarc1964212009-03-26 16:23:12 +00005365void darwin::Link::ConstructJob(Compilation &C, const JobAction &JA,
Daniel Dunbar7fbaf532010-08-02 02:38:28 +00005366 const InputInfo &Output,
Daniel Dunbard067f7f2009-04-08 23:54:23 +00005367 const InputInfoList &Inputs,
5368 const ArgList &Args,
Daniel Dunbarc1964212009-03-26 16:23:12 +00005369 const char *LinkingOutput) const {
5370 assert(Output.getType() == types::TY_Image && "Invalid linker output type.");
Daniel Dunbarc09988d2009-09-08 16:39:16 +00005371
Daniel Dunbarc1964212009-03-26 16:23:12 +00005372 // The logic here is derived from gcc's behavior; most of which
5373 // comes from specs (starting with link_command). Consult gcc for
5374 // more information.
Daniel Dunbarc1964212009-03-26 16:23:12 +00005375 ArgStringList CmdArgs;
5376
Argyrios Kyrtzidis741fab12011-10-07 22:58:08 +00005377 /// Hack(tm) to ignore linking errors when we are doing ARC migration.
5378 if (Args.hasArg(options::OPT_ccc_arcmt_check,
5379 options::OPT_ccc_arcmt_migrate)) {
5380 for (ArgList::const_iterator I = Args.begin(), E = Args.end(); I != E; ++I)
5381 (*I)->claim();
5382 const char *Exec =
5383 Args.MakeArgString(getToolChain().GetProgramPath("touch"));
5384 CmdArgs.push_back(Output.getFilename());
5385 C.addCommand(new Command(JA, *this, Exec, CmdArgs));
5386 return;
5387 }
5388
Daniel Dunbarc1964212009-03-26 16:23:12 +00005389 // I'm not sure why this particular decomposition exists in gcc, but
5390 // we follow suite for ease of comparison.
Bill Wendling3b2000f2012-10-02 18:02:50 +00005391 AddLinkArgs(C, Args, CmdArgs, Inputs);
Daniel Dunbarc1964212009-03-26 16:23:12 +00005392
Daniel Dunbarc1964212009-03-26 16:23:12 +00005393 Args.AddAllArgs(CmdArgs, options::OPT_d_Flag);
5394 Args.AddAllArgs(CmdArgs, options::OPT_s);
5395 Args.AddAllArgs(CmdArgs, options::OPT_t);
5396 Args.AddAllArgs(CmdArgs, options::OPT_Z_Flag);
5397 Args.AddAllArgs(CmdArgs, options::OPT_u_Group);
Daniel Dunbarc1964212009-03-26 16:23:12 +00005398 Args.AddLastArg(CmdArgs, options::OPT_e);
Daniel Dunbarc1964212009-03-26 16:23:12 +00005399 Args.AddAllArgs(CmdArgs, options::OPT_r);
5400
Daniel Dunbar767bbab2010-10-18 22:08:36 +00005401 // Forward -ObjC when either -ObjC or -ObjC++ is used, to force loading
5402 // members of static archive libraries which implement Objective-C classes or
5403 // categories.
5404 if (Args.hasArg(options::OPT_ObjC) || Args.hasArg(options::OPT_ObjCXX))
5405 CmdArgs.push_back("-ObjC");
Michael J. Spencer4c0ffa82010-10-21 03:16:25 +00005406
Daniel Dunbarc1964212009-03-26 16:23:12 +00005407 CmdArgs.push_back("-o");
5408 CmdArgs.push_back(Output.getFilename());
5409
Chad Rosier06fd3c62012-05-16 23:45:12 +00005410 if (!Args.hasArg(options::OPT_nostdlib) &&
Tim Northover157d9112014-01-16 08:48:16 +00005411 !Args.hasArg(options::OPT_nostartfiles))
5412 getMachOToolChain().addStartObjectFileArgs(Args, CmdArgs);
Daniel Dunbarc1964212009-03-26 16:23:12 +00005413
5414 Args.AddAllArgs(CmdArgs, options::OPT_L);
Daniel Dunbard067f7f2009-04-08 23:54:23 +00005415
Alexey Bataev186b28a2014-03-06 05:43:53 +00005416 LibOpenMP UsedOpenMPLib = LibUnknown;
5417 if (Args.hasArg(options::OPT_fopenmp)) {
5418 UsedOpenMPLib = LibGOMP;
5419 } else if (const Arg *A = Args.getLastArg(options::OPT_fopenmp_EQ)) {
5420 UsedOpenMPLib = llvm::StringSwitch<LibOpenMP>(A->getValue())
5421 .Case("libgomp", LibGOMP)
5422 .Case("libiomp5", LibIOMP5)
5423 .Default(LibUnknown);
5424 if (UsedOpenMPLib == LibUnknown)
5425 getToolChain().getDriver().Diag(diag::err_drv_unsupported_option_argument)
5426 << A->getOption().getName() << A->getValue();
5427 }
5428 switch (UsedOpenMPLib) {
5429 case LibGOMP:
Daniel Dunbarc1964212009-03-26 16:23:12 +00005430 CmdArgs.push_back("-lgomp");
Alexey Bataev186b28a2014-03-06 05:43:53 +00005431 break;
5432 case LibIOMP5:
5433 CmdArgs.push_back("-liomp5");
5434 break;
5435 case LibUnknown:
5436 break;
5437 }
Daniel Dunbarc1964212009-03-26 16:23:12 +00005438
Douglas Gregor9295df02012-05-15 21:00:27 +00005439 AddLinkerInputs(getToolChain(), Inputs, Args, CmdArgs);
5440
Bob Wilson16d93952012-05-15 18:57:39 +00005441 if (isObjCRuntimeLinked(Args) &&
5442 !Args.hasArg(options::OPT_nostdlib) &&
5443 !Args.hasArg(options::OPT_nodefaultlibs)) {
Tim Northover157d9112014-01-16 08:48:16 +00005444 // We use arclite library for both ARC and subscripting support.
5445 getMachOToolChain().AddLinkARCArgs(Args, CmdArgs);
5446
Bob Wilson7dda0cd2012-04-21 00:21:42 +00005447 CmdArgs.push_back("-framework");
5448 CmdArgs.push_back("Foundation");
Ted Kremeneke65b0862012-03-06 20:05:56 +00005449 // Link libobj.
5450 CmdArgs.push_back("-lobjc");
John McCall24fc0de2011-07-06 00:26:06 +00005451 }
John McCall31168b02011-06-15 23:02:42 +00005452
Daniel Dunbarc1964212009-03-26 16:23:12 +00005453 if (LinkingOutput) {
5454 CmdArgs.push_back("-arch_multiple");
5455 CmdArgs.push_back("-final_output");
5456 CmdArgs.push_back(LinkingOutput);
5457 }
5458
Daniel Dunbarc1964212009-03-26 16:23:12 +00005459 if (Args.hasArg(options::OPT_fnested_functions))
5460 CmdArgs.push_back("-allow_stack_execute");
Daniel Dunbard067f7f2009-04-08 23:54:23 +00005461
Daniel Dunbarc1964212009-03-26 16:23:12 +00005462 if (!Args.hasArg(options::OPT_nostdlib) &&
5463 !Args.hasArg(options::OPT_nodefaultlibs)) {
Hans Wennborg70850d82013-07-18 20:29:38 +00005464 if (getToolChain().getDriver().CCCIsCXX())
Daniel Dunbar3f7796f2010-09-17 01:20:05 +00005465 getToolChain().AddCXXStdlibLibArgs(Args, CmdArgs);
Daniel Dunbarad0f62b2009-04-08 06:06:21 +00005466
Daniel Dunbarc1964212009-03-26 16:23:12 +00005467 // link_ssp spec is empty.
5468
Daniel Dunbar26d482a2009-09-18 08:15:03 +00005469 // Let the tool chain choose which runtime library to link.
Tim Northover157d9112014-01-16 08:48:16 +00005470 getMachOToolChain().AddLinkRuntimeLibArgs(Args, CmdArgs);
Daniel Dunbarc1964212009-03-26 16:23:12 +00005471 }
5472
Chad Rosier06fd3c62012-05-16 23:45:12 +00005473 if (!Args.hasArg(options::OPT_nostdlib) &&
Daniel Dunbarc1964212009-03-26 16:23:12 +00005474 !Args.hasArg(options::OPT_nostartfiles)) {
5475 // endfile_spec is empty.
5476 }
5477
5478 Args.AddAllArgs(CmdArgs, options::OPT_T_Group);
5479 Args.AddAllArgs(CmdArgs, options::OPT_F);
5480
Daniel Dunbard067f7f2009-04-08 23:54:23 +00005481 const char *Exec =
Daniel Dunbar9c3ed5f2010-07-14 18:46:23 +00005482 Args.MakeArgString(getToolChain().GetProgramPath("ld"));
Daniel Dunbar7fbaf532010-08-02 02:38:28 +00005483 C.addCommand(new Command(JA, *this, Exec, CmdArgs));
Daniel Dunbarc1964212009-03-26 16:23:12 +00005484}
5485
Daniel Dunbar64ed5e32009-03-20 00:52:38 +00005486void darwin::Lipo::ConstructJob(Compilation &C, const JobAction &JA,
Daniel Dunbar7fbaf532010-08-02 02:38:28 +00005487 const InputInfo &Output,
Daniel Dunbard067f7f2009-04-08 23:54:23 +00005488 const InputInfoList &Inputs,
5489 const ArgList &Args,
Daniel Dunbar64ed5e32009-03-20 00:52:38 +00005490 const char *LinkingOutput) const {
5491 ArgStringList CmdArgs;
5492
5493 CmdArgs.push_back("-create");
5494 assert(Output.isFilename() && "Unexpected lipo output.");
Daniel Dunbar06686ab2009-03-24 00:24:37 +00005495
5496 CmdArgs.push_back("-output");
Daniel Dunbar64ed5e32009-03-20 00:52:38 +00005497 CmdArgs.push_back(Output.getFilename());
Daniel Dunbar06686ab2009-03-24 00:24:37 +00005498
Daniel Dunbar64ed5e32009-03-20 00:52:38 +00005499 for (InputInfoList::const_iterator
5500 it = Inputs.begin(), ie = Inputs.end(); it != ie; ++it) {
5501 const InputInfo &II = *it;
5502 assert(II.isFilename() && "Unexpected lipo input.");
5503 CmdArgs.push_back(II.getFilename());
5504 }
Daniel Dunbard067f7f2009-04-08 23:54:23 +00005505 const char *Exec =
Daniel Dunbar9c3ed5f2010-07-14 18:46:23 +00005506 Args.MakeArgString(getToolChain().GetProgramPath("lipo"));
Daniel Dunbar7fbaf532010-08-02 02:38:28 +00005507 C.addCommand(new Command(JA, *this, Exec, CmdArgs));
Daniel Dunbar64ed5e32009-03-20 00:52:38 +00005508}
Daniel Dunbar8eb473c2009-03-31 17:45:15 +00005509
Daniel Dunbar88299622010-06-04 18:28:36 +00005510void darwin::Dsymutil::ConstructJob(Compilation &C, const JobAction &JA,
Daniel Dunbar7fbaf532010-08-02 02:38:28 +00005511 const InputInfo &Output,
Daniel Dunbar88299622010-06-04 18:28:36 +00005512 const InputInfoList &Inputs,
5513 const ArgList &Args,
5514 const char *LinkingOutput) const {
5515 ArgStringList CmdArgs;
5516
Daniel Dunbareb86b042011-05-09 17:23:16 +00005517 CmdArgs.push_back("-o");
5518 CmdArgs.push_back(Output.getFilename());
5519
Daniel Dunbar88299622010-06-04 18:28:36 +00005520 assert(Inputs.size() == 1 && "Unable to handle multiple inputs.");
5521 const InputInfo &Input = Inputs[0];
5522 assert(Input.isFilename() && "Unexpected dsymutil input.");
5523 CmdArgs.push_back(Input.getFilename());
5524
Daniel Dunbar88299622010-06-04 18:28:36 +00005525 const char *Exec =
Daniel Dunbar9c3ed5f2010-07-14 18:46:23 +00005526 Args.MakeArgString(getToolChain().GetProgramPath("dsymutil"));
Daniel Dunbar7fbaf532010-08-02 02:38:28 +00005527 C.addCommand(new Command(JA, *this, Exec, CmdArgs));
Daniel Dunbar88299622010-06-04 18:28:36 +00005528}
5529
Eric Christopher551ef452011-08-23 17:56:55 +00005530void darwin::VerifyDebug::ConstructJob(Compilation &C, const JobAction &JA,
Eric Christopher45f2e712012-12-18 00:31:10 +00005531 const InputInfo &Output,
5532 const InputInfoList &Inputs,
5533 const ArgList &Args,
5534 const char *LinkingOutput) const {
Eric Christopher551ef452011-08-23 17:56:55 +00005535 ArgStringList CmdArgs;
5536 CmdArgs.push_back("--verify");
Eric Christopher36222212012-02-06 19:13:09 +00005537 CmdArgs.push_back("--debug-info");
5538 CmdArgs.push_back("--eh-frame");
Eric Christopher65c05fa2012-02-06 19:43:51 +00005539 CmdArgs.push_back("--quiet");
Eric Christopher551ef452011-08-23 17:56:55 +00005540
5541 assert(Inputs.size() == 1 && "Unable to handle multiple inputs.");
5542 const InputInfo &Input = Inputs[0];
5543 assert(Input.isFilename() && "Unexpected verify input");
5544
5545 // Grabbing the output of the earlier dsymutil run.
5546 CmdArgs.push_back(Input.getFilename());
5547
5548 const char *Exec =
5549 Args.MakeArgString(getToolChain().GetProgramPath("dwarfdump"));
5550 C.addCommand(new Command(JA, *this, Exec, CmdArgs));
5551}
5552
David Chisnallf571cde2012-02-15 13:39:01 +00005553void solaris::Assemble::ConstructJob(Compilation &C, const JobAction &JA,
5554 const InputInfo &Output,
5555 const InputInfoList &Inputs,
5556 const ArgList &Args,
5557 const char *LinkingOutput) const {
5558 ArgStringList CmdArgs;
5559
5560 Args.AddAllArgValues(CmdArgs, options::OPT_Wa_COMMA,
5561 options::OPT_Xassembler);
5562
5563 CmdArgs.push_back("-o");
5564 CmdArgs.push_back(Output.getFilename());
5565
5566 for (InputInfoList::const_iterator
5567 it = Inputs.begin(), ie = Inputs.end(); it != ie; ++it) {
5568 const InputInfo &II = *it;
5569 CmdArgs.push_back(II.getFilename());
5570 }
5571
5572 const char *Exec =
5573 Args.MakeArgString(getToolChain().GetProgramPath("as"));
5574 C.addCommand(new Command(JA, *this, Exec, CmdArgs));
5575}
5576
5577
5578void solaris::Link::ConstructJob(Compilation &C, const JobAction &JA,
5579 const InputInfo &Output,
5580 const InputInfoList &Inputs,
5581 const ArgList &Args,
5582 const char *LinkingOutput) const {
5583 // FIXME: Find a real GCC, don't hard-code versions here
5584 std::string GCCLibPath = "/usr/gcc/4.5/lib/gcc/";
5585 const llvm::Triple &T = getToolChain().getTriple();
5586 std::string LibPath = "/usr/lib/";
5587 llvm::Triple::ArchType Arch = T.getArch();
5588 switch (Arch) {
Benjamin Kramerb2ccade2013-10-21 12:33:55 +00005589 case llvm::Triple::x86:
5590 GCCLibPath +=
5591 ("i386-" + T.getVendorName() + "-" + T.getOSName()).str() + "/4.5.2/";
5592 break;
5593 case llvm::Triple::x86_64:
5594 GCCLibPath += ("i386-" + T.getVendorName() + "-" + T.getOSName()).str();
5595 GCCLibPath += "/4.5.2/amd64/";
5596 LibPath += "amd64/";
5597 break;
5598 default:
5599 llvm_unreachable("Unsupported architecture");
David Chisnallf571cde2012-02-15 13:39:01 +00005600 }
5601
5602 ArgStringList CmdArgs;
5603
David Chisnall272a0712012-02-29 15:06:12 +00005604 // Demangle C++ names in errors
5605 CmdArgs.push_back("-C");
5606
David Chisnallf571cde2012-02-15 13:39:01 +00005607 if ((!Args.hasArg(options::OPT_nostdlib)) &&
5608 (!Args.hasArg(options::OPT_shared))) {
5609 CmdArgs.push_back("-e");
5610 CmdArgs.push_back("_start");
5611 }
5612
5613 if (Args.hasArg(options::OPT_static)) {
5614 CmdArgs.push_back("-Bstatic");
5615 CmdArgs.push_back("-dn");
5616 } else {
5617 CmdArgs.push_back("-Bdynamic");
5618 if (Args.hasArg(options::OPT_shared)) {
5619 CmdArgs.push_back("-shared");
5620 } else {
5621 CmdArgs.push_back("--dynamic-linker");
5622 CmdArgs.push_back(Args.MakeArgString(LibPath + "ld.so.1"));
5623 }
5624 }
5625
5626 if (Output.isFilename()) {
5627 CmdArgs.push_back("-o");
5628 CmdArgs.push_back(Output.getFilename());
5629 } else {
5630 assert(Output.isNothing() && "Invalid output.");
5631 }
5632
5633 if (!Args.hasArg(options::OPT_nostdlib) &&
5634 !Args.hasArg(options::OPT_nostartfiles)) {
5635 if (!Args.hasArg(options::OPT_shared)) {
5636 CmdArgs.push_back(Args.MakeArgString(LibPath + "crt1.o"));
5637 CmdArgs.push_back(Args.MakeArgString(LibPath + "crti.o"));
David Chisnall0c52c0f2012-02-28 17:10:04 +00005638 CmdArgs.push_back(Args.MakeArgString(LibPath + "values-Xa.o"));
David Chisnallf571cde2012-02-15 13:39:01 +00005639 CmdArgs.push_back(Args.MakeArgString(GCCLibPath + "crtbegin.o"));
5640 } else {
5641 CmdArgs.push_back(Args.MakeArgString(LibPath + "crti.o"));
David Chisnall0c52c0f2012-02-28 17:10:04 +00005642 CmdArgs.push_back(Args.MakeArgString(LibPath + "values-Xa.o"));
5643 CmdArgs.push_back(Args.MakeArgString(GCCLibPath + "crtbegin.o"));
David Chisnallf571cde2012-02-15 13:39:01 +00005644 }
Hans Wennborg70850d82013-07-18 20:29:38 +00005645 if (getToolChain().getDriver().CCCIsCXX())
David Chisnallddc4c9d2012-03-13 14:14:54 +00005646 CmdArgs.push_back(Args.MakeArgString(LibPath + "cxa_finalize.o"));
David Chisnallf571cde2012-02-15 13:39:01 +00005647 }
5648
5649 CmdArgs.push_back(Args.MakeArgString("-L" + GCCLibPath));
5650
5651 Args.AddAllArgs(CmdArgs, options::OPT_L);
5652 Args.AddAllArgs(CmdArgs, options::OPT_T_Group);
5653 Args.AddAllArgs(CmdArgs, options::OPT_e);
David Chisnall0c52c0f2012-02-28 17:10:04 +00005654 Args.AddAllArgs(CmdArgs, options::OPT_r);
David Chisnallf571cde2012-02-15 13:39:01 +00005655
5656 AddLinkerInputs(getToolChain(), Inputs, Args, CmdArgs);
5657
5658 if (!Args.hasArg(options::OPT_nostdlib) &&
5659 !Args.hasArg(options::OPT_nodefaultlibs)) {
Hans Wennborg70850d82013-07-18 20:29:38 +00005660 if (getToolChain().getDriver().CCCIsCXX())
David Chisnall3d127c72012-04-10 11:49:50 +00005661 getToolChain().AddCXXStdlibLibArgs(Args, CmdArgs);
David Chisnall1026fb02012-02-15 18:24:31 +00005662 CmdArgs.push_back("-lgcc_s");
David Chisnall0c52c0f2012-02-28 17:10:04 +00005663 if (!Args.hasArg(options::OPT_shared)) {
5664 CmdArgs.push_back("-lgcc");
David Chisnallf571cde2012-02-15 13:39:01 +00005665 CmdArgs.push_back("-lc");
David Chisnallc73fb892012-02-28 20:06:45 +00005666 CmdArgs.push_back("-lm");
David Chisnall0c52c0f2012-02-28 17:10:04 +00005667 }
David Chisnallf571cde2012-02-15 13:39:01 +00005668 }
5669
5670 if (!Args.hasArg(options::OPT_nostdlib) &&
5671 !Args.hasArg(options::OPT_nostartfiles)) {
David Chisnall0c52c0f2012-02-28 17:10:04 +00005672 CmdArgs.push_back(Args.MakeArgString(GCCLibPath + "crtend.o"));
David Chisnallf571cde2012-02-15 13:39:01 +00005673 }
David Chisnall96de9932012-02-16 16:00:47 +00005674 CmdArgs.push_back(Args.MakeArgString(LibPath + "crtn.o"));
David Chisnallf571cde2012-02-15 13:39:01 +00005675
Alexey Samsonov7811d192014-02-20 13:57:37 +00005676 addProfileRT(getToolChain(), Args, CmdArgs);
David Chisnallf571cde2012-02-15 13:39:01 +00005677
5678 const char *Exec =
Rafael Espindola236db462013-11-09 20:07:19 +00005679 Args.MakeArgString(getToolChain().GetProgramPath("ld"));
David Chisnallf571cde2012-02-15 13:39:01 +00005680 C.addCommand(new Command(JA, *this, Exec, CmdArgs));
5681}
5682
Edward O'Callaghan856e4ff2009-08-22 01:06:46 +00005683void auroraux::Assemble::ConstructJob(Compilation &C, const JobAction &JA,
Daniel Dunbar7fbaf532010-08-02 02:38:28 +00005684 const InputInfo &Output,
Daniel Dunbar1c7577c2009-11-04 06:24:38 +00005685 const InputInfoList &Inputs,
5686 const ArgList &Args,
5687 const char *LinkingOutput) const {
Edward O'Callaghan856e4ff2009-08-22 01:06:46 +00005688 ArgStringList CmdArgs;
5689
5690 Args.AddAllArgValues(CmdArgs, options::OPT_Wa_COMMA,
5691 options::OPT_Xassembler);
5692
5693 CmdArgs.push_back("-o");
Daniel Dunbarb440f562010-08-02 02:38:21 +00005694 CmdArgs.push_back(Output.getFilename());
Edward O'Callaghan856e4ff2009-08-22 01:06:46 +00005695
5696 for (InputInfoList::const_iterator
5697 it = Inputs.begin(), ie = Inputs.end(); it != ie; ++it) {
5698 const InputInfo &II = *it;
Daniel Dunbarb440f562010-08-02 02:38:21 +00005699 CmdArgs.push_back(II.getFilename());
Edward O'Callaghan856e4ff2009-08-22 01:06:46 +00005700 }
5701
5702 const char *Exec =
Daniel Dunbar9c3ed5f2010-07-14 18:46:23 +00005703 Args.MakeArgString(getToolChain().GetProgramPath("gas"));
Daniel Dunbar7fbaf532010-08-02 02:38:28 +00005704 C.addCommand(new Command(JA, *this, Exec, CmdArgs));
Edward O'Callaghan856e4ff2009-08-22 01:06:46 +00005705}
5706
5707void auroraux::Link::ConstructJob(Compilation &C, const JobAction &JA,
Daniel Dunbar7fbaf532010-08-02 02:38:28 +00005708 const InputInfo &Output,
Daniel Dunbar1c7577c2009-11-04 06:24:38 +00005709 const InputInfoList &Inputs,
5710 const ArgList &Args,
5711 const char *LinkingOutput) const {
Edward O'Callaghan856e4ff2009-08-22 01:06:46 +00005712 ArgStringList CmdArgs;
5713
5714 if ((!Args.hasArg(options::OPT_nostdlib)) &&
Daniel Dunbar1c7577c2009-11-04 06:24:38 +00005715 (!Args.hasArg(options::OPT_shared))) {
Edward O'Callaghan856e4ff2009-08-22 01:06:46 +00005716 CmdArgs.push_back("-e");
Edward O'Callaghand8712d92009-10-15 07:44:07 +00005717 CmdArgs.push_back("_start");
Edward O'Callaghan856e4ff2009-08-22 01:06:46 +00005718 }
5719
5720 if (Args.hasArg(options::OPT_static)) {
5721 CmdArgs.push_back("-Bstatic");
Edward O'Callaghand8712d92009-10-15 07:44:07 +00005722 CmdArgs.push_back("-dn");
Edward O'Callaghan856e4ff2009-08-22 01:06:46 +00005723 } else {
Edward O'Callaghand8712d92009-10-15 07:44:07 +00005724// CmdArgs.push_back("--eh-frame-hdr");
Edward O'Callaghan856e4ff2009-08-22 01:06:46 +00005725 CmdArgs.push_back("-Bdynamic");
5726 if (Args.hasArg(options::OPT_shared)) {
5727 CmdArgs.push_back("-shared");
5728 } else {
Edward O'Callaghan7d3c2752009-10-16 19:44:18 +00005729 CmdArgs.push_back("--dynamic-linker");
Edward O'Callaghan856e4ff2009-08-22 01:06:46 +00005730 CmdArgs.push_back("/lib/ld.so.1"); // 64Bit Path /lib/amd64/ld.so.1
5731 }
5732 }
5733
Daniel Dunbarb440f562010-08-02 02:38:21 +00005734 if (Output.isFilename()) {
Edward O'Callaghan856e4ff2009-08-22 01:06:46 +00005735 CmdArgs.push_back("-o");
5736 CmdArgs.push_back(Output.getFilename());
5737 } else {
5738 assert(Output.isNothing() && "Invalid output.");
5739 }
5740
5741 if (!Args.hasArg(options::OPT_nostdlib) &&
5742 !Args.hasArg(options::OPT_nostartfiles)) {
5743 if (!Args.hasArg(options::OPT_shared)) {
Chris Lattner3e2ee142010-07-07 16:01:42 +00005744 CmdArgs.push_back(Args.MakeArgString(
Daniel Dunbar9c3ed5f2010-07-14 18:46:23 +00005745 getToolChain().GetFilePath("crt1.o")));
Chris Lattner3e2ee142010-07-07 16:01:42 +00005746 CmdArgs.push_back(Args.MakeArgString(
Daniel Dunbar9c3ed5f2010-07-14 18:46:23 +00005747 getToolChain().GetFilePath("crti.o")));
Chris Lattner3e2ee142010-07-07 16:01:42 +00005748 CmdArgs.push_back(Args.MakeArgString(
Daniel Dunbar9c3ed5f2010-07-14 18:46:23 +00005749 getToolChain().GetFilePath("crtbegin.o")));
Edward O'Callaghan856e4ff2009-08-22 01:06:46 +00005750 } else {
Chris Lattner3e2ee142010-07-07 16:01:42 +00005751 CmdArgs.push_back(Args.MakeArgString(
Daniel Dunbar9c3ed5f2010-07-14 18:46:23 +00005752 getToolChain().GetFilePath("crti.o")));
Edward O'Callaghan856e4ff2009-08-22 01:06:46 +00005753 }
Chris Lattner3e2ee142010-07-07 16:01:42 +00005754 CmdArgs.push_back(Args.MakeArgString(
Daniel Dunbar9c3ed5f2010-07-14 18:46:23 +00005755 getToolChain().GetFilePath("crtn.o")));
Edward O'Callaghan856e4ff2009-08-22 01:06:46 +00005756 }
5757
Daniel Dunbar1c7577c2009-11-04 06:24:38 +00005758 CmdArgs.push_back(Args.MakeArgString("-L/opt/gcc4/lib/gcc/"
5759 + getToolChain().getTripleString()
Daniel Dunbarb0b18612009-10-29 02:24:37 +00005760 + "/4.2.4"));
Edward O'Callaghan856e4ff2009-08-22 01:06:46 +00005761
5762 Args.AddAllArgs(CmdArgs, options::OPT_L);
5763 Args.AddAllArgs(CmdArgs, options::OPT_T_Group);
5764 Args.AddAllArgs(CmdArgs, options::OPT_e);
5765
Daniel Dunbar54423b22010-09-17 00:24:54 +00005766 AddLinkerInputs(getToolChain(), Inputs, Args, CmdArgs);
Edward O'Callaghan856e4ff2009-08-22 01:06:46 +00005767
5768 if (!Args.hasArg(options::OPT_nostdlib) &&
5769 !Args.hasArg(options::OPT_nodefaultlibs)) {
5770 // FIXME: For some reason GCC passes -lgcc before adding
5771 // the default system libraries. Just mimic this for now.
5772 CmdArgs.push_back("-lgcc");
5773
5774 if (Args.hasArg(options::OPT_pthread))
5775 CmdArgs.push_back("-pthread");
5776 if (!Args.hasArg(options::OPT_shared))
5777 CmdArgs.push_back("-lc");
5778 CmdArgs.push_back("-lgcc");
5779 }
5780
5781 if (!Args.hasArg(options::OPT_nostdlib) &&
5782 !Args.hasArg(options::OPT_nostartfiles)) {
5783 if (!Args.hasArg(options::OPT_shared))
Chris Lattner3e2ee142010-07-07 16:01:42 +00005784 CmdArgs.push_back(Args.MakeArgString(
Daniel Dunbar9c3ed5f2010-07-14 18:46:23 +00005785 getToolChain().GetFilePath("crtend.o")));
Edward O'Callaghan856e4ff2009-08-22 01:06:46 +00005786 }
5787
Alexey Samsonov7811d192014-02-20 13:57:37 +00005788 addProfileRT(getToolChain(), Args, CmdArgs);
Nick Lewycky82fe5f42011-05-24 21:54:59 +00005789
Edward O'Callaghan856e4ff2009-08-22 01:06:46 +00005790 const char *Exec =
Rafael Espindola236db462013-11-09 20:07:19 +00005791 Args.MakeArgString(getToolChain().GetProgramPath("ld"));
Daniel Dunbar7fbaf532010-08-02 02:38:28 +00005792 C.addCommand(new Command(JA, *this, Exec, CmdArgs));
Edward O'Callaghan856e4ff2009-08-22 01:06:46 +00005793}
5794
Daniel Dunbar10de9e62009-06-29 20:52:51 +00005795void openbsd::Assemble::ConstructJob(Compilation &C, const JobAction &JA,
Daniel Dunbar7fbaf532010-08-02 02:38:28 +00005796 const InputInfo &Output,
Daniel Dunbar10de9e62009-06-29 20:52:51 +00005797 const InputInfoList &Inputs,
5798 const ArgList &Args,
Mike Stump11289f42009-09-09 15:08:12 +00005799 const char *LinkingOutput) const {
Daniel Dunbar10de9e62009-06-29 20:52:51 +00005800 ArgStringList CmdArgs;
Rafael Espindolacc126272014-02-28 01:55:21 +00005801 bool NeedsKPIC = false;
Daniel Dunbar10de9e62009-06-29 20:52:51 +00005802
Rafael Espindolacc126272014-02-28 01:55:21 +00005803 switch (getToolChain().getArch()) {
5804 case llvm::Triple::x86:
5805 // When building 32-bit code on OpenBSD/amd64, we have to explicitly
5806 // instruct as in the base system to assemble 32-bit code.
Joerg Sonnenbergeree3b2da2013-12-07 00:57:46 +00005807 CmdArgs.push_back("--32");
Rafael Espindolacc126272014-02-28 01:55:21 +00005808 break;
5809
5810 case llvm::Triple::ppc:
Joerg Sonnenbergeree3b2da2013-12-07 00:57:46 +00005811 CmdArgs.push_back("-mppc");
5812 CmdArgs.push_back("-many");
Rafael Espindolacc126272014-02-28 01:55:21 +00005813 break;
5814
5815 case llvm::Triple::sparc:
5816 CmdArgs.push_back("-32");
5817 NeedsKPIC = true;
5818 break;
5819
5820 case llvm::Triple::sparcv9:
5821 CmdArgs.push_back("-64");
5822 CmdArgs.push_back("-Av9a");
5823 NeedsKPIC = true;
5824 break;
5825
5826 case llvm::Triple::mips64:
5827 case llvm::Triple::mips64el: {
Joerg Sonnenbergeree3b2da2013-12-07 00:57:46 +00005828 StringRef CPUName;
5829 StringRef ABIName;
5830 getMipsCPUAndABI(Args, getToolChain().getTriple(), CPUName, ABIName);
5831
5832 CmdArgs.push_back("-mabi");
5833 CmdArgs.push_back(getGnuCompatibleMipsABIName(ABIName).data());
5834
5835 if (getToolChain().getArch() == llvm::Triple::mips64)
5836 CmdArgs.push_back("-EB");
5837 else
5838 CmdArgs.push_back("-EL");
5839
Rafael Espindolacc126272014-02-28 01:55:21 +00005840 NeedsKPIC = true;
5841 break;
Joerg Sonnenbergeree3b2da2013-12-07 00:57:46 +00005842 }
5843
Rafael Espindolacc126272014-02-28 01:55:21 +00005844 default:
5845 break;
5846 }
5847
5848 if (NeedsKPIC)
5849 addAssemblerKPIC(Args, CmdArgs);
5850
Daniel Dunbar10de9e62009-06-29 20:52:51 +00005851 Args.AddAllArgValues(CmdArgs, options::OPT_Wa_COMMA,
5852 options::OPT_Xassembler);
5853
5854 CmdArgs.push_back("-o");
Daniel Dunbarb440f562010-08-02 02:38:21 +00005855 CmdArgs.push_back(Output.getFilename());
Daniel Dunbar10de9e62009-06-29 20:52:51 +00005856
5857 for (InputInfoList::const_iterator
5858 it = Inputs.begin(), ie = Inputs.end(); it != ie; ++it) {
5859 const InputInfo &II = *it;
Daniel Dunbarb440f562010-08-02 02:38:21 +00005860 CmdArgs.push_back(II.getFilename());
Daniel Dunbar10de9e62009-06-29 20:52:51 +00005861 }
5862
5863 const char *Exec =
Daniel Dunbar9c3ed5f2010-07-14 18:46:23 +00005864 Args.MakeArgString(getToolChain().GetProgramPath("as"));
Daniel Dunbar7fbaf532010-08-02 02:38:28 +00005865 C.addCommand(new Command(JA, *this, Exec, CmdArgs));
Daniel Dunbar10de9e62009-06-29 20:52:51 +00005866}
5867
5868void openbsd::Link::ConstructJob(Compilation &C, const JobAction &JA,
Daniel Dunbar7fbaf532010-08-02 02:38:28 +00005869 const InputInfo &Output,
Daniel Dunbar10de9e62009-06-29 20:52:51 +00005870 const InputInfoList &Inputs,
5871 const ArgList &Args,
5872 const char *LinkingOutput) const {
Daniel Dunbar083edf72009-12-21 18:54:17 +00005873 const Driver &D = getToolChain().getDriver();
Daniel Dunbar10de9e62009-06-29 20:52:51 +00005874 ArgStringList CmdArgs;
5875
Rafael Espindolaaadd30e2012-12-31 22:41:36 +00005876 // Silence warning for "clang -g foo.o -o foo"
5877 Args.ClaimAllArgs(options::OPT_g_Group);
5878 // and "clang -emit-llvm foo.o -o foo"
5879 Args.ClaimAllArgs(options::OPT_emit_llvm);
5880 // and for "clang -w foo.o -o foo". Other warning options are already
5881 // handled somewhere else.
5882 Args.ClaimAllArgs(options::OPT_w);
5883
Joerg Sonnenbergeree3b2da2013-12-07 00:57:46 +00005884 if (getToolChain().getArch() == llvm::Triple::mips64)
5885 CmdArgs.push_back("-EB");
5886 else if (getToolChain().getArch() == llvm::Triple::mips64el)
5887 CmdArgs.push_back("-EL");
5888
Daniel Dunbara8888ac2009-08-03 01:28:59 +00005889 if ((!Args.hasArg(options::OPT_nostdlib)) &&
Daniel Dunbar1c7577c2009-11-04 06:24:38 +00005890 (!Args.hasArg(options::OPT_shared))) {
Daniel Dunbara8888ac2009-08-03 01:28:59 +00005891 CmdArgs.push_back("-e");
5892 CmdArgs.push_back("__start");
5893 }
5894
Daniel Dunbar10de9e62009-06-29 20:52:51 +00005895 if (Args.hasArg(options::OPT_static)) {
5896 CmdArgs.push_back("-Bstatic");
5897 } else {
Rafael Espindola7ba97af2010-11-11 02:17:51 +00005898 if (Args.hasArg(options::OPT_rdynamic))
5899 CmdArgs.push_back("-export-dynamic");
Daniel Dunbar10de9e62009-06-29 20:52:51 +00005900 CmdArgs.push_back("--eh-frame-hdr");
Daniel Dunbara8888ac2009-08-03 01:28:59 +00005901 CmdArgs.push_back("-Bdynamic");
Daniel Dunbar10de9e62009-06-29 20:52:51 +00005902 if (Args.hasArg(options::OPT_shared)) {
Daniel Dunbara8888ac2009-08-03 01:28:59 +00005903 CmdArgs.push_back("-shared");
Daniel Dunbar10de9e62009-06-29 20:52:51 +00005904 } else {
5905 CmdArgs.push_back("-dynamic-linker");
5906 CmdArgs.push_back("/usr/libexec/ld.so");
5907 }
5908 }
5909
Rafael Espindola044f7832013-06-05 04:28:55 +00005910 if (Args.hasArg(options::OPT_nopie))
5911 CmdArgs.push_back("-nopie");
5912
Daniel Dunbarb440f562010-08-02 02:38:21 +00005913 if (Output.isFilename()) {
Daniel Dunbar10de9e62009-06-29 20:52:51 +00005914 CmdArgs.push_back("-o");
5915 CmdArgs.push_back(Output.getFilename());
5916 } else {
5917 assert(Output.isNothing() && "Invalid output.");
5918 }
5919
5920 if (!Args.hasArg(options::OPT_nostdlib) &&
5921 !Args.hasArg(options::OPT_nostartfiles)) {
5922 if (!Args.hasArg(options::OPT_shared)) {
Eli Friedman3715d1f2011-12-15 02:15:56 +00005923 if (Args.hasArg(options::OPT_pg))
5924 CmdArgs.push_back(Args.MakeArgString(
5925 getToolChain().GetFilePath("gcrt0.o")));
5926 else
5927 CmdArgs.push_back(Args.MakeArgString(
5928 getToolChain().GetFilePath("crt0.o")));
Chris Lattner3e2ee142010-07-07 16:01:42 +00005929 CmdArgs.push_back(Args.MakeArgString(
Daniel Dunbar9c3ed5f2010-07-14 18:46:23 +00005930 getToolChain().GetFilePath("crtbegin.o")));
Daniel Dunbar10de9e62009-06-29 20:52:51 +00005931 } else {
Chris Lattner3e2ee142010-07-07 16:01:42 +00005932 CmdArgs.push_back(Args.MakeArgString(
Daniel Dunbar9c3ed5f2010-07-14 18:46:23 +00005933 getToolChain().GetFilePath("crtbeginS.o")));
Daniel Dunbar10de9e62009-06-29 20:52:51 +00005934 }
5935 }
5936
Edward O'Callaghan5c521462009-10-28 15:13:08 +00005937 std::string Triple = getToolChain().getTripleString();
5938 if (Triple.substr(0, 6) == "x86_64")
Daniel Dunbar1c7577c2009-11-04 06:24:38 +00005939 Triple.replace(0, 6, "amd64");
Daniel Dunbarb0b18612009-10-29 02:24:37 +00005940 CmdArgs.push_back(Args.MakeArgString("-L/usr/lib/gcc-lib/" + Triple +
Daniel Dunbarea3813f2010-08-01 23:13:54 +00005941 "/4.2.1"));
Daniel Dunbara8888ac2009-08-03 01:28:59 +00005942
Daniel Dunbar10de9e62009-06-29 20:52:51 +00005943 Args.AddAllArgs(CmdArgs, options::OPT_L);
5944 Args.AddAllArgs(CmdArgs, options::OPT_T_Group);
5945 Args.AddAllArgs(CmdArgs, options::OPT_e);
Rafael Espindolaaadd30e2012-12-31 22:41:36 +00005946 Args.AddAllArgs(CmdArgs, options::OPT_s);
5947 Args.AddAllArgs(CmdArgs, options::OPT_t);
5948 Args.AddAllArgs(CmdArgs, options::OPT_Z_Flag);
5949 Args.AddAllArgs(CmdArgs, options::OPT_r);
Daniel Dunbar10de9e62009-06-29 20:52:51 +00005950
Daniel Dunbar54423b22010-09-17 00:24:54 +00005951 AddLinkerInputs(getToolChain(), Inputs, Args, CmdArgs);
Daniel Dunbar10de9e62009-06-29 20:52:51 +00005952
5953 if (!Args.hasArg(options::OPT_nostdlib) &&
5954 !Args.hasArg(options::OPT_nodefaultlibs)) {
Hans Wennborg70850d82013-07-18 20:29:38 +00005955 if (D.CCCIsCXX()) {
Daniel Dunbar3f7796f2010-09-17 01:20:05 +00005956 getToolChain().AddCXXStdlibLibArgs(Args, CmdArgs);
Eli Friedman3715d1f2011-12-15 02:15:56 +00005957 if (Args.hasArg(options::OPT_pg))
5958 CmdArgs.push_back("-lm_p");
5959 else
5960 CmdArgs.push_back("-lm");
Daniel Dunbarea3813f2010-08-01 23:13:54 +00005961 }
5962
Daniel Dunbara8888ac2009-08-03 01:28:59 +00005963 // FIXME: For some reason GCC passes -lgcc before adding
5964 // the default system libraries. Just mimic this for now.
5965 CmdArgs.push_back("-lgcc");
Daniel Dunbar10de9e62009-06-29 20:52:51 +00005966
Eric Christopher17674ec2012-09-13 06:32:34 +00005967 if (Args.hasArg(options::OPT_pthread)) {
5968 if (!Args.hasArg(options::OPT_shared) &&
5969 Args.hasArg(options::OPT_pg))
5970 CmdArgs.push_back("-lpthread_p");
5971 else
5972 CmdArgs.push_back("-lpthread");
5973 }
5974
Chandler Carruth45661652011-12-17 22:32:42 +00005975 if (!Args.hasArg(options::OPT_shared)) {
Eric Christopher17674ec2012-09-13 06:32:34 +00005976 if (Args.hasArg(options::OPT_pg))
Eli Friedman3715d1f2011-12-15 02:15:56 +00005977 CmdArgs.push_back("-lc_p");
5978 else
5979 CmdArgs.push_back("-lc");
Chandler Carruth45661652011-12-17 22:32:42 +00005980 }
Eric Christopher17674ec2012-09-13 06:32:34 +00005981
Daniel Dunbara8888ac2009-08-03 01:28:59 +00005982 CmdArgs.push_back("-lgcc");
Daniel Dunbar10de9e62009-06-29 20:52:51 +00005983 }
5984
5985 if (!Args.hasArg(options::OPT_nostdlib) &&
5986 !Args.hasArg(options::OPT_nostartfiles)) {
5987 if (!Args.hasArg(options::OPT_shared))
Chris Lattner3e2ee142010-07-07 16:01:42 +00005988 CmdArgs.push_back(Args.MakeArgString(
Daniel Dunbar9c3ed5f2010-07-14 18:46:23 +00005989 getToolChain().GetFilePath("crtend.o")));
Daniel Dunbar10de9e62009-06-29 20:52:51 +00005990 else
Chris Lattner3e2ee142010-07-07 16:01:42 +00005991 CmdArgs.push_back(Args.MakeArgString(
Daniel Dunbar9c3ed5f2010-07-14 18:46:23 +00005992 getToolChain().GetFilePath("crtendS.o")));
Daniel Dunbar10de9e62009-06-29 20:52:51 +00005993 }
5994
5995 const char *Exec =
Rafael Espindola236db462013-11-09 20:07:19 +00005996 Args.MakeArgString(getToolChain().GetProgramPath("ld"));
Daniel Dunbar7fbaf532010-08-02 02:38:28 +00005997 C.addCommand(new Command(JA, *this, Exec, CmdArgs));
Daniel Dunbar10de9e62009-06-29 20:52:51 +00005998}
Ed Schoutene33194b2009-04-02 19:13:12 +00005999
Eli Friedman9fa28852012-08-08 23:57:20 +00006000void bitrig::Assemble::ConstructJob(Compilation &C, const JobAction &JA,
6001 const InputInfo &Output,
6002 const InputInfoList &Inputs,
6003 const ArgList &Args,
6004 const char *LinkingOutput) const {
6005 ArgStringList CmdArgs;
6006
6007 Args.AddAllArgValues(CmdArgs, options::OPT_Wa_COMMA,
6008 options::OPT_Xassembler);
6009
6010 CmdArgs.push_back("-o");
6011 CmdArgs.push_back(Output.getFilename());
6012
6013 for (InputInfoList::const_iterator
6014 it = Inputs.begin(), ie = Inputs.end(); it != ie; ++it) {
6015 const InputInfo &II = *it;
6016 CmdArgs.push_back(II.getFilename());
6017 }
6018
6019 const char *Exec =
6020 Args.MakeArgString(getToolChain().GetProgramPath("as"));
6021 C.addCommand(new Command(JA, *this, Exec, CmdArgs));
6022}
6023
6024void bitrig::Link::ConstructJob(Compilation &C, const JobAction &JA,
6025 const InputInfo &Output,
6026 const InputInfoList &Inputs,
6027 const ArgList &Args,
6028 const char *LinkingOutput) const {
6029 const Driver &D = getToolChain().getDriver();
6030 ArgStringList CmdArgs;
6031
6032 if ((!Args.hasArg(options::OPT_nostdlib)) &&
6033 (!Args.hasArg(options::OPT_shared))) {
6034 CmdArgs.push_back("-e");
6035 CmdArgs.push_back("__start");
6036 }
6037
6038 if (Args.hasArg(options::OPT_static)) {
6039 CmdArgs.push_back("-Bstatic");
6040 } else {
6041 if (Args.hasArg(options::OPT_rdynamic))
6042 CmdArgs.push_back("-export-dynamic");
6043 CmdArgs.push_back("--eh-frame-hdr");
6044 CmdArgs.push_back("-Bdynamic");
6045 if (Args.hasArg(options::OPT_shared)) {
6046 CmdArgs.push_back("-shared");
6047 } else {
6048 CmdArgs.push_back("-dynamic-linker");
6049 CmdArgs.push_back("/usr/libexec/ld.so");
6050 }
6051 }
6052
6053 if (Output.isFilename()) {
6054 CmdArgs.push_back("-o");
6055 CmdArgs.push_back(Output.getFilename());
6056 } else {
6057 assert(Output.isNothing() && "Invalid output.");
6058 }
6059
6060 if (!Args.hasArg(options::OPT_nostdlib) &&
6061 !Args.hasArg(options::OPT_nostartfiles)) {
6062 if (!Args.hasArg(options::OPT_shared)) {
6063 if (Args.hasArg(options::OPT_pg))
6064 CmdArgs.push_back(Args.MakeArgString(
6065 getToolChain().GetFilePath("gcrt0.o")));
6066 else
6067 CmdArgs.push_back(Args.MakeArgString(
6068 getToolChain().GetFilePath("crt0.o")));
6069 CmdArgs.push_back(Args.MakeArgString(
6070 getToolChain().GetFilePath("crtbegin.o")));
6071 } else {
6072 CmdArgs.push_back(Args.MakeArgString(
6073 getToolChain().GetFilePath("crtbeginS.o")));
6074 }
6075 }
6076
6077 Args.AddAllArgs(CmdArgs, options::OPT_L);
6078 Args.AddAllArgs(CmdArgs, options::OPT_T_Group);
6079 Args.AddAllArgs(CmdArgs, options::OPT_e);
6080
6081 AddLinkerInputs(getToolChain(), Inputs, Args, CmdArgs);
6082
6083 if (!Args.hasArg(options::OPT_nostdlib) &&
6084 !Args.hasArg(options::OPT_nodefaultlibs)) {
Hans Wennborg70850d82013-07-18 20:29:38 +00006085 if (D.CCCIsCXX()) {
Eli Friedman9fa28852012-08-08 23:57:20 +00006086 getToolChain().AddCXXStdlibLibArgs(Args, CmdArgs);
6087 if (Args.hasArg(options::OPT_pg))
6088 CmdArgs.push_back("-lm_p");
6089 else
6090 CmdArgs.push_back("-lm");
6091 }
6092
Rafael Espindola1ad26f02012-10-23 17:07:31 +00006093 if (Args.hasArg(options::OPT_pthread)) {
6094 if (!Args.hasArg(options::OPT_shared) &&
6095 Args.hasArg(options::OPT_pg))
6096 CmdArgs.push_back("-lpthread_p");
6097 else
6098 CmdArgs.push_back("-lpthread");
6099 }
6100
Eli Friedman9fa28852012-08-08 23:57:20 +00006101 if (!Args.hasArg(options::OPT_shared)) {
6102 if (Args.hasArg(options::OPT_pg))
6103 CmdArgs.push_back("-lc_p");
6104 else
6105 CmdArgs.push_back("-lc");
6106 }
6107
Benjamin Kramerb2ccade2013-10-21 12:33:55 +00006108 StringRef MyArch;
6109 switch (getToolChain().getTriple().getArch()) {
6110 case llvm::Triple::arm:
6111 MyArch = "arm";
6112 break;
6113 case llvm::Triple::x86:
6114 MyArch = "i386";
6115 break;
6116 case llvm::Triple::x86_64:
6117 MyArch = "amd64";
6118 break;
6119 default:
6120 llvm_unreachable("Unsupported architecture");
6121 }
6122 CmdArgs.push_back(Args.MakeArgString("-lclang_rt." + MyArch));
Eli Friedman9fa28852012-08-08 23:57:20 +00006123 }
6124
6125 if (!Args.hasArg(options::OPT_nostdlib) &&
6126 !Args.hasArg(options::OPT_nostartfiles)) {
6127 if (!Args.hasArg(options::OPT_shared))
6128 CmdArgs.push_back(Args.MakeArgString(
6129 getToolChain().GetFilePath("crtend.o")));
6130 else
6131 CmdArgs.push_back(Args.MakeArgString(
6132 getToolChain().GetFilePath("crtendS.o")));
6133 }
Eli Friedman5bb2ba02012-08-09 22:42:04 +00006134
6135 const char *Exec =
Rafael Espindola236db462013-11-09 20:07:19 +00006136 Args.MakeArgString(getToolChain().GetProgramPath("ld"));
Eli Friedman5bb2ba02012-08-09 22:42:04 +00006137 C.addCommand(new Command(JA, *this, Exec, CmdArgs));
Eli Friedman9fa28852012-08-08 23:57:20 +00006138}
6139
Daniel Dunbar8eb473c2009-03-31 17:45:15 +00006140void freebsd::Assemble::ConstructJob(Compilation &C, const JobAction &JA,
Daniel Dunbar7fbaf532010-08-02 02:38:28 +00006141 const InputInfo &Output,
Daniel Dunbard067f7f2009-04-08 23:54:23 +00006142 const InputInfoList &Inputs,
6143 const ArgList &Args,
Mike Stump11289f42009-09-09 15:08:12 +00006144 const char *LinkingOutput) const {
Daniel Dunbar8eb473c2009-03-31 17:45:15 +00006145 ArgStringList CmdArgs;
6146
Daniel Dunbard854c8d2009-04-01 19:36:32 +00006147 // When building 32-bit code on FreeBSD/amd64, we have to explicitly
6148 // instruct as in the base system to assemble 32-bit code.
Eric Christopherc0f1a5e2012-09-05 21:32:44 +00006149 if (getToolChain().getArch() == llvm::Triple::x86)
Daniel Dunbar8eb473c2009-03-31 17:45:15 +00006150 CmdArgs.push_back("--32");
Eric Christopherc0f1a5e2012-09-05 21:32:44 +00006151 else if (getToolChain().getArch() == llvm::Triple::ppc)
Roman Divacky00859c22011-06-04 07:37:31 +00006152 CmdArgs.push_back("-a32");
Eric Christopherc0f1a5e2012-09-05 21:32:44 +00006153 else if (getToolChain().getArch() == llvm::Triple::mips ||
6154 getToolChain().getArch() == llvm::Triple::mipsel ||
6155 getToolChain().getArch() == llvm::Triple::mips64 ||
6156 getToolChain().getArch() == llvm::Triple::mips64el) {
6157 StringRef CPUName;
6158 StringRef ABIName;
Rafael Espindola22ce34a2013-08-20 22:12:08 +00006159 getMipsCPUAndABI(Args, getToolChain().getTriple(), CPUName, ABIName);
Michael J. Spencer4c0ffa82010-10-21 03:16:25 +00006160
Eric Christopherc0f1a5e2012-09-05 21:32:44 +00006161 CmdArgs.push_back("-march");
6162 CmdArgs.push_back(CPUName.data());
6163
Eric Christopherc0f1a5e2012-09-05 21:32:44 +00006164 CmdArgs.push_back("-mabi");
Simon Atanasyan0da400c2013-02-27 14:55:49 +00006165 CmdArgs.push_back(getGnuCompatibleMipsABIName(ABIName).data());
Eric Christopherc0f1a5e2012-09-05 21:32:44 +00006166
6167 if (getToolChain().getArch() == llvm::Triple::mips ||
6168 getToolChain().getArch() == llvm::Triple::mips64)
6169 CmdArgs.push_back("-EB");
6170 else
6171 CmdArgs.push_back("-EL");
6172
Joerg Sonnenbergerc151b022014-02-19 21:58:52 +00006173 addAssemblerKPIC(Args, CmdArgs);
Rafael Espindola0f207ed2012-12-13 04:17:14 +00006174 } else if (getToolChain().getArch() == llvm::Triple::arm ||
Christian Pirkerf01cd6f2014-03-28 14:40:46 +00006175 getToolChain().getArch() == llvm::Triple::armeb ||
6176 getToolChain().getArch() == llvm::Triple::thumb ||
6177 getToolChain().getArch() == llvm::Triple::thumbeb) {
Renato Golinf4421f72014-02-19 10:44:07 +00006178 const Driver &D = getToolChain().getDriver();
Benjamin Kramer9299637dc2014-03-04 19:31:42 +00006179 const llvm::Triple &Triple = getToolChain().getTriple();
Renato Golinf4421f72014-02-19 10:44:07 +00006180 StringRef FloatABI = arm::getARMFloatABI(D, Args, Triple);
6181
6182 if (FloatABI == "hard") {
6183 CmdArgs.push_back("-mfpu=vfp");
6184 } else {
6185 CmdArgs.push_back("-mfpu=softvfp");
6186 }
6187
Rafael Espindola0f207ed2012-12-13 04:17:14 +00006188 switch(getToolChain().getTriple().getEnvironment()) {
Renato Golinf4421f72014-02-19 10:44:07 +00006189 case llvm::Triple::GNUEABIHF:
Rafael Espindola0f207ed2012-12-13 04:17:14 +00006190 case llvm::Triple::GNUEABI:
6191 case llvm::Triple::EABI:
Anton Korobeynikov2bed8472013-03-18 07:59:20 +00006192 CmdArgs.push_back("-meabi=5");
Rafael Espindola0f207ed2012-12-13 04:17:14 +00006193 break;
6194
6195 default:
6196 CmdArgs.push_back("-matpcs");
6197 }
Roman Divacky47f4ff82014-01-02 15:13:18 +00006198 } else if (getToolChain().getArch() == llvm::Triple::sparc ||
Roman Divackyfeb5e632014-01-02 15:34:59 +00006199 getToolChain().getArch() == llvm::Triple::sparcv9) {
Roman Divacky9f779402014-02-25 18:45:49 +00006200 if (getToolChain().getArch() == llvm::Triple::sparc)
6201 CmdArgs.push_back("-Av8plusa");
6202 else
6203 CmdArgs.push_back("-Av9a");
6204
Joerg Sonnenbergerc151b022014-02-19 21:58:52 +00006205 addAssemblerKPIC(Args, CmdArgs);
Eric Christopherc0f1a5e2012-09-05 21:32:44 +00006206 }
Eric Christopher0b26a612010-03-02 02:41:08 +00006207
Daniel Dunbar8eb473c2009-03-31 17:45:15 +00006208 Args.AddAllArgValues(CmdArgs, options::OPT_Wa_COMMA,
6209 options::OPT_Xassembler);
6210
6211 CmdArgs.push_back("-o");
Daniel Dunbarb440f562010-08-02 02:38:21 +00006212 CmdArgs.push_back(Output.getFilename());
Daniel Dunbar8eb473c2009-03-31 17:45:15 +00006213
6214 for (InputInfoList::const_iterator
6215 it = Inputs.begin(), ie = Inputs.end(); it != ie; ++it) {
6216 const InputInfo &II = *it;
Daniel Dunbarb440f562010-08-02 02:38:21 +00006217 CmdArgs.push_back(II.getFilename());
Daniel Dunbar8eb473c2009-03-31 17:45:15 +00006218 }
6219
Daniel Dunbard067f7f2009-04-08 23:54:23 +00006220 const char *Exec =
Daniel Dunbar9c3ed5f2010-07-14 18:46:23 +00006221 Args.MakeArgString(getToolChain().GetProgramPath("as"));
Daniel Dunbar7fbaf532010-08-02 02:38:28 +00006222 C.addCommand(new Command(JA, *this, Exec, CmdArgs));
Daniel Dunbar8eb473c2009-03-31 17:45:15 +00006223}
Daniel Dunbard854c8d2009-04-01 19:36:32 +00006224
6225void freebsd::Link::ConstructJob(Compilation &C, const JobAction &JA,
Daniel Dunbar7fbaf532010-08-02 02:38:28 +00006226 const InputInfo &Output,
Daniel Dunbard067f7f2009-04-08 23:54:23 +00006227 const InputInfoList &Inputs,
6228 const ArgList &Args,
Daniel Dunbare3e263f2009-05-02 20:14:53 +00006229 const char *LinkingOutput) const {
Roman Divackyafe2f232012-08-28 15:09:03 +00006230 const toolchains::FreeBSD& ToolChain =
6231 static_cast<const toolchains::FreeBSD&>(getToolChain());
6232 const Driver &D = ToolChain.getDriver();
Alexey Samsonove65ceb92014-02-25 13:26:03 +00006233 const bool IsPIE =
6234 !Args.hasArg(options::OPT_shared) &&
6235 (Args.hasArg(options::OPT_pie) || ToolChain.isPIEDefault());
Daniel Dunbard854c8d2009-04-01 19:36:32 +00006236 ArgStringList CmdArgs;
David Chisnall5f99f482012-07-29 15:24:44 +00006237
6238 // Silence warning for "clang -g foo.o -o foo"
6239 Args.ClaimAllArgs(options::OPT_g_Group);
6240 // and "clang -emit-llvm foo.o -o foo"
6241 Args.ClaimAllArgs(options::OPT_emit_llvm);
6242 // and for "clang -w foo.o -o foo". Other warning options are already
6243 // handled somewhere else.
6244 Args.ClaimAllArgs(options::OPT_w);
Daniel Dunbard854c8d2009-04-01 19:36:32 +00006245
Joerg Sonnenberger6165ab12011-03-21 13:51:29 +00006246 if (!D.SysRoot.empty())
6247 CmdArgs.push_back(Args.MakeArgString("--sysroot=" + D.SysRoot));
6248
Alexey Samsonove65ceb92014-02-25 13:26:03 +00006249 if (IsPIE)
Roman Divackyafe2f232012-08-28 15:09:03 +00006250 CmdArgs.push_back("-pie");
6251
Daniel Dunbard854c8d2009-04-01 19:36:32 +00006252 if (Args.hasArg(options::OPT_static)) {
6253 CmdArgs.push_back("-Bstatic");
6254 } else {
Rafael Espindola7ba97af2010-11-11 02:17:51 +00006255 if (Args.hasArg(options::OPT_rdynamic))
6256 CmdArgs.push_back("-export-dynamic");
Daniel Dunbard854c8d2009-04-01 19:36:32 +00006257 CmdArgs.push_back("--eh-frame-hdr");
6258 if (Args.hasArg(options::OPT_shared)) {
6259 CmdArgs.push_back("-Bshareable");
6260 } else {
6261 CmdArgs.push_back("-dynamic-linker");
6262 CmdArgs.push_back("/libexec/ld-elf.so.1");
6263 }
Roman Divackyafe2f232012-08-28 15:09:03 +00006264 if (ToolChain.getTriple().getOSMajorVersion() >= 9) {
6265 llvm::Triple::ArchType Arch = ToolChain.getArch();
David Chisnall5f99f482012-07-29 15:24:44 +00006266 if (Arch == llvm::Triple::arm || Arch == llvm::Triple::sparc ||
6267 Arch == llvm::Triple::x86 || Arch == llvm::Triple::x86_64) {
6268 CmdArgs.push_back("--hash-style=both");
6269 }
6270 }
6271 CmdArgs.push_back("--enable-new-dtags");
Daniel Dunbard854c8d2009-04-01 19:36:32 +00006272 }
6273
6274 // When building 32-bit code on FreeBSD/amd64, we have to explicitly
6275 // instruct ld in the base system to link 32-bit code.
Rafael Espindola35ca7d92012-10-07 04:44:33 +00006276 if (ToolChain.getArch() == llvm::Triple::x86) {
Daniel Dunbard854c8d2009-04-01 19:36:32 +00006277 CmdArgs.push_back("-m");
6278 CmdArgs.push_back("elf_i386_fbsd");
6279 }
6280
Rafael Espindola35ca7d92012-10-07 04:44:33 +00006281 if (ToolChain.getArch() == llvm::Triple::ppc) {
Roman Divacky5e300b82011-06-04 07:40:24 +00006282 CmdArgs.push_back("-m");
Roman Divackyd150ad32011-11-21 16:50:32 +00006283 CmdArgs.push_back("elf32ppc_fbsd");
Roman Divacky5e300b82011-06-04 07:40:24 +00006284 }
6285
Daniel Dunbarb440f562010-08-02 02:38:21 +00006286 if (Output.isFilename()) {
Daniel Dunbard854c8d2009-04-01 19:36:32 +00006287 CmdArgs.push_back("-o");
6288 CmdArgs.push_back(Output.getFilename());
6289 } else {
6290 assert(Output.isNothing() && "Invalid output.");
6291 }
6292
6293 if (!Args.hasArg(options::OPT_nostdlib) &&
6294 !Args.hasArg(options::OPT_nostartfiles)) {
Roman Divackyafe2f232012-08-28 15:09:03 +00006295 const char *crt1 = NULL;
Daniel Dunbard854c8d2009-04-01 19:36:32 +00006296 if (!Args.hasArg(options::OPT_shared)) {
Roman Divacky66f22762011-02-10 16:59:40 +00006297 if (Args.hasArg(options::OPT_pg))
Roman Divackyafe2f232012-08-28 15:09:03 +00006298 crt1 = "gcrt1.o";
Alexey Samsonove65ceb92014-02-25 13:26:03 +00006299 else if (IsPIE)
Roman Divackyafe2f232012-08-28 15:09:03 +00006300 crt1 = "Scrt1.o";
6301 else
6302 crt1 = "crt1.o";
Daniel Dunbard854c8d2009-04-01 19:36:32 +00006303 }
Roman Divackyafe2f232012-08-28 15:09:03 +00006304 if (crt1)
6305 CmdArgs.push_back(Args.MakeArgString(ToolChain.GetFilePath(crt1)));
6306
6307 CmdArgs.push_back(Args.MakeArgString(ToolChain.GetFilePath("crti.o")));
6308
6309 const char *crtbegin = NULL;
6310 if (Args.hasArg(options::OPT_static))
6311 crtbegin = "crtbeginT.o";
Alexey Samsonove65ceb92014-02-25 13:26:03 +00006312 else if (Args.hasArg(options::OPT_shared) || IsPIE)
Roman Divackyafe2f232012-08-28 15:09:03 +00006313 crtbegin = "crtbeginS.o";
6314 else
6315 crtbegin = "crtbegin.o";
6316
6317 CmdArgs.push_back(Args.MakeArgString(ToolChain.GetFilePath(crtbegin)));
Daniel Dunbard854c8d2009-04-01 19:36:32 +00006318 }
6319
6320 Args.AddAllArgs(CmdArgs, options::OPT_L);
Roman Divackyafe2f232012-08-28 15:09:03 +00006321 const ToolChain::path_list Paths = ToolChain.getFilePaths();
Roman Divackyee8188a2011-03-01 17:53:14 +00006322 for (ToolChain::path_list::const_iterator i = Paths.begin(), e = Paths.end();
6323 i != e; ++i)
Chris Lattner0e62c1c2011-07-23 10:55:15 +00006324 CmdArgs.push_back(Args.MakeArgString(StringRef("-L") + *i));
Daniel Dunbard854c8d2009-04-01 19:36:32 +00006325 Args.AddAllArgs(CmdArgs, options::OPT_T_Group);
6326 Args.AddAllArgs(CmdArgs, options::OPT_e);
David Chisnall589a4942010-08-15 22:58:12 +00006327 Args.AddAllArgs(CmdArgs, options::OPT_s);
6328 Args.AddAllArgs(CmdArgs, options::OPT_t);
6329 Args.AddAllArgs(CmdArgs, options::OPT_Z_Flag);
6330 Args.AddAllArgs(CmdArgs, options::OPT_r);
Daniel Dunbard854c8d2009-04-01 19:36:32 +00006331
Alp Tokerce365ca2013-12-02 12:43:03 +00006332 if (D.IsUsingLTO(Args))
6333 AddGoldPlugin(ToolChain, Args, CmdArgs);
Roman Divackyf0d7f942013-11-10 09:31:43 +00006334
Roman Divackyafe2f232012-08-28 15:09:03 +00006335 AddLinkerInputs(ToolChain, Inputs, Args, CmdArgs);
Daniel Dunbard854c8d2009-04-01 19:36:32 +00006336
6337 if (!Args.hasArg(options::OPT_nostdlib) &&
6338 !Args.hasArg(options::OPT_nodefaultlibs)) {
Hans Wennborg70850d82013-07-18 20:29:38 +00006339 if (D.CCCIsCXX()) {
Roman Divackyafe2f232012-08-28 15:09:03 +00006340 ToolChain.AddCXXStdlibLibArgs(Args, CmdArgs);
Roman Divacky66f22762011-02-10 16:59:40 +00006341 if (Args.hasArg(options::OPT_pg))
6342 CmdArgs.push_back("-lm_p");
6343 else
6344 CmdArgs.push_back("-lm");
Daniel Dunbar4b8ef282010-02-17 08:07:51 +00006345 }
Daniel Dunbard854c8d2009-04-01 19:36:32 +00006346 // FIXME: For some reason GCC passes -lgcc and -lgcc_s before adding
6347 // the default system libraries. Just mimic this for now.
Roman Divacky66f22762011-02-10 16:59:40 +00006348 if (Args.hasArg(options::OPT_pg))
6349 CmdArgs.push_back("-lgcc_p");
6350 else
6351 CmdArgs.push_back("-lgcc");
Daniel Dunbard854c8d2009-04-01 19:36:32 +00006352 if (Args.hasArg(options::OPT_static)) {
6353 CmdArgs.push_back("-lgcc_eh");
Roman Divacky66f22762011-02-10 16:59:40 +00006354 } else if (Args.hasArg(options::OPT_pg)) {
6355 CmdArgs.push_back("-lgcc_eh_p");
Daniel Dunbard854c8d2009-04-01 19:36:32 +00006356 } else {
6357 CmdArgs.push_back("--as-needed");
6358 CmdArgs.push_back("-lgcc_s");
6359 CmdArgs.push_back("--no-as-needed");
6360 }
6361
Matt Beaumont-Gay1fe49152011-02-10 20:35:01 +00006362 if (Args.hasArg(options::OPT_pthread)) {
Roman Divacky66f22762011-02-10 16:59:40 +00006363 if (Args.hasArg(options::OPT_pg))
6364 CmdArgs.push_back("-lpthread_p");
6365 else
6366 CmdArgs.push_back("-lpthread");
Matt Beaumont-Gay1fe49152011-02-10 20:35:01 +00006367 }
Daniel Dunbard854c8d2009-04-01 19:36:32 +00006368
Roman Divacky66f22762011-02-10 16:59:40 +00006369 if (Args.hasArg(options::OPT_pg)) {
6370 if (Args.hasArg(options::OPT_shared))
6371 CmdArgs.push_back("-lc");
6372 else
6373 CmdArgs.push_back("-lc_p");
6374 CmdArgs.push_back("-lgcc_p");
6375 } else {
6376 CmdArgs.push_back("-lc");
6377 CmdArgs.push_back("-lgcc");
6378 }
6379
Daniel Dunbard854c8d2009-04-01 19:36:32 +00006380 if (Args.hasArg(options::OPT_static)) {
6381 CmdArgs.push_back("-lgcc_eh");
Roman Divacky66f22762011-02-10 16:59:40 +00006382 } else if (Args.hasArg(options::OPT_pg)) {
6383 CmdArgs.push_back("-lgcc_eh_p");
Daniel Dunbard854c8d2009-04-01 19:36:32 +00006384 } else {
6385 CmdArgs.push_back("--as-needed");
6386 CmdArgs.push_back("-lgcc_s");
6387 CmdArgs.push_back("--no-as-needed");
6388 }
6389 }
6390
6391 if (!Args.hasArg(options::OPT_nostdlib) &&
6392 !Args.hasArg(options::OPT_nostartfiles)) {
Alexey Samsonove65ceb92014-02-25 13:26:03 +00006393 if (Args.hasArg(options::OPT_shared) || IsPIE)
Roman Divackyafe2f232012-08-28 15:09:03 +00006394 CmdArgs.push_back(Args.MakeArgString(ToolChain.GetFilePath("crtendS.o")));
Roman Divackya3c50242012-09-07 13:36:21 +00006395 else
6396 CmdArgs.push_back(Args.MakeArgString(ToolChain.GetFilePath("crtend.o")));
Roman Divackyafe2f232012-08-28 15:09:03 +00006397 CmdArgs.push_back(Args.MakeArgString(ToolChain.GetFilePath("crtn.o")));
Daniel Dunbard854c8d2009-04-01 19:36:32 +00006398 }
6399
Viktor Kutuzovaa5b5f72014-03-18 09:36:50 +00006400 addSanitizerRuntimes(getToolChain(), Args, CmdArgs);
6401
Alexey Samsonov7811d192014-02-20 13:57:37 +00006402 addProfileRT(ToolChain, Args, CmdArgs);
Nick Lewycky82fe5f42011-05-24 21:54:59 +00006403
Daniel Dunbard067f7f2009-04-08 23:54:23 +00006404 const char *Exec =
Rafael Espindola236db462013-11-09 20:07:19 +00006405 Args.MakeArgString(ToolChain.GetProgramPath("ld"));
Daniel Dunbar7fbaf532010-08-02 02:38:28 +00006406 C.addCommand(new Command(JA, *this, Exec, CmdArgs));
Daniel Dunbard854c8d2009-04-01 19:36:32 +00006407}
Daniel Dunbarcc912342009-05-02 18:28:39 +00006408
Benjamin Kramer24f1d3e2011-02-02 18:59:27 +00006409void netbsd::Assemble::ConstructJob(Compilation &C, const JobAction &JA,
6410 const InputInfo &Output,
6411 const InputInfoList &Inputs,
6412 const ArgList &Args,
6413 const char *LinkingOutput) const {
6414 ArgStringList CmdArgs;
6415
Joerg Sonnenberger25e18172014-02-19 22:16:19 +00006416 // GNU as needs different flags for creating the correct output format
6417 // on architectures with different ABIs or optional feature sets.
6418 switch (getToolChain().getArch()) {
6419 case llvm::Triple::x86:
Benjamin Kramer24f1d3e2011-02-02 18:59:27 +00006420 CmdArgs.push_back("--32");
Joerg Sonnenberger25e18172014-02-19 22:16:19 +00006421 break;
6422 case llvm::Triple::arm:
Christian Pirkerf01cd6f2014-03-28 14:40:46 +00006423 case llvm::Triple::armeb:
6424 case llvm::Triple::thumb:
6425 case llvm::Triple::thumbeb: {
Bernard Ogden31561762013-12-12 13:27:11 +00006426 std::string MArch(arm::getARMTargetCPU(Args, getToolChain().getTriple()));
Joerg Sonnenberger1f94da52013-12-05 21:07:29 +00006427 CmdArgs.push_back(Args.MakeArgString("-mcpu=" + MArch));
Joerg Sonnenberger25e18172014-02-19 22:16:19 +00006428 break;
Joerg Sonnenberger1f94da52013-12-05 21:07:29 +00006429 }
6430
Joerg Sonnenberger25e18172014-02-19 22:16:19 +00006431 case llvm::Triple::mips:
6432 case llvm::Triple::mipsel:
6433 case llvm::Triple::mips64:
6434 case llvm::Triple::mips64el: {
Joerg Sonnenberger21baded2013-12-08 13:54:58 +00006435 StringRef CPUName;
6436 StringRef ABIName;
6437 getMipsCPUAndABI(Args, getToolChain().getTriple(), CPUName, ABIName);
6438
6439 CmdArgs.push_back("-march");
6440 CmdArgs.push_back(CPUName.data());
6441
6442 CmdArgs.push_back("-mabi");
6443 CmdArgs.push_back(getGnuCompatibleMipsABIName(ABIName).data());
6444
6445 if (getToolChain().getArch() == llvm::Triple::mips ||
6446 getToolChain().getArch() == llvm::Triple::mips64)
6447 CmdArgs.push_back("-EB");
6448 else
6449 CmdArgs.push_back("-EL");
6450
Joerg Sonnenbergerc151b022014-02-19 21:58:52 +00006451 addAssemblerKPIC(Args, CmdArgs);
Joerg Sonnenberger25e18172014-02-19 22:16:19 +00006452 break;
6453 }
Joerg Sonnenbergered3f0692014-02-19 22:40:18 +00006454
6455 case llvm::Triple::sparc:
6456 CmdArgs.push_back("-32");
6457 addAssemblerKPIC(Args, CmdArgs);
6458 break;
6459
6460 case llvm::Triple::sparcv9:
6461 CmdArgs.push_back("-64");
6462 CmdArgs.push_back("-Av9");
6463 addAssemblerKPIC(Args, CmdArgs);
6464 break;
6465
Joerg Sonnenberger25e18172014-02-19 22:16:19 +00006466 default:
6467 break;
Joerg Sonnenberger21baded2013-12-08 13:54:58 +00006468 }
Benjamin Kramer24f1d3e2011-02-02 18:59:27 +00006469
6470 Args.AddAllArgValues(CmdArgs, options::OPT_Wa_COMMA,
6471 options::OPT_Xassembler);
6472
6473 CmdArgs.push_back("-o");
6474 CmdArgs.push_back(Output.getFilename());
6475
6476 for (InputInfoList::const_iterator
6477 it = Inputs.begin(), ie = Inputs.end(); it != ie; ++it) {
6478 const InputInfo &II = *it;
6479 CmdArgs.push_back(II.getFilename());
6480 }
6481
David Chisnallddbd68f2011-09-27 22:03:18 +00006482 const char *Exec = Args.MakeArgString((getToolChain().GetProgramPath("as")));
Benjamin Kramer24f1d3e2011-02-02 18:59:27 +00006483 C.addCommand(new Command(JA, *this, Exec, CmdArgs));
6484}
6485
6486void netbsd::Link::ConstructJob(Compilation &C, const JobAction &JA,
6487 const InputInfo &Output,
6488 const InputInfoList &Inputs,
6489 const ArgList &Args,
6490 const char *LinkingOutput) const {
6491 const Driver &D = getToolChain().getDriver();
6492 ArgStringList CmdArgs;
6493
Joerg Sonnenberger6165ab12011-03-21 13:51:29 +00006494 if (!D.SysRoot.empty())
6495 CmdArgs.push_back(Args.MakeArgString("--sysroot=" + D.SysRoot));
6496
Joerg Sonnenberger52be0b42014-03-13 00:42:01 +00006497 CmdArgs.push_back("--eh-frame-hdr");
Benjamin Kramer24f1d3e2011-02-02 18:59:27 +00006498 if (Args.hasArg(options::OPT_static)) {
6499 CmdArgs.push_back("-Bstatic");
6500 } else {
6501 if (Args.hasArg(options::OPT_rdynamic))
6502 CmdArgs.push_back("-export-dynamic");
Benjamin Kramer24f1d3e2011-02-02 18:59:27 +00006503 if (Args.hasArg(options::OPT_shared)) {
6504 CmdArgs.push_back("-Bshareable");
6505 } else {
6506 CmdArgs.push_back("-dynamic-linker");
6507 CmdArgs.push_back("/libexec/ld.elf_so");
6508 }
6509 }
6510
Joerg Sonnenberger6cd7deb2014-02-02 22:50:34 +00006511 // Many NetBSD architectures support more than one ABI.
6512 // Determine the correct emulation for ld.
6513 switch (getToolChain().getArch()) {
6514 case llvm::Triple::x86:
Benjamin Kramer24f1d3e2011-02-02 18:59:27 +00006515 CmdArgs.push_back("-m");
6516 CmdArgs.push_back("elf_i386");
Joerg Sonnenberger6cd7deb2014-02-02 22:50:34 +00006517 break;
6518 case llvm::Triple::arm:
Christian Pirkerf01cd6f2014-03-28 14:40:46 +00006519 case llvm::Triple::armeb:
Joerg Sonnenberger6cd7deb2014-02-02 22:50:34 +00006520 case llvm::Triple::thumb:
Christian Pirkerf01cd6f2014-03-28 14:40:46 +00006521 case llvm::Triple::thumbeb:
Joerg Sonnenberger25de31d2014-02-02 22:47:37 +00006522 CmdArgs.push_back("-m");
6523 switch (getToolChain().getTriple().getEnvironment()) {
6524 case llvm::Triple::EABI:
Joerg Sonnenberger25de31d2014-02-02 22:47:37 +00006525 case llvm::Triple::GNUEABI:
Joerg Sonnenberger25de31d2014-02-02 22:47:37 +00006526 CmdArgs.push_back("armelf_nbsd_eabi");
6527 break;
Joerg Sonnenberger83a33c02014-02-06 21:04:32 +00006528 case llvm::Triple::EABIHF:
6529 case llvm::Triple::GNUEABIHF:
6530 CmdArgs.push_back("armelf_nbsd_eabihf");
6531 break;
Joerg Sonnenberger25de31d2014-02-02 22:47:37 +00006532 default:
6533 CmdArgs.push_back("armelf_nbsd");
6534 break;
6535 }
Joerg Sonnenberger6cd7deb2014-02-02 22:50:34 +00006536 break;
Joerg Sonnenbergere7f97592014-02-02 22:59:16 +00006537 case llvm::Triple::mips64:
6538 case llvm::Triple::mips64el:
Jonathan Roelofs2cea1be2014-02-12 03:21:20 +00006539 if (mips::hasMipsAbiArg(Args, "32")) {
Joerg Sonnenbergere7f97592014-02-02 22:59:16 +00006540 CmdArgs.push_back("-m");
6541 if (getToolChain().getArch() == llvm::Triple::mips64)
6542 CmdArgs.push_back("elf32btsmip");
6543 else
6544 CmdArgs.push_back("elf32ltsmip");
Jonathan Roelofs2cea1be2014-02-12 03:21:20 +00006545 } else if (mips::hasMipsAbiArg(Args, "64")) {
Joerg Sonnenbergere7f97592014-02-02 22:59:16 +00006546 CmdArgs.push_back("-m");
6547 if (getToolChain().getArch() == llvm::Triple::mips64)
6548 CmdArgs.push_back("elf64btsmip");
6549 else
6550 CmdArgs.push_back("elf64ltsmip");
6551 }
6552 break;
Joerg Sonnenbergered3f0692014-02-19 22:40:18 +00006553
6554 case llvm::Triple::sparc:
6555 CmdArgs.push_back("-m");
6556 CmdArgs.push_back("elf32_sparc");
6557 break;
6558
6559 case llvm::Triple::sparcv9:
6560 CmdArgs.push_back("-m");
6561 CmdArgs.push_back("elf64_sparc");
6562 break;
6563
Joerg Sonnenberger6cd7deb2014-02-02 22:50:34 +00006564 default:
6565 break;
Joerg Sonnenberger25de31d2014-02-02 22:47:37 +00006566 }
6567
Benjamin Kramer24f1d3e2011-02-02 18:59:27 +00006568 if (Output.isFilename()) {
6569 CmdArgs.push_back("-o");
6570 CmdArgs.push_back(Output.getFilename());
6571 } else {
6572 assert(Output.isNothing() && "Invalid output.");
6573 }
6574
6575 if (!Args.hasArg(options::OPT_nostdlib) &&
6576 !Args.hasArg(options::OPT_nostartfiles)) {
6577 if (!Args.hasArg(options::OPT_shared)) {
6578 CmdArgs.push_back(Args.MakeArgString(
6579 getToolChain().GetFilePath("crt0.o")));
6580 CmdArgs.push_back(Args.MakeArgString(
6581 getToolChain().GetFilePath("crti.o")));
6582 CmdArgs.push_back(Args.MakeArgString(
6583 getToolChain().GetFilePath("crtbegin.o")));
6584 } else {
6585 CmdArgs.push_back(Args.MakeArgString(
6586 getToolChain().GetFilePath("crti.o")));
6587 CmdArgs.push_back(Args.MakeArgString(
6588 getToolChain().GetFilePath("crtbeginS.o")));
6589 }
6590 }
6591
6592 Args.AddAllArgs(CmdArgs, options::OPT_L);
6593 Args.AddAllArgs(CmdArgs, options::OPT_T_Group);
6594 Args.AddAllArgs(CmdArgs, options::OPT_e);
6595 Args.AddAllArgs(CmdArgs, options::OPT_s);
6596 Args.AddAllArgs(CmdArgs, options::OPT_t);
6597 Args.AddAllArgs(CmdArgs, options::OPT_Z_Flag);
6598 Args.AddAllArgs(CmdArgs, options::OPT_r);
6599
6600 AddLinkerInputs(getToolChain(), Inputs, Args, CmdArgs);
6601
Joerg Sonnenbergera4435632013-10-14 20:13:05 +00006602 unsigned Major, Minor, Micro;
6603 getToolChain().getTriple().getOSVersion(Major, Minor, Micro);
6604 bool useLibgcc = true;
6605 if (Major >= 7 || (Major == 6 && Minor == 99 && Micro >= 23) || Major == 0) {
Joerg Sonnenbergerd769a1e2014-01-18 00:50:49 +00006606 switch(getToolChain().getArch()) {
6607 case llvm::Triple::x86:
6608 case llvm::Triple::x86_64:
Joerg Sonnenbergera4435632013-10-14 20:13:05 +00006609 useLibgcc = false;
Joerg Sonnenbergerd769a1e2014-01-18 00:50:49 +00006610 break;
6611 default:
6612 break;
6613 }
Joerg Sonnenbergera4435632013-10-14 20:13:05 +00006614 }
6615
Benjamin Kramer24f1d3e2011-02-02 18:59:27 +00006616 if (!Args.hasArg(options::OPT_nostdlib) &&
6617 !Args.hasArg(options::OPT_nodefaultlibs)) {
Hans Wennborg70850d82013-07-18 20:29:38 +00006618 if (D.CCCIsCXX()) {
Benjamin Kramer24f1d3e2011-02-02 18:59:27 +00006619 getToolChain().AddCXXStdlibLibArgs(Args, CmdArgs);
6620 CmdArgs.push_back("-lm");
6621 }
Benjamin Kramer24f1d3e2011-02-02 18:59:27 +00006622 if (Args.hasArg(options::OPT_pthread))
6623 CmdArgs.push_back("-lpthread");
6624 CmdArgs.push_back("-lc");
6625
Joerg Sonnenbergera4435632013-10-14 20:13:05 +00006626 if (useLibgcc) {
6627 if (Args.hasArg(options::OPT_static)) {
6628 // libgcc_eh depends on libc, so resolve as much as possible,
6629 // pull in any new requirements from libc and then get the rest
6630 // of libgcc.
6631 CmdArgs.push_back("-lgcc_eh");
6632 CmdArgs.push_back("-lc");
6633 CmdArgs.push_back("-lgcc");
6634 } else {
6635 CmdArgs.push_back("-lgcc");
6636 CmdArgs.push_back("--as-needed");
6637 CmdArgs.push_back("-lgcc_s");
6638 CmdArgs.push_back("--no-as-needed");
6639 }
Benjamin Kramer24f1d3e2011-02-02 18:59:27 +00006640 }
6641 }
6642
6643 if (!Args.hasArg(options::OPT_nostdlib) &&
6644 !Args.hasArg(options::OPT_nostartfiles)) {
6645 if (!Args.hasArg(options::OPT_shared))
6646 CmdArgs.push_back(Args.MakeArgString(getToolChain().GetFilePath(
6647 "crtend.o")));
6648 else
6649 CmdArgs.push_back(Args.MakeArgString(getToolChain().GetFilePath(
6650 "crtendS.o")));
6651 CmdArgs.push_back(Args.MakeArgString(getToolChain().GetFilePath(
6652 "crtn.o")));
6653 }
6654
Alexey Samsonov7811d192014-02-20 13:57:37 +00006655 addProfileRT(getToolChain(), Args, CmdArgs);
Nick Lewycky82fe5f42011-05-24 21:54:59 +00006656
Rafael Espindola236db462013-11-09 20:07:19 +00006657 const char *Exec = Args.MakeArgString(getToolChain().GetProgramPath("ld"));
Benjamin Kramer24f1d3e2011-02-02 18:59:27 +00006658 C.addCommand(new Command(JA, *this, Exec, CmdArgs));
6659}
6660
Thomas Schwinge4e555262013-03-28 19:04:25 +00006661void gnutools::Assemble::ConstructJob(Compilation &C, const JobAction &JA,
6662 const InputInfo &Output,
6663 const InputInfoList &Inputs,
6664 const ArgList &Args,
6665 const char *LinkingOutput) const {
Rafael Espindola92b00932010-08-10 00:25:48 +00006666 ArgStringList CmdArgs;
Jakob Stoklund Olesen8d7f5062014-01-12 04:53:36 +00006667 bool NeedsKPIC = false;
Rafael Espindola92b00932010-08-10 00:25:48 +00006668
6669 // Add --32/--64 to make sure we get the format we want.
6670 // This is incomplete
6671 if (getToolChain().getArch() == llvm::Triple::x86) {
6672 CmdArgs.push_back("--32");
6673 } else if (getToolChain().getArch() == llvm::Triple::x86_64) {
6674 CmdArgs.push_back("--64");
Eli Friedman4a4932c2011-11-28 23:46:52 +00006675 } else if (getToolChain().getArch() == llvm::Triple::ppc) {
6676 CmdArgs.push_back("-a32");
6677 CmdArgs.push_back("-mppc");
6678 CmdArgs.push_back("-many");
6679 } else if (getToolChain().getArch() == llvm::Triple::ppc64) {
6680 CmdArgs.push_back("-a64");
6681 CmdArgs.push_back("-mppc64");
6682 CmdArgs.push_back("-many");
Bill Schmidt778d3872013-07-26 01:36:11 +00006683 } else if (getToolChain().getArch() == llvm::Triple::ppc64le) {
6684 CmdArgs.push_back("-a64");
Will Schmidtc1fc1902014-03-24 17:10:37 +00006685 CmdArgs.push_back("-mppc64");
Bill Schmidt778d3872013-07-26 01:36:11 +00006686 CmdArgs.push_back("-many");
Will Schmidtc1fc1902014-03-24 17:10:37 +00006687 CmdArgs.push_back("-mlittle-endian");
Jakob Stoklund Olesen2490e552014-01-10 03:51:29 +00006688 } else if (getToolChain().getArch() == llvm::Triple::sparc) {
6689 CmdArgs.push_back("-32");
Jakob Stoklund Olesen58801bf2014-01-11 18:25:01 +00006690 CmdArgs.push_back("-Av8plusa");
Jakob Stoklund Olesen8d7f5062014-01-12 04:53:36 +00006691 NeedsKPIC = true;
Jakob Stoklund Olesen2490e552014-01-10 03:51:29 +00006692 } else if (getToolChain().getArch() == llvm::Triple::sparcv9) {
6693 CmdArgs.push_back("-64");
Jakob Stoklund Olesen58801bf2014-01-11 18:25:01 +00006694 CmdArgs.push_back("-Av9a");
Jakob Stoklund Olesen8d7f5062014-01-12 04:53:36 +00006695 NeedsKPIC = true;
Christian Pirkerf01cd6f2014-03-28 14:40:46 +00006696 } else if (getToolChain().getArch() == llvm::Triple::arm ||
6697 getToolChain().getArch() == llvm::Triple::armeb) {
Chris Lattner0e62c1c2011-07-23 10:55:15 +00006698 StringRef MArch = getToolChain().getArchName();
Rafael Espindola92b00932010-08-10 00:25:48 +00006699 if (MArch == "armv7" || MArch == "armv7a" || MArch == "armv7-a")
6700 CmdArgs.push_back("-mfpu=neon");
Christian Pirkerf01cd6f2014-03-28 14:40:46 +00006701 if (MArch == "armv8" || MArch == "armv8a" || MArch == "armv8-a" ||
6702 MArch == "armebv8" || MArch == "armebv8a" || MArch == "armebv8-a")
Bernard Ogdena58ef052013-10-24 18:32:41 +00006703 CmdArgs.push_back("-mfpu=crypto-neon-fp-armv8");
Evgeniy Stepanoved943f62012-04-20 09:03:40 +00006704
Tim Northover9c7e0352013-12-12 11:55:52 +00006705 StringRef ARMFloatABI = tools::arm::getARMFloatABI(
6706 getToolChain().getDriver(), Args, getToolChain().getTriple());
Evgeniy Stepanoved943f62012-04-20 09:03:40 +00006707 CmdArgs.push_back(Args.MakeArgString("-mfloat-abi=" + ARMFloatABI));
Evgeniy Stepanov582911a2012-04-24 09:05:31 +00006708
6709 Args.AddLastArg(CmdArgs, options::OPT_march_EQ);
Ana Pazosdd6068d2013-12-06 22:43:17 +00006710
6711 // FIXME: remove krait check when GNU tools support krait cpu
6712 // for now replace it with -march=armv7-a to avoid a lower
6713 // march from being picked in the absence of a cpu flag.
6714 Arg *A;
6715 if ((A = Args.getLastArg(options::OPT_mcpu_EQ)) &&
6716 StringRef(A->getValue()) == "krait")
6717 CmdArgs.push_back("-march=armv7-a");
6718 else
6719 Args.AddLastArg(CmdArgs, options::OPT_mcpu_EQ);
Evgeniy Stepanov582911a2012-04-24 09:05:31 +00006720 Args.AddLastArg(CmdArgs, options::OPT_mfpu_EQ);
Akira Hatanaka5e9dde32011-11-30 19:31:38 +00006721 } else if (getToolChain().getArch() == llvm::Triple::mips ||
6722 getToolChain().getArch() == llvm::Triple::mipsel ||
6723 getToolChain().getArch() == llvm::Triple::mips64 ||
6724 getToolChain().getArch() == llvm::Triple::mips64el) {
Simon Atanasyan571d7bd2012-04-07 22:31:29 +00006725 StringRef CPUName;
6726 StringRef ABIName;
Rafael Espindola22ce34a2013-08-20 22:12:08 +00006727 getMipsCPUAndABI(Args, getToolChain().getTriple(), CPUName, ABIName);
Akira Hatanaka5e9dde32011-11-30 19:31:38 +00006728
Simon Atanasyan571d7bd2012-04-07 22:31:29 +00006729 CmdArgs.push_back("-march");
6730 CmdArgs.push_back(CPUName.data());
6731
Simon Atanasyan571d7bd2012-04-07 22:31:29 +00006732 CmdArgs.push_back("-mabi");
Simon Atanasyan0da400c2013-02-27 14:55:49 +00006733 CmdArgs.push_back(getGnuCompatibleMipsABIName(ABIName).data());
Simon Atanasyan2390aa12012-04-06 19:15:24 +00006734
6735 if (getToolChain().getArch() == llvm::Triple::mips ||
6736 getToolChain().getArch() == llvm::Triple::mips64)
6737 CmdArgs.push_back("-EB");
6738 else
6739 CmdArgs.push_back("-EL");
Simon Atanasyan217dc2d2012-05-29 19:07:33 +00006740
Simon Atanasyan22127ce2013-09-24 09:09:16 +00006741 if (Arg *A = Args.getLastArg(options::OPT_mnan_EQ)) {
6742 if (StringRef(A->getValue()) == "2008")
6743 CmdArgs.push_back(Args.MakeArgString("-mnan=2008"));
6744 }
6745
Simon Atanasyan8cc7c122013-11-26 11:57:58 +00006746 Args.AddLastArg(CmdArgs, options::OPT_mfp32, options::OPT_mfp64);
Simon Atanasyan036d16d2013-04-30 07:47:13 +00006747 Args.AddLastArg(CmdArgs, options::OPT_mips16, options::OPT_mno_mips16);
6748 Args.AddLastArg(CmdArgs, options::OPT_mmicromips,
6749 options::OPT_mno_micromips);
6750 Args.AddLastArg(CmdArgs, options::OPT_mdsp, options::OPT_mno_dsp);
6751 Args.AddLastArg(CmdArgs, options::OPT_mdspr2, options::OPT_mno_dspr2);
6752
Simon Atanasyanbd986632013-11-26 11:58:04 +00006753 if (Arg *A = Args.getLastArg(options::OPT_mmsa, options::OPT_mno_msa)) {
6754 // Do not use AddLastArg because not all versions of MIPS assembler
6755 // support -mmsa / -mno-msa options.
6756 if (A->getOption().matches(options::OPT_mmsa))
6757 CmdArgs.push_back(Args.MakeArgString("-mmsa"));
6758 }
6759
Jakob Stoklund Olesen8d7f5062014-01-12 04:53:36 +00006760 NeedsKPIC = true;
6761 } else if (getToolChain().getArch() == llvm::Triple::systemz) {
6762 // Always pass an -march option, since our default of z10 is later
6763 // than the GNU assembler's default.
6764 StringRef CPUName = getSystemZTargetCPU(Args);
6765 CmdArgs.push_back(Args.MakeArgString("-march=" + CPUName));
6766 }
6767
Joerg Sonnenbergerc151b022014-02-19 21:58:52 +00006768 if (NeedsKPIC)
6769 addAssemblerKPIC(Args, CmdArgs);
Rafael Espindola92b00932010-08-10 00:25:48 +00006770
6771 Args.AddAllArgValues(CmdArgs, options::OPT_Wa_COMMA,
6772 options::OPT_Xassembler);
6773
6774 CmdArgs.push_back("-o");
6775 CmdArgs.push_back(Output.getFilename());
6776
6777 for (InputInfoList::const_iterator
6778 it = Inputs.begin(), ie = Inputs.end(); it != ie; ++it) {
6779 const InputInfo &II = *it;
6780 CmdArgs.push_back(II.getFilename());
6781 }
6782
6783 const char *Exec =
6784 Args.MakeArgString(getToolChain().GetProgramPath("as"));
6785 C.addCommand(new Command(JA, *this, Exec, CmdArgs));
Eric Christopher30aa6b62013-06-05 23:58:15 +00006786
6787 // Handle the debug info splitting at object creation time if we're
6788 // creating an object.
6789 // TODO: Currently only works on linux with newer objcopy.
6790 if (Args.hasArg(options::OPT_gsplit_dwarf) &&
Cameron Esfahani556d91e2013-09-14 01:09:11 +00006791 getToolChain().getTriple().isOSLinux())
Eric Christopher30aa6b62013-06-05 23:58:15 +00006792 SplitDebugInfo(getToolChain(), C, *this, JA, Args, Output,
6793 SplitDebugName(Args, Inputs));
Rafael Espindola92b00932010-08-10 00:25:48 +00006794}
6795
Benjamin Kramer9299637dc2014-03-04 19:31:42 +00006796static void AddLibgcc(const llvm::Triple &Triple, const Driver &D,
Evgeniy Stepanov77866712012-04-25 08:59:22 +00006797 ArgStringList &CmdArgs, const ArgList &Args) {
Logan Chienc6fd8202012-09-02 09:30:11 +00006798 bool isAndroid = Triple.getEnvironment() == llvm::Triple::Android;
Chandler Carruth58d6eb62013-03-04 02:07:55 +00006799 bool StaticLibgcc = Args.hasArg(options::OPT_static_libgcc) ||
6800 Args.hasArg(options::OPT_static);
Hans Wennborg70850d82013-07-18 20:29:38 +00006801 if (!D.CCCIsCXX())
Rafael Espindolacc354322011-10-17 21:39:04 +00006802 CmdArgs.push_back("-lgcc");
6803
Logan Chien3d3373c2012-11-19 12:04:11 +00006804 if (StaticLibgcc || isAndroid) {
Hans Wennborg70850d82013-07-18 20:29:38 +00006805 if (D.CCCIsCXX())
Rafael Espindolacc354322011-10-17 21:39:04 +00006806 CmdArgs.push_back("-lgcc");
6807 } else {
Hans Wennborg70850d82013-07-18 20:29:38 +00006808 if (!D.CCCIsCXX())
Rafael Espindolacc354322011-10-17 21:39:04 +00006809 CmdArgs.push_back("--as-needed");
6810 CmdArgs.push_back("-lgcc_s");
Hans Wennborg70850d82013-07-18 20:29:38 +00006811 if (!D.CCCIsCXX())
Rafael Espindolacc354322011-10-17 21:39:04 +00006812 CmdArgs.push_back("--no-as-needed");
6813 }
6814
Evgeniy Stepanov77866712012-04-25 08:59:22 +00006815 if (StaticLibgcc && !isAndroid)
Rafael Espindolacc354322011-10-17 21:39:04 +00006816 CmdArgs.push_back("-lgcc_eh");
Hans Wennborg70850d82013-07-18 20:29:38 +00006817 else if (!Args.hasArg(options::OPT_shared) && D.CCCIsCXX())
Rafael Espindolacc354322011-10-17 21:39:04 +00006818 CmdArgs.push_back("-lgcc");
Logan Chien3d3373c2012-11-19 12:04:11 +00006819
6820 // According to Android ABI, we have to link with libdl if we are
6821 // linking with non-static libgcc.
6822 //
6823 // NOTE: This fixes a link error on Android MIPS as well. The non-static
6824 // libgcc for MIPS relies on _Unwind_Find_FDE and dl_iterate_phdr from libdl.
6825 if (isAndroid && !StaticLibgcc)
6826 CmdArgs.push_back("-ldl");
Rafael Espindolacc354322011-10-17 21:39:04 +00006827}
6828
Peter Collingbourne9d9e1fc2013-05-27 21:40:20 +00006829static StringRef getLinuxDynamicLinker(const ArgList &Args,
6830 const toolchains::Linux &ToolChain) {
Alexey Bataevcf7ae302014-01-23 09:08:32 +00006831 if (ToolChain.getTriple().getEnvironment() == llvm::Triple::Android) {
6832 if (ToolChain.getTriple().isArch64Bit())
6833 return "/system/bin/linker64";
6834 else
6835 return "/system/bin/linker";
6836 } else if (ToolChain.getArch() == llvm::Triple::x86 ||
6837 ToolChain.getArch() == llvm::Triple::sparc)
Peter Collingbourne9d9e1fc2013-05-27 21:40:20 +00006838 return "/lib/ld-linux.so.2";
Tim Northovera2ee4332014-03-29 15:09:45 +00006839 else if (ToolChain.getArch() == llvm::Triple::aarch64 ||
6840 ToolChain.getArch() == llvm::Triple::arm64)
Peter Collingbourne9d9e1fc2013-05-27 21:40:20 +00006841 return "/lib/ld-linux-aarch64.so.1";
Christian Pirkera74c7912014-03-14 12:15:45 +00006842 else if (ToolChain.getArch() == llvm::Triple::aarch64_be)
6843 return "/lib/ld-linux-aarch64_be.so.1";
Peter Collingbourne9d9e1fc2013-05-27 21:40:20 +00006844 else if (ToolChain.getArch() == llvm::Triple::arm ||
6845 ToolChain.getArch() == llvm::Triple::thumb) {
6846 if (ToolChain.getTriple().getEnvironment() == llvm::Triple::GNUEABIHF)
6847 return "/lib/ld-linux-armhf.so.3";
6848 else
6849 return "/lib/ld-linux.so.3";
Christian Pirkerf01cd6f2014-03-28 14:40:46 +00006850 } else if (ToolChain.getArch() == llvm::Triple::armeb ||
6851 ToolChain.getArch() == llvm::Triple::thumbeb) {
6852 if (ToolChain.getTriple().getEnvironment() == llvm::Triple::GNUEABIHF)
6853 return "/lib/ld-linux-armhf.so.3"; /* TODO: check which dynamic linker name. */
6854 else
6855 return "/lib/ld-linux.so.3"; /* TODO: check which dynamic linker name. */
Peter Collingbourne9d9e1fc2013-05-27 21:40:20 +00006856 } else if (ToolChain.getArch() == llvm::Triple::mips ||
6857 ToolChain.getArch() == llvm::Triple::mipsel)
6858 return "/lib/ld.so.1";
6859 else if (ToolChain.getArch() == llvm::Triple::mips64 ||
6860 ToolChain.getArch() == llvm::Triple::mips64el) {
Jonathan Roelofs2cea1be2014-02-12 03:21:20 +00006861 if (mips::hasMipsAbiArg(Args, "n32"))
Peter Collingbourne9d9e1fc2013-05-27 21:40:20 +00006862 return "/lib32/ld.so.1";
6863 else
6864 return "/lib64/ld.so.1";
6865 } else if (ToolChain.getArch() == llvm::Triple::ppc)
6866 return "/lib/ld.so.1";
6867 else if (ToolChain.getArch() == llvm::Triple::ppc64 ||
Bill Schmidt778d3872013-07-26 01:36:11 +00006868 ToolChain.getArch() == llvm::Triple::ppc64le ||
Peter Collingbourne9d9e1fc2013-05-27 21:40:20 +00006869 ToolChain.getArch() == llvm::Triple::systemz)
6870 return "/lib64/ld64.so.1";
Jakob Stoklund Olesen73cb84c2014-01-10 08:18:34 +00006871 else if (ToolChain.getArch() == llvm::Triple::sparcv9)
6872 return "/lib64/ld-linux.so.2";
Peter Collingbourne9d9e1fc2013-05-27 21:40:20 +00006873 else
6874 return "/lib64/ld-linux-x86-64.so.2";
6875}
6876
Renato Golinc4b49242014-02-13 10:01:16 +00006877static void AddRunTimeLibs(const ToolChain &TC, const Driver &D,
6878 ArgStringList &CmdArgs, const ArgList &Args) {
6879 // Make use of compiler-rt if --rtlib option is used
6880 ToolChain::RuntimeLibType RLT = TC.GetRuntimeLibType(Args);
6881
6882 switch(RLT) {
6883 case ToolChain::RLT_CompilerRT:
6884 addClangRTLinux(TC, Args, CmdArgs);
6885 break;
6886 case ToolChain::RLT_Libgcc:
6887 AddLibgcc(TC.getTriple(), D, CmdArgs, Args);
6888 break;
Renato Golinc4b49242014-02-13 10:01:16 +00006889 }
6890}
6891
Thomas Schwinge4e555262013-03-28 19:04:25 +00006892void gnutools::Link::ConstructJob(Compilation &C, const JobAction &JA,
6893 const InputInfo &Output,
6894 const InputInfoList &Inputs,
6895 const ArgList &Args,
6896 const char *LinkingOutput) const {
Rafael Espindolac8f008f2010-11-07 20:14:31 +00006897 const toolchains::Linux& ToolChain =
6898 static_cast<const toolchains::Linux&>(getToolChain());
6899 const Driver &D = ToolChain.getDriver();
Rafael Espindola7df35012012-11-02 20:41:30 +00006900 const bool isAndroid =
6901 ToolChain.getTriple().getEnvironment() == llvm::Triple::Android;
Peter Collingbourne54d770c2013-04-09 04:35:11 +00006902 const bool IsPIE =
6903 !Args.hasArg(options::OPT_shared) &&
Alexey Samsonove65ceb92014-02-25 13:26:03 +00006904 (Args.hasArg(options::OPT_pie) || ToolChain.isPIEDefault());
Evgeniy Stepanov77866712012-04-25 08:59:22 +00006905
Rafael Espindolac8f008f2010-11-07 20:14:31 +00006906 ArgStringList CmdArgs;
6907
Rafael Espindolad1002f62010-11-15 18:28:16 +00006908 // Silence warning for "clang -g foo.o -o foo"
6909 Args.ClaimAllArgs(options::OPT_g_Group);
Rafael Espindolad95a8122011-03-01 05:25:27 +00006910 // and "clang -emit-llvm foo.o -o foo"
6911 Args.ClaimAllArgs(options::OPT_emit_llvm);
David Chisnall5f99f482012-07-29 15:24:44 +00006912 // and for "clang -w foo.o -o foo". Other warning options are already
Rafael Espindolaf92614c2010-11-17 20:37:10 +00006913 // handled somewhere else.
6914 Args.ClaimAllArgs(options::OPT_w);
Rafael Espindolad1002f62010-11-15 18:28:16 +00006915
Joerg Sonnenberger6165ab12011-03-21 13:51:29 +00006916 if (!D.SysRoot.empty())
6917 CmdArgs.push_back(Args.MakeArgString("--sysroot=" + D.SysRoot));
Rafael Espindolac8f008f2010-11-07 20:14:31 +00006918
Peter Collingbourne54d770c2013-04-09 04:35:11 +00006919 if (IsPIE)
Rafael Espindolad47ac232010-11-17 22:26:15 +00006920 CmdArgs.push_back("-pie");
6921
Rafael Espindola1c76c592010-11-07 22:57:16 +00006922 if (Args.hasArg(options::OPT_rdynamic))
6923 CmdArgs.push_back("-export-dynamic");
6924
Rafael Espindola34d77dc2010-11-11 19:34:42 +00006925 if (Args.hasArg(options::OPT_s))
6926 CmdArgs.push_back("-s");
6927
Rafael Espindolac8f008f2010-11-07 20:14:31 +00006928 for (std::vector<std::string>::const_iterator i = ToolChain.ExtraOpts.begin(),
6929 e = ToolChain.ExtraOpts.end();
6930 i != e; ++i)
6931 CmdArgs.push_back(i->c_str());
6932
6933 if (!Args.hasArg(options::OPT_static)) {
6934 CmdArgs.push_back("--eh-frame-hdr");
6935 }
6936
6937 CmdArgs.push_back("-m");
6938 if (ToolChain.getArch() == llvm::Triple::x86)
6939 CmdArgs.push_back("elf_i386");
Tim Northovera2ee4332014-03-29 15:09:45 +00006940 else if (ToolChain.getArch() == llvm::Triple::aarch64 ||
6941 ToolChain.getArch() == llvm::Triple::arm64)
Tim Northover9bb857a2013-01-31 12:13:10 +00006942 CmdArgs.push_back("aarch64linux");
Christian Pirkera74c7912014-03-14 12:15:45 +00006943 else if (ToolChain.getArch() == llvm::Triple::aarch64_be)
6944 CmdArgs.push_back("aarch64_be_linux");
Eric Christopher84fbdb42011-08-19 00:30:14 +00006945 else if (ToolChain.getArch() == llvm::Triple::arm
Douglas Gregord9bb1522011-03-06 19:11:49 +00006946 || ToolChain.getArch() == llvm::Triple::thumb)
Rafael Espindolac8f008f2010-11-07 20:14:31 +00006947 CmdArgs.push_back("armelf_linux_eabi");
Christian Pirkerf01cd6f2014-03-28 14:40:46 +00006948 else if (ToolChain.getArch() == llvm::Triple::armeb
6949 || ToolChain.getArch() == llvm::Triple::thumbeb)
6950 CmdArgs.push_back("armebelf_linux_eabi"); /* TODO: check which NAME. */
Ted Kremenek43d47cc2011-04-05 22:04:27 +00006951 else if (ToolChain.getArch() == llvm::Triple::ppc)
6952 CmdArgs.push_back("elf32ppclinux");
6953 else if (ToolChain.getArch() == llvm::Triple::ppc64)
6954 CmdArgs.push_back("elf64ppc");
Will Schmidtc1fc1902014-03-24 17:10:37 +00006955 else if (ToolChain.getArch() == llvm::Triple::ppc64le)
6956 CmdArgs.push_back("elf64lppc");
Jakob Stoklund Olesen91a8e032014-01-10 03:51:33 +00006957 else if (ToolChain.getArch() == llvm::Triple::sparc)
6958 CmdArgs.push_back("elf32_sparc");
6959 else if (ToolChain.getArch() == llvm::Triple::sparcv9)
6960 CmdArgs.push_back("elf64_sparc");
Eli Friedman27b8c4f2011-11-08 19:43:37 +00006961 else if (ToolChain.getArch() == llvm::Triple::mips)
6962 CmdArgs.push_back("elf32btsmip");
6963 else if (ToolChain.getArch() == llvm::Triple::mipsel)
6964 CmdArgs.push_back("elf32ltsmip");
Simon Atanasyan2d1b1ad2012-10-21 11:44:57 +00006965 else if (ToolChain.getArch() == llvm::Triple::mips64) {
Jonathan Roelofs2cea1be2014-02-12 03:21:20 +00006966 if (mips::hasMipsAbiArg(Args, "n32"))
Simon Atanasyan2d1b1ad2012-10-21 11:44:57 +00006967 CmdArgs.push_back("elf32btsmipn32");
6968 else
6969 CmdArgs.push_back("elf64btsmip");
6970 }
6971 else if (ToolChain.getArch() == llvm::Triple::mips64el) {
Jonathan Roelofs2cea1be2014-02-12 03:21:20 +00006972 if (mips::hasMipsAbiArg(Args, "n32"))
Simon Atanasyan2d1b1ad2012-10-21 11:44:57 +00006973 CmdArgs.push_back("elf32ltsmipn32");
6974 else
6975 CmdArgs.push_back("elf64ltsmip");
6976 }
Ulrich Weigand47445072013-05-06 16:26:41 +00006977 else if (ToolChain.getArch() == llvm::Triple::systemz)
6978 CmdArgs.push_back("elf64_s390");
Rafael Espindolac8f008f2010-11-07 20:14:31 +00006979 else
6980 CmdArgs.push_back("elf_x86_64");
6981
6982 if (Args.hasArg(options::OPT_static)) {
Joerg Sonnenberger1e205ef2014-02-02 22:36:13 +00006983 if (ToolChain.getArch() == llvm::Triple::arm ||
Christian Pirkerf01cd6f2014-03-28 14:40:46 +00006984 ToolChain.getArch() == llvm::Triple::armeb ||
6985 ToolChain.getArch() == llvm::Triple::thumb ||
6986 ToolChain.getArch() == llvm::Triple::thumbeb)
Rafael Espindolac8f008f2010-11-07 20:14:31 +00006987 CmdArgs.push_back("-Bstatic");
6988 else
6989 CmdArgs.push_back("-static");
6990 } else if (Args.hasArg(options::OPT_shared)) {
6991 CmdArgs.push_back("-shared");
Rafael Espindola7df35012012-11-02 20:41:30 +00006992 if (isAndroid) {
Evgeniy Stepanov77866712012-04-25 08:59:22 +00006993 CmdArgs.push_back("-Bsymbolic");
6994 }
Rafael Espindolac8f008f2010-11-07 20:14:31 +00006995 }
6996
6997 if (ToolChain.getArch() == llvm::Triple::arm ||
Christian Pirkerf01cd6f2014-03-28 14:40:46 +00006998 ToolChain.getArch() == llvm::Triple::armeb ||
Douglas Gregord9bb1522011-03-06 19:11:49 +00006999 ToolChain.getArch() == llvm::Triple::thumb ||
Christian Pirkerf01cd6f2014-03-28 14:40:46 +00007000 ToolChain.getArch() == llvm::Triple::thumbeb ||
Rafael Espindolac8f008f2010-11-07 20:14:31 +00007001 (!Args.hasArg(options::OPT_static) &&
7002 !Args.hasArg(options::OPT_shared))) {
7003 CmdArgs.push_back("-dynamic-linker");
Peter Collingbourne9d9e1fc2013-05-27 21:40:20 +00007004 CmdArgs.push_back(Args.MakeArgString(
7005 D.DyldPrefix + getLinuxDynamicLinker(Args, ToolChain)));
Rafael Espindolac8f008f2010-11-07 20:14:31 +00007006 }
7007
7008 CmdArgs.push_back("-o");
7009 CmdArgs.push_back(Output.getFilename());
7010
Rafael Espindola81937ec2010-12-01 01:52:43 +00007011 if (!Args.hasArg(options::OPT_nostdlib) &&
7012 !Args.hasArg(options::OPT_nostartfiles)) {
Evgeniy Stepanov77866712012-04-25 08:59:22 +00007013 if (!isAndroid) {
7014 const char *crt1 = NULL;
7015 if (!Args.hasArg(options::OPT_shared)){
Eric Christopherac021742013-06-07 23:25:01 +00007016 if (Args.hasArg(options::OPT_pg))
7017 crt1 = "gcrt1.o";
7018 else if (IsPIE)
Evgeniy Stepanov77866712012-04-25 08:59:22 +00007019 crt1 = "Scrt1.o";
7020 else
7021 crt1 = "crt1.o";
7022 }
7023 if (crt1)
7024 CmdArgs.push_back(Args.MakeArgString(ToolChain.GetFilePath(crt1)));
Rafael Espindolac8f008f2010-11-07 20:14:31 +00007025
Evgeniy Stepanov77866712012-04-25 08:59:22 +00007026 CmdArgs.push_back(Args.MakeArgString(ToolChain.GetFilePath("crti.o")));
7027 }
Rafael Espindolac8f008f2010-11-07 20:14:31 +00007028
Rafael Espindola9aa60e92010-11-12 03:00:39 +00007029 const char *crtbegin;
7030 if (Args.hasArg(options::OPT_static))
Evgeniy Stepanov77866712012-04-25 08:59:22 +00007031 crtbegin = isAndroid ? "crtbegin_static.o" : "crtbeginT.o";
Evgeniy Stepanovc9cde482012-09-10 10:30:12 +00007032 else if (Args.hasArg(options::OPT_shared))
Evgeniy Stepanov77866712012-04-25 08:59:22 +00007033 crtbegin = isAndroid ? "crtbegin_so.o" : "crtbeginS.o";
Peter Collingbourne54d770c2013-04-09 04:35:11 +00007034 else if (IsPIE)
Evgeniy Stepanovc9cde482012-09-10 10:30:12 +00007035 crtbegin = isAndroid ? "crtbegin_dynamic.o" : "crtbeginS.o";
Rafael Espindola9aa60e92010-11-12 03:00:39 +00007036 else
Evgeniy Stepanov77866712012-04-25 08:59:22 +00007037 crtbegin = isAndroid ? "crtbegin_dynamic.o" : "crtbegin.o";
Rafael Espindola9aa60e92010-11-12 03:00:39 +00007038 CmdArgs.push_back(Args.MakeArgString(ToolChain.GetFilePath(crtbegin)));
Benjamin Kramer058666a2012-10-04 19:42:20 +00007039
7040 // Add crtfastmath.o if available and fast math is enabled.
7041 ToolChain.AddFastMathRuntimeIfAvailable(Args, CmdArgs);
Rafael Espindola9aa60e92010-11-12 03:00:39 +00007042 }
Rafael Espindolac8f008f2010-11-07 20:14:31 +00007043
7044 Args.AddAllArgs(CmdArgs, options::OPT_L);
7045
7046 const ToolChain::path_list Paths = ToolChain.getFilePaths();
7047
Roman Divackyee8188a2011-03-01 17:53:14 +00007048 for (ToolChain::path_list::const_iterator i = Paths.begin(), e = Paths.end();
7049 i != e; ++i)
Chris Lattner0e62c1c2011-07-23 10:55:15 +00007050 CmdArgs.push_back(Args.MakeArgString(StringRef("-L") + *i));
Rafael Espindolac8f008f2010-11-07 20:14:31 +00007051
Alp Tokerce365ca2013-12-02 12:43:03 +00007052 if (D.IsUsingLTO(Args))
7053 AddGoldPlugin(ToolChain, Args, CmdArgs);
Chandler Carruth953fb082013-01-13 11:46:33 +00007054
Nick Lewycky2fe6aab2012-08-17 03:39:16 +00007055 if (Args.hasArg(options::OPT_Z_Xlinker__no_demangle))
7056 CmdArgs.push_back("--no-demangle");
7057
Rafael Espindolac8f008f2010-11-07 20:14:31 +00007058 AddLinkerInputs(ToolChain, Inputs, Args, CmdArgs);
7059
Alexey Samsonovce8ab102014-02-25 12:43:43 +00007060 addSanitizerRuntimes(getToolChain(), Args, CmdArgs);
Chandler Carruthe4458b32013-06-24 09:38:45 +00007061 // The profile runtime also needs access to system libraries.
Alexey Samsonov7811d192014-02-20 13:57:37 +00007062 addProfileRT(getToolChain(), Args, CmdArgs);
Chandler Carruthe4458b32013-06-24 09:38:45 +00007063
Hans Wennborg70850d82013-07-18 20:29:38 +00007064 if (D.CCCIsCXX() &&
Chandler Carruth94a32012012-05-14 18:31:18 +00007065 !Args.hasArg(options::OPT_nostdlib) &&
7066 !Args.hasArg(options::OPT_nodefaultlibs)) {
Rafael Espindola70b8d762011-10-17 22:14:51 +00007067 bool OnlyLibstdcxxStatic = Args.hasArg(options::OPT_static_libstdcxx) &&
7068 !Args.hasArg(options::OPT_static);
7069 if (OnlyLibstdcxxStatic)
7070 CmdArgs.push_back("-Bstatic");
Rafael Espindolac8f008f2010-11-07 20:14:31 +00007071 ToolChain.AddCXXStdlibLibArgs(Args, CmdArgs);
Rafael Espindola70b8d762011-10-17 22:14:51 +00007072 if (OnlyLibstdcxxStatic)
7073 CmdArgs.push_back("-Bdynamic");
Rafael Espindolac8f008f2010-11-07 20:14:31 +00007074 CmdArgs.push_back("-lm");
7075 }
7076
Rafael Espindola9aa60e92010-11-12 03:00:39 +00007077 if (!Args.hasArg(options::OPT_nostdlib)) {
Chandler Carruth94a32012012-05-14 18:31:18 +00007078 if (!Args.hasArg(options::OPT_nodefaultlibs)) {
7079 if (Args.hasArg(options::OPT_static))
7080 CmdArgs.push_back("--start-group");
Nick Lewycky97864da2011-06-04 06:27:06 +00007081
Alexey Bataev186b28a2014-03-06 05:43:53 +00007082 LibOpenMP UsedOpenMPLib = LibUnknown;
7083 if (Args.hasArg(options::OPT_fopenmp)) {
7084 UsedOpenMPLib = LibGOMP;
7085 } else if (const Arg *A = Args.getLastArg(options::OPT_fopenmp_EQ)) {
7086 UsedOpenMPLib = llvm::StringSwitch<LibOpenMP>(A->getValue())
7087 .Case("libgomp", LibGOMP)
7088 .Case("libiomp5", LibIOMP5)
7089 .Default(LibUnknown);
7090 if (UsedOpenMPLib == LibUnknown)
7091 D.Diag(diag::err_drv_unsupported_option_argument)
7092 << A->getOption().getName() << A->getValue();
7093 }
7094 switch (UsedOpenMPLib) {
7095 case LibGOMP:
Chandler Carruth01538002013-01-17 13:19:29 +00007096 CmdArgs.push_back("-lgomp");
7097
Alp Tokerf6a24ce2013-12-05 16:25:25 +00007098 // FIXME: Exclude this for platforms with libgomp that don't require
7099 // librt. Most modern Linux platforms require it, but some may not.
Chandler Carruth01538002013-01-17 13:19:29 +00007100 CmdArgs.push_back("-lrt");
Alexey Bataev186b28a2014-03-06 05:43:53 +00007101 break;
7102 case LibIOMP5:
7103 CmdArgs.push_back("-liomp5");
7104 break;
7105 case LibUnknown:
7106 break;
Chandler Carruth01538002013-01-17 13:19:29 +00007107 }
Renato Golinc4b49242014-02-13 10:01:16 +00007108 AddRunTimeLibs(ToolChain, D, CmdArgs, Args);
Rafael Espindola9aa60e92010-11-12 03:00:39 +00007109
Chandler Carruth94a32012012-05-14 18:31:18 +00007110 if (Args.hasArg(options::OPT_pthread) ||
Alexey Bataev648250a2014-03-07 07:43:52 +00007111 Args.hasArg(options::OPT_pthreads) || UsedOpenMPLib != LibUnknown)
Chandler Carruth94a32012012-05-14 18:31:18 +00007112 CmdArgs.push_back("-lpthread");
7113
7114 CmdArgs.push_back("-lc");
7115
7116 if (Args.hasArg(options::OPT_static))
7117 CmdArgs.push_back("--end-group");
7118 else
Renato Golinc4b49242014-02-13 10:01:16 +00007119 AddRunTimeLibs(ToolChain, D, CmdArgs, Args);
Chandler Carruth94a32012012-05-14 18:31:18 +00007120 }
Rafael Espindolad47ac232010-11-17 22:26:15 +00007121
Rafael Espindola81937ec2010-12-01 01:52:43 +00007122 if (!Args.hasArg(options::OPT_nostartfiles)) {
7123 const char *crtend;
Evgeniy Stepanovc9cde482012-09-10 10:30:12 +00007124 if (Args.hasArg(options::OPT_shared))
Evgeniy Stepanov77866712012-04-25 08:59:22 +00007125 crtend = isAndroid ? "crtend_so.o" : "crtendS.o";
Peter Collingbourne54d770c2013-04-09 04:35:11 +00007126 else if (IsPIE)
Evgeniy Stepanovc9cde482012-09-10 10:30:12 +00007127 crtend = isAndroid ? "crtend_android.o" : "crtendS.o";
Rafael Espindola81937ec2010-12-01 01:52:43 +00007128 else
Evgeniy Stepanov77866712012-04-25 08:59:22 +00007129 crtend = isAndroid ? "crtend_android.o" : "crtend.o";
Rafael Espindola9aa60e92010-11-12 03:00:39 +00007130
Rafael Espindola81937ec2010-12-01 01:52:43 +00007131 CmdArgs.push_back(Args.MakeArgString(ToolChain.GetFilePath(crtend)));
Evgeniy Stepanov77866712012-04-25 08:59:22 +00007132 if (!isAndroid)
7133 CmdArgs.push_back(Args.MakeArgString(ToolChain.GetFilePath("crtn.o")));
Rafael Espindola81937ec2010-12-01 01:52:43 +00007134 }
Rafael Espindolac8f008f2010-11-07 20:14:31 +00007135 }
7136
Rafael Espindolac8f008f2010-11-07 20:14:31 +00007137 C.addCommand(new Command(JA, *this, ToolChain.Linker.c_str(), CmdArgs));
7138}
Rafael Espindola92b00932010-08-10 00:25:48 +00007139
Chris Lattner3e2ee142010-07-07 16:01:42 +00007140void minix::Assemble::ConstructJob(Compilation &C, const JobAction &JA,
Daniel Dunbar7fbaf532010-08-02 02:38:28 +00007141 const InputInfo &Output,
7142 const InputInfoList &Inputs,
7143 const ArgList &Args,
7144 const char *LinkingOutput) const {
Chris Lattner3e2ee142010-07-07 16:01:42 +00007145 ArgStringList CmdArgs;
7146
7147 Args.AddAllArgValues(CmdArgs, options::OPT_Wa_COMMA,
7148 options::OPT_Xassembler);
7149
7150 CmdArgs.push_back("-o");
Daniel Dunbarb440f562010-08-02 02:38:21 +00007151 CmdArgs.push_back(Output.getFilename());
Chris Lattner3e2ee142010-07-07 16:01:42 +00007152
7153 for (InputInfoList::const_iterator
7154 it = Inputs.begin(), ie = Inputs.end(); it != ie; ++it) {
7155 const InputInfo &II = *it;
Daniel Dunbarb440f562010-08-02 02:38:21 +00007156 CmdArgs.push_back(II.getFilename());
Chris Lattner3e2ee142010-07-07 16:01:42 +00007157 }
7158
7159 const char *Exec =
Eli Friedman83de5132011-12-08 23:54:21 +00007160 Args.MakeArgString(getToolChain().GetProgramPath("as"));
Daniel Dunbar7fbaf532010-08-02 02:38:28 +00007161 C.addCommand(new Command(JA, *this, Exec, CmdArgs));
Chris Lattner3e2ee142010-07-07 16:01:42 +00007162}
7163
7164void minix::Link::ConstructJob(Compilation &C, const JobAction &JA,
Daniel Dunbar7fbaf532010-08-02 02:38:28 +00007165 const InputInfo &Output,
7166 const InputInfoList &Inputs,
7167 const ArgList &Args,
7168 const char *LinkingOutput) const {
Chris Lattner3e2ee142010-07-07 16:01:42 +00007169 const Driver &D = getToolChain().getDriver();
7170 ArgStringList CmdArgs;
7171
Daniel Dunbarb440f562010-08-02 02:38:21 +00007172 if (Output.isFilename()) {
Chris Lattner3e2ee142010-07-07 16:01:42 +00007173 CmdArgs.push_back("-o");
7174 CmdArgs.push_back(Output.getFilename());
7175 } else {
7176 assert(Output.isNothing() && "Invalid output.");
7177 }
7178
7179 if (!Args.hasArg(options::OPT_nostdlib) &&
Eli Friedman83de5132011-12-08 23:54:21 +00007180 !Args.hasArg(options::OPT_nostartfiles)) {
7181 CmdArgs.push_back(Args.MakeArgString(getToolChain().GetFilePath("crt1.o")));
7182 CmdArgs.push_back(Args.MakeArgString(getToolChain().GetFilePath("crti.o")));
7183 CmdArgs.push_back(Args.MakeArgString(getToolChain().GetFilePath("crtbegin.o")));
7184 CmdArgs.push_back(Args.MakeArgString(getToolChain().GetFilePath("crtn.o")));
7185 }
Chris Lattner3e2ee142010-07-07 16:01:42 +00007186
7187 Args.AddAllArgs(CmdArgs, options::OPT_L);
7188 Args.AddAllArgs(CmdArgs, options::OPT_T_Group);
7189 Args.AddAllArgs(CmdArgs, options::OPT_e);
7190
Daniel Dunbar54423b22010-09-17 00:24:54 +00007191 AddLinkerInputs(getToolChain(), Inputs, Args, CmdArgs);
Chris Lattner3e2ee142010-07-07 16:01:42 +00007192
Alexey Samsonov7811d192014-02-20 13:57:37 +00007193 addProfileRT(getToolChain(), Args, CmdArgs);
Eli Friedman83de5132011-12-08 23:54:21 +00007194
Chris Lattner3e2ee142010-07-07 16:01:42 +00007195 if (!Args.hasArg(options::OPT_nostdlib) &&
7196 !Args.hasArg(options::OPT_nodefaultlibs)) {
Hans Wennborg70850d82013-07-18 20:29:38 +00007197 if (D.CCCIsCXX()) {
Daniel Dunbar3f7796f2010-09-17 01:20:05 +00007198 getToolChain().AddCXXStdlibLibArgs(Args, CmdArgs);
Chris Lattner3e2ee142010-07-07 16:01:42 +00007199 CmdArgs.push_back("-lm");
7200 }
Chris Lattner3e2ee142010-07-07 16:01:42 +00007201 }
7202
7203 if (!Args.hasArg(options::OPT_nostdlib) &&
7204 !Args.hasArg(options::OPT_nostartfiles)) {
Eli Friedman83de5132011-12-08 23:54:21 +00007205 if (Args.hasArg(options::OPT_pthread))
7206 CmdArgs.push_back("-lpthread");
7207 CmdArgs.push_back("-lc");
7208 CmdArgs.push_back("-lCompilerRT-Generic");
7209 CmdArgs.push_back("-L/usr/pkg/compiler-rt/lib");
7210 CmdArgs.push_back(
Eric Christopher45f2e712012-12-18 00:31:10 +00007211 Args.MakeArgString(getToolChain().GetFilePath("crtend.o")));
Chris Lattner3e2ee142010-07-07 16:01:42 +00007212 }
7213
Rafael Espindola236db462013-11-09 20:07:19 +00007214 const char *Exec = Args.MakeArgString(getToolChain().GetProgramPath("ld"));
Daniel Dunbar7fbaf532010-08-02 02:38:28 +00007215 C.addCommand(new Command(JA, *this, Exec, CmdArgs));
Chris Lattner3e2ee142010-07-07 16:01:42 +00007216}
7217
Daniel Dunbarcc912342009-05-02 18:28:39 +00007218/// DragonFly Tools
7219
7220// For now, DragonFly Assemble does just about the same as for
7221// FreeBSD, but this may change soon.
7222void dragonfly::Assemble::ConstructJob(Compilation &C, const JobAction &JA,
Daniel Dunbar7fbaf532010-08-02 02:38:28 +00007223 const InputInfo &Output,
Daniel Dunbar1c7577c2009-11-04 06:24:38 +00007224 const InputInfoList &Inputs,
7225 const ArgList &Args,
7226 const char *LinkingOutput) const {
Daniel Dunbarcc912342009-05-02 18:28:39 +00007227 ArgStringList CmdArgs;
7228
7229 // When building 32-bit code on DragonFly/pc64, we have to explicitly
7230 // instruct as in the base system to assemble 32-bit code.
Rafael Espindola35ca7d92012-10-07 04:44:33 +00007231 if (getToolChain().getArch() == llvm::Triple::x86)
Daniel Dunbarcc912342009-05-02 18:28:39 +00007232 CmdArgs.push_back("--32");
7233
7234 Args.AddAllArgValues(CmdArgs, options::OPT_Wa_COMMA,
7235 options::OPT_Xassembler);
7236
7237 CmdArgs.push_back("-o");
Daniel Dunbarb440f562010-08-02 02:38:21 +00007238 CmdArgs.push_back(Output.getFilename());
Daniel Dunbarcc912342009-05-02 18:28:39 +00007239
7240 for (InputInfoList::const_iterator
7241 it = Inputs.begin(), ie = Inputs.end(); it != ie; ++it) {
7242 const InputInfo &II = *it;
Daniel Dunbarb440f562010-08-02 02:38:21 +00007243 CmdArgs.push_back(II.getFilename());
Daniel Dunbarcc912342009-05-02 18:28:39 +00007244 }
7245
7246 const char *Exec =
Daniel Dunbar9c3ed5f2010-07-14 18:46:23 +00007247 Args.MakeArgString(getToolChain().GetProgramPath("as"));
Daniel Dunbar7fbaf532010-08-02 02:38:28 +00007248 C.addCommand(new Command(JA, *this, Exec, CmdArgs));
Daniel Dunbarcc912342009-05-02 18:28:39 +00007249}
7250
7251void dragonfly::Link::ConstructJob(Compilation &C, const JobAction &JA,
Daniel Dunbar7fbaf532010-08-02 02:38:28 +00007252 const InputInfo &Output,
7253 const InputInfoList &Inputs,
7254 const ArgList &Args,
7255 const char *LinkingOutput) const {
John McCall65b8da02013-04-11 22:55:55 +00007256 bool UseGCC47 = false;
Daniel Dunbar083edf72009-12-21 18:54:17 +00007257 const Driver &D = getToolChain().getDriver();
Daniel Dunbarcc912342009-05-02 18:28:39 +00007258 ArgStringList CmdArgs;
7259
John McCall65b8da02013-04-11 22:55:55 +00007260 if (llvm::sys::fs::exists("/usr/lib/gcc47", UseGCC47))
7261 UseGCC47 = false;
7262
Joerg Sonnenberger6165ab12011-03-21 13:51:29 +00007263 if (!D.SysRoot.empty())
7264 CmdArgs.push_back(Args.MakeArgString("--sysroot=" + D.SysRoot));
7265
John McCall65b8da02013-04-11 22:55:55 +00007266 CmdArgs.push_back("--eh-frame-hdr");
Daniel Dunbarcc912342009-05-02 18:28:39 +00007267 if (Args.hasArg(options::OPT_static)) {
7268 CmdArgs.push_back("-Bstatic");
7269 } else {
John McCall65b8da02013-04-11 22:55:55 +00007270 if (Args.hasArg(options::OPT_rdynamic))
7271 CmdArgs.push_back("-export-dynamic");
Daniel Dunbarcc912342009-05-02 18:28:39 +00007272 if (Args.hasArg(options::OPT_shared))
7273 CmdArgs.push_back("-Bshareable");
7274 else {
7275 CmdArgs.push_back("-dynamic-linker");
7276 CmdArgs.push_back("/usr/libexec/ld-elf.so.2");
7277 }
John McCall65b8da02013-04-11 22:55:55 +00007278 CmdArgs.push_back("--hash-style=both");
Daniel Dunbarcc912342009-05-02 18:28:39 +00007279 }
7280
7281 // When building 32-bit code on DragonFly/pc64, we have to explicitly
7282 // instruct ld in the base system to link 32-bit code.
Rafael Espindola35ca7d92012-10-07 04:44:33 +00007283 if (getToolChain().getArch() == llvm::Triple::x86) {
Daniel Dunbarcc912342009-05-02 18:28:39 +00007284 CmdArgs.push_back("-m");
7285 CmdArgs.push_back("elf_i386");
7286 }
7287
Daniel Dunbarb440f562010-08-02 02:38:21 +00007288 if (Output.isFilename()) {
Daniel Dunbarcc912342009-05-02 18:28:39 +00007289 CmdArgs.push_back("-o");
7290 CmdArgs.push_back(Output.getFilename());
7291 } else {
7292 assert(Output.isNothing() && "Invalid output.");
7293 }
7294
7295 if (!Args.hasArg(options::OPT_nostdlib) &&
7296 !Args.hasArg(options::OPT_nostartfiles)) {
7297 if (!Args.hasArg(options::OPT_shared)) {
John McCall65b8da02013-04-11 22:55:55 +00007298 if (Args.hasArg(options::OPT_pg))
7299 CmdArgs.push_back(Args.MakeArgString(
7300 getToolChain().GetFilePath("gcrt1.o")));
7301 else {
7302 if (Args.hasArg(options::OPT_pie))
7303 CmdArgs.push_back(Args.MakeArgString(
7304 getToolChain().GetFilePath("Scrt1.o")));
7305 else
7306 CmdArgs.push_back(Args.MakeArgString(
7307 getToolChain().GetFilePath("crt1.o")));
7308 }
Daniel Dunbarcc912342009-05-02 18:28:39 +00007309 }
John McCall65b8da02013-04-11 22:55:55 +00007310 CmdArgs.push_back(Args.MakeArgString(
7311 getToolChain().GetFilePath("crti.o")));
7312 if (Args.hasArg(options::OPT_shared) || Args.hasArg(options::OPT_pie))
7313 CmdArgs.push_back(Args.MakeArgString(
7314 getToolChain().GetFilePath("crtbeginS.o")));
7315 else
7316 CmdArgs.push_back(Args.MakeArgString(
7317 getToolChain().GetFilePath("crtbegin.o")));
Daniel Dunbarcc912342009-05-02 18:28:39 +00007318 }
7319
7320 Args.AddAllArgs(CmdArgs, options::OPT_L);
7321 Args.AddAllArgs(CmdArgs, options::OPT_T_Group);
7322 Args.AddAllArgs(CmdArgs, options::OPT_e);
7323
Daniel Dunbar54423b22010-09-17 00:24:54 +00007324 AddLinkerInputs(getToolChain(), Inputs, Args, CmdArgs);
Daniel Dunbarcc912342009-05-02 18:28:39 +00007325
7326 if (!Args.hasArg(options::OPT_nostdlib) &&
7327 !Args.hasArg(options::OPT_nodefaultlibs)) {
7328 // FIXME: GCC passes on -lgcc, -lgcc_pic and a whole lot of
7329 // rpaths
John McCall65b8da02013-04-11 22:55:55 +00007330 if (UseGCC47)
7331 CmdArgs.push_back("-L/usr/lib/gcc47");
7332 else
7333 CmdArgs.push_back("-L/usr/lib/gcc44");
Daniel Dunbarcc912342009-05-02 18:28:39 +00007334
7335 if (!Args.hasArg(options::OPT_static)) {
John McCall65b8da02013-04-11 22:55:55 +00007336 if (UseGCC47) {
7337 CmdArgs.push_back("-rpath");
7338 CmdArgs.push_back("/usr/lib/gcc47");
7339 } else {
7340 CmdArgs.push_back("-rpath");
7341 CmdArgs.push_back("/usr/lib/gcc44");
7342 }
Daniel Dunbarcc912342009-05-02 18:28:39 +00007343 }
7344
Hans Wennborg70850d82013-07-18 20:29:38 +00007345 if (D.CCCIsCXX()) {
Daniel Dunbar3f7796f2010-09-17 01:20:05 +00007346 getToolChain().AddCXXStdlibLibArgs(Args, CmdArgs);
Rafael Espindola38360b32010-07-20 12:59:03 +00007347 CmdArgs.push_back("-lm");
7348 }
7349
Daniel Dunbarcc912342009-05-02 18:28:39 +00007350 if (Args.hasArg(options::OPT_pthread))
Mike Stump0a65b632009-10-31 20:11:46 +00007351 CmdArgs.push_back("-lpthread");
Daniel Dunbarcc912342009-05-02 18:28:39 +00007352
7353 if (!Args.hasArg(options::OPT_nolibc)) {
7354 CmdArgs.push_back("-lc");
7355 }
7356
John McCall65b8da02013-04-11 22:55:55 +00007357 if (UseGCC47) {
7358 if (Args.hasArg(options::OPT_static) ||
7359 Args.hasArg(options::OPT_static_libgcc)) {
7360 CmdArgs.push_back("-lgcc");
7361 CmdArgs.push_back("-lgcc_eh");
7362 } else {
7363 if (Args.hasArg(options::OPT_shared_libgcc)) {
7364 CmdArgs.push_back("-lgcc_pic");
7365 if (!Args.hasArg(options::OPT_shared))
7366 CmdArgs.push_back("-lgcc");
7367 } else {
7368 CmdArgs.push_back("-lgcc");
7369 CmdArgs.push_back("--as-needed");
7370 CmdArgs.push_back("-lgcc_pic");
7371 CmdArgs.push_back("--no-as-needed");
7372 }
7373 }
Daniel Dunbarcc912342009-05-02 18:28:39 +00007374 } else {
John McCall65b8da02013-04-11 22:55:55 +00007375 if (Args.hasArg(options::OPT_shared)) {
7376 CmdArgs.push_back("-lgcc_pic");
7377 } else {
7378 CmdArgs.push_back("-lgcc");
7379 }
Daniel Dunbarcc912342009-05-02 18:28:39 +00007380 }
7381 }
7382
7383 if (!Args.hasArg(options::OPT_nostdlib) &&
7384 !Args.hasArg(options::OPT_nostartfiles)) {
John McCall65b8da02013-04-11 22:55:55 +00007385 if (Args.hasArg(options::OPT_shared) || Args.hasArg(options::OPT_pie))
Chris Lattner3e2ee142010-07-07 16:01:42 +00007386 CmdArgs.push_back(Args.MakeArgString(
Daniel Dunbar9c3ed5f2010-07-14 18:46:23 +00007387 getToolChain().GetFilePath("crtendS.o")));
John McCall65b8da02013-04-11 22:55:55 +00007388 else
7389 CmdArgs.push_back(Args.MakeArgString(
7390 getToolChain().GetFilePath("crtend.o")));
Chris Lattner3e2ee142010-07-07 16:01:42 +00007391 CmdArgs.push_back(Args.MakeArgString(
John McCall65b8da02013-04-11 22:55:55 +00007392 getToolChain().GetFilePath("crtn.o")));
Daniel Dunbarcc912342009-05-02 18:28:39 +00007393 }
7394
Alexey Samsonov7811d192014-02-20 13:57:37 +00007395 addProfileRT(getToolChain(), Args, CmdArgs);
Nick Lewycky82fe5f42011-05-24 21:54:59 +00007396
Daniel Dunbarcc912342009-05-02 18:28:39 +00007397 const char *Exec =
Rafael Espindola236db462013-11-09 20:07:19 +00007398 Args.MakeArgString(getToolChain().GetProgramPath("ld"));
Daniel Dunbar7fbaf532010-08-02 02:38:28 +00007399 C.addCommand(new Command(JA, *this, Exec, CmdArgs));
Daniel Dunbarcc912342009-05-02 18:28:39 +00007400}
Michael J. Spencerb186bc32010-08-21 21:55:07 +00007401
7402void visualstudio::Link::ConstructJob(Compilation &C, const JobAction &JA,
7403 const InputInfo &Output,
7404 const InputInfoList &Inputs,
7405 const ArgList &Args,
7406 const char *LinkingOutput) const {
Michael J. Spencerb186bc32010-08-21 21:55:07 +00007407 ArgStringList CmdArgs;
7408
7409 if (Output.isFilename()) {
Daniel Dunbar2cc3f172010-09-17 00:45:02 +00007410 CmdArgs.push_back(Args.MakeArgString(std::string("-out:") +
7411 Output.getFilename()));
Michael J. Spencerb186bc32010-08-21 21:55:07 +00007412 } else {
7413 assert(Output.isNothing() && "Invalid output.");
7414 }
7415
7416 if (!Args.hasArg(options::OPT_nostdlib) &&
Hans Wennborg32e3b722013-08-09 17:38:42 +00007417 !Args.hasArg(options::OPT_nostartfiles) &&
7418 !C.getDriver().IsCLMode()) {
Michael J. Spencerb186bc32010-08-21 21:55:07 +00007419 CmdArgs.push_back("-defaultlib:libcmt");
7420 }
7421
7422 CmdArgs.push_back("-nologo");
7423
Hans Wennborgf1a74252013-09-10 20:18:04 +00007424 bool DLL = Args.hasArg(options::OPT__SLASH_LD, options::OPT__SLASH_LDd);
7425
7426 if (DLL) {
7427 CmdArgs.push_back(Args.MakeArgString("-dll"));
7428
7429 SmallString<128> ImplibName(Output.getFilename());
7430 llvm::sys::path::replace_extension(ImplibName, "lib");
7431 CmdArgs.push_back(Args.MakeArgString(std::string("-implib:") +
7432 ImplibName.str()));
7433 }
7434
Peter Collingbourne32701642013-11-01 18:16:25 +00007435 if (getToolChain().getSanitizerArgs().needsAsanRt()) {
Hans Wennborg0517e752013-08-28 17:36:07 +00007436 CmdArgs.push_back(Args.MakeArgString("-debug"));
Hans Wennborgd024c1c2013-08-30 10:50:52 +00007437 CmdArgs.push_back(Args.MakeArgString("-incremental:no"));
Hans Wennborg65f17522013-08-27 18:10:21 +00007438 SmallString<128> LibSanitizer(getToolChain().getDriver().ResourceDir);
Hans Wennborgf1a74252013-09-10 20:18:04 +00007439 llvm::sys::path::append(LibSanitizer, "lib", "windows");
7440 if (DLL) {
Timur Iskhodzhanov3b6adcb62013-09-11 11:45:31 +00007441 llvm::sys::path::append(LibSanitizer, "clang_rt.asan_dll_thunk-i386.lib");
Hans Wennborgf1a74252013-09-10 20:18:04 +00007442 } else {
7443 llvm::sys::path::append(LibSanitizer, "clang_rt.asan-i386.lib");
7444 }
7445 // FIXME: Handle 64-bit.
Hans Wennborg65f17522013-08-27 18:10:21 +00007446 CmdArgs.push_back(Args.MakeArgString(LibSanitizer));
7447 }
7448
Michael J. Spencere2f49362012-06-18 16:56:04 +00007449 Args.AddAllArgValues(CmdArgs, options::OPT_l);
Hans Wennborg2e274592013-08-13 23:38:57 +00007450 Args.AddAllArgValues(CmdArgs, options::OPT__SLASH_link);
Michael J. Spencere2f49362012-06-18 16:56:04 +00007451
7452 // Add filenames immediately.
7453 for (InputInfoList::const_iterator
7454 it = Inputs.begin(), ie = Inputs.end(); it != ie; ++it) {
7455 if (it->isFilename())
7456 CmdArgs.push_back(it->getFilename());
Hans Wennborgbe4a6762013-08-14 01:24:35 +00007457 else
7458 it->getInputArg().renderAsInput(Args, CmdArgs);
Michael J. Spencere2f49362012-06-18 16:56:04 +00007459 }
Michael J. Spencerb186bc32010-08-21 21:55:07 +00007460
7461 const char *Exec =
Daniel Dunbar54423b22010-09-17 00:24:54 +00007462 Args.MakeArgString(getToolChain().GetProgramPath("link.exe"));
Michael J. Spencerb186bc32010-08-21 21:55:07 +00007463 C.addCommand(new Command(JA, *this, Exec, CmdArgs));
7464}
Hans Wennborg87cfa712013-09-19 20:32:16 +00007465
7466void visualstudio::Compile::ConstructJob(Compilation &C, const JobAction &JA,
7467 const InputInfo &Output,
7468 const InputInfoList &Inputs,
7469 const ArgList &Args,
7470 const char *LinkingOutput) const {
7471 C.addCommand(GetCommand(C, JA, Output, Inputs, Args, LinkingOutput));
7472}
7473
Hans Wennborg188382e2013-09-20 18:16:35 +00007474// Try to find FallbackName on PATH that is not identical to ClangProgramPath.
7475// If one cannot be found, return FallbackName.
7476// We do this special search to prevent clang-cl from falling back onto itself
7477// if it's available as cl.exe on the path.
7478static std::string FindFallback(const char *FallbackName,
7479 const char *ClangProgramPath) {
7480 llvm::Optional<std::string> OptPath = llvm::sys::Process::GetEnv("PATH");
7481 if (!OptPath.hasValue())
7482 return FallbackName;
7483
7484#ifdef LLVM_ON_WIN32
7485 const StringRef PathSeparators = ";";
7486#else
7487 const StringRef PathSeparators = ":";
7488#endif
7489
7490 SmallVector<StringRef, 8> PathSegments;
7491 llvm::SplitString(OptPath.getValue(), PathSegments, PathSeparators);
7492
7493 for (size_t i = 0, e = PathSegments.size(); i != e; ++i) {
7494 const StringRef &PathSegment = PathSegments[i];
7495 if (PathSegment.empty())
7496 continue;
7497
7498 SmallString<128> FilePath(PathSegment);
7499 llvm::sys::path::append(FilePath, FallbackName);
7500 if (llvm::sys::fs::can_execute(Twine(FilePath)) &&
7501 !llvm::sys::fs::equivalent(Twine(FilePath), ClangProgramPath))
7502 return FilePath.str();
7503 }
7504
7505 return FallbackName;
7506}
7507
Hans Wennborg87cfa712013-09-19 20:32:16 +00007508Command *visualstudio::Compile::GetCommand(Compilation &C, const JobAction &JA,
7509 const InputInfo &Output,
7510 const InputInfoList &Inputs,
7511 const ArgList &Args,
7512 const char *LinkingOutput) const {
7513 ArgStringList CmdArgs;
Hans Wennborg263c2132013-09-24 17:36:21 +00007514 CmdArgs.push_back("/nologo");
Hans Wennborg87cfa712013-09-19 20:32:16 +00007515 CmdArgs.push_back("/c"); // Compile only.
7516 CmdArgs.push_back("/W0"); // No warnings.
7517
7518 // The goal is to be able to invoke this tool correctly based on
7519 // any flag accepted by clang-cl.
7520
7521 // These are spelled the same way in clang and cl.exe,.
7522 Args.AddAllArgs(CmdArgs, options::OPT_D, options::OPT_U);
7523 Args.AddAllArgs(CmdArgs, options::OPT_I);
Hans Wennborgb6331dc2013-09-24 18:17:21 +00007524
7525 // Optimization level.
7526 if (Arg *A = Args.getLastArg(options::OPT_O, options::OPT_O0)) {
7527 if (A->getOption().getID() == options::OPT_O0) {
7528 CmdArgs.push_back("/Od");
7529 } else {
7530 StringRef OptLevel = A->getValue();
7531 if (OptLevel == "1" || OptLevel == "2" || OptLevel == "s")
7532 A->render(Args, CmdArgs);
7533 else if (OptLevel == "3")
7534 CmdArgs.push_back("/Ox");
7535 }
7536 }
Hans Wennborg87cfa712013-09-19 20:32:16 +00007537
7538 // Flags for which clang-cl have an alias.
7539 // FIXME: How can we ensure this stays in sync with relevant clang-cl options?
7540
7541 if (Arg *A = Args.getLastArg(options::OPT_frtti, options::OPT_fno_rtti))
7542 CmdArgs.push_back(A->getOption().getID() == options::OPT_frtti ? "/GR"
7543 : "/GR-");
Hans Wennborg5149a3b2014-03-25 14:48:54 +00007544 if (Arg *A = Args.getLastArg(options::OPT_ffunction_sections,
7545 options::OPT_fno_function_sections))
7546 CmdArgs.push_back(A->getOption().getID() == options::OPT_ffunction_sections
7547 ? "/Gy"
7548 : "/Gy-");
David Majnemerdc7a47c2014-04-07 16:14:38 +00007549 if (Arg *A = Args.getLastArg(options::OPT_fdata_sections,
7550 options::OPT_fno_data_sections))
David Majnemer6c684a72014-04-07 16:19:27 +00007551 CmdArgs.push_back(
7552 A->getOption().getID() == options::OPT_fdata_sections ? "/Gw" : "/Gw-");
Hans Wennborg87cfa712013-09-19 20:32:16 +00007553 if (Args.hasArg(options::OPT_fsyntax_only))
7554 CmdArgs.push_back("/Zs");
Reid Klecknerc688daf2014-02-19 22:05:59 +00007555 if (Args.hasArg(options::OPT_g_Flag, options::OPT_gline_tables_only))
7556 CmdArgs.push_back("/Z7");
Hans Wennborg87cfa712013-09-19 20:32:16 +00007557
Hans Wennborg260ff402013-09-27 17:54:18 +00007558 std::vector<std::string> Includes = Args.getAllArgValues(options::OPT_include);
7559 for (size_t I = 0, E = Includes.size(); I != E; ++I)
7560 CmdArgs.push_back(Args.MakeArgString(std::string("/FI") + Includes[I]));
7561
Hans Wennborg87cfa712013-09-19 20:32:16 +00007562 // Flags that can simply be passed through.
7563 Args.AddAllArgs(CmdArgs, options::OPT__SLASH_LD);
7564 Args.AddAllArgs(CmdArgs, options::OPT__SLASH_LDd);
7565
7566 // The order of these flags is relevant, so pick the last one.
7567 if (Arg *A = Args.getLastArg(options::OPT__SLASH_MD, options::OPT__SLASH_MDd,
7568 options::OPT__SLASH_MT, options::OPT__SLASH_MTd))
7569 A->render(Args, CmdArgs);
7570
7571
7572 // Input filename.
7573 assert(Inputs.size() == 1);
7574 const InputInfo &II = Inputs[0];
7575 assert(II.getType() == types::TY_C || II.getType() == types::TY_CXX);
7576 CmdArgs.push_back(II.getType() == types::TY_C ? "/Tc" : "/Tp");
7577 if (II.isFilename())
7578 CmdArgs.push_back(II.getFilename());
7579 else
7580 II.getInputArg().renderAsInput(Args, CmdArgs);
7581
7582 // Output filename.
7583 assert(Output.getType() == types::TY_Object);
7584 const char *Fo = Args.MakeArgString(std::string("/Fo") +
7585 Output.getFilename());
7586 CmdArgs.push_back(Fo);
7587
Hans Wennborg188382e2013-09-20 18:16:35 +00007588 const Driver &D = getToolChain().getDriver();
7589 std::string Exec = FindFallback("cl.exe", D.getClangProgramPath());
Hans Wennborg87cfa712013-09-19 20:32:16 +00007590
Hans Wennborg188382e2013-09-20 18:16:35 +00007591 return new Command(JA, *this, Args.MakeArgString(Exec), CmdArgs);
Hans Wennborg87cfa712013-09-19 20:32:16 +00007592}
Robert Lyttoncf1dd692013-10-11 10:29:40 +00007593
7594
7595/// XCore Tools
7596// We pass assemble and link construction to the xcc tool.
7597
7598void XCore::Assemble::ConstructJob(Compilation &C, const JobAction &JA,
7599 const InputInfo &Output,
7600 const InputInfoList &Inputs,
7601 const ArgList &Args,
7602 const char *LinkingOutput) const {
7603 ArgStringList CmdArgs;
7604
7605 CmdArgs.push_back("-o");
7606 CmdArgs.push_back(Output.getFilename());
7607
7608 CmdArgs.push_back("-c");
7609
Robert Lytton9e8c1a42014-02-13 10:40:12 +00007610 if (Args.hasArg(options::OPT_v))
7611 CmdArgs.push_back("-v");
7612
7613 if (Args.hasArg(options::OPT_g_Group))
Robert Lyttoncf1dd692013-10-11 10:29:40 +00007614 CmdArgs.push_back("-g");
Robert Lytton9e8c1a42014-02-13 10:40:12 +00007615
Robert Lytton8e95d4e2014-02-11 10:34:45 +00007616 if (Args.hasFlag(options::OPT_fverbose_asm, options::OPT_fno_verbose_asm,
7617 false))
7618 CmdArgs.push_back("-fverbose-asm");
Robert Lyttoncf1dd692013-10-11 10:29:40 +00007619
7620 Args.AddAllArgValues(CmdArgs, options::OPT_Wa_COMMA,
7621 options::OPT_Xassembler);
7622
7623 for (InputInfoList::const_iterator
7624 it = Inputs.begin(), ie = Inputs.end(); it != ie; ++it) {
7625 const InputInfo &II = *it;
7626 CmdArgs.push_back(II.getFilename());
7627 }
7628
7629 const char *Exec =
7630 Args.MakeArgString(getToolChain().GetProgramPath("xcc"));
7631 C.addCommand(new Command(JA, *this, Exec, CmdArgs));
7632}
7633
7634void XCore::Link::ConstructJob(Compilation &C, const JobAction &JA,
7635 const InputInfo &Output,
7636 const InputInfoList &Inputs,
7637 const ArgList &Args,
7638 const char *LinkingOutput) const {
7639 ArgStringList CmdArgs;
7640
7641 if (Output.isFilename()) {
7642 CmdArgs.push_back("-o");
7643 CmdArgs.push_back(Output.getFilename());
7644 } else {
7645 assert(Output.isNothing() && "Invalid output.");
7646 }
7647
Robert Lytton9e8c1a42014-02-13 10:40:12 +00007648 if (Args.hasArg(options::OPT_v))
7649 CmdArgs.push_back("-v");
7650
Robert Lyttonf7e03c12014-02-13 10:34:44 +00007651 ExceptionSettings EH = exceptionSettings(Args, getToolChain().getTriple());
7652 if (EH.ShouldUseExceptionTables)
7653 CmdArgs.push_back("-fexceptions");
7654
Robert Lyttoncf1dd692013-10-11 10:29:40 +00007655 AddLinkerInputs(getToolChain(), Inputs, Args, CmdArgs);
7656
7657 const char *Exec =
7658 Args.MakeArgString(getToolChain().GetProgramPath("xcc"));
7659 C.addCommand(new Command(JA, *this, Exec, CmdArgs));
7660}