blob: f354d7c40700c65b1a129e2a5d67da21951c8ee1 [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"
Chandler Carruth3a022472012-12-04 09:13:33 +000032#include "llvm/Support/ErrorHandling.h"
Michael J. Spencerf6efe582011-01-10 02:34:13 +000033#include "llvm/Support/FileSystem.h"
Daniel Dunbarc1964212009-03-26 16:23:12 +000034#include "llvm/Support/Format.h"
Michael J. Spencer8aaf4992010-11-29 18:12:39 +000035#include "llvm/Support/Host.h"
Hans Wennborg188382e2013-09-20 18:16:35 +000036#include "llvm/Support/Path.h"
Michael J. Spencer8aaf4992010-11-29 18:12:39 +000037#include "llvm/Support/Process.h"
Chandler Carruth5553d0d2014-01-07 11:51:46 +000038#include "llvm/Support/Program.h"
Chandler Carruth3a022472012-12-04 09:13:33 +000039#include "llvm/Support/raw_ostream.h"
Reid Kleckner898229a2013-06-14 17:17:23 +000040#include <sys/stat.h>
Daniel Dunbar04c4c2c2009-03-18 07:06:02 +000041
Daniel Dunbar1a093d22009-03-18 06:00:36 +000042using namespace clang::driver;
43using namespace clang::driver::tools;
Chris Lattner0e62c1c2011-07-23 10:55:15 +000044using namespace clang;
Reid Kleckner898229a2013-06-14 17:17:23 +000045using namespace llvm::opt;
Daniel Dunbar1a093d22009-03-18 06:00:36 +000046
Joerg Sonnenbergerc151b022014-02-19 21:58:52 +000047static void addAssemblerKPIC(const ArgList &Args, ArgStringList &CmdArgs) {
48 Arg *LastPICArg = Args.getLastArg(options::OPT_fPIC, options::OPT_fno_PIC,
49 options::OPT_fpic, options::OPT_fno_pic,
50 options::OPT_fPIE, options::OPT_fno_PIE,
51 options::OPT_fpie, options::OPT_fno_pie);
52 if (!LastPICArg)
53 return;
54 if (LastPICArg->getOption().matches(options::OPT_fPIC) ||
55 LastPICArg->getOption().matches(options::OPT_fpic) ||
56 LastPICArg->getOption().matches(options::OPT_fPIE) ||
57 LastPICArg->getOption().matches(options::OPT_fpie)) {
58 CmdArgs.push_back("-KPIC");
59 }
60}
61
Daniel Dunbar64198ef2009-09-10 01:21:05 +000062/// CheckPreprocessingOptions - Perform some validation of preprocessing
63/// arguments that is shared with gcc.
64static void CheckPreprocessingOptions(const Driver &D, const ArgList &Args) {
65 if (Arg *A = Args.getLastArg(options::OPT_C, options::OPT_CC))
Hans Wennborg70850d82013-07-18 20:29:38 +000066 if (!Args.hasArg(options::OPT_E) && !D.CCCIsCPP())
Chris Lattner0e62c1c2011-07-23 10:55:15 +000067 D.Diag(diag::err_drv_argument_only_allowed_with)
Daniel Dunbar64198ef2009-09-10 01:21:05 +000068 << A->getAsString(Args) << "-E";
69}
70
Daniel Dunbar4eadb602009-09-10 01:21:12 +000071/// CheckCodeGenerationOptions - Perform some validation of code generation
72/// arguments that is shared with gcc.
73static void CheckCodeGenerationOptions(const Driver &D, const ArgList &Args) {
74 // In gcc, only ARM checks this, but it seems reasonable to check universally.
75 if (Args.hasArg(options::OPT_static))
76 if (const Arg *A = Args.getLastArg(options::OPT_dynamic,
77 options::OPT_mdynamic_no_pic))
Chris Lattner0e62c1c2011-07-23 10:55:15 +000078 D.Diag(diag::err_drv_argument_not_allowed_with)
Daniel Dunbar4eadb602009-09-10 01:21:12 +000079 << A->getAsString(Args) << "-static";
80}
81
Chris Lattnerbf2803f2010-03-29 17:55:58 +000082// Quote target names for inclusion in GNU Make dependency files.
83// Only the characters '$', '#', ' ', '\t' are quoted.
Chris Lattner0e62c1c2011-07-23 10:55:15 +000084static void QuoteTarget(StringRef Target,
85 SmallVectorImpl<char> &Res) {
Chris Lattnerbf2803f2010-03-29 17:55:58 +000086 for (unsigned i = 0, e = Target.size(); i != e; ++i) {
87 switch (Target[i]) {
88 case ' ':
89 case '\t':
90 // Escape the preceding backslashes
91 for (int j = i - 1; j >= 0 && Target[j] == '\\'; --j)
92 Res.push_back('\\');
93
94 // Escape the space/tab
95 Res.push_back('\\');
96 break;
97 case '$':
98 Res.push_back('$');
99 break;
100 case '#':
101 Res.push_back('\\');
102 break;
103 default:
104 break;
105 }
106
107 Res.push_back(Target[i]);
108 }
109}
110
Bill Wendlingc0938f32012-03-12 22:10:06 +0000111static void addDirectoryList(const ArgList &Args,
Bill Wendling281ca292012-03-12 21:22:35 +0000112 ArgStringList &CmdArgs,
113 const char *ArgName,
Bill Wendlingc0938f32012-03-12 22:10:06 +0000114 const char *EnvVar) {
115 const char *DirList = ::getenv(EnvVar);
Chad Rosier616e8a52012-10-30 21:42:09 +0000116 bool CombinedArg = false;
117
Bill Wendling281ca292012-03-12 21:22:35 +0000118 if (!DirList)
119 return; // Nothing to do.
120
Chad Rosier616e8a52012-10-30 21:42:09 +0000121 StringRef Name(ArgName);
122 if (Name.equals("-I") || Name.equals("-L"))
123 CombinedArg = true;
124
Bill Wendling281ca292012-03-12 21:22:35 +0000125 StringRef Dirs(DirList);
126 if (Dirs.empty()) // Empty string should not add '.'.
127 return;
128
129 StringRef::size_type Delim;
Rafael Espindola04b3fc42013-06-25 14:29:51 +0000130 while ((Delim = Dirs.find(llvm::sys::EnvPathSeparator)) != StringRef::npos) {
Bill Wendling281ca292012-03-12 21:22:35 +0000131 if (Delim == 0) { // Leading colon.
Chad Rosier616e8a52012-10-30 21:42:09 +0000132 if (CombinedArg) {
133 CmdArgs.push_back(Args.MakeArgString(std::string(ArgName) + "."));
134 } else {
135 CmdArgs.push_back(ArgName);
136 CmdArgs.push_back(".");
137 }
Bill Wendling281ca292012-03-12 21:22:35 +0000138 } else {
Chad Rosier616e8a52012-10-30 21:42:09 +0000139 if (CombinedArg) {
140 CmdArgs.push_back(Args.MakeArgString(std::string(ArgName) + Dirs.substr(0, Delim)));
141 } else {
142 CmdArgs.push_back(ArgName);
143 CmdArgs.push_back(Args.MakeArgString(Dirs.substr(0, Delim)));
144 }
Bill Wendling281ca292012-03-12 21:22:35 +0000145 }
Nico Weber89355782012-03-19 15:00:03 +0000146 Dirs = Dirs.substr(Delim + 1);
Bill Wendling281ca292012-03-12 21:22:35 +0000147 }
148
149 if (Dirs.empty()) { // Trailing colon.
Chad Rosier616e8a52012-10-30 21:42:09 +0000150 if (CombinedArg) {
151 CmdArgs.push_back(Args.MakeArgString(std::string(ArgName) + "."));
152 } else {
153 CmdArgs.push_back(ArgName);
154 CmdArgs.push_back(".");
155 }
Bill Wendling281ca292012-03-12 21:22:35 +0000156 } else { // Add the last path.
Chad Rosier616e8a52012-10-30 21:42:09 +0000157 if (CombinedArg) {
158 CmdArgs.push_back(Args.MakeArgString(std::string(ArgName) + Dirs));
159 } else {
160 CmdArgs.push_back(ArgName);
161 CmdArgs.push_back(Args.MakeArgString(Dirs));
162 }
Bill Wendling281ca292012-03-12 21:22:35 +0000163 }
164}
165
Daniel Dunbar54423b22010-09-17 00:24:54 +0000166static void AddLinkerInputs(const ToolChain &TC,
167 const InputInfoList &Inputs, const ArgList &Args,
168 ArgStringList &CmdArgs) {
169 const Driver &D = TC.getDriver();
170
Daniel Dunbar1094bb12011-02-19 05:33:51 +0000171 // Add extra linker input arguments which are not treated as inputs
172 // (constructed via -Xarch_).
173 Args.AddAllArgValues(CmdArgs, options::OPT_Zlinker_input);
174
Daniel Dunbar54423b22010-09-17 00:24:54 +0000175 for (InputInfoList::const_iterator
176 it = Inputs.begin(), ie = Inputs.end(); it != ie; ++it) {
177 const InputInfo &II = *it;
178
179 if (!TC.HasNativeLLVMSupport()) {
180 // Don't try to pass LLVM inputs unless we have native support.
181 if (II.getType() == types::TY_LLVM_IR ||
182 II.getType() == types::TY_LTO_IR ||
183 II.getType() == types::TY_LLVM_BC ||
184 II.getType() == types::TY_LTO_BC)
Chris Lattner0e62c1c2011-07-23 10:55:15 +0000185 D.Diag(diag::err_drv_no_linker_llvm_support)
Daniel Dunbar54423b22010-09-17 00:24:54 +0000186 << TC.getTripleString();
187 }
188
Daniel Dunbar2cc3f172010-09-17 00:45:02 +0000189 // Add filenames immediately.
190 if (II.isFilename()) {
Daniel Dunbar54423b22010-09-17 00:24:54 +0000191 CmdArgs.push_back(II.getFilename());
Daniel Dunbar2cc3f172010-09-17 00:45:02 +0000192 continue;
193 }
194
195 // Otherwise, this is a linker input argument.
196 const Arg &A = II.getInputArg();
197
198 // Handle reserved library options.
199 if (A.getOption().matches(options::OPT_Z_reserved_lib_stdcxx)) {
Daniel Dunbar3f7796f2010-09-17 01:20:05 +0000200 TC.AddCXXStdlibLibArgs(Args, CmdArgs);
Shantonu Senafeb03b2010-09-17 18:39:08 +0000201 } else if (A.getOption().matches(options::OPT_Z_reserved_lib_cckext)) {
202 TC.AddCCKextLibArgs(Args, CmdArgs);
Daniel Dunbar2cc3f172010-09-17 00:45:02 +0000203 } else
204 A.renderAsInput(Args, CmdArgs);
Daniel Dunbar54423b22010-09-17 00:24:54 +0000205 }
Bill Wendling281ca292012-03-12 21:22:35 +0000206
207 // LIBRARY_PATH - included following the user specified library paths.
Richard Barton5828d7b2013-12-17 11:11:25 +0000208 // and only supported on native toolchains.
209 if (!TC.isCrossCompiling())
210 addDirectoryList(Args, CmdArgs, "-L", "LIBRARY_PATH");
Daniel Dunbar54423b22010-09-17 00:24:54 +0000211}
212
John McCall31168b02011-06-15 23:02:42 +0000213/// \brief Determine whether Objective-C automated reference counting is
214/// enabled.
215static bool isObjCAutoRefCount(const ArgList &Args) {
216 return Args.hasFlag(options::OPT_fobjc_arc, options::OPT_fno_objc_arc, false);
217}
218
Ted Kremeneke65b0862012-03-06 20:05:56 +0000219/// \brief Determine whether we are linking the ObjC runtime.
220static bool isObjCRuntimeLinked(const ArgList &Args) {
Bob Wilson29536fc2012-08-07 19:58:00 +0000221 if (isObjCAutoRefCount(Args)) {
222 Args.ClaimAllArgs(options::OPT_fobjc_link_runtime);
Ted Kremeneke65b0862012-03-06 20:05:56 +0000223 return true;
Bob Wilson29536fc2012-08-07 19:58:00 +0000224 }
Ted Kremeneke65b0862012-03-06 20:05:56 +0000225 return Args.hasArg(options::OPT_fobjc_link_runtime);
226}
227
Michael J. Spencer66e2b202012-10-19 22:37:06 +0000228static bool forwardToGCC(const Option &O) {
Reid Kleckner3793d5e2013-06-19 15:09:06 +0000229 // Don't forward inputs from the original command line. They are added from
230 // InputInfoList.
Richard Smith8e5e9762013-06-20 01:33:59 +0000231 return O.getKind() != Option::InputClass &&
Michael J. Spencer66e2b202012-10-19 22:37:06 +0000232 !O.hasFlag(options::DriverOption) &&
233 !O.hasFlag(options::LinkerInput);
234}
235
Peter Collingbourne9b515cb2011-11-06 00:40:05 +0000236void Clang::AddPreprocessingOptions(Compilation &C,
Chad Rosier633dcdc2013-01-24 19:14:47 +0000237 const JobAction &JA,
Peter Collingbourne9b515cb2011-11-06 00:40:05 +0000238 const Driver &D,
Douglas Gregor111af7d2009-04-18 00:34:01 +0000239 const ArgList &Args,
Daniel Dunbard067f7f2009-04-08 23:54:23 +0000240 ArgStringList &CmdArgs,
241 const InputInfo &Output,
242 const InputInfoList &Inputs) const {
Daniel Dunbard067f7f2009-04-08 23:54:23 +0000243 Arg *A;
Daniel Dunbar367dbb92009-06-08 21:48:20 +0000244
Daniel Dunbar64198ef2009-09-10 01:21:05 +0000245 CheckPreprocessingOptions(D, Args);
246
247 Args.AddLastArg(CmdArgs, options::OPT_C);
248 Args.AddLastArg(CmdArgs, options::OPT_CC);
Daniel Dunbar367dbb92009-06-08 21:48:20 +0000249
250 // Handle dependency file generation.
Daniel Dunbar86aed7d2010-12-08 21:33:40 +0000251 if ((A = Args.getLastArg(options::OPT_M, options::OPT_MM)) ||
Daniel Dunbard067f7f2009-04-08 23:54:23 +0000252 (A = Args.getLastArg(options::OPT_MD)) ||
253 (A = Args.getLastArg(options::OPT_MMD))) {
254 // Determine the output location.
255 const char *DepFile;
Benjamin Kramer2715fce2012-09-26 19:01:49 +0000256 if (Arg *MF = Args.getLastArg(options::OPT_MF)) {
Richard Smithbd55daf2012-11-01 04:30:05 +0000257 DepFile = MF->getValue();
Chad Rosier633dcdc2013-01-24 19:14:47 +0000258 C.addFailureResultFile(DepFile, &JA);
Benjamin Kramer2715fce2012-09-26 19:01:49 +0000259 } else if (Output.getType() == types::TY_Dependencies) {
260 DepFile = Output.getFilename();
Daniel Dunbar0bfb21e2009-11-19 03:26:40 +0000261 } else if (A->getOption().matches(options::OPT_M) ||
262 A->getOption().matches(options::OPT_MM)) {
Daniel Dunbard067f7f2009-04-08 23:54:23 +0000263 DepFile = "-";
264 } else {
Bob Wilsondecc03e2012-11-23 06:14:39 +0000265 DepFile = getDependencyFileName(Args, Inputs);
Chad Rosier633dcdc2013-01-24 19:14:47 +0000266 C.addFailureResultFile(DepFile, &JA);
Daniel Dunbard067f7f2009-04-08 23:54:23 +0000267 }
268 CmdArgs.push_back("-dependency-file");
269 CmdArgs.push_back(DepFile);
270
Chris Lattnerbf2803f2010-03-29 17:55:58 +0000271 // Add a default target if one wasn't specified.
Daniel Dunbard067f7f2009-04-08 23:54:23 +0000272 if (!Args.hasArg(options::OPT_MT) && !Args.hasArg(options::OPT_MQ)) {
273 const char *DepTarget;
274
275 // If user provided -o, that is the dependency target, except
276 // when we are only generating a dependency file.
277 Arg *OutputOpt = Args.getLastArg(options::OPT_o);
278 if (OutputOpt && Output.getType() != types::TY_Dependencies) {
Richard Smithbd55daf2012-11-01 04:30:05 +0000279 DepTarget = OutputOpt->getValue();
Daniel Dunbard067f7f2009-04-08 23:54:23 +0000280 } else {
281 // Otherwise derive from the base input.
282 //
283 // FIXME: This should use the computed output file location.
Dylan Noblesmith2c1dd272012-02-05 02:13:05 +0000284 SmallString<128> P(Inputs[0].getBaseInput());
Michael J. Spencere1696752010-12-18 00:19:12 +0000285 llvm::sys::path::replace_extension(P, "o");
286 DepTarget = Args.MakeArgString(llvm::sys::path::filename(P));
Daniel Dunbard067f7f2009-04-08 23:54:23 +0000287 }
288
289 CmdArgs.push_back("-MT");
Dylan Noblesmith2c1dd272012-02-05 02:13:05 +0000290 SmallString<128> Quoted;
Chris Lattnerbf2803f2010-03-29 17:55:58 +0000291 QuoteTarget(DepTarget, Quoted);
292 CmdArgs.push_back(Args.MakeArgString(Quoted));
Daniel Dunbard067f7f2009-04-08 23:54:23 +0000293 }
294
Daniel Dunbar0bfb21e2009-11-19 03:26:40 +0000295 if (A->getOption().matches(options::OPT_M) ||
296 A->getOption().matches(options::OPT_MD))
Daniel Dunbard067f7f2009-04-08 23:54:23 +0000297 CmdArgs.push_back("-sys-header-deps");
Argyrios Kyrtzidis6d0753d2014-03-14 03:07:38 +0000298
299 if (isa<PrecompileJobAction>(JA))
300 CmdArgs.push_back("-module-file-deps");
Daniel Dunbard067f7f2009-04-08 23:54:23 +0000301 }
302
Peter Collingbourne77b0e7f22011-07-12 19:35:15 +0000303 if (Args.hasArg(options::OPT_MG)) {
304 if (!A || A->getOption().matches(options::OPT_MD) ||
305 A->getOption().matches(options::OPT_MMD))
Chris Lattner0e62c1c2011-07-23 10:55:15 +0000306 D.Diag(diag::err_drv_mg_requires_m_or_mm);
Peter Collingbourne77b0e7f22011-07-12 19:35:15 +0000307 CmdArgs.push_back("-MG");
308 }
309
Daniel Dunbard067f7f2009-04-08 23:54:23 +0000310 Args.AddLastArg(CmdArgs, options::OPT_MP);
Chris Lattnerbf2803f2010-03-29 17:55:58 +0000311
312 // Convert all -MQ <target> args to -MT <quoted target>
313 for (arg_iterator it = Args.filtered_begin(options::OPT_MT,
314 options::OPT_MQ),
315 ie = Args.filtered_end(); it != ie; ++it) {
Daniel Dunbara442fd52010-06-11 22:00:13 +0000316 const Arg *A = *it;
317 A->claim();
Chris Lattnerbf2803f2010-03-29 17:55:58 +0000318
Daniel Dunbara442fd52010-06-11 22:00:13 +0000319 if (A->getOption().matches(options::OPT_MQ)) {
Chris Lattnerbf2803f2010-03-29 17:55:58 +0000320 CmdArgs.push_back("-MT");
Dylan Noblesmith2c1dd272012-02-05 02:13:05 +0000321 SmallString<128> Quoted;
Richard Smithbd55daf2012-11-01 04:30:05 +0000322 QuoteTarget(A->getValue(), Quoted);
Chris Lattnerbf2803f2010-03-29 17:55:58 +0000323 CmdArgs.push_back(Args.MakeArgString(Quoted));
324
325 // -MT flag - no change
326 } else {
Daniel Dunbara442fd52010-06-11 22:00:13 +0000327 A->render(Args, CmdArgs);
Chris Lattnerbf2803f2010-03-29 17:55:58 +0000328 }
329 }
Daniel Dunbard067f7f2009-04-08 23:54:23 +0000330
Douglas Gregor111af7d2009-04-18 00:34:01 +0000331 // Add -i* options, and automatically translate to
332 // -include-pch/-include-pth for transparent PCH support. It's
333 // wonky, but we include looking for .gch so we can support seamless
334 // replacement into a build system already set up to be generating
335 // .gch files.
Argyrios Kyrtzidis2f23b412010-09-30 16:53:47 +0000336 bool RenderedImplicitInclude = false;
Daniel Dunbar44b36ee2009-11-25 11:53:23 +0000337 for (arg_iterator it = Args.filtered_begin(options::OPT_clang_i_Group),
338 ie = Args.filtered_end(); it != ie; ++it) {
339 const Arg *A = it;
Daniel Dunbard067f7f2009-04-08 23:54:23 +0000340
341 if (A->getOption().matches(options::OPT_include)) {
Argyrios Kyrtzidis2f23b412010-09-30 16:53:47 +0000342 bool IsFirstImplicitInclude = !RenderedImplicitInclude;
343 RenderedImplicitInclude = true;
344
Argyrios Kyrtzidis90bdfbb2010-08-11 23:27:58 +0000345 // Use PCH if the user requested it.
Daniel Dunbarcbc34b72009-10-15 20:02:44 +0000346 bool UsePCH = D.CCCUsePCH;
Daniel Dunbarcbc34b72009-10-15 20:02:44 +0000347
Daniel Dunbard067f7f2009-04-08 23:54:23 +0000348 bool FoundPTH = false;
Douglas Gregor111af7d2009-04-18 00:34:01 +0000349 bool FoundPCH = false;
Rafael Espindola00eaafd2013-06-25 15:03:59 +0000350 SmallString<128> P(A->getValue());
351 // We want the files to have a name like foo.h.pch. Add a dummy extension
352 // so that replace_extension does the right thing.
353 P += ".dummy";
Daniel Dunbarcbc34b72009-10-15 20:02:44 +0000354 if (UsePCH) {
Rafael Espindola00eaafd2013-06-25 15:03:59 +0000355 llvm::sys::path::replace_extension(P, "pch");
Rafael Espindola54bbaad2013-06-25 14:48:00 +0000356 if (llvm::sys::fs::exists(P.str()))
Douglas Gregor111af7d2009-04-18 00:34:01 +0000357 FoundPCH = true;
Daniel Dunbard067f7f2009-04-08 23:54:23 +0000358 }
359
Douglas Gregor111af7d2009-04-18 00:34:01 +0000360 if (!FoundPCH) {
Rafael Espindola00eaafd2013-06-25 15:03:59 +0000361 llvm::sys::path::replace_extension(P, "pth");
Rafael Espindola54bbaad2013-06-25 14:48:00 +0000362 if (llvm::sys::fs::exists(P.str()))
Douglas Gregor111af7d2009-04-18 00:34:01 +0000363 FoundPTH = true;
Mike Stump11289f42009-09-09 15:08:12 +0000364 }
365
Douglas Gregor111af7d2009-04-18 00:34:01 +0000366 if (!FoundPCH && !FoundPTH) {
Rafael Espindola00eaafd2013-06-25 15:03:59 +0000367 llvm::sys::path::replace_extension(P, "gch");
Rafael Espindola54bbaad2013-06-25 14:48:00 +0000368 if (llvm::sys::fs::exists(P.str())) {
Daniel Dunbarcbc34b72009-10-15 20:02:44 +0000369 FoundPCH = UsePCH;
370 FoundPTH = !UsePCH;
Douglas Gregor111af7d2009-04-18 00:34:01 +0000371 }
Douglas Gregor111af7d2009-04-18 00:34:01 +0000372 }
373
374 if (FoundPCH || FoundPTH) {
Argyrios Kyrtzidis2f23b412010-09-30 16:53:47 +0000375 if (IsFirstImplicitInclude) {
376 A->claim();
377 if (UsePCH)
378 CmdArgs.push_back("-include-pch");
379 else
380 CmdArgs.push_back("-include-pth");
381 CmdArgs.push_back(Args.MakeArgString(P.str()));
382 continue;
383 } else {
384 // Ignore the PCH if not first on command line and emit warning.
Chris Lattner0e62c1c2011-07-23 10:55:15 +0000385 D.Diag(diag::warn_drv_pch_not_first_include)
Argyrios Kyrtzidis2f23b412010-09-30 16:53:47 +0000386 << P.str() << A->getAsString(Args);
387 }
Daniel Dunbard067f7f2009-04-08 23:54:23 +0000388 }
389 }
390
391 // Not translated, render as usual.
392 A->claim();
393 A->render(Args, CmdArgs);
394 }
395
396 Args.AddAllArgs(CmdArgs, options::OPT_D, options::OPT_U);
Douglas Gregor9f93e382011-07-28 04:45:53 +0000397 Args.AddAllArgs(CmdArgs, options::OPT_I_Group, options::OPT_F,
398 options::OPT_index_header_map);
Daniel Dunbard067f7f2009-04-08 23:54:23 +0000399
400 // Add -Wp, and -Xassembler if using the preprocessor.
401
402 // FIXME: There is a very unfortunate problem here, some troubled
403 // souls abuse -Wp, to pass preprocessor options in gcc syntax. To
404 // really support that we would have to parse and then translate
405 // those options. :(
406 Args.AddAllArgValues(CmdArgs, options::OPT_Wp_COMMA,
407 options::OPT_Xpreprocessor);
Daniel Dunbar38b62792009-10-29 01:53:44 +0000408
409 // -I- is a deprecated GCC feature, reject it.
410 if (Arg *A = Args.getLastArg(options::OPT_I_))
Chris Lattner0e62c1c2011-07-23 10:55:15 +0000411 D.Diag(diag::err_drv_I_dash_not_supported) << A->getAsString(Args);
Chandler Carruth24e17e12010-10-20 07:00:47 +0000412
413 // If we have a --sysroot, and don't have an explicit -isysroot flag, add an
414 // -isysroot to the CC1 invocation.
Sebastian Pop980920a2012-04-16 04:16:43 +0000415 StringRef sysroot = C.getSysRoot();
416 if (sysroot != "") {
Chandler Carruth24e17e12010-10-20 07:00:47 +0000417 if (!Args.hasArg(options::OPT_isysroot)) {
418 CmdArgs.push_back("-isysroot");
Sebastian Pop980920a2012-04-16 04:16:43 +0000419 CmdArgs.push_back(C.getArgs().MakeArgString(sysroot));
Chandler Carruth24e17e12010-10-20 07:00:47 +0000420 }
421 }
Douglas Gregor5dc38992013-02-07 00:21:12 +0000422
Benjamin Kramer8404eb02011-09-22 21:41:16 +0000423 // Parse additional include paths from environment variables.
Chandler Carruth9802c142011-11-04 07:12:58 +0000424 // FIXME: We should probably sink the logic for handling these from the
425 // frontend into the driver. It will allow deleting 4 otherwise unused flags.
Benjamin Kramer8404eb02011-09-22 21:41:16 +0000426 // CPATH - included following the user specified includes (but prior to
427 // builtin and standard includes).
Bill Wendlingc0938f32012-03-12 22:10:06 +0000428 addDirectoryList(Args, CmdArgs, "-I", "CPATH");
Benjamin Kramer8404eb02011-09-22 21:41:16 +0000429 // C_INCLUDE_PATH - system includes enabled when compiling C.
Bill Wendlingc0938f32012-03-12 22:10:06 +0000430 addDirectoryList(Args, CmdArgs, "-c-isystem", "C_INCLUDE_PATH");
Benjamin Kramer8404eb02011-09-22 21:41:16 +0000431 // CPLUS_INCLUDE_PATH - system includes enabled when compiling C++.
Bill Wendlingc0938f32012-03-12 22:10:06 +0000432 addDirectoryList(Args, CmdArgs, "-cxx-isystem", "CPLUS_INCLUDE_PATH");
Benjamin Kramer8404eb02011-09-22 21:41:16 +0000433 // OBJC_INCLUDE_PATH - system includes enabled when compiling ObjC.
Bill Wendlingc0938f32012-03-12 22:10:06 +0000434 addDirectoryList(Args, CmdArgs, "-objc-isystem", "OBJC_INCLUDE_PATH");
Benjamin Kramer8404eb02011-09-22 21:41:16 +0000435 // OBJCPLUS_INCLUDE_PATH - system includes enabled when compiling ObjC++.
Bill Wendlingc0938f32012-03-12 22:10:06 +0000436 addDirectoryList(Args, CmdArgs, "-objcxx-isystem", "OBJCPLUS_INCLUDE_PATH");
Chandler Carruth6bfd84f2011-11-04 07:12:53 +0000437
Chandler Carruth6bfd84f2011-11-04 07:12:53 +0000438 // Add C++ include arguments, if needed.
Chandler Carruth4c81dfa2011-11-04 07:43:33 +0000439 if (types::isCXX(Inputs[0].getType()))
Chandler Carruth491db322011-11-04 07:34:47 +0000440 getToolChain().AddClangCXXStdlibIncludeArgs(Args, CmdArgs);
Chandler Carrutha796f532011-11-05 20:17:13 +0000441
442 // Add system include arguments.
443 getToolChain().AddClangSystemIncludeArgs(Args, CmdArgs);
Daniel Dunbard067f7f2009-04-08 23:54:23 +0000444}
445
Amara Emerson703da2e2013-10-31 09:32:33 +0000446/// getAArch64TargetCPU - Get the (LLVM) name of the AArch64 cpu we are targeting.
447//
448// FIXME: tblgen this.
449static std::string getAArch64TargetCPU(const ArgList &Args,
450 const llvm::Triple &Triple) {
451 // FIXME: Warn on inconsistent use of -mcpu and -march.
452
453 // If we have -mcpu=, use that.
454 if (Arg *A = Args.getLastArg(options::OPT_mcpu_EQ)) {
455 StringRef MCPU = A->getValue();
456 // Handle -mcpu=native.
457 if (MCPU == "native")
458 return llvm::sys::getHostCPUName();
459 else
460 return MCPU;
461 }
462
463 return "generic";
464}
465
Daniel Dunbard609b7b2009-11-17 06:37:03 +0000466// FIXME: Move to target hook.
467static bool isSignedCharDefault(const llvm::Triple &Triple) {
468 switch (Triple.getArch()) {
469 default:
470 return true;
471
Tim Northover9bb857a2013-01-31 12:13:10 +0000472 case llvm::Triple::aarch64:
Christian Pirker9b019ae2014-02-25 13:51:00 +0000473 case llvm::Triple::aarch64_be:
Tim Northovera2ee4332014-03-29 15:09:45 +0000474 case llvm::Triple::arm64:
Jim Grosbach7c2c6642011-05-24 15:40:46 +0000475 case llvm::Triple::arm:
Christian Pirkerf01cd6f2014-03-28 14:40:46 +0000476 case llvm::Triple::armeb:
Daniel Dunbard609b7b2009-11-17 06:37:03 +0000477 case llvm::Triple::ppc:
478 case llvm::Triple::ppc64:
Jonathan Roelofs2cea1be2014-02-12 03:21:20 +0000479 if (Triple.isOSDarwin())
Daniel Dunbard609b7b2009-11-17 06:37:03 +0000480 return true;
481 return false;
Ulrich Weigand47445072013-05-06 16:26:41 +0000482
Bill Schmidt778d3872013-07-26 01:36:11 +0000483 case llvm::Triple::ppc64le:
Ulrich Weigand47445072013-05-06 16:26:41 +0000484 case llvm::Triple::systemz:
Robert Lytton0e076492013-08-13 09:43:10 +0000485 case llvm::Triple::xcore:
Ulrich Weigand47445072013-05-06 16:26:41 +0000486 return false;
Daniel Dunbard609b7b2009-11-17 06:37:03 +0000487 }
488}
489
Robert Lytton0e076492013-08-13 09:43:10 +0000490static bool isNoCommonDefault(const llvm::Triple &Triple) {
491 switch (Triple.getArch()) {
492 default:
493 return false;
494
495 case llvm::Triple::xcore:
496 return true;
497 }
498}
499
Chad Rosiercfbfc582012-04-04 20:51:35 +0000500// Handle -mfpu=.
501//
502// FIXME: Centralize feature selection, defaulting shouldn't be also in the
503// frontend target.
Amara Emerson4cdb87b2013-10-01 10:20:54 +0000504static void getAArch64FPUFeatures(const Driver &D, const Arg *A,
505 const ArgList &Args,
506 std::vector<const char *> &Features) {
507 StringRef FPU = A->getValue();
508 if (FPU == "fp-armv8") {
509 Features.push_back("+fp-armv8");
510 } else if (FPU == "neon-fp-armv8") {
511 Features.push_back("+fp-armv8");
512 Features.push_back("+neon");
513 } else if (FPU == "crypto-neon-fp-armv8") {
514 Features.push_back("+fp-armv8");
515 Features.push_back("+neon");
516 Features.push_back("+crypto");
517 } else if (FPU == "neon") {
518 Features.push_back("+neon");
Amara Emerson4cdb87b2013-10-01 10:20:54 +0000519 } else
520 D.Diag(diag::err_drv_clang_unsupported) << A->getAsString(Args);
521}
522
Silviu Barangaf9671dd2013-10-21 10:54:53 +0000523// Handle -mhwdiv=.
524static void getARMHWDivFeatures(const Driver &D, const Arg *A,
525 const ArgList &Args,
526 std::vector<const char *> &Features) {
527 StringRef HWDiv = A->getValue();
528 if (HWDiv == "arm") {
529 Features.push_back("+hwdiv-arm");
530 Features.push_back("-hwdiv");
531 } else if (HWDiv == "thumb") {
532 Features.push_back("-hwdiv-arm");
533 Features.push_back("+hwdiv");
534 } else if (HWDiv == "arm,thumb" || HWDiv == "thumb,arm") {
535 Features.push_back("+hwdiv-arm");
536 Features.push_back("+hwdiv");
537 } else if (HWDiv == "none") {
538 Features.push_back("-hwdiv-arm");
539 Features.push_back("-hwdiv");
540 } else
541 D.Diag(diag::err_drv_clang_unsupported) << A->getAsString(Args);
542}
543
Amara Emerson4cdb87b2013-10-01 10:20:54 +0000544// Handle -mfpu=.
545//
546// FIXME: Centralize feature selection, defaulting shouldn't be also in the
547// frontend target.
548static void getARMFPUFeatures(const Driver &D, const Arg *A,
549 const ArgList &Args,
550 std::vector<const char *> &Features) {
Richard Smithbd55daf2012-11-01 04:30:05 +0000551 StringRef FPU = A->getValue();
Chad Rosiercfbfc582012-04-04 20:51:35 +0000552
553 // Set the target features based on the FPU.
554 if (FPU == "fpa" || FPU == "fpe2" || FPU == "fpe3" || FPU == "maverick") {
555 // Disable any default FPU support.
Rafael Espindola28e1f4b2013-08-21 16:39:20 +0000556 Features.push_back("-vfp2");
557 Features.push_back("-vfp3");
558 Features.push_back("-neon");
Artyom Skrobov53b000a82013-11-21 14:04:38 +0000559 } else if (FPU == "vfp") {
560 Features.push_back("+vfp2");
561 Features.push_back("-neon");
Chad Rosiercfbfc582012-04-04 20:51:35 +0000562 } else if (FPU == "vfp3-d16" || FPU == "vfpv3-d16") {
Rafael Espindola28e1f4b2013-08-21 16:39:20 +0000563 Features.push_back("+vfp3");
564 Features.push_back("+d16");
565 Features.push_back("-neon");
Chad Rosiercfbfc582012-04-04 20:51:35 +0000566 } else if (FPU == "vfp3" || FPU == "vfpv3") {
Rafael Espindola28e1f4b2013-08-21 16:39:20 +0000567 Features.push_back("+vfp3");
568 Features.push_back("-neon");
Artyom Skrobov53b000a82013-11-21 14:04:38 +0000569 } else if (FPU == "vfp4-d16" || FPU == "vfpv4-d16") {
570 Features.push_back("+vfp4");
571 Features.push_back("+d16");
572 Features.push_back("-neon");
573 } else if (FPU == "vfp4" || FPU == "vfpv4") {
574 Features.push_back("+vfp4");
575 Features.push_back("-neon");
Oliver Stannard96601ca2014-02-21 10:39:15 +0000576 } else if (FPU == "fp4-sp-d16" || FPU == "fpv4-sp-d16") {
577 Features.push_back("+vfp4");
578 Features.push_back("+d16");
579 Features.push_back("+fp-only-sp");
580 Features.push_back("-neon");
Joey Gouly7db275b2013-06-27 13:19:54 +0000581 } else if (FPU == "fp-armv8") {
Joey Goulybe8c2732013-09-13 13:48:33 +0000582 Features.push_back("+fp-armv8");
Bernard Ogdenda13af32013-10-24 18:32:51 +0000583 Features.push_back("-neon");
584 Features.push_back("-crypto");
Joey Gouly7db275b2013-06-27 13:19:54 +0000585 } else if (FPU == "neon-fp-armv8") {
Joey Goulybe8c2732013-09-13 13:48:33 +0000586 Features.push_back("+fp-armv8");
Rafael Espindola28e1f4b2013-08-21 16:39:20 +0000587 Features.push_back("+neon");
Bernard Ogdenda13af32013-10-24 18:32:51 +0000588 Features.push_back("-crypto");
Amara Emersonfc362c62013-09-19 13:54:03 +0000589 } else if (FPU == "crypto-neon-fp-armv8") {
Amara Emersonfc362c62013-09-19 13:54:03 +0000590 Features.push_back("+fp-armv8");
Bernard Ogdenda13af32013-10-24 18:32:51 +0000591 Features.push_back("+neon");
592 Features.push_back("+crypto");
Chad Rosiercfbfc582012-04-04 20:51:35 +0000593 } else if (FPU == "neon") {
Rafael Espindola28e1f4b2013-08-21 16:39:20 +0000594 Features.push_back("+neon");
Amara Emerson4cdb87b2013-10-01 10:20:54 +0000595 } else if (FPU == "none") {
596 Features.push_back("-vfp2");
597 Features.push_back("-vfp3");
598 Features.push_back("-vfp4");
599 Features.push_back("-fp-armv8");
600 Features.push_back("-crypto");
601 Features.push_back("-neon");
Chad Rosiercfbfc582012-04-04 20:51:35 +0000602 } else
603 D.Diag(diag::err_drv_clang_unsupported) << A->getAsString(Args);
604}
605
Anton Korobeynikova29e4622012-04-09 13:38:30 +0000606// Select the float ABI as determined by -msoft-float, -mhard-float, and
607// -mfloat-abi=.
Tim Northover9c7e0352013-12-12 11:55:52 +0000608StringRef tools::arm::getARMFloatABI(const Driver &D, const ArgList &Args,
609 const llvm::Triple &Triple) {
Chris Lattner0e62c1c2011-07-23 10:55:15 +0000610 StringRef FloatABI;
Daniel Dunbar78485922009-09-10 23:00:09 +0000611 if (Arg *A = Args.getLastArg(options::OPT_msoft_float,
612 options::OPT_mhard_float,
613 options::OPT_mfloat_abi_EQ)) {
614 if (A->getOption().matches(options::OPT_msoft_float))
615 FloatABI = "soft";
616 else if (A->getOption().matches(options::OPT_mhard_float))
617 FloatABI = "hard";
618 else {
Richard Smithbd55daf2012-11-01 04:30:05 +0000619 FloatABI = A->getValue();
Daniel Dunbar78485922009-09-10 23:00:09 +0000620 if (FloatABI != "soft" && FloatABI != "softfp" && FloatABI != "hard") {
Chris Lattner0e62c1c2011-07-23 10:55:15 +0000621 D.Diag(diag::err_drv_invalid_mfloat_abi)
Daniel Dunbar78485922009-09-10 23:00:09 +0000622 << A->getAsString(Args);
623 FloatABI = "soft";
624 }
625 }
626 }
627
628 // If unspecified, choose the default based on the platform.
629 if (FloatABI.empty()) {
Rafael Espindola0e1fb4f2010-06-28 17:18:09 +0000630 switch (Triple.getOS()) {
Bob Wilson6524dd32011-10-14 05:03:44 +0000631 case llvm::Triple::Darwin:
632 case llvm::Triple::MacOSX:
633 case llvm::Triple::IOS: {
Daniel Dunbar78485922009-09-10 23:00:09 +0000634 // Darwin defaults to "softfp" for v6 and v7.
635 //
636 // FIXME: Factor out an ARM class so we can cache the arch somewhere.
Benjamin Kramer09811c72012-06-26 22:20:06 +0000637 std::string ArchName =
Bernard Ogden31561762013-12-12 13:27:11 +0000638 arm::getLLVMArchSuffixForARM(arm::getARMTargetCPU(Args, Triple));
Benjamin Kramer09811c72012-06-26 22:20:06 +0000639 if (StringRef(ArchName).startswith("v6") ||
640 StringRef(ArchName).startswith("v7"))
Daniel Dunbar78485922009-09-10 23:00:09 +0000641 FloatABI = "softfp";
642 else
643 FloatABI = "soft";
644 break;
645 }
646
Rafael Espindola0f207ed2012-12-13 04:17:14 +0000647 case llvm::Triple::FreeBSD:
Renato Golinf4421f72014-02-19 10:44:07 +0000648 switch(Triple.getEnvironment()) {
649 case llvm::Triple::GNUEABIHF:
650 FloatABI = "hard";
651 break;
652 default:
653 // FreeBSD defaults to soft float
654 FloatABI = "soft";
655 break;
656 }
Rafael Espindola0f207ed2012-12-13 04:17:14 +0000657 break;
658
Daniel Dunbar78485922009-09-10 23:00:09 +0000659 default:
Bob Wilsond1447c42011-02-04 17:59:28 +0000660 switch(Triple.getEnvironment()) {
Jiangning Liu61b06cb2012-07-31 08:06:29 +0000661 case llvm::Triple::GNUEABIHF:
662 FloatABI = "hard";
663 break;
Bob Wilsond1447c42011-02-04 17:59:28 +0000664 case llvm::Triple::GNUEABI:
665 FloatABI = "softfp";
666 break;
Joerg Sonnenbergerd75a1f82013-12-16 19:16:04 +0000667 case llvm::Triple::EABIHF:
668 FloatABI = "hard";
669 break;
Bob Wilsond1447c42011-02-04 17:59:28 +0000670 case llvm::Triple::EABI:
671 // EABI is always AAPCS, and if it was not marked 'hard', it's softfp
672 FloatABI = "softfp";
673 break;
Logan Chienc6fd8202012-09-02 09:30:11 +0000674 case llvm::Triple::Android: {
Benjamin Kramer09811c72012-06-26 22:20:06 +0000675 std::string ArchName =
Bernard Ogden31561762013-12-12 13:27:11 +0000676 arm::getLLVMArchSuffixForARM(arm::getARMTargetCPU(Args, Triple));
Benjamin Kramer09811c72012-06-26 22:20:06 +0000677 if (StringRef(ArchName).startswith("v7"))
Chandler Carruthc89aa9d2012-01-10 19:47:42 +0000678 FloatABI = "softfp";
679 else
680 FloatABI = "soft";
681 break;
682 }
Bob Wilsond1447c42011-02-04 17:59:28 +0000683 default:
684 // Assume "soft", but warn the user we are guessing.
685 FloatABI = "soft";
Saleem Abdulrasool377066a2014-03-27 22:50:18 +0000686 if (Triple.getOS() != llvm::Triple::UnknownOS ||
687 !Triple.isOSBinFormatMachO())
688 D.Diag(diag::warn_drv_assuming_mfloat_abi_is) << "soft";
Bob Wilsond1447c42011-02-04 17:59:28 +0000689 break;
690 }
Daniel Dunbar78485922009-09-10 23:00:09 +0000691 }
692 }
693
Anton Korobeynikova29e4622012-04-09 13:38:30 +0000694 return FloatABI;
695}
696
Rafael Espindola28e1f4b2013-08-21 16:39:20 +0000697static void getARMTargetFeatures(const Driver &D, const llvm::Triple &Triple,
698 const ArgList &Args,
Rafael Espindola9c6fb0f2013-11-23 14:36:40 +0000699 std::vector<const char *> &Features,
700 bool ForAS) {
Tim Northover9c7e0352013-12-12 11:55:52 +0000701 StringRef FloatABI = tools::arm::getARMFloatABI(D, Args, Triple);
Rafael Espindola9c6fb0f2013-11-23 14:36:40 +0000702 if (!ForAS) {
703 // FIXME: Note, this is a hack, the LLVM backend doesn't actually use these
704 // yet (it uses the -mfloat-abi and -msoft-float options), and it is
705 // stripped out by the ARM target. We should probably pass this a new
706 // -target-option, which is handled by the -cc1/-cc1as invocation.
707 //
708 // FIXME2: For consistency, it would be ideal if we set up the target
709 // machine state the same when using the frontend or the assembler. We don't
710 // currently do that for the assembler, we pass the options directly to the
711 // backend and never even instantiate the frontend TargetInfo. If we did,
712 // and used its handleTargetFeatures hook, then we could ensure the
713 // assembler and the frontend behave the same.
Rafael Espindola28e1f4b2013-08-21 16:39:20 +0000714
Rafael Espindola9c6fb0f2013-11-23 14:36:40 +0000715 // Use software floating point operations?
716 if (FloatABI == "soft")
717 Features.push_back("+soft-float");
718
719 // Use software floating point argument passing?
720 if (FloatABI != "hard")
721 Features.push_back("+soft-float-abi");
722 }
Rafael Espindola28e1f4b2013-08-21 16:39:20 +0000723
724 // Honor -mfpu=.
725 if (const Arg *A = Args.getLastArg(options::OPT_mfpu_EQ))
Amara Emerson4cdb87b2013-10-01 10:20:54 +0000726 getARMFPUFeatures(D, A, Args, Features);
Silviu Barangaf9671dd2013-10-21 10:54:53 +0000727 if (const Arg *A = Args.getLastArg(options::OPT_mhwdiv_EQ))
728 getARMHWDivFeatures(D, A, Args, Features);
Rafael Espindola28e1f4b2013-08-21 16:39:20 +0000729
Rafael Espindola28e1f4b2013-08-21 16:39:20 +0000730 // Setting -msoft-float effectively disables NEON because of the GCC
731 // implementation, although the same isn't true of VFP or VFP3.
Amara Emersonecbe18e2014-02-12 10:22:35 +0000732 if (FloatABI == "soft") {
Rafael Espindola28e1f4b2013-08-21 16:39:20 +0000733 Features.push_back("-neon");
Amara Emersonecbe18e2014-02-12 10:22:35 +0000734 // Also need to explicitly disable features which imply NEON.
735 Features.push_back("-crypto");
736 }
Bernard Ogden18b57012013-10-29 09:47:51 +0000737
738 // En/disable crc
739 if (Arg *A = Args.getLastArg(options::OPT_mcrc,
740 options::OPT_mnocrc)) {
741 if (A->getOption().matches(options::OPT_mcrc))
742 Features.push_back("+crc");
743 else
744 Features.push_back("-crc");
745 }
Rafael Espindola28e1f4b2013-08-21 16:39:20 +0000746}
Anton Korobeynikova29e4622012-04-09 13:38:30 +0000747
748void Clang::AddARMTargetArgs(const ArgList &Args,
749 ArgStringList &CmdArgs,
750 bool KernelOrKext) const {
751 const Driver &D = getToolChain().getDriver();
Daniel Dunbarbd847cc2012-10-15 22:23:53 +0000752 // Get the effective triple, which takes into account the deployment target.
753 std::string TripleStr = getToolChain().ComputeEffectiveClangTriple(Args);
754 llvm::Triple Triple(TripleStr);
Bernard Ogden31561762013-12-12 13:27:11 +0000755 std::string CPUName = arm::getARMTargetCPU(Args, Triple);
Anton Korobeynikova29e4622012-04-09 13:38:30 +0000756
757 // Select the ABI to use.
758 //
759 // FIXME: Support -meabi.
760 const char *ABIName = 0;
761 if (Arg *A = Args.getLastArg(options::OPT_mabi_EQ)) {
Richard Smithbd55daf2012-11-01 04:30:05 +0000762 ABIName = A->getValue();
Jonathan Roelofs2cea1be2014-02-12 03:21:20 +0000763 } else if (Triple.isOSDarwin()) {
Daniel Dunbar5f18f6e2012-10-22 18:30:51 +0000764 // The backend is hardwired to assume AAPCS for M-class processors, ensure
765 // the frontend matches that.
Tim Northovere66c9462013-10-03 14:23:28 +0000766 if (Triple.getEnvironment() == llvm::Triple::EABI ||
Saleem Abdulrasool29b82b62014-03-06 20:47:19 +0000767 (Triple.getOS() == llvm::Triple::UnknownOS &&
768 Triple.getObjectFormat() == llvm::Triple::MachO) ||
Tim Northovere66c9462013-10-03 14:23:28 +0000769 StringRef(CPUName).startswith("cortex-m")) {
Daniel Dunbar5f18f6e2012-10-22 18:30:51 +0000770 ABIName = "aapcs";
771 } else {
772 ABIName = "apcs-gnu";
773 }
Anton Korobeynikova29e4622012-04-09 13:38:30 +0000774 } else {
775 // Select the default based on the platform.
776 switch(Triple.getEnvironment()) {
Logan Chienc6fd8202012-09-02 09:30:11 +0000777 case llvm::Triple::Android:
Anton Korobeynikova29e4622012-04-09 13:38:30 +0000778 case llvm::Triple::GNUEABI:
Jiangning Liu61b06cb2012-07-31 08:06:29 +0000779 case llvm::Triple::GNUEABIHF:
Anton Korobeynikova29e4622012-04-09 13:38:30 +0000780 ABIName = "aapcs-linux";
781 break;
Joerg Sonnenbergerd75a1f82013-12-16 19:16:04 +0000782 case llvm::Triple::EABIHF:
Anton Korobeynikova29e4622012-04-09 13:38:30 +0000783 case llvm::Triple::EABI:
784 ABIName = "aapcs";
785 break;
786 default:
787 ABIName = "apcs-gnu";
788 }
789 }
790 CmdArgs.push_back("-target-abi");
791 CmdArgs.push_back(ABIName);
792
Anton Korobeynikova29e4622012-04-09 13:38:30 +0000793 // Determine floating point ABI from the options & target defaults.
Tim Northover9c7e0352013-12-12 11:55:52 +0000794 StringRef FloatABI = tools::arm::getARMFloatABI(D, Args, Triple);
Daniel Dunbar78485922009-09-10 23:00:09 +0000795 if (FloatABI == "soft") {
796 // Floating point operations and argument passing are soft.
797 //
798 // FIXME: This changes CPP defines, we need -target-soft-float.
Daniel Dunbara74f8ff2009-11-30 08:42:00 +0000799 CmdArgs.push_back("-msoft-float");
Daniel Dunbar6cc525b2009-12-08 19:49:51 +0000800 CmdArgs.push_back("-mfloat-abi");
801 CmdArgs.push_back("soft");
Daniel Dunbar78485922009-09-10 23:00:09 +0000802 } else if (FloatABI == "softfp") {
803 // Floating point operations are hard, but argument passing is soft.
Daniel Dunbar6cc525b2009-12-08 19:49:51 +0000804 CmdArgs.push_back("-mfloat-abi");
805 CmdArgs.push_back("soft");
Daniel Dunbar78485922009-09-10 23:00:09 +0000806 } else {
807 // Floating point operations and argument passing are hard.
808 assert(FloatABI == "hard" && "Invalid float abi!");
Daniel Dunbar6cc525b2009-12-08 19:49:51 +0000809 CmdArgs.push_back("-mfloat-abi");
810 CmdArgs.push_back("hard");
Daniel Dunbar78485922009-09-10 23:00:09 +0000811 }
Daniel Dunbar893d4752009-12-19 04:15:38 +0000812
Daniel Dunbarc9388c12011-03-17 17:10:06 +0000813 // Kernel code has more strict alignment requirements.
814 if (KernelOrKext) {
Cameron Esfahani556d91e2013-09-14 01:09:11 +0000815 if (!Triple.isiOS() || Triple.isOSVersionLT(6)) {
Daniel Dunbarbd847cc2012-10-15 22:23:53 +0000816 CmdArgs.push_back("-backend-option");
817 CmdArgs.push_back("-arm-long-calls");
818 }
Daniel Dunbarc9388c12011-03-17 17:10:06 +0000819
Daniel Dunbar12100e22011-03-22 16:48:17 +0000820 CmdArgs.push_back("-backend-option");
Daniel Dunbarc9388c12011-03-17 17:10:06 +0000821 CmdArgs.push_back("-arm-strict-align");
Daniel Dunbared904c82011-04-18 21:26:42 +0000822
823 // The kext linker doesn't know how to deal with movw/movt.
Daniel Dunbared904c82011-04-18 21:26:42 +0000824 CmdArgs.push_back("-backend-option");
Renato Golin3d510b32013-08-15 20:54:45 +0000825 CmdArgs.push_back("-arm-use-movt=0");
Daniel Dunbarb1db4b62011-03-17 00:07:34 +0000826 }
Chad Rosierba3df1d2011-08-26 00:26:29 +0000827
828 // Setting -mno-global-merge disables the codegen global merge pass. Setting
829 // -mglobal-merge has no effect as the pass is enabled by default.
830 if (Arg *A = Args.getLastArg(options::OPT_mglobal_merge,
831 options::OPT_mno_global_merge)) {
832 if (A->getOption().matches(options::OPT_mno_global_merge))
833 CmdArgs.push_back("-mno-global-merge");
834 }
Chad Rosierf1985d22012-05-16 20:40:09 +0000835
Bob Wilson9c8af452013-04-11 18:53:25 +0000836 if (!Args.hasFlag(options::OPT_mimplicit_float,
837 options::OPT_mno_implicit_float,
838 true))
Chad Rosierf1985d22012-05-16 20:40:09 +0000839 CmdArgs.push_back("-no-implicit-float");
Renato Golindbb77e62013-08-24 14:44:35 +0000840
841 // llvm does not support reserving registers in general. There is support
842 // for reserving r9 on ARM though (defined as a platform-specific register
843 // in ARM EABI).
844 if (Args.hasArg(options::OPT_ffixed_r9)) {
845 CmdArgs.push_back("-backend-option");
846 CmdArgs.push_back("-arm-reserve-r9");
847 }
Daniel Dunbar0f5c5422009-09-10 04:57:17 +0000848}
849
Tim Northovera2ee4332014-03-29 15:09:45 +0000850/// getARM64TargetCPU - Get the (LLVM) name of the ARM64 cpu we are targeting.
851static std::string getARM64TargetCPU(const ArgList &Args) {
852 // If we have -mcpu=, use that.
853 if (Arg *A = Args.getLastArg(options::OPT_mcpu_EQ)) {
854 StringRef MCPU = A->getValue();
855 // Handle -mcpu=native.
856 if (MCPU == "native")
857 return llvm::sys::getHostCPUName();
858 else
859 return MCPU;
860 }
861
862 // At some point, we may need to check -march here, but for now we only
863 // one arm64 architecture.
864
865 // Default to "cyclone" CPU.
866 return "cyclone";
867}
868
869void Clang::AddARM64TargetArgs(const ArgList &Args,
870 ArgStringList &CmdArgs) const {
871 std::string TripleStr = getToolChain().ComputeEffectiveClangTriple(Args);
872 llvm::Triple Triple(TripleStr);
873
874 if (!Args.hasFlag(options::OPT_mred_zone, options::OPT_mno_red_zone, true) ||
875 Args.hasArg(options::OPT_mkernel) ||
876 Args.hasArg(options::OPT_fapple_kext))
877 CmdArgs.push_back("-disable-red-zone");
878
879 if (!Args.hasFlag(options::OPT_mimplicit_float,
880 options::OPT_mno_implicit_float, true))
881 CmdArgs.push_back("-no-implicit-float");
882
883 const char *ABIName = 0;
884 if (Arg *A = Args.getLastArg(options::OPT_mabi_EQ))
885 ABIName = A->getValue();
886 else if (Triple.isOSDarwin())
887 ABIName = "darwinpcs";
888 else
889 ABIName = "aapcs";
890
891 CmdArgs.push_back("-target-abi");
892 CmdArgs.push_back(ABIName);
893
894 CmdArgs.push_back("-target-cpu");
895 CmdArgs.push_back(Args.MakeArgString(getARM64TargetCPU(Args)));
896
897 if (Args.hasArg(options::OPT_mstrict_align)) {
898 CmdArgs.push_back("-backend-option");
899 CmdArgs.push_back("-arm64-strict-align");
900 }
901}
902
Simon Atanasyan3b7589a2012-04-07 22:09:23 +0000903// Get CPU and ABI names. They are not independent
904// so we have to calculate them together.
905static void getMipsCPUAndABI(const ArgList &Args,
Rafael Espindola22ce34a2013-08-20 22:12:08 +0000906 const llvm::Triple &Triple,
Simon Atanasyan3b7589a2012-04-07 22:09:23 +0000907 StringRef &CPUName,
908 StringRef &ABIName) {
Simon Atanasyan1a3665b62014-01-27 13:59:04 +0000909 const char *DefMips32CPU = "mips32r2";
910 const char *DefMips64CPU = "mips64r2";
Akira Hatanaka37fd9e92011-09-26 21:07:52 +0000911
Simon Atanasyan464a7f72012-09-10 08:32:41 +0000912 if (Arg *A = Args.getLastArg(options::OPT_march_EQ,
Simon Atanasyane0cc7c72013-10-09 12:12:24 +0000913 options::OPT_mcpu_EQ))
914 CPUName = A->getValue();
Simon Atanasyan464a7f72012-09-10 08:32:41 +0000915
Simon Atanasyan4938ddb2013-04-21 13:30:10 +0000916 if (Arg *A = Args.getLastArg(options::OPT_mabi_EQ)) {
Richard Smithbd55daf2012-11-01 04:30:05 +0000917 ABIName = A->getValue();
Simon Atanasyan4938ddb2013-04-21 13:30:10 +0000918 // Convert a GNU style Mips ABI name to the name
919 // accepted by LLVM Mips backend.
920 ABIName = llvm::StringSwitch<llvm::StringRef>(ABIName)
921 .Case("32", "o32")
922 .Case("64", "n64")
923 .Default(ABIName);
924 }
Simon Atanasyan464a7f72012-09-10 08:32:41 +0000925
926 // Setup default CPU and ABI names.
927 if (CPUName.empty() && ABIName.empty()) {
Rafael Espindola22ce34a2013-08-20 22:12:08 +0000928 switch (Triple.getArch()) {
Simon Atanasyan464a7f72012-09-10 08:32:41 +0000929 default:
930 llvm_unreachable("Unexpected triple arch name");
931 case llvm::Triple::mips:
932 case llvm::Triple::mipsel:
933 CPUName = DefMips32CPU;
934 break;
935 case llvm::Triple::mips64:
936 case llvm::Triple::mips64el:
937 CPUName = DefMips64CPU;
938 break;
939 }
940 }
941
942 if (!ABIName.empty()) {
943 // Deduce CPU name from ABI name.
944 CPUName = llvm::StringSwitch<const char *>(ABIName)
Simon Atanasyan0da400c2013-02-27 14:55:49 +0000945 .Cases("32", "o32", "eabi", DefMips32CPU)
946 .Cases("n32", "n64", "64", DefMips64CPU)
Simon Atanasyan464a7f72012-09-10 08:32:41 +0000947 .Default("");
948 }
949 else if (!CPUName.empty()) {
950 // Deduce ABI name from CPU name.
951 ABIName = llvm::StringSwitch<const char *>(CPUName)
952 .Cases("mips32", "mips32r2", "o32")
953 .Cases("mips64", "mips64r2", "n64")
954 .Default("");
955 }
956
957 // FIXME: Warn on inconsistent cpu and abi usage.
Simon Atanasyan3b7589a2012-04-07 22:09:23 +0000958}
959
Simon Atanasyan0da400c2013-02-27 14:55:49 +0000960// Convert ABI name to the GNU tools acceptable variant.
961static StringRef getGnuCompatibleMipsABIName(StringRef ABI) {
962 return llvm::StringSwitch<llvm::StringRef>(ABI)
963 .Case("o32", "32")
964 .Case("n64", "64")
965 .Default(ABI);
966}
967
Simon Atanasyan590ad8f2012-06-02 15:06:29 +0000968// Select the MIPS float ABI as determined by -msoft-float, -mhard-float,
969// and -mfloat-abi=.
970static StringRef getMipsFloatABI(const Driver &D, const ArgList &Args) {
Chris Lattner0e62c1c2011-07-23 10:55:15 +0000971 StringRef FloatABI;
Eric Christopher0b26a612010-03-02 02:41:08 +0000972 if (Arg *A = Args.getLastArg(options::OPT_msoft_float,
Akira Hatanaka6976ec82012-03-23 23:07:09 +0000973 options::OPT_mhard_float,
974 options::OPT_mfloat_abi_EQ)) {
Eric Christopher0b26a612010-03-02 02:41:08 +0000975 if (A->getOption().matches(options::OPT_msoft_float))
976 FloatABI = "soft";
977 else if (A->getOption().matches(options::OPT_mhard_float))
978 FloatABI = "hard";
Akira Hatanaka6976ec82012-03-23 23:07:09 +0000979 else {
Richard Smithbd55daf2012-11-01 04:30:05 +0000980 FloatABI = A->getValue();
Simon Atanasyan512dc382013-04-14 08:37:15 +0000981 if (FloatABI != "soft" && FloatABI != "hard") {
Simon Atanasyan590ad8f2012-06-02 15:06:29 +0000982 D.Diag(diag::err_drv_invalid_mfloat_abi) << A->getAsString(Args);
Akira Hatanaka6976ec82012-03-23 23:07:09 +0000983 FloatABI = "hard";
984 }
985 }
Eric Christopher0b26a612010-03-02 02:41:08 +0000986 }
987
988 // If unspecified, choose the default based on the platform.
989 if (FloatABI.empty()) {
Akira Hatanaka6976ec82012-03-23 23:07:09 +0000990 // Assume "hard", because it's a default value used by gcc.
991 // When we start to recognize specific target MIPS processors,
992 // we will be able to select the default more correctly.
993 FloatABI = "hard";
Eric Christopher0b26a612010-03-02 02:41:08 +0000994 }
995
Simon Atanasyan590ad8f2012-06-02 15:06:29 +0000996 return FloatABI;
997}
998
Simon Atanasyan9b1932d2012-07-05 18:51:43 +0000999static void AddTargetFeature(const ArgList &Args,
Rafael Espindola28e1f4b2013-08-21 16:39:20 +00001000 std::vector<const char *> &Features,
1001 OptSpecifier OnOpt, OptSpecifier OffOpt,
Simon Atanasyan9b1932d2012-07-05 18:51:43 +00001002 StringRef FeatureName) {
1003 if (Arg *A = Args.getLastArg(OnOpt, OffOpt)) {
Simon Atanasyan9b1932d2012-07-05 18:51:43 +00001004 if (A->getOption().matches(OnOpt))
Rafael Espindola28e1f4b2013-08-21 16:39:20 +00001005 Features.push_back(Args.MakeArgString("+" + FeatureName));
Simon Atanasyan9b1932d2012-07-05 18:51:43 +00001006 else
Rafael Espindola28e1f4b2013-08-21 16:39:20 +00001007 Features.push_back(Args.MakeArgString("-" + FeatureName));
Simon Atanasyan9b1932d2012-07-05 18:51:43 +00001008 }
1009}
1010
Rafael Espindola28e1f4b2013-08-21 16:39:20 +00001011static void getMIPSTargetFeatures(const Driver &D, const ArgList &Args,
1012 std::vector<const char *> &Features) {
1013 StringRef FloatABI = getMipsFloatABI(D, Args);
Simon Atanasyan22a6f4d2013-11-19 12:22:38 +00001014 if (FloatABI == "soft") {
Rafael Espindola28e1f4b2013-08-21 16:39:20 +00001015 // FIXME: Note, this is a hack. We need to pass the selected float
1016 // mode to the MipsTargetInfoBase to define appropriate macros there.
1017 // Now it is the only method.
1018 Features.push_back("+soft-float");
1019 }
1020
Simon Atanasyan22127ce2013-09-24 09:09:16 +00001021 if (Arg *A = Args.getLastArg(options::OPT_mnan_EQ)) {
1022 if (StringRef(A->getValue()) == "2008")
1023 Features.push_back("+nan2008");
1024 }
1025
Rafael Espindola28e1f4b2013-08-21 16:39:20 +00001026 AddTargetFeature(Args, Features, options::OPT_msingle_float,
1027 options::OPT_mdouble_float, "single-float");
1028 AddTargetFeature(Args, Features, options::OPT_mips16, options::OPT_mno_mips16,
1029 "mips16");
1030 AddTargetFeature(Args, Features, options::OPT_mmicromips,
1031 options::OPT_mno_micromips, "micromips");
1032 AddTargetFeature(Args, Features, options::OPT_mdsp, options::OPT_mno_dsp,
1033 "dsp");
1034 AddTargetFeature(Args, Features, options::OPT_mdspr2, options::OPT_mno_dspr2,
1035 "dspr2");
1036 AddTargetFeature(Args, Features, options::OPT_mmsa, options::OPT_mno_msa,
1037 "msa");
Daniel Sanders94694172013-10-17 14:55:58 +00001038 AddTargetFeature(Args, Features, options::OPT_mfp64, options::OPT_mfp32,
1039 "fp64");
Rafael Espindola28e1f4b2013-08-21 16:39:20 +00001040}
1041
Simon Atanasyan590ad8f2012-06-02 15:06:29 +00001042void Clang::AddMIPSTargetArgs(const ArgList &Args,
Simon Atanasyanf0087242013-04-14 14:07:41 +00001043 ArgStringList &CmdArgs) const {
Simon Atanasyan590ad8f2012-06-02 15:06:29 +00001044 const Driver &D = getToolChain().getDriver();
1045 StringRef CPUName;
1046 StringRef ABIName;
Rafael Espindola22ce34a2013-08-20 22:12:08 +00001047 const llvm::Triple &Triple = getToolChain().getTriple();
1048 getMipsCPUAndABI(Args, Triple, CPUName, ABIName);
Simon Atanasyan590ad8f2012-06-02 15:06:29 +00001049
1050 CmdArgs.push_back("-target-abi");
1051 CmdArgs.push_back(ABIName.data());
1052
1053 StringRef FloatABI = getMipsFloatABI(D, Args);
1054
Simon Atanasyan22a6f4d2013-11-19 12:22:38 +00001055 if (FloatABI == "soft") {
Eric Christopher0b26a612010-03-02 02:41:08 +00001056 // Floating point operations and argument passing are soft.
Eric Christopher0b26a612010-03-02 02:41:08 +00001057 CmdArgs.push_back("-msoft-float");
Akira Hatanaka6976ec82012-03-23 23:07:09 +00001058 CmdArgs.push_back("-mfloat-abi");
1059 CmdArgs.push_back("soft");
Akira Hatanaka6976ec82012-03-23 23:07:09 +00001060 }
Akira Hatanaka6976ec82012-03-23 23:07:09 +00001061 else {
1062 // Floating point operations and argument passing are hard.
Eric Christopher0b26a612010-03-02 02:41:08 +00001063 assert(FloatABI == "hard" && "Invalid float abi!");
Akira Hatanaka6976ec82012-03-23 23:07:09 +00001064 CmdArgs.push_back("-mfloat-abi");
1065 CmdArgs.push_back("hard");
Eric Christopher0b26a612010-03-02 02:41:08 +00001066 }
Simon Atanasyan6f23fa02012-07-05 14:19:39 +00001067
Simon Atanasyan2eaec512012-12-01 18:27:21 +00001068 if (Arg *A = Args.getLastArg(options::OPT_mxgot, options::OPT_mno_xgot)) {
1069 if (A->getOption().matches(options::OPT_mxgot)) {
1070 CmdArgs.push_back("-mllvm");
1071 CmdArgs.push_back("-mxgot");
1072 }
1073 }
1074
Simon Atanasyanc580b322013-05-11 06:33:44 +00001075 if (Arg *A = Args.getLastArg(options::OPT_mldc1_sdc1,
1076 options::OPT_mno_ldc1_sdc1)) {
1077 if (A->getOption().matches(options::OPT_mno_ldc1_sdc1)) {
1078 CmdArgs.push_back("-mllvm");
1079 CmdArgs.push_back("-mno-ldc1-sdc1");
1080 }
1081 }
1082
Akira Hatanaka0aa60ef2013-07-19 18:58:48 +00001083 if (Arg *A = Args.getLastArg(options::OPT_mcheck_zero_division,
1084 options::OPT_mno_check_zero_division)) {
1085 if (A->getOption().matches(options::OPT_mno_check_zero_division)) {
1086 CmdArgs.push_back("-mllvm");
1087 CmdArgs.push_back("-mno-check-zero-division");
1088 }
1089 }
1090
Simon Atanasyanec4b1c12012-08-27 20:55:56 +00001091 if (Arg *A = Args.getLastArg(options::OPT_G)) {
Richard Smithbd55daf2012-11-01 04:30:05 +00001092 StringRef v = A->getValue();
Simon Atanasyanec4b1c12012-08-27 20:55:56 +00001093 CmdArgs.push_back("-mllvm");
1094 CmdArgs.push_back(Args.MakeArgString("-mips-ssection-threshold=" + v));
1095 A->claim();
1096 }
Eric Christopher0b26a612010-03-02 02:41:08 +00001097}
1098
Hal Finkel8eb59282012-06-11 22:35:19 +00001099/// getPPCTargetCPU - Get the (LLVM) name of the PowerPC cpu we are targeting.
1100static std::string getPPCTargetCPU(const ArgList &Args) {
1101 if (Arg *A = Args.getLastArg(options::OPT_mcpu_EQ)) {
Richard Smithbd55daf2012-11-01 04:30:05 +00001102 StringRef CPUName = A->getValue();
Hal Finkel8eb59282012-06-11 22:35:19 +00001103
1104 if (CPUName == "native") {
1105 std::string CPU = llvm::sys::getHostCPUName();
1106 if (!CPU.empty() && CPU != "generic")
1107 return CPU;
1108 else
1109 return "";
1110 }
1111
1112 return llvm::StringSwitch<const char *>(CPUName)
1113 .Case("common", "generic")
1114 .Case("440", "440")
1115 .Case("440fp", "440")
1116 .Case("450", "450")
1117 .Case("601", "601")
1118 .Case("602", "602")
1119 .Case("603", "603")
1120 .Case("603e", "603e")
1121 .Case("603ev", "603ev")
1122 .Case("604", "604")
1123 .Case("604e", "604e")
1124 .Case("620", "620")
Bill Schmidt38378a02013-02-01 20:23:10 +00001125 .Case("630", "pwr3")
Hal Finkel8eb59282012-06-11 22:35:19 +00001126 .Case("G3", "g3")
1127 .Case("7400", "7400")
1128 .Case("G4", "g4")
1129 .Case("7450", "7450")
1130 .Case("G4+", "g4+")
1131 .Case("750", "750")
1132 .Case("970", "970")
1133 .Case("G5", "g5")
1134 .Case("a2", "a2")
Hal Finkeldf1e4bf2013-02-01 05:53:33 +00001135 .Case("a2q", "a2q")
Hal Finkelf6d6cb02012-09-18 22:25:03 +00001136 .Case("e500mc", "e500mc")
1137 .Case("e5500", "e5500")
Bill Schmidt38378a02013-02-01 20:23:10 +00001138 .Case("power3", "pwr3")
1139 .Case("power4", "pwr4")
1140 .Case("power5", "pwr5")
1141 .Case("power5x", "pwr5x")
Hal Finkel8eb59282012-06-11 22:35:19 +00001142 .Case("power6", "pwr6")
Bill Schmidt38378a02013-02-01 20:23:10 +00001143 .Case("power6x", "pwr6x")
Hal Finkel8eb59282012-06-11 22:35:19 +00001144 .Case("power7", "pwr7")
Bill Schmidt38378a02013-02-01 20:23:10 +00001145 .Case("pwr3", "pwr3")
1146 .Case("pwr4", "pwr4")
1147 .Case("pwr5", "pwr5")
1148 .Case("pwr5x", "pwr5x")
1149 .Case("pwr6", "pwr6")
1150 .Case("pwr6x", "pwr6x")
1151 .Case("pwr7", "pwr7")
Hal Finkel8eb59282012-06-11 22:35:19 +00001152 .Case("powerpc", "ppc")
1153 .Case("powerpc64", "ppc64")
Bill Schmidt778d3872013-07-26 01:36:11 +00001154 .Case("powerpc64le", "ppc64le")
Hal Finkel8eb59282012-06-11 22:35:19 +00001155 .Default("");
1156 }
1157
1158 return "";
1159}
1160
Rafael Espindola28e1f4b2013-08-21 16:39:20 +00001161static void getPPCTargetFeatures(const ArgList &Args,
1162 std::vector<const char *> &Features) {
Eric Christopher643bb6a2013-10-16 20:40:08 +00001163 for (arg_iterator it = Args.filtered_begin(options::OPT_m_ppc_Features_Group),
1164 ie = Args.filtered_end();
1165 it != ie; ++it) {
1166 StringRef Name = (*it)->getOption().getName();
1167 (*it)->claim();
1168
1169 // Skip over "-m".
1170 assert(Name.startswith("m") && "Invalid feature name.");
1171 Name = Name.substr(1);
1172
1173 bool IsNegative = Name.startswith("no-");
1174 if (IsNegative)
1175 Name = Name.substr(3);
1176
1177 // Note that gcc calls this mfcrf and LLVM calls this mfocrf so we
1178 // pass the correct option to the backend while calling the frontend
1179 // option the same.
1180 // TODO: Change the LLVM backend option maybe?
1181 if (Name == "mfcrf")
1182 Name = "mfocrf";
1183
1184 Features.push_back(Args.MakeArgString((IsNegative ? "-" : "+") + Name));
1185 }
1186
1187 // Altivec is a bit weird, allow overriding of the Altivec feature here.
Rafael Espindola28e1f4b2013-08-21 16:39:20 +00001188 AddTargetFeature(Args, Features, options::OPT_faltivec,
1189 options::OPT_fno_altivec, "altivec");
Hal Finkel8eb59282012-06-11 22:35:19 +00001190}
1191
Tom Stellard6674c702013-04-01 20:56:53 +00001192/// Get the (LLVM) name of the R600 gpu we are targeting.
1193static std::string getR600TargetGPU(const ArgList &Args) {
1194 if (Arg *A = Args.getLastArg(options::OPT_mcpu_EQ)) {
Benjamin Kramerb2ccade2013-10-21 12:33:55 +00001195 const char *GPUName = A->getValue();
Tom Stellard6674c702013-04-01 20:56:53 +00001196 return llvm::StringSwitch<const char *>(GPUName)
Tom Stellardb38600c2013-05-06 16:12:05 +00001197 .Cases("rv630", "rv635", "r600")
1198 .Cases("rv610", "rv620", "rs780", "rs880")
Tom Stellard6674c702013-04-01 20:56:53 +00001199 .Case("rv740", "rv770")
1200 .Case("palm", "cedar")
Tom Stellardb38600c2013-05-06 16:12:05 +00001201 .Cases("sumo", "sumo2", "sumo")
Tom Stellard6674c702013-04-01 20:56:53 +00001202 .Case("hemlock", "cypress")
1203 .Case("aruba", "cayman")
Benjamin Kramerb2ccade2013-10-21 12:33:55 +00001204 .Default(GPUName);
Tom Stellard6674c702013-04-01 20:56:53 +00001205 }
1206 return "";
1207}
1208
Rafael Espindola28e1f4b2013-08-21 16:39:20 +00001209static void getSparcTargetFeatures(const ArgList &Args,
1210 std::vector<const char *> Features) {
1211 bool SoftFloatABI = true;
1212 if (Arg *A =
1213 Args.getLastArg(options::OPT_msoft_float, options::OPT_mhard_float)) {
1214 if (A->getOption().matches(options::OPT_mhard_float))
1215 SoftFloatABI = false;
1216 }
1217 if (SoftFloatABI)
1218 Features.push_back("+soft-float");
1219}
1220
Bruno Cardoso Lopese7f211c2010-11-09 17:21:19 +00001221void Clang::AddSparcTargetArgs(const ArgList &Args,
1222 ArgStringList &CmdArgs) const {
1223 const Driver &D = getToolChain().getDriver();
1224
Bruno Cardoso Lopese7f211c2010-11-09 17:21:19 +00001225 // Select the float ABI as determined by -msoft-float, -mhard-float, and
Chris Lattner0e62c1c2011-07-23 10:55:15 +00001226 StringRef FloatABI;
Bruno Cardoso Lopese7f211c2010-11-09 17:21:19 +00001227 if (Arg *A = Args.getLastArg(options::OPT_msoft_float,
1228 options::OPT_mhard_float)) {
1229 if (A->getOption().matches(options::OPT_msoft_float))
1230 FloatABI = "soft";
1231 else if (A->getOption().matches(options::OPT_mhard_float))
1232 FloatABI = "hard";
1233 }
1234
1235 // If unspecified, choose the default based on the platform.
1236 if (FloatABI.empty()) {
Aaron Ballmand0d27ab2013-07-15 13:41:33 +00001237 // Assume "soft", but warn the user we are guessing.
1238 FloatABI = "soft";
1239 D.Diag(diag::warn_drv_assuming_mfloat_abi_is) << "soft";
Bruno Cardoso Lopese7f211c2010-11-09 17:21:19 +00001240 }
1241
1242 if (FloatABI == "soft") {
1243 // Floating point operations and argument passing are soft.
1244 //
1245 // FIXME: This changes CPP defines, we need -target-soft-float.
1246 CmdArgs.push_back("-msoft-float");
Bruno Cardoso Lopese7f211c2010-11-09 17:21:19 +00001247 } else {
1248 assert(FloatABI == "hard" && "Invalid float abi!");
1249 CmdArgs.push_back("-mhard-float");
1250 }
1251}
1252
Richard Sandiford4652d892013-07-19 16:51:51 +00001253static const char *getSystemZTargetCPU(const ArgList &Args) {
1254 if (const Arg *A = Args.getLastArg(options::OPT_march_EQ))
1255 return A->getValue();
1256 return "z10";
1257}
1258
Chandler Carruth953fb082013-01-13 11:46:33 +00001259static const char *getX86TargetCPU(const ArgList &Args,
1260 const llvm::Triple &Triple) {
1261 if (const Arg *A = Args.getLastArg(options::OPT_march_EQ)) {
Jim Grosbach82eee262013-11-16 00:53:35 +00001262 if (StringRef(A->getValue()) != "native") {
Jonathan Roelofs2cea1be2014-02-12 03:21:20 +00001263 if (Triple.isOSDarwin() && Triple.getArchName() == "x86_64h")
Jim Grosbach82eee262013-11-16 00:53:35 +00001264 return "core-avx2";
1265
Chandler Carruth953fb082013-01-13 11:46:33 +00001266 return A->getValue();
Jim Grosbach82eee262013-11-16 00:53:35 +00001267 }
Chandler Carruth953fb082013-01-13 11:46:33 +00001268
1269 // FIXME: Reject attempts to use -march=native unless the target matches
1270 // the host.
1271 //
1272 // FIXME: We should also incorporate the detected target features for use
1273 // with -native.
1274 std::string CPU = llvm::sys::getHostCPUName();
1275 if (!CPU.empty() && CPU != "generic")
1276 return Args.MakeArgString(CPU);
1277 }
1278
1279 // Select the default CPU if none was given (or detection failed).
1280
1281 if (Triple.getArch() != llvm::Triple::x86_64 &&
1282 Triple.getArch() != llvm::Triple::x86)
1283 return 0; // This routine is only handling x86 targets.
1284
1285 bool Is64Bit = Triple.getArch() == llvm::Triple::x86_64;
1286
1287 // FIXME: Need target hooks.
Jonathan Roelofs2cea1be2014-02-12 03:21:20 +00001288 if (Triple.isOSDarwin()) {
Jim Grosbach82eee262013-11-16 00:53:35 +00001289 if (Triple.getArchName() == "x86_64h")
1290 return "core-avx2";
Chandler Carruth953fb082013-01-13 11:46:33 +00001291 return Is64Bit ? "core2" : "yonah";
Jim Grosbach82eee262013-11-16 00:53:35 +00001292 }
Chandler Carruth953fb082013-01-13 11:46:33 +00001293
Alexey Bataev286d1b92014-01-31 04:07:13 +00001294 // On Android use targets compatible with gcc
Chandler Carruth953fb082013-01-13 11:46:33 +00001295 if (Triple.getEnvironment() == llvm::Triple::Android)
Alexey Bataev286d1b92014-01-31 04:07:13 +00001296 return Is64Bit ? "x86-64" : "i686";
Chandler Carruth953fb082013-01-13 11:46:33 +00001297
Benjamin Kramerb2ccade2013-10-21 12:33:55 +00001298 // Everything else goes to x86-64 in 64-bit mode.
1299 if (Is64Bit)
1300 return "x86-64";
1301
1302 switch (Triple.getOS()) {
1303 case llvm::Triple::FreeBSD:
1304 case llvm::Triple::NetBSD:
1305 case llvm::Triple::OpenBSD:
1306 return "i486";
1307 case llvm::Triple::Haiku:
1308 return "i586";
1309 case llvm::Triple::Bitrig:
1310 return "i686";
1311 default:
1312 // Fallback to p4.
1313 return "pentium4";
1314 }
Chandler Carruth953fb082013-01-13 11:46:33 +00001315}
1316
Rafael Espindola22ce34a2013-08-20 22:12:08 +00001317static std::string getCPUName(const ArgList &Args, const llvm::Triple &T) {
1318 switch(T.getArch()) {
1319 default:
1320 return "";
1321
Amara Emerson703da2e2013-10-31 09:32:33 +00001322 case llvm::Triple::aarch64:
Christian Pirker9b019ae2014-02-25 13:51:00 +00001323 case llvm::Triple::aarch64_be:
Amara Emerson703da2e2013-10-31 09:32:33 +00001324 return getAArch64TargetCPU(Args, T);
1325
Rafael Espindola22ce34a2013-08-20 22:12:08 +00001326 case llvm::Triple::arm:
Christian Pirkerf01cd6f2014-03-28 14:40:46 +00001327 case llvm::Triple::armeb:
Rafael Espindola22ce34a2013-08-20 22:12:08 +00001328 case llvm::Triple::thumb:
Christian Pirkerf01cd6f2014-03-28 14:40:46 +00001329 case llvm::Triple::thumbeb:
Bernard Ogden31561762013-12-12 13:27:11 +00001330 return arm::getARMTargetCPU(Args, T);
Rafael Espindola22ce34a2013-08-20 22:12:08 +00001331
1332 case llvm::Triple::mips:
1333 case llvm::Triple::mipsel:
1334 case llvm::Triple::mips64:
1335 case llvm::Triple::mips64el: {
1336 StringRef CPUName;
1337 StringRef ABIName;
1338 getMipsCPUAndABI(Args, T, CPUName, ABIName);
1339 return CPUName;
1340 }
1341
1342 case llvm::Triple::ppc:
1343 case llvm::Triple::ppc64:
1344 case llvm::Triple::ppc64le: {
1345 std::string TargetCPUName = getPPCTargetCPU(Args);
1346 // LLVM may default to generating code for the native CPU,
1347 // but, like gcc, we default to a more generic option for
1348 // each architecture. (except on Darwin)
1349 if (TargetCPUName.empty() && !T.isOSDarwin()) {
1350 if (T.getArch() == llvm::Triple::ppc64)
1351 TargetCPUName = "ppc64";
1352 else if (T.getArch() == llvm::Triple::ppc64le)
1353 TargetCPUName = "ppc64le";
1354 else
1355 TargetCPUName = "ppc";
1356 }
1357 return TargetCPUName;
1358 }
1359
1360 case llvm::Triple::sparc:
Roman Divackyb1ae3d42014-02-25 18:35:30 +00001361 case llvm::Triple::sparcv9:
1362 if (const Arg *A = Args.getLastArg(options::OPT_mcpu_EQ))
Rafael Espindola22ce34a2013-08-20 22:12:08 +00001363 return A->getValue();
1364 return "";
1365
1366 case llvm::Triple::x86:
1367 case llvm::Triple::x86_64:
1368 return getX86TargetCPU(Args, T);
1369
1370 case llvm::Triple::hexagon:
1371 return "hexagon" + toolchains::Hexagon_TC::GetTargetCPU(Args).str();
1372
1373 case llvm::Triple::systemz:
1374 return getSystemZTargetCPU(Args);
1375
1376 case llvm::Triple::r600:
1377 return getR600TargetGPU(Args);
1378 }
1379}
1380
Alp Tokerce365ca2013-12-02 12:43:03 +00001381static void AddGoldPlugin(const ToolChain &ToolChain, const ArgList &Args,
1382 ArgStringList &CmdArgs) {
1383 // Tell the linker to load the plugin. This has to come before AddLinkerInputs
1384 // as gold requires -plugin to come before any -plugin-opt that -Wl might
1385 // forward.
1386 CmdArgs.push_back("-plugin");
1387 std::string Plugin = ToolChain.getDriver().Dir + "/../lib/LLVMgold.so";
1388 CmdArgs.push_back(Args.MakeArgString(Plugin));
1389
1390 // Try to pass driver level flags relevant to LTO code generation down to
1391 // the plugin.
1392
1393 // Handle flags for selecting CPU variants.
1394 std::string CPU = getCPUName(Args, ToolChain.getTriple());
1395 if (!CPU.empty())
1396 CmdArgs.push_back(Args.MakeArgString(Twine("-plugin-opt=mcpu=") + CPU));
1397}
1398
Jim Grosbach82eee262013-11-16 00:53:35 +00001399static void getX86TargetFeatures(const llvm::Triple &Triple,
1400 const ArgList &Args,
Rafael Espindola28e1f4b2013-08-21 16:39:20 +00001401 std::vector<const char *> &Features) {
Jim Grosbach82eee262013-11-16 00:53:35 +00001402 if (Triple.getArchName() == "x86_64h") {
1403 // x86_64h implies quite a few of the more modern subtarget features
1404 // for Haswell class CPUs, but not all of them. Opt-out of a few.
1405 Features.push_back("-rdrnd");
1406 Features.push_back("-aes");
1407 Features.push_back("-pclmul");
1408 Features.push_back("-rtm");
1409 Features.push_back("-hle");
1410 Features.push_back("-fsgsbase");
1411 }
1412
Alexey Bataev286d1b92014-01-31 04:07:13 +00001413 if (Triple.getEnvironment() == llvm::Triple::Android) {
1414 // Add sse3 feature to comply with gcc on Android
1415 Features.push_back("+sse3");
1416 }
1417
Jim Grosbach82eee262013-11-16 00:53:35 +00001418 // Now add any that the user explicitly requested on the command line,
1419 // which may override the defaults.
Rafael Espindola28e1f4b2013-08-21 16:39:20 +00001420 for (arg_iterator it = Args.filtered_begin(options::OPT_m_x86_Features_Group),
1421 ie = Args.filtered_end();
1422 it != ie; ++it) {
1423 StringRef Name = (*it)->getOption().getName();
1424 (*it)->claim();
1425
1426 // Skip over "-m".
1427 assert(Name.startswith("m") && "Invalid feature name.");
1428 Name = Name.substr(1);
1429
1430 bool IsNegative = Name.startswith("no-");
1431 if (IsNegative)
1432 Name = Name.substr(3);
1433
1434 Features.push_back(Args.MakeArgString((IsNegative ? "-" : "+") + Name));
1435 }
1436}
1437
Daniel Dunbar3b3191f2009-09-09 22:33:08 +00001438void Clang::AddX86TargetArgs(const ArgList &Args,
1439 ArgStringList &CmdArgs) const {
Daniel Dunbare2cf8f72009-09-10 22:59:57 +00001440 if (!Args.hasFlag(options::OPT_mred_zone,
1441 options::OPT_mno_red_zone,
1442 true) ||
1443 Args.hasArg(options::OPT_mkernel) ||
1444 Args.hasArg(options::OPT_fapple_kext))
Daniel Dunbar8bed86c2009-11-20 22:21:36 +00001445 CmdArgs.push_back("-disable-red-zone");
Daniel Dunbare2cf8f72009-09-10 22:59:57 +00001446
Bob Wilson2616e2e2013-02-10 16:01:41 +00001447 // Default to avoid implicit floating-point for kernel/kext code, but allow
1448 // that to be overridden with -mno-soft-float.
1449 bool NoImplicitFloat = (Args.hasArg(options::OPT_mkernel) ||
1450 Args.hasArg(options::OPT_fapple_kext));
1451 if (Arg *A = Args.getLastArg(options::OPT_msoft_float,
1452 options::OPT_mno_soft_float,
Bob Wilson9c8af452013-04-11 18:53:25 +00001453 options::OPT_mimplicit_float,
Bob Wilson2616e2e2013-02-10 16:01:41 +00001454 options::OPT_mno_implicit_float)) {
1455 const Option &O = A->getOption();
1456 NoImplicitFloat = (O.matches(options::OPT_mno_implicit_float) ||
1457 O.matches(options::OPT_msoft_float));
1458 }
1459 if (NoImplicitFloat)
Daniel Dunbar8bed86c2009-11-20 22:21:36 +00001460 CmdArgs.push_back("-no-implicit-float");
Daniel Dunbar3b3191f2009-09-09 22:33:08 +00001461}
1462
Matthew Curtise8f80a12012-12-06 17:49:03 +00001463static inline bool HasPICArg(const ArgList &Args) {
1464 return Args.hasArg(options::OPT_fPIC)
1465 || Args.hasArg(options::OPT_fpic);
1466}
1467
1468static Arg *GetLastSmallDataThresholdArg(const ArgList &Args) {
1469 return Args.getLastArg(options::OPT_G,
1470 options::OPT_G_EQ,
1471 options::OPT_msmall_data_threshold_EQ);
1472}
1473
1474static std::string GetHexagonSmallDataThresholdValue(const ArgList &Args) {
1475 std::string value;
1476 if (HasPICArg(Args))
1477 value = "0";
1478 else if (Arg *A = GetLastSmallDataThresholdArg(Args)) {
1479 value = A->getValue();
1480 A->claim();
1481 }
1482 return value;
1483}
1484
Tony Linthicum76329bf2011-12-12 21:14:55 +00001485void Clang::AddHexagonTargetArgs(const ArgList &Args,
1486 ArgStringList &CmdArgs) const {
Tony Linthicum76329bf2011-12-12 21:14:55 +00001487 CmdArgs.push_back("-fno-signed-char");
Matthew Curtis6b222782012-12-07 13:52:44 +00001488 CmdArgs.push_back("-mqdsp6-compat");
1489 CmdArgs.push_back("-Wreturn-type");
Tony Linthicum76329bf2011-12-12 21:14:55 +00001490
Matthew Curtise8f80a12012-12-06 17:49:03 +00001491 std::string SmallDataThreshold = GetHexagonSmallDataThresholdValue(Args);
1492 if (!SmallDataThreshold.empty()) {
Tony Linthicum76329bf2011-12-12 21:14:55 +00001493 CmdArgs.push_back ("-mllvm");
Matthew Curtise8f80a12012-12-06 17:49:03 +00001494 CmdArgs.push_back(Args.MakeArgString(
1495 "-hexagon-small-data-threshold=" + SmallDataThreshold));
Tony Linthicum76329bf2011-12-12 21:14:55 +00001496 }
1497
Sirish Pande11ebc4e2012-05-10 20:19:54 +00001498 if (!Args.hasArg(options::OPT_fno_short_enums))
1499 CmdArgs.push_back("-fshort-enums");
1500 if (Args.getLastArg(options::OPT_mieee_rnd_near)) {
1501 CmdArgs.push_back ("-mllvm");
1502 CmdArgs.push_back ("-enable-hexagon-ieee-rnd-near");
1503 }
Tony Linthicum76329bf2011-12-12 21:14:55 +00001504 CmdArgs.push_back ("-mllvm");
1505 CmdArgs.push_back ("-machine-sink-split=0");
1506}
1507
Rafael Espindola28e1f4b2013-08-21 16:39:20 +00001508static void getAArch64TargetFeatures(const Driver &D, const ArgList &Args,
1509 std::vector<const char *> &Features) {
Tim Northover2fe823a2013-08-01 09:23:19 +00001510 // Honor -mfpu=.
1511 if (const Arg *A = Args.getLastArg(options::OPT_mfpu_EQ))
Amara Emerson4cdb87b2013-10-01 10:20:54 +00001512 getAArch64FPUFeatures(D, A, Args, Features);
Jiangning Liub19c5b62014-02-14 04:37:46 +00001513 else
1514 Features.push_back("+neon");
Amara Emerson04e2ecf2014-01-23 15:48:30 +00001515
1516 if (Args.getLastArg(options::OPT_mgeneral_regs_only)) {
1517 Features.push_back("-fp-armv8");
1518 Features.push_back("-crypto");
1519 Features.push_back("-neon");
1520 }
Rafael Espindola28e1f4b2013-08-21 16:39:20 +00001521}
1522
1523static void getTargetFeatures(const Driver &D, const llvm::Triple &Triple,
Rafael Espindola9c6fb0f2013-11-23 14:36:40 +00001524 const ArgList &Args, ArgStringList &CmdArgs,
1525 bool ForAS) {
Rafael Espindola28e1f4b2013-08-21 16:39:20 +00001526 std::vector<const char *> Features;
1527 switch (Triple.getArch()) {
1528 default:
1529 break;
1530 case llvm::Triple::mips:
1531 case llvm::Triple::mipsel:
1532 case llvm::Triple::mips64:
1533 case llvm::Triple::mips64el:
1534 getMIPSTargetFeatures(D, Args, Features);
1535 break;
1536
1537 case llvm::Triple::arm:
Christian Pirkerf01cd6f2014-03-28 14:40:46 +00001538 case llvm::Triple::armeb:
Rafael Espindola28e1f4b2013-08-21 16:39:20 +00001539 case llvm::Triple::thumb:
Christian Pirkerf01cd6f2014-03-28 14:40:46 +00001540 case llvm::Triple::thumbeb:
Rafael Espindola9c6fb0f2013-11-23 14:36:40 +00001541 getARMTargetFeatures(D, Triple, Args, Features, ForAS);
Rafael Espindola28e1f4b2013-08-21 16:39:20 +00001542 break;
1543
1544 case llvm::Triple::ppc:
1545 case llvm::Triple::ppc64:
1546 case llvm::Triple::ppc64le:
1547 getPPCTargetFeatures(Args, Features);
1548 break;
1549 case llvm::Triple::sparc:
1550 getSparcTargetFeatures(Args, Features);
1551 break;
1552 case llvm::Triple::aarch64:
Christian Pirker9b019ae2014-02-25 13:51:00 +00001553 case llvm::Triple::aarch64_be:
Rafael Espindola28e1f4b2013-08-21 16:39:20 +00001554 getAArch64TargetFeatures(D, Args, Features);
1555 break;
1556 case llvm::Triple::x86:
1557 case llvm::Triple::x86_64:
Jim Grosbach82eee262013-11-16 00:53:35 +00001558 getX86TargetFeatures(Triple, Args, Features);
Rafael Espindola28e1f4b2013-08-21 16:39:20 +00001559 break;
1560 }
Rafael Espindola43964802013-08-21 17:34:32 +00001561
1562 // Find the last of each feature.
1563 llvm::StringMap<unsigned> LastOpt;
1564 for (unsigned I = 0, N = Features.size(); I < N; ++I) {
1565 const char *Name = Features[I];
1566 assert(Name[0] == '-' || Name[0] == '+');
1567 LastOpt[Name + 1] = I;
1568 }
1569
1570 for (unsigned I = 0, N = Features.size(); I < N; ++I) {
1571 // If this feature was overridden, ignore it.
1572 const char *Name = Features[I];
1573 llvm::StringMap<unsigned>::iterator LastI = LastOpt.find(Name + 1);
1574 assert(LastI != LastOpt.end());
1575 unsigned Last = LastI->second;
1576 if (Last != I)
1577 continue;
1578
Rafael Espindola28e1f4b2013-08-21 16:39:20 +00001579 CmdArgs.push_back("-target-feature");
Rafael Espindola43964802013-08-21 17:34:32 +00001580 CmdArgs.push_back(Name);
Rafael Espindola28e1f4b2013-08-21 16:39:20 +00001581 }
Tim Northover2fe823a2013-08-01 09:23:19 +00001582}
1583
Eric Christopher84fbdb42011-08-19 00:30:14 +00001584static bool
John McCall5fb5df92012-06-20 06:18:46 +00001585shouldUseExceptionTablesForObjCExceptions(const ObjCRuntime &runtime,
Anders Carlsson246ff3f2011-02-28 00:44:51 +00001586 const llvm::Triple &Triple) {
1587 // We use the zero-cost exception tables for Objective-C if the non-fragile
1588 // ABI is enabled or when compiling for x86_64 and ARM on Snow Leopard and
1589 // later.
John McCall5fb5df92012-06-20 06:18:46 +00001590 if (runtime.isNonFragile())
Anders Carlsson246ff3f2011-02-28 00:44:51 +00001591 return true;
1592
Bob Wilson83e723a2013-12-05 19:38:42 +00001593 if (!Triple.isMacOSX())
Anders Carlsson246ff3f2011-02-28 00:44:51 +00001594 return false;
1595
Eric Christopherbf15d2b2011-07-02 00:20:22 +00001596 return (!Triple.isMacOSXVersionLT(10,5) &&
Anders Carlsson246ff3f2011-02-28 00:44:51 +00001597 (Triple.getArch() == llvm::Triple::x86_64 ||
Eric Christopher84fbdb42011-08-19 00:30:14 +00001598 Triple.getArch() == llvm::Triple::arm));
Anders Carlsson246ff3f2011-02-28 00:44:51 +00001599}
1600
Robert Lyttonf7e03c12014-02-13 10:34:44 +00001601namespace {
1602 struct ExceptionSettings {
1603 bool ExceptionsEnabled;
1604 bool ShouldUseExceptionTables;
1605 ExceptionSettings() : ExceptionsEnabled(false),
1606 ShouldUseExceptionTables(false) {}
1607 };
1608} // end anonymous namespace.
1609
Robert Lytton694f8842014-02-13 10:38:56 +00001610// exceptionSettings() exists to share the logic between -cc1 and linker invocations.
Robert Lyttonf7e03c12014-02-13 10:34:44 +00001611static ExceptionSettings exceptionSettings(const ArgList &Args,
1612 const llvm::Triple &Triple) {
1613 ExceptionSettings ES;
1614
1615 // Are exceptions enabled by default?
1616 ES.ExceptionsEnabled = (Triple.getArch() != llvm::Triple::xcore);
1617
1618 // This keeps track of whether exceptions were explicitly turned on or off.
1619 bool DidHaveExplicitExceptionFlag = false;
1620
1621 if (Arg *A = Args.getLastArg(options::OPT_fexceptions,
1622 options::OPT_fno_exceptions)) {
1623 if (A->getOption().matches(options::OPT_fexceptions))
1624 ES.ExceptionsEnabled = true;
1625 else
1626 ES.ExceptionsEnabled = false;
1627
1628 DidHaveExplicitExceptionFlag = true;
1629 }
1630
1631 // Exception tables and cleanups can be enabled with -fexceptions even if the
1632 // language itself doesn't support exceptions.
1633 if (ES.ExceptionsEnabled && DidHaveExplicitExceptionFlag)
1634 ES.ShouldUseExceptionTables = true;
1635
1636 return ES;
1637}
1638
Anders Carlssone96ab552011-02-28 02:27:16 +00001639/// addExceptionArgs - Adds exception related arguments to the driver command
1640/// arguments. There's a master flag, -fexceptions and also language specific
1641/// flags to enable/disable C++ and Objective-C exceptions.
1642/// This makes it possible to for example disable C++ exceptions but enable
1643/// Objective-C exceptions.
1644static void addExceptionArgs(const ArgList &Args, types::ID InputType,
1645 const llvm::Triple &Triple,
Fariborz Jahanianb2482212012-04-04 18:28:00 +00001646 bool KernelOrKext,
John McCall5fb5df92012-06-20 06:18:46 +00001647 const ObjCRuntime &objcRuntime,
Anders Carlssone96ab552011-02-28 02:27:16 +00001648 ArgStringList &CmdArgs) {
Chad Rosier4fab82c2012-03-26 22:04:46 +00001649 if (KernelOrKext) {
1650 // -mkernel and -fapple-kext imply no exceptions, so claim exception related
1651 // arguments now to avoid warnings about unused arguments.
1652 Args.ClaimAllArgs(options::OPT_fexceptions);
1653 Args.ClaimAllArgs(options::OPT_fno_exceptions);
1654 Args.ClaimAllArgs(options::OPT_fobjc_exceptions);
1655 Args.ClaimAllArgs(options::OPT_fno_objc_exceptions);
1656 Args.ClaimAllArgs(options::OPT_fcxx_exceptions);
1657 Args.ClaimAllArgs(options::OPT_fno_cxx_exceptions);
Anders Carlssone96ab552011-02-28 02:27:16 +00001658 return;
Chad Rosier4fab82c2012-03-26 22:04:46 +00001659 }
Anders Carlssone96ab552011-02-28 02:27:16 +00001660
Robert Lyttonf7e03c12014-02-13 10:34:44 +00001661 // Gather the exception settings from the command line arguments.
1662 ExceptionSettings ES = exceptionSettings(Args, Triple);
Daniel Dunbar30a12b82010-09-14 23:12:31 +00001663
Daniel Dunbarc44f8cf2011-03-17 23:28:31 +00001664 // Obj-C exceptions are enabled by default, regardless of -fexceptions. This
1665 // is not necessarily sensible, but follows GCC.
1666 if (types::isObjC(InputType) &&
Eric Christopher84fbdb42011-08-19 00:30:14 +00001667 Args.hasFlag(options::OPT_fobjc_exceptions,
Daniel Dunbarc44f8cf2011-03-17 23:28:31 +00001668 options::OPT_fno_objc_exceptions,
1669 true)) {
1670 CmdArgs.push_back("-fobjc-exceptions");
Anders Carlssone96ab552011-02-28 02:27:16 +00001671
Robert Lyttonf7e03c12014-02-13 10:34:44 +00001672 ES.ShouldUseExceptionTables |=
John McCall5fb5df92012-06-20 06:18:46 +00001673 shouldUseExceptionTablesForObjCExceptions(objcRuntime, Triple);
Anders Carlssone96ab552011-02-28 02:27:16 +00001674 }
1675
1676 if (types::isCXX(InputType)) {
Robert Lyttonf7e03c12014-02-13 10:34:44 +00001677 bool CXXExceptionsEnabled = ES.ExceptionsEnabled;
Anders Carlssone96ab552011-02-28 02:27:16 +00001678
Eric Christopher84fbdb42011-08-19 00:30:14 +00001679 if (Arg *A = Args.getLastArg(options::OPT_fcxx_exceptions,
1680 options::OPT_fno_cxx_exceptions,
Anders Carlssone96ab552011-02-28 02:27:16 +00001681 options::OPT_fexceptions,
1682 options::OPT_fno_exceptions)) {
1683 if (A->getOption().matches(options::OPT_fcxx_exceptions))
1684 CXXExceptionsEnabled = true;
Chandler Carruth74f87112011-02-28 07:25:18 +00001685 else if (A->getOption().matches(options::OPT_fno_cxx_exceptions))
Anders Carlssone96ab552011-02-28 02:27:16 +00001686 CXXExceptionsEnabled = false;
1687 }
1688
1689 if (CXXExceptionsEnabled) {
1690 CmdArgs.push_back("-fcxx-exceptions");
1691
Robert Lyttonf7e03c12014-02-13 10:34:44 +00001692 ES.ShouldUseExceptionTables = true;
Anders Carlssone96ab552011-02-28 02:27:16 +00001693 }
1694 }
1695
Robert Lyttonf7e03c12014-02-13 10:34:44 +00001696 if (ES.ShouldUseExceptionTables)
Anders Carlssone96ab552011-02-28 02:27:16 +00001697 CmdArgs.push_back("-fexceptions");
Rafael Espindola00a66572009-10-01 13:33:33 +00001698}
1699
Daniel Dunbare246fbe2013-04-16 18:21:19 +00001700static bool ShouldDisableAutolink(const ArgList &Args,
1701 const ToolChain &TC) {
1702 bool Default = true;
1703 if (TC.getTriple().isOSDarwin()) {
1704 // The native darwin assembler doesn't support the linker_option directives,
1705 // so we disable them if we think the .s file will be passed to it.
1706 Default = TC.useIntegratedAs();
1707 }
1708 return !Args.hasFlag(options::OPT_fautolink, options::OPT_fno_autolink,
1709 Default);
1710}
1711
Rafael Espindola4cfa7972011-05-02 17:43:32 +00001712static bool ShouldDisableCFI(const ArgList &Args,
1713 const ToolChain &TC) {
Rafael Espindolac41db922012-03-08 14:39:55 +00001714 bool Default = true;
Bob Wilson6524dd32011-10-14 05:03:44 +00001715 if (TC.getTriple().isOSDarwin()) {
Rafael Espindolaf934f982011-05-17 16:26:17 +00001716 // The native darwin assembler doesn't support cfi directives, so
Rafael Espindola35ab91c2011-05-17 19:06:58 +00001717 // we disable them if we think the .s file will be passed to it.
Rafael Espindola84b588b2013-03-18 18:10:27 +00001718 Default = TC.useIntegratedAs();
Rafael Espindolaf934f982011-05-17 16:26:17 +00001719 }
Rafael Espindolac41db922012-03-08 14:39:55 +00001720 return !Args.hasFlag(options::OPT_fdwarf2_cfi_asm,
Eric Christopher45f2e712012-12-18 00:31:10 +00001721 options::OPT_fno_dwarf2_cfi_asm,
1722 Default);
Rafael Espindola4cfa7972011-05-02 17:43:32 +00001723}
1724
Ted Kremenek62093662013-03-12 17:02:12 +00001725static bool ShouldDisableDwarfDirectory(const ArgList &Args,
1726 const ToolChain &TC) {
Nick Lewycky1d617ac2011-10-17 23:05:52 +00001727 bool UseDwarfDirectory = Args.hasFlag(options::OPT_fdwarf_directory_asm,
1728 options::OPT_fno_dwarf_directory_asm,
Rafael Espindola84b588b2013-03-18 18:10:27 +00001729 TC.useIntegratedAs());
Nick Lewycky1d617ac2011-10-17 23:05:52 +00001730 return !UseDwarfDirectory;
1731}
1732
Joerg Sonnenbergeref317a22011-05-06 14:35:16 +00001733/// \brief Check whether the given input tree contains any compilation actions.
1734static bool ContainsCompileAction(const Action *A) {
Chris Lattner0e62c1c2011-07-23 10:55:15 +00001735 if (isa<CompileJobAction>(A))
Joerg Sonnenbergeref317a22011-05-06 14:35:16 +00001736 return true;
1737
1738 for (Action::const_iterator it = A->begin(), ie = A->end(); it != ie; ++it)
1739 if (ContainsCompileAction(*it))
1740 return true;
1741
1742 return false;
1743}
1744
1745/// \brief Check if -relax-all should be passed to the internal assembler.
1746/// This is done by default when compiling non-assembler source with -O0.
1747static bool UseRelaxAll(Compilation &C, const ArgList &Args) {
1748 bool RelaxDefault = true;
1749
1750 if (Arg *A = Args.getLastArg(options::OPT_O_Group))
1751 RelaxDefault = A->getOption().matches(options::OPT_O0);
1752
1753 if (RelaxDefault) {
1754 RelaxDefault = false;
1755 for (ActionList::const_iterator it = C.getActions().begin(),
1756 ie = C.getActions().end(); it != ie; ++it) {
1757 if (ContainsCompileAction(*it)) {
1758 RelaxDefault = true;
1759 break;
1760 }
1761 }
1762 }
1763
1764 return Args.hasFlag(options::OPT_mrelax_all, options::OPT_mno_relax_all,
1765 RelaxDefault);
1766}
1767
David Blaikie9260ed62013-07-25 21:19:01 +00001768static void CollectArgsForIntegratedAssembler(Compilation &C,
1769 const ArgList &Args,
1770 ArgStringList &CmdArgs,
1771 const Driver &D) {
1772 if (UseRelaxAll(C, Args))
1773 CmdArgs.push_back("-mrelax-all");
1774
David Peixottodfb66142013-11-14 22:52:58 +00001775 // When passing -I arguments to the assembler we sometimes need to
David Peixotto4afe0792013-11-14 22:58:17 +00001776 // unconditionally take the next argument. For example, when parsing
David Peixottodfb66142013-11-14 22:52:58 +00001777 // '-Wa,-I -Wa,foo' we need to accept the -Wa,foo arg after seeing the
1778 // -Wa,-I arg and when parsing '-Wa,-I,foo' we need to accept the 'foo'
1779 // arg after parsing the '-I' arg.
1780 bool TakeNextArg = false;
1781
David Blaikie9260ed62013-07-25 21:19:01 +00001782 // When using an integrated assembler, translate -Wa, and -Xassembler
1783 // options.
David Blaikie7e2fd942014-03-27 20:47:30 +00001784 bool CompressDebugSections = false;
David Blaikie9260ed62013-07-25 21:19:01 +00001785 for (arg_iterator it = Args.filtered_begin(options::OPT_Wa_COMMA,
1786 options::OPT_Xassembler),
1787 ie = Args.filtered_end(); it != ie; ++it) {
1788 const Arg *A = *it;
1789 A->claim();
1790
1791 for (unsigned i = 0, e = A->getNumValues(); i != e; ++i) {
1792 StringRef Value = A->getValue(i);
David Peixottodfb66142013-11-14 22:52:58 +00001793 if (TakeNextArg) {
1794 CmdArgs.push_back(Value.data());
1795 TakeNextArg = false;
1796 continue;
1797 }
David Blaikie9260ed62013-07-25 21:19:01 +00001798
1799 if (Value == "-force_cpusubtype_ALL") {
1800 // Do nothing, this is the default and we don't support anything else.
1801 } else if (Value == "-L") {
1802 CmdArgs.push_back("-msave-temp-labels");
1803 } else if (Value == "--fatal-warnings") {
1804 CmdArgs.push_back("-mllvm");
1805 CmdArgs.push_back("-fatal-assembler-warnings");
1806 } else if (Value == "--noexecstack") {
1807 CmdArgs.push_back("-mnoexecstack");
David Blaikieec59e752014-01-22 19:22:21 +00001808 } else if (Value == "-compress-debug-sections" ||
1809 Value == "--compress-debug-sections") {
David Blaikie7e2fd942014-03-27 20:47:30 +00001810 CompressDebugSections = true;
1811 } else if (Value == "-nocompress-debug-sections" ||
1812 Value == "--nocompress-debug-sections") {
1813 CompressDebugSections = false;
David Peixottodfb66142013-11-14 22:52:58 +00001814 } else if (Value.startswith("-I")) {
1815 CmdArgs.push_back(Value.data());
1816 // We need to consume the next argument if the current arg is a plain
1817 // -I. The next arg will be the include directory.
1818 if (Value == "-I")
1819 TakeNextArg = true;
David Blaikie9260ed62013-07-25 21:19:01 +00001820 } else {
1821 D.Diag(diag::err_drv_unsupported_option_argument)
1822 << A->getOption().getName() << Value;
1823 }
1824 }
1825 }
David Blaikie7e2fd942014-03-27 20:47:30 +00001826 if (CompressDebugSections)
1827 CmdArgs.push_back("-compress-debug-sections");
David Blaikie9260ed62013-07-25 21:19:01 +00001828}
1829
Renato Goline807c122014-01-31 11:47:28 +00001830// Until ARM libraries are build separately, we have them all in one library
1831static StringRef getArchNameForCompilerRTLib(const ToolChain &TC) {
Christian Pirkerf01cd6f2014-03-28 14:40:46 +00001832 if (TC.getArch() == llvm::Triple::arm ||
1833 TC.getArch() == llvm::Triple::armeb)
Renato Goline807c122014-01-31 11:47:28 +00001834 return "arm";
1835 else
1836 return TC.getArchName();
1837}
1838
Alexey Samsonovce8ab102014-02-25 12:43:43 +00001839static SmallString<128> getCompilerRTLibDir(const ToolChain &TC) {
1840 // The runtimes are located in the OS-specific resource directory.
1841 SmallString<128> Res(TC.getDriver().ResourceDir);
Viktor Kutuzovaa5b5f72014-03-18 09:36:50 +00001842 const llvm::Triple &Triple = TC.getTriple();
1843 // TC.getOS() yield "freebsd10.0" whereas "freebsd" is expected.
1844 StringRef OSLibName = (Triple.getOS() == llvm::Triple::FreeBSD) ?
1845 "freebsd" : TC.getOS();
1846 llvm::sys::path::append(Res, "lib", OSLibName);
Alexey Samsonovce8ab102014-02-25 12:43:43 +00001847 return Res;
Alexey Samsonov7811d192014-02-20 13:57:37 +00001848}
1849
Renato Golinc4b49242014-02-13 10:01:16 +00001850// This adds the static libclang_rt.arch.a directly to the command line
1851// FIXME: Make sure we can also emit shared objects if they're requested
1852// and available, check for possible errors, etc.
1853static void addClangRTLinux(
1854 const ToolChain &TC, const ArgList &Args, ArgStringList &CmdArgs) {
Alexey Samsonovce8ab102014-02-25 12:43:43 +00001855 SmallString<128> LibClangRT = getCompilerRTLibDir(TC);
1856 llvm::sys::path::append(LibClangRT,
Renato Golinc4b49242014-02-13 10:01:16 +00001857 Twine("libclang_rt.") + getArchNameForCompilerRTLib(TC) + ".a");
1858
Alexey Samsonovce8ab102014-02-25 12:43:43 +00001859 CmdArgs.push_back(Args.MakeArgString(LibClangRT));
Renato Golinc4b49242014-02-13 10:01:16 +00001860 CmdArgs.push_back("-lgcc_s");
1861 if (TC.getDriver().CCCIsCXX())
1862 CmdArgs.push_back("-lgcc_eh");
1863}
1864
Alexey Samsonov7811d192014-02-20 13:57:37 +00001865static void addProfileRT(
Chandler Carruth36381702013-06-23 11:28:48 +00001866 const ToolChain &TC, const ArgList &Args, ArgStringList &CmdArgs) {
1867 if (!(Args.hasArg(options::OPT_fprofile_arcs) ||
1868 Args.hasArg(options::OPT_fprofile_generate) ||
Justin Bogner6a9d2cf2014-01-06 22:27:36 +00001869 Args.hasArg(options::OPT_fprofile_instr_generate) ||
Chandler Carruth36381702013-06-23 11:28:48 +00001870 Args.hasArg(options::OPT_fcreate_profile) ||
1871 Args.hasArg(options::OPT_coverage)))
1872 return;
1873
Alexey Samsonovce8ab102014-02-25 12:43:43 +00001874 SmallString<128> LibProfile = getCompilerRTLibDir(TC);
1875 llvm::sys::path::append(LibProfile,
Renato Goline807c122014-01-31 11:47:28 +00001876 Twine("libclang_rt.profile-") + getArchNameForCompilerRTLib(TC) + ".a");
Chandler Carruth36381702013-06-23 11:28:48 +00001877
Duncan P. N. Exon Smith2d8f93e2014-03-28 17:53:17 +00001878 CmdArgs.push_back(Args.MakeArgString(LibProfile));
Chandler Carruth36381702013-06-23 11:28:48 +00001879}
1880
Alexey Samsonovce8ab102014-02-25 12:43:43 +00001881static void addSanitizerRTLinkFlags(
Alexey Samsonovbfb0cd32013-02-27 11:14:55 +00001882 const ToolChain &TC, const ArgList &Args, ArgStringList &CmdArgs,
Richard Smithf3e624c2013-03-23 00:30:08 +00001883 const StringRef Sanitizer, bool BeforeLibStdCXX,
1884 bool ExportSymbols = true) {
Alexey Samsonovce8ab102014-02-25 12:43:43 +00001885 // Sanitizer runtime has name "libclang_rt.<Sanitizer>-<ArchName>.a".
1886 SmallString<128> LibSanitizer = getCompilerRTLibDir(TC);
1887 llvm::sys::path::append(LibSanitizer,
1888 (Twine("libclang_rt.") + Sanitizer + "-" +
1889 getArchNameForCompilerRTLib(TC) + ".a"));
Richard Smithcff3cde2013-03-20 23:49:07 +00001890
Alexey Samsonovbfb0cd32013-02-27 11:14:55 +00001891 // Sanitizer runtime may need to come before -lstdc++ (or -lc++, libstdc++.a,
1892 // etc.) so that the linker picks custom versions of the global 'operator
1893 // new' and 'operator delete' symbols. We take the extreme (but simple)
Peter Collingbournef7ef3fd812013-10-20 21:29:13 +00001894 // strategy of inserting it at the front of the link command. It also
1895 // needs to be forced to end up in the executable, so wrap it in
1896 // whole-archive.
Richard Smithcff3cde2013-03-20 23:49:07 +00001897 SmallVector<const char *, 3> LibSanitizerArgs;
Peter Collingbournef7ef3fd812013-10-20 21:29:13 +00001898 LibSanitizerArgs.push_back("-whole-archive");
Richard Smithcff3cde2013-03-20 23:49:07 +00001899 LibSanitizerArgs.push_back(Args.MakeArgString(LibSanitizer));
Peter Collingbournef7ef3fd812013-10-20 21:29:13 +00001900 LibSanitizerArgs.push_back("-no-whole-archive");
Richard Smithcff3cde2013-03-20 23:49:07 +00001901
1902 CmdArgs.insert(BeforeLibStdCXX ? CmdArgs.begin() : CmdArgs.end(),
1903 LibSanitizerArgs.begin(), LibSanitizerArgs.end());
1904
Alexey Samsonovbfb0cd32013-02-27 11:14:55 +00001905 CmdArgs.push_back("-lpthread");
Evgeniy Stepanov758b5072013-05-24 14:28:03 +00001906 CmdArgs.push_back("-lrt");
Evgeniy Stepanov4ae68462013-10-29 19:48:47 +00001907 CmdArgs.push_back("-lm");
Viktor Kutuzovaa5b5f72014-03-18 09:36:50 +00001908 // There's no libdl on FreeBSD.
1909 if (TC.getTriple().getOS() != llvm::Triple::FreeBSD)
1910 CmdArgs.push_back("-ldl");
Richard Smithf3e624c2013-03-23 00:30:08 +00001911
1912 // If possible, use a dynamic symbols file to export the symbols from the
1913 // runtime library. If we can't do so, use -export-dynamic instead to export
1914 // all symbols from the binary.
1915 if (ExportSymbols) {
1916 if (llvm::sys::fs::exists(LibSanitizer + ".syms"))
1917 CmdArgs.push_back(
1918 Args.MakeArgString("--dynamic-list=" + LibSanitizer + ".syms"));
1919 else
1920 CmdArgs.push_back("-export-dynamic");
1921 }
Alexey Samsonovbfb0cd32013-02-27 11:14:55 +00001922}
1923
Kostya Serebryany7bca6c22011-11-30 01:39:16 +00001924/// If AddressSanitizer is enabled, add appropriate linker flags (Linux).
1925/// This needs to be called before we add the C run-time (malloc, etc).
Alexey Samsonovce8ab102014-02-25 12:43:43 +00001926static void addAsanRT(const ToolChain &TC, const ArgList &Args,
1927 ArgStringList &CmdArgs) {
Nick Lewycky609dd662013-10-11 03:33:53 +00001928 if (TC.getTriple().getEnvironment() == llvm::Triple::Android) {
Alexey Samsonovce8ab102014-02-25 12:43:43 +00001929 SmallString<128> LibAsan = getCompilerRTLibDir(TC);
1930 llvm::sys::path::append(LibAsan,
1931 (Twine("libclang_rt.asan-") +
1932 getArchNameForCompilerRTLib(TC) + "-android.so"));
Matt Beaumont-Gay35439df2012-12-04 21:18:26 +00001933 CmdArgs.insert(CmdArgs.begin(), Args.MakeArgString(LibAsan));
Evgeniy Stepanov77866712012-04-25 08:59:22 +00001934 } else {
Sergey Matveev1814e9e2013-05-27 11:17:01 +00001935 if (!Args.hasArg(options::OPT_shared))
Alexey Samsonovce8ab102014-02-25 12:43:43 +00001936 addSanitizerRTLinkFlags(TC, Args, CmdArgs, "asan", true);
Evgeniy Stepanov77866712012-04-25 08:59:22 +00001937 }
Kostya Serebryany7bca6c22011-11-30 01:39:16 +00001938}
1939
Kostya Serebryany66e8fab2012-05-16 06:36:00 +00001940/// If ThreadSanitizer is enabled, add appropriate linker flags (Linux).
1941/// This needs to be called before we add the C run-time (malloc, etc).
Alexey Samsonovce8ab102014-02-25 12:43:43 +00001942static void addTsanRT(const ToolChain &TC, const ArgList &Args,
1943 ArgStringList &CmdArgs) {
Sergey Matveev1814e9e2013-05-27 11:17:01 +00001944 if (!Args.hasArg(options::OPT_shared))
Alexey Samsonovce8ab102014-02-25 12:43:43 +00001945 addSanitizerRTLinkFlags(TC, Args, CmdArgs, "tsan", true);
Kostya Serebryany66e8fab2012-05-16 06:36:00 +00001946}
1947
Evgeniy Stepanovaea92e52012-12-03 13:20:43 +00001948/// If MemorySanitizer is enabled, add appropriate linker flags (Linux).
1949/// This needs to be called before we add the C run-time (malloc, etc).
Alexey Samsonovce8ab102014-02-25 12:43:43 +00001950static void addMsanRT(const ToolChain &TC, const ArgList &Args,
1951 ArgStringList &CmdArgs) {
Sergey Matveev1814e9e2013-05-27 11:17:01 +00001952 if (!Args.hasArg(options::OPT_shared))
Alexey Samsonovce8ab102014-02-25 12:43:43 +00001953 addSanitizerRTLinkFlags(TC, Args, CmdArgs, "msan", true);
Sergey Matveev1814e9e2013-05-27 11:17:01 +00001954}
1955
1956/// If LeakSanitizer is enabled, add appropriate linker flags (Linux).
1957/// This needs to be called before we add the C run-time (malloc, etc).
Alexey Samsonovce8ab102014-02-25 12:43:43 +00001958static void addLsanRT(const ToolChain &TC, const ArgList &Args,
1959 ArgStringList &CmdArgs) {
Sergey Matveev1814e9e2013-05-27 11:17:01 +00001960 if (!Args.hasArg(options::OPT_shared))
Alexey Samsonovce8ab102014-02-25 12:43:43 +00001961 addSanitizerRTLinkFlags(TC, Args, CmdArgs, "lsan", true);
Evgeniy Stepanovaea92e52012-12-03 13:20:43 +00001962}
1963
Richard Smithe30752c2012-10-09 19:52:38 +00001964/// If UndefinedBehaviorSanitizer is enabled, add appropriate linker flags
1965/// (Linux).
Alexey Samsonovce8ab102014-02-25 12:43:43 +00001966static void addUbsanRT(const ToolChain &TC, const ArgList &Args,
1967 ArgStringList &CmdArgs, bool IsCXX,
1968 bool HasOtherSanitizerRt) {
Nick Lewycky24921692013-10-19 00:27:23 +00001969 // Need a copy of sanitizer_common. This could come from another sanitizer
1970 // runtime; if we're not including one, include our own copy.
1971 if (!HasOtherSanitizerRt)
Alexey Samsonovce8ab102014-02-25 12:43:43 +00001972 addSanitizerRTLinkFlags(TC, Args, CmdArgs, "san", true, false);
Peter Collingbournef7ef3fd812013-10-20 21:29:13 +00001973
Alexey Samsonovce8ab102014-02-25 12:43:43 +00001974 addSanitizerRTLinkFlags(TC, Args, CmdArgs, "ubsan", false);
Peter Collingbournef7ef3fd812013-10-20 21:29:13 +00001975
1976 // Only include the bits of the runtime which need a C++ ABI library if
1977 // we're linking in C++ mode.
1978 if (IsCXX)
Alexey Samsonovce8ab102014-02-25 12:43:43 +00001979 addSanitizerRTLinkFlags(TC, Args, CmdArgs, "ubsan_cxx", false);
Richard Smithe30752c2012-10-09 19:52:38 +00001980}
1981
Alexey Samsonovce8ab102014-02-25 12:43:43 +00001982static void addDfsanRT(const ToolChain &TC, const ArgList &Args,
1983 ArgStringList &CmdArgs) {
Peter Collingbournec3772752013-08-07 22:47:34 +00001984 if (!Args.hasArg(options::OPT_shared))
Alexey Samsonovce8ab102014-02-25 12:43:43 +00001985 addSanitizerRTLinkFlags(TC, Args, CmdArgs, "dfsan", true);
1986}
1987
1988// Should be called before we add C++ ABI library.
1989static void addSanitizerRuntimes(const ToolChain &TC, const ArgList &Args,
1990 ArgStringList &CmdArgs) {
1991 const SanitizerArgs &Sanitize = TC.getSanitizerArgs();
1992 const Driver &D = TC.getDriver();
1993 if (Sanitize.needsUbsanRt())
1994 addUbsanRT(TC, Args, CmdArgs, D.CCCIsCXX(),
1995 Sanitize.needsAsanRt() || Sanitize.needsTsanRt() ||
1996 Sanitize.needsMsanRt() || Sanitize.needsLsanRt());
1997 if (Sanitize.needsAsanRt())
1998 addAsanRT(TC, Args, CmdArgs);
1999 if (Sanitize.needsTsanRt())
2000 addTsanRT(TC, Args, CmdArgs);
2001 if (Sanitize.needsMsanRt())
2002 addMsanRT(TC, Args, CmdArgs);
2003 if (Sanitize.needsLsanRt())
2004 addLsanRT(TC, Args, CmdArgs);
2005 if (Sanitize.needsDfsanRt())
2006 addDfsanRT(TC, Args, CmdArgs);
Peter Collingbournec3772752013-08-07 22:47:34 +00002007}
2008
Benjamin Kramer34cb0432013-10-16 17:42:39 +00002009static bool shouldUseFramePointerForTarget(const ArgList &Args,
2010 const llvm::Triple &Triple) {
2011 switch (Triple.getArch()) {
2012 // Don't use a frame pointer on linux if optimizing for certain targets.
2013 case llvm::Triple::mips64:
2014 case llvm::Triple::mips64el:
2015 case llvm::Triple::mips:
2016 case llvm::Triple::mipsel:
2017 case llvm::Triple::systemz:
2018 case llvm::Triple::x86:
2019 case llvm::Triple::x86_64:
2020 if (Triple.isOSLinux())
2021 if (Arg *A = Args.getLastArg(options::OPT_O_Group))
2022 if (!A->getOption().matches(options::OPT_O0))
2023 return false;
2024 return true;
2025 case llvm::Triple::xcore:
2026 return false;
2027 default:
2028 return true;
2029 }
2030}
2031
Rafael Espindola224dd632011-12-14 21:02:23 +00002032static bool shouldUseFramePointer(const ArgList &Args,
2033 const llvm::Triple &Triple) {
2034 if (Arg *A = Args.getLastArg(options::OPT_fno_omit_frame_pointer,
2035 options::OPT_fomit_frame_pointer))
2036 return A->getOption().matches(options::OPT_fno_omit_frame_pointer);
2037
Benjamin Kramer34cb0432013-10-16 17:42:39 +00002038 return shouldUseFramePointerForTarget(Args, Triple);
Rafael Espindola224dd632011-12-14 21:02:23 +00002039}
2040
Eric Christopherb7d97e92013-04-03 01:58:53 +00002041static bool shouldUseLeafFramePointer(const ArgList &Args,
2042 const llvm::Triple &Triple) {
2043 if (Arg *A = Args.getLastArg(options::OPT_mno_omit_leaf_frame_pointer,
2044 options::OPT_momit_leaf_frame_pointer))
2045 return A->getOption().matches(options::OPT_mno_omit_leaf_frame_pointer);
2046
Benjamin Kramer34cb0432013-10-16 17:42:39 +00002047 return shouldUseFramePointerForTarget(Args, Triple);
Eric Christopherb7d97e92013-04-03 01:58:53 +00002048}
2049
Rafael Espindolac7367ff2013-08-10 01:40:10 +00002050/// Add a CC1 option to specify the debug compilation directory.
Chandler Carruth4d5e1a92012-12-17 21:40:04 +00002051static void addDebugCompDirArg(const ArgList &Args, ArgStringList &CmdArgs) {
Benjamin Kramer698d7c82013-04-27 08:12:29 +00002052 SmallString<128> cwd;
2053 if (!llvm::sys::fs::current_path(cwd)) {
Chad Rosiera35d5a32013-04-26 20:49:50 +00002054 CmdArgs.push_back("-fdebug-compilation-dir");
2055 CmdArgs.push_back(Args.MakeArgString(cwd));
Chandler Carruth4d5e1a92012-12-17 21:40:04 +00002056 }
2057}
2058
Eric Christopherd3804002013-02-22 20:12:52 +00002059static const char *SplitDebugName(const ArgList &Args,
2060 const InputInfoList &Inputs) {
2061 Arg *FinalOutput = Args.getLastArg(options::OPT_o);
2062 if (FinalOutput && Args.hasArg(options::OPT_c)) {
2063 SmallString<128> T(FinalOutput->getValue());
2064 llvm::sys::path::replace_extension(T, "dwo");
2065 return Args.MakeArgString(T);
2066 } else {
2067 // Use the compilation dir.
2068 SmallString<128> T(Args.getLastArgValue(options::OPT_fdebug_compilation_dir));
2069 SmallString<128> F(llvm::sys::path::stem(Inputs[0].getBaseInput()));
2070 llvm::sys::path::replace_extension(F, "dwo");
2071 T += F;
2072 return Args.MakeArgString(F);
2073 }
2074}
2075
2076static void SplitDebugInfo(const ToolChain &TC, Compilation &C,
2077 const Tool &T, const JobAction &JA,
2078 const ArgList &Args, const InputInfo &Output,
2079 const char *OutFile) {
Eric Christopher248357f2013-02-21 22:35:01 +00002080 ArgStringList ExtractArgs;
2081 ExtractArgs.push_back("--extract-dwo");
2082
2083 ArgStringList StripArgs;
2084 StripArgs.push_back("--strip-dwo");
2085
2086 // Grabbing the output of the earlier compile step.
2087 StripArgs.push_back(Output.getFilename());
2088 ExtractArgs.push_back(Output.getFilename());
Eric Christopher248357f2013-02-21 22:35:01 +00002089 ExtractArgs.push_back(OutFile);
2090
2091 const char *Exec =
Eric Christopherd3804002013-02-22 20:12:52 +00002092 Args.MakeArgString(TC.GetProgramPath("objcopy"));
Eric Christopher248357f2013-02-21 22:35:01 +00002093
2094 // First extract the dwo sections.
Eric Christopherd3804002013-02-22 20:12:52 +00002095 C.addCommand(new Command(JA, T, Exec, ExtractArgs));
Eric Christopher248357f2013-02-21 22:35:01 +00002096
2097 // Then remove them from the original .o file.
Eric Christopherd3804002013-02-22 20:12:52 +00002098 C.addCommand(new Command(JA, T, Exec, StripArgs));
Eric Christopher248357f2013-02-21 22:35:01 +00002099}
2100
Arnold Schwaighofer7f994ce2013-08-13 15:46:23 +00002101/// \brief Vectorize at all optimization levels greater than 1 except for -Oz.
2102static bool shouldEnableVectorizerAtOLevel(const ArgList &Args) {
2103 if (Arg *A = Args.getLastArg(options::OPT_O_Group)) {
Rafael Espindolaad70d962013-08-27 16:58:15 +00002104 if (A->getOption().matches(options::OPT_O4) ||
2105 A->getOption().matches(options::OPT_Ofast))
Arnold Schwaighofer7f994ce2013-08-13 15:46:23 +00002106 return true;
2107
2108 if (A->getOption().matches(options::OPT_O0))
2109 return false;
2110
2111 assert(A->getOption().matches(options::OPT_O) && "Must have a -O flag");
2112
Rafael Espindola91780de2013-08-26 14:05:41 +00002113 // Vectorize -Os.
Arnold Schwaighofer7f994ce2013-08-13 15:46:23 +00002114 StringRef S(A->getValue());
Rafael Espindola91780de2013-08-26 14:05:41 +00002115 if (S == "s")
Arnold Schwaighofer7f994ce2013-08-13 15:46:23 +00002116 return true;
2117
2118 // Don't vectorize -Oz.
2119 if (S == "z")
2120 return false;
2121
2122 unsigned OptLevel = 0;
2123 if (S.getAsInteger(10, OptLevel))
2124 return false;
2125
2126 return OptLevel > 1;
2127 }
2128
2129 return false;
2130}
2131
Ben Langmuir2cb4a782014-02-05 22:21:15 +00002132/// Add -x lang to \p CmdArgs for \p Input.
2133static void addDashXForInput(const ArgList &Args, const InputInfo &Input,
2134 ArgStringList &CmdArgs) {
2135 // When using -verify-pch, we don't want to provide the type
2136 // 'precompiled-header' if it was inferred from the file extension
2137 if (Args.hasArg(options::OPT_verify_pch) && Input.getType() == types::TY_PCH)
2138 return;
2139
2140 CmdArgs.push_back("-x");
2141 if (Args.hasArg(options::OPT_rewrite_objc))
2142 CmdArgs.push_back(types::getTypeName(types::TY_PP_ObjCXX));
2143 else
2144 CmdArgs.push_back(types::getTypeName(Input.getType()));
2145}
2146
Daniel Dunbar1a093d22009-03-18 06:00:36 +00002147void Clang::ConstructJob(Compilation &C, const JobAction &JA,
Daniel Dunbar04c4c2c2009-03-18 07:06:02 +00002148 const InputInfo &Output,
Daniel Dunbar0450e6d2009-03-18 06:07:59 +00002149 const InputInfoList &Inputs,
Daniel Dunbara2aedc62009-03-18 10:01:51 +00002150 const ArgList &Args,
Daniel Dunbar1a093d22009-03-18 06:00:36 +00002151 const char *LinkingOutput) const {
Daniel Dunbare46b52a2010-03-20 04:52:14 +00002152 bool KernelOrKext = Args.hasArg(options::OPT_mkernel,
2153 options::OPT_fapple_kext);
Daniel Dunbar083edf72009-12-21 18:54:17 +00002154 const Driver &D = getToolChain().getDriver();
Daniel Dunbara3246a02009-03-18 08:07:30 +00002155 ArgStringList CmdArgs;
2156
Saleem Abdulrasool377066a2014-03-27 22:50:18 +00002157 bool IsWindowsGNU = getToolChain().getTriple().isWindowsGNUEnvironment();
2158 bool IsWindowsCygnus = getToolChain().getTriple().isWindowsCygwinEnvironment();
2159 bool IsWindowsMSVC = getToolChain().getTriple().isWindowsMSVCEnvironment();
2160
Daniel Dunbare521a892009-03-31 20:53:55 +00002161 assert(Inputs.size() == 1 && "Unable to handle multiple inputs.");
2162
Daniel Dunbar6c536aa2009-12-11 23:00:49 +00002163 // Invoke ourselves in -cc1 mode.
2164 //
2165 // FIXME: Implement custom jobs for internal actions.
2166 CmdArgs.push_back("-cc1");
2167
Daniel Dunbar624c21b2009-10-30 18:12:20 +00002168 // Add the "effective" target triple.
Daniel Dunbard640be22009-03-31 17:35:15 +00002169 CmdArgs.push_back("-triple");
Daniel Dunbar82eb4ce2010-08-23 22:35:37 +00002170 std::string TripleStr = getToolChain().ComputeEffectiveClangTriple(Args);
Daniel Dunbar624c21b2009-10-30 18:12:20 +00002171 CmdArgs.push_back(Args.MakeArgString(TripleStr));
Daniel Dunbarfb58b0a2009-09-10 06:49:20 +00002172
Tim Northover336f1892014-03-29 13:16:12 +00002173 // Push all default warning arguments that are specific to
2174 // the given target. These come before user provided warning options
2175 // are provided.
2176 getToolChain().addClangWarningOptions(CmdArgs);
2177
Daniel Dunbar624c21b2009-10-30 18:12:20 +00002178 // Select the appropriate action.
John McCall5fb5df92012-06-20 06:18:46 +00002179 RewriteKind rewriteKind = RK_None;
Fariborz Jahanian7ebeede2012-04-04 18:50:28 +00002180
Daniel Dunbara2aedc62009-03-18 10:01:51 +00002181 if (isa<AnalyzeJobAction>(JA)) {
2182 assert(JA.getType() == types::TY_Plist && "Invalid output type.");
2183 CmdArgs.push_back("-analyze");
Ted Kremenekf7639e12012-03-06 20:06:33 +00002184 } else if (isa<MigrateJobAction>(JA)) {
2185 CmdArgs.push_back("-migrate");
Daniel Dunbara2aedc62009-03-18 10:01:51 +00002186 } else if (isa<PreprocessJobAction>(JA)) {
Daniel Dunbard67a3222009-03-30 06:36:42 +00002187 if (Output.getType() == types::TY_Dependencies)
2188 CmdArgs.push_back("-Eonly");
Fariborz Jahaniane0a75d62013-03-18 19:41:18 +00002189 else {
Daniel Dunbard67a3222009-03-30 06:36:42 +00002190 CmdArgs.push_back("-E");
Fariborz Jahaniane0a75d62013-03-18 19:41:18 +00002191 if (Args.hasArg(options::OPT_rewrite_objc) &&
2192 !Args.hasArg(options::OPT_g_Group))
2193 CmdArgs.push_back("-P");
2194 }
Daniel Dunbarc4343942010-02-03 03:07:56 +00002195 } else if (isa<AssembleJobAction>(JA)) {
2196 CmdArgs.push_back("-emit-obj");
Daniel Dunbar06e2cc32010-05-27 06:18:05 +00002197
David Blaikie9260ed62013-07-25 21:19:01 +00002198 CollectArgsForIntegratedAssembler(C, Args, CmdArgs, D);
Daniel Dunbar7c874332010-11-19 16:23:35 +00002199
2200 // Also ignore explicit -force_cpusubtype_ALL option.
2201 (void) Args.hasArg(options::OPT_force__cpusubtype__ALL);
Daniel Dunbara2aedc62009-03-18 10:01:51 +00002202 } else if (isa<PrecompileJobAction>(JA)) {
Argyrios Kyrtzidis90bdfbb2010-08-11 23:27:58 +00002203 // Use PCH if the user requested it.
Daniel Dunbarcbc34b72009-10-15 20:02:44 +00002204 bool UsePCH = D.CCCUsePCH;
Daniel Dunbarcbc34b72009-10-15 20:02:44 +00002205
Aaron Ballman1f10cc52012-07-31 01:21:00 +00002206 if (JA.getType() == types::TY_Nothing)
2207 CmdArgs.push_back("-fsyntax-only");
2208 else if (UsePCH)
Douglas Gregor111af7d2009-04-18 00:34:01 +00002209 CmdArgs.push_back("-emit-pch");
2210 else
2211 CmdArgs.push_back("-emit-pth");
Ben Langmuir9b9a8d32014-02-06 18:53:25 +00002212 } else if (isa<VerifyPCHJobAction>(JA)) {
2213 CmdArgs.push_back("-verify-pch");
Daniel Dunbara2aedc62009-03-18 10:01:51 +00002214 } else {
2215 assert(isa<CompileJobAction>(JA) && "Invalid action for clang tool.");
Daniel Dunbard067f7f2009-04-08 23:54:23 +00002216
Daniel Dunbara2aedc62009-03-18 10:01:51 +00002217 if (JA.getType() == types::TY_Nothing) {
Ben Langmuir9b9a8d32014-02-06 18:53:25 +00002218 CmdArgs.push_back("-fsyntax-only");
Daniel Dunbar24e52992010-06-07 23:28:45 +00002219 } else if (JA.getType() == types::TY_LLVM_IR ||
2220 JA.getType() == types::TY_LTO_IR) {
Daniel Dunbara2aedc62009-03-18 10:01:51 +00002221 CmdArgs.push_back("-emit-llvm");
Daniel Dunbar24e52992010-06-07 23:28:45 +00002222 } else if (JA.getType() == types::TY_LLVM_BC ||
2223 JA.getType() == types::TY_LTO_BC) {
Daniel Dunbara2aedc62009-03-18 10:01:51 +00002224 CmdArgs.push_back("-emit-llvm-bc");
2225 } else if (JA.getType() == types::TY_PP_Asm) {
Daniel Dunbard112f102009-09-17 00:47:53 +00002226 CmdArgs.push_back("-S");
Daniel Dunbar6cdf83c2009-09-01 16:57:46 +00002227 } else if (JA.getType() == types::TY_AST) {
2228 CmdArgs.push_back("-emit-pch");
Douglas Gregorbf7fc9c2013-03-27 16:47:18 +00002229 } else if (JA.getType() == types::TY_ModuleFile) {
2230 CmdArgs.push_back("-module-file-info");
Daniel Dunbaraeea8ac2010-02-11 03:16:21 +00002231 } else if (JA.getType() == types::TY_RewrittenObjC) {
2232 CmdArgs.push_back("-rewrite-objc");
John McCall5fb5df92012-06-20 06:18:46 +00002233 rewriteKind = RK_NonFragile;
Fariborz Jahanian73223bb2012-04-02 15:59:19 +00002234 } else if (JA.getType() == types::TY_RewrittenLegacyObjC) {
2235 CmdArgs.push_back("-rewrite-objc");
John McCall5fb5df92012-06-20 06:18:46 +00002236 rewriteKind = RK_Fragile;
Daniel Dunbaraeea8ac2010-02-11 03:16:21 +00002237 } else {
2238 assert(JA.getType() == types::TY_PP_Asm &&
2239 "Unexpected output type!");
Daniel Dunbara2aedc62009-03-18 10:01:51 +00002240 }
Daniel Dunbara3246a02009-03-18 08:07:30 +00002241 }
2242
Daniel Dunbara2aedc62009-03-18 10:01:51 +00002243 // The make clang go fast button.
2244 CmdArgs.push_back("-disable-free");
2245
John McCallbb79b5f2010-02-13 03:50:24 +00002246 // Disable the verification pass in -asserts builds.
2247#ifdef NDEBUG
2248 CmdArgs.push_back("-disable-llvm-verifier");
2249#endif
2250
Daniel Dunbar3b358a32009-04-08 05:11:16 +00002251 // Set the main file name, so that debug info works even with
2252 // -save-temps.
2253 CmdArgs.push_back("-main-file-name");
Bob Wilsondecc03e2012-11-23 06:14:39 +00002254 CmdArgs.push_back(getBaseInputName(Args, Inputs));
Daniel Dunbar3b358a32009-04-08 05:11:16 +00002255
Daniel Dunbar17ddaa62009-04-08 18:03:55 +00002256 // Some flags which affect the language (via preprocessor
Bob Wilsondecc03e2012-11-23 06:14:39 +00002257 // defines).
Daniel Dunbar17ddaa62009-04-08 18:03:55 +00002258 if (Args.hasArg(options::OPT_static))
2259 CmdArgs.push_back("-static-define");
2260
Daniel Dunbara2aedc62009-03-18 10:01:51 +00002261 if (isa<AnalyzeJobAction>(JA)) {
Ted Kremenek05e6f5b2009-09-25 05:55:59 +00002262 // Enable region store model by default.
2263 CmdArgs.push_back("-analyzer-store=region");
2264
Ted Kremenek7bea9a12009-12-07 22:26:14 +00002265 // Treat blocks as analysis entry points.
2266 CmdArgs.push_back("-analyzer-opt-analyze-nested-blocks");
2267
Ted Kremenek49c79792011-03-24 00:28:47 +00002268 CmdArgs.push_back("-analyzer-eagerly-assume");
2269
Daniel Dunbara2aedc62009-03-18 10:01:51 +00002270 // Add default argument set.
Daniel Dunbar58f345ce2009-05-22 00:38:15 +00002271 if (!Args.hasArg(options::OPT__analyzer_no_default_checks)) {
Argyrios Kyrtzidisa6d04d52011-02-15 07:42:33 +00002272 CmdArgs.push_back("-analyzer-checker=core");
Ted Kremenek49c79792011-03-24 00:28:47 +00002273
Saleem Abdulrasool377066a2014-03-27 22:50:18 +00002274 if (!IsWindowsMSVC)
Argyrios Kyrtzidisa6d04d52011-02-15 07:42:33 +00002275 CmdArgs.push_back("-analyzer-checker=unix");
Ted Kremenek49c79792011-03-24 00:28:47 +00002276
Argyrios Kyrtzidisa6d04d52011-02-15 07:42:33 +00002277 if (getToolChain().getTriple().getVendor() == llvm::Triple::Apple)
Ted Kremenek49c79792011-03-24 00:28:47 +00002278 CmdArgs.push_back("-analyzer-checker=osx");
Ted Kremenekb9ff6b22012-01-20 06:00:17 +00002279
2280 CmdArgs.push_back("-analyzer-checker=deadcode");
Ted Kremenek37e96522012-01-26 02:27:38 +00002281
Jordan Rose10ad0812013-04-05 17:55:07 +00002282 if (types::isCXX(Inputs[0].getType()))
2283 CmdArgs.push_back("-analyzer-checker=cplusplus");
2284
Ted Kremenek37e96522012-01-26 02:27:38 +00002285 // Enable the following experimental checkers for testing.
Ted Kremenek37e96522012-01-26 02:27:38 +00002286 CmdArgs.push_back("-analyzer-checker=security.insecureAPI.UncheckedReturn");
2287 CmdArgs.push_back("-analyzer-checker=security.insecureAPI.getpw");
2288 CmdArgs.push_back("-analyzer-checker=security.insecureAPI.gets");
2289 CmdArgs.push_back("-analyzer-checker=security.insecureAPI.mktemp");
2290 CmdArgs.push_back("-analyzer-checker=security.insecureAPI.mkstemp");
2291 CmdArgs.push_back("-analyzer-checker=security.insecureAPI.vfork");
Daniel Dunbar58f345ce2009-05-22 00:38:15 +00002292 }
Daniel Dunbard067f7f2009-04-08 23:54:23 +00002293
Daniel Dunbar58f345ce2009-05-22 00:38:15 +00002294 // Set the output format. The default is plist, for (lame) historical
2295 // reasons.
2296 CmdArgs.push_back("-analyzer-output");
2297 if (Arg *A = Args.getLastArg(options::OPT__analyzer_output))
Richard Smithbd55daf2012-11-01 04:30:05 +00002298 CmdArgs.push_back(A->getValue());
Daniel Dunbar58f345ce2009-05-22 00:38:15 +00002299 else
2300 CmdArgs.push_back("plist");
Daniel Dunbara2aedc62009-03-18 10:01:51 +00002301
Ted Kremenekfe449a22010-03-22 22:32:05 +00002302 // Disable the presentation of standard compiler warnings when
2303 // using --analyze. We only want to show static analyzer diagnostics
2304 // or frontend errors.
2305 CmdArgs.push_back("-w");
2306
Daniel Dunbara2aedc62009-03-18 10:01:51 +00002307 // Add -Xanalyzer arguments when running as analyzer.
2308 Args.AddAllArgValues(CmdArgs, options::OPT_Xanalyzer);
Mike Stump11289f42009-09-09 15:08:12 +00002309 }
2310
Daniel Dunbar4eadb602009-09-10 01:21:12 +00002311 CheckCodeGenerationOptions(D, Args);
2312
Peter Collingbourne54d770c2013-04-09 04:35:11 +00002313 bool PIE = getToolChain().isPIEDefault();
2314 bool PIC = PIE || getToolChain().isPICDefault();
Chandler Carruth76a943b2012-11-19 03:52:03 +00002315 bool IsPICLevelTwo = PIC;
Peter Collingbourne54d770c2013-04-09 04:35:11 +00002316
Alexey Bataev40e75222014-01-28 06:30:35 +00002317 // Android-specific defaults for PIC/PIE
2318 if (getToolChain().getTriple().getEnvironment() == llvm::Triple::Android) {
2319 switch (getToolChain().getTriple().getArch()) {
2320 case llvm::Triple::arm:
Christian Pirkerf01cd6f2014-03-28 14:40:46 +00002321 case llvm::Triple::armeb:
Alexey Bataev40e75222014-01-28 06:30:35 +00002322 case llvm::Triple::thumb:
Christian Pirkerf01cd6f2014-03-28 14:40:46 +00002323 case llvm::Triple::thumbeb:
Alexey Bataev40e75222014-01-28 06:30:35 +00002324 case llvm::Triple::mips:
2325 case llvm::Triple::mipsel:
2326 case llvm::Triple::mips64:
2327 case llvm::Triple::mips64el:
2328 PIC = true; // "-fpic"
2329 break;
2330
2331 case llvm::Triple::x86:
2332 case llvm::Triple::x86_64:
2333 PIC = true; // "-fPIC"
2334 IsPICLevelTwo = true;
2335 break;
2336
2337 default:
2338 break;
2339 }
2340 }
2341
Alexey Samsonov090301e2013-04-09 12:28:19 +00002342 // For the PIC and PIE flag options, this logic is different from the
2343 // legacy logic in very old versions of GCC, as that logic was just
2344 // a bug no one had ever fixed. This logic is both more rational and
2345 // consistent with GCC's new logic now that the bugs are fixed. The last
2346 // argument relating to either PIC or PIE wins, and no other argument is
2347 // used. If the last argument is any flavor of the '-fno-...' arguments,
2348 // both PIC and PIE are disabled. Any PIE option implicitly enables PIC
2349 // at the same level.
2350 Arg *LastPICArg =Args.getLastArg(options::OPT_fPIC, options::OPT_fno_PIC,
2351 options::OPT_fpic, options::OPT_fno_pic,
2352 options::OPT_fPIE, options::OPT_fno_PIE,
2353 options::OPT_fpie, options::OPT_fno_pie);
Chandler Carruth76a943b2012-11-19 03:52:03 +00002354 // Check whether the tool chain trumps the PIC-ness decision. If the PIC-ness
2355 // is forced, then neither PIC nor PIE flags will have no effect.
Peter Collingbourne54d770c2013-04-09 04:35:11 +00002356 if (!getToolChain().isPICDefaultForced()) {
Alexey Samsonov090301e2013-04-09 12:28:19 +00002357 if (LastPICArg) {
2358 Option O = LastPICArg->getOption();
Peter Collingbourne54d770c2013-04-09 04:35:11 +00002359 if (O.matches(options::OPT_fPIC) || O.matches(options::OPT_fpic) ||
2360 O.matches(options::OPT_fPIE) || O.matches(options::OPT_fpie)) {
2361 PIE = O.matches(options::OPT_fPIE) || O.matches(options::OPT_fpie);
2362 PIC = PIE || O.matches(options::OPT_fPIC) ||
2363 O.matches(options::OPT_fpic);
2364 IsPICLevelTwo = O.matches(options::OPT_fPIE) ||
2365 O.matches(options::OPT_fPIC);
2366 } else {
2367 PIE = PIC = false;
2368 }
2369 }
Chandler Carruthc0c04552012-04-08 16:40:35 +00002370 }
Chandler Carruth76a943b2012-11-19 03:52:03 +00002371
Nick Lewycky609dd662013-10-11 03:33:53 +00002372 // Introduce a Darwin-specific hack. If the default is PIC but the flags
Chandler Carruth76a943b2012-11-19 03:52:03 +00002373 // specified while enabling PIC enabled level 1 PIC, just force it back to
2374 // level 2 PIC instead. This matches the behavior of Darwin GCC (based on my
2375 // informal testing).
2376 if (PIC && getToolChain().getTriple().isOSDarwin())
2377 IsPICLevelTwo |= getToolChain().isPICDefault();
2378
Chandler Carruthc0c04552012-04-08 16:40:35 +00002379 // Note that these flags are trump-cards. Regardless of the order w.r.t. the
2380 // PIC or PIE options above, if these show up, PIC is disabled.
Daniel Dunbarbd847cc2012-10-15 22:23:53 +00002381 llvm::Triple Triple(TripleStr);
Tim Northovera2ee4332014-03-29 15:09:45 +00002382 if (KernelOrKext && (!Triple.isiOS() || Triple.isOSVersionLT(6) ||
2383 Triple.getArch() == llvm::Triple::arm64))
Chandler Carruth76a943b2012-11-19 03:52:03 +00002384 PIC = PIE = false;
Simon Atanasyaneeb6f272013-10-04 11:46:54 +00002385 if (Args.hasArg(options::OPT_static))
Chandler Carruth76a943b2012-11-19 03:52:03 +00002386 PIC = PIE = false;
Chandler Carruthc0c04552012-04-08 16:40:35 +00002387
Chandler Carruth76a943b2012-11-19 03:52:03 +00002388 if (Arg *A = Args.getLastArg(options::OPT_mdynamic_no_pic)) {
2389 // This is a very special mode. It trumps the other modes, almost no one
2390 // uses it, and it isn't even valid on any OS but Darwin.
2391 if (!getToolChain().getTriple().isOSDarwin())
2392 D.Diag(diag::err_drv_unsupported_opt_for_target)
2393 << A->getSpelling() << getToolChain().getTriple().str();
2394
2395 // FIXME: Warn when this flag trumps some other PIC or PIE flag.
2396
Daniel Dunbara1b02a22009-11-29 07:18:39 +00002397 CmdArgs.push_back("-mrelocation-model");
Chandler Carruth76a943b2012-11-19 03:52:03 +00002398 CmdArgs.push_back("dynamic-no-pic");
Daniel Dunbar44e71222009-04-29 18:32:25 +00002399
Chandler Carruth76a943b2012-11-19 03:52:03 +00002400 // Only a forced PIC mode can cause the actual compile to have PIC defines
2401 // etc., no flags are sufficient. This behavior was selected to closely
2402 // match that of llvm-gcc and Apple GCC before that.
2403 if (getToolChain().isPICDefault() && getToolChain().isPICDefaultForced()) {
2404 CmdArgs.push_back("-pic-level");
2405 CmdArgs.push_back("2");
2406 }
2407 } else {
2408 // Currently, LLVM only knows about PIC vs. static; the PIE differences are
2409 // handled in Clang's IRGen by the -pie-level flag.
2410 CmdArgs.push_back("-mrelocation-model");
2411 CmdArgs.push_back(PIC ? "pic" : "static");
2412
2413 if (PIC) {
2414 CmdArgs.push_back("-pic-level");
2415 CmdArgs.push_back(IsPICLevelTwo ? "2" : "1");
2416 if (PIE) {
2417 CmdArgs.push_back("-pie-level");
2418 CmdArgs.push_back(IsPICLevelTwo ? "2" : "1");
2419 }
2420 }
Daniel Dunbar44e71222009-04-29 18:32:25 +00002421 }
Chandler Carruthc0c04552012-04-08 16:40:35 +00002422
Tanya Lattnerf9d41df2009-11-04 01:18:09 +00002423 if (!Args.hasFlag(options::OPT_fmerge_all_constants,
2424 options::OPT_fno_merge_all_constants))
Chris Lattner9242b332011-04-08 18:06:54 +00002425 CmdArgs.push_back("-fno-merge-all-constants");
Daniel Dunbar306945d2009-09-16 06:17:29 +00002426
Daniel Dunbara1b02a22009-11-29 07:18:39 +00002427 // LLVM Code Generator Options.
2428
Daniel Dunbar0bb03312011-02-09 17:54:19 +00002429 if (Arg *A = Args.getLastArg(options::OPT_mregparm_EQ)) {
2430 CmdArgs.push_back("-mregparm");
Richard Smithbd55daf2012-11-01 04:30:05 +00002431 CmdArgs.push_back(A->getValue());
Daniel Dunbar0bb03312011-02-09 17:54:19 +00002432 }
2433
Nick Lewyckyd3f3e4f2013-06-25 01:49:44 +00002434 if (Arg *A = Args.getLastArg(options::OPT_fpcc_struct_return,
2435 options::OPT_freg_struct_return)) {
Eli Benderskyd4a6aec2013-07-24 22:20:49 +00002436 if (getToolChain().getArch() != llvm::Triple::x86) {
John McCall1fe2a8c2013-06-18 02:46:29 +00002437 D.Diag(diag::err_drv_unsupported_opt_for_target)
2438 << A->getSpelling() << getToolChain().getTriple().str();
2439 } else if (A->getOption().matches(options::OPT_fpcc_struct_return)) {
2440 CmdArgs.push_back("-fpcc-struct-return");
2441 } else {
2442 assert(A->getOption().matches(options::OPT_freg_struct_return));
2443 CmdArgs.push_back("-freg-struct-return");
2444 }
2445 }
2446
Roman Divacky65b88cd2011-03-01 17:40:53 +00002447 if (Args.hasFlag(options::OPT_mrtd, options::OPT_mno_rtd, false))
2448 CmdArgs.push_back("-mrtd");
2449
Rafael Espindola224dd632011-12-14 21:02:23 +00002450 if (shouldUseFramePointer(Args, getToolChain().getTriple()))
Daniel Dunbara1b02a22009-11-29 07:18:39 +00002451 CmdArgs.push_back("-mdisable-fp-elim");
2452 if (!Args.hasFlag(options::OPT_fzero_initialized_in_bss,
2453 options::OPT_fno_zero_initialized_in_bss))
2454 CmdArgs.push_back("-mno-zero-initialized-in-bss");
Chad Rosierb71f6aa2013-04-24 18:09:54 +00002455
2456 bool OFastEnabled = isOptimizationLevelFast(Args);
2457 // If -Ofast is the optimization level, then -fstrict-aliasing should be
2458 // enabled. This alias option is being used to simplify the hasFlag logic.
2459 OptSpecifier StrictAliasingAliasOption = OFastEnabled ? options::OPT_Ofast :
2460 options::OPT_fstrict_aliasing;
2461 if (!Args.hasFlag(options::OPT_fstrict_aliasing, StrictAliasingAliasOption,
Rafael Espindola8f41aee2013-11-17 22:42:24 +00002462 options::OPT_fno_strict_aliasing, true))
Dan Gohman10169b92010-10-14 22:36:56 +00002463 CmdArgs.push_back("-relaxed-aliasing");
Manman Renf5d9d342013-10-11 20:48:38 +00002464 if (!Args.hasFlag(options::OPT_fstruct_path_tbaa,
2465 options::OPT_fno_struct_path_tbaa))
2466 CmdArgs.push_back("-no-struct-path-tbaa");
Chandler Carruth8b4140d2012-03-27 23:58:37 +00002467 if (Args.hasFlag(options::OPT_fstrict_enums, options::OPT_fno_strict_enums,
2468 false))
2469 CmdArgs.push_back("-fstrict-enums");
Nick Lewycky1c8c4362012-01-23 08:29:12 +00002470 if (!Args.hasFlag(options::OPT_foptimize_sibling_calls,
2471 options::OPT_fno_optimize_sibling_calls))
2472 CmdArgs.push_back("-mdisable-tail-calls");
Daniel Dunbar0d8ca9e2010-05-14 22:00:22 +00002473
Eric Christopher006208c2013-04-04 06:29:47 +00002474 // Handle segmented stacks.
2475 if (Args.hasArg(options::OPT_fsplit_stack))
2476 CmdArgs.push_back("-split-stacks");
Chad Rosierb71f6aa2013-04-24 18:09:54 +00002477
2478 // If -Ofast is the optimization level, then -ffast-math should be enabled.
2479 // This alias option is being used to simplify the getLastArg logic.
2480 OptSpecifier FastMathAliasOption = OFastEnabled ? options::OPT_Ofast :
2481 options::OPT_ffast_math;
Eric Christopher006208c2013-04-04 06:29:47 +00002482
Chandler Carruth306bd2c2012-01-02 14:19:45 +00002483 // Handle various floating point optimization flags, mapping them to the
2484 // appropriate LLVM code generation flags. The pattern for all of these is to
2485 // default off the codegen optimizations, and if any flag enables them and no
2486 // flag disables them after the flag enabling them, enable the codegen
2487 // optimization. This is complicated by several "umbrella" flags.
Chad Rosierb71f6aa2013-04-24 18:09:54 +00002488 if (Arg *A = Args.getLastArg(options::OPT_ffast_math, FastMathAliasOption,
Chad Rosierc30eb1c2012-09-25 22:03:25 +00002489 options::OPT_fno_fast_math,
Chandler Carruth306bd2c2012-01-02 14:19:45 +00002490 options::OPT_ffinite_math_only,
2491 options::OPT_fno_finite_math_only,
2492 options::OPT_fhonor_infinities,
2493 options::OPT_fno_honor_infinities))
Chad Rosierc30eb1c2012-09-25 22:03:25 +00002494 if (A->getOption().getID() != options::OPT_fno_fast_math &&
2495 A->getOption().getID() != options::OPT_fno_finite_math_only &&
Chandler Carruth306bd2c2012-01-02 14:19:45 +00002496 A->getOption().getID() != options::OPT_fhonor_infinities)
2497 CmdArgs.push_back("-menable-no-infs");
Chad Rosierb71f6aa2013-04-24 18:09:54 +00002498 if (Arg *A = Args.getLastArg(options::OPT_ffast_math, FastMathAliasOption,
Chad Rosierc30eb1c2012-09-25 22:03:25 +00002499 options::OPT_fno_fast_math,
Chandler Carruth306bd2c2012-01-02 14:19:45 +00002500 options::OPT_ffinite_math_only,
2501 options::OPT_fno_finite_math_only,
2502 options::OPT_fhonor_nans,
2503 options::OPT_fno_honor_nans))
Chad Rosierc30eb1c2012-09-25 22:03:25 +00002504 if (A->getOption().getID() != options::OPT_fno_fast_math &&
2505 A->getOption().getID() != options::OPT_fno_finite_math_only &&
Chandler Carruth306bd2c2012-01-02 14:19:45 +00002506 A->getOption().getID() != options::OPT_fhonor_nans)
2507 CmdArgs.push_back("-menable-no-nans");
2508
Benjamin Kramerc242ef22012-05-02 14:55:48 +00002509 // -fmath-errno is the default on some platforms, e.g. BSD-derived OSes.
2510 bool MathErrno = getToolChain().IsMathErrnoDefault();
Chad Rosierb71f6aa2013-04-24 18:09:54 +00002511 if (Arg *A = Args.getLastArg(options::OPT_ffast_math, FastMathAliasOption,
Chad Rosierc30eb1c2012-09-25 22:03:25 +00002512 options::OPT_fno_fast_math,
Chandler Carruth306bd2c2012-01-02 14:19:45 +00002513 options::OPT_fmath_errno,
Chandler Carruth0d4b9e62013-05-18 20:47:36 +00002514 options::OPT_fno_math_errno)) {
2515 // Turning on -ffast_math (with either flag) removes the need for MathErrno.
2516 // However, turning *off* -ffast_math merely restores the toolchain default
2517 // (which may be false).
2518 if (A->getOption().getID() == options::OPT_fno_math_errno ||
2519 A->getOption().getID() == options::OPT_ffast_math ||
2520 A->getOption().getID() == options::OPT_Ofast)
2521 MathErrno = false;
2522 else if (A->getOption().getID() == options::OPT_fmath_errno)
2523 MathErrno = true;
2524 }
Chandler Carruth3634c662012-04-26 02:10:51 +00002525 if (MathErrno)
2526 CmdArgs.push_back("-fmath-errno");
Chandler Carruth306bd2c2012-01-02 14:19:45 +00002527
2528 // There are several flags which require disabling very specific
2529 // optimizations. Any of these being disabled forces us to turn off the
2530 // entire set of LLVM optimizations, so collect them through all the flag
2531 // madness.
2532 bool AssociativeMath = false;
Chad Rosierb71f6aa2013-04-24 18:09:54 +00002533 if (Arg *A = Args.getLastArg(options::OPT_ffast_math, FastMathAliasOption,
Chad Rosierc30eb1c2012-09-25 22:03:25 +00002534 options::OPT_fno_fast_math,
Chandler Carruth306bd2c2012-01-02 14:19:45 +00002535 options::OPT_funsafe_math_optimizations,
2536 options::OPT_fno_unsafe_math_optimizations,
2537 options::OPT_fassociative_math,
2538 options::OPT_fno_associative_math))
Chad Rosierc30eb1c2012-09-25 22:03:25 +00002539 if (A->getOption().getID() != options::OPT_fno_fast_math &&
2540 A->getOption().getID() != options::OPT_fno_unsafe_math_optimizations &&
Chandler Carruth306bd2c2012-01-02 14:19:45 +00002541 A->getOption().getID() != options::OPT_fno_associative_math)
2542 AssociativeMath = true;
2543 bool ReciprocalMath = false;
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_funsafe_math_optimizations,
2547 options::OPT_fno_unsafe_math_optimizations,
2548 options::OPT_freciprocal_math,
2549 options::OPT_fno_reciprocal_math))
Chad Rosierc30eb1c2012-09-25 22:03:25 +00002550 if (A->getOption().getID() != options::OPT_fno_fast_math &&
2551 A->getOption().getID() != options::OPT_fno_unsafe_math_optimizations &&
Chandler Carruth306bd2c2012-01-02 14:19:45 +00002552 A->getOption().getID() != options::OPT_fno_reciprocal_math)
2553 ReciprocalMath = true;
2554 bool SignedZeros = true;
Chad Rosierb71f6aa2013-04-24 18:09:54 +00002555 if (Arg *A = Args.getLastArg(options::OPT_ffast_math, FastMathAliasOption,
Chad Rosierc30eb1c2012-09-25 22:03:25 +00002556 options::OPT_fno_fast_math,
Chandler Carruth306bd2c2012-01-02 14:19:45 +00002557 options::OPT_funsafe_math_optimizations,
2558 options::OPT_fno_unsafe_math_optimizations,
2559 options::OPT_fsigned_zeros,
2560 options::OPT_fno_signed_zeros))
Chad Rosierc30eb1c2012-09-25 22:03:25 +00002561 if (A->getOption().getID() != options::OPT_fno_fast_math &&
2562 A->getOption().getID() != options::OPT_fno_unsafe_math_optimizations &&
Chandler Carruth306bd2c2012-01-02 14:19:45 +00002563 A->getOption().getID() != options::OPT_fsigned_zeros)
2564 SignedZeros = false;
2565 bool TrappingMath = true;
Chad Rosierb71f6aa2013-04-24 18:09:54 +00002566 if (Arg *A = Args.getLastArg(options::OPT_ffast_math, FastMathAliasOption,
Chad Rosierc30eb1c2012-09-25 22:03:25 +00002567 options::OPT_fno_fast_math,
Chandler Carruth306bd2c2012-01-02 14:19:45 +00002568 options::OPT_funsafe_math_optimizations,
2569 options::OPT_fno_unsafe_math_optimizations,
2570 options::OPT_ftrapping_math,
2571 options::OPT_fno_trapping_math))
Chad Rosierc30eb1c2012-09-25 22:03:25 +00002572 if (A->getOption().getID() != options::OPT_fno_fast_math &&
2573 A->getOption().getID() != options::OPT_fno_unsafe_math_optimizations &&
Chandler Carruth306bd2c2012-01-02 14:19:45 +00002574 A->getOption().getID() != options::OPT_ftrapping_math)
2575 TrappingMath = false;
2576 if (!MathErrno && AssociativeMath && ReciprocalMath && !SignedZeros &&
2577 !TrappingMath)
2578 CmdArgs.push_back("-menable-unsafe-fp-math");
2579
Lang Hamesaa53b932012-07-06 00:59:19 +00002580
2581 // Validate and pass through -fp-contract option.
Chad Rosierb71f6aa2013-04-24 18:09:54 +00002582 if (Arg *A = Args.getLastArg(options::OPT_ffast_math, FastMathAliasOption,
Chad Rosierc30eb1c2012-09-25 22:03:25 +00002583 options::OPT_fno_fast_math,
Lang Hamesaa53b932012-07-06 00:59:19 +00002584 options::OPT_ffp_contract)) {
2585 if (A->getOption().getID() == options::OPT_ffp_contract) {
Richard Smithbd55daf2012-11-01 04:30:05 +00002586 StringRef Val = A->getValue();
Lang Hamesaa53b932012-07-06 00:59:19 +00002587 if (Val == "fast" || Val == "on" || Val == "off") {
2588 CmdArgs.push_back(Args.MakeArgString("-ffp-contract=" + Val));
2589 } else {
2590 D.Diag(diag::err_drv_unsupported_option_argument)
2591 << A->getOption().getName() << Val;
2592 }
Chad Rosierb71f6aa2013-04-24 18:09:54 +00002593 } else if (A->getOption().matches(options::OPT_ffast_math) ||
2594 (OFastEnabled && A->getOption().matches(options::OPT_Ofast))) {
Lang Hamesaa53b932012-07-06 00:59:19 +00002595 // If fast-math is set then set the fp-contract mode to fast.
2596 CmdArgs.push_back(Args.MakeArgString("-ffp-contract=fast"));
2597 }
2598 }
2599
Bob Wilson6a039162012-07-19 03:52:53 +00002600 // We separately look for the '-ffast-math' and '-ffinite-math-only' flags,
2601 // and if we find them, tell the frontend to provide the appropriate
2602 // preprocessor macros. This is distinct from enabling any optimizations as
2603 // these options induce language changes which must survive serialization
2604 // and deserialization, etc.
Chad Rosierb71f6aa2013-04-24 18:09:54 +00002605 if (Arg *A = Args.getLastArg(options::OPT_ffast_math, FastMathAliasOption,
2606 options::OPT_fno_fast_math))
2607 if (!A->getOption().matches(options::OPT_fno_fast_math))
2608 CmdArgs.push_back("-ffast-math");
Chad Rosierc30eb1c2012-09-25 22:03:25 +00002609 if (Arg *A = Args.getLastArg(options::OPT_ffinite_math_only, options::OPT_fno_fast_math))
2610 if (A->getOption().matches(options::OPT_ffinite_math_only))
2611 CmdArgs.push_back("-ffinite-math-only");
Chandler Carruth306bd2c2012-01-02 14:19:45 +00002612
Daniel Dunbar0d8ca9e2010-05-14 22:00:22 +00002613 // Decide whether to use verbose asm. Verbose assembly is the default on
2614 // toolchains which have the integrated assembler on by default.
Saleem Abdulrasool42e4b592014-02-22 23:37:58 +00002615 bool IsIntegratedAssemblerDefault =
2616 getToolChain().IsIntegratedAssemblerDefault();
Daniel Dunbar0d8ca9e2010-05-14 22:00:22 +00002617 if (Args.hasFlag(options::OPT_fverbose_asm, options::OPT_fno_verbose_asm,
Saleem Abdulrasool42e4b592014-02-22 23:37:58 +00002618 IsIntegratedAssemblerDefault) ||
Daniel Dunbar0d8ca9e2010-05-14 22:00:22 +00002619 Args.hasArg(options::OPT_dA))
Daniel Dunbara1b02a22009-11-29 07:18:39 +00002620 CmdArgs.push_back("-masm-verbose");
Daniel Dunbar0d8ca9e2010-05-14 22:00:22 +00002621
Saleem Abdulrasoolcfeb90d2014-02-23 00:40:30 +00002622 if (!Args.hasFlag(options::OPT_fintegrated_as, options::OPT_fno_integrated_as,
Saleem Abdulrasool42e4b592014-02-22 23:37:58 +00002623 IsIntegratedAssemblerDefault))
2624 CmdArgs.push_back("-no-integrated-as");
2625
Daniel Dunbara1b02a22009-11-29 07:18:39 +00002626 if (Args.hasArg(options::OPT_fdebug_pass_structure)) {
2627 CmdArgs.push_back("-mdebug-pass");
2628 CmdArgs.push_back("Structure");
2629 }
2630 if (Args.hasArg(options::OPT_fdebug_pass_arguments)) {
2631 CmdArgs.push_back("-mdebug-pass");
2632 CmdArgs.push_back("Arguments");
2633 }
2634
John McCall8517abc2010-02-19 02:45:38 +00002635 // Enable -mconstructor-aliases except on darwin, where we have to
2636 // work around a linker bug; see <rdar://problem/7651567>.
Bob Wilson6524dd32011-10-14 05:03:44 +00002637 if (!getToolChain().getTriple().isOSDarwin())
John McCall8517abc2010-02-19 02:45:38 +00002638 CmdArgs.push_back("-mconstructor-aliases");
NAKAMURA Takumi029d74b2011-02-17 08:50:50 +00002639
John McCall7ef5cb32011-03-18 02:56:14 +00002640 // Darwin's kernel doesn't support guard variables; just die if we
2641 // try to use them.
Bob Wilson6524dd32011-10-14 05:03:44 +00002642 if (KernelOrKext && getToolChain().getTriple().isOSDarwin())
John McCall7ef5cb32011-03-18 02:56:14 +00002643 CmdArgs.push_back("-fforbid-guard-variables");
2644
Douglas Gregordbe39272011-02-01 15:15:22 +00002645 if (Args.hasArg(options::OPT_mms_bitfields)) {
2646 CmdArgs.push_back("-mms-bitfields");
2647 }
John McCall8517abc2010-02-19 02:45:38 +00002648
Daniel Dunbar306945d2009-09-16 06:17:29 +00002649 // This is a coarse approximation of what llvm-gcc actually does, both
2650 // -fasynchronous-unwind-tables and -fnon-call-exceptions interact in more
2651 // complicated ways.
2652 bool AsynchronousUnwindTables =
Evgeniy Stepanov7429c592014-02-14 08:56:25 +00002653 Args.hasFlag(options::OPT_fasynchronous_unwind_tables,
2654 options::OPT_fno_asynchronous_unwind_tables,
2655 (getToolChain().IsUnwindTablesDefault() ||
2656 getToolChain().getSanitizerArgs().needsUnwindTables()) &&
2657 !KernelOrKext);
Daniel Dunbar306945d2009-09-16 06:17:29 +00002658 if (Args.hasFlag(options::OPT_funwind_tables, options::OPT_fno_unwind_tables,
2659 AsynchronousUnwindTables))
Daniel Dunbara1b02a22009-11-29 07:18:39 +00002660 CmdArgs.push_back("-munwind-tables");
2661
Chandler Carruth05fb5852012-11-21 23:40:23 +00002662 getToolChain().addClangTargetOptions(Args, CmdArgs);
Rafael Espindola66aa0452012-06-19 01:26:10 +00002663
Daniel Dunbara1b02a22009-11-29 07:18:39 +00002664 if (Arg *A = Args.getLastArg(options::OPT_flimited_precision_EQ)) {
2665 CmdArgs.push_back("-mlimit-float-precision");
Richard Smithbd55daf2012-11-01 04:30:05 +00002666 CmdArgs.push_back(A->getValue());
Daniel Dunbara1b02a22009-11-29 07:18:39 +00002667 }
Daniel Dunbar44e71222009-04-29 18:32:25 +00002668
Daniel Dunbar4dbaaa62009-05-06 03:16:41 +00002669 // FIXME: Handle -mtune=.
2670 (void) Args.hasArg(options::OPT_mtune_EQ);
Daniel Dunbar44e71222009-04-29 18:32:25 +00002671
Benjamin Kramercf4371a2009-08-05 14:30:52 +00002672 if (Arg *A = Args.getLastArg(options::OPT_mcmodel_EQ)) {
Daniel Dunbara1b02a22009-11-29 07:18:39 +00002673 CmdArgs.push_back("-mcode-model");
Richard Smithbd55daf2012-11-01 04:30:05 +00002674 CmdArgs.push_back(A->getValue());
Benjamin Kramercf4371a2009-08-05 14:30:52 +00002675 }
2676
Rafael Espindola22ce34a2013-08-20 22:12:08 +00002677 // Add the target cpu
2678 std::string ETripleStr = getToolChain().ComputeEffectiveClangTriple(Args);
2679 llvm::Triple ETriple(ETripleStr);
2680 std::string CPU = getCPUName(Args, ETriple);
2681 if (!CPU.empty()) {
2682 CmdArgs.push_back("-target-cpu");
2683 CmdArgs.push_back(Args.MakeArgString(CPU));
2684 }
2685
Rafael Espindolaeb265472013-08-21 21:59:03 +00002686 if (const Arg *A = Args.getLastArg(options::OPT_mfpmath_EQ)) {
2687 CmdArgs.push_back("-mfpmath");
2688 CmdArgs.push_back(A->getValue());
2689 }
2690
Rafael Espindola28e1f4b2013-08-21 16:39:20 +00002691 // Add the target features
Rafael Espindola9c6fb0f2013-11-23 14:36:40 +00002692 getTargetFeatures(D, ETriple, Args, CmdArgs, false);
Rafael Espindola28e1f4b2013-08-21 16:39:20 +00002693
Rafael Espindola22ce34a2013-08-20 22:12:08 +00002694 // Add target specific flags.
Eli Benderskyd4a6aec2013-07-24 22:20:49 +00002695 switch(getToolChain().getArch()) {
Daniel Dunbar3b3191f2009-09-09 22:33:08 +00002696 default:
2697 break;
Daniel Dunbar4dbaaa62009-05-06 03:16:41 +00002698
Daniel Dunbar0f5c5422009-09-10 04:57:17 +00002699 case llvm::Triple::arm:
Christian Pirkerf01cd6f2014-03-28 14:40:46 +00002700 case llvm::Triple::armeb:
Daniel Dunbar0f5c5422009-09-10 04:57:17 +00002701 case llvm::Triple::thumb:
Christian Pirkerf01cd6f2014-03-28 14:40:46 +00002702 case llvm::Triple::thumbeb:
Daniel Dunbarc9388c12011-03-17 17:10:06 +00002703 AddARMTargetArgs(Args, CmdArgs, KernelOrKext);
Daniel Dunbar0f5c5422009-09-10 04:57:17 +00002704 break;
2705
Tim Northovera2ee4332014-03-29 15:09:45 +00002706 case llvm::Triple::arm64:
2707 AddARM64TargetArgs(Args, CmdArgs);
2708 break;
2709
Eric Christopher0b26a612010-03-02 02:41:08 +00002710 case llvm::Triple::mips:
2711 case llvm::Triple::mipsel:
Akira Hatanaka94ab5542011-09-21 02:13:07 +00002712 case llvm::Triple::mips64:
2713 case llvm::Triple::mips64el:
Eric Christopher0b26a612010-03-02 02:41:08 +00002714 AddMIPSTargetArgs(Args, CmdArgs);
2715 break;
2716
Bruno Cardoso Lopese7f211c2010-11-09 17:21:19 +00002717 case llvm::Triple::sparc:
2718 AddSparcTargetArgs(Args, CmdArgs);
2719 break;
2720
Daniel Dunbar3b3191f2009-09-09 22:33:08 +00002721 case llvm::Triple::x86:
2722 case llvm::Triple::x86_64:
2723 AddX86TargetArgs(Args, CmdArgs);
2724 break;
Tony Linthicum76329bf2011-12-12 21:14:55 +00002725
2726 case llvm::Triple::hexagon:
2727 AddHexagonTargetArgs(Args, CmdArgs);
2728 break;
Daniel Dunbar44e71222009-04-29 18:32:25 +00002729 }
2730
Hans Wennborg75958c42013-08-08 00:17:41 +00002731 // Add clang-cl arguments.
2732 if (getToolChain().getDriver().IsCLMode())
2733 AddClangCLArgs(Args, CmdArgs);
2734
Daniel Dunbar976a2f52010-08-11 23:07:47 +00002735 // Pass the linker version in use.
2736 if (Arg *A = Args.getLastArg(options::OPT_mlinker_version_EQ)) {
2737 CmdArgs.push_back("-target-linker-version");
Richard Smithbd55daf2012-11-01 04:30:05 +00002738 CmdArgs.push_back(A->getValue());
Daniel Dunbar976a2f52010-08-11 23:07:47 +00002739 }
2740
Eric Christopherb7d97e92013-04-03 01:58:53 +00002741 if (!shouldUseLeafFramePointer(Args, getToolChain().getTriple()))
Daniel Dunbarbb7ac522010-07-01 01:31:45 +00002742 CmdArgs.push_back("-momit-leaf-frame-pointer");
2743
Daniel Dunbarfcc49a82010-05-12 18:19:58 +00002744 // Explicitly error on some things we know we don't support and can't just
2745 // ignore.
2746 types::ID InputType = Inputs[0].getType();
Daniel Dunbar4ed214a2010-09-24 19:39:37 +00002747 if (!Args.hasArg(options::OPT_fallow_unsupported)) {
2748 Arg *Unsupported;
Daniel Dunbar4ed214a2010-09-24 19:39:37 +00002749 if (types::isCXX(InputType) &&
Bob Wilson6524dd32011-10-14 05:03:44 +00002750 getToolChain().getTriple().isOSDarwin() &&
Eli Benderskyd4a6aec2013-07-24 22:20:49 +00002751 getToolChain().getArch() == llvm::Triple::x86) {
Bob Wilson0d45f582011-08-13 23:48:55 +00002752 if ((Unsupported = Args.getLastArg(options::OPT_fapple_kext)) ||
2753 (Unsupported = Args.getLastArg(options::OPT_mkernel)))
Chris Lattner0e62c1c2011-07-23 10:55:15 +00002754 D.Diag(diag::err_drv_clang_unsupported_opt_cxx_darwin_i386)
Daniel Dunbar4ed214a2010-09-24 19:39:37 +00002755 << Unsupported->getOption().getName();
2756 }
Daniel Dunbarfcc49a82010-05-12 18:19:58 +00002757 }
2758
Daniel Dunbara2aedc62009-03-18 10:01:51 +00002759 Args.AddAllArgs(CmdArgs, options::OPT_v);
Daniel Dunbard4352752010-08-24 22:44:13 +00002760 Args.AddLastArg(CmdArgs, options::OPT_H);
Chad Rosierbe10f982011-08-02 17:58:04 +00002761 if (D.CCPrintHeaders && !D.CCGenDiagnostics) {
Daniel Dunbarac540b32011-02-02 21:11:35 +00002762 CmdArgs.push_back("-header-include-file");
2763 CmdArgs.push_back(D.CCPrintHeadersFilename ?
2764 D.CCPrintHeadersFilename : "-");
2765 }
Daniel Dunbara2aedc62009-03-18 10:01:51 +00002766 Args.AddLastArg(CmdArgs, options::OPT_P);
Mike Stump11289f42009-09-09 15:08:12 +00002767 Args.AddLastArg(CmdArgs, options::OPT_print_ivar_layout);
Daniel Dunbara2aedc62009-03-18 10:01:51 +00002768
Chad Rosierbe10f982011-08-02 17:58:04 +00002769 if (D.CCLogDiagnostics && !D.CCGenDiagnostics) {
Daniel Dunbar529c03b2011-04-07 18:01:20 +00002770 CmdArgs.push_back("-diagnostic-log-file");
2771 CmdArgs.push_back(D.CCLogDiagnosticsFilename ?
2772 D.CCLogDiagnosticsFilename : "-");
2773 }
2774
Manman Ren17bdb0f2013-11-20 20:22:14 +00002775 // Use the last option from "-g" group. "-gline-tables-only" and "-gdwarf-x"
2776 // are preserved, all other debug options are substituted with "-g".
Rafael Espindola08a692a2010-03-07 04:46:18 +00002777 Args.ClaimAllArgs(options::OPT_g_Group);
Alexey Samsonovdda3a7f2012-05-29 08:10:34 +00002778 if (Arg *A = Args.getLastArg(options::OPT_g_Group)) {
David Blaikief5961452014-03-25 20:42:27 +00002779 if (A->getOption().matches(options::OPT_gline_tables_only)) {
Manman Ren17bdb0f2013-11-20 20:22:14 +00002780 // FIXME: we should support specifying dwarf version with
2781 // -gline-tables-only.
Alexey Samsonovdda3a7f2012-05-29 08:10:34 +00002782 CmdArgs.push_back("-gline-tables-only");
Adrian Prantl549c5142014-02-17 17:40:52 +00002783 // Default is dwarf-2 for darwin.
2784 if (getToolChain().getTriple().isOSDarwin())
2785 CmdArgs.push_back("-gdwarf-2");
Manman Ren17bdb0f2013-11-20 20:22:14 +00002786 } else if (A->getOption().matches(options::OPT_gdwarf_2))
Manman Ren9691f7f2013-06-19 01:46:49 +00002787 CmdArgs.push_back("-gdwarf-2");
2788 else if (A->getOption().matches(options::OPT_gdwarf_3))
2789 CmdArgs.push_back("-gdwarf-3");
2790 else if (A->getOption().matches(options::OPT_gdwarf_4))
2791 CmdArgs.push_back("-gdwarf-4");
Eric Christopher2ba5fcb2013-02-05 07:29:57 +00002792 else if (!A->getOption().matches(options::OPT_g0) &&
Adrian Prantl549c5142014-02-17 17:40:52 +00002793 !A->getOption().matches(options::OPT_ggdb0)) {
2794 // Default is dwarf-2 for darwin.
2795 if (getToolChain().getTriple().isOSDarwin())
2796 CmdArgs.push_back("-gdwarf-2");
2797 else
2798 CmdArgs.push_back("-g");
2799 }
Alexey Samsonovdda3a7f2012-05-29 08:10:34 +00002800 }
Daniel Dunbara2aedc62009-03-18 10:01:51 +00002801
Alexey Samsonovf50a9ff2012-06-21 08:22:39 +00002802 // We ignore flags -gstrict-dwarf and -grecord-gcc-switches for now.
2803 Args.ClaimAllArgs(options::OPT_g_flags_Group);
Eric Christophera2f7eb72012-10-18 21:52:18 +00002804 if (Args.hasArg(options::OPT_gcolumn_info))
2805 CmdArgs.push_back("-dwarf-column-info");
Alexey Samsonovf50a9ff2012-06-21 08:22:39 +00002806
Eric Christopher138c32b2013-09-13 22:37:55 +00002807 // FIXME: Move backend command line options to the module.
Eric Christopher2ba5fcb2013-02-05 07:29:57 +00002808 // -gsplit-dwarf should turn on -g and enable the backend dwarf
2809 // splitting and extraction.
Eric Christopherd42fb732013-02-21 22:35:05 +00002810 // FIXME: Currently only works on Linux.
Cameron Esfahani556d91e2013-09-14 01:09:11 +00002811 if (getToolChain().getTriple().isOSLinux() &&
Eric Christopherd42fb732013-02-21 22:35:05 +00002812 Args.hasArg(options::OPT_gsplit_dwarf)) {
Eric Christopher2ba5fcb2013-02-05 07:29:57 +00002813 CmdArgs.push_back("-g");
2814 CmdArgs.push_back("-backend-option");
2815 CmdArgs.push_back("-split-dwarf=Enable");
2816 }
2817
Eric Christopher138c32b2013-09-13 22:37:55 +00002818 // -ggnu-pubnames turns on gnu style pubnames in the backend.
2819 if (Args.hasArg(options::OPT_ggnu_pubnames)) {
2820 CmdArgs.push_back("-backend-option");
2821 CmdArgs.push_back("-generate-gnu-dwarf-pub-sections");
2822 }
Eric Christophereec89c22013-06-18 00:03:50 +00002823
Eric Christopher0d403d22014-02-14 01:27:03 +00002824 // -gdwarf-aranges turns on the emission of the aranges section in the
2825 // backend.
2826 if (Args.hasArg(options::OPT_gdwarf_aranges)) {
2827 CmdArgs.push_back("-backend-option");
2828 CmdArgs.push_back("-generate-arange-section");
2829 }
2830
David Blaikief36d9ba2014-01-27 18:52:43 +00002831 if (Args.hasFlag(options::OPT_fdebug_types_section,
2832 options::OPT_fno_debug_types_section, false)) {
David Blaikied74be702014-01-18 02:02:06 +00002833 CmdArgs.push_back("-backend-option");
2834 CmdArgs.push_back("-generate-type-units");
2835 }
Eric Christophereec89c22013-06-18 00:03:50 +00002836
Evgeniy Stepanov9e7cb332014-02-03 11:11:37 +00002837 if (Args.hasFlag(options::OPT_ffunction_sections,
2838 options::OPT_fno_function_sections, false)) {
2839 CmdArgs.push_back("-ffunction-sections");
2840 }
2841
2842 if (Args.hasFlag(options::OPT_fdata_sections,
2843 options::OPT_fno_data_sections, false)) {
2844 CmdArgs.push_back("-fdata-sections");
2845 }
Rafael Espindola66bfb2752010-05-06 21:06:04 +00002846
Chris Lattner3c77a352010-06-22 00:03:40 +00002847 Args.AddAllArgs(CmdArgs, options::OPT_finstrument_functions);
2848
Justin Bogner6a9d2cf2014-01-06 22:27:36 +00002849 if (Args.hasArg(options::OPT_fprofile_instr_generate) &&
2850 (Args.hasArg(options::OPT_fprofile_instr_use) ||
2851 Args.hasArg(options::OPT_fprofile_instr_use_EQ)))
2852 D.Diag(diag::err_drv_argument_not_allowed_with)
2853 << "-fprofile-instr-generate" << "-fprofile-instr-use";
2854
2855 Args.AddAllArgs(CmdArgs, options::OPT_fprofile_instr_generate);
2856
2857 if (Arg *A = Args.getLastArg(options::OPT_fprofile_instr_use_EQ))
2858 A->render(Args, CmdArgs);
2859 else if (Args.hasArg(options::OPT_fprofile_instr_use))
2860 CmdArgs.push_back("-fprofile-instr-use=pgo-data");
2861
Nick Lewycky207bce32011-04-21 23:44:07 +00002862 if (Args.hasArg(options::OPT_ftest_coverage) ||
2863 Args.hasArg(options::OPT_coverage))
2864 CmdArgs.push_back("-femit-coverage-notes");
2865 if (Args.hasArg(options::OPT_fprofile_arcs) ||
2866 Args.hasArg(options::OPT_coverage))
2867 CmdArgs.push_back("-femit-coverage-data");
2868
Nick Lewycky480cb992011-05-04 20:46:58 +00002869 if (C.getArgs().hasArg(options::OPT_c) ||
2870 C.getArgs().hasArg(options::OPT_S)) {
2871 if (Output.isFilename()) {
Nick Lewycky85c011d2011-05-05 00:08:20 +00002872 CmdArgs.push_back("-coverage-file");
Eric Christophere30f61c2013-02-22 00:24:40 +00002873 SmallString<128> CoverageFilename(Output.getFilename());
Nick Lewycky737a4522013-03-07 08:28:53 +00002874 if (llvm::sys::path::is_relative(CoverageFilename.str())) {
Rafael Espindolac7367ff2013-08-10 01:40:10 +00002875 SmallString<128> Pwd;
2876 if (!llvm::sys::fs::current_path(Pwd)) {
2877 llvm::sys::path::append(Pwd, CoverageFilename.str());
2878 CoverageFilename.swap(Pwd);
Nick Lewycky737a4522013-03-07 08:28:53 +00002879 }
2880 }
Eric Christophere30f61c2013-02-22 00:24:40 +00002881 CmdArgs.push_back(Args.MakeArgString(CoverageFilename));
Nick Lewycky480cb992011-05-04 20:46:58 +00002882 }
2883 }
2884
Daniel Dunbarb25bfde2011-10-11 18:20:10 +00002885 // Pass options for controlling the default header search paths.
2886 if (Args.hasArg(options::OPT_nostdinc)) {
2887 CmdArgs.push_back("-nostdsysteminc");
2888 CmdArgs.push_back("-nobuiltininc");
2889 } else {
Daniel Dunbar0f41eee2011-10-11 18:20:16 +00002890 if (Args.hasArg(options::OPT_nostdlibinc))
2891 CmdArgs.push_back("-nostdsysteminc");
Daniel Dunbarb25bfde2011-10-11 18:20:10 +00002892 Args.AddLastArg(CmdArgs, options::OPT_nostdincxx);
2893 Args.AddLastArg(CmdArgs, options::OPT_nobuiltininc);
2894 }
Daniel Dunbara2aedc62009-03-18 10:01:51 +00002895
Daniel Dunbar34e0b8c2009-12-15 01:02:52 +00002896 // Pass the path to compiler resource files.
Daniel Dunbar34e0b8c2009-12-15 01:02:52 +00002897 CmdArgs.push_back("-resource-dir");
Daniel Dunbar3f3e2cd2010-01-20 02:35:16 +00002898 CmdArgs.push_back(D.ResourceDir.c_str());
Daniel Dunbar9dc82a22009-04-07 21:42:00 +00002899
Argyrios Kyrtzidis71731d62010-11-03 22:45:23 +00002900 Args.AddLastArg(CmdArgs, options::OPT_working_directory);
2901
Ted Kremenekf7639e12012-03-06 20:06:33 +00002902 bool ARCMTEnabled = false;
Argyrios Kyrtzidis85230d52013-09-17 19:14:29 +00002903 if (!Args.hasArg(options::OPT_fno_objc_arc, options::OPT_fobjc_arc)) {
Argyrios Kyrtzidisc44b93d2011-07-07 04:00:39 +00002904 if (const Arg *A = Args.getLastArg(options::OPT_ccc_arcmt_check,
Argyrios Kyrtzidis7fbd97f2011-07-09 20:00:58 +00002905 options::OPT_ccc_arcmt_modify,
2906 options::OPT_ccc_arcmt_migrate)) {
Ted Kremenekf7639e12012-03-06 20:06:33 +00002907 ARCMTEnabled = true;
John McCalld70fb982011-06-15 23:25:17 +00002908 switch (A->getOption().getID()) {
2909 default:
2910 llvm_unreachable("missed a case");
Argyrios Kyrtzidisc44b93d2011-07-07 04:00:39 +00002911 case options::OPT_ccc_arcmt_check:
John McCalld70fb982011-06-15 23:25:17 +00002912 CmdArgs.push_back("-arcmt-check");
2913 break;
Argyrios Kyrtzidisc44b93d2011-07-07 04:00:39 +00002914 case options::OPT_ccc_arcmt_modify:
John McCalld70fb982011-06-15 23:25:17 +00002915 CmdArgs.push_back("-arcmt-modify");
2916 break;
Argyrios Kyrtzidis7fbd97f2011-07-09 20:00:58 +00002917 case options::OPT_ccc_arcmt_migrate:
2918 CmdArgs.push_back("-arcmt-migrate");
Ted Kremenekf7639e12012-03-06 20:06:33 +00002919 CmdArgs.push_back("-mt-migrate-directory");
Richard Smithbd55daf2012-11-01 04:30:05 +00002920 CmdArgs.push_back(A->getValue());
Argyrios Kyrtzidisd5713632011-07-19 17:20:03 +00002921
2922 Args.AddLastArg(CmdArgs, options::OPT_arcmt_migrate_report_output);
2923 Args.AddLastArg(CmdArgs, options::OPT_arcmt_migrate_emit_arc_errors);
Argyrios Kyrtzidis7fbd97f2011-07-09 20:00:58 +00002924 break;
John McCalld70fb982011-06-15 23:25:17 +00002925 }
2926 }
Argyrios Kyrtzidisb11a1922013-06-24 19:01:18 +00002927 } else {
2928 Args.ClaimAllArgs(options::OPT_ccc_arcmt_check);
2929 Args.ClaimAllArgs(options::OPT_ccc_arcmt_modify);
2930 Args.ClaimAllArgs(options::OPT_ccc_arcmt_migrate);
John McCalld70fb982011-06-15 23:25:17 +00002931 }
Eric Christopher84fbdb42011-08-19 00:30:14 +00002932
Ted Kremenekf7639e12012-03-06 20:06:33 +00002933 if (const Arg *A = Args.getLastArg(options::OPT_ccc_objcmt_migrate)) {
2934 if (ARCMTEnabled) {
2935 D.Diag(diag::err_drv_argument_not_allowed_with)
2936 << A->getAsString(Args) << "-ccc-arcmt-migrate";
2937 }
2938 CmdArgs.push_back("-mt-migrate-directory");
Richard Smithbd55daf2012-11-01 04:30:05 +00002939 CmdArgs.push_back(A->getValue());
Ted Kremenekf7639e12012-03-06 20:06:33 +00002940
2941 if (!Args.hasArg(options::OPT_objcmt_migrate_literals,
Fariborz Jahaniand83ef842013-07-09 16:59:14 +00002942 options::OPT_objcmt_migrate_subscripting,
2943 options::OPT_objcmt_migrate_property)) {
Ted Kremenekf7639e12012-03-06 20:06:33 +00002944 // None specified, means enable them all.
2945 CmdArgs.push_back("-objcmt-migrate-literals");
2946 CmdArgs.push_back("-objcmt-migrate-subscripting");
Fariborz Jahaniand83ef842013-07-09 16:59:14 +00002947 CmdArgs.push_back("-objcmt-migrate-property");
Ted Kremenekf7639e12012-03-06 20:06:33 +00002948 } else {
2949 Args.AddLastArg(CmdArgs, options::OPT_objcmt_migrate_literals);
2950 Args.AddLastArg(CmdArgs, options::OPT_objcmt_migrate_subscripting);
Fariborz Jahaniand83ef842013-07-09 16:59:14 +00002951 Args.AddLastArg(CmdArgs, options::OPT_objcmt_migrate_property);
Ted Kremenekf7639e12012-03-06 20:06:33 +00002952 }
Argyrios Kyrtzidis55ecf992013-11-13 23:38:20 +00002953 } else {
2954 Args.AddLastArg(CmdArgs, options::OPT_objcmt_migrate_literals);
2955 Args.AddLastArg(CmdArgs, options::OPT_objcmt_migrate_subscripting);
2956 Args.AddLastArg(CmdArgs, options::OPT_objcmt_migrate_property);
2957 Args.AddLastArg(CmdArgs, options::OPT_objcmt_migrate_all);
2958 Args.AddLastArg(CmdArgs, options::OPT_objcmt_migrate_readonly_property);
2959 Args.AddLastArg(CmdArgs, options::OPT_objcmt_migrate_readwrite_property);
2960 Args.AddLastArg(CmdArgs, options::OPT_objcmt_migrate_annotation);
2961 Args.AddLastArg(CmdArgs, options::OPT_objcmt_migrate_instancetype);
2962 Args.AddLastArg(CmdArgs, options::OPT_objcmt_migrate_nsmacros);
2963 Args.AddLastArg(CmdArgs, options::OPT_objcmt_migrate_protocol_conformance);
2964 Args.AddLastArg(CmdArgs, options::OPT_objcmt_atomic_property);
2965 Args.AddLastArg(CmdArgs, options::OPT_objcmt_returns_innerpointer_property);
2966 Args.AddLastArg(CmdArgs, options::OPT_objcmt_ns_nonatomic_iosonly);
Argyrios Kyrtzidis74aa02562013-12-11 01:29:48 +00002967 Args.AddLastArg(CmdArgs, options::OPT_objcmt_migrate_designated_init);
Argyrios Kyrtzidisd5ba86b2013-12-10 18:36:53 +00002968 Args.AddLastArg(CmdArgs, options::OPT_objcmt_whitelist_dir_path);
Ted Kremenekf7639e12012-03-06 20:06:33 +00002969 }
2970
Daniel Dunbard067f7f2009-04-08 23:54:23 +00002971 // Add preprocessing options like -I, -D, etc. if we are using the
2972 // preprocessor.
2973 //
2974 // FIXME: Support -fpreprocessed
Daniel Dunbard067f7f2009-04-08 23:54:23 +00002975 if (types::getPreprocessedType(InputType) != types::TY_INVALID)
Chad Rosier633dcdc2013-01-24 19:14:47 +00002976 AddPreprocessingOptions(C, JA, D, Args, CmdArgs, Output, Inputs);
Daniel Dunbara2aedc62009-03-18 10:01:51 +00002977
Rafael Espindolaa7431922011-07-21 23:40:37 +00002978 // Don't warn about "clang -c -DPIC -fPIC test.i" because libtool.m4 assumes
2979 // that "The compiler can only warn and ignore the option if not recognized".
2980 // When building with ccache, it will pass -D options to clang even on
2981 // preprocessed inputs and configure concludes that -fPIC is not supported.
2982 Args.ClaimAllArgs(options::OPT_D);
2983
Alp Toker7874bdc2013-11-15 20:40:58 +00002984 // Manually translate -O4 to -O3; let clang reject others.
Rafael Espindolaad70d962013-08-27 16:58:15 +00002985 if (Arg *A = Args.getLastArg(options::OPT_O_Group)) {
2986 if (A->getOption().matches(options::OPT_O4)) {
2987 CmdArgs.push_back("-O3");
2988 D.Diag(diag::warn_O4_is_O3);
2989 } else {
2990 A->render(Args, CmdArgs);
2991 }
2992 }
Daniel Dunbara2aedc62009-03-18 10:01:51 +00002993
Chad Rosier86b82082012-12-12 20:06:31 +00002994 // Don't warn about unused -flto. This can happen when we're preprocessing or
2995 // precompiling.
2996 Args.ClaimAllArgs(options::OPT_flto);
2997
Daniel Dunbar945577c2009-10-29 02:24:45 +00002998 Args.AddAllArgs(CmdArgs, options::OPT_W_Group);
Ted Kremenekb22ea2a2012-07-07 05:53:30 +00002999 if (Args.hasFlag(options::OPT_pedantic, options::OPT_no_pedantic, false))
3000 CmdArgs.push_back("-pedantic");
Daniel Dunbar945577c2009-10-29 02:24:45 +00003001 Args.AddLastArg(CmdArgs, options::OPT_pedantic_errors);
Daniel Dunbara2aedc62009-03-18 10:01:51 +00003002 Args.AddLastArg(CmdArgs, options::OPT_w);
Daniel Dunbarc44b4cc2009-04-07 22:13:21 +00003003
3004 // Handle -{std, ansi, trigraphs} -- take the last of -{std, ansi}
Hans Wennborgec993822013-07-31 16:57:56 +00003005 // (-ansi is equivalent to -std=c89 or -std=c++98).
Daniel Dunbarc44b4cc2009-04-07 22:13:21 +00003006 //
3007 // If a std is supplied, only add -trigraphs if it follows the
3008 // option.
3009 if (Arg *Std = Args.getLastArg(options::OPT_std_EQ, options::OPT_ansi)) {
3010 if (Std->getOption().matches(options::OPT_ansi))
Nuno Lopes275225d2009-10-16 14:28:06 +00003011 if (types::isCXX(InputType))
Daniel Dunbar1c7577c2009-11-04 06:24:38 +00003012 CmdArgs.push_back("-std=c++98");
Nuno Lopes275225d2009-10-16 14:28:06 +00003013 else
Daniel Dunbar1c7577c2009-11-04 06:24:38 +00003014 CmdArgs.push_back("-std=c89");
Daniel Dunbarc44b4cc2009-04-07 22:13:21 +00003015 else
3016 Std->render(Args, CmdArgs);
3017
Daniel Dunbar3f1a1ff2010-06-14 21:23:08 +00003018 if (Arg *A = Args.getLastArg(options::OPT_std_EQ, options::OPT_ansi,
3019 options::OPT_trigraphs))
3020 if (A != Std)
Daniel Dunbarc44b4cc2009-04-07 22:13:21 +00003021 A->render(Args, CmdArgs);
Daniel Dunbar72a60902009-04-26 01:10:38 +00003022 } else {
3023 // Honor -std-default.
Daniel Dunbar12998192010-01-29 21:03:02 +00003024 //
3025 // FIXME: Clang doesn't correctly handle -std= when the input language
3026 // doesn't match. For the time being just ignore this for C++ inputs;
3027 // eventually we want to do all the standard defaulting here instead of
3028 // splitting it between the driver and clang -cc1.
3029 if (!types::isCXX(InputType))
Nico Weber723b4f02012-08-30 02:08:31 +00003030 Args.AddAllArgsTranslated(CmdArgs, options::OPT_std_default_EQ,
3031 "-std=", /*Joined=*/true);
Saleem Abdulrasool377066a2014-03-27 22:50:18 +00003032 else if (IsWindowsMSVC)
Nico Weber723b4f02012-08-30 02:08:31 +00003033 CmdArgs.push_back("-std=c++11");
3034
Daniel Dunbarc44b4cc2009-04-07 22:13:21 +00003035 Args.AddLastArg(CmdArgs, options::OPT_trigraphs);
Daniel Dunbar72a60902009-04-26 01:10:38 +00003036 }
Daniel Dunbard067f7f2009-04-08 23:54:23 +00003037
Richard Smith282b4492013-09-04 22:50:31 +00003038 // GCC's behavior for -Wwrite-strings is a bit strange:
3039 // * In C, this "warning flag" changes the types of string literals from
3040 // 'char[N]' to 'const char[N]', and thus triggers an unrelated warning
3041 // for the discarded qualifier.
3042 // * In C++, this is just a normal warning flag.
3043 //
3044 // Implementing this warning correctly in C is hard, so we follow GCC's
3045 // behavior for now. FIXME: Directly diagnose uses of a string literal as
3046 // a non-const char* in C, rather than using this crude hack.
3047 if (!types::isCXX(InputType)) {
Argyrios Kyrtzidis25f2afde2014-02-07 08:33:28 +00003048 // FIXME: This should behave just like a warning flag, and thus should also
3049 // respect -Weverything, -Wno-everything, -Werror=write-strings, and so on.
3050 Arg *WriteStrings =
3051 Args.getLastArg(options::OPT_Wwrite_strings,
3052 options::OPT_Wno_write_strings, options::OPT_w);
3053 if (WriteStrings &&
3054 WriteStrings->getOption().matches(options::OPT_Wwrite_strings))
Richard Smith282b4492013-09-04 22:50:31 +00003055 CmdArgs.push_back("-fconst-strings");
Chandler Carruthb009b142011-04-23 06:30:43 +00003056 }
3057
Chandler Carruth61fbf622011-04-23 09:27:53 +00003058 // GCC provides a macro definition '__DEPRECATED' when -Wdeprecated is active
Chandler Carruth30483fb2011-04-23 19:48:40 +00003059 // during C++ compilation, which it is by default. GCC keeps this define even
3060 // in the presence of '-w', match this behavior bug-for-bug.
3061 if (types::isCXX(InputType) &&
3062 Args.hasFlag(options::OPT_Wdeprecated, options::OPT_Wno_deprecated,
3063 true)) {
3064 CmdArgs.push_back("-fdeprecated-macro");
Chandler Carruth61fbf622011-04-23 09:27:53 +00003065 }
3066
Chandler Carruthe0391482010-05-22 02:21:53 +00003067 // Translate GCC's misnamer '-fasm' arguments to '-fgnu-keywords'.
3068 if (Arg *Asm = Args.getLastArg(options::OPT_fasm, options::OPT_fno_asm)) {
3069 if (Asm->getOption().matches(options::OPT_fasm))
3070 CmdArgs.push_back("-fgnu-keywords");
3071 else
3072 CmdArgs.push_back("-fno-gnu-keywords");
3073 }
3074
Rafael Espindola4cfa7972011-05-02 17:43:32 +00003075 if (ShouldDisableCFI(Args, getToolChain()))
3076 CmdArgs.push_back("-fno-dwarf2-cfi-asm");
Rafael Espindolae2641872011-04-30 18:35:43 +00003077
Nick Lewycky1d617ac2011-10-17 23:05:52 +00003078 if (ShouldDisableDwarfDirectory(Args, getToolChain()))
3079 CmdArgs.push_back("-fno-dwarf-directory-asm");
3080
Daniel Dunbare246fbe2013-04-16 18:21:19 +00003081 if (ShouldDisableAutolink(Args, getToolChain()))
3082 CmdArgs.push_back("-fno-autolink");
3083
Chandler Carruth4d5e1a92012-12-17 21:40:04 +00003084 // Add in -fdebug-compilation-dir if necessary.
3085 addDebugCompDirArg(Args, CmdArgs);
Nick Lewyckyba743b72011-10-21 02:32:14 +00003086
Richard Smith9a568822011-11-21 19:36:32 +00003087 if (Arg *A = Args.getLastArg(options::OPT_ftemplate_depth_,
3088 options::OPT_ftemplate_depth_EQ)) {
Daniel Dunbara2aedc62009-03-18 10:01:51 +00003089 CmdArgs.push_back("-ftemplate-depth");
Richard Smithbd55daf2012-11-01 04:30:05 +00003090 CmdArgs.push_back(A->getValue());
Daniel Dunbara2aedc62009-03-18 10:01:51 +00003091 }
3092
Richard Smith79c927b2013-11-06 19:31:51 +00003093 if (Arg *A = Args.getLastArg(options::OPT_foperator_arrow_depth_EQ)) {
3094 CmdArgs.push_back("-foperator-arrow-depth");
3095 CmdArgs.push_back(A->getValue());
3096 }
3097
Richard Smith9a568822011-11-21 19:36:32 +00003098 if (Arg *A = Args.getLastArg(options::OPT_fconstexpr_depth_EQ)) {
3099 CmdArgs.push_back("-fconstexpr-depth");
Richard Smithbd55daf2012-11-01 04:30:05 +00003100 CmdArgs.push_back(A->getValue());
Richard Smith9a568822011-11-21 19:36:32 +00003101 }
3102
Richard Smitha3d3bd22013-05-08 02:12:03 +00003103 if (Arg *A = Args.getLastArg(options::OPT_fconstexpr_steps_EQ)) {
3104 CmdArgs.push_back("-fconstexpr-steps");
3105 CmdArgs.push_back(A->getValue());
3106 }
3107
Richard Smithb3a14522013-02-22 01:59:51 +00003108 if (Arg *A = Args.getLastArg(options::OPT_fbracket_depth_EQ)) {
3109 CmdArgs.push_back("-fbracket-depth");
3110 CmdArgs.push_back(A->getValue());
3111 }
3112
Argyrios Kyrtzidisef6c8da2010-11-18 00:20:36 +00003113 if (Arg *A = Args.getLastArg(options::OPT_Wlarge_by_value_copy_EQ,
3114 options::OPT_Wlarge_by_value_copy_def)) {
Jean-Daniel Dupas73d801c2012-05-04 08:08:37 +00003115 if (A->getNumValues()) {
Richard Smithbd55daf2012-11-01 04:30:05 +00003116 StringRef bytes = A->getValue();
Jean-Daniel Dupas73d801c2012-05-04 08:08:37 +00003117 CmdArgs.push_back(Args.MakeArgString("-Wlarge-by-value-copy=" + bytes));
3118 } else
3119 CmdArgs.push_back("-Wlarge-by-value-copy=64"); // default value
Argyrios Kyrtzidisaf84ec02010-11-17 23:11:54 +00003120 }
3121
Nuno Lopes3d6311d2012-05-08 22:10:46 +00003122
Michael J. Spencer929fccd2012-10-22 22:13:48 +00003123 if (Args.hasArg(options::OPT_relocatable_pch))
Daniel Dunbar8bed86c2009-11-20 22:21:36 +00003124 CmdArgs.push_back("-relocatable-pch");
Mike Stump11289f42009-09-09 15:08:12 +00003125
Daniel Dunbar1c7577c2009-11-04 06:24:38 +00003126 if (Arg *A = Args.getLastArg(options::OPT_fconstant_string_class_EQ)) {
3127 CmdArgs.push_back("-fconstant-string-class");
Richard Smithbd55daf2012-11-01 04:30:05 +00003128 CmdArgs.push_back(A->getValue());
Daniel Dunbar1c7577c2009-11-04 06:24:38 +00003129 }
David Chisnall5778fce2009-08-31 16:41:57 +00003130
Chris Lattnere23003d2010-01-09 21:54:33 +00003131 if (Arg *A = Args.getLastArg(options::OPT_ftabstop_EQ)) {
3132 CmdArgs.push_back("-ftabstop");
Richard Smithbd55daf2012-11-01 04:30:05 +00003133 CmdArgs.push_back(A->getValue());
Chris Lattnere23003d2010-01-09 21:54:33 +00003134 }
3135
Chris Lattnerb35583d2010-04-07 20:49:23 +00003136 CmdArgs.push_back("-ferror-limit");
3137 if (Arg *A = Args.getLastArg(options::OPT_ferror_limit_EQ))
Richard Smithbd55daf2012-11-01 04:30:05 +00003138 CmdArgs.push_back(A->getValue());
Chris Lattnerb35583d2010-04-07 20:49:23 +00003139 else
3140 CmdArgs.push_back("19");
Douglas Gregorffed1cb2010-04-20 07:18:24 +00003141
Chandler Carrutha77a7272010-05-06 04:55:18 +00003142 if (Arg *A = Args.getLastArg(options::OPT_fmacro_backtrace_limit_EQ)) {
3143 CmdArgs.push_back("-fmacro-backtrace-limit");
Richard Smithbd55daf2012-11-01 04:30:05 +00003144 CmdArgs.push_back(A->getValue());
Chandler Carrutha77a7272010-05-06 04:55:18 +00003145 }
3146
3147 if (Arg *A = Args.getLastArg(options::OPT_ftemplate_backtrace_limit_EQ)) {
3148 CmdArgs.push_back("-ftemplate-backtrace-limit");
Richard Smithbd55daf2012-11-01 04:30:05 +00003149 CmdArgs.push_back(A->getValue());
Chandler Carrutha77a7272010-05-06 04:55:18 +00003150 }
3151
Richard Smithf6f003a2011-12-16 19:06:07 +00003152 if (Arg *A = Args.getLastArg(options::OPT_fconstexpr_backtrace_limit_EQ)) {
3153 CmdArgs.push_back("-fconstexpr-backtrace-limit");
Richard Smithbd55daf2012-11-01 04:30:05 +00003154 CmdArgs.push_back(A->getValue());
Richard Smithf6f003a2011-12-16 19:06:07 +00003155 }
3156
Daniel Dunbar2c978472009-11-04 06:24:47 +00003157 // Pass -fmessage-length=.
Daniel Dunbar84bb7932009-11-30 08:40:54 +00003158 CmdArgs.push_back("-fmessage-length");
Daniel Dunbar2c978472009-11-04 06:24:47 +00003159 if (Arg *A = Args.getLastArg(options::OPT_fmessage_length_EQ)) {
Richard Smithbd55daf2012-11-01 04:30:05 +00003160 CmdArgs.push_back(A->getValue());
Daniel Dunbar2c978472009-11-04 06:24:47 +00003161 } else {
3162 // If -fmessage-length=N was not specified, determine whether this is a
3163 // terminal and, if so, implicitly define -fmessage-length appropriately.
3164 unsigned N = llvm::sys::Process::StandardErrColumns();
Chris Lattner0e62c1c2011-07-23 10:55:15 +00003165 CmdArgs.push_back(Args.MakeArgString(Twine(N)));
Daniel Dunbar2c978472009-11-04 06:24:47 +00003166 }
3167
John McCallb4a99d32013-02-19 01:57:35 +00003168 // -fvisibility= and -fvisibility-ms-compat are of a piece.
3169 if (const Arg *A = Args.getLastArg(options::OPT_fvisibility_EQ,
3170 options::OPT_fvisibility_ms_compat)) {
3171 if (A->getOption().matches(options::OPT_fvisibility_EQ)) {
3172 CmdArgs.push_back("-fvisibility");
3173 CmdArgs.push_back(A->getValue());
3174 } else {
3175 assert(A->getOption().matches(options::OPT_fvisibility_ms_compat));
3176 CmdArgs.push_back("-fvisibility");
3177 CmdArgs.push_back("hidden");
3178 CmdArgs.push_back("-ftype-visibility");
3179 CmdArgs.push_back("default");
3180 }
Daniel Dunbare357d562009-12-03 18:42:11 +00003181 }
3182
Douglas Gregor08329632010-06-15 17:05:35 +00003183 Args.AddLastArg(CmdArgs, options::OPT_fvisibility_inlines_hidden);
Michael J. Spencer4c0ffa82010-10-21 03:16:25 +00003184
Hans Wennborgf60f6af2012-06-28 08:01:44 +00003185 Args.AddLastArg(CmdArgs, options::OPT_ftlsmodel_EQ);
3186
Daniel Dunbare46b52a2010-03-20 04:52:14 +00003187 // -fhosted is default.
Chad Rosier4fab82c2012-03-26 22:04:46 +00003188 if (Args.hasFlag(options::OPT_ffreestanding, options::OPT_fhosted, false) ||
3189 KernelOrKext)
Daniel Dunbare46b52a2010-03-20 04:52:14 +00003190 CmdArgs.push_back("-ffreestanding");
3191
Daniel Dunbare357d562009-12-03 18:42:11 +00003192 // Forward -f (flag) options which we can pass directly.
Daniel Dunbar3a148f22009-04-07 21:51:40 +00003193 Args.AddLastArg(CmdArgs, options::OPT_femit_all_decls);
Daniel Dunbar3a148f22009-04-07 21:51:40 +00003194 Args.AddLastArg(CmdArgs, options::OPT_fheinous_gnu_extensions);
Adrian Prantla7634472014-01-07 01:19:08 +00003195 Args.AddLastArg(CmdArgs, options::OPT_fstandalone_debug);
3196 Args.AddLastArg(CmdArgs, options::OPT_fno_standalone_debug);
Eric Christopher86050822011-10-25 07:13:06 +00003197 Args.AddLastArg(CmdArgs, options::OPT_fno_operator_names);
Bill Schmidtb3b804e2013-07-03 15:36:02 +00003198 // AltiVec language extensions aren't relevant for assembling.
3199 if (!isa<PreprocessJobAction>(JA) ||
3200 Output.getType() != types::TY_PP_Asm)
3201 Args.AddLastArg(CmdArgs, options::OPT_faltivec);
Richard Trieu91844232012-06-26 18:18:47 +00003202 Args.AddLastArg(CmdArgs, options::OPT_fdiagnostics_show_template_tree);
3203 Args.AddLastArg(CmdArgs, options::OPT_fno_elide_type);
Chad Rosier864dfe12012-03-13 23:45:51 +00003204
Peter Collingbourne32701642013-11-01 18:16:25 +00003205 const SanitizerArgs &Sanitize = getToolChain().getSanitizerArgs();
3206 Sanitize.addArgs(Args, CmdArgs);
Richard Smith52be6192012-11-05 22:04:41 +00003207
Will Dietz3676d562012-12-30 20:53:28 +00003208 if (!Args.hasFlag(options::OPT_fsanitize_recover,
3209 options::OPT_fno_sanitize_recover,
3210 true))
3211 CmdArgs.push_back("-fno-sanitize-recover");
3212
Alexey Samsonovcb3f8122014-03-20 10:48:29 +00003213 if (Args.hasFlag(options::OPT_fsanitize_undefined_trap_on_error,
Chad Rosierae229d52013-01-29 23:31:22 +00003214 options::OPT_fno_sanitize_undefined_trap_on_error, false))
3215 CmdArgs.push_back("-fsanitize-undefined-trap-on-error");
3216
Eric Christopher459d2712013-02-19 06:16:53 +00003217 // Report an error for -faltivec on anything other than PowerPC.
Chad Rosier864dfe12012-03-13 23:45:51 +00003218 if (const Arg *A = Args.getLastArg(options::OPT_faltivec))
Eli Benderskyd4a6aec2013-07-24 22:20:49 +00003219 if (!(getToolChain().getArch() == llvm::Triple::ppc ||
Bill Schmidt778d3872013-07-26 01:36:11 +00003220 getToolChain().getArch() == llvm::Triple::ppc64 ||
3221 getToolChain().getArch() == llvm::Triple::ppc64le))
Chad Rosier864dfe12012-03-13 23:45:51 +00003222 D.Diag(diag::err_drv_argument_only_allowed_with)
Bill Schmidt778d3872013-07-26 01:36:11 +00003223 << A->getAsString(Args) << "ppc/ppc64/ppc64le";
Chad Rosier864dfe12012-03-13 23:45:51 +00003224
Daniel Dunbar733b0f82011-03-01 18:49:30 +00003225 if (getToolChain().SupportsProfiling())
3226 Args.AddLastArg(CmdArgs, options::OPT_pg);
Daniel Dunbar35621a92010-03-16 16:57:46 +00003227
3228 // -flax-vector-conversions is default.
3229 if (!Args.hasFlag(options::OPT_flax_vector_conversions,
3230 options::OPT_fno_lax_vector_conversions))
3231 CmdArgs.push_back("-fno-lax-vector-conversions");
3232
Fariborz Jahaniana4cfff82011-01-07 01:05:02 +00003233 if (Args.getLastArg(options::OPT_fapple_kext))
3234 CmdArgs.push_back("-fapple-kext");
3235
David Blaikie690f21e2012-06-14 18:55:27 +00003236 if (Args.hasFlag(options::OPT_frewrite_includes,
3237 options::OPT_fno_rewrite_includes, false))
3238 CmdArgs.push_back("-frewrite-includes");
3239
Fariborz Jahaniana4404f22009-05-22 20:17:16 +00003240 Args.AddLastArg(CmdArgs, options::OPT_fobjc_sender_dependent_dispatch);
Chris Lattner69686412009-04-21 05:34:31 +00003241 Args.AddLastArg(CmdArgs, options::OPT_fdiagnostics_print_source_range_info);
Douglas Gregoreec975c2010-08-19 20:24:43 +00003242 Args.AddLastArg(CmdArgs, options::OPT_fdiagnostics_parseable_fixits);
Daniel Dunbar3a148f22009-04-07 21:51:40 +00003243 Args.AddLastArg(CmdArgs, options::OPT_ftime_report);
3244 Args.AddLastArg(CmdArgs, options::OPT_ftrapv);
David Chisnalldd84ef12010-09-17 18:29:54 +00003245
3246 if (Arg *A = Args.getLastArg(options::OPT_ftrapv_handler_EQ)) {
3247 CmdArgs.push_back("-ftrapv-handler");
Richard Smithbd55daf2012-11-01 04:30:05 +00003248 CmdArgs.push_back(A->getValue());
David Chisnalldd84ef12010-09-17 18:29:54 +00003249 }
3250
Bob Wilson14adb362012-02-03 06:27:22 +00003251 Args.AddLastArg(CmdArgs, options::OPT_ftrap_function_EQ);
Evan Cheng04c94292011-04-08 21:37:45 +00003252
Chandler Carruth6e501032011-03-27 00:04:55 +00003253 // -fno-strict-overflow implies -fwrapv if it isn't disabled, but
3254 // -fstrict-overflow won't turn off an explicitly enabled -fwrapv.
3255 if (Arg *A = Args.getLastArg(options::OPT_fwrapv,
3256 options::OPT_fno_wrapv)) {
3257 if (A->getOption().matches(options::OPT_fwrapv))
3258 CmdArgs.push_back("-fwrapv");
3259 } else if (Arg *A = Args.getLastArg(options::OPT_fstrict_overflow,
3260 options::OPT_fno_strict_overflow)) {
3261 if (A->getOption().matches(options::OPT_fno_strict_overflow))
3262 CmdArgs.push_back("-fwrapv");
3263 }
Hal Finkelce0697f2013-11-17 16:03:29 +00003264
3265 if (Arg *A = Args.getLastArg(options::OPT_freroll_loops,
3266 options::OPT_fno_reroll_loops))
3267 if (A->getOption().matches(options::OPT_freroll_loops))
3268 CmdArgs.push_back("-freroll-loops");
3269
Daniel Dunbar3a148f22009-04-07 21:51:40 +00003270 Args.AddLastArg(CmdArgs, options::OPT_fwritable_strings);
Chandler Carruth54c29102013-08-08 08:34:35 +00003271 Args.AddLastArg(CmdArgs, options::OPT_funroll_loops,
3272 options::OPT_fno_unroll_loops);
Daniel Dunbara2aedc62009-03-18 10:01:51 +00003273
Daniel Dunbara77eaeb2009-09-03 04:54:28 +00003274 Args.AddLastArg(CmdArgs, options::OPT_pthread);
3275
Mahesha S6a682be42012-10-27 07:47:56 +00003276
Daniel Dunbar4930e332009-11-17 08:07:36 +00003277 // -stack-protector=0 is default.
3278 unsigned StackProtectorLevel = 0;
Bill Wendlingd63bbad2009-06-28 07:36:13 +00003279 if (Arg *A = Args.getLastArg(options::OPT_fno_stack_protector,
3280 options::OPT_fstack_protector_all,
Josh Mageee0fc1a82014-02-11 01:35:14 +00003281 options::OPT_fstack_protector_strong,
Bill Wendlingd63bbad2009-06-28 07:36:13 +00003282 options::OPT_fstack_protector)) {
Daniel Dunbar4930e332009-11-17 08:07:36 +00003283 if (A->getOption().matches(options::OPT_fstack_protector))
Josh Mageee0fc1a82014-02-11 01:35:14 +00003284 StackProtectorLevel = LangOptions::SSPOn;
3285 else if (A->getOption().matches(options::OPT_fstack_protector_strong))
3286 StackProtectorLevel = LangOptions::SSPStrong;
Daniel Dunbar4930e332009-11-17 08:07:36 +00003287 else if (A->getOption().matches(options::OPT_fstack_protector_all))
Josh Mageee0fc1a82014-02-11 01:35:14 +00003288 StackProtectorLevel = LangOptions::SSPReq;
Nico Weberdd473632011-08-23 07:38:27 +00003289 } else {
3290 StackProtectorLevel =
3291 getToolChain().GetDefaultStackProtectorLevel(KernelOrKext);
3292 }
Daniel Dunbar4930e332009-11-17 08:07:36 +00003293 if (StackProtectorLevel) {
3294 CmdArgs.push_back("-stack-protector");
Chris Lattner0e62c1c2011-07-23 10:55:15 +00003295 CmdArgs.push_back(Args.MakeArgString(Twine(StackProtectorLevel)));
Joerg Sonnenberger85e2bbc2012-09-12 13:51:14 +00003296 }
Chad Rosierdb3da832012-08-21 16:16:06 +00003297
Joerg Sonnenberger85e2bbc2012-09-12 13:51:14 +00003298 // --param ssp-buffer-size=
3299 for (arg_iterator it = Args.filtered_begin(options::OPT__param),
3300 ie = Args.filtered_end(); it != ie; ++it) {
Richard Smithbd55daf2012-11-01 04:30:05 +00003301 StringRef Str((*it)->getValue());
Joerg Sonnenberger85e2bbc2012-09-12 13:51:14 +00003302 if (Str.startswith("ssp-buffer-size=")) {
3303 if (StackProtectorLevel) {
Chad Rosierdb3da832012-08-21 16:16:06 +00003304 CmdArgs.push_back("-stack-protector-buffer-size");
3305 // FIXME: Verify the argument is a valid integer.
3306 CmdArgs.push_back(Args.MakeArgString(Str.drop_front(16)));
Chad Rosierdb3da832012-08-21 16:16:06 +00003307 }
Joerg Sonnenberger85e2bbc2012-09-12 13:51:14 +00003308 (*it)->claim();
Chad Rosierdb3da832012-08-21 16:16:06 +00003309 }
Bill Wendlingd63bbad2009-06-28 07:36:13 +00003310 }
3311
Nick Lewyckyf4d3f7a2011-12-06 03:33:03 +00003312 // Translate -mstackrealign
3313 if (Args.hasFlag(options::OPT_mstackrealign, options::OPT_mno_stackrealign,
3314 false)) {
3315 CmdArgs.push_back("-backend-option");
3316 CmdArgs.push_back("-force-align-stack");
3317 }
3318 if (!Args.hasFlag(options::OPT_mno_stackrealign, options::OPT_mstackrealign,
3319 false)) {
3320 CmdArgs.push_back(Args.MakeArgString("-mstackrealign"));
3321 }
3322
Joerg Sonnenbergerdb66ed02011-12-05 23:05:23 +00003323 if (Args.hasArg(options::OPT_mstack_alignment)) {
3324 StringRef alignment = Args.getLastArgValue(options::OPT_mstack_alignment);
3325 CmdArgs.push_back(Args.MakeArgString("-mstack-alignment=" + alignment));
Eric Christopherd5c45f62011-05-02 21:18:22 +00003326 }
Chad Rosier9ae53f82012-11-29 00:42:06 +00003327 // -mkernel implies -mstrict-align; don't add the redundant option.
Renato Golina146a482013-08-24 14:44:41 +00003328 if (!KernelOrKext) {
Renato Golin8d5f3142013-08-28 23:56:07 +00003329 if (Arg *A = Args.getLastArg(options::OPT_mno_unaligned_access,
3330 options::OPT_munaligned_access)) {
3331 if (A->getOption().matches(options::OPT_mno_unaligned_access)) {
3332 CmdArgs.push_back("-backend-option");
3333 CmdArgs.push_back("-arm-strict-align");
3334 } else {
3335 CmdArgs.push_back("-backend-option");
3336 CmdArgs.push_back("-arm-no-strict-align");
3337 }
Renato Golina146a482013-08-24 14:44:41 +00003338 }
Chad Rosier60027022012-11-09 17:29:19 +00003339 }
Eric Christopher84fbdb42011-08-19 00:30:14 +00003340
Weiming Zhao580dcfb2013-11-13 18:31:23 +00003341 if (Arg *A = Args.getLastArg(options::OPT_mrestrict_it,
3342 options::OPT_mno_restrict_it)) {
3343 if (A->getOption().matches(options::OPT_mrestrict_it)) {
3344 CmdArgs.push_back("-backend-option");
3345 CmdArgs.push_back("-arm-restrict-it");
3346 } else {
3347 CmdArgs.push_back("-backend-option");
3348 CmdArgs.push_back("-arm-no-restrict-it");
3349 }
3350 }
3351
Daniel Dunbard18049a2009-04-07 21:16:11 +00003352 // Forward -f options with positive and negative forms; we translate
3353 // these by hand.
Diego Novillo5c297052013-11-13 12:22:39 +00003354 if (Arg *A = Args.getLastArg(options::OPT_fprofile_sample_use_EQ)) {
3355 StringRef fname = A->getValue();
3356 if (!llvm::sys::fs::exists(fname))
3357 D.Diag(diag::err_drv_no_such_file) << fname;
3358 else
3359 A->render(Args, CmdArgs);
3360 }
Daniel Dunbard18049a2009-04-07 21:16:11 +00003361
Fariborz Jahaniana4cfff82011-01-07 01:05:02 +00003362 if (Args.hasArg(options::OPT_mkernel)) {
Daniel Dunbar80f787c2011-02-04 17:24:47 +00003363 if (!Args.hasArg(options::OPT_fapple_kext) && types::isCXX(InputType))
Fariborz Jahaniana4cfff82011-01-07 01:05:02 +00003364 CmdArgs.push_back("-fapple-kext");
3365 if (!Args.hasArg(options::OPT_fbuiltin))
3366 CmdArgs.push_back("-fno-builtin");
Chad Rosierf27e1c42012-03-26 21:29:17 +00003367 Args.ClaimAllArgs(options::OPT_fno_builtin);
Fariborz Jahaniana4cfff82011-01-07 01:05:02 +00003368 }
Daniel Dunbar4930e332009-11-17 08:07:36 +00003369 // -fbuiltin is default.
Fariborz Jahaniana4cfff82011-01-07 01:05:02 +00003370 else if (!Args.hasFlag(options::OPT_fbuiltin, options::OPT_fno_builtin))
Daniel Dunbar484afa22009-11-19 04:55:23 +00003371 CmdArgs.push_back("-fno-builtin");
Daniel Dunbard18049a2009-04-07 21:16:11 +00003372
Nuno Lopes13c88c72009-12-16 16:59:22 +00003373 if (!Args.hasFlag(options::OPT_fassume_sane_operator_new,
3374 options::OPT_fno_assume_sane_operator_new))
3375 CmdArgs.push_back("-fno-assume-sane-operator-new");
3376
Daniel Dunbar4930e332009-11-17 08:07:36 +00003377 // -fblocks=0 is default.
3378 if (Args.hasFlag(options::OPT_fblocks, options::OPT_fno_blocks,
David Chisnallda209912011-02-28 17:11:43 +00003379 getToolChain().IsBlocksDefault()) ||
3380 (Args.hasArg(options::OPT_fgnu_runtime) &&
3381 Args.hasArg(options::OPT_fobjc_nonfragile_abi) &&
3382 !Args.hasArg(options::OPT_fno_blocks))) {
Daniel Dunbar4930e332009-11-17 08:07:36 +00003383 CmdArgs.push_back("-fblocks");
John McCall7959fee2011-09-09 20:41:01 +00003384
3385 if (!Args.hasArg(options::OPT_fgnu_runtime) &&
3386 !getToolChain().hasBlocksRuntime())
3387 CmdArgs.push_back("-fblocks-runtime-optional");
David Chisnall950a9512009-11-17 19:33:30 +00003388 }
Daniel Dunbard18049a2009-04-07 21:16:11 +00003389
Douglas Gregor226173a2012-01-18 15:19:58 +00003390 // -fmodules enables modules (off by default). However, for C++/Objective-C++,
3391 // users must also pass -fcxx-modules. The latter flag will disappear once the
3392 // modules implementation is solid for C++/Objective-C++ programs as well.
Douglas Gregorc60437f2013-01-16 01:23:41 +00003393 bool HaveModules = false;
Douglas Gregor226173a2012-01-18 15:19:58 +00003394 if (Args.hasFlag(options::OPT_fmodules, options::OPT_fno_modules, false)) {
3395 bool AllowedInCXX = Args.hasFlag(options::OPT_fcxx_modules,
3396 options::OPT_fno_cxx_modules,
3397 false);
Douglas Gregorc60437f2013-01-16 01:23:41 +00003398 if (AllowedInCXX || !types::isCXX(InputType)) {
Douglas Gregor226173a2012-01-18 15:19:58 +00003399 CmdArgs.push_back("-fmodules");
Douglas Gregorc60437f2013-01-16 01:23:41 +00003400 HaveModules = true;
3401 }
3402 }
3403
Daniel Jasper07e6c402013-08-05 20:26:17 +00003404 // -fmodule-maps enables module map processing (off by default) for header
3405 // checking. It is implied by -fmodules.
3406 if (Args.hasFlag(options::OPT_fmodule_maps, options::OPT_fno_module_maps,
3407 false)) {
3408 CmdArgs.push_back("-fmodule-maps");
3409 }
3410
Daniel Jasperac42b752013-10-21 06:34:34 +00003411 // -fmodules-decluse checks that modules used are declared so (off by
3412 // default).
Daniel Jasperba7f2f72013-09-24 09:14:14 +00003413 if (Args.hasFlag(options::OPT_fmodules_decluse,
3414 options::OPT_fno_modules_decluse,
3415 false)) {
Daniel Jasper6e16d542013-09-29 12:40:54 +00003416 CmdArgs.push_back("-fmodules-decluse");
Daniel Jasperba7f2f72013-09-24 09:14:14 +00003417 }
3418
Daniel Jasperac42b752013-10-21 06:34:34 +00003419 // -fmodule-name specifies the module that is currently being built (or
3420 // used for header checking by -fmodule-maps).
3421 if (Arg *A = Args.getLastArg(options::OPT_fmodule_name)) {
3422 A->claim();
3423 A->render(Args, CmdArgs);
3424 }
3425
3426 // -fmodule-map-file can be used to specify a file containing module
3427 // definitions.
3428 if (Arg *A = Args.getLastArg(options::OPT_fmodule_map_file)) {
3429 A->claim();
3430 A->render(Args, CmdArgs);
3431 }
3432
Douglas Gregor35b04d62013-02-07 19:01:24 +00003433 // If a module path was provided, pass it along. Otherwise, use a temporary
3434 // directory.
3435 if (Arg *A = Args.getLastArg(options::OPT_fmodules_cache_path)) {
3436 A->claim();
3437 if (HaveModules) {
3438 A->render(Args, CmdArgs);
3439 }
3440 } else if (HaveModules) {
3441 SmallString<128> DefaultModuleCache;
3442 llvm::sys::path::system_temp_directory(/*erasedOnReboot=*/false,
3443 DefaultModuleCache);
Douglas Gregor23c7d672013-03-21 21:48:48 +00003444 llvm::sys::path::append(DefaultModuleCache, "org.llvm.clang");
3445 llvm::sys::path::append(DefaultModuleCache, "ModuleCache");
Douglas Gregor4bedb492013-02-07 22:59:12 +00003446 const char Arg[] = "-fmodules-cache-path=";
3447 DefaultModuleCache.insert(DefaultModuleCache.begin(),
3448 Arg, Arg + strlen(Arg));
Douglas Gregor35b04d62013-02-07 19:01:24 +00003449 CmdArgs.push_back(Args.MakeArgString(DefaultModuleCache));
3450 }
3451
Argyrios Kyrtzidis1594c152014-03-03 08:12:05 +00003452 if (Arg *A = Args.getLastArg(options::OPT_fmodules_user_build_path)) {
3453 A->claim();
3454 if (HaveModules) {
3455 A->render(Args, CmdArgs);
3456 }
3457 }
3458
Douglas Gregor35b04d62013-02-07 19:01:24 +00003459 // Pass through all -fmodules-ignore-macro arguments.
3460 Args.AddAllArgs(CmdArgs, options::OPT_fmodules_ignore_macro);
Douglas Gregor527b1c92013-03-25 21:19:16 +00003461 Args.AddLastArg(CmdArgs, options::OPT_fmodules_prune_interval);
3462 Args.AddLastArg(CmdArgs, options::OPT_fmodules_prune_after);
Douglas Gregor35b04d62013-02-07 19:01:24 +00003463
Dmitri Gribenkof430da42014-02-12 10:33:14 +00003464 Args.AddLastArg(CmdArgs, options::OPT_fbuild_session_timestamp);
3465
3466 if (Args.getLastArg(options::OPT_fmodules_validate_once_per_build_session)) {
3467 if (!Args.getLastArg(options::OPT_fbuild_session_timestamp))
3468 D.Diag(diag::err_drv_modules_validate_once_requires_timestamp);
3469
3470 Args.AddLastArg(CmdArgs,
3471 options::OPT_fmodules_validate_once_per_build_session);
3472 }
3473
Ben Langmuirdcf73862014-03-12 00:06:17 +00003474 Args.AddLastArg(CmdArgs, options::OPT_fmodules_validate_system_headers);
3475
John McCalldfea9982010-04-09 19:12:06 +00003476 // -faccess-control is default.
John McCall3155f572010-04-09 19:03:51 +00003477 if (Args.hasFlag(options::OPT_fno_access_control,
3478 options::OPT_faccess_control,
John McCalldfea9982010-04-09 19:12:06 +00003479 false))
John McCall3155f572010-04-09 19:03:51 +00003480 CmdArgs.push_back("-fno-access-control");
John McCall59bb1d42010-03-17 01:32:13 +00003481
Anders Carlssond470fef2010-11-21 00:09:52 +00003482 // -felide-constructors is the default.
3483 if (Args.hasFlag(options::OPT_fno_elide_constructors,
3484 options::OPT_felide_constructors,
3485 false))
3486 CmdArgs.push_back("-fno-elide-constructors");
3487
Daniel Dunbar0730e4f2009-11-17 07:06:20 +00003488 // -frtti is default.
Chad Rosier4fab82c2012-03-26 22:04:46 +00003489 if (!Args.hasFlag(options::OPT_frtti, options::OPT_fno_rtti) ||
Richard Smith52be6192012-11-05 22:04:41 +00003490 KernelOrKext) {
Daniel Dunbar484afa22009-11-19 04:55:23 +00003491 CmdArgs.push_back("-fno-rtti");
Mike Stump183c3d22009-07-31 23:15:31 +00003492
Richard Smith52be6192012-11-05 22:04:41 +00003493 // -fno-rtti cannot usefully be combined with -fsanitize=vptr.
Alexey Samsonov627b10f2012-11-06 15:09:03 +00003494 if (Sanitize.sanitizesVptr()) {
NAKAMURA Takumiab060362012-11-06 22:02:00 +00003495 std::string NoRttiArg =
Richard Smith52be6192012-11-05 22:04:41 +00003496 Args.getLastArg(options::OPT_mkernel,
3497 options::OPT_fapple_kext,
Richard Smithaa716572012-11-06 01:12:02 +00003498 options::OPT_fno_rtti)->getAsString(Args);
Richard Smith52be6192012-11-05 22:04:41 +00003499 D.Diag(diag::err_drv_argument_not_allowed_with)
3500 << "-fsanitize=vptr" << NoRttiArg;
3501 }
3502 }
3503
Tony Linthicum76329bf2011-12-12 21:14:55 +00003504 // -fshort-enums=0 is default for all architectures except Hexagon.
Argyrios Kyrtzidis74825bc2010-10-08 00:25:19 +00003505 if (Args.hasFlag(options::OPT_fshort_enums,
Tony Linthicum76329bf2011-12-12 21:14:55 +00003506 options::OPT_fno_short_enums,
Eli Benderskyd4a6aec2013-07-24 22:20:49 +00003507 getToolChain().getArch() ==
Tony Linthicum76329bf2011-12-12 21:14:55 +00003508 llvm::Triple::hexagon))
Argyrios Kyrtzidis74825bc2010-10-08 00:25:19 +00003509 CmdArgs.push_back("-fshort-enums");
3510
Daniel Dunbard609b7b2009-11-17 06:37:03 +00003511 // -fsigned-char is default.
Daniel Dunbar5bdd2992009-11-25 10:14:30 +00003512 if (!Args.hasFlag(options::OPT_fsigned_char, options::OPT_funsigned_char,
Daniel Dunbard609b7b2009-11-17 06:37:03 +00003513 isSignedCharDefault(getToolChain().getTriple())))
Daniel Dunbar5fe08662009-11-29 02:39:08 +00003514 CmdArgs.push_back("-fno-signed-char");
Eli Friedman327f0b52009-06-05 07:21:14 +00003515
Anders Carlssonfcd764a2010-02-06 23:23:06 +00003516 // -fthreadsafe-static is default.
Michael J. Spencer4c0ffa82010-10-21 03:16:25 +00003517 if (!Args.hasFlag(options::OPT_fthreadsafe_statics,
Anders Carlssonfcd764a2010-02-06 23:23:06 +00003518 options::OPT_fno_threadsafe_statics))
3519 CmdArgs.push_back("-fno-threadsafe-statics");
3520
Daniel Dunbarfe06df42010-03-20 04:15:41 +00003521 // -fuse-cxa-atexit is default.
Saleem Abdulrasool377066a2014-03-27 22:50:18 +00003522 if (!Args.hasFlag(options::OPT_fuse_cxa_atexit,
3523 options::OPT_fno_use_cxa_atexit,
3524 !IsWindowsCygnus && !IsWindowsGNU &&
3525 getToolChain().getArch() != llvm::Triple::hexagon &&
3526 getToolChain().getArch() != llvm::Triple::xcore) ||
Chad Rosier4fab82c2012-03-26 22:04:46 +00003527 KernelOrKext)
Daniel Dunbarfe06df42010-03-20 04:15:41 +00003528 CmdArgs.push_back("-fno-use-cxa-atexit");
3529
Daniel Dunbar0730e4f2009-11-17 07:06:20 +00003530 // -fms-extensions=0 is default.
Daniel Dunbar5bdd2992009-11-25 10:14:30 +00003531 if (Args.hasFlag(options::OPT_fms_extensions, options::OPT_fno_ms_extensions,
Saleem Abdulrasool377066a2014-03-27 22:50:18 +00003532 IsWindowsMSVC))
Daniel Dunbar0730e4f2009-11-17 07:06:20 +00003533 CmdArgs.push_back("-fms-extensions");
3534
Francois Pichet1b4f1632011-09-17 04:32:15 +00003535 // -fms-compatibility=0 is default.
Douglas Gregor2b4907e2011-10-24 15:49:38 +00003536 if (Args.hasFlag(options::OPT_fms_compatibility,
3537 options::OPT_fno_ms_compatibility,
Saleem Abdulrasool377066a2014-03-27 22:50:18 +00003538 (IsWindowsMSVC && Args.hasFlag(options::OPT_fms_extensions,
3539 options::OPT_fno_ms_extensions,
3540 true))))
Francois Pichet1b4f1632011-09-17 04:32:15 +00003541 CmdArgs.push_back("-fms-compatibility");
3542
Reid Klecknerc106fda2013-09-18 00:33:59 +00003543 // -fmsc-version=1700 is default.
Michael J. Spencer4992ca4b2010-10-21 05:21:48 +00003544 if (Args.hasFlag(options::OPT_fms_extensions, options::OPT_fno_ms_extensions,
Saleem Abdulrasool377066a2014-03-27 22:50:18 +00003545 IsWindowsMSVC) || Args.hasArg(options::OPT_fmsc_version)) {
Chris Lattner0e62c1c2011-07-23 10:55:15 +00003546 StringRef msc_ver = Args.getLastArgValue(options::OPT_fmsc_version);
Michael J. Spencer4992ca4b2010-10-21 05:21:48 +00003547 if (msc_ver.empty())
Reid Klecknerc106fda2013-09-18 00:33:59 +00003548 CmdArgs.push_back("-fmsc-version=1700");
Michael J. Spencer4992ca4b2010-10-21 05:21:48 +00003549 else
3550 CmdArgs.push_back(Args.MakeArgString("-fmsc-version=" + msc_ver));
3551 }
3552
3553
Eric Christopher5ecce122013-02-18 00:38:31 +00003554 // -fno-borland-extensions is default.
Dawn Perchik68bb1b42010-09-02 23:59:25 +00003555 if (Args.hasFlag(options::OPT_fborland_extensions,
3556 options::OPT_fno_borland_extensions, false))
3557 CmdArgs.push_back("-fborland-extensions");
3558
Francois Pichet02744872011-09-01 16:38:08 +00003559 // -fno-delayed-template-parsing is default, except for Windows where MSVC STL
3560 // needs it.
Francois Pichet1c229c02011-04-22 22:18:13 +00003561 if (Args.hasFlag(options::OPT_fdelayed_template_parsing,
Saleem Abdulrasool377066a2014-03-27 22:50:18 +00003562 options::OPT_fno_delayed_template_parsing, IsWindowsMSVC))
Francois Pichet35bc5de2011-08-26 00:22:34 +00003563 CmdArgs.push_back("-fdelayed-template-parsing");
Francois Pichet1c229c02011-04-22 22:18:13 +00003564
Chandler Carruthe03aa552010-04-17 20:17:31 +00003565 // -fgnu-keywords default varies depending on language; only pass if
3566 // specified.
3567 if (Arg *A = Args.getLastArg(options::OPT_fgnu_keywords,
Daniel Dunbardb059592010-04-24 17:56:39 +00003568 options::OPT_fno_gnu_keywords))
3569 A->render(Args, CmdArgs);
Chandler Carruthe03aa552010-04-17 20:17:31 +00003570
Rafael Espindola922a6242011-06-02 17:30:53 +00003571 if (Args.hasFlag(options::OPT_fgnu89_inline,
3572 options::OPT_fno_gnu89_inline,
3573 false))
Rafael Espindolafb2af642011-06-02 16:13:27 +00003574 CmdArgs.push_back("-fgnu89-inline");
3575
Chad Rosier9c76d242012-03-15 22:31:42 +00003576 if (Args.hasArg(options::OPT_fno_inline))
3577 CmdArgs.push_back("-fno-inline");
3578
Chad Rosier64d6be92012-03-06 21:17:19 +00003579 if (Args.hasArg(options::OPT_fno_inline_functions))
3580 CmdArgs.push_back("-fno-inline-functions");
Chad Rosier80603182012-03-06 18:49:20 +00003581
John McCall5fb5df92012-06-20 06:18:46 +00003582 ObjCRuntime objcRuntime = AddObjCRuntimeArgs(Args, CmdArgs, rewriteKind);
John McCall24fc0de2011-07-06 00:26:06 +00003583
John McCall5fb5df92012-06-20 06:18:46 +00003584 // -fobjc-dispatch-method is only relevant with the nonfragile-abi, and
Fariborz Jahanian15f60cb2014-01-20 19:32:33 +00003585 // legacy is the default. Except for deployment taget of 10.5,
3586 // next runtime is always legacy dispatch and -fno-objc-legacy-dispatch
3587 // gets ignored silently.
3588 if (objcRuntime.isNonFragile()) {
David Chisnall3154e682011-09-30 13:32:35 +00003589 if (!Args.hasFlag(options::OPT_fobjc_legacy_dispatch,
3590 options::OPT_fno_objc_legacy_dispatch,
David Chisnallda225352012-07-04 11:52:24 +00003591 objcRuntime.isLegacyDispatchDefaultForArch(
Eli Benderskyd4a6aec2013-07-24 22:20:49 +00003592 getToolChain().getArch()))) {
David Chisnall3154e682011-09-30 13:32:35 +00003593 if (getToolChain().UseObjCMixedDispatch())
3594 CmdArgs.push_back("-fobjc-dispatch-method=mixed");
3595 else
3596 CmdArgs.push_back("-fobjc-dispatch-method=non-legacy");
3597 }
3598 }
Rafael Espindolab44676c2013-11-12 04:33:56 +00003599
Fariborz Jahanianfd4ce192013-11-12 17:08:46 +00003600 // When ObjectiveC legacy runtime is in effect on MacOSX,
3601 // turn on the option to do Array/Dictionary subscripting
3602 // by default.
Fariborz Jahanianff6c97c2013-11-12 20:50:26 +00003603 if (getToolChain().getTriple().getArch() == llvm::Triple::x86 &&
3604 getToolChain().getTriple().isMacOSX() &&
3605 !getToolChain().getTriple().isMacOSXVersionLT(10, 7) &&
3606 objcRuntime.getKind() == ObjCRuntime::FragileMacOSX &&
Fariborz Jahanianfd4ce192013-11-12 17:08:46 +00003607 objcRuntime.isNeXTFamily())
3608 CmdArgs.push_back("-fobjc-subscripting-legacy-runtime");
3609
Fariborz Jahanian0e3043b2012-11-15 19:02:45 +00003610 // -fencode-extended-block-signature=1 is default.
3611 if (getToolChain().IsEncodeExtendedBlockSignatureDefault()) {
3612 CmdArgs.push_back("-fencode-extended-block-signature");
3613 }
3614
John McCall24fc0de2011-07-06 00:26:06 +00003615 // Allow -fno-objc-arr to trump -fobjc-arr/-fobjc-arc.
3616 // NOTE: This logic is duplicated in ToolChains.cpp.
3617 bool ARC = isObjCAutoRefCount(Args);
3618 if (ARC) {
John McCall3deb1ad2012-08-21 02:47:43 +00003619 getToolChain().CheckObjCARC();
Argyrios Kyrtzidis3dbeb552012-02-29 03:43:52 +00003620
John McCall24fc0de2011-07-06 00:26:06 +00003621 CmdArgs.push_back("-fobjc-arc");
3622
Chandler Carruth491db322011-11-04 07:34:47 +00003623 // FIXME: It seems like this entire block, and several around it should be
3624 // wrapped in isObjC, but for now we just use it here as this is where it
3625 // was being used previously.
3626 if (types::isCXX(InputType) && types::isObjC(InputType)) {
3627 if (getToolChain().GetCXXStdlibType(Args) == ToolChain::CST_Libcxx)
3628 CmdArgs.push_back("-fobjc-arc-cxxlib=libc++");
3629 else
3630 CmdArgs.push_back("-fobjc-arc-cxxlib=libstdc++");
3631 }
3632
John McCall24fc0de2011-07-06 00:26:06 +00003633 // Allow the user to enable full exceptions code emission.
3634 // We define off for Objective-CC, on for Objective-C++.
3635 if (Args.hasFlag(options::OPT_fobjc_arc_exceptions,
3636 options::OPT_fno_objc_arc_exceptions,
3637 /*default*/ types::isCXX(InputType)))
3638 CmdArgs.push_back("-fobjc-arc-exceptions");
3639 }
3640
3641 // -fobjc-infer-related-result-type is the default, except in the Objective-C
3642 // rewriter.
John McCall5fb5df92012-06-20 06:18:46 +00003643 if (rewriteKind != RK_None)
John McCall24fc0de2011-07-06 00:26:06 +00003644 CmdArgs.push_back("-fno-objc-infer-related-result-type");
Eric Christopher84fbdb42011-08-19 00:30:14 +00003645
John McCall24fc0de2011-07-06 00:26:06 +00003646 // Handle -fobjc-gc and -fobjc-gc-only. They are exclusive, and -fobjc-gc-only
3647 // takes precedence.
3648 const Arg *GCArg = Args.getLastArg(options::OPT_fobjc_gc_only);
3649 if (!GCArg)
3650 GCArg = Args.getLastArg(options::OPT_fobjc_gc);
3651 if (GCArg) {
3652 if (ARC) {
Chris Lattner0e62c1c2011-07-23 10:55:15 +00003653 D.Diag(diag::err_drv_objc_gc_arr)
John McCall24fc0de2011-07-06 00:26:06 +00003654 << GCArg->getAsString(Args);
3655 } else if (getToolChain().SupportsObjCGC()) {
3656 GCArg->render(Args, CmdArgs);
3657 } else {
3658 // FIXME: We should move this to a hard error.
Chris Lattner0e62c1c2011-07-23 10:55:15 +00003659 D.Diag(diag::warn_drv_objc_gc_unsupported)
John McCall24fc0de2011-07-06 00:26:06 +00003660 << GCArg->getAsString(Args);
3661 }
3662 }
3663
John McCallb5f652e2011-06-22 00:53:57 +00003664 // Add exception args.
3665 addExceptionArgs(Args, InputType, getToolChain().getTriple(),
John McCall5fb5df92012-06-20 06:18:46 +00003666 KernelOrKext, objcRuntime, CmdArgs);
John McCallb5f652e2011-06-22 00:53:57 +00003667
3668 if (getToolChain().UseSjLjExceptions())
3669 CmdArgs.push_back("-fsjlj-exceptions");
3670
3671 // C++ "sane" operator new.
Daniel Dunbar2e3f2c82010-02-01 21:07:25 +00003672 if (!Args.hasFlag(options::OPT_fassume_sane_operator_new,
3673 options::OPT_fno_assume_sane_operator_new))
3674 CmdArgs.push_back("-fno-assume-sane-operator-new");
3675
Daniel Dunbar34d7a992010-04-27 15:34:57 +00003676 // -fconstant-cfstrings is default, and may be subject to argument translation
3677 // on Darwin.
3678 if (!Args.hasFlag(options::OPT_fconstant_cfstrings,
3679 options::OPT_fno_constant_cfstrings) ||
3680 !Args.hasFlag(options::OPT_mconstant_cfstrings,
3681 options::OPT_mno_constant_cfstrings))
3682 CmdArgs.push_back("-fno-constant-cfstrings");
3683
John Thompsoned4e2952009-11-05 20:14:16 +00003684 // -fshort-wchar default varies depending on platform; only
3685 // pass if specified.
Richard Bartonc9b5f352014-02-24 18:43:28 +00003686 if (Arg *A = Args.getLastArg(options::OPT_fshort_wchar,
3687 options::OPT_fno_short_wchar))
Daniel Dunbar2cb4e7a2010-04-27 15:35:03 +00003688 A->render(Args, CmdArgs);
John Thompsoned4e2952009-11-05 20:14:16 +00003689
Hans Wennborg28c96312013-07-31 23:39:13 +00003690 // -fno-pascal-strings is default, only pass non-default.
Daniel Dunbard067f7f2009-04-08 23:54:23 +00003691 if (Args.hasFlag(options::OPT_fpascal_strings,
Daniel Dunbard4510f22009-04-07 23:51:44 +00003692 options::OPT_fno_pascal_strings,
Daniel Dunbard4510f22009-04-07 23:51:44 +00003693 false))
Daniel Dunbard18049a2009-04-07 21:16:11 +00003694 CmdArgs.push_back("-fpascal-strings");
NAKAMURA Takumi029d74b2011-02-17 08:50:50 +00003695
Daniel Dunbar096ed292011-10-05 21:04:55 +00003696 // Honor -fpack-struct= and -fpack-struct, if given. Note that
3697 // -fno-pack-struct doesn't apply to -fpack-struct=.
3698 if (Arg *A = Args.getLastArg(options::OPT_fpack_struct_EQ)) {
James Molloycebf75e2012-05-02 07:56:14 +00003699 std::string PackStructStr = "-fpack-struct=";
Richard Smithbd55daf2012-11-01 04:30:05 +00003700 PackStructStr += A->getValue();
James Molloycebf75e2012-05-02 07:56:14 +00003701 CmdArgs.push_back(Args.MakeArgString(PackStructStr));
Daniel Dunbar096ed292011-10-05 21:04:55 +00003702 } else if (Args.hasFlag(options::OPT_fpack_struct,
3703 options::OPT_fno_pack_struct, false)) {
James Molloycebf75e2012-05-02 07:56:14 +00003704 CmdArgs.push_back("-fpack-struct=1");
Daniel Dunbar096ed292011-10-05 21:04:55 +00003705 }
3706
Robert Lytton0e076492013-08-13 09:43:10 +00003707 if (KernelOrKext || isNoCommonDefault(getToolChain().getTriple())) {
Fariborz Jahaniana4cfff82011-01-07 01:05:02 +00003708 if (!Args.hasArg(options::OPT_fcommon))
3709 CmdArgs.push_back("-fno-common");
Chad Rosierd9d80e02012-03-26 21:35:40 +00003710 Args.ClaimAllArgs(options::OPT_fno_common);
Fariborz Jahaniana4cfff82011-01-07 01:05:02 +00003711 }
Daniel Dunbar096ed292011-10-05 21:04:55 +00003712
Daniel Dunbard18049a2009-04-07 21:16:11 +00003713 // -fcommon is default, only pass non-default.
Fariborz Jahaniana4cfff82011-01-07 01:05:02 +00003714 else if (!Args.hasFlag(options::OPT_fcommon, options::OPT_fno_common))
Daniel Dunbard18049a2009-04-07 21:16:11 +00003715 CmdArgs.push_back("-fno-common");
3716
Daniel Dunbar2edd9232009-04-15 02:37:43 +00003717 // -fsigned-bitfields is default, and clang doesn't yet support
Daniel Dunbar6358d682010-10-15 22:30:42 +00003718 // -funsigned-bitfields.
Mike Stump11289f42009-09-09 15:08:12 +00003719 if (!Args.hasFlag(options::OPT_fsigned_bitfields,
Daniel Dunbar2edd9232009-04-15 02:37:43 +00003720 options::OPT_funsigned_bitfields))
Chris Lattner0e62c1c2011-07-23 10:55:15 +00003721 D.Diag(diag::warn_drv_clang_unsupported)
Daniel Dunbar2edd9232009-04-15 02:37:43 +00003722 << Args.getLastArg(options::OPT_funsigned_bitfields)->getAsString(Args);
3723
Daniel Dunbar6358d682010-10-15 22:30:42 +00003724 // -fsigned-bitfields is default, and clang doesn't support -fno-for-scope.
3725 if (!Args.hasFlag(options::OPT_ffor_scope,
3726 options::OPT_fno_for_scope))
Chris Lattner0e62c1c2011-07-23 10:55:15 +00003727 D.Diag(diag::err_drv_clang_unsupported)
Daniel Dunbar6358d682010-10-15 22:30:42 +00003728 << Args.getLastArg(options::OPT_fno_for_scope)->getAsString(Args);
3729
Jeffrey Yasskin460aa542010-06-08 04:56:20 +00003730 // -fcaret-diagnostics is default.
3731 if (!Args.hasFlag(options::OPT_fcaret_diagnostics,
3732 options::OPT_fno_caret_diagnostics, true))
3733 CmdArgs.push_back("-fno-caret-diagnostics");
3734
Daniel Dunbar8281bde2009-04-19 21:09:34 +00003735 // -fdiagnostics-fixit-info is default, only pass non-default.
Mike Stump11289f42009-09-09 15:08:12 +00003736 if (!Args.hasFlag(options::OPT_fdiagnostics_fixit_info,
Daniel Dunbar8281bde2009-04-19 21:09:34 +00003737 options::OPT_fno_diagnostics_fixit_info))
3738 CmdArgs.push_back("-fno-diagnostics-fixit-info");
Eric Christopher84fbdb42011-08-19 00:30:14 +00003739
Daniel Dunbar092f0cc2009-04-16 06:32:38 +00003740 // Enable -fdiagnostics-show-option by default.
Mike Stump11289f42009-09-09 15:08:12 +00003741 if (Args.hasFlag(options::OPT_fdiagnostics_show_option,
Daniel Dunbar092f0cc2009-04-16 06:32:38 +00003742 options::OPT_fno_diagnostics_show_option))
3743 CmdArgs.push_back("-fdiagnostics-show-option");
Daniel Dunbar5ec95022009-11-04 06:24:57 +00003744
Chris Lattnerbf6fac82010-05-04 21:55:25 +00003745 if (const Arg *A =
3746 Args.getLastArg(options::OPT_fdiagnostics_show_category_EQ)) {
3747 CmdArgs.push_back("-fdiagnostics-show-category");
Richard Smithbd55daf2012-11-01 04:30:05 +00003748 CmdArgs.push_back(A->getValue());
Chris Lattnerbf6fac82010-05-04 21:55:25 +00003749 }
Daniel Dunbarfe6c97b2010-08-24 16:47:49 +00003750
Douglas Gregor643c9222011-05-21 17:07:29 +00003751 if (const Arg *A =
3752 Args.getLastArg(options::OPT_fdiagnostics_format_EQ)) {
3753 CmdArgs.push_back("-fdiagnostics-format");
Richard Smithbd55daf2012-11-01 04:30:05 +00003754 CmdArgs.push_back(A->getValue());
Douglas Gregor643c9222011-05-21 17:07:29 +00003755 }
3756
Chandler Carruthb6766f02011-03-27 01:50:55 +00003757 if (Arg *A = Args.getLastArg(
3758 options::OPT_fdiagnostics_show_note_include_stack,
3759 options::OPT_fno_diagnostics_show_note_include_stack)) {
3760 if (A->getOption().matches(
3761 options::OPT_fdiagnostics_show_note_include_stack))
3762 CmdArgs.push_back("-fdiagnostics-show-note-include-stack");
3763 else
3764 CmdArgs.push_back("-fno-diagnostics-show-note-include-stack");
3765 }
3766
Daniel Dunbar5ec95022009-11-04 06:24:57 +00003767 // Color diagnostics are the default, unless the terminal doesn't support
3768 // them.
Nico Weber7e2da792013-04-17 21:52:44 +00003769 // Support both clang's -f[no-]color-diagnostics and gcc's
3770 // -f[no-]diagnostics-colors[=never|always|auto].
3771 enum { Colors_On, Colors_Off, Colors_Auto } ShowColors = Colors_Auto;
3772 for (ArgList::const_iterator it = Args.begin(), ie = Args.end();
3773 it != ie; ++it) {
3774 const Option &O = (*it)->getOption();
3775 if (!O.matches(options::OPT_fcolor_diagnostics) &&
3776 !O.matches(options::OPT_fdiagnostics_color) &&
3777 !O.matches(options::OPT_fno_color_diagnostics) &&
3778 !O.matches(options::OPT_fno_diagnostics_color) &&
3779 !O.matches(options::OPT_fdiagnostics_color_EQ))
3780 continue;
3781
3782 (*it)->claim();
3783 if (O.matches(options::OPT_fcolor_diagnostics) ||
3784 O.matches(options::OPT_fdiagnostics_color)) {
3785 ShowColors = Colors_On;
3786 } else if (O.matches(options::OPT_fno_color_diagnostics) ||
3787 O.matches(options::OPT_fno_diagnostics_color)) {
3788 ShowColors = Colors_Off;
3789 } else {
3790 assert(O.matches(options::OPT_fdiagnostics_color_EQ));
3791 StringRef value((*it)->getValue());
3792 if (value == "always")
3793 ShowColors = Colors_On;
3794 else if (value == "never")
3795 ShowColors = Colors_Off;
3796 else if (value == "auto")
3797 ShowColors = Colors_Auto;
3798 else
3799 getToolChain().getDriver().Diag(diag::err_drv_clang_unsupported)
3800 << ("-fdiagnostics-color=" + value).str();
3801 }
3802 }
3803 if (ShowColors == Colors_On ||
3804 (ShowColors == Colors_Auto && llvm::sys::Process::StandardErrHasColors()))
Daniel Dunbar5ec95022009-11-04 06:24:57 +00003805 CmdArgs.push_back("-fcolor-diagnostics");
3806
Nico Rieck7857d462013-09-11 00:38:02 +00003807 if (Args.hasArg(options::OPT_fansi_escape_codes))
3808 CmdArgs.push_back("-fansi-escape-codes");
3809
Daniel Dunbardb097022009-06-08 21:13:54 +00003810 if (!Args.hasFlag(options::OPT_fshow_source_location,
3811 options::OPT_fno_show_source_location))
3812 CmdArgs.push_back("-fno-show-source-location");
Daniel Dunbar092f0cc2009-04-16 06:32:38 +00003813
Douglas Gregor643c9222011-05-21 17:07:29 +00003814 if (!Args.hasFlag(options::OPT_fshow_column,
3815 options::OPT_fno_show_column,
3816 true))
3817 CmdArgs.push_back("-fno-show-column");
3818
Douglas Gregor8ed0c0b2010-07-09 17:35:33 +00003819 if (!Args.hasFlag(options::OPT_fspell_checking,
3820 options::OPT_fno_spell_checking))
3821 CmdArgs.push_back("-fno-spell-checking");
Daniel Dunbarfe6c97b2010-08-24 16:47:49 +00003822
Daniel Dunbar473f8a62010-10-18 22:49:46 +00003823
Chad Rosierc8e56e82012-12-05 21:08:21 +00003824 // -fno-asm-blocks is default.
3825 if (Args.hasFlag(options::OPT_fasm_blocks, options::OPT_fno_asm_blocks,
3826 false))
3827 CmdArgs.push_back("-fasm-blocks");
Daniel Dunbar473f8a62010-10-18 22:49:46 +00003828
Arnold Schwaighofer7f994ce2013-08-13 15:46:23 +00003829 // Enable vectorization per default according to the optimization level
3830 // selected. For optimization levels that want vectorization we use the alias
3831 // option to simplify the hasFlag logic.
3832 bool EnableVec = shouldEnableVectorizerAtOLevel(Args);
3833 OptSpecifier VectorizeAliasOption = EnableVec ? options::OPT_O_Group :
Chad Rosier679b0752013-04-24 18:29:59 +00003834 options::OPT_fvectorize;
Chad Rosier679b0752013-04-24 18:29:59 +00003835 if (Args.hasFlag(options::OPT_fvectorize, VectorizeAliasOption,
Hal Finkel108c46a2013-08-28 05:21:45 +00003836 options::OPT_fno_vectorize, EnableVec))
Chad Rosier0d3ed6f2012-12-11 17:12:28 +00003837 CmdArgs.push_back("-vectorize-loops");
Chad Rosier0d3ed6f2012-12-11 17:12:28 +00003838
Rafael Espindolaf818ef42013-08-01 23:56:42 +00003839 // -fslp-vectorize is default.
3840 if (Args.hasFlag(options::OPT_fslp_vectorize,
3841 options::OPT_fno_slp_vectorize, true))
Nadav Rotem0a2604d2013-04-15 04:57:18 +00003842 CmdArgs.push_back("-vectorize-slp");
Hal Finkel061f1652012-12-11 19:59:32 +00003843
Nadav Rotem6a0dd6b2013-04-15 05:38:41 +00003844 // -fno-slp-vectorize-aggressive is default.
3845 if (Args.hasFlag(options::OPT_fslp_vectorize_aggressive,
Nick Lewyckyd3f3e4f2013-06-25 01:49:44 +00003846 options::OPT_fno_slp_vectorize_aggressive, false))
Nadav Rotem6a0dd6b2013-04-15 05:38:41 +00003847 CmdArgs.push_back("-vectorize-slp-aggressive");
Nadav Rotem6a0dd6b2013-04-15 05:38:41 +00003848
Jeffrey Yasskin2b99c6f2010-06-11 05:57:47 +00003849 if (Arg *A = Args.getLastArg(options::OPT_fshow_overloads_EQ))
3850 A->render(Args, CmdArgs);
3851
Daniel Dunbarf5e9b1f2009-04-19 21:20:32 +00003852 // -fdollars-in-identifiers default varies depending on platform and
3853 // language; only pass if specified.
Mike Stump11289f42009-09-09 15:08:12 +00003854 if (Arg *A = Args.getLastArg(options::OPT_fdollars_in_identifiers,
Daniel Dunbarf5e9b1f2009-04-19 21:20:32 +00003855 options::OPT_fno_dollars_in_identifiers)) {
3856 if (A->getOption().matches(options::OPT_fdollars_in_identifiers))
Daniel Dunbar15cef0e2009-12-16 20:10:18 +00003857 CmdArgs.push_back("-fdollars-in-identifiers");
Daniel Dunbarf5e9b1f2009-04-19 21:20:32 +00003858 else
Daniel Dunbar15cef0e2009-12-16 20:10:18 +00003859 CmdArgs.push_back("-fno-dollars-in-identifiers");
Daniel Dunbarf5e9b1f2009-04-19 21:20:32 +00003860 }
3861
Daniel Dunbaradeeb052009-05-22 19:02:20 +00003862 // -funit-at-a-time is default, and we don't support -fno-unit-at-a-time for
3863 // practical purposes.
Mike Stump11289f42009-09-09 15:08:12 +00003864 if (Arg *A = Args.getLastArg(options::OPT_funit_at_a_time,
Daniel Dunbaradeeb052009-05-22 19:02:20 +00003865 options::OPT_fno_unit_at_a_time)) {
3866 if (A->getOption().matches(options::OPT_fno_unit_at_a_time))
Chris Lattner0e62c1c2011-07-23 10:55:15 +00003867 D.Diag(diag::warn_drv_clang_unsupported) << A->getAsString(Args);
Daniel Dunbaradeeb052009-05-22 19:02:20 +00003868 }
Eli Friedmanbb0d9a52009-07-14 21:58:17 +00003869
Eli Friedman055c9702011-11-02 01:53:16 +00003870 if (Args.hasFlag(options::OPT_fapple_pragma_pack,
3871 options::OPT_fno_apple_pragma_pack, false))
3872 CmdArgs.push_back("-fapple-pragma-pack");
3873
Eli Benderskyc95cfe82013-07-24 18:20:14 +00003874 // le32-specific flags:
3875 // -fno-math-builtin: clang should not convert math builtins to intrinsics
3876 // by default.
3877 if (getToolChain().getArch() == llvm::Triple::le32) {
3878 CmdArgs.push_back("-fno-math-builtin");
3879 }
3880
Daniel Dunbar2ffe0292009-09-10 03:37:02 +00003881 // Default to -fno-builtin-str{cat,cpy} on Darwin for ARM.
Daniel Dunbar4fa08112009-09-10 04:57:27 +00003882 //
Daniel Dunbar6c536aa2009-12-11 23:00:49 +00003883 // FIXME: This is disabled until clang -cc1 supports -fno-builtin-foo. PR4941.
Daniel Dunbar4fa08112009-09-10 04:57:27 +00003884#if 0
Bob Wilson6524dd32011-10-14 05:03:44 +00003885 if (getToolChain().getTriple().isOSDarwin() &&
Eli Benderskyd4a6aec2013-07-24 22:20:49 +00003886 (getToolChain().getArch() == llvm::Triple::arm ||
3887 getToolChain().getArch() == llvm::Triple::thumb)) {
Daniel Dunbar2ffe0292009-09-10 03:37:02 +00003888 if (!Args.hasArg(options::OPT_fbuiltin_strcat))
3889 CmdArgs.push_back("-fno-builtin-strcat");
3890 if (!Args.hasArg(options::OPT_fbuiltin_strcpy))
3891 CmdArgs.push_back("-fno-builtin-strcpy");
3892 }
Daniel Dunbar4fa08112009-09-10 04:57:27 +00003893#endif
Daniel Dunbar2ffe0292009-09-10 03:37:02 +00003894
Daniel Dunbar8c3d7352011-03-18 21:23:40 +00003895 // Only allow -traditional or -traditional-cpp outside in preprocessing modes.
Mike Stump11289f42009-09-09 15:08:12 +00003896 if (Arg *A = Args.getLastArg(options::OPT_traditional,
Daniel Dunbar8c3d7352011-03-18 21:23:40 +00003897 options::OPT_traditional_cpp)) {
3898 if (isa<PreprocessJobAction>(JA))
3899 CmdArgs.push_back("-traditional-cpp");
Eric Christopher84fbdb42011-08-19 00:30:14 +00003900 else
Chris Lattner0e62c1c2011-07-23 10:55:15 +00003901 D.Diag(diag::err_drv_clang_unsupported) << A->getAsString(Args);
Daniel Dunbar8c3d7352011-03-18 21:23:40 +00003902 }
Eli Friedmanbb0d9a52009-07-14 21:58:17 +00003903
Daniel Dunbara2aedc62009-03-18 10:01:51 +00003904 Args.AddLastArg(CmdArgs, options::OPT_dM);
Chris Lattnercac63f32009-04-12 01:56:53 +00003905 Args.AddLastArg(CmdArgs, options::OPT_dD);
Ted Kremeneke73d9ed2011-11-11 00:07:43 +00003906
3907 // Handle serialized diagnostics.
3908 if (Arg *A = Args.getLastArg(options::OPT__serialize_diags)) {
3909 CmdArgs.push_back("-serialize-diagnostic-file");
Richard Smithbd55daf2012-11-01 04:30:05 +00003910 CmdArgs.push_back(Args.MakeArgString(A->getValue()));
Ted Kremeneke73d9ed2011-11-11 00:07:43 +00003911 }
Daniel Dunbara2aedc62009-03-18 10:01:51 +00003912
Ted Kremenekb47e6bc2012-09-13 06:41:18 +00003913 if (Args.hasArg(options::OPT_fretain_comments_from_system_headers))
3914 CmdArgs.push_back("-fretain-comments-from-system-headers");
3915
Dmitri Gribenkoacf2e782013-02-22 14:21:27 +00003916 // Forward -fcomment-block-commands to -cc1.
3917 Args.AddAllArgs(CmdArgs, options::OPT_fcomment_block_commands);
Dmitri Gribenkoa7d16ce2013-04-10 15:35:17 +00003918 // Forward -fparse-all-comments to -cc1.
3919 Args.AddAllArgs(CmdArgs, options::OPT_fparse_all_comments);
Dmitri Gribenkoacf2e782013-02-22 14:21:27 +00003920
Daniel Dunbar76fa8402010-04-15 06:09:03 +00003921 // Forward -Xclang arguments to -cc1, and -mllvm arguments to the LLVM option
3922 // parser.
Daniel Dunbara2aedc62009-03-18 10:01:51 +00003923 Args.AddAllArgValues(CmdArgs, options::OPT_Xclang);
Daniel Dunbar76fa8402010-04-15 06:09:03 +00003924 for (arg_iterator it = Args.filtered_begin(options::OPT_mllvm),
3925 ie = Args.filtered_end(); it != ie; ++it) {
Daniel Dunbara442fd52010-06-11 22:00:13 +00003926 (*it)->claim();
Daniel Dunbar88534f42010-04-17 06:10:00 +00003927
Daniel Dunbar76fa8402010-04-15 06:09:03 +00003928 // We translate this by hand to the -cc1 argument, since nightly test uses
3929 // it and developers have been trained to spell it with -mllvm.
Richard Smithbd55daf2012-11-01 04:30:05 +00003930 if (StringRef((*it)->getValue(0)) == "-disable-llvm-optzns")
Daniel Dunbar76fa8402010-04-15 06:09:03 +00003931 CmdArgs.push_back("-disable-llvm-optzns");
3932 else
Daniel Dunbara442fd52010-06-11 22:00:13 +00003933 (*it)->render(Args, CmdArgs);
Daniel Dunbar76fa8402010-04-15 06:09:03 +00003934 }
Daniel Dunbara2aedc62009-03-18 10:01:51 +00003935
Daniel Dunbard67a3222009-03-30 06:36:42 +00003936 if (Output.getType() == types::TY_Dependencies) {
3937 // Handled with other dependency code.
Daniel Dunbar5cdf3e02009-03-19 07:29:38 +00003938 } else if (Output.isFilename()) {
Daniel Dunbara3246a02009-03-18 08:07:30 +00003939 CmdArgs.push_back("-o");
Daniel Dunbar5cdf3e02009-03-19 07:29:38 +00003940 CmdArgs.push_back(Output.getFilename());
3941 } else {
3942 assert(Output.isNothing() && "Invalid output.");
Daniel Dunbara3246a02009-03-18 08:07:30 +00003943 }
3944
Daniel Dunbara2aedc62009-03-18 10:01:51 +00003945 for (InputInfoList::const_iterator
3946 it = Inputs.begin(), ie = Inputs.end(); it != ie; ++it) {
3947 const InputInfo &II = *it;
Ben Langmuir2cb4a782014-02-05 22:21:15 +00003948
3949 addDashXForInput(Args, II, CmdArgs);
3950
Daniel Dunbarb440f562010-08-02 02:38:21 +00003951 if (II.isFilename())
Daniel Dunbar5cdf3e02009-03-19 07:29:38 +00003952 CmdArgs.push_back(II.getFilename());
Daniel Dunbara2aedc62009-03-18 10:01:51 +00003953 else
Daniel Dunbar5cdf3e02009-03-19 07:29:38 +00003954 II.getInputArg().renderAsInput(Args, CmdArgs);
Daniel Dunbara2aedc62009-03-18 10:01:51 +00003955 }
Daniel Dunbard067f7f2009-04-08 23:54:23 +00003956
Chris Lattnere9d7d782009-11-03 19:50:27 +00003957 Args.AddAllArgs(CmdArgs, options::OPT_undef);
3958
Daniel Dunbarb31b76f2010-07-18 21:16:15 +00003959 const char *Exec = getToolChain().getDriver().getClangProgramPath();
Daniel Dunbar24c7f5e2009-12-18 02:43:17 +00003960
3961 // Optionally embed the -cc1 level arguments into the debug info, for build
3962 // analysis.
3963 if (getToolChain().UseDwarfDebugFlags()) {
Daniel Dunbar7f3d9502010-06-04 18:47:06 +00003964 ArgStringList OriginalArgs;
3965 for (ArgList::const_iterator it = Args.begin(),
3966 ie = Args.end(); it != ie; ++it)
3967 (*it)->render(Args, OriginalArgs);
Daniel Dunbarfe6c97b2010-08-24 16:47:49 +00003968
Dylan Noblesmith2c1dd272012-02-05 02:13:05 +00003969 SmallString<256> Flags;
Daniel Dunbar24c7f5e2009-12-18 02:43:17 +00003970 Flags += Exec;
Daniel Dunbar7f3d9502010-06-04 18:47:06 +00003971 for (unsigned i = 0, e = OriginalArgs.size(); i != e; ++i) {
Daniel Dunbar24c7f5e2009-12-18 02:43:17 +00003972 Flags += " ";
Daniel Dunbar7f3d9502010-06-04 18:47:06 +00003973 Flags += OriginalArgs[i];
Daniel Dunbar24c7f5e2009-12-18 02:43:17 +00003974 }
3975 CmdArgs.push_back("-dwarf-debug-flags");
3976 CmdArgs.push_back(Args.MakeArgString(Flags.str()));
3977 }
3978
Eric Christopherd3804002013-02-22 20:12:52 +00003979 // Add the split debug info name to the command lines here so we
3980 // can propagate it to the backend.
3981 bool SplitDwarf = Args.hasArg(options::OPT_gsplit_dwarf) &&
Cameron Esfahani556d91e2013-09-14 01:09:11 +00003982 getToolChain().getTriple().isOSLinux() &&
Eric Christopherf1545832013-02-22 23:50:16 +00003983 (isa<AssembleJobAction>(JA) || isa<CompileJobAction>(JA));
Eric Christopherd3804002013-02-22 20:12:52 +00003984 const char *SplitDwarfOut;
3985 if (SplitDwarf) {
3986 CmdArgs.push_back("-split-dwarf-file");
3987 SplitDwarfOut = SplitDebugName(Args, Inputs);
3988 CmdArgs.push_back(SplitDwarfOut);
3989 }
3990
3991 // Finally add the compile command to the compilation.
Hans Wennborg859422a2014-01-13 22:24:42 +00003992 if (Args.hasArg(options::OPT__SLASH_fallback) &&
3993 Output.getType() == types::TY_Object) {
Hans Wennborg87cfa712013-09-19 20:32:16 +00003994 tools::visualstudio::Compile CL(getToolChain());
3995 Command *CLCommand = CL.GetCommand(C, JA, Output, Inputs, Args,
3996 LinkingOutput);
3997 C.addCommand(new FallbackCommand(JA, *this, Exec, CmdArgs, CLCommand));
3998 } else {
3999 C.addCommand(new Command(JA, *this, Exec, CmdArgs));
4000 }
4001
Daniel Dunbar17731772009-03-23 19:03:36 +00004002
Eric Christopherf1545832013-02-22 23:50:16 +00004003 // Handle the debug info splitting at object creation time if we're
4004 // creating an object.
Eric Christopher248357f2013-02-21 22:35:01 +00004005 // TODO: Currently only works on linux with newer objcopy.
Eric Christopherf1545832013-02-22 23:50:16 +00004006 if (SplitDwarf && !isa<CompileJobAction>(JA))
Eric Christopherd3804002013-02-22 20:12:52 +00004007 SplitDebugInfo(getToolChain(), C, *this, JA, Args, Output, SplitDwarfOut);
Eric Christopher248357f2013-02-21 22:35:01 +00004008
Roman Divacky178e01602011-02-10 16:52:03 +00004009 if (Arg *A = Args.getLastArg(options::OPT_pg))
4010 if (Args.hasArg(options::OPT_fomit_frame_pointer))
Chris Lattner0e62c1c2011-07-23 10:55:15 +00004011 D.Diag(diag::err_drv_argument_not_allowed_with)
Roman Divacky178e01602011-02-10 16:52:03 +00004012 << "-fomit-frame-pointer" << A->getAsString(Args);
Michael J. Spencer4c0ffa82010-10-21 03:16:25 +00004013
Daniel Dunbarc2a71892009-04-03 20:51:31 +00004014 // Claim some arguments which clang supports automatically.
4015
Daniel Dunbar3e0cac62010-04-15 06:18:42 +00004016 // -fpch-preprocess is used with gcc to add a special marker in the output to
4017 // include the PCH file. Clang's PTH solution is completely transparent, so we
4018 // do not need to deal with it at all.
Daniel Dunbarc2a71892009-04-03 20:51:31 +00004019 Args.ClaimAllArgs(options::OPT_fpch_preprocess);
Daniel Dunbard067f7f2009-04-08 23:54:23 +00004020
Daniel Dunbar17731772009-03-23 19:03:36 +00004021 // Claim some arguments which clang doesn't support, but we don't
4022 // care to warn the user about.
Daniel Dunbar44b36ee2009-11-25 11:53:23 +00004023 Args.ClaimAllArgs(options::OPT_clang_ignored_f_Group);
4024 Args.ClaimAllArgs(options::OPT_clang_ignored_m_Group);
Rafael Espindola22f603032011-02-28 23:29:45 +00004025
Rafael Espindolab0092d72013-09-04 19:37:35 +00004026 // Disable warnings for clang -E -emit-llvm foo.c
Rafael Espindolad95a8122011-03-01 05:25:27 +00004027 Args.ClaimAllArgs(options::OPT_emit_llvm);
Daniel Dunbar1a093d22009-03-18 06:00:36 +00004028}
4029
John McCall5fb5df92012-06-20 06:18:46 +00004030/// Add options related to the Objective-C runtime/ABI.
4031///
4032/// Returns true if the runtime is non-fragile.
4033ObjCRuntime Clang::AddObjCRuntimeArgs(const ArgList &args,
4034 ArgStringList &cmdArgs,
4035 RewriteKind rewriteKind) const {
4036 // Look for the controlling runtime option.
4037 Arg *runtimeArg = args.getLastArg(options::OPT_fnext_runtime,
4038 options::OPT_fgnu_runtime,
4039 options::OPT_fobjc_runtime_EQ);
4040
4041 // Just forward -fobjc-runtime= to the frontend. This supercedes
4042 // options about fragility.
4043 if (runtimeArg &&
4044 runtimeArg->getOption().matches(options::OPT_fobjc_runtime_EQ)) {
4045 ObjCRuntime runtime;
Richard Smithbd55daf2012-11-01 04:30:05 +00004046 StringRef value = runtimeArg->getValue();
John McCall5fb5df92012-06-20 06:18:46 +00004047 if (runtime.tryParse(value)) {
4048 getToolChain().getDriver().Diag(diag::err_drv_unknown_objc_runtime)
4049 << value;
4050 }
4051
4052 runtimeArg->render(args, cmdArgs);
4053 return runtime;
4054 }
4055
4056 // Otherwise, we'll need the ABI "version". Version numbers are
4057 // slightly confusing for historical reasons:
4058 // 1 - Traditional "fragile" ABI
4059 // 2 - Non-fragile ABI, version 1
4060 // 3 - Non-fragile ABI, version 2
4061 unsigned objcABIVersion = 1;
4062 // If -fobjc-abi-version= is present, use that to set the version.
4063 if (Arg *abiArg = args.getLastArg(options::OPT_fobjc_abi_version_EQ)) {
Richard Smithbd55daf2012-11-01 04:30:05 +00004064 StringRef value = abiArg->getValue();
John McCall5fb5df92012-06-20 06:18:46 +00004065 if (value == "1")
4066 objcABIVersion = 1;
4067 else if (value == "2")
4068 objcABIVersion = 2;
4069 else if (value == "3")
4070 objcABIVersion = 3;
4071 else
4072 getToolChain().getDriver().Diag(diag::err_drv_clang_unsupported)
4073 << value;
4074 } else {
4075 // Otherwise, determine if we are using the non-fragile ABI.
4076 bool nonFragileABIIsDefault =
4077 (rewriteKind == RK_NonFragile ||
4078 (rewriteKind == RK_None &&
4079 getToolChain().IsObjCNonFragileABIDefault()));
4080 if (args.hasFlag(options::OPT_fobjc_nonfragile_abi,
4081 options::OPT_fno_objc_nonfragile_abi,
4082 nonFragileABIIsDefault)) {
4083 // Determine the non-fragile ABI version to use.
4084#ifdef DISABLE_DEFAULT_NONFRAGILEABI_TWO
4085 unsigned nonFragileABIVersion = 1;
4086#else
4087 unsigned nonFragileABIVersion = 2;
4088#endif
4089
4090 if (Arg *abiArg = args.getLastArg(
4091 options::OPT_fobjc_nonfragile_abi_version_EQ)) {
Richard Smithbd55daf2012-11-01 04:30:05 +00004092 StringRef value = abiArg->getValue();
John McCall5fb5df92012-06-20 06:18:46 +00004093 if (value == "1")
4094 nonFragileABIVersion = 1;
4095 else if (value == "2")
4096 nonFragileABIVersion = 2;
4097 else
4098 getToolChain().getDriver().Diag(diag::err_drv_clang_unsupported)
4099 << value;
4100 }
4101
4102 objcABIVersion = 1 + nonFragileABIVersion;
4103 } else {
4104 objcABIVersion = 1;
4105 }
4106 }
4107
4108 // We don't actually care about the ABI version other than whether
4109 // it's non-fragile.
4110 bool isNonFragile = objcABIVersion != 1;
4111
4112 // If we have no runtime argument, ask the toolchain for its default runtime.
4113 // However, the rewriter only really supports the Mac runtime, so assume that.
4114 ObjCRuntime runtime;
4115 if (!runtimeArg) {
4116 switch (rewriteKind) {
4117 case RK_None:
4118 runtime = getToolChain().getDefaultObjCRuntime(isNonFragile);
4119 break;
4120 case RK_Fragile:
4121 runtime = ObjCRuntime(ObjCRuntime::FragileMacOSX, VersionTuple());
4122 break;
4123 case RK_NonFragile:
4124 runtime = ObjCRuntime(ObjCRuntime::MacOSX, VersionTuple());
4125 break;
4126 }
4127
4128 // -fnext-runtime
4129 } else if (runtimeArg->getOption().matches(options::OPT_fnext_runtime)) {
4130 // On Darwin, make this use the default behavior for the toolchain.
Jonathan Roelofs2cea1be2014-02-12 03:21:20 +00004131 if (getToolChain().getTriple().isOSDarwin()) {
John McCall5fb5df92012-06-20 06:18:46 +00004132 runtime = getToolChain().getDefaultObjCRuntime(isNonFragile);
4133
4134 // Otherwise, build for a generic macosx port.
4135 } else {
4136 runtime = ObjCRuntime(ObjCRuntime::MacOSX, VersionTuple());
4137 }
4138
4139 // -fgnu-runtime
4140 } else {
4141 assert(runtimeArg->getOption().matches(options::OPT_fgnu_runtime));
David Chisnall314896c2012-07-04 10:37:03 +00004142 // Legacy behaviour is to target the gnustep runtime if we are i
4143 // non-fragile mode or the GCC runtime in fragile mode.
4144 if (isNonFragile)
David Chisnalla5f59412012-10-16 15:11:55 +00004145 runtime = ObjCRuntime(ObjCRuntime::GNUstep, VersionTuple(1,6));
David Chisnall314896c2012-07-04 10:37:03 +00004146 else
4147 runtime = ObjCRuntime(ObjCRuntime::GCC, VersionTuple());
John McCall5fb5df92012-06-20 06:18:46 +00004148 }
4149
4150 cmdArgs.push_back(args.MakeArgString(
4151 "-fobjc-runtime=" + runtime.getAsString()));
4152 return runtime;
4153}
4154
Hans Wennborg75958c42013-08-08 00:17:41 +00004155void Clang::AddClangCLArgs(const ArgList &Args, ArgStringList &CmdArgs) const {
4156 unsigned RTOptionID = options::OPT__SLASH_MT;
4157
Hans Wennborgf1a74252013-09-10 20:18:04 +00004158 if (Args.hasArg(options::OPT__SLASH_LDd))
4159 // The /LDd option implies /MTd. The dependent lib part can be overridden,
4160 // but defining _DEBUG is sticky.
4161 RTOptionID = options::OPT__SLASH_MTd;
4162
Hans Wennborg9cb7d9ba2013-09-18 22:26:39 +00004163 if (Arg *A = Args.getLastArg(options::OPT__SLASH_M_Group))
Hans Wennborg75958c42013-08-08 00:17:41 +00004164 RTOptionID = A->getOption().getID();
Hans Wennborgd9ad0682013-09-11 16:38:41 +00004165
Hans Wennborg75958c42013-08-08 00:17:41 +00004166 switch(RTOptionID) {
4167 case options::OPT__SLASH_MD:
Hans Wennborgf1a74252013-09-10 20:18:04 +00004168 if (Args.hasArg(options::OPT__SLASH_LDd))
4169 CmdArgs.push_back("-D_DEBUG");
Hans Wennborg75958c42013-08-08 00:17:41 +00004170 CmdArgs.push_back("-D_MT");
4171 CmdArgs.push_back("-D_DLL");
4172 CmdArgs.push_back("--dependent-lib=msvcrt");
4173 break;
4174 case options::OPT__SLASH_MDd:
4175 CmdArgs.push_back("-D_DEBUG");
4176 CmdArgs.push_back("-D_MT");
4177 CmdArgs.push_back("-D_DLL");
4178 CmdArgs.push_back("--dependent-lib=msvcrtd");
4179 break;
4180 case options::OPT__SLASH_MT:
Hans Wennborgf1a74252013-09-10 20:18:04 +00004181 if (Args.hasArg(options::OPT__SLASH_LDd))
4182 CmdArgs.push_back("-D_DEBUG");
Hans Wennborg75958c42013-08-08 00:17:41 +00004183 CmdArgs.push_back("-D_MT");
4184 CmdArgs.push_back("--dependent-lib=libcmt");
4185 break;
4186 case options::OPT__SLASH_MTd:
4187 CmdArgs.push_back("-D_DEBUG");
4188 CmdArgs.push_back("-D_MT");
4189 CmdArgs.push_back("--dependent-lib=libcmtd");
4190 break;
4191 default:
4192 llvm_unreachable("Unexpected option ID.");
4193 }
4194
Reid Kleckner6beca0e2013-08-08 19:33:10 +00004195 // This provides POSIX compatibility (maps 'open' to '_open'), which most
4196 // users want. The /Za flag to cl.exe turns this off, but it's not
4197 // implemented in clang.
4198 CmdArgs.push_back("--dependent-lib=oldnames");
Hans Wennborg614f7072013-08-08 19:54:30 +00004199
Hans Wennborg0fd62072013-08-09 00:32:23 +00004200 if (Arg *A = Args.getLastArg(options::OPT_show_includes))
4201 A->render(Args, CmdArgs);
Hans Wennborg81f74482013-09-10 01:07:07 +00004202
Hans Wennborg7b0dcef2014-02-25 18:36:22 +00004203 // RTTI is currently not supported, so disable it by default.
4204 if (!Args.hasArg(options::OPT_frtti, options::OPT_fno_rtti))
4205 CmdArgs.push_back("-fno-rtti");
4206
Hans Wennborgd8d49ba2014-03-25 17:50:25 +00004207 // Let -ffunction-sections imply -fdata-sections.
4208 if (Arg * A = Args.getLastArg(options::OPT_ffunction_sections,
4209 options::OPT_fno_function_sections))
4210 if (A->getOption().matches(options::OPT_ffunction_sections))
4211 CmdArgs.push_back("-fdata-sections");
4212
David Majnemer86c318f2014-02-11 21:05:00 +00004213 const Driver &D = getToolChain().getDriver();
4214 Arg *MostGeneralArg = Args.getLastArg(options::OPT__SLASH_vmg);
4215 Arg *BestCaseArg = Args.getLastArg(options::OPT__SLASH_vmb);
4216 if (MostGeneralArg && BestCaseArg)
4217 D.Diag(clang::diag::err_drv_argument_not_allowed_with)
4218 << MostGeneralArg->getAsString(Args) << BestCaseArg->getAsString(Args);
4219
4220 if (MostGeneralArg) {
4221 Arg *SingleArg = Args.getLastArg(options::OPT__SLASH_vms);
4222 Arg *MultipleArg = Args.getLastArg(options::OPT__SLASH_vmm);
4223 Arg *VirtualArg = Args.getLastArg(options::OPT__SLASH_vmv);
4224
4225 Arg *FirstConflict = SingleArg ? SingleArg : MultipleArg;
4226 Arg *SecondConflict = VirtualArg ? VirtualArg : MultipleArg;
4227 if (FirstConflict && SecondConflict && FirstConflict != SecondConflict)
4228 D.Diag(clang::diag::err_drv_argument_not_allowed_with)
4229 << FirstConflict->getAsString(Args)
4230 << SecondConflict->getAsString(Args);
4231
4232 if (SingleArg)
4233 CmdArgs.push_back("-fms-memptr-rep=single");
4234 else if (MultipleArg)
4235 CmdArgs.push_back("-fms-memptr-rep=multiple");
4236 else
4237 CmdArgs.push_back("-fms-memptr-rep=virtual");
4238 }
4239
Reid Klecknerc0dca6d2014-02-12 23:50:26 +00004240 if (Arg *A = Args.getLastArg(options::OPT_vtordisp_mode_EQ))
4241 A->render(Args, CmdArgs);
4242
Hans Wennborg81f74482013-09-10 01:07:07 +00004243 if (!Args.hasArg(options::OPT_fdiagnostics_format_EQ)) {
4244 CmdArgs.push_back("-fdiagnostics-format");
Hans Wennborgf4aee182013-09-24 00:08:55 +00004245 if (Args.hasArg(options::OPT__SLASH_fallback))
4246 CmdArgs.push_back("msvc-fallback");
4247 else
4248 CmdArgs.push_back("msvc");
Hans Wennborg81f74482013-09-10 01:07:07 +00004249 }
Hans Wennborg75958c42013-08-08 00:17:41 +00004250}
4251
Daniel Dunbar4f5e79c2010-05-20 21:30:13 +00004252void ClangAs::ConstructJob(Compilation &C, const JobAction &JA,
Daniel Dunbar4f5e79c2010-05-20 21:30:13 +00004253 const InputInfo &Output,
4254 const InputInfoList &Inputs,
4255 const ArgList &Args,
4256 const char *LinkingOutput) const {
Daniel Dunbar4f5e79c2010-05-20 21:30:13 +00004257 ArgStringList CmdArgs;
4258
4259 assert(Inputs.size() == 1 && "Unexpected number of inputs.");
4260 const InputInfo &Input = Inputs[0];
4261
Rafael Espindolacfaadda2010-11-17 22:13:25 +00004262 // Don't warn about "clang -w -c foo.s"
4263 Args.ClaimAllArgs(options::OPT_w);
Rafael Espindolad95a8122011-03-01 05:25:27 +00004264 // and "clang -emit-llvm -c foo.s"
4265 Args.ClaimAllArgs(options::OPT_emit_llvm);
Rafael Espindolacfaadda2010-11-17 22:13:25 +00004266
Daniel Dunbar4f5e79c2010-05-20 21:30:13 +00004267 // Invoke ourselves in -cc1as mode.
4268 //
4269 // FIXME: Implement custom jobs for internal actions.
4270 CmdArgs.push_back("-cc1as");
4271
4272 // Add the "effective" target triple.
4273 CmdArgs.push_back("-triple");
Chad Rosierd3a0f952011-09-20 20:44:06 +00004274 std::string TripleStr =
4275 getToolChain().ComputeEffectiveClangTriple(Args, Input.getType());
Daniel Dunbar4f5e79c2010-05-20 21:30:13 +00004276 CmdArgs.push_back(Args.MakeArgString(TripleStr));
4277
4278 // Set the output mode, we currently only expect to be used as a real
4279 // assembler.
4280 CmdArgs.push_back("-filetype");
4281 CmdArgs.push_back("obj");
4282
Eric Christopher45f2e712012-12-18 00:31:10 +00004283 // Set the main file name, so that debug info works even with
4284 // -save-temps or preprocessed assembly.
4285 CmdArgs.push_back("-main-file-name");
4286 CmdArgs.push_back(Clang::getBaseInputName(Args, Inputs));
4287
Rafael Espindola22ce34a2013-08-20 22:12:08 +00004288 // Add the target cpu
Rafael Espindola28e1f4b2013-08-21 16:39:20 +00004289 const llvm::Triple &Triple = getToolChain().getTriple();
4290 std::string CPU = getCPUName(Args, Triple);
Rafael Espindola22ce34a2013-08-20 22:12:08 +00004291 if (!CPU.empty()) {
4292 CmdArgs.push_back("-target-cpu");
4293 CmdArgs.push_back(Args.MakeArgString(CPU));
4294 }
4295
Rafael Espindola28e1f4b2013-08-21 16:39:20 +00004296 // Add the target features
4297 const Driver &D = getToolChain().getDriver();
Rafael Espindola9c6fb0f2013-11-23 14:36:40 +00004298 getTargetFeatures(D, Triple, Args, CmdArgs, true);
Jim Grosbach576452b2012-02-10 20:37:10 +00004299
Daniel Dunbar1d733e22011-03-17 17:37:29 +00004300 // Ignore explicit -force_cpusubtype_ALL option.
4301 (void) Args.hasArg(options::OPT_force__cpusubtype__ALL);
Daniel Dunbar4f5e79c2010-05-20 21:30:13 +00004302
Eric Christopherfc3ee562012-01-10 00:38:01 +00004303 // Determine the original source input.
4304 const Action *SourceAction = &JA;
4305 while (SourceAction->getKind() != Action::InputClass) {
4306 assert(!SourceAction->getInputs().empty() && "unexpected root action!");
4307 SourceAction = SourceAction->getInputs()[0];
4308 }
4309
Chandler Carruth4d5e1a92012-12-17 21:40:04 +00004310 // Forward -g and handle debug info related flags, assuming we are dealing
4311 // with an actual assembly file.
Eric Christopherfc3ee562012-01-10 00:38:01 +00004312 if (SourceAction->getType() == types::TY_Asm ||
4313 SourceAction->getType() == types::TY_PP_Asm) {
4314 Args.ClaimAllArgs(options::OPT_g_Group);
4315 if (Arg *A = Args.getLastArg(options::OPT_g_Group))
4316 if (!A->getOption().matches(options::OPT_g0))
4317 CmdArgs.push_back("-g");
Chandler Carruth4d5e1a92012-12-17 21:40:04 +00004318
4319 // Add the -fdebug-compilation-dir flag if needed.
4320 addDebugCompDirArg(Args, CmdArgs);
Kevin Enderbyae2ec472013-01-17 21:38:06 +00004321
4322 // Set the AT_producer to the clang version when using the integrated
4323 // assembler on assembly source files.
4324 CmdArgs.push_back("-dwarf-debug-producer");
4325 CmdArgs.push_back(Args.MakeArgString(getClangFullVersion()));
Eric Christopherfc3ee562012-01-10 00:38:01 +00004326 }
Kevin Enderby292dc082011-12-22 19:31:58 +00004327
4328 // Optionally embed the -cc1as level arguments into the debug info, for build
4329 // analysis.
4330 if (getToolChain().UseDwarfDebugFlags()) {
4331 ArgStringList OriginalArgs;
4332 for (ArgList::const_iterator it = Args.begin(),
4333 ie = Args.end(); it != ie; ++it)
4334 (*it)->render(Args, OriginalArgs);
4335
Dylan Noblesmith2c1dd272012-02-05 02:13:05 +00004336 SmallString<256> Flags;
Kevin Enderby292dc082011-12-22 19:31:58 +00004337 const char *Exec = getToolChain().getDriver().getClangProgramPath();
4338 Flags += Exec;
4339 for (unsigned i = 0, e = OriginalArgs.size(); i != e; ++i) {
4340 Flags += " ";
4341 Flags += OriginalArgs[i];
4342 }
4343 CmdArgs.push_back("-dwarf-debug-flags");
4344 CmdArgs.push_back(Args.MakeArgString(Flags.str()));
4345 }
Daniel Dunbar4f5e79c2010-05-20 21:30:13 +00004346
4347 // FIXME: Add -static support, once we have it.
4348
David Blaikie372d9502014-01-17 03:17:40 +00004349 // Consume all the warning flags. Usually this would be handled more
4350 // gracefully by -cc1 (warning about unknown warning flags, etc) but -cc1as
4351 // doesn't handle that so rather than warning about unused flags that are
4352 // actually used, we'll lie by omission instead.
4353 // FIXME: Stop lying and consume only the appropriate driver flags
4354 for (arg_iterator it = Args.filtered_begin(options::OPT_W_Group),
4355 ie = Args.filtered_end();
4356 it != ie; ++it)
4357 (*it)->claim();
4358
David Blaikie9260ed62013-07-25 21:19:01 +00004359 CollectArgsForIntegratedAssembler(C, Args, CmdArgs,
4360 getToolChain().getDriver());
4361
Daniel Dunbar252e8f92011-04-29 17:53:18 +00004362 Args.AddAllArgs(CmdArgs, options::OPT_mllvm);
Daniel Dunbar4f5e79c2010-05-20 21:30:13 +00004363
4364 assert(Output.isFilename() && "Unexpected lipo output.");
4365 CmdArgs.push_back("-o");
4366 CmdArgs.push_back(Output.getFilename());
4367
Daniel Dunbarb440f562010-08-02 02:38:21 +00004368 assert(Input.isFilename() && "Invalid input.");
4369 CmdArgs.push_back(Input.getFilename());
Daniel Dunbar4f5e79c2010-05-20 21:30:13 +00004370
Daniel Dunbarb31b76f2010-07-18 21:16:15 +00004371 const char *Exec = getToolChain().getDriver().getClangProgramPath();
Daniel Dunbar7fbaf532010-08-02 02:38:28 +00004372 C.addCommand(new Command(JA, *this, Exec, CmdArgs));
Eric Christophera75018a2013-04-10 21:30:40 +00004373
4374 // Handle the debug info splitting at object creation time if we're
4375 // creating an object.
4376 // TODO: Currently only works on linux with newer objcopy.
4377 if (Args.hasArg(options::OPT_gsplit_dwarf) &&
Cameron Esfahani556d91e2013-09-14 01:09:11 +00004378 getToolChain().getTriple().isOSLinux())
Eric Christophera75018a2013-04-10 21:30:40 +00004379 SplitDebugInfo(getToolChain(), C, *this, JA, Args, Output,
4380 SplitDebugName(Args, Inputs));
Daniel Dunbar4f5e79c2010-05-20 21:30:13 +00004381}
4382
Daniel Dunbara3246a02009-03-18 08:07:30 +00004383void gcc::Common::ConstructJob(Compilation &C, const JobAction &JA,
Daniel Dunbara3246a02009-03-18 08:07:30 +00004384 const InputInfo &Output,
4385 const InputInfoList &Inputs,
Daniel Dunbara2aedc62009-03-18 10:01:51 +00004386 const ArgList &Args,
Daniel Dunbara3246a02009-03-18 08:07:30 +00004387 const char *LinkingOutput) const {
Daniel Dunbar083edf72009-12-21 18:54:17 +00004388 const Driver &D = getToolChain().getDriver();
Daniel Dunbara3246a02009-03-18 08:07:30 +00004389 ArgStringList CmdArgs;
Daniel Dunbar1a093d22009-03-18 06:00:36 +00004390
Daniel Dunbard067f7f2009-04-08 23:54:23 +00004391 for (ArgList::const_iterator
Daniel Dunbara2aedc62009-03-18 10:01:51 +00004392 it = Args.begin(), ie = Args.end(); it != ie; ++it) {
Daniel Dunbara3246a02009-03-18 08:07:30 +00004393 Arg *A = *it;
Michael J. Spencer66e2b202012-10-19 22:37:06 +00004394 if (forwardToGCC(A->getOption())) {
Daniel Dunbar939c1212010-08-03 16:14:14 +00004395 // Don't forward any -g arguments to assembly steps.
4396 if (isa<AssembleJobAction>(JA) &&
4397 A->getOption().matches(options::OPT_g_Group))
4398 continue;
4399
NAKAMURA Takumi053704f2013-08-19 11:51:51 +00004400 // Don't forward any -W arguments to assembly and link steps.
4401 if ((isa<AssembleJobAction>(JA) || isa<LinkJobAction>(JA)) &&
4402 A->getOption().matches(options::OPT_W_Group))
4403 continue;
4404
Daniel Dunbar2da02722009-03-19 07:55:12 +00004405 // It is unfortunate that we have to claim here, as this means
4406 // we will basically never report anything interesting for
Daniel Dunbar5716d872009-05-02 21:41:52 +00004407 // platforms using a generic gcc, even if we are just using gcc
4408 // to get to the assembler.
Daniel Dunbar2da02722009-03-19 07:55:12 +00004409 A->claim();
Daniel Dunbara2aedc62009-03-18 10:01:51 +00004410 A->render(Args, CmdArgs);
Daniel Dunbar2da02722009-03-19 07:55:12 +00004411 }
Daniel Dunbara3246a02009-03-18 08:07:30 +00004412 }
Daniel Dunbard067f7f2009-04-08 23:54:23 +00004413
Daniel Dunbar4e295052010-01-25 22:35:08 +00004414 RenderExtraToolArgs(JA, CmdArgs);
Daniel Dunbara3246a02009-03-18 08:07:30 +00004415
4416 // If using a driver driver, force the arch.
Rafael Espindola35ca7d92012-10-07 04:44:33 +00004417 llvm::Triple::ArchType Arch = getToolChain().getArch();
Jonathan Roelofs2cea1be2014-02-12 03:21:20 +00004418 if (getToolChain().getTriple().isOSDarwin()) {
Daniel Dunbara3246a02009-03-18 08:07:30 +00004419 CmdArgs.push_back("-arch");
Daniel Dunbar0a05d932009-04-01 20:33:11 +00004420
4421 // FIXME: Remove these special cases.
Rafael Espindola35ca7d92012-10-07 04:44:33 +00004422 if (Arch == llvm::Triple::ppc)
Daniel Dunbar5bbebfe2009-05-22 02:21:04 +00004423 CmdArgs.push_back("ppc");
Rafael Espindola35ca7d92012-10-07 04:44:33 +00004424 else if (Arch == llvm::Triple::ppc64)
Daniel Dunbar5bbebfe2009-05-22 02:21:04 +00004425 CmdArgs.push_back("ppc64");
Bill Schmidt778d3872013-07-26 01:36:11 +00004426 else if (Arch == llvm::Triple::ppc64le)
4427 CmdArgs.push_back("ppc64le");
Daniel Dunbar5bbebfe2009-05-22 02:21:04 +00004428 else
Rafael Espindola35ca7d92012-10-07 04:44:33 +00004429 CmdArgs.push_back(Args.MakeArgString(getToolChain().getArchName()));
Daniel Dunbara3246a02009-03-18 08:07:30 +00004430 }
4431
Daniel Dunbar5716d872009-05-02 21:41:52 +00004432 // Try to force gcc to match the tool chain we want, if we recognize
4433 // the arch.
Daniel Dunbar5bbebfe2009-05-22 02:21:04 +00004434 //
4435 // FIXME: The triple class should directly provide the information we want
4436 // here.
Rafael Espindola35ca7d92012-10-07 04:44:33 +00004437 if (Arch == llvm::Triple::x86 || Arch == llvm::Triple::ppc)
Daniel Dunbar5716d872009-05-02 21:41:52 +00004438 CmdArgs.push_back("-m32");
Bill Schmidt778d3872013-07-26 01:36:11 +00004439 else if (Arch == llvm::Triple::x86_64 || Arch == llvm::Triple::ppc64 ||
4440 Arch == llvm::Triple::ppc64le)
Daniel Dunbar5716d872009-05-02 21:41:52 +00004441 CmdArgs.push_back("-m64");
4442
Daniel Dunbarb440f562010-08-02 02:38:21 +00004443 if (Output.isFilename()) {
Daniel Dunbara3246a02009-03-18 08:07:30 +00004444 CmdArgs.push_back("-o");
Daniel Dunbar5cdf3e02009-03-19 07:29:38 +00004445 CmdArgs.push_back(Output.getFilename());
4446 } else {
4447 assert(Output.isNothing() && "Unexpected output");
Daniel Dunbara3246a02009-03-18 08:07:30 +00004448 CmdArgs.push_back("-fsyntax-only");
Daniel Dunbar5cdf3e02009-03-19 07:29:38 +00004449 }
Daniel Dunbara3246a02009-03-18 08:07:30 +00004450
Tony Linthicum76329bf2011-12-12 21:14:55 +00004451 Args.AddAllArgValues(CmdArgs, options::OPT_Wa_COMMA,
4452 options::OPT_Xassembler);
Daniel Dunbara3246a02009-03-18 08:07:30 +00004453
4454 // Only pass -x if gcc will understand it; otherwise hope gcc
4455 // understands the suffix correctly. The main use case this would go
4456 // wrong in is for linker inputs if they happened to have an odd
4457 // suffix; really the only way to get this to happen is a command
4458 // like '-x foobar a.c' which will treat a.c like a linker input.
4459 //
4460 // FIXME: For the linker case specifically, can we safely convert
4461 // inputs into '-Wl,' options?
4462 for (InputInfoList::const_iterator
4463 it = Inputs.begin(), ie = Inputs.end(); it != ie; ++it) {
4464 const InputInfo &II = *it;
Daniel Dunbare3e263f2009-05-02 20:14:53 +00004465
Daniel Dunbar6cdf83c2009-09-01 16:57:46 +00004466 // Don't try to pass LLVM or AST inputs to a generic gcc.
Daniel Dunbar24e52992010-06-07 23:28:45 +00004467 if (II.getType() == types::TY_LLVM_IR || II.getType() == types::TY_LTO_IR ||
4468 II.getType() == types::TY_LLVM_BC || II.getType() == types::TY_LTO_BC)
Chris Lattner0e62c1c2011-07-23 10:55:15 +00004469 D.Diag(diag::err_drv_no_linker_llvm_support)
Daniel Dunbar1c28f1e2009-09-09 22:32:48 +00004470 << getToolChain().getTripleString();
Daniel Dunbar6cdf83c2009-09-01 16:57:46 +00004471 else if (II.getType() == types::TY_AST)
Chris Lattner0e62c1c2011-07-23 10:55:15 +00004472 D.Diag(diag::err_drv_no_ast_support)
Daniel Dunbar1c28f1e2009-09-09 22:32:48 +00004473 << getToolChain().getTripleString();
Douglas Gregorbf7fc9c2013-03-27 16:47:18 +00004474 else if (II.getType() == types::TY_ModuleFile)
4475 D.Diag(diag::err_drv_no_module_support)
4476 << getToolChain().getTripleString();
Daniel Dunbare3e263f2009-05-02 20:14:53 +00004477
Daniel Dunbara3246a02009-03-18 08:07:30 +00004478 if (types::canTypeBeUserSpecified(II.getType())) {
4479 CmdArgs.push_back("-x");
4480 CmdArgs.push_back(types::getTypeName(II.getType()));
4481 }
4482
Daniel Dunbarb440f562010-08-02 02:38:21 +00004483 if (II.isFilename())
Daniel Dunbar5cdf3e02009-03-19 07:29:38 +00004484 CmdArgs.push_back(II.getFilename());
Daniel Dunbarf2476752010-09-25 18:10:05 +00004485 else {
4486 const Arg &A = II.getInputArg();
4487
4488 // Reverse translate some rewritten options.
4489 if (A.getOption().matches(options::OPT_Z_reserved_lib_stdcxx)) {
4490 CmdArgs.push_back("-lstdc++");
4491 continue;
4492 }
4493
Daniel Dunbar5cdf3e02009-03-19 07:29:38 +00004494 // Don't render as input, we need gcc to do the translations.
Daniel Dunbarf2476752010-09-25 18:10:05 +00004495 A.render(Args, CmdArgs);
4496 }
Daniel Dunbara3246a02009-03-18 08:07:30 +00004497 }
4498
Dylan Noblesmith70e73a32011-04-09 13:31:59 +00004499 const std::string customGCCName = D.getCCCGenericGCCName();
4500 const char *GCCName;
4501 if (!customGCCName.empty())
4502 GCCName = customGCCName.c_str();
Hans Wennborg70850d82013-07-18 20:29:38 +00004503 else if (D.CCCIsCXX()) {
Dylan Noblesmith70e73a32011-04-09 13:31:59 +00004504 GCCName = "g++";
Dylan Noblesmith70e73a32011-04-09 13:31:59 +00004505 } else
4506 GCCName = "gcc";
4507
Daniel Dunbard067f7f2009-04-08 23:54:23 +00004508 const char *Exec =
Daniel Dunbar9c3ed5f2010-07-14 18:46:23 +00004509 Args.MakeArgString(getToolChain().GetProgramPath(GCCName));
Daniel Dunbar7fbaf532010-08-02 02:38:28 +00004510 C.addCommand(new Command(JA, *this, Exec, CmdArgs));
Daniel Dunbar1a093d22009-03-18 06:00:36 +00004511}
4512
Daniel Dunbar4e295052010-01-25 22:35:08 +00004513void gcc::Preprocess::RenderExtraToolArgs(const JobAction &JA,
4514 ArgStringList &CmdArgs) const {
Daniel Dunbara3246a02009-03-18 08:07:30 +00004515 CmdArgs.push_back("-E");
Daniel Dunbar1a093d22009-03-18 06:00:36 +00004516}
4517
Daniel Dunbar4e295052010-01-25 22:35:08 +00004518void gcc::Compile::RenderExtraToolArgs(const JobAction &JA,
4519 ArgStringList &CmdArgs) const {
Daniel Dunbaraeea8ac2010-02-11 03:16:21 +00004520 const Driver &D = getToolChain().getDriver();
4521
Daniel Dunbar4e295052010-01-25 22:35:08 +00004522 // If -flto, etc. are present then make sure not to force assembly output.
Daniel Dunbar24e52992010-06-07 23:28:45 +00004523 if (JA.getType() == types::TY_LLVM_IR || JA.getType() == types::TY_LTO_IR ||
4524 JA.getType() == types::TY_LLVM_BC || JA.getType() == types::TY_LTO_BC)
Daniel Dunbar4e295052010-01-25 22:35:08 +00004525 CmdArgs.push_back("-c");
Daniel Dunbaraeea8ac2010-02-11 03:16:21 +00004526 else {
4527 if (JA.getType() != types::TY_PP_Asm)
Chris Lattner0e62c1c2011-07-23 10:55:15 +00004528 D.Diag(diag::err_drv_invalid_gcc_output_type)
Daniel Dunbaraeea8ac2010-02-11 03:16:21 +00004529 << getTypeName(JA.getType());
Michael J. Spencer4c0ffa82010-10-21 03:16:25 +00004530
Daniel Dunbar4e295052010-01-25 22:35:08 +00004531 CmdArgs.push_back("-S");
Daniel Dunbaraeea8ac2010-02-11 03:16:21 +00004532 }
Daniel Dunbar1a093d22009-03-18 06:00:36 +00004533}
4534
Daniel Dunbar4e295052010-01-25 22:35:08 +00004535void gcc::Link::RenderExtraToolArgs(const JobAction &JA,
4536 ArgStringList &CmdArgs) const {
Daniel Dunbara3246a02009-03-18 08:07:30 +00004537 // The types are (hopefully) good enough.
4538}
4539
Tony Linthicum76329bf2011-12-12 21:14:55 +00004540// Hexagon tools start.
4541void hexagon::Assemble::RenderExtraToolArgs(const JobAction &JA,
4542 ArgStringList &CmdArgs) const {
4543
4544}
4545void hexagon::Assemble::ConstructJob(Compilation &C, const JobAction &JA,
4546 const InputInfo &Output,
4547 const InputInfoList &Inputs,
4548 const ArgList &Args,
4549 const char *LinkingOutput) const {
4550
4551 const Driver &D = getToolChain().getDriver();
4552 ArgStringList CmdArgs;
4553
4554 std::string MarchString = "-march=";
Matthew Curtisf10a5952012-12-06 14:16:43 +00004555 MarchString += toolchains::Hexagon_TC::GetTargetCPU(Args);
Tony Linthicum76329bf2011-12-12 21:14:55 +00004556 CmdArgs.push_back(Args.MakeArgString(MarchString));
4557
4558 RenderExtraToolArgs(JA, CmdArgs);
4559
4560 if (Output.isFilename()) {
4561 CmdArgs.push_back("-o");
4562 CmdArgs.push_back(Output.getFilename());
4563 } else {
4564 assert(Output.isNothing() && "Unexpected output");
4565 CmdArgs.push_back("-fsyntax-only");
4566 }
4567
Matthew Curtise8f80a12012-12-06 17:49:03 +00004568 std::string SmallDataThreshold = GetHexagonSmallDataThresholdValue(Args);
4569 if (!SmallDataThreshold.empty())
4570 CmdArgs.push_back(
4571 Args.MakeArgString(std::string("-G") + SmallDataThreshold));
Tony Linthicum76329bf2011-12-12 21:14:55 +00004572
Matthew Curtise5df3812012-12-07 17:23:04 +00004573 Args.AddAllArgValues(CmdArgs, options::OPT_Wa_COMMA,
4574 options::OPT_Xassembler);
4575
Tony Linthicum76329bf2011-12-12 21:14:55 +00004576 // Only pass -x if gcc will understand it; otherwise hope gcc
4577 // understands the suffix correctly. The main use case this would go
4578 // wrong in is for linker inputs if they happened to have an odd
4579 // suffix; really the only way to get this to happen is a command
4580 // like '-x foobar a.c' which will treat a.c like a linker input.
4581 //
4582 // FIXME: For the linker case specifically, can we safely convert
4583 // inputs into '-Wl,' options?
4584 for (InputInfoList::const_iterator
4585 it = Inputs.begin(), ie = Inputs.end(); it != ie; ++it) {
4586 const InputInfo &II = *it;
4587
4588 // Don't try to pass LLVM or AST inputs to a generic gcc.
4589 if (II.getType() == types::TY_LLVM_IR || II.getType() == types::TY_LTO_IR ||
4590 II.getType() == types::TY_LLVM_BC || II.getType() == types::TY_LTO_BC)
4591 D.Diag(clang::diag::err_drv_no_linker_llvm_support)
4592 << getToolChain().getTripleString();
4593 else if (II.getType() == types::TY_AST)
4594 D.Diag(clang::diag::err_drv_no_ast_support)
4595 << getToolChain().getTripleString();
Douglas Gregorbf7fc9c2013-03-27 16:47:18 +00004596 else if (II.getType() == types::TY_ModuleFile)
4597 D.Diag(diag::err_drv_no_module_support)
4598 << getToolChain().getTripleString();
Tony Linthicum76329bf2011-12-12 21:14:55 +00004599
4600 if (II.isFilename())
4601 CmdArgs.push_back(II.getFilename());
4602 else
4603 // Don't render as input, we need gcc to do the translations. FIXME: Pranav: What is this ?
4604 II.getInputArg().render(Args, CmdArgs);
4605 }
4606
4607 const char *GCCName = "hexagon-as";
4608 const char *Exec =
4609 Args.MakeArgString(getToolChain().GetProgramPath(GCCName));
4610 C.addCommand(new Command(JA, *this, Exec, CmdArgs));
4611
4612}
4613void hexagon::Link::RenderExtraToolArgs(const JobAction &JA,
4614 ArgStringList &CmdArgs) const {
4615 // The types are (hopefully) good enough.
4616}
4617
4618void hexagon::Link::ConstructJob(Compilation &C, const JobAction &JA,
4619 const InputInfo &Output,
4620 const InputInfoList &Inputs,
4621 const ArgList &Args,
4622 const char *LinkingOutput) const {
4623
Matthew Curtise689b052012-12-06 15:46:07 +00004624 const toolchains::Hexagon_TC& ToolChain =
4625 static_cast<const toolchains::Hexagon_TC&>(getToolChain());
4626 const Driver &D = ToolChain.getDriver();
4627
Tony Linthicum76329bf2011-12-12 21:14:55 +00004628 ArgStringList CmdArgs;
4629
Matthew Curtise689b052012-12-06 15:46:07 +00004630 //----------------------------------------------------------------------------
4631 //
4632 //----------------------------------------------------------------------------
4633 bool hasStaticArg = Args.hasArg(options::OPT_static);
4634 bool buildingLib = Args.hasArg(options::OPT_shared);
Matthew Curtise8f80a12012-12-06 17:49:03 +00004635 bool buildPIE = Args.hasArg(options::OPT_pie);
Matthew Curtise689b052012-12-06 15:46:07 +00004636 bool incStdLib = !Args.hasArg(options::OPT_nostdlib);
4637 bool incStartFiles = !Args.hasArg(options::OPT_nostartfiles);
4638 bool incDefLibs = !Args.hasArg(options::OPT_nodefaultlibs);
4639 bool useShared = buildingLib && !hasStaticArg;
Tony Linthicum76329bf2011-12-12 21:14:55 +00004640
Matthew Curtise689b052012-12-06 15:46:07 +00004641 //----------------------------------------------------------------------------
4642 // Silence warnings for various options
4643 //----------------------------------------------------------------------------
Tony Linthicum76329bf2011-12-12 21:14:55 +00004644
Matthew Curtise689b052012-12-06 15:46:07 +00004645 Args.ClaimAllArgs(options::OPT_g_Group);
4646 Args.ClaimAllArgs(options::OPT_emit_llvm);
4647 Args.ClaimAllArgs(options::OPT_w); // Other warning options are already
4648 // handled somewhere else.
4649 Args.ClaimAllArgs(options::OPT_static_libgcc);
4650
4651 //----------------------------------------------------------------------------
4652 //
4653 //----------------------------------------------------------------------------
4654 for (std::vector<std::string>::const_iterator i = ToolChain.ExtraOpts.begin(),
4655 e = ToolChain.ExtraOpts.end();
4656 i != e; ++i)
4657 CmdArgs.push_back(i->c_str());
Tony Linthicum76329bf2011-12-12 21:14:55 +00004658
Matthew Curtisf10a5952012-12-06 14:16:43 +00004659 std::string MarchString = toolchains::Hexagon_TC::GetTargetCPU(Args);
4660 CmdArgs.push_back(Args.MakeArgString("-m" + MarchString));
Sebastian Pop86500282012-01-13 20:37:10 +00004661
Matthew Curtise689b052012-12-06 15:46:07 +00004662 if (buildingLib) {
4663 CmdArgs.push_back("-shared");
4664 CmdArgs.push_back("-call_shared"); // should be the default, but doing as
4665 // hexagon-gcc does
Tony Linthicum76329bf2011-12-12 21:14:55 +00004666 }
4667
Matthew Curtise689b052012-12-06 15:46:07 +00004668 if (hasStaticArg)
4669 CmdArgs.push_back("-static");
Tony Linthicum76329bf2011-12-12 21:14:55 +00004670
Matthew Curtise8f80a12012-12-06 17:49:03 +00004671 if (buildPIE && !buildingLib)
4672 CmdArgs.push_back("-pie");
4673
4674 std::string SmallDataThreshold = GetHexagonSmallDataThresholdValue(Args);
4675 if (!SmallDataThreshold.empty()) {
4676 CmdArgs.push_back(
4677 Args.MakeArgString(std::string("-G") + SmallDataThreshold));
4678 }
4679
Matthew Curtise689b052012-12-06 15:46:07 +00004680 //----------------------------------------------------------------------------
4681 //
4682 //----------------------------------------------------------------------------
4683 CmdArgs.push_back("-o");
4684 CmdArgs.push_back(Output.getFilename());
Tony Linthicum76329bf2011-12-12 21:14:55 +00004685
Matthew Curtise689b052012-12-06 15:46:07 +00004686 const std::string MarchSuffix = "/" + MarchString;
4687 const std::string G0Suffix = "/G0";
4688 const std::string MarchG0Suffix = MarchSuffix + G0Suffix;
4689 const std::string RootDir = toolchains::Hexagon_TC::GetGnuDir(D.InstalledDir)
4690 + "/";
4691 const std::string StartFilesDir = RootDir
4692 + "hexagon/lib"
4693 + (buildingLib
4694 ? MarchG0Suffix : MarchSuffix);
4695
4696 //----------------------------------------------------------------------------
4697 // moslib
4698 //----------------------------------------------------------------------------
4699 std::vector<std::string> oslibs;
4700 bool hasStandalone= false;
4701
4702 for (arg_iterator it = Args.filtered_begin(options::OPT_moslib_EQ),
4703 ie = Args.filtered_end(); it != ie; ++it) {
4704 (*it)->claim();
4705 oslibs.push_back((*it)->getValue());
4706 hasStandalone = hasStandalone || (oslibs.back() == "standalone");
Tony Linthicum76329bf2011-12-12 21:14:55 +00004707 }
Matthew Curtise689b052012-12-06 15:46:07 +00004708 if (oslibs.empty()) {
4709 oslibs.push_back("standalone");
4710 hasStandalone = true;
4711 }
Tony Linthicum76329bf2011-12-12 21:14:55 +00004712
Matthew Curtise689b052012-12-06 15:46:07 +00004713 //----------------------------------------------------------------------------
4714 // Start Files
4715 //----------------------------------------------------------------------------
4716 if (incStdLib && incStartFiles) {
4717
4718 if (!buildingLib) {
4719 if (hasStandalone) {
4720 CmdArgs.push_back(
4721 Args.MakeArgString(StartFilesDir + "/crt0_standalone.o"));
4722 }
4723 CmdArgs.push_back(Args.MakeArgString(StartFilesDir + "/crt0.o"));
4724 }
4725 std::string initObj = useShared ? "/initS.o" : "/init.o";
4726 CmdArgs.push_back(Args.MakeArgString(StartFilesDir + initObj));
4727 }
4728
4729 //----------------------------------------------------------------------------
4730 // Library Search Paths
4731 //----------------------------------------------------------------------------
4732 const ToolChain::path_list &LibPaths = ToolChain.getFilePaths();
4733 for (ToolChain::path_list::const_iterator
4734 i = LibPaths.begin(),
4735 e = LibPaths.end();
4736 i != e;
4737 ++i)
4738 CmdArgs.push_back(Args.MakeArgString(StringRef("-L") + *i));
4739
4740 //----------------------------------------------------------------------------
4741 //
4742 //----------------------------------------------------------------------------
4743 Args.AddAllArgs(CmdArgs, options::OPT_T_Group);
4744 Args.AddAllArgs(CmdArgs, options::OPT_e);
4745 Args.AddAllArgs(CmdArgs, options::OPT_s);
4746 Args.AddAllArgs(CmdArgs, options::OPT_t);
4747 Args.AddAllArgs(CmdArgs, options::OPT_u_Group);
4748
4749 AddLinkerInputs(ToolChain, Inputs, Args, CmdArgs);
4750
4751 //----------------------------------------------------------------------------
4752 // Libraries
4753 //----------------------------------------------------------------------------
4754 if (incStdLib && incDefLibs) {
Hans Wennborg70850d82013-07-18 20:29:38 +00004755 if (D.CCCIsCXX()) {
Matthew Curtise689b052012-12-06 15:46:07 +00004756 ToolChain.AddCXXStdlibLibArgs(Args, CmdArgs);
4757 CmdArgs.push_back("-lm");
4758 }
4759
4760 CmdArgs.push_back("--start-group");
4761
4762 if (!buildingLib) {
4763 for(std::vector<std::string>::iterator i = oslibs.begin(),
4764 e = oslibs.end(); i != e; ++i)
4765 CmdArgs.push_back(Args.MakeArgString("-l" + *i));
4766 CmdArgs.push_back("-lc");
4767 }
4768 CmdArgs.push_back("-lgcc");
4769
4770 CmdArgs.push_back("--end-group");
4771 }
4772
4773 //----------------------------------------------------------------------------
4774 // End files
4775 //----------------------------------------------------------------------------
4776 if (incStdLib && incStartFiles) {
4777 std::string finiObj = useShared ? "/finiS.o" : "/fini.o";
4778 CmdArgs.push_back(Args.MakeArgString(StartFilesDir + finiObj));
4779 }
4780
4781 std::string Linker = ToolChain.GetProgramPath("hexagon-ld");
Benjamin Kramerb2ccade2013-10-21 12:33:55 +00004782 C.addCommand(new Command(JA, *this, Args.MakeArgString(Linker), CmdArgs));
Tony Linthicum76329bf2011-12-12 21:14:55 +00004783}
4784// Hexagon tools end.
4785
Bernard Ogden31561762013-12-12 13:27:11 +00004786/// getARMCPUForMArch - Get the (LLVM) name of the minimum ARM CPU for the arch we are targeting
4787//
4788// FIXME: tblgen this.
4789const char *arm::getARMCPUForMArch(const ArgList &Args,
4790 const llvm::Triple &Triple) {
4791 StringRef MArch;
4792 if (Arg *A = Args.getLastArg(options::OPT_march_EQ)) {
4793 // Otherwise, if we have -march= choose the base CPU for that arch.
4794 MArch = A->getValue();
4795 } else {
4796 // Otherwise, use the Arch from the triple.
4797 MArch = Triple.getArchName();
4798 }
4799
4800 // Handle -march=native.
Bernard Ogden31561762013-12-12 13:27:11 +00004801 if (MArch == "native") {
4802 std::string CPU = llvm::sys::getHostCPUName();
4803 if (CPU != "generic") {
4804 // Translate the native cpu into the architecture. The switch below will
4805 // then chose the minimum cpu for that arch.
Bernard Ogdenf6ba17d2013-12-12 13:27:15 +00004806 MArch = std::string("arm") + arm::getLLVMArchSuffixForARM(CPU);
Bernard Ogden31561762013-12-12 13:27:11 +00004807 }
4808 }
4809
4810 if (Triple.getOS() == llvm::Triple::NetBSD) {
4811 if (MArch == "armv6")
4812 return "arm1176jzf-s";
4813 }
4814
4815 const char *result = llvm::StringSwitch<const char *>(MArch)
4816 .Cases("armv2", "armv2a","arm2")
4817 .Case("armv3", "arm6")
4818 .Case("armv3m", "arm7m")
4819 .Case("armv4", "strongarm")
4820 .Case("armv4t", "arm7tdmi")
4821 .Case("thumbv4t", "arm7tdmi")
4822 .Cases("armv5", "armv5t", "arm10tdmi")
4823 .Cases("thumbv5", "thumbv5t", "arm10tdmi")
4824 .Cases("armv5e", "armv5te", "arm1022e")
4825 .Cases("thumbv5e", "thumbv5te", "arm1022e")
4826 .Case("armv5tej", "arm926ej-s")
4827 .Case("thumbv5tej", "arm926ej-s")
4828 .Cases("armv6", "armv6k", "arm1136jf-s")
4829 .Cases("thumbv6", "thumbv6k", "arm1136jf-s")
4830 .Case("armv6j", "arm1136j-s")
4831 .Case("thumbv6j", "arm1136j-s")
4832 .Cases("armv6z", "armv6zk", "arm1176jzf-s")
4833 .Cases("thumbv6z", "thumbv6zk", "arm1176jzf-s")
4834 .Case("armv6t2", "arm1156t2-s")
4835 .Case("thumbv6t2", "arm1156t2-s")
4836 .Cases("armv6m", "armv6-m", "cortex-m0")
4837 .Case("thumbv6m", "cortex-m0")
4838 .Cases("armv7", "armv7a", "armv7-a", "cortex-a8")
Christian Pirkerf01cd6f2014-03-28 14:40:46 +00004839 .Cases("armebv7", "armebv7a", "armebv7-a", "cortex-a8")
Bernard Ogden31561762013-12-12 13:27:11 +00004840 .Cases("thumbv7", "thumbv7a", "cortex-a8")
Christian Pirkerf01cd6f2014-03-28 14:40:46 +00004841 .Cases("thumbebv7", "thumbebv7a", "cortex-a8")
Bernard Ogden31561762013-12-12 13:27:11 +00004842 .Cases("armv7l", "armv7-l", "cortex-a8")
Christian Pirkerf01cd6f2014-03-28 14:40:46 +00004843 .Cases("armebv7l", "armebv7-l", "cortex-a8")
Bernard Ogden31561762013-12-12 13:27:11 +00004844 .Cases("armv7s", "armv7-s", "swift")
Christian Pirkerf01cd6f2014-03-28 14:40:46 +00004845 .Cases("armebv7s", "armebv7-s", "swift")
Bernard Ogden31561762013-12-12 13:27:11 +00004846 .Cases("armv7r", "armv7-r", "cortex-r4")
Christian Pirkerf01cd6f2014-03-28 14:40:46 +00004847 .Cases("armebv7r", "armebv7-r", "cortex-r4")
Bernard Ogden31561762013-12-12 13:27:11 +00004848 .Case("thumbv7r", "cortex-r4")
Christian Pirkerf01cd6f2014-03-28 14:40:46 +00004849 .Case("thumbebv7r", "cortex-r4")
Bernard Ogden31561762013-12-12 13:27:11 +00004850 .Cases("armv7m", "armv7-m", "cortex-m3")
Christian Pirkerf01cd6f2014-03-28 14:40:46 +00004851 .Cases("armebv7m", "armebv7-m", "cortex-m3")
Bernard Ogden31561762013-12-12 13:27:11 +00004852 .Case("thumbv7m", "cortex-m3")
Christian Pirkerf01cd6f2014-03-28 14:40:46 +00004853 .Case("thumbebv7m", "cortex-m3")
Bernard Ogden31561762013-12-12 13:27:11 +00004854 .Cases("armv7em", "armv7e-m", "cortex-m4")
Christian Pirkerf01cd6f2014-03-28 14:40:46 +00004855 .Cases("armebv7em", "armebv7e-m", "cortex-m4")
Bernard Ogden31561762013-12-12 13:27:11 +00004856 .Cases("thumbv7em", "thumbv7e-m", "cortex-m4")
Christian Pirkerf01cd6f2014-03-28 14:40:46 +00004857 .Cases("thumbebv7em", "thumbebv7e-m", "cortex-m4")
Bernard Ogden31561762013-12-12 13:27:11 +00004858 .Cases("armv8", "armv8a", "armv8-a", "cortex-a53")
Christian Pirkerf01cd6f2014-03-28 14:40:46 +00004859 .Cases("armebv8", "armebv8a", "armebv8-a", "cortex-a53")
Bernard Ogden31561762013-12-12 13:27:11 +00004860 .Cases("thumbv8", "thumbv8a", "cortex-a53")
Christian Pirkerf01cd6f2014-03-28 14:40:46 +00004861 .Cases("thumbebv8", "thumbebv8a", "cortex-a53")
Bernard Ogden31561762013-12-12 13:27:11 +00004862 .Case("ep9312", "ep9312")
4863 .Case("iwmmxt", "iwmmxt")
4864 .Case("xscale", "xscale")
4865 // If all else failed, return the most base CPU with thumb interworking
4866 // supported by LLVM.
4867 .Default(0);
4868
4869 if (result)
4870 return result;
4871
Joerg Sonnenberger695fdb32014-02-21 21:53:33 +00004872 switch (Triple.getOS()) {
4873 case llvm::Triple::NetBSD:
4874 switch (Triple.getEnvironment()) {
4875 case llvm::Triple::GNUEABIHF:
4876 case llvm::Triple::GNUEABI:
4877 case llvm::Triple::EABIHF:
4878 case llvm::Triple::EABI:
4879 return "arm926ej-s";
4880 default:
4881 return "strongarm";
4882 }
4883 default:
4884 switch (Triple.getEnvironment()) {
4885 case llvm::Triple::EABIHF:
4886 case llvm::Triple::GNUEABIHF:
4887 return "arm1176jzf-s";
4888 default:
4889 return "arm7tdmi";
4890 }
4891 }
Bernard Ogden31561762013-12-12 13:27:11 +00004892}
4893
4894/// getARMTargetCPU - Get the (LLVM) name of the ARM cpu we are targeting.
Rafael Espindola80d333b2013-12-12 15:48:19 +00004895StringRef arm::getARMTargetCPU(const ArgList &Args,
4896 const llvm::Triple &Triple) {
Bernard Ogden31561762013-12-12 13:27:11 +00004897 // FIXME: Warn on inconsistent use of -mcpu and -march.
4898 // If we have -mcpu=, use that.
4899 if (Arg *A = Args.getLastArg(options::OPT_mcpu_EQ)) {
4900 StringRef MCPU = A->getValue();
4901 // Handle -mcpu=native.
4902 if (MCPU == "native")
Rafael Espindola9c5ef122013-12-12 15:39:05 +00004903 return llvm::sys::getHostCPUName();
Bernard Ogden31561762013-12-12 13:27:11 +00004904 else
Rafael Espindola80d333b2013-12-12 15:48:19 +00004905 return MCPU;
Bernard Ogden31561762013-12-12 13:27:11 +00004906 }
4907
4908 return getARMCPUForMArch(Args, Triple);
4909}
4910
4911/// getLLVMArchSuffixForARM - Get the LLVM arch name to use for a particular
4912/// CPU.
4913//
4914// FIXME: This is redundant with -mcpu, why does LLVM use this.
4915// FIXME: tblgen this, or kill it!
4916const char *arm::getLLVMArchSuffixForARM(StringRef CPU) {
4917 return llvm::StringSwitch<const char *>(CPU)
4918 .Case("strongarm", "v4")
4919 .Cases("arm7tdmi", "arm7tdmi-s", "arm710t", "v4t")
4920 .Cases("arm720t", "arm9", "arm9tdmi", "v4t")
4921 .Cases("arm920", "arm920t", "arm922t", "v4t")
4922 .Cases("arm940t", "ep9312","v4t")
4923 .Cases("arm10tdmi", "arm1020t", "v5")
4924 .Cases("arm9e", "arm926ej-s", "arm946e-s", "v5e")
4925 .Cases("arm966e-s", "arm968e-s", "arm10e", "v5e")
4926 .Cases("arm1020e", "arm1022e", "xscale", "iwmmxt", "v5e")
4927 .Cases("arm1136j-s", "arm1136jf-s", "arm1176jz-s", "v6")
4928 .Cases("arm1176jzf-s", "mpcorenovfp", "mpcore", "v6")
4929 .Cases("arm1156t2-s", "arm1156t2f-s", "v6t2")
Bob Wilsonb767d152014-01-15 21:43:40 +00004930 .Cases("cortex-a5", "cortex-a7", "cortex-a8", "cortex-a9-mp", "v7")
Bernard Ogden31561762013-12-12 13:27:11 +00004931 .Cases("cortex-a9", "cortex-a12", "cortex-a15", "krait", "v7")
4932 .Cases("cortex-r4", "cortex-r5", "v7r")
4933 .Case("cortex-m0", "v6m")
4934 .Case("cortex-m3", "v7m")
4935 .Case("cortex-m4", "v7em")
Bernard Ogden31561762013-12-12 13:27:11 +00004936 .Case("swift", "v7s")
Tim Northovera2ee4332014-03-29 15:09:45 +00004937 .Case("cyclone", "v8")
Bernard Ogden31561762013-12-12 13:27:11 +00004938 .Cases("cortex-a53", "cortex-a57", "v8")
4939 .Default("");
4940}
4941
Jonathan Roelofs2cea1be2014-02-12 03:21:20 +00004942bool mips::hasMipsAbiArg(const ArgList &Args, const char *Value) {
4943 Arg *A = Args.getLastArg(options::OPT_mabi_EQ);
4944 return A && (A->getValue() == StringRef(Value));
4945}
4946
Tim Northover157d9112014-01-16 08:48:16 +00004947llvm::Triple::ArchType darwin::getArchTypeForMachOArchName(StringRef Str) {
Rafael Espindoladcbf6982012-10-31 18:51:07 +00004948 // See arch(3) and llvm-gcc's driver-driver.c. We don't implement support for
4949 // archs which Darwin doesn't use.
4950
4951 // The matching this routine does is fairly pointless, since it is neither the
4952 // complete architecture list, nor a reasonable subset. The problem is that
4953 // historically the driver driver accepts this and also ties its -march=
4954 // handling to the architecture name, so we need to be careful before removing
4955 // support for it.
4956
4957 // This code must be kept in sync with Clang's Darwin specific argument
4958 // translation.
4959
4960 return llvm::StringSwitch<llvm::Triple::ArchType>(Str)
4961 .Cases("ppc", "ppc601", "ppc603", "ppc604", "ppc604e", llvm::Triple::ppc)
4962 .Cases("ppc750", "ppc7400", "ppc7450", "ppc970", llvm::Triple::ppc)
4963 .Case("ppc64", llvm::Triple::ppc64)
4964 .Cases("i386", "i486", "i486SX", "i586", "i686", llvm::Triple::x86)
4965 .Cases("pentium", "pentpro", "pentIIm3", "pentIIm5", "pentium4",
4966 llvm::Triple::x86)
Jim Grosbach82eee262013-11-16 00:53:35 +00004967 .Cases("x86_64", "x86_64h", llvm::Triple::x86_64)
Rafael Espindoladcbf6982012-10-31 18:51:07 +00004968 // This is derived from the driver driver.
Bob Wilson743bf672013-03-04 22:37:49 +00004969 .Cases("arm", "armv4t", "armv5", "armv6", "armv6m", llvm::Triple::arm)
Bob Wilsonb767d152014-01-15 21:43:40 +00004970 .Cases("armv7", "armv7em", "armv7k", "armv7m", llvm::Triple::arm)
Bob Wilson743bf672013-03-04 22:37:49 +00004971 .Cases("armv7s", "xscale", llvm::Triple::arm)
Tim Northovera2ee4332014-03-29 15:09:45 +00004972 .Case("arm64", llvm::Triple::arm64)
Rafael Espindoladcbf6982012-10-31 18:51:07 +00004973 .Case("r600", llvm::Triple::r600)
4974 .Case("nvptx", llvm::Triple::nvptx)
4975 .Case("nvptx64", llvm::Triple::nvptx64)
4976 .Case("amdil", llvm::Triple::amdil)
4977 .Case("spir", llvm::Triple::spir)
4978 .Default(llvm::Triple::UnknownArch);
4979}
Tony Linthicum76329bf2011-12-12 21:14:55 +00004980
Tim Northover157d9112014-01-16 08:48:16 +00004981void darwin::setTripleTypeForMachOArchName(llvm::Triple &T, StringRef Str) {
4982 llvm::Triple::ArchType Arch = getArchTypeForMachOArchName(Str);
4983 T.setArch(Arch);
4984
4985 if (Str == "x86_64h")
4986 T.setArchName(Str);
4987 else if (Str == "armv6m" || Str == "armv7m" || Str == "armv7em") {
4988 T.setOS(llvm::Triple::UnknownOS);
Saleem Abdulrasool29b82b62014-03-06 20:47:19 +00004989 T.setObjectFormat(llvm::Triple::MachO);
Tim Northover157d9112014-01-16 08:48:16 +00004990 }
4991}
4992
Bob Wilsondecc03e2012-11-23 06:14:39 +00004993const char *Clang::getBaseInputName(const ArgList &Args,
4994 const InputInfoList &Inputs) {
Michael J. Spencere1696752010-12-18 00:19:12 +00004995 return Args.MakeArgString(
4996 llvm::sys::path::filename(Inputs[0].getBaseInput()));
Daniel Dunbarafec1f52009-03-29 18:40:18 +00004997}
4998
Bob Wilsondecc03e2012-11-23 06:14:39 +00004999const char *Clang::getBaseInputStem(const ArgList &Args,
5000 const InputInfoList &Inputs) {
Daniel Dunbarafec1f52009-03-29 18:40:18 +00005001 const char *Str = getBaseInputName(Args, Inputs);
5002
Chris Lattner906bb902011-01-16 08:14:11 +00005003 if (const char *End = strrchr(Str, '.'))
Daniel Dunbar1c28f1e2009-09-09 22:32:48 +00005004 return Args.MakeArgString(std::string(Str, End));
Daniel Dunbarafec1f52009-03-29 18:40:18 +00005005
5006 return Str;
5007}
5008
Bob Wilsondecc03e2012-11-23 06:14:39 +00005009const char *Clang::getDependencyFileName(const ArgList &Args,
5010 const InputInfoList &Inputs) {
Daniel Dunbarafec1f52009-03-29 18:40:18 +00005011 // FIXME: Think about this more.
5012 std::string Res;
5013
5014 if (Arg *OutputOpt = Args.getLastArg(options::OPT_o)) {
Richard Smithbd55daf2012-11-01 04:30:05 +00005015 std::string Str(OutputOpt->getValue());
Daniel Dunbarafec1f52009-03-29 18:40:18 +00005016 Res = Str.substr(0, Str.rfind('.'));
Chad Rosier6fdf38b2011-08-17 23:08:45 +00005017 } else {
Bob Wilsondecc03e2012-11-23 06:14:39 +00005018 Res = getBaseInputStem(Args, Inputs);
Chad Rosier6fdf38b2011-08-17 23:08:45 +00005019 }
Daniel Dunbar1c28f1e2009-09-09 22:32:48 +00005020 return Args.MakeArgString(Res + ".d");
Daniel Dunbarafec1f52009-03-29 18:40:18 +00005021}
5022
Daniel Dunbarbe220842009-03-20 16:06:39 +00005023void darwin::Assemble::ConstructJob(Compilation &C, const JobAction &JA,
Daniel Dunbar7fbaf532010-08-02 02:38:28 +00005024 const InputInfo &Output,
Daniel Dunbard067f7f2009-04-08 23:54:23 +00005025 const InputInfoList &Inputs,
5026 const ArgList &Args,
Daniel Dunbarbe220842009-03-20 16:06:39 +00005027 const char *LinkingOutput) const {
5028 ArgStringList CmdArgs;
5029
5030 assert(Inputs.size() == 1 && "Unexpected number of inputs.");
5031 const InputInfo &Input = Inputs[0];
5032
Daniel Dunbardc8355e2011-04-12 23:59:20 +00005033 // Determine the original source input.
5034 const Action *SourceAction = &JA;
5035 while (SourceAction->getKind() != Action::InputClass) {
5036 assert(!SourceAction->getInputs().empty() && "unexpected root action!");
5037 SourceAction = SourceAction->getInputs()[0];
5038 }
5039
Saleem Abdulrasoolcfeb90d2014-02-23 00:40:30 +00005040 // If -fno_integrated_as is used add -Q to the darwin assember driver to make
Kevin Enderby319baa42013-11-18 23:30:29 +00005041 // sure it runs its system assembler not clang's integrated assembler.
David Fang073a7c92013-12-10 22:51:25 +00005042 // Applicable to darwin11+ and Xcode 4+. darwin<10 lacked integrated-as.
5043 // FIXME: at run-time detect assembler capabilities or rely on version
5044 // information forwarded by -target-assembler-version (future)
Saleem Abdulrasoolcfeb90d2014-02-23 00:40:30 +00005045 if (Args.hasArg(options::OPT_fno_integrated_as)) {
David Fangadcdde02013-12-10 23:13:11 +00005046 const llvm::Triple &T(getToolChain().getTriple());
5047 if (!(T.isMacOSX() && T.isMacOSXVersionLT(10, 7)))
David Fang073a7c92013-12-10 22:51:25 +00005048 CmdArgs.push_back("-Q");
5049 }
Kevin Enderby319baa42013-11-18 23:30:29 +00005050
Daniel Dunbardc8355e2011-04-12 23:59:20 +00005051 // Forward -g, assuming we are dealing with an actual assembly file.
Eric Christopher84fbdb42011-08-19 00:30:14 +00005052 if (SourceAction->getType() == types::TY_Asm ||
Daniel Dunbardc8355e2011-04-12 23:59:20 +00005053 SourceAction->getType() == types::TY_PP_Asm) {
Daniel Dunbar5c9c1182009-04-01 00:27:44 +00005054 if (Args.hasArg(options::OPT_gstabs))
5055 CmdArgs.push_back("--gstabs");
5056 else if (Args.hasArg(options::OPT_g_Group))
Bob Wilson126c4912011-11-02 05:10:45 +00005057 CmdArgs.push_back("-g");
Daniel Dunbar5c9c1182009-04-01 00:27:44 +00005058 }
Daniel Dunbard067f7f2009-04-08 23:54:23 +00005059
Daniel Dunbarbe220842009-03-20 16:06:39 +00005060 // Derived from asm spec.
Tim Northover157d9112014-01-16 08:48:16 +00005061 AddMachOArch(Args, CmdArgs);
Daniel Dunbarbe220842009-03-20 16:06:39 +00005062
Daniel Dunbar6d484762010-07-22 01:47:22 +00005063 // Use -force_cpusubtype_ALL on x86 by default.
Eli Benderskyd4a6aec2013-07-24 22:20:49 +00005064 if (getToolChain().getArch() == llvm::Triple::x86 ||
5065 getToolChain().getArch() == llvm::Triple::x86_64 ||
Daniel Dunbar3571dd92009-09-09 18:36:27 +00005066 Args.hasArg(options::OPT_force__cpusubtype__ALL))
5067 CmdArgs.push_back("-force_cpusubtype_ALL");
5068
Eli Benderskyd4a6aec2013-07-24 22:20:49 +00005069 if (getToolChain().getArch() != llvm::Triple::x86_64 &&
Daniel Dunbarbd847cc2012-10-15 22:23:53 +00005070 (((Args.hasArg(options::OPT_mkernel) ||
Eric Christopher248357f2013-02-21 22:35:01 +00005071 Args.hasArg(options::OPT_fapple_kext)) &&
Tim Northover157d9112014-01-16 08:48:16 +00005072 getMachOToolChain().isKernelStatic()) ||
Daniel Dunbarbd847cc2012-10-15 22:23:53 +00005073 Args.hasArg(options::OPT_static)))
Daniel Dunbard067f7f2009-04-08 23:54:23 +00005074 CmdArgs.push_back("-static");
5075
Daniel Dunbarbe220842009-03-20 16:06:39 +00005076 Args.AddAllArgValues(CmdArgs, options::OPT_Wa_COMMA,
5077 options::OPT_Xassembler);
5078
5079 assert(Output.isFilename() && "Unexpected lipo output.");
5080 CmdArgs.push_back("-o");
5081 CmdArgs.push_back(Output.getFilename());
5082
Daniel Dunbarb440f562010-08-02 02:38:21 +00005083 assert(Input.isFilename() && "Invalid input.");
5084 CmdArgs.push_back(Input.getFilename());
Daniel Dunbarbe220842009-03-20 16:06:39 +00005085
5086 // asm_final spec is empty.
5087
Daniel Dunbard067f7f2009-04-08 23:54:23 +00005088 const char *Exec =
Daniel Dunbar9c3ed5f2010-07-14 18:46:23 +00005089 Args.MakeArgString(getToolChain().GetProgramPath("as"));
Daniel Dunbar7fbaf532010-08-02 02:38:28 +00005090 C.addCommand(new Command(JA, *this, Exec, CmdArgs));
Daniel Dunbarbe220842009-03-20 16:06:39 +00005091}
Daniel Dunbar64ed5e32009-03-20 00:52:38 +00005092
Tim Northover157d9112014-01-16 08:48:16 +00005093void darwin::MachOTool::anchor() {}
David Blaikie68e081d2011-12-20 02:48:34 +00005094
Tim Northover157d9112014-01-16 08:48:16 +00005095void darwin::MachOTool::AddMachOArch(const ArgList &Args,
5096 ArgStringList &CmdArgs) const {
5097 StringRef ArchName = getMachOToolChain().getMachOArchName(Args);
Daniel Dunbardcc3b652010-01-22 02:04:58 +00005098
Daniel Dunbarc1964212009-03-26 16:23:12 +00005099 // Derived from darwin_arch spec.
5100 CmdArgs.push_back("-arch");
Daniel Dunbardcc3b652010-01-22 02:04:58 +00005101 CmdArgs.push_back(Args.MakeArgString(ArchName));
Daniel Dunbar91dbfd62009-09-04 18:35:31 +00005102
Daniel Dunbardcc3b652010-01-22 02:04:58 +00005103 // FIXME: Is this needed anymore?
5104 if (ArchName == "arm")
Daniel Dunbar91dbfd62009-09-04 18:35:31 +00005105 CmdArgs.push_back("-force_cpusubtype_ALL");
Daniel Dunbarc1964212009-03-26 16:23:12 +00005106}
5107
Bill Wendling3b2000f2012-10-02 18:02:50 +00005108bool darwin::Link::NeedsTempPath(const InputInfoList &Inputs) const {
5109 // We only need to generate a temp path for LTO if we aren't compiling object
5110 // files. When compiling source files, we run 'dsymutil' after linking. We
5111 // don't run 'dsymutil' when compiling object files.
5112 for (InputInfoList::const_iterator
5113 it = Inputs.begin(), ie = Inputs.end(); it != ie; ++it)
5114 if (it->getType() != types::TY_Object)
5115 return true;
5116
5117 return false;
5118}
5119
Daniel Dunbarccbc4522010-09-09 21:51:05 +00005120void darwin::Link::AddLinkArgs(Compilation &C,
5121 const ArgList &Args,
Bill Wendling3b2000f2012-10-02 18:02:50 +00005122 ArgStringList &CmdArgs,
5123 const InputInfoList &Inputs) const {
Daniel Dunbar083edf72009-12-21 18:54:17 +00005124 const Driver &D = getToolChain().getDriver();
Tim Northover157d9112014-01-16 08:48:16 +00005125 const toolchains::MachO &MachOTC = getMachOToolChain();
Daniel Dunbarc1964212009-03-26 16:23:12 +00005126
Daniel Dunbarcacb0e22010-08-11 23:07:50 +00005127 unsigned Version[3] = { 0, 0, 0 };
5128 if (Arg *A = Args.getLastArg(options::OPT_mlinker_version_EQ)) {
5129 bool HadExtra;
Richard Smithbd55daf2012-11-01 04:30:05 +00005130 if (!Driver::GetReleaseVersion(A->getValue(), Version[0],
Daniel Dunbarcacb0e22010-08-11 23:07:50 +00005131 Version[1], Version[2], HadExtra) ||
5132 HadExtra)
Chris Lattner0e62c1c2011-07-23 10:55:15 +00005133 D.Diag(diag::err_drv_invalid_version_number)
Daniel Dunbarcacb0e22010-08-11 23:07:50 +00005134 << A->getAsString(Args);
5135 }
5136
Bob Wilson5a4f3ea2014-01-14 01:56:31 +00005137 // Newer linkers support -demangle. Pass it if supported and not disabled by
Daniel Dunbarcacb0e22010-08-11 23:07:50 +00005138 // the user.
Bob Wilson5a4f3ea2014-01-14 01:56:31 +00005139 if (Version[0] >= 100 && !Args.hasArg(options::OPT_Z_Xlinker__no_demangle))
5140 CmdArgs.push_back("-demangle");
Daniel Dunbarcacb0e22010-08-11 23:07:50 +00005141
Bob Wilson3d27dad2013-08-02 22:25:34 +00005142 if (Args.hasArg(options::OPT_rdynamic) && Version[0] >= 137)
5143 CmdArgs.push_back("-export_dynamic");
5144
Bill Wendling313b6bf2012-11-16 23:03:00 +00005145 // If we are using LTO, then automatically create a temporary file path for
5146 // the linker to use, so that it's lifetime will extend past a possible
5147 // dsymutil step.
5148 if (Version[0] >= 116 && D.IsUsingLTO(Args) && NeedsTempPath(Inputs)) {
5149 const char *TmpPath = C.getArgs().MakeArgString(
5150 D.GetTemporaryPath("cc", types::getTypeTempSuffix(types::TY_Object)));
5151 C.addTempFile(TmpPath);
5152 CmdArgs.push_back("-object_path_lto");
5153 CmdArgs.push_back(TmpPath);
Daniel Dunbaref889c72011-06-21 20:55:11 +00005154 }
5155
Daniel Dunbarc1964212009-03-26 16:23:12 +00005156 // Derived from the "link" spec.
5157 Args.AddAllArgs(CmdArgs, options::OPT_static);
5158 if (!Args.hasArg(options::OPT_static))
5159 CmdArgs.push_back("-dynamic");
5160 if (Args.hasArg(options::OPT_fgnu_runtime)) {
5161 // FIXME: gcc replaces -lobjc in forward args with -lobjc-gnu
5162 // here. How do we wish to handle such things?
5163 }
Daniel Dunbard067f7f2009-04-08 23:54:23 +00005164
Daniel Dunbarc1964212009-03-26 16:23:12 +00005165 if (!Args.hasArg(options::OPT_dynamiclib)) {
Tim Northover157d9112014-01-16 08:48:16 +00005166 AddMachOArch(Args, CmdArgs);
Daniel Dunbara48823f2010-01-22 02:04:52 +00005167 // FIXME: Why do this only on this path?
Daniel Dunbar93d7acf2010-01-22 03:37:33 +00005168 Args.AddLastArg(CmdArgs, options::OPT_force__cpusubtype__ALL);
Daniel Dunbarc1964212009-03-26 16:23:12 +00005169
5170 Args.AddLastArg(CmdArgs, options::OPT_bundle);
5171 Args.AddAllArgs(CmdArgs, options::OPT_bundle__loader);
5172 Args.AddAllArgs(CmdArgs, options::OPT_client__name);
5173
5174 Arg *A;
5175 if ((A = Args.getLastArg(options::OPT_compatibility__version)) ||
5176 (A = Args.getLastArg(options::OPT_current__version)) ||
5177 (A = Args.getLastArg(options::OPT_install__name)))
Chris Lattner0e62c1c2011-07-23 10:55:15 +00005178 D.Diag(diag::err_drv_argument_only_allowed_with)
Daniel Dunbarc1964212009-03-26 16:23:12 +00005179 << A->getAsString(Args) << "-dynamiclib";
5180
5181 Args.AddLastArg(CmdArgs, options::OPT_force__flat__namespace);
5182 Args.AddLastArg(CmdArgs, options::OPT_keep__private__externs);
5183 Args.AddLastArg(CmdArgs, options::OPT_private__bundle);
5184 } else {
5185 CmdArgs.push_back("-dylib");
5186
5187 Arg *A;
5188 if ((A = Args.getLastArg(options::OPT_bundle)) ||
5189 (A = Args.getLastArg(options::OPT_bundle__loader)) ||
5190 (A = Args.getLastArg(options::OPT_client__name)) ||
5191 (A = Args.getLastArg(options::OPT_force__flat__namespace)) ||
5192 (A = Args.getLastArg(options::OPT_keep__private__externs)) ||
5193 (A = Args.getLastArg(options::OPT_private__bundle)))
Chris Lattner0e62c1c2011-07-23 10:55:15 +00005194 D.Diag(diag::err_drv_argument_not_allowed_with)
Daniel Dunbarc1964212009-03-26 16:23:12 +00005195 << A->getAsString(Args) << "-dynamiclib";
Daniel Dunbard067f7f2009-04-08 23:54:23 +00005196
Daniel Dunbarc1964212009-03-26 16:23:12 +00005197 Args.AddAllArgsTranslated(CmdArgs, options::OPT_compatibility__version,
5198 "-dylib_compatibility_version");
5199 Args.AddAllArgsTranslated(CmdArgs, options::OPT_current__version,
5200 "-dylib_current_version");
5201
Tim Northover157d9112014-01-16 08:48:16 +00005202 AddMachOArch(Args, CmdArgs);
Daniel Dunbarc1964212009-03-26 16:23:12 +00005203
5204 Args.AddAllArgsTranslated(CmdArgs, options::OPT_install__name,
5205 "-dylib_install_name");
5206 }
5207
5208 Args.AddLastArg(CmdArgs, options::OPT_all__load);
5209 Args.AddAllArgs(CmdArgs, options::OPT_allowable__client);
5210 Args.AddLastArg(CmdArgs, options::OPT_bind__at__load);
Tim Northover157d9112014-01-16 08:48:16 +00005211 if (MachOTC.isTargetIOSBased())
Daniel Dunbar2b5f6812009-09-04 18:35:41 +00005212 Args.AddLastArg(CmdArgs, options::OPT_arch__errors__fatal);
Daniel Dunbarc1964212009-03-26 16:23:12 +00005213 Args.AddLastArg(CmdArgs, options::OPT_dead__strip);
5214 Args.AddLastArg(CmdArgs, options::OPT_no__dead__strip__inits__and__terms);
5215 Args.AddAllArgs(CmdArgs, options::OPT_dylib__file);
5216 Args.AddLastArg(CmdArgs, options::OPT_dynamic);
5217 Args.AddAllArgs(CmdArgs, options::OPT_exported__symbols__list);
5218 Args.AddLastArg(CmdArgs, options::OPT_flat__namespace);
Daniel Dunbar044a3902011-06-28 20:16:02 +00005219 Args.AddAllArgs(CmdArgs, options::OPT_force__load);
Daniel Dunbarc1964212009-03-26 16:23:12 +00005220 Args.AddAllArgs(CmdArgs, options::OPT_headerpad__max__install__names);
5221 Args.AddAllArgs(CmdArgs, options::OPT_image__base);
5222 Args.AddAllArgs(CmdArgs, options::OPT_init);
5223
Daniel Dunbarc44d3132011-04-28 21:23:41 +00005224 // Add the deployment target.
Tim Northover157d9112014-01-16 08:48:16 +00005225 MachOTC.addMinVersionArgs(Args, CmdArgs);
Daniel Dunbarc44d3132011-04-28 21:23:41 +00005226
Daniel Dunbarc1964212009-03-26 16:23:12 +00005227 Args.AddLastArg(CmdArgs, options::OPT_nomultidefs);
5228 Args.AddLastArg(CmdArgs, options::OPT_multi__module);
5229 Args.AddLastArg(CmdArgs, options::OPT_single__module);
5230 Args.AddAllArgs(CmdArgs, options::OPT_multiply__defined);
5231 Args.AddAllArgs(CmdArgs, options::OPT_multiply__defined__unused);
Daniel Dunbard067f7f2009-04-08 23:54:23 +00005232
Daniel Dunbaraf68a882010-07-13 23:31:40 +00005233 if (const Arg *A = Args.getLastArg(options::OPT_fpie, options::OPT_fPIE,
5234 options::OPT_fno_pie,
5235 options::OPT_fno_PIE)) {
5236 if (A->getOption().matches(options::OPT_fpie) ||
5237 A->getOption().matches(options::OPT_fPIE))
5238 CmdArgs.push_back("-pie");
5239 else
5240 CmdArgs.push_back("-no_pie");
5241 }
Daniel Dunbarc1964212009-03-26 16:23:12 +00005242
5243 Args.AddLastArg(CmdArgs, options::OPT_prebind);
5244 Args.AddLastArg(CmdArgs, options::OPT_noprebind);
5245 Args.AddLastArg(CmdArgs, options::OPT_nofixprebinding);
5246 Args.AddLastArg(CmdArgs, options::OPT_prebind__all__twolevel__modules);
5247 Args.AddLastArg(CmdArgs, options::OPT_read__only__relocs);
5248 Args.AddAllArgs(CmdArgs, options::OPT_sectcreate);
5249 Args.AddAllArgs(CmdArgs, options::OPT_sectorder);
5250 Args.AddAllArgs(CmdArgs, options::OPT_seg1addr);
5251 Args.AddAllArgs(CmdArgs, options::OPT_segprot);
5252 Args.AddAllArgs(CmdArgs, options::OPT_segaddr);
5253 Args.AddAllArgs(CmdArgs, options::OPT_segs__read__only__addr);
5254 Args.AddAllArgs(CmdArgs, options::OPT_segs__read__write__addr);
5255 Args.AddAllArgs(CmdArgs, options::OPT_seg__addr__table);
5256 Args.AddAllArgs(CmdArgs, options::OPT_seg__addr__table__filename);
5257 Args.AddAllArgs(CmdArgs, options::OPT_sub__library);
5258 Args.AddAllArgs(CmdArgs, options::OPT_sub__umbrella);
Daniel Dunbar2b5f6812009-09-04 18:35:41 +00005259
Daniel Dunbar84384642011-05-02 21:03:47 +00005260 // Give --sysroot= preference, over the Apple specific behavior to also use
5261 // --isysroot as the syslibroot.
Sebastian Pop980920a2012-04-16 04:16:43 +00005262 StringRef sysroot = C.getSysRoot();
5263 if (sysroot != "") {
Daniel Dunbar84384642011-05-02 21:03:47 +00005264 CmdArgs.push_back("-syslibroot");
Sebastian Pop980920a2012-04-16 04:16:43 +00005265 CmdArgs.push_back(C.getArgs().MakeArgString(sysroot));
Daniel Dunbar84384642011-05-02 21:03:47 +00005266 } else if (const Arg *A = Args.getLastArg(options::OPT_isysroot)) {
5267 CmdArgs.push_back("-syslibroot");
Richard Smithbd55daf2012-11-01 04:30:05 +00005268 CmdArgs.push_back(A->getValue());
Daniel Dunbar2b5f6812009-09-04 18:35:41 +00005269 }
5270
Daniel Dunbarc1964212009-03-26 16:23:12 +00005271 Args.AddLastArg(CmdArgs, options::OPT_twolevel__namespace);
5272 Args.AddLastArg(CmdArgs, options::OPT_twolevel__namespace__hints);
5273 Args.AddAllArgs(CmdArgs, options::OPT_umbrella);
5274 Args.AddAllArgs(CmdArgs, options::OPT_undefined);
5275 Args.AddAllArgs(CmdArgs, options::OPT_unexported__symbols__list);
Daniel Dunbar2b5f6812009-09-04 18:35:41 +00005276 Args.AddAllArgs(CmdArgs, options::OPT_weak__reference__mismatches);
Daniel Dunbarc1964212009-03-26 16:23:12 +00005277 Args.AddLastArg(CmdArgs, options::OPT_X_Flag);
5278 Args.AddAllArgs(CmdArgs, options::OPT_y);
5279 Args.AddLastArg(CmdArgs, options::OPT_w);
5280 Args.AddAllArgs(CmdArgs, options::OPT_pagezero__size);
5281 Args.AddAllArgs(CmdArgs, options::OPT_segs__read__);
5282 Args.AddLastArg(CmdArgs, options::OPT_seglinkedit);
5283 Args.AddLastArg(CmdArgs, options::OPT_noseglinkedit);
5284 Args.AddAllArgs(CmdArgs, options::OPT_sectalign);
5285 Args.AddAllArgs(CmdArgs, options::OPT_sectobjectsymbols);
5286 Args.AddAllArgs(CmdArgs, options::OPT_segcreate);
5287 Args.AddLastArg(CmdArgs, options::OPT_whyload);
5288 Args.AddLastArg(CmdArgs, options::OPT_whatsloaded);
5289 Args.AddAllArgs(CmdArgs, options::OPT_dylinker__install__name);
5290 Args.AddLastArg(CmdArgs, options::OPT_dylinker);
5291 Args.AddLastArg(CmdArgs, options::OPT_Mach);
5292}
5293
Alexey Bataev186b28a2014-03-06 05:43:53 +00005294enum LibOpenMP {
5295 LibUnknown,
5296 LibGOMP,
5297 LibIOMP5
5298};
5299
Daniel Dunbarc1964212009-03-26 16:23:12 +00005300void darwin::Link::ConstructJob(Compilation &C, const JobAction &JA,
Daniel Dunbar7fbaf532010-08-02 02:38:28 +00005301 const InputInfo &Output,
Daniel Dunbard067f7f2009-04-08 23:54:23 +00005302 const InputInfoList &Inputs,
5303 const ArgList &Args,
Daniel Dunbarc1964212009-03-26 16:23:12 +00005304 const char *LinkingOutput) const {
5305 assert(Output.getType() == types::TY_Image && "Invalid linker output type.");
Daniel Dunbarc09988d2009-09-08 16:39:16 +00005306
Daniel Dunbarc1964212009-03-26 16:23:12 +00005307 // The logic here is derived from gcc's behavior; most of which
5308 // comes from specs (starting with link_command). Consult gcc for
5309 // more information.
Daniel Dunbarc1964212009-03-26 16:23:12 +00005310 ArgStringList CmdArgs;
5311
Argyrios Kyrtzidis741fab12011-10-07 22:58:08 +00005312 /// Hack(tm) to ignore linking errors when we are doing ARC migration.
5313 if (Args.hasArg(options::OPT_ccc_arcmt_check,
5314 options::OPT_ccc_arcmt_migrate)) {
5315 for (ArgList::const_iterator I = Args.begin(), E = Args.end(); I != E; ++I)
5316 (*I)->claim();
5317 const char *Exec =
5318 Args.MakeArgString(getToolChain().GetProgramPath("touch"));
5319 CmdArgs.push_back(Output.getFilename());
5320 C.addCommand(new Command(JA, *this, Exec, CmdArgs));
5321 return;
5322 }
5323
Daniel Dunbarc1964212009-03-26 16:23:12 +00005324 // I'm not sure why this particular decomposition exists in gcc, but
5325 // we follow suite for ease of comparison.
Bill Wendling3b2000f2012-10-02 18:02:50 +00005326 AddLinkArgs(C, Args, CmdArgs, Inputs);
Daniel Dunbarc1964212009-03-26 16:23:12 +00005327
Daniel Dunbarc1964212009-03-26 16:23:12 +00005328 Args.AddAllArgs(CmdArgs, options::OPT_d_Flag);
5329 Args.AddAllArgs(CmdArgs, options::OPT_s);
5330 Args.AddAllArgs(CmdArgs, options::OPT_t);
5331 Args.AddAllArgs(CmdArgs, options::OPT_Z_Flag);
5332 Args.AddAllArgs(CmdArgs, options::OPT_u_Group);
Daniel Dunbarc1964212009-03-26 16:23:12 +00005333 Args.AddLastArg(CmdArgs, options::OPT_e);
Daniel Dunbarc1964212009-03-26 16:23:12 +00005334 Args.AddAllArgs(CmdArgs, options::OPT_r);
5335
Daniel Dunbar767bbab2010-10-18 22:08:36 +00005336 // Forward -ObjC when either -ObjC or -ObjC++ is used, to force loading
5337 // members of static archive libraries which implement Objective-C classes or
5338 // categories.
5339 if (Args.hasArg(options::OPT_ObjC) || Args.hasArg(options::OPT_ObjCXX))
5340 CmdArgs.push_back("-ObjC");
Michael J. Spencer4c0ffa82010-10-21 03:16:25 +00005341
Daniel Dunbarc1964212009-03-26 16:23:12 +00005342 CmdArgs.push_back("-o");
5343 CmdArgs.push_back(Output.getFilename());
5344
Chad Rosier06fd3c62012-05-16 23:45:12 +00005345 if (!Args.hasArg(options::OPT_nostdlib) &&
Tim Northover157d9112014-01-16 08:48:16 +00005346 !Args.hasArg(options::OPT_nostartfiles))
5347 getMachOToolChain().addStartObjectFileArgs(Args, CmdArgs);
Daniel Dunbarc1964212009-03-26 16:23:12 +00005348
5349 Args.AddAllArgs(CmdArgs, options::OPT_L);
Daniel Dunbard067f7f2009-04-08 23:54:23 +00005350
Alexey Bataev186b28a2014-03-06 05:43:53 +00005351 LibOpenMP UsedOpenMPLib = LibUnknown;
5352 if (Args.hasArg(options::OPT_fopenmp)) {
5353 UsedOpenMPLib = LibGOMP;
5354 } else if (const Arg *A = Args.getLastArg(options::OPT_fopenmp_EQ)) {
5355 UsedOpenMPLib = llvm::StringSwitch<LibOpenMP>(A->getValue())
5356 .Case("libgomp", LibGOMP)
5357 .Case("libiomp5", LibIOMP5)
5358 .Default(LibUnknown);
5359 if (UsedOpenMPLib == LibUnknown)
5360 getToolChain().getDriver().Diag(diag::err_drv_unsupported_option_argument)
5361 << A->getOption().getName() << A->getValue();
5362 }
5363 switch (UsedOpenMPLib) {
5364 case LibGOMP:
Daniel Dunbarc1964212009-03-26 16:23:12 +00005365 CmdArgs.push_back("-lgomp");
Alexey Bataev186b28a2014-03-06 05:43:53 +00005366 break;
5367 case LibIOMP5:
5368 CmdArgs.push_back("-liomp5");
5369 break;
5370 case LibUnknown:
5371 break;
5372 }
Daniel Dunbarc1964212009-03-26 16:23:12 +00005373
Douglas Gregor9295df02012-05-15 21:00:27 +00005374 AddLinkerInputs(getToolChain(), Inputs, Args, CmdArgs);
5375
Bob Wilson16d93952012-05-15 18:57:39 +00005376 if (isObjCRuntimeLinked(Args) &&
5377 !Args.hasArg(options::OPT_nostdlib) &&
5378 !Args.hasArg(options::OPT_nodefaultlibs)) {
Tim Northover157d9112014-01-16 08:48:16 +00005379 // We use arclite library for both ARC and subscripting support.
5380 getMachOToolChain().AddLinkARCArgs(Args, CmdArgs);
5381
Bob Wilson7dda0cd2012-04-21 00:21:42 +00005382 CmdArgs.push_back("-framework");
5383 CmdArgs.push_back("Foundation");
Ted Kremeneke65b0862012-03-06 20:05:56 +00005384 // Link libobj.
5385 CmdArgs.push_back("-lobjc");
John McCall24fc0de2011-07-06 00:26:06 +00005386 }
John McCall31168b02011-06-15 23:02:42 +00005387
Daniel Dunbarc1964212009-03-26 16:23:12 +00005388 if (LinkingOutput) {
5389 CmdArgs.push_back("-arch_multiple");
5390 CmdArgs.push_back("-final_output");
5391 CmdArgs.push_back(LinkingOutput);
5392 }
5393
Daniel Dunbarc1964212009-03-26 16:23:12 +00005394 if (Args.hasArg(options::OPT_fnested_functions))
5395 CmdArgs.push_back("-allow_stack_execute");
Daniel Dunbard067f7f2009-04-08 23:54:23 +00005396
Daniel Dunbarc1964212009-03-26 16:23:12 +00005397 if (!Args.hasArg(options::OPT_nostdlib) &&
5398 !Args.hasArg(options::OPT_nodefaultlibs)) {
Hans Wennborg70850d82013-07-18 20:29:38 +00005399 if (getToolChain().getDriver().CCCIsCXX())
Daniel Dunbar3f7796f2010-09-17 01:20:05 +00005400 getToolChain().AddCXXStdlibLibArgs(Args, CmdArgs);
Daniel Dunbarad0f62b2009-04-08 06:06:21 +00005401
Daniel Dunbarc1964212009-03-26 16:23:12 +00005402 // link_ssp spec is empty.
5403
Daniel Dunbar26d482a2009-09-18 08:15:03 +00005404 // Let the tool chain choose which runtime library to link.
Tim Northover157d9112014-01-16 08:48:16 +00005405 getMachOToolChain().AddLinkRuntimeLibArgs(Args, CmdArgs);
Daniel Dunbarc1964212009-03-26 16:23:12 +00005406 }
5407
Chad Rosier06fd3c62012-05-16 23:45:12 +00005408 if (!Args.hasArg(options::OPT_nostdlib) &&
Daniel Dunbarc1964212009-03-26 16:23:12 +00005409 !Args.hasArg(options::OPT_nostartfiles)) {
5410 // endfile_spec is empty.
5411 }
5412
5413 Args.AddAllArgs(CmdArgs, options::OPT_T_Group);
5414 Args.AddAllArgs(CmdArgs, options::OPT_F);
5415
Daniel Dunbard067f7f2009-04-08 23:54:23 +00005416 const char *Exec =
Daniel Dunbar9c3ed5f2010-07-14 18:46:23 +00005417 Args.MakeArgString(getToolChain().GetProgramPath("ld"));
Daniel Dunbar7fbaf532010-08-02 02:38:28 +00005418 C.addCommand(new Command(JA, *this, Exec, CmdArgs));
Daniel Dunbarc1964212009-03-26 16:23:12 +00005419}
5420
Daniel Dunbar64ed5e32009-03-20 00:52:38 +00005421void darwin::Lipo::ConstructJob(Compilation &C, const JobAction &JA,
Daniel Dunbar7fbaf532010-08-02 02:38:28 +00005422 const InputInfo &Output,
Daniel Dunbard067f7f2009-04-08 23:54:23 +00005423 const InputInfoList &Inputs,
5424 const ArgList &Args,
Daniel Dunbar64ed5e32009-03-20 00:52:38 +00005425 const char *LinkingOutput) const {
5426 ArgStringList CmdArgs;
5427
5428 CmdArgs.push_back("-create");
5429 assert(Output.isFilename() && "Unexpected lipo output.");
Daniel Dunbar06686ab2009-03-24 00:24:37 +00005430
5431 CmdArgs.push_back("-output");
Daniel Dunbar64ed5e32009-03-20 00:52:38 +00005432 CmdArgs.push_back(Output.getFilename());
Daniel Dunbar06686ab2009-03-24 00:24:37 +00005433
Daniel Dunbar64ed5e32009-03-20 00:52:38 +00005434 for (InputInfoList::const_iterator
5435 it = Inputs.begin(), ie = Inputs.end(); it != ie; ++it) {
5436 const InputInfo &II = *it;
5437 assert(II.isFilename() && "Unexpected lipo input.");
5438 CmdArgs.push_back(II.getFilename());
5439 }
Daniel Dunbard067f7f2009-04-08 23:54:23 +00005440 const char *Exec =
Daniel Dunbar9c3ed5f2010-07-14 18:46:23 +00005441 Args.MakeArgString(getToolChain().GetProgramPath("lipo"));
Daniel Dunbar7fbaf532010-08-02 02:38:28 +00005442 C.addCommand(new Command(JA, *this, Exec, CmdArgs));
Daniel Dunbar64ed5e32009-03-20 00:52:38 +00005443}
Daniel Dunbar8eb473c2009-03-31 17:45:15 +00005444
Daniel Dunbar88299622010-06-04 18:28:36 +00005445void darwin::Dsymutil::ConstructJob(Compilation &C, const JobAction &JA,
Daniel Dunbar7fbaf532010-08-02 02:38:28 +00005446 const InputInfo &Output,
Daniel Dunbar88299622010-06-04 18:28:36 +00005447 const InputInfoList &Inputs,
5448 const ArgList &Args,
5449 const char *LinkingOutput) const {
5450 ArgStringList CmdArgs;
5451
Daniel Dunbareb86b042011-05-09 17:23:16 +00005452 CmdArgs.push_back("-o");
5453 CmdArgs.push_back(Output.getFilename());
5454
Daniel Dunbar88299622010-06-04 18:28:36 +00005455 assert(Inputs.size() == 1 && "Unable to handle multiple inputs.");
5456 const InputInfo &Input = Inputs[0];
5457 assert(Input.isFilename() && "Unexpected dsymutil input.");
5458 CmdArgs.push_back(Input.getFilename());
5459
Daniel Dunbar88299622010-06-04 18:28:36 +00005460 const char *Exec =
Daniel Dunbar9c3ed5f2010-07-14 18:46:23 +00005461 Args.MakeArgString(getToolChain().GetProgramPath("dsymutil"));
Daniel Dunbar7fbaf532010-08-02 02:38:28 +00005462 C.addCommand(new Command(JA, *this, Exec, CmdArgs));
Daniel Dunbar88299622010-06-04 18:28:36 +00005463}
5464
Eric Christopher551ef452011-08-23 17:56:55 +00005465void darwin::VerifyDebug::ConstructJob(Compilation &C, const JobAction &JA,
Eric Christopher45f2e712012-12-18 00:31:10 +00005466 const InputInfo &Output,
5467 const InputInfoList &Inputs,
5468 const ArgList &Args,
5469 const char *LinkingOutput) const {
Eric Christopher551ef452011-08-23 17:56:55 +00005470 ArgStringList CmdArgs;
5471 CmdArgs.push_back("--verify");
Eric Christopher36222212012-02-06 19:13:09 +00005472 CmdArgs.push_back("--debug-info");
5473 CmdArgs.push_back("--eh-frame");
Eric Christopher65c05fa2012-02-06 19:43:51 +00005474 CmdArgs.push_back("--quiet");
Eric Christopher551ef452011-08-23 17:56:55 +00005475
5476 assert(Inputs.size() == 1 && "Unable to handle multiple inputs.");
5477 const InputInfo &Input = Inputs[0];
5478 assert(Input.isFilename() && "Unexpected verify input");
5479
5480 // Grabbing the output of the earlier dsymutil run.
5481 CmdArgs.push_back(Input.getFilename());
5482
5483 const char *Exec =
5484 Args.MakeArgString(getToolChain().GetProgramPath("dwarfdump"));
5485 C.addCommand(new Command(JA, *this, Exec, CmdArgs));
5486}
5487
David Chisnallf571cde2012-02-15 13:39:01 +00005488void solaris::Assemble::ConstructJob(Compilation &C, const JobAction &JA,
5489 const InputInfo &Output,
5490 const InputInfoList &Inputs,
5491 const ArgList &Args,
5492 const char *LinkingOutput) const {
5493 ArgStringList CmdArgs;
5494
5495 Args.AddAllArgValues(CmdArgs, options::OPT_Wa_COMMA,
5496 options::OPT_Xassembler);
5497
5498 CmdArgs.push_back("-o");
5499 CmdArgs.push_back(Output.getFilename());
5500
5501 for (InputInfoList::const_iterator
5502 it = Inputs.begin(), ie = Inputs.end(); it != ie; ++it) {
5503 const InputInfo &II = *it;
5504 CmdArgs.push_back(II.getFilename());
5505 }
5506
5507 const char *Exec =
5508 Args.MakeArgString(getToolChain().GetProgramPath("as"));
5509 C.addCommand(new Command(JA, *this, Exec, CmdArgs));
5510}
5511
5512
5513void solaris::Link::ConstructJob(Compilation &C, const JobAction &JA,
5514 const InputInfo &Output,
5515 const InputInfoList &Inputs,
5516 const ArgList &Args,
5517 const char *LinkingOutput) const {
5518 // FIXME: Find a real GCC, don't hard-code versions here
5519 std::string GCCLibPath = "/usr/gcc/4.5/lib/gcc/";
5520 const llvm::Triple &T = getToolChain().getTriple();
5521 std::string LibPath = "/usr/lib/";
5522 llvm::Triple::ArchType Arch = T.getArch();
5523 switch (Arch) {
Benjamin Kramerb2ccade2013-10-21 12:33:55 +00005524 case llvm::Triple::x86:
5525 GCCLibPath +=
5526 ("i386-" + T.getVendorName() + "-" + T.getOSName()).str() + "/4.5.2/";
5527 break;
5528 case llvm::Triple::x86_64:
5529 GCCLibPath += ("i386-" + T.getVendorName() + "-" + T.getOSName()).str();
5530 GCCLibPath += "/4.5.2/amd64/";
5531 LibPath += "amd64/";
5532 break;
5533 default:
5534 llvm_unreachable("Unsupported architecture");
David Chisnallf571cde2012-02-15 13:39:01 +00005535 }
5536
5537 ArgStringList CmdArgs;
5538
David Chisnall272a0712012-02-29 15:06:12 +00005539 // Demangle C++ names in errors
5540 CmdArgs.push_back("-C");
5541
David Chisnallf571cde2012-02-15 13:39:01 +00005542 if ((!Args.hasArg(options::OPT_nostdlib)) &&
5543 (!Args.hasArg(options::OPT_shared))) {
5544 CmdArgs.push_back("-e");
5545 CmdArgs.push_back("_start");
5546 }
5547
5548 if (Args.hasArg(options::OPT_static)) {
5549 CmdArgs.push_back("-Bstatic");
5550 CmdArgs.push_back("-dn");
5551 } else {
5552 CmdArgs.push_back("-Bdynamic");
5553 if (Args.hasArg(options::OPT_shared)) {
5554 CmdArgs.push_back("-shared");
5555 } else {
5556 CmdArgs.push_back("--dynamic-linker");
5557 CmdArgs.push_back(Args.MakeArgString(LibPath + "ld.so.1"));
5558 }
5559 }
5560
5561 if (Output.isFilename()) {
5562 CmdArgs.push_back("-o");
5563 CmdArgs.push_back(Output.getFilename());
5564 } else {
5565 assert(Output.isNothing() && "Invalid output.");
5566 }
5567
5568 if (!Args.hasArg(options::OPT_nostdlib) &&
5569 !Args.hasArg(options::OPT_nostartfiles)) {
5570 if (!Args.hasArg(options::OPT_shared)) {
5571 CmdArgs.push_back(Args.MakeArgString(LibPath + "crt1.o"));
5572 CmdArgs.push_back(Args.MakeArgString(LibPath + "crti.o"));
David Chisnall0c52c0f2012-02-28 17:10:04 +00005573 CmdArgs.push_back(Args.MakeArgString(LibPath + "values-Xa.o"));
David Chisnallf571cde2012-02-15 13:39:01 +00005574 CmdArgs.push_back(Args.MakeArgString(GCCLibPath + "crtbegin.o"));
5575 } else {
5576 CmdArgs.push_back(Args.MakeArgString(LibPath + "crti.o"));
David Chisnall0c52c0f2012-02-28 17:10:04 +00005577 CmdArgs.push_back(Args.MakeArgString(LibPath + "values-Xa.o"));
5578 CmdArgs.push_back(Args.MakeArgString(GCCLibPath + "crtbegin.o"));
David Chisnallf571cde2012-02-15 13:39:01 +00005579 }
Hans Wennborg70850d82013-07-18 20:29:38 +00005580 if (getToolChain().getDriver().CCCIsCXX())
David Chisnallddc4c9d2012-03-13 14:14:54 +00005581 CmdArgs.push_back(Args.MakeArgString(LibPath + "cxa_finalize.o"));
David Chisnallf571cde2012-02-15 13:39:01 +00005582 }
5583
5584 CmdArgs.push_back(Args.MakeArgString("-L" + GCCLibPath));
5585
5586 Args.AddAllArgs(CmdArgs, options::OPT_L);
5587 Args.AddAllArgs(CmdArgs, options::OPT_T_Group);
5588 Args.AddAllArgs(CmdArgs, options::OPT_e);
David Chisnall0c52c0f2012-02-28 17:10:04 +00005589 Args.AddAllArgs(CmdArgs, options::OPT_r);
David Chisnallf571cde2012-02-15 13:39:01 +00005590
5591 AddLinkerInputs(getToolChain(), Inputs, Args, CmdArgs);
5592
5593 if (!Args.hasArg(options::OPT_nostdlib) &&
5594 !Args.hasArg(options::OPT_nodefaultlibs)) {
Hans Wennborg70850d82013-07-18 20:29:38 +00005595 if (getToolChain().getDriver().CCCIsCXX())
David Chisnall3d127c72012-04-10 11:49:50 +00005596 getToolChain().AddCXXStdlibLibArgs(Args, CmdArgs);
David Chisnall1026fb02012-02-15 18:24:31 +00005597 CmdArgs.push_back("-lgcc_s");
David Chisnall0c52c0f2012-02-28 17:10:04 +00005598 if (!Args.hasArg(options::OPT_shared)) {
5599 CmdArgs.push_back("-lgcc");
David Chisnallf571cde2012-02-15 13:39:01 +00005600 CmdArgs.push_back("-lc");
David Chisnallc73fb892012-02-28 20:06:45 +00005601 CmdArgs.push_back("-lm");
David Chisnall0c52c0f2012-02-28 17:10:04 +00005602 }
David Chisnallf571cde2012-02-15 13:39:01 +00005603 }
5604
5605 if (!Args.hasArg(options::OPT_nostdlib) &&
5606 !Args.hasArg(options::OPT_nostartfiles)) {
David Chisnall0c52c0f2012-02-28 17:10:04 +00005607 CmdArgs.push_back(Args.MakeArgString(GCCLibPath + "crtend.o"));
David Chisnallf571cde2012-02-15 13:39:01 +00005608 }
David Chisnall96de9932012-02-16 16:00:47 +00005609 CmdArgs.push_back(Args.MakeArgString(LibPath + "crtn.o"));
David Chisnallf571cde2012-02-15 13:39:01 +00005610
Alexey Samsonov7811d192014-02-20 13:57:37 +00005611 addProfileRT(getToolChain(), Args, CmdArgs);
David Chisnallf571cde2012-02-15 13:39:01 +00005612
5613 const char *Exec =
Rafael Espindola236db462013-11-09 20:07:19 +00005614 Args.MakeArgString(getToolChain().GetProgramPath("ld"));
David Chisnallf571cde2012-02-15 13:39:01 +00005615 C.addCommand(new Command(JA, *this, Exec, CmdArgs));
5616}
5617
Edward O'Callaghan856e4ff2009-08-22 01:06:46 +00005618void auroraux::Assemble::ConstructJob(Compilation &C, const JobAction &JA,
Daniel Dunbar7fbaf532010-08-02 02:38:28 +00005619 const InputInfo &Output,
Daniel Dunbar1c7577c2009-11-04 06:24:38 +00005620 const InputInfoList &Inputs,
5621 const ArgList &Args,
5622 const char *LinkingOutput) const {
Edward O'Callaghan856e4ff2009-08-22 01:06:46 +00005623 ArgStringList CmdArgs;
5624
5625 Args.AddAllArgValues(CmdArgs, options::OPT_Wa_COMMA,
5626 options::OPT_Xassembler);
5627
5628 CmdArgs.push_back("-o");
Daniel Dunbarb440f562010-08-02 02:38:21 +00005629 CmdArgs.push_back(Output.getFilename());
Edward O'Callaghan856e4ff2009-08-22 01:06:46 +00005630
5631 for (InputInfoList::const_iterator
5632 it = Inputs.begin(), ie = Inputs.end(); it != ie; ++it) {
5633 const InputInfo &II = *it;
Daniel Dunbarb440f562010-08-02 02:38:21 +00005634 CmdArgs.push_back(II.getFilename());
Edward O'Callaghan856e4ff2009-08-22 01:06:46 +00005635 }
5636
5637 const char *Exec =
Daniel Dunbar9c3ed5f2010-07-14 18:46:23 +00005638 Args.MakeArgString(getToolChain().GetProgramPath("gas"));
Daniel Dunbar7fbaf532010-08-02 02:38:28 +00005639 C.addCommand(new Command(JA, *this, Exec, CmdArgs));
Edward O'Callaghan856e4ff2009-08-22 01:06:46 +00005640}
5641
5642void auroraux::Link::ConstructJob(Compilation &C, const JobAction &JA,
Daniel Dunbar7fbaf532010-08-02 02:38:28 +00005643 const InputInfo &Output,
Daniel Dunbar1c7577c2009-11-04 06:24:38 +00005644 const InputInfoList &Inputs,
5645 const ArgList &Args,
5646 const char *LinkingOutput) const {
Edward O'Callaghan856e4ff2009-08-22 01:06:46 +00005647 ArgStringList CmdArgs;
5648
5649 if ((!Args.hasArg(options::OPT_nostdlib)) &&
Daniel Dunbar1c7577c2009-11-04 06:24:38 +00005650 (!Args.hasArg(options::OPT_shared))) {
Edward O'Callaghan856e4ff2009-08-22 01:06:46 +00005651 CmdArgs.push_back("-e");
Edward O'Callaghand8712d92009-10-15 07:44:07 +00005652 CmdArgs.push_back("_start");
Edward O'Callaghan856e4ff2009-08-22 01:06:46 +00005653 }
5654
5655 if (Args.hasArg(options::OPT_static)) {
5656 CmdArgs.push_back("-Bstatic");
Edward O'Callaghand8712d92009-10-15 07:44:07 +00005657 CmdArgs.push_back("-dn");
Edward O'Callaghan856e4ff2009-08-22 01:06:46 +00005658 } else {
Edward O'Callaghand8712d92009-10-15 07:44:07 +00005659// CmdArgs.push_back("--eh-frame-hdr");
Edward O'Callaghan856e4ff2009-08-22 01:06:46 +00005660 CmdArgs.push_back("-Bdynamic");
5661 if (Args.hasArg(options::OPT_shared)) {
5662 CmdArgs.push_back("-shared");
5663 } else {
Edward O'Callaghan7d3c2752009-10-16 19:44:18 +00005664 CmdArgs.push_back("--dynamic-linker");
Edward O'Callaghan856e4ff2009-08-22 01:06:46 +00005665 CmdArgs.push_back("/lib/ld.so.1"); // 64Bit Path /lib/amd64/ld.so.1
5666 }
5667 }
5668
Daniel Dunbarb440f562010-08-02 02:38:21 +00005669 if (Output.isFilename()) {
Edward O'Callaghan856e4ff2009-08-22 01:06:46 +00005670 CmdArgs.push_back("-o");
5671 CmdArgs.push_back(Output.getFilename());
5672 } else {
5673 assert(Output.isNothing() && "Invalid output.");
5674 }
5675
5676 if (!Args.hasArg(options::OPT_nostdlib) &&
5677 !Args.hasArg(options::OPT_nostartfiles)) {
5678 if (!Args.hasArg(options::OPT_shared)) {
Chris Lattner3e2ee142010-07-07 16:01:42 +00005679 CmdArgs.push_back(Args.MakeArgString(
Daniel Dunbar9c3ed5f2010-07-14 18:46:23 +00005680 getToolChain().GetFilePath("crt1.o")));
Chris Lattner3e2ee142010-07-07 16:01:42 +00005681 CmdArgs.push_back(Args.MakeArgString(
Daniel Dunbar9c3ed5f2010-07-14 18:46:23 +00005682 getToolChain().GetFilePath("crti.o")));
Chris Lattner3e2ee142010-07-07 16:01:42 +00005683 CmdArgs.push_back(Args.MakeArgString(
Daniel Dunbar9c3ed5f2010-07-14 18:46:23 +00005684 getToolChain().GetFilePath("crtbegin.o")));
Edward O'Callaghan856e4ff2009-08-22 01:06:46 +00005685 } else {
Chris Lattner3e2ee142010-07-07 16:01:42 +00005686 CmdArgs.push_back(Args.MakeArgString(
Daniel Dunbar9c3ed5f2010-07-14 18:46:23 +00005687 getToolChain().GetFilePath("crti.o")));
Edward O'Callaghan856e4ff2009-08-22 01:06:46 +00005688 }
Chris Lattner3e2ee142010-07-07 16:01:42 +00005689 CmdArgs.push_back(Args.MakeArgString(
Daniel Dunbar9c3ed5f2010-07-14 18:46:23 +00005690 getToolChain().GetFilePath("crtn.o")));
Edward O'Callaghan856e4ff2009-08-22 01:06:46 +00005691 }
5692
Daniel Dunbar1c7577c2009-11-04 06:24:38 +00005693 CmdArgs.push_back(Args.MakeArgString("-L/opt/gcc4/lib/gcc/"
5694 + getToolChain().getTripleString()
Daniel Dunbarb0b18612009-10-29 02:24:37 +00005695 + "/4.2.4"));
Edward O'Callaghan856e4ff2009-08-22 01:06:46 +00005696
5697 Args.AddAllArgs(CmdArgs, options::OPT_L);
5698 Args.AddAllArgs(CmdArgs, options::OPT_T_Group);
5699 Args.AddAllArgs(CmdArgs, options::OPT_e);
5700
Daniel Dunbar54423b22010-09-17 00:24:54 +00005701 AddLinkerInputs(getToolChain(), Inputs, Args, CmdArgs);
Edward O'Callaghan856e4ff2009-08-22 01:06:46 +00005702
5703 if (!Args.hasArg(options::OPT_nostdlib) &&
5704 !Args.hasArg(options::OPT_nodefaultlibs)) {
5705 // FIXME: For some reason GCC passes -lgcc before adding
5706 // the default system libraries. Just mimic this for now.
5707 CmdArgs.push_back("-lgcc");
5708
5709 if (Args.hasArg(options::OPT_pthread))
5710 CmdArgs.push_back("-pthread");
5711 if (!Args.hasArg(options::OPT_shared))
5712 CmdArgs.push_back("-lc");
5713 CmdArgs.push_back("-lgcc");
5714 }
5715
5716 if (!Args.hasArg(options::OPT_nostdlib) &&
5717 !Args.hasArg(options::OPT_nostartfiles)) {
5718 if (!Args.hasArg(options::OPT_shared))
Chris Lattner3e2ee142010-07-07 16:01:42 +00005719 CmdArgs.push_back(Args.MakeArgString(
Daniel Dunbar9c3ed5f2010-07-14 18:46:23 +00005720 getToolChain().GetFilePath("crtend.o")));
Edward O'Callaghan856e4ff2009-08-22 01:06:46 +00005721 }
5722
Alexey Samsonov7811d192014-02-20 13:57:37 +00005723 addProfileRT(getToolChain(), Args, CmdArgs);
Nick Lewycky82fe5f42011-05-24 21:54:59 +00005724
Edward O'Callaghan856e4ff2009-08-22 01:06:46 +00005725 const char *Exec =
Rafael Espindola236db462013-11-09 20:07:19 +00005726 Args.MakeArgString(getToolChain().GetProgramPath("ld"));
Daniel Dunbar7fbaf532010-08-02 02:38:28 +00005727 C.addCommand(new Command(JA, *this, Exec, CmdArgs));
Edward O'Callaghan856e4ff2009-08-22 01:06:46 +00005728}
5729
Daniel Dunbar10de9e62009-06-29 20:52:51 +00005730void openbsd::Assemble::ConstructJob(Compilation &C, const JobAction &JA,
Daniel Dunbar7fbaf532010-08-02 02:38:28 +00005731 const InputInfo &Output,
Daniel Dunbar10de9e62009-06-29 20:52:51 +00005732 const InputInfoList &Inputs,
5733 const ArgList &Args,
Mike Stump11289f42009-09-09 15:08:12 +00005734 const char *LinkingOutput) const {
Daniel Dunbar10de9e62009-06-29 20:52:51 +00005735 ArgStringList CmdArgs;
Rafael Espindolacc126272014-02-28 01:55:21 +00005736 bool NeedsKPIC = false;
Daniel Dunbar10de9e62009-06-29 20:52:51 +00005737
Rafael Espindolacc126272014-02-28 01:55:21 +00005738 switch (getToolChain().getArch()) {
5739 case llvm::Triple::x86:
5740 // When building 32-bit code on OpenBSD/amd64, we have to explicitly
5741 // instruct as in the base system to assemble 32-bit code.
Joerg Sonnenbergeree3b2da2013-12-07 00:57:46 +00005742 CmdArgs.push_back("--32");
Rafael Espindolacc126272014-02-28 01:55:21 +00005743 break;
5744
5745 case llvm::Triple::ppc:
Joerg Sonnenbergeree3b2da2013-12-07 00:57:46 +00005746 CmdArgs.push_back("-mppc");
5747 CmdArgs.push_back("-many");
Rafael Espindolacc126272014-02-28 01:55:21 +00005748 break;
5749
5750 case llvm::Triple::sparc:
5751 CmdArgs.push_back("-32");
5752 NeedsKPIC = true;
5753 break;
5754
5755 case llvm::Triple::sparcv9:
5756 CmdArgs.push_back("-64");
5757 CmdArgs.push_back("-Av9a");
5758 NeedsKPIC = true;
5759 break;
5760
5761 case llvm::Triple::mips64:
5762 case llvm::Triple::mips64el: {
Joerg Sonnenbergeree3b2da2013-12-07 00:57:46 +00005763 StringRef CPUName;
5764 StringRef ABIName;
5765 getMipsCPUAndABI(Args, getToolChain().getTriple(), CPUName, ABIName);
5766
5767 CmdArgs.push_back("-mabi");
5768 CmdArgs.push_back(getGnuCompatibleMipsABIName(ABIName).data());
5769
5770 if (getToolChain().getArch() == llvm::Triple::mips64)
5771 CmdArgs.push_back("-EB");
5772 else
5773 CmdArgs.push_back("-EL");
5774
Rafael Espindolacc126272014-02-28 01:55:21 +00005775 NeedsKPIC = true;
5776 break;
Joerg Sonnenbergeree3b2da2013-12-07 00:57:46 +00005777 }
5778
Rafael Espindolacc126272014-02-28 01:55:21 +00005779 default:
5780 break;
5781 }
5782
5783 if (NeedsKPIC)
5784 addAssemblerKPIC(Args, CmdArgs);
5785
Daniel Dunbar10de9e62009-06-29 20:52:51 +00005786 Args.AddAllArgValues(CmdArgs, options::OPT_Wa_COMMA,
5787 options::OPT_Xassembler);
5788
5789 CmdArgs.push_back("-o");
Daniel Dunbarb440f562010-08-02 02:38:21 +00005790 CmdArgs.push_back(Output.getFilename());
Daniel Dunbar10de9e62009-06-29 20:52:51 +00005791
5792 for (InputInfoList::const_iterator
5793 it = Inputs.begin(), ie = Inputs.end(); it != ie; ++it) {
5794 const InputInfo &II = *it;
Daniel Dunbarb440f562010-08-02 02:38:21 +00005795 CmdArgs.push_back(II.getFilename());
Daniel Dunbar10de9e62009-06-29 20:52:51 +00005796 }
5797
5798 const char *Exec =
Daniel Dunbar9c3ed5f2010-07-14 18:46:23 +00005799 Args.MakeArgString(getToolChain().GetProgramPath("as"));
Daniel Dunbar7fbaf532010-08-02 02:38:28 +00005800 C.addCommand(new Command(JA, *this, Exec, CmdArgs));
Daniel Dunbar10de9e62009-06-29 20:52:51 +00005801}
5802
5803void openbsd::Link::ConstructJob(Compilation &C, const JobAction &JA,
Daniel Dunbar7fbaf532010-08-02 02:38:28 +00005804 const InputInfo &Output,
Daniel Dunbar10de9e62009-06-29 20:52:51 +00005805 const InputInfoList &Inputs,
5806 const ArgList &Args,
5807 const char *LinkingOutput) const {
Daniel Dunbar083edf72009-12-21 18:54:17 +00005808 const Driver &D = getToolChain().getDriver();
Daniel Dunbar10de9e62009-06-29 20:52:51 +00005809 ArgStringList CmdArgs;
5810
Rafael Espindolaaadd30e2012-12-31 22:41:36 +00005811 // Silence warning for "clang -g foo.o -o foo"
5812 Args.ClaimAllArgs(options::OPT_g_Group);
5813 // and "clang -emit-llvm foo.o -o foo"
5814 Args.ClaimAllArgs(options::OPT_emit_llvm);
5815 // and for "clang -w foo.o -o foo". Other warning options are already
5816 // handled somewhere else.
5817 Args.ClaimAllArgs(options::OPT_w);
5818
Joerg Sonnenbergeree3b2da2013-12-07 00:57:46 +00005819 if (getToolChain().getArch() == llvm::Triple::mips64)
5820 CmdArgs.push_back("-EB");
5821 else if (getToolChain().getArch() == llvm::Triple::mips64el)
5822 CmdArgs.push_back("-EL");
5823
Daniel Dunbara8888ac2009-08-03 01:28:59 +00005824 if ((!Args.hasArg(options::OPT_nostdlib)) &&
Daniel Dunbar1c7577c2009-11-04 06:24:38 +00005825 (!Args.hasArg(options::OPT_shared))) {
Daniel Dunbara8888ac2009-08-03 01:28:59 +00005826 CmdArgs.push_back("-e");
5827 CmdArgs.push_back("__start");
5828 }
5829
Daniel Dunbar10de9e62009-06-29 20:52:51 +00005830 if (Args.hasArg(options::OPT_static)) {
5831 CmdArgs.push_back("-Bstatic");
5832 } else {
Rafael Espindola7ba97af2010-11-11 02:17:51 +00005833 if (Args.hasArg(options::OPT_rdynamic))
5834 CmdArgs.push_back("-export-dynamic");
Daniel Dunbar10de9e62009-06-29 20:52:51 +00005835 CmdArgs.push_back("--eh-frame-hdr");
Daniel Dunbara8888ac2009-08-03 01:28:59 +00005836 CmdArgs.push_back("-Bdynamic");
Daniel Dunbar10de9e62009-06-29 20:52:51 +00005837 if (Args.hasArg(options::OPT_shared)) {
Daniel Dunbara8888ac2009-08-03 01:28:59 +00005838 CmdArgs.push_back("-shared");
Daniel Dunbar10de9e62009-06-29 20:52:51 +00005839 } else {
5840 CmdArgs.push_back("-dynamic-linker");
5841 CmdArgs.push_back("/usr/libexec/ld.so");
5842 }
5843 }
5844
Rafael Espindola044f7832013-06-05 04:28:55 +00005845 if (Args.hasArg(options::OPT_nopie))
5846 CmdArgs.push_back("-nopie");
5847
Daniel Dunbarb440f562010-08-02 02:38:21 +00005848 if (Output.isFilename()) {
Daniel Dunbar10de9e62009-06-29 20:52:51 +00005849 CmdArgs.push_back("-o");
5850 CmdArgs.push_back(Output.getFilename());
5851 } else {
5852 assert(Output.isNothing() && "Invalid output.");
5853 }
5854
5855 if (!Args.hasArg(options::OPT_nostdlib) &&
5856 !Args.hasArg(options::OPT_nostartfiles)) {
5857 if (!Args.hasArg(options::OPT_shared)) {
Eli Friedman3715d1f2011-12-15 02:15:56 +00005858 if (Args.hasArg(options::OPT_pg))
5859 CmdArgs.push_back(Args.MakeArgString(
5860 getToolChain().GetFilePath("gcrt0.o")));
5861 else
5862 CmdArgs.push_back(Args.MakeArgString(
5863 getToolChain().GetFilePath("crt0.o")));
Chris Lattner3e2ee142010-07-07 16:01:42 +00005864 CmdArgs.push_back(Args.MakeArgString(
Daniel Dunbar9c3ed5f2010-07-14 18:46:23 +00005865 getToolChain().GetFilePath("crtbegin.o")));
Daniel Dunbar10de9e62009-06-29 20:52:51 +00005866 } else {
Chris Lattner3e2ee142010-07-07 16:01:42 +00005867 CmdArgs.push_back(Args.MakeArgString(
Daniel Dunbar9c3ed5f2010-07-14 18:46:23 +00005868 getToolChain().GetFilePath("crtbeginS.o")));
Daniel Dunbar10de9e62009-06-29 20:52:51 +00005869 }
5870 }
5871
Edward O'Callaghan5c521462009-10-28 15:13:08 +00005872 std::string Triple = getToolChain().getTripleString();
5873 if (Triple.substr(0, 6) == "x86_64")
Daniel Dunbar1c7577c2009-11-04 06:24:38 +00005874 Triple.replace(0, 6, "amd64");
Daniel Dunbarb0b18612009-10-29 02:24:37 +00005875 CmdArgs.push_back(Args.MakeArgString("-L/usr/lib/gcc-lib/" + Triple +
Daniel Dunbarea3813f2010-08-01 23:13:54 +00005876 "/4.2.1"));
Daniel Dunbara8888ac2009-08-03 01:28:59 +00005877
Daniel Dunbar10de9e62009-06-29 20:52:51 +00005878 Args.AddAllArgs(CmdArgs, options::OPT_L);
5879 Args.AddAllArgs(CmdArgs, options::OPT_T_Group);
5880 Args.AddAllArgs(CmdArgs, options::OPT_e);
Rafael Espindolaaadd30e2012-12-31 22:41:36 +00005881 Args.AddAllArgs(CmdArgs, options::OPT_s);
5882 Args.AddAllArgs(CmdArgs, options::OPT_t);
5883 Args.AddAllArgs(CmdArgs, options::OPT_Z_Flag);
5884 Args.AddAllArgs(CmdArgs, options::OPT_r);
Daniel Dunbar10de9e62009-06-29 20:52:51 +00005885
Daniel Dunbar54423b22010-09-17 00:24:54 +00005886 AddLinkerInputs(getToolChain(), Inputs, Args, CmdArgs);
Daniel Dunbar10de9e62009-06-29 20:52:51 +00005887
5888 if (!Args.hasArg(options::OPT_nostdlib) &&
5889 !Args.hasArg(options::OPT_nodefaultlibs)) {
Hans Wennborg70850d82013-07-18 20:29:38 +00005890 if (D.CCCIsCXX()) {
Daniel Dunbar3f7796f2010-09-17 01:20:05 +00005891 getToolChain().AddCXXStdlibLibArgs(Args, CmdArgs);
Eli Friedman3715d1f2011-12-15 02:15:56 +00005892 if (Args.hasArg(options::OPT_pg))
5893 CmdArgs.push_back("-lm_p");
5894 else
5895 CmdArgs.push_back("-lm");
Daniel Dunbarea3813f2010-08-01 23:13:54 +00005896 }
5897
Daniel Dunbara8888ac2009-08-03 01:28:59 +00005898 // FIXME: For some reason GCC passes -lgcc before adding
5899 // the default system libraries. Just mimic this for now.
5900 CmdArgs.push_back("-lgcc");
Daniel Dunbar10de9e62009-06-29 20:52:51 +00005901
Eric Christopher17674ec2012-09-13 06:32:34 +00005902 if (Args.hasArg(options::OPT_pthread)) {
5903 if (!Args.hasArg(options::OPT_shared) &&
5904 Args.hasArg(options::OPT_pg))
5905 CmdArgs.push_back("-lpthread_p");
5906 else
5907 CmdArgs.push_back("-lpthread");
5908 }
5909
Chandler Carruth45661652011-12-17 22:32:42 +00005910 if (!Args.hasArg(options::OPT_shared)) {
Eric Christopher17674ec2012-09-13 06:32:34 +00005911 if (Args.hasArg(options::OPT_pg))
Eli Friedman3715d1f2011-12-15 02:15:56 +00005912 CmdArgs.push_back("-lc_p");
5913 else
5914 CmdArgs.push_back("-lc");
Chandler Carruth45661652011-12-17 22:32:42 +00005915 }
Eric Christopher17674ec2012-09-13 06:32:34 +00005916
Daniel Dunbara8888ac2009-08-03 01:28:59 +00005917 CmdArgs.push_back("-lgcc");
Daniel Dunbar10de9e62009-06-29 20:52:51 +00005918 }
5919
5920 if (!Args.hasArg(options::OPT_nostdlib) &&
5921 !Args.hasArg(options::OPT_nostartfiles)) {
5922 if (!Args.hasArg(options::OPT_shared))
Chris Lattner3e2ee142010-07-07 16:01:42 +00005923 CmdArgs.push_back(Args.MakeArgString(
Daniel Dunbar9c3ed5f2010-07-14 18:46:23 +00005924 getToolChain().GetFilePath("crtend.o")));
Daniel Dunbar10de9e62009-06-29 20:52:51 +00005925 else
Chris Lattner3e2ee142010-07-07 16:01:42 +00005926 CmdArgs.push_back(Args.MakeArgString(
Daniel Dunbar9c3ed5f2010-07-14 18:46:23 +00005927 getToolChain().GetFilePath("crtendS.o")));
Daniel Dunbar10de9e62009-06-29 20:52:51 +00005928 }
5929
5930 const char *Exec =
Rafael Espindola236db462013-11-09 20:07:19 +00005931 Args.MakeArgString(getToolChain().GetProgramPath("ld"));
Daniel Dunbar7fbaf532010-08-02 02:38:28 +00005932 C.addCommand(new Command(JA, *this, Exec, CmdArgs));
Daniel Dunbar10de9e62009-06-29 20:52:51 +00005933}
Ed Schoutene33194b2009-04-02 19:13:12 +00005934
Eli Friedman9fa28852012-08-08 23:57:20 +00005935void bitrig::Assemble::ConstructJob(Compilation &C, const JobAction &JA,
5936 const InputInfo &Output,
5937 const InputInfoList &Inputs,
5938 const ArgList &Args,
5939 const char *LinkingOutput) const {
5940 ArgStringList CmdArgs;
5941
5942 Args.AddAllArgValues(CmdArgs, options::OPT_Wa_COMMA,
5943 options::OPT_Xassembler);
5944
5945 CmdArgs.push_back("-o");
5946 CmdArgs.push_back(Output.getFilename());
5947
5948 for (InputInfoList::const_iterator
5949 it = Inputs.begin(), ie = Inputs.end(); it != ie; ++it) {
5950 const InputInfo &II = *it;
5951 CmdArgs.push_back(II.getFilename());
5952 }
5953
5954 const char *Exec =
5955 Args.MakeArgString(getToolChain().GetProgramPath("as"));
5956 C.addCommand(new Command(JA, *this, Exec, CmdArgs));
5957}
5958
5959void bitrig::Link::ConstructJob(Compilation &C, const JobAction &JA,
5960 const InputInfo &Output,
5961 const InputInfoList &Inputs,
5962 const ArgList &Args,
5963 const char *LinkingOutput) const {
5964 const Driver &D = getToolChain().getDriver();
5965 ArgStringList CmdArgs;
5966
5967 if ((!Args.hasArg(options::OPT_nostdlib)) &&
5968 (!Args.hasArg(options::OPT_shared))) {
5969 CmdArgs.push_back("-e");
5970 CmdArgs.push_back("__start");
5971 }
5972
5973 if (Args.hasArg(options::OPT_static)) {
5974 CmdArgs.push_back("-Bstatic");
5975 } else {
5976 if (Args.hasArg(options::OPT_rdynamic))
5977 CmdArgs.push_back("-export-dynamic");
5978 CmdArgs.push_back("--eh-frame-hdr");
5979 CmdArgs.push_back("-Bdynamic");
5980 if (Args.hasArg(options::OPT_shared)) {
5981 CmdArgs.push_back("-shared");
5982 } else {
5983 CmdArgs.push_back("-dynamic-linker");
5984 CmdArgs.push_back("/usr/libexec/ld.so");
5985 }
5986 }
5987
5988 if (Output.isFilename()) {
5989 CmdArgs.push_back("-o");
5990 CmdArgs.push_back(Output.getFilename());
5991 } else {
5992 assert(Output.isNothing() && "Invalid output.");
5993 }
5994
5995 if (!Args.hasArg(options::OPT_nostdlib) &&
5996 !Args.hasArg(options::OPT_nostartfiles)) {
5997 if (!Args.hasArg(options::OPT_shared)) {
5998 if (Args.hasArg(options::OPT_pg))
5999 CmdArgs.push_back(Args.MakeArgString(
6000 getToolChain().GetFilePath("gcrt0.o")));
6001 else
6002 CmdArgs.push_back(Args.MakeArgString(
6003 getToolChain().GetFilePath("crt0.o")));
6004 CmdArgs.push_back(Args.MakeArgString(
6005 getToolChain().GetFilePath("crtbegin.o")));
6006 } else {
6007 CmdArgs.push_back(Args.MakeArgString(
6008 getToolChain().GetFilePath("crtbeginS.o")));
6009 }
6010 }
6011
6012 Args.AddAllArgs(CmdArgs, options::OPT_L);
6013 Args.AddAllArgs(CmdArgs, options::OPT_T_Group);
6014 Args.AddAllArgs(CmdArgs, options::OPT_e);
6015
6016 AddLinkerInputs(getToolChain(), Inputs, Args, CmdArgs);
6017
6018 if (!Args.hasArg(options::OPT_nostdlib) &&
6019 !Args.hasArg(options::OPT_nodefaultlibs)) {
Hans Wennborg70850d82013-07-18 20:29:38 +00006020 if (D.CCCIsCXX()) {
Eli Friedman9fa28852012-08-08 23:57:20 +00006021 getToolChain().AddCXXStdlibLibArgs(Args, CmdArgs);
6022 if (Args.hasArg(options::OPT_pg))
6023 CmdArgs.push_back("-lm_p");
6024 else
6025 CmdArgs.push_back("-lm");
6026 }
6027
Rafael Espindola1ad26f02012-10-23 17:07:31 +00006028 if (Args.hasArg(options::OPT_pthread)) {
6029 if (!Args.hasArg(options::OPT_shared) &&
6030 Args.hasArg(options::OPT_pg))
6031 CmdArgs.push_back("-lpthread_p");
6032 else
6033 CmdArgs.push_back("-lpthread");
6034 }
6035
Eli Friedman9fa28852012-08-08 23:57:20 +00006036 if (!Args.hasArg(options::OPT_shared)) {
6037 if (Args.hasArg(options::OPT_pg))
6038 CmdArgs.push_back("-lc_p");
6039 else
6040 CmdArgs.push_back("-lc");
6041 }
6042
Benjamin Kramerb2ccade2013-10-21 12:33:55 +00006043 StringRef MyArch;
6044 switch (getToolChain().getTriple().getArch()) {
6045 case llvm::Triple::arm:
6046 MyArch = "arm";
6047 break;
6048 case llvm::Triple::x86:
6049 MyArch = "i386";
6050 break;
6051 case llvm::Triple::x86_64:
6052 MyArch = "amd64";
6053 break;
6054 default:
6055 llvm_unreachable("Unsupported architecture");
6056 }
6057 CmdArgs.push_back(Args.MakeArgString("-lclang_rt." + MyArch));
Eli Friedman9fa28852012-08-08 23:57:20 +00006058 }
6059
6060 if (!Args.hasArg(options::OPT_nostdlib) &&
6061 !Args.hasArg(options::OPT_nostartfiles)) {
6062 if (!Args.hasArg(options::OPT_shared))
6063 CmdArgs.push_back(Args.MakeArgString(
6064 getToolChain().GetFilePath("crtend.o")));
6065 else
6066 CmdArgs.push_back(Args.MakeArgString(
6067 getToolChain().GetFilePath("crtendS.o")));
6068 }
Eli Friedman5bb2ba02012-08-09 22:42:04 +00006069
6070 const char *Exec =
Rafael Espindola236db462013-11-09 20:07:19 +00006071 Args.MakeArgString(getToolChain().GetProgramPath("ld"));
Eli Friedman5bb2ba02012-08-09 22:42:04 +00006072 C.addCommand(new Command(JA, *this, Exec, CmdArgs));
Eli Friedman9fa28852012-08-08 23:57:20 +00006073}
6074
Daniel Dunbar8eb473c2009-03-31 17:45:15 +00006075void freebsd::Assemble::ConstructJob(Compilation &C, const JobAction &JA,
Daniel Dunbar7fbaf532010-08-02 02:38:28 +00006076 const InputInfo &Output,
Daniel Dunbard067f7f2009-04-08 23:54:23 +00006077 const InputInfoList &Inputs,
6078 const ArgList &Args,
Mike Stump11289f42009-09-09 15:08:12 +00006079 const char *LinkingOutput) const {
Daniel Dunbar8eb473c2009-03-31 17:45:15 +00006080 ArgStringList CmdArgs;
6081
Daniel Dunbard854c8d2009-04-01 19:36:32 +00006082 // When building 32-bit code on FreeBSD/amd64, we have to explicitly
6083 // instruct as in the base system to assemble 32-bit code.
Eric Christopherc0f1a5e2012-09-05 21:32:44 +00006084 if (getToolChain().getArch() == llvm::Triple::x86)
Daniel Dunbar8eb473c2009-03-31 17:45:15 +00006085 CmdArgs.push_back("--32");
Eric Christopherc0f1a5e2012-09-05 21:32:44 +00006086 else if (getToolChain().getArch() == llvm::Triple::ppc)
Roman Divacky00859c22011-06-04 07:37:31 +00006087 CmdArgs.push_back("-a32");
Eric Christopherc0f1a5e2012-09-05 21:32:44 +00006088 else if (getToolChain().getArch() == llvm::Triple::mips ||
6089 getToolChain().getArch() == llvm::Triple::mipsel ||
6090 getToolChain().getArch() == llvm::Triple::mips64 ||
6091 getToolChain().getArch() == llvm::Triple::mips64el) {
6092 StringRef CPUName;
6093 StringRef ABIName;
Rafael Espindola22ce34a2013-08-20 22:12:08 +00006094 getMipsCPUAndABI(Args, getToolChain().getTriple(), CPUName, ABIName);
Michael J. Spencer4c0ffa82010-10-21 03:16:25 +00006095
Eric Christopherc0f1a5e2012-09-05 21:32:44 +00006096 CmdArgs.push_back("-march");
6097 CmdArgs.push_back(CPUName.data());
6098
Eric Christopherc0f1a5e2012-09-05 21:32:44 +00006099 CmdArgs.push_back("-mabi");
Simon Atanasyan0da400c2013-02-27 14:55:49 +00006100 CmdArgs.push_back(getGnuCompatibleMipsABIName(ABIName).data());
Eric Christopherc0f1a5e2012-09-05 21:32:44 +00006101
6102 if (getToolChain().getArch() == llvm::Triple::mips ||
6103 getToolChain().getArch() == llvm::Triple::mips64)
6104 CmdArgs.push_back("-EB");
6105 else
6106 CmdArgs.push_back("-EL");
6107
Joerg Sonnenbergerc151b022014-02-19 21:58:52 +00006108 addAssemblerKPIC(Args, CmdArgs);
Rafael Espindola0f207ed2012-12-13 04:17:14 +00006109 } else if (getToolChain().getArch() == llvm::Triple::arm ||
Christian Pirkerf01cd6f2014-03-28 14:40:46 +00006110 getToolChain().getArch() == llvm::Triple::armeb ||
6111 getToolChain().getArch() == llvm::Triple::thumb ||
6112 getToolChain().getArch() == llvm::Triple::thumbeb) {
Renato Golinf4421f72014-02-19 10:44:07 +00006113 const Driver &D = getToolChain().getDriver();
Benjamin Kramer9299637dc2014-03-04 19:31:42 +00006114 const llvm::Triple &Triple = getToolChain().getTriple();
Renato Golinf4421f72014-02-19 10:44:07 +00006115 StringRef FloatABI = arm::getARMFloatABI(D, Args, Triple);
6116
6117 if (FloatABI == "hard") {
6118 CmdArgs.push_back("-mfpu=vfp");
6119 } else {
6120 CmdArgs.push_back("-mfpu=softvfp");
6121 }
6122
Rafael Espindola0f207ed2012-12-13 04:17:14 +00006123 switch(getToolChain().getTriple().getEnvironment()) {
Renato Golinf4421f72014-02-19 10:44:07 +00006124 case llvm::Triple::GNUEABIHF:
Rafael Espindola0f207ed2012-12-13 04:17:14 +00006125 case llvm::Triple::GNUEABI:
6126 case llvm::Triple::EABI:
Anton Korobeynikov2bed8472013-03-18 07:59:20 +00006127 CmdArgs.push_back("-meabi=5");
Rafael Espindola0f207ed2012-12-13 04:17:14 +00006128 break;
6129
6130 default:
6131 CmdArgs.push_back("-matpcs");
6132 }
Roman Divacky47f4ff82014-01-02 15:13:18 +00006133 } else if (getToolChain().getArch() == llvm::Triple::sparc ||
Roman Divackyfeb5e632014-01-02 15:34:59 +00006134 getToolChain().getArch() == llvm::Triple::sparcv9) {
Roman Divacky9f779402014-02-25 18:45:49 +00006135 if (getToolChain().getArch() == llvm::Triple::sparc)
6136 CmdArgs.push_back("-Av8plusa");
6137 else
6138 CmdArgs.push_back("-Av9a");
6139
Joerg Sonnenbergerc151b022014-02-19 21:58:52 +00006140 addAssemblerKPIC(Args, CmdArgs);
Eric Christopherc0f1a5e2012-09-05 21:32:44 +00006141 }
Eric Christopher0b26a612010-03-02 02:41:08 +00006142
Daniel Dunbar8eb473c2009-03-31 17:45:15 +00006143 Args.AddAllArgValues(CmdArgs, options::OPT_Wa_COMMA,
6144 options::OPT_Xassembler);
6145
6146 CmdArgs.push_back("-o");
Daniel Dunbarb440f562010-08-02 02:38:21 +00006147 CmdArgs.push_back(Output.getFilename());
Daniel Dunbar8eb473c2009-03-31 17:45:15 +00006148
6149 for (InputInfoList::const_iterator
6150 it = Inputs.begin(), ie = Inputs.end(); it != ie; ++it) {
6151 const InputInfo &II = *it;
Daniel Dunbarb440f562010-08-02 02:38:21 +00006152 CmdArgs.push_back(II.getFilename());
Daniel Dunbar8eb473c2009-03-31 17:45:15 +00006153 }
6154
Daniel Dunbard067f7f2009-04-08 23:54:23 +00006155 const char *Exec =
Daniel Dunbar9c3ed5f2010-07-14 18:46:23 +00006156 Args.MakeArgString(getToolChain().GetProgramPath("as"));
Daniel Dunbar7fbaf532010-08-02 02:38:28 +00006157 C.addCommand(new Command(JA, *this, Exec, CmdArgs));
Daniel Dunbar8eb473c2009-03-31 17:45:15 +00006158}
Daniel Dunbard854c8d2009-04-01 19:36:32 +00006159
6160void freebsd::Link::ConstructJob(Compilation &C, const JobAction &JA,
Daniel Dunbar7fbaf532010-08-02 02:38:28 +00006161 const InputInfo &Output,
Daniel Dunbard067f7f2009-04-08 23:54:23 +00006162 const InputInfoList &Inputs,
6163 const ArgList &Args,
Daniel Dunbare3e263f2009-05-02 20:14:53 +00006164 const char *LinkingOutput) const {
Roman Divackyafe2f232012-08-28 15:09:03 +00006165 const toolchains::FreeBSD& ToolChain =
6166 static_cast<const toolchains::FreeBSD&>(getToolChain());
6167 const Driver &D = ToolChain.getDriver();
Alexey Samsonove65ceb92014-02-25 13:26:03 +00006168 const bool IsPIE =
6169 !Args.hasArg(options::OPT_shared) &&
6170 (Args.hasArg(options::OPT_pie) || ToolChain.isPIEDefault());
Daniel Dunbard854c8d2009-04-01 19:36:32 +00006171 ArgStringList CmdArgs;
David Chisnall5f99f482012-07-29 15:24:44 +00006172
6173 // Silence warning for "clang -g foo.o -o foo"
6174 Args.ClaimAllArgs(options::OPT_g_Group);
6175 // and "clang -emit-llvm foo.o -o foo"
6176 Args.ClaimAllArgs(options::OPT_emit_llvm);
6177 // and for "clang -w foo.o -o foo". Other warning options are already
6178 // handled somewhere else.
6179 Args.ClaimAllArgs(options::OPT_w);
Daniel Dunbard854c8d2009-04-01 19:36:32 +00006180
Joerg Sonnenberger6165ab12011-03-21 13:51:29 +00006181 if (!D.SysRoot.empty())
6182 CmdArgs.push_back(Args.MakeArgString("--sysroot=" + D.SysRoot));
6183
Alexey Samsonove65ceb92014-02-25 13:26:03 +00006184 if (IsPIE)
Roman Divackyafe2f232012-08-28 15:09:03 +00006185 CmdArgs.push_back("-pie");
6186
Daniel Dunbard854c8d2009-04-01 19:36:32 +00006187 if (Args.hasArg(options::OPT_static)) {
6188 CmdArgs.push_back("-Bstatic");
6189 } else {
Rafael Espindola7ba97af2010-11-11 02:17:51 +00006190 if (Args.hasArg(options::OPT_rdynamic))
6191 CmdArgs.push_back("-export-dynamic");
Daniel Dunbard854c8d2009-04-01 19:36:32 +00006192 CmdArgs.push_back("--eh-frame-hdr");
6193 if (Args.hasArg(options::OPT_shared)) {
6194 CmdArgs.push_back("-Bshareable");
6195 } else {
6196 CmdArgs.push_back("-dynamic-linker");
6197 CmdArgs.push_back("/libexec/ld-elf.so.1");
6198 }
Roman Divackyafe2f232012-08-28 15:09:03 +00006199 if (ToolChain.getTriple().getOSMajorVersion() >= 9) {
6200 llvm::Triple::ArchType Arch = ToolChain.getArch();
David Chisnall5f99f482012-07-29 15:24:44 +00006201 if (Arch == llvm::Triple::arm || Arch == llvm::Triple::sparc ||
6202 Arch == llvm::Triple::x86 || Arch == llvm::Triple::x86_64) {
6203 CmdArgs.push_back("--hash-style=both");
6204 }
6205 }
6206 CmdArgs.push_back("--enable-new-dtags");
Daniel Dunbard854c8d2009-04-01 19:36:32 +00006207 }
6208
6209 // When building 32-bit code on FreeBSD/amd64, we have to explicitly
6210 // instruct ld in the base system to link 32-bit code.
Rafael Espindola35ca7d92012-10-07 04:44:33 +00006211 if (ToolChain.getArch() == llvm::Triple::x86) {
Daniel Dunbard854c8d2009-04-01 19:36:32 +00006212 CmdArgs.push_back("-m");
6213 CmdArgs.push_back("elf_i386_fbsd");
6214 }
6215
Rafael Espindola35ca7d92012-10-07 04:44:33 +00006216 if (ToolChain.getArch() == llvm::Triple::ppc) {
Roman Divacky5e300b82011-06-04 07:40:24 +00006217 CmdArgs.push_back("-m");
Roman Divackyd150ad32011-11-21 16:50:32 +00006218 CmdArgs.push_back("elf32ppc_fbsd");
Roman Divacky5e300b82011-06-04 07:40:24 +00006219 }
6220
Daniel Dunbarb440f562010-08-02 02:38:21 +00006221 if (Output.isFilename()) {
Daniel Dunbard854c8d2009-04-01 19:36:32 +00006222 CmdArgs.push_back("-o");
6223 CmdArgs.push_back(Output.getFilename());
6224 } else {
6225 assert(Output.isNothing() && "Invalid output.");
6226 }
6227
6228 if (!Args.hasArg(options::OPT_nostdlib) &&
6229 !Args.hasArg(options::OPT_nostartfiles)) {
Roman Divackyafe2f232012-08-28 15:09:03 +00006230 const char *crt1 = NULL;
Daniel Dunbard854c8d2009-04-01 19:36:32 +00006231 if (!Args.hasArg(options::OPT_shared)) {
Roman Divacky66f22762011-02-10 16:59:40 +00006232 if (Args.hasArg(options::OPT_pg))
Roman Divackyafe2f232012-08-28 15:09:03 +00006233 crt1 = "gcrt1.o";
Alexey Samsonove65ceb92014-02-25 13:26:03 +00006234 else if (IsPIE)
Roman Divackyafe2f232012-08-28 15:09:03 +00006235 crt1 = "Scrt1.o";
6236 else
6237 crt1 = "crt1.o";
Daniel Dunbard854c8d2009-04-01 19:36:32 +00006238 }
Roman Divackyafe2f232012-08-28 15:09:03 +00006239 if (crt1)
6240 CmdArgs.push_back(Args.MakeArgString(ToolChain.GetFilePath(crt1)));
6241
6242 CmdArgs.push_back(Args.MakeArgString(ToolChain.GetFilePath("crti.o")));
6243
6244 const char *crtbegin = NULL;
6245 if (Args.hasArg(options::OPT_static))
6246 crtbegin = "crtbeginT.o";
Alexey Samsonove65ceb92014-02-25 13:26:03 +00006247 else if (Args.hasArg(options::OPT_shared) || IsPIE)
Roman Divackyafe2f232012-08-28 15:09:03 +00006248 crtbegin = "crtbeginS.o";
6249 else
6250 crtbegin = "crtbegin.o";
6251
6252 CmdArgs.push_back(Args.MakeArgString(ToolChain.GetFilePath(crtbegin)));
Daniel Dunbard854c8d2009-04-01 19:36:32 +00006253 }
6254
6255 Args.AddAllArgs(CmdArgs, options::OPT_L);
Roman Divackyafe2f232012-08-28 15:09:03 +00006256 const ToolChain::path_list Paths = ToolChain.getFilePaths();
Roman Divackyee8188a2011-03-01 17:53:14 +00006257 for (ToolChain::path_list::const_iterator i = Paths.begin(), e = Paths.end();
6258 i != e; ++i)
Chris Lattner0e62c1c2011-07-23 10:55:15 +00006259 CmdArgs.push_back(Args.MakeArgString(StringRef("-L") + *i));
Daniel Dunbard854c8d2009-04-01 19:36:32 +00006260 Args.AddAllArgs(CmdArgs, options::OPT_T_Group);
6261 Args.AddAllArgs(CmdArgs, options::OPT_e);
David Chisnall589a4942010-08-15 22:58:12 +00006262 Args.AddAllArgs(CmdArgs, options::OPT_s);
6263 Args.AddAllArgs(CmdArgs, options::OPT_t);
6264 Args.AddAllArgs(CmdArgs, options::OPT_Z_Flag);
6265 Args.AddAllArgs(CmdArgs, options::OPT_r);
Daniel Dunbard854c8d2009-04-01 19:36:32 +00006266
Alp Tokerce365ca2013-12-02 12:43:03 +00006267 if (D.IsUsingLTO(Args))
6268 AddGoldPlugin(ToolChain, Args, CmdArgs);
Roman Divackyf0d7f942013-11-10 09:31:43 +00006269
Roman Divackyafe2f232012-08-28 15:09:03 +00006270 AddLinkerInputs(ToolChain, Inputs, Args, CmdArgs);
Daniel Dunbard854c8d2009-04-01 19:36:32 +00006271
6272 if (!Args.hasArg(options::OPT_nostdlib) &&
6273 !Args.hasArg(options::OPT_nodefaultlibs)) {
Hans Wennborg70850d82013-07-18 20:29:38 +00006274 if (D.CCCIsCXX()) {
Roman Divackyafe2f232012-08-28 15:09:03 +00006275 ToolChain.AddCXXStdlibLibArgs(Args, CmdArgs);
Roman Divacky66f22762011-02-10 16:59:40 +00006276 if (Args.hasArg(options::OPT_pg))
6277 CmdArgs.push_back("-lm_p");
6278 else
6279 CmdArgs.push_back("-lm");
Daniel Dunbar4b8ef282010-02-17 08:07:51 +00006280 }
Daniel Dunbard854c8d2009-04-01 19:36:32 +00006281 // FIXME: For some reason GCC passes -lgcc and -lgcc_s before adding
6282 // the default system libraries. Just mimic this for now.
Roman Divacky66f22762011-02-10 16:59:40 +00006283 if (Args.hasArg(options::OPT_pg))
6284 CmdArgs.push_back("-lgcc_p");
6285 else
6286 CmdArgs.push_back("-lgcc");
Daniel Dunbard854c8d2009-04-01 19:36:32 +00006287 if (Args.hasArg(options::OPT_static)) {
6288 CmdArgs.push_back("-lgcc_eh");
Roman Divacky66f22762011-02-10 16:59:40 +00006289 } else if (Args.hasArg(options::OPT_pg)) {
6290 CmdArgs.push_back("-lgcc_eh_p");
Daniel Dunbard854c8d2009-04-01 19:36:32 +00006291 } else {
6292 CmdArgs.push_back("--as-needed");
6293 CmdArgs.push_back("-lgcc_s");
6294 CmdArgs.push_back("--no-as-needed");
6295 }
6296
Matt Beaumont-Gay1fe49152011-02-10 20:35:01 +00006297 if (Args.hasArg(options::OPT_pthread)) {
Roman Divacky66f22762011-02-10 16:59:40 +00006298 if (Args.hasArg(options::OPT_pg))
6299 CmdArgs.push_back("-lpthread_p");
6300 else
6301 CmdArgs.push_back("-lpthread");
Matt Beaumont-Gay1fe49152011-02-10 20:35:01 +00006302 }
Daniel Dunbard854c8d2009-04-01 19:36:32 +00006303
Roman Divacky66f22762011-02-10 16:59:40 +00006304 if (Args.hasArg(options::OPT_pg)) {
6305 if (Args.hasArg(options::OPT_shared))
6306 CmdArgs.push_back("-lc");
6307 else
6308 CmdArgs.push_back("-lc_p");
6309 CmdArgs.push_back("-lgcc_p");
6310 } else {
6311 CmdArgs.push_back("-lc");
6312 CmdArgs.push_back("-lgcc");
6313 }
6314
Daniel Dunbard854c8d2009-04-01 19:36:32 +00006315 if (Args.hasArg(options::OPT_static)) {
6316 CmdArgs.push_back("-lgcc_eh");
Roman Divacky66f22762011-02-10 16:59:40 +00006317 } else if (Args.hasArg(options::OPT_pg)) {
6318 CmdArgs.push_back("-lgcc_eh_p");
Daniel Dunbard854c8d2009-04-01 19:36:32 +00006319 } else {
6320 CmdArgs.push_back("--as-needed");
6321 CmdArgs.push_back("-lgcc_s");
6322 CmdArgs.push_back("--no-as-needed");
6323 }
6324 }
6325
6326 if (!Args.hasArg(options::OPT_nostdlib) &&
6327 !Args.hasArg(options::OPT_nostartfiles)) {
Alexey Samsonove65ceb92014-02-25 13:26:03 +00006328 if (Args.hasArg(options::OPT_shared) || IsPIE)
Roman Divackyafe2f232012-08-28 15:09:03 +00006329 CmdArgs.push_back(Args.MakeArgString(ToolChain.GetFilePath("crtendS.o")));
Roman Divackya3c50242012-09-07 13:36:21 +00006330 else
6331 CmdArgs.push_back(Args.MakeArgString(ToolChain.GetFilePath("crtend.o")));
Roman Divackyafe2f232012-08-28 15:09:03 +00006332 CmdArgs.push_back(Args.MakeArgString(ToolChain.GetFilePath("crtn.o")));
Daniel Dunbard854c8d2009-04-01 19:36:32 +00006333 }
6334
Viktor Kutuzovaa5b5f72014-03-18 09:36:50 +00006335 addSanitizerRuntimes(getToolChain(), Args, CmdArgs);
6336
Alexey Samsonov7811d192014-02-20 13:57:37 +00006337 addProfileRT(ToolChain, Args, CmdArgs);
Nick Lewycky82fe5f42011-05-24 21:54:59 +00006338
Daniel Dunbard067f7f2009-04-08 23:54:23 +00006339 const char *Exec =
Rafael Espindola236db462013-11-09 20:07:19 +00006340 Args.MakeArgString(ToolChain.GetProgramPath("ld"));
Daniel Dunbar7fbaf532010-08-02 02:38:28 +00006341 C.addCommand(new Command(JA, *this, Exec, CmdArgs));
Daniel Dunbard854c8d2009-04-01 19:36:32 +00006342}
Daniel Dunbarcc912342009-05-02 18:28:39 +00006343
Benjamin Kramer24f1d3e2011-02-02 18:59:27 +00006344void netbsd::Assemble::ConstructJob(Compilation &C, const JobAction &JA,
6345 const InputInfo &Output,
6346 const InputInfoList &Inputs,
6347 const ArgList &Args,
6348 const char *LinkingOutput) const {
6349 ArgStringList CmdArgs;
6350
Joerg Sonnenberger25e18172014-02-19 22:16:19 +00006351 // GNU as needs different flags for creating the correct output format
6352 // on architectures with different ABIs or optional feature sets.
6353 switch (getToolChain().getArch()) {
6354 case llvm::Triple::x86:
Benjamin Kramer24f1d3e2011-02-02 18:59:27 +00006355 CmdArgs.push_back("--32");
Joerg Sonnenberger25e18172014-02-19 22:16:19 +00006356 break;
6357 case llvm::Triple::arm:
Christian Pirkerf01cd6f2014-03-28 14:40:46 +00006358 case llvm::Triple::armeb:
6359 case llvm::Triple::thumb:
6360 case llvm::Triple::thumbeb: {
Bernard Ogden31561762013-12-12 13:27:11 +00006361 std::string MArch(arm::getARMTargetCPU(Args, getToolChain().getTriple()));
Joerg Sonnenberger1f94da52013-12-05 21:07:29 +00006362 CmdArgs.push_back(Args.MakeArgString("-mcpu=" + MArch));
Joerg Sonnenberger25e18172014-02-19 22:16:19 +00006363 break;
Joerg Sonnenberger1f94da52013-12-05 21:07:29 +00006364 }
6365
Joerg Sonnenberger25e18172014-02-19 22:16:19 +00006366 case llvm::Triple::mips:
6367 case llvm::Triple::mipsel:
6368 case llvm::Triple::mips64:
6369 case llvm::Triple::mips64el: {
Joerg Sonnenberger21baded2013-12-08 13:54:58 +00006370 StringRef CPUName;
6371 StringRef ABIName;
6372 getMipsCPUAndABI(Args, getToolChain().getTriple(), CPUName, ABIName);
6373
6374 CmdArgs.push_back("-march");
6375 CmdArgs.push_back(CPUName.data());
6376
6377 CmdArgs.push_back("-mabi");
6378 CmdArgs.push_back(getGnuCompatibleMipsABIName(ABIName).data());
6379
6380 if (getToolChain().getArch() == llvm::Triple::mips ||
6381 getToolChain().getArch() == llvm::Triple::mips64)
6382 CmdArgs.push_back("-EB");
6383 else
6384 CmdArgs.push_back("-EL");
6385
Joerg Sonnenbergerc151b022014-02-19 21:58:52 +00006386 addAssemblerKPIC(Args, CmdArgs);
Joerg Sonnenberger25e18172014-02-19 22:16:19 +00006387 break;
6388 }
Joerg Sonnenbergered3f0692014-02-19 22:40:18 +00006389
6390 case llvm::Triple::sparc:
6391 CmdArgs.push_back("-32");
6392 addAssemblerKPIC(Args, CmdArgs);
6393 break;
6394
6395 case llvm::Triple::sparcv9:
6396 CmdArgs.push_back("-64");
6397 CmdArgs.push_back("-Av9");
6398 addAssemblerKPIC(Args, CmdArgs);
6399 break;
6400
Joerg Sonnenberger25e18172014-02-19 22:16:19 +00006401 default:
6402 break;
Joerg Sonnenberger21baded2013-12-08 13:54:58 +00006403 }
Benjamin Kramer24f1d3e2011-02-02 18:59:27 +00006404
6405 Args.AddAllArgValues(CmdArgs, options::OPT_Wa_COMMA,
6406 options::OPT_Xassembler);
6407
6408 CmdArgs.push_back("-o");
6409 CmdArgs.push_back(Output.getFilename());
6410
6411 for (InputInfoList::const_iterator
6412 it = Inputs.begin(), ie = Inputs.end(); it != ie; ++it) {
6413 const InputInfo &II = *it;
6414 CmdArgs.push_back(II.getFilename());
6415 }
6416
David Chisnallddbd68f2011-09-27 22:03:18 +00006417 const char *Exec = Args.MakeArgString((getToolChain().GetProgramPath("as")));
Benjamin Kramer24f1d3e2011-02-02 18:59:27 +00006418 C.addCommand(new Command(JA, *this, Exec, CmdArgs));
6419}
6420
6421void netbsd::Link::ConstructJob(Compilation &C, const JobAction &JA,
6422 const InputInfo &Output,
6423 const InputInfoList &Inputs,
6424 const ArgList &Args,
6425 const char *LinkingOutput) const {
6426 const Driver &D = getToolChain().getDriver();
6427 ArgStringList CmdArgs;
6428
Joerg Sonnenberger6165ab12011-03-21 13:51:29 +00006429 if (!D.SysRoot.empty())
6430 CmdArgs.push_back(Args.MakeArgString("--sysroot=" + D.SysRoot));
6431
Joerg Sonnenberger52be0b42014-03-13 00:42:01 +00006432 CmdArgs.push_back("--eh-frame-hdr");
Benjamin Kramer24f1d3e2011-02-02 18:59:27 +00006433 if (Args.hasArg(options::OPT_static)) {
6434 CmdArgs.push_back("-Bstatic");
6435 } else {
6436 if (Args.hasArg(options::OPT_rdynamic))
6437 CmdArgs.push_back("-export-dynamic");
Benjamin Kramer24f1d3e2011-02-02 18:59:27 +00006438 if (Args.hasArg(options::OPT_shared)) {
6439 CmdArgs.push_back("-Bshareable");
6440 } else {
6441 CmdArgs.push_back("-dynamic-linker");
6442 CmdArgs.push_back("/libexec/ld.elf_so");
6443 }
6444 }
6445
Joerg Sonnenberger6cd7deb2014-02-02 22:50:34 +00006446 // Many NetBSD architectures support more than one ABI.
6447 // Determine the correct emulation for ld.
6448 switch (getToolChain().getArch()) {
6449 case llvm::Triple::x86:
Benjamin Kramer24f1d3e2011-02-02 18:59:27 +00006450 CmdArgs.push_back("-m");
6451 CmdArgs.push_back("elf_i386");
Joerg Sonnenberger6cd7deb2014-02-02 22:50:34 +00006452 break;
6453 case llvm::Triple::arm:
Christian Pirkerf01cd6f2014-03-28 14:40:46 +00006454 case llvm::Triple::armeb:
Joerg Sonnenberger6cd7deb2014-02-02 22:50:34 +00006455 case llvm::Triple::thumb:
Christian Pirkerf01cd6f2014-03-28 14:40:46 +00006456 case llvm::Triple::thumbeb:
Joerg Sonnenberger25de31d2014-02-02 22:47:37 +00006457 CmdArgs.push_back("-m");
6458 switch (getToolChain().getTriple().getEnvironment()) {
6459 case llvm::Triple::EABI:
Joerg Sonnenberger25de31d2014-02-02 22:47:37 +00006460 case llvm::Triple::GNUEABI:
Joerg Sonnenberger25de31d2014-02-02 22:47:37 +00006461 CmdArgs.push_back("armelf_nbsd_eabi");
6462 break;
Joerg Sonnenberger83a33c02014-02-06 21:04:32 +00006463 case llvm::Triple::EABIHF:
6464 case llvm::Triple::GNUEABIHF:
6465 CmdArgs.push_back("armelf_nbsd_eabihf");
6466 break;
Joerg Sonnenberger25de31d2014-02-02 22:47:37 +00006467 default:
6468 CmdArgs.push_back("armelf_nbsd");
6469 break;
6470 }
Joerg Sonnenberger6cd7deb2014-02-02 22:50:34 +00006471 break;
Joerg Sonnenbergere7f97592014-02-02 22:59:16 +00006472 case llvm::Triple::mips64:
6473 case llvm::Triple::mips64el:
Jonathan Roelofs2cea1be2014-02-12 03:21:20 +00006474 if (mips::hasMipsAbiArg(Args, "32")) {
Joerg Sonnenbergere7f97592014-02-02 22:59:16 +00006475 CmdArgs.push_back("-m");
6476 if (getToolChain().getArch() == llvm::Triple::mips64)
6477 CmdArgs.push_back("elf32btsmip");
6478 else
6479 CmdArgs.push_back("elf32ltsmip");
Jonathan Roelofs2cea1be2014-02-12 03:21:20 +00006480 } else if (mips::hasMipsAbiArg(Args, "64")) {
Joerg Sonnenbergere7f97592014-02-02 22:59:16 +00006481 CmdArgs.push_back("-m");
6482 if (getToolChain().getArch() == llvm::Triple::mips64)
6483 CmdArgs.push_back("elf64btsmip");
6484 else
6485 CmdArgs.push_back("elf64ltsmip");
6486 }
6487 break;
Joerg Sonnenbergered3f0692014-02-19 22:40:18 +00006488
6489 case llvm::Triple::sparc:
6490 CmdArgs.push_back("-m");
6491 CmdArgs.push_back("elf32_sparc");
6492 break;
6493
6494 case llvm::Triple::sparcv9:
6495 CmdArgs.push_back("-m");
6496 CmdArgs.push_back("elf64_sparc");
6497 break;
6498
Joerg Sonnenberger6cd7deb2014-02-02 22:50:34 +00006499 default:
6500 break;
Joerg Sonnenberger25de31d2014-02-02 22:47:37 +00006501 }
6502
Benjamin Kramer24f1d3e2011-02-02 18:59:27 +00006503 if (Output.isFilename()) {
6504 CmdArgs.push_back("-o");
6505 CmdArgs.push_back(Output.getFilename());
6506 } else {
6507 assert(Output.isNothing() && "Invalid output.");
6508 }
6509
6510 if (!Args.hasArg(options::OPT_nostdlib) &&
6511 !Args.hasArg(options::OPT_nostartfiles)) {
6512 if (!Args.hasArg(options::OPT_shared)) {
6513 CmdArgs.push_back(Args.MakeArgString(
6514 getToolChain().GetFilePath("crt0.o")));
6515 CmdArgs.push_back(Args.MakeArgString(
6516 getToolChain().GetFilePath("crti.o")));
6517 CmdArgs.push_back(Args.MakeArgString(
6518 getToolChain().GetFilePath("crtbegin.o")));
6519 } else {
6520 CmdArgs.push_back(Args.MakeArgString(
6521 getToolChain().GetFilePath("crti.o")));
6522 CmdArgs.push_back(Args.MakeArgString(
6523 getToolChain().GetFilePath("crtbeginS.o")));
6524 }
6525 }
6526
6527 Args.AddAllArgs(CmdArgs, options::OPT_L);
6528 Args.AddAllArgs(CmdArgs, options::OPT_T_Group);
6529 Args.AddAllArgs(CmdArgs, options::OPT_e);
6530 Args.AddAllArgs(CmdArgs, options::OPT_s);
6531 Args.AddAllArgs(CmdArgs, options::OPT_t);
6532 Args.AddAllArgs(CmdArgs, options::OPT_Z_Flag);
6533 Args.AddAllArgs(CmdArgs, options::OPT_r);
6534
6535 AddLinkerInputs(getToolChain(), Inputs, Args, CmdArgs);
6536
Joerg Sonnenbergera4435632013-10-14 20:13:05 +00006537 unsigned Major, Minor, Micro;
6538 getToolChain().getTriple().getOSVersion(Major, Minor, Micro);
6539 bool useLibgcc = true;
6540 if (Major >= 7 || (Major == 6 && Minor == 99 && Micro >= 23) || Major == 0) {
Joerg Sonnenbergerd769a1e2014-01-18 00:50:49 +00006541 switch(getToolChain().getArch()) {
6542 case llvm::Triple::x86:
6543 case llvm::Triple::x86_64:
Joerg Sonnenbergera4435632013-10-14 20:13:05 +00006544 useLibgcc = false;
Joerg Sonnenbergerd769a1e2014-01-18 00:50:49 +00006545 break;
6546 default:
6547 break;
6548 }
Joerg Sonnenbergera4435632013-10-14 20:13:05 +00006549 }
6550
Benjamin Kramer24f1d3e2011-02-02 18:59:27 +00006551 if (!Args.hasArg(options::OPT_nostdlib) &&
6552 !Args.hasArg(options::OPT_nodefaultlibs)) {
Hans Wennborg70850d82013-07-18 20:29:38 +00006553 if (D.CCCIsCXX()) {
Benjamin Kramer24f1d3e2011-02-02 18:59:27 +00006554 getToolChain().AddCXXStdlibLibArgs(Args, CmdArgs);
6555 CmdArgs.push_back("-lm");
6556 }
Benjamin Kramer24f1d3e2011-02-02 18:59:27 +00006557 if (Args.hasArg(options::OPT_pthread))
6558 CmdArgs.push_back("-lpthread");
6559 CmdArgs.push_back("-lc");
6560
Joerg Sonnenbergera4435632013-10-14 20:13:05 +00006561 if (useLibgcc) {
6562 if (Args.hasArg(options::OPT_static)) {
6563 // libgcc_eh depends on libc, so resolve as much as possible,
6564 // pull in any new requirements from libc and then get the rest
6565 // of libgcc.
6566 CmdArgs.push_back("-lgcc_eh");
6567 CmdArgs.push_back("-lc");
6568 CmdArgs.push_back("-lgcc");
6569 } else {
6570 CmdArgs.push_back("-lgcc");
6571 CmdArgs.push_back("--as-needed");
6572 CmdArgs.push_back("-lgcc_s");
6573 CmdArgs.push_back("--no-as-needed");
6574 }
Benjamin Kramer24f1d3e2011-02-02 18:59:27 +00006575 }
6576 }
6577
6578 if (!Args.hasArg(options::OPT_nostdlib) &&
6579 !Args.hasArg(options::OPT_nostartfiles)) {
6580 if (!Args.hasArg(options::OPT_shared))
6581 CmdArgs.push_back(Args.MakeArgString(getToolChain().GetFilePath(
6582 "crtend.o")));
6583 else
6584 CmdArgs.push_back(Args.MakeArgString(getToolChain().GetFilePath(
6585 "crtendS.o")));
6586 CmdArgs.push_back(Args.MakeArgString(getToolChain().GetFilePath(
6587 "crtn.o")));
6588 }
6589
Alexey Samsonov7811d192014-02-20 13:57:37 +00006590 addProfileRT(getToolChain(), Args, CmdArgs);
Nick Lewycky82fe5f42011-05-24 21:54:59 +00006591
Rafael Espindola236db462013-11-09 20:07:19 +00006592 const char *Exec = Args.MakeArgString(getToolChain().GetProgramPath("ld"));
Benjamin Kramer24f1d3e2011-02-02 18:59:27 +00006593 C.addCommand(new Command(JA, *this, Exec, CmdArgs));
6594}
6595
Thomas Schwinge4e555262013-03-28 19:04:25 +00006596void gnutools::Assemble::ConstructJob(Compilation &C, const JobAction &JA,
6597 const InputInfo &Output,
6598 const InputInfoList &Inputs,
6599 const ArgList &Args,
6600 const char *LinkingOutput) const {
Rafael Espindola92b00932010-08-10 00:25:48 +00006601 ArgStringList CmdArgs;
Jakob Stoklund Olesen8d7f5062014-01-12 04:53:36 +00006602 bool NeedsKPIC = false;
Rafael Espindola92b00932010-08-10 00:25:48 +00006603
6604 // Add --32/--64 to make sure we get the format we want.
6605 // This is incomplete
6606 if (getToolChain().getArch() == llvm::Triple::x86) {
6607 CmdArgs.push_back("--32");
6608 } else if (getToolChain().getArch() == llvm::Triple::x86_64) {
6609 CmdArgs.push_back("--64");
Eli Friedman4a4932c2011-11-28 23:46:52 +00006610 } else if (getToolChain().getArch() == llvm::Triple::ppc) {
6611 CmdArgs.push_back("-a32");
6612 CmdArgs.push_back("-mppc");
6613 CmdArgs.push_back("-many");
6614 } else if (getToolChain().getArch() == llvm::Triple::ppc64) {
6615 CmdArgs.push_back("-a64");
6616 CmdArgs.push_back("-mppc64");
6617 CmdArgs.push_back("-many");
Bill Schmidt778d3872013-07-26 01:36:11 +00006618 } else if (getToolChain().getArch() == llvm::Triple::ppc64le) {
6619 CmdArgs.push_back("-a64");
Will Schmidtc1fc1902014-03-24 17:10:37 +00006620 CmdArgs.push_back("-mppc64");
Bill Schmidt778d3872013-07-26 01:36:11 +00006621 CmdArgs.push_back("-many");
Will Schmidtc1fc1902014-03-24 17:10:37 +00006622 CmdArgs.push_back("-mlittle-endian");
Jakob Stoklund Olesen2490e552014-01-10 03:51:29 +00006623 } else if (getToolChain().getArch() == llvm::Triple::sparc) {
6624 CmdArgs.push_back("-32");
Jakob Stoklund Olesen58801bf2014-01-11 18:25:01 +00006625 CmdArgs.push_back("-Av8plusa");
Jakob Stoklund Olesen8d7f5062014-01-12 04:53:36 +00006626 NeedsKPIC = true;
Jakob Stoklund Olesen2490e552014-01-10 03:51:29 +00006627 } else if (getToolChain().getArch() == llvm::Triple::sparcv9) {
6628 CmdArgs.push_back("-64");
Jakob Stoklund Olesen58801bf2014-01-11 18:25:01 +00006629 CmdArgs.push_back("-Av9a");
Jakob Stoklund Olesen8d7f5062014-01-12 04:53:36 +00006630 NeedsKPIC = true;
Christian Pirkerf01cd6f2014-03-28 14:40:46 +00006631 } else if (getToolChain().getArch() == llvm::Triple::arm ||
6632 getToolChain().getArch() == llvm::Triple::armeb) {
Chris Lattner0e62c1c2011-07-23 10:55:15 +00006633 StringRef MArch = getToolChain().getArchName();
Rafael Espindola92b00932010-08-10 00:25:48 +00006634 if (MArch == "armv7" || MArch == "armv7a" || MArch == "armv7-a")
6635 CmdArgs.push_back("-mfpu=neon");
Christian Pirkerf01cd6f2014-03-28 14:40:46 +00006636 if (MArch == "armv8" || MArch == "armv8a" || MArch == "armv8-a" ||
6637 MArch == "armebv8" || MArch == "armebv8a" || MArch == "armebv8-a")
Bernard Ogdena58ef052013-10-24 18:32:41 +00006638 CmdArgs.push_back("-mfpu=crypto-neon-fp-armv8");
Evgeniy Stepanoved943f62012-04-20 09:03:40 +00006639
Tim Northover9c7e0352013-12-12 11:55:52 +00006640 StringRef ARMFloatABI = tools::arm::getARMFloatABI(
6641 getToolChain().getDriver(), Args, getToolChain().getTriple());
Evgeniy Stepanoved943f62012-04-20 09:03:40 +00006642 CmdArgs.push_back(Args.MakeArgString("-mfloat-abi=" + ARMFloatABI));
Evgeniy Stepanov582911a2012-04-24 09:05:31 +00006643
6644 Args.AddLastArg(CmdArgs, options::OPT_march_EQ);
Ana Pazosdd6068d2013-12-06 22:43:17 +00006645
6646 // FIXME: remove krait check when GNU tools support krait cpu
6647 // for now replace it with -march=armv7-a to avoid a lower
6648 // march from being picked in the absence of a cpu flag.
6649 Arg *A;
6650 if ((A = Args.getLastArg(options::OPT_mcpu_EQ)) &&
6651 StringRef(A->getValue()) == "krait")
6652 CmdArgs.push_back("-march=armv7-a");
6653 else
6654 Args.AddLastArg(CmdArgs, options::OPT_mcpu_EQ);
Evgeniy Stepanov582911a2012-04-24 09:05:31 +00006655 Args.AddLastArg(CmdArgs, options::OPT_mfpu_EQ);
Akira Hatanaka5e9dde32011-11-30 19:31:38 +00006656 } else if (getToolChain().getArch() == llvm::Triple::mips ||
6657 getToolChain().getArch() == llvm::Triple::mipsel ||
6658 getToolChain().getArch() == llvm::Triple::mips64 ||
6659 getToolChain().getArch() == llvm::Triple::mips64el) {
Simon Atanasyan571d7bd2012-04-07 22:31:29 +00006660 StringRef CPUName;
6661 StringRef ABIName;
Rafael Espindola22ce34a2013-08-20 22:12:08 +00006662 getMipsCPUAndABI(Args, getToolChain().getTriple(), CPUName, ABIName);
Akira Hatanaka5e9dde32011-11-30 19:31:38 +00006663
Simon Atanasyan571d7bd2012-04-07 22:31:29 +00006664 CmdArgs.push_back("-march");
6665 CmdArgs.push_back(CPUName.data());
6666
Simon Atanasyan571d7bd2012-04-07 22:31:29 +00006667 CmdArgs.push_back("-mabi");
Simon Atanasyan0da400c2013-02-27 14:55:49 +00006668 CmdArgs.push_back(getGnuCompatibleMipsABIName(ABIName).data());
Simon Atanasyan2390aa12012-04-06 19:15:24 +00006669
6670 if (getToolChain().getArch() == llvm::Triple::mips ||
6671 getToolChain().getArch() == llvm::Triple::mips64)
6672 CmdArgs.push_back("-EB");
6673 else
6674 CmdArgs.push_back("-EL");
Simon Atanasyan217dc2d2012-05-29 19:07:33 +00006675
Simon Atanasyan22127ce2013-09-24 09:09:16 +00006676 if (Arg *A = Args.getLastArg(options::OPT_mnan_EQ)) {
6677 if (StringRef(A->getValue()) == "2008")
6678 CmdArgs.push_back(Args.MakeArgString("-mnan=2008"));
6679 }
6680
Simon Atanasyan8cc7c122013-11-26 11:57:58 +00006681 Args.AddLastArg(CmdArgs, options::OPT_mfp32, options::OPT_mfp64);
Simon Atanasyan036d16d2013-04-30 07:47:13 +00006682 Args.AddLastArg(CmdArgs, options::OPT_mips16, options::OPT_mno_mips16);
6683 Args.AddLastArg(CmdArgs, options::OPT_mmicromips,
6684 options::OPT_mno_micromips);
6685 Args.AddLastArg(CmdArgs, options::OPT_mdsp, options::OPT_mno_dsp);
6686 Args.AddLastArg(CmdArgs, options::OPT_mdspr2, options::OPT_mno_dspr2);
6687
Simon Atanasyanbd986632013-11-26 11:58:04 +00006688 if (Arg *A = Args.getLastArg(options::OPT_mmsa, options::OPT_mno_msa)) {
6689 // Do not use AddLastArg because not all versions of MIPS assembler
6690 // support -mmsa / -mno-msa options.
6691 if (A->getOption().matches(options::OPT_mmsa))
6692 CmdArgs.push_back(Args.MakeArgString("-mmsa"));
6693 }
6694
Jakob Stoklund Olesen8d7f5062014-01-12 04:53:36 +00006695 NeedsKPIC = true;
6696 } else if (getToolChain().getArch() == llvm::Triple::systemz) {
6697 // Always pass an -march option, since our default of z10 is later
6698 // than the GNU assembler's default.
6699 StringRef CPUName = getSystemZTargetCPU(Args);
6700 CmdArgs.push_back(Args.MakeArgString("-march=" + CPUName));
6701 }
6702
Joerg Sonnenbergerc151b022014-02-19 21:58:52 +00006703 if (NeedsKPIC)
6704 addAssemblerKPIC(Args, CmdArgs);
Rafael Espindola92b00932010-08-10 00:25:48 +00006705
6706 Args.AddAllArgValues(CmdArgs, options::OPT_Wa_COMMA,
6707 options::OPT_Xassembler);
6708
6709 CmdArgs.push_back("-o");
6710 CmdArgs.push_back(Output.getFilename());
6711
6712 for (InputInfoList::const_iterator
6713 it = Inputs.begin(), ie = Inputs.end(); it != ie; ++it) {
6714 const InputInfo &II = *it;
6715 CmdArgs.push_back(II.getFilename());
6716 }
6717
6718 const char *Exec =
6719 Args.MakeArgString(getToolChain().GetProgramPath("as"));
6720 C.addCommand(new Command(JA, *this, Exec, CmdArgs));
Eric Christopher30aa6b62013-06-05 23:58:15 +00006721
6722 // Handle the debug info splitting at object creation time if we're
6723 // creating an object.
6724 // TODO: Currently only works on linux with newer objcopy.
6725 if (Args.hasArg(options::OPT_gsplit_dwarf) &&
Cameron Esfahani556d91e2013-09-14 01:09:11 +00006726 getToolChain().getTriple().isOSLinux())
Eric Christopher30aa6b62013-06-05 23:58:15 +00006727 SplitDebugInfo(getToolChain(), C, *this, JA, Args, Output,
6728 SplitDebugName(Args, Inputs));
Rafael Espindola92b00932010-08-10 00:25:48 +00006729}
6730
Benjamin Kramer9299637dc2014-03-04 19:31:42 +00006731static void AddLibgcc(const llvm::Triple &Triple, const Driver &D,
Evgeniy Stepanov77866712012-04-25 08:59:22 +00006732 ArgStringList &CmdArgs, const ArgList &Args) {
Logan Chienc6fd8202012-09-02 09:30:11 +00006733 bool isAndroid = Triple.getEnvironment() == llvm::Triple::Android;
Chandler Carruth58d6eb62013-03-04 02:07:55 +00006734 bool StaticLibgcc = Args.hasArg(options::OPT_static_libgcc) ||
6735 Args.hasArg(options::OPT_static);
Hans Wennborg70850d82013-07-18 20:29:38 +00006736 if (!D.CCCIsCXX())
Rafael Espindolacc354322011-10-17 21:39:04 +00006737 CmdArgs.push_back("-lgcc");
6738
Logan Chien3d3373c2012-11-19 12:04:11 +00006739 if (StaticLibgcc || isAndroid) {
Hans Wennborg70850d82013-07-18 20:29:38 +00006740 if (D.CCCIsCXX())
Rafael Espindolacc354322011-10-17 21:39:04 +00006741 CmdArgs.push_back("-lgcc");
6742 } else {
Hans Wennborg70850d82013-07-18 20:29:38 +00006743 if (!D.CCCIsCXX())
Rafael Espindolacc354322011-10-17 21:39:04 +00006744 CmdArgs.push_back("--as-needed");
6745 CmdArgs.push_back("-lgcc_s");
Hans Wennborg70850d82013-07-18 20:29:38 +00006746 if (!D.CCCIsCXX())
Rafael Espindolacc354322011-10-17 21:39:04 +00006747 CmdArgs.push_back("--no-as-needed");
6748 }
6749
Evgeniy Stepanov77866712012-04-25 08:59:22 +00006750 if (StaticLibgcc && !isAndroid)
Rafael Espindolacc354322011-10-17 21:39:04 +00006751 CmdArgs.push_back("-lgcc_eh");
Hans Wennborg70850d82013-07-18 20:29:38 +00006752 else if (!Args.hasArg(options::OPT_shared) && D.CCCIsCXX())
Rafael Espindolacc354322011-10-17 21:39:04 +00006753 CmdArgs.push_back("-lgcc");
Logan Chien3d3373c2012-11-19 12:04:11 +00006754
6755 // According to Android ABI, we have to link with libdl if we are
6756 // linking with non-static libgcc.
6757 //
6758 // NOTE: This fixes a link error on Android MIPS as well. The non-static
6759 // libgcc for MIPS relies on _Unwind_Find_FDE and dl_iterate_phdr from libdl.
6760 if (isAndroid && !StaticLibgcc)
6761 CmdArgs.push_back("-ldl");
Rafael Espindolacc354322011-10-17 21:39:04 +00006762}
6763
Peter Collingbourne9d9e1fc2013-05-27 21:40:20 +00006764static StringRef getLinuxDynamicLinker(const ArgList &Args,
6765 const toolchains::Linux &ToolChain) {
Alexey Bataevcf7ae302014-01-23 09:08:32 +00006766 if (ToolChain.getTriple().getEnvironment() == llvm::Triple::Android) {
6767 if (ToolChain.getTriple().isArch64Bit())
6768 return "/system/bin/linker64";
6769 else
6770 return "/system/bin/linker";
6771 } else if (ToolChain.getArch() == llvm::Triple::x86 ||
6772 ToolChain.getArch() == llvm::Triple::sparc)
Peter Collingbourne9d9e1fc2013-05-27 21:40:20 +00006773 return "/lib/ld-linux.so.2";
Tim Northovera2ee4332014-03-29 15:09:45 +00006774 else if (ToolChain.getArch() == llvm::Triple::aarch64 ||
6775 ToolChain.getArch() == llvm::Triple::arm64)
Peter Collingbourne9d9e1fc2013-05-27 21:40:20 +00006776 return "/lib/ld-linux-aarch64.so.1";
Christian Pirkera74c7912014-03-14 12:15:45 +00006777 else if (ToolChain.getArch() == llvm::Triple::aarch64_be)
6778 return "/lib/ld-linux-aarch64_be.so.1";
Peter Collingbourne9d9e1fc2013-05-27 21:40:20 +00006779 else if (ToolChain.getArch() == llvm::Triple::arm ||
6780 ToolChain.getArch() == llvm::Triple::thumb) {
6781 if (ToolChain.getTriple().getEnvironment() == llvm::Triple::GNUEABIHF)
6782 return "/lib/ld-linux-armhf.so.3";
6783 else
6784 return "/lib/ld-linux.so.3";
Christian Pirkerf01cd6f2014-03-28 14:40:46 +00006785 } else if (ToolChain.getArch() == llvm::Triple::armeb ||
6786 ToolChain.getArch() == llvm::Triple::thumbeb) {
6787 if (ToolChain.getTriple().getEnvironment() == llvm::Triple::GNUEABIHF)
6788 return "/lib/ld-linux-armhf.so.3"; /* TODO: check which dynamic linker name. */
6789 else
6790 return "/lib/ld-linux.so.3"; /* TODO: check which dynamic linker name. */
Peter Collingbourne9d9e1fc2013-05-27 21:40:20 +00006791 } else if (ToolChain.getArch() == llvm::Triple::mips ||
6792 ToolChain.getArch() == llvm::Triple::mipsel)
6793 return "/lib/ld.so.1";
6794 else if (ToolChain.getArch() == llvm::Triple::mips64 ||
6795 ToolChain.getArch() == llvm::Triple::mips64el) {
Jonathan Roelofs2cea1be2014-02-12 03:21:20 +00006796 if (mips::hasMipsAbiArg(Args, "n32"))
Peter Collingbourne9d9e1fc2013-05-27 21:40:20 +00006797 return "/lib32/ld.so.1";
6798 else
6799 return "/lib64/ld.so.1";
6800 } else if (ToolChain.getArch() == llvm::Triple::ppc)
6801 return "/lib/ld.so.1";
6802 else if (ToolChain.getArch() == llvm::Triple::ppc64 ||
Bill Schmidt778d3872013-07-26 01:36:11 +00006803 ToolChain.getArch() == llvm::Triple::ppc64le ||
Peter Collingbourne9d9e1fc2013-05-27 21:40:20 +00006804 ToolChain.getArch() == llvm::Triple::systemz)
6805 return "/lib64/ld64.so.1";
Jakob Stoklund Olesen73cb84c2014-01-10 08:18:34 +00006806 else if (ToolChain.getArch() == llvm::Triple::sparcv9)
6807 return "/lib64/ld-linux.so.2";
Peter Collingbourne9d9e1fc2013-05-27 21:40:20 +00006808 else
6809 return "/lib64/ld-linux-x86-64.so.2";
6810}
6811
Renato Golinc4b49242014-02-13 10:01:16 +00006812static void AddRunTimeLibs(const ToolChain &TC, const Driver &D,
6813 ArgStringList &CmdArgs, const ArgList &Args) {
6814 // Make use of compiler-rt if --rtlib option is used
6815 ToolChain::RuntimeLibType RLT = TC.GetRuntimeLibType(Args);
6816
6817 switch(RLT) {
6818 case ToolChain::RLT_CompilerRT:
6819 addClangRTLinux(TC, Args, CmdArgs);
6820 break;
6821 case ToolChain::RLT_Libgcc:
6822 AddLibgcc(TC.getTriple(), D, CmdArgs, Args);
6823 break;
Renato Golinc4b49242014-02-13 10:01:16 +00006824 }
6825}
6826
Thomas Schwinge4e555262013-03-28 19:04:25 +00006827void gnutools::Link::ConstructJob(Compilation &C, const JobAction &JA,
6828 const InputInfo &Output,
6829 const InputInfoList &Inputs,
6830 const ArgList &Args,
6831 const char *LinkingOutput) const {
Rafael Espindolac8f008f2010-11-07 20:14:31 +00006832 const toolchains::Linux& ToolChain =
6833 static_cast<const toolchains::Linux&>(getToolChain());
6834 const Driver &D = ToolChain.getDriver();
Rafael Espindola7df35012012-11-02 20:41:30 +00006835 const bool isAndroid =
6836 ToolChain.getTriple().getEnvironment() == llvm::Triple::Android;
Peter Collingbourne54d770c2013-04-09 04:35:11 +00006837 const bool IsPIE =
6838 !Args.hasArg(options::OPT_shared) &&
Alexey Samsonove65ceb92014-02-25 13:26:03 +00006839 (Args.hasArg(options::OPT_pie) || ToolChain.isPIEDefault());
Evgeniy Stepanov77866712012-04-25 08:59:22 +00006840
Rafael Espindolac8f008f2010-11-07 20:14:31 +00006841 ArgStringList CmdArgs;
6842
Rafael Espindolad1002f62010-11-15 18:28:16 +00006843 // Silence warning for "clang -g foo.o -o foo"
6844 Args.ClaimAllArgs(options::OPT_g_Group);
Rafael Espindolad95a8122011-03-01 05:25:27 +00006845 // and "clang -emit-llvm foo.o -o foo"
6846 Args.ClaimAllArgs(options::OPT_emit_llvm);
David Chisnall5f99f482012-07-29 15:24:44 +00006847 // and for "clang -w foo.o -o foo". Other warning options are already
Rafael Espindolaf92614c2010-11-17 20:37:10 +00006848 // handled somewhere else.
6849 Args.ClaimAllArgs(options::OPT_w);
Rafael Espindolad1002f62010-11-15 18:28:16 +00006850
Joerg Sonnenberger6165ab12011-03-21 13:51:29 +00006851 if (!D.SysRoot.empty())
6852 CmdArgs.push_back(Args.MakeArgString("--sysroot=" + D.SysRoot));
Rafael Espindolac8f008f2010-11-07 20:14:31 +00006853
Peter Collingbourne54d770c2013-04-09 04:35:11 +00006854 if (IsPIE)
Rafael Espindolad47ac232010-11-17 22:26:15 +00006855 CmdArgs.push_back("-pie");
6856
Rafael Espindola1c76c592010-11-07 22:57:16 +00006857 if (Args.hasArg(options::OPT_rdynamic))
6858 CmdArgs.push_back("-export-dynamic");
6859
Rafael Espindola34d77dc2010-11-11 19:34:42 +00006860 if (Args.hasArg(options::OPT_s))
6861 CmdArgs.push_back("-s");
6862
Rafael Espindolac8f008f2010-11-07 20:14:31 +00006863 for (std::vector<std::string>::const_iterator i = ToolChain.ExtraOpts.begin(),
6864 e = ToolChain.ExtraOpts.end();
6865 i != e; ++i)
6866 CmdArgs.push_back(i->c_str());
6867
6868 if (!Args.hasArg(options::OPT_static)) {
6869 CmdArgs.push_back("--eh-frame-hdr");
6870 }
6871
6872 CmdArgs.push_back("-m");
6873 if (ToolChain.getArch() == llvm::Triple::x86)
6874 CmdArgs.push_back("elf_i386");
Tim Northovera2ee4332014-03-29 15:09:45 +00006875 else if (ToolChain.getArch() == llvm::Triple::aarch64 ||
6876 ToolChain.getArch() == llvm::Triple::arm64)
Tim Northover9bb857a2013-01-31 12:13:10 +00006877 CmdArgs.push_back("aarch64linux");
Christian Pirkera74c7912014-03-14 12:15:45 +00006878 else if (ToolChain.getArch() == llvm::Triple::aarch64_be)
6879 CmdArgs.push_back("aarch64_be_linux");
Eric Christopher84fbdb42011-08-19 00:30:14 +00006880 else if (ToolChain.getArch() == llvm::Triple::arm
Douglas Gregord9bb1522011-03-06 19:11:49 +00006881 || ToolChain.getArch() == llvm::Triple::thumb)
Rafael Espindolac8f008f2010-11-07 20:14:31 +00006882 CmdArgs.push_back("armelf_linux_eabi");
Christian Pirkerf01cd6f2014-03-28 14:40:46 +00006883 else if (ToolChain.getArch() == llvm::Triple::armeb
6884 || ToolChain.getArch() == llvm::Triple::thumbeb)
6885 CmdArgs.push_back("armebelf_linux_eabi"); /* TODO: check which NAME. */
Ted Kremenek43d47cc2011-04-05 22:04:27 +00006886 else if (ToolChain.getArch() == llvm::Triple::ppc)
6887 CmdArgs.push_back("elf32ppclinux");
6888 else if (ToolChain.getArch() == llvm::Triple::ppc64)
6889 CmdArgs.push_back("elf64ppc");
Will Schmidtc1fc1902014-03-24 17:10:37 +00006890 else if (ToolChain.getArch() == llvm::Triple::ppc64le)
6891 CmdArgs.push_back("elf64lppc");
Jakob Stoklund Olesen91a8e032014-01-10 03:51:33 +00006892 else if (ToolChain.getArch() == llvm::Triple::sparc)
6893 CmdArgs.push_back("elf32_sparc");
6894 else if (ToolChain.getArch() == llvm::Triple::sparcv9)
6895 CmdArgs.push_back("elf64_sparc");
Eli Friedman27b8c4f2011-11-08 19:43:37 +00006896 else if (ToolChain.getArch() == llvm::Triple::mips)
6897 CmdArgs.push_back("elf32btsmip");
6898 else if (ToolChain.getArch() == llvm::Triple::mipsel)
6899 CmdArgs.push_back("elf32ltsmip");
Simon Atanasyan2d1b1ad2012-10-21 11:44:57 +00006900 else if (ToolChain.getArch() == llvm::Triple::mips64) {
Jonathan Roelofs2cea1be2014-02-12 03:21:20 +00006901 if (mips::hasMipsAbiArg(Args, "n32"))
Simon Atanasyan2d1b1ad2012-10-21 11:44:57 +00006902 CmdArgs.push_back("elf32btsmipn32");
6903 else
6904 CmdArgs.push_back("elf64btsmip");
6905 }
6906 else if (ToolChain.getArch() == llvm::Triple::mips64el) {
Jonathan Roelofs2cea1be2014-02-12 03:21:20 +00006907 if (mips::hasMipsAbiArg(Args, "n32"))
Simon Atanasyan2d1b1ad2012-10-21 11:44:57 +00006908 CmdArgs.push_back("elf32ltsmipn32");
6909 else
6910 CmdArgs.push_back("elf64ltsmip");
6911 }
Ulrich Weigand47445072013-05-06 16:26:41 +00006912 else if (ToolChain.getArch() == llvm::Triple::systemz)
6913 CmdArgs.push_back("elf64_s390");
Rafael Espindolac8f008f2010-11-07 20:14:31 +00006914 else
6915 CmdArgs.push_back("elf_x86_64");
6916
6917 if (Args.hasArg(options::OPT_static)) {
Joerg Sonnenberger1e205ef2014-02-02 22:36:13 +00006918 if (ToolChain.getArch() == llvm::Triple::arm ||
Christian Pirkerf01cd6f2014-03-28 14:40:46 +00006919 ToolChain.getArch() == llvm::Triple::armeb ||
6920 ToolChain.getArch() == llvm::Triple::thumb ||
6921 ToolChain.getArch() == llvm::Triple::thumbeb)
Rafael Espindolac8f008f2010-11-07 20:14:31 +00006922 CmdArgs.push_back("-Bstatic");
6923 else
6924 CmdArgs.push_back("-static");
6925 } else if (Args.hasArg(options::OPT_shared)) {
6926 CmdArgs.push_back("-shared");
Rafael Espindola7df35012012-11-02 20:41:30 +00006927 if (isAndroid) {
Evgeniy Stepanov77866712012-04-25 08:59:22 +00006928 CmdArgs.push_back("-Bsymbolic");
6929 }
Rafael Espindolac8f008f2010-11-07 20:14:31 +00006930 }
6931
6932 if (ToolChain.getArch() == llvm::Triple::arm ||
Christian Pirkerf01cd6f2014-03-28 14:40:46 +00006933 ToolChain.getArch() == llvm::Triple::armeb ||
Douglas Gregord9bb1522011-03-06 19:11:49 +00006934 ToolChain.getArch() == llvm::Triple::thumb ||
Christian Pirkerf01cd6f2014-03-28 14:40:46 +00006935 ToolChain.getArch() == llvm::Triple::thumbeb ||
Rafael Espindolac8f008f2010-11-07 20:14:31 +00006936 (!Args.hasArg(options::OPT_static) &&
6937 !Args.hasArg(options::OPT_shared))) {
6938 CmdArgs.push_back("-dynamic-linker");
Peter Collingbourne9d9e1fc2013-05-27 21:40:20 +00006939 CmdArgs.push_back(Args.MakeArgString(
6940 D.DyldPrefix + getLinuxDynamicLinker(Args, ToolChain)));
Rafael Espindolac8f008f2010-11-07 20:14:31 +00006941 }
6942
6943 CmdArgs.push_back("-o");
6944 CmdArgs.push_back(Output.getFilename());
6945
Rafael Espindola81937ec2010-12-01 01:52:43 +00006946 if (!Args.hasArg(options::OPT_nostdlib) &&
6947 !Args.hasArg(options::OPT_nostartfiles)) {
Evgeniy Stepanov77866712012-04-25 08:59:22 +00006948 if (!isAndroid) {
6949 const char *crt1 = NULL;
6950 if (!Args.hasArg(options::OPT_shared)){
Eric Christopherac021742013-06-07 23:25:01 +00006951 if (Args.hasArg(options::OPT_pg))
6952 crt1 = "gcrt1.o";
6953 else if (IsPIE)
Evgeniy Stepanov77866712012-04-25 08:59:22 +00006954 crt1 = "Scrt1.o";
6955 else
6956 crt1 = "crt1.o";
6957 }
6958 if (crt1)
6959 CmdArgs.push_back(Args.MakeArgString(ToolChain.GetFilePath(crt1)));
Rafael Espindolac8f008f2010-11-07 20:14:31 +00006960
Evgeniy Stepanov77866712012-04-25 08:59:22 +00006961 CmdArgs.push_back(Args.MakeArgString(ToolChain.GetFilePath("crti.o")));
6962 }
Rafael Espindolac8f008f2010-11-07 20:14:31 +00006963
Rafael Espindola9aa60e92010-11-12 03:00:39 +00006964 const char *crtbegin;
6965 if (Args.hasArg(options::OPT_static))
Evgeniy Stepanov77866712012-04-25 08:59:22 +00006966 crtbegin = isAndroid ? "crtbegin_static.o" : "crtbeginT.o";
Evgeniy Stepanovc9cde482012-09-10 10:30:12 +00006967 else if (Args.hasArg(options::OPT_shared))
Evgeniy Stepanov77866712012-04-25 08:59:22 +00006968 crtbegin = isAndroid ? "crtbegin_so.o" : "crtbeginS.o";
Peter Collingbourne54d770c2013-04-09 04:35:11 +00006969 else if (IsPIE)
Evgeniy Stepanovc9cde482012-09-10 10:30:12 +00006970 crtbegin = isAndroid ? "crtbegin_dynamic.o" : "crtbeginS.o";
Rafael Espindola9aa60e92010-11-12 03:00:39 +00006971 else
Evgeniy Stepanov77866712012-04-25 08:59:22 +00006972 crtbegin = isAndroid ? "crtbegin_dynamic.o" : "crtbegin.o";
Rafael Espindola9aa60e92010-11-12 03:00:39 +00006973 CmdArgs.push_back(Args.MakeArgString(ToolChain.GetFilePath(crtbegin)));
Benjamin Kramer058666a2012-10-04 19:42:20 +00006974
6975 // Add crtfastmath.o if available and fast math is enabled.
6976 ToolChain.AddFastMathRuntimeIfAvailable(Args, CmdArgs);
Rafael Espindola9aa60e92010-11-12 03:00:39 +00006977 }
Rafael Espindolac8f008f2010-11-07 20:14:31 +00006978
6979 Args.AddAllArgs(CmdArgs, options::OPT_L);
6980
6981 const ToolChain::path_list Paths = ToolChain.getFilePaths();
6982
Roman Divackyee8188a2011-03-01 17:53:14 +00006983 for (ToolChain::path_list::const_iterator i = Paths.begin(), e = Paths.end();
6984 i != e; ++i)
Chris Lattner0e62c1c2011-07-23 10:55:15 +00006985 CmdArgs.push_back(Args.MakeArgString(StringRef("-L") + *i));
Rafael Espindolac8f008f2010-11-07 20:14:31 +00006986
Alp Tokerce365ca2013-12-02 12:43:03 +00006987 if (D.IsUsingLTO(Args))
6988 AddGoldPlugin(ToolChain, Args, CmdArgs);
Chandler Carruth953fb082013-01-13 11:46:33 +00006989
Nick Lewycky2fe6aab2012-08-17 03:39:16 +00006990 if (Args.hasArg(options::OPT_Z_Xlinker__no_demangle))
6991 CmdArgs.push_back("--no-demangle");
6992
Rafael Espindolac8f008f2010-11-07 20:14:31 +00006993 AddLinkerInputs(ToolChain, Inputs, Args, CmdArgs);
6994
Alexey Samsonovce8ab102014-02-25 12:43:43 +00006995 addSanitizerRuntimes(getToolChain(), Args, CmdArgs);
Chandler Carruthe4458b32013-06-24 09:38:45 +00006996 // The profile runtime also needs access to system libraries.
Alexey Samsonov7811d192014-02-20 13:57:37 +00006997 addProfileRT(getToolChain(), Args, CmdArgs);
Chandler Carruthe4458b32013-06-24 09:38:45 +00006998
Hans Wennborg70850d82013-07-18 20:29:38 +00006999 if (D.CCCIsCXX() &&
Chandler Carruth94a32012012-05-14 18:31:18 +00007000 !Args.hasArg(options::OPT_nostdlib) &&
7001 !Args.hasArg(options::OPT_nodefaultlibs)) {
Rafael Espindola70b8d762011-10-17 22:14:51 +00007002 bool OnlyLibstdcxxStatic = Args.hasArg(options::OPT_static_libstdcxx) &&
7003 !Args.hasArg(options::OPT_static);
7004 if (OnlyLibstdcxxStatic)
7005 CmdArgs.push_back("-Bstatic");
Rafael Espindolac8f008f2010-11-07 20:14:31 +00007006 ToolChain.AddCXXStdlibLibArgs(Args, CmdArgs);
Rafael Espindola70b8d762011-10-17 22:14:51 +00007007 if (OnlyLibstdcxxStatic)
7008 CmdArgs.push_back("-Bdynamic");
Rafael Espindolac8f008f2010-11-07 20:14:31 +00007009 CmdArgs.push_back("-lm");
7010 }
7011
Rafael Espindola9aa60e92010-11-12 03:00:39 +00007012 if (!Args.hasArg(options::OPT_nostdlib)) {
Chandler Carruth94a32012012-05-14 18:31:18 +00007013 if (!Args.hasArg(options::OPT_nodefaultlibs)) {
7014 if (Args.hasArg(options::OPT_static))
7015 CmdArgs.push_back("--start-group");
Nick Lewycky97864da2011-06-04 06:27:06 +00007016
Alexey Bataev186b28a2014-03-06 05:43:53 +00007017 LibOpenMP UsedOpenMPLib = LibUnknown;
7018 if (Args.hasArg(options::OPT_fopenmp)) {
7019 UsedOpenMPLib = LibGOMP;
7020 } else if (const Arg *A = Args.getLastArg(options::OPT_fopenmp_EQ)) {
7021 UsedOpenMPLib = llvm::StringSwitch<LibOpenMP>(A->getValue())
7022 .Case("libgomp", LibGOMP)
7023 .Case("libiomp5", LibIOMP5)
7024 .Default(LibUnknown);
7025 if (UsedOpenMPLib == LibUnknown)
7026 D.Diag(diag::err_drv_unsupported_option_argument)
7027 << A->getOption().getName() << A->getValue();
7028 }
7029 switch (UsedOpenMPLib) {
7030 case LibGOMP:
Chandler Carruth01538002013-01-17 13:19:29 +00007031 CmdArgs.push_back("-lgomp");
7032
Alp Tokerf6a24ce2013-12-05 16:25:25 +00007033 // FIXME: Exclude this for platforms with libgomp that don't require
7034 // librt. Most modern Linux platforms require it, but some may not.
Chandler Carruth01538002013-01-17 13:19:29 +00007035 CmdArgs.push_back("-lrt");
Alexey Bataev186b28a2014-03-06 05:43:53 +00007036 break;
7037 case LibIOMP5:
7038 CmdArgs.push_back("-liomp5");
7039 break;
7040 case LibUnknown:
7041 break;
Chandler Carruth01538002013-01-17 13:19:29 +00007042 }
Renato Golinc4b49242014-02-13 10:01:16 +00007043 AddRunTimeLibs(ToolChain, D, CmdArgs, Args);
Rafael Espindola9aa60e92010-11-12 03:00:39 +00007044
Chandler Carruth94a32012012-05-14 18:31:18 +00007045 if (Args.hasArg(options::OPT_pthread) ||
Alexey Bataev648250a2014-03-07 07:43:52 +00007046 Args.hasArg(options::OPT_pthreads) || UsedOpenMPLib != LibUnknown)
Chandler Carruth94a32012012-05-14 18:31:18 +00007047 CmdArgs.push_back("-lpthread");
7048
7049 CmdArgs.push_back("-lc");
7050
7051 if (Args.hasArg(options::OPT_static))
7052 CmdArgs.push_back("--end-group");
7053 else
Renato Golinc4b49242014-02-13 10:01:16 +00007054 AddRunTimeLibs(ToolChain, D, CmdArgs, Args);
Chandler Carruth94a32012012-05-14 18:31:18 +00007055 }
Rafael Espindolad47ac232010-11-17 22:26:15 +00007056
Rafael Espindola81937ec2010-12-01 01:52:43 +00007057 if (!Args.hasArg(options::OPT_nostartfiles)) {
7058 const char *crtend;
Evgeniy Stepanovc9cde482012-09-10 10:30:12 +00007059 if (Args.hasArg(options::OPT_shared))
Evgeniy Stepanov77866712012-04-25 08:59:22 +00007060 crtend = isAndroid ? "crtend_so.o" : "crtendS.o";
Peter Collingbourne54d770c2013-04-09 04:35:11 +00007061 else if (IsPIE)
Evgeniy Stepanovc9cde482012-09-10 10:30:12 +00007062 crtend = isAndroid ? "crtend_android.o" : "crtendS.o";
Rafael Espindola81937ec2010-12-01 01:52:43 +00007063 else
Evgeniy Stepanov77866712012-04-25 08:59:22 +00007064 crtend = isAndroid ? "crtend_android.o" : "crtend.o";
Rafael Espindola9aa60e92010-11-12 03:00:39 +00007065
Rafael Espindola81937ec2010-12-01 01:52:43 +00007066 CmdArgs.push_back(Args.MakeArgString(ToolChain.GetFilePath(crtend)));
Evgeniy Stepanov77866712012-04-25 08:59:22 +00007067 if (!isAndroid)
7068 CmdArgs.push_back(Args.MakeArgString(ToolChain.GetFilePath("crtn.o")));
Rafael Espindola81937ec2010-12-01 01:52:43 +00007069 }
Rafael Espindolac8f008f2010-11-07 20:14:31 +00007070 }
7071
Rafael Espindolac8f008f2010-11-07 20:14:31 +00007072 C.addCommand(new Command(JA, *this, ToolChain.Linker.c_str(), CmdArgs));
7073}
Rafael Espindola92b00932010-08-10 00:25:48 +00007074
Chris Lattner3e2ee142010-07-07 16:01:42 +00007075void minix::Assemble::ConstructJob(Compilation &C, const JobAction &JA,
Daniel Dunbar7fbaf532010-08-02 02:38:28 +00007076 const InputInfo &Output,
7077 const InputInfoList &Inputs,
7078 const ArgList &Args,
7079 const char *LinkingOutput) const {
Chris Lattner3e2ee142010-07-07 16:01:42 +00007080 ArgStringList CmdArgs;
7081
7082 Args.AddAllArgValues(CmdArgs, options::OPT_Wa_COMMA,
7083 options::OPT_Xassembler);
7084
7085 CmdArgs.push_back("-o");
Daniel Dunbarb440f562010-08-02 02:38:21 +00007086 CmdArgs.push_back(Output.getFilename());
Chris Lattner3e2ee142010-07-07 16:01:42 +00007087
7088 for (InputInfoList::const_iterator
7089 it = Inputs.begin(), ie = Inputs.end(); it != ie; ++it) {
7090 const InputInfo &II = *it;
Daniel Dunbarb440f562010-08-02 02:38:21 +00007091 CmdArgs.push_back(II.getFilename());
Chris Lattner3e2ee142010-07-07 16:01:42 +00007092 }
7093
7094 const char *Exec =
Eli Friedman83de5132011-12-08 23:54:21 +00007095 Args.MakeArgString(getToolChain().GetProgramPath("as"));
Daniel Dunbar7fbaf532010-08-02 02:38:28 +00007096 C.addCommand(new Command(JA, *this, Exec, CmdArgs));
Chris Lattner3e2ee142010-07-07 16:01:42 +00007097}
7098
7099void minix::Link::ConstructJob(Compilation &C, const JobAction &JA,
Daniel Dunbar7fbaf532010-08-02 02:38:28 +00007100 const InputInfo &Output,
7101 const InputInfoList &Inputs,
7102 const ArgList &Args,
7103 const char *LinkingOutput) const {
Chris Lattner3e2ee142010-07-07 16:01:42 +00007104 const Driver &D = getToolChain().getDriver();
7105 ArgStringList CmdArgs;
7106
Daniel Dunbarb440f562010-08-02 02:38:21 +00007107 if (Output.isFilename()) {
Chris Lattner3e2ee142010-07-07 16:01:42 +00007108 CmdArgs.push_back("-o");
7109 CmdArgs.push_back(Output.getFilename());
7110 } else {
7111 assert(Output.isNothing() && "Invalid output.");
7112 }
7113
7114 if (!Args.hasArg(options::OPT_nostdlib) &&
Eli Friedman83de5132011-12-08 23:54:21 +00007115 !Args.hasArg(options::OPT_nostartfiles)) {
7116 CmdArgs.push_back(Args.MakeArgString(getToolChain().GetFilePath("crt1.o")));
7117 CmdArgs.push_back(Args.MakeArgString(getToolChain().GetFilePath("crti.o")));
7118 CmdArgs.push_back(Args.MakeArgString(getToolChain().GetFilePath("crtbegin.o")));
7119 CmdArgs.push_back(Args.MakeArgString(getToolChain().GetFilePath("crtn.o")));
7120 }
Chris Lattner3e2ee142010-07-07 16:01:42 +00007121
7122 Args.AddAllArgs(CmdArgs, options::OPT_L);
7123 Args.AddAllArgs(CmdArgs, options::OPT_T_Group);
7124 Args.AddAllArgs(CmdArgs, options::OPT_e);
7125
Daniel Dunbar54423b22010-09-17 00:24:54 +00007126 AddLinkerInputs(getToolChain(), Inputs, Args, CmdArgs);
Chris Lattner3e2ee142010-07-07 16:01:42 +00007127
Alexey Samsonov7811d192014-02-20 13:57:37 +00007128 addProfileRT(getToolChain(), Args, CmdArgs);
Eli Friedman83de5132011-12-08 23:54:21 +00007129
Chris Lattner3e2ee142010-07-07 16:01:42 +00007130 if (!Args.hasArg(options::OPT_nostdlib) &&
7131 !Args.hasArg(options::OPT_nodefaultlibs)) {
Hans Wennborg70850d82013-07-18 20:29:38 +00007132 if (D.CCCIsCXX()) {
Daniel Dunbar3f7796f2010-09-17 01:20:05 +00007133 getToolChain().AddCXXStdlibLibArgs(Args, CmdArgs);
Chris Lattner3e2ee142010-07-07 16:01:42 +00007134 CmdArgs.push_back("-lm");
7135 }
Chris Lattner3e2ee142010-07-07 16:01:42 +00007136 }
7137
7138 if (!Args.hasArg(options::OPT_nostdlib) &&
7139 !Args.hasArg(options::OPT_nostartfiles)) {
Eli Friedman83de5132011-12-08 23:54:21 +00007140 if (Args.hasArg(options::OPT_pthread))
7141 CmdArgs.push_back("-lpthread");
7142 CmdArgs.push_back("-lc");
7143 CmdArgs.push_back("-lCompilerRT-Generic");
7144 CmdArgs.push_back("-L/usr/pkg/compiler-rt/lib");
7145 CmdArgs.push_back(
Eric Christopher45f2e712012-12-18 00:31:10 +00007146 Args.MakeArgString(getToolChain().GetFilePath("crtend.o")));
Chris Lattner3e2ee142010-07-07 16:01:42 +00007147 }
7148
Rafael Espindola236db462013-11-09 20:07:19 +00007149 const char *Exec = Args.MakeArgString(getToolChain().GetProgramPath("ld"));
Daniel Dunbar7fbaf532010-08-02 02:38:28 +00007150 C.addCommand(new Command(JA, *this, Exec, CmdArgs));
Chris Lattner3e2ee142010-07-07 16:01:42 +00007151}
7152
Daniel Dunbarcc912342009-05-02 18:28:39 +00007153/// DragonFly Tools
7154
7155// For now, DragonFly Assemble does just about the same as for
7156// FreeBSD, but this may change soon.
7157void dragonfly::Assemble::ConstructJob(Compilation &C, const JobAction &JA,
Daniel Dunbar7fbaf532010-08-02 02:38:28 +00007158 const InputInfo &Output,
Daniel Dunbar1c7577c2009-11-04 06:24:38 +00007159 const InputInfoList &Inputs,
7160 const ArgList &Args,
7161 const char *LinkingOutput) const {
Daniel Dunbarcc912342009-05-02 18:28:39 +00007162 ArgStringList CmdArgs;
7163
7164 // When building 32-bit code on DragonFly/pc64, we have to explicitly
7165 // instruct as in the base system to assemble 32-bit code.
Rafael Espindola35ca7d92012-10-07 04:44:33 +00007166 if (getToolChain().getArch() == llvm::Triple::x86)
Daniel Dunbarcc912342009-05-02 18:28:39 +00007167 CmdArgs.push_back("--32");
7168
7169 Args.AddAllArgValues(CmdArgs, options::OPT_Wa_COMMA,
7170 options::OPT_Xassembler);
7171
7172 CmdArgs.push_back("-o");
Daniel Dunbarb440f562010-08-02 02:38:21 +00007173 CmdArgs.push_back(Output.getFilename());
Daniel Dunbarcc912342009-05-02 18:28:39 +00007174
7175 for (InputInfoList::const_iterator
7176 it = Inputs.begin(), ie = Inputs.end(); it != ie; ++it) {
7177 const InputInfo &II = *it;
Daniel Dunbarb440f562010-08-02 02:38:21 +00007178 CmdArgs.push_back(II.getFilename());
Daniel Dunbarcc912342009-05-02 18:28:39 +00007179 }
7180
7181 const char *Exec =
Daniel Dunbar9c3ed5f2010-07-14 18:46:23 +00007182 Args.MakeArgString(getToolChain().GetProgramPath("as"));
Daniel Dunbar7fbaf532010-08-02 02:38:28 +00007183 C.addCommand(new Command(JA, *this, Exec, CmdArgs));
Daniel Dunbarcc912342009-05-02 18:28:39 +00007184}
7185
7186void dragonfly::Link::ConstructJob(Compilation &C, const JobAction &JA,
Daniel Dunbar7fbaf532010-08-02 02:38:28 +00007187 const InputInfo &Output,
7188 const InputInfoList &Inputs,
7189 const ArgList &Args,
7190 const char *LinkingOutput) const {
John McCall65b8da02013-04-11 22:55:55 +00007191 bool UseGCC47 = false;
Daniel Dunbar083edf72009-12-21 18:54:17 +00007192 const Driver &D = getToolChain().getDriver();
Daniel Dunbarcc912342009-05-02 18:28:39 +00007193 ArgStringList CmdArgs;
7194
John McCall65b8da02013-04-11 22:55:55 +00007195 if (llvm::sys::fs::exists("/usr/lib/gcc47", UseGCC47))
7196 UseGCC47 = false;
7197
Joerg Sonnenberger6165ab12011-03-21 13:51:29 +00007198 if (!D.SysRoot.empty())
7199 CmdArgs.push_back(Args.MakeArgString("--sysroot=" + D.SysRoot));
7200
John McCall65b8da02013-04-11 22:55:55 +00007201 CmdArgs.push_back("--eh-frame-hdr");
Daniel Dunbarcc912342009-05-02 18:28:39 +00007202 if (Args.hasArg(options::OPT_static)) {
7203 CmdArgs.push_back("-Bstatic");
7204 } else {
John McCall65b8da02013-04-11 22:55:55 +00007205 if (Args.hasArg(options::OPT_rdynamic))
7206 CmdArgs.push_back("-export-dynamic");
Daniel Dunbarcc912342009-05-02 18:28:39 +00007207 if (Args.hasArg(options::OPT_shared))
7208 CmdArgs.push_back("-Bshareable");
7209 else {
7210 CmdArgs.push_back("-dynamic-linker");
7211 CmdArgs.push_back("/usr/libexec/ld-elf.so.2");
7212 }
John McCall65b8da02013-04-11 22:55:55 +00007213 CmdArgs.push_back("--hash-style=both");
Daniel Dunbarcc912342009-05-02 18:28:39 +00007214 }
7215
7216 // When building 32-bit code on DragonFly/pc64, we have to explicitly
7217 // instruct ld in the base system to link 32-bit code.
Rafael Espindola35ca7d92012-10-07 04:44:33 +00007218 if (getToolChain().getArch() == llvm::Triple::x86) {
Daniel Dunbarcc912342009-05-02 18:28:39 +00007219 CmdArgs.push_back("-m");
7220 CmdArgs.push_back("elf_i386");
7221 }
7222
Daniel Dunbarb440f562010-08-02 02:38:21 +00007223 if (Output.isFilename()) {
Daniel Dunbarcc912342009-05-02 18:28:39 +00007224 CmdArgs.push_back("-o");
7225 CmdArgs.push_back(Output.getFilename());
7226 } else {
7227 assert(Output.isNothing() && "Invalid output.");
7228 }
7229
7230 if (!Args.hasArg(options::OPT_nostdlib) &&
7231 !Args.hasArg(options::OPT_nostartfiles)) {
7232 if (!Args.hasArg(options::OPT_shared)) {
John McCall65b8da02013-04-11 22:55:55 +00007233 if (Args.hasArg(options::OPT_pg))
7234 CmdArgs.push_back(Args.MakeArgString(
7235 getToolChain().GetFilePath("gcrt1.o")));
7236 else {
7237 if (Args.hasArg(options::OPT_pie))
7238 CmdArgs.push_back(Args.MakeArgString(
7239 getToolChain().GetFilePath("Scrt1.o")));
7240 else
7241 CmdArgs.push_back(Args.MakeArgString(
7242 getToolChain().GetFilePath("crt1.o")));
7243 }
Daniel Dunbarcc912342009-05-02 18:28:39 +00007244 }
John McCall65b8da02013-04-11 22:55:55 +00007245 CmdArgs.push_back(Args.MakeArgString(
7246 getToolChain().GetFilePath("crti.o")));
7247 if (Args.hasArg(options::OPT_shared) || Args.hasArg(options::OPT_pie))
7248 CmdArgs.push_back(Args.MakeArgString(
7249 getToolChain().GetFilePath("crtbeginS.o")));
7250 else
7251 CmdArgs.push_back(Args.MakeArgString(
7252 getToolChain().GetFilePath("crtbegin.o")));
Daniel Dunbarcc912342009-05-02 18:28:39 +00007253 }
7254
7255 Args.AddAllArgs(CmdArgs, options::OPT_L);
7256 Args.AddAllArgs(CmdArgs, options::OPT_T_Group);
7257 Args.AddAllArgs(CmdArgs, options::OPT_e);
7258
Daniel Dunbar54423b22010-09-17 00:24:54 +00007259 AddLinkerInputs(getToolChain(), Inputs, Args, CmdArgs);
Daniel Dunbarcc912342009-05-02 18:28:39 +00007260
7261 if (!Args.hasArg(options::OPT_nostdlib) &&
7262 !Args.hasArg(options::OPT_nodefaultlibs)) {
7263 // FIXME: GCC passes on -lgcc, -lgcc_pic and a whole lot of
7264 // rpaths
John McCall65b8da02013-04-11 22:55:55 +00007265 if (UseGCC47)
7266 CmdArgs.push_back("-L/usr/lib/gcc47");
7267 else
7268 CmdArgs.push_back("-L/usr/lib/gcc44");
Daniel Dunbarcc912342009-05-02 18:28:39 +00007269
7270 if (!Args.hasArg(options::OPT_static)) {
John McCall65b8da02013-04-11 22:55:55 +00007271 if (UseGCC47) {
7272 CmdArgs.push_back("-rpath");
7273 CmdArgs.push_back("/usr/lib/gcc47");
7274 } else {
7275 CmdArgs.push_back("-rpath");
7276 CmdArgs.push_back("/usr/lib/gcc44");
7277 }
Daniel Dunbarcc912342009-05-02 18:28:39 +00007278 }
7279
Hans Wennborg70850d82013-07-18 20:29:38 +00007280 if (D.CCCIsCXX()) {
Daniel Dunbar3f7796f2010-09-17 01:20:05 +00007281 getToolChain().AddCXXStdlibLibArgs(Args, CmdArgs);
Rafael Espindola38360b32010-07-20 12:59:03 +00007282 CmdArgs.push_back("-lm");
7283 }
7284
Daniel Dunbarcc912342009-05-02 18:28:39 +00007285 if (Args.hasArg(options::OPT_pthread))
Mike Stump0a65b632009-10-31 20:11:46 +00007286 CmdArgs.push_back("-lpthread");
Daniel Dunbarcc912342009-05-02 18:28:39 +00007287
7288 if (!Args.hasArg(options::OPT_nolibc)) {
7289 CmdArgs.push_back("-lc");
7290 }
7291
John McCall65b8da02013-04-11 22:55:55 +00007292 if (UseGCC47) {
7293 if (Args.hasArg(options::OPT_static) ||
7294 Args.hasArg(options::OPT_static_libgcc)) {
7295 CmdArgs.push_back("-lgcc");
7296 CmdArgs.push_back("-lgcc_eh");
7297 } else {
7298 if (Args.hasArg(options::OPT_shared_libgcc)) {
7299 CmdArgs.push_back("-lgcc_pic");
7300 if (!Args.hasArg(options::OPT_shared))
7301 CmdArgs.push_back("-lgcc");
7302 } else {
7303 CmdArgs.push_back("-lgcc");
7304 CmdArgs.push_back("--as-needed");
7305 CmdArgs.push_back("-lgcc_pic");
7306 CmdArgs.push_back("--no-as-needed");
7307 }
7308 }
Daniel Dunbarcc912342009-05-02 18:28:39 +00007309 } else {
John McCall65b8da02013-04-11 22:55:55 +00007310 if (Args.hasArg(options::OPT_shared)) {
7311 CmdArgs.push_back("-lgcc_pic");
7312 } else {
7313 CmdArgs.push_back("-lgcc");
7314 }
Daniel Dunbarcc912342009-05-02 18:28:39 +00007315 }
7316 }
7317
7318 if (!Args.hasArg(options::OPT_nostdlib) &&
7319 !Args.hasArg(options::OPT_nostartfiles)) {
John McCall65b8da02013-04-11 22:55:55 +00007320 if (Args.hasArg(options::OPT_shared) || Args.hasArg(options::OPT_pie))
Chris Lattner3e2ee142010-07-07 16:01:42 +00007321 CmdArgs.push_back(Args.MakeArgString(
Daniel Dunbar9c3ed5f2010-07-14 18:46:23 +00007322 getToolChain().GetFilePath("crtendS.o")));
John McCall65b8da02013-04-11 22:55:55 +00007323 else
7324 CmdArgs.push_back(Args.MakeArgString(
7325 getToolChain().GetFilePath("crtend.o")));
Chris Lattner3e2ee142010-07-07 16:01:42 +00007326 CmdArgs.push_back(Args.MakeArgString(
John McCall65b8da02013-04-11 22:55:55 +00007327 getToolChain().GetFilePath("crtn.o")));
Daniel Dunbarcc912342009-05-02 18:28:39 +00007328 }
7329
Alexey Samsonov7811d192014-02-20 13:57:37 +00007330 addProfileRT(getToolChain(), Args, CmdArgs);
Nick Lewycky82fe5f42011-05-24 21:54:59 +00007331
Daniel Dunbarcc912342009-05-02 18:28:39 +00007332 const char *Exec =
Rafael Espindola236db462013-11-09 20:07:19 +00007333 Args.MakeArgString(getToolChain().GetProgramPath("ld"));
Daniel Dunbar7fbaf532010-08-02 02:38:28 +00007334 C.addCommand(new Command(JA, *this, Exec, CmdArgs));
Daniel Dunbarcc912342009-05-02 18:28:39 +00007335}
Michael J. Spencerb186bc32010-08-21 21:55:07 +00007336
7337void visualstudio::Link::ConstructJob(Compilation &C, const JobAction &JA,
7338 const InputInfo &Output,
7339 const InputInfoList &Inputs,
7340 const ArgList &Args,
7341 const char *LinkingOutput) const {
Michael J. Spencerb186bc32010-08-21 21:55:07 +00007342 ArgStringList CmdArgs;
7343
7344 if (Output.isFilename()) {
Daniel Dunbar2cc3f172010-09-17 00:45:02 +00007345 CmdArgs.push_back(Args.MakeArgString(std::string("-out:") +
7346 Output.getFilename()));
Michael J. Spencerb186bc32010-08-21 21:55:07 +00007347 } else {
7348 assert(Output.isNothing() && "Invalid output.");
7349 }
7350
7351 if (!Args.hasArg(options::OPT_nostdlib) &&
Hans Wennborg32e3b722013-08-09 17:38:42 +00007352 !Args.hasArg(options::OPT_nostartfiles) &&
7353 !C.getDriver().IsCLMode()) {
Michael J. Spencerb186bc32010-08-21 21:55:07 +00007354 CmdArgs.push_back("-defaultlib:libcmt");
7355 }
7356
7357 CmdArgs.push_back("-nologo");
7358
Hans Wennborgf1a74252013-09-10 20:18:04 +00007359 bool DLL = Args.hasArg(options::OPT__SLASH_LD, options::OPT__SLASH_LDd);
7360
7361 if (DLL) {
7362 CmdArgs.push_back(Args.MakeArgString("-dll"));
7363
7364 SmallString<128> ImplibName(Output.getFilename());
7365 llvm::sys::path::replace_extension(ImplibName, "lib");
7366 CmdArgs.push_back(Args.MakeArgString(std::string("-implib:") +
7367 ImplibName.str()));
7368 }
7369
Peter Collingbourne32701642013-11-01 18:16:25 +00007370 if (getToolChain().getSanitizerArgs().needsAsanRt()) {
Hans Wennborg0517e752013-08-28 17:36:07 +00007371 CmdArgs.push_back(Args.MakeArgString("-debug"));
Hans Wennborgd024c1c2013-08-30 10:50:52 +00007372 CmdArgs.push_back(Args.MakeArgString("-incremental:no"));
Hans Wennborg65f17522013-08-27 18:10:21 +00007373 SmallString<128> LibSanitizer(getToolChain().getDriver().ResourceDir);
Hans Wennborgf1a74252013-09-10 20:18:04 +00007374 llvm::sys::path::append(LibSanitizer, "lib", "windows");
7375 if (DLL) {
Timur Iskhodzhanov3b6adcb62013-09-11 11:45:31 +00007376 llvm::sys::path::append(LibSanitizer, "clang_rt.asan_dll_thunk-i386.lib");
Hans Wennborgf1a74252013-09-10 20:18:04 +00007377 } else {
7378 llvm::sys::path::append(LibSanitizer, "clang_rt.asan-i386.lib");
7379 }
7380 // FIXME: Handle 64-bit.
Hans Wennborg65f17522013-08-27 18:10:21 +00007381 CmdArgs.push_back(Args.MakeArgString(LibSanitizer));
7382 }
7383
Michael J. Spencere2f49362012-06-18 16:56:04 +00007384 Args.AddAllArgValues(CmdArgs, options::OPT_l);
Hans Wennborg2e274592013-08-13 23:38:57 +00007385 Args.AddAllArgValues(CmdArgs, options::OPT__SLASH_link);
Michael J. Spencere2f49362012-06-18 16:56:04 +00007386
7387 // Add filenames immediately.
7388 for (InputInfoList::const_iterator
7389 it = Inputs.begin(), ie = Inputs.end(); it != ie; ++it) {
7390 if (it->isFilename())
7391 CmdArgs.push_back(it->getFilename());
Hans Wennborgbe4a6762013-08-14 01:24:35 +00007392 else
7393 it->getInputArg().renderAsInput(Args, CmdArgs);
Michael J. Spencere2f49362012-06-18 16:56:04 +00007394 }
Michael J. Spencerb186bc32010-08-21 21:55:07 +00007395
7396 const char *Exec =
Daniel Dunbar54423b22010-09-17 00:24:54 +00007397 Args.MakeArgString(getToolChain().GetProgramPath("link.exe"));
Michael J. Spencerb186bc32010-08-21 21:55:07 +00007398 C.addCommand(new Command(JA, *this, Exec, CmdArgs));
7399}
Hans Wennborg87cfa712013-09-19 20:32:16 +00007400
7401void visualstudio::Compile::ConstructJob(Compilation &C, const JobAction &JA,
7402 const InputInfo &Output,
7403 const InputInfoList &Inputs,
7404 const ArgList &Args,
7405 const char *LinkingOutput) const {
7406 C.addCommand(GetCommand(C, JA, Output, Inputs, Args, LinkingOutput));
7407}
7408
Hans Wennborg188382e2013-09-20 18:16:35 +00007409// Try to find FallbackName on PATH that is not identical to ClangProgramPath.
7410// If one cannot be found, return FallbackName.
7411// We do this special search to prevent clang-cl from falling back onto itself
7412// if it's available as cl.exe on the path.
7413static std::string FindFallback(const char *FallbackName,
7414 const char *ClangProgramPath) {
7415 llvm::Optional<std::string> OptPath = llvm::sys::Process::GetEnv("PATH");
7416 if (!OptPath.hasValue())
7417 return FallbackName;
7418
7419#ifdef LLVM_ON_WIN32
7420 const StringRef PathSeparators = ";";
7421#else
7422 const StringRef PathSeparators = ":";
7423#endif
7424
7425 SmallVector<StringRef, 8> PathSegments;
7426 llvm::SplitString(OptPath.getValue(), PathSegments, PathSeparators);
7427
7428 for (size_t i = 0, e = PathSegments.size(); i != e; ++i) {
7429 const StringRef &PathSegment = PathSegments[i];
7430 if (PathSegment.empty())
7431 continue;
7432
7433 SmallString<128> FilePath(PathSegment);
7434 llvm::sys::path::append(FilePath, FallbackName);
7435 if (llvm::sys::fs::can_execute(Twine(FilePath)) &&
7436 !llvm::sys::fs::equivalent(Twine(FilePath), ClangProgramPath))
7437 return FilePath.str();
7438 }
7439
7440 return FallbackName;
7441}
7442
Hans Wennborg87cfa712013-09-19 20:32:16 +00007443Command *visualstudio::Compile::GetCommand(Compilation &C, const JobAction &JA,
7444 const InputInfo &Output,
7445 const InputInfoList &Inputs,
7446 const ArgList &Args,
7447 const char *LinkingOutput) const {
7448 ArgStringList CmdArgs;
Hans Wennborg263c2132013-09-24 17:36:21 +00007449 CmdArgs.push_back("/nologo");
Hans Wennborg87cfa712013-09-19 20:32:16 +00007450 CmdArgs.push_back("/c"); // Compile only.
7451 CmdArgs.push_back("/W0"); // No warnings.
7452
7453 // The goal is to be able to invoke this tool correctly based on
7454 // any flag accepted by clang-cl.
7455
7456 // These are spelled the same way in clang and cl.exe,.
7457 Args.AddAllArgs(CmdArgs, options::OPT_D, options::OPT_U);
7458 Args.AddAllArgs(CmdArgs, options::OPT_I);
Hans Wennborgb6331dc2013-09-24 18:17:21 +00007459
7460 // Optimization level.
7461 if (Arg *A = Args.getLastArg(options::OPT_O, options::OPT_O0)) {
7462 if (A->getOption().getID() == options::OPT_O0) {
7463 CmdArgs.push_back("/Od");
7464 } else {
7465 StringRef OptLevel = A->getValue();
7466 if (OptLevel == "1" || OptLevel == "2" || OptLevel == "s")
7467 A->render(Args, CmdArgs);
7468 else if (OptLevel == "3")
7469 CmdArgs.push_back("/Ox");
7470 }
7471 }
Hans Wennborg87cfa712013-09-19 20:32:16 +00007472
7473 // Flags for which clang-cl have an alias.
7474 // FIXME: How can we ensure this stays in sync with relevant clang-cl options?
7475
7476 if (Arg *A = Args.getLastArg(options::OPT_frtti, options::OPT_fno_rtti))
7477 CmdArgs.push_back(A->getOption().getID() == options::OPT_frtti ? "/GR"
7478 : "/GR-");
Hans Wennborg5149a3b2014-03-25 14:48:54 +00007479 if (Arg *A = Args.getLastArg(options::OPT_ffunction_sections,
7480 options::OPT_fno_function_sections))
7481 CmdArgs.push_back(A->getOption().getID() == options::OPT_ffunction_sections
7482 ? "/Gy"
7483 : "/Gy-");
Hans Wennborg87cfa712013-09-19 20:32:16 +00007484 if (Args.hasArg(options::OPT_fsyntax_only))
7485 CmdArgs.push_back("/Zs");
Reid Klecknerc688daf2014-02-19 22:05:59 +00007486 if (Args.hasArg(options::OPT_g_Flag, options::OPT_gline_tables_only))
7487 CmdArgs.push_back("/Z7");
Hans Wennborg87cfa712013-09-19 20:32:16 +00007488
Hans Wennborg260ff402013-09-27 17:54:18 +00007489 std::vector<std::string> Includes = Args.getAllArgValues(options::OPT_include);
7490 for (size_t I = 0, E = Includes.size(); I != E; ++I)
7491 CmdArgs.push_back(Args.MakeArgString(std::string("/FI") + Includes[I]));
7492
Hans Wennborg87cfa712013-09-19 20:32:16 +00007493 // Flags that can simply be passed through.
7494 Args.AddAllArgs(CmdArgs, options::OPT__SLASH_LD);
7495 Args.AddAllArgs(CmdArgs, options::OPT__SLASH_LDd);
7496
7497 // The order of these flags is relevant, so pick the last one.
7498 if (Arg *A = Args.getLastArg(options::OPT__SLASH_MD, options::OPT__SLASH_MDd,
7499 options::OPT__SLASH_MT, options::OPT__SLASH_MTd))
7500 A->render(Args, CmdArgs);
7501
7502
7503 // Input filename.
7504 assert(Inputs.size() == 1);
7505 const InputInfo &II = Inputs[0];
7506 assert(II.getType() == types::TY_C || II.getType() == types::TY_CXX);
7507 CmdArgs.push_back(II.getType() == types::TY_C ? "/Tc" : "/Tp");
7508 if (II.isFilename())
7509 CmdArgs.push_back(II.getFilename());
7510 else
7511 II.getInputArg().renderAsInput(Args, CmdArgs);
7512
7513 // Output filename.
7514 assert(Output.getType() == types::TY_Object);
7515 const char *Fo = Args.MakeArgString(std::string("/Fo") +
7516 Output.getFilename());
7517 CmdArgs.push_back(Fo);
7518
Hans Wennborg188382e2013-09-20 18:16:35 +00007519 const Driver &D = getToolChain().getDriver();
7520 std::string Exec = FindFallback("cl.exe", D.getClangProgramPath());
Hans Wennborg87cfa712013-09-19 20:32:16 +00007521
Hans Wennborg188382e2013-09-20 18:16:35 +00007522 return new Command(JA, *this, Args.MakeArgString(Exec), CmdArgs);
Hans Wennborg87cfa712013-09-19 20:32:16 +00007523}
Robert Lyttoncf1dd692013-10-11 10:29:40 +00007524
7525
7526/// XCore Tools
7527// We pass assemble and link construction to the xcc tool.
7528
7529void XCore::Assemble::ConstructJob(Compilation &C, const JobAction &JA,
7530 const InputInfo &Output,
7531 const InputInfoList &Inputs,
7532 const ArgList &Args,
7533 const char *LinkingOutput) const {
7534 ArgStringList CmdArgs;
7535
7536 CmdArgs.push_back("-o");
7537 CmdArgs.push_back(Output.getFilename());
7538
7539 CmdArgs.push_back("-c");
7540
Robert Lytton9e8c1a42014-02-13 10:40:12 +00007541 if (Args.hasArg(options::OPT_v))
7542 CmdArgs.push_back("-v");
7543
7544 if (Args.hasArg(options::OPT_g_Group))
Robert Lyttoncf1dd692013-10-11 10:29:40 +00007545 CmdArgs.push_back("-g");
Robert Lytton9e8c1a42014-02-13 10:40:12 +00007546
Robert Lytton8e95d4e2014-02-11 10:34:45 +00007547 if (Args.hasFlag(options::OPT_fverbose_asm, options::OPT_fno_verbose_asm,
7548 false))
7549 CmdArgs.push_back("-fverbose-asm");
Robert Lyttoncf1dd692013-10-11 10:29:40 +00007550
7551 Args.AddAllArgValues(CmdArgs, options::OPT_Wa_COMMA,
7552 options::OPT_Xassembler);
7553
7554 for (InputInfoList::const_iterator
7555 it = Inputs.begin(), ie = Inputs.end(); it != ie; ++it) {
7556 const InputInfo &II = *it;
7557 CmdArgs.push_back(II.getFilename());
7558 }
7559
7560 const char *Exec =
7561 Args.MakeArgString(getToolChain().GetProgramPath("xcc"));
7562 C.addCommand(new Command(JA, *this, Exec, CmdArgs));
7563}
7564
7565void XCore::Link::ConstructJob(Compilation &C, const JobAction &JA,
7566 const InputInfo &Output,
7567 const InputInfoList &Inputs,
7568 const ArgList &Args,
7569 const char *LinkingOutput) const {
7570 ArgStringList CmdArgs;
7571
7572 if (Output.isFilename()) {
7573 CmdArgs.push_back("-o");
7574 CmdArgs.push_back(Output.getFilename());
7575 } else {
7576 assert(Output.isNothing() && "Invalid output.");
7577 }
7578
Robert Lytton9e8c1a42014-02-13 10:40:12 +00007579 if (Args.hasArg(options::OPT_v))
7580 CmdArgs.push_back("-v");
7581
Robert Lyttonf7e03c12014-02-13 10:34:44 +00007582 ExceptionSettings EH = exceptionSettings(Args, getToolChain().getTriple());
7583 if (EH.ShouldUseExceptionTables)
7584 CmdArgs.push_back("-fexceptions");
7585
Robert Lyttoncf1dd692013-10-11 10:29:40 +00007586 AddLinkerInputs(getToolChain(), Inputs, Args, CmdArgs);
7587
7588 const char *Exec =
7589 Args.MakeArgString(getToolChain().GetProgramPath("xcc"));
7590 C.addCommand(new Command(JA, *this, Exec, CmdArgs));
7591}