blob: ceb6775a3dcc324701962577eaec595eb40bdd5e [file] [log] [blame]
Nick Lewyckye47c2452010-09-23 23:48:20 +00001//===--- Tools.cpp - Tools Implementations --------------------------------===//
Daniel Dunbar1a093d22009-03-18 06:00:36 +00002//
3// The LLVM Compiler Infrastructure
4//
5// This file is distributed under the University of Illinois Open Source
6// License. See LICENSE.TXT for details.
7//
8//===----------------------------------------------------------------------===//
9
10#include "Tools.h"
Chandler Carruth3a022472012-12-04 09:13:33 +000011#include "InputInfo.h"
Chandler Carruth3a022472012-12-04 09:13:33 +000012#include "ToolChains.h"
Josh Mageee0fc1a82014-02-11 01:35:14 +000013#include "clang/Basic/LangOptions.h"
Chandler Carruth3a022472012-12-04 09:13:33 +000014#include "clang/Basic/ObjCRuntime.h"
Kevin Enderbyae2ec472013-01-17 21:38:06 +000015#include "clang/Basic/Version.h"
Daniel Dunbara2aedc62009-03-18 10:01:51 +000016#include "clang/Driver/Action.h"
Chandler Carruth3a022472012-12-04 09:13:33 +000017#include "clang/Driver/Compilation.h"
Daniel Dunbar1a8a2e82009-10-29 02:39:57 +000018#include "clang/Driver/Driver.h"
19#include "clang/Driver/DriverDiagnostic.h"
Daniel Dunbar04c4c2c2009-03-18 07:06:02 +000020#include "clang/Driver/Job.h"
Daniel Dunbarda13faf2009-11-19 04:25:22 +000021#include "clang/Driver/Options.h"
Alexey Samsonov609213f92013-08-19 09:14:21 +000022#include "clang/Driver/SanitizerArgs.h"
Daniel Dunbara3246a02009-03-18 08:07:30 +000023#include "clang/Driver/ToolChain.h"
Daniel Dunbar04c4c2c2009-03-18 07:06:02 +000024#include "clang/Driver/Util.h"
Daniel Dunbar1c28f1e2009-09-09 22:32:48 +000025#include "llvm/ADT/SmallString.h"
Hans Wennborg188382e2013-09-20 18:16:35 +000026#include "llvm/ADT/StringExtras.h"
Douglas Gregorf7b87cb2009-10-29 00:41:01 +000027#include "llvm/ADT/StringSwitch.h"
Daniel Dunbarb4a3e432009-09-09 22:32:34 +000028#include "llvm/ADT/Twine.h"
Reid Kleckner898229a2013-06-14 17:17:23 +000029#include "llvm/Option/Arg.h"
30#include "llvm/Option/ArgList.h"
31#include "llvm/Option/Option.h"
David Blaikie24bbfed22014-03-31 23:29:38 +000032#include "llvm/Support/Compression.h"
Chandler Carruth3a022472012-12-04 09:13:33 +000033#include "llvm/Support/ErrorHandling.h"
Michael J. Spencerf6efe582011-01-10 02:34:13 +000034#include "llvm/Support/FileSystem.h"
Daniel Dunbarc1964212009-03-26 16:23:12 +000035#include "llvm/Support/Format.h"
Michael J. Spencer8aaf4992010-11-29 18:12:39 +000036#include "llvm/Support/Host.h"
Hans Wennborg188382e2013-09-20 18:16:35 +000037#include "llvm/Support/Path.h"
Michael J. Spencer8aaf4992010-11-29 18:12:39 +000038#include "llvm/Support/Process.h"
Chandler Carruth5553d0d2014-01-07 11:51:46 +000039#include "llvm/Support/Program.h"
Chandler Carruth3a022472012-12-04 09:13:33 +000040#include "llvm/Support/raw_ostream.h"
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) {
Hans Wennborg8f008372014-06-11 19:44:53 +000065 if (Arg *A = Args.getLastArg(options::OPT_C, options::OPT_CC)) {
66 if (!Args.hasArg(options::OPT_E) && !Args.hasArg(options::OPT__SLASH_P) &&
67 !Args.hasArg(options::OPT__SLASH_EP) && !D.CCCIsCPP()) {
Chris Lattner0e62c1c2011-07-23 10:55:15 +000068 D.Diag(diag::err_drv_argument_only_allowed_with)
Hans Wennborg8f008372014-06-11 19:44:53 +000069 << A->getBaseArg().getAsString(Args)
70 << (D.IsCLMode() ? "/E, /P or /EP" : "-E");
71 }
72 }
Daniel Dunbar64198ef2009-09-10 01:21:05 +000073}
74
Daniel Dunbar4eadb602009-09-10 01:21:12 +000075/// CheckCodeGenerationOptions - Perform some validation of code generation
76/// arguments that is shared with gcc.
77static void CheckCodeGenerationOptions(const Driver &D, const ArgList &Args) {
78 // In gcc, only ARM checks this, but it seems reasonable to check universally.
79 if (Args.hasArg(options::OPT_static))
80 if (const Arg *A = Args.getLastArg(options::OPT_dynamic,
81 options::OPT_mdynamic_no_pic))
Chris Lattner0e62c1c2011-07-23 10:55:15 +000082 D.Diag(diag::err_drv_argument_not_allowed_with)
Daniel Dunbar4eadb602009-09-10 01:21:12 +000083 << A->getAsString(Args) << "-static";
84}
85
Bob Wilsond5aad2a2014-11-04 22:28:48 +000086// Add backslashes to escape spaces and other backslashes.
87// This is used for the space-separated argument list specified with
88// the -dwarf-debug-flags option.
89static void EscapeSpacesAndBackslashes(const char *Arg,
90 SmallVectorImpl<char> &Res) {
91 for ( ; *Arg; ++Arg) {
92 switch (*Arg) {
93 default: break;
94 case ' ':
95 case '\\':
96 Res.push_back('\\');
97 break;
98 }
99 Res.push_back(*Arg);
100 }
101}
102
Chris Lattnerbf2803f2010-03-29 17:55:58 +0000103// Quote target names for inclusion in GNU Make dependency files.
104// Only the characters '$', '#', ' ', '\t' are quoted.
Chris Lattner0e62c1c2011-07-23 10:55:15 +0000105static void QuoteTarget(StringRef Target,
106 SmallVectorImpl<char> &Res) {
Chris Lattnerbf2803f2010-03-29 17:55:58 +0000107 for (unsigned i = 0, e = Target.size(); i != e; ++i) {
108 switch (Target[i]) {
109 case ' ':
110 case '\t':
111 // Escape the preceding backslashes
112 for (int j = i - 1; j >= 0 && Target[j] == '\\'; --j)
113 Res.push_back('\\');
114
115 // Escape the space/tab
116 Res.push_back('\\');
117 break;
118 case '$':
119 Res.push_back('$');
120 break;
121 case '#':
122 Res.push_back('\\');
123 break;
124 default:
125 break;
126 }
127
128 Res.push_back(Target[i]);
129 }
130}
131
Bill Wendlingc0938f32012-03-12 22:10:06 +0000132static void addDirectoryList(const ArgList &Args,
Bill Wendling281ca292012-03-12 21:22:35 +0000133 ArgStringList &CmdArgs,
134 const char *ArgName,
Bill Wendlingc0938f32012-03-12 22:10:06 +0000135 const char *EnvVar) {
136 const char *DirList = ::getenv(EnvVar);
Chad Rosier616e8a52012-10-30 21:42:09 +0000137 bool CombinedArg = false;
138
Bill Wendling281ca292012-03-12 21:22:35 +0000139 if (!DirList)
140 return; // Nothing to do.
141
Chad Rosier616e8a52012-10-30 21:42:09 +0000142 StringRef Name(ArgName);
143 if (Name.equals("-I") || Name.equals("-L"))
144 CombinedArg = true;
145
Bill Wendling281ca292012-03-12 21:22:35 +0000146 StringRef Dirs(DirList);
147 if (Dirs.empty()) // Empty string should not add '.'.
148 return;
149
150 StringRef::size_type Delim;
Rafael Espindola04b3fc42013-06-25 14:29:51 +0000151 while ((Delim = Dirs.find(llvm::sys::EnvPathSeparator)) != StringRef::npos) {
Bill Wendling281ca292012-03-12 21:22:35 +0000152 if (Delim == 0) { // Leading colon.
Chad Rosier616e8a52012-10-30 21:42:09 +0000153 if (CombinedArg) {
154 CmdArgs.push_back(Args.MakeArgString(std::string(ArgName) + "."));
155 } else {
156 CmdArgs.push_back(ArgName);
157 CmdArgs.push_back(".");
158 }
Bill Wendling281ca292012-03-12 21:22:35 +0000159 } else {
Chad Rosier616e8a52012-10-30 21:42:09 +0000160 if (CombinedArg) {
161 CmdArgs.push_back(Args.MakeArgString(std::string(ArgName) + Dirs.substr(0, Delim)));
162 } else {
163 CmdArgs.push_back(ArgName);
164 CmdArgs.push_back(Args.MakeArgString(Dirs.substr(0, Delim)));
165 }
Bill Wendling281ca292012-03-12 21:22:35 +0000166 }
Nico Weber89355782012-03-19 15:00:03 +0000167 Dirs = Dirs.substr(Delim + 1);
Bill Wendling281ca292012-03-12 21:22:35 +0000168 }
169
170 if (Dirs.empty()) { // Trailing colon.
Chad Rosier616e8a52012-10-30 21:42:09 +0000171 if (CombinedArg) {
172 CmdArgs.push_back(Args.MakeArgString(std::string(ArgName) + "."));
173 } else {
174 CmdArgs.push_back(ArgName);
175 CmdArgs.push_back(".");
176 }
Bill Wendling281ca292012-03-12 21:22:35 +0000177 } else { // Add the last path.
Chad Rosier616e8a52012-10-30 21:42:09 +0000178 if (CombinedArg) {
179 CmdArgs.push_back(Args.MakeArgString(std::string(ArgName) + Dirs));
180 } else {
181 CmdArgs.push_back(ArgName);
182 CmdArgs.push_back(Args.MakeArgString(Dirs));
183 }
Bill Wendling281ca292012-03-12 21:22:35 +0000184 }
185}
186
Daniel Dunbar54423b22010-09-17 00:24:54 +0000187static void AddLinkerInputs(const ToolChain &TC,
188 const InputInfoList &Inputs, const ArgList &Args,
189 ArgStringList &CmdArgs) {
190 const Driver &D = TC.getDriver();
191
Daniel Dunbar1094bb12011-02-19 05:33:51 +0000192 // Add extra linker input arguments which are not treated as inputs
193 // (constructed via -Xarch_).
194 Args.AddAllArgValues(CmdArgs, options::OPT_Zlinker_input);
195
Saleem Abdulrasool2456cea2014-06-12 02:08:04 +0000196 for (const auto &II : Inputs) {
Daniel Dunbar54423b22010-09-17 00:24:54 +0000197 if (!TC.HasNativeLLVMSupport()) {
198 // Don't try to pass LLVM inputs unless we have native support.
199 if (II.getType() == types::TY_LLVM_IR ||
200 II.getType() == types::TY_LTO_IR ||
201 II.getType() == types::TY_LLVM_BC ||
202 II.getType() == types::TY_LTO_BC)
Chris Lattner0e62c1c2011-07-23 10:55:15 +0000203 D.Diag(diag::err_drv_no_linker_llvm_support)
Daniel Dunbar54423b22010-09-17 00:24:54 +0000204 << TC.getTripleString();
205 }
206
Daniel Dunbar2cc3f172010-09-17 00:45:02 +0000207 // Add filenames immediately.
208 if (II.isFilename()) {
Daniel Dunbar54423b22010-09-17 00:24:54 +0000209 CmdArgs.push_back(II.getFilename());
Daniel Dunbar2cc3f172010-09-17 00:45:02 +0000210 continue;
211 }
212
213 // Otherwise, this is a linker input argument.
214 const Arg &A = II.getInputArg();
215
216 // Handle reserved library options.
Saleem Abdulrasool2456cea2014-06-12 02:08:04 +0000217 if (A.getOption().matches(options::OPT_Z_reserved_lib_stdcxx))
Daniel Dunbar3f7796f2010-09-17 01:20:05 +0000218 TC.AddCXXStdlibLibArgs(Args, CmdArgs);
Saleem Abdulrasool2456cea2014-06-12 02:08:04 +0000219 else if (A.getOption().matches(options::OPT_Z_reserved_lib_cckext))
Shantonu Senafeb03b2010-09-17 18:39:08 +0000220 TC.AddCCKextLibArgs(Args, CmdArgs);
Arthur Marble31fb6f42014-07-16 21:16:16 +0000221 else if (A.getOption().matches(options::OPT_z)) {
222 // Pass -z prefix for gcc linker compatibility.
223 A.claim();
224 A.render(Args, CmdArgs);
225 } else {
226 A.renderAsInput(Args, CmdArgs);
227 }
Daniel Dunbar54423b22010-09-17 00:24:54 +0000228 }
Bill Wendling281ca292012-03-12 21:22:35 +0000229
230 // LIBRARY_PATH - included following the user specified library paths.
Richard Barton5828d7b2013-12-17 11:11:25 +0000231 // and only supported on native toolchains.
232 if (!TC.isCrossCompiling())
233 addDirectoryList(Args, CmdArgs, "-L", "LIBRARY_PATH");
Daniel Dunbar54423b22010-09-17 00:24:54 +0000234}
235
John McCall31168b02011-06-15 23:02:42 +0000236/// \brief Determine whether Objective-C automated reference counting is
237/// enabled.
238static bool isObjCAutoRefCount(const ArgList &Args) {
239 return Args.hasFlag(options::OPT_fobjc_arc, options::OPT_fno_objc_arc, false);
240}
241
Ted Kremeneke65b0862012-03-06 20:05:56 +0000242/// \brief Determine whether we are linking the ObjC runtime.
243static bool isObjCRuntimeLinked(const ArgList &Args) {
Bob Wilson29536fc2012-08-07 19:58:00 +0000244 if (isObjCAutoRefCount(Args)) {
245 Args.ClaimAllArgs(options::OPT_fobjc_link_runtime);
Ted Kremeneke65b0862012-03-06 20:05:56 +0000246 return true;
Bob Wilson29536fc2012-08-07 19:58:00 +0000247 }
Ted Kremeneke65b0862012-03-06 20:05:56 +0000248 return Args.hasArg(options::OPT_fobjc_link_runtime);
249}
250
Michael J. Spencer66e2b202012-10-19 22:37:06 +0000251static bool forwardToGCC(const Option &O) {
Reid Kleckner3793d5e2013-06-19 15:09:06 +0000252 // Don't forward inputs from the original command line. They are added from
253 // InputInfoList.
Richard Smith8e5e9762013-06-20 01:33:59 +0000254 return O.getKind() != Option::InputClass &&
Michael J. Spencer66e2b202012-10-19 22:37:06 +0000255 !O.hasFlag(options::DriverOption) &&
256 !O.hasFlag(options::LinkerInput);
257}
258
Peter Collingbourne9b515cb2011-11-06 00:40:05 +0000259void Clang::AddPreprocessingOptions(Compilation &C,
Chad Rosier633dcdc2013-01-24 19:14:47 +0000260 const JobAction &JA,
Peter Collingbourne9b515cb2011-11-06 00:40:05 +0000261 const Driver &D,
Douglas Gregor111af7d2009-04-18 00:34:01 +0000262 const ArgList &Args,
Daniel Dunbard067f7f2009-04-08 23:54:23 +0000263 ArgStringList &CmdArgs,
264 const InputInfo &Output,
265 const InputInfoList &Inputs) const {
Daniel Dunbard067f7f2009-04-08 23:54:23 +0000266 Arg *A;
Daniel Dunbar367dbb92009-06-08 21:48:20 +0000267
Daniel Dunbar64198ef2009-09-10 01:21:05 +0000268 CheckPreprocessingOptions(D, Args);
269
270 Args.AddLastArg(CmdArgs, options::OPT_C);
271 Args.AddLastArg(CmdArgs, options::OPT_CC);
Daniel Dunbar367dbb92009-06-08 21:48:20 +0000272
273 // Handle dependency file generation.
Daniel Dunbar86aed7d2010-12-08 21:33:40 +0000274 if ((A = Args.getLastArg(options::OPT_M, options::OPT_MM)) ||
Daniel Dunbard067f7f2009-04-08 23:54:23 +0000275 (A = Args.getLastArg(options::OPT_MD)) ||
276 (A = Args.getLastArg(options::OPT_MMD))) {
277 // Determine the output location.
278 const char *DepFile;
Benjamin Kramer2715fce2012-09-26 19:01:49 +0000279 if (Arg *MF = Args.getLastArg(options::OPT_MF)) {
Richard Smithbd55daf2012-11-01 04:30:05 +0000280 DepFile = MF->getValue();
Chad Rosier633dcdc2013-01-24 19:14:47 +0000281 C.addFailureResultFile(DepFile, &JA);
Benjamin Kramer2715fce2012-09-26 19:01:49 +0000282 } else if (Output.getType() == types::TY_Dependencies) {
283 DepFile = Output.getFilename();
Daniel Dunbar0bfb21e2009-11-19 03:26:40 +0000284 } else if (A->getOption().matches(options::OPT_M) ||
285 A->getOption().matches(options::OPT_MM)) {
Daniel Dunbard067f7f2009-04-08 23:54:23 +0000286 DepFile = "-";
287 } else {
Bob Wilsondecc03e2012-11-23 06:14:39 +0000288 DepFile = getDependencyFileName(Args, Inputs);
Chad Rosier633dcdc2013-01-24 19:14:47 +0000289 C.addFailureResultFile(DepFile, &JA);
Daniel Dunbard067f7f2009-04-08 23:54:23 +0000290 }
291 CmdArgs.push_back("-dependency-file");
292 CmdArgs.push_back(DepFile);
293
Chris Lattnerbf2803f2010-03-29 17:55:58 +0000294 // Add a default target if one wasn't specified.
Daniel Dunbard067f7f2009-04-08 23:54:23 +0000295 if (!Args.hasArg(options::OPT_MT) && !Args.hasArg(options::OPT_MQ)) {
296 const char *DepTarget;
297
298 // If user provided -o, that is the dependency target, except
299 // when we are only generating a dependency file.
300 Arg *OutputOpt = Args.getLastArg(options::OPT_o);
301 if (OutputOpt && Output.getType() != types::TY_Dependencies) {
Richard Smithbd55daf2012-11-01 04:30:05 +0000302 DepTarget = OutputOpt->getValue();
Daniel Dunbard067f7f2009-04-08 23:54:23 +0000303 } else {
304 // Otherwise derive from the base input.
305 //
306 // FIXME: This should use the computed output file location.
Dylan Noblesmith2c1dd272012-02-05 02:13:05 +0000307 SmallString<128> P(Inputs[0].getBaseInput());
Michael J. Spencere1696752010-12-18 00:19:12 +0000308 llvm::sys::path::replace_extension(P, "o");
309 DepTarget = Args.MakeArgString(llvm::sys::path::filename(P));
Daniel Dunbard067f7f2009-04-08 23:54:23 +0000310 }
311
312 CmdArgs.push_back("-MT");
Dylan Noblesmith2c1dd272012-02-05 02:13:05 +0000313 SmallString<128> Quoted;
Chris Lattnerbf2803f2010-03-29 17:55:58 +0000314 QuoteTarget(DepTarget, Quoted);
315 CmdArgs.push_back(Args.MakeArgString(Quoted));
Daniel Dunbard067f7f2009-04-08 23:54:23 +0000316 }
317
Daniel Dunbar0bfb21e2009-11-19 03:26:40 +0000318 if (A->getOption().matches(options::OPT_M) ||
319 A->getOption().matches(options::OPT_MD))
Daniel Dunbard067f7f2009-04-08 23:54:23 +0000320 CmdArgs.push_back("-sys-header-deps");
Argyrios Kyrtzidis6d0753d2014-03-14 03:07:38 +0000321
322 if (isa<PrecompileJobAction>(JA))
323 CmdArgs.push_back("-module-file-deps");
Daniel Dunbard067f7f2009-04-08 23:54:23 +0000324 }
325
Peter Collingbourne77b0e7f22011-07-12 19:35:15 +0000326 if (Args.hasArg(options::OPT_MG)) {
327 if (!A || A->getOption().matches(options::OPT_MD) ||
328 A->getOption().matches(options::OPT_MMD))
Chris Lattner0e62c1c2011-07-23 10:55:15 +0000329 D.Diag(diag::err_drv_mg_requires_m_or_mm);
Peter Collingbourne77b0e7f22011-07-12 19:35:15 +0000330 CmdArgs.push_back("-MG");
331 }
332
Daniel Dunbard067f7f2009-04-08 23:54:23 +0000333 Args.AddLastArg(CmdArgs, options::OPT_MP);
Chris Lattnerbf2803f2010-03-29 17:55:58 +0000334
335 // Convert all -MQ <target> args to -MT <quoted target>
336 for (arg_iterator it = Args.filtered_begin(options::OPT_MT,
337 options::OPT_MQ),
338 ie = Args.filtered_end(); it != ie; ++it) {
Daniel Dunbara442fd52010-06-11 22:00:13 +0000339 const Arg *A = *it;
340 A->claim();
Chris Lattnerbf2803f2010-03-29 17:55:58 +0000341
Daniel Dunbara442fd52010-06-11 22:00:13 +0000342 if (A->getOption().matches(options::OPT_MQ)) {
Chris Lattnerbf2803f2010-03-29 17:55:58 +0000343 CmdArgs.push_back("-MT");
Dylan Noblesmith2c1dd272012-02-05 02:13:05 +0000344 SmallString<128> Quoted;
Richard Smithbd55daf2012-11-01 04:30:05 +0000345 QuoteTarget(A->getValue(), Quoted);
Chris Lattnerbf2803f2010-03-29 17:55:58 +0000346 CmdArgs.push_back(Args.MakeArgString(Quoted));
347
348 // -MT flag - no change
349 } else {
Daniel Dunbara442fd52010-06-11 22:00:13 +0000350 A->render(Args, CmdArgs);
Chris Lattnerbf2803f2010-03-29 17:55:58 +0000351 }
352 }
Daniel Dunbard067f7f2009-04-08 23:54:23 +0000353
Douglas Gregor111af7d2009-04-18 00:34:01 +0000354 // Add -i* options, and automatically translate to
355 // -include-pch/-include-pth for transparent PCH support. It's
356 // wonky, but we include looking for .gch so we can support seamless
357 // replacement into a build system already set up to be generating
358 // .gch files.
Argyrios Kyrtzidis2f23b412010-09-30 16:53:47 +0000359 bool RenderedImplicitInclude = false;
Daniel Dunbar44b36ee2009-11-25 11:53:23 +0000360 for (arg_iterator it = Args.filtered_begin(options::OPT_clang_i_Group),
361 ie = Args.filtered_end(); it != ie; ++it) {
362 const Arg *A = it;
Daniel Dunbard067f7f2009-04-08 23:54:23 +0000363
364 if (A->getOption().matches(options::OPT_include)) {
Argyrios Kyrtzidis2f23b412010-09-30 16:53:47 +0000365 bool IsFirstImplicitInclude = !RenderedImplicitInclude;
366 RenderedImplicitInclude = true;
367
Argyrios Kyrtzidis90bdfbb2010-08-11 23:27:58 +0000368 // Use PCH if the user requested it.
Daniel Dunbarcbc34b72009-10-15 20:02:44 +0000369 bool UsePCH = D.CCCUsePCH;
Daniel Dunbarcbc34b72009-10-15 20:02:44 +0000370
Daniel Dunbard067f7f2009-04-08 23:54:23 +0000371 bool FoundPTH = false;
Douglas Gregor111af7d2009-04-18 00:34:01 +0000372 bool FoundPCH = false;
Rafael Espindola00eaafd2013-06-25 15:03:59 +0000373 SmallString<128> P(A->getValue());
374 // We want the files to have a name like foo.h.pch. Add a dummy extension
375 // so that replace_extension does the right thing.
376 P += ".dummy";
Daniel Dunbarcbc34b72009-10-15 20:02:44 +0000377 if (UsePCH) {
Rafael Espindola00eaafd2013-06-25 15:03:59 +0000378 llvm::sys::path::replace_extension(P, "pch");
Rafael Espindola54bbaad2013-06-25 14:48:00 +0000379 if (llvm::sys::fs::exists(P.str()))
Douglas Gregor111af7d2009-04-18 00:34:01 +0000380 FoundPCH = true;
Daniel Dunbard067f7f2009-04-08 23:54:23 +0000381 }
382
Douglas Gregor111af7d2009-04-18 00:34:01 +0000383 if (!FoundPCH) {
Rafael Espindola00eaafd2013-06-25 15:03:59 +0000384 llvm::sys::path::replace_extension(P, "pth");
Rafael Espindola54bbaad2013-06-25 14:48:00 +0000385 if (llvm::sys::fs::exists(P.str()))
Douglas Gregor111af7d2009-04-18 00:34:01 +0000386 FoundPTH = true;
Mike Stump11289f42009-09-09 15:08:12 +0000387 }
388
Douglas Gregor111af7d2009-04-18 00:34:01 +0000389 if (!FoundPCH && !FoundPTH) {
Rafael Espindola00eaafd2013-06-25 15:03:59 +0000390 llvm::sys::path::replace_extension(P, "gch");
Rafael Espindola54bbaad2013-06-25 14:48:00 +0000391 if (llvm::sys::fs::exists(P.str())) {
Daniel Dunbarcbc34b72009-10-15 20:02:44 +0000392 FoundPCH = UsePCH;
393 FoundPTH = !UsePCH;
Douglas Gregor111af7d2009-04-18 00:34:01 +0000394 }
Douglas Gregor111af7d2009-04-18 00:34:01 +0000395 }
396
397 if (FoundPCH || FoundPTH) {
Argyrios Kyrtzidis2f23b412010-09-30 16:53:47 +0000398 if (IsFirstImplicitInclude) {
399 A->claim();
400 if (UsePCH)
401 CmdArgs.push_back("-include-pch");
402 else
403 CmdArgs.push_back("-include-pth");
404 CmdArgs.push_back(Args.MakeArgString(P.str()));
405 continue;
406 } else {
407 // Ignore the PCH if not first on command line and emit warning.
Chris Lattner0e62c1c2011-07-23 10:55:15 +0000408 D.Diag(diag::warn_drv_pch_not_first_include)
Argyrios Kyrtzidis2f23b412010-09-30 16:53:47 +0000409 << P.str() << A->getAsString(Args);
410 }
Daniel Dunbard067f7f2009-04-08 23:54:23 +0000411 }
412 }
413
414 // Not translated, render as usual.
415 A->claim();
416 A->render(Args, CmdArgs);
417 }
418
419 Args.AddAllArgs(CmdArgs, options::OPT_D, options::OPT_U);
Douglas Gregor9f93e382011-07-28 04:45:53 +0000420 Args.AddAllArgs(CmdArgs, options::OPT_I_Group, options::OPT_F,
421 options::OPT_index_header_map);
Daniel Dunbard067f7f2009-04-08 23:54:23 +0000422
423 // Add -Wp, and -Xassembler if using the preprocessor.
424
425 // FIXME: There is a very unfortunate problem here, some troubled
426 // souls abuse -Wp, to pass preprocessor options in gcc syntax. To
427 // really support that we would have to parse and then translate
428 // those options. :(
429 Args.AddAllArgValues(CmdArgs, options::OPT_Wp_COMMA,
430 options::OPT_Xpreprocessor);
Daniel Dunbar38b62792009-10-29 01:53:44 +0000431
432 // -I- is a deprecated GCC feature, reject it.
433 if (Arg *A = Args.getLastArg(options::OPT_I_))
Chris Lattner0e62c1c2011-07-23 10:55:15 +0000434 D.Diag(diag::err_drv_I_dash_not_supported) << A->getAsString(Args);
Chandler Carruth24e17e12010-10-20 07:00:47 +0000435
436 // If we have a --sysroot, and don't have an explicit -isysroot flag, add an
437 // -isysroot to the CC1 invocation.
Sebastian Pop980920a2012-04-16 04:16:43 +0000438 StringRef sysroot = C.getSysRoot();
439 if (sysroot != "") {
Chandler Carruth24e17e12010-10-20 07:00:47 +0000440 if (!Args.hasArg(options::OPT_isysroot)) {
441 CmdArgs.push_back("-isysroot");
Sebastian Pop980920a2012-04-16 04:16:43 +0000442 CmdArgs.push_back(C.getArgs().MakeArgString(sysroot));
Chandler Carruth24e17e12010-10-20 07:00:47 +0000443 }
444 }
Douglas Gregor5dc38992013-02-07 00:21:12 +0000445
Benjamin Kramer8404eb02011-09-22 21:41:16 +0000446 // Parse additional include paths from environment variables.
Chandler Carruth9802c142011-11-04 07:12:58 +0000447 // FIXME: We should probably sink the logic for handling these from the
448 // frontend into the driver. It will allow deleting 4 otherwise unused flags.
Benjamin Kramer8404eb02011-09-22 21:41:16 +0000449 // CPATH - included following the user specified includes (but prior to
450 // builtin and standard includes).
Bill Wendlingc0938f32012-03-12 22:10:06 +0000451 addDirectoryList(Args, CmdArgs, "-I", "CPATH");
Benjamin Kramer8404eb02011-09-22 21:41:16 +0000452 // C_INCLUDE_PATH - system includes enabled when compiling C.
Bill Wendlingc0938f32012-03-12 22:10:06 +0000453 addDirectoryList(Args, CmdArgs, "-c-isystem", "C_INCLUDE_PATH");
Benjamin Kramer8404eb02011-09-22 21:41:16 +0000454 // CPLUS_INCLUDE_PATH - system includes enabled when compiling C++.
Bill Wendlingc0938f32012-03-12 22:10:06 +0000455 addDirectoryList(Args, CmdArgs, "-cxx-isystem", "CPLUS_INCLUDE_PATH");
Benjamin Kramer8404eb02011-09-22 21:41:16 +0000456 // OBJC_INCLUDE_PATH - system includes enabled when compiling ObjC.
Bill Wendlingc0938f32012-03-12 22:10:06 +0000457 addDirectoryList(Args, CmdArgs, "-objc-isystem", "OBJC_INCLUDE_PATH");
Benjamin Kramer8404eb02011-09-22 21:41:16 +0000458 // OBJCPLUS_INCLUDE_PATH - system includes enabled when compiling ObjC++.
Bill Wendlingc0938f32012-03-12 22:10:06 +0000459 addDirectoryList(Args, CmdArgs, "-objcxx-isystem", "OBJCPLUS_INCLUDE_PATH");
Chandler Carruth6bfd84f2011-11-04 07:12:53 +0000460
Chandler Carruth6bfd84f2011-11-04 07:12:53 +0000461 // Add C++ include arguments, if needed.
Chandler Carruth4c81dfa2011-11-04 07:43:33 +0000462 if (types::isCXX(Inputs[0].getType()))
Chandler Carruth491db322011-11-04 07:34:47 +0000463 getToolChain().AddClangCXXStdlibIncludeArgs(Args, CmdArgs);
Chandler Carrutha796f532011-11-05 20:17:13 +0000464
465 // Add system include arguments.
466 getToolChain().AddClangSystemIncludeArgs(Args, CmdArgs);
Daniel Dunbard067f7f2009-04-08 23:54:23 +0000467}
468
Daniel Dunbard609b7b2009-11-17 06:37:03 +0000469// FIXME: Move to target hook.
470static bool isSignedCharDefault(const llvm::Triple &Triple) {
471 switch (Triple.getArch()) {
472 default:
473 return true;
474
Tim Northover9bb857a2013-01-31 12:13:10 +0000475 case llvm::Triple::aarch64:
Christian Pirker9b019ae2014-02-25 13:51:00 +0000476 case llvm::Triple::aarch64_be:
Jim Grosbach7c2c6642011-05-24 15:40:46 +0000477 case llvm::Triple::arm:
Christian Pirkerf01cd6f2014-03-28 14:40:46 +0000478 case llvm::Triple::armeb:
Oliver Stannardabed2ee2014-10-24 11:28:47 +0000479 case llvm::Triple::thumb:
480 case llvm::Triple::thumbeb:
Saleem Abdulrasoolf4c9e492014-04-04 20:31:19 +0000481 if (Triple.isOSDarwin() || Triple.isOSWindows())
482 return true;
483 return false;
484
Daniel Dunbard609b7b2009-11-17 06:37:03 +0000485 case llvm::Triple::ppc:
486 case llvm::Triple::ppc64:
Jonathan Roelofs2cea1be2014-02-12 03:21:20 +0000487 if (Triple.isOSDarwin())
Daniel Dunbard609b7b2009-11-17 06:37:03 +0000488 return true;
489 return false;
Ulrich Weigand47445072013-05-06 16:26:41 +0000490
Bill Schmidt778d3872013-07-26 01:36:11 +0000491 case llvm::Triple::ppc64le:
Ulrich Weigand47445072013-05-06 16:26:41 +0000492 case llvm::Triple::systemz:
Robert Lytton0e076492013-08-13 09:43:10 +0000493 case llvm::Triple::xcore:
Ulrich Weigand47445072013-05-06 16:26:41 +0000494 return false;
Daniel Dunbard609b7b2009-11-17 06:37:03 +0000495 }
496}
497
Robert Lytton0e076492013-08-13 09:43:10 +0000498static bool isNoCommonDefault(const llvm::Triple &Triple) {
499 switch (Triple.getArch()) {
500 default:
501 return false;
502
503 case llvm::Triple::xcore:
504 return true;
505 }
506}
507
Silviu Barangaf9671dd2013-10-21 10:54:53 +0000508// Handle -mhwdiv=.
509static void getARMHWDivFeatures(const Driver &D, const Arg *A,
510 const ArgList &Args,
511 std::vector<const char *> &Features) {
512 StringRef HWDiv = A->getValue();
513 if (HWDiv == "arm") {
514 Features.push_back("+hwdiv-arm");
515 Features.push_back("-hwdiv");
516 } else if (HWDiv == "thumb") {
517 Features.push_back("-hwdiv-arm");
518 Features.push_back("+hwdiv");
519 } else if (HWDiv == "arm,thumb" || HWDiv == "thumb,arm") {
520 Features.push_back("+hwdiv-arm");
521 Features.push_back("+hwdiv");
522 } else if (HWDiv == "none") {
523 Features.push_back("-hwdiv-arm");
524 Features.push_back("-hwdiv");
525 } else
526 D.Diag(diag::err_drv_clang_unsupported) << A->getAsString(Args);
527}
Reid Kleckner0290c9c2014-09-15 17:45:39 +0000528
Amara Emerson4cdb87b2013-10-01 10:20:54 +0000529// Handle -mfpu=.
530//
531// FIXME: Centralize feature selection, defaulting shouldn't be also in the
532// frontend target.
533static void getARMFPUFeatures(const Driver &D, const Arg *A,
534 const ArgList &Args,
535 std::vector<const char *> &Features) {
Richard Smithbd55daf2012-11-01 04:30:05 +0000536 StringRef FPU = A->getValue();
Chad Rosiercfbfc582012-04-04 20:51:35 +0000537
538 // Set the target features based on the FPU.
539 if (FPU == "fpa" || FPU == "fpe2" || FPU == "fpe3" || FPU == "maverick") {
540 // Disable any default FPU support.
Rafael Espindola28e1f4b2013-08-21 16:39:20 +0000541 Features.push_back("-vfp2");
542 Features.push_back("-vfp3");
543 Features.push_back("-neon");
Artyom Skrobov53b000a82013-11-21 14:04:38 +0000544 } else if (FPU == "vfp") {
545 Features.push_back("+vfp2");
546 Features.push_back("-neon");
Chad Rosiercfbfc582012-04-04 20:51:35 +0000547 } else if (FPU == "vfp3-d16" || FPU == "vfpv3-d16") {
Rafael Espindola28e1f4b2013-08-21 16:39:20 +0000548 Features.push_back("+vfp3");
549 Features.push_back("+d16");
550 Features.push_back("-neon");
Chad Rosiercfbfc582012-04-04 20:51:35 +0000551 } else if (FPU == "vfp3" || FPU == "vfpv3") {
Rafael Espindola28e1f4b2013-08-21 16:39:20 +0000552 Features.push_back("+vfp3");
553 Features.push_back("-neon");
Artyom Skrobov53b000a82013-11-21 14:04:38 +0000554 } else if (FPU == "vfp4-d16" || FPU == "vfpv4-d16") {
555 Features.push_back("+vfp4");
556 Features.push_back("+d16");
557 Features.push_back("-neon");
558 } else if (FPU == "vfp4" || FPU == "vfpv4") {
559 Features.push_back("+vfp4");
560 Features.push_back("-neon");
Oliver Stannard96601ca2014-02-21 10:39:15 +0000561 } else if (FPU == "fp4-sp-d16" || FPU == "fpv4-sp-d16") {
562 Features.push_back("+vfp4");
563 Features.push_back("+d16");
564 Features.push_back("+fp-only-sp");
565 Features.push_back("-neon");
Oliver Stannardbfd3ea32014-10-01 09:03:02 +0000566 } else if (FPU == "fp5-sp-d16" || FPU == "fpv5-sp-d16") {
567 Features.push_back("+fp-armv8");
568 Features.push_back("+fp-only-sp");
569 Features.push_back("+d16");
570 Features.push_back("-neon");
571 Features.push_back("-crypto");
572 } else if (FPU == "fp5-dp-d16" || FPU == "fpv5-dp-d16" ||
573 FPU == "fp5-d16" || FPU == "fpv5-d16") {
574 Features.push_back("+fp-armv8");
575 Features.push_back("+d16");
576 Features.push_back("-neon");
577 Features.push_back("-crypto");
Joey Gouly7db275b2013-06-27 13:19:54 +0000578 } else if (FPU == "fp-armv8") {
Joey Goulybe8c2732013-09-13 13:48:33 +0000579 Features.push_back("+fp-armv8");
Bernard Ogdenda13af32013-10-24 18:32:51 +0000580 Features.push_back("-neon");
581 Features.push_back("-crypto");
Joey Gouly7db275b2013-06-27 13:19:54 +0000582 } else if (FPU == "neon-fp-armv8") {
Joey Goulybe8c2732013-09-13 13:48:33 +0000583 Features.push_back("+fp-armv8");
Rafael Espindola28e1f4b2013-08-21 16:39:20 +0000584 Features.push_back("+neon");
Bernard Ogdenda13af32013-10-24 18:32:51 +0000585 Features.push_back("-crypto");
Amara Emersonfc362c62013-09-19 13:54:03 +0000586 } else if (FPU == "crypto-neon-fp-armv8") {
Amara Emersonfc362c62013-09-19 13:54:03 +0000587 Features.push_back("+fp-armv8");
Bernard Ogdenda13af32013-10-24 18:32:51 +0000588 Features.push_back("+neon");
589 Features.push_back("+crypto");
Chad Rosiercfbfc582012-04-04 20:51:35 +0000590 } else if (FPU == "neon") {
Rafael Espindola28e1f4b2013-08-21 16:39:20 +0000591 Features.push_back("+neon");
Richard Barton3b0dcc12014-11-28 20:39:59 +0000592 } else if (FPU == "neon-vfpv3") {
Richard Barton2c5a8972014-12-18 16:31:18 +0000593 Features.push_back("+vfp3");
Richard Barton3b0dcc12014-11-28 20:39:59 +0000594 Features.push_back("+neon");
Richard Barton09b60b22014-11-28 20:39:54 +0000595 } else if (FPU == "neon-vfpv4") {
596 Features.push_back("+neon");
Richard Barton2c5a8972014-12-18 16:31:18 +0000597 Features.push_back("+vfp4");
Amara Emerson4cdb87b2013-10-01 10:20:54 +0000598 } else if (FPU == "none") {
599 Features.push_back("-vfp2");
600 Features.push_back("-vfp3");
601 Features.push_back("-vfp4");
602 Features.push_back("-fp-armv8");
603 Features.push_back("-crypto");
604 Features.push_back("-neon");
Chad Rosiercfbfc582012-04-04 20:51:35 +0000605 } else
606 D.Diag(diag::err_drv_clang_unsupported) << A->getAsString(Args);
607}
608
Asiri Rathnayake9e3c7cb2014-10-03 09:11:41 +0000609// Select the float ABI as determined by -msoft-float, -mhard-float, and
610// -mfloat-abi=.
Tim Northover9c7e0352013-12-12 11:55:52 +0000611StringRef tools::arm::getARMFloatABI(const Driver &D, const ArgList &Args,
Asiri Rathnayake9e3c7cb2014-10-03 09:11:41 +0000612 const llvm::Triple &Triple) {
Chris Lattner0e62c1c2011-07-23 10:55:15 +0000613 StringRef FloatABI;
Asiri Rathnayake9e3c7cb2014-10-03 09:11:41 +0000614 if (Arg *A = Args.getLastArg(options::OPT_msoft_float,
615 options::OPT_mhard_float,
616 options::OPT_mfloat_abi_EQ)) {
Daniel Dunbar78485922009-09-10 23:00:09 +0000617 if (A->getOption().matches(options::OPT_msoft_float))
618 FloatABI = "soft";
619 else if (A->getOption().matches(options::OPT_mhard_float))
620 FloatABI = "hard";
621 else {
Richard Smithbd55daf2012-11-01 04:30:05 +0000622 FloatABI = A->getValue();
Daniel Dunbar78485922009-09-10 23:00:09 +0000623 if (FloatABI != "soft" && FloatABI != "softfp" && FloatABI != "hard") {
Chris Lattner0e62c1c2011-07-23 10:55:15 +0000624 D.Diag(diag::err_drv_invalid_mfloat_abi)
Daniel Dunbar78485922009-09-10 23:00:09 +0000625 << A->getAsString(Args);
626 FloatABI = "soft";
627 }
628 }
629 }
630
631 // If unspecified, choose the default based on the platform.
632 if (FloatABI.empty()) {
Rafael Espindola0e1fb4f2010-06-28 17:18:09 +0000633 switch (Triple.getOS()) {
Bob Wilson6524dd32011-10-14 05:03:44 +0000634 case llvm::Triple::Darwin:
635 case llvm::Triple::MacOSX:
636 case llvm::Triple::IOS: {
Daniel Dunbar78485922009-09-10 23:00:09 +0000637 // Darwin defaults to "softfp" for v6 and v7.
638 //
639 // FIXME: Factor out an ARM class so we can cache the arch somewhere.
Benjamin Kramer09811c72012-06-26 22:20:06 +0000640 std::string ArchName =
Bernard Ogden31561762013-12-12 13:27:11 +0000641 arm::getLLVMArchSuffixForARM(arm::getARMTargetCPU(Args, Triple));
Benjamin Kramer09811c72012-06-26 22:20:06 +0000642 if (StringRef(ArchName).startswith("v6") ||
643 StringRef(ArchName).startswith("v7"))
Daniel Dunbar78485922009-09-10 23:00:09 +0000644 FloatABI = "softfp";
645 else
646 FloatABI = "soft";
647 break;
648 }
649
Saleem Abdulrasoolf4c9e492014-04-04 20:31:19 +0000650 // FIXME: this is invalid for WindowsCE
651 case llvm::Triple::Win32:
652 FloatABI = "hard";
653 break;
654
Rafael Espindola0f207ed2012-12-13 04:17:14 +0000655 case llvm::Triple::FreeBSD:
Renato Golinf4421f72014-02-19 10:44:07 +0000656 switch(Triple.getEnvironment()) {
657 case llvm::Triple::GNUEABIHF:
658 FloatABI = "hard";
659 break;
660 default:
661 // FreeBSD defaults to soft float
662 FloatABI = "soft";
663 break;
664 }
Rafael Espindola0f207ed2012-12-13 04:17:14 +0000665 break;
666
Daniel Dunbar78485922009-09-10 23:00:09 +0000667 default:
Bob Wilsond1447c42011-02-04 17:59:28 +0000668 switch(Triple.getEnvironment()) {
Jiangning Liu61b06cb2012-07-31 08:06:29 +0000669 case llvm::Triple::GNUEABIHF:
670 FloatABI = "hard";
671 break;
Bob Wilsond1447c42011-02-04 17:59:28 +0000672 case llvm::Triple::GNUEABI:
673 FloatABI = "softfp";
674 break;
Joerg Sonnenbergerd75a1f82013-12-16 19:16:04 +0000675 case llvm::Triple::EABIHF:
676 FloatABI = "hard";
677 break;
Bob Wilsond1447c42011-02-04 17:59:28 +0000678 case llvm::Triple::EABI:
679 // EABI is always AAPCS, and if it was not marked 'hard', it's softfp
680 FloatABI = "softfp";
681 break;
Logan Chienc6fd8202012-09-02 09:30:11 +0000682 case llvm::Triple::Android: {
Benjamin Kramer09811c72012-06-26 22:20:06 +0000683 std::string ArchName =
Bernard Ogden31561762013-12-12 13:27:11 +0000684 arm::getLLVMArchSuffixForARM(arm::getARMTargetCPU(Args, Triple));
Benjamin Kramer09811c72012-06-26 22:20:06 +0000685 if (StringRef(ArchName).startswith("v7"))
Chandler Carruthc89aa9d2012-01-10 19:47:42 +0000686 FloatABI = "softfp";
687 else
688 FloatABI = "soft";
689 break;
690 }
Bob Wilsond1447c42011-02-04 17:59:28 +0000691 default:
692 // Assume "soft", but warn the user we are guessing.
693 FloatABI = "soft";
Saleem Abdulrasool377066a2014-03-27 22:50:18 +0000694 if (Triple.getOS() != llvm::Triple::UnknownOS ||
695 !Triple.isOSBinFormatMachO())
696 D.Diag(diag::warn_drv_assuming_mfloat_abi_is) << "soft";
Bob Wilsond1447c42011-02-04 17:59:28 +0000697 break;
698 }
Daniel Dunbar78485922009-09-10 23:00:09 +0000699 }
700 }
701
Anton Korobeynikova29e4622012-04-09 13:38:30 +0000702 return FloatABI;
703}
704
Rafael Espindola28e1f4b2013-08-21 16:39:20 +0000705static void getARMTargetFeatures(const Driver &D, const llvm::Triple &Triple,
706 const ArgList &Args,
Rafael Espindola9c6fb0f2013-11-23 14:36:40 +0000707 std::vector<const char *> &Features,
708 bool ForAS) {
Asiri Rathnayake9e3c7cb2014-10-03 09:11:41 +0000709 StringRef FloatABI = tools::arm::getARMFloatABI(D, Args, Triple);
Rafael Espindola9c6fb0f2013-11-23 14:36:40 +0000710 if (!ForAS) {
711 // FIXME: Note, this is a hack, the LLVM backend doesn't actually use these
712 // yet (it uses the -mfloat-abi and -msoft-float options), and it is
713 // stripped out by the ARM target. We should probably pass this a new
714 // -target-option, which is handled by the -cc1/-cc1as invocation.
715 //
716 // FIXME2: For consistency, it would be ideal if we set up the target
717 // machine state the same when using the frontend or the assembler. We don't
718 // currently do that for the assembler, we pass the options directly to the
719 // backend and never even instantiate the frontend TargetInfo. If we did,
720 // and used its handleTargetFeatures hook, then we could ensure the
721 // assembler and the frontend behave the same.
Rafael Espindola28e1f4b2013-08-21 16:39:20 +0000722
Rafael Espindola9c6fb0f2013-11-23 14:36:40 +0000723 // Use software floating point operations?
724 if (FloatABI == "soft")
725 Features.push_back("+soft-float");
726
727 // Use software floating point argument passing?
728 if (FloatABI != "hard")
729 Features.push_back("+soft-float-abi");
730 }
Rafael Espindola28e1f4b2013-08-21 16:39:20 +0000731
732 // Honor -mfpu=.
733 if (const Arg *A = Args.getLastArg(options::OPT_mfpu_EQ))
Amara Emerson4cdb87b2013-10-01 10:20:54 +0000734 getARMFPUFeatures(D, A, Args, Features);
Silviu Barangaf9671dd2013-10-21 10:54:53 +0000735 if (const Arg *A = Args.getLastArg(options::OPT_mhwdiv_EQ))
736 getARMHWDivFeatures(D, A, Args, Features);
Rafael Espindola28e1f4b2013-08-21 16:39:20 +0000737
Rafael Espindola28e1f4b2013-08-21 16:39:20 +0000738 // Setting -msoft-float effectively disables NEON because of the GCC
739 // implementation, although the same isn't true of VFP or VFP3.
Amara Emersonecbe18e2014-02-12 10:22:35 +0000740 if (FloatABI == "soft") {
Rafael Espindola28e1f4b2013-08-21 16:39:20 +0000741 Features.push_back("-neon");
Amara Emersonecbe18e2014-02-12 10:22:35 +0000742 // Also need to explicitly disable features which imply NEON.
743 Features.push_back("-crypto");
744 }
Bernard Ogden18b57012013-10-29 09:47:51 +0000745
746 // En/disable crc
747 if (Arg *A = Args.getLastArg(options::OPT_mcrc,
748 options::OPT_mnocrc)) {
749 if (A->getOption().matches(options::OPT_mcrc))
750 Features.push_back("+crc");
751 else
752 Features.push_back("-crc");
753 }
Rafael Espindola28e1f4b2013-08-21 16:39:20 +0000754}
Anton Korobeynikova29e4622012-04-09 13:38:30 +0000755
756void Clang::AddARMTargetArgs(const ArgList &Args,
757 ArgStringList &CmdArgs,
758 bool KernelOrKext) const {
759 const Driver &D = getToolChain().getDriver();
Daniel Dunbarbd847cc2012-10-15 22:23:53 +0000760 // Get the effective triple, which takes into account the deployment target.
761 std::string TripleStr = getToolChain().ComputeEffectiveClangTriple(Args);
762 llvm::Triple Triple(TripleStr);
Bernard Ogden31561762013-12-12 13:27:11 +0000763 std::string CPUName = arm::getARMTargetCPU(Args, Triple);
Anton Korobeynikova29e4622012-04-09 13:38:30 +0000764
765 // Select the ABI to use.
766 //
767 // FIXME: Support -meabi.
Eric Christopher52276532014-12-10 22:58:34 +0000768 // FIXME: Parts of this are duplicated in the backend, unify this somehow.
Craig Topper92fc2df2014-05-17 16:56:41 +0000769 const char *ABIName = nullptr;
Anton Korobeynikova29e4622012-04-09 13:38:30 +0000770 if (Arg *A = Args.getLastArg(options::OPT_mabi_EQ)) {
Richard Smithbd55daf2012-11-01 04:30:05 +0000771 ABIName = A->getValue();
Tim Northovere5c6f4c2014-05-22 12:54:30 +0000772 } else if (Triple.isOSBinFormatMachO()) {
Daniel Dunbar5f18f6e2012-10-22 18:30:51 +0000773 // The backend is hardwired to assume AAPCS for M-class processors, ensure
774 // the frontend matches that.
Tim Northovere66c9462013-10-03 14:23:28 +0000775 if (Triple.getEnvironment() == llvm::Triple::EABI ||
Eric Christopher610952e2014-12-05 00:22:48 +0000776 Triple.getOS() == llvm::Triple::UnknownOS ||
Tim Northovere66c9462013-10-03 14:23:28 +0000777 StringRef(CPUName).startswith("cortex-m")) {
Daniel Dunbar5f18f6e2012-10-22 18:30:51 +0000778 ABIName = "aapcs";
779 } else {
780 ABIName = "apcs-gnu";
781 }
Saleem Abdulrasoolf4c9e492014-04-04 20:31:19 +0000782 } else if (Triple.isOSWindows()) {
783 // FIXME: this is invalid for WindowsCE
784 ABIName = "aapcs";
Anton Korobeynikova29e4622012-04-09 13:38:30 +0000785 } else {
786 // Select the default based on the platform.
787 switch(Triple.getEnvironment()) {
Logan Chienc6fd8202012-09-02 09:30:11 +0000788 case llvm::Triple::Android:
Anton Korobeynikova29e4622012-04-09 13:38:30 +0000789 case llvm::Triple::GNUEABI:
Jiangning Liu61b06cb2012-07-31 08:06:29 +0000790 case llvm::Triple::GNUEABIHF:
Anton Korobeynikova29e4622012-04-09 13:38:30 +0000791 ABIName = "aapcs-linux";
792 break;
Joerg Sonnenbergerd75a1f82013-12-16 19:16:04 +0000793 case llvm::Triple::EABIHF:
Anton Korobeynikova29e4622012-04-09 13:38:30 +0000794 case llvm::Triple::EABI:
795 ABIName = "aapcs";
796 break;
Oliver Stannardec8b6b32014-09-04 10:38:53 +0000797 default:
Eric Christopher7a8b31d2014-12-18 02:08:51 +0000798 if (Triple.getOS() == llvm::Triple::NetBSD)
799 ABIName = "apcs-gnu";
800 else
801 ABIName = "aapcs";
Oliver Stannardec8b6b32014-09-04 10:38:53 +0000802 break;
Anton Korobeynikova29e4622012-04-09 13:38:30 +0000803 }
804 }
805 CmdArgs.push_back("-target-abi");
806 CmdArgs.push_back(ABIName);
807
Anton Korobeynikova29e4622012-04-09 13:38:30 +0000808 // Determine floating point ABI from the options & target defaults.
Tim Northover9c7e0352013-12-12 11:55:52 +0000809 StringRef FloatABI = tools::arm::getARMFloatABI(D, Args, Triple);
Daniel Dunbar78485922009-09-10 23:00:09 +0000810 if (FloatABI == "soft") {
811 // Floating point operations and argument passing are soft.
812 //
813 // FIXME: This changes CPP defines, we need -target-soft-float.
Daniel Dunbara74f8ff2009-11-30 08:42:00 +0000814 CmdArgs.push_back("-msoft-float");
Daniel Dunbar6cc525b2009-12-08 19:49:51 +0000815 CmdArgs.push_back("-mfloat-abi");
816 CmdArgs.push_back("soft");
Daniel Dunbar78485922009-09-10 23:00:09 +0000817 } else if (FloatABI == "softfp") {
818 // Floating point operations are hard, but argument passing is soft.
Daniel Dunbar6cc525b2009-12-08 19:49:51 +0000819 CmdArgs.push_back("-mfloat-abi");
820 CmdArgs.push_back("soft");
Daniel Dunbar78485922009-09-10 23:00:09 +0000821 } else {
822 // Floating point operations and argument passing are hard.
823 assert(FloatABI == "hard" && "Invalid float abi!");
Daniel Dunbar6cc525b2009-12-08 19:49:51 +0000824 CmdArgs.push_back("-mfloat-abi");
825 CmdArgs.push_back("hard");
Daniel Dunbar78485922009-09-10 23:00:09 +0000826 }
Daniel Dunbar893d4752009-12-19 04:15:38 +0000827
Daniel Dunbarc9388c12011-03-17 17:10:06 +0000828 // Kernel code has more strict alignment requirements.
829 if (KernelOrKext) {
Cameron Esfahani556d91e2013-09-14 01:09:11 +0000830 if (!Triple.isiOS() || Triple.isOSVersionLT(6)) {
Daniel Dunbarbd847cc2012-10-15 22:23:53 +0000831 CmdArgs.push_back("-backend-option");
832 CmdArgs.push_back("-arm-long-calls");
833 }
Daniel Dunbarc9388c12011-03-17 17:10:06 +0000834
Daniel Dunbar12100e22011-03-22 16:48:17 +0000835 CmdArgs.push_back("-backend-option");
Daniel Dunbarc9388c12011-03-17 17:10:06 +0000836 CmdArgs.push_back("-arm-strict-align");
Daniel Dunbared904c82011-04-18 21:26:42 +0000837
838 // The kext linker doesn't know how to deal with movw/movt.
Daniel Dunbared904c82011-04-18 21:26:42 +0000839 CmdArgs.push_back("-backend-option");
Renato Golin3d510b32013-08-15 20:54:45 +0000840 CmdArgs.push_back("-arm-use-movt=0");
Daniel Dunbarb1db4b62011-03-17 00:07:34 +0000841 }
Chad Rosierba3df1d2011-08-26 00:26:29 +0000842
Bob Wilson0874e532014-07-29 00:23:18 +0000843 // -mkernel implies -mstrict-align; don't add the redundant option.
844 if (!KernelOrKext) {
845 if (Arg *A = Args.getLastArg(options::OPT_mno_unaligned_access,
846 options::OPT_munaligned_access)) {
847 CmdArgs.push_back("-backend-option");
848 if (A->getOption().matches(options::OPT_mno_unaligned_access))
849 CmdArgs.push_back("-arm-strict-align");
Oliver Stannard76244be2014-08-13 09:18:12 +0000850 else {
Jonathan Roelofs2b00d542014-10-07 15:11:32 +0000851 if (Triple.getSubArch() == llvm::Triple::SubArchType::ARMSubArch_v6m)
Oliver Stannard76244be2014-08-13 09:18:12 +0000852 D.Diag(diag::err_target_unsupported_unaligned) << "v6m";
Bob Wilson0874e532014-07-29 00:23:18 +0000853 CmdArgs.push_back("-arm-no-strict-align");
Oliver Stannard76244be2014-08-13 09:18:12 +0000854 }
Bob Wilson0874e532014-07-29 00:23:18 +0000855 }
856 }
857
Chad Rosierba3df1d2011-08-26 00:26:29 +0000858 // Setting -mno-global-merge disables the codegen global merge pass. Setting
859 // -mglobal-merge has no effect as the pass is enabled by default.
860 if (Arg *A = Args.getLastArg(options::OPT_mglobal_merge,
861 options::OPT_mno_global_merge)) {
862 if (A->getOption().matches(options::OPT_mno_global_merge))
863 CmdArgs.push_back("-mno-global-merge");
864 }
Chad Rosierf1985d22012-05-16 20:40:09 +0000865
Bob Wilson9c8af452013-04-11 18:53:25 +0000866 if (!Args.hasFlag(options::OPT_mimplicit_float,
867 options::OPT_mno_implicit_float,
868 true))
Chad Rosierf1985d22012-05-16 20:40:09 +0000869 CmdArgs.push_back("-no-implicit-float");
Renato Golindbb77e62013-08-24 14:44:35 +0000870
Logan Chien749763e2014-04-03 13:12:44 +0000871 // llvm does not support reserving registers in general. There is support
872 // for reserving r9 on ARM though (defined as a platform-specific register
873 // in ARM EABI).
874 if (Args.hasArg(options::OPT_ffixed_r9)) {
875 CmdArgs.push_back("-backend-option");
876 CmdArgs.push_back("-arm-reserve-r9");
877 }
Daniel Dunbar0f5c5422009-09-10 04:57:17 +0000878}
879
Tim Northover573cbee2014-05-24 12:52:07 +0000880/// getAArch64TargetCPU - Get the (LLVM) name of the AArch64 cpu we are
881/// targeting.
882static std::string getAArch64TargetCPU(const ArgList &Args) {
Kevin Qin110db6f2014-07-18 07:03:22 +0000883 Arg *A;
884 std::string CPU;
885 // If we have -mtune or -mcpu, use that.
886 if ((A = Args.getLastArg(options::OPT_mtune_EQ))) {
887 CPU = A->getValue();
888 } else if ((A = Args.getLastArg(options::OPT_mcpu_EQ))) {
889 StringRef Mcpu = A->getValue();
890 CPU = Mcpu.split("+").first;
Tim Northovera2ee4332014-03-29 15:09:45 +0000891 }
892
Kevin Qin110db6f2014-07-18 07:03:22 +0000893 // Handle CPU name is 'native'.
894 if (CPU == "native")
895 return llvm::sys::getHostCPUName();
896 else if (CPU.size())
897 return CPU;
Tim Northovera2ee4332014-03-29 15:09:45 +0000898
James Molloy9b1586b2014-04-17 12:51:17 +0000899 // Make sure we pick "cyclone" if -arch is used.
900 // FIXME: Should this be picked by checking the target triple instead?
901 if (Args.getLastArg(options::OPT_arch))
902 return "cyclone";
903
904 return "generic";
Tim Northovera2ee4332014-03-29 15:09:45 +0000905}
906
Tim Northover573cbee2014-05-24 12:52:07 +0000907void Clang::AddAArch64TargetArgs(const ArgList &Args,
908 ArgStringList &CmdArgs) const {
Tim Northovera2ee4332014-03-29 15:09:45 +0000909 std::string TripleStr = getToolChain().ComputeEffectiveClangTriple(Args);
910 llvm::Triple Triple(TripleStr);
911
912 if (!Args.hasFlag(options::OPT_mred_zone, options::OPT_mno_red_zone, true) ||
913 Args.hasArg(options::OPT_mkernel) ||
914 Args.hasArg(options::OPT_fapple_kext))
915 CmdArgs.push_back("-disable-red-zone");
916
917 if (!Args.hasFlag(options::OPT_mimplicit_float,
918 options::OPT_mno_implicit_float, true))
919 CmdArgs.push_back("-no-implicit-float");
920
Craig Topper92fc2df2014-05-17 16:56:41 +0000921 const char *ABIName = nullptr;
Tim Northovera2ee4332014-03-29 15:09:45 +0000922 if (Arg *A = Args.getLastArg(options::OPT_mabi_EQ))
923 ABIName = A->getValue();
924 else if (Triple.isOSDarwin())
925 ABIName = "darwinpcs";
926 else
927 ABIName = "aapcs";
928
929 CmdArgs.push_back("-target-abi");
930 CmdArgs.push_back(ABIName);
931
Bob Wilson0874e532014-07-29 00:23:18 +0000932 if (Arg *A = Args.getLastArg(options::OPT_mno_unaligned_access,
933 options::OPT_munaligned_access)) {
Tim Northovera2ee4332014-03-29 15:09:45 +0000934 CmdArgs.push_back("-backend-option");
Bob Wilson0874e532014-07-29 00:23:18 +0000935 if (A->getOption().matches(options::OPT_mno_unaligned_access))
936 CmdArgs.push_back("-aarch64-strict-align");
937 else
938 CmdArgs.push_back("-aarch64-no-strict-align");
Tim Northovera2ee4332014-03-29 15:09:45 +0000939 }
Bob Wilsonbdd2b3c2014-05-29 19:43:02 +0000940
Bradley Smith9ff64332014-10-13 10:16:06 +0000941 if (Arg *A = Args.getLastArg(options::OPT_mfix_cortex_a53_835769,
942 options::OPT_mno_fix_cortex_a53_835769)) {
943 CmdArgs.push_back("-backend-option");
944 if (A->getOption().matches(options::OPT_mfix_cortex_a53_835769))
945 CmdArgs.push_back("-aarch64-fix-cortex-a53-835769=1");
946 else
947 CmdArgs.push_back("-aarch64-fix-cortex-a53-835769=0");
Bradley Smith04ee8aa2014-10-16 16:35:14 +0000948 } else if (Triple.getEnvironment() == llvm::Triple::Android) {
949 // Enabled A53 errata (835769) workaround by default on android
950 CmdArgs.push_back("-backend-option");
951 CmdArgs.push_back("-aarch64-fix-cortex-a53-835769=1");
Bradley Smith9ff64332014-10-13 10:16:06 +0000952 }
953
Bob Wilsonbdd2b3c2014-05-29 19:43:02 +0000954 // Setting -mno-global-merge disables the codegen global merge pass. Setting
955 // -mglobal-merge has no effect as the pass is enabled by default.
956 if (Arg *A = Args.getLastArg(options::OPT_mglobal_merge,
957 options::OPT_mno_global_merge)) {
958 if (A->getOption().matches(options::OPT_mno_global_merge))
959 CmdArgs.push_back("-mno-global-merge");
960 }
Renato Golinb625f482015-01-25 23:17:48 +0000961
962 if (Args.hasArg(options::OPT_ffixed_x18)) {
963 CmdArgs.push_back("-backend-option");
964 CmdArgs.push_back("-aarch64-reserve-x18");
965 }
Tim Northovera2ee4332014-03-29 15:09:45 +0000966}
967
Simon Atanasyan3b7589a2012-04-07 22:09:23 +0000968// Get CPU and ABI names. They are not independent
969// so we have to calculate them together.
Simon Atanasyan7018e1d2014-07-16 12:29:22 +0000970void mips::getMipsCPUAndABI(const ArgList &Args,
971 const llvm::Triple &Triple,
972 StringRef &CPUName,
973 StringRef &ABIName) {
Simon Atanasyan1a3665b62014-01-27 13:59:04 +0000974 const char *DefMips32CPU = "mips32r2";
975 const char *DefMips64CPU = "mips64r2";
Akira Hatanaka37fd9e92011-09-26 21:07:52 +0000976
Daniel Sanders2bf13662014-07-10 14:40:57 +0000977 // MIPS32r6 is the default for mips(el)?-img-linux-gnu and MIPS64r6 is the
978 // default for mips64(el)?-img-linux-gnu.
979 if (Triple.getVendor() == llvm::Triple::ImaginationTechnologies &&
980 Triple.getEnvironment() == llvm::Triple::GNU) {
981 DefMips32CPU = "mips32r6";
982 DefMips64CPU = "mips64r6";
983 }
984
Brad Smithba26f582015-01-06 02:53:17 +0000985 // MIPS3 is the default for mips64*-unknown-openbsd.
986 if (Triple.getOS() == llvm::Triple::OpenBSD)
987 DefMips64CPU = "mips3";
988
Simon Atanasyan464a7f72012-09-10 08:32:41 +0000989 if (Arg *A = Args.getLastArg(options::OPT_march_EQ,
Simon Atanasyane0cc7c72013-10-09 12:12:24 +0000990 options::OPT_mcpu_EQ))
991 CPUName = A->getValue();
Simon Atanasyan464a7f72012-09-10 08:32:41 +0000992
Simon Atanasyan4938ddb2013-04-21 13:30:10 +0000993 if (Arg *A = Args.getLastArg(options::OPT_mabi_EQ)) {
Richard Smithbd55daf2012-11-01 04:30:05 +0000994 ABIName = A->getValue();
Simon Atanasyan4938ddb2013-04-21 13:30:10 +0000995 // Convert a GNU style Mips ABI name to the name
996 // accepted by LLVM Mips backend.
997 ABIName = llvm::StringSwitch<llvm::StringRef>(ABIName)
998 .Case("32", "o32")
999 .Case("64", "n64")
1000 .Default(ABIName);
1001 }
Simon Atanasyan464a7f72012-09-10 08:32:41 +00001002
1003 // Setup default CPU and ABI names.
1004 if (CPUName.empty() && ABIName.empty()) {
Rafael Espindola22ce34a2013-08-20 22:12:08 +00001005 switch (Triple.getArch()) {
Simon Atanasyan464a7f72012-09-10 08:32:41 +00001006 default:
1007 llvm_unreachable("Unexpected triple arch name");
1008 case llvm::Triple::mips:
1009 case llvm::Triple::mipsel:
1010 CPUName = DefMips32CPU;
1011 break;
1012 case llvm::Triple::mips64:
1013 case llvm::Triple::mips64el:
1014 CPUName = DefMips64CPU;
1015 break;
1016 }
1017 }
1018
Simon Atanasyana42a84e2014-07-02 13:20:36 +00001019 if (ABIName.empty()) {
1020 // Deduce ABI name from the target triple.
1021 if (Triple.getArch() == llvm::Triple::mips ||
1022 Triple.getArch() == llvm::Triple::mipsel)
1023 ABIName = "o32";
1024 else
1025 ABIName = "n64";
1026 }
1027
1028 if (CPUName.empty()) {
Simon Atanasyan464a7f72012-09-10 08:32:41 +00001029 // Deduce CPU name from ABI name.
1030 CPUName = llvm::StringSwitch<const char *>(ABIName)
Simon Atanasyanad805952014-07-01 10:59:09 +00001031 .Cases("o32", "eabi", DefMips32CPU)
1032 .Cases("n32", "n64", DefMips64CPU)
Simon Atanasyan464a7f72012-09-10 08:32:41 +00001033 .Default("");
1034 }
Simon Atanasyanc92717f2014-07-23 09:27:10 +00001035
1036 // FIXME: Warn on inconsistent use of -march and -mabi.
Simon Atanasyan3b7589a2012-04-07 22:09:23 +00001037}
1038
Simon Atanasyan0da400c2013-02-27 14:55:49 +00001039// Convert ABI name to the GNU tools acceptable variant.
1040static StringRef getGnuCompatibleMipsABIName(StringRef ABI) {
1041 return llvm::StringSwitch<llvm::StringRef>(ABI)
1042 .Case("o32", "32")
1043 .Case("n64", "64")
1044 .Default(ABI);
1045}
1046
Simon Atanasyan590ad8f2012-06-02 15:06:29 +00001047// Select the MIPS float ABI as determined by -msoft-float, -mhard-float,
1048// and -mfloat-abi=.
1049static StringRef getMipsFloatABI(const Driver &D, const ArgList &Args) {
Chris Lattner0e62c1c2011-07-23 10:55:15 +00001050 StringRef FloatABI;
Eric Christopher0b26a612010-03-02 02:41:08 +00001051 if (Arg *A = Args.getLastArg(options::OPT_msoft_float,
Akira Hatanaka6976ec82012-03-23 23:07:09 +00001052 options::OPT_mhard_float,
1053 options::OPT_mfloat_abi_EQ)) {
Eric Christopher0b26a612010-03-02 02:41:08 +00001054 if (A->getOption().matches(options::OPT_msoft_float))
1055 FloatABI = "soft";
1056 else if (A->getOption().matches(options::OPT_mhard_float))
1057 FloatABI = "hard";
Akira Hatanaka6976ec82012-03-23 23:07:09 +00001058 else {
Richard Smithbd55daf2012-11-01 04:30:05 +00001059 FloatABI = A->getValue();
Simon Atanasyan512dc382013-04-14 08:37:15 +00001060 if (FloatABI != "soft" && FloatABI != "hard") {
Simon Atanasyan590ad8f2012-06-02 15:06:29 +00001061 D.Diag(diag::err_drv_invalid_mfloat_abi) << A->getAsString(Args);
Akira Hatanaka6976ec82012-03-23 23:07:09 +00001062 FloatABI = "hard";
1063 }
1064 }
Eric Christopher0b26a612010-03-02 02:41:08 +00001065 }
1066
1067 // If unspecified, choose the default based on the platform.
1068 if (FloatABI.empty()) {
Akira Hatanaka6976ec82012-03-23 23:07:09 +00001069 // Assume "hard", because it's a default value used by gcc.
1070 // When we start to recognize specific target MIPS processors,
1071 // we will be able to select the default more correctly.
1072 FloatABI = "hard";
Eric Christopher0b26a612010-03-02 02:41:08 +00001073 }
1074
Simon Atanasyan590ad8f2012-06-02 15:06:29 +00001075 return FloatABI;
1076}
1077
Simon Atanasyan9b1932d2012-07-05 18:51:43 +00001078static void AddTargetFeature(const ArgList &Args,
Rafael Espindola28e1f4b2013-08-21 16:39:20 +00001079 std::vector<const char *> &Features,
1080 OptSpecifier OnOpt, OptSpecifier OffOpt,
Simon Atanasyan9b1932d2012-07-05 18:51:43 +00001081 StringRef FeatureName) {
1082 if (Arg *A = Args.getLastArg(OnOpt, OffOpt)) {
Simon Atanasyan9b1932d2012-07-05 18:51:43 +00001083 if (A->getOption().matches(OnOpt))
Rafael Espindola28e1f4b2013-08-21 16:39:20 +00001084 Features.push_back(Args.MakeArgString("+" + FeatureName));
Simon Atanasyan9b1932d2012-07-05 18:51:43 +00001085 else
Rafael Espindola28e1f4b2013-08-21 16:39:20 +00001086 Features.push_back(Args.MakeArgString("-" + FeatureName));
Simon Atanasyan9b1932d2012-07-05 18:51:43 +00001087 }
1088}
1089
Daniel Sanders379d44b2014-07-16 11:52:23 +00001090static void getMIPSTargetFeatures(const Driver &D, const llvm::Triple &Triple,
1091 const ArgList &Args,
Rafael Espindola28e1f4b2013-08-21 16:39:20 +00001092 std::vector<const char *> &Features) {
Daniel Sanders379d44b2014-07-16 11:52:23 +00001093 StringRef CPUName;
1094 StringRef ABIName;
Simon Atanasyan7018e1d2014-07-16 12:29:22 +00001095 mips::getMipsCPUAndABI(Args, Triple, CPUName, ABIName);
Daniel Sanders379d44b2014-07-16 11:52:23 +00001096 ABIName = getGnuCompatibleMipsABIName(ABIName);
1097
Daniel Sandersfeb61302014-08-08 15:47:17 +00001098 AddTargetFeature(Args, Features, options::OPT_mno_abicalls,
1099 options::OPT_mabicalls, "noabicalls");
Daniel Sanderse805f442014-08-08 13:44:50 +00001100
Rafael Espindola28e1f4b2013-08-21 16:39:20 +00001101 StringRef FloatABI = getMipsFloatABI(D, Args);
Simon Atanasyan22a6f4d2013-11-19 12:22:38 +00001102 if (FloatABI == "soft") {
Rafael Espindola28e1f4b2013-08-21 16:39:20 +00001103 // FIXME: Note, this is a hack. We need to pass the selected float
1104 // mode to the MipsTargetInfoBase to define appropriate macros there.
1105 // Now it is the only method.
1106 Features.push_back("+soft-float");
1107 }
1108
Simon Atanasyan22127ce2013-09-24 09:09:16 +00001109 if (Arg *A = Args.getLastArg(options::OPT_mnan_EQ)) {
Matheus Almeida602bff32014-05-07 16:16:07 +00001110 StringRef Val = StringRef(A->getValue());
1111 if (Val == "2008")
Simon Atanasyan22127ce2013-09-24 09:09:16 +00001112 Features.push_back("+nan2008");
Matheus Almeida602bff32014-05-07 16:16:07 +00001113 else if (Val == "legacy")
1114 Features.push_back("-nan2008");
1115 else
1116 D.Diag(diag::err_drv_unsupported_option_argument)
1117 << A->getOption().getName() << Val;
Simon Atanasyan22127ce2013-09-24 09:09:16 +00001118 }
1119
Rafael Espindola28e1f4b2013-08-21 16:39:20 +00001120 AddTargetFeature(Args, Features, options::OPT_msingle_float,
1121 options::OPT_mdouble_float, "single-float");
1122 AddTargetFeature(Args, Features, options::OPT_mips16, options::OPT_mno_mips16,
1123 "mips16");
1124 AddTargetFeature(Args, Features, options::OPT_mmicromips,
1125 options::OPT_mno_micromips, "micromips");
1126 AddTargetFeature(Args, Features, options::OPT_mdsp, options::OPT_mno_dsp,
1127 "dsp");
1128 AddTargetFeature(Args, Features, options::OPT_mdspr2, options::OPT_mno_dspr2,
1129 "dspr2");
1130 AddTargetFeature(Args, Features, options::OPT_mmsa, options::OPT_mno_msa,
1131 "msa");
Daniel Sanders379d44b2014-07-16 11:52:23 +00001132
1133 // Add the last -mfp32/-mfpxx/-mfp64 or if none are given and the ABI is O32
1134 // pass -mfpxx
1135 if (Arg *A = Args.getLastArg(options::OPT_mfp32, options::OPT_mfpxx,
1136 options::OPT_mfp64)) {
1137 if (A->getOption().matches(options::OPT_mfp32))
1138 Features.push_back(Args.MakeArgString("-fp64"));
1139 else if (A->getOption().matches(options::OPT_mfpxx)) {
1140 Features.push_back(Args.MakeArgString("+fpxx"));
1141 Features.push_back(Args.MakeArgString("+nooddspreg"));
1142 } else
1143 Features.push_back(Args.MakeArgString("+fp64"));
1144 } else if (mips::isFPXXDefault(Triple, CPUName, ABIName)) {
Daniel Sanders2e9427a2014-07-16 09:57:54 +00001145 Features.push_back(Args.MakeArgString("+fpxx"));
1146 Features.push_back(Args.MakeArgString("+nooddspreg"));
1147 }
Daniel Sanders379d44b2014-07-16 11:52:23 +00001148
Daniel Sanders28e5d392014-07-10 10:39:51 +00001149 AddTargetFeature(Args, Features, options::OPT_mno_odd_spreg,
1150 options::OPT_modd_spreg, "nooddspreg");
Rafael Espindola28e1f4b2013-08-21 16:39:20 +00001151}
1152
Simon Atanasyan590ad8f2012-06-02 15:06:29 +00001153void Clang::AddMIPSTargetArgs(const ArgList &Args,
Simon Atanasyanf0087242013-04-14 14:07:41 +00001154 ArgStringList &CmdArgs) const {
Simon Atanasyan590ad8f2012-06-02 15:06:29 +00001155 const Driver &D = getToolChain().getDriver();
1156 StringRef CPUName;
1157 StringRef ABIName;
Rafael Espindola22ce34a2013-08-20 22:12:08 +00001158 const llvm::Triple &Triple = getToolChain().getTriple();
Simon Atanasyan7018e1d2014-07-16 12:29:22 +00001159 mips::getMipsCPUAndABI(Args, Triple, CPUName, ABIName);
Simon Atanasyan590ad8f2012-06-02 15:06:29 +00001160
1161 CmdArgs.push_back("-target-abi");
1162 CmdArgs.push_back(ABIName.data());
1163
1164 StringRef FloatABI = getMipsFloatABI(D, Args);
1165
Simon Atanasyan22a6f4d2013-11-19 12:22:38 +00001166 if (FloatABI == "soft") {
Eric Christopher0b26a612010-03-02 02:41:08 +00001167 // Floating point operations and argument passing are soft.
Eric Christopher0b26a612010-03-02 02:41:08 +00001168 CmdArgs.push_back("-msoft-float");
Akira Hatanaka6976ec82012-03-23 23:07:09 +00001169 CmdArgs.push_back("-mfloat-abi");
1170 CmdArgs.push_back("soft");
Akira Hatanaka6976ec82012-03-23 23:07:09 +00001171 }
Akira Hatanaka6976ec82012-03-23 23:07:09 +00001172 else {
1173 // Floating point operations and argument passing are hard.
Eric Christopher0b26a612010-03-02 02:41:08 +00001174 assert(FloatABI == "hard" && "Invalid float abi!");
Akira Hatanaka6976ec82012-03-23 23:07:09 +00001175 CmdArgs.push_back("-mfloat-abi");
1176 CmdArgs.push_back("hard");
Eric Christopher0b26a612010-03-02 02:41:08 +00001177 }
Simon Atanasyan6f23fa02012-07-05 14:19:39 +00001178
Simon Atanasyan2eaec512012-12-01 18:27:21 +00001179 if (Arg *A = Args.getLastArg(options::OPT_mxgot, options::OPT_mno_xgot)) {
1180 if (A->getOption().matches(options::OPT_mxgot)) {
1181 CmdArgs.push_back("-mllvm");
1182 CmdArgs.push_back("-mxgot");
1183 }
1184 }
1185
Simon Atanasyanc580b322013-05-11 06:33:44 +00001186 if (Arg *A = Args.getLastArg(options::OPT_mldc1_sdc1,
1187 options::OPT_mno_ldc1_sdc1)) {
1188 if (A->getOption().matches(options::OPT_mno_ldc1_sdc1)) {
1189 CmdArgs.push_back("-mllvm");
1190 CmdArgs.push_back("-mno-ldc1-sdc1");
1191 }
1192 }
1193
Akira Hatanaka0aa60ef2013-07-19 18:58:48 +00001194 if (Arg *A = Args.getLastArg(options::OPT_mcheck_zero_division,
1195 options::OPT_mno_check_zero_division)) {
1196 if (A->getOption().matches(options::OPT_mno_check_zero_division)) {
1197 CmdArgs.push_back("-mllvm");
1198 CmdArgs.push_back("-mno-check-zero-division");
1199 }
1200 }
1201
Simon Atanasyanec4b1c12012-08-27 20:55:56 +00001202 if (Arg *A = Args.getLastArg(options::OPT_G)) {
Richard Smithbd55daf2012-11-01 04:30:05 +00001203 StringRef v = A->getValue();
Simon Atanasyanec4b1c12012-08-27 20:55:56 +00001204 CmdArgs.push_back("-mllvm");
1205 CmdArgs.push_back(Args.MakeArgString("-mips-ssection-threshold=" + v));
1206 A->claim();
1207 }
Eric Christopher0b26a612010-03-02 02:41:08 +00001208}
1209
Hal Finkel8eb59282012-06-11 22:35:19 +00001210/// getPPCTargetCPU - Get the (LLVM) name of the PowerPC cpu we are targeting.
1211static std::string getPPCTargetCPU(const ArgList &Args) {
1212 if (Arg *A = Args.getLastArg(options::OPT_mcpu_EQ)) {
Richard Smithbd55daf2012-11-01 04:30:05 +00001213 StringRef CPUName = A->getValue();
Hal Finkel8eb59282012-06-11 22:35:19 +00001214
1215 if (CPUName == "native") {
1216 std::string CPU = llvm::sys::getHostCPUName();
1217 if (!CPU.empty() && CPU != "generic")
1218 return CPU;
1219 else
1220 return "";
1221 }
1222
1223 return llvm::StringSwitch<const char *>(CPUName)
1224 .Case("common", "generic")
1225 .Case("440", "440")
1226 .Case("440fp", "440")
1227 .Case("450", "450")
1228 .Case("601", "601")
1229 .Case("602", "602")
1230 .Case("603", "603")
1231 .Case("603e", "603e")
1232 .Case("603ev", "603ev")
1233 .Case("604", "604")
1234 .Case("604e", "604e")
1235 .Case("620", "620")
Bill Schmidt38378a02013-02-01 20:23:10 +00001236 .Case("630", "pwr3")
Hal Finkel8eb59282012-06-11 22:35:19 +00001237 .Case("G3", "g3")
1238 .Case("7400", "7400")
1239 .Case("G4", "g4")
1240 .Case("7450", "7450")
1241 .Case("G4+", "g4+")
1242 .Case("750", "750")
1243 .Case("970", "970")
1244 .Case("G5", "g5")
1245 .Case("a2", "a2")
Hal Finkeldf1e4bf2013-02-01 05:53:33 +00001246 .Case("a2q", "a2q")
Hal Finkelf6d6cb02012-09-18 22:25:03 +00001247 .Case("e500mc", "e500mc")
1248 .Case("e5500", "e5500")
Bill Schmidt38378a02013-02-01 20:23:10 +00001249 .Case("power3", "pwr3")
1250 .Case("power4", "pwr4")
1251 .Case("power5", "pwr5")
1252 .Case("power5x", "pwr5x")
Hal Finkel8eb59282012-06-11 22:35:19 +00001253 .Case("power6", "pwr6")
Bill Schmidt38378a02013-02-01 20:23:10 +00001254 .Case("power6x", "pwr6x")
Hal Finkel8eb59282012-06-11 22:35:19 +00001255 .Case("power7", "pwr7")
Will Schmidtf0487512014-06-26 13:34:10 +00001256 .Case("power8", "pwr8")
Bill Schmidt38378a02013-02-01 20:23:10 +00001257 .Case("pwr3", "pwr3")
1258 .Case("pwr4", "pwr4")
1259 .Case("pwr5", "pwr5")
1260 .Case("pwr5x", "pwr5x")
1261 .Case("pwr6", "pwr6")
1262 .Case("pwr6x", "pwr6x")
1263 .Case("pwr7", "pwr7")
Will Schmidtf0487512014-06-26 13:34:10 +00001264 .Case("pwr8", "pwr8")
Hal Finkel8eb59282012-06-11 22:35:19 +00001265 .Case("powerpc", "ppc")
1266 .Case("powerpc64", "ppc64")
Bill Schmidt778d3872013-07-26 01:36:11 +00001267 .Case("powerpc64le", "ppc64le")
Hal Finkel8eb59282012-06-11 22:35:19 +00001268 .Default("");
1269 }
1270
1271 return "";
1272}
1273
Rafael Espindola28e1f4b2013-08-21 16:39:20 +00001274static void getPPCTargetFeatures(const ArgList &Args,
1275 std::vector<const char *> &Features) {
Eric Christopher643bb6a2013-10-16 20:40:08 +00001276 for (arg_iterator it = Args.filtered_begin(options::OPT_m_ppc_Features_Group),
1277 ie = Args.filtered_end();
1278 it != ie; ++it) {
1279 StringRef Name = (*it)->getOption().getName();
1280 (*it)->claim();
1281
1282 // Skip over "-m".
1283 assert(Name.startswith("m") && "Invalid feature name.");
1284 Name = Name.substr(1);
1285
1286 bool IsNegative = Name.startswith("no-");
1287 if (IsNegative)
1288 Name = Name.substr(3);
1289
1290 // Note that gcc calls this mfcrf and LLVM calls this mfocrf so we
1291 // pass the correct option to the backend while calling the frontend
1292 // option the same.
1293 // TODO: Change the LLVM backend option maybe?
1294 if (Name == "mfcrf")
1295 Name = "mfocrf";
1296
1297 Features.push_back(Args.MakeArgString((IsNegative ? "-" : "+") + Name));
1298 }
1299
1300 // Altivec is a bit weird, allow overriding of the Altivec feature here.
Rafael Espindola28e1f4b2013-08-21 16:39:20 +00001301 AddTargetFeature(Args, Features, options::OPT_faltivec,
1302 options::OPT_fno_altivec, "altivec");
Hal Finkel8eb59282012-06-11 22:35:19 +00001303}
1304
Ulrich Weigand8afad612014-07-28 13:17:52 +00001305void Clang::AddPPCTargetArgs(const ArgList &Args,
1306 ArgStringList &CmdArgs) const {
1307 // Select the ABI to use.
1308 const char *ABIName = nullptr;
1309 if (Arg *A = Args.getLastArg(options::OPT_mabi_EQ)) {
1310 ABIName = A->getValue();
1311 } else if (getToolChain().getTriple().isOSLinux())
1312 switch(getToolChain().getArch()) {
1313 case llvm::Triple::ppc64:
1314 ABIName = "elfv1";
1315 break;
1316 case llvm::Triple::ppc64le:
1317 ABIName = "elfv2";
1318 break;
1319 default:
1320 break;
1321 }
1322
1323 if (ABIName) {
1324 CmdArgs.push_back("-target-abi");
1325 CmdArgs.push_back(ABIName);
1326 }
1327}
1328
1329bool ppc::hasPPCAbiArg(const ArgList &Args, const char *Value) {
1330 Arg *A = Args.getLastArg(options::OPT_mabi_EQ);
1331 return A && (A->getValue() == StringRef(Value));
1332}
1333
Tom Stellard6674c702013-04-01 20:56:53 +00001334/// Get the (LLVM) name of the R600 gpu we are targeting.
1335static std::string getR600TargetGPU(const ArgList &Args) {
1336 if (Arg *A = Args.getLastArg(options::OPT_mcpu_EQ)) {
Benjamin Kramerb2ccade2013-10-21 12:33:55 +00001337 const char *GPUName = A->getValue();
Tom Stellard6674c702013-04-01 20:56:53 +00001338 return llvm::StringSwitch<const char *>(GPUName)
Tom Stellardb38600c2013-05-06 16:12:05 +00001339 .Cases("rv630", "rv635", "r600")
1340 .Cases("rv610", "rv620", "rs780", "rs880")
Tom Stellard6674c702013-04-01 20:56:53 +00001341 .Case("rv740", "rv770")
1342 .Case("palm", "cedar")
Tom Stellardb38600c2013-05-06 16:12:05 +00001343 .Cases("sumo", "sumo2", "sumo")
Tom Stellard6674c702013-04-01 20:56:53 +00001344 .Case("hemlock", "cypress")
1345 .Case("aruba", "cayman")
Benjamin Kramerb2ccade2013-10-21 12:33:55 +00001346 .Default(GPUName);
Tom Stellard6674c702013-04-01 20:56:53 +00001347 }
1348 return "";
1349}
1350
Rafael Espindola28e1f4b2013-08-21 16:39:20 +00001351static void getSparcTargetFeatures(const ArgList &Args,
Brad Smithf436e9e2014-08-19 21:50:15 +00001352 std::vector<const char *> &Features) {
Rafael Espindola28e1f4b2013-08-21 16:39:20 +00001353 bool SoftFloatABI = true;
1354 if (Arg *A =
1355 Args.getLastArg(options::OPT_msoft_float, options::OPT_mhard_float)) {
1356 if (A->getOption().matches(options::OPT_mhard_float))
1357 SoftFloatABI = false;
1358 }
1359 if (SoftFloatABI)
1360 Features.push_back("+soft-float");
1361}
1362
Bruno Cardoso Lopese7f211c2010-11-09 17:21:19 +00001363void Clang::AddSparcTargetArgs(const ArgList &Args,
1364 ArgStringList &CmdArgs) const {
1365 const Driver &D = getToolChain().getDriver();
1366
Brad Smith10cd0f42014-07-11 20:12:08 +00001367 // Select the float ABI as determined by -msoft-float and -mhard-float.
Chris Lattner0e62c1c2011-07-23 10:55:15 +00001368 StringRef FloatABI;
Bruno Cardoso Lopese7f211c2010-11-09 17:21:19 +00001369 if (Arg *A = Args.getLastArg(options::OPT_msoft_float,
1370 options::OPT_mhard_float)) {
1371 if (A->getOption().matches(options::OPT_msoft_float))
1372 FloatABI = "soft";
1373 else if (A->getOption().matches(options::OPT_mhard_float))
1374 FloatABI = "hard";
1375 }
1376
1377 // If unspecified, choose the default based on the platform.
1378 if (FloatABI.empty()) {
Aaron Ballmand0d27ab2013-07-15 13:41:33 +00001379 // Assume "soft", but warn the user we are guessing.
1380 FloatABI = "soft";
1381 D.Diag(diag::warn_drv_assuming_mfloat_abi_is) << "soft";
Bruno Cardoso Lopese7f211c2010-11-09 17:21:19 +00001382 }
1383
1384 if (FloatABI == "soft") {
1385 // Floating point operations and argument passing are soft.
1386 //
1387 // FIXME: This changes CPP defines, we need -target-soft-float.
1388 CmdArgs.push_back("-msoft-float");
Bruno Cardoso Lopese7f211c2010-11-09 17:21:19 +00001389 } else {
1390 assert(FloatABI == "hard" && "Invalid float abi!");
1391 CmdArgs.push_back("-mhard-float");
1392 }
1393}
1394
Richard Sandiford4652d892013-07-19 16:51:51 +00001395static const char *getSystemZTargetCPU(const ArgList &Args) {
1396 if (const Arg *A = Args.getLastArg(options::OPT_march_EQ))
1397 return A->getValue();
1398 return "z10";
1399}
1400
Chandler Carruth953fb082013-01-13 11:46:33 +00001401static const char *getX86TargetCPU(const ArgList &Args,
1402 const llvm::Triple &Triple) {
1403 if (const Arg *A = Args.getLastArg(options::OPT_march_EQ)) {
Jim Grosbach82eee262013-11-16 00:53:35 +00001404 if (StringRef(A->getValue()) != "native") {
Jonathan Roelofs2cea1be2014-02-12 03:21:20 +00001405 if (Triple.isOSDarwin() && Triple.getArchName() == "x86_64h")
Jim Grosbach82eee262013-11-16 00:53:35 +00001406 return "core-avx2";
1407
Chandler Carruth953fb082013-01-13 11:46:33 +00001408 return A->getValue();
Jim Grosbach82eee262013-11-16 00:53:35 +00001409 }
Chandler Carruth953fb082013-01-13 11:46:33 +00001410
1411 // FIXME: Reject attempts to use -march=native unless the target matches
1412 // the host.
1413 //
1414 // FIXME: We should also incorporate the detected target features for use
1415 // with -native.
1416 std::string CPU = llvm::sys::getHostCPUName();
1417 if (!CPU.empty() && CPU != "generic")
1418 return Args.MakeArgString(CPU);
1419 }
1420
1421 // Select the default CPU if none was given (or detection failed).
1422
1423 if (Triple.getArch() != llvm::Triple::x86_64 &&
1424 Triple.getArch() != llvm::Triple::x86)
Craig Topper92fc2df2014-05-17 16:56:41 +00001425 return nullptr; // This routine is only handling x86 targets.
Chandler Carruth953fb082013-01-13 11:46:33 +00001426
1427 bool Is64Bit = Triple.getArch() == llvm::Triple::x86_64;
1428
1429 // FIXME: Need target hooks.
Jonathan Roelofs2cea1be2014-02-12 03:21:20 +00001430 if (Triple.isOSDarwin()) {
Jim Grosbach82eee262013-11-16 00:53:35 +00001431 if (Triple.getArchName() == "x86_64h")
1432 return "core-avx2";
Chandler Carruth953fb082013-01-13 11:46:33 +00001433 return Is64Bit ? "core2" : "yonah";
Jim Grosbach82eee262013-11-16 00:53:35 +00001434 }
Chandler Carruth953fb082013-01-13 11:46:33 +00001435
Filipe Cabecinhas4b442572015-01-27 17:27:37 +00001436 // Set up default CPU name for PS4 compilers.
1437 if (Triple.isPS4CPU())
1438 return "btver2";
1439
Alexey Bataev286d1b92014-01-31 04:07:13 +00001440 // On Android use targets compatible with gcc
Chandler Carruth953fb082013-01-13 11:46:33 +00001441 if (Triple.getEnvironment() == llvm::Triple::Android)
Alexey Bataev286d1b92014-01-31 04:07:13 +00001442 return Is64Bit ? "x86-64" : "i686";
Chandler Carruth953fb082013-01-13 11:46:33 +00001443
Benjamin Kramerb2ccade2013-10-21 12:33:55 +00001444 // Everything else goes to x86-64 in 64-bit mode.
1445 if (Is64Bit)
1446 return "x86-64";
1447
1448 switch (Triple.getOS()) {
1449 case llvm::Triple::FreeBSD:
1450 case llvm::Triple::NetBSD:
1451 case llvm::Triple::OpenBSD:
1452 return "i486";
1453 case llvm::Triple::Haiku:
1454 return "i586";
1455 case llvm::Triple::Bitrig:
1456 return "i686";
1457 default:
1458 // Fallback to p4.
1459 return "pentium4";
1460 }
Chandler Carruth953fb082013-01-13 11:46:33 +00001461}
1462
Rafael Espindola22ce34a2013-08-20 22:12:08 +00001463static std::string getCPUName(const ArgList &Args, const llvm::Triple &T) {
1464 switch(T.getArch()) {
1465 default:
1466 return "";
1467
Amara Emerson703da2e2013-10-31 09:32:33 +00001468 case llvm::Triple::aarch64:
Christian Pirker9b019ae2014-02-25 13:51:00 +00001469 case llvm::Triple::aarch64_be:
Tim Northover573cbee2014-05-24 12:52:07 +00001470 return getAArch64TargetCPU(Args);
Quentin Colombetd9f26202014-04-15 00:27:35 +00001471
Rafael Espindola22ce34a2013-08-20 22:12:08 +00001472 case llvm::Triple::arm:
Christian Pirkerf01cd6f2014-03-28 14:40:46 +00001473 case llvm::Triple::armeb:
Rafael Espindola22ce34a2013-08-20 22:12:08 +00001474 case llvm::Triple::thumb:
Christian Pirkerf01cd6f2014-03-28 14:40:46 +00001475 case llvm::Triple::thumbeb:
Bernard Ogden31561762013-12-12 13:27:11 +00001476 return arm::getARMTargetCPU(Args, T);
Rafael Espindola22ce34a2013-08-20 22:12:08 +00001477
1478 case llvm::Triple::mips:
1479 case llvm::Triple::mipsel:
1480 case llvm::Triple::mips64:
1481 case llvm::Triple::mips64el: {
1482 StringRef CPUName;
1483 StringRef ABIName;
Simon Atanasyan7018e1d2014-07-16 12:29:22 +00001484 mips::getMipsCPUAndABI(Args, T, CPUName, ABIName);
Rafael Espindola22ce34a2013-08-20 22:12:08 +00001485 return CPUName;
1486 }
1487
1488 case llvm::Triple::ppc:
1489 case llvm::Triple::ppc64:
1490 case llvm::Triple::ppc64le: {
1491 std::string TargetCPUName = getPPCTargetCPU(Args);
1492 // LLVM may default to generating code for the native CPU,
1493 // but, like gcc, we default to a more generic option for
1494 // each architecture. (except on Darwin)
1495 if (TargetCPUName.empty() && !T.isOSDarwin()) {
1496 if (T.getArch() == llvm::Triple::ppc64)
1497 TargetCPUName = "ppc64";
1498 else if (T.getArch() == llvm::Triple::ppc64le)
1499 TargetCPUName = "ppc64le";
1500 else
1501 TargetCPUName = "ppc";
1502 }
1503 return TargetCPUName;
1504 }
1505
1506 case llvm::Triple::sparc:
Roman Divackyb1ae3d42014-02-25 18:35:30 +00001507 case llvm::Triple::sparcv9:
1508 if (const Arg *A = Args.getLastArg(options::OPT_mcpu_EQ))
Rafael Espindola22ce34a2013-08-20 22:12:08 +00001509 return A->getValue();
1510 return "";
1511
1512 case llvm::Triple::x86:
1513 case llvm::Triple::x86_64:
1514 return getX86TargetCPU(Args, T);
1515
1516 case llvm::Triple::hexagon:
1517 return "hexagon" + toolchains::Hexagon_TC::GetTargetCPU(Args).str();
1518
1519 case llvm::Triple::systemz:
1520 return getSystemZTargetCPU(Args);
1521
1522 case llvm::Triple::r600:
Tom Stellardd8e38a32015-01-06 20:34:47 +00001523 case llvm::Triple::amdgcn:
Rafael Espindola22ce34a2013-08-20 22:12:08 +00001524 return getR600TargetGPU(Args);
1525 }
1526}
1527
Alp Tokerce365ca2013-12-02 12:43:03 +00001528static void AddGoldPlugin(const ToolChain &ToolChain, const ArgList &Args,
1529 ArgStringList &CmdArgs) {
1530 // Tell the linker to load the plugin. This has to come before AddLinkerInputs
1531 // as gold requires -plugin to come before any -plugin-opt that -Wl might
1532 // forward.
1533 CmdArgs.push_back("-plugin");
1534 std::string Plugin = ToolChain.getDriver().Dir + "/../lib/LLVMgold.so";
1535 CmdArgs.push_back(Args.MakeArgString(Plugin));
1536
1537 // Try to pass driver level flags relevant to LTO code generation down to
1538 // the plugin.
1539
1540 // Handle flags for selecting CPU variants.
1541 std::string CPU = getCPUName(Args, ToolChain.getTriple());
1542 if (!CPU.empty())
1543 CmdArgs.push_back(Args.MakeArgString(Twine("-plugin-opt=mcpu=") + CPU));
1544}
1545
Ehsan Akhgarieeb7e652014-07-15 18:27:51 +00001546static void getX86TargetFeatures(const Driver & D,
1547 const llvm::Triple &Triple,
Jim Grosbach82eee262013-11-16 00:53:35 +00001548 const ArgList &Args,
Rafael Espindola28e1f4b2013-08-21 16:39:20 +00001549 std::vector<const char *> &Features) {
Jim Grosbach82eee262013-11-16 00:53:35 +00001550 if (Triple.getArchName() == "x86_64h") {
1551 // x86_64h implies quite a few of the more modern subtarget features
1552 // for Haswell class CPUs, but not all of them. Opt-out of a few.
1553 Features.push_back("-rdrnd");
1554 Features.push_back("-aes");
1555 Features.push_back("-pclmul");
1556 Features.push_back("-rtm");
1557 Features.push_back("-hle");
1558 Features.push_back("-fsgsbase");
1559 }
1560
Alexey Volkov54ff0802014-06-25 12:15:36 +00001561 // Add features to comply with gcc on Android
Alexey Bataev286d1b92014-01-31 04:07:13 +00001562 if (Triple.getEnvironment() == llvm::Triple::Android) {
Alexey Volkov54ff0802014-06-25 12:15:36 +00001563 if (Triple.getArch() == llvm::Triple::x86_64) {
1564 Features.push_back("+sse4.2");
1565 Features.push_back("+popcnt");
1566 } else
1567 Features.push_back("+ssse3");
Alexey Bataev286d1b92014-01-31 04:07:13 +00001568 }
1569
Ehsan Akhgarieeb7e652014-07-15 18:27:51 +00001570 // Set features according to the -arch flag on MSVC
1571 if (Arg *A = Args.getLastArg(options::OPT__SLASH_arch)) {
1572 StringRef Arch = A->getValue();
1573 bool ArchUsed = false;
1574 // First, look for flags that are shared in x86 and x86-64.
1575 if (Triple.getArch() == llvm::Triple::x86_64 ||
1576 Triple.getArch() == llvm::Triple::x86) {
1577 if (Arch == "AVX" || Arch == "AVX2") {
1578 ArchUsed = true;
1579 Features.push_back(Args.MakeArgString("+" + Arch.lower()));
1580 }
1581 }
1582 // Then, look for x86-specific flags.
1583 if (Triple.getArch() == llvm::Triple::x86) {
1584 if (Arch == "IA32") {
1585 ArchUsed = true;
1586 } else if (Arch == "SSE" || Arch == "SSE2") {
1587 ArchUsed = true;
1588 Features.push_back(Args.MakeArgString("+" + Arch.lower()));
1589 }
1590 }
1591 if (!ArchUsed)
1592 D.Diag(clang::diag::warn_drv_unused_argument) << A->getAsString(Args);
1593 }
1594
Jim Grosbach82eee262013-11-16 00:53:35 +00001595 // Now add any that the user explicitly requested on the command line,
1596 // which may override the defaults.
Rafael Espindola28e1f4b2013-08-21 16:39:20 +00001597 for (arg_iterator it = Args.filtered_begin(options::OPT_m_x86_Features_Group),
1598 ie = Args.filtered_end();
1599 it != ie; ++it) {
1600 StringRef Name = (*it)->getOption().getName();
1601 (*it)->claim();
1602
1603 // Skip over "-m".
1604 assert(Name.startswith("m") && "Invalid feature name.");
1605 Name = Name.substr(1);
1606
1607 bool IsNegative = Name.startswith("no-");
1608 if (IsNegative)
1609 Name = Name.substr(3);
1610
1611 Features.push_back(Args.MakeArgString((IsNegative ? "-" : "+") + Name));
1612 }
1613}
1614
Daniel Dunbar3b3191f2009-09-09 22:33:08 +00001615void Clang::AddX86TargetArgs(const ArgList &Args,
1616 ArgStringList &CmdArgs) const {
Daniel Dunbare2cf8f72009-09-10 22:59:57 +00001617 if (!Args.hasFlag(options::OPT_mred_zone,
1618 options::OPT_mno_red_zone,
1619 true) ||
1620 Args.hasArg(options::OPT_mkernel) ||
1621 Args.hasArg(options::OPT_fapple_kext))
Daniel Dunbar8bed86c2009-11-20 22:21:36 +00001622 CmdArgs.push_back("-disable-red-zone");
Daniel Dunbare2cf8f72009-09-10 22:59:57 +00001623
Bob Wilson2616e2e2013-02-10 16:01:41 +00001624 // Default to avoid implicit floating-point for kernel/kext code, but allow
1625 // that to be overridden with -mno-soft-float.
1626 bool NoImplicitFloat = (Args.hasArg(options::OPT_mkernel) ||
1627 Args.hasArg(options::OPT_fapple_kext));
1628 if (Arg *A = Args.getLastArg(options::OPT_msoft_float,
1629 options::OPT_mno_soft_float,
Bob Wilson9c8af452013-04-11 18:53:25 +00001630 options::OPT_mimplicit_float,
Bob Wilson2616e2e2013-02-10 16:01:41 +00001631 options::OPT_mno_implicit_float)) {
1632 const Option &O = A->getOption();
1633 NoImplicitFloat = (O.matches(options::OPT_mno_implicit_float) ||
1634 O.matches(options::OPT_msoft_float));
1635 }
1636 if (NoImplicitFloat)
Daniel Dunbar8bed86c2009-11-20 22:21:36 +00001637 CmdArgs.push_back("-no-implicit-float");
Nico Weberad8e36c2014-05-13 11:11:24 +00001638
1639 if (Arg *A = Args.getLastArg(options::OPT_masm_EQ)) {
1640 StringRef Value = A->getValue();
1641 if (Value == "intel" || Value == "att") {
1642 CmdArgs.push_back("-mllvm");
1643 CmdArgs.push_back(Args.MakeArgString("-x86-asm-syntax=" + Value));
1644 } else {
1645 getToolChain().getDriver().Diag(diag::err_drv_unsupported_option_argument)
1646 << A->getOption().getName() << Value;
1647 }
1648 }
Daniel Dunbar3b3191f2009-09-09 22:33:08 +00001649}
1650
Matthew Curtise8f80a12012-12-06 17:49:03 +00001651static inline bool HasPICArg(const ArgList &Args) {
1652 return Args.hasArg(options::OPT_fPIC)
1653 || Args.hasArg(options::OPT_fpic);
1654}
1655
1656static Arg *GetLastSmallDataThresholdArg(const ArgList &Args) {
1657 return Args.getLastArg(options::OPT_G,
1658 options::OPT_G_EQ,
1659 options::OPT_msmall_data_threshold_EQ);
1660}
1661
1662static std::string GetHexagonSmallDataThresholdValue(const ArgList &Args) {
1663 std::string value;
1664 if (HasPICArg(Args))
1665 value = "0";
1666 else if (Arg *A = GetLastSmallDataThresholdArg(Args)) {
1667 value = A->getValue();
1668 A->claim();
1669 }
1670 return value;
1671}
1672
Tony Linthicum76329bf2011-12-12 21:14:55 +00001673void Clang::AddHexagonTargetArgs(const ArgList &Args,
1674 ArgStringList &CmdArgs) const {
Tony Linthicum76329bf2011-12-12 21:14:55 +00001675 CmdArgs.push_back("-fno-signed-char");
Matthew Curtis6b222782012-12-07 13:52:44 +00001676 CmdArgs.push_back("-mqdsp6-compat");
1677 CmdArgs.push_back("-Wreturn-type");
Tony Linthicum76329bf2011-12-12 21:14:55 +00001678
Matthew Curtise8f80a12012-12-06 17:49:03 +00001679 std::string SmallDataThreshold = GetHexagonSmallDataThresholdValue(Args);
1680 if (!SmallDataThreshold.empty()) {
Tony Linthicum76329bf2011-12-12 21:14:55 +00001681 CmdArgs.push_back ("-mllvm");
Matthew Curtise8f80a12012-12-06 17:49:03 +00001682 CmdArgs.push_back(Args.MakeArgString(
1683 "-hexagon-small-data-threshold=" + SmallDataThreshold));
Tony Linthicum76329bf2011-12-12 21:14:55 +00001684 }
1685
Sirish Pande11ebc4e2012-05-10 20:19:54 +00001686 if (!Args.hasArg(options::OPT_fno_short_enums))
1687 CmdArgs.push_back("-fshort-enums");
1688 if (Args.getLastArg(options::OPT_mieee_rnd_near)) {
1689 CmdArgs.push_back ("-mllvm");
1690 CmdArgs.push_back ("-enable-hexagon-ieee-rnd-near");
1691 }
Tony Linthicum76329bf2011-12-12 21:14:55 +00001692 CmdArgs.push_back ("-mllvm");
1693 CmdArgs.push_back ("-machine-sink-split=0");
1694}
1695
Kevin Qin110db6f2014-07-18 07:03:22 +00001696// Decode AArch64 features from string like +[no]featureA+[no]featureB+...
Craig Topperbf3e3272014-08-30 16:55:52 +00001697static bool DecodeAArch64Features(const Driver &D, StringRef text,
Kevin Qin110db6f2014-07-18 07:03:22 +00001698 std::vector<const char *> &Features) {
1699 SmallVector<StringRef, 8> Split;
1700 text.split(Split, StringRef("+"), -1, false);
1701
1702 for (unsigned I = 0, E = Split.size(); I != E; ++I) {
1703 const char *result = llvm::StringSwitch<const char *>(Split[I])
1704 .Case("fp", "+fp-armv8")
1705 .Case("simd", "+neon")
1706 .Case("crc", "+crc")
1707 .Case("crypto", "+crypto")
1708 .Case("nofp", "-fp-armv8")
1709 .Case("nosimd", "-neon")
1710 .Case("nocrc", "-crc")
1711 .Case("nocrypto", "-crypto")
1712 .Default(nullptr);
1713 if (result)
1714 Features.push_back(result);
1715 else if (Split[I] == "neon" || Split[I] == "noneon")
1716 D.Diag(diag::err_drv_no_neon_modifier);
1717 else
1718 return false;
1719 }
1720 return true;
1721}
1722
1723// Check if the CPU name and feature modifiers in -mcpu are legal. If yes,
1724// decode CPU and feature.
1725static bool DecodeAArch64Mcpu(const Driver &D, StringRef Mcpu, StringRef &CPU,
1726 std::vector<const char *> &Features) {
1727 std::pair<StringRef, StringRef> Split = Mcpu.split("+");
1728 CPU = Split.first;
1729 if (CPU == "cyclone" || CPU == "cortex-a53" || CPU == "cortex-a57") {
1730 Features.push_back("+neon");
1731 Features.push_back("+crc");
1732 Features.push_back("+crypto");
1733 } else if (CPU == "generic") {
1734 Features.push_back("+neon");
1735 } else {
1736 return false;
1737 }
1738
1739 if (Split.second.size() && !DecodeAArch64Features(D, Split.second, Features))
1740 return false;
1741
1742 return true;
1743}
1744
1745static bool
1746getAArch64ArchFeaturesFromMarch(const Driver &D, StringRef March,
1747 const ArgList &Args,
1748 std::vector<const char *> &Features) {
1749 std::pair<StringRef, StringRef> Split = March.split("+");
1750 if (Split.first != "armv8-a")
1751 return false;
1752
1753 if (Split.second.size() && !DecodeAArch64Features(D, Split.second, Features))
1754 return false;
1755
1756 return true;
1757}
1758
1759static bool
1760getAArch64ArchFeaturesFromMcpu(const Driver &D, StringRef Mcpu,
1761 const ArgList &Args,
1762 std::vector<const char *> &Features) {
1763 StringRef CPU;
1764 if (!DecodeAArch64Mcpu(D, Mcpu, CPU, Features))
1765 return false;
1766
1767 return true;
1768}
1769
1770static bool
1771getAArch64MicroArchFeaturesFromMtune(const Driver &D, StringRef Mtune,
1772 const ArgList &Args,
1773 std::vector<const char *> &Features) {
1774 // Handle CPU name is 'native'.
1775 if (Mtune == "native")
1776 Mtune = llvm::sys::getHostCPUName();
1777 if (Mtune == "cyclone") {
1778 Features.push_back("+zcm");
1779 Features.push_back("+zcz");
1780 }
1781 return true;
1782}
1783
1784static bool
1785getAArch64MicroArchFeaturesFromMcpu(const Driver &D, StringRef Mcpu,
1786 const ArgList &Args,
1787 std::vector<const char *> &Features) {
1788 StringRef CPU;
1789 std::vector<const char *> DecodedFeature;
1790 if (!DecodeAArch64Mcpu(D, Mcpu, CPU, DecodedFeature))
1791 return false;
1792
1793 return getAArch64MicroArchFeaturesFromMtune(D, CPU, Args, Features);
1794}
1795
Rafael Espindola28e1f4b2013-08-21 16:39:20 +00001796static void getAArch64TargetFeatures(const Driver &D, const ArgList &Args,
1797 std::vector<const char *> &Features) {
Kevin Qin110db6f2014-07-18 07:03:22 +00001798 Arg *A;
1799 bool success = true;
1800 // Enable NEON by default.
1801 Features.push_back("+neon");
1802 if ((A = Args.getLastArg(options::OPT_march_EQ)))
1803 success = getAArch64ArchFeaturesFromMarch(D, A->getValue(), Args, Features);
1804 else if ((A = Args.getLastArg(options::OPT_mcpu_EQ)))
1805 success = getAArch64ArchFeaturesFromMcpu(D, A->getValue(), Args, Features);
Tim Northover642e7702014-11-10 21:17:23 +00001806 else if (Args.hasArg(options::OPT_arch))
1807 success = getAArch64ArchFeaturesFromMcpu(D, getAArch64TargetCPU(Args), Args,
1808 Features);
Kevin Qin110db6f2014-07-18 07:03:22 +00001809
1810 if (success && (A = Args.getLastArg(options::OPT_mtune_EQ)))
1811 success =
1812 getAArch64MicroArchFeaturesFromMtune(D, A->getValue(), Args, Features);
1813 else if (success && (A = Args.getLastArg(options::OPT_mcpu_EQ)))
1814 success =
1815 getAArch64MicroArchFeaturesFromMcpu(D, A->getValue(), Args, Features);
Tim Northover642e7702014-11-10 21:17:23 +00001816 else if (Args.hasArg(options::OPT_arch))
1817 success = getAArch64MicroArchFeaturesFromMcpu(D, getAArch64TargetCPU(Args),
1818 Args, Features);
Kevin Qin110db6f2014-07-18 07:03:22 +00001819
1820 if (!success)
1821 D.Diag(diag::err_drv_clang_unsupported) << A->getAsString(Args);
Amara Emerson04e2ecf2014-01-23 15:48:30 +00001822
1823 if (Args.getLastArg(options::OPT_mgeneral_regs_only)) {
1824 Features.push_back("-fp-armv8");
1825 Features.push_back("-crypto");
1826 Features.push_back("-neon");
1827 }
Bradley Smith418c5932014-05-02 15:17:51 +00001828
1829 // En/disable crc
1830 if (Arg *A = Args.getLastArg(options::OPT_mcrc,
1831 options::OPT_mnocrc)) {
1832 if (A->getOption().matches(options::OPT_mcrc))
1833 Features.push_back("+crc");
1834 else
1835 Features.push_back("-crc");
1836 }
Rafael Espindola28e1f4b2013-08-21 16:39:20 +00001837}
1838
1839static void getTargetFeatures(const Driver &D, const llvm::Triple &Triple,
Rafael Espindola9c6fb0f2013-11-23 14:36:40 +00001840 const ArgList &Args, ArgStringList &CmdArgs,
1841 bool ForAS) {
Rafael Espindola28e1f4b2013-08-21 16:39:20 +00001842 std::vector<const char *> Features;
1843 switch (Triple.getArch()) {
1844 default:
1845 break;
1846 case llvm::Triple::mips:
1847 case llvm::Triple::mipsel:
1848 case llvm::Triple::mips64:
1849 case llvm::Triple::mips64el:
Daniel Sanders379d44b2014-07-16 11:52:23 +00001850 getMIPSTargetFeatures(D, Triple, Args, Features);
Rafael Espindola28e1f4b2013-08-21 16:39:20 +00001851 break;
1852
1853 case llvm::Triple::arm:
Christian Pirkerf01cd6f2014-03-28 14:40:46 +00001854 case llvm::Triple::armeb:
Rafael Espindola28e1f4b2013-08-21 16:39:20 +00001855 case llvm::Triple::thumb:
Christian Pirkerf01cd6f2014-03-28 14:40:46 +00001856 case llvm::Triple::thumbeb:
Rafael Espindola9c6fb0f2013-11-23 14:36:40 +00001857 getARMTargetFeatures(D, Triple, Args, Features, ForAS);
Rafael Espindola28e1f4b2013-08-21 16:39:20 +00001858 break;
1859
1860 case llvm::Triple::ppc:
1861 case llvm::Triple::ppc64:
1862 case llvm::Triple::ppc64le:
1863 getPPCTargetFeatures(Args, Features);
1864 break;
1865 case llvm::Triple::sparc:
Brad Smithf436e9e2014-08-19 21:50:15 +00001866 case llvm::Triple::sparcv9:
Rafael Espindola28e1f4b2013-08-21 16:39:20 +00001867 getSparcTargetFeatures(Args, Features);
1868 break;
1869 case llvm::Triple::aarch64:
Christian Pirker9b019ae2014-02-25 13:51:00 +00001870 case llvm::Triple::aarch64_be:
Rafael Espindola28e1f4b2013-08-21 16:39:20 +00001871 getAArch64TargetFeatures(D, Args, Features);
1872 break;
1873 case llvm::Triple::x86:
1874 case llvm::Triple::x86_64:
Ehsan Akhgarieeb7e652014-07-15 18:27:51 +00001875 getX86TargetFeatures(D, Triple, Args, Features);
Rafael Espindola28e1f4b2013-08-21 16:39:20 +00001876 break;
1877 }
Rafael Espindola43964802013-08-21 17:34:32 +00001878
1879 // Find the last of each feature.
1880 llvm::StringMap<unsigned> LastOpt;
1881 for (unsigned I = 0, N = Features.size(); I < N; ++I) {
1882 const char *Name = Features[I];
1883 assert(Name[0] == '-' || Name[0] == '+');
1884 LastOpt[Name + 1] = I;
1885 }
1886
1887 for (unsigned I = 0, N = Features.size(); I < N; ++I) {
1888 // If this feature was overridden, ignore it.
1889 const char *Name = Features[I];
1890 llvm::StringMap<unsigned>::iterator LastI = LastOpt.find(Name + 1);
1891 assert(LastI != LastOpt.end());
1892 unsigned Last = LastI->second;
1893 if (Last != I)
1894 continue;
1895
Rafael Espindola28e1f4b2013-08-21 16:39:20 +00001896 CmdArgs.push_back("-target-feature");
Rafael Espindola43964802013-08-21 17:34:32 +00001897 CmdArgs.push_back(Name);
Rafael Espindola28e1f4b2013-08-21 16:39:20 +00001898 }
Tim Northover2fe823a2013-08-01 09:23:19 +00001899}
1900
David Majnemerae394812014-12-09 00:12:30 +00001901static bool
1902shouldUseExceptionTablesForObjCExceptions(const ObjCRuntime &runtime,
1903 const llvm::Triple &Triple) {
1904 // We use the zero-cost exception tables for Objective-C if the non-fragile
1905 // ABI is enabled or when compiling for x86_64 and ARM on Snow Leopard and
1906 // later.
1907 if (runtime.isNonFragile())
1908 return true;
1909
1910 if (!Triple.isMacOSX())
1911 return false;
1912
1913 return (!Triple.isMacOSXVersionLT(10,5) &&
1914 (Triple.getArch() == llvm::Triple::x86_64 ||
1915 Triple.getArch() == llvm::Triple::arm));
1916}
1917
Nico Webere8e53112014-05-11 01:04:02 +00001918// exceptionSettings() exists to share the logic between -cc1 and linker
1919// invocations.
David Majnemer8de68642014-12-05 08:11:58 +00001920static bool exceptionSettings(const ArgList &Args, const llvm::Triple &Triple) {
Robert Lyttonf7e03c12014-02-13 10:34:44 +00001921 if (Arg *A = Args.getLastArg(options::OPT_fexceptions,
David Majnemer8de68642014-12-05 08:11:58 +00001922 options::OPT_fno_exceptions))
Robert Lyttonf7e03c12014-02-13 10:34:44 +00001923 if (A->getOption().matches(options::OPT_fexceptions))
David Majnemer8de68642014-12-05 08:11:58 +00001924 return true;
Robert Lyttonf7e03c12014-02-13 10:34:44 +00001925
David Majnemer8de68642014-12-05 08:11:58 +00001926 return false;
Robert Lyttonf7e03c12014-02-13 10:34:44 +00001927}
1928
Anders Carlssone96ab552011-02-28 02:27:16 +00001929/// addExceptionArgs - Adds exception related arguments to the driver command
1930/// arguments. There's a master flag, -fexceptions and also language specific
1931/// flags to enable/disable C++ and Objective-C exceptions.
1932/// This makes it possible to for example disable C++ exceptions but enable
1933/// Objective-C exceptions.
1934static void addExceptionArgs(const ArgList &Args, types::ID InputType,
1935 const llvm::Triple &Triple,
Fariborz Jahanianb2482212012-04-04 18:28:00 +00001936 bool KernelOrKext,
John McCall5fb5df92012-06-20 06:18:46 +00001937 const ObjCRuntime &objcRuntime,
Anders Carlssone96ab552011-02-28 02:27:16 +00001938 ArgStringList &CmdArgs) {
Chad Rosier4fab82c2012-03-26 22:04:46 +00001939 if (KernelOrKext) {
1940 // -mkernel and -fapple-kext imply no exceptions, so claim exception related
1941 // arguments now to avoid warnings about unused arguments.
1942 Args.ClaimAllArgs(options::OPT_fexceptions);
1943 Args.ClaimAllArgs(options::OPT_fno_exceptions);
1944 Args.ClaimAllArgs(options::OPT_fobjc_exceptions);
1945 Args.ClaimAllArgs(options::OPT_fno_objc_exceptions);
1946 Args.ClaimAllArgs(options::OPT_fcxx_exceptions);
1947 Args.ClaimAllArgs(options::OPT_fno_cxx_exceptions);
Anders Carlssone96ab552011-02-28 02:27:16 +00001948 return;
Chad Rosier4fab82c2012-03-26 22:04:46 +00001949 }
Anders Carlssone96ab552011-02-28 02:27:16 +00001950
David Majnemer8de68642014-12-05 08:11:58 +00001951 // Gather the exception settings from the command line arguments.
1952 bool EH = exceptionSettings(Args, Triple);
Daniel Dunbar30a12b82010-09-14 23:12:31 +00001953
David Majnemerae394812014-12-09 00:12:30 +00001954 // Obj-C exceptions are enabled by default, regardless of -fexceptions. This
1955 // is not necessarily sensible, but follows GCC.
1956 if (types::isObjC(InputType) &&
1957 Args.hasFlag(options::OPT_fobjc_exceptions,
1958 options::OPT_fno_objc_exceptions,
1959 true)) {
1960 CmdArgs.push_back("-fobjc-exceptions");
Anders Carlssone96ab552011-02-28 02:27:16 +00001961
David Majnemerae394812014-12-09 00:12:30 +00001962 EH |= shouldUseExceptionTablesForObjCExceptions(objcRuntime, Triple);
Anders Carlssone96ab552011-02-28 02:27:16 +00001963 }
1964
1965 if (types::isCXX(InputType)) {
Filipe Cabecinhas4b442572015-01-27 17:27:37 +00001966 bool CXXExceptionsEnabled =
1967 Triple.getArch() != llvm::Triple::xcore && !Triple.isPS4CPU();
Eric Christopher84fbdb42011-08-19 00:30:14 +00001968 if (Arg *A = Args.getLastArg(options::OPT_fcxx_exceptions,
1969 options::OPT_fno_cxx_exceptions,
Anders Carlssone96ab552011-02-28 02:27:16 +00001970 options::OPT_fexceptions,
David Majnemer8de68642014-12-05 08:11:58 +00001971 options::OPT_fno_exceptions))
1972 CXXExceptionsEnabled =
1973 A->getOption().matches(options::OPT_fcxx_exceptions) ||
1974 A->getOption().matches(options::OPT_fexceptions);
Anders Carlssone96ab552011-02-28 02:27:16 +00001975
1976 if (CXXExceptionsEnabled) {
1977 CmdArgs.push_back("-fcxx-exceptions");
1978
David Majnemer8de68642014-12-05 08:11:58 +00001979 EH = true;
Anders Carlssone96ab552011-02-28 02:27:16 +00001980 }
1981 }
1982
David Majnemer8de68642014-12-05 08:11:58 +00001983 if (EH)
Anders Carlssone96ab552011-02-28 02:27:16 +00001984 CmdArgs.push_back("-fexceptions");
Rafael Espindola00a66572009-10-01 13:33:33 +00001985}
1986
Daniel Dunbare246fbe2013-04-16 18:21:19 +00001987static bool ShouldDisableAutolink(const ArgList &Args,
1988 const ToolChain &TC) {
1989 bool Default = true;
1990 if (TC.getTriple().isOSDarwin()) {
1991 // The native darwin assembler doesn't support the linker_option directives,
1992 // so we disable them if we think the .s file will be passed to it.
1993 Default = TC.useIntegratedAs();
1994 }
1995 return !Args.hasFlag(options::OPT_fautolink, options::OPT_fno_autolink,
1996 Default);
1997}
1998
Ted Kremenek62093662013-03-12 17:02:12 +00001999static bool ShouldDisableDwarfDirectory(const ArgList &Args,
2000 const ToolChain &TC) {
Nick Lewycky1d617ac2011-10-17 23:05:52 +00002001 bool UseDwarfDirectory = Args.hasFlag(options::OPT_fdwarf_directory_asm,
2002 options::OPT_fno_dwarf_directory_asm,
Rafael Espindola84b588b2013-03-18 18:10:27 +00002003 TC.useIntegratedAs());
Nick Lewycky1d617ac2011-10-17 23:05:52 +00002004 return !UseDwarfDirectory;
2005}
2006
Joerg Sonnenbergeref317a22011-05-06 14:35:16 +00002007/// \brief Check whether the given input tree contains any compilation actions.
2008static bool ContainsCompileAction(const Action *A) {
Bob Wilson23a55f12014-12-21 07:00:00 +00002009 if (isa<CompileJobAction>(A) || isa<BackendJobAction>(A))
Joerg Sonnenbergeref317a22011-05-06 14:35:16 +00002010 return true;
2011
Saleem Abdulrasool2456cea2014-06-12 02:08:04 +00002012 for (const auto &Act : *A)
2013 if (ContainsCompileAction(Act))
Joerg Sonnenbergeref317a22011-05-06 14:35:16 +00002014 return true;
2015
2016 return false;
2017}
2018
2019/// \brief Check if -relax-all should be passed to the internal assembler.
2020/// This is done by default when compiling non-assembler source with -O0.
2021static bool UseRelaxAll(Compilation &C, const ArgList &Args) {
2022 bool RelaxDefault = true;
2023
2024 if (Arg *A = Args.getLastArg(options::OPT_O_Group))
2025 RelaxDefault = A->getOption().matches(options::OPT_O0);
2026
2027 if (RelaxDefault) {
2028 RelaxDefault = false;
Saleem Abdulrasool2456cea2014-06-12 02:08:04 +00002029 for (const auto &Act : C.getActions()) {
2030 if (ContainsCompileAction(Act)) {
Joerg Sonnenbergeref317a22011-05-06 14:35:16 +00002031 RelaxDefault = true;
2032 break;
2033 }
2034 }
2035 }
2036
2037 return Args.hasFlag(options::OPT_mrelax_all, options::OPT_mno_relax_all,
2038 RelaxDefault);
2039}
2040
David Blaikie9260ed62013-07-25 21:19:01 +00002041static void CollectArgsForIntegratedAssembler(Compilation &C,
2042 const ArgList &Args,
2043 ArgStringList &CmdArgs,
2044 const Driver &D) {
2045 if (UseRelaxAll(C, Args))
2046 CmdArgs.push_back("-mrelax-all");
2047
David Peixottodfb66142013-11-14 22:52:58 +00002048 // When passing -I arguments to the assembler we sometimes need to
David Peixotto4afe0792013-11-14 22:58:17 +00002049 // unconditionally take the next argument. For example, when parsing
David Peixottodfb66142013-11-14 22:52:58 +00002050 // '-Wa,-I -Wa,foo' we need to accept the -Wa,foo arg after seeing the
2051 // -Wa,-I arg and when parsing '-Wa,-I,foo' we need to accept the 'foo'
2052 // arg after parsing the '-I' arg.
2053 bool TakeNextArg = false;
2054
David Blaikie9260ed62013-07-25 21:19:01 +00002055 // When using an integrated assembler, translate -Wa, and -Xassembler
2056 // options.
David Blaikie7e2fd942014-03-27 20:47:30 +00002057 bool CompressDebugSections = false;
David Blaikie9260ed62013-07-25 21:19:01 +00002058 for (arg_iterator it = Args.filtered_begin(options::OPT_Wa_COMMA,
2059 options::OPT_Xassembler),
2060 ie = Args.filtered_end(); it != ie; ++it) {
2061 const Arg *A = *it;
2062 A->claim();
2063
2064 for (unsigned i = 0, e = A->getNumValues(); i != e; ++i) {
2065 StringRef Value = A->getValue(i);
David Peixottodfb66142013-11-14 22:52:58 +00002066 if (TakeNextArg) {
2067 CmdArgs.push_back(Value.data());
2068 TakeNextArg = false;
2069 continue;
2070 }
David Blaikie9260ed62013-07-25 21:19:01 +00002071
2072 if (Value == "-force_cpusubtype_ALL") {
2073 // Do nothing, this is the default and we don't support anything else.
2074 } else if (Value == "-L") {
2075 CmdArgs.push_back("-msave-temp-labels");
2076 } else if (Value == "--fatal-warnings") {
Joerg Sonnenbergera43604a2014-08-26 18:40:25 +00002077 CmdArgs.push_back("-massembler-fatal-warnings");
David Blaikie9260ed62013-07-25 21:19:01 +00002078 } else if (Value == "--noexecstack") {
2079 CmdArgs.push_back("-mnoexecstack");
David Blaikieec59e752014-01-22 19:22:21 +00002080 } else if (Value == "-compress-debug-sections" ||
2081 Value == "--compress-debug-sections") {
David Blaikie7e2fd942014-03-27 20:47:30 +00002082 CompressDebugSections = true;
2083 } else if (Value == "-nocompress-debug-sections" ||
2084 Value == "--nocompress-debug-sections") {
2085 CompressDebugSections = false;
David Peixottodfb66142013-11-14 22:52:58 +00002086 } else if (Value.startswith("-I")) {
2087 CmdArgs.push_back(Value.data());
2088 // We need to consume the next argument if the current arg is a plain
2089 // -I. The next arg will be the include directory.
2090 if (Value == "-I")
2091 TakeNextArg = true;
Oliver Stannard9b2a7d42014-05-19 13:39:13 +00002092 } else if (Value.startswith("-gdwarf-")) {
2093 CmdArgs.push_back(Value.data());
David Blaikie9260ed62013-07-25 21:19:01 +00002094 } else {
2095 D.Diag(diag::err_drv_unsupported_option_argument)
2096 << A->getOption().getName() << Value;
2097 }
2098 }
2099 }
David Blaikie24bbfed22014-03-31 23:29:38 +00002100 if (CompressDebugSections) {
2101 if (llvm::zlib::isAvailable())
2102 CmdArgs.push_back("-compress-debug-sections");
2103 else
2104 D.Diag(diag::warn_debug_compression_unavailable);
2105 }
David Blaikie9260ed62013-07-25 21:19:01 +00002106}
2107
Renato Goline807c122014-01-31 11:47:28 +00002108// Until ARM libraries are build separately, we have them all in one library
2109static StringRef getArchNameForCompilerRTLib(const ToolChain &TC) {
Saleem Abdulrasool61770ab2015-01-02 21:47:33 +00002110 // FIXME: handle 64-bit
2111 if (TC.getTriple().isOSWindows() &&
2112 !TC.getTriple().isWindowsItaniumEnvironment())
2113 return "i386";
Saleem Abdulrasool2e46ebe2014-12-30 22:52:06 +00002114 if (TC.getArch() == llvm::Triple::arm || TC.getArch() == llvm::Triple::armeb)
Renato Goline807c122014-01-31 11:47:28 +00002115 return "arm";
Saleem Abdulrasool2e46ebe2014-12-30 22:52:06 +00002116 return TC.getArchName();
Renato Goline807c122014-01-31 11:47:28 +00002117}
2118
Alexey Samsonovce8ab102014-02-25 12:43:43 +00002119static SmallString<128> getCompilerRTLibDir(const ToolChain &TC) {
2120 // The runtimes are located in the OS-specific resource directory.
2121 SmallString<128> Res(TC.getDriver().ResourceDir);
Viktor Kutuzovaa5b5f72014-03-18 09:36:50 +00002122 const llvm::Triple &Triple = TC.getTriple();
2123 // TC.getOS() yield "freebsd10.0" whereas "freebsd" is expected.
Saleem Abdulrasool2e46ebe2014-12-30 22:52:06 +00002124 StringRef OSLibName =
2125 (Triple.getOS() == llvm::Triple::FreeBSD) ? "freebsd" : TC.getOS();
Viktor Kutuzovaa5b5f72014-03-18 09:36:50 +00002126 llvm::sys::path::append(Res, "lib", OSLibName);
Alexey Samsonovce8ab102014-02-25 12:43:43 +00002127 return Res;
Alexey Samsonov7811d192014-02-20 13:57:37 +00002128}
2129
Saleem Abdulrasool68150942014-12-30 22:52:08 +00002130static SmallString<128> getCompilerRT(const ToolChain &TC, StringRef Component,
Dan Albert6f2875d2015-01-28 23:23:36 +00002131 bool Shared = false) {
2132 const char *Env = TC.getTriple().getEnvironment() == llvm::Triple::Android
2133 ? "-android"
2134 : "";
2135
Saleem Abdulrasool68150942014-12-30 22:52:08 +00002136 bool IsOSWindows = TC.getTriple().isOSWindows();
2137 StringRef Arch = getArchNameForCompilerRTLib(TC);
2138 const char *Prefix = IsOSWindows ? "" : "lib";
2139 const char *Suffix =
2140 Shared ? (IsOSWindows ? ".dll" : ".so") : (IsOSWindows ? ".lib" : ".a");
2141
2142 SmallString<128> Path = getCompilerRTLibDir(TC);
2143 llvm::sys::path::append(Path, Prefix + Twine("clang_rt.") + Component + "-" +
2144 Arch + Env + Suffix);
2145
2146 return Path;
2147}
2148
Alexey Samsonov99ee10d2014-05-22 21:13:30 +00002149// This adds the static libclang_rt.builtins-arch.a directly to the command line
Renato Golinc4b49242014-02-13 10:01:16 +00002150// FIXME: Make sure we can also emit shared objects if they're requested
2151// and available, check for possible errors, etc.
Saleem Abdulrasool8d7ade72014-12-30 02:10:36 +00002152static void addClangRT(const ToolChain &TC, const ArgList &Args,
2153 ArgStringList &CmdArgs) {
Saleem Abdulrasool68150942014-12-30 22:52:08 +00002154 CmdArgs.push_back(Args.MakeArgString(getCompilerRT(TC, "builtins")));
Saleem Abdulrasool8d7ade72014-12-30 02:10:36 +00002155
Saleem Abdulrasool68150942014-12-30 22:52:08 +00002156 if (!TC.getTriple().isOSWindows()) {
Saleem Abdulrasool8d7ade72014-12-30 02:10:36 +00002157 // FIXME: why do we link against gcc when we are using compiler-rt?
2158 CmdArgs.push_back("-lgcc_s");
2159 if (TC.getDriver().CCCIsCXX())
2160 CmdArgs.push_back("-lgcc_eh");
2161 }
Saleem Abdulrasool543a78b2014-10-24 03:13:37 +00002162}
2163
Saleem Abdulrasool2e46ebe2014-12-30 22:52:06 +00002164static void addProfileRT(const ToolChain &TC, const ArgList &Args,
2165 ArgStringList &CmdArgs) {
Justin Bogner31a4aca2014-08-07 03:14:34 +00002166 if (!(Args.hasFlag(options::OPT_fprofile_arcs, options::OPT_fno_profile_arcs,
2167 false) ||
Chandler Carruth36381702013-06-23 11:28:48 +00002168 Args.hasArg(options::OPT_fprofile_generate) ||
Justin Bogner6a9d2cf2014-01-06 22:27:36 +00002169 Args.hasArg(options::OPT_fprofile_instr_generate) ||
Chandler Carruth36381702013-06-23 11:28:48 +00002170 Args.hasArg(options::OPT_fcreate_profile) ||
2171 Args.hasArg(options::OPT_coverage)))
2172 return;
2173
Saleem Abdulrasool68150942014-12-30 22:52:08 +00002174 CmdArgs.push_back(Args.MakeArgString(getCompilerRT(TC, "profile")));
Alexey Samsonovbdfa6c22014-04-01 13:31:10 +00002175}
2176
Alexey Samsonov52550342014-09-15 19:58:40 +00002177static void addSanitizerRuntime(const ToolChain &TC, const ArgList &Args,
2178 ArgStringList &CmdArgs, StringRef Sanitizer,
2179 bool IsShared) {
Alexey Samsonov52550342014-09-15 19:58:40 +00002180 // Static runtimes must be forced into executable, so we wrap them in
Peter Collingbournef7ef3fd812013-10-20 21:29:13 +00002181 // whole-archive.
Alexey Samsonov52550342014-09-15 19:58:40 +00002182 if (!IsShared)
2183 CmdArgs.push_back("-whole-archive");
Dan Albert6f2875d2015-01-28 23:23:36 +00002184 CmdArgs.push_back(Args.MakeArgString(getCompilerRT(TC, Sanitizer, IsShared)));
Alexey Samsonov52550342014-09-15 19:58:40 +00002185 if (!IsShared)
2186 CmdArgs.push_back("-no-whole-archive");
Alexey Samsonovbfb0cd32013-02-27 11:14:55 +00002187}
2188
Alexey Samsonov52550342014-09-15 19:58:40 +00002189// Tries to use a file with the list of dynamic symbols that need to be exported
2190// from the runtime library. Returns true if the file was found.
2191static bool addSanitizerDynamicList(const ToolChain &TC, const ArgList &Args,
2192 ArgStringList &CmdArgs,
2193 StringRef Sanitizer) {
Saleem Abdulrasool68150942014-12-30 22:52:08 +00002194 SmallString<128> SanRT = getCompilerRT(TC, Sanitizer);
2195 if (llvm::sys::fs::exists(SanRT + ".syms")) {
2196 CmdArgs.push_back(Args.MakeArgString("--dynamic-list=" + SanRT + ".syms"));
Alexey Samsonov52550342014-09-15 19:58:40 +00002197 return true;
2198 }
2199 return false;
2200}
2201
2202static void linkSanitizerRuntimeDeps(const ToolChain &TC,
2203 ArgStringList &CmdArgs) {
2204 // Force linking against the system libraries sanitizers depends on
2205 // (see PR15823 why this is necessary).
2206 CmdArgs.push_back("--no-as-needed");
2207 CmdArgs.push_back("-lpthread");
2208 CmdArgs.push_back("-lrt");
2209 CmdArgs.push_back("-lm");
2210 // There's no libdl on FreeBSD.
2211 if (TC.getTriple().getOS() != llvm::Triple::FreeBSD)
2212 CmdArgs.push_back("-ldl");
2213}
2214
2215static void
2216collectSanitizerRuntimes(const ToolChain &TC, const ArgList &Args,
2217 SmallVectorImpl<StringRef> &SharedRuntimes,
2218 SmallVectorImpl<StringRef> &StaticRuntimes,
2219 SmallVectorImpl<StringRef> &HelperStaticRuntimes) {
2220 const SanitizerArgs &SanArgs = TC.getSanitizerArgs();
2221 // Collect shared runtimes.
2222 if (SanArgs.needsAsanRt() && SanArgs.needsSharedAsanRt()) {
2223 SharedRuntimes.push_back("asan");
Evgeniy Stepanov77866712012-04-25 08:59:22 +00002224 }
Alexey Samsonovbdfa6c22014-04-01 13:31:10 +00002225
Alexey Samsonov52550342014-09-15 19:58:40 +00002226 // Collect static runtimes.
Alexey Samsonovbdfa6c22014-04-01 13:31:10 +00002227 if (Args.hasArg(options::OPT_shared) ||
Alexey Samsonov52550342014-09-15 19:58:40 +00002228 (TC.getTriple().getEnvironment() == llvm::Triple::Android)) {
2229 // Don't link static runtimes into DSOs or if compiling for Android.
Alexey Samsonovbdfa6c22014-04-01 13:31:10 +00002230 return;
Alexey Samsonov52550342014-09-15 19:58:40 +00002231 }
2232 if (SanArgs.needsAsanRt()) {
2233 if (SanArgs.needsSharedAsanRt()) {
2234 HelperStaticRuntimes.push_back("asan-preinit");
2235 } else {
2236 StaticRuntimes.push_back("asan");
2237 if (SanArgs.linkCXXRuntimes())
2238 StaticRuntimes.push_back("asan_cxx");
2239 }
2240 }
2241 if (SanArgs.needsDfsanRt())
2242 StaticRuntimes.push_back("dfsan");
2243 if (SanArgs.needsLsanRt())
2244 StaticRuntimes.push_back("lsan");
2245 if (SanArgs.needsMsanRt())
2246 StaticRuntimes.push_back("msan");
2247 if (SanArgs.needsTsanRt())
2248 StaticRuntimes.push_back("tsan");
2249 // WARNING: UBSan should always go last.
2250 if (SanArgs.needsUbsanRt()) {
2251 // If UBSan is not combined with another sanitizer, we need to pull in
2252 // sanitizer_common explicitly.
2253 if (StaticRuntimes.empty())
2254 HelperStaticRuntimes.push_back("san");
2255 StaticRuntimes.push_back("ubsan");
2256 if (SanArgs.linkCXXRuntimes())
2257 StaticRuntimes.push_back("ubsan_cxx");
Alexey Samsonovb01f9362014-05-12 18:39:51 +00002258 }
Kostya Serebryany7bca6c22011-11-30 01:39:16 +00002259}
2260
Alexey Samsonov52550342014-09-15 19:58:40 +00002261// Should be called before we add system libraries (C++ ABI, libstdc++/libc++,
2262// C runtime, etc). Returns true if sanitizer system deps need to be linked in.
2263static bool addSanitizerRuntimes(const ToolChain &TC, const ArgList &Args,
Alexey Samsonovce8ab102014-02-25 12:43:43 +00002264 ArgStringList &CmdArgs) {
Alexey Samsonov52550342014-09-15 19:58:40 +00002265 SmallVector<StringRef, 4> SharedRuntimes, StaticRuntimes,
2266 HelperStaticRuntimes;
2267 collectSanitizerRuntimes(TC, Args, SharedRuntimes, StaticRuntimes,
2268 HelperStaticRuntimes);
2269 for (auto RT : SharedRuntimes)
2270 addSanitizerRuntime(TC, Args, CmdArgs, RT, true);
2271 for (auto RT : HelperStaticRuntimes)
2272 addSanitizerRuntime(TC, Args, CmdArgs, RT, false);
2273 bool AddExportDynamic = false;
2274 for (auto RT : StaticRuntimes) {
2275 addSanitizerRuntime(TC, Args, CmdArgs, RT, false);
2276 AddExportDynamic |= !addSanitizerDynamicList(TC, Args, CmdArgs, RT);
2277 }
2278 // If there is a static runtime with no dynamic list, force all the symbols
2279 // to be dynamic to be sure we export sanitizer interface functions.
2280 if (AddExportDynamic)
2281 CmdArgs.push_back("-export-dynamic");
2282 return !StaticRuntimes.empty();
Peter Collingbournec3772752013-08-07 22:47:34 +00002283}
2284
Benjamin Kramer34cb0432013-10-16 17:42:39 +00002285static bool shouldUseFramePointerForTarget(const ArgList &Args,
2286 const llvm::Triple &Triple) {
2287 switch (Triple.getArch()) {
2288 // Don't use a frame pointer on linux if optimizing for certain targets.
2289 case llvm::Triple::mips64:
2290 case llvm::Triple::mips64el:
2291 case llvm::Triple::mips:
2292 case llvm::Triple::mipsel:
2293 case llvm::Triple::systemz:
2294 case llvm::Triple::x86:
2295 case llvm::Triple::x86_64:
Filipe Cabecinhasb1e6c2d2015-01-27 18:08:32 +00002296 if (Triple.isOSLinux())
Benjamin Kramer34cb0432013-10-16 17:42:39 +00002297 if (Arg *A = Args.getLastArg(options::OPT_O_Group))
2298 if (!A->getOption().matches(options::OPT_O0))
2299 return false;
2300 return true;
2301 case llvm::Triple::xcore:
2302 return false;
2303 default:
2304 return true;
2305 }
2306}
2307
Rafael Espindola224dd632011-12-14 21:02:23 +00002308static bool shouldUseFramePointer(const ArgList &Args,
2309 const llvm::Triple &Triple) {
2310 if (Arg *A = Args.getLastArg(options::OPT_fno_omit_frame_pointer,
2311 options::OPT_fomit_frame_pointer))
2312 return A->getOption().matches(options::OPT_fno_omit_frame_pointer);
2313
Benjamin Kramer34cb0432013-10-16 17:42:39 +00002314 return shouldUseFramePointerForTarget(Args, Triple);
Rafael Espindola224dd632011-12-14 21:02:23 +00002315}
2316
Eric Christopherb7d97e92013-04-03 01:58:53 +00002317static bool shouldUseLeafFramePointer(const ArgList &Args,
2318 const llvm::Triple &Triple) {
2319 if (Arg *A = Args.getLastArg(options::OPT_mno_omit_leaf_frame_pointer,
2320 options::OPT_momit_leaf_frame_pointer))
2321 return A->getOption().matches(options::OPT_mno_omit_leaf_frame_pointer);
2322
Filipe Cabecinhasb1e6c2d2015-01-27 18:08:32 +00002323 if (Triple.isPS4CPU())
2324 return false;
2325
Benjamin Kramer34cb0432013-10-16 17:42:39 +00002326 return shouldUseFramePointerForTarget(Args, Triple);
Eric Christopherb7d97e92013-04-03 01:58:53 +00002327}
2328
Rafael Espindolac7367ff2013-08-10 01:40:10 +00002329/// Add a CC1 option to specify the debug compilation directory.
Chandler Carruth4d5e1a92012-12-17 21:40:04 +00002330static void addDebugCompDirArg(const ArgList &Args, ArgStringList &CmdArgs) {
Benjamin Kramer698d7c82013-04-27 08:12:29 +00002331 SmallString<128> cwd;
2332 if (!llvm::sys::fs::current_path(cwd)) {
Chad Rosiera35d5a32013-04-26 20:49:50 +00002333 CmdArgs.push_back("-fdebug-compilation-dir");
2334 CmdArgs.push_back(Args.MakeArgString(cwd));
Chandler Carruth4d5e1a92012-12-17 21:40:04 +00002335 }
2336}
2337
Eric Christopherd3804002013-02-22 20:12:52 +00002338static const char *SplitDebugName(const ArgList &Args,
2339 const InputInfoList &Inputs) {
2340 Arg *FinalOutput = Args.getLastArg(options::OPT_o);
2341 if (FinalOutput && Args.hasArg(options::OPT_c)) {
2342 SmallString<128> T(FinalOutput->getValue());
2343 llvm::sys::path::replace_extension(T, "dwo");
2344 return Args.MakeArgString(T);
2345 } else {
2346 // Use the compilation dir.
Nico Webere8e53112014-05-11 01:04:02 +00002347 SmallString<128> T(
2348 Args.getLastArgValue(options::OPT_fdebug_compilation_dir));
Eric Christopherd3804002013-02-22 20:12:52 +00002349 SmallString<128> F(llvm::sys::path::stem(Inputs[0].getBaseInput()));
2350 llvm::sys::path::replace_extension(F, "dwo");
2351 T += F;
2352 return Args.MakeArgString(F);
2353 }
2354}
2355
2356static void SplitDebugInfo(const ToolChain &TC, Compilation &C,
2357 const Tool &T, const JobAction &JA,
2358 const ArgList &Args, const InputInfo &Output,
2359 const char *OutFile) {
Eric Christopher248357f2013-02-21 22:35:01 +00002360 ArgStringList ExtractArgs;
2361 ExtractArgs.push_back("--extract-dwo");
2362
2363 ArgStringList StripArgs;
2364 StripArgs.push_back("--strip-dwo");
2365
2366 // Grabbing the output of the earlier compile step.
2367 StripArgs.push_back(Output.getFilename());
2368 ExtractArgs.push_back(Output.getFilename());
Eric Christopher248357f2013-02-21 22:35:01 +00002369 ExtractArgs.push_back(OutFile);
2370
2371 const char *Exec =
Eric Christopherd3804002013-02-22 20:12:52 +00002372 Args.MakeArgString(TC.GetProgramPath("objcopy"));
Eric Christopher248357f2013-02-21 22:35:01 +00002373
2374 // First extract the dwo sections.
David Blaikiec11bf802014-09-04 16:04:28 +00002375 C.addCommand(llvm::make_unique<Command>(JA, T, Exec, ExtractArgs));
Eric Christopher248357f2013-02-21 22:35:01 +00002376
2377 // Then remove them from the original .o file.
David Blaikiec11bf802014-09-04 16:04:28 +00002378 C.addCommand(llvm::make_unique<Command>(JA, T, Exec, StripArgs));
Eric Christopher248357f2013-02-21 22:35:01 +00002379}
2380
Arnold Schwaighofer7f994ce2013-08-13 15:46:23 +00002381/// \brief Vectorize at all optimization levels greater than 1 except for -Oz.
Chad Rosier3ba81bd2014-05-02 18:41:57 +00002382/// For -Oz the loop vectorizer is disable, while the slp vectorizer is enabled.
2383static bool shouldEnableVectorizerAtOLevel(const ArgList &Args, bool isSlpVec) {
Arnold Schwaighofer7f994ce2013-08-13 15:46:23 +00002384 if (Arg *A = Args.getLastArg(options::OPT_O_Group)) {
Rafael Espindolaad70d962013-08-27 16:58:15 +00002385 if (A->getOption().matches(options::OPT_O4) ||
2386 A->getOption().matches(options::OPT_Ofast))
Arnold Schwaighofer7f994ce2013-08-13 15:46:23 +00002387 return true;
2388
2389 if (A->getOption().matches(options::OPT_O0))
2390 return false;
2391
2392 assert(A->getOption().matches(options::OPT_O) && "Must have a -O flag");
2393
Rafael Espindola91780de2013-08-26 14:05:41 +00002394 // Vectorize -Os.
Arnold Schwaighofer7f994ce2013-08-13 15:46:23 +00002395 StringRef S(A->getValue());
Rafael Espindola91780de2013-08-26 14:05:41 +00002396 if (S == "s")
Arnold Schwaighofer7f994ce2013-08-13 15:46:23 +00002397 return true;
2398
Chad Rosier3ba81bd2014-05-02 18:41:57 +00002399 // Don't vectorize -Oz, unless it's the slp vectorizer.
Arnold Schwaighofer7f994ce2013-08-13 15:46:23 +00002400 if (S == "z")
Chad Rosier3ba81bd2014-05-02 18:41:57 +00002401 return isSlpVec;
Arnold Schwaighofer7f994ce2013-08-13 15:46:23 +00002402
2403 unsigned OptLevel = 0;
2404 if (S.getAsInteger(10, OptLevel))
2405 return false;
2406
2407 return OptLevel > 1;
2408 }
2409
2410 return false;
2411}
2412
Ben Langmuir2cb4a782014-02-05 22:21:15 +00002413/// Add -x lang to \p CmdArgs for \p Input.
2414static void addDashXForInput(const ArgList &Args, const InputInfo &Input,
2415 ArgStringList &CmdArgs) {
2416 // When using -verify-pch, we don't want to provide the type
2417 // 'precompiled-header' if it was inferred from the file extension
2418 if (Args.hasArg(options::OPT_verify_pch) && Input.getType() == types::TY_PCH)
2419 return;
2420
2421 CmdArgs.push_back("-x");
2422 if (Args.hasArg(options::OPT_rewrite_objc))
2423 CmdArgs.push_back(types::getTypeName(types::TY_PP_ObjCXX));
2424 else
2425 CmdArgs.push_back(types::getTypeName(Input.getType()));
2426}
2427
Saleem Abdulrasoolc68237b2014-07-16 03:13:50 +00002428static std::string getMSCompatibilityVersion(const char *VersionStr) {
2429 unsigned Version;
2430 if (StringRef(VersionStr).getAsInteger(10, Version))
2431 return "0";
2432
2433 if (Version < 100)
2434 return llvm::utostr_32(Version) + ".0";
2435
2436 if (Version < 10000)
2437 return llvm::utostr_32(Version / 100) + "." +
2438 llvm::utostr_32(Version % 100);
2439
2440 unsigned Build = 0, Factor = 1;
2441 for ( ; Version > 10000; Version = Version / 10, Factor = Factor * 10)
2442 Build = Build + (Version % 10) * Factor;
2443 return llvm::utostr_32(Version / 100) + "." +
2444 llvm::utostr_32(Version % 100) + "." +
2445 llvm::utostr_32(Build);
2446}
2447
Rafael Espindola577637a2015-01-03 00:06:04 +00002448// Claim options we don't want to warn if they are unused. We do this for
Rafael Espindola7a45e872015-01-05 13:44:59 +00002449// options that build systems might add but are unused when assembling or only
2450// running the preprocessor for example.
Rafael Espindola577637a2015-01-03 00:06:04 +00002451static void claimNoWarnArgs(const ArgList &Args) {
2452 // Don't warn about unused -f(no-)?lto. This can happen when we're
Rafael Espindola7a45e872015-01-05 13:44:59 +00002453 // preprocessing, precompiling or assembling.
Rafael Espindola577637a2015-01-03 00:06:04 +00002454 Args.ClaimAllArgs(options::OPT_flto);
2455 Args.ClaimAllArgs(options::OPT_fno_lto);
2456}
2457
Daniel Dunbar1a093d22009-03-18 06:00:36 +00002458void Clang::ConstructJob(Compilation &C, const JobAction &JA,
Daniel Dunbar04c4c2c2009-03-18 07:06:02 +00002459 const InputInfo &Output,
Daniel Dunbar0450e6d2009-03-18 06:07:59 +00002460 const InputInfoList &Inputs,
Daniel Dunbara2aedc62009-03-18 10:01:51 +00002461 const ArgList &Args,
Daniel Dunbar1a093d22009-03-18 06:00:36 +00002462 const char *LinkingOutput) const {
Daniel Dunbare46b52a2010-03-20 04:52:14 +00002463 bool KernelOrKext = Args.hasArg(options::OPT_mkernel,
2464 options::OPT_fapple_kext);
Daniel Dunbar083edf72009-12-21 18:54:17 +00002465 const Driver &D = getToolChain().getDriver();
Daniel Dunbara3246a02009-03-18 08:07:30 +00002466 ArgStringList CmdArgs;
2467
Saleem Abdulrasool377066a2014-03-27 22:50:18 +00002468 bool IsWindowsGNU = getToolChain().getTriple().isWindowsGNUEnvironment();
Nico Webere8e53112014-05-11 01:04:02 +00002469 bool IsWindowsCygnus =
2470 getToolChain().getTriple().isWindowsCygwinEnvironment();
Saleem Abdulrasool377066a2014-03-27 22:50:18 +00002471 bool IsWindowsMSVC = getToolChain().getTriple().isWindowsMSVCEnvironment();
2472
Daniel Dunbare521a892009-03-31 20:53:55 +00002473 assert(Inputs.size() == 1 && "Unable to handle multiple inputs.");
2474
Daniel Dunbar6c536aa2009-12-11 23:00:49 +00002475 // Invoke ourselves in -cc1 mode.
2476 //
2477 // FIXME: Implement custom jobs for internal actions.
2478 CmdArgs.push_back("-cc1");
2479
Daniel Dunbar624c21b2009-10-30 18:12:20 +00002480 // Add the "effective" target triple.
Daniel Dunbard640be22009-03-31 17:35:15 +00002481 CmdArgs.push_back("-triple");
Daniel Dunbar82eb4ce2010-08-23 22:35:37 +00002482 std::string TripleStr = getToolChain().ComputeEffectiveClangTriple(Args);
Daniel Dunbar624c21b2009-10-30 18:12:20 +00002483 CmdArgs.push_back(Args.MakeArgString(TripleStr));
Daniel Dunbarfb58b0a2009-09-10 06:49:20 +00002484
Saleem Abdulrasoolf4c9e492014-04-04 20:31:19 +00002485 const llvm::Triple TT(TripleStr);
2486 if (TT.isOSWindows() && (TT.getArch() == llvm::Triple::arm ||
2487 TT.getArch() == llvm::Triple::thumb)) {
2488 unsigned Offset = TT.getArch() == llvm::Triple::arm ? 4 : 6;
2489 unsigned Version;
2490 TT.getArchName().substr(Offset).getAsInteger(10, Version);
2491 if (Version < 7)
Nico Webere8e53112014-05-11 01:04:02 +00002492 D.Diag(diag::err_target_unsupported_arch) << TT.getArchName()
2493 << TripleStr;
Saleem Abdulrasoolf4c9e492014-04-04 20:31:19 +00002494 }
2495
Tim Northover336f1892014-03-29 13:16:12 +00002496 // Push all default warning arguments that are specific to
2497 // the given target. These come before user provided warning options
2498 // are provided.
2499 getToolChain().addClangWarningOptions(CmdArgs);
2500
Daniel Dunbar624c21b2009-10-30 18:12:20 +00002501 // Select the appropriate action.
John McCall5fb5df92012-06-20 06:18:46 +00002502 RewriteKind rewriteKind = RK_None;
Fariborz Jahanian7ebeede2012-04-04 18:50:28 +00002503
Daniel Dunbara2aedc62009-03-18 10:01:51 +00002504 if (isa<AnalyzeJobAction>(JA)) {
2505 assert(JA.getType() == types::TY_Plist && "Invalid output type.");
2506 CmdArgs.push_back("-analyze");
Ted Kremenekf7639e12012-03-06 20:06:33 +00002507 } else if (isa<MigrateJobAction>(JA)) {
2508 CmdArgs.push_back("-migrate");
Daniel Dunbara2aedc62009-03-18 10:01:51 +00002509 } else if (isa<PreprocessJobAction>(JA)) {
Daniel Dunbard67a3222009-03-30 06:36:42 +00002510 if (Output.getType() == types::TY_Dependencies)
2511 CmdArgs.push_back("-Eonly");
Fariborz Jahaniane0a75d62013-03-18 19:41:18 +00002512 else {
Daniel Dunbard67a3222009-03-30 06:36:42 +00002513 CmdArgs.push_back("-E");
Fariborz Jahaniane0a75d62013-03-18 19:41:18 +00002514 if (Args.hasArg(options::OPT_rewrite_objc) &&
2515 !Args.hasArg(options::OPT_g_Group))
2516 CmdArgs.push_back("-P");
2517 }
Daniel Dunbarc4343942010-02-03 03:07:56 +00002518 } else if (isa<AssembleJobAction>(JA)) {
2519 CmdArgs.push_back("-emit-obj");
Daniel Dunbar06e2cc32010-05-27 06:18:05 +00002520
David Blaikie9260ed62013-07-25 21:19:01 +00002521 CollectArgsForIntegratedAssembler(C, Args, CmdArgs, D);
Daniel Dunbar7c874332010-11-19 16:23:35 +00002522
2523 // Also ignore explicit -force_cpusubtype_ALL option.
2524 (void) Args.hasArg(options::OPT_force__cpusubtype__ALL);
Daniel Dunbara2aedc62009-03-18 10:01:51 +00002525 } else if (isa<PrecompileJobAction>(JA)) {
Argyrios Kyrtzidis90bdfbb2010-08-11 23:27:58 +00002526 // Use PCH if the user requested it.
Daniel Dunbarcbc34b72009-10-15 20:02:44 +00002527 bool UsePCH = D.CCCUsePCH;
Daniel Dunbarcbc34b72009-10-15 20:02:44 +00002528
Aaron Ballman1f10cc52012-07-31 01:21:00 +00002529 if (JA.getType() == types::TY_Nothing)
2530 CmdArgs.push_back("-fsyntax-only");
2531 else if (UsePCH)
Douglas Gregor111af7d2009-04-18 00:34:01 +00002532 CmdArgs.push_back("-emit-pch");
2533 else
2534 CmdArgs.push_back("-emit-pth");
Ben Langmuir9b9a8d32014-02-06 18:53:25 +00002535 } else if (isa<VerifyPCHJobAction>(JA)) {
2536 CmdArgs.push_back("-verify-pch");
Daniel Dunbara2aedc62009-03-18 10:01:51 +00002537 } else {
Bob Wilson23a55f12014-12-21 07:00:00 +00002538 assert((isa<CompileJobAction>(JA) || isa<BackendJobAction>(JA)) &&
2539 "Invalid action for clang tool.");
Daniel Dunbard067f7f2009-04-08 23:54:23 +00002540
Daniel Dunbara2aedc62009-03-18 10:01:51 +00002541 if (JA.getType() == types::TY_Nothing) {
Ben Langmuir9b9a8d32014-02-06 18:53:25 +00002542 CmdArgs.push_back("-fsyntax-only");
Daniel Dunbar24e52992010-06-07 23:28:45 +00002543 } else if (JA.getType() == types::TY_LLVM_IR ||
2544 JA.getType() == types::TY_LTO_IR) {
Daniel Dunbara2aedc62009-03-18 10:01:51 +00002545 CmdArgs.push_back("-emit-llvm");
Daniel Dunbar24e52992010-06-07 23:28:45 +00002546 } else if (JA.getType() == types::TY_LLVM_BC ||
2547 JA.getType() == types::TY_LTO_BC) {
Daniel Dunbara2aedc62009-03-18 10:01:51 +00002548 CmdArgs.push_back("-emit-llvm-bc");
2549 } else if (JA.getType() == types::TY_PP_Asm) {
Daniel Dunbard112f102009-09-17 00:47:53 +00002550 CmdArgs.push_back("-S");
Daniel Dunbar6cdf83c2009-09-01 16:57:46 +00002551 } else if (JA.getType() == types::TY_AST) {
2552 CmdArgs.push_back("-emit-pch");
Douglas Gregorbf7fc9c2013-03-27 16:47:18 +00002553 } else if (JA.getType() == types::TY_ModuleFile) {
2554 CmdArgs.push_back("-module-file-info");
Daniel Dunbaraeea8ac2010-02-11 03:16:21 +00002555 } else if (JA.getType() == types::TY_RewrittenObjC) {
2556 CmdArgs.push_back("-rewrite-objc");
John McCall5fb5df92012-06-20 06:18:46 +00002557 rewriteKind = RK_NonFragile;
Fariborz Jahanian73223bb2012-04-02 15:59:19 +00002558 } else if (JA.getType() == types::TY_RewrittenLegacyObjC) {
2559 CmdArgs.push_back("-rewrite-objc");
John McCall5fb5df92012-06-20 06:18:46 +00002560 rewriteKind = RK_Fragile;
Daniel Dunbaraeea8ac2010-02-11 03:16:21 +00002561 } else {
2562 assert(JA.getType() == types::TY_PP_Asm &&
2563 "Unexpected output type!");
Daniel Dunbara2aedc62009-03-18 10:01:51 +00002564 }
Daniel Dunbara3246a02009-03-18 08:07:30 +00002565 }
2566
Justin Bognera88f0122014-06-20 22:59:50 +00002567 // We normally speed up the clang process a bit by skipping destructors at
2568 // exit, but when we're generating diagnostics we can rely on some of the
2569 // cleanup.
2570 if (!C.isForDiagnostics())
2571 CmdArgs.push_back("-disable-free");
Daniel Dunbara2aedc62009-03-18 10:01:51 +00002572
John McCallbb79b5f2010-02-13 03:50:24 +00002573 // Disable the verification pass in -asserts builds.
2574#ifdef NDEBUG
2575 CmdArgs.push_back("-disable-llvm-verifier");
2576#endif
2577
Daniel Dunbar3b358a32009-04-08 05:11:16 +00002578 // Set the main file name, so that debug info works even with
2579 // -save-temps.
2580 CmdArgs.push_back("-main-file-name");
Bob Wilsondecc03e2012-11-23 06:14:39 +00002581 CmdArgs.push_back(getBaseInputName(Args, Inputs));
Daniel Dunbar3b358a32009-04-08 05:11:16 +00002582
Daniel Dunbar17ddaa62009-04-08 18:03:55 +00002583 // Some flags which affect the language (via preprocessor
Bob Wilsondecc03e2012-11-23 06:14:39 +00002584 // defines).
Daniel Dunbar17ddaa62009-04-08 18:03:55 +00002585 if (Args.hasArg(options::OPT_static))
2586 CmdArgs.push_back("-static-define");
2587
Daniel Dunbara2aedc62009-03-18 10:01:51 +00002588 if (isa<AnalyzeJobAction>(JA)) {
Ted Kremenek05e6f5b2009-09-25 05:55:59 +00002589 // Enable region store model by default.
2590 CmdArgs.push_back("-analyzer-store=region");
2591
Ted Kremenek7bea9a12009-12-07 22:26:14 +00002592 // Treat blocks as analysis entry points.
2593 CmdArgs.push_back("-analyzer-opt-analyze-nested-blocks");
2594
Ted Kremenek49c79792011-03-24 00:28:47 +00002595 CmdArgs.push_back("-analyzer-eagerly-assume");
2596
Daniel Dunbara2aedc62009-03-18 10:01:51 +00002597 // Add default argument set.
Daniel Dunbar58f345ce2009-05-22 00:38:15 +00002598 if (!Args.hasArg(options::OPT__analyzer_no_default_checks)) {
Argyrios Kyrtzidisa6d04d52011-02-15 07:42:33 +00002599 CmdArgs.push_back("-analyzer-checker=core");
Ted Kremenek49c79792011-03-24 00:28:47 +00002600
Saleem Abdulrasool377066a2014-03-27 22:50:18 +00002601 if (!IsWindowsMSVC)
Argyrios Kyrtzidisa6d04d52011-02-15 07:42:33 +00002602 CmdArgs.push_back("-analyzer-checker=unix");
Ted Kremenek49c79792011-03-24 00:28:47 +00002603
Argyrios Kyrtzidisa6d04d52011-02-15 07:42:33 +00002604 if (getToolChain().getTriple().getVendor() == llvm::Triple::Apple)
Ted Kremenek49c79792011-03-24 00:28:47 +00002605 CmdArgs.push_back("-analyzer-checker=osx");
Ted Kremenekb9ff6b22012-01-20 06:00:17 +00002606
2607 CmdArgs.push_back("-analyzer-checker=deadcode");
Ted Kremenek37e96522012-01-26 02:27:38 +00002608
Jordan Rose10ad0812013-04-05 17:55:07 +00002609 if (types::isCXX(Inputs[0].getType()))
2610 CmdArgs.push_back("-analyzer-checker=cplusplus");
2611
Nico Webere8e53112014-05-11 01:04:02 +00002612 // Enable the following experimental checkers for testing.
2613 CmdArgs.push_back(
2614 "-analyzer-checker=security.insecureAPI.UncheckedReturn");
Ted Kremenek37e96522012-01-26 02:27:38 +00002615 CmdArgs.push_back("-analyzer-checker=security.insecureAPI.getpw");
2616 CmdArgs.push_back("-analyzer-checker=security.insecureAPI.gets");
2617 CmdArgs.push_back("-analyzer-checker=security.insecureAPI.mktemp");
2618 CmdArgs.push_back("-analyzer-checker=security.insecureAPI.mkstemp");
2619 CmdArgs.push_back("-analyzer-checker=security.insecureAPI.vfork");
Daniel Dunbar58f345ce2009-05-22 00:38:15 +00002620 }
Daniel Dunbard067f7f2009-04-08 23:54:23 +00002621
Daniel Dunbar58f345ce2009-05-22 00:38:15 +00002622 // Set the output format. The default is plist, for (lame) historical
2623 // reasons.
2624 CmdArgs.push_back("-analyzer-output");
2625 if (Arg *A = Args.getLastArg(options::OPT__analyzer_output))
Richard Smithbd55daf2012-11-01 04:30:05 +00002626 CmdArgs.push_back(A->getValue());
Daniel Dunbar58f345ce2009-05-22 00:38:15 +00002627 else
2628 CmdArgs.push_back("plist");
Daniel Dunbara2aedc62009-03-18 10:01:51 +00002629
Ted Kremenekfe449a22010-03-22 22:32:05 +00002630 // Disable the presentation of standard compiler warnings when
2631 // using --analyze. We only want to show static analyzer diagnostics
2632 // or frontend errors.
2633 CmdArgs.push_back("-w");
2634
Daniel Dunbara2aedc62009-03-18 10:01:51 +00002635 // Add -Xanalyzer arguments when running as analyzer.
2636 Args.AddAllArgValues(CmdArgs, options::OPT_Xanalyzer);
Mike Stump11289f42009-09-09 15:08:12 +00002637 }
2638
Daniel Dunbar4eadb602009-09-10 01:21:12 +00002639 CheckCodeGenerationOptions(D, Args);
2640
Peter Collingbourne54d770c2013-04-09 04:35:11 +00002641 bool PIE = getToolChain().isPIEDefault();
2642 bool PIC = PIE || getToolChain().isPICDefault();
Chandler Carruth76a943b2012-11-19 03:52:03 +00002643 bool IsPICLevelTwo = PIC;
Peter Collingbourne54d770c2013-04-09 04:35:11 +00002644
Alexey Bataev40e75222014-01-28 06:30:35 +00002645 // Android-specific defaults for PIC/PIE
2646 if (getToolChain().getTriple().getEnvironment() == llvm::Triple::Android) {
2647 switch (getToolChain().getTriple().getArch()) {
2648 case llvm::Triple::arm:
Christian Pirkerf01cd6f2014-03-28 14:40:46 +00002649 case llvm::Triple::armeb:
Alexey Bataev40e75222014-01-28 06:30:35 +00002650 case llvm::Triple::thumb:
Christian Pirkerf01cd6f2014-03-28 14:40:46 +00002651 case llvm::Triple::thumbeb:
Logan Chien4ecf0152014-04-29 18:18:58 +00002652 case llvm::Triple::aarch64:
Alexey Bataev40e75222014-01-28 06:30:35 +00002653 case llvm::Triple::mips:
2654 case llvm::Triple::mipsel:
2655 case llvm::Triple::mips64:
2656 case llvm::Triple::mips64el:
2657 PIC = true; // "-fpic"
2658 break;
2659
2660 case llvm::Triple::x86:
2661 case llvm::Triple::x86_64:
2662 PIC = true; // "-fPIC"
2663 IsPICLevelTwo = true;
2664 break;
2665
2666 default:
2667 break;
2668 }
2669 }
2670
Brad Smith5b05db82014-06-24 19:51:29 +00002671 // OpenBSD-specific defaults for PIE
2672 if (getToolChain().getTriple().getOS() == llvm::Triple::OpenBSD) {
2673 switch (getToolChain().getTriple().getArch()) {
2674 case llvm::Triple::mips64:
2675 case llvm::Triple::mips64el:
2676 case llvm::Triple::sparc:
2677 case llvm::Triple::x86:
2678 case llvm::Triple::x86_64:
2679 IsPICLevelTwo = false; // "-fpie"
2680 break;
2681
2682 case llvm::Triple::ppc:
2683 case llvm::Triple::sparcv9:
2684 IsPICLevelTwo = true; // "-fPIE"
2685 break;
2686
2687 default:
2688 break;
2689 }
2690 }
2691
Alexey Samsonov090301e2013-04-09 12:28:19 +00002692 // For the PIC and PIE flag options, this logic is different from the
2693 // legacy logic in very old versions of GCC, as that logic was just
2694 // a bug no one had ever fixed. This logic is both more rational and
2695 // consistent with GCC's new logic now that the bugs are fixed. The last
2696 // argument relating to either PIC or PIE wins, and no other argument is
2697 // used. If the last argument is any flavor of the '-fno-...' arguments,
2698 // both PIC and PIE are disabled. Any PIE option implicitly enables PIC
2699 // at the same level.
2700 Arg *LastPICArg =Args.getLastArg(options::OPT_fPIC, options::OPT_fno_PIC,
2701 options::OPT_fpic, options::OPT_fno_pic,
2702 options::OPT_fPIE, options::OPT_fno_PIE,
2703 options::OPT_fpie, options::OPT_fno_pie);
Chandler Carruth76a943b2012-11-19 03:52:03 +00002704 // Check whether the tool chain trumps the PIC-ness decision. If the PIC-ness
2705 // is forced, then neither PIC nor PIE flags will have no effect.
Peter Collingbourne54d770c2013-04-09 04:35:11 +00002706 if (!getToolChain().isPICDefaultForced()) {
Alexey Samsonov090301e2013-04-09 12:28:19 +00002707 if (LastPICArg) {
2708 Option O = LastPICArg->getOption();
Peter Collingbourne54d770c2013-04-09 04:35:11 +00002709 if (O.matches(options::OPT_fPIC) || O.matches(options::OPT_fpic) ||
2710 O.matches(options::OPT_fPIE) || O.matches(options::OPT_fpie)) {
2711 PIE = O.matches(options::OPT_fPIE) || O.matches(options::OPT_fpie);
2712 PIC = PIE || O.matches(options::OPT_fPIC) ||
2713 O.matches(options::OPT_fpic);
2714 IsPICLevelTwo = O.matches(options::OPT_fPIE) ||
2715 O.matches(options::OPT_fPIC);
2716 } else {
2717 PIE = PIC = false;
2718 }
2719 }
Chandler Carruthc0c04552012-04-08 16:40:35 +00002720 }
Chandler Carruth76a943b2012-11-19 03:52:03 +00002721
Nick Lewycky609dd662013-10-11 03:33:53 +00002722 // Introduce a Darwin-specific hack. If the default is PIC but the flags
Chandler Carruth76a943b2012-11-19 03:52:03 +00002723 // specified while enabling PIC enabled level 1 PIC, just force it back to
2724 // level 2 PIC instead. This matches the behavior of Darwin GCC (based on my
2725 // informal testing).
2726 if (PIC && getToolChain().getTriple().isOSDarwin())
2727 IsPICLevelTwo |= getToolChain().isPICDefault();
2728
Chandler Carruthc0c04552012-04-08 16:40:35 +00002729 // Note that these flags are trump-cards. Regardless of the order w.r.t. the
2730 // PIC or PIE options above, if these show up, PIC is disabled.
Daniel Dunbarbd847cc2012-10-15 22:23:53 +00002731 llvm::Triple Triple(TripleStr);
Bob Wilson5f4346d2014-12-02 00:27:35 +00002732 if (KernelOrKext && (!Triple.isiOS() || Triple.isOSVersionLT(6)))
Chandler Carruth76a943b2012-11-19 03:52:03 +00002733 PIC = PIE = false;
Simon Atanasyaneeb6f272013-10-04 11:46:54 +00002734 if (Args.hasArg(options::OPT_static))
Chandler Carruth76a943b2012-11-19 03:52:03 +00002735 PIC = PIE = false;
Chandler Carruthc0c04552012-04-08 16:40:35 +00002736
Chandler Carruth76a943b2012-11-19 03:52:03 +00002737 if (Arg *A = Args.getLastArg(options::OPT_mdynamic_no_pic)) {
2738 // This is a very special mode. It trumps the other modes, almost no one
2739 // uses it, and it isn't even valid on any OS but Darwin.
2740 if (!getToolChain().getTriple().isOSDarwin())
2741 D.Diag(diag::err_drv_unsupported_opt_for_target)
2742 << A->getSpelling() << getToolChain().getTriple().str();
2743
2744 // FIXME: Warn when this flag trumps some other PIC or PIE flag.
2745
Daniel Dunbara1b02a22009-11-29 07:18:39 +00002746 CmdArgs.push_back("-mrelocation-model");
Chandler Carruth76a943b2012-11-19 03:52:03 +00002747 CmdArgs.push_back("dynamic-no-pic");
Daniel Dunbar44e71222009-04-29 18:32:25 +00002748
Chandler Carruth76a943b2012-11-19 03:52:03 +00002749 // Only a forced PIC mode can cause the actual compile to have PIC defines
2750 // etc., no flags are sufficient. This behavior was selected to closely
2751 // match that of llvm-gcc and Apple GCC before that.
2752 if (getToolChain().isPICDefault() && getToolChain().isPICDefaultForced()) {
2753 CmdArgs.push_back("-pic-level");
2754 CmdArgs.push_back("2");
2755 }
2756 } else {
2757 // Currently, LLVM only knows about PIC vs. static; the PIE differences are
2758 // handled in Clang's IRGen by the -pie-level flag.
2759 CmdArgs.push_back("-mrelocation-model");
2760 CmdArgs.push_back(PIC ? "pic" : "static");
2761
2762 if (PIC) {
2763 CmdArgs.push_back("-pic-level");
2764 CmdArgs.push_back(IsPICLevelTwo ? "2" : "1");
2765 if (PIE) {
2766 CmdArgs.push_back("-pie-level");
2767 CmdArgs.push_back(IsPICLevelTwo ? "2" : "1");
2768 }
2769 }
Daniel Dunbar44e71222009-04-29 18:32:25 +00002770 }
Chandler Carruthc0c04552012-04-08 16:40:35 +00002771
Jonathan Roelofsb140a102014-10-03 21:57:44 +00002772 CmdArgs.push_back("-mthread-model");
2773 if (Arg *A = Args.getLastArg(options::OPT_mthread_model))
2774 CmdArgs.push_back(A->getValue());
2775 else
2776 CmdArgs.push_back(Args.MakeArgString(getToolChain().getThreadModel()));
2777
Tanya Lattnerf9d41df2009-11-04 01:18:09 +00002778 if (!Args.hasFlag(options::OPT_fmerge_all_constants,
2779 options::OPT_fno_merge_all_constants))
Chris Lattner9242b332011-04-08 18:06:54 +00002780 CmdArgs.push_back("-fno-merge-all-constants");
Daniel Dunbar306945d2009-09-16 06:17:29 +00002781
Daniel Dunbara1b02a22009-11-29 07:18:39 +00002782 // LLVM Code Generator Options.
2783
Saleem Abdulrasool76a4b952015-01-09 05:10:20 +00002784 if (Args.hasArg(options::OPT_frewrite_map_file) ||
2785 Args.hasArg(options::OPT_frewrite_map_file_EQ)) {
2786 for (arg_iterator
2787 MFI = Args.filtered_begin(options::OPT_frewrite_map_file,
2788 options::OPT_frewrite_map_file_EQ),
2789 MFE = Args.filtered_end();
2790 MFI != MFE; ++MFI) {
2791 CmdArgs.push_back("-frewrite-map-file");
2792 CmdArgs.push_back((*MFI)->getValue());
2793 (*MFI)->claim();
2794 }
2795 }
2796
Alp Tokerfb8d02b2014-06-05 22:10:59 +00002797 if (Arg *A = Args.getLastArg(options::OPT_Wframe_larger_than_EQ)) {
2798 StringRef v = A->getValue();
2799 CmdArgs.push_back("-mllvm");
2800 CmdArgs.push_back(Args.MakeArgString("-warn-stack-size=" + v));
2801 A->claim();
2802 }
2803
Daniel Dunbar0bb03312011-02-09 17:54:19 +00002804 if (Arg *A = Args.getLastArg(options::OPT_mregparm_EQ)) {
2805 CmdArgs.push_back("-mregparm");
Richard Smithbd55daf2012-11-01 04:30:05 +00002806 CmdArgs.push_back(A->getValue());
Daniel Dunbar0bb03312011-02-09 17:54:19 +00002807 }
2808
Nick Lewyckyd3f3e4f2013-06-25 01:49:44 +00002809 if (Arg *A = Args.getLastArg(options::OPT_fpcc_struct_return,
2810 options::OPT_freg_struct_return)) {
Eli Benderskyd4a6aec2013-07-24 22:20:49 +00002811 if (getToolChain().getArch() != llvm::Triple::x86) {
John McCall1fe2a8c2013-06-18 02:46:29 +00002812 D.Diag(diag::err_drv_unsupported_opt_for_target)
2813 << A->getSpelling() << getToolChain().getTriple().str();
2814 } else if (A->getOption().matches(options::OPT_fpcc_struct_return)) {
2815 CmdArgs.push_back("-fpcc-struct-return");
2816 } else {
2817 assert(A->getOption().matches(options::OPT_freg_struct_return));
2818 CmdArgs.push_back("-freg-struct-return");
2819 }
2820 }
2821
Roman Divacky65b88cd2011-03-01 17:40:53 +00002822 if (Args.hasFlag(options::OPT_mrtd, options::OPT_mno_rtd, false))
2823 CmdArgs.push_back("-mrtd");
2824
Rafael Espindola224dd632011-12-14 21:02:23 +00002825 if (shouldUseFramePointer(Args, getToolChain().getTriple()))
Daniel Dunbara1b02a22009-11-29 07:18:39 +00002826 CmdArgs.push_back("-mdisable-fp-elim");
2827 if (!Args.hasFlag(options::OPT_fzero_initialized_in_bss,
2828 options::OPT_fno_zero_initialized_in_bss))
2829 CmdArgs.push_back("-mno-zero-initialized-in-bss");
Chad Rosierb71f6aa2013-04-24 18:09:54 +00002830
2831 bool OFastEnabled = isOptimizationLevelFast(Args);
2832 // If -Ofast is the optimization level, then -fstrict-aliasing should be
2833 // enabled. This alias option is being used to simplify the hasFlag logic.
2834 OptSpecifier StrictAliasingAliasOption = OFastEnabled ? options::OPT_Ofast :
2835 options::OPT_fstrict_aliasing;
Reid Kleckner2a24e3a2014-04-09 20:07:39 +00002836 // We turn strict aliasing off by default if we're in CL mode, since MSVC
2837 // doesn't do any TBAA.
2838 bool TBAAOnByDefault = !getToolChain().getDriver().IsCLMode();
Chad Rosierb71f6aa2013-04-24 18:09:54 +00002839 if (!Args.hasFlag(options::OPT_fstrict_aliasing, StrictAliasingAliasOption,
Reid Kleckner2a24e3a2014-04-09 20:07:39 +00002840 options::OPT_fno_strict_aliasing, TBAAOnByDefault))
Dan Gohman10169b92010-10-14 22:36:56 +00002841 CmdArgs.push_back("-relaxed-aliasing");
Manman Renf5d9d342013-10-11 20:48:38 +00002842 if (!Args.hasFlag(options::OPT_fstruct_path_tbaa,
2843 options::OPT_fno_struct_path_tbaa))
2844 CmdArgs.push_back("-no-struct-path-tbaa");
Chandler Carruth8b4140d2012-03-27 23:58:37 +00002845 if (Args.hasFlag(options::OPT_fstrict_enums, options::OPT_fno_strict_enums,
2846 false))
2847 CmdArgs.push_back("-fstrict-enums");
Nick Lewycky1c8c4362012-01-23 08:29:12 +00002848 if (!Args.hasFlag(options::OPT_foptimize_sibling_calls,
2849 options::OPT_fno_optimize_sibling_calls))
2850 CmdArgs.push_back("-mdisable-tail-calls");
Daniel Dunbar0d8ca9e2010-05-14 22:00:22 +00002851
Eric Christopher006208c2013-04-04 06:29:47 +00002852 // Handle segmented stacks.
2853 if (Args.hasArg(options::OPT_fsplit_stack))
2854 CmdArgs.push_back("-split-stacks");
Chad Rosierb71f6aa2013-04-24 18:09:54 +00002855
2856 // If -Ofast is the optimization level, then -ffast-math should be enabled.
2857 // This alias option is being used to simplify the getLastArg logic.
2858 OptSpecifier FastMathAliasOption = OFastEnabled ? options::OPT_Ofast :
2859 options::OPT_ffast_math;
Eric Christopher006208c2013-04-04 06:29:47 +00002860
Chandler Carruth306bd2c2012-01-02 14:19:45 +00002861 // Handle various floating point optimization flags, mapping them to the
2862 // appropriate LLVM code generation flags. The pattern for all of these is to
2863 // default off the codegen optimizations, and if any flag enables them and no
2864 // flag disables them after the flag enabling them, enable the codegen
2865 // optimization. This is complicated by several "umbrella" flags.
Chad Rosierb71f6aa2013-04-24 18:09:54 +00002866 if (Arg *A = Args.getLastArg(options::OPT_ffast_math, FastMathAliasOption,
Chad Rosierc30eb1c2012-09-25 22:03:25 +00002867 options::OPT_fno_fast_math,
Chandler Carruth306bd2c2012-01-02 14:19:45 +00002868 options::OPT_ffinite_math_only,
2869 options::OPT_fno_finite_math_only,
2870 options::OPT_fhonor_infinities,
2871 options::OPT_fno_honor_infinities))
Chad Rosierc30eb1c2012-09-25 22:03:25 +00002872 if (A->getOption().getID() != options::OPT_fno_fast_math &&
2873 A->getOption().getID() != options::OPT_fno_finite_math_only &&
Chandler Carruth306bd2c2012-01-02 14:19:45 +00002874 A->getOption().getID() != options::OPT_fhonor_infinities)
2875 CmdArgs.push_back("-menable-no-infs");
Chad Rosierb71f6aa2013-04-24 18:09:54 +00002876 if (Arg *A = Args.getLastArg(options::OPT_ffast_math, FastMathAliasOption,
Chad Rosierc30eb1c2012-09-25 22:03:25 +00002877 options::OPT_fno_fast_math,
Chandler Carruth306bd2c2012-01-02 14:19:45 +00002878 options::OPT_ffinite_math_only,
2879 options::OPT_fno_finite_math_only,
2880 options::OPT_fhonor_nans,
2881 options::OPT_fno_honor_nans))
Chad Rosierc30eb1c2012-09-25 22:03:25 +00002882 if (A->getOption().getID() != options::OPT_fno_fast_math &&
2883 A->getOption().getID() != options::OPT_fno_finite_math_only &&
Chandler Carruth306bd2c2012-01-02 14:19:45 +00002884 A->getOption().getID() != options::OPT_fhonor_nans)
2885 CmdArgs.push_back("-menable-no-nans");
2886
Benjamin Kramerc242ef22012-05-02 14:55:48 +00002887 // -fmath-errno is the default on some platforms, e.g. BSD-derived OSes.
2888 bool MathErrno = getToolChain().IsMathErrnoDefault();
Chad Rosierb71f6aa2013-04-24 18:09:54 +00002889 if (Arg *A = Args.getLastArg(options::OPT_ffast_math, FastMathAliasOption,
Chad Rosierc30eb1c2012-09-25 22:03:25 +00002890 options::OPT_fno_fast_math,
Chandler Carruth306bd2c2012-01-02 14:19:45 +00002891 options::OPT_fmath_errno,
Chandler Carruth0d4b9e62013-05-18 20:47:36 +00002892 options::OPT_fno_math_errno)) {
2893 // Turning on -ffast_math (with either flag) removes the need for MathErrno.
2894 // However, turning *off* -ffast_math merely restores the toolchain default
2895 // (which may be false).
2896 if (A->getOption().getID() == options::OPT_fno_math_errno ||
2897 A->getOption().getID() == options::OPT_ffast_math ||
2898 A->getOption().getID() == options::OPT_Ofast)
2899 MathErrno = false;
2900 else if (A->getOption().getID() == options::OPT_fmath_errno)
2901 MathErrno = true;
2902 }
Chandler Carruth3634c662012-04-26 02:10:51 +00002903 if (MathErrno)
2904 CmdArgs.push_back("-fmath-errno");
Chandler Carruth306bd2c2012-01-02 14:19:45 +00002905
2906 // There are several flags which require disabling very specific
2907 // optimizations. Any of these being disabled forces us to turn off the
2908 // entire set of LLVM optimizations, so collect them through all the flag
2909 // madness.
2910 bool AssociativeMath = false;
Chad Rosierb71f6aa2013-04-24 18:09:54 +00002911 if (Arg *A = Args.getLastArg(options::OPT_ffast_math, FastMathAliasOption,
Chad Rosierc30eb1c2012-09-25 22:03:25 +00002912 options::OPT_fno_fast_math,
Chandler Carruth306bd2c2012-01-02 14:19:45 +00002913 options::OPT_funsafe_math_optimizations,
2914 options::OPT_fno_unsafe_math_optimizations,
2915 options::OPT_fassociative_math,
2916 options::OPT_fno_associative_math))
Chad Rosierc30eb1c2012-09-25 22:03:25 +00002917 if (A->getOption().getID() != options::OPT_fno_fast_math &&
2918 A->getOption().getID() != options::OPT_fno_unsafe_math_optimizations &&
Chandler Carruth306bd2c2012-01-02 14:19:45 +00002919 A->getOption().getID() != options::OPT_fno_associative_math)
2920 AssociativeMath = true;
2921 bool ReciprocalMath = false;
Chad Rosierb71f6aa2013-04-24 18:09:54 +00002922 if (Arg *A = Args.getLastArg(options::OPT_ffast_math, FastMathAliasOption,
Chad Rosierc30eb1c2012-09-25 22:03:25 +00002923 options::OPT_fno_fast_math,
Chandler Carruth306bd2c2012-01-02 14:19:45 +00002924 options::OPT_funsafe_math_optimizations,
2925 options::OPT_fno_unsafe_math_optimizations,
2926 options::OPT_freciprocal_math,
2927 options::OPT_fno_reciprocal_math))
Chad Rosierc30eb1c2012-09-25 22:03:25 +00002928 if (A->getOption().getID() != options::OPT_fno_fast_math &&
2929 A->getOption().getID() != options::OPT_fno_unsafe_math_optimizations &&
Chandler Carruth306bd2c2012-01-02 14:19:45 +00002930 A->getOption().getID() != options::OPT_fno_reciprocal_math)
2931 ReciprocalMath = true;
2932 bool SignedZeros = true;
Chad Rosierb71f6aa2013-04-24 18:09:54 +00002933 if (Arg *A = Args.getLastArg(options::OPT_ffast_math, FastMathAliasOption,
Chad Rosierc30eb1c2012-09-25 22:03:25 +00002934 options::OPT_fno_fast_math,
Chandler Carruth306bd2c2012-01-02 14:19:45 +00002935 options::OPT_funsafe_math_optimizations,
2936 options::OPT_fno_unsafe_math_optimizations,
2937 options::OPT_fsigned_zeros,
2938 options::OPT_fno_signed_zeros))
Chad Rosierc30eb1c2012-09-25 22:03:25 +00002939 if (A->getOption().getID() != options::OPT_fno_fast_math &&
2940 A->getOption().getID() != options::OPT_fno_unsafe_math_optimizations &&
Chandler Carruth306bd2c2012-01-02 14:19:45 +00002941 A->getOption().getID() != options::OPT_fsigned_zeros)
2942 SignedZeros = false;
2943 bool TrappingMath = true;
Chad Rosierb71f6aa2013-04-24 18:09:54 +00002944 if (Arg *A = Args.getLastArg(options::OPT_ffast_math, FastMathAliasOption,
Chad Rosierc30eb1c2012-09-25 22:03:25 +00002945 options::OPT_fno_fast_math,
Chandler Carruth306bd2c2012-01-02 14:19:45 +00002946 options::OPT_funsafe_math_optimizations,
2947 options::OPT_fno_unsafe_math_optimizations,
2948 options::OPT_ftrapping_math,
2949 options::OPT_fno_trapping_math))
Chad Rosierc30eb1c2012-09-25 22:03:25 +00002950 if (A->getOption().getID() != options::OPT_fno_fast_math &&
2951 A->getOption().getID() != options::OPT_fno_unsafe_math_optimizations &&
Chandler Carruth306bd2c2012-01-02 14:19:45 +00002952 A->getOption().getID() != options::OPT_ftrapping_math)
2953 TrappingMath = false;
2954 if (!MathErrno && AssociativeMath && ReciprocalMath && !SignedZeros &&
2955 !TrappingMath)
2956 CmdArgs.push_back("-menable-unsafe-fp-math");
2957
Sanjay Patel76c9e092015-01-23 16:40:50 +00002958 if (!SignedZeros)
2959 CmdArgs.push_back("-fno-signed-zeros");
Lang Hamesaa53b932012-07-06 00:59:19 +00002960
2961 // Validate and pass through -fp-contract option.
Chad Rosierb71f6aa2013-04-24 18:09:54 +00002962 if (Arg *A = Args.getLastArg(options::OPT_ffast_math, FastMathAliasOption,
Chad Rosierc30eb1c2012-09-25 22:03:25 +00002963 options::OPT_fno_fast_math,
Lang Hamesaa53b932012-07-06 00:59:19 +00002964 options::OPT_ffp_contract)) {
2965 if (A->getOption().getID() == options::OPT_ffp_contract) {
Richard Smithbd55daf2012-11-01 04:30:05 +00002966 StringRef Val = A->getValue();
Lang Hamesaa53b932012-07-06 00:59:19 +00002967 if (Val == "fast" || Val == "on" || Val == "off") {
2968 CmdArgs.push_back(Args.MakeArgString("-ffp-contract=" + Val));
2969 } else {
2970 D.Diag(diag::err_drv_unsupported_option_argument)
2971 << A->getOption().getName() << Val;
2972 }
Chad Rosierb71f6aa2013-04-24 18:09:54 +00002973 } else if (A->getOption().matches(options::OPT_ffast_math) ||
2974 (OFastEnabled && A->getOption().matches(options::OPT_Ofast))) {
Lang Hamesaa53b932012-07-06 00:59:19 +00002975 // If fast-math is set then set the fp-contract mode to fast.
2976 CmdArgs.push_back(Args.MakeArgString("-ffp-contract=fast"));
2977 }
2978 }
2979
Bob Wilson6a039162012-07-19 03:52:53 +00002980 // We separately look for the '-ffast-math' and '-ffinite-math-only' flags,
2981 // and if we find them, tell the frontend to provide the appropriate
2982 // preprocessor macros. This is distinct from enabling any optimizations as
2983 // these options induce language changes which must survive serialization
2984 // and deserialization, etc.
Chad Rosierb71f6aa2013-04-24 18:09:54 +00002985 if (Arg *A = Args.getLastArg(options::OPT_ffast_math, FastMathAliasOption,
2986 options::OPT_fno_fast_math))
2987 if (!A->getOption().matches(options::OPT_fno_fast_math))
2988 CmdArgs.push_back("-ffast-math");
Nico Webere8e53112014-05-11 01:04:02 +00002989 if (Arg *A = Args.getLastArg(options::OPT_ffinite_math_only,
2990 options::OPT_fno_fast_math))
Chad Rosierc30eb1c2012-09-25 22:03:25 +00002991 if (A->getOption().matches(options::OPT_ffinite_math_only))
2992 CmdArgs.push_back("-ffinite-math-only");
Chandler Carruth306bd2c2012-01-02 14:19:45 +00002993
Daniel Dunbar0d8ca9e2010-05-14 22:00:22 +00002994 // Decide whether to use verbose asm. Verbose assembly is the default on
2995 // toolchains which have the integrated assembler on by default.
Saleem Abdulrasool42e4b592014-02-22 23:37:58 +00002996 bool IsIntegratedAssemblerDefault =
2997 getToolChain().IsIntegratedAssemblerDefault();
Daniel Dunbar0d8ca9e2010-05-14 22:00:22 +00002998 if (Args.hasFlag(options::OPT_fverbose_asm, options::OPT_fno_verbose_asm,
Saleem Abdulrasool42e4b592014-02-22 23:37:58 +00002999 IsIntegratedAssemblerDefault) ||
Daniel Dunbar0d8ca9e2010-05-14 22:00:22 +00003000 Args.hasArg(options::OPT_dA))
Daniel Dunbara1b02a22009-11-29 07:18:39 +00003001 CmdArgs.push_back("-masm-verbose");
Daniel Dunbar0d8ca9e2010-05-14 22:00:22 +00003002
Saleem Abdulrasoolcfeb90d2014-02-23 00:40:30 +00003003 if (!Args.hasFlag(options::OPT_fintegrated_as, options::OPT_fno_integrated_as,
Saleem Abdulrasool42e4b592014-02-22 23:37:58 +00003004 IsIntegratedAssemblerDefault))
3005 CmdArgs.push_back("-no-integrated-as");
3006
Daniel Dunbara1b02a22009-11-29 07:18:39 +00003007 if (Args.hasArg(options::OPT_fdebug_pass_structure)) {
3008 CmdArgs.push_back("-mdebug-pass");
3009 CmdArgs.push_back("Structure");
3010 }
3011 if (Args.hasArg(options::OPT_fdebug_pass_arguments)) {
3012 CmdArgs.push_back("-mdebug-pass");
3013 CmdArgs.push_back("Arguments");
3014 }
3015
John McCall8517abc2010-02-19 02:45:38 +00003016 // Enable -mconstructor-aliases except on darwin, where we have to
3017 // work around a linker bug; see <rdar://problem/7651567>.
Bob Wilson6524dd32011-10-14 05:03:44 +00003018 if (!getToolChain().getTriple().isOSDarwin())
John McCall8517abc2010-02-19 02:45:38 +00003019 CmdArgs.push_back("-mconstructor-aliases");
NAKAMURA Takumi029d74b2011-02-17 08:50:50 +00003020
John McCall7ef5cb32011-03-18 02:56:14 +00003021 // Darwin's kernel doesn't support guard variables; just die if we
3022 // try to use them.
Bob Wilson6524dd32011-10-14 05:03:44 +00003023 if (KernelOrKext && getToolChain().getTriple().isOSDarwin())
John McCall7ef5cb32011-03-18 02:56:14 +00003024 CmdArgs.push_back("-fforbid-guard-variables");
3025
Douglas Gregordbe39272011-02-01 15:15:22 +00003026 if (Args.hasArg(options::OPT_mms_bitfields)) {
3027 CmdArgs.push_back("-mms-bitfields");
3028 }
John McCall8517abc2010-02-19 02:45:38 +00003029
Daniel Dunbar306945d2009-09-16 06:17:29 +00003030 // This is a coarse approximation of what llvm-gcc actually does, both
3031 // -fasynchronous-unwind-tables and -fnon-call-exceptions interact in more
3032 // complicated ways.
3033 bool AsynchronousUnwindTables =
Evgeniy Stepanov7429c592014-02-14 08:56:25 +00003034 Args.hasFlag(options::OPT_fasynchronous_unwind_tables,
3035 options::OPT_fno_asynchronous_unwind_tables,
3036 (getToolChain().IsUnwindTablesDefault() ||
3037 getToolChain().getSanitizerArgs().needsUnwindTables()) &&
3038 !KernelOrKext);
Daniel Dunbar306945d2009-09-16 06:17:29 +00003039 if (Args.hasFlag(options::OPT_funwind_tables, options::OPT_fno_unwind_tables,
3040 AsynchronousUnwindTables))
Daniel Dunbara1b02a22009-11-29 07:18:39 +00003041 CmdArgs.push_back("-munwind-tables");
3042
Chandler Carruth05fb5852012-11-21 23:40:23 +00003043 getToolChain().addClangTargetOptions(Args, CmdArgs);
Rafael Espindola66aa0452012-06-19 01:26:10 +00003044
Daniel Dunbara1b02a22009-11-29 07:18:39 +00003045 if (Arg *A = Args.getLastArg(options::OPT_flimited_precision_EQ)) {
3046 CmdArgs.push_back("-mlimit-float-precision");
Richard Smithbd55daf2012-11-01 04:30:05 +00003047 CmdArgs.push_back(A->getValue());
Daniel Dunbara1b02a22009-11-29 07:18:39 +00003048 }
Daniel Dunbar44e71222009-04-29 18:32:25 +00003049
Daniel Dunbar4dbaaa62009-05-06 03:16:41 +00003050 // FIXME: Handle -mtune=.
3051 (void) Args.hasArg(options::OPT_mtune_EQ);
Daniel Dunbar44e71222009-04-29 18:32:25 +00003052
Benjamin Kramercf4371a2009-08-05 14:30:52 +00003053 if (Arg *A = Args.getLastArg(options::OPT_mcmodel_EQ)) {
Daniel Dunbara1b02a22009-11-29 07:18:39 +00003054 CmdArgs.push_back("-mcode-model");
Richard Smithbd55daf2012-11-01 04:30:05 +00003055 CmdArgs.push_back(A->getValue());
Benjamin Kramercf4371a2009-08-05 14:30:52 +00003056 }
3057
Rafael Espindola22ce34a2013-08-20 22:12:08 +00003058 // Add the target cpu
3059 std::string ETripleStr = getToolChain().ComputeEffectiveClangTriple(Args);
3060 llvm::Triple ETriple(ETripleStr);
3061 std::string CPU = getCPUName(Args, ETriple);
3062 if (!CPU.empty()) {
3063 CmdArgs.push_back("-target-cpu");
3064 CmdArgs.push_back(Args.MakeArgString(CPU));
3065 }
3066
Rafael Espindolaeb265472013-08-21 21:59:03 +00003067 if (const Arg *A = Args.getLastArg(options::OPT_mfpmath_EQ)) {
3068 CmdArgs.push_back("-mfpmath");
3069 CmdArgs.push_back(A->getValue());
3070 }
3071
Rafael Espindola28e1f4b2013-08-21 16:39:20 +00003072 // Add the target features
Rafael Espindola9c6fb0f2013-11-23 14:36:40 +00003073 getTargetFeatures(D, ETriple, Args, CmdArgs, false);
Rafael Espindola28e1f4b2013-08-21 16:39:20 +00003074
Rafael Espindola22ce34a2013-08-20 22:12:08 +00003075 // Add target specific flags.
Eli Benderskyd4a6aec2013-07-24 22:20:49 +00003076 switch(getToolChain().getArch()) {
Daniel Dunbar3b3191f2009-09-09 22:33:08 +00003077 default:
3078 break;
Daniel Dunbar4dbaaa62009-05-06 03:16:41 +00003079
Daniel Dunbar0f5c5422009-09-10 04:57:17 +00003080 case llvm::Triple::arm:
Christian Pirkerf01cd6f2014-03-28 14:40:46 +00003081 case llvm::Triple::armeb:
Daniel Dunbar0f5c5422009-09-10 04:57:17 +00003082 case llvm::Triple::thumb:
Christian Pirkerf01cd6f2014-03-28 14:40:46 +00003083 case llvm::Triple::thumbeb:
Daniel Dunbarc9388c12011-03-17 17:10:06 +00003084 AddARMTargetArgs(Args, CmdArgs, KernelOrKext);
Daniel Dunbar0f5c5422009-09-10 04:57:17 +00003085 break;
3086
Tim Northover573cbee2014-05-24 12:52:07 +00003087 case llvm::Triple::aarch64:
3088 case llvm::Triple::aarch64_be:
Tim Northover573cbee2014-05-24 12:52:07 +00003089 AddAArch64TargetArgs(Args, CmdArgs);
Tim Northovera2ee4332014-03-29 15:09:45 +00003090 break;
3091
Eric Christopher0b26a612010-03-02 02:41:08 +00003092 case llvm::Triple::mips:
3093 case llvm::Triple::mipsel:
Akira Hatanaka94ab5542011-09-21 02:13:07 +00003094 case llvm::Triple::mips64:
3095 case llvm::Triple::mips64el:
Eric Christopher0b26a612010-03-02 02:41:08 +00003096 AddMIPSTargetArgs(Args, CmdArgs);
3097 break;
3098
Ulrich Weigand8afad612014-07-28 13:17:52 +00003099 case llvm::Triple::ppc:
3100 case llvm::Triple::ppc64:
3101 case llvm::Triple::ppc64le:
3102 AddPPCTargetArgs(Args, CmdArgs);
3103 break;
3104
Bruno Cardoso Lopese7f211c2010-11-09 17:21:19 +00003105 case llvm::Triple::sparc:
Brad Smith10cd0f42014-07-11 20:12:08 +00003106 case llvm::Triple::sparcv9:
Bruno Cardoso Lopese7f211c2010-11-09 17:21:19 +00003107 AddSparcTargetArgs(Args, CmdArgs);
3108 break;
3109
Daniel Dunbar3b3191f2009-09-09 22:33:08 +00003110 case llvm::Triple::x86:
3111 case llvm::Triple::x86_64:
3112 AddX86TargetArgs(Args, CmdArgs);
3113 break;
Tony Linthicum76329bf2011-12-12 21:14:55 +00003114
3115 case llvm::Triple::hexagon:
3116 AddHexagonTargetArgs(Args, CmdArgs);
3117 break;
Daniel Dunbar44e71222009-04-29 18:32:25 +00003118 }
3119
Hans Wennborg75958c42013-08-08 00:17:41 +00003120 // Add clang-cl arguments.
3121 if (getToolChain().getDriver().IsCLMode())
3122 AddClangCLArgs(Args, CmdArgs);
3123
Daniel Dunbar976a2f52010-08-11 23:07:47 +00003124 // Pass the linker version in use.
3125 if (Arg *A = Args.getLastArg(options::OPT_mlinker_version_EQ)) {
3126 CmdArgs.push_back("-target-linker-version");
Richard Smithbd55daf2012-11-01 04:30:05 +00003127 CmdArgs.push_back(A->getValue());
Daniel Dunbar976a2f52010-08-11 23:07:47 +00003128 }
3129
Eric Christopherb7d97e92013-04-03 01:58:53 +00003130 if (!shouldUseLeafFramePointer(Args, getToolChain().getTriple()))
Daniel Dunbarbb7ac522010-07-01 01:31:45 +00003131 CmdArgs.push_back("-momit-leaf-frame-pointer");
3132
Daniel Dunbarfcc49a82010-05-12 18:19:58 +00003133 // Explicitly error on some things we know we don't support and can't just
3134 // ignore.
3135 types::ID InputType = Inputs[0].getType();
Daniel Dunbar4ed214a2010-09-24 19:39:37 +00003136 if (!Args.hasArg(options::OPT_fallow_unsupported)) {
3137 Arg *Unsupported;
Daniel Dunbar4ed214a2010-09-24 19:39:37 +00003138 if (types::isCXX(InputType) &&
Bob Wilson6524dd32011-10-14 05:03:44 +00003139 getToolChain().getTriple().isOSDarwin() &&
Eli Benderskyd4a6aec2013-07-24 22:20:49 +00003140 getToolChain().getArch() == llvm::Triple::x86) {
Bob Wilson0d45f582011-08-13 23:48:55 +00003141 if ((Unsupported = Args.getLastArg(options::OPT_fapple_kext)) ||
3142 (Unsupported = Args.getLastArg(options::OPT_mkernel)))
Chris Lattner0e62c1c2011-07-23 10:55:15 +00003143 D.Diag(diag::err_drv_clang_unsupported_opt_cxx_darwin_i386)
Daniel Dunbar4ed214a2010-09-24 19:39:37 +00003144 << Unsupported->getOption().getName();
3145 }
Daniel Dunbarfcc49a82010-05-12 18:19:58 +00003146 }
3147
Daniel Dunbara2aedc62009-03-18 10:01:51 +00003148 Args.AddAllArgs(CmdArgs, options::OPT_v);
Daniel Dunbard4352752010-08-24 22:44:13 +00003149 Args.AddLastArg(CmdArgs, options::OPT_H);
Chad Rosierbe10f982011-08-02 17:58:04 +00003150 if (D.CCPrintHeaders && !D.CCGenDiagnostics) {
Daniel Dunbarac540b32011-02-02 21:11:35 +00003151 CmdArgs.push_back("-header-include-file");
3152 CmdArgs.push_back(D.CCPrintHeadersFilename ?
3153 D.CCPrintHeadersFilename : "-");
3154 }
Daniel Dunbara2aedc62009-03-18 10:01:51 +00003155 Args.AddLastArg(CmdArgs, options::OPT_P);
Mike Stump11289f42009-09-09 15:08:12 +00003156 Args.AddLastArg(CmdArgs, options::OPT_print_ivar_layout);
Daniel Dunbara2aedc62009-03-18 10:01:51 +00003157
Chad Rosierbe10f982011-08-02 17:58:04 +00003158 if (D.CCLogDiagnostics && !D.CCGenDiagnostics) {
Daniel Dunbar529c03b2011-04-07 18:01:20 +00003159 CmdArgs.push_back("-diagnostic-log-file");
3160 CmdArgs.push_back(D.CCLogDiagnosticsFilename ?
3161 D.CCLogDiagnosticsFilename : "-");
3162 }
3163
Manman Ren17bdb0f2013-11-20 20:22:14 +00003164 // Use the last option from "-g" group. "-gline-tables-only" and "-gdwarf-x"
3165 // are preserved, all other debug options are substituted with "-g".
Rafael Espindola08a692a2010-03-07 04:46:18 +00003166 Args.ClaimAllArgs(options::OPT_g_Group);
Alexey Samsonovdda3a7f2012-05-29 08:10:34 +00003167 if (Arg *A = Args.getLastArg(options::OPT_g_Group)) {
Hal Finkel4add5dc2014-10-21 19:20:21 +00003168 if (A->getOption().matches(options::OPT_gline_tables_only) ||
3169 A->getOption().matches(options::OPT_g1)) {
Manman Ren17bdb0f2013-11-20 20:22:14 +00003170 // FIXME: we should support specifying dwarf version with
3171 // -gline-tables-only.
Alexey Samsonovdda3a7f2012-05-29 08:10:34 +00003172 CmdArgs.push_back("-gline-tables-only");
Alexander Eremin670c6272014-10-16 05:55:24 +00003173 // Default is dwarf-2 for Darwin, OpenBSD, FreeBSD and Solaris.
Brad Smith378e7f9b2014-06-13 03:35:37 +00003174 const llvm::Triple &Triple = getToolChain().getTriple();
3175 if (Triple.isOSDarwin() || Triple.getOS() == llvm::Triple::OpenBSD ||
Alexander Eremin670c6272014-10-16 05:55:24 +00003176 Triple.getOS() == llvm::Triple::FreeBSD ||
3177 Triple.getOS() == llvm::Triple::Solaris)
Adrian Prantl549c5142014-02-17 17:40:52 +00003178 CmdArgs.push_back("-gdwarf-2");
Manman Ren17bdb0f2013-11-20 20:22:14 +00003179 } else if (A->getOption().matches(options::OPT_gdwarf_2))
Manman Ren9691f7f2013-06-19 01:46:49 +00003180 CmdArgs.push_back("-gdwarf-2");
3181 else if (A->getOption().matches(options::OPT_gdwarf_3))
3182 CmdArgs.push_back("-gdwarf-3");
3183 else if (A->getOption().matches(options::OPT_gdwarf_4))
3184 CmdArgs.push_back("-gdwarf-4");
Eric Christopher2ba5fcb2013-02-05 07:29:57 +00003185 else if (!A->getOption().matches(options::OPT_g0) &&
Adrian Prantl549c5142014-02-17 17:40:52 +00003186 !A->getOption().matches(options::OPT_ggdb0)) {
Alexander Eremin670c6272014-10-16 05:55:24 +00003187 // Default is dwarf-2 for Darwin, OpenBSD, FreeBSD and Solaris.
Brad Smith378e7f9b2014-06-13 03:35:37 +00003188 const llvm::Triple &Triple = getToolChain().getTriple();
3189 if (Triple.isOSDarwin() || Triple.getOS() == llvm::Triple::OpenBSD ||
Alexander Eremin670c6272014-10-16 05:55:24 +00003190 Triple.getOS() == llvm::Triple::FreeBSD ||
3191 Triple.getOS() == llvm::Triple::Solaris)
Adrian Prantl549c5142014-02-17 17:40:52 +00003192 CmdArgs.push_back("-gdwarf-2");
3193 else
3194 CmdArgs.push_back("-g");
3195 }
Alexey Samsonovdda3a7f2012-05-29 08:10:34 +00003196 }
Daniel Dunbara2aedc62009-03-18 10:01:51 +00003197
Alexey Samsonovf50a9ff2012-06-21 08:22:39 +00003198 // We ignore flags -gstrict-dwarf and -grecord-gcc-switches for now.
3199 Args.ClaimAllArgs(options::OPT_g_flags_Group);
Diego Novillo94b276d2014-07-10 23:29:28 +00003200 if (Args.hasFlag(options::OPT_gcolumn_info, options::OPT_gno_column_info,
3201 /*Default*/ true))
Eric Christophera2f7eb72012-10-18 21:52:18 +00003202 CmdArgs.push_back("-dwarf-column-info");
Alexey Samsonovf50a9ff2012-06-21 08:22:39 +00003203
Eric Christopher138c32b2013-09-13 22:37:55 +00003204 // FIXME: Move backend command line options to the module.
Eric Christopher2ba5fcb2013-02-05 07:29:57 +00003205 // -gsplit-dwarf should turn on -g and enable the backend dwarf
3206 // splitting and extraction.
Eric Christopherd42fb732013-02-21 22:35:05 +00003207 // FIXME: Currently only works on Linux.
Cameron Esfahani556d91e2013-09-14 01:09:11 +00003208 if (getToolChain().getTriple().isOSLinux() &&
Eric Christopherd42fb732013-02-21 22:35:05 +00003209 Args.hasArg(options::OPT_gsplit_dwarf)) {
Eric Christopher2ba5fcb2013-02-05 07:29:57 +00003210 CmdArgs.push_back("-g");
3211 CmdArgs.push_back("-backend-option");
3212 CmdArgs.push_back("-split-dwarf=Enable");
3213 }
3214
Eric Christopher138c32b2013-09-13 22:37:55 +00003215 // -ggnu-pubnames turns on gnu style pubnames in the backend.
3216 if (Args.hasArg(options::OPT_ggnu_pubnames)) {
3217 CmdArgs.push_back("-backend-option");
3218 CmdArgs.push_back("-generate-gnu-dwarf-pub-sections");
3219 }
Eric Christophereec89c22013-06-18 00:03:50 +00003220
Eric Christopher0d403d22014-02-14 01:27:03 +00003221 // -gdwarf-aranges turns on the emission of the aranges section in the
3222 // backend.
3223 if (Args.hasArg(options::OPT_gdwarf_aranges)) {
3224 CmdArgs.push_back("-backend-option");
3225 CmdArgs.push_back("-generate-arange-section");
3226 }
3227
David Blaikief36d9ba2014-01-27 18:52:43 +00003228 if (Args.hasFlag(options::OPT_fdebug_types_section,
3229 options::OPT_fno_debug_types_section, false)) {
David Blaikied74be702014-01-18 02:02:06 +00003230 CmdArgs.push_back("-backend-option");
3231 CmdArgs.push_back("-generate-type-units");
3232 }
Eric Christophereec89c22013-06-18 00:03:50 +00003233
Evgeniy Stepanov9e7cb332014-02-03 11:11:37 +00003234 if (Args.hasFlag(options::OPT_ffunction_sections,
3235 options::OPT_fno_function_sections, false)) {
3236 CmdArgs.push_back("-ffunction-sections");
3237 }
3238
3239 if (Args.hasFlag(options::OPT_fdata_sections,
3240 options::OPT_fno_data_sections, false)) {
3241 CmdArgs.push_back("-fdata-sections");
3242 }
Rafael Espindola66bfb2752010-05-06 21:06:04 +00003243
Chris Lattner3c77a352010-06-22 00:03:40 +00003244 Args.AddAllArgs(CmdArgs, options::OPT_finstrument_functions);
3245
Justin Bogner6a9d2cf2014-01-06 22:27:36 +00003246 if (Args.hasArg(options::OPT_fprofile_instr_generate) &&
3247 (Args.hasArg(options::OPT_fprofile_instr_use) ||
3248 Args.hasArg(options::OPT_fprofile_instr_use_EQ)))
3249 D.Diag(diag::err_drv_argument_not_allowed_with)
3250 << "-fprofile-instr-generate" << "-fprofile-instr-use";
3251
3252 Args.AddAllArgs(CmdArgs, options::OPT_fprofile_instr_generate);
3253
3254 if (Arg *A = Args.getLastArg(options::OPT_fprofile_instr_use_EQ))
3255 A->render(Args, CmdArgs);
3256 else if (Args.hasArg(options::OPT_fprofile_instr_use))
3257 CmdArgs.push_back("-fprofile-instr-use=pgo-data");
3258
Nick Lewycky207bce32011-04-21 23:44:07 +00003259 if (Args.hasArg(options::OPT_ftest_coverage) ||
3260 Args.hasArg(options::OPT_coverage))
3261 CmdArgs.push_back("-femit-coverage-notes");
Justin Bogner31a4aca2014-08-07 03:14:34 +00003262 if (Args.hasFlag(options::OPT_fprofile_arcs, options::OPT_fno_profile_arcs,
3263 false) ||
Nick Lewycky207bce32011-04-21 23:44:07 +00003264 Args.hasArg(options::OPT_coverage))
3265 CmdArgs.push_back("-femit-coverage-data");
3266
Alex Lorenzee024992014-08-04 18:41:51 +00003267 if (Args.hasArg(options::OPT_fcoverage_mapping) &&
3268 !Args.hasArg(options::OPT_fprofile_instr_generate))
3269 D.Diag(diag::err_drv_argument_only_allowed_with)
3270 << "-fcoverage-mapping" << "-fprofile-instr-generate";
3271
3272 if (Args.hasArg(options::OPT_fcoverage_mapping))
3273 CmdArgs.push_back("-fcoverage-mapping");
3274
Nick Lewycky480cb992011-05-04 20:46:58 +00003275 if (C.getArgs().hasArg(options::OPT_c) ||
3276 C.getArgs().hasArg(options::OPT_S)) {
3277 if (Output.isFilename()) {
Nick Lewycky85c011d2011-05-05 00:08:20 +00003278 CmdArgs.push_back("-coverage-file");
Dan Albertb8e7eae2014-10-10 01:01:29 +00003279 SmallString<128> CoverageFilename;
Dan Alberta4ec57c2014-10-10 02:26:00 +00003280 if (Arg *FinalOutput = C.getArgs().getLastArg(options::OPT_o)) {
Dan Albertb8e7eae2014-10-10 01:01:29 +00003281 CoverageFilename = FinalOutput->getValue();
3282 } else {
3283 CoverageFilename = llvm::sys::path::filename(Output.getBaseInput());
3284 }
Nick Lewycky737a4522013-03-07 08:28:53 +00003285 if (llvm::sys::path::is_relative(CoverageFilename.str())) {
Rafael Espindolac7367ff2013-08-10 01:40:10 +00003286 SmallString<128> Pwd;
3287 if (!llvm::sys::fs::current_path(Pwd)) {
3288 llvm::sys::path::append(Pwd, CoverageFilename.str());
3289 CoverageFilename.swap(Pwd);
Nick Lewycky737a4522013-03-07 08:28:53 +00003290 }
3291 }
Eric Christophere30f61c2013-02-22 00:24:40 +00003292 CmdArgs.push_back(Args.MakeArgString(CoverageFilename));
Nick Lewycky480cb992011-05-04 20:46:58 +00003293 }
3294 }
3295
Daniel Dunbarb25bfde2011-10-11 18:20:10 +00003296 // Pass options for controlling the default header search paths.
3297 if (Args.hasArg(options::OPT_nostdinc)) {
3298 CmdArgs.push_back("-nostdsysteminc");
3299 CmdArgs.push_back("-nobuiltininc");
3300 } else {
Daniel Dunbar0f41eee2011-10-11 18:20:16 +00003301 if (Args.hasArg(options::OPT_nostdlibinc))
3302 CmdArgs.push_back("-nostdsysteminc");
Daniel Dunbarb25bfde2011-10-11 18:20:10 +00003303 Args.AddLastArg(CmdArgs, options::OPT_nostdincxx);
3304 Args.AddLastArg(CmdArgs, options::OPT_nobuiltininc);
3305 }
Daniel Dunbara2aedc62009-03-18 10:01:51 +00003306
Daniel Dunbar34e0b8c2009-12-15 01:02:52 +00003307 // Pass the path to compiler resource files.
Daniel Dunbar34e0b8c2009-12-15 01:02:52 +00003308 CmdArgs.push_back("-resource-dir");
Daniel Dunbar3f3e2cd2010-01-20 02:35:16 +00003309 CmdArgs.push_back(D.ResourceDir.c_str());
Daniel Dunbar9dc82a22009-04-07 21:42:00 +00003310
Argyrios Kyrtzidis71731d62010-11-03 22:45:23 +00003311 Args.AddLastArg(CmdArgs, options::OPT_working_directory);
3312
Ted Kremenekf7639e12012-03-06 20:06:33 +00003313 bool ARCMTEnabled = false;
Argyrios Kyrtzidis85230d52013-09-17 19:14:29 +00003314 if (!Args.hasArg(options::OPT_fno_objc_arc, options::OPT_fobjc_arc)) {
Argyrios Kyrtzidisc44b93d2011-07-07 04:00:39 +00003315 if (const Arg *A = Args.getLastArg(options::OPT_ccc_arcmt_check,
Argyrios Kyrtzidis7fbd97f2011-07-09 20:00:58 +00003316 options::OPT_ccc_arcmt_modify,
3317 options::OPT_ccc_arcmt_migrate)) {
Ted Kremenekf7639e12012-03-06 20:06:33 +00003318 ARCMTEnabled = true;
John McCalld70fb982011-06-15 23:25:17 +00003319 switch (A->getOption().getID()) {
3320 default:
3321 llvm_unreachable("missed a case");
Argyrios Kyrtzidisc44b93d2011-07-07 04:00:39 +00003322 case options::OPT_ccc_arcmt_check:
John McCalld70fb982011-06-15 23:25:17 +00003323 CmdArgs.push_back("-arcmt-check");
3324 break;
Argyrios Kyrtzidisc44b93d2011-07-07 04:00:39 +00003325 case options::OPT_ccc_arcmt_modify:
John McCalld70fb982011-06-15 23:25:17 +00003326 CmdArgs.push_back("-arcmt-modify");
3327 break;
Argyrios Kyrtzidis7fbd97f2011-07-09 20:00:58 +00003328 case options::OPT_ccc_arcmt_migrate:
3329 CmdArgs.push_back("-arcmt-migrate");
Ted Kremenekf7639e12012-03-06 20:06:33 +00003330 CmdArgs.push_back("-mt-migrate-directory");
Richard Smithbd55daf2012-11-01 04:30:05 +00003331 CmdArgs.push_back(A->getValue());
Argyrios Kyrtzidisd5713632011-07-19 17:20:03 +00003332
3333 Args.AddLastArg(CmdArgs, options::OPT_arcmt_migrate_report_output);
3334 Args.AddLastArg(CmdArgs, options::OPT_arcmt_migrate_emit_arc_errors);
Argyrios Kyrtzidis7fbd97f2011-07-09 20:00:58 +00003335 break;
John McCalld70fb982011-06-15 23:25:17 +00003336 }
3337 }
Argyrios Kyrtzidisb11a1922013-06-24 19:01:18 +00003338 } else {
3339 Args.ClaimAllArgs(options::OPT_ccc_arcmt_check);
3340 Args.ClaimAllArgs(options::OPT_ccc_arcmt_modify);
3341 Args.ClaimAllArgs(options::OPT_ccc_arcmt_migrate);
John McCalld70fb982011-06-15 23:25:17 +00003342 }
Eric Christopher84fbdb42011-08-19 00:30:14 +00003343
Ted Kremenekf7639e12012-03-06 20:06:33 +00003344 if (const Arg *A = Args.getLastArg(options::OPT_ccc_objcmt_migrate)) {
3345 if (ARCMTEnabled) {
3346 D.Diag(diag::err_drv_argument_not_allowed_with)
3347 << A->getAsString(Args) << "-ccc-arcmt-migrate";
3348 }
3349 CmdArgs.push_back("-mt-migrate-directory");
Richard Smithbd55daf2012-11-01 04:30:05 +00003350 CmdArgs.push_back(A->getValue());
Ted Kremenekf7639e12012-03-06 20:06:33 +00003351
3352 if (!Args.hasArg(options::OPT_objcmt_migrate_literals,
Fariborz Jahaniand83ef842013-07-09 16:59:14 +00003353 options::OPT_objcmt_migrate_subscripting,
3354 options::OPT_objcmt_migrate_property)) {
Ted Kremenekf7639e12012-03-06 20:06:33 +00003355 // None specified, means enable them all.
3356 CmdArgs.push_back("-objcmt-migrate-literals");
3357 CmdArgs.push_back("-objcmt-migrate-subscripting");
Fariborz Jahaniand83ef842013-07-09 16:59:14 +00003358 CmdArgs.push_back("-objcmt-migrate-property");
Ted Kremenekf7639e12012-03-06 20:06:33 +00003359 } else {
3360 Args.AddLastArg(CmdArgs, options::OPT_objcmt_migrate_literals);
3361 Args.AddLastArg(CmdArgs, options::OPT_objcmt_migrate_subscripting);
Fariborz Jahaniand83ef842013-07-09 16:59:14 +00003362 Args.AddLastArg(CmdArgs, options::OPT_objcmt_migrate_property);
Ted Kremenekf7639e12012-03-06 20:06:33 +00003363 }
Argyrios Kyrtzidis55ecf992013-11-13 23:38:20 +00003364 } else {
3365 Args.AddLastArg(CmdArgs, options::OPT_objcmt_migrate_literals);
3366 Args.AddLastArg(CmdArgs, options::OPT_objcmt_migrate_subscripting);
3367 Args.AddLastArg(CmdArgs, options::OPT_objcmt_migrate_property);
3368 Args.AddLastArg(CmdArgs, options::OPT_objcmt_migrate_all);
3369 Args.AddLastArg(CmdArgs, options::OPT_objcmt_migrate_readonly_property);
3370 Args.AddLastArg(CmdArgs, options::OPT_objcmt_migrate_readwrite_property);
3371 Args.AddLastArg(CmdArgs, options::OPT_objcmt_migrate_annotation);
3372 Args.AddLastArg(CmdArgs, options::OPT_objcmt_migrate_instancetype);
3373 Args.AddLastArg(CmdArgs, options::OPT_objcmt_migrate_nsmacros);
3374 Args.AddLastArg(CmdArgs, options::OPT_objcmt_migrate_protocol_conformance);
3375 Args.AddLastArg(CmdArgs, options::OPT_objcmt_atomic_property);
3376 Args.AddLastArg(CmdArgs, options::OPT_objcmt_returns_innerpointer_property);
3377 Args.AddLastArg(CmdArgs, options::OPT_objcmt_ns_nonatomic_iosonly);
Argyrios Kyrtzidis74aa02562013-12-11 01:29:48 +00003378 Args.AddLastArg(CmdArgs, options::OPT_objcmt_migrate_designated_init);
Argyrios Kyrtzidisd5ba86b2013-12-10 18:36:53 +00003379 Args.AddLastArg(CmdArgs, options::OPT_objcmt_whitelist_dir_path);
Ted Kremenekf7639e12012-03-06 20:06:33 +00003380 }
3381
Daniel Dunbard067f7f2009-04-08 23:54:23 +00003382 // Add preprocessing options like -I, -D, etc. if we are using the
3383 // preprocessor.
3384 //
3385 // FIXME: Support -fpreprocessed
Daniel Dunbard067f7f2009-04-08 23:54:23 +00003386 if (types::getPreprocessedType(InputType) != types::TY_INVALID)
Chad Rosier633dcdc2013-01-24 19:14:47 +00003387 AddPreprocessingOptions(C, JA, D, Args, CmdArgs, Output, Inputs);
Daniel Dunbara2aedc62009-03-18 10:01:51 +00003388
Rafael Espindolaa7431922011-07-21 23:40:37 +00003389 // Don't warn about "clang -c -DPIC -fPIC test.i" because libtool.m4 assumes
3390 // that "The compiler can only warn and ignore the option if not recognized".
3391 // When building with ccache, it will pass -D options to clang even on
3392 // preprocessed inputs and configure concludes that -fPIC is not supported.
3393 Args.ClaimAllArgs(options::OPT_D);
3394
Alp Toker7874bdc2013-11-15 20:40:58 +00003395 // Manually translate -O4 to -O3; let clang reject others.
Rafael Espindolaad70d962013-08-27 16:58:15 +00003396 if (Arg *A = Args.getLastArg(options::OPT_O_Group)) {
3397 if (A->getOption().matches(options::OPT_O4)) {
3398 CmdArgs.push_back("-O3");
3399 D.Diag(diag::warn_O4_is_O3);
3400 } else {
3401 A->render(Args, CmdArgs);
3402 }
3403 }
Daniel Dunbara2aedc62009-03-18 10:01:51 +00003404
Sylvestre Ledru2fe501e2014-07-11 11:43:57 +00003405 // Warn about ignored options to clang.
3406 for (arg_iterator it = Args.filtered_begin(
3407 options::OPT_clang_ignored_gcc_optimization_f_Group),
3408 ie = Args.filtered_end(); it != ie; ++it) {
3409 D.Diag(diag::warn_ignored_gcc_optimization) << (*it)->getAsString(Args);
3410 }
3411
Rafael Espindola577637a2015-01-03 00:06:04 +00003412 claimNoWarnArgs(Args);
Chad Rosier86b82082012-12-12 20:06:31 +00003413
Richard Smith3be1cb22014-08-07 00:24:21 +00003414 Args.AddAllArgs(CmdArgs, options::OPT_R_Group);
Daniel Dunbar945577c2009-10-29 02:24:45 +00003415 Args.AddAllArgs(CmdArgs, options::OPT_W_Group);
Ted Kremenekb22ea2a2012-07-07 05:53:30 +00003416 if (Args.hasFlag(options::OPT_pedantic, options::OPT_no_pedantic, false))
3417 CmdArgs.push_back("-pedantic");
Daniel Dunbar945577c2009-10-29 02:24:45 +00003418 Args.AddLastArg(CmdArgs, options::OPT_pedantic_errors);
Daniel Dunbara2aedc62009-03-18 10:01:51 +00003419 Args.AddLastArg(CmdArgs, options::OPT_w);
Daniel Dunbarc44b4cc2009-04-07 22:13:21 +00003420
3421 // Handle -{std, ansi, trigraphs} -- take the last of -{std, ansi}
Hans Wennborgec993822013-07-31 16:57:56 +00003422 // (-ansi is equivalent to -std=c89 or -std=c++98).
Daniel Dunbarc44b4cc2009-04-07 22:13:21 +00003423 //
3424 // If a std is supplied, only add -trigraphs if it follows the
3425 // option.
3426 if (Arg *Std = Args.getLastArg(options::OPT_std_EQ, options::OPT_ansi)) {
3427 if (Std->getOption().matches(options::OPT_ansi))
Nuno Lopes275225d2009-10-16 14:28:06 +00003428 if (types::isCXX(InputType))
Daniel Dunbar1c7577c2009-11-04 06:24:38 +00003429 CmdArgs.push_back("-std=c++98");
Nuno Lopes275225d2009-10-16 14:28:06 +00003430 else
Daniel Dunbar1c7577c2009-11-04 06:24:38 +00003431 CmdArgs.push_back("-std=c89");
Daniel Dunbarc44b4cc2009-04-07 22:13:21 +00003432 else
3433 Std->render(Args, CmdArgs);
3434
Nico Weber00721502014-12-23 22:32:37 +00003435 // If -f(no-)trigraphs appears after the language standard flag, honor it.
Daniel Dunbar3f1a1ff2010-06-14 21:23:08 +00003436 if (Arg *A = Args.getLastArg(options::OPT_std_EQ, options::OPT_ansi,
Nico Weber00721502014-12-23 22:32:37 +00003437 options::OPT_ftrigraphs,
3438 options::OPT_fno_trigraphs))
Daniel Dunbar3f1a1ff2010-06-14 21:23:08 +00003439 if (A != Std)
Daniel Dunbarc44b4cc2009-04-07 22:13:21 +00003440 A->render(Args, CmdArgs);
Daniel Dunbar72a60902009-04-26 01:10:38 +00003441 } else {
3442 // Honor -std-default.
Daniel Dunbar12998192010-01-29 21:03:02 +00003443 //
3444 // FIXME: Clang doesn't correctly handle -std= when the input language
3445 // doesn't match. For the time being just ignore this for C++ inputs;
3446 // eventually we want to do all the standard defaulting here instead of
3447 // splitting it between the driver and clang -cc1.
3448 if (!types::isCXX(InputType))
Nico Weber723b4f02012-08-30 02:08:31 +00003449 Args.AddAllArgsTranslated(CmdArgs, options::OPT_std_default_EQ,
3450 "-std=", /*Joined=*/true);
Saleem Abdulrasool377066a2014-03-27 22:50:18 +00003451 else if (IsWindowsMSVC)
Nico Weber723b4f02012-08-30 02:08:31 +00003452 CmdArgs.push_back("-std=c++11");
3453
Nico Weber00721502014-12-23 22:32:37 +00003454 Args.AddLastArg(CmdArgs, options::OPT_ftrigraphs,
3455 options::OPT_fno_trigraphs);
Daniel Dunbar72a60902009-04-26 01:10:38 +00003456 }
Daniel Dunbard067f7f2009-04-08 23:54:23 +00003457
Richard Smith282b4492013-09-04 22:50:31 +00003458 // GCC's behavior for -Wwrite-strings is a bit strange:
3459 // * In C, this "warning flag" changes the types of string literals from
3460 // 'char[N]' to 'const char[N]', and thus triggers an unrelated warning
3461 // for the discarded qualifier.
3462 // * In C++, this is just a normal warning flag.
3463 //
3464 // Implementing this warning correctly in C is hard, so we follow GCC's
3465 // behavior for now. FIXME: Directly diagnose uses of a string literal as
3466 // a non-const char* in C, rather than using this crude hack.
3467 if (!types::isCXX(InputType)) {
Argyrios Kyrtzidis25f2afde2014-02-07 08:33:28 +00003468 // FIXME: This should behave just like a warning flag, and thus should also
3469 // respect -Weverything, -Wno-everything, -Werror=write-strings, and so on.
3470 Arg *WriteStrings =
3471 Args.getLastArg(options::OPT_Wwrite_strings,
3472 options::OPT_Wno_write_strings, options::OPT_w);
3473 if (WriteStrings &&
3474 WriteStrings->getOption().matches(options::OPT_Wwrite_strings))
Richard Smith282b4492013-09-04 22:50:31 +00003475 CmdArgs.push_back("-fconst-strings");
Chandler Carruthb009b142011-04-23 06:30:43 +00003476 }
3477
Chandler Carruth61fbf622011-04-23 09:27:53 +00003478 // GCC provides a macro definition '__DEPRECATED' when -Wdeprecated is active
Chandler Carruth30483fb2011-04-23 19:48:40 +00003479 // during C++ compilation, which it is by default. GCC keeps this define even
3480 // in the presence of '-w', match this behavior bug-for-bug.
3481 if (types::isCXX(InputType) &&
3482 Args.hasFlag(options::OPT_Wdeprecated, options::OPT_Wno_deprecated,
3483 true)) {
3484 CmdArgs.push_back("-fdeprecated-macro");
Chandler Carruth61fbf622011-04-23 09:27:53 +00003485 }
3486
Chandler Carruthe0391482010-05-22 02:21:53 +00003487 // Translate GCC's misnamer '-fasm' arguments to '-fgnu-keywords'.
3488 if (Arg *Asm = Args.getLastArg(options::OPT_fasm, options::OPT_fno_asm)) {
3489 if (Asm->getOption().matches(options::OPT_fasm))
3490 CmdArgs.push_back("-fgnu-keywords");
3491 else
3492 CmdArgs.push_back("-fno-gnu-keywords");
3493 }
3494
Nick Lewycky1d617ac2011-10-17 23:05:52 +00003495 if (ShouldDisableDwarfDirectory(Args, getToolChain()))
3496 CmdArgs.push_back("-fno-dwarf-directory-asm");
3497
Daniel Dunbare246fbe2013-04-16 18:21:19 +00003498 if (ShouldDisableAutolink(Args, getToolChain()))
3499 CmdArgs.push_back("-fno-autolink");
3500
Chandler Carruth4d5e1a92012-12-17 21:40:04 +00003501 // Add in -fdebug-compilation-dir if necessary.
3502 addDebugCompDirArg(Args, CmdArgs);
Nick Lewyckyba743b72011-10-21 02:32:14 +00003503
Richard Smith9a568822011-11-21 19:36:32 +00003504 if (Arg *A = Args.getLastArg(options::OPT_ftemplate_depth_,
3505 options::OPT_ftemplate_depth_EQ)) {
Daniel Dunbara2aedc62009-03-18 10:01:51 +00003506 CmdArgs.push_back("-ftemplate-depth");
Richard Smithbd55daf2012-11-01 04:30:05 +00003507 CmdArgs.push_back(A->getValue());
Daniel Dunbara2aedc62009-03-18 10:01:51 +00003508 }
3509
Richard Smith79c927b2013-11-06 19:31:51 +00003510 if (Arg *A = Args.getLastArg(options::OPT_foperator_arrow_depth_EQ)) {
3511 CmdArgs.push_back("-foperator-arrow-depth");
3512 CmdArgs.push_back(A->getValue());
3513 }
3514
Richard Smith9a568822011-11-21 19:36:32 +00003515 if (Arg *A = Args.getLastArg(options::OPT_fconstexpr_depth_EQ)) {
3516 CmdArgs.push_back("-fconstexpr-depth");
Richard Smithbd55daf2012-11-01 04:30:05 +00003517 CmdArgs.push_back(A->getValue());
Richard Smith9a568822011-11-21 19:36:32 +00003518 }
3519
Richard Smitha3d3bd22013-05-08 02:12:03 +00003520 if (Arg *A = Args.getLastArg(options::OPT_fconstexpr_steps_EQ)) {
3521 CmdArgs.push_back("-fconstexpr-steps");
3522 CmdArgs.push_back(A->getValue());
3523 }
3524
Richard Smithb3a14522013-02-22 01:59:51 +00003525 if (Arg *A = Args.getLastArg(options::OPT_fbracket_depth_EQ)) {
3526 CmdArgs.push_back("-fbracket-depth");
3527 CmdArgs.push_back(A->getValue());
3528 }
3529
Argyrios Kyrtzidisef6c8da2010-11-18 00:20:36 +00003530 if (Arg *A = Args.getLastArg(options::OPT_Wlarge_by_value_copy_EQ,
3531 options::OPT_Wlarge_by_value_copy_def)) {
Jean-Daniel Dupas73d801c2012-05-04 08:08:37 +00003532 if (A->getNumValues()) {
Richard Smithbd55daf2012-11-01 04:30:05 +00003533 StringRef bytes = A->getValue();
Jean-Daniel Dupas73d801c2012-05-04 08:08:37 +00003534 CmdArgs.push_back(Args.MakeArgString("-Wlarge-by-value-copy=" + bytes));
3535 } else
3536 CmdArgs.push_back("-Wlarge-by-value-copy=64"); // default value
Argyrios Kyrtzidisaf84ec02010-11-17 23:11:54 +00003537 }
3538
Nuno Lopes3d6311d2012-05-08 22:10:46 +00003539
Michael J. Spencer929fccd2012-10-22 22:13:48 +00003540 if (Args.hasArg(options::OPT_relocatable_pch))
Daniel Dunbar8bed86c2009-11-20 22:21:36 +00003541 CmdArgs.push_back("-relocatable-pch");
Mike Stump11289f42009-09-09 15:08:12 +00003542
Daniel Dunbar1c7577c2009-11-04 06:24:38 +00003543 if (Arg *A = Args.getLastArg(options::OPT_fconstant_string_class_EQ)) {
3544 CmdArgs.push_back("-fconstant-string-class");
Richard Smithbd55daf2012-11-01 04:30:05 +00003545 CmdArgs.push_back(A->getValue());
Daniel Dunbar1c7577c2009-11-04 06:24:38 +00003546 }
David Chisnall5778fce2009-08-31 16:41:57 +00003547
Chris Lattnere23003d2010-01-09 21:54:33 +00003548 if (Arg *A = Args.getLastArg(options::OPT_ftabstop_EQ)) {
3549 CmdArgs.push_back("-ftabstop");
Richard Smithbd55daf2012-11-01 04:30:05 +00003550 CmdArgs.push_back(A->getValue());
Chris Lattnere23003d2010-01-09 21:54:33 +00003551 }
3552
Chris Lattnerb35583d2010-04-07 20:49:23 +00003553 CmdArgs.push_back("-ferror-limit");
3554 if (Arg *A = Args.getLastArg(options::OPT_ferror_limit_EQ))
Richard Smithbd55daf2012-11-01 04:30:05 +00003555 CmdArgs.push_back(A->getValue());
Chris Lattnerb35583d2010-04-07 20:49:23 +00003556 else
3557 CmdArgs.push_back("19");
Douglas Gregorffed1cb2010-04-20 07:18:24 +00003558
Chandler Carrutha77a7272010-05-06 04:55:18 +00003559 if (Arg *A = Args.getLastArg(options::OPT_fmacro_backtrace_limit_EQ)) {
3560 CmdArgs.push_back("-fmacro-backtrace-limit");
Richard Smithbd55daf2012-11-01 04:30:05 +00003561 CmdArgs.push_back(A->getValue());
Chandler Carrutha77a7272010-05-06 04:55:18 +00003562 }
3563
3564 if (Arg *A = Args.getLastArg(options::OPT_ftemplate_backtrace_limit_EQ)) {
3565 CmdArgs.push_back("-ftemplate-backtrace-limit");
Richard Smithbd55daf2012-11-01 04:30:05 +00003566 CmdArgs.push_back(A->getValue());
Chandler Carrutha77a7272010-05-06 04:55:18 +00003567 }
3568
Richard Smithf6f003a2011-12-16 19:06:07 +00003569 if (Arg *A = Args.getLastArg(options::OPT_fconstexpr_backtrace_limit_EQ)) {
3570 CmdArgs.push_back("-fconstexpr-backtrace-limit");
Richard Smithbd55daf2012-11-01 04:30:05 +00003571 CmdArgs.push_back(A->getValue());
Richard Smithf6f003a2011-12-16 19:06:07 +00003572 }
3573
Nick Lewycky24653262014-12-16 21:39:02 +00003574 if (Arg *A = Args.getLastArg(options::OPT_fspell_checking_limit_EQ)) {
3575 CmdArgs.push_back("-fspell-checking-limit");
3576 CmdArgs.push_back(A->getValue());
3577 }
3578
Daniel Dunbar2c978472009-11-04 06:24:47 +00003579 // Pass -fmessage-length=.
Daniel Dunbar84bb7932009-11-30 08:40:54 +00003580 CmdArgs.push_back("-fmessage-length");
Daniel Dunbar2c978472009-11-04 06:24:47 +00003581 if (Arg *A = Args.getLastArg(options::OPT_fmessage_length_EQ)) {
Richard Smithbd55daf2012-11-01 04:30:05 +00003582 CmdArgs.push_back(A->getValue());
Daniel Dunbar2c978472009-11-04 06:24:47 +00003583 } else {
3584 // If -fmessage-length=N was not specified, determine whether this is a
3585 // terminal and, if so, implicitly define -fmessage-length appropriately.
3586 unsigned N = llvm::sys::Process::StandardErrColumns();
Chris Lattner0e62c1c2011-07-23 10:55:15 +00003587 CmdArgs.push_back(Args.MakeArgString(Twine(N)));
Daniel Dunbar2c978472009-11-04 06:24:47 +00003588 }
3589
John McCallb4a99d32013-02-19 01:57:35 +00003590 // -fvisibility= and -fvisibility-ms-compat are of a piece.
3591 if (const Arg *A = Args.getLastArg(options::OPT_fvisibility_EQ,
3592 options::OPT_fvisibility_ms_compat)) {
3593 if (A->getOption().matches(options::OPT_fvisibility_EQ)) {
3594 CmdArgs.push_back("-fvisibility");
3595 CmdArgs.push_back(A->getValue());
3596 } else {
3597 assert(A->getOption().matches(options::OPT_fvisibility_ms_compat));
3598 CmdArgs.push_back("-fvisibility");
3599 CmdArgs.push_back("hidden");
3600 CmdArgs.push_back("-ftype-visibility");
3601 CmdArgs.push_back("default");
3602 }
Daniel Dunbare357d562009-12-03 18:42:11 +00003603 }
3604
Douglas Gregor08329632010-06-15 17:05:35 +00003605 Args.AddLastArg(CmdArgs, options::OPT_fvisibility_inlines_hidden);
Michael J. Spencer4c0ffa82010-10-21 03:16:25 +00003606
Hans Wennborgf60f6af2012-06-28 08:01:44 +00003607 Args.AddLastArg(CmdArgs, options::OPT_ftlsmodel_EQ);
3608
Daniel Dunbare46b52a2010-03-20 04:52:14 +00003609 // -fhosted is default.
Chad Rosier4fab82c2012-03-26 22:04:46 +00003610 if (Args.hasFlag(options::OPT_ffreestanding, options::OPT_fhosted, false) ||
3611 KernelOrKext)
Daniel Dunbare46b52a2010-03-20 04:52:14 +00003612 CmdArgs.push_back("-ffreestanding");
3613
Daniel Dunbare357d562009-12-03 18:42:11 +00003614 // Forward -f (flag) options which we can pass directly.
Daniel Dunbar3a148f22009-04-07 21:51:40 +00003615 Args.AddLastArg(CmdArgs, options::OPT_femit_all_decls);
Daniel Dunbar3a148f22009-04-07 21:51:40 +00003616 Args.AddLastArg(CmdArgs, options::OPT_fheinous_gnu_extensions);
Adrian Prantla7634472014-01-07 01:19:08 +00003617 Args.AddLastArg(CmdArgs, options::OPT_fstandalone_debug);
3618 Args.AddLastArg(CmdArgs, options::OPT_fno_standalone_debug);
Eric Christopher86050822011-10-25 07:13:06 +00003619 Args.AddLastArg(CmdArgs, options::OPT_fno_operator_names);
Bill Schmidtb3b804e2013-07-03 15:36:02 +00003620 // AltiVec language extensions aren't relevant for assembling.
3621 if (!isa<PreprocessJobAction>(JA) ||
3622 Output.getType() != types::TY_PP_Asm)
3623 Args.AddLastArg(CmdArgs, options::OPT_faltivec);
Richard Trieu91844232012-06-26 18:18:47 +00003624 Args.AddLastArg(CmdArgs, options::OPT_fdiagnostics_show_template_tree);
3625 Args.AddLastArg(CmdArgs, options::OPT_fno_elide_type);
Chad Rosier864dfe12012-03-13 23:45:51 +00003626
Peter Collingbourne32701642013-11-01 18:16:25 +00003627 const SanitizerArgs &Sanitize = getToolChain().getSanitizerArgs();
3628 Sanitize.addArgs(Args, CmdArgs);
Richard Smith52be6192012-11-05 22:04:41 +00003629
Eric Christopher459d2712013-02-19 06:16:53 +00003630 // Report an error for -faltivec on anything other than PowerPC.
Chad Rosier864dfe12012-03-13 23:45:51 +00003631 if (const Arg *A = Args.getLastArg(options::OPT_faltivec))
Eli Benderskyd4a6aec2013-07-24 22:20:49 +00003632 if (!(getToolChain().getArch() == llvm::Triple::ppc ||
Bill Schmidt778d3872013-07-26 01:36:11 +00003633 getToolChain().getArch() == llvm::Triple::ppc64 ||
3634 getToolChain().getArch() == llvm::Triple::ppc64le))
Chad Rosier864dfe12012-03-13 23:45:51 +00003635 D.Diag(diag::err_drv_argument_only_allowed_with)
Bill Schmidt778d3872013-07-26 01:36:11 +00003636 << A->getAsString(Args) << "ppc/ppc64/ppc64le";
Chad Rosier864dfe12012-03-13 23:45:51 +00003637
Daniel Dunbar733b0f82011-03-01 18:49:30 +00003638 if (getToolChain().SupportsProfiling())
3639 Args.AddLastArg(CmdArgs, options::OPT_pg);
Daniel Dunbar35621a92010-03-16 16:57:46 +00003640
3641 // -flax-vector-conversions is default.
3642 if (!Args.hasFlag(options::OPT_flax_vector_conversions,
3643 options::OPT_fno_lax_vector_conversions))
3644 CmdArgs.push_back("-fno-lax-vector-conversions");
3645
Fariborz Jahaniana4cfff82011-01-07 01:05:02 +00003646 if (Args.getLastArg(options::OPT_fapple_kext))
3647 CmdArgs.push_back("-fapple-kext");
3648
Fariborz Jahaniana4404f22009-05-22 20:17:16 +00003649 Args.AddLastArg(CmdArgs, options::OPT_fobjc_sender_dependent_dispatch);
Chris Lattner69686412009-04-21 05:34:31 +00003650 Args.AddLastArg(CmdArgs, options::OPT_fdiagnostics_print_source_range_info);
Douglas Gregoreec975c2010-08-19 20:24:43 +00003651 Args.AddLastArg(CmdArgs, options::OPT_fdiagnostics_parseable_fixits);
Daniel Dunbar3a148f22009-04-07 21:51:40 +00003652 Args.AddLastArg(CmdArgs, options::OPT_ftime_report);
3653 Args.AddLastArg(CmdArgs, options::OPT_ftrapv);
David Chisnalldd84ef12010-09-17 18:29:54 +00003654
3655 if (Arg *A = Args.getLastArg(options::OPT_ftrapv_handler_EQ)) {
3656 CmdArgs.push_back("-ftrapv-handler");
Richard Smithbd55daf2012-11-01 04:30:05 +00003657 CmdArgs.push_back(A->getValue());
David Chisnalldd84ef12010-09-17 18:29:54 +00003658 }
3659
Bob Wilson14adb362012-02-03 06:27:22 +00003660 Args.AddLastArg(CmdArgs, options::OPT_ftrap_function_EQ);
Evan Cheng04c94292011-04-08 21:37:45 +00003661
Chandler Carruth6e501032011-03-27 00:04:55 +00003662 // -fno-strict-overflow implies -fwrapv if it isn't disabled, but
3663 // -fstrict-overflow won't turn off an explicitly enabled -fwrapv.
3664 if (Arg *A = Args.getLastArg(options::OPT_fwrapv,
3665 options::OPT_fno_wrapv)) {
3666 if (A->getOption().matches(options::OPT_fwrapv))
3667 CmdArgs.push_back("-fwrapv");
3668 } else if (Arg *A = Args.getLastArg(options::OPT_fstrict_overflow,
3669 options::OPT_fno_strict_overflow)) {
3670 if (A->getOption().matches(options::OPT_fno_strict_overflow))
3671 CmdArgs.push_back("-fwrapv");
3672 }
Hal Finkelce0697f2013-11-17 16:03:29 +00003673
3674 if (Arg *A = Args.getLastArg(options::OPT_freroll_loops,
3675 options::OPT_fno_reroll_loops))
3676 if (A->getOption().matches(options::OPT_freroll_loops))
3677 CmdArgs.push_back("-freroll-loops");
3678
Daniel Dunbar3a148f22009-04-07 21:51:40 +00003679 Args.AddLastArg(CmdArgs, options::OPT_fwritable_strings);
Chandler Carruth54c29102013-08-08 08:34:35 +00003680 Args.AddLastArg(CmdArgs, options::OPT_funroll_loops,
3681 options::OPT_fno_unroll_loops);
Daniel Dunbara2aedc62009-03-18 10:01:51 +00003682
Daniel Dunbara77eaeb2009-09-03 04:54:28 +00003683 Args.AddLastArg(CmdArgs, options::OPT_pthread);
3684
Mahesha S6a682be42012-10-27 07:47:56 +00003685
Daniel Dunbar4930e332009-11-17 08:07:36 +00003686 // -stack-protector=0 is default.
3687 unsigned StackProtectorLevel = 0;
Bill Wendlingd63bbad2009-06-28 07:36:13 +00003688 if (Arg *A = Args.getLastArg(options::OPT_fno_stack_protector,
3689 options::OPT_fstack_protector_all,
Josh Mageee0fc1a82014-02-11 01:35:14 +00003690 options::OPT_fstack_protector_strong,
Bill Wendlingd63bbad2009-06-28 07:36:13 +00003691 options::OPT_fstack_protector)) {
Rafael Espindolace5c6092014-05-22 22:57:39 +00003692 if (A->getOption().matches(options::OPT_fstack_protector)) {
3693 StackProtectorLevel = std::max<unsigned>(LangOptions::SSPOn,
3694 getToolChain().GetDefaultStackProtectorLevel(KernelOrKext));
3695 } else if (A->getOption().matches(options::OPT_fstack_protector_strong))
Josh Mageee0fc1a82014-02-11 01:35:14 +00003696 StackProtectorLevel = LangOptions::SSPStrong;
Daniel Dunbar4930e332009-11-17 08:07:36 +00003697 else if (A->getOption().matches(options::OPT_fstack_protector_all))
Josh Mageee0fc1a82014-02-11 01:35:14 +00003698 StackProtectorLevel = LangOptions::SSPReq;
Nico Weberdd473632011-08-23 07:38:27 +00003699 } else {
3700 StackProtectorLevel =
3701 getToolChain().GetDefaultStackProtectorLevel(KernelOrKext);
3702 }
Daniel Dunbar4930e332009-11-17 08:07:36 +00003703 if (StackProtectorLevel) {
3704 CmdArgs.push_back("-stack-protector");
Chris Lattner0e62c1c2011-07-23 10:55:15 +00003705 CmdArgs.push_back(Args.MakeArgString(Twine(StackProtectorLevel)));
Joerg Sonnenberger85e2bbc2012-09-12 13:51:14 +00003706 }
Chad Rosierdb3da832012-08-21 16:16:06 +00003707
Joerg Sonnenberger85e2bbc2012-09-12 13:51:14 +00003708 // --param ssp-buffer-size=
3709 for (arg_iterator it = Args.filtered_begin(options::OPT__param),
3710 ie = Args.filtered_end(); it != ie; ++it) {
Richard Smithbd55daf2012-11-01 04:30:05 +00003711 StringRef Str((*it)->getValue());
Joerg Sonnenberger85e2bbc2012-09-12 13:51:14 +00003712 if (Str.startswith("ssp-buffer-size=")) {
3713 if (StackProtectorLevel) {
Chad Rosierdb3da832012-08-21 16:16:06 +00003714 CmdArgs.push_back("-stack-protector-buffer-size");
3715 // FIXME: Verify the argument is a valid integer.
3716 CmdArgs.push_back(Args.MakeArgString(Str.drop_front(16)));
Chad Rosierdb3da832012-08-21 16:16:06 +00003717 }
Joerg Sonnenberger85e2bbc2012-09-12 13:51:14 +00003718 (*it)->claim();
Chad Rosierdb3da832012-08-21 16:16:06 +00003719 }
Bill Wendlingd63bbad2009-06-28 07:36:13 +00003720 }
3721
Nick Lewyckyf4d3f7a2011-12-06 03:33:03 +00003722 // Translate -mstackrealign
3723 if (Args.hasFlag(options::OPT_mstackrealign, options::OPT_mno_stackrealign,
3724 false)) {
3725 CmdArgs.push_back("-backend-option");
3726 CmdArgs.push_back("-force-align-stack");
3727 }
3728 if (!Args.hasFlag(options::OPT_mno_stackrealign, options::OPT_mstackrealign,
3729 false)) {
3730 CmdArgs.push_back(Args.MakeArgString("-mstackrealign"));
3731 }
3732
Joerg Sonnenbergerdb66ed02011-12-05 23:05:23 +00003733 if (Args.hasArg(options::OPT_mstack_alignment)) {
3734 StringRef alignment = Args.getLastArgValue(options::OPT_mstack_alignment);
3735 CmdArgs.push_back(Args.MakeArgString("-mstack-alignment=" + alignment));
Eric Christopherd5c45f62011-05-02 21:18:22 +00003736 }
Eric Christopher84fbdb42011-08-19 00:30:14 +00003737
Hans Wennborg77dc2362015-01-20 19:45:50 +00003738 if (Args.hasArg(options::OPT_mstack_probe_size)) {
3739 StringRef Size = Args.getLastArgValue(options::OPT_mstack_probe_size);
3740
3741 if (!Size.empty())
3742 CmdArgs.push_back(Args.MakeArgString("-mstack-probe-size=" + Size));
3743 else
3744 CmdArgs.push_back("-mstack-probe-size=0");
3745 }
3746
Oliver Stannarded8ecc82014-08-27 16:31:57 +00003747 if (getToolChain().getTriple().getArch() == llvm::Triple::aarch64 ||
3748 getToolChain().getTriple().getArch() == llvm::Triple::aarch64_be)
3749 CmdArgs.push_back("-fallow-half-arguments-and-returns");
3750
Weiming Zhao580dcfb2013-11-13 18:31:23 +00003751 if (Arg *A = Args.getLastArg(options::OPT_mrestrict_it,
3752 options::OPT_mno_restrict_it)) {
3753 if (A->getOption().matches(options::OPT_mrestrict_it)) {
3754 CmdArgs.push_back("-backend-option");
3755 CmdArgs.push_back("-arm-restrict-it");
3756 } else {
3757 CmdArgs.push_back("-backend-option");
3758 CmdArgs.push_back("-arm-no-restrict-it");
3759 }
Saleem Abdulrasool6deb8162014-05-18 06:42:02 +00003760 } else if (TT.isOSWindows() && (TT.getArch() == llvm::Triple::arm ||
3761 TT.getArch() == llvm::Triple::thumb)) {
3762 // Windows on ARM expects restricted IT blocks
3763 CmdArgs.push_back("-backend-option");
3764 CmdArgs.push_back("-arm-restrict-it");
Weiming Zhao580dcfb2013-11-13 18:31:23 +00003765 }
3766
Saleem Abdulrasoolaea65e92014-06-07 19:32:38 +00003767 if (TT.getArch() == llvm::Triple::arm ||
3768 TT.getArch() == llvm::Triple::thumb) {
3769 if (Arg *A = Args.getLastArg(options::OPT_mlong_calls,
3770 options::OPT_mno_long_calls)) {
3771 if (A->getOption().matches(options::OPT_mlong_calls)) {
3772 CmdArgs.push_back("-backend-option");
Saleem Abdulrasooldf903932014-06-18 16:52:24 +00003773 CmdArgs.push_back("-arm-long-calls");
Saleem Abdulrasoolaea65e92014-06-07 19:32:38 +00003774 }
3775 }
3776 }
3777
Daniel Dunbard18049a2009-04-07 21:16:11 +00003778 // Forward -f options with positive and negative forms; we translate
3779 // these by hand.
Diego Novillo5c297052013-11-13 12:22:39 +00003780 if (Arg *A = Args.getLastArg(options::OPT_fprofile_sample_use_EQ)) {
3781 StringRef fname = A->getValue();
3782 if (!llvm::sys::fs::exists(fname))
3783 D.Diag(diag::err_drv_no_such_file) << fname;
3784 else
3785 A->render(Args, CmdArgs);
3786 }
Daniel Dunbard18049a2009-04-07 21:16:11 +00003787
Fariborz Jahaniana4cfff82011-01-07 01:05:02 +00003788 if (Args.hasArg(options::OPT_mkernel)) {
Daniel Dunbar80f787c2011-02-04 17:24:47 +00003789 if (!Args.hasArg(options::OPT_fapple_kext) && types::isCXX(InputType))
Fariborz Jahaniana4cfff82011-01-07 01:05:02 +00003790 CmdArgs.push_back("-fapple-kext");
3791 if (!Args.hasArg(options::OPT_fbuiltin))
3792 CmdArgs.push_back("-fno-builtin");
Chad Rosierf27e1c42012-03-26 21:29:17 +00003793 Args.ClaimAllArgs(options::OPT_fno_builtin);
Fariborz Jahaniana4cfff82011-01-07 01:05:02 +00003794 }
Daniel Dunbar4930e332009-11-17 08:07:36 +00003795 // -fbuiltin is default.
Fariborz Jahaniana4cfff82011-01-07 01:05:02 +00003796 else if (!Args.hasFlag(options::OPT_fbuiltin, options::OPT_fno_builtin))
Daniel Dunbar484afa22009-11-19 04:55:23 +00003797 CmdArgs.push_back("-fno-builtin");
Daniel Dunbard18049a2009-04-07 21:16:11 +00003798
Nuno Lopes13c88c72009-12-16 16:59:22 +00003799 if (!Args.hasFlag(options::OPT_fassume_sane_operator_new,
3800 options::OPT_fno_assume_sane_operator_new))
3801 CmdArgs.push_back("-fno-assume-sane-operator-new");
3802
Daniel Dunbar4930e332009-11-17 08:07:36 +00003803 // -fblocks=0 is default.
3804 if (Args.hasFlag(options::OPT_fblocks, options::OPT_fno_blocks,
David Chisnallda209912011-02-28 17:11:43 +00003805 getToolChain().IsBlocksDefault()) ||
3806 (Args.hasArg(options::OPT_fgnu_runtime) &&
3807 Args.hasArg(options::OPT_fobjc_nonfragile_abi) &&
3808 !Args.hasArg(options::OPT_fno_blocks))) {
Daniel Dunbar4930e332009-11-17 08:07:36 +00003809 CmdArgs.push_back("-fblocks");
John McCall7959fee2011-09-09 20:41:01 +00003810
3811 if (!Args.hasArg(options::OPT_fgnu_runtime) &&
3812 !getToolChain().hasBlocksRuntime())
3813 CmdArgs.push_back("-fblocks-runtime-optional");
David Chisnall950a9512009-11-17 19:33:30 +00003814 }
Daniel Dunbard18049a2009-04-07 21:16:11 +00003815
Richard Smithffb65082014-09-30 23:10:19 +00003816 // -fmodules enables modules (off by default).
3817 // Users can pass -fno-cxx-modules to turn off modules support for
3818 // C++/Objective-C++ programs, which is a little less mature.
Douglas Gregorc60437f2013-01-16 01:23:41 +00003819 bool HaveModules = false;
Douglas Gregor226173a2012-01-18 15:19:58 +00003820 if (Args.hasFlag(options::OPT_fmodules, options::OPT_fno_modules, false)) {
3821 bool AllowedInCXX = Args.hasFlag(options::OPT_fcxx_modules,
3822 options::OPT_fno_cxx_modules,
Richard Smithffb65082014-09-30 23:10:19 +00003823 true);
Douglas Gregorc60437f2013-01-16 01:23:41 +00003824 if (AllowedInCXX || !types::isCXX(InputType)) {
Douglas Gregor226173a2012-01-18 15:19:58 +00003825 CmdArgs.push_back("-fmodules");
Douglas Gregorc60437f2013-01-16 01:23:41 +00003826 HaveModules = true;
3827 }
3828 }
3829
Daniel Jasper07e6c402013-08-05 20:26:17 +00003830 // -fmodule-maps enables module map processing (off by default) for header
3831 // checking. It is implied by -fmodules.
3832 if (Args.hasFlag(options::OPT_fmodule_maps, options::OPT_fno_module_maps,
3833 false)) {
3834 CmdArgs.push_back("-fmodule-maps");
3835 }
3836
Daniel Jasperac42b752013-10-21 06:34:34 +00003837 // -fmodules-decluse checks that modules used are declared so (off by
3838 // default).
Daniel Jasperba7f2f72013-09-24 09:14:14 +00003839 if (Args.hasFlag(options::OPT_fmodules_decluse,
3840 options::OPT_fno_modules_decluse,
3841 false)) {
Daniel Jasper6e16d542013-09-29 12:40:54 +00003842 CmdArgs.push_back("-fmodules-decluse");
Daniel Jasperba7f2f72013-09-24 09:14:14 +00003843 }
3844
Daniel Jasper962b38e2014-04-11 11:47:45 +00003845 // -fmodules-strict-decluse is like -fmodule-decluse, but also checks that
3846 // all #included headers are part of modules.
3847 if (Args.hasFlag(options::OPT_fmodules_strict_decluse,
3848 options::OPT_fno_modules_strict_decluse,
3849 false)) {
3850 CmdArgs.push_back("-fmodules-strict-decluse");
3851 }
3852
Daniel Jasperac42b752013-10-21 06:34:34 +00003853 // -fmodule-name specifies the module that is currently being built (or
3854 // used for header checking by -fmodule-maps).
Richard Smith9887d792014-10-17 01:42:53 +00003855 Args.AddLastArg(CmdArgs, options::OPT_fmodule_name);
Daniel Jasperac42b752013-10-21 06:34:34 +00003856
Richard Smith9887d792014-10-17 01:42:53 +00003857 // -fmodule-map-file can be used to specify files containing module
Daniel Jasperac42b752013-10-21 06:34:34 +00003858 // definitions.
Richard Smith9887d792014-10-17 01:42:53 +00003859 Args.AddAllArgs(CmdArgs, options::OPT_fmodule_map_file);
Daniel Jasperac42b752013-10-21 06:34:34 +00003860
Richard Smithe842a472014-10-22 02:05:46 +00003861 // -fmodule-file can be used to specify files containing precompiled modules.
3862 Args.AddAllArgs(CmdArgs, options::OPT_fmodule_file);
3863
3864 // -fmodule-cache-path specifies where our implicitly-built module files
3865 // should be written.
Justin Bognera88f0122014-06-20 22:59:50 +00003866 SmallString<128> ModuleCachePath;
3867 if (Arg *A = Args.getLastArg(options::OPT_fmodules_cache_path))
3868 ModuleCachePath = A->getValue();
3869 if (HaveModules) {
3870 if (C.isForDiagnostics()) {
3871 // When generating crash reports, we want to emit the modules along with
3872 // the reproduction sources, so we ignore any provided module path.
3873 ModuleCachePath = Output.getFilename();
3874 llvm::sys::path::replace_extension(ModuleCachePath, ".cache");
3875 llvm::sys::path::append(ModuleCachePath, "modules");
3876 } else if (ModuleCachePath.empty()) {
3877 // No module path was provided: use the default.
3878 llvm::sys::path::system_temp_directory(/*erasedOnReboot=*/false,
3879 ModuleCachePath);
3880 llvm::sys::path::append(ModuleCachePath, "org.llvm.clang");
3881 llvm::sys::path::append(ModuleCachePath, "ModuleCache");
3882 }
Douglas Gregor4bedb492013-02-07 22:59:12 +00003883 const char Arg[] = "-fmodules-cache-path=";
Justin Bognera88f0122014-06-20 22:59:50 +00003884 ModuleCachePath.insert(ModuleCachePath.begin(), Arg, Arg + strlen(Arg));
3885 CmdArgs.push_back(Args.MakeArgString(ModuleCachePath));
3886 }
3887
3888 // When building modules and generating crashdumps, we need to dump a module
3889 // dependency VFS alongside the output.
3890 if (HaveModules && C.isForDiagnostics()) {
3891 SmallString<128> VFSDir(Output.getFilename());
3892 llvm::sys::path::replace_extension(VFSDir, ".cache");
Justin Bogner659ecc32014-10-20 22:47:23 +00003893 // Add the cache directory as a temp so the crash diagnostics pick it up.
3894 C.addTempFile(Args.MakeArgString(VFSDir));
3895
Justin Bognera88f0122014-06-20 22:59:50 +00003896 llvm::sys::path::append(VFSDir, "vfs");
3897 CmdArgs.push_back("-module-dependency-dir");
3898 CmdArgs.push_back(Args.MakeArgString(VFSDir));
Douglas Gregor35b04d62013-02-07 19:01:24 +00003899 }
3900
Richard Smith9887d792014-10-17 01:42:53 +00003901 if (HaveModules)
3902 Args.AddLastArg(CmdArgs, options::OPT_fmodules_user_build_path);
Argyrios Kyrtzidis1594c152014-03-03 08:12:05 +00003903
Douglas Gregor35b04d62013-02-07 19:01:24 +00003904 // Pass through all -fmodules-ignore-macro arguments.
3905 Args.AddAllArgs(CmdArgs, options::OPT_fmodules_ignore_macro);
Douglas Gregor527b1c92013-03-25 21:19:16 +00003906 Args.AddLastArg(CmdArgs, options::OPT_fmodules_prune_interval);
3907 Args.AddLastArg(CmdArgs, options::OPT_fmodules_prune_after);
Douglas Gregor35b04d62013-02-07 19:01:24 +00003908
Dmitri Gribenkof430da42014-02-12 10:33:14 +00003909 Args.AddLastArg(CmdArgs, options::OPT_fbuild_session_timestamp);
3910
Ben Langmuir19e6acb2014-08-01 22:12:21 +00003911 if (Arg *A = Args.getLastArg(options::OPT_fbuild_session_file)) {
3912 if (Args.hasArg(options::OPT_fbuild_session_timestamp))
3913 D.Diag(diag::err_drv_argument_not_allowed_with)
3914 << A->getAsString(Args) << "-fbuild-session-timestamp";
3915
3916 llvm::sys::fs::file_status Status;
3917 if (llvm::sys::fs::status(A->getValue(), Status))
3918 D.Diag(diag::err_drv_no_such_file) << A->getValue();
NAKAMURA Takumi0f9447d2014-08-03 01:11:44 +00003919 char TimeStamp[48];
3920 snprintf(TimeStamp, sizeof(TimeStamp), "-fbuild-session-timestamp=%" PRIu64,
3921 (uint64_t)Status.getLastModificationTime().toEpochTime());
3922 CmdArgs.push_back(Args.MakeArgString(TimeStamp));
Ben Langmuir19e6acb2014-08-01 22:12:21 +00003923 }
3924
Dmitri Gribenkof430da42014-02-12 10:33:14 +00003925 if (Args.getLastArg(options::OPT_fmodules_validate_once_per_build_session)) {
Ben Langmuir19e6acb2014-08-01 22:12:21 +00003926 if (!Args.getLastArg(options::OPT_fbuild_session_timestamp,
3927 options::OPT_fbuild_session_file))
Dmitri Gribenkof430da42014-02-12 10:33:14 +00003928 D.Diag(diag::err_drv_modules_validate_once_requires_timestamp);
3929
3930 Args.AddLastArg(CmdArgs,
3931 options::OPT_fmodules_validate_once_per_build_session);
3932 }
3933
Ben Langmuirdcf73862014-03-12 00:06:17 +00003934 Args.AddLastArg(CmdArgs, options::OPT_fmodules_validate_system_headers);
3935
John McCalldfea9982010-04-09 19:12:06 +00003936 // -faccess-control is default.
John McCall3155f572010-04-09 19:03:51 +00003937 if (Args.hasFlag(options::OPT_fno_access_control,
3938 options::OPT_faccess_control,
John McCalldfea9982010-04-09 19:12:06 +00003939 false))
John McCall3155f572010-04-09 19:03:51 +00003940 CmdArgs.push_back("-fno-access-control");
John McCall59bb1d42010-03-17 01:32:13 +00003941
Anders Carlssond470fef2010-11-21 00:09:52 +00003942 // -felide-constructors is the default.
3943 if (Args.hasFlag(options::OPT_fno_elide_constructors,
3944 options::OPT_felide_constructors,
3945 false))
3946 CmdArgs.push_back("-fno-elide-constructors");
3947
Filipe Cabecinhas28f353c2015-01-29 23:56:43 +00003948 // -frtti is default, except for the PS4 CPU.
3949 if (!Args.hasFlag(options::OPT_frtti, options::OPT_fno_rtti,
3950 !Triple.isPS4CPU()) ||
Richard Smith52be6192012-11-05 22:04:41 +00003951 KernelOrKext) {
Filipe Cabecinhas28f353c2015-01-29 23:56:43 +00003952 bool RTTIEnabled = false;
3953 Arg *NoRTTIArg = Args.getLastArg(
3954 options::OPT_mkernel, options::OPT_fapple_kext, options::OPT_fno_rtti);
3955
3956 // PS4 requires rtti when exceptions are enabled. If -fno-rtti was
3957 // explicitly passed, error out. Otherwise enable rtti and emit a
3958 // warning.
3959 if (Triple.isPS4CPU()) {
Filipe Cabecinhasc9c40252015-01-30 11:17:56 +00003960 if (Arg *A = Args.getLastArg(options::OPT_fcxx_exceptions)) {
Filipe Cabecinhas28f353c2015-01-29 23:56:43 +00003961 if (NoRTTIArg)
3962 D.Diag(diag::err_drv_argument_not_allowed_with)
3963 << NoRTTIArg->getAsString(Args) << A->getAsString(Args);
3964 else {
3965 RTTIEnabled = true;
3966 D.Diag(diag::warn_drv_enabling_rtti_with_exceptions);
3967 }
3968 }
3969 }
Mike Stump183c3d22009-07-31 23:15:31 +00003970
Richard Smith52be6192012-11-05 22:04:41 +00003971 // -fno-rtti cannot usefully be combined with -fsanitize=vptr.
Alexey Samsonov627b10f2012-11-06 15:09:03 +00003972 if (Sanitize.sanitizesVptr()) {
Filipe Cabecinhas28f353c2015-01-29 23:56:43 +00003973 // If rtti was explicitly disabled and the vptr sanitizer is on, error
3974 // out. Otherwise, warn that vptr will be disabled unless -frtti is
3975 // passed.
3976 if (NoRTTIArg) {
3977 D.Diag(diag::err_drv_argument_not_allowed_with)
3978 << "-fsanitize=vptr" << NoRTTIArg->getAsString(Args);
3979 } else {
3980 D.Diag(diag::warn_drv_disabling_vptr_no_rtti_default);
3981 // All sanitizer switches have been pushed. This -fno-sanitize
3982 // will override any -fsanitize={vptr,undefined} passed before it.
3983 CmdArgs.push_back("-fno-sanitize=vptr");
3984 }
Richard Smith52be6192012-11-05 22:04:41 +00003985 }
Filipe Cabecinhas28f353c2015-01-29 23:56:43 +00003986
3987 if (!RTTIEnabled)
3988 CmdArgs.push_back("-fno-rtti");
Richard Smith52be6192012-11-05 22:04:41 +00003989 }
3990
Tony Linthicum76329bf2011-12-12 21:14:55 +00003991 // -fshort-enums=0 is default for all architectures except Hexagon.
Argyrios Kyrtzidis74825bc2010-10-08 00:25:19 +00003992 if (Args.hasFlag(options::OPT_fshort_enums,
Tony Linthicum76329bf2011-12-12 21:14:55 +00003993 options::OPT_fno_short_enums,
Eli Benderskyd4a6aec2013-07-24 22:20:49 +00003994 getToolChain().getArch() ==
Tony Linthicum76329bf2011-12-12 21:14:55 +00003995 llvm::Triple::hexagon))
Argyrios Kyrtzidis74825bc2010-10-08 00:25:19 +00003996 CmdArgs.push_back("-fshort-enums");
3997
Daniel Dunbard609b7b2009-11-17 06:37:03 +00003998 // -fsigned-char is default.
Daniel Dunbar5bdd2992009-11-25 10:14:30 +00003999 if (!Args.hasFlag(options::OPT_fsigned_char, options::OPT_funsigned_char,
Daniel Dunbard609b7b2009-11-17 06:37:03 +00004000 isSignedCharDefault(getToolChain().getTriple())))
Daniel Dunbar5fe08662009-11-29 02:39:08 +00004001 CmdArgs.push_back("-fno-signed-char");
Eli Friedman327f0b52009-06-05 07:21:14 +00004002
Anders Carlssonfcd764a2010-02-06 23:23:06 +00004003 // -fthreadsafe-static is default.
Michael J. Spencer4c0ffa82010-10-21 03:16:25 +00004004 if (!Args.hasFlag(options::OPT_fthreadsafe_statics,
Anders Carlssonfcd764a2010-02-06 23:23:06 +00004005 options::OPT_fno_threadsafe_statics))
4006 CmdArgs.push_back("-fno-threadsafe-statics");
4007
Daniel Dunbarfe06df42010-03-20 04:15:41 +00004008 // -fuse-cxa-atexit is default.
Saleem Abdulrasool377066a2014-03-27 22:50:18 +00004009 if (!Args.hasFlag(options::OPT_fuse_cxa_atexit,
4010 options::OPT_fno_use_cxa_atexit,
4011 !IsWindowsCygnus && !IsWindowsGNU &&
4012 getToolChain().getArch() != llvm::Triple::hexagon &&
4013 getToolChain().getArch() != llvm::Triple::xcore) ||
Chad Rosier4fab82c2012-03-26 22:04:46 +00004014 KernelOrKext)
Daniel Dunbarfe06df42010-03-20 04:15:41 +00004015 CmdArgs.push_back("-fno-use-cxa-atexit");
4016
Daniel Dunbar0730e4f2009-11-17 07:06:20 +00004017 // -fms-extensions=0 is default.
Daniel Dunbar5bdd2992009-11-25 10:14:30 +00004018 if (Args.hasFlag(options::OPT_fms_extensions, options::OPT_fno_ms_extensions,
Saleem Abdulrasool377066a2014-03-27 22:50:18 +00004019 IsWindowsMSVC))
Daniel Dunbar0730e4f2009-11-17 07:06:20 +00004020 CmdArgs.push_back("-fms-extensions");
4021
Francois Pichet1b4f1632011-09-17 04:32:15 +00004022 // -fms-compatibility=0 is default.
Douglas Gregor2b4907e2011-10-24 15:49:38 +00004023 if (Args.hasFlag(options::OPT_fms_compatibility,
4024 options::OPT_fno_ms_compatibility,
Saleem Abdulrasool377066a2014-03-27 22:50:18 +00004025 (IsWindowsMSVC && Args.hasFlag(options::OPT_fms_extensions,
4026 options::OPT_fno_ms_extensions,
4027 true))))
Francois Pichet1b4f1632011-09-17 04:32:15 +00004028 CmdArgs.push_back("-fms-compatibility");
4029
Saleem Abdulrasoolc68237b2014-07-16 03:13:50 +00004030 // -fms-compatibility-version=17.00 is default.
Michael J. Spencer4992ca4b2010-10-21 05:21:48 +00004031 if (Args.hasFlag(options::OPT_fms_extensions, options::OPT_fno_ms_extensions,
Saleem Abdulrasoolc68237b2014-07-16 03:13:50 +00004032 IsWindowsMSVC) || Args.hasArg(options::OPT_fmsc_version) ||
4033 Args.hasArg(options::OPT_fms_compatibility_version)) {
4034 const Arg *MSCVersion = Args.getLastArg(options::OPT_fmsc_version);
4035 const Arg *MSCompatibilityVersion =
4036 Args.getLastArg(options::OPT_fms_compatibility_version);
Michael J. Spencer4992ca4b2010-10-21 05:21:48 +00004037
Saleem Abdulrasoolc68237b2014-07-16 03:13:50 +00004038 if (MSCVersion && MSCompatibilityVersion)
4039 D.Diag(diag::err_drv_argument_not_allowed_with)
4040 << MSCVersion->getAsString(Args)
4041 << MSCompatibilityVersion->getAsString(Args);
4042
4043 std::string Ver;
4044 if (MSCompatibilityVersion)
4045 Ver = Args.getLastArgValue(options::OPT_fms_compatibility_version);
4046 else if (MSCVersion)
4047 Ver = getMSCompatibilityVersion(MSCVersion->getValue());
4048
4049 if (Ver.empty())
4050 CmdArgs.push_back("-fms-compatibility-version=17.00");
4051 else
4052 CmdArgs.push_back(Args.MakeArgString("-fms-compatibility-version=" + Ver));
4053 }
Michael J. Spencer4992ca4b2010-10-21 05:21:48 +00004054
Eric Christopher5ecce122013-02-18 00:38:31 +00004055 // -fno-borland-extensions is default.
Dawn Perchik68bb1b42010-09-02 23:59:25 +00004056 if (Args.hasFlag(options::OPT_fborland_extensions,
4057 options::OPT_fno_borland_extensions, false))
4058 CmdArgs.push_back("-fborland-extensions");
4059
Francois Pichet02744872011-09-01 16:38:08 +00004060 // -fno-delayed-template-parsing is default, except for Windows where MSVC STL
4061 // needs it.
Francois Pichet1c229c02011-04-22 22:18:13 +00004062 if (Args.hasFlag(options::OPT_fdelayed_template_parsing,
Saleem Abdulrasool377066a2014-03-27 22:50:18 +00004063 options::OPT_fno_delayed_template_parsing, IsWindowsMSVC))
Francois Pichet35bc5de2011-08-26 00:22:34 +00004064 CmdArgs.push_back("-fdelayed-template-parsing");
Francois Pichet1c229c02011-04-22 22:18:13 +00004065
Chandler Carruthe03aa552010-04-17 20:17:31 +00004066 // -fgnu-keywords default varies depending on language; only pass if
4067 // specified.
4068 if (Arg *A = Args.getLastArg(options::OPT_fgnu_keywords,
Daniel Dunbardb059592010-04-24 17:56:39 +00004069 options::OPT_fno_gnu_keywords))
4070 A->render(Args, CmdArgs);
Chandler Carruthe03aa552010-04-17 20:17:31 +00004071
Rafael Espindola922a6242011-06-02 17:30:53 +00004072 if (Args.hasFlag(options::OPT_fgnu89_inline,
4073 options::OPT_fno_gnu89_inline,
4074 false))
Rafael Espindolafb2af642011-06-02 16:13:27 +00004075 CmdArgs.push_back("-fgnu89-inline");
4076
Chad Rosier9c76d242012-03-15 22:31:42 +00004077 if (Args.hasArg(options::OPT_fno_inline))
4078 CmdArgs.push_back("-fno-inline");
4079
Chad Rosier64d6be92012-03-06 21:17:19 +00004080 if (Args.hasArg(options::OPT_fno_inline_functions))
4081 CmdArgs.push_back("-fno-inline-functions");
Chad Rosier80603182012-03-06 18:49:20 +00004082
John McCall5fb5df92012-06-20 06:18:46 +00004083 ObjCRuntime objcRuntime = AddObjCRuntimeArgs(Args, CmdArgs, rewriteKind);
John McCall24fc0de2011-07-06 00:26:06 +00004084
John McCall5fb5df92012-06-20 06:18:46 +00004085 // -fobjc-dispatch-method is only relevant with the nonfragile-abi, and
Fariborz Jahanian15f60cb2014-01-20 19:32:33 +00004086 // legacy is the default. Except for deployment taget of 10.5,
4087 // next runtime is always legacy dispatch and -fno-objc-legacy-dispatch
4088 // gets ignored silently.
4089 if (objcRuntime.isNonFragile()) {
David Chisnall3154e682011-09-30 13:32:35 +00004090 if (!Args.hasFlag(options::OPT_fobjc_legacy_dispatch,
4091 options::OPT_fno_objc_legacy_dispatch,
David Chisnallda225352012-07-04 11:52:24 +00004092 objcRuntime.isLegacyDispatchDefaultForArch(
Eli Benderskyd4a6aec2013-07-24 22:20:49 +00004093 getToolChain().getArch()))) {
David Chisnall3154e682011-09-30 13:32:35 +00004094 if (getToolChain().UseObjCMixedDispatch())
4095 CmdArgs.push_back("-fobjc-dispatch-method=mixed");
4096 else
4097 CmdArgs.push_back("-fobjc-dispatch-method=non-legacy");
4098 }
4099 }
Rafael Espindolab44676c2013-11-12 04:33:56 +00004100
Fariborz Jahanianfd4ce192013-11-12 17:08:46 +00004101 // When ObjectiveC legacy runtime is in effect on MacOSX,
4102 // turn on the option to do Array/Dictionary subscripting
4103 // by default.
Fariborz Jahanianff6c97c2013-11-12 20:50:26 +00004104 if (getToolChain().getTriple().getArch() == llvm::Triple::x86 &&
4105 getToolChain().getTriple().isMacOSX() &&
4106 !getToolChain().getTriple().isMacOSXVersionLT(10, 7) &&
4107 objcRuntime.getKind() == ObjCRuntime::FragileMacOSX &&
Fariborz Jahanianfd4ce192013-11-12 17:08:46 +00004108 objcRuntime.isNeXTFamily())
4109 CmdArgs.push_back("-fobjc-subscripting-legacy-runtime");
4110
Fariborz Jahanian0e3043b2012-11-15 19:02:45 +00004111 // -fencode-extended-block-signature=1 is default.
4112 if (getToolChain().IsEncodeExtendedBlockSignatureDefault()) {
4113 CmdArgs.push_back("-fencode-extended-block-signature");
4114 }
4115
John McCall24fc0de2011-07-06 00:26:06 +00004116 // Allow -fno-objc-arr to trump -fobjc-arr/-fobjc-arc.
4117 // NOTE: This logic is duplicated in ToolChains.cpp.
4118 bool ARC = isObjCAutoRefCount(Args);
4119 if (ARC) {
John McCall3deb1ad2012-08-21 02:47:43 +00004120 getToolChain().CheckObjCARC();
Argyrios Kyrtzidis3dbeb552012-02-29 03:43:52 +00004121
John McCall24fc0de2011-07-06 00:26:06 +00004122 CmdArgs.push_back("-fobjc-arc");
4123
Chandler Carruth491db322011-11-04 07:34:47 +00004124 // FIXME: It seems like this entire block, and several around it should be
4125 // wrapped in isObjC, but for now we just use it here as this is where it
4126 // was being used previously.
4127 if (types::isCXX(InputType) && types::isObjC(InputType)) {
4128 if (getToolChain().GetCXXStdlibType(Args) == ToolChain::CST_Libcxx)
4129 CmdArgs.push_back("-fobjc-arc-cxxlib=libc++");
4130 else
4131 CmdArgs.push_back("-fobjc-arc-cxxlib=libstdc++");
4132 }
4133
John McCall24fc0de2011-07-06 00:26:06 +00004134 // Allow the user to enable full exceptions code emission.
4135 // We define off for Objective-CC, on for Objective-C++.
4136 if (Args.hasFlag(options::OPT_fobjc_arc_exceptions,
4137 options::OPT_fno_objc_arc_exceptions,
4138 /*default*/ types::isCXX(InputType)))
4139 CmdArgs.push_back("-fobjc-arc-exceptions");
4140 }
4141
4142 // -fobjc-infer-related-result-type is the default, except in the Objective-C
4143 // rewriter.
John McCall5fb5df92012-06-20 06:18:46 +00004144 if (rewriteKind != RK_None)
John McCall24fc0de2011-07-06 00:26:06 +00004145 CmdArgs.push_back("-fno-objc-infer-related-result-type");
Eric Christopher84fbdb42011-08-19 00:30:14 +00004146
John McCall24fc0de2011-07-06 00:26:06 +00004147 // Handle -fobjc-gc and -fobjc-gc-only. They are exclusive, and -fobjc-gc-only
4148 // takes precedence.
4149 const Arg *GCArg = Args.getLastArg(options::OPT_fobjc_gc_only);
4150 if (!GCArg)
4151 GCArg = Args.getLastArg(options::OPT_fobjc_gc);
4152 if (GCArg) {
4153 if (ARC) {
Chris Lattner0e62c1c2011-07-23 10:55:15 +00004154 D.Diag(diag::err_drv_objc_gc_arr)
John McCall24fc0de2011-07-06 00:26:06 +00004155 << GCArg->getAsString(Args);
4156 } else if (getToolChain().SupportsObjCGC()) {
4157 GCArg->render(Args, CmdArgs);
4158 } else {
4159 // FIXME: We should move this to a hard error.
Chris Lattner0e62c1c2011-07-23 10:55:15 +00004160 D.Diag(diag::warn_drv_objc_gc_unsupported)
John McCall24fc0de2011-07-06 00:26:06 +00004161 << GCArg->getAsString(Args);
4162 }
4163 }
4164
Reid Klecknerc542d372014-06-27 17:02:02 +00004165 // Handle GCC-style exception args.
4166 if (!C.getDriver().IsCLMode())
4167 addExceptionArgs(Args, InputType, getToolChain().getTriple(), KernelOrKext,
4168 objcRuntime, CmdArgs);
John McCallb5f652e2011-06-22 00:53:57 +00004169
4170 if (getToolChain().UseSjLjExceptions())
4171 CmdArgs.push_back("-fsjlj-exceptions");
4172
4173 // C++ "sane" operator new.
Daniel Dunbar2e3f2c82010-02-01 21:07:25 +00004174 if (!Args.hasFlag(options::OPT_fassume_sane_operator_new,
4175 options::OPT_fno_assume_sane_operator_new))
4176 CmdArgs.push_back("-fno-assume-sane-operator-new");
4177
Daniel Dunbar34d7a992010-04-27 15:34:57 +00004178 // -fconstant-cfstrings is default, and may be subject to argument translation
4179 // on Darwin.
4180 if (!Args.hasFlag(options::OPT_fconstant_cfstrings,
4181 options::OPT_fno_constant_cfstrings) ||
4182 !Args.hasFlag(options::OPT_mconstant_cfstrings,
4183 options::OPT_mno_constant_cfstrings))
4184 CmdArgs.push_back("-fno-constant-cfstrings");
4185
John Thompsoned4e2952009-11-05 20:14:16 +00004186 // -fshort-wchar default varies depending on platform; only
4187 // pass if specified.
Richard Bartonc9b5f352014-02-24 18:43:28 +00004188 if (Arg *A = Args.getLastArg(options::OPT_fshort_wchar,
4189 options::OPT_fno_short_wchar))
Daniel Dunbar2cb4e7a2010-04-27 15:35:03 +00004190 A->render(Args, CmdArgs);
John Thompsoned4e2952009-11-05 20:14:16 +00004191
Hans Wennborg28c96312013-07-31 23:39:13 +00004192 // -fno-pascal-strings is default, only pass non-default.
Daniel Dunbard067f7f2009-04-08 23:54:23 +00004193 if (Args.hasFlag(options::OPT_fpascal_strings,
Daniel Dunbard4510f22009-04-07 23:51:44 +00004194 options::OPT_fno_pascal_strings,
Daniel Dunbard4510f22009-04-07 23:51:44 +00004195 false))
Daniel Dunbard18049a2009-04-07 21:16:11 +00004196 CmdArgs.push_back("-fpascal-strings");
NAKAMURA Takumi029d74b2011-02-17 08:50:50 +00004197
Daniel Dunbar096ed292011-10-05 21:04:55 +00004198 // Honor -fpack-struct= and -fpack-struct, if given. Note that
4199 // -fno-pack-struct doesn't apply to -fpack-struct=.
4200 if (Arg *A = Args.getLastArg(options::OPT_fpack_struct_EQ)) {
James Molloycebf75e2012-05-02 07:56:14 +00004201 std::string PackStructStr = "-fpack-struct=";
Richard Smithbd55daf2012-11-01 04:30:05 +00004202 PackStructStr += A->getValue();
James Molloycebf75e2012-05-02 07:56:14 +00004203 CmdArgs.push_back(Args.MakeArgString(PackStructStr));
Daniel Dunbar096ed292011-10-05 21:04:55 +00004204 } else if (Args.hasFlag(options::OPT_fpack_struct,
4205 options::OPT_fno_pack_struct, false)) {
James Molloycebf75e2012-05-02 07:56:14 +00004206 CmdArgs.push_back("-fpack-struct=1");
Daniel Dunbar096ed292011-10-05 21:04:55 +00004207 }
4208
Fariborz Jahanianbcd82af2014-08-05 18:37:48 +00004209 // Handle -fmax-type-align=N and -fno-type-align
4210 bool SkipMaxTypeAlign = Args.hasArg(options::OPT_fno_max_type_align);
4211 if (Arg *A = Args.getLastArg(options::OPT_fmax_type_align_EQ)) {
4212 if (!SkipMaxTypeAlign) {
4213 std::string MaxTypeAlignStr = "-fmax-type-align=";
4214 MaxTypeAlignStr += A->getValue();
4215 CmdArgs.push_back(Args.MakeArgString(MaxTypeAlignStr));
4216 }
4217 } else if (getToolChain().getTriple().isOSDarwin()) {
4218 if (!SkipMaxTypeAlign) {
4219 std::string MaxTypeAlignStr = "-fmax-type-align=16";
4220 CmdArgs.push_back(Args.MakeArgString(MaxTypeAlignStr));
4221 }
4222 }
4223
Robert Lytton0e076492013-08-13 09:43:10 +00004224 if (KernelOrKext || isNoCommonDefault(getToolChain().getTriple())) {
Fariborz Jahaniana4cfff82011-01-07 01:05:02 +00004225 if (!Args.hasArg(options::OPT_fcommon))
4226 CmdArgs.push_back("-fno-common");
Chad Rosierd9d80e02012-03-26 21:35:40 +00004227 Args.ClaimAllArgs(options::OPT_fno_common);
Fariborz Jahaniana4cfff82011-01-07 01:05:02 +00004228 }
Daniel Dunbar096ed292011-10-05 21:04:55 +00004229
Daniel Dunbard18049a2009-04-07 21:16:11 +00004230 // -fcommon is default, only pass non-default.
Fariborz Jahaniana4cfff82011-01-07 01:05:02 +00004231 else if (!Args.hasFlag(options::OPT_fcommon, options::OPT_fno_common))
Daniel Dunbard18049a2009-04-07 21:16:11 +00004232 CmdArgs.push_back("-fno-common");
4233
Daniel Dunbar2edd9232009-04-15 02:37:43 +00004234 // -fsigned-bitfields is default, and clang doesn't yet support
Daniel Dunbar6358d682010-10-15 22:30:42 +00004235 // -funsigned-bitfields.
Mike Stump11289f42009-09-09 15:08:12 +00004236 if (!Args.hasFlag(options::OPT_fsigned_bitfields,
Daniel Dunbar2edd9232009-04-15 02:37:43 +00004237 options::OPT_funsigned_bitfields))
Chris Lattner0e62c1c2011-07-23 10:55:15 +00004238 D.Diag(diag::warn_drv_clang_unsupported)
Daniel Dunbar2edd9232009-04-15 02:37:43 +00004239 << Args.getLastArg(options::OPT_funsigned_bitfields)->getAsString(Args);
4240
Daniel Dunbar6358d682010-10-15 22:30:42 +00004241 // -fsigned-bitfields is default, and clang doesn't support -fno-for-scope.
4242 if (!Args.hasFlag(options::OPT_ffor_scope,
4243 options::OPT_fno_for_scope))
Chris Lattner0e62c1c2011-07-23 10:55:15 +00004244 D.Diag(diag::err_drv_clang_unsupported)
Daniel Dunbar6358d682010-10-15 22:30:42 +00004245 << Args.getLastArg(options::OPT_fno_for_scope)->getAsString(Args);
4246
Sylvestre Ledru91f380a2014-07-01 17:24:27 +00004247 // -finput_charset=UTF-8 is default. Reject others
4248 if (Arg *inputCharset = Args.getLastArg(
4249 options::OPT_finput_charset_EQ)) {
4250 StringRef value = inputCharset->getValue();
4251 if (value != "UTF-8")
4252 D.Diag(diag::err_drv_invalid_value) << inputCharset->getAsString(Args) << value;
4253 }
4254
Sylvestre Ledrub8198f0222014-08-11 18:09:03 +00004255 // -fexec_charset=UTF-8 is default. Reject others
4256 if (Arg *execCharset = Args.getLastArg(
4257 options::OPT_fexec_charset_EQ)) {
4258 StringRef value = execCharset->getValue();
4259 if (value != "UTF-8")
4260 D.Diag(diag::err_drv_invalid_value) << execCharset->getAsString(Args) << value;
4261 }
4262
Jeffrey Yasskin460aa542010-06-08 04:56:20 +00004263 // -fcaret-diagnostics is default.
4264 if (!Args.hasFlag(options::OPT_fcaret_diagnostics,
4265 options::OPT_fno_caret_diagnostics, true))
4266 CmdArgs.push_back("-fno-caret-diagnostics");
4267
Daniel Dunbar8281bde2009-04-19 21:09:34 +00004268 // -fdiagnostics-fixit-info is default, only pass non-default.
Mike Stump11289f42009-09-09 15:08:12 +00004269 if (!Args.hasFlag(options::OPT_fdiagnostics_fixit_info,
Daniel Dunbar8281bde2009-04-19 21:09:34 +00004270 options::OPT_fno_diagnostics_fixit_info))
4271 CmdArgs.push_back("-fno-diagnostics-fixit-info");
Eric Christopher84fbdb42011-08-19 00:30:14 +00004272
Daniel Dunbar092f0cc2009-04-16 06:32:38 +00004273 // Enable -fdiagnostics-show-option by default.
Mike Stump11289f42009-09-09 15:08:12 +00004274 if (Args.hasFlag(options::OPT_fdiagnostics_show_option,
Daniel Dunbar092f0cc2009-04-16 06:32:38 +00004275 options::OPT_fno_diagnostics_show_option))
4276 CmdArgs.push_back("-fdiagnostics-show-option");
Daniel Dunbar5ec95022009-11-04 06:24:57 +00004277
Chris Lattnerbf6fac82010-05-04 21:55:25 +00004278 if (const Arg *A =
4279 Args.getLastArg(options::OPT_fdiagnostics_show_category_EQ)) {
4280 CmdArgs.push_back("-fdiagnostics-show-category");
Richard Smithbd55daf2012-11-01 04:30:05 +00004281 CmdArgs.push_back(A->getValue());
Chris Lattnerbf6fac82010-05-04 21:55:25 +00004282 }
Daniel Dunbarfe6c97b2010-08-24 16:47:49 +00004283
Douglas Gregor643c9222011-05-21 17:07:29 +00004284 if (const Arg *A =
4285 Args.getLastArg(options::OPT_fdiagnostics_format_EQ)) {
4286 CmdArgs.push_back("-fdiagnostics-format");
Richard Smithbd55daf2012-11-01 04:30:05 +00004287 CmdArgs.push_back(A->getValue());
Douglas Gregor643c9222011-05-21 17:07:29 +00004288 }
4289
Chandler Carruthb6766f02011-03-27 01:50:55 +00004290 if (Arg *A = Args.getLastArg(
4291 options::OPT_fdiagnostics_show_note_include_stack,
4292 options::OPT_fno_diagnostics_show_note_include_stack)) {
4293 if (A->getOption().matches(
4294 options::OPT_fdiagnostics_show_note_include_stack))
4295 CmdArgs.push_back("-fdiagnostics-show-note-include-stack");
4296 else
4297 CmdArgs.push_back("-fno-diagnostics-show-note-include-stack");
4298 }
4299
Daniel Dunbar5ec95022009-11-04 06:24:57 +00004300 // Color diagnostics are the default, unless the terminal doesn't support
4301 // them.
Nico Weber7e2da792013-04-17 21:52:44 +00004302 // Support both clang's -f[no-]color-diagnostics and gcc's
4303 // -f[no-]diagnostics-colors[=never|always|auto].
4304 enum { Colors_On, Colors_Off, Colors_Auto } ShowColors = Colors_Auto;
Saleem Abdulrasool2456cea2014-06-12 02:08:04 +00004305 for (const auto &Arg : Args) {
4306 const Option &O = Arg->getOption();
Nico Weber7e2da792013-04-17 21:52:44 +00004307 if (!O.matches(options::OPT_fcolor_diagnostics) &&
4308 !O.matches(options::OPT_fdiagnostics_color) &&
4309 !O.matches(options::OPT_fno_color_diagnostics) &&
4310 !O.matches(options::OPT_fno_diagnostics_color) &&
4311 !O.matches(options::OPT_fdiagnostics_color_EQ))
4312 continue;
4313
Saleem Abdulrasool2456cea2014-06-12 02:08:04 +00004314 Arg->claim();
Nico Weber7e2da792013-04-17 21:52:44 +00004315 if (O.matches(options::OPT_fcolor_diagnostics) ||
4316 O.matches(options::OPT_fdiagnostics_color)) {
4317 ShowColors = Colors_On;
4318 } else if (O.matches(options::OPT_fno_color_diagnostics) ||
4319 O.matches(options::OPT_fno_diagnostics_color)) {
4320 ShowColors = Colors_Off;
4321 } else {
4322 assert(O.matches(options::OPT_fdiagnostics_color_EQ));
Saleem Abdulrasool2456cea2014-06-12 02:08:04 +00004323 StringRef value(Arg->getValue());
Nico Weber7e2da792013-04-17 21:52:44 +00004324 if (value == "always")
4325 ShowColors = Colors_On;
4326 else if (value == "never")
4327 ShowColors = Colors_Off;
4328 else if (value == "auto")
4329 ShowColors = Colors_Auto;
4330 else
4331 getToolChain().getDriver().Diag(diag::err_drv_clang_unsupported)
4332 << ("-fdiagnostics-color=" + value).str();
4333 }
4334 }
4335 if (ShowColors == Colors_On ||
4336 (ShowColors == Colors_Auto && llvm::sys::Process::StandardErrHasColors()))
Daniel Dunbar5ec95022009-11-04 06:24:57 +00004337 CmdArgs.push_back("-fcolor-diagnostics");
4338
Nico Rieck7857d462013-09-11 00:38:02 +00004339 if (Args.hasArg(options::OPT_fansi_escape_codes))
4340 CmdArgs.push_back("-fansi-escape-codes");
4341
Daniel Dunbardb097022009-06-08 21:13:54 +00004342 if (!Args.hasFlag(options::OPT_fshow_source_location,
4343 options::OPT_fno_show_source_location))
4344 CmdArgs.push_back("-fno-show-source-location");
Daniel Dunbar092f0cc2009-04-16 06:32:38 +00004345
Douglas Gregor643c9222011-05-21 17:07:29 +00004346 if (!Args.hasFlag(options::OPT_fshow_column,
4347 options::OPT_fno_show_column,
4348 true))
4349 CmdArgs.push_back("-fno-show-column");
4350
Douglas Gregor8ed0c0b2010-07-09 17:35:33 +00004351 if (!Args.hasFlag(options::OPT_fspell_checking,
4352 options::OPT_fno_spell_checking))
4353 CmdArgs.push_back("-fno-spell-checking");
Daniel Dunbarfe6c97b2010-08-24 16:47:49 +00004354
Daniel Dunbar473f8a62010-10-18 22:49:46 +00004355
Chad Rosierc8e56e82012-12-05 21:08:21 +00004356 // -fno-asm-blocks is default.
4357 if (Args.hasFlag(options::OPT_fasm_blocks, options::OPT_fno_asm_blocks,
4358 false))
4359 CmdArgs.push_back("-fasm-blocks");
Daniel Dunbar473f8a62010-10-18 22:49:46 +00004360
Steven Wucb0d13f2015-01-16 23:05:28 +00004361 // -fgnu-inline-asm is default.
4362 if (!Args.hasFlag(options::OPT_fgnu_inline_asm,
4363 options::OPT_fno_gnu_inline_asm, true))
4364 CmdArgs.push_back("-fno-gnu-inline-asm");
4365
Arnold Schwaighofer7f994ce2013-08-13 15:46:23 +00004366 // Enable vectorization per default according to the optimization level
4367 // selected. For optimization levels that want vectorization we use the alias
4368 // option to simplify the hasFlag logic.
Chad Rosier3ba81bd2014-05-02 18:41:57 +00004369 bool EnableVec = shouldEnableVectorizerAtOLevel(Args, false);
Arnold Schwaighofer7f994ce2013-08-13 15:46:23 +00004370 OptSpecifier VectorizeAliasOption = EnableVec ? options::OPT_O_Group :
Chad Rosier679b0752013-04-24 18:29:59 +00004371 options::OPT_fvectorize;
Chad Rosier679b0752013-04-24 18:29:59 +00004372 if (Args.hasFlag(options::OPT_fvectorize, VectorizeAliasOption,
Hal Finkel108c46a2013-08-28 05:21:45 +00004373 options::OPT_fno_vectorize, EnableVec))
Chad Rosier0d3ed6f2012-12-11 17:12:28 +00004374 CmdArgs.push_back("-vectorize-loops");
Chad Rosier0d3ed6f2012-12-11 17:12:28 +00004375
Chad Rosier136d67d2014-04-28 19:30:57 +00004376 // -fslp-vectorize is enabled based on the optimization level selected.
Chad Rosier3ba81bd2014-05-02 18:41:57 +00004377 bool EnableSLPVec = shouldEnableVectorizerAtOLevel(Args, true);
4378 OptSpecifier SLPVectAliasOption = EnableSLPVec ? options::OPT_O_Group :
Chad Rosier136d67d2014-04-28 19:30:57 +00004379 options::OPT_fslp_vectorize;
4380 if (Args.hasFlag(options::OPT_fslp_vectorize, SLPVectAliasOption,
Chad Rosier3ba81bd2014-05-02 18:41:57 +00004381 options::OPT_fno_slp_vectorize, EnableSLPVec))
Nadav Rotem0a2604d2013-04-15 04:57:18 +00004382 CmdArgs.push_back("-vectorize-slp");
Hal Finkel061f1652012-12-11 19:59:32 +00004383
Nadav Rotem6a0dd6b2013-04-15 05:38:41 +00004384 // -fno-slp-vectorize-aggressive is default.
4385 if (Args.hasFlag(options::OPT_fslp_vectorize_aggressive,
Nick Lewyckyd3f3e4f2013-06-25 01:49:44 +00004386 options::OPT_fno_slp_vectorize_aggressive, false))
Nadav Rotem6a0dd6b2013-04-15 05:38:41 +00004387 CmdArgs.push_back("-vectorize-slp-aggressive");
Nadav Rotem6a0dd6b2013-04-15 05:38:41 +00004388
Jeffrey Yasskin2b99c6f2010-06-11 05:57:47 +00004389 if (Arg *A = Args.getLastArg(options::OPT_fshow_overloads_EQ))
4390 A->render(Args, CmdArgs);
4391
Daniel Dunbarf5e9b1f2009-04-19 21:20:32 +00004392 // -fdollars-in-identifiers default varies depending on platform and
4393 // language; only pass if specified.
Mike Stump11289f42009-09-09 15:08:12 +00004394 if (Arg *A = Args.getLastArg(options::OPT_fdollars_in_identifiers,
Daniel Dunbarf5e9b1f2009-04-19 21:20:32 +00004395 options::OPT_fno_dollars_in_identifiers)) {
4396 if (A->getOption().matches(options::OPT_fdollars_in_identifiers))
Daniel Dunbar15cef0e2009-12-16 20:10:18 +00004397 CmdArgs.push_back("-fdollars-in-identifiers");
Daniel Dunbarf5e9b1f2009-04-19 21:20:32 +00004398 else
Daniel Dunbar15cef0e2009-12-16 20:10:18 +00004399 CmdArgs.push_back("-fno-dollars-in-identifiers");
Daniel Dunbarf5e9b1f2009-04-19 21:20:32 +00004400 }
4401
Daniel Dunbaradeeb052009-05-22 19:02:20 +00004402 // -funit-at-a-time is default, and we don't support -fno-unit-at-a-time for
4403 // practical purposes.
Mike Stump11289f42009-09-09 15:08:12 +00004404 if (Arg *A = Args.getLastArg(options::OPT_funit_at_a_time,
Daniel Dunbaradeeb052009-05-22 19:02:20 +00004405 options::OPT_fno_unit_at_a_time)) {
4406 if (A->getOption().matches(options::OPT_fno_unit_at_a_time))
Chris Lattner0e62c1c2011-07-23 10:55:15 +00004407 D.Diag(diag::warn_drv_clang_unsupported) << A->getAsString(Args);
Daniel Dunbaradeeb052009-05-22 19:02:20 +00004408 }
Eli Friedmanbb0d9a52009-07-14 21:58:17 +00004409
Eli Friedman055c9702011-11-02 01:53:16 +00004410 if (Args.hasFlag(options::OPT_fapple_pragma_pack,
4411 options::OPT_fno_apple_pragma_pack, false))
4412 CmdArgs.push_back("-fapple-pragma-pack");
4413
Eli Benderskyc95cfe82013-07-24 18:20:14 +00004414 // le32-specific flags:
4415 // -fno-math-builtin: clang should not convert math builtins to intrinsics
4416 // by default.
4417 if (getToolChain().getArch() == llvm::Triple::le32) {
4418 CmdArgs.push_back("-fno-math-builtin");
4419 }
4420
Daniel Dunbar2ffe0292009-09-10 03:37:02 +00004421 // Default to -fno-builtin-str{cat,cpy} on Darwin for ARM.
Daniel Dunbar4fa08112009-09-10 04:57:27 +00004422 //
Daniel Dunbar6c536aa2009-12-11 23:00:49 +00004423 // FIXME: This is disabled until clang -cc1 supports -fno-builtin-foo. PR4941.
Daniel Dunbar4fa08112009-09-10 04:57:27 +00004424#if 0
Bob Wilson6524dd32011-10-14 05:03:44 +00004425 if (getToolChain().getTriple().isOSDarwin() &&
Eli Benderskyd4a6aec2013-07-24 22:20:49 +00004426 (getToolChain().getArch() == llvm::Triple::arm ||
4427 getToolChain().getArch() == llvm::Triple::thumb)) {
Daniel Dunbar2ffe0292009-09-10 03:37:02 +00004428 if (!Args.hasArg(options::OPT_fbuiltin_strcat))
4429 CmdArgs.push_back("-fno-builtin-strcat");
4430 if (!Args.hasArg(options::OPT_fbuiltin_strcpy))
4431 CmdArgs.push_back("-fno-builtin-strcpy");
4432 }
Daniel Dunbar4fa08112009-09-10 04:57:27 +00004433#endif
Daniel Dunbar2ffe0292009-09-10 03:37:02 +00004434
Justin Bognera88f0122014-06-20 22:59:50 +00004435 // Enable rewrite includes if the user's asked for it or if we're generating
4436 // diagnostics.
4437 // TODO: Once -module-dependency-dir works with -frewrite-includes it'd be
4438 // nice to enable this when doing a crashdump for modules as well.
Justin Bogner332a5e52014-06-20 22:16:00 +00004439 if (Args.hasFlag(options::OPT_frewrite_includes,
4440 options::OPT_fno_rewrite_includes, false) ||
Justin Bognera88f0122014-06-20 22:59:50 +00004441 (C.isForDiagnostics() && !HaveModules))
Justin Bogner332a5e52014-06-20 22:16:00 +00004442 CmdArgs.push_back("-frewrite-includes");
4443
Daniel Dunbar8c3d7352011-03-18 21:23:40 +00004444 // Only allow -traditional or -traditional-cpp outside in preprocessing modes.
Mike Stump11289f42009-09-09 15:08:12 +00004445 if (Arg *A = Args.getLastArg(options::OPT_traditional,
Daniel Dunbar8c3d7352011-03-18 21:23:40 +00004446 options::OPT_traditional_cpp)) {
4447 if (isa<PreprocessJobAction>(JA))
4448 CmdArgs.push_back("-traditional-cpp");
Eric Christopher84fbdb42011-08-19 00:30:14 +00004449 else
Chris Lattner0e62c1c2011-07-23 10:55:15 +00004450 D.Diag(diag::err_drv_clang_unsupported) << A->getAsString(Args);
Daniel Dunbar8c3d7352011-03-18 21:23:40 +00004451 }
Eli Friedmanbb0d9a52009-07-14 21:58:17 +00004452
Daniel Dunbara2aedc62009-03-18 10:01:51 +00004453 Args.AddLastArg(CmdArgs, options::OPT_dM);
Chris Lattnercac63f32009-04-12 01:56:53 +00004454 Args.AddLastArg(CmdArgs, options::OPT_dD);
Ted Kremeneke73d9ed2011-11-11 00:07:43 +00004455
4456 // Handle serialized diagnostics.
4457 if (Arg *A = Args.getLastArg(options::OPT__serialize_diags)) {
4458 CmdArgs.push_back("-serialize-diagnostic-file");
Richard Smithbd55daf2012-11-01 04:30:05 +00004459 CmdArgs.push_back(Args.MakeArgString(A->getValue()));
Ted Kremeneke73d9ed2011-11-11 00:07:43 +00004460 }
Daniel Dunbara2aedc62009-03-18 10:01:51 +00004461
Ted Kremenekb47e6bc2012-09-13 06:41:18 +00004462 if (Args.hasArg(options::OPT_fretain_comments_from_system_headers))
4463 CmdArgs.push_back("-fretain-comments-from-system-headers");
4464
Dmitri Gribenkoacf2e782013-02-22 14:21:27 +00004465 // Forward -fcomment-block-commands to -cc1.
4466 Args.AddAllArgs(CmdArgs, options::OPT_fcomment_block_commands);
Dmitri Gribenkoa7d16ce2013-04-10 15:35:17 +00004467 // Forward -fparse-all-comments to -cc1.
4468 Args.AddAllArgs(CmdArgs, options::OPT_fparse_all_comments);
Dmitri Gribenkoacf2e782013-02-22 14:21:27 +00004469
Daniel Dunbar76fa8402010-04-15 06:09:03 +00004470 // Forward -Xclang arguments to -cc1, and -mllvm arguments to the LLVM option
4471 // parser.
Daniel Dunbara2aedc62009-03-18 10:01:51 +00004472 Args.AddAllArgValues(CmdArgs, options::OPT_Xclang);
Bob Wilson23a55f12014-12-21 07:00:00 +00004473 bool OptDisabled = false;
Daniel Dunbar76fa8402010-04-15 06:09:03 +00004474 for (arg_iterator it = Args.filtered_begin(options::OPT_mllvm),
4475 ie = Args.filtered_end(); it != ie; ++it) {
Daniel Dunbara442fd52010-06-11 22:00:13 +00004476 (*it)->claim();
Daniel Dunbar88534f42010-04-17 06:10:00 +00004477
Daniel Dunbar76fa8402010-04-15 06:09:03 +00004478 // We translate this by hand to the -cc1 argument, since nightly test uses
4479 // it and developers have been trained to spell it with -mllvm.
Bob Wilson23a55f12014-12-21 07:00:00 +00004480 if (StringRef((*it)->getValue(0)) == "-disable-llvm-optzns") {
Daniel Dunbar76fa8402010-04-15 06:09:03 +00004481 CmdArgs.push_back("-disable-llvm-optzns");
Bob Wilson23a55f12014-12-21 07:00:00 +00004482 OptDisabled = true;
4483 } else
Daniel Dunbara442fd52010-06-11 22:00:13 +00004484 (*it)->render(Args, CmdArgs);
Daniel Dunbar76fa8402010-04-15 06:09:03 +00004485 }
Daniel Dunbara2aedc62009-03-18 10:01:51 +00004486
Bob Wilson23a55f12014-12-21 07:00:00 +00004487 // With -save-temps, we want to save the unoptimized bitcode output from the
4488 // CompileJobAction, so disable optimizations if they are not already
4489 // disabled.
4490 if (Args.hasArg(options::OPT_save_temps) && !OptDisabled &&
4491 isa<CompileJobAction>(JA))
4492 CmdArgs.push_back("-disable-llvm-optzns");
4493
Daniel Dunbard67a3222009-03-30 06:36:42 +00004494 if (Output.getType() == types::TY_Dependencies) {
4495 // Handled with other dependency code.
Daniel Dunbar5cdf3e02009-03-19 07:29:38 +00004496 } else if (Output.isFilename()) {
Daniel Dunbara3246a02009-03-18 08:07:30 +00004497 CmdArgs.push_back("-o");
Daniel Dunbar5cdf3e02009-03-19 07:29:38 +00004498 CmdArgs.push_back(Output.getFilename());
4499 } else {
4500 assert(Output.isNothing() && "Invalid output.");
Daniel Dunbara3246a02009-03-18 08:07:30 +00004501 }
4502
Saleem Abdulrasool2456cea2014-06-12 02:08:04 +00004503 for (const auto &II : Inputs) {
Ben Langmuir2cb4a782014-02-05 22:21:15 +00004504 addDashXForInput(Args, II, CmdArgs);
4505
Daniel Dunbarb440f562010-08-02 02:38:21 +00004506 if (II.isFilename())
Daniel Dunbar5cdf3e02009-03-19 07:29:38 +00004507 CmdArgs.push_back(II.getFilename());
Daniel Dunbara2aedc62009-03-18 10:01:51 +00004508 else
Daniel Dunbar5cdf3e02009-03-19 07:29:38 +00004509 II.getInputArg().renderAsInput(Args, CmdArgs);
Daniel Dunbara2aedc62009-03-18 10:01:51 +00004510 }
Daniel Dunbard067f7f2009-04-08 23:54:23 +00004511
Chris Lattnere9d7d782009-11-03 19:50:27 +00004512 Args.AddAllArgs(CmdArgs, options::OPT_undef);
4513
Daniel Dunbarb31b76f2010-07-18 21:16:15 +00004514 const char *Exec = getToolChain().getDriver().getClangProgramPath();
Daniel Dunbar24c7f5e2009-12-18 02:43:17 +00004515
4516 // Optionally embed the -cc1 level arguments into the debug info, for build
4517 // analysis.
4518 if (getToolChain().UseDwarfDebugFlags()) {
Daniel Dunbar7f3d9502010-06-04 18:47:06 +00004519 ArgStringList OriginalArgs;
Saleem Abdulrasool2456cea2014-06-12 02:08:04 +00004520 for (const auto &Arg : Args)
4521 Arg->render(Args, OriginalArgs);
Daniel Dunbarfe6c97b2010-08-24 16:47:49 +00004522
Dylan Noblesmith2c1dd272012-02-05 02:13:05 +00004523 SmallString<256> Flags;
Daniel Dunbar24c7f5e2009-12-18 02:43:17 +00004524 Flags += Exec;
Daniel Dunbar7f3d9502010-06-04 18:47:06 +00004525 for (unsigned i = 0, e = OriginalArgs.size(); i != e; ++i) {
Bob Wilsond5aad2a2014-11-04 22:28:48 +00004526 SmallString<128> EscapedArg;
4527 EscapeSpacesAndBackslashes(OriginalArgs[i], EscapedArg);
Daniel Dunbar24c7f5e2009-12-18 02:43:17 +00004528 Flags += " ";
Bob Wilsond5aad2a2014-11-04 22:28:48 +00004529 Flags += EscapedArg;
Daniel Dunbar24c7f5e2009-12-18 02:43:17 +00004530 }
4531 CmdArgs.push_back("-dwarf-debug-flags");
4532 CmdArgs.push_back(Args.MakeArgString(Flags.str()));
4533 }
4534
Eric Christopherd3804002013-02-22 20:12:52 +00004535 // Add the split debug info name to the command lines here so we
4536 // can propagate it to the backend.
4537 bool SplitDwarf = Args.hasArg(options::OPT_gsplit_dwarf) &&
Cameron Esfahani556d91e2013-09-14 01:09:11 +00004538 getToolChain().getTriple().isOSLinux() &&
Bob Wilson23a55f12014-12-21 07:00:00 +00004539 (isa<AssembleJobAction>(JA) || isa<CompileJobAction>(JA) ||
4540 isa<BackendJobAction>(JA));
Eric Christopherd3804002013-02-22 20:12:52 +00004541 const char *SplitDwarfOut;
4542 if (SplitDwarf) {
4543 CmdArgs.push_back("-split-dwarf-file");
4544 SplitDwarfOut = SplitDebugName(Args, Inputs);
4545 CmdArgs.push_back(SplitDwarfOut);
4546 }
4547
4548 // Finally add the compile command to the compilation.
Hans Wennborg859422a2014-01-13 22:24:42 +00004549 if (Args.hasArg(options::OPT__SLASH_fallback) &&
Hans Wennborg26a44302014-04-25 16:44:17 +00004550 Output.getType() == types::TY_Object &&
4551 (InputType == types::TY_C || InputType == types::TY_CXX)) {
David Blaikiec11bf802014-09-04 16:04:28 +00004552 auto CLCommand =
4553 getCLFallback()->GetCommand(C, JA, Output, Inputs, Args, LinkingOutput);
4554 C.addCommand(llvm::make_unique<FallbackCommand>(JA, *this, Exec, CmdArgs,
4555 std::move(CLCommand)));
Hans Wennborg87cfa712013-09-19 20:32:16 +00004556 } else {
David Blaikiec11bf802014-09-04 16:04:28 +00004557 C.addCommand(llvm::make_unique<Command>(JA, *this, Exec, CmdArgs));
Hans Wennborg87cfa712013-09-19 20:32:16 +00004558 }
4559
Daniel Dunbar17731772009-03-23 19:03:36 +00004560
Eric Christopherf1545832013-02-22 23:50:16 +00004561 // Handle the debug info splitting at object creation time if we're
4562 // creating an object.
Eric Christopher248357f2013-02-21 22:35:01 +00004563 // TODO: Currently only works on linux with newer objcopy.
Bob Wilson23a55f12014-12-21 07:00:00 +00004564 if (SplitDwarf && !isa<CompileJobAction>(JA) && !isa<BackendJobAction>(JA))
Eric Christopherd3804002013-02-22 20:12:52 +00004565 SplitDebugInfo(getToolChain(), C, *this, JA, Args, Output, SplitDwarfOut);
Eric Christopher248357f2013-02-21 22:35:01 +00004566
Roman Divacky178e01602011-02-10 16:52:03 +00004567 if (Arg *A = Args.getLastArg(options::OPT_pg))
4568 if (Args.hasArg(options::OPT_fomit_frame_pointer))
Chris Lattner0e62c1c2011-07-23 10:55:15 +00004569 D.Diag(diag::err_drv_argument_not_allowed_with)
Roman Divacky178e01602011-02-10 16:52:03 +00004570 << "-fomit-frame-pointer" << A->getAsString(Args);
Michael J. Spencer4c0ffa82010-10-21 03:16:25 +00004571
Daniel Dunbarc2a71892009-04-03 20:51:31 +00004572 // Claim some arguments which clang supports automatically.
4573
Daniel Dunbar3e0cac62010-04-15 06:18:42 +00004574 // -fpch-preprocess is used with gcc to add a special marker in the output to
4575 // include the PCH file. Clang's PTH solution is completely transparent, so we
4576 // do not need to deal with it at all.
Daniel Dunbarc2a71892009-04-03 20:51:31 +00004577 Args.ClaimAllArgs(options::OPT_fpch_preprocess);
Daniel Dunbard067f7f2009-04-08 23:54:23 +00004578
Daniel Dunbar17731772009-03-23 19:03:36 +00004579 // Claim some arguments which clang doesn't support, but we don't
4580 // care to warn the user about.
Daniel Dunbar44b36ee2009-11-25 11:53:23 +00004581 Args.ClaimAllArgs(options::OPT_clang_ignored_f_Group);
4582 Args.ClaimAllArgs(options::OPT_clang_ignored_m_Group);
Rafael Espindola22f603032011-02-28 23:29:45 +00004583
Rafael Espindolab0092d72013-09-04 19:37:35 +00004584 // Disable warnings for clang -E -emit-llvm foo.c
Rafael Espindolad95a8122011-03-01 05:25:27 +00004585 Args.ClaimAllArgs(options::OPT_emit_llvm);
Daniel Dunbar1a093d22009-03-18 06:00:36 +00004586}
4587
John McCall5fb5df92012-06-20 06:18:46 +00004588/// Add options related to the Objective-C runtime/ABI.
4589///
4590/// Returns true if the runtime is non-fragile.
4591ObjCRuntime Clang::AddObjCRuntimeArgs(const ArgList &args,
4592 ArgStringList &cmdArgs,
4593 RewriteKind rewriteKind) const {
4594 // Look for the controlling runtime option.
4595 Arg *runtimeArg = args.getLastArg(options::OPT_fnext_runtime,
4596 options::OPT_fgnu_runtime,
4597 options::OPT_fobjc_runtime_EQ);
4598
4599 // Just forward -fobjc-runtime= to the frontend. This supercedes
4600 // options about fragility.
4601 if (runtimeArg &&
4602 runtimeArg->getOption().matches(options::OPT_fobjc_runtime_EQ)) {
4603 ObjCRuntime runtime;
Richard Smithbd55daf2012-11-01 04:30:05 +00004604 StringRef value = runtimeArg->getValue();
John McCall5fb5df92012-06-20 06:18:46 +00004605 if (runtime.tryParse(value)) {
4606 getToolChain().getDriver().Diag(diag::err_drv_unknown_objc_runtime)
4607 << value;
4608 }
4609
4610 runtimeArg->render(args, cmdArgs);
4611 return runtime;
4612 }
4613
4614 // Otherwise, we'll need the ABI "version". Version numbers are
4615 // slightly confusing for historical reasons:
4616 // 1 - Traditional "fragile" ABI
4617 // 2 - Non-fragile ABI, version 1
4618 // 3 - Non-fragile ABI, version 2
4619 unsigned objcABIVersion = 1;
4620 // If -fobjc-abi-version= is present, use that to set the version.
4621 if (Arg *abiArg = args.getLastArg(options::OPT_fobjc_abi_version_EQ)) {
Richard Smithbd55daf2012-11-01 04:30:05 +00004622 StringRef value = abiArg->getValue();
John McCall5fb5df92012-06-20 06:18:46 +00004623 if (value == "1")
4624 objcABIVersion = 1;
4625 else if (value == "2")
4626 objcABIVersion = 2;
4627 else if (value == "3")
4628 objcABIVersion = 3;
4629 else
4630 getToolChain().getDriver().Diag(diag::err_drv_clang_unsupported)
4631 << value;
4632 } else {
4633 // Otherwise, determine if we are using the non-fragile ABI.
4634 bool nonFragileABIIsDefault =
4635 (rewriteKind == RK_NonFragile ||
4636 (rewriteKind == RK_None &&
4637 getToolChain().IsObjCNonFragileABIDefault()));
4638 if (args.hasFlag(options::OPT_fobjc_nonfragile_abi,
4639 options::OPT_fno_objc_nonfragile_abi,
4640 nonFragileABIIsDefault)) {
4641 // Determine the non-fragile ABI version to use.
4642#ifdef DISABLE_DEFAULT_NONFRAGILEABI_TWO
4643 unsigned nonFragileABIVersion = 1;
4644#else
4645 unsigned nonFragileABIVersion = 2;
4646#endif
4647
4648 if (Arg *abiArg = args.getLastArg(
4649 options::OPT_fobjc_nonfragile_abi_version_EQ)) {
Richard Smithbd55daf2012-11-01 04:30:05 +00004650 StringRef value = abiArg->getValue();
John McCall5fb5df92012-06-20 06:18:46 +00004651 if (value == "1")
4652 nonFragileABIVersion = 1;
4653 else if (value == "2")
4654 nonFragileABIVersion = 2;
4655 else
4656 getToolChain().getDriver().Diag(diag::err_drv_clang_unsupported)
4657 << value;
4658 }
4659
4660 objcABIVersion = 1 + nonFragileABIVersion;
4661 } else {
4662 objcABIVersion = 1;
4663 }
4664 }
4665
4666 // We don't actually care about the ABI version other than whether
4667 // it's non-fragile.
4668 bool isNonFragile = objcABIVersion != 1;
4669
4670 // If we have no runtime argument, ask the toolchain for its default runtime.
4671 // However, the rewriter only really supports the Mac runtime, so assume that.
4672 ObjCRuntime runtime;
4673 if (!runtimeArg) {
4674 switch (rewriteKind) {
4675 case RK_None:
4676 runtime = getToolChain().getDefaultObjCRuntime(isNonFragile);
4677 break;
4678 case RK_Fragile:
4679 runtime = ObjCRuntime(ObjCRuntime::FragileMacOSX, VersionTuple());
4680 break;
4681 case RK_NonFragile:
4682 runtime = ObjCRuntime(ObjCRuntime::MacOSX, VersionTuple());
4683 break;
4684 }
4685
4686 // -fnext-runtime
4687 } else if (runtimeArg->getOption().matches(options::OPT_fnext_runtime)) {
4688 // On Darwin, make this use the default behavior for the toolchain.
Jonathan Roelofs2cea1be2014-02-12 03:21:20 +00004689 if (getToolChain().getTriple().isOSDarwin()) {
John McCall5fb5df92012-06-20 06:18:46 +00004690 runtime = getToolChain().getDefaultObjCRuntime(isNonFragile);
4691
4692 // Otherwise, build for a generic macosx port.
4693 } else {
4694 runtime = ObjCRuntime(ObjCRuntime::MacOSX, VersionTuple());
4695 }
4696
4697 // -fgnu-runtime
4698 } else {
4699 assert(runtimeArg->getOption().matches(options::OPT_fgnu_runtime));
David Chisnall314896c2012-07-04 10:37:03 +00004700 // Legacy behaviour is to target the gnustep runtime if we are i
4701 // non-fragile mode or the GCC runtime in fragile mode.
4702 if (isNonFragile)
David Chisnalla5f59412012-10-16 15:11:55 +00004703 runtime = ObjCRuntime(ObjCRuntime::GNUstep, VersionTuple(1,6));
David Chisnall314896c2012-07-04 10:37:03 +00004704 else
4705 runtime = ObjCRuntime(ObjCRuntime::GCC, VersionTuple());
John McCall5fb5df92012-06-20 06:18:46 +00004706 }
4707
4708 cmdArgs.push_back(args.MakeArgString(
4709 "-fobjc-runtime=" + runtime.getAsString()));
4710 return runtime;
4711}
4712
Reid Klecknerc542d372014-06-27 17:02:02 +00004713static bool maybeConsumeDash(const std::string &EH, size_t &I) {
4714 bool HaveDash = (I + 1 < EH.size() && EH[I + 1] == '-');
4715 I += HaveDash;
4716 return !HaveDash;
Chandler Carruth095b6962014-06-29 22:42:51 +00004717}
Reid Klecknerc542d372014-06-27 17:02:02 +00004718
4719struct EHFlags {
4720 EHFlags() : Synch(false), Asynch(false), NoExceptC(false) {}
4721 bool Synch;
4722 bool Asynch;
4723 bool NoExceptC;
4724};
4725
4726/// /EH controls whether to run destructor cleanups when exceptions are
4727/// thrown. There are three modifiers:
4728/// - s: Cleanup after "synchronous" exceptions, aka C++ exceptions.
4729/// - a: Cleanup after "asynchronous" exceptions, aka structured exceptions.
4730/// The 'a' modifier is unimplemented and fundamentally hard in LLVM IR.
4731/// - c: Assume that extern "C" functions are implicitly noexcept. This
4732/// modifier is an optimization, so we ignore it for now.
4733/// The default is /EHs-c-, meaning cleanups are disabled.
4734static EHFlags parseClangCLEHFlags(const Driver &D, const ArgList &Args) {
4735 EHFlags EH;
4736 std::vector<std::string> EHArgs = Args.getAllArgValues(options::OPT__SLASH_EH);
4737 for (auto EHVal : EHArgs) {
4738 for (size_t I = 0, E = EHVal.size(); I != E; ++I) {
4739 switch (EHVal[I]) {
4740 case 'a': EH.Asynch = maybeConsumeDash(EHVal, I); continue;
4741 case 'c': EH.NoExceptC = maybeConsumeDash(EHVal, I); continue;
4742 case 's': EH.Synch = maybeConsumeDash(EHVal, I); continue;
4743 default: break;
4744 }
4745 D.Diag(clang::diag::err_drv_invalid_value) << "/EH" << EHVal;
4746 break;
4747 }
4748 }
4749 return EH;
4750}
4751
Hans Wennborg75958c42013-08-08 00:17:41 +00004752void Clang::AddClangCLArgs(const ArgList &Args, ArgStringList &CmdArgs) const {
4753 unsigned RTOptionID = options::OPT__SLASH_MT;
4754
Hans Wennborgf1a74252013-09-10 20:18:04 +00004755 if (Args.hasArg(options::OPT__SLASH_LDd))
4756 // The /LDd option implies /MTd. The dependent lib part can be overridden,
4757 // but defining _DEBUG is sticky.
4758 RTOptionID = options::OPT__SLASH_MTd;
4759
Hans Wennborg9cb7d9ba2013-09-18 22:26:39 +00004760 if (Arg *A = Args.getLastArg(options::OPT__SLASH_M_Group))
Hans Wennborg75958c42013-08-08 00:17:41 +00004761 RTOptionID = A->getOption().getID();
Hans Wennborgd9ad0682013-09-11 16:38:41 +00004762
Hans Wennborg75958c42013-08-08 00:17:41 +00004763 switch(RTOptionID) {
4764 case options::OPT__SLASH_MD:
Hans Wennborgf1a74252013-09-10 20:18:04 +00004765 if (Args.hasArg(options::OPT__SLASH_LDd))
4766 CmdArgs.push_back("-D_DEBUG");
Hans Wennborg75958c42013-08-08 00:17:41 +00004767 CmdArgs.push_back("-D_MT");
4768 CmdArgs.push_back("-D_DLL");
4769 CmdArgs.push_back("--dependent-lib=msvcrt");
4770 break;
4771 case options::OPT__SLASH_MDd:
4772 CmdArgs.push_back("-D_DEBUG");
4773 CmdArgs.push_back("-D_MT");
4774 CmdArgs.push_back("-D_DLL");
4775 CmdArgs.push_back("--dependent-lib=msvcrtd");
4776 break;
4777 case options::OPT__SLASH_MT:
Hans Wennborgf1a74252013-09-10 20:18:04 +00004778 if (Args.hasArg(options::OPT__SLASH_LDd))
4779 CmdArgs.push_back("-D_DEBUG");
Hans Wennborg75958c42013-08-08 00:17:41 +00004780 CmdArgs.push_back("-D_MT");
4781 CmdArgs.push_back("--dependent-lib=libcmt");
4782 break;
4783 case options::OPT__SLASH_MTd:
4784 CmdArgs.push_back("-D_DEBUG");
4785 CmdArgs.push_back("-D_MT");
4786 CmdArgs.push_back("--dependent-lib=libcmtd");
4787 break;
4788 default:
4789 llvm_unreachable("Unexpected option ID.");
4790 }
4791
Reid Kleckner6beca0e2013-08-08 19:33:10 +00004792 // This provides POSIX compatibility (maps 'open' to '_open'), which most
4793 // users want. The /Za flag to cl.exe turns this off, but it's not
4794 // implemented in clang.
4795 CmdArgs.push_back("--dependent-lib=oldnames");
Hans Wennborg614f7072013-08-08 19:54:30 +00004796
Hans Wennborg8858a032014-07-21 23:42:07 +00004797 // Both /showIncludes and /E (and /EP) write to stdout. Allowing both
4798 // would produce interleaved output, so ignore /showIncludes in such cases.
4799 if (!Args.hasArg(options::OPT_E) && !Args.hasArg(options::OPT__SLASH_EP))
4800 if (Arg *A = Args.getLastArg(options::OPT_show_includes))
4801 A->render(Args, CmdArgs);
Hans Wennborg81f74482013-09-10 01:07:07 +00004802
David Majnemerf6072342014-07-01 22:24:56 +00004803 // This controls whether or not we emit RTTI data for polymorphic types.
4804 if (Args.hasFlag(options::OPT__SLASH_GR_, options::OPT__SLASH_GR,
4805 /*default=*/false))
4806 CmdArgs.push_back("-fno-rtti-data");
Hans Wennborg7b0dcef2014-02-25 18:36:22 +00004807
Reid Klecknerc542d372014-06-27 17:02:02 +00004808 const Driver &D = getToolChain().getDriver();
4809 EHFlags EH = parseClangCLEHFlags(D, Args);
4810 // FIXME: Do something with NoExceptC.
Reid Klecknerab80f182015-01-30 01:04:16 +00004811 if (EH.Synch || EH.Asynch)
Reid Klecknerc542d372014-06-27 17:02:02 +00004812 CmdArgs.push_back("-fcxx-exceptions");
Reid Klecknerab80f182015-01-30 01:04:16 +00004813 // Always add -fexceptions to allow SEH __try.
4814 CmdArgs.push_back("-fexceptions");
Reid Klecknerc542d372014-06-27 17:02:02 +00004815
Hans Wennborge50cec32014-06-13 20:59:54 +00004816 // /EP should expand to -E -P.
4817 if (Args.hasArg(options::OPT__SLASH_EP)) {
4818 CmdArgs.push_back("-E");
4819 CmdArgs.push_back("-P");
4820 }
4821
David Majnemer86c318f2014-02-11 21:05:00 +00004822 Arg *MostGeneralArg = Args.getLastArg(options::OPT__SLASH_vmg);
4823 Arg *BestCaseArg = Args.getLastArg(options::OPT__SLASH_vmb);
4824 if (MostGeneralArg && BestCaseArg)
4825 D.Diag(clang::diag::err_drv_argument_not_allowed_with)
4826 << MostGeneralArg->getAsString(Args) << BestCaseArg->getAsString(Args);
4827
4828 if (MostGeneralArg) {
4829 Arg *SingleArg = Args.getLastArg(options::OPT__SLASH_vms);
4830 Arg *MultipleArg = Args.getLastArg(options::OPT__SLASH_vmm);
4831 Arg *VirtualArg = Args.getLastArg(options::OPT__SLASH_vmv);
4832
4833 Arg *FirstConflict = SingleArg ? SingleArg : MultipleArg;
4834 Arg *SecondConflict = VirtualArg ? VirtualArg : MultipleArg;
4835 if (FirstConflict && SecondConflict && FirstConflict != SecondConflict)
4836 D.Diag(clang::diag::err_drv_argument_not_allowed_with)
4837 << FirstConflict->getAsString(Args)
4838 << SecondConflict->getAsString(Args);
4839
4840 if (SingleArg)
4841 CmdArgs.push_back("-fms-memptr-rep=single");
4842 else if (MultipleArg)
4843 CmdArgs.push_back("-fms-memptr-rep=multiple");
4844 else
4845 CmdArgs.push_back("-fms-memptr-rep=virtual");
4846 }
4847
Reid Klecknerc0dca6d2014-02-12 23:50:26 +00004848 if (Arg *A = Args.getLastArg(options::OPT_vtordisp_mode_EQ))
4849 A->render(Args, CmdArgs);
4850
Hans Wennborg81f74482013-09-10 01:07:07 +00004851 if (!Args.hasArg(options::OPT_fdiagnostics_format_EQ)) {
4852 CmdArgs.push_back("-fdiagnostics-format");
Hans Wennborgf4aee182013-09-24 00:08:55 +00004853 if (Args.hasArg(options::OPT__SLASH_fallback))
4854 CmdArgs.push_back("msvc-fallback");
4855 else
4856 CmdArgs.push_back("msvc");
Hans Wennborg81f74482013-09-10 01:07:07 +00004857 }
Hans Wennborg75958c42013-08-08 00:17:41 +00004858}
4859
Hans Wennborg1da044a2014-06-26 19:59:02 +00004860visualstudio::Compile *Clang::getCLFallback() const {
4861 if (!CLFallback)
4862 CLFallback.reset(new visualstudio::Compile(getToolChain()));
4863 return CLFallback.get();
4864}
4865
Daniel Sanders7f933f42015-01-30 17:35:23 +00004866void ClangAs::AddMIPSTargetArgs(const ArgList &Args,
4867 ArgStringList &CmdArgs) const {
4868 StringRef CPUName;
4869 StringRef ABIName;
4870 const llvm::Triple &Triple = getToolChain().getTriple();
4871 mips::getMipsCPUAndABI(Args, Triple, CPUName, ABIName);
4872
4873 CmdArgs.push_back("-target-abi");
4874 CmdArgs.push_back(ABIName.data());
4875}
4876
Daniel Dunbar4f5e79c2010-05-20 21:30:13 +00004877void ClangAs::ConstructJob(Compilation &C, const JobAction &JA,
Daniel Dunbar4f5e79c2010-05-20 21:30:13 +00004878 const InputInfo &Output,
4879 const InputInfoList &Inputs,
4880 const ArgList &Args,
4881 const char *LinkingOutput) const {
Daniel Dunbar4f5e79c2010-05-20 21:30:13 +00004882 ArgStringList CmdArgs;
4883
4884 assert(Inputs.size() == 1 && "Unexpected number of inputs.");
4885 const InputInfo &Input = Inputs[0];
4886
Rafael Espindolacfaadda2010-11-17 22:13:25 +00004887 // Don't warn about "clang -w -c foo.s"
4888 Args.ClaimAllArgs(options::OPT_w);
Rafael Espindolad95a8122011-03-01 05:25:27 +00004889 // and "clang -emit-llvm -c foo.s"
4890 Args.ClaimAllArgs(options::OPT_emit_llvm);
Rafael Espindolacfaadda2010-11-17 22:13:25 +00004891
Rafael Espindola577637a2015-01-03 00:06:04 +00004892 claimNoWarnArgs(Args);
Rafael Espindola16042fc2015-01-02 23:23:52 +00004893
Daniel Dunbar4f5e79c2010-05-20 21:30:13 +00004894 // Invoke ourselves in -cc1as mode.
4895 //
4896 // FIXME: Implement custom jobs for internal actions.
4897 CmdArgs.push_back("-cc1as");
4898
4899 // Add the "effective" target triple.
4900 CmdArgs.push_back("-triple");
Chad Rosierd3a0f952011-09-20 20:44:06 +00004901 std::string TripleStr =
4902 getToolChain().ComputeEffectiveClangTriple(Args, Input.getType());
Daniel Dunbar4f5e79c2010-05-20 21:30:13 +00004903 CmdArgs.push_back(Args.MakeArgString(TripleStr));
4904
4905 // Set the output mode, we currently only expect to be used as a real
4906 // assembler.
4907 CmdArgs.push_back("-filetype");
4908 CmdArgs.push_back("obj");
4909
Eric Christopher45f2e712012-12-18 00:31:10 +00004910 // Set the main file name, so that debug info works even with
4911 // -save-temps or preprocessed assembly.
4912 CmdArgs.push_back("-main-file-name");
4913 CmdArgs.push_back(Clang::getBaseInputName(Args, Inputs));
4914
Rafael Espindola22ce34a2013-08-20 22:12:08 +00004915 // Add the target cpu
Rafael Espindola28e1f4b2013-08-21 16:39:20 +00004916 const llvm::Triple &Triple = getToolChain().getTriple();
4917 std::string CPU = getCPUName(Args, Triple);
Rafael Espindola22ce34a2013-08-20 22:12:08 +00004918 if (!CPU.empty()) {
4919 CmdArgs.push_back("-target-cpu");
4920 CmdArgs.push_back(Args.MakeArgString(CPU));
4921 }
4922
Rafael Espindola28e1f4b2013-08-21 16:39:20 +00004923 // Add the target features
4924 const Driver &D = getToolChain().getDriver();
Rafael Espindola9c6fb0f2013-11-23 14:36:40 +00004925 getTargetFeatures(D, Triple, Args, CmdArgs, true);
Jim Grosbach576452b2012-02-10 20:37:10 +00004926
Daniel Dunbar1d733e22011-03-17 17:37:29 +00004927 // Ignore explicit -force_cpusubtype_ALL option.
4928 (void) Args.hasArg(options::OPT_force__cpusubtype__ALL);
Daniel Dunbar4f5e79c2010-05-20 21:30:13 +00004929
Eric Christopherfc3ee562012-01-10 00:38:01 +00004930 // Determine the original source input.
4931 const Action *SourceAction = &JA;
4932 while (SourceAction->getKind() != Action::InputClass) {
4933 assert(!SourceAction->getInputs().empty() && "unexpected root action!");
4934 SourceAction = SourceAction->getInputs()[0];
4935 }
4936
Chandler Carruth4d5e1a92012-12-17 21:40:04 +00004937 // Forward -g and handle debug info related flags, assuming we are dealing
4938 // with an actual assembly file.
Eric Christopherfc3ee562012-01-10 00:38:01 +00004939 if (SourceAction->getType() == types::TY_Asm ||
4940 SourceAction->getType() == types::TY_PP_Asm) {
4941 Args.ClaimAllArgs(options::OPT_g_Group);
4942 if (Arg *A = Args.getLastArg(options::OPT_g_Group))
4943 if (!A->getOption().matches(options::OPT_g0))
4944 CmdArgs.push_back("-g");
Chandler Carruth4d5e1a92012-12-17 21:40:04 +00004945
Oliver Stannard9b2a7d42014-05-19 13:39:13 +00004946 if (Args.hasArg(options::OPT_gdwarf_2))
4947 CmdArgs.push_back("-gdwarf-2");
4948 if (Args.hasArg(options::OPT_gdwarf_3))
4949 CmdArgs.push_back("-gdwarf-3");
4950 if (Args.hasArg(options::OPT_gdwarf_4))
4951 CmdArgs.push_back("-gdwarf-4");
4952
Chandler Carruth4d5e1a92012-12-17 21:40:04 +00004953 // Add the -fdebug-compilation-dir flag if needed.
4954 addDebugCompDirArg(Args, CmdArgs);
Kevin Enderbyae2ec472013-01-17 21:38:06 +00004955
4956 // Set the AT_producer to the clang version when using the integrated
4957 // assembler on assembly source files.
4958 CmdArgs.push_back("-dwarf-debug-producer");
4959 CmdArgs.push_back(Args.MakeArgString(getClangFullVersion()));
Eric Christopherfc3ee562012-01-10 00:38:01 +00004960 }
Kevin Enderby292dc082011-12-22 19:31:58 +00004961
4962 // Optionally embed the -cc1as level arguments into the debug info, for build
4963 // analysis.
4964 if (getToolChain().UseDwarfDebugFlags()) {
4965 ArgStringList OriginalArgs;
Saleem Abdulrasool2456cea2014-06-12 02:08:04 +00004966 for (const auto &Arg : Args)
4967 Arg->render(Args, OriginalArgs);
Kevin Enderby292dc082011-12-22 19:31:58 +00004968
Dylan Noblesmith2c1dd272012-02-05 02:13:05 +00004969 SmallString<256> Flags;
Kevin Enderby292dc082011-12-22 19:31:58 +00004970 const char *Exec = getToolChain().getDriver().getClangProgramPath();
4971 Flags += Exec;
4972 for (unsigned i = 0, e = OriginalArgs.size(); i != e; ++i) {
Bob Wilsond5aad2a2014-11-04 22:28:48 +00004973 SmallString<128> EscapedArg;
4974 EscapeSpacesAndBackslashes(OriginalArgs[i], EscapedArg);
Kevin Enderby292dc082011-12-22 19:31:58 +00004975 Flags += " ";
Bob Wilsond5aad2a2014-11-04 22:28:48 +00004976 Flags += EscapedArg;
Kevin Enderby292dc082011-12-22 19:31:58 +00004977 }
4978 CmdArgs.push_back("-dwarf-debug-flags");
4979 CmdArgs.push_back(Args.MakeArgString(Flags.str()));
4980 }
Daniel Dunbar4f5e79c2010-05-20 21:30:13 +00004981
4982 // FIXME: Add -static support, once we have it.
4983
Daniel Sanders7f933f42015-01-30 17:35:23 +00004984 // Add target specific flags.
4985 switch(getToolChain().getArch()) {
4986 default:
4987 break;
4988
4989 case llvm::Triple::mips:
4990 case llvm::Triple::mipsel:
4991 case llvm::Triple::mips64:
4992 case llvm::Triple::mips64el:
4993 AddMIPSTargetArgs(Args, CmdArgs);
4994 break;
4995 }
4996
David Blaikie372d9502014-01-17 03:17:40 +00004997 // Consume all the warning flags. Usually this would be handled more
4998 // gracefully by -cc1 (warning about unknown warning flags, etc) but -cc1as
4999 // doesn't handle that so rather than warning about unused flags that are
5000 // actually used, we'll lie by omission instead.
5001 // FIXME: Stop lying and consume only the appropriate driver flags
5002 for (arg_iterator it = Args.filtered_begin(options::OPT_W_Group),
5003 ie = Args.filtered_end();
5004 it != ie; ++it)
5005 (*it)->claim();
5006
David Blaikie9260ed62013-07-25 21:19:01 +00005007 CollectArgsForIntegratedAssembler(C, Args, CmdArgs,
5008 getToolChain().getDriver());
5009
Daniel Dunbar252e8f92011-04-29 17:53:18 +00005010 Args.AddAllArgs(CmdArgs, options::OPT_mllvm);
Daniel Dunbar4f5e79c2010-05-20 21:30:13 +00005011
5012 assert(Output.isFilename() && "Unexpected lipo output.");
5013 CmdArgs.push_back("-o");
5014 CmdArgs.push_back(Output.getFilename());
5015
Daniel Dunbarb440f562010-08-02 02:38:21 +00005016 assert(Input.isFilename() && "Invalid input.");
5017 CmdArgs.push_back(Input.getFilename());
Daniel Dunbar4f5e79c2010-05-20 21:30:13 +00005018
Daniel Dunbarb31b76f2010-07-18 21:16:15 +00005019 const char *Exec = getToolChain().getDriver().getClangProgramPath();
David Blaikiec11bf802014-09-04 16:04:28 +00005020 C.addCommand(llvm::make_unique<Command>(JA, *this, Exec, CmdArgs));
Eric Christophera75018a2013-04-10 21:30:40 +00005021
5022 // Handle the debug info splitting at object creation time if we're
5023 // creating an object.
5024 // TODO: Currently only works on linux with newer objcopy.
5025 if (Args.hasArg(options::OPT_gsplit_dwarf) &&
Cameron Esfahani556d91e2013-09-14 01:09:11 +00005026 getToolChain().getTriple().isOSLinux())
Eric Christophera75018a2013-04-10 21:30:40 +00005027 SplitDebugInfo(getToolChain(), C, *this, JA, Args, Output,
5028 SplitDebugName(Args, Inputs));
Daniel Dunbar4f5e79c2010-05-20 21:30:13 +00005029}
5030
Reid Kleckner0290c9c2014-09-15 17:45:39 +00005031void GnuTool::anchor() {}
5032
Daniel Dunbara3246a02009-03-18 08:07:30 +00005033void gcc::Common::ConstructJob(Compilation &C, const JobAction &JA,
Daniel Dunbara3246a02009-03-18 08:07:30 +00005034 const InputInfo &Output,
5035 const InputInfoList &Inputs,
Daniel Dunbara2aedc62009-03-18 10:01:51 +00005036 const ArgList &Args,
Daniel Dunbara3246a02009-03-18 08:07:30 +00005037 const char *LinkingOutput) const {
Daniel Dunbar083edf72009-12-21 18:54:17 +00005038 const Driver &D = getToolChain().getDriver();
Daniel Dunbara3246a02009-03-18 08:07:30 +00005039 ArgStringList CmdArgs;
Daniel Dunbar1a093d22009-03-18 06:00:36 +00005040
Saleem Abdulrasool2456cea2014-06-12 02:08:04 +00005041 for (const auto &A : Args) {
Michael J. Spencer66e2b202012-10-19 22:37:06 +00005042 if (forwardToGCC(A->getOption())) {
Daniel Dunbar939c1212010-08-03 16:14:14 +00005043 // Don't forward any -g arguments to assembly steps.
5044 if (isa<AssembleJobAction>(JA) &&
5045 A->getOption().matches(options::OPT_g_Group))
5046 continue;
5047
NAKAMURA Takumi053704f2013-08-19 11:51:51 +00005048 // Don't forward any -W arguments to assembly and link steps.
5049 if ((isa<AssembleJobAction>(JA) || isa<LinkJobAction>(JA)) &&
5050 A->getOption().matches(options::OPT_W_Group))
5051 continue;
5052
Daniel Dunbar2da02722009-03-19 07:55:12 +00005053 // It is unfortunate that we have to claim here, as this means
5054 // we will basically never report anything interesting for
Daniel Dunbar5716d872009-05-02 21:41:52 +00005055 // platforms using a generic gcc, even if we are just using gcc
5056 // to get to the assembler.
Daniel Dunbar2da02722009-03-19 07:55:12 +00005057 A->claim();
Daniel Dunbara2aedc62009-03-18 10:01:51 +00005058 A->render(Args, CmdArgs);
Daniel Dunbar2da02722009-03-19 07:55:12 +00005059 }
Daniel Dunbara3246a02009-03-18 08:07:30 +00005060 }
Daniel Dunbard067f7f2009-04-08 23:54:23 +00005061
Daniel Dunbar4e295052010-01-25 22:35:08 +00005062 RenderExtraToolArgs(JA, CmdArgs);
Daniel Dunbara3246a02009-03-18 08:07:30 +00005063
5064 // If using a driver driver, force the arch.
Jonathan Roelofs2cea1be2014-02-12 03:21:20 +00005065 if (getToolChain().getTriple().isOSDarwin()) {
Daniel Dunbara3246a02009-03-18 08:07:30 +00005066 CmdArgs.push_back("-arch");
Rafael Espindolaed1233e2014-08-28 21:23:05 +00005067 CmdArgs.push_back(
5068 Args.MakeArgString(getToolChain().getDefaultUniversalArchName()));
Daniel Dunbara3246a02009-03-18 08:07:30 +00005069 }
5070
Daniel Dunbar5716d872009-05-02 21:41:52 +00005071 // Try to force gcc to match the tool chain we want, if we recognize
5072 // the arch.
Daniel Dunbar5bbebfe2009-05-22 02:21:04 +00005073 //
5074 // FIXME: The triple class should directly provide the information we want
5075 // here.
Rafael Espindolaed1233e2014-08-28 21:23:05 +00005076 llvm::Triple::ArchType Arch = getToolChain().getArch();
Rafael Espindola35ca7d92012-10-07 04:44:33 +00005077 if (Arch == llvm::Triple::x86 || Arch == llvm::Triple::ppc)
Daniel Dunbar5716d872009-05-02 21:41:52 +00005078 CmdArgs.push_back("-m32");
Bill Schmidt778d3872013-07-26 01:36:11 +00005079 else if (Arch == llvm::Triple::x86_64 || Arch == llvm::Triple::ppc64 ||
5080 Arch == llvm::Triple::ppc64le)
Daniel Dunbar5716d872009-05-02 21:41:52 +00005081 CmdArgs.push_back("-m64");
5082
Daniel Dunbarb440f562010-08-02 02:38:21 +00005083 if (Output.isFilename()) {
Daniel Dunbara3246a02009-03-18 08:07:30 +00005084 CmdArgs.push_back("-o");
Daniel Dunbar5cdf3e02009-03-19 07:29:38 +00005085 CmdArgs.push_back(Output.getFilename());
5086 } else {
5087 assert(Output.isNothing() && "Unexpected output");
Daniel Dunbara3246a02009-03-18 08:07:30 +00005088 CmdArgs.push_back("-fsyntax-only");
Daniel Dunbar5cdf3e02009-03-19 07:29:38 +00005089 }
Daniel Dunbara3246a02009-03-18 08:07:30 +00005090
Tony Linthicum76329bf2011-12-12 21:14:55 +00005091 Args.AddAllArgValues(CmdArgs, options::OPT_Wa_COMMA,
5092 options::OPT_Xassembler);
Daniel Dunbara3246a02009-03-18 08:07:30 +00005093
5094 // Only pass -x if gcc will understand it; otherwise hope gcc
5095 // understands the suffix correctly. The main use case this would go
5096 // wrong in is for linker inputs if they happened to have an odd
5097 // suffix; really the only way to get this to happen is a command
5098 // like '-x foobar a.c' which will treat a.c like a linker input.
5099 //
5100 // FIXME: For the linker case specifically, can we safely convert
5101 // inputs into '-Wl,' options?
Saleem Abdulrasool2456cea2014-06-12 02:08:04 +00005102 for (const auto &II : Inputs) {
Daniel Dunbar6cdf83c2009-09-01 16:57:46 +00005103 // Don't try to pass LLVM or AST inputs to a generic gcc.
Daniel Dunbar24e52992010-06-07 23:28:45 +00005104 if (II.getType() == types::TY_LLVM_IR || II.getType() == types::TY_LTO_IR ||
5105 II.getType() == types::TY_LLVM_BC || II.getType() == types::TY_LTO_BC)
Chris Lattner0e62c1c2011-07-23 10:55:15 +00005106 D.Diag(diag::err_drv_no_linker_llvm_support)
Daniel Dunbar1c28f1e2009-09-09 22:32:48 +00005107 << getToolChain().getTripleString();
Daniel Dunbar6cdf83c2009-09-01 16:57:46 +00005108 else if (II.getType() == types::TY_AST)
Chris Lattner0e62c1c2011-07-23 10:55:15 +00005109 D.Diag(diag::err_drv_no_ast_support)
Daniel Dunbar1c28f1e2009-09-09 22:32:48 +00005110 << getToolChain().getTripleString();
Douglas Gregorbf7fc9c2013-03-27 16:47:18 +00005111 else if (II.getType() == types::TY_ModuleFile)
5112 D.Diag(diag::err_drv_no_module_support)
5113 << getToolChain().getTripleString();
Daniel Dunbare3e263f2009-05-02 20:14:53 +00005114
Daniel Dunbara3246a02009-03-18 08:07:30 +00005115 if (types::canTypeBeUserSpecified(II.getType())) {
5116 CmdArgs.push_back("-x");
5117 CmdArgs.push_back(types::getTypeName(II.getType()));
5118 }
5119
Daniel Dunbarb440f562010-08-02 02:38:21 +00005120 if (II.isFilename())
Daniel Dunbar5cdf3e02009-03-19 07:29:38 +00005121 CmdArgs.push_back(II.getFilename());
Daniel Dunbarf2476752010-09-25 18:10:05 +00005122 else {
5123 const Arg &A = II.getInputArg();
5124
5125 // Reverse translate some rewritten options.
5126 if (A.getOption().matches(options::OPT_Z_reserved_lib_stdcxx)) {
5127 CmdArgs.push_back("-lstdc++");
5128 continue;
5129 }
5130
Daniel Dunbar5cdf3e02009-03-19 07:29:38 +00005131 // Don't render as input, we need gcc to do the translations.
Daniel Dunbarf2476752010-09-25 18:10:05 +00005132 A.render(Args, CmdArgs);
5133 }
Daniel Dunbara3246a02009-03-18 08:07:30 +00005134 }
5135
Dylan Noblesmith70e73a32011-04-09 13:31:59 +00005136 const std::string customGCCName = D.getCCCGenericGCCName();
5137 const char *GCCName;
5138 if (!customGCCName.empty())
5139 GCCName = customGCCName.c_str();
Hans Wennborg70850d82013-07-18 20:29:38 +00005140 else if (D.CCCIsCXX()) {
Dylan Noblesmith70e73a32011-04-09 13:31:59 +00005141 GCCName = "g++";
Dylan Noblesmith70e73a32011-04-09 13:31:59 +00005142 } else
5143 GCCName = "gcc";
5144
Daniel Dunbard067f7f2009-04-08 23:54:23 +00005145 const char *Exec =
Daniel Dunbar9c3ed5f2010-07-14 18:46:23 +00005146 Args.MakeArgString(getToolChain().GetProgramPath(GCCName));
David Blaikiec11bf802014-09-04 16:04:28 +00005147 C.addCommand(llvm::make_unique<Command>(JA, *this, Exec, CmdArgs));
Daniel Dunbar1a093d22009-03-18 06:00:36 +00005148}
5149
Daniel Dunbar4e295052010-01-25 22:35:08 +00005150void gcc::Preprocess::RenderExtraToolArgs(const JobAction &JA,
5151 ArgStringList &CmdArgs) const {
Daniel Dunbara3246a02009-03-18 08:07:30 +00005152 CmdArgs.push_back("-E");
Daniel Dunbar1a093d22009-03-18 06:00:36 +00005153}
5154
Daniel Dunbar4e295052010-01-25 22:35:08 +00005155void gcc::Compile::RenderExtraToolArgs(const JobAction &JA,
5156 ArgStringList &CmdArgs) const {
Daniel Dunbaraeea8ac2010-02-11 03:16:21 +00005157 const Driver &D = getToolChain().getDriver();
5158
Eric Christophercc7ff502015-01-29 00:56:17 +00005159 switch (JA.getType()) {
Daniel Dunbar4e295052010-01-25 22:35:08 +00005160 // If -flto, etc. are present then make sure not to force assembly output.
Eric Christophercc7ff502015-01-29 00:56:17 +00005161 case types::TY_LLVM_IR:
5162 case types::TY_LTO_IR:
5163 case types::TY_LLVM_BC:
5164 case types::TY_LTO_BC:
Daniel Dunbar4e295052010-01-25 22:35:08 +00005165 CmdArgs.push_back("-c");
Eric Christophercc7ff502015-01-29 00:56:17 +00005166 break;
5167 case types::TY_PP_Asm:
Daniel Dunbar4e295052010-01-25 22:35:08 +00005168 CmdArgs.push_back("-S");
Eric Christophercc7ff502015-01-29 00:56:17 +00005169 case types::TY_Nothing:
5170 CmdArgs.push_back("-fsyntax-only");
5171 break;
5172 default:
5173 D.Diag(diag::err_drv_invalid_gcc_output_type) << getTypeName(JA.getType());
Daniel Dunbaraeea8ac2010-02-11 03:16:21 +00005174 }
Daniel Dunbar1a093d22009-03-18 06:00:36 +00005175}
5176
Daniel Dunbar4e295052010-01-25 22:35:08 +00005177void gcc::Link::RenderExtraToolArgs(const JobAction &JA,
5178 ArgStringList &CmdArgs) const {
Daniel Dunbara3246a02009-03-18 08:07:30 +00005179 // The types are (hopefully) good enough.
5180}
5181
Tony Linthicum76329bf2011-12-12 21:14:55 +00005182// Hexagon tools start.
5183void hexagon::Assemble::RenderExtraToolArgs(const JobAction &JA,
5184 ArgStringList &CmdArgs) const {
5185
5186}
5187void hexagon::Assemble::ConstructJob(Compilation &C, const JobAction &JA,
5188 const InputInfo &Output,
5189 const InputInfoList &Inputs,
5190 const ArgList &Args,
5191 const char *LinkingOutput) const {
Rafael Espindola577637a2015-01-03 00:06:04 +00005192 claimNoWarnArgs(Args);
Tony Linthicum76329bf2011-12-12 21:14:55 +00005193
5194 const Driver &D = getToolChain().getDriver();
5195 ArgStringList CmdArgs;
5196
5197 std::string MarchString = "-march=";
Matthew Curtisf10a5952012-12-06 14:16:43 +00005198 MarchString += toolchains::Hexagon_TC::GetTargetCPU(Args);
Tony Linthicum76329bf2011-12-12 21:14:55 +00005199 CmdArgs.push_back(Args.MakeArgString(MarchString));
5200
5201 RenderExtraToolArgs(JA, CmdArgs);
5202
5203 if (Output.isFilename()) {
5204 CmdArgs.push_back("-o");
5205 CmdArgs.push_back(Output.getFilename());
5206 } else {
5207 assert(Output.isNothing() && "Unexpected output");
5208 CmdArgs.push_back("-fsyntax-only");
5209 }
5210
Matthew Curtise8f80a12012-12-06 17:49:03 +00005211 std::string SmallDataThreshold = GetHexagonSmallDataThresholdValue(Args);
5212 if (!SmallDataThreshold.empty())
5213 CmdArgs.push_back(
5214 Args.MakeArgString(std::string("-G") + SmallDataThreshold));
Tony Linthicum76329bf2011-12-12 21:14:55 +00005215
Matthew Curtise5df3812012-12-07 17:23:04 +00005216 Args.AddAllArgValues(CmdArgs, options::OPT_Wa_COMMA,
5217 options::OPT_Xassembler);
5218
Tony Linthicum76329bf2011-12-12 21:14:55 +00005219 // Only pass -x if gcc will understand it; otherwise hope gcc
5220 // understands the suffix correctly. The main use case this would go
5221 // wrong in is for linker inputs if they happened to have an odd
5222 // suffix; really the only way to get this to happen is a command
5223 // like '-x foobar a.c' which will treat a.c like a linker input.
5224 //
5225 // FIXME: For the linker case specifically, can we safely convert
5226 // inputs into '-Wl,' options?
Saleem Abdulrasool2456cea2014-06-12 02:08:04 +00005227 for (const auto &II : Inputs) {
Tony Linthicum76329bf2011-12-12 21:14:55 +00005228 // Don't try to pass LLVM or AST inputs to a generic gcc.
5229 if (II.getType() == types::TY_LLVM_IR || II.getType() == types::TY_LTO_IR ||
5230 II.getType() == types::TY_LLVM_BC || II.getType() == types::TY_LTO_BC)
5231 D.Diag(clang::diag::err_drv_no_linker_llvm_support)
5232 << getToolChain().getTripleString();
5233 else if (II.getType() == types::TY_AST)
5234 D.Diag(clang::diag::err_drv_no_ast_support)
5235 << getToolChain().getTripleString();
Douglas Gregorbf7fc9c2013-03-27 16:47:18 +00005236 else if (II.getType() == types::TY_ModuleFile)
5237 D.Diag(diag::err_drv_no_module_support)
5238 << getToolChain().getTripleString();
Tony Linthicum76329bf2011-12-12 21:14:55 +00005239
5240 if (II.isFilename())
5241 CmdArgs.push_back(II.getFilename());
5242 else
5243 // Don't render as input, we need gcc to do the translations. FIXME: Pranav: What is this ?
5244 II.getInputArg().render(Args, CmdArgs);
5245 }
5246
5247 const char *GCCName = "hexagon-as";
Saleem Abdulrasool2456cea2014-06-12 02:08:04 +00005248 const char *Exec = Args.MakeArgString(getToolChain().GetProgramPath(GCCName));
David Blaikiec11bf802014-09-04 16:04:28 +00005249 C.addCommand(llvm::make_unique<Command>(JA, *this, Exec, CmdArgs));
Tony Linthicum76329bf2011-12-12 21:14:55 +00005250}
Saleem Abdulrasool2456cea2014-06-12 02:08:04 +00005251
Tony Linthicum76329bf2011-12-12 21:14:55 +00005252void hexagon::Link::RenderExtraToolArgs(const JobAction &JA,
5253 ArgStringList &CmdArgs) const {
5254 // The types are (hopefully) good enough.
5255}
5256
5257void hexagon::Link::ConstructJob(Compilation &C, const JobAction &JA,
5258 const InputInfo &Output,
5259 const InputInfoList &Inputs,
5260 const ArgList &Args,
5261 const char *LinkingOutput) const {
5262
Matthew Curtise689b052012-12-06 15:46:07 +00005263 const toolchains::Hexagon_TC& ToolChain =
5264 static_cast<const toolchains::Hexagon_TC&>(getToolChain());
5265 const Driver &D = ToolChain.getDriver();
5266
Tony Linthicum76329bf2011-12-12 21:14:55 +00005267 ArgStringList CmdArgs;
5268
Matthew Curtise689b052012-12-06 15:46:07 +00005269 //----------------------------------------------------------------------------
5270 //
5271 //----------------------------------------------------------------------------
5272 bool hasStaticArg = Args.hasArg(options::OPT_static);
5273 bool buildingLib = Args.hasArg(options::OPT_shared);
Matthew Curtise8f80a12012-12-06 17:49:03 +00005274 bool buildPIE = Args.hasArg(options::OPT_pie);
Matthew Curtise689b052012-12-06 15:46:07 +00005275 bool incStdLib = !Args.hasArg(options::OPT_nostdlib);
5276 bool incStartFiles = !Args.hasArg(options::OPT_nostartfiles);
5277 bool incDefLibs = !Args.hasArg(options::OPT_nodefaultlibs);
5278 bool useShared = buildingLib && !hasStaticArg;
Tony Linthicum76329bf2011-12-12 21:14:55 +00005279
Matthew Curtise689b052012-12-06 15:46:07 +00005280 //----------------------------------------------------------------------------
5281 // Silence warnings for various options
5282 //----------------------------------------------------------------------------
Tony Linthicum76329bf2011-12-12 21:14:55 +00005283
Matthew Curtise689b052012-12-06 15:46:07 +00005284 Args.ClaimAllArgs(options::OPT_g_Group);
5285 Args.ClaimAllArgs(options::OPT_emit_llvm);
5286 Args.ClaimAllArgs(options::OPT_w); // Other warning options are already
5287 // handled somewhere else.
5288 Args.ClaimAllArgs(options::OPT_static_libgcc);
5289
5290 //----------------------------------------------------------------------------
5291 //
5292 //----------------------------------------------------------------------------
Saleem Abdulrasool2456cea2014-06-12 02:08:04 +00005293 for (const auto &Opt : ToolChain.ExtraOpts)
5294 CmdArgs.push_back(Opt.c_str());
Tony Linthicum76329bf2011-12-12 21:14:55 +00005295
Matthew Curtisf10a5952012-12-06 14:16:43 +00005296 std::string MarchString = toolchains::Hexagon_TC::GetTargetCPU(Args);
5297 CmdArgs.push_back(Args.MakeArgString("-m" + MarchString));
Sebastian Pop86500282012-01-13 20:37:10 +00005298
Matthew Curtise689b052012-12-06 15:46:07 +00005299 if (buildingLib) {
5300 CmdArgs.push_back("-shared");
5301 CmdArgs.push_back("-call_shared"); // should be the default, but doing as
5302 // hexagon-gcc does
Tony Linthicum76329bf2011-12-12 21:14:55 +00005303 }
5304
Matthew Curtise689b052012-12-06 15:46:07 +00005305 if (hasStaticArg)
5306 CmdArgs.push_back("-static");
Tony Linthicum76329bf2011-12-12 21:14:55 +00005307
Matthew Curtise8f80a12012-12-06 17:49:03 +00005308 if (buildPIE && !buildingLib)
5309 CmdArgs.push_back("-pie");
5310
5311 std::string SmallDataThreshold = GetHexagonSmallDataThresholdValue(Args);
5312 if (!SmallDataThreshold.empty()) {
5313 CmdArgs.push_back(
5314 Args.MakeArgString(std::string("-G") + SmallDataThreshold));
5315 }
5316
Matthew Curtise689b052012-12-06 15:46:07 +00005317 //----------------------------------------------------------------------------
5318 //
5319 //----------------------------------------------------------------------------
5320 CmdArgs.push_back("-o");
5321 CmdArgs.push_back(Output.getFilename());
Tony Linthicum76329bf2011-12-12 21:14:55 +00005322
Matthew Curtise689b052012-12-06 15:46:07 +00005323 const std::string MarchSuffix = "/" + MarchString;
5324 const std::string G0Suffix = "/G0";
5325 const std::string MarchG0Suffix = MarchSuffix + G0Suffix;
Samuel Antaoc909c992014-11-07 17:48:03 +00005326 const std::string RootDir =
5327 toolchains::Hexagon_TC::GetGnuDir(D.InstalledDir, Args) + "/";
Matthew Curtise689b052012-12-06 15:46:07 +00005328 const std::string StartFilesDir = RootDir
5329 + "hexagon/lib"
5330 + (buildingLib
5331 ? MarchG0Suffix : MarchSuffix);
5332
5333 //----------------------------------------------------------------------------
5334 // moslib
5335 //----------------------------------------------------------------------------
5336 std::vector<std::string> oslibs;
5337 bool hasStandalone= false;
5338
5339 for (arg_iterator it = Args.filtered_begin(options::OPT_moslib_EQ),
5340 ie = Args.filtered_end(); it != ie; ++it) {
5341 (*it)->claim();
5342 oslibs.push_back((*it)->getValue());
5343 hasStandalone = hasStandalone || (oslibs.back() == "standalone");
Tony Linthicum76329bf2011-12-12 21:14:55 +00005344 }
Matthew Curtise689b052012-12-06 15:46:07 +00005345 if (oslibs.empty()) {
5346 oslibs.push_back("standalone");
5347 hasStandalone = true;
5348 }
Tony Linthicum76329bf2011-12-12 21:14:55 +00005349
Matthew Curtise689b052012-12-06 15:46:07 +00005350 //----------------------------------------------------------------------------
5351 // Start Files
5352 //----------------------------------------------------------------------------
5353 if (incStdLib && incStartFiles) {
5354
5355 if (!buildingLib) {
5356 if (hasStandalone) {
5357 CmdArgs.push_back(
5358 Args.MakeArgString(StartFilesDir + "/crt0_standalone.o"));
5359 }
5360 CmdArgs.push_back(Args.MakeArgString(StartFilesDir + "/crt0.o"));
5361 }
5362 std::string initObj = useShared ? "/initS.o" : "/init.o";
5363 CmdArgs.push_back(Args.MakeArgString(StartFilesDir + initObj));
5364 }
5365
5366 //----------------------------------------------------------------------------
5367 // Library Search Paths
5368 //----------------------------------------------------------------------------
5369 const ToolChain::path_list &LibPaths = ToolChain.getFilePaths();
Saleem Abdulrasool2456cea2014-06-12 02:08:04 +00005370 for (const auto &LibPath : LibPaths)
5371 CmdArgs.push_back(Args.MakeArgString(StringRef("-L") + LibPath));
Matthew Curtise689b052012-12-06 15:46:07 +00005372
5373 //----------------------------------------------------------------------------
5374 //
5375 //----------------------------------------------------------------------------
5376 Args.AddAllArgs(CmdArgs, options::OPT_T_Group);
5377 Args.AddAllArgs(CmdArgs, options::OPT_e);
5378 Args.AddAllArgs(CmdArgs, options::OPT_s);
5379 Args.AddAllArgs(CmdArgs, options::OPT_t);
5380 Args.AddAllArgs(CmdArgs, options::OPT_u_Group);
5381
5382 AddLinkerInputs(ToolChain, Inputs, Args, CmdArgs);
5383
5384 //----------------------------------------------------------------------------
5385 // Libraries
5386 //----------------------------------------------------------------------------
5387 if (incStdLib && incDefLibs) {
Hans Wennborg70850d82013-07-18 20:29:38 +00005388 if (D.CCCIsCXX()) {
Matthew Curtise689b052012-12-06 15:46:07 +00005389 ToolChain.AddCXXStdlibLibArgs(Args, CmdArgs);
5390 CmdArgs.push_back("-lm");
5391 }
5392
5393 CmdArgs.push_back("--start-group");
5394
5395 if (!buildingLib) {
5396 for(std::vector<std::string>::iterator i = oslibs.begin(),
5397 e = oslibs.end(); i != e; ++i)
5398 CmdArgs.push_back(Args.MakeArgString("-l" + *i));
5399 CmdArgs.push_back("-lc");
5400 }
5401 CmdArgs.push_back("-lgcc");
5402
5403 CmdArgs.push_back("--end-group");
5404 }
5405
5406 //----------------------------------------------------------------------------
5407 // End files
5408 //----------------------------------------------------------------------------
5409 if (incStdLib && incStartFiles) {
5410 std::string finiObj = useShared ? "/finiS.o" : "/fini.o";
5411 CmdArgs.push_back(Args.MakeArgString(StartFilesDir + finiObj));
5412 }
5413
5414 std::string Linker = ToolChain.GetProgramPath("hexagon-ld");
David Blaikiec11bf802014-09-04 16:04:28 +00005415 C.addCommand(llvm::make_unique<Command>(JA, *this, Args.MakeArgString(Linker),
5416 CmdArgs));
Tony Linthicum76329bf2011-12-12 21:14:55 +00005417}
5418// Hexagon tools end.
5419
Argyrios Kyrtzidisbaa97662014-07-11 23:47:48 +00005420/// Get the (LLVM) name of the minimum ARM CPU for the arch we are targeting.
Bernard Ogden31561762013-12-12 13:27:11 +00005421const char *arm::getARMCPUForMArch(const ArgList &Args,
5422 const llvm::Triple &Triple) {
5423 StringRef MArch;
5424 if (Arg *A = Args.getLastArg(options::OPT_march_EQ)) {
5425 // Otherwise, if we have -march= choose the base CPU for that arch.
5426 MArch = A->getValue();
5427 } else {
5428 // Otherwise, use the Arch from the triple.
5429 MArch = Triple.getArchName();
5430 }
5431
5432 // Handle -march=native.
Bernard Ogden31561762013-12-12 13:27:11 +00005433 if (MArch == "native") {
5434 std::string CPU = llvm::sys::getHostCPUName();
5435 if (CPU != "generic") {
5436 // Translate the native cpu into the architecture. The switch below will
5437 // then chose the minimum cpu for that arch.
Bernard Ogdenf6ba17d2013-12-12 13:27:15 +00005438 MArch = std::string("arm") + arm::getLLVMArchSuffixForARM(CPU);
Bernard Ogden31561762013-12-12 13:27:11 +00005439 }
5440 }
5441
Argyrios Kyrtzidisbaa97662014-07-11 23:47:48 +00005442 return Triple.getARMCPUForArch(MArch);
Bernard Ogden31561762013-12-12 13:27:11 +00005443}
5444
5445/// getARMTargetCPU - Get the (LLVM) name of the ARM cpu we are targeting.
Rafael Espindola80d333b2013-12-12 15:48:19 +00005446StringRef arm::getARMTargetCPU(const ArgList &Args,
5447 const llvm::Triple &Triple) {
Bernard Ogden31561762013-12-12 13:27:11 +00005448 // FIXME: Warn on inconsistent use of -mcpu and -march.
5449 // If we have -mcpu=, use that.
5450 if (Arg *A = Args.getLastArg(options::OPT_mcpu_EQ)) {
5451 StringRef MCPU = A->getValue();
5452 // Handle -mcpu=native.
5453 if (MCPU == "native")
Rafael Espindola9c5ef122013-12-12 15:39:05 +00005454 return llvm::sys::getHostCPUName();
Bernard Ogden31561762013-12-12 13:27:11 +00005455 else
Rafael Espindola80d333b2013-12-12 15:48:19 +00005456 return MCPU;
Bernard Ogden31561762013-12-12 13:27:11 +00005457 }
5458
5459 return getARMCPUForMArch(Args, Triple);
5460}
5461
5462/// getLLVMArchSuffixForARM - Get the LLVM arch name to use for a particular
5463/// CPU.
5464//
5465// FIXME: This is redundant with -mcpu, why does LLVM use this.
5466// FIXME: tblgen this, or kill it!
5467const char *arm::getLLVMArchSuffixForARM(StringRef CPU) {
5468 return llvm::StringSwitch<const char *>(CPU)
5469 .Case("strongarm", "v4")
5470 .Cases("arm7tdmi", "arm7tdmi-s", "arm710t", "v4t")
5471 .Cases("arm720t", "arm9", "arm9tdmi", "v4t")
5472 .Cases("arm920", "arm920t", "arm922t", "v4t")
5473 .Cases("arm940t", "ep9312","v4t")
5474 .Cases("arm10tdmi", "arm1020t", "v5")
5475 .Cases("arm9e", "arm926ej-s", "arm946e-s", "v5e")
5476 .Cases("arm966e-s", "arm968e-s", "arm10e", "v5e")
5477 .Cases("arm1020e", "arm1022e", "xscale", "iwmmxt", "v5e")
5478 .Cases("arm1136j-s", "arm1136jf-s", "arm1176jz-s", "v6")
5479 .Cases("arm1176jzf-s", "mpcorenovfp", "mpcore", "v6")
5480 .Cases("arm1156t2-s", "arm1156t2f-s", "v6t2")
Charlie Turner2919cbd2014-11-06 14:59:30 +00005481 .Cases("cortex-a5", "cortex-a7", "cortex-a8", "v7")
Renato Golin5886bc32014-10-13 10:22:48 +00005482 .Cases("cortex-a9", "cortex-a12", "cortex-a15", "cortex-a17", "krait", "v7")
Bernard Ogden31561762013-12-12 13:27:11 +00005483 .Cases("cortex-r4", "cortex-r5", "v7r")
5484 .Case("cortex-m0", "v6m")
5485 .Case("cortex-m3", "v7m")
Oliver Stannardbfd3ea32014-10-01 09:03:02 +00005486 .Cases("cortex-m4", "cortex-m7", "v7em")
Bernard Ogden31561762013-12-12 13:27:11 +00005487 .Case("swift", "v7s")
Tim Northovera2ee4332014-03-29 15:09:45 +00005488 .Case("cyclone", "v8")
Bernard Ogden31561762013-12-12 13:27:11 +00005489 .Cases("cortex-a53", "cortex-a57", "v8")
5490 .Default("");
5491}
5492
Joerg Sonnenberger1689d3f2015-01-28 23:30:39 +00005493void arm::appendEBLinkFlags(const ArgList &Args, ArgStringList &CmdArgs, const llvm::Triple &Triple) {
5494 if (Args.hasArg(options::OPT_r))
5495 return;
5496
5497 StringRef Suffix = getLLVMArchSuffixForARM(getARMCPUForMArch(Args, Triple));
5498 const char *LinkFlag = llvm::StringSwitch<const char *>(Suffix)
5499 .Cases("v4", "v4t", "v5", "v5e", nullptr)
5500 .Cases("v6", "v6t2", nullptr)
5501 .Default("--be8");
5502
5503 if (LinkFlag)
5504 CmdArgs.push_back(LinkFlag);
5505}
5506
Jonathan Roelofs2cea1be2014-02-12 03:21:20 +00005507bool mips::hasMipsAbiArg(const ArgList &Args, const char *Value) {
5508 Arg *A = Args.getLastArg(options::OPT_mabi_EQ);
5509 return A && (A->getValue() == StringRef(Value));
5510}
5511
Simon Atanasyand95c67d2014-08-13 14:34:14 +00005512bool mips::isUCLibc(const ArgList &Args) {
5513 Arg *A = Args.getLastArg(options::OPT_m_libc_Group);
Rafael Espindolad3d657c2014-08-13 17:15:42 +00005514 return A && A->getOption().matches(options::OPT_muclibc);
Simon Atanasyand95c67d2014-08-13 14:34:14 +00005515}
5516
Daniel Sanders2bf13662014-07-10 14:40:57 +00005517bool mips::isNaN2008(const ArgList &Args, const llvm::Triple &Triple) {
Daniel Sanders3b92c5b2014-06-24 15:04:16 +00005518 if (Arg *NaNArg = Args.getLastArg(options::OPT_mnan_EQ))
5519 return llvm::StringSwitch<bool>(NaNArg->getValue())
5520 .Case("2008", true)
5521 .Case("legacy", false)
5522 .Default(false);
5523
5524 // NaN2008 is the default for MIPS32r6/MIPS64r6.
Daniel Sanders2bf13662014-07-10 14:40:57 +00005525 return llvm::StringSwitch<bool>(getCPUName(Args, Triple))
5526 .Cases("mips32r6", "mips64r6", true)
5527 .Default(false);
Daniel Sanders3b92c5b2014-06-24 15:04:16 +00005528
5529 return false;
5530}
5531
Daniel Sanders379d44b2014-07-16 11:52:23 +00005532bool mips::isFPXXDefault(const llvm::Triple &Triple, StringRef CPUName,
5533 StringRef ABIName) {
5534 if (Triple.getVendor() != llvm::Triple::ImaginationTechnologies &&
Daniel Sanders492beb12014-07-18 15:05:38 +00005535 Triple.getVendor() != llvm::Triple::MipsTechnologies)
Daniel Sanders379d44b2014-07-16 11:52:23 +00005536 return false;
5537
5538 if (ABIName != "32")
5539 return false;
5540
5541 return llvm::StringSwitch<bool>(CPUName)
5542 .Cases("mips2", "mips3", "mips4", "mips5", true)
5543 .Cases("mips32", "mips32r2", true)
5544 .Cases("mips64", "mips64r2", true)
5545 .Default(false);
5546}
5547
Tim Northover157d9112014-01-16 08:48:16 +00005548llvm::Triple::ArchType darwin::getArchTypeForMachOArchName(StringRef Str) {
Rafael Espindoladcbf6982012-10-31 18:51:07 +00005549 // See arch(3) and llvm-gcc's driver-driver.c. We don't implement support for
5550 // archs which Darwin doesn't use.
5551
5552 // The matching this routine does is fairly pointless, since it is neither the
5553 // complete architecture list, nor a reasonable subset. The problem is that
5554 // historically the driver driver accepts this and also ties its -march=
5555 // handling to the architecture name, so we need to be careful before removing
5556 // support for it.
5557
5558 // This code must be kept in sync with Clang's Darwin specific argument
5559 // translation.
5560
5561 return llvm::StringSwitch<llvm::Triple::ArchType>(Str)
5562 .Cases("ppc", "ppc601", "ppc603", "ppc604", "ppc604e", llvm::Triple::ppc)
5563 .Cases("ppc750", "ppc7400", "ppc7450", "ppc970", llvm::Triple::ppc)
5564 .Case("ppc64", llvm::Triple::ppc64)
5565 .Cases("i386", "i486", "i486SX", "i586", "i686", llvm::Triple::x86)
5566 .Cases("pentium", "pentpro", "pentIIm3", "pentIIm5", "pentium4",
5567 llvm::Triple::x86)
Jim Grosbach82eee262013-11-16 00:53:35 +00005568 .Cases("x86_64", "x86_64h", llvm::Triple::x86_64)
Rafael Espindoladcbf6982012-10-31 18:51:07 +00005569 // This is derived from the driver driver.
Bob Wilson743bf672013-03-04 22:37:49 +00005570 .Cases("arm", "armv4t", "armv5", "armv6", "armv6m", llvm::Triple::arm)
Bob Wilsonb767d152014-01-15 21:43:40 +00005571 .Cases("armv7", "armv7em", "armv7k", "armv7m", llvm::Triple::arm)
Bob Wilson743bf672013-03-04 22:37:49 +00005572 .Cases("armv7s", "xscale", llvm::Triple::arm)
Tim Northover40956e62014-07-23 12:32:58 +00005573 .Case("arm64", llvm::Triple::aarch64)
Rafael Espindoladcbf6982012-10-31 18:51:07 +00005574 .Case("r600", llvm::Triple::r600)
Tom Stellardd8e38a32015-01-06 20:34:47 +00005575 .Case("amdgcn", llvm::Triple::amdgcn)
Rafael Espindoladcbf6982012-10-31 18:51:07 +00005576 .Case("nvptx", llvm::Triple::nvptx)
5577 .Case("nvptx64", llvm::Triple::nvptx64)
5578 .Case("amdil", llvm::Triple::amdil)
5579 .Case("spir", llvm::Triple::spir)
5580 .Default(llvm::Triple::UnknownArch);
5581}
Tony Linthicum76329bf2011-12-12 21:14:55 +00005582
Tim Northover157d9112014-01-16 08:48:16 +00005583void darwin::setTripleTypeForMachOArchName(llvm::Triple &T, StringRef Str) {
5584 llvm::Triple::ArchType Arch = getArchTypeForMachOArchName(Str);
5585 T.setArch(Arch);
5586
5587 if (Str == "x86_64h")
5588 T.setArchName(Str);
5589 else if (Str == "armv6m" || Str == "armv7m" || Str == "armv7em") {
5590 T.setOS(llvm::Triple::UnknownOS);
Saleem Abdulrasool29b82b62014-03-06 20:47:19 +00005591 T.setObjectFormat(llvm::Triple::MachO);
Tim Northover157d9112014-01-16 08:48:16 +00005592 }
5593}
5594
Bob Wilsondecc03e2012-11-23 06:14:39 +00005595const char *Clang::getBaseInputName(const ArgList &Args,
5596 const InputInfoList &Inputs) {
Michael J. Spencere1696752010-12-18 00:19:12 +00005597 return Args.MakeArgString(
5598 llvm::sys::path::filename(Inputs[0].getBaseInput()));
Daniel Dunbarafec1f52009-03-29 18:40:18 +00005599}
5600
Bob Wilsondecc03e2012-11-23 06:14:39 +00005601const char *Clang::getBaseInputStem(const ArgList &Args,
5602 const InputInfoList &Inputs) {
Daniel Dunbarafec1f52009-03-29 18:40:18 +00005603 const char *Str = getBaseInputName(Args, Inputs);
5604
Chris Lattner906bb902011-01-16 08:14:11 +00005605 if (const char *End = strrchr(Str, '.'))
Daniel Dunbar1c28f1e2009-09-09 22:32:48 +00005606 return Args.MakeArgString(std::string(Str, End));
Daniel Dunbarafec1f52009-03-29 18:40:18 +00005607
5608 return Str;
5609}
5610
Bob Wilsondecc03e2012-11-23 06:14:39 +00005611const char *Clang::getDependencyFileName(const ArgList &Args,
5612 const InputInfoList &Inputs) {
Daniel Dunbarafec1f52009-03-29 18:40:18 +00005613 // FIXME: Think about this more.
5614 std::string Res;
5615
5616 if (Arg *OutputOpt = Args.getLastArg(options::OPT_o)) {
Richard Smithbd55daf2012-11-01 04:30:05 +00005617 std::string Str(OutputOpt->getValue());
Daniel Dunbarafec1f52009-03-29 18:40:18 +00005618 Res = Str.substr(0, Str.rfind('.'));
Chad Rosier6fdf38b2011-08-17 23:08:45 +00005619 } else {
Bob Wilsondecc03e2012-11-23 06:14:39 +00005620 Res = getBaseInputStem(Args, Inputs);
Chad Rosier6fdf38b2011-08-17 23:08:45 +00005621 }
Daniel Dunbar1c28f1e2009-09-09 22:32:48 +00005622 return Args.MakeArgString(Res + ".d");
Daniel Dunbarafec1f52009-03-29 18:40:18 +00005623}
5624
Daniel Dunbarbe220842009-03-20 16:06:39 +00005625void darwin::Assemble::ConstructJob(Compilation &C, const JobAction &JA,
Daniel Dunbar7fbaf532010-08-02 02:38:28 +00005626 const InputInfo &Output,
Daniel Dunbard067f7f2009-04-08 23:54:23 +00005627 const InputInfoList &Inputs,
5628 const ArgList &Args,
Daniel Dunbarbe220842009-03-20 16:06:39 +00005629 const char *LinkingOutput) const {
5630 ArgStringList CmdArgs;
5631
5632 assert(Inputs.size() == 1 && "Unexpected number of inputs.");
5633 const InputInfo &Input = Inputs[0];
5634
Daniel Dunbardc8355e2011-04-12 23:59:20 +00005635 // Determine the original source input.
5636 const Action *SourceAction = &JA;
5637 while (SourceAction->getKind() != Action::InputClass) {
5638 assert(!SourceAction->getInputs().empty() && "unexpected root action!");
5639 SourceAction = SourceAction->getInputs()[0];
5640 }
5641
Saleem Abdulrasoolcfeb90d2014-02-23 00:40:30 +00005642 // If -fno_integrated_as is used add -Q to the darwin assember driver to make
Kevin Enderby319baa42013-11-18 23:30:29 +00005643 // sure it runs its system assembler not clang's integrated assembler.
David Fang073a7c92013-12-10 22:51:25 +00005644 // Applicable to darwin11+ and Xcode 4+. darwin<10 lacked integrated-as.
5645 // FIXME: at run-time detect assembler capabilities or rely on version
5646 // information forwarded by -target-assembler-version (future)
Saleem Abdulrasoolcfeb90d2014-02-23 00:40:30 +00005647 if (Args.hasArg(options::OPT_fno_integrated_as)) {
David Fangadcdde02013-12-10 23:13:11 +00005648 const llvm::Triple &T(getToolChain().getTriple());
5649 if (!(T.isMacOSX() && T.isMacOSXVersionLT(10, 7)))
David Fang073a7c92013-12-10 22:51:25 +00005650 CmdArgs.push_back("-Q");
5651 }
Kevin Enderby319baa42013-11-18 23:30:29 +00005652
Daniel Dunbardc8355e2011-04-12 23:59:20 +00005653 // Forward -g, assuming we are dealing with an actual assembly file.
Eric Christopher84fbdb42011-08-19 00:30:14 +00005654 if (SourceAction->getType() == types::TY_Asm ||
Daniel Dunbardc8355e2011-04-12 23:59:20 +00005655 SourceAction->getType() == types::TY_PP_Asm) {
Daniel Dunbar5c9c1182009-04-01 00:27:44 +00005656 if (Args.hasArg(options::OPT_gstabs))
5657 CmdArgs.push_back("--gstabs");
5658 else if (Args.hasArg(options::OPT_g_Group))
Bob Wilson126c4912011-11-02 05:10:45 +00005659 CmdArgs.push_back("-g");
Daniel Dunbar5c9c1182009-04-01 00:27:44 +00005660 }
Daniel Dunbard067f7f2009-04-08 23:54:23 +00005661
Daniel Dunbarbe220842009-03-20 16:06:39 +00005662 // Derived from asm spec.
Tim Northover157d9112014-01-16 08:48:16 +00005663 AddMachOArch(Args, CmdArgs);
Daniel Dunbarbe220842009-03-20 16:06:39 +00005664
Daniel Dunbar6d484762010-07-22 01:47:22 +00005665 // Use -force_cpusubtype_ALL on x86 by default.
Eli Benderskyd4a6aec2013-07-24 22:20:49 +00005666 if (getToolChain().getArch() == llvm::Triple::x86 ||
5667 getToolChain().getArch() == llvm::Triple::x86_64 ||
Daniel Dunbar3571dd92009-09-09 18:36:27 +00005668 Args.hasArg(options::OPT_force__cpusubtype__ALL))
5669 CmdArgs.push_back("-force_cpusubtype_ALL");
5670
Eli Benderskyd4a6aec2013-07-24 22:20:49 +00005671 if (getToolChain().getArch() != llvm::Triple::x86_64 &&
Daniel Dunbarbd847cc2012-10-15 22:23:53 +00005672 (((Args.hasArg(options::OPT_mkernel) ||
Eric Christopher248357f2013-02-21 22:35:01 +00005673 Args.hasArg(options::OPT_fapple_kext)) &&
Tim Northover157d9112014-01-16 08:48:16 +00005674 getMachOToolChain().isKernelStatic()) ||
Daniel Dunbarbd847cc2012-10-15 22:23:53 +00005675 Args.hasArg(options::OPT_static)))
Daniel Dunbard067f7f2009-04-08 23:54:23 +00005676 CmdArgs.push_back("-static");
5677
Daniel Dunbarbe220842009-03-20 16:06:39 +00005678 Args.AddAllArgValues(CmdArgs, options::OPT_Wa_COMMA,
5679 options::OPT_Xassembler);
5680
5681 assert(Output.isFilename() && "Unexpected lipo output.");
5682 CmdArgs.push_back("-o");
5683 CmdArgs.push_back(Output.getFilename());
5684
Daniel Dunbarb440f562010-08-02 02:38:21 +00005685 assert(Input.isFilename() && "Invalid input.");
5686 CmdArgs.push_back(Input.getFilename());
Daniel Dunbarbe220842009-03-20 16:06:39 +00005687
5688 // asm_final spec is empty.
5689
Daniel Dunbard067f7f2009-04-08 23:54:23 +00005690 const char *Exec =
Daniel Dunbar9c3ed5f2010-07-14 18:46:23 +00005691 Args.MakeArgString(getToolChain().GetProgramPath("as"));
David Blaikiec11bf802014-09-04 16:04:28 +00005692 C.addCommand(llvm::make_unique<Command>(JA, *this, Exec, CmdArgs));
Daniel Dunbarbe220842009-03-20 16:06:39 +00005693}
Daniel Dunbar64ed5e32009-03-20 00:52:38 +00005694
Tim Northover157d9112014-01-16 08:48:16 +00005695void darwin::MachOTool::anchor() {}
David Blaikie68e081d2011-12-20 02:48:34 +00005696
Tim Northover157d9112014-01-16 08:48:16 +00005697void darwin::MachOTool::AddMachOArch(const ArgList &Args,
5698 ArgStringList &CmdArgs) const {
5699 StringRef ArchName = getMachOToolChain().getMachOArchName(Args);
Daniel Dunbardcc3b652010-01-22 02:04:58 +00005700
Daniel Dunbarc1964212009-03-26 16:23:12 +00005701 // Derived from darwin_arch spec.
5702 CmdArgs.push_back("-arch");
Daniel Dunbardcc3b652010-01-22 02:04:58 +00005703 CmdArgs.push_back(Args.MakeArgString(ArchName));
Daniel Dunbar91dbfd62009-09-04 18:35:31 +00005704
Daniel Dunbardcc3b652010-01-22 02:04:58 +00005705 // FIXME: Is this needed anymore?
5706 if (ArchName == "arm")
Daniel Dunbar91dbfd62009-09-04 18:35:31 +00005707 CmdArgs.push_back("-force_cpusubtype_ALL");
Daniel Dunbarc1964212009-03-26 16:23:12 +00005708}
5709
Bill Wendling3b2000f2012-10-02 18:02:50 +00005710bool darwin::Link::NeedsTempPath(const InputInfoList &Inputs) const {
5711 // We only need to generate a temp path for LTO if we aren't compiling object
5712 // files. When compiling source files, we run 'dsymutil' after linking. We
5713 // don't run 'dsymutil' when compiling object files.
Saleem Abdulrasool2456cea2014-06-12 02:08:04 +00005714 for (const auto &Input : Inputs)
5715 if (Input.getType() != types::TY_Object)
Bill Wendling3b2000f2012-10-02 18:02:50 +00005716 return true;
5717
5718 return false;
5719}
5720
Daniel Dunbarccbc4522010-09-09 21:51:05 +00005721void darwin::Link::AddLinkArgs(Compilation &C,
5722 const ArgList &Args,
Bill Wendling3b2000f2012-10-02 18:02:50 +00005723 ArgStringList &CmdArgs,
5724 const InputInfoList &Inputs) const {
Daniel Dunbar083edf72009-12-21 18:54:17 +00005725 const Driver &D = getToolChain().getDriver();
Tim Northover157d9112014-01-16 08:48:16 +00005726 const toolchains::MachO &MachOTC = getMachOToolChain();
Daniel Dunbarc1964212009-03-26 16:23:12 +00005727
Daniel Dunbarcacb0e22010-08-11 23:07:50 +00005728 unsigned Version[3] = { 0, 0, 0 };
5729 if (Arg *A = Args.getLastArg(options::OPT_mlinker_version_EQ)) {
5730 bool HadExtra;
Richard Smithbd55daf2012-11-01 04:30:05 +00005731 if (!Driver::GetReleaseVersion(A->getValue(), Version[0],
Daniel Dunbarcacb0e22010-08-11 23:07:50 +00005732 Version[1], Version[2], HadExtra) ||
5733 HadExtra)
Chris Lattner0e62c1c2011-07-23 10:55:15 +00005734 D.Diag(diag::err_drv_invalid_version_number)
Daniel Dunbarcacb0e22010-08-11 23:07:50 +00005735 << A->getAsString(Args);
5736 }
5737
Bob Wilson5a4f3ea2014-01-14 01:56:31 +00005738 // Newer linkers support -demangle. Pass it if supported and not disabled by
Daniel Dunbarcacb0e22010-08-11 23:07:50 +00005739 // the user.
Bob Wilson5a4f3ea2014-01-14 01:56:31 +00005740 if (Version[0] >= 100 && !Args.hasArg(options::OPT_Z_Xlinker__no_demangle))
5741 CmdArgs.push_back("-demangle");
Daniel Dunbarcacb0e22010-08-11 23:07:50 +00005742
Bob Wilson3d27dad2013-08-02 22:25:34 +00005743 if (Args.hasArg(options::OPT_rdynamic) && Version[0] >= 137)
5744 CmdArgs.push_back("-export_dynamic");
5745
Bill Wendling313b6bf2012-11-16 23:03:00 +00005746 // If we are using LTO, then automatically create a temporary file path for
5747 // the linker to use, so that it's lifetime will extend past a possible
5748 // dsymutil step.
5749 if (Version[0] >= 116 && D.IsUsingLTO(Args) && NeedsTempPath(Inputs)) {
5750 const char *TmpPath = C.getArgs().MakeArgString(
5751 D.GetTemporaryPath("cc", types::getTypeTempSuffix(types::TY_Object)));
5752 C.addTempFile(TmpPath);
5753 CmdArgs.push_back("-object_path_lto");
5754 CmdArgs.push_back(TmpPath);
Daniel Dunbaref889c72011-06-21 20:55:11 +00005755 }
5756
Daniel Dunbarc1964212009-03-26 16:23:12 +00005757 // Derived from the "link" spec.
5758 Args.AddAllArgs(CmdArgs, options::OPT_static);
5759 if (!Args.hasArg(options::OPT_static))
5760 CmdArgs.push_back("-dynamic");
5761 if (Args.hasArg(options::OPT_fgnu_runtime)) {
5762 // FIXME: gcc replaces -lobjc in forward args with -lobjc-gnu
5763 // here. How do we wish to handle such things?
5764 }
Daniel Dunbard067f7f2009-04-08 23:54:23 +00005765
Daniel Dunbarc1964212009-03-26 16:23:12 +00005766 if (!Args.hasArg(options::OPT_dynamiclib)) {
Tim Northover157d9112014-01-16 08:48:16 +00005767 AddMachOArch(Args, CmdArgs);
Daniel Dunbara48823f2010-01-22 02:04:52 +00005768 // FIXME: Why do this only on this path?
Daniel Dunbar93d7acf2010-01-22 03:37:33 +00005769 Args.AddLastArg(CmdArgs, options::OPT_force__cpusubtype__ALL);
Daniel Dunbarc1964212009-03-26 16:23:12 +00005770
5771 Args.AddLastArg(CmdArgs, options::OPT_bundle);
5772 Args.AddAllArgs(CmdArgs, options::OPT_bundle__loader);
5773 Args.AddAllArgs(CmdArgs, options::OPT_client__name);
5774
5775 Arg *A;
5776 if ((A = Args.getLastArg(options::OPT_compatibility__version)) ||
5777 (A = Args.getLastArg(options::OPT_current__version)) ||
5778 (A = Args.getLastArg(options::OPT_install__name)))
Chris Lattner0e62c1c2011-07-23 10:55:15 +00005779 D.Diag(diag::err_drv_argument_only_allowed_with)
Daniel Dunbarc1964212009-03-26 16:23:12 +00005780 << A->getAsString(Args) << "-dynamiclib";
5781
5782 Args.AddLastArg(CmdArgs, options::OPT_force__flat__namespace);
5783 Args.AddLastArg(CmdArgs, options::OPT_keep__private__externs);
5784 Args.AddLastArg(CmdArgs, options::OPT_private__bundle);
5785 } else {
5786 CmdArgs.push_back("-dylib");
5787
5788 Arg *A;
5789 if ((A = Args.getLastArg(options::OPT_bundle)) ||
5790 (A = Args.getLastArg(options::OPT_bundle__loader)) ||
5791 (A = Args.getLastArg(options::OPT_client__name)) ||
5792 (A = Args.getLastArg(options::OPT_force__flat__namespace)) ||
5793 (A = Args.getLastArg(options::OPT_keep__private__externs)) ||
5794 (A = Args.getLastArg(options::OPT_private__bundle)))
Chris Lattner0e62c1c2011-07-23 10:55:15 +00005795 D.Diag(diag::err_drv_argument_not_allowed_with)
Daniel Dunbarc1964212009-03-26 16:23:12 +00005796 << A->getAsString(Args) << "-dynamiclib";
Daniel Dunbard067f7f2009-04-08 23:54:23 +00005797
Daniel Dunbarc1964212009-03-26 16:23:12 +00005798 Args.AddAllArgsTranslated(CmdArgs, options::OPT_compatibility__version,
5799 "-dylib_compatibility_version");
5800 Args.AddAllArgsTranslated(CmdArgs, options::OPT_current__version,
5801 "-dylib_current_version");
5802
Tim Northover157d9112014-01-16 08:48:16 +00005803 AddMachOArch(Args, CmdArgs);
Daniel Dunbarc1964212009-03-26 16:23:12 +00005804
5805 Args.AddAllArgsTranslated(CmdArgs, options::OPT_install__name,
5806 "-dylib_install_name");
5807 }
5808
5809 Args.AddLastArg(CmdArgs, options::OPT_all__load);
5810 Args.AddAllArgs(CmdArgs, options::OPT_allowable__client);
5811 Args.AddLastArg(CmdArgs, options::OPT_bind__at__load);
Tim Northover157d9112014-01-16 08:48:16 +00005812 if (MachOTC.isTargetIOSBased())
Daniel Dunbar2b5f6812009-09-04 18:35:41 +00005813 Args.AddLastArg(CmdArgs, options::OPT_arch__errors__fatal);
Daniel Dunbarc1964212009-03-26 16:23:12 +00005814 Args.AddLastArg(CmdArgs, options::OPT_dead__strip);
5815 Args.AddLastArg(CmdArgs, options::OPT_no__dead__strip__inits__and__terms);
5816 Args.AddAllArgs(CmdArgs, options::OPT_dylib__file);
5817 Args.AddLastArg(CmdArgs, options::OPT_dynamic);
5818 Args.AddAllArgs(CmdArgs, options::OPT_exported__symbols__list);
5819 Args.AddLastArg(CmdArgs, options::OPT_flat__namespace);
Daniel Dunbar044a3902011-06-28 20:16:02 +00005820 Args.AddAllArgs(CmdArgs, options::OPT_force__load);
Daniel Dunbarc1964212009-03-26 16:23:12 +00005821 Args.AddAllArgs(CmdArgs, options::OPT_headerpad__max__install__names);
5822 Args.AddAllArgs(CmdArgs, options::OPT_image__base);
5823 Args.AddAllArgs(CmdArgs, options::OPT_init);
5824
Daniel Dunbarc44d3132011-04-28 21:23:41 +00005825 // Add the deployment target.
Tim Northover157d9112014-01-16 08:48:16 +00005826 MachOTC.addMinVersionArgs(Args, CmdArgs);
Daniel Dunbarc44d3132011-04-28 21:23:41 +00005827
Daniel Dunbarc1964212009-03-26 16:23:12 +00005828 Args.AddLastArg(CmdArgs, options::OPT_nomultidefs);
5829 Args.AddLastArg(CmdArgs, options::OPT_multi__module);
5830 Args.AddLastArg(CmdArgs, options::OPT_single__module);
5831 Args.AddAllArgs(CmdArgs, options::OPT_multiply__defined);
5832 Args.AddAllArgs(CmdArgs, options::OPT_multiply__defined__unused);
Daniel Dunbard067f7f2009-04-08 23:54:23 +00005833
Daniel Dunbaraf68a882010-07-13 23:31:40 +00005834 if (const Arg *A = Args.getLastArg(options::OPT_fpie, options::OPT_fPIE,
5835 options::OPT_fno_pie,
5836 options::OPT_fno_PIE)) {
5837 if (A->getOption().matches(options::OPT_fpie) ||
5838 A->getOption().matches(options::OPT_fPIE))
5839 CmdArgs.push_back("-pie");
5840 else
5841 CmdArgs.push_back("-no_pie");
5842 }
Daniel Dunbarc1964212009-03-26 16:23:12 +00005843
5844 Args.AddLastArg(CmdArgs, options::OPT_prebind);
5845 Args.AddLastArg(CmdArgs, options::OPT_noprebind);
5846 Args.AddLastArg(CmdArgs, options::OPT_nofixprebinding);
5847 Args.AddLastArg(CmdArgs, options::OPT_prebind__all__twolevel__modules);
5848 Args.AddLastArg(CmdArgs, options::OPT_read__only__relocs);
5849 Args.AddAllArgs(CmdArgs, options::OPT_sectcreate);
5850 Args.AddAllArgs(CmdArgs, options::OPT_sectorder);
5851 Args.AddAllArgs(CmdArgs, options::OPT_seg1addr);
5852 Args.AddAllArgs(CmdArgs, options::OPT_segprot);
5853 Args.AddAllArgs(CmdArgs, options::OPT_segaddr);
5854 Args.AddAllArgs(CmdArgs, options::OPT_segs__read__only__addr);
5855 Args.AddAllArgs(CmdArgs, options::OPT_segs__read__write__addr);
5856 Args.AddAllArgs(CmdArgs, options::OPT_seg__addr__table);
5857 Args.AddAllArgs(CmdArgs, options::OPT_seg__addr__table__filename);
5858 Args.AddAllArgs(CmdArgs, options::OPT_sub__library);
5859 Args.AddAllArgs(CmdArgs, options::OPT_sub__umbrella);
Daniel Dunbar2b5f6812009-09-04 18:35:41 +00005860
Daniel Dunbar84384642011-05-02 21:03:47 +00005861 // Give --sysroot= preference, over the Apple specific behavior to also use
5862 // --isysroot as the syslibroot.
Sebastian Pop980920a2012-04-16 04:16:43 +00005863 StringRef sysroot = C.getSysRoot();
5864 if (sysroot != "") {
Daniel Dunbar84384642011-05-02 21:03:47 +00005865 CmdArgs.push_back("-syslibroot");
Sebastian Pop980920a2012-04-16 04:16:43 +00005866 CmdArgs.push_back(C.getArgs().MakeArgString(sysroot));
Daniel Dunbar84384642011-05-02 21:03:47 +00005867 } else if (const Arg *A = Args.getLastArg(options::OPT_isysroot)) {
5868 CmdArgs.push_back("-syslibroot");
Richard Smithbd55daf2012-11-01 04:30:05 +00005869 CmdArgs.push_back(A->getValue());
Daniel Dunbar2b5f6812009-09-04 18:35:41 +00005870 }
5871
Daniel Dunbarc1964212009-03-26 16:23:12 +00005872 Args.AddLastArg(CmdArgs, options::OPT_twolevel__namespace);
5873 Args.AddLastArg(CmdArgs, options::OPT_twolevel__namespace__hints);
5874 Args.AddAllArgs(CmdArgs, options::OPT_umbrella);
5875 Args.AddAllArgs(CmdArgs, options::OPT_undefined);
5876 Args.AddAllArgs(CmdArgs, options::OPT_unexported__symbols__list);
Daniel Dunbar2b5f6812009-09-04 18:35:41 +00005877 Args.AddAllArgs(CmdArgs, options::OPT_weak__reference__mismatches);
Daniel Dunbarc1964212009-03-26 16:23:12 +00005878 Args.AddLastArg(CmdArgs, options::OPT_X_Flag);
5879 Args.AddAllArgs(CmdArgs, options::OPT_y);
5880 Args.AddLastArg(CmdArgs, options::OPT_w);
5881 Args.AddAllArgs(CmdArgs, options::OPT_pagezero__size);
5882 Args.AddAllArgs(CmdArgs, options::OPT_segs__read__);
5883 Args.AddLastArg(CmdArgs, options::OPT_seglinkedit);
5884 Args.AddLastArg(CmdArgs, options::OPT_noseglinkedit);
5885 Args.AddAllArgs(CmdArgs, options::OPT_sectalign);
5886 Args.AddAllArgs(CmdArgs, options::OPT_sectobjectsymbols);
5887 Args.AddAllArgs(CmdArgs, options::OPT_segcreate);
5888 Args.AddLastArg(CmdArgs, options::OPT_whyload);
5889 Args.AddLastArg(CmdArgs, options::OPT_whatsloaded);
5890 Args.AddAllArgs(CmdArgs, options::OPT_dylinker__install__name);
5891 Args.AddLastArg(CmdArgs, options::OPT_dylinker);
5892 Args.AddLastArg(CmdArgs, options::OPT_Mach);
5893}
5894
Alexey Bataev186b28a2014-03-06 05:43:53 +00005895enum LibOpenMP {
5896 LibUnknown,
5897 LibGOMP,
5898 LibIOMP5
5899};
5900
Daniel Dunbarc1964212009-03-26 16:23:12 +00005901void darwin::Link::ConstructJob(Compilation &C, const JobAction &JA,
Daniel Dunbar7fbaf532010-08-02 02:38:28 +00005902 const InputInfo &Output,
Daniel Dunbard067f7f2009-04-08 23:54:23 +00005903 const InputInfoList &Inputs,
5904 const ArgList &Args,
Daniel Dunbarc1964212009-03-26 16:23:12 +00005905 const char *LinkingOutput) const {
5906 assert(Output.getType() == types::TY_Image && "Invalid linker output type.");
Daniel Dunbarc09988d2009-09-08 16:39:16 +00005907
Reid Kleckner0290c9c2014-09-15 17:45:39 +00005908 // If the number of arguments surpasses the system limits, we will encode the
5909 // input files in a separate file, shortening the command line. To this end,
5910 // build a list of input file names that can be passed via a file with the
5911 // -filelist linker option.
5912 llvm::opt::ArgStringList InputFileList;
5913
Daniel Dunbarc1964212009-03-26 16:23:12 +00005914 // The logic here is derived from gcc's behavior; most of which
5915 // comes from specs (starting with link_command). Consult gcc for
5916 // more information.
Daniel Dunbarc1964212009-03-26 16:23:12 +00005917 ArgStringList CmdArgs;
5918
Argyrios Kyrtzidis741fab12011-10-07 22:58:08 +00005919 /// Hack(tm) to ignore linking errors when we are doing ARC migration.
5920 if (Args.hasArg(options::OPT_ccc_arcmt_check,
5921 options::OPT_ccc_arcmt_migrate)) {
Saleem Abdulrasool2456cea2014-06-12 02:08:04 +00005922 for (const auto &Arg : Args)
5923 Arg->claim();
Argyrios Kyrtzidis741fab12011-10-07 22:58:08 +00005924 const char *Exec =
5925 Args.MakeArgString(getToolChain().GetProgramPath("touch"));
5926 CmdArgs.push_back(Output.getFilename());
David Blaikiec11bf802014-09-04 16:04:28 +00005927 C.addCommand(llvm::make_unique<Command>(JA, *this, Exec, CmdArgs));
Argyrios Kyrtzidis741fab12011-10-07 22:58:08 +00005928 return;
5929 }
5930
Daniel Dunbarc1964212009-03-26 16:23:12 +00005931 // I'm not sure why this particular decomposition exists in gcc, but
5932 // we follow suite for ease of comparison.
Bill Wendling3b2000f2012-10-02 18:02:50 +00005933 AddLinkArgs(C, Args, CmdArgs, Inputs);
Daniel Dunbarc1964212009-03-26 16:23:12 +00005934
Daniel Dunbarc1964212009-03-26 16:23:12 +00005935 Args.AddAllArgs(CmdArgs, options::OPT_d_Flag);
5936 Args.AddAllArgs(CmdArgs, options::OPT_s);
5937 Args.AddAllArgs(CmdArgs, options::OPT_t);
5938 Args.AddAllArgs(CmdArgs, options::OPT_Z_Flag);
5939 Args.AddAllArgs(CmdArgs, options::OPT_u_Group);
Daniel Dunbarc1964212009-03-26 16:23:12 +00005940 Args.AddLastArg(CmdArgs, options::OPT_e);
Daniel Dunbarc1964212009-03-26 16:23:12 +00005941 Args.AddAllArgs(CmdArgs, options::OPT_r);
5942
Daniel Dunbar767bbab2010-10-18 22:08:36 +00005943 // Forward -ObjC when either -ObjC or -ObjC++ is used, to force loading
5944 // members of static archive libraries which implement Objective-C classes or
5945 // categories.
5946 if (Args.hasArg(options::OPT_ObjC) || Args.hasArg(options::OPT_ObjCXX))
5947 CmdArgs.push_back("-ObjC");
Michael J. Spencer4c0ffa82010-10-21 03:16:25 +00005948
Daniel Dunbarc1964212009-03-26 16:23:12 +00005949 CmdArgs.push_back("-o");
5950 CmdArgs.push_back(Output.getFilename());
5951
Chad Rosier06fd3c62012-05-16 23:45:12 +00005952 if (!Args.hasArg(options::OPT_nostdlib) &&
Tim Northover157d9112014-01-16 08:48:16 +00005953 !Args.hasArg(options::OPT_nostartfiles))
5954 getMachOToolChain().addStartObjectFileArgs(Args, CmdArgs);
Daniel Dunbarc1964212009-03-26 16:23:12 +00005955
5956 Args.AddAllArgs(CmdArgs, options::OPT_L);
Daniel Dunbard067f7f2009-04-08 23:54:23 +00005957
Alexey Bataev186b28a2014-03-06 05:43:53 +00005958 LibOpenMP UsedOpenMPLib = LibUnknown;
5959 if (Args.hasArg(options::OPT_fopenmp)) {
5960 UsedOpenMPLib = LibGOMP;
5961 } else if (const Arg *A = Args.getLastArg(options::OPT_fopenmp_EQ)) {
5962 UsedOpenMPLib = llvm::StringSwitch<LibOpenMP>(A->getValue())
5963 .Case("libgomp", LibGOMP)
5964 .Case("libiomp5", LibIOMP5)
5965 .Default(LibUnknown);
5966 if (UsedOpenMPLib == LibUnknown)
5967 getToolChain().getDriver().Diag(diag::err_drv_unsupported_option_argument)
5968 << A->getOption().getName() << A->getValue();
5969 }
5970 switch (UsedOpenMPLib) {
5971 case LibGOMP:
Daniel Dunbarc1964212009-03-26 16:23:12 +00005972 CmdArgs.push_back("-lgomp");
Alexey Bataev186b28a2014-03-06 05:43:53 +00005973 break;
5974 case LibIOMP5:
5975 CmdArgs.push_back("-liomp5");
5976 break;
5977 case LibUnknown:
5978 break;
5979 }
Daniel Dunbarc1964212009-03-26 16:23:12 +00005980
Douglas Gregor9295df02012-05-15 21:00:27 +00005981 AddLinkerInputs(getToolChain(), Inputs, Args, CmdArgs);
Reid Kleckner0290c9c2014-09-15 17:45:39 +00005982 // Build the input file for -filelist (list of linker input files) in case we
5983 // need it later
5984 for (const auto &II : Inputs) {
5985 if (!II.isFilename()) {
5986 // This is a linker input argument.
5987 // We cannot mix input arguments and file names in a -filelist input, thus
5988 // we prematurely stop our list (remaining files shall be passed as
5989 // arguments).
5990 if (InputFileList.size() > 0)
5991 break;
5992
5993 continue;
5994 }
5995
5996 InputFileList.push_back(II.getFilename());
5997 }
5998
Bob Wilson16d93952012-05-15 18:57:39 +00005999 if (isObjCRuntimeLinked(Args) &&
6000 !Args.hasArg(options::OPT_nostdlib) &&
6001 !Args.hasArg(options::OPT_nodefaultlibs)) {
Tim Northover157d9112014-01-16 08:48:16 +00006002 // We use arclite library for both ARC and subscripting support.
6003 getMachOToolChain().AddLinkARCArgs(Args, CmdArgs);
6004
Bob Wilson7dda0cd2012-04-21 00:21:42 +00006005 CmdArgs.push_back("-framework");
6006 CmdArgs.push_back("Foundation");
Ted Kremeneke65b0862012-03-06 20:05:56 +00006007 // Link libobj.
6008 CmdArgs.push_back("-lobjc");
John McCall24fc0de2011-07-06 00:26:06 +00006009 }
John McCall31168b02011-06-15 23:02:42 +00006010
Daniel Dunbarc1964212009-03-26 16:23:12 +00006011 if (LinkingOutput) {
6012 CmdArgs.push_back("-arch_multiple");
6013 CmdArgs.push_back("-final_output");
6014 CmdArgs.push_back(LinkingOutput);
6015 }
6016
Daniel Dunbarc1964212009-03-26 16:23:12 +00006017 if (Args.hasArg(options::OPT_fnested_functions))
6018 CmdArgs.push_back("-allow_stack_execute");
Daniel Dunbard067f7f2009-04-08 23:54:23 +00006019
Daniel Dunbarc1964212009-03-26 16:23:12 +00006020 if (!Args.hasArg(options::OPT_nostdlib) &&
6021 !Args.hasArg(options::OPT_nodefaultlibs)) {
Hans Wennborg70850d82013-07-18 20:29:38 +00006022 if (getToolChain().getDriver().CCCIsCXX())
Daniel Dunbar3f7796f2010-09-17 01:20:05 +00006023 getToolChain().AddCXXStdlibLibArgs(Args, CmdArgs);
Daniel Dunbarad0f62b2009-04-08 06:06:21 +00006024
Daniel Dunbarc1964212009-03-26 16:23:12 +00006025 // link_ssp spec is empty.
6026
Daniel Dunbar26d482a2009-09-18 08:15:03 +00006027 // Let the tool chain choose which runtime library to link.
Tim Northover157d9112014-01-16 08:48:16 +00006028 getMachOToolChain().AddLinkRuntimeLibArgs(Args, CmdArgs);
Daniel Dunbarc1964212009-03-26 16:23:12 +00006029 }
6030
Chad Rosier06fd3c62012-05-16 23:45:12 +00006031 if (!Args.hasArg(options::OPT_nostdlib) &&
Daniel Dunbarc1964212009-03-26 16:23:12 +00006032 !Args.hasArg(options::OPT_nostartfiles)) {
6033 // endfile_spec is empty.
6034 }
6035
6036 Args.AddAllArgs(CmdArgs, options::OPT_T_Group);
6037 Args.AddAllArgs(CmdArgs, options::OPT_F);
6038
Daniel Dunbard067f7f2009-04-08 23:54:23 +00006039 const char *Exec =
Logan Chieneb9162f2014-06-26 14:23:45 +00006040 Args.MakeArgString(getToolChain().GetLinkerPath());
Reid Kleckner0290c9c2014-09-15 17:45:39 +00006041 std::unique_ptr<Command> Cmd =
6042 llvm::make_unique<Command>(JA, *this, Exec, CmdArgs);
6043 Cmd->setInputFileList(std::move(InputFileList));
6044 C.addCommand(std::move(Cmd));
Daniel Dunbarc1964212009-03-26 16:23:12 +00006045}
6046
Daniel Dunbar64ed5e32009-03-20 00:52:38 +00006047void darwin::Lipo::ConstructJob(Compilation &C, const JobAction &JA,
Daniel Dunbar7fbaf532010-08-02 02:38:28 +00006048 const InputInfo &Output,
Daniel Dunbard067f7f2009-04-08 23:54:23 +00006049 const InputInfoList &Inputs,
6050 const ArgList &Args,
Daniel Dunbar64ed5e32009-03-20 00:52:38 +00006051 const char *LinkingOutput) const {
6052 ArgStringList CmdArgs;
6053
6054 CmdArgs.push_back("-create");
6055 assert(Output.isFilename() && "Unexpected lipo output.");
Daniel Dunbar06686ab2009-03-24 00:24:37 +00006056
6057 CmdArgs.push_back("-output");
Daniel Dunbar64ed5e32009-03-20 00:52:38 +00006058 CmdArgs.push_back(Output.getFilename());
Daniel Dunbar06686ab2009-03-24 00:24:37 +00006059
Saleem Abdulrasool2456cea2014-06-12 02:08:04 +00006060 for (const auto &II : Inputs) {
Daniel Dunbar64ed5e32009-03-20 00:52:38 +00006061 assert(II.isFilename() && "Unexpected lipo input.");
6062 CmdArgs.push_back(II.getFilename());
6063 }
Saleem Abdulrasool2456cea2014-06-12 02:08:04 +00006064
6065 const char *Exec = Args.MakeArgString(getToolChain().GetProgramPath("lipo"));
David Blaikiec11bf802014-09-04 16:04:28 +00006066 C.addCommand(llvm::make_unique<Command>(JA, *this, Exec, CmdArgs));
Daniel Dunbar64ed5e32009-03-20 00:52:38 +00006067}
Daniel Dunbar8eb473c2009-03-31 17:45:15 +00006068
Daniel Dunbar88299622010-06-04 18:28:36 +00006069void darwin::Dsymutil::ConstructJob(Compilation &C, const JobAction &JA,
Daniel Dunbar7fbaf532010-08-02 02:38:28 +00006070 const InputInfo &Output,
Daniel Dunbar88299622010-06-04 18:28:36 +00006071 const InputInfoList &Inputs,
6072 const ArgList &Args,
6073 const char *LinkingOutput) const {
6074 ArgStringList CmdArgs;
6075
Daniel Dunbareb86b042011-05-09 17:23:16 +00006076 CmdArgs.push_back("-o");
6077 CmdArgs.push_back(Output.getFilename());
6078
Daniel Dunbar88299622010-06-04 18:28:36 +00006079 assert(Inputs.size() == 1 && "Unable to handle multiple inputs.");
6080 const InputInfo &Input = Inputs[0];
6081 assert(Input.isFilename() && "Unexpected dsymutil input.");
6082 CmdArgs.push_back(Input.getFilename());
6083
Daniel Dunbar88299622010-06-04 18:28:36 +00006084 const char *Exec =
Daniel Dunbar9c3ed5f2010-07-14 18:46:23 +00006085 Args.MakeArgString(getToolChain().GetProgramPath("dsymutil"));
David Blaikiec11bf802014-09-04 16:04:28 +00006086 C.addCommand(llvm::make_unique<Command>(JA, *this, Exec, CmdArgs));
Daniel Dunbar88299622010-06-04 18:28:36 +00006087}
6088
Eric Christopher551ef452011-08-23 17:56:55 +00006089void darwin::VerifyDebug::ConstructJob(Compilation &C, const JobAction &JA,
Eric Christopher45f2e712012-12-18 00:31:10 +00006090 const InputInfo &Output,
6091 const InputInfoList &Inputs,
6092 const ArgList &Args,
6093 const char *LinkingOutput) const {
Eric Christopher551ef452011-08-23 17:56:55 +00006094 ArgStringList CmdArgs;
6095 CmdArgs.push_back("--verify");
Eric Christopher36222212012-02-06 19:13:09 +00006096 CmdArgs.push_back("--debug-info");
6097 CmdArgs.push_back("--eh-frame");
Eric Christopher65c05fa2012-02-06 19:43:51 +00006098 CmdArgs.push_back("--quiet");
Eric Christopher551ef452011-08-23 17:56:55 +00006099
6100 assert(Inputs.size() == 1 && "Unable to handle multiple inputs.");
6101 const InputInfo &Input = Inputs[0];
6102 assert(Input.isFilename() && "Unexpected verify input");
6103
6104 // Grabbing the output of the earlier dsymutil run.
6105 CmdArgs.push_back(Input.getFilename());
6106
6107 const char *Exec =
6108 Args.MakeArgString(getToolChain().GetProgramPath("dwarfdump"));
David Blaikiec11bf802014-09-04 16:04:28 +00006109 C.addCommand(llvm::make_unique<Command>(JA, *this, Exec, CmdArgs));
Eric Christopher551ef452011-08-23 17:56:55 +00006110}
6111
David Chisnallf571cde2012-02-15 13:39:01 +00006112void solaris::Assemble::ConstructJob(Compilation &C, const JobAction &JA,
6113 const InputInfo &Output,
6114 const InputInfoList &Inputs,
6115 const ArgList &Args,
6116 const char *LinkingOutput) const {
Rafael Espindola577637a2015-01-03 00:06:04 +00006117 claimNoWarnArgs(Args);
David Chisnallf571cde2012-02-15 13:39:01 +00006118 ArgStringList CmdArgs;
6119
6120 Args.AddAllArgValues(CmdArgs, options::OPT_Wa_COMMA,
6121 options::OPT_Xassembler);
6122
6123 CmdArgs.push_back("-o");
6124 CmdArgs.push_back(Output.getFilename());
6125
Saleem Abdulrasool2456cea2014-06-12 02:08:04 +00006126 for (const auto &II : Inputs)
David Chisnallf571cde2012-02-15 13:39:01 +00006127 CmdArgs.push_back(II.getFilename());
David Chisnallf571cde2012-02-15 13:39:01 +00006128
Saleem Abdulrasool2456cea2014-06-12 02:08:04 +00006129 const char *Exec = Args.MakeArgString(getToolChain().GetProgramPath("as"));
David Blaikiec11bf802014-09-04 16:04:28 +00006130 C.addCommand(llvm::make_unique<Command>(JA, *this, Exec, CmdArgs));
David Chisnallf571cde2012-02-15 13:39:01 +00006131}
6132
David Chisnallf571cde2012-02-15 13:39:01 +00006133void solaris::Link::ConstructJob(Compilation &C, const JobAction &JA,
6134 const InputInfo &Output,
6135 const InputInfoList &Inputs,
6136 const ArgList &Args,
6137 const char *LinkingOutput) const {
6138 // FIXME: Find a real GCC, don't hard-code versions here
6139 std::string GCCLibPath = "/usr/gcc/4.5/lib/gcc/";
6140 const llvm::Triple &T = getToolChain().getTriple();
6141 std::string LibPath = "/usr/lib/";
6142 llvm::Triple::ArchType Arch = T.getArch();
6143 switch (Arch) {
Benjamin Kramerb2ccade2013-10-21 12:33:55 +00006144 case llvm::Triple::x86:
6145 GCCLibPath +=
6146 ("i386-" + T.getVendorName() + "-" + T.getOSName()).str() + "/4.5.2/";
6147 break;
6148 case llvm::Triple::x86_64:
6149 GCCLibPath += ("i386-" + T.getVendorName() + "-" + T.getOSName()).str();
6150 GCCLibPath += "/4.5.2/amd64/";
6151 LibPath += "amd64/";
6152 break;
6153 default:
6154 llvm_unreachable("Unsupported architecture");
David Chisnallf571cde2012-02-15 13:39:01 +00006155 }
6156
6157 ArgStringList CmdArgs;
6158
David Chisnall272a0712012-02-29 15:06:12 +00006159 // Demangle C++ names in errors
6160 CmdArgs.push_back("-C");
6161
David Chisnallf571cde2012-02-15 13:39:01 +00006162 if ((!Args.hasArg(options::OPT_nostdlib)) &&
6163 (!Args.hasArg(options::OPT_shared))) {
6164 CmdArgs.push_back("-e");
6165 CmdArgs.push_back("_start");
6166 }
6167
6168 if (Args.hasArg(options::OPT_static)) {
6169 CmdArgs.push_back("-Bstatic");
6170 CmdArgs.push_back("-dn");
6171 } else {
6172 CmdArgs.push_back("-Bdynamic");
6173 if (Args.hasArg(options::OPT_shared)) {
6174 CmdArgs.push_back("-shared");
6175 } else {
6176 CmdArgs.push_back("--dynamic-linker");
6177 CmdArgs.push_back(Args.MakeArgString(LibPath + "ld.so.1"));
6178 }
6179 }
6180
6181 if (Output.isFilename()) {
6182 CmdArgs.push_back("-o");
6183 CmdArgs.push_back(Output.getFilename());
6184 } else {
6185 assert(Output.isNothing() && "Invalid output.");
6186 }
6187
6188 if (!Args.hasArg(options::OPT_nostdlib) &&
6189 !Args.hasArg(options::OPT_nostartfiles)) {
6190 if (!Args.hasArg(options::OPT_shared)) {
6191 CmdArgs.push_back(Args.MakeArgString(LibPath + "crt1.o"));
6192 CmdArgs.push_back(Args.MakeArgString(LibPath + "crti.o"));
David Chisnall0c52c0f2012-02-28 17:10:04 +00006193 CmdArgs.push_back(Args.MakeArgString(LibPath + "values-Xa.o"));
David Chisnallf571cde2012-02-15 13:39:01 +00006194 CmdArgs.push_back(Args.MakeArgString(GCCLibPath + "crtbegin.o"));
6195 } else {
6196 CmdArgs.push_back(Args.MakeArgString(LibPath + "crti.o"));
David Chisnall0c52c0f2012-02-28 17:10:04 +00006197 CmdArgs.push_back(Args.MakeArgString(LibPath + "values-Xa.o"));
6198 CmdArgs.push_back(Args.MakeArgString(GCCLibPath + "crtbegin.o"));
David Chisnallf571cde2012-02-15 13:39:01 +00006199 }
Hans Wennborg70850d82013-07-18 20:29:38 +00006200 if (getToolChain().getDriver().CCCIsCXX())
David Chisnallddc4c9d2012-03-13 14:14:54 +00006201 CmdArgs.push_back(Args.MakeArgString(LibPath + "cxa_finalize.o"));
David Chisnallf571cde2012-02-15 13:39:01 +00006202 }
6203
6204 CmdArgs.push_back(Args.MakeArgString("-L" + GCCLibPath));
6205
6206 Args.AddAllArgs(CmdArgs, options::OPT_L);
6207 Args.AddAllArgs(CmdArgs, options::OPT_T_Group);
6208 Args.AddAllArgs(CmdArgs, options::OPT_e);
David Chisnall0c52c0f2012-02-28 17:10:04 +00006209 Args.AddAllArgs(CmdArgs, options::OPT_r);
David Chisnallf571cde2012-02-15 13:39:01 +00006210
6211 AddLinkerInputs(getToolChain(), Inputs, Args, CmdArgs);
6212
6213 if (!Args.hasArg(options::OPT_nostdlib) &&
6214 !Args.hasArg(options::OPT_nodefaultlibs)) {
Hans Wennborg70850d82013-07-18 20:29:38 +00006215 if (getToolChain().getDriver().CCCIsCXX())
David Chisnall3d127c72012-04-10 11:49:50 +00006216 getToolChain().AddCXXStdlibLibArgs(Args, CmdArgs);
David Chisnall1026fb02012-02-15 18:24:31 +00006217 CmdArgs.push_back("-lgcc_s");
David Chisnall0c52c0f2012-02-28 17:10:04 +00006218 if (!Args.hasArg(options::OPT_shared)) {
6219 CmdArgs.push_back("-lgcc");
David Chisnallf571cde2012-02-15 13:39:01 +00006220 CmdArgs.push_back("-lc");
David Chisnallc73fb892012-02-28 20:06:45 +00006221 CmdArgs.push_back("-lm");
David Chisnall0c52c0f2012-02-28 17:10:04 +00006222 }
David Chisnallf571cde2012-02-15 13:39:01 +00006223 }
6224
6225 if (!Args.hasArg(options::OPT_nostdlib) &&
6226 !Args.hasArg(options::OPT_nostartfiles)) {
David Chisnall0c52c0f2012-02-28 17:10:04 +00006227 CmdArgs.push_back(Args.MakeArgString(GCCLibPath + "crtend.o"));
David Chisnallf571cde2012-02-15 13:39:01 +00006228 }
David Chisnall96de9932012-02-16 16:00:47 +00006229 CmdArgs.push_back(Args.MakeArgString(LibPath + "crtn.o"));
David Chisnallf571cde2012-02-15 13:39:01 +00006230
Alexey Samsonov7811d192014-02-20 13:57:37 +00006231 addProfileRT(getToolChain(), Args, CmdArgs);
David Chisnallf571cde2012-02-15 13:39:01 +00006232
6233 const char *Exec =
Logan Chieneb9162f2014-06-26 14:23:45 +00006234 Args.MakeArgString(getToolChain().GetLinkerPath());
David Blaikiec11bf802014-09-04 16:04:28 +00006235 C.addCommand(llvm::make_unique<Command>(JA, *this, Exec, CmdArgs));
David Chisnallf571cde2012-02-15 13:39:01 +00006236}
6237
Daniel Dunbar10de9e62009-06-29 20:52:51 +00006238void openbsd::Assemble::ConstructJob(Compilation &C, const JobAction &JA,
Daniel Dunbar7fbaf532010-08-02 02:38:28 +00006239 const InputInfo &Output,
Daniel Dunbar10de9e62009-06-29 20:52:51 +00006240 const InputInfoList &Inputs,
6241 const ArgList &Args,
Mike Stump11289f42009-09-09 15:08:12 +00006242 const char *LinkingOutput) const {
Rafael Espindola577637a2015-01-03 00:06:04 +00006243 claimNoWarnArgs(Args);
Daniel Dunbar10de9e62009-06-29 20:52:51 +00006244 ArgStringList CmdArgs;
Rafael Espindolacc126272014-02-28 01:55:21 +00006245 bool NeedsKPIC = false;
Daniel Dunbar10de9e62009-06-29 20:52:51 +00006246
Rafael Espindolacc126272014-02-28 01:55:21 +00006247 switch (getToolChain().getArch()) {
6248 case llvm::Triple::x86:
6249 // When building 32-bit code on OpenBSD/amd64, we have to explicitly
6250 // instruct as in the base system to assemble 32-bit code.
Joerg Sonnenbergeree3b2da2013-12-07 00:57:46 +00006251 CmdArgs.push_back("--32");
Rafael Espindolacc126272014-02-28 01:55:21 +00006252 break;
6253
6254 case llvm::Triple::ppc:
Joerg Sonnenbergeree3b2da2013-12-07 00:57:46 +00006255 CmdArgs.push_back("-mppc");
6256 CmdArgs.push_back("-many");
Rafael Espindolacc126272014-02-28 01:55:21 +00006257 break;
6258
6259 case llvm::Triple::sparc:
6260 CmdArgs.push_back("-32");
6261 NeedsKPIC = true;
6262 break;
6263
6264 case llvm::Triple::sparcv9:
6265 CmdArgs.push_back("-64");
6266 CmdArgs.push_back("-Av9a");
6267 NeedsKPIC = true;
6268 break;
6269
6270 case llvm::Triple::mips64:
6271 case llvm::Triple::mips64el: {
Joerg Sonnenbergeree3b2da2013-12-07 00:57:46 +00006272 StringRef CPUName;
6273 StringRef ABIName;
Simon Atanasyan7018e1d2014-07-16 12:29:22 +00006274 mips::getMipsCPUAndABI(Args, getToolChain().getTriple(), CPUName, ABIName);
Joerg Sonnenbergeree3b2da2013-12-07 00:57:46 +00006275
6276 CmdArgs.push_back("-mabi");
6277 CmdArgs.push_back(getGnuCompatibleMipsABIName(ABIName).data());
6278
6279 if (getToolChain().getArch() == llvm::Triple::mips64)
6280 CmdArgs.push_back("-EB");
6281 else
6282 CmdArgs.push_back("-EL");
6283
Rafael Espindolacc126272014-02-28 01:55:21 +00006284 NeedsKPIC = true;
6285 break;
Joerg Sonnenbergeree3b2da2013-12-07 00:57:46 +00006286 }
6287
Rafael Espindolacc126272014-02-28 01:55:21 +00006288 default:
6289 break;
6290 }
6291
6292 if (NeedsKPIC)
6293 addAssemblerKPIC(Args, CmdArgs);
6294
Daniel Dunbar10de9e62009-06-29 20:52:51 +00006295 Args.AddAllArgValues(CmdArgs, options::OPT_Wa_COMMA,
6296 options::OPT_Xassembler);
6297
6298 CmdArgs.push_back("-o");
Daniel Dunbarb440f562010-08-02 02:38:21 +00006299 CmdArgs.push_back(Output.getFilename());
Daniel Dunbar10de9e62009-06-29 20:52:51 +00006300
Saleem Abdulrasool2456cea2014-06-12 02:08:04 +00006301 for (const auto &II : Inputs)
Daniel Dunbarb440f562010-08-02 02:38:21 +00006302 CmdArgs.push_back(II.getFilename());
Daniel Dunbar10de9e62009-06-29 20:52:51 +00006303
6304 const char *Exec =
Daniel Dunbar9c3ed5f2010-07-14 18:46:23 +00006305 Args.MakeArgString(getToolChain().GetProgramPath("as"));
David Blaikiec11bf802014-09-04 16:04:28 +00006306 C.addCommand(llvm::make_unique<Command>(JA, *this, Exec, CmdArgs));
Daniel Dunbar10de9e62009-06-29 20:52:51 +00006307}
6308
6309void openbsd::Link::ConstructJob(Compilation &C, const JobAction &JA,
Daniel Dunbar7fbaf532010-08-02 02:38:28 +00006310 const InputInfo &Output,
Daniel Dunbar10de9e62009-06-29 20:52:51 +00006311 const InputInfoList &Inputs,
6312 const ArgList &Args,
6313 const char *LinkingOutput) const {
Daniel Dunbar083edf72009-12-21 18:54:17 +00006314 const Driver &D = getToolChain().getDriver();
Daniel Dunbar10de9e62009-06-29 20:52:51 +00006315 ArgStringList CmdArgs;
6316
Rafael Espindolaaadd30e2012-12-31 22:41:36 +00006317 // Silence warning for "clang -g foo.o -o foo"
6318 Args.ClaimAllArgs(options::OPT_g_Group);
6319 // and "clang -emit-llvm foo.o -o foo"
6320 Args.ClaimAllArgs(options::OPT_emit_llvm);
6321 // and for "clang -w foo.o -o foo". Other warning options are already
6322 // handled somewhere else.
6323 Args.ClaimAllArgs(options::OPT_w);
6324
Joerg Sonnenbergeree3b2da2013-12-07 00:57:46 +00006325 if (getToolChain().getArch() == llvm::Triple::mips64)
6326 CmdArgs.push_back("-EB");
6327 else if (getToolChain().getArch() == llvm::Triple::mips64el)
6328 CmdArgs.push_back("-EL");
6329
Daniel Dunbara8888ac2009-08-03 01:28:59 +00006330 if ((!Args.hasArg(options::OPT_nostdlib)) &&
Daniel Dunbar1c7577c2009-11-04 06:24:38 +00006331 (!Args.hasArg(options::OPT_shared))) {
Daniel Dunbara8888ac2009-08-03 01:28:59 +00006332 CmdArgs.push_back("-e");
6333 CmdArgs.push_back("__start");
6334 }
6335
Daniel Dunbar10de9e62009-06-29 20:52:51 +00006336 if (Args.hasArg(options::OPT_static)) {
6337 CmdArgs.push_back("-Bstatic");
6338 } else {
Rafael Espindola7ba97af2010-11-11 02:17:51 +00006339 if (Args.hasArg(options::OPT_rdynamic))
6340 CmdArgs.push_back("-export-dynamic");
Daniel Dunbar10de9e62009-06-29 20:52:51 +00006341 CmdArgs.push_back("--eh-frame-hdr");
Daniel Dunbara8888ac2009-08-03 01:28:59 +00006342 CmdArgs.push_back("-Bdynamic");
Daniel Dunbar10de9e62009-06-29 20:52:51 +00006343 if (Args.hasArg(options::OPT_shared)) {
Daniel Dunbara8888ac2009-08-03 01:28:59 +00006344 CmdArgs.push_back("-shared");
Daniel Dunbar10de9e62009-06-29 20:52:51 +00006345 } else {
6346 CmdArgs.push_back("-dynamic-linker");
6347 CmdArgs.push_back("/usr/libexec/ld.so");
6348 }
6349 }
6350
Rafael Espindola044f7832013-06-05 04:28:55 +00006351 if (Args.hasArg(options::OPT_nopie))
6352 CmdArgs.push_back("-nopie");
6353
Daniel Dunbarb440f562010-08-02 02:38:21 +00006354 if (Output.isFilename()) {
Daniel Dunbar10de9e62009-06-29 20:52:51 +00006355 CmdArgs.push_back("-o");
6356 CmdArgs.push_back(Output.getFilename());
6357 } else {
6358 assert(Output.isNothing() && "Invalid output.");
6359 }
6360
6361 if (!Args.hasArg(options::OPT_nostdlib) &&
6362 !Args.hasArg(options::OPT_nostartfiles)) {
6363 if (!Args.hasArg(options::OPT_shared)) {
Eli Friedman3715d1f2011-12-15 02:15:56 +00006364 if (Args.hasArg(options::OPT_pg))
6365 CmdArgs.push_back(Args.MakeArgString(
6366 getToolChain().GetFilePath("gcrt0.o")));
6367 else
6368 CmdArgs.push_back(Args.MakeArgString(
6369 getToolChain().GetFilePath("crt0.o")));
Chris Lattner3e2ee142010-07-07 16:01:42 +00006370 CmdArgs.push_back(Args.MakeArgString(
Daniel Dunbar9c3ed5f2010-07-14 18:46:23 +00006371 getToolChain().GetFilePath("crtbegin.o")));
Daniel Dunbar10de9e62009-06-29 20:52:51 +00006372 } else {
Chris Lattner3e2ee142010-07-07 16:01:42 +00006373 CmdArgs.push_back(Args.MakeArgString(
Daniel Dunbar9c3ed5f2010-07-14 18:46:23 +00006374 getToolChain().GetFilePath("crtbeginS.o")));
Daniel Dunbar10de9e62009-06-29 20:52:51 +00006375 }
6376 }
6377
Edward O'Callaghan5c521462009-10-28 15:13:08 +00006378 std::string Triple = getToolChain().getTripleString();
6379 if (Triple.substr(0, 6) == "x86_64")
Daniel Dunbar1c7577c2009-11-04 06:24:38 +00006380 Triple.replace(0, 6, "amd64");
Daniel Dunbarb0b18612009-10-29 02:24:37 +00006381 CmdArgs.push_back(Args.MakeArgString("-L/usr/lib/gcc-lib/" + Triple +
Daniel Dunbarea3813f2010-08-01 23:13:54 +00006382 "/4.2.1"));
Daniel Dunbara8888ac2009-08-03 01:28:59 +00006383
Daniel Dunbar10de9e62009-06-29 20:52:51 +00006384 Args.AddAllArgs(CmdArgs, options::OPT_L);
6385 Args.AddAllArgs(CmdArgs, options::OPT_T_Group);
6386 Args.AddAllArgs(CmdArgs, options::OPT_e);
Rafael Espindolaaadd30e2012-12-31 22:41:36 +00006387 Args.AddAllArgs(CmdArgs, options::OPT_s);
6388 Args.AddAllArgs(CmdArgs, options::OPT_t);
6389 Args.AddAllArgs(CmdArgs, options::OPT_Z_Flag);
6390 Args.AddAllArgs(CmdArgs, options::OPT_r);
Daniel Dunbar10de9e62009-06-29 20:52:51 +00006391
Daniel Dunbar54423b22010-09-17 00:24:54 +00006392 AddLinkerInputs(getToolChain(), Inputs, Args, CmdArgs);
Daniel Dunbar10de9e62009-06-29 20:52:51 +00006393
6394 if (!Args.hasArg(options::OPT_nostdlib) &&
6395 !Args.hasArg(options::OPT_nodefaultlibs)) {
Hans Wennborg70850d82013-07-18 20:29:38 +00006396 if (D.CCCIsCXX()) {
Daniel Dunbar3f7796f2010-09-17 01:20:05 +00006397 getToolChain().AddCXXStdlibLibArgs(Args, CmdArgs);
Eli Friedman3715d1f2011-12-15 02:15:56 +00006398 if (Args.hasArg(options::OPT_pg))
6399 CmdArgs.push_back("-lm_p");
6400 else
6401 CmdArgs.push_back("-lm");
Daniel Dunbarea3813f2010-08-01 23:13:54 +00006402 }
6403
Daniel Dunbara8888ac2009-08-03 01:28:59 +00006404 // FIXME: For some reason GCC passes -lgcc before adding
6405 // the default system libraries. Just mimic this for now.
6406 CmdArgs.push_back("-lgcc");
Daniel Dunbar10de9e62009-06-29 20:52:51 +00006407
Eric Christopher17674ec2012-09-13 06:32:34 +00006408 if (Args.hasArg(options::OPT_pthread)) {
6409 if (!Args.hasArg(options::OPT_shared) &&
6410 Args.hasArg(options::OPT_pg))
6411 CmdArgs.push_back("-lpthread_p");
6412 else
6413 CmdArgs.push_back("-lpthread");
6414 }
6415
Chandler Carruth45661652011-12-17 22:32:42 +00006416 if (!Args.hasArg(options::OPT_shared)) {
Eric Christopher17674ec2012-09-13 06:32:34 +00006417 if (Args.hasArg(options::OPT_pg))
Eli Friedman3715d1f2011-12-15 02:15:56 +00006418 CmdArgs.push_back("-lc_p");
6419 else
6420 CmdArgs.push_back("-lc");
Chandler Carruth45661652011-12-17 22:32:42 +00006421 }
Eric Christopher17674ec2012-09-13 06:32:34 +00006422
Daniel Dunbara8888ac2009-08-03 01:28:59 +00006423 CmdArgs.push_back("-lgcc");
Daniel Dunbar10de9e62009-06-29 20:52:51 +00006424 }
6425
6426 if (!Args.hasArg(options::OPT_nostdlib) &&
6427 !Args.hasArg(options::OPT_nostartfiles)) {
6428 if (!Args.hasArg(options::OPT_shared))
Chris Lattner3e2ee142010-07-07 16:01:42 +00006429 CmdArgs.push_back(Args.MakeArgString(
Daniel Dunbar9c3ed5f2010-07-14 18:46:23 +00006430 getToolChain().GetFilePath("crtend.o")));
Daniel Dunbar10de9e62009-06-29 20:52:51 +00006431 else
Chris Lattner3e2ee142010-07-07 16:01:42 +00006432 CmdArgs.push_back(Args.MakeArgString(
Daniel Dunbar9c3ed5f2010-07-14 18:46:23 +00006433 getToolChain().GetFilePath("crtendS.o")));
Daniel Dunbar10de9e62009-06-29 20:52:51 +00006434 }
6435
6436 const char *Exec =
Logan Chieneb9162f2014-06-26 14:23:45 +00006437 Args.MakeArgString(getToolChain().GetLinkerPath());
David Blaikiec11bf802014-09-04 16:04:28 +00006438 C.addCommand(llvm::make_unique<Command>(JA, *this, Exec, CmdArgs));
Daniel Dunbar10de9e62009-06-29 20:52:51 +00006439}
Ed Schoutene33194b2009-04-02 19:13:12 +00006440
Eli Friedman9fa28852012-08-08 23:57:20 +00006441void bitrig::Assemble::ConstructJob(Compilation &C, const JobAction &JA,
6442 const InputInfo &Output,
6443 const InputInfoList &Inputs,
6444 const ArgList &Args,
6445 const char *LinkingOutput) const {
Rafael Espindola577637a2015-01-03 00:06:04 +00006446 claimNoWarnArgs(Args);
Eli Friedman9fa28852012-08-08 23:57:20 +00006447 ArgStringList CmdArgs;
6448
6449 Args.AddAllArgValues(CmdArgs, options::OPT_Wa_COMMA,
6450 options::OPT_Xassembler);
6451
6452 CmdArgs.push_back("-o");
6453 CmdArgs.push_back(Output.getFilename());
6454
Saleem Abdulrasool2456cea2014-06-12 02:08:04 +00006455 for (const auto &II : Inputs)
Eli Friedman9fa28852012-08-08 23:57:20 +00006456 CmdArgs.push_back(II.getFilename());
Eli Friedman9fa28852012-08-08 23:57:20 +00006457
Saleem Abdulrasool2456cea2014-06-12 02:08:04 +00006458 const char *Exec = Args.MakeArgString(getToolChain().GetProgramPath("as"));
David Blaikiec11bf802014-09-04 16:04:28 +00006459 C.addCommand(llvm::make_unique<Command>(JA, *this, Exec, CmdArgs));
Eli Friedman9fa28852012-08-08 23:57:20 +00006460}
6461
6462void bitrig::Link::ConstructJob(Compilation &C, const JobAction &JA,
6463 const InputInfo &Output,
6464 const InputInfoList &Inputs,
6465 const ArgList &Args,
6466 const char *LinkingOutput) const {
6467 const Driver &D = getToolChain().getDriver();
6468 ArgStringList CmdArgs;
6469
6470 if ((!Args.hasArg(options::OPT_nostdlib)) &&
6471 (!Args.hasArg(options::OPT_shared))) {
6472 CmdArgs.push_back("-e");
6473 CmdArgs.push_back("__start");
6474 }
6475
6476 if (Args.hasArg(options::OPT_static)) {
6477 CmdArgs.push_back("-Bstatic");
6478 } else {
6479 if (Args.hasArg(options::OPT_rdynamic))
6480 CmdArgs.push_back("-export-dynamic");
6481 CmdArgs.push_back("--eh-frame-hdr");
6482 CmdArgs.push_back("-Bdynamic");
6483 if (Args.hasArg(options::OPT_shared)) {
6484 CmdArgs.push_back("-shared");
6485 } else {
6486 CmdArgs.push_back("-dynamic-linker");
6487 CmdArgs.push_back("/usr/libexec/ld.so");
6488 }
6489 }
6490
6491 if (Output.isFilename()) {
6492 CmdArgs.push_back("-o");
6493 CmdArgs.push_back(Output.getFilename());
6494 } else {
6495 assert(Output.isNothing() && "Invalid output.");
6496 }
6497
6498 if (!Args.hasArg(options::OPT_nostdlib) &&
6499 !Args.hasArg(options::OPT_nostartfiles)) {
6500 if (!Args.hasArg(options::OPT_shared)) {
6501 if (Args.hasArg(options::OPT_pg))
6502 CmdArgs.push_back(Args.MakeArgString(
6503 getToolChain().GetFilePath("gcrt0.o")));
6504 else
6505 CmdArgs.push_back(Args.MakeArgString(
6506 getToolChain().GetFilePath("crt0.o")));
6507 CmdArgs.push_back(Args.MakeArgString(
6508 getToolChain().GetFilePath("crtbegin.o")));
6509 } else {
6510 CmdArgs.push_back(Args.MakeArgString(
6511 getToolChain().GetFilePath("crtbeginS.o")));
6512 }
6513 }
6514
6515 Args.AddAllArgs(CmdArgs, options::OPT_L);
6516 Args.AddAllArgs(CmdArgs, options::OPT_T_Group);
6517 Args.AddAllArgs(CmdArgs, options::OPT_e);
6518
6519 AddLinkerInputs(getToolChain(), Inputs, Args, CmdArgs);
6520
6521 if (!Args.hasArg(options::OPT_nostdlib) &&
6522 !Args.hasArg(options::OPT_nodefaultlibs)) {
Hans Wennborg70850d82013-07-18 20:29:38 +00006523 if (D.CCCIsCXX()) {
Eli Friedman9fa28852012-08-08 23:57:20 +00006524 getToolChain().AddCXXStdlibLibArgs(Args, CmdArgs);
6525 if (Args.hasArg(options::OPT_pg))
6526 CmdArgs.push_back("-lm_p");
6527 else
6528 CmdArgs.push_back("-lm");
6529 }
6530
Rafael Espindola1ad26f02012-10-23 17:07:31 +00006531 if (Args.hasArg(options::OPT_pthread)) {
6532 if (!Args.hasArg(options::OPT_shared) &&
6533 Args.hasArg(options::OPT_pg))
6534 CmdArgs.push_back("-lpthread_p");
6535 else
6536 CmdArgs.push_back("-lpthread");
6537 }
6538
Eli Friedman9fa28852012-08-08 23:57:20 +00006539 if (!Args.hasArg(options::OPT_shared)) {
6540 if (Args.hasArg(options::OPT_pg))
6541 CmdArgs.push_back("-lc_p");
6542 else
6543 CmdArgs.push_back("-lc");
6544 }
6545
Benjamin Kramerb2ccade2013-10-21 12:33:55 +00006546 StringRef MyArch;
6547 switch (getToolChain().getTriple().getArch()) {
6548 case llvm::Triple::arm:
6549 MyArch = "arm";
6550 break;
6551 case llvm::Triple::x86:
6552 MyArch = "i386";
6553 break;
6554 case llvm::Triple::x86_64:
6555 MyArch = "amd64";
6556 break;
6557 default:
6558 llvm_unreachable("Unsupported architecture");
6559 }
6560 CmdArgs.push_back(Args.MakeArgString("-lclang_rt." + MyArch));
Eli Friedman9fa28852012-08-08 23:57:20 +00006561 }
6562
6563 if (!Args.hasArg(options::OPT_nostdlib) &&
6564 !Args.hasArg(options::OPT_nostartfiles)) {
6565 if (!Args.hasArg(options::OPT_shared))
6566 CmdArgs.push_back(Args.MakeArgString(
6567 getToolChain().GetFilePath("crtend.o")));
6568 else
6569 CmdArgs.push_back(Args.MakeArgString(
6570 getToolChain().GetFilePath("crtendS.o")));
6571 }
Eli Friedman5bb2ba02012-08-09 22:42:04 +00006572
6573 const char *Exec =
Logan Chieneb9162f2014-06-26 14:23:45 +00006574 Args.MakeArgString(getToolChain().GetLinkerPath());
David Blaikiec11bf802014-09-04 16:04:28 +00006575 C.addCommand(llvm::make_unique<Command>(JA, *this, Exec, CmdArgs));
Eli Friedman9fa28852012-08-08 23:57:20 +00006576}
6577
Daniel Dunbar8eb473c2009-03-31 17:45:15 +00006578void freebsd::Assemble::ConstructJob(Compilation &C, const JobAction &JA,
Daniel Dunbar7fbaf532010-08-02 02:38:28 +00006579 const InputInfo &Output,
Daniel Dunbard067f7f2009-04-08 23:54:23 +00006580 const InputInfoList &Inputs,
6581 const ArgList &Args,
Mike Stump11289f42009-09-09 15:08:12 +00006582 const char *LinkingOutput) const {
Rafael Espindola577637a2015-01-03 00:06:04 +00006583 claimNoWarnArgs(Args);
Daniel Dunbar8eb473c2009-03-31 17:45:15 +00006584 ArgStringList CmdArgs;
6585
Daniel Dunbard854c8d2009-04-01 19:36:32 +00006586 // When building 32-bit code on FreeBSD/amd64, we have to explicitly
6587 // instruct as in the base system to assemble 32-bit code.
Eric Christopherc0f1a5e2012-09-05 21:32:44 +00006588 if (getToolChain().getArch() == llvm::Triple::x86)
Daniel Dunbar8eb473c2009-03-31 17:45:15 +00006589 CmdArgs.push_back("--32");
Eric Christopherc0f1a5e2012-09-05 21:32:44 +00006590 else if (getToolChain().getArch() == llvm::Triple::ppc)
Roman Divacky00859c22011-06-04 07:37:31 +00006591 CmdArgs.push_back("-a32");
Eric Christopherc0f1a5e2012-09-05 21:32:44 +00006592 else if (getToolChain().getArch() == llvm::Triple::mips ||
6593 getToolChain().getArch() == llvm::Triple::mipsel ||
6594 getToolChain().getArch() == llvm::Triple::mips64 ||
6595 getToolChain().getArch() == llvm::Triple::mips64el) {
6596 StringRef CPUName;
6597 StringRef ABIName;
Simon Atanasyan7018e1d2014-07-16 12:29:22 +00006598 mips::getMipsCPUAndABI(Args, getToolChain().getTriple(), CPUName, ABIName);
Michael J. Spencer4c0ffa82010-10-21 03:16:25 +00006599
Eric Christopherc0f1a5e2012-09-05 21:32:44 +00006600 CmdArgs.push_back("-march");
6601 CmdArgs.push_back(CPUName.data());
6602
Eric Christopherc0f1a5e2012-09-05 21:32:44 +00006603 CmdArgs.push_back("-mabi");
Simon Atanasyan0da400c2013-02-27 14:55:49 +00006604 CmdArgs.push_back(getGnuCompatibleMipsABIName(ABIName).data());
Eric Christopherc0f1a5e2012-09-05 21:32:44 +00006605
6606 if (getToolChain().getArch() == llvm::Triple::mips ||
6607 getToolChain().getArch() == llvm::Triple::mips64)
6608 CmdArgs.push_back("-EB");
6609 else
6610 CmdArgs.push_back("-EL");
6611
Joerg Sonnenbergerc151b022014-02-19 21:58:52 +00006612 addAssemblerKPIC(Args, CmdArgs);
Rafael Espindola0f207ed2012-12-13 04:17:14 +00006613 } else if (getToolChain().getArch() == llvm::Triple::arm ||
Christian Pirkerf01cd6f2014-03-28 14:40:46 +00006614 getToolChain().getArch() == llvm::Triple::armeb ||
6615 getToolChain().getArch() == llvm::Triple::thumb ||
6616 getToolChain().getArch() == llvm::Triple::thumbeb) {
Renato Golinf4421f72014-02-19 10:44:07 +00006617 const Driver &D = getToolChain().getDriver();
Benjamin Kramer9299637dc2014-03-04 19:31:42 +00006618 const llvm::Triple &Triple = getToolChain().getTriple();
Renato Golinf4421f72014-02-19 10:44:07 +00006619 StringRef FloatABI = arm::getARMFloatABI(D, Args, Triple);
6620
6621 if (FloatABI == "hard") {
6622 CmdArgs.push_back("-mfpu=vfp");
6623 } else {
6624 CmdArgs.push_back("-mfpu=softvfp");
6625 }
6626
Rafael Espindola0f207ed2012-12-13 04:17:14 +00006627 switch(getToolChain().getTriple().getEnvironment()) {
Renato Golinf4421f72014-02-19 10:44:07 +00006628 case llvm::Triple::GNUEABIHF:
Rafael Espindola0f207ed2012-12-13 04:17:14 +00006629 case llvm::Triple::GNUEABI:
6630 case llvm::Triple::EABI:
Anton Korobeynikov2bed8472013-03-18 07:59:20 +00006631 CmdArgs.push_back("-meabi=5");
Rafael Espindola0f207ed2012-12-13 04:17:14 +00006632 break;
6633
6634 default:
6635 CmdArgs.push_back("-matpcs");
6636 }
Roman Divacky47f4ff82014-01-02 15:13:18 +00006637 } else if (getToolChain().getArch() == llvm::Triple::sparc ||
Roman Divackyfeb5e632014-01-02 15:34:59 +00006638 getToolChain().getArch() == llvm::Triple::sparcv9) {
Roman Divacky9f779402014-02-25 18:45:49 +00006639 if (getToolChain().getArch() == llvm::Triple::sparc)
6640 CmdArgs.push_back("-Av8plusa");
6641 else
6642 CmdArgs.push_back("-Av9a");
6643
Joerg Sonnenbergerc151b022014-02-19 21:58:52 +00006644 addAssemblerKPIC(Args, CmdArgs);
Eric Christopherc0f1a5e2012-09-05 21:32:44 +00006645 }
Eric Christopher0b26a612010-03-02 02:41:08 +00006646
Daniel Dunbar8eb473c2009-03-31 17:45:15 +00006647 Args.AddAllArgValues(CmdArgs, options::OPT_Wa_COMMA,
6648 options::OPT_Xassembler);
6649
6650 CmdArgs.push_back("-o");
Daniel Dunbarb440f562010-08-02 02:38:21 +00006651 CmdArgs.push_back(Output.getFilename());
Daniel Dunbar8eb473c2009-03-31 17:45:15 +00006652
Saleem Abdulrasool2456cea2014-06-12 02:08:04 +00006653 for (const auto &II : Inputs)
Daniel Dunbarb440f562010-08-02 02:38:21 +00006654 CmdArgs.push_back(II.getFilename());
Daniel Dunbar8eb473c2009-03-31 17:45:15 +00006655
Saleem Abdulrasool2456cea2014-06-12 02:08:04 +00006656 const char *Exec = Args.MakeArgString(getToolChain().GetProgramPath("as"));
David Blaikiec11bf802014-09-04 16:04:28 +00006657 C.addCommand(llvm::make_unique<Command>(JA, *this, Exec, CmdArgs));
Daniel Dunbar8eb473c2009-03-31 17:45:15 +00006658}
Daniel Dunbard854c8d2009-04-01 19:36:32 +00006659
6660void freebsd::Link::ConstructJob(Compilation &C, const JobAction &JA,
Daniel Dunbar7fbaf532010-08-02 02:38:28 +00006661 const InputInfo &Output,
Daniel Dunbard067f7f2009-04-08 23:54:23 +00006662 const InputInfoList &Inputs,
6663 const ArgList &Args,
Daniel Dunbare3e263f2009-05-02 20:14:53 +00006664 const char *LinkingOutput) const {
Roman Divackyafe2f232012-08-28 15:09:03 +00006665 const toolchains::FreeBSD& ToolChain =
6666 static_cast<const toolchains::FreeBSD&>(getToolChain());
6667 const Driver &D = ToolChain.getDriver();
Alexey Samsonove65ceb92014-02-25 13:26:03 +00006668 const bool IsPIE =
6669 !Args.hasArg(options::OPT_shared) &&
6670 (Args.hasArg(options::OPT_pie) || ToolChain.isPIEDefault());
Daniel Dunbard854c8d2009-04-01 19:36:32 +00006671 ArgStringList CmdArgs;
David Chisnall5f99f482012-07-29 15:24:44 +00006672
6673 // Silence warning for "clang -g foo.o -o foo"
6674 Args.ClaimAllArgs(options::OPT_g_Group);
6675 // and "clang -emit-llvm foo.o -o foo"
6676 Args.ClaimAllArgs(options::OPT_emit_llvm);
6677 // and for "clang -w foo.o -o foo". Other warning options are already
6678 // handled somewhere else.
6679 Args.ClaimAllArgs(options::OPT_w);
Daniel Dunbard854c8d2009-04-01 19:36:32 +00006680
Joerg Sonnenberger6165ab12011-03-21 13:51:29 +00006681 if (!D.SysRoot.empty())
6682 CmdArgs.push_back(Args.MakeArgString("--sysroot=" + D.SysRoot));
6683
Alexey Samsonove65ceb92014-02-25 13:26:03 +00006684 if (IsPIE)
Roman Divackyafe2f232012-08-28 15:09:03 +00006685 CmdArgs.push_back("-pie");
6686
Daniel Dunbard854c8d2009-04-01 19:36:32 +00006687 if (Args.hasArg(options::OPT_static)) {
6688 CmdArgs.push_back("-Bstatic");
6689 } else {
Rafael Espindola7ba97af2010-11-11 02:17:51 +00006690 if (Args.hasArg(options::OPT_rdynamic))
6691 CmdArgs.push_back("-export-dynamic");
Daniel Dunbard854c8d2009-04-01 19:36:32 +00006692 CmdArgs.push_back("--eh-frame-hdr");
6693 if (Args.hasArg(options::OPT_shared)) {
6694 CmdArgs.push_back("-Bshareable");
6695 } else {
6696 CmdArgs.push_back("-dynamic-linker");
6697 CmdArgs.push_back("/libexec/ld-elf.so.1");
6698 }
Roman Divackyafe2f232012-08-28 15:09:03 +00006699 if (ToolChain.getTriple().getOSMajorVersion() >= 9) {
6700 llvm::Triple::ArchType Arch = ToolChain.getArch();
David Chisnall5f99f482012-07-29 15:24:44 +00006701 if (Arch == llvm::Triple::arm || Arch == llvm::Triple::sparc ||
6702 Arch == llvm::Triple::x86 || Arch == llvm::Triple::x86_64) {
6703 CmdArgs.push_back("--hash-style=both");
6704 }
6705 }
6706 CmdArgs.push_back("--enable-new-dtags");
Daniel Dunbard854c8d2009-04-01 19:36:32 +00006707 }
6708
6709 // When building 32-bit code on FreeBSD/amd64, we have to explicitly
6710 // instruct ld in the base system to link 32-bit code.
Rafael Espindola35ca7d92012-10-07 04:44:33 +00006711 if (ToolChain.getArch() == llvm::Triple::x86) {
Daniel Dunbard854c8d2009-04-01 19:36:32 +00006712 CmdArgs.push_back("-m");
6713 CmdArgs.push_back("elf_i386_fbsd");
6714 }
6715
Rafael Espindola35ca7d92012-10-07 04:44:33 +00006716 if (ToolChain.getArch() == llvm::Triple::ppc) {
Roman Divacky5e300b82011-06-04 07:40:24 +00006717 CmdArgs.push_back("-m");
Roman Divackyd150ad32011-11-21 16:50:32 +00006718 CmdArgs.push_back("elf32ppc_fbsd");
Roman Divacky5e300b82011-06-04 07:40:24 +00006719 }
6720
Daniel Dunbarb440f562010-08-02 02:38:21 +00006721 if (Output.isFilename()) {
Daniel Dunbard854c8d2009-04-01 19:36:32 +00006722 CmdArgs.push_back("-o");
6723 CmdArgs.push_back(Output.getFilename());
6724 } else {
6725 assert(Output.isNothing() && "Invalid output.");
6726 }
6727
6728 if (!Args.hasArg(options::OPT_nostdlib) &&
6729 !Args.hasArg(options::OPT_nostartfiles)) {
Craig Topper92fc2df2014-05-17 16:56:41 +00006730 const char *crt1 = nullptr;
Daniel Dunbard854c8d2009-04-01 19:36:32 +00006731 if (!Args.hasArg(options::OPT_shared)) {
Roman Divacky66f22762011-02-10 16:59:40 +00006732 if (Args.hasArg(options::OPT_pg))
Roman Divackyafe2f232012-08-28 15:09:03 +00006733 crt1 = "gcrt1.o";
Alexey Samsonove65ceb92014-02-25 13:26:03 +00006734 else if (IsPIE)
Roman Divackyafe2f232012-08-28 15:09:03 +00006735 crt1 = "Scrt1.o";
6736 else
6737 crt1 = "crt1.o";
Daniel Dunbard854c8d2009-04-01 19:36:32 +00006738 }
Roman Divackyafe2f232012-08-28 15:09:03 +00006739 if (crt1)
6740 CmdArgs.push_back(Args.MakeArgString(ToolChain.GetFilePath(crt1)));
6741
6742 CmdArgs.push_back(Args.MakeArgString(ToolChain.GetFilePath("crti.o")));
6743
Craig Topper92fc2df2014-05-17 16:56:41 +00006744 const char *crtbegin = nullptr;
Roman Divackyafe2f232012-08-28 15:09:03 +00006745 if (Args.hasArg(options::OPT_static))
6746 crtbegin = "crtbeginT.o";
Alexey Samsonove65ceb92014-02-25 13:26:03 +00006747 else if (Args.hasArg(options::OPT_shared) || IsPIE)
Roman Divackyafe2f232012-08-28 15:09:03 +00006748 crtbegin = "crtbeginS.o";
6749 else
6750 crtbegin = "crtbegin.o";
6751
6752 CmdArgs.push_back(Args.MakeArgString(ToolChain.GetFilePath(crtbegin)));
Daniel Dunbard854c8d2009-04-01 19:36:32 +00006753 }
6754
6755 Args.AddAllArgs(CmdArgs, options::OPT_L);
Benjamin Kramer22c68ef2014-09-11 14:13:49 +00006756 const ToolChain::path_list &Paths = ToolChain.getFilePaths();
Saleem Abdulrasool2456cea2014-06-12 02:08:04 +00006757 for (const auto &Path : Paths)
6758 CmdArgs.push_back(Args.MakeArgString(StringRef("-L") + Path));
Daniel Dunbard854c8d2009-04-01 19:36:32 +00006759 Args.AddAllArgs(CmdArgs, options::OPT_T_Group);
6760 Args.AddAllArgs(CmdArgs, options::OPT_e);
David Chisnall589a4942010-08-15 22:58:12 +00006761 Args.AddAllArgs(CmdArgs, options::OPT_s);
6762 Args.AddAllArgs(CmdArgs, options::OPT_t);
6763 Args.AddAllArgs(CmdArgs, options::OPT_Z_Flag);
6764 Args.AddAllArgs(CmdArgs, options::OPT_r);
Daniel Dunbard854c8d2009-04-01 19:36:32 +00006765
Alp Tokerce365ca2013-12-02 12:43:03 +00006766 if (D.IsUsingLTO(Args))
6767 AddGoldPlugin(ToolChain, Args, CmdArgs);
Roman Divackyf0d7f942013-11-10 09:31:43 +00006768
Alexey Samsonov52550342014-09-15 19:58:40 +00006769 bool NeedsSanitizerDeps = addSanitizerRuntimes(ToolChain, Args, CmdArgs);
Roman Divackyafe2f232012-08-28 15:09:03 +00006770 AddLinkerInputs(ToolChain, Inputs, Args, CmdArgs);
Daniel Dunbard854c8d2009-04-01 19:36:32 +00006771
6772 if (!Args.hasArg(options::OPT_nostdlib) &&
6773 !Args.hasArg(options::OPT_nodefaultlibs)) {
Hans Wennborg70850d82013-07-18 20:29:38 +00006774 if (D.CCCIsCXX()) {
Roman Divackyafe2f232012-08-28 15:09:03 +00006775 ToolChain.AddCXXStdlibLibArgs(Args, CmdArgs);
Roman Divacky66f22762011-02-10 16:59:40 +00006776 if (Args.hasArg(options::OPT_pg))
6777 CmdArgs.push_back("-lm_p");
6778 else
6779 CmdArgs.push_back("-lm");
Daniel Dunbar4b8ef282010-02-17 08:07:51 +00006780 }
Alexey Samsonov52550342014-09-15 19:58:40 +00006781 if (NeedsSanitizerDeps)
6782 linkSanitizerRuntimeDeps(ToolChain, CmdArgs);
Daniel Dunbard854c8d2009-04-01 19:36:32 +00006783 // FIXME: For some reason GCC passes -lgcc and -lgcc_s before adding
6784 // the default system libraries. Just mimic this for now.
Roman Divacky66f22762011-02-10 16:59:40 +00006785 if (Args.hasArg(options::OPT_pg))
6786 CmdArgs.push_back("-lgcc_p");
6787 else
6788 CmdArgs.push_back("-lgcc");
Daniel Dunbard854c8d2009-04-01 19:36:32 +00006789 if (Args.hasArg(options::OPT_static)) {
6790 CmdArgs.push_back("-lgcc_eh");
Roman Divacky66f22762011-02-10 16:59:40 +00006791 } else if (Args.hasArg(options::OPT_pg)) {
6792 CmdArgs.push_back("-lgcc_eh_p");
Daniel Dunbard854c8d2009-04-01 19:36:32 +00006793 } else {
6794 CmdArgs.push_back("--as-needed");
6795 CmdArgs.push_back("-lgcc_s");
6796 CmdArgs.push_back("--no-as-needed");
6797 }
6798
Matt Beaumont-Gay1fe49152011-02-10 20:35:01 +00006799 if (Args.hasArg(options::OPT_pthread)) {
Roman Divacky66f22762011-02-10 16:59:40 +00006800 if (Args.hasArg(options::OPT_pg))
6801 CmdArgs.push_back("-lpthread_p");
6802 else
6803 CmdArgs.push_back("-lpthread");
Matt Beaumont-Gay1fe49152011-02-10 20:35:01 +00006804 }
Daniel Dunbard854c8d2009-04-01 19:36:32 +00006805
Roman Divacky66f22762011-02-10 16:59:40 +00006806 if (Args.hasArg(options::OPT_pg)) {
6807 if (Args.hasArg(options::OPT_shared))
6808 CmdArgs.push_back("-lc");
6809 else
6810 CmdArgs.push_back("-lc_p");
6811 CmdArgs.push_back("-lgcc_p");
6812 } else {
6813 CmdArgs.push_back("-lc");
6814 CmdArgs.push_back("-lgcc");
6815 }
6816
Daniel Dunbard854c8d2009-04-01 19:36:32 +00006817 if (Args.hasArg(options::OPT_static)) {
6818 CmdArgs.push_back("-lgcc_eh");
Roman Divacky66f22762011-02-10 16:59:40 +00006819 } else if (Args.hasArg(options::OPT_pg)) {
6820 CmdArgs.push_back("-lgcc_eh_p");
Daniel Dunbard854c8d2009-04-01 19:36:32 +00006821 } else {
6822 CmdArgs.push_back("--as-needed");
6823 CmdArgs.push_back("-lgcc_s");
6824 CmdArgs.push_back("--no-as-needed");
6825 }
6826 }
6827
6828 if (!Args.hasArg(options::OPT_nostdlib) &&
6829 !Args.hasArg(options::OPT_nostartfiles)) {
Alexey Samsonove65ceb92014-02-25 13:26:03 +00006830 if (Args.hasArg(options::OPT_shared) || IsPIE)
Roman Divackyafe2f232012-08-28 15:09:03 +00006831 CmdArgs.push_back(Args.MakeArgString(ToolChain.GetFilePath("crtendS.o")));
Roman Divackya3c50242012-09-07 13:36:21 +00006832 else
6833 CmdArgs.push_back(Args.MakeArgString(ToolChain.GetFilePath("crtend.o")));
Roman Divackyafe2f232012-08-28 15:09:03 +00006834 CmdArgs.push_back(Args.MakeArgString(ToolChain.GetFilePath("crtn.o")));
Daniel Dunbard854c8d2009-04-01 19:36:32 +00006835 }
6836
Alexey Samsonov7811d192014-02-20 13:57:37 +00006837 addProfileRT(ToolChain, Args, CmdArgs);
Nick Lewycky82fe5f42011-05-24 21:54:59 +00006838
Daniel Dunbard067f7f2009-04-08 23:54:23 +00006839 const char *Exec =
Logan Chieneb9162f2014-06-26 14:23:45 +00006840 Args.MakeArgString(getToolChain().GetLinkerPath());
David Blaikiec11bf802014-09-04 16:04:28 +00006841 C.addCommand(llvm::make_unique<Command>(JA, *this, Exec, CmdArgs));
Daniel Dunbard854c8d2009-04-01 19:36:32 +00006842}
Daniel Dunbarcc912342009-05-02 18:28:39 +00006843
Benjamin Kramer24f1d3e2011-02-02 18:59:27 +00006844void netbsd::Assemble::ConstructJob(Compilation &C, const JobAction &JA,
6845 const InputInfo &Output,
6846 const InputInfoList &Inputs,
6847 const ArgList &Args,
6848 const char *LinkingOutput) const {
Rafael Espindola577637a2015-01-03 00:06:04 +00006849 claimNoWarnArgs(Args);
Benjamin Kramer24f1d3e2011-02-02 18:59:27 +00006850 ArgStringList CmdArgs;
6851
Joerg Sonnenberger25e18172014-02-19 22:16:19 +00006852 // GNU as needs different flags for creating the correct output format
6853 // on architectures with different ABIs or optional feature sets.
6854 switch (getToolChain().getArch()) {
6855 case llvm::Triple::x86:
Benjamin Kramer24f1d3e2011-02-02 18:59:27 +00006856 CmdArgs.push_back("--32");
Joerg Sonnenberger25e18172014-02-19 22:16:19 +00006857 break;
6858 case llvm::Triple::arm:
Christian Pirkerf01cd6f2014-03-28 14:40:46 +00006859 case llvm::Triple::armeb:
6860 case llvm::Triple::thumb:
6861 case llvm::Triple::thumbeb: {
Bernard Ogden31561762013-12-12 13:27:11 +00006862 std::string MArch(arm::getARMTargetCPU(Args, getToolChain().getTriple()));
Joerg Sonnenberger1f94da52013-12-05 21:07:29 +00006863 CmdArgs.push_back(Args.MakeArgString("-mcpu=" + MArch));
Joerg Sonnenberger25e18172014-02-19 22:16:19 +00006864 break;
Joerg Sonnenberger1f94da52013-12-05 21:07:29 +00006865 }
6866
Joerg Sonnenberger25e18172014-02-19 22:16:19 +00006867 case llvm::Triple::mips:
6868 case llvm::Triple::mipsel:
6869 case llvm::Triple::mips64:
6870 case llvm::Triple::mips64el: {
Joerg Sonnenberger21baded2013-12-08 13:54:58 +00006871 StringRef CPUName;
6872 StringRef ABIName;
Simon Atanasyan7018e1d2014-07-16 12:29:22 +00006873 mips::getMipsCPUAndABI(Args, getToolChain().getTriple(), CPUName, ABIName);
Joerg Sonnenberger21baded2013-12-08 13:54:58 +00006874
6875 CmdArgs.push_back("-march");
6876 CmdArgs.push_back(CPUName.data());
6877
6878 CmdArgs.push_back("-mabi");
6879 CmdArgs.push_back(getGnuCompatibleMipsABIName(ABIName).data());
6880
6881 if (getToolChain().getArch() == llvm::Triple::mips ||
6882 getToolChain().getArch() == llvm::Triple::mips64)
6883 CmdArgs.push_back("-EB");
6884 else
6885 CmdArgs.push_back("-EL");
6886
Joerg Sonnenbergerc151b022014-02-19 21:58:52 +00006887 addAssemblerKPIC(Args, CmdArgs);
Joerg Sonnenberger25e18172014-02-19 22:16:19 +00006888 break;
6889 }
Joerg Sonnenbergered3f0692014-02-19 22:40:18 +00006890
6891 case llvm::Triple::sparc:
6892 CmdArgs.push_back("-32");
6893 addAssemblerKPIC(Args, CmdArgs);
6894 break;
6895
6896 case llvm::Triple::sparcv9:
6897 CmdArgs.push_back("-64");
6898 CmdArgs.push_back("-Av9");
6899 addAssemblerKPIC(Args, CmdArgs);
6900 break;
6901
Joerg Sonnenberger25e18172014-02-19 22:16:19 +00006902 default:
6903 break;
Joerg Sonnenberger21baded2013-12-08 13:54:58 +00006904 }
Benjamin Kramer24f1d3e2011-02-02 18:59:27 +00006905
6906 Args.AddAllArgValues(CmdArgs, options::OPT_Wa_COMMA,
6907 options::OPT_Xassembler);
6908
6909 CmdArgs.push_back("-o");
6910 CmdArgs.push_back(Output.getFilename());
6911
Saleem Abdulrasool2456cea2014-06-12 02:08:04 +00006912 for (const auto &II : Inputs)
Benjamin Kramer24f1d3e2011-02-02 18:59:27 +00006913 CmdArgs.push_back(II.getFilename());
Benjamin Kramer24f1d3e2011-02-02 18:59:27 +00006914
David Chisnallddbd68f2011-09-27 22:03:18 +00006915 const char *Exec = Args.MakeArgString((getToolChain().GetProgramPath("as")));
David Blaikiec11bf802014-09-04 16:04:28 +00006916 C.addCommand(llvm::make_unique<Command>(JA, *this, Exec, CmdArgs));
Benjamin Kramer24f1d3e2011-02-02 18:59:27 +00006917}
6918
6919void netbsd::Link::ConstructJob(Compilation &C, const JobAction &JA,
6920 const InputInfo &Output,
6921 const InputInfoList &Inputs,
6922 const ArgList &Args,
6923 const char *LinkingOutput) const {
6924 const Driver &D = getToolChain().getDriver();
6925 ArgStringList CmdArgs;
6926
Joerg Sonnenberger6165ab12011-03-21 13:51:29 +00006927 if (!D.SysRoot.empty())
6928 CmdArgs.push_back(Args.MakeArgString("--sysroot=" + D.SysRoot));
6929
Joerg Sonnenberger52be0b42014-03-13 00:42:01 +00006930 CmdArgs.push_back("--eh-frame-hdr");
Benjamin Kramer24f1d3e2011-02-02 18:59:27 +00006931 if (Args.hasArg(options::OPT_static)) {
6932 CmdArgs.push_back("-Bstatic");
6933 } else {
6934 if (Args.hasArg(options::OPT_rdynamic))
6935 CmdArgs.push_back("-export-dynamic");
Benjamin Kramer24f1d3e2011-02-02 18:59:27 +00006936 if (Args.hasArg(options::OPT_shared)) {
6937 CmdArgs.push_back("-Bshareable");
6938 } else {
6939 CmdArgs.push_back("-dynamic-linker");
6940 CmdArgs.push_back("/libexec/ld.elf_so");
6941 }
6942 }
6943
Joerg Sonnenberger6cd7deb2014-02-02 22:50:34 +00006944 // Many NetBSD architectures support more than one ABI.
6945 // Determine the correct emulation for ld.
6946 switch (getToolChain().getArch()) {
6947 case llvm::Triple::x86:
Benjamin Kramer24f1d3e2011-02-02 18:59:27 +00006948 CmdArgs.push_back("-m");
6949 CmdArgs.push_back("elf_i386");
Joerg Sonnenberger6cd7deb2014-02-02 22:50:34 +00006950 break;
6951 case llvm::Triple::arm:
6952 case llvm::Triple::thumb:
Joerg Sonnenberger25de31d2014-02-02 22:47:37 +00006953 CmdArgs.push_back("-m");
6954 switch (getToolChain().getTriple().getEnvironment()) {
6955 case llvm::Triple::EABI:
Joerg Sonnenberger25de31d2014-02-02 22:47:37 +00006956 case llvm::Triple::GNUEABI:
Joerg Sonnenberger25de31d2014-02-02 22:47:37 +00006957 CmdArgs.push_back("armelf_nbsd_eabi");
6958 break;
Joerg Sonnenberger83a33c02014-02-06 21:04:32 +00006959 case llvm::Triple::EABIHF:
6960 case llvm::Triple::GNUEABIHF:
6961 CmdArgs.push_back("armelf_nbsd_eabihf");
6962 break;
Joerg Sonnenberger25de31d2014-02-02 22:47:37 +00006963 default:
6964 CmdArgs.push_back("armelf_nbsd");
6965 break;
6966 }
Joerg Sonnenberger6cd7deb2014-02-02 22:50:34 +00006967 break;
Joerg Sonnenbergerb7045342014-08-14 19:12:41 +00006968 case llvm::Triple::armeb:
6969 case llvm::Triple::thumbeb:
Joerg Sonnenberger1689d3f2015-01-28 23:30:39 +00006970 arm::appendEBLinkFlags(Args, CmdArgs, getToolChain().getTriple());
Joerg Sonnenbergerb7045342014-08-14 19:12:41 +00006971 CmdArgs.push_back("-m");
6972 switch (getToolChain().getTriple().getEnvironment()) {
6973 case llvm::Triple::EABI:
6974 case llvm::Triple::GNUEABI:
6975 CmdArgs.push_back("armelfb_nbsd_eabi");
6976 break;
6977 case llvm::Triple::EABIHF:
6978 case llvm::Triple::GNUEABIHF:
6979 CmdArgs.push_back("armelfb_nbsd_eabihf");
6980 break;
6981 default:
6982 CmdArgs.push_back("armelfb_nbsd");
6983 break;
6984 }
6985 break;
Joerg Sonnenbergere7f97592014-02-02 22:59:16 +00006986 case llvm::Triple::mips64:
6987 case llvm::Triple::mips64el:
Jonathan Roelofs2cea1be2014-02-12 03:21:20 +00006988 if (mips::hasMipsAbiArg(Args, "32")) {
Joerg Sonnenbergere7f97592014-02-02 22:59:16 +00006989 CmdArgs.push_back("-m");
6990 if (getToolChain().getArch() == llvm::Triple::mips64)
6991 CmdArgs.push_back("elf32btsmip");
6992 else
6993 CmdArgs.push_back("elf32ltsmip");
Jonathan Roelofs2cea1be2014-02-12 03:21:20 +00006994 } else if (mips::hasMipsAbiArg(Args, "64")) {
Joerg Sonnenbergere7f97592014-02-02 22:59:16 +00006995 CmdArgs.push_back("-m");
6996 if (getToolChain().getArch() == llvm::Triple::mips64)
6997 CmdArgs.push_back("elf64btsmip");
6998 else
6999 CmdArgs.push_back("elf64ltsmip");
7000 }
7001 break;
Joerg Sonnenbergerdd13b302014-08-13 14:17:32 +00007002 case llvm::Triple::ppc:
7003 CmdArgs.push_back("-m");
7004 CmdArgs.push_back("elf32ppc_nbsd");
7005 break;
7006
7007 case llvm::Triple::ppc64:
7008 case llvm::Triple::ppc64le:
7009 CmdArgs.push_back("-m");
7010 CmdArgs.push_back("elf64ppc");
7011 break;
Joerg Sonnenbergered3f0692014-02-19 22:40:18 +00007012
7013 case llvm::Triple::sparc:
7014 CmdArgs.push_back("-m");
7015 CmdArgs.push_back("elf32_sparc");
7016 break;
7017
7018 case llvm::Triple::sparcv9:
7019 CmdArgs.push_back("-m");
7020 CmdArgs.push_back("elf64_sparc");
7021 break;
7022
Joerg Sonnenberger6cd7deb2014-02-02 22:50:34 +00007023 default:
7024 break;
Joerg Sonnenberger25de31d2014-02-02 22:47:37 +00007025 }
7026
Benjamin Kramer24f1d3e2011-02-02 18:59:27 +00007027 if (Output.isFilename()) {
7028 CmdArgs.push_back("-o");
7029 CmdArgs.push_back(Output.getFilename());
7030 } else {
7031 assert(Output.isNothing() && "Invalid output.");
7032 }
7033
7034 if (!Args.hasArg(options::OPT_nostdlib) &&
7035 !Args.hasArg(options::OPT_nostartfiles)) {
7036 if (!Args.hasArg(options::OPT_shared)) {
7037 CmdArgs.push_back(Args.MakeArgString(
7038 getToolChain().GetFilePath("crt0.o")));
7039 CmdArgs.push_back(Args.MakeArgString(
7040 getToolChain().GetFilePath("crti.o")));
7041 CmdArgs.push_back(Args.MakeArgString(
7042 getToolChain().GetFilePath("crtbegin.o")));
7043 } else {
7044 CmdArgs.push_back(Args.MakeArgString(
7045 getToolChain().GetFilePath("crti.o")));
7046 CmdArgs.push_back(Args.MakeArgString(
7047 getToolChain().GetFilePath("crtbeginS.o")));
7048 }
7049 }
7050
7051 Args.AddAllArgs(CmdArgs, options::OPT_L);
7052 Args.AddAllArgs(CmdArgs, options::OPT_T_Group);
7053 Args.AddAllArgs(CmdArgs, options::OPT_e);
7054 Args.AddAllArgs(CmdArgs, options::OPT_s);
7055 Args.AddAllArgs(CmdArgs, options::OPT_t);
7056 Args.AddAllArgs(CmdArgs, options::OPT_Z_Flag);
7057 Args.AddAllArgs(CmdArgs, options::OPT_r);
7058
7059 AddLinkerInputs(getToolChain(), Inputs, Args, CmdArgs);
7060
Joerg Sonnenbergera4435632013-10-14 20:13:05 +00007061 unsigned Major, Minor, Micro;
7062 getToolChain().getTriple().getOSVersion(Major, Minor, Micro);
7063 bool useLibgcc = true;
Joerg Sonnenbergerc8887572014-07-25 20:57:24 +00007064 if (Major >= 7 || (Major == 6 && Minor == 99 && Micro >= 49) || Major == 0) {
Joerg Sonnenbergerd769a1e2014-01-18 00:50:49 +00007065 switch(getToolChain().getArch()) {
Joerg Sonnenberger323cea92014-08-09 18:28:36 +00007066 case llvm::Triple::aarch64:
Joerg Sonnenberger1ea66472014-05-07 08:45:26 +00007067 case llvm::Triple::arm:
7068 case llvm::Triple::armeb:
7069 case llvm::Triple::thumb:
7070 case llvm::Triple::thumbeb:
Joerg Sonnenbergerc8887572014-07-25 20:57:24 +00007071 case llvm::Triple::ppc:
Joerg Sonnenbergerdd13b302014-08-13 14:17:32 +00007072 case llvm::Triple::ppc64:
7073 case llvm::Triple::ppc64le:
Joerg Sonnenbergerd769a1e2014-01-18 00:50:49 +00007074 case llvm::Triple::x86:
7075 case llvm::Triple::x86_64:
Joerg Sonnenbergera4435632013-10-14 20:13:05 +00007076 useLibgcc = false;
Joerg Sonnenbergerd769a1e2014-01-18 00:50:49 +00007077 break;
7078 default:
7079 break;
7080 }
Joerg Sonnenbergera4435632013-10-14 20:13:05 +00007081 }
7082
Benjamin Kramer24f1d3e2011-02-02 18:59:27 +00007083 if (!Args.hasArg(options::OPT_nostdlib) &&
7084 !Args.hasArg(options::OPT_nodefaultlibs)) {
Hans Wennborg70850d82013-07-18 20:29:38 +00007085 if (D.CCCIsCXX()) {
Benjamin Kramer24f1d3e2011-02-02 18:59:27 +00007086 getToolChain().AddCXXStdlibLibArgs(Args, CmdArgs);
7087 CmdArgs.push_back("-lm");
7088 }
Benjamin Kramer24f1d3e2011-02-02 18:59:27 +00007089 if (Args.hasArg(options::OPT_pthread))
7090 CmdArgs.push_back("-lpthread");
7091 CmdArgs.push_back("-lc");
7092
Joerg Sonnenbergera4435632013-10-14 20:13:05 +00007093 if (useLibgcc) {
7094 if (Args.hasArg(options::OPT_static)) {
7095 // libgcc_eh depends on libc, so resolve as much as possible,
7096 // pull in any new requirements from libc and then get the rest
7097 // of libgcc.
7098 CmdArgs.push_back("-lgcc_eh");
7099 CmdArgs.push_back("-lc");
7100 CmdArgs.push_back("-lgcc");
7101 } else {
7102 CmdArgs.push_back("-lgcc");
7103 CmdArgs.push_back("--as-needed");
7104 CmdArgs.push_back("-lgcc_s");
7105 CmdArgs.push_back("--no-as-needed");
7106 }
Benjamin Kramer24f1d3e2011-02-02 18:59:27 +00007107 }
7108 }
7109
7110 if (!Args.hasArg(options::OPT_nostdlib) &&
7111 !Args.hasArg(options::OPT_nostartfiles)) {
7112 if (!Args.hasArg(options::OPT_shared))
7113 CmdArgs.push_back(Args.MakeArgString(getToolChain().GetFilePath(
7114 "crtend.o")));
7115 else
7116 CmdArgs.push_back(Args.MakeArgString(getToolChain().GetFilePath(
7117 "crtendS.o")));
7118 CmdArgs.push_back(Args.MakeArgString(getToolChain().GetFilePath(
7119 "crtn.o")));
7120 }
7121
Alexey Samsonov7811d192014-02-20 13:57:37 +00007122 addProfileRT(getToolChain(), Args, CmdArgs);
Nick Lewycky82fe5f42011-05-24 21:54:59 +00007123
Logan Chieneb9162f2014-06-26 14:23:45 +00007124 const char *Exec = Args.MakeArgString(getToolChain().GetLinkerPath());
David Blaikiec11bf802014-09-04 16:04:28 +00007125 C.addCommand(llvm::make_unique<Command>(JA, *this, Exec, CmdArgs));
Benjamin Kramer24f1d3e2011-02-02 18:59:27 +00007126}
7127
Thomas Schwinge4e555262013-03-28 19:04:25 +00007128void gnutools::Assemble::ConstructJob(Compilation &C, const JobAction &JA,
7129 const InputInfo &Output,
7130 const InputInfoList &Inputs,
7131 const ArgList &Args,
7132 const char *LinkingOutput) const {
Rafael Espindola577637a2015-01-03 00:06:04 +00007133 claimNoWarnArgs(Args);
7134
Rafael Espindola92b00932010-08-10 00:25:48 +00007135 ArgStringList CmdArgs;
Jakob Stoklund Olesen8d7f5062014-01-12 04:53:36 +00007136 bool NeedsKPIC = false;
Rafael Espindola92b00932010-08-10 00:25:48 +00007137
7138 // Add --32/--64 to make sure we get the format we want.
7139 // This is incomplete
7140 if (getToolChain().getArch() == llvm::Triple::x86) {
7141 CmdArgs.push_back("--32");
7142 } else if (getToolChain().getArch() == llvm::Triple::x86_64) {
Zinovy Nis1db95732014-07-10 15:27:19 +00007143 if (getToolChain().getTriple().getEnvironment() == llvm::Triple::GNUX32)
7144 CmdArgs.push_back("--x32");
7145 else
7146 CmdArgs.push_back("--64");
Eli Friedman4a4932c2011-11-28 23:46:52 +00007147 } else if (getToolChain().getArch() == llvm::Triple::ppc) {
7148 CmdArgs.push_back("-a32");
7149 CmdArgs.push_back("-mppc");
7150 CmdArgs.push_back("-many");
7151 } else if (getToolChain().getArch() == llvm::Triple::ppc64) {
7152 CmdArgs.push_back("-a64");
7153 CmdArgs.push_back("-mppc64");
7154 CmdArgs.push_back("-many");
Bill Schmidt778d3872013-07-26 01:36:11 +00007155 } else if (getToolChain().getArch() == llvm::Triple::ppc64le) {
7156 CmdArgs.push_back("-a64");
Will Schmidtc1fc1902014-03-24 17:10:37 +00007157 CmdArgs.push_back("-mppc64");
Bill Schmidt778d3872013-07-26 01:36:11 +00007158 CmdArgs.push_back("-many");
Will Schmidtc1fc1902014-03-24 17:10:37 +00007159 CmdArgs.push_back("-mlittle-endian");
Jakob Stoklund Olesen2490e552014-01-10 03:51:29 +00007160 } else if (getToolChain().getArch() == llvm::Triple::sparc) {
7161 CmdArgs.push_back("-32");
Jakob Stoklund Olesen58801bf2014-01-11 18:25:01 +00007162 CmdArgs.push_back("-Av8plusa");
Jakob Stoklund Olesen8d7f5062014-01-12 04:53:36 +00007163 NeedsKPIC = true;
Jakob Stoklund Olesen2490e552014-01-10 03:51:29 +00007164 } else if (getToolChain().getArch() == llvm::Triple::sparcv9) {
7165 CmdArgs.push_back("-64");
Jakob Stoklund Olesen58801bf2014-01-11 18:25:01 +00007166 CmdArgs.push_back("-Av9a");
Jakob Stoklund Olesen8d7f5062014-01-12 04:53:36 +00007167 NeedsKPIC = true;
Christian Pirkerf01cd6f2014-03-28 14:40:46 +00007168 } else if (getToolChain().getArch() == llvm::Triple::arm ||
7169 getToolChain().getArch() == llvm::Triple::armeb) {
Chris Lattner0e62c1c2011-07-23 10:55:15 +00007170 StringRef MArch = getToolChain().getArchName();
Rafael Espindola92b00932010-08-10 00:25:48 +00007171 if (MArch == "armv7" || MArch == "armv7a" || MArch == "armv7-a")
7172 CmdArgs.push_back("-mfpu=neon");
Christian Pirkerf01cd6f2014-03-28 14:40:46 +00007173 if (MArch == "armv8" || MArch == "armv8a" || MArch == "armv8-a" ||
7174 MArch == "armebv8" || MArch == "armebv8a" || MArch == "armebv8-a")
Bernard Ogdena58ef052013-10-24 18:32:41 +00007175 CmdArgs.push_back("-mfpu=crypto-neon-fp-armv8");
Evgeniy Stepanoved943f62012-04-20 09:03:40 +00007176
Tim Northover9c7e0352013-12-12 11:55:52 +00007177 StringRef ARMFloatABI = tools::arm::getARMFloatABI(
7178 getToolChain().getDriver(), Args, getToolChain().getTriple());
Evgeniy Stepanoved943f62012-04-20 09:03:40 +00007179 CmdArgs.push_back(Args.MakeArgString("-mfloat-abi=" + ARMFloatABI));
Evgeniy Stepanov582911a2012-04-24 09:05:31 +00007180
7181 Args.AddLastArg(CmdArgs, options::OPT_march_EQ);
Ana Pazosdd6068d2013-12-06 22:43:17 +00007182
7183 // FIXME: remove krait check when GNU tools support krait cpu
7184 // for now replace it with -march=armv7-a to avoid a lower
7185 // march from being picked in the absence of a cpu flag.
7186 Arg *A;
7187 if ((A = Args.getLastArg(options::OPT_mcpu_EQ)) &&
7188 StringRef(A->getValue()) == "krait")
7189 CmdArgs.push_back("-march=armv7-a");
7190 else
7191 Args.AddLastArg(CmdArgs, options::OPT_mcpu_EQ);
Evgeniy Stepanov582911a2012-04-24 09:05:31 +00007192 Args.AddLastArg(CmdArgs, options::OPT_mfpu_EQ);
Akira Hatanaka5e9dde32011-11-30 19:31:38 +00007193 } else if (getToolChain().getArch() == llvm::Triple::mips ||
7194 getToolChain().getArch() == llvm::Triple::mipsel ||
7195 getToolChain().getArch() == llvm::Triple::mips64 ||
7196 getToolChain().getArch() == llvm::Triple::mips64el) {
Simon Atanasyan571d7bd2012-04-07 22:31:29 +00007197 StringRef CPUName;
7198 StringRef ABIName;
Simon Atanasyan7018e1d2014-07-16 12:29:22 +00007199 mips::getMipsCPUAndABI(Args, getToolChain().getTriple(), CPUName, ABIName);
Daniel Sanders379d44b2014-07-16 11:52:23 +00007200 ABIName = getGnuCompatibleMipsABIName(ABIName);
Akira Hatanaka5e9dde32011-11-30 19:31:38 +00007201
Simon Atanasyan571d7bd2012-04-07 22:31:29 +00007202 CmdArgs.push_back("-march");
7203 CmdArgs.push_back(CPUName.data());
7204
Simon Atanasyan571d7bd2012-04-07 22:31:29 +00007205 CmdArgs.push_back("-mabi");
Daniel Sanders379d44b2014-07-16 11:52:23 +00007206 CmdArgs.push_back(ABIName.data());
7207
Daniel Sanders54d8ee62014-07-23 12:06:13 +00007208 // -mno-shared should be emitted unless -fpic, -fpie, -fPIC, -fPIE,
7209 // or -mshared (not implemented) is in effect.
7210 bool IsPicOrPie = false;
7211 if (Arg *A = Args.getLastArg(options::OPT_fPIC, options::OPT_fno_PIC,
7212 options::OPT_fpic, options::OPT_fno_pic,
7213 options::OPT_fPIE, options::OPT_fno_PIE,
7214 options::OPT_fpie, options::OPT_fno_pie)) {
7215 if (A->getOption().matches(options::OPT_fPIC) ||
7216 A->getOption().matches(options::OPT_fpic) ||
7217 A->getOption().matches(options::OPT_fPIE) ||
7218 A->getOption().matches(options::OPT_fpie))
7219 IsPicOrPie = true;
7220 }
7221 if (!IsPicOrPie)
7222 CmdArgs.push_back("-mno-shared");
7223
Daniel Sanders379d44b2014-07-16 11:52:23 +00007224 // LLVM doesn't support -mplt yet and acts as if it is always given.
7225 // However, -mplt has no effect with the N64 ABI.
7226 CmdArgs.push_back(ABIName == "64" ? "-KPIC" : "-call_nonpic");
Simon Atanasyan2390aa12012-04-06 19:15:24 +00007227
7228 if (getToolChain().getArch() == llvm::Triple::mips ||
7229 getToolChain().getArch() == llvm::Triple::mips64)
7230 CmdArgs.push_back("-EB");
7231 else
7232 CmdArgs.push_back("-EL");
Simon Atanasyan217dc2d2012-05-29 19:07:33 +00007233
Simon Atanasyan22127ce2013-09-24 09:09:16 +00007234 if (Arg *A = Args.getLastArg(options::OPT_mnan_EQ)) {
7235 if (StringRef(A->getValue()) == "2008")
7236 CmdArgs.push_back(Args.MakeArgString("-mnan=2008"));
7237 }
7238
Daniel Sanders379d44b2014-07-16 11:52:23 +00007239 // Add the last -mfp32/-mfpxx/-mfp64 or -mfpxx if it is enabled by default.
7240 if (Arg *A = Args.getLastArg(options::OPT_mfp32, options::OPT_mfpxx,
7241 options::OPT_mfp64)) {
7242 A->claim();
7243 A->render(Args, CmdArgs);
7244 } else if (mips::isFPXXDefault(getToolChain().getTriple(), CPUName,
7245 ABIName))
7246 CmdArgs.push_back("-mfpxx");
7247
7248 // Pass on -mmips16 or -mno-mips16. However, the assembler equivalent of
7249 // -mno-mips16 is actually -no-mips16.
7250 if (Arg *A = Args.getLastArg(options::OPT_mips16,
7251 options::OPT_mno_mips16)) {
7252 if (A->getOption().matches(options::OPT_mips16)) {
7253 A->claim();
7254 A->render(Args, CmdArgs);
7255 } else {
7256 A->claim();
7257 CmdArgs.push_back("-no-mips16");
7258 }
7259 }
7260
Simon Atanasyan036d16d2013-04-30 07:47:13 +00007261 Args.AddLastArg(CmdArgs, options::OPT_mmicromips,
7262 options::OPT_mno_micromips);
7263 Args.AddLastArg(CmdArgs, options::OPT_mdsp, options::OPT_mno_dsp);
7264 Args.AddLastArg(CmdArgs, options::OPT_mdspr2, options::OPT_mno_dspr2);
7265
Simon Atanasyanbd986632013-11-26 11:58:04 +00007266 if (Arg *A = Args.getLastArg(options::OPT_mmsa, options::OPT_mno_msa)) {
7267 // Do not use AddLastArg because not all versions of MIPS assembler
7268 // support -mmsa / -mno-msa options.
7269 if (A->getOption().matches(options::OPT_mmsa))
7270 CmdArgs.push_back(Args.MakeArgString("-mmsa"));
7271 }
7272
Daniel Sanders379d44b2014-07-16 11:52:23 +00007273 Args.AddLastArg(CmdArgs, options::OPT_mhard_float,
7274 options::OPT_msoft_float);
7275
7276 Args.AddLastArg(CmdArgs, options::OPT_modd_spreg,
7277 options::OPT_mno_odd_spreg);
7278
Jakob Stoklund Olesen8d7f5062014-01-12 04:53:36 +00007279 NeedsKPIC = true;
7280 } else if (getToolChain().getArch() == llvm::Triple::systemz) {
7281 // Always pass an -march option, since our default of z10 is later
7282 // than the GNU assembler's default.
7283 StringRef CPUName = getSystemZTargetCPU(Args);
7284 CmdArgs.push_back(Args.MakeArgString("-march=" + CPUName));
7285 }
7286
Joerg Sonnenbergerc151b022014-02-19 21:58:52 +00007287 if (NeedsKPIC)
7288 addAssemblerKPIC(Args, CmdArgs);
Rafael Espindola92b00932010-08-10 00:25:48 +00007289
7290 Args.AddAllArgValues(CmdArgs, options::OPT_Wa_COMMA,
7291 options::OPT_Xassembler);
7292
7293 CmdArgs.push_back("-o");
7294 CmdArgs.push_back(Output.getFilename());
7295
Saleem Abdulrasool2456cea2014-06-12 02:08:04 +00007296 for (const auto &II : Inputs)
Rafael Espindola92b00932010-08-10 00:25:48 +00007297 CmdArgs.push_back(II.getFilename());
Rafael Espindola92b00932010-08-10 00:25:48 +00007298
Saleem Abdulrasool2456cea2014-06-12 02:08:04 +00007299 const char *Exec = Args.MakeArgString(getToolChain().GetProgramPath("as"));
David Blaikiec11bf802014-09-04 16:04:28 +00007300 C.addCommand(llvm::make_unique<Command>(JA, *this, Exec, CmdArgs));
Eric Christopher30aa6b62013-06-05 23:58:15 +00007301
7302 // Handle the debug info splitting at object creation time if we're
7303 // creating an object.
7304 // TODO: Currently only works on linux with newer objcopy.
7305 if (Args.hasArg(options::OPT_gsplit_dwarf) &&
Cameron Esfahani556d91e2013-09-14 01:09:11 +00007306 getToolChain().getTriple().isOSLinux())
Eric Christopher30aa6b62013-06-05 23:58:15 +00007307 SplitDebugInfo(getToolChain(), C, *this, JA, Args, Output,
7308 SplitDebugName(Args, Inputs));
Rafael Espindola92b00932010-08-10 00:25:48 +00007309}
7310
Benjamin Kramer9299637dc2014-03-04 19:31:42 +00007311static void AddLibgcc(const llvm::Triple &Triple, const Driver &D,
Evgeniy Stepanov77866712012-04-25 08:59:22 +00007312 ArgStringList &CmdArgs, const ArgList &Args) {
Logan Chienc6fd8202012-09-02 09:30:11 +00007313 bool isAndroid = Triple.getEnvironment() == llvm::Triple::Android;
Chandler Carruth58d6eb62013-03-04 02:07:55 +00007314 bool StaticLibgcc = Args.hasArg(options::OPT_static_libgcc) ||
7315 Args.hasArg(options::OPT_static);
Hans Wennborg70850d82013-07-18 20:29:38 +00007316 if (!D.CCCIsCXX())
Rafael Espindolacc354322011-10-17 21:39:04 +00007317 CmdArgs.push_back("-lgcc");
7318
Logan Chien3d3373c2012-11-19 12:04:11 +00007319 if (StaticLibgcc || isAndroid) {
Hans Wennborg70850d82013-07-18 20:29:38 +00007320 if (D.CCCIsCXX())
Rafael Espindolacc354322011-10-17 21:39:04 +00007321 CmdArgs.push_back("-lgcc");
7322 } else {
Hans Wennborg70850d82013-07-18 20:29:38 +00007323 if (!D.CCCIsCXX())
Rafael Espindolacc354322011-10-17 21:39:04 +00007324 CmdArgs.push_back("--as-needed");
7325 CmdArgs.push_back("-lgcc_s");
Hans Wennborg70850d82013-07-18 20:29:38 +00007326 if (!D.CCCIsCXX())
Rafael Espindolacc354322011-10-17 21:39:04 +00007327 CmdArgs.push_back("--no-as-needed");
7328 }
7329
Evgeniy Stepanov77866712012-04-25 08:59:22 +00007330 if (StaticLibgcc && !isAndroid)
Rafael Espindolacc354322011-10-17 21:39:04 +00007331 CmdArgs.push_back("-lgcc_eh");
Hans Wennborg70850d82013-07-18 20:29:38 +00007332 else if (!Args.hasArg(options::OPT_shared) && D.CCCIsCXX())
Rafael Espindolacc354322011-10-17 21:39:04 +00007333 CmdArgs.push_back("-lgcc");
Logan Chien3d3373c2012-11-19 12:04:11 +00007334
7335 // According to Android ABI, we have to link with libdl if we are
7336 // linking with non-static libgcc.
7337 //
7338 // NOTE: This fixes a link error on Android MIPS as well. The non-static
7339 // libgcc for MIPS relies on _Unwind_Find_FDE and dl_iterate_phdr from libdl.
7340 if (isAndroid && !StaticLibgcc)
7341 CmdArgs.push_back("-ldl");
Rafael Espindolacc354322011-10-17 21:39:04 +00007342}
7343
Simon Atanasyan2c590ff2014-08-04 12:57:52 +00007344static std::string getLinuxDynamicLinker(const ArgList &Args,
7345 const toolchains::Linux &ToolChain) {
Alexey Bataevcf7ae302014-01-23 09:08:32 +00007346 if (ToolChain.getTriple().getEnvironment() == llvm::Triple::Android) {
7347 if (ToolChain.getTriple().isArch64Bit())
7348 return "/system/bin/linker64";
7349 else
7350 return "/system/bin/linker";
7351 } else if (ToolChain.getArch() == llvm::Triple::x86 ||
7352 ToolChain.getArch() == llvm::Triple::sparc)
Peter Collingbourne9d9e1fc2013-05-27 21:40:20 +00007353 return "/lib/ld-linux.so.2";
Tim Northover40956e62014-07-23 12:32:58 +00007354 else if (ToolChain.getArch() == llvm::Triple::aarch64)
Peter Collingbourne9d9e1fc2013-05-27 21:40:20 +00007355 return "/lib/ld-linux-aarch64.so.1";
Tim Northover40956e62014-07-23 12:32:58 +00007356 else if (ToolChain.getArch() == llvm::Triple::aarch64_be)
Christian Pirkera74c7912014-03-14 12:15:45 +00007357 return "/lib/ld-linux-aarch64_be.so.1";
Peter Collingbourne9d9e1fc2013-05-27 21:40:20 +00007358 else if (ToolChain.getArch() == llvm::Triple::arm ||
7359 ToolChain.getArch() == llvm::Triple::thumb) {
7360 if (ToolChain.getTriple().getEnvironment() == llvm::Triple::GNUEABIHF)
7361 return "/lib/ld-linux-armhf.so.3";
7362 else
7363 return "/lib/ld-linux.so.3";
Christian Pirkerf01cd6f2014-03-28 14:40:46 +00007364 } else if (ToolChain.getArch() == llvm::Triple::armeb ||
7365 ToolChain.getArch() == llvm::Triple::thumbeb) {
7366 if (ToolChain.getTriple().getEnvironment() == llvm::Triple::GNUEABIHF)
7367 return "/lib/ld-linux-armhf.so.3"; /* TODO: check which dynamic linker name. */
7368 else
7369 return "/lib/ld-linux.so.3"; /* TODO: check which dynamic linker name. */
Peter Collingbourne9d9e1fc2013-05-27 21:40:20 +00007370 } else if (ToolChain.getArch() == llvm::Triple::mips ||
Simon Atanasyan2c590ff2014-08-04 12:57:52 +00007371 ToolChain.getArch() == llvm::Triple::mipsel ||
7372 ToolChain.getArch() == llvm::Triple::mips64 ||
NAKAMURA Takumid3235e02014-06-25 04:34:00 +00007373 ToolChain.getArch() == llvm::Triple::mips64el) {
Simon Atanasyan2c590ff2014-08-04 12:57:52 +00007374 StringRef CPUName;
7375 StringRef ABIName;
7376 mips::getMipsCPUAndABI(Args, ToolChain.getTriple(), CPUName, ABIName);
7377 bool IsNaN2008 = mips::isNaN2008(Args, ToolChain.getTriple());
7378
7379 StringRef LibDir = llvm::StringSwitch<llvm::StringRef>(ABIName)
7380 .Case("o32", "/lib")
7381 .Case("n32", "/lib32")
7382 .Case("n64", "/lib64")
7383 .Default("/lib");
Simon Atanasyand95c67d2014-08-13 14:34:14 +00007384 StringRef LibName;
7385 if (mips::isUCLibc(Args))
7386 LibName = IsNaN2008 ? "ld-uClibc-mipsn8.so.0" : "ld-uClibc.so.0";
7387 else
7388 LibName = IsNaN2008 ? "ld-linux-mipsn8.so.1" : "ld.so.1";
Simon Atanasyan2c590ff2014-08-04 12:57:52 +00007389
7390 return (LibDir + "/" + LibName).str();
Peter Collingbourne9d9e1fc2013-05-27 21:40:20 +00007391 } else if (ToolChain.getArch() == llvm::Triple::ppc)
7392 return "/lib/ld.so.1";
Ulrich Weigand8afad612014-07-28 13:17:52 +00007393 else if (ToolChain.getArch() == llvm::Triple::ppc64) {
7394 if (ppc::hasPPCAbiArg(Args, "elfv2"))
7395 return "/lib64/ld64.so.2";
Peter Collingbourne9d9e1fc2013-05-27 21:40:20 +00007396 return "/lib64/ld64.so.1";
Ulrich Weigand8afad612014-07-28 13:17:52 +00007397 } else if (ToolChain.getArch() == llvm::Triple::ppc64le) {
7398 if (ppc::hasPPCAbiArg(Args, "elfv1"))
7399 return "/lib64/ld64.so.1";
Ulrich Weigand68e902c2014-06-20 14:19:02 +00007400 return "/lib64/ld64.so.2";
Ulrich Weigand8afad612014-07-28 13:17:52 +00007401 } else if (ToolChain.getArch() == llvm::Triple::systemz)
7402 return "/lib64/ld64.so.1";
Jakob Stoklund Olesen73cb84c2014-01-10 08:18:34 +00007403 else if (ToolChain.getArch() == llvm::Triple::sparcv9)
7404 return "/lib64/ld-linux.so.2";
Zinovy Nis1db95732014-07-10 15:27:19 +00007405 else if (ToolChain.getArch() == llvm::Triple::x86_64 &&
7406 ToolChain.getTriple().getEnvironment() == llvm::Triple::GNUX32)
7407 return "/libx32/ld-linux-x32.so.2";
Peter Collingbourne9d9e1fc2013-05-27 21:40:20 +00007408 else
7409 return "/lib64/ld-linux-x86-64.so.2";
7410}
7411
Renato Golinc4b49242014-02-13 10:01:16 +00007412static void AddRunTimeLibs(const ToolChain &TC, const Driver &D,
Saleem Abdulrasool2e46ebe2014-12-30 22:52:06 +00007413 ArgStringList &CmdArgs, const ArgList &Args) {
Renato Golinc4b49242014-02-13 10:01:16 +00007414 // Make use of compiler-rt if --rtlib option is used
7415 ToolChain::RuntimeLibType RLT = TC.GetRuntimeLibType(Args);
7416
Saleem Abdulrasool8d7ade72014-12-30 02:10:36 +00007417 switch (RLT) {
Renato Golinc4b49242014-02-13 10:01:16 +00007418 case ToolChain::RLT_CompilerRT:
Saleem Abdulrasool543a78b2014-10-24 03:13:37 +00007419 switch (TC.getTriple().getOS()) {
7420 default: llvm_unreachable("unsupported OS");
7421 case llvm::Triple::Win32:
Saleem Abdulrasool543a78b2014-10-24 03:13:37 +00007422 case llvm::Triple::Linux:
Saleem Abdulrasool8d7ade72014-12-30 02:10:36 +00007423 addClangRT(TC, Args, CmdArgs);
Saleem Abdulrasool543a78b2014-10-24 03:13:37 +00007424 break;
7425 }
Renato Golinc4b49242014-02-13 10:01:16 +00007426 break;
7427 case ToolChain::RLT_Libgcc:
7428 AddLibgcc(TC.getTriple(), D, CmdArgs, Args);
7429 break;
Renato Golinc4b49242014-02-13 10:01:16 +00007430 }
7431}
7432
Rafael Espindola1e085772014-08-15 17:14:35 +00007433static const char *getLDMOption(const llvm::Triple &T, const ArgList &Args) {
7434 switch (T.getArch()) {
7435 case llvm::Triple::x86:
7436 return "elf_i386";
7437 case llvm::Triple::aarch64:
7438 return "aarch64linux";
7439 case llvm::Triple::aarch64_be:
7440 return "aarch64_be_linux";
7441 case llvm::Triple::arm:
7442 case llvm::Triple::thumb:
7443 return "armelf_linux_eabi";
7444 case llvm::Triple::armeb:
7445 case llvm::Triple::thumbeb:
7446 return "armebelf_linux_eabi"; /* TODO: check which NAME. */
7447 case llvm::Triple::ppc:
7448 return "elf32ppclinux";
7449 case llvm::Triple::ppc64:
7450 return "elf64ppc";
7451 case llvm::Triple::ppc64le:
7452 return "elf64lppc";
7453 case llvm::Triple::sparc:
7454 return "elf32_sparc";
7455 case llvm::Triple::sparcv9:
7456 return "elf64_sparc";
7457 case llvm::Triple::mips:
7458 return "elf32btsmip";
7459 case llvm::Triple::mipsel:
7460 return "elf32ltsmip";
7461 case llvm::Triple::mips64:
7462 if (mips::hasMipsAbiArg(Args, "n32"))
7463 return "elf32btsmipn32";
7464 return "elf64btsmip";
7465 case llvm::Triple::mips64el:
7466 if (mips::hasMipsAbiArg(Args, "n32"))
7467 return "elf32ltsmipn32";
7468 return "elf64ltsmip";
7469 case llvm::Triple::systemz:
7470 return "elf64_s390";
7471 case llvm::Triple::x86_64:
7472 if (T.getEnvironment() == llvm::Triple::GNUX32)
7473 return "elf32_x86_64";
7474 return "elf_x86_64";
7475 default:
7476 llvm_unreachable("Unexpected arch");
7477 }
7478}
7479
Thomas Schwinge4e555262013-03-28 19:04:25 +00007480void gnutools::Link::ConstructJob(Compilation &C, const JobAction &JA,
7481 const InputInfo &Output,
7482 const InputInfoList &Inputs,
7483 const ArgList &Args,
7484 const char *LinkingOutput) const {
NAKAMURA Takumi557fb622014-06-29 16:00:11 +00007485 const toolchains::Linux& ToolChain =
Rafael Espindolac8f008f2010-11-07 20:14:31 +00007486 static_cast<const toolchains::Linux&>(getToolChain());
7487 const Driver &D = ToolChain.getDriver();
NAKAMURA Takumi557fb622014-06-29 16:00:11 +00007488 const bool isAndroid =
7489 ToolChain.getTriple().getEnvironment() == llvm::Triple::Android;
Peter Collingbourne54d770c2013-04-09 04:35:11 +00007490 const bool IsPIE =
7491 !Args.hasArg(options::OPT_shared) &&
Alexey Volkov06921032014-04-29 10:25:20 +00007492 !Args.hasArg(options::OPT_static) &&
7493 (Args.hasArg(options::OPT_pie) || ToolChain.isPIEDefault() ||
7494 // On Android every code is PIC so every executable is PIE
Alexey Volkov6468f5d2014-04-29 12:07:34 +00007495 // Cannot use isPIEDefault here since otherwise
7496 // PIE only logic will be enabled during compilation
Alexey Volkov06921032014-04-29 10:25:20 +00007497 isAndroid);
Evgeniy Stepanov77866712012-04-25 08:59:22 +00007498
Rafael Espindolac8f008f2010-11-07 20:14:31 +00007499 ArgStringList CmdArgs;
7500
Rafael Espindolad1002f62010-11-15 18:28:16 +00007501 // Silence warning for "clang -g foo.o -o foo"
7502 Args.ClaimAllArgs(options::OPT_g_Group);
Rafael Espindolad95a8122011-03-01 05:25:27 +00007503 // and "clang -emit-llvm foo.o -o foo"
7504 Args.ClaimAllArgs(options::OPT_emit_llvm);
David Chisnall5f99f482012-07-29 15:24:44 +00007505 // and for "clang -w foo.o -o foo". Other warning options are already
Rafael Espindolaf92614c2010-11-17 20:37:10 +00007506 // handled somewhere else.
7507 Args.ClaimAllArgs(options::OPT_w);
Rafael Espindolad1002f62010-11-15 18:28:16 +00007508
Joerg Sonnenberger6165ab12011-03-21 13:51:29 +00007509 if (!D.SysRoot.empty())
7510 CmdArgs.push_back(Args.MakeArgString("--sysroot=" + D.SysRoot));
Rafael Espindolac8f008f2010-11-07 20:14:31 +00007511
Peter Collingbourne54d770c2013-04-09 04:35:11 +00007512 if (IsPIE)
Rafael Espindolad47ac232010-11-17 22:26:15 +00007513 CmdArgs.push_back("-pie");
7514
Rafael Espindola1c76c592010-11-07 22:57:16 +00007515 if (Args.hasArg(options::OPT_rdynamic))
7516 CmdArgs.push_back("-export-dynamic");
7517
Rafael Espindola34d77dc2010-11-11 19:34:42 +00007518 if (Args.hasArg(options::OPT_s))
7519 CmdArgs.push_back("-s");
7520
Joerg Sonnenberger1689d3f2015-01-28 23:30:39 +00007521 if (ToolChain.getArch() == llvm::Triple::armeb ||
7522 ToolChain.getArch() == llvm::Triple::thumbeb)
7523 arm::appendEBLinkFlags(Args, CmdArgs, getToolChain().getTriple());
7524
NAKAMURA Takumi557fb622014-06-29 16:00:11 +00007525 for (const auto &Opt : ToolChain.ExtraOpts)
7526 CmdArgs.push_back(Opt.c_str());
Rafael Espindolac8f008f2010-11-07 20:14:31 +00007527
7528 if (!Args.hasArg(options::OPT_static)) {
7529 CmdArgs.push_back("--eh-frame-hdr");
7530 }
7531
7532 CmdArgs.push_back("-m");
Rafael Espindola1e085772014-08-15 17:14:35 +00007533 CmdArgs.push_back(getLDMOption(ToolChain.getTriple(), Args));
Rafael Espindolac8f008f2010-11-07 20:14:31 +00007534
7535 if (Args.hasArg(options::OPT_static)) {
Joerg Sonnenberger1e205ef2014-02-02 22:36:13 +00007536 if (ToolChain.getArch() == llvm::Triple::arm ||
Christian Pirkerf01cd6f2014-03-28 14:40:46 +00007537 ToolChain.getArch() == llvm::Triple::armeb ||
7538 ToolChain.getArch() == llvm::Triple::thumb ||
7539 ToolChain.getArch() == llvm::Triple::thumbeb)
Rafael Espindolac8f008f2010-11-07 20:14:31 +00007540 CmdArgs.push_back("-Bstatic");
7541 else
7542 CmdArgs.push_back("-static");
7543 } else if (Args.hasArg(options::OPT_shared)) {
7544 CmdArgs.push_back("-shared");
7545 }
7546
NAKAMURA Takumi557fb622014-06-29 16:00:11 +00007547 if (ToolChain.getArch() == llvm::Triple::arm ||
7548 ToolChain.getArch() == llvm::Triple::armeb ||
7549 ToolChain.getArch() == llvm::Triple::thumb ||
7550 ToolChain.getArch() == llvm::Triple::thumbeb ||
7551 (!Args.hasArg(options::OPT_static) &&
7552 !Args.hasArg(options::OPT_shared))) {
7553 CmdArgs.push_back("-dynamic-linker");
7554 CmdArgs.push_back(Args.MakeArgString(
7555 D.DyldPrefix + getLinuxDynamicLinker(Args, ToolChain)));
7556 }
Rafael Espindolac8f008f2010-11-07 20:14:31 +00007557
Ulrich Weigandf32a1ac2015-01-29 19:08:51 +00007558 // Work around a bug in GNU ld (and gold) linker versions up to 2.25
7559 // that may mis-optimize code generated by this version of clang/LLVM
7560 // to access general-dynamic or local-dynamic TLS variables.
7561 if (ToolChain.getArch() == llvm::Triple::ppc64 ||
7562 ToolChain.getArch() == llvm::Triple::ppc64le)
7563 CmdArgs.push_back("--no-tls-optimize");
7564
Rafael Espindolac8f008f2010-11-07 20:14:31 +00007565 CmdArgs.push_back("-o");
7566 CmdArgs.push_back(Output.getFilename());
7567
Rafael Espindola81937ec2010-12-01 01:52:43 +00007568 if (!Args.hasArg(options::OPT_nostdlib) &&
7569 !Args.hasArg(options::OPT_nostartfiles)) {
Evgeniy Stepanov77866712012-04-25 08:59:22 +00007570 if (!isAndroid) {
Craig Topper92fc2df2014-05-17 16:56:41 +00007571 const char *crt1 = nullptr;
Evgeniy Stepanov77866712012-04-25 08:59:22 +00007572 if (!Args.hasArg(options::OPT_shared)){
Eric Christopherac021742013-06-07 23:25:01 +00007573 if (Args.hasArg(options::OPT_pg))
7574 crt1 = "gcrt1.o";
7575 else if (IsPIE)
Evgeniy Stepanov77866712012-04-25 08:59:22 +00007576 crt1 = "Scrt1.o";
7577 else
7578 crt1 = "crt1.o";
7579 }
7580 if (crt1)
7581 CmdArgs.push_back(Args.MakeArgString(ToolChain.GetFilePath(crt1)));
Rafael Espindolac8f008f2010-11-07 20:14:31 +00007582
Evgeniy Stepanov77866712012-04-25 08:59:22 +00007583 CmdArgs.push_back(Args.MakeArgString(ToolChain.GetFilePath("crti.o")));
7584 }
Rafael Espindolac8f008f2010-11-07 20:14:31 +00007585
Rafael Espindola9aa60e92010-11-12 03:00:39 +00007586 const char *crtbegin;
7587 if (Args.hasArg(options::OPT_static))
Evgeniy Stepanov77866712012-04-25 08:59:22 +00007588 crtbegin = isAndroid ? "crtbegin_static.o" : "crtbeginT.o";
Evgeniy Stepanovc9cde482012-09-10 10:30:12 +00007589 else if (Args.hasArg(options::OPT_shared))
Evgeniy Stepanov77866712012-04-25 08:59:22 +00007590 crtbegin = isAndroid ? "crtbegin_so.o" : "crtbeginS.o";
Peter Collingbourne54d770c2013-04-09 04:35:11 +00007591 else if (IsPIE)
Evgeniy Stepanovc9cde482012-09-10 10:30:12 +00007592 crtbegin = isAndroid ? "crtbegin_dynamic.o" : "crtbeginS.o";
Rafael Espindola9aa60e92010-11-12 03:00:39 +00007593 else
Evgeniy Stepanov77866712012-04-25 08:59:22 +00007594 crtbegin = isAndroid ? "crtbegin_dynamic.o" : "crtbegin.o";
Rafael Espindola9aa60e92010-11-12 03:00:39 +00007595 CmdArgs.push_back(Args.MakeArgString(ToolChain.GetFilePath(crtbegin)));
Benjamin Kramer058666a2012-10-04 19:42:20 +00007596
7597 // Add crtfastmath.o if available and fast math is enabled.
7598 ToolChain.AddFastMathRuntimeIfAvailable(Args, CmdArgs);
Rafael Espindola9aa60e92010-11-12 03:00:39 +00007599 }
Rafael Espindolac8f008f2010-11-07 20:14:31 +00007600
7601 Args.AddAllArgs(CmdArgs, options::OPT_L);
Reid Kleckner69071442014-06-26 01:08:54 +00007602 Args.AddAllArgs(CmdArgs, options::OPT_u);
Rafael Espindolac8f008f2010-11-07 20:14:31 +00007603
Benjamin Kramer22c68ef2014-09-11 14:13:49 +00007604 const ToolChain::path_list &Paths = ToolChain.getFilePaths();
Rafael Espindolac8f008f2010-11-07 20:14:31 +00007605
Saleem Abdulrasool2456cea2014-06-12 02:08:04 +00007606 for (const auto &Path : Paths)
7607 CmdArgs.push_back(Args.MakeArgString(StringRef("-L") + Path));
Rafael Espindolac8f008f2010-11-07 20:14:31 +00007608
Alp Tokerce365ca2013-12-02 12:43:03 +00007609 if (D.IsUsingLTO(Args))
7610 AddGoldPlugin(ToolChain, Args, CmdArgs);
Chandler Carruth953fb082013-01-13 11:46:33 +00007611
Nick Lewycky2fe6aab2012-08-17 03:39:16 +00007612 if (Args.hasArg(options::OPT_Z_Xlinker__no_demangle))
7613 CmdArgs.push_back("--no-demangle");
7614
Alexey Samsonov52550342014-09-15 19:58:40 +00007615 bool NeedsSanitizerDeps = addSanitizerRuntimes(ToolChain, Args, CmdArgs);
Rafael Espindolac8f008f2010-11-07 20:14:31 +00007616 AddLinkerInputs(ToolChain, Inputs, Args, CmdArgs);
Chandler Carruthe4458b32013-06-24 09:38:45 +00007617 // The profile runtime also needs access to system libraries.
Alexey Samsonov7811d192014-02-20 13:57:37 +00007618 addProfileRT(getToolChain(), Args, CmdArgs);
Chandler Carruthe4458b32013-06-24 09:38:45 +00007619
Hans Wennborg70850d82013-07-18 20:29:38 +00007620 if (D.CCCIsCXX() &&
Chandler Carruth94a32012012-05-14 18:31:18 +00007621 !Args.hasArg(options::OPT_nostdlib) &&
7622 !Args.hasArg(options::OPT_nodefaultlibs)) {
Rafael Espindola70b8d762011-10-17 22:14:51 +00007623 bool OnlyLibstdcxxStatic = Args.hasArg(options::OPT_static_libstdcxx) &&
7624 !Args.hasArg(options::OPT_static);
7625 if (OnlyLibstdcxxStatic)
7626 CmdArgs.push_back("-Bstatic");
Rafael Espindolac8f008f2010-11-07 20:14:31 +00007627 ToolChain.AddCXXStdlibLibArgs(Args, CmdArgs);
Rafael Espindola70b8d762011-10-17 22:14:51 +00007628 if (OnlyLibstdcxxStatic)
7629 CmdArgs.push_back("-Bdynamic");
Rafael Espindolac8f008f2010-11-07 20:14:31 +00007630 CmdArgs.push_back("-lm");
7631 }
7632
Rafael Espindola9aa60e92010-11-12 03:00:39 +00007633 if (!Args.hasArg(options::OPT_nostdlib)) {
Chandler Carruth94a32012012-05-14 18:31:18 +00007634 if (!Args.hasArg(options::OPT_nodefaultlibs)) {
7635 if (Args.hasArg(options::OPT_static))
7636 CmdArgs.push_back("--start-group");
Nick Lewycky97864da2011-06-04 06:27:06 +00007637
Alexey Samsonov52550342014-09-15 19:58:40 +00007638 if (NeedsSanitizerDeps)
7639 linkSanitizerRuntimeDeps(ToolChain, CmdArgs);
7640
Alexey Bataev186b28a2014-03-06 05:43:53 +00007641 LibOpenMP UsedOpenMPLib = LibUnknown;
7642 if (Args.hasArg(options::OPT_fopenmp)) {
7643 UsedOpenMPLib = LibGOMP;
7644 } else if (const Arg *A = Args.getLastArg(options::OPT_fopenmp_EQ)) {
7645 UsedOpenMPLib = llvm::StringSwitch<LibOpenMP>(A->getValue())
7646 .Case("libgomp", LibGOMP)
7647 .Case("libiomp5", LibIOMP5)
7648 .Default(LibUnknown);
7649 if (UsedOpenMPLib == LibUnknown)
7650 D.Diag(diag::err_drv_unsupported_option_argument)
7651 << A->getOption().getName() << A->getValue();
7652 }
7653 switch (UsedOpenMPLib) {
7654 case LibGOMP:
Chandler Carruth01538002013-01-17 13:19:29 +00007655 CmdArgs.push_back("-lgomp");
7656
Alp Tokerf6a24ce2013-12-05 16:25:25 +00007657 // FIXME: Exclude this for platforms with libgomp that don't require
7658 // librt. Most modern Linux platforms require it, but some may not.
Chandler Carruth01538002013-01-17 13:19:29 +00007659 CmdArgs.push_back("-lrt");
Alexey Bataev186b28a2014-03-06 05:43:53 +00007660 break;
7661 case LibIOMP5:
7662 CmdArgs.push_back("-liomp5");
7663 break;
7664 case LibUnknown:
7665 break;
Chandler Carruth01538002013-01-17 13:19:29 +00007666 }
Renato Golinc4b49242014-02-13 10:01:16 +00007667 AddRunTimeLibs(ToolChain, D, CmdArgs, Args);
Rafael Espindola9aa60e92010-11-12 03:00:39 +00007668
Evgeniy Stepanovdad92062014-06-05 11:41:39 +00007669 if ((Args.hasArg(options::OPT_pthread) ||
7670 Args.hasArg(options::OPT_pthreads) || UsedOpenMPLib != LibUnknown) &&
7671 !isAndroid)
Chandler Carruth94a32012012-05-14 18:31:18 +00007672 CmdArgs.push_back("-lpthread");
7673
7674 CmdArgs.push_back("-lc");
7675
7676 if (Args.hasArg(options::OPT_static))
7677 CmdArgs.push_back("--end-group");
7678 else
Renato Golinc4b49242014-02-13 10:01:16 +00007679 AddRunTimeLibs(ToolChain, D, CmdArgs, Args);
Chandler Carruth94a32012012-05-14 18:31:18 +00007680 }
Rafael Espindolad47ac232010-11-17 22:26:15 +00007681
Rafael Espindola81937ec2010-12-01 01:52:43 +00007682 if (!Args.hasArg(options::OPT_nostartfiles)) {
7683 const char *crtend;
Evgeniy Stepanovc9cde482012-09-10 10:30:12 +00007684 if (Args.hasArg(options::OPT_shared))
Evgeniy Stepanov77866712012-04-25 08:59:22 +00007685 crtend = isAndroid ? "crtend_so.o" : "crtendS.o";
Peter Collingbourne54d770c2013-04-09 04:35:11 +00007686 else if (IsPIE)
Evgeniy Stepanovc9cde482012-09-10 10:30:12 +00007687 crtend = isAndroid ? "crtend_android.o" : "crtendS.o";
Rafael Espindola81937ec2010-12-01 01:52:43 +00007688 else
Evgeniy Stepanov77866712012-04-25 08:59:22 +00007689 crtend = isAndroid ? "crtend_android.o" : "crtend.o";
Rafael Espindola9aa60e92010-11-12 03:00:39 +00007690
Rafael Espindola81937ec2010-12-01 01:52:43 +00007691 CmdArgs.push_back(Args.MakeArgString(ToolChain.GetFilePath(crtend)));
Evgeniy Stepanov77866712012-04-25 08:59:22 +00007692 if (!isAndroid)
7693 CmdArgs.push_back(Args.MakeArgString(ToolChain.GetFilePath("crtn.o")));
Rafael Espindola81937ec2010-12-01 01:52:43 +00007694 }
Rafael Espindolac8f008f2010-11-07 20:14:31 +00007695 }
7696
David Blaikiec11bf802014-09-04 16:04:28 +00007697 C.addCommand(
7698 llvm::make_unique<Command>(JA, *this, ToolChain.Linker.c_str(), CmdArgs));
Saleem Abdulrasoola4a474b2014-06-29 06:11:14 +00007699}
7700
Chris Lattner3e2ee142010-07-07 16:01:42 +00007701void minix::Assemble::ConstructJob(Compilation &C, const JobAction &JA,
Daniel Dunbar7fbaf532010-08-02 02:38:28 +00007702 const InputInfo &Output,
7703 const InputInfoList &Inputs,
7704 const ArgList &Args,
7705 const char *LinkingOutput) const {
Rafael Espindola577637a2015-01-03 00:06:04 +00007706 claimNoWarnArgs(Args);
Chris Lattner3e2ee142010-07-07 16:01:42 +00007707 ArgStringList CmdArgs;
7708
Saleem Abdulrasool2456cea2014-06-12 02:08:04 +00007709 Args.AddAllArgValues(CmdArgs, options::OPT_Wa_COMMA, options::OPT_Xassembler);
Chris Lattner3e2ee142010-07-07 16:01:42 +00007710
7711 CmdArgs.push_back("-o");
Daniel Dunbarb440f562010-08-02 02:38:21 +00007712 CmdArgs.push_back(Output.getFilename());
Chris Lattner3e2ee142010-07-07 16:01:42 +00007713
Saleem Abdulrasool2456cea2014-06-12 02:08:04 +00007714 for (const auto &II : Inputs)
Daniel Dunbarb440f562010-08-02 02:38:21 +00007715 CmdArgs.push_back(II.getFilename());
Chris Lattner3e2ee142010-07-07 16:01:42 +00007716
Saleem Abdulrasool2456cea2014-06-12 02:08:04 +00007717 const char *Exec = Args.MakeArgString(getToolChain().GetProgramPath("as"));
David Blaikiec11bf802014-09-04 16:04:28 +00007718 C.addCommand(llvm::make_unique<Command>(JA, *this, Exec, CmdArgs));
Chris Lattner3e2ee142010-07-07 16:01:42 +00007719}
7720
7721void minix::Link::ConstructJob(Compilation &C, const JobAction &JA,
Daniel Dunbar7fbaf532010-08-02 02:38:28 +00007722 const InputInfo &Output,
7723 const InputInfoList &Inputs,
7724 const ArgList &Args,
7725 const char *LinkingOutput) const {
Chris Lattner3e2ee142010-07-07 16:01:42 +00007726 const Driver &D = getToolChain().getDriver();
7727 ArgStringList CmdArgs;
7728
Daniel Dunbarb440f562010-08-02 02:38:21 +00007729 if (Output.isFilename()) {
Chris Lattner3e2ee142010-07-07 16:01:42 +00007730 CmdArgs.push_back("-o");
7731 CmdArgs.push_back(Output.getFilename());
7732 } else {
7733 assert(Output.isNothing() && "Invalid output.");
7734 }
7735
7736 if (!Args.hasArg(options::OPT_nostdlib) &&
Eli Friedman83de5132011-12-08 23:54:21 +00007737 !Args.hasArg(options::OPT_nostartfiles)) {
7738 CmdArgs.push_back(Args.MakeArgString(getToolChain().GetFilePath("crt1.o")));
7739 CmdArgs.push_back(Args.MakeArgString(getToolChain().GetFilePath("crti.o")));
7740 CmdArgs.push_back(Args.MakeArgString(getToolChain().GetFilePath("crtbegin.o")));
7741 CmdArgs.push_back(Args.MakeArgString(getToolChain().GetFilePath("crtn.o")));
7742 }
Chris Lattner3e2ee142010-07-07 16:01:42 +00007743
7744 Args.AddAllArgs(CmdArgs, options::OPT_L);
7745 Args.AddAllArgs(CmdArgs, options::OPT_T_Group);
7746 Args.AddAllArgs(CmdArgs, options::OPT_e);
7747
Daniel Dunbar54423b22010-09-17 00:24:54 +00007748 AddLinkerInputs(getToolChain(), Inputs, Args, CmdArgs);
Chris Lattner3e2ee142010-07-07 16:01:42 +00007749
Alexey Samsonov7811d192014-02-20 13:57:37 +00007750 addProfileRT(getToolChain(), Args, CmdArgs);
Eli Friedman83de5132011-12-08 23:54:21 +00007751
Chris Lattner3e2ee142010-07-07 16:01:42 +00007752 if (!Args.hasArg(options::OPT_nostdlib) &&
7753 !Args.hasArg(options::OPT_nodefaultlibs)) {
Hans Wennborg70850d82013-07-18 20:29:38 +00007754 if (D.CCCIsCXX()) {
Daniel Dunbar3f7796f2010-09-17 01:20:05 +00007755 getToolChain().AddCXXStdlibLibArgs(Args, CmdArgs);
Chris Lattner3e2ee142010-07-07 16:01:42 +00007756 CmdArgs.push_back("-lm");
7757 }
Chris Lattner3e2ee142010-07-07 16:01:42 +00007758 }
7759
7760 if (!Args.hasArg(options::OPT_nostdlib) &&
7761 !Args.hasArg(options::OPT_nostartfiles)) {
Eli Friedman83de5132011-12-08 23:54:21 +00007762 if (Args.hasArg(options::OPT_pthread))
7763 CmdArgs.push_back("-lpthread");
7764 CmdArgs.push_back("-lc");
7765 CmdArgs.push_back("-lCompilerRT-Generic");
7766 CmdArgs.push_back("-L/usr/pkg/compiler-rt/lib");
7767 CmdArgs.push_back(
Eric Christopher45f2e712012-12-18 00:31:10 +00007768 Args.MakeArgString(getToolChain().GetFilePath("crtend.o")));
Chris Lattner3e2ee142010-07-07 16:01:42 +00007769 }
7770
Logan Chieneb9162f2014-06-26 14:23:45 +00007771 const char *Exec = Args.MakeArgString(getToolChain().GetLinkerPath());
David Blaikiec11bf802014-09-04 16:04:28 +00007772 C.addCommand(llvm::make_unique<Command>(JA, *this, Exec, CmdArgs));
Chris Lattner3e2ee142010-07-07 16:01:42 +00007773}
7774
Daniel Dunbarcc912342009-05-02 18:28:39 +00007775/// DragonFly Tools
7776
7777// For now, DragonFly Assemble does just about the same as for
7778// FreeBSD, but this may change soon.
7779void dragonfly::Assemble::ConstructJob(Compilation &C, const JobAction &JA,
Daniel Dunbar7fbaf532010-08-02 02:38:28 +00007780 const InputInfo &Output,
Daniel Dunbar1c7577c2009-11-04 06:24:38 +00007781 const InputInfoList &Inputs,
7782 const ArgList &Args,
7783 const char *LinkingOutput) const {
Rafael Espindola577637a2015-01-03 00:06:04 +00007784 claimNoWarnArgs(Args);
Daniel Dunbarcc912342009-05-02 18:28:39 +00007785 ArgStringList CmdArgs;
7786
7787 // When building 32-bit code on DragonFly/pc64, we have to explicitly
7788 // instruct as in the base system to assemble 32-bit code.
Rafael Espindola35ca7d92012-10-07 04:44:33 +00007789 if (getToolChain().getArch() == llvm::Triple::x86)
Daniel Dunbarcc912342009-05-02 18:28:39 +00007790 CmdArgs.push_back("--32");
7791
Saleem Abdulrasool2456cea2014-06-12 02:08:04 +00007792 Args.AddAllArgValues(CmdArgs, options::OPT_Wa_COMMA, options::OPT_Xassembler);
Daniel Dunbarcc912342009-05-02 18:28:39 +00007793
7794 CmdArgs.push_back("-o");
Daniel Dunbarb440f562010-08-02 02:38:21 +00007795 CmdArgs.push_back(Output.getFilename());
Daniel Dunbarcc912342009-05-02 18:28:39 +00007796
Saleem Abdulrasool2456cea2014-06-12 02:08:04 +00007797 for (const auto &II : Inputs)
Daniel Dunbarb440f562010-08-02 02:38:21 +00007798 CmdArgs.push_back(II.getFilename());
Daniel Dunbarcc912342009-05-02 18:28:39 +00007799
Saleem Abdulrasool2456cea2014-06-12 02:08:04 +00007800 const char *Exec = Args.MakeArgString(getToolChain().GetProgramPath("as"));
David Blaikiec11bf802014-09-04 16:04:28 +00007801 C.addCommand(llvm::make_unique<Command>(JA, *this, Exec, CmdArgs));
Daniel Dunbarcc912342009-05-02 18:28:39 +00007802}
7803
7804void dragonfly::Link::ConstructJob(Compilation &C, const JobAction &JA,
Daniel Dunbar7fbaf532010-08-02 02:38:28 +00007805 const InputInfo &Output,
7806 const InputInfoList &Inputs,
7807 const ArgList &Args,
7808 const char *LinkingOutput) const {
Daniel Dunbar083edf72009-12-21 18:54:17 +00007809 const Driver &D = getToolChain().getDriver();
Daniel Dunbarcc912342009-05-02 18:28:39 +00007810 ArgStringList CmdArgs;
Rafael Espindola611505f2014-09-11 18:10:13 +00007811 bool UseGCC47 = llvm::sys::fs::exists("/usr/lib/gcc47");
John McCall65b8da02013-04-11 22:55:55 +00007812
Joerg Sonnenberger6165ab12011-03-21 13:51:29 +00007813 if (!D.SysRoot.empty())
7814 CmdArgs.push_back(Args.MakeArgString("--sysroot=" + D.SysRoot));
7815
John McCall65b8da02013-04-11 22:55:55 +00007816 CmdArgs.push_back("--eh-frame-hdr");
Daniel Dunbarcc912342009-05-02 18:28:39 +00007817 if (Args.hasArg(options::OPT_static)) {
7818 CmdArgs.push_back("-Bstatic");
7819 } else {
John McCall65b8da02013-04-11 22:55:55 +00007820 if (Args.hasArg(options::OPT_rdynamic))
7821 CmdArgs.push_back("-export-dynamic");
Daniel Dunbarcc912342009-05-02 18:28:39 +00007822 if (Args.hasArg(options::OPT_shared))
7823 CmdArgs.push_back("-Bshareable");
7824 else {
7825 CmdArgs.push_back("-dynamic-linker");
7826 CmdArgs.push_back("/usr/libexec/ld-elf.so.2");
7827 }
John McCall65b8da02013-04-11 22:55:55 +00007828 CmdArgs.push_back("--hash-style=both");
Daniel Dunbarcc912342009-05-02 18:28:39 +00007829 }
7830
7831 // When building 32-bit code on DragonFly/pc64, we have to explicitly
7832 // instruct ld in the base system to link 32-bit code.
Rafael Espindola35ca7d92012-10-07 04:44:33 +00007833 if (getToolChain().getArch() == llvm::Triple::x86) {
Daniel Dunbarcc912342009-05-02 18:28:39 +00007834 CmdArgs.push_back("-m");
7835 CmdArgs.push_back("elf_i386");
7836 }
7837
Daniel Dunbarb440f562010-08-02 02:38:21 +00007838 if (Output.isFilename()) {
Daniel Dunbarcc912342009-05-02 18:28:39 +00007839 CmdArgs.push_back("-o");
7840 CmdArgs.push_back(Output.getFilename());
7841 } else {
7842 assert(Output.isNothing() && "Invalid output.");
7843 }
7844
7845 if (!Args.hasArg(options::OPT_nostdlib) &&
7846 !Args.hasArg(options::OPT_nostartfiles)) {
7847 if (!Args.hasArg(options::OPT_shared)) {
John McCall65b8da02013-04-11 22:55:55 +00007848 if (Args.hasArg(options::OPT_pg))
7849 CmdArgs.push_back(Args.MakeArgString(
7850 getToolChain().GetFilePath("gcrt1.o")));
7851 else {
7852 if (Args.hasArg(options::OPT_pie))
7853 CmdArgs.push_back(Args.MakeArgString(
7854 getToolChain().GetFilePath("Scrt1.o")));
7855 else
7856 CmdArgs.push_back(Args.MakeArgString(
7857 getToolChain().GetFilePath("crt1.o")));
7858 }
Daniel Dunbarcc912342009-05-02 18:28:39 +00007859 }
John McCall65b8da02013-04-11 22:55:55 +00007860 CmdArgs.push_back(Args.MakeArgString(
7861 getToolChain().GetFilePath("crti.o")));
7862 if (Args.hasArg(options::OPT_shared) || Args.hasArg(options::OPT_pie))
7863 CmdArgs.push_back(Args.MakeArgString(
7864 getToolChain().GetFilePath("crtbeginS.o")));
7865 else
7866 CmdArgs.push_back(Args.MakeArgString(
7867 getToolChain().GetFilePath("crtbegin.o")));
Daniel Dunbarcc912342009-05-02 18:28:39 +00007868 }
7869
7870 Args.AddAllArgs(CmdArgs, options::OPT_L);
7871 Args.AddAllArgs(CmdArgs, options::OPT_T_Group);
7872 Args.AddAllArgs(CmdArgs, options::OPT_e);
7873
Daniel Dunbar54423b22010-09-17 00:24:54 +00007874 AddLinkerInputs(getToolChain(), Inputs, Args, CmdArgs);
Daniel Dunbarcc912342009-05-02 18:28:39 +00007875
7876 if (!Args.hasArg(options::OPT_nostdlib) &&
7877 !Args.hasArg(options::OPT_nodefaultlibs)) {
7878 // FIXME: GCC passes on -lgcc, -lgcc_pic and a whole lot of
7879 // rpaths
John McCall65b8da02013-04-11 22:55:55 +00007880 if (UseGCC47)
7881 CmdArgs.push_back("-L/usr/lib/gcc47");
7882 else
7883 CmdArgs.push_back("-L/usr/lib/gcc44");
Daniel Dunbarcc912342009-05-02 18:28:39 +00007884
7885 if (!Args.hasArg(options::OPT_static)) {
John McCall65b8da02013-04-11 22:55:55 +00007886 if (UseGCC47) {
7887 CmdArgs.push_back("-rpath");
7888 CmdArgs.push_back("/usr/lib/gcc47");
7889 } else {
7890 CmdArgs.push_back("-rpath");
7891 CmdArgs.push_back("/usr/lib/gcc44");
7892 }
Daniel Dunbarcc912342009-05-02 18:28:39 +00007893 }
7894
Hans Wennborg70850d82013-07-18 20:29:38 +00007895 if (D.CCCIsCXX()) {
Daniel Dunbar3f7796f2010-09-17 01:20:05 +00007896 getToolChain().AddCXXStdlibLibArgs(Args, CmdArgs);
Rafael Espindola38360b32010-07-20 12:59:03 +00007897 CmdArgs.push_back("-lm");
7898 }
7899
Daniel Dunbarcc912342009-05-02 18:28:39 +00007900 if (Args.hasArg(options::OPT_pthread))
Mike Stump0a65b632009-10-31 20:11:46 +00007901 CmdArgs.push_back("-lpthread");
Daniel Dunbarcc912342009-05-02 18:28:39 +00007902
7903 if (!Args.hasArg(options::OPT_nolibc)) {
7904 CmdArgs.push_back("-lc");
7905 }
7906
John McCall65b8da02013-04-11 22:55:55 +00007907 if (UseGCC47) {
7908 if (Args.hasArg(options::OPT_static) ||
7909 Args.hasArg(options::OPT_static_libgcc)) {
7910 CmdArgs.push_back("-lgcc");
7911 CmdArgs.push_back("-lgcc_eh");
7912 } else {
7913 if (Args.hasArg(options::OPT_shared_libgcc)) {
7914 CmdArgs.push_back("-lgcc_pic");
7915 if (!Args.hasArg(options::OPT_shared))
7916 CmdArgs.push_back("-lgcc");
7917 } else {
7918 CmdArgs.push_back("-lgcc");
7919 CmdArgs.push_back("--as-needed");
7920 CmdArgs.push_back("-lgcc_pic");
7921 CmdArgs.push_back("--no-as-needed");
7922 }
7923 }
Daniel Dunbarcc912342009-05-02 18:28:39 +00007924 } else {
John McCall65b8da02013-04-11 22:55:55 +00007925 if (Args.hasArg(options::OPT_shared)) {
7926 CmdArgs.push_back("-lgcc_pic");
7927 } else {
7928 CmdArgs.push_back("-lgcc");
7929 }
Daniel Dunbarcc912342009-05-02 18:28:39 +00007930 }
7931 }
7932
7933 if (!Args.hasArg(options::OPT_nostdlib) &&
7934 !Args.hasArg(options::OPT_nostartfiles)) {
John McCall65b8da02013-04-11 22:55:55 +00007935 if (Args.hasArg(options::OPT_shared) || Args.hasArg(options::OPT_pie))
Chris Lattner3e2ee142010-07-07 16:01:42 +00007936 CmdArgs.push_back(Args.MakeArgString(
Daniel Dunbar9c3ed5f2010-07-14 18:46:23 +00007937 getToolChain().GetFilePath("crtendS.o")));
John McCall65b8da02013-04-11 22:55:55 +00007938 else
7939 CmdArgs.push_back(Args.MakeArgString(
7940 getToolChain().GetFilePath("crtend.o")));
Chris Lattner3e2ee142010-07-07 16:01:42 +00007941 CmdArgs.push_back(Args.MakeArgString(
John McCall65b8da02013-04-11 22:55:55 +00007942 getToolChain().GetFilePath("crtn.o")));
Daniel Dunbarcc912342009-05-02 18:28:39 +00007943 }
7944
Alexey Samsonov7811d192014-02-20 13:57:37 +00007945 addProfileRT(getToolChain(), Args, CmdArgs);
Nick Lewycky82fe5f42011-05-24 21:54:59 +00007946
Logan Chieneb9162f2014-06-26 14:23:45 +00007947 const char *Exec = Args.MakeArgString(getToolChain().GetLinkerPath());
David Blaikiec11bf802014-09-04 16:04:28 +00007948 C.addCommand(llvm::make_unique<Command>(JA, *this, Exec, CmdArgs));
Daniel Dunbarcc912342009-05-02 18:28:39 +00007949}
Michael J. Spencerb186bc32010-08-21 21:55:07 +00007950
Zachary Turner0eaf8fc2014-10-22 20:40:28 +00007951// Try to find Exe from a Visual Studio distribution. This first tries to find
7952// an installed copy of Visual Studio and, failing that, looks in the PATH,
7953// making sure that whatever executable that's found is not a same-named exe
7954// from clang itself to prevent clang from falling back to itself.
7955static std::string FindVisualStudioExecutable(const ToolChain &TC,
7956 const char *Exe,
7957 const char *ClangProgramPath) {
7958 const auto &MSVC = static_cast<const toolchains::MSVCToolChain &>(TC);
7959 std::string visualStudioBinDir;
7960 if (MSVC.getVisualStudioBinariesFolder(ClangProgramPath,
7961 visualStudioBinDir)) {
7962 SmallString<128> FilePath(visualStudioBinDir);
7963 llvm::sys::path::append(FilePath, Exe);
7964 if (llvm::sys::fs::can_execute(FilePath.c_str()))
7965 return FilePath.str();
7966 }
7967
7968 return Exe;
7969}
7970
Michael J. Spencerb186bc32010-08-21 21:55:07 +00007971void visualstudio::Link::ConstructJob(Compilation &C, const JobAction &JA,
7972 const InputInfo &Output,
7973 const InputInfoList &Inputs,
7974 const ArgList &Args,
7975 const char *LinkingOutput) const {
Michael J. Spencerb186bc32010-08-21 21:55:07 +00007976 ArgStringList CmdArgs;
Saleem Abdulrasool21b18762014-12-19 23:56:28 +00007977 const ToolChain &TC = getToolChain();
Michael J. Spencerb186bc32010-08-21 21:55:07 +00007978
Saleem Abdulrasool9a215462014-12-19 23:56:31 +00007979 assert((Output.isFilename() || Output.isNothing()) && "invalid output");
7980 if (Output.isFilename())
Daniel Dunbar2cc3f172010-09-17 00:45:02 +00007981 CmdArgs.push_back(Args.MakeArgString(std::string("-out:") +
7982 Output.getFilename()));
Michael J. Spencerb186bc32010-08-21 21:55:07 +00007983
7984 if (!Args.hasArg(options::OPT_nostdlib) &&
Saleem Abdulrasool9a215462014-12-19 23:56:31 +00007985 !Args.hasArg(options::OPT_nostartfiles) && !C.getDriver().IsCLMode())
Michael J. Spencerb186bc32010-08-21 21:55:07 +00007986 CmdArgs.push_back("-defaultlib:libcmt");
Michael J. Spencerb186bc32010-08-21 21:55:07 +00007987
Zachary Turner10d75b22014-10-22 20:40:43 +00007988 if (!llvm::sys::Process::GetEnv("LIB")) {
7989 // If the VC environment hasn't been configured (perhaps because the user
7990 // did not run vcvarsall), try to build a consistent link environment. If
7991 // the environment variable is set however, assume the user knows what he's
7992 // doing.
7993 std::string VisualStudioDir;
Saleem Abdulrasool21b18762014-12-19 23:56:28 +00007994 const auto &MSVC = static_cast<const toolchains::MSVCToolChain &>(TC);
Zachary Turner10d75b22014-10-22 20:40:43 +00007995 if (MSVC.getVisualStudioInstallDir(VisualStudioDir)) {
7996 SmallString<128> LibDir(VisualStudioDir);
7997 llvm::sys::path::append(LibDir, "VC", "lib");
7998 switch (MSVC.getArch()) {
7999 case llvm::Triple::x86:
8000 // x86 just puts the libraries directly in lib
8001 break;
8002 case llvm::Triple::x86_64:
8003 llvm::sys::path::append(LibDir, "amd64");
8004 break;
8005 case llvm::Triple::arm:
8006 llvm::sys::path::append(LibDir, "arm");
8007 break;
8008 default:
8009 break;
8010 }
8011 CmdArgs.push_back(
8012 Args.MakeArgString(std::string("-libpath:") + LibDir.c_str()));
8013 }
8014
8015 std::string WindowsSdkLibPath;
8016 if (MSVC.getWindowsSDKLibraryPath(WindowsSdkLibPath))
8017 CmdArgs.push_back(Args.MakeArgString(std::string("-libpath:") +
8018 WindowsSdkLibPath.c_str()));
8019 }
8020
Michael J. Spencerb186bc32010-08-21 21:55:07 +00008021 CmdArgs.push_back("-nologo");
8022
Saleem Abdulrasool9a215462014-12-19 23:56:31 +00008023 if (Args.hasArg(options::OPT_g_Group))
Hans Wennborgbbb5f072014-04-25 16:24:19 +00008024 CmdArgs.push_back("-debug");
Hans Wennborgbbb5f072014-04-25 16:24:19 +00008025
Hans Wennborgf1a74252013-09-10 20:18:04 +00008026 bool DLL = Args.hasArg(options::OPT__SLASH_LD, options::OPT__SLASH_LDd);
Hans Wennborgf1a74252013-09-10 20:18:04 +00008027 if (DLL) {
8028 CmdArgs.push_back(Args.MakeArgString("-dll"));
8029
8030 SmallString<128> ImplibName(Output.getFilename());
8031 llvm::sys::path::replace_extension(ImplibName, "lib");
8032 CmdArgs.push_back(Args.MakeArgString(std::string("-implib:") +
8033 ImplibName.str()));
8034 }
8035
Saleem Abdulrasool21b18762014-12-19 23:56:28 +00008036 if (TC.getSanitizerArgs().needsAsanRt()) {
Hans Wennborg0517e752013-08-28 17:36:07 +00008037 CmdArgs.push_back(Args.MakeArgString("-debug"));
Hans Wennborgd024c1c2013-08-30 10:50:52 +00008038 CmdArgs.push_back(Args.MakeArgString("-incremental:no"));
Timur Iskhodzhanov6903e102014-08-26 10:08:24 +00008039 if (Args.hasArg(options::OPT__SLASH_MD, options::OPT__SLASH_MDd)) {
Saleem Abdulrasool1d59f492015-01-02 20:00:55 +00008040 static const char *CompilerRTComponents[] = {
8041 "asan_dynamic",
8042 "asan_dynamic_runtime_thunk",
8043 };
8044 for (const auto &Component : CompilerRTComponents)
8045 CmdArgs.push_back(Args.MakeArgString(getCompilerRT(TC, Component)));
Timur Iskhodzhanov651725e2014-09-12 14:01:30 +00008046 // Make sure the dynamic runtime thunk is not optimized out at link time
8047 // to ensure proper SEH handling.
8048 CmdArgs.push_back(Args.MakeArgString("-include:___asan_seh_interceptor"));
Timur Iskhodzhanov6903e102014-08-26 10:08:24 +00008049 } else if (DLL) {
Saleem Abdulrasool1d59f492015-01-02 20:00:55 +00008050 CmdArgs.push_back(Args.MakeArgString(getCompilerRT(TC, "asan_dll_thunk")));
Alexey Samsonov6424e022014-05-12 20:20:20 +00008051 } else {
Saleem Abdulrasool1d59f492015-01-02 20:00:55 +00008052 static const char *CompilerRTComponents[] = {
8053 "asan",
8054 "asan_cxx",
8055 };
8056 for (const auto &Component : CompilerRTComponents)
8057 CmdArgs.push_back(Args.MakeArgString(getCompilerRT(TC, Component)));
Alexey Samsonov6424e022014-05-12 20:20:20 +00008058 }
Hans Wennborg65f17522013-08-27 18:10:21 +00008059 }
8060
Hans Wennborg2e274592013-08-13 23:38:57 +00008061 Args.AddAllArgValues(CmdArgs, options::OPT__SLASH_link);
Michael J. Spencere2f49362012-06-18 16:56:04 +00008062
Reid Kleckner337188f2014-09-16 19:22:00 +00008063 // Add filenames, libraries, and other linker inputs.
8064 for (const auto &Input : Inputs) {
8065 if (Input.isFilename()) {
Saleem Abdulrasool2456cea2014-06-12 02:08:04 +00008066 CmdArgs.push_back(Input.getFilename());
Reid Kleckner337188f2014-09-16 19:22:00 +00008067 continue;
8068 }
8069
8070 const Arg &A = Input.getInputArg();
8071
8072 // Render -l options differently for the MSVC linker.
8073 if (A.getOption().matches(options::OPT_l)) {
8074 StringRef Lib = A.getValue();
8075 const char *LinkLibArg;
8076 if (Lib.endswith(".lib"))
8077 LinkLibArg = Args.MakeArgString(Lib);
8078 else
8079 LinkLibArg = Args.MakeArgString(Lib + ".lib");
8080 CmdArgs.push_back(LinkLibArg);
8081 continue;
8082 }
8083
8084 // Otherwise, this is some other kind of linker input option like -Wl, -z,
8085 // or -L. Render it, even if MSVC doesn't understand it.
8086 A.renderAsInput(Args, CmdArgs);
8087 }
Michael J. Spencerb186bc32010-08-21 21:55:07 +00008088
Zachary Turner719f58c2014-12-01 23:06:47 +00008089 // We need to special case some linker paths. In the case of lld, we need to
8090 // translate 'lld' into 'lld-link', and in the case of the regular msvc
8091 // linker, we need to use a special search algorithm.
8092 llvm::SmallString<128> linkPath;
8093 StringRef Linker = Args.getLastArgValue(options::OPT_fuse_ld_EQ, "link");
8094 if (Linker.equals_lower("lld"))
8095 Linker = "lld-link";
8096
8097 if (Linker.equals_lower("link")) {
8098 // If we're using the MSVC linker, it's not sufficient to just use link
8099 // from the program PATH, because other environments like GnuWin32 install
8100 // their own link.exe which may come first.
Saleem Abdulrasool21b18762014-12-19 23:56:28 +00008101 linkPath = FindVisualStudioExecutable(TC, "link.exe",
Zachary Turner719f58c2014-12-01 23:06:47 +00008102 C.getDriver().getClangProgramPath());
8103 } else {
8104 linkPath = Linker;
8105 llvm::sys::path::replace_extension(linkPath, "exe");
Saleem Abdulrasool21b18762014-12-19 23:56:28 +00008106 linkPath = TC.GetProgramPath(linkPath.c_str());
Zachary Turner719f58c2014-12-01 23:06:47 +00008107 }
8108
Zachary Turner0eaf8fc2014-10-22 20:40:28 +00008109 const char *Exec = Args.MakeArgString(linkPath);
David Blaikiec11bf802014-09-04 16:04:28 +00008110 C.addCommand(llvm::make_unique<Command>(JA, *this, Exec, CmdArgs));
Michael J. Spencerb186bc32010-08-21 21:55:07 +00008111}
Hans Wennborg87cfa712013-09-19 20:32:16 +00008112
8113void visualstudio::Compile::ConstructJob(Compilation &C, const JobAction &JA,
8114 const InputInfo &Output,
8115 const InputInfoList &Inputs,
8116 const ArgList &Args,
8117 const char *LinkingOutput) const {
8118 C.addCommand(GetCommand(C, JA, Output, Inputs, Args, LinkingOutput));
8119}
8120
David Blaikiec11bf802014-09-04 16:04:28 +00008121std::unique_ptr<Command> visualstudio::Compile::GetCommand(
8122 Compilation &C, const JobAction &JA, const InputInfo &Output,
8123 const InputInfoList &Inputs, const ArgList &Args,
8124 const char *LinkingOutput) const {
Hans Wennborg87cfa712013-09-19 20:32:16 +00008125 ArgStringList CmdArgs;
Hans Wennborg263c2132013-09-24 17:36:21 +00008126 CmdArgs.push_back("/nologo");
Hans Wennborg87cfa712013-09-19 20:32:16 +00008127 CmdArgs.push_back("/c"); // Compile only.
8128 CmdArgs.push_back("/W0"); // No warnings.
8129
8130 // The goal is to be able to invoke this tool correctly based on
8131 // any flag accepted by clang-cl.
8132
8133 // These are spelled the same way in clang and cl.exe,.
8134 Args.AddAllArgs(CmdArgs, options::OPT_D, options::OPT_U);
8135 Args.AddAllArgs(CmdArgs, options::OPT_I);
Hans Wennborgb6331dc2013-09-24 18:17:21 +00008136
8137 // Optimization level.
8138 if (Arg *A = Args.getLastArg(options::OPT_O, options::OPT_O0)) {
8139 if (A->getOption().getID() == options::OPT_O0) {
8140 CmdArgs.push_back("/Od");
8141 } else {
8142 StringRef OptLevel = A->getValue();
8143 if (OptLevel == "1" || OptLevel == "2" || OptLevel == "s")
8144 A->render(Args, CmdArgs);
8145 else if (OptLevel == "3")
8146 CmdArgs.push_back("/Ox");
8147 }
8148 }
Hans Wennborg87cfa712013-09-19 20:32:16 +00008149
8150 // Flags for which clang-cl have an alias.
8151 // FIXME: How can we ensure this stays in sync with relevant clang-cl options?
8152
David Majnemerf6072342014-07-01 22:24:56 +00008153 if (Args.hasFlag(options::OPT__SLASH_GR_, options::OPT__SLASH_GR,
8154 /*default=*/false))
8155 CmdArgs.push_back("/GR-");
Hans Wennborg5149a3b2014-03-25 14:48:54 +00008156 if (Arg *A = Args.getLastArg(options::OPT_ffunction_sections,
8157 options::OPT_fno_function_sections))
8158 CmdArgs.push_back(A->getOption().getID() == options::OPT_ffunction_sections
8159 ? "/Gy"
8160 : "/Gy-");
David Majnemerdc7a47c2014-04-07 16:14:38 +00008161 if (Arg *A = Args.getLastArg(options::OPT_fdata_sections,
8162 options::OPT_fno_data_sections))
David Majnemer6c684a72014-04-07 16:19:27 +00008163 CmdArgs.push_back(
8164 A->getOption().getID() == options::OPT_fdata_sections ? "/Gw" : "/Gw-");
Hans Wennborg87cfa712013-09-19 20:32:16 +00008165 if (Args.hasArg(options::OPT_fsyntax_only))
8166 CmdArgs.push_back("/Zs");
Reid Klecknerc688daf2014-02-19 22:05:59 +00008167 if (Args.hasArg(options::OPT_g_Flag, options::OPT_gline_tables_only))
8168 CmdArgs.push_back("/Z7");
Hans Wennborg87cfa712013-09-19 20:32:16 +00008169
Hans Wennborg260ff402013-09-27 17:54:18 +00008170 std::vector<std::string> Includes = Args.getAllArgValues(options::OPT_include);
Saleem Abdulrasool2456cea2014-06-12 02:08:04 +00008171 for (const auto &Include : Includes)
8172 CmdArgs.push_back(Args.MakeArgString(std::string("/FI") + Include));
Hans Wennborg260ff402013-09-27 17:54:18 +00008173
Hans Wennborg87cfa712013-09-19 20:32:16 +00008174 // Flags that can simply be passed through.
8175 Args.AddAllArgs(CmdArgs, options::OPT__SLASH_LD);
8176 Args.AddAllArgs(CmdArgs, options::OPT__SLASH_LDd);
Reid Klecknerc542d372014-06-27 17:02:02 +00008177 Args.AddAllArgs(CmdArgs, options::OPT__SLASH_EH);
Hans Wennborg87cfa712013-09-19 20:32:16 +00008178
8179 // The order of these flags is relevant, so pick the last one.
8180 if (Arg *A = Args.getLastArg(options::OPT__SLASH_MD, options::OPT__SLASH_MDd,
8181 options::OPT__SLASH_MT, options::OPT__SLASH_MTd))
8182 A->render(Args, CmdArgs);
8183
8184
8185 // Input filename.
8186 assert(Inputs.size() == 1);
8187 const InputInfo &II = Inputs[0];
8188 assert(II.getType() == types::TY_C || II.getType() == types::TY_CXX);
8189 CmdArgs.push_back(II.getType() == types::TY_C ? "/Tc" : "/Tp");
8190 if (II.isFilename())
8191 CmdArgs.push_back(II.getFilename());
8192 else
8193 II.getInputArg().renderAsInput(Args, CmdArgs);
8194
8195 // Output filename.
8196 assert(Output.getType() == types::TY_Object);
8197 const char *Fo = Args.MakeArgString(std::string("/Fo") +
8198 Output.getFilename());
8199 CmdArgs.push_back(Fo);
8200
Hans Wennborg188382e2013-09-20 18:16:35 +00008201 const Driver &D = getToolChain().getDriver();
Zachary Turner0eaf8fc2014-10-22 20:40:28 +00008202 std::string Exec = FindVisualStudioExecutable(getToolChain(), "cl.exe",
8203 D.getClangProgramPath());
David Blaikiec11bf802014-09-04 16:04:28 +00008204 return llvm::make_unique<Command>(JA, *this, Args.MakeArgString(Exec),
8205 CmdArgs);
Hans Wennborg87cfa712013-09-19 20:32:16 +00008206}
Robert Lyttoncf1dd692013-10-11 10:29:40 +00008207
8208
8209/// XCore Tools
8210// We pass assemble and link construction to the xcc tool.
8211
8212void XCore::Assemble::ConstructJob(Compilation &C, const JobAction &JA,
8213 const InputInfo &Output,
8214 const InputInfoList &Inputs,
8215 const ArgList &Args,
8216 const char *LinkingOutput) const {
Rafael Espindola577637a2015-01-03 00:06:04 +00008217 claimNoWarnArgs(Args);
Robert Lyttoncf1dd692013-10-11 10:29:40 +00008218 ArgStringList CmdArgs;
8219
8220 CmdArgs.push_back("-o");
8221 CmdArgs.push_back(Output.getFilename());
8222
8223 CmdArgs.push_back("-c");
8224
Robert Lytton9e8c1a42014-02-13 10:40:12 +00008225 if (Args.hasArg(options::OPT_v))
8226 CmdArgs.push_back("-v");
8227
Robert Lytton894d25c2014-05-02 09:33:25 +00008228 if (Arg *A = Args.getLastArg(options::OPT_g_Group))
8229 if (!A->getOption().matches(options::OPT_g0))
8230 CmdArgs.push_back("-g");
Robert Lytton9e8c1a42014-02-13 10:40:12 +00008231
Robert Lytton8e95d4e2014-02-11 10:34:45 +00008232 if (Args.hasFlag(options::OPT_fverbose_asm, options::OPT_fno_verbose_asm,
8233 false))
8234 CmdArgs.push_back("-fverbose-asm");
Robert Lyttoncf1dd692013-10-11 10:29:40 +00008235
8236 Args.AddAllArgValues(CmdArgs, options::OPT_Wa_COMMA,
8237 options::OPT_Xassembler);
8238
Saleem Abdulrasool2456cea2014-06-12 02:08:04 +00008239 for (const auto &II : Inputs)
Robert Lyttoncf1dd692013-10-11 10:29:40 +00008240 CmdArgs.push_back(II.getFilename());
Robert Lyttoncf1dd692013-10-11 10:29:40 +00008241
Saleem Abdulrasool2456cea2014-06-12 02:08:04 +00008242 const char *Exec = Args.MakeArgString(getToolChain().GetProgramPath("xcc"));
David Blaikiec11bf802014-09-04 16:04:28 +00008243 C.addCommand(llvm::make_unique<Command>(JA, *this, Exec, CmdArgs));
Robert Lyttoncf1dd692013-10-11 10:29:40 +00008244}
8245
8246void XCore::Link::ConstructJob(Compilation &C, const JobAction &JA,
8247 const InputInfo &Output,
8248 const InputInfoList &Inputs,
8249 const ArgList &Args,
8250 const char *LinkingOutput) const {
8251 ArgStringList CmdArgs;
8252
8253 if (Output.isFilename()) {
8254 CmdArgs.push_back("-o");
8255 CmdArgs.push_back(Output.getFilename());
8256 } else {
8257 assert(Output.isNothing() && "Invalid output.");
8258 }
8259
Robert Lytton9e8c1a42014-02-13 10:40:12 +00008260 if (Args.hasArg(options::OPT_v))
8261 CmdArgs.push_back("-v");
8262
David Majnemer8de68642014-12-05 08:11:58 +00008263 if (exceptionSettings(Args, getToolChain().getTriple()))
Robert Lyttonf7e03c12014-02-13 10:34:44 +00008264 CmdArgs.push_back("-fexceptions");
8265
Robert Lyttoncf1dd692013-10-11 10:29:40 +00008266 AddLinkerInputs(getToolChain(), Inputs, Args, CmdArgs);
8267
Saleem Abdulrasool2456cea2014-06-12 02:08:04 +00008268 const char *Exec = Args.MakeArgString(getToolChain().GetProgramPath("xcc"));
David Blaikiec11bf802014-09-04 16:04:28 +00008269 C.addCommand(llvm::make_unique<Command>(JA, *this, Exec, CmdArgs));
Robert Lyttoncf1dd692013-10-11 10:29:40 +00008270}
Saleem Abdulrasool543a78b2014-10-24 03:13:37 +00008271
8272void CrossWindows::Assemble::ConstructJob(Compilation &C, const JobAction &JA,
8273 const InputInfo &Output,
8274 const InputInfoList &Inputs,
8275 const ArgList &Args,
8276 const char *LinkingOutput) const {
Rafael Espindola577637a2015-01-03 00:06:04 +00008277 claimNoWarnArgs(Args);
Saleem Abdulrasool543a78b2014-10-24 03:13:37 +00008278 const auto &TC =
8279 static_cast<const toolchains::CrossWindowsToolChain &>(getToolChain());
8280 ArgStringList CmdArgs;
8281 const char *Exec;
8282
8283 switch (TC.getArch()) {
8284 default: llvm_unreachable("unsupported architecture");
8285 case llvm::Triple::arm:
8286 case llvm::Triple::thumb:
8287 break;
8288 case llvm::Triple::x86:
8289 CmdArgs.push_back("--32");
8290 break;
8291 case llvm::Triple::x86_64:
8292 CmdArgs.push_back("--64");
8293 break;
8294 }
8295
8296 Args.AddAllArgValues(CmdArgs, options::OPT_Wa_COMMA, options::OPT_Xassembler);
8297
8298 CmdArgs.push_back("-o");
8299 CmdArgs.push_back(Output.getFilename());
8300
8301 for (const auto &Input : Inputs)
8302 CmdArgs.push_back(Input.getFilename());
8303
8304 const std::string Assembler = TC.GetProgramPath("as");
8305 Exec = Args.MakeArgString(Assembler);
8306
8307 C.addCommand(llvm::make_unique<Command>(JA, *this, Exec, CmdArgs));
8308}
8309
8310void CrossWindows::Link::ConstructJob(Compilation &C, const JobAction &JA,
8311 const InputInfo &Output,
8312 const InputInfoList &Inputs,
8313 const ArgList &Args,
8314 const char *LinkingOutput) const {
8315 const auto &TC =
8316 static_cast<const toolchains::CrossWindowsToolChain &>(getToolChain());
8317 const llvm::Triple &T = TC.getTriple();
8318 const Driver &D = TC.getDriver();
8319 SmallString<128> EntryPoint;
8320 ArgStringList CmdArgs;
8321 const char *Exec;
8322
8323 // Silence warning for "clang -g foo.o -o foo"
8324 Args.ClaimAllArgs(options::OPT_g_Group);
8325 // and "clang -emit-llvm foo.o -o foo"
8326 Args.ClaimAllArgs(options::OPT_emit_llvm);
8327 // and for "clang -w foo.o -o foo"
8328 Args.ClaimAllArgs(options::OPT_w);
8329 // Other warning options are already handled somewhere else.
8330
8331 if (!D.SysRoot.empty())
8332 CmdArgs.push_back(Args.MakeArgString("--sysroot=" + D.SysRoot));
8333
8334 if (Args.hasArg(options::OPT_pie))
8335 CmdArgs.push_back("-pie");
8336 if (Args.hasArg(options::OPT_rdynamic))
8337 CmdArgs.push_back("-export-dynamic");
8338 if (Args.hasArg(options::OPT_s))
8339 CmdArgs.push_back("--strip-all");
8340
8341 CmdArgs.push_back("-m");
8342 switch (TC.getArch()) {
8343 default: llvm_unreachable("unsupported architecture");
8344 case llvm::Triple::arm:
8345 case llvm::Triple::thumb:
8346 // FIXME: this is incorrect for WinCE
8347 CmdArgs.push_back("thumb2pe");
8348 break;
8349 case llvm::Triple::x86:
8350 CmdArgs.push_back("i386pe");
8351 EntryPoint.append("_");
8352 break;
8353 case llvm::Triple::x86_64:
8354 CmdArgs.push_back("i386pep");
8355 break;
8356 }
8357
8358 if (Args.hasArg(options::OPT_shared)) {
8359 switch (T.getArch()) {
8360 default: llvm_unreachable("unsupported architecture");
8361 case llvm::Triple::arm:
8362 case llvm::Triple::thumb:
8363 case llvm::Triple::x86_64:
8364 EntryPoint.append("_DllMainCRTStartup");
8365 break;
8366 case llvm::Triple::x86:
8367 EntryPoint.append("_DllMainCRTStartup@12");
8368 break;
8369 }
8370
8371 CmdArgs.push_back("-shared");
8372 CmdArgs.push_back("-Bdynamic");
8373
8374 CmdArgs.push_back("--enable-auto-image-base");
8375
8376 CmdArgs.push_back("--entry");
8377 CmdArgs.push_back(Args.MakeArgString(EntryPoint));
8378 } else {
8379 EntryPoint.append("mainCRTStartup");
8380
8381 CmdArgs.push_back(Args.hasArg(options::OPT_static) ? "-Bstatic"
8382 : "-Bdynamic");
8383
8384 if (!Args.hasArg(options::OPT_nostdlib) &&
8385 !Args.hasArg(options::OPT_nostartfiles)) {
8386 CmdArgs.push_back("--entry");
8387 CmdArgs.push_back(Args.MakeArgString(EntryPoint));
8388 }
8389
8390 // FIXME: handle subsystem
8391 }
8392
8393 // NOTE: deal with multiple definitions on Windows (e.g. COMDAT)
Saleem Abdulrasool56dd1ac2014-10-28 03:15:02 +00008394 CmdArgs.push_back("--allow-multiple-definition");
Saleem Abdulrasool543a78b2014-10-24 03:13:37 +00008395
8396 CmdArgs.push_back("-o");
8397 CmdArgs.push_back(Output.getFilename());
8398
8399 if (Args.hasArg(options::OPT_shared) || Args.hasArg(options::OPT_rdynamic)) {
8400 SmallString<261> ImpLib(Output.getFilename());
8401 llvm::sys::path::replace_extension(ImpLib, ".lib");
8402
8403 CmdArgs.push_back("--out-implib");
8404 CmdArgs.push_back(Args.MakeArgString(ImpLib));
8405 }
8406
8407 if (!Args.hasArg(options::OPT_nostdlib) &&
8408 !Args.hasArg(options::OPT_nostartfiles)) {
8409 const std::string CRTPath(D.SysRoot + "/usr/lib/");
8410 const char *CRTBegin;
8411
8412 CRTBegin =
8413 Args.hasArg(options::OPT_shared) ? "crtbeginS.obj" : "crtbegin.obj";
8414 CmdArgs.push_back(Args.MakeArgString(CRTPath + CRTBegin));
8415 }
8416
8417 Args.AddAllArgs(CmdArgs, options::OPT_L);
8418
8419 const auto &Paths = TC.getFilePaths();
8420 for (const auto &Path : Paths)
8421 CmdArgs.push_back(Args.MakeArgString(StringRef("-L") + Path));
8422
8423 AddLinkerInputs(TC, Inputs, Args, CmdArgs);
8424
8425 if (D.CCCIsCXX() && !Args.hasArg(options::OPT_nostdlib) &&
8426 !Args.hasArg(options::OPT_nodefaultlibs)) {
8427 bool StaticCXX = Args.hasArg(options::OPT_static_libstdcxx) &&
8428 !Args.hasArg(options::OPT_static);
8429 if (StaticCXX)
8430 CmdArgs.push_back("-Bstatic");
8431 TC.AddCXXStdlibLibArgs(Args, CmdArgs);
8432 if (StaticCXX)
8433 CmdArgs.push_back("-Bdynamic");
8434 }
8435
8436 if (!Args.hasArg(options::OPT_nostdlib)) {
8437 if (!Args.hasArg(options::OPT_nodefaultlibs)) {
8438 // TODO handle /MT[d] /MD[d]
8439 CmdArgs.push_back("-lmsvcrt");
8440 AddRunTimeLibs(TC, D, CmdArgs, Args);
8441 }
8442 }
8443
8444 const std::string Linker = TC.GetProgramPath("ld");
8445 Exec = Args.MakeArgString(Linker);
8446
8447 C.addCommand(llvm::make_unique<Command>(JA, *this, Exec, CmdArgs));
8448}